Contents of /trunk/kernel26-alx/patches-3.10/0138-3.10.39-all-fixes.patch
Parent Directory | Revision Log
Revision 2672 -
(show annotations)
(download)
Tue Jul 21 16:46:35 2015 UTC (9 years, 2 months ago) by niro
File size: 94052 byte(s)
Tue Jul 21 16:46:35 2015 UTC (9 years, 2 months ago) by niro
File size: 94052 byte(s)
-3.10.84-alx-r1
1 | diff --git a/Documentation/video4linux/gspca.txt b/Documentation/video4linux/gspca.txt |
2 | index 1e6b6531bbcc..d2ba80bb7af5 100644 |
3 | --- a/Documentation/video4linux/gspca.txt |
4 | +++ b/Documentation/video4linux/gspca.txt |
5 | @@ -55,6 +55,7 @@ zc3xx 0458:700f Genius VideoCam Web V2 |
6 | sonixj 0458:7025 Genius Eye 311Q |
7 | sn9c20x 0458:7029 Genius Look 320s |
8 | sonixj 0458:702e Genius Slim 310 NB |
9 | +sn9c20x 0458:7045 Genius Look 1320 V2 |
10 | sn9c20x 0458:704a Genius Slim 1320 |
11 | sn9c20x 0458:704c Genius i-Look 1321 |
12 | sn9c20x 045e:00f4 LifeCam VX-6000 (SN9C20x + OV9650) |
13 | diff --git a/Makefile b/Makefile |
14 | index bd51b50a567b..1e07514be6f8 100644 |
15 | --- a/Makefile |
16 | +++ b/Makefile |
17 | @@ -1,6 +1,6 @@ |
18 | VERSION = 3 |
19 | PATCHLEVEL = 10 |
20 | -SUBLEVEL = 38 |
21 | +SUBLEVEL = 39 |
22 | EXTRAVERSION = |
23 | NAME = TOSSUG Baby Fish |
24 | |
25 | diff --git a/arch/arm/boot/dts/armada-370-xp.dtsi b/arch/arm/boot/dts/armada-370-xp.dtsi |
26 | index 4d12d2347c15..ddd068bb1457 100644 |
27 | --- a/arch/arm/boot/dts/armada-370-xp.dtsi |
28 | +++ b/arch/arm/boot/dts/armada-370-xp.dtsi |
29 | @@ -92,6 +92,7 @@ |
30 | #size-cells = <0>; |
31 | compatible = "marvell,orion-mdio"; |
32 | reg = <0x72004 0x4>; |
33 | + clocks = <&gateclk 4>; |
34 | }; |
35 | |
36 | ethernet@70000 { |
37 | diff --git a/arch/arm/boot/dts/exynos5250-arndale.dts b/arch/arm/boot/dts/exynos5250-arndale.dts |
38 | index 02cfc76d002f..b64cb43a7295 100644 |
39 | --- a/arch/arm/boot/dts/exynos5250-arndale.dts |
40 | +++ b/arch/arm/boot/dts/exynos5250-arndale.dts |
41 | @@ -263,6 +263,7 @@ |
42 | regulator-name = "vdd_g3d"; |
43 | regulator-min-microvolt = <1000000>; |
44 | regulator-max-microvolt = <1000000>; |
45 | + regulator-always-on; |
46 | regulator-boot-on; |
47 | op_mode = <1>; |
48 | }; |
49 | diff --git a/arch/arm/include/asm/div64.h b/arch/arm/include/asm/div64.h |
50 | index fe92ccf1d0b0..a66061aef29c 100644 |
51 | --- a/arch/arm/include/asm/div64.h |
52 | +++ b/arch/arm/include/asm/div64.h |
53 | @@ -156,7 +156,7 @@ |
54 | /* Select the best insn combination to perform the */ \ |
55 | /* actual __m * __n / (__p << 64) operation. */ \ |
56 | if (!__c) { \ |
57 | - asm ( "umull %Q0, %R0, %1, %Q2\n\t" \ |
58 | + asm ( "umull %Q0, %R0, %Q1, %Q2\n\t" \ |
59 | "mov %Q0, #0" \ |
60 | : "=&r" (__res) \ |
61 | : "r" (__m), "r" (__n) \ |
62 | diff --git a/arch/arm/include/asm/futex.h b/arch/arm/include/asm/futex.h |
63 | index e42cf597f6e6..2aff798fbef4 100644 |
64 | --- a/arch/arm/include/asm/futex.h |
65 | +++ b/arch/arm/include/asm/futex.h |
66 | @@ -3,11 +3,6 @@ |
67 | |
68 | #ifdef __KERNEL__ |
69 | |
70 | -#if defined(CONFIG_CPU_USE_DOMAINS) && defined(CONFIG_SMP) |
71 | -/* ARM doesn't provide unprivileged exclusive memory accessors */ |
72 | -#include <asm-generic/futex.h> |
73 | -#else |
74 | - |
75 | #include <linux/futex.h> |
76 | #include <linux/uaccess.h> |
77 | #include <asm/errno.h> |
78 | @@ -164,6 +159,5 @@ futex_atomic_op_inuser (int encoded_op, u32 __user *uaddr) |
79 | return ret; |
80 | } |
81 | |
82 | -#endif /* !(CPU_USE_DOMAINS && SMP) */ |
83 | #endif /* __KERNEL__ */ |
84 | #endif /* _ASM_ARM_FUTEX_H */ |
85 | diff --git a/arch/arm/include/asm/io.h b/arch/arm/include/asm/io.h |
86 | index 652b56086de7..d070741b2b37 100644 |
87 | --- a/arch/arm/include/asm/io.h |
88 | +++ b/arch/arm/include/asm/io.h |
89 | @@ -130,16 +130,16 @@ static inline u32 __raw_readl(const volatile void __iomem *addr) |
90 | */ |
91 | extern void __iomem *__arm_ioremap_pfn_caller(unsigned long, unsigned long, |
92 | size_t, unsigned int, void *); |
93 | -extern void __iomem *__arm_ioremap_caller(unsigned long, size_t, unsigned int, |
94 | +extern void __iomem *__arm_ioremap_caller(phys_addr_t, size_t, unsigned int, |
95 | void *); |
96 | |
97 | extern void __iomem *__arm_ioremap_pfn(unsigned long, unsigned long, size_t, unsigned int); |
98 | -extern void __iomem *__arm_ioremap(unsigned long, size_t, unsigned int); |
99 | -extern void __iomem *__arm_ioremap_exec(unsigned long, size_t, bool cached); |
100 | +extern void __iomem *__arm_ioremap(phys_addr_t, size_t, unsigned int); |
101 | +extern void __iomem *__arm_ioremap_exec(phys_addr_t, size_t, bool cached); |
102 | extern void __iounmap(volatile void __iomem *addr); |
103 | extern void __arm_iounmap(volatile void __iomem *addr); |
104 | |
105 | -extern void __iomem * (*arch_ioremap_caller)(unsigned long, size_t, |
106 | +extern void __iomem * (*arch_ioremap_caller)(phys_addr_t, size_t, |
107 | unsigned int, void *); |
108 | extern void (*arch_iounmap)(volatile void __iomem *); |
109 | |
110 | diff --git a/arch/arm/include/asm/pgtable-2level.h b/arch/arm/include/asm/pgtable-2level.h |
111 | index f97ee02386ee..c98c9c89b95c 100644 |
112 | --- a/arch/arm/include/asm/pgtable-2level.h |
113 | +++ b/arch/arm/include/asm/pgtable-2level.h |
114 | @@ -140,6 +140,7 @@ |
115 | #define L_PTE_MT_DEV_NONSHARED (_AT(pteval_t, 0x0c) << 2) /* 1100 */ |
116 | #define L_PTE_MT_DEV_WC (_AT(pteval_t, 0x09) << 2) /* 1001 */ |
117 | #define L_PTE_MT_DEV_CACHED (_AT(pteval_t, 0x0b) << 2) /* 1011 */ |
118 | +#define L_PTE_MT_VECTORS (_AT(pteval_t, 0x0f) << 2) /* 1111 */ |
119 | #define L_PTE_MT_MASK (_AT(pteval_t, 0x0f) << 2) |
120 | |
121 | #ifndef __ASSEMBLY__ |
122 | diff --git a/arch/arm/include/asm/unistd.h b/arch/arm/include/asm/unistd.h |
123 | index 141baa3f9a72..cbd61977c996 100644 |
124 | --- a/arch/arm/include/asm/unistd.h |
125 | +++ b/arch/arm/include/asm/unistd.h |
126 | @@ -48,6 +48,5 @@ |
127 | */ |
128 | #define __IGNORE_fadvise64_64 |
129 | #define __IGNORE_migrate_pages |
130 | -#define __IGNORE_kcmp |
131 | |
132 | #endif /* __ASM_ARM_UNISTD_H */ |
133 | diff --git a/arch/arm/kernel/machine_kexec.c b/arch/arm/kernel/machine_kexec.c |
134 | index 163b160c69e9..c3ef920823b6 100644 |
135 | --- a/arch/arm/kernel/machine_kexec.c |
136 | +++ b/arch/arm/kernel/machine_kexec.c |
137 | @@ -169,3 +169,10 @@ void machine_kexec(struct kimage *image) |
138 | |
139 | soft_restart(reboot_code_buffer_phys); |
140 | } |
141 | + |
142 | +void arch_crash_save_vmcoreinfo(void) |
143 | +{ |
144 | +#ifdef CONFIG_ARM_LPAE |
145 | + VMCOREINFO_CONFIG(ARM_LPAE); |
146 | +#endif |
147 | +} |
148 | diff --git a/arch/arm/mach-ebsa110/core.c b/arch/arm/mach-ebsa110/core.c |
149 | index b13cc74114db..8a53f346cdb3 100644 |
150 | --- a/arch/arm/mach-ebsa110/core.c |
151 | +++ b/arch/arm/mach-ebsa110/core.c |
152 | @@ -116,7 +116,7 @@ static void __init ebsa110_map_io(void) |
153 | iotable_init(ebsa110_io_desc, ARRAY_SIZE(ebsa110_io_desc)); |
154 | } |
155 | |
156 | -static void __iomem *ebsa110_ioremap_caller(unsigned long cookie, size_t size, |
157 | +static void __iomem *ebsa110_ioremap_caller(phys_addr_t cookie, size_t size, |
158 | unsigned int flags, void *caller) |
159 | { |
160 | return (void __iomem *)cookie; |
161 | diff --git a/arch/arm/mach-imx/mm-imx3.c b/arch/arm/mach-imx/mm-imx3.c |
162 | index e0e69a682174..eed32ca0b8ab 100644 |
163 | --- a/arch/arm/mach-imx/mm-imx3.c |
164 | +++ b/arch/arm/mach-imx/mm-imx3.c |
165 | @@ -65,7 +65,7 @@ static void imx3_idle(void) |
166 | : "=r" (reg)); |
167 | } |
168 | |
169 | -static void __iomem *imx3_ioremap_caller(unsigned long phys_addr, size_t size, |
170 | +static void __iomem *imx3_ioremap_caller(phys_addr_t phys_addr, size_t size, |
171 | unsigned int mtype, void *caller) |
172 | { |
173 | if (mtype == MT_DEVICE) { |
174 | diff --git a/arch/arm/mach-iop13xx/io.c b/arch/arm/mach-iop13xx/io.c |
175 | index 183dc8b5511b..faaf7d4482c5 100644 |
176 | --- a/arch/arm/mach-iop13xx/io.c |
177 | +++ b/arch/arm/mach-iop13xx/io.c |
178 | @@ -23,7 +23,7 @@ |
179 | |
180 | #include "pci.h" |
181 | |
182 | -static void __iomem *__iop13xx_ioremap_caller(unsigned long cookie, |
183 | +static void __iomem *__iop13xx_ioremap_caller(phys_addr_t cookie, |
184 | size_t size, unsigned int mtype, void *caller) |
185 | { |
186 | void __iomem * retval; |
187 | diff --git a/arch/arm/mach-ixp4xx/common.c b/arch/arm/mach-ixp4xx/common.c |
188 | index 6600cff6bd92..d7223b3b81f3 100644 |
189 | --- a/arch/arm/mach-ixp4xx/common.c |
190 | +++ b/arch/arm/mach-ixp4xx/common.c |
191 | @@ -559,7 +559,7 @@ void ixp4xx_restart(char mode, const char *cmd) |
192 | * fallback to the default. |
193 | */ |
194 | |
195 | -static void __iomem *ixp4xx_ioremap_caller(unsigned long addr, size_t size, |
196 | +static void __iomem *ixp4xx_ioremap_caller(phys_addr_t addr, size_t size, |
197 | unsigned int mtype, void *caller) |
198 | { |
199 | if (!is_pci_memory(addr)) |
200 | diff --git a/arch/arm/mach-msm/common.h b/arch/arm/mach-msm/common.h |
201 | index ce8215a269e5..421cf7751a80 100644 |
202 | --- a/arch/arm/mach-msm/common.h |
203 | +++ b/arch/arm/mach-msm/common.h |
204 | @@ -23,7 +23,7 @@ extern void msm_map_msm8x60_io(void); |
205 | extern void msm_map_msm8960_io(void); |
206 | extern void msm_map_qsd8x50_io(void); |
207 | |
208 | -extern void __iomem *__msm_ioremap_caller(unsigned long phys_addr, size_t size, |
209 | +extern void __iomem *__msm_ioremap_caller(phys_addr_t phys_addr, size_t size, |
210 | unsigned int mtype, void *caller); |
211 | |
212 | extern struct smp_operations msm_smp_ops; |
213 | diff --git a/arch/arm/mach-msm/io.c b/arch/arm/mach-msm/io.c |
214 | index 123ef9cbce1b..fd65b6d42cde 100644 |
215 | --- a/arch/arm/mach-msm/io.c |
216 | +++ b/arch/arm/mach-msm/io.c |
217 | @@ -172,7 +172,7 @@ void __init msm_map_msm7x30_io(void) |
218 | } |
219 | #endif /* CONFIG_ARCH_MSM7X30 */ |
220 | |
221 | -void __iomem *__msm_ioremap_caller(unsigned long phys_addr, size_t size, |
222 | +void __iomem *__msm_ioremap_caller(phys_addr_t phys_addr, size_t size, |
223 | unsigned int mtype, void *caller) |
224 | { |
225 | if (mtype == MT_DEVICE) { |
226 | diff --git a/arch/arm/mach-omap2/irq.c b/arch/arm/mach-omap2/irq.c |
227 | index e022a869bff2..6037a9a01ed5 100644 |
228 | --- a/arch/arm/mach-omap2/irq.c |
229 | +++ b/arch/arm/mach-omap2/irq.c |
230 | @@ -222,6 +222,7 @@ void __init ti81xx_init_irq(void) |
231 | static inline void omap_intc_handle_irq(void __iomem *base_addr, struct pt_regs *regs) |
232 | { |
233 | u32 irqnr; |
234 | + int handled_irq = 0; |
235 | |
236 | do { |
237 | irqnr = readl_relaxed(base_addr + 0x98); |
238 | @@ -249,8 +250,15 @@ out: |
239 | if (irqnr) { |
240 | irqnr = irq_find_mapping(domain, irqnr); |
241 | handle_IRQ(irqnr, regs); |
242 | + handled_irq = 1; |
243 | } |
244 | } while (irqnr); |
245 | + |
246 | + /* If an irq is masked or deasserted while active, we will |
247 | + * keep ending up here with no irq handled. So remove it from |
248 | + * the INTC with an ack.*/ |
249 | + if (!handled_irq) |
250 | + omap_ack_irq(NULL); |
251 | } |
252 | |
253 | asmlinkage void __exception_irq_entry omap2_intc_handle_irq(struct pt_regs *regs) |
254 | diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c |
255 | index 9f6238c9dfc9..8691c8cbe2c7 100644 |
256 | --- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c |
257 | +++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c |
258 | @@ -1955,7 +1955,7 @@ static struct omap_hwmod_irq_info omap3xxx_usb_host_hs_irqs[] = { |
259 | static struct omap_hwmod omap3xxx_usb_host_hs_hwmod = { |
260 | .name = "usb_host_hs", |
261 | .class = &omap3xxx_usb_host_hs_hwmod_class, |
262 | - .clkdm_name = "l3_init_clkdm", |
263 | + .clkdm_name = "usbhost_clkdm", |
264 | .mpu_irqs = omap3xxx_usb_host_hs_irqs, |
265 | .main_clk = "usbhost_48m_fck", |
266 | .prcm = { |
267 | @@ -2040,7 +2040,7 @@ static struct omap_hwmod_irq_info omap3xxx_usb_tll_hs_irqs[] = { |
268 | static struct omap_hwmod omap3xxx_usb_tll_hs_hwmod = { |
269 | .name = "usb_tll_hs", |
270 | .class = &omap3xxx_usb_tll_hs_hwmod_class, |
271 | - .clkdm_name = "l3_init_clkdm", |
272 | + .clkdm_name = "core_l4_clkdm", |
273 | .mpu_irqs = omap3xxx_usb_tll_hs_irqs, |
274 | .main_clk = "usbtll_fck", |
275 | .prcm = { |
276 | diff --git a/arch/arm/mach-omap2/pm.h b/arch/arm/mach-omap2/pm.h |
277 | index 7bdd22afce69..d4d0fce325c7 100644 |
278 | --- a/arch/arm/mach-omap2/pm.h |
279 | +++ b/arch/arm/mach-omap2/pm.h |
280 | @@ -103,7 +103,7 @@ static inline void enable_omap3630_toggle_l2_on_restore(void) { } |
281 | |
282 | #define PM_OMAP4_ROM_SMP_BOOT_ERRATUM_GICD (1 << 0) |
283 | |
284 | -#if defined(CONFIG_ARCH_OMAP4) |
285 | +#if defined(CONFIG_PM) && defined(CONFIG_ARCH_OMAP4) |
286 | extern u16 pm44xx_errata; |
287 | #define IS_PM44XX_ERRATUM(id) (pm44xx_errata & (id)) |
288 | #else |
289 | diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig |
290 | index 08c9fe917d1f..c21082d664ed 100644 |
291 | --- a/arch/arm/mm/Kconfig |
292 | +++ b/arch/arm/mm/Kconfig |
293 | @@ -436,7 +436,6 @@ config CPU_32v5 |
294 | |
295 | config CPU_32v6 |
296 | bool |
297 | - select CPU_USE_DOMAINS if CPU_V6 && MMU |
298 | select TLS_REG_EMUL if !CPU_32v6K && !MMU |
299 | |
300 | config CPU_32v6K |
301 | @@ -651,7 +650,7 @@ config ARM_VIRT_EXT |
302 | |
303 | config SWP_EMULATE |
304 | bool "Emulate SWP/SWPB instructions" |
305 | - depends on !CPU_USE_DOMAINS && CPU_V7 |
306 | + depends on CPU_V7 |
307 | default y if SMP |
308 | select HAVE_PROC_CPU if PROC_FS |
309 | help |
310 | diff --git a/arch/arm/mm/ioremap.c b/arch/arm/mm/ioremap.c |
311 | index 04d9006eab1f..f123d6eb074b 100644 |
312 | --- a/arch/arm/mm/ioremap.c |
313 | +++ b/arch/arm/mm/ioremap.c |
314 | @@ -331,10 +331,10 @@ void __iomem * __arm_ioremap_pfn_caller(unsigned long pfn, |
315 | return (void __iomem *) (offset + addr); |
316 | } |
317 | |
318 | -void __iomem *__arm_ioremap_caller(unsigned long phys_addr, size_t size, |
319 | +void __iomem *__arm_ioremap_caller(phys_addr_t phys_addr, size_t size, |
320 | unsigned int mtype, void *caller) |
321 | { |
322 | - unsigned long last_addr; |
323 | + phys_addr_t last_addr; |
324 | unsigned long offset = phys_addr & ~PAGE_MASK; |
325 | unsigned long pfn = __phys_to_pfn(phys_addr); |
326 | |
327 | @@ -367,12 +367,12 @@ __arm_ioremap_pfn(unsigned long pfn, unsigned long offset, size_t size, |
328 | } |
329 | EXPORT_SYMBOL(__arm_ioremap_pfn); |
330 | |
331 | -void __iomem * (*arch_ioremap_caller)(unsigned long, size_t, |
332 | +void __iomem * (*arch_ioremap_caller)(phys_addr_t, size_t, |
333 | unsigned int, void *) = |
334 | __arm_ioremap_caller; |
335 | |
336 | void __iomem * |
337 | -__arm_ioremap(unsigned long phys_addr, size_t size, unsigned int mtype) |
338 | +__arm_ioremap(phys_addr_t phys_addr, size_t size, unsigned int mtype) |
339 | { |
340 | return arch_ioremap_caller(phys_addr, size, mtype, |
341 | __builtin_return_address(0)); |
342 | @@ -387,7 +387,7 @@ EXPORT_SYMBOL(__arm_ioremap); |
343 | * CONFIG_GENERIC_ALLOCATOR for allocating external memory. |
344 | */ |
345 | void __iomem * |
346 | -__arm_ioremap_exec(unsigned long phys_addr, size_t size, bool cached) |
347 | +__arm_ioremap_exec(phys_addr_t phys_addr, size_t size, bool cached) |
348 | { |
349 | unsigned int mtype; |
350 | |
351 | diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c |
352 | index daf336fe0be8..fb3c446af9e5 100644 |
353 | --- a/arch/arm/mm/mmu.c |
354 | +++ b/arch/arm/mm/mmu.c |
355 | @@ -459,6 +459,16 @@ static void __init build_mem_type_table(void) |
356 | hyp_device_pgprot = s2_device_pgprot = mem_types[MT_DEVICE].prot_pte; |
357 | |
358 | /* |
359 | + * We don't use domains on ARMv6 (since this causes problems with |
360 | + * v6/v7 kernels), so we must use a separate memory type for user |
361 | + * r/o, kernel r/w to map the vectors page. |
362 | + */ |
363 | +#ifndef CONFIG_ARM_LPAE |
364 | + if (cpu_arch == CPU_ARCH_ARMv6) |
365 | + vecs_pgprot |= L_PTE_MT_VECTORS; |
366 | +#endif |
367 | + |
368 | + /* |
369 | * ARMv6 and above have extended page tables. |
370 | */ |
371 | if (cpu_arch >= CPU_ARCH_ARMv6 && (cr & CR_XP)) { |
372 | diff --git a/arch/arm/mm/nommu.c b/arch/arm/mm/nommu.c |
373 | index eb5293a69a84..7fe0524a5449 100644 |
374 | --- a/arch/arm/mm/nommu.c |
375 | +++ b/arch/arm/mm/nommu.c |
376 | @@ -87,16 +87,16 @@ void __iomem *__arm_ioremap_pfn_caller(unsigned long pfn, unsigned long offset, |
377 | return __arm_ioremap_pfn(pfn, offset, size, mtype); |
378 | } |
379 | |
380 | -void __iomem *__arm_ioremap(unsigned long phys_addr, size_t size, |
381 | +void __iomem *__arm_ioremap(phys_addr_t phys_addr, size_t size, |
382 | unsigned int mtype) |
383 | { |
384 | return (void __iomem *)phys_addr; |
385 | } |
386 | EXPORT_SYMBOL(__arm_ioremap); |
387 | |
388 | -void __iomem * (*arch_ioremap_caller)(unsigned long, size_t, unsigned int, void *); |
389 | +void __iomem * (*arch_ioremap_caller)(phys_addr_t, size_t, unsigned int, void *); |
390 | |
391 | -void __iomem *__arm_ioremap_caller(unsigned long phys_addr, size_t size, |
392 | +void __iomem *__arm_ioremap_caller(phys_addr_t phys_addr, size_t size, |
393 | unsigned int mtype, void *caller) |
394 | { |
395 | return __arm_ioremap(phys_addr, size, mtype); |
396 | diff --git a/arch/arm/mm/proc-macros.S b/arch/arm/mm/proc-macros.S |
397 | index e3c48a3fe063..ee1d80593958 100644 |
398 | --- a/arch/arm/mm/proc-macros.S |
399 | +++ b/arch/arm/mm/proc-macros.S |
400 | @@ -112,13 +112,9 @@ |
401 | * 100x 1 0 1 r/o no acc |
402 | * 10x0 1 0 1 r/o no acc |
403 | * 1011 0 0 1 r/w no acc |
404 | - * 110x 0 1 0 r/w r/o |
405 | - * 11x0 0 1 0 r/w r/o |
406 | - * 1111 0 1 1 r/w r/w |
407 | - * |
408 | - * If !CONFIG_CPU_USE_DOMAINS, the following permissions are changed: |
409 | * 110x 1 1 1 r/o r/o |
410 | * 11x0 1 1 1 r/o r/o |
411 | + * 1111 0 1 1 r/w r/w |
412 | */ |
413 | .macro armv6_mt_table pfx |
414 | \pfx\()_mt_table: |
415 | @@ -137,7 +133,7 @@ |
416 | .long PTE_EXT_TEX(2) @ L_PTE_MT_DEV_NONSHARED |
417 | .long 0x00 @ unused |
418 | .long 0x00 @ unused |
419 | - .long 0x00 @ unused |
420 | + .long PTE_CACHEABLE | PTE_BUFFERABLE | PTE_EXT_APX @ L_PTE_MT_VECTORS |
421 | .endm |
422 | |
423 | .macro armv6_set_pte_ext pfx |
424 | @@ -158,24 +154,21 @@ |
425 | |
426 | tst r1, #L_PTE_USER |
427 | orrne r3, r3, #PTE_EXT_AP1 |
428 | -#ifdef CONFIG_CPU_USE_DOMAINS |
429 | - @ allow kernel read/write access to read-only user pages |
430 | tstne r3, #PTE_EXT_APX |
431 | - bicne r3, r3, #PTE_EXT_APX | PTE_EXT_AP0 |
432 | -#endif |
433 | + |
434 | + @ user read-only -> kernel read-only |
435 | + bicne r3, r3, #PTE_EXT_AP0 |
436 | |
437 | tst r1, #L_PTE_XN |
438 | orrne r3, r3, #PTE_EXT_XN |
439 | |
440 | - orr r3, r3, r2 |
441 | + eor r3, r3, r2 |
442 | |
443 | tst r1, #L_PTE_YOUNG |
444 | tstne r1, #L_PTE_PRESENT |
445 | moveq r3, #0 |
446 | -#ifndef CONFIG_CPU_USE_DOMAINS |
447 | tstne r1, #L_PTE_NONE |
448 | movne r3, #0 |
449 | -#endif |
450 | |
451 | str r3, [r0] |
452 | mcr p15, 0, r0, c7, c10, 1 @ flush_pte |
453 | diff --git a/arch/arm/mm/proc-v7-2level.S b/arch/arm/mm/proc-v7-2level.S |
454 | index b3997c70af32..bb20ba0f7bc7 100644 |
455 | --- a/arch/arm/mm/proc-v7-2level.S |
456 | +++ b/arch/arm/mm/proc-v7-2level.S |
457 | @@ -90,21 +90,14 @@ ENTRY(cpu_v7_set_pte_ext) |
458 | |
459 | tst r1, #L_PTE_USER |
460 | orrne r3, r3, #PTE_EXT_AP1 |
461 | -#ifdef CONFIG_CPU_USE_DOMAINS |
462 | - @ allow kernel read/write access to read-only user pages |
463 | - tstne r3, #PTE_EXT_APX |
464 | - bicne r3, r3, #PTE_EXT_APX | PTE_EXT_AP0 |
465 | -#endif |
466 | |
467 | tst r1, #L_PTE_XN |
468 | orrne r3, r3, #PTE_EXT_XN |
469 | |
470 | tst r1, #L_PTE_YOUNG |
471 | tstne r1, #L_PTE_VALID |
472 | -#ifndef CONFIG_CPU_USE_DOMAINS |
473 | eorne r1, r1, #L_PTE_NONE |
474 | tstne r1, #L_PTE_NONE |
475 | -#endif |
476 | moveq r3, #0 |
477 | |
478 | ARM( str r3, [r0, #2048]! ) |
479 | diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h |
480 | index e9a1a1d81892..3a710d7b14ce 100644 |
481 | --- a/arch/arm64/include/asm/pgtable.h |
482 | +++ b/arch/arm64/include/asm/pgtable.h |
483 | @@ -161,7 +161,7 @@ static inline void set_pte_at(struct mm_struct *mm, unsigned long addr, |
484 | pte_t *ptep, pte_t pte) |
485 | { |
486 | if (pte_valid_user(pte)) { |
487 | - if (pte_exec(pte)) |
488 | + if (!pte_special(pte) && pte_exec(pte)) |
489 | __sync_icache_dcache(pte, addr); |
490 | if (!pte_dirty(pte)) |
491 | pte = pte_wrprotect(pte); |
492 | @@ -182,11 +182,11 @@ static inline void set_pte_at(struct mm_struct *mm, unsigned long addr, |
493 | * Mark the prot value as uncacheable and unbufferable. |
494 | */ |
495 | #define pgprot_noncached(prot) \ |
496 | - __pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_DEVICE_nGnRnE)) |
497 | + __pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_DEVICE_nGnRnE) | PTE_PXN | PTE_UXN) |
498 | #define pgprot_writecombine(prot) \ |
499 | - __pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_NORMAL_NC)) |
500 | + __pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_NORMAL_NC) | PTE_PXN | PTE_UXN) |
501 | #define pgprot_dmacoherent(prot) \ |
502 | - __pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_NORMAL_NC)) |
503 | + __pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_NORMAL_NC) | PTE_PXN | PTE_UXN) |
504 | #define __HAVE_PHYS_MEM_ACCESS_PROT |
505 | struct file; |
506 | extern pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn, |
507 | diff --git a/arch/s390/include/asm/ccwdev.h b/arch/s390/include/asm/ccwdev.h |
508 | index f201af8be580..31b5ca8f8c3d 100644 |
509 | --- a/arch/s390/include/asm/ccwdev.h |
510 | +++ b/arch/s390/include/asm/ccwdev.h |
511 | @@ -219,7 +219,7 @@ extern void ccw_device_get_id(struct ccw_device *, struct ccw_dev_id *); |
512 | #define to_ccwdev(n) container_of(n, struct ccw_device, dev) |
513 | #define to_ccwdrv(n) container_of(n, struct ccw_driver, driver) |
514 | |
515 | -extern struct ccw_device *ccw_device_probe_console(void); |
516 | +extern struct ccw_device *ccw_device_probe_console(struct ccw_driver *); |
517 | extern void ccw_device_wait_idle(struct ccw_device *); |
518 | extern int ccw_device_force_console(struct ccw_device *); |
519 | |
520 | diff --git a/arch/sh/kernel/dumpstack.c b/arch/sh/kernel/dumpstack.c |
521 | index b959f5592604..8dfe645bcc4b 100644 |
522 | --- a/arch/sh/kernel/dumpstack.c |
523 | +++ b/arch/sh/kernel/dumpstack.c |
524 | @@ -115,7 +115,7 @@ static int print_trace_stack(void *data, char *name) |
525 | */ |
526 | static void print_trace_address(void *data, unsigned long addr, int reliable) |
527 | { |
528 | - printk(data); |
529 | + printk("%s", (char *)data); |
530 | printk_address(addr, reliable); |
531 | } |
532 | |
533 | diff --git a/arch/x86/boot/compressed/eboot.c b/arch/x86/boot/compressed/eboot.c |
534 | index d606463aa6d6..1308beed7abe 100644 |
535 | --- a/arch/x86/boot/compressed/eboot.c |
536 | +++ b/arch/x86/boot/compressed/eboot.c |
537 | @@ -865,6 +865,9 @@ fail: |
538 | * Because the x86 boot code expects to be passed a boot_params we |
539 | * need to create one ourselves (usually the bootloader would create |
540 | * one for us). |
541 | + * |
542 | + * The caller is responsible for filling out ->code32_start in the |
543 | + * returned boot_params. |
544 | */ |
545 | struct boot_params *make_boot_params(void *handle, efi_system_table_t *_table) |
546 | { |
547 | @@ -921,8 +924,6 @@ struct boot_params *make_boot_params(void *handle, efi_system_table_t *_table) |
548 | hdr->vid_mode = 0xffff; |
549 | hdr->boot_flag = 0xAA55; |
550 | |
551 | - hdr->code32_start = (__u64)(unsigned long)image->image_base; |
552 | - |
553 | hdr->type_of_loader = 0x21; |
554 | |
555 | /* Convert unicode cmdline to ascii */ |
556 | diff --git a/arch/x86/boot/compressed/head_32.S b/arch/x86/boot/compressed/head_32.S |
557 | index 1e3184f6072f..abb988a54c69 100644 |
558 | --- a/arch/x86/boot/compressed/head_32.S |
559 | +++ b/arch/x86/boot/compressed/head_32.S |
560 | @@ -50,6 +50,13 @@ ENTRY(efi_pe_entry) |
561 | pushl %eax |
562 | pushl %esi |
563 | pushl %ecx |
564 | + |
565 | + call reloc |
566 | +reloc: |
567 | + popl %ecx |
568 | + subl reloc, %ecx |
569 | + movl %ecx, BP_code32_start(%eax) |
570 | + |
571 | sub $0x4, %esp |
572 | |
573 | ENTRY(efi_stub_entry) |
574 | @@ -63,12 +70,7 @@ ENTRY(efi_stub_entry) |
575 | hlt |
576 | jmp 1b |
577 | 2: |
578 | - call 3f |
579 | -3: |
580 | - popl %eax |
581 | - subl $3b, %eax |
582 | - subl BP_pref_address(%esi), %eax |
583 | - add BP_code32_start(%esi), %eax |
584 | + movl BP_code32_start(%esi), %eax |
585 | leal preferred_addr(%eax), %eax |
586 | jmp *%eax |
587 | |
588 | diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S |
589 | index 16f24e6dad79..92059b8f3f7b 100644 |
590 | --- a/arch/x86/boot/compressed/head_64.S |
591 | +++ b/arch/x86/boot/compressed/head_64.S |
592 | @@ -217,6 +217,8 @@ ENTRY(efi_pe_entry) |
593 | cmpq $0,%rax |
594 | je 1f |
595 | mov %rax, %rdx |
596 | + leaq startup_32(%rip), %rax |
597 | + movl %eax, BP_code32_start(%rdx) |
598 | popq %rsi |
599 | popq %rdi |
600 | |
601 | @@ -230,12 +232,7 @@ ENTRY(efi_stub_entry) |
602 | hlt |
603 | jmp 1b |
604 | 2: |
605 | - call 3f |
606 | -3: |
607 | - popq %rax |
608 | - subq $3b, %rax |
609 | - subq BP_pref_address(%rsi), %rax |
610 | - add BP_code32_start(%esi), %eax |
611 | + movl BP_code32_start(%esi), %eax |
612 | leaq preferred_addr(%rax), %rax |
613 | jmp *%rax |
614 | |
615 | diff --git a/arch/x86/kernel/ftrace.c b/arch/x86/kernel/ftrace.c |
616 | index e6253195a301..1ffc32dbe450 100644 |
617 | --- a/arch/x86/kernel/ftrace.c |
618 | +++ b/arch/x86/kernel/ftrace.c |
619 | @@ -659,8 +659,8 @@ ftrace_modify_code(unsigned long ip, unsigned const char *old_code, |
620 | ret = -EPERM; |
621 | goto out; |
622 | } |
623 | - run_sync(); |
624 | out: |
625 | + run_sync(); |
626 | return ret; |
627 | |
628 | fail_update: |
629 | diff --git a/arch/x86/kernel/ldt.c b/arch/x86/kernel/ldt.c |
630 | index ebc987398923..af1d14a9ebda 100644 |
631 | --- a/arch/x86/kernel/ldt.c |
632 | +++ b/arch/x86/kernel/ldt.c |
633 | @@ -229,6 +229,17 @@ static int write_ldt(void __user *ptr, unsigned long bytecount, int oldmode) |
634 | } |
635 | } |
636 | |
637 | + /* |
638 | + * On x86-64 we do not support 16-bit segments due to |
639 | + * IRET leaking the high bits of the kernel stack address. |
640 | + */ |
641 | +#ifdef CONFIG_X86_64 |
642 | + if (!ldt_info.seg_32bit) { |
643 | + error = -EINVAL; |
644 | + goto out_unlock; |
645 | + } |
646 | +#endif |
647 | + |
648 | fill_ldt(&ldt, &ldt_info); |
649 | if (oldmode) |
650 | ldt.avl = 0; |
651 | diff --git a/drivers/block/mtip32xx/mtip32xx.c b/drivers/block/mtip32xx/mtip32xx.c |
652 | index 20dd52a2f92f..6e514583aa76 100644 |
653 | --- a/drivers/block/mtip32xx/mtip32xx.c |
654 | +++ b/drivers/block/mtip32xx/mtip32xx.c |
655 | @@ -4040,6 +4040,7 @@ skip_create_disk: |
656 | blk_queue_max_hw_sectors(dd->queue, 0xffff); |
657 | blk_queue_max_segment_size(dd->queue, 0x400000); |
658 | blk_queue_io_min(dd->queue, 4096); |
659 | + blk_queue_bounce_limit(dd->queue, dd->pdev->dma_mask); |
660 | |
661 | /* |
662 | * write back cache is not supported in the device. FUA depends on |
663 | diff --git a/drivers/iio/industrialio-buffer.c b/drivers/iio/industrialio-buffer.c |
664 | index aaadd32f9f0d..d344cf3ac9e3 100644 |
665 | --- a/drivers/iio/industrialio-buffer.c |
666 | +++ b/drivers/iio/industrialio-buffer.c |
667 | @@ -119,7 +119,8 @@ static ssize_t iio_scan_el_show(struct device *dev, |
668 | int ret; |
669 | struct iio_dev *indio_dev = dev_to_iio_dev(dev); |
670 | |
671 | - ret = test_bit(to_iio_dev_attr(attr)->address, |
672 | + /* Ensure ret is 0 or 1. */ |
673 | + ret = !!test_bit(to_iio_dev_attr(attr)->address, |
674 | indio_dev->buffer->scan_mask); |
675 | |
676 | return sprintf(buf, "%d\n", ret); |
677 | @@ -762,7 +763,8 @@ int iio_scan_mask_query(struct iio_dev *indio_dev, |
678 | if (!buffer->scan_mask) |
679 | return 0; |
680 | |
681 | - return test_bit(bit, buffer->scan_mask); |
682 | + /* Ensure return value is 0 or 1. */ |
683 | + return !!test_bit(bit, buffer->scan_mask); |
684 | }; |
685 | EXPORT_SYMBOL_GPL(iio_scan_mask_query); |
686 | |
687 | diff --git a/drivers/infiniband/hw/ehca/ehca_cq.c b/drivers/infiniband/hw/ehca/ehca_cq.c |
688 | index 212150c25ea0..8cc837537768 100644 |
689 | --- a/drivers/infiniband/hw/ehca/ehca_cq.c |
690 | +++ b/drivers/infiniband/hw/ehca/ehca_cq.c |
691 | @@ -283,6 +283,7 @@ struct ib_cq *ehca_create_cq(struct ib_device *device, int cqe, int comp_vector, |
692 | (my_cq->galpas.user.fw_handle & (PAGE_SIZE - 1)); |
693 | if (ib_copy_to_udata(udata, &resp, sizeof(resp))) { |
694 | ehca_err(device, "Copy to udata failed."); |
695 | + cq = ERR_PTR(-EFAULT); |
696 | goto create_cq_exit4; |
697 | } |
698 | } |
699 | diff --git a/drivers/infiniband/hw/ipath/ipath_diag.c b/drivers/infiniband/hw/ipath/ipath_diag.c |
700 | index 714293b78518..e2f9a51f4a38 100644 |
701 | --- a/drivers/infiniband/hw/ipath/ipath_diag.c |
702 | +++ b/drivers/infiniband/hw/ipath/ipath_diag.c |
703 | @@ -326,7 +326,7 @@ static ssize_t ipath_diagpkt_write(struct file *fp, |
704 | size_t count, loff_t *off) |
705 | { |
706 | u32 __iomem *piobuf; |
707 | - u32 plen, clen, pbufn; |
708 | + u32 plen, pbufn, maxlen_reserve; |
709 | struct ipath_diag_pkt odp; |
710 | struct ipath_diag_xpkt dp; |
711 | u32 *tmpbuf = NULL; |
712 | @@ -335,51 +335,29 @@ static ssize_t ipath_diagpkt_write(struct file *fp, |
713 | u64 val; |
714 | u32 l_state, lt_state; /* LinkState, LinkTrainingState */ |
715 | |
716 | - if (count < sizeof(odp)) { |
717 | - ret = -EINVAL; |
718 | - goto bail; |
719 | - } |
720 | |
721 | if (count == sizeof(dp)) { |
722 | if (copy_from_user(&dp, data, sizeof(dp))) { |
723 | ret = -EFAULT; |
724 | goto bail; |
725 | } |
726 | - } else if (copy_from_user(&odp, data, sizeof(odp))) { |
727 | - ret = -EFAULT; |
728 | + } else if (count == sizeof(odp)) { |
729 | + if (copy_from_user(&odp, data, sizeof(odp))) { |
730 | + ret = -EFAULT; |
731 | + goto bail; |
732 | + } |
733 | + } else { |
734 | + ret = -EINVAL; |
735 | goto bail; |
736 | } |
737 | |
738 | - /* |
739 | - * Due to padding/alignment issues (lessened with new struct) |
740 | - * the old and new structs are the same length. We need to |
741 | - * disambiguate them, which we can do because odp.len has never |
742 | - * been less than the total of LRH+BTH+DETH so far, while |
743 | - * dp.unit (same offset) unit is unlikely to get that high. |
744 | - * Similarly, dp.data, the pointer to user at the same offset |
745 | - * as odp.unit, is almost certainly at least one (512byte)page |
746 | - * "above" NULL. The if-block below can be omitted if compatibility |
747 | - * between a new driver and older diagnostic code is unimportant. |
748 | - * compatibility the other direction (new diags, old driver) is |
749 | - * handled in the diagnostic code, with a warning. |
750 | - */ |
751 | - if (dp.unit >= 20 && dp.data < 512) { |
752 | - /* very probable version mismatch. Fix it up */ |
753 | - memcpy(&odp, &dp, sizeof(odp)); |
754 | - /* We got a legacy dp, copy elements to dp */ |
755 | - dp.unit = odp.unit; |
756 | - dp.data = odp.data; |
757 | - dp.len = odp.len; |
758 | - dp.pbc_wd = 0; /* Indicate we need to compute PBC wd */ |
759 | - } |
760 | - |
761 | /* send count must be an exact number of dwords */ |
762 | if (dp.len & 3) { |
763 | ret = -EINVAL; |
764 | goto bail; |
765 | } |
766 | |
767 | - clen = dp.len >> 2; |
768 | + plen = dp.len >> 2; |
769 | |
770 | dd = ipath_lookup(dp.unit); |
771 | if (!dd || !(dd->ipath_flags & IPATH_PRESENT) || |
772 | @@ -422,16 +400,22 @@ static ssize_t ipath_diagpkt_write(struct file *fp, |
773 | goto bail; |
774 | } |
775 | |
776 | - /* need total length before first word written */ |
777 | - /* +1 word is for the qword padding */ |
778 | - plen = sizeof(u32) + dp.len; |
779 | - |
780 | - if ((plen + 4) > dd->ipath_ibmaxlen) { |
781 | + /* |
782 | + * need total length before first word written, plus 2 Dwords. One Dword |
783 | + * is for padding so we get the full user data when not aligned on |
784 | + * a word boundary. The other Dword is to make sure we have room for the |
785 | + * ICRC which gets tacked on later. |
786 | + */ |
787 | + maxlen_reserve = 2 * sizeof(u32); |
788 | + if (dp.len > dd->ipath_ibmaxlen - maxlen_reserve) { |
789 | ipath_dbg("Pkt len 0x%x > ibmaxlen %x\n", |
790 | - plen - 4, dd->ipath_ibmaxlen); |
791 | + dp.len, dd->ipath_ibmaxlen); |
792 | ret = -EINVAL; |
793 | - goto bail; /* before writing pbc */ |
794 | + goto bail; |
795 | } |
796 | + |
797 | + plen = sizeof(u32) + dp.len; |
798 | + |
799 | tmpbuf = vmalloc(plen); |
800 | if (!tmpbuf) { |
801 | dev_info(&dd->pcidev->dev, "Unable to allocate tmp buffer, " |
802 | @@ -473,11 +457,11 @@ static ssize_t ipath_diagpkt_write(struct file *fp, |
803 | */ |
804 | if (dd->ipath_flags & IPATH_PIO_FLUSH_WC) { |
805 | ipath_flush_wc(); |
806 | - __iowrite32_copy(piobuf + 2, tmpbuf, clen - 1); |
807 | + __iowrite32_copy(piobuf + 2, tmpbuf, plen - 1); |
808 | ipath_flush_wc(); |
809 | - __raw_writel(tmpbuf[clen - 1], piobuf + clen + 1); |
810 | + __raw_writel(tmpbuf[plen - 1], piobuf + plen + 1); |
811 | } else |
812 | - __iowrite32_copy(piobuf + 2, tmpbuf, clen); |
813 | + __iowrite32_copy(piobuf + 2, tmpbuf, plen); |
814 | |
815 | ipath_flush_wc(); |
816 | |
817 | diff --git a/drivers/infiniband/hw/mthca/mthca_provider.c b/drivers/infiniband/hw/mthca/mthca_provider.c |
818 | index 5b71d43bd89c..42dde06fdb91 100644 |
819 | --- a/drivers/infiniband/hw/mthca/mthca_provider.c |
820 | +++ b/drivers/infiniband/hw/mthca/mthca_provider.c |
821 | @@ -695,6 +695,7 @@ static struct ib_cq *mthca_create_cq(struct ib_device *ibdev, int entries, |
822 | |
823 | if (context && ib_copy_to_udata(udata, &cq->cqn, sizeof (__u32))) { |
824 | mthca_free_cq(to_mdev(ibdev), cq); |
825 | + err = -EFAULT; |
826 | goto err_free; |
827 | } |
828 | |
829 | diff --git a/drivers/infiniband/hw/nes/nes_verbs.c b/drivers/infiniband/hw/nes/nes_verbs.c |
830 | index 8f67fe2e91e6..7510a3c80757 100644 |
831 | --- a/drivers/infiniband/hw/nes/nes_verbs.c |
832 | +++ b/drivers/infiniband/hw/nes/nes_verbs.c |
833 | @@ -1186,7 +1186,7 @@ static struct ib_qp *nes_create_qp(struct ib_pd *ibpd, |
834 | nes_free_resource(nesadapter, nesadapter->allocated_qps, qp_num); |
835 | kfree(nesqp->allocated_buffer); |
836 | nes_debug(NES_DBG_QP, "ib_copy_from_udata() Failed \n"); |
837 | - return NULL; |
838 | + return ERR_PTR(-EFAULT); |
839 | } |
840 | if (req.user_wqe_buffers) { |
841 | virt_wqs = 1; |
842 | diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c |
843 | index 6c66a728a37f..64953dfa9d8a 100644 |
844 | --- a/drivers/infiniband/ulp/srpt/ib_srpt.c |
845 | +++ b/drivers/infiniband/ulp/srpt/ib_srpt.c |
846 | @@ -1078,6 +1078,7 @@ static void srpt_unmap_sg_to_ib_sge(struct srpt_rdma_ch *ch, |
847 | static int srpt_map_sg_to_ib_sge(struct srpt_rdma_ch *ch, |
848 | struct srpt_send_ioctx *ioctx) |
849 | { |
850 | + struct ib_device *dev = ch->sport->sdev->device; |
851 | struct se_cmd *cmd; |
852 | struct scatterlist *sg, *sg_orig; |
853 | int sg_cnt; |
854 | @@ -1124,7 +1125,7 @@ static int srpt_map_sg_to_ib_sge(struct srpt_rdma_ch *ch, |
855 | |
856 | db = ioctx->rbufs; |
857 | tsize = cmd->data_length; |
858 | - dma_len = sg_dma_len(&sg[0]); |
859 | + dma_len = ib_sg_dma_len(dev, &sg[0]); |
860 | riu = ioctx->rdma_ius; |
861 | |
862 | /* |
863 | @@ -1155,7 +1156,8 @@ static int srpt_map_sg_to_ib_sge(struct srpt_rdma_ch *ch, |
864 | ++j; |
865 | if (j < count) { |
866 | sg = sg_next(sg); |
867 | - dma_len = sg_dma_len(sg); |
868 | + dma_len = ib_sg_dma_len( |
869 | + dev, sg); |
870 | } |
871 | } |
872 | } else { |
873 | @@ -1192,8 +1194,8 @@ static int srpt_map_sg_to_ib_sge(struct srpt_rdma_ch *ch, |
874 | tsize = cmd->data_length; |
875 | riu = ioctx->rdma_ius; |
876 | sg = sg_orig; |
877 | - dma_len = sg_dma_len(&sg[0]); |
878 | - dma_addr = sg_dma_address(&sg[0]); |
879 | + dma_len = ib_sg_dma_len(dev, &sg[0]); |
880 | + dma_addr = ib_sg_dma_address(dev, &sg[0]); |
881 | |
882 | /* this second loop is really mapped sg_addres to rdma_iu->ib_sge */ |
883 | for (i = 0, j = 0; |
884 | @@ -1216,8 +1218,10 @@ static int srpt_map_sg_to_ib_sge(struct srpt_rdma_ch *ch, |
885 | ++j; |
886 | if (j < count) { |
887 | sg = sg_next(sg); |
888 | - dma_len = sg_dma_len(sg); |
889 | - dma_addr = sg_dma_address(sg); |
890 | + dma_len = ib_sg_dma_len( |
891 | + dev, sg); |
892 | + dma_addr = ib_sg_dma_address( |
893 | + dev, sg); |
894 | } |
895 | } |
896 | } else { |
897 | diff --git a/drivers/media/dvb-frontends/m88rs2000.c b/drivers/media/dvb-frontends/m88rs2000.c |
898 | index 02699c111019..c7a1c8eba475 100644 |
899 | --- a/drivers/media/dvb-frontends/m88rs2000.c |
900 | +++ b/drivers/media/dvb-frontends/m88rs2000.c |
901 | @@ -712,6 +712,22 @@ static int m88rs2000_get_frontend(struct dvb_frontend *fe) |
902 | return 0; |
903 | } |
904 | |
905 | +static int m88rs2000_get_tune_settings(struct dvb_frontend *fe, |
906 | + struct dvb_frontend_tune_settings *tune) |
907 | +{ |
908 | + struct dtv_frontend_properties *c = &fe->dtv_property_cache; |
909 | + |
910 | + if (c->symbol_rate > 3000000) |
911 | + tune->min_delay_ms = 2000; |
912 | + else |
913 | + tune->min_delay_ms = 3000; |
914 | + |
915 | + tune->step_size = c->symbol_rate / 16000; |
916 | + tune->max_drift = c->symbol_rate / 2000; |
917 | + |
918 | + return 0; |
919 | +} |
920 | + |
921 | static int m88rs2000_i2c_gate_ctrl(struct dvb_frontend *fe, int enable) |
922 | { |
923 | struct m88rs2000_state *state = fe->demodulator_priv; |
924 | @@ -743,7 +759,7 @@ static struct dvb_frontend_ops m88rs2000_ops = { |
925 | .symbol_rate_tolerance = 500, /* ppm */ |
926 | .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 | |
927 | FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | |
928 | - FE_CAN_QPSK | |
929 | + FE_CAN_QPSK | FE_CAN_INVERSION_AUTO | |
930 | FE_CAN_FEC_AUTO |
931 | }, |
932 | |
933 | @@ -763,6 +779,7 @@ static struct dvb_frontend_ops m88rs2000_ops = { |
934 | |
935 | .set_frontend = m88rs2000_set_frontend, |
936 | .get_frontend = m88rs2000_get_frontend, |
937 | + .get_tune_settings = m88rs2000_get_tune_settings, |
938 | }; |
939 | |
940 | struct dvb_frontend *m88rs2000_attach(const struct m88rs2000_config *config, |
941 | diff --git a/drivers/media/pci/saa7134/saa7134-cards.c b/drivers/media/pci/saa7134/saa7134-cards.c |
942 | index d45e7f6ff332..e87a734637a9 100644 |
943 | --- a/drivers/media/pci/saa7134/saa7134-cards.c |
944 | +++ b/drivers/media/pci/saa7134/saa7134-cards.c |
945 | @@ -8045,8 +8045,8 @@ int saa7134_board_init2(struct saa7134_dev *dev) |
946 | break; |
947 | } /* switch() */ |
948 | |
949 | - /* initialize tuner */ |
950 | - if (TUNER_ABSENT != dev->tuner_type) { |
951 | + /* initialize tuner (don't do this when resuming) */ |
952 | + if (!dev->insuspend && TUNER_ABSENT != dev->tuner_type) { |
953 | int has_demod = (dev->tda9887_conf & TDA9887_PRESENT); |
954 | |
955 | /* Note: radio tuner address is always filled in, |
956 | diff --git a/drivers/media/platform/omap3isp/isppreview.c b/drivers/media/platform/omap3isp/isppreview.c |
957 | index cd8831aebdeb..e2e4610d5550 100644 |
958 | --- a/drivers/media/platform/omap3isp/isppreview.c |
959 | +++ b/drivers/media/platform/omap3isp/isppreview.c |
960 | @@ -1079,6 +1079,7 @@ static void preview_config_input_format(struct isp_prev_device *prev, |
961 | */ |
962 | static void preview_config_input_size(struct isp_prev_device *prev, u32 active) |
963 | { |
964 | + const struct v4l2_mbus_framefmt *format = &prev->formats[PREV_PAD_SINK]; |
965 | struct isp_device *isp = to_isp_device(prev); |
966 | unsigned int sph = prev->crop.left; |
967 | unsigned int eph = prev->crop.left + prev->crop.width - 1; |
968 | @@ -1086,6 +1087,14 @@ static void preview_config_input_size(struct isp_prev_device *prev, u32 active) |
969 | unsigned int elv = prev->crop.top + prev->crop.height - 1; |
970 | u32 features; |
971 | |
972 | + if (format->code != V4L2_MBUS_FMT_Y8_1X8 && |
973 | + format->code != V4L2_MBUS_FMT_Y10_1X10) { |
974 | + sph -= 2; |
975 | + eph += 2; |
976 | + slv -= 2; |
977 | + elv += 2; |
978 | + } |
979 | + |
980 | features = (prev->params.params[0].features & active) |
981 | | (prev->params.params[1].features & ~active); |
982 | |
983 | diff --git a/drivers/media/usb/em28xx/em28xx-dvb.c b/drivers/media/usb/em28xx/em28xx-dvb.c |
984 | index b22f8fed8127..c4d669648dc7 100644 |
985 | --- a/drivers/media/usb/em28xx/em28xx-dvb.c |
986 | +++ b/drivers/media/usb/em28xx/em28xx-dvb.c |
987 | @@ -673,7 +673,8 @@ static void pctv_520e_init(struct em28xx *dev) |
988 | static int em28xx_pctv_290e_set_lna(struct dvb_frontend *fe) |
989 | { |
990 | struct dtv_frontend_properties *c = &fe->dtv_property_cache; |
991 | - struct em28xx *dev = fe->dvb->priv; |
992 | + struct em28xx_i2c_bus *i2c_bus = fe->dvb->priv; |
993 | + struct em28xx *dev = i2c_bus->dev; |
994 | #ifdef CONFIG_GPIOLIB |
995 | struct em28xx_dvb *dvb = dev->dvb; |
996 | int ret; |
997 | diff --git a/drivers/media/usb/gspca/sn9c20x.c b/drivers/media/usb/gspca/sn9c20x.c |
998 | index ead9a1f58513..8b59e5d37bae 100644 |
999 | --- a/drivers/media/usb/gspca/sn9c20x.c |
1000 | +++ b/drivers/media/usb/gspca/sn9c20x.c |
1001 | @@ -2394,6 +2394,7 @@ static const struct usb_device_id device_table[] = { |
1002 | {USB_DEVICE(0x045e, 0x00f4), SN9C20X(OV9650, 0x30, 0)}, |
1003 | {USB_DEVICE(0x145f, 0x013d), SN9C20X(OV7660, 0x21, 0)}, |
1004 | {USB_DEVICE(0x0458, 0x7029), SN9C20X(HV7131R, 0x11, 0)}, |
1005 | + {USB_DEVICE(0x0458, 0x7045), SN9C20X(MT9M112, 0x5d, LED_REVERSE)}, |
1006 | {USB_DEVICE(0x0458, 0x704a), SN9C20X(MT9M112, 0x5d, 0)}, |
1007 | {USB_DEVICE(0x0458, 0x704c), SN9C20X(MT9M112, 0x5d, 0)}, |
1008 | {USB_DEVICE(0xa168, 0x0610), SN9C20X(HV7131R, 0x11, 0)}, |
1009 | diff --git a/drivers/media/usb/uvc/uvc_video.c b/drivers/media/usb/uvc/uvc_video.c |
1010 | index 3394c3432011..e1c5bf3ea112 100644 |
1011 | --- a/drivers/media/usb/uvc/uvc_video.c |
1012 | +++ b/drivers/media/usb/uvc/uvc_video.c |
1013 | @@ -1846,7 +1846,25 @@ int uvc_video_enable(struct uvc_streaming *stream, int enable) |
1014 | |
1015 | if (!enable) { |
1016 | uvc_uninit_video(stream, 1); |
1017 | - usb_set_interface(stream->dev->udev, stream->intfnum, 0); |
1018 | + if (stream->intf->num_altsetting > 1) { |
1019 | + usb_set_interface(stream->dev->udev, |
1020 | + stream->intfnum, 0); |
1021 | + } else { |
1022 | + /* UVC doesn't specify how to inform a bulk-based device |
1023 | + * when the video stream is stopped. Windows sends a |
1024 | + * CLEAR_FEATURE(HALT) request to the video streaming |
1025 | + * bulk endpoint, mimic the same behaviour. |
1026 | + */ |
1027 | + unsigned int epnum = stream->header.bEndpointAddress |
1028 | + & USB_ENDPOINT_NUMBER_MASK; |
1029 | + unsigned int dir = stream->header.bEndpointAddress |
1030 | + & USB_ENDPOINT_DIR_MASK; |
1031 | + unsigned int pipe; |
1032 | + |
1033 | + pipe = usb_sndbulkpipe(stream->dev->udev, epnum) | dir; |
1034 | + usb_clear_halt(stream->dev->udev, pipe); |
1035 | + } |
1036 | + |
1037 | uvc_queue_enable(&stream->queue, 0); |
1038 | uvc_video_clock_cleanup(stream); |
1039 | return 0; |
1040 | diff --git a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c |
1041 | index f1295519f285..f56b729581e7 100644 |
1042 | --- a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c |
1043 | +++ b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c |
1044 | @@ -787,8 +787,8 @@ static int put_v4l2_subdev_edid32(struct v4l2_subdev_edid *kp, struct v4l2_subde |
1045 | #define VIDIOC_DQBUF32 _IOWR('V', 17, struct v4l2_buffer32) |
1046 | #define VIDIOC_ENUMSTD32 _IOWR('V', 25, struct v4l2_standard32) |
1047 | #define VIDIOC_ENUMINPUT32 _IOWR('V', 26, struct v4l2_input32) |
1048 | -#define VIDIOC_SUBDEV_G_EDID32 _IOWR('V', 63, struct v4l2_subdev_edid32) |
1049 | -#define VIDIOC_SUBDEV_S_EDID32 _IOWR('V', 64, struct v4l2_subdev_edid32) |
1050 | +#define VIDIOC_SUBDEV_G_EDID32 _IOWR('V', 40, struct v4l2_subdev_edid32) |
1051 | +#define VIDIOC_SUBDEV_S_EDID32 _IOWR('V', 41, struct v4l2_subdev_edid32) |
1052 | #define VIDIOC_TRY_FMT32 _IOWR('V', 64, struct v4l2_format32) |
1053 | #define VIDIOC_G_EXT_CTRLS32 _IOWR('V', 71, struct v4l2_ext_controls32) |
1054 | #define VIDIOC_S_EXT_CTRLS32 _IOWR('V', 72, struct v4l2_ext_controls32) |
1055 | diff --git a/drivers/mfd/88pm860x-core.c b/drivers/mfd/88pm860x-core.c |
1056 | index 31ca55548ef9..30cf7eef2a8f 100644 |
1057 | --- a/drivers/mfd/88pm860x-core.c |
1058 | +++ b/drivers/mfd/88pm860x-core.c |
1059 | @@ -1179,12 +1179,18 @@ static int pm860x_probe(struct i2c_client *client, |
1060 | chip->companion_addr = pdata->companion_addr; |
1061 | chip->companion = i2c_new_dummy(chip->client->adapter, |
1062 | chip->companion_addr); |
1063 | + if (!chip->companion) { |
1064 | + dev_err(&client->dev, |
1065 | + "Failed to allocate I2C companion device\n"); |
1066 | + return -ENODEV; |
1067 | + } |
1068 | chip->regmap_companion = regmap_init_i2c(chip->companion, |
1069 | &pm860x_regmap_config); |
1070 | if (IS_ERR(chip->regmap_companion)) { |
1071 | ret = PTR_ERR(chip->regmap_companion); |
1072 | dev_err(&chip->companion->dev, |
1073 | "Failed to allocate register map: %d\n", ret); |
1074 | + i2c_unregister_device(chip->companion); |
1075 | return ret; |
1076 | } |
1077 | i2c_set_clientdata(chip->companion, chip); |
1078 | diff --git a/drivers/mfd/max77686.c b/drivers/mfd/max77686.c |
1079 | index 8290c2382395..1b6f45a14109 100644 |
1080 | --- a/drivers/mfd/max77686.c |
1081 | +++ b/drivers/mfd/max77686.c |
1082 | @@ -121,6 +121,10 @@ static int max77686_i2c_probe(struct i2c_client *i2c, |
1083 | dev_info(max77686->dev, "device found\n"); |
1084 | |
1085 | max77686->rtc = i2c_new_dummy(i2c->adapter, I2C_ADDR_RTC); |
1086 | + if (!max77686->rtc) { |
1087 | + dev_err(max77686->dev, "Failed to allocate I2C device for RTC\n"); |
1088 | + return -ENODEV; |
1089 | + } |
1090 | i2c_set_clientdata(max77686->rtc, max77686); |
1091 | |
1092 | max77686_irq_init(max77686); |
1093 | diff --git a/drivers/mfd/max77693.c b/drivers/mfd/max77693.c |
1094 | index 9e60fed5ff82..299970f99588 100644 |
1095 | --- a/drivers/mfd/max77693.c |
1096 | +++ b/drivers/mfd/max77693.c |
1097 | @@ -149,9 +149,18 @@ static int max77693_i2c_probe(struct i2c_client *i2c, |
1098 | dev_info(max77693->dev, "device ID: 0x%x\n", reg_data); |
1099 | |
1100 | max77693->muic = i2c_new_dummy(i2c->adapter, I2C_ADDR_MUIC); |
1101 | + if (!max77693->muic) { |
1102 | + dev_err(max77693->dev, "Failed to allocate I2C device for MUIC\n"); |
1103 | + return -ENODEV; |
1104 | + } |
1105 | i2c_set_clientdata(max77693->muic, max77693); |
1106 | |
1107 | max77693->haptic = i2c_new_dummy(i2c->adapter, I2C_ADDR_HAPTIC); |
1108 | + if (!max77693->haptic) { |
1109 | + dev_err(max77693->dev, "Failed to allocate I2C device for Haptic\n"); |
1110 | + ret = -ENODEV; |
1111 | + goto err_i2c_haptic; |
1112 | + } |
1113 | i2c_set_clientdata(max77693->haptic, max77693); |
1114 | |
1115 | /* |
1116 | @@ -187,8 +196,9 @@ err_mfd: |
1117 | max77693_irq_exit(max77693); |
1118 | err_irq: |
1119 | err_regmap_muic: |
1120 | - i2c_unregister_device(max77693->muic); |
1121 | i2c_unregister_device(max77693->haptic); |
1122 | +err_i2c_haptic: |
1123 | + i2c_unregister_device(max77693->muic); |
1124 | return ret; |
1125 | } |
1126 | |
1127 | diff --git a/drivers/mfd/max8925-i2c.c b/drivers/mfd/max8925-i2c.c |
1128 | index 92bbebd31598..c94d3337bdfd 100644 |
1129 | --- a/drivers/mfd/max8925-i2c.c |
1130 | +++ b/drivers/mfd/max8925-i2c.c |
1131 | @@ -180,9 +180,18 @@ static int max8925_probe(struct i2c_client *client, |
1132 | mutex_init(&chip->io_lock); |
1133 | |
1134 | chip->rtc = i2c_new_dummy(chip->i2c->adapter, RTC_I2C_ADDR); |
1135 | + if (!chip->rtc) { |
1136 | + dev_err(chip->dev, "Failed to allocate I2C device for RTC\n"); |
1137 | + return -ENODEV; |
1138 | + } |
1139 | i2c_set_clientdata(chip->rtc, chip); |
1140 | |
1141 | chip->adc = i2c_new_dummy(chip->i2c->adapter, ADC_I2C_ADDR); |
1142 | + if (!chip->adc) { |
1143 | + dev_err(chip->dev, "Failed to allocate I2C device for ADC\n"); |
1144 | + i2c_unregister_device(chip->rtc); |
1145 | + return -ENODEV; |
1146 | + } |
1147 | i2c_set_clientdata(chip->adc, chip); |
1148 | |
1149 | device_init_wakeup(&client->dev, 1); |
1150 | diff --git a/drivers/mfd/max8997.c b/drivers/mfd/max8997.c |
1151 | index 14714058f2d2..ea1defbcf2cb 100644 |
1152 | --- a/drivers/mfd/max8997.c |
1153 | +++ b/drivers/mfd/max8997.c |
1154 | @@ -218,10 +218,26 @@ static int max8997_i2c_probe(struct i2c_client *i2c, |
1155 | mutex_init(&max8997->iolock); |
1156 | |
1157 | max8997->rtc = i2c_new_dummy(i2c->adapter, I2C_ADDR_RTC); |
1158 | + if (!max8997->rtc) { |
1159 | + dev_err(max8997->dev, "Failed to allocate I2C device for RTC\n"); |
1160 | + return -ENODEV; |
1161 | + } |
1162 | i2c_set_clientdata(max8997->rtc, max8997); |
1163 | + |
1164 | max8997->haptic = i2c_new_dummy(i2c->adapter, I2C_ADDR_HAPTIC); |
1165 | + if (!max8997->haptic) { |
1166 | + dev_err(max8997->dev, "Failed to allocate I2C device for Haptic\n"); |
1167 | + ret = -ENODEV; |
1168 | + goto err_i2c_haptic; |
1169 | + } |
1170 | i2c_set_clientdata(max8997->haptic, max8997); |
1171 | + |
1172 | max8997->muic = i2c_new_dummy(i2c->adapter, I2C_ADDR_MUIC); |
1173 | + if (!max8997->muic) { |
1174 | + dev_err(max8997->dev, "Failed to allocate I2C device for MUIC\n"); |
1175 | + ret = -ENODEV; |
1176 | + goto err_i2c_muic; |
1177 | + } |
1178 | i2c_set_clientdata(max8997->muic, max8997); |
1179 | |
1180 | pm_runtime_set_active(max8997->dev); |
1181 | @@ -248,7 +264,9 @@ static int max8997_i2c_probe(struct i2c_client *i2c, |
1182 | err_mfd: |
1183 | mfd_remove_devices(max8997->dev); |
1184 | i2c_unregister_device(max8997->muic); |
1185 | +err_i2c_muic: |
1186 | i2c_unregister_device(max8997->haptic); |
1187 | +err_i2c_haptic: |
1188 | i2c_unregister_device(max8997->rtc); |
1189 | err: |
1190 | kfree(max8997); |
1191 | diff --git a/drivers/mfd/max8998.c b/drivers/mfd/max8998.c |
1192 | index d7218cc90945..8381a76c69c0 100644 |
1193 | --- a/drivers/mfd/max8998.c |
1194 | +++ b/drivers/mfd/max8998.c |
1195 | @@ -152,6 +152,10 @@ static int max8998_i2c_probe(struct i2c_client *i2c, |
1196 | mutex_init(&max8998->iolock); |
1197 | |
1198 | max8998->rtc = i2c_new_dummy(i2c->adapter, RTC_I2C_ADDR); |
1199 | + if (!max8998->rtc) { |
1200 | + dev_err(&i2c->dev, "Failed to allocate I2C device for RTC\n"); |
1201 | + return -ENODEV; |
1202 | + } |
1203 | i2c_set_clientdata(max8998->rtc, max8998); |
1204 | |
1205 | max8998_irq_init(max8998); |
1206 | diff --git a/drivers/mfd/sec-core.c b/drivers/mfd/sec-core.c |
1207 | index 77ee26ef5941..81cfe8817fe0 100644 |
1208 | --- a/drivers/mfd/sec-core.c |
1209 | +++ b/drivers/mfd/sec-core.c |
1210 | @@ -199,6 +199,10 @@ static int sec_pmic_probe(struct i2c_client *i2c, |
1211 | } |
1212 | |
1213 | sec_pmic->rtc = i2c_new_dummy(i2c->adapter, RTC_I2C_ADDR); |
1214 | + if (!sec_pmic->rtc) { |
1215 | + dev_err(&i2c->dev, "Failed to allocate I2C for RTC\n"); |
1216 | + return -ENODEV; |
1217 | + } |
1218 | i2c_set_clientdata(sec_pmic->rtc, sec_pmic); |
1219 | |
1220 | if (pdata && pdata->cfg_pmic_irq) |
1221 | diff --git a/drivers/mfd/tps65910.c b/drivers/mfd/tps65910.c |
1222 | index d79277204835..de87eafbeb05 100644 |
1223 | --- a/drivers/mfd/tps65910.c |
1224 | +++ b/drivers/mfd/tps65910.c |
1225 | @@ -254,8 +254,10 @@ static int tps65910_irq_init(struct tps65910 *tps65910, int irq, |
1226 | ret = regmap_add_irq_chip(tps65910->regmap, tps65910->chip_irq, |
1227 | IRQF_ONESHOT, pdata->irq_base, |
1228 | tps6591x_irqs_chip, &tps65910->irq_data); |
1229 | - if (ret < 0) |
1230 | + if (ret < 0) { |
1231 | dev_warn(tps65910->dev, "Failed to add irq_chip %d\n", ret); |
1232 | + tps65910->chip_irq = 0; |
1233 | + } |
1234 | return ret; |
1235 | } |
1236 | |
1237 | diff --git a/drivers/misc/mei/hw-me-regs.h b/drivers/misc/mei/hw-me-regs.h |
1238 | index 66f411a6e8ea..cabc04383685 100644 |
1239 | --- a/drivers/misc/mei/hw-me-regs.h |
1240 | +++ b/drivers/misc/mei/hw-me-regs.h |
1241 | @@ -115,6 +115,11 @@ |
1242 | #define MEI_DEV_ID_LPT_HR 0x8CBA /* Lynx Point H Refresh */ |
1243 | |
1244 | #define MEI_DEV_ID_WPT_LP 0x9CBA /* Wildcat Point LP */ |
1245 | + |
1246 | +/* Host Firmware Status Registers in PCI Config Space */ |
1247 | +#define PCI_CFG_HFS_1 0x40 |
1248 | +#define PCI_CFG_HFS_2 0x48 |
1249 | + |
1250 | /* |
1251 | * MEI HW Section |
1252 | */ |
1253 | diff --git a/drivers/misc/mei/pci-me.c b/drivers/misc/mei/pci-me.c |
1254 | index 371c65ae6be6..3c9e257982e3 100644 |
1255 | --- a/drivers/misc/mei/pci-me.c |
1256 | +++ b/drivers/misc/mei/pci-me.c |
1257 | @@ -105,15 +105,31 @@ static bool mei_me_quirk_probe(struct pci_dev *pdev, |
1258 | const struct pci_device_id *ent) |
1259 | { |
1260 | u32 reg; |
1261 | - if (ent->device == MEI_DEV_ID_PBG_1) { |
1262 | - pci_read_config_dword(pdev, 0x48, ®); |
1263 | - /* make sure that bit 9 is up and bit 10 is down */ |
1264 | - if ((reg & 0x600) == 0x200) { |
1265 | - dev_info(&pdev->dev, "Device doesn't have valid ME Interface\n"); |
1266 | - return false; |
1267 | - } |
1268 | + /* Cougar Point || Patsburg */ |
1269 | + if (ent->device == MEI_DEV_ID_CPT_1 || |
1270 | + ent->device == MEI_DEV_ID_PBG_1) { |
1271 | + pci_read_config_dword(pdev, PCI_CFG_HFS_2, ®); |
1272 | + /* make sure that bit 9 (NM) is up and bit 10 (DM) is down */ |
1273 | + if ((reg & 0x600) == 0x200) |
1274 | + goto no_mei; |
1275 | } |
1276 | + |
1277 | + /* Lynx Point */ |
1278 | + if (ent->device == MEI_DEV_ID_LPT_H || |
1279 | + ent->device == MEI_DEV_ID_LPT_W || |
1280 | + ent->device == MEI_DEV_ID_LPT_HR) { |
1281 | + /* Read ME FW Status check for SPS Firmware */ |
1282 | + pci_read_config_dword(pdev, PCI_CFG_HFS_1, ®); |
1283 | + /* if bits [19:16] = 15, running SPS Firmware */ |
1284 | + if ((reg & 0xf0000) == 0xf0000) |
1285 | + goto no_mei; |
1286 | + } |
1287 | + |
1288 | return true; |
1289 | + |
1290 | +no_mei: |
1291 | + dev_info(&pdev->dev, "Device doesn't have valid ME Interface\n"); |
1292 | + return false; |
1293 | } |
1294 | /** |
1295 | * mei_probe - Device Initialization Routine |
1296 | diff --git a/drivers/s390/char/con3215.c b/drivers/s390/char/con3215.c |
1297 | index eb5d22795c47..bb86494e2b7b 100644 |
1298 | --- a/drivers/s390/char/con3215.c |
1299 | +++ b/drivers/s390/char/con3215.c |
1300 | @@ -922,7 +922,7 @@ static int __init con3215_init(void) |
1301 | raw3215_freelist = req; |
1302 | } |
1303 | |
1304 | - cdev = ccw_device_probe_console(); |
1305 | + cdev = ccw_device_probe_console(&raw3215_ccw_driver); |
1306 | if (IS_ERR(cdev)) |
1307 | return -ENODEV; |
1308 | |
1309 | diff --git a/drivers/s390/char/con3270.c b/drivers/s390/char/con3270.c |
1310 | index 699fd3e363df..bb6b0df50b33 100644 |
1311 | --- a/drivers/s390/char/con3270.c |
1312 | +++ b/drivers/s390/char/con3270.c |
1313 | @@ -576,7 +576,6 @@ static struct console con3270 = { |
1314 | static int __init |
1315 | con3270_init(void) |
1316 | { |
1317 | - struct ccw_device *cdev; |
1318 | struct raw3270 *rp; |
1319 | void *cbuf; |
1320 | int i; |
1321 | @@ -591,10 +590,7 @@ con3270_init(void) |
1322 | cpcmd("TERM AUTOCR OFF", NULL, 0, NULL); |
1323 | } |
1324 | |
1325 | - cdev = ccw_device_probe_console(); |
1326 | - if (IS_ERR(cdev)) |
1327 | - return -ENODEV; |
1328 | - rp = raw3270_setup_console(cdev); |
1329 | + rp = raw3270_setup_console(); |
1330 | if (IS_ERR(rp)) |
1331 | return PTR_ERR(rp); |
1332 | |
1333 | diff --git a/drivers/s390/char/raw3270.c b/drivers/s390/char/raw3270.c |
1334 | index 24a08e8f19e1..651d1f5da7c4 100644 |
1335 | --- a/drivers/s390/char/raw3270.c |
1336 | +++ b/drivers/s390/char/raw3270.c |
1337 | @@ -776,16 +776,24 @@ raw3270_setup_device(struct ccw_device *cdev, struct raw3270 *rp, char *ascebc) |
1338 | } |
1339 | |
1340 | #ifdef CONFIG_TN3270_CONSOLE |
1341 | +/* Tentative definition - see below for actual definition. */ |
1342 | +static struct ccw_driver raw3270_ccw_driver; |
1343 | + |
1344 | /* |
1345 | * Setup 3270 device configured as console. |
1346 | */ |
1347 | -struct raw3270 __init *raw3270_setup_console(struct ccw_device *cdev) |
1348 | +struct raw3270 __init *raw3270_setup_console(void) |
1349 | { |
1350 | + struct ccw_device *cdev; |
1351 | unsigned long flags; |
1352 | struct raw3270 *rp; |
1353 | char *ascebc; |
1354 | int rc; |
1355 | |
1356 | + cdev = ccw_device_probe_console(&raw3270_ccw_driver); |
1357 | + if (IS_ERR(cdev)) |
1358 | + return ERR_CAST(cdev); |
1359 | + |
1360 | rp = kzalloc(sizeof(struct raw3270), GFP_KERNEL | GFP_DMA); |
1361 | ascebc = kzalloc(256, GFP_KERNEL); |
1362 | rc = raw3270_setup_device(cdev, rp, ascebc); |
1363 | diff --git a/drivers/s390/char/raw3270.h b/drivers/s390/char/raw3270.h |
1364 | index 7b73ff8c1bd7..359276a88396 100644 |
1365 | --- a/drivers/s390/char/raw3270.h |
1366 | +++ b/drivers/s390/char/raw3270.h |
1367 | @@ -190,7 +190,7 @@ raw3270_put_view(struct raw3270_view *view) |
1368 | wake_up(&raw3270_wait_queue); |
1369 | } |
1370 | |
1371 | -struct raw3270 *raw3270_setup_console(struct ccw_device *cdev); |
1372 | +struct raw3270 *raw3270_setup_console(void); |
1373 | void raw3270_wait_cons_dev(struct raw3270 *); |
1374 | |
1375 | /* Notifier for device addition/removal */ |
1376 | diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c |
1377 | index 1ab5f6c36d9b..8d04a9a88cc4 100644 |
1378 | --- a/drivers/s390/cio/device.c |
1379 | +++ b/drivers/s390/cio/device.c |
1380 | @@ -1610,7 +1610,7 @@ out_unlock: |
1381 | return rc; |
1382 | } |
1383 | |
1384 | -struct ccw_device *ccw_device_probe_console(void) |
1385 | +struct ccw_device *ccw_device_probe_console(struct ccw_driver *drv) |
1386 | { |
1387 | struct io_subchannel_private *io_priv; |
1388 | struct ccw_device *cdev; |
1389 | @@ -1632,6 +1632,7 @@ struct ccw_device *ccw_device_probe_console(void) |
1390 | kfree(io_priv); |
1391 | return cdev; |
1392 | } |
1393 | + cdev->drv = drv; |
1394 | set_io_private(sch, io_priv); |
1395 | ret = ccw_device_console_enable(cdev, sch); |
1396 | if (ret) { |
1397 | diff --git a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c |
1398 | index 278c9fa62067..1822cb9ec623 100644 |
1399 | --- a/drivers/scsi/arcmsr/arcmsr_hba.c |
1400 | +++ b/drivers/scsi/arcmsr/arcmsr_hba.c |
1401 | @@ -2501,16 +2501,15 @@ static int arcmsr_polling_ccbdone(struct AdapterControlBlock *acb, |
1402 | static int arcmsr_iop_confirm(struct AdapterControlBlock *acb) |
1403 | { |
1404 | uint32_t cdb_phyaddr, cdb_phyaddr_hi32; |
1405 | - dma_addr_t dma_coherent_handle; |
1406 | + |
1407 | /* |
1408 | ******************************************************************** |
1409 | ** here we need to tell iop 331 our freeccb.HighPart |
1410 | ** if freeccb.HighPart is not zero |
1411 | ******************************************************************** |
1412 | */ |
1413 | - dma_coherent_handle = acb->dma_coherent_handle; |
1414 | - cdb_phyaddr = (uint32_t)(dma_coherent_handle); |
1415 | - cdb_phyaddr_hi32 = (uint32_t)((cdb_phyaddr >> 16) >> 16); |
1416 | + cdb_phyaddr = lower_32_bits(acb->dma_coherent_handle); |
1417 | + cdb_phyaddr_hi32 = upper_32_bits(acb->dma_coherent_handle); |
1418 | acb->cdb_phyaddr_hi32 = cdb_phyaddr_hi32; |
1419 | /* |
1420 | *********************************************************************** |
1421 | diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c |
1422 | index ad72c1d85111..66c495d21016 100644 |
1423 | --- a/drivers/scsi/qla2xxx/qla_os.c |
1424 | +++ b/drivers/scsi/qla2xxx/qla_os.c |
1425 | @@ -2553,7 +2553,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) |
1426 | ha->flags.enable_64bit_addressing ? "enable" : |
1427 | "disable"); |
1428 | ret = qla2x00_mem_alloc(ha, req_length, rsp_length, &req, &rsp); |
1429 | - if (!ret) { |
1430 | + if (ret) { |
1431 | ql_log_pci(ql_log_fatal, pdev, 0x0031, |
1432 | "Failed to allocate memory for adapter, aborting.\n"); |
1433 | |
1434 | @@ -3458,10 +3458,10 @@ qla2x00_mem_alloc(struct qla_hw_data *ha, uint16_t req_len, uint16_t rsp_len, |
1435 | else { |
1436 | qla2x00_set_reserved_loop_ids(ha); |
1437 | ql_dbg_pci(ql_dbg_init, ha->pdev, 0x0123, |
1438 | - "loop_id_map=%p. \n", ha->loop_id_map); |
1439 | + "loop_id_map=%p.\n", ha->loop_id_map); |
1440 | } |
1441 | |
1442 | - return 1; |
1443 | + return 0; |
1444 | |
1445 | fail_async_pd: |
1446 | dma_pool_free(ha->s_dma_pool, ha->ex_init_cb, ha->ex_init_cb_dma); |
1447 | diff --git a/drivers/staging/rtl8712/rtl871x_recv.c b/drivers/staging/rtl8712/rtl871x_recv.c |
1448 | index 23ec684b60e1..274c359279ef 100644 |
1449 | --- a/drivers/staging/rtl8712/rtl871x_recv.c |
1450 | +++ b/drivers/staging/rtl8712/rtl871x_recv.c |
1451 | @@ -254,7 +254,7 @@ union recv_frame *r8712_portctrl(struct _adapter *adapter, |
1452 | struct sta_info *psta; |
1453 | struct sta_priv *pstapriv; |
1454 | union recv_frame *prtnframe; |
1455 | - u16 ether_type = 0; |
1456 | + u16 ether_type; |
1457 | |
1458 | pstapriv = &adapter->stapriv; |
1459 | ptr = get_recvframe_data(precv_frame); |
1460 | @@ -263,15 +263,14 @@ union recv_frame *r8712_portctrl(struct _adapter *adapter, |
1461 | psta = r8712_get_stainfo(pstapriv, psta_addr); |
1462 | auth_alg = adapter->securitypriv.AuthAlgrthm; |
1463 | if (auth_alg == 2) { |
1464 | + /* get ether_type */ |
1465 | + ptr = ptr + pfhdr->attrib.hdrlen + LLC_HEADER_SIZE; |
1466 | + memcpy(ðer_type, ptr, 2); |
1467 | + ether_type = ntohs((unsigned short)ether_type); |
1468 | + |
1469 | if ((psta != NULL) && (psta->ieee8021x_blocked)) { |
1470 | /* blocked |
1471 | * only accept EAPOL frame */ |
1472 | - prtnframe = precv_frame; |
1473 | - /*get ether_type */ |
1474 | - ptr = ptr + pfhdr->attrib.hdrlen + |
1475 | - pfhdr->attrib.iv_len + LLC_HEADER_SIZE; |
1476 | - memcpy(ðer_type, ptr, 2); |
1477 | - ether_type = ntohs((unsigned short)ether_type); |
1478 | if (ether_type == 0x888e) |
1479 | prtnframe = precv_frame; |
1480 | else { |
1481 | diff --git a/drivers/staging/serqt_usb2/serqt_usb2.c b/drivers/staging/serqt_usb2/serqt_usb2.c |
1482 | index 8a6e5ea476e1..380d9d707109 100644 |
1483 | --- a/drivers/staging/serqt_usb2/serqt_usb2.c |
1484 | +++ b/drivers/staging/serqt_usb2/serqt_usb2.c |
1485 | @@ -725,7 +725,7 @@ static int qt_startup(struct usb_serial *serial) |
1486 | goto startup_error; |
1487 | } |
1488 | |
1489 | - switch (serial->dev->descriptor.idProduct) { |
1490 | + switch (le16_to_cpu(serial->dev->descriptor.idProduct)) { |
1491 | case QUATECH_DSU100: |
1492 | case QUATECH_QSU100: |
1493 | case QUATECH_ESU100A: |
1494 | diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c |
1495 | index 5232ac7b0745..58c479d13b57 100644 |
1496 | --- a/drivers/target/iscsi/iscsi_target.c |
1497 | +++ b/drivers/target/iscsi/iscsi_target.c |
1498 | @@ -2454,6 +2454,7 @@ static void iscsit_build_conn_drop_async_message(struct iscsi_conn *conn) |
1499 | { |
1500 | struct iscsi_cmd *cmd; |
1501 | struct iscsi_conn *conn_p; |
1502 | + bool found = false; |
1503 | |
1504 | /* |
1505 | * Only send a Asynchronous Message on connections whos network |
1506 | @@ -2462,11 +2463,12 @@ static void iscsit_build_conn_drop_async_message(struct iscsi_conn *conn) |
1507 | list_for_each_entry(conn_p, &conn->sess->sess_conn_list, conn_list) { |
1508 | if (conn_p->conn_state == TARG_CONN_STATE_LOGGED_IN) { |
1509 | iscsit_inc_conn_usage_count(conn_p); |
1510 | + found = true; |
1511 | break; |
1512 | } |
1513 | } |
1514 | |
1515 | - if (!conn_p) |
1516 | + if (!found) |
1517 | return; |
1518 | |
1519 | cmd = iscsit_allocate_cmd(conn_p, GFP_ATOMIC); |
1520 | diff --git a/drivers/target/tcm_fc/tfc_sess.c b/drivers/target/tcm_fc/tfc_sess.c |
1521 | index 4859505ae2ed..639fdb395fb7 100644 |
1522 | --- a/drivers/target/tcm_fc/tfc_sess.c |
1523 | +++ b/drivers/target/tcm_fc/tfc_sess.c |
1524 | @@ -68,6 +68,7 @@ static struct ft_tport *ft_tport_create(struct fc_lport *lport) |
1525 | |
1526 | if (tport) { |
1527 | tport->tpg = tpg; |
1528 | + tpg->tport = tport; |
1529 | return tport; |
1530 | } |
1531 | |
1532 | diff --git a/drivers/tty/hvc/hvc_console.c b/drivers/tty/hvc/hvc_console.c |
1533 | index eb255e807c06..a2a2645b296c 100644 |
1534 | --- a/drivers/tty/hvc/hvc_console.c |
1535 | +++ b/drivers/tty/hvc/hvc_console.c |
1536 | @@ -31,6 +31,7 @@ |
1537 | #include <linux/list.h> |
1538 | #include <linux/module.h> |
1539 | #include <linux/major.h> |
1540 | +#include <linux/atomic.h> |
1541 | #include <linux/sysrq.h> |
1542 | #include <linux/tty.h> |
1543 | #include <linux/tty_flip.h> |
1544 | @@ -70,6 +71,9 @@ static struct task_struct *hvc_task; |
1545 | /* Picks up late kicks after list walk but before schedule() */ |
1546 | static int hvc_kicked; |
1547 | |
1548 | +/* hvc_init is triggered from hvc_alloc, i.e. only when actually used */ |
1549 | +static atomic_t hvc_needs_init __read_mostly = ATOMIC_INIT(-1); |
1550 | + |
1551 | static int hvc_init(void); |
1552 | |
1553 | #ifdef CONFIG_MAGIC_SYSRQ |
1554 | @@ -842,7 +846,7 @@ struct hvc_struct *hvc_alloc(uint32_t vtermno, int data, |
1555 | int i; |
1556 | |
1557 | /* We wait until a driver actually comes along */ |
1558 | - if (!hvc_driver) { |
1559 | + if (atomic_inc_not_zero(&hvc_needs_init)) { |
1560 | int err = hvc_init(); |
1561 | if (err) |
1562 | return ERR_PTR(err); |
1563 | diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c |
1564 | index 6eab440e1542..4ed35231e552 100644 |
1565 | --- a/drivers/usb/core/driver.c |
1566 | +++ b/drivers/usb/core/driver.c |
1567 | @@ -953,8 +953,7 @@ EXPORT_SYMBOL_GPL(usb_deregister); |
1568 | * it doesn't support pre_reset/post_reset/reset_resume or |
1569 | * because it doesn't support suspend/resume. |
1570 | * |
1571 | - * The caller must hold @intf's device's lock, but not its pm_mutex |
1572 | - * and not @intf->dev.sem. |
1573 | + * The caller must hold @intf's device's lock, but not @intf's lock. |
1574 | */ |
1575 | void usb_forced_unbind_intf(struct usb_interface *intf) |
1576 | { |
1577 | @@ -967,16 +966,37 @@ void usb_forced_unbind_intf(struct usb_interface *intf) |
1578 | intf->needs_binding = 1; |
1579 | } |
1580 | |
1581 | +/* |
1582 | + * Unbind drivers for @udev's marked interfaces. These interfaces have |
1583 | + * the needs_binding flag set, for example by usb_resume_interface(). |
1584 | + * |
1585 | + * The caller must hold @udev's device lock. |
1586 | + */ |
1587 | +static void unbind_marked_interfaces(struct usb_device *udev) |
1588 | +{ |
1589 | + struct usb_host_config *config; |
1590 | + int i; |
1591 | + struct usb_interface *intf; |
1592 | + |
1593 | + config = udev->actconfig; |
1594 | + if (config) { |
1595 | + for (i = 0; i < config->desc.bNumInterfaces; ++i) { |
1596 | + intf = config->interface[i]; |
1597 | + if (intf->dev.driver && intf->needs_binding) |
1598 | + usb_forced_unbind_intf(intf); |
1599 | + } |
1600 | + } |
1601 | +} |
1602 | + |
1603 | /* Delayed forced unbinding of a USB interface driver and scan |
1604 | * for rebinding. |
1605 | * |
1606 | - * The caller must hold @intf's device's lock, but not its pm_mutex |
1607 | - * and not @intf->dev.sem. |
1608 | + * The caller must hold @intf's device's lock, but not @intf's lock. |
1609 | * |
1610 | * Note: Rebinds will be skipped if a system sleep transition is in |
1611 | * progress and the PM "complete" callback hasn't occurred yet. |
1612 | */ |
1613 | -void usb_rebind_intf(struct usb_interface *intf) |
1614 | +static void usb_rebind_intf(struct usb_interface *intf) |
1615 | { |
1616 | int rc; |
1617 | |
1618 | @@ -993,68 +1013,66 @@ void usb_rebind_intf(struct usb_interface *intf) |
1619 | } |
1620 | } |
1621 | |
1622 | -#ifdef CONFIG_PM |
1623 | - |
1624 | -/* Unbind drivers for @udev's interfaces that don't support suspend/resume |
1625 | - * There is no check for reset_resume here because it can be determined |
1626 | - * only during resume whether reset_resume is needed. |
1627 | +/* |
1628 | + * Rebind drivers to @udev's marked interfaces. These interfaces have |
1629 | + * the needs_binding flag set. |
1630 | * |
1631 | * The caller must hold @udev's device lock. |
1632 | */ |
1633 | -static void unbind_no_pm_drivers_interfaces(struct usb_device *udev) |
1634 | +static void rebind_marked_interfaces(struct usb_device *udev) |
1635 | { |
1636 | struct usb_host_config *config; |
1637 | int i; |
1638 | struct usb_interface *intf; |
1639 | - struct usb_driver *drv; |
1640 | |
1641 | config = udev->actconfig; |
1642 | if (config) { |
1643 | for (i = 0; i < config->desc.bNumInterfaces; ++i) { |
1644 | intf = config->interface[i]; |
1645 | - |
1646 | - if (intf->dev.driver) { |
1647 | - drv = to_usb_driver(intf->dev.driver); |
1648 | - if (!drv->suspend || !drv->resume) |
1649 | - usb_forced_unbind_intf(intf); |
1650 | - } |
1651 | + if (intf->needs_binding) |
1652 | + usb_rebind_intf(intf); |
1653 | } |
1654 | } |
1655 | } |
1656 | |
1657 | -/* Unbind drivers for @udev's interfaces that failed to support reset-resume. |
1658 | - * These interfaces have the needs_binding flag set by usb_resume_interface(). |
1659 | +/* |
1660 | + * Unbind all of @udev's marked interfaces and then rebind all of them. |
1661 | + * This ordering is necessary because some drivers claim several interfaces |
1662 | + * when they are first probed. |
1663 | * |
1664 | * The caller must hold @udev's device lock. |
1665 | */ |
1666 | -static void unbind_no_reset_resume_drivers_interfaces(struct usb_device *udev) |
1667 | +void usb_unbind_and_rebind_marked_interfaces(struct usb_device *udev) |
1668 | { |
1669 | - struct usb_host_config *config; |
1670 | - int i; |
1671 | - struct usb_interface *intf; |
1672 | - |
1673 | - config = udev->actconfig; |
1674 | - if (config) { |
1675 | - for (i = 0; i < config->desc.bNumInterfaces; ++i) { |
1676 | - intf = config->interface[i]; |
1677 | - if (intf->dev.driver && intf->needs_binding) |
1678 | - usb_forced_unbind_intf(intf); |
1679 | - } |
1680 | - } |
1681 | + unbind_marked_interfaces(udev); |
1682 | + rebind_marked_interfaces(udev); |
1683 | } |
1684 | |
1685 | -static void do_rebind_interfaces(struct usb_device *udev) |
1686 | +#ifdef CONFIG_PM |
1687 | + |
1688 | +/* Unbind drivers for @udev's interfaces that don't support suspend/resume |
1689 | + * There is no check for reset_resume here because it can be determined |
1690 | + * only during resume whether reset_resume is needed. |
1691 | + * |
1692 | + * The caller must hold @udev's device lock. |
1693 | + */ |
1694 | +static void unbind_no_pm_drivers_interfaces(struct usb_device *udev) |
1695 | { |
1696 | struct usb_host_config *config; |
1697 | int i; |
1698 | struct usb_interface *intf; |
1699 | + struct usb_driver *drv; |
1700 | |
1701 | config = udev->actconfig; |
1702 | if (config) { |
1703 | for (i = 0; i < config->desc.bNumInterfaces; ++i) { |
1704 | intf = config->interface[i]; |
1705 | - if (intf->needs_binding) |
1706 | - usb_rebind_intf(intf); |
1707 | + |
1708 | + if (intf->dev.driver) { |
1709 | + drv = to_usb_driver(intf->dev.driver); |
1710 | + if (!drv->suspend || !drv->resume) |
1711 | + usb_forced_unbind_intf(intf); |
1712 | + } |
1713 | } |
1714 | } |
1715 | } |
1716 | @@ -1379,7 +1397,7 @@ int usb_resume_complete(struct device *dev) |
1717 | * whose needs_binding flag is set |
1718 | */ |
1719 | if (udev->state != USB_STATE_NOTATTACHED) |
1720 | - do_rebind_interfaces(udev); |
1721 | + rebind_marked_interfaces(udev); |
1722 | return 0; |
1723 | } |
1724 | |
1725 | @@ -1401,7 +1419,7 @@ int usb_resume(struct device *dev, pm_message_t msg) |
1726 | pm_runtime_disable(dev); |
1727 | pm_runtime_set_active(dev); |
1728 | pm_runtime_enable(dev); |
1729 | - unbind_no_reset_resume_drivers_interfaces(udev); |
1730 | + unbind_marked_interfaces(udev); |
1731 | } |
1732 | |
1733 | /* Avoid PM error messages for devices disconnected while suspended |
1734 | diff --git a/drivers/usb/core/hcd-pci.c b/drivers/usb/core/hcd-pci.c |
1735 | index caeb8d6d39fb..4676917e2b1f 100644 |
1736 | --- a/drivers/usb/core/hcd-pci.c |
1737 | +++ b/drivers/usb/core/hcd-pci.c |
1738 | @@ -75,7 +75,7 @@ static void for_each_companion(struct pci_dev *pdev, struct usb_hcd *hcd, |
1739 | PCI_SLOT(companion->devfn) != slot) |
1740 | continue; |
1741 | companion_hcd = pci_get_drvdata(companion); |
1742 | - if (!companion_hcd) |
1743 | + if (!companion_hcd || !companion_hcd->self.root_hub) |
1744 | continue; |
1745 | fn(pdev, hcd, companion, companion_hcd); |
1746 | } |
1747 | diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c |
1748 | index 3a2eb4cc8959..a036e03ae1b3 100644 |
1749 | --- a/drivers/usb/core/hub.c |
1750 | +++ b/drivers/usb/core/hub.c |
1751 | @@ -5252,10 +5252,11 @@ int usb_reset_device(struct usb_device *udev) |
1752 | else if (cintf->condition == |
1753 | USB_INTERFACE_BOUND) |
1754 | rebind = 1; |
1755 | + if (rebind) |
1756 | + cintf->needs_binding = 1; |
1757 | } |
1758 | - if (ret == 0 && rebind) |
1759 | - usb_rebind_intf(cintf); |
1760 | } |
1761 | + usb_unbind_and_rebind_marked_interfaces(udev); |
1762 | } |
1763 | |
1764 | usb_autosuspend_device(udev); |
1765 | diff --git a/drivers/usb/core/usb.h b/drivers/usb/core/usb.h |
1766 | index 823857767a16..0923add72b59 100644 |
1767 | --- a/drivers/usb/core/usb.h |
1768 | +++ b/drivers/usb/core/usb.h |
1769 | @@ -55,7 +55,7 @@ extern int usb_match_one_id_intf(struct usb_device *dev, |
1770 | extern int usb_match_device(struct usb_device *dev, |
1771 | const struct usb_device_id *id); |
1772 | extern void usb_forced_unbind_intf(struct usb_interface *intf); |
1773 | -extern void usb_rebind_intf(struct usb_interface *intf); |
1774 | +extern void usb_unbind_and_rebind_marked_interfaces(struct usb_device *udev); |
1775 | |
1776 | extern int usb_hub_claim_port(struct usb_device *hdev, unsigned port, |
1777 | struct dev_state *owner); |
1778 | diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h |
1779 | index 27dad993b007..7ab3c9985253 100644 |
1780 | --- a/drivers/usb/dwc3/core.h |
1781 | +++ b/drivers/usb/dwc3/core.h |
1782 | @@ -836,15 +836,15 @@ struct dwc3_event_depevt { |
1783 | * 12 - VndrDevTstRcved |
1784 | * @reserved15_12: Reserved, not used |
1785 | * @event_info: Information about this event |
1786 | - * @reserved31_24: Reserved, not used |
1787 | + * @reserved31_25: Reserved, not used |
1788 | */ |
1789 | struct dwc3_event_devt { |
1790 | u32 one_bit:1; |
1791 | u32 device_event:7; |
1792 | u32 type:4; |
1793 | u32 reserved15_12:4; |
1794 | - u32 event_info:8; |
1795 | - u32 reserved31_24:8; |
1796 | + u32 event_info:9; |
1797 | + u32 reserved31_25:7; |
1798 | } __packed; |
1799 | |
1800 | /** |
1801 | diff --git a/drivers/usb/gadget/tcm_usb_gadget.c b/drivers/usb/gadget/tcm_usb_gadget.c |
1802 | index 7cacd6ae818e..e4d8d79a4993 100644 |
1803 | --- a/drivers/usb/gadget/tcm_usb_gadget.c |
1804 | +++ b/drivers/usb/gadget/tcm_usb_gadget.c |
1805 | @@ -1614,7 +1614,7 @@ static struct se_wwn *usbg_make_tport( |
1806 | return ERR_PTR(-ENOMEM); |
1807 | } |
1808 | tport->tport_wwpn = wwpn; |
1809 | - snprintf(tport->tport_name, sizeof(tport->tport_name), wnn_name); |
1810 | + snprintf(tport->tport_name, sizeof(tport->tport_name), "%s", wnn_name); |
1811 | return &tport->tport_wwn; |
1812 | } |
1813 | |
1814 | diff --git a/drivers/usb/gadget/zero.c b/drivers/usb/gadget/zero.c |
1815 | index 0deb9d6cde26..d31814c7238f 100644 |
1816 | --- a/drivers/usb/gadget/zero.c |
1817 | +++ b/drivers/usb/gadget/zero.c |
1818 | @@ -280,7 +280,7 @@ static int __init zero_bind(struct usb_composite_dev *cdev) |
1819 | ss_opts->isoc_interval = gzero_options.isoc_interval; |
1820 | ss_opts->isoc_maxpacket = gzero_options.isoc_maxpacket; |
1821 | ss_opts->isoc_mult = gzero_options.isoc_mult; |
1822 | - ss_opts->isoc_maxburst = gzero_options.isoc_maxpacket; |
1823 | + ss_opts->isoc_maxburst = gzero_options.isoc_maxburst; |
1824 | ss_opts->bulk_buflen = gzero_options.bulk_buflen; |
1825 | |
1826 | func_ss = usb_get_function(func_inst_ss); |
1827 | diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c |
1828 | index 3581416a24d8..a736d82695cb 100644 |
1829 | --- a/drivers/usb/host/xhci-pci.c |
1830 | +++ b/drivers/usb/host/xhci-pci.c |
1831 | @@ -114,9 +114,7 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) |
1832 | xhci->quirks |= XHCI_TRUST_TX_LENGTH; |
1833 | } |
1834 | if (pdev->vendor == PCI_VENDOR_ID_RENESAS && |
1835 | - pdev->device == 0x0015 && |
1836 | - pdev->subsystem_vendor == PCI_VENDOR_ID_SAMSUNG && |
1837 | - pdev->subsystem_device == 0xc0cd) |
1838 | + pdev->device == 0x0015) |
1839 | xhci->quirks |= XHCI_RESET_ON_RESUME; |
1840 | if (pdev->vendor == PCI_VENDOR_ID_VIA) |
1841 | xhci->quirks |= XHCI_RESET_ON_RESUME; |
1842 | @@ -161,6 +159,10 @@ static int xhci_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) |
1843 | struct usb_hcd *hcd; |
1844 | |
1845 | driver = (struct hc_driver *)id->driver_data; |
1846 | + |
1847 | + /* Prevent runtime suspending between USB-2 and USB-3 initialization */ |
1848 | + pm_runtime_get_noresume(&dev->dev); |
1849 | + |
1850 | /* Register the USB 2.0 roothub. |
1851 | * FIXME: USB core must know to register the USB 2.0 roothub first. |
1852 | * This is sort of silly, because we could just set the HCD driver flags |
1853 | @@ -170,7 +172,7 @@ static int xhci_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) |
1854 | retval = usb_hcd_pci_probe(dev, id); |
1855 | |
1856 | if (retval) |
1857 | - return retval; |
1858 | + goto put_runtime_pm; |
1859 | |
1860 | /* USB 2.0 roothub is stored in the PCI device now. */ |
1861 | hcd = dev_get_drvdata(&dev->dev); |
1862 | @@ -199,12 +201,17 @@ static int xhci_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) |
1863 | if (xhci->quirks & XHCI_LPM_SUPPORT) |
1864 | hcd_to_bus(xhci->shared_hcd)->root_hub->lpm_capable = 1; |
1865 | |
1866 | + /* USB-2 and USB-3 roothubs initialized, allow runtime pm suspend */ |
1867 | + pm_runtime_put_noidle(&dev->dev); |
1868 | + |
1869 | return 0; |
1870 | |
1871 | put_usb3_hcd: |
1872 | usb_put_hcd(xhci->shared_hcd); |
1873 | dealloc_usb2_hcd: |
1874 | usb_hcd_pci_remove(dev); |
1875 | +put_runtime_pm: |
1876 | + pm_runtime_put_noidle(&dev->dev); |
1877 | return retval; |
1878 | } |
1879 | |
1880 | diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c |
1881 | index a90819b83224..4b46de842175 100644 |
1882 | --- a/drivers/usb/host/xhci.c |
1883 | +++ b/drivers/usb/host/xhci.c |
1884 | @@ -394,16 +394,16 @@ static int xhci_try_enable_msi(struct usb_hcd *hcd) |
1885 | |
1886 | #else |
1887 | |
1888 | -static int xhci_try_enable_msi(struct usb_hcd *hcd) |
1889 | +static inline int xhci_try_enable_msi(struct usb_hcd *hcd) |
1890 | { |
1891 | return 0; |
1892 | } |
1893 | |
1894 | -static void xhci_cleanup_msix(struct xhci_hcd *xhci) |
1895 | +static inline void xhci_cleanup_msix(struct xhci_hcd *xhci) |
1896 | { |
1897 | } |
1898 | |
1899 | -static void xhci_msix_sync_irqs(struct xhci_hcd *xhci) |
1900 | +static inline void xhci_msix_sync_irqs(struct xhci_hcd *xhci) |
1901 | { |
1902 | } |
1903 | |
1904 | diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c |
1905 | index 37a261a6bb6a..da0caf3f4b27 100644 |
1906 | --- a/drivers/usb/musb/musb_core.c |
1907 | +++ b/drivers/usb/musb/musb_core.c |
1908 | @@ -440,7 +440,6 @@ void musb_hnp_stop(struct musb *musb) |
1909 | static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, |
1910 | u8 devctl) |
1911 | { |
1912 | - struct usb_otg *otg = musb->xceiv->otg; |
1913 | irqreturn_t handled = IRQ_NONE; |
1914 | |
1915 | dev_dbg(musb->controller, "<== DevCtl=%02x, int_usb=0x%x\n", devctl, |
1916 | @@ -655,7 +654,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, |
1917 | break; |
1918 | case OTG_STATE_B_PERIPHERAL: |
1919 | musb_g_suspend(musb); |
1920 | - musb->is_active = otg->gadget->b_hnp_enable; |
1921 | + musb->is_active = musb->g.b_hnp_enable; |
1922 | if (musb->is_active) { |
1923 | musb->xceiv->state = OTG_STATE_B_WAIT_ACON; |
1924 | dev_dbg(musb->controller, "HNP: Setting timer for b_ase0_brst\n"); |
1925 | @@ -671,7 +670,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, |
1926 | break; |
1927 | case OTG_STATE_A_HOST: |
1928 | musb->xceiv->state = OTG_STATE_A_SUSPEND; |
1929 | - musb->is_active = otg->host->b_hnp_enable; |
1930 | + musb->is_active = musb_to_hcd(musb)->self.b_hnp_enable; |
1931 | break; |
1932 | case OTG_STATE_B_HOST: |
1933 | /* Transition to B_PERIPHERAL, see 6.8.2.6 p 44 */ |
1934 | diff --git a/drivers/usb/phy/phy-ulpi.c b/drivers/usb/phy/phy-ulpi.c |
1935 | index 217339dd7a90..17ea3f271bd8 100644 |
1936 | --- a/drivers/usb/phy/phy-ulpi.c |
1937 | +++ b/drivers/usb/phy/phy-ulpi.c |
1938 | @@ -47,6 +47,8 @@ struct ulpi_info { |
1939 | static struct ulpi_info ulpi_ids[] = { |
1940 | ULPI_INFO(ULPI_ID(0x04cc, 0x1504), "NXP ISP1504"), |
1941 | ULPI_INFO(ULPI_ID(0x0424, 0x0006), "SMSC USB331x"), |
1942 | + ULPI_INFO(ULPI_ID(0x0424, 0x0007), "SMSC USB3320"), |
1943 | + ULPI_INFO(ULPI_ID(0x0451, 0x1507), "TI TUSB1210"), |
1944 | }; |
1945 | |
1946 | static int ulpi_set_otg_flags(struct usb_phy *phy) |
1947 | diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c |
1948 | index 4471f464ca26..a0b58e252073 100644 |
1949 | --- a/drivers/usb/serial/pl2303.c |
1950 | +++ b/drivers/usb/serial/pl2303.c |
1951 | @@ -82,6 +82,9 @@ static const struct usb_device_id id_table[] = { |
1952 | { USB_DEVICE(YCCABLE_VENDOR_ID, YCCABLE_PRODUCT_ID) }, |
1953 | { USB_DEVICE(SUPERIAL_VENDOR_ID, SUPERIAL_PRODUCT_ID) }, |
1954 | { USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) }, |
1955 | + { USB_DEVICE(HP_VENDOR_ID, HP_LD960_PRODUCT_ID) }, |
1956 | + { USB_DEVICE(HP_VENDOR_ID, HP_LCM220_PRODUCT_ID) }, |
1957 | + { USB_DEVICE(HP_VENDOR_ID, HP_LCM960_PRODUCT_ID) }, |
1958 | { USB_DEVICE(CRESSI_VENDOR_ID, CRESSI_EDY_PRODUCT_ID) }, |
1959 | { USB_DEVICE(ZEAGLE_VENDOR_ID, ZEAGLE_N2ITION3_PRODUCT_ID) }, |
1960 | { USB_DEVICE(SONY_VENDOR_ID, SONY_QN3USB_PRODUCT_ID) }, |
1961 | diff --git a/drivers/usb/serial/pl2303.h b/drivers/usb/serial/pl2303.h |
1962 | index c38b8c00c06f..42bc082896ac 100644 |
1963 | --- a/drivers/usb/serial/pl2303.h |
1964 | +++ b/drivers/usb/serial/pl2303.h |
1965 | @@ -121,8 +121,11 @@ |
1966 | #define SUPERIAL_VENDOR_ID 0x5372 |
1967 | #define SUPERIAL_PRODUCT_ID 0x2303 |
1968 | |
1969 | -/* Hewlett-Packard LD220-HP POS Pole Display */ |
1970 | +/* Hewlett-Packard POS Pole Displays */ |
1971 | #define HP_VENDOR_ID 0x03f0 |
1972 | +#define HP_LD960_PRODUCT_ID 0x0b39 |
1973 | +#define HP_LCM220_PRODUCT_ID 0x3139 |
1974 | +#define HP_LCM960_PRODUCT_ID 0x3239 |
1975 | #define HP_LD220_PRODUCT_ID 0x3524 |
1976 | |
1977 | /* Cressi Edy (diving computer) PC interface */ |
1978 | diff --git a/drivers/w1/w1_netlink.c b/drivers/w1/w1_netlink.c |
1979 | index 40788c925d1c..73705aff53cb 100644 |
1980 | --- a/drivers/w1/w1_netlink.c |
1981 | +++ b/drivers/w1/w1_netlink.c |
1982 | @@ -54,28 +54,29 @@ static void w1_send_slave(struct w1_master *dev, u64 rn) |
1983 | struct w1_netlink_msg *hdr = (struct w1_netlink_msg *)(msg + 1); |
1984 | struct w1_netlink_cmd *cmd = (struct w1_netlink_cmd *)(hdr + 1); |
1985 | int avail; |
1986 | + u64 *data; |
1987 | |
1988 | /* update kernel slave list */ |
1989 | w1_slave_found(dev, rn); |
1990 | |
1991 | avail = dev->priv_size - cmd->len; |
1992 | |
1993 | - if (avail > 8) { |
1994 | - u64 *data = (void *)(cmd + 1) + cmd->len; |
1995 | + if (avail < 8) { |
1996 | + msg->ack++; |
1997 | + cn_netlink_send(msg, 0, GFP_KERNEL); |
1998 | |
1999 | - *data = rn; |
2000 | - cmd->len += 8; |
2001 | - hdr->len += 8; |
2002 | - msg->len += 8; |
2003 | - return; |
2004 | + msg->len = sizeof(struct w1_netlink_msg) + |
2005 | + sizeof(struct w1_netlink_cmd); |
2006 | + hdr->len = sizeof(struct w1_netlink_cmd); |
2007 | + cmd->len = 0; |
2008 | } |
2009 | |
2010 | - msg->ack++; |
2011 | - cn_netlink_send(msg, 0, GFP_KERNEL); |
2012 | + data = (void *)(cmd + 1) + cmd->len; |
2013 | |
2014 | - msg->len = sizeof(struct w1_netlink_msg) + sizeof(struct w1_netlink_cmd); |
2015 | - hdr->len = sizeof(struct w1_netlink_cmd); |
2016 | - cmd->len = 0; |
2017 | + *data = rn; |
2018 | + cmd->len += 8; |
2019 | + hdr->len += 8; |
2020 | + msg->len += 8; |
2021 | } |
2022 | |
2023 | static int w1_process_search_command(struct w1_master *dev, struct cn_msg *msg, |
2024 | diff --git a/fs/ext4/file.c b/fs/ext4/file.c |
2025 | index b19f0a457f32..4635788e14bf 100644 |
2026 | --- a/fs/ext4/file.c |
2027 | +++ b/fs/ext4/file.c |
2028 | @@ -82,7 +82,7 @@ ext4_unaligned_aio(struct inode *inode, const struct iovec *iov, |
2029 | size_t count = iov_length(iov, nr_segs); |
2030 | loff_t final_size = pos + count; |
2031 | |
2032 | - if (pos >= inode->i_size) |
2033 | + if (pos >= i_size_read(inode)) |
2034 | return 0; |
2035 | |
2036 | if ((pos & blockmask) || (final_size & blockmask)) |
2037 | diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c |
2038 | index 1423c4816a47..298e9c8da364 100644 |
2039 | --- a/fs/ext4/xattr.c |
2040 | +++ b/fs/ext4/xattr.c |
2041 | @@ -517,8 +517,8 @@ static void ext4_xattr_update_super_block(handle_t *handle, |
2042 | } |
2043 | |
2044 | /* |
2045 | - * Release the xattr block BH: If the reference count is > 1, decrement |
2046 | - * it; otherwise free the block. |
2047 | + * Release the xattr block BH: If the reference count is > 1, decrement it; |
2048 | + * otherwise free the block. |
2049 | */ |
2050 | static void |
2051 | ext4_xattr_release_block(handle_t *handle, struct inode *inode, |
2052 | @@ -538,16 +538,31 @@ ext4_xattr_release_block(handle_t *handle, struct inode *inode, |
2053 | if (ce) |
2054 | mb_cache_entry_free(ce); |
2055 | get_bh(bh); |
2056 | + unlock_buffer(bh); |
2057 | ext4_free_blocks(handle, inode, bh, 0, 1, |
2058 | EXT4_FREE_BLOCKS_METADATA | |
2059 | EXT4_FREE_BLOCKS_FORGET); |
2060 | - unlock_buffer(bh); |
2061 | } else { |
2062 | le32_add_cpu(&BHDR(bh)->h_refcount, -1); |
2063 | if (ce) |
2064 | mb_cache_entry_release(ce); |
2065 | + /* |
2066 | + * Beware of this ugliness: Releasing of xattr block references |
2067 | + * from different inodes can race and so we have to protect |
2068 | + * from a race where someone else frees the block (and releases |
2069 | + * its journal_head) before we are done dirtying the buffer. In |
2070 | + * nojournal mode this race is harmless and we actually cannot |
2071 | + * call ext4_handle_dirty_xattr_block() with locked buffer as |
2072 | + * that function can call sync_dirty_buffer() so for that case |
2073 | + * we handle the dirtying after unlocking the buffer. |
2074 | + */ |
2075 | + if (ext4_handle_valid(handle)) |
2076 | + error = ext4_handle_dirty_xattr_block(handle, inode, |
2077 | + bh); |
2078 | unlock_buffer(bh); |
2079 | - error = ext4_handle_dirty_xattr_block(handle, inode, bh); |
2080 | + if (!ext4_handle_valid(handle)) |
2081 | + error = ext4_handle_dirty_xattr_block(handle, inode, |
2082 | + bh); |
2083 | if (IS_SYNC(inode)) |
2084 | ext4_handle_sync(handle); |
2085 | dquot_free_block(inode, EXT4_C2B(EXT4_SB(inode->i_sb), 1)); |
2086 | diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c |
2087 | index 7f05cd140de3..3eaa6e30a2dc 100644 |
2088 | --- a/fs/nfsd/nfs4callback.c |
2089 | +++ b/fs/nfsd/nfs4callback.c |
2090 | @@ -637,9 +637,11 @@ static struct rpc_cred *get_backchannel_cred(struct nfs4_client *clp, struct rpc |
2091 | |
2092 | static int setup_callback_client(struct nfs4_client *clp, struct nfs4_cb_conn *conn, struct nfsd4_session *ses) |
2093 | { |
2094 | + int maxtime = max_cb_time(clp->net); |
2095 | struct rpc_timeout timeparms = { |
2096 | - .to_initval = max_cb_time(clp->net), |
2097 | + .to_initval = maxtime, |
2098 | .to_retries = 0, |
2099 | + .to_maxval = maxtime, |
2100 | }; |
2101 | struct rpc_create_args args = { |
2102 | .net = clp->net, |
2103 | diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c |
2104 | index 27d74a294515..f7d7d04674fb 100644 |
2105 | --- a/fs/nfsd/nfs4proc.c |
2106 | +++ b/fs/nfsd/nfs4proc.c |
2107 | @@ -1307,6 +1307,12 @@ nfsd4_proc_compound(struct svc_rqst *rqstp, |
2108 | /* If op is non-idempotent */ |
2109 | if (opdesc->op_flags & OP_MODIFIES_SOMETHING) { |
2110 | plen = opdesc->op_rsize_bop(rqstp, op); |
2111 | + /* |
2112 | + * If there's still another operation, make sure |
2113 | + * we'll have space to at least encode an error: |
2114 | + */ |
2115 | + if (resp->opcnt < args->opcnt) |
2116 | + plen += COMPOUND_ERR_SLACK_SPACE; |
2117 | op->status = nfsd4_check_resp_size(resp, plen); |
2118 | } |
2119 | |
2120 | @@ -1471,7 +1477,8 @@ static inline u32 nfsd4_setattr_rsize(struct svc_rqst *rqstp, struct nfsd4_op *o |
2121 | |
2122 | static inline u32 nfsd4_setclientid_rsize(struct svc_rqst *rqstp, struct nfsd4_op *op) |
2123 | { |
2124 | - return (op_encode_hdr_size + 2 + 1024) * sizeof(__be32); |
2125 | + return (op_encode_hdr_size + 2 + XDR_QUADLEN(NFS4_VERIFIER_SIZE)) * |
2126 | + sizeof(__be32); |
2127 | } |
2128 | |
2129 | static inline u32 nfsd4_write_rsize(struct svc_rqst *rqstp, struct nfsd4_op *op) |
2130 | diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c |
2131 | index 316ec843dec2..442509285ca9 100644 |
2132 | --- a/fs/nfsd/nfs4state.c |
2133 | +++ b/fs/nfsd/nfs4state.c |
2134 | @@ -4958,7 +4958,6 @@ nfs4_state_destroy_net(struct net *net) |
2135 | int i; |
2136 | struct nfs4_client *clp = NULL; |
2137 | struct nfsd_net *nn = net_generic(net, nfsd_net_id); |
2138 | - struct rb_node *node, *tmp; |
2139 | |
2140 | for (i = 0; i < CLIENT_HASH_SIZE; i++) { |
2141 | while (!list_empty(&nn->conf_id_hashtbl[i])) { |
2142 | @@ -4967,13 +4966,11 @@ nfs4_state_destroy_net(struct net *net) |
2143 | } |
2144 | } |
2145 | |
2146 | - node = rb_first(&nn->unconf_name_tree); |
2147 | - while (node != NULL) { |
2148 | - tmp = node; |
2149 | - node = rb_next(tmp); |
2150 | - clp = rb_entry(tmp, struct nfs4_client, cl_namenode); |
2151 | - rb_erase(tmp, &nn->unconf_name_tree); |
2152 | - destroy_client(clp); |
2153 | + for (i = 0; i < CLIENT_HASH_SIZE; i++) { |
2154 | + while (!list_empty(&nn->unconf_id_hashtbl[i])) { |
2155 | + clp = list_entry(nn->unconf_id_hashtbl[i].next, struct nfs4_client, cl_idhash); |
2156 | + destroy_client(clp); |
2157 | + } |
2158 | } |
2159 | |
2160 | kfree(nn->sessionid_hashtbl); |
2161 | diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c |
2162 | index 582321a978b0..5188a38fef06 100644 |
2163 | --- a/fs/nfsd/nfs4xdr.c |
2164 | +++ b/fs/nfsd/nfs4xdr.c |
2165 | @@ -2401,6 +2401,8 @@ out_acl: |
2166 | WRITE64(stat.ino); |
2167 | } |
2168 | if (bmval2 & FATTR4_WORD2_SUPPATTR_EXCLCREAT) { |
2169 | + if ((buflen -= 16) < 0) |
2170 | + goto out_resource; |
2171 | WRITE32(3); |
2172 | WRITE32(NFSD_SUPPATTR_EXCLCREAT_WORD0); |
2173 | WRITE32(NFSD_SUPPATTR_EXCLCREAT_WORD1); |
2174 | @@ -3382,6 +3384,9 @@ nfsd4_encode_test_stateid(struct nfsd4_compoundres *resp, __be32 nfserr, |
2175 | struct nfsd4_test_stateid_id *stateid, *next; |
2176 | __be32 *p; |
2177 | |
2178 | + if (nfserr) |
2179 | + return nfserr; |
2180 | + |
2181 | RESERVE_SPACE(4 + (4 * test_stateid->ts_num_ids)); |
2182 | *p++ = htonl(test_stateid->ts_num_ids); |
2183 | |
2184 | diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c |
2185 | index 7f555179bf81..f34d9de802ab 100644 |
2186 | --- a/fs/nfsd/nfsctl.c |
2187 | +++ b/fs/nfsd/nfsctl.c |
2188 | @@ -699,6 +699,11 @@ static ssize_t __write_ports_addfd(char *buf, struct net *net) |
2189 | if (err != 0 || fd < 0) |
2190 | return -EINVAL; |
2191 | |
2192 | + if (svc_alien_sock(net, fd)) { |
2193 | + printk(KERN_ERR "%s: socket net is different to NFSd's one\n", __func__); |
2194 | + return -EINVAL; |
2195 | + } |
2196 | + |
2197 | err = nfsd_create_serv(net); |
2198 | if (err != 0) |
2199 | return err; |
2200 | diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c |
2201 | index 62fd6616801d..d9b298cbfe5c 100644 |
2202 | --- a/fs/nfsd/vfs.c |
2203 | +++ b/fs/nfsd/vfs.c |
2204 | @@ -406,6 +406,7 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap, |
2205 | umode_t ftype = 0; |
2206 | __be32 err; |
2207 | int host_err; |
2208 | + bool get_write_count; |
2209 | int size_change = 0; |
2210 | |
2211 | if (iap->ia_valid & (ATTR_ATIME | ATTR_MTIME | ATTR_SIZE)) |
2212 | @@ -413,10 +414,18 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap, |
2213 | if (iap->ia_valid & ATTR_SIZE) |
2214 | ftype = S_IFREG; |
2215 | |
2216 | + /* Callers that do fh_verify should do the fh_want_write: */ |
2217 | + get_write_count = !fhp->fh_dentry; |
2218 | + |
2219 | /* Get inode */ |
2220 | err = fh_verify(rqstp, fhp, ftype, accmode); |
2221 | if (err) |
2222 | goto out; |
2223 | + if (get_write_count) { |
2224 | + host_err = fh_want_write(fhp); |
2225 | + if (host_err) |
2226 | + return nfserrno(host_err); |
2227 | + } |
2228 | |
2229 | dentry = fhp->fh_dentry; |
2230 | inode = dentry->d_inode; |
2231 | diff --git a/fs/ocfs2/buffer_head_io.c b/fs/ocfs2/buffer_head_io.c |
2232 | index 5d18ad10c27f..4f66e007dae1 100644 |
2233 | --- a/fs/ocfs2/buffer_head_io.c |
2234 | +++ b/fs/ocfs2/buffer_head_io.c |
2235 | @@ -90,7 +90,6 @@ int ocfs2_write_block(struct ocfs2_super *osb, struct buffer_head *bh, |
2236 | * information for this bh as it's not marked locally |
2237 | * uptodate. */ |
2238 | ret = -EIO; |
2239 | - put_bh(bh); |
2240 | mlog_errno(ret); |
2241 | } |
2242 | |
2243 | @@ -420,7 +419,6 @@ int ocfs2_write_super_or_backup(struct ocfs2_super *osb, |
2244 | |
2245 | if (!buffer_uptodate(bh)) { |
2246 | ret = -EIO; |
2247 | - put_bh(bh); |
2248 | mlog_errno(ret); |
2249 | } |
2250 | |
2251 | diff --git a/fs/ocfs2/dlm/dlmrecovery.c b/fs/ocfs2/dlm/dlmrecovery.c |
2252 | index e68588e6b1e8..9bd981cd3142 100644 |
2253 | --- a/fs/ocfs2/dlm/dlmrecovery.c |
2254 | +++ b/fs/ocfs2/dlm/dlmrecovery.c |
2255 | @@ -540,7 +540,10 @@ master_here: |
2256 | /* success! see if any other nodes need recovery */ |
2257 | mlog(0, "DONE mastering recovery of %s:%u here(this=%u)!\n", |
2258 | dlm->name, dlm->reco.dead_node, dlm->node_num); |
2259 | - dlm_reset_recovery(dlm); |
2260 | + spin_lock(&dlm->spinlock); |
2261 | + __dlm_reset_recovery(dlm); |
2262 | + dlm->reco.state &= ~DLM_RECO_STATE_FINALIZE; |
2263 | + spin_unlock(&dlm->spinlock); |
2264 | } |
2265 | dlm_end_recovery(dlm); |
2266 | |
2267 | @@ -698,6 +701,14 @@ static int dlm_remaster_locks(struct dlm_ctxt *dlm, u8 dead_node) |
2268 | if (all_nodes_done) { |
2269 | int ret; |
2270 | |
2271 | + /* Set this flag on recovery master to avoid |
2272 | + * a new recovery for another dead node start |
2273 | + * before the recovery is not done. That may |
2274 | + * cause recovery hung.*/ |
2275 | + spin_lock(&dlm->spinlock); |
2276 | + dlm->reco.state |= DLM_RECO_STATE_FINALIZE; |
2277 | + spin_unlock(&dlm->spinlock); |
2278 | + |
2279 | /* all nodes are now in DLM_RECO_NODE_DATA_DONE state |
2280 | * just send a finalize message to everyone and |
2281 | * clean up */ |
2282 | @@ -1751,13 +1762,13 @@ static int dlm_process_recovery_data(struct dlm_ctxt *dlm, |
2283 | struct dlm_migratable_lockres *mres) |
2284 | { |
2285 | struct dlm_migratable_lock *ml; |
2286 | - struct list_head *queue; |
2287 | + struct list_head *queue, *iter; |
2288 | struct list_head *tmpq = NULL; |
2289 | struct dlm_lock *newlock = NULL; |
2290 | struct dlm_lockstatus *lksb = NULL; |
2291 | int ret = 0; |
2292 | int i, j, bad; |
2293 | - struct dlm_lock *lock = NULL; |
2294 | + struct dlm_lock *lock; |
2295 | u8 from = O2NM_MAX_NODES; |
2296 | unsigned int added = 0; |
2297 | __be64 c; |
2298 | @@ -1792,14 +1803,16 @@ static int dlm_process_recovery_data(struct dlm_ctxt *dlm, |
2299 | /* MIGRATION ONLY! */ |
2300 | BUG_ON(!(mres->flags & DLM_MRES_MIGRATION)); |
2301 | |
2302 | + lock = NULL; |
2303 | spin_lock(&res->spinlock); |
2304 | for (j = DLM_GRANTED_LIST; j <= DLM_BLOCKED_LIST; j++) { |
2305 | tmpq = dlm_list_idx_to_ptr(res, j); |
2306 | - list_for_each_entry(lock, tmpq, list) { |
2307 | - if (lock->ml.cookie != ml->cookie) |
2308 | - lock = NULL; |
2309 | - else |
2310 | + list_for_each(iter, tmpq) { |
2311 | + lock = list_entry(iter, |
2312 | + struct dlm_lock, list); |
2313 | + if (lock->ml.cookie == ml->cookie) |
2314 | break; |
2315 | + lock = NULL; |
2316 | } |
2317 | if (lock) |
2318 | break; |
2319 | @@ -2867,8 +2880,8 @@ int dlm_finalize_reco_handler(struct o2net_msg *msg, u32 len, void *data, |
2320 | BUG(); |
2321 | } |
2322 | dlm->reco.state &= ~DLM_RECO_STATE_FINALIZE; |
2323 | + __dlm_reset_recovery(dlm); |
2324 | spin_unlock(&dlm->spinlock); |
2325 | - dlm_reset_recovery(dlm); |
2326 | dlm_kick_recovery_thread(dlm); |
2327 | break; |
2328 | default: |
2329 | diff --git a/fs/reiserfs/dir.c b/fs/reiserfs/dir.c |
2330 | index 6c2d136561cb..2b96b59f75da 100644 |
2331 | --- a/fs/reiserfs/dir.c |
2332 | +++ b/fs/reiserfs/dir.c |
2333 | @@ -128,6 +128,7 @@ int reiserfs_readdir_dentry(struct dentry *dentry, void *dirent, |
2334 | char *d_name; |
2335 | off_t d_off; |
2336 | ino_t d_ino; |
2337 | + loff_t cur_pos = deh_offset(deh); |
2338 | |
2339 | if (!de_visible(deh)) |
2340 | /* it is hidden entry */ |
2341 | @@ -200,8 +201,9 @@ int reiserfs_readdir_dentry(struct dentry *dentry, void *dirent, |
2342 | if (local_buf != small_buf) { |
2343 | kfree(local_buf); |
2344 | } |
2345 | - // next entry should be looked for with such offset |
2346 | - next_pos = deh_offset(deh) + 1; |
2347 | + |
2348 | + /* deh_offset(deh) may be invalid now. */ |
2349 | + next_pos = cur_pos + 1; |
2350 | |
2351 | if (item_moved(&tmp_ih, &path_to_entry)) { |
2352 | set_cpu_key_k_offset(&pos_key, |
2353 | diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c |
2354 | index eca6f9d8a263..79ddbaf93206 100644 |
2355 | --- a/fs/xfs/xfs_da_btree.c |
2356 | +++ b/fs/xfs/xfs_da_btree.c |
2357 | @@ -1334,7 +1334,7 @@ xfs_da3_fixhashpath( |
2358 | node = blk->bp->b_addr; |
2359 | xfs_da3_node_hdr_from_disk(&nodehdr, node); |
2360 | btree = xfs_da3_node_tree_p(node); |
2361 | - if (be32_to_cpu(btree->hashval) == lasthash) |
2362 | + if (be32_to_cpu(btree[blk->index].hashval) == lasthash) |
2363 | break; |
2364 | blk->hashval = lasthash; |
2365 | btree[blk->index].hashval = cpu_to_be32(lasthash); |
2366 | diff --git a/include/linux/sunrpc/svcsock.h b/include/linux/sunrpc/svcsock.h |
2367 | index 62fd1b756e99..947009ed5996 100644 |
2368 | --- a/include/linux/sunrpc/svcsock.h |
2369 | +++ b/include/linux/sunrpc/svcsock.h |
2370 | @@ -56,6 +56,7 @@ int svc_recv(struct svc_rqst *, long); |
2371 | int svc_send(struct svc_rqst *); |
2372 | void svc_drop(struct svc_rqst *); |
2373 | void svc_sock_update_bufs(struct svc_serv *serv); |
2374 | +bool svc_alien_sock(struct net *net, int fd); |
2375 | int svc_addsock(struct svc_serv *serv, const int fd, |
2376 | char *name_return, const size_t len); |
2377 | void svc_init_xprt_sock(void); |
2378 | diff --git a/kernel/sysctl.c b/kernel/sysctl.c |
2379 | index 9edcf456e0fc..ed6c01626acd 100644 |
2380 | --- a/kernel/sysctl.c |
2381 | +++ b/kernel/sysctl.c |
2382 | @@ -144,6 +144,11 @@ static int min_percpu_pagelist_fract = 8; |
2383 | static int ngroups_max = NGROUPS_MAX; |
2384 | static const int cap_last_cap = CAP_LAST_CAP; |
2385 | |
2386 | +/*this is needed for proc_doulongvec_minmax of sysctl_hung_task_timeout_secs */ |
2387 | +#ifdef CONFIG_DETECT_HUNG_TASK |
2388 | +static unsigned long hung_task_timeout_max = (LONG_MAX/HZ); |
2389 | +#endif |
2390 | + |
2391 | #ifdef CONFIG_INOTIFY_USER |
2392 | #include <linux/inotify.h> |
2393 | #endif |
2394 | @@ -966,6 +971,7 @@ static struct ctl_table kern_table[] = { |
2395 | .maxlen = sizeof(unsigned long), |
2396 | .mode = 0644, |
2397 | .proc_handler = proc_dohung_task_timeout_secs, |
2398 | + .extra2 = &hung_task_timeout_max, |
2399 | }, |
2400 | { |
2401 | .procname = "hung_task_warnings", |
2402 | diff --git a/mm/hugetlb.c b/mm/hugetlb.c |
2403 | index aa3b9a63394b..8a7f27b42131 100644 |
2404 | --- a/mm/hugetlb.c |
2405 | +++ b/mm/hugetlb.c |
2406 | @@ -1487,6 +1487,7 @@ static unsigned long set_max_huge_pages(struct hstate *h, unsigned long count, |
2407 | while (min_count < persistent_huge_pages(h)) { |
2408 | if (!free_pool_huge_page(h, nodes_allowed, 0)) |
2409 | break; |
2410 | + cond_resched_lock(&hugetlb_lock); |
2411 | } |
2412 | while (count < persistent_huge_pages(h)) { |
2413 | if (!adjust_pool_surplus(h, nodes_allowed, 1)) |
2414 | diff --git a/mm/mlock.c b/mm/mlock.c |
2415 | index 79b7cf7d1bca..713e462c0776 100644 |
2416 | --- a/mm/mlock.c |
2417 | +++ b/mm/mlock.c |
2418 | @@ -76,6 +76,7 @@ void clear_page_mlock(struct page *page) |
2419 | */ |
2420 | void mlock_vma_page(struct page *page) |
2421 | { |
2422 | + /* Serialize with page migration */ |
2423 | BUG_ON(!PageLocked(page)); |
2424 | |
2425 | if (!TestSetPageMlocked(page)) { |
2426 | @@ -106,6 +107,7 @@ unsigned int munlock_vma_page(struct page *page) |
2427 | { |
2428 | unsigned int page_mask = 0; |
2429 | |
2430 | + /* For try_to_munlock() and to serialize with page migration */ |
2431 | BUG_ON(!PageLocked(page)); |
2432 | |
2433 | if (TestClearPageMlocked(page)) { |
2434 | diff --git a/mm/rmap.c b/mm/rmap.c |
2435 | index 3f6077461aea..fbf0040a7342 100644 |
2436 | --- a/mm/rmap.c |
2437 | +++ b/mm/rmap.c |
2438 | @@ -1390,9 +1390,19 @@ static int try_to_unmap_cluster(unsigned long cursor, unsigned int *mapcount, |
2439 | BUG_ON(!page || PageAnon(page)); |
2440 | |
2441 | if (locked_vma) { |
2442 | - mlock_vma_page(page); /* no-op if already mlocked */ |
2443 | - if (page == check_page) |
2444 | + if (page == check_page) { |
2445 | + /* we know we have check_page locked */ |
2446 | + mlock_vma_page(page); |
2447 | ret = SWAP_MLOCK; |
2448 | + } else if (trylock_page(page)) { |
2449 | + /* |
2450 | + * If we can lock the page, perform mlock. |
2451 | + * Otherwise leave the page alone, it will be |
2452 | + * eventually encountered again later. |
2453 | + */ |
2454 | + mlock_vma_page(page); |
2455 | + unlock_page(page); |
2456 | + } |
2457 | continue; /* don't unmap */ |
2458 | } |
2459 | |
2460 | diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c |
2461 | index 305374d4fb98..422759bae60d 100644 |
2462 | --- a/net/sunrpc/svcsock.c |
2463 | +++ b/net/sunrpc/svcsock.c |
2464 | @@ -1393,6 +1393,22 @@ static struct svc_sock *svc_setup_socket(struct svc_serv *serv, |
2465 | return svsk; |
2466 | } |
2467 | |
2468 | +bool svc_alien_sock(struct net *net, int fd) |
2469 | +{ |
2470 | + int err; |
2471 | + struct socket *sock = sockfd_lookup(fd, &err); |
2472 | + bool ret = false; |
2473 | + |
2474 | + if (!sock) |
2475 | + goto out; |
2476 | + if (sock_net(sock->sk) != net) |
2477 | + ret = true; |
2478 | + sockfd_put(sock); |
2479 | +out: |
2480 | + return ret; |
2481 | +} |
2482 | +EXPORT_SYMBOL_GPL(svc_alien_sock); |
2483 | + |
2484 | /** |
2485 | * svc_addsock - add a listener socket to an RPC service |
2486 | * @serv: pointer to RPC service to which to add a new listener |
2487 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
2488 | index 34548589f419..7de7cf1ec852 100644 |
2489 | --- a/sound/pci/hda/patch_realtek.c |
2490 | +++ b/sound/pci/hda/patch_realtek.c |
2491 | @@ -937,6 +937,7 @@ static int alc_codec_rename_from_preset(struct hda_codec *codec) |
2492 | |
2493 | static const struct snd_pci_quirk beep_white_list[] = { |
2494 | SND_PCI_QUIRK(0x1043, 0x103c, "ASUS", 1), |
2495 | + SND_PCI_QUIRK(0x1043, 0x115d, "ASUS", 1), |
2496 | SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1), |
2497 | SND_PCI_QUIRK(0x1043, 0x8376, "EeePC", 1), |
2498 | SND_PCI_QUIRK(0x1043, 0x83ce, "EeePC", 1), |
2499 | @@ -2858,8 +2859,9 @@ static void alc269_fixup_mic_mute_hook(void *private_data, int enabled) |
2500 | |
2501 | if (spec->mute_led_polarity) |
2502 | enabled = !enabled; |
2503 | - pinval = AC_PINCTL_IN_EN | |
2504 | - (enabled ? AC_PINCTL_VREF_HIZ : AC_PINCTL_VREF_80); |
2505 | + pinval = snd_hda_codec_get_pin_target(codec, spec->mute_led_nid); |
2506 | + pinval &= ~AC_PINCTL_VREFEN; |
2507 | + pinval |= enabled ? AC_PINCTL_VREF_HIZ : AC_PINCTL_VREF_80; |
2508 | if (spec->mute_led_nid) |
2509 | snd_hda_set_pin_ctl_cache(codec, spec->mute_led_nid, pinval); |
2510 | } |
2511 | @@ -3901,6 +3903,7 @@ static int patch_alc269(struct hda_codec *codec) |
2512 | spec->codec_variant = ALC269_TYPE_ALC284; |
2513 | break; |
2514 | case 0x10ec0286: |
2515 | + case 0x10ec0288: |
2516 | spec->codec_variant = ALC269_TYPE_ALC286; |
2517 | break; |
2518 | case 0x10ec0255: |
2519 | @@ -4643,6 +4646,7 @@ static const struct hda_codec_preset snd_hda_preset_realtek[] = { |
2520 | { .id = 0x10ec0283, .name = "ALC283", .patch = patch_alc269 }, |
2521 | { .id = 0x10ec0284, .name = "ALC284", .patch = patch_alc269 }, |
2522 | { .id = 0x10ec0286, .name = "ALC286", .patch = patch_alc269 }, |
2523 | + { .id = 0x10ec0288, .name = "ALC288", .patch = patch_alc269 }, |
2524 | { .id = 0x10ec0290, .name = "ALC290", .patch = patch_alc269 }, |
2525 | { .id = 0x10ec0292, .name = "ALC292", .patch = patch_alc269 }, |
2526 | { .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660", |
2527 | diff --git a/sound/pci/ice1712/ice1712.c b/sound/pci/ice1712/ice1712.c |
2528 | index 806407a3973e..e6b70e35f628 100644 |
2529 | --- a/sound/pci/ice1712/ice1712.c |
2530 | +++ b/sound/pci/ice1712/ice1712.c |
2531 | @@ -685,9 +685,10 @@ static snd_pcm_uframes_t snd_ice1712_playback_pointer(struct snd_pcm_substream * |
2532 | if (!(snd_ice1712_read(ice, ICE1712_IREG_PBK_CTRL) & 1)) |
2533 | return 0; |
2534 | ptr = runtime->buffer_size - inw(ice->ddma_port + 4); |
2535 | + ptr = bytes_to_frames(substream->runtime, ptr); |
2536 | if (ptr == runtime->buffer_size) |
2537 | ptr = 0; |
2538 | - return bytes_to_frames(substream->runtime, ptr); |
2539 | + return ptr; |
2540 | } |
2541 | |
2542 | static snd_pcm_uframes_t snd_ice1712_playback_ds_pointer(struct snd_pcm_substream *substream) |
2543 | @@ -704,9 +705,10 @@ static snd_pcm_uframes_t snd_ice1712_playback_ds_pointer(struct snd_pcm_substrea |
2544 | addr = ICE1712_DSC_ADDR0; |
2545 | ptr = snd_ice1712_ds_read(ice, substream->number * 2, addr) - |
2546 | ice->playback_con_virt_addr[substream->number]; |
2547 | + ptr = bytes_to_frames(substream->runtime, ptr); |
2548 | if (ptr == substream->runtime->buffer_size) |
2549 | ptr = 0; |
2550 | - return bytes_to_frames(substream->runtime, ptr); |
2551 | + return ptr; |
2552 | } |
2553 | |
2554 | static snd_pcm_uframes_t snd_ice1712_capture_pointer(struct snd_pcm_substream *substream) |
2555 | @@ -717,9 +719,10 @@ static snd_pcm_uframes_t snd_ice1712_capture_pointer(struct snd_pcm_substream *s |
2556 | if (!(snd_ice1712_read(ice, ICE1712_IREG_CAP_CTRL) & 1)) |
2557 | return 0; |
2558 | ptr = inl(ICEREG(ice, CONCAP_ADDR)) - ice->capture_con_virt_addr; |
2559 | + ptr = bytes_to_frames(substream->runtime, ptr); |
2560 | if (ptr == substream->runtime->buffer_size) |
2561 | ptr = 0; |
2562 | - return bytes_to_frames(substream->runtime, ptr); |
2563 | + return ptr; |
2564 | } |
2565 | |
2566 | static const struct snd_pcm_hardware snd_ice1712_playback = { |
2567 | @@ -1113,9 +1116,10 @@ static snd_pcm_uframes_t snd_ice1712_playback_pro_pointer(struct snd_pcm_substre |
2568 | if (!(inl(ICEMT(ice, PLAYBACK_CONTROL)) & ICE1712_PLAYBACK_START)) |
2569 | return 0; |
2570 | ptr = ice->playback_pro_size - (inw(ICEMT(ice, PLAYBACK_SIZE)) << 2); |
2571 | + ptr = bytes_to_frames(substream->runtime, ptr); |
2572 | if (ptr == substream->runtime->buffer_size) |
2573 | ptr = 0; |
2574 | - return bytes_to_frames(substream->runtime, ptr); |
2575 | + return ptr; |
2576 | } |
2577 | |
2578 | static snd_pcm_uframes_t snd_ice1712_capture_pro_pointer(struct snd_pcm_substream *substream) |
2579 | @@ -1126,9 +1130,10 @@ static snd_pcm_uframes_t snd_ice1712_capture_pro_pointer(struct snd_pcm_substrea |
2580 | if (!(inl(ICEMT(ice, PLAYBACK_CONTROL)) & ICE1712_CAPTURE_START_SHADOW)) |
2581 | return 0; |
2582 | ptr = ice->capture_pro_size - (inw(ICEMT(ice, CAPTURE_SIZE)) << 2); |
2583 | + ptr = bytes_to_frames(substream->runtime, ptr); |
2584 | if (ptr == substream->runtime->buffer_size) |
2585 | ptr = 0; |
2586 | - return bytes_to_frames(substream->runtime, ptr); |
2587 | + return ptr; |
2588 | } |
2589 | |
2590 | static const struct snd_pcm_hardware snd_ice1712_playback_pro = { |
2591 | diff --git a/sound/soc/codecs/cs42l51.c b/sound/soc/codecs/cs42l51.c |
2592 | index 1e0fa3b5f79a..e1dfebbea650 100644 |
2593 | --- a/sound/soc/codecs/cs42l51.c |
2594 | +++ b/sound/soc/codecs/cs42l51.c |
2595 | @@ -124,9 +124,8 @@ static int cs42l51_set_chan_mix(struct snd_kcontrol *kcontrol, |
2596 | |
2597 | static const DECLARE_TLV_DB_SCALE(adc_pcm_tlv, -5150, 50, 0); |
2598 | static const DECLARE_TLV_DB_SCALE(tone_tlv, -1050, 150, 0); |
2599 | -/* This is a lie. after -102 db, it stays at -102 */ |
2600 | -/* maybe a range would be better */ |
2601 | -static const DECLARE_TLV_DB_SCALE(aout_tlv, -11550, 50, 0); |
2602 | + |
2603 | +static const DECLARE_TLV_DB_SCALE(aout_tlv, -10200, 50, 0); |
2604 | |
2605 | static const DECLARE_TLV_DB_SCALE(boost_tlv, 1600, 1600, 0); |
2606 | static const char *chan_mix[] = { |
2607 | @@ -141,7 +140,7 @@ static const struct soc_enum cs42l51_chan_mix = |
2608 | static const struct snd_kcontrol_new cs42l51_snd_controls[] = { |
2609 | SOC_DOUBLE_R_SX_TLV("PCM Playback Volume", |
2610 | CS42L51_PCMA_VOL, CS42L51_PCMB_VOL, |
2611 | - 6, 0x19, 0x7F, adc_pcm_tlv), |
2612 | + 0, 0x19, 0x7F, adc_pcm_tlv), |
2613 | SOC_DOUBLE_R("PCM Playback Switch", |
2614 | CS42L51_PCMA_VOL, CS42L51_PCMB_VOL, 7, 1, 1), |
2615 | SOC_DOUBLE_R_SX_TLV("Analog Playback Volume", |
2616 | @@ -149,7 +148,7 @@ static const struct snd_kcontrol_new cs42l51_snd_controls[] = { |
2617 | 0, 0x34, 0xE4, aout_tlv), |
2618 | SOC_DOUBLE_R_SX_TLV("ADC Mixer Volume", |
2619 | CS42L51_ADCA_VOL, CS42L51_ADCB_VOL, |
2620 | - 6, 0x19, 0x7F, adc_pcm_tlv), |
2621 | + 0, 0x19, 0x7F, adc_pcm_tlv), |
2622 | SOC_DOUBLE_R("ADC Mixer Switch", |
2623 | CS42L51_ADCA_VOL, CS42L51_ADCB_VOL, 7, 1, 1), |
2624 | SOC_SINGLE("Playback Deemphasis Switch", CS42L51_DAC_CTL, 3, 1, 0), |
2625 | diff --git a/sound/soc/codecs/cs42l52.c b/sound/soc/codecs/cs42l52.c |
2626 | index ee25f325d65c..b99af6362de6 100644 |
2627 | --- a/sound/soc/codecs/cs42l52.c |
2628 | +++ b/sound/soc/codecs/cs42l52.c |
2629 | @@ -350,7 +350,7 @@ static const char * const right_swap_text[] = { |
2630 | static const unsigned int swap_values[] = { 0, 1, 3 }; |
2631 | |
2632 | static const struct soc_enum adca_swap_enum = |
2633 | - SOC_VALUE_ENUM_SINGLE(CS42L52_ADC_PCM_MIXER, 2, 1, |
2634 | + SOC_VALUE_ENUM_SINGLE(CS42L52_ADC_PCM_MIXER, 2, 3, |
2635 | ARRAY_SIZE(left_swap_text), |
2636 | left_swap_text, |
2637 | swap_values); |
2638 | @@ -359,7 +359,7 @@ static const struct snd_kcontrol_new adca_mixer = |
2639 | SOC_DAPM_ENUM("Route", adca_swap_enum); |
2640 | |
2641 | static const struct soc_enum pcma_swap_enum = |
2642 | - SOC_VALUE_ENUM_SINGLE(CS42L52_ADC_PCM_MIXER, 6, 1, |
2643 | + SOC_VALUE_ENUM_SINGLE(CS42L52_ADC_PCM_MIXER, 6, 3, |
2644 | ARRAY_SIZE(left_swap_text), |
2645 | left_swap_text, |
2646 | swap_values); |
2647 | @@ -368,7 +368,7 @@ static const struct snd_kcontrol_new pcma_mixer = |
2648 | SOC_DAPM_ENUM("Route", pcma_swap_enum); |
2649 | |
2650 | static const struct soc_enum adcb_swap_enum = |
2651 | - SOC_VALUE_ENUM_SINGLE(CS42L52_ADC_PCM_MIXER, 0, 1, |
2652 | + SOC_VALUE_ENUM_SINGLE(CS42L52_ADC_PCM_MIXER, 0, 3, |
2653 | ARRAY_SIZE(right_swap_text), |
2654 | right_swap_text, |
2655 | swap_values); |
2656 | @@ -377,7 +377,7 @@ static const struct snd_kcontrol_new adcb_mixer = |
2657 | SOC_DAPM_ENUM("Route", adcb_swap_enum); |
2658 | |
2659 | static const struct soc_enum pcmb_swap_enum = |
2660 | - SOC_VALUE_ENUM_SINGLE(CS42L52_ADC_PCM_MIXER, 4, 1, |
2661 | + SOC_VALUE_ENUM_SINGLE(CS42L52_ADC_PCM_MIXER, 4, 3, |
2662 | ARRAY_SIZE(right_swap_text), |
2663 | right_swap_text, |
2664 | swap_values); |
2665 | diff --git a/sound/soc/codecs/cs42l73.c b/sound/soc/codecs/cs42l73.c |
2666 | index 3b20c86cdb01..eade6e2d883d 100644 |
2667 | --- a/sound/soc/codecs/cs42l73.c |
2668 | +++ b/sound/soc/codecs/cs42l73.c |
2669 | @@ -325,7 +325,7 @@ static const char * const cs42l73_mono_mix_texts[] = { |
2670 | static const unsigned int cs42l73_mono_mix_values[] = { 0, 1, 2 }; |
2671 | |
2672 | static const struct soc_enum spk_asp_enum = |
2673 | - SOC_VALUE_ENUM_SINGLE(CS42L73_MMIXCTL, 6, 1, |
2674 | + SOC_VALUE_ENUM_SINGLE(CS42L73_MMIXCTL, 6, 3, |
2675 | ARRAY_SIZE(cs42l73_mono_mix_texts), |
2676 | cs42l73_mono_mix_texts, |
2677 | cs42l73_mono_mix_values); |
2678 | @@ -343,7 +343,7 @@ static const struct snd_kcontrol_new spk_xsp_mixer = |
2679 | SOC_DAPM_ENUM("Route", spk_xsp_enum); |
2680 | |
2681 | static const struct soc_enum esl_asp_enum = |
2682 | - SOC_VALUE_ENUM_SINGLE(CS42L73_MMIXCTL, 2, 5, |
2683 | + SOC_VALUE_ENUM_SINGLE(CS42L73_MMIXCTL, 2, 3, |
2684 | ARRAY_SIZE(cs42l73_mono_mix_texts), |
2685 | cs42l73_mono_mix_texts, |
2686 | cs42l73_mono_mix_values); |
2687 | @@ -352,7 +352,7 @@ static const struct snd_kcontrol_new esl_asp_mixer = |
2688 | SOC_DAPM_ENUM("Route", esl_asp_enum); |
2689 | |
2690 | static const struct soc_enum esl_xsp_enum = |
2691 | - SOC_VALUE_ENUM_SINGLE(CS42L73_MMIXCTL, 0, 7, |
2692 | + SOC_VALUE_ENUM_SINGLE(CS42L73_MMIXCTL, 0, 3, |
2693 | ARRAY_SIZE(cs42l73_mono_mix_texts), |
2694 | cs42l73_mono_mix_texts, |
2695 | cs42l73_mono_mix_values); |