Contents of /trunk/kernel-alx/patches-4.9/0163-4.9.64-all-fixes.patch
Parent Directory | Revision Log
Revision 3048 -
(show annotations)
(download)
Wed Dec 20 11:49:39 2017 UTC (6 years, 9 months ago) by niro
File size: 88990 byte(s)
Wed Dec 20 11:49:39 2017 UTC (6 years, 9 months ago) by niro
File size: 88990 byte(s)
-linux-4.9.64
1 | diff --git a/Documentation/devicetree/bindings/arm/davinci.txt b/Documentation/devicetree/bindings/arm/davinci.txt |
2 | index 715622c36260..f0841ce725b5 100644 |
3 | --- a/Documentation/devicetree/bindings/arm/davinci.txt |
4 | +++ b/Documentation/devicetree/bindings/arm/davinci.txt |
5 | @@ -13,10 +13,6 @@ EnBW AM1808 based CMC board |
6 | Required root node properties: |
7 | - compatible = "enbw,cmc", "ti,da850; |
8 | |
9 | -LEGO MINDSTORMS EV3 (AM1808 based) |
10 | -Required root node properties: |
11 | - - compatible = "lego,ev3", "ti,da850"; |
12 | - |
13 | Generic DaVinci Boards |
14 | ---------------------- |
15 | |
16 | diff --git a/Documentation/devicetree/bindings/vendor-prefixes.txt b/Documentation/devicetree/bindings/vendor-prefixes.txt |
17 | index f949a22bcd74..bceffffb7502 100644 |
18 | --- a/Documentation/devicetree/bindings/vendor-prefixes.txt |
19 | +++ b/Documentation/devicetree/bindings/vendor-prefixes.txt |
20 | @@ -154,7 +154,6 @@ kosagi Sutajio Ko-Usagi PTE Ltd. |
21 | kyo Kyocera Corporation |
22 | lacie LaCie |
23 | lantiq Lantiq Semiconductor |
24 | -lego LEGO Systems A/S |
25 | lenovo Lenovo Group Ltd. |
26 | lg LG Corporation |
27 | linux Linux-specific binding |
28 | diff --git a/Makefile b/Makefile |
29 | index 339d4a85ffba..d29cace0da6d 100644 |
30 | --- a/Makefile |
31 | +++ b/Makefile |
32 | @@ -1,6 +1,6 @@ |
33 | VERSION = 4 |
34 | PATCHLEVEL = 9 |
35 | -SUBLEVEL = 63 |
36 | +SUBLEVEL = 64 |
37 | EXTRAVERSION = |
38 | NAME = Roaring Lionus |
39 | |
40 | diff --git a/arch/arm/boot/dts/am33xx.dtsi b/arch/arm/boot/dts/am33xx.dtsi |
41 | index 795c1467fa50..a3277e6436d5 100644 |
42 | --- a/arch/arm/boot/dts/am33xx.dtsi |
43 | +++ b/arch/arm/boot/dts/am33xx.dtsi |
44 | @@ -143,10 +143,11 @@ |
45 | }; |
46 | |
47 | scm_conf: scm_conf@0 { |
48 | - compatible = "syscon"; |
49 | + compatible = "syscon", "simple-bus"; |
50 | reg = <0x0 0x800>; |
51 | #address-cells = <1>; |
52 | #size-cells = <1>; |
53 | + ranges = <0 0 0x800>; |
54 | |
55 | scm_clocks: clocks { |
56 | #address-cells = <1>; |
57 | diff --git a/arch/arm/boot/dts/dm814x.dtsi b/arch/arm/boot/dts/dm814x.dtsi |
58 | index d87efab24fa2..ff57a20af9cd 100644 |
59 | --- a/arch/arm/boot/dts/dm814x.dtsi |
60 | +++ b/arch/arm/boot/dts/dm814x.dtsi |
61 | @@ -252,7 +252,7 @@ |
62 | }; |
63 | |
64 | uart1: uart@20000 { |
65 | - compatible = "ti,omap3-uart"; |
66 | + compatible = "ti,am3352-uart", "ti,omap3-uart"; |
67 | ti,hwmods = "uart1"; |
68 | reg = <0x20000 0x2000>; |
69 | clock-frequency = <48000000>; |
70 | @@ -262,7 +262,7 @@ |
71 | }; |
72 | |
73 | uart2: uart@22000 { |
74 | - compatible = "ti,omap3-uart"; |
75 | + compatible = "ti,am3352-uart", "ti,omap3-uart"; |
76 | ti,hwmods = "uart2"; |
77 | reg = <0x22000 0x2000>; |
78 | clock-frequency = <48000000>; |
79 | @@ -272,7 +272,7 @@ |
80 | }; |
81 | |
82 | uart3: uart@24000 { |
83 | - compatible = "ti,omap3-uart"; |
84 | + compatible = "ti,am3352-uart", "ti,omap3-uart"; |
85 | ti,hwmods = "uart3"; |
86 | reg = <0x24000 0x2000>; |
87 | clock-frequency = <48000000>; |
88 | @@ -332,10 +332,11 @@ |
89 | ranges = <0 0x140000 0x20000>; |
90 | |
91 | scm_conf: scm_conf@0 { |
92 | - compatible = "syscon"; |
93 | + compatible = "syscon", "simple-bus"; |
94 | reg = <0x0 0x800>; |
95 | #address-cells = <1>; |
96 | #size-cells = <1>; |
97 | + ranges = <0 0 0x800>; |
98 | |
99 | scm_clocks: clocks { |
100 | #address-cells = <1>; |
101 | diff --git a/arch/arm/boot/dts/dm816x.dtsi b/arch/arm/boot/dts/dm816x.dtsi |
102 | index cbdfbc4e4a26..62c0a6155360 100644 |
103 | --- a/arch/arm/boot/dts/dm816x.dtsi |
104 | +++ b/arch/arm/boot/dts/dm816x.dtsi |
105 | @@ -371,7 +371,7 @@ |
106 | }; |
107 | |
108 | uart1: uart@48020000 { |
109 | - compatible = "ti,omap3-uart"; |
110 | + compatible = "ti,am3352-uart", "ti,omap3-uart"; |
111 | ti,hwmods = "uart1"; |
112 | reg = <0x48020000 0x2000>; |
113 | clock-frequency = <48000000>; |
114 | @@ -381,7 +381,7 @@ |
115 | }; |
116 | |
117 | uart2: uart@48022000 { |
118 | - compatible = "ti,omap3-uart"; |
119 | + compatible = "ti,am3352-uart", "ti,omap3-uart"; |
120 | ti,hwmods = "uart2"; |
121 | reg = <0x48022000 0x2000>; |
122 | clock-frequency = <48000000>; |
123 | @@ -391,7 +391,7 @@ |
124 | }; |
125 | |
126 | uart3: uart@48024000 { |
127 | - compatible = "ti,omap3-uart"; |
128 | + compatible = "ti,am3352-uart", "ti,omap3-uart"; |
129 | ti,hwmods = "uart3"; |
130 | reg = <0x48024000 0x2000>; |
131 | clock-frequency = <48000000>; |
132 | diff --git a/arch/arm/boot/dts/omap5-uevm.dts b/arch/arm/boot/dts/omap5-uevm.dts |
133 | index 53d31a87b44b..f3a3e6be79fe 100644 |
134 | --- a/arch/arm/boot/dts/omap5-uevm.dts |
135 | +++ b/arch/arm/boot/dts/omap5-uevm.dts |
136 | @@ -18,6 +18,10 @@ |
137 | reg = <0 0x80000000 0 0x7f000000>; /* 2032 MB */ |
138 | }; |
139 | |
140 | + aliases { |
141 | + ethernet = ðernet; |
142 | + }; |
143 | + |
144 | leds { |
145 | compatible = "gpio-leds"; |
146 | led1 { |
147 | @@ -72,6 +76,23 @@ |
148 | >; |
149 | }; |
150 | |
151 | +&usbhsehci { |
152 | + #address-cells = <1>; |
153 | + #size-cells = <0>; |
154 | + |
155 | + hub@2 { |
156 | + compatible = "usb424,3503"; |
157 | + reg = <2>; |
158 | + #address-cells = <1>; |
159 | + #size-cells = <0>; |
160 | + }; |
161 | + |
162 | + ethernet: usbether@3 { |
163 | + compatible = "usb424,9730"; |
164 | + reg = <3>; |
165 | + }; |
166 | +}; |
167 | + |
168 | &wlcore { |
169 | compatible = "ti,wl1837"; |
170 | }; |
171 | diff --git a/arch/arm/crypto/aesbs-glue.c b/arch/arm/crypto/aesbs-glue.c |
172 | index 0511a6cafe24..5d934a0039d7 100644 |
173 | --- a/arch/arm/crypto/aesbs-glue.c |
174 | +++ b/arch/arm/crypto/aesbs-glue.c |
175 | @@ -363,7 +363,7 @@ static struct crypto_alg aesbs_algs[] = { { |
176 | }, { |
177 | .cra_name = "cbc(aes)", |
178 | .cra_driver_name = "cbc-aes-neonbs", |
179 | - .cra_priority = 300, |
180 | + .cra_priority = 250, |
181 | .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER|CRYPTO_ALG_ASYNC, |
182 | .cra_blocksize = AES_BLOCK_SIZE, |
183 | .cra_ctxsize = sizeof(struct async_helper_ctx), |
184 | @@ -383,7 +383,7 @@ static struct crypto_alg aesbs_algs[] = { { |
185 | }, { |
186 | .cra_name = "ctr(aes)", |
187 | .cra_driver_name = "ctr-aes-neonbs", |
188 | - .cra_priority = 300, |
189 | + .cra_priority = 250, |
190 | .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER|CRYPTO_ALG_ASYNC, |
191 | .cra_blocksize = 1, |
192 | .cra_ctxsize = sizeof(struct async_helper_ctx), |
193 | @@ -403,7 +403,7 @@ static struct crypto_alg aesbs_algs[] = { { |
194 | }, { |
195 | .cra_name = "xts(aes)", |
196 | .cra_driver_name = "xts-aes-neonbs", |
197 | - .cra_priority = 300, |
198 | + .cra_priority = 250, |
199 | .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER|CRYPTO_ALG_ASYNC, |
200 | .cra_blocksize = AES_BLOCK_SIZE, |
201 | .cra_ctxsize = sizeof(struct async_helper_ctx), |
202 | diff --git a/arch/arm/mach-omap2/pdata-quirks.c b/arch/arm/mach-omap2/pdata-quirks.c |
203 | index 05e20aaf68dd..770216baa737 100644 |
204 | --- a/arch/arm/mach-omap2/pdata-quirks.c |
205 | +++ b/arch/arm/mach-omap2/pdata-quirks.c |
206 | @@ -600,7 +600,6 @@ static void pdata_quirks_check(struct pdata_init *quirks) |
207 | if (of_machine_is_compatible(quirks->compatible)) { |
208 | if (quirks->fn) |
209 | quirks->fn(); |
210 | - break; |
211 | } |
212 | quirks++; |
213 | } |
214 | diff --git a/arch/arm64/boot/dts/broadcom/ns2.dtsi b/arch/arm64/boot/dts/broadcom/ns2.dtsi |
215 | index d95dc408629a..a16b1b3f9fc6 100644 |
216 | --- a/arch/arm64/boot/dts/broadcom/ns2.dtsi |
217 | +++ b/arch/arm64/boot/dts/broadcom/ns2.dtsi |
218 | @@ -30,6 +30,8 @@ |
219 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
220 | */ |
221 | |
222 | +/memreserve/ 0x81000000 0x00200000; |
223 | + |
224 | #include <dt-bindings/interrupt-controller/arm-gic.h> |
225 | #include <dt-bindings/clock/bcm-ns2.h> |
226 | |
227 | diff --git a/arch/mips/include/asm/asm.h b/arch/mips/include/asm/asm.h |
228 | index 7c26b28bf252..859cf7048347 100644 |
229 | --- a/arch/mips/include/asm/asm.h |
230 | +++ b/arch/mips/include/asm/asm.h |
231 | @@ -54,7 +54,8 @@ |
232 | .align 2; \ |
233 | .type symbol, @function; \ |
234 | .ent symbol, 0; \ |
235 | -symbol: .frame sp, 0, ra |
236 | +symbol: .frame sp, 0, ra; \ |
237 | + .insn |
238 | |
239 | /* |
240 | * NESTED - declare nested routine entry point |
241 | @@ -63,8 +64,9 @@ symbol: .frame sp, 0, ra |
242 | .globl symbol; \ |
243 | .align 2; \ |
244 | .type symbol, @function; \ |
245 | - .ent symbol, 0; \ |
246 | -symbol: .frame sp, framesize, rpc |
247 | + .ent symbol, 0; \ |
248 | +symbol: .frame sp, framesize, rpc; \ |
249 | + .insn |
250 | |
251 | /* |
252 | * END - mark end of function |
253 | @@ -86,7 +88,7 @@ symbol: .frame sp, framesize, rpc |
254 | #define FEXPORT(symbol) \ |
255 | .globl symbol; \ |
256 | .type symbol, @function; \ |
257 | -symbol: |
258 | +symbol: .insn |
259 | |
260 | /* |
261 | * ABS - export absolute symbol |
262 | diff --git a/arch/mips/include/asm/mips-cm.h b/arch/mips/include/asm/mips-cm.h |
263 | index b6845db453a3..163317fd3d7e 100644 |
264 | --- a/arch/mips/include/asm/mips-cm.h |
265 | +++ b/arch/mips/include/asm/mips-cm.h |
266 | @@ -187,6 +187,7 @@ BUILD_CM_R_(config, MIPS_CM_GCB_OFS + 0x00) |
267 | BUILD_CM_RW(base, MIPS_CM_GCB_OFS + 0x08) |
268 | BUILD_CM_RW(access, MIPS_CM_GCB_OFS + 0x20) |
269 | BUILD_CM_R_(rev, MIPS_CM_GCB_OFS + 0x30) |
270 | +BUILD_CM_RW(err_control, MIPS_CM_GCB_OFS + 0x38) |
271 | BUILD_CM_RW(error_mask, MIPS_CM_GCB_OFS + 0x40) |
272 | BUILD_CM_RW(error_cause, MIPS_CM_GCB_OFS + 0x48) |
273 | BUILD_CM_RW(error_addr, MIPS_CM_GCB_OFS + 0x50) |
274 | @@ -266,6 +267,12 @@ BUILD_CM_Cx_R_(tcid_8_priority, 0x80) |
275 | #define CM_REV_CM2_5 CM_ENCODE_REV(7, 0) |
276 | #define CM_REV_CM3 CM_ENCODE_REV(8, 0) |
277 | |
278 | +/* GCR_ERR_CONTROL register fields */ |
279 | +#define CM_GCR_ERR_CONTROL_L2_ECC_EN_SHF 1 |
280 | +#define CM_GCR_ERR_CONTROL_L2_ECC_EN_MSK (_ULCAST_(0x1) << 1) |
281 | +#define CM_GCR_ERR_CONTROL_L2_ECC_SUPPORT_SHF 0 |
282 | +#define CM_GCR_ERR_CONTROL_L2_ECC_SUPPORT_MSK (_ULCAST_(0x1) << 0) |
283 | + |
284 | /* GCR_ERROR_CAUSE register fields */ |
285 | #define CM_GCR_ERROR_CAUSE_ERRTYPE_SHF 27 |
286 | #define CM_GCR_ERROR_CAUSE_ERRTYPE_MSK (_ULCAST_(0x1f) << 27) |
287 | diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c |
288 | index f66e5ce505b2..695950361d2a 100644 |
289 | --- a/arch/mips/kernel/setup.c |
290 | +++ b/arch/mips/kernel/setup.c |
291 | @@ -153,6 +153,35 @@ void __init detect_memory_region(phys_addr_t start, phys_addr_t sz_min, phys_add |
292 | add_memory_region(start, size, BOOT_MEM_RAM); |
293 | } |
294 | |
295 | +bool __init memory_region_available(phys_addr_t start, phys_addr_t size) |
296 | +{ |
297 | + int i; |
298 | + bool in_ram = false, free = true; |
299 | + |
300 | + for (i = 0; i < boot_mem_map.nr_map; i++) { |
301 | + phys_addr_t start_, end_; |
302 | + |
303 | + start_ = boot_mem_map.map[i].addr; |
304 | + end_ = boot_mem_map.map[i].addr + boot_mem_map.map[i].size; |
305 | + |
306 | + switch (boot_mem_map.map[i].type) { |
307 | + case BOOT_MEM_RAM: |
308 | + if (start >= start_ && start + size <= end_) |
309 | + in_ram = true; |
310 | + break; |
311 | + case BOOT_MEM_RESERVED: |
312 | + if ((start >= start_ && start < end_) || |
313 | + (start < start_ && start + size >= start_)) |
314 | + free = false; |
315 | + break; |
316 | + default: |
317 | + continue; |
318 | + } |
319 | + } |
320 | + |
321 | + return in_ram && free; |
322 | +} |
323 | + |
324 | static void __init print_memory_map(void) |
325 | { |
326 | int i; |
327 | @@ -332,11 +361,19 @@ static void __init bootmem_init(void) |
328 | |
329 | #else /* !CONFIG_SGI_IP27 */ |
330 | |
331 | +static unsigned long __init bootmap_bytes(unsigned long pages) |
332 | +{ |
333 | + unsigned long bytes = DIV_ROUND_UP(pages, 8); |
334 | + |
335 | + return ALIGN(bytes, sizeof(long)); |
336 | +} |
337 | + |
338 | static void __init bootmem_init(void) |
339 | { |
340 | unsigned long reserved_end; |
341 | unsigned long mapstart = ~0UL; |
342 | unsigned long bootmap_size; |
343 | + bool bootmap_valid = false; |
344 | int i; |
345 | |
346 | /* |
347 | @@ -430,11 +467,42 @@ static void __init bootmem_init(void) |
348 | #endif |
349 | |
350 | /* |
351 | - * Initialize the boot-time allocator with low memory only. |
352 | + * check that mapstart doesn't overlap with any of |
353 | + * memory regions that have been reserved through eg. DTB |
354 | */ |
355 | - bootmap_size = init_bootmem_node(NODE_DATA(0), mapstart, |
356 | - min_low_pfn, max_low_pfn); |
357 | + bootmap_size = bootmap_bytes(max_low_pfn - min_low_pfn); |
358 | + |
359 | + bootmap_valid = memory_region_available(PFN_PHYS(mapstart), |
360 | + bootmap_size); |
361 | + for (i = 0; i < boot_mem_map.nr_map && !bootmap_valid; i++) { |
362 | + unsigned long mapstart_addr; |
363 | + |
364 | + switch (boot_mem_map.map[i].type) { |
365 | + case BOOT_MEM_RESERVED: |
366 | + mapstart_addr = PFN_ALIGN(boot_mem_map.map[i].addr + |
367 | + boot_mem_map.map[i].size); |
368 | + if (PHYS_PFN(mapstart_addr) < mapstart) |
369 | + break; |
370 | + |
371 | + bootmap_valid = memory_region_available(mapstart_addr, |
372 | + bootmap_size); |
373 | + if (bootmap_valid) |
374 | + mapstart = PHYS_PFN(mapstart_addr); |
375 | + break; |
376 | + default: |
377 | + break; |
378 | + } |
379 | + } |
380 | |
381 | + if (!bootmap_valid) |
382 | + panic("No memory area to place a bootmap bitmap"); |
383 | + |
384 | + /* |
385 | + * Initialize the boot-time allocator with low memory only. |
386 | + */ |
387 | + if (bootmap_size != init_bootmem_node(NODE_DATA(0), mapstart, |
388 | + min_low_pfn, max_low_pfn)) |
389 | + panic("Unexpected memory size required for bootmap"); |
390 | |
391 | for (i = 0; i < boot_mem_map.nr_map; i++) { |
392 | unsigned long start, end; |
393 | @@ -483,6 +551,10 @@ static void __init bootmem_init(void) |
394 | continue; |
395 | default: |
396 | /* Not usable memory */ |
397 | + if (start > min_low_pfn && end < max_low_pfn) |
398 | + reserve_bootmem(boot_mem_map.map[i].addr, |
399 | + boot_mem_map.map[i].size, |
400 | + BOOTMEM_DEFAULT); |
401 | continue; |
402 | } |
403 | |
404 | diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c |
405 | index b0b29cb6f3d8..bb1d9ff1be5c 100644 |
406 | --- a/arch/mips/kernel/traps.c |
407 | +++ b/arch/mips/kernel/traps.c |
408 | @@ -51,6 +51,7 @@ |
409 | #include <asm/idle.h> |
410 | #include <asm/mips-cm.h> |
411 | #include <asm/mips-r2-to-r6-emul.h> |
412 | +#include <asm/mips-cm.h> |
413 | #include <asm/mipsregs.h> |
414 | #include <asm/mipsmtregs.h> |
415 | #include <asm/module.h> |
416 | @@ -1646,6 +1647,65 @@ __setup("nol2par", nol2parity); |
417 | */ |
418 | static inline void parity_protection_init(void) |
419 | { |
420 | +#define ERRCTL_PE 0x80000000 |
421 | +#define ERRCTL_L2P 0x00800000 |
422 | + |
423 | + if (mips_cm_revision() >= CM_REV_CM3) { |
424 | + ulong gcr_ectl, cp0_ectl; |
425 | + |
426 | + /* |
427 | + * With CM3 systems we need to ensure that the L1 & L2 |
428 | + * parity enables are set to the same value, since this |
429 | + * is presumed by the hardware engineers. |
430 | + * |
431 | + * If the user disabled either of L1 or L2 ECC checking, |
432 | + * disable both. |
433 | + */ |
434 | + l1parity &= l2parity; |
435 | + l2parity &= l1parity; |
436 | + |
437 | + /* Probe L1 ECC support */ |
438 | + cp0_ectl = read_c0_ecc(); |
439 | + write_c0_ecc(cp0_ectl | ERRCTL_PE); |
440 | + back_to_back_c0_hazard(); |
441 | + cp0_ectl = read_c0_ecc(); |
442 | + |
443 | + /* Probe L2 ECC support */ |
444 | + gcr_ectl = read_gcr_err_control(); |
445 | + |
446 | + if (!(gcr_ectl & CM_GCR_ERR_CONTROL_L2_ECC_SUPPORT_MSK) || |
447 | + !(cp0_ectl & ERRCTL_PE)) { |
448 | + /* |
449 | + * One of L1 or L2 ECC checking isn't supported, |
450 | + * so we cannot enable either. |
451 | + */ |
452 | + l1parity = l2parity = 0; |
453 | + } |
454 | + |
455 | + /* Configure L1 ECC checking */ |
456 | + if (l1parity) |
457 | + cp0_ectl |= ERRCTL_PE; |
458 | + else |
459 | + cp0_ectl &= ~ERRCTL_PE; |
460 | + write_c0_ecc(cp0_ectl); |
461 | + back_to_back_c0_hazard(); |
462 | + WARN_ON(!!(read_c0_ecc() & ERRCTL_PE) != l1parity); |
463 | + |
464 | + /* Configure L2 ECC checking */ |
465 | + if (l2parity) |
466 | + gcr_ectl |= CM_GCR_ERR_CONTROL_L2_ECC_EN_MSK; |
467 | + else |
468 | + gcr_ectl &= ~CM_GCR_ERR_CONTROL_L2_ECC_EN_MSK; |
469 | + write_gcr_err_control(gcr_ectl); |
470 | + gcr_ectl = read_gcr_err_control(); |
471 | + gcr_ectl &= CM_GCR_ERR_CONTROL_L2_ECC_EN_MSK; |
472 | + WARN_ON(!!gcr_ectl != l2parity); |
473 | + |
474 | + pr_info("Cache parity protection %sabled\n", |
475 | + l1parity ? "en" : "dis"); |
476 | + return; |
477 | + } |
478 | + |
479 | switch (current_cpu_type()) { |
480 | case CPU_24K: |
481 | case CPU_34K: |
482 | @@ -1656,11 +1716,8 @@ static inline void parity_protection_init(void) |
483 | case CPU_PROAPTIV: |
484 | case CPU_P5600: |
485 | case CPU_QEMU_GENERIC: |
486 | - case CPU_I6400: |
487 | case CPU_P6600: |
488 | { |
489 | -#define ERRCTL_PE 0x80000000 |
490 | -#define ERRCTL_L2P 0x00800000 |
491 | unsigned long errctl; |
492 | unsigned int l1parity_present, l2parity_present; |
493 | |
494 | diff --git a/arch/mips/netlogic/common/irq.c b/arch/mips/netlogic/common/irq.c |
495 | index 3660dc67d544..f4961bc9a61d 100644 |
496 | --- a/arch/mips/netlogic/common/irq.c |
497 | +++ b/arch/mips/netlogic/common/irq.c |
498 | @@ -275,7 +275,7 @@ asmlinkage void plat_irq_dispatch(void) |
499 | do_IRQ(nlm_irq_to_xirq(node, i)); |
500 | } |
501 | |
502 | -#ifdef CONFIG_OF |
503 | +#ifdef CONFIG_CPU_XLP |
504 | static const struct irq_domain_ops xlp_pic_irq_domain_ops = { |
505 | .xlate = irq_domain_xlate_onetwocell, |
506 | }; |
507 | @@ -348,7 +348,7 @@ void __init arch_init_irq(void) |
508 | #if defined(CONFIG_CPU_XLR) |
509 | nlm_setup_fmn_irq(); |
510 | #endif |
511 | -#if defined(CONFIG_OF) |
512 | +#ifdef CONFIG_CPU_XLP |
513 | of_irq_init(xlp_pic_irq_ids); |
514 | #endif |
515 | } |
516 | diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c |
517 | index e2ead34da465..c6583efdbdaf 100644 |
518 | --- a/arch/x86/kernel/apic/apic.c |
519 | +++ b/arch/x86/kernel/apic/apic.c |
520 | @@ -1863,14 +1863,14 @@ static void __smp_spurious_interrupt(u8 vector) |
521 | "should never happen.\n", vector, smp_processor_id()); |
522 | } |
523 | |
524 | -__visible void smp_spurious_interrupt(struct pt_regs *regs) |
525 | +__visible void __irq_entry smp_spurious_interrupt(struct pt_regs *regs) |
526 | { |
527 | entering_irq(); |
528 | __smp_spurious_interrupt(~regs->orig_ax); |
529 | exiting_irq(); |
530 | } |
531 | |
532 | -__visible void smp_trace_spurious_interrupt(struct pt_regs *regs) |
533 | +__visible void __irq_entry smp_trace_spurious_interrupt(struct pt_regs *regs) |
534 | { |
535 | u8 vector = ~regs->orig_ax; |
536 | |
537 | @@ -1921,14 +1921,14 @@ static void __smp_error_interrupt(struct pt_regs *regs) |
538 | |
539 | } |
540 | |
541 | -__visible void smp_error_interrupt(struct pt_regs *regs) |
542 | +__visible void __irq_entry smp_error_interrupt(struct pt_regs *regs) |
543 | { |
544 | entering_irq(); |
545 | __smp_error_interrupt(regs); |
546 | exiting_irq(); |
547 | } |
548 | |
549 | -__visible void smp_trace_error_interrupt(struct pt_regs *regs) |
550 | +__visible void __irq_entry smp_trace_error_interrupt(struct pt_regs *regs) |
551 | { |
552 | entering_irq(); |
553 | trace_error_apic_entry(ERROR_APIC_VECTOR); |
554 | diff --git a/arch/x86/kernel/apic/vector.c b/arch/x86/kernel/apic/vector.c |
555 | index 5d30c5e42bb1..f3557a1eb562 100644 |
556 | --- a/arch/x86/kernel/apic/vector.c |
557 | +++ b/arch/x86/kernel/apic/vector.c |
558 | @@ -559,7 +559,7 @@ void send_cleanup_vector(struct irq_cfg *cfg) |
559 | __send_cleanup_vector(data); |
560 | } |
561 | |
562 | -asmlinkage __visible void smp_irq_move_cleanup_interrupt(void) |
563 | +asmlinkage __visible void __irq_entry smp_irq_move_cleanup_interrupt(void) |
564 | { |
565 | unsigned vector, me; |
566 | |
567 | diff --git a/arch/x86/kernel/cpu/mcheck/mce-severity.c b/arch/x86/kernel/cpu/mcheck/mce-severity.c |
568 | index 631356c8cca4..f46071cb2c90 100644 |
569 | --- a/arch/x86/kernel/cpu/mcheck/mce-severity.c |
570 | +++ b/arch/x86/kernel/cpu/mcheck/mce-severity.c |
571 | @@ -245,6 +245,9 @@ static int mce_severity_amd(struct mce *m, int tolerant, char **msg, bool is_exc |
572 | |
573 | if (m->status & MCI_STATUS_UC) { |
574 | |
575 | + if (ctx == IN_KERNEL) |
576 | + return MCE_PANIC_SEVERITY; |
577 | + |
578 | /* |
579 | * On older systems where overflow_recov flag is not present, we |
580 | * should simply panic if an error overflow occurs. If |
581 | @@ -255,10 +258,6 @@ static int mce_severity_amd(struct mce *m, int tolerant, char **msg, bool is_exc |
582 | if (mce_flags.smca) |
583 | return mce_severity_amd_smca(m, ctx); |
584 | |
585 | - /* software can try to contain */ |
586 | - if (!(m->mcgstatus & MCG_STATUS_RIPV) && (ctx == IN_KERNEL)) |
587 | - return MCE_PANIC_SEVERITY; |
588 | - |
589 | /* kill current process */ |
590 | return MCE_AR_SEVERITY; |
591 | } else { |
592 | diff --git a/arch/x86/kernel/cpu/mcheck/mce_amd.c b/arch/x86/kernel/cpu/mcheck/mce_amd.c |
593 | index a5b47c1361a0..39526e1e3132 100644 |
594 | --- a/arch/x86/kernel/cpu/mcheck/mce_amd.c |
595 | +++ b/arch/x86/kernel/cpu/mcheck/mce_amd.c |
596 | @@ -593,14 +593,14 @@ static inline void __smp_deferred_error_interrupt(void) |
597 | deferred_error_int_vector(); |
598 | } |
599 | |
600 | -asmlinkage __visible void smp_deferred_error_interrupt(void) |
601 | +asmlinkage __visible void __irq_entry smp_deferred_error_interrupt(void) |
602 | { |
603 | entering_irq(); |
604 | __smp_deferred_error_interrupt(); |
605 | exiting_ack_irq(); |
606 | } |
607 | |
608 | -asmlinkage __visible void smp_trace_deferred_error_interrupt(void) |
609 | +asmlinkage __visible void __irq_entry smp_trace_deferred_error_interrupt(void) |
610 | { |
611 | entering_irq(); |
612 | trace_deferred_error_apic_entry(DEFERRED_ERROR_VECTOR); |
613 | diff --git a/arch/x86/kernel/cpu/mcheck/therm_throt.c b/arch/x86/kernel/cpu/mcheck/therm_throt.c |
614 | index 6b9dc4d18ccc..c460c91d0c8f 100644 |
615 | --- a/arch/x86/kernel/cpu/mcheck/therm_throt.c |
616 | +++ b/arch/x86/kernel/cpu/mcheck/therm_throt.c |
617 | @@ -431,14 +431,16 @@ static inline void __smp_thermal_interrupt(void) |
618 | smp_thermal_vector(); |
619 | } |
620 | |
621 | -asmlinkage __visible void smp_thermal_interrupt(struct pt_regs *regs) |
622 | +asmlinkage __visible void __irq_entry |
623 | +smp_thermal_interrupt(struct pt_regs *regs) |
624 | { |
625 | entering_irq(); |
626 | __smp_thermal_interrupt(); |
627 | exiting_ack_irq(); |
628 | } |
629 | |
630 | -asmlinkage __visible void smp_trace_thermal_interrupt(struct pt_regs *regs) |
631 | +asmlinkage __visible void __irq_entry |
632 | +smp_trace_thermal_interrupt(struct pt_regs *regs) |
633 | { |
634 | entering_irq(); |
635 | trace_thermal_apic_entry(THERMAL_APIC_VECTOR); |
636 | diff --git a/arch/x86/kernel/cpu/mcheck/threshold.c b/arch/x86/kernel/cpu/mcheck/threshold.c |
637 | index fcf9ae9384f4..976042371b4b 100644 |
638 | --- a/arch/x86/kernel/cpu/mcheck/threshold.c |
639 | +++ b/arch/x86/kernel/cpu/mcheck/threshold.c |
640 | @@ -24,14 +24,14 @@ static inline void __smp_threshold_interrupt(void) |
641 | mce_threshold_vector(); |
642 | } |
643 | |
644 | -asmlinkage __visible void smp_threshold_interrupt(void) |
645 | +asmlinkage __visible void __irq_entry smp_threshold_interrupt(void) |
646 | { |
647 | entering_irq(); |
648 | __smp_threshold_interrupt(); |
649 | exiting_ack_irq(); |
650 | } |
651 | |
652 | -asmlinkage __visible void smp_trace_threshold_interrupt(void) |
653 | +asmlinkage __visible void __irq_entry smp_trace_threshold_interrupt(void) |
654 | { |
655 | entering_irq(); |
656 | trace_threshold_apic_entry(THRESHOLD_APIC_VECTOR); |
657 | diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c |
658 | index 9f669fdd2010..8a7ad9fb22c1 100644 |
659 | --- a/arch/x86/kernel/irq.c |
660 | +++ b/arch/x86/kernel/irq.c |
661 | @@ -265,7 +265,7 @@ void __smp_x86_platform_ipi(void) |
662 | x86_platform_ipi_callback(); |
663 | } |
664 | |
665 | -__visible void smp_x86_platform_ipi(struct pt_regs *regs) |
666 | +__visible void __irq_entry smp_x86_platform_ipi(struct pt_regs *regs) |
667 | { |
668 | struct pt_regs *old_regs = set_irq_regs(regs); |
669 | |
670 | @@ -316,7 +316,7 @@ __visible void smp_kvm_posted_intr_wakeup_ipi(struct pt_regs *regs) |
671 | } |
672 | #endif |
673 | |
674 | -__visible void smp_trace_x86_platform_ipi(struct pt_regs *regs) |
675 | +__visible void __irq_entry smp_trace_x86_platform_ipi(struct pt_regs *regs) |
676 | { |
677 | struct pt_regs *old_regs = set_irq_regs(regs); |
678 | |
679 | diff --git a/arch/x86/kernel/irq_work.c b/arch/x86/kernel/irq_work.c |
680 | index 3512ba607361..275487872be2 100644 |
681 | --- a/arch/x86/kernel/irq_work.c |
682 | +++ b/arch/x86/kernel/irq_work.c |
683 | @@ -9,6 +9,7 @@ |
684 | #include <linux/hardirq.h> |
685 | #include <asm/apic.h> |
686 | #include <asm/trace/irq_vectors.h> |
687 | +#include <linux/interrupt.h> |
688 | |
689 | static inline void __smp_irq_work_interrupt(void) |
690 | { |
691 | @@ -16,14 +17,14 @@ static inline void __smp_irq_work_interrupt(void) |
692 | irq_work_run(); |
693 | } |
694 | |
695 | -__visible void smp_irq_work_interrupt(struct pt_regs *regs) |
696 | +__visible void __irq_entry smp_irq_work_interrupt(struct pt_regs *regs) |
697 | { |
698 | ipi_entering_ack_irq(); |
699 | __smp_irq_work_interrupt(); |
700 | exiting_irq(); |
701 | } |
702 | |
703 | -__visible void smp_trace_irq_work_interrupt(struct pt_regs *regs) |
704 | +__visible void __irq_entry smp_trace_irq_work_interrupt(struct pt_regs *regs) |
705 | { |
706 | ipi_entering_ack_irq(); |
707 | trace_irq_work_entry(IRQ_WORK_VECTOR); |
708 | diff --git a/arch/x86/kernel/smp.c b/arch/x86/kernel/smp.c |
709 | index c00cb64bc0a1..ca699677e288 100644 |
710 | --- a/arch/x86/kernel/smp.c |
711 | +++ b/arch/x86/kernel/smp.c |
712 | @@ -259,7 +259,7 @@ static inline void __smp_reschedule_interrupt(void) |
713 | scheduler_ipi(); |
714 | } |
715 | |
716 | -__visible void smp_reschedule_interrupt(struct pt_regs *regs) |
717 | +__visible void __irq_entry smp_reschedule_interrupt(struct pt_regs *regs) |
718 | { |
719 | irq_enter(); |
720 | ack_APIC_irq(); |
721 | @@ -270,7 +270,7 @@ __visible void smp_reschedule_interrupt(struct pt_regs *regs) |
722 | */ |
723 | } |
724 | |
725 | -__visible void smp_trace_reschedule_interrupt(struct pt_regs *regs) |
726 | +__visible void __irq_entry smp_trace_reschedule_interrupt(struct pt_regs *regs) |
727 | { |
728 | /* |
729 | * Need to call irq_enter() before calling the trace point. |
730 | @@ -294,14 +294,15 @@ static inline void __smp_call_function_interrupt(void) |
731 | inc_irq_stat(irq_call_count); |
732 | } |
733 | |
734 | -__visible void smp_call_function_interrupt(struct pt_regs *regs) |
735 | +__visible void __irq_entry smp_call_function_interrupt(struct pt_regs *regs) |
736 | { |
737 | ipi_entering_ack_irq(); |
738 | __smp_call_function_interrupt(); |
739 | exiting_irq(); |
740 | } |
741 | |
742 | -__visible void smp_trace_call_function_interrupt(struct pt_regs *regs) |
743 | +__visible void __irq_entry |
744 | +smp_trace_call_function_interrupt(struct pt_regs *regs) |
745 | { |
746 | ipi_entering_ack_irq(); |
747 | trace_call_function_entry(CALL_FUNCTION_VECTOR); |
748 | @@ -316,14 +317,16 @@ static inline void __smp_call_function_single_interrupt(void) |
749 | inc_irq_stat(irq_call_count); |
750 | } |
751 | |
752 | -__visible void smp_call_function_single_interrupt(struct pt_regs *regs) |
753 | +__visible void __irq_entry |
754 | +smp_call_function_single_interrupt(struct pt_regs *regs) |
755 | { |
756 | ipi_entering_ack_irq(); |
757 | __smp_call_function_single_interrupt(); |
758 | exiting_irq(); |
759 | } |
760 | |
761 | -__visible void smp_trace_call_function_single_interrupt(struct pt_regs *regs) |
762 | +__visible void __irq_entry |
763 | +smp_trace_call_function_single_interrupt(struct pt_regs *regs) |
764 | { |
765 | ipi_entering_ack_irq(); |
766 | trace_call_function_single_entry(CALL_FUNCTION_SINGLE_VECTOR); |
767 | diff --git a/crypto/Kconfig b/crypto/Kconfig |
768 | index fa98ad7edb60..84d71482bf08 100644 |
769 | --- a/crypto/Kconfig |
770 | +++ b/crypto/Kconfig |
771 | @@ -360,7 +360,6 @@ config CRYPTO_XTS |
772 | select CRYPTO_BLKCIPHER |
773 | select CRYPTO_MANAGER |
774 | select CRYPTO_GF128MUL |
775 | - select CRYPTO_ECB |
776 | help |
777 | XTS: IEEE1619/D16 narrow block cipher use with aes-xts-plain, |
778 | key size 256, 384 or 512 bits. This implementation currently |
779 | diff --git a/crypto/dh_helper.c b/crypto/dh_helper.c |
780 | index 02db76b20d00..14539904416e 100644 |
781 | --- a/crypto/dh_helper.c |
782 | +++ b/crypto/dh_helper.c |
783 | @@ -83,6 +83,14 @@ int crypto_dh_decode_key(const char *buf, unsigned int len, struct dh *params) |
784 | if (secret.len != crypto_dh_key_len(params)) |
785 | return -EINVAL; |
786 | |
787 | + /* |
788 | + * Don't permit the buffer for 'key' or 'g' to be larger than 'p', since |
789 | + * some drivers assume otherwise. |
790 | + */ |
791 | + if (params->key_size > params->p_size || |
792 | + params->g_size > params->p_size) |
793 | + return -EINVAL; |
794 | + |
795 | /* Don't allocate memory. Set pointers to data within |
796 | * the given buffer |
797 | */ |
798 | @@ -90,6 +98,14 @@ int crypto_dh_decode_key(const char *buf, unsigned int len, struct dh *params) |
799 | params->p = (void *)(ptr + params->key_size); |
800 | params->g = (void *)(ptr + params->key_size + params->p_size); |
801 | |
802 | + /* |
803 | + * Don't permit 'p' to be 0. It's not a prime number, and it's subject |
804 | + * to corner cases such as 'mod 0' being undefined or |
805 | + * crypto_kpp_maxsize() returning 0. |
806 | + */ |
807 | + if (memchr_inv(params->p, 0, params->p_size) == NULL) |
808 | + return -EINVAL; |
809 | + |
810 | return 0; |
811 | } |
812 | EXPORT_SYMBOL_GPL(crypto_dh_decode_key); |
813 | diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig |
814 | index 2c8be74f401d..5d16fc4fa46c 100644 |
815 | --- a/drivers/ata/Kconfig |
816 | +++ b/drivers/ata/Kconfig |
817 | @@ -289,6 +289,7 @@ config SATA_SX4 |
818 | |
819 | config ATA_BMDMA |
820 | bool "ATA BMDMA support" |
821 | + depends on HAS_DMA |
822 | default y |
823 | help |
824 | This option adds support for SFF ATA controllers with BMDMA |
825 | @@ -344,6 +345,7 @@ config SATA_DWC_VDEBUG |
826 | |
827 | config SATA_HIGHBANK |
828 | tristate "Calxeda Highbank SATA support" |
829 | + depends on HAS_DMA |
830 | depends on ARCH_HIGHBANK || COMPILE_TEST |
831 | help |
832 | This option enables support for the Calxeda Highbank SoC's |
833 | @@ -353,6 +355,7 @@ config SATA_HIGHBANK |
834 | |
835 | config SATA_MV |
836 | tristate "Marvell SATA support" |
837 | + depends on HAS_DMA |
838 | depends on PCI || ARCH_DOVE || ARCH_MV78XX0 || \ |
839 | ARCH_MVEBU || ARCH_ORION5X || COMPILE_TEST |
840 | select GENERIC_PHY |
841 | diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c |
842 | index 74e677ac8e37..693028659ccc 100644 |
843 | --- a/drivers/bluetooth/btusb.c |
844 | +++ b/drivers/bluetooth/btusb.c |
845 | @@ -2925,6 +2925,12 @@ static int btusb_probe(struct usb_interface *intf, |
846 | if (id->driver_info & BTUSB_QCA_ROME) { |
847 | data->setup_on_usb = btusb_setup_qca; |
848 | hdev->set_bdaddr = btusb_set_bdaddr_ath3012; |
849 | + |
850 | + /* QCA Rome devices lose their updated firmware over suspend, |
851 | + * but the USB hub doesn't notice any status change. |
852 | + * Explicitly request a device reset on resume. |
853 | + */ |
854 | + set_bit(BTUSB_RESET_RESUME, &data->flags); |
855 | } |
856 | |
857 | #ifdef CONFIG_BT_HCIBTUSB_RTL |
858 | diff --git a/drivers/extcon/extcon-palmas.c b/drivers/extcon/extcon-palmas.c |
859 | index 634ba70782de..a128fd2eb187 100644 |
860 | --- a/drivers/extcon/extcon-palmas.c |
861 | +++ b/drivers/extcon/extcon-palmas.c |
862 | @@ -190,6 +190,11 @@ static int palmas_usb_probe(struct platform_device *pdev) |
863 | struct palmas_usb *palmas_usb; |
864 | int status; |
865 | |
866 | + if (!palmas) { |
867 | + dev_err(&pdev->dev, "failed to get valid parent\n"); |
868 | + return -EINVAL; |
869 | + } |
870 | + |
871 | palmas_usb = devm_kzalloc(&pdev->dev, sizeof(*palmas_usb), GFP_KERNEL); |
872 | if (!palmas_usb) |
873 | return -ENOMEM; |
874 | diff --git a/drivers/extcon/extcon.c b/drivers/extcon/extcon.c |
875 | index 7c1e3a7b14e0..d0e367959c91 100644 |
876 | --- a/drivers/extcon/extcon.c |
877 | +++ b/drivers/extcon/extcon.c |
878 | @@ -906,35 +906,16 @@ int extcon_register_notifier(struct extcon_dev *edev, unsigned int id, |
879 | unsigned long flags; |
880 | int ret, idx = -EINVAL; |
881 | |
882 | - if (!nb) |
883 | + if (!edev || !nb) |
884 | return -EINVAL; |
885 | |
886 | - if (edev) { |
887 | - idx = find_cable_index_by_id(edev, id); |
888 | - if (idx < 0) |
889 | - return idx; |
890 | - |
891 | - spin_lock_irqsave(&edev->lock, flags); |
892 | - ret = raw_notifier_chain_register(&edev->nh[idx], nb); |
893 | - spin_unlock_irqrestore(&edev->lock, flags); |
894 | - } else { |
895 | - struct extcon_dev *extd; |
896 | - |
897 | - mutex_lock(&extcon_dev_list_lock); |
898 | - list_for_each_entry(extd, &extcon_dev_list, entry) { |
899 | - idx = find_cable_index_by_id(extd, id); |
900 | - if (idx >= 0) |
901 | - break; |
902 | - } |
903 | - mutex_unlock(&extcon_dev_list_lock); |
904 | + idx = find_cable_index_by_id(edev, id); |
905 | + if (idx < 0) |
906 | + return idx; |
907 | |
908 | - if (idx >= 0) { |
909 | - edev = extd; |
910 | - return extcon_register_notifier(extd, id, nb); |
911 | - } else { |
912 | - ret = -ENODEV; |
913 | - } |
914 | - } |
915 | + spin_lock_irqsave(&edev->lock, flags); |
916 | + ret = raw_notifier_chain_register(&edev->nh[idx], nb); |
917 | + spin_unlock_irqrestore(&edev->lock, flags); |
918 | |
919 | return ret; |
920 | } |
921 | diff --git a/drivers/gpu/drm/mgag200/mgag200_main.c b/drivers/gpu/drm/mgag200/mgag200_main.c |
922 | index e79cbc25ae3c..fb03e3057485 100644 |
923 | --- a/drivers/gpu/drm/mgag200/mgag200_main.c |
924 | +++ b/drivers/gpu/drm/mgag200/mgag200_main.c |
925 | @@ -145,6 +145,8 @@ static int mga_vram_init(struct mga_device *mdev) |
926 | } |
927 | |
928 | mem = pci_iomap(mdev->dev->pdev, 0, 0); |
929 | + if (!mem) |
930 | + return -ENOMEM; |
931 | |
932 | mdev->mc.vram_size = mga_probe_vram(mdev, mem); |
933 | |
934 | diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c |
935 | index 3557a4c7dd7b..270a62348a6e 100644 |
936 | --- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c |
937 | +++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c |
938 | @@ -912,6 +912,7 @@ static struct spi_driver acx565akm_driver = { |
939 | |
940 | module_spi_driver(acx565akm_driver); |
941 | |
942 | +MODULE_ALIAS("spi:sony,acx565akm"); |
943 | MODULE_AUTHOR("Nokia Corporation"); |
944 | MODULE_DESCRIPTION("acx565akm LCD Driver"); |
945 | MODULE_LICENSE("GPL"); |
946 | diff --git a/drivers/gpu/drm/sti/sti_vtg.c b/drivers/gpu/drm/sti/sti_vtg.c |
947 | index a8882bdd0f8b..c3d9c8ae14af 100644 |
948 | --- a/drivers/gpu/drm/sti/sti_vtg.c |
949 | +++ b/drivers/gpu/drm/sti/sti_vtg.c |
950 | @@ -429,6 +429,10 @@ static int vtg_probe(struct platform_device *pdev) |
951 | return -ENOMEM; |
952 | } |
953 | vtg->regs = devm_ioremap_nocache(dev, res->start, resource_size(res)); |
954 | + if (!vtg->regs) { |
955 | + DRM_ERROR("failed to remap I/O memory\n"); |
956 | + return -ENOMEM; |
957 | + } |
958 | |
959 | np = of_parse_phandle(pdev->dev.of_node, "st,slave", 0); |
960 | if (np) { |
961 | diff --git a/drivers/media/rc/imon.c b/drivers/media/rc/imon.c |
962 | index 2d4b83635018..f072bf28fccd 100644 |
963 | --- a/drivers/media/rc/imon.c |
964 | +++ b/drivers/media/rc/imon.c |
965 | @@ -2412,6 +2412,11 @@ static int imon_probe(struct usb_interface *interface, |
966 | mutex_lock(&driver_lock); |
967 | |
968 | first_if = usb_ifnum_to_if(usbdev, 0); |
969 | + if (!first_if) { |
970 | + ret = -ENODEV; |
971 | + goto fail; |
972 | + } |
973 | + |
974 | first_if_ctx = usb_get_intfdata(first_if); |
975 | |
976 | if (ifnum == 0) { |
977 | diff --git a/drivers/media/usb/dvb-usb/dib0700_devices.c b/drivers/media/usb/dvb-usb/dib0700_devices.c |
978 | index ef1b8ee75c57..caa55402052e 100644 |
979 | --- a/drivers/media/usb/dvb-usb/dib0700_devices.c |
980 | +++ b/drivers/media/usb/dvb-usb/dib0700_devices.c |
981 | @@ -292,7 +292,7 @@ static int stk7700P2_frontend_attach(struct dvb_usb_adapter *adap) |
982 | stk7700d_dib7000p_mt2266_config) |
983 | != 0) { |
984 | err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n", __func__); |
985 | - dvb_detach(&state->dib7000p_ops); |
986 | + dvb_detach(state->dib7000p_ops.set_wbd_ref); |
987 | return -ENODEV; |
988 | } |
989 | } |
990 | @@ -326,7 +326,7 @@ static int stk7700d_frontend_attach(struct dvb_usb_adapter *adap) |
991 | stk7700d_dib7000p_mt2266_config) |
992 | != 0) { |
993 | err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n", __func__); |
994 | - dvb_detach(&state->dib7000p_ops); |
995 | + dvb_detach(state->dib7000p_ops.set_wbd_ref); |
996 | return -ENODEV; |
997 | } |
998 | } |
999 | @@ -479,7 +479,7 @@ static int stk7700ph_frontend_attach(struct dvb_usb_adapter *adap) |
1000 | &stk7700ph_dib7700_xc3028_config) != 0) { |
1001 | err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n", |
1002 | __func__); |
1003 | - dvb_detach(&state->dib7000p_ops); |
1004 | + dvb_detach(state->dib7000p_ops.set_wbd_ref); |
1005 | return -ENODEV; |
1006 | } |
1007 | |
1008 | @@ -1011,7 +1011,7 @@ static int stk7070p_frontend_attach(struct dvb_usb_adapter *adap) |
1009 | &dib7070p_dib7000p_config) != 0) { |
1010 | err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n", |
1011 | __func__); |
1012 | - dvb_detach(&state->dib7000p_ops); |
1013 | + dvb_detach(state->dib7000p_ops.set_wbd_ref); |
1014 | return -ENODEV; |
1015 | } |
1016 | |
1017 | @@ -1069,7 +1069,7 @@ static int stk7770p_frontend_attach(struct dvb_usb_adapter *adap) |
1018 | &dib7770p_dib7000p_config) != 0) { |
1019 | err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n", |
1020 | __func__); |
1021 | - dvb_detach(&state->dib7000p_ops); |
1022 | + dvb_detach(state->dib7000p_ops.set_wbd_ref); |
1023 | return -ENODEV; |
1024 | } |
1025 | |
1026 | @@ -3056,7 +3056,7 @@ static int nim7090_frontend_attach(struct dvb_usb_adapter *adap) |
1027 | |
1028 | if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 0x10, &nim7090_dib7000p_config) != 0) { |
1029 | err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n", __func__); |
1030 | - dvb_detach(&state->dib7000p_ops); |
1031 | + dvb_detach(state->dib7000p_ops.set_wbd_ref); |
1032 | return -ENODEV; |
1033 | } |
1034 | adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x80, &nim7090_dib7000p_config); |
1035 | @@ -3109,7 +3109,7 @@ static int tfe7090pvr_frontend0_attach(struct dvb_usb_adapter *adap) |
1036 | /* initialize IC 0 */ |
1037 | if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 0x20, &tfe7090pvr_dib7000p_config[0]) != 0) { |
1038 | err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n", __func__); |
1039 | - dvb_detach(&state->dib7000p_ops); |
1040 | + dvb_detach(state->dib7000p_ops.set_wbd_ref); |
1041 | return -ENODEV; |
1042 | } |
1043 | |
1044 | @@ -3139,7 +3139,7 @@ static int tfe7090pvr_frontend1_attach(struct dvb_usb_adapter *adap) |
1045 | i2c = state->dib7000p_ops.get_i2c_master(adap->dev->adapter[0].fe_adap[0].fe, DIBX000_I2C_INTERFACE_GPIO_6_7, 1); |
1046 | if (state->dib7000p_ops.i2c_enumeration(i2c, 1, 0x10, &tfe7090pvr_dib7000p_config[1]) != 0) { |
1047 | err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n", __func__); |
1048 | - dvb_detach(&state->dib7000p_ops); |
1049 | + dvb_detach(state->dib7000p_ops.set_wbd_ref); |
1050 | return -ENODEV; |
1051 | } |
1052 | |
1053 | @@ -3214,7 +3214,7 @@ static int tfe7790p_frontend_attach(struct dvb_usb_adapter *adap) |
1054 | 1, 0x10, &tfe7790p_dib7000p_config) != 0) { |
1055 | err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n", |
1056 | __func__); |
1057 | - dvb_detach(&state->dib7000p_ops); |
1058 | + dvb_detach(state->dib7000p_ops.set_wbd_ref); |
1059 | return -ENODEV; |
1060 | } |
1061 | adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, |
1062 | @@ -3309,7 +3309,7 @@ static int stk7070pd_frontend_attach0(struct dvb_usb_adapter *adap) |
1063 | stk7070pd_dib7000p_config) != 0) { |
1064 | err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n", |
1065 | __func__); |
1066 | - dvb_detach(&state->dib7000p_ops); |
1067 | + dvb_detach(state->dib7000p_ops.set_wbd_ref); |
1068 | return -ENODEV; |
1069 | } |
1070 | |
1071 | @@ -3384,7 +3384,7 @@ static int novatd_frontend_attach(struct dvb_usb_adapter *adap) |
1072 | stk7070pd_dib7000p_config) != 0) { |
1073 | err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n", |
1074 | __func__); |
1075 | - dvb_detach(&state->dib7000p_ops); |
1076 | + dvb_detach(state->dib7000p_ops.set_wbd_ref); |
1077 | return -ENODEV; |
1078 | } |
1079 | } |
1080 | @@ -3620,7 +3620,7 @@ static int pctv340e_frontend_attach(struct dvb_usb_adapter *adap) |
1081 | |
1082 | if (state->dib7000p_ops.dib7000pc_detection(&adap->dev->i2c_adap) == 0) { |
1083 | /* Demodulator not found for some reason? */ |
1084 | - dvb_detach(&state->dib7000p_ops); |
1085 | + dvb_detach(state->dib7000p_ops.set_wbd_ref); |
1086 | return -ENODEV; |
1087 | } |
1088 | |
1089 | diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_mbx.c b/drivers/net/ethernet/intel/fm10k/fm10k_mbx.c |
1090 | index c9dfa6564fcf..334088a101c3 100644 |
1091 | --- a/drivers/net/ethernet/intel/fm10k/fm10k_mbx.c |
1092 | +++ b/drivers/net/ethernet/intel/fm10k/fm10k_mbx.c |
1093 | @@ -2011,9 +2011,10 @@ static void fm10k_sm_mbx_create_reply(struct fm10k_hw *hw, |
1094 | * function can also be used to respond to an error as the connection |
1095 | * resetting would also be a means of dealing with errors. |
1096 | **/ |
1097 | -static void fm10k_sm_mbx_process_reset(struct fm10k_hw *hw, |
1098 | - struct fm10k_mbx_info *mbx) |
1099 | +static s32 fm10k_sm_mbx_process_reset(struct fm10k_hw *hw, |
1100 | + struct fm10k_mbx_info *mbx) |
1101 | { |
1102 | + s32 err = 0; |
1103 | const enum fm10k_mbx_state state = mbx->state; |
1104 | |
1105 | switch (state) { |
1106 | @@ -2026,6 +2027,7 @@ static void fm10k_sm_mbx_process_reset(struct fm10k_hw *hw, |
1107 | case FM10K_STATE_OPEN: |
1108 | /* flush any incomplete work */ |
1109 | fm10k_sm_mbx_connect_reset(mbx); |
1110 | + err = FM10K_ERR_RESET_REQUESTED; |
1111 | break; |
1112 | case FM10K_STATE_CONNECT: |
1113 | /* Update remote value to match local value */ |
1114 | @@ -2035,6 +2037,8 @@ static void fm10k_sm_mbx_process_reset(struct fm10k_hw *hw, |
1115 | } |
1116 | |
1117 | fm10k_sm_mbx_create_reply(hw, mbx, mbx->tail); |
1118 | + |
1119 | + return err; |
1120 | } |
1121 | |
1122 | /** |
1123 | @@ -2115,7 +2119,7 @@ static s32 fm10k_sm_mbx_process(struct fm10k_hw *hw, |
1124 | |
1125 | switch (FM10K_MSG_HDR_FIELD_GET(mbx->mbx_hdr, SM_VER)) { |
1126 | case 0: |
1127 | - fm10k_sm_mbx_process_reset(hw, mbx); |
1128 | + err = fm10k_sm_mbx_process_reset(hw, mbx); |
1129 | break; |
1130 | case FM10K_SM_MBX_VERSION: |
1131 | err = fm10k_sm_mbx_process_version_1(hw, mbx); |
1132 | diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_pci.c b/drivers/net/ethernet/intel/fm10k/fm10k_pci.c |
1133 | index b1a2f8437d59..e372a5823480 100644 |
1134 | --- a/drivers/net/ethernet/intel/fm10k/fm10k_pci.c |
1135 | +++ b/drivers/net/ethernet/intel/fm10k/fm10k_pci.c |
1136 | @@ -1144,6 +1144,7 @@ static irqreturn_t fm10k_msix_mbx_pf(int __always_unused irq, void *data) |
1137 | struct fm10k_hw *hw = &interface->hw; |
1138 | struct fm10k_mbx_info *mbx = &hw->mbx; |
1139 | u32 eicr; |
1140 | + s32 err = 0; |
1141 | |
1142 | /* unmask any set bits related to this interrupt */ |
1143 | eicr = fm10k_read_reg(hw, FM10K_EICR); |
1144 | @@ -1159,12 +1160,15 @@ static irqreturn_t fm10k_msix_mbx_pf(int __always_unused irq, void *data) |
1145 | |
1146 | /* service mailboxes */ |
1147 | if (fm10k_mbx_trylock(interface)) { |
1148 | - mbx->ops.process(hw, mbx); |
1149 | + err = mbx->ops.process(hw, mbx); |
1150 | /* handle VFLRE events */ |
1151 | fm10k_iov_event(interface); |
1152 | fm10k_mbx_unlock(interface); |
1153 | } |
1154 | |
1155 | + if (err == FM10K_ERR_RESET_REQUESTED) |
1156 | + interface->flags |= FM10K_FLAG_RESET_REQUESTED; |
1157 | + |
1158 | /* if switch toggled state we should reset GLORTs */ |
1159 | if (eicr & FM10K_EICR_SWITCHNOTREADY) { |
1160 | /* force link down for at least 4 seconds */ |
1161 | diff --git a/drivers/net/ethernet/intel/igb/e1000_82575.c b/drivers/net/ethernet/intel/igb/e1000_82575.c |
1162 | index 1264a3616acf..4a50870e0fa7 100644 |
1163 | --- a/drivers/net/ethernet/intel/igb/e1000_82575.c |
1164 | +++ b/drivers/net/ethernet/intel/igb/e1000_82575.c |
1165 | @@ -245,6 +245,17 @@ static s32 igb_init_phy_params_82575(struct e1000_hw *hw) |
1166 | hw->bus.func = (rd32(E1000_STATUS) & E1000_STATUS_FUNC_MASK) >> |
1167 | E1000_STATUS_FUNC_SHIFT; |
1168 | |
1169 | + /* Make sure the PHY is in a good state. Several people have reported |
1170 | + * firmware leaving the PHY's page select register set to something |
1171 | + * other than the default of zero, which causes the PHY ID read to |
1172 | + * access something other than the intended register. |
1173 | + */ |
1174 | + ret_val = hw->phy.ops.reset(hw); |
1175 | + if (ret_val) { |
1176 | + hw_dbg("Error resetting the PHY.\n"); |
1177 | + goto out; |
1178 | + } |
1179 | + |
1180 | /* Set phy->phy_addr and phy->id. */ |
1181 | igb_write_phy_reg_82580(hw, I347AT4_PAGE_SELECT, 0); |
1182 | ret_val = igb_get_phy_id_82575(hw); |
1183 | diff --git a/drivers/net/ethernet/intel/igb/e1000_i210.c b/drivers/net/ethernet/intel/igb/e1000_i210.c |
1184 | index 8aa798737d4d..07d48f2e3369 100644 |
1185 | --- a/drivers/net/ethernet/intel/igb/e1000_i210.c |
1186 | +++ b/drivers/net/ethernet/intel/igb/e1000_i210.c |
1187 | @@ -699,9 +699,9 @@ static s32 igb_update_flash_i210(struct e1000_hw *hw) |
1188 | |
1189 | ret_val = igb_pool_flash_update_done_i210(hw); |
1190 | if (ret_val) |
1191 | - hw_dbg("Flash update complete\n"); |
1192 | - else |
1193 | hw_dbg("Flash update time out\n"); |
1194 | + else |
1195 | + hw_dbg("Flash update complete\n"); |
1196 | |
1197 | out: |
1198 | return ret_val; |
1199 | diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c |
1200 | index 6a62447fe377..c6c2562d9df3 100644 |
1201 | --- a/drivers/net/ethernet/intel/igb/igb_main.c |
1202 | +++ b/drivers/net/ethernet/intel/igb/igb_main.c |
1203 | @@ -3271,7 +3271,9 @@ static int __igb_close(struct net_device *netdev, bool suspending) |
1204 | |
1205 | int igb_close(struct net_device *netdev) |
1206 | { |
1207 | - return __igb_close(netdev, false); |
1208 | + if (netif_device_present(netdev)) |
1209 | + return __igb_close(netdev, false); |
1210 | + return 0; |
1211 | } |
1212 | |
1213 | /** |
1214 | @@ -7548,6 +7550,7 @@ static int __igb_shutdown(struct pci_dev *pdev, bool *enable_wake, |
1215 | int retval = 0; |
1216 | #endif |
1217 | |
1218 | + rtnl_lock(); |
1219 | netif_device_detach(netdev); |
1220 | |
1221 | if (netif_running(netdev)) |
1222 | @@ -7556,6 +7559,7 @@ static int __igb_shutdown(struct pci_dev *pdev, bool *enable_wake, |
1223 | igb_ptp_suspend(adapter); |
1224 | |
1225 | igb_clear_interrupt_scheme(adapter); |
1226 | + rtnl_unlock(); |
1227 | |
1228 | #ifdef CONFIG_PM |
1229 | retval = pci_save_state(pdev); |
1230 | @@ -7674,16 +7678,15 @@ static int igb_resume(struct device *dev) |
1231 | |
1232 | wr32(E1000_WUS, ~0); |
1233 | |
1234 | - if (netdev->flags & IFF_UP) { |
1235 | - rtnl_lock(); |
1236 | + rtnl_lock(); |
1237 | + if (!err && netif_running(netdev)) |
1238 | err = __igb_open(netdev, true); |
1239 | - rtnl_unlock(); |
1240 | - if (err) |
1241 | - return err; |
1242 | - } |
1243 | |
1244 | - netif_device_attach(netdev); |
1245 | - return 0; |
1246 | + if (!err) |
1247 | + netif_device_attach(netdev); |
1248 | + rtnl_unlock(); |
1249 | + |
1250 | + return err; |
1251 | } |
1252 | |
1253 | static int igb_runtime_idle(struct device *dev) |
1254 | diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c |
1255 | index f49f80380aa5..a137e060c185 100644 |
1256 | --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c |
1257 | +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c |
1258 | @@ -199,7 +199,7 @@ static int ixgbe_get_settings(struct net_device *netdev, |
1259 | if (supported_link & IXGBE_LINK_SPEED_100_FULL) |
1260 | ecmd->supported |= ixgbe_isbackplane(hw->phy.media_type) ? |
1261 | SUPPORTED_1000baseKX_Full : |
1262 | - SUPPORTED_1000baseT_Full; |
1263 | + SUPPORTED_100baseT_Full; |
1264 | |
1265 | /* default advertised speed if phy.autoneg_advertised isn't set */ |
1266 | ecmd->advertising = ecmd->supported; |
1267 | diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_lib.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_lib.c |
1268 | index 15ab337fd7ad..10d29678d65e 100644 |
1269 | --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_lib.c |
1270 | +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_lib.c |
1271 | @@ -308,6 +308,7 @@ static void ixgbe_cache_ring_register(struct ixgbe_adapter *adapter) |
1272 | ixgbe_cache_ring_rss(adapter); |
1273 | } |
1274 | |
1275 | +#define IXGBE_RSS_64Q_MASK 0x3F |
1276 | #define IXGBE_RSS_16Q_MASK 0xF |
1277 | #define IXGBE_RSS_8Q_MASK 0x7 |
1278 | #define IXGBE_RSS_4Q_MASK 0x3 |
1279 | @@ -604,6 +605,7 @@ static bool ixgbe_set_sriov_queues(struct ixgbe_adapter *adapter) |
1280 | **/ |
1281 | static bool ixgbe_set_rss_queues(struct ixgbe_adapter *adapter) |
1282 | { |
1283 | + struct ixgbe_hw *hw = &adapter->hw; |
1284 | struct ixgbe_ring_feature *f; |
1285 | u16 rss_i; |
1286 | |
1287 | @@ -612,7 +614,11 @@ static bool ixgbe_set_rss_queues(struct ixgbe_adapter *adapter) |
1288 | rss_i = f->limit; |
1289 | |
1290 | f->indices = rss_i; |
1291 | - f->mask = IXGBE_RSS_16Q_MASK; |
1292 | + |
1293 | + if (hw->mac.type < ixgbe_mac_X550) |
1294 | + f->mask = IXGBE_RSS_16Q_MASK; |
1295 | + else |
1296 | + f->mask = IXGBE_RSS_64Q_MASK; |
1297 | |
1298 | /* disable ATR by default, it will be configured below */ |
1299 | adapter->flags &= ~IXGBE_FLAG_FDIR_HASH_CAPABLE; |
1300 | diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c |
1301 | index fee1f2918ead..334eb96ecda3 100644 |
1302 | --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c |
1303 | +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c |
1304 | @@ -6194,7 +6194,8 @@ int ixgbe_close(struct net_device *netdev) |
1305 | |
1306 | ixgbe_ptp_stop(adapter); |
1307 | |
1308 | - ixgbe_close_suspend(adapter); |
1309 | + if (netif_device_present(netdev)) |
1310 | + ixgbe_close_suspend(adapter); |
1311 | |
1312 | ixgbe_fdir_filter_exit(adapter); |
1313 | |
1314 | @@ -6239,14 +6240,12 @@ static int ixgbe_resume(struct pci_dev *pdev) |
1315 | if (!err && netif_running(netdev)) |
1316 | err = ixgbe_open(netdev); |
1317 | |
1318 | - rtnl_unlock(); |
1319 | - |
1320 | - if (err) |
1321 | - return err; |
1322 | |
1323 | - netif_device_attach(netdev); |
1324 | + if (!err) |
1325 | + netif_device_attach(netdev); |
1326 | + rtnl_unlock(); |
1327 | |
1328 | - return 0; |
1329 | + return err; |
1330 | } |
1331 | #endif /* CONFIG_PM */ |
1332 | |
1333 | @@ -6261,14 +6260,14 @@ static int __ixgbe_shutdown(struct pci_dev *pdev, bool *enable_wake) |
1334 | int retval = 0; |
1335 | #endif |
1336 | |
1337 | + rtnl_lock(); |
1338 | netif_device_detach(netdev); |
1339 | |
1340 | - rtnl_lock(); |
1341 | if (netif_running(netdev)) |
1342 | ixgbe_close_suspend(adapter); |
1343 | - rtnl_unlock(); |
1344 | |
1345 | ixgbe_clear_interrupt_scheme(adapter); |
1346 | + rtnl_unlock(); |
1347 | |
1348 | #ifdef CONFIG_PM |
1349 | retval = pci_save_state(pdev); |
1350 | @@ -10027,7 +10026,7 @@ static pci_ers_result_t ixgbe_io_error_detected(struct pci_dev *pdev, |
1351 | } |
1352 | |
1353 | if (netif_running(netdev)) |
1354 | - ixgbe_down(adapter); |
1355 | + ixgbe_close_suspend(adapter); |
1356 | |
1357 | if (!test_and_set_bit(__IXGBE_DISABLED, &adapter->state)) |
1358 | pci_disable_device(pdev); |
1359 | @@ -10097,10 +10096,12 @@ static void ixgbe_io_resume(struct pci_dev *pdev) |
1360 | } |
1361 | |
1362 | #endif |
1363 | + rtnl_lock(); |
1364 | if (netif_running(netdev)) |
1365 | - ixgbe_up(adapter); |
1366 | + ixgbe_open(netdev); |
1367 | |
1368 | netif_device_attach(netdev); |
1369 | + rtnl_unlock(); |
1370 | } |
1371 | |
1372 | static const struct pci_error_handlers ixgbe_err_handler = { |
1373 | diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c |
1374 | index 021ab9b89c71..b17464e843de 100644 |
1375 | --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c |
1376 | +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c |
1377 | @@ -113,7 +113,7 @@ static s32 ixgbe_read_i2c_combined_generic_int(struct ixgbe_hw *hw, u8 addr, |
1378 | u16 reg, u16 *val, bool lock) |
1379 | { |
1380 | u32 swfw_mask = hw->phy.phy_semaphore_mask; |
1381 | - int max_retry = 10; |
1382 | + int max_retry = 3; |
1383 | int retry = 0; |
1384 | u8 csum_byte; |
1385 | u8 high_bits; |
1386 | @@ -1764,6 +1764,8 @@ static s32 ixgbe_read_i2c_byte_generic_int(struct ixgbe_hw *hw, u8 byte_offset, |
1387 | u32 swfw_mask = hw->phy.phy_semaphore_mask; |
1388 | bool nack = true; |
1389 | |
1390 | + if (hw->mac.type >= ixgbe_mac_X550) |
1391 | + max_retry = 3; |
1392 | if (ixgbe_is_sfp_probe(hw, byte_offset, dev_addr)) |
1393 | max_retry = IXGBE_SFP_DETECT_RETRIES; |
1394 | |
1395 | diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c |
1396 | index 7e6b9267ca9d..60f0bf779073 100644 |
1397 | --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c |
1398 | +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c |
1399 | @@ -1932,8 +1932,6 @@ static s32 ixgbe_setup_kr_speed_x550em(struct ixgbe_hw *hw, |
1400 | return status; |
1401 | |
1402 | reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_ENABLE; |
1403 | - reg_val &= ~(IXGBE_KRM_LINK_CTRL_1_TETH_AN_FEC_REQ | |
1404 | - IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_FEC); |
1405 | reg_val &= ~(IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_KR | |
1406 | IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_KX); |
1407 | |
1408 | @@ -1995,12 +1993,11 @@ static s32 ixgbe_setup_kx4_x550em(struct ixgbe_hw *hw) |
1409 | /** |
1410 | * ixgbe_setup_kr_x550em - Configure the KR PHY |
1411 | * @hw: pointer to hardware structure |
1412 | - * |
1413 | - * Configures the integrated KR PHY for X550EM_x. |
1414 | **/ |
1415 | static s32 ixgbe_setup_kr_x550em(struct ixgbe_hw *hw) |
1416 | { |
1417 | - if (hw->mac.type != ixgbe_mac_X550EM_x) |
1418 | + /* leave link alone for 2.5G */ |
1419 | + if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_2_5GB_FULL) |
1420 | return 0; |
1421 | |
1422 | return ixgbe_setup_kr_speed_x550em(hw, hw->phy.autoneg_advertised); |
1423 | diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c |
1424 | index fc844a1f6c3f..f507d821aba8 100644 |
1425 | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c |
1426 | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c |
1427 | @@ -147,7 +147,6 @@ static struct ieee80211_rate __wl_rates[] = { |
1428 | .band = NL80211_BAND_2GHZ, \ |
1429 | .center_freq = (_freq), \ |
1430 | .hw_value = (_channel), \ |
1431 | - .flags = IEEE80211_CHAN_DISABLED, \ |
1432 | .max_antenna_gain = 0, \ |
1433 | .max_power = 30, \ |
1434 | } |
1435 | @@ -156,7 +155,6 @@ static struct ieee80211_rate __wl_rates[] = { |
1436 | .band = NL80211_BAND_5GHZ, \ |
1437 | .center_freq = 5000 + (5 * (_channel)), \ |
1438 | .hw_value = (_channel), \ |
1439 | - .flags = IEEE80211_CHAN_DISABLED, \ |
1440 | .max_antenna_gain = 0, \ |
1441 | .max_power = 30, \ |
1442 | } |
1443 | diff --git a/drivers/power/supply/axp288_fuel_gauge.c b/drivers/power/supply/axp288_fuel_gauge.c |
1444 | index f62f9dfea984..089056cb8e73 100644 |
1445 | --- a/drivers/power/supply/axp288_fuel_gauge.c |
1446 | +++ b/drivers/power/supply/axp288_fuel_gauge.c |
1447 | @@ -29,6 +29,7 @@ |
1448 | #include <linux/iio/consumer.h> |
1449 | #include <linux/debugfs.h> |
1450 | #include <linux/seq_file.h> |
1451 | +#include <asm/unaligned.h> |
1452 | |
1453 | #define CHRG_STAT_BAT_SAFE_MODE (1 << 3) |
1454 | #define CHRG_STAT_BAT_VALID (1 << 4) |
1455 | @@ -73,17 +74,15 @@ |
1456 | #define FG_CNTL_CC_EN (1 << 6) |
1457 | #define FG_CNTL_GAUGE_EN (1 << 7) |
1458 | |
1459 | +#define FG_15BIT_WORD_VALID (1 << 15) |
1460 | +#define FG_15BIT_VAL_MASK 0x7fff |
1461 | + |
1462 | #define FG_REP_CAP_VALID (1 << 7) |
1463 | #define FG_REP_CAP_VAL_MASK 0x7F |
1464 | |
1465 | #define FG_DES_CAP1_VALID (1 << 7) |
1466 | -#define FG_DES_CAP1_VAL_MASK 0x7F |
1467 | -#define FG_DES_CAP0_VAL_MASK 0xFF |
1468 | #define FG_DES_CAP_RES_LSB 1456 /* 1.456mAhr */ |
1469 | |
1470 | -#define FG_CC_MTR1_VALID (1 << 7) |
1471 | -#define FG_CC_MTR1_VAL_MASK 0x7F |
1472 | -#define FG_CC_MTR0_VAL_MASK 0xFF |
1473 | #define FG_DES_CC_RES_LSB 1456 /* 1.456mAhr */ |
1474 | |
1475 | #define FG_OCV_CAP_VALID (1 << 7) |
1476 | @@ -189,6 +188,44 @@ static int fuel_gauge_reg_writeb(struct axp288_fg_info *info, int reg, u8 val) |
1477 | return ret; |
1478 | } |
1479 | |
1480 | +static int fuel_gauge_read_15bit_word(struct axp288_fg_info *info, int reg) |
1481 | +{ |
1482 | + unsigned char buf[2]; |
1483 | + int ret; |
1484 | + |
1485 | + ret = regmap_bulk_read(info->regmap, reg, buf, 2); |
1486 | + if (ret < 0) { |
1487 | + dev_err(&info->pdev->dev, "Error reading reg 0x%02x err: %d\n", |
1488 | + reg, ret); |
1489 | + return ret; |
1490 | + } |
1491 | + |
1492 | + ret = get_unaligned_be16(buf); |
1493 | + if (!(ret & FG_15BIT_WORD_VALID)) { |
1494 | + dev_err(&info->pdev->dev, "Error reg 0x%02x contents not valid\n", |
1495 | + reg); |
1496 | + return -ENXIO; |
1497 | + } |
1498 | + |
1499 | + return ret & FG_15BIT_VAL_MASK; |
1500 | +} |
1501 | + |
1502 | +static int fuel_gauge_read_12bit_word(struct axp288_fg_info *info, int reg) |
1503 | +{ |
1504 | + unsigned char buf[2]; |
1505 | + int ret; |
1506 | + |
1507 | + ret = regmap_bulk_read(info->regmap, reg, buf, 2); |
1508 | + if (ret < 0) { |
1509 | + dev_err(&info->pdev->dev, "Error reading reg 0x%02x err: %d\n", |
1510 | + reg, ret); |
1511 | + return ret; |
1512 | + } |
1513 | + |
1514 | + /* 12-bit data values have upper 8 bits in buf[0], lower 4 in buf[1] */ |
1515 | + return (buf[0] << 4) | ((buf[1] >> 4) & 0x0f); |
1516 | +} |
1517 | + |
1518 | static int pmic_read_adc_val(const char *name, int *raw_val, |
1519 | struct axp288_fg_info *info) |
1520 | { |
1521 | @@ -249,24 +286,15 @@ static int fuel_gauge_debug_show(struct seq_file *s, void *data) |
1522 | seq_printf(s, " FG_RDC0[%02x] : %02x\n", |
1523 | AXP288_FG_RDC0_REG, |
1524 | fuel_gauge_reg_readb(info, AXP288_FG_RDC0_REG)); |
1525 | - seq_printf(s, " FG_OCVH[%02x] : %02x\n", |
1526 | + seq_printf(s, " FG_OCV[%02x] : %04x\n", |
1527 | AXP288_FG_OCVH_REG, |
1528 | - fuel_gauge_reg_readb(info, AXP288_FG_OCVH_REG)); |
1529 | - seq_printf(s, " FG_OCVL[%02x] : %02x\n", |
1530 | - AXP288_FG_OCVL_REG, |
1531 | - fuel_gauge_reg_readb(info, AXP288_FG_OCVL_REG)); |
1532 | - seq_printf(s, "FG_DES_CAP1[%02x] : %02x\n", |
1533 | + fuel_gauge_read_12bit_word(info, AXP288_FG_OCVH_REG)); |
1534 | + seq_printf(s, " FG_DES_CAP[%02x] : %04x\n", |
1535 | AXP288_FG_DES_CAP1_REG, |
1536 | - fuel_gauge_reg_readb(info, AXP288_FG_DES_CAP1_REG)); |
1537 | - seq_printf(s, "FG_DES_CAP0[%02x] : %02x\n", |
1538 | - AXP288_FG_DES_CAP0_REG, |
1539 | - fuel_gauge_reg_readb(info, AXP288_FG_DES_CAP0_REG)); |
1540 | - seq_printf(s, " FG_CC_MTR1[%02x] : %02x\n", |
1541 | + fuel_gauge_read_15bit_word(info, AXP288_FG_DES_CAP1_REG)); |
1542 | + seq_printf(s, " FG_CC_MTR[%02x] : %04x\n", |
1543 | AXP288_FG_CC_MTR1_REG, |
1544 | - fuel_gauge_reg_readb(info, AXP288_FG_CC_MTR1_REG)); |
1545 | - seq_printf(s, " FG_CC_MTR0[%02x] : %02x\n", |
1546 | - AXP288_FG_CC_MTR0_REG, |
1547 | - fuel_gauge_reg_readb(info, AXP288_FG_CC_MTR0_REG)); |
1548 | + fuel_gauge_read_15bit_word(info, AXP288_FG_CC_MTR1_REG)); |
1549 | seq_printf(s, " FG_OCV_CAP[%02x] : %02x\n", |
1550 | AXP288_FG_OCV_CAP_REG, |
1551 | fuel_gauge_reg_readb(info, AXP288_FG_OCV_CAP_REG)); |
1552 | @@ -517,21 +545,12 @@ static int fuel_gauge_get_btemp(struct axp288_fg_info *info, int *btemp) |
1553 | |
1554 | static int fuel_gauge_get_vocv(struct axp288_fg_info *info, int *vocv) |
1555 | { |
1556 | - int ret, value; |
1557 | - |
1558 | - /* 12-bit data value, upper 8 in OCVH, lower 4 in OCVL */ |
1559 | - ret = fuel_gauge_reg_readb(info, AXP288_FG_OCVH_REG); |
1560 | - if (ret < 0) |
1561 | - goto vocv_read_fail; |
1562 | - value = ret << 4; |
1563 | + int ret; |
1564 | |
1565 | - ret = fuel_gauge_reg_readb(info, AXP288_FG_OCVL_REG); |
1566 | - if (ret < 0) |
1567 | - goto vocv_read_fail; |
1568 | - value |= (ret & 0xf); |
1569 | + ret = fuel_gauge_read_12bit_word(info, AXP288_FG_OCVH_REG); |
1570 | + if (ret >= 0) |
1571 | + *vocv = VOLTAGE_FROM_ADC(ret); |
1572 | |
1573 | - *vocv = VOLTAGE_FROM_ADC(value); |
1574 | -vocv_read_fail: |
1575 | return ret; |
1576 | } |
1577 | |
1578 | @@ -663,28 +682,18 @@ static int fuel_gauge_get_property(struct power_supply *ps, |
1579 | val->intval = POWER_SUPPLY_TECHNOLOGY_LION; |
1580 | break; |
1581 | case POWER_SUPPLY_PROP_CHARGE_NOW: |
1582 | - ret = fuel_gauge_reg_readb(info, AXP288_FG_CC_MTR1_REG); |
1583 | + ret = fuel_gauge_read_15bit_word(info, AXP288_FG_CC_MTR1_REG); |
1584 | if (ret < 0) |
1585 | goto fuel_gauge_read_err; |
1586 | |
1587 | - value = (ret & FG_CC_MTR1_VAL_MASK) << 8; |
1588 | - ret = fuel_gauge_reg_readb(info, AXP288_FG_CC_MTR0_REG); |
1589 | - if (ret < 0) |
1590 | - goto fuel_gauge_read_err; |
1591 | - value |= (ret & FG_CC_MTR0_VAL_MASK); |
1592 | - val->intval = value * FG_DES_CAP_RES_LSB; |
1593 | + val->intval = ret * FG_DES_CAP_RES_LSB; |
1594 | break; |
1595 | case POWER_SUPPLY_PROP_CHARGE_FULL: |
1596 | - ret = fuel_gauge_reg_readb(info, AXP288_FG_DES_CAP1_REG); |
1597 | + ret = fuel_gauge_read_15bit_word(info, AXP288_FG_DES_CAP1_REG); |
1598 | if (ret < 0) |
1599 | goto fuel_gauge_read_err; |
1600 | |
1601 | - value = (ret & FG_DES_CAP1_VAL_MASK) << 8; |
1602 | - ret = fuel_gauge_reg_readb(info, AXP288_FG_DES_CAP0_REG); |
1603 | - if (ret < 0) |
1604 | - goto fuel_gauge_read_err; |
1605 | - value |= (ret & FG_DES_CAP0_VAL_MASK); |
1606 | - val->intval = value * FG_DES_CAP_RES_LSB; |
1607 | + val->intval = ret * FG_DES_CAP_RES_LSB; |
1608 | break; |
1609 | case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN: |
1610 | val->intval = PROP_CURR(info->pdata->design_cap); |
1611 | diff --git a/drivers/rtc/rtc-rx8010.c b/drivers/rtc/rtc-rx8010.c |
1612 | index 7163b91bb773..d08da371912c 100644 |
1613 | --- a/drivers/rtc/rtc-rx8010.c |
1614 | +++ b/drivers/rtc/rtc-rx8010.c |
1615 | @@ -63,7 +63,6 @@ struct rx8010_data { |
1616 | struct i2c_client *client; |
1617 | struct rtc_device *rtc; |
1618 | u8 ctrlreg; |
1619 | - spinlock_t flags_lock; |
1620 | }; |
1621 | |
1622 | static irqreturn_t rx8010_irq_1_handler(int irq, void *dev_id) |
1623 | @@ -72,12 +71,12 @@ static irqreturn_t rx8010_irq_1_handler(int irq, void *dev_id) |
1624 | struct rx8010_data *rx8010 = i2c_get_clientdata(client); |
1625 | int flagreg; |
1626 | |
1627 | - spin_lock(&rx8010->flags_lock); |
1628 | + mutex_lock(&rx8010->rtc->ops_lock); |
1629 | |
1630 | flagreg = i2c_smbus_read_byte_data(client, RX8010_FLAG); |
1631 | |
1632 | if (flagreg <= 0) { |
1633 | - spin_unlock(&rx8010->flags_lock); |
1634 | + mutex_unlock(&rx8010->rtc->ops_lock); |
1635 | return IRQ_NONE; |
1636 | } |
1637 | |
1638 | @@ -101,7 +100,7 @@ static irqreturn_t rx8010_irq_1_handler(int irq, void *dev_id) |
1639 | |
1640 | i2c_smbus_write_byte_data(client, RX8010_FLAG, flagreg); |
1641 | |
1642 | - spin_unlock(&rx8010->flags_lock); |
1643 | + mutex_unlock(&rx8010->rtc->ops_lock); |
1644 | return IRQ_HANDLED; |
1645 | } |
1646 | |
1647 | @@ -143,7 +142,6 @@ static int rx8010_set_time(struct device *dev, struct rtc_time *dt) |
1648 | u8 date[7]; |
1649 | int ctrl, flagreg; |
1650 | int ret; |
1651 | - unsigned long irqflags; |
1652 | |
1653 | if ((dt->tm_year < 100) || (dt->tm_year > 199)) |
1654 | return -EINVAL; |
1655 | @@ -181,11 +179,8 @@ static int rx8010_set_time(struct device *dev, struct rtc_time *dt) |
1656 | if (ret < 0) |
1657 | return ret; |
1658 | |
1659 | - spin_lock_irqsave(&rx8010->flags_lock, irqflags); |
1660 | - |
1661 | flagreg = i2c_smbus_read_byte_data(rx8010->client, RX8010_FLAG); |
1662 | if (flagreg < 0) { |
1663 | - spin_unlock_irqrestore(&rx8010->flags_lock, irqflags); |
1664 | return flagreg; |
1665 | } |
1666 | |
1667 | @@ -193,8 +188,6 @@ static int rx8010_set_time(struct device *dev, struct rtc_time *dt) |
1668 | ret = i2c_smbus_write_byte_data(rx8010->client, RX8010_FLAG, |
1669 | flagreg & ~RX8010_FLAG_VLF); |
1670 | |
1671 | - spin_unlock_irqrestore(&rx8010->flags_lock, irqflags); |
1672 | - |
1673 | return 0; |
1674 | } |
1675 | |
1676 | @@ -288,12 +281,9 @@ static int rx8010_set_alarm(struct device *dev, struct rtc_wkalrm *t) |
1677 | u8 alarmvals[3]; |
1678 | int extreg, flagreg; |
1679 | int err; |
1680 | - unsigned long irqflags; |
1681 | |
1682 | - spin_lock_irqsave(&rx8010->flags_lock, irqflags); |
1683 | flagreg = i2c_smbus_read_byte_data(client, RX8010_FLAG); |
1684 | if (flagreg < 0) { |
1685 | - spin_unlock_irqrestore(&rx8010->flags_lock, irqflags); |
1686 | return flagreg; |
1687 | } |
1688 | |
1689 | @@ -302,14 +292,12 @@ static int rx8010_set_alarm(struct device *dev, struct rtc_wkalrm *t) |
1690 | err = i2c_smbus_write_byte_data(rx8010->client, RX8010_CTRL, |
1691 | rx8010->ctrlreg); |
1692 | if (err < 0) { |
1693 | - spin_unlock_irqrestore(&rx8010->flags_lock, irqflags); |
1694 | return err; |
1695 | } |
1696 | } |
1697 | |
1698 | flagreg &= ~RX8010_FLAG_AF; |
1699 | err = i2c_smbus_write_byte_data(rx8010->client, RX8010_FLAG, flagreg); |
1700 | - spin_unlock_irqrestore(&rx8010->flags_lock, irqflags); |
1701 | if (err < 0) |
1702 | return err; |
1703 | |
1704 | @@ -404,7 +392,6 @@ static int rx8010_ioctl(struct device *dev, unsigned int cmd, unsigned long arg) |
1705 | struct rx8010_data *rx8010 = dev_get_drvdata(dev); |
1706 | int ret, tmp; |
1707 | int flagreg; |
1708 | - unsigned long irqflags; |
1709 | |
1710 | switch (cmd) { |
1711 | case RTC_VL_READ: |
1712 | @@ -419,16 +406,13 @@ static int rx8010_ioctl(struct device *dev, unsigned int cmd, unsigned long arg) |
1713 | return 0; |
1714 | |
1715 | case RTC_VL_CLR: |
1716 | - spin_lock_irqsave(&rx8010->flags_lock, irqflags); |
1717 | flagreg = i2c_smbus_read_byte_data(rx8010->client, RX8010_FLAG); |
1718 | if (flagreg < 0) { |
1719 | - spin_unlock_irqrestore(&rx8010->flags_lock, irqflags); |
1720 | return flagreg; |
1721 | } |
1722 | |
1723 | flagreg &= ~RX8010_FLAG_VLF; |
1724 | ret = i2c_smbus_write_byte_data(client, RX8010_FLAG, flagreg); |
1725 | - spin_unlock_irqrestore(&rx8010->flags_lock, irqflags); |
1726 | if (ret < 0) |
1727 | return ret; |
1728 | |
1729 | @@ -466,8 +450,6 @@ static int rx8010_probe(struct i2c_client *client, |
1730 | rx8010->client = client; |
1731 | i2c_set_clientdata(client, rx8010); |
1732 | |
1733 | - spin_lock_init(&rx8010->flags_lock); |
1734 | - |
1735 | err = rx8010_init_client(client); |
1736 | if (err) |
1737 | return err; |
1738 | diff --git a/drivers/scsi/lpfc/lpfc_attr.c b/drivers/scsi/lpfc/lpfc_attr.c |
1739 | index f1019908800e..453299095847 100644 |
1740 | --- a/drivers/scsi/lpfc/lpfc_attr.c |
1741 | +++ b/drivers/scsi/lpfc/lpfc_attr.c |
1742 | @@ -5130,6 +5130,19 @@ lpfc_free_sysfs_attr(struct lpfc_vport *vport) |
1743 | * Dynamic FC Host Attributes Support |
1744 | */ |
1745 | |
1746 | +/** |
1747 | + * lpfc_get_host_symbolic_name - Copy symbolic name into the scsi host |
1748 | + * @shost: kernel scsi host pointer. |
1749 | + **/ |
1750 | +static void |
1751 | +lpfc_get_host_symbolic_name(struct Scsi_Host *shost) |
1752 | +{ |
1753 | + struct lpfc_vport *vport = (struct lpfc_vport *)shost->hostdata; |
1754 | + |
1755 | + lpfc_vport_symbolic_node_name(vport, fc_host_symbolic_name(shost), |
1756 | + sizeof fc_host_symbolic_name(shost)); |
1757 | +} |
1758 | + |
1759 | /** |
1760 | * lpfc_get_host_port_id - Copy the vport DID into the scsi host port id |
1761 | * @shost: kernel scsi host pointer. |
1762 | @@ -5667,6 +5680,8 @@ struct fc_function_template lpfc_transport_functions = { |
1763 | .show_host_supported_fc4s = 1, |
1764 | .show_host_supported_speeds = 1, |
1765 | .show_host_maxframe_size = 1, |
1766 | + |
1767 | + .get_host_symbolic_name = lpfc_get_host_symbolic_name, |
1768 | .show_host_symbolic_name = 1, |
1769 | |
1770 | /* dynamic attributes the driver supports */ |
1771 | @@ -5734,6 +5749,8 @@ struct fc_function_template lpfc_vport_transport_functions = { |
1772 | .show_host_supported_fc4s = 1, |
1773 | .show_host_supported_speeds = 1, |
1774 | .show_host_maxframe_size = 1, |
1775 | + |
1776 | + .get_host_symbolic_name = lpfc_get_host_symbolic_name, |
1777 | .show_host_symbolic_name = 1, |
1778 | |
1779 | /* dynamic attributes the driver supports */ |
1780 | diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c |
1781 | index 7b696d108112..4df3cdcf88ce 100644 |
1782 | --- a/drivers/scsi/lpfc/lpfc_els.c |
1783 | +++ b/drivers/scsi/lpfc/lpfc_els.c |
1784 | @@ -1999,6 +1999,9 @@ lpfc_issue_els_plogi(struct lpfc_vport *vport, uint32_t did, uint8_t retry) |
1785 | if (sp->cmn.fcphHigh < FC_PH3) |
1786 | sp->cmn.fcphHigh = FC_PH3; |
1787 | |
1788 | + sp->cmn.valid_vendor_ver_level = 0; |
1789 | + memset(sp->vendorVersion, 0, sizeof(sp->vendorVersion)); |
1790 | + |
1791 | lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD, |
1792 | "Issue PLOGI: did:x%x", |
1793 | did, 0, 0); |
1794 | @@ -3990,6 +3993,9 @@ lpfc_els_rsp_acc(struct lpfc_vport *vport, uint32_t flag, |
1795 | } else { |
1796 | memcpy(pcmd, &vport->fc_sparam, |
1797 | sizeof(struct serv_parm)); |
1798 | + |
1799 | + sp->cmn.valid_vendor_ver_level = 0; |
1800 | + memset(sp->vendorVersion, 0, sizeof(sp->vendorVersion)); |
1801 | } |
1802 | |
1803 | lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP, |
1804 | diff --git a/drivers/scsi/lpfc/lpfc_hw.h b/drivers/scsi/lpfc/lpfc_hw.h |
1805 | index 822654322e67..3b970d370600 100644 |
1806 | --- a/drivers/scsi/lpfc/lpfc_hw.h |
1807 | +++ b/drivers/scsi/lpfc/lpfc_hw.h |
1808 | @@ -360,6 +360,12 @@ struct csp { |
1809 | * Word 1 Bit 30 in PLOGI request is random offset |
1810 | */ |
1811 | #define virtual_fabric_support randomOffset /* Word 1, bit 30 */ |
1812 | +/* |
1813 | + * Word 1 Bit 29 in common service parameter is overloaded. |
1814 | + * Word 1 Bit 29 in FLOGI response is multiple NPort assignment |
1815 | + * Word 1 Bit 29 in FLOGI/PLOGI request is Valid Vendor Version Level |
1816 | + */ |
1817 | +#define valid_vendor_ver_level response_multiple_NPort /* Word 1, bit 29 */ |
1818 | #ifdef __BIG_ENDIAN_BITFIELD |
1819 | uint16_t request_multiple_Nport:1; /* FC Word 1, bit 31 */ |
1820 | uint16_t randomOffset:1; /* FC Word 1, bit 30 */ |
1821 | diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c |
1822 | index 2d4f4b58dcfa..8f1df76a77b6 100644 |
1823 | --- a/drivers/scsi/lpfc/lpfc_sli.c |
1824 | +++ b/drivers/scsi/lpfc/lpfc_sli.c |
1825 | @@ -119,6 +119,8 @@ lpfc_sli4_wq_put(struct lpfc_queue *q, union lpfc_wqe *wqe) |
1826 | if (q->phba->sli3_options & LPFC_SLI4_PHWQ_ENABLED) |
1827 | bf_set(wqe_wqid, &wqe->generic.wqe_com, q->queue_id); |
1828 | lpfc_sli_pcimem_bcopy(wqe, temp_wqe, q->entry_size); |
1829 | + /* ensure WQE bcopy flushed before doorbell write */ |
1830 | + wmb(); |
1831 | |
1832 | /* Update the host index before invoking device */ |
1833 | host_index = q->host_index; |
1834 | @@ -10004,6 +10006,7 @@ lpfc_sli_abort_iotag_issue(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, |
1835 | iabt->ulpCommand = CMD_CLOSE_XRI_CN; |
1836 | |
1837 | abtsiocbp->iocb_cmpl = lpfc_sli_abort_els_cmpl; |
1838 | + abtsiocbp->vport = vport; |
1839 | |
1840 | lpfc_printf_vlog(vport, KERN_INFO, LOG_SLI, |
1841 | "0339 Abort xri x%x, original iotag x%x, " |
1842 | diff --git a/drivers/scsi/lpfc/lpfc_vport.c b/drivers/scsi/lpfc/lpfc_vport.c |
1843 | index c27f4b724547..e18bbc66e83b 100644 |
1844 | --- a/drivers/scsi/lpfc/lpfc_vport.c |
1845 | +++ b/drivers/scsi/lpfc/lpfc_vport.c |
1846 | @@ -537,6 +537,12 @@ enable_vport(struct fc_vport *fc_vport) |
1847 | |
1848 | spin_lock_irq(shost->host_lock); |
1849 | vport->load_flag |= FC_LOADING; |
1850 | + if (vport->fc_flag & FC_VPORT_NEEDS_INIT_VPI) { |
1851 | + spin_unlock_irq(shost->host_lock); |
1852 | + lpfc_issue_init_vpi(vport); |
1853 | + goto out; |
1854 | + } |
1855 | + |
1856 | vport->fc_flag |= FC_VPORT_NEEDS_REG_VPI; |
1857 | spin_unlock_irq(shost->host_lock); |
1858 | |
1859 | @@ -557,6 +563,8 @@ enable_vport(struct fc_vport *fc_vport) |
1860 | } else { |
1861 | lpfc_vport_set_state(vport, FC_VPORT_FAILED); |
1862 | } |
1863 | + |
1864 | +out: |
1865 | lpfc_printf_vlog(vport, KERN_ERR, LOG_VPORT, |
1866 | "1827 Vport Enabled.\n"); |
1867 | return VPORT_OK; |
1868 | diff --git a/drivers/scsi/ufs/ufs-qcom.c b/drivers/scsi/ufs/ufs-qcom.c |
1869 | index 462bf42dd19c..51d559214db6 100644 |
1870 | --- a/drivers/scsi/ufs/ufs-qcom.c |
1871 | +++ b/drivers/scsi/ufs/ufs-qcom.c |
1872 | @@ -1689,6 +1689,7 @@ static const struct of_device_id ufs_qcom_of_match[] = { |
1873 | { .compatible = "qcom,ufshc"}, |
1874 | {}, |
1875 | }; |
1876 | +MODULE_DEVICE_TABLE(of, ufs_qcom_of_match); |
1877 | |
1878 | static const struct dev_pm_ops ufs_qcom_pm_ops = { |
1879 | .suspend = ufshcd_pltfrm_suspend, |
1880 | diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c |
1881 | index edb06e466224..530034bc2d13 100644 |
1882 | --- a/drivers/scsi/ufs/ufshcd.c |
1883 | +++ b/drivers/scsi/ufs/ufshcd.c |
1884 | @@ -3781,18 +3781,25 @@ static int ufshcd_disable_auto_bkops(struct ufs_hba *hba) |
1885 | } |
1886 | |
1887 | /** |
1888 | - * ufshcd_force_reset_auto_bkops - force enable of auto bkops |
1889 | + * ufshcd_force_reset_auto_bkops - force reset auto bkops state |
1890 | * @hba: per adapter instance |
1891 | * |
1892 | * After a device reset the device may toggle the BKOPS_EN flag |
1893 | * to default value. The s/w tracking variables should be updated |
1894 | - * as well. Do this by forcing enable of auto bkops. |
1895 | + * as well. This function would change the auto-bkops state based on |
1896 | + * UFSHCD_CAP_KEEP_AUTO_BKOPS_ENABLED_EXCEPT_SUSPEND. |
1897 | */ |
1898 | -static void ufshcd_force_reset_auto_bkops(struct ufs_hba *hba) |
1899 | +static void ufshcd_force_reset_auto_bkops(struct ufs_hba *hba) |
1900 | { |
1901 | - hba->auto_bkops_enabled = false; |
1902 | - hba->ee_ctrl_mask |= MASK_EE_URGENT_BKOPS; |
1903 | - ufshcd_enable_auto_bkops(hba); |
1904 | + if (ufshcd_keep_autobkops_enabled_except_suspend(hba)) { |
1905 | + hba->auto_bkops_enabled = false; |
1906 | + hba->ee_ctrl_mask |= MASK_EE_URGENT_BKOPS; |
1907 | + ufshcd_enable_auto_bkops(hba); |
1908 | + } else { |
1909 | + hba->auto_bkops_enabled = true; |
1910 | + hba->ee_ctrl_mask &= ~MASK_EE_URGENT_BKOPS; |
1911 | + ufshcd_disable_auto_bkops(hba); |
1912 | + } |
1913 | } |
1914 | |
1915 | static inline int ufshcd_get_bkops_status(struct ufs_hba *hba, u32 *status) |
1916 | @@ -6138,11 +6145,15 @@ static int ufshcd_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op) |
1917 | goto set_old_link_state; |
1918 | } |
1919 | |
1920 | - /* |
1921 | - * If BKOPs operations are urgently needed at this moment then |
1922 | - * keep auto-bkops enabled or else disable it. |
1923 | - */ |
1924 | - ufshcd_urgent_bkops(hba); |
1925 | + if (ufshcd_keep_autobkops_enabled_except_suspend(hba)) |
1926 | + ufshcd_enable_auto_bkops(hba); |
1927 | + else |
1928 | + /* |
1929 | + * If BKOPs operations are urgently needed at this moment then |
1930 | + * keep auto-bkops enabled or else disable it. |
1931 | + */ |
1932 | + ufshcd_urgent_bkops(hba); |
1933 | + |
1934 | hba->clk_gating.is_suspended = false; |
1935 | |
1936 | if (ufshcd_is_clkscaling_enabled(hba)) |
1937 | diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h |
1938 | index 04509827fe64..f2170d5058a8 100644 |
1939 | --- a/drivers/scsi/ufs/ufshcd.h |
1940 | +++ b/drivers/scsi/ufs/ufshcd.h |
1941 | @@ -548,6 +548,14 @@ struct ufs_hba { |
1942 | * CAUTION: Enabling this might reduce overall UFS throughput. |
1943 | */ |
1944 | #define UFSHCD_CAP_INTR_AGGR (1 << 4) |
1945 | + /* |
1946 | + * This capability allows the device auto-bkops to be always enabled |
1947 | + * except during suspend (both runtime and suspend). |
1948 | + * Enabling this capability means that device will always be allowed |
1949 | + * to do background operation when it's active but it might degrade |
1950 | + * the performance of ongoing read/write operations. |
1951 | + */ |
1952 | +#define UFSHCD_CAP_KEEP_AUTO_BKOPS_ENABLED_EXCEPT_SUSPEND (1 << 5) |
1953 | |
1954 | struct devfreq *devfreq; |
1955 | struct ufs_clk_scaling clk_scaling; |
1956 | @@ -645,6 +653,11 @@ static inline void *ufshcd_get_variant(struct ufs_hba *hba) |
1957 | BUG_ON(!hba); |
1958 | return hba->priv; |
1959 | } |
1960 | +static inline bool ufshcd_keep_autobkops_enabled_except_suspend( |
1961 | + struct ufs_hba *hba) |
1962 | +{ |
1963 | + return hba->caps & UFSHCD_CAP_KEEP_AUTO_BKOPS_ENABLED_EXCEPT_SUSPEND; |
1964 | +} |
1965 | |
1966 | extern int ufshcd_runtime_suspend(struct ufs_hba *hba); |
1967 | extern int ufshcd_runtime_resume(struct ufs_hba *hba); |
1968 | diff --git a/drivers/staging/greybus/connection.c b/drivers/staging/greybus/connection.c |
1969 | index 557075147f2d..1bf0ee403106 100644 |
1970 | --- a/drivers/staging/greybus/connection.c |
1971 | +++ b/drivers/staging/greybus/connection.c |
1972 | @@ -357,6 +357,9 @@ static int gb_connection_hd_cport_quiesce(struct gb_connection *connection) |
1973 | size_t peer_space; |
1974 | int ret; |
1975 | |
1976 | + if (!hd->driver->cport_quiesce) |
1977 | + return 0; |
1978 | + |
1979 | peer_space = sizeof(struct gb_operation_msg_hdr) + |
1980 | sizeof(struct gb_cport_shutdown_request); |
1981 | |
1982 | @@ -380,6 +383,9 @@ static int gb_connection_hd_cport_clear(struct gb_connection *connection) |
1983 | struct gb_host_device *hd = connection->hd; |
1984 | int ret; |
1985 | |
1986 | + if (!hd->driver->cport_clear) |
1987 | + return 0; |
1988 | + |
1989 | ret = hd->driver->cport_clear(hd, connection->hd_cport_id); |
1990 | if (ret) { |
1991 | dev_err(&hd->dev, "%s: failed to clear host cport: %d\n", |
1992 | diff --git a/drivers/staging/greybus/spilib.c b/drivers/staging/greybus/spilib.c |
1993 | index e97b19148497..1e7321a1404c 100644 |
1994 | --- a/drivers/staging/greybus/spilib.c |
1995 | +++ b/drivers/staging/greybus/spilib.c |
1996 | @@ -544,11 +544,14 @@ int gb_spilib_master_init(struct gb_connection *connection, struct device *dev, |
1997 | |
1998 | return 0; |
1999 | |
2000 | -exit_spi_unregister: |
2001 | - spi_unregister_master(master); |
2002 | exit_spi_put: |
2003 | spi_master_put(master); |
2004 | |
2005 | + return ret; |
2006 | + |
2007 | +exit_spi_unregister: |
2008 | + spi_unregister_master(master); |
2009 | + |
2010 | return ret; |
2011 | } |
2012 | EXPORT_SYMBOL_GPL(gb_spilib_master_init); |
2013 | @@ -558,7 +561,6 @@ void gb_spilib_master_exit(struct gb_connection *connection) |
2014 | struct spi_master *master = gb_connection_get_data(connection); |
2015 | |
2016 | spi_unregister_master(master); |
2017 | - spi_master_put(master); |
2018 | } |
2019 | EXPORT_SYMBOL_GPL(gb_spilib_master_exit); |
2020 | |
2021 | diff --git a/drivers/staging/rtl8188eu/include/rtw_debug.h b/drivers/staging/rtl8188eu/include/rtw_debug.h |
2022 | index 95590a1a7b1b..9cc4b8c7c166 100644 |
2023 | --- a/drivers/staging/rtl8188eu/include/rtw_debug.h |
2024 | +++ b/drivers/staging/rtl8188eu/include/rtw_debug.h |
2025 | @@ -70,7 +70,7 @@ extern u32 GlobalDebugLevel; |
2026 | #define DBG_88E_LEVEL(_level, fmt, arg...) \ |
2027 | do { \ |
2028 | if (_level <= GlobalDebugLevel) \ |
2029 | - pr_info(DRIVER_PREFIX"ERROR " fmt, ##arg); \ |
2030 | + pr_info(DRIVER_PREFIX fmt, ##arg); \ |
2031 | } while (0) |
2032 | |
2033 | #define DBG_88E(...) \ |
2034 | diff --git a/drivers/staging/rtl8712/rtl871x_ioctl_linux.c b/drivers/staging/rtl8712/rtl871x_ioctl_linux.c |
2035 | index 475e7904fe45..2d26f9a30fcf 100644 |
2036 | --- a/drivers/staging/rtl8712/rtl871x_ioctl_linux.c |
2037 | +++ b/drivers/staging/rtl8712/rtl871x_ioctl_linux.c |
2038 | @@ -199,7 +199,7 @@ static noinline_for_stack char *translate_scan(struct _adapter *padapter, |
2039 | iwe.cmd = SIOCGIWMODE; |
2040 | memcpy((u8 *)&cap, r8712_get_capability_from_ie(pnetwork->network.IEs), |
2041 | 2); |
2042 | - cap = le16_to_cpu(cap); |
2043 | + le16_to_cpus(&cap); |
2044 | if (cap & (WLAN_CAPABILITY_IBSS | WLAN_CAPABILITY_BSS)) { |
2045 | if (cap & WLAN_CAPABILITY_BSS) |
2046 | iwe.u.mode = (u32)IW_MODE_MASTER; |
2047 | diff --git a/drivers/staging/wilc1000/linux_wlan.c b/drivers/staging/wilc1000/linux_wlan.c |
2048 | index defffa75ae1c..07d6e4824a9d 100644 |
2049 | --- a/drivers/staging/wilc1000/linux_wlan.c |
2050 | +++ b/drivers/staging/wilc1000/linux_wlan.c |
2051 | @@ -1001,7 +1001,7 @@ int wilc_mac_xmit(struct sk_buff *skb, struct net_device *ndev) |
2052 | tx_data->skb = skb; |
2053 | |
2054 | eth_h = (struct ethhdr *)(skb->data); |
2055 | - if (eth_h->h_proto == 0x8e88) |
2056 | + if (eth_h->h_proto == cpu_to_be16(0x8e88)) |
2057 | netdev_dbg(ndev, "EAPOL transmitted\n"); |
2058 | |
2059 | ih = (struct iphdr *)(skb->data + sizeof(struct ethhdr)); |
2060 | diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c |
2061 | index c8075eb3db26..fa619354c5c5 100644 |
2062 | --- a/drivers/usb/core/devio.c |
2063 | +++ b/drivers/usb/core/devio.c |
2064 | @@ -1838,6 +1838,18 @@ static int proc_unlinkurb(struct usb_dev_state *ps, void __user *arg) |
2065 | return 0; |
2066 | } |
2067 | |
2068 | +static void compute_isochronous_actual_length(struct urb *urb) |
2069 | +{ |
2070 | + unsigned int i; |
2071 | + |
2072 | + if (urb->number_of_packets > 0) { |
2073 | + urb->actual_length = 0; |
2074 | + for (i = 0; i < urb->number_of_packets; i++) |
2075 | + urb->actual_length += |
2076 | + urb->iso_frame_desc[i].actual_length; |
2077 | + } |
2078 | +} |
2079 | + |
2080 | static int processcompl(struct async *as, void __user * __user *arg) |
2081 | { |
2082 | struct urb *urb = as->urb; |
2083 | @@ -1845,6 +1857,7 @@ static int processcompl(struct async *as, void __user * __user *arg) |
2084 | void __user *addr = as->userurb; |
2085 | unsigned int i; |
2086 | |
2087 | + compute_isochronous_actual_length(urb); |
2088 | if (as->userbuffer && urb->actual_length) { |
2089 | if (copy_urb_data_to_user(as->userbuffer, urb)) |
2090 | goto err_out; |
2091 | @@ -2019,6 +2032,7 @@ static int processcompl_compat(struct async *as, void __user * __user *arg) |
2092 | void __user *addr = as->userurb; |
2093 | unsigned int i; |
2094 | |
2095 | + compute_isochronous_actual_length(urb); |
2096 | if (as->userbuffer && urb->actual_length) { |
2097 | if (copy_urb_data_to_user(as->userbuffer, urb)) |
2098 | return -EFAULT; |
2099 | diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c |
2100 | index a6aaf2f193a4..37c418e581fb 100644 |
2101 | --- a/drivers/usb/core/quirks.c |
2102 | +++ b/drivers/usb/core/quirks.c |
2103 | @@ -221,6 +221,9 @@ static const struct usb_device_id usb_quirk_list[] = { |
2104 | /* Corsair Strafe RGB */ |
2105 | { USB_DEVICE(0x1b1c, 0x1b20), .driver_info = USB_QUIRK_DELAY_INIT }, |
2106 | |
2107 | + /* Corsair K70 LUX */ |
2108 | + { USB_DEVICE(0x1b1c, 0x1b36), .driver_info = USB_QUIRK_DELAY_INIT }, |
2109 | + |
2110 | /* MIDI keyboard WORLDE MINI */ |
2111 | { USB_DEVICE(0x1c75, 0x0204), .driver_info = |
2112 | USB_QUIRK_CONFIG_INTF_STRINGS }, |
2113 | diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c |
2114 | index f9c99803a43d..273320fa30ae 100644 |
2115 | --- a/drivers/usb/gadget/function/f_fs.c |
2116 | +++ b/drivers/usb/gadget/function/f_fs.c |
2117 | @@ -3698,6 +3698,7 @@ static void ffs_closed(struct ffs_data *ffs) |
2118 | goto done; |
2119 | |
2120 | ffs_obj->desc_ready = false; |
2121 | + ffs_obj->ffs_data = NULL; |
2122 | |
2123 | if (test_and_clear_bit(FFS_FL_CALL_CLOSED_CALLBACK, &ffs->flags) && |
2124 | ffs_obj->ffs_closed_callback) |
2125 | diff --git a/drivers/usb/serial/garmin_gps.c b/drivers/usb/serial/garmin_gps.c |
2126 | index b2f2e87aed94..91e7e3a166a5 100644 |
2127 | --- a/drivers/usb/serial/garmin_gps.c |
2128 | +++ b/drivers/usb/serial/garmin_gps.c |
2129 | @@ -138,6 +138,7 @@ struct garmin_data { |
2130 | __u8 privpkt[4*6]; |
2131 | spinlock_t lock; |
2132 | struct list_head pktlist; |
2133 | + struct usb_anchor write_urbs; |
2134 | }; |
2135 | |
2136 | |
2137 | @@ -905,13 +906,19 @@ static int garmin_init_session(struct usb_serial_port *port) |
2138 | sizeof(GARMIN_START_SESSION_REQ), 0); |
2139 | |
2140 | if (status < 0) |
2141 | - break; |
2142 | + goto err_kill_urbs; |
2143 | } |
2144 | |
2145 | if (status > 0) |
2146 | status = 0; |
2147 | } |
2148 | |
2149 | + return status; |
2150 | + |
2151 | +err_kill_urbs: |
2152 | + usb_kill_anchored_urbs(&garmin_data_p->write_urbs); |
2153 | + usb_kill_urb(port->interrupt_in_urb); |
2154 | + |
2155 | return status; |
2156 | } |
2157 | |
2158 | @@ -930,7 +937,6 @@ static int garmin_open(struct tty_struct *tty, struct usb_serial_port *port) |
2159 | spin_unlock_irqrestore(&garmin_data_p->lock, flags); |
2160 | |
2161 | /* shutdown any bulk reads that might be going on */ |
2162 | - usb_kill_urb(port->write_urb); |
2163 | usb_kill_urb(port->read_urb); |
2164 | |
2165 | if (garmin_data_p->state == STATE_RESET) |
2166 | @@ -953,7 +959,7 @@ static void garmin_close(struct usb_serial_port *port) |
2167 | |
2168 | /* shutdown our urbs */ |
2169 | usb_kill_urb(port->read_urb); |
2170 | - usb_kill_urb(port->write_urb); |
2171 | + usb_kill_anchored_urbs(&garmin_data_p->write_urbs); |
2172 | |
2173 | /* keep reset state so we know that we must start a new session */ |
2174 | if (garmin_data_p->state != STATE_RESET) |
2175 | @@ -1037,12 +1043,14 @@ static int garmin_write_bulk(struct usb_serial_port *port, |
2176 | } |
2177 | |
2178 | /* send it down the pipe */ |
2179 | + usb_anchor_urb(urb, &garmin_data_p->write_urbs); |
2180 | status = usb_submit_urb(urb, GFP_ATOMIC); |
2181 | if (status) { |
2182 | dev_err(&port->dev, |
2183 | "%s - usb_submit_urb(write bulk) failed with status = %d\n", |
2184 | __func__, status); |
2185 | count = status; |
2186 | + usb_unanchor_urb(urb); |
2187 | kfree(buffer); |
2188 | } |
2189 | |
2190 | @@ -1401,9 +1409,16 @@ static int garmin_port_probe(struct usb_serial_port *port) |
2191 | garmin_data_p->state = 0; |
2192 | garmin_data_p->flags = 0; |
2193 | garmin_data_p->count = 0; |
2194 | + init_usb_anchor(&garmin_data_p->write_urbs); |
2195 | usb_set_serial_port_data(port, garmin_data_p); |
2196 | |
2197 | status = garmin_init_session(port); |
2198 | + if (status) |
2199 | + goto err_free; |
2200 | + |
2201 | + return 0; |
2202 | +err_free: |
2203 | + kfree(garmin_data_p); |
2204 | |
2205 | return status; |
2206 | } |
2207 | @@ -1413,6 +1428,7 @@ static int garmin_port_remove(struct usb_serial_port *port) |
2208 | { |
2209 | struct garmin_data *garmin_data_p = usb_get_serial_port_data(port); |
2210 | |
2211 | + usb_kill_anchored_urbs(&garmin_data_p->write_urbs); |
2212 | usb_kill_urb(port->interrupt_in_urb); |
2213 | del_timer_sync(&garmin_data_p->timer); |
2214 | kfree(garmin_data_p); |
2215 | diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c |
2216 | index e1c1e329c877..4516291df1b8 100644 |
2217 | --- a/drivers/usb/serial/qcserial.c |
2218 | +++ b/drivers/usb/serial/qcserial.c |
2219 | @@ -148,6 +148,7 @@ static const struct usb_device_id id_table[] = { |
2220 | {DEVICE_SWI(0x1199, 0x68a2)}, /* Sierra Wireless MC7710 */ |
2221 | {DEVICE_SWI(0x1199, 0x68c0)}, /* Sierra Wireless MC7304/MC7354 */ |
2222 | {DEVICE_SWI(0x1199, 0x901c)}, /* Sierra Wireless EM7700 */ |
2223 | + {DEVICE_SWI(0x1199, 0x901e)}, /* Sierra Wireless EM7355 QDL */ |
2224 | {DEVICE_SWI(0x1199, 0x901f)}, /* Sierra Wireless EM7355 */ |
2225 | {DEVICE_SWI(0x1199, 0x9040)}, /* Sierra Wireless Modem */ |
2226 | {DEVICE_SWI(0x1199, 0x9041)}, /* Sierra Wireless MC7305/MC7355 */ |
2227 | diff --git a/drivers/video/backlight/adp5520_bl.c b/drivers/video/backlight/adp5520_bl.c |
2228 | index dd88ba1d71ce..35373e2065b2 100644 |
2229 | --- a/drivers/video/backlight/adp5520_bl.c |
2230 | +++ b/drivers/video/backlight/adp5520_bl.c |
2231 | @@ -332,10 +332,18 @@ static int adp5520_bl_probe(struct platform_device *pdev) |
2232 | } |
2233 | |
2234 | platform_set_drvdata(pdev, bl); |
2235 | - ret |= adp5520_bl_setup(bl); |
2236 | + ret = adp5520_bl_setup(bl); |
2237 | + if (ret) { |
2238 | + dev_err(&pdev->dev, "failed to setup\n"); |
2239 | + if (data->pdata->en_ambl_sens) |
2240 | + sysfs_remove_group(&bl->dev.kobj, |
2241 | + &adp5520_bl_attr_group); |
2242 | + return ret; |
2243 | + } |
2244 | + |
2245 | backlight_update_status(bl); |
2246 | |
2247 | - return ret; |
2248 | + return 0; |
2249 | } |
2250 | |
2251 | static int adp5520_bl_remove(struct platform_device *pdev) |
2252 | diff --git a/drivers/video/backlight/lcd.c b/drivers/video/backlight/lcd.c |
2253 | index 7de847df224f..4b40c6a4d441 100644 |
2254 | --- a/drivers/video/backlight/lcd.c |
2255 | +++ b/drivers/video/backlight/lcd.c |
2256 | @@ -226,6 +226,8 @@ struct lcd_device *lcd_device_register(const char *name, struct device *parent, |
2257 | dev_set_name(&new_ld->dev, "%s", name); |
2258 | dev_set_drvdata(&new_ld->dev, devdata); |
2259 | |
2260 | + new_ld->ops = ops; |
2261 | + |
2262 | rc = device_register(&new_ld->dev); |
2263 | if (rc) { |
2264 | put_device(&new_ld->dev); |
2265 | @@ -238,8 +240,6 @@ struct lcd_device *lcd_device_register(const char *name, struct device *parent, |
2266 | return ERR_PTR(rc); |
2267 | } |
2268 | |
2269 | - new_ld->ops = ops; |
2270 | - |
2271 | return new_ld; |
2272 | } |
2273 | EXPORT_SYMBOL(lcd_device_register); |
2274 | diff --git a/include/dt-bindings/pinctrl/omap.h b/include/dt-bindings/pinctrl/omap.h |
2275 | index effadd05695b..fbd6f7202476 100644 |
2276 | --- a/include/dt-bindings/pinctrl/omap.h |
2277 | +++ b/include/dt-bindings/pinctrl/omap.h |
2278 | @@ -45,8 +45,8 @@ |
2279 | #define PIN_OFF_NONE 0 |
2280 | #define PIN_OFF_OUTPUT_HIGH (OFF_EN | OFFOUT_EN | OFFOUT_VAL) |
2281 | #define PIN_OFF_OUTPUT_LOW (OFF_EN | OFFOUT_EN) |
2282 | -#define PIN_OFF_INPUT_PULLUP (OFF_EN | OFF_PULL_EN | OFF_PULL_UP) |
2283 | -#define PIN_OFF_INPUT_PULLDOWN (OFF_EN | OFF_PULL_EN) |
2284 | +#define PIN_OFF_INPUT_PULLUP (OFF_EN | OFFOUT_EN | OFF_PULL_EN | OFF_PULL_UP) |
2285 | +#define PIN_OFF_INPUT_PULLDOWN (OFF_EN | OFFOUT_EN | OFF_PULL_EN) |
2286 | #define PIN_OFF_WAKEUPENABLE WAKEUP_EN |
2287 | |
2288 | /* |
2289 | diff --git a/include/uapi/linux/rds.h b/include/uapi/linux/rds.h |
2290 | index 7af20a136429..804c9b2bfce3 100644 |
2291 | --- a/include/uapi/linux/rds.h |
2292 | +++ b/include/uapi/linux/rds.h |
2293 | @@ -104,8 +104,8 @@ |
2294 | #define RDS_INFO_LAST 10010 |
2295 | |
2296 | struct rds_info_counter { |
2297 | - uint8_t name[32]; |
2298 | - uint64_t value; |
2299 | + __u8 name[32]; |
2300 | + __u64 value; |
2301 | } __attribute__((packed)); |
2302 | |
2303 | #define RDS_INFO_CONNECTION_FLAG_SENDING 0x01 |
2304 | @@ -115,35 +115,35 @@ struct rds_info_counter { |
2305 | #define TRANSNAMSIZ 16 |
2306 | |
2307 | struct rds_info_connection { |
2308 | - uint64_t next_tx_seq; |
2309 | - uint64_t next_rx_seq; |
2310 | + __u64 next_tx_seq; |
2311 | + __u64 next_rx_seq; |
2312 | __be32 laddr; |
2313 | __be32 faddr; |
2314 | - uint8_t transport[TRANSNAMSIZ]; /* null term ascii */ |
2315 | - uint8_t flags; |
2316 | + __u8 transport[TRANSNAMSIZ]; /* null term ascii */ |
2317 | + __u8 flags; |
2318 | } __attribute__((packed)); |
2319 | |
2320 | #define RDS_INFO_MESSAGE_FLAG_ACK 0x01 |
2321 | #define RDS_INFO_MESSAGE_FLAG_FAST_ACK 0x02 |
2322 | |
2323 | struct rds_info_message { |
2324 | - uint64_t seq; |
2325 | - uint32_t len; |
2326 | + __u64 seq; |
2327 | + __u32 len; |
2328 | __be32 laddr; |
2329 | __be32 faddr; |
2330 | __be16 lport; |
2331 | __be16 fport; |
2332 | - uint8_t flags; |
2333 | + __u8 flags; |
2334 | } __attribute__((packed)); |
2335 | |
2336 | struct rds_info_socket { |
2337 | - uint32_t sndbuf; |
2338 | + __u32 sndbuf; |
2339 | __be32 bound_addr; |
2340 | __be32 connected_addr; |
2341 | __be16 bound_port; |
2342 | __be16 connected_port; |
2343 | - uint32_t rcvbuf; |
2344 | - uint64_t inum; |
2345 | + __u32 rcvbuf; |
2346 | + __u64 inum; |
2347 | } __attribute__((packed)); |
2348 | |
2349 | struct rds_info_tcp_socket { |
2350 | @@ -151,25 +151,25 @@ struct rds_info_tcp_socket { |
2351 | __be16 local_port; |
2352 | __be32 peer_addr; |
2353 | __be16 peer_port; |
2354 | - uint64_t hdr_rem; |
2355 | - uint64_t data_rem; |
2356 | - uint32_t last_sent_nxt; |
2357 | - uint32_t last_expected_una; |
2358 | - uint32_t last_seen_una; |
2359 | + __u64 hdr_rem; |
2360 | + __u64 data_rem; |
2361 | + __u32 last_sent_nxt; |
2362 | + __u32 last_expected_una; |
2363 | + __u32 last_seen_una; |
2364 | } __attribute__((packed)); |
2365 | |
2366 | #define RDS_IB_GID_LEN 16 |
2367 | struct rds_info_rdma_connection { |
2368 | __be32 src_addr; |
2369 | __be32 dst_addr; |
2370 | - uint8_t src_gid[RDS_IB_GID_LEN]; |
2371 | - uint8_t dst_gid[RDS_IB_GID_LEN]; |
2372 | + __u8 src_gid[RDS_IB_GID_LEN]; |
2373 | + __u8 dst_gid[RDS_IB_GID_LEN]; |
2374 | |
2375 | - uint32_t max_send_wr; |
2376 | - uint32_t max_recv_wr; |
2377 | - uint32_t max_send_sge; |
2378 | - uint32_t rdma_mr_max; |
2379 | - uint32_t rdma_mr_size; |
2380 | + __u32 max_send_wr; |
2381 | + __u32 max_recv_wr; |
2382 | + __u32 max_send_sge; |
2383 | + __u32 rdma_mr_max; |
2384 | + __u32 rdma_mr_size; |
2385 | }; |
2386 | |
2387 | /* |
2388 | @@ -210,70 +210,70 @@ struct rds_info_rdma_connection { |
2389 | * (so that the application does not have to worry about |
2390 | * alignment). |
2391 | */ |
2392 | -typedef uint64_t rds_rdma_cookie_t; |
2393 | +typedef __u64 rds_rdma_cookie_t; |
2394 | |
2395 | struct rds_iovec { |
2396 | - uint64_t addr; |
2397 | - uint64_t bytes; |
2398 | + __u64 addr; |
2399 | + __u64 bytes; |
2400 | }; |
2401 | |
2402 | struct rds_get_mr_args { |
2403 | struct rds_iovec vec; |
2404 | - uint64_t cookie_addr; |
2405 | - uint64_t flags; |
2406 | + __u64 cookie_addr; |
2407 | + __u64 flags; |
2408 | }; |
2409 | |
2410 | struct rds_get_mr_for_dest_args { |
2411 | struct __kernel_sockaddr_storage dest_addr; |
2412 | struct rds_iovec vec; |
2413 | - uint64_t cookie_addr; |
2414 | - uint64_t flags; |
2415 | + __u64 cookie_addr; |
2416 | + __u64 flags; |
2417 | }; |
2418 | |
2419 | struct rds_free_mr_args { |
2420 | rds_rdma_cookie_t cookie; |
2421 | - uint64_t flags; |
2422 | + __u64 flags; |
2423 | }; |
2424 | |
2425 | struct rds_rdma_args { |
2426 | rds_rdma_cookie_t cookie; |
2427 | struct rds_iovec remote_vec; |
2428 | - uint64_t local_vec_addr; |
2429 | - uint64_t nr_local; |
2430 | - uint64_t flags; |
2431 | - uint64_t user_token; |
2432 | + __u64 local_vec_addr; |
2433 | + __u64 nr_local; |
2434 | + __u64 flags; |
2435 | + __u64 user_token; |
2436 | }; |
2437 | |
2438 | struct rds_atomic_args { |
2439 | rds_rdma_cookie_t cookie; |
2440 | - uint64_t local_addr; |
2441 | - uint64_t remote_addr; |
2442 | + __u64 local_addr; |
2443 | + __u64 remote_addr; |
2444 | union { |
2445 | struct { |
2446 | - uint64_t compare; |
2447 | - uint64_t swap; |
2448 | + __u64 compare; |
2449 | + __u64 swap; |
2450 | } cswp; |
2451 | struct { |
2452 | - uint64_t add; |
2453 | + __u64 add; |
2454 | } fadd; |
2455 | struct { |
2456 | - uint64_t compare; |
2457 | - uint64_t swap; |
2458 | - uint64_t compare_mask; |
2459 | - uint64_t swap_mask; |
2460 | + __u64 compare; |
2461 | + __u64 swap; |
2462 | + __u64 compare_mask; |
2463 | + __u64 swap_mask; |
2464 | } m_cswp; |
2465 | struct { |
2466 | - uint64_t add; |
2467 | - uint64_t nocarry_mask; |
2468 | + __u64 add; |
2469 | + __u64 nocarry_mask; |
2470 | } m_fadd; |
2471 | }; |
2472 | - uint64_t flags; |
2473 | - uint64_t user_token; |
2474 | + __u64 flags; |
2475 | + __u64 user_token; |
2476 | }; |
2477 | |
2478 | struct rds_rdma_notify { |
2479 | - uint64_t user_token; |
2480 | - int32_t status; |
2481 | + __u64 user_token; |
2482 | + __s32 status; |
2483 | }; |
2484 | |
2485 | #define RDS_RDMA_SUCCESS 0 |
2486 | diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c |
2487 | index 6b3d27e50317..dd33c785ce16 100644 |
2488 | --- a/net/ipv4/tcp.c |
2489 | +++ b/net/ipv4/tcp.c |
2490 | @@ -431,7 +431,7 @@ EXPORT_SYMBOL(tcp_init_sock); |
2491 | |
2492 | static void tcp_tx_timestamp(struct sock *sk, u16 tsflags, struct sk_buff *skb) |
2493 | { |
2494 | - if (tsflags) { |
2495 | + if (tsflags && skb) { |
2496 | struct skb_shared_info *shinfo = skb_shinfo(skb); |
2497 | struct tcp_skb_cb *tcb = TCP_SKB_CB(skb); |
2498 | |
2499 | @@ -966,10 +966,8 @@ static ssize_t do_tcp_sendpages(struct sock *sk, struct page *page, int offset, |
2500 | copied += copy; |
2501 | offset += copy; |
2502 | size -= copy; |
2503 | - if (!size) { |
2504 | - tcp_tx_timestamp(sk, sk->sk_tsflags, skb); |
2505 | + if (!size) |
2506 | goto out; |
2507 | - } |
2508 | |
2509 | if (skb->len < size_goal || (flags & MSG_OOB)) |
2510 | continue; |
2511 | @@ -995,8 +993,11 @@ static ssize_t do_tcp_sendpages(struct sock *sk, struct page *page, int offset, |
2512 | } |
2513 | |
2514 | out: |
2515 | - if (copied && !(flags & MSG_SENDPAGE_NOTLAST)) |
2516 | - tcp_push(sk, flags, mss_now, tp->nonagle, size_goal); |
2517 | + if (copied) { |
2518 | + tcp_tx_timestamp(sk, sk->sk_tsflags, tcp_write_queue_tail(sk)); |
2519 | + if (!(flags & MSG_SENDPAGE_NOTLAST)) |
2520 | + tcp_push(sk, flags, mss_now, tp->nonagle, size_goal); |
2521 | + } |
2522 | return copied; |
2523 | |
2524 | do_error: |
2525 | @@ -1289,7 +1290,6 @@ int tcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size) |
2526 | |
2527 | copied += copy; |
2528 | if (!msg_data_left(msg)) { |
2529 | - tcp_tx_timestamp(sk, sockc.tsflags, skb); |
2530 | if (unlikely(flags & MSG_EOR)) |
2531 | TCP_SKB_CB(skb)->eor = 1; |
2532 | goto out; |
2533 | @@ -1320,8 +1320,10 @@ int tcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size) |
2534 | } |
2535 | |
2536 | out: |
2537 | - if (copied) |
2538 | + if (copied) { |
2539 | + tcp_tx_timestamp(sk, sockc.tsflags, tcp_write_queue_tail(sk)); |
2540 | tcp_push(sk, flags, mss_now, tp->nonagle, size_goal); |
2541 | + } |
2542 | out_nopush: |
2543 | release_sock(sk); |
2544 | return copied + copied_syn; |
2545 | diff --git a/sound/drivers/vx/vx_pcm.c b/sound/drivers/vx/vx_pcm.c |
2546 | index 11467272089e..ea7b377f0378 100644 |
2547 | --- a/sound/drivers/vx/vx_pcm.c |
2548 | +++ b/sound/drivers/vx/vx_pcm.c |
2549 | @@ -1015,7 +1015,7 @@ static void vx_pcm_capture_update(struct vx_core *chip, struct snd_pcm_substream |
2550 | int size, space, count; |
2551 | struct snd_pcm_runtime *runtime = subs->runtime; |
2552 | |
2553 | - if (! pipe->prepared || (chip->chip_status & VX_STAT_IS_STALE)) |
2554 | + if (!pipe->running || (chip->chip_status & VX_STAT_IS_STALE)) |
2555 | return; |
2556 | |
2557 | size = runtime->buffer_size - snd_pcm_capture_avail(runtime); |
2558 | @@ -1048,8 +1048,10 @@ static void vx_pcm_capture_update(struct vx_core *chip, struct snd_pcm_substream |
2559 | /* ok, let's accelerate! */ |
2560 | int align = pipe->align * 3; |
2561 | space = (count / align) * align; |
2562 | - vx_pseudo_dma_read(chip, runtime, pipe, space); |
2563 | - count -= space; |
2564 | + if (space > 0) { |
2565 | + vx_pseudo_dma_read(chip, runtime, pipe, space); |
2566 | + count -= space; |
2567 | + } |
2568 | } |
2569 | /* read the rest of bytes */ |
2570 | while (count > 0) { |
2571 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
2572 | index fe1d06d50392..80c40a1b8b65 100644 |
2573 | --- a/sound/pci/hda/patch_realtek.c |
2574 | +++ b/sound/pci/hda/patch_realtek.c |
2575 | @@ -338,6 +338,7 @@ static void alc_fill_eapd_coef(struct hda_codec *codec) |
2576 | case 0x10ec0288: |
2577 | case 0x10ec0295: |
2578 | case 0x10ec0298: |
2579 | + case 0x10ec0299: |
2580 | alc_update_coef_idx(codec, 0x10, 1<<9, 0); |
2581 | break; |
2582 | case 0x10ec0285: |
2583 | @@ -914,6 +915,7 @@ static struct alc_codec_rename_pci_table rename_pci_tbl[] = { |
2584 | { 0x10ec0256, 0x1028, 0, "ALC3246" }, |
2585 | { 0x10ec0225, 0x1028, 0, "ALC3253" }, |
2586 | { 0x10ec0295, 0x1028, 0, "ALC3254" }, |
2587 | + { 0x10ec0299, 0x1028, 0, "ALC3271" }, |
2588 | { 0x10ec0670, 0x1025, 0, "ALC669X" }, |
2589 | { 0x10ec0676, 0x1025, 0, "ALC679X" }, |
2590 | { 0x10ec0282, 0x1043, 0, "ALC3229" }, |
2591 | @@ -3721,6 +3723,7 @@ static void alc_headset_mode_unplugged(struct hda_codec *codec) |
2592 | break; |
2593 | case 0x10ec0225: |
2594 | case 0x10ec0295: |
2595 | + case 0x10ec0299: |
2596 | alc_process_coef_fw(codec, coef0225); |
2597 | break; |
2598 | case 0x10ec0867: |
2599 | @@ -3829,6 +3832,7 @@ static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin, |
2600 | break; |
2601 | case 0x10ec0225: |
2602 | case 0x10ec0295: |
2603 | + case 0x10ec0299: |
2604 | alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x31<<10); |
2605 | snd_hda_set_pin_ctl_cache(codec, hp_pin, 0); |
2606 | alc_process_coef_fw(codec, coef0225); |
2607 | @@ -3887,6 +3891,7 @@ static void alc_headset_mode_default(struct hda_codec *codec) |
2608 | switch (codec->core.vendor_id) { |
2609 | case 0x10ec0225: |
2610 | case 0x10ec0295: |
2611 | + case 0x10ec0299: |
2612 | alc_process_coef_fw(codec, coef0225); |
2613 | break; |
2614 | case 0x10ec0236: |
2615 | @@ -4004,6 +4009,7 @@ static void alc_headset_mode_ctia(struct hda_codec *codec) |
2616 | break; |
2617 | case 0x10ec0225: |
2618 | case 0x10ec0295: |
2619 | + case 0x10ec0299: |
2620 | alc_process_coef_fw(codec, coef0225); |
2621 | break; |
2622 | case 0x10ec0867: |
2623 | @@ -4098,6 +4104,7 @@ static void alc_headset_mode_omtp(struct hda_codec *codec) |
2624 | break; |
2625 | case 0x10ec0225: |
2626 | case 0x10ec0295: |
2627 | + case 0x10ec0299: |
2628 | alc_process_coef_fw(codec, coef0225); |
2629 | break; |
2630 | } |
2631 | @@ -4183,6 +4190,7 @@ static void alc_determine_headset_type(struct hda_codec *codec) |
2632 | break; |
2633 | case 0x10ec0225: |
2634 | case 0x10ec0295: |
2635 | + case 0x10ec0299: |
2636 | alc_process_coef_fw(codec, coef0225); |
2637 | msleep(800); |
2638 | val = alc_read_coef_idx(codec, 0x46); |
2639 | @@ -6251,6 +6259,7 @@ static int patch_alc269(struct hda_codec *codec) |
2640 | break; |
2641 | case 0x10ec0225: |
2642 | case 0x10ec0295: |
2643 | + case 0x10ec0299: |
2644 | spec->codec_variant = ALC269_TYPE_ALC225; |
2645 | break; |
2646 | case 0x10ec0234: |
2647 | @@ -7249,6 +7258,7 @@ static const struct hda_device_id snd_hda_id_realtek[] = { |
2648 | HDA_CODEC_ENTRY(0x10ec0294, "ALC294", patch_alc269), |
2649 | HDA_CODEC_ENTRY(0x10ec0295, "ALC295", patch_alc269), |
2650 | HDA_CODEC_ENTRY(0x10ec0298, "ALC298", patch_alc269), |
2651 | + HDA_CODEC_ENTRY(0x10ec0299, "ALC299", patch_alc269), |
2652 | HDA_CODEC_REV_ENTRY(0x10ec0861, 0x100340, "ALC660", patch_alc861), |
2653 | HDA_CODEC_ENTRY(0x10ec0660, "ALC660-VD", patch_alc861vd), |
2654 | HDA_CODEC_ENTRY(0x10ec0861, "ALC861", patch_alc861), |
2655 | diff --git a/sound/pci/vx222/vx222_ops.c b/sound/pci/vx222/vx222_ops.c |
2656 | index af83b3b38052..8e457ea27f89 100644 |
2657 | --- a/sound/pci/vx222/vx222_ops.c |
2658 | +++ b/sound/pci/vx222/vx222_ops.c |
2659 | @@ -269,12 +269,12 @@ static void vx2_dma_write(struct vx_core *chip, struct snd_pcm_runtime *runtime, |
2660 | |
2661 | /* Transfer using pseudo-dma. |
2662 | */ |
2663 | - if (offset + count > pipe->buffer_bytes) { |
2664 | + if (offset + count >= pipe->buffer_bytes) { |
2665 | int length = pipe->buffer_bytes - offset; |
2666 | count -= length; |
2667 | length >>= 2; /* in 32bit words */ |
2668 | /* Transfer using pseudo-dma. */ |
2669 | - while (length-- > 0) { |
2670 | + for (; length > 0; length--) { |
2671 | outl(cpu_to_le32(*addr), port); |
2672 | addr++; |
2673 | } |
2674 | @@ -284,7 +284,7 @@ static void vx2_dma_write(struct vx_core *chip, struct snd_pcm_runtime *runtime, |
2675 | pipe->hw_ptr += count; |
2676 | count >>= 2; /* in 32bit words */ |
2677 | /* Transfer using pseudo-dma. */ |
2678 | - while (count-- > 0) { |
2679 | + for (; count > 0; count--) { |
2680 | outl(cpu_to_le32(*addr), port); |
2681 | addr++; |
2682 | } |
2683 | @@ -307,12 +307,12 @@ static void vx2_dma_read(struct vx_core *chip, struct snd_pcm_runtime *runtime, |
2684 | vx2_setup_pseudo_dma(chip, 0); |
2685 | /* Transfer using pseudo-dma. |
2686 | */ |
2687 | - if (offset + count > pipe->buffer_bytes) { |
2688 | + if (offset + count >= pipe->buffer_bytes) { |
2689 | int length = pipe->buffer_bytes - offset; |
2690 | count -= length; |
2691 | length >>= 2; /* in 32bit words */ |
2692 | /* Transfer using pseudo-dma. */ |
2693 | - while (length-- > 0) |
2694 | + for (; length > 0; length--) |
2695 | *addr++ = le32_to_cpu(inl(port)); |
2696 | addr = (u32 *)runtime->dma_area; |
2697 | pipe->hw_ptr = 0; |
2698 | @@ -320,7 +320,7 @@ static void vx2_dma_read(struct vx_core *chip, struct snd_pcm_runtime *runtime, |
2699 | pipe->hw_ptr += count; |
2700 | count >>= 2; /* in 32bit words */ |
2701 | /* Transfer using pseudo-dma. */ |
2702 | - while (count-- > 0) |
2703 | + for (; count > 0; count--) |
2704 | *addr++ = le32_to_cpu(inl(port)); |
2705 | |
2706 | vx2_release_pseudo_dma(chip); |
2707 | diff --git a/sound/pcmcia/vx/vxp_ops.c b/sound/pcmcia/vx/vxp_ops.c |
2708 | index 281972913c32..56aa1ba73ccc 100644 |
2709 | --- a/sound/pcmcia/vx/vxp_ops.c |
2710 | +++ b/sound/pcmcia/vx/vxp_ops.c |
2711 | @@ -369,12 +369,12 @@ static void vxp_dma_write(struct vx_core *chip, struct snd_pcm_runtime *runtime, |
2712 | unsigned short *addr = (unsigned short *)(runtime->dma_area + offset); |
2713 | |
2714 | vx_setup_pseudo_dma(chip, 1); |
2715 | - if (offset + count > pipe->buffer_bytes) { |
2716 | + if (offset + count >= pipe->buffer_bytes) { |
2717 | int length = pipe->buffer_bytes - offset; |
2718 | count -= length; |
2719 | length >>= 1; /* in 16bit words */ |
2720 | /* Transfer using pseudo-dma. */ |
2721 | - while (length-- > 0) { |
2722 | + for (; length > 0; length--) { |
2723 | outw(cpu_to_le16(*addr), port); |
2724 | addr++; |
2725 | } |
2726 | @@ -384,7 +384,7 @@ static void vxp_dma_write(struct vx_core *chip, struct snd_pcm_runtime *runtime, |
2727 | pipe->hw_ptr += count; |
2728 | count >>= 1; /* in 16bit words */ |
2729 | /* Transfer using pseudo-dma. */ |
2730 | - while (count-- > 0) { |
2731 | + for (; count > 0; count--) { |
2732 | outw(cpu_to_le16(*addr), port); |
2733 | addr++; |
2734 | } |
2735 | @@ -411,12 +411,12 @@ static void vxp_dma_read(struct vx_core *chip, struct snd_pcm_runtime *runtime, |
2736 | if (snd_BUG_ON(count % 2)) |
2737 | return; |
2738 | vx_setup_pseudo_dma(chip, 0); |
2739 | - if (offset + count > pipe->buffer_bytes) { |
2740 | + if (offset + count >= pipe->buffer_bytes) { |
2741 | int length = pipe->buffer_bytes - offset; |
2742 | count -= length; |
2743 | length >>= 1; /* in 16bit words */ |
2744 | /* Transfer using pseudo-dma. */ |
2745 | - while (length-- > 0) |
2746 | + for (; length > 0; length--) |
2747 | *addr++ = le16_to_cpu(inw(port)); |
2748 | addr = (unsigned short *)runtime->dma_area; |
2749 | pipe->hw_ptr = 0; |
2750 | @@ -424,7 +424,7 @@ static void vxp_dma_read(struct vx_core *chip, struct snd_pcm_runtime *runtime, |
2751 | pipe->hw_ptr += count; |
2752 | count >>= 1; /* in 16bit words */ |
2753 | /* Transfer using pseudo-dma. */ |
2754 | - while (count-- > 1) |
2755 | + for (; count > 1; count--) |
2756 | *addr++ = le16_to_cpu(inw(port)); |
2757 | /* Disable DMA */ |
2758 | pchip->regDIALOG &= ~VXP_DLG_DMAREAD_SEL_MASK; |