Annotation of /trunk/kernel-alx/patches-4.9/0163-4.9.64-all-fixes.patch
Parent Directory | Revision Log
Revision 3048 -
(hide 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 | niro | 3048 | 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; |