Annotation of /trunk/kernel-alx/patches-3.18/0103-3.18.4-all-fixes.patch
Parent Directory | Revision Log
Revision 2553 -
(hide annotations)
(download)
Wed Mar 18 09:24:38 2015 UTC (9 years, 6 months ago) by niro
File size: 246965 byte(s)
Wed Mar 18 09:24:38 2015 UTC (9 years, 6 months ago) by niro
File size: 246965 byte(s)
-import from kernel-magellan
1 | niro | 2553 | diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt |
2 | index 479f33204a37..f4c71d4a9ba3 100644 | ||
3 | --- a/Documentation/kernel-parameters.txt | ||
4 | +++ b/Documentation/kernel-parameters.txt | ||
5 | @@ -1270,6 +1270,7 @@ bytes respectively. Such letter suffixes can also be entirely omitted. | ||
6 | i8042.notimeout [HW] Ignore timeout condition signalled by controller | ||
7 | i8042.reset [HW] Reset the controller during init and cleanup | ||
8 | i8042.unlock [HW] Unlock (ignore) the keylock | ||
9 | + i8042.kbdreset [HW] Reset device connected to KBD port | ||
10 | |||
11 | i810= [HW,DRM] | ||
12 | |||
13 | diff --git a/Makefile b/Makefile | ||
14 | index 91cfe8d5ee06..4e9328491c1e 100644 | ||
15 | --- a/Makefile | ||
16 | +++ b/Makefile | ||
17 | @@ -1,6 +1,6 @@ | ||
18 | VERSION = 3 | ||
19 | PATCHLEVEL = 18 | ||
20 | -SUBLEVEL = 3 | ||
21 | +SUBLEVEL = 4 | ||
22 | EXTRAVERSION = | ||
23 | NAME = Diseased Newt | ||
24 | |||
25 | diff --git a/arch/arc/boot/dts/nsimosci.dts b/arch/arc/boot/dts/nsimosci.dts | ||
26 | index cfaedd9c61c9..1c169dc74ad1 100644 | ||
27 | --- a/arch/arc/boot/dts/nsimosci.dts | ||
28 | +++ b/arch/arc/boot/dts/nsimosci.dts | ||
29 | @@ -20,7 +20,7 @@ | ||
30 | /* this is for console on PGU */ | ||
31 | /* bootargs = "console=tty0 consoleblank=0"; */ | ||
32 | /* this is for console on serial */ | ||
33 | - bootargs = "earlycon=uart8250,mmio32,0xc0000000,115200n8 console=tty0 console=ttyS0,115200n8 consoleblank=0 debug"; | ||
34 | + bootargs = "earlycon=uart8250,mmio32,0xf0000000,115200n8 console=tty0 console=ttyS0,115200n8 consoleblank=0 debug"; | ||
35 | }; | ||
36 | |||
37 | aliases { | ||
38 | @@ -41,9 +41,9 @@ | ||
39 | #interrupt-cells = <1>; | ||
40 | }; | ||
41 | |||
42 | - uart0: serial@c0000000 { | ||
43 | + uart0: serial@f0000000 { | ||
44 | compatible = "ns8250"; | ||
45 | - reg = <0xc0000000 0x2000>; | ||
46 | + reg = <0xf0000000 0x2000>; | ||
47 | interrupts = <11>; | ||
48 | clock-frequency = <3686400>; | ||
49 | baud = <115200>; | ||
50 | @@ -52,21 +52,21 @@ | ||
51 | no-loopback-test = <1>; | ||
52 | }; | ||
53 | |||
54 | - pgu0: pgu@c9000000 { | ||
55 | + pgu0: pgu@f9000000 { | ||
56 | compatible = "snps,arcpgufb"; | ||
57 | - reg = <0xc9000000 0x400>; | ||
58 | + reg = <0xf9000000 0x400>; | ||
59 | }; | ||
60 | |||
61 | - ps2: ps2@c9001000 { | ||
62 | + ps2: ps2@f9001000 { | ||
63 | compatible = "snps,arc_ps2"; | ||
64 | - reg = <0xc9000400 0x14>; | ||
65 | + reg = <0xf9000400 0x14>; | ||
66 | interrupts = <13>; | ||
67 | interrupt-names = "arc_ps2_irq"; | ||
68 | }; | ||
69 | |||
70 | - eth0: ethernet@c0003000 { | ||
71 | + eth0: ethernet@f0003000 { | ||
72 | compatible = "snps,oscilan"; | ||
73 | - reg = <0xc0003000 0x44>; | ||
74 | + reg = <0xf0003000 0x44>; | ||
75 | interrupts = <7>, <8>; | ||
76 | interrupt-names = "rx", "tx"; | ||
77 | }; | ||
78 | diff --git a/arch/arm/boot/dts/berlin2q-marvell-dmp.dts b/arch/arm/boot/dts/berlin2q-marvell-dmp.dts | ||
79 | index ea1f99b8eed6..45ac1d04cf42 100644 | ||
80 | --- a/arch/arm/boot/dts/berlin2q-marvell-dmp.dts | ||
81 | +++ b/arch/arm/boot/dts/berlin2q-marvell-dmp.dts | ||
82 | @@ -30,6 +30,8 @@ | ||
83 | }; | ||
84 | |||
85 | &sdhci2 { | ||
86 | + broken-cd; | ||
87 | + bus-width = <8>; | ||
88 | non-removable; | ||
89 | status = "okay"; | ||
90 | }; | ||
91 | diff --git a/arch/arm/boot/dts/berlin2q.dtsi b/arch/arm/boot/dts/berlin2q.dtsi | ||
92 | index 891d56b03922..b805e19ed390 100644 | ||
93 | --- a/arch/arm/boot/dts/berlin2q.dtsi | ||
94 | +++ b/arch/arm/boot/dts/berlin2q.dtsi | ||
95 | @@ -83,7 +83,8 @@ | ||
96 | compatible = "mrvl,pxav3-mmc"; | ||
97 | reg = <0xab1000 0x200>; | ||
98 | interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>; | ||
99 | - clocks = <&chip CLKID_SDIO1XIN>; | ||
100 | + clocks = <&chip CLKID_NFC_ECC>, <&chip CLKID_NFC>; | ||
101 | + clock-names = "io", "core"; | ||
102 | status = "disabled"; | ||
103 | }; | ||
104 | |||
105 | @@ -314,36 +315,6 @@ | ||
106 | interrupt-parent = <&gic>; | ||
107 | interrupts = <GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>; | ||
108 | }; | ||
109 | - | ||
110 | - gpio4: gpio@5000 { | ||
111 | - compatible = "snps,dw-apb-gpio"; | ||
112 | - reg = <0x5000 0x400>; | ||
113 | - #address-cells = <1>; | ||
114 | - #size-cells = <0>; | ||
115 | - | ||
116 | - porte: gpio-port@4 { | ||
117 | - compatible = "snps,dw-apb-gpio-port"; | ||
118 | - gpio-controller; | ||
119 | - #gpio-cells = <2>; | ||
120 | - snps,nr-gpios = <32>; | ||
121 | - reg = <0>; | ||
122 | - }; | ||
123 | - }; | ||
124 | - | ||
125 | - gpio5: gpio@c000 { | ||
126 | - compatible = "snps,dw-apb-gpio"; | ||
127 | - reg = <0xc000 0x400>; | ||
128 | - #address-cells = <1>; | ||
129 | - #size-cells = <0>; | ||
130 | - | ||
131 | - portf: gpio-port@5 { | ||
132 | - compatible = "snps,dw-apb-gpio-port"; | ||
133 | - gpio-controller; | ||
134 | - #gpio-cells = <2>; | ||
135 | - snps,nr-gpios = <32>; | ||
136 | - reg = <0>; | ||
137 | - }; | ||
138 | - }; | ||
139 | }; | ||
140 | |||
141 | chip: chip-control@ea0000 { | ||
142 | @@ -372,6 +343,21 @@ | ||
143 | ranges = <0 0xfc0000 0x10000>; | ||
144 | interrupt-parent = <&sic>; | ||
145 | |||
146 | + sm_gpio1: gpio@5000 { | ||
147 | + compatible = "snps,dw-apb-gpio"; | ||
148 | + reg = <0x5000 0x400>; | ||
149 | + #address-cells = <1>; | ||
150 | + #size-cells = <0>; | ||
151 | + | ||
152 | + portf: gpio-port@5 { | ||
153 | + compatible = "snps,dw-apb-gpio-port"; | ||
154 | + gpio-controller; | ||
155 | + #gpio-cells = <2>; | ||
156 | + snps,nr-gpios = <32>; | ||
157 | + reg = <0>; | ||
158 | + }; | ||
159 | + }; | ||
160 | + | ||
161 | i2c2: i2c@7000 { | ||
162 | compatible = "snps,designware-i2c"; | ||
163 | #address-cells = <1>; | ||
164 | @@ -422,6 +408,21 @@ | ||
165 | status = "disabled"; | ||
166 | }; | ||
167 | |||
168 | + sm_gpio0: gpio@c000 { | ||
169 | + compatible = "snps,dw-apb-gpio"; | ||
170 | + reg = <0xc000 0x400>; | ||
171 | + #address-cells = <1>; | ||
172 | + #size-cells = <0>; | ||
173 | + | ||
174 | + porte: gpio-port@4 { | ||
175 | + compatible = "snps,dw-apb-gpio-port"; | ||
176 | + gpio-controller; | ||
177 | + #gpio-cells = <2>; | ||
178 | + snps,nr-gpios = <32>; | ||
179 | + reg = <0>; | ||
180 | + }; | ||
181 | + }; | ||
182 | + | ||
183 | sysctrl: pin-controller@d000 { | ||
184 | compatible = "marvell,berlin2q-system-ctrl"; | ||
185 | reg = <0xd000 0x100>; | ||
186 | diff --git a/arch/arm/boot/dts/dra7-evm.dts b/arch/arm/boot/dts/dra7-evm.dts | ||
187 | index c6ce6258434f..1bd6c79f445e 100644 | ||
188 | --- a/arch/arm/boot/dts/dra7-evm.dts | ||
189 | +++ b/arch/arm/boot/dts/dra7-evm.dts | ||
190 | @@ -399,23 +399,23 @@ | ||
191 | }; | ||
192 | partition@5 { | ||
193 | label = "QSPI.u-boot-spl-os"; | ||
194 | - reg = <0x00140000 0x00010000>; | ||
195 | + reg = <0x00140000 0x00080000>; | ||
196 | }; | ||
197 | partition@6 { | ||
198 | label = "QSPI.u-boot-env"; | ||
199 | - reg = <0x00150000 0x00010000>; | ||
200 | + reg = <0x001c0000 0x00010000>; | ||
201 | }; | ||
202 | partition@7 { | ||
203 | label = "QSPI.u-boot-env.backup1"; | ||
204 | - reg = <0x00160000 0x0010000>; | ||
205 | + reg = <0x001d0000 0x0010000>; | ||
206 | }; | ||
207 | partition@8 { | ||
208 | label = "QSPI.kernel"; | ||
209 | - reg = <0x00170000 0x0800000>; | ||
210 | + reg = <0x001e0000 0x0800000>; | ||
211 | }; | ||
212 | partition@9 { | ||
213 | label = "QSPI.file-system"; | ||
214 | - reg = <0x00970000 0x01690000>; | ||
215 | + reg = <0x009e0000 0x01620000>; | ||
216 | }; | ||
217 | }; | ||
218 | }; | ||
219 | diff --git a/arch/arm/boot/dts/imx25.dtsi b/arch/arm/boot/dts/imx25.dtsi | ||
220 | index 58d3c3cf2923..d238676a9107 100644 | ||
221 | --- a/arch/arm/boot/dts/imx25.dtsi | ||
222 | +++ b/arch/arm/boot/dts/imx25.dtsi | ||
223 | @@ -162,7 +162,7 @@ | ||
224 | #size-cells = <0>; | ||
225 | compatible = "fsl,imx25-cspi", "fsl,imx35-cspi"; | ||
226 | reg = <0x43fa4000 0x4000>; | ||
227 | - clocks = <&clks 62>, <&clks 62>; | ||
228 | + clocks = <&clks 78>, <&clks 78>; | ||
229 | clock-names = "ipg", "per"; | ||
230 | interrupts = <14>; | ||
231 | status = "disabled"; | ||
232 | diff --git a/arch/arm/boot/dts/imx51-babbage.dts b/arch/arm/boot/dts/imx51-babbage.dts | ||
233 | index 56569cecaa78..649befeb2cf9 100644 | ||
234 | --- a/arch/arm/boot/dts/imx51-babbage.dts | ||
235 | +++ b/arch/arm/boot/dts/imx51-babbage.dts | ||
236 | @@ -127,24 +127,12 @@ | ||
237 | #address-cells = <1>; | ||
238 | #size-cells = <0>; | ||
239 | |||
240 | - reg_usbh1_vbus: regulator@0 { | ||
241 | - compatible = "regulator-fixed"; | ||
242 | - pinctrl-names = "default"; | ||
243 | - pinctrl-0 = <&pinctrl_usbh1reg>; | ||
244 | - reg = <0>; | ||
245 | - regulator-name = "usbh1_vbus"; | ||
246 | - regulator-min-microvolt = <5000000>; | ||
247 | - regulator-max-microvolt = <5000000>; | ||
248 | - gpio = <&gpio2 5 GPIO_ACTIVE_HIGH>; | ||
249 | - enable-active-high; | ||
250 | - }; | ||
251 | - | ||
252 | - reg_usbotg_vbus: regulator@1 { | ||
253 | + reg_hub_reset: regulator@0 { | ||
254 | compatible = "regulator-fixed"; | ||
255 | pinctrl-names = "default"; | ||
256 | pinctrl-0 = <&pinctrl_usbotgreg>; | ||
257 | - reg = <1>; | ||
258 | - regulator-name = "usbotg_vbus"; | ||
259 | + reg = <0>; | ||
260 | + regulator-name = "hub_reset"; | ||
261 | regulator-min-microvolt = <5000000>; | ||
262 | regulator-max-microvolt = <5000000>; | ||
263 | gpio = <&gpio1 7 GPIO_ACTIVE_HIGH>; | ||
264 | @@ -176,6 +164,7 @@ | ||
265 | reg = <0>; | ||
266 | clocks = <&clks IMX5_CLK_DUMMY>; | ||
267 | clock-names = "main_clk"; | ||
268 | + reset-gpios = <&gpio2 5 GPIO_ACTIVE_LOW>; | ||
269 | }; | ||
270 | }; | ||
271 | }; | ||
272 | @@ -419,7 +408,7 @@ | ||
273 | &usbh1 { | ||
274 | pinctrl-names = "default"; | ||
275 | pinctrl-0 = <&pinctrl_usbh1>; | ||
276 | - vbus-supply = <®_usbh1_vbus>; | ||
277 | + vbus-supply = <®_hub_reset>; | ||
278 | fsl,usbphy = <&usbh1phy>; | ||
279 | phy_type = "ulpi"; | ||
280 | status = "okay"; | ||
281 | @@ -429,7 +418,6 @@ | ||
282 | dr_mode = "otg"; | ||
283 | disable-over-current; | ||
284 | phy_type = "utmi_wide"; | ||
285 | - vbus-supply = <®_usbotg_vbus>; | ||
286 | status = "okay"; | ||
287 | }; | ||
288 | |||
289 | diff --git a/arch/arm/configs/omap2plus_defconfig b/arch/arm/configs/omap2plus_defconfig | ||
290 | index b3f86670d2eb..a0e51bb68b2d 100644 | ||
291 | --- a/arch/arm/configs/omap2plus_defconfig | ||
292 | +++ b/arch/arm/configs/omap2plus_defconfig | ||
293 | @@ -68,7 +68,7 @@ CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y | ||
294 | CONFIG_CPU_FREQ_GOV_POWERSAVE=y | ||
295 | CONFIG_CPU_FREQ_GOV_USERSPACE=y | ||
296 | CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y | ||
297 | -CONFIG_GENERIC_CPUFREQ_CPU0=y | ||
298 | +CONFIG_CPUFREQ_DT=y | ||
299 | # CONFIG_ARM_OMAP2PLUS_CPUFREQ is not set | ||
300 | CONFIG_CPU_IDLE=y | ||
301 | CONFIG_BINFMT_MISC=y | ||
302 | diff --git a/arch/arm/mach-imx/clk-imx6q.c b/arch/arm/mach-imx/clk-imx6q.c | ||
303 | index 4e79da7c5e30..2daef619d053 100644 | ||
304 | --- a/arch/arm/mach-imx/clk-imx6q.c | ||
305 | +++ b/arch/arm/mach-imx/clk-imx6q.c | ||
306 | @@ -144,8 +144,8 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node) | ||
307 | post_div_table[1].div = 1; | ||
308 | post_div_table[2].div = 1; | ||
309 | video_div_table[1].div = 1; | ||
310 | - video_div_table[2].div = 1; | ||
311 | - }; | ||
312 | + video_div_table[3].div = 1; | ||
313 | + } | ||
314 | |||
315 | clk[IMX6QDL_PLL1_BYPASS_SRC] = imx_clk_mux("pll1_bypass_src", base + 0x00, 14, 2, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels)); | ||
316 | clk[IMX6QDL_PLL2_BYPASS_SRC] = imx_clk_mux("pll2_bypass_src", base + 0x30, 14, 2, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels)); | ||
317 | diff --git a/arch/arm/mach-imx/clk-imx6sx.c b/arch/arm/mach-imx/clk-imx6sx.c | ||
318 | index 17354a11356f..5a3e5a159e70 100644 | ||
319 | --- a/arch/arm/mach-imx/clk-imx6sx.c | ||
320 | +++ b/arch/arm/mach-imx/clk-imx6sx.c | ||
321 | @@ -558,6 +558,9 @@ static void __init imx6sx_clocks_init(struct device_node *ccm_node) | ||
322 | clk_set_parent(clks[IMX6SX_CLK_GPU_CORE_SEL], clks[IMX6SX_CLK_PLL3_PFD0]); | ||
323 | clk_set_parent(clks[IMX6SX_CLK_GPU_AXI_SEL], clks[IMX6SX_CLK_PLL3_PFD0]); | ||
324 | |||
325 | + clk_set_parent(clks[IMX6SX_CLK_QSPI1_SEL], clks[IMX6SX_CLK_PLL2_BUS]); | ||
326 | + clk_set_parent(clks[IMX6SX_CLK_QSPI2_SEL], clks[IMX6SX_CLK_PLL2_BUS]); | ||
327 | + | ||
328 | /* Set initial power mode */ | ||
329 | imx6q_set_lpm(WAIT_CLOCKED); | ||
330 | } | ||
331 | diff --git a/arch/arm/mach-omap2/common.h b/arch/arm/mach-omap2/common.h | ||
332 | index 377eea849e7b..db57741c9c8a 100644 | ||
333 | --- a/arch/arm/mach-omap2/common.h | ||
334 | +++ b/arch/arm/mach-omap2/common.h | ||
335 | @@ -249,6 +249,7 @@ extern void omap4_cpu_die(unsigned int cpu); | ||
336 | extern struct smp_operations omap4_smp_ops; | ||
337 | |||
338 | extern void omap5_secondary_startup(void); | ||
339 | +extern void omap5_secondary_hyp_startup(void); | ||
340 | #endif | ||
341 | |||
342 | #if defined(CONFIG_SMP) && defined(CONFIG_PM) | ||
343 | diff --git a/arch/arm/mach-omap2/omap-headsmp.S b/arch/arm/mach-omap2/omap-headsmp.S | ||
344 | index 4993d4bfe9b2..6d1dffca6c7b 100644 | ||
345 | --- a/arch/arm/mach-omap2/omap-headsmp.S | ||
346 | +++ b/arch/arm/mach-omap2/omap-headsmp.S | ||
347 | @@ -22,6 +22,7 @@ | ||
348 | |||
349 | /* Physical address needed since MMU not enabled yet on secondary core */ | ||
350 | #define AUX_CORE_BOOT0_PA 0x48281800 | ||
351 | +#define API_HYP_ENTRY 0x102 | ||
352 | |||
353 | /* | ||
354 | * OMAP5 specific entry point for secondary CPU to jump from ROM | ||
355 | @@ -41,6 +42,26 @@ wait: ldr r2, =AUX_CORE_BOOT0_PA @ read from AuxCoreBoot0 | ||
356 | b secondary_startup | ||
357 | ENDPROC(omap5_secondary_startup) | ||
358 | /* | ||
359 | + * Same as omap5_secondary_startup except we call into the ROM to | ||
360 | + * enable HYP mode first. This is called instead of | ||
361 | + * omap5_secondary_startup if the primary CPU was put into HYP mode by | ||
362 | + * the boot loader. | ||
363 | + */ | ||
364 | +ENTRY(omap5_secondary_hyp_startup) | ||
365 | +wait_2: ldr r2, =AUX_CORE_BOOT0_PA @ read from AuxCoreBoot0 | ||
366 | + ldr r0, [r2] | ||
367 | + mov r0, r0, lsr #5 | ||
368 | + mrc p15, 0, r4, c0, c0, 5 | ||
369 | + and r4, r4, #0x0f | ||
370 | + cmp r0, r4 | ||
371 | + bne wait_2 | ||
372 | + ldr r12, =API_HYP_ENTRY | ||
373 | + adr r0, hyp_boot | ||
374 | + smc #0 | ||
375 | +hyp_boot: | ||
376 | + b secondary_startup | ||
377 | +ENDPROC(omap5_secondary_hyp_startup) | ||
378 | +/* | ||
379 | * OMAP4 specific entry point for secondary CPU to jump from ROM | ||
380 | * code. This routine also provides a holding flag into which | ||
381 | * secondary core is held until we're ready for it to initialise. | ||
382 | diff --git a/arch/arm/mach-omap2/omap-smp.c b/arch/arm/mach-omap2/omap-smp.c | ||
383 | index 256e84ef0f67..5305ec7341ec 100644 | ||
384 | --- a/arch/arm/mach-omap2/omap-smp.c | ||
385 | +++ b/arch/arm/mach-omap2/omap-smp.c | ||
386 | @@ -22,6 +22,7 @@ | ||
387 | #include <linux/irqchip/arm-gic.h> | ||
388 | |||
389 | #include <asm/smp_scu.h> | ||
390 | +#include <asm/virt.h> | ||
391 | |||
392 | #include "omap-secure.h" | ||
393 | #include "omap-wakeupgen.h" | ||
394 | @@ -227,8 +228,16 @@ static void __init omap4_smp_prepare_cpus(unsigned int max_cpus) | ||
395 | if (omap_secure_apis_support()) | ||
396 | omap_auxcoreboot_addr(virt_to_phys(startup_addr)); | ||
397 | else | ||
398 | - writel_relaxed(virt_to_phys(omap5_secondary_startup), | ||
399 | - base + OMAP_AUX_CORE_BOOT_1); | ||
400 | + /* | ||
401 | + * If the boot CPU is in HYP mode then start secondary | ||
402 | + * CPU in HYP mode as well. | ||
403 | + */ | ||
404 | + if ((__boot_cpu_mode & MODE_MASK) == HYP_MODE) | ||
405 | + writel_relaxed(virt_to_phys(omap5_secondary_hyp_startup), | ||
406 | + base + OMAP_AUX_CORE_BOOT_1); | ||
407 | + else | ||
408 | + writel_relaxed(virt_to_phys(omap5_secondary_startup), | ||
409 | + base + OMAP_AUX_CORE_BOOT_1); | ||
410 | |||
411 | } | ||
412 | |||
413 | diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c | ||
414 | index 4f61148ec168..fb0cb2b817a9 100644 | ||
415 | --- a/arch/arm/mach-omap2/timer.c | ||
416 | +++ b/arch/arm/mach-omap2/timer.c | ||
417 | @@ -513,11 +513,11 @@ static void __init realtime_counter_init(void) | ||
418 | rate = clk_get_rate(sys_clk); | ||
419 | /* Numerator/denumerator values refer TRM Realtime Counter section */ | ||
420 | switch (rate) { | ||
421 | - case 1200000: | ||
422 | + case 12000000: | ||
423 | num = 64; | ||
424 | den = 125; | ||
425 | break; | ||
426 | - case 1300000: | ||
427 | + case 13000000: | ||
428 | num = 768; | ||
429 | den = 1625; | ||
430 | break; | ||
431 | @@ -529,11 +529,11 @@ static void __init realtime_counter_init(void) | ||
432 | num = 192; | ||
433 | den = 625; | ||
434 | break; | ||
435 | - case 2600000: | ||
436 | + case 26000000: | ||
437 | num = 384; | ||
438 | den = 1625; | ||
439 | break; | ||
440 | - case 2700000: | ||
441 | + case 27000000: | ||
442 | num = 256; | ||
443 | den = 1125; | ||
444 | break; | ||
445 | diff --git a/arch/arm/mach-shmobile/setup-sh73a0.c b/arch/arm/mach-shmobile/setup-sh73a0.c | ||
446 | index 328657d011d5..1ba4f6357843 100644 | ||
447 | --- a/arch/arm/mach-shmobile/setup-sh73a0.c | ||
448 | +++ b/arch/arm/mach-shmobile/setup-sh73a0.c | ||
449 | @@ -598,6 +598,7 @@ static struct platform_device ipmmu_device = { | ||
450 | |||
451 | static struct renesas_intc_irqpin_config irqpin0_platform_data = { | ||
452 | .irq_base = irq_pin(0), /* IRQ0 -> IRQ7 */ | ||
453 | + .control_parent = true, | ||
454 | }; | ||
455 | |||
456 | static struct resource irqpin0_resources[] = { | ||
457 | @@ -659,6 +660,7 @@ static struct platform_device irqpin1_device = { | ||
458 | |||
459 | static struct renesas_intc_irqpin_config irqpin2_platform_data = { | ||
460 | .irq_base = irq_pin(16), /* IRQ16 -> IRQ23 */ | ||
461 | + .control_parent = true, | ||
462 | }; | ||
463 | |||
464 | static struct resource irqpin2_resources[] = { | ||
465 | @@ -689,6 +691,7 @@ static struct platform_device irqpin2_device = { | ||
466 | |||
467 | static struct renesas_intc_irqpin_config irqpin3_platform_data = { | ||
468 | .irq_base = irq_pin(24), /* IRQ24 -> IRQ31 */ | ||
469 | + .control_parent = true, | ||
470 | }; | ||
471 | |||
472 | static struct resource irqpin3_resources[] = { | ||
473 | diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c | ||
474 | index 494297c698ca..fff81f02251c 100644 | ||
475 | --- a/arch/arm64/mm/init.c | ||
476 | +++ b/arch/arm64/mm/init.c | ||
477 | @@ -333,14 +333,8 @@ static int keep_initrd; | ||
478 | |||
479 | void free_initrd_mem(unsigned long start, unsigned long end) | ||
480 | { | ||
481 | - if (!keep_initrd) { | ||
482 | - if (start == initrd_start) | ||
483 | - start = round_down(start, PAGE_SIZE); | ||
484 | - if (end == initrd_end) | ||
485 | - end = round_up(end, PAGE_SIZE); | ||
486 | - | ||
487 | + if (!keep_initrd) | ||
488 | free_reserved_area((void *)start, (void *)end, 0, "initrd"); | ||
489 | - } | ||
490 | } | ||
491 | |||
492 | static int __init keepinitrd_setup(char *__unused) | ||
493 | diff --git a/arch/parisc/include/asm/ldcw.h b/arch/parisc/include/asm/ldcw.h | ||
494 | index d2d11b7055ba..8121aa6db2ff 100644 | ||
495 | --- a/arch/parisc/include/asm/ldcw.h | ||
496 | +++ b/arch/parisc/include/asm/ldcw.h | ||
497 | @@ -33,11 +33,18 @@ | ||
498 | |||
499 | #endif /*!CONFIG_PA20*/ | ||
500 | |||
501 | -/* LDCW, the only atomic read-write operation PA-RISC has. *sigh*. */ | ||
502 | +/* LDCW, the only atomic read-write operation PA-RISC has. *sigh*. | ||
503 | + We don't explicitly expose that "*a" may be written as reload | ||
504 | + fails to find a register in class R1_REGS when "a" needs to be | ||
505 | + reloaded when generating 64-bit PIC code. Instead, we clobber | ||
506 | + memory to indicate to the compiler that the assembly code reads | ||
507 | + or writes to items other than those listed in the input and output | ||
508 | + operands. This may pessimize the code somewhat but __ldcw is | ||
509 | + usually used within code blocks surrounded by memory barriors. */ | ||
510 | #define __ldcw(a) ({ \ | ||
511 | unsigned __ret; \ | ||
512 | - __asm__ __volatile__(__LDCW " 0(%2),%0" \ | ||
513 | - : "=r" (__ret), "+m" (*(a)) : "r" (a)); \ | ||
514 | + __asm__ __volatile__(__LDCW " 0(%1),%0" \ | ||
515 | + : "=r" (__ret) : "r" (a) : "memory"); \ | ||
516 | __ret; \ | ||
517 | }) | ||
518 | |||
519 | diff --git a/arch/powerpc/platforms/powernv/opal-wrappers.S b/arch/powerpc/platforms/powernv/opal-wrappers.S | ||
520 | index feb549aa3eea..b67ea67eb71b 100644 | ||
521 | --- a/arch/powerpc/platforms/powernv/opal-wrappers.S | ||
522 | +++ b/arch/powerpc/platforms/powernv/opal-wrappers.S | ||
523 | @@ -40,7 +40,6 @@ BEGIN_FTR_SECTION; \ | ||
524 | b 1f; \ | ||
525 | END_FTR_SECTION(0, 1); \ | ||
526 | ld r12,opal_tracepoint_refcount@toc(r2); \ | ||
527 | - std r12,32(r1); \ | ||
528 | cmpdi r12,0; \ | ||
529 | bne- LABEL; \ | ||
530 | 1: | ||
531 | diff --git a/arch/um/Kconfig.common b/arch/um/Kconfig.common | ||
532 | index 87bc86821bc9..d195a87ca542 100644 | ||
533 | --- a/arch/um/Kconfig.common | ||
534 | +++ b/arch/um/Kconfig.common | ||
535 | @@ -3,6 +3,7 @@ config UML | ||
536 | default y | ||
537 | select HAVE_ARCH_AUDITSYSCALL | ||
538 | select HAVE_UID16 | ||
539 | + select HAVE_FUTEX_CMPXCHG if FUTEX | ||
540 | select GENERIC_IRQ_SHOW | ||
541 | select GENERIC_CPU_DEVICES | ||
542 | select GENERIC_IO | ||
543 | diff --git a/arch/x86/boot/Makefile b/arch/x86/boot/Makefile | ||
544 | index 5b016e2498f3..3db07f30636f 100644 | ||
545 | --- a/arch/x86/boot/Makefile | ||
546 | +++ b/arch/x86/boot/Makefile | ||
547 | @@ -51,6 +51,7 @@ targets += cpustr.h | ||
548 | $(obj)/cpustr.h: $(obj)/mkcpustr FORCE | ||
549 | $(call if_changed,cpustr) | ||
550 | endif | ||
551 | +clean-files += cpustr.h | ||
552 | |||
553 | # --------------------------------------------------------------------------- | ||
554 | |||
555 | diff --git a/arch/x86/kernel/cpu/Makefile b/arch/x86/kernel/cpu/Makefile | ||
556 | index e27b49d7c922..80091ae54c2b 100644 | ||
557 | --- a/arch/x86/kernel/cpu/Makefile | ||
558 | +++ b/arch/x86/kernel/cpu/Makefile | ||
559 | @@ -66,3 +66,4 @@ targets += capflags.c | ||
560 | $(obj)/capflags.c: $(cpufeature) $(src)/mkcapflags.sh FORCE | ||
561 | $(call if_changed,mkcapflags) | ||
562 | endif | ||
563 | +clean-files += capflags.c | ||
564 | diff --git a/arch/x86/kernel/kprobes/core.c b/arch/x86/kernel/kprobes/core.c | ||
565 | index 67e6d19ef1be..93d2c04c6f8f 100644 | ||
566 | --- a/arch/x86/kernel/kprobes/core.c | ||
567 | +++ b/arch/x86/kernel/kprobes/core.c | ||
568 | @@ -1018,6 +1018,15 @@ int setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs) | ||
569 | regs->flags &= ~X86_EFLAGS_IF; | ||
570 | trace_hardirqs_off(); | ||
571 | regs->ip = (unsigned long)(jp->entry); | ||
572 | + | ||
573 | + /* | ||
574 | + * jprobes use jprobe_return() which skips the normal return | ||
575 | + * path of the function, and this messes up the accounting of the | ||
576 | + * function graph tracer to get messed up. | ||
577 | + * | ||
578 | + * Pause function graph tracing while performing the jprobe function. | ||
579 | + */ | ||
580 | + pause_graph_tracing(); | ||
581 | return 1; | ||
582 | } | ||
583 | NOKPROBE_SYMBOL(setjmp_pre_handler); | ||
584 | @@ -1046,24 +1055,25 @@ int longjmp_break_handler(struct kprobe *p, struct pt_regs *regs) | ||
585 | struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); | ||
586 | u8 *addr = (u8 *) (regs->ip - 1); | ||
587 | struct jprobe *jp = container_of(p, struct jprobe, kp); | ||
588 | + void *saved_sp = kcb->jprobe_saved_sp; | ||
589 | |||
590 | if ((addr > (u8 *) jprobe_return) && | ||
591 | (addr < (u8 *) jprobe_return_end)) { | ||
592 | - if (stack_addr(regs) != kcb->jprobe_saved_sp) { | ||
593 | + if (stack_addr(regs) != saved_sp) { | ||
594 | struct pt_regs *saved_regs = &kcb->jprobe_saved_regs; | ||
595 | printk(KERN_ERR | ||
596 | "current sp %p does not match saved sp %p\n", | ||
597 | - stack_addr(regs), kcb->jprobe_saved_sp); | ||
598 | + stack_addr(regs), saved_sp); | ||
599 | printk(KERN_ERR "Saved registers for jprobe %p\n", jp); | ||
600 | show_regs(saved_regs); | ||
601 | printk(KERN_ERR "Current registers\n"); | ||
602 | show_regs(regs); | ||
603 | BUG(); | ||
604 | } | ||
605 | + /* It's OK to start function graph tracing again */ | ||
606 | + unpause_graph_tracing(); | ||
607 | *regs = kcb->jprobe_saved_regs; | ||
608 | - memcpy((kprobe_opcode_t *)(kcb->jprobe_saved_sp), | ||
609 | - kcb->jprobes_stack, | ||
610 | - MIN_STACK_SIZE(kcb->jprobe_saved_sp)); | ||
611 | + memcpy(saved_sp, kcb->jprobes_stack, MIN_STACK_SIZE(saved_sp)); | ||
612 | preempt_enable_no_resched(); | ||
613 | return 1; | ||
614 | } | ||
615 | diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c | ||
616 | index 3e556c68351b..ed7039465f16 100644 | ||
617 | --- a/arch/x86/kvm/vmx.c | ||
618 | +++ b/arch/x86/kvm/vmx.c | ||
619 | @@ -2377,12 +2377,12 @@ static __init void nested_vmx_setup_ctls_msrs(void) | ||
620 | nested_vmx_secondary_ctls_low = 0; | ||
621 | nested_vmx_secondary_ctls_high &= | ||
622 | SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES | | ||
623 | - SECONDARY_EXEC_UNRESTRICTED_GUEST | | ||
624 | SECONDARY_EXEC_WBINVD_EXITING; | ||
625 | |||
626 | if (enable_ept) { | ||
627 | /* nested EPT: emulate EPT also to L1 */ | ||
628 | - nested_vmx_secondary_ctls_high |= SECONDARY_EXEC_ENABLE_EPT; | ||
629 | + nested_vmx_secondary_ctls_high |= SECONDARY_EXEC_ENABLE_EPT | | ||
630 | + SECONDARY_EXEC_UNRESTRICTED_GUEST; | ||
631 | nested_vmx_ept_caps = VMX_EPT_PAGE_WALK_4_BIT | | ||
632 | VMX_EPTP_WB_BIT | VMX_EPT_2MB_PAGE_BIT | | ||
633 | VMX_EPT_INVEPT_BIT; | ||
634 | diff --git a/arch/x86/um/sys_call_table_32.c b/arch/x86/um/sys_call_table_32.c | ||
635 | index 531d4269e2e3..bd16d6c370ec 100644 | ||
636 | --- a/arch/x86/um/sys_call_table_32.c | ||
637 | +++ b/arch/x86/um/sys_call_table_32.c | ||
638 | @@ -34,7 +34,7 @@ typedef asmlinkage void (*sys_call_ptr_t)(void); | ||
639 | |||
640 | extern asmlinkage void sys_ni_syscall(void); | ||
641 | |||
642 | -const sys_call_ptr_t sys_call_table[] __cacheline_aligned = { | ||
643 | +const sys_call_ptr_t sys_call_table[] ____cacheline_aligned = { | ||
644 | /* | ||
645 | * Smells like a compiler bug -- it doesn't work | ||
646 | * when the & below is removed. | ||
647 | diff --git a/arch/x86/um/sys_call_table_64.c b/arch/x86/um/sys_call_table_64.c | ||
648 | index f2f0723070ca..95783087f0d3 100644 | ||
649 | --- a/arch/x86/um/sys_call_table_64.c | ||
650 | +++ b/arch/x86/um/sys_call_table_64.c | ||
651 | @@ -46,7 +46,7 @@ typedef void (*sys_call_ptr_t)(void); | ||
652 | |||
653 | extern void sys_ni_syscall(void); | ||
654 | |||
655 | -const sys_call_ptr_t sys_call_table[] __cacheline_aligned = { | ||
656 | +const sys_call_ptr_t sys_call_table[] ____cacheline_aligned = { | ||
657 | /* | ||
658 | * Smells like a compiler bug -- it doesn't work | ||
659 | * when the & below is removed. | ||
660 | diff --git a/drivers/bus/omap_l3_noc.c b/drivers/bus/omap_l3_noc.c | ||
661 | index 531ae591783b..17d86595951c 100644 | ||
662 | --- a/drivers/bus/omap_l3_noc.c | ||
663 | +++ b/drivers/bus/omap_l3_noc.c | ||
664 | @@ -222,10 +222,14 @@ static irqreturn_t l3_interrupt_handler(int irq, void *_l3) | ||
665 | } | ||
666 | |||
667 | /* Error found so break the for loop */ | ||
668 | - break; | ||
669 | + return IRQ_HANDLED; | ||
670 | } | ||
671 | } | ||
672 | - return IRQ_HANDLED; | ||
673 | + | ||
674 | + dev_err(l3->dev, "L3 %s IRQ not handled!!\n", | ||
675 | + inttype ? "debug" : "application"); | ||
676 | + | ||
677 | + return IRQ_NONE; | ||
678 | } | ||
679 | |||
680 | static const struct of_device_id l3_noc_match[] = { | ||
681 | @@ -296,11 +300,66 @@ static int omap_l3_probe(struct platform_device *pdev) | ||
682 | return ret; | ||
683 | } | ||
684 | |||
685 | +#ifdef CONFIG_PM | ||
686 | + | ||
687 | +/** | ||
688 | + * l3_resume_noirq() - resume function for l3_noc | ||
689 | + * @dev: pointer to l3_noc device structure | ||
690 | + * | ||
691 | + * We only have the resume handler only since we | ||
692 | + * have already maintained the delta register | ||
693 | + * configuration as part of configuring the system | ||
694 | + */ | ||
695 | +static int l3_resume_noirq(struct device *dev) | ||
696 | +{ | ||
697 | + struct omap_l3 *l3 = dev_get_drvdata(dev); | ||
698 | + int i; | ||
699 | + struct l3_flagmux_data *flag_mux; | ||
700 | + void __iomem *base, *mask_regx = NULL; | ||
701 | + u32 mask_val; | ||
702 | + | ||
703 | + for (i = 0; i < l3->num_modules; i++) { | ||
704 | + base = l3->l3_base[i]; | ||
705 | + flag_mux = l3->l3_flagmux[i]; | ||
706 | + if (!flag_mux->mask_app_bits && !flag_mux->mask_dbg_bits) | ||
707 | + continue; | ||
708 | + | ||
709 | + mask_regx = base + flag_mux->offset + L3_FLAGMUX_MASK0 + | ||
710 | + (L3_APPLICATION_ERROR << 3); | ||
711 | + mask_val = readl_relaxed(mask_regx); | ||
712 | + mask_val &= ~(flag_mux->mask_app_bits); | ||
713 | + | ||
714 | + writel_relaxed(mask_val, mask_regx); | ||
715 | + mask_regx = base + flag_mux->offset + L3_FLAGMUX_MASK0 + | ||
716 | + (L3_DEBUG_ERROR << 3); | ||
717 | + mask_val = readl_relaxed(mask_regx); | ||
718 | + mask_val &= ~(flag_mux->mask_dbg_bits); | ||
719 | + | ||
720 | + writel_relaxed(mask_val, mask_regx); | ||
721 | + } | ||
722 | + | ||
723 | + /* Dummy read to force OCP barrier */ | ||
724 | + if (mask_regx) | ||
725 | + (void)readl(mask_regx); | ||
726 | + | ||
727 | + return 0; | ||
728 | +} | ||
729 | + | ||
730 | +static const struct dev_pm_ops l3_dev_pm_ops = { | ||
731 | + .resume_noirq = l3_resume_noirq, | ||
732 | +}; | ||
733 | + | ||
734 | +#define L3_DEV_PM_OPS (&l3_dev_pm_ops) | ||
735 | +#else | ||
736 | +#define L3_DEV_PM_OPS NULL | ||
737 | +#endif | ||
738 | + | ||
739 | static struct platform_driver omap_l3_driver = { | ||
740 | .probe = omap_l3_probe, | ||
741 | .driver = { | ||
742 | .name = "omap_l3_noc", | ||
743 | .owner = THIS_MODULE, | ||
744 | + .pm = L3_DEV_PM_OPS, | ||
745 | .of_match_table = of_match_ptr(l3_noc_match), | ||
746 | }, | ||
747 | }; | ||
748 | diff --git a/drivers/clk/at91/clk-slow.c b/drivers/clk/at91/clk-slow.c | ||
749 | index 32f7c1b36204..2f13bd5246b5 100644 | ||
750 | --- a/drivers/clk/at91/clk-slow.c | ||
751 | +++ b/drivers/clk/at91/clk-slow.c | ||
752 | @@ -70,6 +70,7 @@ struct clk_sam9x5_slow { | ||
753 | |||
754 | #define to_clk_sam9x5_slow(hw) container_of(hw, struct clk_sam9x5_slow, hw) | ||
755 | |||
756 | +static struct clk *slow_clk; | ||
757 | |||
758 | static int clk_slow_osc_prepare(struct clk_hw *hw) | ||
759 | { | ||
760 | @@ -357,6 +358,8 @@ at91_clk_register_sam9x5_slow(void __iomem *sckcr, | ||
761 | clk = clk_register(NULL, &slowck->hw); | ||
762 | if (IS_ERR(clk)) | ||
763 | kfree(slowck); | ||
764 | + else | ||
765 | + slow_clk = clk; | ||
766 | |||
767 | return clk; | ||
768 | } | ||
769 | @@ -433,6 +436,8 @@ at91_clk_register_sam9260_slow(struct at91_pmc *pmc, | ||
770 | clk = clk_register(NULL, &slowck->hw); | ||
771 | if (IS_ERR(clk)) | ||
772 | kfree(slowck); | ||
773 | + else | ||
774 | + slow_clk = clk; | ||
775 | |||
776 | return clk; | ||
777 | } | ||
778 | @@ -465,3 +470,25 @@ void __init of_at91sam9260_clk_slow_setup(struct device_node *np, | ||
779 | |||
780 | of_clk_add_provider(np, of_clk_src_simple_get, clk); | ||
781 | } | ||
782 | + | ||
783 | +/* | ||
784 | + * FIXME: All slow clk users are not properly claiming it (get + prepare + | ||
785 | + * enable) before using it. | ||
786 | + * If all users properly claiming this clock decide that they don't need it | ||
787 | + * anymore (or are removed), it is disabled while faulty users are still | ||
788 | + * requiring it, and the system hangs. | ||
789 | + * Prevent this clock from being disabled until all users are properly | ||
790 | + * requesting it. | ||
791 | + * Once this is done we should remove this function and the slow_clk variable. | ||
792 | + */ | ||
793 | +static int __init of_at91_clk_slow_retain(void) | ||
794 | +{ | ||
795 | + if (!slow_clk) | ||
796 | + return 0; | ||
797 | + | ||
798 | + __clk_get(slow_clk); | ||
799 | + clk_prepare_enable(slow_clk); | ||
800 | + | ||
801 | + return 0; | ||
802 | +} | ||
803 | +arch_initcall(of_at91_clk_slow_retain); | ||
804 | diff --git a/drivers/clk/berlin/bg2q.c b/drivers/clk/berlin/bg2q.c | ||
805 | index 21784e4eb3f0..440ef81ab15c 100644 | ||
806 | --- a/drivers/clk/berlin/bg2q.c | ||
807 | +++ b/drivers/clk/berlin/bg2q.c | ||
808 | @@ -285,7 +285,6 @@ static const struct berlin2_gate_data bg2q_gates[] __initconst = { | ||
809 | { "pbridge", "perif", 15, CLK_IGNORE_UNUSED }, | ||
810 | { "sdio", "perif", 16, CLK_IGNORE_UNUSED }, | ||
811 | { "nfc", "perif", 18 }, | ||
812 | - { "smemc", "perif", 19 }, | ||
813 | { "pcie", "perif", 22 }, | ||
814 | }; | ||
815 | |||
816 | diff --git a/drivers/clk/clk-ppc-corenet.c b/drivers/clk/clk-ppc-corenet.c | ||
817 | index 8e58edfeeb37..8b284be4efa4 100644 | ||
818 | --- a/drivers/clk/clk-ppc-corenet.c | ||
819 | +++ b/drivers/clk/clk-ppc-corenet.c | ||
820 | @@ -291,7 +291,7 @@ static const struct of_device_id ppc_clk_ids[] __initconst = { | ||
821 | {} | ||
822 | }; | ||
823 | |||
824 | -static struct platform_driver ppc_corenet_clk_driver __initdata = { | ||
825 | +static struct platform_driver ppc_corenet_clk_driver = { | ||
826 | .driver = { | ||
827 | .name = "ppc_corenet_clock", | ||
828 | .owner = THIS_MODULE, | ||
829 | diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c | ||
830 | index 4896ae9e23da..26bed0889e97 100644 | ||
831 | --- a/drivers/clk/clk.c | ||
832 | +++ b/drivers/clk/clk.c | ||
833 | @@ -240,7 +240,6 @@ static const struct file_operations clk_dump_fops = { | ||
834 | .release = single_release, | ||
835 | }; | ||
836 | |||
837 | -/* caller must hold prepare_lock */ | ||
838 | static int clk_debug_create_one(struct clk *clk, struct dentry *pdentry) | ||
839 | { | ||
840 | struct dentry *d; | ||
841 | @@ -1944,7 +1943,6 @@ int __clk_init(struct device *dev, struct clk *clk) | ||
842 | else | ||
843 | clk->rate = 0; | ||
844 | |||
845 | - clk_debug_register(clk); | ||
846 | /* | ||
847 | * walk the list of orphan clocks and reparent any that are children of | ||
848 | * this clock | ||
849 | @@ -1979,6 +1977,9 @@ int __clk_init(struct device *dev, struct clk *clk) | ||
850 | out: | ||
851 | clk_prepare_unlock(); | ||
852 | |||
853 | + if (!ret) | ||
854 | + clk_debug_register(clk); | ||
855 | + | ||
856 | return ret; | ||
857 | } | ||
858 | |||
859 | @@ -2273,14 +2274,17 @@ int __clk_get(struct clk *clk) | ||
860 | |||
861 | void __clk_put(struct clk *clk) | ||
862 | { | ||
863 | + struct module *owner; | ||
864 | + | ||
865 | if (!clk || WARN_ON_ONCE(IS_ERR(clk))) | ||
866 | return; | ||
867 | |||
868 | clk_prepare_lock(); | ||
869 | + owner = clk->owner; | ||
870 | kref_put(&clk->ref, __clk_release); | ||
871 | clk_prepare_unlock(); | ||
872 | |||
873 | - module_put(clk->owner); | ||
874 | + module_put(owner); | ||
875 | } | ||
876 | |||
877 | /*** clk rate change notifiers ***/ | ||
878 | diff --git a/drivers/clk/rockchip/clk-rk3188.c b/drivers/clk/rockchip/clk-rk3188.c | ||
879 | index beed49c79126..8088b384ce6e 100644 | ||
880 | --- a/drivers/clk/rockchip/clk-rk3188.c | ||
881 | +++ b/drivers/clk/rockchip/clk-rk3188.c | ||
882 | @@ -210,6 +210,17 @@ PNAME(mux_sclk_hsadc_p) = { "hsadc_src", "hsadc_frac", "ext_hsadc" }; | ||
883 | PNAME(mux_mac_p) = { "gpll", "dpll" }; | ||
884 | PNAME(mux_sclk_macref_p) = { "mac_src", "ext_rmii" }; | ||
885 | |||
886 | +static struct rockchip_pll_clock rk3066_pll_clks[] __initdata = { | ||
887 | + [apll] = PLL(pll_rk3066, PLL_APLL, "apll", mux_pll_p, 0, RK2928_PLL_CON(0), | ||
888 | + RK2928_MODE_CON, 0, 5, rk3188_pll_rates), | ||
889 | + [dpll] = PLL(pll_rk3066, PLL_DPLL, "dpll", mux_pll_p, 0, RK2928_PLL_CON(4), | ||
890 | + RK2928_MODE_CON, 4, 4, NULL), | ||
891 | + [cpll] = PLL(pll_rk3066, PLL_CPLL, "cpll", mux_pll_p, 0, RK2928_PLL_CON(8), | ||
892 | + RK2928_MODE_CON, 8, 6, rk3188_pll_rates), | ||
893 | + [gpll] = PLL(pll_rk3066, PLL_GPLL, "gpll", mux_pll_p, 0, RK2928_PLL_CON(12), | ||
894 | + RK2928_MODE_CON, 12, 7, rk3188_pll_rates), | ||
895 | +}; | ||
896 | + | ||
897 | static struct rockchip_pll_clock rk3188_pll_clks[] __initdata = { | ||
898 | [apll] = PLL(pll_rk3066, PLL_APLL, "apll", mux_pll_p, 0, RK2928_PLL_CON(0), | ||
899 | RK2928_MODE_CON, 0, 6, rk3188_pll_rates), | ||
900 | @@ -742,8 +753,8 @@ static void __init rk3188_common_clk_init(struct device_node *np) | ||
901 | static void __init rk3066a_clk_init(struct device_node *np) | ||
902 | { | ||
903 | rk3188_common_clk_init(np); | ||
904 | - rockchip_clk_register_plls(rk3188_pll_clks, | ||
905 | - ARRAY_SIZE(rk3188_pll_clks), | ||
906 | + rockchip_clk_register_plls(rk3066_pll_clks, | ||
907 | + ARRAY_SIZE(rk3066_pll_clks), | ||
908 | RK3066_GRF_SOC_STATUS); | ||
909 | rockchip_clk_register_branches(rk3066a_clk_branches, | ||
910 | ARRAY_SIZE(rk3066a_clk_branches)); | ||
911 | diff --git a/drivers/clk/rockchip/clk-rk3288.c b/drivers/clk/rockchip/clk-rk3288.c | ||
912 | index 23278291da44..6dbc64759a58 100644 | ||
913 | --- a/drivers/clk/rockchip/clk-rk3288.c | ||
914 | +++ b/drivers/clk/rockchip/clk-rk3288.c | ||
915 | @@ -142,20 +142,20 @@ struct rockchip_pll_rate_table rk3288_pll_rates[] = { | ||
916 | } | ||
917 | |||
918 | static struct rockchip_cpuclk_rate_table rk3288_cpuclk_rates[] __initdata = { | ||
919 | - RK3288_CPUCLK_RATE(1800000000, 2, 4, 2, 4, 4), | ||
920 | - RK3288_CPUCLK_RATE(1704000000, 2, 4, 2, 4, 4), | ||
921 | - RK3288_CPUCLK_RATE(1608000000, 2, 4, 2, 4, 4), | ||
922 | - RK3288_CPUCLK_RATE(1512000000, 2, 4, 2, 4, 4), | ||
923 | - RK3288_CPUCLK_RATE(1416000000, 2, 4, 2, 4, 4), | ||
924 | - RK3288_CPUCLK_RATE(1200000000, 2, 4, 2, 4, 4), | ||
925 | - RK3288_CPUCLK_RATE(1008000000, 2, 4, 2, 4, 4), | ||
926 | - RK3288_CPUCLK_RATE( 816000000, 2, 4, 2, 4, 4), | ||
927 | - RK3288_CPUCLK_RATE( 696000000, 2, 4, 2, 4, 4), | ||
928 | - RK3288_CPUCLK_RATE( 600000000, 2, 4, 2, 4, 4), | ||
929 | - RK3288_CPUCLK_RATE( 408000000, 2, 4, 2, 4, 4), | ||
930 | - RK3288_CPUCLK_RATE( 312000000, 2, 4, 2, 4, 4), | ||
931 | - RK3288_CPUCLK_RATE( 216000000, 2, 4, 2, 4, 4), | ||
932 | - RK3288_CPUCLK_RATE( 126000000, 2, 4, 2, 4, 4), | ||
933 | + RK3288_CPUCLK_RATE(1800000000, 1, 3, 1, 3, 3), | ||
934 | + RK3288_CPUCLK_RATE(1704000000, 1, 3, 1, 3, 3), | ||
935 | + RK3288_CPUCLK_RATE(1608000000, 1, 3, 1, 3, 3), | ||
936 | + RK3288_CPUCLK_RATE(1512000000, 1, 3, 1, 3, 3), | ||
937 | + RK3288_CPUCLK_RATE(1416000000, 1, 3, 1, 3, 3), | ||
938 | + RK3288_CPUCLK_RATE(1200000000, 1, 3, 1, 3, 3), | ||
939 | + RK3288_CPUCLK_RATE(1008000000, 1, 3, 1, 3, 3), | ||
940 | + RK3288_CPUCLK_RATE( 816000000, 1, 3, 1, 3, 3), | ||
941 | + RK3288_CPUCLK_RATE( 696000000, 1, 3, 1, 3, 3), | ||
942 | + RK3288_CPUCLK_RATE( 600000000, 1, 3, 1, 3, 3), | ||
943 | + RK3288_CPUCLK_RATE( 408000000, 1, 3, 1, 3, 3), | ||
944 | + RK3288_CPUCLK_RATE( 312000000, 1, 3, 1, 3, 3), | ||
945 | + RK3288_CPUCLK_RATE( 216000000, 1, 3, 1, 3, 3), | ||
946 | + RK3288_CPUCLK_RATE( 126000000, 1, 3, 1, 3, 3), | ||
947 | }; | ||
948 | |||
949 | static const struct rockchip_cpuclk_reg_data rk3288_cpuclk_data = { | ||
950 | diff --git a/drivers/clk/samsung/clk-exynos-audss.c b/drivers/clk/samsung/clk-exynos-audss.c | ||
951 | index 13eae14c2cc2..b50469faf70c 100644 | ||
952 | --- a/drivers/clk/samsung/clk-exynos-audss.c | ||
953 | +++ b/drivers/clk/samsung/clk-exynos-audss.c | ||
954 | @@ -210,6 +210,10 @@ static int exynos_audss_clk_remove(struct platform_device *pdev) | ||
955 | { | ||
956 | int i; | ||
957 | |||
958 | +#ifdef CONFIG_PM_SLEEP | ||
959 | + unregister_syscore_ops(&exynos_audss_clk_syscore_ops); | ||
960 | +#endif | ||
961 | + | ||
962 | of_clk_del_provider(pdev->dev.of_node); | ||
963 | |||
964 | for (i = 0; i < clk_data.clk_num; i++) { | ||
965 | diff --git a/drivers/gpio/gpio-crystalcove.c b/drivers/gpio/gpio-crystalcove.c | ||
966 | index bbfe7f508502..a7cf0c193ba8 100644 | ||
967 | --- a/drivers/gpio/gpio-crystalcove.c | ||
968 | +++ b/drivers/gpio/gpio-crystalcove.c | ||
969 | @@ -272,7 +272,7 @@ static irqreturn_t crystalcove_gpio_irq_handler(int irq, void *data) | ||
970 | for (gpio = 0; gpio < CRYSTALCOVE_GPIO_NUM; gpio++) { | ||
971 | if (pending & BIT(gpio)) { | ||
972 | virq = irq_find_mapping(cg->chip.irqdomain, gpio); | ||
973 | - generic_handle_irq(virq); | ||
974 | + handle_nested_irq(virq); | ||
975 | } | ||
976 | } | ||
977 | |||
978 | diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c | ||
979 | index 604dbe60bdee..08261f2b3a82 100644 | ||
980 | --- a/drivers/gpio/gpiolib-of.c | ||
981 | +++ b/drivers/gpio/gpiolib-of.c | ||
982 | @@ -45,8 +45,14 @@ static int of_gpiochip_find_and_xlate(struct gpio_chip *gc, void *data) | ||
983 | return false; | ||
984 | |||
985 | ret = gc->of_xlate(gc, &gg_data->gpiospec, gg_data->flags); | ||
986 | - if (ret < 0) | ||
987 | - return false; | ||
988 | + if (ret < 0) { | ||
989 | + /* We've found the gpio chip, but the translation failed. | ||
990 | + * Return true to stop looking and return the translation | ||
991 | + * error via out_gpio | ||
992 | + */ | ||
993 | + gg_data->out_gpio = ERR_PTR(ret); | ||
994 | + return true; | ||
995 | + } | ||
996 | |||
997 | gg_data->out_gpio = gpiochip_get_desc(gc, ret); | ||
998 | return true; | ||
999 | diff --git a/drivers/gpio/gpiolib-sysfs.c b/drivers/gpio/gpiolib-sysfs.c | ||
1000 | index 5f2150b619a7..0d21396f961d 100644 | ||
1001 | --- a/drivers/gpio/gpiolib-sysfs.c | ||
1002 | +++ b/drivers/gpio/gpiolib-sysfs.c | ||
1003 | @@ -128,7 +128,7 @@ static ssize_t gpio_value_store(struct device *dev, | ||
1004 | return status; | ||
1005 | } | ||
1006 | |||
1007 | -static const DEVICE_ATTR(value, 0644, | ||
1008 | +static DEVICE_ATTR(value, 0644, | ||
1009 | gpio_value_show, gpio_value_store); | ||
1010 | |||
1011 | static irqreturn_t gpio_sysfs_irq(int irq, void *priv) | ||
1012 | @@ -353,18 +353,15 @@ static ssize_t gpio_active_low_store(struct device *dev, | ||
1013 | return status ? : size; | ||
1014 | } | ||
1015 | |||
1016 | -static const DEVICE_ATTR(active_low, 0644, | ||
1017 | +static DEVICE_ATTR(active_low, 0644, | ||
1018 | gpio_active_low_show, gpio_active_low_store); | ||
1019 | |||
1020 | -static const struct attribute *gpio_attrs[] = { | ||
1021 | +static struct attribute *gpio_attrs[] = { | ||
1022 | &dev_attr_value.attr, | ||
1023 | &dev_attr_active_low.attr, | ||
1024 | NULL, | ||
1025 | }; | ||
1026 | - | ||
1027 | -static const struct attribute_group gpio_attr_group = { | ||
1028 | - .attrs = (struct attribute **) gpio_attrs, | ||
1029 | -}; | ||
1030 | +ATTRIBUTE_GROUPS(gpio); | ||
1031 | |||
1032 | /* | ||
1033 | * /sys/class/gpio/gpiochipN/ | ||
1034 | @@ -400,16 +397,13 @@ static ssize_t chip_ngpio_show(struct device *dev, | ||
1035 | } | ||
1036 | static DEVICE_ATTR(ngpio, 0444, chip_ngpio_show, NULL); | ||
1037 | |||
1038 | -static const struct attribute *gpiochip_attrs[] = { | ||
1039 | +static struct attribute *gpiochip_attrs[] = { | ||
1040 | &dev_attr_base.attr, | ||
1041 | &dev_attr_label.attr, | ||
1042 | &dev_attr_ngpio.attr, | ||
1043 | NULL, | ||
1044 | }; | ||
1045 | - | ||
1046 | -static const struct attribute_group gpiochip_attr_group = { | ||
1047 | - .attrs = (struct attribute **) gpiochip_attrs, | ||
1048 | -}; | ||
1049 | +ATTRIBUTE_GROUPS(gpiochip); | ||
1050 | |||
1051 | /* | ||
1052 | * /sys/class/gpio/export ... write-only | ||
1053 | @@ -564,18 +558,15 @@ int gpiod_export(struct gpio_desc *desc, bool direction_may_change) | ||
1054 | if (desc->chip->names && desc->chip->names[offset]) | ||
1055 | ioname = desc->chip->names[offset]; | ||
1056 | |||
1057 | - dev = device_create(&gpio_class, desc->chip->dev, MKDEV(0, 0), | ||
1058 | - desc, ioname ? ioname : "gpio%u", | ||
1059 | - desc_to_gpio(desc)); | ||
1060 | + dev = device_create_with_groups(&gpio_class, desc->chip->dev, | ||
1061 | + MKDEV(0, 0), desc, gpio_groups, | ||
1062 | + ioname ? ioname : "gpio%u", | ||
1063 | + desc_to_gpio(desc)); | ||
1064 | if (IS_ERR(dev)) { | ||
1065 | status = PTR_ERR(dev); | ||
1066 | goto fail_unlock; | ||
1067 | } | ||
1068 | |||
1069 | - status = sysfs_create_group(&dev->kobj, &gpio_attr_group); | ||
1070 | - if (status) | ||
1071 | - goto fail_unregister_device; | ||
1072 | - | ||
1073 | if (direction_may_change) { | ||
1074 | status = device_create_file(dev, &dev_attr_direction); | ||
1075 | if (status) | ||
1076 | @@ -586,13 +577,15 @@ int gpiod_export(struct gpio_desc *desc, bool direction_may_change) | ||
1077 | !test_bit(FLAG_IS_OUT, &desc->flags))) { | ||
1078 | status = device_create_file(dev, &dev_attr_edge); | ||
1079 | if (status) | ||
1080 | - goto fail_unregister_device; | ||
1081 | + goto fail_remove_attr_direction; | ||
1082 | } | ||
1083 | |||
1084 | set_bit(FLAG_EXPORT, &desc->flags); | ||
1085 | mutex_unlock(&sysfs_lock); | ||
1086 | return 0; | ||
1087 | |||
1088 | +fail_remove_attr_direction: | ||
1089 | + device_remove_file(dev, &dev_attr_direction); | ||
1090 | fail_unregister_device: | ||
1091 | device_unregister(dev); | ||
1092 | fail_unlock: | ||
1093 | @@ -726,6 +719,8 @@ void gpiod_unexport(struct gpio_desc *desc) | ||
1094 | mutex_unlock(&sysfs_lock); | ||
1095 | |||
1096 | if (dev) { | ||
1097 | + device_remove_file(dev, &dev_attr_edge); | ||
1098 | + device_remove_file(dev, &dev_attr_direction); | ||
1099 | device_unregister(dev); | ||
1100 | put_device(dev); | ||
1101 | } | ||
1102 | @@ -750,13 +745,13 @@ int gpiochip_export(struct gpio_chip *chip) | ||
1103 | |||
1104 | /* use chip->base for the ID; it's already known to be unique */ | ||
1105 | mutex_lock(&sysfs_lock); | ||
1106 | - dev = device_create(&gpio_class, chip->dev, MKDEV(0, 0), chip, | ||
1107 | - "gpiochip%d", chip->base); | ||
1108 | - if (!IS_ERR(dev)) { | ||
1109 | - status = sysfs_create_group(&dev->kobj, | ||
1110 | - &gpiochip_attr_group); | ||
1111 | - } else | ||
1112 | + dev = device_create_with_groups(&gpio_class, chip->dev, MKDEV(0, 0), | ||
1113 | + chip, gpiochip_groups, | ||
1114 | + "gpiochip%d", chip->base); | ||
1115 | + if (IS_ERR(dev)) | ||
1116 | status = PTR_ERR(dev); | ||
1117 | + else | ||
1118 | + status = 0; | ||
1119 | chip->exported = (status == 0); | ||
1120 | mutex_unlock(&sysfs_lock); | ||
1121 | |||
1122 | diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c | ||
1123 | index e8e98ca25ec7..c81bda0ec2cf 100644 | ||
1124 | --- a/drivers/gpio/gpiolib.c | ||
1125 | +++ b/drivers/gpio/gpiolib.c | ||
1126 | @@ -268,6 +268,9 @@ int gpiochip_add(struct gpio_chip *chip) | ||
1127 | |||
1128 | spin_unlock_irqrestore(&gpio_lock, flags); | ||
1129 | |||
1130 | + if (status) | ||
1131 | + goto fail; | ||
1132 | + | ||
1133 | #ifdef CONFIG_PINCTRL | ||
1134 | INIT_LIST_HEAD(&chip->pin_ranges); | ||
1135 | #endif | ||
1136 | @@ -275,12 +278,12 @@ int gpiochip_add(struct gpio_chip *chip) | ||
1137 | of_gpiochip_add(chip); | ||
1138 | acpi_gpiochip_add(chip); | ||
1139 | |||
1140 | - if (status) | ||
1141 | - goto fail; | ||
1142 | - | ||
1143 | status = gpiochip_export(chip); | ||
1144 | - if (status) | ||
1145 | + if (status) { | ||
1146 | + acpi_gpiochip_remove(chip); | ||
1147 | + of_gpiochip_remove(chip); | ||
1148 | goto fail; | ||
1149 | + } | ||
1150 | |||
1151 | pr_debug("%s: registered GPIOs %d to %d on device: %s\n", __func__, | ||
1152 | chip->base, chip->base + chip->ngpio - 1, | ||
1153 | @@ -313,14 +316,13 @@ void gpiochip_remove(struct gpio_chip *chip) | ||
1154 | unsigned long flags; | ||
1155 | unsigned id; | ||
1156 | |||
1157 | - acpi_gpiochip_remove(chip); | ||
1158 | - | ||
1159 | - spin_lock_irqsave(&gpio_lock, flags); | ||
1160 | - | ||
1161 | gpiochip_irqchip_remove(chip); | ||
1162 | + | ||
1163 | + acpi_gpiochip_remove(chip); | ||
1164 | gpiochip_remove_pin_ranges(chip); | ||
1165 | of_gpiochip_remove(chip); | ||
1166 | |||
1167 | + spin_lock_irqsave(&gpio_lock, flags); | ||
1168 | for (id = 0; id < chip->ngpio; id++) { | ||
1169 | if (test_bit(FLAG_REQUESTED, &chip->desc[id].flags)) | ||
1170 | dev_crit(chip->dev, "REMOVING GPIOCHIP WITH GPIOS STILL REQUESTED\n"); | ||
1171 | diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c | ||
1172 | index 08e33b8b13a4..9f59c9027ebe 100644 | ||
1173 | --- a/drivers/gpu/drm/drm_dp_helper.c | ||
1174 | +++ b/drivers/gpu/drm/drm_dp_helper.c | ||
1175 | @@ -378,10 +378,11 @@ static int drm_dp_dpcd_access(struct drm_dp_aux *aux, u8 request, | ||
1176 | |||
1177 | /* | ||
1178 | * The specification doesn't give any recommendation on how often to | ||
1179 | - * retry native transactions, so retry 7 times like for I2C-over-AUX | ||
1180 | - * transactions. | ||
1181 | + * retry native transactions. We used to retry 7 times like for | ||
1182 | + * aux i2c transactions but real world devices this wasn't | ||
1183 | + * sufficient, bump to 32 which makes Dell 4k monitors happier. | ||
1184 | */ | ||
1185 | - for (retry = 0; retry < 7; retry++) { | ||
1186 | + for (retry = 0; retry < 32; retry++) { | ||
1187 | |||
1188 | mutex_lock(&aux->hw_mutex); | ||
1189 | err = aux->transfer(aux, &msg); | ||
1190 | diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c | ||
1191 | index 070f913d2dba..f50d884b81cf 100644 | ||
1192 | --- a/drivers/gpu/drm/drm_dp_mst_topology.c | ||
1193 | +++ b/drivers/gpu/drm/drm_dp_mst_topology.c | ||
1194 | @@ -839,6 +839,8 @@ static void drm_dp_put_mst_branch_device(struct drm_dp_mst_branch *mstb) | ||
1195 | |||
1196 | static void drm_dp_port_teardown_pdt(struct drm_dp_mst_port *port, int old_pdt) | ||
1197 | { | ||
1198 | + struct drm_dp_mst_branch *mstb; | ||
1199 | + | ||
1200 | switch (old_pdt) { | ||
1201 | case DP_PEER_DEVICE_DP_LEGACY_CONV: | ||
1202 | case DP_PEER_DEVICE_SST_SINK: | ||
1203 | @@ -846,8 +848,9 @@ static void drm_dp_port_teardown_pdt(struct drm_dp_mst_port *port, int old_pdt) | ||
1204 | drm_dp_mst_unregister_i2c_bus(&port->aux); | ||
1205 | break; | ||
1206 | case DP_PEER_DEVICE_MST_BRANCHING: | ||
1207 | - drm_dp_put_mst_branch_device(port->mstb); | ||
1208 | + mstb = port->mstb; | ||
1209 | port->mstb = NULL; | ||
1210 | + drm_dp_put_mst_branch_device(mstb); | ||
1211 | break; | ||
1212 | } | ||
1213 | } | ||
1214 | diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c | ||
1215 | index 0c0c39bac23d..ef757f712a3d 100644 | ||
1216 | --- a/drivers/gpu/drm/drm_fb_helper.c | ||
1217 | +++ b/drivers/gpu/drm/drm_fb_helper.c | ||
1218 | @@ -347,9 +347,18 @@ bool drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper) | ||
1219 | { | ||
1220 | struct drm_device *dev = fb_helper->dev; | ||
1221 | bool ret; | ||
1222 | + bool do_delayed = false; | ||
1223 | + | ||
1224 | drm_modeset_lock_all(dev); | ||
1225 | ret = restore_fbdev_mode(fb_helper); | ||
1226 | + | ||
1227 | + do_delayed = fb_helper->delayed_hotplug; | ||
1228 | + if (do_delayed) | ||
1229 | + fb_helper->delayed_hotplug = false; | ||
1230 | drm_modeset_unlock_all(dev); | ||
1231 | + | ||
1232 | + if (do_delayed) | ||
1233 | + drm_fb_helper_hotplug_event(fb_helper); | ||
1234 | return ret; | ||
1235 | } | ||
1236 | EXPORT_SYMBOL(drm_fb_helper_restore_fbdev_mode_unlocked); | ||
1237 | @@ -888,10 +897,6 @@ int drm_fb_helper_set_par(struct fb_info *info) | ||
1238 | |||
1239 | drm_fb_helper_restore_fbdev_mode_unlocked(fb_helper); | ||
1240 | |||
1241 | - if (fb_helper->delayed_hotplug) { | ||
1242 | - fb_helper->delayed_hotplug = false; | ||
1243 | - drm_fb_helper_hotplug_event(fb_helper); | ||
1244 | - } | ||
1245 | return 0; | ||
1246 | } | ||
1247 | EXPORT_SYMBOL(drm_fb_helper_set_par); | ||
1248 | diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c | ||
1249 | index 5ef03c216a27..c4edea907f8f 100644 | ||
1250 | --- a/drivers/gpu/drm/drm_irq.c | ||
1251 | +++ b/drivers/gpu/drm/drm_irq.c | ||
1252 | @@ -1029,7 +1029,8 @@ void drm_vblank_put(struct drm_device *dev, int crtc) | ||
1253 | { | ||
1254 | struct drm_vblank_crtc *vblank = &dev->vblank[crtc]; | ||
1255 | |||
1256 | - BUG_ON(atomic_read(&vblank->refcount) == 0); | ||
1257 | + if (WARN_ON(atomic_read(&vblank->refcount) == 0)) | ||
1258 | + return; | ||
1259 | |||
1260 | if (WARN_ON(crtc >= dev->num_crtcs)) | ||
1261 | return; | ||
1262 | diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c | ||
1263 | index 2318b4c7a8f8..925697320949 100644 | ||
1264 | --- a/drivers/gpu/drm/i915/i915_drv.c | ||
1265 | +++ b/drivers/gpu/drm/i915/i915_drv.c | ||
1266 | @@ -692,11 +692,12 @@ static int __i915_drm_thaw(struct drm_device *dev, bool restore_gtt_mappings) | ||
1267 | spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); | ||
1268 | } | ||
1269 | |||
1270 | - intel_dp_mst_resume(dev); | ||
1271 | drm_modeset_lock_all(dev); | ||
1272 | intel_modeset_setup_hw_state(dev, true); | ||
1273 | drm_modeset_unlock_all(dev); | ||
1274 | |||
1275 | + intel_dp_mst_resume(dev); | ||
1276 | + | ||
1277 | /* | ||
1278 | * ... but also need to make sure that hotplug processing | ||
1279 | * doesn't cause havoc. Like in the driver load code we don't | ||
1280 | diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h | ||
1281 | index 16a6f6d187a1..346aee828dc3 100644 | ||
1282 | --- a/drivers/gpu/drm/i915/i915_drv.h | ||
1283 | +++ b/drivers/gpu/drm/i915/i915_drv.h | ||
1284 | @@ -877,6 +877,7 @@ struct i915_suspend_saved_registers { | ||
1285 | u32 savePIPEB_LINK_N1; | ||
1286 | u32 saveMCHBAR_RENDER_STANDBY; | ||
1287 | u32 savePCH_PORT_HOTPLUG; | ||
1288 | + u16 saveGCDGMBUS; | ||
1289 | }; | ||
1290 | |||
1291 | struct vlv_s0ix_state { | ||
1292 | @@ -1665,8 +1666,6 @@ struct drm_i915_private { | ||
1293 | */ | ||
1294 | struct workqueue_struct *dp_wq; | ||
1295 | |||
1296 | - uint32_t bios_vgacntr; | ||
1297 | - | ||
1298 | /* Old dri1 support infrastructure, beware the dragons ya fools entering | ||
1299 | * here! */ | ||
1300 | struct i915_dri1_state dri1; | ||
1301 | diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c | ||
1302 | index 28f91df2604d..2de5f5f4ba45 100644 | ||
1303 | --- a/drivers/gpu/drm/i915/i915_gem.c | ||
1304 | +++ b/drivers/gpu/drm/i915/i915_gem.c | ||
1305 | @@ -4193,7 +4193,7 @@ i915_gem_pin_ioctl(struct drm_device *dev, void *data, | ||
1306 | struct drm_i915_gem_object *obj; | ||
1307 | int ret; | ||
1308 | |||
1309 | - if (INTEL_INFO(dev)->gen >= 6) | ||
1310 | + if (drm_core_check_feature(dev, DRIVER_MODESET)) | ||
1311 | return -ENODEV; | ||
1312 | |||
1313 | ret = i915_mutex_lock_interruptible(dev); | ||
1314 | @@ -4249,6 +4249,9 @@ i915_gem_unpin_ioctl(struct drm_device *dev, void *data, | ||
1315 | struct drm_i915_gem_object *obj; | ||
1316 | int ret; | ||
1317 | |||
1318 | + if (drm_core_check_feature(dev, DRIVER_MODESET)) | ||
1319 | + return -ENODEV; | ||
1320 | + | ||
1321 | ret = i915_mutex_lock_interruptible(dev); | ||
1322 | if (ret) | ||
1323 | return ret; | ||
1324 | diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c | ||
1325 | index a5221d8f1580..c12f087d7a14 100644 | ||
1326 | --- a/drivers/gpu/drm/i915/i915_gem_context.c | ||
1327 | +++ b/drivers/gpu/drm/i915/i915_gem_context.c | ||
1328 | @@ -468,7 +468,12 @@ mi_set_context(struct intel_engine_cs *ring, | ||
1329 | u32 hw_flags) | ||
1330 | { | ||
1331 | u32 flags = hw_flags | MI_MM_SPACE_GTT; | ||
1332 | - int ret; | ||
1333 | + const int num_rings = | ||
1334 | + /* Use an extended w/a on ivb+ if signalling from other rings */ | ||
1335 | + i915_semaphore_is_enabled(ring->dev) ? | ||
1336 | + hweight32(INTEL_INFO(ring->dev)->ring_mask) - 1 : | ||
1337 | + 0; | ||
1338 | + int len, i, ret; | ||
1339 | |||
1340 | /* w/a: If Flush TLB Invalidation Mode is enabled, driver must do a TLB | ||
1341 | * invalidation prior to MI_SET_CONTEXT. On GEN6 we don't set the value | ||
1342 | @@ -485,15 +490,31 @@ mi_set_context(struct intel_engine_cs *ring, | ||
1343 | if (!IS_HASWELL(ring->dev) && INTEL_INFO(ring->dev)->gen < 8) | ||
1344 | flags |= (MI_SAVE_EXT_STATE_EN | MI_RESTORE_EXT_STATE_EN); | ||
1345 | |||
1346 | - ret = intel_ring_begin(ring, 6); | ||
1347 | + | ||
1348 | + len = 4; | ||
1349 | + if (INTEL_INFO(ring->dev)->gen >= 7) | ||
1350 | + len += 2 + (num_rings ? 4*num_rings + 2 : 0); | ||
1351 | + | ||
1352 | + ret = intel_ring_begin(ring, len); | ||
1353 | if (ret) | ||
1354 | return ret; | ||
1355 | |||
1356 | /* WaProgramMiArbOnOffAroundMiSetContext:ivb,vlv,hsw,bdw,chv */ | ||
1357 | - if (INTEL_INFO(ring->dev)->gen >= 7) | ||
1358 | + if (INTEL_INFO(ring->dev)->gen >= 7) { | ||
1359 | intel_ring_emit(ring, MI_ARB_ON_OFF | MI_ARB_DISABLE); | ||
1360 | - else | ||
1361 | - intel_ring_emit(ring, MI_NOOP); | ||
1362 | + if (num_rings) { | ||
1363 | + struct intel_engine_cs *signaller; | ||
1364 | + | ||
1365 | + intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(num_rings)); | ||
1366 | + for_each_ring(signaller, to_i915(ring->dev), i) { | ||
1367 | + if (signaller == ring) | ||
1368 | + continue; | ||
1369 | + | ||
1370 | + intel_ring_emit(ring, RING_PSMI_CTL(signaller->mmio_base)); | ||
1371 | + intel_ring_emit(ring, _MASKED_BIT_ENABLE(GEN6_PSMI_SLEEP_MSG_DISABLE)); | ||
1372 | + } | ||
1373 | + } | ||
1374 | + } | ||
1375 | |||
1376 | intel_ring_emit(ring, MI_NOOP); | ||
1377 | intel_ring_emit(ring, MI_SET_CONTEXT); | ||
1378 | @@ -505,10 +526,21 @@ mi_set_context(struct intel_engine_cs *ring, | ||
1379 | */ | ||
1380 | intel_ring_emit(ring, MI_NOOP); | ||
1381 | |||
1382 | - if (INTEL_INFO(ring->dev)->gen >= 7) | ||
1383 | + if (INTEL_INFO(ring->dev)->gen >= 7) { | ||
1384 | + if (num_rings) { | ||
1385 | + struct intel_engine_cs *signaller; | ||
1386 | + | ||
1387 | + intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(num_rings)); | ||
1388 | + for_each_ring(signaller, to_i915(ring->dev), i) { | ||
1389 | + if (signaller == ring) | ||
1390 | + continue; | ||
1391 | + | ||
1392 | + intel_ring_emit(ring, RING_PSMI_CTL(signaller->mmio_base)); | ||
1393 | + intel_ring_emit(ring, _MASKED_BIT_DISABLE(GEN6_PSMI_SLEEP_MSG_DISABLE)); | ||
1394 | + } | ||
1395 | + } | ||
1396 | intel_ring_emit(ring, MI_ARB_ON_OFF | MI_ARB_ENABLE); | ||
1397 | - else | ||
1398 | - intel_ring_emit(ring, MI_NOOP); | ||
1399 | + } | ||
1400 | |||
1401 | intel_ring_advance(ring); | ||
1402 | |||
1403 | diff --git a/drivers/gpu/drm/i915/i915_gem_stolen.c b/drivers/gpu/drm/i915/i915_gem_stolen.c | ||
1404 | index 85fda6b803e4..0ee76b25204c 100644 | ||
1405 | --- a/drivers/gpu/drm/i915/i915_gem_stolen.c | ||
1406 | +++ b/drivers/gpu/drm/i915/i915_gem_stolen.c | ||
1407 | @@ -137,7 +137,11 @@ static unsigned long i915_stolen_to_physical(struct drm_device *dev) | ||
1408 | r = devm_request_mem_region(dev->dev, base + 1, | ||
1409 | dev_priv->gtt.stolen_size - 1, | ||
1410 | "Graphics Stolen Memory"); | ||
1411 | - if (r == NULL) { | ||
1412 | + /* | ||
1413 | + * GEN3 firmware likes to smash pci bridges into the stolen | ||
1414 | + * range. Apparently this works. | ||
1415 | + */ | ||
1416 | + if (r == NULL && !IS_GEN3(dev)) { | ||
1417 | DRM_ERROR("conflict detected with stolen region: [0x%08x - 0x%08x]\n", | ||
1418 | base, base + (uint32_t)dev_priv->gtt.stolen_size); | ||
1419 | base = 0; | ||
1420 | diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c | ||
1421 | index f66392b6e287..9ba1177200b2 100644 | ||
1422 | --- a/drivers/gpu/drm/i915/i915_irq.c | ||
1423 | +++ b/drivers/gpu/drm/i915/i915_irq.c | ||
1424 | @@ -4022,8 +4022,6 @@ static bool i8xx_handle_vblank(struct drm_device *dev, | ||
1425 | if ((iir & flip_pending) == 0) | ||
1426 | goto check_page_flip; | ||
1427 | |||
1428 | - intel_prepare_page_flip(dev, plane); | ||
1429 | - | ||
1430 | /* We detect FlipDone by looking for the change in PendingFlip from '1' | ||
1431 | * to '0' on the following vblank, i.e. IIR has the Pendingflip | ||
1432 | * asserted following the MI_DISPLAY_FLIP, but ISR is deasserted, hence | ||
1433 | @@ -4033,6 +4031,7 @@ static bool i8xx_handle_vblank(struct drm_device *dev, | ||
1434 | if (I915_READ16(ISR) & flip_pending) | ||
1435 | goto check_page_flip; | ||
1436 | |||
1437 | + intel_prepare_page_flip(dev, plane); | ||
1438 | intel_finish_page_flip(dev, pipe); | ||
1439 | return true; | ||
1440 | |||
1441 | @@ -4210,8 +4209,6 @@ static bool i915_handle_vblank(struct drm_device *dev, | ||
1442 | if ((iir & flip_pending) == 0) | ||
1443 | goto check_page_flip; | ||
1444 | |||
1445 | - intel_prepare_page_flip(dev, plane); | ||
1446 | - | ||
1447 | /* We detect FlipDone by looking for the change in PendingFlip from '1' | ||
1448 | * to '0' on the following vblank, i.e. IIR has the Pendingflip | ||
1449 | * asserted following the MI_DISPLAY_FLIP, but ISR is deasserted, hence | ||
1450 | @@ -4221,6 +4218,7 @@ static bool i915_handle_vblank(struct drm_device *dev, | ||
1451 | if (I915_READ(ISR) & flip_pending) | ||
1452 | goto check_page_flip; | ||
1453 | |||
1454 | + intel_prepare_page_flip(dev, plane); | ||
1455 | intel_finish_page_flip(dev, pipe); | ||
1456 | return true; | ||
1457 | |||
1458 | diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h | ||
1459 | index c01e5f31430e..3f1e54bfcddb 100644 | ||
1460 | --- a/drivers/gpu/drm/i915/i915_reg.h | ||
1461 | +++ b/drivers/gpu/drm/i915/i915_reg.h | ||
1462 | @@ -74,6 +74,7 @@ | ||
1463 | #define I915_GC_RENDER_CLOCK_166_MHZ (0 << 0) | ||
1464 | #define I915_GC_RENDER_CLOCK_200_MHZ (1 << 0) | ||
1465 | #define I915_GC_RENDER_CLOCK_333_MHZ (4 << 0) | ||
1466 | +#define GCDGMBUS 0xcc | ||
1467 | #define PCI_LBPC 0xf4 /* legacy/combination backlight modes, also called LBB */ | ||
1468 | |||
1469 | |||
1470 | @@ -370,6 +371,7 @@ | ||
1471 | #define PIPE_CONTROL_STORE_DATA_INDEX (1<<21) | ||
1472 | #define PIPE_CONTROL_CS_STALL (1<<20) | ||
1473 | #define PIPE_CONTROL_TLB_INVALIDATE (1<<18) | ||
1474 | +#define PIPE_CONTROL_MEDIA_STATE_CLEAR (1<<16) | ||
1475 | #define PIPE_CONTROL_QW_WRITE (1<<14) | ||
1476 | #define PIPE_CONTROL_POST_SYNC_OP_MASK (3<<14) | ||
1477 | #define PIPE_CONTROL_DEPTH_STALL (1<<13) | ||
1478 | @@ -1071,6 +1073,7 @@ enum punit_power_well { | ||
1479 | #define GEN6_VERSYNC (RING_SYNC_1(VEBOX_RING_BASE)) | ||
1480 | #define GEN6_VEVSYNC (RING_SYNC_2(VEBOX_RING_BASE)) | ||
1481 | #define GEN6_NOSYNC 0 | ||
1482 | +#define RING_PSMI_CTL(base) ((base)+0x50) | ||
1483 | #define RING_MAX_IDLE(base) ((base)+0x54) | ||
1484 | #define RING_HWS_PGA(base) ((base)+0x80) | ||
1485 | #define RING_HWS_PGA_GEN6(base) ((base)+0x2080) | ||
1486 | @@ -1401,6 +1404,7 @@ enum punit_power_well { | ||
1487 | #define GEN6_BLITTER_FBC_NOTIFY (1<<3) | ||
1488 | |||
1489 | #define GEN6_RC_SLEEP_PSMI_CONTROL 0x2050 | ||
1490 | +#define GEN6_PSMI_SLEEP_MSG_DISABLE (1 << 0) | ||
1491 | #define GEN8_RC_SEMA_IDLE_MSG_DISABLE (1 << 12) | ||
1492 | #define GEN8_FF_DOP_CLOCK_GATE_DISABLE (1<<10) | ||
1493 | |||
1494 | diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c | ||
1495 | index 043123c77a1f..e22b0e825de2 100644 | ||
1496 | --- a/drivers/gpu/drm/i915/i915_suspend.c | ||
1497 | +++ b/drivers/gpu/drm/i915/i915_suspend.c | ||
1498 | @@ -328,6 +328,10 @@ int i915_save_state(struct drm_device *dev) | ||
1499 | } | ||
1500 | } | ||
1501 | |||
1502 | + if (IS_GEN4(dev)) | ||
1503 | + pci_read_config_word(dev->pdev, GCDGMBUS, | ||
1504 | + &dev_priv->regfile.saveGCDGMBUS); | ||
1505 | + | ||
1506 | /* Cache mode state */ | ||
1507 | if (INTEL_INFO(dev)->gen < 7) | ||
1508 | dev_priv->regfile.saveCACHE_MODE_0 = I915_READ(CACHE_MODE_0); | ||
1509 | @@ -356,6 +360,10 @@ int i915_restore_state(struct drm_device *dev) | ||
1510 | mutex_lock(&dev->struct_mutex); | ||
1511 | |||
1512 | i915_gem_restore_fences(dev); | ||
1513 | + | ||
1514 | + if (IS_GEN4(dev)) | ||
1515 | + pci_write_config_word(dev->pdev, GCDGMBUS, | ||
1516 | + dev_priv->regfile.saveGCDGMBUS); | ||
1517 | i915_restore_display(dev); | ||
1518 | |||
1519 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) { | ||
1520 | diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c | ||
1521 | index 9cb5c95d5898..cadc3bcf1de2 100644 | ||
1522 | --- a/drivers/gpu/drm/i915/intel_display.c | ||
1523 | +++ b/drivers/gpu/drm/i915/intel_display.c | ||
1524 | @@ -12933,11 +12933,7 @@ static void i915_disable_vga(struct drm_device *dev) | ||
1525 | vga_put(dev->pdev, VGA_RSRC_LEGACY_IO); | ||
1526 | udelay(300); | ||
1527 | |||
1528 | - /* | ||
1529 | - * Fujitsu-Siemens Lifebook S6010 (830) has problems resuming | ||
1530 | - * from S3 without preserving (some of?) the other bits. | ||
1531 | - */ | ||
1532 | - I915_WRITE(vga_reg, dev_priv->bios_vgacntr | VGA_DISP_DISABLE); | ||
1533 | + I915_WRITE(vga_reg, VGA_DISP_DISABLE); | ||
1534 | POSTING_READ(vga_reg); | ||
1535 | } | ||
1536 | |||
1537 | @@ -13026,8 +13022,6 @@ void intel_modeset_init(struct drm_device *dev) | ||
1538 | |||
1539 | intel_shared_dpll_init(dev); | ||
1540 | |||
1541 | - /* save the BIOS value before clobbering it */ | ||
1542 | - dev_priv->bios_vgacntr = I915_READ(i915_vgacntrl_reg(dev)); | ||
1543 | /* Just disable it once at startup */ | ||
1544 | i915_disable_vga(dev); | ||
1545 | intel_setup_outputs(dev); | ||
1546 | diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c | ||
1547 | index ad2fd605f76b..83c7ecf2608a 100644 | ||
1548 | --- a/drivers/gpu/drm/i915/intel_pm.c | ||
1549 | +++ b/drivers/gpu/drm/i915/intel_pm.c | ||
1550 | @@ -6520,29 +6520,6 @@ static void chv_pipe_power_well_disable(struct drm_i915_private *dev_priv, | ||
1551 | chv_set_pipe_power_well(dev_priv, power_well, false); | ||
1552 | } | ||
1553 | |||
1554 | -static void check_power_well_state(struct drm_i915_private *dev_priv, | ||
1555 | - struct i915_power_well *power_well) | ||
1556 | -{ | ||
1557 | - bool enabled = power_well->ops->is_enabled(dev_priv, power_well); | ||
1558 | - | ||
1559 | - if (power_well->always_on || !i915.disable_power_well) { | ||
1560 | - if (!enabled) | ||
1561 | - goto mismatch; | ||
1562 | - | ||
1563 | - return; | ||
1564 | - } | ||
1565 | - | ||
1566 | - if (enabled != (power_well->count > 0)) | ||
1567 | - goto mismatch; | ||
1568 | - | ||
1569 | - return; | ||
1570 | - | ||
1571 | -mismatch: | ||
1572 | - WARN(1, "state mismatch for '%s' (always_on %d hw state %d use-count %d disable_power_well %d\n", | ||
1573 | - power_well->name, power_well->always_on, enabled, | ||
1574 | - power_well->count, i915.disable_power_well); | ||
1575 | -} | ||
1576 | - | ||
1577 | void intel_display_power_get(struct drm_i915_private *dev_priv, | ||
1578 | enum intel_display_power_domain domain) | ||
1579 | { | ||
1580 | @@ -6562,8 +6539,6 @@ void intel_display_power_get(struct drm_i915_private *dev_priv, | ||
1581 | power_well->ops->enable(dev_priv, power_well); | ||
1582 | power_well->hw_enabled = true; | ||
1583 | } | ||
1584 | - | ||
1585 | - check_power_well_state(dev_priv, power_well); | ||
1586 | } | ||
1587 | |||
1588 | power_domains->domain_use_count[domain]++; | ||
1589 | @@ -6593,8 +6568,6 @@ void intel_display_power_put(struct drm_i915_private *dev_priv, | ||
1590 | power_well->hw_enabled = false; | ||
1591 | power_well->ops->disable(dev_priv, power_well); | ||
1592 | } | ||
1593 | - | ||
1594 | - check_power_well_state(dev_priv, power_well); | ||
1595 | } | ||
1596 | |||
1597 | mutex_unlock(&power_domains->lock); | ||
1598 | diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c | ||
1599 | index 0a80e419b589..ae17e77dc08d 100644 | ||
1600 | --- a/drivers/gpu/drm/i915/intel_ringbuffer.c | ||
1601 | +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c | ||
1602 | @@ -362,12 +362,15 @@ gen7_render_ring_flush(struct intel_engine_cs *ring, | ||
1603 | flags |= PIPE_CONTROL_VF_CACHE_INVALIDATE; | ||
1604 | flags |= PIPE_CONTROL_CONST_CACHE_INVALIDATE; | ||
1605 | flags |= PIPE_CONTROL_STATE_CACHE_INVALIDATE; | ||
1606 | + flags |= PIPE_CONTROL_MEDIA_STATE_CLEAR; | ||
1607 | /* | ||
1608 | * TLB invalidate requires a post-sync write. | ||
1609 | */ | ||
1610 | flags |= PIPE_CONTROL_QW_WRITE; | ||
1611 | flags |= PIPE_CONTROL_GLOBAL_GTT_IVB; | ||
1612 | |||
1613 | + flags |= PIPE_CONTROL_STALL_AT_SCOREBOARD; | ||
1614 | + | ||
1615 | /* Workaround: we must issue a pipe_control with CS-stall bit | ||
1616 | * set before a pipe_control command that has the state cache | ||
1617 | * invalidate bit set. */ | ||
1618 | diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c | ||
1619 | index 918b76163965..b29091b21a76 100644 | ||
1620 | --- a/drivers/gpu/drm/i915/intel_uncore.c | ||
1621 | +++ b/drivers/gpu/drm/i915/intel_uncore.c | ||
1622 | @@ -43,8 +43,8 @@ | ||
1623 | static void | ||
1624 | assert_device_not_suspended(struct drm_i915_private *dev_priv) | ||
1625 | { | ||
1626 | - WARN(HAS_RUNTIME_PM(dev_priv->dev) && dev_priv->pm.suspended, | ||
1627 | - "Device suspended\n"); | ||
1628 | + WARN_ONCE(HAS_RUNTIME_PM(dev_priv->dev) && dev_priv->pm.suspended, | ||
1629 | + "Device suspended\n"); | ||
1630 | } | ||
1631 | |||
1632 | static void __gen6_gt_wait_for_thread_c0(struct drm_i915_private *dev_priv) | ||
1633 | diff --git a/drivers/gpu/drm/nouveau/core/subdev/mc/nv4c.c b/drivers/gpu/drm/nouveau/core/subdev/mc/nv4c.c | ||
1634 | index a75c35ccf25c..165401c4045c 100644 | ||
1635 | --- a/drivers/gpu/drm/nouveau/core/subdev/mc/nv4c.c | ||
1636 | +++ b/drivers/gpu/drm/nouveau/core/subdev/mc/nv4c.c | ||
1637 | @@ -24,13 +24,6 @@ | ||
1638 | |||
1639 | #include "nv04.h" | ||
1640 | |||
1641 | -static void | ||
1642 | -nv4c_mc_msi_rearm(struct nouveau_mc *pmc) | ||
1643 | -{ | ||
1644 | - struct nv04_mc_priv *priv = (void *)pmc; | ||
1645 | - nv_wr08(priv, 0x088050, 0xff); | ||
1646 | -} | ||
1647 | - | ||
1648 | struct nouveau_oclass * | ||
1649 | nv4c_mc_oclass = &(struct nouveau_mc_oclass) { | ||
1650 | .base.handle = NV_SUBDEV(MC, 0x4c), | ||
1651 | @@ -41,5 +34,4 @@ nv4c_mc_oclass = &(struct nouveau_mc_oclass) { | ||
1652 | .fini = _nouveau_mc_fini, | ||
1653 | }, | ||
1654 | .intr = nv04_mc_intr, | ||
1655 | - .msi_rearm = nv4c_mc_msi_rearm, | ||
1656 | }.base; | ||
1657 | diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c | ||
1658 | index 30d242b25078..dce0d3918fa7 100644 | ||
1659 | --- a/drivers/gpu/drm/radeon/atombios_crtc.c | ||
1660 | +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | ||
1661 | @@ -1851,10 +1851,9 @@ static int radeon_atom_pick_pll(struct drm_crtc *crtc) | ||
1662 | return pll; | ||
1663 | } | ||
1664 | /* otherwise, pick one of the plls */ | ||
1665 | - if ((rdev->family == CHIP_KAVERI) || | ||
1666 | - (rdev->family == CHIP_KABINI) || | ||
1667 | + if ((rdev->family == CHIP_KABINI) || | ||
1668 | (rdev->family == CHIP_MULLINS)) { | ||
1669 | - /* KB/KV/ML has PPLL1 and PPLL2 */ | ||
1670 | + /* KB/ML has PPLL1 and PPLL2 */ | ||
1671 | pll_in_use = radeon_get_pll_use_mask(crtc); | ||
1672 | if (!(pll_in_use & (1 << ATOM_PPLL2))) | ||
1673 | return ATOM_PPLL2; | ||
1674 | @@ -1863,7 +1862,7 @@ static int radeon_atom_pick_pll(struct drm_crtc *crtc) | ||
1675 | DRM_ERROR("unable to allocate a PPLL\n"); | ||
1676 | return ATOM_PPLL_INVALID; | ||
1677 | } else { | ||
1678 | - /* CI has PPLL0, PPLL1, and PPLL2 */ | ||
1679 | + /* CI/KV has PPLL0, PPLL1, and PPLL2 */ | ||
1680 | pll_in_use = radeon_get_pll_use_mask(crtc); | ||
1681 | if (!(pll_in_use & (1 << ATOM_PPLL2))) | ||
1682 | return ATOM_PPLL2; | ||
1683 | @@ -2154,6 +2153,7 @@ static void atombios_crtc_disable(struct drm_crtc *crtc) | ||
1684 | case ATOM_PPLL0: | ||
1685 | /* disable the ppll */ | ||
1686 | if ((rdev->family == CHIP_ARUBA) || | ||
1687 | + (rdev->family == CHIP_KAVERI) || | ||
1688 | (rdev->family == CHIP_BONAIRE) || | ||
1689 | (rdev->family == CHIP_HAWAII)) | ||
1690 | atombios_crtc_program_pll(crtc, radeon_crtc->crtc_id, radeon_crtc->pll_id, | ||
1691 | diff --git a/drivers/gpu/drm/radeon/atombios_dp.c b/drivers/gpu/drm/radeon/atombios_dp.c | ||
1692 | index 11ba9d21b89b..db42a670f995 100644 | ||
1693 | --- a/drivers/gpu/drm/radeon/atombios_dp.c | ||
1694 | +++ b/drivers/gpu/drm/radeon/atombios_dp.c | ||
1695 | @@ -492,6 +492,10 @@ int radeon_dp_mode_valid_helper(struct drm_connector *connector, | ||
1696 | struct radeon_connector_atom_dig *dig_connector; | ||
1697 | int dp_clock; | ||
1698 | |||
1699 | + if ((mode->clock > 340000) && | ||
1700 | + (!radeon_connector_is_dp12_capable(connector))) | ||
1701 | + return MODE_CLOCK_HIGH; | ||
1702 | + | ||
1703 | if (!radeon_connector->con_priv) | ||
1704 | return MODE_CLOCK_HIGH; | ||
1705 | dig_connector = radeon_connector->con_priv; | ||
1706 | diff --git a/drivers/gpu/drm/radeon/ci_dpm.c b/drivers/gpu/drm/radeon/ci_dpm.c | ||
1707 | index 11a55e9dad7f..c5699b593665 100644 | ||
1708 | --- a/drivers/gpu/drm/radeon/ci_dpm.c | ||
1709 | +++ b/drivers/gpu/drm/radeon/ci_dpm.c | ||
1710 | @@ -4729,7 +4729,7 @@ void ci_dpm_disable(struct radeon_device *rdev) | ||
1711 | ci_enable_spread_spectrum(rdev, false); | ||
1712 | ci_enable_auto_throttle_source(rdev, RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL, false); | ||
1713 | ci_stop_dpm(rdev); | ||
1714 | - ci_enable_ds_master_switch(rdev, true); | ||
1715 | + ci_enable_ds_master_switch(rdev, false); | ||
1716 | ci_enable_ulv(rdev, false); | ||
1717 | ci_clear_vc(rdev); | ||
1718 | ci_reset_to_default(rdev); | ||
1719 | diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c | ||
1720 | index 89c01fa6dd8e..9328fb3dcfce 100644 | ||
1721 | --- a/drivers/gpu/drm/radeon/cik.c | ||
1722 | +++ b/drivers/gpu/drm/radeon/cik.c | ||
1723 | @@ -6314,6 +6314,7 @@ static void cik_enable_mgcg(struct radeon_device *rdev, bool enable) | ||
1724 | } | ||
1725 | |||
1726 | orig = data = RREG32(RLC_CGTT_MGCG_OVERRIDE); | ||
1727 | + data |= 0x00000001; | ||
1728 | data &= 0xfffffffd; | ||
1729 | if (orig != data) | ||
1730 | WREG32(RLC_CGTT_MGCG_OVERRIDE, data); | ||
1731 | @@ -6345,7 +6346,7 @@ static void cik_enable_mgcg(struct radeon_device *rdev, bool enable) | ||
1732 | } | ||
1733 | } else { | ||
1734 | orig = data = RREG32(RLC_CGTT_MGCG_OVERRIDE); | ||
1735 | - data |= 0x00000002; | ||
1736 | + data |= 0x00000003; | ||
1737 | if (orig != data) | ||
1738 | WREG32(RLC_CGTT_MGCG_OVERRIDE, data); | ||
1739 | |||
1740 | diff --git a/drivers/gpu/drm/radeon/dce3_1_afmt.c b/drivers/gpu/drm/radeon/dce3_1_afmt.c | ||
1741 | index 2fe8cfc966d9..bafdf92a5732 100644 | ||
1742 | --- a/drivers/gpu/drm/radeon/dce3_1_afmt.c | ||
1743 | +++ b/drivers/gpu/drm/radeon/dce3_1_afmt.c | ||
1744 | @@ -103,7 +103,7 @@ static void dce3_2_afmt_write_sad_regs(struct drm_encoder *encoder) | ||
1745 | } | ||
1746 | |||
1747 | sad_count = drm_edid_to_sad(radeon_connector->edid, &sads); | ||
1748 | - if (sad_count < 0) { | ||
1749 | + if (sad_count <= 0) { | ||
1750 | DRM_ERROR("Couldn't read SADs: %d\n", sad_count); | ||
1751 | return; | ||
1752 | } | ||
1753 | diff --git a/drivers/gpu/drm/radeon/kv_dpm.c b/drivers/gpu/drm/radeon/kv_dpm.c | ||
1754 | index 9b42001295ba..e3e9c10cfba9 100644 | ||
1755 | --- a/drivers/gpu/drm/radeon/kv_dpm.c | ||
1756 | +++ b/drivers/gpu/drm/radeon/kv_dpm.c | ||
1757 | @@ -2745,13 +2745,11 @@ int kv_dpm_init(struct radeon_device *rdev) | ||
1758 | pi->enable_auto_thermal_throttling = true; | ||
1759 | pi->disable_nb_ps3_in_battery = false; | ||
1760 | if (radeon_bapm == -1) { | ||
1761 | - /* There are stability issues reported on with | ||
1762 | - * bapm enabled on an asrock system. | ||
1763 | - */ | ||
1764 | - if (rdev->pdev->subsystem_vendor == 0x1849) | ||
1765 | - pi->bapm_enable = false; | ||
1766 | - else | ||
1767 | + /* only enable bapm on KB, ML by default */ | ||
1768 | + if (rdev->family == CHIP_KABINI || rdev->family == CHIP_MULLINS) | ||
1769 | pi->bapm_enable = true; | ||
1770 | + else | ||
1771 | + pi->bapm_enable = false; | ||
1772 | } else if (radeon_bapm == 0) { | ||
1773 | pi->bapm_enable = false; | ||
1774 | } else { | ||
1775 | diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c | ||
1776 | index 8624979afb65..d2510cfd3fea 100644 | ||
1777 | --- a/drivers/gpu/drm/radeon/radeon_ttm.c | ||
1778 | +++ b/drivers/gpu/drm/radeon/radeon_ttm.c | ||
1779 | @@ -196,7 +196,7 @@ static void radeon_evict_flags(struct ttm_buffer_object *bo, | ||
1780 | rbo = container_of(bo, struct radeon_bo, tbo); | ||
1781 | switch (bo->mem.mem_type) { | ||
1782 | case TTM_PL_VRAM: | ||
1783 | - if (rbo->rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready == false) | ||
1784 | + if (rbo->rdev->ring[radeon_copy_ring_index(rbo->rdev)].ready == false) | ||
1785 | radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_CPU); | ||
1786 | else | ||
1787 | radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_GTT); | ||
1788 | diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c | ||
1789 | index 09874d695188..025c429050c0 100644 | ||
1790 | --- a/drivers/gpu/drm/ttm/ttm_page_alloc.c | ||
1791 | +++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c | ||
1792 | @@ -297,11 +297,12 @@ static void ttm_pool_update_free_locked(struct ttm_page_pool *pool, | ||
1793 | * | ||
1794 | * @pool: to free the pages from | ||
1795 | * @free_all: If set to true will free all pages in pool | ||
1796 | - * @gfp: GFP flags. | ||
1797 | + * @use_static: Safe to use static buffer | ||
1798 | **/ | ||
1799 | static int ttm_page_pool_free(struct ttm_page_pool *pool, unsigned nr_free, | ||
1800 | - gfp_t gfp) | ||
1801 | + bool use_static) | ||
1802 | { | ||
1803 | + static struct page *static_buf[NUM_PAGES_TO_ALLOC]; | ||
1804 | unsigned long irq_flags; | ||
1805 | struct page *p; | ||
1806 | struct page **pages_to_free; | ||
1807 | @@ -311,7 +312,11 @@ static int ttm_page_pool_free(struct ttm_page_pool *pool, unsigned nr_free, | ||
1808 | if (NUM_PAGES_TO_ALLOC < nr_free) | ||
1809 | npages_to_free = NUM_PAGES_TO_ALLOC; | ||
1810 | |||
1811 | - pages_to_free = kmalloc(npages_to_free * sizeof(struct page *), gfp); | ||
1812 | + if (use_static) | ||
1813 | + pages_to_free = static_buf; | ||
1814 | + else | ||
1815 | + pages_to_free = kmalloc(npages_to_free * sizeof(struct page *), | ||
1816 | + GFP_KERNEL); | ||
1817 | if (!pages_to_free) { | ||
1818 | pr_err("Failed to allocate memory for pool free operation\n"); | ||
1819 | return 0; | ||
1820 | @@ -374,7 +379,8 @@ restart: | ||
1821 | if (freed_pages) | ||
1822 | ttm_pages_put(pages_to_free, freed_pages); | ||
1823 | out: | ||
1824 | - kfree(pages_to_free); | ||
1825 | + if (pages_to_free != static_buf) | ||
1826 | + kfree(pages_to_free); | ||
1827 | return nr_free; | ||
1828 | } | ||
1829 | |||
1830 | @@ -383,8 +389,6 @@ out: | ||
1831 | * | ||
1832 | * XXX: (dchinner) Deadlock warning! | ||
1833 | * | ||
1834 | - * We need to pass sc->gfp_mask to ttm_page_pool_free(). | ||
1835 | - * | ||
1836 | * This code is crying out for a shrinker per pool.... | ||
1837 | */ | ||
1838 | static unsigned long | ||
1839 | @@ -407,8 +411,8 @@ ttm_pool_shrink_scan(struct shrinker *shrink, struct shrink_control *sc) | ||
1840 | if (shrink_pages == 0) | ||
1841 | break; | ||
1842 | pool = &_manager->pools[(i + pool_offset)%NUM_POOLS]; | ||
1843 | - shrink_pages = ttm_page_pool_free(pool, nr_free, | ||
1844 | - sc->gfp_mask); | ||
1845 | + /* OK to use static buffer since global mutex is held. */ | ||
1846 | + shrink_pages = ttm_page_pool_free(pool, nr_free, true); | ||
1847 | freed += nr_free - shrink_pages; | ||
1848 | } | ||
1849 | mutex_unlock(&lock); | ||
1850 | @@ -710,7 +714,7 @@ static void ttm_put_pages(struct page **pages, unsigned npages, int flags, | ||
1851 | } | ||
1852 | spin_unlock_irqrestore(&pool->lock, irq_flags); | ||
1853 | if (npages) | ||
1854 | - ttm_page_pool_free(pool, npages, GFP_KERNEL); | ||
1855 | + ttm_page_pool_free(pool, npages, false); | ||
1856 | } | ||
1857 | |||
1858 | /* | ||
1859 | @@ -849,9 +853,9 @@ void ttm_page_alloc_fini(void) | ||
1860 | pr_info("Finalizing pool allocator\n"); | ||
1861 | ttm_pool_mm_shrink_fini(_manager); | ||
1862 | |||
1863 | + /* OK to use static buffer since global mutex is no longer used. */ | ||
1864 | for (i = 0; i < NUM_POOLS; ++i) | ||
1865 | - ttm_page_pool_free(&_manager->pools[i], FREE_ALL_PAGES, | ||
1866 | - GFP_KERNEL); | ||
1867 | + ttm_page_pool_free(&_manager->pools[i], FREE_ALL_PAGES, true); | ||
1868 | |||
1869 | kobject_put(&_manager->kobj); | ||
1870 | _manager = NULL; | ||
1871 | diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c | ||
1872 | index c96db433f8af..01e1d27eb078 100644 | ||
1873 | --- a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c | ||
1874 | +++ b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c | ||
1875 | @@ -411,11 +411,12 @@ static void ttm_dma_page_put(struct dma_pool *pool, struct dma_page *d_page) | ||
1876 | * | ||
1877 | * @pool: to free the pages from | ||
1878 | * @nr_free: If set to true will free all pages in pool | ||
1879 | - * @gfp: GFP flags. | ||
1880 | + * @use_static: Safe to use static buffer | ||
1881 | **/ | ||
1882 | static unsigned ttm_dma_page_pool_free(struct dma_pool *pool, unsigned nr_free, | ||
1883 | - gfp_t gfp) | ||
1884 | + bool use_static) | ||
1885 | { | ||
1886 | + static struct page *static_buf[NUM_PAGES_TO_ALLOC]; | ||
1887 | unsigned long irq_flags; | ||
1888 | struct dma_page *dma_p, *tmp; | ||
1889 | struct page **pages_to_free; | ||
1890 | @@ -432,7 +433,11 @@ static unsigned ttm_dma_page_pool_free(struct dma_pool *pool, unsigned nr_free, | ||
1891 | npages_to_free, nr_free); | ||
1892 | } | ||
1893 | #endif | ||
1894 | - pages_to_free = kmalloc(npages_to_free * sizeof(struct page *), gfp); | ||
1895 | + if (use_static) | ||
1896 | + pages_to_free = static_buf; | ||
1897 | + else | ||
1898 | + pages_to_free = kmalloc(npages_to_free * sizeof(struct page *), | ||
1899 | + GFP_KERNEL); | ||
1900 | |||
1901 | if (!pages_to_free) { | ||
1902 | pr_err("%s: Failed to allocate memory for pool free operation\n", | ||
1903 | @@ -502,7 +507,8 @@ restart: | ||
1904 | if (freed_pages) | ||
1905 | ttm_dma_pages_put(pool, &d_pages, pages_to_free, freed_pages); | ||
1906 | out: | ||
1907 | - kfree(pages_to_free); | ||
1908 | + if (pages_to_free != static_buf) | ||
1909 | + kfree(pages_to_free); | ||
1910 | return nr_free; | ||
1911 | } | ||
1912 | |||
1913 | @@ -531,7 +537,8 @@ static void ttm_dma_free_pool(struct device *dev, enum pool_type type) | ||
1914 | if (pool->type != type) | ||
1915 | continue; | ||
1916 | /* Takes a spinlock.. */ | ||
1917 | - ttm_dma_page_pool_free(pool, FREE_ALL_PAGES, GFP_KERNEL); | ||
1918 | + /* OK to use static buffer since global mutex is held. */ | ||
1919 | + ttm_dma_page_pool_free(pool, FREE_ALL_PAGES, true); | ||
1920 | WARN_ON(((pool->npages_in_use + pool->npages_free) != 0)); | ||
1921 | /* This code path is called after _all_ references to the | ||
1922 | * struct device has been dropped - so nobody should be | ||
1923 | @@ -986,7 +993,7 @@ void ttm_dma_unpopulate(struct ttm_dma_tt *ttm_dma, struct device *dev) | ||
1924 | |||
1925 | /* shrink pool if necessary (only on !is_cached pools)*/ | ||
1926 | if (npages) | ||
1927 | - ttm_dma_page_pool_free(pool, npages, GFP_KERNEL); | ||
1928 | + ttm_dma_page_pool_free(pool, npages, false); | ||
1929 | ttm->state = tt_unpopulated; | ||
1930 | } | ||
1931 | EXPORT_SYMBOL_GPL(ttm_dma_unpopulate); | ||
1932 | @@ -996,8 +1003,6 @@ EXPORT_SYMBOL_GPL(ttm_dma_unpopulate); | ||
1933 | * | ||
1934 | * XXX: (dchinner) Deadlock warning! | ||
1935 | * | ||
1936 | - * We need to pass sc->gfp_mask to ttm_dma_page_pool_free(). | ||
1937 | - * | ||
1938 | * I'm getting sadder as I hear more pathetical whimpers about needing per-pool | ||
1939 | * shrinkers | ||
1940 | */ | ||
1941 | @@ -1030,8 +1035,8 @@ ttm_dma_pool_shrink_scan(struct shrinker *shrink, struct shrink_control *sc) | ||
1942 | if (++idx < pool_offset) | ||
1943 | continue; | ||
1944 | nr_free = shrink_pages; | ||
1945 | - shrink_pages = ttm_dma_page_pool_free(p->pool, nr_free, | ||
1946 | - sc->gfp_mask); | ||
1947 | + /* OK to use static buffer since global mutex is held. */ | ||
1948 | + shrink_pages = ttm_dma_page_pool_free(p->pool, nr_free, true); | ||
1949 | freed += nr_free - shrink_pages; | ||
1950 | |||
1951 | pr_debug("%s: (%s:%d) Asked to shrink %d, have %d more to go\n", | ||
1952 | diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | ||
1953 | index 25f3c250fd98..daeca571b42f 100644 | ||
1954 | --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | ||
1955 | +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | ||
1956 | @@ -1063,8 +1063,12 @@ static long vmw_generic_ioctl(struct file *filp, unsigned int cmd, | ||
1957 | |||
1958 | vmaster = vmw_master_check(dev, file_priv, flags); | ||
1959 | if (unlikely(IS_ERR(vmaster))) { | ||
1960 | - DRM_INFO("IOCTL ERROR %d\n", nr); | ||
1961 | - return PTR_ERR(vmaster); | ||
1962 | + ret = PTR_ERR(vmaster); | ||
1963 | + | ||
1964 | + if (ret != -ERESTARTSYS) | ||
1965 | + DRM_INFO("IOCTL ERROR Command %d, Error %ld.\n", | ||
1966 | + nr, ret); | ||
1967 | + return ret; | ||
1968 | } | ||
1969 | |||
1970 | ret = ioctl_func(filp, cmd, arg); | ||
1971 | diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_fence.c b/drivers/gpu/drm/vmwgfx/vmwgfx_fence.c | ||
1972 | index 197164fd7803..b7594cb758af 100644 | ||
1973 | --- a/drivers/gpu/drm/vmwgfx/vmwgfx_fence.c | ||
1974 | +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fence.c | ||
1975 | @@ -545,35 +545,19 @@ void vmw_fence_obj_flush(struct vmw_fence_obj *fence) | ||
1976 | |||
1977 | static void vmw_fence_destroy(struct vmw_fence_obj *fence) | ||
1978 | { | ||
1979 | - struct vmw_fence_manager *fman = fman_from_fence(fence); | ||
1980 | - | ||
1981 | fence_free(&fence->base); | ||
1982 | - | ||
1983 | - /* | ||
1984 | - * Free kernel space accounting. | ||
1985 | - */ | ||
1986 | - ttm_mem_global_free(vmw_mem_glob(fman->dev_priv), | ||
1987 | - fman->fence_size); | ||
1988 | } | ||
1989 | |||
1990 | int vmw_fence_create(struct vmw_fence_manager *fman, | ||
1991 | uint32_t seqno, | ||
1992 | struct vmw_fence_obj **p_fence) | ||
1993 | { | ||
1994 | - struct ttm_mem_global *mem_glob = vmw_mem_glob(fman->dev_priv); | ||
1995 | struct vmw_fence_obj *fence; | ||
1996 | int ret; | ||
1997 | |||
1998 | - ret = ttm_mem_global_alloc(mem_glob, fman->fence_size, | ||
1999 | - false, false); | ||
2000 | - if (unlikely(ret != 0)) | ||
2001 | - return ret; | ||
2002 | - | ||
2003 | fence = kzalloc(sizeof(*fence), GFP_KERNEL); | ||
2004 | - if (unlikely(fence == NULL)) { | ||
2005 | - ret = -ENOMEM; | ||
2006 | - goto out_no_object; | ||
2007 | - } | ||
2008 | + if (unlikely(fence == NULL)) | ||
2009 | + return -ENOMEM; | ||
2010 | |||
2011 | ret = vmw_fence_obj_init(fman, fence, seqno, | ||
2012 | vmw_fence_destroy); | ||
2013 | @@ -585,8 +569,6 @@ int vmw_fence_create(struct vmw_fence_manager *fman, | ||
2014 | |||
2015 | out_err_init: | ||
2016 | kfree(fence); | ||
2017 | -out_no_object: | ||
2018 | - ttm_mem_global_free(mem_glob, fman->fence_size); | ||
2019 | return ret; | ||
2020 | } | ||
2021 | |||
2022 | @@ -1105,6 +1087,8 @@ static int vmw_event_fence_action_create(struct drm_file *file_priv, | ||
2023 | if (ret != 0) | ||
2024 | goto out_no_queue; | ||
2025 | |||
2026 | + return 0; | ||
2027 | + | ||
2028 | out_no_queue: | ||
2029 | event->base.destroy(&event->base); | ||
2030 | out_no_event: | ||
2031 | @@ -1180,17 +1164,10 @@ int vmw_fence_event_ioctl(struct drm_device *dev, void *data, | ||
2032 | |||
2033 | BUG_ON(fence == NULL); | ||
2034 | |||
2035 | - if (arg->flags & DRM_VMW_FE_FLAG_REQ_TIME) | ||
2036 | - ret = vmw_event_fence_action_create(file_priv, fence, | ||
2037 | - arg->flags, | ||
2038 | - arg->user_data, | ||
2039 | - true); | ||
2040 | - else | ||
2041 | - ret = vmw_event_fence_action_create(file_priv, fence, | ||
2042 | - arg->flags, | ||
2043 | - arg->user_data, | ||
2044 | - true); | ||
2045 | - | ||
2046 | + ret = vmw_event_fence_action_create(file_priv, fence, | ||
2047 | + arg->flags, | ||
2048 | + arg->user_data, | ||
2049 | + true); | ||
2050 | if (unlikely(ret != 0)) { | ||
2051 | if (ret != -ERESTARTSYS) | ||
2052 | DRM_ERROR("Failed to attach event to fence.\n"); | ||
2053 | diff --git a/drivers/iio/adc/ad799x.c b/drivers/iio/adc/ad799x.c | ||
2054 | index e37412da15f5..b99de00e57b8 100644 | ||
2055 | --- a/drivers/iio/adc/ad799x.c | ||
2056 | +++ b/drivers/iio/adc/ad799x.c | ||
2057 | @@ -143,9 +143,15 @@ static int ad799x_write_config(struct ad799x_state *st, u16 val) | ||
2058 | case ad7998: | ||
2059 | return i2c_smbus_write_word_swapped(st->client, AD7998_CONF_REG, | ||
2060 | val); | ||
2061 | - default: | ||
2062 | + case ad7992: | ||
2063 | + case ad7993: | ||
2064 | + case ad7994: | ||
2065 | return i2c_smbus_write_byte_data(st->client, AD7998_CONF_REG, | ||
2066 | val); | ||
2067 | + default: | ||
2068 | + /* Will be written when doing a conversion */ | ||
2069 | + st->config = val; | ||
2070 | + return 0; | ||
2071 | } | ||
2072 | } | ||
2073 | |||
2074 | @@ -155,8 +161,13 @@ static int ad799x_read_config(struct ad799x_state *st) | ||
2075 | case ad7997: | ||
2076 | case ad7998: | ||
2077 | return i2c_smbus_read_word_swapped(st->client, AD7998_CONF_REG); | ||
2078 | - default: | ||
2079 | + case ad7992: | ||
2080 | + case ad7993: | ||
2081 | + case ad7994: | ||
2082 | return i2c_smbus_read_byte_data(st->client, AD7998_CONF_REG); | ||
2083 | + default: | ||
2084 | + /* No readback support */ | ||
2085 | + return st->config; | ||
2086 | } | ||
2087 | } | ||
2088 | |||
2089 | diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.h b/drivers/infiniband/ulp/iser/iscsi_iser.h | ||
2090 | index cd4174ca9a76..f14c3849e568 100644 | ||
2091 | --- a/drivers/infiniband/ulp/iser/iscsi_iser.h | ||
2092 | +++ b/drivers/infiniband/ulp/iser/iscsi_iser.h | ||
2093 | @@ -432,6 +432,7 @@ struct fast_reg_descriptor { | ||
2094 | * @cma_id: rdma_cm connection maneger handle | ||
2095 | * @qp: Connection Queue-pair | ||
2096 | * @post_recv_buf_count: post receive counter | ||
2097 | + * @sig_count: send work request signal count | ||
2098 | * @rx_wr: receive work request for batch posts | ||
2099 | * @device: reference to iser device | ||
2100 | * @comp: iser completion context | ||
2101 | @@ -452,6 +453,7 @@ struct ib_conn { | ||
2102 | struct rdma_cm_id *cma_id; | ||
2103 | struct ib_qp *qp; | ||
2104 | int post_recv_buf_count; | ||
2105 | + u8 sig_count; | ||
2106 | struct ib_recv_wr rx_wr[ISER_MIN_POSTED_RX]; | ||
2107 | struct iser_device *device; | ||
2108 | struct iser_comp *comp; | ||
2109 | diff --git a/drivers/infiniband/ulp/iser/iser_initiator.c b/drivers/infiniband/ulp/iser/iser_initiator.c | ||
2110 | index 5a489ea63732..3821633f1065 100644 | ||
2111 | --- a/drivers/infiniband/ulp/iser/iser_initiator.c | ||
2112 | +++ b/drivers/infiniband/ulp/iser/iser_initiator.c | ||
2113 | @@ -369,7 +369,7 @@ static int iser_post_rx_bufs(struct iscsi_conn *conn, struct iscsi_hdr *req) | ||
2114 | return 0; | ||
2115 | } | ||
2116 | |||
2117 | -static inline bool iser_signal_comp(int sig_count) | ||
2118 | +static inline bool iser_signal_comp(u8 sig_count) | ||
2119 | { | ||
2120 | return ((sig_count % ISER_SIGNAL_CMD_COUNT) == 0); | ||
2121 | } | ||
2122 | @@ -388,7 +388,7 @@ int iser_send_command(struct iscsi_conn *conn, | ||
2123 | struct iscsi_scsi_req *hdr = (struct iscsi_scsi_req *)task->hdr; | ||
2124 | struct scsi_cmnd *sc = task->sc; | ||
2125 | struct iser_tx_desc *tx_desc = &iser_task->desc; | ||
2126 | - static unsigned sig_count; | ||
2127 | + u8 sig_count = ++iser_conn->ib_conn.sig_count; | ||
2128 | |||
2129 | edtl = ntohl(hdr->data_length); | ||
2130 | |||
2131 | @@ -435,7 +435,7 @@ int iser_send_command(struct iscsi_conn *conn, | ||
2132 | iser_task->status = ISER_TASK_STATUS_STARTED; | ||
2133 | |||
2134 | err = iser_post_send(&iser_conn->ib_conn, tx_desc, | ||
2135 | - iser_signal_comp(++sig_count)); | ||
2136 | + iser_signal_comp(sig_count)); | ||
2137 | if (!err) | ||
2138 | return 0; | ||
2139 | |||
2140 | diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c | ||
2141 | index 10641b7816f4..a6daabc70425 100644 | ||
2142 | --- a/drivers/infiniband/ulp/isert/ib_isert.c | ||
2143 | +++ b/drivers/infiniband/ulp/isert/ib_isert.c | ||
2144 | @@ -41,6 +41,7 @@ static DEFINE_MUTEX(device_list_mutex); | ||
2145 | static LIST_HEAD(device_list); | ||
2146 | static struct workqueue_struct *isert_rx_wq; | ||
2147 | static struct workqueue_struct *isert_comp_wq; | ||
2148 | +static struct workqueue_struct *isert_release_wq; | ||
2149 | |||
2150 | static void | ||
2151 | isert_unmap_cmd(struct isert_cmd *isert_cmd, struct isert_conn *isert_conn); | ||
2152 | @@ -54,6 +55,19 @@ isert_reg_rdma(struct iscsi_conn *conn, struct iscsi_cmd *cmd, | ||
2153 | struct isert_rdma_wr *wr); | ||
2154 | static int | ||
2155 | isert_put_response(struct iscsi_conn *conn, struct iscsi_cmd *cmd); | ||
2156 | +static int | ||
2157 | +isert_rdma_post_recvl(struct isert_conn *isert_conn); | ||
2158 | +static int | ||
2159 | +isert_rdma_accept(struct isert_conn *isert_conn); | ||
2160 | +struct rdma_cm_id *isert_setup_id(struct isert_np *isert_np); | ||
2161 | + | ||
2162 | +static inline bool | ||
2163 | +isert_prot_cmd(struct isert_conn *conn, struct se_cmd *cmd) | ||
2164 | +{ | ||
2165 | + return (conn->pi_support && | ||
2166 | + cmd->prot_op != TARGET_PROT_NORMAL); | ||
2167 | +} | ||
2168 | + | ||
2169 | |||
2170 | static void | ||
2171 | isert_qp_event_callback(struct ib_event *e, void *context) | ||
2172 | @@ -90,8 +104,7 @@ isert_query_device(struct ib_device *ib_dev, struct ib_device_attr *devattr) | ||
2173 | } | ||
2174 | |||
2175 | static int | ||
2176 | -isert_conn_setup_qp(struct isert_conn *isert_conn, struct rdma_cm_id *cma_id, | ||
2177 | - u8 protection) | ||
2178 | +isert_conn_setup_qp(struct isert_conn *isert_conn, struct rdma_cm_id *cma_id) | ||
2179 | { | ||
2180 | struct isert_device *device = isert_conn->conn_device; | ||
2181 | struct ib_qp_init_attr attr; | ||
2182 | @@ -126,7 +139,7 @@ isert_conn_setup_qp(struct isert_conn *isert_conn, struct rdma_cm_id *cma_id, | ||
2183 | attr.cap.max_recv_sge = 1; | ||
2184 | attr.sq_sig_type = IB_SIGNAL_REQ_WR; | ||
2185 | attr.qp_type = IB_QPT_RC; | ||
2186 | - if (protection) | ||
2187 | + if (device->pi_capable) | ||
2188 | attr.create_flags |= IB_QP_CREATE_SIGNATURE_EN; | ||
2189 | |||
2190 | pr_debug("isert_conn_setup_qp cma_id->device: %p\n", | ||
2191 | @@ -137,12 +150,18 @@ isert_conn_setup_qp(struct isert_conn *isert_conn, struct rdma_cm_id *cma_id, | ||
2192 | ret = rdma_create_qp(cma_id, isert_conn->conn_pd, &attr); | ||
2193 | if (ret) { | ||
2194 | pr_err("rdma_create_qp failed for cma_id %d\n", ret); | ||
2195 | - return ret; | ||
2196 | + goto err; | ||
2197 | } | ||
2198 | isert_conn->conn_qp = cma_id->qp; | ||
2199 | pr_debug("rdma_create_qp() returned success >>>>>>>>>>>>>>>>>>>>>>>>>.\n"); | ||
2200 | |||
2201 | return 0; | ||
2202 | +err: | ||
2203 | + mutex_lock(&device_list_mutex); | ||
2204 | + device->cq_active_qps[min_index]--; | ||
2205 | + mutex_unlock(&device_list_mutex); | ||
2206 | + | ||
2207 | + return ret; | ||
2208 | } | ||
2209 | |||
2210 | static void | ||
2211 | @@ -430,8 +449,68 @@ isert_conn_free_fastreg_pool(struct isert_conn *isert_conn) | ||
2212 | } | ||
2213 | |||
2214 | static int | ||
2215 | +isert_create_pi_ctx(struct fast_reg_descriptor *desc, | ||
2216 | + struct ib_device *device, | ||
2217 | + struct ib_pd *pd) | ||
2218 | +{ | ||
2219 | + struct ib_mr_init_attr mr_init_attr; | ||
2220 | + struct pi_context *pi_ctx; | ||
2221 | + int ret; | ||
2222 | + | ||
2223 | + pi_ctx = kzalloc(sizeof(*desc->pi_ctx), GFP_KERNEL); | ||
2224 | + if (!pi_ctx) { | ||
2225 | + pr_err("Failed to allocate pi context\n"); | ||
2226 | + return -ENOMEM; | ||
2227 | + } | ||
2228 | + | ||
2229 | + pi_ctx->prot_frpl = ib_alloc_fast_reg_page_list(device, | ||
2230 | + ISCSI_ISER_SG_TABLESIZE); | ||
2231 | + if (IS_ERR(pi_ctx->prot_frpl)) { | ||
2232 | + pr_err("Failed to allocate prot frpl err=%ld\n", | ||
2233 | + PTR_ERR(pi_ctx->prot_frpl)); | ||
2234 | + ret = PTR_ERR(pi_ctx->prot_frpl); | ||
2235 | + goto err_pi_ctx; | ||
2236 | + } | ||
2237 | + | ||
2238 | + pi_ctx->prot_mr = ib_alloc_fast_reg_mr(pd, ISCSI_ISER_SG_TABLESIZE); | ||
2239 | + if (IS_ERR(pi_ctx->prot_mr)) { | ||
2240 | + pr_err("Failed to allocate prot frmr err=%ld\n", | ||
2241 | + PTR_ERR(pi_ctx->prot_mr)); | ||
2242 | + ret = PTR_ERR(pi_ctx->prot_mr); | ||
2243 | + goto err_prot_frpl; | ||
2244 | + } | ||
2245 | + desc->ind |= ISERT_PROT_KEY_VALID; | ||
2246 | + | ||
2247 | + memset(&mr_init_attr, 0, sizeof(mr_init_attr)); | ||
2248 | + mr_init_attr.max_reg_descriptors = 2; | ||
2249 | + mr_init_attr.flags |= IB_MR_SIGNATURE_EN; | ||
2250 | + pi_ctx->sig_mr = ib_create_mr(pd, &mr_init_attr); | ||
2251 | + if (IS_ERR(pi_ctx->sig_mr)) { | ||
2252 | + pr_err("Failed to allocate signature enabled mr err=%ld\n", | ||
2253 | + PTR_ERR(pi_ctx->sig_mr)); | ||
2254 | + ret = PTR_ERR(pi_ctx->sig_mr); | ||
2255 | + goto err_prot_mr; | ||
2256 | + } | ||
2257 | + | ||
2258 | + desc->pi_ctx = pi_ctx; | ||
2259 | + desc->ind |= ISERT_SIG_KEY_VALID; | ||
2260 | + desc->ind &= ~ISERT_PROTECTED; | ||
2261 | + | ||
2262 | + return 0; | ||
2263 | + | ||
2264 | +err_prot_mr: | ||
2265 | + ib_dereg_mr(desc->pi_ctx->prot_mr); | ||
2266 | +err_prot_frpl: | ||
2267 | + ib_free_fast_reg_page_list(desc->pi_ctx->prot_frpl); | ||
2268 | +err_pi_ctx: | ||
2269 | + kfree(desc->pi_ctx); | ||
2270 | + | ||
2271 | + return ret; | ||
2272 | +} | ||
2273 | + | ||
2274 | +static int | ||
2275 | isert_create_fr_desc(struct ib_device *ib_device, struct ib_pd *pd, | ||
2276 | - struct fast_reg_descriptor *fr_desc, u8 protection) | ||
2277 | + struct fast_reg_descriptor *fr_desc) | ||
2278 | { | ||
2279 | int ret; | ||
2280 | |||
2281 | @@ -450,62 +529,12 @@ isert_create_fr_desc(struct ib_device *ib_device, struct ib_pd *pd, | ||
2282 | ret = PTR_ERR(fr_desc->data_mr); | ||
2283 | goto err_data_frpl; | ||
2284 | } | ||
2285 | - pr_debug("Create fr_desc %p page_list %p\n", | ||
2286 | - fr_desc, fr_desc->data_frpl->page_list); | ||
2287 | fr_desc->ind |= ISERT_DATA_KEY_VALID; | ||
2288 | |||
2289 | - if (protection) { | ||
2290 | - struct ib_mr_init_attr mr_init_attr = {0}; | ||
2291 | - struct pi_context *pi_ctx; | ||
2292 | - | ||
2293 | - fr_desc->pi_ctx = kzalloc(sizeof(*fr_desc->pi_ctx), GFP_KERNEL); | ||
2294 | - if (!fr_desc->pi_ctx) { | ||
2295 | - pr_err("Failed to allocate pi context\n"); | ||
2296 | - ret = -ENOMEM; | ||
2297 | - goto err_data_mr; | ||
2298 | - } | ||
2299 | - pi_ctx = fr_desc->pi_ctx; | ||
2300 | - | ||
2301 | - pi_ctx->prot_frpl = ib_alloc_fast_reg_page_list(ib_device, | ||
2302 | - ISCSI_ISER_SG_TABLESIZE); | ||
2303 | - if (IS_ERR(pi_ctx->prot_frpl)) { | ||
2304 | - pr_err("Failed to allocate prot frpl err=%ld\n", | ||
2305 | - PTR_ERR(pi_ctx->prot_frpl)); | ||
2306 | - ret = PTR_ERR(pi_ctx->prot_frpl); | ||
2307 | - goto err_pi_ctx; | ||
2308 | - } | ||
2309 | - | ||
2310 | - pi_ctx->prot_mr = ib_alloc_fast_reg_mr(pd, ISCSI_ISER_SG_TABLESIZE); | ||
2311 | - if (IS_ERR(pi_ctx->prot_mr)) { | ||
2312 | - pr_err("Failed to allocate prot frmr err=%ld\n", | ||
2313 | - PTR_ERR(pi_ctx->prot_mr)); | ||
2314 | - ret = PTR_ERR(pi_ctx->prot_mr); | ||
2315 | - goto err_prot_frpl; | ||
2316 | - } | ||
2317 | - fr_desc->ind |= ISERT_PROT_KEY_VALID; | ||
2318 | - | ||
2319 | - mr_init_attr.max_reg_descriptors = 2; | ||
2320 | - mr_init_attr.flags |= IB_MR_SIGNATURE_EN; | ||
2321 | - pi_ctx->sig_mr = ib_create_mr(pd, &mr_init_attr); | ||
2322 | - if (IS_ERR(pi_ctx->sig_mr)) { | ||
2323 | - pr_err("Failed to allocate signature enabled mr err=%ld\n", | ||
2324 | - PTR_ERR(pi_ctx->sig_mr)); | ||
2325 | - ret = PTR_ERR(pi_ctx->sig_mr); | ||
2326 | - goto err_prot_mr; | ||
2327 | - } | ||
2328 | - fr_desc->ind |= ISERT_SIG_KEY_VALID; | ||
2329 | - } | ||
2330 | - fr_desc->ind &= ~ISERT_PROTECTED; | ||
2331 | + pr_debug("Created fr_desc %p\n", fr_desc); | ||
2332 | |||
2333 | return 0; | ||
2334 | -err_prot_mr: | ||
2335 | - ib_dereg_mr(fr_desc->pi_ctx->prot_mr); | ||
2336 | -err_prot_frpl: | ||
2337 | - ib_free_fast_reg_page_list(fr_desc->pi_ctx->prot_frpl); | ||
2338 | -err_pi_ctx: | ||
2339 | - kfree(fr_desc->pi_ctx); | ||
2340 | -err_data_mr: | ||
2341 | - ib_dereg_mr(fr_desc->data_mr); | ||
2342 | + | ||
2343 | err_data_frpl: | ||
2344 | ib_free_fast_reg_page_list(fr_desc->data_frpl); | ||
2345 | |||
2346 | @@ -513,7 +542,7 @@ err_data_frpl: | ||
2347 | } | ||
2348 | |||
2349 | static int | ||
2350 | -isert_conn_create_fastreg_pool(struct isert_conn *isert_conn, u8 pi_support) | ||
2351 | +isert_conn_create_fastreg_pool(struct isert_conn *isert_conn) | ||
2352 | { | ||
2353 | struct fast_reg_descriptor *fr_desc; | ||
2354 | struct isert_device *device = isert_conn->conn_device; | ||
2355 | @@ -537,8 +566,7 @@ isert_conn_create_fastreg_pool(struct isert_conn *isert_conn, u8 pi_support) | ||
2356 | } | ||
2357 | |||
2358 | ret = isert_create_fr_desc(device->ib_device, | ||
2359 | - isert_conn->conn_pd, fr_desc, | ||
2360 | - pi_support); | ||
2361 | + isert_conn->conn_pd, fr_desc); | ||
2362 | if (ret) { | ||
2363 | pr_err("Failed to create fastreg descriptor err=%d\n", | ||
2364 | ret); | ||
2365 | @@ -563,13 +591,12 @@ err: | ||
2366 | static int | ||
2367 | isert_connect_request(struct rdma_cm_id *cma_id, struct rdma_cm_event *event) | ||
2368 | { | ||
2369 | - struct iscsi_np *np = cma_id->context; | ||
2370 | - struct isert_np *isert_np = np->np_context; | ||
2371 | + struct isert_np *isert_np = cma_id->context; | ||
2372 | + struct iscsi_np *np = isert_np->np; | ||
2373 | struct isert_conn *isert_conn; | ||
2374 | struct isert_device *device; | ||
2375 | struct ib_device *ib_dev = cma_id->device; | ||
2376 | int ret = 0; | ||
2377 | - u8 pi_support; | ||
2378 | |||
2379 | spin_lock_bh(&np->np_thread_lock); | ||
2380 | if (!np->enabled) { | ||
2381 | @@ -590,6 +617,7 @@ isert_connect_request(struct rdma_cm_id *cma_id, struct rdma_cm_event *event) | ||
2382 | isert_conn->state = ISER_CONN_INIT; | ||
2383 | INIT_LIST_HEAD(&isert_conn->conn_accept_node); | ||
2384 | init_completion(&isert_conn->conn_login_comp); | ||
2385 | + init_completion(&isert_conn->login_req_comp); | ||
2386 | init_completion(&isert_conn->conn_wait); | ||
2387 | init_completion(&isert_conn->conn_wait_comp_err); | ||
2388 | kref_init(&isert_conn->conn_kref); | ||
2389 | @@ -597,7 +625,6 @@ isert_connect_request(struct rdma_cm_id *cma_id, struct rdma_cm_event *event) | ||
2390 | spin_lock_init(&isert_conn->conn_lock); | ||
2391 | INIT_LIST_HEAD(&isert_conn->conn_fr_pool); | ||
2392 | |||
2393 | - cma_id->context = isert_conn; | ||
2394 | isert_conn->conn_cm_id = cma_id; | ||
2395 | |||
2396 | isert_conn->login_buf = kzalloc(ISCSI_DEF_MAX_RECV_SEG_LEN + | ||
2397 | @@ -669,15 +696,15 @@ isert_connect_request(struct rdma_cm_id *cma_id, struct rdma_cm_event *event) | ||
2398 | goto out_mr; | ||
2399 | } | ||
2400 | |||
2401 | - pi_support = np->tpg_np->tpg->tpg_attrib.t10_pi; | ||
2402 | - if (pi_support && !device->pi_capable) { | ||
2403 | - pr_err("Protection information requested but not supported, " | ||
2404 | - "rejecting connect request\n"); | ||
2405 | - ret = rdma_reject(cma_id, NULL, 0); | ||
2406 | - goto out_mr; | ||
2407 | - } | ||
2408 | + ret = isert_conn_setup_qp(isert_conn, cma_id); | ||
2409 | + if (ret) | ||
2410 | + goto out_conn_dev; | ||
2411 | |||
2412 | - ret = isert_conn_setup_qp(isert_conn, cma_id, pi_support); | ||
2413 | + ret = isert_rdma_post_recvl(isert_conn); | ||
2414 | + if (ret) | ||
2415 | + goto out_conn_dev; | ||
2416 | + | ||
2417 | + ret = isert_rdma_accept(isert_conn); | ||
2418 | if (ret) | ||
2419 | goto out_conn_dev; | ||
2420 | |||
2421 | @@ -705,6 +732,7 @@ out_login_buf: | ||
2422 | kfree(isert_conn->login_buf); | ||
2423 | out: | ||
2424 | kfree(isert_conn); | ||
2425 | + rdma_reject(cma_id, NULL, 0); | ||
2426 | return ret; | ||
2427 | } | ||
2428 | |||
2429 | @@ -720,18 +748,20 @@ isert_connect_release(struct isert_conn *isert_conn) | ||
2430 | if (device && device->use_fastreg) | ||
2431 | isert_conn_free_fastreg_pool(isert_conn); | ||
2432 | |||
2433 | + isert_free_rx_descriptors(isert_conn); | ||
2434 | + rdma_destroy_id(isert_conn->conn_cm_id); | ||
2435 | + | ||
2436 | if (isert_conn->conn_qp) { | ||
2437 | cq_index = ((struct isert_cq_desc *) | ||
2438 | isert_conn->conn_qp->recv_cq->cq_context)->cq_index; | ||
2439 | pr_debug("isert_connect_release: cq_index: %d\n", cq_index); | ||
2440 | + mutex_lock(&device_list_mutex); | ||
2441 | isert_conn->conn_device->cq_active_qps[cq_index]--; | ||
2442 | + mutex_unlock(&device_list_mutex); | ||
2443 | |||
2444 | - rdma_destroy_qp(isert_conn->conn_cm_id); | ||
2445 | + ib_destroy_qp(isert_conn->conn_qp); | ||
2446 | } | ||
2447 | |||
2448 | - isert_free_rx_descriptors(isert_conn); | ||
2449 | - rdma_destroy_id(isert_conn->conn_cm_id); | ||
2450 | - | ||
2451 | ib_dereg_mr(isert_conn->conn_mr); | ||
2452 | ib_dealloc_pd(isert_conn->conn_pd); | ||
2453 | |||
2454 | @@ -754,9 +784,19 @@ isert_connect_release(struct isert_conn *isert_conn) | ||
2455 | static void | ||
2456 | isert_connected_handler(struct rdma_cm_id *cma_id) | ||
2457 | { | ||
2458 | - struct isert_conn *isert_conn = cma_id->context; | ||
2459 | + struct isert_conn *isert_conn = cma_id->qp->qp_context; | ||
2460 | + | ||
2461 | + pr_info("conn %p\n", isert_conn); | ||
2462 | |||
2463 | - kref_get(&isert_conn->conn_kref); | ||
2464 | + if (!kref_get_unless_zero(&isert_conn->conn_kref)) { | ||
2465 | + pr_warn("conn %p connect_release is running\n", isert_conn); | ||
2466 | + return; | ||
2467 | + } | ||
2468 | + | ||
2469 | + mutex_lock(&isert_conn->conn_mutex); | ||
2470 | + if (isert_conn->state != ISER_CONN_FULL_FEATURE) | ||
2471 | + isert_conn->state = ISER_CONN_UP; | ||
2472 | + mutex_unlock(&isert_conn->conn_mutex); | ||
2473 | } | ||
2474 | |||
2475 | static void | ||
2476 | @@ -777,65 +817,108 @@ isert_put_conn(struct isert_conn *isert_conn) | ||
2477 | kref_put(&isert_conn->conn_kref, isert_release_conn_kref); | ||
2478 | } | ||
2479 | |||
2480 | +/** | ||
2481 | + * isert_conn_terminate() - Initiate connection termination | ||
2482 | + * @isert_conn: isert connection struct | ||
2483 | + * | ||
2484 | + * Notes: | ||
2485 | + * In case the connection state is FULL_FEATURE, move state | ||
2486 | + * to TEMINATING and start teardown sequence (rdma_disconnect). | ||
2487 | + * In case the connection state is UP, complete flush as well. | ||
2488 | + * | ||
2489 | + * This routine must be called with conn_mutex held. Thus it is | ||
2490 | + * safe to call multiple times. | ||
2491 | + */ | ||
2492 | static void | ||
2493 | -isert_disconnect_work(struct work_struct *work) | ||
2494 | +isert_conn_terminate(struct isert_conn *isert_conn) | ||
2495 | { | ||
2496 | - struct isert_conn *isert_conn = container_of(work, | ||
2497 | - struct isert_conn, conn_logout_work); | ||
2498 | + int err; | ||
2499 | |||
2500 | - pr_debug("isert_disconnect_work(): >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n"); | ||
2501 | - mutex_lock(&isert_conn->conn_mutex); | ||
2502 | - if (isert_conn->state == ISER_CONN_UP) | ||
2503 | + switch (isert_conn->state) { | ||
2504 | + case ISER_CONN_TERMINATING: | ||
2505 | + break; | ||
2506 | + case ISER_CONN_UP: | ||
2507 | + /* | ||
2508 | + * No flush completions will occur as we didn't | ||
2509 | + * get to ISER_CONN_FULL_FEATURE yet, complete | ||
2510 | + * to allow teardown progress. | ||
2511 | + */ | ||
2512 | + complete(&isert_conn->conn_wait_comp_err); | ||
2513 | + case ISER_CONN_FULL_FEATURE: /* FALLTHRU */ | ||
2514 | + pr_info("Terminating conn %p state %d\n", | ||
2515 | + isert_conn, isert_conn->state); | ||
2516 | isert_conn->state = ISER_CONN_TERMINATING; | ||
2517 | - | ||
2518 | - if (isert_conn->post_recv_buf_count == 0 && | ||
2519 | - atomic_read(&isert_conn->post_send_buf_count) == 0) { | ||
2520 | - mutex_unlock(&isert_conn->conn_mutex); | ||
2521 | - goto wake_up; | ||
2522 | - } | ||
2523 | - if (!isert_conn->conn_cm_id) { | ||
2524 | - mutex_unlock(&isert_conn->conn_mutex); | ||
2525 | - isert_put_conn(isert_conn); | ||
2526 | - return; | ||
2527 | + err = rdma_disconnect(isert_conn->conn_cm_id); | ||
2528 | + if (err) | ||
2529 | + pr_warn("Failed rdma_disconnect isert_conn %p\n", | ||
2530 | + isert_conn); | ||
2531 | + break; | ||
2532 | + default: | ||
2533 | + pr_warn("conn %p teminating in state %d\n", | ||
2534 | + isert_conn, isert_conn->state); | ||
2535 | } | ||
2536 | +} | ||
2537 | |||
2538 | - if (isert_conn->disconnect) { | ||
2539 | - /* Send DREQ/DREP towards our initiator */ | ||
2540 | - rdma_disconnect(isert_conn->conn_cm_id); | ||
2541 | - } | ||
2542 | +static int | ||
2543 | +isert_np_cma_handler(struct isert_np *isert_np, | ||
2544 | + enum rdma_cm_event_type event) | ||
2545 | +{ | ||
2546 | + pr_debug("isert np %p, handling event %d\n", isert_np, event); | ||
2547 | |||
2548 | - mutex_unlock(&isert_conn->conn_mutex); | ||
2549 | + switch (event) { | ||
2550 | + case RDMA_CM_EVENT_DEVICE_REMOVAL: | ||
2551 | + isert_np->np_cm_id = NULL; | ||
2552 | + break; | ||
2553 | + case RDMA_CM_EVENT_ADDR_CHANGE: | ||
2554 | + isert_np->np_cm_id = isert_setup_id(isert_np); | ||
2555 | + if (IS_ERR(isert_np->np_cm_id)) { | ||
2556 | + pr_err("isert np %p setup id failed: %ld\n", | ||
2557 | + isert_np, PTR_ERR(isert_np->np_cm_id)); | ||
2558 | + isert_np->np_cm_id = NULL; | ||
2559 | + } | ||
2560 | + break; | ||
2561 | + default: | ||
2562 | + pr_err("isert np %p Unexpected event %d\n", | ||
2563 | + isert_np, event); | ||
2564 | + } | ||
2565 | |||
2566 | -wake_up: | ||
2567 | - complete(&isert_conn->conn_wait); | ||
2568 | + return -1; | ||
2569 | } | ||
2570 | |||
2571 | static int | ||
2572 | -isert_disconnected_handler(struct rdma_cm_id *cma_id, bool disconnect) | ||
2573 | +isert_disconnected_handler(struct rdma_cm_id *cma_id, | ||
2574 | + enum rdma_cm_event_type event) | ||
2575 | { | ||
2576 | + struct isert_np *isert_np = cma_id->context; | ||
2577 | struct isert_conn *isert_conn; | ||
2578 | |||
2579 | - if (!cma_id->qp) { | ||
2580 | - struct isert_np *isert_np = cma_id->context; | ||
2581 | + if (isert_np->np_cm_id == cma_id) | ||
2582 | + return isert_np_cma_handler(cma_id->context, event); | ||
2583 | |||
2584 | - isert_np->np_cm_id = NULL; | ||
2585 | - return -1; | ||
2586 | - } | ||
2587 | + isert_conn = cma_id->qp->qp_context; | ||
2588 | |||
2589 | - isert_conn = (struct isert_conn *)cma_id->context; | ||
2590 | + mutex_lock(&isert_conn->conn_mutex); | ||
2591 | + isert_conn_terminate(isert_conn); | ||
2592 | + mutex_unlock(&isert_conn->conn_mutex); | ||
2593 | |||
2594 | - isert_conn->disconnect = disconnect; | ||
2595 | - INIT_WORK(&isert_conn->conn_logout_work, isert_disconnect_work); | ||
2596 | - schedule_work(&isert_conn->conn_logout_work); | ||
2597 | + pr_info("conn %p completing conn_wait\n", isert_conn); | ||
2598 | + complete(&isert_conn->conn_wait); | ||
2599 | |||
2600 | return 0; | ||
2601 | } | ||
2602 | |||
2603 | +static void | ||
2604 | +isert_connect_error(struct rdma_cm_id *cma_id) | ||
2605 | +{ | ||
2606 | + struct isert_conn *isert_conn = cma_id->qp->qp_context; | ||
2607 | + | ||
2608 | + isert_put_conn(isert_conn); | ||
2609 | +} | ||
2610 | + | ||
2611 | static int | ||
2612 | isert_cma_handler(struct rdma_cm_id *cma_id, struct rdma_cm_event *event) | ||
2613 | { | ||
2614 | int ret = 0; | ||
2615 | - bool disconnect = false; | ||
2616 | |||
2617 | pr_debug("isert_cma_handler: event %d status %d conn %p id %p\n", | ||
2618 | event->event, event->status, cma_id->context, cma_id); | ||
2619 | @@ -853,11 +936,14 @@ isert_cma_handler(struct rdma_cm_id *cma_id, struct rdma_cm_event *event) | ||
2620 | case RDMA_CM_EVENT_ADDR_CHANGE: /* FALLTHRU */ | ||
2621 | case RDMA_CM_EVENT_DISCONNECTED: /* FALLTHRU */ | ||
2622 | case RDMA_CM_EVENT_DEVICE_REMOVAL: /* FALLTHRU */ | ||
2623 | - disconnect = true; | ||
2624 | case RDMA_CM_EVENT_TIMEWAIT_EXIT: /* FALLTHRU */ | ||
2625 | - ret = isert_disconnected_handler(cma_id, disconnect); | ||
2626 | + ret = isert_disconnected_handler(cma_id, event->event); | ||
2627 | break; | ||
2628 | + case RDMA_CM_EVENT_REJECTED: /* FALLTHRU */ | ||
2629 | + case RDMA_CM_EVENT_UNREACHABLE: /* FALLTHRU */ | ||
2630 | case RDMA_CM_EVENT_CONNECT_ERROR: | ||
2631 | + isert_connect_error(cma_id); | ||
2632 | + break; | ||
2633 | default: | ||
2634 | pr_err("Unhandled RDMA CMA event: %d\n", event->event); | ||
2635 | break; | ||
2636 | @@ -991,7 +1077,7 @@ isert_init_send_wr(struct isert_conn *isert_conn, struct isert_cmd *isert_cmd, | ||
2637 | * bit for every ISERT_COMP_BATCH_COUNT number of ib_post_send() calls. | ||
2638 | */ | ||
2639 | mutex_lock(&isert_conn->conn_mutex); | ||
2640 | - if (coalesce && isert_conn->state == ISER_CONN_UP && | ||
2641 | + if (coalesce && isert_conn->state == ISER_CONN_FULL_FEATURE && | ||
2642 | ++isert_conn->conn_comp_batch < ISERT_COMP_BATCH_COUNT) { | ||
2643 | tx_desc->llnode_active = true; | ||
2644 | llist_add(&tx_desc->comp_llnode, &isert_conn->conn_comp_llist); | ||
2645 | @@ -1072,11 +1158,7 @@ isert_put_login_tx(struct iscsi_conn *conn, struct iscsi_login *login, | ||
2646 | if (login->login_complete) { | ||
2647 | if (!conn->sess->sess_ops->SessionType && | ||
2648 | isert_conn->conn_device->use_fastreg) { | ||
2649 | - /* Normal Session and fastreg is used */ | ||
2650 | - u8 pi_support = login->np->tpg_np->tpg->tpg_attrib.t10_pi; | ||
2651 | - | ||
2652 | - ret = isert_conn_create_fastreg_pool(isert_conn, | ||
2653 | - pi_support); | ||
2654 | + ret = isert_conn_create_fastreg_pool(isert_conn); | ||
2655 | if (ret) { | ||
2656 | pr_err("Conn: %p failed to create" | ||
2657 | " fastreg pool\n", isert_conn); | ||
2658 | @@ -1092,7 +1174,10 @@ isert_put_login_tx(struct iscsi_conn *conn, struct iscsi_login *login, | ||
2659 | if (ret) | ||
2660 | return ret; | ||
2661 | |||
2662 | - isert_conn->state = ISER_CONN_UP; | ||
2663 | + /* Now we are in FULL_FEATURE phase */ | ||
2664 | + mutex_lock(&isert_conn->conn_mutex); | ||
2665 | + isert_conn->state = ISER_CONN_FULL_FEATURE; | ||
2666 | + mutex_unlock(&isert_conn->conn_mutex); | ||
2667 | goto post_send; | ||
2668 | } | ||
2669 | |||
2670 | @@ -1109,18 +1194,17 @@ post_send: | ||
2671 | } | ||
2672 | |||
2673 | static void | ||
2674 | -isert_rx_login_req(struct iser_rx_desc *rx_desc, int rx_buflen, | ||
2675 | - struct isert_conn *isert_conn) | ||
2676 | +isert_rx_login_req(struct isert_conn *isert_conn) | ||
2677 | { | ||
2678 | + struct iser_rx_desc *rx_desc = (void *)isert_conn->login_req_buf; | ||
2679 | + int rx_buflen = isert_conn->login_req_len; | ||
2680 | struct iscsi_conn *conn = isert_conn->conn; | ||
2681 | struct iscsi_login *login = conn->conn_login; | ||
2682 | int size; | ||
2683 | |||
2684 | - if (!login) { | ||
2685 | - pr_err("conn->conn_login is NULL\n"); | ||
2686 | - dump_stack(); | ||
2687 | - return; | ||
2688 | - } | ||
2689 | + pr_info("conn %p\n", isert_conn); | ||
2690 | + | ||
2691 | + WARN_ON_ONCE(!login); | ||
2692 | |||
2693 | if (login->first_request) { | ||
2694 | struct iscsi_login_req *login_req = | ||
2695 | @@ -1483,11 +1567,20 @@ isert_rx_completion(struct iser_rx_desc *desc, struct isert_conn *isert_conn, | ||
2696 | hdr->opcode, hdr->itt, hdr->flags, | ||
2697 | (int)(xfer_len - ISER_HEADERS_LEN)); | ||
2698 | |||
2699 | - if ((char *)desc == isert_conn->login_req_buf) | ||
2700 | - isert_rx_login_req(desc, xfer_len - ISER_HEADERS_LEN, | ||
2701 | - isert_conn); | ||
2702 | - else | ||
2703 | + if ((char *)desc == isert_conn->login_req_buf) { | ||
2704 | + isert_conn->login_req_len = xfer_len - ISER_HEADERS_LEN; | ||
2705 | + if (isert_conn->conn) { | ||
2706 | + struct iscsi_login *login = isert_conn->conn->conn_login; | ||
2707 | + | ||
2708 | + if (login && !login->first_request) | ||
2709 | + isert_rx_login_req(isert_conn); | ||
2710 | + } | ||
2711 | + mutex_lock(&isert_conn->conn_mutex); | ||
2712 | + complete(&isert_conn->login_req_comp); | ||
2713 | + mutex_unlock(&isert_conn->conn_mutex); | ||
2714 | + } else { | ||
2715 | isert_rx_do_work(desc, isert_conn); | ||
2716 | + } | ||
2717 | |||
2718 | ib_dma_sync_single_for_device(ib_dev, rx_dma, rx_buflen, | ||
2719 | DMA_FROM_DEVICE); | ||
2720 | @@ -2046,7 +2139,7 @@ isert_cq_rx_comp_err(struct isert_conn *isert_conn) | ||
2721 | msleep(3000); | ||
2722 | |||
2723 | mutex_lock(&isert_conn->conn_mutex); | ||
2724 | - isert_conn->state = ISER_CONN_DOWN; | ||
2725 | + isert_conn_terminate(isert_conn); | ||
2726 | mutex_unlock(&isert_conn->conn_mutex); | ||
2727 | |||
2728 | iscsit_cause_connection_reinstatement(isert_conn->conn, 0); | ||
2729 | @@ -2231,8 +2324,16 @@ isert_get_sup_prot_ops(struct iscsi_conn *conn) | ||
2730 | struct isert_conn *isert_conn = (struct isert_conn *)conn->context; | ||
2731 | struct isert_device *device = isert_conn->conn_device; | ||
2732 | |||
2733 | - if (device->pi_capable) | ||
2734 | - return TARGET_PROT_ALL; | ||
2735 | + if (conn->tpg->tpg_attrib.t10_pi) { | ||
2736 | + if (device->pi_capable) { | ||
2737 | + pr_info("conn %p PI offload enabled\n", isert_conn); | ||
2738 | + isert_conn->pi_support = true; | ||
2739 | + return TARGET_PROT_ALL; | ||
2740 | + } | ||
2741 | + } | ||
2742 | + | ||
2743 | + pr_info("conn %p PI offload disabled\n", isert_conn); | ||
2744 | + isert_conn->pi_support = false; | ||
2745 | |||
2746 | return TARGET_PROT_NORMAL; | ||
2747 | } | ||
2748 | @@ -2681,10 +2782,10 @@ isert_set_prot_checks(u8 prot_checks) | ||
2749 | } | ||
2750 | |||
2751 | static int | ||
2752 | -isert_reg_sig_mr(struct isert_conn *isert_conn, struct se_cmd *se_cmd, | ||
2753 | - struct fast_reg_descriptor *fr_desc, | ||
2754 | - struct ib_sge *data_sge, struct ib_sge *prot_sge, | ||
2755 | - struct ib_sge *sig_sge) | ||
2756 | +isert_reg_sig_mr(struct isert_conn *isert_conn, | ||
2757 | + struct se_cmd *se_cmd, | ||
2758 | + struct isert_rdma_wr *rdma_wr, | ||
2759 | + struct fast_reg_descriptor *fr_desc) | ||
2760 | { | ||
2761 | struct ib_send_wr sig_wr, inv_wr; | ||
2762 | struct ib_send_wr *bad_wr, *wr = NULL; | ||
2763 | @@ -2714,13 +2815,13 @@ isert_reg_sig_mr(struct isert_conn *isert_conn, struct se_cmd *se_cmd, | ||
2764 | memset(&sig_wr, 0, sizeof(sig_wr)); | ||
2765 | sig_wr.opcode = IB_WR_REG_SIG_MR; | ||
2766 | sig_wr.wr_id = ISER_FASTREG_LI_WRID; | ||
2767 | - sig_wr.sg_list = data_sge; | ||
2768 | + sig_wr.sg_list = &rdma_wr->ib_sg[DATA]; | ||
2769 | sig_wr.num_sge = 1; | ||
2770 | sig_wr.wr.sig_handover.access_flags = IB_ACCESS_LOCAL_WRITE; | ||
2771 | sig_wr.wr.sig_handover.sig_attrs = &sig_attrs; | ||
2772 | sig_wr.wr.sig_handover.sig_mr = pi_ctx->sig_mr; | ||
2773 | if (se_cmd->t_prot_sg) | ||
2774 | - sig_wr.wr.sig_handover.prot = prot_sge; | ||
2775 | + sig_wr.wr.sig_handover.prot = &rdma_wr->ib_sg[PROT]; | ||
2776 | |||
2777 | if (!wr) | ||
2778 | wr = &sig_wr; | ||
2779 | @@ -2734,34 +2835,93 @@ isert_reg_sig_mr(struct isert_conn *isert_conn, struct se_cmd *se_cmd, | ||
2780 | } | ||
2781 | fr_desc->ind &= ~ISERT_SIG_KEY_VALID; | ||
2782 | |||
2783 | - sig_sge->lkey = pi_ctx->sig_mr->lkey; | ||
2784 | - sig_sge->addr = 0; | ||
2785 | - sig_sge->length = se_cmd->data_length; | ||
2786 | + rdma_wr->ib_sg[SIG].lkey = pi_ctx->sig_mr->lkey; | ||
2787 | + rdma_wr->ib_sg[SIG].addr = 0; | ||
2788 | + rdma_wr->ib_sg[SIG].length = se_cmd->data_length; | ||
2789 | if (se_cmd->prot_op != TARGET_PROT_DIN_STRIP && | ||
2790 | se_cmd->prot_op != TARGET_PROT_DOUT_INSERT) | ||
2791 | /* | ||
2792 | * We have protection guards on the wire | ||
2793 | * so we need to set a larget transfer | ||
2794 | */ | ||
2795 | - sig_sge->length += se_cmd->prot_length; | ||
2796 | + rdma_wr->ib_sg[SIG].length += se_cmd->prot_length; | ||
2797 | |||
2798 | pr_debug("sig_sge: addr: 0x%llx length: %u lkey: %x\n", | ||
2799 | - sig_sge->addr, sig_sge->length, | ||
2800 | - sig_sge->lkey); | ||
2801 | + rdma_wr->ib_sg[SIG].addr, rdma_wr->ib_sg[SIG].length, | ||
2802 | + rdma_wr->ib_sg[SIG].lkey); | ||
2803 | err: | ||
2804 | return ret; | ||
2805 | } | ||
2806 | |||
2807 | static int | ||
2808 | +isert_handle_prot_cmd(struct isert_conn *isert_conn, | ||
2809 | + struct isert_cmd *isert_cmd, | ||
2810 | + struct isert_rdma_wr *wr) | ||
2811 | +{ | ||
2812 | + struct isert_device *device = isert_conn->conn_device; | ||
2813 | + struct se_cmd *se_cmd = &isert_cmd->iscsi_cmd->se_cmd; | ||
2814 | + int ret; | ||
2815 | + | ||
2816 | + if (!wr->fr_desc->pi_ctx) { | ||
2817 | + ret = isert_create_pi_ctx(wr->fr_desc, | ||
2818 | + device->ib_device, | ||
2819 | + isert_conn->conn_pd); | ||
2820 | + if (ret) { | ||
2821 | + pr_err("conn %p failed to allocate pi_ctx\n", | ||
2822 | + isert_conn); | ||
2823 | + return ret; | ||
2824 | + } | ||
2825 | + } | ||
2826 | + | ||
2827 | + if (se_cmd->t_prot_sg) { | ||
2828 | + ret = isert_map_data_buf(isert_conn, isert_cmd, | ||
2829 | + se_cmd->t_prot_sg, | ||
2830 | + se_cmd->t_prot_nents, | ||
2831 | + se_cmd->prot_length, | ||
2832 | + 0, wr->iser_ib_op, &wr->prot); | ||
2833 | + if (ret) { | ||
2834 | + pr_err("conn %p failed to map protection buffer\n", | ||
2835 | + isert_conn); | ||
2836 | + return ret; | ||
2837 | + } | ||
2838 | + | ||
2839 | + memset(&wr->ib_sg[PROT], 0, sizeof(wr->ib_sg[PROT])); | ||
2840 | + ret = isert_fast_reg_mr(isert_conn, wr->fr_desc, &wr->prot, | ||
2841 | + ISERT_PROT_KEY_VALID, &wr->ib_sg[PROT]); | ||
2842 | + if (ret) { | ||
2843 | + pr_err("conn %p failed to fast reg mr\n", | ||
2844 | + isert_conn); | ||
2845 | + goto unmap_prot_cmd; | ||
2846 | + } | ||
2847 | + } | ||
2848 | + | ||
2849 | + ret = isert_reg_sig_mr(isert_conn, se_cmd, wr, wr->fr_desc); | ||
2850 | + if (ret) { | ||
2851 | + pr_err("conn %p failed to fast reg mr\n", | ||
2852 | + isert_conn); | ||
2853 | + goto unmap_prot_cmd; | ||
2854 | + } | ||
2855 | + wr->fr_desc->ind |= ISERT_PROTECTED; | ||
2856 | + | ||
2857 | + return 0; | ||
2858 | + | ||
2859 | +unmap_prot_cmd: | ||
2860 | + if (se_cmd->t_prot_sg) | ||
2861 | + isert_unmap_data_buf(isert_conn, &wr->prot); | ||
2862 | + | ||
2863 | + return ret; | ||
2864 | +} | ||
2865 | + | ||
2866 | +static int | ||
2867 | isert_reg_rdma(struct iscsi_conn *conn, struct iscsi_cmd *cmd, | ||
2868 | struct isert_rdma_wr *wr) | ||
2869 | { | ||
2870 | struct se_cmd *se_cmd = &cmd->se_cmd; | ||
2871 | struct isert_cmd *isert_cmd = iscsit_priv_cmd(cmd); | ||
2872 | struct isert_conn *isert_conn = conn->context; | ||
2873 | - struct ib_sge data_sge; | ||
2874 | - struct ib_send_wr *send_wr; | ||
2875 | struct fast_reg_descriptor *fr_desc = NULL; | ||
2876 | + struct ib_send_wr *send_wr; | ||
2877 | + struct ib_sge *ib_sg; | ||
2878 | u32 offset; | ||
2879 | int ret = 0; | ||
2880 | unsigned long flags; | ||
2881 | @@ -2775,8 +2935,7 @@ isert_reg_rdma(struct iscsi_conn *conn, struct iscsi_cmd *cmd, | ||
2882 | if (ret) | ||
2883 | return ret; | ||
2884 | |||
2885 | - if (wr->data.dma_nents != 1 || | ||
2886 | - se_cmd->prot_op != TARGET_PROT_NORMAL) { | ||
2887 | + if (wr->data.dma_nents != 1 || isert_prot_cmd(isert_conn, se_cmd)) { | ||
2888 | spin_lock_irqsave(&isert_conn->conn_lock, flags); | ||
2889 | fr_desc = list_first_entry(&isert_conn->conn_fr_pool, | ||
2890 | struct fast_reg_descriptor, list); | ||
2891 | @@ -2786,38 +2945,21 @@ isert_reg_rdma(struct iscsi_conn *conn, struct iscsi_cmd *cmd, | ||
2892 | } | ||
2893 | |||
2894 | ret = isert_fast_reg_mr(isert_conn, fr_desc, &wr->data, | ||
2895 | - ISERT_DATA_KEY_VALID, &data_sge); | ||
2896 | + ISERT_DATA_KEY_VALID, &wr->ib_sg[DATA]); | ||
2897 | if (ret) | ||
2898 | goto unmap_cmd; | ||
2899 | |||
2900 | - if (se_cmd->prot_op != TARGET_PROT_NORMAL) { | ||
2901 | - struct ib_sge prot_sge, sig_sge; | ||
2902 | - | ||
2903 | - if (se_cmd->t_prot_sg) { | ||
2904 | - ret = isert_map_data_buf(isert_conn, isert_cmd, | ||
2905 | - se_cmd->t_prot_sg, | ||
2906 | - se_cmd->t_prot_nents, | ||
2907 | - se_cmd->prot_length, | ||
2908 | - 0, wr->iser_ib_op, &wr->prot); | ||
2909 | - if (ret) | ||
2910 | - goto unmap_cmd; | ||
2911 | - | ||
2912 | - ret = isert_fast_reg_mr(isert_conn, fr_desc, &wr->prot, | ||
2913 | - ISERT_PROT_KEY_VALID, &prot_sge); | ||
2914 | - if (ret) | ||
2915 | - goto unmap_prot_cmd; | ||
2916 | - } | ||
2917 | - | ||
2918 | - ret = isert_reg_sig_mr(isert_conn, se_cmd, fr_desc, | ||
2919 | - &data_sge, &prot_sge, &sig_sge); | ||
2920 | + if (isert_prot_cmd(isert_conn, se_cmd)) { | ||
2921 | + ret = isert_handle_prot_cmd(isert_conn, isert_cmd, wr); | ||
2922 | if (ret) | ||
2923 | - goto unmap_prot_cmd; | ||
2924 | + goto unmap_cmd; | ||
2925 | |||
2926 | - fr_desc->ind |= ISERT_PROTECTED; | ||
2927 | - memcpy(&wr->s_ib_sge, &sig_sge, sizeof(sig_sge)); | ||
2928 | - } else | ||
2929 | - memcpy(&wr->s_ib_sge, &data_sge, sizeof(data_sge)); | ||
2930 | + ib_sg = &wr->ib_sg[SIG]; | ||
2931 | + } else { | ||
2932 | + ib_sg = &wr->ib_sg[DATA]; | ||
2933 | + } | ||
2934 | |||
2935 | + memcpy(&wr->s_ib_sge, ib_sg, sizeof(*ib_sg)); | ||
2936 | wr->ib_sge = &wr->s_ib_sge; | ||
2937 | wr->send_wr_num = 1; | ||
2938 | memset(&wr->s_send_wr, 0, sizeof(*send_wr)); | ||
2939 | @@ -2832,7 +2974,7 @@ isert_reg_rdma(struct iscsi_conn *conn, struct iscsi_cmd *cmd, | ||
2940 | send_wr->opcode = IB_WR_RDMA_WRITE; | ||
2941 | send_wr->wr.rdma.remote_addr = isert_cmd->read_va; | ||
2942 | send_wr->wr.rdma.rkey = isert_cmd->read_stag; | ||
2943 | - send_wr->send_flags = se_cmd->prot_op == TARGET_PROT_NORMAL ? | ||
2944 | + send_wr->send_flags = !isert_prot_cmd(isert_conn, se_cmd) ? | ||
2945 | 0 : IB_SEND_SIGNALED; | ||
2946 | } else { | ||
2947 | send_wr->opcode = IB_WR_RDMA_READ; | ||
2948 | @@ -2842,9 +2984,7 @@ isert_reg_rdma(struct iscsi_conn *conn, struct iscsi_cmd *cmd, | ||
2949 | } | ||
2950 | |||
2951 | return 0; | ||
2952 | -unmap_prot_cmd: | ||
2953 | - if (se_cmd->t_prot_sg) | ||
2954 | - isert_unmap_data_buf(isert_conn, &wr->prot); | ||
2955 | + | ||
2956 | unmap_cmd: | ||
2957 | if (fr_desc) { | ||
2958 | spin_lock_irqsave(&isert_conn->conn_lock, flags); | ||
2959 | @@ -2876,7 +3016,7 @@ isert_put_datain(struct iscsi_conn *conn, struct iscsi_cmd *cmd) | ||
2960 | return rc; | ||
2961 | } | ||
2962 | |||
2963 | - if (se_cmd->prot_op == TARGET_PROT_NORMAL) { | ||
2964 | + if (!isert_prot_cmd(isert_conn, se_cmd)) { | ||
2965 | /* | ||
2966 | * Build isert_conn->tx_desc for iSCSI response PDU and attach | ||
2967 | */ | ||
2968 | @@ -2899,7 +3039,7 @@ isert_put_datain(struct iscsi_conn *conn, struct iscsi_cmd *cmd) | ||
2969 | atomic_sub(wr->send_wr_num, &isert_conn->post_send_buf_count); | ||
2970 | } | ||
2971 | |||
2972 | - if (se_cmd->prot_op == TARGET_PROT_NORMAL) | ||
2973 | + if (!isert_prot_cmd(isert_conn, se_cmd)) | ||
2974 | pr_debug("Cmd: %p posted RDMA_WRITE + Response for iSER Data " | ||
2975 | "READ\n", isert_cmd); | ||
2976 | else | ||
2977 | @@ -3001,13 +3141,51 @@ isert_response_queue(struct iscsi_conn *conn, struct iscsi_cmd *cmd, int state) | ||
2978 | return ret; | ||
2979 | } | ||
2980 | |||
2981 | +struct rdma_cm_id * | ||
2982 | +isert_setup_id(struct isert_np *isert_np) | ||
2983 | +{ | ||
2984 | + struct iscsi_np *np = isert_np->np; | ||
2985 | + struct rdma_cm_id *id; | ||
2986 | + struct sockaddr *sa; | ||
2987 | + int ret; | ||
2988 | + | ||
2989 | + sa = (struct sockaddr *)&np->np_sockaddr; | ||
2990 | + pr_debug("ksockaddr: %p, sa: %p\n", &np->np_sockaddr, sa); | ||
2991 | + | ||
2992 | + id = rdma_create_id(isert_cma_handler, isert_np, | ||
2993 | + RDMA_PS_TCP, IB_QPT_RC); | ||
2994 | + if (IS_ERR(id)) { | ||
2995 | + pr_err("rdma_create_id() failed: %ld\n", PTR_ERR(id)); | ||
2996 | + ret = PTR_ERR(id); | ||
2997 | + goto out; | ||
2998 | + } | ||
2999 | + pr_debug("id %p context %p\n", id, id->context); | ||
3000 | + | ||
3001 | + ret = rdma_bind_addr(id, sa); | ||
3002 | + if (ret) { | ||
3003 | + pr_err("rdma_bind_addr() failed: %d\n", ret); | ||
3004 | + goto out_id; | ||
3005 | + } | ||
3006 | + | ||
3007 | + ret = rdma_listen(id, ISERT_RDMA_LISTEN_BACKLOG); | ||
3008 | + if (ret) { | ||
3009 | + pr_err("rdma_listen() failed: %d\n", ret); | ||
3010 | + goto out_id; | ||
3011 | + } | ||
3012 | + | ||
3013 | + return id; | ||
3014 | +out_id: | ||
3015 | + rdma_destroy_id(id); | ||
3016 | +out: | ||
3017 | + return ERR_PTR(ret); | ||
3018 | +} | ||
3019 | + | ||
3020 | static int | ||
3021 | isert_setup_np(struct iscsi_np *np, | ||
3022 | struct __kernel_sockaddr_storage *ksockaddr) | ||
3023 | { | ||
3024 | struct isert_np *isert_np; | ||
3025 | struct rdma_cm_id *isert_lid; | ||
3026 | - struct sockaddr *sa; | ||
3027 | int ret; | ||
3028 | |||
3029 | isert_np = kzalloc(sizeof(struct isert_np), GFP_KERNEL); | ||
3030 | @@ -3019,9 +3197,8 @@ isert_setup_np(struct iscsi_np *np, | ||
3031 | mutex_init(&isert_np->np_accept_mutex); | ||
3032 | INIT_LIST_HEAD(&isert_np->np_accept_list); | ||
3033 | init_completion(&isert_np->np_login_comp); | ||
3034 | + isert_np->np = np; | ||
3035 | |||
3036 | - sa = (struct sockaddr *)ksockaddr; | ||
3037 | - pr_debug("ksockaddr: %p, sa: %p\n", ksockaddr, sa); | ||
3038 | /* | ||
3039 | * Setup the np->np_sockaddr from the passed sockaddr setup | ||
3040 | * in iscsi_target_configfs.c code.. | ||
3041 | @@ -3029,37 +3206,20 @@ isert_setup_np(struct iscsi_np *np, | ||
3042 | memcpy(&np->np_sockaddr, ksockaddr, | ||
3043 | sizeof(struct __kernel_sockaddr_storage)); | ||
3044 | |||
3045 | - isert_lid = rdma_create_id(isert_cma_handler, np, RDMA_PS_TCP, | ||
3046 | - IB_QPT_RC); | ||
3047 | + isert_lid = isert_setup_id(isert_np); | ||
3048 | if (IS_ERR(isert_lid)) { | ||
3049 | - pr_err("rdma_create_id() for isert_listen_handler failed: %ld\n", | ||
3050 | - PTR_ERR(isert_lid)); | ||
3051 | ret = PTR_ERR(isert_lid); | ||
3052 | goto out; | ||
3053 | } | ||
3054 | |||
3055 | - ret = rdma_bind_addr(isert_lid, sa); | ||
3056 | - if (ret) { | ||
3057 | - pr_err("rdma_bind_addr() for isert_lid failed: %d\n", ret); | ||
3058 | - goto out_lid; | ||
3059 | - } | ||
3060 | - | ||
3061 | - ret = rdma_listen(isert_lid, ISERT_RDMA_LISTEN_BACKLOG); | ||
3062 | - if (ret) { | ||
3063 | - pr_err("rdma_listen() for isert_lid failed: %d\n", ret); | ||
3064 | - goto out_lid; | ||
3065 | - } | ||
3066 | - | ||
3067 | isert_np->np_cm_id = isert_lid; | ||
3068 | np->np_context = isert_np; | ||
3069 | - pr_debug("Setup isert_lid->context: %p\n", isert_lid->context); | ||
3070 | |||
3071 | return 0; | ||
3072 | |||
3073 | -out_lid: | ||
3074 | - rdma_destroy_id(isert_lid); | ||
3075 | out: | ||
3076 | kfree(isert_np); | ||
3077 | + | ||
3078 | return ret; | ||
3079 | } | ||
3080 | |||
3081 | @@ -3094,7 +3254,15 @@ isert_get_login_rx(struct iscsi_conn *conn, struct iscsi_login *login) | ||
3082 | struct isert_conn *isert_conn = (struct isert_conn *)conn->context; | ||
3083 | int ret; | ||
3084 | |||
3085 | - pr_debug("isert_get_login_rx before conn_login_comp conn: %p\n", conn); | ||
3086 | + pr_info("before login_req comp conn: %p\n", isert_conn); | ||
3087 | + ret = wait_for_completion_interruptible(&isert_conn->login_req_comp); | ||
3088 | + if (ret) { | ||
3089 | + pr_err("isert_conn %p interrupted before got login req\n", | ||
3090 | + isert_conn); | ||
3091 | + return ret; | ||
3092 | + } | ||
3093 | + reinit_completion(&isert_conn->login_req_comp); | ||
3094 | + | ||
3095 | /* | ||
3096 | * For login requests after the first PDU, isert_rx_login_req() will | ||
3097 | * kick schedule_delayed_work(&conn->login_work) as the packet is | ||
3098 | @@ -3104,11 +3272,15 @@ isert_get_login_rx(struct iscsi_conn *conn, struct iscsi_login *login) | ||
3099 | if (!login->first_request) | ||
3100 | return 0; | ||
3101 | |||
3102 | + isert_rx_login_req(isert_conn); | ||
3103 | + | ||
3104 | + pr_info("before conn_login_comp conn: %p\n", conn); | ||
3105 | ret = wait_for_completion_interruptible(&isert_conn->conn_login_comp); | ||
3106 | if (ret) | ||
3107 | return ret; | ||
3108 | |||
3109 | - pr_debug("isert_get_login_rx processing login->req: %p\n", login->req); | ||
3110 | + pr_info("processing login->req: %p\n", login->req); | ||
3111 | + | ||
3112 | return 0; | ||
3113 | } | ||
3114 | |||
3115 | @@ -3186,17 +3358,10 @@ accept_wait: | ||
3116 | isert_conn->conn = conn; | ||
3117 | max_accept = 0; | ||
3118 | |||
3119 | - ret = isert_rdma_post_recvl(isert_conn); | ||
3120 | - if (ret) | ||
3121 | - return ret; | ||
3122 | - | ||
3123 | - ret = isert_rdma_accept(isert_conn); | ||
3124 | - if (ret) | ||
3125 | - return ret; | ||
3126 | - | ||
3127 | isert_set_conn_info(np, conn, isert_conn); | ||
3128 | |||
3129 | - pr_debug("Processing isert_accept_np: isert_conn: %p\n", isert_conn); | ||
3130 | + pr_debug("Processing isert_conn: %p\n", isert_conn); | ||
3131 | + | ||
3132 | return 0; | ||
3133 | } | ||
3134 | |||
3135 | @@ -3212,6 +3377,24 @@ isert_free_np(struct iscsi_np *np) | ||
3136 | kfree(isert_np); | ||
3137 | } | ||
3138 | |||
3139 | +static void isert_release_work(struct work_struct *work) | ||
3140 | +{ | ||
3141 | + struct isert_conn *isert_conn = container_of(work, | ||
3142 | + struct isert_conn, | ||
3143 | + release_work); | ||
3144 | + | ||
3145 | + pr_info("Starting release conn %p\n", isert_conn); | ||
3146 | + | ||
3147 | + wait_for_completion(&isert_conn->conn_wait); | ||
3148 | + | ||
3149 | + mutex_lock(&isert_conn->conn_mutex); | ||
3150 | + isert_conn->state = ISER_CONN_DOWN; | ||
3151 | + mutex_unlock(&isert_conn->conn_mutex); | ||
3152 | + | ||
3153 | + pr_info("Destroying conn %p\n", isert_conn); | ||
3154 | + isert_put_conn(isert_conn); | ||
3155 | +} | ||
3156 | + | ||
3157 | static void isert_wait_conn(struct iscsi_conn *conn) | ||
3158 | { | ||
3159 | struct isert_conn *isert_conn = conn->context; | ||
3160 | @@ -3219,10 +3402,6 @@ static void isert_wait_conn(struct iscsi_conn *conn) | ||
3161 | pr_debug("isert_wait_conn: Starting \n"); | ||
3162 | |||
3163 | mutex_lock(&isert_conn->conn_mutex); | ||
3164 | - if (isert_conn->conn_cm_id && !isert_conn->disconnect) { | ||
3165 | - pr_debug("Calling rdma_disconnect from isert_wait_conn\n"); | ||
3166 | - rdma_disconnect(isert_conn->conn_cm_id); | ||
3167 | - } | ||
3168 | /* | ||
3169 | * Only wait for conn_wait_comp_err if the isert_conn made it | ||
3170 | * into full feature phase.. | ||
3171 | @@ -3231,14 +3410,13 @@ static void isert_wait_conn(struct iscsi_conn *conn) | ||
3172 | mutex_unlock(&isert_conn->conn_mutex); | ||
3173 | return; | ||
3174 | } | ||
3175 | - if (isert_conn->state == ISER_CONN_UP) | ||
3176 | - isert_conn->state = ISER_CONN_TERMINATING; | ||
3177 | + isert_conn_terminate(isert_conn); | ||
3178 | mutex_unlock(&isert_conn->conn_mutex); | ||
3179 | |||
3180 | wait_for_completion(&isert_conn->conn_wait_comp_err); | ||
3181 | |||
3182 | - wait_for_completion(&isert_conn->conn_wait); | ||
3183 | - isert_put_conn(isert_conn); | ||
3184 | + INIT_WORK(&isert_conn->release_work, isert_release_work); | ||
3185 | + queue_work(isert_release_wq, &isert_conn->release_work); | ||
3186 | } | ||
3187 | |||
3188 | static void isert_free_conn(struct iscsi_conn *conn) | ||
3189 | @@ -3286,10 +3464,21 @@ static int __init isert_init(void) | ||
3190 | goto destroy_rx_wq; | ||
3191 | } | ||
3192 | |||
3193 | + isert_release_wq = alloc_workqueue("isert_release_wq", WQ_UNBOUND, | ||
3194 | + WQ_UNBOUND_MAX_ACTIVE); | ||
3195 | + if (!isert_release_wq) { | ||
3196 | + pr_err("Unable to allocate isert_release_wq\n"); | ||
3197 | + ret = -ENOMEM; | ||
3198 | + goto destroy_comp_wq; | ||
3199 | + } | ||
3200 | + | ||
3201 | iscsit_register_transport(&iser_target_transport); | ||
3202 | - pr_debug("iSER_TARGET[0] - Loaded iser_target_transport\n"); | ||
3203 | + pr_info("iSER_TARGET[0] - Loaded iser_target_transport\n"); | ||
3204 | + | ||
3205 | return 0; | ||
3206 | |||
3207 | +destroy_comp_wq: | ||
3208 | + destroy_workqueue(isert_comp_wq); | ||
3209 | destroy_rx_wq: | ||
3210 | destroy_workqueue(isert_rx_wq); | ||
3211 | return ret; | ||
3212 | @@ -3298,6 +3487,7 @@ destroy_rx_wq: | ||
3213 | static void __exit isert_exit(void) | ||
3214 | { | ||
3215 | flush_scheduled_work(); | ||
3216 | + destroy_workqueue(isert_release_wq); | ||
3217 | destroy_workqueue(isert_comp_wq); | ||
3218 | destroy_workqueue(isert_rx_wq); | ||
3219 | iscsit_unregister_transport(&iser_target_transport); | ||
3220 | diff --git a/drivers/infiniband/ulp/isert/ib_isert.h b/drivers/infiniband/ulp/isert/ib_isert.h | ||
3221 | index 04f51f7bf614..141905f446dd 100644 | ||
3222 | --- a/drivers/infiniband/ulp/isert/ib_isert.h | ||
3223 | +++ b/drivers/infiniband/ulp/isert/ib_isert.h | ||
3224 | @@ -23,6 +23,7 @@ enum iser_ib_op_code { | ||
3225 | enum iser_conn_state { | ||
3226 | ISER_CONN_INIT, | ||
3227 | ISER_CONN_UP, | ||
3228 | + ISER_CONN_FULL_FEATURE, | ||
3229 | ISER_CONN_TERMINATING, | ||
3230 | ISER_CONN_DOWN, | ||
3231 | }; | ||
3232 | @@ -81,6 +82,12 @@ struct isert_data_buf { | ||
3233 | enum dma_data_direction dma_dir; | ||
3234 | }; | ||
3235 | |||
3236 | +enum { | ||
3237 | + DATA = 0, | ||
3238 | + PROT = 1, | ||
3239 | + SIG = 2, | ||
3240 | +}; | ||
3241 | + | ||
3242 | struct isert_rdma_wr { | ||
3243 | struct list_head wr_list; | ||
3244 | struct isert_cmd *isert_cmd; | ||
3245 | @@ -90,6 +97,7 @@ struct isert_rdma_wr { | ||
3246 | int send_wr_num; | ||
3247 | struct ib_send_wr *send_wr; | ||
3248 | struct ib_send_wr s_send_wr; | ||
3249 | + struct ib_sge ib_sg[3]; | ||
3250 | struct isert_data_buf data; | ||
3251 | struct isert_data_buf prot; | ||
3252 | struct fast_reg_descriptor *fr_desc; | ||
3253 | @@ -120,11 +128,13 @@ struct isert_conn { | ||
3254 | atomic_t post_send_buf_count; | ||
3255 | u32 responder_resources; | ||
3256 | u32 initiator_depth; | ||
3257 | + bool pi_support; | ||
3258 | u32 max_sge; | ||
3259 | char *login_buf; | ||
3260 | char *login_req_buf; | ||
3261 | char *login_rsp_buf; | ||
3262 | u64 login_req_dma; | ||
3263 | + int login_req_len; | ||
3264 | u64 login_rsp_dma; | ||
3265 | unsigned int conn_rx_desc_head; | ||
3266 | struct iser_rx_desc *conn_rx_descs; | ||
3267 | @@ -132,13 +142,13 @@ struct isert_conn { | ||
3268 | struct iscsi_conn *conn; | ||
3269 | struct list_head conn_accept_node; | ||
3270 | struct completion conn_login_comp; | ||
3271 | + struct completion login_req_comp; | ||
3272 | struct iser_tx_desc conn_login_tx_desc; | ||
3273 | struct rdma_cm_id *conn_cm_id; | ||
3274 | struct ib_pd *conn_pd; | ||
3275 | struct ib_mr *conn_mr; | ||
3276 | struct ib_qp *conn_qp; | ||
3277 | struct isert_device *conn_device; | ||
3278 | - struct work_struct conn_logout_work; | ||
3279 | struct mutex conn_mutex; | ||
3280 | struct completion conn_wait; | ||
3281 | struct completion conn_wait_comp_err; | ||
3282 | @@ -147,10 +157,10 @@ struct isert_conn { | ||
3283 | int conn_fr_pool_size; | ||
3284 | /* lock to protect fastreg pool */ | ||
3285 | spinlock_t conn_lock; | ||
3286 | + struct work_struct release_work; | ||
3287 | #define ISERT_COMP_BATCH_COUNT 8 | ||
3288 | int conn_comp_batch; | ||
3289 | struct llist_head conn_comp_llist; | ||
3290 | - bool disconnect; | ||
3291 | }; | ||
3292 | |||
3293 | #define ISERT_MAX_CQ 64 | ||
3294 | @@ -182,6 +192,7 @@ struct isert_device { | ||
3295 | }; | ||
3296 | |||
3297 | struct isert_np { | ||
3298 | + struct iscsi_np *np; | ||
3299 | struct semaphore np_sem; | ||
3300 | struct rdma_cm_id *np_cm_id; | ||
3301 | struct mutex np_accept_mutex; | ||
3302 | diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c | ||
3303 | index f2b978026407..77ecf6d32237 100644 | ||
3304 | --- a/drivers/input/mouse/elantech.c | ||
3305 | +++ b/drivers/input/mouse/elantech.c | ||
3306 | @@ -1520,6 +1520,8 @@ static int elantech_set_properties(struct elantech_data *etd) | ||
3307 | case 7: | ||
3308 | case 8: | ||
3309 | case 9: | ||
3310 | + case 10: | ||
3311 | + case 13: | ||
3312 | etd->hw_version = 4; | ||
3313 | break; | ||
3314 | default: | ||
3315 | diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h | ||
3316 | index faeeb1372462..1a858c86a72b 100644 | ||
3317 | --- a/drivers/input/serio/i8042-x86ia64io.h | ||
3318 | +++ b/drivers/input/serio/i8042-x86ia64io.h | ||
3319 | @@ -415,6 +415,13 @@ static const struct dmi_system_id __initconst i8042_dmi_nomux_table[] = { | ||
3320 | }, | ||
3321 | }, | ||
3322 | { | ||
3323 | + /* Acer Aspire 7738 */ | ||
3324 | + .matches = { | ||
3325 | + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
3326 | + DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 7738"), | ||
3327 | + }, | ||
3328 | + }, | ||
3329 | + { | ||
3330 | /* Gericom Bellagio */ | ||
3331 | .matches = { | ||
3332 | DMI_MATCH(DMI_SYS_VENDOR, "Gericom"), | ||
3333 | @@ -735,6 +742,35 @@ static const struct dmi_system_id __initconst i8042_dmi_dritek_table[] = { | ||
3334 | { } | ||
3335 | }; | ||
3336 | |||
3337 | +/* | ||
3338 | + * Some laptops need keyboard reset before probing for the trackpad to get | ||
3339 | + * it detected, initialised & finally work. | ||
3340 | + */ | ||
3341 | +static const struct dmi_system_id __initconst i8042_dmi_kbdreset_table[] = { | ||
3342 | + { | ||
3343 | + /* Gigabyte P35 v2 - Elantech touchpad */ | ||
3344 | + .matches = { | ||
3345 | + DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), | ||
3346 | + DMI_MATCH(DMI_PRODUCT_NAME, "P35V2"), | ||
3347 | + }, | ||
3348 | + }, | ||
3349 | + { | ||
3350 | + /* Aorus branded Gigabyte X3 Plus - Elantech touchpad */ | ||
3351 | + .matches = { | ||
3352 | + DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), | ||
3353 | + DMI_MATCH(DMI_PRODUCT_NAME, "X3"), | ||
3354 | + }, | ||
3355 | + }, | ||
3356 | + { | ||
3357 | + /* Gigabyte P34 - Elantech touchpad */ | ||
3358 | + .matches = { | ||
3359 | + DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), | ||
3360 | + DMI_MATCH(DMI_PRODUCT_NAME, "P34"), | ||
3361 | + }, | ||
3362 | + }, | ||
3363 | + { } | ||
3364 | +}; | ||
3365 | + | ||
3366 | #endif /* CONFIG_X86 */ | ||
3367 | |||
3368 | #ifdef CONFIG_PNP | ||
3369 | @@ -1030,6 +1066,9 @@ static int __init i8042_platform_init(void) | ||
3370 | if (dmi_check_system(i8042_dmi_dritek_table)) | ||
3371 | i8042_dritek = true; | ||
3372 | |||
3373 | + if (dmi_check_system(i8042_dmi_kbdreset_table)) | ||
3374 | + i8042_kbdreset = true; | ||
3375 | + | ||
3376 | /* | ||
3377 | * A20 was already enabled during early kernel init. But some buggy | ||
3378 | * BIOSes (in MSI Laptops) require A20 to be enabled using 8042 to | ||
3379 | diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c | ||
3380 | index f5a98af3b325..804d2e02010a 100644 | ||
3381 | --- a/drivers/input/serio/i8042.c | ||
3382 | +++ b/drivers/input/serio/i8042.c | ||
3383 | @@ -67,6 +67,10 @@ static bool i8042_notimeout; | ||
3384 | module_param_named(notimeout, i8042_notimeout, bool, 0); | ||
3385 | MODULE_PARM_DESC(notimeout, "Ignore timeouts signalled by i8042"); | ||
3386 | |||
3387 | +static bool i8042_kbdreset; | ||
3388 | +module_param_named(kbdreset, i8042_kbdreset, bool, 0); | ||
3389 | +MODULE_PARM_DESC(kbdreset, "Reset device connected to KBD port"); | ||
3390 | + | ||
3391 | #ifdef CONFIG_X86 | ||
3392 | static bool i8042_dritek; | ||
3393 | module_param_named(dritek, i8042_dritek, bool, 0); | ||
3394 | @@ -790,6 +794,16 @@ static int __init i8042_check_aux(void) | ||
3395 | return -1; | ||
3396 | |||
3397 | /* | ||
3398 | + * Reset keyboard (needed on some laptops to successfully detect | ||
3399 | + * touchpad, e.g., some Gigabyte laptop models with Elantech | ||
3400 | + * touchpads). | ||
3401 | + */ | ||
3402 | + if (i8042_kbdreset) { | ||
3403 | + pr_warn("Attempting to reset device connected to KBD port\n"); | ||
3404 | + i8042_kbd_write(NULL, (unsigned char) 0xff); | ||
3405 | + } | ||
3406 | + | ||
3407 | +/* | ||
3408 | * Test AUX IRQ delivery to make sure BIOS did not grab the IRQ and | ||
3409 | * used it for a PCI card or somethig else. | ||
3410 | */ | ||
3411 | diff --git a/drivers/leds/leds-netxbig.c b/drivers/leds/leds-netxbig.c | ||
3412 | index 64fde485dcaa..4c794f15a57f 100644 | ||
3413 | --- a/drivers/leds/leds-netxbig.c | ||
3414 | +++ b/drivers/leds/leds-netxbig.c | ||
3415 | @@ -330,18 +330,18 @@ create_netxbig_led(struct platform_device *pdev, | ||
3416 | led_dat->sata = 0; | ||
3417 | led_dat->cdev.brightness = LED_OFF; | ||
3418 | led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME; | ||
3419 | - /* | ||
3420 | - * If available, expose the SATA activity blink capability through | ||
3421 | - * a "sata" sysfs attribute. | ||
3422 | - */ | ||
3423 | - if (led_dat->mode_val[NETXBIG_LED_SATA] != NETXBIG_LED_INVALID_MODE) | ||
3424 | - led_dat->cdev.groups = netxbig_led_groups; | ||
3425 | led_dat->mode_addr = template->mode_addr; | ||
3426 | led_dat->mode_val = template->mode_val; | ||
3427 | led_dat->bright_addr = template->bright_addr; | ||
3428 | led_dat->bright_max = (1 << pdata->gpio_ext->num_data) - 1; | ||
3429 | led_dat->timer = pdata->timer; | ||
3430 | led_dat->num_timer = pdata->num_timer; | ||
3431 | + /* | ||
3432 | + * If available, expose the SATA activity blink capability through | ||
3433 | + * a "sata" sysfs attribute. | ||
3434 | + */ | ||
3435 | + if (led_dat->mode_val[NETXBIG_LED_SATA] != NETXBIG_LED_INVALID_MODE) | ||
3436 | + led_dat->cdev.groups = netxbig_led_groups; | ||
3437 | |||
3438 | return led_classdev_register(&pdev->dev, &led_dat->cdev); | ||
3439 | } | ||
3440 | diff --git a/drivers/md/dm.c b/drivers/md/dm.c | ||
3441 | index 58f3927fd7cc..62c51364cf9e 100644 | ||
3442 | --- a/drivers/md/dm.c | ||
3443 | +++ b/drivers/md/dm.c | ||
3444 | @@ -899,7 +899,7 @@ static void disable_write_same(struct mapped_device *md) | ||
3445 | |||
3446 | static void clone_endio(struct bio *bio, int error) | ||
3447 | { | ||
3448 | - int r = 0; | ||
3449 | + int r = error; | ||
3450 | struct dm_target_io *tio = container_of(bio, struct dm_target_io, clone); | ||
3451 | struct dm_io *io = tio->io; | ||
3452 | struct mapped_device *md = tio->io->md; | ||
3453 | diff --git a/drivers/media/i2c/smiapp-pll.c b/drivers/media/i2c/smiapp-pll.c | ||
3454 | index 2335529b195c..ab5d9a3adebf 100644 | ||
3455 | --- a/drivers/media/i2c/smiapp-pll.c | ||
3456 | +++ b/drivers/media/i2c/smiapp-pll.c | ||
3457 | @@ -67,7 +67,7 @@ static void print_pll(struct device *dev, struct smiapp_pll *pll) | ||
3458 | { | ||
3459 | dev_dbg(dev, "pre_pll_clk_div\t%d\n", pll->pre_pll_clk_div); | ||
3460 | dev_dbg(dev, "pll_multiplier \t%d\n", pll->pll_multiplier); | ||
3461 | - if (pll->flags != SMIAPP_PLL_FLAG_NO_OP_CLOCKS) { | ||
3462 | + if (!(pll->flags & SMIAPP_PLL_FLAG_NO_OP_CLOCKS)) { | ||
3463 | dev_dbg(dev, "op_sys_clk_div \t%d\n", pll->op_sys_clk_div); | ||
3464 | dev_dbg(dev, "op_pix_clk_div \t%d\n", pll->op_pix_clk_div); | ||
3465 | } | ||
3466 | @@ -77,7 +77,7 @@ static void print_pll(struct device *dev, struct smiapp_pll *pll) | ||
3467 | dev_dbg(dev, "ext_clk_freq_hz \t%d\n", pll->ext_clk_freq_hz); | ||
3468 | dev_dbg(dev, "pll_ip_clk_freq_hz \t%d\n", pll->pll_ip_clk_freq_hz); | ||
3469 | dev_dbg(dev, "pll_op_clk_freq_hz \t%d\n", pll->pll_op_clk_freq_hz); | ||
3470 | - if (pll->flags & SMIAPP_PLL_FLAG_NO_OP_CLOCKS) { | ||
3471 | + if (!(pll->flags & SMIAPP_PLL_FLAG_NO_OP_CLOCKS)) { | ||
3472 | dev_dbg(dev, "op_sys_clk_freq_hz \t%d\n", | ||
3473 | pll->op_sys_clk_freq_hz); | ||
3474 | dev_dbg(dev, "op_pix_clk_freq_hz \t%d\n", | ||
3475 | diff --git a/drivers/media/i2c/smiapp/smiapp-core.c b/drivers/media/i2c/smiapp/smiapp-core.c | ||
3476 | index b10aaeda2bb4..b49254e4ea0a 100644 | ||
3477 | --- a/drivers/media/i2c/smiapp/smiapp-core.c | ||
3478 | +++ b/drivers/media/i2c/smiapp/smiapp-core.c | ||
3479 | @@ -2677,7 +2677,9 @@ static int smiapp_registered(struct v4l2_subdev *subdev) | ||
3480 | pll->flags |= SMIAPP_PLL_FLAG_NO_OP_CLOCKS; | ||
3481 | pll->scale_n = sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN]; | ||
3482 | |||
3483 | + mutex_lock(&sensor->mutex); | ||
3484 | rval = smiapp_update_mode(sensor); | ||
3485 | + mutex_unlock(&sensor->mutex); | ||
3486 | if (rval) { | ||
3487 | dev_err(&client->dev, "update mode failed\n"); | ||
3488 | goto out_nvm_release; | ||
3489 | diff --git a/drivers/media/platform/vivid/vivid-vid-out.c b/drivers/media/platform/vivid/vivid-vid-out.c | ||
3490 | index 69c2dbd2d165..501d5ef682e5 100644 | ||
3491 | --- a/drivers/media/platform/vivid/vivid-vid-out.c | ||
3492 | +++ b/drivers/media/platform/vivid/vivid-vid-out.c | ||
3493 | @@ -612,7 +612,7 @@ int vivid_vid_out_g_selection(struct file *file, void *priv, | ||
3494 | sel->r = dev->fmt_out_rect; | ||
3495 | break; | ||
3496 | case V4L2_SEL_TGT_CROP_BOUNDS: | ||
3497 | - if (!dev->has_compose_out) | ||
3498 | + if (!dev->has_crop_out) | ||
3499 | return -EINVAL; | ||
3500 | sel->r = vivid_max_rect; | ||
3501 | break; | ||
3502 | diff --git a/drivers/media/rc/img-ir/img-ir-hw.c b/drivers/media/rc/img-ir/img-ir-hw.c | ||
3503 | index ec49f94425fc..2fd47c9bf5d8 100644 | ||
3504 | --- a/drivers/media/rc/img-ir/img-ir-hw.c | ||
3505 | +++ b/drivers/media/rc/img-ir/img-ir-hw.c | ||
3506 | @@ -530,6 +530,22 @@ static void img_ir_set_decoder(struct img_ir_priv *priv, | ||
3507 | u32 ir_status, irq_en; | ||
3508 | spin_lock_irq(&priv->lock); | ||
3509 | |||
3510 | + /* | ||
3511 | + * First record that the protocol is being stopped so that the end timer | ||
3512 | + * isn't restarted while we're trying to stop it. | ||
3513 | + */ | ||
3514 | + hw->stopping = true; | ||
3515 | + | ||
3516 | + /* | ||
3517 | + * Release the lock to stop the end timer, since the end timer handler | ||
3518 | + * acquires the lock and we don't want to deadlock waiting for it. | ||
3519 | + */ | ||
3520 | + spin_unlock_irq(&priv->lock); | ||
3521 | + del_timer_sync(&hw->end_timer); | ||
3522 | + spin_lock_irq(&priv->lock); | ||
3523 | + | ||
3524 | + hw->stopping = false; | ||
3525 | + | ||
3526 | /* switch off and disable interrupts */ | ||
3527 | img_ir_write(priv, IMG_IR_CONTROL, 0); | ||
3528 | irq_en = img_ir_read(priv, IMG_IR_IRQ_ENABLE); | ||
3529 | @@ -541,12 +557,13 @@ static void img_ir_set_decoder(struct img_ir_priv *priv, | ||
3530 | if (ir_status & (IMG_IR_RXDVAL | IMG_IR_RXDVALD2)) { | ||
3531 | ir_status &= ~(IMG_IR_RXDVAL | IMG_IR_RXDVALD2); | ||
3532 | img_ir_write(priv, IMG_IR_STATUS, ir_status); | ||
3533 | - img_ir_read(priv, IMG_IR_DATA_LW); | ||
3534 | - img_ir_read(priv, IMG_IR_DATA_UP); | ||
3535 | } | ||
3536 | |||
3537 | - /* stop the end timer and switch back to normal mode */ | ||
3538 | - del_timer_sync(&hw->end_timer); | ||
3539 | + /* always read data to clear buffer if IR wakes the device */ | ||
3540 | + img_ir_read(priv, IMG_IR_DATA_LW); | ||
3541 | + img_ir_read(priv, IMG_IR_DATA_UP); | ||
3542 | + | ||
3543 | + /* switch back to normal mode */ | ||
3544 | hw->mode = IMG_IR_M_NORMAL; | ||
3545 | |||
3546 | /* clear the wakeup scancode filter */ | ||
3547 | @@ -817,7 +834,8 @@ static void img_ir_handle_data(struct img_ir_priv *priv, u32 len, u64 raw) | ||
3548 | } | ||
3549 | |||
3550 | |||
3551 | - if (dec->repeat) { | ||
3552 | + /* we mustn't update the end timer while trying to stop it */ | ||
3553 | + if (dec->repeat && !hw->stopping) { | ||
3554 | unsigned long interval; | ||
3555 | |||
3556 | img_ir_begin_repeat(priv); | ||
3557 | diff --git a/drivers/media/rc/img-ir/img-ir-hw.h b/drivers/media/rc/img-ir/img-ir-hw.h | ||
3558 | index 8fcc16c32c5b..307ddcd1a99e 100644 | ||
3559 | --- a/drivers/media/rc/img-ir/img-ir-hw.h | ||
3560 | +++ b/drivers/media/rc/img-ir/img-ir-hw.h | ||
3561 | @@ -214,6 +214,8 @@ enum img_ir_mode { | ||
3562 | * @flags: IMG_IR_F_*. | ||
3563 | * @filters: HW filters (derived from scancode filters). | ||
3564 | * @mode: Current decode mode. | ||
3565 | + * @stopping: Indicates that decoder is being taken down and timers | ||
3566 | + * should not be restarted. | ||
3567 | * @suspend_irqen: Saved IRQ enable mask over suspend. | ||
3568 | */ | ||
3569 | struct img_ir_priv_hw { | ||
3570 | @@ -229,6 +231,7 @@ struct img_ir_priv_hw { | ||
3571 | struct img_ir_filter filters[RC_FILTER_MAX]; | ||
3572 | |||
3573 | enum img_ir_mode mode; | ||
3574 | + bool stopping; | ||
3575 | u32 suspend_irqen; | ||
3576 | }; | ||
3577 | |||
3578 | diff --git a/drivers/media/usb/au0828/au0828-cards.c b/drivers/media/usb/au0828/au0828-cards.c | ||
3579 | index 9eb77ac2153b..da87f1cc31a9 100644 | ||
3580 | --- a/drivers/media/usb/au0828/au0828-cards.c | ||
3581 | +++ b/drivers/media/usb/au0828/au0828-cards.c | ||
3582 | @@ -36,6 +36,11 @@ static void hvr950q_cs5340_audio(void *priv, int enable) | ||
3583 | au0828_clear(dev, REG_000, 0x10); | ||
3584 | } | ||
3585 | |||
3586 | +/* | ||
3587 | + * WARNING: There's a quirks table at sound/usb/quirks-table.h | ||
3588 | + * that should also be updated every time a new device with V4L2 support | ||
3589 | + * is added here. | ||
3590 | + */ | ||
3591 | struct au0828_board au0828_boards[] = { | ||
3592 | [AU0828_BOARD_UNKNOWN] = { | ||
3593 | .name = "Unknown board", | ||
3594 | diff --git a/drivers/media/usb/dvb-usb/af9005.c b/drivers/media/usb/dvb-usb/af9005.c | ||
3595 | index 3f4361e48a32..efa782ed6e2d 100644 | ||
3596 | --- a/drivers/media/usb/dvb-usb/af9005.c | ||
3597 | +++ b/drivers/media/usb/dvb-usb/af9005.c | ||
3598 | @@ -1081,9 +1081,12 @@ static int __init af9005_usb_module_init(void) | ||
3599 | err("usb_register failed. (%d)", result); | ||
3600 | return result; | ||
3601 | } | ||
3602 | +#if IS_MODULE(CONFIG_DVB_USB_AF9005) || defined(CONFIG_DVB_USB_AF9005_REMOTE) | ||
3603 | + /* FIXME: convert to todays kernel IR infrastructure */ | ||
3604 | rc_decode = symbol_request(af9005_rc_decode); | ||
3605 | rc_keys = symbol_request(rc_map_af9005_table); | ||
3606 | rc_keys_size = symbol_request(rc_map_af9005_table_size); | ||
3607 | +#endif | ||
3608 | if (rc_decode == NULL || rc_keys == NULL || rc_keys_size == NULL) { | ||
3609 | err("af9005_rc_decode function not found, disabling remote"); | ||
3610 | af9005_properties.rc.legacy.rc_query = NULL; | ||
3611 | diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c | ||
3612 | index 7c8322d4fc63..3c07af96b30f 100644 | ||
3613 | --- a/drivers/media/usb/uvc/uvc_driver.c | ||
3614 | +++ b/drivers/media/usb/uvc/uvc_driver.c | ||
3615 | @@ -1623,12 +1623,12 @@ static void uvc_delete(struct uvc_device *dev) | ||
3616 | { | ||
3617 | struct list_head *p, *n; | ||
3618 | |||
3619 | - usb_put_intf(dev->intf); | ||
3620 | - usb_put_dev(dev->udev); | ||
3621 | - | ||
3622 | uvc_status_cleanup(dev); | ||
3623 | uvc_ctrl_cleanup_device(dev); | ||
3624 | |||
3625 | + usb_put_intf(dev->intf); | ||
3626 | + usb_put_dev(dev->udev); | ||
3627 | + | ||
3628 | if (dev->vdev.dev) | ||
3629 | v4l2_device_unregister(&dev->vdev); | ||
3630 | #ifdef CONFIG_MEDIA_CONTROLLER | ||
3631 | diff --git a/drivers/misc/cxl/context.c b/drivers/misc/cxl/context.c | ||
3632 | index cca472109135..51fd6b524371 100644 | ||
3633 | --- a/drivers/misc/cxl/context.c | ||
3634 | +++ b/drivers/misc/cxl/context.c | ||
3635 | @@ -34,7 +34,8 @@ struct cxl_context *cxl_context_alloc(void) | ||
3636 | /* | ||
3637 | * Initialises a CXL context. | ||
3638 | */ | ||
3639 | -int cxl_context_init(struct cxl_context *ctx, struct cxl_afu *afu, bool master) | ||
3640 | +int cxl_context_init(struct cxl_context *ctx, struct cxl_afu *afu, bool master, | ||
3641 | + struct address_space *mapping) | ||
3642 | { | ||
3643 | int i; | ||
3644 | |||
3645 | @@ -42,6 +43,8 @@ int cxl_context_init(struct cxl_context *ctx, struct cxl_afu *afu, bool master) | ||
3646 | ctx->afu = afu; | ||
3647 | ctx->master = master; | ||
3648 | ctx->pid = NULL; /* Set in start work ioctl */ | ||
3649 | + mutex_init(&ctx->mapping_lock); | ||
3650 | + ctx->mapping = mapping; | ||
3651 | |||
3652 | /* | ||
3653 | * Allocate the segment table before we put it in the IDR so that we | ||
3654 | @@ -82,12 +85,12 @@ int cxl_context_init(struct cxl_context *ctx, struct cxl_afu *afu, bool master) | ||
3655 | * Allocating IDR! We better make sure everything's setup that | ||
3656 | * dereferences from it. | ||
3657 | */ | ||
3658 | + mutex_lock(&afu->contexts_lock); | ||
3659 | idr_preload(GFP_KERNEL); | ||
3660 | - spin_lock(&afu->contexts_lock); | ||
3661 | i = idr_alloc(&ctx->afu->contexts_idr, ctx, 0, | ||
3662 | ctx->afu->num_procs, GFP_NOWAIT); | ||
3663 | - spin_unlock(&afu->contexts_lock); | ||
3664 | idr_preload_end(); | ||
3665 | + mutex_unlock(&afu->contexts_lock); | ||
3666 | if (i < 0) | ||
3667 | return i; | ||
3668 | |||
3669 | @@ -147,6 +150,12 @@ static void __detach_context(struct cxl_context *ctx) | ||
3670 | afu_release_irqs(ctx); | ||
3671 | flush_work(&ctx->fault_work); /* Only needed for dedicated process */ | ||
3672 | wake_up_all(&ctx->wq); | ||
3673 | + | ||
3674 | + /* Release Problem State Area mapping */ | ||
3675 | + mutex_lock(&ctx->mapping_lock); | ||
3676 | + if (ctx->mapping) | ||
3677 | + unmap_mapping_range(ctx->mapping, 0, 0, 1); | ||
3678 | + mutex_unlock(&ctx->mapping_lock); | ||
3679 | } | ||
3680 | |||
3681 | /* | ||
3682 | @@ -168,21 +177,22 @@ void cxl_context_detach_all(struct cxl_afu *afu) | ||
3683 | struct cxl_context *ctx; | ||
3684 | int tmp; | ||
3685 | |||
3686 | - rcu_read_lock(); | ||
3687 | - idr_for_each_entry(&afu->contexts_idr, ctx, tmp) | ||
3688 | + mutex_lock(&afu->contexts_lock); | ||
3689 | + idr_for_each_entry(&afu->contexts_idr, ctx, tmp) { | ||
3690 | /* | ||
3691 | * Anything done in here needs to be setup before the IDR is | ||
3692 | * created and torn down after the IDR removed | ||
3693 | */ | ||
3694 | __detach_context(ctx); | ||
3695 | - rcu_read_unlock(); | ||
3696 | + } | ||
3697 | + mutex_unlock(&afu->contexts_lock); | ||
3698 | } | ||
3699 | |||
3700 | void cxl_context_free(struct cxl_context *ctx) | ||
3701 | { | ||
3702 | - spin_lock(&ctx->afu->contexts_lock); | ||
3703 | + mutex_lock(&ctx->afu->contexts_lock); | ||
3704 | idr_remove(&ctx->afu->contexts_idr, ctx->pe); | ||
3705 | - spin_unlock(&ctx->afu->contexts_lock); | ||
3706 | + mutex_unlock(&ctx->afu->contexts_lock); | ||
3707 | synchronize_rcu(); | ||
3708 | |||
3709 | free_page((u64)ctx->sstp); | ||
3710 | diff --git a/drivers/misc/cxl/cxl.h b/drivers/misc/cxl/cxl.h | ||
3711 | index 3d2b8677ec8a..6ee785da574e 100644 | ||
3712 | --- a/drivers/misc/cxl/cxl.h | ||
3713 | +++ b/drivers/misc/cxl/cxl.h | ||
3714 | @@ -349,7 +349,7 @@ struct cxl_afu { | ||
3715 | struct device *chardev_s, *chardev_m, *chardev_d; | ||
3716 | struct idr contexts_idr; | ||
3717 | struct dentry *debugfs; | ||
3718 | - spinlock_t contexts_lock; | ||
3719 | + struct mutex contexts_lock; | ||
3720 | struct mutex spa_mutex; | ||
3721 | spinlock_t afu_cntl_lock; | ||
3722 | |||
3723 | @@ -390,6 +390,10 @@ struct cxl_context { | ||
3724 | phys_addr_t psn_phys; | ||
3725 | u64 psn_size; | ||
3726 | |||
3727 | + /* Used to unmap any mmaps when force detaching */ | ||
3728 | + struct address_space *mapping; | ||
3729 | + struct mutex mapping_lock; | ||
3730 | + | ||
3731 | spinlock_t sste_lock; /* Protects segment table entries */ | ||
3732 | struct cxl_sste *sstp; | ||
3733 | u64 sstp0, sstp1; | ||
3734 | @@ -592,7 +596,8 @@ int cxl_alloc_sst(struct cxl_context *ctx); | ||
3735 | void init_cxl_native(void); | ||
3736 | |||
3737 | struct cxl_context *cxl_context_alloc(void); | ||
3738 | -int cxl_context_init(struct cxl_context *ctx, struct cxl_afu *afu, bool master); | ||
3739 | +int cxl_context_init(struct cxl_context *ctx, struct cxl_afu *afu, bool master, | ||
3740 | + struct address_space *mapping); | ||
3741 | void cxl_context_free(struct cxl_context *ctx); | ||
3742 | int cxl_context_iomap(struct cxl_context *ctx, struct vm_area_struct *vma); | ||
3743 | |||
3744 | diff --git a/drivers/misc/cxl/file.c b/drivers/misc/cxl/file.c | ||
3745 | index 378b099e7c0b..e9f2f10dbb37 100644 | ||
3746 | --- a/drivers/misc/cxl/file.c | ||
3747 | +++ b/drivers/misc/cxl/file.c | ||
3748 | @@ -77,7 +77,7 @@ static int __afu_open(struct inode *inode, struct file *file, bool master) | ||
3749 | goto err_put_afu; | ||
3750 | } | ||
3751 | |||
3752 | - if ((rc = cxl_context_init(ctx, afu, master))) | ||
3753 | + if ((rc = cxl_context_init(ctx, afu, master, inode->i_mapping))) | ||
3754 | goto err_put_afu; | ||
3755 | |||
3756 | pr_devel("afu_open pe: %i\n", ctx->pe); | ||
3757 | @@ -113,6 +113,10 @@ static int afu_release(struct inode *inode, struct file *file) | ||
3758 | __func__, ctx->pe); | ||
3759 | cxl_context_detach(ctx); | ||
3760 | |||
3761 | + mutex_lock(&ctx->mapping_lock); | ||
3762 | + ctx->mapping = NULL; | ||
3763 | + mutex_unlock(&ctx->mapping_lock); | ||
3764 | + | ||
3765 | put_device(&ctx->afu->dev); | ||
3766 | |||
3767 | /* | ||
3768 | diff --git a/drivers/misc/cxl/native.c b/drivers/misc/cxl/native.c | ||
3769 | index d47532e8f4f1..1d9717b4d67a 100644 | ||
3770 | --- a/drivers/misc/cxl/native.c | ||
3771 | +++ b/drivers/misc/cxl/native.c | ||
3772 | @@ -277,6 +277,7 @@ static int do_process_element_cmd(struct cxl_context *ctx, | ||
3773 | u64 cmd, u64 pe_state) | ||
3774 | { | ||
3775 | u64 state; | ||
3776 | + unsigned long timeout = jiffies + (HZ * CXL_TIMEOUT); | ||
3777 | |||
3778 | WARN_ON(!ctx->afu->enabled); | ||
3779 | |||
3780 | @@ -286,6 +287,10 @@ static int do_process_element_cmd(struct cxl_context *ctx, | ||
3781 | smp_mb(); | ||
3782 | cxl_p1n_write(ctx->afu, CXL_PSL_LLCMD_An, cmd | ctx->pe); | ||
3783 | while (1) { | ||
3784 | + if (time_after_eq(jiffies, timeout)) { | ||
3785 | + dev_warn(&ctx->afu->dev, "WARNING: Process Element Command timed out!\n"); | ||
3786 | + return -EBUSY; | ||
3787 | + } | ||
3788 | state = be64_to_cpup(ctx->afu->sw_command_status); | ||
3789 | if (state == ~0ULL) { | ||
3790 | pr_err("cxl: Error adding process element to AFU\n"); | ||
3791 | @@ -610,13 +615,6 @@ static inline int detach_process_native_dedicated(struct cxl_context *ctx) | ||
3792 | return 0; | ||
3793 | } | ||
3794 | |||
3795 | -/* | ||
3796 | - * TODO: handle case when this is called inside a rcu_read_lock() which may | ||
3797 | - * happen when we unbind the driver (ie. cxl_context_detach_all()) . Terminate | ||
3798 | - * & remove use a mutex lock and schedule which will not good with lock held. | ||
3799 | - * May need to write do_process_element_cmd() that handles outstanding page | ||
3800 | - * faults synchronously. | ||
3801 | - */ | ||
3802 | static inline int detach_process_native_afu_directed(struct cxl_context *ctx) | ||
3803 | { | ||
3804 | if (!ctx->pe_inserted) | ||
3805 | diff --git a/drivers/misc/cxl/pci.c b/drivers/misc/cxl/pci.c | ||
3806 | index 10c98ab7f46e..0f2cc9f8b4db 100644 | ||
3807 | --- a/drivers/misc/cxl/pci.c | ||
3808 | +++ b/drivers/misc/cxl/pci.c | ||
3809 | @@ -502,7 +502,7 @@ static struct cxl_afu *cxl_alloc_afu(struct cxl *adapter, int slice) | ||
3810 | afu->dev.release = cxl_release_afu; | ||
3811 | afu->slice = slice; | ||
3812 | idr_init(&afu->contexts_idr); | ||
3813 | - spin_lock_init(&afu->contexts_lock); | ||
3814 | + mutex_init(&afu->contexts_lock); | ||
3815 | spin_lock_init(&afu->afu_cntl_lock); | ||
3816 | mutex_init(&afu->spa_mutex); | ||
3817 | |||
3818 | diff --git a/drivers/misc/cxl/sysfs.c b/drivers/misc/cxl/sysfs.c | ||
3819 | index ce7ec06d87d1..461bdbd5d483 100644 | ||
3820 | --- a/drivers/misc/cxl/sysfs.c | ||
3821 | +++ b/drivers/misc/cxl/sysfs.c | ||
3822 | @@ -121,7 +121,7 @@ static ssize_t reset_store_afu(struct device *device, | ||
3823 | int rc; | ||
3824 | |||
3825 | /* Not safe to reset if it is currently in use */ | ||
3826 | - spin_lock(&afu->contexts_lock); | ||
3827 | + mutex_lock(&afu->contexts_lock); | ||
3828 | if (!idr_is_empty(&afu->contexts_idr)) { | ||
3829 | rc = -EBUSY; | ||
3830 | goto err; | ||
3831 | @@ -132,7 +132,7 @@ static ssize_t reset_store_afu(struct device *device, | ||
3832 | |||
3833 | rc = count; | ||
3834 | err: | ||
3835 | - spin_unlock(&afu->contexts_lock); | ||
3836 | + mutex_unlock(&afu->contexts_lock); | ||
3837 | return rc; | ||
3838 | } | ||
3839 | |||
3840 | @@ -247,7 +247,7 @@ static ssize_t mode_store(struct device *device, struct device_attribute *attr, | ||
3841 | int rc = -EBUSY; | ||
3842 | |||
3843 | /* can't change this if we have a user */ | ||
3844 | - spin_lock(&afu->contexts_lock); | ||
3845 | + mutex_lock(&afu->contexts_lock); | ||
3846 | if (!idr_is_empty(&afu->contexts_idr)) | ||
3847 | goto err; | ||
3848 | |||
3849 | @@ -271,7 +271,7 @@ static ssize_t mode_store(struct device *device, struct device_attribute *attr, | ||
3850 | afu->current_mode = 0; | ||
3851 | afu->num_procs = 0; | ||
3852 | |||
3853 | - spin_unlock(&afu->contexts_lock); | ||
3854 | + mutex_unlock(&afu->contexts_lock); | ||
3855 | |||
3856 | if ((rc = _cxl_afu_deactivate_mode(afu, old_mode))) | ||
3857 | return rc; | ||
3858 | @@ -280,7 +280,7 @@ static ssize_t mode_store(struct device *device, struct device_attribute *attr, | ||
3859 | |||
3860 | return count; | ||
3861 | err: | ||
3862 | - spin_unlock(&afu->contexts_lock); | ||
3863 | + mutex_unlock(&afu->contexts_lock); | ||
3864 | return rc; | ||
3865 | } | ||
3866 | |||
3867 | diff --git a/drivers/misc/mei/hw-me.c b/drivers/misc/mei/hw-me.c | ||
3868 | index 4f2fd6fc1e23..432aec8dd3ce 100644 | ||
3869 | --- a/drivers/misc/mei/hw-me.c | ||
3870 | +++ b/drivers/misc/mei/hw-me.c | ||
3871 | @@ -234,6 +234,18 @@ static int mei_me_hw_reset(struct mei_device *dev, bool intr_enable) | ||
3872 | struct mei_me_hw *hw = to_me_hw(dev); | ||
3873 | u32 hcsr = mei_hcsr_read(hw); | ||
3874 | |||
3875 | + /* H_RST may be found lit before reset is started, | ||
3876 | + * for example if preceding reset flow hasn't completed. | ||
3877 | + * In that case asserting H_RST will be ignored, therefore | ||
3878 | + * we need to clean H_RST bit to start a successful reset sequence. | ||
3879 | + */ | ||
3880 | + if ((hcsr & H_RST) == H_RST) { | ||
3881 | + dev_warn(dev->dev, "H_RST is set = 0x%08X", hcsr); | ||
3882 | + hcsr &= ~H_RST; | ||
3883 | + mei_me_reg_write(hw, H_CSR, hcsr); | ||
3884 | + hcsr = mei_hcsr_read(hw); | ||
3885 | + } | ||
3886 | + | ||
3887 | hcsr |= H_RST | H_IG | H_IS; | ||
3888 | |||
3889 | if (intr_enable) | ||
3890 | diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c | ||
3891 | index 7625bd791fca..023c2010cd75 100644 | ||
3892 | --- a/drivers/mmc/host/sdhci.c | ||
3893 | +++ b/drivers/mmc/host/sdhci.c | ||
3894 | @@ -1239,6 +1239,12 @@ static void sdhci_set_power(struct sdhci_host *host, unsigned char mode, | ||
3895 | spin_unlock_irq(&host->lock); | ||
3896 | mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, vdd); | ||
3897 | spin_lock_irq(&host->lock); | ||
3898 | + | ||
3899 | + if (mode != MMC_POWER_OFF) | ||
3900 | + sdhci_writeb(host, SDHCI_POWER_ON, SDHCI_POWER_CONTROL); | ||
3901 | + else | ||
3902 | + sdhci_writeb(host, 0, SDHCI_POWER_CONTROL); | ||
3903 | + | ||
3904 | return; | ||
3905 | } | ||
3906 | |||
3907 | diff --git a/drivers/net/can/usb/kvaser_usb.c b/drivers/net/can/usb/kvaser_usb.c | ||
3908 | index 541fb7a05625..cc7bfc0c0a71 100644 | ||
3909 | --- a/drivers/net/can/usb/kvaser_usb.c | ||
3910 | +++ b/drivers/net/can/usb/kvaser_usb.c | ||
3911 | @@ -1246,6 +1246,9 @@ static int kvaser_usb_close(struct net_device *netdev) | ||
3912 | if (err) | ||
3913 | netdev_warn(netdev, "Cannot stop device, error %d\n", err); | ||
3914 | |||
3915 | + /* reset tx contexts */ | ||
3916 | + kvaser_usb_unlink_tx_urbs(priv); | ||
3917 | + | ||
3918 | priv->can.state = CAN_STATE_STOPPED; | ||
3919 | close_candev(priv->netdev); | ||
3920 | |||
3921 | @@ -1294,12 +1297,14 @@ static netdev_tx_t kvaser_usb_start_xmit(struct sk_buff *skb, | ||
3922 | if (!urb) { | ||
3923 | netdev_err(netdev, "No memory left for URBs\n"); | ||
3924 | stats->tx_dropped++; | ||
3925 | - goto nourbmem; | ||
3926 | + dev_kfree_skb(skb); | ||
3927 | + return NETDEV_TX_OK; | ||
3928 | } | ||
3929 | |||
3930 | buf = kmalloc(sizeof(struct kvaser_msg), GFP_ATOMIC); | ||
3931 | if (!buf) { | ||
3932 | stats->tx_dropped++; | ||
3933 | + dev_kfree_skb(skb); | ||
3934 | goto nobufmem; | ||
3935 | } | ||
3936 | |||
3937 | @@ -1334,6 +1339,7 @@ static netdev_tx_t kvaser_usb_start_xmit(struct sk_buff *skb, | ||
3938 | } | ||
3939 | } | ||
3940 | |||
3941 | + /* This should never happen; it implies a flow control bug */ | ||
3942 | if (!context) { | ||
3943 | netdev_warn(netdev, "cannot find free context\n"); | ||
3944 | ret = NETDEV_TX_BUSY; | ||
3945 | @@ -1364,9 +1370,6 @@ static netdev_tx_t kvaser_usb_start_xmit(struct sk_buff *skb, | ||
3946 | if (unlikely(err)) { | ||
3947 | can_free_echo_skb(netdev, context->echo_index); | ||
3948 | |||
3949 | - skb = NULL; /* set to NULL to avoid double free in | ||
3950 | - * dev_kfree_skb(skb) */ | ||
3951 | - | ||
3952 | atomic_dec(&priv->active_tx_urbs); | ||
3953 | usb_unanchor_urb(urb); | ||
3954 | |||
3955 | @@ -1388,8 +1391,6 @@ releasebuf: | ||
3956 | kfree(buf); | ||
3957 | nobufmem: | ||
3958 | usb_free_urb(urb); | ||
3959 | -nourbmem: | ||
3960 | - dev_kfree_skb(skb); | ||
3961 | return ret; | ||
3962 | } | ||
3963 | |||
3964 | @@ -1502,6 +1503,10 @@ static int kvaser_usb_init_one(struct usb_interface *intf, | ||
3965 | struct kvaser_usb_net_priv *priv; | ||
3966 | int i, err; | ||
3967 | |||
3968 | + err = kvaser_usb_send_simple_msg(dev, CMD_RESET_CHIP, channel); | ||
3969 | + if (err) | ||
3970 | + return err; | ||
3971 | + | ||
3972 | netdev = alloc_candev(sizeof(*priv), MAX_TX_URBS); | ||
3973 | if (!netdev) { | ||
3974 | dev_err(&intf->dev, "Cannot alloc candev\n"); | ||
3975 | @@ -1606,9 +1611,6 @@ static int kvaser_usb_probe(struct usb_interface *intf, | ||
3976 | |||
3977 | usb_set_intfdata(intf, dev); | ||
3978 | |||
3979 | - for (i = 0; i < MAX_NET_DEVICES; i++) | ||
3980 | - kvaser_usb_send_simple_msg(dev, CMD_RESET_CHIP, i); | ||
3981 | - | ||
3982 | err = kvaser_usb_get_software_info(dev); | ||
3983 | if (err) { | ||
3984 | dev_err(&intf->dev, | ||
3985 | diff --git a/drivers/net/ethernet/atheros/alx/main.c b/drivers/net/ethernet/atheros/alx/main.c | ||
3986 | index e398eda07298..c8af3ce3ea38 100644 | ||
3987 | --- a/drivers/net/ethernet/atheros/alx/main.c | ||
3988 | +++ b/drivers/net/ethernet/atheros/alx/main.c | ||
3989 | @@ -184,15 +184,16 @@ static void alx_schedule_reset(struct alx_priv *alx) | ||
3990 | schedule_work(&alx->reset_wk); | ||
3991 | } | ||
3992 | |||
3993 | -static bool alx_clean_rx_irq(struct alx_priv *alx, int budget) | ||
3994 | +static int alx_clean_rx_irq(struct alx_priv *alx, int budget) | ||
3995 | { | ||
3996 | struct alx_rx_queue *rxq = &alx->rxq; | ||
3997 | struct alx_rrd *rrd; | ||
3998 | struct alx_buffer *rxb; | ||
3999 | struct sk_buff *skb; | ||
4000 | u16 length, rfd_cleaned = 0; | ||
4001 | + int work = 0; | ||
4002 | |||
4003 | - while (budget > 0) { | ||
4004 | + while (work < budget) { | ||
4005 | rrd = &rxq->rrd[rxq->rrd_read_idx]; | ||
4006 | if (!(rrd->word3 & cpu_to_le32(1 << RRD_UPDATED_SHIFT))) | ||
4007 | break; | ||
4008 | @@ -203,7 +204,7 @@ static bool alx_clean_rx_irq(struct alx_priv *alx, int budget) | ||
4009 | ALX_GET_FIELD(le32_to_cpu(rrd->word0), | ||
4010 | RRD_NOR) != 1) { | ||
4011 | alx_schedule_reset(alx); | ||
4012 | - return 0; | ||
4013 | + return work; | ||
4014 | } | ||
4015 | |||
4016 | rxb = &rxq->bufs[rxq->read_idx]; | ||
4017 | @@ -243,7 +244,7 @@ static bool alx_clean_rx_irq(struct alx_priv *alx, int budget) | ||
4018 | } | ||
4019 | |||
4020 | napi_gro_receive(&alx->napi, skb); | ||
4021 | - budget--; | ||
4022 | + work++; | ||
4023 | |||
4024 | next_pkt: | ||
4025 | if (++rxq->read_idx == alx->rx_ringsz) | ||
4026 | @@ -258,21 +259,22 @@ next_pkt: | ||
4027 | if (rfd_cleaned) | ||
4028 | alx_refill_rx_ring(alx, GFP_ATOMIC); | ||
4029 | |||
4030 | - return budget > 0; | ||
4031 | + return work; | ||
4032 | } | ||
4033 | |||
4034 | static int alx_poll(struct napi_struct *napi, int budget) | ||
4035 | { | ||
4036 | struct alx_priv *alx = container_of(napi, struct alx_priv, napi); | ||
4037 | struct alx_hw *hw = &alx->hw; | ||
4038 | - bool complete = true; | ||
4039 | unsigned long flags; | ||
4040 | + bool tx_complete; | ||
4041 | + int work; | ||
4042 | |||
4043 | - complete = alx_clean_tx_irq(alx) && | ||
4044 | - alx_clean_rx_irq(alx, budget); | ||
4045 | + tx_complete = alx_clean_tx_irq(alx); | ||
4046 | + work = alx_clean_rx_irq(alx, budget); | ||
4047 | |||
4048 | - if (!complete) | ||
4049 | - return 1; | ||
4050 | + if (!tx_complete || work == budget) | ||
4051 | + return budget; | ||
4052 | |||
4053 | napi_complete(&alx->napi); | ||
4054 | |||
4055 | @@ -284,7 +286,7 @@ static int alx_poll(struct napi_struct *napi, int budget) | ||
4056 | |||
4057 | alx_post_write(hw); | ||
4058 | |||
4059 | - return 0; | ||
4060 | + return work; | ||
4061 | } | ||
4062 | |||
4063 | static irqreturn_t alx_intr_handle(struct alx_priv *alx, u32 intr) | ||
4064 | diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c | ||
4065 | index 77f8f836cbbe..5748542f6717 100644 | ||
4066 | --- a/drivers/net/ethernet/broadcom/tg3.c | ||
4067 | +++ b/drivers/net/ethernet/broadcom/tg3.c | ||
4068 | @@ -17789,23 +17789,6 @@ static int tg3_init_one(struct pci_dev *pdev, | ||
4069 | goto err_out_apeunmap; | ||
4070 | } | ||
4071 | |||
4072 | - /* | ||
4073 | - * Reset chip in case UNDI or EFI driver did not shutdown | ||
4074 | - * DMA self test will enable WDMAC and we'll see (spurious) | ||
4075 | - * pending DMA on the PCI bus at that point. | ||
4076 | - */ | ||
4077 | - if ((tr32(HOSTCC_MODE) & HOSTCC_MODE_ENABLE) || | ||
4078 | - (tr32(WDMAC_MODE) & WDMAC_MODE_ENABLE)) { | ||
4079 | - tw32(MEMARB_MODE, MEMARB_MODE_ENABLE); | ||
4080 | - tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); | ||
4081 | - } | ||
4082 | - | ||
4083 | - err = tg3_test_dma(tp); | ||
4084 | - if (err) { | ||
4085 | - dev_err(&pdev->dev, "DMA engine test failed, aborting\n"); | ||
4086 | - goto err_out_apeunmap; | ||
4087 | - } | ||
4088 | - | ||
4089 | intmbx = MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW; | ||
4090 | rcvmbx = MAILBOX_RCVRET_CON_IDX_0 + TG3_64BIT_REG_LOW; | ||
4091 | sndmbx = MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW; | ||
4092 | @@ -17850,6 +17833,23 @@ static int tg3_init_one(struct pci_dev *pdev, | ||
4093 | sndmbx += 0xc; | ||
4094 | } | ||
4095 | |||
4096 | + /* | ||
4097 | + * Reset chip in case UNDI or EFI driver did not shutdown | ||
4098 | + * DMA self test will enable WDMAC and we'll see (spurious) | ||
4099 | + * pending DMA on the PCI bus at that point. | ||
4100 | + */ | ||
4101 | + if ((tr32(HOSTCC_MODE) & HOSTCC_MODE_ENABLE) || | ||
4102 | + (tr32(WDMAC_MODE) & WDMAC_MODE_ENABLE)) { | ||
4103 | + tw32(MEMARB_MODE, MEMARB_MODE_ENABLE); | ||
4104 | + tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); | ||
4105 | + } | ||
4106 | + | ||
4107 | + err = tg3_test_dma(tp); | ||
4108 | + if (err) { | ||
4109 | + dev_err(&pdev->dev, "DMA engine test failed, aborting\n"); | ||
4110 | + goto err_out_apeunmap; | ||
4111 | + } | ||
4112 | + | ||
4113 | tg3_init_coal(tp); | ||
4114 | |||
4115 | pci_set_drvdata(pdev, dev); | ||
4116 | diff --git a/drivers/net/ethernet/cisco/enic/enic_main.c b/drivers/net/ethernet/cisco/enic/enic_main.c | ||
4117 | index 73cf1653a4a3..167cd8ede397 100644 | ||
4118 | --- a/drivers/net/ethernet/cisco/enic/enic_main.c | ||
4119 | +++ b/drivers/net/ethernet/cisco/enic/enic_main.c | ||
4120 | @@ -1059,10 +1059,14 @@ static void enic_rq_indicate_buf(struct vnic_rq *rq, | ||
4121 | PKT_HASH_TYPE_L4 : PKT_HASH_TYPE_L3); | ||
4122 | } | ||
4123 | |||
4124 | - if ((netdev->features & NETIF_F_RXCSUM) && !csum_not_calc) { | ||
4125 | - skb->csum = htons(checksum); | ||
4126 | - skb->ip_summed = CHECKSUM_COMPLETE; | ||
4127 | - } | ||
4128 | + /* Hardware does not provide whole packet checksum. It only | ||
4129 | + * provides pseudo checksum. Since hw validates the packet | ||
4130 | + * checksum but not provide us the checksum value. use | ||
4131 | + * CHECSUM_UNNECESSARY. | ||
4132 | + */ | ||
4133 | + if ((netdev->features & NETIF_F_RXCSUM) && tcp_udp_csum_ok && | ||
4134 | + ipv4_csum_ok) | ||
4135 | + skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
4136 | |||
4137 | if (vlan_stripped) | ||
4138 | __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), vlan_tci); | ||
4139 | diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c | ||
4140 | index 597c463e384d..d2975fa7e549 100644 | ||
4141 | --- a/drivers/net/ethernet/emulex/benet/be_main.c | ||
4142 | +++ b/drivers/net/ethernet/emulex/benet/be_main.c | ||
4143 | @@ -4427,9 +4427,11 @@ static void be_del_vxlan_port(struct net_device *netdev, sa_family_t sa_family, | ||
4144 | be16_to_cpu(port)); | ||
4145 | } | ||
4146 | |||
4147 | -static bool be_gso_check(struct sk_buff *skb, struct net_device *dev) | ||
4148 | +static netdev_features_t be_features_check(struct sk_buff *skb, | ||
4149 | + struct net_device *dev, | ||
4150 | + netdev_features_t features) | ||
4151 | { | ||
4152 | - return vxlan_gso_check(skb); | ||
4153 | + return vxlan_features_check(skb, features); | ||
4154 | } | ||
4155 | #endif | ||
4156 | |||
4157 | @@ -4460,7 +4462,7 @@ static const struct net_device_ops be_netdev_ops = { | ||
4158 | #ifdef CONFIG_BE2NET_VXLAN | ||
4159 | .ndo_add_vxlan_port = be_add_vxlan_port, | ||
4160 | .ndo_del_vxlan_port = be_del_vxlan_port, | ||
4161 | - .ndo_gso_check = be_gso_check, | ||
4162 | + .ndo_features_check = be_features_check, | ||
4163 | #endif | ||
4164 | }; | ||
4165 | |||
4166 | diff --git a/drivers/net/ethernet/intel/Kconfig b/drivers/net/ethernet/intel/Kconfig | ||
4167 | index 5b8300a32bf5..4d61ef50b465 100644 | ||
4168 | --- a/drivers/net/ethernet/intel/Kconfig | ||
4169 | +++ b/drivers/net/ethernet/intel/Kconfig | ||
4170 | @@ -281,6 +281,17 @@ config I40E_DCB | ||
4171 | |||
4172 | If unsure, say N. | ||
4173 | |||
4174 | +config I40E_FCOE | ||
4175 | + bool "Fibre Channel over Ethernet (FCoE)" | ||
4176 | + default n | ||
4177 | + depends on I40E && DCB && FCOE | ||
4178 | + ---help--- | ||
4179 | + Say Y here if you want to use Fibre Channel over Ethernet (FCoE) | ||
4180 | + in the driver. This will create new netdev for exclusive FCoE | ||
4181 | + use with XL710 FCoE offloads enabled. | ||
4182 | + | ||
4183 | + If unsure, say N. | ||
4184 | + | ||
4185 | config I40EVF | ||
4186 | tristate "Intel(R) XL710 X710 Virtual Function Ethernet support" | ||
4187 | depends on PCI_MSI | ||
4188 | diff --git a/drivers/net/ethernet/intel/i40e/Makefile b/drivers/net/ethernet/intel/i40e/Makefile | ||
4189 | index 4b94ddb29c24..c40581999121 100644 | ||
4190 | --- a/drivers/net/ethernet/intel/i40e/Makefile | ||
4191 | +++ b/drivers/net/ethernet/intel/i40e/Makefile | ||
4192 | @@ -44,4 +44,4 @@ i40e-objs := i40e_main.o \ | ||
4193 | i40e_virtchnl_pf.o | ||
4194 | |||
4195 | i40e-$(CONFIG_I40E_DCB) += i40e_dcb.o i40e_dcb_nl.o | ||
4196 | -i40e-$(CONFIG_FCOE:m=y) += i40e_fcoe.o | ||
4197 | +i40e-$(CONFIG_I40E_FCOE) += i40e_fcoe.o | ||
4198 | diff --git a/drivers/net/ethernet/intel/i40e/i40e_osdep.h b/drivers/net/ethernet/intel/i40e/i40e_osdep.h | ||
4199 | index 045b5c4b98b3..ad802dd0f67a 100644 | ||
4200 | --- a/drivers/net/ethernet/intel/i40e/i40e_osdep.h | ||
4201 | +++ b/drivers/net/ethernet/intel/i40e/i40e_osdep.h | ||
4202 | @@ -78,7 +78,7 @@ do { \ | ||
4203 | } while (0) | ||
4204 | |||
4205 | typedef enum i40e_status_code i40e_status; | ||
4206 | -#if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) | ||
4207 | +#ifdef CONFIG_I40E_FCOE | ||
4208 | #define I40E_FCOE | ||
4209 | -#endif /* CONFIG_FCOE or CONFIG_FCOE_MODULE */ | ||
4210 | +#endif | ||
4211 | #endif /* _I40E_OSDEP_H_ */ | ||
4212 | diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c | ||
4213 | index 4d69e382b4e5..6bdaa313e7ea 100644 | ||
4214 | --- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c | ||
4215 | +++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c | ||
4216 | @@ -1569,8 +1569,15 @@ int mlx4_en_start_port(struct net_device *dev) | ||
4217 | mlx4_en_free_affinity_hint(priv, i); | ||
4218 | goto cq_err; | ||
4219 | } | ||
4220 | - for (j = 0; j < cq->size; j++) | ||
4221 | - cq->buf[j].owner_sr_opcode = MLX4_CQE_OWNER_MASK; | ||
4222 | + | ||
4223 | + for (j = 0; j < cq->size; j++) { | ||
4224 | + struct mlx4_cqe *cqe = NULL; | ||
4225 | + | ||
4226 | + cqe = mlx4_en_get_cqe(cq->buf, j, priv->cqe_size) + | ||
4227 | + priv->cqe_factor; | ||
4228 | + cqe->owner_sr_opcode = MLX4_CQE_OWNER_MASK; | ||
4229 | + } | ||
4230 | + | ||
4231 | err = mlx4_en_set_cq_moder(priv, cq); | ||
4232 | if (err) { | ||
4233 | en_err(priv, "Failed setting cq moderation parameters\n"); | ||
4234 | @@ -2356,9 +2363,11 @@ static void mlx4_en_del_vxlan_port(struct net_device *dev, | ||
4235 | queue_work(priv->mdev->workqueue, &priv->vxlan_del_task); | ||
4236 | } | ||
4237 | |||
4238 | -static bool mlx4_en_gso_check(struct sk_buff *skb, struct net_device *dev) | ||
4239 | +static netdev_features_t mlx4_en_features_check(struct sk_buff *skb, | ||
4240 | + struct net_device *dev, | ||
4241 | + netdev_features_t features) | ||
4242 | { | ||
4243 | - return vxlan_gso_check(skb); | ||
4244 | + return vxlan_features_check(skb, features); | ||
4245 | } | ||
4246 | #endif | ||
4247 | |||
4248 | @@ -2391,7 +2400,7 @@ static const struct net_device_ops mlx4_netdev_ops = { | ||
4249 | #ifdef CONFIG_MLX4_EN_VXLAN | ||
4250 | .ndo_add_vxlan_port = mlx4_en_add_vxlan_port, | ||
4251 | .ndo_del_vxlan_port = mlx4_en_del_vxlan_port, | ||
4252 | - .ndo_gso_check = mlx4_en_gso_check, | ||
4253 | + .ndo_features_check = mlx4_en_features_check, | ||
4254 | #endif | ||
4255 | }; | ||
4256 | |||
4257 | @@ -2425,7 +2434,7 @@ static const struct net_device_ops mlx4_netdev_ops_master = { | ||
4258 | #ifdef CONFIG_MLX4_EN_VXLAN | ||
4259 | .ndo_add_vxlan_port = mlx4_en_add_vxlan_port, | ||
4260 | .ndo_del_vxlan_port = mlx4_en_del_vxlan_port, | ||
4261 | - .ndo_gso_check = mlx4_en_gso_check, | ||
4262 | + .ndo_features_check = mlx4_en_features_check, | ||
4263 | #endif | ||
4264 | }; | ||
4265 | |||
4266 | diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c | ||
4267 | index 454d9fea640e..11ff28b5fca3 100644 | ||
4268 | --- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c | ||
4269 | +++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c | ||
4270 | @@ -954,7 +954,17 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev) | ||
4271 | tx_desc->ctrl.owner_opcode = op_own; | ||
4272 | if (send_doorbell) { | ||
4273 | wmb(); | ||
4274 | - iowrite32(ring->doorbell_qpn, | ||
4275 | + /* Since there is no iowrite*_native() that writes the | ||
4276 | + * value as is, without byteswapping - using the one | ||
4277 | + * the doesn't do byteswapping in the relevant arch | ||
4278 | + * endianness. | ||
4279 | + */ | ||
4280 | +#if defined(__LITTLE_ENDIAN) | ||
4281 | + iowrite32( | ||
4282 | +#else | ||
4283 | + iowrite32be( | ||
4284 | +#endif | ||
4285 | + ring->doorbell_qpn, | ||
4286 | ring->bf.uar->map + MLX4_SEND_DOORBELL); | ||
4287 | } else { | ||
4288 | ring->xmit_more++; | ||
4289 | diff --git a/drivers/net/ethernet/mellanox/mlx4/fw.c b/drivers/net/ethernet/mellanox/mlx4/fw.c | ||
4290 | index 2e88a235e26b..5f1228794328 100644 | ||
4291 | --- a/drivers/net/ethernet/mellanox/mlx4/fw.c | ||
4292 | +++ b/drivers/net/ethernet/mellanox/mlx4/fw.c | ||
4293 | @@ -1647,8 +1647,8 @@ int mlx4_QUERY_HCA(struct mlx4_dev *dev, | ||
4294 | /* CX3 is capable of extending CQEs\EQEs to strides larger than 64B */ | ||
4295 | MLX4_GET(byte_field, outbox, INIT_HCA_EQE_CQE_STRIDE_OFFSET); | ||
4296 | if (byte_field) { | ||
4297 | - param->dev_cap_enabled |= MLX4_DEV_CAP_64B_EQE_ENABLED; | ||
4298 | - param->dev_cap_enabled |= MLX4_DEV_CAP_64B_CQE_ENABLED; | ||
4299 | + param->dev_cap_enabled |= MLX4_DEV_CAP_EQE_STRIDE_ENABLED; | ||
4300 | + param->dev_cap_enabled |= MLX4_DEV_CAP_CQE_STRIDE_ENABLED; | ||
4301 | param->cqe_size = 1 << ((byte_field & | ||
4302 | MLX4_CQE_SIZE_MASK_STRIDE) + 5); | ||
4303 | param->eqe_size = 1 << (((byte_field & | ||
4304 | diff --git a/drivers/net/ethernet/mellanox/mlx4/mr.c b/drivers/net/ethernet/mellanox/mlx4/mr.c | ||
4305 | index 193a6adb5d04..b7cdef0aebd6 100644 | ||
4306 | --- a/drivers/net/ethernet/mellanox/mlx4/mr.c | ||
4307 | +++ b/drivers/net/ethernet/mellanox/mlx4/mr.c | ||
4308 | @@ -590,6 +590,7 @@ EXPORT_SYMBOL_GPL(mlx4_mr_free); | ||
4309 | void mlx4_mr_rereg_mem_cleanup(struct mlx4_dev *dev, struct mlx4_mr *mr) | ||
4310 | { | ||
4311 | mlx4_mtt_cleanup(dev, &mr->mtt); | ||
4312 | + mr->mtt.order = -1; | ||
4313 | } | ||
4314 | EXPORT_SYMBOL_GPL(mlx4_mr_rereg_mem_cleanup); | ||
4315 | |||
4316 | @@ -599,14 +600,14 @@ int mlx4_mr_rereg_mem_write(struct mlx4_dev *dev, struct mlx4_mr *mr, | ||
4317 | { | ||
4318 | int err; | ||
4319 | |||
4320 | - mpt_entry->start = cpu_to_be64(iova); | ||
4321 | - mpt_entry->length = cpu_to_be64(size); | ||
4322 | - mpt_entry->entity_size = cpu_to_be32(page_shift); | ||
4323 | - | ||
4324 | err = mlx4_mtt_init(dev, npages, page_shift, &mr->mtt); | ||
4325 | if (err) | ||
4326 | return err; | ||
4327 | |||
4328 | + mpt_entry->start = cpu_to_be64(mr->iova); | ||
4329 | + mpt_entry->length = cpu_to_be64(mr->size); | ||
4330 | + mpt_entry->entity_size = cpu_to_be32(mr->mtt.page_shift); | ||
4331 | + | ||
4332 | mpt_entry->pd_flags &= cpu_to_be32(MLX4_MPT_PD_MASK | | ||
4333 | MLX4_MPT_PD_FLAG_EN_INV); | ||
4334 | mpt_entry->flags &= cpu_to_be32(MLX4_MPT_FLAG_FREE | | ||
4335 | diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | ||
4336 | index a913b3ad2f89..477a5d33d79c 100644 | ||
4337 | --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | ||
4338 | +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | ||
4339 | @@ -504,9 +504,11 @@ static void qlcnic_del_vxlan_port(struct net_device *netdev, | ||
4340 | adapter->flags |= QLCNIC_DEL_VXLAN_PORT; | ||
4341 | } | ||
4342 | |||
4343 | -static bool qlcnic_gso_check(struct sk_buff *skb, struct net_device *dev) | ||
4344 | +static netdev_features_t qlcnic_features_check(struct sk_buff *skb, | ||
4345 | + struct net_device *dev, | ||
4346 | + netdev_features_t features) | ||
4347 | { | ||
4348 | - return vxlan_gso_check(skb); | ||
4349 | + return vxlan_features_check(skb, features); | ||
4350 | } | ||
4351 | #endif | ||
4352 | |||
4353 | @@ -531,7 +533,7 @@ static const struct net_device_ops qlcnic_netdev_ops = { | ||
4354 | #ifdef CONFIG_QLCNIC_VXLAN | ||
4355 | .ndo_add_vxlan_port = qlcnic_add_vxlan_port, | ||
4356 | .ndo_del_vxlan_port = qlcnic_del_vxlan_port, | ||
4357 | - .ndo_gso_check = qlcnic_gso_check, | ||
4358 | + .ndo_features_check = qlcnic_features_check, | ||
4359 | #endif | ||
4360 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
4361 | .ndo_poll_controller = qlcnic_poll_controller, | ||
4362 | diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c | ||
4363 | index c560f9aeb55d..64d1cef4cda1 100644 | ||
4364 | --- a/drivers/net/ethernet/ti/cpsw.c | ||
4365 | +++ b/drivers/net/ethernet/ti/cpsw.c | ||
4366 | @@ -610,7 +610,7 @@ static void cpsw_set_promiscious(struct net_device *ndev, bool enable) | ||
4367 | |||
4368 | /* Clear all mcast from ALE */ | ||
4369 | cpsw_ale_flush_multicast(ale, ALE_ALL_PORTS << | ||
4370 | - priv->host_port); | ||
4371 | + priv->host_port, -1); | ||
4372 | |||
4373 | /* Flood All Unicast Packets to Host port */ | ||
4374 | cpsw_ale_control_set(ale, 0, ALE_P0_UNI_FLOOD, 1); | ||
4375 | @@ -634,6 +634,12 @@ static void cpsw_set_promiscious(struct net_device *ndev, bool enable) | ||
4376 | static void cpsw_ndo_set_rx_mode(struct net_device *ndev) | ||
4377 | { | ||
4378 | struct cpsw_priv *priv = netdev_priv(ndev); | ||
4379 | + int vid; | ||
4380 | + | ||
4381 | + if (priv->data.dual_emac) | ||
4382 | + vid = priv->slaves[priv->emac_port].port_vlan; | ||
4383 | + else | ||
4384 | + vid = priv->data.default_vlan; | ||
4385 | |||
4386 | if (ndev->flags & IFF_PROMISC) { | ||
4387 | /* Enable promiscuous mode */ | ||
4388 | @@ -649,7 +655,8 @@ static void cpsw_ndo_set_rx_mode(struct net_device *ndev) | ||
4389 | cpsw_ale_set_allmulti(priv->ale, priv->ndev->flags & IFF_ALLMULTI); | ||
4390 | |||
4391 | /* Clear all mcast from ALE */ | ||
4392 | - cpsw_ale_flush_multicast(priv->ale, ALE_ALL_PORTS << priv->host_port); | ||
4393 | + cpsw_ale_flush_multicast(priv->ale, ALE_ALL_PORTS << priv->host_port, | ||
4394 | + vid); | ||
4395 | |||
4396 | if (!netdev_mc_empty(ndev)) { | ||
4397 | struct netdev_hw_addr *ha; | ||
4398 | @@ -757,6 +764,14 @@ requeue: | ||
4399 | static irqreturn_t cpsw_interrupt(int irq, void *dev_id) | ||
4400 | { | ||
4401 | struct cpsw_priv *priv = dev_id; | ||
4402 | + int value = irq - priv->irqs_table[0]; | ||
4403 | + | ||
4404 | + /* NOTICE: Ending IRQ here. The trick with the 'value' variable above | ||
4405 | + * is to make sure we will always write the correct value to the EOI | ||
4406 | + * register. Namely 0 for RX_THRESH Interrupt, 1 for RX Interrupt, 2 | ||
4407 | + * for TX Interrupt and 3 for MISC Interrupt. | ||
4408 | + */ | ||
4409 | + cpdma_ctlr_eoi(priv->dma, value); | ||
4410 | |||
4411 | cpsw_intr_disable(priv); | ||
4412 | if (priv->irq_enabled == true) { | ||
4413 | @@ -786,8 +801,6 @@ static int cpsw_poll(struct napi_struct *napi, int budget) | ||
4414 | int num_tx, num_rx; | ||
4415 | |||
4416 | num_tx = cpdma_chan_process(priv->txch, 128); | ||
4417 | - if (num_tx) | ||
4418 | - cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_TX); | ||
4419 | |||
4420 | num_rx = cpdma_chan_process(priv->rxch, budget); | ||
4421 | if (num_rx < budget) { | ||
4422 | @@ -795,7 +808,6 @@ static int cpsw_poll(struct napi_struct *napi, int budget) | ||
4423 | |||
4424 | napi_complete(napi); | ||
4425 | cpsw_intr_enable(priv); | ||
4426 | - cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_RX); | ||
4427 | prim_cpsw = cpsw_get_slave_priv(priv, 0); | ||
4428 | if (prim_cpsw->irq_enabled == false) { | ||
4429 | prim_cpsw->irq_enabled = true; | ||
4430 | @@ -1310,8 +1322,6 @@ static int cpsw_ndo_open(struct net_device *ndev) | ||
4431 | napi_enable(&priv->napi); | ||
4432 | cpdma_ctlr_start(priv->dma); | ||
4433 | cpsw_intr_enable(priv); | ||
4434 | - cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_RX); | ||
4435 | - cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_TX); | ||
4436 | |||
4437 | prim_cpsw = cpsw_get_slave_priv(priv, 0); | ||
4438 | if (prim_cpsw->irq_enabled == false) { | ||
4439 | @@ -1578,9 +1588,6 @@ static void cpsw_ndo_tx_timeout(struct net_device *ndev) | ||
4440 | cpdma_chan_start(priv->txch); | ||
4441 | cpdma_ctlr_int_ctrl(priv->dma, true); | ||
4442 | cpsw_intr_enable(priv); | ||
4443 | - cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_RX); | ||
4444 | - cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_TX); | ||
4445 | - | ||
4446 | } | ||
4447 | |||
4448 | static int cpsw_ndo_set_mac_address(struct net_device *ndev, void *p) | ||
4449 | @@ -1620,9 +1627,6 @@ static void cpsw_ndo_poll_controller(struct net_device *ndev) | ||
4450 | cpsw_interrupt(ndev->irq, priv); | ||
4451 | cpdma_ctlr_int_ctrl(priv->dma, true); | ||
4452 | cpsw_intr_enable(priv); | ||
4453 | - cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_RX); | ||
4454 | - cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_TX); | ||
4455 | - | ||
4456 | } | ||
4457 | #endif | ||
4458 | |||
4459 | diff --git a/drivers/net/ethernet/ti/cpsw_ale.c b/drivers/net/ethernet/ti/cpsw_ale.c | ||
4460 | index 097ebe7077ac..5246b3a18ff8 100644 | ||
4461 | --- a/drivers/net/ethernet/ti/cpsw_ale.c | ||
4462 | +++ b/drivers/net/ethernet/ti/cpsw_ale.c | ||
4463 | @@ -234,7 +234,7 @@ static void cpsw_ale_flush_mcast(struct cpsw_ale *ale, u32 *ale_entry, | ||
4464 | cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_FREE); | ||
4465 | } | ||
4466 | |||
4467 | -int cpsw_ale_flush_multicast(struct cpsw_ale *ale, int port_mask) | ||
4468 | +int cpsw_ale_flush_multicast(struct cpsw_ale *ale, int port_mask, int vid) | ||
4469 | { | ||
4470 | u32 ale_entry[ALE_ENTRY_WORDS]; | ||
4471 | int ret, idx; | ||
4472 | @@ -245,6 +245,14 @@ int cpsw_ale_flush_multicast(struct cpsw_ale *ale, int port_mask) | ||
4473 | if (ret != ALE_TYPE_ADDR && ret != ALE_TYPE_VLAN_ADDR) | ||
4474 | continue; | ||
4475 | |||
4476 | + /* if vid passed is -1 then remove all multicast entry from | ||
4477 | + * the table irrespective of vlan id, if a valid vlan id is | ||
4478 | + * passed then remove only multicast added to that vlan id. | ||
4479 | + * if vlan id doesn't match then move on to next entry. | ||
4480 | + */ | ||
4481 | + if (vid != -1 && cpsw_ale_get_vlan_id(ale_entry) != vid) | ||
4482 | + continue; | ||
4483 | + | ||
4484 | if (cpsw_ale_get_mcast(ale_entry)) { | ||
4485 | u8 addr[6]; | ||
4486 | |||
4487 | diff --git a/drivers/net/ethernet/ti/cpsw_ale.h b/drivers/net/ethernet/ti/cpsw_ale.h | ||
4488 | index c0d4127aa549..af1e7ecd87c6 100644 | ||
4489 | --- a/drivers/net/ethernet/ti/cpsw_ale.h | ||
4490 | +++ b/drivers/net/ethernet/ti/cpsw_ale.h | ||
4491 | @@ -92,7 +92,7 @@ void cpsw_ale_stop(struct cpsw_ale *ale); | ||
4492 | |||
4493 | int cpsw_ale_set_ageout(struct cpsw_ale *ale, int ageout); | ||
4494 | int cpsw_ale_flush(struct cpsw_ale *ale, int port_mask); | ||
4495 | -int cpsw_ale_flush_multicast(struct cpsw_ale *ale, int port_mask); | ||
4496 | +int cpsw_ale_flush_multicast(struct cpsw_ale *ale, int port_mask, int vid); | ||
4497 | int cpsw_ale_add_ucast(struct cpsw_ale *ale, u8 *addr, int port, | ||
4498 | int flags, u16 vid); | ||
4499 | int cpsw_ale_del_ucast(struct cpsw_ale *ale, u8 *addr, int port, | ||
4500 | diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c | ||
4501 | index 2368395d8ae5..9c505c4dbe04 100644 | ||
4502 | --- a/drivers/net/team/team.c | ||
4503 | +++ b/drivers/net/team/team.c | ||
4504 | @@ -629,6 +629,7 @@ static int team_change_mode(struct team *team, const char *kind) | ||
4505 | static void team_notify_peers_work(struct work_struct *work) | ||
4506 | { | ||
4507 | struct team *team; | ||
4508 | + int val; | ||
4509 | |||
4510 | team = container_of(work, struct team, notify_peers.dw.work); | ||
4511 | |||
4512 | @@ -636,9 +637,14 @@ static void team_notify_peers_work(struct work_struct *work) | ||
4513 | schedule_delayed_work(&team->notify_peers.dw, 0); | ||
4514 | return; | ||
4515 | } | ||
4516 | + val = atomic_dec_if_positive(&team->notify_peers.count_pending); | ||
4517 | + if (val < 0) { | ||
4518 | + rtnl_unlock(); | ||
4519 | + return; | ||
4520 | + } | ||
4521 | call_netdevice_notifiers(NETDEV_NOTIFY_PEERS, team->dev); | ||
4522 | rtnl_unlock(); | ||
4523 | - if (!atomic_dec_and_test(&team->notify_peers.count_pending)) | ||
4524 | + if (val) | ||
4525 | schedule_delayed_work(&team->notify_peers.dw, | ||
4526 | msecs_to_jiffies(team->notify_peers.interval)); | ||
4527 | } | ||
4528 | @@ -669,6 +675,7 @@ static void team_notify_peers_fini(struct team *team) | ||
4529 | static void team_mcast_rejoin_work(struct work_struct *work) | ||
4530 | { | ||
4531 | struct team *team; | ||
4532 | + int val; | ||
4533 | |||
4534 | team = container_of(work, struct team, mcast_rejoin.dw.work); | ||
4535 | |||
4536 | @@ -676,9 +683,14 @@ static void team_mcast_rejoin_work(struct work_struct *work) | ||
4537 | schedule_delayed_work(&team->mcast_rejoin.dw, 0); | ||
4538 | return; | ||
4539 | } | ||
4540 | + val = atomic_dec_if_positive(&team->mcast_rejoin.count_pending); | ||
4541 | + if (val < 0) { | ||
4542 | + rtnl_unlock(); | ||
4543 | + return; | ||
4544 | + } | ||
4545 | call_netdevice_notifiers(NETDEV_RESEND_IGMP, team->dev); | ||
4546 | rtnl_unlock(); | ||
4547 | - if (!atomic_dec_and_test(&team->mcast_rejoin.count_pending)) | ||
4548 | + if (val) | ||
4549 | schedule_delayed_work(&team->mcast_rejoin.dw, | ||
4550 | msecs_to_jiffies(team->mcast_rejoin.interval)); | ||
4551 | } | ||
4552 | diff --git a/drivers/net/wireless/iwlwifi/mvm/utils.c b/drivers/net/wireless/iwlwifi/mvm/utils.c | ||
4553 | index 8021f6eec27f..41ae16435300 100644 | ||
4554 | --- a/drivers/net/wireless/iwlwifi/mvm/utils.c | ||
4555 | +++ b/drivers/net/wireless/iwlwifi/mvm/utils.c | ||
4556 | @@ -665,7 +665,7 @@ bool iwl_mvm_rx_diversity_allowed(struct iwl_mvm *mvm) | ||
4557 | if (num_of_ant(mvm->fw->valid_rx_ant) == 1) | ||
4558 | return false; | ||
4559 | |||
4560 | - if (!mvm->cfg->rx_with_siso_diversity) | ||
4561 | + if (mvm->cfg->rx_with_siso_diversity) | ||
4562 | return false; | ||
4563 | |||
4564 | ieee80211_iterate_active_interfaces_atomic( | ||
4565 | diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c | ||
4566 | index 846a2e6e34d8..c70efb9a6e78 100644 | ||
4567 | --- a/drivers/net/wireless/rtlwifi/pci.c | ||
4568 | +++ b/drivers/net/wireless/rtlwifi/pci.c | ||
4569 | @@ -666,7 +666,8 @@ tx_status_ok: | ||
4570 | } | ||
4571 | |||
4572 | static int _rtl_pci_init_one_rxdesc(struct ieee80211_hw *hw, | ||
4573 | - u8 *entry, int rxring_idx, int desc_idx) | ||
4574 | + struct sk_buff *new_skb, u8 *entry, | ||
4575 | + int rxring_idx, int desc_idx) | ||
4576 | { | ||
4577 | struct rtl_priv *rtlpriv = rtl_priv(hw); | ||
4578 | struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); | ||
4579 | @@ -674,11 +675,15 @@ static int _rtl_pci_init_one_rxdesc(struct ieee80211_hw *hw, | ||
4580 | u8 tmp_one = 1; | ||
4581 | struct sk_buff *skb; | ||
4582 | |||
4583 | + if (likely(new_skb)) { | ||
4584 | + skb = new_skb; | ||
4585 | + goto remap; | ||
4586 | + } | ||
4587 | skb = dev_alloc_skb(rtlpci->rxbuffersize); | ||
4588 | if (!skb) | ||
4589 | return 0; | ||
4590 | - rtlpci->rx_ring[rxring_idx].rx_buf[desc_idx] = skb; | ||
4591 | |||
4592 | +remap: | ||
4593 | /* just set skb->cb to mapping addr for pci_unmap_single use */ | ||
4594 | *((dma_addr_t *)skb->cb) = | ||
4595 | pci_map_single(rtlpci->pdev, skb_tail_pointer(skb), | ||
4596 | @@ -686,6 +691,7 @@ static int _rtl_pci_init_one_rxdesc(struct ieee80211_hw *hw, | ||
4597 | bufferaddress = *((dma_addr_t *)skb->cb); | ||
4598 | if (pci_dma_mapping_error(rtlpci->pdev, bufferaddress)) | ||
4599 | return 0; | ||
4600 | + rtlpci->rx_ring[rxring_idx].rx_buf[desc_idx] = skb; | ||
4601 | if (rtlpriv->use_new_trx_flow) { | ||
4602 | rtlpriv->cfg->ops->set_desc(hw, (u8 *)entry, false, | ||
4603 | HW_DESC_RX_PREPARE, | ||
4604 | @@ -781,6 +787,7 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw) | ||
4605 | /*rx pkt */ | ||
4606 | struct sk_buff *skb = rtlpci->rx_ring[rxring_idx].rx_buf[ | ||
4607 | rtlpci->rx_ring[rxring_idx].idx]; | ||
4608 | + struct sk_buff *new_skb; | ||
4609 | |||
4610 | if (rtlpriv->use_new_trx_flow) { | ||
4611 | rx_remained_cnt = | ||
4612 | @@ -807,6 +814,13 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw) | ||
4613 | pci_unmap_single(rtlpci->pdev, *((dma_addr_t *)skb->cb), | ||
4614 | rtlpci->rxbuffersize, PCI_DMA_FROMDEVICE); | ||
4615 | |||
4616 | + /* get a new skb - if fail, old one will be reused */ | ||
4617 | + new_skb = dev_alloc_skb(rtlpci->rxbuffersize); | ||
4618 | + if (unlikely(!new_skb)) { | ||
4619 | + pr_err("Allocation of new skb failed in %s\n", | ||
4620 | + __func__); | ||
4621 | + goto no_new; | ||
4622 | + } | ||
4623 | if (rtlpriv->use_new_trx_flow) { | ||
4624 | buffer_desc = | ||
4625 | &rtlpci->rx_ring[rxring_idx].buffer_desc | ||
4626 | @@ -911,14 +925,16 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw) | ||
4627 | schedule_work(&rtlpriv->works.lps_change_work); | ||
4628 | } | ||
4629 | end: | ||
4630 | + skb = new_skb; | ||
4631 | +no_new: | ||
4632 | if (rtlpriv->use_new_trx_flow) { | ||
4633 | - _rtl_pci_init_one_rxdesc(hw, (u8 *)buffer_desc, | ||
4634 | + _rtl_pci_init_one_rxdesc(hw, skb, (u8 *)buffer_desc, | ||
4635 | rxring_idx, | ||
4636 | - rtlpci->rx_ring[rxring_idx].idx); | ||
4637 | + rtlpci->rx_ring[rxring_idx].idx); | ||
4638 | } else { | ||
4639 | - _rtl_pci_init_one_rxdesc(hw, (u8 *)pdesc, rxring_idx, | ||
4640 | + _rtl_pci_init_one_rxdesc(hw, skb, (u8 *)pdesc, | ||
4641 | + rxring_idx, | ||
4642 | rtlpci->rx_ring[rxring_idx].idx); | ||
4643 | - | ||
4644 | if (rtlpci->rx_ring[rxring_idx].idx == | ||
4645 | rtlpci->rxringcount - 1) | ||
4646 | rtlpriv->cfg->ops->set_desc(hw, (u8 *)pdesc, | ||
4647 | @@ -1307,7 +1323,7 @@ static int _rtl_pci_init_rx_ring(struct ieee80211_hw *hw, int rxring_idx) | ||
4648 | rtlpci->rx_ring[rxring_idx].idx = 0; | ||
4649 | for (i = 0; i < rtlpci->rxringcount; i++) { | ||
4650 | entry = &rtlpci->rx_ring[rxring_idx].buffer_desc[i]; | ||
4651 | - if (!_rtl_pci_init_one_rxdesc(hw, (u8 *)entry, | ||
4652 | + if (!_rtl_pci_init_one_rxdesc(hw, NULL, (u8 *)entry, | ||
4653 | rxring_idx, i)) | ||
4654 | return -ENOMEM; | ||
4655 | } | ||
4656 | @@ -1332,7 +1348,7 @@ static int _rtl_pci_init_rx_ring(struct ieee80211_hw *hw, int rxring_idx) | ||
4657 | |||
4658 | for (i = 0; i < rtlpci->rxringcount; i++) { | ||
4659 | entry = &rtlpci->rx_ring[rxring_idx].desc[i]; | ||
4660 | - if (!_rtl_pci_init_one_rxdesc(hw, (u8 *)entry, | ||
4661 | + if (!_rtl_pci_init_one_rxdesc(hw, NULL, (u8 *)entry, | ||
4662 | rxring_idx, i)) | ||
4663 | return -ENOMEM; | ||
4664 | } | ||
4665 | diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c b/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c | ||
4666 | index d2ec5160bbf0..5c646d5f7bb8 100644 | ||
4667 | --- a/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c | ||
4668 | +++ b/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c | ||
4669 | @@ -955,6 +955,7 @@ int rtl92ce_hw_init(struct ieee80211_hw *hw) | ||
4670 | local_save_flags(flags); | ||
4671 | local_irq_enable(); | ||
4672 | |||
4673 | + rtlhal->fw_ready = false; | ||
4674 | rtlpriv->intf_ops->disable_aspm(hw); | ||
4675 | rtstatus = _rtl92ce_init_mac(hw); | ||
4676 | if (!rtstatus) { | ||
4677 | @@ -971,6 +972,7 @@ int rtl92ce_hw_init(struct ieee80211_hw *hw) | ||
4678 | goto exit; | ||
4679 | } | ||
4680 | |||
4681 | + rtlhal->fw_ready = true; | ||
4682 | rtlhal->last_hmeboxnum = 0; | ||
4683 | rtl92c_phy_mac_config(hw); | ||
4684 | /* because last function modify RCR, so we update | ||
4685 | diff --git a/drivers/net/xen-netback/common.h b/drivers/net/xen-netback/common.h | ||
4686 | index 083ecc93fe5e..5f1fda44882b 100644 | ||
4687 | --- a/drivers/net/xen-netback/common.h | ||
4688 | +++ b/drivers/net/xen-netback/common.h | ||
4689 | @@ -230,6 +230,8 @@ struct xenvif { | ||
4690 | */ | ||
4691 | bool disabled; | ||
4692 | unsigned long status; | ||
4693 | + unsigned long drain_timeout; | ||
4694 | + unsigned long stall_timeout; | ||
4695 | |||
4696 | /* Queues */ | ||
4697 | struct xenvif_queue *queues; | ||
4698 | @@ -328,7 +330,7 @@ irqreturn_t xenvif_interrupt(int irq, void *dev_id); | ||
4699 | extern bool separate_tx_rx_irq; | ||
4700 | |||
4701 | extern unsigned int rx_drain_timeout_msecs; | ||
4702 | -extern unsigned int rx_drain_timeout_jiffies; | ||
4703 | +extern unsigned int rx_stall_timeout_msecs; | ||
4704 | extern unsigned int xenvif_max_queues; | ||
4705 | |||
4706 | #ifdef CONFIG_DEBUG_FS | ||
4707 | diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c | ||
4708 | index 895fe84011e7..d752d1c5c8bd 100644 | ||
4709 | --- a/drivers/net/xen-netback/interface.c | ||
4710 | +++ b/drivers/net/xen-netback/interface.c | ||
4711 | @@ -166,7 +166,7 @@ static int xenvif_start_xmit(struct sk_buff *skb, struct net_device *dev) | ||
4712 | goto drop; | ||
4713 | |||
4714 | cb = XENVIF_RX_CB(skb); | ||
4715 | - cb->expires = jiffies + rx_drain_timeout_jiffies; | ||
4716 | + cb->expires = jiffies + vif->drain_timeout; | ||
4717 | |||
4718 | xenvif_rx_queue_tail(queue, skb); | ||
4719 | xenvif_kick_thread(queue); | ||
4720 | @@ -414,6 +414,8 @@ struct xenvif *xenvif_alloc(struct device *parent, domid_t domid, | ||
4721 | vif->ip_csum = 1; | ||
4722 | vif->dev = dev; | ||
4723 | vif->disabled = false; | ||
4724 | + vif->drain_timeout = msecs_to_jiffies(rx_drain_timeout_msecs); | ||
4725 | + vif->stall_timeout = msecs_to_jiffies(rx_stall_timeout_msecs); | ||
4726 | |||
4727 | /* Start out with no queues. */ | ||
4728 | vif->queues = NULL; | ||
4729 | diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c | ||
4730 | index 6563f0713fc0..c39aace4f642 100644 | ||
4731 | --- a/drivers/net/xen-netback/netback.c | ||
4732 | +++ b/drivers/net/xen-netback/netback.c | ||
4733 | @@ -60,14 +60,12 @@ module_param(separate_tx_rx_irq, bool, 0644); | ||
4734 | */ | ||
4735 | unsigned int rx_drain_timeout_msecs = 10000; | ||
4736 | module_param(rx_drain_timeout_msecs, uint, 0444); | ||
4737 | -unsigned int rx_drain_timeout_jiffies; | ||
4738 | |||
4739 | /* The length of time before the frontend is considered unresponsive | ||
4740 | * because it isn't providing Rx slots. | ||
4741 | */ | ||
4742 | -static unsigned int rx_stall_timeout_msecs = 60000; | ||
4743 | +unsigned int rx_stall_timeout_msecs = 60000; | ||
4744 | module_param(rx_stall_timeout_msecs, uint, 0444); | ||
4745 | -static unsigned int rx_stall_timeout_jiffies; | ||
4746 | |||
4747 | unsigned int xenvif_max_queues; | ||
4748 | module_param_named(max_queues, xenvif_max_queues, uint, 0644); | ||
4749 | @@ -2022,7 +2020,7 @@ static bool xenvif_rx_queue_stalled(struct xenvif_queue *queue) | ||
4750 | return !queue->stalled | ||
4751 | && prod - cons < XEN_NETBK_RX_SLOTS_MAX | ||
4752 | && time_after(jiffies, | ||
4753 | - queue->last_rx_time + rx_stall_timeout_jiffies); | ||
4754 | + queue->last_rx_time + queue->vif->stall_timeout); | ||
4755 | } | ||
4756 | |||
4757 | static bool xenvif_rx_queue_ready(struct xenvif_queue *queue) | ||
4758 | @@ -2040,8 +2038,9 @@ static bool xenvif_have_rx_work(struct xenvif_queue *queue) | ||
4759 | { | ||
4760 | return (!skb_queue_empty(&queue->rx_queue) | ||
4761 | && xenvif_rx_ring_slots_available(queue, XEN_NETBK_RX_SLOTS_MAX)) | ||
4762 | - || xenvif_rx_queue_stalled(queue) | ||
4763 | - || xenvif_rx_queue_ready(queue) | ||
4764 | + || (queue->vif->stall_timeout && | ||
4765 | + (xenvif_rx_queue_stalled(queue) | ||
4766 | + || xenvif_rx_queue_ready(queue))) | ||
4767 | || kthread_should_stop() | ||
4768 | || queue->vif->disabled; | ||
4769 | } | ||
4770 | @@ -2094,6 +2093,9 @@ int xenvif_kthread_guest_rx(void *data) | ||
4771 | struct xenvif_queue *queue = data; | ||
4772 | struct xenvif *vif = queue->vif; | ||
4773 | |||
4774 | + if (!vif->stall_timeout) | ||
4775 | + xenvif_queue_carrier_on(queue); | ||
4776 | + | ||
4777 | for (;;) { | ||
4778 | xenvif_wait_for_rx_work(queue); | ||
4779 | |||
4780 | @@ -2120,10 +2122,12 @@ int xenvif_kthread_guest_rx(void *data) | ||
4781 | * while it's probably not responsive, drop the | ||
4782 | * carrier so packets are dropped earlier. | ||
4783 | */ | ||
4784 | - if (xenvif_rx_queue_stalled(queue)) | ||
4785 | - xenvif_queue_carrier_off(queue); | ||
4786 | - else if (xenvif_rx_queue_ready(queue)) | ||
4787 | - xenvif_queue_carrier_on(queue); | ||
4788 | + if (vif->stall_timeout) { | ||
4789 | + if (xenvif_rx_queue_stalled(queue)) | ||
4790 | + xenvif_queue_carrier_off(queue); | ||
4791 | + else if (xenvif_rx_queue_ready(queue)) | ||
4792 | + xenvif_queue_carrier_on(queue); | ||
4793 | + } | ||
4794 | |||
4795 | /* Queued packets may have foreign pages from other | ||
4796 | * domains. These cannot be queued indefinitely as | ||
4797 | @@ -2194,9 +2198,6 @@ static int __init netback_init(void) | ||
4798 | if (rc) | ||
4799 | goto failed_init; | ||
4800 | |||
4801 | - rx_drain_timeout_jiffies = msecs_to_jiffies(rx_drain_timeout_msecs); | ||
4802 | - rx_stall_timeout_jiffies = msecs_to_jiffies(rx_stall_timeout_msecs); | ||
4803 | - | ||
4804 | #ifdef CONFIG_DEBUG_FS | ||
4805 | xen_netback_dbg_root = debugfs_create_dir("xen-netback", NULL); | ||
4806 | if (IS_ERR_OR_NULL(xen_netback_dbg_root)) | ||
4807 | diff --git a/drivers/net/xen-netback/xenbus.c b/drivers/net/xen-netback/xenbus.c | ||
4808 | index fab0d4b42f58..c047282c4ee0 100644 | ||
4809 | --- a/drivers/net/xen-netback/xenbus.c | ||
4810 | +++ b/drivers/net/xen-netback/xenbus.c | ||
4811 | @@ -736,6 +736,7 @@ static void connect(struct backend_info *be) | ||
4812 | } | ||
4813 | |||
4814 | queue->remaining_credit = credit_bytes; | ||
4815 | + queue->credit_usec = credit_usec; | ||
4816 | |||
4817 | err = connect_rings(be, queue); | ||
4818 | if (err) { | ||
4819 | @@ -886,9 +887,15 @@ static int read_xenbus_vif_flags(struct backend_info *be) | ||
4820 | return -EOPNOTSUPP; | ||
4821 | |||
4822 | if (xenbus_scanf(XBT_NIL, dev->otherend, | ||
4823 | - "feature-rx-notify", "%d", &val) < 0 || val == 0) { | ||
4824 | - xenbus_dev_fatal(dev, -EINVAL, "feature-rx-notify is mandatory"); | ||
4825 | - return -EINVAL; | ||
4826 | + "feature-rx-notify", "%d", &val) < 0) | ||
4827 | + val = 0; | ||
4828 | + if (!val) { | ||
4829 | + /* - Reduce drain timeout to poll more frequently for | ||
4830 | + * Rx requests. | ||
4831 | + * - Disable Rx stall detection. | ||
4832 | + */ | ||
4833 | + be->vif->drain_timeout = msecs_to_jiffies(30); | ||
4834 | + be->vif->stall_timeout = 0; | ||
4835 | } | ||
4836 | |||
4837 | if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-sg", | ||
4838 | diff --git a/drivers/pinctrl/pinctrl-xway.c b/drivers/pinctrl/pinctrl-xway.c | ||
4839 | index 37040ab42890..fdff39ff5021 100644 | ||
4840 | --- a/drivers/pinctrl/pinctrl-xway.c | ||
4841 | +++ b/drivers/pinctrl/pinctrl-xway.c | ||
4842 | @@ -798,10 +798,8 @@ static int pinmux_xway_probe(struct platform_device *pdev) | ||
4843 | |||
4844 | /* load the gpio chip */ | ||
4845 | xway_chip.dev = &pdev->dev; | ||
4846 | - of_gpiochip_add(&xway_chip); | ||
4847 | ret = gpiochip_add(&xway_chip); | ||
4848 | if (ret) { | ||
4849 | - of_gpiochip_remove(&xway_chip); | ||
4850 | dev_err(&pdev->dev, "Failed to register gpio chip\n"); | ||
4851 | return ret; | ||
4852 | } | ||
4853 | diff --git a/drivers/platform/x86/asus-nb-wmi.c b/drivers/platform/x86/asus-nb-wmi.c | ||
4854 | index c1a6cd66af42..abdaed34c728 100644 | ||
4855 | --- a/drivers/platform/x86/asus-nb-wmi.c | ||
4856 | +++ b/drivers/platform/x86/asus-nb-wmi.c | ||
4857 | @@ -191,6 +191,15 @@ static const struct dmi_system_id asus_quirks[] = { | ||
4858 | }, | ||
4859 | { | ||
4860 | .callback = dmi_matched, | ||
4861 | + .ident = "ASUSTeK COMPUTER INC. X551CA", | ||
4862 | + .matches = { | ||
4863 | + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), | ||
4864 | + DMI_MATCH(DMI_PRODUCT_NAME, "X551CA"), | ||
4865 | + }, | ||
4866 | + .driver_data = &quirk_asus_wapf4, | ||
4867 | + }, | ||
4868 | + { | ||
4869 | + .callback = dmi_matched, | ||
4870 | .ident = "ASUSTeK COMPUTER INC. X55A", | ||
4871 | .matches = { | ||
4872 | DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), | ||
4873 | diff --git a/drivers/platform/x86/hp_accel.c b/drivers/platform/x86/hp_accel.c | ||
4874 | index 6bec745b6b92..10ce6cba4455 100644 | ||
4875 | --- a/drivers/platform/x86/hp_accel.c | ||
4876 | +++ b/drivers/platform/x86/hp_accel.c | ||
4877 | @@ -246,6 +246,7 @@ static const struct dmi_system_id lis3lv02d_dmi_ids[] = { | ||
4878 | AXIS_DMI_MATCH("HPB64xx", "HP ProBook 64", xy_swap), | ||
4879 | AXIS_DMI_MATCH("HPB64xx", "HP EliteBook 84", xy_swap), | ||
4880 | AXIS_DMI_MATCH("HPB65xx", "HP ProBook 65", x_inverted), | ||
4881 | + AXIS_DMI_MATCH("HPZBook15", "HP ZBook 15", x_inverted), | ||
4882 | { NULL, } | ||
4883 | /* Laptop models without axis info (yet): | ||
4884 | * "NC6910" "HP Compaq 6910" | ||
4885 | diff --git a/drivers/reset/reset-sunxi.c b/drivers/reset/reset-sunxi.c | ||
4886 | index a94e7a7820b4..51272b5d7552 100644 | ||
4887 | --- a/drivers/reset/reset-sunxi.c | ||
4888 | +++ b/drivers/reset/reset-sunxi.c | ||
4889 | @@ -102,6 +102,8 @@ static int sunxi_reset_init(struct device_node *np) | ||
4890 | goto err_alloc; | ||
4891 | } | ||
4892 | |||
4893 | + spin_lock_init(&data->lock); | ||
4894 | + | ||
4895 | data->rcdev.owner = THIS_MODULE; | ||
4896 | data->rcdev.nr_resets = size * 32; | ||
4897 | data->rcdev.ops = &sunxi_reset_ops; | ||
4898 | @@ -157,6 +159,8 @@ static int sunxi_reset_probe(struct platform_device *pdev) | ||
4899 | if (IS_ERR(data->membase)) | ||
4900 | return PTR_ERR(data->membase); | ||
4901 | |||
4902 | + spin_lock_init(&data->lock); | ||
4903 | + | ||
4904 | data->rcdev.owner = THIS_MODULE; | ||
4905 | data->rcdev.nr_resets = resource_size(res) * 32; | ||
4906 | data->rcdev.ops = &sunxi_reset_ops; | ||
4907 | diff --git a/drivers/scsi/mpt2sas/mpt2sas_transport.c b/drivers/scsi/mpt2sas/mpt2sas_transport.c | ||
4908 | index 0d1d06488a28..e689bf20a3ea 100644 | ||
4909 | --- a/drivers/scsi/mpt2sas/mpt2sas_transport.c | ||
4910 | +++ b/drivers/scsi/mpt2sas/mpt2sas_transport.c | ||
4911 | @@ -1006,12 +1006,9 @@ mpt2sas_transport_update_links(struct MPT2SAS_ADAPTER *ioc, | ||
4912 | &mpt2sas_phy->remote_identify); | ||
4913 | _transport_add_phy_to_an_existing_port(ioc, sas_node, | ||
4914 | mpt2sas_phy, mpt2sas_phy->remote_identify.sas_address); | ||
4915 | - } else { | ||
4916 | + } else | ||
4917 | memset(&mpt2sas_phy->remote_identify, 0 , sizeof(struct | ||
4918 | sas_identify)); | ||
4919 | - _transport_del_phy_from_an_existing_port(ioc, sas_node, | ||
4920 | - mpt2sas_phy); | ||
4921 | - } | ||
4922 | |||
4923 | if (mpt2sas_phy->phy) | ||
4924 | mpt2sas_phy->phy->negotiated_linkrate = | ||
4925 | diff --git a/drivers/scsi/mpt3sas/mpt3sas_transport.c b/drivers/scsi/mpt3sas/mpt3sas_transport.c | ||
4926 | index d4bafaaebea9..3637ae6c0171 100644 | ||
4927 | --- a/drivers/scsi/mpt3sas/mpt3sas_transport.c | ||
4928 | +++ b/drivers/scsi/mpt3sas/mpt3sas_transport.c | ||
4929 | @@ -1003,12 +1003,9 @@ mpt3sas_transport_update_links(struct MPT3SAS_ADAPTER *ioc, | ||
4930 | &mpt3sas_phy->remote_identify); | ||
4931 | _transport_add_phy_to_an_existing_port(ioc, sas_node, | ||
4932 | mpt3sas_phy, mpt3sas_phy->remote_identify.sas_address); | ||
4933 | - } else { | ||
4934 | + } else | ||
4935 | memset(&mpt3sas_phy->remote_identify, 0 , sizeof(struct | ||
4936 | sas_identify)); | ||
4937 | - _transport_del_phy_from_an_existing_port(ioc, sas_node, | ||
4938 | - mpt3sas_phy); | ||
4939 | - } | ||
4940 | |||
4941 | if (mpt3sas_phy->phy) | ||
4942 | mpt3sas_phy->phy->negotiated_linkrate = | ||
4943 | diff --git a/drivers/scsi/scsi_devinfo.c b/drivers/scsi/scsi_devinfo.c | ||
4944 | index c1d04d4d3c6c..262ab837a704 100644 | ||
4945 | --- a/drivers/scsi/scsi_devinfo.c | ||
4946 | +++ b/drivers/scsi/scsi_devinfo.c | ||
4947 | @@ -211,6 +211,7 @@ static struct { | ||
4948 | {"Medion", "Flash XL MMC/SD", "2.6D", BLIST_FORCELUN}, | ||
4949 | {"MegaRAID", "LD", NULL, BLIST_FORCELUN}, | ||
4950 | {"MICROP", "4110", NULL, BLIST_NOTQ}, | ||
4951 | + {"MSFT", "Virtual HD", NULL, BLIST_NO_RSOC}, | ||
4952 | {"MYLEX", "DACARMRB", "*", BLIST_REPORTLUN2}, | ||
4953 | {"nCipher", "Fastness Crypto", NULL, BLIST_FORCELUN}, | ||
4954 | {"NAKAMICH", "MJ-4.8S", NULL, BLIST_FORCELUN | BLIST_SINGLELUN}, | ||
4955 | diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c | ||
4956 | index bc5ff6ff9c79..01a79473350a 100644 | ||
4957 | --- a/drivers/scsi/scsi_error.c | ||
4958 | +++ b/drivers/scsi/scsi_error.c | ||
4959 | @@ -1027,7 +1027,7 @@ retry: | ||
4960 | } | ||
4961 | /* signal not to enter either branch of the if () below */ | ||
4962 | timeleft = 0; | ||
4963 | - rtn = NEEDS_RETRY; | ||
4964 | + rtn = FAILED; | ||
4965 | } else { | ||
4966 | timeleft = wait_for_completion_timeout(&done, timeout); | ||
4967 | rtn = SUCCESS; | ||
4968 | @@ -1067,7 +1067,7 @@ retry: | ||
4969 | rtn = FAILED; | ||
4970 | break; | ||
4971 | } | ||
4972 | - } else if (!rtn) { | ||
4973 | + } else if (rtn != FAILED) { | ||
4974 | scsi_abort_eh_cmnd(scmd); | ||
4975 | rtn = FAILED; | ||
4976 | } | ||
4977 | diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c | ||
4978 | index 50a6e1ac8d9c..17fb0518c9c1 100644 | ||
4979 | --- a/drivers/scsi/scsi_lib.c | ||
4980 | +++ b/drivers/scsi/scsi_lib.c | ||
4981 | @@ -1829,7 +1829,9 @@ static int scsi_mq_prep_fn(struct request *req) | ||
4982 | |||
4983 | if (scsi_host_get_prot(shost)) { | ||
4984 | cmd->prot_sdb = (void *)sg + | ||
4985 | - shost->sg_tablesize * sizeof(struct scatterlist); | ||
4986 | + min_t(unsigned int, | ||
4987 | + shost->sg_tablesize, SCSI_MAX_SG_SEGMENTS) * | ||
4988 | + sizeof(struct scatterlist); | ||
4989 | memset(cmd->prot_sdb, 0, sizeof(struct scsi_data_buffer)); | ||
4990 | |||
4991 | cmd->prot_sdb->table.sgl = | ||
4992 | diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c | ||
4993 | index 733e5f759518..90af465359d6 100644 | ||
4994 | --- a/drivers/scsi/storvsc_drv.c | ||
4995 | +++ b/drivers/scsi/storvsc_drv.c | ||
4996 | @@ -1688,13 +1688,12 @@ static int storvsc_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *scmnd) | ||
4997 | if (ret == -EAGAIN) { | ||
4998 | /* no more space */ | ||
4999 | |||
5000 | - if (cmd_request->bounce_sgl_count) { | ||
5001 | + if (cmd_request->bounce_sgl_count) | ||
5002 | destroy_bounce_buffer(cmd_request->bounce_sgl, | ||
5003 | cmd_request->bounce_sgl_count); | ||
5004 | |||
5005 | - ret = SCSI_MLQUEUE_DEVICE_BUSY; | ||
5006 | - goto queue_error; | ||
5007 | - } | ||
5008 | + ret = SCSI_MLQUEUE_DEVICE_BUSY; | ||
5009 | + goto queue_error; | ||
5010 | } | ||
5011 | |||
5012 | return 0; | ||
5013 | diff --git a/drivers/target/iscsi/iscsi_target_login.c b/drivers/target/iscsi/iscsi_target_login.c | ||
5014 | index 480f2e0ecc11..18e2601527df 100644 | ||
5015 | --- a/drivers/target/iscsi/iscsi_target_login.c | ||
5016 | +++ b/drivers/target/iscsi/iscsi_target_login.c | ||
5017 | @@ -281,7 +281,6 @@ static int iscsi_login_zero_tsih_s1( | ||
5018 | { | ||
5019 | struct iscsi_session *sess = NULL; | ||
5020 | struct iscsi_login_req *pdu = (struct iscsi_login_req *)buf; | ||
5021 | - enum target_prot_op sup_pro_ops; | ||
5022 | int ret; | ||
5023 | |||
5024 | sess = kzalloc(sizeof(struct iscsi_session), GFP_KERNEL); | ||
5025 | @@ -343,9 +342,8 @@ static int iscsi_login_zero_tsih_s1( | ||
5026 | kfree(sess); | ||
5027 | return -ENOMEM; | ||
5028 | } | ||
5029 | - sup_pro_ops = conn->conn_transport->iscsit_get_sup_prot_ops(conn); | ||
5030 | |||
5031 | - sess->se_sess = transport_init_session(sup_pro_ops); | ||
5032 | + sess->se_sess = transport_init_session(TARGET_PROT_NORMAL); | ||
5033 | if (IS_ERR(sess->se_sess)) { | ||
5034 | iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR, | ||
5035 | ISCSI_LOGIN_STATUS_NO_RESOURCES); | ||
5036 | @@ -1204,6 +1202,9 @@ old_sess_out: | ||
5037 | conn->sock = NULL; | ||
5038 | } | ||
5039 | |||
5040 | + if (conn->conn_transport->iscsit_wait_conn) | ||
5041 | + conn->conn_transport->iscsit_wait_conn(conn); | ||
5042 | + | ||
5043 | if (conn->conn_transport->iscsit_free_conn) | ||
5044 | conn->conn_transport->iscsit_free_conn(conn); | ||
5045 | |||
5046 | @@ -1364,6 +1365,9 @@ static int __iscsi_target_login_thread(struct iscsi_np *np) | ||
5047 | } | ||
5048 | login->zero_tsih = zero_tsih; | ||
5049 | |||
5050 | + conn->sess->se_sess->sup_prot_ops = | ||
5051 | + conn->conn_transport->iscsit_get_sup_prot_ops(conn); | ||
5052 | + | ||
5053 | tpg = conn->tpg; | ||
5054 | if (!tpg) { | ||
5055 | pr_err("Unable to locate struct iscsi_conn->tpg\n"); | ||
5056 | diff --git a/drivers/target/iscsi/iscsi_target_util.c b/drivers/target/iscsi/iscsi_target_util.c | ||
5057 | index ce87ce9bdb9c..0b68c2ebce95 100644 | ||
5058 | --- a/drivers/target/iscsi/iscsi_target_util.c | ||
5059 | +++ b/drivers/target/iscsi/iscsi_target_util.c | ||
5060 | @@ -1358,15 +1358,15 @@ static int iscsit_do_tx_data( | ||
5061 | struct iscsi_conn *conn, | ||
5062 | struct iscsi_data_count *count) | ||
5063 | { | ||
5064 | - int data = count->data_length, total_tx = 0, tx_loop = 0, iov_len; | ||
5065 | + int ret, iov_len; | ||
5066 | struct kvec *iov_p; | ||
5067 | struct msghdr msg; | ||
5068 | |||
5069 | if (!conn || !conn->sock || !conn->conn_ops) | ||
5070 | return -1; | ||
5071 | |||
5072 | - if (data <= 0) { | ||
5073 | - pr_err("Data length is: %d\n", data); | ||
5074 | + if (count->data_length <= 0) { | ||
5075 | + pr_err("Data length is: %d\n", count->data_length); | ||
5076 | return -1; | ||
5077 | } | ||
5078 | |||
5079 | @@ -1375,20 +1375,16 @@ static int iscsit_do_tx_data( | ||
5080 | iov_p = count->iov; | ||
5081 | iov_len = count->iov_count; | ||
5082 | |||
5083 | - while (total_tx < data) { | ||
5084 | - tx_loop = kernel_sendmsg(conn->sock, &msg, iov_p, iov_len, | ||
5085 | - (data - total_tx)); | ||
5086 | - if (tx_loop <= 0) { | ||
5087 | - pr_debug("tx_loop: %d total_tx %d\n", | ||
5088 | - tx_loop, total_tx); | ||
5089 | - return tx_loop; | ||
5090 | - } | ||
5091 | - total_tx += tx_loop; | ||
5092 | - pr_debug("tx_loop: %d, total_tx: %d, data: %d\n", | ||
5093 | - tx_loop, total_tx, data); | ||
5094 | + ret = kernel_sendmsg(conn->sock, &msg, iov_p, iov_len, | ||
5095 | + count->data_length); | ||
5096 | + if (ret != count->data_length) { | ||
5097 | + pr_err("Unexpected ret: %d send data %d\n", | ||
5098 | + ret, count->data_length); | ||
5099 | + return -EPIPE; | ||
5100 | } | ||
5101 | + pr_debug("ret: %d, sent data: %d\n", ret, count->data_length); | ||
5102 | |||
5103 | - return total_tx; | ||
5104 | + return ret; | ||
5105 | } | ||
5106 | |||
5107 | int rx_data( | ||
5108 | diff --git a/drivers/target/loopback/tcm_loop.c b/drivers/target/loopback/tcm_loop.c | ||
5109 | index ab3ab27d49b7..0be83e788df2 100644 | ||
5110 | --- a/drivers/target/loopback/tcm_loop.c | ||
5111 | +++ b/drivers/target/loopback/tcm_loop.c | ||
5112 | @@ -190,7 +190,7 @@ static void tcm_loop_submission_work(struct work_struct *work) | ||
5113 | set_host_byte(sc, DID_TRANSPORT_DISRUPTED); | ||
5114 | goto out_done; | ||
5115 | } | ||
5116 | - tl_nexus = tl_hba->tl_nexus; | ||
5117 | + tl_nexus = tl_tpg->tl_nexus; | ||
5118 | if (!tl_nexus) { | ||
5119 | scmd_printk(KERN_ERR, sc, "TCM_Loop I_T Nexus" | ||
5120 | " does not exist\n"); | ||
5121 | @@ -270,16 +270,26 @@ static int tcm_loop_queuecommand(struct Scsi_Host *sh, struct scsi_cmnd *sc) | ||
5122 | * to struct scsi_device | ||
5123 | */ | ||
5124 | static int tcm_loop_issue_tmr(struct tcm_loop_tpg *tl_tpg, | ||
5125 | - struct tcm_loop_nexus *tl_nexus, | ||
5126 | int lun, int task, enum tcm_tmreq_table tmr) | ||
5127 | { | ||
5128 | struct se_cmd *se_cmd = NULL; | ||
5129 | struct se_session *se_sess; | ||
5130 | struct se_portal_group *se_tpg; | ||
5131 | + struct tcm_loop_nexus *tl_nexus; | ||
5132 | struct tcm_loop_cmd *tl_cmd = NULL; | ||
5133 | struct tcm_loop_tmr *tl_tmr = NULL; | ||
5134 | int ret = TMR_FUNCTION_FAILED, rc; | ||
5135 | |||
5136 | + /* | ||
5137 | + * Locate the tl_nexus and se_sess pointers | ||
5138 | + */ | ||
5139 | + tl_nexus = tl_tpg->tl_nexus; | ||
5140 | + if (!tl_nexus) { | ||
5141 | + pr_err("Unable to perform device reset without" | ||
5142 | + " active I_T Nexus\n"); | ||
5143 | + return ret; | ||
5144 | + } | ||
5145 | + | ||
5146 | tl_cmd = kmem_cache_zalloc(tcm_loop_cmd_cache, GFP_KERNEL); | ||
5147 | if (!tl_cmd) { | ||
5148 | pr_err("Unable to allocate memory for tl_cmd\n"); | ||
5149 | @@ -295,7 +305,7 @@ static int tcm_loop_issue_tmr(struct tcm_loop_tpg *tl_tpg, | ||
5150 | |||
5151 | se_cmd = &tl_cmd->tl_se_cmd; | ||
5152 | se_tpg = &tl_tpg->tl_se_tpg; | ||
5153 | - se_sess = tl_nexus->se_sess; | ||
5154 | + se_sess = tl_tpg->tl_nexus->se_sess; | ||
5155 | /* | ||
5156 | * Initialize struct se_cmd descriptor from target_core_mod infrastructure | ||
5157 | */ | ||
5158 | @@ -340,7 +350,6 @@ release: | ||
5159 | static int tcm_loop_abort_task(struct scsi_cmnd *sc) | ||
5160 | { | ||
5161 | struct tcm_loop_hba *tl_hba; | ||
5162 | - struct tcm_loop_nexus *tl_nexus; | ||
5163 | struct tcm_loop_tpg *tl_tpg; | ||
5164 | int ret = FAILED; | ||
5165 | |||
5166 | @@ -348,21 +357,8 @@ static int tcm_loop_abort_task(struct scsi_cmnd *sc) | ||
5167 | * Locate the tcm_loop_hba_t pointer | ||
5168 | */ | ||
5169 | tl_hba = *(struct tcm_loop_hba **)shost_priv(sc->device->host); | ||
5170 | - /* | ||
5171 | - * Locate the tl_nexus and se_sess pointers | ||
5172 | - */ | ||
5173 | - tl_nexus = tl_hba->tl_nexus; | ||
5174 | - if (!tl_nexus) { | ||
5175 | - pr_err("Unable to perform device reset without" | ||
5176 | - " active I_T Nexus\n"); | ||
5177 | - return FAILED; | ||
5178 | - } | ||
5179 | - | ||
5180 | - /* | ||
5181 | - * Locate the tl_tpg pointer from TargetID in sc->device->id | ||
5182 | - */ | ||
5183 | tl_tpg = &tl_hba->tl_hba_tpgs[sc->device->id]; | ||
5184 | - ret = tcm_loop_issue_tmr(tl_tpg, tl_nexus, sc->device->lun, | ||
5185 | + ret = tcm_loop_issue_tmr(tl_tpg, sc->device->lun, | ||
5186 | sc->request->tag, TMR_ABORT_TASK); | ||
5187 | return (ret == TMR_FUNCTION_COMPLETE) ? SUCCESS : FAILED; | ||
5188 | } | ||
5189 | @@ -374,7 +370,6 @@ static int tcm_loop_abort_task(struct scsi_cmnd *sc) | ||
5190 | static int tcm_loop_device_reset(struct scsi_cmnd *sc) | ||
5191 | { | ||
5192 | struct tcm_loop_hba *tl_hba; | ||
5193 | - struct tcm_loop_nexus *tl_nexus; | ||
5194 | struct tcm_loop_tpg *tl_tpg; | ||
5195 | int ret = FAILED; | ||
5196 | |||
5197 | @@ -382,20 +377,9 @@ static int tcm_loop_device_reset(struct scsi_cmnd *sc) | ||
5198 | * Locate the tcm_loop_hba_t pointer | ||
5199 | */ | ||
5200 | tl_hba = *(struct tcm_loop_hba **)shost_priv(sc->device->host); | ||
5201 | - /* | ||
5202 | - * Locate the tl_nexus and se_sess pointers | ||
5203 | - */ | ||
5204 | - tl_nexus = tl_hba->tl_nexus; | ||
5205 | - if (!tl_nexus) { | ||
5206 | - pr_err("Unable to perform device reset without" | ||
5207 | - " active I_T Nexus\n"); | ||
5208 | - return FAILED; | ||
5209 | - } | ||
5210 | - /* | ||
5211 | - * Locate the tl_tpg pointer from TargetID in sc->device->id | ||
5212 | - */ | ||
5213 | tl_tpg = &tl_hba->tl_hba_tpgs[sc->device->id]; | ||
5214 | - ret = tcm_loop_issue_tmr(tl_tpg, tl_nexus, sc->device->lun, | ||
5215 | + | ||
5216 | + ret = tcm_loop_issue_tmr(tl_tpg, sc->device->lun, | ||
5217 | 0, TMR_LUN_RESET); | ||
5218 | return (ret == TMR_FUNCTION_COMPLETE) ? SUCCESS : FAILED; | ||
5219 | } | ||
5220 | @@ -1005,8 +989,8 @@ static int tcm_loop_make_nexus( | ||
5221 | struct tcm_loop_nexus *tl_nexus; | ||
5222 | int ret = -ENOMEM; | ||
5223 | |||
5224 | - if (tl_tpg->tl_hba->tl_nexus) { | ||
5225 | - pr_debug("tl_tpg->tl_hba->tl_nexus already exists\n"); | ||
5226 | + if (tl_tpg->tl_nexus) { | ||
5227 | + pr_debug("tl_tpg->tl_nexus already exists\n"); | ||
5228 | return -EEXIST; | ||
5229 | } | ||
5230 | se_tpg = &tl_tpg->tl_se_tpg; | ||
5231 | @@ -1041,7 +1025,7 @@ static int tcm_loop_make_nexus( | ||
5232 | */ | ||
5233 | __transport_register_session(se_tpg, tl_nexus->se_sess->se_node_acl, | ||
5234 | tl_nexus->se_sess, tl_nexus); | ||
5235 | - tl_tpg->tl_hba->tl_nexus = tl_nexus; | ||
5236 | + tl_tpg->tl_nexus = tl_nexus; | ||
5237 | pr_debug("TCM_Loop_ConfigFS: Established I_T Nexus to emulated" | ||
5238 | " %s Initiator Port: %s\n", tcm_loop_dump_proto_id(tl_hba), | ||
5239 | name); | ||
5240 | @@ -1057,12 +1041,8 @@ static int tcm_loop_drop_nexus( | ||
5241 | { | ||
5242 | struct se_session *se_sess; | ||
5243 | struct tcm_loop_nexus *tl_nexus; | ||
5244 | - struct tcm_loop_hba *tl_hba = tpg->tl_hba; | ||
5245 | |||
5246 | - if (!tl_hba) | ||
5247 | - return -ENODEV; | ||
5248 | - | ||
5249 | - tl_nexus = tl_hba->tl_nexus; | ||
5250 | + tl_nexus = tpg->tl_nexus; | ||
5251 | if (!tl_nexus) | ||
5252 | return -ENODEV; | ||
5253 | |||
5254 | @@ -1078,13 +1058,13 @@ static int tcm_loop_drop_nexus( | ||
5255 | } | ||
5256 | |||
5257 | pr_debug("TCM_Loop_ConfigFS: Removing I_T Nexus to emulated" | ||
5258 | - " %s Initiator Port: %s\n", tcm_loop_dump_proto_id(tl_hba), | ||
5259 | + " %s Initiator Port: %s\n", tcm_loop_dump_proto_id(tpg->tl_hba), | ||
5260 | tl_nexus->se_sess->se_node_acl->initiatorname); | ||
5261 | /* | ||
5262 | * Release the SCSI I_T Nexus to the emulated SAS Target Port | ||
5263 | */ | ||
5264 | transport_deregister_session(tl_nexus->se_sess); | ||
5265 | - tpg->tl_hba->tl_nexus = NULL; | ||
5266 | + tpg->tl_nexus = NULL; | ||
5267 | kfree(tl_nexus); | ||
5268 | return 0; | ||
5269 | } | ||
5270 | @@ -1100,7 +1080,7 @@ static ssize_t tcm_loop_tpg_show_nexus( | ||
5271 | struct tcm_loop_nexus *tl_nexus; | ||
5272 | ssize_t ret; | ||
5273 | |||
5274 | - tl_nexus = tl_tpg->tl_hba->tl_nexus; | ||
5275 | + tl_nexus = tl_tpg->tl_nexus; | ||
5276 | if (!tl_nexus) | ||
5277 | return -ENODEV; | ||
5278 | |||
5279 | diff --git a/drivers/target/loopback/tcm_loop.h b/drivers/target/loopback/tcm_loop.h | ||
5280 | index 54c59d0b6608..6ae49f272ba6 100644 | ||
5281 | --- a/drivers/target/loopback/tcm_loop.h | ||
5282 | +++ b/drivers/target/loopback/tcm_loop.h | ||
5283 | @@ -27,11 +27,6 @@ struct tcm_loop_tmr { | ||
5284 | }; | ||
5285 | |||
5286 | struct tcm_loop_nexus { | ||
5287 | - int it_nexus_active; | ||
5288 | - /* | ||
5289 | - * Pointer to Linux/SCSI HBA from linux/include/scsi_host.h | ||
5290 | - */ | ||
5291 | - struct scsi_host *sh; | ||
5292 | /* | ||
5293 | * Pointer to TCM session for I_T Nexus | ||
5294 | */ | ||
5295 | @@ -51,6 +46,7 @@ struct tcm_loop_tpg { | ||
5296 | atomic_t tl_tpg_port_count; | ||
5297 | struct se_portal_group tl_se_tpg; | ||
5298 | struct tcm_loop_hba *tl_hba; | ||
5299 | + struct tcm_loop_nexus *tl_nexus; | ||
5300 | }; | ||
5301 | |||
5302 | struct tcm_loop_hba { | ||
5303 | @@ -59,7 +55,6 @@ struct tcm_loop_hba { | ||
5304 | struct se_hba_s *se_hba; | ||
5305 | struct se_lun *tl_hba_lun; | ||
5306 | struct se_port *tl_hba_lun_sep; | ||
5307 | - struct tcm_loop_nexus *tl_nexus; | ||
5308 | struct device dev; | ||
5309 | struct Scsi_Host *sh; | ||
5310 | struct tcm_loop_tpg tl_hba_tpgs[TL_TPGS_PER_HBA]; | ||
5311 | diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c | ||
5312 | index c45f9e907e44..24fa5d1999af 100644 | ||
5313 | --- a/drivers/target/target_core_device.c | ||
5314 | +++ b/drivers/target/target_core_device.c | ||
5315 | @@ -1169,10 +1169,10 @@ int se_dev_set_optimal_sectors(struct se_device *dev, u32 optimal_sectors) | ||
5316 | " changed for TCM/pSCSI\n", dev); | ||
5317 | return -EINVAL; | ||
5318 | } | ||
5319 | - if (optimal_sectors > dev->dev_attrib.fabric_max_sectors) { | ||
5320 | + if (optimal_sectors > dev->dev_attrib.hw_max_sectors) { | ||
5321 | pr_err("dev[%p]: Passed optimal_sectors %u cannot be" | ||
5322 | - " greater than fabric_max_sectors: %u\n", dev, | ||
5323 | - optimal_sectors, dev->dev_attrib.fabric_max_sectors); | ||
5324 | + " greater than hw_max_sectors: %u\n", dev, | ||
5325 | + optimal_sectors, dev->dev_attrib.hw_max_sectors); | ||
5326 | return -EINVAL; | ||
5327 | } | ||
5328 | |||
5329 | @@ -1572,7 +1572,6 @@ struct se_device *target_alloc_device(struct se_hba *hba, const char *name) | ||
5330 | DA_UNMAP_GRANULARITY_ALIGNMENT_DEFAULT; | ||
5331 | dev->dev_attrib.max_write_same_len = DA_MAX_WRITE_SAME_LEN; | ||
5332 | dev->dev_attrib.fabric_max_sectors = DA_FABRIC_MAX_SECTORS; | ||
5333 | - dev->dev_attrib.optimal_sectors = DA_FABRIC_MAX_SECTORS; | ||
5334 | |||
5335 | xcopy_lun = &dev->xcopy_lun; | ||
5336 | xcopy_lun->lun_se_dev = dev; | ||
5337 | @@ -1613,6 +1612,7 @@ int target_configure_device(struct se_device *dev) | ||
5338 | dev->dev_attrib.hw_max_sectors = | ||
5339 | se_dev_align_max_sectors(dev->dev_attrib.hw_max_sectors, | ||
5340 | dev->dev_attrib.hw_block_size); | ||
5341 | + dev->dev_attrib.optimal_sectors = dev->dev_attrib.hw_max_sectors; | ||
5342 | |||
5343 | dev->dev_index = scsi_get_new_index(SCSI_DEVICE_INDEX); | ||
5344 | dev->creation_time = get_jiffies_64(); | ||
5345 | diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c | ||
5346 | index 72c83d98662b..f018b6a3ffbf 100644 | ||
5347 | --- a/drivers/target/target_core_file.c | ||
5348 | +++ b/drivers/target/target_core_file.c | ||
5349 | @@ -620,7 +620,16 @@ fd_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, | ||
5350 | struct fd_prot fd_prot; | ||
5351 | sense_reason_t rc; | ||
5352 | int ret = 0; | ||
5353 | - | ||
5354 | + /* | ||
5355 | + * We are currently limited by the number of iovecs (2048) per | ||
5356 | + * single vfs_[writev,readv] call. | ||
5357 | + */ | ||
5358 | + if (cmd->data_length > FD_MAX_BYTES) { | ||
5359 | + pr_err("FILEIO: Not able to process I/O of %u bytes due to" | ||
5360 | + "FD_MAX_BYTES: %u iovec count limitiation\n", | ||
5361 | + cmd->data_length, FD_MAX_BYTES); | ||
5362 | + return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; | ||
5363 | + } | ||
5364 | /* | ||
5365 | * Call vectorized fileio functions to map struct scatterlist | ||
5366 | * physical memory addresses to struct iovec virtual memory. | ||
5367 | diff --git a/drivers/target/target_core_iblock.c b/drivers/target/target_core_iblock.c | ||
5368 | index 7e6b857c6b3f..be27773ab829 100644 | ||
5369 | --- a/drivers/target/target_core_iblock.c | ||
5370 | +++ b/drivers/target/target_core_iblock.c | ||
5371 | @@ -123,7 +123,7 @@ static int iblock_configure_device(struct se_device *dev) | ||
5372 | q = bdev_get_queue(bd); | ||
5373 | |||
5374 | dev->dev_attrib.hw_block_size = bdev_logical_block_size(bd); | ||
5375 | - dev->dev_attrib.hw_max_sectors = UINT_MAX; | ||
5376 | + dev->dev_attrib.hw_max_sectors = queue_max_hw_sectors(q); | ||
5377 | dev->dev_attrib.hw_queue_depth = q->nr_requests; | ||
5378 | |||
5379 | /* | ||
5380 | diff --git a/drivers/target/target_core_sbc.c b/drivers/target/target_core_sbc.c | ||
5381 | index ebe62afb957d..7a88af0e32d6 100644 | ||
5382 | --- a/drivers/target/target_core_sbc.c | ||
5383 | +++ b/drivers/target/target_core_sbc.c | ||
5384 | @@ -953,21 +953,6 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops) | ||
5385 | |||
5386 | if (cmd->se_cmd_flags & SCF_SCSI_DATA_CDB) { | ||
5387 | unsigned long long end_lba; | ||
5388 | - | ||
5389 | - if (sectors > dev->dev_attrib.fabric_max_sectors) { | ||
5390 | - printk_ratelimited(KERN_ERR "SCSI OP %02xh with too" | ||
5391 | - " big sectors %u exceeds fabric_max_sectors:" | ||
5392 | - " %u\n", cdb[0], sectors, | ||
5393 | - dev->dev_attrib.fabric_max_sectors); | ||
5394 | - return TCM_INVALID_CDB_FIELD; | ||
5395 | - } | ||
5396 | - if (sectors > dev->dev_attrib.hw_max_sectors) { | ||
5397 | - printk_ratelimited(KERN_ERR "SCSI OP %02xh with too" | ||
5398 | - " big sectors %u exceeds backend hw_max_sectors:" | ||
5399 | - " %u\n", cdb[0], sectors, | ||
5400 | - dev->dev_attrib.hw_max_sectors); | ||
5401 | - return TCM_INVALID_CDB_FIELD; | ||
5402 | - } | ||
5403 | check_lba: | ||
5404 | end_lba = dev->transport->get_blocks(dev) + 1; | ||
5405 | if (cmd->t_task_lba + sectors > end_lba) { | ||
5406 | diff --git a/drivers/target/target_core_spc.c b/drivers/target/target_core_spc.c | ||
5407 | index bc286a67af7c..614005b6b08b 100644 | ||
5408 | --- a/drivers/target/target_core_spc.c | ||
5409 | +++ b/drivers/target/target_core_spc.c | ||
5410 | @@ -505,7 +505,6 @@ static sense_reason_t | ||
5411 | spc_emulate_evpd_b0(struct se_cmd *cmd, unsigned char *buf) | ||
5412 | { | ||
5413 | struct se_device *dev = cmd->se_dev; | ||
5414 | - u32 max_sectors; | ||
5415 | int have_tp = 0; | ||
5416 | int opt, min; | ||
5417 | |||
5418 | @@ -539,9 +538,7 @@ spc_emulate_evpd_b0(struct se_cmd *cmd, unsigned char *buf) | ||
5419 | /* | ||
5420 | * Set MAXIMUM TRANSFER LENGTH | ||
5421 | */ | ||
5422 | - max_sectors = min(dev->dev_attrib.fabric_max_sectors, | ||
5423 | - dev->dev_attrib.hw_max_sectors); | ||
5424 | - put_unaligned_be32(max_sectors, &buf[8]); | ||
5425 | + put_unaligned_be32(dev->dev_attrib.hw_max_sectors, &buf[8]); | ||
5426 | |||
5427 | /* | ||
5428 | * Set OPTIMAL TRANSFER LENGTH | ||
5429 | diff --git a/drivers/thermal/intel_powerclamp.c b/drivers/thermal/intel_powerclamp.c | ||
5430 | index 95cb7fc20e17..6cb78497076a 100644 | ||
5431 | --- a/drivers/thermal/intel_powerclamp.c | ||
5432 | +++ b/drivers/thermal/intel_powerclamp.c | ||
5433 | @@ -435,7 +435,6 @@ static int clamp_thread(void *arg) | ||
5434 | * allowed. thus jiffies are updated properly. | ||
5435 | */ | ||
5436 | preempt_disable(); | ||
5437 | - tick_nohz_idle_enter(); | ||
5438 | /* mwait until target jiffies is reached */ | ||
5439 | while (time_before(jiffies, target_jiffies)) { | ||
5440 | unsigned long ecx = 1; | ||
5441 | @@ -451,7 +450,6 @@ static int clamp_thread(void *arg) | ||
5442 | start_critical_timings(); | ||
5443 | atomic_inc(&idle_wakeup_counter); | ||
5444 | } | ||
5445 | - tick_nohz_idle_exit(); | ||
5446 | preempt_enable(); | ||
5447 | } | ||
5448 | del_timer_sync(&wakeup_timer); | ||
5449 | diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c | ||
5450 | index eaeb9a02c7fe..a28dee9d5017 100644 | ||
5451 | --- a/drivers/tty/serial/serial_core.c | ||
5452 | +++ b/drivers/tty/serial/serial_core.c | ||
5453 | @@ -2102,7 +2102,9 @@ uart_report_port(struct uart_driver *drv, struct uart_port *port) | ||
5454 | break; | ||
5455 | } | ||
5456 | |||
5457 | - dev_info(port->dev, "%s%d at %s (irq = %d, base_baud = %d) is a %s\n", | ||
5458 | + printk(KERN_INFO "%s%s%s%d at %s (irq = %d, base_baud = %d) is a %s\n", | ||
5459 | + port->dev ? dev_name(port->dev) : "", | ||
5460 | + port->dev ? ": " : "", | ||
5461 | drv->dev_name, | ||
5462 | drv->tty_driver->name_base + port->line, | ||
5463 | address, port->irq, port->uartclk / 16, uart_type(port)); | ||
5464 | diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c | ||
5465 | index 546ea5431b8c..272e0928736e 100644 | ||
5466 | --- a/drivers/usb/dwc3/gadget.c | ||
5467 | +++ b/drivers/usb/dwc3/gadget.c | ||
5468 | @@ -882,8 +882,7 @@ static void dwc3_prepare_trbs(struct dwc3_ep *dep, bool starting) | ||
5469 | |||
5470 | if (i == (request->num_mapped_sgs - 1) || | ||
5471 | sg_is_last(s)) { | ||
5472 | - if (list_is_last(&req->list, | ||
5473 | - &dep->request_list)) | ||
5474 | + if (list_empty(&dep->request_list)) | ||
5475 | last_one = true; | ||
5476 | chain = false; | ||
5477 | } | ||
5478 | @@ -901,6 +900,9 @@ static void dwc3_prepare_trbs(struct dwc3_ep *dep, bool starting) | ||
5479 | if (last_one) | ||
5480 | break; | ||
5481 | } | ||
5482 | + | ||
5483 | + if (last_one) | ||
5484 | + break; | ||
5485 | } else { | ||
5486 | dma = req->request.dma; | ||
5487 | length = req->request.length; | ||
5488 | diff --git a/drivers/usb/gadget/legacy/inode.c b/drivers/usb/gadget/legacy/inode.c | ||
5489 | index c744e4975d74..08048613eed6 100644 | ||
5490 | --- a/drivers/usb/gadget/legacy/inode.c | ||
5491 | +++ b/drivers/usb/gadget/legacy/inode.c | ||
5492 | @@ -449,6 +449,7 @@ ep_write (struct file *fd, const char __user *buf, size_t len, loff_t *ptr) | ||
5493 | data->name, len, (int) value); | ||
5494 | free1: | ||
5495 | mutex_unlock(&data->lock); | ||
5496 | + kfree (kbuf); | ||
5497 | return value; | ||
5498 | } | ||
5499 | |||
5500 | diff --git a/drivers/usb/gadget/udc/atmel_usba_udc.c b/drivers/usb/gadget/udc/atmel_usba_udc.c | ||
5501 | index 1529926e20a0..840856ca3e66 100644 | ||
5502 | --- a/drivers/usb/gadget/udc/atmel_usba_udc.c | ||
5503 | +++ b/drivers/usb/gadget/udc/atmel_usba_udc.c | ||
5504 | @@ -716,10 +716,10 @@ static int queue_dma(struct usba_udc *udc, struct usba_ep *ep, | ||
5505 | req->using_dma = 1; | ||
5506 | req->ctrl = USBA_BF(DMA_BUF_LEN, req->req.length) | ||
5507 | | USBA_DMA_CH_EN | USBA_DMA_END_BUF_IE | ||
5508 | - | USBA_DMA_END_TR_EN | USBA_DMA_END_TR_IE; | ||
5509 | + | USBA_DMA_END_BUF_EN; | ||
5510 | |||
5511 | - if (ep->is_in) | ||
5512 | - req->ctrl |= USBA_DMA_END_BUF_EN; | ||
5513 | + if (!ep->is_in) | ||
5514 | + req->ctrl |= USBA_DMA_END_TR_EN | USBA_DMA_END_TR_IE; | ||
5515 | |||
5516 | /* | ||
5517 | * Add this request to the queue and submit for DMA if | ||
5518 | @@ -828,7 +828,7 @@ static int usba_ep_dequeue(struct usb_ep *_ep, struct usb_request *_req) | ||
5519 | { | ||
5520 | struct usba_ep *ep = to_usba_ep(_ep); | ||
5521 | struct usba_udc *udc = ep->udc; | ||
5522 | - struct usba_request *req = to_usba_req(_req); | ||
5523 | + struct usba_request *req; | ||
5524 | unsigned long flags; | ||
5525 | u32 status; | ||
5526 | |||
5527 | @@ -837,6 +837,16 @@ static int usba_ep_dequeue(struct usb_ep *_ep, struct usb_request *_req) | ||
5528 | |||
5529 | spin_lock_irqsave(&udc->lock, flags); | ||
5530 | |||
5531 | + list_for_each_entry(req, &ep->queue, queue) { | ||
5532 | + if (&req->req == _req) | ||
5533 | + break; | ||
5534 | + } | ||
5535 | + | ||
5536 | + if (&req->req != _req) { | ||
5537 | + spin_unlock_irqrestore(&udc->lock, flags); | ||
5538 | + return -EINVAL; | ||
5539 | + } | ||
5540 | + | ||
5541 | if (req->using_dma) { | ||
5542 | /* | ||
5543 | * If this request is currently being transferred, | ||
5544 | @@ -1572,7 +1582,6 @@ static void usba_ep_irq(struct usba_udc *udc, struct usba_ep *ep) | ||
5545 | if ((epstatus & epctrl) & USBA_RX_BK_RDY) { | ||
5546 | DBG(DBG_BUS, "%s: RX data ready\n", ep->ep.name); | ||
5547 | receive_data(ep); | ||
5548 | - usba_ep_writel(ep, CLR_STA, USBA_RX_BK_RDY); | ||
5549 | } | ||
5550 | } | ||
5551 | |||
5552 | diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c | ||
5553 | index e113fd73aeae..c399606f154e 100644 | ||
5554 | --- a/drivers/usb/host/ehci-sched.c | ||
5555 | +++ b/drivers/usb/host/ehci-sched.c | ||
5556 | @@ -1581,6 +1581,10 @@ iso_stream_schedule ( | ||
5557 | else | ||
5558 | next = (now + 2 + 7) & ~0x07; /* full frame cache */ | ||
5559 | |||
5560 | + /* If needed, initialize last_iso_frame so that this URB will be seen */ | ||
5561 | + if (ehci->isoc_count == 0) | ||
5562 | + ehci->last_iso_frame = now >> 3; | ||
5563 | + | ||
5564 | /* | ||
5565 | * Use ehci->last_iso_frame as the base. There can't be any | ||
5566 | * TDs scheduled for earlier than that. | ||
5567 | @@ -1671,10 +1675,6 @@ iso_stream_schedule ( | ||
5568 | urb->start_frame = start & (mod - 1); | ||
5569 | if (!stream->highspeed) | ||
5570 | urb->start_frame >>= 3; | ||
5571 | - | ||
5572 | - /* Make sure scan_isoc() sees these */ | ||
5573 | - if (ehci->isoc_count == 0) | ||
5574 | - ehci->last_iso_frame = now >> 3; | ||
5575 | return status; | ||
5576 | |||
5577 | fail: | ||
5578 | diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c | ||
5579 | index 2f3acebb577a..f4e6b945136c 100644 | ||
5580 | --- a/drivers/usb/host/pci-quirks.c | ||
5581 | +++ b/drivers/usb/host/pci-quirks.c | ||
5582 | @@ -571,7 +571,8 @@ static void quirk_usb_handoff_ohci(struct pci_dev *pdev) | ||
5583 | { | ||
5584 | void __iomem *base; | ||
5585 | u32 control; | ||
5586 | - u32 fminterval; | ||
5587 | + u32 fminterval = 0; | ||
5588 | + bool no_fminterval = false; | ||
5589 | int cnt; | ||
5590 | |||
5591 | if (!mmio_resource_enabled(pdev, 0)) | ||
5592 | @@ -581,6 +582,13 @@ static void quirk_usb_handoff_ohci(struct pci_dev *pdev) | ||
5593 | if (base == NULL) | ||
5594 | return; | ||
5595 | |||
5596 | + /* | ||
5597 | + * ULi M5237 OHCI controller locks the whole system when accessing | ||
5598 | + * the OHCI_FMINTERVAL offset. | ||
5599 | + */ | ||
5600 | + if (pdev->vendor == PCI_VENDOR_ID_AL && pdev->device == 0x5237) | ||
5601 | + no_fminterval = true; | ||
5602 | + | ||
5603 | control = readl(base + OHCI_CONTROL); | ||
5604 | |||
5605 | /* On PA-RISC, PDC can leave IR set incorrectly; ignore it there. */ | ||
5606 | @@ -619,7 +627,9 @@ static void quirk_usb_handoff_ohci(struct pci_dev *pdev) | ||
5607 | } | ||
5608 | |||
5609 | /* software reset of the controller, preserving HcFmInterval */ | ||
5610 | - fminterval = readl(base + OHCI_FMINTERVAL); | ||
5611 | + if (!no_fminterval) | ||
5612 | + fminterval = readl(base + OHCI_FMINTERVAL); | ||
5613 | + | ||
5614 | writel(OHCI_HCR, base + OHCI_CMDSTATUS); | ||
5615 | |||
5616 | /* reset requires max 10 us delay */ | ||
5617 | @@ -628,7 +638,9 @@ static void quirk_usb_handoff_ohci(struct pci_dev *pdev) | ||
5618 | break; | ||
5619 | udelay(1); | ||
5620 | } | ||
5621 | - writel(fminterval, base + OHCI_FMINTERVAL); | ||
5622 | + | ||
5623 | + if (!no_fminterval) | ||
5624 | + writel(fminterval, base + OHCI_FMINTERVAL); | ||
5625 | |||
5626 | /* Now the controller is safely in SUSPEND and nothing can wake it up */ | ||
5627 | iounmap(base); | ||
5628 | diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c | ||
5629 | index 142b601f9563..7f76c8a12f89 100644 | ||
5630 | --- a/drivers/usb/host/xhci-pci.c | ||
5631 | +++ b/drivers/usb/host/xhci-pci.c | ||
5632 | @@ -82,6 +82,8 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) | ||
5633 | "must be suspended extra slowly", | ||
5634 | pdev->revision); | ||
5635 | } | ||
5636 | + if (pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_PDK) | ||
5637 | + xhci->quirks |= XHCI_BROKEN_STREAMS; | ||
5638 | /* Fresco Logic confirms: all revisions of this chip do not | ||
5639 | * support MSI, even though some of them claim to in their PCI | ||
5640 | * capabilities. | ||
5641 | diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c | ||
5642 | index 033b46c470bd..3bceabe109f7 100644 | ||
5643 | --- a/drivers/usb/host/xhci.c | ||
5644 | +++ b/drivers/usb/host/xhci.c | ||
5645 | @@ -3803,6 +3803,15 @@ static int xhci_setup_device(struct usb_hcd *hcd, struct usb_device *udev, | ||
5646 | return -EINVAL; | ||
5647 | } | ||
5648 | |||
5649 | + if (setup == SETUP_CONTEXT_ONLY) { | ||
5650 | + slot_ctx = xhci_get_slot_ctx(xhci, virt_dev->out_ctx); | ||
5651 | + if (GET_SLOT_STATE(le32_to_cpu(slot_ctx->dev_state)) == | ||
5652 | + SLOT_STATE_DEFAULT) { | ||
5653 | + xhci_dbg(xhci, "Slot already in default state\n"); | ||
5654 | + return 0; | ||
5655 | + } | ||
5656 | + } | ||
5657 | + | ||
5658 | command = xhci_alloc_command(xhci, false, false, GFP_KERNEL); | ||
5659 | if (!command) | ||
5660 | return -ENOMEM; | ||
5661 | diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c | ||
5662 | index 855793d701bb..4500610356f2 100644 | ||
5663 | --- a/drivers/usb/musb/musb_host.c | ||
5664 | +++ b/drivers/usb/musb/musb_host.c | ||
5665 | @@ -2663,7 +2663,6 @@ void musb_host_cleanup(struct musb *musb) | ||
5666 | if (musb->port_mode == MUSB_PORT_MODE_GADGET) | ||
5667 | return; | ||
5668 | usb_remove_hcd(musb->hcd); | ||
5669 | - musb->hcd = NULL; | ||
5670 | } | ||
5671 | |||
5672 | void musb_host_free(struct musb *musb) | ||
5673 | diff --git a/drivers/usb/serial/console.c b/drivers/usb/serial/console.c | ||
5674 | index 8d7fc48b1f30..29fa1c3d0089 100644 | ||
5675 | --- a/drivers/usb/serial/console.c | ||
5676 | +++ b/drivers/usb/serial/console.c | ||
5677 | @@ -46,6 +46,8 @@ static struct console usbcons; | ||
5678 | * ------------------------------------------------------------ | ||
5679 | */ | ||
5680 | |||
5681 | +static const struct tty_operations usb_console_fake_tty_ops = { | ||
5682 | +}; | ||
5683 | |||
5684 | /* | ||
5685 | * The parsing of the command line works exactly like the | ||
5686 | @@ -137,13 +139,17 @@ static int usb_console_setup(struct console *co, char *options) | ||
5687 | goto reset_open_count; | ||
5688 | } | ||
5689 | kref_init(&tty->kref); | ||
5690 | - tty_port_tty_set(&port->port, tty); | ||
5691 | tty->driver = usb_serial_tty_driver; | ||
5692 | tty->index = co->index; | ||
5693 | + init_ldsem(&tty->ldisc_sem); | ||
5694 | + INIT_LIST_HEAD(&tty->tty_files); | ||
5695 | + kref_get(&tty->driver->kref); | ||
5696 | + tty->ops = &usb_console_fake_tty_ops; | ||
5697 | if (tty_init_termios(tty)) { | ||
5698 | retval = -ENOMEM; | ||
5699 | - goto free_tty; | ||
5700 | + goto put_tty; | ||
5701 | } | ||
5702 | + tty_port_tty_set(&port->port, tty); | ||
5703 | } | ||
5704 | |||
5705 | /* only call the device specific open if this | ||
5706 | @@ -161,7 +167,7 @@ static int usb_console_setup(struct console *co, char *options) | ||
5707 | serial->type->set_termios(tty, port, &dummy); | ||
5708 | |||
5709 | tty_port_tty_set(&port->port, NULL); | ||
5710 | - kfree(tty); | ||
5711 | + tty_kref_put(tty); | ||
5712 | } | ||
5713 | set_bit(ASYNCB_INITIALIZED, &port->port.flags); | ||
5714 | } | ||
5715 | @@ -177,8 +183,8 @@ static int usb_console_setup(struct console *co, char *options) | ||
5716 | |||
5717 | fail: | ||
5718 | tty_port_tty_set(&port->port, NULL); | ||
5719 | - free_tty: | ||
5720 | - kfree(tty); | ||
5721 | + put_tty: | ||
5722 | + tty_kref_put(tty); | ||
5723 | reset_open_count: | ||
5724 | port->port.count = 0; | ||
5725 | usb_autopm_put_interface(serial->interface); | ||
5726 | diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c | ||
5727 | index 6c4eb3cf5efd..f4c56fc1a9f6 100644 | ||
5728 | --- a/drivers/usb/serial/cp210x.c | ||
5729 | +++ b/drivers/usb/serial/cp210x.c | ||
5730 | @@ -120,10 +120,12 @@ static const struct usb_device_id id_table[] = { | ||
5731 | { USB_DEVICE(0x10C4, 0x85F8) }, /* Virtenio Preon32 */ | ||
5732 | { USB_DEVICE(0x10C4, 0x8664) }, /* AC-Services CAN-IF */ | ||
5733 | { USB_DEVICE(0x10C4, 0x8665) }, /* AC-Services OBD-IF */ | ||
5734 | - { USB_DEVICE(0x10C4, 0x8875) }, /* CEL MeshConnect USB Stick */ | ||
5735 | + { USB_DEVICE(0x10C4, 0x8856) }, /* CEL EM357 ZigBee USB Stick - LR */ | ||
5736 | + { USB_DEVICE(0x10C4, 0x8857) }, /* CEL EM357 ZigBee USB Stick */ | ||
5737 | { USB_DEVICE(0x10C4, 0x88A4) }, /* MMB Networks ZigBee USB Device */ | ||
5738 | { USB_DEVICE(0x10C4, 0x88A5) }, /* Planet Innovation Ingeni ZigBee USB Device */ | ||
5739 | { USB_DEVICE(0x10C4, 0x8946) }, /* Ketra N1 Wireless Interface */ | ||
5740 | + { USB_DEVICE(0x10C4, 0x8977) }, /* CEL MeshWorks DevKit Device */ | ||
5741 | { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */ | ||
5742 | { USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */ | ||
5743 | { USB_DEVICE(0x10C4, 0xEA70) }, /* Silicon Labs factory default */ | ||
5744 | diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c | ||
5745 | index 077c714f1285..e07b15ed5814 100644 | ||
5746 | --- a/drivers/usb/serial/keyspan.c | ||
5747 | +++ b/drivers/usb/serial/keyspan.c | ||
5748 | @@ -410,6 +410,8 @@ static void usa26_instat_callback(struct urb *urb) | ||
5749 | } | ||
5750 | port = serial->port[msg->port]; | ||
5751 | p_priv = usb_get_serial_port_data(port); | ||
5752 | + if (!p_priv) | ||
5753 | + goto resubmit; | ||
5754 | |||
5755 | /* Update handshaking pin state information */ | ||
5756 | old_dcd_state = p_priv->dcd_state; | ||
5757 | @@ -420,7 +422,7 @@ static void usa26_instat_callback(struct urb *urb) | ||
5758 | |||
5759 | if (old_dcd_state != p_priv->dcd_state) | ||
5760 | tty_port_tty_hangup(&port->port, true); | ||
5761 | - | ||
5762 | +resubmit: | ||
5763 | /* Resubmit urb so we continue receiving */ | ||
5764 | err = usb_submit_urb(urb, GFP_ATOMIC); | ||
5765 | if (err != 0) | ||
5766 | @@ -527,6 +529,8 @@ static void usa28_instat_callback(struct urb *urb) | ||
5767 | } | ||
5768 | port = serial->port[msg->port]; | ||
5769 | p_priv = usb_get_serial_port_data(port); | ||
5770 | + if (!p_priv) | ||
5771 | + goto resubmit; | ||
5772 | |||
5773 | /* Update handshaking pin state information */ | ||
5774 | old_dcd_state = p_priv->dcd_state; | ||
5775 | @@ -537,7 +541,7 @@ static void usa28_instat_callback(struct urb *urb) | ||
5776 | |||
5777 | if (old_dcd_state != p_priv->dcd_state && old_dcd_state) | ||
5778 | tty_port_tty_hangup(&port->port, true); | ||
5779 | - | ||
5780 | +resubmit: | ||
5781 | /* Resubmit urb so we continue receiving */ | ||
5782 | err = usb_submit_urb(urb, GFP_ATOMIC); | ||
5783 | if (err != 0) | ||
5784 | @@ -607,6 +611,8 @@ static void usa49_instat_callback(struct urb *urb) | ||
5785 | } | ||
5786 | port = serial->port[msg->portNumber]; | ||
5787 | p_priv = usb_get_serial_port_data(port); | ||
5788 | + if (!p_priv) | ||
5789 | + goto resubmit; | ||
5790 | |||
5791 | /* Update handshaking pin state information */ | ||
5792 | old_dcd_state = p_priv->dcd_state; | ||
5793 | @@ -617,7 +623,7 @@ static void usa49_instat_callback(struct urb *urb) | ||
5794 | |||
5795 | if (old_dcd_state != p_priv->dcd_state && old_dcd_state) | ||
5796 | tty_port_tty_hangup(&port->port, true); | ||
5797 | - | ||
5798 | +resubmit: | ||
5799 | /* Resubmit urb so we continue receiving */ | ||
5800 | err = usb_submit_urb(urb, GFP_ATOMIC); | ||
5801 | if (err != 0) | ||
5802 | @@ -855,6 +861,8 @@ static void usa90_instat_callback(struct urb *urb) | ||
5803 | |||
5804 | port = serial->port[0]; | ||
5805 | p_priv = usb_get_serial_port_data(port); | ||
5806 | + if (!p_priv) | ||
5807 | + goto resubmit; | ||
5808 | |||
5809 | /* Update handshaking pin state information */ | ||
5810 | old_dcd_state = p_priv->dcd_state; | ||
5811 | @@ -865,7 +873,7 @@ static void usa90_instat_callback(struct urb *urb) | ||
5812 | |||
5813 | if (old_dcd_state != p_priv->dcd_state && old_dcd_state) | ||
5814 | tty_port_tty_hangup(&port->port, true); | ||
5815 | - | ||
5816 | +resubmit: | ||
5817 | /* Resubmit urb so we continue receiving */ | ||
5818 | err = usb_submit_urb(urb, GFP_ATOMIC); | ||
5819 | if (err != 0) | ||
5820 | @@ -926,6 +934,8 @@ static void usa67_instat_callback(struct urb *urb) | ||
5821 | |||
5822 | port = serial->port[msg->port]; | ||
5823 | p_priv = usb_get_serial_port_data(port); | ||
5824 | + if (!p_priv) | ||
5825 | + goto resubmit; | ||
5826 | |||
5827 | /* Update handshaking pin state information */ | ||
5828 | old_dcd_state = p_priv->dcd_state; | ||
5829 | @@ -934,7 +944,7 @@ static void usa67_instat_callback(struct urb *urb) | ||
5830 | |||
5831 | if (old_dcd_state != p_priv->dcd_state && old_dcd_state) | ||
5832 | tty_port_tty_hangup(&port->port, true); | ||
5833 | - | ||
5834 | +resubmit: | ||
5835 | /* Resubmit urb so we continue receiving */ | ||
5836 | err = usb_submit_urb(urb, GFP_ATOMIC); | ||
5837 | if (err != 0) | ||
5838 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c | ||
5839 | index 7a4c21b4f676..efdcee15b520 100644 | ||
5840 | --- a/drivers/usb/serial/option.c | ||
5841 | +++ b/drivers/usb/serial/option.c | ||
5842 | @@ -234,6 +234,8 @@ static void option_instat_callback(struct urb *urb); | ||
5843 | |||
5844 | #define QUALCOMM_VENDOR_ID 0x05C6 | ||
5845 | |||
5846 | +#define SIERRA_VENDOR_ID 0x1199 | ||
5847 | + | ||
5848 | #define CMOTECH_VENDOR_ID 0x16d8 | ||
5849 | #define CMOTECH_PRODUCT_6001 0x6001 | ||
5850 | #define CMOTECH_PRODUCT_CMU_300 0x6002 | ||
5851 | @@ -512,7 +514,7 @@ enum option_blacklist_reason { | ||
5852 | OPTION_BLACKLIST_RESERVED_IF = 2 | ||
5853 | }; | ||
5854 | |||
5855 | -#define MAX_BL_NUM 8 | ||
5856 | +#define MAX_BL_NUM 11 | ||
5857 | struct option_blacklist_info { | ||
5858 | /* bitfield of interface numbers for OPTION_BLACKLIST_SENDSETUP */ | ||
5859 | const unsigned long sendsetup; | ||
5860 | @@ -601,6 +603,11 @@ static const struct option_blacklist_info telit_le920_blacklist = { | ||
5861 | .reserved = BIT(1) | BIT(5), | ||
5862 | }; | ||
5863 | |||
5864 | +static const struct option_blacklist_info sierra_mc73xx_blacklist = { | ||
5865 | + .sendsetup = BIT(0) | BIT(2), | ||
5866 | + .reserved = BIT(8) | BIT(10) | BIT(11), | ||
5867 | +}; | ||
5868 | + | ||
5869 | static const struct usb_device_id option_ids[] = { | ||
5870 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) }, | ||
5871 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) }, | ||
5872 | @@ -1098,6 +1105,8 @@ static const struct usb_device_id option_ids[] = { | ||
5873 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ | ||
5874 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x0023)}, /* ONYX 3G device */ | ||
5875 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000)}, /* SIMCom SIM5218 */ | ||
5876 | + { USB_DEVICE_INTERFACE_CLASS(SIERRA_VENDOR_ID, 0x68c0, 0xff), | ||
5877 | + .driver_info = (kernel_ulong_t)&sierra_mc73xx_blacklist }, /* MC73xx */ | ||
5878 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) }, | ||
5879 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CMU_300) }, | ||
5880 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6003), | ||
5881 | diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c | ||
5882 | index cb3e14780a7e..9c63897b3a56 100644 | ||
5883 | --- a/drivers/usb/serial/qcserial.c | ||
5884 | +++ b/drivers/usb/serial/qcserial.c | ||
5885 | @@ -142,7 +142,6 @@ static const struct usb_device_id id_table[] = { | ||
5886 | {DEVICE_SWI(0x0f3d, 0x68a2)}, /* Sierra Wireless MC7700 */ | ||
5887 | {DEVICE_SWI(0x114f, 0x68a2)}, /* Sierra Wireless MC7750 */ | ||
5888 | {DEVICE_SWI(0x1199, 0x68a2)}, /* Sierra Wireless MC7710 */ | ||
5889 | - {DEVICE_SWI(0x1199, 0x68c0)}, /* Sierra Wireless MC73xx */ | ||
5890 | {DEVICE_SWI(0x1199, 0x901c)}, /* Sierra Wireless EM7700 */ | ||
5891 | {DEVICE_SWI(0x1199, 0x901f)}, /* Sierra Wireless EM7355 */ | ||
5892 | {DEVICE_SWI(0x1199, 0x9040)}, /* Sierra Wireless Modem */ | ||
5893 | diff --git a/drivers/usb/storage/unusual_uas.h b/drivers/usb/storage/unusual_uas.h | ||
5894 | index 18a283d6de1c..1f430bb02ca1 100644 | ||
5895 | --- a/drivers/usb/storage/unusual_uas.h | ||
5896 | +++ b/drivers/usb/storage/unusual_uas.h | ||
5897 | @@ -68,6 +68,20 @@ UNUSUAL_DEV(0x0bc2, 0xa003, 0x0000, 0x9999, | ||
5898 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
5899 | US_FL_NO_ATA_1X), | ||
5900 | |||
5901 | +/* Reported-by: Marcin ZajÄ…czkowski <mszpak@wp.pl> */ | ||
5902 | +UNUSUAL_DEV(0x0bc2, 0xa013, 0x0000, 0x9999, | ||
5903 | + "Seagate", | ||
5904 | + "Backup Plus", | ||
5905 | + USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
5906 | + US_FL_NO_ATA_1X), | ||
5907 | + | ||
5908 | +/* Reported-by: Hans de Goede <hdegoede@redhat.com> */ | ||
5909 | +UNUSUAL_DEV(0x0bc2, 0xa0a4, 0x0000, 0x9999, | ||
5910 | + "Seagate", | ||
5911 | + "Backup Plus Desk", | ||
5912 | + USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
5913 | + US_FL_NO_ATA_1X), | ||
5914 | + | ||
5915 | /* https://bbs.archlinux.org/viewtopic.php?id=183190 */ | ||
5916 | UNUSUAL_DEV(0x0bc2, 0xab20, 0x0000, 0x9999, | ||
5917 | "Seagate", | ||
5918 | @@ -82,6 +96,13 @@ UNUSUAL_DEV(0x0bc2, 0xab21, 0x0000, 0x9999, | ||
5919 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
5920 | US_FL_NO_ATA_1X), | ||
5921 | |||
5922 | +/* Reported-by: G. Richard Bellamy <rbellamy@pteradigm.com> */ | ||
5923 | +UNUSUAL_DEV(0x0bc2, 0xab2a, 0x0000, 0x9999, | ||
5924 | + "Seagate", | ||
5925 | + "BUP Fast HDD", | ||
5926 | + USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
5927 | + US_FL_NO_ATA_1X), | ||
5928 | + | ||
5929 | /* Reported-by: Claudio Bizzarri <claudio.bizzarri@gmail.com> */ | ||
5930 | UNUSUAL_DEV(0x152d, 0x0567, 0x0000, 0x9999, | ||
5931 | "JMicron", | ||
5932 | @@ -104,6 +125,13 @@ UNUSUAL_DEV(0x2109, 0x0711, 0x0000, 0x9999, | ||
5933 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
5934 | US_FL_NO_ATA_1X), | ||
5935 | |||
5936 | +/* Reported-by: Takeo Nakayama <javhera@gmx.com> */ | ||
5937 | +UNUSUAL_DEV(0x357d, 0x7788, 0x0000, 0x9999, | ||
5938 | + "JMicron", | ||
5939 | + "JMS566", | ||
5940 | + USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
5941 | + US_FL_NO_REPORT_OPCODES), | ||
5942 | + | ||
5943 | /* Reported-by: Hans de Goede <hdegoede@redhat.com> */ | ||
5944 | UNUSUAL_DEV(0x4971, 0x1012, 0x0000, 0x9999, | ||
5945 | "Hitachi", | ||
5946 | diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c | ||
5947 | index 9558da3f06a0..2f8a0552d020 100644 | ||
5948 | --- a/drivers/vfio/pci/vfio_pci.c | ||
5949 | +++ b/drivers/vfio/pci/vfio_pci.c | ||
5950 | @@ -839,13 +839,11 @@ static const struct vfio_device_ops vfio_pci_ops = { | ||
5951 | |||
5952 | static int vfio_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) | ||
5953 | { | ||
5954 | - u8 type; | ||
5955 | struct vfio_pci_device *vdev; | ||
5956 | struct iommu_group *group; | ||
5957 | int ret; | ||
5958 | |||
5959 | - pci_read_config_byte(pdev, PCI_HEADER_TYPE, &type); | ||
5960 | - if ((type & PCI_HEADER_TYPE) != PCI_HEADER_TYPE_NORMAL) | ||
5961 | + if (pdev->hdr_type != PCI_HEADER_TYPE_NORMAL) | ||
5962 | return -EINVAL; | ||
5963 | |||
5964 | group = iommu_group_get(&pdev->dev); | ||
5965 | diff --git a/drivers/vhost/scsi.c b/drivers/vhost/scsi.c | ||
5966 | index a17f11850669..cb84f69f76ad 100644 | ||
5967 | --- a/drivers/vhost/scsi.c | ||
5968 | +++ b/drivers/vhost/scsi.c | ||
5969 | @@ -909,6 +909,23 @@ vhost_scsi_map_iov_to_prot(struct tcm_vhost_cmd *cmd, | ||
5970 | return 0; | ||
5971 | } | ||
5972 | |||
5973 | +static int vhost_scsi_to_tcm_attr(int attr) | ||
5974 | +{ | ||
5975 | + switch (attr) { | ||
5976 | + case VIRTIO_SCSI_S_SIMPLE: | ||
5977 | + return MSG_SIMPLE_TAG; | ||
5978 | + case VIRTIO_SCSI_S_ORDERED: | ||
5979 | + return MSG_ORDERED_TAG; | ||
5980 | + case VIRTIO_SCSI_S_HEAD: | ||
5981 | + return MSG_HEAD_TAG; | ||
5982 | + case VIRTIO_SCSI_S_ACA: | ||
5983 | + return MSG_ACA_TAG; | ||
5984 | + default: | ||
5985 | + break; | ||
5986 | + } | ||
5987 | + return MSG_SIMPLE_TAG; | ||
5988 | +} | ||
5989 | + | ||
5990 | static void tcm_vhost_submission_work(struct work_struct *work) | ||
5991 | { | ||
5992 | struct tcm_vhost_cmd *cmd = | ||
5993 | @@ -934,9 +951,10 @@ static void tcm_vhost_submission_work(struct work_struct *work) | ||
5994 | rc = target_submit_cmd_map_sgls(se_cmd, tv_nexus->tvn_se_sess, | ||
5995 | cmd->tvc_cdb, &cmd->tvc_sense_buf[0], | ||
5996 | cmd->tvc_lun, cmd->tvc_exp_data_len, | ||
5997 | - cmd->tvc_task_attr, cmd->tvc_data_direction, | ||
5998 | - TARGET_SCF_ACK_KREF, sg_ptr, cmd->tvc_sgl_count, | ||
5999 | - NULL, 0, sg_prot_ptr, cmd->tvc_prot_sgl_count); | ||
6000 | + vhost_scsi_to_tcm_attr(cmd->tvc_task_attr), | ||
6001 | + cmd->tvc_data_direction, TARGET_SCF_ACK_KREF, | ||
6002 | + sg_ptr, cmd->tvc_sgl_count, NULL, 0, | ||
6003 | + sg_prot_ptr, cmd->tvc_prot_sgl_count); | ||
6004 | if (rc < 0) { | ||
6005 | transport_send_check_condition_and_sense(se_cmd, | ||
6006 | TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE, 0); | ||
6007 | diff --git a/drivers/video/fbdev/core/fb_defio.c b/drivers/video/fbdev/core/fb_defio.c | ||
6008 | index 900aa4ecd617..d6cab1fd9a47 100644 | ||
6009 | --- a/drivers/video/fbdev/core/fb_defio.c | ||
6010 | +++ b/drivers/video/fbdev/core/fb_defio.c | ||
6011 | @@ -83,9 +83,10 @@ int fb_deferred_io_fsync(struct file *file, loff_t start, loff_t end, int datasy | ||
6012 | cancel_delayed_work_sync(&info->deferred_work); | ||
6013 | |||
6014 | /* Run it immediately */ | ||
6015 | - err = schedule_delayed_work(&info->deferred_work, 0); | ||
6016 | + schedule_delayed_work(&info->deferred_work, 0); | ||
6017 | mutex_unlock(&inode->i_mutex); | ||
6018 | - return err; | ||
6019 | + | ||
6020 | + return 0; | ||
6021 | } | ||
6022 | EXPORT_SYMBOL_GPL(fb_deferred_io_fsync); | ||
6023 | |||
6024 | diff --git a/drivers/video/logo/logo.c b/drivers/video/logo/logo.c | ||
6025 | index 940cd196eef5..10fbfd8ab963 100644 | ||
6026 | --- a/drivers/video/logo/logo.c | ||
6027 | +++ b/drivers/video/logo/logo.c | ||
6028 | @@ -21,6 +21,21 @@ static bool nologo; | ||
6029 | module_param(nologo, bool, 0); | ||
6030 | MODULE_PARM_DESC(nologo, "Disables startup logo"); | ||
6031 | |||
6032 | +/* | ||
6033 | + * Logos are located in the initdata, and will be freed in kernel_init. | ||
6034 | + * Use late_init to mark the logos as freed to prevent any further use. | ||
6035 | + */ | ||
6036 | + | ||
6037 | +static bool logos_freed; | ||
6038 | + | ||
6039 | +static int __init fb_logo_late_init(void) | ||
6040 | +{ | ||
6041 | + logos_freed = true; | ||
6042 | + return 0; | ||
6043 | +} | ||
6044 | + | ||
6045 | +late_initcall(fb_logo_late_init); | ||
6046 | + | ||
6047 | /* logo's are marked __initdata. Use __init_refok to tell | ||
6048 | * modpost that it is intended that this function uses data | ||
6049 | * marked __initdata. | ||
6050 | @@ -29,7 +44,7 @@ const struct linux_logo * __init_refok fb_find_logo(int depth) | ||
6051 | { | ||
6052 | const struct linux_logo *logo = NULL; | ||
6053 | |||
6054 | - if (nologo) | ||
6055 | + if (nologo || logos_freed) | ||
6056 | return NULL; | ||
6057 | |||
6058 | if (depth >= 1) { | ||
6059 | diff --git a/fs/lockd/svc.c b/fs/lockd/svc.c | ||
6060 | index d1bb7ecfd201..61024987f97b 100644 | ||
6061 | --- a/fs/lockd/svc.c | ||
6062 | +++ b/fs/lockd/svc.c | ||
6063 | @@ -138,10 +138,6 @@ lockd(void *vrqstp) | ||
6064 | |||
6065 | dprintk("NFS locking service started (ver " LOCKD_VERSION ").\n"); | ||
6066 | |||
6067 | - if (!nlm_timeout) | ||
6068 | - nlm_timeout = LOCKD_DFLT_TIMEO; | ||
6069 | - nlmsvc_timeout = nlm_timeout * HZ; | ||
6070 | - | ||
6071 | /* | ||
6072 | * The main request loop. We don't terminate until the last | ||
6073 | * NFS mount or NFS daemon has gone away. | ||
6074 | @@ -350,6 +346,10 @@ static struct svc_serv *lockd_create_svc(void) | ||
6075 | printk(KERN_WARNING | ||
6076 | "lockd_up: no pid, %d users??\n", nlmsvc_users); | ||
6077 | |||
6078 | + if (!nlm_timeout) | ||
6079 | + nlm_timeout = LOCKD_DFLT_TIMEO; | ||
6080 | + nlmsvc_timeout = nlm_timeout * HZ; | ||
6081 | + | ||
6082 | serv = svc_create(&nlmsvc_program, LOCKD_BUFSIZE, NULL); | ||
6083 | if (!serv) { | ||
6084 | printk(KERN_WARNING "lockd_up: create service failed\n"); | ||
6085 | diff --git a/fs/locks.c b/fs/locks.c | ||
6086 | index 735b8d3fa78c..59e2f905e4ff 100644 | ||
6087 | --- a/fs/locks.c | ||
6088 | +++ b/fs/locks.c | ||
6089 | @@ -1702,7 +1702,7 @@ static int generic_delete_lease(struct file *filp) | ||
6090 | break; | ||
6091 | } | ||
6092 | trace_generic_delete_lease(inode, fl); | ||
6093 | - if (fl) | ||
6094 | + if (fl && IS_LEASE(fl)) | ||
6095 | error = fl->fl_lmops->lm_change(before, F_UNLCK, &dispose); | ||
6096 | spin_unlock(&inode->i_lock); | ||
6097 | locks_dispose_list(&dispose); | ||
6098 | diff --git a/fs/nfs/nfs4client.c b/fs/nfs/nfs4client.c | ||
6099 | index ffdb28d86cf8..9588873d4c46 100644 | ||
6100 | --- a/fs/nfs/nfs4client.c | ||
6101 | +++ b/fs/nfs/nfs4client.c | ||
6102 | @@ -572,20 +572,14 @@ static bool nfs4_match_clientids(struct nfs_client *a, struct nfs_client *b) | ||
6103 | } | ||
6104 | |||
6105 | /* | ||
6106 | - * Returns true if the server owners match | ||
6107 | + * Returns true if the server major ids match | ||
6108 | */ | ||
6109 | static bool | ||
6110 | -nfs4_match_serverowners(struct nfs_client *a, struct nfs_client *b) | ||
6111 | +nfs4_check_clientid_trunking(struct nfs_client *a, struct nfs_client *b) | ||
6112 | { | ||
6113 | struct nfs41_server_owner *o1 = a->cl_serverowner; | ||
6114 | struct nfs41_server_owner *o2 = b->cl_serverowner; | ||
6115 | |||
6116 | - if (o1->minor_id != o2->minor_id) { | ||
6117 | - dprintk("NFS: --> %s server owner minor IDs do not match\n", | ||
6118 | - __func__); | ||
6119 | - return false; | ||
6120 | - } | ||
6121 | - | ||
6122 | if (o1->major_id_sz != o2->major_id_sz) | ||
6123 | goto out_major_mismatch; | ||
6124 | if (memcmp(o1->major_id, o2->major_id, o1->major_id_sz) != 0) | ||
6125 | @@ -661,7 +655,12 @@ int nfs41_walk_client_list(struct nfs_client *new, | ||
6126 | if (!nfs4_match_clientids(pos, new)) | ||
6127 | continue; | ||
6128 | |||
6129 | - if (!nfs4_match_serverowners(pos, new)) | ||
6130 | + /* | ||
6131 | + * Note that session trunking is just a special subcase of | ||
6132 | + * client id trunking. In either case, we want to fall back | ||
6133 | + * to using the existing nfs_client. | ||
6134 | + */ | ||
6135 | + if (!nfs4_check_clientid_trunking(pos, new)) | ||
6136 | continue; | ||
6137 | |||
6138 | atomic_inc(&pos->cl_count); | ||
6139 | diff --git a/fs/proc/stat.c b/fs/proc/stat.c | ||
6140 | index bf2d03f8fd3e..510413eb25b8 100644 | ||
6141 | --- a/fs/proc/stat.c | ||
6142 | +++ b/fs/proc/stat.c | ||
6143 | @@ -159,7 +159,7 @@ static int show_stat(struct seq_file *p, void *v) | ||
6144 | |||
6145 | /* sum again ? it could be updated? */ | ||
6146 | for_each_irq_nr(j) | ||
6147 | - seq_put_decimal_ull(p, ' ', kstat_irqs(j)); | ||
6148 | + seq_put_decimal_ull(p, ' ', kstat_irqs_usr(j)); | ||
6149 | |||
6150 | seq_printf(p, | ||
6151 | "\nctxt %llu\n" | ||
6152 | diff --git a/include/linux/kernel_stat.h b/include/linux/kernel_stat.h | ||
6153 | index b9376cd5a187..25a822f6f000 100644 | ||
6154 | --- a/include/linux/kernel_stat.h | ||
6155 | +++ b/include/linux/kernel_stat.h | ||
6156 | @@ -68,6 +68,7 @@ static inline unsigned int kstat_softirqs_cpu(unsigned int irq, int cpu) | ||
6157 | * Number of interrupts per specific IRQ source, since bootup | ||
6158 | */ | ||
6159 | extern unsigned int kstat_irqs(unsigned int irq); | ||
6160 | +extern unsigned int kstat_irqs_usr(unsigned int irq); | ||
6161 | |||
6162 | /* | ||
6163 | * Number of interrupts per cpu, since bootup | ||
6164 | diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h | ||
6165 | index 74fd5d37f15a..22339b4b1c8c 100644 | ||
6166 | --- a/include/linux/netdevice.h | ||
6167 | +++ b/include/linux/netdevice.h | ||
6168 | @@ -998,12 +998,15 @@ typedef u16 (*select_queue_fallback_t)(struct net_device *dev, | ||
6169 | * Callback to use for xmit over the accelerated station. This | ||
6170 | * is used in place of ndo_start_xmit on accelerated net | ||
6171 | * devices. | ||
6172 | - * bool (*ndo_gso_check) (struct sk_buff *skb, | ||
6173 | - * struct net_device *dev); | ||
6174 | + * netdev_features_t (*ndo_features_check) (struct sk_buff *skb, | ||
6175 | + * struct net_device *dev | ||
6176 | + * netdev_features_t features); | ||
6177 | * Called by core transmit path to determine if device is capable of | ||
6178 | - * performing GSO on a packet. The device returns true if it is | ||
6179 | - * able to GSO the packet, false otherwise. If the return value is | ||
6180 | - * false the stack will do software GSO. | ||
6181 | + * performing offload operations on a given packet. This is to give | ||
6182 | + * the device an opportunity to implement any restrictions that cannot | ||
6183 | + * be otherwise expressed by feature flags. The check is called with | ||
6184 | + * the set of features that the stack has calculated and it returns | ||
6185 | + * those the driver believes to be appropriate. | ||
6186 | */ | ||
6187 | struct net_device_ops { | ||
6188 | int (*ndo_init)(struct net_device *dev); | ||
6189 | @@ -1153,8 +1156,9 @@ struct net_device_ops { | ||
6190 | struct net_device *dev, | ||
6191 | void *priv); | ||
6192 | int (*ndo_get_lock_subclass)(struct net_device *dev); | ||
6193 | - bool (*ndo_gso_check) (struct sk_buff *skb, | ||
6194 | - struct net_device *dev); | ||
6195 | + netdev_features_t (*ndo_features_check) (struct sk_buff *skb, | ||
6196 | + struct net_device *dev, | ||
6197 | + netdev_features_t features); | ||
6198 | }; | ||
6199 | |||
6200 | /** | ||
6201 | @@ -3584,8 +3588,6 @@ static inline bool netif_needs_gso(struct net_device *dev, struct sk_buff *skb, | ||
6202 | netdev_features_t features) | ||
6203 | { | ||
6204 | return skb_is_gso(skb) && (!skb_gso_ok(skb, features) || | ||
6205 | - (dev->netdev_ops->ndo_gso_check && | ||
6206 | - !dev->netdev_ops->ndo_gso_check(skb, dev)) || | ||
6207 | unlikely((skb->ip_summed != CHECKSUM_PARTIAL) && | ||
6208 | (skb->ip_summed != CHECKSUM_UNNECESSARY))); | ||
6209 | } | ||
6210 | diff --git a/include/net/vxlan.h b/include/net/vxlan.h | ||
6211 | index 57cccd0052e5..903461aa5644 100644 | ||
6212 | --- a/include/net/vxlan.h | ||
6213 | +++ b/include/net/vxlan.h | ||
6214 | @@ -1,6 +1,9 @@ | ||
6215 | #ifndef __NET_VXLAN_H | ||
6216 | #define __NET_VXLAN_H 1 | ||
6217 | |||
6218 | +#include <linux/ip.h> | ||
6219 | +#include <linux/ipv6.h> | ||
6220 | +#include <linux/if_vlan.h> | ||
6221 | #include <linux/skbuff.h> | ||
6222 | #include <linux/netdevice.h> | ||
6223 | #include <linux/udp.h> | ||
6224 | @@ -51,16 +54,33 @@ int vxlan_xmit_skb(struct vxlan_sock *vs, | ||
6225 | __be32 src, __be32 dst, __u8 tos, __u8 ttl, __be16 df, | ||
6226 | __be16 src_port, __be16 dst_port, __be32 vni, bool xnet); | ||
6227 | |||
6228 | -static inline bool vxlan_gso_check(struct sk_buff *skb) | ||
6229 | +static inline netdev_features_t vxlan_features_check(struct sk_buff *skb, | ||
6230 | + netdev_features_t features) | ||
6231 | { | ||
6232 | - if ((skb_shinfo(skb)->gso_type & SKB_GSO_UDP_TUNNEL) && | ||
6233 | + u8 l4_hdr = 0; | ||
6234 | + | ||
6235 | + if (!skb->encapsulation) | ||
6236 | + return features; | ||
6237 | + | ||
6238 | + switch (vlan_get_protocol(skb)) { | ||
6239 | + case htons(ETH_P_IP): | ||
6240 | + l4_hdr = ip_hdr(skb)->protocol; | ||
6241 | + break; | ||
6242 | + case htons(ETH_P_IPV6): | ||
6243 | + l4_hdr = ipv6_hdr(skb)->nexthdr; | ||
6244 | + break; | ||
6245 | + default: | ||
6246 | + return features;; | ||
6247 | + } | ||
6248 | + | ||
6249 | + if ((l4_hdr == IPPROTO_UDP) && | ||
6250 | (skb->inner_protocol_type != ENCAP_TYPE_ETHER || | ||
6251 | skb->inner_protocol != htons(ETH_P_TEB) || | ||
6252 | (skb_inner_mac_header(skb) - skb_transport_header(skb) != | ||
6253 | sizeof(struct udphdr) + sizeof(struct vxlanhdr)))) | ||
6254 | - return false; | ||
6255 | + return features & ~(NETIF_F_ALL_CSUM | NETIF_F_GSO_MASK); | ||
6256 | |||
6257 | - return true; | ||
6258 | + return features; | ||
6259 | } | ||
6260 | |||
6261 | /* IP header + UDP + VXLAN + Ethernet header */ | ||
6262 | diff --git a/include/uapi/linux/in6.h b/include/uapi/linux/in6.h | ||
6263 | index 74a2a1773494..79b12b004ade 100644 | ||
6264 | --- a/include/uapi/linux/in6.h | ||
6265 | +++ b/include/uapi/linux/in6.h | ||
6266 | @@ -149,7 +149,7 @@ struct in6_flowlabel_req { | ||
6267 | /* | ||
6268 | * IPV6 socket options | ||
6269 | */ | ||
6270 | - | ||
6271 | +#if __UAPI_DEF_IPV6_OPTIONS | ||
6272 | #define IPV6_ADDRFORM 1 | ||
6273 | #define IPV6_2292PKTINFO 2 | ||
6274 | #define IPV6_2292HOPOPTS 3 | ||
6275 | @@ -196,6 +196,7 @@ struct in6_flowlabel_req { | ||
6276 | |||
6277 | #define IPV6_IPSEC_POLICY 34 | ||
6278 | #define IPV6_XFRM_POLICY 35 | ||
6279 | +#endif | ||
6280 | |||
6281 | /* | ||
6282 | * Multicast: | ||
6283 | diff --git a/include/uapi/linux/libc-compat.h b/include/uapi/linux/libc-compat.h | ||
6284 | index c140620dad92..e28807ad17fa 100644 | ||
6285 | --- a/include/uapi/linux/libc-compat.h | ||
6286 | +++ b/include/uapi/linux/libc-compat.h | ||
6287 | @@ -69,6 +69,7 @@ | ||
6288 | #define __UAPI_DEF_SOCKADDR_IN6 0 | ||
6289 | #define __UAPI_DEF_IPV6_MREQ 0 | ||
6290 | #define __UAPI_DEF_IPPROTO_V6 0 | ||
6291 | +#define __UAPI_DEF_IPV6_OPTIONS 0 | ||
6292 | |||
6293 | #else | ||
6294 | |||
6295 | @@ -82,6 +83,7 @@ | ||
6296 | #define __UAPI_DEF_SOCKADDR_IN6 1 | ||
6297 | #define __UAPI_DEF_IPV6_MREQ 1 | ||
6298 | #define __UAPI_DEF_IPPROTO_V6 1 | ||
6299 | +#define __UAPI_DEF_IPV6_OPTIONS 1 | ||
6300 | |||
6301 | #endif /* _NETINET_IN_H */ | ||
6302 | |||
6303 | @@ -103,6 +105,7 @@ | ||
6304 | #define __UAPI_DEF_SOCKADDR_IN6 1 | ||
6305 | #define __UAPI_DEF_IPV6_MREQ 1 | ||
6306 | #define __UAPI_DEF_IPPROTO_V6 1 | ||
6307 | +#define __UAPI_DEF_IPV6_OPTIONS 1 | ||
6308 | |||
6309 | /* Definitions for xattr.h */ | ||
6310 | #define __UAPI_DEF_XATTR 1 | ||
6311 | diff --git a/include/uapi/linux/target_core_user.h b/include/uapi/linux/target_core_user.h | ||
6312 | index 7dcfbe6771b1..b483d1909d3e 100644 | ||
6313 | --- a/include/uapi/linux/target_core_user.h | ||
6314 | +++ b/include/uapi/linux/target_core_user.h | ||
6315 | @@ -6,10 +6,6 @@ | ||
6316 | #include <linux/types.h> | ||
6317 | #include <linux/uio.h> | ||
6318 | |||
6319 | -#ifndef __packed | ||
6320 | -#define __packed __attribute__((packed)) | ||
6321 | -#endif | ||
6322 | - | ||
6323 | #define TCMU_VERSION "1.0" | ||
6324 | |||
6325 | /* | ||
6326 | diff --git a/kernel/irq/internals.h b/kernel/irq/internals.h | ||
6327 | index 4332d766619d..df553b0af936 100644 | ||
6328 | --- a/kernel/irq/internals.h | ||
6329 | +++ b/kernel/irq/internals.h | ||
6330 | @@ -78,8 +78,12 @@ extern void unmask_threaded_irq(struct irq_desc *desc); | ||
6331 | |||
6332 | #ifdef CONFIG_SPARSE_IRQ | ||
6333 | static inline void irq_mark_irq(unsigned int irq) { } | ||
6334 | +extern void irq_lock_sparse(void); | ||
6335 | +extern void irq_unlock_sparse(void); | ||
6336 | #else | ||
6337 | extern void irq_mark_irq(unsigned int irq); | ||
6338 | +static inline void irq_lock_sparse(void) { } | ||
6339 | +static inline void irq_unlock_sparse(void) { } | ||
6340 | #endif | ||
6341 | |||
6342 | extern void init_kstat_irqs(struct irq_desc *desc, int node, int nr); | ||
6343 | diff --git a/kernel/irq/irqdesc.c b/kernel/irq/irqdesc.c | ||
6344 | index a1782f88f0af..99793b9b6d23 100644 | ||
6345 | --- a/kernel/irq/irqdesc.c | ||
6346 | +++ b/kernel/irq/irqdesc.c | ||
6347 | @@ -132,6 +132,16 @@ static void free_masks(struct irq_desc *desc) | ||
6348 | static inline void free_masks(struct irq_desc *desc) { } | ||
6349 | #endif | ||
6350 | |||
6351 | +void irq_lock_sparse(void) | ||
6352 | +{ | ||
6353 | + mutex_lock(&sparse_irq_lock); | ||
6354 | +} | ||
6355 | + | ||
6356 | +void irq_unlock_sparse(void) | ||
6357 | +{ | ||
6358 | + mutex_unlock(&sparse_irq_lock); | ||
6359 | +} | ||
6360 | + | ||
6361 | static struct irq_desc *alloc_desc(int irq, int node, struct module *owner) | ||
6362 | { | ||
6363 | struct irq_desc *desc; | ||
6364 | @@ -168,6 +178,12 @@ static void free_desc(unsigned int irq) | ||
6365 | |||
6366 | unregister_irq_proc(irq, desc); | ||
6367 | |||
6368 | + /* | ||
6369 | + * sparse_irq_lock protects also show_interrupts() and | ||
6370 | + * kstat_irq_usr(). Once we deleted the descriptor from the | ||
6371 | + * sparse tree we can free it. Access in proc will fail to | ||
6372 | + * lookup the descriptor. | ||
6373 | + */ | ||
6374 | mutex_lock(&sparse_irq_lock); | ||
6375 | delete_irq_desc(irq); | ||
6376 | mutex_unlock(&sparse_irq_lock); | ||
6377 | @@ -574,6 +590,15 @@ void kstat_incr_irq_this_cpu(unsigned int irq) | ||
6378 | kstat_incr_irqs_this_cpu(irq, irq_to_desc(irq)); | ||
6379 | } | ||
6380 | |||
6381 | +/** | ||
6382 | + * kstat_irqs_cpu - Get the statistics for an interrupt on a cpu | ||
6383 | + * @irq: The interrupt number | ||
6384 | + * @cpu: The cpu number | ||
6385 | + * | ||
6386 | + * Returns the sum of interrupt counts on @cpu since boot for | ||
6387 | + * @irq. The caller must ensure that the interrupt is not removed | ||
6388 | + * concurrently. | ||
6389 | + */ | ||
6390 | unsigned int kstat_irqs_cpu(unsigned int irq, int cpu) | ||
6391 | { | ||
6392 | struct irq_desc *desc = irq_to_desc(irq); | ||
6393 | @@ -582,6 +607,14 @@ unsigned int kstat_irqs_cpu(unsigned int irq, int cpu) | ||
6394 | *per_cpu_ptr(desc->kstat_irqs, cpu) : 0; | ||
6395 | } | ||
6396 | |||
6397 | +/** | ||
6398 | + * kstat_irqs - Get the statistics for an interrupt | ||
6399 | + * @irq: The interrupt number | ||
6400 | + * | ||
6401 | + * Returns the sum of interrupt counts on all cpus since boot for | ||
6402 | + * @irq. The caller must ensure that the interrupt is not removed | ||
6403 | + * concurrently. | ||
6404 | + */ | ||
6405 | unsigned int kstat_irqs(unsigned int irq) | ||
6406 | { | ||
6407 | struct irq_desc *desc = irq_to_desc(irq); | ||
6408 | @@ -594,3 +627,22 @@ unsigned int kstat_irqs(unsigned int irq) | ||
6409 | sum += *per_cpu_ptr(desc->kstat_irqs, cpu); | ||
6410 | return sum; | ||
6411 | } | ||
6412 | + | ||
6413 | +/** | ||
6414 | + * kstat_irqs_usr - Get the statistics for an interrupt | ||
6415 | + * @irq: The interrupt number | ||
6416 | + * | ||
6417 | + * Returns the sum of interrupt counts on all cpus since boot for | ||
6418 | + * @irq. Contrary to kstat_irqs() this can be called from any | ||
6419 | + * preemptible context. It's protected against concurrent removal of | ||
6420 | + * an interrupt descriptor when sparse irqs are enabled. | ||
6421 | + */ | ||
6422 | +unsigned int kstat_irqs_usr(unsigned int irq) | ||
6423 | +{ | ||
6424 | + int sum; | ||
6425 | + | ||
6426 | + irq_lock_sparse(); | ||
6427 | + sum = kstat_irqs(irq); | ||
6428 | + irq_unlock_sparse(); | ||
6429 | + return sum; | ||
6430 | +} | ||
6431 | diff --git a/kernel/irq/proc.c b/kernel/irq/proc.c | ||
6432 | index ac1ba2f11032..9dc9bfd8a678 100644 | ||
6433 | --- a/kernel/irq/proc.c | ||
6434 | +++ b/kernel/irq/proc.c | ||
6435 | @@ -15,6 +15,23 @@ | ||
6436 | |||
6437 | #include "internals.h" | ||
6438 | |||
6439 | +/* | ||
6440 | + * Access rules: | ||
6441 | + * | ||
6442 | + * procfs protects read/write of /proc/irq/N/ files against a | ||
6443 | + * concurrent free of the interrupt descriptor. remove_proc_entry() | ||
6444 | + * immediately prevents new read/writes to happen and waits for | ||
6445 | + * already running read/write functions to complete. | ||
6446 | + * | ||
6447 | + * We remove the proc entries first and then delete the interrupt | ||
6448 | + * descriptor from the radix tree and free it. So it is guaranteed | ||
6449 | + * that irq_to_desc(N) is valid as long as the read/writes are | ||
6450 | + * permitted by procfs. | ||
6451 | + * | ||
6452 | + * The read from /proc/interrupts is a different problem because there | ||
6453 | + * is no protection. So the lookup and the access to irqdesc | ||
6454 | + * information must be protected by sparse_irq_lock. | ||
6455 | + */ | ||
6456 | static struct proc_dir_entry *root_irq_dir; | ||
6457 | |||
6458 | #ifdef CONFIG_SMP | ||
6459 | @@ -437,9 +454,10 @@ int show_interrupts(struct seq_file *p, void *v) | ||
6460 | seq_putc(p, '\n'); | ||
6461 | } | ||
6462 | |||
6463 | + irq_lock_sparse(); | ||
6464 | desc = irq_to_desc(i); | ||
6465 | if (!desc) | ||
6466 | - return 0; | ||
6467 | + goto outsparse; | ||
6468 | |||
6469 | raw_spin_lock_irqsave(&desc->lock, flags); | ||
6470 | for_each_online_cpu(j) | ||
6471 | @@ -479,6 +497,8 @@ int show_interrupts(struct seq_file *p, void *v) | ||
6472 | seq_putc(p, '\n'); | ||
6473 | out: | ||
6474 | raw_spin_unlock_irqrestore(&desc->lock, flags); | ||
6475 | +outsparse: | ||
6476 | + irq_unlock_sparse(); | ||
6477 | return 0; | ||
6478 | } | ||
6479 | #endif | ||
6480 | diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c | ||
6481 | index 7b5741fc4110..8c30ef7a2b70 100644 | ||
6482 | --- a/kernel/time/tick-sched.c | ||
6483 | +++ b/kernel/time/tick-sched.c | ||
6484 | @@ -847,7 +847,6 @@ void tick_nohz_idle_enter(void) | ||
6485 | |||
6486 | local_irq_enable(); | ||
6487 | } | ||
6488 | -EXPORT_SYMBOL_GPL(tick_nohz_idle_enter); | ||
6489 | |||
6490 | /** | ||
6491 | * tick_nohz_irq_exit - update next tick event from interrupt exit | ||
6492 | @@ -974,7 +973,6 @@ void tick_nohz_idle_exit(void) | ||
6493 | |||
6494 | local_irq_enable(); | ||
6495 | } | ||
6496 | -EXPORT_SYMBOL_GPL(tick_nohz_idle_exit); | ||
6497 | |||
6498 | static int tick_nohz_reprogram(struct tick_sched *ts, ktime_t now) | ||
6499 | { | ||
6500 | diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c | ||
6501 | index 31c90fec4158..124e2c702ead 100644 | ||
6502 | --- a/kernel/trace/ftrace.c | ||
6503 | +++ b/kernel/trace/ftrace.c | ||
6504 | @@ -2308,12 +2308,14 @@ static void ftrace_run_update_code(int command) | ||
6505 | } | ||
6506 | |||
6507 | static void ftrace_run_modify_code(struct ftrace_ops *ops, int command, | ||
6508 | - struct ftrace_hash *old_hash) | ||
6509 | + struct ftrace_ops_hash *old_hash) | ||
6510 | { | ||
6511 | ops->flags |= FTRACE_OPS_FL_MODIFYING; | ||
6512 | - ops->old_hash.filter_hash = old_hash; | ||
6513 | + ops->old_hash.filter_hash = old_hash->filter_hash; | ||
6514 | + ops->old_hash.notrace_hash = old_hash->notrace_hash; | ||
6515 | ftrace_run_update_code(command); | ||
6516 | ops->old_hash.filter_hash = NULL; | ||
6517 | + ops->old_hash.notrace_hash = NULL; | ||
6518 | ops->flags &= ~FTRACE_OPS_FL_MODIFYING; | ||
6519 | } | ||
6520 | |||
6521 | @@ -3357,7 +3359,7 @@ static struct ftrace_ops trace_probe_ops __read_mostly = | ||
6522 | |||
6523 | static int ftrace_probe_registered; | ||
6524 | |||
6525 | -static void __enable_ftrace_function_probe(struct ftrace_hash *old_hash) | ||
6526 | +static void __enable_ftrace_function_probe(struct ftrace_ops_hash *old_hash) | ||
6527 | { | ||
6528 | int ret; | ||
6529 | int i; | ||
6530 | @@ -3415,6 +3417,7 @@ int | ||
6531 | register_ftrace_function_probe(char *glob, struct ftrace_probe_ops *ops, | ||
6532 | void *data) | ||
6533 | { | ||
6534 | + struct ftrace_ops_hash old_hash_ops; | ||
6535 | struct ftrace_func_probe *entry; | ||
6536 | struct ftrace_hash **orig_hash = &trace_probe_ops.func_hash->filter_hash; | ||
6537 | struct ftrace_hash *old_hash = *orig_hash; | ||
6538 | @@ -3436,6 +3439,10 @@ register_ftrace_function_probe(char *glob, struct ftrace_probe_ops *ops, | ||
6539 | |||
6540 | mutex_lock(&trace_probe_ops.func_hash->regex_lock); | ||
6541 | |||
6542 | + old_hash_ops.filter_hash = old_hash; | ||
6543 | + /* Probes only have filters */ | ||
6544 | + old_hash_ops.notrace_hash = NULL; | ||
6545 | + | ||
6546 | hash = alloc_and_copy_ftrace_hash(FTRACE_HASH_DEFAULT_BITS, old_hash); | ||
6547 | if (!hash) { | ||
6548 | count = -ENOMEM; | ||
6549 | @@ -3496,7 +3503,7 @@ register_ftrace_function_probe(char *glob, struct ftrace_probe_ops *ops, | ||
6550 | |||
6551 | ret = ftrace_hash_move(&trace_probe_ops, 1, orig_hash, hash); | ||
6552 | |||
6553 | - __enable_ftrace_function_probe(old_hash); | ||
6554 | + __enable_ftrace_function_probe(&old_hash_ops); | ||
6555 | |||
6556 | if (!ret) | ||
6557 | free_ftrace_hash_rcu(old_hash); | ||
6558 | @@ -3784,10 +3791,34 @@ ftrace_match_addr(struct ftrace_hash *hash, unsigned long ip, int remove) | ||
6559 | } | ||
6560 | |||
6561 | static void ftrace_ops_update_code(struct ftrace_ops *ops, | ||
6562 | - struct ftrace_hash *old_hash) | ||
6563 | + struct ftrace_ops_hash *old_hash) | ||
6564 | { | ||
6565 | - if (ops->flags & FTRACE_OPS_FL_ENABLED && ftrace_enabled) | ||
6566 | + struct ftrace_ops *op; | ||
6567 | + | ||
6568 | + if (!ftrace_enabled) | ||
6569 | + return; | ||
6570 | + | ||
6571 | + if (ops->flags & FTRACE_OPS_FL_ENABLED) { | ||
6572 | ftrace_run_modify_code(ops, FTRACE_UPDATE_CALLS, old_hash); | ||
6573 | + return; | ||
6574 | + } | ||
6575 | + | ||
6576 | + /* | ||
6577 | + * If this is the shared global_ops filter, then we need to | ||
6578 | + * check if there is another ops that shares it, is enabled. | ||
6579 | + * If so, we still need to run the modify code. | ||
6580 | + */ | ||
6581 | + if (ops->func_hash != &global_ops.local_hash) | ||
6582 | + return; | ||
6583 | + | ||
6584 | + do_for_each_ftrace_op(op, ftrace_ops_list) { | ||
6585 | + if (op->func_hash == &global_ops.local_hash && | ||
6586 | + op->flags & FTRACE_OPS_FL_ENABLED) { | ||
6587 | + ftrace_run_modify_code(op, FTRACE_UPDATE_CALLS, old_hash); | ||
6588 | + /* Only need to do this once */ | ||
6589 | + return; | ||
6590 | + } | ||
6591 | + } while_for_each_ftrace_op(op); | ||
6592 | } | ||
6593 | |||
6594 | static int | ||
6595 | @@ -3795,6 +3826,7 @@ ftrace_set_hash(struct ftrace_ops *ops, unsigned char *buf, int len, | ||
6596 | unsigned long ip, int remove, int reset, int enable) | ||
6597 | { | ||
6598 | struct ftrace_hash **orig_hash; | ||
6599 | + struct ftrace_ops_hash old_hash_ops; | ||
6600 | struct ftrace_hash *old_hash; | ||
6601 | struct ftrace_hash *hash; | ||
6602 | int ret; | ||
6603 | @@ -3831,9 +3863,11 @@ ftrace_set_hash(struct ftrace_ops *ops, unsigned char *buf, int len, | ||
6604 | |||
6605 | mutex_lock(&ftrace_lock); | ||
6606 | old_hash = *orig_hash; | ||
6607 | + old_hash_ops.filter_hash = ops->func_hash->filter_hash; | ||
6608 | + old_hash_ops.notrace_hash = ops->func_hash->notrace_hash; | ||
6609 | ret = ftrace_hash_move(ops, enable, orig_hash, hash); | ||
6610 | if (!ret) { | ||
6611 | - ftrace_ops_update_code(ops, old_hash); | ||
6612 | + ftrace_ops_update_code(ops, &old_hash_ops); | ||
6613 | free_ftrace_hash_rcu(old_hash); | ||
6614 | } | ||
6615 | mutex_unlock(&ftrace_lock); | ||
6616 | @@ -4042,6 +4076,7 @@ static void __init set_ftrace_early_filters(void) | ||
6617 | int ftrace_regex_release(struct inode *inode, struct file *file) | ||
6618 | { | ||
6619 | struct seq_file *m = (struct seq_file *)file->private_data; | ||
6620 | + struct ftrace_ops_hash old_hash_ops; | ||
6621 | struct ftrace_iterator *iter; | ||
6622 | struct ftrace_hash **orig_hash; | ||
6623 | struct ftrace_hash *old_hash; | ||
6624 | @@ -4075,10 +4110,12 @@ int ftrace_regex_release(struct inode *inode, struct file *file) | ||
6625 | |||
6626 | mutex_lock(&ftrace_lock); | ||
6627 | old_hash = *orig_hash; | ||
6628 | + old_hash_ops.filter_hash = iter->ops->func_hash->filter_hash; | ||
6629 | + old_hash_ops.notrace_hash = iter->ops->func_hash->notrace_hash; | ||
6630 | ret = ftrace_hash_move(iter->ops, filter_hash, | ||
6631 | orig_hash, iter->hash); | ||
6632 | if (!ret) { | ||
6633 | - ftrace_ops_update_code(iter->ops, old_hash); | ||
6634 | + ftrace_ops_update_code(iter->ops, &old_hash_ops); | ||
6635 | free_ftrace_hash_rcu(old_hash); | ||
6636 | } | ||
6637 | mutex_unlock(&ftrace_lock); | ||
6638 | diff --git a/lib/decompress_bunzip2.c b/lib/decompress_bunzip2.c | ||
6639 | index 8290e0bef7ea..6dd0335ea61b 100644 | ||
6640 | --- a/lib/decompress_bunzip2.c | ||
6641 | +++ b/lib/decompress_bunzip2.c | ||
6642 | @@ -184,7 +184,7 @@ static int INIT get_next_block(struct bunzip_data *bd) | ||
6643 | if (get_bits(bd, 1)) | ||
6644 | return RETVAL_OBSOLETE_INPUT; | ||
6645 | origPtr = get_bits(bd, 24); | ||
6646 | - if (origPtr > dbufSize) | ||
6647 | + if (origPtr >= dbufSize) | ||
6648 | return RETVAL_DATA_ERROR; | ||
6649 | /* mapping table: if some byte values are never used (encoding things | ||
6650 | like ascii text), the compression code removes the gaps to have fewer | ||
6651 | diff --git a/net/batman-adv/fragmentation.c b/net/batman-adv/fragmentation.c | ||
6652 | index fc1835c6bb40..00f9e144cc97 100644 | ||
6653 | --- a/net/batman-adv/fragmentation.c | ||
6654 | +++ b/net/batman-adv/fragmentation.c | ||
6655 | @@ -251,7 +251,7 @@ batadv_frag_merge_packets(struct hlist_head *chain, struct sk_buff *skb) | ||
6656 | kfree(entry); | ||
6657 | |||
6658 | /* Make room for the rest of the fragments. */ | ||
6659 | - if (pskb_expand_head(skb_out, 0, size - skb->len, GFP_ATOMIC) < 0) { | ||
6660 | + if (pskb_expand_head(skb_out, 0, size - skb_out->len, GFP_ATOMIC) < 0) { | ||
6661 | kfree_skb(skb_out); | ||
6662 | skb_out = NULL; | ||
6663 | goto free; | ||
6664 | @@ -434,7 +434,7 @@ bool batadv_frag_send_packet(struct sk_buff *skb, | ||
6665 | * fragments larger than BATADV_FRAG_MAX_FRAG_SIZE | ||
6666 | */ | ||
6667 | mtu = min_t(unsigned, mtu, BATADV_FRAG_MAX_FRAG_SIZE); | ||
6668 | - max_fragment_size = (mtu - header_size - ETH_HLEN); | ||
6669 | + max_fragment_size = mtu - header_size; | ||
6670 | max_packet_size = max_fragment_size * BATADV_FRAG_MAX_FRAGMENTS; | ||
6671 | |||
6672 | /* Don't even try to fragment, if we need more than 16 fragments */ | ||
6673 | diff --git a/net/batman-adv/gateway_client.c b/net/batman-adv/gateway_client.c | ||
6674 | index 90cff585b37d..e0bcf9e84273 100644 | ||
6675 | --- a/net/batman-adv/gateway_client.c | ||
6676 | +++ b/net/batman-adv/gateway_client.c | ||
6677 | @@ -810,7 +810,7 @@ bool batadv_gw_out_of_range(struct batadv_priv *bat_priv, | ||
6678 | goto out; | ||
6679 | |||
6680 | gw_node = batadv_gw_node_get(bat_priv, orig_dst_node); | ||
6681 | - if (!gw_node->bandwidth_down == 0) | ||
6682 | + if (!gw_node) | ||
6683 | goto out; | ||
6684 | |||
6685 | switch (atomic_read(&bat_priv->gw_mode)) { | ||
6686 | diff --git a/net/core/dev.c b/net/core/dev.c | ||
6687 | index 945bbd001359..84409688ff39 100644 | ||
6688 | --- a/net/core/dev.c | ||
6689 | +++ b/net/core/dev.c | ||
6690 | @@ -1697,6 +1697,7 @@ int __dev_forward_skb(struct net_device *dev, struct sk_buff *skb) | ||
6691 | |||
6692 | skb_scrub_packet(skb, true); | ||
6693 | skb->protocol = eth_type_trans(skb, dev); | ||
6694 | + skb_postpull_rcsum(skb, eth_hdr(skb), ETH_HLEN); | ||
6695 | |||
6696 | return 0; | ||
6697 | } | ||
6698 | @@ -2565,7 +2566,7 @@ static netdev_features_t harmonize_features(struct sk_buff *skb, | ||
6699 | |||
6700 | netdev_features_t netif_skb_features(struct sk_buff *skb) | ||
6701 | { | ||
6702 | - const struct net_device *dev = skb->dev; | ||
6703 | + struct net_device *dev = skb->dev; | ||
6704 | netdev_features_t features = dev->features; | ||
6705 | u16 gso_segs = skb_shinfo(skb)->gso_segs; | ||
6706 | __be16 protocol = skb->protocol; | ||
6707 | @@ -2573,11 +2574,21 @@ netdev_features_t netif_skb_features(struct sk_buff *skb) | ||
6708 | if (gso_segs > dev->gso_max_segs || gso_segs < dev->gso_min_segs) | ||
6709 | features &= ~NETIF_F_GSO_MASK; | ||
6710 | |||
6711 | - if (protocol == htons(ETH_P_8021Q) || protocol == htons(ETH_P_8021AD)) { | ||
6712 | - struct vlan_ethhdr *veh = (struct vlan_ethhdr *)skb->data; | ||
6713 | - protocol = veh->h_vlan_encapsulated_proto; | ||
6714 | - } else if (!vlan_tx_tag_present(skb)) { | ||
6715 | - return harmonize_features(skb, features); | ||
6716 | + /* If encapsulation offload request, verify we are testing | ||
6717 | + * hardware encapsulation features instead of standard | ||
6718 | + * features for the netdev | ||
6719 | + */ | ||
6720 | + if (skb->encapsulation) | ||
6721 | + features &= dev->hw_enc_features; | ||
6722 | + | ||
6723 | + if (!vlan_tx_tag_present(skb)) { | ||
6724 | + if (unlikely(protocol == htons(ETH_P_8021Q) || | ||
6725 | + protocol == htons(ETH_P_8021AD))) { | ||
6726 | + struct vlan_ethhdr *veh = (struct vlan_ethhdr *)skb->data; | ||
6727 | + protocol = veh->h_vlan_encapsulated_proto; | ||
6728 | + } else { | ||
6729 | + goto finalize; | ||
6730 | + } | ||
6731 | } | ||
6732 | |||
6733 | features = netdev_intersect_features(features, | ||
6734 | @@ -2594,6 +2605,11 @@ netdev_features_t netif_skb_features(struct sk_buff *skb) | ||
6735 | NETIF_F_HW_VLAN_CTAG_TX | | ||
6736 | NETIF_F_HW_VLAN_STAG_TX); | ||
6737 | |||
6738 | +finalize: | ||
6739 | + if (dev->netdev_ops->ndo_features_check) | ||
6740 | + features &= dev->netdev_ops->ndo_features_check(skb, dev, | ||
6741 | + features); | ||
6742 | + | ||
6743 | return harmonize_features(skb, features); | ||
6744 | } | ||
6745 | EXPORT_SYMBOL(netif_skb_features); | ||
6746 | @@ -2668,19 +2684,12 @@ static struct sk_buff *validate_xmit_skb(struct sk_buff *skb, struct net_device | ||
6747 | if (unlikely(!skb)) | ||
6748 | goto out_null; | ||
6749 | |||
6750 | - /* If encapsulation offload request, verify we are testing | ||
6751 | - * hardware encapsulation features instead of standard | ||
6752 | - * features for the netdev | ||
6753 | - */ | ||
6754 | - if (skb->encapsulation) | ||
6755 | - features &= dev->hw_enc_features; | ||
6756 | - | ||
6757 | if (netif_needs_gso(dev, skb, features)) { | ||
6758 | struct sk_buff *segs; | ||
6759 | |||
6760 | segs = skb_gso_segment(skb, features); | ||
6761 | if (IS_ERR(segs)) { | ||
6762 | - segs = NULL; | ||
6763 | + goto out_kfree_skb; | ||
6764 | } else if (segs) { | ||
6765 | consume_skb(skb); | ||
6766 | skb = segs; | ||
6767 | diff --git a/net/core/skbuff.c b/net/core/skbuff.c | ||
6768 | index 32e31c299631..d7543d0fd744 100644 | ||
6769 | --- a/net/core/skbuff.c | ||
6770 | +++ b/net/core/skbuff.c | ||
6771 | @@ -4040,6 +4040,7 @@ void skb_scrub_packet(struct sk_buff *skb, bool xnet) | ||
6772 | skb->ignore_df = 0; | ||
6773 | skb_dst_drop(skb); | ||
6774 | skb->mark = 0; | ||
6775 | + skb_init_secmark(skb); | ||
6776 | secpath_reset(skb); | ||
6777 | nf_reset(skb); | ||
6778 | nf_reset_trace(skb); | ||
6779 | diff --git a/net/ipv4/geneve.c b/net/ipv4/geneve.c | ||
6780 | index dedb21e99914..2caa6ad965a6 100644 | ||
6781 | --- a/net/ipv4/geneve.c | ||
6782 | +++ b/net/ipv4/geneve.c | ||
6783 | @@ -165,6 +165,15 @@ static void geneve_notify_add_rx_port(struct geneve_sock *gs) | ||
6784 | } | ||
6785 | } | ||
6786 | |||
6787 | +static void geneve_notify_del_rx_port(struct geneve_sock *gs) | ||
6788 | +{ | ||
6789 | + struct sock *sk = gs->sock->sk; | ||
6790 | + sa_family_t sa_family = sk->sk_family; | ||
6791 | + | ||
6792 | + if (sa_family == AF_INET) | ||
6793 | + udp_del_offload(&gs->udp_offloads); | ||
6794 | +} | ||
6795 | + | ||
6796 | /* Callback from net/ipv4/udp.c to receive packets */ | ||
6797 | static int geneve_udp_encap_recv(struct sock *sk, struct sk_buff *skb) | ||
6798 | { | ||
6799 | @@ -293,6 +302,7 @@ struct geneve_sock *geneve_sock_add(struct net *net, __be16 port, | ||
6800 | geneve_rcv_t *rcv, void *data, | ||
6801 | bool no_share, bool ipv6) | ||
6802 | { | ||
6803 | + struct geneve_net *gn = net_generic(net, geneve_net_id); | ||
6804 | struct geneve_sock *gs; | ||
6805 | |||
6806 | gs = geneve_socket_create(net, port, rcv, data, ipv6); | ||
6807 | @@ -302,15 +312,15 @@ struct geneve_sock *geneve_sock_add(struct net *net, __be16 port, | ||
6808 | if (no_share) /* Return error if sharing is not allowed. */ | ||
6809 | return ERR_PTR(-EINVAL); | ||
6810 | |||
6811 | + spin_lock(&gn->sock_lock); | ||
6812 | gs = geneve_find_sock(net, port); | ||
6813 | - if (gs) { | ||
6814 | - if (gs->rcv == rcv) | ||
6815 | - atomic_inc(&gs->refcnt); | ||
6816 | - else | ||
6817 | + if (gs && ((gs->rcv != rcv) || | ||
6818 | + !atomic_add_unless(&gs->refcnt, 1, 0))) | ||
6819 | gs = ERR_PTR(-EBUSY); | ||
6820 | - } else { | ||
6821 | + spin_unlock(&gn->sock_lock); | ||
6822 | + | ||
6823 | + if (!gs) | ||
6824 | gs = ERR_PTR(-EINVAL); | ||
6825 | - } | ||
6826 | |||
6827 | return gs; | ||
6828 | } | ||
6829 | @@ -318,9 +328,17 @@ EXPORT_SYMBOL_GPL(geneve_sock_add); | ||
6830 | |||
6831 | void geneve_sock_release(struct geneve_sock *gs) | ||
6832 | { | ||
6833 | + struct net *net = sock_net(gs->sock->sk); | ||
6834 | + struct geneve_net *gn = net_generic(net, geneve_net_id); | ||
6835 | + | ||
6836 | if (!atomic_dec_and_test(&gs->refcnt)) | ||
6837 | return; | ||
6838 | |||
6839 | + spin_lock(&gn->sock_lock); | ||
6840 | + hlist_del_rcu(&gs->hlist); | ||
6841 | + geneve_notify_del_rx_port(gs); | ||
6842 | + spin_unlock(&gn->sock_lock); | ||
6843 | + | ||
6844 | queue_work(geneve_wq, &gs->del_work); | ||
6845 | } | ||
6846 | EXPORT_SYMBOL_GPL(geneve_sock_release); | ||
6847 | diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c | ||
6848 | index 12055fdbe716..69aaf0a2c424 100644 | ||
6849 | --- a/net/ipv4/ip_gre.c | ||
6850 | +++ b/net/ipv4/ip_gre.c | ||
6851 | @@ -252,10 +252,6 @@ static netdev_tx_t ipgre_xmit(struct sk_buff *skb, | ||
6852 | struct ip_tunnel *tunnel = netdev_priv(dev); | ||
6853 | const struct iphdr *tnl_params; | ||
6854 | |||
6855 | - skb = gre_handle_offloads(skb, !!(tunnel->parms.o_flags&TUNNEL_CSUM)); | ||
6856 | - if (IS_ERR(skb)) | ||
6857 | - goto out; | ||
6858 | - | ||
6859 | if (dev->header_ops) { | ||
6860 | /* Need space for new headers */ | ||
6861 | if (skb_cow_head(skb, dev->needed_headroom - | ||
6862 | @@ -268,6 +264,7 @@ static netdev_tx_t ipgre_xmit(struct sk_buff *skb, | ||
6863 | * to gre header. | ||
6864 | */ | ||
6865 | skb_pull(skb, tunnel->hlen + sizeof(struct iphdr)); | ||
6866 | + skb_reset_mac_header(skb); | ||
6867 | } else { | ||
6868 | if (skb_cow_head(skb, dev->needed_headroom)) | ||
6869 | goto free_skb; | ||
6870 | @@ -275,6 +272,10 @@ static netdev_tx_t ipgre_xmit(struct sk_buff *skb, | ||
6871 | tnl_params = &tunnel->parms.iph; | ||
6872 | } | ||
6873 | |||
6874 | + skb = gre_handle_offloads(skb, !!(tunnel->parms.o_flags&TUNNEL_CSUM)); | ||
6875 | + if (IS_ERR(skb)) | ||
6876 | + goto out; | ||
6877 | + | ||
6878 | __gre_xmit(skb, dev, tnl_params, skb->protocol); | ||
6879 | |||
6880 | return NETDEV_TX_OK; | ||
6881 | diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c | ||
6882 | index a3d453b94747..c2df40ba553f 100644 | ||
6883 | --- a/net/ipv4/tcp_output.c | ||
6884 | +++ b/net/ipv4/tcp_output.c | ||
6885 | @@ -1984,7 +1984,7 @@ static bool tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle, | ||
6886 | if (unlikely(!tcp_snd_wnd_test(tp, skb, mss_now))) | ||
6887 | break; | ||
6888 | |||
6889 | - if (tso_segs == 1) { | ||
6890 | + if (tso_segs == 1 || !sk->sk_gso_max_segs) { | ||
6891 | if (unlikely(!tcp_nagle_test(tp, skb, mss_now, | ||
6892 | (tcp_skb_is_last(sk, skb) ? | ||
6893 | nonagle : TCP_NAGLE_PUSH)))) | ||
6894 | @@ -2020,7 +2020,7 @@ static bool tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle, | ||
6895 | } | ||
6896 | |||
6897 | limit = mss_now; | ||
6898 | - if (tso_segs > 1 && !tcp_urg_mode(tp)) | ||
6899 | + if (tso_segs > 1 && sk->sk_gso_max_segs && !tcp_urg_mode(tp)) | ||
6900 | limit = tcp_mss_split_point(sk, skb, mss_now, | ||
6901 | min_t(unsigned int, | ||
6902 | cwnd_quota, | ||
6903 | diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c | ||
6904 | index c277951d783b..c1136022d8d9 100644 | ||
6905 | --- a/net/ipv6/tcp_ipv6.c | ||
6906 | +++ b/net/ipv6/tcp_ipv6.c | ||
6907 | @@ -1385,6 +1385,28 @@ ipv6_pktoptions: | ||
6908 | return 0; | ||
6909 | } | ||
6910 | |||
6911 | +static void tcp_v6_fill_cb(struct sk_buff *skb, const struct ipv6hdr *hdr, | ||
6912 | + const struct tcphdr *th) | ||
6913 | +{ | ||
6914 | + /* This is tricky: we move IP6CB at its correct location into | ||
6915 | + * TCP_SKB_CB(). It must be done after xfrm6_policy_check(), because | ||
6916 | + * _decode_session6() uses IP6CB(). | ||
6917 | + * barrier() makes sure compiler won't play aliasing games. | ||
6918 | + */ | ||
6919 | + memmove(&TCP_SKB_CB(skb)->header.h6, IP6CB(skb), | ||
6920 | + sizeof(struct inet6_skb_parm)); | ||
6921 | + barrier(); | ||
6922 | + | ||
6923 | + TCP_SKB_CB(skb)->seq = ntohl(th->seq); | ||
6924 | + TCP_SKB_CB(skb)->end_seq = (TCP_SKB_CB(skb)->seq + th->syn + th->fin + | ||
6925 | + skb->len - th->doff*4); | ||
6926 | + TCP_SKB_CB(skb)->ack_seq = ntohl(th->ack_seq); | ||
6927 | + TCP_SKB_CB(skb)->tcp_flags = tcp_flag_byte(th); | ||
6928 | + TCP_SKB_CB(skb)->tcp_tw_isn = 0; | ||
6929 | + TCP_SKB_CB(skb)->ip_dsfield = ipv6_get_dsfield(hdr); | ||
6930 | + TCP_SKB_CB(skb)->sacked = 0; | ||
6931 | +} | ||
6932 | + | ||
6933 | static int tcp_v6_rcv(struct sk_buff *skb) | ||
6934 | { | ||
6935 | const struct tcphdr *th; | ||
6936 | @@ -1416,24 +1438,9 @@ static int tcp_v6_rcv(struct sk_buff *skb) | ||
6937 | |||
6938 | th = tcp_hdr(skb); | ||
6939 | hdr = ipv6_hdr(skb); | ||
6940 | - /* This is tricky : We move IPCB at its correct location into TCP_SKB_CB() | ||
6941 | - * barrier() makes sure compiler wont play fool^Waliasing games. | ||
6942 | - */ | ||
6943 | - memmove(&TCP_SKB_CB(skb)->header.h6, IP6CB(skb), | ||
6944 | - sizeof(struct inet6_skb_parm)); | ||
6945 | - barrier(); | ||
6946 | - | ||
6947 | - TCP_SKB_CB(skb)->seq = ntohl(th->seq); | ||
6948 | - TCP_SKB_CB(skb)->end_seq = (TCP_SKB_CB(skb)->seq + th->syn + th->fin + | ||
6949 | - skb->len - th->doff*4); | ||
6950 | - TCP_SKB_CB(skb)->ack_seq = ntohl(th->ack_seq); | ||
6951 | - TCP_SKB_CB(skb)->tcp_flags = tcp_flag_byte(th); | ||
6952 | - TCP_SKB_CB(skb)->tcp_tw_isn = 0; | ||
6953 | - TCP_SKB_CB(skb)->ip_dsfield = ipv6_get_dsfield(hdr); | ||
6954 | - TCP_SKB_CB(skb)->sacked = 0; | ||
6955 | |||
6956 | sk = __inet6_lookup_skb(&tcp_hashinfo, skb, th->source, th->dest, | ||
6957 | - tcp_v6_iif(skb)); | ||
6958 | + inet6_iif(skb)); | ||
6959 | if (!sk) | ||
6960 | goto no_tcp_socket; | ||
6961 | |||
6962 | @@ -1449,6 +1456,8 @@ process: | ||
6963 | if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb)) | ||
6964 | goto discard_and_relse; | ||
6965 | |||
6966 | + tcp_v6_fill_cb(skb, hdr, th); | ||
6967 | + | ||
6968 | #ifdef CONFIG_TCP_MD5SIG | ||
6969 | if (tcp_v6_inbound_md5_hash(sk, skb)) | ||
6970 | goto discard_and_relse; | ||
6971 | @@ -1480,6 +1489,8 @@ no_tcp_socket: | ||
6972 | if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) | ||
6973 | goto discard_it; | ||
6974 | |||
6975 | + tcp_v6_fill_cb(skb, hdr, th); | ||
6976 | + | ||
6977 | if (skb->len < (th->doff<<2) || tcp_checksum_complete(skb)) { | ||
6978 | csum_error: | ||
6979 | TCP_INC_STATS_BH(net, TCP_MIB_CSUMERRORS); | ||
6980 | @@ -1503,6 +1514,8 @@ do_time_wait: | ||
6981 | goto discard_it; | ||
6982 | } | ||
6983 | |||
6984 | + tcp_v6_fill_cb(skb, hdr, th); | ||
6985 | + | ||
6986 | if (skb->len < (th->doff<<2)) { | ||
6987 | inet_twsk_put(inet_twsk(sk)); | ||
6988 | goto bad_packet; | ||
6989 | diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c | ||
6990 | index b6bf8e8caec7..79c965a51ab2 100644 | ||
6991 | --- a/net/netlink/af_netlink.c | ||
6992 | +++ b/net/netlink/af_netlink.c | ||
6993 | @@ -526,14 +526,14 @@ out: | ||
6994 | return err; | ||
6995 | } | ||
6996 | |||
6997 | -static void netlink_frame_flush_dcache(const struct nl_mmap_hdr *hdr) | ||
6998 | +static void netlink_frame_flush_dcache(const struct nl_mmap_hdr *hdr, unsigned int nm_len) | ||
6999 | { | ||
7000 | #if ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE == 1 | ||
7001 | struct page *p_start, *p_end; | ||
7002 | |||
7003 | /* First page is flushed through netlink_{get,set}_status */ | ||
7004 | p_start = pgvec_to_page(hdr + PAGE_SIZE); | ||
7005 | - p_end = pgvec_to_page((void *)hdr + NL_MMAP_HDRLEN + hdr->nm_len - 1); | ||
7006 | + p_end = pgvec_to_page((void *)hdr + NL_MMAP_HDRLEN + nm_len - 1); | ||
7007 | while (p_start <= p_end) { | ||
7008 | flush_dcache_page(p_start); | ||
7009 | p_start++; | ||
7010 | @@ -551,9 +551,9 @@ static enum nl_mmap_status netlink_get_status(const struct nl_mmap_hdr *hdr) | ||
7011 | static void netlink_set_status(struct nl_mmap_hdr *hdr, | ||
7012 | enum nl_mmap_status status) | ||
7013 | { | ||
7014 | + smp_mb(); | ||
7015 | hdr->nm_status = status; | ||
7016 | flush_dcache_page(pgvec_to_page(hdr)); | ||
7017 | - smp_wmb(); | ||
7018 | } | ||
7019 | |||
7020 | static struct nl_mmap_hdr * | ||
7021 | @@ -715,24 +715,16 @@ static int netlink_mmap_sendmsg(struct sock *sk, struct msghdr *msg, | ||
7022 | struct nl_mmap_hdr *hdr; | ||
7023 | struct sk_buff *skb; | ||
7024 | unsigned int maxlen; | ||
7025 | - bool excl = true; | ||
7026 | int err = 0, len = 0; | ||
7027 | |||
7028 | - /* Netlink messages are validated by the receiver before processing. | ||
7029 | - * In order to avoid userspace changing the contents of the message | ||
7030 | - * after validation, the socket and the ring may only be used by a | ||
7031 | - * single process, otherwise we fall back to copying. | ||
7032 | - */ | ||
7033 | - if (atomic_long_read(&sk->sk_socket->file->f_count) > 1 || | ||
7034 | - atomic_read(&nlk->mapped) > 1) | ||
7035 | - excl = false; | ||
7036 | - | ||
7037 | mutex_lock(&nlk->pg_vec_lock); | ||
7038 | |||
7039 | ring = &nlk->tx_ring; | ||
7040 | maxlen = ring->frame_size - NL_MMAP_HDRLEN; | ||
7041 | |||
7042 | do { | ||
7043 | + unsigned int nm_len; | ||
7044 | + | ||
7045 | hdr = netlink_current_frame(ring, NL_MMAP_STATUS_VALID); | ||
7046 | if (hdr == NULL) { | ||
7047 | if (!(msg->msg_flags & MSG_DONTWAIT) && | ||
7048 | @@ -740,35 +732,23 @@ static int netlink_mmap_sendmsg(struct sock *sk, struct msghdr *msg, | ||
7049 | schedule(); | ||
7050 | continue; | ||
7051 | } | ||
7052 | - if (hdr->nm_len > maxlen) { | ||
7053 | + | ||
7054 | + nm_len = ACCESS_ONCE(hdr->nm_len); | ||
7055 | + if (nm_len > maxlen) { | ||
7056 | err = -EINVAL; | ||
7057 | goto out; | ||
7058 | } | ||
7059 | |||
7060 | - netlink_frame_flush_dcache(hdr); | ||
7061 | + netlink_frame_flush_dcache(hdr, nm_len); | ||
7062 | |||
7063 | - if (likely(dst_portid == 0 && dst_group == 0 && excl)) { | ||
7064 | - skb = alloc_skb_head(GFP_KERNEL); | ||
7065 | - if (skb == NULL) { | ||
7066 | - err = -ENOBUFS; | ||
7067 | - goto out; | ||
7068 | - } | ||
7069 | - sock_hold(sk); | ||
7070 | - netlink_ring_setup_skb(skb, sk, ring, hdr); | ||
7071 | - NETLINK_CB(skb).flags |= NETLINK_SKB_TX; | ||
7072 | - __skb_put(skb, hdr->nm_len); | ||
7073 | - netlink_set_status(hdr, NL_MMAP_STATUS_RESERVED); | ||
7074 | - atomic_inc(&ring->pending); | ||
7075 | - } else { | ||
7076 | - skb = alloc_skb(hdr->nm_len, GFP_KERNEL); | ||
7077 | - if (skb == NULL) { | ||
7078 | - err = -ENOBUFS; | ||
7079 | - goto out; | ||
7080 | - } | ||
7081 | - __skb_put(skb, hdr->nm_len); | ||
7082 | - memcpy(skb->data, (void *)hdr + NL_MMAP_HDRLEN, hdr->nm_len); | ||
7083 | - netlink_set_status(hdr, NL_MMAP_STATUS_UNUSED); | ||
7084 | + skb = alloc_skb(nm_len, GFP_KERNEL); | ||
7085 | + if (skb == NULL) { | ||
7086 | + err = -ENOBUFS; | ||
7087 | + goto out; | ||
7088 | } | ||
7089 | + __skb_put(skb, nm_len); | ||
7090 | + memcpy(skb->data, (void *)hdr + NL_MMAP_HDRLEN, nm_len); | ||
7091 | + netlink_set_status(hdr, NL_MMAP_STATUS_UNUSED); | ||
7092 | |||
7093 | netlink_increment_head(ring); | ||
7094 | |||
7095 | @@ -814,7 +794,7 @@ static void netlink_queue_mmaped_skb(struct sock *sk, struct sk_buff *skb) | ||
7096 | hdr->nm_pid = NETLINK_CB(skb).creds.pid; | ||
7097 | hdr->nm_uid = from_kuid(sk_user_ns(sk), NETLINK_CB(skb).creds.uid); | ||
7098 | hdr->nm_gid = from_kgid(sk_user_ns(sk), NETLINK_CB(skb).creds.gid); | ||
7099 | - netlink_frame_flush_dcache(hdr); | ||
7100 | + netlink_frame_flush_dcache(hdr, hdr->nm_len); | ||
7101 | netlink_set_status(hdr, NL_MMAP_STATUS_VALID); | ||
7102 | |||
7103 | NETLINK_CB(skb).flags |= NETLINK_SKB_DELIVERED; | ||
7104 | diff --git a/net/wireless/chan.c b/net/wireless/chan.c | ||
7105 | index 72d81e2154d5..92ae263ebbf3 100644 | ||
7106 | --- a/net/wireless/chan.c | ||
7107 | +++ b/net/wireless/chan.c | ||
7108 | @@ -602,7 +602,7 @@ bool cfg80211_chandef_usable(struct wiphy *wiphy, | ||
7109 | { | ||
7110 | struct ieee80211_sta_ht_cap *ht_cap; | ||
7111 | struct ieee80211_sta_vht_cap *vht_cap; | ||
7112 | - u32 width, control_freq; | ||
7113 | + u32 width, control_freq, cap; | ||
7114 | |||
7115 | if (WARN_ON(!cfg80211_chandef_valid(chandef))) | ||
7116 | return false; | ||
7117 | @@ -642,7 +642,8 @@ bool cfg80211_chandef_usable(struct wiphy *wiphy, | ||
7118 | return false; | ||
7119 | break; | ||
7120 | case NL80211_CHAN_WIDTH_80P80: | ||
7121 | - if (!(vht_cap->cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ)) | ||
7122 | + cap = vht_cap->cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK; | ||
7123 | + if (cap != IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ) | ||
7124 | return false; | ||
7125 | case NL80211_CHAN_WIDTH_80: | ||
7126 | if (!vht_cap->vht_supported) | ||
7127 | @@ -653,7 +654,9 @@ bool cfg80211_chandef_usable(struct wiphy *wiphy, | ||
7128 | case NL80211_CHAN_WIDTH_160: | ||
7129 | if (!vht_cap->vht_supported) | ||
7130 | return false; | ||
7131 | - if (!(vht_cap->cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ)) | ||
7132 | + cap = vht_cap->cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK; | ||
7133 | + if (cap != IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ && | ||
7134 | + cap != IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ) | ||
7135 | return false; | ||
7136 | prohibited_flags |= IEEE80211_CHAN_NO_160MHZ; | ||
7137 | width = 160; | ||
7138 | diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c | ||
7139 | index 5839c85075f1..ea558e07981f 100644 | ||
7140 | --- a/net/wireless/nl80211.c | ||
7141 | +++ b/net/wireless/nl80211.c | ||
7142 | @@ -5799,7 +5799,7 @@ static int nl80211_start_sched_scan(struct sk_buff *skb, | ||
7143 | } | ||
7144 | |||
7145 | /* there was no other matchset, so the RSSI one is alone */ | ||
7146 | - if (i == 0) | ||
7147 | + if (i == 0 && n_match_sets) | ||
7148 | request->match_sets[0].rssi_thold = default_match_rssi; | ||
7149 | |||
7150 | request->min_rssi_thold = INT_MAX; | ||
7151 | diff --git a/net/wireless/reg.c b/net/wireless/reg.c | ||
7152 | index b725a31a4751..6fd53ea30193 100644 | ||
7153 | --- a/net/wireless/reg.c | ||
7154 | +++ b/net/wireless/reg.c | ||
7155 | @@ -1760,7 +1760,7 @@ static enum reg_request_treatment | ||
7156 | reg_process_hint_driver(struct wiphy *wiphy, | ||
7157 | struct regulatory_request *driver_request) | ||
7158 | { | ||
7159 | - const struct ieee80211_regdomain *regd; | ||
7160 | + const struct ieee80211_regdomain *regd, *tmp; | ||
7161 | enum reg_request_treatment treatment; | ||
7162 | |||
7163 | treatment = __reg_process_hint_driver(driver_request); | ||
7164 | @@ -1780,7 +1780,10 @@ reg_process_hint_driver(struct wiphy *wiphy, | ||
7165 | reg_free_request(driver_request); | ||
7166 | return REG_REQ_IGNORE; | ||
7167 | } | ||
7168 | + | ||
7169 | + tmp = get_wiphy_regdom(wiphy); | ||
7170 | rcu_assign_pointer(wiphy->regd, regd); | ||
7171 | + rcu_free_regdom(tmp); | ||
7172 | } | ||
7173 | |||
7174 | |||
7175 | @@ -1839,11 +1842,8 @@ __reg_process_hint_country_ie(struct wiphy *wiphy, | ||
7176 | return REG_REQ_IGNORE; | ||
7177 | return REG_REQ_ALREADY_SET; | ||
7178 | } | ||
7179 | - /* | ||
7180 | - * Two consecutive Country IE hints on the same wiphy. | ||
7181 | - * This should be picked up early by the driver/stack | ||
7182 | - */ | ||
7183 | - if (WARN_ON(regdom_changes(country_ie_request->alpha2))) | ||
7184 | + | ||
7185 | + if (regdom_changes(country_ie_request->alpha2)) | ||
7186 | return REG_REQ_OK; | ||
7187 | return REG_REQ_ALREADY_SET; | ||
7188 | } | ||
7189 | diff --git a/scripts/Makefile.clean b/scripts/Makefile.clean | ||
7190 | index b1c668dc6815..a609552a86dc 100644 | ||
7191 | --- a/scripts/Makefile.clean | ||
7192 | +++ b/scripts/Makefile.clean | ||
7193 | @@ -45,19 +45,19 @@ __clean-files := $(extra-y) $(extra-m) $(extra-) \ | ||
7194 | |||
7195 | __clean-files := $(filter-out $(no-clean-files), $(__clean-files)) | ||
7196 | |||
7197 | -# as clean-files is given relative to the current directory, this adds | ||
7198 | -# a $(obj) prefix, except for absolute paths | ||
7199 | +# clean-files is given relative to the current directory, unless it | ||
7200 | +# starts with $(objtree)/ (which means "./", so do not add "./" unless | ||
7201 | +# you want to delete a file from the toplevel object directory). | ||
7202 | |||
7203 | __clean-files := $(wildcard \ | ||
7204 | - $(addprefix $(obj)/, $(filter-out /%, $(__clean-files))) \ | ||
7205 | - $(filter /%, $(__clean-files))) | ||
7206 | + $(addprefix $(obj)/, $(filter-out $(objtree)/%, $(__clean-files))) \ | ||
7207 | + $(filter $(objtree)/%, $(__clean-files))) | ||
7208 | |||
7209 | -# as clean-dirs is given relative to the current directory, this adds | ||
7210 | -# a $(obj) prefix, except for absolute paths | ||
7211 | +# same as clean-files | ||
7212 | |||
7213 | __clean-dirs := $(wildcard \ | ||
7214 | - $(addprefix $(obj)/, $(filter-out /%, $(clean-dirs))) \ | ||
7215 | - $(filter /%, $(clean-dirs))) | ||
7216 | + $(addprefix $(obj)/, $(filter-out $(objtree)/%, $(clean-dirs))) \ | ||
7217 | + $(filter $(objtree)/%, $(clean-dirs))) | ||
7218 | |||
7219 | # ========================================================================== | ||
7220 | |||
7221 | diff --git a/scripts/coccinelle/misc/bugon.cocci b/scripts/coccinelle/misc/bugon.cocci | ||
7222 | index 556456ca761c..3b7eec24fb5a 100644 | ||
7223 | --- a/scripts/coccinelle/misc/bugon.cocci | ||
7224 | +++ b/scripts/coccinelle/misc/bugon.cocci | ||
7225 | @@ -8,7 +8,7 @@ | ||
7226 | // Confidence: High | ||
7227 | // Copyright: (C) 2014 Himangi Saraogi. GPLv2. | ||
7228 | // Comments: | ||
7229 | -// Options: --no-includes, --include-headers | ||
7230 | +// Options: --no-includes --include-headers | ||
7231 | |||
7232 | virtual patch | ||
7233 | virtual context | ||
7234 | diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h | ||
7235 | index c657752a420c..83bddbdb90e9 100644 | ||
7236 | --- a/sound/usb/quirks-table.h | ||
7237 | +++ b/sound/usb/quirks-table.h | ||
7238 | @@ -2804,133 +2804,45 @@ YAMAHA_DEVICE(0x7010, "UB99"), | ||
7239 | } | ||
7240 | }, | ||
7241 | |||
7242 | -/* Hauppauge HVR-950Q and HVR-850 */ | ||
7243 | -{ | ||
7244 | - USB_DEVICE_VENDOR_SPEC(0x2040, 0x7200), | ||
7245 | - .match_flags = USB_DEVICE_ID_MATCH_DEVICE | | ||
7246 | - USB_DEVICE_ID_MATCH_INT_CLASS | | ||
7247 | - USB_DEVICE_ID_MATCH_INT_SUBCLASS, | ||
7248 | - .bInterfaceClass = USB_CLASS_AUDIO, | ||
7249 | - .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL, | ||
7250 | - .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { | ||
7251 | - .vendor_name = "Hauppauge", | ||
7252 | - .product_name = "HVR-950Q", | ||
7253 | - .ifnum = QUIRK_ANY_INTERFACE, | ||
7254 | - .type = QUIRK_AUDIO_ALIGN_TRANSFER, | ||
7255 | - } | ||
7256 | -}, | ||
7257 | -{ | ||
7258 | - USB_DEVICE_VENDOR_SPEC(0x2040, 0x7210), | ||
7259 | - .match_flags = USB_DEVICE_ID_MATCH_DEVICE | | ||
7260 | - USB_DEVICE_ID_MATCH_INT_CLASS | | ||
7261 | - USB_DEVICE_ID_MATCH_INT_SUBCLASS, | ||
7262 | - .bInterfaceClass = USB_CLASS_AUDIO, | ||
7263 | - .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL, | ||
7264 | - .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { | ||
7265 | - .vendor_name = "Hauppauge", | ||
7266 | - .product_name = "HVR-950Q", | ||
7267 | - .ifnum = QUIRK_ANY_INTERFACE, | ||
7268 | - .type = QUIRK_AUDIO_ALIGN_TRANSFER, | ||
7269 | - } | ||
7270 | -}, | ||
7271 | -{ | ||
7272 | - USB_DEVICE_VENDOR_SPEC(0x2040, 0x7217), | ||
7273 | - .match_flags = USB_DEVICE_ID_MATCH_DEVICE | | ||
7274 | - USB_DEVICE_ID_MATCH_INT_CLASS | | ||
7275 | - USB_DEVICE_ID_MATCH_INT_SUBCLASS, | ||
7276 | - .bInterfaceClass = USB_CLASS_AUDIO, | ||
7277 | - .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL, | ||
7278 | - .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { | ||
7279 | - .vendor_name = "Hauppauge", | ||
7280 | - .product_name = "HVR-950Q", | ||
7281 | - .ifnum = QUIRK_ANY_INTERFACE, | ||
7282 | - .type = QUIRK_AUDIO_ALIGN_TRANSFER, | ||
7283 | - } | ||
7284 | -}, | ||
7285 | -{ | ||
7286 | - USB_DEVICE_VENDOR_SPEC(0x2040, 0x721b), | ||
7287 | - .match_flags = USB_DEVICE_ID_MATCH_DEVICE | | ||
7288 | - USB_DEVICE_ID_MATCH_INT_CLASS | | ||
7289 | - USB_DEVICE_ID_MATCH_INT_SUBCLASS, | ||
7290 | - .bInterfaceClass = USB_CLASS_AUDIO, | ||
7291 | - .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL, | ||
7292 | - .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { | ||
7293 | - .vendor_name = "Hauppauge", | ||
7294 | - .product_name = "HVR-950Q", | ||
7295 | - .ifnum = QUIRK_ANY_INTERFACE, | ||
7296 | - .type = QUIRK_AUDIO_ALIGN_TRANSFER, | ||
7297 | - } | ||
7298 | -}, | ||
7299 | -{ | ||
7300 | - USB_DEVICE_VENDOR_SPEC(0x2040, 0x721e), | ||
7301 | - .match_flags = USB_DEVICE_ID_MATCH_DEVICE | | ||
7302 | - USB_DEVICE_ID_MATCH_INT_CLASS | | ||
7303 | - USB_DEVICE_ID_MATCH_INT_SUBCLASS, | ||
7304 | - .bInterfaceClass = USB_CLASS_AUDIO, | ||
7305 | - .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL, | ||
7306 | - .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { | ||
7307 | - .vendor_name = "Hauppauge", | ||
7308 | - .product_name = "HVR-950Q", | ||
7309 | - .ifnum = QUIRK_ANY_INTERFACE, | ||
7310 | - .type = QUIRK_AUDIO_ALIGN_TRANSFER, | ||
7311 | - } | ||
7312 | -}, | ||
7313 | -{ | ||
7314 | - USB_DEVICE_VENDOR_SPEC(0x2040, 0x721f), | ||
7315 | - .match_flags = USB_DEVICE_ID_MATCH_DEVICE | | ||
7316 | - USB_DEVICE_ID_MATCH_INT_CLASS | | ||
7317 | - USB_DEVICE_ID_MATCH_INT_SUBCLASS, | ||
7318 | - .bInterfaceClass = USB_CLASS_AUDIO, | ||
7319 | - .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL, | ||
7320 | - .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { | ||
7321 | - .vendor_name = "Hauppauge", | ||
7322 | - .product_name = "HVR-950Q", | ||
7323 | - .ifnum = QUIRK_ANY_INTERFACE, | ||
7324 | - .type = QUIRK_AUDIO_ALIGN_TRANSFER, | ||
7325 | - } | ||
7326 | -}, | ||
7327 | -{ | ||
7328 | - USB_DEVICE_VENDOR_SPEC(0x2040, 0x7240), | ||
7329 | - .match_flags = USB_DEVICE_ID_MATCH_DEVICE | | ||
7330 | - USB_DEVICE_ID_MATCH_INT_CLASS | | ||
7331 | - USB_DEVICE_ID_MATCH_INT_SUBCLASS, | ||
7332 | - .bInterfaceClass = USB_CLASS_AUDIO, | ||
7333 | - .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL, | ||
7334 | - .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { | ||
7335 | - .vendor_name = "Hauppauge", | ||
7336 | - .product_name = "HVR-850", | ||
7337 | - .ifnum = QUIRK_ANY_INTERFACE, | ||
7338 | - .type = QUIRK_AUDIO_ALIGN_TRANSFER, | ||
7339 | - } | ||
7340 | -}, | ||
7341 | -{ | ||
7342 | - USB_DEVICE_VENDOR_SPEC(0x2040, 0x7280), | ||
7343 | - .match_flags = USB_DEVICE_ID_MATCH_DEVICE | | ||
7344 | - USB_DEVICE_ID_MATCH_INT_CLASS | | ||
7345 | - USB_DEVICE_ID_MATCH_INT_SUBCLASS, | ||
7346 | - .bInterfaceClass = USB_CLASS_AUDIO, | ||
7347 | - .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL, | ||
7348 | - .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { | ||
7349 | - .vendor_name = "Hauppauge", | ||
7350 | - .product_name = "HVR-950Q", | ||
7351 | - .ifnum = QUIRK_ANY_INTERFACE, | ||
7352 | - .type = QUIRK_AUDIO_ALIGN_TRANSFER, | ||
7353 | - } | ||
7354 | -}, | ||
7355 | -{ | ||
7356 | - USB_DEVICE_VENDOR_SPEC(0x0fd9, 0x0008), | ||
7357 | - .match_flags = USB_DEVICE_ID_MATCH_DEVICE | | ||
7358 | - USB_DEVICE_ID_MATCH_INT_CLASS | | ||
7359 | - USB_DEVICE_ID_MATCH_INT_SUBCLASS, | ||
7360 | - .bInterfaceClass = USB_CLASS_AUDIO, | ||
7361 | - .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL, | ||
7362 | - .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { | ||
7363 | - .vendor_name = "Hauppauge", | ||
7364 | - .product_name = "HVR-950Q", | ||
7365 | - .ifnum = QUIRK_ANY_INTERFACE, | ||
7366 | - .type = QUIRK_AUDIO_ALIGN_TRANSFER, | ||
7367 | - } | ||
7368 | -}, | ||
7369 | +/* | ||
7370 | + * Auvitek au0828 devices with audio interface. | ||
7371 | + * This should be kept in sync with drivers/media/usb/au0828/au0828-cards.c | ||
7372 | + * Please notice that some drivers are DVB only, and don't need to be | ||
7373 | + * here. That's the case, for example, of DVICO_FUSIONHDTV7. | ||
7374 | + */ | ||
7375 | + | ||
7376 | +#define AU0828_DEVICE(vid, pid, vname, pname) { \ | ||
7377 | + USB_DEVICE_VENDOR_SPEC(vid, pid), \ | ||
7378 | + .match_flags = USB_DEVICE_ID_MATCH_DEVICE | \ | ||
7379 | + USB_DEVICE_ID_MATCH_INT_CLASS | \ | ||
7380 | + USB_DEVICE_ID_MATCH_INT_SUBCLASS, \ | ||
7381 | + .bInterfaceClass = USB_CLASS_AUDIO, \ | ||
7382 | + .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL, \ | ||
7383 | + .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { \ | ||
7384 | + .vendor_name = vname, \ | ||
7385 | + .product_name = pname, \ | ||
7386 | + .ifnum = QUIRK_ANY_INTERFACE, \ | ||
7387 | + .type = QUIRK_AUDIO_ALIGN_TRANSFER, \ | ||
7388 | + } \ | ||
7389 | +} | ||
7390 | + | ||
7391 | +AU0828_DEVICE(0x2040, 0x7200, "Hauppauge", "HVR-950Q"), | ||
7392 | +AU0828_DEVICE(0x2040, 0x7240, "Hauppauge", "HVR-850"), | ||
7393 | +AU0828_DEVICE(0x2040, 0x7210, "Hauppauge", "HVR-950Q"), | ||
7394 | +AU0828_DEVICE(0x2040, 0x7217, "Hauppauge", "HVR-950Q"), | ||
7395 | +AU0828_DEVICE(0x2040, 0x721b, "Hauppauge", "HVR-950Q"), | ||
7396 | +AU0828_DEVICE(0x2040, 0x721e, "Hauppauge", "HVR-950Q"), | ||
7397 | +AU0828_DEVICE(0x2040, 0x721f, "Hauppauge", "HVR-950Q"), | ||
7398 | +AU0828_DEVICE(0x2040, 0x7280, "Hauppauge", "HVR-950Q"), | ||
7399 | +AU0828_DEVICE(0x0fd9, 0x0008, "Hauppauge", "HVR-950Q"), | ||
7400 | +AU0828_DEVICE(0x2040, 0x7201, "Hauppauge", "HVR-950Q-MXL"), | ||
7401 | +AU0828_DEVICE(0x2040, 0x7211, "Hauppauge", "HVR-950Q-MXL"), | ||
7402 | +AU0828_DEVICE(0x2040, 0x7281, "Hauppauge", "HVR-950Q-MXL"), | ||
7403 | +AU0828_DEVICE(0x05e1, 0x0480, "Hauppauge", "Woodbury"), | ||
7404 | +AU0828_DEVICE(0x2040, 0x8200, "Hauppauge", "Woodbury"), | ||
7405 | +AU0828_DEVICE(0x2040, 0x7260, "Hauppauge", "HVR-950Q"), | ||
7406 | +AU0828_DEVICE(0x2040, 0x7213, "Hauppauge", "HVR-950Q"), | ||
7407 | +AU0828_DEVICE(0x2040, 0x7270, "Hauppauge", "HVR-950Q"), | ||
7408 | |||
7409 | /* Digidesign Mbox */ | ||
7410 | { |