Annotation of /trunk/kernel-alx/patches-5.4/0172-5.4.73-all-fixes.patch
Parent Directory | Revision Log
Revision 3635 -
(hide annotations)
(download)
Mon Oct 24 12:34:12 2022 UTC (18 months, 2 weeks ago) by niro
File size: 449245 byte(s)
Mon Oct 24 12:34:12 2022 UTC (18 months, 2 weeks ago) by niro
File size: 449245 byte(s)
-sync kernel patches
1 | niro | 3635 | diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt |
2 | index 13984b6cc3225..988a0d2535b25 100644 | ||
3 | --- a/Documentation/admin-guide/kernel-parameters.txt | ||
4 | +++ b/Documentation/admin-guide/kernel-parameters.txt | ||
5 | @@ -567,7 +567,7 @@ | ||
6 | loops can be debugged more effectively on production | ||
7 | systems. | ||
8 | |||
9 | - clearcpuid=BITNUM [X86] | ||
10 | + clearcpuid=BITNUM[,BITNUM...] [X86] | ||
11 | Disable CPUID feature X for the kernel. See | ||
12 | arch/x86/include/asm/cpufeatures.h for the valid bit | ||
13 | numbers. Note the Linux specific bits are not necessarily | ||
14 | diff --git a/Documentation/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt | ||
15 | index 8d4ad1d1ae26f..8af3771a3ebf2 100644 | ||
16 | --- a/Documentation/networking/ip-sysctl.txt | ||
17 | +++ b/Documentation/networking/ip-sysctl.txt | ||
18 | @@ -1000,12 +1000,14 @@ icmp_ratelimit - INTEGER | ||
19 | icmp_msgs_per_sec - INTEGER | ||
20 | Limit maximal number of ICMP packets sent per second from this host. | ||
21 | Only messages whose type matches icmp_ratemask (see below) are | ||
22 | - controlled by this limit. | ||
23 | + controlled by this limit. For security reasons, the precise count | ||
24 | + of messages per second is randomized. | ||
25 | Default: 1000 | ||
26 | |||
27 | icmp_msgs_burst - INTEGER | ||
28 | icmp_msgs_per_sec controls number of ICMP packets sent per second, | ||
29 | while icmp_msgs_burst controls the burst size of these packets. | ||
30 | + For security reasons, the precise burst size is randomized. | ||
31 | Default: 50 | ||
32 | |||
33 | icmp_ratemask - INTEGER | ||
34 | diff --git a/Makefile b/Makefile | ||
35 | index 8db75cc76ed16..f9a8d76a693eb 100644 | ||
36 | --- a/Makefile | ||
37 | +++ b/Makefile | ||
38 | @@ -1,7 +1,7 @@ | ||
39 | # SPDX-License-Identifier: GPL-2.0 | ||
40 | VERSION = 5 | ||
41 | PATCHLEVEL = 4 | ||
42 | -SUBLEVEL = 72 | ||
43 | +SUBLEVEL = 73 | ||
44 | EXTRAVERSION = | ||
45 | NAME = Kleptomaniac Octopus | ||
46 | |||
47 | diff --git a/arch/arc/plat-hsdk/Kconfig b/arch/arc/plat-hsdk/Kconfig | ||
48 | index ce81018345184..6b5c54576f54d 100644 | ||
49 | --- a/arch/arc/plat-hsdk/Kconfig | ||
50 | +++ b/arch/arc/plat-hsdk/Kconfig | ||
51 | @@ -8,5 +8,6 @@ menuconfig ARC_SOC_HSDK | ||
52 | select ARC_HAS_ACCL_REGS | ||
53 | select ARC_IRQ_NO_AUTOSAVE | ||
54 | select CLK_HSDK | ||
55 | + select RESET_CONTROLLER | ||
56 | select RESET_HSDK | ||
57 | select HAVE_PCI | ||
58 | diff --git a/arch/arm/boot/dts/imx6sl.dtsi b/arch/arm/boot/dts/imx6sl.dtsi | ||
59 | index 3a96b5538a2a1..540880f0413fd 100644 | ||
60 | --- a/arch/arm/boot/dts/imx6sl.dtsi | ||
61 | +++ b/arch/arm/boot/dts/imx6sl.dtsi | ||
62 | @@ -936,8 +936,10 @@ | ||
63 | }; | ||
64 | |||
65 | rngb: rngb@21b4000 { | ||
66 | + compatible = "fsl,imx6sl-rngb", "fsl,imx25-rngb"; | ||
67 | reg = <0x021b4000 0x4000>; | ||
68 | interrupts = <0 5 IRQ_TYPE_LEVEL_HIGH>; | ||
69 | + clocks = <&clks IMX6SL_CLK_DUMMY>; | ||
70 | }; | ||
71 | |||
72 | weim: weim@21b8000 { | ||
73 | diff --git a/arch/arm/boot/dts/meson8.dtsi b/arch/arm/boot/dts/meson8.dtsi | ||
74 | index db2033f674c67..3efe9d41c2bb6 100644 | ||
75 | --- a/arch/arm/boot/dts/meson8.dtsi | ||
76 | +++ b/arch/arm/boot/dts/meson8.dtsi | ||
77 | @@ -230,8 +230,6 @@ | ||
78 | <GIC_SPI 167 IRQ_TYPE_LEVEL_HIGH>, | ||
79 | <GIC_SPI 168 IRQ_TYPE_LEVEL_HIGH>, | ||
80 | <GIC_SPI 169 IRQ_TYPE_LEVEL_HIGH>, | ||
81 | - <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>, | ||
82 | - <GIC_SPI 171 IRQ_TYPE_LEVEL_HIGH>, | ||
83 | <GIC_SPI 172 IRQ_TYPE_LEVEL_HIGH>, | ||
84 | <GIC_SPI 173 IRQ_TYPE_LEVEL_HIGH>, | ||
85 | <GIC_SPI 174 IRQ_TYPE_LEVEL_HIGH>, | ||
86 | diff --git a/arch/arm/boot/dts/owl-s500.dtsi b/arch/arm/boot/dts/owl-s500.dtsi | ||
87 | index 5ceb6cc4451d2..1dbe4e8b38ac7 100644 | ||
88 | --- a/arch/arm/boot/dts/owl-s500.dtsi | ||
89 | +++ b/arch/arm/boot/dts/owl-s500.dtsi | ||
90 | @@ -84,21 +84,21 @@ | ||
91 | global_timer: timer@b0020200 { | ||
92 | compatible = "arm,cortex-a9-global-timer"; | ||
93 | reg = <0xb0020200 0x100>; | ||
94 | - interrupts = <GIC_PPI 0 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_EDGE_RISING)>; | ||
95 | + interrupts = <GIC_PPI 11 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_EDGE_RISING)>; | ||
96 | status = "disabled"; | ||
97 | }; | ||
98 | |||
99 | twd_timer: timer@b0020600 { | ||
100 | compatible = "arm,cortex-a9-twd-timer"; | ||
101 | reg = <0xb0020600 0x20>; | ||
102 | - interrupts = <GIC_PPI 2 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_EDGE_RISING)>; | ||
103 | + interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_EDGE_RISING)>; | ||
104 | status = "disabled"; | ||
105 | }; | ||
106 | |||
107 | twd_wdt: wdt@b0020620 { | ||
108 | compatible = "arm,cortex-a9-twd-wdt"; | ||
109 | reg = <0xb0020620 0xe0>; | ||
110 | - interrupts = <GIC_PPI 3 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_EDGE_RISING)>; | ||
111 | + interrupts = <GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_EDGE_RISING)>; | ||
112 | status = "disabled"; | ||
113 | }; | ||
114 | |||
115 | diff --git a/arch/arm/boot/dts/sun8i-r40-bananapi-m2-ultra.dts b/arch/arm/boot/dts/sun8i-r40-bananapi-m2-ultra.dts | ||
116 | index 42d62d1ba1dc7..ea15073f0c79c 100644 | ||
117 | --- a/arch/arm/boot/dts/sun8i-r40-bananapi-m2-ultra.dts | ||
118 | +++ b/arch/arm/boot/dts/sun8i-r40-bananapi-m2-ultra.dts | ||
119 | @@ -223,16 +223,16 @@ | ||
120 | }; | ||
121 | |||
122 | ®_dc1sw { | ||
123 | - regulator-min-microvolt = <3000000>; | ||
124 | - regulator-max-microvolt = <3000000>; | ||
125 | + regulator-min-microvolt = <3300000>; | ||
126 | + regulator-max-microvolt = <3300000>; | ||
127 | regulator-name = "vcc-gmac-phy"; | ||
128 | }; | ||
129 | |||
130 | ®_dcdc1 { | ||
131 | regulator-always-on; | ||
132 | - regulator-min-microvolt = <3000000>; | ||
133 | - regulator-max-microvolt = <3000000>; | ||
134 | - regulator-name = "vcc-3v0"; | ||
135 | + regulator-min-microvolt = <3300000>; | ||
136 | + regulator-max-microvolt = <3300000>; | ||
137 | + regulator-name = "vcc-3v3"; | ||
138 | }; | ||
139 | |||
140 | ®_dcdc2 { | ||
141 | diff --git a/arch/arm/mach-at91/pm.c b/arch/arm/mach-at91/pm.c | ||
142 | index 6bc3000deb86e..676cc2a318f41 100644 | ||
143 | --- a/arch/arm/mach-at91/pm.c | ||
144 | +++ b/arch/arm/mach-at91/pm.c | ||
145 | @@ -777,6 +777,7 @@ static void __init at91_pm_init(void (*pm_idle)(void)) | ||
146 | |||
147 | pmc_np = of_find_matching_node_and_match(NULL, atmel_pmc_ids, &of_id); | ||
148 | soc_pm.data.pmc = of_iomap(pmc_np, 0); | ||
149 | + of_node_put(pmc_np); | ||
150 | if (!soc_pm.data.pmc) { | ||
151 | pr_err("AT91: PM not supported, PMC not found\n"); | ||
152 | return; | ||
153 | diff --git a/arch/arm/mach-omap2/cpuidle44xx.c b/arch/arm/mach-omap2/cpuidle44xx.c | ||
154 | index 6f5f89711f256..a92d277f81a08 100644 | ||
155 | --- a/arch/arm/mach-omap2/cpuidle44xx.c | ||
156 | +++ b/arch/arm/mach-omap2/cpuidle44xx.c | ||
157 | @@ -174,8 +174,10 @@ static int omap_enter_idle_coupled(struct cpuidle_device *dev, | ||
158 | */ | ||
159 | if (mpuss_can_lose_context) { | ||
160 | error = cpu_cluster_pm_enter(); | ||
161 | - if (error) | ||
162 | + if (error) { | ||
163 | + omap_set_pwrdm_state(mpu_pd, PWRDM_POWER_ON); | ||
164 | goto cpu_cluster_pm_out; | ||
165 | + } | ||
166 | } | ||
167 | } | ||
168 | |||
169 | diff --git a/arch/arm/mach-s3c24xx/mach-at2440evb.c b/arch/arm/mach-s3c24xx/mach-at2440evb.c | ||
170 | index 58c5ef3cf1d7e..2d370f7f75fa2 100644 | ||
171 | --- a/arch/arm/mach-s3c24xx/mach-at2440evb.c | ||
172 | +++ b/arch/arm/mach-s3c24xx/mach-at2440evb.c | ||
173 | @@ -143,7 +143,7 @@ static struct gpiod_lookup_table at2440evb_mci_gpio_table = { | ||
174 | .dev_id = "s3c2410-sdi", | ||
175 | .table = { | ||
176 | /* Card detect S3C2410_GPG(10) */ | ||
177 | - GPIO_LOOKUP("GPG", 10, "cd", GPIO_ACTIVE_LOW), | ||
178 | + GPIO_LOOKUP("GPIOG", 10, "cd", GPIO_ACTIVE_LOW), | ||
179 | { }, | ||
180 | }, | ||
181 | }; | ||
182 | diff --git a/arch/arm/mach-s3c24xx/mach-h1940.c b/arch/arm/mach-s3c24xx/mach-h1940.c | ||
183 | index 74d6b68e91c74..8d9d8e7c71d4c 100644 | ||
184 | --- a/arch/arm/mach-s3c24xx/mach-h1940.c | ||
185 | +++ b/arch/arm/mach-s3c24xx/mach-h1940.c | ||
186 | @@ -468,9 +468,9 @@ static struct gpiod_lookup_table h1940_mmc_gpio_table = { | ||
187 | .dev_id = "s3c2410-sdi", | ||
188 | .table = { | ||
189 | /* Card detect S3C2410_GPF(5) */ | ||
190 | - GPIO_LOOKUP("GPF", 5, "cd", GPIO_ACTIVE_LOW), | ||
191 | + GPIO_LOOKUP("GPIOF", 5, "cd", GPIO_ACTIVE_LOW), | ||
192 | /* Write protect S3C2410_GPH(8) */ | ||
193 | - GPIO_LOOKUP("GPH", 8, "wp", GPIO_ACTIVE_LOW), | ||
194 | + GPIO_LOOKUP("GPIOH", 8, "wp", GPIO_ACTIVE_LOW), | ||
195 | { }, | ||
196 | }, | ||
197 | }; | ||
198 | diff --git a/arch/arm/mach-s3c24xx/mach-mini2440.c b/arch/arm/mach-s3c24xx/mach-mini2440.c | ||
199 | index 9035f868fb34e..3a5b1124037b2 100644 | ||
200 | --- a/arch/arm/mach-s3c24xx/mach-mini2440.c | ||
201 | +++ b/arch/arm/mach-s3c24xx/mach-mini2440.c | ||
202 | @@ -244,9 +244,9 @@ static struct gpiod_lookup_table mini2440_mmc_gpio_table = { | ||
203 | .dev_id = "s3c2410-sdi", | ||
204 | .table = { | ||
205 | /* Card detect S3C2410_GPG(8) */ | ||
206 | - GPIO_LOOKUP("GPG", 8, "cd", GPIO_ACTIVE_LOW), | ||
207 | + GPIO_LOOKUP("GPIOG", 8, "cd", GPIO_ACTIVE_LOW), | ||
208 | /* Write protect S3C2410_GPH(8) */ | ||
209 | - GPIO_LOOKUP("GPH", 8, "wp", GPIO_ACTIVE_HIGH), | ||
210 | + GPIO_LOOKUP("GPIOH", 8, "wp", GPIO_ACTIVE_HIGH), | ||
211 | { }, | ||
212 | }, | ||
213 | }; | ||
214 | diff --git a/arch/arm/mach-s3c24xx/mach-n30.c b/arch/arm/mach-s3c24xx/mach-n30.c | ||
215 | index d856f23939aff..ffa20f52aa832 100644 | ||
216 | --- a/arch/arm/mach-s3c24xx/mach-n30.c | ||
217 | +++ b/arch/arm/mach-s3c24xx/mach-n30.c | ||
218 | @@ -359,9 +359,9 @@ static struct gpiod_lookup_table n30_mci_gpio_table = { | ||
219 | .dev_id = "s3c2410-sdi", | ||
220 | .table = { | ||
221 | /* Card detect S3C2410_GPF(1) */ | ||
222 | - GPIO_LOOKUP("GPF", 1, "cd", GPIO_ACTIVE_LOW), | ||
223 | + GPIO_LOOKUP("GPIOF", 1, "cd", GPIO_ACTIVE_LOW), | ||
224 | /* Write protect S3C2410_GPG(10) */ | ||
225 | - GPIO_LOOKUP("GPG", 10, "wp", GPIO_ACTIVE_LOW), | ||
226 | + GPIO_LOOKUP("GPIOG", 10, "wp", GPIO_ACTIVE_LOW), | ||
227 | { }, | ||
228 | }, | ||
229 | }; | ||
230 | diff --git a/arch/arm/mach-s3c24xx/mach-rx1950.c b/arch/arm/mach-s3c24xx/mach-rx1950.c | ||
231 | index 29f9b345a5311..534e9c1d8161f 100644 | ||
232 | --- a/arch/arm/mach-s3c24xx/mach-rx1950.c | ||
233 | +++ b/arch/arm/mach-s3c24xx/mach-rx1950.c | ||
234 | @@ -567,9 +567,9 @@ static struct gpiod_lookup_table rx1950_mmc_gpio_table = { | ||
235 | .dev_id = "s3c2410-sdi", | ||
236 | .table = { | ||
237 | /* Card detect S3C2410_GPF(5) */ | ||
238 | - GPIO_LOOKUP("GPF", 5, "cd", GPIO_ACTIVE_LOW), | ||
239 | + GPIO_LOOKUP("GPIOF", 5, "cd", GPIO_ACTIVE_LOW), | ||
240 | /* Write protect S3C2410_GPH(8) */ | ||
241 | - GPIO_LOOKUP("GPH", 8, "wp", GPIO_ACTIVE_LOW), | ||
242 | + GPIO_LOOKUP("GPIOH", 8, "wp", GPIO_ACTIVE_LOW), | ||
243 | { }, | ||
244 | }, | ||
245 | }; | ||
246 | diff --git a/arch/arm/mm/cache-l2x0.c b/arch/arm/mm/cache-l2x0.c | ||
247 | index 12c26eb88afbc..43d91bfd23600 100644 | ||
248 | --- a/arch/arm/mm/cache-l2x0.c | ||
249 | +++ b/arch/arm/mm/cache-l2x0.c | ||
250 | @@ -1249,20 +1249,28 @@ static void __init l2c310_of_parse(const struct device_node *np, | ||
251 | |||
252 | ret = of_property_read_u32(np, "prefetch-data", &val); | ||
253 | if (ret == 0) { | ||
254 | - if (val) | ||
255 | + if (val) { | ||
256 | prefetch |= L310_PREFETCH_CTRL_DATA_PREFETCH; | ||
257 | - else | ||
258 | + *aux_val |= L310_PREFETCH_CTRL_DATA_PREFETCH; | ||
259 | + } else { | ||
260 | prefetch &= ~L310_PREFETCH_CTRL_DATA_PREFETCH; | ||
261 | + *aux_val &= ~L310_PREFETCH_CTRL_DATA_PREFETCH; | ||
262 | + } | ||
263 | + *aux_mask &= ~L310_PREFETCH_CTRL_DATA_PREFETCH; | ||
264 | } else if (ret != -EINVAL) { | ||
265 | pr_err("L2C-310 OF prefetch-data property value is missing\n"); | ||
266 | } | ||
267 | |||
268 | ret = of_property_read_u32(np, "prefetch-instr", &val); | ||
269 | if (ret == 0) { | ||
270 | - if (val) | ||
271 | + if (val) { | ||
272 | prefetch |= L310_PREFETCH_CTRL_INSTR_PREFETCH; | ||
273 | - else | ||
274 | + *aux_val |= L310_PREFETCH_CTRL_INSTR_PREFETCH; | ||
275 | + } else { | ||
276 | prefetch &= ~L310_PREFETCH_CTRL_INSTR_PREFETCH; | ||
277 | + *aux_val &= ~L310_PREFETCH_CTRL_INSTR_PREFETCH; | ||
278 | + } | ||
279 | + *aux_mask &= ~L310_PREFETCH_CTRL_INSTR_PREFETCH; | ||
280 | } else if (ret != -EINVAL) { | ||
281 | pr_err("L2C-310 OF prefetch-instr property value is missing\n"); | ||
282 | } | ||
283 | diff --git a/arch/arm64/boot/dts/actions/s700.dtsi b/arch/arm64/boot/dts/actions/s700.dtsi | ||
284 | index 2006ad5424fa6..f8eb72bb41254 100644 | ||
285 | --- a/arch/arm64/boot/dts/actions/s700.dtsi | ||
286 | +++ b/arch/arm64/boot/dts/actions/s700.dtsi | ||
287 | @@ -231,7 +231,7 @@ | ||
288 | |||
289 | pinctrl: pinctrl@e01b0000 { | ||
290 | compatible = "actions,s700-pinctrl"; | ||
291 | - reg = <0x0 0xe01b0000 0x0 0x1000>; | ||
292 | + reg = <0x0 0xe01b0000 0x0 0x100>; | ||
293 | clocks = <&cmu CLK_GPIO>; | ||
294 | gpio-controller; | ||
295 | gpio-ranges = <&pinctrl 0 0 136>; | ||
296 | diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h5.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h5.dtsi | ||
297 | index eaf8f83794fd9..8466d44ee0b15 100644 | ||
298 | --- a/arch/arm64/boot/dts/allwinner/sun50i-h5.dtsi | ||
299 | +++ b/arch/arm64/boot/dts/allwinner/sun50i-h5.dtsi | ||
300 | @@ -155,8 +155,7 @@ | ||
301 | <GIC_SPI 104 IRQ_TYPE_LEVEL_HIGH>, | ||
302 | <GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH>, | ||
303 | <GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>, | ||
304 | - <GIC_SPI 107 IRQ_TYPE_LEVEL_HIGH>, | ||
305 | - <GIC_SPI 98 IRQ_TYPE_LEVEL_HIGH>; | ||
306 | + <GIC_SPI 107 IRQ_TYPE_LEVEL_HIGH>; | ||
307 | interrupt-names = "gp", | ||
308 | "gpmmu", | ||
309 | "pp", | ||
310 | @@ -167,8 +166,7 @@ | ||
311 | "pp2", | ||
312 | "ppmmu2", | ||
313 | "pp3", | ||
314 | - "ppmmu3", | ||
315 | - "pmu"; | ||
316 | + "ppmmu3"; | ||
317 | clocks = <&ccu CLK_BUS_GPU>, <&ccu CLK_GPU>; | ||
318 | clock-names = "bus", "core"; | ||
319 | resets = <&ccu RST_BUS_GPU>; | ||
320 | diff --git a/arch/arm64/boot/dts/amlogic/meson-khadas-vim3.dtsi b/arch/arm64/boot/dts/amlogic/meson-khadas-vim3.dtsi | ||
321 | index 8647da7d6609b..f6694aad84db3 100644 | ||
322 | --- a/arch/arm64/boot/dts/amlogic/meson-khadas-vim3.dtsi | ||
323 | +++ b/arch/arm64/boot/dts/amlogic/meson-khadas-vim3.dtsi | ||
324 | @@ -43,13 +43,13 @@ | ||
325 | |||
326 | white { | ||
327 | label = "vim3:white:sys"; | ||
328 | - gpios = <&gpio_ao GPIOAO_4 GPIO_ACTIVE_LOW>; | ||
329 | + gpios = <&gpio_ao GPIOAO_4 GPIO_ACTIVE_HIGH>; | ||
330 | linux,default-trigger = "heartbeat"; | ||
331 | }; | ||
332 | |||
333 | red { | ||
334 | label = "vim3:red"; | ||
335 | - gpios = <&gpio_expander 5 GPIO_ACTIVE_LOW>; | ||
336 | + gpios = <&gpio_expander 5 GPIO_ACTIVE_HIGH>; | ||
337 | }; | ||
338 | }; | ||
339 | |||
340 | diff --git a/arch/arm64/boot/dts/freescale/imx8mq.dtsi b/arch/arm64/boot/dts/freescale/imx8mq.dtsi | ||
341 | index bc8540f879654..f1011bcd5ed5a 100644 | ||
342 | --- a/arch/arm64/boot/dts/freescale/imx8mq.dtsi | ||
343 | +++ b/arch/arm64/boot/dts/freescale/imx8mq.dtsi | ||
344 | @@ -516,6 +516,7 @@ | ||
345 | gpc: gpc@303a0000 { | ||
346 | compatible = "fsl,imx8mq-gpc"; | ||
347 | reg = <0x303a0000 0x10000>; | ||
348 | + interrupts = <GIC_SPI 87 IRQ_TYPE_LEVEL_HIGH>; | ||
349 | interrupt-parent = <&gic>; | ||
350 | interrupt-controller; | ||
351 | #interrupt-cells = <3>; | ||
352 | diff --git a/arch/arm64/boot/dts/qcom/msm8916.dtsi b/arch/arm64/boot/dts/qcom/msm8916.dtsi | ||
353 | index 340da154d4e37..d95273af9f1e4 100644 | ||
354 | --- a/arch/arm64/boot/dts/qcom/msm8916.dtsi | ||
355 | +++ b/arch/arm64/boot/dts/qcom/msm8916.dtsi | ||
356 | @@ -175,14 +175,14 @@ | ||
357 | }; | ||
358 | |||
359 | thermal-zones { | ||
360 | - cpu0_1-thermal { | ||
361 | + cpu0-1-thermal { | ||
362 | polling-delay-passive = <250>; | ||
363 | polling-delay = <1000>; | ||
364 | |||
365 | thermal-sensors = <&tsens 4>; | ||
366 | |||
367 | trips { | ||
368 | - cpu0_1_alert0: trip-point@0 { | ||
369 | + cpu0_1_alert0: trip-point0 { | ||
370 | temperature = <75000>; | ||
371 | hysteresis = <2000>; | ||
372 | type = "passive"; | ||
373 | @@ -205,7 +205,7 @@ | ||
374 | }; | ||
375 | }; | ||
376 | |||
377 | - cpu2_3-thermal { | ||
378 | + cpu2-3-thermal { | ||
379 | polling-delay-passive = <250>; | ||
380 | polling-delay = <1000>; | ||
381 | |||
382 | @@ -934,7 +934,7 @@ | ||
383 | reg-names = "mdp_phys"; | ||
384 | |||
385 | interrupt-parent = <&mdss>; | ||
386 | - interrupts = <0 0>; | ||
387 | + interrupts = <0>; | ||
388 | |||
389 | clocks = <&gcc GCC_MDSS_AHB_CLK>, | ||
390 | <&gcc GCC_MDSS_AXI_CLK>, | ||
391 | @@ -966,7 +966,7 @@ | ||
392 | reg-names = "dsi_ctrl"; | ||
393 | |||
394 | interrupt-parent = <&mdss>; | ||
395 | - interrupts = <4 0>; | ||
396 | + interrupts = <4>; | ||
397 | |||
398 | assigned-clocks = <&gcc BYTE0_CLK_SRC>, | ||
399 | <&gcc PCLK0_CLK_SRC>; | ||
400 | diff --git a/arch/arm64/boot/dts/qcom/pm8916.dtsi b/arch/arm64/boot/dts/qcom/pm8916.dtsi | ||
401 | index 9dd2df1cbf47d..40df4d95a47ac 100644 | ||
402 | --- a/arch/arm64/boot/dts/qcom/pm8916.dtsi | ||
403 | +++ b/arch/arm64/boot/dts/qcom/pm8916.dtsi | ||
404 | @@ -113,7 +113,7 @@ | ||
405 | |||
406 | wcd_codec: codec@f000 { | ||
407 | compatible = "qcom,pm8916-wcd-analog-codec"; | ||
408 | - reg = <0xf000 0x200>; | ||
409 | + reg = <0xf000>; | ||
410 | reg-names = "pmic-codec-core"; | ||
411 | clocks = <&gcc GCC_CODEC_DIGCODEC_CLK>; | ||
412 | clock-names = "mclk"; | ||
413 | diff --git a/arch/arm64/boot/dts/renesas/r8a774c0.dtsi b/arch/arm64/boot/dts/renesas/r8a774c0.dtsi | ||
414 | index a1c2de90e4706..73ded80a79ba0 100644 | ||
415 | --- a/arch/arm64/boot/dts/renesas/r8a774c0.dtsi | ||
416 | +++ b/arch/arm64/boot/dts/renesas/r8a774c0.dtsi | ||
417 | @@ -1212,9 +1212,8 @@ | ||
418 | reg = <0 0xe6ea0000 0 0x0064>; | ||
419 | interrupts = <GIC_SPI 157 IRQ_TYPE_LEVEL_HIGH>; | ||
420 | clocks = <&cpg CPG_MOD 210>; | ||
421 | - dmas = <&dmac1 0x43>, <&dmac1 0x42>, | ||
422 | - <&dmac2 0x43>, <&dmac2 0x42>; | ||
423 | - dma-names = "tx", "rx", "tx", "rx"; | ||
424 | + dmas = <&dmac0 0x43>, <&dmac0 0x42>; | ||
425 | + dma-names = "tx", "rx"; | ||
426 | power-domains = <&sysc R8A774C0_PD_ALWAYS_ON>; | ||
427 | resets = <&cpg 210>; | ||
428 | #address-cells = <1>; | ||
429 | diff --git a/arch/arm64/boot/dts/renesas/r8a77990.dtsi b/arch/arm64/boot/dts/renesas/r8a77990.dtsi | ||
430 | index 455954c3d98ea..dabee157119f9 100644 | ||
431 | --- a/arch/arm64/boot/dts/renesas/r8a77990.dtsi | ||
432 | +++ b/arch/arm64/boot/dts/renesas/r8a77990.dtsi | ||
433 | @@ -1168,9 +1168,8 @@ | ||
434 | reg = <0 0xe6ea0000 0 0x0064>; | ||
435 | interrupts = <GIC_SPI 157 IRQ_TYPE_LEVEL_HIGH>; | ||
436 | clocks = <&cpg CPG_MOD 210>; | ||
437 | - dmas = <&dmac1 0x43>, <&dmac1 0x42>, | ||
438 | - <&dmac2 0x43>, <&dmac2 0x42>; | ||
439 | - dma-names = "tx", "rx", "tx", "rx"; | ||
440 | + dmas = <&dmac0 0x43>, <&dmac0 0x42>; | ||
441 | + dma-names = "tx", "rx"; | ||
442 | power-domains = <&sysc R8A77990_PD_ALWAYS_ON>; | ||
443 | resets = <&cpg 210>; | ||
444 | #address-cells = <1>; | ||
445 | diff --git a/arch/arm64/boot/dts/xilinx/zynqmp.dtsi b/arch/arm64/boot/dts/xilinx/zynqmp.dtsi | ||
446 | index 9aa67340a4d8c..a2645262f8623 100644 | ||
447 | --- a/arch/arm64/boot/dts/xilinx/zynqmp.dtsi | ||
448 | +++ b/arch/arm64/boot/dts/xilinx/zynqmp.dtsi | ||
449 | @@ -419,7 +419,7 @@ | ||
450 | }; | ||
451 | |||
452 | i2c0: i2c@ff020000 { | ||
453 | - compatible = "cdns,i2c-r1p14", "cdns,i2c-r1p10"; | ||
454 | + compatible = "cdns,i2c-r1p14"; | ||
455 | status = "disabled"; | ||
456 | interrupt-parent = <&gic>; | ||
457 | interrupts = <0 17 4>; | ||
458 | @@ -429,7 +429,7 @@ | ||
459 | }; | ||
460 | |||
461 | i2c1: i2c@ff030000 { | ||
462 | - compatible = "cdns,i2c-r1p14", "cdns,i2c-r1p10"; | ||
463 | + compatible = "cdns,i2c-r1p14"; | ||
464 | status = "disabled"; | ||
465 | interrupt-parent = <&gic>; | ||
466 | interrupts = <0 18 4>; | ||
467 | diff --git a/arch/powerpc/include/asm/book3s/64/hash-4k.h b/arch/powerpc/include/asm/book3s/64/hash-4k.h | ||
468 | index 3f9ae3585ab98..80c9534148821 100644 | ||
469 | --- a/arch/powerpc/include/asm/book3s/64/hash-4k.h | ||
470 | +++ b/arch/powerpc/include/asm/book3s/64/hash-4k.h | ||
471 | @@ -13,20 +13,19 @@ | ||
472 | */ | ||
473 | #define MAX_EA_BITS_PER_CONTEXT 46 | ||
474 | |||
475 | -#define REGION_SHIFT (MAX_EA_BITS_PER_CONTEXT - 2) | ||
476 | |||
477 | /* | ||
478 | - * Our page table limit us to 64TB. Hence for the kernel mapping, | ||
479 | - * each MAP area is limited to 16 TB. | ||
480 | - * The four map areas are: linear mapping, vmap, IO and vmemmap | ||
481 | + * Our page table limit us to 64TB. For 64TB physical memory, we only need 64GB | ||
482 | + * of vmemmap space. To better support sparse memory layout, we use 61TB | ||
483 | + * linear map range, 1TB of vmalloc, 1TB of I/O and 1TB of vmememmap. | ||
484 | */ | ||
485 | +#define REGION_SHIFT (40) | ||
486 | #define H_KERN_MAP_SIZE (ASM_CONST(1) << REGION_SHIFT) | ||
487 | |||
488 | /* | ||
489 | - * Define the address range of the kernel non-linear virtual area | ||
490 | - * 16TB | ||
491 | + * Define the address range of the kernel non-linear virtual area (61TB) | ||
492 | */ | ||
493 | -#define H_KERN_VIRT_START ASM_CONST(0xc000100000000000) | ||
494 | +#define H_KERN_VIRT_START ASM_CONST(0xc0003d0000000000) | ||
495 | |||
496 | #ifndef __ASSEMBLY__ | ||
497 | #define H_PTE_TABLE_SIZE (sizeof(pte_t) << H_PTE_INDEX_SIZE) | ||
498 | diff --git a/arch/powerpc/include/asm/drmem.h b/arch/powerpc/include/asm/drmem.h | ||
499 | index 28c3d936fdf32..bea7a2405ba5d 100644 | ||
500 | --- a/arch/powerpc/include/asm/drmem.h | ||
501 | +++ b/arch/powerpc/include/asm/drmem.h | ||
502 | @@ -8,14 +8,13 @@ | ||
503 | #ifndef _ASM_POWERPC_LMB_H | ||
504 | #define _ASM_POWERPC_LMB_H | ||
505 | |||
506 | +#include <linux/sched.h> | ||
507 | + | ||
508 | struct drmem_lmb { | ||
509 | u64 base_addr; | ||
510 | u32 drc_index; | ||
511 | u32 aa_index; | ||
512 | u32 flags; | ||
513 | -#ifdef CONFIG_MEMORY_HOTPLUG | ||
514 | - int nid; | ||
515 | -#endif | ||
516 | }; | ||
517 | |||
518 | struct drmem_lmb_info { | ||
519 | @@ -26,8 +25,22 @@ struct drmem_lmb_info { | ||
520 | |||
521 | extern struct drmem_lmb_info *drmem_info; | ||
522 | |||
523 | +static inline struct drmem_lmb *drmem_lmb_next(struct drmem_lmb *lmb, | ||
524 | + const struct drmem_lmb *start) | ||
525 | +{ | ||
526 | + /* | ||
527 | + * DLPAR code paths can take several milliseconds per element | ||
528 | + * when interacting with firmware. Ensure that we don't | ||
529 | + * unfairly monopolize the CPU. | ||
530 | + */ | ||
531 | + if (((++lmb - start) % 16) == 0) | ||
532 | + cond_resched(); | ||
533 | + | ||
534 | + return lmb; | ||
535 | +} | ||
536 | + | ||
537 | #define for_each_drmem_lmb_in_range(lmb, start, end) \ | ||
538 | - for ((lmb) = (start); (lmb) < (end); (lmb)++) | ||
539 | + for ((lmb) = (start); (lmb) < (end); lmb = drmem_lmb_next(lmb, start)) | ||
540 | |||
541 | #define for_each_drmem_lmb(lmb) \ | ||
542 | for_each_drmem_lmb_in_range((lmb), \ | ||
543 | @@ -103,22 +116,4 @@ static inline void invalidate_lmb_associativity_index(struct drmem_lmb *lmb) | ||
544 | lmb->aa_index = 0xffffffff; | ||
545 | } | ||
546 | |||
547 | -#ifdef CONFIG_MEMORY_HOTPLUG | ||
548 | -static inline void lmb_set_nid(struct drmem_lmb *lmb) | ||
549 | -{ | ||
550 | - lmb->nid = memory_add_physaddr_to_nid(lmb->base_addr); | ||
551 | -} | ||
552 | -static inline void lmb_clear_nid(struct drmem_lmb *lmb) | ||
553 | -{ | ||
554 | - lmb->nid = -1; | ||
555 | -} | ||
556 | -#else | ||
557 | -static inline void lmb_set_nid(struct drmem_lmb *lmb) | ||
558 | -{ | ||
559 | -} | ||
560 | -static inline void lmb_clear_nid(struct drmem_lmb *lmb) | ||
561 | -{ | ||
562 | -} | ||
563 | -#endif | ||
564 | - | ||
565 | #endif /* _ASM_POWERPC_LMB_H */ | ||
566 | diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h | ||
567 | index b3cbb1136bce0..34d08ff21b988 100644 | ||
568 | --- a/arch/powerpc/include/asm/reg.h | ||
569 | +++ b/arch/powerpc/include/asm/reg.h | ||
570 | @@ -796,7 +796,7 @@ | ||
571 | #define THRM1_TIN (1 << 31) | ||
572 | #define THRM1_TIV (1 << 30) | ||
573 | #define THRM1_THRES(x) ((x&0x7f)<<23) | ||
574 | -#define THRM3_SITV(x) ((x&0x3fff)<<1) | ||
575 | +#define THRM3_SITV(x) ((x & 0x1fff) << 1) | ||
576 | #define THRM1_TID (1<<2) | ||
577 | #define THRM1_TIE (1<<1) | ||
578 | #define THRM1_V (1<<0) | ||
579 | diff --git a/arch/powerpc/include/asm/tlb.h b/arch/powerpc/include/asm/tlb.h | ||
580 | index 7f3a8b9023254..02a1c18cdba3d 100644 | ||
581 | --- a/arch/powerpc/include/asm/tlb.h | ||
582 | +++ b/arch/powerpc/include/asm/tlb.h | ||
583 | @@ -67,19 +67,6 @@ static inline int mm_is_thread_local(struct mm_struct *mm) | ||
584 | return false; | ||
585 | return cpumask_test_cpu(smp_processor_id(), mm_cpumask(mm)); | ||
586 | } | ||
587 | -static inline void mm_reset_thread_local(struct mm_struct *mm) | ||
588 | -{ | ||
589 | - WARN_ON(atomic_read(&mm->context.copros) > 0); | ||
590 | - /* | ||
591 | - * It's possible for mm_access to take a reference on mm_users to | ||
592 | - * access the remote mm from another thread, but it's not allowed | ||
593 | - * to set mm_cpumask, so mm_users may be > 1 here. | ||
594 | - */ | ||
595 | - WARN_ON(current->mm != mm); | ||
596 | - atomic_set(&mm->context.active_cpus, 1); | ||
597 | - cpumask_clear(mm_cpumask(mm)); | ||
598 | - cpumask_set_cpu(smp_processor_id(), mm_cpumask(mm)); | ||
599 | -} | ||
600 | #else /* CONFIG_PPC_BOOK3S_64 */ | ||
601 | static inline int mm_is_thread_local(struct mm_struct *mm) | ||
602 | { | ||
603 | diff --git a/arch/powerpc/kernel/tau_6xx.c b/arch/powerpc/kernel/tau_6xx.c | ||
604 | index e2ab8a111b693..0b4694b8d2482 100644 | ||
605 | --- a/arch/powerpc/kernel/tau_6xx.c | ||
606 | +++ b/arch/powerpc/kernel/tau_6xx.c | ||
607 | @@ -13,13 +13,14 @@ | ||
608 | */ | ||
609 | |||
610 | #include <linux/errno.h> | ||
611 | -#include <linux/jiffies.h> | ||
612 | #include <linux/kernel.h> | ||
613 | #include <linux/param.h> | ||
614 | #include <linux/string.h> | ||
615 | #include <linux/mm.h> | ||
616 | #include <linux/interrupt.h> | ||
617 | #include <linux/init.h> | ||
618 | +#include <linux/delay.h> | ||
619 | +#include <linux/workqueue.h> | ||
620 | |||
621 | #include <asm/io.h> | ||
622 | #include <asm/reg.h> | ||
623 | @@ -39,9 +40,7 @@ static struct tau_temp | ||
624 | unsigned char grew; | ||
625 | } tau[NR_CPUS]; | ||
626 | |||
627 | -struct timer_list tau_timer; | ||
628 | - | ||
629 | -#undef DEBUG | ||
630 | +static bool tau_int_enable; | ||
631 | |||
632 | /* TODO: put these in a /proc interface, with some sanity checks, and maybe | ||
633 | * dynamic adjustment to minimize # of interrupts */ | ||
634 | @@ -50,72 +49,49 @@ struct timer_list tau_timer; | ||
635 | #define step_size 2 /* step size when temp goes out of range */ | ||
636 | #define window_expand 1 /* expand the window by this much */ | ||
637 | /* configurable values for shrinking the window */ | ||
638 | -#define shrink_timer 2*HZ /* period between shrinking the window */ | ||
639 | +#define shrink_timer 2000 /* period between shrinking the window */ | ||
640 | #define min_window 2 /* minimum window size, degrees C */ | ||
641 | |||
642 | static void set_thresholds(unsigned long cpu) | ||
643 | { | ||
644 | -#ifdef CONFIG_TAU_INT | ||
645 | - /* | ||
646 | - * setup THRM1, | ||
647 | - * threshold, valid bit, enable interrupts, interrupt when below threshold | ||
648 | - */ | ||
649 | - mtspr(SPRN_THRM1, THRM1_THRES(tau[cpu].low) | THRM1_V | THRM1_TIE | THRM1_TID); | ||
650 | + u32 maybe_tie = tau_int_enable ? THRM1_TIE : 0; | ||
651 | |||
652 | - /* setup THRM2, | ||
653 | - * threshold, valid bit, enable interrupts, interrupt when above threshold | ||
654 | - */ | ||
655 | - mtspr (SPRN_THRM2, THRM1_THRES(tau[cpu].high) | THRM1_V | THRM1_TIE); | ||
656 | -#else | ||
657 | - /* same thing but don't enable interrupts */ | ||
658 | - mtspr(SPRN_THRM1, THRM1_THRES(tau[cpu].low) | THRM1_V | THRM1_TID); | ||
659 | - mtspr(SPRN_THRM2, THRM1_THRES(tau[cpu].high) | THRM1_V); | ||
660 | -#endif | ||
661 | + /* setup THRM1, threshold, valid bit, interrupt when below threshold */ | ||
662 | + mtspr(SPRN_THRM1, THRM1_THRES(tau[cpu].low) | THRM1_V | maybe_tie | THRM1_TID); | ||
663 | + | ||
664 | + /* setup THRM2, threshold, valid bit, interrupt when above threshold */ | ||
665 | + mtspr(SPRN_THRM2, THRM1_THRES(tau[cpu].high) | THRM1_V | maybe_tie); | ||
666 | } | ||
667 | |||
668 | static void TAUupdate(int cpu) | ||
669 | { | ||
670 | - unsigned thrm; | ||
671 | - | ||
672 | -#ifdef DEBUG | ||
673 | - printk("TAUupdate "); | ||
674 | -#endif | ||
675 | + u32 thrm; | ||
676 | + u32 bits = THRM1_TIV | THRM1_TIN | THRM1_V; | ||
677 | |||
678 | /* if both thresholds are crossed, the step_sizes cancel out | ||
679 | * and the window winds up getting expanded twice. */ | ||
680 | - if((thrm = mfspr(SPRN_THRM1)) & THRM1_TIV){ /* is valid? */ | ||
681 | - if(thrm & THRM1_TIN){ /* crossed low threshold */ | ||
682 | - if (tau[cpu].low >= step_size){ | ||
683 | - tau[cpu].low -= step_size; | ||
684 | - tau[cpu].high -= (step_size - window_expand); | ||
685 | - } | ||
686 | - tau[cpu].grew = 1; | ||
687 | -#ifdef DEBUG | ||
688 | - printk("low threshold crossed "); | ||
689 | -#endif | ||
690 | + thrm = mfspr(SPRN_THRM1); | ||
691 | + if ((thrm & bits) == bits) { | ||
692 | + mtspr(SPRN_THRM1, 0); | ||
693 | + | ||
694 | + if (tau[cpu].low >= step_size) { | ||
695 | + tau[cpu].low -= step_size; | ||
696 | + tau[cpu].high -= (step_size - window_expand); | ||
697 | } | ||
698 | + tau[cpu].grew = 1; | ||
699 | + pr_debug("%s: low threshold crossed\n", __func__); | ||
700 | } | ||
701 | - if((thrm = mfspr(SPRN_THRM2)) & THRM1_TIV){ /* is valid? */ | ||
702 | - if(thrm & THRM1_TIN){ /* crossed high threshold */ | ||
703 | - if (tau[cpu].high <= 127-step_size){ | ||
704 | - tau[cpu].low += (step_size - window_expand); | ||
705 | - tau[cpu].high += step_size; | ||
706 | - } | ||
707 | - tau[cpu].grew = 1; | ||
708 | -#ifdef DEBUG | ||
709 | - printk("high threshold crossed "); | ||
710 | -#endif | ||
711 | + thrm = mfspr(SPRN_THRM2); | ||
712 | + if ((thrm & bits) == bits) { | ||
713 | + mtspr(SPRN_THRM2, 0); | ||
714 | + | ||
715 | + if (tau[cpu].high <= 127 - step_size) { | ||
716 | + tau[cpu].low += (step_size - window_expand); | ||
717 | + tau[cpu].high += step_size; | ||
718 | } | ||
719 | + tau[cpu].grew = 1; | ||
720 | + pr_debug("%s: high threshold crossed\n", __func__); | ||
721 | } | ||
722 | - | ||
723 | -#ifdef DEBUG | ||
724 | - printk("grew = %d\n", tau[cpu].grew); | ||
725 | -#endif | ||
726 | - | ||
727 | -#ifndef CONFIG_TAU_INT /* tau_timeout will do this if not using interrupts */ | ||
728 | - set_thresholds(cpu); | ||
729 | -#endif | ||
730 | - | ||
731 | } | ||
732 | |||
733 | #ifdef CONFIG_TAU_INT | ||
734 | @@ -140,17 +116,16 @@ void TAUException(struct pt_regs * regs) | ||
735 | static void tau_timeout(void * info) | ||
736 | { | ||
737 | int cpu; | ||
738 | - unsigned long flags; | ||
739 | int size; | ||
740 | int shrink; | ||
741 | |||
742 | - /* disabling interrupts *should* be okay */ | ||
743 | - local_irq_save(flags); | ||
744 | cpu = smp_processor_id(); | ||
745 | |||
746 | -#ifndef CONFIG_TAU_INT | ||
747 | - TAUupdate(cpu); | ||
748 | -#endif | ||
749 | + if (!tau_int_enable) | ||
750 | + TAUupdate(cpu); | ||
751 | + | ||
752 | + /* Stop thermal sensor comparisons and interrupts */ | ||
753 | + mtspr(SPRN_THRM3, 0); | ||
754 | |||
755 | size = tau[cpu].high - tau[cpu].low; | ||
756 | if (size > min_window && ! tau[cpu].grew) { | ||
757 | @@ -173,32 +148,26 @@ static void tau_timeout(void * info) | ||
758 | |||
759 | set_thresholds(cpu); | ||
760 | |||
761 | - /* | ||
762 | - * Do the enable every time, since otherwise a bunch of (relatively) | ||
763 | - * complex sleep code needs to be added. One mtspr every time | ||
764 | - * tau_timeout is called is probably not a big deal. | ||
765 | - * | ||
766 | - * Enable thermal sensor and set up sample interval timer | ||
767 | - * need 20 us to do the compare.. until a nice 'cpu_speed' function | ||
768 | - * call is implemented, just assume a 500 mhz clock. It doesn't really | ||
769 | - * matter if we take too long for a compare since it's all interrupt | ||
770 | - * driven anyway. | ||
771 | - * | ||
772 | - * use a extra long time.. (60 us @ 500 mhz) | ||
773 | + /* Restart thermal sensor comparisons and interrupts. | ||
774 | + * The "PowerPC 740 and PowerPC 750 Microprocessor Datasheet" | ||
775 | + * recommends that "the maximum value be set in THRM3 under all | ||
776 | + * conditions." | ||
777 | */ | ||
778 | - mtspr(SPRN_THRM3, THRM3_SITV(500*60) | THRM3_E); | ||
779 | - | ||
780 | - local_irq_restore(flags); | ||
781 | + mtspr(SPRN_THRM3, THRM3_SITV(0x1fff) | THRM3_E); | ||
782 | } | ||
783 | |||
784 | -static void tau_timeout_smp(struct timer_list *unused) | ||
785 | -{ | ||
786 | +static struct workqueue_struct *tau_workq; | ||
787 | |||
788 | - /* schedule ourselves to be run again */ | ||
789 | - mod_timer(&tau_timer, jiffies + shrink_timer) ; | ||
790 | +static void tau_work_func(struct work_struct *work) | ||
791 | +{ | ||
792 | + msleep(shrink_timer); | ||
793 | on_each_cpu(tau_timeout, NULL, 0); | ||
794 | + /* schedule ourselves to be run again */ | ||
795 | + queue_work(tau_workq, work); | ||
796 | } | ||
797 | |||
798 | +DECLARE_WORK(tau_work, tau_work_func); | ||
799 | + | ||
800 | /* | ||
801 | * setup the TAU | ||
802 | * | ||
803 | @@ -231,21 +200,19 @@ static int __init TAU_init(void) | ||
804 | return 1; | ||
805 | } | ||
806 | |||
807 | + tau_int_enable = IS_ENABLED(CONFIG_TAU_INT) && | ||
808 | + !strcmp(cur_cpu_spec->platform, "ppc750"); | ||
809 | |||
810 | - /* first, set up the window shrinking timer */ | ||
811 | - timer_setup(&tau_timer, tau_timeout_smp, 0); | ||
812 | - tau_timer.expires = jiffies + shrink_timer; | ||
813 | - add_timer(&tau_timer); | ||
814 | + tau_workq = alloc_workqueue("tau", WQ_UNBOUND, 1, 0); | ||
815 | + if (!tau_workq) | ||
816 | + return -ENOMEM; | ||
817 | |||
818 | on_each_cpu(TAU_init_smp, NULL, 0); | ||
819 | |||
820 | - printk("Thermal assist unit "); | ||
821 | -#ifdef CONFIG_TAU_INT | ||
822 | - printk("using interrupts, "); | ||
823 | -#else | ||
824 | - printk("using timers, "); | ||
825 | -#endif | ||
826 | - printk("shrink_timer: %d jiffies\n", shrink_timer); | ||
827 | + queue_work(tau_workq, &tau_work); | ||
828 | + | ||
829 | + pr_info("Thermal assist unit using %s, shrink_timer: %d ms\n", | ||
830 | + tau_int_enable ? "interrupts" : "workqueue", shrink_timer); | ||
831 | tau_initialized = 1; | ||
832 | |||
833 | return 0; | ||
834 | diff --git a/arch/powerpc/mm/book3s64/radix_tlb.c b/arch/powerpc/mm/book3s64/radix_tlb.c | ||
835 | index 67af871190c6d..b0f240afffa22 100644 | ||
836 | --- a/arch/powerpc/mm/book3s64/radix_tlb.c | ||
837 | +++ b/arch/powerpc/mm/book3s64/radix_tlb.c | ||
838 | @@ -639,19 +639,29 @@ static void do_exit_flush_lazy_tlb(void *arg) | ||
839 | struct mm_struct *mm = arg; | ||
840 | unsigned long pid = mm->context.id; | ||
841 | |||
842 | + /* | ||
843 | + * A kthread could have done a mmget_not_zero() after the flushing CPU | ||
844 | + * checked mm_is_singlethreaded, and be in the process of | ||
845 | + * kthread_use_mm when interrupted here. In that case, current->mm will | ||
846 | + * be set to mm, because kthread_use_mm() setting ->mm and switching to | ||
847 | + * the mm is done with interrupts off. | ||
848 | + */ | ||
849 | if (current->mm == mm) | ||
850 | - return; /* Local CPU */ | ||
851 | + goto out_flush; | ||
852 | |||
853 | if (current->active_mm == mm) { | ||
854 | - /* | ||
855 | - * Must be a kernel thread because sender is single-threaded. | ||
856 | - */ | ||
857 | - BUG_ON(current->mm); | ||
858 | + WARN_ON_ONCE(current->mm != NULL); | ||
859 | + /* Is a kernel thread and is using mm as the lazy tlb */ | ||
860 | mmgrab(&init_mm); | ||
861 | - switch_mm(mm, &init_mm, current); | ||
862 | current->active_mm = &init_mm; | ||
863 | + switch_mm_irqs_off(mm, &init_mm, current); | ||
864 | mmdrop(mm); | ||
865 | } | ||
866 | + | ||
867 | + atomic_dec(&mm->context.active_cpus); | ||
868 | + cpumask_clear_cpu(smp_processor_id(), mm_cpumask(mm)); | ||
869 | + | ||
870 | +out_flush: | ||
871 | _tlbiel_pid(pid, RIC_FLUSH_ALL); | ||
872 | } | ||
873 | |||
874 | @@ -666,7 +676,6 @@ static void exit_flush_lazy_tlbs(struct mm_struct *mm) | ||
875 | */ | ||
876 | smp_call_function_many(mm_cpumask(mm), do_exit_flush_lazy_tlb, | ||
877 | (void *)mm, 1); | ||
878 | - mm_reset_thread_local(mm); | ||
879 | } | ||
880 | |||
881 | void radix__flush_tlb_mm(struct mm_struct *mm) | ||
882 | diff --git a/arch/powerpc/mm/drmem.c b/arch/powerpc/mm/drmem.c | ||
883 | index 59327cefbc6a6..873fcfc7b8756 100644 | ||
884 | --- a/arch/powerpc/mm/drmem.c | ||
885 | +++ b/arch/powerpc/mm/drmem.c | ||
886 | @@ -362,10 +362,8 @@ static void __init init_drmem_v1_lmbs(const __be32 *prop) | ||
887 | if (!drmem_info->lmbs) | ||
888 | return; | ||
889 | |||
890 | - for_each_drmem_lmb(lmb) { | ||
891 | + for_each_drmem_lmb(lmb) | ||
892 | read_drconf_v1_cell(lmb, &prop); | ||
893 | - lmb_set_nid(lmb); | ||
894 | - } | ||
895 | } | ||
896 | |||
897 | static void __init init_drmem_v2_lmbs(const __be32 *prop) | ||
898 | @@ -410,8 +408,6 @@ static void __init init_drmem_v2_lmbs(const __be32 *prop) | ||
899 | |||
900 | lmb->aa_index = dr_cell.aa_index; | ||
901 | lmb->flags = dr_cell.flags; | ||
902 | - | ||
903 | - lmb_set_nid(lmb); | ||
904 | } | ||
905 | } | ||
906 | } | ||
907 | diff --git a/arch/powerpc/perf/hv-gpci-requests.h b/arch/powerpc/perf/hv-gpci-requests.h | ||
908 | index e608f9db12ddc..8965b4463d433 100644 | ||
909 | --- a/arch/powerpc/perf/hv-gpci-requests.h | ||
910 | +++ b/arch/powerpc/perf/hv-gpci-requests.h | ||
911 | @@ -95,7 +95,7 @@ REQUEST(__field(0, 8, partition_id) | ||
912 | |||
913 | #define REQUEST_NAME system_performance_capabilities | ||
914 | #define REQUEST_NUM 0x40 | ||
915 | -#define REQUEST_IDX_KIND "starting_index=0xffffffffffffffff" | ||
916 | +#define REQUEST_IDX_KIND "starting_index=0xffffffff" | ||
917 | #include I(REQUEST_BEGIN) | ||
918 | REQUEST(__field(0, 1, perf_collect_privileged) | ||
919 | __field(0x1, 1, capability_mask) | ||
920 | @@ -223,7 +223,7 @@ REQUEST(__field(0, 2, partition_id) | ||
921 | |||
922 | #define REQUEST_NAME system_hypervisor_times | ||
923 | #define REQUEST_NUM 0xF0 | ||
924 | -#define REQUEST_IDX_KIND "starting_index=0xffffffffffffffff" | ||
925 | +#define REQUEST_IDX_KIND "starting_index=0xffffffff" | ||
926 | #include I(REQUEST_BEGIN) | ||
927 | REQUEST(__count(0, 8, time_spent_to_dispatch_virtual_processors) | ||
928 | __count(0x8, 8, time_spent_processing_virtual_processor_timers) | ||
929 | @@ -234,7 +234,7 @@ REQUEST(__count(0, 8, time_spent_to_dispatch_virtual_processors) | ||
930 | |||
931 | #define REQUEST_NAME system_tlbie_count_and_time | ||
932 | #define REQUEST_NUM 0xF4 | ||
933 | -#define REQUEST_IDX_KIND "starting_index=0xffffffffffffffff" | ||
934 | +#define REQUEST_IDX_KIND "starting_index=0xffffffff" | ||
935 | #include I(REQUEST_BEGIN) | ||
936 | REQUEST(__count(0, 8, tlbie_instructions_issued) | ||
937 | /* | ||
938 | diff --git a/arch/powerpc/perf/isa207-common.c b/arch/powerpc/perf/isa207-common.c | ||
939 | index 4c86da5eb28ab..0b5c8f4fbdbfd 100644 | ||
940 | --- a/arch/powerpc/perf/isa207-common.c | ||
941 | +++ b/arch/powerpc/perf/isa207-common.c | ||
942 | @@ -269,6 +269,15 @@ int isa207_get_constraint(u64 event, unsigned long *maskp, unsigned long *valp) | ||
943 | |||
944 | mask |= CNST_PMC_MASK(pmc); | ||
945 | value |= CNST_PMC_VAL(pmc); | ||
946 | + | ||
947 | + /* | ||
948 | + * PMC5 and PMC6 are used to count cycles and instructions and | ||
949 | + * they do not support most of the constraint bits. Add a check | ||
950 | + * to exclude PMC5/6 from most of the constraints except for | ||
951 | + * EBB/BHRB. | ||
952 | + */ | ||
953 | + if (pmc >= 5) | ||
954 | + goto ebb_bhrb; | ||
955 | } | ||
956 | |||
957 | if (pmc <= 4) { | ||
958 | @@ -335,6 +344,7 @@ int isa207_get_constraint(u64 event, unsigned long *maskp, unsigned long *valp) | ||
959 | } | ||
960 | } | ||
961 | |||
962 | +ebb_bhrb: | ||
963 | if (!pmc && ebb) | ||
964 | /* EBB events must specify the PMC */ | ||
965 | return -1; | ||
966 | diff --git a/arch/powerpc/platforms/Kconfig b/arch/powerpc/platforms/Kconfig | ||
967 | index d82e3664ffdf8..18792a5b003a0 100644 | ||
968 | --- a/arch/powerpc/platforms/Kconfig | ||
969 | +++ b/arch/powerpc/platforms/Kconfig | ||
970 | @@ -219,12 +219,11 @@ config TAU | ||
971 | temperature within 2-4 degrees Celsius. This option shows the current | ||
972 | on-die temperature in /proc/cpuinfo if the cpu supports it. | ||
973 | |||
974 | - Unfortunately, on some chip revisions, this sensor is very inaccurate | ||
975 | - and in many cases, does not work at all, so don't assume the cpu | ||
976 | - temp is actually what /proc/cpuinfo says it is. | ||
977 | + Unfortunately, this sensor is very inaccurate when uncalibrated, so | ||
978 | + don't assume the cpu temp is actually what /proc/cpuinfo says it is. | ||
979 | |||
980 | config TAU_INT | ||
981 | - bool "Interrupt driven TAU driver (DANGEROUS)" | ||
982 | + bool "Interrupt driven TAU driver (EXPERIMENTAL)" | ||
983 | depends on TAU | ||
984 | ---help--- | ||
985 | The TAU supports an interrupt driven mode which causes an interrupt | ||
986 | @@ -232,12 +231,7 @@ config TAU_INT | ||
987 | to get notified the temp has exceeded a range. With this option off, | ||
988 | a timer is used to re-check the temperature periodically. | ||
989 | |||
990 | - However, on some cpus it appears that the TAU interrupt hardware | ||
991 | - is buggy and can cause a situation which would lead unexplained hard | ||
992 | - lockups. | ||
993 | - | ||
994 | - Unless you are extending the TAU driver, or enjoy kernel/hardware | ||
995 | - debugging, leave this option off. | ||
996 | + If in doubt, say N here. | ||
997 | |||
998 | config TAU_AVERAGE | ||
999 | bool "Average high and low temp" | ||
1000 | diff --git a/arch/powerpc/platforms/powernv/opal-dump.c b/arch/powerpc/platforms/powernv/opal-dump.c | ||
1001 | index 543c816fa99ef..0e6693bacb7e7 100644 | ||
1002 | --- a/arch/powerpc/platforms/powernv/opal-dump.c | ||
1003 | +++ b/arch/powerpc/platforms/powernv/opal-dump.c | ||
1004 | @@ -318,15 +318,14 @@ static ssize_t dump_attr_read(struct file *filep, struct kobject *kobj, | ||
1005 | return count; | ||
1006 | } | ||
1007 | |||
1008 | -static struct dump_obj *create_dump_obj(uint32_t id, size_t size, | ||
1009 | - uint32_t type) | ||
1010 | +static void create_dump_obj(uint32_t id, size_t size, uint32_t type) | ||
1011 | { | ||
1012 | struct dump_obj *dump; | ||
1013 | int rc; | ||
1014 | |||
1015 | dump = kzalloc(sizeof(*dump), GFP_KERNEL); | ||
1016 | if (!dump) | ||
1017 | - return NULL; | ||
1018 | + return; | ||
1019 | |||
1020 | dump->kobj.kset = dump_kset; | ||
1021 | |||
1022 | @@ -346,21 +345,39 @@ static struct dump_obj *create_dump_obj(uint32_t id, size_t size, | ||
1023 | rc = kobject_add(&dump->kobj, NULL, "0x%x-0x%x", type, id); | ||
1024 | if (rc) { | ||
1025 | kobject_put(&dump->kobj); | ||
1026 | - return NULL; | ||
1027 | + return; | ||
1028 | } | ||
1029 | |||
1030 | + /* | ||
1031 | + * As soon as the sysfs file for this dump is created/activated there is | ||
1032 | + * a chance the opal_errd daemon (or any userspace) might read and | ||
1033 | + * acknowledge the dump before kobject_uevent() is called. If that | ||
1034 | + * happens then there is a potential race between | ||
1035 | + * dump_ack_store->kobject_put() and kobject_uevent() which leads to a | ||
1036 | + * use-after-free of a kernfs object resulting in a kernel crash. | ||
1037 | + * | ||
1038 | + * To avoid that, we need to take a reference on behalf of the bin file, | ||
1039 | + * so that our reference remains valid while we call kobject_uevent(). | ||
1040 | + * We then drop our reference before exiting the function, leaving the | ||
1041 | + * bin file to drop the last reference (if it hasn't already). | ||
1042 | + */ | ||
1043 | + | ||
1044 | + /* Take a reference for the bin file */ | ||
1045 | + kobject_get(&dump->kobj); | ||
1046 | rc = sysfs_create_bin_file(&dump->kobj, &dump->dump_attr); | ||
1047 | - if (rc) { | ||
1048 | + if (rc == 0) { | ||
1049 | + kobject_uevent(&dump->kobj, KOBJ_ADD); | ||
1050 | + | ||
1051 | + pr_info("%s: New platform dump. ID = 0x%x Size %u\n", | ||
1052 | + __func__, dump->id, dump->size); | ||
1053 | + } else { | ||
1054 | + /* Drop reference count taken for bin file */ | ||
1055 | kobject_put(&dump->kobj); | ||
1056 | - return NULL; | ||
1057 | } | ||
1058 | |||
1059 | - pr_info("%s: New platform dump. ID = 0x%x Size %u\n", | ||
1060 | - __func__, dump->id, dump->size); | ||
1061 | - | ||
1062 | - kobject_uevent(&dump->kobj, KOBJ_ADD); | ||
1063 | - | ||
1064 | - return dump; | ||
1065 | + /* Drop our reference */ | ||
1066 | + kobject_put(&dump->kobj); | ||
1067 | + return; | ||
1068 | } | ||
1069 | |||
1070 | static irqreturn_t process_dump(int irq, void *data) | ||
1071 | diff --git a/arch/powerpc/platforms/pseries/hotplug-memory.c b/arch/powerpc/platforms/pseries/hotplug-memory.c | ||
1072 | index e7d23a933a0d3..66b32f46702de 100644 | ||
1073 | --- a/arch/powerpc/platforms/pseries/hotplug-memory.c | ||
1074 | +++ b/arch/powerpc/platforms/pseries/hotplug-memory.c | ||
1075 | @@ -376,25 +376,32 @@ static int dlpar_add_lmb(struct drmem_lmb *); | ||
1076 | |||
1077 | static int dlpar_remove_lmb(struct drmem_lmb *lmb) | ||
1078 | { | ||
1079 | + struct memory_block *mem_block; | ||
1080 | unsigned long block_sz; | ||
1081 | int rc; | ||
1082 | |||
1083 | if (!lmb_is_removable(lmb)) | ||
1084 | return -EINVAL; | ||
1085 | |||
1086 | + mem_block = lmb_to_memblock(lmb); | ||
1087 | + if (mem_block == NULL) | ||
1088 | + return -EINVAL; | ||
1089 | + | ||
1090 | rc = dlpar_offline_lmb(lmb); | ||
1091 | - if (rc) | ||
1092 | + if (rc) { | ||
1093 | + put_device(&mem_block->dev); | ||
1094 | return rc; | ||
1095 | + } | ||
1096 | |||
1097 | block_sz = pseries_memory_block_size(); | ||
1098 | |||
1099 | - __remove_memory(lmb->nid, lmb->base_addr, block_sz); | ||
1100 | + __remove_memory(mem_block->nid, lmb->base_addr, block_sz); | ||
1101 | + put_device(&mem_block->dev); | ||
1102 | |||
1103 | /* Update memory regions for memory remove */ | ||
1104 | memblock_remove(lmb->base_addr, block_sz); | ||
1105 | |||
1106 | invalidate_lmb_associativity_index(lmb); | ||
1107 | - lmb_clear_nid(lmb); | ||
1108 | lmb->flags &= ~DRCONF_MEM_ASSIGNED; | ||
1109 | |||
1110 | return 0; | ||
1111 | @@ -651,7 +658,7 @@ static int dlpar_memory_remove_by_ic(u32 lmbs_to_remove, u32 drc_index) | ||
1112 | static int dlpar_add_lmb(struct drmem_lmb *lmb) | ||
1113 | { | ||
1114 | unsigned long block_sz; | ||
1115 | - int rc; | ||
1116 | + int nid, rc; | ||
1117 | |||
1118 | if (lmb->flags & DRCONF_MEM_ASSIGNED) | ||
1119 | return -EINVAL; | ||
1120 | @@ -662,11 +669,13 @@ static int dlpar_add_lmb(struct drmem_lmb *lmb) | ||
1121 | return rc; | ||
1122 | } | ||
1123 | |||
1124 | - lmb_set_nid(lmb); | ||
1125 | block_sz = memory_block_size_bytes(); | ||
1126 | |||
1127 | + /* Find the node id for this address. */ | ||
1128 | + nid = memory_add_physaddr_to_nid(lmb->base_addr); | ||
1129 | + | ||
1130 | /* Add the memory */ | ||
1131 | - rc = __add_memory(lmb->nid, lmb->base_addr, block_sz); | ||
1132 | + rc = __add_memory(nid, lmb->base_addr, block_sz); | ||
1133 | if (rc) { | ||
1134 | invalidate_lmb_associativity_index(lmb); | ||
1135 | return rc; | ||
1136 | @@ -674,9 +683,8 @@ static int dlpar_add_lmb(struct drmem_lmb *lmb) | ||
1137 | |||
1138 | rc = dlpar_online_lmb(lmb); | ||
1139 | if (rc) { | ||
1140 | - __remove_memory(lmb->nid, lmb->base_addr, block_sz); | ||
1141 | + __remove_memory(nid, lmb->base_addr, block_sz); | ||
1142 | invalidate_lmb_associativity_index(lmb); | ||
1143 | - lmb_clear_nid(lmb); | ||
1144 | } else { | ||
1145 | lmb->flags |= DRCONF_MEM_ASSIGNED; | ||
1146 | } | ||
1147 | diff --git a/arch/powerpc/platforms/pseries/ras.c b/arch/powerpc/platforms/pseries/ras.c | ||
1148 | index b3c4848869e52..b658fa627a34b 100644 | ||
1149 | --- a/arch/powerpc/platforms/pseries/ras.c | ||
1150 | +++ b/arch/powerpc/platforms/pseries/ras.c | ||
1151 | @@ -494,18 +494,55 @@ int pSeries_system_reset_exception(struct pt_regs *regs) | ||
1152 | return 0; /* need to perform reset */ | ||
1153 | } | ||
1154 | |||
1155 | +static int mce_handle_err_realmode(int disposition, u8 error_type) | ||
1156 | +{ | ||
1157 | +#ifdef CONFIG_PPC_BOOK3S_64 | ||
1158 | + if (disposition == RTAS_DISP_NOT_RECOVERED) { | ||
1159 | + switch (error_type) { | ||
1160 | + case MC_ERROR_TYPE_SLB: | ||
1161 | + case MC_ERROR_TYPE_ERAT: | ||
1162 | + /* | ||
1163 | + * Store the old slb content in paca before flushing. | ||
1164 | + * Print this when we go to virtual mode. | ||
1165 | + * There are chances that we may hit MCE again if there | ||
1166 | + * is a parity error on the SLB entry we trying to read | ||
1167 | + * for saving. Hence limit the slb saving to single | ||
1168 | + * level of recursion. | ||
1169 | + */ | ||
1170 | + if (local_paca->in_mce == 1) | ||
1171 | + slb_save_contents(local_paca->mce_faulty_slbs); | ||
1172 | + flush_and_reload_slb(); | ||
1173 | + disposition = RTAS_DISP_FULLY_RECOVERED; | ||
1174 | + break; | ||
1175 | + default: | ||
1176 | + break; | ||
1177 | + } | ||
1178 | + } else if (disposition == RTAS_DISP_LIMITED_RECOVERY) { | ||
1179 | + /* Platform corrected itself but could be degraded */ | ||
1180 | + pr_err("MCE: limited recovery, system may be degraded\n"); | ||
1181 | + disposition = RTAS_DISP_FULLY_RECOVERED; | ||
1182 | + } | ||
1183 | +#endif | ||
1184 | + return disposition; | ||
1185 | +} | ||
1186 | |||
1187 | -static int mce_handle_error(struct pt_regs *regs, struct rtas_error_log *errp) | ||
1188 | +static int mce_handle_err_virtmode(struct pt_regs *regs, | ||
1189 | + struct rtas_error_log *errp, | ||
1190 | + struct pseries_mc_errorlog *mce_log, | ||
1191 | + int disposition) | ||
1192 | { | ||
1193 | struct mce_error_info mce_err = { 0 }; | ||
1194 | - unsigned long eaddr = 0, paddr = 0; | ||
1195 | - struct pseries_errorlog *pseries_log; | ||
1196 | - struct pseries_mc_errorlog *mce_log; | ||
1197 | - int disposition = rtas_error_disposition(errp); | ||
1198 | int initiator = rtas_error_initiator(errp); | ||
1199 | int severity = rtas_error_severity(errp); | ||
1200 | + unsigned long eaddr = 0, paddr = 0; | ||
1201 | u8 error_type, err_sub_type; | ||
1202 | |||
1203 | + if (!mce_log) | ||
1204 | + goto out; | ||
1205 | + | ||
1206 | + error_type = mce_log->error_type; | ||
1207 | + err_sub_type = rtas_mc_error_sub_type(mce_log); | ||
1208 | + | ||
1209 | if (initiator == RTAS_INITIATOR_UNKNOWN) | ||
1210 | mce_err.initiator = MCE_INITIATOR_UNKNOWN; | ||
1211 | else if (initiator == RTAS_INITIATOR_CPU) | ||
1212 | @@ -544,18 +581,7 @@ static int mce_handle_error(struct pt_regs *regs, struct rtas_error_log *errp) | ||
1213 | mce_err.error_type = MCE_ERROR_TYPE_UNKNOWN; | ||
1214 | mce_err.error_class = MCE_ECLASS_UNKNOWN; | ||
1215 | |||
1216 | - if (!rtas_error_extended(errp)) | ||
1217 | - goto out; | ||
1218 | - | ||
1219 | - pseries_log = get_pseries_errorlog(errp, PSERIES_ELOG_SECT_ID_MCE); | ||
1220 | - if (pseries_log == NULL) | ||
1221 | - goto out; | ||
1222 | - | ||
1223 | - mce_log = (struct pseries_mc_errorlog *)pseries_log->data; | ||
1224 | - error_type = mce_log->error_type; | ||
1225 | - err_sub_type = rtas_mc_error_sub_type(mce_log); | ||
1226 | - | ||
1227 | - switch (mce_log->error_type) { | ||
1228 | + switch (error_type) { | ||
1229 | case MC_ERROR_TYPE_UE: | ||
1230 | mce_err.error_type = MCE_ERROR_TYPE_UE; | ||
1231 | switch (err_sub_type) { | ||
1232 | @@ -652,37 +678,31 @@ static int mce_handle_error(struct pt_regs *regs, struct rtas_error_log *errp) | ||
1233 | mce_err.error_type = MCE_ERROR_TYPE_UNKNOWN; | ||
1234 | break; | ||
1235 | } | ||
1236 | +out: | ||
1237 | + save_mce_event(regs, disposition == RTAS_DISP_FULLY_RECOVERED, | ||
1238 | + &mce_err, regs->nip, eaddr, paddr); | ||
1239 | + return disposition; | ||
1240 | +} | ||
1241 | |||
1242 | -#ifdef CONFIG_PPC_BOOK3S_64 | ||
1243 | - if (disposition == RTAS_DISP_NOT_RECOVERED) { | ||
1244 | - switch (error_type) { | ||
1245 | - case MC_ERROR_TYPE_SLB: | ||
1246 | - case MC_ERROR_TYPE_ERAT: | ||
1247 | - /* | ||
1248 | - * Store the old slb content in paca before flushing. | ||
1249 | - * Print this when we go to virtual mode. | ||
1250 | - * There are chances that we may hit MCE again if there | ||
1251 | - * is a parity error on the SLB entry we trying to read | ||
1252 | - * for saving. Hence limit the slb saving to single | ||
1253 | - * level of recursion. | ||
1254 | - */ | ||
1255 | - if (local_paca->in_mce == 1) | ||
1256 | - slb_save_contents(local_paca->mce_faulty_slbs); | ||
1257 | - flush_and_reload_slb(); | ||
1258 | - disposition = RTAS_DISP_FULLY_RECOVERED; | ||
1259 | - break; | ||
1260 | - default: | ||
1261 | - break; | ||
1262 | - } | ||
1263 | - } else if (disposition == RTAS_DISP_LIMITED_RECOVERY) { | ||
1264 | - /* Platform corrected itself but could be degraded */ | ||
1265 | - printk(KERN_ERR "MCE: limited recovery, system may " | ||
1266 | - "be degraded\n"); | ||
1267 | - disposition = RTAS_DISP_FULLY_RECOVERED; | ||
1268 | - } | ||
1269 | -#endif | ||
1270 | +static int mce_handle_error(struct pt_regs *regs, struct rtas_error_log *errp) | ||
1271 | +{ | ||
1272 | + struct pseries_errorlog *pseries_log; | ||
1273 | + struct pseries_mc_errorlog *mce_log = NULL; | ||
1274 | + int disposition = rtas_error_disposition(errp); | ||
1275 | + u8 error_type; | ||
1276 | + | ||
1277 | + if (!rtas_error_extended(errp)) | ||
1278 | + goto out; | ||
1279 | + | ||
1280 | + pseries_log = get_pseries_errorlog(errp, PSERIES_ELOG_SECT_ID_MCE); | ||
1281 | + if (!pseries_log) | ||
1282 | + goto out; | ||
1283 | + | ||
1284 | + mce_log = (struct pseries_mc_errorlog *)pseries_log->data; | ||
1285 | + error_type = mce_log->error_type; | ||
1286 | + | ||
1287 | + disposition = mce_handle_err_realmode(disposition, error_type); | ||
1288 | |||
1289 | -out: | ||
1290 | /* | ||
1291 | * Enable translation as we will be accessing per-cpu variables | ||
1292 | * in save_mce_event() which may fall outside RMO region, also | ||
1293 | @@ -693,10 +713,10 @@ out: | ||
1294 | * Note: All the realmode handling like flushing SLB entries for | ||
1295 | * SLB multihit is done by now. | ||
1296 | */ | ||
1297 | +out: | ||
1298 | mtmsr(mfmsr() | MSR_IR | MSR_DR); | ||
1299 | - save_mce_event(regs, disposition == RTAS_DISP_FULLY_RECOVERED, | ||
1300 | - &mce_err, regs->nip, eaddr, paddr); | ||
1301 | - | ||
1302 | + disposition = mce_handle_err_virtmode(regs, errp, mce_log, | ||
1303 | + disposition); | ||
1304 | return disposition; | ||
1305 | } | ||
1306 | |||
1307 | diff --git a/arch/powerpc/platforms/pseries/rng.c b/arch/powerpc/platforms/pseries/rng.c | ||
1308 | index bbb97169bf63e..6268545947b83 100644 | ||
1309 | --- a/arch/powerpc/platforms/pseries/rng.c | ||
1310 | +++ b/arch/powerpc/platforms/pseries/rng.c | ||
1311 | @@ -36,6 +36,7 @@ static __init int rng_init(void) | ||
1312 | |||
1313 | ppc_md.get_random_seed = pseries_get_random_long; | ||
1314 | |||
1315 | + of_node_put(dn); | ||
1316 | return 0; | ||
1317 | } | ||
1318 | machine_subsys_initcall(pseries, rng_init); | ||
1319 | diff --git a/arch/powerpc/sysdev/xics/icp-hv.c b/arch/powerpc/sysdev/xics/icp-hv.c | ||
1320 | index ad8117148ea3b..21b9d1bf39ff6 100644 | ||
1321 | --- a/arch/powerpc/sysdev/xics/icp-hv.c | ||
1322 | +++ b/arch/powerpc/sysdev/xics/icp-hv.c | ||
1323 | @@ -174,6 +174,7 @@ int icp_hv_init(void) | ||
1324 | |||
1325 | icp_ops = &icp_hv_ops; | ||
1326 | |||
1327 | + of_node_put(np); | ||
1328 | return 0; | ||
1329 | } | ||
1330 | |||
1331 | diff --git a/arch/x86/boot/compressed/pgtable_64.c b/arch/x86/boot/compressed/pgtable_64.c | ||
1332 | index c8862696a47b9..7d0394f4ebf97 100644 | ||
1333 | --- a/arch/x86/boot/compressed/pgtable_64.c | ||
1334 | +++ b/arch/x86/boot/compressed/pgtable_64.c | ||
1335 | @@ -5,15 +5,6 @@ | ||
1336 | #include "pgtable.h" | ||
1337 | #include "../string.h" | ||
1338 | |||
1339 | -/* | ||
1340 | - * __force_order is used by special_insns.h asm code to force instruction | ||
1341 | - * serialization. | ||
1342 | - * | ||
1343 | - * It is not referenced from the code, but GCC < 5 with -fPIE would fail | ||
1344 | - * due to an undefined symbol. Define it to make these ancient GCCs work. | ||
1345 | - */ | ||
1346 | -unsigned long __force_order; | ||
1347 | - | ||
1348 | #define BIOS_START_MIN 0x20000U /* 128K, less than this is insane */ | ||
1349 | #define BIOS_START_MAX 0x9f000U /* 640K, absolute maximum */ | ||
1350 | |||
1351 | diff --git a/arch/x86/events/amd/iommu.c b/arch/x86/events/amd/iommu.c | ||
1352 | index fb616203ce427..be50ef8572cce 100644 | ||
1353 | --- a/arch/x86/events/amd/iommu.c | ||
1354 | +++ b/arch/x86/events/amd/iommu.c | ||
1355 | @@ -379,7 +379,7 @@ static __init int _init_events_attrs(void) | ||
1356 | while (amd_iommu_v2_event_descs[i].attr.attr.name) | ||
1357 | i++; | ||
1358 | |||
1359 | - attrs = kcalloc(i + 1, sizeof(struct attribute **), GFP_KERNEL); | ||
1360 | + attrs = kcalloc(i + 1, sizeof(*attrs), GFP_KERNEL); | ||
1361 | if (!attrs) | ||
1362 | return -ENOMEM; | ||
1363 | |||
1364 | diff --git a/arch/x86/events/intel/ds.c b/arch/x86/events/intel/ds.c | ||
1365 | index e5ad97a823426..1aaba2c8a9ba6 100644 | ||
1366 | --- a/arch/x86/events/intel/ds.c | ||
1367 | +++ b/arch/x86/events/intel/ds.c | ||
1368 | @@ -669,9 +669,7 @@ unlock: | ||
1369 | |||
1370 | static inline void intel_pmu_drain_pebs_buffer(void) | ||
1371 | { | ||
1372 | - struct pt_regs regs; | ||
1373 | - | ||
1374 | - x86_pmu.drain_pebs(®s); | ||
1375 | + x86_pmu.drain_pebs(NULL); | ||
1376 | } | ||
1377 | |||
1378 | /* | ||
1379 | @@ -1736,6 +1734,7 @@ static void __intel_pmu_pebs_event(struct perf_event *event, | ||
1380 | struct x86_perf_regs perf_regs; | ||
1381 | struct pt_regs *regs = &perf_regs.regs; | ||
1382 | void *at = get_next_pebs_record_by_bit(base, top, bit); | ||
1383 | + struct pt_regs dummy_iregs; | ||
1384 | |||
1385 | if (hwc->flags & PERF_X86_EVENT_AUTO_RELOAD) { | ||
1386 | /* | ||
1387 | @@ -1748,6 +1747,9 @@ static void __intel_pmu_pebs_event(struct perf_event *event, | ||
1388 | } else if (!intel_pmu_save_and_restart(event)) | ||
1389 | return; | ||
1390 | |||
1391 | + if (!iregs) | ||
1392 | + iregs = &dummy_iregs; | ||
1393 | + | ||
1394 | while (count > 1) { | ||
1395 | setup_sample(event, iregs, at, &data, regs); | ||
1396 | perf_event_output(event, &data, regs); | ||
1397 | @@ -1757,16 +1759,22 @@ static void __intel_pmu_pebs_event(struct perf_event *event, | ||
1398 | } | ||
1399 | |||
1400 | setup_sample(event, iregs, at, &data, regs); | ||
1401 | - | ||
1402 | - /* | ||
1403 | - * All but the last records are processed. | ||
1404 | - * The last one is left to be able to call the overflow handler. | ||
1405 | - */ | ||
1406 | - if (perf_event_overflow(event, &data, regs)) { | ||
1407 | - x86_pmu_stop(event, 0); | ||
1408 | - return; | ||
1409 | + if (iregs == &dummy_iregs) { | ||
1410 | + /* | ||
1411 | + * The PEBS records may be drained in the non-overflow context, | ||
1412 | + * e.g., large PEBS + context switch. Perf should treat the | ||
1413 | + * last record the same as other PEBS records, and doesn't | ||
1414 | + * invoke the generic overflow handler. | ||
1415 | + */ | ||
1416 | + perf_event_output(event, &data, regs); | ||
1417 | + } else { | ||
1418 | + /* | ||
1419 | + * All but the last records are processed. | ||
1420 | + * The last one is left to be able to call the overflow handler. | ||
1421 | + */ | ||
1422 | + if (perf_event_overflow(event, &data, regs)) | ||
1423 | + x86_pmu_stop(event, 0); | ||
1424 | } | ||
1425 | - | ||
1426 | } | ||
1427 | |||
1428 | static void intel_pmu_drain_pebs_core(struct pt_regs *iregs) | ||
1429 | diff --git a/arch/x86/events/intel/uncore_snb.c b/arch/x86/events/intel/uncore_snb.c | ||
1430 | index c37cb12d0ef68..aec6e63c6a04a 100644 | ||
1431 | --- a/arch/x86/events/intel/uncore_snb.c | ||
1432 | +++ b/arch/x86/events/intel/uncore_snb.c | ||
1433 | @@ -110,6 +110,10 @@ | ||
1434 | #define ICL_UNC_CBO_0_PER_CTR0 0x702 | ||
1435 | #define ICL_UNC_CBO_MSR_OFFSET 0x8 | ||
1436 | |||
1437 | +/* ICL ARB register */ | ||
1438 | +#define ICL_UNC_ARB_PER_CTR 0x3b1 | ||
1439 | +#define ICL_UNC_ARB_PERFEVTSEL 0x3b3 | ||
1440 | + | ||
1441 | DEFINE_UNCORE_FORMAT_ATTR(event, event, "config:0-7"); | ||
1442 | DEFINE_UNCORE_FORMAT_ATTR(umask, umask, "config:8-15"); | ||
1443 | DEFINE_UNCORE_FORMAT_ATTR(edge, edge, "config:18"); | ||
1444 | @@ -297,15 +301,21 @@ void skl_uncore_cpu_init(void) | ||
1445 | snb_uncore_arb.ops = &skl_uncore_msr_ops; | ||
1446 | } | ||
1447 | |||
1448 | +static struct intel_uncore_ops icl_uncore_msr_ops = { | ||
1449 | + .disable_event = snb_uncore_msr_disable_event, | ||
1450 | + .enable_event = snb_uncore_msr_enable_event, | ||
1451 | + .read_counter = uncore_msr_read_counter, | ||
1452 | +}; | ||
1453 | + | ||
1454 | static struct intel_uncore_type icl_uncore_cbox = { | ||
1455 | .name = "cbox", | ||
1456 | - .num_counters = 4, | ||
1457 | + .num_counters = 2, | ||
1458 | .perf_ctr_bits = 44, | ||
1459 | .perf_ctr = ICL_UNC_CBO_0_PER_CTR0, | ||
1460 | .event_ctl = SNB_UNC_CBO_0_PERFEVTSEL0, | ||
1461 | .event_mask = SNB_UNC_RAW_EVENT_MASK, | ||
1462 | .msr_offset = ICL_UNC_CBO_MSR_OFFSET, | ||
1463 | - .ops = &skl_uncore_msr_ops, | ||
1464 | + .ops = &icl_uncore_msr_ops, | ||
1465 | .format_group = &snb_uncore_format_group, | ||
1466 | }; | ||
1467 | |||
1468 | @@ -334,13 +344,25 @@ static struct intel_uncore_type icl_uncore_clockbox = { | ||
1469 | .single_fixed = 1, | ||
1470 | .event_mask = SNB_UNC_CTL_EV_SEL_MASK, | ||
1471 | .format_group = &icl_uncore_clock_format_group, | ||
1472 | - .ops = &skl_uncore_msr_ops, | ||
1473 | + .ops = &icl_uncore_msr_ops, | ||
1474 | .event_descs = icl_uncore_events, | ||
1475 | }; | ||
1476 | |||
1477 | +static struct intel_uncore_type icl_uncore_arb = { | ||
1478 | + .name = "arb", | ||
1479 | + .num_counters = 1, | ||
1480 | + .num_boxes = 1, | ||
1481 | + .perf_ctr_bits = 44, | ||
1482 | + .perf_ctr = ICL_UNC_ARB_PER_CTR, | ||
1483 | + .event_ctl = ICL_UNC_ARB_PERFEVTSEL, | ||
1484 | + .event_mask = SNB_UNC_RAW_EVENT_MASK, | ||
1485 | + .ops = &icl_uncore_msr_ops, | ||
1486 | + .format_group = &snb_uncore_format_group, | ||
1487 | +}; | ||
1488 | + | ||
1489 | static struct intel_uncore_type *icl_msr_uncores[] = { | ||
1490 | &icl_uncore_cbox, | ||
1491 | - &snb_uncore_arb, | ||
1492 | + &icl_uncore_arb, | ||
1493 | &icl_uncore_clockbox, | ||
1494 | NULL, | ||
1495 | }; | ||
1496 | @@ -358,7 +380,6 @@ void icl_uncore_cpu_init(void) | ||
1497 | { | ||
1498 | uncore_msr_uncores = icl_msr_uncores; | ||
1499 | icl_uncore_cbox.num_boxes = icl_get_cbox_num(); | ||
1500 | - snb_uncore_arb.ops = &skl_uncore_msr_ops; | ||
1501 | } | ||
1502 | |||
1503 | enum { | ||
1504 | diff --git a/arch/x86/include/asm/special_insns.h b/arch/x86/include/asm/special_insns.h | ||
1505 | index 6d37b8fcfc778..2e0cdc64cb50d 100644 | ||
1506 | --- a/arch/x86/include/asm/special_insns.h | ||
1507 | +++ b/arch/x86/include/asm/special_insns.h | ||
1508 | @@ -10,45 +10,47 @@ | ||
1509 | #include <linux/jump_label.h> | ||
1510 | |||
1511 | /* | ||
1512 | - * Volatile isn't enough to prevent the compiler from reordering the | ||
1513 | - * read/write functions for the control registers and messing everything up. | ||
1514 | - * A memory clobber would solve the problem, but would prevent reordering of | ||
1515 | - * all loads stores around it, which can hurt performance. Solution is to | ||
1516 | - * use a variable and mimic reads and writes to it to enforce serialization | ||
1517 | + * The compiler should not reorder volatile asm statements with respect to each | ||
1518 | + * other: they should execute in program order. However GCC 4.9.x and 5.x have | ||
1519 | + * a bug (which was fixed in 8.1, 7.3 and 6.5) where they might reorder | ||
1520 | + * volatile asm. The write functions are not affected since they have memory | ||
1521 | + * clobbers preventing reordering. To prevent reads from being reordered with | ||
1522 | + * respect to writes, use a dummy memory operand. | ||
1523 | */ | ||
1524 | -extern unsigned long __force_order; | ||
1525 | + | ||
1526 | +#define __FORCE_ORDER "m"(*(unsigned int *)0x1000UL) | ||
1527 | |||
1528 | void native_write_cr0(unsigned long val); | ||
1529 | |||
1530 | static inline unsigned long native_read_cr0(void) | ||
1531 | { | ||
1532 | unsigned long val; | ||
1533 | - asm volatile("mov %%cr0,%0\n\t" : "=r" (val), "=m" (__force_order)); | ||
1534 | + asm volatile("mov %%cr0,%0\n\t" : "=r" (val) : __FORCE_ORDER); | ||
1535 | return val; | ||
1536 | } | ||
1537 | |||
1538 | static inline unsigned long native_read_cr2(void) | ||
1539 | { | ||
1540 | unsigned long val; | ||
1541 | - asm volatile("mov %%cr2,%0\n\t" : "=r" (val), "=m" (__force_order)); | ||
1542 | + asm volatile("mov %%cr2,%0\n\t" : "=r" (val) : __FORCE_ORDER); | ||
1543 | return val; | ||
1544 | } | ||
1545 | |||
1546 | static inline void native_write_cr2(unsigned long val) | ||
1547 | { | ||
1548 | - asm volatile("mov %0,%%cr2": : "r" (val), "m" (__force_order)); | ||
1549 | + asm volatile("mov %0,%%cr2": : "r" (val) : "memory"); | ||
1550 | } | ||
1551 | |||
1552 | static inline unsigned long __native_read_cr3(void) | ||
1553 | { | ||
1554 | unsigned long val; | ||
1555 | - asm volatile("mov %%cr3,%0\n\t" : "=r" (val), "=m" (__force_order)); | ||
1556 | + asm volatile("mov %%cr3,%0\n\t" : "=r" (val) : __FORCE_ORDER); | ||
1557 | return val; | ||
1558 | } | ||
1559 | |||
1560 | static inline void native_write_cr3(unsigned long val) | ||
1561 | { | ||
1562 | - asm volatile("mov %0,%%cr3": : "r" (val), "m" (__force_order)); | ||
1563 | + asm volatile("mov %0,%%cr3": : "r" (val) : "memory"); | ||
1564 | } | ||
1565 | |||
1566 | static inline unsigned long native_read_cr4(void) | ||
1567 | @@ -63,10 +65,10 @@ static inline unsigned long native_read_cr4(void) | ||
1568 | asm volatile("1: mov %%cr4, %0\n" | ||
1569 | "2:\n" | ||
1570 | _ASM_EXTABLE(1b, 2b) | ||
1571 | - : "=r" (val), "=m" (__force_order) : "0" (0)); | ||
1572 | + : "=r" (val) : "0" (0), __FORCE_ORDER); | ||
1573 | #else | ||
1574 | /* CR4 always exists on x86_64. */ | ||
1575 | - asm volatile("mov %%cr4,%0\n\t" : "=r" (val), "=m" (__force_order)); | ||
1576 | + asm volatile("mov %%cr4,%0\n\t" : "=r" (val) : __FORCE_ORDER); | ||
1577 | #endif | ||
1578 | return val; | ||
1579 | } | ||
1580 | diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c | ||
1581 | index 9b3f25e146087..8a85c2e144a6f 100644 | ||
1582 | --- a/arch/x86/kernel/cpu/common.c | ||
1583 | +++ b/arch/x86/kernel/cpu/common.c | ||
1584 | @@ -377,7 +377,7 @@ void native_write_cr0(unsigned long val) | ||
1585 | unsigned long bits_missing = 0; | ||
1586 | |||
1587 | set_register: | ||
1588 | - asm volatile("mov %0,%%cr0": "+r" (val), "+m" (__force_order)); | ||
1589 | + asm volatile("mov %0,%%cr0": "+r" (val) : : "memory"); | ||
1590 | |||
1591 | if (static_branch_likely(&cr_pinning)) { | ||
1592 | if (unlikely((val & X86_CR0_WP) != X86_CR0_WP)) { | ||
1593 | @@ -396,7 +396,7 @@ void native_write_cr4(unsigned long val) | ||
1594 | unsigned long bits_changed = 0; | ||
1595 | |||
1596 | set_register: | ||
1597 | - asm volatile("mov %0,%%cr4": "+r" (val), "+m" (cr4_pinned_bits)); | ||
1598 | + asm volatile("mov %0,%%cr4": "+r" (val) : : "memory"); | ||
1599 | |||
1600 | if (static_branch_likely(&cr_pinning)) { | ||
1601 | if (unlikely((val & cr4_pinned_mask) != cr4_pinned_bits)) { | ||
1602 | diff --git a/arch/x86/kernel/cpu/mce/core.c b/arch/x86/kernel/cpu/mce/core.c | ||
1603 | index fd76e3733dd3d..92331de16d70e 100644 | ||
1604 | --- a/arch/x86/kernel/cpu/mce/core.c | ||
1605 | +++ b/arch/x86/kernel/cpu/mce/core.c | ||
1606 | @@ -388,10 +388,28 @@ static int msr_to_offset(u32 msr) | ||
1607 | return -1; | ||
1608 | } | ||
1609 | |||
1610 | +__visible bool ex_handler_rdmsr_fault(const struct exception_table_entry *fixup, | ||
1611 | + struct pt_regs *regs, int trapnr, | ||
1612 | + unsigned long error_code, | ||
1613 | + unsigned long fault_addr) | ||
1614 | +{ | ||
1615 | + pr_emerg("MSR access error: RDMSR from 0x%x at rIP: 0x%lx (%pS)\n", | ||
1616 | + (unsigned int)regs->cx, regs->ip, (void *)regs->ip); | ||
1617 | + | ||
1618 | + show_stack_regs(regs); | ||
1619 | + | ||
1620 | + panic("MCA architectural violation!\n"); | ||
1621 | + | ||
1622 | + while (true) | ||
1623 | + cpu_relax(); | ||
1624 | + | ||
1625 | + return true; | ||
1626 | +} | ||
1627 | + | ||
1628 | /* MSR access wrappers used for error injection */ | ||
1629 | static u64 mce_rdmsrl(u32 msr) | ||
1630 | { | ||
1631 | - u64 v; | ||
1632 | + DECLARE_ARGS(val, low, high); | ||
1633 | |||
1634 | if (__this_cpu_read(injectm.finished)) { | ||
1635 | int offset = msr_to_offset(msr); | ||
1636 | @@ -401,21 +419,43 @@ static u64 mce_rdmsrl(u32 msr) | ||
1637 | return *(u64 *)((char *)this_cpu_ptr(&injectm) + offset); | ||
1638 | } | ||
1639 | |||
1640 | - if (rdmsrl_safe(msr, &v)) { | ||
1641 | - WARN_ONCE(1, "mce: Unable to read MSR 0x%x!\n", msr); | ||
1642 | - /* | ||
1643 | - * Return zero in case the access faulted. This should | ||
1644 | - * not happen normally but can happen if the CPU does | ||
1645 | - * something weird, or if the code is buggy. | ||
1646 | - */ | ||
1647 | - v = 0; | ||
1648 | - } | ||
1649 | + /* | ||
1650 | + * RDMSR on MCA MSRs should not fault. If they do, this is very much an | ||
1651 | + * architectural violation and needs to be reported to hw vendor. Panic | ||
1652 | + * the box to not allow any further progress. | ||
1653 | + */ | ||
1654 | + asm volatile("1: rdmsr\n" | ||
1655 | + "2:\n" | ||
1656 | + _ASM_EXTABLE_HANDLE(1b, 2b, ex_handler_rdmsr_fault) | ||
1657 | + : EAX_EDX_RET(val, low, high) : "c" (msr)); | ||
1658 | |||
1659 | - return v; | ||
1660 | + | ||
1661 | + return EAX_EDX_VAL(val, low, high); | ||
1662 | +} | ||
1663 | + | ||
1664 | +__visible bool ex_handler_wrmsr_fault(const struct exception_table_entry *fixup, | ||
1665 | + struct pt_regs *regs, int trapnr, | ||
1666 | + unsigned long error_code, | ||
1667 | + unsigned long fault_addr) | ||
1668 | +{ | ||
1669 | + pr_emerg("MSR access error: WRMSR to 0x%x (tried to write 0x%08x%08x) at rIP: 0x%lx (%pS)\n", | ||
1670 | + (unsigned int)regs->cx, (unsigned int)regs->dx, (unsigned int)regs->ax, | ||
1671 | + regs->ip, (void *)regs->ip); | ||
1672 | + | ||
1673 | + show_stack_regs(regs); | ||
1674 | + | ||
1675 | + panic("MCA architectural violation!\n"); | ||
1676 | + | ||
1677 | + while (true) | ||
1678 | + cpu_relax(); | ||
1679 | + | ||
1680 | + return true; | ||
1681 | } | ||
1682 | |||
1683 | static void mce_wrmsrl(u32 msr, u64 v) | ||
1684 | { | ||
1685 | + u32 low, high; | ||
1686 | + | ||
1687 | if (__this_cpu_read(injectm.finished)) { | ||
1688 | int offset = msr_to_offset(msr); | ||
1689 | |||
1690 | @@ -423,7 +463,15 @@ static void mce_wrmsrl(u32 msr, u64 v) | ||
1691 | *(u64 *)((char *)this_cpu_ptr(&injectm) + offset) = v; | ||
1692 | return; | ||
1693 | } | ||
1694 | - wrmsrl(msr, v); | ||
1695 | + | ||
1696 | + low = (u32)v; | ||
1697 | + high = (u32)(v >> 32); | ||
1698 | + | ||
1699 | + /* See comment in mce_rdmsrl() */ | ||
1700 | + asm volatile("1: wrmsr\n" | ||
1701 | + "2:\n" | ||
1702 | + _ASM_EXTABLE_HANDLE(1b, 2b, ex_handler_wrmsr_fault) | ||
1703 | + : : "c" (msr), "a"(low), "d" (high) : "memory"); | ||
1704 | } | ||
1705 | |||
1706 | /* | ||
1707 | diff --git a/arch/x86/kernel/cpu/mce/internal.h b/arch/x86/kernel/cpu/mce/internal.h | ||
1708 | index 43031db429d24..231954fe5b4e6 100644 | ||
1709 | --- a/arch/x86/kernel/cpu/mce/internal.h | ||
1710 | +++ b/arch/x86/kernel/cpu/mce/internal.h | ||
1711 | @@ -172,4 +172,14 @@ extern bool amd_filter_mce(struct mce *m); | ||
1712 | static inline bool amd_filter_mce(struct mce *m) { return false; }; | ||
1713 | #endif | ||
1714 | |||
1715 | +__visible bool ex_handler_rdmsr_fault(const struct exception_table_entry *fixup, | ||
1716 | + struct pt_regs *regs, int trapnr, | ||
1717 | + unsigned long error_code, | ||
1718 | + unsigned long fault_addr); | ||
1719 | + | ||
1720 | +__visible bool ex_handler_wrmsr_fault(const struct exception_table_entry *fixup, | ||
1721 | + struct pt_regs *regs, int trapnr, | ||
1722 | + unsigned long error_code, | ||
1723 | + unsigned long fault_addr); | ||
1724 | + | ||
1725 | #endif /* __X86_MCE_INTERNAL_H__ */ | ||
1726 | diff --git a/arch/x86/kernel/cpu/mce/severity.c b/arch/x86/kernel/cpu/mce/severity.c | ||
1727 | index 87bcdc6dc2f0c..0d09eb13743b4 100644 | ||
1728 | --- a/arch/x86/kernel/cpu/mce/severity.c | ||
1729 | +++ b/arch/x86/kernel/cpu/mce/severity.c | ||
1730 | @@ -9,9 +9,11 @@ | ||
1731 | #include <linux/seq_file.h> | ||
1732 | #include <linux/init.h> | ||
1733 | #include <linux/debugfs.h> | ||
1734 | -#include <asm/mce.h> | ||
1735 | #include <linux/uaccess.h> | ||
1736 | |||
1737 | +#include <asm/mce.h> | ||
1738 | +#include <asm/intel-family.h> | ||
1739 | + | ||
1740 | #include "internal.h" | ||
1741 | |||
1742 | /* | ||
1743 | @@ -40,9 +42,14 @@ static struct severity { | ||
1744 | unsigned char context; | ||
1745 | unsigned char excp; | ||
1746 | unsigned char covered; | ||
1747 | + unsigned char cpu_model; | ||
1748 | + unsigned char cpu_minstepping; | ||
1749 | + unsigned char bank_lo, bank_hi; | ||
1750 | char *msg; | ||
1751 | } severities[] = { | ||
1752 | #define MCESEV(s, m, c...) { .sev = MCE_ ## s ## _SEVERITY, .msg = m, ## c } | ||
1753 | +#define BANK_RANGE(l, h) .bank_lo = l, .bank_hi = h | ||
1754 | +#define MODEL_STEPPING(m, s) .cpu_model = m, .cpu_minstepping = s | ||
1755 | #define KERNEL .context = IN_KERNEL | ||
1756 | #define USER .context = IN_USER | ||
1757 | #define KERNEL_RECOV .context = IN_KERNEL_RECOV | ||
1758 | @@ -97,7 +104,6 @@ static struct severity { | ||
1759 | KEEP, "Corrected error", | ||
1760 | NOSER, BITCLR(MCI_STATUS_UC) | ||
1761 | ), | ||
1762 | - | ||
1763 | /* | ||
1764 | * known AO MCACODs reported via MCE or CMC: | ||
1765 | * | ||
1766 | @@ -113,6 +119,18 @@ static struct severity { | ||
1767 | AO, "Action optional: last level cache writeback error", | ||
1768 | SER, MASK(MCI_UC_AR|MCACOD, MCI_STATUS_UC|MCACOD_L3WB) | ||
1769 | ), | ||
1770 | + /* | ||
1771 | + * Quirk for Skylake/Cascade Lake. Patrol scrubber may be configured | ||
1772 | + * to report uncorrected errors using CMCI with a special signature. | ||
1773 | + * UC=0, MSCOD=0x0010, MCACOD=binary(000X 0000 1100 XXXX) reported | ||
1774 | + * in one of the memory controller banks. | ||
1775 | + * Set severity to "AO" for same action as normal patrol scrub error. | ||
1776 | + */ | ||
1777 | + MCESEV( | ||
1778 | + AO, "Uncorrected Patrol Scrub Error", | ||
1779 | + SER, MASK(MCI_STATUS_UC|MCI_ADDR|0xffffeff0, MCI_ADDR|0x001000c0), | ||
1780 | + MODEL_STEPPING(INTEL_FAM6_SKYLAKE_X, 4), BANK_RANGE(13, 18) | ||
1781 | + ), | ||
1782 | |||
1783 | /* ignore OVER for UCNA */ | ||
1784 | MCESEV( | ||
1785 | @@ -320,6 +338,12 @@ static int mce_severity_intel(struct mce *m, int tolerant, char **msg, bool is_e | ||
1786 | continue; | ||
1787 | if (s->excp && excp != s->excp) | ||
1788 | continue; | ||
1789 | + if (s->cpu_model && boot_cpu_data.x86_model != s->cpu_model) | ||
1790 | + continue; | ||
1791 | + if (s->cpu_minstepping && boot_cpu_data.x86_stepping < s->cpu_minstepping) | ||
1792 | + continue; | ||
1793 | + if (s->bank_lo && (m->bank < s->bank_lo || m->bank > s->bank_hi)) | ||
1794 | + continue; | ||
1795 | if (msg) | ||
1796 | *msg = s->msg; | ||
1797 | s->covered = 1; | ||
1798 | diff --git a/arch/x86/kernel/fpu/init.c b/arch/x86/kernel/fpu/init.c | ||
1799 | index 6ce7e0a23268f..b271da0fa2193 100644 | ||
1800 | --- a/arch/x86/kernel/fpu/init.c | ||
1801 | +++ b/arch/x86/kernel/fpu/init.c | ||
1802 | @@ -242,9 +242,9 @@ static void __init fpu__init_system_ctx_switch(void) | ||
1803 | */ | ||
1804 | static void __init fpu__init_parse_early_param(void) | ||
1805 | { | ||
1806 | - char arg[32]; | ||
1807 | + char arg[128]; | ||
1808 | char *argptr = arg; | ||
1809 | - int bit; | ||
1810 | + int arglen, res, bit; | ||
1811 | |||
1812 | #ifdef CONFIG_X86_32 | ||
1813 | if (cmdline_find_option_bool(boot_command_line, "no387")) | ||
1814 | @@ -267,12 +267,26 @@ static void __init fpu__init_parse_early_param(void) | ||
1815 | if (cmdline_find_option_bool(boot_command_line, "noxsaves")) | ||
1816 | setup_clear_cpu_cap(X86_FEATURE_XSAVES); | ||
1817 | |||
1818 | - if (cmdline_find_option(boot_command_line, "clearcpuid", arg, | ||
1819 | - sizeof(arg)) && | ||
1820 | - get_option(&argptr, &bit) && | ||
1821 | - bit >= 0 && | ||
1822 | - bit < NCAPINTS * 32) | ||
1823 | - setup_clear_cpu_cap(bit); | ||
1824 | + arglen = cmdline_find_option(boot_command_line, "clearcpuid", arg, sizeof(arg)); | ||
1825 | + if (arglen <= 0) | ||
1826 | + return; | ||
1827 | + | ||
1828 | + pr_info("Clearing CPUID bits:"); | ||
1829 | + do { | ||
1830 | + res = get_option(&argptr, &bit); | ||
1831 | + if (res == 0 || res == 3) | ||
1832 | + break; | ||
1833 | + | ||
1834 | + /* If the argument was too long, the last bit may be cut off */ | ||
1835 | + if (res == 1 && arglen >= sizeof(arg)) | ||
1836 | + break; | ||
1837 | + | ||
1838 | + if (bit >= 0 && bit < NCAPINTS * 32) { | ||
1839 | + pr_cont(" " X86_CAP_FMT, x86_cap_flag(bit)); | ||
1840 | + setup_clear_cpu_cap(bit); | ||
1841 | + } | ||
1842 | + } while (res == 2); | ||
1843 | + pr_cont("\n"); | ||
1844 | } | ||
1845 | |||
1846 | /* | ||
1847 | diff --git a/arch/x86/kernel/nmi.c b/arch/x86/kernel/nmi.c | ||
1848 | index 54c21d6abd5ac..5bb001c0c771a 100644 | ||
1849 | --- a/arch/x86/kernel/nmi.c | ||
1850 | +++ b/arch/x86/kernel/nmi.c | ||
1851 | @@ -106,7 +106,6 @@ fs_initcall(nmi_warning_debugfs); | ||
1852 | |||
1853 | static void nmi_check_duration(struct nmiaction *action, u64 duration) | ||
1854 | { | ||
1855 | - u64 whole_msecs = READ_ONCE(action->max_duration); | ||
1856 | int remainder_ns, decimal_msecs; | ||
1857 | |||
1858 | if (duration < nmi_longest_ns || duration < action->max_duration) | ||
1859 | @@ -114,12 +113,12 @@ static void nmi_check_duration(struct nmiaction *action, u64 duration) | ||
1860 | |||
1861 | action->max_duration = duration; | ||
1862 | |||
1863 | - remainder_ns = do_div(whole_msecs, (1000 * 1000)); | ||
1864 | + remainder_ns = do_div(duration, (1000 * 1000)); | ||
1865 | decimal_msecs = remainder_ns / 1000; | ||
1866 | |||
1867 | printk_ratelimited(KERN_INFO | ||
1868 | "INFO: NMI handler (%ps) took too long to run: %lld.%03d msecs\n", | ||
1869 | - action->handler, whole_msecs, decimal_msecs); | ||
1870 | + action->handler, duration, decimal_msecs); | ||
1871 | } | ||
1872 | |||
1873 | static int nmi_handle(unsigned int type, struct pt_regs *regs) | ||
1874 | diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c | ||
1875 | index cc7823e7ef96c..484c32b7f79ff 100644 | ||
1876 | --- a/arch/x86/kvm/emulate.c | ||
1877 | +++ b/arch/x86/kvm/emulate.c | ||
1878 | @@ -3617,7 +3617,7 @@ static int em_rdpid(struct x86_emulate_ctxt *ctxt) | ||
1879 | u64 tsc_aux = 0; | ||
1880 | |||
1881 | if (ctxt->ops->get_msr(ctxt, MSR_TSC_AUX, &tsc_aux)) | ||
1882 | - return emulate_gp(ctxt, 0); | ||
1883 | + return emulate_ud(ctxt); | ||
1884 | ctxt->dst.val = tsc_aux; | ||
1885 | return X86EMUL_CONTINUE; | ||
1886 | } | ||
1887 | diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c | ||
1888 | index bb743f956c232..b90e8fd2f6ced 100644 | ||
1889 | --- a/arch/x86/kvm/mmu.c | ||
1890 | +++ b/arch/x86/kvm/mmu.c | ||
1891 | @@ -6453,6 +6453,7 @@ static void kvm_recover_nx_lpages(struct kvm *kvm) | ||
1892 | cond_resched_lock(&kvm->mmu_lock); | ||
1893 | } | ||
1894 | } | ||
1895 | + kvm_mmu_commit_zap_page(kvm, &invalid_list); | ||
1896 | |||
1897 | spin_unlock(&kvm->mmu_lock); | ||
1898 | srcu_read_unlock(&kvm->srcu, rcu_idx); | ||
1899 | diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c | ||
1900 | index b58495fde2e89..c79c1a07f44b9 100644 | ||
1901 | --- a/arch/x86/kvm/svm.c | ||
1902 | +++ b/arch/x86/kvm/svm.c | ||
1903 | @@ -5383,6 +5383,7 @@ static int svm_update_pi_irte(struct kvm *kvm, unsigned int host_irq, | ||
1904 | * - Tell IOMMU to use legacy mode for this interrupt. | ||
1905 | * - Retrieve ga_tag of prior interrupt remapping data. | ||
1906 | */ | ||
1907 | + pi.prev_ga_tag = 0; | ||
1908 | pi.is_guest_mode = false; | ||
1909 | ret = irq_set_vcpu_affinity(host_irq, &pi); | ||
1910 | |||
1911 | diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c | ||
1912 | index a460ddf04d60c..08e1e7544f823 100644 | ||
1913 | --- a/arch/x86/kvm/vmx/nested.c | ||
1914 | +++ b/arch/x86/kvm/vmx/nested.c | ||
1915 | @@ -2231,6 +2231,8 @@ static void prepare_vmcs02_rare(struct vcpu_vmx *vmx, struct vmcs12 *vmcs12) | ||
1916 | vmcs_writel(GUEST_TR_BASE, vmcs12->guest_tr_base); | ||
1917 | vmcs_writel(GUEST_GDTR_BASE, vmcs12->guest_gdtr_base); | ||
1918 | vmcs_writel(GUEST_IDTR_BASE, vmcs12->guest_idtr_base); | ||
1919 | + | ||
1920 | + vmx->segment_cache.bitmask = 0; | ||
1921 | } | ||
1922 | |||
1923 | if (!hv_evmcs || !(hv_evmcs->hv_clean_fields & | ||
1924 | @@ -3094,8 +3096,10 @@ enum nvmx_vmentry_status nested_vmx_enter_non_root_mode(struct kvm_vcpu *vcpu, | ||
1925 | prepare_vmcs02_early(vmx, vmcs12); | ||
1926 | |||
1927 | if (from_vmentry) { | ||
1928 | - if (unlikely(!nested_get_vmcs12_pages(vcpu))) | ||
1929 | + if (unlikely(!nested_get_vmcs12_pages(vcpu))) { | ||
1930 | + vmx_switch_vmcs(vcpu, &vmx->vmcs01); | ||
1931 | return NVMX_VMENTRY_KVM_INTERNAL_ERROR; | ||
1932 | + } | ||
1933 | |||
1934 | if (nested_vmx_check_vmentry_hw(vcpu)) { | ||
1935 | vmx_switch_vmcs(vcpu, &vmx->vmcs01); | ||
1936 | diff --git a/block/blk-core.c b/block/blk-core.c | ||
1937 | index 81aafb601df06..d2213220099d3 100644 | ||
1938 | --- a/block/blk-core.c | ||
1939 | +++ b/block/blk-core.c | ||
1940 | @@ -743,11 +743,10 @@ static void handle_bad_sector(struct bio *bio, sector_t maxsector) | ||
1941 | { | ||
1942 | char b[BDEVNAME_SIZE]; | ||
1943 | |||
1944 | - printk(KERN_INFO "attempt to access beyond end of device\n"); | ||
1945 | - printk(KERN_INFO "%s: rw=%d, want=%Lu, limit=%Lu\n", | ||
1946 | - bio_devname(bio, b), bio->bi_opf, | ||
1947 | - (unsigned long long)bio_end_sector(bio), | ||
1948 | - (long long)maxsector); | ||
1949 | + pr_info_ratelimited("attempt to access beyond end of device\n" | ||
1950 | + "%s: rw=%d, want=%llu, limit=%llu\n", | ||
1951 | + bio_devname(bio, b), bio->bi_opf, | ||
1952 | + bio_end_sector(bio), maxsector); | ||
1953 | } | ||
1954 | |||
1955 | #ifdef CONFIG_FAIL_MAKE_REQUEST | ||
1956 | diff --git a/block/blk-mq-sysfs.c b/block/blk-mq-sysfs.c | ||
1957 | index a09ab0c3d074d..5dafd7a8ec913 100644 | ||
1958 | --- a/block/blk-mq-sysfs.c | ||
1959 | +++ b/block/blk-mq-sysfs.c | ||
1960 | @@ -36,8 +36,6 @@ static void blk_mq_hw_sysfs_release(struct kobject *kobj) | ||
1961 | struct blk_mq_hw_ctx *hctx = container_of(kobj, struct blk_mq_hw_ctx, | ||
1962 | kobj); | ||
1963 | |||
1964 | - cancel_delayed_work_sync(&hctx->run_work); | ||
1965 | - | ||
1966 | if (hctx->flags & BLK_MQ_F_BLOCKING) | ||
1967 | cleanup_srcu_struct(hctx->srcu); | ||
1968 | blk_free_flush_queue(hctx->fq); | ||
1969 | diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c | ||
1970 | index 46f5198be0173..bf33570da5ac7 100644 | ||
1971 | --- a/block/blk-sysfs.c | ||
1972 | +++ b/block/blk-sysfs.c | ||
1973 | @@ -891,9 +891,16 @@ static void __blk_release_queue(struct work_struct *work) | ||
1974 | |||
1975 | blk_free_queue_stats(q->stats); | ||
1976 | |||
1977 | - if (queue_is_mq(q)) | ||
1978 | + if (queue_is_mq(q)) { | ||
1979 | + struct blk_mq_hw_ctx *hctx; | ||
1980 | + int i; | ||
1981 | + | ||
1982 | cancel_delayed_work_sync(&q->requeue_work); | ||
1983 | |||
1984 | + queue_for_each_hw_ctx(q, hctx, i) | ||
1985 | + cancel_delayed_work_sync(&hctx->run_work); | ||
1986 | + } | ||
1987 | + | ||
1988 | blk_exit_queue(q); | ||
1989 | |||
1990 | blk_queue_free_zone_bitmaps(q); | ||
1991 | diff --git a/crypto/algif_aead.c b/crypto/algif_aead.c | ||
1992 | index 43c6aa784858b..e62d735ed2660 100644 | ||
1993 | --- a/crypto/algif_aead.c | ||
1994 | +++ b/crypto/algif_aead.c | ||
1995 | @@ -78,7 +78,7 @@ static int crypto_aead_copy_sgl(struct crypto_sync_skcipher *null_tfm, | ||
1996 | SYNC_SKCIPHER_REQUEST_ON_STACK(skreq, null_tfm); | ||
1997 | |||
1998 | skcipher_request_set_sync_tfm(skreq, null_tfm); | ||
1999 | - skcipher_request_set_callback(skreq, CRYPTO_TFM_REQ_MAY_BACKLOG, | ||
2000 | + skcipher_request_set_callback(skreq, CRYPTO_TFM_REQ_MAY_SLEEP, | ||
2001 | NULL, NULL); | ||
2002 | skcipher_request_set_crypt(skreq, src, dst, len, NULL); | ||
2003 | |||
2004 | @@ -291,19 +291,20 @@ static int _aead_recvmsg(struct socket *sock, struct msghdr *msg, | ||
2005 | areq->outlen = outlen; | ||
2006 | |||
2007 | aead_request_set_callback(&areq->cra_u.aead_req, | ||
2008 | - CRYPTO_TFM_REQ_MAY_BACKLOG, | ||
2009 | + CRYPTO_TFM_REQ_MAY_SLEEP, | ||
2010 | af_alg_async_cb, areq); | ||
2011 | err = ctx->enc ? crypto_aead_encrypt(&areq->cra_u.aead_req) : | ||
2012 | crypto_aead_decrypt(&areq->cra_u.aead_req); | ||
2013 | |||
2014 | /* AIO operation in progress */ | ||
2015 | - if (err == -EINPROGRESS || err == -EBUSY) | ||
2016 | + if (err == -EINPROGRESS) | ||
2017 | return -EIOCBQUEUED; | ||
2018 | |||
2019 | sock_put(sk); | ||
2020 | } else { | ||
2021 | /* Synchronous operation */ | ||
2022 | aead_request_set_callback(&areq->cra_u.aead_req, | ||
2023 | + CRYPTO_TFM_REQ_MAY_SLEEP | | ||
2024 | CRYPTO_TFM_REQ_MAY_BACKLOG, | ||
2025 | crypto_req_done, &ctx->wait); | ||
2026 | err = crypto_wait_req(ctx->enc ? | ||
2027 | diff --git a/crypto/algif_skcipher.c b/crypto/algif_skcipher.c | ||
2028 | index 81c4022285a7c..30069a92a9b22 100644 | ||
2029 | --- a/crypto/algif_skcipher.c | ||
2030 | +++ b/crypto/algif_skcipher.c | ||
2031 | @@ -123,7 +123,7 @@ static int _skcipher_recvmsg(struct socket *sock, struct msghdr *msg, | ||
2032 | crypto_skcipher_decrypt(&areq->cra_u.skcipher_req); | ||
2033 | |||
2034 | /* AIO operation in progress */ | ||
2035 | - if (err == -EINPROGRESS || err == -EBUSY) | ||
2036 | + if (err == -EINPROGRESS) | ||
2037 | return -EIOCBQUEUED; | ||
2038 | |||
2039 | sock_put(sk); | ||
2040 | diff --git a/drivers/android/binder.c b/drivers/android/binder.c | ||
2041 | index 110dd4c2977f5..b62b1ab6bb699 100644 | ||
2042 | --- a/drivers/android/binder.c | ||
2043 | +++ b/drivers/android/binder.c | ||
2044 | @@ -227,7 +227,7 @@ static struct binder_transaction_log_entry *binder_transaction_log_add( | ||
2045 | struct binder_work { | ||
2046 | struct list_head entry; | ||
2047 | |||
2048 | - enum { | ||
2049 | + enum binder_work_type { | ||
2050 | BINDER_WORK_TRANSACTION = 1, | ||
2051 | BINDER_WORK_TRANSACTION_COMPLETE, | ||
2052 | BINDER_WORK_RETURN_ERROR, | ||
2053 | @@ -889,27 +889,6 @@ static struct binder_work *binder_dequeue_work_head_ilocked( | ||
2054 | return w; | ||
2055 | } | ||
2056 | |||
2057 | -/** | ||
2058 | - * binder_dequeue_work_head() - Dequeues the item at head of list | ||
2059 | - * @proc: binder_proc associated with list | ||
2060 | - * @list: list to dequeue head | ||
2061 | - * | ||
2062 | - * Removes the head of the list if there are items on the list | ||
2063 | - * | ||
2064 | - * Return: pointer dequeued binder_work, NULL if list was empty | ||
2065 | - */ | ||
2066 | -static struct binder_work *binder_dequeue_work_head( | ||
2067 | - struct binder_proc *proc, | ||
2068 | - struct list_head *list) | ||
2069 | -{ | ||
2070 | - struct binder_work *w; | ||
2071 | - | ||
2072 | - binder_inner_proc_lock(proc); | ||
2073 | - w = binder_dequeue_work_head_ilocked(list); | ||
2074 | - binder_inner_proc_unlock(proc); | ||
2075 | - return w; | ||
2076 | -} | ||
2077 | - | ||
2078 | static void | ||
2079 | binder_defer_work(struct binder_proc *proc, enum binder_deferred_state defer); | ||
2080 | static void binder_free_thread(struct binder_thread *thread); | ||
2081 | @@ -2347,8 +2326,6 @@ static void binder_transaction_buffer_release(struct binder_proc *proc, | ||
2082 | * file is done when the transaction is torn | ||
2083 | * down. | ||
2084 | */ | ||
2085 | - WARN_ON(failed_at && | ||
2086 | - proc->tsk == current->group_leader); | ||
2087 | } break; | ||
2088 | case BINDER_TYPE_PTR: | ||
2089 | /* | ||
2090 | @@ -4591,13 +4568,17 @@ static void binder_release_work(struct binder_proc *proc, | ||
2091 | struct list_head *list) | ||
2092 | { | ||
2093 | struct binder_work *w; | ||
2094 | + enum binder_work_type wtype; | ||
2095 | |||
2096 | while (1) { | ||
2097 | - w = binder_dequeue_work_head(proc, list); | ||
2098 | + binder_inner_proc_lock(proc); | ||
2099 | + w = binder_dequeue_work_head_ilocked(list); | ||
2100 | + wtype = w ? w->type : 0; | ||
2101 | + binder_inner_proc_unlock(proc); | ||
2102 | if (!w) | ||
2103 | return; | ||
2104 | |||
2105 | - switch (w->type) { | ||
2106 | + switch (wtype) { | ||
2107 | case BINDER_WORK_TRANSACTION: { | ||
2108 | struct binder_transaction *t; | ||
2109 | |||
2110 | @@ -4631,9 +4612,11 @@ static void binder_release_work(struct binder_proc *proc, | ||
2111 | kfree(death); | ||
2112 | binder_stats_deleted(BINDER_STAT_DEATH); | ||
2113 | } break; | ||
2114 | + case BINDER_WORK_NODE: | ||
2115 | + break; | ||
2116 | default: | ||
2117 | pr_err("unexpected work type, %d, not freed\n", | ||
2118 | - w->type); | ||
2119 | + wtype); | ||
2120 | break; | ||
2121 | } | ||
2122 | } | ||
2123 | diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c | ||
2124 | index f3f0529564da0..b326eeddaadf0 100644 | ||
2125 | --- a/drivers/bluetooth/btusb.c | ||
2126 | +++ b/drivers/bluetooth/btusb.c | ||
2127 | @@ -2664,6 +2664,7 @@ static int btusb_mtk_submit_wmt_recv_urb(struct hci_dev *hdev) | ||
2128 | buf = kmalloc(size, GFP_KERNEL); | ||
2129 | if (!buf) { | ||
2130 | kfree(dr); | ||
2131 | + usb_free_urb(urb); | ||
2132 | return -ENOMEM; | ||
2133 | } | ||
2134 | |||
2135 | diff --git a/drivers/bluetooth/hci_ldisc.c b/drivers/bluetooth/hci_ldisc.c | ||
2136 | index 85a30fb9177bb..f83d67eafc9f0 100644 | ||
2137 | --- a/drivers/bluetooth/hci_ldisc.c | ||
2138 | +++ b/drivers/bluetooth/hci_ldisc.c | ||
2139 | @@ -538,6 +538,7 @@ static void hci_uart_tty_close(struct tty_struct *tty) | ||
2140 | clear_bit(HCI_UART_PROTO_READY, &hu->flags); | ||
2141 | percpu_up_write(&hu->proto_lock); | ||
2142 | |||
2143 | + cancel_work_sync(&hu->init_ready); | ||
2144 | cancel_work_sync(&hu->write_work); | ||
2145 | |||
2146 | if (hdev) { | ||
2147 | diff --git a/drivers/bluetooth/hci_serdev.c b/drivers/bluetooth/hci_serdev.c | ||
2148 | index ad2f26cb2622e..5b9aa73ff2b7f 100644 | ||
2149 | --- a/drivers/bluetooth/hci_serdev.c | ||
2150 | +++ b/drivers/bluetooth/hci_serdev.c | ||
2151 | @@ -357,6 +357,8 @@ void hci_uart_unregister_device(struct hci_uart *hu) | ||
2152 | struct hci_dev *hdev = hu->hdev; | ||
2153 | |||
2154 | clear_bit(HCI_UART_PROTO_READY, &hu->flags); | ||
2155 | + | ||
2156 | + cancel_work_sync(&hu->init_ready); | ||
2157 | if (test_bit(HCI_UART_REGISTERED, &hu->flags)) | ||
2158 | hci_unregister_dev(hdev); | ||
2159 | hci_free_dev(hdev); | ||
2160 | diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c | ||
2161 | index 6b9a0593d2eb7..b6e7df9e88503 100644 | ||
2162 | --- a/drivers/char/ipmi/ipmi_si_intf.c | ||
2163 | +++ b/drivers/char/ipmi/ipmi_si_intf.c | ||
2164 | @@ -1977,7 +1977,7 @@ static int try_smi_init(struct smi_info *new_smi) | ||
2165 | /* Do this early so it's available for logs. */ | ||
2166 | if (!new_smi->io.dev) { | ||
2167 | pr_err("IPMI interface added with no device\n"); | ||
2168 | - rv = EIO; | ||
2169 | + rv = -EIO; | ||
2170 | goto out_err; | ||
2171 | } | ||
2172 | |||
2173 | diff --git a/drivers/clk/at91/clk-main.c b/drivers/clk/at91/clk-main.c | ||
2174 | index 37c22667e8319..4313ecb2af5b2 100644 | ||
2175 | --- a/drivers/clk/at91/clk-main.c | ||
2176 | +++ b/drivers/clk/at91/clk-main.c | ||
2177 | @@ -437,12 +437,17 @@ static int clk_sam9x5_main_set_parent(struct clk_hw *hw, u8 index) | ||
2178 | return -EINVAL; | ||
2179 | |||
2180 | regmap_read(regmap, AT91_CKGR_MOR, &tmp); | ||
2181 | - tmp &= ~MOR_KEY_MASK; | ||
2182 | |||
2183 | if (index && !(tmp & AT91_PMC_MOSCSEL)) | ||
2184 | - regmap_write(regmap, AT91_CKGR_MOR, tmp | AT91_PMC_MOSCSEL); | ||
2185 | + tmp = AT91_PMC_MOSCSEL; | ||
2186 | else if (!index && (tmp & AT91_PMC_MOSCSEL)) | ||
2187 | - regmap_write(regmap, AT91_CKGR_MOR, tmp & ~AT91_PMC_MOSCSEL); | ||
2188 | + tmp = 0; | ||
2189 | + else | ||
2190 | + return 0; | ||
2191 | + | ||
2192 | + regmap_update_bits(regmap, AT91_CKGR_MOR, | ||
2193 | + AT91_PMC_MOSCSEL | MOR_KEY_MASK, | ||
2194 | + tmp | AT91_PMC_KEY); | ||
2195 | |||
2196 | while (!clk_sam9x5_main_ready(regmap)) | ||
2197 | cpu_relax(); | ||
2198 | diff --git a/drivers/clk/bcm/clk-bcm2835.c b/drivers/clk/bcm/clk-bcm2835.c | ||
2199 | index 45420b514149f..c5486537b9284 100644 | ||
2200 | --- a/drivers/clk/bcm/clk-bcm2835.c | ||
2201 | +++ b/drivers/clk/bcm/clk-bcm2835.c | ||
2202 | @@ -1336,8 +1336,10 @@ static struct clk_hw *bcm2835_register_pll(struct bcm2835_cprman *cprman, | ||
2203 | pll->hw.init = &init; | ||
2204 | |||
2205 | ret = devm_clk_hw_register(cprman->dev, &pll->hw); | ||
2206 | - if (ret) | ||
2207 | + if (ret) { | ||
2208 | + kfree(pll); | ||
2209 | return NULL; | ||
2210 | + } | ||
2211 | return &pll->hw; | ||
2212 | } | ||
2213 | |||
2214 | diff --git a/drivers/clk/imx/clk-imx8mq.c b/drivers/clk/imx/clk-imx8mq.c | ||
2215 | index 41fc9c63356ea..1846bd879dd71 100644 | ||
2216 | --- a/drivers/clk/imx/clk-imx8mq.c | ||
2217 | +++ b/drivers/clk/imx/clk-imx8mq.c | ||
2218 | @@ -157,10 +157,10 @@ static const char * const imx8mq_qspi_sels[] = {"osc_25m", "sys1_pll_400m", "sys | ||
2219 | "audio_pll2_out", "sys1_pll_266m", "sys3_pll_out", "sys1_pll_100m", }; | ||
2220 | |||
2221 | static const char * const imx8mq_usdhc1_sels[] = {"osc_25m", "sys1_pll_400m", "sys1_pll_800m", "sys2_pll_500m", | ||
2222 | - "audio_pll2_out", "sys1_pll_266m", "sys3_pll_out", "sys1_pll_100m", }; | ||
2223 | + "sys3_pll_out", "sys1_pll_266m", "audio_pll2_out", "sys1_pll_100m", }; | ||
2224 | |||
2225 | static const char * const imx8mq_usdhc2_sels[] = {"osc_25m", "sys1_pll_400m", "sys1_pll_800m", "sys2_pll_500m", | ||
2226 | - "audio_pll2_out", "sys1_pll_266m", "sys3_pll_out", "sys1_pll_100m", }; | ||
2227 | + "sys3_pll_out", "sys1_pll_266m", "audio_pll2_out", "sys1_pll_100m", }; | ||
2228 | |||
2229 | static const char * const imx8mq_i2c1_sels[] = {"osc_25m", "sys1_pll_160m", "sys2_pll_50m", "sys3_pll_out", "audio_pll1_out", | ||
2230 | "video_pll1_out", "audio_pll2_out", "sys1_pll_133m", }; | ||
2231 | diff --git a/drivers/clk/keystone/sci-clk.c b/drivers/clk/keystone/sci-clk.c | ||
2232 | index 7edf8c8432b67..64ea895f1a7df 100644 | ||
2233 | --- a/drivers/clk/keystone/sci-clk.c | ||
2234 | +++ b/drivers/clk/keystone/sci-clk.c | ||
2235 | @@ -522,7 +522,7 @@ static int ti_sci_scan_clocks_from_dt(struct sci_clk_provider *provider) | ||
2236 | np = of_find_node_with_property(np, *clk_name); | ||
2237 | if (!np) { | ||
2238 | clk_name++; | ||
2239 | - break; | ||
2240 | + continue; | ||
2241 | } | ||
2242 | |||
2243 | if (!of_device_is_available(np)) | ||
2244 | diff --git a/drivers/clk/mediatek/clk-mt6779.c b/drivers/clk/mediatek/clk-mt6779.c | ||
2245 | index 608a9a6621a37..00920182bbe63 100644 | ||
2246 | --- a/drivers/clk/mediatek/clk-mt6779.c | ||
2247 | +++ b/drivers/clk/mediatek/clk-mt6779.c | ||
2248 | @@ -919,6 +919,8 @@ static const struct mtk_gate infra_clks[] = { | ||
2249 | "pwm_sel", 19), | ||
2250 | GATE_INFRA0(CLK_INFRA_PWM, "infra_pwm", | ||
2251 | "pwm_sel", 21), | ||
2252 | + GATE_INFRA0(CLK_INFRA_UART0, "infra_uart0", | ||
2253 | + "uart_sel", 22), | ||
2254 | GATE_INFRA0(CLK_INFRA_UART1, "infra_uart1", | ||
2255 | "uart_sel", 23), | ||
2256 | GATE_INFRA0(CLK_INFRA_UART2, "infra_uart2", | ||
2257 | diff --git a/drivers/clk/meson/g12a.c b/drivers/clk/meson/g12a.c | ||
2258 | index d2760a021301d..3143e16065de6 100644 | ||
2259 | --- a/drivers/clk/meson/g12a.c | ||
2260 | +++ b/drivers/clk/meson/g12a.c | ||
2261 | @@ -298,6 +298,17 @@ static struct clk_regmap g12a_fclk_div2 = { | ||
2262 | &g12a_fclk_div2_div.hw | ||
2263 | }, | ||
2264 | .num_parents = 1, | ||
2265 | + /* | ||
2266 | + * Similar to fclk_div3, it seems that this clock is used by | ||
2267 | + * the resident firmware and is required by the platform to | ||
2268 | + * operate correctly. | ||
2269 | + * Until the following condition are met, we need this clock to | ||
2270 | + * be marked as critical: | ||
2271 | + * a) Mark the clock used by a firmware resource, if possible | ||
2272 | + * b) CCF has a clock hand-off mechanism to make the sure the | ||
2273 | + * clock stays on until the proper driver comes along | ||
2274 | + */ | ||
2275 | + .flags = CLK_IS_CRITICAL, | ||
2276 | }, | ||
2277 | }; | ||
2278 | |||
2279 | diff --git a/drivers/clk/qcom/gcc-sdm660.c b/drivers/clk/qcom/gcc-sdm660.c | ||
2280 | index c6fb57cd576f5..aa5c0c6ead017 100644 | ||
2281 | --- a/drivers/clk/qcom/gcc-sdm660.c | ||
2282 | +++ b/drivers/clk/qcom/gcc-sdm660.c | ||
2283 | @@ -666,7 +666,7 @@ static struct clk_rcg2 hmss_rbcpr_clk_src = { | ||
2284 | .cmd_rcgr = 0x48044, | ||
2285 | .mnd_width = 0, | ||
2286 | .hid_width = 5, | ||
2287 | - .parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div, | ||
2288 | + .parent_map = gcc_parent_map_xo_gpll0, | ||
2289 | .freq_tbl = ftbl_hmss_rbcpr_clk_src, | ||
2290 | .clkr.hw.init = &(struct clk_init_data){ | ||
2291 | .name = "hmss_rbcpr_clk_src", | ||
2292 | diff --git a/drivers/clk/rockchip/clk-half-divider.c b/drivers/clk/rockchip/clk-half-divider.c | ||
2293 | index ba9f00dc9740c..7dd2e0b1a5866 100644 | ||
2294 | --- a/drivers/clk/rockchip/clk-half-divider.c | ||
2295 | +++ b/drivers/clk/rockchip/clk-half-divider.c | ||
2296 | @@ -167,7 +167,7 @@ struct clk *rockchip_clk_register_halfdiv(const char *name, | ||
2297 | unsigned long flags, | ||
2298 | spinlock_t *lock) | ||
2299 | { | ||
2300 | - struct clk *clk; | ||
2301 | + struct clk *clk = ERR_PTR(-ENOMEM); | ||
2302 | struct clk_mux *mux = NULL; | ||
2303 | struct clk_gate *gate = NULL; | ||
2304 | struct clk_divider *div = NULL; | ||
2305 | diff --git a/drivers/cpufreq/armada-37xx-cpufreq.c b/drivers/cpufreq/armada-37xx-cpufreq.c | ||
2306 | index df1c941260d14..b4af4094309b0 100644 | ||
2307 | --- a/drivers/cpufreq/armada-37xx-cpufreq.c | ||
2308 | +++ b/drivers/cpufreq/armada-37xx-cpufreq.c | ||
2309 | @@ -484,6 +484,12 @@ remove_opp: | ||
2310 | /* late_initcall, to guarantee the driver is loaded after A37xx clock driver */ | ||
2311 | late_initcall(armada37xx_cpufreq_driver_init); | ||
2312 | |||
2313 | +static const struct of_device_id __maybe_unused armada37xx_cpufreq_of_match[] = { | ||
2314 | + { .compatible = "marvell,armada-3700-nb-pm" }, | ||
2315 | + { }, | ||
2316 | +}; | ||
2317 | +MODULE_DEVICE_TABLE(of, armada37xx_cpufreq_of_match); | ||
2318 | + | ||
2319 | MODULE_AUTHOR("Gregory CLEMENT <gregory.clement@free-electrons.com>"); | ||
2320 | MODULE_DESCRIPTION("Armada 37xx cpufreq driver"); | ||
2321 | MODULE_LICENSE("GPL"); | ||
2322 | diff --git a/drivers/cpufreq/powernv-cpufreq.c b/drivers/cpufreq/powernv-cpufreq.c | ||
2323 | index 3a2f022f6bde2..bc6ccf2c7aae0 100644 | ||
2324 | --- a/drivers/cpufreq/powernv-cpufreq.c | ||
2325 | +++ b/drivers/cpufreq/powernv-cpufreq.c | ||
2326 | @@ -884,12 +884,15 @@ static int powernv_cpufreq_reboot_notifier(struct notifier_block *nb, | ||
2327 | unsigned long action, void *unused) | ||
2328 | { | ||
2329 | int cpu; | ||
2330 | - struct cpufreq_policy cpu_policy; | ||
2331 | + struct cpufreq_policy *cpu_policy; | ||
2332 | |||
2333 | rebooting = true; | ||
2334 | for_each_online_cpu(cpu) { | ||
2335 | - cpufreq_get_policy(&cpu_policy, cpu); | ||
2336 | - powernv_cpufreq_target_index(&cpu_policy, get_nominal_index()); | ||
2337 | + cpu_policy = cpufreq_cpu_get(cpu); | ||
2338 | + if (!cpu_policy) | ||
2339 | + continue; | ||
2340 | + powernv_cpufreq_target_index(cpu_policy, get_nominal_index()); | ||
2341 | + cpufreq_cpu_put(cpu_policy); | ||
2342 | } | ||
2343 | |||
2344 | return NOTIFY_DONE; | ||
2345 | diff --git a/drivers/crypto/caam/Kconfig b/drivers/crypto/caam/Kconfig | ||
2346 | index 137ed3df0c74d..9612da122ceba 100644 | ||
2347 | --- a/drivers/crypto/caam/Kconfig | ||
2348 | +++ b/drivers/crypto/caam/Kconfig | ||
2349 | @@ -112,6 +112,7 @@ config CRYPTO_DEV_FSL_CAAM_CRYPTO_API_QI | ||
2350 | select CRYPTO_AUTHENC | ||
2351 | select CRYPTO_BLKCIPHER | ||
2352 | select CRYPTO_DES | ||
2353 | + select CRYPTO_XTS | ||
2354 | help | ||
2355 | Selecting this will use CAAM Queue Interface (QI) for sending | ||
2356 | & receiving crypto jobs to/from CAAM. This gives better performance | ||
2357 | diff --git a/drivers/crypto/caam/caamalg_qi.c b/drivers/crypto/caam/caamalg_qi.c | ||
2358 | index 8e3449670d2f0..2a605a419df8b 100644 | ||
2359 | --- a/drivers/crypto/caam/caamalg_qi.c | ||
2360 | +++ b/drivers/crypto/caam/caamalg_qi.c | ||
2361 | @@ -18,6 +18,7 @@ | ||
2362 | #include "qi.h" | ||
2363 | #include "jr.h" | ||
2364 | #include "caamalg_desc.h" | ||
2365 | +#include <asm/unaligned.h> | ||
2366 | |||
2367 | /* | ||
2368 | * crypto alg | ||
2369 | @@ -67,6 +68,11 @@ struct caam_ctx { | ||
2370 | struct device *qidev; | ||
2371 | spinlock_t lock; /* Protects multiple init of driver context */ | ||
2372 | struct caam_drv_ctx *drv_ctx[NUM_OP]; | ||
2373 | + struct crypto_skcipher *fallback; | ||
2374 | +}; | ||
2375 | + | ||
2376 | +struct caam_skcipher_req_ctx { | ||
2377 | + struct skcipher_request fallback_req; | ||
2378 | }; | ||
2379 | |||
2380 | static int aead_set_sh_desc(struct crypto_aead *aead) | ||
2381 | @@ -745,12 +751,17 @@ static int xts_skcipher_setkey(struct crypto_skcipher *skcipher, const u8 *key, | ||
2382 | struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher); | ||
2383 | struct device *jrdev = ctx->jrdev; | ||
2384 | int ret = 0; | ||
2385 | + int err; | ||
2386 | |||
2387 | if (keylen != 2 * AES_MIN_KEY_SIZE && keylen != 2 * AES_MAX_KEY_SIZE) { | ||
2388 | dev_err(jrdev, "key size mismatch\n"); | ||
2389 | goto badkey; | ||
2390 | } | ||
2391 | |||
2392 | + err = crypto_skcipher_setkey(ctx->fallback, key, keylen); | ||
2393 | + if (err) | ||
2394 | + return err; | ||
2395 | + | ||
2396 | ctx->cdata.keylen = keylen; | ||
2397 | ctx->cdata.key_virt = key; | ||
2398 | ctx->cdata.key_inline = true; | ||
2399 | @@ -1395,6 +1406,14 @@ static struct skcipher_edesc *skcipher_edesc_alloc(struct skcipher_request *req, | ||
2400 | return edesc; | ||
2401 | } | ||
2402 | |||
2403 | +static inline bool xts_skcipher_ivsize(struct skcipher_request *req) | ||
2404 | +{ | ||
2405 | + struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req); | ||
2406 | + unsigned int ivsize = crypto_skcipher_ivsize(skcipher); | ||
2407 | + | ||
2408 | + return !!get_unaligned((u64 *)(req->iv + (ivsize / 2))); | ||
2409 | +} | ||
2410 | + | ||
2411 | static inline int skcipher_crypt(struct skcipher_request *req, bool encrypt) | ||
2412 | { | ||
2413 | struct skcipher_edesc *edesc; | ||
2414 | @@ -1405,6 +1424,21 @@ static inline int skcipher_crypt(struct skcipher_request *req, bool encrypt) | ||
2415 | if (!req->cryptlen) | ||
2416 | return 0; | ||
2417 | |||
2418 | + if (ctx->fallback && xts_skcipher_ivsize(req)) { | ||
2419 | + struct caam_skcipher_req_ctx *rctx = skcipher_request_ctx(req); | ||
2420 | + | ||
2421 | + skcipher_request_set_tfm(&rctx->fallback_req, ctx->fallback); | ||
2422 | + skcipher_request_set_callback(&rctx->fallback_req, | ||
2423 | + req->base.flags, | ||
2424 | + req->base.complete, | ||
2425 | + req->base.data); | ||
2426 | + skcipher_request_set_crypt(&rctx->fallback_req, req->src, | ||
2427 | + req->dst, req->cryptlen, req->iv); | ||
2428 | + | ||
2429 | + return encrypt ? crypto_skcipher_encrypt(&rctx->fallback_req) : | ||
2430 | + crypto_skcipher_decrypt(&rctx->fallback_req); | ||
2431 | + } | ||
2432 | + | ||
2433 | if (unlikely(caam_congested)) | ||
2434 | return -EAGAIN; | ||
2435 | |||
2436 | @@ -1529,6 +1563,7 @@ static struct caam_skcipher_alg driver_algs[] = { | ||
2437 | .base = { | ||
2438 | .cra_name = "xts(aes)", | ||
2439 | .cra_driver_name = "xts-aes-caam-qi", | ||
2440 | + .cra_flags = CRYPTO_ALG_NEED_FALLBACK, | ||
2441 | .cra_blocksize = AES_BLOCK_SIZE, | ||
2442 | }, | ||
2443 | .setkey = xts_skcipher_setkey, | ||
2444 | @@ -2462,9 +2497,32 @@ static int caam_cra_init(struct crypto_skcipher *tfm) | ||
2445 | struct skcipher_alg *alg = crypto_skcipher_alg(tfm); | ||
2446 | struct caam_skcipher_alg *caam_alg = | ||
2447 | container_of(alg, typeof(*caam_alg), skcipher); | ||
2448 | + struct caam_ctx *ctx = crypto_skcipher_ctx(tfm); | ||
2449 | + u32 alg_aai = caam_alg->caam.class1_alg_type & OP_ALG_AAI_MASK; | ||
2450 | + int ret = 0; | ||
2451 | + | ||
2452 | + if (alg_aai == OP_ALG_AAI_XTS) { | ||
2453 | + const char *tfm_name = crypto_tfm_alg_name(&tfm->base); | ||
2454 | + struct crypto_skcipher *fallback; | ||
2455 | + | ||
2456 | + fallback = crypto_alloc_skcipher(tfm_name, 0, | ||
2457 | + CRYPTO_ALG_NEED_FALLBACK); | ||
2458 | + if (IS_ERR(fallback)) { | ||
2459 | + dev_err(ctx->jrdev, "Failed to allocate %s fallback: %ld\n", | ||
2460 | + tfm_name, PTR_ERR(fallback)); | ||
2461 | + return PTR_ERR(fallback); | ||
2462 | + } | ||
2463 | |||
2464 | - return caam_init_common(crypto_skcipher_ctx(tfm), &caam_alg->caam, | ||
2465 | - false); | ||
2466 | + ctx->fallback = fallback; | ||
2467 | + crypto_skcipher_set_reqsize(tfm, sizeof(struct caam_skcipher_req_ctx) + | ||
2468 | + crypto_skcipher_reqsize(fallback)); | ||
2469 | + } | ||
2470 | + | ||
2471 | + ret = caam_init_common(ctx, &caam_alg->caam, false); | ||
2472 | + if (ret && ctx->fallback) | ||
2473 | + crypto_free_skcipher(ctx->fallback); | ||
2474 | + | ||
2475 | + return ret; | ||
2476 | } | ||
2477 | |||
2478 | static int caam_aead_init(struct crypto_aead *tfm) | ||
2479 | @@ -2490,7 +2548,11 @@ static void caam_exit_common(struct caam_ctx *ctx) | ||
2480 | |||
2481 | static void caam_cra_exit(struct crypto_skcipher *tfm) | ||
2482 | { | ||
2483 | - caam_exit_common(crypto_skcipher_ctx(tfm)); | ||
2484 | + struct caam_ctx *ctx = crypto_skcipher_ctx(tfm); | ||
2485 | + | ||
2486 | + if (ctx->fallback) | ||
2487 | + crypto_free_skcipher(ctx->fallback); | ||
2488 | + caam_exit_common(ctx); | ||
2489 | } | ||
2490 | |||
2491 | static void caam_aead_exit(struct crypto_aead *tfm) | ||
2492 | @@ -2524,7 +2586,7 @@ static void caam_skcipher_alg_init(struct caam_skcipher_alg *t_alg) | ||
2493 | alg->base.cra_module = THIS_MODULE; | ||
2494 | alg->base.cra_priority = CAAM_CRA_PRIORITY; | ||
2495 | alg->base.cra_ctxsize = sizeof(struct caam_ctx); | ||
2496 | - alg->base.cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_KERN_DRIVER_ONLY; | ||
2497 | + alg->base.cra_flags |= CRYPTO_ALG_ASYNC | CRYPTO_ALG_KERN_DRIVER_ONLY; | ||
2498 | |||
2499 | alg->init = caam_cra_init; | ||
2500 | alg->exit = caam_cra_exit; | ||
2501 | diff --git a/drivers/crypto/ccp/ccp-ops.c b/drivers/crypto/ccp/ccp-ops.c | ||
2502 | index 64112c736810e..7234b95241e91 100644 | ||
2503 | --- a/drivers/crypto/ccp/ccp-ops.c | ||
2504 | +++ b/drivers/crypto/ccp/ccp-ops.c | ||
2505 | @@ -1746,7 +1746,7 @@ ccp_run_sha_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) | ||
2506 | break; | ||
2507 | default: | ||
2508 | ret = -EINVAL; | ||
2509 | - goto e_ctx; | ||
2510 | + goto e_data; | ||
2511 | } | ||
2512 | } else { | ||
2513 | /* Stash the context */ | ||
2514 | diff --git a/drivers/crypto/chelsio/chtls/chtls_cm.c b/drivers/crypto/chelsio/chtls/chtls_cm.c | ||
2515 | index dffa2aa855fdd..9b410ffafc4dd 100644 | ||
2516 | --- a/drivers/crypto/chelsio/chtls/chtls_cm.c | ||
2517 | +++ b/drivers/crypto/chelsio/chtls/chtls_cm.c | ||
2518 | @@ -1053,6 +1053,9 @@ static struct sock *chtls_recv_sock(struct sock *lsk, | ||
2519 | ndev = n->dev; | ||
2520 | if (!ndev) | ||
2521 | goto free_dst; | ||
2522 | + if (is_vlan_dev(ndev)) | ||
2523 | + ndev = vlan_dev_real_dev(ndev); | ||
2524 | + | ||
2525 | port_id = cxgb4_port_idx(ndev); | ||
2526 | |||
2527 | csk = chtls_sock_create(cdev); | ||
2528 | diff --git a/drivers/crypto/chelsio/chtls/chtls_io.c b/drivers/crypto/chelsio/chtls/chtls_io.c | ||
2529 | index c403d6b64e087..a5903cfc83523 100644 | ||
2530 | --- a/drivers/crypto/chelsio/chtls/chtls_io.c | ||
2531 | +++ b/drivers/crypto/chelsio/chtls/chtls_io.c | ||
2532 | @@ -910,9 +910,9 @@ static int tls_header_read(struct tls_hdr *thdr, struct iov_iter *from) | ||
2533 | return (__force int)cpu_to_be16(thdr->length); | ||
2534 | } | ||
2535 | |||
2536 | -static int csk_mem_free(struct chtls_dev *cdev, struct sock *sk) | ||
2537 | +static bool csk_mem_free(struct chtls_dev *cdev, struct sock *sk) | ||
2538 | { | ||
2539 | - return (cdev->max_host_sndbuf - sk->sk_wmem_queued); | ||
2540 | + return (cdev->max_host_sndbuf - sk->sk_wmem_queued > 0); | ||
2541 | } | ||
2542 | |||
2543 | static int csk_wait_memory(struct chtls_dev *cdev, | ||
2544 | @@ -1210,6 +1210,7 @@ int chtls_sendpage(struct sock *sk, struct page *page, | ||
2545 | copied = 0; | ||
2546 | csk = rcu_dereference_sk_user_data(sk); | ||
2547 | cdev = csk->cdev; | ||
2548 | + lock_sock(sk); | ||
2549 | timeo = sock_sndtimeo(sk, flags & MSG_DONTWAIT); | ||
2550 | |||
2551 | err = sk_stream_wait_connect(sk, &timeo); | ||
2552 | diff --git a/drivers/crypto/ixp4xx_crypto.c b/drivers/crypto/ixp4xx_crypto.c | ||
2553 | index 9181523ba7607..acaa504d5a798 100644 | ||
2554 | --- a/drivers/crypto/ixp4xx_crypto.c | ||
2555 | +++ b/drivers/crypto/ixp4xx_crypto.c | ||
2556 | @@ -527,7 +527,7 @@ static void release_ixp_crypto(struct device *dev) | ||
2557 | |||
2558 | if (crypt_virt) { | ||
2559 | dma_free_coherent(dev, | ||
2560 | - NPE_QLEN_TOTAL * sizeof( struct crypt_ctl), | ||
2561 | + NPE_QLEN * sizeof(struct crypt_ctl), | ||
2562 | crypt_virt, crypt_phys); | ||
2563 | } | ||
2564 | } | ||
2565 | diff --git a/drivers/crypto/mediatek/mtk-platform.c b/drivers/crypto/mediatek/mtk-platform.c | ||
2566 | index 7e3ad085b5bdd..efce3a83b35a8 100644 | ||
2567 | --- a/drivers/crypto/mediatek/mtk-platform.c | ||
2568 | +++ b/drivers/crypto/mediatek/mtk-platform.c | ||
2569 | @@ -442,7 +442,7 @@ static void mtk_desc_dma_free(struct mtk_cryp *cryp) | ||
2570 | static int mtk_desc_ring_alloc(struct mtk_cryp *cryp) | ||
2571 | { | ||
2572 | struct mtk_ring **ring = cryp->ring; | ||
2573 | - int i, err = ENOMEM; | ||
2574 | + int i; | ||
2575 | |||
2576 | for (i = 0; i < MTK_RING_MAX; i++) { | ||
2577 | ring[i] = kzalloc(sizeof(**ring), GFP_KERNEL); | ||
2578 | @@ -469,14 +469,14 @@ static int mtk_desc_ring_alloc(struct mtk_cryp *cryp) | ||
2579 | return 0; | ||
2580 | |||
2581 | err_cleanup: | ||
2582 | - for (; i--; ) { | ||
2583 | + do { | ||
2584 | dma_free_coherent(cryp->dev, MTK_DESC_RING_SZ, | ||
2585 | ring[i]->res_base, ring[i]->res_dma); | ||
2586 | dma_free_coherent(cryp->dev, MTK_DESC_RING_SZ, | ||
2587 | ring[i]->cmd_base, ring[i]->cmd_dma); | ||
2588 | kfree(ring[i]); | ||
2589 | - } | ||
2590 | - return err; | ||
2591 | + } while (i--); | ||
2592 | + return -ENOMEM; | ||
2593 | } | ||
2594 | |||
2595 | static int mtk_crypto_probe(struct platform_device *pdev) | ||
2596 | diff --git a/drivers/crypto/omap-sham.c b/drivers/crypto/omap-sham.c | ||
2597 | index aba5db3c0588f..d7c0c982ba433 100644 | ||
2598 | --- a/drivers/crypto/omap-sham.c | ||
2599 | +++ b/drivers/crypto/omap-sham.c | ||
2600 | @@ -453,6 +453,9 @@ static void omap_sham_write_ctrl_omap4(struct omap_sham_dev *dd, size_t length, | ||
2601 | struct omap_sham_reqctx *ctx = ahash_request_ctx(dd->req); | ||
2602 | u32 val, mask; | ||
2603 | |||
2604 | + if (likely(ctx->digcnt)) | ||
2605 | + omap_sham_write(dd, SHA_REG_DIGCNT(dd), ctx->digcnt); | ||
2606 | + | ||
2607 | /* | ||
2608 | * Setting ALGO_CONST only for the first iteration and | ||
2609 | * CLOSE_HASH only for the last one. Note that flags mode bits | ||
2610 | diff --git a/drivers/crypto/picoxcell_crypto.c b/drivers/crypto/picoxcell_crypto.c | ||
2611 | index 2680e1525db58..13ecbb0e58528 100644 | ||
2612 | --- a/drivers/crypto/picoxcell_crypto.c | ||
2613 | +++ b/drivers/crypto/picoxcell_crypto.c | ||
2614 | @@ -1697,11 +1697,6 @@ static int spacc_probe(struct platform_device *pdev) | ||
2615 | goto err_clk_put; | ||
2616 | } | ||
2617 | |||
2618 | - ret = device_create_file(&pdev->dev, &dev_attr_stat_irq_thresh); | ||
2619 | - if (ret) | ||
2620 | - goto err_clk_disable; | ||
2621 | - | ||
2622 | - | ||
2623 | /* | ||
2624 | * Use an IRQ threshold of 50% as a default. This seems to be a | ||
2625 | * reasonable trade off of latency against throughput but can be | ||
2626 | @@ -1709,6 +1704,10 @@ static int spacc_probe(struct platform_device *pdev) | ||
2627 | */ | ||
2628 | engine->stat_irq_thresh = (engine->fifo_sz / 2); | ||
2629 | |||
2630 | + ret = device_create_file(&pdev->dev, &dev_attr_stat_irq_thresh); | ||
2631 | + if (ret) | ||
2632 | + goto err_clk_disable; | ||
2633 | + | ||
2634 | /* | ||
2635 | * Configure the interrupts. We only use the STAT_CNT interrupt as we | ||
2636 | * only submit a new packet for processing when we complete another in | ||
2637 | diff --git a/drivers/dma/dmatest.c b/drivers/dma/dmatest.c | ||
2638 | index 62d9825a49e9d..238936e2dfe2d 100644 | ||
2639 | --- a/drivers/dma/dmatest.c | ||
2640 | +++ b/drivers/dma/dmatest.c | ||
2641 | @@ -1218,15 +1218,14 @@ static int dmatest_chan_set(const char *val, const struct kernel_param *kp) | ||
2642 | add_threaded_test(info); | ||
2643 | |||
2644 | /* Check if channel was added successfully */ | ||
2645 | - dtc = list_last_entry(&info->channels, struct dmatest_chan, node); | ||
2646 | - | ||
2647 | - if (dtc->chan) { | ||
2648 | + if (!list_empty(&info->channels)) { | ||
2649 | /* | ||
2650 | * if new channel was not successfully added, revert the | ||
2651 | * "test_channel" string to the name of the last successfully | ||
2652 | * added channel. exception for when users issues empty string | ||
2653 | * to channel parameter. | ||
2654 | */ | ||
2655 | + dtc = list_last_entry(&info->channels, struct dmatest_chan, node); | ||
2656 | if ((strcmp(dma_chan_name(dtc->chan), strim(test_channel)) != 0) | ||
2657 | && (strcmp("", strim(test_channel)) != 0)) { | ||
2658 | ret = -EINVAL; | ||
2659 | diff --git a/drivers/dma/dw/core.c b/drivers/dma/dw/core.c | ||
2660 | index a1b56f52db2f2..5e7fdc0b6e3db 100644 | ||
2661 | --- a/drivers/dma/dw/core.c | ||
2662 | +++ b/drivers/dma/dw/core.c | ||
2663 | @@ -772,6 +772,10 @@ bool dw_dma_filter(struct dma_chan *chan, void *param) | ||
2664 | if (dws->dma_dev != chan->device->dev) | ||
2665 | return false; | ||
2666 | |||
2667 | + /* permit channels in accordance with the channels mask */ | ||
2668 | + if (dws->channels && !(dws->channels & dwc->mask)) | ||
2669 | + return false; | ||
2670 | + | ||
2671 | /* We have to copy data since dws can be temporary storage */ | ||
2672 | memcpy(&dwc->dws, dws, sizeof(struct dw_dma_slave)); | ||
2673 | |||
2674 | diff --git a/drivers/dma/dw/dw.c b/drivers/dma/dw/dw.c | ||
2675 | index 7a085b3c1854c..d9810980920a1 100644 | ||
2676 | --- a/drivers/dma/dw/dw.c | ||
2677 | +++ b/drivers/dma/dw/dw.c | ||
2678 | @@ -14,7 +14,7 @@ | ||
2679 | static void dw_dma_initialize_chan(struct dw_dma_chan *dwc) | ||
2680 | { | ||
2681 | struct dw_dma *dw = to_dw_dma(dwc->chan.device); | ||
2682 | - u32 cfghi = DWC_CFGH_FIFO_MODE; | ||
2683 | + u32 cfghi = is_slave_direction(dwc->direction) ? 0 : DWC_CFGH_FIFO_MODE; | ||
2684 | u32 cfglo = DWC_CFGL_CH_PRIOR(dwc->priority); | ||
2685 | bool hs_polarity = dwc->dws.hs_polarity; | ||
2686 | |||
2687 | diff --git a/drivers/dma/dw/of.c b/drivers/dma/dw/of.c | ||
2688 | index 9e27831dee324..43e975fb67142 100644 | ||
2689 | --- a/drivers/dma/dw/of.c | ||
2690 | +++ b/drivers/dma/dw/of.c | ||
2691 | @@ -22,18 +22,21 @@ static struct dma_chan *dw_dma_of_xlate(struct of_phandle_args *dma_spec, | ||
2692 | }; | ||
2693 | dma_cap_mask_t cap; | ||
2694 | |||
2695 | - if (dma_spec->args_count != 3) | ||
2696 | + if (dma_spec->args_count < 3 || dma_spec->args_count > 4) | ||
2697 | return NULL; | ||
2698 | |||
2699 | slave.src_id = dma_spec->args[0]; | ||
2700 | slave.dst_id = dma_spec->args[0]; | ||
2701 | slave.m_master = dma_spec->args[1]; | ||
2702 | slave.p_master = dma_spec->args[2]; | ||
2703 | + if (dma_spec->args_count >= 4) | ||
2704 | + slave.channels = dma_spec->args[3]; | ||
2705 | |||
2706 | if (WARN_ON(slave.src_id >= DW_DMA_MAX_NR_REQUESTS || | ||
2707 | slave.dst_id >= DW_DMA_MAX_NR_REQUESTS || | ||
2708 | slave.m_master >= dw->pdata->nr_masters || | ||
2709 | - slave.p_master >= dw->pdata->nr_masters)) | ||
2710 | + slave.p_master >= dw->pdata->nr_masters || | ||
2711 | + slave.channels >= BIT(dw->pdata->nr_channels))) | ||
2712 | return NULL; | ||
2713 | |||
2714 | dma_cap_zero(cap); | ||
2715 | diff --git a/drivers/edac/aspeed_edac.c b/drivers/edac/aspeed_edac.c | ||
2716 | index 5634437bb39d2..66669f9d690be 100644 | ||
2717 | --- a/drivers/edac/aspeed_edac.c | ||
2718 | +++ b/drivers/edac/aspeed_edac.c | ||
2719 | @@ -209,8 +209,8 @@ static int config_irq(void *ctx, struct platform_device *pdev) | ||
2720 | /* register interrupt handler */ | ||
2721 | irq = platform_get_irq(pdev, 0); | ||
2722 | dev_dbg(&pdev->dev, "got irq %d\n", irq); | ||
2723 | - if (!irq) | ||
2724 | - return -ENODEV; | ||
2725 | + if (irq < 0) | ||
2726 | + return irq; | ||
2727 | |||
2728 | rc = devm_request_irq(&pdev->dev, irq, mcr_isr, IRQF_TRIGGER_HIGH, | ||
2729 | DRV_NAME, ctx); | ||
2730 | diff --git a/drivers/edac/i5100_edac.c b/drivers/edac/i5100_edac.c | ||
2731 | index 251f2b692785d..0c72daa519ffa 100644 | ||
2732 | --- a/drivers/edac/i5100_edac.c | ||
2733 | +++ b/drivers/edac/i5100_edac.c | ||
2734 | @@ -1074,16 +1074,15 @@ static int i5100_init_one(struct pci_dev *pdev, const struct pci_device_id *id) | ||
2735 | PCI_DEVICE_ID_INTEL_5100_19, 0); | ||
2736 | if (!einj) { | ||
2737 | ret = -ENODEV; | ||
2738 | - goto bail_einj; | ||
2739 | + goto bail_mc_free; | ||
2740 | } | ||
2741 | |||
2742 | rc = pci_enable_device(einj); | ||
2743 | if (rc < 0) { | ||
2744 | ret = rc; | ||
2745 | - goto bail_disable_einj; | ||
2746 | + goto bail_einj; | ||
2747 | } | ||
2748 | |||
2749 | - | ||
2750 | mci->pdev = &pdev->dev; | ||
2751 | |||
2752 | priv = mci->pvt_info; | ||
2753 | @@ -1149,14 +1148,14 @@ static int i5100_init_one(struct pci_dev *pdev, const struct pci_device_id *id) | ||
2754 | bail_scrub: | ||
2755 | priv->scrub_enable = 0; | ||
2756 | cancel_delayed_work_sync(&(priv->i5100_scrubbing)); | ||
2757 | - edac_mc_free(mci); | ||
2758 | - | ||
2759 | -bail_disable_einj: | ||
2760 | pci_disable_device(einj); | ||
2761 | |||
2762 | bail_einj: | ||
2763 | pci_dev_put(einj); | ||
2764 | |||
2765 | +bail_mc_free: | ||
2766 | + edac_mc_free(mci); | ||
2767 | + | ||
2768 | bail_disable_ch1: | ||
2769 | pci_disable_device(ch1mm); | ||
2770 | |||
2771 | diff --git a/drivers/edac/ti_edac.c b/drivers/edac/ti_edac.c | ||
2772 | index 6ac26d1b929f0..3247689467435 100644 | ||
2773 | --- a/drivers/edac/ti_edac.c | ||
2774 | +++ b/drivers/edac/ti_edac.c | ||
2775 | @@ -278,7 +278,8 @@ static int ti_edac_probe(struct platform_device *pdev) | ||
2776 | |||
2777 | /* add EMIF ECC error handler */ | ||
2778 | error_irq = platform_get_irq(pdev, 0); | ||
2779 | - if (!error_irq) { | ||
2780 | + if (error_irq < 0) { | ||
2781 | + ret = error_irq; | ||
2782 | edac_printk(KERN_ERR, EDAC_MOD_NAME, | ||
2783 | "EMIF irq number not defined.\n"); | ||
2784 | goto err; | ||
2785 | diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | ||
2786 | index 2384aa018993d..7c58085031732 100644 | ||
2787 | --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | ||
2788 | +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | ||
2789 | @@ -6984,8 +6984,7 @@ static int dm_update_plane_state(struct dc *dc, | ||
2790 | dm_old_plane_state->dc_state, | ||
2791 | dm_state->context)) { | ||
2792 | |||
2793 | - ret = EINVAL; | ||
2794 | - return ret; | ||
2795 | + return -EINVAL; | ||
2796 | } | ||
2797 | |||
2798 | |||
2799 | diff --git a/drivers/gpu/drm/drm_debugfs_crc.c b/drivers/gpu/drm/drm_debugfs_crc.c | ||
2800 | index 6a626c82e264b..f6598c5a9a879 100644 | ||
2801 | --- a/drivers/gpu/drm/drm_debugfs_crc.c | ||
2802 | +++ b/drivers/gpu/drm/drm_debugfs_crc.c | ||
2803 | @@ -144,8 +144,10 @@ static ssize_t crc_control_write(struct file *file, const char __user *ubuf, | ||
2804 | source[len - 1] = '\0'; | ||
2805 | |||
2806 | ret = crtc->funcs->verify_crc_source(crtc, source, &values_cnt); | ||
2807 | - if (ret) | ||
2808 | + if (ret) { | ||
2809 | + kfree(source); | ||
2810 | return ret; | ||
2811 | + } | ||
2812 | |||
2813 | spin_lock_irq(&crc->lock); | ||
2814 | |||
2815 | diff --git a/drivers/gpu/drm/gma500/cdv_intel_dp.c b/drivers/gpu/drm/gma500/cdv_intel_dp.c | ||
2816 | index 570b59520fd13..2ff4b35151bf8 100644 | ||
2817 | --- a/drivers/gpu/drm/gma500/cdv_intel_dp.c | ||
2818 | +++ b/drivers/gpu/drm/gma500/cdv_intel_dp.c | ||
2819 | @@ -2120,7 +2120,7 @@ cdv_intel_dp_init(struct drm_device *dev, struct psb_intel_mode_device *mode_dev | ||
2820 | intel_dp->dpcd, | ||
2821 | sizeof(intel_dp->dpcd)); | ||
2822 | cdv_intel_edp_panel_vdd_off(gma_encoder); | ||
2823 | - if (ret == 0) { | ||
2824 | + if (ret <= 0) { | ||
2825 | /* if this fails, presume the device is a ghost */ | ||
2826 | DRM_INFO("failed to retrieve link info, disabling eDP\n"); | ||
2827 | cdv_intel_dp_encoder_destroy(encoder); | ||
2828 | diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c b/drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c | ||
2829 | index 691c1a277d91b..dfcbb2b7cdda3 100644 | ||
2830 | --- a/drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c | ||
2831 | +++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c | ||
2832 | @@ -834,7 +834,7 @@ static void a6xx_get_indexed_registers(struct msm_gpu *gpu, | ||
2833 | int i; | ||
2834 | |||
2835 | a6xx_state->indexed_regs = state_kcalloc(a6xx_state, count, | ||
2836 | - sizeof(a6xx_state->indexed_regs)); | ||
2837 | + sizeof(*a6xx_state->indexed_regs)); | ||
2838 | if (!a6xx_state->indexed_regs) | ||
2839 | return; | ||
2840 | |||
2841 | diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | ||
2842 | index 36c85c05b7cf7..4aed5e9a84a45 100644 | ||
2843 | --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | ||
2844 | +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | ||
2845 | @@ -819,7 +819,7 @@ static int dpu_crtc_atomic_check(struct drm_crtc *crtc, | ||
2846 | struct drm_plane *plane; | ||
2847 | struct drm_display_mode *mode; | ||
2848 | |||
2849 | - int cnt = 0, rc = 0, mixer_width, i, z_pos; | ||
2850 | + int cnt = 0, rc = 0, mixer_width = 0, i, z_pos; | ||
2851 | |||
2852 | struct dpu_multirect_plane_states multirect_plane[DPU_STAGE_MAX * 2]; | ||
2853 | int multirect_count = 0; | ||
2854 | @@ -852,9 +852,11 @@ static int dpu_crtc_atomic_check(struct drm_crtc *crtc, | ||
2855 | |||
2856 | memset(pipe_staged, 0, sizeof(pipe_staged)); | ||
2857 | |||
2858 | - mixer_width = mode->hdisplay / cstate->num_mixers; | ||
2859 | + if (cstate->num_mixers) { | ||
2860 | + mixer_width = mode->hdisplay / cstate->num_mixers; | ||
2861 | |||
2862 | - _dpu_crtc_setup_lm_bounds(crtc, state); | ||
2863 | + _dpu_crtc_setup_lm_bounds(crtc, state); | ||
2864 | + } | ||
2865 | |||
2866 | crtc_rect.x2 = mode->hdisplay; | ||
2867 | crtc_rect.y2 = mode->vdisplay; | ||
2868 | diff --git a/drivers/gpu/drm/mxsfb/mxsfb_drv.c b/drivers/gpu/drm/mxsfb/mxsfb_drv.c | ||
2869 | index e8506335cd155..1694a7deb9133 100644 | ||
2870 | --- a/drivers/gpu/drm/mxsfb/mxsfb_drv.c | ||
2871 | +++ b/drivers/gpu/drm/mxsfb/mxsfb_drv.c | ||
2872 | @@ -26,6 +26,7 @@ | ||
2873 | #include <drm/drm_drv.h> | ||
2874 | #include <drm/drm_fb_cma_helper.h> | ||
2875 | #include <drm/drm_fb_helper.h> | ||
2876 | +#include <drm/drm_fourcc.h> | ||
2877 | #include <drm/drm_gem_cma_helper.h> | ||
2878 | #include <drm/drm_gem_framebuffer_helper.h> | ||
2879 | #include <drm/drm_irq.h> | ||
2880 | @@ -87,8 +88,26 @@ void mxsfb_disable_axi_clk(struct mxsfb_drm_private *mxsfb) | ||
2881 | clk_disable_unprepare(mxsfb->clk_axi); | ||
2882 | } | ||
2883 | |||
2884 | +static struct drm_framebuffer * | ||
2885 | +mxsfb_fb_create(struct drm_device *dev, struct drm_file *file_priv, | ||
2886 | + const struct drm_mode_fb_cmd2 *mode_cmd) | ||
2887 | +{ | ||
2888 | + const struct drm_format_info *info; | ||
2889 | + | ||
2890 | + info = drm_get_format_info(dev, mode_cmd); | ||
2891 | + if (!info) | ||
2892 | + return ERR_PTR(-EINVAL); | ||
2893 | + | ||
2894 | + if (mode_cmd->width * info->cpp[0] != mode_cmd->pitches[0]) { | ||
2895 | + dev_dbg(dev->dev, "Invalid pitch: fb width must match pitch\n"); | ||
2896 | + return ERR_PTR(-EINVAL); | ||
2897 | + } | ||
2898 | + | ||
2899 | + return drm_gem_fb_create(dev, file_priv, mode_cmd); | ||
2900 | +} | ||
2901 | + | ||
2902 | static const struct drm_mode_config_funcs mxsfb_mode_config_funcs = { | ||
2903 | - .fb_create = drm_gem_fb_create, | ||
2904 | + .fb_create = mxsfb_fb_create, | ||
2905 | .atomic_check = drm_atomic_helper_check, | ||
2906 | .atomic_commit = drm_atomic_helper_commit, | ||
2907 | }; | ||
2908 | diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c | ||
2909 | index 6d9656323a3f4..f0ea782df836d 100644 | ||
2910 | --- a/drivers/gpu/drm/panel/panel-simple.c | ||
2911 | +++ b/drivers/gpu/drm/panel/panel-simple.c | ||
2912 | @@ -2382,12 +2382,12 @@ static const struct drm_display_mode ortustech_com43h4m85ulc_mode = { | ||
2913 | static const struct panel_desc ortustech_com43h4m85ulc = { | ||
2914 | .modes = &ortustech_com43h4m85ulc_mode, | ||
2915 | .num_modes = 1, | ||
2916 | - .bpc = 8, | ||
2917 | + .bpc = 6, | ||
2918 | .size = { | ||
2919 | .width = 56, | ||
2920 | .height = 93, | ||
2921 | }, | ||
2922 | - .bus_format = MEDIA_BUS_FMT_RGB888_1X24, | ||
2923 | + .bus_format = MEDIA_BUS_FMT_RGB666_1X18, | ||
2924 | .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE, | ||
2925 | }; | ||
2926 | |||
2927 | diff --git a/drivers/gpu/drm/panfrost/panfrost_gpu.c b/drivers/gpu/drm/panfrost/panfrost_gpu.c | ||
2928 | index 8822ec13a0d61..0d39a201c7591 100644 | ||
2929 | --- a/drivers/gpu/drm/panfrost/panfrost_gpu.c | ||
2930 | +++ b/drivers/gpu/drm/panfrost/panfrost_gpu.c | ||
2931 | @@ -75,6 +75,17 @@ int panfrost_gpu_soft_reset(struct panfrost_device *pfdev) | ||
2932 | return 0; | ||
2933 | } | ||
2934 | |||
2935 | +void panfrost_gpu_amlogic_quirk(struct panfrost_device *pfdev) | ||
2936 | +{ | ||
2937 | + /* | ||
2938 | + * The Amlogic integrated Mali-T820, Mali-G31 & Mali-G52 needs | ||
2939 | + * these undocumented bits in GPU_PWR_OVERRIDE1 to be set in order | ||
2940 | + * to operate correctly. | ||
2941 | + */ | ||
2942 | + gpu_write(pfdev, GPU_PWR_KEY, GPU_PWR_KEY_UNLOCK); | ||
2943 | + gpu_write(pfdev, GPU_PWR_OVERRIDE1, 0xfff | (0x20 << 16)); | ||
2944 | +} | ||
2945 | + | ||
2946 | static void panfrost_gpu_init_quirks(struct panfrost_device *pfdev) | ||
2947 | { | ||
2948 | u32 quirks = 0; | ||
2949 | @@ -304,6 +315,8 @@ void panfrost_gpu_power_on(struct panfrost_device *pfdev) | ||
2950 | int ret; | ||
2951 | u32 val; | ||
2952 | |||
2953 | + panfrost_gpu_init_quirks(pfdev); | ||
2954 | + | ||
2955 | /* Just turn on everything for now */ | ||
2956 | gpu_write(pfdev, L2_PWRON_LO, pfdev->features.l2_present); | ||
2957 | ret = readl_relaxed_poll_timeout(pfdev->iomem + L2_READY_LO, | ||
2958 | @@ -357,7 +370,6 @@ int panfrost_gpu_init(struct panfrost_device *pfdev) | ||
2959 | return err; | ||
2960 | } | ||
2961 | |||
2962 | - panfrost_gpu_init_quirks(pfdev); | ||
2963 | panfrost_gpu_power_on(pfdev); | ||
2964 | |||
2965 | return 0; | ||
2966 | diff --git a/drivers/gpu/drm/panfrost/panfrost_gpu.h b/drivers/gpu/drm/panfrost/panfrost_gpu.h | ||
2967 | index 4112412087b27..468c51e7e46db 100644 | ||
2968 | --- a/drivers/gpu/drm/panfrost/panfrost_gpu.h | ||
2969 | +++ b/drivers/gpu/drm/panfrost/panfrost_gpu.h | ||
2970 | @@ -16,4 +16,6 @@ int panfrost_gpu_soft_reset(struct panfrost_device *pfdev); | ||
2971 | void panfrost_gpu_power_on(struct panfrost_device *pfdev); | ||
2972 | void panfrost_gpu_power_off(struct panfrost_device *pfdev); | ||
2973 | |||
2974 | +void panfrost_gpu_amlogic_quirk(struct panfrost_device *pfdev); | ||
2975 | + | ||
2976 | #endif | ||
2977 | diff --git a/drivers/gpu/drm/panfrost/panfrost_regs.h b/drivers/gpu/drm/panfrost/panfrost_regs.h | ||
2978 | index ea38ac60581c6..eddaa62ad8b0e 100644 | ||
2979 | --- a/drivers/gpu/drm/panfrost/panfrost_regs.h | ||
2980 | +++ b/drivers/gpu/drm/panfrost/panfrost_regs.h | ||
2981 | @@ -51,6 +51,10 @@ | ||
2982 | #define GPU_STATUS 0x34 | ||
2983 | #define GPU_STATUS_PRFCNT_ACTIVE BIT(2) | ||
2984 | #define GPU_LATEST_FLUSH_ID 0x38 | ||
2985 | +#define GPU_PWR_KEY 0x50 /* (WO) Power manager key register */ | ||
2986 | +#define GPU_PWR_KEY_UNLOCK 0x2968A819 | ||
2987 | +#define GPU_PWR_OVERRIDE0 0x54 /* (RW) Power manager override settings */ | ||
2988 | +#define GPU_PWR_OVERRIDE1 0x58 /* (RW) Power manager override settings */ | ||
2989 | #define GPU_FAULT_STATUS 0x3C | ||
2990 | #define GPU_FAULT_ADDRESS_LO 0x40 | ||
2991 | #define GPU_FAULT_ADDRESS_HI 0x44 | ||
2992 | diff --git a/drivers/gpu/drm/virtio/virtgpu_kms.c b/drivers/gpu/drm/virtio/virtgpu_kms.c | ||
2993 | index c190702fab726..6dcc05ab31eba 100644 | ||
2994 | --- a/drivers/gpu/drm/virtio/virtgpu_kms.c | ||
2995 | +++ b/drivers/gpu/drm/virtio/virtgpu_kms.c | ||
2996 | @@ -96,8 +96,10 @@ static void virtio_gpu_get_capsets(struct virtio_gpu_device *vgdev, | ||
2997 | vgdev->capsets[i].id > 0, 5 * HZ); | ||
2998 | if (ret == 0) { | ||
2999 | DRM_ERROR("timed out waiting for cap set %d\n", i); | ||
3000 | + spin_lock(&vgdev->display_info_lock); | ||
3001 | kfree(vgdev->capsets); | ||
3002 | vgdev->capsets = NULL; | ||
3003 | + spin_unlock(&vgdev->display_info_lock); | ||
3004 | return; | ||
3005 | } | ||
3006 | DRM_INFO("cap set %d: id %d, max-version %d, max-size %d\n", | ||
3007 | diff --git a/drivers/gpu/drm/virtio/virtgpu_vq.c b/drivers/gpu/drm/virtio/virtgpu_vq.c | ||
3008 | index 7ac20490e1b4c..92022a83bbd5e 100644 | ||
3009 | --- a/drivers/gpu/drm/virtio/virtgpu_vq.c | ||
3010 | +++ b/drivers/gpu/drm/virtio/virtgpu_vq.c | ||
3011 | @@ -572,9 +572,13 @@ static void virtio_gpu_cmd_get_capset_info_cb(struct virtio_gpu_device *vgdev, | ||
3012 | int i = le32_to_cpu(cmd->capset_index); | ||
3013 | |||
3014 | spin_lock(&vgdev->display_info_lock); | ||
3015 | - vgdev->capsets[i].id = le32_to_cpu(resp->capset_id); | ||
3016 | - vgdev->capsets[i].max_version = le32_to_cpu(resp->capset_max_version); | ||
3017 | - vgdev->capsets[i].max_size = le32_to_cpu(resp->capset_max_size); | ||
3018 | + if (vgdev->capsets) { | ||
3019 | + vgdev->capsets[i].id = le32_to_cpu(resp->capset_id); | ||
3020 | + vgdev->capsets[i].max_version = le32_to_cpu(resp->capset_max_version); | ||
3021 | + vgdev->capsets[i].max_size = le32_to_cpu(resp->capset_max_size); | ||
3022 | + } else { | ||
3023 | + DRM_ERROR("invalid capset memory."); | ||
3024 | + } | ||
3025 | spin_unlock(&vgdev->display_info_lock); | ||
3026 | wake_up(&vgdev->resp_wq); | ||
3027 | } | ||
3028 | diff --git a/drivers/gpu/drm/vkms/vkms_composer.c b/drivers/gpu/drm/vkms/vkms_composer.c | ||
3029 | index d5585695c64d1..45d6ebbdbdb22 100644 | ||
3030 | --- a/drivers/gpu/drm/vkms/vkms_composer.c | ||
3031 | +++ b/drivers/gpu/drm/vkms/vkms_composer.c | ||
3032 | @@ -33,7 +33,7 @@ static uint32_t compute_crc(void *vaddr_out, struct vkms_composer *composer) | ||
3033 | + (i * composer->pitch) | ||
3034 | + (j * composer->cpp); | ||
3035 | /* XRGB format ignores Alpha channel */ | ||
3036 | - memset(vaddr_out + src_offset + 24, 0, 8); | ||
3037 | + bitmap_clear(vaddr_out + src_offset, 24, 8); | ||
3038 | crc = crc32_le(crc, vaddr_out + src_offset, | ||
3039 | sizeof(u32)); | ||
3040 | } | ||
3041 | diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h | ||
3042 | index e03a4d794240c..7363d0b488bd8 100644 | ||
3043 | --- a/drivers/hid/hid-ids.h | ||
3044 | +++ b/drivers/hid/hid-ids.h | ||
3045 | @@ -1119,6 +1119,7 @@ | ||
3046 | #define USB_DEVICE_ID_SYNAPTICS_DELL_K12A 0x2819 | ||
3047 | #define USB_DEVICE_ID_SYNAPTICS_ACER_SWITCH5_012 0x2968 | ||
3048 | #define USB_DEVICE_ID_SYNAPTICS_TP_V103 0x5710 | ||
3049 | +#define USB_DEVICE_ID_SYNAPTICS_ACER_ONE_S1003 0x73f5 | ||
3050 | #define USB_DEVICE_ID_SYNAPTICS_ACER_SWITCH5 0x81a7 | ||
3051 | |||
3052 | #define USB_VENDOR_ID_TEXAS_INSTRUMENTS 0x2047 | ||
3053 | diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c | ||
3054 | index e3d475f4baf66..b2bff932c524f 100644 | ||
3055 | --- a/drivers/hid/hid-input.c | ||
3056 | +++ b/drivers/hid/hid-input.c | ||
3057 | @@ -797,7 +797,7 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel | ||
3058 | case 0x3b: /* Battery Strength */ | ||
3059 | hidinput_setup_battery(device, HID_INPUT_REPORT, field); | ||
3060 | usage->type = EV_PWR; | ||
3061 | - goto ignore; | ||
3062 | + return; | ||
3063 | |||
3064 | case 0x3c: /* Invert */ | ||
3065 | map_key_clear(BTN_TOOL_RUBBER); | ||
3066 | @@ -1059,7 +1059,7 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel | ||
3067 | case HID_DC_BATTERYSTRENGTH: | ||
3068 | hidinput_setup_battery(device, HID_INPUT_REPORT, field); | ||
3069 | usage->type = EV_PWR; | ||
3070 | - goto ignore; | ||
3071 | + return; | ||
3072 | } | ||
3073 | goto unknown; | ||
3074 | |||
3075 | diff --git a/drivers/hid/hid-ite.c b/drivers/hid/hid-ite.c | ||
3076 | index 6c55682c59740..044a93f3c1178 100644 | ||
3077 | --- a/drivers/hid/hid-ite.c | ||
3078 | +++ b/drivers/hid/hid-ite.c | ||
3079 | @@ -44,6 +44,10 @@ static const struct hid_device_id ite_devices[] = { | ||
3080 | { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, | ||
3081 | USB_VENDOR_ID_SYNAPTICS, | ||
3082 | USB_DEVICE_ID_SYNAPTICS_ACER_SWITCH5_012) }, | ||
3083 | + /* ITE8910 USB kbd ctlr, with Synaptics touchpad connected to it. */ | ||
3084 | + { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, | ||
3085 | + USB_VENDOR_ID_SYNAPTICS, | ||
3086 | + USB_DEVICE_ID_SYNAPTICS_ACER_ONE_S1003) }, | ||
3087 | { } | ||
3088 | }; | ||
3089 | MODULE_DEVICE_TABLE(hid, ite_devices); | ||
3090 | diff --git a/drivers/hid/hid-roccat-kone.c b/drivers/hid/hid-roccat-kone.c | ||
3091 | index 1a6e600197d0b..509b9bb1362cb 100644 | ||
3092 | --- a/drivers/hid/hid-roccat-kone.c | ||
3093 | +++ b/drivers/hid/hid-roccat-kone.c | ||
3094 | @@ -294,31 +294,40 @@ static ssize_t kone_sysfs_write_settings(struct file *fp, struct kobject *kobj, | ||
3095 | struct kone_device *kone = hid_get_drvdata(dev_get_drvdata(dev)); | ||
3096 | struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev)); | ||
3097 | int retval = 0, difference, old_profile; | ||
3098 | + struct kone_settings *settings = (struct kone_settings *)buf; | ||
3099 | |||
3100 | /* I need to get my data in one piece */ | ||
3101 | if (off != 0 || count != sizeof(struct kone_settings)) | ||
3102 | return -EINVAL; | ||
3103 | |||
3104 | mutex_lock(&kone->kone_lock); | ||
3105 | - difference = memcmp(buf, &kone->settings, sizeof(struct kone_settings)); | ||
3106 | + difference = memcmp(settings, &kone->settings, | ||
3107 | + sizeof(struct kone_settings)); | ||
3108 | if (difference) { | ||
3109 | - retval = kone_set_settings(usb_dev, | ||
3110 | - (struct kone_settings const *)buf); | ||
3111 | - if (retval) { | ||
3112 | - mutex_unlock(&kone->kone_lock); | ||
3113 | - return retval; | ||
3114 | + if (settings->startup_profile < 1 || | ||
3115 | + settings->startup_profile > 5) { | ||
3116 | + retval = -EINVAL; | ||
3117 | + goto unlock; | ||
3118 | } | ||
3119 | |||
3120 | + retval = kone_set_settings(usb_dev, settings); | ||
3121 | + if (retval) | ||
3122 | + goto unlock; | ||
3123 | + | ||
3124 | old_profile = kone->settings.startup_profile; | ||
3125 | - memcpy(&kone->settings, buf, sizeof(struct kone_settings)); | ||
3126 | + memcpy(&kone->settings, settings, sizeof(struct kone_settings)); | ||
3127 | |||
3128 | kone_profile_activated(kone, kone->settings.startup_profile); | ||
3129 | |||
3130 | if (kone->settings.startup_profile != old_profile) | ||
3131 | kone_profile_report(kone, kone->settings.startup_profile); | ||
3132 | } | ||
3133 | +unlock: | ||
3134 | mutex_unlock(&kone->kone_lock); | ||
3135 | |||
3136 | + if (retval) | ||
3137 | + return retval; | ||
3138 | + | ||
3139 | return sizeof(struct kone_settings); | ||
3140 | } | ||
3141 | static BIN_ATTR(settings, 0660, kone_sysfs_read_settings, | ||
3142 | diff --git a/drivers/hwmon/pmbus/max34440.c b/drivers/hwmon/pmbus/max34440.c | ||
3143 | index 5c63a66007293..e22617def70bf 100644 | ||
3144 | --- a/drivers/hwmon/pmbus/max34440.c | ||
3145 | +++ b/drivers/hwmon/pmbus/max34440.c | ||
3146 | @@ -387,7 +387,6 @@ static struct pmbus_driver_info max34440_info[] = { | ||
3147 | .func[18] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, | ||
3148 | .func[19] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, | ||
3149 | .func[20] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, | ||
3150 | - .read_byte_data = max34440_read_byte_data, | ||
3151 | .read_word_data = max34440_read_word_data, | ||
3152 | .write_word_data = max34440_write_word_data, | ||
3153 | }, | ||
3154 | @@ -418,7 +417,6 @@ static struct pmbus_driver_info max34440_info[] = { | ||
3155 | .func[15] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, | ||
3156 | .func[16] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, | ||
3157 | .func[17] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, | ||
3158 | - .read_byte_data = max34440_read_byte_data, | ||
3159 | .read_word_data = max34440_read_word_data, | ||
3160 | .write_word_data = max34440_write_word_data, | ||
3161 | }, | ||
3162 | @@ -454,7 +452,6 @@ static struct pmbus_driver_info max34440_info[] = { | ||
3163 | .func[19] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, | ||
3164 | .func[20] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, | ||
3165 | .func[21] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, | ||
3166 | - .read_byte_data = max34440_read_byte_data, | ||
3167 | .read_word_data = max34440_read_word_data, | ||
3168 | .write_word_data = max34440_write_word_data, | ||
3169 | }, | ||
3170 | diff --git a/drivers/hwtracing/coresight/coresight-etm-perf.c b/drivers/hwtracing/coresight/coresight-etm-perf.c | ||
3171 | index 84f1dcb698272..9b0c5d719232f 100644 | ||
3172 | --- a/drivers/hwtracing/coresight/coresight-etm-perf.c | ||
3173 | +++ b/drivers/hwtracing/coresight/coresight-etm-perf.c | ||
3174 | @@ -126,10 +126,10 @@ static void free_sink_buffer(struct etm_event_data *event_data) | ||
3175 | cpumask_t *mask = &event_data->mask; | ||
3176 | struct coresight_device *sink; | ||
3177 | |||
3178 | - if (WARN_ON(cpumask_empty(mask))) | ||
3179 | + if (!event_data->snk_config) | ||
3180 | return; | ||
3181 | |||
3182 | - if (!event_data->snk_config) | ||
3183 | + if (WARN_ON(cpumask_empty(mask))) | ||
3184 | return; | ||
3185 | |||
3186 | cpu = cpumask_first(mask); | ||
3187 | @@ -310,6 +310,16 @@ static void etm_event_start(struct perf_event *event, int flags) | ||
3188 | if (!event_data) | ||
3189 | goto fail; | ||
3190 | |||
3191 | + /* | ||
3192 | + * Check if this ETM is allowed to trace, as decided | ||
3193 | + * at etm_setup_aux(). This could be due to an unreachable | ||
3194 | + * sink from this ETM. We can't do much in this case if | ||
3195 | + * the sink was specified or hinted to the driver. For | ||
3196 | + * now, simply don't record anything on this ETM. | ||
3197 | + */ | ||
3198 | + if (!cpumask_test_cpu(cpu, &event_data->mask)) | ||
3199 | + goto fail_end_stop; | ||
3200 | + | ||
3201 | path = etm_event_cpu_path(event_data, cpu); | ||
3202 | /* We need a sink, no need to continue without one */ | ||
3203 | sink = coresight_get_sink(path); | ||
3204 | diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig | ||
3205 | index 146ce40d8e0aa..2d08a8719506c 100644 | ||
3206 | --- a/drivers/i2c/busses/Kconfig | ||
3207 | +++ b/drivers/i2c/busses/Kconfig | ||
3208 | @@ -1162,6 +1162,7 @@ config I2C_RCAR | ||
3209 | tristate "Renesas R-Car I2C Controller" | ||
3210 | depends on ARCH_RENESAS || COMPILE_TEST | ||
3211 | select I2C_SLAVE | ||
3212 | + select RESET_CONTROLLER if ARCH_RCAR_GEN3 | ||
3213 | help | ||
3214 | If you say yes to this option, support will be included for the | ||
3215 | R-Car I2C controller. | ||
3216 | diff --git a/drivers/i2c/i2c-core-acpi.c b/drivers/i2c/i2c-core-acpi.c | ||
3217 | index ce70b5288472c..c70983780ae79 100644 | ||
3218 | --- a/drivers/i2c/i2c-core-acpi.c | ||
3219 | +++ b/drivers/i2c/i2c-core-acpi.c | ||
3220 | @@ -264,6 +264,7 @@ static acpi_status i2c_acpi_add_device(acpi_handle handle, u32 level, | ||
3221 | void i2c_acpi_register_devices(struct i2c_adapter *adap) | ||
3222 | { | ||
3223 | acpi_status status; | ||
3224 | + acpi_handle handle; | ||
3225 | |||
3226 | if (!has_acpi_companion(&adap->dev)) | ||
3227 | return; | ||
3228 | @@ -274,6 +275,15 @@ void i2c_acpi_register_devices(struct i2c_adapter *adap) | ||
3229 | adap, NULL); | ||
3230 | if (ACPI_FAILURE(status)) | ||
3231 | dev_warn(&adap->dev, "failed to enumerate I2C slaves\n"); | ||
3232 | + | ||
3233 | + if (!adap->dev.parent) | ||
3234 | + return; | ||
3235 | + | ||
3236 | + handle = ACPI_HANDLE(adap->dev.parent); | ||
3237 | + if (!handle) | ||
3238 | + return; | ||
3239 | + | ||
3240 | + acpi_walk_dep_device_list(handle); | ||
3241 | } | ||
3242 | |||
3243 | const struct acpi_device_id * | ||
3244 | @@ -737,7 +747,6 @@ int i2c_acpi_install_space_handler(struct i2c_adapter *adapter) | ||
3245 | return -ENOMEM; | ||
3246 | } | ||
3247 | |||
3248 | - acpi_walk_dep_device_list(handle); | ||
3249 | return 0; | ||
3250 | } | ||
3251 | |||
3252 | diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c | ||
3253 | index 5c051dba32a51..6cc71c90f85ea 100644 | ||
3254 | --- a/drivers/i3c/master.c | ||
3255 | +++ b/drivers/i3c/master.c | ||
3256 | @@ -1760,6 +1760,21 @@ static void i3c_master_bus_cleanup(struct i3c_master_controller *master) | ||
3257 | i3c_master_detach_free_devs(master); | ||
3258 | } | ||
3259 | |||
3260 | +static void i3c_master_attach_boardinfo(struct i3c_dev_desc *i3cdev) | ||
3261 | +{ | ||
3262 | + struct i3c_master_controller *master = i3cdev->common.master; | ||
3263 | + struct i3c_dev_boardinfo *i3cboardinfo; | ||
3264 | + | ||
3265 | + list_for_each_entry(i3cboardinfo, &master->boardinfo.i3c, node) { | ||
3266 | + if (i3cdev->info.pid != i3cboardinfo->pid) | ||
3267 | + continue; | ||
3268 | + | ||
3269 | + i3cdev->boardinfo = i3cboardinfo; | ||
3270 | + i3cdev->info.static_addr = i3cboardinfo->static_addr; | ||
3271 | + return; | ||
3272 | + } | ||
3273 | +} | ||
3274 | + | ||
3275 | static struct i3c_dev_desc * | ||
3276 | i3c_master_search_i3c_dev_duplicate(struct i3c_dev_desc *refdev) | ||
3277 | { | ||
3278 | @@ -1815,10 +1830,10 @@ int i3c_master_add_i3c_dev_locked(struct i3c_master_controller *master, | ||
3279 | if (ret) | ||
3280 | goto err_detach_dev; | ||
3281 | |||
3282 | + i3c_master_attach_boardinfo(newdev); | ||
3283 | + | ||
3284 | olddev = i3c_master_search_i3c_dev_duplicate(newdev); | ||
3285 | if (olddev) { | ||
3286 | - newdev->boardinfo = olddev->boardinfo; | ||
3287 | - newdev->info.static_addr = olddev->info.static_addr; | ||
3288 | newdev->dev = olddev->dev; | ||
3289 | if (newdev->dev) | ||
3290 | newdev->dev->desc = newdev; | ||
3291 | diff --git a/drivers/i3c/master/i3c-master-cdns.c b/drivers/i3c/master/i3c-master-cdns.c | ||
3292 | index 10db0bf0655a9..6d5719cea9f53 100644 | ||
3293 | --- a/drivers/i3c/master/i3c-master-cdns.c | ||
3294 | +++ b/drivers/i3c/master/i3c-master-cdns.c | ||
3295 | @@ -1593,8 +1593,10 @@ static int cdns_i3c_master_probe(struct platform_device *pdev) | ||
3296 | master->ibi.slots = devm_kcalloc(&pdev->dev, master->ibi.num_slots, | ||
3297 | sizeof(*master->ibi.slots), | ||
3298 | GFP_KERNEL); | ||
3299 | - if (!master->ibi.slots) | ||
3300 | + if (!master->ibi.slots) { | ||
3301 | + ret = -ENOMEM; | ||
3302 | goto err_disable_sysclk; | ||
3303 | + } | ||
3304 | |||
3305 | writel(IBIR_THR(1), master->regs + CMD_IBI_THR_CTRL); | ||
3306 | writel(MST_INT_IBIR_THR, master->regs + MST_IER); | ||
3307 | diff --git a/drivers/iio/adc/stm32-adc-core.c b/drivers/iio/adc/stm32-adc-core.c | ||
3308 | index 74f3a2be17a64..14d6a537289cb 100644 | ||
3309 | --- a/drivers/iio/adc/stm32-adc-core.c | ||
3310 | +++ b/drivers/iio/adc/stm32-adc-core.c | ||
3311 | @@ -780,6 +780,13 @@ static int stm32_adc_core_runtime_resume(struct device *dev) | ||
3312 | { | ||
3313 | return stm32_adc_core_hw_start(dev); | ||
3314 | } | ||
3315 | + | ||
3316 | +static int stm32_adc_core_runtime_idle(struct device *dev) | ||
3317 | +{ | ||
3318 | + pm_runtime_mark_last_busy(dev); | ||
3319 | + | ||
3320 | + return 0; | ||
3321 | +} | ||
3322 | #endif | ||
3323 | |||
3324 | static const struct dev_pm_ops stm32_adc_core_pm_ops = { | ||
3325 | @@ -787,7 +794,7 @@ static const struct dev_pm_ops stm32_adc_core_pm_ops = { | ||
3326 | pm_runtime_force_resume) | ||
3327 | SET_RUNTIME_PM_OPS(stm32_adc_core_runtime_suspend, | ||
3328 | stm32_adc_core_runtime_resume, | ||
3329 | - NULL) | ||
3330 | + stm32_adc_core_runtime_idle) | ||
3331 | }; | ||
3332 | |||
3333 | static const struct stm32_adc_priv_cfg stm32f4_adc_priv_cfg = { | ||
3334 | diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c | ||
3335 | index e3cd9d2b0dd2b..98d2d74b96f78 100644 | ||
3336 | --- a/drivers/infiniband/core/cma.c | ||
3337 | +++ b/drivers/infiniband/core/cma.c | ||
3338 | @@ -1803,19 +1803,30 @@ static void cma_release_port(struct rdma_id_private *id_priv) | ||
3339 | mutex_unlock(&lock); | ||
3340 | } | ||
3341 | |||
3342 | -static void cma_leave_roce_mc_group(struct rdma_id_private *id_priv, | ||
3343 | - struct cma_multicast *mc) | ||
3344 | +static void destroy_mc(struct rdma_id_private *id_priv, | ||
3345 | + struct cma_multicast *mc) | ||
3346 | { | ||
3347 | - struct rdma_dev_addr *dev_addr = &id_priv->id.route.addr.dev_addr; | ||
3348 | - struct net_device *ndev = NULL; | ||
3349 | + if (rdma_cap_ib_mcast(id_priv->id.device, id_priv->id.port_num)) { | ||
3350 | + ib_sa_free_multicast(mc->multicast.ib); | ||
3351 | + kfree(mc); | ||
3352 | + return; | ||
3353 | + } | ||
3354 | |||
3355 | - if (dev_addr->bound_dev_if) | ||
3356 | - ndev = dev_get_by_index(dev_addr->net, dev_addr->bound_dev_if); | ||
3357 | - if (ndev) { | ||
3358 | - cma_igmp_send(ndev, &mc->multicast.ib->rec.mgid, false); | ||
3359 | - dev_put(ndev); | ||
3360 | + if (rdma_protocol_roce(id_priv->id.device, | ||
3361 | + id_priv->id.port_num)) { | ||
3362 | + struct rdma_dev_addr *dev_addr = | ||
3363 | + &id_priv->id.route.addr.dev_addr; | ||
3364 | + struct net_device *ndev = NULL; | ||
3365 | + | ||
3366 | + if (dev_addr->bound_dev_if) | ||
3367 | + ndev = dev_get_by_index(dev_addr->net, | ||
3368 | + dev_addr->bound_dev_if); | ||
3369 | + if (ndev) { | ||
3370 | + cma_igmp_send(ndev, &mc->multicast.ib->rec.mgid, false); | ||
3371 | + dev_put(ndev); | ||
3372 | + } | ||
3373 | + kref_put(&mc->mcref, release_mc); | ||
3374 | } | ||
3375 | - kref_put(&mc->mcref, release_mc); | ||
3376 | } | ||
3377 | |||
3378 | static void cma_leave_mc_groups(struct rdma_id_private *id_priv) | ||
3379 | @@ -1823,16 +1834,10 @@ static void cma_leave_mc_groups(struct rdma_id_private *id_priv) | ||
3380 | struct cma_multicast *mc; | ||
3381 | |||
3382 | while (!list_empty(&id_priv->mc_list)) { | ||
3383 | - mc = container_of(id_priv->mc_list.next, | ||
3384 | - struct cma_multicast, list); | ||
3385 | + mc = list_first_entry(&id_priv->mc_list, struct cma_multicast, | ||
3386 | + list); | ||
3387 | list_del(&mc->list); | ||
3388 | - if (rdma_cap_ib_mcast(id_priv->cma_dev->device, | ||
3389 | - id_priv->id.port_num)) { | ||
3390 | - ib_sa_free_multicast(mc->multicast.ib); | ||
3391 | - kfree(mc); | ||
3392 | - } else { | ||
3393 | - cma_leave_roce_mc_group(id_priv, mc); | ||
3394 | - } | ||
3395 | + destroy_mc(id_priv, mc); | ||
3396 | } | ||
3397 | } | ||
3398 | |||
3399 | @@ -4182,16 +4187,6 @@ static int cma_ib_mc_handler(int status, struct ib_sa_multicast *multicast) | ||
3400 | else | ||
3401 | pr_debug_ratelimited("RDMA CM: MULTICAST_ERROR: failed to join multicast. status %d\n", | ||
3402 | status); | ||
3403 | - mutex_lock(&id_priv->qp_mutex); | ||
3404 | - if (!status && id_priv->id.qp) { | ||
3405 | - status = ib_attach_mcast(id_priv->id.qp, &multicast->rec.mgid, | ||
3406 | - be16_to_cpu(multicast->rec.mlid)); | ||
3407 | - if (status) | ||
3408 | - pr_debug_ratelimited("RDMA CM: MULTICAST_ERROR: failed to attach QP. status %d\n", | ||
3409 | - status); | ||
3410 | - } | ||
3411 | - mutex_unlock(&id_priv->qp_mutex); | ||
3412 | - | ||
3413 | event.status = status; | ||
3414 | event.param.ud.private_data = mc->context; | ||
3415 | if (!status) { | ||
3416 | @@ -4446,6 +4441,10 @@ int rdma_join_multicast(struct rdma_cm_id *id, struct sockaddr *addr, | ||
3417 | struct cma_multicast *mc; | ||
3418 | int ret; | ||
3419 | |||
3420 | + /* Not supported for kernel QPs */ | ||
3421 | + if (WARN_ON(id->qp)) | ||
3422 | + return -EINVAL; | ||
3423 | + | ||
3424 | if (!id->device) | ||
3425 | return -EINVAL; | ||
3426 | |||
3427 | @@ -4496,25 +4495,14 @@ void rdma_leave_multicast(struct rdma_cm_id *id, struct sockaddr *addr) | ||
3428 | id_priv = container_of(id, struct rdma_id_private, id); | ||
3429 | spin_lock_irq(&id_priv->lock); | ||
3430 | list_for_each_entry(mc, &id_priv->mc_list, list) { | ||
3431 | - if (!memcmp(&mc->addr, addr, rdma_addr_size(addr))) { | ||
3432 | - list_del(&mc->list); | ||
3433 | - spin_unlock_irq(&id_priv->lock); | ||
3434 | - | ||
3435 | - if (id->qp) | ||
3436 | - ib_detach_mcast(id->qp, | ||
3437 | - &mc->multicast.ib->rec.mgid, | ||
3438 | - be16_to_cpu(mc->multicast.ib->rec.mlid)); | ||
3439 | - | ||
3440 | - BUG_ON(id_priv->cma_dev->device != id->device); | ||
3441 | - | ||
3442 | - if (rdma_cap_ib_mcast(id->device, id->port_num)) { | ||
3443 | - ib_sa_free_multicast(mc->multicast.ib); | ||
3444 | - kfree(mc); | ||
3445 | - } else if (rdma_protocol_roce(id->device, id->port_num)) { | ||
3446 | - cma_leave_roce_mc_group(id_priv, mc); | ||
3447 | - } | ||
3448 | - return; | ||
3449 | - } | ||
3450 | + if (memcmp(&mc->addr, addr, rdma_addr_size(addr)) != 0) | ||
3451 | + continue; | ||
3452 | + list_del(&mc->list); | ||
3453 | + spin_unlock_irq(&id_priv->lock); | ||
3454 | + | ||
3455 | + WARN_ON(id_priv->cma_dev->device != id->device); | ||
3456 | + destroy_mc(id_priv, mc); | ||
3457 | + return; | ||
3458 | } | ||
3459 | spin_unlock_irq(&id_priv->lock); | ||
3460 | } | ||
3461 | diff --git a/drivers/infiniband/core/ucma.c b/drivers/infiniband/core/ucma.c | ||
3462 | index f4f79f1292b91..ef4be14af3bb9 100644 | ||
3463 | --- a/drivers/infiniband/core/ucma.c | ||
3464 | +++ b/drivers/infiniband/core/ucma.c | ||
3465 | @@ -581,6 +581,7 @@ static int ucma_free_ctx(struct ucma_context *ctx) | ||
3466 | list_move_tail(&uevent->list, &list); | ||
3467 | } | ||
3468 | list_del(&ctx->list); | ||
3469 | + events_reported = ctx->events_reported; | ||
3470 | mutex_unlock(&ctx->file->mut); | ||
3471 | |||
3472 | list_for_each_entry_safe(uevent, tmp, &list, list) { | ||
3473 | @@ -590,7 +591,6 @@ static int ucma_free_ctx(struct ucma_context *ctx) | ||
3474 | kfree(uevent); | ||
3475 | } | ||
3476 | |||
3477 | - events_reported = ctx->events_reported; | ||
3478 | mutex_destroy(&ctx->mutex); | ||
3479 | kfree(ctx); | ||
3480 | return events_reported; | ||
3481 | @@ -1473,7 +1473,9 @@ static ssize_t ucma_process_join(struct ucma_file *file, | ||
3482 | return 0; | ||
3483 | |||
3484 | err3: | ||
3485 | + mutex_lock(&ctx->mutex); | ||
3486 | rdma_leave_multicast(ctx->cm_id, (struct sockaddr *) &mc->addr); | ||
3487 | + mutex_unlock(&ctx->mutex); | ||
3488 | ucma_cleanup_mc_events(mc); | ||
3489 | err2: | ||
3490 | xa_erase(&multicast_table, mc->id); | ||
3491 | @@ -1639,7 +1641,9 @@ static ssize_t ucma_migrate_id(struct ucma_file *new_file, | ||
3492 | |||
3493 | cur_file = ctx->file; | ||
3494 | if (cur_file == new_file) { | ||
3495 | + mutex_lock(&cur_file->mut); | ||
3496 | resp.events_reported = ctx->events_reported; | ||
3497 | + mutex_unlock(&cur_file->mut); | ||
3498 | goto response; | ||
3499 | } | ||
3500 | |||
3501 | diff --git a/drivers/infiniband/core/umem.c b/drivers/infiniband/core/umem.c | ||
3502 | index 0d42ba8c0b696..650f71dd4ab93 100644 | ||
3503 | --- a/drivers/infiniband/core/umem.c | ||
3504 | +++ b/drivers/infiniband/core/umem.c | ||
3505 | @@ -151,13 +151,24 @@ unsigned long ib_umem_find_best_pgsz(struct ib_umem *umem, | ||
3506 | dma_addr_t mask; | ||
3507 | int i; | ||
3508 | |||
3509 | + /* rdma_for_each_block() has a bug if the page size is smaller than the | ||
3510 | + * page size used to build the umem. For now prevent smaller page sizes | ||
3511 | + * from being returned. | ||
3512 | + */ | ||
3513 | + pgsz_bitmap &= GENMASK(BITS_PER_LONG - 1, PAGE_SHIFT); | ||
3514 | + | ||
3515 | /* At minimum, drivers must support PAGE_SIZE or smaller */ | ||
3516 | if (WARN_ON(!(pgsz_bitmap & GENMASK(PAGE_SHIFT, 0)))) | ||
3517 | return 0; | ||
3518 | |||
3519 | va = virt; | ||
3520 | - /* max page size not to exceed MR length */ | ||
3521 | - mask = roundup_pow_of_two(umem->length); | ||
3522 | + /* The best result is the smallest page size that results in the minimum | ||
3523 | + * number of required pages. Compute the largest page size that could | ||
3524 | + * work based on VA address bits that don't change. | ||
3525 | + */ | ||
3526 | + mask = pgsz_bitmap & | ||
3527 | + GENMASK(BITS_PER_LONG - 1, | ||
3528 | + bits_per((umem->length - 1 + virt) ^ virt)); | ||
3529 | /* offset into first SGL */ | ||
3530 | pgoff = umem->address & ~PAGE_MASK; | ||
3531 | |||
3532 | diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v1.c b/drivers/infiniband/hw/hns/hns_roce_hw_v1.c | ||
3533 | index a79fa67df8715..a405c64d2a82b 100644 | ||
3534 | --- a/drivers/infiniband/hw/hns/hns_roce_hw_v1.c | ||
3535 | +++ b/drivers/infiniband/hw/hns/hns_roce_hw_v1.c | ||
3536 | @@ -271,7 +271,6 @@ static int hns_roce_v1_post_send(struct ib_qp *ibqp, | ||
3537 | ps_opcode = HNS_ROCE_WQE_OPCODE_SEND; | ||
3538 | break; | ||
3539 | case IB_WR_LOCAL_INV: | ||
3540 | - break; | ||
3541 | case IB_WR_ATOMIC_CMP_AND_SWP: | ||
3542 | case IB_WR_ATOMIC_FETCH_AND_ADD: | ||
3543 | case IB_WR_LSO: | ||
3544 | diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c | ||
3545 | index 0502c90c83edd..bb75328193957 100644 | ||
3546 | --- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c | ||
3547 | +++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c | ||
3548 | @@ -4616,7 +4616,9 @@ static int hns_roce_v2_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr, | ||
3549 | qp_attr->retry_cnt = roce_get_field(context.byte_212_lsn, | ||
3550 | V2_QPC_BYTE_212_RETRY_CNT_M, | ||
3551 | V2_QPC_BYTE_212_RETRY_CNT_S); | ||
3552 | - qp_attr->rnr_retry = le32_to_cpu(context.rq_rnr_timer); | ||
3553 | + qp_attr->rnr_retry = roce_get_field(context.byte_244_rnr_rxack, | ||
3554 | + V2_QPC_BYTE_244_RNR_CNT_M, | ||
3555 | + V2_QPC_BYTE_244_RNR_CNT_S); | ||
3556 | |||
3557 | done: | ||
3558 | qp_attr->cur_qp_state = qp_attr->qp_state; | ||
3559 | @@ -4632,6 +4634,7 @@ done: | ||
3560 | } | ||
3561 | |||
3562 | qp_init_attr->cap = qp_attr->cap; | ||
3563 | + qp_init_attr->sq_sig_type = hr_qp->sq_signal_bits; | ||
3564 | |||
3565 | out: | ||
3566 | mutex_unlock(&hr_qp->mutex); | ||
3567 | diff --git a/drivers/infiniband/hw/hns/hns_roce_qp.c b/drivers/infiniband/hw/hns/hns_roce_qp.c | ||
3568 | index 8dd2d666f6875..730e50c87a760 100644 | ||
3569 | --- a/drivers/infiniband/hw/hns/hns_roce_qp.c | ||
3570 | +++ b/drivers/infiniband/hw/hns/hns_roce_qp.c | ||
3571 | @@ -1181,8 +1181,10 @@ int hns_roce_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, | ||
3572 | |||
3573 | mutex_lock(&hr_qp->mutex); | ||
3574 | |||
3575 | - cur_state = attr_mask & IB_QP_CUR_STATE ? | ||
3576 | - attr->cur_qp_state : (enum ib_qp_state)hr_qp->state; | ||
3577 | + if (attr_mask & IB_QP_CUR_STATE && attr->cur_qp_state != hr_qp->state) | ||
3578 | + goto out; | ||
3579 | + | ||
3580 | + cur_state = hr_qp->state; | ||
3581 | new_state = attr_mask & IB_QP_STATE ? attr->qp_state : cur_state; | ||
3582 | |||
3583 | if (ibqp->uobject && | ||
3584 | diff --git a/drivers/infiniband/hw/i40iw/i40iw.h b/drivers/infiniband/hw/i40iw/i40iw.h | ||
3585 | index 8feec35f95a7c..6d6719fa7e46a 100644 | ||
3586 | --- a/drivers/infiniband/hw/i40iw/i40iw.h | ||
3587 | +++ b/drivers/infiniband/hw/i40iw/i40iw.h | ||
3588 | @@ -398,8 +398,8 @@ static inline struct i40iw_qp *to_iwqp(struct ib_qp *ibqp) | ||
3589 | } | ||
3590 | |||
3591 | /* i40iw.c */ | ||
3592 | -void i40iw_add_ref(struct ib_qp *); | ||
3593 | -void i40iw_rem_ref(struct ib_qp *); | ||
3594 | +void i40iw_qp_add_ref(struct ib_qp *ibqp); | ||
3595 | +void i40iw_qp_rem_ref(struct ib_qp *ibqp); | ||
3596 | struct ib_qp *i40iw_get_qp(struct ib_device *, int); | ||
3597 | |||
3598 | void i40iw_flush_wqes(struct i40iw_device *iwdev, | ||
3599 | @@ -543,9 +543,8 @@ enum i40iw_status_code i40iw_manage_qhash(struct i40iw_device *iwdev, | ||
3600 | bool wait); | ||
3601 | void i40iw_receive_ilq(struct i40iw_sc_vsi *vsi, struct i40iw_puda_buf *rbuf); | ||
3602 | void i40iw_free_sqbuf(struct i40iw_sc_vsi *vsi, void *bufp); | ||
3603 | -void i40iw_free_qp_resources(struct i40iw_device *iwdev, | ||
3604 | - struct i40iw_qp *iwqp, | ||
3605 | - u32 qp_num); | ||
3606 | +void i40iw_free_qp_resources(struct i40iw_qp *iwqp); | ||
3607 | + | ||
3608 | enum i40iw_status_code i40iw_obj_aligned_mem(struct i40iw_device *iwdev, | ||
3609 | struct i40iw_dma_mem *memptr, | ||
3610 | u32 size, u32 mask); | ||
3611 | diff --git a/drivers/infiniband/hw/i40iw/i40iw_cm.c b/drivers/infiniband/hw/i40iw/i40iw_cm.c | ||
3612 | index fa7a5ff498c73..56c1e9abc52dc 100644 | ||
3613 | --- a/drivers/infiniband/hw/i40iw/i40iw_cm.c | ||
3614 | +++ b/drivers/infiniband/hw/i40iw/i40iw_cm.c | ||
3615 | @@ -2322,7 +2322,7 @@ static void i40iw_rem_ref_cm_node(struct i40iw_cm_node *cm_node) | ||
3616 | iwqp = cm_node->iwqp; | ||
3617 | if (iwqp) { | ||
3618 | iwqp->cm_node = NULL; | ||
3619 | - i40iw_rem_ref(&iwqp->ibqp); | ||
3620 | + i40iw_qp_rem_ref(&iwqp->ibqp); | ||
3621 | cm_node->iwqp = NULL; | ||
3622 | } else if (cm_node->qhash_set) { | ||
3623 | i40iw_get_addr_info(cm_node, &nfo); | ||
3624 | @@ -3452,7 +3452,7 @@ void i40iw_cm_disconn(struct i40iw_qp *iwqp) | ||
3625 | kfree(work); | ||
3626 | return; | ||
3627 | } | ||
3628 | - i40iw_add_ref(&iwqp->ibqp); | ||
3629 | + i40iw_qp_add_ref(&iwqp->ibqp); | ||
3630 | spin_unlock_irqrestore(&iwdev->qptable_lock, flags); | ||
3631 | |||
3632 | work->iwqp = iwqp; | ||
3633 | @@ -3623,7 +3623,7 @@ static void i40iw_disconnect_worker(struct work_struct *work) | ||
3634 | |||
3635 | kfree(dwork); | ||
3636 | i40iw_cm_disconn_true(iwqp); | ||
3637 | - i40iw_rem_ref(&iwqp->ibqp); | ||
3638 | + i40iw_qp_rem_ref(&iwqp->ibqp); | ||
3639 | } | ||
3640 | |||
3641 | /** | ||
3642 | @@ -3745,7 +3745,7 @@ int i40iw_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) | ||
3643 | cm_node->lsmm_size = accept.size + conn_param->private_data_len; | ||
3644 | i40iw_cm_init_tsa_conn(iwqp, cm_node); | ||
3645 | cm_id->add_ref(cm_id); | ||
3646 | - i40iw_add_ref(&iwqp->ibqp); | ||
3647 | + i40iw_qp_add_ref(&iwqp->ibqp); | ||
3648 | |||
3649 | attr.qp_state = IB_QPS_RTS; | ||
3650 | cm_node->qhash_set = false; | ||
3651 | @@ -3908,7 +3908,7 @@ int i40iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) | ||
3652 | iwqp->cm_node = cm_node; | ||
3653 | cm_node->iwqp = iwqp; | ||
3654 | iwqp->cm_id = cm_id; | ||
3655 | - i40iw_add_ref(&iwqp->ibqp); | ||
3656 | + i40iw_qp_add_ref(&iwqp->ibqp); | ||
3657 | |||
3658 | if (cm_node->state != I40IW_CM_STATE_OFFLOADED) { | ||
3659 | cm_node->state = I40IW_CM_STATE_SYN_SENT; | ||
3660 | diff --git a/drivers/infiniband/hw/i40iw/i40iw_hw.c b/drivers/infiniband/hw/i40iw/i40iw_hw.c | ||
3661 | index ae8b97c306657..a7512508f7e60 100644 | ||
3662 | --- a/drivers/infiniband/hw/i40iw/i40iw_hw.c | ||
3663 | +++ b/drivers/infiniband/hw/i40iw/i40iw_hw.c | ||
3664 | @@ -313,7 +313,7 @@ void i40iw_process_aeq(struct i40iw_device *iwdev) | ||
3665 | __func__, info->qp_cq_id); | ||
3666 | continue; | ||
3667 | } | ||
3668 | - i40iw_add_ref(&iwqp->ibqp); | ||
3669 | + i40iw_qp_add_ref(&iwqp->ibqp); | ||
3670 | spin_unlock_irqrestore(&iwdev->qptable_lock, flags); | ||
3671 | qp = &iwqp->sc_qp; | ||
3672 | spin_lock_irqsave(&iwqp->lock, flags); | ||
3673 | @@ -427,7 +427,7 @@ void i40iw_process_aeq(struct i40iw_device *iwdev) | ||
3674 | break; | ||
3675 | } | ||
3676 | if (info->qp) | ||
3677 | - i40iw_rem_ref(&iwqp->ibqp); | ||
3678 | + i40iw_qp_rem_ref(&iwqp->ibqp); | ||
3679 | } while (1); | ||
3680 | |||
3681 | if (aeqcnt) | ||
3682 | diff --git a/drivers/infiniband/hw/i40iw/i40iw_utils.c b/drivers/infiniband/hw/i40iw/i40iw_utils.c | ||
3683 | index 016524683e17e..72db7c1dc2998 100644 | ||
3684 | --- a/drivers/infiniband/hw/i40iw/i40iw_utils.c | ||
3685 | +++ b/drivers/infiniband/hw/i40iw/i40iw_utils.c | ||
3686 | @@ -479,25 +479,6 @@ void i40iw_cleanup_pending_cqp_op(struct i40iw_device *iwdev) | ||
3687 | } | ||
3688 | } | ||
3689 | |||
3690 | -/** | ||
3691 | - * i40iw_free_qp - callback after destroy cqp completes | ||
3692 | - * @cqp_request: cqp request for destroy qp | ||
3693 | - * @num: not used | ||
3694 | - */ | ||
3695 | -static void i40iw_free_qp(struct i40iw_cqp_request *cqp_request, u32 num) | ||
3696 | -{ | ||
3697 | - struct i40iw_sc_qp *qp = (struct i40iw_sc_qp *)cqp_request->param; | ||
3698 | - struct i40iw_qp *iwqp = (struct i40iw_qp *)qp->back_qp; | ||
3699 | - struct i40iw_device *iwdev; | ||
3700 | - u32 qp_num = iwqp->ibqp.qp_num; | ||
3701 | - | ||
3702 | - iwdev = iwqp->iwdev; | ||
3703 | - | ||
3704 | - i40iw_rem_pdusecount(iwqp->iwpd, iwdev); | ||
3705 | - i40iw_free_qp_resources(iwdev, iwqp, qp_num); | ||
3706 | - i40iw_rem_devusecount(iwdev); | ||
3707 | -} | ||
3708 | - | ||
3709 | /** | ||
3710 | * i40iw_wait_event - wait for completion | ||
3711 | * @iwdev: iwarp device | ||
3712 | @@ -618,26 +599,23 @@ void i40iw_rem_pdusecount(struct i40iw_pd *iwpd, struct i40iw_device *iwdev) | ||
3713 | } | ||
3714 | |||
3715 | /** | ||
3716 | - * i40iw_add_ref - add refcount for qp | ||
3717 | + * i40iw_qp_add_ref - add refcount for qp | ||
3718 | * @ibqp: iqarp qp | ||
3719 | */ | ||
3720 | -void i40iw_add_ref(struct ib_qp *ibqp) | ||
3721 | +void i40iw_qp_add_ref(struct ib_qp *ibqp) | ||
3722 | { | ||
3723 | struct i40iw_qp *iwqp = (struct i40iw_qp *)ibqp; | ||
3724 | |||
3725 | - atomic_inc(&iwqp->refcount); | ||
3726 | + refcount_inc(&iwqp->refcount); | ||
3727 | } | ||
3728 | |||
3729 | /** | ||
3730 | - * i40iw_rem_ref - rem refcount for qp and free if 0 | ||
3731 | + * i40iw_qp_rem_ref - rem refcount for qp and free if 0 | ||
3732 | * @ibqp: iqarp qp | ||
3733 | */ | ||
3734 | -void i40iw_rem_ref(struct ib_qp *ibqp) | ||
3735 | +void i40iw_qp_rem_ref(struct ib_qp *ibqp) | ||
3736 | { | ||
3737 | struct i40iw_qp *iwqp; | ||
3738 | - enum i40iw_status_code status; | ||
3739 | - struct i40iw_cqp_request *cqp_request; | ||
3740 | - struct cqp_commands_info *cqp_info; | ||
3741 | struct i40iw_device *iwdev; | ||
3742 | u32 qp_num; | ||
3743 | unsigned long flags; | ||
3744 | @@ -645,7 +623,7 @@ void i40iw_rem_ref(struct ib_qp *ibqp) | ||
3745 | iwqp = to_iwqp(ibqp); | ||
3746 | iwdev = iwqp->iwdev; | ||
3747 | spin_lock_irqsave(&iwdev->qptable_lock, flags); | ||
3748 | - if (!atomic_dec_and_test(&iwqp->refcount)) { | ||
3749 | + if (!refcount_dec_and_test(&iwqp->refcount)) { | ||
3750 | spin_unlock_irqrestore(&iwdev->qptable_lock, flags); | ||
3751 | return; | ||
3752 | } | ||
3753 | @@ -653,25 +631,8 @@ void i40iw_rem_ref(struct ib_qp *ibqp) | ||
3754 | qp_num = iwqp->ibqp.qp_num; | ||
3755 | iwdev->qp_table[qp_num] = NULL; | ||
3756 | spin_unlock_irqrestore(&iwdev->qptable_lock, flags); | ||
3757 | - cqp_request = i40iw_get_cqp_request(&iwdev->cqp, false); | ||
3758 | - if (!cqp_request) | ||
3759 | - return; | ||
3760 | - | ||
3761 | - cqp_request->callback_fcn = i40iw_free_qp; | ||
3762 | - cqp_request->param = (void *)&iwqp->sc_qp; | ||
3763 | - cqp_info = &cqp_request->info; | ||
3764 | - cqp_info->cqp_cmd = OP_QP_DESTROY; | ||
3765 | - cqp_info->post_sq = 1; | ||
3766 | - cqp_info->in.u.qp_destroy.qp = &iwqp->sc_qp; | ||
3767 | - cqp_info->in.u.qp_destroy.scratch = (uintptr_t)cqp_request; | ||
3768 | - cqp_info->in.u.qp_destroy.remove_hash_idx = true; | ||
3769 | - status = i40iw_handle_cqp_op(iwdev, cqp_request); | ||
3770 | - if (!status) | ||
3771 | - return; | ||
3772 | + complete(&iwqp->free_qp); | ||
3773 | |||
3774 | - i40iw_rem_pdusecount(iwqp->iwpd, iwdev); | ||
3775 | - i40iw_free_qp_resources(iwdev, iwqp, qp_num); | ||
3776 | - i40iw_rem_devusecount(iwdev); | ||
3777 | } | ||
3778 | |||
3779 | /** | ||
3780 | @@ -938,7 +899,7 @@ static void i40iw_terminate_timeout(struct timer_list *t) | ||
3781 | struct i40iw_sc_qp *qp = (struct i40iw_sc_qp *)&iwqp->sc_qp; | ||
3782 | |||
3783 | i40iw_terminate_done(qp, 1); | ||
3784 | - i40iw_rem_ref(&iwqp->ibqp); | ||
3785 | + i40iw_qp_rem_ref(&iwqp->ibqp); | ||
3786 | } | ||
3787 | |||
3788 | /** | ||
3789 | @@ -950,7 +911,7 @@ void i40iw_terminate_start_timer(struct i40iw_sc_qp *qp) | ||
3790 | struct i40iw_qp *iwqp; | ||
3791 | |||
3792 | iwqp = (struct i40iw_qp *)qp->back_qp; | ||
3793 | - i40iw_add_ref(&iwqp->ibqp); | ||
3794 | + i40iw_qp_add_ref(&iwqp->ibqp); | ||
3795 | timer_setup(&iwqp->terminate_timer, i40iw_terminate_timeout, 0); | ||
3796 | iwqp->terminate_timer.expires = jiffies + HZ; | ||
3797 | add_timer(&iwqp->terminate_timer); | ||
3798 | @@ -966,7 +927,7 @@ void i40iw_terminate_del_timer(struct i40iw_sc_qp *qp) | ||
3799 | |||
3800 | iwqp = (struct i40iw_qp *)qp->back_qp; | ||
3801 | if (del_timer(&iwqp->terminate_timer)) | ||
3802 | - i40iw_rem_ref(&iwqp->ibqp); | ||
3803 | + i40iw_qp_rem_ref(&iwqp->ibqp); | ||
3804 | } | ||
3805 | |||
3806 | /** | ||
3807 | diff --git a/drivers/infiniband/hw/i40iw/i40iw_verbs.c b/drivers/infiniband/hw/i40iw/i40iw_verbs.c | ||
3808 | index cd9ee1664a69e..22bf4f09c0647 100644 | ||
3809 | --- a/drivers/infiniband/hw/i40iw/i40iw_verbs.c | ||
3810 | +++ b/drivers/infiniband/hw/i40iw/i40iw_verbs.c | ||
3811 | @@ -366,11 +366,11 @@ static struct i40iw_pbl *i40iw_get_pbl(unsigned long va, | ||
3812 | * @iwqp: qp ptr (user or kernel) | ||
3813 | * @qp_num: qp number assigned | ||
3814 | */ | ||
3815 | -void i40iw_free_qp_resources(struct i40iw_device *iwdev, | ||
3816 | - struct i40iw_qp *iwqp, | ||
3817 | - u32 qp_num) | ||
3818 | +void i40iw_free_qp_resources(struct i40iw_qp *iwqp) | ||
3819 | { | ||
3820 | struct i40iw_pbl *iwpbl = &iwqp->iwpbl; | ||
3821 | + struct i40iw_device *iwdev = iwqp->iwdev; | ||
3822 | + u32 qp_num = iwqp->ibqp.qp_num; | ||
3823 | |||
3824 | i40iw_ieq_cleanup_qp(iwdev->vsi.ieq, &iwqp->sc_qp); | ||
3825 | i40iw_dealloc_push_page(iwdev, &iwqp->sc_qp); | ||
3826 | @@ -404,6 +404,10 @@ static void i40iw_clean_cqes(struct i40iw_qp *iwqp, struct i40iw_cq *iwcq) | ||
3827 | static int i40iw_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata) | ||
3828 | { | ||
3829 | struct i40iw_qp *iwqp = to_iwqp(ibqp); | ||
3830 | + struct ib_qp_attr attr; | ||
3831 | + struct i40iw_device *iwdev = iwqp->iwdev; | ||
3832 | + | ||
3833 | + memset(&attr, 0, sizeof(attr)); | ||
3834 | |||
3835 | iwqp->destroyed = 1; | ||
3836 | |||
3837 | @@ -418,7 +422,15 @@ static int i40iw_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata) | ||
3838 | } | ||
3839 | } | ||
3840 | |||
3841 | - i40iw_rem_ref(&iwqp->ibqp); | ||
3842 | + attr.qp_state = IB_QPS_ERR; | ||
3843 | + i40iw_modify_qp(&iwqp->ibqp, &attr, IB_QP_STATE, NULL); | ||
3844 | + i40iw_qp_rem_ref(&iwqp->ibqp); | ||
3845 | + wait_for_completion(&iwqp->free_qp); | ||
3846 | + i40iw_cqp_qp_destroy_cmd(&iwdev->sc_dev, &iwqp->sc_qp); | ||
3847 | + i40iw_rem_pdusecount(iwqp->iwpd, iwdev); | ||
3848 | + i40iw_free_qp_resources(iwqp); | ||
3849 | + i40iw_rem_devusecount(iwdev); | ||
3850 | + | ||
3851 | return 0; | ||
3852 | } | ||
3853 | |||
3854 | @@ -579,6 +591,7 @@ static struct ib_qp *i40iw_create_qp(struct ib_pd *ibpd, | ||
3855 | qp->back_qp = (void *)iwqp; | ||
3856 | qp->push_idx = I40IW_INVALID_PUSH_PAGE_INDEX; | ||
3857 | |||
3858 | + iwqp->iwdev = iwdev; | ||
3859 | iwqp->ctx_info.iwarp_info = &iwqp->iwarp_info; | ||
3860 | |||
3861 | if (i40iw_allocate_dma_mem(dev->hw, | ||
3862 | @@ -603,7 +616,6 @@ static struct ib_qp *i40iw_create_qp(struct ib_pd *ibpd, | ||
3863 | goto error; | ||
3864 | } | ||
3865 | |||
3866 | - iwqp->iwdev = iwdev; | ||
3867 | iwqp->iwpd = iwpd; | ||
3868 | iwqp->ibqp.qp_num = qp_num; | ||
3869 | qp = &iwqp->sc_qp; | ||
3870 | @@ -717,7 +729,7 @@ static struct ib_qp *i40iw_create_qp(struct ib_pd *ibpd, | ||
3871 | goto error; | ||
3872 | } | ||
3873 | |||
3874 | - i40iw_add_ref(&iwqp->ibqp); | ||
3875 | + refcount_set(&iwqp->refcount, 1); | ||
3876 | spin_lock_init(&iwqp->lock); | ||
3877 | iwqp->sig_all = (init_attr->sq_sig_type == IB_SIGNAL_ALL_WR) ? 1 : 0; | ||
3878 | iwdev->qp_table[qp_num] = iwqp; | ||
3879 | @@ -739,10 +751,11 @@ static struct ib_qp *i40iw_create_qp(struct ib_pd *ibpd, | ||
3880 | } | ||
3881 | init_completion(&iwqp->sq_drained); | ||
3882 | init_completion(&iwqp->rq_drained); | ||
3883 | + init_completion(&iwqp->free_qp); | ||
3884 | |||
3885 | return &iwqp->ibqp; | ||
3886 | error: | ||
3887 | - i40iw_free_qp_resources(iwdev, iwqp, qp_num); | ||
3888 | + i40iw_free_qp_resources(iwqp); | ||
3889 | return ERR_PTR(err_code); | ||
3890 | } | ||
3891 | |||
3892 | @@ -2654,13 +2667,13 @@ static const struct ib_device_ops i40iw_dev_ops = { | ||
3893 | .get_hw_stats = i40iw_get_hw_stats, | ||
3894 | .get_port_immutable = i40iw_port_immutable, | ||
3895 | .iw_accept = i40iw_accept, | ||
3896 | - .iw_add_ref = i40iw_add_ref, | ||
3897 | + .iw_add_ref = i40iw_qp_add_ref, | ||
3898 | .iw_connect = i40iw_connect, | ||
3899 | .iw_create_listen = i40iw_create_listen, | ||
3900 | .iw_destroy_listen = i40iw_destroy_listen, | ||
3901 | .iw_get_qp = i40iw_get_qp, | ||
3902 | .iw_reject = i40iw_reject, | ||
3903 | - .iw_rem_ref = i40iw_rem_ref, | ||
3904 | + .iw_rem_ref = i40iw_qp_rem_ref, | ||
3905 | .map_mr_sg = i40iw_map_mr_sg, | ||
3906 | .mmap = i40iw_mmap, | ||
3907 | .modify_qp = i40iw_modify_qp, | ||
3908 | diff --git a/drivers/infiniband/hw/i40iw/i40iw_verbs.h b/drivers/infiniband/hw/i40iw/i40iw_verbs.h | ||
3909 | index 3a413752ccc38..ad7d81041bc9a 100644 | ||
3910 | --- a/drivers/infiniband/hw/i40iw/i40iw_verbs.h | ||
3911 | +++ b/drivers/infiniband/hw/i40iw/i40iw_verbs.h | ||
3912 | @@ -140,7 +140,7 @@ struct i40iw_qp { | ||
3913 | struct i40iw_qp_host_ctx_info ctx_info; | ||
3914 | struct i40iwarp_offload_info iwarp_info; | ||
3915 | void *allocated_buffer; | ||
3916 | - atomic_t refcount; | ||
3917 | + refcount_t refcount; | ||
3918 | struct iw_cm_id *cm_id; | ||
3919 | void *cm_node; | ||
3920 | struct ib_mr *lsmm_mr; | ||
3921 | @@ -175,5 +175,6 @@ struct i40iw_qp { | ||
3922 | struct i40iw_dma_mem ietf_mem; | ||
3923 | struct completion sq_drained; | ||
3924 | struct completion rq_drained; | ||
3925 | + struct completion free_qp; | ||
3926 | }; | ||
3927 | #endif | ||
3928 | diff --git a/drivers/infiniband/hw/mlx4/cm.c b/drivers/infiniband/hw/mlx4/cm.c | ||
3929 | index b591861934b3c..81d6a3460b55d 100644 | ||
3930 | --- a/drivers/infiniband/hw/mlx4/cm.c | ||
3931 | +++ b/drivers/infiniband/hw/mlx4/cm.c | ||
3932 | @@ -280,6 +280,9 @@ static void schedule_delayed(struct ib_device *ibdev, struct id_map_entry *id) | ||
3933 | if (!sriov->is_going_down && !id->scheduled_delete) { | ||
3934 | id->scheduled_delete = 1; | ||
3935 | schedule_delayed_work(&id->timeout, CM_CLEANUP_CACHE_TIMEOUT); | ||
3936 | + } else if (id->scheduled_delete) { | ||
3937 | + /* Adjust timeout if already scheduled */ | ||
3938 | + mod_delayed_work(system_wq, &id->timeout, CM_CLEANUP_CACHE_TIMEOUT); | ||
3939 | } | ||
3940 | spin_unlock_irqrestore(&sriov->going_down_lock, flags); | ||
3941 | spin_unlock(&sriov->id_map_lock); | ||
3942 | diff --git a/drivers/infiniband/hw/mlx4/mad.c b/drivers/infiniband/hw/mlx4/mad.c | ||
3943 | index 57079110af9b5..08eccf2b6967d 100644 | ||
3944 | --- a/drivers/infiniband/hw/mlx4/mad.c | ||
3945 | +++ b/drivers/infiniband/hw/mlx4/mad.c | ||
3946 | @@ -1307,6 +1307,18 @@ static void mlx4_ib_tunnel_comp_handler(struct ib_cq *cq, void *arg) | ||
3947 | spin_unlock_irqrestore(&dev->sriov.going_down_lock, flags); | ||
3948 | } | ||
3949 | |||
3950 | +static void mlx4_ib_wire_comp_handler(struct ib_cq *cq, void *arg) | ||
3951 | +{ | ||
3952 | + unsigned long flags; | ||
3953 | + struct mlx4_ib_demux_pv_ctx *ctx = cq->cq_context; | ||
3954 | + struct mlx4_ib_dev *dev = to_mdev(ctx->ib_dev); | ||
3955 | + | ||
3956 | + spin_lock_irqsave(&dev->sriov.going_down_lock, flags); | ||
3957 | + if (!dev->sriov.is_going_down && ctx->state == DEMUX_PV_STATE_ACTIVE) | ||
3958 | + queue_work(ctx->wi_wq, &ctx->work); | ||
3959 | + spin_unlock_irqrestore(&dev->sriov.going_down_lock, flags); | ||
3960 | +} | ||
3961 | + | ||
3962 | static int mlx4_ib_post_pv_qp_buf(struct mlx4_ib_demux_pv_ctx *ctx, | ||
3963 | struct mlx4_ib_demux_pv_qp *tun_qp, | ||
3964 | int index) | ||
3965 | @@ -2009,7 +2021,8 @@ static int create_pv_resources(struct ib_device *ibdev, int slave, int port, | ||
3966 | cq_size *= 2; | ||
3967 | |||
3968 | cq_attr.cqe = cq_size; | ||
3969 | - ctx->cq = ib_create_cq(ctx->ib_dev, mlx4_ib_tunnel_comp_handler, | ||
3970 | + ctx->cq = ib_create_cq(ctx->ib_dev, | ||
3971 | + create_tun ? mlx4_ib_tunnel_comp_handler : mlx4_ib_wire_comp_handler, | ||
3972 | NULL, ctx, &cq_attr); | ||
3973 | if (IS_ERR(ctx->cq)) { | ||
3974 | ret = PTR_ERR(ctx->cq); | ||
3975 | @@ -2046,6 +2059,7 @@ static int create_pv_resources(struct ib_device *ibdev, int slave, int port, | ||
3976 | INIT_WORK(&ctx->work, mlx4_ib_sqp_comp_worker); | ||
3977 | |||
3978 | ctx->wq = to_mdev(ibdev)->sriov.demux[port - 1].wq; | ||
3979 | + ctx->wi_wq = to_mdev(ibdev)->sriov.demux[port - 1].wi_wq; | ||
3980 | |||
3981 | ret = ib_req_notify_cq(ctx->cq, IB_CQ_NEXT_COMP); | ||
3982 | if (ret) { | ||
3983 | @@ -2189,7 +2203,7 @@ static int mlx4_ib_alloc_demux_ctx(struct mlx4_ib_dev *dev, | ||
3984 | goto err_mcg; | ||
3985 | } | ||
3986 | |||
3987 | - snprintf(name, sizeof name, "mlx4_ibt%d", port); | ||
3988 | + snprintf(name, sizeof(name), "mlx4_ibt%d", port); | ||
3989 | ctx->wq = alloc_ordered_workqueue(name, WQ_MEM_RECLAIM); | ||
3990 | if (!ctx->wq) { | ||
3991 | pr_err("Failed to create tunnelling WQ for port %d\n", port); | ||
3992 | @@ -2197,7 +2211,15 @@ static int mlx4_ib_alloc_demux_ctx(struct mlx4_ib_dev *dev, | ||
3993 | goto err_wq; | ||
3994 | } | ||
3995 | |||
3996 | - snprintf(name, sizeof name, "mlx4_ibud%d", port); | ||
3997 | + snprintf(name, sizeof(name), "mlx4_ibwi%d", port); | ||
3998 | + ctx->wi_wq = alloc_ordered_workqueue(name, WQ_MEM_RECLAIM); | ||
3999 | + if (!ctx->wi_wq) { | ||
4000 | + pr_err("Failed to create wire WQ for port %d\n", port); | ||
4001 | + ret = -ENOMEM; | ||
4002 | + goto err_wiwq; | ||
4003 | + } | ||
4004 | + | ||
4005 | + snprintf(name, sizeof(name), "mlx4_ibud%d", port); | ||
4006 | ctx->ud_wq = alloc_ordered_workqueue(name, WQ_MEM_RECLAIM); | ||
4007 | if (!ctx->ud_wq) { | ||
4008 | pr_err("Failed to create up/down WQ for port %d\n", port); | ||
4009 | @@ -2208,6 +2230,10 @@ static int mlx4_ib_alloc_demux_ctx(struct mlx4_ib_dev *dev, | ||
4010 | return 0; | ||
4011 | |||
4012 | err_udwq: | ||
4013 | + destroy_workqueue(ctx->wi_wq); | ||
4014 | + ctx->wi_wq = NULL; | ||
4015 | + | ||
4016 | +err_wiwq: | ||
4017 | destroy_workqueue(ctx->wq); | ||
4018 | ctx->wq = NULL; | ||
4019 | |||
4020 | @@ -2255,12 +2281,14 @@ static void mlx4_ib_free_demux_ctx(struct mlx4_ib_demux_ctx *ctx) | ||
4021 | ctx->tun[i]->state = DEMUX_PV_STATE_DOWNING; | ||
4022 | } | ||
4023 | flush_workqueue(ctx->wq); | ||
4024 | + flush_workqueue(ctx->wi_wq); | ||
4025 | for (i = 0; i < dev->dev->caps.sqp_demux; i++) { | ||
4026 | destroy_pv_resources(dev, i, ctx->port, ctx->tun[i], 0); | ||
4027 | free_pv_object(dev, i, ctx->port); | ||
4028 | } | ||
4029 | kfree(ctx->tun); | ||
4030 | destroy_workqueue(ctx->ud_wq); | ||
4031 | + destroy_workqueue(ctx->wi_wq); | ||
4032 | destroy_workqueue(ctx->wq); | ||
4033 | } | ||
4034 | } | ||
4035 | diff --git a/drivers/infiniband/hw/mlx4/mlx4_ib.h b/drivers/infiniband/hw/mlx4/mlx4_ib.h | ||
4036 | index eb53bb4c0c91c..0173e3931cc7f 100644 | ||
4037 | --- a/drivers/infiniband/hw/mlx4/mlx4_ib.h | ||
4038 | +++ b/drivers/infiniband/hw/mlx4/mlx4_ib.h | ||
4039 | @@ -459,6 +459,7 @@ struct mlx4_ib_demux_pv_ctx { | ||
4040 | struct ib_pd *pd; | ||
4041 | struct work_struct work; | ||
4042 | struct workqueue_struct *wq; | ||
4043 | + struct workqueue_struct *wi_wq; | ||
4044 | struct mlx4_ib_demux_pv_qp qp[2]; | ||
4045 | }; | ||
4046 | |||
4047 | @@ -466,6 +467,7 @@ struct mlx4_ib_demux_ctx { | ||
4048 | struct ib_device *ib_dev; | ||
4049 | int port; | ||
4050 | struct workqueue_struct *wq; | ||
4051 | + struct workqueue_struct *wi_wq; | ||
4052 | struct workqueue_struct *ud_wq; | ||
4053 | spinlock_t ud_lock; | ||
4054 | atomic64_t subnet_prefix; | ||
4055 | diff --git a/drivers/infiniband/hw/mlx5/cq.c b/drivers/infiniband/hw/mlx5/cq.c | ||
4056 | index ff664355de550..73d5b8dc74d86 100644 | ||
4057 | --- a/drivers/infiniband/hw/mlx5/cq.c | ||
4058 | +++ b/drivers/infiniband/hw/mlx5/cq.c | ||
4059 | @@ -167,7 +167,7 @@ static void handle_responder(struct ib_wc *wc, struct mlx5_cqe64 *cqe, | ||
4060 | { | ||
4061 | enum rdma_link_layer ll = rdma_port_get_link_layer(qp->ibqp.device, 1); | ||
4062 | struct mlx5_ib_dev *dev = to_mdev(qp->ibqp.device); | ||
4063 | - struct mlx5_ib_srq *srq; | ||
4064 | + struct mlx5_ib_srq *srq = NULL; | ||
4065 | struct mlx5_ib_wq *wq; | ||
4066 | u16 wqe_ctr; | ||
4067 | u8 roce_packet_type; | ||
4068 | @@ -179,7 +179,8 @@ static void handle_responder(struct ib_wc *wc, struct mlx5_cqe64 *cqe, | ||
4069 | |||
4070 | if (qp->ibqp.xrcd) { | ||
4071 | msrq = mlx5_cmd_get_srq(dev, be32_to_cpu(cqe->srqn)); | ||
4072 | - srq = to_mibsrq(msrq); | ||
4073 | + if (msrq) | ||
4074 | + srq = to_mibsrq(msrq); | ||
4075 | } else { | ||
4076 | srq = to_msrq(qp->ibqp.srq); | ||
4077 | } | ||
4078 | diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c | ||
4079 | index b781ad74e6de4..40c1a05c2445d 100644 | ||
4080 | --- a/drivers/infiniband/hw/mlx5/main.c | ||
4081 | +++ b/drivers/infiniband/hw/mlx5/main.c | ||
4082 | @@ -888,7 +888,9 @@ static int mlx5_ib_query_device(struct ib_device *ibdev, | ||
4083 | /* We support 'Gappy' memory registration too */ | ||
4084 | props->device_cap_flags |= IB_DEVICE_SG_GAPS_REG; | ||
4085 | } | ||
4086 | - props->device_cap_flags |= IB_DEVICE_MEM_MGT_EXTENSIONS; | ||
4087 | + /* IB_WR_REG_MR always requires changing the entity size with UMR */ | ||
4088 | + if (!MLX5_CAP_GEN(dev->mdev, umr_modify_entity_size_disabled)) | ||
4089 | + props->device_cap_flags |= IB_DEVICE_MEM_MGT_EXTENSIONS; | ||
4090 | if (MLX5_CAP_GEN(mdev, sho)) { | ||
4091 | props->device_cap_flags |= IB_DEVICE_INTEGRITY_HANDOVER; | ||
4092 | /* At this stage no support for signature handover */ | ||
4093 | diff --git a/drivers/infiniband/hw/qedr/main.c b/drivers/infiniband/hw/qedr/main.c | ||
4094 | index 4494dab8c3d83..93040c994e2e3 100644 | ||
4095 | --- a/drivers/infiniband/hw/qedr/main.c | ||
4096 | +++ b/drivers/infiniband/hw/qedr/main.c | ||
4097 | @@ -601,7 +601,7 @@ static int qedr_set_device_attr(struct qedr_dev *dev) | ||
4098 | qed_attr = dev->ops->rdma_query_device(dev->rdma_ctx); | ||
4099 | |||
4100 | /* Part 2 - check capabilities */ | ||
4101 | - page_size = ~dev->attr.page_size_caps + 1; | ||
4102 | + page_size = ~qed_attr->page_size_caps + 1; | ||
4103 | if (page_size > PAGE_SIZE) { | ||
4104 | DP_ERR(dev, | ||
4105 | "Kernel PAGE_SIZE is %ld which is smaller than minimum page size (%d) required by qedr\n", | ||
4106 | diff --git a/drivers/infiniband/hw/qedr/qedr_iw_cm.c b/drivers/infiniband/hw/qedr/qedr_iw_cm.c | ||
4107 | index 6dea49e11f5f0..e521f3c3dbbf1 100644 | ||
4108 | --- a/drivers/infiniband/hw/qedr/qedr_iw_cm.c | ||
4109 | +++ b/drivers/infiniband/hw/qedr/qedr_iw_cm.c | ||
4110 | @@ -736,7 +736,7 @@ int qedr_iw_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) | ||
4111 | struct qedr_dev *dev = ep->dev; | ||
4112 | struct qedr_qp *qp; | ||
4113 | struct qed_iwarp_accept_in params; | ||
4114 | - int rc = 0; | ||
4115 | + int rc; | ||
4116 | |||
4117 | DP_DEBUG(dev, QEDR_MSG_IWARP, "Accept on qpid=%d\n", conn_param->qpn); | ||
4118 | |||
4119 | @@ -759,8 +759,10 @@ int qedr_iw_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) | ||
4120 | params.ord = conn_param->ord; | ||
4121 | |||
4122 | if (test_and_set_bit(QEDR_IWARP_CM_WAIT_FOR_CONNECT, | ||
4123 | - &qp->iwarp_cm_flags)) | ||
4124 | + &qp->iwarp_cm_flags)) { | ||
4125 | + rc = -EINVAL; | ||
4126 | goto err; /* QP already destroyed */ | ||
4127 | + } | ||
4128 | |||
4129 | rc = dev->ops->iwarp_accept(dev->rdma_ctx, ¶ms); | ||
4130 | if (rc) { | ||
4131 | diff --git a/drivers/infiniband/hw/qedr/verbs.c b/drivers/infiniband/hw/qedr/verbs.c | ||
4132 | index 16a994fd7d0a7..4408d33646647 100644 | ||
4133 | --- a/drivers/infiniband/hw/qedr/verbs.c | ||
4134 | +++ b/drivers/infiniband/hw/qedr/verbs.c | ||
4135 | @@ -2405,7 +2405,7 @@ int qedr_query_qp(struct ib_qp *ibqp, | ||
4136 | qp_attr->cap.max_recv_wr = qp->rq.max_wr; | ||
4137 | qp_attr->cap.max_send_sge = qp->sq.max_sges; | ||
4138 | qp_attr->cap.max_recv_sge = qp->rq.max_sges; | ||
4139 | - qp_attr->cap.max_inline_data = ROCE_REQ_MAX_INLINE_DATA_SIZE; | ||
4140 | + qp_attr->cap.max_inline_data = dev->attr.max_inline; | ||
4141 | qp_init_attr->cap = qp_attr->cap; | ||
4142 | |||
4143 | qp_attr->ah_attr.type = RDMA_AH_ATTR_TYPE_ROCE; | ||
4144 | @@ -2518,6 +2518,8 @@ int qedr_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata) | ||
4145 | |||
4146 | if (rdma_protocol_iwarp(&dev->ibdev, 1)) | ||
4147 | qedr_iw_qp_rem_ref(&qp->ibqp); | ||
4148 | + else | ||
4149 | + kfree(qp); | ||
4150 | |||
4151 | return 0; | ||
4152 | } | ||
4153 | diff --git a/drivers/infiniband/sw/rdmavt/vt.c b/drivers/infiniband/sw/rdmavt/vt.c | ||
4154 | index 18da1e1ea9797..833f3f1b87f5e 100644 | ||
4155 | --- a/drivers/infiniband/sw/rdmavt/vt.c | ||
4156 | +++ b/drivers/infiniband/sw/rdmavt/vt.c | ||
4157 | @@ -95,9 +95,7 @@ struct rvt_dev_info *rvt_alloc_device(size_t size, int nports) | ||
4158 | if (!rdi) | ||
4159 | return rdi; | ||
4160 | |||
4161 | - rdi->ports = kcalloc(nports, | ||
4162 | - sizeof(struct rvt_ibport **), | ||
4163 | - GFP_KERNEL); | ||
4164 | + rdi->ports = kcalloc(nports, sizeof(*rdi->ports), GFP_KERNEL); | ||
4165 | if (!rdi->ports) | ||
4166 | ib_dealloc_device(&rdi->ibdev); | ||
4167 | |||
4168 | diff --git a/drivers/infiniband/sw/rxe/rxe_recv.c b/drivers/infiniband/sw/rxe/rxe_recv.c | ||
4169 | index 46e111c218fd4..9bfb98056fc2a 100644 | ||
4170 | --- a/drivers/infiniband/sw/rxe/rxe_recv.c | ||
4171 | +++ b/drivers/infiniband/sw/rxe/rxe_recv.c | ||
4172 | @@ -281,6 +281,8 @@ static void rxe_rcv_mcast_pkt(struct rxe_dev *rxe, struct sk_buff *skb) | ||
4173 | struct rxe_mc_elem *mce; | ||
4174 | struct rxe_qp *qp; | ||
4175 | union ib_gid dgid; | ||
4176 | + struct sk_buff *per_qp_skb; | ||
4177 | + struct rxe_pkt_info *per_qp_pkt; | ||
4178 | int err; | ||
4179 | |||
4180 | if (skb->protocol == htons(ETH_P_IP)) | ||
4181 | @@ -309,21 +311,29 @@ static void rxe_rcv_mcast_pkt(struct rxe_dev *rxe, struct sk_buff *skb) | ||
4182 | if (err) | ||
4183 | continue; | ||
4184 | |||
4185 | - /* if *not* the last qp in the list | ||
4186 | - * increase the users of the skb then post to the next qp | ||
4187 | + /* for all but the last qp create a new clone of the | ||
4188 | + * skb and pass to the qp. | ||
4189 | */ | ||
4190 | if (mce->qp_list.next != &mcg->qp_list) | ||
4191 | - skb_get(skb); | ||
4192 | + per_qp_skb = skb_clone(skb, GFP_ATOMIC); | ||
4193 | + else | ||
4194 | + per_qp_skb = skb; | ||
4195 | + | ||
4196 | + if (unlikely(!per_qp_skb)) | ||
4197 | + continue; | ||
4198 | |||
4199 | - pkt->qp = qp; | ||
4200 | + per_qp_pkt = SKB_TO_PKT(per_qp_skb); | ||
4201 | + per_qp_pkt->qp = qp; | ||
4202 | rxe_add_ref(qp); | ||
4203 | - rxe_rcv_pkt(pkt, skb); | ||
4204 | + rxe_rcv_pkt(per_qp_pkt, per_qp_skb); | ||
4205 | } | ||
4206 | |||
4207 | spin_unlock_bh(&mcg->mcg_lock); | ||
4208 | |||
4209 | rxe_drop_ref(mcg); /* drop ref from rxe_pool_get_key. */ | ||
4210 | |||
4211 | + return; | ||
4212 | + | ||
4213 | err1: | ||
4214 | kfree_skb(skb); | ||
4215 | } | ||
4216 | diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c | ||
4217 | index 044bcacad6e48..69ecf37053a81 100644 | ||
4218 | --- a/drivers/infiniband/ulp/ipoib/ipoib_main.c | ||
4219 | +++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c | ||
4220 | @@ -2463,6 +2463,8 @@ static struct net_device *ipoib_add_port(const char *format, | ||
4221 | /* call event handler to ensure pkey in sync */ | ||
4222 | queue_work(ipoib_workqueue, &priv->flush_heavy); | ||
4223 | |||
4224 | + ndev->rtnl_link_ops = ipoib_get_link_ops(); | ||
4225 | + | ||
4226 | result = register_netdev(ndev); | ||
4227 | if (result) { | ||
4228 | pr_warn("%s: couldn't register ipoib port %d; error %d\n", | ||
4229 | diff --git a/drivers/infiniband/ulp/ipoib/ipoib_netlink.c b/drivers/infiniband/ulp/ipoib/ipoib_netlink.c | ||
4230 | index 38c984d16996d..d5a90a66b45cf 100644 | ||
4231 | --- a/drivers/infiniband/ulp/ipoib/ipoib_netlink.c | ||
4232 | +++ b/drivers/infiniband/ulp/ipoib/ipoib_netlink.c | ||
4233 | @@ -144,6 +144,16 @@ static int ipoib_new_child_link(struct net *src_net, struct net_device *dev, | ||
4234 | return 0; | ||
4235 | } | ||
4236 | |||
4237 | +static void ipoib_del_child_link(struct net_device *dev, struct list_head *head) | ||
4238 | +{ | ||
4239 | + struct ipoib_dev_priv *priv = ipoib_priv(dev); | ||
4240 | + | ||
4241 | + if (!priv->parent) | ||
4242 | + return; | ||
4243 | + | ||
4244 | + unregister_netdevice_queue(dev, head); | ||
4245 | +} | ||
4246 | + | ||
4247 | static size_t ipoib_get_size(const struct net_device *dev) | ||
4248 | { | ||
4249 | return nla_total_size(2) + /* IFLA_IPOIB_PKEY */ | ||
4250 | @@ -158,6 +168,7 @@ static struct rtnl_link_ops ipoib_link_ops __read_mostly = { | ||
4251 | .priv_size = sizeof(struct ipoib_dev_priv), | ||
4252 | .setup = ipoib_setup_common, | ||
4253 | .newlink = ipoib_new_child_link, | ||
4254 | + .dellink = ipoib_del_child_link, | ||
4255 | .changelink = ipoib_changelink, | ||
4256 | .get_size = ipoib_get_size, | ||
4257 | .fill_info = ipoib_fill_info, | ||
4258 | diff --git a/drivers/infiniband/ulp/ipoib/ipoib_vlan.c b/drivers/infiniband/ulp/ipoib/ipoib_vlan.c | ||
4259 | index 8ac8e18fbe0c3..58ca5e9c6079c 100644 | ||
4260 | --- a/drivers/infiniband/ulp/ipoib/ipoib_vlan.c | ||
4261 | +++ b/drivers/infiniband/ulp/ipoib/ipoib_vlan.c | ||
4262 | @@ -192,6 +192,8 @@ int ipoib_vlan_add(struct net_device *pdev, unsigned short pkey) | ||
4263 | } | ||
4264 | priv = ipoib_priv(ndev); | ||
4265 | |||
4266 | + ndev->rtnl_link_ops = ipoib_get_link_ops(); | ||
4267 | + | ||
4268 | result = __ipoib_vlan_add(ppriv, priv, pkey, IPOIB_LEGACY_CHILD); | ||
4269 | |||
4270 | if (result && ndev->reg_state == NETREG_UNINITIALIZED) | ||
4271 | diff --git a/drivers/input/keyboard/ep93xx_keypad.c b/drivers/input/keyboard/ep93xx_keypad.c | ||
4272 | index 7c70492d9d6b5..f831f01501d58 100644 | ||
4273 | --- a/drivers/input/keyboard/ep93xx_keypad.c | ||
4274 | +++ b/drivers/input/keyboard/ep93xx_keypad.c | ||
4275 | @@ -250,8 +250,8 @@ static int ep93xx_keypad_probe(struct platform_device *pdev) | ||
4276 | } | ||
4277 | |||
4278 | keypad->irq = platform_get_irq(pdev, 0); | ||
4279 | - if (!keypad->irq) { | ||
4280 | - err = -ENXIO; | ||
4281 | + if (keypad->irq < 0) { | ||
4282 | + err = keypad->irq; | ||
4283 | goto failed_free; | ||
4284 | } | ||
4285 | |||
4286 | diff --git a/drivers/input/keyboard/omap4-keypad.c b/drivers/input/keyboard/omap4-keypad.c | ||
4287 | index 94c94d7f5155f..d6c924032aaa8 100644 | ||
4288 | --- a/drivers/input/keyboard/omap4-keypad.c | ||
4289 | +++ b/drivers/input/keyboard/omap4-keypad.c | ||
4290 | @@ -240,10 +240,8 @@ static int omap4_keypad_probe(struct platform_device *pdev) | ||
4291 | } | ||
4292 | |||
4293 | irq = platform_get_irq(pdev, 0); | ||
4294 | - if (!irq) { | ||
4295 | - dev_err(&pdev->dev, "no keyboard irq assigned\n"); | ||
4296 | - return -EINVAL; | ||
4297 | - } | ||
4298 | + if (irq < 0) | ||
4299 | + return irq; | ||
4300 | |||
4301 | keypad_data = kzalloc(sizeof(struct omap4_keypad), GFP_KERNEL); | ||
4302 | if (!keypad_data) { | ||
4303 | diff --git a/drivers/input/keyboard/twl4030_keypad.c b/drivers/input/keyboard/twl4030_keypad.c | ||
4304 | index af3a6824f1a4d..77e0743a3cf85 100644 | ||
4305 | --- a/drivers/input/keyboard/twl4030_keypad.c | ||
4306 | +++ b/drivers/input/keyboard/twl4030_keypad.c | ||
4307 | @@ -50,7 +50,7 @@ struct twl4030_keypad { | ||
4308 | bool autorepeat; | ||
4309 | unsigned int n_rows; | ||
4310 | unsigned int n_cols; | ||
4311 | - unsigned int irq; | ||
4312 | + int irq; | ||
4313 | |||
4314 | struct device *dbg_dev; | ||
4315 | struct input_dev *input; | ||
4316 | @@ -376,10 +376,8 @@ static int twl4030_kp_probe(struct platform_device *pdev) | ||
4317 | } | ||
4318 | |||
4319 | kp->irq = platform_get_irq(pdev, 0); | ||
4320 | - if (!kp->irq) { | ||
4321 | - dev_err(&pdev->dev, "no keyboard irq assigned\n"); | ||
4322 | - return -EINVAL; | ||
4323 | - } | ||
4324 | + if (kp->irq < 0) | ||
4325 | + return kp->irq; | ||
4326 | |||
4327 | error = matrix_keypad_build_keymap(keymap_data, NULL, | ||
4328 | TWL4030_MAX_ROWS, | ||
4329 | diff --git a/drivers/input/serio/sun4i-ps2.c b/drivers/input/serio/sun4i-ps2.c | ||
4330 | index a681a2c04e399..f15ed3dcdb9b2 100644 | ||
4331 | --- a/drivers/input/serio/sun4i-ps2.c | ||
4332 | +++ b/drivers/input/serio/sun4i-ps2.c | ||
4333 | @@ -211,7 +211,6 @@ static int sun4i_ps2_probe(struct platform_device *pdev) | ||
4334 | struct sun4i_ps2data *drvdata; | ||
4335 | struct serio *serio; | ||
4336 | struct device *dev = &pdev->dev; | ||
4337 | - unsigned int irq; | ||
4338 | int error; | ||
4339 | |||
4340 | drvdata = kzalloc(sizeof(struct sun4i_ps2data), GFP_KERNEL); | ||
4341 | @@ -264,14 +263,12 @@ static int sun4i_ps2_probe(struct platform_device *pdev) | ||
4342 | writel(0, drvdata->reg_base + PS2_REG_GCTL); | ||
4343 | |||
4344 | /* Get IRQ for the device */ | ||
4345 | - irq = platform_get_irq(pdev, 0); | ||
4346 | - if (!irq) { | ||
4347 | - dev_err(dev, "no IRQ found\n"); | ||
4348 | - error = -ENXIO; | ||
4349 | + drvdata->irq = platform_get_irq(pdev, 0); | ||
4350 | + if (drvdata->irq < 0) { | ||
4351 | + error = drvdata->irq; | ||
4352 | goto err_disable_clk; | ||
4353 | } | ||
4354 | |||
4355 | - drvdata->irq = irq; | ||
4356 | drvdata->serio = serio; | ||
4357 | drvdata->dev = dev; | ||
4358 | |||
4359 | diff --git a/drivers/input/touchscreen/imx6ul_tsc.c b/drivers/input/touchscreen/imx6ul_tsc.c | ||
4360 | index 9ed258854349b..5e6ba5c4eca2a 100644 | ||
4361 | --- a/drivers/input/touchscreen/imx6ul_tsc.c | ||
4362 | +++ b/drivers/input/touchscreen/imx6ul_tsc.c | ||
4363 | @@ -530,20 +530,25 @@ static int __maybe_unused imx6ul_tsc_resume(struct device *dev) | ||
4364 | |||
4365 | mutex_lock(&input_dev->mutex); | ||
4366 | |||
4367 | - if (input_dev->users) { | ||
4368 | - retval = clk_prepare_enable(tsc->adc_clk); | ||
4369 | - if (retval) | ||
4370 | - goto out; | ||
4371 | - | ||
4372 | - retval = clk_prepare_enable(tsc->tsc_clk); | ||
4373 | - if (retval) { | ||
4374 | - clk_disable_unprepare(tsc->adc_clk); | ||
4375 | - goto out; | ||
4376 | - } | ||
4377 | + if (!input_dev->users) | ||
4378 | + goto out; | ||
4379 | |||
4380 | - retval = imx6ul_tsc_init(tsc); | ||
4381 | + retval = clk_prepare_enable(tsc->adc_clk); | ||
4382 | + if (retval) | ||
4383 | + goto out; | ||
4384 | + | ||
4385 | + retval = clk_prepare_enable(tsc->tsc_clk); | ||
4386 | + if (retval) { | ||
4387 | + clk_disable_unprepare(tsc->adc_clk); | ||
4388 | + goto out; | ||
4389 | } | ||
4390 | |||
4391 | + retval = imx6ul_tsc_init(tsc); | ||
4392 | + if (retval) { | ||
4393 | + clk_disable_unprepare(tsc->tsc_clk); | ||
4394 | + clk_disable_unprepare(tsc->adc_clk); | ||
4395 | + goto out; | ||
4396 | + } | ||
4397 | out: | ||
4398 | mutex_unlock(&input_dev->mutex); | ||
4399 | return retval; | ||
4400 | diff --git a/drivers/input/touchscreen/stmfts.c b/drivers/input/touchscreen/stmfts.c | ||
4401 | index b6f95f20f9244..cd8805d71d977 100644 | ||
4402 | --- a/drivers/input/touchscreen/stmfts.c | ||
4403 | +++ b/drivers/input/touchscreen/stmfts.c | ||
4404 | @@ -479,7 +479,7 @@ static ssize_t stmfts_sysfs_hover_enable_write(struct device *dev, | ||
4405 | |||
4406 | mutex_lock(&sdata->mutex); | ||
4407 | |||
4408 | - if (value & sdata->hover_enabled) | ||
4409 | + if (value && sdata->hover_enabled) | ||
4410 | goto out; | ||
4411 | |||
4412 | if (sdata->running) | ||
4413 | diff --git a/drivers/lightnvm/core.c b/drivers/lightnvm/core.c | ||
4414 | index 7543e395a2c64..a2ebc75af8c79 100644 | ||
4415 | --- a/drivers/lightnvm/core.c | ||
4416 | +++ b/drivers/lightnvm/core.c | ||
4417 | @@ -1316,8 +1316,9 @@ static long nvm_ioctl_get_devices(struct file *file, void __user *arg) | ||
4418 | strlcpy(info->bmname, "gennvm", sizeof(info->bmname)); | ||
4419 | i++; | ||
4420 | |||
4421 | - if (i > 31) { | ||
4422 | - pr_err("max 31 devices can be reported.\n"); | ||
4423 | + if (i >= ARRAY_SIZE(devices->info)) { | ||
4424 | + pr_err("max %zd devices can be reported.\n", | ||
4425 | + ARRAY_SIZE(devices->info)); | ||
4426 | break; | ||
4427 | } | ||
4428 | } | ||
4429 | diff --git a/drivers/mailbox/mailbox.c b/drivers/mailbox/mailbox.c | ||
4430 | index 0b821a5b2db84..3e7d4b20ab34f 100644 | ||
4431 | --- a/drivers/mailbox/mailbox.c | ||
4432 | +++ b/drivers/mailbox/mailbox.c | ||
4433 | @@ -82,9 +82,12 @@ static void msg_submit(struct mbox_chan *chan) | ||
4434 | exit: | ||
4435 | spin_unlock_irqrestore(&chan->lock, flags); | ||
4436 | |||
4437 | - if (!err && (chan->txdone_method & TXDONE_BY_POLL)) | ||
4438 | - /* kick start the timer immediately to avoid delays */ | ||
4439 | - hrtimer_start(&chan->mbox->poll_hrt, 0, HRTIMER_MODE_REL); | ||
4440 | + /* kick start the timer immediately to avoid delays */ | ||
4441 | + if (!err && (chan->txdone_method & TXDONE_BY_POLL)) { | ||
4442 | + /* but only if not already active */ | ||
4443 | + if (!hrtimer_active(&chan->mbox->poll_hrt)) | ||
4444 | + hrtimer_start(&chan->mbox->poll_hrt, 0, HRTIMER_MODE_REL); | ||
4445 | + } | ||
4446 | } | ||
4447 | |||
4448 | static void tx_tick(struct mbox_chan *chan, int r) | ||
4449 | @@ -122,11 +125,10 @@ static enum hrtimer_restart txdone_hrtimer(struct hrtimer *hrtimer) | ||
4450 | struct mbox_chan *chan = &mbox->chans[i]; | ||
4451 | |||
4452 | if (chan->active_req && chan->cl) { | ||
4453 | + resched = true; | ||
4454 | txdone = chan->mbox->ops->last_tx_done(chan); | ||
4455 | if (txdone) | ||
4456 | tx_tick(chan, 0); | ||
4457 | - else | ||
4458 | - resched = true; | ||
4459 | } | ||
4460 | } | ||
4461 | |||
4462 | diff --git a/drivers/mailbox/mtk-cmdq-mailbox.c b/drivers/mailbox/mtk-cmdq-mailbox.c | ||
4463 | index 9a6ce9f5a7db5..3c8b365ce635a 100644 | ||
4464 | --- a/drivers/mailbox/mtk-cmdq-mailbox.c | ||
4465 | +++ b/drivers/mailbox/mtk-cmdq-mailbox.c | ||
4466 | @@ -70,7 +70,7 @@ struct cmdq_task { | ||
4467 | struct cmdq { | ||
4468 | struct mbox_controller mbox; | ||
4469 | void __iomem *base; | ||
4470 | - u32 irq; | ||
4471 | + int irq; | ||
4472 | u32 thread_nr; | ||
4473 | u32 irq_mask; | ||
4474 | struct cmdq_thread *thread; | ||
4475 | @@ -474,10 +474,8 @@ static int cmdq_probe(struct platform_device *pdev) | ||
4476 | } | ||
4477 | |||
4478 | cmdq->irq = platform_get_irq(pdev, 0); | ||
4479 | - if (!cmdq->irq) { | ||
4480 | - dev_err(dev, "failed to get irq\n"); | ||
4481 | - return -EINVAL; | ||
4482 | - } | ||
4483 | + if (cmdq->irq < 0) | ||
4484 | + return cmdq->irq; | ||
4485 | |||
4486 | cmdq->thread_nr = (u32)(unsigned long)of_device_get_match_data(dev); | ||
4487 | cmdq->irq_mask = GENMASK(cmdq->thread_nr - 1, 0); | ||
4488 | diff --git a/drivers/md/md-bitmap.c b/drivers/md/md-bitmap.c | ||
4489 | index 3ad18246fcb3c..7227d03dbbea7 100644 | ||
4490 | --- a/drivers/md/md-bitmap.c | ||
4491 | +++ b/drivers/md/md-bitmap.c | ||
4492 | @@ -1954,6 +1954,7 @@ out: | ||
4493 | } | ||
4494 | EXPORT_SYMBOL_GPL(md_bitmap_load); | ||
4495 | |||
4496 | +/* caller need to free returned bitmap with md_bitmap_free() */ | ||
4497 | struct bitmap *get_bitmap_from_slot(struct mddev *mddev, int slot) | ||
4498 | { | ||
4499 | int rv = 0; | ||
4500 | @@ -2017,6 +2018,7 @@ int md_bitmap_copy_from_slot(struct mddev *mddev, int slot, | ||
4501 | md_bitmap_unplug(mddev->bitmap); | ||
4502 | *low = lo; | ||
4503 | *high = hi; | ||
4504 | + md_bitmap_free(bitmap); | ||
4505 | |||
4506 | return rv; | ||
4507 | } | ||
4508 | @@ -2620,4 +2622,3 @@ struct attribute_group md_bitmap_group = { | ||
4509 | .name = "bitmap", | ||
4510 | .attrs = md_bitmap_attrs, | ||
4511 | }; | ||
4512 | - | ||
4513 | diff --git a/drivers/md/md-cluster.c b/drivers/md/md-cluster.c | ||
4514 | index d50737ec40394..afbbc552c3275 100644 | ||
4515 | --- a/drivers/md/md-cluster.c | ||
4516 | +++ b/drivers/md/md-cluster.c | ||
4517 | @@ -1166,6 +1166,7 @@ static int resize_bitmaps(struct mddev *mddev, sector_t newsize, sector_t oldsiz | ||
4518 | * can't resize bitmap | ||
4519 | */ | ||
4520 | goto out; | ||
4521 | + md_bitmap_free(bitmap); | ||
4522 | } | ||
4523 | |||
4524 | return 0; | ||
4525 | diff --git a/drivers/media/firewire/firedtv-fw.c b/drivers/media/firewire/firedtv-fw.c | ||
4526 | index 3f1ca40b9b987..8a8585261bb80 100644 | ||
4527 | --- a/drivers/media/firewire/firedtv-fw.c | ||
4528 | +++ b/drivers/media/firewire/firedtv-fw.c | ||
4529 | @@ -272,8 +272,10 @@ static int node_probe(struct fw_unit *unit, const struct ieee1394_device_id *id) | ||
4530 | |||
4531 | name_len = fw_csr_string(unit->directory, CSR_MODEL, | ||
4532 | name, sizeof(name)); | ||
4533 | - if (name_len < 0) | ||
4534 | - return name_len; | ||
4535 | + if (name_len < 0) { | ||
4536 | + err = name_len; | ||
4537 | + goto fail_free; | ||
4538 | + } | ||
4539 | for (i = ARRAY_SIZE(model_names); --i; ) | ||
4540 | if (strlen(model_names[i]) <= name_len && | ||
4541 | strncmp(name, model_names[i], name_len) == 0) | ||
4542 | diff --git a/drivers/media/i2c/m5mols/m5mols_core.c b/drivers/media/i2c/m5mols/m5mols_core.c | ||
4543 | index de295114ca482..21666d705e372 100644 | ||
4544 | --- a/drivers/media/i2c/m5mols/m5mols_core.c | ||
4545 | +++ b/drivers/media/i2c/m5mols/m5mols_core.c | ||
4546 | @@ -764,7 +764,8 @@ static int m5mols_sensor_power(struct m5mols_info *info, bool enable) | ||
4547 | |||
4548 | ret = regulator_bulk_enable(ARRAY_SIZE(supplies), supplies); | ||
4549 | if (ret) { | ||
4550 | - info->set_power(&client->dev, 0); | ||
4551 | + if (info->set_power) | ||
4552 | + info->set_power(&client->dev, 0); | ||
4553 | return ret; | ||
4554 | } | ||
4555 | |||
4556 | diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c | ||
4557 | index 266e947572c1e..be6c882dd1d54 100644 | ||
4558 | --- a/drivers/media/i2c/ov5640.c | ||
4559 | +++ b/drivers/media/i2c/ov5640.c | ||
4560 | @@ -34,6 +34,8 @@ | ||
4561 | #define OV5640_REG_SYS_RESET02 0x3002 | ||
4562 | #define OV5640_REG_SYS_CLOCK_ENABLE02 0x3006 | ||
4563 | #define OV5640_REG_SYS_CTRL0 0x3008 | ||
4564 | +#define OV5640_REG_SYS_CTRL0_SW_PWDN 0x42 | ||
4565 | +#define OV5640_REG_SYS_CTRL0_SW_PWUP 0x02 | ||
4566 | #define OV5640_REG_CHIP_ID 0x300a | ||
4567 | #define OV5640_REG_IO_MIPI_CTRL00 0x300e | ||
4568 | #define OV5640_REG_PAD_OUTPUT_ENABLE01 0x3017 | ||
4569 | @@ -272,8 +274,7 @@ static inline struct v4l2_subdev *ctrl_to_sd(struct v4l2_ctrl *ctrl) | ||
4570 | /* YUV422 UYVY VGA@30fps */ | ||
4571 | static const struct reg_value ov5640_init_setting_30fps_VGA[] = { | ||
4572 | {0x3103, 0x11, 0, 0}, {0x3008, 0x82, 0, 5}, {0x3008, 0x42, 0, 0}, | ||
4573 | - {0x3103, 0x03, 0, 0}, {0x3017, 0x00, 0, 0}, {0x3018, 0x00, 0, 0}, | ||
4574 | - {0x3630, 0x36, 0, 0}, | ||
4575 | + {0x3103, 0x03, 0, 0}, {0x3630, 0x36, 0, 0}, | ||
4576 | {0x3631, 0x0e, 0, 0}, {0x3632, 0xe2, 0, 0}, {0x3633, 0x12, 0, 0}, | ||
4577 | {0x3621, 0xe0, 0, 0}, {0x3704, 0xa0, 0, 0}, {0x3703, 0x5a, 0, 0}, | ||
4578 | {0x3715, 0x78, 0, 0}, {0x3717, 0x01, 0, 0}, {0x370b, 0x60, 0, 0}, | ||
4579 | @@ -740,7 +741,7 @@ static int ov5640_mod_reg(struct ov5640_dev *sensor, u16 reg, | ||
4580 | * +->| PLL Root Div | - reg 0x3037, bit 4 | ||
4581 | * +-+------------+ | ||
4582 | * | +---------+ | ||
4583 | - * +->| Bit Div | - reg 0x3035, bits 0-3 | ||
4584 | + * +->| Bit Div | - reg 0x3034, bits 0-3 | ||
4585 | * +-+-------+ | ||
4586 | * | +-------------+ | ||
4587 | * +->| SCLK Div | - reg 0x3108, bits 0-1 | ||
4588 | @@ -1109,6 +1110,12 @@ static int ov5640_load_regs(struct ov5640_dev *sensor, | ||
4589 | val = regs->val; | ||
4590 | mask = regs->mask; | ||
4591 | |||
4592 | + /* remain in power down mode for DVP */ | ||
4593 | + if (regs->reg_addr == OV5640_REG_SYS_CTRL0 && | ||
4594 | + val == OV5640_REG_SYS_CTRL0_SW_PWUP && | ||
4595 | + sensor->ep.bus_type != V4L2_MBUS_CSI2_DPHY) | ||
4596 | + continue; | ||
4597 | + | ||
4598 | if (mask) | ||
4599 | ret = ov5640_mod_reg(sensor, reg_addr, mask, val); | ||
4600 | else | ||
4601 | @@ -1264,31 +1271,9 @@ static int ov5640_set_stream_dvp(struct ov5640_dev *sensor, bool on) | ||
4602 | if (ret) | ||
4603 | return ret; | ||
4604 | |||
4605 | - /* | ||
4606 | - * enable VSYNC/HREF/PCLK DVP control lines | ||
4607 | - * & D[9:6] DVP data lines | ||
4608 | - * | ||
4609 | - * PAD OUTPUT ENABLE 01 | ||
4610 | - * - 6: VSYNC output enable | ||
4611 | - * - 5: HREF output enable | ||
4612 | - * - 4: PCLK output enable | ||
4613 | - * - [3:0]: D[9:6] output enable | ||
4614 | - */ | ||
4615 | - ret = ov5640_write_reg(sensor, | ||
4616 | - OV5640_REG_PAD_OUTPUT_ENABLE01, | ||
4617 | - on ? 0x7f : 0); | ||
4618 | - if (ret) | ||
4619 | - return ret; | ||
4620 | - | ||
4621 | - /* | ||
4622 | - * enable D[5:0] DVP data lines | ||
4623 | - * | ||
4624 | - * PAD OUTPUT ENABLE 02 | ||
4625 | - * - [7:2]: D[5:0] output enable | ||
4626 | - */ | ||
4627 | - return ov5640_write_reg(sensor, | ||
4628 | - OV5640_REG_PAD_OUTPUT_ENABLE02, | ||
4629 | - on ? 0xfc : 0); | ||
4630 | + return ov5640_write_reg(sensor, OV5640_REG_SYS_CTRL0, on ? | ||
4631 | + OV5640_REG_SYS_CTRL0_SW_PWUP : | ||
4632 | + OV5640_REG_SYS_CTRL0_SW_PWDN); | ||
4633 | } | ||
4634 | |||
4635 | static int ov5640_set_stream_mipi(struct ov5640_dev *sensor, bool on) | ||
4636 | @@ -1987,6 +1972,95 @@ static void ov5640_set_power_off(struct ov5640_dev *sensor) | ||
4637 | clk_disable_unprepare(sensor->xclk); | ||
4638 | } | ||
4639 | |||
4640 | +static int ov5640_set_power_mipi(struct ov5640_dev *sensor, bool on) | ||
4641 | +{ | ||
4642 | + int ret; | ||
4643 | + | ||
4644 | + if (!on) { | ||
4645 | + /* Reset MIPI bus settings to their default values. */ | ||
4646 | + ov5640_write_reg(sensor, OV5640_REG_IO_MIPI_CTRL00, 0x58); | ||
4647 | + ov5640_write_reg(sensor, OV5640_REG_MIPI_CTRL00, 0x04); | ||
4648 | + ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT00, 0x00); | ||
4649 | + return 0; | ||
4650 | + } | ||
4651 | + | ||
4652 | + /* | ||
4653 | + * Power up MIPI HS Tx and LS Rx; 2 data lanes mode | ||
4654 | + * | ||
4655 | + * 0x300e = 0x40 | ||
4656 | + * [7:5] = 010 : 2 data lanes mode (see FIXME note in | ||
4657 | + * "ov5640_set_stream_mipi()") | ||
4658 | + * [4] = 0 : Power up MIPI HS Tx | ||
4659 | + * [3] = 0 : Power up MIPI LS Rx | ||
4660 | + * [2] = 0 : MIPI interface disabled | ||
4661 | + */ | ||
4662 | + ret = ov5640_write_reg(sensor, OV5640_REG_IO_MIPI_CTRL00, 0x40); | ||
4663 | + if (ret) | ||
4664 | + return ret; | ||
4665 | + | ||
4666 | + /* | ||
4667 | + * Gate clock and set LP11 in 'no packets mode' (idle) | ||
4668 | + * | ||
4669 | + * 0x4800 = 0x24 | ||
4670 | + * [5] = 1 : Gate clock when 'no packets' | ||
4671 | + * [2] = 1 : MIPI bus in LP11 when 'no packets' | ||
4672 | + */ | ||
4673 | + ret = ov5640_write_reg(sensor, OV5640_REG_MIPI_CTRL00, 0x24); | ||
4674 | + if (ret) | ||
4675 | + return ret; | ||
4676 | + | ||
4677 | + /* | ||
4678 | + * Set data lanes and clock in LP11 when 'sleeping' | ||
4679 | + * | ||
4680 | + * 0x3019 = 0x70 | ||
4681 | + * [6] = 1 : MIPI data lane 2 in LP11 when 'sleeping' | ||
4682 | + * [5] = 1 : MIPI data lane 1 in LP11 when 'sleeping' | ||
4683 | + * [4] = 1 : MIPI clock lane in LP11 when 'sleeping' | ||
4684 | + */ | ||
4685 | + ret = ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT00, 0x70); | ||
4686 | + if (ret) | ||
4687 | + return ret; | ||
4688 | + | ||
4689 | + /* Give lanes some time to coax into LP11 state. */ | ||
4690 | + usleep_range(500, 1000); | ||
4691 | + | ||
4692 | + return 0; | ||
4693 | +} | ||
4694 | + | ||
4695 | +static int ov5640_set_power_dvp(struct ov5640_dev *sensor, bool on) | ||
4696 | +{ | ||
4697 | + int ret; | ||
4698 | + | ||
4699 | + if (!on) { | ||
4700 | + /* Reset settings to their default values. */ | ||
4701 | + ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE01, 0x00); | ||
4702 | + ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE02, 0x00); | ||
4703 | + return 0; | ||
4704 | + } | ||
4705 | + | ||
4706 | + /* | ||
4707 | + * enable VSYNC/HREF/PCLK DVP control lines | ||
4708 | + * & D[9:6] DVP data lines | ||
4709 | + * | ||
4710 | + * PAD OUTPUT ENABLE 01 | ||
4711 | + * - 6: VSYNC output enable | ||
4712 | + * - 5: HREF output enable | ||
4713 | + * - 4: PCLK output enable | ||
4714 | + * - [3:0]: D[9:6] output enable | ||
4715 | + */ | ||
4716 | + ret = ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE01, 0x7f); | ||
4717 | + if (ret) | ||
4718 | + return ret; | ||
4719 | + | ||
4720 | + /* | ||
4721 | + * enable D[5:0] DVP data lines | ||
4722 | + * | ||
4723 | + * PAD OUTPUT ENABLE 02 | ||
4724 | + * - [7:2]: D[5:0] output enable | ||
4725 | + */ | ||
4726 | + return ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE02, 0xfc); | ||
4727 | +} | ||
4728 | + | ||
4729 | static int ov5640_set_power(struct ov5640_dev *sensor, bool on) | ||
4730 | { | ||
4731 | int ret = 0; | ||
4732 | @@ -1999,67 +2073,17 @@ static int ov5640_set_power(struct ov5640_dev *sensor, bool on) | ||
4733 | ret = ov5640_restore_mode(sensor); | ||
4734 | if (ret) | ||
4735 | goto power_off; | ||
4736 | + } | ||
4737 | |||
4738 | - /* We're done here for DVP bus, while CSI-2 needs setup. */ | ||
4739 | - if (sensor->ep.bus_type != V4L2_MBUS_CSI2_DPHY) | ||
4740 | - return 0; | ||
4741 | - | ||
4742 | - /* | ||
4743 | - * Power up MIPI HS Tx and LS Rx; 2 data lanes mode | ||
4744 | - * | ||
4745 | - * 0x300e = 0x40 | ||
4746 | - * [7:5] = 010 : 2 data lanes mode (see FIXME note in | ||
4747 | - * "ov5640_set_stream_mipi()") | ||
4748 | - * [4] = 0 : Power up MIPI HS Tx | ||
4749 | - * [3] = 0 : Power up MIPI LS Rx | ||
4750 | - * [2] = 0 : MIPI interface disabled | ||
4751 | - */ | ||
4752 | - ret = ov5640_write_reg(sensor, | ||
4753 | - OV5640_REG_IO_MIPI_CTRL00, 0x40); | ||
4754 | - if (ret) | ||
4755 | - goto power_off; | ||
4756 | - | ||
4757 | - /* | ||
4758 | - * Gate clock and set LP11 in 'no packets mode' (idle) | ||
4759 | - * | ||
4760 | - * 0x4800 = 0x24 | ||
4761 | - * [5] = 1 : Gate clock when 'no packets' | ||
4762 | - * [2] = 1 : MIPI bus in LP11 when 'no packets' | ||
4763 | - */ | ||
4764 | - ret = ov5640_write_reg(sensor, | ||
4765 | - OV5640_REG_MIPI_CTRL00, 0x24); | ||
4766 | - if (ret) | ||
4767 | - goto power_off; | ||
4768 | - | ||
4769 | - /* | ||
4770 | - * Set data lanes and clock in LP11 when 'sleeping' | ||
4771 | - * | ||
4772 | - * 0x3019 = 0x70 | ||
4773 | - * [6] = 1 : MIPI data lane 2 in LP11 when 'sleeping' | ||
4774 | - * [5] = 1 : MIPI data lane 1 in LP11 when 'sleeping' | ||
4775 | - * [4] = 1 : MIPI clock lane in LP11 when 'sleeping' | ||
4776 | - */ | ||
4777 | - ret = ov5640_write_reg(sensor, | ||
4778 | - OV5640_REG_PAD_OUTPUT00, 0x70); | ||
4779 | - if (ret) | ||
4780 | - goto power_off; | ||
4781 | - | ||
4782 | - /* Give lanes some time to coax into LP11 state. */ | ||
4783 | - usleep_range(500, 1000); | ||
4784 | - | ||
4785 | - } else { | ||
4786 | - if (sensor->ep.bus_type == V4L2_MBUS_CSI2_DPHY) { | ||
4787 | - /* Reset MIPI bus settings to their default values. */ | ||
4788 | - ov5640_write_reg(sensor, | ||
4789 | - OV5640_REG_IO_MIPI_CTRL00, 0x58); | ||
4790 | - ov5640_write_reg(sensor, | ||
4791 | - OV5640_REG_MIPI_CTRL00, 0x04); | ||
4792 | - ov5640_write_reg(sensor, | ||
4793 | - OV5640_REG_PAD_OUTPUT00, 0x00); | ||
4794 | - } | ||
4795 | + if (sensor->ep.bus_type == V4L2_MBUS_CSI2_DPHY) | ||
4796 | + ret = ov5640_set_power_mipi(sensor, on); | ||
4797 | + else | ||
4798 | + ret = ov5640_set_power_dvp(sensor, on); | ||
4799 | + if (ret) | ||
4800 | + goto power_off; | ||
4801 | |||
4802 | + if (!on) | ||
4803 | ov5640_set_power_off(sensor); | ||
4804 | - } | ||
4805 | |||
4806 | return 0; | ||
4807 | |||
4808 | diff --git a/drivers/media/i2c/tc358743.c b/drivers/media/i2c/tc358743.c | ||
4809 | index dbbab75f135ec..cff99cf61ed4d 100644 | ||
4810 | --- a/drivers/media/i2c/tc358743.c | ||
4811 | +++ b/drivers/media/i2c/tc358743.c | ||
4812 | @@ -919,8 +919,8 @@ static const struct cec_adap_ops tc358743_cec_adap_ops = { | ||
4813 | .adap_monitor_all_enable = tc358743_cec_adap_monitor_all_enable, | ||
4814 | }; | ||
4815 | |||
4816 | -static void tc358743_cec_isr(struct v4l2_subdev *sd, u16 intstatus, | ||
4817 | - bool *handled) | ||
4818 | +static void tc358743_cec_handler(struct v4l2_subdev *sd, u16 intstatus, | ||
4819 | + bool *handled) | ||
4820 | { | ||
4821 | struct tc358743_state *state = to_state(sd); | ||
4822 | unsigned int cec_rxint, cec_txint; | ||
4823 | @@ -953,7 +953,8 @@ static void tc358743_cec_isr(struct v4l2_subdev *sd, u16 intstatus, | ||
4824 | cec_transmit_attempt_done(state->cec_adap, | ||
4825 | CEC_TX_STATUS_ERROR); | ||
4826 | } | ||
4827 | - *handled = true; | ||
4828 | + if (handled) | ||
4829 | + *handled = true; | ||
4830 | } | ||
4831 | if ((intstatus & MASK_CEC_RINT) && | ||
4832 | (cec_rxint & MASK_CECRIEND)) { | ||
4833 | @@ -968,7 +969,8 @@ static void tc358743_cec_isr(struct v4l2_subdev *sd, u16 intstatus, | ||
4834 | msg.msg[i] = v & 0xff; | ||
4835 | } | ||
4836 | cec_received_msg(state->cec_adap, &msg); | ||
4837 | - *handled = true; | ||
4838 | + if (handled) | ||
4839 | + *handled = true; | ||
4840 | } | ||
4841 | i2c_wr16(sd, INTSTATUS, | ||
4842 | intstatus & (MASK_CEC_RINT | MASK_CEC_TINT)); | ||
4843 | @@ -1432,7 +1434,7 @@ static int tc358743_isr(struct v4l2_subdev *sd, u32 status, bool *handled) | ||
4844 | |||
4845 | #ifdef CONFIG_VIDEO_TC358743_CEC | ||
4846 | if (intstatus & (MASK_CEC_RINT | MASK_CEC_TINT)) { | ||
4847 | - tc358743_cec_isr(sd, intstatus, handled); | ||
4848 | + tc358743_cec_handler(sd, intstatus, handled); | ||
4849 | i2c_wr16(sd, INTSTATUS, | ||
4850 | intstatus & (MASK_CEC_RINT | MASK_CEC_TINT)); | ||
4851 | intstatus &= ~(MASK_CEC_RINT | MASK_CEC_TINT); | ||
4852 | @@ -1461,7 +1463,7 @@ static int tc358743_isr(struct v4l2_subdev *sd, u32 status, bool *handled) | ||
4853 | static irqreturn_t tc358743_irq_handler(int irq, void *dev_id) | ||
4854 | { | ||
4855 | struct tc358743_state *state = dev_id; | ||
4856 | - bool handled; | ||
4857 | + bool handled = false; | ||
4858 | |||
4859 | tc358743_isr(&state->sd, 0, &handled); | ||
4860 | |||
4861 | diff --git a/drivers/media/pci/bt8xx/bttv-driver.c b/drivers/media/pci/bt8xx/bttv-driver.c | ||
4862 | index a359da7773a90..ff2962cea6164 100644 | ||
4863 | --- a/drivers/media/pci/bt8xx/bttv-driver.c | ||
4864 | +++ b/drivers/media/pci/bt8xx/bttv-driver.c | ||
4865 | @@ -4013,11 +4013,13 @@ static int bttv_probe(struct pci_dev *dev, const struct pci_device_id *pci_id) | ||
4866 | btv->id = dev->device; | ||
4867 | if (pci_enable_device(dev)) { | ||
4868 | pr_warn("%d: Can't enable device\n", btv->c.nr); | ||
4869 | - return -EIO; | ||
4870 | + result = -EIO; | ||
4871 | + goto free_mem; | ||
4872 | } | ||
4873 | if (pci_set_dma_mask(dev, DMA_BIT_MASK(32))) { | ||
4874 | pr_warn("%d: No suitable DMA available\n", btv->c.nr); | ||
4875 | - return -EIO; | ||
4876 | + result = -EIO; | ||
4877 | + goto free_mem; | ||
4878 | } | ||
4879 | if (!request_mem_region(pci_resource_start(dev,0), | ||
4880 | pci_resource_len(dev,0), | ||
4881 | @@ -4025,7 +4027,8 @@ static int bttv_probe(struct pci_dev *dev, const struct pci_device_id *pci_id) | ||
4882 | pr_warn("%d: can't request iomem (0x%llx)\n", | ||
4883 | btv->c.nr, | ||
4884 | (unsigned long long)pci_resource_start(dev, 0)); | ||
4885 | - return -EBUSY; | ||
4886 | + result = -EBUSY; | ||
4887 | + goto free_mem; | ||
4888 | } | ||
4889 | pci_set_master(dev); | ||
4890 | pci_set_command(dev); | ||
4891 | @@ -4211,6 +4214,10 @@ fail0: | ||
4892 | release_mem_region(pci_resource_start(btv->c.pci,0), | ||
4893 | pci_resource_len(btv->c.pci,0)); | ||
4894 | pci_disable_device(btv->c.pci); | ||
4895 | + | ||
4896 | +free_mem: | ||
4897 | + bttvs[btv->c.nr] = NULL; | ||
4898 | + kfree(btv); | ||
4899 | return result; | ||
4900 | } | ||
4901 | |||
4902 | diff --git a/drivers/media/pci/saa7134/saa7134-tvaudio.c b/drivers/media/pci/saa7134/saa7134-tvaudio.c | ||
4903 | index 79e1afb710758..5cc4ef21f9d37 100644 | ||
4904 | --- a/drivers/media/pci/saa7134/saa7134-tvaudio.c | ||
4905 | +++ b/drivers/media/pci/saa7134/saa7134-tvaudio.c | ||
4906 | @@ -683,7 +683,8 @@ int saa_dsp_writel(struct saa7134_dev *dev, int reg, u32 value) | ||
4907 | { | ||
4908 | int err; | ||
4909 | |||
4910 | - audio_dbg(2, "dsp write reg 0x%x = 0x%06x\n", reg << 2, value); | ||
4911 | + audio_dbg(2, "dsp write reg 0x%x = 0x%06x\n", | ||
4912 | + (reg << 2) & 0xffffffff, value); | ||
4913 | err = saa_dsp_wait_bit(dev,SAA7135_DSP_RWSTATE_WRR); | ||
4914 | if (err < 0) | ||
4915 | return err; | ||
4916 | diff --git a/drivers/media/platform/exynos4-is/fimc-isp.c b/drivers/media/platform/exynos4-is/fimc-isp.c | ||
4917 | index cde0d254ec1c4..a77c49b185115 100644 | ||
4918 | --- a/drivers/media/platform/exynos4-is/fimc-isp.c | ||
4919 | +++ b/drivers/media/platform/exynos4-is/fimc-isp.c | ||
4920 | @@ -305,8 +305,10 @@ static int fimc_isp_subdev_s_power(struct v4l2_subdev *sd, int on) | ||
4921 | |||
4922 | if (on) { | ||
4923 | ret = pm_runtime_get_sync(&is->pdev->dev); | ||
4924 | - if (ret < 0) | ||
4925 | + if (ret < 0) { | ||
4926 | + pm_runtime_put(&is->pdev->dev); | ||
4927 | return ret; | ||
4928 | + } | ||
4929 | set_bit(IS_ST_PWR_ON, &is->state); | ||
4930 | |||
4931 | ret = fimc_is_start_firmware(is); | ||
4932 | diff --git a/drivers/media/platform/exynos4-is/fimc-lite.c b/drivers/media/platform/exynos4-is/fimc-lite.c | ||
4933 | index e87c6a09205bd..efd06621951c7 100644 | ||
4934 | --- a/drivers/media/platform/exynos4-is/fimc-lite.c | ||
4935 | +++ b/drivers/media/platform/exynos4-is/fimc-lite.c | ||
4936 | @@ -470,7 +470,7 @@ static int fimc_lite_open(struct file *file) | ||
4937 | set_bit(ST_FLITE_IN_USE, &fimc->state); | ||
4938 | ret = pm_runtime_get_sync(&fimc->pdev->dev); | ||
4939 | if (ret < 0) | ||
4940 | - goto unlock; | ||
4941 | + goto err_pm; | ||
4942 | |||
4943 | ret = v4l2_fh_open(file); | ||
4944 | if (ret < 0) | ||
4945 | diff --git a/drivers/media/platform/exynos4-is/media-dev.c b/drivers/media/platform/exynos4-is/media-dev.c | ||
4946 | index 9c31d950cddf7..a07d796f63df0 100644 | ||
4947 | --- a/drivers/media/platform/exynos4-is/media-dev.c | ||
4948 | +++ b/drivers/media/platform/exynos4-is/media-dev.c | ||
4949 | @@ -484,8 +484,10 @@ static int fimc_md_register_sensor_entities(struct fimc_md *fmd) | ||
4950 | return -ENXIO; | ||
4951 | |||
4952 | ret = pm_runtime_get_sync(fmd->pmf); | ||
4953 | - if (ret < 0) | ||
4954 | + if (ret < 0) { | ||
4955 | + pm_runtime_put(fmd->pmf); | ||
4956 | return ret; | ||
4957 | + } | ||
4958 | |||
4959 | fmd->num_sensors = 0; | ||
4960 | |||
4961 | @@ -1268,11 +1270,9 @@ static int fimc_md_get_pinctrl(struct fimc_md *fmd) | ||
4962 | if (IS_ERR(pctl->state_default)) | ||
4963 | return PTR_ERR(pctl->state_default); | ||
4964 | |||
4965 | + /* PINCTRL_STATE_IDLE is optional */ | ||
4966 | pctl->state_idle = pinctrl_lookup_state(pctl->pinctrl, | ||
4967 | PINCTRL_STATE_IDLE); | ||
4968 | - if (IS_ERR(pctl->state_idle)) | ||
4969 | - return PTR_ERR(pctl->state_idle); | ||
4970 | - | ||
4971 | return 0; | ||
4972 | } | ||
4973 | |||
4974 | diff --git a/drivers/media/platform/exynos4-is/mipi-csis.c b/drivers/media/platform/exynos4-is/mipi-csis.c | ||
4975 | index 540151bbf58f2..1aac167abb175 100644 | ||
4976 | --- a/drivers/media/platform/exynos4-is/mipi-csis.c | ||
4977 | +++ b/drivers/media/platform/exynos4-is/mipi-csis.c | ||
4978 | @@ -510,8 +510,10 @@ static int s5pcsis_s_stream(struct v4l2_subdev *sd, int enable) | ||
4979 | if (enable) { | ||
4980 | s5pcsis_clear_counters(state); | ||
4981 | ret = pm_runtime_get_sync(&state->pdev->dev); | ||
4982 | - if (ret && ret != 1) | ||
4983 | + if (ret && ret != 1) { | ||
4984 | + pm_runtime_put_noidle(&state->pdev->dev); | ||
4985 | return ret; | ||
4986 | + } | ||
4987 | } | ||
4988 | |||
4989 | mutex_lock(&state->lock); | ||
4990 | diff --git a/drivers/media/platform/mx2_emmaprp.c b/drivers/media/platform/mx2_emmaprp.c | ||
4991 | index 27779b75df543..ac112cf06ab31 100644 | ||
4992 | --- a/drivers/media/platform/mx2_emmaprp.c | ||
4993 | +++ b/drivers/media/platform/mx2_emmaprp.c | ||
4994 | @@ -852,8 +852,11 @@ static int emmaprp_probe(struct platform_device *pdev) | ||
4995 | platform_set_drvdata(pdev, pcdev); | ||
4996 | |||
4997 | irq = platform_get_irq(pdev, 0); | ||
4998 | - if (irq < 0) | ||
4999 | - return irq; | ||
5000 | + if (irq < 0) { | ||
5001 | + ret = irq; | ||
5002 | + goto rel_vdev; | ||
5003 | + } | ||
5004 | + | ||
5005 | ret = devm_request_irq(&pdev->dev, irq, emmaprp_irq, 0, | ||
5006 | dev_name(&pdev->dev), pcdev); | ||
5007 | if (ret) | ||
5008 | diff --git a/drivers/media/platform/omap3isp/isp.c b/drivers/media/platform/omap3isp/isp.c | ||
5009 | index 327c5716922ac..dce6b3685e135 100644 | ||
5010 | --- a/drivers/media/platform/omap3isp/isp.c | ||
5011 | +++ b/drivers/media/platform/omap3isp/isp.c | ||
5012 | @@ -2330,8 +2330,10 @@ static int isp_probe(struct platform_device *pdev) | ||
5013 | mem = platform_get_resource(pdev, IORESOURCE_MEM, i); | ||
5014 | isp->mmio_base[map_idx] = | ||
5015 | devm_ioremap_resource(isp->dev, mem); | ||
5016 | - if (IS_ERR(isp->mmio_base[map_idx])) | ||
5017 | - return PTR_ERR(isp->mmio_base[map_idx]); | ||
5018 | + if (IS_ERR(isp->mmio_base[map_idx])) { | ||
5019 | + ret = PTR_ERR(isp->mmio_base[map_idx]); | ||
5020 | + goto error; | ||
5021 | + } | ||
5022 | } | ||
5023 | |||
5024 | ret = isp_get_clocks(isp); | ||
5025 | diff --git a/drivers/media/platform/qcom/camss/camss-csiphy.c b/drivers/media/platform/qcom/camss/camss-csiphy.c | ||
5026 | index 008afb85023be..3c5b9082ad723 100644 | ||
5027 | --- a/drivers/media/platform/qcom/camss/camss-csiphy.c | ||
5028 | +++ b/drivers/media/platform/qcom/camss/camss-csiphy.c | ||
5029 | @@ -176,8 +176,10 @@ static int csiphy_set_power(struct v4l2_subdev *sd, int on) | ||
5030 | int ret; | ||
5031 | |||
5032 | ret = pm_runtime_get_sync(dev); | ||
5033 | - if (ret < 0) | ||
5034 | + if (ret < 0) { | ||
5035 | + pm_runtime_put_sync(dev); | ||
5036 | return ret; | ||
5037 | + } | ||
5038 | |||
5039 | ret = csiphy_set_clock_rates(csiphy); | ||
5040 | if (ret < 0) { | ||
5041 | diff --git a/drivers/media/platform/qcom/venus/core.c b/drivers/media/platform/qcom/venus/core.c | ||
5042 | index 84e982f259a06..bbc430a003443 100644 | ||
5043 | --- a/drivers/media/platform/qcom/venus/core.c | ||
5044 | +++ b/drivers/media/platform/qcom/venus/core.c | ||
5045 | @@ -316,8 +316,10 @@ static int venus_probe(struct platform_device *pdev) | ||
5046 | goto err_core_deinit; | ||
5047 | |||
5048 | ret = pm_runtime_put_sync(dev); | ||
5049 | - if (ret) | ||
5050 | + if (ret) { | ||
5051 | + pm_runtime_get_noresume(dev); | ||
5052 | goto err_dev_unregister; | ||
5053 | + } | ||
5054 | |||
5055 | return 0; | ||
5056 | |||
5057 | @@ -328,6 +330,7 @@ err_core_deinit: | ||
5058 | err_venus_shutdown: | ||
5059 | venus_shutdown(core); | ||
5060 | err_runtime_disable: | ||
5061 | + pm_runtime_put_noidle(dev); | ||
5062 | pm_runtime_set_suspended(dev); | ||
5063 | pm_runtime_disable(dev); | ||
5064 | hfi_destroy(core); | ||
5065 | diff --git a/drivers/media/platform/qcom/venus/vdec.c b/drivers/media/platform/qcom/venus/vdec.c | ||
5066 | index 05b80a66e80ed..658825b4c4e8d 100644 | ||
5067 | --- a/drivers/media/platform/qcom/venus/vdec.c | ||
5068 | +++ b/drivers/media/platform/qcom/venus/vdec.c | ||
5069 | @@ -993,8 +993,6 @@ static int vdec_stop_capture(struct venus_inst *inst) | ||
5070 | break; | ||
5071 | } | ||
5072 | |||
5073 | - INIT_LIST_HEAD(&inst->registeredbufs); | ||
5074 | - | ||
5075 | return ret; | ||
5076 | } | ||
5077 | |||
5078 | @@ -1091,6 +1089,14 @@ static int vdec_buf_init(struct vb2_buffer *vb) | ||
5079 | static void vdec_buf_cleanup(struct vb2_buffer *vb) | ||
5080 | { | ||
5081 | struct venus_inst *inst = vb2_get_drv_priv(vb->vb2_queue); | ||
5082 | + struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb); | ||
5083 | + struct venus_buffer *buf = to_venus_buffer(vbuf); | ||
5084 | + | ||
5085 | + mutex_lock(&inst->lock); | ||
5086 | + if (vb->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) | ||
5087 | + if (!list_empty(&inst->registeredbufs)) | ||
5088 | + list_del_init(&buf->reg_list); | ||
5089 | + mutex_unlock(&inst->lock); | ||
5090 | |||
5091 | inst->buf_count--; | ||
5092 | if (!inst->buf_count) | ||
5093 | diff --git a/drivers/media/platform/rcar-fcp.c b/drivers/media/platform/rcar-fcp.c | ||
5094 | index 5c6b00737fe75..05c712e00a2a7 100644 | ||
5095 | --- a/drivers/media/platform/rcar-fcp.c | ||
5096 | +++ b/drivers/media/platform/rcar-fcp.c | ||
5097 | @@ -103,8 +103,10 @@ int rcar_fcp_enable(struct rcar_fcp_device *fcp) | ||
5098 | return 0; | ||
5099 | |||
5100 | ret = pm_runtime_get_sync(fcp->dev); | ||
5101 | - if (ret < 0) | ||
5102 | + if (ret < 0) { | ||
5103 | + pm_runtime_put_noidle(fcp->dev); | ||
5104 | return ret; | ||
5105 | + } | ||
5106 | |||
5107 | return 0; | ||
5108 | } | ||
5109 | diff --git a/drivers/media/platform/rcar-vin/rcar-csi2.c b/drivers/media/platform/rcar-vin/rcar-csi2.c | ||
5110 | index c14af1b929dff..d27eccfa57cae 100644 | ||
5111 | --- a/drivers/media/platform/rcar-vin/rcar-csi2.c | ||
5112 | +++ b/drivers/media/platform/rcar-vin/rcar-csi2.c | ||
5113 | @@ -361,7 +361,6 @@ struct rcar_csi2 { | ||
5114 | struct media_pad pads[NR_OF_RCAR_CSI2_PAD]; | ||
5115 | |||
5116 | struct v4l2_async_notifier notifier; | ||
5117 | - struct v4l2_async_subdev asd; | ||
5118 | struct v4l2_subdev *remote; | ||
5119 | |||
5120 | struct v4l2_mbus_framefmt mf; | ||
5121 | @@ -810,6 +809,8 @@ static int rcsi2_parse_v4l2(struct rcar_csi2 *priv, | ||
5122 | |||
5123 | static int rcsi2_parse_dt(struct rcar_csi2 *priv) | ||
5124 | { | ||
5125 | + struct v4l2_async_subdev *asd; | ||
5126 | + struct fwnode_handle *fwnode; | ||
5127 | struct device_node *ep; | ||
5128 | struct v4l2_fwnode_endpoint v4l2_ep = { .bus_type = 0 }; | ||
5129 | int ret; | ||
5130 | @@ -833,24 +834,19 @@ static int rcsi2_parse_dt(struct rcar_csi2 *priv) | ||
5131 | return ret; | ||
5132 | } | ||
5133 | |||
5134 | - priv->asd.match.fwnode = | ||
5135 | - fwnode_graph_get_remote_endpoint(of_fwnode_handle(ep)); | ||
5136 | - priv->asd.match_type = V4L2_ASYNC_MATCH_FWNODE; | ||
5137 | - | ||
5138 | + fwnode = fwnode_graph_get_remote_endpoint(of_fwnode_handle(ep)); | ||
5139 | of_node_put(ep); | ||
5140 | |||
5141 | - v4l2_async_notifier_init(&priv->notifier); | ||
5142 | - | ||
5143 | - ret = v4l2_async_notifier_add_subdev(&priv->notifier, &priv->asd); | ||
5144 | - if (ret) { | ||
5145 | - fwnode_handle_put(priv->asd.match.fwnode); | ||
5146 | - return ret; | ||
5147 | - } | ||
5148 | + dev_dbg(priv->dev, "Found '%pOF'\n", to_of_node(fwnode)); | ||
5149 | |||
5150 | + v4l2_async_notifier_init(&priv->notifier); | ||
5151 | priv->notifier.ops = &rcar_csi2_notify_ops; | ||
5152 | |||
5153 | - dev_dbg(priv->dev, "Found '%pOF'\n", | ||
5154 | - to_of_node(priv->asd.match.fwnode)); | ||
5155 | + asd = v4l2_async_notifier_add_fwnode_subdev(&priv->notifier, fwnode, | ||
5156 | + sizeof(*asd)); | ||
5157 | + fwnode_handle_put(fwnode); | ||
5158 | + if (IS_ERR(asd)) | ||
5159 | + return PTR_ERR(asd); | ||
5160 | |||
5161 | ret = v4l2_async_subdev_notifier_register(&priv->subdev, | ||
5162 | &priv->notifier); | ||
5163 | diff --git a/drivers/media/platform/rcar-vin/rcar-dma.c b/drivers/media/platform/rcar-vin/rcar-dma.c | ||
5164 | index 3cb29b2e0b2b1..e5f6360801082 100644 | ||
5165 | --- a/drivers/media/platform/rcar-vin/rcar-dma.c | ||
5166 | +++ b/drivers/media/platform/rcar-vin/rcar-dma.c | ||
5167 | @@ -1334,8 +1334,10 @@ int rvin_set_channel_routing(struct rvin_dev *vin, u8 chsel) | ||
5168 | int ret; | ||
5169 | |||
5170 | ret = pm_runtime_get_sync(vin->dev); | ||
5171 | - if (ret < 0) | ||
5172 | + if (ret < 0) { | ||
5173 | + pm_runtime_put_noidle(vin->dev); | ||
5174 | return ret; | ||
5175 | + } | ||
5176 | |||
5177 | /* Make register writes take effect immediately. */ | ||
5178 | vnmc = rvin_read(vin, VNMC_REG); | ||
5179 | diff --git a/drivers/media/platform/rcar_drif.c b/drivers/media/platform/rcar_drif.c | ||
5180 | index 0f267a237b424..af3c8d405509e 100644 | ||
5181 | --- a/drivers/media/platform/rcar_drif.c | ||
5182 | +++ b/drivers/media/platform/rcar_drif.c | ||
5183 | @@ -185,7 +185,6 @@ struct rcar_drif_frame_buf { | ||
5184 | /* OF graph endpoint's V4L2 async data */ | ||
5185 | struct rcar_drif_graph_ep { | ||
5186 | struct v4l2_subdev *subdev; /* Async matched subdev */ | ||
5187 | - struct v4l2_async_subdev asd; /* Async sub-device descriptor */ | ||
5188 | }; | ||
5189 | |||
5190 | /* DMA buffer */ | ||
5191 | @@ -1105,12 +1104,6 @@ static int rcar_drif_notify_bound(struct v4l2_async_notifier *notifier, | ||
5192 | struct rcar_drif_sdr *sdr = | ||
5193 | container_of(notifier, struct rcar_drif_sdr, notifier); | ||
5194 | |||
5195 | - if (sdr->ep.asd.match.fwnode != | ||
5196 | - of_fwnode_handle(subdev->dev->of_node)) { | ||
5197 | - rdrif_err(sdr, "subdev %s cannot bind\n", subdev->name); | ||
5198 | - return -EINVAL; | ||
5199 | - } | ||
5200 | - | ||
5201 | v4l2_set_subdev_hostdata(subdev, sdr); | ||
5202 | sdr->ep.subdev = subdev; | ||
5203 | rdrif_dbg(sdr, "bound asd %s\n", subdev->name); | ||
5204 | @@ -1214,7 +1207,7 @@ static int rcar_drif_parse_subdevs(struct rcar_drif_sdr *sdr) | ||
5205 | { | ||
5206 | struct v4l2_async_notifier *notifier = &sdr->notifier; | ||
5207 | struct fwnode_handle *fwnode, *ep; | ||
5208 | - int ret; | ||
5209 | + struct v4l2_async_subdev *asd; | ||
5210 | |||
5211 | v4l2_async_notifier_init(notifier); | ||
5212 | |||
5213 | @@ -1223,26 +1216,21 @@ static int rcar_drif_parse_subdevs(struct rcar_drif_sdr *sdr) | ||
5214 | if (!ep) | ||
5215 | return 0; | ||
5216 | |||
5217 | + /* Get the endpoint properties */ | ||
5218 | + rcar_drif_get_ep_properties(sdr, ep); | ||
5219 | + | ||
5220 | fwnode = fwnode_graph_get_remote_port_parent(ep); | ||
5221 | + fwnode_handle_put(ep); | ||
5222 | if (!fwnode) { | ||
5223 | dev_warn(sdr->dev, "bad remote port parent\n"); | ||
5224 | - fwnode_handle_put(ep); | ||
5225 | return -EINVAL; | ||
5226 | } | ||
5227 | |||
5228 | - sdr->ep.asd.match.fwnode = fwnode; | ||
5229 | - sdr->ep.asd.match_type = V4L2_ASYNC_MATCH_FWNODE; | ||
5230 | - ret = v4l2_async_notifier_add_subdev(notifier, &sdr->ep.asd); | ||
5231 | - if (ret) { | ||
5232 | - fwnode_handle_put(fwnode); | ||
5233 | - return ret; | ||
5234 | - } | ||
5235 | - | ||
5236 | - /* Get the endpoint properties */ | ||
5237 | - rcar_drif_get_ep_properties(sdr, ep); | ||
5238 | - | ||
5239 | + asd = v4l2_async_notifier_add_fwnode_subdev(notifier, fwnode, | ||
5240 | + sizeof(*asd)); | ||
5241 | fwnode_handle_put(fwnode); | ||
5242 | - fwnode_handle_put(ep); | ||
5243 | + if (IS_ERR(asd)) | ||
5244 | + return PTR_ERR(asd); | ||
5245 | |||
5246 | return 0; | ||
5247 | } | ||
5248 | diff --git a/drivers/media/platform/rockchip/rga/rga-buf.c b/drivers/media/platform/rockchip/rga/rga-buf.c | ||
5249 | index 36b821ccc1dba..bf9a75b75083b 100644 | ||
5250 | --- a/drivers/media/platform/rockchip/rga/rga-buf.c | ||
5251 | +++ b/drivers/media/platform/rockchip/rga/rga-buf.c | ||
5252 | @@ -81,6 +81,7 @@ static int rga_buf_start_streaming(struct vb2_queue *q, unsigned int count) | ||
5253 | |||
5254 | ret = pm_runtime_get_sync(rga->dev); | ||
5255 | if (ret < 0) { | ||
5256 | + pm_runtime_put_noidle(rga->dev); | ||
5257 | rga_buf_return_buffers(q, VB2_BUF_STATE_QUEUED); | ||
5258 | return ret; | ||
5259 | } | ||
5260 | diff --git a/drivers/media/platform/s3c-camif/camif-core.c b/drivers/media/platform/s3c-camif/camif-core.c | ||
5261 | index c6fbcd7036d6d..ee624804862e2 100644 | ||
5262 | --- a/drivers/media/platform/s3c-camif/camif-core.c | ||
5263 | +++ b/drivers/media/platform/s3c-camif/camif-core.c | ||
5264 | @@ -464,7 +464,7 @@ static int s3c_camif_probe(struct platform_device *pdev) | ||
5265 | |||
5266 | ret = camif_media_dev_init(camif); | ||
5267 | if (ret < 0) | ||
5268 | - goto err_alloc; | ||
5269 | + goto err_pm; | ||
5270 | |||
5271 | ret = camif_register_sensor(camif); | ||
5272 | if (ret < 0) | ||
5273 | @@ -498,10 +498,9 @@ err_sens: | ||
5274 | media_device_unregister(&camif->media_dev); | ||
5275 | media_device_cleanup(&camif->media_dev); | ||
5276 | camif_unregister_media_entities(camif); | ||
5277 | -err_alloc: | ||
5278 | +err_pm: | ||
5279 | pm_runtime_put(dev); | ||
5280 | pm_runtime_disable(dev); | ||
5281 | -err_pm: | ||
5282 | camif_clk_put(camif); | ||
5283 | err_clk: | ||
5284 | s3c_camif_unregister_subdev(camif); | ||
5285 | diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_pm.c b/drivers/media/platform/s5p-mfc/s5p_mfc_pm.c | ||
5286 | index 7d52431c2c837..62d2320a72186 100644 | ||
5287 | --- a/drivers/media/platform/s5p-mfc/s5p_mfc_pm.c | ||
5288 | +++ b/drivers/media/platform/s5p-mfc/s5p_mfc_pm.c | ||
5289 | @@ -79,8 +79,10 @@ int s5p_mfc_power_on(void) | ||
5290 | int i, ret = 0; | ||
5291 | |||
5292 | ret = pm_runtime_get_sync(pm->device); | ||
5293 | - if (ret < 0) | ||
5294 | + if (ret < 0) { | ||
5295 | + pm_runtime_put_noidle(pm->device); | ||
5296 | return ret; | ||
5297 | + } | ||
5298 | |||
5299 | /* clock control */ | ||
5300 | for (i = 0; i < pm->num_clocks; i++) { | ||
5301 | diff --git a/drivers/media/platform/sti/bdisp/bdisp-v4l2.c b/drivers/media/platform/sti/bdisp/bdisp-v4l2.c | ||
5302 | index 675b5f2b4c2ee..a55ddf8d185d5 100644 | ||
5303 | --- a/drivers/media/platform/sti/bdisp/bdisp-v4l2.c | ||
5304 | +++ b/drivers/media/platform/sti/bdisp/bdisp-v4l2.c | ||
5305 | @@ -1367,7 +1367,7 @@ static int bdisp_probe(struct platform_device *pdev) | ||
5306 | ret = pm_runtime_get_sync(dev); | ||
5307 | if (ret < 0) { | ||
5308 | dev_err(dev, "failed to set PM\n"); | ||
5309 | - goto err_dbg; | ||
5310 | + goto err_pm; | ||
5311 | } | ||
5312 | |||
5313 | /* Filters */ | ||
5314 | @@ -1395,7 +1395,6 @@ err_filter: | ||
5315 | bdisp_hw_free_filters(bdisp->dev); | ||
5316 | err_pm: | ||
5317 | pm_runtime_put(dev); | ||
5318 | -err_dbg: | ||
5319 | bdisp_debugfs_remove(bdisp); | ||
5320 | err_v4l2: | ||
5321 | v4l2_device_unregister(&bdisp->v4l2_dev); | ||
5322 | diff --git a/drivers/media/platform/sti/delta/delta-v4l2.c b/drivers/media/platform/sti/delta/delta-v4l2.c | ||
5323 | index 91369fb3ffaa4..2791107e641bc 100644 | ||
5324 | --- a/drivers/media/platform/sti/delta/delta-v4l2.c | ||
5325 | +++ b/drivers/media/platform/sti/delta/delta-v4l2.c | ||
5326 | @@ -954,8 +954,10 @@ static void delta_run_work(struct work_struct *work) | ||
5327 | /* enable the hardware */ | ||
5328 | if (!dec->pm) { | ||
5329 | ret = delta_get_sync(ctx); | ||
5330 | - if (ret) | ||
5331 | + if (ret) { | ||
5332 | + delta_put_autosuspend(ctx); | ||
5333 | goto err; | ||
5334 | + } | ||
5335 | } | ||
5336 | |||
5337 | /* decode this access unit */ | ||
5338 | diff --git a/drivers/media/platform/sti/hva/hva-hw.c b/drivers/media/platform/sti/hva/hva-hw.c | ||
5339 | index 401aaafa17109..43f279e2a6a38 100644 | ||
5340 | --- a/drivers/media/platform/sti/hva/hva-hw.c | ||
5341 | +++ b/drivers/media/platform/sti/hva/hva-hw.c | ||
5342 | @@ -272,6 +272,7 @@ static unsigned long int hva_hw_get_ip_version(struct hva_dev *hva) | ||
5343 | |||
5344 | if (pm_runtime_get_sync(dev) < 0) { | ||
5345 | dev_err(dev, "%s failed to get pm_runtime\n", HVA_PREFIX); | ||
5346 | + pm_runtime_put_noidle(dev); | ||
5347 | mutex_unlock(&hva->protect_mutex); | ||
5348 | return -EFAULT; | ||
5349 | } | ||
5350 | @@ -388,7 +389,7 @@ int hva_hw_probe(struct platform_device *pdev, struct hva_dev *hva) | ||
5351 | ret = pm_runtime_get_sync(dev); | ||
5352 | if (ret < 0) { | ||
5353 | dev_err(dev, "%s failed to set PM\n", HVA_PREFIX); | ||
5354 | - goto err_clk; | ||
5355 | + goto err_pm; | ||
5356 | } | ||
5357 | |||
5358 | /* check IP hardware version */ | ||
5359 | @@ -553,6 +554,7 @@ void hva_hw_dump_regs(struct hva_dev *hva, struct seq_file *s) | ||
5360 | |||
5361 | if (pm_runtime_get_sync(dev) < 0) { | ||
5362 | seq_puts(s, "Cannot wake up IP\n"); | ||
5363 | + pm_runtime_put_noidle(dev); | ||
5364 | mutex_unlock(&hva->protect_mutex); | ||
5365 | return; | ||
5366 | } | ||
5367 | diff --git a/drivers/media/platform/stm32/stm32-dcmi.c b/drivers/media/platform/stm32/stm32-dcmi.c | ||
5368 | index 9392e3409fba0..d41475f56ab54 100644 | ||
5369 | --- a/drivers/media/platform/stm32/stm32-dcmi.c | ||
5370 | +++ b/drivers/media/platform/stm32/stm32-dcmi.c | ||
5371 | @@ -733,7 +733,7 @@ static int dcmi_start_streaming(struct vb2_queue *vq, unsigned int count) | ||
5372 | if (ret < 0) { | ||
5373 | dev_err(dcmi->dev, "%s: Failed to start streaming, cannot get sync (%d)\n", | ||
5374 | __func__, ret); | ||
5375 | - goto err_release_buffers; | ||
5376 | + goto err_pm_put; | ||
5377 | } | ||
5378 | |||
5379 | ret = media_pipeline_start(&dcmi->vdev->entity, &dcmi->pipeline); | ||
5380 | @@ -837,8 +837,6 @@ err_media_pipeline_stop: | ||
5381 | |||
5382 | err_pm_put: | ||
5383 | pm_runtime_put(dcmi->dev); | ||
5384 | - | ||
5385 | -err_release_buffers: | ||
5386 | spin_lock_irq(&dcmi->irqlock); | ||
5387 | /* | ||
5388 | * Return all buffers to vb2 in QUEUED state. | ||
5389 | diff --git a/drivers/media/platform/ti-vpe/vpe.c b/drivers/media/platform/ti-vpe/vpe.c | ||
5390 | index 8b14ba4a3d9ea..817bd13370eff 100644 | ||
5391 | --- a/drivers/media/platform/ti-vpe/vpe.c | ||
5392 | +++ b/drivers/media/platform/ti-vpe/vpe.c | ||
5393 | @@ -2435,6 +2435,8 @@ static int vpe_runtime_get(struct platform_device *pdev) | ||
5394 | |||
5395 | r = pm_runtime_get_sync(&pdev->dev); | ||
5396 | WARN_ON(r < 0); | ||
5397 | + if (r) | ||
5398 | + pm_runtime_put_noidle(&pdev->dev); | ||
5399 | return r < 0 ? r : 0; | ||
5400 | } | ||
5401 | |||
5402 | diff --git a/drivers/media/platform/vsp1/vsp1_drv.c b/drivers/media/platform/vsp1/vsp1_drv.c | ||
5403 | index c650e45bb0ad1..dc62533cf32ce 100644 | ||
5404 | --- a/drivers/media/platform/vsp1/vsp1_drv.c | ||
5405 | +++ b/drivers/media/platform/vsp1/vsp1_drv.c | ||
5406 | @@ -562,7 +562,12 @@ int vsp1_device_get(struct vsp1_device *vsp1) | ||
5407 | int ret; | ||
5408 | |||
5409 | ret = pm_runtime_get_sync(vsp1->dev); | ||
5410 | - return ret < 0 ? ret : 0; | ||
5411 | + if (ret < 0) { | ||
5412 | + pm_runtime_put_noidle(vsp1->dev); | ||
5413 | + return ret; | ||
5414 | + } | ||
5415 | + | ||
5416 | + return 0; | ||
5417 | } | ||
5418 | |||
5419 | /* | ||
5420 | @@ -845,12 +850,12 @@ static int vsp1_probe(struct platform_device *pdev) | ||
5421 | /* Configure device parameters based on the version register. */ | ||
5422 | pm_runtime_enable(&pdev->dev); | ||
5423 | |||
5424 | - ret = pm_runtime_get_sync(&pdev->dev); | ||
5425 | + ret = vsp1_device_get(vsp1); | ||
5426 | if (ret < 0) | ||
5427 | goto done; | ||
5428 | |||
5429 | vsp1->version = vsp1_read(vsp1, VI6_IP_VERSION); | ||
5430 | - pm_runtime_put_sync(&pdev->dev); | ||
5431 | + vsp1_device_put(vsp1); | ||
5432 | |||
5433 | for (i = 0; i < ARRAY_SIZE(vsp1_device_infos); ++i) { | ||
5434 | if ((vsp1->version & VI6_IP_VERSION_MODEL_MASK) == | ||
5435 | diff --git a/drivers/media/rc/ati_remote.c b/drivers/media/rc/ati_remote.c | ||
5436 | index 9cdef17b4793f..c12dda73cdd53 100644 | ||
5437 | --- a/drivers/media/rc/ati_remote.c | ||
5438 | +++ b/drivers/media/rc/ati_remote.c | ||
5439 | @@ -835,6 +835,10 @@ static int ati_remote_probe(struct usb_interface *interface, | ||
5440 | err("%s: endpoint_in message size==0? \n", __func__); | ||
5441 | return -ENODEV; | ||
5442 | } | ||
5443 | + if (!usb_endpoint_is_int_out(endpoint_out)) { | ||
5444 | + err("%s: Unexpected endpoint_out\n", __func__); | ||
5445 | + return -ENODEV; | ||
5446 | + } | ||
5447 | |||
5448 | ati_remote = kzalloc(sizeof (struct ati_remote), GFP_KERNEL); | ||
5449 | rc_dev = rc_allocate_device(RC_DRIVER_SCANCODE); | ||
5450 | diff --git a/drivers/media/tuners/tuner-simple.c b/drivers/media/tuners/tuner-simple.c | ||
5451 | index b6e70fada3fb2..8fb186b25d6af 100644 | ||
5452 | --- a/drivers/media/tuners/tuner-simple.c | ||
5453 | +++ b/drivers/media/tuners/tuner-simple.c | ||
5454 | @@ -500,7 +500,7 @@ static int simple_radio_bandswitch(struct dvb_frontend *fe, u8 *buffer) | ||
5455 | case TUNER_TENA_9533_DI: | ||
5456 | case TUNER_YMEC_TVF_5533MF: | ||
5457 | tuner_dbg("This tuner doesn't have FM. Most cards have a TEA5767 for FM\n"); | ||
5458 | - return 0; | ||
5459 | + return -EINVAL; | ||
5460 | case TUNER_PHILIPS_FM1216ME_MK3: | ||
5461 | case TUNER_PHILIPS_FM1236_MK3: | ||
5462 | case TUNER_PHILIPS_FMD1216ME_MK3: | ||
5463 | @@ -702,7 +702,8 @@ static int simple_set_radio_freq(struct dvb_frontend *fe, | ||
5464 | TUNER_RATIO_SELECT_50; /* 50 kHz step */ | ||
5465 | |||
5466 | /* Bandswitch byte */ | ||
5467 | - simple_radio_bandswitch(fe, &buffer[0]); | ||
5468 | + if (simple_radio_bandswitch(fe, &buffer[0])) | ||
5469 | + return 0; | ||
5470 | |||
5471 | /* Convert from 1/16 kHz V4L steps to 1/20 MHz (=50 kHz) PLL steps | ||
5472 | freq * (1 Mhz / 16000 V4L steps) * (20 PLL steps / 1 MHz) = | ||
5473 | diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_ctrl.c | ||
5474 | index e399b9fad7574..a30a8a731eda8 100644 | ||
5475 | --- a/drivers/media/usb/uvc/uvc_ctrl.c | ||
5476 | +++ b/drivers/media/usb/uvc/uvc_ctrl.c | ||
5477 | @@ -773,12 +773,16 @@ static s32 uvc_get_le_value(struct uvc_control_mapping *mapping, | ||
5478 | offset &= 7; | ||
5479 | mask = ((1LL << bits) - 1) << offset; | ||
5480 | |||
5481 | - for (; bits > 0; data++) { | ||
5482 | + while (1) { | ||
5483 | u8 byte = *data & mask; | ||
5484 | value |= offset > 0 ? (byte >> offset) : (byte << (-offset)); | ||
5485 | bits -= 8 - (offset > 0 ? offset : 0); | ||
5486 | + if (bits <= 0) | ||
5487 | + break; | ||
5488 | + | ||
5489 | offset -= 8; | ||
5490 | mask = (1 << bits) - 1; | ||
5491 | + data++; | ||
5492 | } | ||
5493 | |||
5494 | /* Sign-extend the value if needed. */ | ||
5495 | diff --git a/drivers/media/usb/uvc/uvc_entity.c b/drivers/media/usb/uvc/uvc_entity.c | ||
5496 | index b4499cddeffe5..ca3a9c2eec271 100644 | ||
5497 | --- a/drivers/media/usb/uvc/uvc_entity.c | ||
5498 | +++ b/drivers/media/usb/uvc/uvc_entity.c | ||
5499 | @@ -73,10 +73,45 @@ static int uvc_mc_init_entity(struct uvc_video_chain *chain, | ||
5500 | int ret; | ||
5501 | |||
5502 | if (UVC_ENTITY_TYPE(entity) != UVC_TT_STREAMING) { | ||
5503 | + u32 function; | ||
5504 | + | ||
5505 | v4l2_subdev_init(&entity->subdev, &uvc_subdev_ops); | ||
5506 | strscpy(entity->subdev.name, entity->name, | ||
5507 | sizeof(entity->subdev.name)); | ||
5508 | |||
5509 | + switch (UVC_ENTITY_TYPE(entity)) { | ||
5510 | + case UVC_VC_SELECTOR_UNIT: | ||
5511 | + function = MEDIA_ENT_F_VID_MUX; | ||
5512 | + break; | ||
5513 | + case UVC_VC_PROCESSING_UNIT: | ||
5514 | + case UVC_VC_EXTENSION_UNIT: | ||
5515 | + /* For lack of a better option. */ | ||
5516 | + function = MEDIA_ENT_F_PROC_VIDEO_PIXEL_FORMATTER; | ||
5517 | + break; | ||
5518 | + case UVC_COMPOSITE_CONNECTOR: | ||
5519 | + case UVC_COMPONENT_CONNECTOR: | ||
5520 | + function = MEDIA_ENT_F_CONN_COMPOSITE; | ||
5521 | + break; | ||
5522 | + case UVC_SVIDEO_CONNECTOR: | ||
5523 | + function = MEDIA_ENT_F_CONN_SVIDEO; | ||
5524 | + break; | ||
5525 | + case UVC_ITT_CAMERA: | ||
5526 | + function = MEDIA_ENT_F_CAM_SENSOR; | ||
5527 | + break; | ||
5528 | + case UVC_TT_VENDOR_SPECIFIC: | ||
5529 | + case UVC_ITT_VENDOR_SPECIFIC: | ||
5530 | + case UVC_ITT_MEDIA_TRANSPORT_INPUT: | ||
5531 | + case UVC_OTT_VENDOR_SPECIFIC: | ||
5532 | + case UVC_OTT_DISPLAY: | ||
5533 | + case UVC_OTT_MEDIA_TRANSPORT_OUTPUT: | ||
5534 | + case UVC_EXTERNAL_VENDOR_SPECIFIC: | ||
5535 | + default: | ||
5536 | + function = MEDIA_ENT_F_V4L2_SUBDEV_UNKNOWN; | ||
5537 | + break; | ||
5538 | + } | ||
5539 | + | ||
5540 | + entity->subdev.entity.function = function; | ||
5541 | + | ||
5542 | ret = media_entity_pads_init(&entity->subdev.entity, | ||
5543 | entity->num_pads, entity->pads); | ||
5544 | |||
5545 | diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v4l2.c | ||
5546 | index 0335e69b70abe..5e6f3153b5ff8 100644 | ||
5547 | --- a/drivers/media/usb/uvc/uvc_v4l2.c | ||
5548 | +++ b/drivers/media/usb/uvc/uvc_v4l2.c | ||
5549 | @@ -247,11 +247,41 @@ static int uvc_v4l2_try_format(struct uvc_streaming *stream, | ||
5550 | if (ret < 0) | ||
5551 | goto done; | ||
5552 | |||
5553 | + /* After the probe, update fmt with the values returned from | ||
5554 | + * negotiation with the device. | ||
5555 | + */ | ||
5556 | + for (i = 0; i < stream->nformats; ++i) { | ||
5557 | + if (probe->bFormatIndex == stream->format[i].index) { | ||
5558 | + format = &stream->format[i]; | ||
5559 | + break; | ||
5560 | + } | ||
5561 | + } | ||
5562 | + | ||
5563 | + if (i == stream->nformats) { | ||
5564 | + uvc_trace(UVC_TRACE_FORMAT, "Unknown bFormatIndex %u\n", | ||
5565 | + probe->bFormatIndex); | ||
5566 | + return -EINVAL; | ||
5567 | + } | ||
5568 | + | ||
5569 | + for (i = 0; i < format->nframes; ++i) { | ||
5570 | + if (probe->bFrameIndex == format->frame[i].bFrameIndex) { | ||
5571 | + frame = &format->frame[i]; | ||
5572 | + break; | ||
5573 | + } | ||
5574 | + } | ||
5575 | + | ||
5576 | + if (i == format->nframes) { | ||
5577 | + uvc_trace(UVC_TRACE_FORMAT, "Unknown bFrameIndex %u\n", | ||
5578 | + probe->bFrameIndex); | ||
5579 | + return -EINVAL; | ||
5580 | + } | ||
5581 | + | ||
5582 | fmt->fmt.pix.width = frame->wWidth; | ||
5583 | fmt->fmt.pix.height = frame->wHeight; | ||
5584 | fmt->fmt.pix.field = V4L2_FIELD_NONE; | ||
5585 | fmt->fmt.pix.bytesperline = uvc_v4l2_get_bytesperline(format, frame); | ||
5586 | fmt->fmt.pix.sizeimage = probe->dwMaxVideoFrameSize; | ||
5587 | + fmt->fmt.pix.pixelformat = format->fcc; | ||
5588 | fmt->fmt.pix.colorspace = format->colorspace; | ||
5589 | |||
5590 | if (uvc_format != NULL) | ||
5591 | diff --git a/drivers/memory/fsl-corenet-cf.c b/drivers/memory/fsl-corenet-cf.c | ||
5592 | index 0b0ed72016da8..0309bd5a18008 100644 | ||
5593 | --- a/drivers/memory/fsl-corenet-cf.c | ||
5594 | +++ b/drivers/memory/fsl-corenet-cf.c | ||
5595 | @@ -211,10 +211,8 @@ static int ccf_probe(struct platform_device *pdev) | ||
5596 | dev_set_drvdata(&pdev->dev, ccf); | ||
5597 | |||
5598 | irq = platform_get_irq(pdev, 0); | ||
5599 | - if (!irq) { | ||
5600 | - dev_err(&pdev->dev, "%s: no irq\n", __func__); | ||
5601 | - return -ENXIO; | ||
5602 | - } | ||
5603 | + if (irq < 0) | ||
5604 | + return irq; | ||
5605 | |||
5606 | ret = devm_request_irq(&pdev->dev, irq, ccf_irq, 0, pdev->name, ccf); | ||
5607 | if (ret) { | ||
5608 | diff --git a/drivers/memory/omap-gpmc.c b/drivers/memory/omap-gpmc.c | ||
5609 | index eff26c1b13940..27bc417029e11 100644 | ||
5610 | --- a/drivers/memory/omap-gpmc.c | ||
5611 | +++ b/drivers/memory/omap-gpmc.c | ||
5612 | @@ -949,7 +949,7 @@ static int gpmc_cs_remap(int cs, u32 base) | ||
5613 | int ret; | ||
5614 | u32 old_base, size; | ||
5615 | |||
5616 | - if (cs > gpmc_cs_num) { | ||
5617 | + if (cs >= gpmc_cs_num) { | ||
5618 | pr_err("%s: requested chip-select is disabled\n", __func__); | ||
5619 | return -ENODEV; | ||
5620 | } | ||
5621 | @@ -984,7 +984,7 @@ int gpmc_cs_request(int cs, unsigned long size, unsigned long *base) | ||
5622 | struct resource *res = &gpmc->mem; | ||
5623 | int r = -1; | ||
5624 | |||
5625 | - if (cs > gpmc_cs_num) { | ||
5626 | + if (cs >= gpmc_cs_num) { | ||
5627 | pr_err("%s: requested chip-select is disabled\n", __func__); | ||
5628 | return -ENODEV; | ||
5629 | } | ||
5630 | @@ -2274,6 +2274,10 @@ static void gpmc_probe_dt_children(struct platform_device *pdev) | ||
5631 | } | ||
5632 | } | ||
5633 | #else | ||
5634 | +void gpmc_read_settings_dt(struct device_node *np, struct gpmc_settings *p) | ||
5635 | +{ | ||
5636 | + memset(p, 0, sizeof(*p)); | ||
5637 | +} | ||
5638 | static int gpmc_probe_dt(struct platform_device *pdev) | ||
5639 | { | ||
5640 | return 0; | ||
5641 | diff --git a/drivers/mfd/sm501.c b/drivers/mfd/sm501.c | ||
5642 | index 154270f8d8d78..bbcde58e2a11e 100644 | ||
5643 | --- a/drivers/mfd/sm501.c | ||
5644 | +++ b/drivers/mfd/sm501.c | ||
5645 | @@ -1424,8 +1424,14 @@ static int sm501_plat_probe(struct platform_device *dev) | ||
5646 | goto err_claim; | ||
5647 | } | ||
5648 | |||
5649 | - return sm501_init_dev(sm); | ||
5650 | + ret = sm501_init_dev(sm); | ||
5651 | + if (ret) | ||
5652 | + goto err_unmap; | ||
5653 | + | ||
5654 | + return 0; | ||
5655 | |||
5656 | + err_unmap: | ||
5657 | + iounmap(sm->regs); | ||
5658 | err_claim: | ||
5659 | release_resource(sm->regs_claim); | ||
5660 | kfree(sm->regs_claim); | ||
5661 | diff --git a/drivers/misc/cardreader/rtsx_pcr.c b/drivers/misc/cardreader/rtsx_pcr.c | ||
5662 | index 1958833b3b74e..4fd57052ddd3d 100644 | ||
5663 | --- a/drivers/misc/cardreader/rtsx_pcr.c | ||
5664 | +++ b/drivers/misc/cardreader/rtsx_pcr.c | ||
5665 | @@ -1534,12 +1534,14 @@ static int rtsx_pci_probe(struct pci_dev *pcidev, | ||
5666 | ret = mfd_add_devices(&pcidev->dev, pcr->id, rtsx_pcr_cells, | ||
5667 | ARRAY_SIZE(rtsx_pcr_cells), NULL, 0, NULL); | ||
5668 | if (ret < 0) | ||
5669 | - goto disable_irq; | ||
5670 | + goto free_slots; | ||
5671 | |||
5672 | schedule_delayed_work(&pcr->idle_work, msecs_to_jiffies(200)); | ||
5673 | |||
5674 | return 0; | ||
5675 | |||
5676 | +free_slots: | ||
5677 | + kfree(pcr->slots); | ||
5678 | disable_irq: | ||
5679 | free_irq(pcr->irq, (void *)pcr); | ||
5680 | disable_msi: | ||
5681 | diff --git a/drivers/misc/eeprom/at25.c b/drivers/misc/eeprom/at25.c | ||
5682 | index cde9a2fc13250..490ff49d11ede 100644 | ||
5683 | --- a/drivers/misc/eeprom/at25.c | ||
5684 | +++ b/drivers/misc/eeprom/at25.c | ||
5685 | @@ -358,7 +358,7 @@ static int at25_probe(struct spi_device *spi) | ||
5686 | at25->nvmem_config.reg_read = at25_ee_read; | ||
5687 | at25->nvmem_config.reg_write = at25_ee_write; | ||
5688 | at25->nvmem_config.priv = at25; | ||
5689 | - at25->nvmem_config.stride = 4; | ||
5690 | + at25->nvmem_config.stride = 1; | ||
5691 | at25->nvmem_config.word_size = 1; | ||
5692 | at25->nvmem_config.size = chip.byte_len; | ||
5693 | |||
5694 | diff --git a/drivers/misc/mic/scif/scif_rma.c b/drivers/misc/mic/scif/scif_rma.c | ||
5695 | index 01e27682ea303..a486c6c7f4077 100644 | ||
5696 | --- a/drivers/misc/mic/scif/scif_rma.c | ||
5697 | +++ b/drivers/misc/mic/scif/scif_rma.c | ||
5698 | @@ -1381,6 +1381,8 @@ retry: | ||
5699 | (prot & SCIF_PROT_WRITE) ? FOLL_WRITE : 0, | ||
5700 | pinned_pages->pages); | ||
5701 | if (nr_pages != pinned_pages->nr_pages) { | ||
5702 | + if (pinned_pages->nr_pages < 0) | ||
5703 | + pinned_pages->nr_pages = 0; | ||
5704 | if (try_upgrade) { | ||
5705 | if (ulimit) | ||
5706 | __scif_dec_pinned_vm_lock(mm, nr_pages); | ||
5707 | @@ -1400,7 +1402,6 @@ retry: | ||
5708 | |||
5709 | if (pinned_pages->nr_pages < nr_pages) { | ||
5710 | err = -EFAULT; | ||
5711 | - pinned_pages->nr_pages = nr_pages; | ||
5712 | goto dec_pinned; | ||
5713 | } | ||
5714 | |||
5715 | @@ -1413,7 +1414,6 @@ dec_pinned: | ||
5716 | __scif_dec_pinned_vm_lock(mm, nr_pages); | ||
5717 | /* Something went wrong! Rollback */ | ||
5718 | error_unmap: | ||
5719 | - pinned_pages->nr_pages = nr_pages; | ||
5720 | scif_destroy_pinned_pages(pinned_pages); | ||
5721 | *pages = NULL; | ||
5722 | dev_dbg(scif_info.mdev.this_device, | ||
5723 | diff --git a/drivers/misc/mic/vop/vop_main.c b/drivers/misc/mic/vop/vop_main.c | ||
5724 | index 85942f6717c57..8aadc6055df17 100644 | ||
5725 | --- a/drivers/misc/mic/vop/vop_main.c | ||
5726 | +++ b/drivers/misc/mic/vop/vop_main.c | ||
5727 | @@ -320,7 +320,7 @@ static struct virtqueue *vop_find_vq(struct virtio_device *dev, | ||
5728 | /* First assign the vring's allocated in host memory */ | ||
5729 | vqconfig = _vop_vq_config(vdev->desc) + index; | ||
5730 | memcpy_fromio(&config, vqconfig, sizeof(config)); | ||
5731 | - _vr_size = vring_size(le16_to_cpu(config.num), MIC_VIRTIO_RING_ALIGN); | ||
5732 | + _vr_size = round_up(vring_size(le16_to_cpu(config.num), MIC_VIRTIO_RING_ALIGN), 4); | ||
5733 | vr_size = PAGE_ALIGN(_vr_size + sizeof(struct _mic_vring_info)); | ||
5734 | va = vpdev->hw_ops->remap(vpdev, le64_to_cpu(config.address), vr_size); | ||
5735 | if (!va) | ||
5736 | diff --git a/drivers/misc/mic/vop/vop_vringh.c b/drivers/misc/mic/vop/vop_vringh.c | ||
5737 | index 30eac172f0170..7014ffe88632e 100644 | ||
5738 | --- a/drivers/misc/mic/vop/vop_vringh.c | ||
5739 | +++ b/drivers/misc/mic/vop/vop_vringh.c | ||
5740 | @@ -296,7 +296,7 @@ static int vop_virtio_add_device(struct vop_vdev *vdev, | ||
5741 | |||
5742 | num = le16_to_cpu(vqconfig[i].num); | ||
5743 | mutex_init(&vvr->vr_mutex); | ||
5744 | - vr_size = PAGE_ALIGN(vring_size(num, MIC_VIRTIO_RING_ALIGN) + | ||
5745 | + vr_size = PAGE_ALIGN(round_up(vring_size(num, MIC_VIRTIO_RING_ALIGN), 4) + | ||
5746 | sizeof(struct _mic_vring_info)); | ||
5747 | vr->va = (void *) | ||
5748 | __get_free_pages(GFP_KERNEL | __GFP_ZERO, | ||
5749 | @@ -308,7 +308,7 @@ static int vop_virtio_add_device(struct vop_vdev *vdev, | ||
5750 | goto err; | ||
5751 | } | ||
5752 | vr->len = vr_size; | ||
5753 | - vr->info = vr->va + vring_size(num, MIC_VIRTIO_RING_ALIGN); | ||
5754 | + vr->info = vr->va + round_up(vring_size(num, MIC_VIRTIO_RING_ALIGN), 4); | ||
5755 | vr->info->magic = cpu_to_le32(MIC_MAGIC + vdev->virtio_id + i); | ||
5756 | vr_addr = dma_map_single(&vpdev->dev, vr->va, vr_size, | ||
5757 | DMA_BIDIRECTIONAL); | ||
5758 | @@ -602,6 +602,7 @@ static int vop_virtio_copy_from_user(struct vop_vdev *vdev, void __user *ubuf, | ||
5759 | size_t partlen; | ||
5760 | bool dma = VOP_USE_DMA && vi->dma_ch; | ||
5761 | int err = 0; | ||
5762 | + size_t offset = 0; | ||
5763 | |||
5764 | if (dma) { | ||
5765 | dma_alignment = 1 << vi->dma_ch->device->copy_align; | ||
5766 | @@ -655,13 +656,20 @@ memcpy: | ||
5767 | * We are copying to IO below and should ideally use something | ||
5768 | * like copy_from_user_toio(..) if it existed. | ||
5769 | */ | ||
5770 | - if (copy_from_user((void __force *)dbuf, ubuf, len)) { | ||
5771 | - err = -EFAULT; | ||
5772 | - dev_err(vop_dev(vdev), "%s %d err %d\n", | ||
5773 | - __func__, __LINE__, err); | ||
5774 | - goto err; | ||
5775 | + while (len) { | ||
5776 | + partlen = min_t(size_t, len, VOP_INT_DMA_BUF_SIZE); | ||
5777 | + | ||
5778 | + if (copy_from_user(vvr->buf, ubuf + offset, partlen)) { | ||
5779 | + err = -EFAULT; | ||
5780 | + dev_err(vop_dev(vdev), "%s %d err %d\n", | ||
5781 | + __func__, __LINE__, err); | ||
5782 | + goto err; | ||
5783 | + } | ||
5784 | + memcpy_toio(dbuf + offset, vvr->buf, partlen); | ||
5785 | + offset += partlen; | ||
5786 | + vdev->out_bytes += partlen; | ||
5787 | + len -= partlen; | ||
5788 | } | ||
5789 | - vdev->out_bytes += len; | ||
5790 | err = 0; | ||
5791 | err: | ||
5792 | vpdev->hw_ops->unmap(vpdev, dbuf); | ||
5793 | diff --git a/drivers/misc/vmw_vmci/vmci_queue_pair.c b/drivers/misc/vmw_vmci/vmci_queue_pair.c | ||
5794 | index 8531ae7811956..c49065887e8f5 100644 | ||
5795 | --- a/drivers/misc/vmw_vmci/vmci_queue_pair.c | ||
5796 | +++ b/drivers/misc/vmw_vmci/vmci_queue_pair.c | ||
5797 | @@ -657,8 +657,9 @@ static int qp_host_get_user_memory(u64 produce_uva, | ||
5798 | if (retval < (int)produce_q->kernel_if->num_pages) { | ||
5799 | pr_debug("get_user_pages_fast(produce) failed (retval=%d)", | ||
5800 | retval); | ||
5801 | - qp_release_pages(produce_q->kernel_if->u.h.header_page, | ||
5802 | - retval, false); | ||
5803 | + if (retval > 0) | ||
5804 | + qp_release_pages(produce_q->kernel_if->u.h.header_page, | ||
5805 | + retval, false); | ||
5806 | err = VMCI_ERROR_NO_MEM; | ||
5807 | goto out; | ||
5808 | } | ||
5809 | @@ -670,8 +671,9 @@ static int qp_host_get_user_memory(u64 produce_uva, | ||
5810 | if (retval < (int)consume_q->kernel_if->num_pages) { | ||
5811 | pr_debug("get_user_pages_fast(consume) failed (retval=%d)", | ||
5812 | retval); | ||
5813 | - qp_release_pages(consume_q->kernel_if->u.h.header_page, | ||
5814 | - retval, false); | ||
5815 | + if (retval > 0) | ||
5816 | + qp_release_pages(consume_q->kernel_if->u.h.header_page, | ||
5817 | + retval, false); | ||
5818 | qp_release_pages(produce_q->kernel_if->u.h.header_page, | ||
5819 | produce_q->kernel_if->num_pages, false); | ||
5820 | err = VMCI_ERROR_NO_MEM; | ||
5821 | diff --git a/drivers/mmc/core/sdio_cis.c b/drivers/mmc/core/sdio_cis.c | ||
5822 | index e0655278c5c32..3efaa9534a777 100644 | ||
5823 | --- a/drivers/mmc/core/sdio_cis.c | ||
5824 | +++ b/drivers/mmc/core/sdio_cis.c | ||
5825 | @@ -26,6 +26,9 @@ static int cistpl_vers_1(struct mmc_card *card, struct sdio_func *func, | ||
5826 | unsigned i, nr_strings; | ||
5827 | char **buffer, *string; | ||
5828 | |||
5829 | + if (size < 2) | ||
5830 | + return 0; | ||
5831 | + | ||
5832 | /* Find all null-terminated (including zero length) strings in | ||
5833 | the TPLLV1_INFO field. Trailing garbage is ignored. */ | ||
5834 | buf += 2; | ||
5835 | diff --git a/drivers/mtd/lpddr/lpddr2_nvm.c b/drivers/mtd/lpddr/lpddr2_nvm.c | ||
5836 | index 0f1547f09d08b..72f5c7b300790 100644 | ||
5837 | --- a/drivers/mtd/lpddr/lpddr2_nvm.c | ||
5838 | +++ b/drivers/mtd/lpddr/lpddr2_nvm.c | ||
5839 | @@ -393,6 +393,17 @@ static int lpddr2_nvm_lock(struct mtd_info *mtd, loff_t start_add, | ||
5840 | return lpddr2_nvm_do_block_op(mtd, start_add, len, LPDDR2_NVM_LOCK); | ||
5841 | } | ||
5842 | |||
5843 | +static const struct mtd_info lpddr2_nvm_mtd_info = { | ||
5844 | + .type = MTD_RAM, | ||
5845 | + .writesize = 1, | ||
5846 | + .flags = (MTD_CAP_NVRAM | MTD_POWERUP_LOCK), | ||
5847 | + ._read = lpddr2_nvm_read, | ||
5848 | + ._write = lpddr2_nvm_write, | ||
5849 | + ._erase = lpddr2_nvm_erase, | ||
5850 | + ._unlock = lpddr2_nvm_unlock, | ||
5851 | + ._lock = lpddr2_nvm_lock, | ||
5852 | +}; | ||
5853 | + | ||
5854 | /* | ||
5855 | * lpddr2_nvm driver probe method | ||
5856 | */ | ||
5857 | @@ -433,6 +444,7 @@ static int lpddr2_nvm_probe(struct platform_device *pdev) | ||
5858 | .pfow_base = OW_BASE_ADDRESS, | ||
5859 | .fldrv_priv = pcm_data, | ||
5860 | }; | ||
5861 | + | ||
5862 | if (IS_ERR(map->virt)) | ||
5863 | return PTR_ERR(map->virt); | ||
5864 | |||
5865 | @@ -444,22 +456,13 @@ static int lpddr2_nvm_probe(struct platform_device *pdev) | ||
5866 | return PTR_ERR(pcm_data->ctl_regs); | ||
5867 | |||
5868 | /* Populate mtd_info data structure */ | ||
5869 | - *mtd = (struct mtd_info) { | ||
5870 | - .dev = { .parent = &pdev->dev }, | ||
5871 | - .name = pdev->dev.init_name, | ||
5872 | - .type = MTD_RAM, | ||
5873 | - .priv = map, | ||
5874 | - .size = resource_size(add_range), | ||
5875 | - .erasesize = ERASE_BLOCKSIZE * pcm_data->bus_width, | ||
5876 | - .writesize = 1, | ||
5877 | - .writebufsize = WRITE_BUFFSIZE * pcm_data->bus_width, | ||
5878 | - .flags = (MTD_CAP_NVRAM | MTD_POWERUP_LOCK), | ||
5879 | - ._read = lpddr2_nvm_read, | ||
5880 | - ._write = lpddr2_nvm_write, | ||
5881 | - ._erase = lpddr2_nvm_erase, | ||
5882 | - ._unlock = lpddr2_nvm_unlock, | ||
5883 | - ._lock = lpddr2_nvm_lock, | ||
5884 | - }; | ||
5885 | + *mtd = lpddr2_nvm_mtd_info; | ||
5886 | + mtd->dev.parent = &pdev->dev; | ||
5887 | + mtd->name = pdev->dev.init_name; | ||
5888 | + mtd->priv = map; | ||
5889 | + mtd->size = resource_size(add_range); | ||
5890 | + mtd->erasesize = ERASE_BLOCKSIZE * pcm_data->bus_width; | ||
5891 | + mtd->writebufsize = WRITE_BUFFSIZE * pcm_data->bus_width; | ||
5892 | |||
5893 | /* Verify the presence of the device looking for PFOW string */ | ||
5894 | if (!lpddr2_nvm_pfow_present(map)) { | ||
5895 | diff --git a/drivers/mtd/mtdoops.c b/drivers/mtd/mtdoops.c | ||
5896 | index 4ced68be7ed7e..774970bfcf859 100644 | ||
5897 | --- a/drivers/mtd/mtdoops.c | ||
5898 | +++ b/drivers/mtd/mtdoops.c | ||
5899 | @@ -279,12 +279,13 @@ static void mtdoops_do_dump(struct kmsg_dumper *dumper, | ||
5900 | kmsg_dump_get_buffer(dumper, true, cxt->oops_buf + MTDOOPS_HEADER_SIZE, | ||
5901 | record_size - MTDOOPS_HEADER_SIZE, NULL); | ||
5902 | |||
5903 | - /* Panics must be written immediately */ | ||
5904 | - if (reason != KMSG_DUMP_OOPS) | ||
5905 | + if (reason != KMSG_DUMP_OOPS) { | ||
5906 | + /* Panics must be written immediately */ | ||
5907 | mtdoops_write(cxt, 1); | ||
5908 | - | ||
5909 | - /* For other cases, schedule work to write it "nicely" */ | ||
5910 | - schedule_work(&cxt->work_write); | ||
5911 | + } else { | ||
5912 | + /* For other cases, schedule work to write it "nicely" */ | ||
5913 | + schedule_work(&cxt->work_write); | ||
5914 | + } | ||
5915 | } | ||
5916 | |||
5917 | static void mtdoops_notify_add(struct mtd_info *mtd) | ||
5918 | diff --git a/drivers/mtd/nand/raw/vf610_nfc.c b/drivers/mtd/nand/raw/vf610_nfc.c | ||
5919 | index 6b399a75f9aec..b6f114da57143 100644 | ||
5920 | --- a/drivers/mtd/nand/raw/vf610_nfc.c | ||
5921 | +++ b/drivers/mtd/nand/raw/vf610_nfc.c | ||
5922 | @@ -850,8 +850,10 @@ static int vf610_nfc_probe(struct platform_device *pdev) | ||
5923 | } | ||
5924 | |||
5925 | of_id = of_match_device(vf610_nfc_dt_ids, &pdev->dev); | ||
5926 | - if (!of_id) | ||
5927 | - return -ENODEV; | ||
5928 | + if (!of_id) { | ||
5929 | + err = -ENODEV; | ||
5930 | + goto err_disable_clk; | ||
5931 | + } | ||
5932 | |||
5933 | nfc->variant = (enum vf610_nfc_variant)of_id->data; | ||
5934 | |||
5935 | diff --git a/drivers/mtd/nand/spi/gigadevice.c b/drivers/mtd/nand/spi/gigadevice.c | ||
5936 | index e99d425aa93f5..b13b39763a405 100644 | ||
5937 | --- a/drivers/mtd/nand/spi/gigadevice.c | ||
5938 | +++ b/drivers/mtd/nand/spi/gigadevice.c | ||
5939 | @@ -21,7 +21,7 @@ | ||
5940 | #define GD5FXGQ4UXFXXG_STATUS_ECC_UNCOR_ERROR (7 << 4) | ||
5941 | |||
5942 | static SPINAND_OP_VARIANTS(read_cache_variants, | ||
5943 | - SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 2, NULL, 0), | ||
5944 | + SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 1, NULL, 0), | ||
5945 | SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0), | ||
5946 | SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP(0, 1, NULL, 0), | ||
5947 | SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0), | ||
5948 | @@ -29,7 +29,7 @@ static SPINAND_OP_VARIANTS(read_cache_variants, | ||
5949 | SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0)); | ||
5950 | |||
5951 | static SPINAND_OP_VARIANTS(read_cache_variants_f, | ||
5952 | - SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 2, NULL, 0), | ||
5953 | + SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 1, NULL, 0), | ||
5954 | SPINAND_PAGE_READ_FROM_CACHE_X4_OP_3A(0, 1, NULL, 0), | ||
5955 | SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP(0, 1, NULL, 0), | ||
5956 | SPINAND_PAGE_READ_FROM_CACHE_X2_OP_3A(0, 1, NULL, 0), | ||
5957 | @@ -201,7 +201,7 @@ static const struct spinand_info gigadevice_spinand_table[] = { | ||
5958 | SPINAND_INFO_OP_VARIANTS(&read_cache_variants, | ||
5959 | &write_cache_variants, | ||
5960 | &update_cache_variants), | ||
5961 | - 0, | ||
5962 | + SPINAND_HAS_QE_BIT, | ||
5963 | SPINAND_ECCINFO(&gd5fxgq4xa_ooblayout, | ||
5964 | gd5fxgq4xa_ecc_get_status)), | ||
5965 | SPINAND_INFO("GD5F2GQ4xA", 0xF2, | ||
5966 | @@ -210,7 +210,7 @@ static const struct spinand_info gigadevice_spinand_table[] = { | ||
5967 | SPINAND_INFO_OP_VARIANTS(&read_cache_variants, | ||
5968 | &write_cache_variants, | ||
5969 | &update_cache_variants), | ||
5970 | - 0, | ||
5971 | + SPINAND_HAS_QE_BIT, | ||
5972 | SPINAND_ECCINFO(&gd5fxgq4xa_ooblayout, | ||
5973 | gd5fxgq4xa_ecc_get_status)), | ||
5974 | SPINAND_INFO("GD5F4GQ4xA", 0xF4, | ||
5975 | @@ -219,7 +219,7 @@ static const struct spinand_info gigadevice_spinand_table[] = { | ||
5976 | SPINAND_INFO_OP_VARIANTS(&read_cache_variants, | ||
5977 | &write_cache_variants, | ||
5978 | &update_cache_variants), | ||
5979 | - 0, | ||
5980 | + SPINAND_HAS_QE_BIT, | ||
5981 | SPINAND_ECCINFO(&gd5fxgq4xa_ooblayout, | ||
5982 | gd5fxgq4xa_ecc_get_status)), | ||
5983 | SPINAND_INFO("GD5F1GQ4UExxG", 0xd1, | ||
5984 | @@ -228,7 +228,7 @@ static const struct spinand_info gigadevice_spinand_table[] = { | ||
5985 | SPINAND_INFO_OP_VARIANTS(&read_cache_variants, | ||
5986 | &write_cache_variants, | ||
5987 | &update_cache_variants), | ||
5988 | - 0, | ||
5989 | + SPINAND_HAS_QE_BIT, | ||
5990 | SPINAND_ECCINFO(&gd5fxgq4_variant2_ooblayout, | ||
5991 | gd5fxgq4uexxg_ecc_get_status)), | ||
5992 | SPINAND_INFO("GD5F1GQ4UFxxG", 0xb148, | ||
5993 | @@ -237,7 +237,7 @@ static const struct spinand_info gigadevice_spinand_table[] = { | ||
5994 | SPINAND_INFO_OP_VARIANTS(&read_cache_variants_f, | ||
5995 | &write_cache_variants, | ||
5996 | &update_cache_variants), | ||
5997 | - 0, | ||
5998 | + SPINAND_HAS_QE_BIT, | ||
5999 | SPINAND_ECCINFO(&gd5fxgq4_variant2_ooblayout, | ||
6000 | gd5fxgq4ufxxg_ecc_get_status)), | ||
6001 | }; | ||
6002 | diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c | ||
6003 | index e5c207ad3c77d..aaa7ed1dc97ee 100644 | ||
6004 | --- a/drivers/net/can/flexcan.c | ||
6005 | +++ b/drivers/net/can/flexcan.c | ||
6006 | @@ -1232,18 +1232,23 @@ static int flexcan_chip_start(struct net_device *dev) | ||
6007 | return err; | ||
6008 | } | ||
6009 | |||
6010 | -/* flexcan_chip_stop | ||
6011 | +/* __flexcan_chip_stop | ||
6012 | * | ||
6013 | - * this functions is entered with clocks enabled | ||
6014 | + * this function is entered with clocks enabled | ||
6015 | */ | ||
6016 | -static void flexcan_chip_stop(struct net_device *dev) | ||
6017 | +static int __flexcan_chip_stop(struct net_device *dev, bool disable_on_error) | ||
6018 | { | ||
6019 | struct flexcan_priv *priv = netdev_priv(dev); | ||
6020 | struct flexcan_regs __iomem *regs = priv->regs; | ||
6021 | + int err; | ||
6022 | |||
6023 | /* freeze + disable module */ | ||
6024 | - flexcan_chip_freeze(priv); | ||
6025 | - flexcan_chip_disable(priv); | ||
6026 | + err = flexcan_chip_freeze(priv); | ||
6027 | + if (err && !disable_on_error) | ||
6028 | + return err; | ||
6029 | + err = flexcan_chip_disable(priv); | ||
6030 | + if (err && !disable_on_error) | ||
6031 | + goto out_chip_unfreeze; | ||
6032 | |||
6033 | /* Disable all interrupts */ | ||
6034 | priv->write(0, ®s->imask2); | ||
6035 | @@ -1253,6 +1258,23 @@ static void flexcan_chip_stop(struct net_device *dev) | ||
6036 | |||
6037 | flexcan_transceiver_disable(priv); | ||
6038 | priv->can.state = CAN_STATE_STOPPED; | ||
6039 | + | ||
6040 | + return 0; | ||
6041 | + | ||
6042 | + out_chip_unfreeze: | ||
6043 | + flexcan_chip_unfreeze(priv); | ||
6044 | + | ||
6045 | + return err; | ||
6046 | +} | ||
6047 | + | ||
6048 | +static inline int flexcan_chip_stop_disable_on_error(struct net_device *dev) | ||
6049 | +{ | ||
6050 | + return __flexcan_chip_stop(dev, true); | ||
6051 | +} | ||
6052 | + | ||
6053 | +static inline int flexcan_chip_stop(struct net_device *dev) | ||
6054 | +{ | ||
6055 | + return __flexcan_chip_stop(dev, false); | ||
6056 | } | ||
6057 | |||
6058 | static int flexcan_open(struct net_device *dev) | ||
6059 | @@ -1341,7 +1363,7 @@ static int flexcan_close(struct net_device *dev) | ||
6060 | |||
6061 | netif_stop_queue(dev); | ||
6062 | can_rx_offload_disable(&priv->offload); | ||
6063 | - flexcan_chip_stop(dev); | ||
6064 | + flexcan_chip_stop_disable_on_error(dev); | ||
6065 | |||
6066 | can_rx_offload_del(&priv->offload); | ||
6067 | free_irq(dev->irq, dev); | ||
6068 | diff --git a/drivers/net/can/m_can/m_can_platform.c b/drivers/net/can/m_can/m_can_platform.c | ||
6069 | index 38ea5e600fb84..e6d0cb9ee02f0 100644 | ||
6070 | --- a/drivers/net/can/m_can/m_can_platform.c | ||
6071 | +++ b/drivers/net/can/m_can/m_can_platform.c | ||
6072 | @@ -144,8 +144,6 @@ static int __maybe_unused m_can_runtime_suspend(struct device *dev) | ||
6073 | struct net_device *ndev = dev_get_drvdata(dev); | ||
6074 | struct m_can_classdev *mcan_class = netdev_priv(ndev); | ||
6075 | |||
6076 | - m_can_class_suspend(dev); | ||
6077 | - | ||
6078 | clk_disable_unprepare(mcan_class->cclk); | ||
6079 | clk_disable_unprepare(mcan_class->hclk); | ||
6080 | |||
6081 | diff --git a/drivers/net/dsa/realtek-smi-core.h b/drivers/net/dsa/realtek-smi-core.h | ||
6082 | index 9a63b51e1d82f..6f2dab7e33d65 100644 | ||
6083 | --- a/drivers/net/dsa/realtek-smi-core.h | ||
6084 | +++ b/drivers/net/dsa/realtek-smi-core.h | ||
6085 | @@ -25,6 +25,9 @@ struct rtl8366_mib_counter { | ||
6086 | const char *name; | ||
6087 | }; | ||
6088 | |||
6089 | +/** | ||
6090 | + * struct rtl8366_vlan_mc - Virtual LAN member configuration | ||
6091 | + */ | ||
6092 | struct rtl8366_vlan_mc { | ||
6093 | u16 vid; | ||
6094 | u16 untag; | ||
6095 | @@ -119,7 +122,6 @@ int realtek_smi_setup_mdio(struct realtek_smi *smi); | ||
6096 | int rtl8366_mc_is_used(struct realtek_smi *smi, int mc_index, int *used); | ||
6097 | int rtl8366_set_vlan(struct realtek_smi *smi, int vid, u32 member, | ||
6098 | u32 untag, u32 fid); | ||
6099 | -int rtl8366_get_pvid(struct realtek_smi *smi, int port, int *val); | ||
6100 | int rtl8366_set_pvid(struct realtek_smi *smi, unsigned int port, | ||
6101 | unsigned int vid); | ||
6102 | int rtl8366_enable_vlan4k(struct realtek_smi *smi, bool enable); | ||
6103 | diff --git a/drivers/net/dsa/rtl8366.c b/drivers/net/dsa/rtl8366.c | ||
6104 | index 99cdb2f18fa2f..49c626a336803 100644 | ||
6105 | --- a/drivers/net/dsa/rtl8366.c | ||
6106 | +++ b/drivers/net/dsa/rtl8366.c | ||
6107 | @@ -36,12 +36,113 @@ int rtl8366_mc_is_used(struct realtek_smi *smi, int mc_index, int *used) | ||
6108 | } | ||
6109 | EXPORT_SYMBOL_GPL(rtl8366_mc_is_used); | ||
6110 | |||
6111 | +/** | ||
6112 | + * rtl8366_obtain_mc() - retrieve or allocate a VLAN member configuration | ||
6113 | + * @smi: the Realtek SMI device instance | ||
6114 | + * @vid: the VLAN ID to look up or allocate | ||
6115 | + * @vlanmc: the pointer will be assigned to a pointer to a valid member config | ||
6116 | + * if successful | ||
6117 | + * @return: index of a new member config or negative error number | ||
6118 | + */ | ||
6119 | +static int rtl8366_obtain_mc(struct realtek_smi *smi, int vid, | ||
6120 | + struct rtl8366_vlan_mc *vlanmc) | ||
6121 | +{ | ||
6122 | + struct rtl8366_vlan_4k vlan4k; | ||
6123 | + int ret; | ||
6124 | + int i; | ||
6125 | + | ||
6126 | + /* Try to find an existing member config entry for this VID */ | ||
6127 | + for (i = 0; i < smi->num_vlan_mc; i++) { | ||
6128 | + ret = smi->ops->get_vlan_mc(smi, i, vlanmc); | ||
6129 | + if (ret) { | ||
6130 | + dev_err(smi->dev, "error searching for VLAN MC %d for VID %d\n", | ||
6131 | + i, vid); | ||
6132 | + return ret; | ||
6133 | + } | ||
6134 | + | ||
6135 | + if (vid == vlanmc->vid) | ||
6136 | + return i; | ||
6137 | + } | ||
6138 | + | ||
6139 | + /* We have no MC entry for this VID, try to find an empty one */ | ||
6140 | + for (i = 0; i < smi->num_vlan_mc; i++) { | ||
6141 | + ret = smi->ops->get_vlan_mc(smi, i, vlanmc); | ||
6142 | + if (ret) { | ||
6143 | + dev_err(smi->dev, "error searching for VLAN MC %d for VID %d\n", | ||
6144 | + i, vid); | ||
6145 | + return ret; | ||
6146 | + } | ||
6147 | + | ||
6148 | + if (vlanmc->vid == 0 && vlanmc->member == 0) { | ||
6149 | + /* Update the entry from the 4K table */ | ||
6150 | + ret = smi->ops->get_vlan_4k(smi, vid, &vlan4k); | ||
6151 | + if (ret) { | ||
6152 | + dev_err(smi->dev, "error looking for 4K VLAN MC %d for VID %d\n", | ||
6153 | + i, vid); | ||
6154 | + return ret; | ||
6155 | + } | ||
6156 | + | ||
6157 | + vlanmc->vid = vid; | ||
6158 | + vlanmc->member = vlan4k.member; | ||
6159 | + vlanmc->untag = vlan4k.untag; | ||
6160 | + vlanmc->fid = vlan4k.fid; | ||
6161 | + ret = smi->ops->set_vlan_mc(smi, i, vlanmc); | ||
6162 | + if (ret) { | ||
6163 | + dev_err(smi->dev, "unable to set/update VLAN MC %d for VID %d\n", | ||
6164 | + i, vid); | ||
6165 | + return ret; | ||
6166 | + } | ||
6167 | + | ||
6168 | + dev_dbg(smi->dev, "created new MC at index %d for VID %d\n", | ||
6169 | + i, vid); | ||
6170 | + return i; | ||
6171 | + } | ||
6172 | + } | ||
6173 | + | ||
6174 | + /* MC table is full, try to find an unused entry and replace it */ | ||
6175 | + for (i = 0; i < smi->num_vlan_mc; i++) { | ||
6176 | + int used; | ||
6177 | + | ||
6178 | + ret = rtl8366_mc_is_used(smi, i, &used); | ||
6179 | + if (ret) | ||
6180 | + return ret; | ||
6181 | + | ||
6182 | + if (!used) { | ||
6183 | + /* Update the entry from the 4K table */ | ||
6184 | + ret = smi->ops->get_vlan_4k(smi, vid, &vlan4k); | ||
6185 | + if (ret) | ||
6186 | + return ret; | ||
6187 | + | ||
6188 | + vlanmc->vid = vid; | ||
6189 | + vlanmc->member = vlan4k.member; | ||
6190 | + vlanmc->untag = vlan4k.untag; | ||
6191 | + vlanmc->fid = vlan4k.fid; | ||
6192 | + ret = smi->ops->set_vlan_mc(smi, i, vlanmc); | ||
6193 | + if (ret) { | ||
6194 | + dev_err(smi->dev, "unable to set/update VLAN MC %d for VID %d\n", | ||
6195 | + i, vid); | ||
6196 | + return ret; | ||
6197 | + } | ||
6198 | + dev_dbg(smi->dev, "recycled MC at index %i for VID %d\n", | ||
6199 | + i, vid); | ||
6200 | + return i; | ||
6201 | + } | ||
6202 | + } | ||
6203 | + | ||
6204 | + dev_err(smi->dev, "all VLAN member configurations are in use\n"); | ||
6205 | + return -ENOSPC; | ||
6206 | +} | ||
6207 | + | ||
6208 | int rtl8366_set_vlan(struct realtek_smi *smi, int vid, u32 member, | ||
6209 | u32 untag, u32 fid) | ||
6210 | { | ||
6211 | + struct rtl8366_vlan_mc vlanmc; | ||
6212 | struct rtl8366_vlan_4k vlan4k; | ||
6213 | + int mc; | ||
6214 | int ret; | ||
6215 | - int i; | ||
6216 | + | ||
6217 | + if (!smi->ops->is_vlan_valid(smi, vid)) | ||
6218 | + return -EINVAL; | ||
6219 | |||
6220 | dev_dbg(smi->dev, | ||
6221 | "setting VLAN%d 4k members: 0x%02x, untagged: 0x%02x\n", | ||
6222 | @@ -63,133 +164,58 @@ int rtl8366_set_vlan(struct realtek_smi *smi, int vid, u32 member, | ||
6223 | "resulting VLAN%d 4k members: 0x%02x, untagged: 0x%02x\n", | ||
6224 | vid, vlan4k.member, vlan4k.untag); | ||
6225 | |||
6226 | - /* Try to find an existing MC entry for this VID */ | ||
6227 | - for (i = 0; i < smi->num_vlan_mc; i++) { | ||
6228 | - struct rtl8366_vlan_mc vlanmc; | ||
6229 | - | ||
6230 | - ret = smi->ops->get_vlan_mc(smi, i, &vlanmc); | ||
6231 | - if (ret) | ||
6232 | - return ret; | ||
6233 | - | ||
6234 | - if (vid == vlanmc.vid) { | ||
6235 | - /* update the MC entry */ | ||
6236 | - vlanmc.member |= member; | ||
6237 | - vlanmc.untag |= untag; | ||
6238 | - vlanmc.fid = fid; | ||
6239 | - | ||
6240 | - ret = smi->ops->set_vlan_mc(smi, i, &vlanmc); | ||
6241 | + /* Find or allocate a member config for this VID */ | ||
6242 | + ret = rtl8366_obtain_mc(smi, vid, &vlanmc); | ||
6243 | + if (ret < 0) | ||
6244 | + return ret; | ||
6245 | + mc = ret; | ||
6246 | |||
6247 | - dev_dbg(smi->dev, | ||
6248 | - "resulting VLAN%d MC members: 0x%02x, untagged: 0x%02x\n", | ||
6249 | - vid, vlanmc.member, vlanmc.untag); | ||
6250 | + /* Update the MC entry */ | ||
6251 | + vlanmc.member |= member; | ||
6252 | + vlanmc.untag |= untag; | ||
6253 | + vlanmc.fid = fid; | ||
6254 | |||
6255 | - break; | ||
6256 | - } | ||
6257 | - } | ||
6258 | + /* Commit updates to the MC entry */ | ||
6259 | + ret = smi->ops->set_vlan_mc(smi, mc, &vlanmc); | ||
6260 | + if (ret) | ||
6261 | + dev_err(smi->dev, "failed to commit changes to VLAN MC index %d for VID %d\n", | ||
6262 | + mc, vid); | ||
6263 | + else | ||
6264 | + dev_dbg(smi->dev, | ||
6265 | + "resulting VLAN%d MC members: 0x%02x, untagged: 0x%02x\n", | ||
6266 | + vid, vlanmc.member, vlanmc.untag); | ||
6267 | |||
6268 | return ret; | ||
6269 | } | ||
6270 | EXPORT_SYMBOL_GPL(rtl8366_set_vlan); | ||
6271 | |||
6272 | -int rtl8366_get_pvid(struct realtek_smi *smi, int port, int *val) | ||
6273 | -{ | ||
6274 | - struct rtl8366_vlan_mc vlanmc; | ||
6275 | - int ret; | ||
6276 | - int index; | ||
6277 | - | ||
6278 | - ret = smi->ops->get_mc_index(smi, port, &index); | ||
6279 | - if (ret) | ||
6280 | - return ret; | ||
6281 | - | ||
6282 | - ret = smi->ops->get_vlan_mc(smi, index, &vlanmc); | ||
6283 | - if (ret) | ||
6284 | - return ret; | ||
6285 | - | ||
6286 | - *val = vlanmc.vid; | ||
6287 | - return 0; | ||
6288 | -} | ||
6289 | -EXPORT_SYMBOL_GPL(rtl8366_get_pvid); | ||
6290 | - | ||
6291 | int rtl8366_set_pvid(struct realtek_smi *smi, unsigned int port, | ||
6292 | unsigned int vid) | ||
6293 | { | ||
6294 | struct rtl8366_vlan_mc vlanmc; | ||
6295 | - struct rtl8366_vlan_4k vlan4k; | ||
6296 | + int mc; | ||
6297 | int ret; | ||
6298 | - int i; | ||
6299 | - | ||
6300 | - /* Try to find an existing MC entry for this VID */ | ||
6301 | - for (i = 0; i < smi->num_vlan_mc; i++) { | ||
6302 | - ret = smi->ops->get_vlan_mc(smi, i, &vlanmc); | ||
6303 | - if (ret) | ||
6304 | - return ret; | ||
6305 | - | ||
6306 | - if (vid == vlanmc.vid) { | ||
6307 | - ret = smi->ops->set_vlan_mc(smi, i, &vlanmc); | ||
6308 | - if (ret) | ||
6309 | - return ret; | ||
6310 | - | ||
6311 | - ret = smi->ops->set_mc_index(smi, port, i); | ||
6312 | - return ret; | ||
6313 | - } | ||
6314 | - } | ||
6315 | - | ||
6316 | - /* We have no MC entry for this VID, try to find an empty one */ | ||
6317 | - for (i = 0; i < smi->num_vlan_mc; i++) { | ||
6318 | - ret = smi->ops->get_vlan_mc(smi, i, &vlanmc); | ||
6319 | - if (ret) | ||
6320 | - return ret; | ||
6321 | - | ||
6322 | - if (vlanmc.vid == 0 && vlanmc.member == 0) { | ||
6323 | - /* Update the entry from the 4K table */ | ||
6324 | - ret = smi->ops->get_vlan_4k(smi, vid, &vlan4k); | ||
6325 | - if (ret) | ||
6326 | - return ret; | ||
6327 | |||
6328 | - vlanmc.vid = vid; | ||
6329 | - vlanmc.member = vlan4k.member; | ||
6330 | - vlanmc.untag = vlan4k.untag; | ||
6331 | - vlanmc.fid = vlan4k.fid; | ||
6332 | - ret = smi->ops->set_vlan_mc(smi, i, &vlanmc); | ||
6333 | - if (ret) | ||
6334 | - return ret; | ||
6335 | - | ||
6336 | - ret = smi->ops->set_mc_index(smi, port, i); | ||
6337 | - return ret; | ||
6338 | - } | ||
6339 | - } | ||
6340 | - | ||
6341 | - /* MC table is full, try to find an unused entry and replace it */ | ||
6342 | - for (i = 0; i < smi->num_vlan_mc; i++) { | ||
6343 | - int used; | ||
6344 | - | ||
6345 | - ret = rtl8366_mc_is_used(smi, i, &used); | ||
6346 | - if (ret) | ||
6347 | - return ret; | ||
6348 | - | ||
6349 | - if (!used) { | ||
6350 | - /* Update the entry from the 4K table */ | ||
6351 | - ret = smi->ops->get_vlan_4k(smi, vid, &vlan4k); | ||
6352 | - if (ret) | ||
6353 | - return ret; | ||
6354 | + if (!smi->ops->is_vlan_valid(smi, vid)) | ||
6355 | + return -EINVAL; | ||
6356 | |||
6357 | - vlanmc.vid = vid; | ||
6358 | - vlanmc.member = vlan4k.member; | ||
6359 | - vlanmc.untag = vlan4k.untag; | ||
6360 | - vlanmc.fid = vlan4k.fid; | ||
6361 | - ret = smi->ops->set_vlan_mc(smi, i, &vlanmc); | ||
6362 | - if (ret) | ||
6363 | - return ret; | ||
6364 | + /* Find or allocate a member config for this VID */ | ||
6365 | + ret = rtl8366_obtain_mc(smi, vid, &vlanmc); | ||
6366 | + if (ret < 0) | ||
6367 | + return ret; | ||
6368 | + mc = ret; | ||
6369 | |||
6370 | - ret = smi->ops->set_mc_index(smi, port, i); | ||
6371 | - return ret; | ||
6372 | - } | ||
6373 | + ret = smi->ops->set_mc_index(smi, port, mc); | ||
6374 | + if (ret) { | ||
6375 | + dev_err(smi->dev, "set PVID: failed to set MC index %d for port %d\n", | ||
6376 | + mc, port); | ||
6377 | + return ret; | ||
6378 | } | ||
6379 | |||
6380 | - dev_err(smi->dev, | ||
6381 | - "all VLAN member configurations are in use\n"); | ||
6382 | + dev_dbg(smi->dev, "set PVID: the PVID for port %d set to %d using existing MC index %d\n", | ||
6383 | + port, vid, mc); | ||
6384 | |||
6385 | - return -ENOSPC; | ||
6386 | + return 0; | ||
6387 | } | ||
6388 | EXPORT_SYMBOL_GPL(rtl8366_set_pvid); | ||
6389 | |||
6390 | @@ -389,7 +415,8 @@ void rtl8366_vlan_add(struct dsa_switch *ds, int port, | ||
6391 | if (!smi->ops->is_vlan_valid(smi, vid)) | ||
6392 | return; | ||
6393 | |||
6394 | - dev_info(smi->dev, "add VLAN on port %d, %s, %s\n", | ||
6395 | + dev_info(smi->dev, "add VLAN %d on port %d, %s, %s\n", | ||
6396 | + vlan->vid_begin, | ||
6397 | port, | ||
6398 | untagged ? "untagged" : "tagged", | ||
6399 | pvid ? " PVID" : "no PVID"); | ||
6400 | @@ -398,34 +425,29 @@ void rtl8366_vlan_add(struct dsa_switch *ds, int port, | ||
6401 | dev_err(smi->dev, "port is DSA or CPU port\n"); | ||
6402 | |||
6403 | for (vid = vlan->vid_begin; vid <= vlan->vid_end; vid++) { | ||
6404 | - int pvid_val = 0; | ||
6405 | - | ||
6406 | - dev_info(smi->dev, "add VLAN %04x\n", vid); | ||
6407 | member |= BIT(port); | ||
6408 | |||
6409 | if (untagged) | ||
6410 | untag |= BIT(port); | ||
6411 | |||
6412 | - /* To ensure that we have a valid MC entry for this VLAN, | ||
6413 | - * initialize the port VLAN ID here. | ||
6414 | - */ | ||
6415 | - ret = rtl8366_get_pvid(smi, port, &pvid_val); | ||
6416 | - if (ret < 0) { | ||
6417 | - dev_err(smi->dev, "could not lookup PVID for port %d\n", | ||
6418 | - port); | ||
6419 | - return; | ||
6420 | - } | ||
6421 | - if (pvid_val == 0) { | ||
6422 | - ret = rtl8366_set_pvid(smi, port, vid); | ||
6423 | - if (ret < 0) | ||
6424 | - return; | ||
6425 | - } | ||
6426 | - | ||
6427 | ret = rtl8366_set_vlan(smi, vid, member, untag, 0); | ||
6428 | if (ret) | ||
6429 | dev_err(smi->dev, | ||
6430 | "failed to set up VLAN %04x", | ||
6431 | vid); | ||
6432 | + | ||
6433 | + if (!pvid) | ||
6434 | + continue; | ||
6435 | + | ||
6436 | + ret = rtl8366_set_pvid(smi, port, vid); | ||
6437 | + if (ret) | ||
6438 | + dev_err(smi->dev, | ||
6439 | + "failed to set PVID on port %d to VLAN %04x", | ||
6440 | + port, vid); | ||
6441 | + | ||
6442 | + if (!ret) | ||
6443 | + dev_dbg(smi->dev, "VLAN add: added VLAN %d with PVID on port %d\n", | ||
6444 | + vid, port); | ||
6445 | } | ||
6446 | } | ||
6447 | EXPORT_SYMBOL_GPL(rtl8366_vlan_add); | ||
6448 | diff --git a/drivers/net/dsa/rtl8366rb.c b/drivers/net/dsa/rtl8366rb.c | ||
6449 | index f5cc8b0a7c74c..7f731bf369980 100644 | ||
6450 | --- a/drivers/net/dsa/rtl8366rb.c | ||
6451 | +++ b/drivers/net/dsa/rtl8366rb.c | ||
6452 | @@ -1269,7 +1269,7 @@ static bool rtl8366rb_is_vlan_valid(struct realtek_smi *smi, unsigned int vlan) | ||
6453 | if (smi->vlan4k_enabled) | ||
6454 | max = RTL8366RB_NUM_VIDS - 1; | ||
6455 | |||
6456 | - if (vlan == 0 || vlan >= max) | ||
6457 | + if (vlan == 0 || vlan > max) | ||
6458 | return false; | ||
6459 | |||
6460 | return true; | ||
6461 | diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_flower.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_flower.c | ||
6462 | index 16a939f9b04d5..22d634111b818 100644 | ||
6463 | --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_flower.c | ||
6464 | +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_flower.c | ||
6465 | @@ -60,6 +60,89 @@ static struct ch_tc_pedit_fields pedits[] = { | ||
6466 | PEDIT_FIELDS(IP6_, DST_127_96, 4, nat_lip, 12), | ||
6467 | }; | ||
6468 | |||
6469 | +static const struct cxgb4_natmode_config cxgb4_natmode_config_array[] = { | ||
6470 | + /* Default supported NAT modes */ | ||
6471 | + { | ||
6472 | + .chip = CHELSIO_T5, | ||
6473 | + .flags = CXGB4_ACTION_NATMODE_NONE, | ||
6474 | + .natmode = NAT_MODE_NONE, | ||
6475 | + }, | ||
6476 | + { | ||
6477 | + .chip = CHELSIO_T5, | ||
6478 | + .flags = CXGB4_ACTION_NATMODE_DIP, | ||
6479 | + .natmode = NAT_MODE_DIP, | ||
6480 | + }, | ||
6481 | + { | ||
6482 | + .chip = CHELSIO_T5, | ||
6483 | + .flags = CXGB4_ACTION_NATMODE_DIP | CXGB4_ACTION_NATMODE_DPORT, | ||
6484 | + .natmode = NAT_MODE_DIP_DP, | ||
6485 | + }, | ||
6486 | + { | ||
6487 | + .chip = CHELSIO_T5, | ||
6488 | + .flags = CXGB4_ACTION_NATMODE_DIP | CXGB4_ACTION_NATMODE_DPORT | | ||
6489 | + CXGB4_ACTION_NATMODE_SIP, | ||
6490 | + .natmode = NAT_MODE_DIP_DP_SIP, | ||
6491 | + }, | ||
6492 | + { | ||
6493 | + .chip = CHELSIO_T5, | ||
6494 | + .flags = CXGB4_ACTION_NATMODE_DIP | CXGB4_ACTION_NATMODE_DPORT | | ||
6495 | + CXGB4_ACTION_NATMODE_SPORT, | ||
6496 | + .natmode = NAT_MODE_DIP_DP_SP, | ||
6497 | + }, | ||
6498 | + { | ||
6499 | + .chip = CHELSIO_T5, | ||
6500 | + .flags = CXGB4_ACTION_NATMODE_SIP | CXGB4_ACTION_NATMODE_SPORT, | ||
6501 | + .natmode = NAT_MODE_SIP_SP, | ||
6502 | + }, | ||
6503 | + { | ||
6504 | + .chip = CHELSIO_T5, | ||
6505 | + .flags = CXGB4_ACTION_NATMODE_DIP | CXGB4_ACTION_NATMODE_SIP | | ||
6506 | + CXGB4_ACTION_NATMODE_SPORT, | ||
6507 | + .natmode = NAT_MODE_DIP_SIP_SP, | ||
6508 | + }, | ||
6509 | + { | ||
6510 | + .chip = CHELSIO_T5, | ||
6511 | + .flags = CXGB4_ACTION_NATMODE_DIP | CXGB4_ACTION_NATMODE_SIP | | ||
6512 | + CXGB4_ACTION_NATMODE_DPORT | | ||
6513 | + CXGB4_ACTION_NATMODE_SPORT, | ||
6514 | + .natmode = NAT_MODE_ALL, | ||
6515 | + }, | ||
6516 | + /* T6+ can ignore L4 ports when they're disabled. */ | ||
6517 | + { | ||
6518 | + .chip = CHELSIO_T6, | ||
6519 | + .flags = CXGB4_ACTION_NATMODE_SIP, | ||
6520 | + .natmode = NAT_MODE_SIP_SP, | ||
6521 | + }, | ||
6522 | + { | ||
6523 | + .chip = CHELSIO_T6, | ||
6524 | + .flags = CXGB4_ACTION_NATMODE_DIP | CXGB4_ACTION_NATMODE_SPORT, | ||
6525 | + .natmode = NAT_MODE_DIP_DP_SP, | ||
6526 | + }, | ||
6527 | + { | ||
6528 | + .chip = CHELSIO_T6, | ||
6529 | + .flags = CXGB4_ACTION_NATMODE_DIP | CXGB4_ACTION_NATMODE_SIP, | ||
6530 | + .natmode = NAT_MODE_ALL, | ||
6531 | + }, | ||
6532 | +}; | ||
6533 | + | ||
6534 | +static void cxgb4_action_natmode_tweak(struct ch_filter_specification *fs, | ||
6535 | + u8 natmode_flags) | ||
6536 | +{ | ||
6537 | + u8 i = 0; | ||
6538 | + | ||
6539 | + /* Translate the enabled NAT 4-tuple fields to one of the | ||
6540 | + * hardware supported NAT mode configurations. This ensures | ||
6541 | + * that we pick a valid combination, where the disabled fields | ||
6542 | + * do not get overwritten to 0. | ||
6543 | + */ | ||
6544 | + for (i = 0; i < ARRAY_SIZE(cxgb4_natmode_config_array); i++) { | ||
6545 | + if (cxgb4_natmode_config_array[i].flags == natmode_flags) { | ||
6546 | + fs->nat_mode = cxgb4_natmode_config_array[i].natmode; | ||
6547 | + return; | ||
6548 | + } | ||
6549 | + } | ||
6550 | +} | ||
6551 | + | ||
6552 | static struct ch_tc_flower_entry *allocate_flower_entry(void) | ||
6553 | { | ||
6554 | struct ch_tc_flower_entry *new = kzalloc(sizeof(*new), GFP_KERNEL); | ||
6555 | @@ -287,7 +370,8 @@ static void offload_pedit(struct ch_filter_specification *fs, u32 val, u32 mask, | ||
6556 | } | ||
6557 | |||
6558 | static void process_pedit_field(struct ch_filter_specification *fs, u32 val, | ||
6559 | - u32 mask, u32 offset, u8 htype) | ||
6560 | + u32 mask, u32 offset, u8 htype, | ||
6561 | + u8 *natmode_flags) | ||
6562 | { | ||
6563 | switch (htype) { | ||
6564 | case FLOW_ACT_MANGLE_HDR_TYPE_ETH: | ||
6565 | @@ -312,60 +396,95 @@ static void process_pedit_field(struct ch_filter_specification *fs, u32 val, | ||
6566 | switch (offset) { | ||
6567 | case PEDIT_IP4_SRC: | ||
6568 | offload_pedit(fs, val, mask, IP4_SRC); | ||
6569 | + *natmode_flags |= CXGB4_ACTION_NATMODE_SIP; | ||
6570 | break; | ||
6571 | case PEDIT_IP4_DST: | ||
6572 | offload_pedit(fs, val, mask, IP4_DST); | ||
6573 | + *natmode_flags |= CXGB4_ACTION_NATMODE_DIP; | ||
6574 | } | ||
6575 | - fs->nat_mode = NAT_MODE_ALL; | ||
6576 | break; | ||
6577 | case FLOW_ACT_MANGLE_HDR_TYPE_IP6: | ||
6578 | switch (offset) { | ||
6579 | case PEDIT_IP6_SRC_31_0: | ||
6580 | offload_pedit(fs, val, mask, IP6_SRC_31_0); | ||
6581 | + *natmode_flags |= CXGB4_ACTION_NATMODE_SIP; | ||
6582 | break; | ||
6583 | case PEDIT_IP6_SRC_63_32: | ||
6584 | offload_pedit(fs, val, mask, IP6_SRC_63_32); | ||
6585 | + *natmode_flags |= CXGB4_ACTION_NATMODE_SIP; | ||
6586 | break; | ||
6587 | case PEDIT_IP6_SRC_95_64: | ||
6588 | offload_pedit(fs, val, mask, IP6_SRC_95_64); | ||
6589 | + *natmode_flags |= CXGB4_ACTION_NATMODE_SIP; | ||
6590 | break; | ||
6591 | case PEDIT_IP6_SRC_127_96: | ||
6592 | offload_pedit(fs, val, mask, IP6_SRC_127_96); | ||
6593 | + *natmode_flags |= CXGB4_ACTION_NATMODE_SIP; | ||
6594 | break; | ||
6595 | case PEDIT_IP6_DST_31_0: | ||
6596 | offload_pedit(fs, val, mask, IP6_DST_31_0); | ||
6597 | + *natmode_flags |= CXGB4_ACTION_NATMODE_DIP; | ||
6598 | break; | ||
6599 | case PEDIT_IP6_DST_63_32: | ||
6600 | offload_pedit(fs, val, mask, IP6_DST_63_32); | ||
6601 | + *natmode_flags |= CXGB4_ACTION_NATMODE_DIP; | ||
6602 | break; | ||
6603 | case PEDIT_IP6_DST_95_64: | ||
6604 | offload_pedit(fs, val, mask, IP6_DST_95_64); | ||
6605 | + *natmode_flags |= CXGB4_ACTION_NATMODE_DIP; | ||
6606 | break; | ||
6607 | case PEDIT_IP6_DST_127_96: | ||
6608 | offload_pedit(fs, val, mask, IP6_DST_127_96); | ||
6609 | + *natmode_flags |= CXGB4_ACTION_NATMODE_DIP; | ||
6610 | } | ||
6611 | - fs->nat_mode = NAT_MODE_ALL; | ||
6612 | break; | ||
6613 | case FLOW_ACT_MANGLE_HDR_TYPE_TCP: | ||
6614 | switch (offset) { | ||
6615 | case PEDIT_TCP_SPORT_DPORT: | ||
6616 | - if (~mask & PEDIT_TCP_UDP_SPORT_MASK) | ||
6617 | + if (~mask & PEDIT_TCP_UDP_SPORT_MASK) { | ||
6618 | fs->nat_fport = val; | ||
6619 | - else | ||
6620 | + *natmode_flags |= CXGB4_ACTION_NATMODE_SPORT; | ||
6621 | + } else { | ||
6622 | fs->nat_lport = val >> 16; | ||
6623 | + *natmode_flags |= CXGB4_ACTION_NATMODE_DPORT; | ||
6624 | + } | ||
6625 | } | ||
6626 | - fs->nat_mode = NAT_MODE_ALL; | ||
6627 | break; | ||
6628 | case FLOW_ACT_MANGLE_HDR_TYPE_UDP: | ||
6629 | switch (offset) { | ||
6630 | case PEDIT_UDP_SPORT_DPORT: | ||
6631 | - if (~mask & PEDIT_TCP_UDP_SPORT_MASK) | ||
6632 | + if (~mask & PEDIT_TCP_UDP_SPORT_MASK) { | ||
6633 | fs->nat_fport = val; | ||
6634 | - else | ||
6635 | + *natmode_flags |= CXGB4_ACTION_NATMODE_SPORT; | ||
6636 | + } else { | ||
6637 | fs->nat_lport = val >> 16; | ||
6638 | + *natmode_flags |= CXGB4_ACTION_NATMODE_DPORT; | ||
6639 | + } | ||
6640 | } | ||
6641 | - fs->nat_mode = NAT_MODE_ALL; | ||
6642 | + break; | ||
6643 | + } | ||
6644 | +} | ||
6645 | + | ||
6646 | +static int cxgb4_action_natmode_validate(struct net_device *dev, | ||
6647 | + struct adapter *adap, u8 natmode_flags) | ||
6648 | +{ | ||
6649 | + u8 i = 0; | ||
6650 | + | ||
6651 | + /* Extract the NAT mode to enable based on what 4-tuple fields | ||
6652 | + * are enabled to be overwritten. This ensures that the | ||
6653 | + * disabled fields don't get overwritten to 0. | ||
6654 | + */ | ||
6655 | + for (i = 0; i < ARRAY_SIZE(cxgb4_natmode_config_array); i++) { | ||
6656 | + const struct cxgb4_natmode_config *c; | ||
6657 | + | ||
6658 | + c = &cxgb4_natmode_config_array[i]; | ||
6659 | + if (CHELSIO_CHIP_VERSION(adap->params.chip) >= c->chip && | ||
6660 | + natmode_flags == c->flags) | ||
6661 | + return 0; | ||
6662 | } | ||
6663 | + netdev_err(dev, "%s: Unsupported NAT mode 4-tuple combination\n", | ||
6664 | + __func__); | ||
6665 | + return -EOPNOTSUPP; | ||
6666 | } | ||
6667 | |||
6668 | static void cxgb4_process_flow_actions(struct net_device *in, | ||
6669 | @@ -374,6 +493,7 @@ static void cxgb4_process_flow_actions(struct net_device *in, | ||
6670 | { | ||
6671 | struct flow_rule *rule = flow_cls_offload_flow_rule(cls); | ||
6672 | struct flow_action_entry *act; | ||
6673 | + u8 natmode_flags = 0; | ||
6674 | int i; | ||
6675 | |||
6676 | flow_action_for_each(i, act, &rule->action) { | ||
6677 | @@ -424,13 +544,17 @@ static void cxgb4_process_flow_actions(struct net_device *in, | ||
6678 | val = act->mangle.val; | ||
6679 | offset = act->mangle.offset; | ||
6680 | |||
6681 | - process_pedit_field(fs, val, mask, offset, htype); | ||
6682 | + process_pedit_field(fs, val, mask, offset, htype, | ||
6683 | + &natmode_flags); | ||
6684 | } | ||
6685 | break; | ||
6686 | default: | ||
6687 | break; | ||
6688 | } | ||
6689 | } | ||
6690 | + if (natmode_flags) | ||
6691 | + cxgb4_action_natmode_tweak(fs, natmode_flags); | ||
6692 | + | ||
6693 | } | ||
6694 | |||
6695 | static bool valid_l4_mask(u32 mask) | ||
6696 | @@ -447,7 +571,8 @@ static bool valid_l4_mask(u32 mask) | ||
6697 | } | ||
6698 | |||
6699 | static bool valid_pedit_action(struct net_device *dev, | ||
6700 | - const struct flow_action_entry *act) | ||
6701 | + const struct flow_action_entry *act, | ||
6702 | + u8 *natmode_flags) | ||
6703 | { | ||
6704 | u32 mask, offset; | ||
6705 | u8 htype; | ||
6706 | @@ -472,7 +597,10 @@ static bool valid_pedit_action(struct net_device *dev, | ||
6707 | case FLOW_ACT_MANGLE_HDR_TYPE_IP4: | ||
6708 | switch (offset) { | ||
6709 | case PEDIT_IP4_SRC: | ||
6710 | + *natmode_flags |= CXGB4_ACTION_NATMODE_SIP; | ||
6711 | + break; | ||
6712 | case PEDIT_IP4_DST: | ||
6713 | + *natmode_flags |= CXGB4_ACTION_NATMODE_DIP; | ||
6714 | break; | ||
6715 | default: | ||
6716 | netdev_err(dev, "%s: Unsupported pedit field\n", | ||
6717 | @@ -486,10 +614,13 @@ static bool valid_pedit_action(struct net_device *dev, | ||
6718 | case PEDIT_IP6_SRC_63_32: | ||
6719 | case PEDIT_IP6_SRC_95_64: | ||
6720 | case PEDIT_IP6_SRC_127_96: | ||
6721 | + *natmode_flags |= CXGB4_ACTION_NATMODE_SIP; | ||
6722 | + break; | ||
6723 | case PEDIT_IP6_DST_31_0: | ||
6724 | case PEDIT_IP6_DST_63_32: | ||
6725 | case PEDIT_IP6_DST_95_64: | ||
6726 | case PEDIT_IP6_DST_127_96: | ||
6727 | + *natmode_flags |= CXGB4_ACTION_NATMODE_DIP; | ||
6728 | break; | ||
6729 | default: | ||
6730 | netdev_err(dev, "%s: Unsupported pedit field\n", | ||
6731 | @@ -505,6 +636,10 @@ static bool valid_pedit_action(struct net_device *dev, | ||
6732 | __func__); | ||
6733 | return false; | ||
6734 | } | ||
6735 | + if (~mask & PEDIT_TCP_UDP_SPORT_MASK) | ||
6736 | + *natmode_flags |= CXGB4_ACTION_NATMODE_SPORT; | ||
6737 | + else | ||
6738 | + *natmode_flags |= CXGB4_ACTION_NATMODE_DPORT; | ||
6739 | break; | ||
6740 | default: | ||
6741 | netdev_err(dev, "%s: Unsupported pedit field\n", | ||
6742 | @@ -520,6 +655,10 @@ static bool valid_pedit_action(struct net_device *dev, | ||
6743 | __func__); | ||
6744 | return false; | ||
6745 | } | ||
6746 | + if (~mask & PEDIT_TCP_UDP_SPORT_MASK) | ||
6747 | + *natmode_flags |= CXGB4_ACTION_NATMODE_SPORT; | ||
6748 | + else | ||
6749 | + *natmode_flags |= CXGB4_ACTION_NATMODE_DPORT; | ||
6750 | break; | ||
6751 | default: | ||
6752 | netdev_err(dev, "%s: Unsupported pedit field\n", | ||
6753 | @@ -538,10 +677,12 @@ static int cxgb4_validate_flow_actions(struct net_device *dev, | ||
6754 | struct flow_cls_offload *cls) | ||
6755 | { | ||
6756 | struct flow_rule *rule = flow_cls_offload_flow_rule(cls); | ||
6757 | + struct adapter *adap = netdev2adap(dev); | ||
6758 | struct flow_action_entry *act; | ||
6759 | bool act_redir = false; | ||
6760 | bool act_pedit = false; | ||
6761 | bool act_vlan = false; | ||
6762 | + u8 natmode_flags = 0; | ||
6763 | int i; | ||
6764 | |||
6765 | flow_action_for_each(i, act, &rule->action) { | ||
6766 | @@ -551,7 +692,6 @@ static int cxgb4_validate_flow_actions(struct net_device *dev, | ||
6767 | /* Do nothing */ | ||
6768 | break; | ||
6769 | case FLOW_ACTION_REDIRECT: { | ||
6770 | - struct adapter *adap = netdev2adap(dev); | ||
6771 | struct net_device *n_dev, *target_dev; | ||
6772 | unsigned int i; | ||
6773 | bool found = false; | ||
6774 | @@ -601,7 +741,8 @@ static int cxgb4_validate_flow_actions(struct net_device *dev, | ||
6775 | } | ||
6776 | break; | ||
6777 | case FLOW_ACTION_MANGLE: { | ||
6778 | - bool pedit_valid = valid_pedit_action(dev, act); | ||
6779 | + bool pedit_valid = valid_pedit_action(dev, act, | ||
6780 | + &natmode_flags); | ||
6781 | |||
6782 | if (!pedit_valid) | ||
6783 | return -EOPNOTSUPP; | ||
6784 | @@ -620,6 +761,14 @@ static int cxgb4_validate_flow_actions(struct net_device *dev, | ||
6785 | return -EINVAL; | ||
6786 | } | ||
6787 | |||
6788 | + if (act_pedit) { | ||
6789 | + int ret; | ||
6790 | + | ||
6791 | + ret = cxgb4_action_natmode_validate(dev, adap, natmode_flags); | ||
6792 | + if (ret) | ||
6793 | + return ret; | ||
6794 | + } | ||
6795 | + | ||
6796 | return 0; | ||
6797 | } | ||
6798 | |||
6799 | diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_flower.h b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_flower.h | ||
6800 | index eb4c95248baf6..c905debe6f7ac 100644 | ||
6801 | --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_flower.h | ||
6802 | +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_flower.h | ||
6803 | @@ -108,6 +108,21 @@ struct ch_tc_pedit_fields { | ||
6804 | #define PEDIT_TCP_SPORT_DPORT 0x0 | ||
6805 | #define PEDIT_UDP_SPORT_DPORT 0x0 | ||
6806 | |||
6807 | +enum cxgb4_action_natmode_flags { | ||
6808 | + CXGB4_ACTION_NATMODE_NONE = 0, | ||
6809 | + CXGB4_ACTION_NATMODE_DIP = (1 << 0), | ||
6810 | + CXGB4_ACTION_NATMODE_SIP = (1 << 1), | ||
6811 | + CXGB4_ACTION_NATMODE_DPORT = (1 << 2), | ||
6812 | + CXGB4_ACTION_NATMODE_SPORT = (1 << 3), | ||
6813 | +}; | ||
6814 | + | ||
6815 | +/* TC PEDIT action to NATMODE translation entry */ | ||
6816 | +struct cxgb4_natmode_config { | ||
6817 | + enum chip_type chip; | ||
6818 | + u8 flags; | ||
6819 | + u8 natmode; | ||
6820 | +}; | ||
6821 | + | ||
6822 | int cxgb4_tc_flower_replace(struct net_device *dev, | ||
6823 | struct flow_cls_offload *cls); | ||
6824 | int cxgb4_tc_flower_destroy(struct net_device *dev, | ||
6825 | diff --git a/drivers/net/ethernet/cisco/enic/enic.h b/drivers/net/ethernet/cisco/enic/enic.h | ||
6826 | index 0dd64acd2a3fb..08cac1bfacafb 100644 | ||
6827 | --- a/drivers/net/ethernet/cisco/enic/enic.h | ||
6828 | +++ b/drivers/net/ethernet/cisco/enic/enic.h | ||
6829 | @@ -171,6 +171,7 @@ struct enic { | ||
6830 | u16 num_vfs; | ||
6831 | #endif | ||
6832 | spinlock_t enic_api_lock; | ||
6833 | + bool enic_api_busy; | ||
6834 | struct enic_port_profile *pp; | ||
6835 | |||
6836 | /* work queue cache line section */ | ||
6837 | diff --git a/drivers/net/ethernet/cisco/enic/enic_api.c b/drivers/net/ethernet/cisco/enic/enic_api.c | ||
6838 | index b161f24522b87..b028ea2dec2b9 100644 | ||
6839 | --- a/drivers/net/ethernet/cisco/enic/enic_api.c | ||
6840 | +++ b/drivers/net/ethernet/cisco/enic/enic_api.c | ||
6841 | @@ -34,6 +34,12 @@ int enic_api_devcmd_proxy_by_index(struct net_device *netdev, int vf, | ||
6842 | struct vnic_dev *vdev = enic->vdev; | ||
6843 | |||
6844 | spin_lock(&enic->enic_api_lock); | ||
6845 | + while (enic->enic_api_busy) { | ||
6846 | + spin_unlock(&enic->enic_api_lock); | ||
6847 | + cpu_relax(); | ||
6848 | + spin_lock(&enic->enic_api_lock); | ||
6849 | + } | ||
6850 | + | ||
6851 | spin_lock_bh(&enic->devcmd_lock); | ||
6852 | |||
6853 | vnic_dev_cmd_proxy_by_index_start(vdev, vf); | ||
6854 | diff --git a/drivers/net/ethernet/cisco/enic/enic_main.c b/drivers/net/ethernet/cisco/enic/enic_main.c | ||
6855 | index 6e2ab10ad2e6f..8314102002b0f 100644 | ||
6856 | --- a/drivers/net/ethernet/cisco/enic/enic_main.c | ||
6857 | +++ b/drivers/net/ethernet/cisco/enic/enic_main.c | ||
6858 | @@ -2142,8 +2142,6 @@ static int enic_dev_wait(struct vnic_dev *vdev, | ||
6859 | int done; | ||
6860 | int err; | ||
6861 | |||
6862 | - BUG_ON(in_interrupt()); | ||
6863 | - | ||
6864 | err = start(vdev, arg); | ||
6865 | if (err) | ||
6866 | return err; | ||
6867 | @@ -2331,6 +2329,13 @@ static int enic_set_rss_nic_cfg(struct enic *enic) | ||
6868 | rss_hash_bits, rss_base_cpu, rss_enable); | ||
6869 | } | ||
6870 | |||
6871 | +static void enic_set_api_busy(struct enic *enic, bool busy) | ||
6872 | +{ | ||
6873 | + spin_lock(&enic->enic_api_lock); | ||
6874 | + enic->enic_api_busy = busy; | ||
6875 | + spin_unlock(&enic->enic_api_lock); | ||
6876 | +} | ||
6877 | + | ||
6878 | static void enic_reset(struct work_struct *work) | ||
6879 | { | ||
6880 | struct enic *enic = container_of(work, struct enic, reset); | ||
6881 | @@ -2340,7 +2345,9 @@ static void enic_reset(struct work_struct *work) | ||
6882 | |||
6883 | rtnl_lock(); | ||
6884 | |||
6885 | - spin_lock(&enic->enic_api_lock); | ||
6886 | + /* Stop any activity from infiniband */ | ||
6887 | + enic_set_api_busy(enic, true); | ||
6888 | + | ||
6889 | enic_stop(enic->netdev); | ||
6890 | enic_dev_soft_reset(enic); | ||
6891 | enic_reset_addr_lists(enic); | ||
6892 | @@ -2348,7 +2355,10 @@ static void enic_reset(struct work_struct *work) | ||
6893 | enic_set_rss_nic_cfg(enic); | ||
6894 | enic_dev_set_ig_vlan_rewrite_mode(enic); | ||
6895 | enic_open(enic->netdev); | ||
6896 | - spin_unlock(&enic->enic_api_lock); | ||
6897 | + | ||
6898 | + /* Allow infiniband to fiddle with the device again */ | ||
6899 | + enic_set_api_busy(enic, false); | ||
6900 | + | ||
6901 | call_netdevice_notifiers(NETDEV_REBOOT, enic->netdev); | ||
6902 | |||
6903 | rtnl_unlock(); | ||
6904 | @@ -2360,7 +2370,9 @@ static void enic_tx_hang_reset(struct work_struct *work) | ||
6905 | |||
6906 | rtnl_lock(); | ||
6907 | |||
6908 | - spin_lock(&enic->enic_api_lock); | ||
6909 | + /* Stop any activity from infiniband */ | ||
6910 | + enic_set_api_busy(enic, true); | ||
6911 | + | ||
6912 | enic_dev_hang_notify(enic); | ||
6913 | enic_stop(enic->netdev); | ||
6914 | enic_dev_hang_reset(enic); | ||
6915 | @@ -2369,7 +2381,10 @@ static void enic_tx_hang_reset(struct work_struct *work) | ||
6916 | enic_set_rss_nic_cfg(enic); | ||
6917 | enic_dev_set_ig_vlan_rewrite_mode(enic); | ||
6918 | enic_open(enic->netdev); | ||
6919 | - spin_unlock(&enic->enic_api_lock); | ||
6920 | + | ||
6921 | + /* Allow infiniband to fiddle with the device again */ | ||
6922 | + enic_set_api_busy(enic, false); | ||
6923 | + | ||
6924 | call_netdevice_notifiers(NETDEV_REBOOT, enic->netdev); | ||
6925 | |||
6926 | rtnl_unlock(); | ||
6927 | diff --git a/drivers/net/ethernet/faraday/ftgmac100.c b/drivers/net/ethernet/faraday/ftgmac100.c | ||
6928 | index 96e9565f1e08a..1fbc243fc3f4c 100644 | ||
6929 | --- a/drivers/net/ethernet/faraday/ftgmac100.c | ||
6930 | +++ b/drivers/net/ethernet/faraday/ftgmac100.c | ||
6931 | @@ -1807,6 +1807,11 @@ static int ftgmac100_probe(struct platform_device *pdev) | ||
6932 | priv->rxdes0_edorr_mask = BIT(30); | ||
6933 | priv->txdes0_edotr_mask = BIT(30); | ||
6934 | priv->is_aspeed = true; | ||
6935 | + /* Disable ast2600 problematic HW arbitration */ | ||
6936 | + if (of_device_is_compatible(np, "aspeed,ast2600-mac")) { | ||
6937 | + iowrite32(FTGMAC100_TM_DEFAULT, | ||
6938 | + priv->base + FTGMAC100_OFFSET_TM); | ||
6939 | + } | ||
6940 | } else { | ||
6941 | priv->rxdes0_edorr_mask = BIT(15); | ||
6942 | priv->txdes0_edotr_mask = BIT(15); | ||
6943 | diff --git a/drivers/net/ethernet/faraday/ftgmac100.h b/drivers/net/ethernet/faraday/ftgmac100.h | ||
6944 | index e5876a3fda91d..63b3e02fab162 100644 | ||
6945 | --- a/drivers/net/ethernet/faraday/ftgmac100.h | ||
6946 | +++ b/drivers/net/ethernet/faraday/ftgmac100.h | ||
6947 | @@ -169,6 +169,14 @@ | ||
6948 | #define FTGMAC100_MACCR_FAST_MODE (1 << 19) | ||
6949 | #define FTGMAC100_MACCR_SW_RST (1 << 31) | ||
6950 | |||
6951 | +/* | ||
6952 | + * test mode control register | ||
6953 | + */ | ||
6954 | +#define FTGMAC100_TM_RQ_TX_VALID_DIS (1 << 28) | ||
6955 | +#define FTGMAC100_TM_RQ_RR_IDLE_PREV (1 << 27) | ||
6956 | +#define FTGMAC100_TM_DEFAULT \ | ||
6957 | + (FTGMAC100_TM_RQ_TX_VALID_DIS | FTGMAC100_TM_RQ_RR_IDLE_PREV) | ||
6958 | + | ||
6959 | /* | ||
6960 | * PHY control register | ||
6961 | */ | ||
6962 | diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c | ||
6963 | index a0e4b12ac4ea2..fd7fc6f20c9da 100644 | ||
6964 | --- a/drivers/net/ethernet/freescale/fec_main.c | ||
6965 | +++ b/drivers/net/ethernet/freescale/fec_main.c | ||
6966 | @@ -1945,6 +1945,27 @@ out: | ||
6967 | return ret; | ||
6968 | } | ||
6969 | |||
6970 | +static void fec_enet_phy_reset_after_clk_enable(struct net_device *ndev) | ||
6971 | +{ | ||
6972 | + struct fec_enet_private *fep = netdev_priv(ndev); | ||
6973 | + struct phy_device *phy_dev = ndev->phydev; | ||
6974 | + | ||
6975 | + if (phy_dev) { | ||
6976 | + phy_reset_after_clk_enable(phy_dev); | ||
6977 | + } else if (fep->phy_node) { | ||
6978 | + /* | ||
6979 | + * If the PHY still is not bound to the MAC, but there is | ||
6980 | + * OF PHY node and a matching PHY device instance already, | ||
6981 | + * use the OF PHY node to obtain the PHY device instance, | ||
6982 | + * and then use that PHY device instance when triggering | ||
6983 | + * the PHY reset. | ||
6984 | + */ | ||
6985 | + phy_dev = of_phy_find_device(fep->phy_node); | ||
6986 | + phy_reset_after_clk_enable(phy_dev); | ||
6987 | + put_device(&phy_dev->mdio.dev); | ||
6988 | + } | ||
6989 | +} | ||
6990 | + | ||
6991 | static int fec_enet_clk_enable(struct net_device *ndev, bool enable) | ||
6992 | { | ||
6993 | struct fec_enet_private *fep = netdev_priv(ndev); | ||
6994 | @@ -1971,7 +1992,7 @@ static int fec_enet_clk_enable(struct net_device *ndev, bool enable) | ||
6995 | if (ret) | ||
6996 | goto failed_clk_ref; | ||
6997 | |||
6998 | - phy_reset_after_clk_enable(ndev->phydev); | ||
6999 | + fec_enet_phy_reset_after_clk_enable(ndev); | ||
7000 | } else { | ||
7001 | clk_disable_unprepare(fep->clk_enet_out); | ||
7002 | if (fep->clk_ptp) { | ||
7003 | @@ -2982,16 +3003,16 @@ fec_enet_open(struct net_device *ndev) | ||
7004 | /* Init MAC prior to mii bus probe */ | ||
7005 | fec_restart(ndev); | ||
7006 | |||
7007 | - /* Probe and connect to PHY when open the interface */ | ||
7008 | - ret = fec_enet_mii_probe(ndev); | ||
7009 | - if (ret) | ||
7010 | - goto err_enet_mii_probe; | ||
7011 | - | ||
7012 | /* Call phy_reset_after_clk_enable() again if it failed during | ||
7013 | * phy_reset_after_clk_enable() before because the PHY wasn't probed. | ||
7014 | */ | ||
7015 | if (reset_again) | ||
7016 | - phy_reset_after_clk_enable(ndev->phydev); | ||
7017 | + fec_enet_phy_reset_after_clk_enable(ndev); | ||
7018 | + | ||
7019 | + /* Probe and connect to PHY when open the interface */ | ||
7020 | + ret = fec_enet_mii_probe(ndev); | ||
7021 | + if (ret) | ||
7022 | + goto err_enet_mii_probe; | ||
7023 | |||
7024 | if (fep->quirks & FEC_QUIRK_ERR006687) | ||
7025 | imx6q_cpuidle_fec_irqs_used(); | ||
7026 | diff --git a/drivers/net/ethernet/ibm/ibmveth.c b/drivers/net/ethernet/ibm/ibmveth.c | ||
7027 | index aa32a5b041129..a20d9147d5f22 100644 | ||
7028 | --- a/drivers/net/ethernet/ibm/ibmveth.c | ||
7029 | +++ b/drivers/net/ethernet/ibm/ibmveth.c | ||
7030 | @@ -1317,6 +1317,7 @@ static int ibmveth_poll(struct napi_struct *napi, int budget) | ||
7031 | int offset = ibmveth_rxq_frame_offset(adapter); | ||
7032 | int csum_good = ibmveth_rxq_csum_good(adapter); | ||
7033 | int lrg_pkt = ibmveth_rxq_large_packet(adapter); | ||
7034 | + __sum16 iph_check = 0; | ||
7035 | |||
7036 | skb = ibmveth_rxq_get_buffer(adapter); | ||
7037 | |||
7038 | @@ -1353,16 +1354,26 @@ static int ibmveth_poll(struct napi_struct *napi, int budget) | ||
7039 | skb_put(skb, length); | ||
7040 | skb->protocol = eth_type_trans(skb, netdev); | ||
7041 | |||
7042 | - if (csum_good) { | ||
7043 | - skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
7044 | - ibmveth_rx_csum_helper(skb, adapter); | ||
7045 | + /* PHYP without PLSO support places a -1 in the ip | ||
7046 | + * checksum for large send frames. | ||
7047 | + */ | ||
7048 | + if (skb->protocol == cpu_to_be16(ETH_P_IP)) { | ||
7049 | + struct iphdr *iph = (struct iphdr *)skb->data; | ||
7050 | + | ||
7051 | + iph_check = iph->check; | ||
7052 | } | ||
7053 | |||
7054 | - if (length > netdev->mtu + ETH_HLEN) { | ||
7055 | + if ((length > netdev->mtu + ETH_HLEN) || | ||
7056 | + lrg_pkt || iph_check == 0xffff) { | ||
7057 | ibmveth_rx_mss_helper(skb, mss, lrg_pkt); | ||
7058 | adapter->rx_large_packets++; | ||
7059 | } | ||
7060 | |||
7061 | + if (csum_good) { | ||
7062 | + skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
7063 | + ibmveth_rx_csum_helper(skb, adapter); | ||
7064 | + } | ||
7065 | + | ||
7066 | napi_gro_receive(napi, skb); /* send it up */ | ||
7067 | |||
7068 | netdev->stats.rx_packets++; | ||
7069 | diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c | ||
7070 | index 5329af2337a91..48105a2eebe4d 100644 | ||
7071 | --- a/drivers/net/ethernet/ibm/ibmvnic.c | ||
7072 | +++ b/drivers/net/ethernet/ibm/ibmvnic.c | ||
7073 | @@ -4074,8 +4074,13 @@ static int handle_change_mac_rsp(union ibmvnic_crq *crq, | ||
7074 | dev_err(dev, "Error %ld in CHANGE_MAC_ADDR_RSP\n", rc); | ||
7075 | goto out; | ||
7076 | } | ||
7077 | + /* crq->change_mac_addr.mac_addr is the requested one | ||
7078 | + * crq->change_mac_addr_rsp.mac_addr is the returned valid one. | ||
7079 | + */ | ||
7080 | ether_addr_copy(netdev->dev_addr, | ||
7081 | &crq->change_mac_addr_rsp.mac_addr[0]); | ||
7082 | + ether_addr_copy(adapter->mac_addr, | ||
7083 | + &crq->change_mac_addr_rsp.mac_addr[0]); | ||
7084 | out: | ||
7085 | complete(&adapter->fw_done); | ||
7086 | return rc; | ||
7087 | @@ -4472,7 +4477,7 @@ static int handle_query_phys_parms_rsp(union ibmvnic_crq *crq, | ||
7088 | case IBMVNIC_1GBPS: | ||
7089 | adapter->speed = SPEED_1000; | ||
7090 | break; | ||
7091 | - case IBMVNIC_10GBP: | ||
7092 | + case IBMVNIC_10GBPS: | ||
7093 | adapter->speed = SPEED_10000; | ||
7094 | break; | ||
7095 | case IBMVNIC_25GBPS: | ||
7096 | @@ -4487,6 +4492,9 @@ static int handle_query_phys_parms_rsp(union ibmvnic_crq *crq, | ||
7097 | case IBMVNIC_100GBPS: | ||
7098 | adapter->speed = SPEED_100000; | ||
7099 | break; | ||
7100 | + case IBMVNIC_200GBPS: | ||
7101 | + adapter->speed = SPEED_200000; | ||
7102 | + break; | ||
7103 | default: | ||
7104 | if (netif_carrier_ok(netdev)) | ||
7105 | netdev_warn(netdev, "Unknown speed 0x%08x\n", rspeed); | ||
7106 | diff --git a/drivers/net/ethernet/ibm/ibmvnic.h b/drivers/net/ethernet/ibm/ibmvnic.h | ||
7107 | index ebc39248b334a..0da20f19bb17c 100644 | ||
7108 | --- a/drivers/net/ethernet/ibm/ibmvnic.h | ||
7109 | +++ b/drivers/net/ethernet/ibm/ibmvnic.h | ||
7110 | @@ -373,7 +373,7 @@ struct ibmvnic_phys_parms { | ||
7111 | #define IBMVNIC_10MBPS 0x40000000 | ||
7112 | #define IBMVNIC_100MBPS 0x20000000 | ||
7113 | #define IBMVNIC_1GBPS 0x10000000 | ||
7114 | -#define IBMVNIC_10GBP 0x08000000 | ||
7115 | +#define IBMVNIC_10GBPS 0x08000000 | ||
7116 | #define IBMVNIC_40GBPS 0x04000000 | ||
7117 | #define IBMVNIC_100GBPS 0x02000000 | ||
7118 | #define IBMVNIC_25GBPS 0x01000000 | ||
7119 | diff --git a/drivers/net/ethernet/korina.c b/drivers/net/ethernet/korina.c | ||
7120 | index ae195f8adff58..993f495e2bf7b 100644 | ||
7121 | --- a/drivers/net/ethernet/korina.c | ||
7122 | +++ b/drivers/net/ethernet/korina.c | ||
7123 | @@ -1113,7 +1113,7 @@ out: | ||
7124 | return rc; | ||
7125 | |||
7126 | probe_err_register: | ||
7127 | - kfree(lp->td_ring); | ||
7128 | + kfree((struct dma_desc *)KSEG0ADDR(lp->td_ring)); | ||
7129 | probe_err_td_ring: | ||
7130 | iounmap(lp->tx_dma_regs); | ||
7131 | probe_err_dma_tx: | ||
7132 | @@ -1133,6 +1133,7 @@ static int korina_remove(struct platform_device *pdev) | ||
7133 | iounmap(lp->eth_regs); | ||
7134 | iounmap(lp->rx_dma_regs); | ||
7135 | iounmap(lp->tx_dma_regs); | ||
7136 | + kfree((struct dma_desc *)KSEG0ADDR(lp->td_ring)); | ||
7137 | |||
7138 | unregister_netdev(bif->dev); | ||
7139 | free_netdev(bif->dev); | ||
7140 | diff --git a/drivers/net/ethernet/mellanox/mlx4/en_rx.c b/drivers/net/ethernet/mellanox/mlx4/en_rx.c | ||
7141 | index db3552f2d0877..f9797e5038841 100644 | ||
7142 | --- a/drivers/net/ethernet/mellanox/mlx4/en_rx.c | ||
7143 | +++ b/drivers/net/ethernet/mellanox/mlx4/en_rx.c | ||
7144 | @@ -942,6 +942,9 @@ int mlx4_en_poll_rx_cq(struct napi_struct *napi, int budget) | ||
7145 | bool clean_complete = true; | ||
7146 | int done; | ||
7147 | |||
7148 | + if (!budget) | ||
7149 | + return 0; | ||
7150 | + | ||
7151 | if (priv->tx_ring_num[TX_XDP]) { | ||
7152 | xdp_tx_cq = priv->tx_cq[TX_XDP][cq->ring]; | ||
7153 | if (xdp_tx_cq->xdp_busy) { | ||
7154 | diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c | ||
7155 | index a30edb436f4af..191ead7a7fa59 100644 | ||
7156 | --- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c | ||
7157 | +++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c | ||
7158 | @@ -350,7 +350,7 @@ u32 mlx4_en_recycle_tx_desc(struct mlx4_en_priv *priv, | ||
7159 | .dma = tx_info->map0_dma, | ||
7160 | }; | ||
7161 | |||
7162 | - if (!mlx4_en_rx_recycle(ring->recycle_ring, &frame)) { | ||
7163 | + if (!napi_mode || !mlx4_en_rx_recycle(ring->recycle_ring, &frame)) { | ||
7164 | dma_unmap_page(priv->ddev, tx_info->map0_dma, | ||
7165 | PAGE_SIZE, priv->dma_dir); | ||
7166 | put_page(tx_info->page); | ||
7167 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/lib/clock.c b/drivers/net/ethernet/mellanox/mlx5/core/lib/clock.c | ||
7168 | index 75fc283cacc36..492ff2ef9a404 100644 | ||
7169 | --- a/drivers/net/ethernet/mellanox/mlx5/core/lib/clock.c | ||
7170 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/lib/clock.c | ||
7171 | @@ -498,8 +498,9 @@ static int mlx5_pps_event(struct notifier_block *nb, | ||
7172 | switch (clock->ptp_info.pin_config[pin].func) { | ||
7173 | case PTP_PF_EXTTS: | ||
7174 | ptp_event.index = pin; | ||
7175 | - ptp_event.timestamp = timecounter_cyc2time(&clock->tc, | ||
7176 | - be64_to_cpu(eqe->data.pps.time_stamp)); | ||
7177 | + ptp_event.timestamp = | ||
7178 | + mlx5_timecounter_cyc2time(clock, | ||
7179 | + be64_to_cpu(eqe->data.pps.time_stamp)); | ||
7180 | if (clock->pps_info.enabled) { | ||
7181 | ptp_event.type = PTP_CLOCK_PPSUSR; | ||
7182 | ptp_event.pps_times.ts_real = | ||
7183 | diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c | ||
7184 | index 66c97049f52b7..f838abdb35e1d 100644 | ||
7185 | --- a/drivers/net/ethernet/realtek/r8169_main.c | ||
7186 | +++ b/drivers/net/ethernet/realtek/r8169_main.c | ||
7187 | @@ -5514,6 +5514,10 @@ static int rtl8169_change_mtu(struct net_device *dev, int new_mtu) | ||
7188 | dev->mtu = new_mtu; | ||
7189 | netdev_update_features(dev); | ||
7190 | |||
7191 | + /* Reportedly at least Asus X453MA truncates packets otherwise */ | ||
7192 | + if (tp->mac_version == RTL_GIGA_MAC_VER_37) | ||
7193 | + rtl_init_rxcfg(tp); | ||
7194 | + | ||
7195 | return 0; | ||
7196 | } | ||
7197 | |||
7198 | @@ -6414,7 +6418,7 @@ static int rtl8169_close(struct net_device *dev) | ||
7199 | |||
7200 | phy_disconnect(tp->phydev); | ||
7201 | |||
7202 | - pci_free_irq(pdev, 0, tp); | ||
7203 | + free_irq(pci_irq_vector(pdev, 0), tp); | ||
7204 | |||
7205 | dma_free_coherent(&pdev->dev, R8169_RX_RING_BYTES, tp->RxDescArray, | ||
7206 | tp->RxPhyAddr); | ||
7207 | @@ -6465,8 +6469,8 @@ static int rtl_open(struct net_device *dev) | ||
7208 | |||
7209 | rtl_request_firmware(tp); | ||
7210 | |||
7211 | - retval = pci_request_irq(pdev, 0, rtl8169_interrupt, NULL, tp, | ||
7212 | - dev->name); | ||
7213 | + retval = request_irq(pci_irq_vector(pdev, 0), rtl8169_interrupt, | ||
7214 | + IRQF_NO_THREAD | IRQF_SHARED, dev->name, tp); | ||
7215 | if (retval < 0) | ||
7216 | goto err_release_fw_2; | ||
7217 | |||
7218 | @@ -6499,7 +6503,7 @@ out: | ||
7219 | return retval; | ||
7220 | |||
7221 | err_free_irq: | ||
7222 | - pci_free_irq(pdev, 0, tp); | ||
7223 | + free_irq(pci_irq_vector(pdev, 0), tp); | ||
7224 | err_release_fw_2: | ||
7225 | rtl_release_firmware(tp); | ||
7226 | rtl8169_rx_clear(tp); | ||
7227 | diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | ||
7228 | index 982be75fde833..189cdb7633671 100644 | ||
7229 | --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | ||
7230 | +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | ||
7231 | @@ -175,32 +175,6 @@ static void stmmac_enable_all_queues(struct stmmac_priv *priv) | ||
7232 | } | ||
7233 | } | ||
7234 | |||
7235 | -/** | ||
7236 | - * stmmac_stop_all_queues - Stop all queues | ||
7237 | - * @priv: driver private structure | ||
7238 | - */ | ||
7239 | -static void stmmac_stop_all_queues(struct stmmac_priv *priv) | ||
7240 | -{ | ||
7241 | - u32 tx_queues_cnt = priv->plat->tx_queues_to_use; | ||
7242 | - u32 queue; | ||
7243 | - | ||
7244 | - for (queue = 0; queue < tx_queues_cnt; queue++) | ||
7245 | - netif_tx_stop_queue(netdev_get_tx_queue(priv->dev, queue)); | ||
7246 | -} | ||
7247 | - | ||
7248 | -/** | ||
7249 | - * stmmac_start_all_queues - Start all queues | ||
7250 | - * @priv: driver private structure | ||
7251 | - */ | ||
7252 | -static void stmmac_start_all_queues(struct stmmac_priv *priv) | ||
7253 | -{ | ||
7254 | - u32 tx_queues_cnt = priv->plat->tx_queues_to_use; | ||
7255 | - u32 queue; | ||
7256 | - | ||
7257 | - for (queue = 0; queue < tx_queues_cnt; queue++) | ||
7258 | - netif_tx_start_queue(netdev_get_tx_queue(priv->dev, queue)); | ||
7259 | -} | ||
7260 | - | ||
7261 | static void stmmac_service_event_schedule(struct stmmac_priv *priv) | ||
7262 | { | ||
7263 | if (!test_bit(STMMAC_DOWN, &priv->state) && | ||
7264 | @@ -2737,7 +2711,7 @@ static int stmmac_open(struct net_device *dev) | ||
7265 | } | ||
7266 | |||
7267 | stmmac_enable_all_queues(priv); | ||
7268 | - stmmac_start_all_queues(priv); | ||
7269 | + netif_tx_start_all_queues(priv->dev); | ||
7270 | |||
7271 | return 0; | ||
7272 | |||
7273 | @@ -2778,8 +2752,6 @@ static int stmmac_release(struct net_device *dev) | ||
7274 | phylink_stop(priv->phylink); | ||
7275 | phylink_disconnect_phy(priv->phylink); | ||
7276 | |||
7277 | - stmmac_stop_all_queues(priv); | ||
7278 | - | ||
7279 | stmmac_disable_all_queues(priv); | ||
7280 | |||
7281 | for (chan = 0; chan < priv->plat->tx_queues_to_use; chan++) | ||
7282 | @@ -4770,7 +4742,6 @@ int stmmac_suspend(struct device *dev) | ||
7283 | mutex_lock(&priv->lock); | ||
7284 | |||
7285 | netif_device_detach(ndev); | ||
7286 | - stmmac_stop_all_queues(priv); | ||
7287 | |||
7288 | stmmac_disable_all_queues(priv); | ||
7289 | |||
7290 | @@ -4883,8 +4854,6 @@ int stmmac_resume(struct device *dev) | ||
7291 | |||
7292 | stmmac_enable_all_queues(priv); | ||
7293 | |||
7294 | - stmmac_start_all_queues(priv); | ||
7295 | - | ||
7296 | mutex_unlock(&priv->lock); | ||
7297 | |||
7298 | if (!device_may_wakeup(priv->device)) { | ||
7299 | diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c | ||
7300 | index e57d59b0a7ae9..21d905d90650b 100644 | ||
7301 | --- a/drivers/net/usb/qmi_wwan.c | ||
7302 | +++ b/drivers/net/usb/qmi_wwan.c | ||
7303 | @@ -1375,6 +1375,7 @@ static const struct usb_device_id products[] = { | ||
7304 | {QMI_QUIRK_SET_DTR(0x2cb7, 0x0104, 4)}, /* Fibocom NL678 series */ | ||
7305 | {QMI_FIXED_INTF(0x0489, 0xe0b4, 0)}, /* Foxconn T77W968 LTE */ | ||
7306 | {QMI_FIXED_INTF(0x0489, 0xe0b5, 0)}, /* Foxconn T77W968 LTE with eSIM support*/ | ||
7307 | + {QMI_FIXED_INTF(0x2692, 0x9025, 4)}, /* Cellient MPL200 (rebranded Qualcomm 05c6:9025) */ | ||
7308 | |||
7309 | /* 4. Gobi 1000 devices */ | ||
7310 | {QMI_GOBI1K_DEVICE(0x05c6, 0x9212)}, /* Acer Gobi Modem Device */ | ||
7311 | diff --git a/drivers/net/wan/hdlc.c b/drivers/net/wan/hdlc.c | ||
7312 | index dfc16770458d8..8b6598a3713d1 100644 | ||
7313 | --- a/drivers/net/wan/hdlc.c | ||
7314 | +++ b/drivers/net/wan/hdlc.c | ||
7315 | @@ -46,7 +46,15 @@ static struct hdlc_proto *first_proto; | ||
7316 | static int hdlc_rcv(struct sk_buff *skb, struct net_device *dev, | ||
7317 | struct packet_type *p, struct net_device *orig_dev) | ||
7318 | { | ||
7319 | - struct hdlc_device *hdlc = dev_to_hdlc(dev); | ||
7320 | + struct hdlc_device *hdlc; | ||
7321 | + | ||
7322 | + /* First make sure "dev" is an HDLC device */ | ||
7323 | + if (!(dev->priv_flags & IFF_WAN_HDLC)) { | ||
7324 | + kfree_skb(skb); | ||
7325 | + return NET_RX_SUCCESS; | ||
7326 | + } | ||
7327 | + | ||
7328 | + hdlc = dev_to_hdlc(dev); | ||
7329 | |||
7330 | if (!net_eq(dev_net(dev), &init_net)) { | ||
7331 | kfree_skb(skb); | ||
7332 | diff --git a/drivers/net/wan/hdlc_raw_eth.c b/drivers/net/wan/hdlc_raw_eth.c | ||
7333 | index 08e0a46501dec..c70a518b8b478 100644 | ||
7334 | --- a/drivers/net/wan/hdlc_raw_eth.c | ||
7335 | +++ b/drivers/net/wan/hdlc_raw_eth.c | ||
7336 | @@ -99,6 +99,7 @@ static int raw_eth_ioctl(struct net_device *dev, struct ifreq *ifr) | ||
7337 | old_qlen = dev->tx_queue_len; | ||
7338 | ether_setup(dev); | ||
7339 | dev->tx_queue_len = old_qlen; | ||
7340 | + dev->priv_flags &= ~IFF_TX_SKB_SHARING; | ||
7341 | eth_hw_addr_random(dev); | ||
7342 | call_netdevice_notifiers(NETDEV_POST_TYPE_CHANGE, dev); | ||
7343 | netif_dormant_off(dev); | ||
7344 | diff --git a/drivers/net/wireless/ath/ath10k/ce.c b/drivers/net/wireless/ath/ath10k/ce.c | ||
7345 | index eca87f7c5b6c1..01e05af5ae085 100644 | ||
7346 | --- a/drivers/net/wireless/ath/ath10k/ce.c | ||
7347 | +++ b/drivers/net/wireless/ath/ath10k/ce.c | ||
7348 | @@ -1555,7 +1555,7 @@ ath10k_ce_alloc_src_ring(struct ath10k *ar, unsigned int ce_id, | ||
7349 | ret = ath10k_ce_alloc_shadow_base(ar, src_ring, nentries); | ||
7350 | if (ret) { | ||
7351 | dma_free_coherent(ar->dev, | ||
7352 | - (nentries * sizeof(struct ce_desc_64) + | ||
7353 | + (nentries * sizeof(struct ce_desc) + | ||
7354 | CE_DESC_RING_ALIGN), | ||
7355 | src_ring->base_addr_owner_space_unaligned, | ||
7356 | base_addr); | ||
7357 | diff --git a/drivers/net/wireless/ath/ath10k/htt_rx.c b/drivers/net/wireless/ath/ath10k/htt_rx.c | ||
7358 | index 9f0e7b4943ec6..8ca0a808a644d 100644 | ||
7359 | --- a/drivers/net/wireless/ath/ath10k/htt_rx.c | ||
7360 | +++ b/drivers/net/wireless/ath/ath10k/htt_rx.c | ||
7361 | @@ -142,6 +142,14 @@ static int __ath10k_htt_rx_ring_fill_n(struct ath10k_htt *htt, int num) | ||
7362 | BUILD_BUG_ON(HTT_RX_RING_FILL_LEVEL >= HTT_RX_RING_SIZE / 2); | ||
7363 | |||
7364 | idx = __le32_to_cpu(*htt->rx_ring.alloc_idx.vaddr); | ||
7365 | + | ||
7366 | + if (idx < 0 || idx >= htt->rx_ring.size) { | ||
7367 | + ath10k_err(htt->ar, "rx ring index is not valid, firmware malfunctioning?\n"); | ||
7368 | + idx &= htt->rx_ring.size_mask; | ||
7369 | + ret = -ENOMEM; | ||
7370 | + goto fail; | ||
7371 | + } | ||
7372 | + | ||
7373 | while (num > 0) { | ||
7374 | skb = dev_alloc_skb(HTT_RX_BUF_SIZE + HTT_RX_DESC_ALIGN); | ||
7375 | if (!skb) { | ||
7376 | diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c | ||
7377 | index d373602a80145..915ba2a7f7448 100644 | ||
7378 | --- a/drivers/net/wireless/ath/ath10k/mac.c | ||
7379 | +++ b/drivers/net/wireless/ath/ath10k/mac.c | ||
7380 | @@ -7131,7 +7131,7 @@ ath10k_mac_update_bss_chan_survey(struct ath10k *ar, | ||
7381 | struct ieee80211_channel *channel) | ||
7382 | { | ||
7383 | int ret; | ||
7384 | - enum wmi_bss_survey_req_type type = WMI_BSS_SURVEY_REQ_TYPE_READ_CLEAR; | ||
7385 | + enum wmi_bss_survey_req_type type = WMI_BSS_SURVEY_REQ_TYPE_READ; | ||
7386 | |||
7387 | lockdep_assert_held(&ar->conf_mutex); | ||
7388 | |||
7389 | diff --git a/drivers/net/wireless/ath/ath6kl/main.c b/drivers/net/wireless/ath/ath6kl/main.c | ||
7390 | index 5e7ea838a9218..814131a0680a4 100644 | ||
7391 | --- a/drivers/net/wireless/ath/ath6kl/main.c | ||
7392 | +++ b/drivers/net/wireless/ath/ath6kl/main.c | ||
7393 | @@ -430,6 +430,9 @@ void ath6kl_connect_ap_mode_sta(struct ath6kl_vif *vif, u16 aid, u8 *mac_addr, | ||
7394 | |||
7395 | ath6kl_dbg(ATH6KL_DBG_TRC, "new station %pM aid=%d\n", mac_addr, aid); | ||
7396 | |||
7397 | + if (aid < 1 || aid > AP_MAX_NUM_STA) | ||
7398 | + return; | ||
7399 | + | ||
7400 | if (assoc_req_len > sizeof(struct ieee80211_hdr_3addr)) { | ||
7401 | struct ieee80211_mgmt *mgmt = | ||
7402 | (struct ieee80211_mgmt *) assoc_info; | ||
7403 | diff --git a/drivers/net/wireless/ath/ath6kl/wmi.c b/drivers/net/wireless/ath/ath6kl/wmi.c | ||
7404 | index 2382c6c46851e..c610fe21c85c0 100644 | ||
7405 | --- a/drivers/net/wireless/ath/ath6kl/wmi.c | ||
7406 | +++ b/drivers/net/wireless/ath/ath6kl/wmi.c | ||
7407 | @@ -2645,6 +2645,11 @@ int ath6kl_wmi_delete_pstream_cmd(struct wmi *wmi, u8 if_idx, u8 traffic_class, | ||
7408 | return -EINVAL; | ||
7409 | } | ||
7410 | |||
7411 | + if (tsid >= 16) { | ||
7412 | + ath6kl_err("invalid tsid: %d\n", tsid); | ||
7413 | + return -EINVAL; | ||
7414 | + } | ||
7415 | + | ||
7416 | skb = ath6kl_wmi_get_new_buf(sizeof(*cmd)); | ||
7417 | if (!skb) | ||
7418 | return -ENOMEM; | ||
7419 | diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.c b/drivers/net/wireless/ath/ath9k/hif_usb.c | ||
7420 | index 3f563e02d17da..2ed98aaed6fb5 100644 | ||
7421 | --- a/drivers/net/wireless/ath/ath9k/hif_usb.c | ||
7422 | +++ b/drivers/net/wireless/ath/ath9k/hif_usb.c | ||
7423 | @@ -449,10 +449,19 @@ static void hif_usb_stop(void *hif_handle) | ||
7424 | spin_unlock_irqrestore(&hif_dev->tx.tx_lock, flags); | ||
7425 | |||
7426 | /* The pending URBs have to be canceled. */ | ||
7427 | + spin_lock_irqsave(&hif_dev->tx.tx_lock, flags); | ||
7428 | list_for_each_entry_safe(tx_buf, tx_buf_tmp, | ||
7429 | &hif_dev->tx.tx_pending, list) { | ||
7430 | + usb_get_urb(tx_buf->urb); | ||
7431 | + spin_unlock_irqrestore(&hif_dev->tx.tx_lock, flags); | ||
7432 | usb_kill_urb(tx_buf->urb); | ||
7433 | + list_del(&tx_buf->list); | ||
7434 | + usb_free_urb(tx_buf->urb); | ||
7435 | + kfree(tx_buf->buf); | ||
7436 | + kfree(tx_buf); | ||
7437 | + spin_lock_irqsave(&hif_dev->tx.tx_lock, flags); | ||
7438 | } | ||
7439 | + spin_unlock_irqrestore(&hif_dev->tx.tx_lock, flags); | ||
7440 | |||
7441 | usb_kill_anchored_urbs(&hif_dev->mgmt_submitted); | ||
7442 | } | ||
7443 | @@ -762,27 +771,37 @@ static void ath9k_hif_usb_dealloc_tx_urbs(struct hif_device_usb *hif_dev) | ||
7444 | struct tx_buf *tx_buf = NULL, *tx_buf_tmp = NULL; | ||
7445 | unsigned long flags; | ||
7446 | |||
7447 | + spin_lock_irqsave(&hif_dev->tx.tx_lock, flags); | ||
7448 | list_for_each_entry_safe(tx_buf, tx_buf_tmp, | ||
7449 | &hif_dev->tx.tx_buf, list) { | ||
7450 | + usb_get_urb(tx_buf->urb); | ||
7451 | + spin_unlock_irqrestore(&hif_dev->tx.tx_lock, flags); | ||
7452 | usb_kill_urb(tx_buf->urb); | ||
7453 | list_del(&tx_buf->list); | ||
7454 | usb_free_urb(tx_buf->urb); | ||
7455 | kfree(tx_buf->buf); | ||
7456 | kfree(tx_buf); | ||
7457 | + spin_lock_irqsave(&hif_dev->tx.tx_lock, flags); | ||
7458 | } | ||
7459 | + spin_unlock_irqrestore(&hif_dev->tx.tx_lock, flags); | ||
7460 | |||
7461 | spin_lock_irqsave(&hif_dev->tx.tx_lock, flags); | ||
7462 | hif_dev->tx.flags |= HIF_USB_TX_FLUSH; | ||
7463 | spin_unlock_irqrestore(&hif_dev->tx.tx_lock, flags); | ||
7464 | |||
7465 | + spin_lock_irqsave(&hif_dev->tx.tx_lock, flags); | ||
7466 | list_for_each_entry_safe(tx_buf, tx_buf_tmp, | ||
7467 | &hif_dev->tx.tx_pending, list) { | ||
7468 | + usb_get_urb(tx_buf->urb); | ||
7469 | + spin_unlock_irqrestore(&hif_dev->tx.tx_lock, flags); | ||
7470 | usb_kill_urb(tx_buf->urb); | ||
7471 | list_del(&tx_buf->list); | ||
7472 | usb_free_urb(tx_buf->urb); | ||
7473 | kfree(tx_buf->buf); | ||
7474 | kfree(tx_buf); | ||
7475 | + spin_lock_irqsave(&hif_dev->tx.tx_lock, flags); | ||
7476 | } | ||
7477 | + spin_unlock_irqrestore(&hif_dev->tx.tx_lock, flags); | ||
7478 | |||
7479 | usb_kill_anchored_urbs(&hif_dev->mgmt_submitted); | ||
7480 | } | ||
7481 | diff --git a/drivers/net/wireless/ath/ath9k/htc_hst.c b/drivers/net/wireless/ath/ath9k/htc_hst.c | ||
7482 | index d2e062eaf5614..510e61e97dbcb 100644 | ||
7483 | --- a/drivers/net/wireless/ath/ath9k/htc_hst.c | ||
7484 | +++ b/drivers/net/wireless/ath/ath9k/htc_hst.c | ||
7485 | @@ -339,6 +339,8 @@ void ath9k_htc_txcompletion_cb(struct htc_target *htc_handle, | ||
7486 | |||
7487 | if (skb) { | ||
7488 | htc_hdr = (struct htc_frame_hdr *) skb->data; | ||
7489 | + if (htc_hdr->endpoint_id >= ARRAY_SIZE(htc_handle->endpoint)) | ||
7490 | + goto ret; | ||
7491 | endpoint = &htc_handle->endpoint[htc_hdr->endpoint_id]; | ||
7492 | skb_pull(skb, sizeof(struct htc_frame_hdr)); | ||
7493 | |||
7494 | diff --git a/drivers/net/wireless/ath/wcn36xx/main.c b/drivers/net/wireless/ath/wcn36xx/main.c | ||
7495 | index ad051f34e65b2..46ae4ec4ad47d 100644 | ||
7496 | --- a/drivers/net/wireless/ath/wcn36xx/main.c | ||
7497 | +++ b/drivers/net/wireless/ath/wcn36xx/main.c | ||
7498 | @@ -163,7 +163,7 @@ static struct ieee80211_supported_band wcn_band_5ghz = { | ||
7499 | .ampdu_density = IEEE80211_HT_MPDU_DENSITY_16, | ||
7500 | .mcs = { | ||
7501 | .rx_mask = { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, | ||
7502 | - .rx_highest = cpu_to_le16(72), | ||
7503 | + .rx_highest = cpu_to_le16(150), | ||
7504 | .tx_params = IEEE80211_HT_MCS_TX_DEFINED, | ||
7505 | } | ||
7506 | } | ||
7507 | diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | ||
7508 | index 85cf96461ddeb..e9bb8dbdc9aa8 100644 | ||
7509 | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | ||
7510 | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | ||
7511 | @@ -483,7 +483,7 @@ static int brcmf_rx_hdrpull(struct brcmf_pub *drvr, struct sk_buff *skb, | ||
7512 | ret = brcmf_proto_hdrpull(drvr, true, skb, ifp); | ||
7513 | |||
7514 | if (ret || !(*ifp) || !(*ifp)->ndev) { | ||
7515 | - if (ret != -ENODATA && *ifp) | ||
7516 | + if (ret != -ENODATA && *ifp && (*ifp)->ndev) | ||
7517 | (*ifp)->ndev->stats.rx_errors++; | ||
7518 | brcmu_pkt_buf_free_skb(skb); | ||
7519 | return -ENODATA; | ||
7520 | diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c | ||
7521 | index e3dd8623be4ec..c2705d7a4247e 100644 | ||
7522 | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c | ||
7523 | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c | ||
7524 | @@ -1619,6 +1619,8 @@ fail: | ||
7525 | BRCMF_TX_IOCTL_MAX_MSG_SIZE, | ||
7526 | msgbuf->ioctbuf, | ||
7527 | msgbuf->ioctbuf_handle); | ||
7528 | + if (msgbuf->txflow_wq) | ||
7529 | + destroy_workqueue(msgbuf->txflow_wq); | ||
7530 | kfree(msgbuf); | ||
7531 | } | ||
7532 | return -ENOMEM; | ||
7533 | diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_lcn.c b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_lcn.c | ||
7534 | index 7ef36234a25dc..66797dc5e90d5 100644 | ||
7535 | --- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_lcn.c | ||
7536 | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_lcn.c | ||
7537 | @@ -5065,8 +5065,10 @@ bool wlc_phy_attach_lcnphy(struct brcms_phy *pi) | ||
7538 | pi->pi_fptr.radioloftget = wlc_lcnphy_get_radio_loft; | ||
7539 | pi->pi_fptr.detach = wlc_phy_detach_lcnphy; | ||
7540 | |||
7541 | - if (!wlc_phy_txpwr_srom_read_lcnphy(pi)) | ||
7542 | + if (!wlc_phy_txpwr_srom_read_lcnphy(pi)) { | ||
7543 | + kfree(pi->u.pi_lcnphy); | ||
7544 | return false; | ||
7545 | + } | ||
7546 | |||
7547 | if (LCNREV_IS(pi->pubpi.phy_rev, 1)) { | ||
7548 | if (pi_lcn->lcnphy_tempsense_option == 3) { | ||
7549 | diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | ||
7550 | index ed92a8e8cd519..01b26b3327b01 100644 | ||
7551 | --- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | ||
7552 | +++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | ||
7553 | @@ -3650,9 +3650,12 @@ static int iwl_mvm_send_aux_roc_cmd(struct iwl_mvm *mvm, | ||
7554 | tail->apply_time_max_delay = cpu_to_le32(delay); | ||
7555 | |||
7556 | IWL_DEBUG_TE(mvm, | ||
7557 | - "ROC: Requesting to remain on channel %u for %ums (requested = %ums, max_delay = %ums, dtim_interval = %ums)\n", | ||
7558 | - channel->hw_value, req_dur, duration, delay, | ||
7559 | - dtim_interval); | ||
7560 | + "ROC: Requesting to remain on channel %u for %ums\n", | ||
7561 | + channel->hw_value, req_dur); | ||
7562 | + IWL_DEBUG_TE(mvm, | ||
7563 | + "\t(requested = %ums, max_delay = %ums, dtim_interval = %ums)\n", | ||
7564 | + duration, delay, dtim_interval); | ||
7565 | + | ||
7566 | /* Set the node address */ | ||
7567 | memcpy(tail->node_addr, vif->addr, ETH_ALEN); | ||
7568 | |||
7569 | diff --git a/drivers/net/wireless/marvell/mwifiex/scan.c b/drivers/net/wireless/marvell/mwifiex/scan.c | ||
7570 | index 59f0651d148bb..629af26675cf1 100644 | ||
7571 | --- a/drivers/net/wireless/marvell/mwifiex/scan.c | ||
7572 | +++ b/drivers/net/wireless/marvell/mwifiex/scan.c | ||
7573 | @@ -1891,7 +1891,7 @@ mwifiex_parse_single_response_buf(struct mwifiex_private *priv, u8 **bss_info, | ||
7574 | chan, CFG80211_BSS_FTYPE_UNKNOWN, | ||
7575 | bssid, timestamp, | ||
7576 | cap_info_bitmap, beacon_period, | ||
7577 | - ie_buf, ie_len, rssi, GFP_KERNEL); | ||
7578 | + ie_buf, ie_len, rssi, GFP_ATOMIC); | ||
7579 | if (bss) { | ||
7580 | bss_priv = (struct mwifiex_bss_priv *)bss->priv; | ||
7581 | bss_priv->band = band; | ||
7582 | diff --git a/drivers/net/wireless/marvell/mwifiex/sdio.c b/drivers/net/wireless/marvell/mwifiex/sdio.c | ||
7583 | index fec38b6e86ffd..b322c2755e9a4 100644 | ||
7584 | --- a/drivers/net/wireless/marvell/mwifiex/sdio.c | ||
7585 | +++ b/drivers/net/wireless/marvell/mwifiex/sdio.c | ||
7586 | @@ -1996,6 +1996,8 @@ error: | ||
7587 | kfree(card->mpa_rx.buf); | ||
7588 | card->mpa_tx.buf_size = 0; | ||
7589 | card->mpa_rx.buf_size = 0; | ||
7590 | + card->mpa_tx.buf = NULL; | ||
7591 | + card->mpa_rx.buf = NULL; | ||
7592 | } | ||
7593 | |||
7594 | return ret; | ||
7595 | diff --git a/drivers/net/wireless/marvell/mwifiex/usb.c b/drivers/net/wireless/marvell/mwifiex/usb.c | ||
7596 | index c2365eeb70168..528107d70c1cb 100644 | ||
7597 | --- a/drivers/net/wireless/marvell/mwifiex/usb.c | ||
7598 | +++ b/drivers/net/wireless/marvell/mwifiex/usb.c | ||
7599 | @@ -1353,7 +1353,8 @@ static void mwifiex_usb_cleanup_tx_aggr(struct mwifiex_adapter *adapter) | ||
7600 | skb_dequeue(&port->tx_aggr.aggr_list))) | ||
7601 | mwifiex_write_data_complete(adapter, skb_tmp, | ||
7602 | 0, -1); | ||
7603 | - del_timer_sync(&port->tx_aggr.timer_cnxt.hold_timer); | ||
7604 | + if (port->tx_aggr.timer_cnxt.hold_timer.function) | ||
7605 | + del_timer_sync(&port->tx_aggr.timer_cnxt.hold_timer); | ||
7606 | port->tx_aggr.timer_cnxt.is_hold_timer_set = false; | ||
7607 | port->tx_aggr.timer_cnxt.hold_tmo_msecs = 0; | ||
7608 | } | ||
7609 | diff --git a/drivers/net/wireless/quantenna/qtnfmac/commands.c b/drivers/net/wireless/quantenna/qtnfmac/commands.c | ||
7610 | index c0c32805fb8de..106f1a846f499 100644 | ||
7611 | --- a/drivers/net/wireless/quantenna/qtnfmac/commands.c | ||
7612 | +++ b/drivers/net/wireless/quantenna/qtnfmac/commands.c | ||
7613 | @@ -834,6 +834,7 @@ int qtnf_cmd_send_del_intf(struct qtnf_vif *vif) | ||
7614 | default: | ||
7615 | pr_warn("VIF%u.%u: unsupported iftype %d\n", vif->mac->macid, | ||
7616 | vif->vifid, vif->wdev.iftype); | ||
7617 | + dev_kfree_skb(cmd_skb); | ||
7618 | ret = -EINVAL; | ||
7619 | goto out; | ||
7620 | } | ||
7621 | @@ -1996,6 +1997,7 @@ int qtnf_cmd_send_change_sta(struct qtnf_vif *vif, const u8 *mac, | ||
7622 | break; | ||
7623 | default: | ||
7624 | pr_err("unsupported iftype %d\n", vif->wdev.iftype); | ||
7625 | + dev_kfree_skb(cmd_skb); | ||
7626 | ret = -EINVAL; | ||
7627 | goto out; | ||
7628 | } | ||
7629 | diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | ||
7630 | index 3499b211dad51..048984ca81fdb 100644 | ||
7631 | --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | ||
7632 | +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | ||
7633 | @@ -5447,7 +5447,6 @@ static int rtl8xxxu_submit_int_urb(struct ieee80211_hw *hw) | ||
7634 | ret = usb_submit_urb(urb, GFP_KERNEL); | ||
7635 | if (ret) { | ||
7636 | usb_unanchor_urb(urb); | ||
7637 | - usb_free_urb(urb); | ||
7638 | goto error; | ||
7639 | } | ||
7640 | |||
7641 | @@ -5456,6 +5455,7 @@ static int rtl8xxxu_submit_int_urb(struct ieee80211_hw *hw) | ||
7642 | rtl8xxxu_write32(priv, REG_USB_HIMR, val32); | ||
7643 | |||
7644 | error: | ||
7645 | + usb_free_urb(urb); | ||
7646 | return ret; | ||
7647 | } | ||
7648 | |||
7649 | @@ -5781,6 +5781,7 @@ static int rtl8xxxu_start(struct ieee80211_hw *hw) | ||
7650 | struct rtl8xxxu_priv *priv = hw->priv; | ||
7651 | struct rtl8xxxu_rx_urb *rx_urb; | ||
7652 | struct rtl8xxxu_tx_urb *tx_urb; | ||
7653 | + struct sk_buff *skb; | ||
7654 | unsigned long flags; | ||
7655 | int ret, i; | ||
7656 | |||
7657 | @@ -5831,6 +5832,13 @@ static int rtl8xxxu_start(struct ieee80211_hw *hw) | ||
7658 | rx_urb->hw = hw; | ||
7659 | |||
7660 | ret = rtl8xxxu_submit_rx_urb(priv, rx_urb); | ||
7661 | + if (ret) { | ||
7662 | + if (ret != -ENOMEM) { | ||
7663 | + skb = (struct sk_buff *)rx_urb->urb.context; | ||
7664 | + dev_kfree_skb(skb); | ||
7665 | + } | ||
7666 | + rtl8xxxu_queue_rx_urb(priv, rx_urb); | ||
7667 | + } | ||
7668 | } | ||
7669 | exit: | ||
7670 | /* | ||
7671 | diff --git a/drivers/net/wireless/realtek/rtw88/pci.h b/drivers/net/wireless/realtek/rtw88/pci.h | ||
7672 | index 87824a4caba98..a47d871ae506a 100644 | ||
7673 | --- a/drivers/net/wireless/realtek/rtw88/pci.h | ||
7674 | +++ b/drivers/net/wireless/realtek/rtw88/pci.h | ||
7675 | @@ -13,8 +13,8 @@ | ||
7676 | #define RTK_BEQ_TX_DESC_NUM 256 | ||
7677 | |||
7678 | #define RTK_MAX_RX_DESC_NUM 512 | ||
7679 | -/* 8K + rx desc size */ | ||
7680 | -#define RTK_PCI_RX_BUF_SIZE (8192 + 24) | ||
7681 | +/* 11K + rx desc size */ | ||
7682 | +#define RTK_PCI_RX_BUF_SIZE (11454 + 24) | ||
7683 | |||
7684 | #define RTK_PCI_CTRL 0x300 | ||
7685 | #define BIT_RST_TRXDMA_INTF BIT(20) | ||
7686 | diff --git a/drivers/ntb/hw/amd/ntb_hw_amd.c b/drivers/ntb/hw/amd/ntb_hw_amd.c | ||
7687 | index 156c2a18a2394..abb37659de343 100644 | ||
7688 | --- a/drivers/ntb/hw/amd/ntb_hw_amd.c | ||
7689 | +++ b/drivers/ntb/hw/amd/ntb_hw_amd.c | ||
7690 | @@ -1036,6 +1036,7 @@ static int amd_ntb_init_pci(struct amd_ntb_dev *ndev, | ||
7691 | |||
7692 | err_dma_mask: | ||
7693 | pci_clear_master(pdev); | ||
7694 | + pci_release_regions(pdev); | ||
7695 | err_pci_regions: | ||
7696 | pci_disable_device(pdev); | ||
7697 | err_pci_enable: | ||
7698 | diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c | ||
7699 | index af0b51d1d43e8..f5d12bf109c78 100644 | ||
7700 | --- a/drivers/nvme/host/pci.c | ||
7701 | +++ b/drivers/nvme/host/pci.c | ||
7702 | @@ -3110,7 +3110,8 @@ static const struct pci_device_id nvme_id_table[] = { | ||
7703 | NVME_QUIRK_DEALLOCATE_ZEROES, }, | ||
7704 | { PCI_VDEVICE(INTEL, 0xf1a5), /* Intel 600P/P3100 */ | ||
7705 | .driver_data = NVME_QUIRK_NO_DEEPEST_PS | | ||
7706 | - NVME_QUIRK_MEDIUM_PRIO_SQ }, | ||
7707 | + NVME_QUIRK_MEDIUM_PRIO_SQ | | ||
7708 | + NVME_QUIRK_DISABLE_WRITE_ZEROES, }, | ||
7709 | { PCI_VDEVICE(INTEL, 0xf1a6), /* Intel 760p/Pro 7600p */ | ||
7710 | .driver_data = NVME_QUIRK_IGNORE_DEV_SUBNQN, }, | ||
7711 | { PCI_VDEVICE(INTEL, 0x5845), /* Qemu emulated controller */ | ||
7712 | diff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c | ||
7713 | index 7d7176369edf7..6b2f1e290fa73 100644 | ||
7714 | --- a/drivers/nvme/target/core.c | ||
7715 | +++ b/drivers/nvme/target/core.c | ||
7716 | @@ -1048,7 +1048,8 @@ static void nvmet_start_ctrl(struct nvmet_ctrl *ctrl) | ||
7717 | * in case a host died before it enabled the controller. Hence, simply | ||
7718 | * reset the keep alive timer when the controller is enabled. | ||
7719 | */ | ||
7720 | - mod_delayed_work(system_wq, &ctrl->ka_work, ctrl->kato * HZ); | ||
7721 | + if (ctrl->kato) | ||
7722 | + mod_delayed_work(system_wq, &ctrl->ka_work, ctrl->kato * HZ); | ||
7723 | } | ||
7724 | |||
7725 | static void nvmet_clear_ctrl(struct nvmet_ctrl *ctrl) | ||
7726 | diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c | ||
7727 | index 960542dea5adb..84f4078216a36 100644 | ||
7728 | --- a/drivers/nvmem/core.c | ||
7729 | +++ b/drivers/nvmem/core.c | ||
7730 | @@ -130,16 +130,14 @@ static void nvmem_cell_add(struct nvmem_cell *cell) | ||
7731 | blocking_notifier_call_chain(&nvmem_notifier, NVMEM_CELL_ADD, cell); | ||
7732 | } | ||
7733 | |||
7734 | -static int nvmem_cell_info_to_nvmem_cell(struct nvmem_device *nvmem, | ||
7735 | - const struct nvmem_cell_info *info, | ||
7736 | - struct nvmem_cell *cell) | ||
7737 | +static int nvmem_cell_info_to_nvmem_cell_nodup(struct nvmem_device *nvmem, | ||
7738 | + const struct nvmem_cell_info *info, | ||
7739 | + struct nvmem_cell *cell) | ||
7740 | { | ||
7741 | cell->nvmem = nvmem; | ||
7742 | cell->offset = info->offset; | ||
7743 | cell->bytes = info->bytes; | ||
7744 | - cell->name = kstrdup_const(info->name, GFP_KERNEL); | ||
7745 | - if (!cell->name) | ||
7746 | - return -ENOMEM; | ||
7747 | + cell->name = info->name; | ||
7748 | |||
7749 | cell->bit_offset = info->bit_offset; | ||
7750 | cell->nbits = info->nbits; | ||
7751 | @@ -151,13 +149,30 @@ static int nvmem_cell_info_to_nvmem_cell(struct nvmem_device *nvmem, | ||
7752 | if (!IS_ALIGNED(cell->offset, nvmem->stride)) { | ||
7753 | dev_err(&nvmem->dev, | ||
7754 | "cell %s unaligned to nvmem stride %d\n", | ||
7755 | - cell->name, nvmem->stride); | ||
7756 | + cell->name ?: "<unknown>", nvmem->stride); | ||
7757 | return -EINVAL; | ||
7758 | } | ||
7759 | |||
7760 | return 0; | ||
7761 | } | ||
7762 | |||
7763 | +static int nvmem_cell_info_to_nvmem_cell(struct nvmem_device *nvmem, | ||
7764 | + const struct nvmem_cell_info *info, | ||
7765 | + struct nvmem_cell *cell) | ||
7766 | +{ | ||
7767 | + int err; | ||
7768 | + | ||
7769 | + err = nvmem_cell_info_to_nvmem_cell_nodup(nvmem, info, cell); | ||
7770 | + if (err) | ||
7771 | + return err; | ||
7772 | + | ||
7773 | + cell->name = kstrdup_const(info->name, GFP_KERNEL); | ||
7774 | + if (!cell->name) | ||
7775 | + return -ENOMEM; | ||
7776 | + | ||
7777 | + return 0; | ||
7778 | +} | ||
7779 | + | ||
7780 | /** | ||
7781 | * nvmem_add_cells() - Add cell information to an nvmem device | ||
7782 | * | ||
7783 | @@ -1174,7 +1189,7 @@ ssize_t nvmem_device_cell_read(struct nvmem_device *nvmem, | ||
7784 | if (!nvmem) | ||
7785 | return -EINVAL; | ||
7786 | |||
7787 | - rc = nvmem_cell_info_to_nvmem_cell(nvmem, info, &cell); | ||
7788 | + rc = nvmem_cell_info_to_nvmem_cell_nodup(nvmem, info, &cell); | ||
7789 | if (rc) | ||
7790 | return rc; | ||
7791 | |||
7792 | @@ -1204,7 +1219,7 @@ int nvmem_device_cell_write(struct nvmem_device *nvmem, | ||
7793 | if (!nvmem) | ||
7794 | return -EINVAL; | ||
7795 | |||
7796 | - rc = nvmem_cell_info_to_nvmem_cell(nvmem, info, &cell); | ||
7797 | + rc = nvmem_cell_info_to_nvmem_cell_nodup(nvmem, info, &cell); | ||
7798 | if (rc) | ||
7799 | return rc; | ||
7800 | |||
7801 | diff --git a/drivers/opp/core.c b/drivers/opp/core.c | ||
7802 | index 29dfaa591f8b0..8867bab72e171 100644 | ||
7803 | --- a/drivers/opp/core.c | ||
7804 | +++ b/drivers/opp/core.c | ||
7805 | @@ -1796,6 +1796,9 @@ static void _opp_detach_genpd(struct opp_table *opp_table) | ||
7806 | { | ||
7807 | int index; | ||
7808 | |||
7809 | + if (!opp_table->genpd_virt_devs) | ||
7810 | + return; | ||
7811 | + | ||
7812 | for (index = 0; index < opp_table->required_opp_count; index++) { | ||
7813 | if (!opp_table->genpd_virt_devs[index]) | ||
7814 | continue; | ||
7815 | @@ -1842,6 +1845,9 @@ struct opp_table *dev_pm_opp_attach_genpd(struct device *dev, | ||
7816 | if (!opp_table) | ||
7817 | return ERR_PTR(-ENOMEM); | ||
7818 | |||
7819 | + if (opp_table->genpd_virt_devs) | ||
7820 | + return opp_table; | ||
7821 | + | ||
7822 | /* | ||
7823 | * If the genpd's OPP table isn't already initialized, parsing of the | ||
7824 | * required-opps fail for dev. We should retry this after genpd's OPP | ||
7825 | diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c | ||
7826 | index f2481e80e2723..d0e60441dc8f2 100644 | ||
7827 | --- a/drivers/pci/controller/pci-aardvark.c | ||
7828 | +++ b/drivers/pci/controller/pci-aardvark.c | ||
7829 | @@ -503,7 +503,7 @@ static struct pci_bridge_emul_ops advk_pci_bridge_emul_ops = { | ||
7830 | * Initialize the configuration space of the PCI-to-PCI bridge | ||
7831 | * associated with the given PCIe interface. | ||
7832 | */ | ||
7833 | -static void advk_sw_pci_bridge_init(struct advk_pcie *pcie) | ||
7834 | +static int advk_sw_pci_bridge_init(struct advk_pcie *pcie) | ||
7835 | { | ||
7836 | struct pci_bridge_emul *bridge = &pcie->bridge; | ||
7837 | |||
7838 | @@ -527,8 +527,7 @@ static void advk_sw_pci_bridge_init(struct advk_pcie *pcie) | ||
7839 | bridge->data = pcie; | ||
7840 | bridge->ops = &advk_pci_bridge_emul_ops; | ||
7841 | |||
7842 | - pci_bridge_emul_init(bridge, 0); | ||
7843 | - | ||
7844 | + return pci_bridge_emul_init(bridge, 0); | ||
7845 | } | ||
7846 | |||
7847 | static bool advk_pcie_valid_device(struct advk_pcie *pcie, struct pci_bus *bus, | ||
7848 | @@ -1027,7 +1026,11 @@ static int advk_pcie_probe(struct platform_device *pdev) | ||
7849 | |||
7850 | advk_pcie_setup_hw(pcie); | ||
7851 | |||
7852 | - advk_sw_pci_bridge_init(pcie); | ||
7853 | + ret = advk_sw_pci_bridge_init(pcie); | ||
7854 | + if (ret) { | ||
7855 | + dev_err(dev, "Failed to register emulated root PCI bridge\n"); | ||
7856 | + return ret; | ||
7857 | + } | ||
7858 | |||
7859 | ret = advk_pcie_init_irq_domain(pcie); | ||
7860 | if (ret) { | ||
7861 | diff --git a/drivers/pci/controller/pcie-iproc-msi.c b/drivers/pci/controller/pcie-iproc-msi.c | ||
7862 | index 0a3f61be5625b..a1298f6784ac9 100644 | ||
7863 | --- a/drivers/pci/controller/pcie-iproc-msi.c | ||
7864 | +++ b/drivers/pci/controller/pcie-iproc-msi.c | ||
7865 | @@ -209,15 +209,20 @@ static int iproc_msi_irq_set_affinity(struct irq_data *data, | ||
7866 | struct iproc_msi *msi = irq_data_get_irq_chip_data(data); | ||
7867 | int target_cpu = cpumask_first(mask); | ||
7868 | int curr_cpu; | ||
7869 | + int ret; | ||
7870 | |||
7871 | curr_cpu = hwirq_to_cpu(msi, data->hwirq); | ||
7872 | if (curr_cpu == target_cpu) | ||
7873 | - return IRQ_SET_MASK_OK_DONE; | ||
7874 | + ret = IRQ_SET_MASK_OK_DONE; | ||
7875 | + else { | ||
7876 | + /* steer MSI to the target CPU */ | ||
7877 | + data->hwirq = hwirq_to_canonical_hwirq(msi, data->hwirq) + target_cpu; | ||
7878 | + ret = IRQ_SET_MASK_OK; | ||
7879 | + } | ||
7880 | |||
7881 | - /* steer MSI to the target CPU */ | ||
7882 | - data->hwirq = hwirq_to_canonical_hwirq(msi, data->hwirq) + target_cpu; | ||
7883 | + irq_data_update_effective_affinity(data, cpumask_of(target_cpu)); | ||
7884 | |||
7885 | - return IRQ_SET_MASK_OK; | ||
7886 | + return ret; | ||
7887 | } | ||
7888 | |||
7889 | static void iproc_msi_irq_compose_msi_msg(struct irq_data *data, | ||
7890 | diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c | ||
7891 | index 9c116cbaa95d8..e15220385666f 100644 | ||
7892 | --- a/drivers/pci/iov.c | ||
7893 | +++ b/drivers/pci/iov.c | ||
7894 | @@ -158,6 +158,7 @@ int pci_iov_add_virtfn(struct pci_dev *dev, int id) | ||
7895 | virtfn->device = iov->vf_device; | ||
7896 | virtfn->is_virtfn = 1; | ||
7897 | virtfn->physfn = pci_dev_get(dev); | ||
7898 | + virtfn->no_command_memory = 1; | ||
7899 | |||
7900 | if (id == 0) | ||
7901 | pci_read_vf_config_common(virtfn); | ||
7902 | diff --git a/drivers/perf/thunderx2_pmu.c b/drivers/perf/thunderx2_pmu.c | ||
7903 | index 9e1c3c7eeba9b..170ccb164c604 100644 | ||
7904 | --- a/drivers/perf/thunderx2_pmu.c | ||
7905 | +++ b/drivers/perf/thunderx2_pmu.c | ||
7906 | @@ -627,14 +627,17 @@ static struct tx2_uncore_pmu *tx2_uncore_pmu_init_dev(struct device *dev, | ||
7907 | list_for_each_entry(rentry, &list, node) { | ||
7908 | if (resource_type(rentry->res) == IORESOURCE_MEM) { | ||
7909 | res = *rentry->res; | ||
7910 | + rentry = NULL; | ||
7911 | break; | ||
7912 | } | ||
7913 | } | ||
7914 | + acpi_dev_free_resource_list(&list); | ||
7915 | |||
7916 | - if (!rentry->res) | ||
7917 | + if (rentry) { | ||
7918 | + dev_err(dev, "PMU type %d: Fail to find resource\n", type); | ||
7919 | return NULL; | ||
7920 | + } | ||
7921 | |||
7922 | - acpi_dev_free_resource_list(&list); | ||
7923 | base = devm_ioremap_resource(dev, &res); | ||
7924 | if (IS_ERR(base)) { | ||
7925 | dev_err(dev, "PMU type %d: Fail to map resource\n", type); | ||
7926 | diff --git a/drivers/perf/xgene_pmu.c b/drivers/perf/xgene_pmu.c | ||
7927 | index 328aea9f6be32..50b37f8f5c7ff 100644 | ||
7928 | --- a/drivers/perf/xgene_pmu.c | ||
7929 | +++ b/drivers/perf/xgene_pmu.c | ||
7930 | @@ -1459,17 +1459,6 @@ static char *xgene_pmu_dev_name(struct device *dev, u32 type, int id) | ||
7931 | } | ||
7932 | |||
7933 | #if defined(CONFIG_ACPI) | ||
7934 | -static int acpi_pmu_dev_add_resource(struct acpi_resource *ares, void *data) | ||
7935 | -{ | ||
7936 | - struct resource *res = data; | ||
7937 | - | ||
7938 | - if (ares->type == ACPI_RESOURCE_TYPE_FIXED_MEMORY32) | ||
7939 | - acpi_dev_resource_memory(ares, res); | ||
7940 | - | ||
7941 | - /* Always tell the ACPI core to skip this resource */ | ||
7942 | - return 1; | ||
7943 | -} | ||
7944 | - | ||
7945 | static struct | ||
7946 | xgene_pmu_dev_ctx *acpi_get_pmu_hw_inf(struct xgene_pmu *xgene_pmu, | ||
7947 | struct acpi_device *adev, u32 type) | ||
7948 | @@ -1481,6 +1470,7 @@ xgene_pmu_dev_ctx *acpi_get_pmu_hw_inf(struct xgene_pmu *xgene_pmu, | ||
7949 | struct hw_pmu_info *inf; | ||
7950 | void __iomem *dev_csr; | ||
7951 | struct resource res; | ||
7952 | + struct resource_entry *rentry; | ||
7953 | int enable_bit; | ||
7954 | int rc; | ||
7955 | |||
7956 | @@ -1489,11 +1479,23 @@ xgene_pmu_dev_ctx *acpi_get_pmu_hw_inf(struct xgene_pmu *xgene_pmu, | ||
7957 | return NULL; | ||
7958 | |||
7959 | INIT_LIST_HEAD(&resource_list); | ||
7960 | - rc = acpi_dev_get_resources(adev, &resource_list, | ||
7961 | - acpi_pmu_dev_add_resource, &res); | ||
7962 | + rc = acpi_dev_get_resources(adev, &resource_list, NULL, NULL); | ||
7963 | + if (rc <= 0) { | ||
7964 | + dev_err(dev, "PMU type %d: No resources found\n", type); | ||
7965 | + return NULL; | ||
7966 | + } | ||
7967 | + | ||
7968 | + list_for_each_entry(rentry, &resource_list, node) { | ||
7969 | + if (resource_type(rentry->res) == IORESOURCE_MEM) { | ||
7970 | + res = *rentry->res; | ||
7971 | + rentry = NULL; | ||
7972 | + break; | ||
7973 | + } | ||
7974 | + } | ||
7975 | acpi_dev_free_resource_list(&resource_list); | ||
7976 | - if (rc < 0) { | ||
7977 | - dev_err(dev, "PMU type %d: No resource address found\n", type); | ||
7978 | + | ||
7979 | + if (rentry) { | ||
7980 | + dev_err(dev, "PMU type %d: No memory resource found\n", type); | ||
7981 | return NULL; | ||
7982 | } | ||
7983 | |||
7984 | diff --git a/drivers/pinctrl/bcm/Kconfig b/drivers/pinctrl/bcm/Kconfig | ||
7985 | index dcf7df797af75..0ed14de0134cf 100644 | ||
7986 | --- a/drivers/pinctrl/bcm/Kconfig | ||
7987 | +++ b/drivers/pinctrl/bcm/Kconfig | ||
7988 | @@ -23,6 +23,7 @@ config PINCTRL_BCM2835 | ||
7989 | select PINMUX | ||
7990 | select PINCONF | ||
7991 | select GENERIC_PINCONF | ||
7992 | + select GPIOLIB | ||
7993 | select GPIOLIB_IRQCHIP | ||
7994 | default ARCH_BCM2835 || ARCH_BRCMSTB | ||
7995 | help | ||
7996 | diff --git a/drivers/pinctrl/pinctrl-mcp23s08.c b/drivers/pinctrl/pinctrl-mcp23s08.c | ||
7997 | index 3a235487e38d7..d8bcbefcba890 100644 | ||
7998 | --- a/drivers/pinctrl/pinctrl-mcp23s08.c | ||
7999 | +++ b/drivers/pinctrl/pinctrl-mcp23s08.c | ||
8000 | @@ -122,7 +122,7 @@ static const struct regmap_config mcp23x08_regmap = { | ||
8001 | .max_register = MCP_OLAT, | ||
8002 | }; | ||
8003 | |||
8004 | -static const struct reg_default mcp23x16_defaults[] = { | ||
8005 | +static const struct reg_default mcp23x17_defaults[] = { | ||
8006 | {.reg = MCP_IODIR << 1, .def = 0xffff}, | ||
8007 | {.reg = MCP_IPOL << 1, .def = 0x0000}, | ||
8008 | {.reg = MCP_GPINTEN << 1, .def = 0x0000}, | ||
8009 | @@ -133,23 +133,23 @@ static const struct reg_default mcp23x16_defaults[] = { | ||
8010 | {.reg = MCP_OLAT << 1, .def = 0x0000}, | ||
8011 | }; | ||
8012 | |||
8013 | -static const struct regmap_range mcp23x16_volatile_range = { | ||
8014 | +static const struct regmap_range mcp23x17_volatile_range = { | ||
8015 | .range_min = MCP_INTF << 1, | ||
8016 | .range_max = MCP_GPIO << 1, | ||
8017 | }; | ||
8018 | |||
8019 | -static const struct regmap_access_table mcp23x16_volatile_table = { | ||
8020 | - .yes_ranges = &mcp23x16_volatile_range, | ||
8021 | +static const struct regmap_access_table mcp23x17_volatile_table = { | ||
8022 | + .yes_ranges = &mcp23x17_volatile_range, | ||
8023 | .n_yes_ranges = 1, | ||
8024 | }; | ||
8025 | |||
8026 | -static const struct regmap_range mcp23x16_precious_range = { | ||
8027 | - .range_min = MCP_GPIO << 1, | ||
8028 | +static const struct regmap_range mcp23x17_precious_range = { | ||
8029 | + .range_min = MCP_INTCAP << 1, | ||
8030 | .range_max = MCP_GPIO << 1, | ||
8031 | }; | ||
8032 | |||
8033 | -static const struct regmap_access_table mcp23x16_precious_table = { | ||
8034 | - .yes_ranges = &mcp23x16_precious_range, | ||
8035 | +static const struct regmap_access_table mcp23x17_precious_table = { | ||
8036 | + .yes_ranges = &mcp23x17_precious_range, | ||
8037 | .n_yes_ranges = 1, | ||
8038 | }; | ||
8039 | |||
8040 | @@ -159,10 +159,10 @@ static const struct regmap_config mcp23x17_regmap = { | ||
8041 | |||
8042 | .reg_stride = 2, | ||
8043 | .max_register = MCP_OLAT << 1, | ||
8044 | - .volatile_table = &mcp23x16_volatile_table, | ||
8045 | - .precious_table = &mcp23x16_precious_table, | ||
8046 | - .reg_defaults = mcp23x16_defaults, | ||
8047 | - .num_reg_defaults = ARRAY_SIZE(mcp23x16_defaults), | ||
8048 | + .volatile_table = &mcp23x17_volatile_table, | ||
8049 | + .precious_table = &mcp23x17_precious_table, | ||
8050 | + .reg_defaults = mcp23x17_defaults, | ||
8051 | + .num_reg_defaults = ARRAY_SIZE(mcp23x17_defaults), | ||
8052 | .cache_type = REGCACHE_FLAT, | ||
8053 | .val_format_endian = REGMAP_ENDIAN_LITTLE, | ||
8054 | }; | ||
8055 | diff --git a/drivers/platform/x86/mlx-platform.c b/drivers/platform/x86/mlx-platform.c | ||
8056 | index 8fe51e43f1bc1..59b5b7eebb05a 100644 | ||
8057 | --- a/drivers/platform/x86/mlx-platform.c | ||
8058 | +++ b/drivers/platform/x86/mlx-platform.c | ||
8059 | @@ -243,15 +243,6 @@ static struct i2c_board_info mlxplat_mlxcpld_psu[] = { | ||
8060 | }, | ||
8061 | }; | ||
8062 | |||
8063 | -static struct i2c_board_info mlxplat_mlxcpld_ng_psu[] = { | ||
8064 | - { | ||
8065 | - I2C_BOARD_INFO("24c32", 0x51), | ||
8066 | - }, | ||
8067 | - { | ||
8068 | - I2C_BOARD_INFO("24c32", 0x50), | ||
8069 | - }, | ||
8070 | -}; | ||
8071 | - | ||
8072 | static struct i2c_board_info mlxplat_mlxcpld_pwr[] = { | ||
8073 | { | ||
8074 | I2C_BOARD_INFO("dps460", 0x59), | ||
8075 | @@ -611,15 +602,13 @@ static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_psu_items_data[] = { | ||
8076 | .label = "psu1", | ||
8077 | .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET, | ||
8078 | .mask = BIT(0), | ||
8079 | - .hpdev.brdinfo = &mlxplat_mlxcpld_ng_psu[0], | ||
8080 | - .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR, | ||
8081 | + .hpdev.nr = MLXPLAT_CPLD_NR_NONE, | ||
8082 | }, | ||
8083 | { | ||
8084 | .label = "psu2", | ||
8085 | .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET, | ||
8086 | .mask = BIT(1), | ||
8087 | - .hpdev.brdinfo = &mlxplat_mlxcpld_ng_psu[1], | ||
8088 | - .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR, | ||
8089 | + .hpdev.nr = MLXPLAT_CPLD_NR_NONE, | ||
8090 | }, | ||
8091 | }; | ||
8092 | |||
8093 | diff --git a/drivers/pwm/pwm-img.c b/drivers/pwm/pwm-img.c | ||
8094 | index 599a0f66a3845..a34d95ed70b20 100644 | ||
8095 | --- a/drivers/pwm/pwm-img.c | ||
8096 | +++ b/drivers/pwm/pwm-img.c | ||
8097 | @@ -277,6 +277,8 @@ static int img_pwm_probe(struct platform_device *pdev) | ||
8098 | return PTR_ERR(pwm->pwm_clk); | ||
8099 | } | ||
8100 | |||
8101 | + platform_set_drvdata(pdev, pwm); | ||
8102 | + | ||
8103 | pm_runtime_set_autosuspend_delay(&pdev->dev, IMG_PWM_PM_TIMEOUT); | ||
8104 | pm_runtime_use_autosuspend(&pdev->dev); | ||
8105 | pm_runtime_enable(&pdev->dev); | ||
8106 | @@ -313,7 +315,6 @@ static int img_pwm_probe(struct platform_device *pdev) | ||
8107 | goto err_suspend; | ||
8108 | } | ||
8109 | |||
8110 | - platform_set_drvdata(pdev, pwm); | ||
8111 | return 0; | ||
8112 | |||
8113 | err_suspend: | ||
8114 | diff --git a/drivers/pwm/pwm-lpss.c b/drivers/pwm/pwm-lpss.c | ||
8115 | index 75bbfe5f3bc29..d77cec2769b76 100644 | ||
8116 | --- a/drivers/pwm/pwm-lpss.c | ||
8117 | +++ b/drivers/pwm/pwm-lpss.c | ||
8118 | @@ -93,10 +93,12 @@ static void pwm_lpss_prepare(struct pwm_lpss_chip *lpwm, struct pwm_device *pwm, | ||
8119 | * The equation is: | ||
8120 | * base_unit = round(base_unit_range * freq / c) | ||
8121 | */ | ||
8122 | - base_unit_range = BIT(lpwm->info->base_unit_bits) - 1; | ||
8123 | + base_unit_range = BIT(lpwm->info->base_unit_bits); | ||
8124 | freq *= base_unit_range; | ||
8125 | |||
8126 | base_unit = DIV_ROUND_CLOSEST_ULL(freq, c); | ||
8127 | + /* base_unit must not be 0 and we also want to avoid overflowing it */ | ||
8128 | + base_unit = clamp_val(base_unit, 1, base_unit_range - 1); | ||
8129 | |||
8130 | on_time_div = 255ULL * duty_ns; | ||
8131 | do_div(on_time_div, period_ns); | ||
8132 | @@ -104,8 +106,7 @@ static void pwm_lpss_prepare(struct pwm_lpss_chip *lpwm, struct pwm_device *pwm, | ||
8133 | |||
8134 | orig_ctrl = ctrl = pwm_lpss_read(pwm); | ||
8135 | ctrl &= ~PWM_ON_TIME_DIV_MASK; | ||
8136 | - ctrl &= ~(base_unit_range << PWM_BASE_UNIT_SHIFT); | ||
8137 | - base_unit &= base_unit_range; | ||
8138 | + ctrl &= ~((base_unit_range - 1) << PWM_BASE_UNIT_SHIFT); | ||
8139 | ctrl |= (u32) base_unit << PWM_BASE_UNIT_SHIFT; | ||
8140 | ctrl |= on_time_div; | ||
8141 | |||
8142 | diff --git a/drivers/rapidio/devices/rio_mport_cdev.c b/drivers/rapidio/devices/rio_mport_cdev.c | ||
8143 | index 0b85a80ae7ef6..2b08fdeb87c18 100644 | ||
8144 | --- a/drivers/rapidio/devices/rio_mport_cdev.c | ||
8145 | +++ b/drivers/rapidio/devices/rio_mport_cdev.c | ||
8146 | @@ -873,15 +873,16 @@ rio_dma_transfer(struct file *filp, u32 transfer_mode, | ||
8147 | rmcd_error("get_user_pages_unlocked err=%ld", | ||
8148 | pinned); | ||
8149 | nr_pages = 0; | ||
8150 | - } else | ||
8151 | + } else { | ||
8152 | rmcd_error("pinned %ld out of %ld pages", | ||
8153 | pinned, nr_pages); | ||
8154 | + /* | ||
8155 | + * Set nr_pages up to mean "how many pages to unpin, in | ||
8156 | + * the error handler: | ||
8157 | + */ | ||
8158 | + nr_pages = pinned; | ||
8159 | + } | ||
8160 | ret = -EFAULT; | ||
8161 | - /* | ||
8162 | - * Set nr_pages up to mean "how many pages to unpin, in | ||
8163 | - * the error handler: | ||
8164 | - */ | ||
8165 | - nr_pages = pinned; | ||
8166 | goto err_pg; | ||
8167 | } | ||
8168 | |||
8169 | @@ -1682,6 +1683,7 @@ static int rio_mport_add_riodev(struct mport_cdev_priv *priv, | ||
8170 | struct rio_dev *rdev; | ||
8171 | struct rio_switch *rswitch = NULL; | ||
8172 | struct rio_mport *mport; | ||
8173 | + struct device *dev; | ||
8174 | size_t size; | ||
8175 | u32 rval; | ||
8176 | u32 swpinfo = 0; | ||
8177 | @@ -1696,8 +1698,10 @@ static int rio_mport_add_riodev(struct mport_cdev_priv *priv, | ||
8178 | rmcd_debug(RDEV, "name:%s ct:0x%x did:0x%x hc:0x%x", dev_info.name, | ||
8179 | dev_info.comptag, dev_info.destid, dev_info.hopcount); | ||
8180 | |||
8181 | - if (bus_find_device_by_name(&rio_bus_type, NULL, dev_info.name)) { | ||
8182 | + dev = bus_find_device_by_name(&rio_bus_type, NULL, dev_info.name); | ||
8183 | + if (dev) { | ||
8184 | rmcd_debug(RDEV, "device %s already exists", dev_info.name); | ||
8185 | + put_device(dev); | ||
8186 | return -EEXIST; | ||
8187 | } | ||
8188 | |||
8189 | diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c | ||
8190 | index 55fc80de5ef16..ee850cffe1542 100644 | ||
8191 | --- a/drivers/regulator/core.c | ||
8192 | +++ b/drivers/regulator/core.c | ||
8193 | @@ -5158,15 +5158,20 @@ regulator_register(const struct regulator_desc *regulator_desc, | ||
8194 | else if (regulator_desc->supply_name) | ||
8195 | rdev->supply_name = regulator_desc->supply_name; | ||
8196 | |||
8197 | - /* | ||
8198 | - * Attempt to resolve the regulator supply, if specified, | ||
8199 | - * but don't return an error if we fail because we will try | ||
8200 | - * to resolve it again later as more regulators are added. | ||
8201 | - */ | ||
8202 | - if (regulator_resolve_supply(rdev)) | ||
8203 | - rdev_dbg(rdev, "unable to resolve supply\n"); | ||
8204 | - | ||
8205 | ret = set_machine_constraints(rdev, constraints); | ||
8206 | + if (ret == -EPROBE_DEFER) { | ||
8207 | + /* Regulator might be in bypass mode and so needs its supply | ||
8208 | + * to set the constraints */ | ||
8209 | + /* FIXME: this currently triggers a chicken-and-egg problem | ||
8210 | + * when creating -SUPPLY symlink in sysfs to a regulator | ||
8211 | + * that is just being created */ | ||
8212 | + ret = regulator_resolve_supply(rdev); | ||
8213 | + if (!ret) | ||
8214 | + ret = set_machine_constraints(rdev, constraints); | ||
8215 | + else | ||
8216 | + rdev_dbg(rdev, "unable to resolve supply early: %pe\n", | ||
8217 | + ERR_PTR(ret)); | ||
8218 | + } | ||
8219 | if (ret < 0) | ||
8220 | goto wash; | ||
8221 | |||
8222 | diff --git a/drivers/rpmsg/qcom_smd.c b/drivers/rpmsg/qcom_smd.c | ||
8223 | index 4abbeea782fa4..19903de6268db 100644 | ||
8224 | --- a/drivers/rpmsg/qcom_smd.c | ||
8225 | +++ b/drivers/rpmsg/qcom_smd.c | ||
8226 | @@ -1338,7 +1338,7 @@ static int qcom_smd_parse_edge(struct device *dev, | ||
8227 | ret = of_property_read_u32(node, key, &edge->edge_id); | ||
8228 | if (ret) { | ||
8229 | dev_err(dev, "edge missing %s property\n", key); | ||
8230 | - return -EINVAL; | ||
8231 | + goto put_node; | ||
8232 | } | ||
8233 | |||
8234 | edge->remote_pid = QCOM_SMEM_HOST_ANY; | ||
8235 | @@ -1349,32 +1349,37 @@ static int qcom_smd_parse_edge(struct device *dev, | ||
8236 | edge->mbox_client.knows_txdone = true; | ||
8237 | edge->mbox_chan = mbox_request_channel(&edge->mbox_client, 0); | ||
8238 | if (IS_ERR(edge->mbox_chan)) { | ||
8239 | - if (PTR_ERR(edge->mbox_chan) != -ENODEV) | ||
8240 | - return PTR_ERR(edge->mbox_chan); | ||
8241 | + if (PTR_ERR(edge->mbox_chan) != -ENODEV) { | ||
8242 | + ret = PTR_ERR(edge->mbox_chan); | ||
8243 | + goto put_node; | ||
8244 | + } | ||
8245 | |||
8246 | edge->mbox_chan = NULL; | ||
8247 | |||
8248 | syscon_np = of_parse_phandle(node, "qcom,ipc", 0); | ||
8249 | if (!syscon_np) { | ||
8250 | dev_err(dev, "no qcom,ipc node\n"); | ||
8251 | - return -ENODEV; | ||
8252 | + ret = -ENODEV; | ||
8253 | + goto put_node; | ||
8254 | } | ||
8255 | |||
8256 | edge->ipc_regmap = syscon_node_to_regmap(syscon_np); | ||
8257 | - if (IS_ERR(edge->ipc_regmap)) | ||
8258 | - return PTR_ERR(edge->ipc_regmap); | ||
8259 | + if (IS_ERR(edge->ipc_regmap)) { | ||
8260 | + ret = PTR_ERR(edge->ipc_regmap); | ||
8261 | + goto put_node; | ||
8262 | + } | ||
8263 | |||
8264 | key = "qcom,ipc"; | ||
8265 | ret = of_property_read_u32_index(node, key, 1, &edge->ipc_offset); | ||
8266 | if (ret < 0) { | ||
8267 | dev_err(dev, "no offset in %s\n", key); | ||
8268 | - return -EINVAL; | ||
8269 | + goto put_node; | ||
8270 | } | ||
8271 | |||
8272 | ret = of_property_read_u32_index(node, key, 2, &edge->ipc_bit); | ||
8273 | if (ret < 0) { | ||
8274 | dev_err(dev, "no bit in %s\n", key); | ||
8275 | - return -EINVAL; | ||
8276 | + goto put_node; | ||
8277 | } | ||
8278 | } | ||
8279 | |||
8280 | @@ -1385,7 +1390,8 @@ static int qcom_smd_parse_edge(struct device *dev, | ||
8281 | irq = irq_of_parse_and_map(node, 0); | ||
8282 | if (irq < 0) { | ||
8283 | dev_err(dev, "required smd interrupt missing\n"); | ||
8284 | - return -EINVAL; | ||
8285 | + ret = irq; | ||
8286 | + goto put_node; | ||
8287 | } | ||
8288 | |||
8289 | ret = devm_request_irq(dev, irq, | ||
8290 | @@ -1393,12 +1399,18 @@ static int qcom_smd_parse_edge(struct device *dev, | ||
8291 | node->name, edge); | ||
8292 | if (ret) { | ||
8293 | dev_err(dev, "failed to request smd irq\n"); | ||
8294 | - return ret; | ||
8295 | + goto put_node; | ||
8296 | } | ||
8297 | |||
8298 | edge->irq = irq; | ||
8299 | |||
8300 | return 0; | ||
8301 | + | ||
8302 | +put_node: | ||
8303 | + of_node_put(node); | ||
8304 | + edge->of_node = NULL; | ||
8305 | + | ||
8306 | + return ret; | ||
8307 | } | ||
8308 | |||
8309 | /* | ||
8310 | diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c | ||
8311 | index 4ce28aa490cdb..8c4613617ef11 100644 | ||
8312 | --- a/drivers/s390/net/qeth_l2_main.c | ||
8313 | +++ b/drivers/s390/net/qeth_l2_main.c | ||
8314 | @@ -1168,12 +1168,6 @@ static void qeth_bridge_state_change_worker(struct work_struct *work) | ||
8315 | NULL | ||
8316 | }; | ||
8317 | |||
8318 | - /* Role should not change by itself, but if it did, */ | ||
8319 | - /* information from the hardware is authoritative. */ | ||
8320 | - mutex_lock(&data->card->sbp_lock); | ||
8321 | - data->card->options.sbp.role = entry->role; | ||
8322 | - mutex_unlock(&data->card->sbp_lock); | ||
8323 | - | ||
8324 | snprintf(env_locrem, sizeof(env_locrem), "BRIDGEPORT=statechange"); | ||
8325 | snprintf(env_role, sizeof(env_role), "ROLE=%s", | ||
8326 | (entry->role == QETH_SBP_ROLE_NONE) ? "none" : | ||
8327 | diff --git a/drivers/scsi/be2iscsi/be_main.c b/drivers/scsi/be2iscsi/be_main.c | ||
8328 | index 0760d0bd8a10b..0fa455357594e 100644 | ||
8329 | --- a/drivers/scsi/be2iscsi/be_main.c | ||
8330 | +++ b/drivers/scsi/be2iscsi/be_main.c | ||
8331 | @@ -3020,6 +3020,7 @@ static int beiscsi_create_eqs(struct beiscsi_hba *phba, | ||
8332 | goto create_eq_error; | ||
8333 | } | ||
8334 | |||
8335 | + mem->dma = paddr; | ||
8336 | mem->va = eq_vaddress; | ||
8337 | ret = be_fill_queue(eq, phba->params.num_eq_entries, | ||
8338 | sizeof(struct be_eq_entry), eq_vaddress); | ||
8339 | @@ -3029,7 +3030,6 @@ static int beiscsi_create_eqs(struct beiscsi_hba *phba, | ||
8340 | goto create_eq_error; | ||
8341 | } | ||
8342 | |||
8343 | - mem->dma = paddr; | ||
8344 | ret = beiscsi_cmd_eq_create(&phba->ctrl, eq, | ||
8345 | BEISCSI_EQ_DELAY_DEF); | ||
8346 | if (ret) { | ||
8347 | @@ -3086,6 +3086,7 @@ static int beiscsi_create_cqs(struct beiscsi_hba *phba, | ||
8348 | goto create_cq_error; | ||
8349 | } | ||
8350 | |||
8351 | + mem->dma = paddr; | ||
8352 | ret = be_fill_queue(cq, phba->params.num_cq_entries, | ||
8353 | sizeof(struct sol_cqe), cq_vaddress); | ||
8354 | if (ret) { | ||
8355 | @@ -3095,7 +3096,6 @@ static int beiscsi_create_cqs(struct beiscsi_hba *phba, | ||
8356 | goto create_cq_error; | ||
8357 | } | ||
8358 | |||
8359 | - mem->dma = paddr; | ||
8360 | ret = beiscsi_cmd_cq_create(&phba->ctrl, cq, eq, false, | ||
8361 | false, 0); | ||
8362 | if (ret) { | ||
8363 | diff --git a/drivers/scsi/bfa/bfad.c b/drivers/scsi/bfa/bfad.c | ||
8364 | index 2f9213b257a4a..93e4011809919 100644 | ||
8365 | --- a/drivers/scsi/bfa/bfad.c | ||
8366 | +++ b/drivers/scsi/bfa/bfad.c | ||
8367 | @@ -749,6 +749,7 @@ bfad_pci_init(struct pci_dev *pdev, struct bfad_s *bfad) | ||
8368 | |||
8369 | if (bfad->pci_bar0_kva == NULL) { | ||
8370 | printk(KERN_ERR "Fail to map bar0\n"); | ||
8371 | + rc = -ENODEV; | ||
8372 | goto out_release_region; | ||
8373 | } | ||
8374 | |||
8375 | diff --git a/drivers/scsi/csiostor/csio_hw.c b/drivers/scsi/csiostor/csio_hw.c | ||
8376 | index e519238864758..1b6f9351b43f9 100644 | ||
8377 | --- a/drivers/scsi/csiostor/csio_hw.c | ||
8378 | +++ b/drivers/scsi/csiostor/csio_hw.c | ||
8379 | @@ -2384,7 +2384,7 @@ static int csio_hw_prep_fw(struct csio_hw *hw, struct fw_info *fw_info, | ||
8380 | FW_HDR_FW_VER_MICRO_G(c), FW_HDR_FW_VER_BUILD_G(c), | ||
8381 | FW_HDR_FW_VER_MAJOR_G(k), FW_HDR_FW_VER_MINOR_G(k), | ||
8382 | FW_HDR_FW_VER_MICRO_G(k), FW_HDR_FW_VER_BUILD_G(k)); | ||
8383 | - ret = EINVAL; | ||
8384 | + ret = -EINVAL; | ||
8385 | goto bye; | ||
8386 | } | ||
8387 | |||
8388 | diff --git a/drivers/scsi/ibmvscsi/ibmvfc.c b/drivers/scsi/ibmvscsi/ibmvfc.c | ||
8389 | index df897df5cafee..8a76284b59b08 100644 | ||
8390 | --- a/drivers/scsi/ibmvscsi/ibmvfc.c | ||
8391 | +++ b/drivers/scsi/ibmvscsi/ibmvfc.c | ||
8392 | @@ -4788,6 +4788,7 @@ static int ibmvfc_probe(struct vio_dev *vdev, const struct vio_device_id *id) | ||
8393 | if (IS_ERR(vhost->work_thread)) { | ||
8394 | dev_err(dev, "Couldn't create kernel thread: %ld\n", | ||
8395 | PTR_ERR(vhost->work_thread)); | ||
8396 | + rc = PTR_ERR(vhost->work_thread); | ||
8397 | goto free_host_mem; | ||
8398 | } | ||
8399 | |||
8400 | diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c b/drivers/scsi/mpt3sas/mpt3sas_base.c | ||
8401 | index b7e44634d0dc2..3d58d24de6b61 100644 | ||
8402 | --- a/drivers/scsi/mpt3sas/mpt3sas_base.c | ||
8403 | +++ b/drivers/scsi/mpt3sas/mpt3sas_base.c | ||
8404 | @@ -1708,18 +1708,22 @@ mpt3sas_base_sync_reply_irqs(struct MPT3SAS_ADAPTER *ioc) | ||
8405 | /* TMs are on msix_index == 0 */ | ||
8406 | if (reply_q->msix_index == 0) | ||
8407 | continue; | ||
8408 | + synchronize_irq(pci_irq_vector(ioc->pdev, reply_q->msix_index)); | ||
8409 | if (reply_q->irq_poll_scheduled) { | ||
8410 | /* Calling irq_poll_disable will wait for any pending | ||
8411 | * callbacks to have completed. | ||
8412 | */ | ||
8413 | irq_poll_disable(&reply_q->irqpoll); | ||
8414 | irq_poll_enable(&reply_q->irqpoll); | ||
8415 | - reply_q->irq_poll_scheduled = false; | ||
8416 | - reply_q->irq_line_enable = true; | ||
8417 | - enable_irq(reply_q->os_irq); | ||
8418 | - continue; | ||
8419 | + /* check how the scheduled poll has ended, | ||
8420 | + * clean up only if necessary | ||
8421 | + */ | ||
8422 | + if (reply_q->irq_poll_scheduled) { | ||
8423 | + reply_q->irq_poll_scheduled = false; | ||
8424 | + reply_q->irq_line_enable = true; | ||
8425 | + enable_irq(reply_q->os_irq); | ||
8426 | + } | ||
8427 | } | ||
8428 | - synchronize_irq(pci_irq_vector(ioc->pdev, reply_q->msix_index)); | ||
8429 | } | ||
8430 | } | ||
8431 | |||
8432 | diff --git a/drivers/scsi/mvumi.c b/drivers/scsi/mvumi.c | ||
8433 | index 8906aceda4c43..0354898d7cac1 100644 | ||
8434 | --- a/drivers/scsi/mvumi.c | ||
8435 | +++ b/drivers/scsi/mvumi.c | ||
8436 | @@ -2425,6 +2425,7 @@ static int mvumi_io_attach(struct mvumi_hba *mhba) | ||
8437 | if (IS_ERR(mhba->dm_thread)) { | ||
8438 | dev_err(&mhba->pdev->dev, | ||
8439 | "failed to create device scan thread\n"); | ||
8440 | + ret = PTR_ERR(mhba->dm_thread); | ||
8441 | mutex_unlock(&mhba->sas_discovery_mutex); | ||
8442 | goto fail_create_thread; | ||
8443 | } | ||
8444 | diff --git a/drivers/scsi/qedf/qedf_main.c b/drivers/scsi/qedf/qedf_main.c | ||
8445 | index 3d0e345947c1f..9c0955c334e3e 100644 | ||
8446 | --- a/drivers/scsi/qedf/qedf_main.c | ||
8447 | +++ b/drivers/scsi/qedf/qedf_main.c | ||
8448 | @@ -668,7 +668,7 @@ static int qedf_eh_abort(struct scsi_cmnd *sc_cmd) | ||
8449 | rdata = fcport->rdata; | ||
8450 | if (!rdata || !kref_get_unless_zero(&rdata->kref)) { | ||
8451 | QEDF_ERR(&qedf->dbg_ctx, "stale rport, sc_cmd=%p\n", sc_cmd); | ||
8452 | - rc = 1; | ||
8453 | + rc = SUCCESS; | ||
8454 | goto out; | ||
8455 | } | ||
8456 | |||
8457 | diff --git a/drivers/scsi/qedi/qedi_fw.c b/drivers/scsi/qedi/qedi_fw.c | ||
8458 | index 946cebc4c9322..90aa64604ad78 100644 | ||
8459 | --- a/drivers/scsi/qedi/qedi_fw.c | ||
8460 | +++ b/drivers/scsi/qedi/qedi_fw.c | ||
8461 | @@ -59,6 +59,7 @@ static void qedi_process_logout_resp(struct qedi_ctx *qedi, | ||
8462 | "Freeing tid=0x%x for cid=0x%x\n", | ||
8463 | cmd->task_id, qedi_conn->iscsi_conn_id); | ||
8464 | |||
8465 | + spin_lock(&qedi_conn->list_lock); | ||
8466 | if (likely(cmd->io_cmd_in_list)) { | ||
8467 | cmd->io_cmd_in_list = false; | ||
8468 | list_del_init(&cmd->io_cmd); | ||
8469 | @@ -69,6 +70,7 @@ static void qedi_process_logout_resp(struct qedi_ctx *qedi, | ||
8470 | cmd->task_id, qedi_conn->iscsi_conn_id, | ||
8471 | &cmd->io_cmd); | ||
8472 | } | ||
8473 | + spin_unlock(&qedi_conn->list_lock); | ||
8474 | |||
8475 | cmd->state = RESPONSE_RECEIVED; | ||
8476 | qedi_clear_task_idx(qedi, cmd->task_id); | ||
8477 | @@ -122,6 +124,7 @@ static void qedi_process_text_resp(struct qedi_ctx *qedi, | ||
8478 | "Freeing tid=0x%x for cid=0x%x\n", | ||
8479 | cmd->task_id, qedi_conn->iscsi_conn_id); | ||
8480 | |||
8481 | + spin_lock(&qedi_conn->list_lock); | ||
8482 | if (likely(cmd->io_cmd_in_list)) { | ||
8483 | cmd->io_cmd_in_list = false; | ||
8484 | list_del_init(&cmd->io_cmd); | ||
8485 | @@ -132,6 +135,7 @@ static void qedi_process_text_resp(struct qedi_ctx *qedi, | ||
8486 | cmd->task_id, qedi_conn->iscsi_conn_id, | ||
8487 | &cmd->io_cmd); | ||
8488 | } | ||
8489 | + spin_unlock(&qedi_conn->list_lock); | ||
8490 | |||
8491 | cmd->state = RESPONSE_RECEIVED; | ||
8492 | qedi_clear_task_idx(qedi, cmd->task_id); | ||
8493 | @@ -222,11 +226,13 @@ static void qedi_process_tmf_resp(struct qedi_ctx *qedi, | ||
8494 | |||
8495 | tmf_hdr = (struct iscsi_tm *)qedi_cmd->task->hdr; | ||
8496 | |||
8497 | + spin_lock(&qedi_conn->list_lock); | ||
8498 | if (likely(qedi_cmd->io_cmd_in_list)) { | ||
8499 | qedi_cmd->io_cmd_in_list = false; | ||
8500 | list_del_init(&qedi_cmd->io_cmd); | ||
8501 | qedi_conn->active_cmd_count--; | ||
8502 | } | ||
8503 | + spin_unlock(&qedi_conn->list_lock); | ||
8504 | |||
8505 | if (((tmf_hdr->flags & ISCSI_FLAG_TM_FUNC_MASK) == | ||
8506 | ISCSI_TM_FUNC_LOGICAL_UNIT_RESET) || | ||
8507 | @@ -288,11 +294,13 @@ static void qedi_process_login_resp(struct qedi_ctx *qedi, | ||
8508 | ISCSI_LOGIN_RESPONSE_HDR_DATA_SEG_LEN_MASK; | ||
8509 | qedi_conn->gen_pdu.resp_wr_ptr = qedi_conn->gen_pdu.resp_buf + pld_len; | ||
8510 | |||
8511 | + spin_lock(&qedi_conn->list_lock); | ||
8512 | if (likely(cmd->io_cmd_in_list)) { | ||
8513 | cmd->io_cmd_in_list = false; | ||
8514 | list_del_init(&cmd->io_cmd); | ||
8515 | qedi_conn->active_cmd_count--; | ||
8516 | } | ||
8517 | + spin_unlock(&qedi_conn->list_lock); | ||
8518 | |||
8519 | memset(task_ctx, '\0', sizeof(*task_ctx)); | ||
8520 | |||
8521 | @@ -817,8 +825,11 @@ static void qedi_process_cmd_cleanup_resp(struct qedi_ctx *qedi, | ||
8522 | qedi_clear_task_idx(qedi_conn->qedi, rtid); | ||
8523 | |||
8524 | spin_lock(&qedi_conn->list_lock); | ||
8525 | - list_del_init(&dbg_cmd->io_cmd); | ||
8526 | - qedi_conn->active_cmd_count--; | ||
8527 | + if (likely(dbg_cmd->io_cmd_in_list)) { | ||
8528 | + dbg_cmd->io_cmd_in_list = false; | ||
8529 | + list_del_init(&dbg_cmd->io_cmd); | ||
8530 | + qedi_conn->active_cmd_count--; | ||
8531 | + } | ||
8532 | spin_unlock(&qedi_conn->list_lock); | ||
8533 | qedi_cmd->state = CLEANUP_RECV; | ||
8534 | wake_up_interruptible(&qedi_conn->wait_queue); | ||
8535 | @@ -1236,6 +1247,7 @@ int qedi_cleanup_all_io(struct qedi_ctx *qedi, struct qedi_conn *qedi_conn, | ||
8536 | qedi_conn->cmd_cleanup_req++; | ||
8537 | qedi_iscsi_cleanup_task(ctask, true); | ||
8538 | |||
8539 | + cmd->io_cmd_in_list = false; | ||
8540 | list_del_init(&cmd->io_cmd); | ||
8541 | qedi_conn->active_cmd_count--; | ||
8542 | QEDI_WARN(&qedi->dbg_ctx, | ||
8543 | @@ -1447,8 +1459,11 @@ ldel_exit: | ||
8544 | spin_unlock_bh(&qedi_conn->tmf_work_lock); | ||
8545 | |||
8546 | spin_lock(&qedi_conn->list_lock); | ||
8547 | - list_del_init(&cmd->io_cmd); | ||
8548 | - qedi_conn->active_cmd_count--; | ||
8549 | + if (likely(cmd->io_cmd_in_list)) { | ||
8550 | + cmd->io_cmd_in_list = false; | ||
8551 | + list_del_init(&cmd->io_cmd); | ||
8552 | + qedi_conn->active_cmd_count--; | ||
8553 | + } | ||
8554 | spin_unlock(&qedi_conn->list_lock); | ||
8555 | |||
8556 | clear_bit(QEDI_CONN_FW_CLEANUP, &qedi_conn->flags); | ||
8557 | diff --git a/drivers/scsi/qedi/qedi_iscsi.c b/drivers/scsi/qedi/qedi_iscsi.c | ||
8558 | index 0f2622a48311c..755f66b1ff9c7 100644 | ||
8559 | --- a/drivers/scsi/qedi/qedi_iscsi.c | ||
8560 | +++ b/drivers/scsi/qedi/qedi_iscsi.c | ||
8561 | @@ -972,11 +972,13 @@ static void qedi_cleanup_active_cmd_list(struct qedi_conn *qedi_conn) | ||
8562 | { | ||
8563 | struct qedi_cmd *cmd, *cmd_tmp; | ||
8564 | |||
8565 | + spin_lock(&qedi_conn->list_lock); | ||
8566 | list_for_each_entry_safe(cmd, cmd_tmp, &qedi_conn->active_cmd_list, | ||
8567 | io_cmd) { | ||
8568 | list_del_init(&cmd->io_cmd); | ||
8569 | qedi_conn->active_cmd_count--; | ||
8570 | } | ||
8571 | + spin_unlock(&qedi_conn->list_lock); | ||
8572 | } | ||
8573 | |||
8574 | static void qedi_ep_disconnect(struct iscsi_endpoint *ep) | ||
8575 | diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c | ||
8576 | index 62d2ee825c97a..b300e11095828 100644 | ||
8577 | --- a/drivers/scsi/qla2xxx/qla_init.c | ||
8578 | +++ b/drivers/scsi/qla2xxx/qla_init.c | ||
8579 | @@ -71,6 +71,16 @@ void qla2x00_sp_free(srb_t *sp) | ||
8580 | qla2x00_rel_sp(sp); | ||
8581 | } | ||
8582 | |||
8583 | +void qla2xxx_rel_done_warning(srb_t *sp, int res) | ||
8584 | +{ | ||
8585 | + WARN_ONCE(1, "Calling done() of an already freed srb %p object\n", sp); | ||
8586 | +} | ||
8587 | + | ||
8588 | +void qla2xxx_rel_free_warning(srb_t *sp) | ||
8589 | +{ | ||
8590 | + WARN_ONCE(1, "Calling free() of an already freed srb %p object\n", sp); | ||
8591 | +} | ||
8592 | + | ||
8593 | /* Asynchronous Login/Logout Routines -------------------------------------- */ | ||
8594 | |||
8595 | unsigned long | ||
8596 | diff --git a/drivers/scsi/qla2xxx/qla_inline.h b/drivers/scsi/qla2xxx/qla_inline.h | ||
8597 | index 0c3d907af7692..6dfde42d799b5 100644 | ||
8598 | --- a/drivers/scsi/qla2xxx/qla_inline.h | ||
8599 | +++ b/drivers/scsi/qla2xxx/qla_inline.h | ||
8600 | @@ -183,10 +183,15 @@ qla2xxx_get_qpair_sp(scsi_qla_host_t *vha, struct qla_qpair *qpair, | ||
8601 | return sp; | ||
8602 | } | ||
8603 | |||
8604 | +void qla2xxx_rel_done_warning(srb_t *sp, int res); | ||
8605 | +void qla2xxx_rel_free_warning(srb_t *sp); | ||
8606 | + | ||
8607 | static inline void | ||
8608 | qla2xxx_rel_qpair_sp(struct qla_qpair *qpair, srb_t *sp) | ||
8609 | { | ||
8610 | sp->qpair = NULL; | ||
8611 | + sp->done = qla2xxx_rel_done_warning; | ||
8612 | + sp->free = qla2xxx_rel_free_warning; | ||
8613 | mempool_free(sp, qpair->srb_mempool); | ||
8614 | QLA_QPAIR_MARK_NOT_BUSY(qpair); | ||
8615 | } | ||
8616 | diff --git a/drivers/scsi/qla2xxx/qla_nvme.c b/drivers/scsi/qla2xxx/qla_nvme.c | ||
8617 | index f4815a4084d8c..11656e864fca9 100644 | ||
8618 | --- a/drivers/scsi/qla2xxx/qla_nvme.c | ||
8619 | +++ b/drivers/scsi/qla2xxx/qla_nvme.c | ||
8620 | @@ -682,7 +682,7 @@ int qla_nvme_register_hba(struct scsi_qla_host *vha) | ||
8621 | struct nvme_fc_port_template *tmpl; | ||
8622 | struct qla_hw_data *ha; | ||
8623 | struct nvme_fc_port_info pinfo; | ||
8624 | - int ret = EINVAL; | ||
8625 | + int ret = -EINVAL; | ||
8626 | |||
8627 | if (!IS_ENABLED(CONFIG_NVME_FC)) | ||
8628 | return ret; | ||
8629 | diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c | ||
8630 | index a7acc266cec06..d84d95cac2a13 100644 | ||
8631 | --- a/drivers/scsi/qla2xxx/qla_target.c | ||
8632 | +++ b/drivers/scsi/qla2xxx/qla_target.c | ||
8633 | @@ -5677,7 +5677,7 @@ static int qlt_chk_unresolv_exchg(struct scsi_qla_host *vha, | ||
8634 | /* found existing exchange */ | ||
8635 | qpair->retry_term_cnt++; | ||
8636 | if (qpair->retry_term_cnt >= 5) { | ||
8637 | - rc = EIO; | ||
8638 | + rc = -EIO; | ||
8639 | qpair->retry_term_cnt = 0; | ||
8640 | ql_log(ql_log_warn, vha, 0xffff, | ||
8641 | "Unable to send ABTS Respond. Dumping firmware.\n"); | ||
8642 | diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c | ||
8643 | index 5504ab11decc7..df43cf6405a8e 100644 | ||
8644 | --- a/drivers/scsi/qla4xxx/ql4_os.c | ||
8645 | +++ b/drivers/scsi/qla4xxx/ql4_os.c | ||
8646 | @@ -1220,7 +1220,7 @@ static int qla4xxx_get_host_stats(struct Scsi_Host *shost, char *buf, int len) | ||
8647 | le64_to_cpu(ql_iscsi_stats->iscsi_sequence_error); | ||
8648 | exit_host_stats: | ||
8649 | if (ql_iscsi_stats) | ||
8650 | - dma_free_coherent(&ha->pdev->dev, host_stats_size, | ||
8651 | + dma_free_coherent(&ha->pdev->dev, stats_size, | ||
8652 | ql_iscsi_stats, iscsi_stats_dma); | ||
8653 | |||
8654 | ql4_printk(KERN_INFO, ha, "%s: Get host stats done\n", | ||
8655 | diff --git a/drivers/scsi/smartpqi/smartpqi.h b/drivers/scsi/smartpqi/smartpqi.h | ||
8656 | index 7a3a942b40df0..dd2175e9bfa17 100644 | ||
8657 | --- a/drivers/scsi/smartpqi/smartpqi.h | ||
8658 | +++ b/drivers/scsi/smartpqi/smartpqi.h | ||
8659 | @@ -357,7 +357,7 @@ struct pqi_event_response { | ||
8660 | struct pqi_iu_header header; | ||
8661 | u8 event_type; | ||
8662 | u8 reserved2 : 7; | ||
8663 | - u8 request_acknowlege : 1; | ||
8664 | + u8 request_acknowledge : 1; | ||
8665 | __le16 event_id; | ||
8666 | __le32 additional_event_id; | ||
8667 | union { | ||
8668 | diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c | ||
8669 | index 5ae074505386a..093ed5d1eef20 100644 | ||
8670 | --- a/drivers/scsi/smartpqi/smartpqi_init.c | ||
8671 | +++ b/drivers/scsi/smartpqi/smartpqi_init.c | ||
8672 | @@ -527,8 +527,7 @@ static int pqi_build_raid_path_request(struct pqi_ctrl_info *ctrl_info, | ||
8673 | put_unaligned_be16(cdb_length, &cdb[7]); | ||
8674 | break; | ||
8675 | default: | ||
8676 | - dev_err(&ctrl_info->pci_dev->dev, "unknown command 0x%c\n", | ||
8677 | - cmd); | ||
8678 | + dev_err(&ctrl_info->pci_dev->dev, "unknown command 0x%c\n", cmd); | ||
8679 | break; | ||
8680 | } | ||
8681 | |||
8682 | @@ -2450,7 +2449,6 @@ static int pqi_raid_bypass_submit_scsi_cmd(struct pqi_ctrl_info *ctrl_info, | ||
8683 | offload_to_mirror = | ||
8684 | (offload_to_mirror >= layout_map_count - 1) ? | ||
8685 | 0 : offload_to_mirror + 1; | ||
8686 | - WARN_ON(offload_to_mirror >= layout_map_count); | ||
8687 | device->offload_to_mirror = offload_to_mirror; | ||
8688 | /* | ||
8689 | * Avoid direct use of device->offload_to_mirror within this | ||
8690 | @@ -2903,10 +2901,14 @@ static int pqi_interpret_task_management_response( | ||
8691 | return rc; | ||
8692 | } | ||
8693 | |||
8694 | -static unsigned int pqi_process_io_intr(struct pqi_ctrl_info *ctrl_info, | ||
8695 | - struct pqi_queue_group *queue_group) | ||
8696 | +static inline void pqi_invalid_response(struct pqi_ctrl_info *ctrl_info) | ||
8697 | +{ | ||
8698 | + pqi_take_ctrl_offline(ctrl_info); | ||
8699 | +} | ||
8700 | + | ||
8701 | +static int pqi_process_io_intr(struct pqi_ctrl_info *ctrl_info, struct pqi_queue_group *queue_group) | ||
8702 | { | ||
8703 | - unsigned int num_responses; | ||
8704 | + int num_responses; | ||
8705 | pqi_index_t oq_pi; | ||
8706 | pqi_index_t oq_ci; | ||
8707 | struct pqi_io_request *io_request; | ||
8708 | @@ -2918,6 +2920,13 @@ static unsigned int pqi_process_io_intr(struct pqi_ctrl_info *ctrl_info, | ||
8709 | |||
8710 | while (1) { | ||
8711 | oq_pi = readl(queue_group->oq_pi); | ||
8712 | + if (oq_pi >= ctrl_info->num_elements_per_oq) { | ||
8713 | + pqi_invalid_response(ctrl_info); | ||
8714 | + dev_err(&ctrl_info->pci_dev->dev, | ||
8715 | + "I/O interrupt: producer index (%u) out of range (0-%u): consumer index: %u\n", | ||
8716 | + oq_pi, ctrl_info->num_elements_per_oq - 1, oq_ci); | ||
8717 | + return -1; | ||
8718 | + } | ||
8719 | if (oq_pi == oq_ci) | ||
8720 | break; | ||
8721 | |||
8722 | @@ -2926,10 +2935,22 @@ static unsigned int pqi_process_io_intr(struct pqi_ctrl_info *ctrl_info, | ||
8723 | (oq_ci * PQI_OPERATIONAL_OQ_ELEMENT_LENGTH); | ||
8724 | |||
8725 | request_id = get_unaligned_le16(&response->request_id); | ||
8726 | - WARN_ON(request_id >= ctrl_info->max_io_slots); | ||
8727 | + if (request_id >= ctrl_info->max_io_slots) { | ||
8728 | + pqi_invalid_response(ctrl_info); | ||
8729 | + dev_err(&ctrl_info->pci_dev->dev, | ||
8730 | + "request ID in response (%u) out of range (0-%u): producer index: %u consumer index: %u\n", | ||
8731 | + request_id, ctrl_info->max_io_slots - 1, oq_pi, oq_ci); | ||
8732 | + return -1; | ||
8733 | + } | ||
8734 | |||
8735 | io_request = &ctrl_info->io_request_pool[request_id]; | ||
8736 | - WARN_ON(atomic_read(&io_request->refcount) == 0); | ||
8737 | + if (atomic_read(&io_request->refcount) == 0) { | ||
8738 | + pqi_invalid_response(ctrl_info); | ||
8739 | + dev_err(&ctrl_info->pci_dev->dev, | ||
8740 | + "request ID in response (%u) does not match an outstanding I/O request: producer index: %u consumer index: %u\n", | ||
8741 | + request_id, oq_pi, oq_ci); | ||
8742 | + return -1; | ||
8743 | + } | ||
8744 | |||
8745 | switch (response->header.iu_type) { | ||
8746 | case PQI_RESPONSE_IU_RAID_PATH_IO_SUCCESS: | ||
8747 | @@ -2959,24 +2980,22 @@ static unsigned int pqi_process_io_intr(struct pqi_ctrl_info *ctrl_info, | ||
8748 | io_request->error_info = ctrl_info->error_buffer + | ||
8749 | (get_unaligned_le16(&response->error_index) * | ||
8750 | PQI_ERROR_BUFFER_ELEMENT_LENGTH); | ||
8751 | - pqi_process_io_error(response->header.iu_type, | ||
8752 | - io_request); | ||
8753 | + pqi_process_io_error(response->header.iu_type, io_request); | ||
8754 | break; | ||
8755 | default: | ||
8756 | + pqi_invalid_response(ctrl_info); | ||
8757 | dev_err(&ctrl_info->pci_dev->dev, | ||
8758 | - "unexpected IU type: 0x%x\n", | ||
8759 | - response->header.iu_type); | ||
8760 | - break; | ||
8761 | + "unexpected IU type: 0x%x: producer index: %u consumer index: %u\n", | ||
8762 | + response->header.iu_type, oq_pi, oq_ci); | ||
8763 | + return -1; | ||
8764 | } | ||
8765 | |||
8766 | - io_request->io_complete_callback(io_request, | ||
8767 | - io_request->context); | ||
8768 | + io_request->io_complete_callback(io_request, io_request->context); | ||
8769 | |||
8770 | /* | ||
8771 | * Note that the I/O request structure CANNOT BE TOUCHED after | ||
8772 | * returning from the I/O completion callback! | ||
8773 | */ | ||
8774 | - | ||
8775 | oq_ci = (oq_ci + 1) % ctrl_info->num_elements_per_oq; | ||
8776 | } | ||
8777 | |||
8778 | @@ -3289,9 +3308,9 @@ static void pqi_ofa_capture_event_payload(struct pqi_event *event, | ||
8779 | } | ||
8780 | } | ||
8781 | |||
8782 | -static unsigned int pqi_process_event_intr(struct pqi_ctrl_info *ctrl_info) | ||
8783 | +static int pqi_process_event_intr(struct pqi_ctrl_info *ctrl_info) | ||
8784 | { | ||
8785 | - unsigned int num_events; | ||
8786 | + int num_events; | ||
8787 | pqi_index_t oq_pi; | ||
8788 | pqi_index_t oq_ci; | ||
8789 | struct pqi_event_queue *event_queue; | ||
8790 | @@ -3305,26 +3324,31 @@ static unsigned int pqi_process_event_intr(struct pqi_ctrl_info *ctrl_info) | ||
8791 | |||
8792 | while (1) { | ||
8793 | oq_pi = readl(event_queue->oq_pi); | ||
8794 | + if (oq_pi >= PQI_NUM_EVENT_QUEUE_ELEMENTS) { | ||
8795 | + pqi_invalid_response(ctrl_info); | ||
8796 | + dev_err(&ctrl_info->pci_dev->dev, | ||
8797 | + "event interrupt: producer index (%u) out of range (0-%u): consumer index: %u\n", | ||
8798 | + oq_pi, PQI_NUM_EVENT_QUEUE_ELEMENTS - 1, oq_ci); | ||
8799 | + return -1; | ||
8800 | + } | ||
8801 | + | ||
8802 | if (oq_pi == oq_ci) | ||
8803 | break; | ||
8804 | |||
8805 | num_events++; | ||
8806 | - response = event_queue->oq_element_array + | ||
8807 | - (oq_ci * PQI_EVENT_OQ_ELEMENT_LENGTH); | ||
8808 | + response = event_queue->oq_element_array + (oq_ci * PQI_EVENT_OQ_ELEMENT_LENGTH); | ||
8809 | |||
8810 | event_index = | ||
8811 | pqi_event_type_to_event_index(response->event_type); | ||
8812 | |||
8813 | - if (event_index >= 0) { | ||
8814 | - if (response->request_acknowlege) { | ||
8815 | - event = &ctrl_info->events[event_index]; | ||
8816 | - event->pending = true; | ||
8817 | - event->event_type = response->event_type; | ||
8818 | - event->event_id = response->event_id; | ||
8819 | - event->additional_event_id = | ||
8820 | - response->additional_event_id; | ||
8821 | + if (event_index >= 0 && response->request_acknowledge) { | ||
8822 | + event = &ctrl_info->events[event_index]; | ||
8823 | + event->pending = true; | ||
8824 | + event->event_type = response->event_type; | ||
8825 | + event->event_id = response->event_id; | ||
8826 | + event->additional_event_id = response->additional_event_id; | ||
8827 | + if (event->event_type == PQI_EVENT_TYPE_OFA) | ||
8828 | pqi_ofa_capture_event_payload(event, response); | ||
8829 | - } | ||
8830 | } | ||
8831 | |||
8832 | oq_ci = (oq_ci + 1) % PQI_NUM_EVENT_QUEUE_ELEMENTS; | ||
8833 | @@ -3439,7 +3463,8 @@ static irqreturn_t pqi_irq_handler(int irq, void *data) | ||
8834 | { | ||
8835 | struct pqi_ctrl_info *ctrl_info; | ||
8836 | struct pqi_queue_group *queue_group; | ||
8837 | - unsigned int num_responses_handled; | ||
8838 | + int num_io_responses_handled; | ||
8839 | + int num_events_handled; | ||
8840 | |||
8841 | queue_group = data; | ||
8842 | ctrl_info = queue_group->ctrl_info; | ||
8843 | @@ -3447,17 +3472,25 @@ static irqreturn_t pqi_irq_handler(int irq, void *data) | ||
8844 | if (!pqi_is_valid_irq(ctrl_info)) | ||
8845 | return IRQ_NONE; | ||
8846 | |||
8847 | - num_responses_handled = pqi_process_io_intr(ctrl_info, queue_group); | ||
8848 | + num_io_responses_handled = pqi_process_io_intr(ctrl_info, queue_group); | ||
8849 | + if (num_io_responses_handled < 0) | ||
8850 | + goto out; | ||
8851 | |||
8852 | - if (irq == ctrl_info->event_irq) | ||
8853 | - num_responses_handled += pqi_process_event_intr(ctrl_info); | ||
8854 | + if (irq == ctrl_info->event_irq) { | ||
8855 | + num_events_handled = pqi_process_event_intr(ctrl_info); | ||
8856 | + if (num_events_handled < 0) | ||
8857 | + goto out; | ||
8858 | + } else { | ||
8859 | + num_events_handled = 0; | ||
8860 | + } | ||
8861 | |||
8862 | - if (num_responses_handled) | ||
8863 | + if (num_io_responses_handled + num_events_handled > 0) | ||
8864 | atomic_inc(&ctrl_info->num_interrupts); | ||
8865 | |||
8866 | pqi_start_io(ctrl_info, queue_group, RAID_PATH, NULL); | ||
8867 | pqi_start_io(ctrl_info, queue_group, AIO_PATH, NULL); | ||
8868 | |||
8869 | +out: | ||
8870 | return IRQ_HANDLED; | ||
8871 | } | ||
8872 | |||
8873 | diff --git a/drivers/scsi/ufs/ufs-qcom.c b/drivers/scsi/ufs/ufs-qcom.c | ||
8874 | index c49e9f6c46f87..4f066e3b19af1 100644 | ||
8875 | --- a/drivers/scsi/ufs/ufs-qcom.c | ||
8876 | +++ b/drivers/scsi/ufs/ufs-qcom.c | ||
8877 | @@ -1492,9 +1492,6 @@ int ufs_qcom_testbus_config(struct ufs_qcom_host *host) | ||
8878 | */ | ||
8879 | } | ||
8880 | mask <<= offset; | ||
8881 | - | ||
8882 | - pm_runtime_get_sync(host->hba->dev); | ||
8883 | - ufshcd_hold(host->hba, false); | ||
8884 | ufshcd_rmwl(host->hba, TEST_BUS_SEL, | ||
8885 | (u32)host->testbus.select_major << 19, | ||
8886 | REG_UFS_CFG1); | ||
8887 | @@ -1507,8 +1504,6 @@ int ufs_qcom_testbus_config(struct ufs_qcom_host *host) | ||
8888 | * committed before returning. | ||
8889 | */ | ||
8890 | mb(); | ||
8891 | - ufshcd_release(host->hba); | ||
8892 | - pm_runtime_put_sync(host->hba->dev); | ||
8893 | |||
8894 | return 0; | ||
8895 | } | ||
8896 | diff --git a/drivers/slimbus/core.c b/drivers/slimbus/core.c | ||
8897 | index 63ee96eb58c68..130c798921b5d 100644 | ||
8898 | --- a/drivers/slimbus/core.c | ||
8899 | +++ b/drivers/slimbus/core.c | ||
8900 | @@ -302,8 +302,6 @@ int slim_unregister_controller(struct slim_controller *ctrl) | ||
8901 | { | ||
8902 | /* Remove all clients */ | ||
8903 | device_for_each_child(ctrl->dev, NULL, slim_ctrl_remove_device); | ||
8904 | - /* Enter Clock Pause */ | ||
8905 | - slim_ctrl_clk_pause(ctrl, false, 0); | ||
8906 | ida_simple_remove(&ctrl_ida, ctrl->id); | ||
8907 | |||
8908 | return 0; | ||
8909 | @@ -327,8 +325,8 @@ void slim_report_absent(struct slim_device *sbdev) | ||
8910 | mutex_lock(&ctrl->lock); | ||
8911 | sbdev->is_laddr_valid = false; | ||
8912 | mutex_unlock(&ctrl->lock); | ||
8913 | - | ||
8914 | - ida_simple_remove(&ctrl->laddr_ida, sbdev->laddr); | ||
8915 | + if (!ctrl->get_laddr) | ||
8916 | + ida_simple_remove(&ctrl->laddr_ida, sbdev->laddr); | ||
8917 | slim_device_update_status(sbdev, SLIM_DEVICE_STATUS_DOWN); | ||
8918 | } | ||
8919 | EXPORT_SYMBOL_GPL(slim_report_absent); | ||
8920 | diff --git a/drivers/slimbus/qcom-ngd-ctrl.c b/drivers/slimbus/qcom-ngd-ctrl.c | ||
8921 | index 01a17d84b6064..ce265bf7de868 100644 | ||
8922 | --- a/drivers/slimbus/qcom-ngd-ctrl.c | ||
8923 | +++ b/drivers/slimbus/qcom-ngd-ctrl.c | ||
8924 | @@ -1273,9 +1273,13 @@ static void qcom_slim_ngd_qmi_del_server(struct qmi_handle *hdl, | ||
8925 | { | ||
8926 | struct qcom_slim_ngd_qmi *qmi = | ||
8927 | container_of(hdl, struct qcom_slim_ngd_qmi, svc_event_hdl); | ||
8928 | + struct qcom_slim_ngd_ctrl *ctrl = | ||
8929 | + container_of(qmi, struct qcom_slim_ngd_ctrl, qmi); | ||
8930 | |||
8931 | qmi->svc_info.sq_node = 0; | ||
8932 | qmi->svc_info.sq_port = 0; | ||
8933 | + | ||
8934 | + qcom_slim_ngd_enable(ctrl, false); | ||
8935 | } | ||
8936 | |||
8937 | static struct qmi_ops qcom_slim_ngd_qmi_svc_event_ops = { | ||
8938 | diff --git a/drivers/soc/fsl/qbman/bman.c b/drivers/soc/fsl/qbman/bman.c | ||
8939 | index f4fb527d83018..c5dd026fe889f 100644 | ||
8940 | --- a/drivers/soc/fsl/qbman/bman.c | ||
8941 | +++ b/drivers/soc/fsl/qbman/bman.c | ||
8942 | @@ -660,7 +660,7 @@ int bm_shutdown_pool(u32 bpid) | ||
8943 | } | ||
8944 | done: | ||
8945 | put_affine_portal(); | ||
8946 | - return 0; | ||
8947 | + return err; | ||
8948 | } | ||
8949 | |||
8950 | struct gen_pool *bm_bpalloc; | ||
8951 | diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c | ||
8952 | index 4433cb4de564e..7646b4b56bed9 100644 | ||
8953 | --- a/drivers/spi/spi-omap2-mcspi.c | ||
8954 | +++ b/drivers/spi/spi-omap2-mcspi.c | ||
8955 | @@ -24,7 +24,6 @@ | ||
8956 | #include <linux/of.h> | ||
8957 | #include <linux/of_device.h> | ||
8958 | #include <linux/gcd.h> | ||
8959 | -#include <linux/iopoll.h> | ||
8960 | |||
8961 | #include <linux/spi/spi.h> | ||
8962 | #include <linux/gpio.h> | ||
8963 | @@ -348,9 +347,19 @@ disable_fifo: | ||
8964 | |||
8965 | static int mcspi_wait_for_reg_bit(void __iomem *reg, unsigned long bit) | ||
8966 | { | ||
8967 | - u32 val; | ||
8968 | - | ||
8969 | - return readl_poll_timeout(reg, val, val & bit, 1, MSEC_PER_SEC); | ||
8970 | + unsigned long timeout; | ||
8971 | + | ||
8972 | + timeout = jiffies + msecs_to_jiffies(1000); | ||
8973 | + while (!(readl_relaxed(reg) & bit)) { | ||
8974 | + if (time_after(jiffies, timeout)) { | ||
8975 | + if (!(readl_relaxed(reg) & bit)) | ||
8976 | + return -ETIMEDOUT; | ||
8977 | + else | ||
8978 | + return 0; | ||
8979 | + } | ||
8980 | + cpu_relax(); | ||
8981 | + } | ||
8982 | + return 0; | ||
8983 | } | ||
8984 | |||
8985 | static int mcspi_wait_for_completion(struct omap2_mcspi *mcspi, | ||
8986 | diff --git a/drivers/spi/spi-s3c64xx.c b/drivers/spi/spi-s3c64xx.c | ||
8987 | index 7b7151ec14c8a..1d948fee1a039 100644 | ||
8988 | --- a/drivers/spi/spi-s3c64xx.c | ||
8989 | +++ b/drivers/spi/spi-s3c64xx.c | ||
8990 | @@ -122,6 +122,7 @@ | ||
8991 | |||
8992 | struct s3c64xx_spi_dma_data { | ||
8993 | struct dma_chan *ch; | ||
8994 | + dma_cookie_t cookie; | ||
8995 | enum dma_transfer_direction direction; | ||
8996 | }; | ||
8997 | |||
8998 | @@ -264,12 +265,13 @@ static void s3c64xx_spi_dmacb(void *data) | ||
8999 | spin_unlock_irqrestore(&sdd->lock, flags); | ||
9000 | } | ||
9001 | |||
9002 | -static void prepare_dma(struct s3c64xx_spi_dma_data *dma, | ||
9003 | +static int prepare_dma(struct s3c64xx_spi_dma_data *dma, | ||
9004 | struct sg_table *sgt) | ||
9005 | { | ||
9006 | struct s3c64xx_spi_driver_data *sdd; | ||
9007 | struct dma_slave_config config; | ||
9008 | struct dma_async_tx_descriptor *desc; | ||
9009 | + int ret; | ||
9010 | |||
9011 | memset(&config, 0, sizeof(config)); | ||
9012 | |||
9013 | @@ -293,12 +295,24 @@ static void prepare_dma(struct s3c64xx_spi_dma_data *dma, | ||
9014 | |||
9015 | desc = dmaengine_prep_slave_sg(dma->ch, sgt->sgl, sgt->nents, | ||
9016 | dma->direction, DMA_PREP_INTERRUPT); | ||
9017 | + if (!desc) { | ||
9018 | + dev_err(&sdd->pdev->dev, "unable to prepare %s scatterlist", | ||
9019 | + dma->direction == DMA_DEV_TO_MEM ? "rx" : "tx"); | ||
9020 | + return -ENOMEM; | ||
9021 | + } | ||
9022 | |||
9023 | desc->callback = s3c64xx_spi_dmacb; | ||
9024 | desc->callback_param = dma; | ||
9025 | |||
9026 | - dmaengine_submit(desc); | ||
9027 | + dma->cookie = dmaengine_submit(desc); | ||
9028 | + ret = dma_submit_error(dma->cookie); | ||
9029 | + if (ret) { | ||
9030 | + dev_err(&sdd->pdev->dev, "DMA submission failed"); | ||
9031 | + return -EIO; | ||
9032 | + } | ||
9033 | + | ||
9034 | dma_async_issue_pending(dma->ch); | ||
9035 | + return 0; | ||
9036 | } | ||
9037 | |||
9038 | static void s3c64xx_spi_set_cs(struct spi_device *spi, bool enable) | ||
9039 | @@ -348,11 +362,12 @@ static bool s3c64xx_spi_can_dma(struct spi_master *master, | ||
9040 | return xfer->len > (FIFO_LVL_MASK(sdd) >> 1) + 1; | ||
9041 | } | ||
9042 | |||
9043 | -static void s3c64xx_enable_datapath(struct s3c64xx_spi_driver_data *sdd, | ||
9044 | +static int s3c64xx_enable_datapath(struct s3c64xx_spi_driver_data *sdd, | ||
9045 | struct spi_transfer *xfer, int dma_mode) | ||
9046 | { | ||
9047 | void __iomem *regs = sdd->regs; | ||
9048 | u32 modecfg, chcfg; | ||
9049 | + int ret = 0; | ||
9050 | |||
9051 | modecfg = readl(regs + S3C64XX_SPI_MODE_CFG); | ||
9052 | modecfg &= ~(S3C64XX_SPI_MODE_TXDMA_ON | S3C64XX_SPI_MODE_RXDMA_ON); | ||
9053 | @@ -378,7 +393,7 @@ static void s3c64xx_enable_datapath(struct s3c64xx_spi_driver_data *sdd, | ||
9054 | chcfg |= S3C64XX_SPI_CH_TXCH_ON; | ||
9055 | if (dma_mode) { | ||
9056 | modecfg |= S3C64XX_SPI_MODE_TXDMA_ON; | ||
9057 | - prepare_dma(&sdd->tx_dma, &xfer->tx_sg); | ||
9058 | + ret = prepare_dma(&sdd->tx_dma, &xfer->tx_sg); | ||
9059 | } else { | ||
9060 | switch (sdd->cur_bpw) { | ||
9061 | case 32: | ||
9062 | @@ -410,12 +425,17 @@ static void s3c64xx_enable_datapath(struct s3c64xx_spi_driver_data *sdd, | ||
9063 | writel(((xfer->len * 8 / sdd->cur_bpw) & 0xffff) | ||
9064 | | S3C64XX_SPI_PACKET_CNT_EN, | ||
9065 | regs + S3C64XX_SPI_PACKET_CNT); | ||
9066 | - prepare_dma(&sdd->rx_dma, &xfer->rx_sg); | ||
9067 | + ret = prepare_dma(&sdd->rx_dma, &xfer->rx_sg); | ||
9068 | } | ||
9069 | } | ||
9070 | |||
9071 | + if (ret) | ||
9072 | + return ret; | ||
9073 | + | ||
9074 | writel(modecfg, regs + S3C64XX_SPI_MODE_CFG); | ||
9075 | writel(chcfg, regs + S3C64XX_SPI_CH_CFG); | ||
9076 | + | ||
9077 | + return 0; | ||
9078 | } | ||
9079 | |||
9080 | static u32 s3c64xx_spi_wait_for_timeout(struct s3c64xx_spi_driver_data *sdd, | ||
9081 | @@ -548,9 +568,10 @@ static int s3c64xx_wait_for_pio(struct s3c64xx_spi_driver_data *sdd, | ||
9082 | return 0; | ||
9083 | } | ||
9084 | |||
9085 | -static void s3c64xx_spi_config(struct s3c64xx_spi_driver_data *sdd) | ||
9086 | +static int s3c64xx_spi_config(struct s3c64xx_spi_driver_data *sdd) | ||
9087 | { | ||
9088 | void __iomem *regs = sdd->regs; | ||
9089 | + int ret; | ||
9090 | u32 val; | ||
9091 | |||
9092 | /* Disable Clock */ | ||
9093 | @@ -598,7 +619,9 @@ static void s3c64xx_spi_config(struct s3c64xx_spi_driver_data *sdd) | ||
9094 | |||
9095 | if (sdd->port_conf->clk_from_cmu) { | ||
9096 | /* The src_clk clock is divided internally by 2 */ | ||
9097 | - clk_set_rate(sdd->src_clk, sdd->cur_speed * 2); | ||
9098 | + ret = clk_set_rate(sdd->src_clk, sdd->cur_speed * 2); | ||
9099 | + if (ret) | ||
9100 | + return ret; | ||
9101 | } else { | ||
9102 | /* Configure Clock */ | ||
9103 | val = readl(regs + S3C64XX_SPI_CLK_CFG); | ||
9104 | @@ -612,6 +635,8 @@ static void s3c64xx_spi_config(struct s3c64xx_spi_driver_data *sdd) | ||
9105 | val |= S3C64XX_SPI_ENCLK_ENABLE; | ||
9106 | writel(val, regs + S3C64XX_SPI_CLK_CFG); | ||
9107 | } | ||
9108 | + | ||
9109 | + return 0; | ||
9110 | } | ||
9111 | |||
9112 | #define XFER_DMAADDR_INVALID DMA_BIT_MASK(32) | ||
9113 | @@ -654,7 +679,9 @@ static int s3c64xx_spi_transfer_one(struct spi_master *master, | ||
9114 | sdd->cur_bpw = bpw; | ||
9115 | sdd->cur_speed = speed; | ||
9116 | sdd->cur_mode = spi->mode; | ||
9117 | - s3c64xx_spi_config(sdd); | ||
9118 | + status = s3c64xx_spi_config(sdd); | ||
9119 | + if (status) | ||
9120 | + return status; | ||
9121 | } | ||
9122 | |||
9123 | if (!is_polling(sdd) && (xfer->len > fifo_len) && | ||
9124 | @@ -678,13 +705,18 @@ static int s3c64xx_spi_transfer_one(struct spi_master *master, | ||
9125 | sdd->state &= ~RXBUSY; | ||
9126 | sdd->state &= ~TXBUSY; | ||
9127 | |||
9128 | - s3c64xx_enable_datapath(sdd, xfer, use_dma); | ||
9129 | - | ||
9130 | /* Start the signals */ | ||
9131 | s3c64xx_spi_set_cs(spi, true); | ||
9132 | |||
9133 | + status = s3c64xx_enable_datapath(sdd, xfer, use_dma); | ||
9134 | + | ||
9135 | spin_unlock_irqrestore(&sdd->lock, flags); | ||
9136 | |||
9137 | + if (status) { | ||
9138 | + dev_err(&spi->dev, "failed to enable data path for transfer: %d\n", status); | ||
9139 | + break; | ||
9140 | + } | ||
9141 | + | ||
9142 | if (use_dma) | ||
9143 | status = s3c64xx_wait_for_dma(sdd, xfer); | ||
9144 | else | ||
9145 | diff --git a/drivers/staging/emxx_udc/emxx_udc.c b/drivers/staging/emxx_udc/emxx_udc.c | ||
9146 | index 147481bf680c3..a6c893ddbf280 100644 | ||
9147 | --- a/drivers/staging/emxx_udc/emxx_udc.c | ||
9148 | +++ b/drivers/staging/emxx_udc/emxx_udc.c | ||
9149 | @@ -2594,7 +2594,7 @@ static int nbu2ss_ep_queue(struct usb_ep *_ep, | ||
9150 | |||
9151 | if (req->unaligned) { | ||
9152 | if (!ep->virt_buf) | ||
9153 | - ep->virt_buf = dma_alloc_coherent(NULL, PAGE_SIZE, | ||
9154 | + ep->virt_buf = dma_alloc_coherent(udc->dev, PAGE_SIZE, | ||
9155 | &ep->phys_buf, | ||
9156 | GFP_ATOMIC | GFP_DMA); | ||
9157 | if (ep->epnum > 0) { | ||
9158 | @@ -3153,7 +3153,7 @@ static int nbu2ss_drv_remove(struct platform_device *pdev) | ||
9159 | for (i = 0; i < NUM_ENDPOINTS; i++) { | ||
9160 | ep = &udc->ep[i]; | ||
9161 | if (ep->virt_buf) | ||
9162 | - dma_free_coherent(NULL, PAGE_SIZE, (void *)ep->virt_buf, | ||
9163 | + dma_free_coherent(udc->dev, PAGE_SIZE, (void *)ep->virt_buf, | ||
9164 | ep->phys_buf); | ||
9165 | } | ||
9166 | |||
9167 | diff --git a/drivers/staging/media/ipu3/ipu3-css-params.c b/drivers/staging/media/ipu3/ipu3-css-params.c | ||
9168 | index 4533dacad4beb..ef3b5d07137a1 100644 | ||
9169 | --- a/drivers/staging/media/ipu3/ipu3-css-params.c | ||
9170 | +++ b/drivers/staging/media/ipu3/ipu3-css-params.c | ||
9171 | @@ -161,7 +161,7 @@ imgu_css_scaler_calc(u32 input_width, u32 input_height, u32 target_width, | ||
9172 | |||
9173 | memset(&cfg->scaler_coeffs_chroma, 0, | ||
9174 | sizeof(cfg->scaler_coeffs_chroma)); | ||
9175 | - memset(&cfg->scaler_coeffs_luma, 0, sizeof(*cfg->scaler_coeffs_luma)); | ||
9176 | + memset(&cfg->scaler_coeffs_luma, 0, sizeof(cfg->scaler_coeffs_luma)); | ||
9177 | do { | ||
9178 | phase_step_correction++; | ||
9179 | |||
9180 | diff --git a/drivers/staging/rtl8192u/ieee80211/ieee80211_rx.c b/drivers/staging/rtl8192u/ieee80211/ieee80211_rx.c | ||
9181 | index 5c33bcb0db2ee..00e34c392a388 100644 | ||
9182 | --- a/drivers/staging/rtl8192u/ieee80211/ieee80211_rx.c | ||
9183 | +++ b/drivers/staging/rtl8192u/ieee80211/ieee80211_rx.c | ||
9184 | @@ -585,7 +585,7 @@ static void RxReorderIndicatePacket(struct ieee80211_device *ieee, | ||
9185 | |||
9186 | prxbIndicateArray = kmalloc_array(REORDER_WIN_SIZE, | ||
9187 | sizeof(struct ieee80211_rxb *), | ||
9188 | - GFP_KERNEL); | ||
9189 | + GFP_ATOMIC); | ||
9190 | if (!prxbIndicateArray) | ||
9191 | return; | ||
9192 | |||
9193 | diff --git a/drivers/staging/wilc1000/wilc_mon.c b/drivers/staging/wilc1000/wilc_mon.c | ||
9194 | index d6f14f69ad64e..017e8e91334f1 100644 | ||
9195 | --- a/drivers/staging/wilc1000/wilc_mon.c | ||
9196 | +++ b/drivers/staging/wilc1000/wilc_mon.c | ||
9197 | @@ -236,11 +236,10 @@ struct net_device *wilc_wfi_init_mon_interface(struct wilc *wl, | ||
9198 | |||
9199 | if (register_netdevice(wl->monitor_dev)) { | ||
9200 | netdev_err(real_dev, "register_netdevice failed\n"); | ||
9201 | + free_netdev(wl->monitor_dev); | ||
9202 | return NULL; | ||
9203 | } | ||
9204 | priv = netdev_priv(wl->monitor_dev); | ||
9205 | - if (!priv) | ||
9206 | - return NULL; | ||
9207 | |||
9208 | priv->real_ndev = real_dev; | ||
9209 | |||
9210 | diff --git a/drivers/target/target_core_user.c b/drivers/target/target_core_user.c | ||
9211 | index ea925b102b322..d6634baebb474 100644 | ||
9212 | --- a/drivers/target/target_core_user.c | ||
9213 | +++ b/drivers/target/target_core_user.c | ||
9214 | @@ -669,7 +669,7 @@ static void scatter_data_area(struct tcmu_dev *udev, | ||
9215 | void *from, *to = NULL; | ||
9216 | size_t copy_bytes, to_offset, offset; | ||
9217 | struct scatterlist *sg; | ||
9218 | - struct page *page; | ||
9219 | + struct page *page = NULL; | ||
9220 | |||
9221 | for_each_sg(data_sg, sg, data_nents, i) { | ||
9222 | int sg_remaining = sg->length; | ||
9223 | diff --git a/drivers/tty/hvc/hvcs.c b/drivers/tty/hvc/hvcs.c | ||
9224 | index ee0604cd9c6b2..0c498b20d8cb5 100644 | ||
9225 | --- a/drivers/tty/hvc/hvcs.c | ||
9226 | +++ b/drivers/tty/hvc/hvcs.c | ||
9227 | @@ -1218,13 +1218,6 @@ static void hvcs_close(struct tty_struct *tty, struct file *filp) | ||
9228 | |||
9229 | tty_wait_until_sent(tty, HVCS_CLOSE_WAIT); | ||
9230 | |||
9231 | - /* | ||
9232 | - * This line is important because it tells hvcs_open that this | ||
9233 | - * device needs to be re-configured the next time hvcs_open is | ||
9234 | - * called. | ||
9235 | - */ | ||
9236 | - tty->driver_data = NULL; | ||
9237 | - | ||
9238 | free_irq(irq, hvcsd); | ||
9239 | return; | ||
9240 | } else if (hvcsd->port.count < 0) { | ||
9241 | @@ -1239,6 +1232,13 @@ static void hvcs_cleanup(struct tty_struct * tty) | ||
9242 | { | ||
9243 | struct hvcs_struct *hvcsd = tty->driver_data; | ||
9244 | |||
9245 | + /* | ||
9246 | + * This line is important because it tells hvcs_open that this | ||
9247 | + * device needs to be re-configured the next time hvcs_open is | ||
9248 | + * called. | ||
9249 | + */ | ||
9250 | + tty->driver_data = NULL; | ||
9251 | + | ||
9252 | tty_port_put(&hvcsd->port); | ||
9253 | } | ||
9254 | |||
9255 | diff --git a/drivers/tty/ipwireless/network.c b/drivers/tty/ipwireless/network.c | ||
9256 | index cf20616340a1a..fe569f6294a24 100644 | ||
9257 | --- a/drivers/tty/ipwireless/network.c | ||
9258 | +++ b/drivers/tty/ipwireless/network.c | ||
9259 | @@ -117,7 +117,7 @@ static int ipwireless_ppp_start_xmit(struct ppp_channel *ppp_channel, | ||
9260 | skb->len, | ||
9261 | notify_packet_sent, | ||
9262 | network); | ||
9263 | - if (ret == -1) { | ||
9264 | + if (ret < 0) { | ||
9265 | skb_pull(skb, 2); | ||
9266 | return 0; | ||
9267 | } | ||
9268 | @@ -134,7 +134,7 @@ static int ipwireless_ppp_start_xmit(struct ppp_channel *ppp_channel, | ||
9269 | notify_packet_sent, | ||
9270 | network); | ||
9271 | kfree(buf); | ||
9272 | - if (ret == -1) | ||
9273 | + if (ret < 0) | ||
9274 | return 0; | ||
9275 | } | ||
9276 | kfree_skb(skb); | ||
9277 | diff --git a/drivers/tty/ipwireless/tty.c b/drivers/tty/ipwireless/tty.c | ||
9278 | index fad3401e604d9..23584769fc292 100644 | ||
9279 | --- a/drivers/tty/ipwireless/tty.c | ||
9280 | +++ b/drivers/tty/ipwireless/tty.c | ||
9281 | @@ -218,7 +218,7 @@ static int ipw_write(struct tty_struct *linux_tty, | ||
9282 | ret = ipwireless_send_packet(tty->hardware, IPW_CHANNEL_RAS, | ||
9283 | buf, count, | ||
9284 | ipw_write_packet_sent_callback, tty); | ||
9285 | - if (ret == -1) { | ||
9286 | + if (ret < 0) { | ||
9287 | mutex_unlock(&tty->ipw_tty_mutex); | ||
9288 | return 0; | ||
9289 | } | ||
9290 | diff --git a/drivers/tty/pty.c b/drivers/tty/pty.c | ||
9291 | index 00099a8439d21..c6a1d8c4e6894 100644 | ||
9292 | --- a/drivers/tty/pty.c | ||
9293 | +++ b/drivers/tty/pty.c | ||
9294 | @@ -120,10 +120,10 @@ static int pty_write(struct tty_struct *tty, const unsigned char *buf, int c) | ||
9295 | spin_lock_irqsave(&to->port->lock, flags); | ||
9296 | /* Stuff the data into the input queue of the other end */ | ||
9297 | c = tty_insert_flip_string(to->port, buf, c); | ||
9298 | + spin_unlock_irqrestore(&to->port->lock, flags); | ||
9299 | /* And shovel */ | ||
9300 | if (c) | ||
9301 | tty_flip_buffer_push(to->port); | ||
9302 | - spin_unlock_irqrestore(&to->port->lock, flags); | ||
9303 | } | ||
9304 | return c; | ||
9305 | } | ||
9306 | diff --git a/drivers/tty/serial/Kconfig b/drivers/tty/serial/Kconfig | ||
9307 | index 67a9eb3f94cec..a9751a83d5dbb 100644 | ||
9308 | --- a/drivers/tty/serial/Kconfig | ||
9309 | +++ b/drivers/tty/serial/Kconfig | ||
9310 | @@ -10,6 +10,7 @@ menu "Serial drivers" | ||
9311 | |||
9312 | config SERIAL_EARLYCON | ||
9313 | bool | ||
9314 | + depends on SERIAL_CORE | ||
9315 | help | ||
9316 | Support for early consoles with the earlycon parameter. This enables | ||
9317 | the console before standard serial driver is probed. The console is | ||
9318 | diff --git a/drivers/tty/serial/fsl_lpuart.c b/drivers/tty/serial/fsl_lpuart.c | ||
9319 | index d2fc050a34454..ec8e608b46baa 100644 | ||
9320 | --- a/drivers/tty/serial/fsl_lpuart.c | ||
9321 | +++ b/drivers/tty/serial/fsl_lpuart.c | ||
9322 | @@ -635,26 +635,24 @@ static int lpuart32_poll_init(struct uart_port *port) | ||
9323 | spin_lock_irqsave(&sport->port.lock, flags); | ||
9324 | |||
9325 | /* Disable Rx & Tx */ | ||
9326 | - lpuart32_write(&sport->port, UARTCTRL, 0); | ||
9327 | + lpuart32_write(&sport->port, 0, UARTCTRL); | ||
9328 | |||
9329 | temp = lpuart32_read(&sport->port, UARTFIFO); | ||
9330 | |||
9331 | /* Enable Rx and Tx FIFO */ | ||
9332 | - lpuart32_write(&sport->port, UARTFIFO, | ||
9333 | - temp | UARTFIFO_RXFE | UARTFIFO_TXFE); | ||
9334 | + lpuart32_write(&sport->port, temp | UARTFIFO_RXFE | UARTFIFO_TXFE, UARTFIFO); | ||
9335 | |||
9336 | /* flush Tx and Rx FIFO */ | ||
9337 | - lpuart32_write(&sport->port, UARTFIFO, | ||
9338 | - UARTFIFO_TXFLUSH | UARTFIFO_RXFLUSH); | ||
9339 | + lpuart32_write(&sport->port, UARTFIFO_TXFLUSH | UARTFIFO_RXFLUSH, UARTFIFO); | ||
9340 | |||
9341 | /* explicitly clear RDRF */ | ||
9342 | if (lpuart32_read(&sport->port, UARTSTAT) & UARTSTAT_RDRF) { | ||
9343 | lpuart32_read(&sport->port, UARTDATA); | ||
9344 | - lpuart32_write(&sport->port, UARTFIFO, UARTFIFO_RXUF); | ||
9345 | + lpuart32_write(&sport->port, UARTFIFO_RXUF, UARTFIFO); | ||
9346 | } | ||
9347 | |||
9348 | /* Enable Rx and Tx */ | ||
9349 | - lpuart32_write(&sport->port, UARTCTRL, UARTCTRL_RE | UARTCTRL_TE); | ||
9350 | + lpuart32_write(&sport->port, UARTCTRL_RE | UARTCTRL_TE, UARTCTRL); | ||
9351 | spin_unlock_irqrestore(&sport->port.lock, flags); | ||
9352 | |||
9353 | return 0; | ||
9354 | @@ -663,12 +661,12 @@ static int lpuart32_poll_init(struct uart_port *port) | ||
9355 | static void lpuart32_poll_put_char(struct uart_port *port, unsigned char c) | ||
9356 | { | ||
9357 | lpuart32_wait_bit_set(port, UARTSTAT, UARTSTAT_TDRE); | ||
9358 | - lpuart32_write(port, UARTDATA, c); | ||
9359 | + lpuart32_write(port, c, UARTDATA); | ||
9360 | } | ||
9361 | |||
9362 | static int lpuart32_poll_get_char(struct uart_port *port) | ||
9363 | { | ||
9364 | - if (!(lpuart32_read(port, UARTSTAT) & UARTSTAT_RDRF)) | ||
9365 | + if (!(lpuart32_read(port, UARTWATER) >> UARTWATER_RXCNT_OFF)) | ||
9366 | return NO_POLL_CHAR; | ||
9367 | |||
9368 | return lpuart32_read(port, UARTDATA); | ||
9369 | diff --git a/drivers/usb/cdns3/gadget.c b/drivers/usb/cdns3/gadget.c | ||
9370 | index 9900888afbcd8..c0c39cf303871 100644 | ||
9371 | --- a/drivers/usb/cdns3/gadget.c | ||
9372 | +++ b/drivers/usb/cdns3/gadget.c | ||
9373 | @@ -2545,12 +2545,12 @@ void cdns3_gadget_exit(struct cdns3 *cdns) | ||
9374 | |||
9375 | priv_dev = cdns->gadget_dev; | ||
9376 | |||
9377 | - devm_free_irq(cdns->dev, cdns->dev_irq, priv_dev); | ||
9378 | |||
9379 | pm_runtime_mark_last_busy(cdns->dev); | ||
9380 | pm_runtime_put_autosuspend(cdns->dev); | ||
9381 | |||
9382 | usb_del_gadget_udc(&priv_dev->gadget); | ||
9383 | + devm_free_irq(cdns->dev, cdns->dev_irq, priv_dev); | ||
9384 | |||
9385 | cdns3_free_all_eps(priv_dev); | ||
9386 | |||
9387 | diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c | ||
9388 | index 7499ba118665a..808722b8294a4 100644 | ||
9389 | --- a/drivers/usb/class/cdc-acm.c | ||
9390 | +++ b/drivers/usb/class/cdc-acm.c | ||
9391 | @@ -1243,9 +1243,21 @@ static int acm_probe(struct usb_interface *intf, | ||
9392 | } | ||
9393 | } | ||
9394 | } else { | ||
9395 | + int class = -1; | ||
9396 | + | ||
9397 | data_intf_num = union_header->bSlaveInterface0; | ||
9398 | control_interface = usb_ifnum_to_if(usb_dev, union_header->bMasterInterface0); | ||
9399 | data_interface = usb_ifnum_to_if(usb_dev, data_intf_num); | ||
9400 | + | ||
9401 | + if (control_interface) | ||
9402 | + class = control_interface->cur_altsetting->desc.bInterfaceClass; | ||
9403 | + | ||
9404 | + if (class != USB_CLASS_COMM && class != USB_CLASS_CDC_DATA) { | ||
9405 | + dev_dbg(&intf->dev, "Broken union descriptor, assuming single interface\n"); | ||
9406 | + combined_interfaces = 1; | ||
9407 | + control_interface = data_interface = intf; | ||
9408 | + goto look_for_collapsed_interface; | ||
9409 | + } | ||
9410 | } | ||
9411 | |||
9412 | if (!control_interface || !data_interface) { | ||
9413 | @@ -1900,6 +1912,17 @@ static const struct usb_device_id acm_ids[] = { | ||
9414 | .driver_info = IGNORE_DEVICE, | ||
9415 | }, | ||
9416 | |||
9417 | + /* Exclude ETAS ES58x */ | ||
9418 | + { USB_DEVICE(0x108c, 0x0159), /* ES581.4 */ | ||
9419 | + .driver_info = IGNORE_DEVICE, | ||
9420 | + }, | ||
9421 | + { USB_DEVICE(0x108c, 0x0168), /* ES582.1 */ | ||
9422 | + .driver_info = IGNORE_DEVICE, | ||
9423 | + }, | ||
9424 | + { USB_DEVICE(0x108c, 0x0169), /* ES584.1 */ | ||
9425 | + .driver_info = IGNORE_DEVICE, | ||
9426 | + }, | ||
9427 | + | ||
9428 | { USB_DEVICE(0x1bc7, 0x0021), /* Telit 3G ACM only composition */ | ||
9429 | .driver_info = SEND_ZERO_PACKET, | ||
9430 | }, | ||
9431 | diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c | ||
9432 | index 70afb2ca1eabd..9875e2fe33db2 100644 | ||
9433 | --- a/drivers/usb/class/cdc-wdm.c | ||
9434 | +++ b/drivers/usb/class/cdc-wdm.c | ||
9435 | @@ -58,6 +58,9 @@ MODULE_DEVICE_TABLE (usb, wdm_ids); | ||
9436 | |||
9437 | #define WDM_MAX 16 | ||
9438 | |||
9439 | +/* we cannot wait forever at flush() */ | ||
9440 | +#define WDM_FLUSH_TIMEOUT (30 * HZ) | ||
9441 | + | ||
9442 | /* CDC-WMC r1.1 requires wMaxCommand to be "at least 256 decimal (0x100)" */ | ||
9443 | #define WDM_DEFAULT_BUFSIZE 256 | ||
9444 | |||
9445 | @@ -151,7 +154,7 @@ static void wdm_out_callback(struct urb *urb) | ||
9446 | kfree(desc->outbuf); | ||
9447 | desc->outbuf = NULL; | ||
9448 | clear_bit(WDM_IN_USE, &desc->flags); | ||
9449 | - wake_up(&desc->wait); | ||
9450 | + wake_up_all(&desc->wait); | ||
9451 | } | ||
9452 | |||
9453 | static void wdm_in_callback(struct urb *urb) | ||
9454 | @@ -393,6 +396,9 @@ static ssize_t wdm_write | ||
9455 | if (test_bit(WDM_RESETTING, &desc->flags)) | ||
9456 | r = -EIO; | ||
9457 | |||
9458 | + if (test_bit(WDM_DISCONNECTING, &desc->flags)) | ||
9459 | + r = -ENODEV; | ||
9460 | + | ||
9461 | if (r < 0) { | ||
9462 | rv = r; | ||
9463 | goto out_free_mem_pm; | ||
9464 | @@ -424,6 +430,7 @@ static ssize_t wdm_write | ||
9465 | if (rv < 0) { | ||
9466 | desc->outbuf = NULL; | ||
9467 | clear_bit(WDM_IN_USE, &desc->flags); | ||
9468 | + wake_up_all(&desc->wait); /* for wdm_wait_for_response() */ | ||
9469 | dev_err(&desc->intf->dev, "Tx URB error: %d\n", rv); | ||
9470 | rv = usb_translate_errors(rv); | ||
9471 | goto out_free_mem_pm; | ||
9472 | @@ -583,28 +590,58 @@ err: | ||
9473 | return rv; | ||
9474 | } | ||
9475 | |||
9476 | -static int wdm_flush(struct file *file, fl_owner_t id) | ||
9477 | +static int wdm_wait_for_response(struct file *file, long timeout) | ||
9478 | { | ||
9479 | struct wdm_device *desc = file->private_data; | ||
9480 | + long rv; /* Use long here because (int) MAX_SCHEDULE_TIMEOUT < 0. */ | ||
9481 | + | ||
9482 | + /* | ||
9483 | + * Needs both flags. We cannot do with one because resetting it would | ||
9484 | + * cause a race with write() yet we need to signal a disconnect. | ||
9485 | + */ | ||
9486 | + rv = wait_event_interruptible_timeout(desc->wait, | ||
9487 | + !test_bit(WDM_IN_USE, &desc->flags) || | ||
9488 | + test_bit(WDM_DISCONNECTING, &desc->flags), | ||
9489 | + timeout); | ||
9490 | |||
9491 | - wait_event(desc->wait, | ||
9492 | - /* | ||
9493 | - * needs both flags. We cannot do with one | ||
9494 | - * because resetting it would cause a race | ||
9495 | - * with write() yet we need to signal | ||
9496 | - * a disconnect | ||
9497 | - */ | ||
9498 | - !test_bit(WDM_IN_USE, &desc->flags) || | ||
9499 | - test_bit(WDM_DISCONNECTING, &desc->flags)); | ||
9500 | - | ||
9501 | - /* cannot dereference desc->intf if WDM_DISCONNECTING */ | ||
9502 | + /* | ||
9503 | + * To report the correct error. This is best effort. | ||
9504 | + * We are inevitably racing with the hardware. | ||
9505 | + */ | ||
9506 | if (test_bit(WDM_DISCONNECTING, &desc->flags)) | ||
9507 | return -ENODEV; | ||
9508 | - if (desc->werr < 0) | ||
9509 | - dev_err(&desc->intf->dev, "Error in flush path: %d\n", | ||
9510 | - desc->werr); | ||
9511 | + if (!rv) | ||
9512 | + return -EIO; | ||
9513 | + if (rv < 0) | ||
9514 | + return -EINTR; | ||
9515 | + | ||
9516 | + spin_lock_irq(&desc->iuspin); | ||
9517 | + rv = desc->werr; | ||
9518 | + desc->werr = 0; | ||
9519 | + spin_unlock_irq(&desc->iuspin); | ||
9520 | + | ||
9521 | + return usb_translate_errors(rv); | ||
9522 | + | ||
9523 | +} | ||
9524 | + | ||
9525 | +/* | ||
9526 | + * You need to send a signal when you react to malicious or defective hardware. | ||
9527 | + * Also, don't abort when fsync() returned -EINVAL, for older kernels which do | ||
9528 | + * not implement wdm_flush() will return -EINVAL. | ||
9529 | + */ | ||
9530 | +static int wdm_fsync(struct file *file, loff_t start, loff_t end, int datasync) | ||
9531 | +{ | ||
9532 | + return wdm_wait_for_response(file, MAX_SCHEDULE_TIMEOUT); | ||
9533 | +} | ||
9534 | |||
9535 | - return usb_translate_errors(desc->werr); | ||
9536 | +/* | ||
9537 | + * Same with wdm_fsync(), except it uses finite timeout in order to react to | ||
9538 | + * malicious or defective hardware which ceased communication after close() was | ||
9539 | + * implicitly called due to process termination. | ||
9540 | + */ | ||
9541 | +static int wdm_flush(struct file *file, fl_owner_t id) | ||
9542 | +{ | ||
9543 | + return wdm_wait_for_response(file, WDM_FLUSH_TIMEOUT); | ||
9544 | } | ||
9545 | |||
9546 | static __poll_t wdm_poll(struct file *file, struct poll_table_struct *wait) | ||
9547 | @@ -729,6 +766,7 @@ static const struct file_operations wdm_fops = { | ||
9548 | .owner = THIS_MODULE, | ||
9549 | .read = wdm_read, | ||
9550 | .write = wdm_write, | ||
9551 | + .fsync = wdm_fsync, | ||
9552 | .open = wdm_open, | ||
9553 | .flush = wdm_flush, | ||
9554 | .release = wdm_release, | ||
9555 | diff --git a/drivers/usb/core/urb.c b/drivers/usb/core/urb.c | ||
9556 | index da923ec176122..31ca5abb4c12a 100644 | ||
9557 | --- a/drivers/usb/core/urb.c | ||
9558 | +++ b/drivers/usb/core/urb.c | ||
9559 | @@ -772,11 +772,12 @@ void usb_block_urb(struct urb *urb) | ||
9560 | EXPORT_SYMBOL_GPL(usb_block_urb); | ||
9561 | |||
9562 | /** | ||
9563 | - * usb_kill_anchored_urbs - cancel transfer requests en masse | ||
9564 | + * usb_kill_anchored_urbs - kill all URBs associated with an anchor | ||
9565 | * @anchor: anchor the requests are bound to | ||
9566 | * | ||
9567 | - * this allows all outstanding URBs to be killed starting | ||
9568 | - * from the back of the queue | ||
9569 | + * This kills all outstanding URBs starting from the back of the queue, | ||
9570 | + * with guarantee that no completer callbacks will take place from the | ||
9571 | + * anchor after this function returns. | ||
9572 | * | ||
9573 | * This routine should not be called by a driver after its disconnect | ||
9574 | * method has returned. | ||
9575 | @@ -784,20 +785,26 @@ EXPORT_SYMBOL_GPL(usb_block_urb); | ||
9576 | void usb_kill_anchored_urbs(struct usb_anchor *anchor) | ||
9577 | { | ||
9578 | struct urb *victim; | ||
9579 | + int surely_empty; | ||
9580 | |||
9581 | - spin_lock_irq(&anchor->lock); | ||
9582 | - while (!list_empty(&anchor->urb_list)) { | ||
9583 | - victim = list_entry(anchor->urb_list.prev, struct urb, | ||
9584 | - anchor_list); | ||
9585 | - /* we must make sure the URB isn't freed before we kill it*/ | ||
9586 | - usb_get_urb(victim); | ||
9587 | - spin_unlock_irq(&anchor->lock); | ||
9588 | - /* this will unanchor the URB */ | ||
9589 | - usb_kill_urb(victim); | ||
9590 | - usb_put_urb(victim); | ||
9591 | + do { | ||
9592 | spin_lock_irq(&anchor->lock); | ||
9593 | - } | ||
9594 | - spin_unlock_irq(&anchor->lock); | ||
9595 | + while (!list_empty(&anchor->urb_list)) { | ||
9596 | + victim = list_entry(anchor->urb_list.prev, | ||
9597 | + struct urb, anchor_list); | ||
9598 | + /* make sure the URB isn't freed before we kill it */ | ||
9599 | + usb_get_urb(victim); | ||
9600 | + spin_unlock_irq(&anchor->lock); | ||
9601 | + /* this will unanchor the URB */ | ||
9602 | + usb_kill_urb(victim); | ||
9603 | + usb_put_urb(victim); | ||
9604 | + spin_lock_irq(&anchor->lock); | ||
9605 | + } | ||
9606 | + surely_empty = usb_anchor_check_wakeup(anchor); | ||
9607 | + | ||
9608 | + spin_unlock_irq(&anchor->lock); | ||
9609 | + cpu_relax(); | ||
9610 | + } while (!surely_empty); | ||
9611 | } | ||
9612 | EXPORT_SYMBOL_GPL(usb_kill_anchored_urbs); | ||
9613 | |||
9614 | @@ -816,21 +823,27 @@ EXPORT_SYMBOL_GPL(usb_kill_anchored_urbs); | ||
9615 | void usb_poison_anchored_urbs(struct usb_anchor *anchor) | ||
9616 | { | ||
9617 | struct urb *victim; | ||
9618 | + int surely_empty; | ||
9619 | |||
9620 | - spin_lock_irq(&anchor->lock); | ||
9621 | - anchor->poisoned = 1; | ||
9622 | - while (!list_empty(&anchor->urb_list)) { | ||
9623 | - victim = list_entry(anchor->urb_list.prev, struct urb, | ||
9624 | - anchor_list); | ||
9625 | - /* we must make sure the URB isn't freed before we kill it*/ | ||
9626 | - usb_get_urb(victim); | ||
9627 | - spin_unlock_irq(&anchor->lock); | ||
9628 | - /* this will unanchor the URB */ | ||
9629 | - usb_poison_urb(victim); | ||
9630 | - usb_put_urb(victim); | ||
9631 | + do { | ||
9632 | spin_lock_irq(&anchor->lock); | ||
9633 | - } | ||
9634 | - spin_unlock_irq(&anchor->lock); | ||
9635 | + anchor->poisoned = 1; | ||
9636 | + while (!list_empty(&anchor->urb_list)) { | ||
9637 | + victim = list_entry(anchor->urb_list.prev, | ||
9638 | + struct urb, anchor_list); | ||
9639 | + /* make sure the URB isn't freed before we kill it */ | ||
9640 | + usb_get_urb(victim); | ||
9641 | + spin_unlock_irq(&anchor->lock); | ||
9642 | + /* this will unanchor the URB */ | ||
9643 | + usb_poison_urb(victim); | ||
9644 | + usb_put_urb(victim); | ||
9645 | + spin_lock_irq(&anchor->lock); | ||
9646 | + } | ||
9647 | + surely_empty = usb_anchor_check_wakeup(anchor); | ||
9648 | + | ||
9649 | + spin_unlock_irq(&anchor->lock); | ||
9650 | + cpu_relax(); | ||
9651 | + } while (!surely_empty); | ||
9652 | } | ||
9653 | EXPORT_SYMBOL_GPL(usb_poison_anchored_urbs); | ||
9654 | |||
9655 | @@ -970,14 +983,20 @@ void usb_scuttle_anchored_urbs(struct usb_anchor *anchor) | ||
9656 | { | ||
9657 | struct urb *victim; | ||
9658 | unsigned long flags; | ||
9659 | + int surely_empty; | ||
9660 | + | ||
9661 | + do { | ||
9662 | + spin_lock_irqsave(&anchor->lock, flags); | ||
9663 | + while (!list_empty(&anchor->urb_list)) { | ||
9664 | + victim = list_entry(anchor->urb_list.prev, | ||
9665 | + struct urb, anchor_list); | ||
9666 | + __usb_unanchor_urb(victim, anchor); | ||
9667 | + } | ||
9668 | + surely_empty = usb_anchor_check_wakeup(anchor); | ||
9669 | |||
9670 | - spin_lock_irqsave(&anchor->lock, flags); | ||
9671 | - while (!list_empty(&anchor->urb_list)) { | ||
9672 | - victim = list_entry(anchor->urb_list.prev, struct urb, | ||
9673 | - anchor_list); | ||
9674 | - __usb_unanchor_urb(victim, anchor); | ||
9675 | - } | ||
9676 | - spin_unlock_irqrestore(&anchor->lock, flags); | ||
9677 | + spin_unlock_irqrestore(&anchor->lock, flags); | ||
9678 | + cpu_relax(); | ||
9679 | + } while (!surely_empty); | ||
9680 | } | ||
9681 | |||
9682 | EXPORT_SYMBOL_GPL(usb_scuttle_anchored_urbs); | ||
9683 | diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c | ||
9684 | index f7528f732b2aa..70ac47a341ac2 100644 | ||
9685 | --- a/drivers/usb/dwc2/gadget.c | ||
9686 | +++ b/drivers/usb/dwc2/gadget.c | ||
9687 | @@ -712,8 +712,11 @@ static u32 dwc2_hsotg_read_frameno(struct dwc2_hsotg *hsotg) | ||
9688 | */ | ||
9689 | static unsigned int dwc2_gadget_get_chain_limit(struct dwc2_hsotg_ep *hs_ep) | ||
9690 | { | ||
9691 | + const struct usb_endpoint_descriptor *ep_desc = hs_ep->ep.desc; | ||
9692 | int is_isoc = hs_ep->isochronous; | ||
9693 | unsigned int maxsize; | ||
9694 | + u32 mps = hs_ep->ep.maxpacket; | ||
9695 | + int dir_in = hs_ep->dir_in; | ||
9696 | |||
9697 | if (is_isoc) | ||
9698 | maxsize = (hs_ep->dir_in ? DEV_DMA_ISOC_TX_NBYTES_LIMIT : | ||
9699 | @@ -722,6 +725,11 @@ static unsigned int dwc2_gadget_get_chain_limit(struct dwc2_hsotg_ep *hs_ep) | ||
9700 | else | ||
9701 | maxsize = DEV_DMA_NBYTES_LIMIT * MAX_DMA_DESC_NUM_GENERIC; | ||
9702 | |||
9703 | + /* Interrupt OUT EP with mps not multiple of 4 */ | ||
9704 | + if (hs_ep->index) | ||
9705 | + if (usb_endpoint_xfer_int(ep_desc) && !dir_in && (mps % 4)) | ||
9706 | + maxsize = mps * MAX_DMA_DESC_NUM_GENERIC; | ||
9707 | + | ||
9708 | return maxsize; | ||
9709 | } | ||
9710 | |||
9711 | @@ -737,11 +745,14 @@ static unsigned int dwc2_gadget_get_chain_limit(struct dwc2_hsotg_ep *hs_ep) | ||
9712 | * Isochronous - descriptor rx/tx bytes bitfield limit, | ||
9713 | * Control In/Bulk/Interrupt - multiple of mps. This will allow to not | ||
9714 | * have concatenations from various descriptors within one packet. | ||
9715 | + * Interrupt OUT - if mps not multiple of 4 then a single packet corresponds | ||
9716 | + * to a single descriptor. | ||
9717 | * | ||
9718 | * Selects corresponding mask for RX/TX bytes as well. | ||
9719 | */ | ||
9720 | static u32 dwc2_gadget_get_desc_params(struct dwc2_hsotg_ep *hs_ep, u32 *mask) | ||
9721 | { | ||
9722 | + const struct usb_endpoint_descriptor *ep_desc = hs_ep->ep.desc; | ||
9723 | u32 mps = hs_ep->ep.maxpacket; | ||
9724 | int dir_in = hs_ep->dir_in; | ||
9725 | u32 desc_size = 0; | ||
9726 | @@ -765,6 +776,13 @@ static u32 dwc2_gadget_get_desc_params(struct dwc2_hsotg_ep *hs_ep, u32 *mask) | ||
9727 | desc_size -= desc_size % mps; | ||
9728 | } | ||
9729 | |||
9730 | + /* Interrupt OUT EP with mps not multiple of 4 */ | ||
9731 | + if (hs_ep->index) | ||
9732 | + if (usb_endpoint_xfer_int(ep_desc) && !dir_in && (mps % 4)) { | ||
9733 | + desc_size = mps; | ||
9734 | + *mask = DEV_DMA_NBYTES_MASK; | ||
9735 | + } | ||
9736 | + | ||
9737 | return desc_size; | ||
9738 | } | ||
9739 | |||
9740 | @@ -1123,13 +1141,7 @@ static void dwc2_hsotg_start_req(struct dwc2_hsotg *hsotg, | ||
9741 | length += (mps - (length % mps)); | ||
9742 | } | ||
9743 | |||
9744 | - /* | ||
9745 | - * If more data to send, adjust DMA for EP0 out data stage. | ||
9746 | - * ureq->dma stays unchanged, hence increment it by already | ||
9747 | - * passed passed data count before starting new transaction. | ||
9748 | - */ | ||
9749 | - if (!index && hsotg->ep0_state == DWC2_EP0_DATA_OUT && | ||
9750 | - continuing) | ||
9751 | + if (continuing) | ||
9752 | offset = ureq->actual; | ||
9753 | |||
9754 | /* Fill DDMA chain entries */ | ||
9755 | @@ -2319,22 +2331,36 @@ static void dwc2_hsotg_change_ep_iso_parity(struct dwc2_hsotg *hsotg, | ||
9756 | */ | ||
9757 | static unsigned int dwc2_gadget_get_xfersize_ddma(struct dwc2_hsotg_ep *hs_ep) | ||
9758 | { | ||
9759 | + const struct usb_endpoint_descriptor *ep_desc = hs_ep->ep.desc; | ||
9760 | struct dwc2_hsotg *hsotg = hs_ep->parent; | ||
9761 | unsigned int bytes_rem = 0; | ||
9762 | + unsigned int bytes_rem_correction = 0; | ||
9763 | struct dwc2_dma_desc *desc = hs_ep->desc_list; | ||
9764 | int i; | ||
9765 | u32 status; | ||
9766 | + u32 mps = hs_ep->ep.maxpacket; | ||
9767 | + int dir_in = hs_ep->dir_in; | ||
9768 | |||
9769 | if (!desc) | ||
9770 | return -EINVAL; | ||
9771 | |||
9772 | + /* Interrupt OUT EP with mps not multiple of 4 */ | ||
9773 | + if (hs_ep->index) | ||
9774 | + if (usb_endpoint_xfer_int(ep_desc) && !dir_in && (mps % 4)) | ||
9775 | + bytes_rem_correction = 4 - (mps % 4); | ||
9776 | + | ||
9777 | for (i = 0; i < hs_ep->desc_count; ++i) { | ||
9778 | status = desc->status; | ||
9779 | bytes_rem += status & DEV_DMA_NBYTES_MASK; | ||
9780 | + bytes_rem -= bytes_rem_correction; | ||
9781 | |||
9782 | if (status & DEV_DMA_STS_MASK) | ||
9783 | dev_err(hsotg->dev, "descriptor %d closed with %x\n", | ||
9784 | i, status & DEV_DMA_STS_MASK); | ||
9785 | + | ||
9786 | + if (status & DEV_DMA_L) | ||
9787 | + break; | ||
9788 | + | ||
9789 | desc++; | ||
9790 | } | ||
9791 | |||
9792 | diff --git a/drivers/usb/dwc2/params.c b/drivers/usb/dwc2/params.c | ||
9793 | index 31e090ac9f1ec..6d3812678b8c6 100644 | ||
9794 | --- a/drivers/usb/dwc2/params.c | ||
9795 | +++ b/drivers/usb/dwc2/params.c | ||
9796 | @@ -846,7 +846,7 @@ int dwc2_get_hwparams(struct dwc2_hsotg *hsotg) | ||
9797 | int dwc2_init_params(struct dwc2_hsotg *hsotg) | ||
9798 | { | ||
9799 | const struct of_device_id *match; | ||
9800 | - void (*set_params)(void *data); | ||
9801 | + void (*set_params)(struct dwc2_hsotg *data); | ||
9802 | |||
9803 | dwc2_set_default_params(hsotg); | ||
9804 | dwc2_get_device_properties(hsotg); | ||
9805 | diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c | ||
9806 | index 526c275ad0bc5..4cbf295390062 100644 | ||
9807 | --- a/drivers/usb/dwc3/core.c | ||
9808 | +++ b/drivers/usb/dwc3/core.c | ||
9809 | @@ -117,6 +117,7 @@ static void __dwc3_set_mode(struct work_struct *work) | ||
9810 | struct dwc3 *dwc = work_to_dwc(work); | ||
9811 | unsigned long flags; | ||
9812 | int ret; | ||
9813 | + u32 reg; | ||
9814 | |||
9815 | if (dwc->dr_mode != USB_DR_MODE_OTG) | ||
9816 | return; | ||
9817 | @@ -168,6 +169,11 @@ static void __dwc3_set_mode(struct work_struct *work) | ||
9818 | otg_set_vbus(dwc->usb2_phy->otg, true); | ||
9819 | phy_set_mode(dwc->usb2_generic_phy, PHY_MODE_USB_HOST); | ||
9820 | phy_set_mode(dwc->usb3_generic_phy, PHY_MODE_USB_HOST); | ||
9821 | + if (dwc->dis_split_quirk) { | ||
9822 | + reg = dwc3_readl(dwc->regs, DWC3_GUCTL3); | ||
9823 | + reg |= DWC3_GUCTL3_SPLITDISABLE; | ||
9824 | + dwc3_writel(dwc->regs, DWC3_GUCTL3, reg); | ||
9825 | + } | ||
9826 | } | ||
9827 | break; | ||
9828 | case DWC3_GCTL_PRTCAP_DEVICE: | ||
9829 | @@ -1323,6 +1329,9 @@ static void dwc3_get_properties(struct dwc3 *dwc) | ||
9830 | dwc->dis_metastability_quirk = device_property_read_bool(dev, | ||
9831 | "snps,dis_metastability_quirk"); | ||
9832 | |||
9833 | + dwc->dis_split_quirk = device_property_read_bool(dev, | ||
9834 | + "snps,dis-split-quirk"); | ||
9835 | + | ||
9836 | dwc->lpm_nyet_threshold = lpm_nyet_threshold; | ||
9837 | dwc->tx_de_emphasis = tx_de_emphasis; | ||
9838 | |||
9839 | @@ -1835,10 +1844,26 @@ static int dwc3_resume(struct device *dev) | ||
9840 | |||
9841 | return 0; | ||
9842 | } | ||
9843 | + | ||
9844 | +static void dwc3_complete(struct device *dev) | ||
9845 | +{ | ||
9846 | + struct dwc3 *dwc = dev_get_drvdata(dev); | ||
9847 | + u32 reg; | ||
9848 | + | ||
9849 | + if (dwc->current_dr_role == DWC3_GCTL_PRTCAP_HOST && | ||
9850 | + dwc->dis_split_quirk) { | ||
9851 | + reg = dwc3_readl(dwc->regs, DWC3_GUCTL3); | ||
9852 | + reg |= DWC3_GUCTL3_SPLITDISABLE; | ||
9853 | + dwc3_writel(dwc->regs, DWC3_GUCTL3, reg); | ||
9854 | + } | ||
9855 | +} | ||
9856 | +#else | ||
9857 | +#define dwc3_complete NULL | ||
9858 | #endif /* CONFIG_PM_SLEEP */ | ||
9859 | |||
9860 | static const struct dev_pm_ops dwc3_dev_pm_ops = { | ||
9861 | SET_SYSTEM_SLEEP_PM_OPS(dwc3_suspend, dwc3_resume) | ||
9862 | + .complete = dwc3_complete, | ||
9863 | SET_RUNTIME_PM_OPS(dwc3_runtime_suspend, dwc3_runtime_resume, | ||
9864 | dwc3_runtime_idle) | ||
9865 | }; | ||
9866 | diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h | ||
9867 | index ce4acbf7fef90..4dfbffa944de1 100644 | ||
9868 | --- a/drivers/usb/dwc3/core.h | ||
9869 | +++ b/drivers/usb/dwc3/core.h | ||
9870 | @@ -136,6 +136,7 @@ | ||
9871 | #define DWC3_GEVNTCOUNT(n) (0xc40c + ((n) * 0x10)) | ||
9872 | |||
9873 | #define DWC3_GHWPARAMS8 0xc600 | ||
9874 | +#define DWC3_GUCTL3 0xc60c | ||
9875 | #define DWC3_GFLADJ 0xc630 | ||
9876 | |||
9877 | /* Device Registers */ | ||
9878 | @@ -375,6 +376,9 @@ | ||
9879 | /* Global User Control Register 2 */ | ||
9880 | #define DWC3_GUCTL2_RST_ACTBITLATER BIT(14) | ||
9881 | |||
9882 | +/* Global User Control Register 3 */ | ||
9883 | +#define DWC3_GUCTL3_SPLITDISABLE BIT(14) | ||
9884 | + | ||
9885 | /* Device Configuration Register */ | ||
9886 | #define DWC3_DCFG_DEVADDR(addr) ((addr) << 3) | ||
9887 | #define DWC3_DCFG_DEVADDR_MASK DWC3_DCFG_DEVADDR(0x7f) | ||
9888 | @@ -1038,6 +1042,7 @@ struct dwc3_scratchpad_array { | ||
9889 | * 2 - No de-emphasis | ||
9890 | * 3 - Reserved | ||
9891 | * @dis_metastability_quirk: set to disable metastability quirk. | ||
9892 | + * @dis_split_quirk: set to disable split boundary. | ||
9893 | * @imod_interval: set the interrupt moderation interval in 250ns | ||
9894 | * increments or 0 to disable. | ||
9895 | */ | ||
9896 | @@ -1229,6 +1234,8 @@ struct dwc3 { | ||
9897 | |||
9898 | unsigned dis_metastability_quirk:1; | ||
9899 | |||
9900 | + unsigned dis_split_quirk:1; | ||
9901 | + | ||
9902 | u16 imod_interval; | ||
9903 | }; | ||
9904 | |||
9905 | diff --git a/drivers/usb/dwc3/dwc3-of-simple.c b/drivers/usb/dwc3/dwc3-of-simple.c | ||
9906 | index bdac3e7d7b184..d055e00f81808 100644 | ||
9907 | --- a/drivers/usb/dwc3/dwc3-of-simple.c | ||
9908 | +++ b/drivers/usb/dwc3/dwc3-of-simple.c | ||
9909 | @@ -183,6 +183,7 @@ static const struct of_device_id of_dwc3_simple_match[] = { | ||
9910 | { .compatible = "amlogic,meson-axg-dwc3" }, | ||
9911 | { .compatible = "amlogic,meson-gxl-dwc3" }, | ||
9912 | { .compatible = "allwinner,sun50i-h6-dwc3" }, | ||
9913 | + { .compatible = "hisilicon,hi3670-dwc3" }, | ||
9914 | { /* Sentinel */ } | ||
9915 | }; | ||
9916 | MODULE_DEVICE_TABLE(of, of_dwc3_simple_match); | ||
9917 | diff --git a/drivers/usb/gadget/function/f_ncm.c b/drivers/usb/gadget/function/f_ncm.c | ||
9918 | index 1f638759a9533..92a7c3a839454 100644 | ||
9919 | --- a/drivers/usb/gadget/function/f_ncm.c | ||
9920 | +++ b/drivers/usb/gadget/function/f_ncm.c | ||
9921 | @@ -85,8 +85,10 @@ static inline struct f_ncm *func_to_ncm(struct usb_function *f) | ||
9922 | /* peak (theoretical) bulk transfer rate in bits-per-second */ | ||
9923 | static inline unsigned ncm_bitrate(struct usb_gadget *g) | ||
9924 | { | ||
9925 | - if (gadget_is_superspeed(g) && g->speed == USB_SPEED_SUPER) | ||
9926 | - return 13 * 1024 * 8 * 1000 * 8; | ||
9927 | + if (gadget_is_superspeed(g) && g->speed >= USB_SPEED_SUPER_PLUS) | ||
9928 | + return 4250000000U; | ||
9929 | + else if (gadget_is_superspeed(g) && g->speed == USB_SPEED_SUPER) | ||
9930 | + return 3750000000U; | ||
9931 | else if (gadget_is_dualspeed(g) && g->speed == USB_SPEED_HIGH) | ||
9932 | return 13 * 512 * 8 * 1000 * 8; | ||
9933 | else | ||
9934 | @@ -1534,7 +1536,7 @@ static int ncm_bind(struct usb_configuration *c, struct usb_function *f) | ||
9935 | fs_ncm_notify_desc.bEndpointAddress; | ||
9936 | |||
9937 | status = usb_assign_descriptors(f, ncm_fs_function, ncm_hs_function, | ||
9938 | - ncm_ss_function, NULL); | ||
9939 | + ncm_ss_function, ncm_ss_function); | ||
9940 | if (status) | ||
9941 | goto fail; | ||
9942 | |||
9943 | diff --git a/drivers/usb/gadget/function/f_printer.c b/drivers/usb/gadget/function/f_printer.c | ||
9944 | index 9c7ed2539ff77..8ed1295d7e350 100644 | ||
9945 | --- a/drivers/usb/gadget/function/f_printer.c | ||
9946 | +++ b/drivers/usb/gadget/function/f_printer.c | ||
9947 | @@ -31,6 +31,7 @@ | ||
9948 | #include <linux/types.h> | ||
9949 | #include <linux/ctype.h> | ||
9950 | #include <linux/cdev.h> | ||
9951 | +#include <linux/kref.h> | ||
9952 | |||
9953 | #include <asm/byteorder.h> | ||
9954 | #include <linux/io.h> | ||
9955 | @@ -64,7 +65,7 @@ struct printer_dev { | ||
9956 | struct usb_gadget *gadget; | ||
9957 | s8 interface; | ||
9958 | struct usb_ep *in_ep, *out_ep; | ||
9959 | - | ||
9960 | + struct kref kref; | ||
9961 | struct list_head rx_reqs; /* List of free RX structs */ | ||
9962 | struct list_head rx_reqs_active; /* List of Active RX xfers */ | ||
9963 | struct list_head rx_buffers; /* List of completed xfers */ | ||
9964 | @@ -218,6 +219,13 @@ static inline struct usb_endpoint_descriptor *ep_desc(struct usb_gadget *gadget, | ||
9965 | |||
9966 | /*-------------------------------------------------------------------------*/ | ||
9967 | |||
9968 | +static void printer_dev_free(struct kref *kref) | ||
9969 | +{ | ||
9970 | + struct printer_dev *dev = container_of(kref, struct printer_dev, kref); | ||
9971 | + | ||
9972 | + kfree(dev); | ||
9973 | +} | ||
9974 | + | ||
9975 | static struct usb_request * | ||
9976 | printer_req_alloc(struct usb_ep *ep, unsigned len, gfp_t gfp_flags) | ||
9977 | { | ||
9978 | @@ -348,6 +356,7 @@ printer_open(struct inode *inode, struct file *fd) | ||
9979 | |||
9980 | spin_unlock_irqrestore(&dev->lock, flags); | ||
9981 | |||
9982 | + kref_get(&dev->kref); | ||
9983 | DBG(dev, "printer_open returned %x\n", ret); | ||
9984 | return ret; | ||
9985 | } | ||
9986 | @@ -365,6 +374,7 @@ printer_close(struct inode *inode, struct file *fd) | ||
9987 | dev->printer_status &= ~PRINTER_SELECTED; | ||
9988 | spin_unlock_irqrestore(&dev->lock, flags); | ||
9989 | |||
9990 | + kref_put(&dev->kref, printer_dev_free); | ||
9991 | DBG(dev, "printer_close\n"); | ||
9992 | |||
9993 | return 0; | ||
9994 | @@ -1350,7 +1360,8 @@ static void gprinter_free(struct usb_function *f) | ||
9995 | struct f_printer_opts *opts; | ||
9996 | |||
9997 | opts = container_of(f->fi, struct f_printer_opts, func_inst); | ||
9998 | - kfree(dev); | ||
9999 | + | ||
10000 | + kref_put(&dev->kref, printer_dev_free); | ||
10001 | mutex_lock(&opts->lock); | ||
10002 | --opts->refcnt; | ||
10003 | mutex_unlock(&opts->lock); | ||
10004 | @@ -1419,6 +1430,7 @@ static struct usb_function *gprinter_alloc(struct usb_function_instance *fi) | ||
10005 | return ERR_PTR(-ENOMEM); | ||
10006 | } | ||
10007 | |||
10008 | + kref_init(&dev->kref); | ||
10009 | ++opts->refcnt; | ||
10010 | dev->minor = opts->minor; | ||
10011 | dev->pnp_string = opts->pnp_string; | ||
10012 | diff --git a/drivers/usb/gadget/function/u_ether.c b/drivers/usb/gadget/function/u_ether.c | ||
10013 | index fbe96ef1ac7a4..891e9f7f40d59 100644 | ||
10014 | --- a/drivers/usb/gadget/function/u_ether.c | ||
10015 | +++ b/drivers/usb/gadget/function/u_ether.c | ||
10016 | @@ -93,7 +93,7 @@ struct eth_dev { | ||
10017 | static inline int qlen(struct usb_gadget *gadget, unsigned qmult) | ||
10018 | { | ||
10019 | if (gadget_is_dualspeed(gadget) && (gadget->speed == USB_SPEED_HIGH || | ||
10020 | - gadget->speed == USB_SPEED_SUPER)) | ||
10021 | + gadget->speed >= USB_SPEED_SUPER)) | ||
10022 | return qmult * DEFAULT_QLEN; | ||
10023 | else | ||
10024 | return DEFAULT_QLEN; | ||
10025 | diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c | ||
10026 | index 4de91653a2c7b..5eb62240c7f87 100644 | ||
10027 | --- a/drivers/usb/host/ohci-hcd.c | ||
10028 | +++ b/drivers/usb/host/ohci-hcd.c | ||
10029 | @@ -673,20 +673,24 @@ retry: | ||
10030 | |||
10031 | /* handle root hub init quirks ... */ | ||
10032 | val = roothub_a (ohci); | ||
10033 | - val &= ~(RH_A_PSM | RH_A_OCPM); | ||
10034 | + /* Configure for per-port over-current protection by default */ | ||
10035 | + val &= ~RH_A_NOCP; | ||
10036 | + val |= RH_A_OCPM; | ||
10037 | if (ohci->flags & OHCI_QUIRK_SUPERIO) { | ||
10038 | - /* NSC 87560 and maybe others */ | ||
10039 | + /* NSC 87560 and maybe others. | ||
10040 | + * Ganged power switching, no over-current protection. | ||
10041 | + */ | ||
10042 | val |= RH_A_NOCP; | ||
10043 | - val &= ~(RH_A_POTPGT | RH_A_NPS); | ||
10044 | - ohci_writel (ohci, val, &ohci->regs->roothub.a); | ||
10045 | + val &= ~(RH_A_POTPGT | RH_A_NPS | RH_A_PSM | RH_A_OCPM); | ||
10046 | } else if ((ohci->flags & OHCI_QUIRK_AMD756) || | ||
10047 | (ohci->flags & OHCI_QUIRK_HUB_POWER)) { | ||
10048 | /* hub power always on; required for AMD-756 and some | ||
10049 | - * Mac platforms. ganged overcurrent reporting, if any. | ||
10050 | + * Mac platforms. | ||
10051 | */ | ||
10052 | val |= RH_A_NPS; | ||
10053 | - ohci_writel (ohci, val, &ohci->regs->roothub.a); | ||
10054 | } | ||
10055 | + ohci_writel(ohci, val, &ohci->regs->roothub.a); | ||
10056 | + | ||
10057 | ohci_writel (ohci, RH_HS_LPSC, &ohci->regs->roothub.status); | ||
10058 | ohci_writel (ohci, (val & RH_A_NPS) ? 0 : RH_B_PPCM, | ||
10059 | &ohci->regs->roothub.b); | ||
10060 | diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c | ||
10061 | index bad154f446f8d..0d10ede581cbd 100644 | ||
10062 | --- a/drivers/usb/host/xhci.c | ||
10063 | +++ b/drivers/usb/host/xhci.c | ||
10064 | @@ -1915,8 +1915,6 @@ static int xhci_add_endpoint(struct usb_hcd *hcd, struct usb_device *udev, | ||
10065 | ep_ctx = xhci_get_ep_ctx(xhci, virt_dev->in_ctx, ep_index); | ||
10066 | trace_xhci_add_endpoint(ep_ctx); | ||
10067 | |||
10068 | - xhci_debugfs_create_endpoint(xhci, virt_dev, ep_index); | ||
10069 | - | ||
10070 | xhci_dbg(xhci, "add ep 0x%x, slot id %d, new drop flags = %#x, new add flags = %#x\n", | ||
10071 | (unsigned int) ep->desc.bEndpointAddress, | ||
10072 | udev->slot_id, | ||
10073 | @@ -2949,6 +2947,7 @@ static int xhci_check_bandwidth(struct usb_hcd *hcd, struct usb_device *udev) | ||
10074 | xhci_check_bw_drop_ep_streams(xhci, virt_dev, i); | ||
10075 | virt_dev->eps[i].ring = virt_dev->eps[i].new_ring; | ||
10076 | virt_dev->eps[i].new_ring = NULL; | ||
10077 | + xhci_debugfs_create_endpoint(xhci, virt_dev, i); | ||
10078 | } | ||
10079 | command_cleanup: | ||
10080 | kfree(command->completion); | ||
10081 | diff --git a/drivers/vfio/pci/vfio_pci_config.c b/drivers/vfio/pci/vfio_pci_config.c | ||
10082 | index 927b608461c82..bf32997c557ff 100644 | ||
10083 | --- a/drivers/vfio/pci/vfio_pci_config.c | ||
10084 | +++ b/drivers/vfio/pci/vfio_pci_config.c | ||
10085 | @@ -406,7 +406,7 @@ bool __vfio_pci_memory_enabled(struct vfio_pci_device *vdev) | ||
10086 | * PF SR-IOV capability, there's therefore no need to trigger | ||
10087 | * faults based on the virtual value. | ||
10088 | */ | ||
10089 | - return pdev->is_virtfn || (cmd & PCI_COMMAND_MEMORY); | ||
10090 | + return pdev->no_command_memory || (cmd & PCI_COMMAND_MEMORY); | ||
10091 | } | ||
10092 | |||
10093 | /* | ||
10094 | @@ -518,8 +518,8 @@ static int vfio_basic_config_read(struct vfio_pci_device *vdev, int pos, | ||
10095 | |||
10096 | count = vfio_default_config_read(vdev, pos, count, perm, offset, val); | ||
10097 | |||
10098 | - /* Mask in virtual memory enable for SR-IOV devices */ | ||
10099 | - if (offset == PCI_COMMAND && vdev->pdev->is_virtfn) { | ||
10100 | + /* Mask in virtual memory enable */ | ||
10101 | + if (offset == PCI_COMMAND && vdev->pdev->no_command_memory) { | ||
10102 | u16 cmd = le16_to_cpu(*(__le16 *)&vdev->vconfig[PCI_COMMAND]); | ||
10103 | u32 tmp_val = le32_to_cpu(*val); | ||
10104 | |||
10105 | @@ -587,9 +587,11 @@ static int vfio_basic_config_write(struct vfio_pci_device *vdev, int pos, | ||
10106 | * shows it disabled (phys_mem/io, then the device has | ||
10107 | * undergone some kind of backdoor reset and needs to be | ||
10108 | * restored before we allow it to enable the bars. | ||
10109 | - * SR-IOV devices will trigger this, but we catch them later | ||
10110 | + * SR-IOV devices will trigger this - for mem enable let's | ||
10111 | + * catch this now and for io enable it will be caught later | ||
10112 | */ | ||
10113 | - if ((new_mem && virt_mem && !phys_mem) || | ||
10114 | + if ((new_mem && virt_mem && !phys_mem && | ||
10115 | + !pdev->no_command_memory) || | ||
10116 | (new_io && virt_io && !phys_io) || | ||
10117 | vfio_need_bar_restore(vdev)) | ||
10118 | vfio_bar_restore(vdev); | ||
10119 | @@ -1732,12 +1734,14 @@ int vfio_config_init(struct vfio_pci_device *vdev) | ||
10120 | vconfig[PCI_INTERRUPT_PIN]); | ||
10121 | |||
10122 | vconfig[PCI_INTERRUPT_PIN] = 0; /* Gratuitous for good VFs */ | ||
10123 | - | ||
10124 | + } | ||
10125 | + if (pdev->no_command_memory) { | ||
10126 | /* | ||
10127 | - * VFs do no implement the memory enable bit of the COMMAND | ||
10128 | - * register therefore we'll not have it set in our initial | ||
10129 | - * copy of config space after pci_enable_device(). For | ||
10130 | - * consistency with PFs, set the virtual enable bit here. | ||
10131 | + * VFs and devices that set pdev->no_command_memory do not | ||
10132 | + * implement the memory enable bit of the COMMAND register | ||
10133 | + * therefore we'll not have it set in our initial copy of | ||
10134 | + * config space after pci_enable_device(). For consistency | ||
10135 | + * with PFs, set the virtual enable bit here. | ||
10136 | */ | ||
10137 | *(__le16 *)&vconfig[PCI_COMMAND] |= | ||
10138 | cpu_to_le16(PCI_COMMAND_MEMORY); | ||
10139 | diff --git a/drivers/vfio/pci/vfio_pci_intrs.c b/drivers/vfio/pci/vfio_pci_intrs.c | ||
10140 | index 1d9fb25929459..869dce5f134dd 100644 | ||
10141 | --- a/drivers/vfio/pci/vfio_pci_intrs.c | ||
10142 | +++ b/drivers/vfio/pci/vfio_pci_intrs.c | ||
10143 | @@ -352,11 +352,13 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_device *vdev, | ||
10144 | vdev->ctx[vector].producer.token = trigger; | ||
10145 | vdev->ctx[vector].producer.irq = irq; | ||
10146 | ret = irq_bypass_register_producer(&vdev->ctx[vector].producer); | ||
10147 | - if (unlikely(ret)) | ||
10148 | + if (unlikely(ret)) { | ||
10149 | dev_info(&pdev->dev, | ||
10150 | "irq bypass producer (token %p) registration fails: %d\n", | ||
10151 | vdev->ctx[vector].producer.token, ret); | ||
10152 | |||
10153 | + vdev->ctx[vector].producer.token = NULL; | ||
10154 | + } | ||
10155 | vdev->ctx[vector].trigger = trigger; | ||
10156 | |||
10157 | return 0; | ||
10158 | diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c | ||
10159 | index c6220f57fdf3e..3b31e83a92155 100644 | ||
10160 | --- a/drivers/vfio/vfio_iommu_type1.c | ||
10161 | +++ b/drivers/vfio/vfio_iommu_type1.c | ||
10162 | @@ -631,7 +631,8 @@ static int vfio_iommu_type1_pin_pages(void *iommu_data, | ||
10163 | |||
10164 | ret = vfio_add_to_pfn_list(dma, iova, phys_pfn[i]); | ||
10165 | if (ret) { | ||
10166 | - vfio_unpin_page_external(dma, iova, do_accounting); | ||
10167 | + if (put_pfn(phys_pfn[i], dma->prot) && do_accounting) | ||
10168 | + vfio_lock_acct(dma, -1, true); | ||
10169 | goto pin_unwind; | ||
10170 | } | ||
10171 | } | ||
10172 | diff --git a/drivers/video/backlight/sky81452-backlight.c b/drivers/video/backlight/sky81452-backlight.c | ||
10173 | index 2355f00f57732..1f6301375fd33 100644 | ||
10174 | --- a/drivers/video/backlight/sky81452-backlight.c | ||
10175 | +++ b/drivers/video/backlight/sky81452-backlight.c | ||
10176 | @@ -196,6 +196,7 @@ static struct sky81452_bl_platform_data *sky81452_bl_parse_dt( | ||
10177 | num_entry); | ||
10178 | if (ret < 0) { | ||
10179 | dev_err(dev, "led-sources node is invalid.\n"); | ||
10180 | + of_node_put(np); | ||
10181 | return ERR_PTR(-EINVAL); | ||
10182 | } | ||
10183 | |||
10184 | diff --git a/drivers/video/fbdev/aty/radeon_base.c b/drivers/video/fbdev/aty/radeon_base.c | ||
10185 | index 4ca07866f2f66..5dda824d0da3f 100644 | ||
10186 | --- a/drivers/video/fbdev/aty/radeon_base.c | ||
10187 | +++ b/drivers/video/fbdev/aty/radeon_base.c | ||
10188 | @@ -2323,7 +2323,7 @@ static int radeonfb_pci_register(struct pci_dev *pdev, | ||
10189 | |||
10190 | ret = radeon_kick_out_firmware_fb(pdev); | ||
10191 | if (ret) | ||
10192 | - return ret; | ||
10193 | + goto err_release_fb; | ||
10194 | |||
10195 | /* request the mem regions */ | ||
10196 | ret = pci_request_region(pdev, 0, "radeonfb framebuffer"); | ||
10197 | diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c | ||
10198 | index 97abcd497c7e0..bf76dadbed87f 100644 | ||
10199 | --- a/drivers/video/fbdev/core/fbmem.c | ||
10200 | +++ b/drivers/video/fbdev/core/fbmem.c | ||
10201 | @@ -1001,6 +1001,10 @@ fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var) | ||
10202 | return 0; | ||
10203 | } | ||
10204 | |||
10205 | + /* bitfill_aligned() assumes that it's at least 8x8 */ | ||
10206 | + if (var->xres < 8 || var->yres < 8) | ||
10207 | + return -EINVAL; | ||
10208 | + | ||
10209 | ret = info->fbops->fb_check_var(var, info); | ||
10210 | |||
10211 | if (ret) | ||
10212 | diff --git a/drivers/video/fbdev/sis/init.c b/drivers/video/fbdev/sis/init.c | ||
10213 | index dfe3eb769638b..fde27feae5d0c 100644 | ||
10214 | --- a/drivers/video/fbdev/sis/init.c | ||
10215 | +++ b/drivers/video/fbdev/sis/init.c | ||
10216 | @@ -2428,6 +2428,11 @@ SiS_SetCRT1FIFO_630(struct SiS_Private *SiS_Pr, unsigned short ModeNo, | ||
10217 | |||
10218 | i = 0; | ||
10219 | |||
10220 | + if (SiS_Pr->ChipType == SIS_730) | ||
10221 | + queuedata = &FQBQData730[0]; | ||
10222 | + else | ||
10223 | + queuedata = &FQBQData[0]; | ||
10224 | + | ||
10225 | if(ModeNo > 0x13) { | ||
10226 | |||
10227 | /* Get VCLK */ | ||
10228 | @@ -2445,12 +2450,6 @@ SiS_SetCRT1FIFO_630(struct SiS_Private *SiS_Pr, unsigned short ModeNo, | ||
10229 | /* Get half colordepth */ | ||
10230 | colorth = colortharray[(SiS_Pr->SiS_ModeType - ModeEGA)]; | ||
10231 | |||
10232 | - if(SiS_Pr->ChipType == SIS_730) { | ||
10233 | - queuedata = &FQBQData730[0]; | ||
10234 | - } else { | ||
10235 | - queuedata = &FQBQData[0]; | ||
10236 | - } | ||
10237 | - | ||
10238 | do { | ||
10239 | templ = SiS_CalcDelay2(SiS_Pr, queuedata[i]) * VCLK * colorth; | ||
10240 | |||
10241 | diff --git a/drivers/video/fbdev/vga16fb.c b/drivers/video/fbdev/vga16fb.c | ||
10242 | index 4b83109202b1c..3c4d20618de4c 100644 | ||
10243 | --- a/drivers/video/fbdev/vga16fb.c | ||
10244 | +++ b/drivers/video/fbdev/vga16fb.c | ||
10245 | @@ -243,7 +243,7 @@ static void vga16fb_update_fix(struct fb_info *info) | ||
10246 | } | ||
10247 | |||
10248 | static void vga16fb_clock_chip(struct vga16fb_par *par, | ||
10249 | - unsigned int pixclock, | ||
10250 | + unsigned int *pixclock, | ||
10251 | const struct fb_info *info, | ||
10252 | int mul, int div) | ||
10253 | { | ||
10254 | @@ -259,14 +259,14 @@ static void vga16fb_clock_chip(struct vga16fb_par *par, | ||
10255 | { 0 /* bad */, 0x00, 0x00}}; | ||
10256 | int err; | ||
10257 | |||
10258 | - pixclock = (pixclock * mul) / div; | ||
10259 | + *pixclock = (*pixclock * mul) / div; | ||
10260 | best = vgaclocks; | ||
10261 | - err = pixclock - best->pixclock; | ||
10262 | + err = *pixclock - best->pixclock; | ||
10263 | if (err < 0) err = -err; | ||
10264 | for (ptr = vgaclocks + 1; ptr->pixclock; ptr++) { | ||
10265 | int tmp; | ||
10266 | |||
10267 | - tmp = pixclock - ptr->pixclock; | ||
10268 | + tmp = *pixclock - ptr->pixclock; | ||
10269 | if (tmp < 0) tmp = -tmp; | ||
10270 | if (tmp < err) { | ||
10271 | err = tmp; | ||
10272 | @@ -275,7 +275,7 @@ static void vga16fb_clock_chip(struct vga16fb_par *par, | ||
10273 | } | ||
10274 | par->misc |= best->misc; | ||
10275 | par->clkdiv = best->seq_clock_mode; | ||
10276 | - pixclock = (best->pixclock * div) / mul; | ||
10277 | + *pixclock = (best->pixclock * div) / mul; | ||
10278 | } | ||
10279 | |||
10280 | #define FAIL(X) return -EINVAL | ||
10281 | @@ -497,10 +497,10 @@ static int vga16fb_check_var(struct fb_var_screeninfo *var, | ||
10282 | |||
10283 | if (mode & MODE_8BPP) | ||
10284 | /* pixel clock == vga clock / 2 */ | ||
10285 | - vga16fb_clock_chip(par, var->pixclock, info, 1, 2); | ||
10286 | + vga16fb_clock_chip(par, &var->pixclock, info, 1, 2); | ||
10287 | else | ||
10288 | /* pixel clock == vga clock */ | ||
10289 | - vga16fb_clock_chip(par, var->pixclock, info, 1, 1); | ||
10290 | + vga16fb_clock_chip(par, &var->pixclock, info, 1, 1); | ||
10291 | |||
10292 | var->red.offset = var->green.offset = var->blue.offset = | ||
10293 | var->transp.offset = 0; | ||
10294 | diff --git a/drivers/virt/fsl_hypervisor.c b/drivers/virt/fsl_hypervisor.c | ||
10295 | index 93d5bebf9572a..fb292f9cf29df 100644 | ||
10296 | --- a/drivers/virt/fsl_hypervisor.c | ||
10297 | +++ b/drivers/virt/fsl_hypervisor.c | ||
10298 | @@ -157,7 +157,7 @@ static long ioctl_memcpy(struct fsl_hv_ioctl_memcpy __user *p) | ||
10299 | |||
10300 | unsigned int i; | ||
10301 | long ret = 0; | ||
10302 | - int num_pinned; /* return value from get_user_pages() */ | ||
10303 | + int num_pinned = 0; /* return value from get_user_pages_fast() */ | ||
10304 | phys_addr_t remote_paddr; /* The next address in the remote buffer */ | ||
10305 | uint32_t count; /* The number of bytes left to copy */ | ||
10306 | |||
10307 | @@ -174,7 +174,7 @@ static long ioctl_memcpy(struct fsl_hv_ioctl_memcpy __user *p) | ||
10308 | return -EINVAL; | ||
10309 | |||
10310 | /* | ||
10311 | - * The array of pages returned by get_user_pages() covers only | ||
10312 | + * The array of pages returned by get_user_pages_fast() covers only | ||
10313 | * page-aligned memory. Since the user buffer is probably not | ||
10314 | * page-aligned, we need to handle the discrepancy. | ||
10315 | * | ||
10316 | @@ -224,7 +224,7 @@ static long ioctl_memcpy(struct fsl_hv_ioctl_memcpy __user *p) | ||
10317 | |||
10318 | /* | ||
10319 | * 'pages' is an array of struct page pointers that's initialized by | ||
10320 | - * get_user_pages(). | ||
10321 | + * get_user_pages_fast(). | ||
10322 | */ | ||
10323 | pages = kcalloc(num_pages, sizeof(struct page *), GFP_KERNEL); | ||
10324 | if (!pages) { | ||
10325 | @@ -241,7 +241,7 @@ static long ioctl_memcpy(struct fsl_hv_ioctl_memcpy __user *p) | ||
10326 | if (!sg_list_unaligned) { | ||
10327 | pr_debug("fsl-hv: could not allocate S/G list\n"); | ||
10328 | ret = -ENOMEM; | ||
10329 | - goto exit; | ||
10330 | + goto free_pages; | ||
10331 | } | ||
10332 | sg_list = PTR_ALIGN(sg_list_unaligned, sizeof(struct fh_sg_list)); | ||
10333 | |||
10334 | @@ -250,7 +250,6 @@ static long ioctl_memcpy(struct fsl_hv_ioctl_memcpy __user *p) | ||
10335 | num_pages, param.source != -1 ? FOLL_WRITE : 0, pages); | ||
10336 | |||
10337 | if (num_pinned != num_pages) { | ||
10338 | - /* get_user_pages() failed */ | ||
10339 | pr_debug("fsl-hv: could not lock source buffer\n"); | ||
10340 | ret = (num_pinned < 0) ? num_pinned : -EFAULT; | ||
10341 | goto exit; | ||
10342 | @@ -292,13 +291,13 @@ static long ioctl_memcpy(struct fsl_hv_ioctl_memcpy __user *p) | ||
10343 | virt_to_phys(sg_list), num_pages); | ||
10344 | |||
10345 | exit: | ||
10346 | - if (pages) { | ||
10347 | - for (i = 0; i < num_pages; i++) | ||
10348 | - if (pages[i]) | ||
10349 | - put_page(pages[i]); | ||
10350 | + if (pages && (num_pinned > 0)) { | ||
10351 | + for (i = 0; i < num_pinned; i++) | ||
10352 | + put_page(pages[i]); | ||
10353 | } | ||
10354 | |||
10355 | kfree(sg_list_unaligned); | ||
10356 | +free_pages: | ||
10357 | kfree(pages); | ||
10358 | |||
10359 | if (!ret) | ||
10360 | diff --git a/drivers/watchdog/sp5100_tco.h b/drivers/watchdog/sp5100_tco.h | ||
10361 | index 87eaf357ae01f..adf015aa4126f 100644 | ||
10362 | --- a/drivers/watchdog/sp5100_tco.h | ||
10363 | +++ b/drivers/watchdog/sp5100_tco.h | ||
10364 | @@ -70,7 +70,7 @@ | ||
10365 | #define EFCH_PM_DECODEEN_WDT_TMREN BIT(7) | ||
10366 | |||
10367 | |||
10368 | -#define EFCH_PM_DECODEEN3 0x00 | ||
10369 | +#define EFCH_PM_DECODEEN3 0x03 | ||
10370 | #define EFCH_PM_DECODEEN_SECOND_RES GENMASK(1, 0) | ||
10371 | #define EFCH_PM_WATCHDOG_DISABLE ((u8)GENMASK(3, 2)) | ||
10372 | |||
10373 | diff --git a/drivers/watchdog/watchdog_dev.c b/drivers/watchdog/watchdog_dev.c | ||
10374 | index 3729f99fd8eca..8494846ccdc5f 100644 | ||
10375 | --- a/drivers/watchdog/watchdog_dev.c | ||
10376 | +++ b/drivers/watchdog/watchdog_dev.c | ||
10377 | @@ -971,8 +971,10 @@ static int watchdog_cdev_register(struct watchdog_device *wdd) | ||
10378 | wd_data->wdd = wdd; | ||
10379 | wdd->wd_data = wd_data; | ||
10380 | |||
10381 | - if (IS_ERR_OR_NULL(watchdog_kworker)) | ||
10382 | + if (IS_ERR_OR_NULL(watchdog_kworker)) { | ||
10383 | + kfree(wd_data); | ||
10384 | return -ENODEV; | ||
10385 | + } | ||
10386 | |||
10387 | device_initialize(&wd_data->dev); | ||
10388 | wd_data->dev.devt = MKDEV(MAJOR(watchdog_devt), wdd->id); | ||
10389 | @@ -998,7 +1000,7 @@ static int watchdog_cdev_register(struct watchdog_device *wdd) | ||
10390 | pr_err("%s: a legacy watchdog module is probably present.\n", | ||
10391 | wdd->info->identity); | ||
10392 | old_wd_data = NULL; | ||
10393 | - kfree(wd_data); | ||
10394 | + put_device(&wd_data->dev); | ||
10395 | return err; | ||
10396 | } | ||
10397 | } | ||
10398 | diff --git a/fs/cifs/asn1.c b/fs/cifs/asn1.c | ||
10399 | index 689162e2e1755..3150c19cdc2fb 100644 | ||
10400 | --- a/fs/cifs/asn1.c | ||
10401 | +++ b/fs/cifs/asn1.c | ||
10402 | @@ -530,8 +530,8 @@ decode_negTokenInit(unsigned char *security_blob, int length, | ||
10403 | return 0; | ||
10404 | } else if ((cls != ASN1_CTX) || (con != ASN1_CON) | ||
10405 | || (tag != ASN1_EOC)) { | ||
10406 | - cifs_dbg(FYI, "cls = %d con = %d tag = %d end = %p (%d) exit 0\n", | ||
10407 | - cls, con, tag, end, *end); | ||
10408 | + cifs_dbg(FYI, "cls = %d con = %d tag = %d end = %p exit 0\n", | ||
10409 | + cls, con, tag, end); | ||
10410 | return 0; | ||
10411 | } | ||
10412 | |||
10413 | @@ -541,8 +541,8 @@ decode_negTokenInit(unsigned char *security_blob, int length, | ||
10414 | return 0; | ||
10415 | } else if ((cls != ASN1_UNI) || (con != ASN1_CON) | ||
10416 | || (tag != ASN1_SEQ)) { | ||
10417 | - cifs_dbg(FYI, "cls = %d con = %d tag = %d end = %p (%d) exit 1\n", | ||
10418 | - cls, con, tag, end, *end); | ||
10419 | + cifs_dbg(FYI, "cls = %d con = %d tag = %d end = %p exit 1\n", | ||
10420 | + cls, con, tag, end); | ||
10421 | return 0; | ||
10422 | } | ||
10423 | |||
10424 | @@ -552,8 +552,8 @@ decode_negTokenInit(unsigned char *security_blob, int length, | ||
10425 | return 0; | ||
10426 | } else if ((cls != ASN1_CTX) || (con != ASN1_CON) | ||
10427 | || (tag != ASN1_EOC)) { | ||
10428 | - cifs_dbg(FYI, "cls = %d con = %d tag = %d end = %p (%d) exit 0\n", | ||
10429 | - cls, con, tag, end, *end); | ||
10430 | + cifs_dbg(FYI, "cls = %d con = %d tag = %d end = %p exit 0\n", | ||
10431 | + cls, con, tag, end); | ||
10432 | return 0; | ||
10433 | } | ||
10434 | |||
10435 | @@ -564,8 +564,8 @@ decode_negTokenInit(unsigned char *security_blob, int length, | ||
10436 | return 0; | ||
10437 | } else if ((cls != ASN1_UNI) || (con != ASN1_CON) | ||
10438 | || (tag != ASN1_SEQ)) { | ||
10439 | - cifs_dbg(FYI, "cls = %d con = %d tag = %d end = %p (%d) exit 1\n", | ||
10440 | - cls, con, tag, end, *end); | ||
10441 | + cifs_dbg(FYI, "cls = %d con = %d tag = %d sequence_end = %p exit 1\n", | ||
10442 | + cls, con, tag, sequence_end); | ||
10443 | return 0; | ||
10444 | } | ||
10445 | |||
10446 | diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c | ||
10447 | index 9a89e5f7c4da3..776029a57e717 100644 | ||
10448 | --- a/fs/cifs/smb2ops.c | ||
10449 | +++ b/fs/cifs/smb2ops.c | ||
10450 | @@ -3707,7 +3707,7 @@ crypt_message(struct TCP_Server_Info *server, int num_rqst, | ||
10451 | if (rc) { | ||
10452 | cifs_server_dbg(VFS, "%s: Could not get %scryption key\n", __func__, | ||
10453 | enc ? "en" : "de"); | ||
10454 | - return 0; | ||
10455 | + return rc; | ||
10456 | } | ||
10457 | |||
10458 | rc = smb3_crypto_aead_allocate(server); | ||
10459 | @@ -3886,7 +3886,8 @@ smb3_is_transform_hdr(void *buf) | ||
10460 | static int | ||
10461 | decrypt_raw_data(struct TCP_Server_Info *server, char *buf, | ||
10462 | unsigned int buf_data_size, struct page **pages, | ||
10463 | - unsigned int npages, unsigned int page_data_size) | ||
10464 | + unsigned int npages, unsigned int page_data_size, | ||
10465 | + bool is_offloaded) | ||
10466 | { | ||
10467 | struct kvec iov[2]; | ||
10468 | struct smb_rqst rqst = {NULL}; | ||
10469 | @@ -3912,7 +3913,8 @@ decrypt_raw_data(struct TCP_Server_Info *server, char *buf, | ||
10470 | |||
10471 | memmove(buf, iov[1].iov_base, buf_data_size); | ||
10472 | |||
10473 | - server->total_read = buf_data_size + page_data_size; | ||
10474 | + if (!is_offloaded) | ||
10475 | + server->total_read = buf_data_size + page_data_size; | ||
10476 | |||
10477 | return rc; | ||
10478 | } | ||
10479 | @@ -4126,7 +4128,7 @@ static void smb2_decrypt_offload(struct work_struct *work) | ||
10480 | struct mid_q_entry *mid; | ||
10481 | |||
10482 | rc = decrypt_raw_data(dw->server, dw->buf, dw->server->vals->read_rsp_size, | ||
10483 | - dw->ppages, dw->npages, dw->len); | ||
10484 | + dw->ppages, dw->npages, dw->len, true); | ||
10485 | if (rc) { | ||
10486 | cifs_dbg(VFS, "error decrypting rc=%d\n", rc); | ||
10487 | goto free_pages; | ||
10488 | @@ -4232,7 +4234,7 @@ receive_encrypted_read(struct TCP_Server_Info *server, struct mid_q_entry **mid, | ||
10489 | |||
10490 | non_offloaded_decrypt: | ||
10491 | rc = decrypt_raw_data(server, buf, server->vals->read_rsp_size, | ||
10492 | - pages, npages, len); | ||
10493 | + pages, npages, len, false); | ||
10494 | if (rc) | ||
10495 | goto free_pages; | ||
10496 | |||
10497 | @@ -4288,7 +4290,7 @@ receive_encrypted_standard(struct TCP_Server_Info *server, | ||
10498 | server->total_read += length; | ||
10499 | |||
10500 | buf_size = pdu_length - sizeof(struct smb2_transform_hdr); | ||
10501 | - length = decrypt_raw_data(server, buf, buf_size, NULL, 0, 0); | ||
10502 | + length = decrypt_raw_data(server, buf, buf_size, NULL, 0, 0, false); | ||
10503 | if (length) | ||
10504 | return length; | ||
10505 | |||
10506 | diff --git a/fs/d_path.c b/fs/d_path.c | ||
10507 | index 0f1fc1743302f..a69e2cd36e6e3 100644 | ||
10508 | --- a/fs/d_path.c | ||
10509 | +++ b/fs/d_path.c | ||
10510 | @@ -102,6 +102,8 @@ restart: | ||
10511 | |||
10512 | if (dentry == vfsmnt->mnt_root || IS_ROOT(dentry)) { | ||
10513 | struct mount *parent = READ_ONCE(mnt->mnt_parent); | ||
10514 | + struct mnt_namespace *mnt_ns; | ||
10515 | + | ||
10516 | /* Escaped? */ | ||
10517 | if (dentry != vfsmnt->mnt_root) { | ||
10518 | bptr = *buffer; | ||
10519 | @@ -116,7 +118,9 @@ restart: | ||
10520 | vfsmnt = &mnt->mnt; | ||
10521 | continue; | ||
10522 | } | ||
10523 | - if (is_mounted(vfsmnt) && !is_anon_ns(mnt->mnt_ns)) | ||
10524 | + mnt_ns = READ_ONCE(mnt->mnt_ns); | ||
10525 | + /* open-coded is_mounted() to use local mnt_ns */ | ||
10526 | + if (!IS_ERR_OR_NULL(mnt_ns) && !is_anon_ns(mnt_ns)) | ||
10527 | error = 1; // absolute root | ||
10528 | else | ||
10529 | error = 2; // detached or not attached yet | ||
10530 | diff --git a/fs/dlm/config.c b/fs/dlm/config.c | ||
10531 | index 3b21082e1b550..3b1012a3c4396 100644 | ||
10532 | --- a/fs/dlm/config.c | ||
10533 | +++ b/fs/dlm/config.c | ||
10534 | @@ -216,6 +216,7 @@ struct dlm_space { | ||
10535 | struct list_head members; | ||
10536 | struct mutex members_lock; | ||
10537 | int members_count; | ||
10538 | + struct dlm_nodes *nds; | ||
10539 | }; | ||
10540 | |||
10541 | struct dlm_comms { | ||
10542 | @@ -424,6 +425,7 @@ static struct config_group *make_space(struct config_group *g, const char *name) | ||
10543 | INIT_LIST_HEAD(&sp->members); | ||
10544 | mutex_init(&sp->members_lock); | ||
10545 | sp->members_count = 0; | ||
10546 | + sp->nds = nds; | ||
10547 | return &sp->group; | ||
10548 | |||
10549 | fail: | ||
10550 | @@ -445,6 +447,7 @@ static void drop_space(struct config_group *g, struct config_item *i) | ||
10551 | static void release_space(struct config_item *i) | ||
10552 | { | ||
10553 | struct dlm_space *sp = config_item_to_space(i); | ||
10554 | + kfree(sp->nds); | ||
10555 | kfree(sp); | ||
10556 | } | ||
10557 | |||
10558 | diff --git a/fs/ext4/fsmap.c b/fs/ext4/fsmap.c | ||
10559 | index dbccf46f17709..37347ba868b70 100644 | ||
10560 | --- a/fs/ext4/fsmap.c | ||
10561 | +++ b/fs/ext4/fsmap.c | ||
10562 | @@ -108,6 +108,9 @@ static int ext4_getfsmap_helper(struct super_block *sb, | ||
10563 | |||
10564 | /* Are we just counting mappings? */ | ||
10565 | if (info->gfi_head->fmh_count == 0) { | ||
10566 | + if (info->gfi_head->fmh_entries == UINT_MAX) | ||
10567 | + return EXT4_QUERY_RANGE_ABORT; | ||
10568 | + | ||
10569 | if (rec_fsblk > info->gfi_next_fsblk) | ||
10570 | info->gfi_head->fmh_entries++; | ||
10571 | |||
10572 | diff --git a/fs/f2fs/sysfs.c b/fs/f2fs/sysfs.c | ||
10573 | index 170934430d7d7..029e693e201cf 100644 | ||
10574 | --- a/fs/f2fs/sysfs.c | ||
10575 | +++ b/fs/f2fs/sysfs.c | ||
10576 | @@ -788,4 +788,5 @@ void f2fs_unregister_sysfs(struct f2fs_sb_info *sbi) | ||
10577 | } | ||
10578 | kobject_del(&sbi->s_kobj); | ||
10579 | kobject_put(&sbi->s_kobj); | ||
10580 | + wait_for_completion(&sbi->s_kobj_unregister); | ||
10581 | } | ||
10582 | diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c | ||
10583 | index a30ea7ecb790a..80867a1a94f26 100644 | ||
10584 | --- a/fs/iomap/buffered-io.c | ||
10585 | +++ b/fs/iomap/buffered-io.c | ||
10586 | @@ -559,6 +559,7 @@ __iomap_write_begin(struct inode *inode, loff_t pos, unsigned len, | ||
10587 | |||
10588 | if (PageUptodate(page)) | ||
10589 | return 0; | ||
10590 | + ClearPageError(page); | ||
10591 | |||
10592 | do { | ||
10593 | iomap_adjust_read_range(inode, iop, &block_start, | ||
10594 | diff --git a/fs/iomap/direct-io.c b/fs/iomap/direct-io.c | ||
10595 | index 7b5f76efef02d..8c98fd92bf665 100644 | ||
10596 | --- a/fs/iomap/direct-io.c | ||
10597 | +++ b/fs/iomap/direct-io.c | ||
10598 | @@ -377,6 +377,16 @@ iomap_dio_actor(struct inode *inode, loff_t pos, loff_t length, | ||
10599 | return iomap_dio_bio_actor(inode, pos, length, dio, iomap); | ||
10600 | case IOMAP_INLINE: | ||
10601 | return iomap_dio_inline_actor(inode, pos, length, dio, iomap); | ||
10602 | + case IOMAP_DELALLOC: | ||
10603 | + /* | ||
10604 | + * DIO is not serialised against mmap() access at all, and so | ||
10605 | + * if the page_mkwrite occurs between the writeback and the | ||
10606 | + * iomap_apply() call in the DIO path, then it will see the | ||
10607 | + * DELALLOC block that the page-mkwrite allocated. | ||
10608 | + */ | ||
10609 | + pr_warn_ratelimited("Direct I/O collision with buffered writes! File: %pD4 Comm: %.20s\n", | ||
10610 | + dio->iocb->ki_filp, current->comm); | ||
10611 | + return -EIO; | ||
10612 | default: | ||
10613 | WARN_ON_ONCE(1); | ||
10614 | return -EIO; | ||
10615 | diff --git a/fs/ntfs/inode.c b/fs/ntfs/inode.c | ||
10616 | index d4359a1df3d5e..84933a0af49b6 100644 | ||
10617 | --- a/fs/ntfs/inode.c | ||
10618 | +++ b/fs/ntfs/inode.c | ||
10619 | @@ -1809,6 +1809,12 @@ int ntfs_read_inode_mount(struct inode *vi) | ||
10620 | brelse(bh); | ||
10621 | } | ||
10622 | |||
10623 | + if (le32_to_cpu(m->bytes_allocated) != vol->mft_record_size) { | ||
10624 | + ntfs_error(sb, "Incorrect mft record size %u in superblock, should be %u.", | ||
10625 | + le32_to_cpu(m->bytes_allocated), vol->mft_record_size); | ||
10626 | + goto err_out; | ||
10627 | + } | ||
10628 | + | ||
10629 | /* Apply the mst fixups. */ | ||
10630 | if (post_read_mst_fixup((NTFS_RECORD*)m, vol->mft_record_size)) { | ||
10631 | /* FIXME: Try to use the $MFTMirr now. */ | ||
10632 | diff --git a/fs/proc/base.c b/fs/proc/base.c | ||
10633 | index 529d0c6ec6f9c..b690074e65ffa 100644 | ||
10634 | --- a/fs/proc/base.c | ||
10635 | +++ b/fs/proc/base.c | ||
10636 | @@ -1036,7 +1036,6 @@ static ssize_t oom_adj_read(struct file *file, char __user *buf, size_t count, | ||
10637 | |||
10638 | static int __set_oom_adj(struct file *file, int oom_adj, bool legacy) | ||
10639 | { | ||
10640 | - static DEFINE_MUTEX(oom_adj_mutex); | ||
10641 | struct mm_struct *mm = NULL; | ||
10642 | struct task_struct *task; | ||
10643 | int err = 0; | ||
10644 | @@ -1076,7 +1075,7 @@ static int __set_oom_adj(struct file *file, int oom_adj, bool legacy) | ||
10645 | struct task_struct *p = find_lock_task_mm(task); | ||
10646 | |||
10647 | if (p) { | ||
10648 | - if (atomic_read(&p->mm->mm_users) > 1) { | ||
10649 | + if (test_bit(MMF_MULTIPROCESS, &p->mm->flags)) { | ||
10650 | mm = p->mm; | ||
10651 | mmgrab(mm); | ||
10652 | } | ||
10653 | diff --git a/fs/quota/quota_v2.c b/fs/quota/quota_v2.c | ||
10654 | index 53429c29c7842..276c27fb99280 100644 | ||
10655 | --- a/fs/quota/quota_v2.c | ||
10656 | +++ b/fs/quota/quota_v2.c | ||
10657 | @@ -284,6 +284,7 @@ static void v2r1_mem2diskdqb(void *dp, struct dquot *dquot) | ||
10658 | d->dqb_curspace = cpu_to_le64(m->dqb_curspace); | ||
10659 | d->dqb_btime = cpu_to_le64(m->dqb_btime); | ||
10660 | d->dqb_id = cpu_to_le32(from_kqid(&init_user_ns, dquot->dq_id)); | ||
10661 | + d->dqb_pad = 0; | ||
10662 | if (qtree_entry_unused(info, dp)) | ||
10663 | d->dqb_itime = cpu_to_le64(1); | ||
10664 | } | ||
10665 | diff --git a/fs/ramfs/file-nommu.c b/fs/ramfs/file-nommu.c | ||
10666 | index 4146954549560..355523f4a4bf3 100644 | ||
10667 | --- a/fs/ramfs/file-nommu.c | ||
10668 | +++ b/fs/ramfs/file-nommu.c | ||
10669 | @@ -224,7 +224,7 @@ static unsigned long ramfs_nommu_get_unmapped_area(struct file *file, | ||
10670 | if (!pages) | ||
10671 | goto out_free; | ||
10672 | |||
10673 | - nr = find_get_pages(inode->i_mapping, &pgoff, lpages, pages); | ||
10674 | + nr = find_get_pages_contig(inode->i_mapping, pgoff, lpages, pages); | ||
10675 | if (nr != lpages) | ||
10676 | goto out_free_pages; /* leave if some pages were missing */ | ||
10677 | |||
10678 | diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c | ||
10679 | index 70387650436cf..ac35ddf0dd603 100644 | ||
10680 | --- a/fs/reiserfs/inode.c | ||
10681 | +++ b/fs/reiserfs/inode.c | ||
10682 | @@ -2161,7 +2161,8 @@ out_end_trans: | ||
10683 | out_inserted_sd: | ||
10684 | clear_nlink(inode); | ||
10685 | th->t_trans_id = 0; /* so the caller can't use this handle later */ | ||
10686 | - unlock_new_inode(inode); /* OK to do even if we hadn't locked it */ | ||
10687 | + if (inode->i_state & I_NEW) | ||
10688 | + unlock_new_inode(inode); | ||
10689 | iput(inode); | ||
10690 | return err; | ||
10691 | } | ||
10692 | diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c | ||
10693 | index a6bce5b1fb1dc..1b9c7a387dc71 100644 | ||
10694 | --- a/fs/reiserfs/super.c | ||
10695 | +++ b/fs/reiserfs/super.c | ||
10696 | @@ -1258,6 +1258,10 @@ static int reiserfs_parse_options(struct super_block *s, | ||
10697 | "turned on."); | ||
10698 | return 0; | ||
10699 | } | ||
10700 | + if (qf_names[qtype] != | ||
10701 | + REISERFS_SB(s)->s_qf_names[qtype]) | ||
10702 | + kfree(qf_names[qtype]); | ||
10703 | + qf_names[qtype] = NULL; | ||
10704 | if (*arg) { /* Some filename specified? */ | ||
10705 | if (REISERFS_SB(s)->s_qf_names[qtype] | ||
10706 | && strcmp(REISERFS_SB(s)->s_qf_names[qtype], | ||
10707 | @@ -1287,10 +1291,6 @@ static int reiserfs_parse_options(struct super_block *s, | ||
10708 | else | ||
10709 | *mount_options |= 1 << REISERFS_GRPQUOTA; | ||
10710 | } else { | ||
10711 | - if (qf_names[qtype] != | ||
10712 | - REISERFS_SB(s)->s_qf_names[qtype]) | ||
10713 | - kfree(qf_names[qtype]); | ||
10714 | - qf_names[qtype] = NULL; | ||
10715 | if (qtype == USRQUOTA) | ||
10716 | *mount_options &= ~(1 << REISERFS_USRQUOTA); | ||
10717 | else | ||
10718 | diff --git a/fs/udf/inode.c b/fs/udf/inode.c | ||
10719 | index ea80036d7897b..97a192eb9949c 100644 | ||
10720 | --- a/fs/udf/inode.c | ||
10721 | +++ b/fs/udf/inode.c | ||
10722 | @@ -139,21 +139,24 @@ void udf_evict_inode(struct inode *inode) | ||
10723 | struct udf_inode_info *iinfo = UDF_I(inode); | ||
10724 | int want_delete = 0; | ||
10725 | |||
10726 | - if (!inode->i_nlink && !is_bad_inode(inode)) { | ||
10727 | - want_delete = 1; | ||
10728 | - udf_setsize(inode, 0); | ||
10729 | - udf_update_inode(inode, IS_SYNC(inode)); | ||
10730 | + if (!is_bad_inode(inode)) { | ||
10731 | + if (!inode->i_nlink) { | ||
10732 | + want_delete = 1; | ||
10733 | + udf_setsize(inode, 0); | ||
10734 | + udf_update_inode(inode, IS_SYNC(inode)); | ||
10735 | + } | ||
10736 | + if (iinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB && | ||
10737 | + inode->i_size != iinfo->i_lenExtents) { | ||
10738 | + udf_warn(inode->i_sb, | ||
10739 | + "Inode %lu (mode %o) has inode size %llu different from extent length %llu. Filesystem need not be standards compliant.\n", | ||
10740 | + inode->i_ino, inode->i_mode, | ||
10741 | + (unsigned long long)inode->i_size, | ||
10742 | + (unsigned long long)iinfo->i_lenExtents); | ||
10743 | + } | ||
10744 | } | ||
10745 | truncate_inode_pages_final(&inode->i_data); | ||
10746 | invalidate_inode_buffers(inode); | ||
10747 | clear_inode(inode); | ||
10748 | - if (iinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB && | ||
10749 | - inode->i_size != iinfo->i_lenExtents) { | ||
10750 | - udf_warn(inode->i_sb, "Inode %lu (mode %o) has inode size %llu different from extent length %llu. Filesystem need not be standards compliant.\n", | ||
10751 | - inode->i_ino, inode->i_mode, | ||
10752 | - (unsigned long long)inode->i_size, | ||
10753 | - (unsigned long long)iinfo->i_lenExtents); | ||
10754 | - } | ||
10755 | kfree(iinfo->i_ext.i_data); | ||
10756 | iinfo->i_ext.i_data = NULL; | ||
10757 | udf_clear_extent_cache(inode); | ||
10758 | diff --git a/fs/udf/super.c b/fs/udf/super.c | ||
10759 | index 4baa1ca91e9be..a0cd766b41cdb 100644 | ||
10760 | --- a/fs/udf/super.c | ||
10761 | +++ b/fs/udf/super.c | ||
10762 | @@ -1352,6 +1352,12 @@ static int udf_load_sparable_map(struct super_block *sb, | ||
10763 | (int)spm->numSparingTables); | ||
10764 | return -EIO; | ||
10765 | } | ||
10766 | + if (le32_to_cpu(spm->sizeSparingTable) > sb->s_blocksize) { | ||
10767 | + udf_err(sb, "error loading logical volume descriptor: " | ||
10768 | + "Too big sparing table size (%u)\n", | ||
10769 | + le32_to_cpu(spm->sizeSparingTable)); | ||
10770 | + return -EIO; | ||
10771 | + } | ||
10772 | |||
10773 | for (i = 0; i < spm->numSparingTables; i++) { | ||
10774 | loc = le32_to_cpu(spm->locSparingTable[i]); | ||
10775 | diff --git a/fs/xfs/libxfs/xfs_rtbitmap.c b/fs/xfs/libxfs/xfs_rtbitmap.c | ||
10776 | index 8ea1efc97b41d..42085e70c01ac 100644 | ||
10777 | --- a/fs/xfs/libxfs/xfs_rtbitmap.c | ||
10778 | +++ b/fs/xfs/libxfs/xfs_rtbitmap.c | ||
10779 | @@ -1018,7 +1018,6 @@ xfs_rtalloc_query_range( | ||
10780 | struct xfs_mount *mp = tp->t_mountp; | ||
10781 | xfs_rtblock_t rtstart; | ||
10782 | xfs_rtblock_t rtend; | ||
10783 | - xfs_rtblock_t rem; | ||
10784 | int is_free; | ||
10785 | int error = 0; | ||
10786 | |||
10787 | @@ -1027,13 +1026,12 @@ xfs_rtalloc_query_range( | ||
10788 | if (low_rec->ar_startext >= mp->m_sb.sb_rextents || | ||
10789 | low_rec->ar_startext == high_rec->ar_startext) | ||
10790 | return 0; | ||
10791 | - if (high_rec->ar_startext > mp->m_sb.sb_rextents) | ||
10792 | - high_rec->ar_startext = mp->m_sb.sb_rextents; | ||
10793 | + high_rec->ar_startext = min(high_rec->ar_startext, | ||
10794 | + mp->m_sb.sb_rextents - 1); | ||
10795 | |||
10796 | /* Iterate the bitmap, looking for discrepancies. */ | ||
10797 | rtstart = low_rec->ar_startext; | ||
10798 | - rem = high_rec->ar_startext - rtstart; | ||
10799 | - while (rem) { | ||
10800 | + while (rtstart <= high_rec->ar_startext) { | ||
10801 | /* Is the first block free? */ | ||
10802 | error = xfs_rtcheck_range(mp, tp, rtstart, 1, 1, &rtend, | ||
10803 | &is_free); | ||
10804 | @@ -1042,7 +1040,7 @@ xfs_rtalloc_query_range( | ||
10805 | |||
10806 | /* How long does the extent go for? */ | ||
10807 | error = xfs_rtfind_forw(mp, tp, rtstart, | ||
10808 | - high_rec->ar_startext - 1, &rtend); | ||
10809 | + high_rec->ar_startext, &rtend); | ||
10810 | if (error) | ||
10811 | break; | ||
10812 | |||
10813 | @@ -1055,7 +1053,6 @@ xfs_rtalloc_query_range( | ||
10814 | break; | ||
10815 | } | ||
10816 | |||
10817 | - rem -= rtend - rtstart + 1; | ||
10818 | rtstart = rtend + 1; | ||
10819 | } | ||
10820 | |||
10821 | diff --git a/fs/xfs/xfs_fsmap.c b/fs/xfs/xfs_fsmap.c | ||
10822 | index c13754e119be1..01c0933a4d10d 100644 | ||
10823 | --- a/fs/xfs/xfs_fsmap.c | ||
10824 | +++ b/fs/xfs/xfs_fsmap.c | ||
10825 | @@ -26,7 +26,7 @@ | ||
10826 | #include "xfs_rtalloc.h" | ||
10827 | |||
10828 | /* Convert an xfs_fsmap to an fsmap. */ | ||
10829 | -void | ||
10830 | +static void | ||
10831 | xfs_fsmap_from_internal( | ||
10832 | struct fsmap *dest, | ||
10833 | struct xfs_fsmap *src) | ||
10834 | @@ -154,8 +154,7 @@ xfs_fsmap_owner_from_rmap( | ||
10835 | /* getfsmap query state */ | ||
10836 | struct xfs_getfsmap_info { | ||
10837 | struct xfs_fsmap_head *head; | ||
10838 | - xfs_fsmap_format_t formatter; /* formatting fn */ | ||
10839 | - void *format_arg; /* format buffer */ | ||
10840 | + struct fsmap *fsmap_recs; /* mapping records */ | ||
10841 | struct xfs_buf *agf_bp; /* AGF, for refcount queries */ | ||
10842 | xfs_daddr_t next_daddr; /* next daddr we expect */ | ||
10843 | u64 missing_owner; /* owner of holes */ | ||
10844 | @@ -223,6 +222,20 @@ xfs_getfsmap_is_shared( | ||
10845 | return 0; | ||
10846 | } | ||
10847 | |||
10848 | +static inline void | ||
10849 | +xfs_getfsmap_format( | ||
10850 | + struct xfs_mount *mp, | ||
10851 | + struct xfs_fsmap *xfm, | ||
10852 | + struct xfs_getfsmap_info *info) | ||
10853 | +{ | ||
10854 | + struct fsmap *rec; | ||
10855 | + | ||
10856 | + trace_xfs_getfsmap_mapping(mp, xfm); | ||
10857 | + | ||
10858 | + rec = &info->fsmap_recs[info->head->fmh_entries++]; | ||
10859 | + xfs_fsmap_from_internal(rec, xfm); | ||
10860 | +} | ||
10861 | + | ||
10862 | /* | ||
10863 | * Format a reverse mapping for getfsmap, having translated rm_startblock | ||
10864 | * into the appropriate daddr units. | ||
10865 | @@ -255,6 +268,9 @@ xfs_getfsmap_helper( | ||
10866 | |||
10867 | /* Are we just counting mappings? */ | ||
10868 | if (info->head->fmh_count == 0) { | ||
10869 | + if (info->head->fmh_entries == UINT_MAX) | ||
10870 | + return -ECANCELED; | ||
10871 | + | ||
10872 | if (rec_daddr > info->next_daddr) | ||
10873 | info->head->fmh_entries++; | ||
10874 | |||
10875 | @@ -284,10 +300,7 @@ xfs_getfsmap_helper( | ||
10876 | fmr.fmr_offset = 0; | ||
10877 | fmr.fmr_length = rec_daddr - info->next_daddr; | ||
10878 | fmr.fmr_flags = FMR_OF_SPECIAL_OWNER; | ||
10879 | - error = info->formatter(&fmr, info->format_arg); | ||
10880 | - if (error) | ||
10881 | - return error; | ||
10882 | - info->head->fmh_entries++; | ||
10883 | + xfs_getfsmap_format(mp, &fmr, info); | ||
10884 | } | ||
10885 | |||
10886 | if (info->last) | ||
10887 | @@ -319,11 +332,8 @@ xfs_getfsmap_helper( | ||
10888 | if (shared) | ||
10889 | fmr.fmr_flags |= FMR_OF_SHARED; | ||
10890 | } | ||
10891 | - error = info->formatter(&fmr, info->format_arg); | ||
10892 | - if (error) | ||
10893 | - return error; | ||
10894 | - info->head->fmh_entries++; | ||
10895 | |||
10896 | + xfs_getfsmap_format(mp, &fmr, info); | ||
10897 | out: | ||
10898 | rec_daddr += XFS_FSB_TO_BB(mp, rec->rm_blockcount); | ||
10899 | if (info->next_daddr < rec_daddr) | ||
10900 | @@ -791,11 +801,11 @@ xfs_getfsmap_check_keys( | ||
10901 | #endif /* CONFIG_XFS_RT */ | ||
10902 | |||
10903 | /* | ||
10904 | - * Get filesystem's extents as described in head, and format for | ||
10905 | - * output. Calls formatter to fill the user's buffer until all | ||
10906 | - * extents are mapped, until the passed-in head->fmh_count slots have | ||
10907 | - * been filled, or until the formatter short-circuits the loop, if it | ||
10908 | - * is tracking filled-in extents on its own. | ||
10909 | + * Get filesystem's extents as described in head, and format for output. Fills | ||
10910 | + * in the supplied records array until there are no more reverse mappings to | ||
10911 | + * return or head.fmh_entries == head.fmh_count. In the second case, this | ||
10912 | + * function returns -ECANCELED to indicate that more records would have been | ||
10913 | + * returned. | ||
10914 | * | ||
10915 | * Key to Confusion | ||
10916 | * ---------------- | ||
10917 | @@ -815,8 +825,7 @@ int | ||
10918 | xfs_getfsmap( | ||
10919 | struct xfs_mount *mp, | ||
10920 | struct xfs_fsmap_head *head, | ||
10921 | - xfs_fsmap_format_t formatter, | ||
10922 | - void *arg) | ||
10923 | + struct fsmap *fsmap_recs) | ||
10924 | { | ||
10925 | struct xfs_trans *tp = NULL; | ||
10926 | struct xfs_fsmap dkeys[2]; /* per-dev keys */ | ||
10927 | @@ -891,8 +900,7 @@ xfs_getfsmap( | ||
10928 | |||
10929 | info.next_daddr = head->fmh_keys[0].fmr_physical + | ||
10930 | head->fmh_keys[0].fmr_length; | ||
10931 | - info.formatter = formatter; | ||
10932 | - info.format_arg = arg; | ||
10933 | + info.fsmap_recs = fsmap_recs; | ||
10934 | info.head = head; | ||
10935 | |||
10936 | /* | ||
10937 | diff --git a/fs/xfs/xfs_fsmap.h b/fs/xfs/xfs_fsmap.h | ||
10938 | index c6c57739b8626..a0775788e7b13 100644 | ||
10939 | --- a/fs/xfs/xfs_fsmap.h | ||
10940 | +++ b/fs/xfs/xfs_fsmap.h | ||
10941 | @@ -27,13 +27,9 @@ struct xfs_fsmap_head { | ||
10942 | struct xfs_fsmap fmh_keys[2]; /* low and high keys */ | ||
10943 | }; | ||
10944 | |||
10945 | -void xfs_fsmap_from_internal(struct fsmap *dest, struct xfs_fsmap *src); | ||
10946 | void xfs_fsmap_to_internal(struct xfs_fsmap *dest, struct fsmap *src); | ||
10947 | |||
10948 | -/* fsmap to userspace formatter - copy to user & advance pointer */ | ||
10949 | -typedef int (*xfs_fsmap_format_t)(struct xfs_fsmap *, void *); | ||
10950 | - | ||
10951 | int xfs_getfsmap(struct xfs_mount *mp, struct xfs_fsmap_head *head, | ||
10952 | - xfs_fsmap_format_t formatter, void *arg); | ||
10953 | + struct fsmap *out_recs); | ||
10954 | |||
10955 | #endif /* __XFS_FSMAP_H__ */ | ||
10956 | diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c | ||
10957 | index 60c4526312771..bf0435dbec436 100644 | ||
10958 | --- a/fs/xfs/xfs_ioctl.c | ||
10959 | +++ b/fs/xfs/xfs_ioctl.c | ||
10960 | @@ -1832,39 +1832,17 @@ out_free_buf: | ||
10961 | return error; | ||
10962 | } | ||
10963 | |||
10964 | -struct getfsmap_info { | ||
10965 | - struct xfs_mount *mp; | ||
10966 | - struct fsmap_head __user *data; | ||
10967 | - unsigned int idx; | ||
10968 | - __u32 last_flags; | ||
10969 | -}; | ||
10970 | - | ||
10971 | -STATIC int | ||
10972 | -xfs_getfsmap_format(struct xfs_fsmap *xfm, void *priv) | ||
10973 | -{ | ||
10974 | - struct getfsmap_info *info = priv; | ||
10975 | - struct fsmap fm; | ||
10976 | - | ||
10977 | - trace_xfs_getfsmap_mapping(info->mp, xfm); | ||
10978 | - | ||
10979 | - info->last_flags = xfm->fmr_flags; | ||
10980 | - xfs_fsmap_from_internal(&fm, xfm); | ||
10981 | - if (copy_to_user(&info->data->fmh_recs[info->idx++], &fm, | ||
10982 | - sizeof(struct fsmap))) | ||
10983 | - return -EFAULT; | ||
10984 | - | ||
10985 | - return 0; | ||
10986 | -} | ||
10987 | - | ||
10988 | STATIC int | ||
10989 | xfs_ioc_getfsmap( | ||
10990 | struct xfs_inode *ip, | ||
10991 | struct fsmap_head __user *arg) | ||
10992 | { | ||
10993 | - struct getfsmap_info info = { NULL }; | ||
10994 | struct xfs_fsmap_head xhead = {0}; | ||
10995 | struct fsmap_head head; | ||
10996 | - bool aborted = false; | ||
10997 | + struct fsmap *recs; | ||
10998 | + unsigned int count; | ||
10999 | + __u32 last_flags = 0; | ||
11000 | + bool done = false; | ||
11001 | int error; | ||
11002 | |||
11003 | if (copy_from_user(&head, arg, sizeof(struct fsmap_head))) | ||
11004 | @@ -1876,38 +1854,112 @@ xfs_ioc_getfsmap( | ||
11005 | sizeof(head.fmh_keys[1].fmr_reserved))) | ||
11006 | return -EINVAL; | ||
11007 | |||
11008 | + /* | ||
11009 | + * Use an internal memory buffer so that we don't have to copy fsmap | ||
11010 | + * data to userspace while holding locks. Start by trying to allocate | ||
11011 | + * up to 128k for the buffer, but fall back to a single page if needed. | ||
11012 | + */ | ||
11013 | + count = min_t(unsigned int, head.fmh_count, | ||
11014 | + 131072 / sizeof(struct fsmap)); | ||
11015 | + recs = kvzalloc(count * sizeof(struct fsmap), GFP_KERNEL); | ||
11016 | + if (!recs) { | ||
11017 | + count = min_t(unsigned int, head.fmh_count, | ||
11018 | + PAGE_SIZE / sizeof(struct fsmap)); | ||
11019 | + recs = kvzalloc(count * sizeof(struct fsmap), GFP_KERNEL); | ||
11020 | + if (!recs) | ||
11021 | + return -ENOMEM; | ||
11022 | + } | ||
11023 | + | ||
11024 | xhead.fmh_iflags = head.fmh_iflags; | ||
11025 | - xhead.fmh_count = head.fmh_count; | ||
11026 | xfs_fsmap_to_internal(&xhead.fmh_keys[0], &head.fmh_keys[0]); | ||
11027 | xfs_fsmap_to_internal(&xhead.fmh_keys[1], &head.fmh_keys[1]); | ||
11028 | |||
11029 | trace_xfs_getfsmap_low_key(ip->i_mount, &xhead.fmh_keys[0]); | ||
11030 | trace_xfs_getfsmap_high_key(ip->i_mount, &xhead.fmh_keys[1]); | ||
11031 | |||
11032 | - info.mp = ip->i_mount; | ||
11033 | - info.data = arg; | ||
11034 | - error = xfs_getfsmap(ip->i_mount, &xhead, xfs_getfsmap_format, &info); | ||
11035 | - if (error == -ECANCELED) { | ||
11036 | - error = 0; | ||
11037 | - aborted = true; | ||
11038 | - } else if (error) | ||
11039 | - return error; | ||
11040 | + head.fmh_entries = 0; | ||
11041 | + do { | ||
11042 | + struct fsmap __user *user_recs; | ||
11043 | + struct fsmap *last_rec; | ||
11044 | + | ||
11045 | + user_recs = &arg->fmh_recs[head.fmh_entries]; | ||
11046 | + xhead.fmh_entries = 0; | ||
11047 | + xhead.fmh_count = min_t(unsigned int, count, | ||
11048 | + head.fmh_count - head.fmh_entries); | ||
11049 | + | ||
11050 | + /* Run query, record how many entries we got. */ | ||
11051 | + error = xfs_getfsmap(ip->i_mount, &xhead, recs); | ||
11052 | + switch (error) { | ||
11053 | + case 0: | ||
11054 | + /* | ||
11055 | + * There are no more records in the result set. Copy | ||
11056 | + * whatever we got to userspace and break out. | ||
11057 | + */ | ||
11058 | + done = true; | ||
11059 | + break; | ||
11060 | + case -ECANCELED: | ||
11061 | + /* | ||
11062 | + * The internal memory buffer is full. Copy whatever | ||
11063 | + * records we got to userspace and go again if we have | ||
11064 | + * not yet filled the userspace buffer. | ||
11065 | + */ | ||
11066 | + error = 0; | ||
11067 | + break; | ||
11068 | + default: | ||
11069 | + goto out_free; | ||
11070 | + } | ||
11071 | + head.fmh_entries += xhead.fmh_entries; | ||
11072 | + head.fmh_oflags = xhead.fmh_oflags; | ||
11073 | |||
11074 | - /* If we didn't abort, set the "last" flag in the last fmx */ | ||
11075 | - if (!aborted && info.idx) { | ||
11076 | - info.last_flags |= FMR_OF_LAST; | ||
11077 | - if (copy_to_user(&info.data->fmh_recs[info.idx - 1].fmr_flags, | ||
11078 | - &info.last_flags, sizeof(info.last_flags))) | ||
11079 | - return -EFAULT; | ||
11080 | + /* | ||
11081 | + * If the caller wanted a record count or there aren't any | ||
11082 | + * new records to return, we're done. | ||
11083 | + */ | ||
11084 | + if (head.fmh_count == 0 || xhead.fmh_entries == 0) | ||
11085 | + break; | ||
11086 | + | ||
11087 | + /* Copy all the records we got out to userspace. */ | ||
11088 | + if (copy_to_user(user_recs, recs, | ||
11089 | + xhead.fmh_entries * sizeof(struct fsmap))) { | ||
11090 | + error = -EFAULT; | ||
11091 | + goto out_free; | ||
11092 | + } | ||
11093 | + | ||
11094 | + /* Remember the last record flags we copied to userspace. */ | ||
11095 | + last_rec = &recs[xhead.fmh_entries - 1]; | ||
11096 | + last_flags = last_rec->fmr_flags; | ||
11097 | + | ||
11098 | + /* Set up the low key for the next iteration. */ | ||
11099 | + xfs_fsmap_to_internal(&xhead.fmh_keys[0], last_rec); | ||
11100 | + trace_xfs_getfsmap_low_key(ip->i_mount, &xhead.fmh_keys[0]); | ||
11101 | + } while (!done && head.fmh_entries < head.fmh_count); | ||
11102 | + | ||
11103 | + /* | ||
11104 | + * If there are no more records in the query result set and we're not | ||
11105 | + * in counting mode, mark the last record returned with the LAST flag. | ||
11106 | + */ | ||
11107 | + if (done && head.fmh_count > 0 && head.fmh_entries > 0) { | ||
11108 | + struct fsmap __user *user_rec; | ||
11109 | + | ||
11110 | + last_flags |= FMR_OF_LAST; | ||
11111 | + user_rec = &arg->fmh_recs[head.fmh_entries - 1]; | ||
11112 | + | ||
11113 | + if (copy_to_user(&user_rec->fmr_flags, &last_flags, | ||
11114 | + sizeof(last_flags))) { | ||
11115 | + error = -EFAULT; | ||
11116 | + goto out_free; | ||
11117 | + } | ||
11118 | } | ||
11119 | |||
11120 | /* copy back header */ | ||
11121 | - head.fmh_entries = xhead.fmh_entries; | ||
11122 | - head.fmh_oflags = xhead.fmh_oflags; | ||
11123 | - if (copy_to_user(arg, &head, sizeof(struct fsmap_head))) | ||
11124 | - return -EFAULT; | ||
11125 | + if (copy_to_user(arg, &head, sizeof(struct fsmap_head))) { | ||
11126 | + error = -EFAULT; | ||
11127 | + goto out_free; | ||
11128 | + } | ||
11129 | |||
11130 | - return 0; | ||
11131 | +out_free: | ||
11132 | + kmem_free(recs); | ||
11133 | + return error; | ||
11134 | } | ||
11135 | |||
11136 | STATIC int | ||
11137 | diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c | ||
11138 | index 4a48a8c75b4f7..b583669370825 100644 | ||
11139 | --- a/fs/xfs/xfs_rtalloc.c | ||
11140 | +++ b/fs/xfs/xfs_rtalloc.c | ||
11141 | @@ -247,6 +247,9 @@ xfs_rtallocate_extent_block( | ||
11142 | end = XFS_BLOCKTOBIT(mp, bbno + 1) - 1; | ||
11143 | i <= end; | ||
11144 | i++) { | ||
11145 | + /* Make sure we don't scan off the end of the rt volume. */ | ||
11146 | + maxlen = min(mp->m_sb.sb_rextents, i + maxlen) - i; | ||
11147 | + | ||
11148 | /* | ||
11149 | * See if there's a free extent of maxlen starting at i. | ||
11150 | * If it's not so then next will contain the first non-free. | ||
11151 | @@ -442,6 +445,14 @@ xfs_rtallocate_extent_near( | ||
11152 | */ | ||
11153 | if (bno >= mp->m_sb.sb_rextents) | ||
11154 | bno = mp->m_sb.sb_rextents - 1; | ||
11155 | + | ||
11156 | + /* Make sure we don't run off the end of the rt volume. */ | ||
11157 | + maxlen = min(mp->m_sb.sb_rextents, bno + maxlen) - bno; | ||
11158 | + if (maxlen < minlen) { | ||
11159 | + *rtblock = NULLRTBLOCK; | ||
11160 | + return 0; | ||
11161 | + } | ||
11162 | + | ||
11163 | /* | ||
11164 | * Try the exact allocation first. | ||
11165 | */ | ||
11166 | diff --git a/include/linux/bpf_verifier.h b/include/linux/bpf_verifier.h | ||
11167 | index 26a6d58ca78cc..81c7ea83e8079 100644 | ||
11168 | --- a/include/linux/bpf_verifier.h | ||
11169 | +++ b/include/linux/bpf_verifier.h | ||
11170 | @@ -342,6 +342,7 @@ struct bpf_subprog_info { | ||
11171 | u32 start; /* insn idx of function entry point */ | ||
11172 | u32 linfo_idx; /* The idx to the main_prog->aux->linfo */ | ||
11173 | u16 stack_depth; /* max. stack depth used by this function */ | ||
11174 | + bool has_tail_call; | ||
11175 | }; | ||
11176 | |||
11177 | /* single container for all structs | ||
11178 | diff --git a/include/linux/oom.h b/include/linux/oom.h | ||
11179 | index c696c265f0193..b9df34326772c 100644 | ||
11180 | --- a/include/linux/oom.h | ||
11181 | +++ b/include/linux/oom.h | ||
11182 | @@ -55,6 +55,7 @@ struct oom_control { | ||
11183 | }; | ||
11184 | |||
11185 | extern struct mutex oom_lock; | ||
11186 | +extern struct mutex oom_adj_mutex; | ||
11187 | |||
11188 | static inline void set_current_oom_origin(void) | ||
11189 | { | ||
11190 | diff --git a/include/linux/overflow.h b/include/linux/overflow.h | ||
11191 | index 659045046468f..50c93ca0c3d6f 100644 | ||
11192 | --- a/include/linux/overflow.h | ||
11193 | +++ b/include/linux/overflow.h | ||
11194 | @@ -3,6 +3,7 @@ | ||
11195 | #define __LINUX_OVERFLOW_H | ||
11196 | |||
11197 | #include <linux/compiler.h> | ||
11198 | +#include <linux/limits.h> | ||
11199 | |||
11200 | /* | ||
11201 | * In the fallback code below, we need to compute the minimum and | ||
11202 | diff --git a/include/linux/page_owner.h b/include/linux/page_owner.h | ||
11203 | index 8679ccd722e89..3468794f83d23 100644 | ||
11204 | --- a/include/linux/page_owner.h | ||
11205 | +++ b/include/linux/page_owner.h | ||
11206 | @@ -11,7 +11,7 @@ extern struct page_ext_operations page_owner_ops; | ||
11207 | extern void __reset_page_owner(struct page *page, unsigned int order); | ||
11208 | extern void __set_page_owner(struct page *page, | ||
11209 | unsigned int order, gfp_t gfp_mask); | ||
11210 | -extern void __split_page_owner(struct page *page, unsigned int order); | ||
11211 | +extern void __split_page_owner(struct page *page, unsigned int nr); | ||
11212 | extern void __copy_page_owner(struct page *oldpage, struct page *newpage); | ||
11213 | extern void __set_page_owner_migrate_reason(struct page *page, int reason); | ||
11214 | extern void __dump_page_owner(struct page *page); | ||
11215 | @@ -31,10 +31,10 @@ static inline void set_page_owner(struct page *page, | ||
11216 | __set_page_owner(page, order, gfp_mask); | ||
11217 | } | ||
11218 | |||
11219 | -static inline void split_page_owner(struct page *page, unsigned int order) | ||
11220 | +static inline void split_page_owner(struct page *page, unsigned int nr) | ||
11221 | { | ||
11222 | if (static_branch_unlikely(&page_owner_inited)) | ||
11223 | - __split_page_owner(page, order); | ||
11224 | + __split_page_owner(page, nr); | ||
11225 | } | ||
11226 | static inline void copy_page_owner(struct page *oldpage, struct page *newpage) | ||
11227 | { | ||
11228 | diff --git a/include/linux/pci.h b/include/linux/pci.h | ||
11229 | index e92bd9b32f369..6a6a819c5b49b 100644 | ||
11230 | --- a/include/linux/pci.h | ||
11231 | +++ b/include/linux/pci.h | ||
11232 | @@ -423,6 +423,7 @@ struct pci_dev { | ||
11233 | unsigned int is_probed:1; /* Device probing in progress */ | ||
11234 | unsigned int link_active_reporting:1;/* Device capable of reporting link active */ | ||
11235 | unsigned int no_vf_scan:1; /* Don't scan for VFs after IOV enablement */ | ||
11236 | + unsigned int no_command_memory:1; /* No PCI_COMMAND_MEMORY */ | ||
11237 | pci_dev_flags_t dev_flags; | ||
11238 | atomic_t enable_cnt; /* pci_enable_device has been called */ | ||
11239 | |||
11240 | diff --git a/include/linux/platform_data/dma-dw.h b/include/linux/platform_data/dma-dw.h | ||
11241 | index f3eaf9ec00a1b..70078be166e3c 100644 | ||
11242 | --- a/include/linux/platform_data/dma-dw.h | ||
11243 | +++ b/include/linux/platform_data/dma-dw.h | ||
11244 | @@ -21,6 +21,7 @@ | ||
11245 | * @dst_id: dst request line | ||
11246 | * @m_master: memory master for transfers on allocated channel | ||
11247 | * @p_master: peripheral master for transfers on allocated channel | ||
11248 | + * @channels: mask of the channels permitted for allocation (zero value means any) | ||
11249 | * @hs_polarity:set active low polarity of handshake interface | ||
11250 | */ | ||
11251 | struct dw_dma_slave { | ||
11252 | @@ -29,6 +30,7 @@ struct dw_dma_slave { | ||
11253 | u8 dst_id; | ||
11254 | u8 m_master; | ||
11255 | u8 p_master; | ||
11256 | + u8 channels; | ||
11257 | bool hs_polarity; | ||
11258 | }; | ||
11259 | |||
11260 | diff --git a/include/linux/sched/coredump.h b/include/linux/sched/coredump.h | ||
11261 | index ecdc6542070f1..dfd82eab29025 100644 | ||
11262 | --- a/include/linux/sched/coredump.h | ||
11263 | +++ b/include/linux/sched/coredump.h | ||
11264 | @@ -72,6 +72,7 @@ static inline int get_dumpable(struct mm_struct *mm) | ||
11265 | #define MMF_DISABLE_THP 24 /* disable THP for all VMAs */ | ||
11266 | #define MMF_OOM_VICTIM 25 /* mm is the oom victim */ | ||
11267 | #define MMF_OOM_REAP_QUEUED 26 /* mm was queued for oom_reaper */ | ||
11268 | +#define MMF_MULTIPROCESS 27 /* mm is shared between processes */ | ||
11269 | #define MMF_DISABLE_THP_MASK (1 << MMF_DISABLE_THP) | ||
11270 | |||
11271 | #define MMF_INIT_MASK (MMF_DUMPABLE_MASK | MMF_DUMP_FILTER_MASK |\ | ||
11272 | diff --git a/include/net/ip.h b/include/net/ip.h | ||
11273 | index 4b15cc1c224c6..0278d63c15274 100644 | ||
11274 | --- a/include/net/ip.h | ||
11275 | +++ b/include/net/ip.h | ||
11276 | @@ -439,12 +439,18 @@ static inline unsigned int ip_dst_mtu_maybe_forward(const struct dst_entry *dst, | ||
11277 | bool forwarding) | ||
11278 | { | ||
11279 | struct net *net = dev_net(dst->dev); | ||
11280 | + unsigned int mtu; | ||
11281 | |||
11282 | if (net->ipv4.sysctl_ip_fwd_use_pmtu || | ||
11283 | ip_mtu_locked(dst) || | ||
11284 | !forwarding) | ||
11285 | return dst_mtu(dst); | ||
11286 | |||
11287 | + /* 'forwarding = true' case should always honour route mtu */ | ||
11288 | + mtu = dst_metric_raw(dst, RTAX_MTU); | ||
11289 | + if (mtu) | ||
11290 | + return mtu; | ||
11291 | + | ||
11292 | return min(READ_ONCE(dst->dev->mtu), IP_MAX_MTU); | ||
11293 | } | ||
11294 | |||
11295 | diff --git a/include/net/netfilter/nf_log.h b/include/net/netfilter/nf_log.h | ||
11296 | index 0d3920896d502..716db4a0fed89 100644 | ||
11297 | --- a/include/net/netfilter/nf_log.h | ||
11298 | +++ b/include/net/netfilter/nf_log.h | ||
11299 | @@ -108,6 +108,7 @@ int nf_log_dump_tcp_header(struct nf_log_buf *m, const struct sk_buff *skb, | ||
11300 | unsigned int logflags); | ||
11301 | void nf_log_dump_sk_uid_gid(struct net *net, struct nf_log_buf *m, | ||
11302 | struct sock *sk); | ||
11303 | +void nf_log_dump_vlan(struct nf_log_buf *m, const struct sk_buff *skb); | ||
11304 | void nf_log_dump_packet_common(struct nf_log_buf *m, u_int8_t pf, | ||
11305 | unsigned int hooknum, const struct sk_buff *skb, | ||
11306 | const struct net_device *in, | ||
11307 | diff --git a/include/rdma/ib_umem.h b/include/rdma/ib_umem.h | ||
11308 | index a91b2af64ec47..8e94279af47df 100644 | ||
11309 | --- a/include/rdma/ib_umem.h | ||
11310 | +++ b/include/rdma/ib_umem.h | ||
11311 | @@ -95,10 +95,11 @@ static inline int ib_umem_copy_from(void *dst, struct ib_umem *umem, size_t offs | ||
11312 | size_t length) { | ||
11313 | return -EINVAL; | ||
11314 | } | ||
11315 | -static inline int ib_umem_find_best_pgsz(struct ib_umem *umem, | ||
11316 | - unsigned long pgsz_bitmap, | ||
11317 | - unsigned long virt) { | ||
11318 | - return -EINVAL; | ||
11319 | +static inline unsigned long ib_umem_find_best_pgsz(struct ib_umem *umem, | ||
11320 | + unsigned long pgsz_bitmap, | ||
11321 | + unsigned long virt) | ||
11322 | +{ | ||
11323 | + return 0; | ||
11324 | } | ||
11325 | |||
11326 | #endif /* CONFIG_INFINIBAND_USER_MEM */ | ||
11327 | diff --git a/include/scsi/scsi_common.h b/include/scsi/scsi_common.h | ||
11328 | index 731ac09ed2313..5b567b43e1b16 100644 | ||
11329 | --- a/include/scsi/scsi_common.h | ||
11330 | +++ b/include/scsi/scsi_common.h | ||
11331 | @@ -25,6 +25,13 @@ scsi_command_size(const unsigned char *cmnd) | ||
11332 | scsi_varlen_cdb_length(cmnd) : COMMAND_SIZE(cmnd[0]); | ||
11333 | } | ||
11334 | |||
11335 | +static inline unsigned char | ||
11336 | +scsi_command_control(const unsigned char *cmnd) | ||
11337 | +{ | ||
11338 | + return (cmnd[0] == VARIABLE_LENGTH_CMD) ? | ||
11339 | + cmnd[1] : cmnd[COMMAND_SIZE(cmnd[0]) - 1]; | ||
11340 | +} | ||
11341 | + | ||
11342 | /* Returns a human-readable name for the device */ | ||
11343 | extern const char *scsi_device_type(unsigned type); | ||
11344 | |||
11345 | diff --git a/include/sound/hda_codec.h b/include/sound/hda_codec.h | ||
11346 | index 65c056ce91128..8341e2c489824 100644 | ||
11347 | --- a/include/sound/hda_codec.h | ||
11348 | +++ b/include/sound/hda_codec.h | ||
11349 | @@ -254,6 +254,7 @@ struct hda_codec { | ||
11350 | unsigned int force_pin_prefix:1; /* Add location prefix */ | ||
11351 | unsigned int link_down_at_suspend:1; /* link down at runtime suspend */ | ||
11352 | unsigned int relaxed_resume:1; /* don't resume forcibly for jack */ | ||
11353 | + unsigned int forced_resume:1; /* forced resume for jack */ | ||
11354 | |||
11355 | #ifdef CONFIG_PM | ||
11356 | unsigned long power_on_acct; | ||
11357 | diff --git a/include/trace/events/target.h b/include/trace/events/target.h | ||
11358 | index 914a872dd3435..e87a3716b0ac9 100644 | ||
11359 | --- a/include/trace/events/target.h | ||
11360 | +++ b/include/trace/events/target.h | ||
11361 | @@ -140,6 +140,7 @@ TRACE_EVENT(target_sequencer_start, | ||
11362 | __field( unsigned int, opcode ) | ||
11363 | __field( unsigned int, data_length ) | ||
11364 | __field( unsigned int, task_attribute ) | ||
11365 | + __field( unsigned char, control ) | ||
11366 | __array( unsigned char, cdb, TCM_MAX_COMMAND_SIZE ) | ||
11367 | __string( initiator, cmd->se_sess->se_node_acl->initiatorname ) | ||
11368 | ), | ||
11369 | @@ -149,6 +150,7 @@ TRACE_EVENT(target_sequencer_start, | ||
11370 | __entry->opcode = cmd->t_task_cdb[0]; | ||
11371 | __entry->data_length = cmd->data_length; | ||
11372 | __entry->task_attribute = cmd->sam_task_attr; | ||
11373 | + __entry->control = scsi_command_control(cmd->t_task_cdb); | ||
11374 | memcpy(__entry->cdb, cmd->t_task_cdb, TCM_MAX_COMMAND_SIZE); | ||
11375 | __assign_str(initiator, cmd->se_sess->se_node_acl->initiatorname); | ||
11376 | ), | ||
11377 | @@ -158,9 +160,7 @@ TRACE_EVENT(target_sequencer_start, | ||
11378 | show_opcode_name(__entry->opcode), | ||
11379 | __entry->data_length, __print_hex(__entry->cdb, 16), | ||
11380 | show_task_attribute_name(__entry->task_attribute), | ||
11381 | - scsi_command_size(__entry->cdb) <= 16 ? | ||
11382 | - __entry->cdb[scsi_command_size(__entry->cdb) - 1] : | ||
11383 | - __entry->cdb[1] | ||
11384 | + __entry->control | ||
11385 | ) | ||
11386 | ); | ||
11387 | |||
11388 | @@ -175,6 +175,7 @@ TRACE_EVENT(target_cmd_complete, | ||
11389 | __field( unsigned int, opcode ) | ||
11390 | __field( unsigned int, data_length ) | ||
11391 | __field( unsigned int, task_attribute ) | ||
11392 | + __field( unsigned char, control ) | ||
11393 | __field( unsigned char, scsi_status ) | ||
11394 | __field( unsigned char, sense_length ) | ||
11395 | __array( unsigned char, cdb, TCM_MAX_COMMAND_SIZE ) | ||
11396 | @@ -187,6 +188,7 @@ TRACE_EVENT(target_cmd_complete, | ||
11397 | __entry->opcode = cmd->t_task_cdb[0]; | ||
11398 | __entry->data_length = cmd->data_length; | ||
11399 | __entry->task_attribute = cmd->sam_task_attr; | ||
11400 | + __entry->control = scsi_command_control(cmd->t_task_cdb); | ||
11401 | __entry->scsi_status = cmd->scsi_status; | ||
11402 | __entry->sense_length = cmd->scsi_status == SAM_STAT_CHECK_CONDITION ? | ||
11403 | min(18, ((u8 *) cmd->sense_buffer)[SPC_ADD_SENSE_LEN_OFFSET] + 8) : 0; | ||
11404 | @@ -203,9 +205,7 @@ TRACE_EVENT(target_cmd_complete, | ||
11405 | show_opcode_name(__entry->opcode), | ||
11406 | __entry->data_length, __print_hex(__entry->cdb, 16), | ||
11407 | show_task_attribute_name(__entry->task_attribute), | ||
11408 | - scsi_command_size(__entry->cdb) <= 16 ? | ||
11409 | - __entry->cdb[scsi_command_size(__entry->cdb) - 1] : | ||
11410 | - __entry->cdb[1] | ||
11411 | + __entry->control | ||
11412 | ) | ||
11413 | ); | ||
11414 | |||
11415 | diff --git a/include/uapi/linux/perf_event.h b/include/uapi/linux/perf_event.h | ||
11416 | index bb7b271397a66..ceccd980ffcfe 100644 | ||
11417 | --- a/include/uapi/linux/perf_event.h | ||
11418 | +++ b/include/uapi/linux/perf_event.h | ||
11419 | @@ -1131,7 +1131,7 @@ union perf_mem_data_src { | ||
11420 | |||
11421 | #define PERF_MEM_SNOOPX_FWD 0x01 /* forward */ | ||
11422 | /* 1 free */ | ||
11423 | -#define PERF_MEM_SNOOPX_SHIFT 37 | ||
11424 | +#define PERF_MEM_SNOOPX_SHIFT 38 | ||
11425 | |||
11426 | /* locked instruction */ | ||
11427 | #define PERF_MEM_LOCK_NA 0x01 /* not available */ | ||
11428 | diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c | ||
11429 | index ae27dd77a73cb..507474f79195f 100644 | ||
11430 | --- a/kernel/bpf/verifier.c | ||
11431 | +++ b/kernel/bpf/verifier.c | ||
11432 | @@ -1160,6 +1160,10 @@ static int check_subprogs(struct bpf_verifier_env *env) | ||
11433 | for (i = 0; i < insn_cnt; i++) { | ||
11434 | u8 code = insn[i].code; | ||
11435 | |||
11436 | + if (code == (BPF_JMP | BPF_CALL) && | ||
11437 | + insn[i].imm == BPF_FUNC_tail_call && | ||
11438 | + insn[i].src_reg != BPF_PSEUDO_CALL) | ||
11439 | + subprog[cur_subprog].has_tail_call = true; | ||
11440 | if (BPF_CLASS(code) != BPF_JMP && BPF_CLASS(code) != BPF_JMP32) | ||
11441 | goto next; | ||
11442 | if (BPF_OP(code) == BPF_EXIT || BPF_OP(code) == BPF_CALL) | ||
11443 | @@ -2612,6 +2616,31 @@ static int check_max_stack_depth(struct bpf_verifier_env *env) | ||
11444 | int ret_prog[MAX_CALL_FRAMES]; | ||
11445 | |||
11446 | process_func: | ||
11447 | + /* protect against potential stack overflow that might happen when | ||
11448 | + * bpf2bpf calls get combined with tailcalls. Limit the caller's stack | ||
11449 | + * depth for such case down to 256 so that the worst case scenario | ||
11450 | + * would result in 8k stack size (32 which is tailcall limit * 256 = | ||
11451 | + * 8k). | ||
11452 | + * | ||
11453 | + * To get the idea what might happen, see an example: | ||
11454 | + * func1 -> sub rsp, 128 | ||
11455 | + * subfunc1 -> sub rsp, 256 | ||
11456 | + * tailcall1 -> add rsp, 256 | ||
11457 | + * func2 -> sub rsp, 192 (total stack size = 128 + 192 = 320) | ||
11458 | + * subfunc2 -> sub rsp, 64 | ||
11459 | + * subfunc22 -> sub rsp, 128 | ||
11460 | + * tailcall2 -> add rsp, 128 | ||
11461 | + * func3 -> sub rsp, 32 (total stack size 128 + 192 + 64 + 32 = 416) | ||
11462 | + * | ||
11463 | + * tailcall will unwind the current stack frame but it will not get rid | ||
11464 | + * of caller's stack as shown on the example above. | ||
11465 | + */ | ||
11466 | + if (idx && subprog[idx].has_tail_call && depth >= 256) { | ||
11467 | + verbose(env, | ||
11468 | + "tail_calls are not allowed when call stack of previous frames is %d bytes. Too large\n", | ||
11469 | + depth); | ||
11470 | + return -EACCES; | ||
11471 | + } | ||
11472 | /* round up to 32-bytes, since this is granularity | ||
11473 | * of interpreter stack size | ||
11474 | */ | ||
11475 | diff --git a/kernel/debug/kdb/kdb_io.c b/kernel/debug/kdb/kdb_io.c | ||
11476 | index 3a5184eb6977d..46821793637a1 100644 | ||
11477 | --- a/kernel/debug/kdb/kdb_io.c | ||
11478 | +++ b/kernel/debug/kdb/kdb_io.c | ||
11479 | @@ -679,12 +679,16 @@ int vkdb_printf(enum kdb_msgsrc src, const char *fmt, va_list ap) | ||
11480 | size_avail = sizeof(kdb_buffer) - len; | ||
11481 | goto kdb_print_out; | ||
11482 | } | ||
11483 | - if (kdb_grepping_flag >= KDB_GREPPING_FLAG_SEARCH) | ||
11484 | + if (kdb_grepping_flag >= KDB_GREPPING_FLAG_SEARCH) { | ||
11485 | /* | ||
11486 | * This was a interactive search (using '/' at more | ||
11487 | - * prompt) and it has completed. Clear the flag. | ||
11488 | + * prompt) and it has completed. Replace the \0 with | ||
11489 | + * its original value to ensure multi-line strings | ||
11490 | + * are handled properly, and return to normal mode. | ||
11491 | */ | ||
11492 | + *cphold = replaced_byte; | ||
11493 | kdb_grepping_flag = 0; | ||
11494 | + } | ||
11495 | /* | ||
11496 | * at this point the string is a full line and | ||
11497 | * should be printed, up to the null. | ||
11498 | diff --git a/kernel/fork.c b/kernel/fork.c | ||
11499 | index 594272569a80f..e3d5963d8c6f5 100644 | ||
11500 | --- a/kernel/fork.c | ||
11501 | +++ b/kernel/fork.c | ||
11502 | @@ -1750,6 +1750,25 @@ static __always_inline void delayed_free_task(struct task_struct *tsk) | ||
11503 | free_task(tsk); | ||
11504 | } | ||
11505 | |||
11506 | +static void copy_oom_score_adj(u64 clone_flags, struct task_struct *tsk) | ||
11507 | +{ | ||
11508 | + /* Skip if kernel thread */ | ||
11509 | + if (!tsk->mm) | ||
11510 | + return; | ||
11511 | + | ||
11512 | + /* Skip if spawning a thread or using vfork */ | ||
11513 | + if ((clone_flags & (CLONE_VM | CLONE_THREAD | CLONE_VFORK)) != CLONE_VM) | ||
11514 | + return; | ||
11515 | + | ||
11516 | + /* We need to synchronize with __set_oom_adj */ | ||
11517 | + mutex_lock(&oom_adj_mutex); | ||
11518 | + set_bit(MMF_MULTIPROCESS, &tsk->mm->flags); | ||
11519 | + /* Update the values in case they were changed after copy_signal */ | ||
11520 | + tsk->signal->oom_score_adj = current->signal->oom_score_adj; | ||
11521 | + tsk->signal->oom_score_adj_min = current->signal->oom_score_adj_min; | ||
11522 | + mutex_unlock(&oom_adj_mutex); | ||
11523 | +} | ||
11524 | + | ||
11525 | /* | ||
11526 | * This creates a new process as a copy of the old one, | ||
11527 | * but does not actually start it yet. | ||
11528 | @@ -2222,6 +2241,8 @@ static __latent_entropy struct task_struct *copy_process( | ||
11529 | trace_task_newtask(p, clone_flags); | ||
11530 | uprobe_copy_process(p, clone_flags); | ||
11531 | |||
11532 | + copy_oom_score_adj(clone_flags, p); | ||
11533 | + | ||
11534 | return p; | ||
11535 | |||
11536 | bad_fork_cancel_cgroup: | ||
11537 | diff --git a/kernel/module.c b/kernel/module.c | ||
11538 | index 819c5d3b4c295..45513909b01d5 100644 | ||
11539 | --- a/kernel/module.c | ||
11540 | +++ b/kernel/module.c | ||
11541 | @@ -88,8 +88,9 @@ EXPORT_SYMBOL_GPL(module_mutex); | ||
11542 | static LIST_HEAD(modules); | ||
11543 | |||
11544 | /* Work queue for freeing init sections in success case */ | ||
11545 | -static struct work_struct init_free_wq; | ||
11546 | -static struct llist_head init_free_list; | ||
11547 | +static void do_free_init(struct work_struct *w); | ||
11548 | +static DECLARE_WORK(init_free_wq, do_free_init); | ||
11549 | +static LLIST_HEAD(init_free_list); | ||
11550 | |||
11551 | #ifdef CONFIG_MODULES_TREE_LOOKUP | ||
11552 | |||
11553 | @@ -3563,14 +3564,6 @@ static void do_free_init(struct work_struct *w) | ||
11554 | } | ||
11555 | } | ||
11556 | |||
11557 | -static int __init modules_wq_init(void) | ||
11558 | -{ | ||
11559 | - INIT_WORK(&init_free_wq, do_free_init); | ||
11560 | - init_llist_head(&init_free_list); | ||
11561 | - return 0; | ||
11562 | -} | ||
11563 | -module_init(modules_wq_init); | ||
11564 | - | ||
11565 | /* | ||
11566 | * This is where the real work happens. | ||
11567 | * | ||
11568 | diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c | ||
11569 | index b6c5895ced36b..69c4cd472def3 100644 | ||
11570 | --- a/kernel/power/hibernate.c | ||
11571 | +++ b/kernel/power/hibernate.c | ||
11572 | @@ -839,17 +839,6 @@ static int software_resume(void) | ||
11573 | |||
11574 | /* Check if the device is there */ | ||
11575 | swsusp_resume_device = name_to_dev_t(resume_file); | ||
11576 | - | ||
11577 | - /* | ||
11578 | - * name_to_dev_t is ineffective to verify parition if resume_file is in | ||
11579 | - * integer format. (e.g. major:minor) | ||
11580 | - */ | ||
11581 | - if (isdigit(resume_file[0]) && resume_wait) { | ||
11582 | - int partno; | ||
11583 | - while (!get_gendisk(swsusp_resume_device, &partno)) | ||
11584 | - msleep(10); | ||
11585 | - } | ||
11586 | - | ||
11587 | if (!swsusp_resume_device) { | ||
11588 | /* | ||
11589 | * Some device discovery might still be in progress; we need | ||
11590 | diff --git a/kernel/sched/core.c b/kernel/sched/core.c | ||
11591 | index 79ce22de44095..4511532b08b84 100644 | ||
11592 | --- a/kernel/sched/core.c | ||
11593 | +++ b/kernel/sched/core.c | ||
11594 | @@ -36,7 +36,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(sched_overutilized_tp); | ||
11595 | |||
11596 | DEFINE_PER_CPU_SHARED_ALIGNED(struct rq, runqueues); | ||
11597 | |||
11598 | -#if defined(CONFIG_SCHED_DEBUG) && defined(CONFIG_JUMP_LABEL) | ||
11599 | +#ifdef CONFIG_SCHED_DEBUG | ||
11600 | /* | ||
11601 | * Debugging: various feature bits | ||
11602 | * | ||
11603 | diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c | ||
11604 | index b02a83ff40687..dddaf61378f62 100644 | ||
11605 | --- a/kernel/sched/fair.c | ||
11606 | +++ b/kernel/sched/fair.c | ||
11607 | @@ -5936,7 +5936,7 @@ static int select_idle_core(struct task_struct *p, struct sched_domain *sd, int | ||
11608 | /* | ||
11609 | * Scan the local SMT mask for idle CPUs. | ||
11610 | */ | ||
11611 | -static int select_idle_smt(struct task_struct *p, int target) | ||
11612 | +static int select_idle_smt(struct task_struct *p, struct sched_domain *sd, int target) | ||
11613 | { | ||
11614 | int cpu, si_cpu = -1; | ||
11615 | |||
11616 | @@ -5944,7 +5944,8 @@ static int select_idle_smt(struct task_struct *p, int target) | ||
11617 | return -1; | ||
11618 | |||
11619 | for_each_cpu(cpu, cpu_smt_mask(target)) { | ||
11620 | - if (!cpumask_test_cpu(cpu, p->cpus_ptr)) | ||
11621 | + if (!cpumask_test_cpu(cpu, p->cpus_ptr) || | ||
11622 | + !cpumask_test_cpu(cpu, sched_domain_span(sd))) | ||
11623 | continue; | ||
11624 | if (available_idle_cpu(cpu)) | ||
11625 | return cpu; | ||
11626 | @@ -5962,7 +5963,7 @@ static inline int select_idle_core(struct task_struct *p, struct sched_domain *s | ||
11627 | return -1; | ||
11628 | } | ||
11629 | |||
11630 | -static inline int select_idle_smt(struct task_struct *p, int target) | ||
11631 | +static inline int select_idle_smt(struct task_struct *p, struct sched_domain *sd, int target) | ||
11632 | { | ||
11633 | return -1; | ||
11634 | } | ||
11635 | @@ -6072,7 +6073,7 @@ static int select_idle_sibling(struct task_struct *p, int prev, int target) | ||
11636 | if ((unsigned)i < nr_cpumask_bits) | ||
11637 | return i; | ||
11638 | |||
11639 | - i = select_idle_smt(p, target); | ||
11640 | + i = select_idle_smt(p, sd, target); | ||
11641 | if ((unsigned)i < nr_cpumask_bits) | ||
11642 | return i; | ||
11643 | |||
11644 | diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h | ||
11645 | index 9f2a9e34a78d5..3e7590813844f 100644 | ||
11646 | --- a/kernel/sched/sched.h | ||
11647 | +++ b/kernel/sched/sched.h | ||
11648 | @@ -1568,7 +1568,7 @@ enum { | ||
11649 | |||
11650 | #undef SCHED_FEAT | ||
11651 | |||
11652 | -#if defined(CONFIG_SCHED_DEBUG) && defined(CONFIG_JUMP_LABEL) | ||
11653 | +#ifdef CONFIG_SCHED_DEBUG | ||
11654 | |||
11655 | /* | ||
11656 | * To support run-time toggling of sched features, all the translation units | ||
11657 | @@ -1576,6 +1576,7 @@ enum { | ||
11658 | */ | ||
11659 | extern const_debug unsigned int sysctl_sched_features; | ||
11660 | |||
11661 | +#ifdef CONFIG_JUMP_LABEL | ||
11662 | #define SCHED_FEAT(name, enabled) \ | ||
11663 | static __always_inline bool static_branch_##name(struct static_key *key) \ | ||
11664 | { \ | ||
11665 | @@ -1588,7 +1589,13 @@ static __always_inline bool static_branch_##name(struct static_key *key) \ | ||
11666 | extern struct static_key sched_feat_keys[__SCHED_FEAT_NR]; | ||
11667 | #define sched_feat(x) (static_branch_##x(&sched_feat_keys[__SCHED_FEAT_##x])) | ||
11668 | |||
11669 | -#else /* !(SCHED_DEBUG && CONFIG_JUMP_LABEL) */ | ||
11670 | +#else /* !CONFIG_JUMP_LABEL */ | ||
11671 | + | ||
11672 | +#define sched_feat(x) (sysctl_sched_features & (1UL << __SCHED_FEAT_##x)) | ||
11673 | + | ||
11674 | +#endif /* CONFIG_JUMP_LABEL */ | ||
11675 | + | ||
11676 | +#else /* !SCHED_DEBUG */ | ||
11677 | |||
11678 | /* | ||
11679 | * Each translation unit has its own copy of sysctl_sched_features to allow | ||
11680 | @@ -1604,7 +1611,7 @@ static const_debug __maybe_unused unsigned int sysctl_sched_features = | ||
11681 | |||
11682 | #define sched_feat(x) !!(sysctl_sched_features & (1UL << __SCHED_FEAT_##x)) | ||
11683 | |||
11684 | -#endif /* SCHED_DEBUG && CONFIG_JUMP_LABEL */ | ||
11685 | +#endif /* SCHED_DEBUG */ | ||
11686 | |||
11687 | extern struct static_key_false sched_numa_balancing; | ||
11688 | extern struct static_key_false sched_schedstats; | ||
11689 | diff --git a/lib/crc32.c b/lib/crc32.c | ||
11690 | index 4a20455d1f61e..bf60ef26a45c2 100644 | ||
11691 | --- a/lib/crc32.c | ||
11692 | +++ b/lib/crc32.c | ||
11693 | @@ -331,7 +331,7 @@ static inline u32 __pure crc32_be_generic(u32 crc, unsigned char const *p, | ||
11694 | return crc; | ||
11695 | } | ||
11696 | |||
11697 | -#if CRC_LE_BITS == 1 | ||
11698 | +#if CRC_BE_BITS == 1 | ||
11699 | u32 __pure crc32_be(u32 crc, unsigned char const *p, size_t len) | ||
11700 | { | ||
11701 | return crc32_be_generic(crc, p, len, NULL, CRC32_POLY_BE); | ||
11702 | diff --git a/lib/idr.c b/lib/idr.c | ||
11703 | index c2cf2c52bbde5..4d2eef0259d2c 100644 | ||
11704 | --- a/lib/idr.c | ||
11705 | +++ b/lib/idr.c | ||
11706 | @@ -470,6 +470,7 @@ alloc: | ||
11707 | goto retry; | ||
11708 | nospc: | ||
11709 | xas_unlock_irqrestore(&xas, flags); | ||
11710 | + kfree(alloc); | ||
11711 | return -ENOSPC; | ||
11712 | } | ||
11713 | EXPORT_SYMBOL(ida_alloc_range); | ||
11714 | diff --git a/mm/filemap.c b/mm/filemap.c | ||
11715 | index 51b2cb5aa5030..db542b4948838 100644 | ||
11716 | --- a/mm/filemap.c | ||
11717 | +++ b/mm/filemap.c | ||
11718 | @@ -847,10 +847,10 @@ int replace_page_cache_page(struct page *old, struct page *new, gfp_t gfp_mask) | ||
11719 | } | ||
11720 | EXPORT_SYMBOL_GPL(replace_page_cache_page); | ||
11721 | |||
11722 | -static int __add_to_page_cache_locked(struct page *page, | ||
11723 | - struct address_space *mapping, | ||
11724 | - pgoff_t offset, gfp_t gfp_mask, | ||
11725 | - void **shadowp) | ||
11726 | +noinline int __add_to_page_cache_locked(struct page *page, | ||
11727 | + struct address_space *mapping, | ||
11728 | + pgoff_t offset, gfp_t gfp_mask, | ||
11729 | + void **shadowp) | ||
11730 | { | ||
11731 | XA_STATE(xas, &mapping->i_pages, offset); | ||
11732 | int huge = PageHuge(page); | ||
11733 | diff --git a/mm/huge_memory.c b/mm/huge_memory.c | ||
11734 | index 873de55d93fb2..9295d9d70681e 100644 | ||
11735 | --- a/mm/huge_memory.c | ||
11736 | +++ b/mm/huge_memory.c | ||
11737 | @@ -2569,7 +2569,7 @@ static void __split_huge_page(struct page *page, struct list_head *list, | ||
11738 | |||
11739 | ClearPageCompound(head); | ||
11740 | |||
11741 | - split_page_owner(head, HPAGE_PMD_ORDER); | ||
11742 | + split_page_owner(head, HPAGE_PMD_NR); | ||
11743 | |||
11744 | /* See comment in __split_huge_page_tail() */ | ||
11745 | if (PageAnon(head)) { | ||
11746 | diff --git a/mm/memcontrol.c b/mm/memcontrol.c | ||
11747 | index ca1632850fb76..edf98f8588eeb 100644 | ||
11748 | --- a/mm/memcontrol.c | ||
11749 | +++ b/mm/memcontrol.c | ||
11750 | @@ -5398,7 +5398,7 @@ static struct page *mc_handle_swap_pte(struct vm_area_struct *vma, | ||
11751 | struct page *page = NULL; | ||
11752 | swp_entry_t ent = pte_to_swp_entry(ptent); | ||
11753 | |||
11754 | - if (!(mc.flags & MOVE_ANON) || non_swap_entry(ent)) | ||
11755 | + if (!(mc.flags & MOVE_ANON)) | ||
11756 | return NULL; | ||
11757 | |||
11758 | /* | ||
11759 | @@ -5417,6 +5417,9 @@ static struct page *mc_handle_swap_pte(struct vm_area_struct *vma, | ||
11760 | return page; | ||
11761 | } | ||
11762 | |||
11763 | + if (non_swap_entry(ent)) | ||
11764 | + return NULL; | ||
11765 | + | ||
11766 | /* | ||
11767 | * Because lookup_swap_cache() updates some statistics counter, | ||
11768 | * we call find_get_page() with swapper_space directly. | ||
11769 | diff --git a/mm/oom_kill.c b/mm/oom_kill.c | ||
11770 | index d58c481b3df83..212e718743018 100644 | ||
11771 | --- a/mm/oom_kill.c | ||
11772 | +++ b/mm/oom_kill.c | ||
11773 | @@ -63,6 +63,8 @@ int sysctl_oom_dump_tasks = 1; | ||
11774 | * and mark_oom_victim | ||
11775 | */ | ||
11776 | DEFINE_MUTEX(oom_lock); | ||
11777 | +/* Serializes oom_score_adj and oom_score_adj_min updates */ | ||
11778 | +DEFINE_MUTEX(oom_adj_mutex); | ||
11779 | |||
11780 | static inline bool is_memcg_oom(struct oom_control *oc) | ||
11781 | { | ||
11782 | diff --git a/mm/page_alloc.c b/mm/page_alloc.c | ||
11783 | index aff0bb4629bdf..c20e664866c33 100644 | ||
11784 | --- a/mm/page_alloc.c | ||
11785 | +++ b/mm/page_alloc.c | ||
11786 | @@ -3130,7 +3130,7 @@ void split_page(struct page *page, unsigned int order) | ||
11787 | |||
11788 | for (i = 1; i < (1 << order); i++) | ||
11789 | set_page_refcounted(page + i); | ||
11790 | - split_page_owner(page, order); | ||
11791 | + split_page_owner(page, 1 << order); | ||
11792 | } | ||
11793 | EXPORT_SYMBOL_GPL(split_page); | ||
11794 | |||
11795 | @@ -3385,7 +3385,7 @@ static inline bool __should_fail_alloc_page(gfp_t gfp_mask, unsigned int order) | ||
11796 | |||
11797 | #endif /* CONFIG_FAIL_PAGE_ALLOC */ | ||
11798 | |||
11799 | -static noinline bool should_fail_alloc_page(gfp_t gfp_mask, unsigned int order) | ||
11800 | +noinline bool should_fail_alloc_page(gfp_t gfp_mask, unsigned int order) | ||
11801 | { | ||
11802 | return __should_fail_alloc_page(gfp_mask, order); | ||
11803 | } | ||
11804 | diff --git a/mm/page_owner.c b/mm/page_owner.c | ||
11805 | index 18ecde9f45b24..83d08943bcdee 100644 | ||
11806 | --- a/mm/page_owner.c | ||
11807 | +++ b/mm/page_owner.c | ||
11808 | @@ -204,7 +204,7 @@ void __set_page_owner_migrate_reason(struct page *page, int reason) | ||
11809 | page_owner->last_migrate_reason = reason; | ||
11810 | } | ||
11811 | |||
11812 | -void __split_page_owner(struct page *page, unsigned int order) | ||
11813 | +void __split_page_owner(struct page *page, unsigned int nr) | ||
11814 | { | ||
11815 | int i; | ||
11816 | struct page_ext *page_ext = lookup_page_ext(page); | ||
11817 | @@ -213,7 +213,7 @@ void __split_page_owner(struct page *page, unsigned int order) | ||
11818 | if (unlikely(!page_ext)) | ||
11819 | return; | ||
11820 | |||
11821 | - for (i = 0; i < (1 << order); i++) { | ||
11822 | + for (i = 0; i < nr; i++) { | ||
11823 | page_owner = get_page_owner(page_ext); | ||
11824 | page_owner->order = 0; | ||
11825 | page_ext = page_ext_next(page_ext); | ||
11826 | diff --git a/mm/swapfile.c b/mm/swapfile.c | ||
11827 | index cf62bdb7b3045..ff83ffe7a9108 100644 | ||
11828 | --- a/mm/swapfile.c | ||
11829 | +++ b/mm/swapfile.c | ||
11830 | @@ -3284,7 +3284,7 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags) | ||
11831 | error = inode_drain_writes(inode); | ||
11832 | if (error) { | ||
11833 | inode->i_flags &= ~S_SWAPFILE; | ||
11834 | - goto bad_swap_unlock_inode; | ||
11835 | + goto free_swap_address_space; | ||
11836 | } | ||
11837 | |||
11838 | mutex_lock(&swapon_mutex); | ||
11839 | @@ -3309,6 +3309,8 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags) | ||
11840 | |||
11841 | error = 0; | ||
11842 | goto out; | ||
11843 | +free_swap_address_space: | ||
11844 | + exit_swap_address_space(p->type); | ||
11845 | bad_swap_unlock_inode: | ||
11846 | inode_unlock(inode); | ||
11847 | bad_swap: | ||
11848 | diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c | ||
11849 | index 40e96a610e2b4..8648c5211ebe6 100644 | ||
11850 | --- a/net/bluetooth/l2cap_sock.c | ||
11851 | +++ b/net/bluetooth/l2cap_sock.c | ||
11852 | @@ -1344,8 +1344,6 @@ static void l2cap_sock_teardown_cb(struct l2cap_chan *chan, int err) | ||
11853 | |||
11854 | parent = bt_sk(sk)->parent; | ||
11855 | |||
11856 | - sock_set_flag(sk, SOCK_ZAPPED); | ||
11857 | - | ||
11858 | switch (chan->state) { | ||
11859 | case BT_OPEN: | ||
11860 | case BT_BOUND: | ||
11861 | @@ -1372,8 +1370,11 @@ static void l2cap_sock_teardown_cb(struct l2cap_chan *chan, int err) | ||
11862 | |||
11863 | break; | ||
11864 | } | ||
11865 | - | ||
11866 | release_sock(sk); | ||
11867 | + | ||
11868 | + /* Only zap after cleanup to avoid use after free race */ | ||
11869 | + sock_set_flag(sk, SOCK_ZAPPED); | ||
11870 | + | ||
11871 | } | ||
11872 | |||
11873 | static void l2cap_sock_state_change_cb(struct l2cap_chan *chan, int state, | ||
11874 | diff --git a/net/bridge/netfilter/ebt_dnat.c b/net/bridge/netfilter/ebt_dnat.c | ||
11875 | index 12a4f4d936810..3fda71a8579d1 100644 | ||
11876 | --- a/net/bridge/netfilter/ebt_dnat.c | ||
11877 | +++ b/net/bridge/netfilter/ebt_dnat.c | ||
11878 | @@ -21,7 +21,7 @@ ebt_dnat_tg(struct sk_buff *skb, const struct xt_action_param *par) | ||
11879 | { | ||
11880 | const struct ebt_nat_info *info = par->targinfo; | ||
11881 | |||
11882 | - if (skb_ensure_writable(skb, ETH_ALEN)) | ||
11883 | + if (skb_ensure_writable(skb, 0)) | ||
11884 | return EBT_DROP; | ||
11885 | |||
11886 | ether_addr_copy(eth_hdr(skb)->h_dest, info->mac); | ||
11887 | diff --git a/net/bridge/netfilter/ebt_redirect.c b/net/bridge/netfilter/ebt_redirect.c | ||
11888 | index 0cad62a4052b9..307790562b492 100644 | ||
11889 | --- a/net/bridge/netfilter/ebt_redirect.c | ||
11890 | +++ b/net/bridge/netfilter/ebt_redirect.c | ||
11891 | @@ -21,7 +21,7 @@ ebt_redirect_tg(struct sk_buff *skb, const struct xt_action_param *par) | ||
11892 | { | ||
11893 | const struct ebt_redirect_info *info = par->targinfo; | ||
11894 | |||
11895 | - if (skb_ensure_writable(skb, ETH_ALEN)) | ||
11896 | + if (skb_ensure_writable(skb, 0)) | ||
11897 | return EBT_DROP; | ||
11898 | |||
11899 | if (xt_hooknum(par) != NF_BR_BROUTING) | ||
11900 | diff --git a/net/bridge/netfilter/ebt_snat.c b/net/bridge/netfilter/ebt_snat.c | ||
11901 | index 27443bf229a3b..7dfbcdfc30e5d 100644 | ||
11902 | --- a/net/bridge/netfilter/ebt_snat.c | ||
11903 | +++ b/net/bridge/netfilter/ebt_snat.c | ||
11904 | @@ -22,7 +22,7 @@ ebt_snat_tg(struct sk_buff *skb, const struct xt_action_param *par) | ||
11905 | { | ||
11906 | const struct ebt_nat_info *info = par->targinfo; | ||
11907 | |||
11908 | - if (skb_ensure_writable(skb, ETH_ALEN * 2)) | ||
11909 | + if (skb_ensure_writable(skb, 0)) | ||
11910 | return EBT_DROP; | ||
11911 | |||
11912 | ether_addr_copy(eth_hdr(skb)->h_source, info->mac); | ||
11913 | diff --git a/net/can/j1939/transport.c b/net/can/j1939/transport.c | ||
11914 | index a8dd956b5e8e1..916fdf2464bc2 100644 | ||
11915 | --- a/net/can/j1939/transport.c | ||
11916 | +++ b/net/can/j1939/transport.c | ||
11917 | @@ -580,6 +580,7 @@ sk_buff *j1939_tp_tx_dat_new(struct j1939_priv *priv, | ||
11918 | skb->dev = priv->ndev; | ||
11919 | can_skb_reserve(skb); | ||
11920 | can_skb_prv(skb)->ifindex = priv->ndev->ifindex; | ||
11921 | + can_skb_prv(skb)->skbcnt = 0; | ||
11922 | /* reserve CAN header */ | ||
11923 | skb_reserve(skb, offsetof(struct can_frame, data)); | ||
11924 | |||
11925 | @@ -1487,6 +1488,7 @@ j1939_session *j1939_session_fresh_new(struct j1939_priv *priv, | ||
11926 | skb->dev = priv->ndev; | ||
11927 | can_skb_reserve(skb); | ||
11928 | can_skb_prv(skb)->ifindex = priv->ndev->ifindex; | ||
11929 | + can_skb_prv(skb)->skbcnt = 0; | ||
11930 | skcb = j1939_skb_to_cb(skb); | ||
11931 | memcpy(skcb, rel_skcb, sizeof(*skcb)); | ||
11932 | |||
11933 | diff --git a/net/core/filter.c b/net/core/filter.c | ||
11934 | index c441f9961e917..b040b7bf28582 100644 | ||
11935 | --- a/net/core/filter.c | ||
11936 | +++ b/net/core/filter.c | ||
11937 | @@ -4270,7 +4270,8 @@ BPF_CALL_5(bpf_setsockopt, struct bpf_sock_ops_kern *, bpf_sock, | ||
11938 | cmpxchg(&sk->sk_pacing_status, | ||
11939 | SK_PACING_NONE, | ||
11940 | SK_PACING_NEEDED); | ||
11941 | - sk->sk_max_pacing_rate = (val == ~0U) ? ~0UL : val; | ||
11942 | + sk->sk_max_pacing_rate = (val == ~0U) ? | ||
11943 | + ~0UL : (unsigned int)val; | ||
11944 | sk->sk_pacing_rate = min(sk->sk_pacing_rate, | ||
11945 | sk->sk_max_pacing_rate); | ||
11946 | break; | ||
11947 | diff --git a/net/core/sock.c b/net/core/sock.c | ||
11948 | index 919f1a1739e90..1b765e62658f0 100644 | ||
11949 | --- a/net/core/sock.c | ||
11950 | +++ b/net/core/sock.c | ||
11951 | @@ -928,8 +928,6 @@ set_rcvbuf: | ||
11952 | break; | ||
11953 | |||
11954 | case SO_TIMESTAMPING_NEW: | ||
11955 | - sock_set_flag(sk, SOCK_TSTAMP_NEW); | ||
11956 | - /* fall through */ | ||
11957 | case SO_TIMESTAMPING_OLD: | ||
11958 | if (val & ~SOF_TIMESTAMPING_MASK) { | ||
11959 | ret = -EINVAL; | ||
11960 | @@ -958,16 +956,14 @@ set_rcvbuf: | ||
11961 | } | ||
11962 | |||
11963 | sk->sk_tsflags = val; | ||
11964 | + sock_valbool_flag(sk, SOCK_TSTAMP_NEW, optname == SO_TIMESTAMPING_NEW); | ||
11965 | + | ||
11966 | if (val & SOF_TIMESTAMPING_RX_SOFTWARE) | ||
11967 | sock_enable_timestamp(sk, | ||
11968 | SOCK_TIMESTAMPING_RX_SOFTWARE); | ||
11969 | - else { | ||
11970 | - if (optname == SO_TIMESTAMPING_NEW) | ||
11971 | - sock_reset_flag(sk, SOCK_TSTAMP_NEW); | ||
11972 | - | ||
11973 | + else | ||
11974 | sock_disable_timestamp(sk, | ||
11975 | (1UL << SOCK_TIMESTAMPING_RX_SOFTWARE)); | ||
11976 | - } | ||
11977 | break; | ||
11978 | |||
11979 | case SO_RCVLOWAT: | ||
11980 | @@ -1110,7 +1106,7 @@ set_rcvbuf: | ||
11981 | |||
11982 | case SO_MAX_PACING_RATE: | ||
11983 | { | ||
11984 | - unsigned long ulval = (val == ~0U) ? ~0UL : val; | ||
11985 | + unsigned long ulval = (val == ~0U) ? ~0UL : (unsigned int)val; | ||
11986 | |||
11987 | if (sizeof(ulval) != sizeof(val) && | ||
11988 | optlen >= sizeof(ulval) && | ||
11989 | diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c | ||
11990 | index 73f46cb5e51da..d00533aea1f05 100644 | ||
11991 | --- a/net/ipv4/icmp.c | ||
11992 | +++ b/net/ipv4/icmp.c | ||
11993 | @@ -239,7 +239,7 @@ static struct { | ||
11994 | /** | ||
11995 | * icmp_global_allow - Are we allowed to send one more ICMP message ? | ||
11996 | * | ||
11997 | - * Uses a token bucket to limit our ICMP messages to sysctl_icmp_msgs_per_sec. | ||
11998 | + * Uses a token bucket to limit our ICMP messages to ~sysctl_icmp_msgs_per_sec. | ||
11999 | * Returns false if we reached the limit and can not send another packet. | ||
12000 | * Note: called with BH disabled | ||
12001 | */ | ||
12002 | @@ -267,7 +267,10 @@ bool icmp_global_allow(void) | ||
12003 | } | ||
12004 | credit = min_t(u32, icmp_global.credit + incr, sysctl_icmp_msgs_burst); | ||
12005 | if (credit) { | ||
12006 | - credit--; | ||
12007 | + /* We want to use a credit of one in average, but need to randomize | ||
12008 | + * it for security reasons. | ||
12009 | + */ | ||
12010 | + credit = max_t(int, credit - prandom_u32_max(3), 0); | ||
12011 | rc = true; | ||
12012 | } | ||
12013 | WRITE_ONCE(icmp_global.credit, credit); | ||
12014 | diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c | ||
12015 | index 85ba1453ba5ca..fedad3a3e61b8 100644 | ||
12016 | --- a/net/ipv4/ip_gre.c | ||
12017 | +++ b/net/ipv4/ip_gre.c | ||
12018 | @@ -603,9 +603,7 @@ static netdev_tx_t ipgre_xmit(struct sk_buff *skb, | ||
12019 | } | ||
12020 | |||
12021 | if (dev->header_ops) { | ||
12022 | - /* Need space for new headers */ | ||
12023 | - if (skb_cow_head(skb, dev->needed_headroom - | ||
12024 | - (tunnel->hlen + sizeof(struct iphdr)))) | ||
12025 | + if (skb_cow_head(skb, 0)) | ||
12026 | goto free_skb; | ||
12027 | |||
12028 | tnl_params = (const struct iphdr *)skb->data; | ||
12029 | @@ -723,7 +721,11 @@ static void ipgre_link_update(struct net_device *dev, bool set_mtu) | ||
12030 | len = tunnel->tun_hlen - len; | ||
12031 | tunnel->hlen = tunnel->hlen + len; | ||
12032 | |||
12033 | - dev->needed_headroom = dev->needed_headroom + len; | ||
12034 | + if (dev->header_ops) | ||
12035 | + dev->hard_header_len += len; | ||
12036 | + else | ||
12037 | + dev->needed_headroom += len; | ||
12038 | + | ||
12039 | if (set_mtu) | ||
12040 | dev->mtu = max_t(int, dev->mtu - len, 68); | ||
12041 | |||
12042 | @@ -926,6 +928,7 @@ static void __gre_tunnel_init(struct net_device *dev) | ||
12043 | tunnel->parms.iph.protocol = IPPROTO_GRE; | ||
12044 | |||
12045 | tunnel->hlen = tunnel->tun_hlen + tunnel->encap_hlen; | ||
12046 | + dev->needed_headroom = tunnel->hlen + sizeof(tunnel->parms.iph); | ||
12047 | |||
12048 | dev->features |= GRE_FEATURES; | ||
12049 | dev->hw_features |= GRE_FEATURES; | ||
12050 | @@ -969,10 +972,14 @@ static int ipgre_tunnel_init(struct net_device *dev) | ||
12051 | return -EINVAL; | ||
12052 | dev->flags = IFF_BROADCAST; | ||
12053 | dev->header_ops = &ipgre_header_ops; | ||
12054 | + dev->hard_header_len = tunnel->hlen + sizeof(*iph); | ||
12055 | + dev->needed_headroom = 0; | ||
12056 | } | ||
12057 | #endif | ||
12058 | } else if (!tunnel->collect_md) { | ||
12059 | dev->header_ops = &ipgre_header_ops; | ||
12060 | + dev->hard_header_len = tunnel->hlen + sizeof(*iph); | ||
12061 | + dev->needed_headroom = 0; | ||
12062 | } | ||
12063 | |||
12064 | return ip_tunnel_init(dev); | ||
12065 | diff --git a/net/ipv4/netfilter/nf_log_arp.c b/net/ipv4/netfilter/nf_log_arp.c | ||
12066 | index 7a83f881efa9e..136030ad2e546 100644 | ||
12067 | --- a/net/ipv4/netfilter/nf_log_arp.c | ||
12068 | +++ b/net/ipv4/netfilter/nf_log_arp.c | ||
12069 | @@ -43,16 +43,31 @@ static void dump_arp_packet(struct nf_log_buf *m, | ||
12070 | const struct nf_loginfo *info, | ||
12071 | const struct sk_buff *skb, unsigned int nhoff) | ||
12072 | { | ||
12073 | - const struct arphdr *ah; | ||
12074 | - struct arphdr _arph; | ||
12075 | const struct arppayload *ap; | ||
12076 | struct arppayload _arpp; | ||
12077 | + const struct arphdr *ah; | ||
12078 | + unsigned int logflags; | ||
12079 | + struct arphdr _arph; | ||
12080 | |||
12081 | ah = skb_header_pointer(skb, 0, sizeof(_arph), &_arph); | ||
12082 | if (ah == NULL) { | ||
12083 | nf_log_buf_add(m, "TRUNCATED"); | ||
12084 | return; | ||
12085 | } | ||
12086 | + | ||
12087 | + if (info->type == NF_LOG_TYPE_LOG) | ||
12088 | + logflags = info->u.log.logflags; | ||
12089 | + else | ||
12090 | + logflags = NF_LOG_DEFAULT_MASK; | ||
12091 | + | ||
12092 | + if (logflags & NF_LOG_MACDECODE) { | ||
12093 | + nf_log_buf_add(m, "MACSRC=%pM MACDST=%pM ", | ||
12094 | + eth_hdr(skb)->h_source, eth_hdr(skb)->h_dest); | ||
12095 | + nf_log_dump_vlan(m, skb); | ||
12096 | + nf_log_buf_add(m, "MACPROTO=%04x ", | ||
12097 | + ntohs(eth_hdr(skb)->h_proto)); | ||
12098 | + } | ||
12099 | + | ||
12100 | nf_log_buf_add(m, "ARP HTYPE=%d PTYPE=0x%04x OPCODE=%d", | ||
12101 | ntohs(ah->ar_hrd), ntohs(ah->ar_pro), ntohs(ah->ar_op)); | ||
12102 | |||
12103 | diff --git a/net/ipv4/netfilter/nf_log_ipv4.c b/net/ipv4/netfilter/nf_log_ipv4.c | ||
12104 | index 4b2d49cc9f1a1..cb288ffbcfde2 100644 | ||
12105 | --- a/net/ipv4/netfilter/nf_log_ipv4.c | ||
12106 | +++ b/net/ipv4/netfilter/nf_log_ipv4.c | ||
12107 | @@ -284,8 +284,10 @@ static void dump_ipv4_mac_header(struct nf_log_buf *m, | ||
12108 | |||
12109 | switch (dev->type) { | ||
12110 | case ARPHRD_ETHER: | ||
12111 | - nf_log_buf_add(m, "MACSRC=%pM MACDST=%pM MACPROTO=%04x ", | ||
12112 | - eth_hdr(skb)->h_source, eth_hdr(skb)->h_dest, | ||
12113 | + nf_log_buf_add(m, "MACSRC=%pM MACDST=%pM ", | ||
12114 | + eth_hdr(skb)->h_source, eth_hdr(skb)->h_dest); | ||
12115 | + nf_log_dump_vlan(m, skb); | ||
12116 | + nf_log_buf_add(m, "MACPROTO=%04x ", | ||
12117 | ntohs(eth_hdr(skb)->h_proto)); | ||
12118 | return; | ||
12119 | default: | ||
12120 | diff --git a/net/ipv4/nexthop.c b/net/ipv4/nexthop.c | ||
12121 | index afa2c5049845f..ea32b113089d3 100644 | ||
12122 | --- a/net/ipv4/nexthop.c | ||
12123 | +++ b/net/ipv4/nexthop.c | ||
12124 | @@ -763,7 +763,7 @@ static void remove_nexthop_from_groups(struct net *net, struct nexthop *nh, | ||
12125 | remove_nh_grp_entry(net, nhge, nlinfo); | ||
12126 | |||
12127 | /* make sure all see the newly published array before releasing rtnl */ | ||
12128 | - synchronize_rcu(); | ||
12129 | + synchronize_net(); | ||
12130 | } | ||
12131 | |||
12132 | static void remove_nexthop_group(struct nexthop *nh, struct nl_info *nlinfo) | ||
12133 | diff --git a/net/ipv4/route.c b/net/ipv4/route.c | ||
12134 | index 7a5f64cf1fdd2..a293d4968d1eb 100644 | ||
12135 | --- a/net/ipv4/route.c | ||
12136 | +++ b/net/ipv4/route.c | ||
12137 | @@ -2728,10 +2728,12 @@ struct rtable *ip_route_output_flow(struct net *net, struct flowi4 *flp4, | ||
12138 | if (IS_ERR(rt)) | ||
12139 | return rt; | ||
12140 | |||
12141 | - if (flp4->flowi4_proto) | ||
12142 | + if (flp4->flowi4_proto) { | ||
12143 | + flp4->flowi4_oif = rt->dst.dev->ifindex; | ||
12144 | rt = (struct rtable *)xfrm_lookup_route(net, &rt->dst, | ||
12145 | flowi4_to_flowi(flp4), | ||
12146 | sk, 0); | ||
12147 | + } | ||
12148 | |||
12149 | return rt; | ||
12150 | } | ||
12151 | diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c | ||
12152 | index ab5358281000e..62f8ba4048180 100644 | ||
12153 | --- a/net/ipv4/tcp_input.c | ||
12154 | +++ b/net/ipv4/tcp_input.c | ||
12155 | @@ -5696,6 +5696,8 @@ void tcp_rcv_established(struct sock *sk, struct sk_buff *skb) | ||
12156 | tcp_data_snd_check(sk); | ||
12157 | if (!inet_csk_ack_scheduled(sk)) | ||
12158 | goto no_ack; | ||
12159 | + } else { | ||
12160 | + tcp_update_wl(tp, TCP_SKB_CB(skb)->seq); | ||
12161 | } | ||
12162 | |||
12163 | __tcp_ack_snd_check(sk, 0); | ||
12164 | diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c | ||
12165 | index 9ca6c32065ec6..0646fce31b67a 100644 | ||
12166 | --- a/net/ipv6/ip6_fib.c | ||
12167 | +++ b/net/ipv6/ip6_fib.c | ||
12168 | @@ -2519,8 +2519,10 @@ static void *ipv6_route_seq_start(struct seq_file *seq, loff_t *pos) | ||
12169 | iter->skip = *pos; | ||
12170 | |||
12171 | if (iter->tbl) { | ||
12172 | + loff_t p = 0; | ||
12173 | + | ||
12174 | ipv6_route_seq_setup_walk(iter, net); | ||
12175 | - return ipv6_route_seq_next(seq, NULL, pos); | ||
12176 | + return ipv6_route_seq_next(seq, NULL, &p); | ||
12177 | } else { | ||
12178 | return NULL; | ||
12179 | } | ||
12180 | diff --git a/net/ipv6/netfilter/nf_log_ipv6.c b/net/ipv6/netfilter/nf_log_ipv6.c | ||
12181 | index 22b80db6d8826..5b40258d3a5e9 100644 | ||
12182 | --- a/net/ipv6/netfilter/nf_log_ipv6.c | ||
12183 | +++ b/net/ipv6/netfilter/nf_log_ipv6.c | ||
12184 | @@ -297,9 +297,11 @@ static void dump_ipv6_mac_header(struct nf_log_buf *m, | ||
12185 | |||
12186 | switch (dev->type) { | ||
12187 | case ARPHRD_ETHER: | ||
12188 | - nf_log_buf_add(m, "MACSRC=%pM MACDST=%pM MACPROTO=%04x ", | ||
12189 | - eth_hdr(skb)->h_source, eth_hdr(skb)->h_dest, | ||
12190 | - ntohs(eth_hdr(skb)->h_proto)); | ||
12191 | + nf_log_buf_add(m, "MACSRC=%pM MACDST=%pM ", | ||
12192 | + eth_hdr(skb)->h_source, eth_hdr(skb)->h_dest); | ||
12193 | + nf_log_dump_vlan(m, skb); | ||
12194 | + nf_log_buf_add(m, "MACPROTO=%04x ", | ||
12195 | + ntohs(eth_hdr(skb)->h_proto)); | ||
12196 | return; | ||
12197 | default: | ||
12198 | break; | ||
12199 | diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c | ||
12200 | index a9dda5c228f60..fa293feef935d 100644 | ||
12201 | --- a/net/mac80211/cfg.c | ||
12202 | +++ b/net/mac80211/cfg.c | ||
12203 | @@ -698,7 +698,8 @@ void sta_set_rate_info_tx(struct sta_info *sta, | ||
12204 | u16 brate; | ||
12205 | |||
12206 | sband = ieee80211_get_sband(sta->sdata); | ||
12207 | - if (sband) { | ||
12208 | + WARN_ON_ONCE(sband && !sband->bitrates); | ||
12209 | + if (sband && sband->bitrates) { | ||
12210 | brate = sband->bitrates[rate->idx].bitrate; | ||
12211 | rinfo->legacy = DIV_ROUND_UP(brate, 1 << shift); | ||
12212 | } | ||
12213 | diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c | ||
12214 | index f5d96107af6de..4f14d8a06915a 100644 | ||
12215 | --- a/net/mac80211/sta_info.c | ||
12216 | +++ b/net/mac80211/sta_info.c | ||
12217 | @@ -2083,6 +2083,10 @@ static void sta_stats_decode_rate(struct ieee80211_local *local, u32 rate, | ||
12218 | int rate_idx = STA_STATS_GET(LEGACY_IDX, rate); | ||
12219 | |||
12220 | sband = local->hw.wiphy->bands[band]; | ||
12221 | + | ||
12222 | + if (WARN_ON_ONCE(!sband->bitrates)) | ||
12223 | + break; | ||
12224 | + | ||
12225 | brate = sband->bitrates[rate_idx].bitrate; | ||
12226 | if (rinfo->bw == RATE_INFO_BW_5) | ||
12227 | shift = 2; | ||
12228 | diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c | ||
12229 | index 3cccc88ef817b..99168af0c28d9 100644 | ||
12230 | --- a/net/netfilter/ipvs/ip_vs_ctl.c | ||
12231 | +++ b/net/netfilter/ipvs/ip_vs_ctl.c | ||
12232 | @@ -2465,6 +2465,10 @@ do_ip_vs_set_ctl(struct sock *sk, int cmd, void __user *user, unsigned int len) | ||
12233 | /* Set timeout values for (tcp tcpfin udp) */ | ||
12234 | ret = ip_vs_set_timeout(ipvs, (struct ip_vs_timeout_user *)arg); | ||
12235 | goto out_unlock; | ||
12236 | + } else if (!len) { | ||
12237 | + /* No more commands with len == 0 below */ | ||
12238 | + ret = -EINVAL; | ||
12239 | + goto out_unlock; | ||
12240 | } | ||
12241 | |||
12242 | usvc_compat = (struct ip_vs_service_user *)arg; | ||
12243 | @@ -2541,9 +2545,6 @@ do_ip_vs_set_ctl(struct sock *sk, int cmd, void __user *user, unsigned int len) | ||
12244 | break; | ||
12245 | case IP_VS_SO_SET_DELDEST: | ||
12246 | ret = ip_vs_del_dest(svc, &udest); | ||
12247 | - break; | ||
12248 | - default: | ||
12249 | - ret = -EINVAL; | ||
12250 | } | ||
12251 | |||
12252 | out_unlock: | ||
12253 | diff --git a/net/netfilter/ipvs/ip_vs_xmit.c b/net/netfilter/ipvs/ip_vs_xmit.c | ||
12254 | index c62a131a60948..cefc39878b1a4 100644 | ||
12255 | --- a/net/netfilter/ipvs/ip_vs_xmit.c | ||
12256 | +++ b/net/netfilter/ipvs/ip_vs_xmit.c | ||
12257 | @@ -615,6 +615,8 @@ static inline int ip_vs_tunnel_xmit_prepare(struct sk_buff *skb, | ||
12258 | if (ret == NF_ACCEPT) { | ||
12259 | nf_reset_ct(skb); | ||
12260 | skb_forward_csum(skb); | ||
12261 | + if (skb->dev) | ||
12262 | + skb->tstamp = 0; | ||
12263 | } | ||
12264 | return ret; | ||
12265 | } | ||
12266 | @@ -655,6 +657,8 @@ static inline int ip_vs_nat_send_or_cont(int pf, struct sk_buff *skb, | ||
12267 | |||
12268 | if (!local) { | ||
12269 | skb_forward_csum(skb); | ||
12270 | + if (skb->dev) | ||
12271 | + skb->tstamp = 0; | ||
12272 | NF_HOOK(pf, NF_INET_LOCAL_OUT, cp->ipvs->net, NULL, skb, | ||
12273 | NULL, skb_dst(skb)->dev, dst_output); | ||
12274 | } else | ||
12275 | @@ -675,6 +679,8 @@ static inline int ip_vs_send_or_cont(int pf, struct sk_buff *skb, | ||
12276 | if (!local) { | ||
12277 | ip_vs_drop_early_demux_sk(skb); | ||
12278 | skb_forward_csum(skb); | ||
12279 | + if (skb->dev) | ||
12280 | + skb->tstamp = 0; | ||
12281 | NF_HOOK(pf, NF_INET_LOCAL_OUT, cp->ipvs->net, NULL, skb, | ||
12282 | NULL, skb_dst(skb)->dev, dst_output); | ||
12283 | } else | ||
12284 | diff --git a/net/netfilter/nf_conntrack_proto_tcp.c b/net/netfilter/nf_conntrack_proto_tcp.c | ||
12285 | index 1926fd56df56a..848b137151c26 100644 | ||
12286 | --- a/net/netfilter/nf_conntrack_proto_tcp.c | ||
12287 | +++ b/net/netfilter/nf_conntrack_proto_tcp.c | ||
12288 | @@ -541,13 +541,20 @@ static bool tcp_in_window(const struct nf_conn *ct, | ||
12289 | swin = win << sender->td_scale; | ||
12290 | sender->td_maxwin = (swin == 0 ? 1 : swin); | ||
12291 | sender->td_maxend = end + sender->td_maxwin; | ||
12292 | - /* | ||
12293 | - * We haven't seen traffic in the other direction yet | ||
12294 | - * but we have to tweak window tracking to pass III | ||
12295 | - * and IV until that happens. | ||
12296 | - */ | ||
12297 | - if (receiver->td_maxwin == 0) | ||
12298 | + if (receiver->td_maxwin == 0) { | ||
12299 | + /* We haven't seen traffic in the other | ||
12300 | + * direction yet but we have to tweak window | ||
12301 | + * tracking to pass III and IV until that | ||
12302 | + * happens. | ||
12303 | + */ | ||
12304 | receiver->td_end = receiver->td_maxend = sack; | ||
12305 | + } else if (sack == receiver->td_end + 1) { | ||
12306 | + /* Likely a reply to a keepalive. | ||
12307 | + * Needed for III. | ||
12308 | + */ | ||
12309 | + receiver->td_end++; | ||
12310 | + } | ||
12311 | + | ||
12312 | } | ||
12313 | } else if (((state->state == TCP_CONNTRACK_SYN_SENT | ||
12314 | && dir == IP_CT_DIR_ORIGINAL) | ||
12315 | diff --git a/net/netfilter/nf_dup_netdev.c b/net/netfilter/nf_dup_netdev.c | ||
12316 | index f108a76925dd8..ec6e7d6860163 100644 | ||
12317 | --- a/net/netfilter/nf_dup_netdev.c | ||
12318 | +++ b/net/netfilter/nf_dup_netdev.c | ||
12319 | @@ -19,6 +19,7 @@ static void nf_do_netdev_egress(struct sk_buff *skb, struct net_device *dev) | ||
12320 | skb_push(skb, skb->mac_len); | ||
12321 | |||
12322 | skb->dev = dev; | ||
12323 | + skb->tstamp = 0; | ||
12324 | dev_queue_xmit(skb); | ||
12325 | } | ||
12326 | |||
12327 | diff --git a/net/netfilter/nf_log_common.c b/net/netfilter/nf_log_common.c | ||
12328 | index ae5628ddbe6d7..fd7c5f0f5c25b 100644 | ||
12329 | --- a/net/netfilter/nf_log_common.c | ||
12330 | +++ b/net/netfilter/nf_log_common.c | ||
12331 | @@ -171,6 +171,18 @@ nf_log_dump_packet_common(struct nf_log_buf *m, u_int8_t pf, | ||
12332 | } | ||
12333 | EXPORT_SYMBOL_GPL(nf_log_dump_packet_common); | ||
12334 | |||
12335 | +void nf_log_dump_vlan(struct nf_log_buf *m, const struct sk_buff *skb) | ||
12336 | +{ | ||
12337 | + u16 vid; | ||
12338 | + | ||
12339 | + if (!skb_vlan_tag_present(skb)) | ||
12340 | + return; | ||
12341 | + | ||
12342 | + vid = skb_vlan_tag_get(skb); | ||
12343 | + nf_log_buf_add(m, "VPROTO=%04x VID=%u ", ntohs(skb->vlan_proto), vid); | ||
12344 | +} | ||
12345 | +EXPORT_SYMBOL_GPL(nf_log_dump_vlan); | ||
12346 | + | ||
12347 | /* bridge and netdev logging families share this code. */ | ||
12348 | void nf_log_l2packet(struct net *net, u_int8_t pf, | ||
12349 | __be16 protocol, | ||
12350 | diff --git a/net/netfilter/nft_fwd_netdev.c b/net/netfilter/nft_fwd_netdev.c | ||
12351 | index 3087e23297dbf..b77985986b24e 100644 | ||
12352 | --- a/net/netfilter/nft_fwd_netdev.c | ||
12353 | +++ b/net/netfilter/nft_fwd_netdev.c | ||
12354 | @@ -138,6 +138,7 @@ static void nft_fwd_neigh_eval(const struct nft_expr *expr, | ||
12355 | return; | ||
12356 | |||
12357 | skb->dev = dev; | ||
12358 | + skb->tstamp = 0; | ||
12359 | neigh_xmit(neigh_table, dev, addr, skb); | ||
12360 | out: | ||
12361 | regs->verdict.code = verdict; | ||
12362 | diff --git a/net/nfc/netlink.c b/net/nfc/netlink.c | ||
12363 | index 1b261375722e3..4170acc2dc282 100644 | ||
12364 | --- a/net/nfc/netlink.c | ||
12365 | +++ b/net/nfc/netlink.c | ||
12366 | @@ -1225,7 +1225,7 @@ static int nfc_genl_fw_download(struct sk_buff *skb, struct genl_info *info) | ||
12367 | u32 idx; | ||
12368 | char firmware_name[NFC_FIRMWARE_NAME_MAXSIZE + 1]; | ||
12369 | |||
12370 | - if (!info->attrs[NFC_ATTR_DEVICE_INDEX]) | ||
12371 | + if (!info->attrs[NFC_ATTR_DEVICE_INDEX] || !info->attrs[NFC_ATTR_FIRMWARE_NAME]) | ||
12372 | return -EINVAL; | ||
12373 | |||
12374 | idx = nla_get_u32(info->attrs[NFC_ATTR_DEVICE_INDEX]); | ||
12375 | diff --git a/net/sched/act_api.c b/net/sched/act_api.c | ||
12376 | index 4a5ef2adb2e57..1dc642b11443c 100644 | ||
12377 | --- a/net/sched/act_api.c | ||
12378 | +++ b/net/sched/act_api.c | ||
12379 | @@ -706,13 +706,6 @@ int tcf_action_destroy(struct tc_action *actions[], int bind) | ||
12380 | return ret; | ||
12381 | } | ||
12382 | |||
12383 | -static int tcf_action_destroy_1(struct tc_action *a, int bind) | ||
12384 | -{ | ||
12385 | - struct tc_action *actions[] = { a, NULL }; | ||
12386 | - | ||
12387 | - return tcf_action_destroy(actions, bind); | ||
12388 | -} | ||
12389 | - | ||
12390 | static int tcf_action_put(struct tc_action *p) | ||
12391 | { | ||
12392 | return __tcf_action_put(p, false); | ||
12393 | @@ -932,13 +925,6 @@ struct tc_action *tcf_action_init_1(struct net *net, struct tcf_proto *tp, | ||
12394 | if (err < 0) | ||
12395 | goto err_mod; | ||
12396 | |||
12397 | - if (TC_ACT_EXT_CMP(a->tcfa_action, TC_ACT_GOTO_CHAIN) && | ||
12398 | - !rcu_access_pointer(a->goto_chain)) { | ||
12399 | - tcf_action_destroy_1(a, bind); | ||
12400 | - NL_SET_ERR_MSG(extack, "can't use goto chain with NULL chain"); | ||
12401 | - return ERR_PTR(-EINVAL); | ||
12402 | - } | ||
12403 | - | ||
12404 | if (!name && tb[TCA_ACT_COOKIE]) | ||
12405 | tcf_set_action_cookie(&a->act_cookie, cookie); | ||
12406 | |||
12407 | diff --git a/net/sched/act_tunnel_key.c b/net/sched/act_tunnel_key.c | ||
12408 | index bdaa04a9a7fa4..a5a2bf01eb9bc 100644 | ||
12409 | --- a/net/sched/act_tunnel_key.c | ||
12410 | +++ b/net/sched/act_tunnel_key.c | ||
12411 | @@ -315,7 +315,7 @@ static int tunnel_key_init(struct net *net, struct nlattr *nla, | ||
12412 | |||
12413 | metadata = __ipv6_tun_set_dst(&saddr, &daddr, tos, ttl, dst_port, | ||
12414 | 0, flags, | ||
12415 | - key_id, 0); | ||
12416 | + key_id, opts_len); | ||
12417 | } else { | ||
12418 | NL_SET_ERR_MSG(extack, "Missing either ipv4 or ipv6 src and dst"); | ||
12419 | ret = -EINVAL; | ||
12420 | diff --git a/net/smc/smc_core.c b/net/smc/smc_core.c | ||
12421 | index 0c5fcb8ed404d..aeea67f908415 100644 | ||
12422 | --- a/net/smc/smc_core.c | ||
12423 | +++ b/net/smc/smc_core.c | ||
12424 | @@ -795,7 +795,7 @@ static struct smc_buf_desc *smcr_new_buf_create(struct smc_link_group *lgr, | ||
12425 | return buf_desc; | ||
12426 | } | ||
12427 | |||
12428 | -#define SMCD_DMBE_SIZES 7 /* 0 -> 16KB, 1 -> 32KB, .. 6 -> 1MB */ | ||
12429 | +#define SMCD_DMBE_SIZES 6 /* 0 -> 16KB, 1 -> 32KB, .. 6 -> 1MB */ | ||
12430 | |||
12431 | static struct smc_buf_desc *smcd_new_buf_create(struct smc_link_group *lgr, | ||
12432 | bool is_dmb, int bufsize) | ||
12433 | diff --git a/net/sunrpc/auth_gss/svcauth_gss.c b/net/sunrpc/auth_gss/svcauth_gss.c | ||
12434 | index 3645cd241d3ea..cf4d6d7e72822 100644 | ||
12435 | --- a/net/sunrpc/auth_gss/svcauth_gss.c | ||
12436 | +++ b/net/sunrpc/auth_gss/svcauth_gss.c | ||
12437 | @@ -1095,9 +1095,9 @@ static int gss_read_proxy_verf(struct svc_rqst *rqstp, | ||
12438 | struct gssp_in_token *in_token) | ||
12439 | { | ||
12440 | struct kvec *argv = &rqstp->rq_arg.head[0]; | ||
12441 | - unsigned int page_base, length; | ||
12442 | - int pages, i, res; | ||
12443 | - size_t inlen; | ||
12444 | + unsigned int length, pgto_offs, pgfrom_offs; | ||
12445 | + int pages, i, res, pgto, pgfrom; | ||
12446 | + size_t inlen, to_offs, from_offs; | ||
12447 | |||
12448 | res = gss_read_common_verf(gc, argv, authp, in_handle); | ||
12449 | if (res) | ||
12450 | @@ -1125,17 +1125,24 @@ static int gss_read_proxy_verf(struct svc_rqst *rqstp, | ||
12451 | memcpy(page_address(in_token->pages[0]), argv->iov_base, length); | ||
12452 | inlen -= length; | ||
12453 | |||
12454 | - i = 1; | ||
12455 | - page_base = rqstp->rq_arg.page_base; | ||
12456 | + to_offs = length; | ||
12457 | + from_offs = rqstp->rq_arg.page_base; | ||
12458 | while (inlen) { | ||
12459 | - length = min_t(unsigned int, inlen, PAGE_SIZE); | ||
12460 | - memcpy(page_address(in_token->pages[i]), | ||
12461 | - page_address(rqstp->rq_arg.pages[i]) + page_base, | ||
12462 | + pgto = to_offs >> PAGE_SHIFT; | ||
12463 | + pgfrom = from_offs >> PAGE_SHIFT; | ||
12464 | + pgto_offs = to_offs & ~PAGE_MASK; | ||
12465 | + pgfrom_offs = from_offs & ~PAGE_MASK; | ||
12466 | + | ||
12467 | + length = min_t(unsigned int, inlen, | ||
12468 | + min_t(unsigned int, PAGE_SIZE - pgto_offs, | ||
12469 | + PAGE_SIZE - pgfrom_offs)); | ||
12470 | + memcpy(page_address(in_token->pages[pgto]) + pgto_offs, | ||
12471 | + page_address(rqstp->rq_arg.pages[pgfrom]) + pgfrom_offs, | ||
12472 | length); | ||
12473 | |||
12474 | + to_offs += length; | ||
12475 | + from_offs += length; | ||
12476 | inlen -= length; | ||
12477 | - page_base = 0; | ||
12478 | - i++; | ||
12479 | } | ||
12480 | return 0; | ||
12481 | } | ||
12482 | diff --git a/net/sunrpc/xprtrdma/svc_rdma_sendto.c b/net/sunrpc/xprtrdma/svc_rdma_sendto.c | ||
12483 | index 217106c66a13c..25e8922c10b28 100644 | ||
12484 | --- a/net/sunrpc/xprtrdma/svc_rdma_sendto.c | ||
12485 | +++ b/net/sunrpc/xprtrdma/svc_rdma_sendto.c | ||
12486 | @@ -609,10 +609,11 @@ static int svc_rdma_pull_up_reply_msg(struct svcxprt_rdma *rdma, | ||
12487 | while (remaining) { | ||
12488 | len = min_t(u32, PAGE_SIZE - pageoff, remaining); | ||
12489 | |||
12490 | - memcpy(dst, page_address(*ppages), len); | ||
12491 | + memcpy(dst, page_address(*ppages) + pageoff, len); | ||
12492 | remaining -= len; | ||
12493 | dst += len; | ||
12494 | pageoff = 0; | ||
12495 | + ppages++; | ||
12496 | } | ||
12497 | } | ||
12498 | |||
12499 | diff --git a/net/tipc/msg.c b/net/tipc/msg.c | ||
12500 | index ee4b2261e7957..b0ed3c944b2d1 100644 | ||
12501 | --- a/net/tipc/msg.c | ||
12502 | +++ b/net/tipc/msg.c | ||
12503 | @@ -140,7 +140,8 @@ int tipc_buf_append(struct sk_buff **headbuf, struct sk_buff **buf) | ||
12504 | if (fragid == FIRST_FRAGMENT) { | ||
12505 | if (unlikely(head)) | ||
12506 | goto err; | ||
12507 | - frag = skb_unshare(frag, GFP_ATOMIC); | ||
12508 | + if (skb_cloned(frag)) | ||
12509 | + frag = skb_copy(frag, GFP_ATOMIC); | ||
12510 | if (unlikely(!frag)) | ||
12511 | goto err; | ||
12512 | head = *headbuf = frag; | ||
12513 | diff --git a/net/tls/tls_device.c b/net/tls/tls_device.c | ||
12514 | index 25fca390cdcf5..933a3187d3bf2 100644 | ||
12515 | --- a/net/tls/tls_device.c | ||
12516 | +++ b/net/tls/tls_device.c | ||
12517 | @@ -405,14 +405,14 @@ static int tls_push_data(struct sock *sk, | ||
12518 | struct tls_context *tls_ctx = tls_get_ctx(sk); | ||
12519 | struct tls_prot_info *prot = &tls_ctx->prot_info; | ||
12520 | struct tls_offload_context_tx *ctx = tls_offload_ctx_tx(tls_ctx); | ||
12521 | - int more = flags & (MSG_SENDPAGE_NOTLAST | MSG_MORE); | ||
12522 | struct tls_record_info *record = ctx->open_record; | ||
12523 | int tls_push_record_flags; | ||
12524 | struct page_frag *pfrag; | ||
12525 | size_t orig_size = size; | ||
12526 | u32 max_open_record_len; | ||
12527 | - int copy, rc = 0; | ||
12528 | + bool more = false; | ||
12529 | bool done = false; | ||
12530 | + int copy, rc = 0; | ||
12531 | long timeo; | ||
12532 | |||
12533 | if (flags & | ||
12534 | @@ -480,9 +480,8 @@ handle_error: | ||
12535 | if (!size) { | ||
12536 | last_record: | ||
12537 | tls_push_record_flags = flags; | ||
12538 | - if (more) { | ||
12539 | - tls_ctx->pending_open_record_frags = | ||
12540 | - !!record->num_frags; | ||
12541 | + if (flags & (MSG_SENDPAGE_NOTLAST | MSG_MORE)) { | ||
12542 | + more = true; | ||
12543 | break; | ||
12544 | } | ||
12545 | |||
12546 | @@ -514,6 +513,8 @@ last_record: | ||
12547 | } | ||
12548 | } while (!done); | ||
12549 | |||
12550 | + tls_ctx->pending_open_record_frags = more; | ||
12551 | + | ||
12552 | if (orig_size - size > 0) | ||
12553 | rc = orig_size - size; | ||
12554 | |||
12555 | diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c | ||
12556 | index 7bc4f37655237..672b70730e898 100644 | ||
12557 | --- a/net/wireless/nl80211.c | ||
12558 | +++ b/net/wireless/nl80211.c | ||
12559 | @@ -2227,7 +2227,10 @@ static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev, | ||
12560 | * case we'll continue with more data in the next round, | ||
12561 | * but break unconditionally so unsplit data stops here. | ||
12562 | */ | ||
12563 | - state->split_start++; | ||
12564 | + if (state->split) | ||
12565 | + state->split_start++; | ||
12566 | + else | ||
12567 | + state->split_start = 0; | ||
12568 | break; | ||
12569 | case 9: | ||
12570 | if (rdev->wiphy.extended_capabilities && | ||
12571 | @@ -4496,16 +4499,14 @@ static int nl80211_parse_he_obss_pd(struct nlattr *attrs, | ||
12572 | if (err) | ||
12573 | return err; | ||
12574 | |||
12575 | - if (!tb[NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET] || | ||
12576 | - !tb[NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET]) | ||
12577 | - return -EINVAL; | ||
12578 | - | ||
12579 | - he_obss_pd->min_offset = | ||
12580 | - nla_get_u32(tb[NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET]); | ||
12581 | - he_obss_pd->max_offset = | ||
12582 | - nla_get_u32(tb[NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET]); | ||
12583 | + if (tb[NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET]) | ||
12584 | + he_obss_pd->min_offset = | ||
12585 | + nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET]); | ||
12586 | + if (tb[NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET]) | ||
12587 | + he_obss_pd->max_offset = | ||
12588 | + nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET]); | ||
12589 | |||
12590 | - if (he_obss_pd->min_offset >= he_obss_pd->max_offset) | ||
12591 | + if (he_obss_pd->min_offset > he_obss_pd->max_offset) | ||
12592 | return -EINVAL; | ||
12593 | |||
12594 | he_obss_pd->enable = true; | ||
12595 | diff --git a/samples/mic/mpssd/mpssd.c b/samples/mic/mpssd/mpssd.c | ||
12596 | index a11bf6c5b53b4..cd3f16a6f5caf 100644 | ||
12597 | --- a/samples/mic/mpssd/mpssd.c | ||
12598 | +++ b/samples/mic/mpssd/mpssd.c | ||
12599 | @@ -403,9 +403,9 @@ mic_virtio_copy(struct mic_info *mic, int fd, | ||
12600 | |||
12601 | static inline unsigned _vring_size(unsigned int num, unsigned long align) | ||
12602 | { | ||
12603 | - return ((sizeof(struct vring_desc) * num + sizeof(__u16) * (3 + num) | ||
12604 | + return _ALIGN_UP(((sizeof(struct vring_desc) * num + sizeof(__u16) * (3 + num) | ||
12605 | + align - 1) & ~(align - 1)) | ||
12606 | - + sizeof(__u16) * 3 + sizeof(struct vring_used_elem) * num; | ||
12607 | + + sizeof(__u16) * 3 + sizeof(struct vring_used_elem) * num, 4); | ||
12608 | } | ||
12609 | |||
12610 | /* | ||
12611 | diff --git a/security/integrity/ima/ima_crypto.c b/security/integrity/ima/ima_crypto.c | ||
12612 | index d5ad7b2539c75..d86825261b515 100644 | ||
12613 | --- a/security/integrity/ima/ima_crypto.c | ||
12614 | +++ b/security/integrity/ima/ima_crypto.c | ||
12615 | @@ -688,6 +688,8 @@ static int ima_calc_boot_aggregate_tfm(char *digest, u16 alg_id, | ||
12616 | /* now accumulate with current aggregate */ | ||
12617 | rc = crypto_shash_update(shash, d.digest, | ||
12618 | crypto_shash_digestsize(tfm)); | ||
12619 | + if (rc != 0) | ||
12620 | + return rc; | ||
12621 | } | ||
12622 | if (!rc) | ||
12623 | crypto_shash_final(shash, digest); | ||
12624 | diff --git a/sound/core/seq/oss/seq_oss.c b/sound/core/seq/oss/seq_oss.c | ||
12625 | index c8b9c0b315d8f..250a92b187265 100644 | ||
12626 | --- a/sound/core/seq/oss/seq_oss.c | ||
12627 | +++ b/sound/core/seq/oss/seq_oss.c | ||
12628 | @@ -174,9 +174,12 @@ odev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | ||
12629 | if (snd_BUG_ON(!dp)) | ||
12630 | return -ENXIO; | ||
12631 | |||
12632 | - mutex_lock(®ister_mutex); | ||
12633 | + if (cmd != SNDCTL_SEQ_SYNC && | ||
12634 | + mutex_lock_interruptible(®ister_mutex)) | ||
12635 | + return -ERESTARTSYS; | ||
12636 | rc = snd_seq_oss_ioctl(dp, cmd, arg); | ||
12637 | - mutex_unlock(®ister_mutex); | ||
12638 | + if (cmd != SNDCTL_SEQ_SYNC) | ||
12639 | + mutex_unlock(®ister_mutex); | ||
12640 | return rc; | ||
12641 | } | ||
12642 | |||
12643 | diff --git a/sound/firewire/bebob/bebob_hwdep.c b/sound/firewire/bebob/bebob_hwdep.c | ||
12644 | index 45b740f44c459..c362eb38ab906 100644 | ||
12645 | --- a/sound/firewire/bebob/bebob_hwdep.c | ||
12646 | +++ b/sound/firewire/bebob/bebob_hwdep.c | ||
12647 | @@ -36,12 +36,11 @@ hwdep_read(struct snd_hwdep *hwdep, char __user *buf, long count, | ||
12648 | } | ||
12649 | |||
12650 | memset(&event, 0, sizeof(event)); | ||
12651 | + count = min_t(long, count, sizeof(event.lock_status)); | ||
12652 | if (bebob->dev_lock_changed) { | ||
12653 | event.lock_status.type = SNDRV_FIREWIRE_EVENT_LOCK_STATUS; | ||
12654 | event.lock_status.status = (bebob->dev_lock_count > 0); | ||
12655 | bebob->dev_lock_changed = false; | ||
12656 | - | ||
12657 | - count = min_t(long, count, sizeof(event.lock_status)); | ||
12658 | } | ||
12659 | |||
12660 | spin_unlock_irq(&bebob->lock); | ||
12661 | diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c | ||
12662 | index 590ea262f2e20..9a1968932b783 100644 | ||
12663 | --- a/sound/pci/hda/hda_intel.c | ||
12664 | +++ b/sound/pci/hda/hda_intel.c | ||
12665 | @@ -1001,12 +1001,14 @@ static void __azx_runtime_resume(struct azx *chip, bool from_rt) | ||
12666 | azx_init_pci(chip); | ||
12667 | hda_intel_init_chip(chip, true); | ||
12668 | |||
12669 | - if (status && from_rt) { | ||
12670 | - list_for_each_codec(codec, &chip->bus) | ||
12671 | - if (!codec->relaxed_resume && | ||
12672 | - (status & (1 << codec->addr))) | ||
12673 | - schedule_delayed_work(&codec->jackpoll_work, | ||
12674 | - codec->jackpoll_interval); | ||
12675 | + if (from_rt) { | ||
12676 | + list_for_each_codec(codec, &chip->bus) { | ||
12677 | + if (codec->relaxed_resume) | ||
12678 | + continue; | ||
12679 | + | ||
12680 | + if (codec->forced_resume || (status & (1 << codec->addr))) | ||
12681 | + pm_request_resume(hda_codec_dev(codec)); | ||
12682 | + } | ||
12683 | } | ||
12684 | |||
12685 | /* power down again for link-controlled chips */ | ||
12686 | diff --git a/sound/pci/hda/patch_ca0132.c b/sound/pci/hda/patch_ca0132.c | ||
12687 | index 6aa39339db0ab..459aff6c10bc5 100644 | ||
12688 | --- a/sound/pci/hda/patch_ca0132.c | ||
12689 | +++ b/sound/pci/hda/patch_ca0132.c | ||
12690 | @@ -1065,6 +1065,7 @@ enum { | ||
12691 | QUIRK_R3DI, | ||
12692 | QUIRK_R3D, | ||
12693 | QUIRK_AE5, | ||
12694 | + QUIRK_AE7, | ||
12695 | }; | ||
12696 | |||
12697 | #ifdef CONFIG_PCI | ||
12698 | @@ -1184,6 +1185,7 @@ static const struct snd_pci_quirk ca0132_quirks[] = { | ||
12699 | SND_PCI_QUIRK(0x1102, 0x0013, "Recon3D", QUIRK_R3D), | ||
12700 | SND_PCI_QUIRK(0x1102, 0x0018, "Recon3D", QUIRK_R3D), | ||
12701 | SND_PCI_QUIRK(0x1102, 0x0051, "Sound Blaster AE-5", QUIRK_AE5), | ||
12702 | + SND_PCI_QUIRK(0x1102, 0x0081, "Sound Blaster AE-7", QUIRK_AE7), | ||
12703 | {} | ||
12704 | }; | ||
12705 | |||
12706 | @@ -4674,6 +4676,15 @@ static int ca0132_alt_select_in(struct hda_codec *codec) | ||
12707 | ca0113_mmio_command_set(codec, 0x30, 0x28, 0x00); | ||
12708 | tmp = FLOAT_THREE; | ||
12709 | break; | ||
12710 | + case QUIRK_AE7: | ||
12711 | + ca0113_mmio_command_set(codec, 0x30, 0x28, 0x00); | ||
12712 | + tmp = FLOAT_THREE; | ||
12713 | + chipio_set_conn_rate(codec, MEM_CONNID_MICIN2, | ||
12714 | + SR_96_000); | ||
12715 | + chipio_set_conn_rate(codec, MEM_CONNID_MICOUT2, | ||
12716 | + SR_96_000); | ||
12717 | + dspio_set_uint_param(codec, 0x80, 0x01, FLOAT_ZERO); | ||
12718 | + break; | ||
12719 | default: | ||
12720 | tmp = FLOAT_ONE; | ||
12721 | break; | ||
12722 | @@ -4719,6 +4730,14 @@ static int ca0132_alt_select_in(struct hda_codec *codec) | ||
12723 | case QUIRK_AE5: | ||
12724 | ca0113_mmio_command_set(codec, 0x30, 0x28, 0x00); | ||
12725 | break; | ||
12726 | + case QUIRK_AE7: | ||
12727 | + ca0113_mmio_command_set(codec, 0x30, 0x28, 0x3f); | ||
12728 | + chipio_set_conn_rate(codec, MEM_CONNID_MICIN2, | ||
12729 | + SR_96_000); | ||
12730 | + chipio_set_conn_rate(codec, MEM_CONNID_MICOUT2, | ||
12731 | + SR_96_000); | ||
12732 | + dspio_set_uint_param(codec, 0x80, 0x01, FLOAT_ZERO); | ||
12733 | + break; | ||
12734 | default: | ||
12735 | break; | ||
12736 | } | ||
12737 | @@ -4728,7 +4747,10 @@ static int ca0132_alt_select_in(struct hda_codec *codec) | ||
12738 | if (ca0132_quirk(spec) == QUIRK_R3DI) | ||
12739 | chipio_set_conn_rate(codec, 0x0F, SR_96_000); | ||
12740 | |||
12741 | - tmp = FLOAT_ZERO; | ||
12742 | + if (ca0132_quirk(spec) == QUIRK_AE7) | ||
12743 | + tmp = FLOAT_THREE; | ||
12744 | + else | ||
12745 | + tmp = FLOAT_ZERO; | ||
12746 | dspio_set_uint_param(codec, 0x80, 0x00, tmp); | ||
12747 | |||
12748 | switch (ca0132_quirk(spec)) { | ||
12749 | diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c | ||
12750 | index 51798632d334c..df4771b9eff24 100644 | ||
12751 | --- a/sound/pci/hda/patch_hdmi.c | ||
12752 | +++ b/sound/pci/hda/patch_hdmi.c | ||
12753 | @@ -2001,22 +2001,25 @@ static int hdmi_pcm_close(struct hda_pcm_stream *hinfo, | ||
12754 | int pinctl; | ||
12755 | int err = 0; | ||
12756 | |||
12757 | + mutex_lock(&spec->pcm_lock); | ||
12758 | if (hinfo->nid) { | ||
12759 | pcm_idx = hinfo_to_pcm_index(codec, hinfo); | ||
12760 | - if (snd_BUG_ON(pcm_idx < 0)) | ||
12761 | - return -EINVAL; | ||
12762 | + if (snd_BUG_ON(pcm_idx < 0)) { | ||
12763 | + err = -EINVAL; | ||
12764 | + goto unlock; | ||
12765 | + } | ||
12766 | cvt_idx = cvt_nid_to_cvt_index(codec, hinfo->nid); | ||
12767 | - if (snd_BUG_ON(cvt_idx < 0)) | ||
12768 | - return -EINVAL; | ||
12769 | + if (snd_BUG_ON(cvt_idx < 0)) { | ||
12770 | + err = -EINVAL; | ||
12771 | + goto unlock; | ||
12772 | + } | ||
12773 | per_cvt = get_cvt(spec, cvt_idx); | ||
12774 | - | ||
12775 | snd_BUG_ON(!per_cvt->assigned); | ||
12776 | per_cvt->assigned = 0; | ||
12777 | hinfo->nid = 0; | ||
12778 | |||
12779 | azx_stream(get_azx_dev(substream))->stripe = 0; | ||
12780 | |||
12781 | - mutex_lock(&spec->pcm_lock); | ||
12782 | snd_hda_spdif_ctls_unassign(codec, pcm_idx); | ||
12783 | clear_bit(pcm_idx, &spec->pcm_in_use); | ||
12784 | pin_idx = hinfo_to_pin_index(codec, hinfo); | ||
12785 | @@ -2044,10 +2047,11 @@ static int hdmi_pcm_close(struct hda_pcm_stream *hinfo, | ||
12786 | per_pin->setup = false; | ||
12787 | per_pin->channels = 0; | ||
12788 | mutex_unlock(&per_pin->lock); | ||
12789 | - unlock: | ||
12790 | - mutex_unlock(&spec->pcm_lock); | ||
12791 | } | ||
12792 | |||
12793 | +unlock: | ||
12794 | + mutex_unlock(&spec->pcm_lock); | ||
12795 | + | ||
12796 | return err; | ||
12797 | } | ||
12798 | |||
12799 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c | ||
12800 | index 4dfd714f718b8..7a24e9f0d2fe7 100644 | ||
12801 | --- a/sound/pci/hda/patch_realtek.c | ||
12802 | +++ b/sound/pci/hda/patch_realtek.c | ||
12803 | @@ -1141,6 +1141,7 @@ static int alc_alloc_spec(struct hda_codec *codec, hda_nid_t mixer_nid) | ||
12804 | codec->single_adc_amp = 1; | ||
12805 | /* FIXME: do we need this for all Realtek codec models? */ | ||
12806 | codec->spdif_status_reset = 1; | ||
12807 | + codec->forced_resume = 1; | ||
12808 | codec->patch_ops = alc_patch_ops; | ||
12809 | |||
12810 | err = alc_codec_rename_from_preset(codec); | ||
12811 | @@ -1920,6 +1921,8 @@ enum { | ||
12812 | ALC1220_FIXUP_CLEVO_P950, | ||
12813 | ALC1220_FIXUP_CLEVO_PB51ED, | ||
12814 | ALC1220_FIXUP_CLEVO_PB51ED_PINS, | ||
12815 | + ALC887_FIXUP_ASUS_AUDIO, | ||
12816 | + ALC887_FIXUP_ASUS_HMIC, | ||
12817 | }; | ||
12818 | |||
12819 | static void alc889_fixup_coef(struct hda_codec *codec, | ||
12820 | @@ -2132,6 +2135,31 @@ static void alc1220_fixup_clevo_pb51ed(struct hda_codec *codec, | ||
12821 | alc_fixup_headset_mode_no_hp_mic(codec, fix, action); | ||
12822 | } | ||
12823 | |||
12824 | +static void alc887_asus_hp_automute_hook(struct hda_codec *codec, | ||
12825 | + struct hda_jack_callback *jack) | ||
12826 | +{ | ||
12827 | + struct alc_spec *spec = codec->spec; | ||
12828 | + unsigned int vref; | ||
12829 | + | ||
12830 | + snd_hda_gen_hp_automute(codec, jack); | ||
12831 | + | ||
12832 | + if (spec->gen.hp_jack_present) | ||
12833 | + vref = AC_PINCTL_VREF_80; | ||
12834 | + else | ||
12835 | + vref = AC_PINCTL_VREF_HIZ; | ||
12836 | + snd_hda_set_pin_ctl(codec, 0x19, PIN_HP | vref); | ||
12837 | +} | ||
12838 | + | ||
12839 | +static void alc887_fixup_asus_jack(struct hda_codec *codec, | ||
12840 | + const struct hda_fixup *fix, int action) | ||
12841 | +{ | ||
12842 | + struct alc_spec *spec = codec->spec; | ||
12843 | + if (action != HDA_FIXUP_ACT_PROBE) | ||
12844 | + return; | ||
12845 | + snd_hda_set_pin_ctl_cache(codec, 0x1b, PIN_HP); | ||
12846 | + spec->gen.hp_automute_hook = alc887_asus_hp_automute_hook; | ||
12847 | +} | ||
12848 | + | ||
12849 | static const struct hda_fixup alc882_fixups[] = { | ||
12850 | [ALC882_FIXUP_ABIT_AW9D_MAX] = { | ||
12851 | .type = HDA_FIXUP_PINS, | ||
12852 | @@ -2389,6 +2417,20 @@ static const struct hda_fixup alc882_fixups[] = { | ||
12853 | .chained = true, | ||
12854 | .chain_id = ALC1220_FIXUP_CLEVO_PB51ED, | ||
12855 | }, | ||
12856 | + [ALC887_FIXUP_ASUS_AUDIO] = { | ||
12857 | + .type = HDA_FIXUP_PINS, | ||
12858 | + .v.pins = (const struct hda_pintbl[]) { | ||
12859 | + { 0x15, 0x02a14150 }, /* use as headset mic, without its own jack detect */ | ||
12860 | + { 0x19, 0x22219420 }, | ||
12861 | + {} | ||
12862 | + }, | ||
12863 | + }, | ||
12864 | + [ALC887_FIXUP_ASUS_HMIC] = { | ||
12865 | + .type = HDA_FIXUP_FUNC, | ||
12866 | + .v.func = alc887_fixup_asus_jack, | ||
12867 | + .chained = true, | ||
12868 | + .chain_id = ALC887_FIXUP_ASUS_AUDIO, | ||
12869 | + }, | ||
12870 | }; | ||
12871 | |||
12872 | static const struct snd_pci_quirk alc882_fixup_tbl[] = { | ||
12873 | @@ -2422,6 +2464,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = { | ||
12874 | SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD), | ||
12875 | SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V), | ||
12876 | SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_FIXUP_ASUS_W2JC), | ||
12877 | + SND_PCI_QUIRK(0x1043, 0x2390, "Asus D700SA", ALC887_FIXUP_ASUS_HMIC), | ||
12878 | SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_FIXUP_EEE1601), | ||
12879 | SND_PCI_QUIRK(0x1043, 0x84bc, "ASUS ET2700", ALC887_FIXUP_ASUS_BASS), | ||
12880 | SND_PCI_QUIRK(0x1043, 0x8691, "ASUS ROG Ranger VIII", ALC882_FIXUP_GPIO3), | ||
12881 | @@ -6215,6 +6258,7 @@ enum { | ||
12882 | ALC269_FIXUP_LEMOTE_A190X, | ||
12883 | ALC256_FIXUP_INTEL_NUC8_RUGGED, | ||
12884 | ALC255_FIXUP_XIAOMI_HEADSET_MIC, | ||
12885 | + ALC274_FIXUP_HP_MIC, | ||
12886 | }; | ||
12887 | |||
12888 | static const struct hda_fixup alc269_fixups[] = { | ||
12889 | @@ -7594,6 +7638,14 @@ static const struct hda_fixup alc269_fixups[] = { | ||
12890 | .chained = true, | ||
12891 | .chain_id = ALC289_FIXUP_ASUS_GA401 | ||
12892 | }, | ||
12893 | + [ALC274_FIXUP_HP_MIC] = { | ||
12894 | + .type = HDA_FIXUP_VERBS, | ||
12895 | + .v.verbs = (const struct hda_verb[]) { | ||
12896 | + { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 }, | ||
12897 | + { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 }, | ||
12898 | + { } | ||
12899 | + }, | ||
12900 | + }, | ||
12901 | }; | ||
12902 | |||
12903 | static const struct snd_pci_quirk alc269_fixup_tbl[] = { | ||
12904 | @@ -7745,6 +7797,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | ||
12905 | SND_PCI_QUIRK(0x103c, 0x869d, "HP", ALC236_FIXUP_HP_MUTE_LED), | ||
12906 | SND_PCI_QUIRK(0x103c, 0x8729, "HP", ALC285_FIXUP_HP_GPIO_LED), | ||
12907 | SND_PCI_QUIRK(0x103c, 0x8736, "HP", ALC285_FIXUP_HP_GPIO_AMP_INIT), | ||
12908 | + SND_PCI_QUIRK(0x103c, 0x874e, "HP", ALC274_FIXUP_HP_MIC), | ||
12909 | + SND_PCI_QUIRK(0x103c, 0x8760, "HP", ALC285_FIXUP_HP_MUTE_LED), | ||
12910 | SND_PCI_QUIRK(0x103c, 0x877a, "HP", ALC285_FIXUP_HP_MUTE_LED), | ||
12911 | SND_PCI_QUIRK(0x103c, 0x877d, "HP", ALC236_FIXUP_HP_MUTE_LED), | ||
12912 | SND_PCI_QUIRK(0x1043, 0x103e, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC), | ||
12913 | @@ -8070,6 +8124,7 @@ static const struct hda_model_fixup alc269_fixup_models[] = { | ||
12914 | {.id = ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE, .name = "alc256-medion-headset"}, | ||
12915 | {.id = ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET, .name = "alc298-samsung-headphone"}, | ||
12916 | {.id = ALC255_FIXUP_XIAOMI_HEADSET_MIC, .name = "alc255-xiaomi-headset"}, | ||
12917 | + {.id = ALC274_FIXUP_HP_MIC, .name = "alc274-hp-mic-detect"}, | ||
12918 | {} | ||
12919 | }; | ||
12920 | #define ALC225_STANDARD_PINS \ | ||
12921 | @@ -9633,6 +9688,7 @@ static const struct snd_pci_quirk alc662_fixup_tbl[] = { | ||
12922 | SND_PCI_QUIRK(0x1028, 0x0698, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE), | ||
12923 | SND_PCI_QUIRK(0x1028, 0x069f, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE), | ||
12924 | SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800), | ||
12925 | + SND_PCI_QUIRK(0x103c, 0x873e, "HP", ALC671_FIXUP_HP_HEADSET_MIC2), | ||
12926 | SND_PCI_QUIRK(0x1043, 0x1080, "Asus UX501VW", ALC668_FIXUP_HEADSET_MODE), | ||
12927 | SND_PCI_QUIRK(0x1043, 0x11cd, "Asus N550", ALC662_FIXUP_ASUS_Nx50), | ||
12928 | SND_PCI_QUIRK(0x1043, 0x13df, "Asus N550JX", ALC662_FIXUP_BASS_1A), | ||
12929 | diff --git a/sound/soc/codecs/tlv320aic32x4.c b/sound/soc/codecs/tlv320aic32x4.c | ||
12930 | index 68165de1c8dea..7a1ffbaf48be5 100644 | ||
12931 | --- a/sound/soc/codecs/tlv320aic32x4.c | ||
12932 | +++ b/sound/soc/codecs/tlv320aic32x4.c | ||
12933 | @@ -662,7 +662,7 @@ static int aic32x4_set_processing_blocks(struct snd_soc_component *component, | ||
12934 | } | ||
12935 | |||
12936 | static int aic32x4_setup_clocks(struct snd_soc_component *component, | ||
12937 | - unsigned int sample_rate) | ||
12938 | + unsigned int sample_rate, unsigned int channels) | ||
12939 | { | ||
12940 | u8 aosr; | ||
12941 | u16 dosr; | ||
12942 | @@ -750,7 +750,9 @@ static int aic32x4_setup_clocks(struct snd_soc_component *component, | ||
12943 | dosr); | ||
12944 | |||
12945 | clk_set_rate(clocks[5].clk, | ||
12946 | - sample_rate * 32); | ||
12947 | + sample_rate * 32 * | ||
12948 | + channels); | ||
12949 | + | ||
12950 | return 0; | ||
12951 | } | ||
12952 | } | ||
12953 | @@ -772,7 +774,8 @@ static int aic32x4_hw_params(struct snd_pcm_substream *substream, | ||
12954 | u8 iface1_reg = 0; | ||
12955 | u8 dacsetup_reg = 0; | ||
12956 | |||
12957 | - aic32x4_setup_clocks(component, params_rate(params)); | ||
12958 | + aic32x4_setup_clocks(component, params_rate(params), | ||
12959 | + params_channels(params)); | ||
12960 | |||
12961 | switch (params_width(params)) { | ||
12962 | case 16: | ||
12963 | diff --git a/sound/soc/fsl/fsl_sai.c b/sound/soc/fsl/fsl_sai.c | ||
12964 | index 914b75c23d1bf..027259695551c 100644 | ||
12965 | --- a/sound/soc/fsl/fsl_sai.c | ||
12966 | +++ b/sound/soc/fsl/fsl_sai.c | ||
12967 | @@ -694,7 +694,7 @@ static int fsl_sai_dai_probe(struct snd_soc_dai *cpu_dai) | ||
12968 | return 0; | ||
12969 | } | ||
12970 | |||
12971 | -static struct snd_soc_dai_driver fsl_sai_dai = { | ||
12972 | +static struct snd_soc_dai_driver fsl_sai_dai_template = { | ||
12973 | .probe = fsl_sai_dai_probe, | ||
12974 | .playback = { | ||
12975 | .stream_name = "CPU-Playback", | ||
12976 | @@ -965,12 +965,15 @@ static int fsl_sai_probe(struct platform_device *pdev) | ||
12977 | return ret; | ||
12978 | } | ||
12979 | |||
12980 | + memcpy(&sai->cpu_dai_drv, &fsl_sai_dai_template, | ||
12981 | + sizeof(fsl_sai_dai_template)); | ||
12982 | + | ||
12983 | /* Sync Tx with Rx as default by following old DT binding */ | ||
12984 | sai->synchronous[RX] = true; | ||
12985 | sai->synchronous[TX] = false; | ||
12986 | - fsl_sai_dai.symmetric_rates = 1; | ||
12987 | - fsl_sai_dai.symmetric_channels = 1; | ||
12988 | - fsl_sai_dai.symmetric_samplebits = 1; | ||
12989 | + sai->cpu_dai_drv.symmetric_rates = 1; | ||
12990 | + sai->cpu_dai_drv.symmetric_channels = 1; | ||
12991 | + sai->cpu_dai_drv.symmetric_samplebits = 1; | ||
12992 | |||
12993 | if (of_find_property(np, "fsl,sai-synchronous-rx", NULL) && | ||
12994 | of_find_property(np, "fsl,sai-asynchronous", NULL)) { | ||
12995 | @@ -987,9 +990,9 @@ static int fsl_sai_probe(struct platform_device *pdev) | ||
12996 | /* Discard all settings for asynchronous mode */ | ||
12997 | sai->synchronous[RX] = false; | ||
12998 | sai->synchronous[TX] = false; | ||
12999 | - fsl_sai_dai.symmetric_rates = 0; | ||
13000 | - fsl_sai_dai.symmetric_channels = 0; | ||
13001 | - fsl_sai_dai.symmetric_samplebits = 0; | ||
13002 | + sai->cpu_dai_drv.symmetric_rates = 0; | ||
13003 | + sai->cpu_dai_drv.symmetric_channels = 0; | ||
13004 | + sai->cpu_dai_drv.symmetric_samplebits = 0; | ||
13005 | } | ||
13006 | |||
13007 | if (of_find_property(np, "fsl,sai-mclk-direction-output", NULL) && | ||
13008 | @@ -1018,7 +1021,7 @@ static int fsl_sai_probe(struct platform_device *pdev) | ||
13009 | pm_runtime_enable(&pdev->dev); | ||
13010 | |||
13011 | ret = devm_snd_soc_register_component(&pdev->dev, &fsl_component, | ||
13012 | - &fsl_sai_dai, 1); | ||
13013 | + &sai->cpu_dai_drv, 1); | ||
13014 | if (ret) | ||
13015 | goto err_pm_disable; | ||
13016 | |||
13017 | diff --git a/sound/soc/fsl/fsl_sai.h b/sound/soc/fsl/fsl_sai.h | ||
13018 | index 6aba7d28f5f34..677ecfc1ec68f 100644 | ||
13019 | --- a/sound/soc/fsl/fsl_sai.h | ||
13020 | +++ b/sound/soc/fsl/fsl_sai.h | ||
13021 | @@ -180,6 +180,7 @@ struct fsl_sai { | ||
13022 | unsigned int bclk_ratio; | ||
13023 | |||
13024 | const struct fsl_sai_soc_data *soc_data; | ||
13025 | + struct snd_soc_dai_driver cpu_dai_drv; | ||
13026 | struct snd_dmaengine_dai_dma_data dma_params_rx; | ||
13027 | struct snd_dmaengine_dai_dma_data dma_params_tx; | ||
13028 | }; | ||
13029 | diff --git a/sound/soc/fsl/imx-es8328.c b/sound/soc/fsl/imx-es8328.c | ||
13030 | index 15a27a2cd0cae..fad1eb6253d53 100644 | ||
13031 | --- a/sound/soc/fsl/imx-es8328.c | ||
13032 | +++ b/sound/soc/fsl/imx-es8328.c | ||
13033 | @@ -145,13 +145,13 @@ static int imx_es8328_probe(struct platform_device *pdev) | ||
13034 | data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); | ||
13035 | if (!data) { | ||
13036 | ret = -ENOMEM; | ||
13037 | - goto fail; | ||
13038 | + goto put_device; | ||
13039 | } | ||
13040 | |||
13041 | comp = devm_kzalloc(dev, 3 * sizeof(*comp), GFP_KERNEL); | ||
13042 | if (!comp) { | ||
13043 | ret = -ENOMEM; | ||
13044 | - goto fail; | ||
13045 | + goto put_device; | ||
13046 | } | ||
13047 | |||
13048 | data->dev = dev; | ||
13049 | @@ -182,12 +182,12 @@ static int imx_es8328_probe(struct platform_device *pdev) | ||
13050 | ret = snd_soc_of_parse_card_name(&data->card, "model"); | ||
13051 | if (ret) { | ||
13052 | dev_err(dev, "Unable to parse card name\n"); | ||
13053 | - goto fail; | ||
13054 | + goto put_device; | ||
13055 | } | ||
13056 | ret = snd_soc_of_parse_audio_routing(&data->card, "audio-routing"); | ||
13057 | if (ret) { | ||
13058 | dev_err(dev, "Unable to parse routing: %d\n", ret); | ||
13059 | - goto fail; | ||
13060 | + goto put_device; | ||
13061 | } | ||
13062 | data->card.num_links = 1; | ||
13063 | data->card.owner = THIS_MODULE; | ||
13064 | @@ -196,10 +196,12 @@ static int imx_es8328_probe(struct platform_device *pdev) | ||
13065 | ret = snd_soc_register_card(&data->card); | ||
13066 | if (ret) { | ||
13067 | dev_err(dev, "Unable to register: %d\n", ret); | ||
13068 | - goto fail; | ||
13069 | + goto put_device; | ||
13070 | } | ||
13071 | |||
13072 | platform_set_drvdata(pdev, data); | ||
13073 | +put_device: | ||
13074 | + put_device(&ssi_pdev->dev); | ||
13075 | fail: | ||
13076 | of_node_put(ssi_np); | ||
13077 | of_node_put(codec_np); | ||
13078 | diff --git a/sound/soc/qcom/lpass-cpu.c b/sound/soc/qcom/lpass-cpu.c | ||
13079 | index dbce7e92baf3c..c5d6952a4a33f 100644 | ||
13080 | --- a/sound/soc/qcom/lpass-cpu.c | ||
13081 | +++ b/sound/soc/qcom/lpass-cpu.c | ||
13082 | @@ -174,21 +174,6 @@ static int lpass_cpu_daiops_hw_params(struct snd_pcm_substream *substream, | ||
13083 | return 0; | ||
13084 | } | ||
13085 | |||
13086 | -static int lpass_cpu_daiops_hw_free(struct snd_pcm_substream *substream, | ||
13087 | - struct snd_soc_dai *dai) | ||
13088 | -{ | ||
13089 | - struct lpass_data *drvdata = snd_soc_dai_get_drvdata(dai); | ||
13090 | - int ret; | ||
13091 | - | ||
13092 | - ret = regmap_write(drvdata->lpaif_map, | ||
13093 | - LPAIF_I2SCTL_REG(drvdata->variant, dai->driver->id), | ||
13094 | - 0); | ||
13095 | - if (ret) | ||
13096 | - dev_err(dai->dev, "error writing to i2sctl reg: %d\n", ret); | ||
13097 | - | ||
13098 | - return ret; | ||
13099 | -} | ||
13100 | - | ||
13101 | static int lpass_cpu_daiops_prepare(struct snd_pcm_substream *substream, | ||
13102 | struct snd_soc_dai *dai) | ||
13103 | { | ||
13104 | @@ -269,7 +254,6 @@ const struct snd_soc_dai_ops asoc_qcom_lpass_cpu_dai_ops = { | ||
13105 | .startup = lpass_cpu_daiops_startup, | ||
13106 | .shutdown = lpass_cpu_daiops_shutdown, | ||
13107 | .hw_params = lpass_cpu_daiops_hw_params, | ||
13108 | - .hw_free = lpass_cpu_daiops_hw_free, | ||
13109 | .prepare = lpass_cpu_daiops_prepare, | ||
13110 | .trigger = lpass_cpu_daiops_trigger, | ||
13111 | }; | ||
13112 | diff --git a/sound/soc/qcom/lpass-platform.c b/sound/soc/qcom/lpass-platform.c | ||
13113 | index 4c745baa39f73..9acaef81dd74c 100644 | ||
13114 | --- a/sound/soc/qcom/lpass-platform.c | ||
13115 | +++ b/sound/soc/qcom/lpass-platform.c | ||
13116 | @@ -61,7 +61,7 @@ static int lpass_platform_pcmops_open(struct snd_pcm_substream *substream) | ||
13117 | int ret, dma_ch, dir = substream->stream; | ||
13118 | struct lpass_pcm_data *data; | ||
13119 | |||
13120 | - data = devm_kzalloc(soc_runtime->dev, sizeof(*data), GFP_KERNEL); | ||
13121 | + data = kzalloc(sizeof(*data), GFP_KERNEL); | ||
13122 | if (!data) | ||
13123 | return -ENOMEM; | ||
13124 | |||
13125 | @@ -119,6 +119,7 @@ static int lpass_platform_pcmops_close(struct snd_pcm_substream *substream) | ||
13126 | if (v->free_dma_channel) | ||
13127 | v->free_dma_channel(drvdata, data->dma_ch); | ||
13128 | |||
13129 | + kfree(data); | ||
13130 | return 0; | ||
13131 | } | ||
13132 | |||
13133 | diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c | ||
13134 | index ac2feddc75fdd..ea183922c4ef1 100644 | ||
13135 | --- a/tools/perf/builtin-stat.c | ||
13136 | +++ b/tools/perf/builtin-stat.c | ||
13137 | @@ -1671,8 +1671,10 @@ static void setup_system_wide(int forks) | ||
13138 | struct evsel *counter; | ||
13139 | |||
13140 | evlist__for_each_entry(evsel_list, counter) { | ||
13141 | - if (!counter->core.system_wide) | ||
13142 | + if (!counter->core.system_wide && | ||
13143 | + strcmp(counter->name, "duration_time")) { | ||
13144 | return; | ||
13145 | + } | ||
13146 | } | ||
13147 | |||
13148 | if (evsel_list->core.nr_entries) | ||
13149 | diff --git a/tools/perf/util/intel-pt.c b/tools/perf/util/intel-pt.c | ||
13150 | index c5cce3a60476b..8aeaeba48a41f 100644 | ||
13151 | --- a/tools/perf/util/intel-pt.c | ||
13152 | +++ b/tools/perf/util/intel-pt.c | ||
13153 | @@ -974,6 +974,8 @@ static void intel_pt_set_pid_tid_cpu(struct intel_pt *pt, | ||
13154 | |||
13155 | if (queue->tid == -1 || pt->have_sched_switch) { | ||
13156 | ptq->tid = machine__get_current_tid(pt->machine, ptq->cpu); | ||
13157 | + if (ptq->tid == -1) | ||
13158 | + ptq->pid = -1; | ||
13159 | thread__zput(ptq->thread); | ||
13160 | } | ||
13161 | |||
13162 | @@ -2488,10 +2490,8 @@ static int intel_pt_context_switch(struct intel_pt *pt, union perf_event *event, | ||
13163 | tid = sample->tid; | ||
13164 | } | ||
13165 | |||
13166 | - if (tid == -1) { | ||
13167 | - pr_err("context_switch event has no tid\n"); | ||
13168 | - return -EINVAL; | ||
13169 | - } | ||
13170 | + if (tid == -1) | ||
13171 | + intel_pt_log("context_switch event has no tid\n"); | ||
13172 | |||
13173 | intel_pt_log("context_switch: cpu %d pid %d tid %d time %"PRIu64" tsc %#"PRIx64"\n", | ||
13174 | cpu, pid, tid, sample->time, perf_time_to_tsc(sample->time, | ||
13175 | diff --git a/tools/testing/radix-tree/idr-test.c b/tools/testing/radix-tree/idr-test.c | ||
13176 | index 8995092d541ec..3b796dd5e5772 100644 | ||
13177 | --- a/tools/testing/radix-tree/idr-test.c | ||
13178 | +++ b/tools/testing/radix-tree/idr-test.c | ||
13179 | @@ -523,8 +523,27 @@ static void *ida_random_fn(void *arg) | ||
13180 | return NULL; | ||
13181 | } | ||
13182 | |||
13183 | +static void *ida_leak_fn(void *arg) | ||
13184 | +{ | ||
13185 | + struct ida *ida = arg; | ||
13186 | + time_t s = time(NULL); | ||
13187 | + int i, ret; | ||
13188 | + | ||
13189 | + rcu_register_thread(); | ||
13190 | + | ||
13191 | + do for (i = 0; i < 1000; i++) { | ||
13192 | + ret = ida_alloc_range(ida, 128, 128, GFP_KERNEL); | ||
13193 | + if (ret >= 0) | ||
13194 | + ida_free(ida, 128); | ||
13195 | + } while (time(NULL) < s + 2); | ||
13196 | + | ||
13197 | + rcu_unregister_thread(); | ||
13198 | + return NULL; | ||
13199 | +} | ||
13200 | + | ||
13201 | void ida_thread_tests(void) | ||
13202 | { | ||
13203 | + DEFINE_IDA(ida); | ||
13204 | pthread_t threads[20]; | ||
13205 | int i; | ||
13206 | |||
13207 | @@ -536,6 +555,16 @@ void ida_thread_tests(void) | ||
13208 | |||
13209 | while (i--) | ||
13210 | pthread_join(threads[i], NULL); | ||
13211 | + | ||
13212 | + for (i = 0; i < ARRAY_SIZE(threads); i++) | ||
13213 | + if (pthread_create(&threads[i], NULL, ida_leak_fn, &ida)) { | ||
13214 | + perror("creating ida thread"); | ||
13215 | + exit(1); | ||
13216 | + } | ||
13217 | + | ||
13218 | + while (i--) | ||
13219 | + pthread_join(threads[i], NULL); | ||
13220 | + assert(ida_is_empty(&ida)); | ||
13221 | } | ||
13222 | |||
13223 | void ida_tests(void) | ||
13224 | diff --git a/tools/testing/selftests/bpf/progs/test_sysctl_loop1.c b/tools/testing/selftests/bpf/progs/test_sysctl_loop1.c | ||
13225 | index d22e438198cf7..9af8822ece477 100644 | ||
13226 | --- a/tools/testing/selftests/bpf/progs/test_sysctl_loop1.c | ||
13227 | +++ b/tools/testing/selftests/bpf/progs/test_sysctl_loop1.c | ||
13228 | @@ -18,11 +18,11 @@ | ||
13229 | #define MAX_ULONG_STR_LEN 7 | ||
13230 | #define MAX_VALUE_STR_LEN (TCP_MEM_LOOPS * MAX_ULONG_STR_LEN) | ||
13231 | |||
13232 | +const char tcp_mem_name[] = "net/ipv4/tcp_mem/very_very_very_very_long_pointless_string"; | ||
13233 | static __always_inline int is_tcp_mem(struct bpf_sysctl *ctx) | ||
13234 | { | ||
13235 | - volatile char tcp_mem_name[] = "net/ipv4/tcp_mem/very_very_very_very_long_pointless_string"; | ||
13236 | unsigned char i; | ||
13237 | - char name[64]; | ||
13238 | + char name[sizeof(tcp_mem_name)]; | ||
13239 | int ret; | ||
13240 | |||
13241 | memset(name, 0, sizeof(name)); | ||
13242 | diff --git a/tools/testing/selftests/bpf/progs/test_sysctl_loop2.c b/tools/testing/selftests/bpf/progs/test_sysctl_loop2.c | ||
13243 | index cb201cbe11e77..55251046c9b73 100644 | ||
13244 | --- a/tools/testing/selftests/bpf/progs/test_sysctl_loop2.c | ||
13245 | +++ b/tools/testing/selftests/bpf/progs/test_sysctl_loop2.c | ||
13246 | @@ -18,11 +18,11 @@ | ||
13247 | #define MAX_ULONG_STR_LEN 7 | ||
13248 | #define MAX_VALUE_STR_LEN (TCP_MEM_LOOPS * MAX_ULONG_STR_LEN) | ||
13249 | |||
13250 | +const char tcp_mem_name[] = "net/ipv4/tcp_mem/very_very_very_very_long_pointless_string_to_stress_byte_loop"; | ||
13251 | static __attribute__((noinline)) int is_tcp_mem(struct bpf_sysctl *ctx) | ||
13252 | { | ||
13253 | - volatile char tcp_mem_name[] = "net/ipv4/tcp_mem/very_very_very_very_long_pointless_string_to_stress_byte_loop"; | ||
13254 | unsigned char i; | ||
13255 | - char name[64]; | ||
13256 | + char name[sizeof(tcp_mem_name)]; | ||
13257 | int ret; | ||
13258 | |||
13259 | memset(name, 0, sizeof(name)); | ||
13260 | diff --git a/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-inter-event-combined-hist.tc b/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-inter-event-combined-hist.tc | ||
13261 | index f3eb8aacec0e7..a2b0e4eb1fe4c 100644 | ||
13262 | --- a/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-inter-event-combined-hist.tc | ||
13263 | +++ b/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-inter-event-combined-hist.tc | ||
13264 | @@ -34,12 +34,12 @@ echo 'wakeup_latency u64 lat pid_t pid' >> synthetic_events | ||
13265 | echo 'hist:keys=pid:ts1=common_timestamp.usecs if comm=="ping"' >> events/sched/sched_wakeup/trigger | ||
13266 | echo 'hist:keys=next_pid:wakeup_lat=common_timestamp.usecs-$ts1:onmatch(sched.sched_wakeup).wakeup_latency($wakeup_lat,next_pid) if next_comm=="ping"' > events/sched/sched_switch/trigger | ||
13267 | |||
13268 | -echo 'waking+wakeup_latency u64 lat; pid_t pid' >> synthetic_events | ||
13269 | -echo 'hist:keys=pid,lat:sort=pid,lat:ww_lat=$waking_lat+$wakeup_lat:onmatch(synthetic.wakeup_latency).waking+wakeup_latency($ww_lat,pid)' >> events/synthetic/wakeup_latency/trigger | ||
13270 | -echo 'hist:keys=pid,lat:sort=pid,lat' >> events/synthetic/waking+wakeup_latency/trigger | ||
13271 | +echo 'waking_plus_wakeup_latency u64 lat; pid_t pid' >> synthetic_events | ||
13272 | +echo 'hist:keys=pid,lat:sort=pid,lat:ww_lat=$waking_lat+$wakeup_lat:onmatch(synthetic.wakeup_latency).waking_plus_wakeup_latency($ww_lat,pid)' >> events/synthetic/wakeup_latency/trigger | ||
13273 | +echo 'hist:keys=pid,lat:sort=pid,lat' >> events/synthetic/waking_plus_wakeup_latency/trigger | ||
13274 | |||
13275 | ping $LOCALHOST -c 3 | ||
13276 | -if ! grep -q "pid:" events/synthetic/waking+wakeup_latency/hist; then | ||
13277 | +if ! grep -q "pid:" events/synthetic/waking_plus_wakeup_latency/hist; then | ||
13278 | fail "Failed to create combined histogram" | ||
13279 | fi | ||
13280 | |||
13281 | diff --git a/tools/testing/selftests/net/config b/tools/testing/selftests/net/config | ||
13282 | index b8503a8119b07..81fcc25a54db6 100644 | ||
13283 | --- a/tools/testing/selftests/net/config | ||
13284 | +++ b/tools/testing/selftests/net/config | ||
13285 | @@ -29,3 +29,4 @@ CONFIG_NET_SCH_FQ=m | ||
13286 | CONFIG_NET_SCH_ETF=m | ||
13287 | CONFIG_TEST_BLACKHOLE_DEV=m | ||
13288 | CONFIG_KALLSYMS=y | ||
13289 | +CONFIG_NET_FOU=m | ||
13290 | diff --git a/tools/testing/selftests/net/forwarding/vxlan_asymmetric.sh b/tools/testing/selftests/net/forwarding/vxlan_asymmetric.sh | ||
13291 | index a0b5f57d6bd31..0727e2012b685 100755 | ||
13292 | --- a/tools/testing/selftests/net/forwarding/vxlan_asymmetric.sh | ||
13293 | +++ b/tools/testing/selftests/net/forwarding/vxlan_asymmetric.sh | ||
13294 | @@ -215,10 +215,16 @@ switch_create() | ||
13295 | |||
13296 | bridge fdb add 00:00:5e:00:01:01 dev br1 self local vlan 10 | ||
13297 | bridge fdb add 00:00:5e:00:01:01 dev br1 self local vlan 20 | ||
13298 | + | ||
13299 | + sysctl_set net.ipv4.conf.all.rp_filter 0 | ||
13300 | + sysctl_set net.ipv4.conf.vlan10-v.rp_filter 0 | ||
13301 | + sysctl_set net.ipv4.conf.vlan20-v.rp_filter 0 | ||
13302 | } | ||
13303 | |||
13304 | switch_destroy() | ||
13305 | { | ||
13306 | + sysctl_restore net.ipv4.conf.all.rp_filter | ||
13307 | + | ||
13308 | bridge fdb del 00:00:5e:00:01:01 dev br1 self local vlan 20 | ||
13309 | bridge fdb del 00:00:5e:00:01:01 dev br1 self local vlan 10 | ||
13310 | |||
13311 | @@ -359,6 +365,10 @@ ns_switch_create() | ||
13312 | |||
13313 | bridge fdb add 00:00:5e:00:01:01 dev br1 self local vlan 10 | ||
13314 | bridge fdb add 00:00:5e:00:01:01 dev br1 self local vlan 20 | ||
13315 | + | ||
13316 | + sysctl_set net.ipv4.conf.all.rp_filter 0 | ||
13317 | + sysctl_set net.ipv4.conf.vlan10-v.rp_filter 0 | ||
13318 | + sysctl_set net.ipv4.conf.vlan20-v.rp_filter 0 | ||
13319 | } | ||
13320 | export -f ns_switch_create | ||
13321 | |||
13322 | diff --git a/tools/testing/selftests/net/forwarding/vxlan_symmetric.sh b/tools/testing/selftests/net/forwarding/vxlan_symmetric.sh | ||
13323 | index 1209031bc794d..5d97fa347d75a 100755 | ||
13324 | --- a/tools/testing/selftests/net/forwarding/vxlan_symmetric.sh | ||
13325 | +++ b/tools/testing/selftests/net/forwarding/vxlan_symmetric.sh | ||
13326 | @@ -237,10 +237,16 @@ switch_create() | ||
13327 | |||
13328 | bridge fdb add 00:00:5e:00:01:01 dev br1 self local vlan 10 | ||
13329 | bridge fdb add 00:00:5e:00:01:01 dev br1 self local vlan 20 | ||
13330 | + | ||
13331 | + sysctl_set net.ipv4.conf.all.rp_filter 0 | ||
13332 | + sysctl_set net.ipv4.conf.vlan10-v.rp_filter 0 | ||
13333 | + sysctl_set net.ipv4.conf.vlan20-v.rp_filter 0 | ||
13334 | } | ||
13335 | |||
13336 | switch_destroy() | ||
13337 | { | ||
13338 | + sysctl_restore net.ipv4.conf.all.rp_filter | ||
13339 | + | ||
13340 | bridge fdb del 00:00:5e:00:01:01 dev br1 self local vlan 20 | ||
13341 | bridge fdb del 00:00:5e:00:01:01 dev br1 self local vlan 10 | ||
13342 | |||
13343 | @@ -402,6 +408,10 @@ ns_switch_create() | ||
13344 | |||
13345 | bridge fdb add 00:00:5e:00:01:01 dev br1 self local vlan 10 | ||
13346 | bridge fdb add 00:00:5e:00:01:01 dev br1 self local vlan 20 | ||
13347 | + | ||
13348 | + sysctl_set net.ipv4.conf.all.rp_filter 0 | ||
13349 | + sysctl_set net.ipv4.conf.vlan10-v.rp_filter 0 | ||
13350 | + sysctl_set net.ipv4.conf.vlan20-v.rp_filter 0 | ||
13351 | } | ||
13352 | export -f ns_switch_create | ||
13353 | |||
13354 | diff --git a/tools/testing/selftests/net/rtnetlink.sh b/tools/testing/selftests/net/rtnetlink.sh | ||
13355 | index bdbf4b3125b6a..28ea3753da207 100755 | ||
13356 | --- a/tools/testing/selftests/net/rtnetlink.sh | ||
13357 | +++ b/tools/testing/selftests/net/rtnetlink.sh | ||
13358 | @@ -521,6 +521,11 @@ kci_test_encap_fou() | ||
13359 | return $ksft_skip | ||
13360 | fi | ||
13361 | |||
13362 | + if ! /sbin/modprobe -q -n fou; then | ||
13363 | + echo "SKIP: module fou is not found" | ||
13364 | + return $ksft_skip | ||
13365 | + fi | ||
13366 | + /sbin/modprobe -q fou | ||
13367 | ip -netns "$testns" fou add port 7777 ipproto 47 2>/dev/null | ||
13368 | if [ $? -ne 0 ];then | ||
13369 | echo "FAIL: can't add fou port 7777, skipping test" | ||
13370 | diff --git a/tools/testing/selftests/powerpc/eeh/eeh-basic.sh b/tools/testing/selftests/powerpc/eeh/eeh-basic.sh | ||
13371 | index f988d2f42e8f2..cf001a2c69420 100755 | ||
13372 | --- a/tools/testing/selftests/powerpc/eeh/eeh-basic.sh | ||
13373 | +++ b/tools/testing/selftests/powerpc/eeh/eeh-basic.sh | ||
13374 | @@ -1,17 +1,19 @@ | ||
13375 | #!/bin/sh | ||
13376 | # SPDX-License-Identifier: GPL-2.0-only | ||
13377 | |||
13378 | +KSELFTESTS_SKIP=4 | ||
13379 | + | ||
13380 | . ./eeh-functions.sh | ||
13381 | |||
13382 | if ! eeh_supported ; then | ||
13383 | echo "EEH not supported on this system, skipping" | ||
13384 | - exit 0; | ||
13385 | + exit $KSELFTESTS_SKIP; | ||
13386 | fi | ||
13387 | |||
13388 | if [ ! -e "/sys/kernel/debug/powerpc/eeh_dev_check" ] && \ | ||
13389 | [ ! -e "/sys/kernel/debug/powerpc/eeh_dev_break" ] ; then | ||
13390 | echo "debugfs EEH testing files are missing. Is debugfs mounted?" | ||
13391 | - exit 1; | ||
13392 | + exit $KSELFTESTS_SKIP; | ||
13393 | fi | ||
13394 | |||
13395 | pre_lspci=`mktemp` | ||
13396 | @@ -79,4 +81,5 @@ echo "$failed devices failed to recover ($dev_count tested)" | ||
13397 | lspci | diff -u $pre_lspci - | ||
13398 | rm -f $pre_lspci | ||
13399 | |||
13400 | -exit $failed | ||
13401 | +test "$failed" == 0 | ||
13402 | +exit $? |