Contents of /trunk/kernel-magellan/patches-3.8/0111-3.8.12-all-fixes.patch
Parent Directory | Revision Log
Revision 2173 -
(show annotations)
(download)
Thu May 16 13:31:54 2013 UTC (11 years, 4 months ago) by niro
File size: 105055 byte(s)
Thu May 16 13:31:54 2013 UTC (11 years, 4 months ago) by niro
File size: 105055 byte(s)
-linux-3.8.12
1 | diff --git a/arch/arm/boot/dts/at91sam9260.dtsi b/arch/arm/boot/dts/at91sam9260.dtsi |
2 | index cb7bcc5..02b70a4 100644 |
3 | --- a/arch/arm/boot/dts/at91sam9260.dtsi |
4 | +++ b/arch/arm/boot/dts/at91sam9260.dtsi |
5 | @@ -158,8 +158,8 @@ |
6 | usart1 { |
7 | pinctrl_usart1: usart1-0 { |
8 | atmel,pins = |
9 | - <2 6 0x1 0x1 /* PB6 periph A with pullup */ |
10 | - 2 7 0x1 0x0>; /* PB7 periph A */ |
11 | + <1 6 0x1 0x1 /* PB6 periph A with pullup */ |
12 | + 1 7 0x1 0x0>; /* PB7 periph A */ |
13 | }; |
14 | |
15 | pinctrl_usart1_rts: usart1_rts-0 { |
16 | @@ -194,18 +194,18 @@ |
17 | usart3 { |
18 | pinctrl_usart3: usart3-0 { |
19 | atmel,pins = |
20 | - <2 10 0x1 0x1 /* PB10 periph A with pullup */ |
21 | - 2 11 0x1 0x0>; /* PB11 periph A */ |
22 | + <1 10 0x1 0x1 /* PB10 periph A with pullup */ |
23 | + 1 11 0x1 0x0>; /* PB11 periph A */ |
24 | }; |
25 | |
26 | pinctrl_usart3_rts: usart3_rts-0 { |
27 | atmel,pins = |
28 | - <3 8 0x2 0x0>; /* PB8 periph B */ |
29 | + <2 8 0x2 0x0>; /* PC8 periph B */ |
30 | }; |
31 | |
32 | pinctrl_usart3_cts: usart3_cts-0 { |
33 | atmel,pins = |
34 | - <3 10 0x2 0x0>; /* PB10 periph B */ |
35 | + <2 10 0x2 0x0>; /* PC10 periph B */ |
36 | }; |
37 | }; |
38 | |
39 | @@ -220,8 +220,8 @@ |
40 | uart1 { |
41 | pinctrl_uart1: uart1-0 { |
42 | atmel,pins = |
43 | - <2 12 0x1 0x1 /* PB12 periph A with pullup */ |
44 | - 2 13 0x1 0x0>; /* PB13 periph A */ |
45 | + <1 12 0x1 0x1 /* PB12 periph A with pullup */ |
46 | + 1 13 0x1 0x0>; /* PB13 periph A */ |
47 | }; |
48 | }; |
49 | |
50 | diff --git a/arch/arm/boot/dts/at91sam9g15.dtsi b/arch/arm/boot/dts/at91sam9g15.dtsi |
51 | index fbe7a70..28467fd 100644 |
52 | --- a/arch/arm/boot/dts/at91sam9g15.dtsi |
53 | +++ b/arch/arm/boot/dts/at91sam9g15.dtsi |
54 | @@ -10,7 +10,7 @@ |
55 | |
56 | / { |
57 | model = "Atmel AT91SAM9G15 SoC"; |
58 | - compatible = "atmel, at91sam9g15, atmel,at91sam9x5"; |
59 | + compatible = "atmel,at91sam9g15", "atmel,at91sam9x5"; |
60 | |
61 | ahb { |
62 | apb { |
63 | diff --git a/arch/arm/boot/dts/at91sam9g15ek.dts b/arch/arm/boot/dts/at91sam9g15ek.dts |
64 | index 86dd3f6..5427b2d 100644 |
65 | --- a/arch/arm/boot/dts/at91sam9g15ek.dts |
66 | +++ b/arch/arm/boot/dts/at91sam9g15ek.dts |
67 | @@ -11,6 +11,6 @@ |
68 | /include/ "at91sam9x5ek.dtsi" |
69 | |
70 | / { |
71 | - model = "Atmel AT91SAM9G25-EK"; |
72 | + model = "Atmel AT91SAM9G15-EK"; |
73 | compatible = "atmel,at91sam9g15ek", "atmel,at91sam9x5ek", "atmel,at91sam9x5", "atmel,at91sam9"; |
74 | }; |
75 | diff --git a/arch/arm/boot/dts/at91sam9g25.dtsi b/arch/arm/boot/dts/at91sam9g25.dtsi |
76 | index 05a718f..5fd32df 100644 |
77 | --- a/arch/arm/boot/dts/at91sam9g25.dtsi |
78 | +++ b/arch/arm/boot/dts/at91sam9g25.dtsi |
79 | @@ -10,7 +10,7 @@ |
80 | |
81 | / { |
82 | model = "Atmel AT91SAM9G25 SoC"; |
83 | - compatible = "atmel, at91sam9g25, atmel,at91sam9x5"; |
84 | + compatible = "atmel,at91sam9g25", "atmel,at91sam9x5"; |
85 | |
86 | ahb { |
87 | apb { |
88 | diff --git a/arch/arm/boot/dts/at91sam9g35.dtsi b/arch/arm/boot/dts/at91sam9g35.dtsi |
89 | index f9d14a7..d6fa8af 100644 |
90 | --- a/arch/arm/boot/dts/at91sam9g35.dtsi |
91 | +++ b/arch/arm/boot/dts/at91sam9g35.dtsi |
92 | @@ -10,7 +10,7 @@ |
93 | |
94 | / { |
95 | model = "Atmel AT91SAM9G35 SoC"; |
96 | - compatible = "atmel, at91sam9g35, atmel,at91sam9x5"; |
97 | + compatible = "atmel,at91sam9g35", "atmel,at91sam9x5"; |
98 | |
99 | ahb { |
100 | apb { |
101 | diff --git a/arch/arm/boot/dts/at91sam9x25.dtsi b/arch/arm/boot/dts/at91sam9x25.dtsi |
102 | index 54eb33b..9ac2bc2 100644 |
103 | --- a/arch/arm/boot/dts/at91sam9x25.dtsi |
104 | +++ b/arch/arm/boot/dts/at91sam9x25.dtsi |
105 | @@ -10,7 +10,7 @@ |
106 | |
107 | / { |
108 | model = "Atmel AT91SAM9X25 SoC"; |
109 | - compatible = "atmel, at91sam9x25, atmel,at91sam9x5"; |
110 | + compatible = "atmel,at91sam9x25", "atmel,at91sam9x5"; |
111 | |
112 | ahb { |
113 | apb { |
114 | diff --git a/arch/arm/boot/dts/at91sam9x35.dtsi b/arch/arm/boot/dts/at91sam9x35.dtsi |
115 | index fb102d6..ba67d83 100644 |
116 | --- a/arch/arm/boot/dts/at91sam9x35.dtsi |
117 | +++ b/arch/arm/boot/dts/at91sam9x35.dtsi |
118 | @@ -10,7 +10,7 @@ |
119 | |
120 | / { |
121 | model = "Atmel AT91SAM9X35 SoC"; |
122 | - compatible = "atmel, at91sam9x35, atmel,at91sam9x5"; |
123 | + compatible = "atmel,at91sam9x35", "atmel,at91sam9x5"; |
124 | |
125 | ahb { |
126 | apb { |
127 | diff --git a/arch/arm/boot/dts/at91sam9x5ek.dtsi b/arch/arm/boot/dts/at91sam9x5ek.dtsi |
128 | index 8a7cf1d..ccab256 100644 |
129 | --- a/arch/arm/boot/dts/at91sam9x5ek.dtsi |
130 | +++ b/arch/arm/boot/dts/at91sam9x5ek.dtsi |
131 | @@ -13,7 +13,7 @@ |
132 | compatible = "atmel,at91sam9x5ek", "atmel,at91sam9x5", "atmel,at91sam9"; |
133 | |
134 | chosen { |
135 | - bootargs = "128M console=ttyS0,115200 root=/dev/mtdblock1 rw rootfstype=ubifs ubi.mtd=1 root=ubi0:rootfs"; |
136 | + bootargs = "console=ttyS0,115200 root=/dev/mtdblock1 rw rootfstype=ubifs ubi.mtd=1 root=ubi0:rootfs"; |
137 | }; |
138 | |
139 | ahb { |
140 | diff --git a/arch/arm/configs/at91sam9g45_defconfig b/arch/arm/configs/at91sam9g45_defconfig |
141 | index 606d48f..8aab786 100644 |
142 | --- a/arch/arm/configs/at91sam9g45_defconfig |
143 | +++ b/arch/arm/configs/at91sam9g45_defconfig |
144 | @@ -173,7 +173,6 @@ CONFIG_MMC=y |
145 | # CONFIG_MMC_BLOCK_BOUNCE is not set |
146 | CONFIG_SDIO_UART=m |
147 | CONFIG_MMC_ATMELMCI=y |
148 | -CONFIG_MMC_ATMELMCI_DMA=y |
149 | CONFIG_LEDS_ATMEL_PWM=y |
150 | CONFIG_LEDS_GPIO=y |
151 | CONFIG_LEDS_TRIGGER_TIMER=y |
152 | diff --git a/arch/arm/include/asm/pgtable.h b/arch/arm/include/asm/pgtable.h |
153 | index c094749..26e9ce4 100644 |
154 | --- a/arch/arm/include/asm/pgtable.h |
155 | +++ b/arch/arm/include/asm/pgtable.h |
156 | @@ -61,6 +61,15 @@ extern void __pgd_error(const char *file, int line, pgd_t); |
157 | #define FIRST_USER_ADDRESS PAGE_SIZE |
158 | |
159 | /* |
160 | + * Use TASK_SIZE as the ceiling argument for free_pgtables() and |
161 | + * free_pgd_range() to avoid freeing the modules pmd when LPAE is enabled (pmd |
162 | + * page shared between user and kernel). |
163 | + */ |
164 | +#ifdef CONFIG_ARM_LPAE |
165 | +#define USER_PGTABLES_CEILING TASK_SIZE |
166 | +#endif |
167 | + |
168 | +/* |
169 | * The pgprot_* and protection_map entries will be fixed up in runtime |
170 | * to include the cachable and bufferable bits based on memory policy, |
171 | * as well as any architecture dependent bits like global/ASID and SMP |
172 | diff --git a/arch/arm/mach-at91/setup.c b/arch/arm/mach-at91/setup.c |
173 | index 4b67847..6b4608d 100644 |
174 | --- a/arch/arm/mach-at91/setup.c |
175 | +++ b/arch/arm/mach-at91/setup.c |
176 | @@ -333,7 +333,7 @@ static void at91_dt_rstc(void) |
177 | |
178 | of_id = of_match_node(rstc_ids, np); |
179 | if (!of_id) |
180 | - panic("AT91: rtsc no restart function availlable\n"); |
181 | + panic("AT91: rtsc no restart function available\n"); |
182 | |
183 | arm_pm_restart = of_id->data; |
184 | |
185 | diff --git a/arch/arm/mach-omap2/cpuidle34xx.c b/arch/arm/mach-omap2/cpuidle34xx.c |
186 | index 22590db..aa20002 100644 |
187 | --- a/arch/arm/mach-omap2/cpuidle34xx.c |
188 | +++ b/arch/arm/mach-omap2/cpuidle34xx.c |
189 | @@ -265,8 +265,9 @@ static int omap3_enter_idle_bm(struct cpuidle_device *dev, |
190 | static DEFINE_PER_CPU(struct cpuidle_device, omap3_idle_dev); |
191 | |
192 | static struct cpuidle_driver omap3_idle_driver = { |
193 | - .name = "omap3_idle", |
194 | - .owner = THIS_MODULE, |
195 | + .name = "omap3_idle", |
196 | + .owner = THIS_MODULE, |
197 | + .en_core_tk_irqen = 1, |
198 | .states = { |
199 | { |
200 | .enter = omap3_enter_idle_bm, |
201 | diff --git a/arch/arm/mach-u300/include/mach/u300-regs.h b/arch/arm/mach-u300/include/mach/u300-regs.h |
202 | index 1e49d90..0320495 100644 |
203 | --- a/arch/arm/mach-u300/include/mach/u300-regs.h |
204 | +++ b/arch/arm/mach-u300/include/mach/u300-regs.h |
205 | @@ -95,7 +95,7 @@ |
206 | #define U300_SPI_BASE (U300_FAST_PER_PHYS_BASE+0x6000) |
207 | |
208 | /* Fast UART1 on U335 only */ |
209 | -#define U300_UART1_BASE (U300_SLOW_PER_PHYS_BASE+0x7000) |
210 | +#define U300_UART1_BASE (U300_FAST_PER_PHYS_BASE+0x7000) |
211 | |
212 | /* |
213 | * SLOW peripherals |
214 | diff --git a/arch/avr32/configs/favr-32_defconfig b/arch/avr32/configs/favr-32_defconfig |
215 | index 0421498..9791820 100644 |
216 | --- a/arch/avr32/configs/favr-32_defconfig |
217 | +++ b/arch/avr32/configs/favr-32_defconfig |
218 | @@ -122,7 +122,6 @@ CONFIG_USB_G_SERIAL=m |
219 | CONFIG_USB_CDC_COMPOSITE=m |
220 | CONFIG_MMC=y |
221 | CONFIG_MMC_ATMELMCI=y |
222 | -CONFIG_MMC_ATMELMCI_DMA=y |
223 | CONFIG_NEW_LEDS=y |
224 | CONFIG_LEDS_CLASS=y |
225 | CONFIG_LEDS_ATMEL_PWM=m |
226 | diff --git a/arch/avr32/configs/merisc_defconfig b/arch/avr32/configs/merisc_defconfig |
227 | index 3befab9..65de443 100644 |
228 | --- a/arch/avr32/configs/merisc_defconfig |
229 | +++ b/arch/avr32/configs/merisc_defconfig |
230 | @@ -102,7 +102,6 @@ CONFIG_FRAMEBUFFER_CONSOLE=y |
231 | CONFIG_LOGO=y |
232 | CONFIG_MMC=y |
233 | CONFIG_MMC_ATMELMCI=y |
234 | -CONFIG_MMC_ATMELMCI_DMA=y |
235 | CONFIG_NEW_LEDS=y |
236 | CONFIG_LEDS_CLASS=y |
237 | CONFIG_LEDS_ATMEL_PWM=y |
238 | diff --git a/arch/ia64/include/asm/futex.h b/arch/ia64/include/asm/futex.h |
239 | index d2bf1fd..76acbcd 100644 |
240 | --- a/arch/ia64/include/asm/futex.h |
241 | +++ b/arch/ia64/include/asm/futex.h |
242 | @@ -106,16 +106,15 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, |
243 | return -EFAULT; |
244 | |
245 | { |
246 | - register unsigned long r8 __asm ("r8"); |
247 | + register unsigned long r8 __asm ("r8") = 0; |
248 | unsigned long prev; |
249 | __asm__ __volatile__( |
250 | " mf;; \n" |
251 | - " mov %0=r0 \n" |
252 | " mov ar.ccv=%4;; \n" |
253 | "[1:] cmpxchg4.acq %1=[%2],%3,ar.ccv \n" |
254 | " .xdata4 \"__ex_table\", 1b-., 2f-. \n" |
255 | "[2:]" |
256 | - : "=r" (r8), "=r" (prev) |
257 | + : "+r" (r8), "=&r" (prev) |
258 | : "r" (uaddr), "r" (newval), |
259 | "rO" ((long) (unsigned) oldval) |
260 | : "memory"); |
261 | diff --git a/arch/ia64/include/asm/mca.h b/arch/ia64/include/asm/mca.h |
262 | index 43f96ab..8c70961 100644 |
263 | --- a/arch/ia64/include/asm/mca.h |
264 | +++ b/arch/ia64/include/asm/mca.h |
265 | @@ -143,6 +143,7 @@ extern unsigned long __per_cpu_mca[NR_CPUS]; |
266 | extern int cpe_vector; |
267 | extern int ia64_cpe_irq; |
268 | extern void ia64_mca_init(void); |
269 | +extern void ia64_mca_irq_init(void); |
270 | extern void ia64_mca_cpu_init(void *); |
271 | extern void ia64_os_mca_dispatch(void); |
272 | extern void ia64_os_mca_dispatch_end(void); |
273 | diff --git a/arch/ia64/kernel/irq.c b/arch/ia64/kernel/irq.c |
274 | index ad69606..f2c41828 100644 |
275 | --- a/arch/ia64/kernel/irq.c |
276 | +++ b/arch/ia64/kernel/irq.c |
277 | @@ -23,6 +23,8 @@ |
278 | #include <linux/interrupt.h> |
279 | #include <linux/kernel_stat.h> |
280 | |
281 | +#include <asm/mca.h> |
282 | + |
283 | /* |
284 | * 'what should we do if we get a hw irq event on an illegal vector'. |
285 | * each architecture has to answer this themselves. |
286 | @@ -83,6 +85,12 @@ bool is_affinity_mask_valid(const struct cpumask *cpumask) |
287 | |
288 | #endif /* CONFIG_SMP */ |
289 | |
290 | +int __init arch_early_irq_init(void) |
291 | +{ |
292 | + ia64_mca_irq_init(); |
293 | + return 0; |
294 | +} |
295 | + |
296 | #ifdef CONFIG_HOTPLUG_CPU |
297 | unsigned int vectors_in_migration[NR_IRQS]; |
298 | |
299 | diff --git a/arch/ia64/kernel/mca.c b/arch/ia64/kernel/mca.c |
300 | index 65bf9cd..d7396db 100644 |
301 | --- a/arch/ia64/kernel/mca.c |
302 | +++ b/arch/ia64/kernel/mca.c |
303 | @@ -2074,22 +2074,16 @@ ia64_mca_init(void) |
304 | printk(KERN_INFO "MCA related initialization done\n"); |
305 | } |
306 | |
307 | + |
308 | /* |
309 | - * ia64_mca_late_init |
310 | - * |
311 | - * Opportunity to setup things that require initialization later |
312 | - * than ia64_mca_init. Setup a timer to poll for CPEs if the |
313 | - * platform doesn't support an interrupt driven mechanism. |
314 | - * |
315 | - * Inputs : None |
316 | - * Outputs : Status |
317 | + * These pieces cannot be done in ia64_mca_init() because it is called before |
318 | + * early_irq_init() which would wipe out our percpu irq registrations. But we |
319 | + * cannot leave them until ia64_mca_late_init() because by then all the other |
320 | + * processors have been brought online and have set their own CMC vectors to |
321 | + * point at a non-existant action. Called from arch_early_irq_init(). |
322 | */ |
323 | -static int __init |
324 | -ia64_mca_late_init(void) |
325 | +void __init ia64_mca_irq_init(void) |
326 | { |
327 | - if (!mca_init) |
328 | - return 0; |
329 | - |
330 | /* |
331 | * Configure the CMCI/P vector and handler. Interrupts for CMC are |
332 | * per-processor, so AP CMC interrupts are setup in smp_callin() (smpboot.c). |
333 | @@ -2108,6 +2102,23 @@ ia64_mca_late_init(void) |
334 | /* Setup the CPEI/P handler */ |
335 | register_percpu_irq(IA64_CPEP_VECTOR, &mca_cpep_irqaction); |
336 | #endif |
337 | +} |
338 | + |
339 | +/* |
340 | + * ia64_mca_late_init |
341 | + * |
342 | + * Opportunity to setup things that require initialization later |
343 | + * than ia64_mca_init. Setup a timer to poll for CPEs if the |
344 | + * platform doesn't support an interrupt driven mechanism. |
345 | + * |
346 | + * Inputs : None |
347 | + * Outputs : Status |
348 | + */ |
349 | +static int __init |
350 | +ia64_mca_late_init(void) |
351 | +{ |
352 | + if (!mca_init) |
353 | + return 0; |
354 | |
355 | register_hotcpu_notifier(&mca_cpu_notifier); |
356 | |
357 | diff --git a/arch/ia64/kvm/vtlb.c b/arch/ia64/kvm/vtlb.c |
358 | index 4332f7e..a7869f8 100644 |
359 | --- a/arch/ia64/kvm/vtlb.c |
360 | +++ b/arch/ia64/kvm/vtlb.c |
361 | @@ -256,7 +256,7 @@ u64 guest_vhpt_lookup(u64 iha, u64 *pte) |
362 | "srlz.d;;" |
363 | "ssm psr.i;;" |
364 | "srlz.d;;" |
365 | - : "=r"(ret) : "r"(iha), "r"(pte):"memory"); |
366 | + : "=&r"(ret) : "r"(iha), "r"(pte) : "memory"); |
367 | |
368 | return ret; |
369 | } |
370 | diff --git a/arch/powerpc/kernel/cpu_setup_power.S b/arch/powerpc/kernel/cpu_setup_power.S |
371 | index 57cf140..0c0fc7b 100644 |
372 | --- a/arch/powerpc/kernel/cpu_setup_power.S |
373 | +++ b/arch/powerpc/kernel/cpu_setup_power.S |
374 | @@ -64,6 +64,7 @@ _GLOBAL(__restore_cpu_power8) |
375 | mflr r11 |
376 | mfmsr r3 |
377 | rldicl. r0,r3,4,63 |
378 | + mtlr r11 |
379 | beqlr |
380 | li r0,0 |
381 | mtspr SPRN_LPID,r0 |
382 | diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S |
383 | index 3684cbd..bb11075 100644 |
384 | --- a/arch/powerpc/kernel/exceptions-64s.S |
385 | +++ b/arch/powerpc/kernel/exceptions-64s.S |
386 | @@ -740,7 +740,7 @@ hardware_interrupt_relon_hv: |
387 | _MASKABLE_RELON_EXCEPTION_PSERIES(0x502, hardware_interrupt, EXC_HV, SOFTEN_TEST_HV) |
388 | FTR_SECTION_ELSE |
389 | _MASKABLE_RELON_EXCEPTION_PSERIES(0x500, hardware_interrupt, EXC_STD, SOFTEN_TEST_PR) |
390 | - ALT_FTR_SECTION_END_IFSET(CPU_FTR_ARCH_206) |
391 | + ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE) |
392 | STD_RELON_EXCEPTION_PSERIES(0x4600, 0x600, alignment) |
393 | STD_RELON_EXCEPTION_PSERIES(0x4700, 0x700, program_check) |
394 | STD_RELON_EXCEPTION_PSERIES(0x4800, 0x800, fp_unavailable) |
395 | diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S |
396 | index 116f086..1a63feb 100644 |
397 | --- a/arch/powerpc/kernel/head_64.S |
398 | +++ b/arch/powerpc/kernel/head_64.S |
399 | @@ -490,6 +490,7 @@ _GLOBAL(copy_and_flush) |
400 | sync |
401 | addi r5,r5,8 |
402 | addi r6,r6,8 |
403 | + isync |
404 | blr |
405 | |
406 | .align 8 |
407 | diff --git a/arch/powerpc/platforms/cell/spufs/inode.c b/arch/powerpc/platforms/cell/spufs/inode.c |
408 | index dba1ce2..506dc9f 100644 |
409 | --- a/arch/powerpc/platforms/cell/spufs/inode.c |
410 | +++ b/arch/powerpc/platforms/cell/spufs/inode.c |
411 | @@ -99,6 +99,7 @@ spufs_new_inode(struct super_block *sb, umode_t mode) |
412 | if (!inode) |
413 | goto out; |
414 | |
415 | + inode->i_ino = get_next_ino(); |
416 | inode->i_mode = mode; |
417 | inode->i_uid = current_fsuid(); |
418 | inode->i_gid = current_fsgid(); |
419 | diff --git a/arch/x86/crypto/crc32c-pcl-intel-asm_64.S b/arch/x86/crypto/crc32c-pcl-intel-asm_64.S |
420 | index 93c6d39..b0f7d39 100644 |
421 | --- a/arch/x86/crypto/crc32c-pcl-intel-asm_64.S |
422 | +++ b/arch/x86/crypto/crc32c-pcl-intel-asm_64.S |
423 | @@ -42,6 +42,8 @@ |
424 | * SOFTWARE. |
425 | */ |
426 | |
427 | +#include <asm/inst.h> |
428 | + |
429 | ## ISCSI CRC 32 Implementation with crc32 and pclmulqdq Instruction |
430 | |
431 | .macro LABEL prefix n |
432 | @@ -224,10 +226,10 @@ LABEL crc_ %i |
433 | movdqa (bufp), %xmm0 # 2 consts: K1:K2 |
434 | |
435 | movq crc_init, %xmm1 # CRC for block 1 |
436 | - pclmulqdq $0x00,%xmm0,%xmm1 # Multiply by K2 |
437 | + PCLMULQDQ 0x00,%xmm0,%xmm1 # Multiply by K2 |
438 | |
439 | movq crc1, %xmm2 # CRC for block 2 |
440 | - pclmulqdq $0x10, %xmm0, %xmm2 # Multiply by K1 |
441 | + PCLMULQDQ 0x10, %xmm0, %xmm2 # Multiply by K1 |
442 | |
443 | pxor %xmm2,%xmm1 |
444 | movq %xmm1, %rax |
445 | diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c |
446 | index e4595f1..84b7789 100644 |
447 | --- a/arch/x86/kernel/irq.c |
448 | +++ b/arch/x86/kernel/irq.c |
449 | @@ -165,10 +165,6 @@ u64 arch_irq_stat_cpu(unsigned int cpu) |
450 | u64 arch_irq_stat(void) |
451 | { |
452 | u64 sum = atomic_read(&irq_err_count); |
453 | - |
454 | -#ifdef CONFIG_X86_IO_APIC |
455 | - sum += atomic_read(&irq_mis_count); |
456 | -#endif |
457 | return sum; |
458 | } |
459 | |
460 | diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c |
461 | index a27e763..d330b3c 100644 |
462 | --- a/arch/x86/kvm/emulate.c |
463 | +++ b/arch/x86/kvm/emulate.c |
464 | @@ -4030,6 +4030,10 @@ static int decode_operand(struct x86_emulate_ctxt *ctxt, struct operand *op, |
465 | break; |
466 | case OpMem8: |
467 | ctxt->memop.bytes = 1; |
468 | + if (ctxt->memop.type == OP_REG) { |
469 | + ctxt->memop.addr.reg = decode_register(ctxt, ctxt->modrm_rm, 1); |
470 | + fetch_register_operand(&ctxt->memop); |
471 | + } |
472 | goto mem_common; |
473 | case OpMem16: |
474 | ctxt->memop.bytes = 2; |
475 | diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c |
476 | index 2262003..08c6511 100644 |
477 | --- a/arch/x86/xen/enlighten.c |
478 | +++ b/arch/x86/xen/enlighten.c |
479 | @@ -1589,8 +1589,11 @@ static int __cpuinit xen_hvm_cpu_notify(struct notifier_block *self, |
480 | switch (action) { |
481 | case CPU_UP_PREPARE: |
482 | xen_vcpu_setup(cpu); |
483 | - if (xen_have_vector_callback) |
484 | + if (xen_have_vector_callback) { |
485 | xen_init_lock_cpu(cpu); |
486 | + if (xen_feature(XENFEAT_hvm_safe_pvclock)) |
487 | + xen_setup_timer(cpu); |
488 | + } |
489 | break; |
490 | default: |
491 | break; |
492 | diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c |
493 | index 34bc4ce..48d7b2c 100644 |
494 | --- a/arch/x86/xen/smp.c |
495 | +++ b/arch/x86/xen/smp.c |
496 | @@ -658,6 +658,8 @@ static void xen_hvm_cpu_die(unsigned int cpu) |
497 | unbind_from_irqhandler(per_cpu(xen_debug_irq, cpu), NULL); |
498 | unbind_from_irqhandler(per_cpu(xen_callfuncsingle_irq, cpu), NULL); |
499 | unbind_from_irqhandler(per_cpu(xen_irq_work, cpu), NULL); |
500 | + xen_uninit_lock_cpu(cpu); |
501 | + xen_teardown_timer(cpu); |
502 | native_cpu_die(cpu); |
503 | } |
504 | |
505 | diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c |
506 | index 0296a95..054cc01 100644 |
507 | --- a/arch/x86/xen/time.c |
508 | +++ b/arch/x86/xen/time.c |
509 | @@ -497,7 +497,11 @@ static void xen_hvm_setup_cpu_clockevents(void) |
510 | { |
511 | int cpu = smp_processor_id(); |
512 | xen_setup_runstate_info(cpu); |
513 | - xen_setup_timer(cpu); |
514 | + /* |
515 | + * xen_setup_timer(cpu) - snprintf is bad in atomic context. Hence |
516 | + * doing it xen_hvm_cpu_notify (which gets called by smp_init during |
517 | + * early bootup and also during CPU hotplug events). |
518 | + */ |
519 | xen_setup_cpu_clockevents(); |
520 | } |
521 | |
522 | diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c |
523 | index bd22f86..2999966 100644 |
524 | --- a/drivers/acpi/osl.c |
525 | +++ b/drivers/acpi/osl.c |
526 | @@ -642,7 +642,7 @@ void __init acpi_initrd_override(void *data, size_t size) |
527 | * Both memblock_reserve and e820_add_region (via arch_reserve_mem_area) |
528 | * works fine. |
529 | */ |
530 | - memblock_reserve(acpi_tables_addr, acpi_tables_addr + all_tables_size); |
531 | + memblock_reserve(acpi_tables_addr, all_tables_size); |
532 | arch_reserve_mem_area(acpi_tables_addr, all_tables_size); |
533 | |
534 | p = early_ioremap(acpi_tables_addr, all_tables_size); |
535 | diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c |
536 | index eb73798..77c9a92 100644 |
537 | --- a/drivers/acpi/pci_root.c |
538 | +++ b/drivers/acpi/pci_root.c |
539 | @@ -240,8 +240,8 @@ static acpi_status acpi_pci_query_osc(struct acpi_pci_root *root, |
540 | *control &= OSC_PCI_CONTROL_MASKS; |
541 | capbuf[OSC_CONTROL_TYPE] = *control | root->osc_control_set; |
542 | } else { |
543 | - /* Run _OSC query for all possible controls. */ |
544 | - capbuf[OSC_CONTROL_TYPE] = OSC_PCI_CONTROL_MASKS; |
545 | + /* Run _OSC query only with existing controls. */ |
546 | + capbuf[OSC_CONTROL_TYPE] = root->osc_control_set; |
547 | } |
548 | |
549 | status = acpi_pci_run_osc(root->device->handle, capbuf, &result); |
550 | diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c |
551 | index 506fbd4..25246e8 100644 |
552 | --- a/drivers/acpi/thermal.c |
553 | +++ b/drivers/acpi/thermal.c |
554 | @@ -719,9 +719,19 @@ static int thermal_get_trend(struct thermal_zone_device *thermal, |
555 | return -EINVAL; |
556 | |
557 | if (type == THERMAL_TRIP_ACTIVE) { |
558 | - /* aggressive active cooling */ |
559 | - *trend = THERMAL_TREND_RAISING; |
560 | - return 0; |
561 | + unsigned long trip_temp; |
562 | + unsigned long temp = KELVIN_TO_MILLICELSIUS(tz->temperature, |
563 | + tz->kelvin_offset); |
564 | + if (thermal_get_trip_temp(thermal, trip, &trip_temp)) |
565 | + return -EINVAL; |
566 | + |
567 | + if (temp > trip_temp) { |
568 | + *trend = THERMAL_TREND_RAISING; |
569 | + return 0; |
570 | + } else { |
571 | + /* Fall back on default trend */ |
572 | + return -EINVAL; |
573 | + } |
574 | } |
575 | |
576 | /* |
577 | diff --git a/drivers/ata/libata-acpi.c b/drivers/ata/libata-acpi.c |
578 | index ef01ac0..cc8aa9e 100644 |
579 | --- a/drivers/ata/libata-acpi.c |
580 | +++ b/drivers/ata/libata-acpi.c |
581 | @@ -60,7 +60,8 @@ acpi_handle ata_ap_acpi_handle(struct ata_port *ap) |
582 | if (ap->flags & ATA_FLAG_ACPI_SATA) |
583 | return NULL; |
584 | |
585 | - return acpi_get_child(DEVICE_ACPI_HANDLE(ap->host->dev), ap->port_no); |
586 | + return ap->scsi_host ? |
587 | + DEVICE_ACPI_HANDLE(&ap->scsi_host->shost_gendev) : NULL; |
588 | } |
589 | EXPORT_SYMBOL(ata_ap_acpi_handle); |
590 | |
591 | @@ -239,28 +240,15 @@ void ata_acpi_dissociate(struct ata_host *host) |
592 | } |
593 | } |
594 | |
595 | -/** |
596 | - * ata_acpi_gtm - execute _GTM |
597 | - * @ap: target ATA port |
598 | - * @gtm: out parameter for _GTM result |
599 | - * |
600 | - * Evaluate _GTM and store the result in @gtm. |
601 | - * |
602 | - * LOCKING: |
603 | - * EH context. |
604 | - * |
605 | - * RETURNS: |
606 | - * 0 on success, -ENOENT if _GTM doesn't exist, -errno on failure. |
607 | - */ |
608 | -int ata_acpi_gtm(struct ata_port *ap, struct ata_acpi_gtm *gtm) |
609 | +static int __ata_acpi_gtm(struct ata_port *ap, acpi_handle handle, |
610 | + struct ata_acpi_gtm *gtm) |
611 | { |
612 | struct acpi_buffer output = { .length = ACPI_ALLOCATE_BUFFER }; |
613 | union acpi_object *out_obj; |
614 | acpi_status status; |
615 | int rc = 0; |
616 | |
617 | - status = acpi_evaluate_object(ata_ap_acpi_handle(ap), "_GTM", NULL, |
618 | - &output); |
619 | + status = acpi_evaluate_object(handle, "_GTM", NULL, &output); |
620 | |
621 | rc = -ENOENT; |
622 | if (status == AE_NOT_FOUND) |
623 | @@ -294,6 +282,27 @@ int ata_acpi_gtm(struct ata_port *ap, struct ata_acpi_gtm *gtm) |
624 | return rc; |
625 | } |
626 | |
627 | +/** |
628 | + * ata_acpi_gtm - execute _GTM |
629 | + * @ap: target ATA port |
630 | + * @gtm: out parameter for _GTM result |
631 | + * |
632 | + * Evaluate _GTM and store the result in @gtm. |
633 | + * |
634 | + * LOCKING: |
635 | + * EH context. |
636 | + * |
637 | + * RETURNS: |
638 | + * 0 on success, -ENOENT if _GTM doesn't exist, -errno on failure. |
639 | + */ |
640 | +int ata_acpi_gtm(struct ata_port *ap, struct ata_acpi_gtm *gtm) |
641 | +{ |
642 | + if (ata_ap_acpi_handle(ap)) |
643 | + return __ata_acpi_gtm(ap, ata_ap_acpi_handle(ap), gtm); |
644 | + else |
645 | + return -EINVAL; |
646 | +} |
647 | + |
648 | EXPORT_SYMBOL_GPL(ata_acpi_gtm); |
649 | |
650 | /** |
651 | @@ -1095,7 +1104,7 @@ static int ata_acpi_bind_host(struct ata_port *ap, acpi_handle *handle) |
652 | if (!*handle) |
653 | return -ENODEV; |
654 | |
655 | - if (ata_acpi_gtm(ap, &ap->__acpi_init_gtm) == 0) |
656 | + if (__ata_acpi_gtm(ap, *handle, &ap->__acpi_init_gtm) == 0) |
657 | ap->pflags |= ATA_PFLAG_INIT_GTM_VALID; |
658 | |
659 | return 0; |
660 | diff --git a/drivers/ata/sata_highbank.c b/drivers/ata/sata_highbank.c |
661 | index 5dba77c..b1a664a 100644 |
662 | --- a/drivers/ata/sata_highbank.c |
663 | +++ b/drivers/ata/sata_highbank.c |
664 | @@ -251,7 +251,7 @@ static const struct ata_port_info ahci_highbank_port_info = { |
665 | }; |
666 | |
667 | static struct scsi_host_template ahci_highbank_platform_sht = { |
668 | - AHCI_SHT("highbank-ahci"), |
669 | + AHCI_SHT("sata_highbank"), |
670 | }; |
671 | |
672 | static const struct of_device_id ahci_of_match[] = { |
673 | diff --git a/drivers/char/tpm/tpm.c b/drivers/char/tpm/tpm.c |
674 | index 93211df..ba780b7 100644 |
675 | --- a/drivers/char/tpm/tpm.c |
676 | +++ b/drivers/char/tpm/tpm.c |
677 | @@ -1291,7 +1291,7 @@ int tpm_pm_suspend(struct device *dev) |
678 | { |
679 | struct tpm_chip *chip = dev_get_drvdata(dev); |
680 | struct tpm_cmd_t cmd; |
681 | - int rc; |
682 | + int rc, try; |
683 | |
684 | u8 dummy_hash[TPM_DIGEST_SIZE] = { 0 }; |
685 | |
686 | @@ -1309,9 +1309,32 @@ int tpm_pm_suspend(struct device *dev) |
687 | } |
688 | |
689 | /* now do the actual savestate */ |
690 | - cmd.header.in = savestate_header; |
691 | - rc = transmit_cmd(chip, &cmd, SAVESTATE_RESULT_SIZE, |
692 | - "sending savestate before suspend"); |
693 | + for (try = 0; try < TPM_RETRY; try++) { |
694 | + cmd.header.in = savestate_header; |
695 | + rc = transmit_cmd(chip, &cmd, SAVESTATE_RESULT_SIZE, NULL); |
696 | + |
697 | + /* |
698 | + * If the TPM indicates that it is too busy to respond to |
699 | + * this command then retry before giving up. It can take |
700 | + * several seconds for this TPM to be ready. |
701 | + * |
702 | + * This can happen if the TPM has already been sent the |
703 | + * SaveState command before the driver has loaded. TCG 1.2 |
704 | + * specification states that any communication after SaveState |
705 | + * may cause the TPM to invalidate previously saved state. |
706 | + */ |
707 | + if (rc != TPM_WARN_RETRY) |
708 | + break; |
709 | + msleep(TPM_TIMEOUT_RETRY); |
710 | + } |
711 | + |
712 | + if (rc) |
713 | + dev_err(chip->dev, |
714 | + "Error (%d) sending savestate before suspend\n", rc); |
715 | + else if (try > 0) |
716 | + dev_warn(chip->dev, "TPM savestate took %dms\n", |
717 | + try * TPM_TIMEOUT_RETRY); |
718 | + |
719 | return rc; |
720 | } |
721 | EXPORT_SYMBOL_GPL(tpm_pm_suspend); |
722 | diff --git a/drivers/char/tpm/tpm.h b/drivers/char/tpm/tpm.h |
723 | index 8ef7649..9c12a52 100644 |
724 | --- a/drivers/char/tpm/tpm.h |
725 | +++ b/drivers/char/tpm/tpm.h |
726 | @@ -32,10 +32,12 @@ enum tpm_const { |
727 | TPM_MINOR = 224, /* officially assigned */ |
728 | TPM_BUFSIZE = 4096, |
729 | TPM_NUM_DEVICES = 256, |
730 | + TPM_RETRY = 50, /* 5 seconds */ |
731 | }; |
732 | |
733 | enum tpm_timeout { |
734 | TPM_TIMEOUT = 5, /* msecs */ |
735 | + TPM_TIMEOUT_RETRY = 100 /* msecs */ |
736 | }; |
737 | |
738 | /* TPM addresses */ |
739 | @@ -44,6 +46,7 @@ enum tpm_addr { |
740 | TPM_ADDR = 0x4E, |
741 | }; |
742 | |
743 | +#define TPM_WARN_RETRY 0x800 |
744 | #define TPM_WARN_DOING_SELFTEST 0x802 |
745 | #define TPM_ERR_DEACTIVATED 0x6 |
746 | #define TPM_ERR_DISABLED 0x7 |
747 | diff --git a/drivers/i2c/busses/i2c-xiic.c b/drivers/i2c/busses/i2c-xiic.c |
748 | index f042f6d..fd7d66d 100644 |
749 | --- a/drivers/i2c/busses/i2c-xiic.c |
750 | +++ b/drivers/i2c/busses/i2c-xiic.c |
751 | @@ -312,10 +312,8 @@ static void xiic_fill_tx_fifo(struct xiic_i2c *i2c) |
752 | /* last message in transfer -> STOP */ |
753 | data |= XIIC_TX_DYN_STOP_MASK; |
754 | dev_dbg(i2c->adap.dev.parent, "%s TX STOP\n", __func__); |
755 | - |
756 | - xiic_setreg16(i2c, XIIC_DTR_REG_OFFSET, data); |
757 | - } else |
758 | - xiic_setreg8(i2c, XIIC_DTR_REG_OFFSET, data); |
759 | + } |
760 | + xiic_setreg16(i2c, XIIC_DTR_REG_OFFSET, data); |
761 | } |
762 | } |
763 | |
764 | diff --git a/drivers/md/md.c b/drivers/md/md.c |
765 | index f363135..0411bde 100644 |
766 | --- a/drivers/md/md.c |
767 | +++ b/drivers/md/md.c |
768 | @@ -1564,8 +1564,8 @@ static int super_1_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor_ |
769 | sector, count, 1) == 0) |
770 | return -EINVAL; |
771 | } |
772 | - } else if (sb->bblog_offset == 0) |
773 | - rdev->badblocks.shift = -1; |
774 | + } else if (sb->bblog_offset != 0) |
775 | + rdev->badblocks.shift = 0; |
776 | |
777 | if (!refdev) { |
778 | ret = 1; |
779 | @@ -3221,7 +3221,7 @@ int md_rdev_init(struct md_rdev *rdev) |
780 | * be used - I wonder if that matters |
781 | */ |
782 | rdev->badblocks.count = 0; |
783 | - rdev->badblocks.shift = 0; |
784 | + rdev->badblocks.shift = -1; /* disabled until explicitly enabled */ |
785 | rdev->badblocks.page = kmalloc(PAGE_SIZE, GFP_KERNEL); |
786 | seqlock_init(&rdev->badblocks.lock); |
787 | if (rdev->badblocks.page == NULL) |
788 | @@ -3293,9 +3293,6 @@ static struct md_rdev *md_import_device(dev_t newdev, int super_format, int supe |
789 | goto abort_free; |
790 | } |
791 | } |
792 | - if (super_format == -1) |
793 | - /* hot-add for 0.90, or non-persistent: so no badblocks */ |
794 | - rdev->badblocks.shift = -1; |
795 | |
796 | return rdev; |
797 | |
798 | diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c |
799 | index fd86b37..6af167f 100644 |
800 | --- a/drivers/md/raid1.c |
801 | +++ b/drivers/md/raid1.c |
802 | @@ -981,7 +981,12 @@ static void raid1_unplug(struct blk_plug_cb *cb, bool from_schedule) |
803 | while (bio) { /* submit pending writes */ |
804 | struct bio *next = bio->bi_next; |
805 | bio->bi_next = NULL; |
806 | - generic_make_request(bio); |
807 | + if (unlikely((bio->bi_rw & REQ_DISCARD) && |
808 | + !blk_queue_discard(bdev_get_queue(bio->bi_bdev)))) |
809 | + /* Just ignore it */ |
810 | + bio_endio(bio, 0); |
811 | + else |
812 | + generic_make_request(bio); |
813 | bio = next; |
814 | } |
815 | kfree(plug); |
816 | diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c |
817 | index b3898d4..61ab219 100644 |
818 | --- a/drivers/md/raid10.c |
819 | +++ b/drivers/md/raid10.c |
820 | @@ -1087,7 +1087,12 @@ static void raid10_unplug(struct blk_plug_cb *cb, bool from_schedule) |
821 | while (bio) { /* submit pending writes */ |
822 | struct bio *next = bio->bi_next; |
823 | bio->bi_next = NULL; |
824 | - generic_make_request(bio); |
825 | + if (unlikely((bio->bi_rw & REQ_DISCARD) && |
826 | + !blk_queue_discard(bdev_get_queue(bio->bi_bdev)))) |
827 | + /* Just ignore it */ |
828 | + bio_endio(bio, 0); |
829 | + else |
830 | + generic_make_request(bio); |
831 | bio = next; |
832 | } |
833 | kfree(plug); |
834 | diff --git a/drivers/mfd/adp5520.c b/drivers/mfd/adp5520.c |
835 | index 210dd03..6b40e0c 100644 |
836 | --- a/drivers/mfd/adp5520.c |
837 | +++ b/drivers/mfd/adp5520.c |
838 | @@ -36,6 +36,7 @@ struct adp5520_chip { |
839 | struct blocking_notifier_head notifier_list; |
840 | int irq; |
841 | unsigned long id; |
842 | + uint8_t mode; |
843 | }; |
844 | |
845 | static int __adp5520_read(struct i2c_client *client, |
846 | @@ -326,7 +327,10 @@ static int adp5520_suspend(struct device *dev) |
847 | struct i2c_client *client = to_i2c_client(dev); |
848 | struct adp5520_chip *chip = dev_get_drvdata(&client->dev); |
849 | |
850 | - adp5520_clr_bits(chip->dev, ADP5520_MODE_STATUS, ADP5520_nSTNBY); |
851 | + adp5520_read(chip->dev, ADP5520_MODE_STATUS, &chip->mode); |
852 | + /* All other bits are W1C */ |
853 | + chip->mode &= ADP5520_BL_EN | ADP5520_DIM_EN | ADP5520_nSTNBY; |
854 | + adp5520_write(chip->dev, ADP5520_MODE_STATUS, 0); |
855 | return 0; |
856 | } |
857 | |
858 | @@ -335,7 +339,7 @@ static int adp5520_resume(struct device *dev) |
859 | struct i2c_client *client = to_i2c_client(dev); |
860 | struct adp5520_chip *chip = dev_get_drvdata(&client->dev); |
861 | |
862 | - adp5520_set_bits(chip->dev, ADP5520_MODE_STATUS, ADP5520_nSTNBY); |
863 | + adp5520_write(chip->dev, ADP5520_MODE_STATUS, chip->mode); |
864 | return 0; |
865 | } |
866 | #endif |
867 | diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c |
868 | index 089e8ea..2743b7d 100644 |
869 | --- a/drivers/mmc/core/mmc.c |
870 | +++ b/drivers/mmc/core/mmc.c |
871 | @@ -368,13 +368,13 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd) |
872 | ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT]; |
873 | card->ext_csd.raw_trim_mult = |
874 | ext_csd[EXT_CSD_TRIM_MULT]; |
875 | + card->ext_csd.raw_partition_support = ext_csd[EXT_CSD_PARTITION_SUPPORT]; |
876 | if (card->ext_csd.rev >= 4) { |
877 | /* |
878 | * Enhanced area feature support -- check whether the eMMC |
879 | * card has the Enhanced area enabled. If so, export enhanced |
880 | * area offset and size to user by adding sysfs interface. |
881 | */ |
882 | - card->ext_csd.raw_partition_support = ext_csd[EXT_CSD_PARTITION_SUPPORT]; |
883 | if ((ext_csd[EXT_CSD_PARTITION_SUPPORT] & 0x2) && |
884 | (ext_csd[EXT_CSD_PARTITION_ATTRIBUTE] & 0x1)) { |
885 | hc_erase_grp_sz = |
886 | diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig |
887 | index 8d13c65..009dabd 100644 |
888 | --- a/drivers/mmc/host/Kconfig |
889 | +++ b/drivers/mmc/host/Kconfig |
890 | @@ -292,16 +292,6 @@ config MMC_ATMELMCI |
891 | |
892 | If unsure, say N. |
893 | |
894 | -config MMC_ATMELMCI_DMA |
895 | - bool "Atmel MCI DMA support" |
896 | - depends on MMC_ATMELMCI && (AVR32 || ARCH_AT91SAM9G45) && DMA_ENGINE |
897 | - help |
898 | - Say Y here to have the Atmel MCI driver use a DMA engine to |
899 | - do data transfers and thus increase the throughput and |
900 | - reduce the CPU utilization. |
901 | - |
902 | - If unsure, say N. |
903 | - |
904 | config MMC_MSM |
905 | tristate "Qualcomm SDCC Controller Support" |
906 | depends on MMC && ARCH_MSM |
907 | diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c |
908 | index 722af1d..e75774f 100644 |
909 | --- a/drivers/mmc/host/atmel-mci.c |
910 | +++ b/drivers/mmc/host/atmel-mci.c |
911 | @@ -178,6 +178,7 @@ struct atmel_mci { |
912 | void __iomem *regs; |
913 | |
914 | struct scatterlist *sg; |
915 | + unsigned int sg_len; |
916 | unsigned int pio_offset; |
917 | unsigned int *buffer; |
918 | unsigned int buf_size; |
919 | @@ -892,6 +893,7 @@ static u32 atmci_prepare_data(struct atmel_mci *host, struct mmc_data *data) |
920 | data->error = -EINPROGRESS; |
921 | |
922 | host->sg = data->sg; |
923 | + host->sg_len = data->sg_len; |
924 | host->data = data; |
925 | host->data_chan = NULL; |
926 | |
927 | @@ -1826,7 +1828,8 @@ static void atmci_read_data_pio(struct atmel_mci *host) |
928 | if (offset == sg->length) { |
929 | flush_dcache_page(sg_page(sg)); |
930 | host->sg = sg = sg_next(sg); |
931 | - if (!sg) |
932 | + host->sg_len--; |
933 | + if (!sg || !host->sg_len) |
934 | goto done; |
935 | |
936 | offset = 0; |
937 | @@ -1839,7 +1842,8 @@ static void atmci_read_data_pio(struct atmel_mci *host) |
938 | |
939 | flush_dcache_page(sg_page(sg)); |
940 | host->sg = sg = sg_next(sg); |
941 | - if (!sg) |
942 | + host->sg_len--; |
943 | + if (!sg || !host->sg_len) |
944 | goto done; |
945 | |
946 | offset = 4 - remaining; |
947 | @@ -1890,7 +1894,8 @@ static void atmci_write_data_pio(struct atmel_mci *host) |
948 | nbytes += 4; |
949 | if (offset == sg->length) { |
950 | host->sg = sg = sg_next(sg); |
951 | - if (!sg) |
952 | + host->sg_len--; |
953 | + if (!sg || !host->sg_len) |
954 | goto done; |
955 | |
956 | offset = 0; |
957 | @@ -1904,7 +1909,8 @@ static void atmci_write_data_pio(struct atmel_mci *host) |
958 | nbytes += remaining; |
959 | |
960 | host->sg = sg = sg_next(sg); |
961 | - if (!sg) { |
962 | + host->sg_len--; |
963 | + if (!sg || !host->sg_len) { |
964 | atmci_writel(host, ATMCI_TDR, value); |
965 | goto done; |
966 | } |
967 | @@ -2487,10 +2493,8 @@ static int __exit atmci_remove(struct platform_device *pdev) |
968 | atmci_readl(host, ATMCI_SR); |
969 | clk_disable(host->mck); |
970 | |
971 | -#ifdef CONFIG_MMC_ATMELMCI_DMA |
972 | if (host->dma.chan) |
973 | dma_release_channel(host->dma.chan); |
974 | -#endif |
975 | |
976 | free_irq(platform_get_irq(pdev, 0), host); |
977 | iounmap(host->regs); |
978 | diff --git a/drivers/net/ethernet/freescale/gianfar_ptp.c b/drivers/net/ethernet/freescale/gianfar_ptp.c |
979 | index 2e5daee..a3f8a25 100644 |
980 | --- a/drivers/net/ethernet/freescale/gianfar_ptp.c |
981 | +++ b/drivers/net/ethernet/freescale/gianfar_ptp.c |
982 | @@ -127,7 +127,6 @@ struct gianfar_ptp_registers { |
983 | |
984 | #define DRIVER "gianfar_ptp" |
985 | #define DEFAULT_CKSEL 1 |
986 | -#define N_ALARM 1 /* first alarm is used internally to reset fipers */ |
987 | #define N_EXT_TS 2 |
988 | #define REG_SIZE sizeof(struct gianfar_ptp_registers) |
989 | |
990 | @@ -410,7 +409,7 @@ static struct ptp_clock_info ptp_gianfar_caps = { |
991 | .owner = THIS_MODULE, |
992 | .name = "gianfar clock", |
993 | .max_adj = 512000, |
994 | - .n_alarm = N_ALARM, |
995 | + .n_alarm = 0, |
996 | .n_ext_ts = N_EXT_TS, |
997 | .n_per_out = 0, |
998 | .pps = 1, |
999 | diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c |
1000 | index 0d03d38..911956e 100644 |
1001 | --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c |
1002 | +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c |
1003 | @@ -2407,6 +2407,16 @@ static irqreturn_t ixgbe_msix_other(int irq, void *data) |
1004 | * with the write to EICR. |
1005 | */ |
1006 | eicr = IXGBE_READ_REG(hw, IXGBE_EICS); |
1007 | + |
1008 | + /* The lower 16bits of the EICR register are for the queue interrupts |
1009 | + * which should be masked here in order to not accidently clear them if |
1010 | + * the bits are high when ixgbe_msix_other is called. There is a race |
1011 | + * condition otherwise which results in possible performance loss |
1012 | + * especially if the ixgbe_msix_other interrupt is triggering |
1013 | + * consistently (as it would when PPS is turned on for the X540 device) |
1014 | + */ |
1015 | + eicr &= 0xFFFF0000; |
1016 | + |
1017 | IXGBE_WRITE_REG(hw, IXGBE_EICR, eicr); |
1018 | |
1019 | if (eicr & IXGBE_EICR_LSC) |
1020 | diff --git a/drivers/net/wireless/iwlwifi/dvm/debugfs.c b/drivers/net/wireless/iwlwifi/dvm/debugfs.c |
1021 | index 5b9533e..2c056b1 100644 |
1022 | --- a/drivers/net/wireless/iwlwifi/dvm/debugfs.c |
1023 | +++ b/drivers/net/wireless/iwlwifi/dvm/debugfs.c |
1024 | @@ -2237,15 +2237,15 @@ static ssize_t iwl_dbgfs_log_event_read(struct file *file, |
1025 | size_t count, loff_t *ppos) |
1026 | { |
1027 | struct iwl_priv *priv = file->private_data; |
1028 | - char *buf; |
1029 | - int pos = 0; |
1030 | - ssize_t ret = -ENOMEM; |
1031 | + char *buf = NULL; |
1032 | + ssize_t ret; |
1033 | |
1034 | - ret = pos = iwl_dump_nic_event_log(priv, true, &buf, true); |
1035 | - if (buf) { |
1036 | - ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); |
1037 | - kfree(buf); |
1038 | - } |
1039 | + ret = iwl_dump_nic_event_log(priv, true, &buf, true); |
1040 | + if (ret < 0) |
1041 | + goto err; |
1042 | + ret = simple_read_from_buffer(user_buf, count, ppos, buf, ret); |
1043 | +err: |
1044 | + kfree(buf); |
1045 | return ret; |
1046 | } |
1047 | |
1048 | diff --git a/drivers/net/wireless/iwlwifi/dvm/sta.c b/drivers/net/wireless/iwlwifi/dvm/sta.c |
1049 | index bdba954..a8632a4 100644 |
1050 | --- a/drivers/net/wireless/iwlwifi/dvm/sta.c |
1051 | +++ b/drivers/net/wireless/iwlwifi/dvm/sta.c |
1052 | @@ -707,6 +707,7 @@ void iwl_clear_ucode_stations(struct iwl_priv *priv, |
1053 | void iwl_restore_stations(struct iwl_priv *priv, struct iwl_rxon_context *ctx) |
1054 | { |
1055 | struct iwl_addsta_cmd sta_cmd; |
1056 | + static const struct iwl_link_quality_cmd zero_lq = {}; |
1057 | struct iwl_link_quality_cmd lq; |
1058 | int i; |
1059 | bool found = false; |
1060 | @@ -745,7 +746,9 @@ void iwl_restore_stations(struct iwl_priv *priv, struct iwl_rxon_context *ctx) |
1061 | else |
1062 | memcpy(&lq, priv->stations[i].lq, |
1063 | sizeof(struct iwl_link_quality_cmd)); |
1064 | - send_lq = true; |
1065 | + |
1066 | + if (!memcmp(&lq, &zero_lq, sizeof(lq))) |
1067 | + send_lq = true; |
1068 | } |
1069 | spin_unlock_bh(&priv->sta_lock); |
1070 | ret = iwl_send_add_sta(priv, &sta_cmd, CMD_SYNC); |
1071 | diff --git a/drivers/net/wireless/mwifiex/pcie.c b/drivers/net/wireless/mwifiex/pcie.c |
1072 | index 0bbea88..b7a5387 100644 |
1073 | --- a/drivers/net/wireless/mwifiex/pcie.c |
1074 | +++ b/drivers/net/wireless/mwifiex/pcie.c |
1075 | @@ -1831,9 +1831,9 @@ static void mwifiex_pcie_cleanup(struct mwifiex_adapter *adapter) |
1076 | if (pdev) { |
1077 | pci_iounmap(pdev, card->pci_mmap); |
1078 | pci_iounmap(pdev, card->pci_mmap1); |
1079 | - |
1080 | - pci_release_regions(pdev); |
1081 | pci_disable_device(pdev); |
1082 | + pci_release_region(pdev, 2); |
1083 | + pci_release_region(pdev, 0); |
1084 | pci_set_drvdata(pdev, NULL); |
1085 | } |
1086 | } |
1087 | diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c |
1088 | index 197b446..0b55706 100644 |
1089 | --- a/drivers/net/wireless/rt2x00/rt2800lib.c |
1090 | +++ b/drivers/net/wireless/rt2x00/rt2800lib.c |
1091 | @@ -4386,6 +4386,8 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev) |
1092 | |
1093 | if (!rt2x00_rt(rt2x00dev, RT5390) && |
1094 | !rt2x00_rt(rt2x00dev, RT5392)) { |
1095 | + u8 min_gain = rt2x00_rt(rt2x00dev, RT3070) ? 1 : 2; |
1096 | + |
1097 | rt2800_rfcsr_read(rt2x00dev, 17, &rfcsr); |
1098 | rt2x00_set_field8(&rfcsr, RFCSR17_TX_LO1_EN, 0); |
1099 | if (rt2x00_rt(rt2x00dev, RT3070) || |
1100 | @@ -4396,8 +4398,10 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev) |
1101 | &rt2x00dev->cap_flags)) |
1102 | rt2x00_set_field8(&rfcsr, RFCSR17_R, 1); |
1103 | } |
1104 | - rt2x00_set_field8(&rfcsr, RFCSR17_TXMIXER_GAIN, |
1105 | - drv_data->txmixer_gain_24g); |
1106 | + if (drv_data->txmixer_gain_24g >= min_gain) { |
1107 | + rt2x00_set_field8(&rfcsr, RFCSR17_TXMIXER_GAIN, |
1108 | + drv_data->txmixer_gain_24g); |
1109 | + } |
1110 | rt2800_rfcsr_write(rt2x00dev, 17, rfcsr); |
1111 | } |
1112 | |
1113 | diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c |
1114 | index 5cb5820..d1b4e00 100644 |
1115 | --- a/drivers/pci/pci.c |
1116 | +++ b/drivers/pci/pci.c |
1117 | @@ -651,15 +651,11 @@ static int pci_platform_power_transition(struct pci_dev *dev, pci_power_t state) |
1118 | error = platform_pci_set_power_state(dev, state); |
1119 | if (!error) |
1120 | pci_update_current_state(dev, state); |
1121 | - /* Fall back to PCI_D0 if native PM is not supported */ |
1122 | - if (!dev->pm_cap) |
1123 | - dev->current_state = PCI_D0; |
1124 | - } else { |
1125 | + } else |
1126 | error = -ENODEV; |
1127 | - /* Fall back to PCI_D0 if native PM is not supported */ |
1128 | - if (!dev->pm_cap) |
1129 | - dev->current_state = PCI_D0; |
1130 | - } |
1131 | + |
1132 | + if (error && !dev->pm_cap) /* Fall back to PCI_D0 */ |
1133 | + dev->current_state = PCI_D0; |
1134 | |
1135 | return error; |
1136 | } |
1137 | diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c |
1138 | index 16630aa..1c77423 100644 |
1139 | --- a/drivers/rtc/rtc-cmos.c |
1140 | +++ b/drivers/rtc/rtc-cmos.c |
1141 | @@ -805,9 +805,8 @@ static int cmos_suspend(struct device *dev) |
1142 | mask = RTC_IRQMASK; |
1143 | tmp &= ~mask; |
1144 | CMOS_WRITE(tmp, RTC_CONTROL); |
1145 | + hpet_mask_rtc_irq_bit(mask); |
1146 | |
1147 | - /* shut down hpet emulation - we don't need it for alarm */ |
1148 | - hpet_mask_rtc_irq_bit(RTC_PIE|RTC_AIE|RTC_UIE); |
1149 | cmos_checkintr(cmos, tmp); |
1150 | } |
1151 | spin_unlock_irq(&rtc_lock); |
1152 | @@ -872,6 +871,7 @@ static int cmos_resume(struct device *dev) |
1153 | rtc_update_irq(cmos->rtc, 1, mask); |
1154 | tmp &= ~RTC_AIE; |
1155 | hpet_mask_rtc_irq_bit(RTC_AIE); |
1156 | + hpet_rtc_timer_init(); |
1157 | } while (mask & RTC_AIE); |
1158 | spin_unlock_irq(&rtc_lock); |
1159 | } |
1160 | diff --git a/drivers/s390/char/sclp_cmd.c b/drivers/s390/char/sclp_cmd.c |
1161 | index c44d13f..56dcd7c 100644 |
1162 | --- a/drivers/s390/char/sclp_cmd.c |
1163 | +++ b/drivers/s390/char/sclp_cmd.c |
1164 | @@ -567,6 +567,8 @@ static void __init sclp_add_standby_memory(void) |
1165 | add_memory_merged(0); |
1166 | } |
1167 | |
1168 | +#define MEM_SCT_SIZE (1UL << SECTION_SIZE_BITS) |
1169 | + |
1170 | static void __init insert_increment(u16 rn, int standby, int assigned) |
1171 | { |
1172 | struct memory_increment *incr, *new_incr; |
1173 | @@ -579,7 +581,7 @@ static void __init insert_increment(u16 rn, int standby, int assigned) |
1174 | new_incr->rn = rn; |
1175 | new_incr->standby = standby; |
1176 | if (!standby) |
1177 | - new_incr->usecount = 1; |
1178 | + new_incr->usecount = rzm > MEM_SCT_SIZE ? rzm/MEM_SCT_SIZE : 1; |
1179 | last_rn = 0; |
1180 | prev = &sclp_mem_list; |
1181 | list_for_each_entry(incr, &sclp_mem_list, list) { |
1182 | diff --git a/drivers/staging/zsmalloc/Kconfig b/drivers/staging/zsmalloc/Kconfig |
1183 | index 9084565..7fab032 100644 |
1184 | --- a/drivers/staging/zsmalloc/Kconfig |
1185 | +++ b/drivers/staging/zsmalloc/Kconfig |
1186 | @@ -1,5 +1,5 @@ |
1187 | config ZSMALLOC |
1188 | - tristate "Memory allocator for compressed pages" |
1189 | + bool "Memory allocator for compressed pages" |
1190 | default n |
1191 | help |
1192 | zsmalloc is a slab-based memory allocator designed to store |
1193 | diff --git a/drivers/staging/zsmalloc/zsmalloc-main.c b/drivers/staging/zsmalloc/zsmalloc-main.c |
1194 | index 223c736..851a2ff 100644 |
1195 | --- a/drivers/staging/zsmalloc/zsmalloc-main.c |
1196 | +++ b/drivers/staging/zsmalloc/zsmalloc-main.c |
1197 | @@ -657,11 +657,8 @@ static inline void __zs_unmap_object(struct mapping_area *area, |
1198 | struct page *pages[2], int off, int size) |
1199 | { |
1200 | unsigned long addr = (unsigned long)area->vm_addr; |
1201 | - unsigned long end = addr + (PAGE_SIZE * 2); |
1202 | |
1203 | - flush_cache_vunmap(addr, end); |
1204 | - unmap_kernel_range_noflush(addr, PAGE_SIZE * 2); |
1205 | - flush_tlb_kernel_range(addr, end); |
1206 | + unmap_kernel_range(addr, PAGE_SIZE * 2); |
1207 | } |
1208 | |
1209 | #else /* USE_PGTABLE_MAPPING */ |
1210 | diff --git a/drivers/tty/pty.c b/drivers/tty/pty.c |
1211 | index ac35c90..c830b60 100644 |
1212 | --- a/drivers/tty/pty.c |
1213 | +++ b/drivers/tty/pty.c |
1214 | @@ -675,6 +675,9 @@ static int ptmx_open(struct inode *inode, struct file *filp) |
1215 | |
1216 | nonseekable_open(inode, filp); |
1217 | |
1218 | + /* We refuse fsnotify events on ptmx, since it's a shared resource */ |
1219 | + filp->f_mode |= FMODE_NONOTIFY; |
1220 | + |
1221 | retval = tty_alloc_file(filp); |
1222 | if (retval) |
1223 | return retval; |
1224 | diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c |
1225 | index 2c7230a..4293a3e 100644 |
1226 | --- a/drivers/tty/serial/serial_core.c |
1227 | +++ b/drivers/tty/serial/serial_core.c |
1228 | @@ -1940,6 +1940,8 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *uport) |
1229 | mutex_unlock(&port->mutex); |
1230 | return 0; |
1231 | } |
1232 | + put_device(tty_dev); |
1233 | + |
1234 | if (console_suspend_enabled || !uart_console(uport)) |
1235 | uport->suspended = 1; |
1236 | |
1237 | @@ -2005,9 +2007,11 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport) |
1238 | disable_irq_wake(uport->irq); |
1239 | uport->irq_wake = 0; |
1240 | } |
1241 | + put_device(tty_dev); |
1242 | mutex_unlock(&port->mutex); |
1243 | return 0; |
1244 | } |
1245 | + put_device(tty_dev); |
1246 | uport->suspended = 0; |
1247 | |
1248 | /* |
1249 | diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c |
1250 | index 892ecda..f34f98d 100644 |
1251 | --- a/drivers/tty/tty_io.c |
1252 | +++ b/drivers/tty/tty_io.c |
1253 | @@ -941,10 +941,10 @@ void start_tty(struct tty_struct *tty) |
1254 | |
1255 | EXPORT_SYMBOL(start_tty); |
1256 | |
1257 | +/* We limit tty time update visibility to every 8 seconds or so. */ |
1258 | static void tty_update_time(struct timespec *time) |
1259 | { |
1260 | - unsigned long sec = get_seconds(); |
1261 | - sec -= sec % 60; |
1262 | + unsigned long sec = get_seconds() & ~7; |
1263 | if ((long)(sec - time->tv_sec) > 0) |
1264 | time->tv_sec = sec; |
1265 | } |
1266 | diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c |
1267 | index 2f45bba..c0f4066 100644 |
1268 | --- a/drivers/usb/chipidea/udc.c |
1269 | +++ b/drivers/usb/chipidea/udc.c |
1270 | @@ -461,6 +461,8 @@ static int _hardware_enqueue(struct ci13xxx_ep *mEp, struct ci13xxx_req *mReq) |
1271 | mReq->ptr->page[i] = |
1272 | (mReq->req.dma + i * CI13XXX_PAGE_SIZE) & ~TD_RESERVED_MASK; |
1273 | |
1274 | + wmb(); |
1275 | + |
1276 | if (!list_empty(&mEp->qh.queue)) { |
1277 | struct ci13xxx_req *mReqPrev; |
1278 | int n = hw_ep_bit(mEp->num, mEp->dir); |
1279 | @@ -561,6 +563,12 @@ __acquires(mEp->lock) |
1280 | struct ci13xxx_req *mReq = \ |
1281 | list_entry(mEp->qh.queue.next, |
1282 | struct ci13xxx_req, queue); |
1283 | + |
1284 | + if (mReq->zptr) { |
1285 | + dma_pool_free(mEp->td_pool, mReq->zptr, mReq->zdma); |
1286 | + mReq->zptr = NULL; |
1287 | + } |
1288 | + |
1289 | list_del_init(&mReq->queue); |
1290 | mReq->req.status = -ESHUTDOWN; |
1291 | |
1292 | diff --git a/drivers/usb/chipidea/udc.h b/drivers/usb/chipidea/udc.h |
1293 | index 4ff2384d..d12e8b5 100644 |
1294 | --- a/drivers/usb/chipidea/udc.h |
1295 | +++ b/drivers/usb/chipidea/udc.h |
1296 | @@ -40,7 +40,7 @@ struct ci13xxx_td { |
1297 | #define TD_CURR_OFFSET (0x0FFFUL << 0) |
1298 | #define TD_FRAME_NUM (0x07FFUL << 0) |
1299 | #define TD_RESERVED_MASK (0x0FFFUL << 0) |
1300 | -} __attribute__ ((packed)); |
1301 | +} __attribute__ ((packed, aligned(4))); |
1302 | |
1303 | /* DMA layout of queue heads */ |
1304 | struct ci13xxx_qh { |
1305 | @@ -57,7 +57,7 @@ struct ci13xxx_qh { |
1306 | /* 9 */ |
1307 | u32 RESERVED; |
1308 | struct usb_ctrlrequest setup; |
1309 | -} __attribute__ ((packed)); |
1310 | +} __attribute__ ((packed, aligned(4))); |
1311 | |
1312 | /** |
1313 | * struct ci13xxx_req - usb request representation |
1314 | diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c |
1315 | index b78fbe2..ea0a9a1 100644 |
1316 | --- a/drivers/usb/core/devio.c |
1317 | +++ b/drivers/usb/core/devio.c |
1318 | @@ -738,6 +738,8 @@ static int check_ctrlrecip(struct dev_state *ps, unsigned int requesttype, |
1319 | index &= 0xff; |
1320 | switch (requesttype & USB_RECIP_MASK) { |
1321 | case USB_RECIP_ENDPOINT: |
1322 | + if ((index & ~USB_DIR_IN) == 0) |
1323 | + return 0; |
1324 | ret = findintfep(ps->dev, index); |
1325 | if (ret >= 0) |
1326 | ret = checkintf(ps, ret); |
1327 | diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c |
1328 | index 416a6dc..83b5a172 100644 |
1329 | --- a/drivers/usb/host/ehci-hcd.c |
1330 | +++ b/drivers/usb/host/ehci-hcd.c |
1331 | @@ -670,9 +670,6 @@ int ehci_setup(struct usb_hcd *hcd) |
1332 | if (retval) |
1333 | return retval; |
1334 | |
1335 | - if (ehci_is_TDI(ehci)) |
1336 | - tdi_reset(ehci); |
1337 | - |
1338 | ehci_reset(ehci); |
1339 | |
1340 | return 0; |
1341 | diff --git a/drivers/usb/misc/appledisplay.c b/drivers/usb/misc/appledisplay.c |
1342 | index 0fc6e5f..ba6a5d6 100644 |
1343 | --- a/drivers/usb/misc/appledisplay.c |
1344 | +++ b/drivers/usb/misc/appledisplay.c |
1345 | @@ -63,6 +63,7 @@ static const struct usb_device_id appledisplay_table[] = { |
1346 | { APPLEDISPLAY_DEVICE(0x9219) }, |
1347 | { APPLEDISPLAY_DEVICE(0x921c) }, |
1348 | { APPLEDISPLAY_DEVICE(0x921d) }, |
1349 | + { APPLEDISPLAY_DEVICE(0x9236) }, |
1350 | |
1351 | /* Terminating entry */ |
1352 | { } |
1353 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c |
1354 | index 8e4f40b..77f78ad 100644 |
1355 | --- a/drivers/usb/serial/ftdi_sio.c |
1356 | +++ b/drivers/usb/serial/ftdi_sio.c |
1357 | @@ -189,6 +189,7 @@ static struct usb_device_id id_table_combined [] = { |
1358 | { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_THROTTLE_PID) }, |
1359 | { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GATEWAY_PID) }, |
1360 | { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GBM_PID) }, |
1361 | + { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GBM_BOOST_PID) }, |
1362 | { USB_DEVICE(NEWPORT_VID, NEWPORT_AGILIS_PID) }, |
1363 | { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) }, |
1364 | { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) }, |
1365 | @@ -870,7 +871,9 @@ static struct usb_device_id id_table_combined [] = { |
1366 | { USB_DEVICE(FTDI_VID, FTDI_DOTEC_PID) }, |
1367 | { USB_DEVICE(QIHARDWARE_VID, MILKYMISTONE_JTAGSERIAL_PID), |
1368 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, |
1369 | - { USB_DEVICE(ST_VID, ST_STMCLT1030_PID), |
1370 | + { USB_DEVICE(ST_VID, ST_STMCLT_2232_PID), |
1371 | + .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, |
1372 | + { USB_DEVICE(ST_VID, ST_STMCLT_4232_PID), |
1373 | .driver_info = (kernel_ulong_t)&ftdi_stmclite_quirk }, |
1374 | { USB_DEVICE(FTDI_VID, FTDI_RF_R106) }, |
1375 | { USB_DEVICE(FTDI_VID, FTDI_DISTORTEC_JTAG_LOCK_PICK_PID), |
1376 | @@ -1792,20 +1795,24 @@ static int ftdi_8u2232c_probe(struct usb_serial *serial) |
1377 | } |
1378 | |
1379 | /* |
1380 | - * First and second port on STMCLiteadaptors is reserved for JTAG interface |
1381 | - * and the forth port for pio |
1382 | + * First two ports on JTAG adaptors using an FT4232 such as STMicroelectronics's |
1383 | + * ST Micro Connect Lite are reserved for JTAG or other non-UART interfaces and |
1384 | + * can be accessed from userspace. |
1385 | + * The next two ports are enabled as UARTs by default, where port 2 is |
1386 | + * a conventional RS-232 UART. |
1387 | */ |
1388 | static int ftdi_stmclite_probe(struct usb_serial *serial) |
1389 | { |
1390 | struct usb_device *udev = serial->dev; |
1391 | struct usb_interface *interface = serial->interface; |
1392 | |
1393 | - if (interface == udev->actconfig->interface[2]) |
1394 | - return 0; |
1395 | - |
1396 | - dev_info(&udev->dev, "Ignoring serial port reserved for JTAG\n"); |
1397 | + if (interface == udev->actconfig->interface[0] || |
1398 | + interface == udev->actconfig->interface[1]) { |
1399 | + dev_info(&udev->dev, "Ignoring serial port reserved for JTAG\n"); |
1400 | + return -ENODEV; |
1401 | + } |
1402 | |
1403 | - return -ENODEV; |
1404 | + return 0; |
1405 | } |
1406 | |
1407 | /* |
1408 | diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h |
1409 | index e79861e..9852827 100644 |
1410 | --- a/drivers/usb/serial/ftdi_sio_ids.h |
1411 | +++ b/drivers/usb/serial/ftdi_sio_ids.h |
1412 | @@ -74,6 +74,7 @@ |
1413 | #define FTDI_OPENDCC_THROTTLE_PID 0xBFDA |
1414 | #define FTDI_OPENDCC_GATEWAY_PID 0xBFDB |
1415 | #define FTDI_OPENDCC_GBM_PID 0xBFDC |
1416 | +#define FTDI_OPENDCC_GBM_BOOST_PID 0xBFDD |
1417 | |
1418 | /* NZR SEM 16+ USB (http://www.nzr.de) */ |
1419 | #define FTDI_NZR_SEM_USB_PID 0xC1E0 /* NZR SEM-LOG16+ */ |
1420 | @@ -1150,7 +1151,8 @@ |
1421 | * STMicroelectonics |
1422 | */ |
1423 | #define ST_VID 0x0483 |
1424 | -#define ST_STMCLT1030_PID 0x3747 /* ST Micro Connect Lite STMCLT1030 */ |
1425 | +#define ST_STMCLT_2232_PID 0x3746 |
1426 | +#define ST_STMCLT_4232_PID 0x3747 |
1427 | |
1428 | /* |
1429 | * Papouch products (http://www.papouch.com/) |
1430 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c |
1431 | index 558adfc..bff059a 100644 |
1432 | --- a/drivers/usb/serial/option.c |
1433 | +++ b/drivers/usb/serial/option.c |
1434 | @@ -347,6 +347,7 @@ static void option_instat_callback(struct urb *urb); |
1435 | /* Olivetti products */ |
1436 | #define OLIVETTI_VENDOR_ID 0x0b3c |
1437 | #define OLIVETTI_PRODUCT_OLICARD100 0xc000 |
1438 | +#define OLIVETTI_PRODUCT_OLICARD145 0xc003 |
1439 | |
1440 | /* Celot products */ |
1441 | #define CELOT_VENDOR_ID 0x211f |
1442 | @@ -1273,6 +1274,7 @@ static const struct usb_device_id option_ids[] = { |
1443 | { USB_DEVICE(SIEMENS_VENDOR_ID, CINTERION_PRODUCT_HC28_MDMNET) }, |
1444 | |
1445 | { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD100) }, |
1446 | + { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD145) }, |
1447 | { USB_DEVICE(CELOT_VENDOR_ID, CELOT_PRODUCT_CT680M) }, /* CT-650 CDMA 450 1xEVDO modem */ |
1448 | { USB_DEVICE(ONDA_VENDOR_ID, ONDA_MT825UP) }, /* ONDA MT825UP modem */ |
1449 | { USB_DEVICE_AND_INTERFACE_INFO(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_GT_B3730, USB_CLASS_CDC_DATA, 0x00, 0x00) }, /* Samsung GT-B3730 LTE USB modem.*/ |
1450 | @@ -1350,6 +1352,12 @@ static const struct usb_device_id option_ids[] = { |
1451 | { USB_DEVICE(TPLINK_VENDOR_ID, TPLINK_PRODUCT_MA180), |
1452 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
1453 | { USB_DEVICE(CHANGHONG_VENDOR_ID, CHANGHONG_PRODUCT_CH690) }, |
1454 | + { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d01, 0xff, 0x02, 0x01) }, /* D-Link DWM-156 (variant) */ |
1455 | + { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d01, 0xff, 0x00, 0x00) }, /* D-Link DWM-156 (variant) */ |
1456 | + { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d02, 0xff, 0x02, 0x01) }, |
1457 | + { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d02, 0xff, 0x00, 0x00) }, |
1458 | + { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d03, 0xff, 0x02, 0x01) }, |
1459 | + { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d03, 0xff, 0x00, 0x00) }, |
1460 | { } /* Terminating entry */ |
1461 | }; |
1462 | MODULE_DEVICE_TABLE(usb, option_ids); |
1463 | diff --git a/drivers/usb/storage/cypress_atacb.c b/drivers/usb/storage/cypress_atacb.c |
1464 | index 070b5c0..d944088 100644 |
1465 | --- a/drivers/usb/storage/cypress_atacb.c |
1466 | +++ b/drivers/usb/storage/cypress_atacb.c |
1467 | @@ -248,14 +248,26 @@ static int cypress_probe(struct usb_interface *intf, |
1468 | { |
1469 | struct us_data *us; |
1470 | int result; |
1471 | + struct usb_device *device; |
1472 | |
1473 | result = usb_stor_probe1(&us, intf, id, |
1474 | (id - cypress_usb_ids) + cypress_unusual_dev_list); |
1475 | if (result) |
1476 | return result; |
1477 | |
1478 | - us->protocol_name = "Transparent SCSI with Cypress ATACB"; |
1479 | - us->proto_handler = cypress_atacb_passthrough; |
1480 | + /* Among CY7C68300 chips, the A revision does not support Cypress ATACB |
1481 | + * Filter out this revision from EEPROM default descriptor values |
1482 | + */ |
1483 | + device = interface_to_usbdev(intf); |
1484 | + if (device->descriptor.iManufacturer != 0x38 || |
1485 | + device->descriptor.iProduct != 0x4e || |
1486 | + device->descriptor.iSerialNumber != 0x64) { |
1487 | + us->protocol_name = "Transparent SCSI with Cypress ATACB"; |
1488 | + us->proto_handler = cypress_atacb_passthrough; |
1489 | + } else { |
1490 | + us->protocol_name = "Transparent SCSI"; |
1491 | + us->proto_handler = usb_stor_transparent_scsi_command; |
1492 | + } |
1493 | |
1494 | result = usb_stor_probe2(us); |
1495 | return result; |
1496 | diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c |
1497 | index 501c599..6e696e6 100644 |
1498 | --- a/drivers/video/console/fbcon.c |
1499 | +++ b/drivers/video/console/fbcon.c |
1500 | @@ -1228,6 +1228,8 @@ static void fbcon_deinit(struct vc_data *vc) |
1501 | finished: |
1502 | |
1503 | fbcon_free_font(p, free_font); |
1504 | + if (free_font) |
1505 | + vc->vc_font.data = NULL; |
1506 | |
1507 | if (!con_is_bound(&fb_con)) |
1508 | fbcon_exit(); |
1509 | diff --git a/fs/dcache.c b/fs/dcache.c |
1510 | index c3bbf85..de73da2 100644 |
1511 | --- a/fs/dcache.c |
1512 | +++ b/fs/dcache.c |
1513 | @@ -1232,8 +1232,10 @@ void shrink_dcache_parent(struct dentry * parent) |
1514 | LIST_HEAD(dispose); |
1515 | int found; |
1516 | |
1517 | - while ((found = select_parent(parent, &dispose)) != 0) |
1518 | + while ((found = select_parent(parent, &dispose)) != 0) { |
1519 | shrink_dentry_list(&dispose); |
1520 | + cond_resched(); |
1521 | + } |
1522 | } |
1523 | EXPORT_SYMBOL(shrink_dcache_parent); |
1524 | |
1525 | diff --git a/fs/exec.c b/fs/exec.c |
1526 | index 20df02c..ac014f1 100644 |
1527 | --- a/fs/exec.c |
1528 | +++ b/fs/exec.c |
1529 | @@ -613,7 +613,7 @@ static int shift_arg_pages(struct vm_area_struct *vma, unsigned long shift) |
1530 | * when the old and new regions overlap clear from new_end. |
1531 | */ |
1532 | free_pgd_range(&tlb, new_end, old_end, new_end, |
1533 | - vma->vm_next ? vma->vm_next->vm_start : 0); |
1534 | + vma->vm_next ? vma->vm_next->vm_start : USER_PGTABLES_CEILING); |
1535 | } else { |
1536 | /* |
1537 | * otherwise, clean from old_start; this is done to not touch |
1538 | @@ -622,7 +622,7 @@ static int shift_arg_pages(struct vm_area_struct *vma, unsigned long shift) |
1539 | * for the others its just a little faster. |
1540 | */ |
1541 | free_pgd_range(&tlb, old_start, old_end, new_end, |
1542 | - vma->vm_next ? vma->vm_next->vm_start : 0); |
1543 | + vma->vm_next ? vma->vm_next->vm_start : USER_PGTABLES_CEILING); |
1544 | } |
1545 | tlb_finish_mmu(&tlb, new_end, old_end); |
1546 | |
1547 | @@ -898,11 +898,13 @@ static int de_thread(struct task_struct *tsk) |
1548 | |
1549 | sig->notify_count = -1; /* for exit_notify() */ |
1550 | for (;;) { |
1551 | + threadgroup_change_begin(tsk); |
1552 | write_lock_irq(&tasklist_lock); |
1553 | if (likely(leader->exit_state)) |
1554 | break; |
1555 | __set_current_state(TASK_KILLABLE); |
1556 | write_unlock_irq(&tasklist_lock); |
1557 | + threadgroup_change_end(tsk); |
1558 | schedule(); |
1559 | if (unlikely(__fatal_signal_pending(tsk))) |
1560 | goto killed; |
1561 | @@ -960,6 +962,7 @@ static int de_thread(struct task_struct *tsk) |
1562 | if (unlikely(leader->ptrace)) |
1563 | __wake_up_parent(leader, leader->parent); |
1564 | write_unlock_irq(&tasklist_lock); |
1565 | + threadgroup_change_end(tsk); |
1566 | |
1567 | release_task(leader); |
1568 | } |
1569 | diff --git a/fs/ext4/Kconfig b/fs/ext4/Kconfig |
1570 | index 9873587..efea5d5 100644 |
1571 | --- a/fs/ext4/Kconfig |
1572 | +++ b/fs/ext4/Kconfig |
1573 | @@ -71,4 +71,5 @@ config EXT4_DEBUG |
1574 | Enables run-time debugging support for the ext4 filesystem. |
1575 | |
1576 | If you select Y here, then you will be able to turn on debugging |
1577 | - with a command such as "echo 1 > /sys/kernel/debug/ext4/mballoc-debug" |
1578 | + with a command such as: |
1579 | + echo 1 > /sys/module/ext4/parameters/mballoc_debug |
1580 | diff --git a/fs/ext4/ext4_jbd2.h b/fs/ext4/ext4_jbd2.h |
1581 | index 7177f9b..dbd9ae1 100644 |
1582 | --- a/fs/ext4/ext4_jbd2.h |
1583 | +++ b/fs/ext4/ext4_jbd2.h |
1584 | @@ -170,16 +170,20 @@ static inline void ext4_journal_callback_add(handle_t *handle, |
1585 | * ext4_journal_callback_del: delete a registered callback |
1586 | * @handle: active journal transaction handle on which callback was registered |
1587 | * @jce: registered journal callback entry to unregister |
1588 | + * Return true if object was sucessfully removed |
1589 | */ |
1590 | -static inline void ext4_journal_callback_del(handle_t *handle, |
1591 | +static inline bool ext4_journal_callback_try_del(handle_t *handle, |
1592 | struct ext4_journal_cb_entry *jce) |
1593 | { |
1594 | + bool deleted; |
1595 | struct ext4_sb_info *sbi = |
1596 | EXT4_SB(handle->h_transaction->t_journal->j_private); |
1597 | |
1598 | spin_lock(&sbi->s_md_lock); |
1599 | + deleted = !list_empty(&jce->jce_list); |
1600 | list_del_init(&jce->jce_list); |
1601 | spin_unlock(&sbi->s_md_lock); |
1602 | + return deleted; |
1603 | } |
1604 | |
1605 | int |
1606 | diff --git a/fs/ext4/fsync.c b/fs/ext4/fsync.c |
1607 | index 3278e64..e0ba8a4 100644 |
1608 | --- a/fs/ext4/fsync.c |
1609 | +++ b/fs/ext4/fsync.c |
1610 | @@ -166,8 +166,7 @@ int ext4_sync_file(struct file *file, loff_t start, loff_t end, int datasync) |
1611 | if (journal->j_flags & JBD2_BARRIER && |
1612 | !jbd2_trans_will_send_data_barrier(journal, commit_tid)) |
1613 | needs_barrier = true; |
1614 | - jbd2_log_start_commit(journal, commit_tid); |
1615 | - ret = jbd2_log_wait_commit(journal, commit_tid); |
1616 | + ret = jbd2_complete_transaction(journal, commit_tid); |
1617 | if (needs_barrier) { |
1618 | err = blkdev_issue_flush(inode->i_sb->s_bdev, GFP_KERNEL, NULL); |
1619 | if (!ret) |
1620 | diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c |
1621 | index 22c5c67..c0fbd96 100644 |
1622 | --- a/fs/ext4/inode.c |
1623 | +++ b/fs/ext4/inode.c |
1624 | @@ -55,21 +55,21 @@ static __u32 ext4_inode_csum(struct inode *inode, struct ext4_inode *raw, |
1625 | __u16 csum_hi = 0; |
1626 | __u32 csum; |
1627 | |
1628 | - csum_lo = raw->i_checksum_lo; |
1629 | + csum_lo = le16_to_cpu(raw->i_checksum_lo); |
1630 | raw->i_checksum_lo = 0; |
1631 | if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE && |
1632 | EXT4_FITS_IN_INODE(raw, ei, i_checksum_hi)) { |
1633 | - csum_hi = raw->i_checksum_hi; |
1634 | + csum_hi = le16_to_cpu(raw->i_checksum_hi); |
1635 | raw->i_checksum_hi = 0; |
1636 | } |
1637 | |
1638 | csum = ext4_chksum(sbi, ei->i_csum_seed, (__u8 *)raw, |
1639 | EXT4_INODE_SIZE(inode->i_sb)); |
1640 | |
1641 | - raw->i_checksum_lo = csum_lo; |
1642 | + raw->i_checksum_lo = cpu_to_le16(csum_lo); |
1643 | if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE && |
1644 | EXT4_FITS_IN_INODE(raw, ei, i_checksum_hi)) |
1645 | - raw->i_checksum_hi = csum_hi; |
1646 | + raw->i_checksum_hi = cpu_to_le16(csum_hi); |
1647 | |
1648 | return csum; |
1649 | } |
1650 | @@ -216,8 +216,7 @@ void ext4_evict_inode(struct inode *inode) |
1651 | journal_t *journal = EXT4_SB(inode->i_sb)->s_journal; |
1652 | tid_t commit_tid = EXT4_I(inode)->i_datasync_tid; |
1653 | |
1654 | - jbd2_log_start_commit(journal, commit_tid); |
1655 | - jbd2_log_wait_commit(journal, commit_tid); |
1656 | + jbd2_complete_transaction(journal, commit_tid); |
1657 | filemap_write_and_wait(&inode->i_data); |
1658 | } |
1659 | truncate_inode_pages(&inode->i_data, 0); |
1660 | diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c |
1661 | index 82f8c2d..b443e62 100644 |
1662 | --- a/fs/ext4/mballoc.c |
1663 | +++ b/fs/ext4/mballoc.c |
1664 | @@ -4449,11 +4449,11 @@ ext4_mb_free_metadata(handle_t *handle, struct ext4_buddy *e4b, |
1665 | node = rb_prev(new_node); |
1666 | if (node) { |
1667 | entry = rb_entry(node, struct ext4_free_data, efd_node); |
1668 | - if (can_merge(entry, new_entry)) { |
1669 | + if (can_merge(entry, new_entry) && |
1670 | + ext4_journal_callback_try_del(handle, &entry->efd_jce)) { |
1671 | new_entry->efd_start_cluster = entry->efd_start_cluster; |
1672 | new_entry->efd_count += entry->efd_count; |
1673 | rb_erase(node, &(db->bb_free_root)); |
1674 | - ext4_journal_callback_del(handle, &entry->efd_jce); |
1675 | kmem_cache_free(ext4_free_data_cachep, entry); |
1676 | } |
1677 | } |
1678 | @@ -4461,10 +4461,10 @@ ext4_mb_free_metadata(handle_t *handle, struct ext4_buddy *e4b, |
1679 | node = rb_next(new_node); |
1680 | if (node) { |
1681 | entry = rb_entry(node, struct ext4_free_data, efd_node); |
1682 | - if (can_merge(new_entry, entry)) { |
1683 | + if (can_merge(new_entry, entry) && |
1684 | + ext4_journal_callback_try_del(handle, &entry->efd_jce)) { |
1685 | new_entry->efd_count += entry->efd_count; |
1686 | rb_erase(node, &(db->bb_free_root)); |
1687 | - ext4_journal_callback_del(handle, &entry->efd_jce); |
1688 | kmem_cache_free(ext4_free_data_cachep, entry); |
1689 | } |
1690 | } |
1691 | diff --git a/fs/ext4/mmp.c b/fs/ext4/mmp.c |
1692 | index 44734f1..fe201c6 100644 |
1693 | --- a/fs/ext4/mmp.c |
1694 | +++ b/fs/ext4/mmp.c |
1695 | @@ -7,7 +7,7 @@ |
1696 | #include "ext4.h" |
1697 | |
1698 | /* Checksumming functions */ |
1699 | -static __u32 ext4_mmp_csum(struct super_block *sb, struct mmp_struct *mmp) |
1700 | +static __le32 ext4_mmp_csum(struct super_block *sb, struct mmp_struct *mmp) |
1701 | { |
1702 | struct ext4_sb_info *sbi = EXT4_SB(sb); |
1703 | int offset = offsetof(struct mmp_struct, mmp_checksum); |
1704 | diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c |
1705 | index 9eace36..a2fe9f5 100644 |
1706 | --- a/fs/ext4/resize.c |
1707 | +++ b/fs/ext4/resize.c |
1708 | @@ -1341,6 +1341,8 @@ static void ext4_update_super(struct super_block *sb, |
1709 | |
1710 | /* Update the global fs size fields */ |
1711 | sbi->s_groups_count += flex_gd->count; |
1712 | + sbi->s_blockfile_groups = min_t(ext4_group_t, sbi->s_groups_count, |
1713 | + (EXT4_MAX_BLOCK_FILE_PHYS / EXT4_BLOCKS_PER_GROUP(sb))); |
1714 | |
1715 | /* Update the reserved block counts only once the new group is |
1716 | * active. */ |
1717 | diff --git a/fs/ext4/super.c b/fs/ext4/super.c |
1718 | index 24c767d..5575a45 100644 |
1719 | --- a/fs/ext4/super.c |
1720 | +++ b/fs/ext4/super.c |
1721 | @@ -452,10 +452,13 @@ static void ext4_journal_commit_callback(journal_t *journal, transaction_t *txn) |
1722 | struct super_block *sb = journal->j_private; |
1723 | struct ext4_sb_info *sbi = EXT4_SB(sb); |
1724 | int error = is_journal_aborted(journal); |
1725 | - struct ext4_journal_cb_entry *jce, *tmp; |
1726 | + struct ext4_journal_cb_entry *jce; |
1727 | |
1728 | + BUG_ON(txn->t_state == T_FINISHED); |
1729 | spin_lock(&sbi->s_md_lock); |
1730 | - list_for_each_entry_safe(jce, tmp, &txn->t_private_list, jce_list) { |
1731 | + while (!list_empty(&txn->t_private_list)) { |
1732 | + jce = list_entry(txn->t_private_list.next, |
1733 | + struct ext4_journal_cb_entry, jce_list); |
1734 | list_del_init(&jce->jce_list); |
1735 | spin_unlock(&sbi->s_md_lock); |
1736 | jce->jce_func(sb, jce, error); |
1737 | diff --git a/fs/fscache/stats.c b/fs/fscache/stats.c |
1738 | index 8179e8b..40d13c7 100644 |
1739 | --- a/fs/fscache/stats.c |
1740 | +++ b/fs/fscache/stats.c |
1741 | @@ -287,5 +287,5 @@ const struct file_operations fscache_stats_fops = { |
1742 | .open = fscache_stats_open, |
1743 | .read = seq_read, |
1744 | .llseek = seq_lseek, |
1745 | - .release = seq_release, |
1746 | + .release = single_release, |
1747 | }; |
1748 | diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c |
1749 | index 3091d42..069bf58 100644 |
1750 | --- a/fs/jbd2/commit.c |
1751 | +++ b/fs/jbd2/commit.c |
1752 | @@ -382,7 +382,7 @@ void jbd2_journal_commit_transaction(journal_t *journal) |
1753 | int space_left = 0; |
1754 | int first_tag = 0; |
1755 | int tag_flag; |
1756 | - int i, to_free = 0; |
1757 | + int i; |
1758 | int tag_bytes = journal_tag_bytes(journal); |
1759 | struct buffer_head *cbh = NULL; /* For transactional checksums */ |
1760 | __u32 crc32_sum = ~0; |
1761 | @@ -1126,7 +1126,7 @@ restart_loop: |
1762 | journal->j_stats.run.rs_blocks_logged += stats.run.rs_blocks_logged; |
1763 | spin_unlock(&journal->j_history_lock); |
1764 | |
1765 | - commit_transaction->t_state = T_FINISHED; |
1766 | + commit_transaction->t_state = T_COMMIT_CALLBACK; |
1767 | J_ASSERT(commit_transaction == journal->j_committing_transaction); |
1768 | journal->j_commit_sequence = commit_transaction->t_tid; |
1769 | journal->j_committing_transaction = NULL; |
1770 | @@ -1141,38 +1141,44 @@ restart_loop: |
1771 | journal->j_average_commit_time*3) / 4; |
1772 | else |
1773 | journal->j_average_commit_time = commit_time; |
1774 | + |
1775 | write_unlock(&journal->j_state_lock); |
1776 | |
1777 | - if (commit_transaction->t_checkpoint_list == NULL && |
1778 | - commit_transaction->t_checkpoint_io_list == NULL) { |
1779 | - __jbd2_journal_drop_transaction(journal, commit_transaction); |
1780 | - to_free = 1; |
1781 | + if (journal->j_checkpoint_transactions == NULL) { |
1782 | + journal->j_checkpoint_transactions = commit_transaction; |
1783 | + commit_transaction->t_cpnext = commit_transaction; |
1784 | + commit_transaction->t_cpprev = commit_transaction; |
1785 | } else { |
1786 | - if (journal->j_checkpoint_transactions == NULL) { |
1787 | - journal->j_checkpoint_transactions = commit_transaction; |
1788 | - commit_transaction->t_cpnext = commit_transaction; |
1789 | - commit_transaction->t_cpprev = commit_transaction; |
1790 | - } else { |
1791 | - commit_transaction->t_cpnext = |
1792 | - journal->j_checkpoint_transactions; |
1793 | - commit_transaction->t_cpprev = |
1794 | - commit_transaction->t_cpnext->t_cpprev; |
1795 | - commit_transaction->t_cpnext->t_cpprev = |
1796 | - commit_transaction; |
1797 | - commit_transaction->t_cpprev->t_cpnext = |
1798 | + commit_transaction->t_cpnext = |
1799 | + journal->j_checkpoint_transactions; |
1800 | + commit_transaction->t_cpprev = |
1801 | + commit_transaction->t_cpnext->t_cpprev; |
1802 | + commit_transaction->t_cpnext->t_cpprev = |
1803 | + commit_transaction; |
1804 | + commit_transaction->t_cpprev->t_cpnext = |
1805 | commit_transaction; |
1806 | - } |
1807 | } |
1808 | spin_unlock(&journal->j_list_lock); |
1809 | - |
1810 | + /* Drop all spin_locks because commit_callback may be block. |
1811 | + * __journal_remove_checkpoint() can not destroy transaction |
1812 | + * under us because it is not marked as T_FINISHED yet */ |
1813 | if (journal->j_commit_callback) |
1814 | journal->j_commit_callback(journal, commit_transaction); |
1815 | |
1816 | trace_jbd2_end_commit(journal, commit_transaction); |
1817 | jbd_debug(1, "JBD2: commit %d complete, head %d\n", |
1818 | journal->j_commit_sequence, journal->j_tail_sequence); |
1819 | - if (to_free) |
1820 | - jbd2_journal_free_transaction(commit_transaction); |
1821 | |
1822 | + write_lock(&journal->j_state_lock); |
1823 | + spin_lock(&journal->j_list_lock); |
1824 | + commit_transaction->t_state = T_FINISHED; |
1825 | + /* Recheck checkpoint lists after j_list_lock was dropped */ |
1826 | + if (commit_transaction->t_checkpoint_list == NULL && |
1827 | + commit_transaction->t_checkpoint_io_list == NULL) { |
1828 | + __jbd2_journal_drop_transaction(journal, commit_transaction); |
1829 | + jbd2_journal_free_transaction(commit_transaction); |
1830 | + } |
1831 | + spin_unlock(&journal->j_list_lock); |
1832 | + write_unlock(&journal->j_state_lock); |
1833 | wake_up(&journal->j_wait_done_commit); |
1834 | } |
1835 | diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c |
1836 | index dbf41f9..42f8cf6c 100644 |
1837 | --- a/fs/jbd2/journal.c |
1838 | +++ b/fs/jbd2/journal.c |
1839 | @@ -698,6 +698,37 @@ int jbd2_log_wait_commit(journal_t *journal, tid_t tid) |
1840 | } |
1841 | |
1842 | /* |
1843 | + * When this function returns the transaction corresponding to tid |
1844 | + * will be completed. If the transaction has currently running, start |
1845 | + * committing that transaction before waiting for it to complete. If |
1846 | + * the transaction id is stale, it is by definition already completed, |
1847 | + * so just return SUCCESS. |
1848 | + */ |
1849 | +int jbd2_complete_transaction(journal_t *journal, tid_t tid) |
1850 | +{ |
1851 | + int need_to_wait = 1; |
1852 | + |
1853 | + read_lock(&journal->j_state_lock); |
1854 | + if (journal->j_running_transaction && |
1855 | + journal->j_running_transaction->t_tid == tid) { |
1856 | + if (journal->j_commit_request != tid) { |
1857 | + /* transaction not yet started, so request it */ |
1858 | + read_unlock(&journal->j_state_lock); |
1859 | + jbd2_log_start_commit(journal, tid); |
1860 | + goto wait_commit; |
1861 | + } |
1862 | + } else if (!(journal->j_committing_transaction && |
1863 | + journal->j_committing_transaction->t_tid == tid)) |
1864 | + need_to_wait = 0; |
1865 | + read_unlock(&journal->j_state_lock); |
1866 | + if (!need_to_wait) |
1867 | + return 0; |
1868 | +wait_commit: |
1869 | + return jbd2_log_wait_commit(journal, tid); |
1870 | +} |
1871 | +EXPORT_SYMBOL(jbd2_complete_transaction); |
1872 | + |
1873 | +/* |
1874 | * Log buffer allocation routines: |
1875 | */ |
1876 | |
1877 | diff --git a/fs/lockd/clntlock.c b/fs/lockd/clntlock.c |
1878 | index ca0a080..193f04c 100644 |
1879 | --- a/fs/lockd/clntlock.c |
1880 | +++ b/fs/lockd/clntlock.c |
1881 | @@ -144,6 +144,9 @@ int nlmclnt_block(struct nlm_wait *block, struct nlm_rqst *req, long timeout) |
1882 | timeout); |
1883 | if (ret < 0) |
1884 | return -ERESTARTSYS; |
1885 | + /* Reset the lock status after a server reboot so we resend */ |
1886 | + if (block->b_status == nlm_lck_denied_grace_period) |
1887 | + block->b_status = nlm_lck_blocked; |
1888 | req->a_res.status = block->b_status; |
1889 | return 0; |
1890 | } |
1891 | diff --git a/fs/lockd/clntproc.c b/fs/lockd/clntproc.c |
1892 | index 52e5120..54f9e6c 100644 |
1893 | --- a/fs/lockd/clntproc.c |
1894 | +++ b/fs/lockd/clntproc.c |
1895 | @@ -550,9 +550,6 @@ again: |
1896 | status = nlmclnt_block(block, req, NLMCLNT_POLL_TIMEOUT); |
1897 | if (status < 0) |
1898 | break; |
1899 | - /* Resend the blocking lock request after a server reboot */ |
1900 | - if (resp->status == nlm_lck_denied_grace_period) |
1901 | - continue; |
1902 | if (resp->status != nlm_lck_blocked) |
1903 | break; |
1904 | } |
1905 | diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c |
1906 | index 3d905e3..51d53a4 100644 |
1907 | --- a/fs/nfs/nfs4proc.c |
1908 | +++ b/fs/nfs/nfs4proc.c |
1909 | @@ -1374,6 +1374,12 @@ int nfs4_open_delegation_recall(struct nfs_open_context *ctx, struct nfs4_state |
1910 | case -ENOMEM: |
1911 | err = 0; |
1912 | goto out; |
1913 | + case -NFS4ERR_DELAY: |
1914 | + case -NFS4ERR_GRACE: |
1915 | + set_bit(NFS_DELEGATED_STATE, &state->flags); |
1916 | + ssleep(1); |
1917 | + err = -EAGAIN; |
1918 | + goto out; |
1919 | } |
1920 | err = nfs4_handle_exception(server, err, &exception); |
1921 | } while (exception.retry); |
1922 | diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c |
1923 | index 9d1c5db..ec668e1 100644 |
1924 | --- a/fs/nfsd/nfs4proc.c |
1925 | +++ b/fs/nfsd/nfs4proc.c |
1926 | @@ -931,14 +931,14 @@ nfsd4_write(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, |
1927 | nfs4_lock_state(); |
1928 | status = nfs4_preprocess_stateid_op(SVC_NET(rqstp), |
1929 | cstate, stateid, WR_STATE, &filp); |
1930 | - if (filp) |
1931 | - get_file(filp); |
1932 | - nfs4_unlock_state(); |
1933 | - |
1934 | if (status) { |
1935 | + nfs4_unlock_state(); |
1936 | dprintk("NFSD: nfsd4_write: couldn't process stateid!\n"); |
1937 | return status; |
1938 | } |
1939 | + if (filp) |
1940 | + get_file(filp); |
1941 | + nfs4_unlock_state(); |
1942 | |
1943 | cnt = write->wr_buflen; |
1944 | write->wr_how_written = write->wr_stable_how; |
1945 | diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c |
1946 | index a8309c6..53a7c64 100644 |
1947 | --- a/fs/nfsd/nfs4state.c |
1948 | +++ b/fs/nfsd/nfs4state.c |
1949 | @@ -210,13 +210,7 @@ static void __nfs4_file_put_access(struct nfs4_file *fp, int oflag) |
1950 | { |
1951 | if (atomic_dec_and_test(&fp->fi_access[oflag])) { |
1952 | nfs4_file_put_fd(fp, oflag); |
1953 | - /* |
1954 | - * It's also safe to get rid of the RDWR open *if* |
1955 | - * we no longer have need of the other kind of access |
1956 | - * or if we already have the other kind of open: |
1957 | - */ |
1958 | - if (fp->fi_fds[1-oflag] |
1959 | - || atomic_read(&fp->fi_access[1 - oflag]) == 0) |
1960 | + if (atomic_read(&fp->fi_access[1 - oflag]) == 0) |
1961 | nfs4_file_put_fd(fp, O_RDWR); |
1962 | } |
1963 | } |
1964 | diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c |
1965 | index d1dd710..cd5e6c1 100644 |
1966 | --- a/fs/nfsd/nfs4xdr.c |
1967 | +++ b/fs/nfsd/nfs4xdr.c |
1968 | @@ -344,10 +344,7 @@ nfsd4_decode_fattr(struct nfsd4_compoundargs *argp, u32 *bmval, |
1969 | all 32 bits of 'nseconds'. */ |
1970 | READ_BUF(12); |
1971 | len += 12; |
1972 | - READ32(dummy32); |
1973 | - if (dummy32) |
1974 | - return nfserr_inval; |
1975 | - READ32(iattr->ia_atime.tv_sec); |
1976 | + READ64(iattr->ia_atime.tv_sec); |
1977 | READ32(iattr->ia_atime.tv_nsec); |
1978 | if (iattr->ia_atime.tv_nsec >= (u32)1000000000) |
1979 | return nfserr_inval; |
1980 | @@ -370,10 +367,7 @@ nfsd4_decode_fattr(struct nfsd4_compoundargs *argp, u32 *bmval, |
1981 | all 32 bits of 'nseconds'. */ |
1982 | READ_BUF(12); |
1983 | len += 12; |
1984 | - READ32(dummy32); |
1985 | - if (dummy32) |
1986 | - return nfserr_inval; |
1987 | - READ32(iattr->ia_mtime.tv_sec); |
1988 | + READ64(iattr->ia_mtime.tv_sec); |
1989 | READ32(iattr->ia_mtime.tv_nsec); |
1990 | if (iattr->ia_mtime.tv_nsec >= (u32)1000000000) |
1991 | return nfserr_inval; |
1992 | @@ -2386,8 +2380,7 @@ out_acl: |
1993 | if (bmval1 & FATTR4_WORD1_TIME_ACCESS) { |
1994 | if ((buflen -= 12) < 0) |
1995 | goto out_resource; |
1996 | - WRITE32(0); |
1997 | - WRITE32(stat.atime.tv_sec); |
1998 | + WRITE64((s64)stat.atime.tv_sec); |
1999 | WRITE32(stat.atime.tv_nsec); |
2000 | } |
2001 | if (bmval1 & FATTR4_WORD1_TIME_DELTA) { |
2002 | @@ -2400,15 +2393,13 @@ out_acl: |
2003 | if (bmval1 & FATTR4_WORD1_TIME_METADATA) { |
2004 | if ((buflen -= 12) < 0) |
2005 | goto out_resource; |
2006 | - WRITE32(0); |
2007 | - WRITE32(stat.ctime.tv_sec); |
2008 | + WRITE64((s64)stat.ctime.tv_sec); |
2009 | WRITE32(stat.ctime.tv_nsec); |
2010 | } |
2011 | if (bmval1 & FATTR4_WORD1_TIME_MODIFY) { |
2012 | if ((buflen -= 12) < 0) |
2013 | goto out_resource; |
2014 | - WRITE32(0); |
2015 | - WRITE32(stat.mtime.tv_sec); |
2016 | + WRITE64((s64)stat.mtime.tv_sec); |
2017 | WRITE32(stat.mtime.tv_nsec); |
2018 | } |
2019 | if (bmval1 & FATTR4_WORD1_MOUNTED_ON_FILEID) { |
2020 | diff --git a/fs/notify/inotify/inotify_user.c b/fs/notify/inotify/inotify_user.c |
2021 | index 07f7a92..595343e 100644 |
2022 | --- a/fs/notify/inotify/inotify_user.c |
2023 | +++ b/fs/notify/inotify/inotify_user.c |
2024 | @@ -574,7 +574,6 @@ static int inotify_update_existing_watch(struct fsnotify_group *group, |
2025 | int add = (arg & IN_MASK_ADD); |
2026 | int ret; |
2027 | |
2028 | - /* don't allow invalid bits: we don't want flags set */ |
2029 | mask = inotify_arg_to_mask(arg); |
2030 | |
2031 | fsn_mark = fsnotify_find_inode_mark(group, inode); |
2032 | @@ -625,7 +624,6 @@ static int inotify_new_watch(struct fsnotify_group *group, |
2033 | struct idr *idr = &group->inotify_data.idr; |
2034 | spinlock_t *idr_lock = &group->inotify_data.idr_lock; |
2035 | |
2036 | - /* don't allow invalid bits: we don't want flags set */ |
2037 | mask = inotify_arg_to_mask(arg); |
2038 | |
2039 | tmp_i_mark = kmem_cache_alloc(inotify_inode_mark_cachep, GFP_KERNEL); |
2040 | @@ -753,6 +751,10 @@ SYSCALL_DEFINE3(inotify_add_watch, int, fd, const char __user *, pathname, |
2041 | int ret; |
2042 | unsigned flags = 0; |
2043 | |
2044 | + /* don't allow invalid bits: we don't want flags set */ |
2045 | + if (unlikely(!(mask & ALL_INOTIFY_BITS))) |
2046 | + return -EINVAL; |
2047 | + |
2048 | f = fdget(fd); |
2049 | if (unlikely(!f.file)) |
2050 | return -EBADF; |
2051 | diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c |
2052 | index 1f8c823..d924812 100644 |
2053 | --- a/fs/sysfs/dir.c |
2054 | +++ b/fs/sysfs/dir.c |
2055 | @@ -1012,6 +1012,7 @@ static int sysfs_readdir(struct file * filp, void * dirent, filldir_t filldir) |
2056 | enum kobj_ns_type type; |
2057 | const void *ns; |
2058 | ino_t ino; |
2059 | + loff_t off; |
2060 | |
2061 | type = sysfs_ns_type(parent_sd); |
2062 | ns = sysfs_info(dentry->d_sb)->ns[type]; |
2063 | @@ -1034,6 +1035,7 @@ static int sysfs_readdir(struct file * filp, void * dirent, filldir_t filldir) |
2064 | return 0; |
2065 | } |
2066 | mutex_lock(&sysfs_mutex); |
2067 | + off = filp->f_pos; |
2068 | for (pos = sysfs_dir_pos(ns, parent_sd, filp->f_pos, pos); |
2069 | pos; |
2070 | pos = sysfs_dir_next_pos(ns, parent_sd, filp->f_pos, pos)) { |
2071 | @@ -1045,19 +1047,24 @@ static int sysfs_readdir(struct file * filp, void * dirent, filldir_t filldir) |
2072 | len = strlen(name); |
2073 | ino = pos->s_ino; |
2074 | type = dt_type(pos); |
2075 | - filp->f_pos = pos->s_hash; |
2076 | + off = filp->f_pos = pos->s_hash; |
2077 | filp->private_data = sysfs_get(pos); |
2078 | |
2079 | mutex_unlock(&sysfs_mutex); |
2080 | - ret = filldir(dirent, name, len, filp->f_pos, ino, type); |
2081 | + ret = filldir(dirent, name, len, off, ino, type); |
2082 | mutex_lock(&sysfs_mutex); |
2083 | if (ret < 0) |
2084 | break; |
2085 | } |
2086 | mutex_unlock(&sysfs_mutex); |
2087 | - if ((filp->f_pos > 1) && !pos) { /* EOF */ |
2088 | - filp->f_pos = INT_MAX; |
2089 | + |
2090 | + /* don't reference last entry if its refcount is dropped */ |
2091 | + if (!pos) { |
2092 | filp->private_data = NULL; |
2093 | + |
2094 | + /* EOF and not changed as 0 or 1 in read/write path */ |
2095 | + if (off == filp->f_pos && off > 1) |
2096 | + filp->f_pos = INT_MAX; |
2097 | } |
2098 | return 0; |
2099 | } |
2100 | diff --git a/include/asm-generic/pgtable.h b/include/asm-generic/pgtable.h |
2101 | index 5cf680a..f50a87d 100644 |
2102 | --- a/include/asm-generic/pgtable.h |
2103 | +++ b/include/asm-generic/pgtable.h |
2104 | @@ -7,6 +7,16 @@ |
2105 | #include <linux/mm_types.h> |
2106 | #include <linux/bug.h> |
2107 | |
2108 | +/* |
2109 | + * On almost all architectures and configurations, 0 can be used as the |
2110 | + * upper ceiling to free_pgtables(): on many architectures it has the same |
2111 | + * effect as using TASK_SIZE. However, there is one configuration which |
2112 | + * must impose a more careful limit, to avoid freeing kernel pgtables. |
2113 | + */ |
2114 | +#ifndef USER_PGTABLES_CEILING |
2115 | +#define USER_PGTABLES_CEILING 0UL |
2116 | +#endif |
2117 | + |
2118 | #ifndef __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS |
2119 | extern int ptep_set_access_flags(struct vm_area_struct *vma, |
2120 | unsigned long address, pte_t *ptep, |
2121 | diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h |
2122 | index 7d73905..2322df7 100644 |
2123 | --- a/include/linux/cgroup.h |
2124 | +++ b/include/linux/cgroup.h |
2125 | @@ -303,9 +303,6 @@ struct cftype { |
2126 | /* CFTYPE_* flags */ |
2127 | unsigned int flags; |
2128 | |
2129 | - /* file xattrs */ |
2130 | - struct simple_xattrs xattrs; |
2131 | - |
2132 | int (*open)(struct inode *inode, struct file *file); |
2133 | ssize_t (*read)(struct cgroup *cgrp, struct cftype *cft, |
2134 | struct file *file, |
2135 | diff --git a/include/linux/ipc_namespace.h b/include/linux/ipc_namespace.h |
2136 | index ae221a7..c4d870b 100644 |
2137 | --- a/include/linux/ipc_namespace.h |
2138 | +++ b/include/linux/ipc_namespace.h |
2139 | @@ -43,8 +43,8 @@ struct ipc_namespace { |
2140 | |
2141 | size_t shm_ctlmax; |
2142 | size_t shm_ctlall; |
2143 | + unsigned long shm_tot; |
2144 | int shm_ctlmni; |
2145 | - int shm_tot; |
2146 | /* |
2147 | * Defines whether IPC_RMID is forced for _all_ shm segments regardless |
2148 | * of shmctl() |
2149 | diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h |
2150 | index e30b663..383bef0 100644 |
2151 | --- a/include/linux/jbd2.h |
2152 | +++ b/include/linux/jbd2.h |
2153 | @@ -498,6 +498,7 @@ struct transaction_s |
2154 | T_COMMIT, |
2155 | T_COMMIT_DFLUSH, |
2156 | T_COMMIT_JFLUSH, |
2157 | + T_COMMIT_CALLBACK, |
2158 | T_FINISHED |
2159 | } t_state; |
2160 | |
2161 | @@ -1210,6 +1211,7 @@ int __jbd2_log_start_commit(journal_t *journal, tid_t tid); |
2162 | int jbd2_journal_start_commit(journal_t *journal, tid_t *tid); |
2163 | int jbd2_journal_force_commit_nested(journal_t *journal); |
2164 | int jbd2_log_wait_commit(journal_t *journal, tid_t tid); |
2165 | +int jbd2_complete_transaction(journal_t *journal, tid_t tid); |
2166 | int jbd2_log_do_checkpoint(journal_t *journal); |
2167 | int jbd2_trans_will_send_data_barrier(journal_t *journal, tid_t tid); |
2168 | |
2169 | diff --git a/include/linux/sched.h b/include/linux/sched.h |
2170 | index 7e49270..f5ad26e 100644 |
2171 | --- a/include/linux/sched.h |
2172 | +++ b/include/linux/sched.h |
2173 | @@ -2486,27 +2486,18 @@ static inline void threadgroup_change_end(struct task_struct *tsk) |
2174 | * |
2175 | * Lock the threadgroup @tsk belongs to. No new task is allowed to enter |
2176 | * and member tasks aren't allowed to exit (as indicated by PF_EXITING) or |
2177 | - * perform exec. This is useful for cases where the threadgroup needs to |
2178 | - * stay stable across blockable operations. |
2179 | + * change ->group_leader/pid. This is useful for cases where the threadgroup |
2180 | + * needs to stay stable across blockable operations. |
2181 | * |
2182 | * fork and exit paths explicitly call threadgroup_change_{begin|end}() for |
2183 | * synchronization. While held, no new task will be added to threadgroup |
2184 | * and no existing live task will have its PF_EXITING set. |
2185 | * |
2186 | - * During exec, a task goes and puts its thread group through unusual |
2187 | - * changes. After de-threading, exclusive access is assumed to resources |
2188 | - * which are usually shared by tasks in the same group - e.g. sighand may |
2189 | - * be replaced with a new one. Also, the exec'ing task takes over group |
2190 | - * leader role including its pid. Exclude these changes while locked by |
2191 | - * grabbing cred_guard_mutex which is used to synchronize exec path. |
2192 | + * de_thread() does threadgroup_change_{begin|end}() when a non-leader |
2193 | + * sub-thread becomes a new leader. |
2194 | */ |
2195 | static inline void threadgroup_lock(struct task_struct *tsk) |
2196 | { |
2197 | - /* |
2198 | - * exec uses exit for de-threading nesting group_rwsem inside |
2199 | - * cred_guard_mutex. Grab cred_guard_mutex first. |
2200 | - */ |
2201 | - mutex_lock(&tsk->signal->cred_guard_mutex); |
2202 | down_write(&tsk->signal->group_rwsem); |
2203 | } |
2204 | |
2205 | @@ -2519,7 +2510,6 @@ static inline void threadgroup_lock(struct task_struct *tsk) |
2206 | static inline void threadgroup_unlock(struct task_struct *tsk) |
2207 | { |
2208 | up_write(&tsk->signal->group_rwsem); |
2209 | - mutex_unlock(&tsk->signal->cred_guard_mutex); |
2210 | } |
2211 | #else |
2212 | static inline void threadgroup_change_begin(struct task_struct *tsk) {} |
2213 | diff --git a/include/sound/emu10k1.h b/include/sound/emu10k1.h |
2214 | index f841ba4..dfb42ca 100644 |
2215 | --- a/include/sound/emu10k1.h |
2216 | +++ b/include/sound/emu10k1.h |
2217 | @@ -1787,6 +1787,7 @@ struct snd_emu10k1 { |
2218 | unsigned int next_free_voice; |
2219 | |
2220 | const struct firmware *firmware; |
2221 | + const struct firmware *dock_fw; |
2222 | |
2223 | #ifdef CONFIG_PM_SLEEP |
2224 | unsigned int *saved_ptr; |
2225 | diff --git a/ipc/shm.c b/ipc/shm.c |
2226 | index 4fa6d8f..9bab650 100644 |
2227 | --- a/ipc/shm.c |
2228 | +++ b/ipc/shm.c |
2229 | @@ -462,7 +462,7 @@ static int newseg(struct ipc_namespace *ns, struct ipc_params *params) |
2230 | size_t size = params->u.size; |
2231 | int error; |
2232 | struct shmid_kernel *shp; |
2233 | - int numpages = (size + PAGE_SIZE -1) >> PAGE_SHIFT; |
2234 | + size_t numpages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT; |
2235 | struct file * file; |
2236 | char name[13]; |
2237 | int id; |
2238 | diff --git a/kernel/cgroup.c b/kernel/cgroup.c |
2239 | index 1e23664..cddf1d9 100644 |
2240 | --- a/kernel/cgroup.c |
2241 | +++ b/kernel/cgroup.c |
2242 | @@ -162,6 +162,9 @@ struct cfent { |
2243 | struct list_head node; |
2244 | struct dentry *dentry; |
2245 | struct cftype *type; |
2246 | + |
2247 | + /* file xattrs */ |
2248 | + struct simple_xattrs xattrs; |
2249 | }; |
2250 | |
2251 | /* |
2252 | @@ -908,13 +911,12 @@ static void cgroup_diput(struct dentry *dentry, struct inode *inode) |
2253 | } else { |
2254 | struct cfent *cfe = __d_cfe(dentry); |
2255 | struct cgroup *cgrp = dentry->d_parent->d_fsdata; |
2256 | - struct cftype *cft = cfe->type; |
2257 | |
2258 | WARN_ONCE(!list_empty(&cfe->node) && |
2259 | cgrp != &cgrp->root->top_cgroup, |
2260 | "cfe still linked for %s\n", cfe->type->name); |
2261 | + simple_xattrs_free(&cfe->xattrs); |
2262 | kfree(cfe); |
2263 | - simple_xattrs_free(&cft->xattrs); |
2264 | } |
2265 | iput(inode); |
2266 | } |
2267 | @@ -2066,7 +2068,7 @@ static int cgroup_attach_proc(struct cgroup *cgrp, struct task_struct *leader) |
2268 | if (!group) |
2269 | return -ENOMEM; |
2270 | /* pre-allocate to guarantee space while iterating in rcu read-side. */ |
2271 | - retval = flex_array_prealloc(group, 0, group_size - 1, GFP_KERNEL); |
2272 | + retval = flex_array_prealloc(group, 0, group_size, GFP_KERNEL); |
2273 | if (retval) |
2274 | goto out_free_group_list; |
2275 | |
2276 | @@ -2553,7 +2555,7 @@ static struct simple_xattrs *__d_xattrs(struct dentry *dentry) |
2277 | if (S_ISDIR(dentry->d_inode->i_mode)) |
2278 | return &__d_cgrp(dentry)->xattrs; |
2279 | else |
2280 | - return &__d_cft(dentry)->xattrs; |
2281 | + return &__d_cfe(dentry)->xattrs; |
2282 | } |
2283 | |
2284 | static inline int xattr_enabled(struct dentry *dentry) |
2285 | @@ -2729,8 +2731,6 @@ static int cgroup_add_file(struct cgroup *cgrp, struct cgroup_subsys *subsys, |
2286 | umode_t mode; |
2287 | char name[MAX_CGROUP_TYPE_NAMELEN + MAX_CFTYPE_NAME + 2] = { 0 }; |
2288 | |
2289 | - simple_xattrs_init(&cft->xattrs); |
2290 | - |
2291 | if (subsys && !test_bit(ROOT_NOPREFIX, &cgrp->root->flags)) { |
2292 | strcpy(name, subsys->name); |
2293 | strcat(name, "."); |
2294 | @@ -2755,6 +2755,7 @@ static int cgroup_add_file(struct cgroup *cgrp, struct cgroup_subsys *subsys, |
2295 | cfe->type = (void *)cft; |
2296 | cfe->dentry = dentry; |
2297 | dentry->d_fsdata = cfe; |
2298 | + simple_xattrs_init(&cfe->xattrs); |
2299 | list_add_tail(&cfe->node, &parent->files); |
2300 | cfe = NULL; |
2301 | } |
2302 | diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c |
2303 | index e4cee8d..60f7e32 100644 |
2304 | --- a/kernel/hrtimer.c |
2305 | +++ b/kernel/hrtimer.c |
2306 | @@ -298,6 +298,10 @@ ktime_t ktime_sub_ns(const ktime_t kt, u64 nsec) |
2307 | } else { |
2308 | unsigned long rem = do_div(nsec, NSEC_PER_SEC); |
2309 | |
2310 | + /* Make sure nsec fits into long */ |
2311 | + if (unlikely(nsec > KTIME_SEC_MAX)) |
2312 | + return (ktime_t){ .tv64 = KTIME_MAX }; |
2313 | + |
2314 | tmp = ktime_set((long)nsec, rem); |
2315 | } |
2316 | |
2317 | @@ -1308,6 +1312,8 @@ retry: |
2318 | |
2319 | expires = ktime_sub(hrtimer_get_expires(timer), |
2320 | base->offset); |
2321 | + if (expires.tv64 < 0) |
2322 | + expires.tv64 = KTIME_MAX; |
2323 | if (expires.tv64 < expires_next.tv64) |
2324 | expires_next = expires; |
2325 | break; |
2326 | diff --git a/kernel/rcutree_trace.c b/kernel/rcutree_trace.c |
2327 | index 0d095dc..93f8e8f 100644 |
2328 | --- a/kernel/rcutree_trace.c |
2329 | +++ b/kernel/rcutree_trace.c |
2330 | @@ -97,7 +97,7 @@ static const struct file_operations rcubarrier_fops = { |
2331 | .open = rcubarrier_open, |
2332 | .read = seq_read, |
2333 | .llseek = no_llseek, |
2334 | - .release = seq_release, |
2335 | + .release = single_release, |
2336 | }; |
2337 | |
2338 | #ifdef CONFIG_RCU_BOOST |
2339 | @@ -208,7 +208,7 @@ static const struct file_operations rcuexp_fops = { |
2340 | .open = rcuexp_open, |
2341 | .read = seq_read, |
2342 | .llseek = no_llseek, |
2343 | - .release = seq_release, |
2344 | + .release = single_release, |
2345 | }; |
2346 | |
2347 | #ifdef CONFIG_RCU_BOOST |
2348 | @@ -308,7 +308,7 @@ static const struct file_operations rcuhier_fops = { |
2349 | .open = rcuhier_open, |
2350 | .read = seq_read, |
2351 | .llseek = no_llseek, |
2352 | - .release = seq_release, |
2353 | + .release = single_release, |
2354 | }; |
2355 | |
2356 | static void show_one_rcugp(struct seq_file *m, struct rcu_state *rsp) |
2357 | @@ -350,7 +350,7 @@ static const struct file_operations rcugp_fops = { |
2358 | .open = rcugp_open, |
2359 | .read = seq_read, |
2360 | .llseek = no_llseek, |
2361 | - .release = seq_release, |
2362 | + .release = single_release, |
2363 | }; |
2364 | |
2365 | static void print_one_rcu_pending(struct seq_file *m, struct rcu_data *rdp) |
2366 | diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c |
2367 | index a13987a..239a323 100644 |
2368 | --- a/kernel/time/tick-broadcast.c |
2369 | +++ b/kernel/time/tick-broadcast.c |
2370 | @@ -66,6 +66,8 @@ static void tick_broadcast_start_periodic(struct clock_event_device *bc) |
2371 | */ |
2372 | int tick_check_broadcast_device(struct clock_event_device *dev) |
2373 | { |
2374 | + struct clock_event_device *cur = tick_broadcast_device.evtdev; |
2375 | + |
2376 | if ((dev->features & CLOCK_EVT_FEAT_DUMMY) || |
2377 | (tick_broadcast_device.evtdev && |
2378 | tick_broadcast_device.evtdev->rating >= dev->rating) || |
2379 | @@ -73,6 +75,8 @@ int tick_check_broadcast_device(struct clock_event_device *dev) |
2380 | return 0; |
2381 | |
2382 | clockevents_exchange_device(tick_broadcast_device.evtdev, dev); |
2383 | + if (cur) |
2384 | + cur->event_handler = clockevents_handle_noop; |
2385 | tick_broadcast_device.evtdev = dev; |
2386 | if (!cpumask_empty(tick_get_broadcast_mask())) |
2387 | tick_broadcast_start_periodic(dev); |
2388 | diff --git a/kernel/time/tick-common.c b/kernel/time/tick-common.c |
2389 | index b1600a6..7076b3f 100644 |
2390 | --- a/kernel/time/tick-common.c |
2391 | +++ b/kernel/time/tick-common.c |
2392 | @@ -323,6 +323,7 @@ static void tick_shutdown(unsigned int *cpup) |
2393 | */ |
2394 | dev->mode = CLOCK_EVT_MODE_UNUSED; |
2395 | clockevents_exchange_device(dev, NULL); |
2396 | + dev->event_handler = clockevents_handle_noop; |
2397 | td->evtdev = NULL; |
2398 | } |
2399 | raw_spin_unlock_irqrestore(&tick_device_lock, flags); |
2400 | diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c |
2401 | index 35cc3a8..03dbc77 100644 |
2402 | --- a/kernel/trace/ftrace.c |
2403 | +++ b/kernel/trace/ftrace.c |
2404 | @@ -650,7 +650,7 @@ int ftrace_profile_pages_init(struct ftrace_profile_stat *stat) |
2405 | |
2406 | pages = DIV_ROUND_UP(functions, PROFILES_PER_PAGE); |
2407 | |
2408 | - for (i = 0; i < pages; i++) { |
2409 | + for (i = 1; i < pages; i++) { |
2410 | pg->next = (void *)get_zeroed_page(GFP_KERNEL); |
2411 | if (!pg->next) |
2412 | goto out_free; |
2413 | @@ -3714,7 +3714,8 @@ out: |
2414 | if (fail) |
2415 | return -EINVAL; |
2416 | |
2417 | - ftrace_graph_filter_enabled = 1; |
2418 | + ftrace_graph_filter_enabled = !!(*idx); |
2419 | + |
2420 | return 0; |
2421 | } |
2422 | |
2423 | diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c |
2424 | index fe1d581..1c82852 100644 |
2425 | --- a/kernel/trace/trace.c |
2426 | +++ b/kernel/trace/trace.c |
2427 | @@ -4885,6 +4885,8 @@ static __init int tracer_init_debugfs(void) |
2428 | trace_access_lock_init(); |
2429 | |
2430 | d_tracer = tracing_init_dentry(); |
2431 | + if (!d_tracer) |
2432 | + return 0; |
2433 | |
2434 | trace_create_file("trace_options", 0644, d_tracer, |
2435 | NULL, &tracing_iter_fops); |
2436 | diff --git a/kernel/trace/trace_stack.c b/kernel/trace/trace_stack.c |
2437 | index 83a8b5b..b20428c 100644 |
2438 | --- a/kernel/trace/trace_stack.c |
2439 | +++ b/kernel/trace/trace_stack.c |
2440 | @@ -20,13 +20,24 @@ |
2441 | |
2442 | #define STACK_TRACE_ENTRIES 500 |
2443 | |
2444 | +#ifdef CC_USING_FENTRY |
2445 | +# define fentry 1 |
2446 | +#else |
2447 | +# define fentry 0 |
2448 | +#endif |
2449 | + |
2450 | static unsigned long stack_dump_trace[STACK_TRACE_ENTRIES+1] = |
2451 | { [0 ... (STACK_TRACE_ENTRIES)] = ULONG_MAX }; |
2452 | static unsigned stack_dump_index[STACK_TRACE_ENTRIES]; |
2453 | |
2454 | +/* |
2455 | + * Reserve one entry for the passed in ip. This will allow |
2456 | + * us to remove most or all of the stack size overhead |
2457 | + * added by the stack tracer itself. |
2458 | + */ |
2459 | static struct stack_trace max_stack_trace = { |
2460 | - .max_entries = STACK_TRACE_ENTRIES, |
2461 | - .entries = stack_dump_trace, |
2462 | + .max_entries = STACK_TRACE_ENTRIES - 1, |
2463 | + .entries = &stack_dump_trace[1], |
2464 | }; |
2465 | |
2466 | static unsigned long max_stack_size; |
2467 | @@ -39,25 +50,34 @@ static DEFINE_MUTEX(stack_sysctl_mutex); |
2468 | int stack_tracer_enabled; |
2469 | static int last_stack_tracer_enabled; |
2470 | |
2471 | -static inline void check_stack(void) |
2472 | +static inline void |
2473 | +check_stack(unsigned long ip, unsigned long *stack) |
2474 | { |
2475 | unsigned long this_size, flags; |
2476 | unsigned long *p, *top, *start; |
2477 | + static int tracer_frame; |
2478 | + int frame_size = ACCESS_ONCE(tracer_frame); |
2479 | int i; |
2480 | |
2481 | - this_size = ((unsigned long)&this_size) & (THREAD_SIZE-1); |
2482 | + this_size = ((unsigned long)stack) & (THREAD_SIZE-1); |
2483 | this_size = THREAD_SIZE - this_size; |
2484 | + /* Remove the frame of the tracer */ |
2485 | + this_size -= frame_size; |
2486 | |
2487 | if (this_size <= max_stack_size) |
2488 | return; |
2489 | |
2490 | /* we do not handle interrupt stacks yet */ |
2491 | - if (!object_is_on_stack(&this_size)) |
2492 | + if (!object_is_on_stack(stack)) |
2493 | return; |
2494 | |
2495 | local_irq_save(flags); |
2496 | arch_spin_lock(&max_stack_lock); |
2497 | |
2498 | + /* In case another CPU set the tracer_frame on us */ |
2499 | + if (unlikely(!frame_size)) |
2500 | + this_size -= tracer_frame; |
2501 | + |
2502 | /* a race could have already updated it */ |
2503 | if (this_size <= max_stack_size) |
2504 | goto out; |
2505 | @@ -70,10 +90,18 @@ static inline void check_stack(void) |
2506 | save_stack_trace(&max_stack_trace); |
2507 | |
2508 | /* |
2509 | + * Add the passed in ip from the function tracer. |
2510 | + * Searching for this on the stack will skip over |
2511 | + * most of the overhead from the stack tracer itself. |
2512 | + */ |
2513 | + stack_dump_trace[0] = ip; |
2514 | + max_stack_trace.nr_entries++; |
2515 | + |
2516 | + /* |
2517 | * Now find where in the stack these are. |
2518 | */ |
2519 | i = 0; |
2520 | - start = &this_size; |
2521 | + start = stack; |
2522 | top = (unsigned long *) |
2523 | (((unsigned long)start & ~(THREAD_SIZE-1)) + THREAD_SIZE); |
2524 | |
2525 | @@ -97,6 +125,18 @@ static inline void check_stack(void) |
2526 | found = 1; |
2527 | /* Start the search from here */ |
2528 | start = p + 1; |
2529 | + /* |
2530 | + * We do not want to show the overhead |
2531 | + * of the stack tracer stack in the |
2532 | + * max stack. If we haven't figured |
2533 | + * out what that is, then figure it out |
2534 | + * now. |
2535 | + */ |
2536 | + if (unlikely(!tracer_frame) && i == 1) { |
2537 | + tracer_frame = (p - stack) * |
2538 | + sizeof(unsigned long); |
2539 | + max_stack_size -= tracer_frame; |
2540 | + } |
2541 | } |
2542 | } |
2543 | |
2544 | @@ -113,6 +153,7 @@ static void |
2545 | stack_trace_call(unsigned long ip, unsigned long parent_ip, |
2546 | struct ftrace_ops *op, struct pt_regs *pt_regs) |
2547 | { |
2548 | + unsigned long stack; |
2549 | int cpu; |
2550 | |
2551 | preempt_disable_notrace(); |
2552 | @@ -122,7 +163,26 @@ stack_trace_call(unsigned long ip, unsigned long parent_ip, |
2553 | if (per_cpu(trace_active, cpu)++ != 0) |
2554 | goto out; |
2555 | |
2556 | - check_stack(); |
2557 | + /* |
2558 | + * When fentry is used, the traced function does not get |
2559 | + * its stack frame set up, and we lose the parent. |
2560 | + * The ip is pretty useless because the function tracer |
2561 | + * was called before that function set up its stack frame. |
2562 | + * In this case, we use the parent ip. |
2563 | + * |
2564 | + * By adding the return address of either the parent ip |
2565 | + * or the current ip we can disregard most of the stack usage |
2566 | + * caused by the stack tracer itself. |
2567 | + * |
2568 | + * The function tracer always reports the address of where the |
2569 | + * mcount call was, but the stack will hold the return address. |
2570 | + */ |
2571 | + if (fentry) |
2572 | + ip = parent_ip; |
2573 | + else |
2574 | + ip += MCOUNT_INSN_SIZE; |
2575 | + |
2576 | + check_stack(ip, &stack); |
2577 | |
2578 | out: |
2579 | per_cpu(trace_active, cpu)--; |
2580 | @@ -371,6 +431,8 @@ static __init int stack_trace_init(void) |
2581 | struct dentry *d_tracer; |
2582 | |
2583 | d_tracer = tracing_init_dentry(); |
2584 | + if (!d_tracer) |
2585 | + return 0; |
2586 | |
2587 | trace_create_file("stack_max_size", 0644, d_tracer, |
2588 | &max_stack_size, &stack_max_size_fops); |
2589 | diff --git a/kernel/trace/trace_stat.c b/kernel/trace/trace_stat.c |
2590 | index 96cffb2..847f88a 100644 |
2591 | --- a/kernel/trace/trace_stat.c |
2592 | +++ b/kernel/trace/trace_stat.c |
2593 | @@ -307,6 +307,8 @@ static int tracing_stat_init(void) |
2594 | struct dentry *d_tracing; |
2595 | |
2596 | d_tracing = tracing_init_dentry(); |
2597 | + if (!d_tracing) |
2598 | + return 0; |
2599 | |
2600 | stat_dir = debugfs_create_dir("trace_stat", d_tracing); |
2601 | if (!stat_dir) |
2602 | diff --git a/lib/oid_registry.c b/lib/oid_registry.c |
2603 | index d8de11f..318f382 100644 |
2604 | --- a/lib/oid_registry.c |
2605 | +++ b/lib/oid_registry.c |
2606 | @@ -9,6 +9,7 @@ |
2607 | * 2 of the Licence, or (at your option) any later version. |
2608 | */ |
2609 | |
2610 | +#include <linux/module.h> |
2611 | #include <linux/export.h> |
2612 | #include <linux/oid_registry.h> |
2613 | #include <linux/kernel.h> |
2614 | @@ -16,6 +17,10 @@ |
2615 | #include <linux/bug.h> |
2616 | #include "oid_registry_data.c" |
2617 | |
2618 | +MODULE_DESCRIPTION("OID Registry"); |
2619 | +MODULE_AUTHOR("Red Hat, Inc."); |
2620 | +MODULE_LICENSE("GPL"); |
2621 | + |
2622 | /** |
2623 | * look_up_OID - Find an OID registration for the specified data |
2624 | * @data: Binary representation of the OID |
2625 | diff --git a/mm/mmap.c b/mm/mmap.c |
2626 | index 90db251..32f3372 100644 |
2627 | --- a/mm/mmap.c |
2628 | +++ b/mm/mmap.c |
2629 | @@ -2289,7 +2289,7 @@ static void unmap_region(struct mm_struct *mm, |
2630 | update_hiwater_rss(mm); |
2631 | unmap_vmas(&tlb, vma, start, end); |
2632 | free_pgtables(&tlb, vma, prev ? prev->vm_end : FIRST_USER_ADDRESS, |
2633 | - next ? next->vm_start : 0); |
2634 | + next ? next->vm_start : USER_PGTABLES_CEILING); |
2635 | tlb_finish_mmu(&tlb, start, end); |
2636 | } |
2637 | |
2638 | @@ -2667,7 +2667,7 @@ void exit_mmap(struct mm_struct *mm) |
2639 | /* Use -1 here to ensure all VMAs in the mm are unmapped */ |
2640 | unmap_vmas(&tlb, vma, 0, -1); |
2641 | |
2642 | - free_pgtables(&tlb, vma, FIRST_USER_ADDRESS, 0); |
2643 | + free_pgtables(&tlb, vma, FIRST_USER_ADDRESS, USER_PGTABLES_CEILING); |
2644 | tlb_finish_mmu(&tlb, 0, -1); |
2645 | |
2646 | /* |
2647 | diff --git a/mm/page_io.c b/mm/page_io.c |
2648 | index 78eee32..6182870 100644 |
2649 | --- a/mm/page_io.c |
2650 | +++ b/mm/page_io.c |
2651 | @@ -214,6 +214,7 @@ int swap_writepage(struct page *page, struct writeback_control *wbc) |
2652 | kiocb.ki_left = PAGE_SIZE; |
2653 | kiocb.ki_nbytes = PAGE_SIZE; |
2654 | |
2655 | + set_page_writeback(page); |
2656 | unlock_page(page); |
2657 | ret = mapping->a_ops->direct_IO(KERNEL_WRITE, |
2658 | &kiocb, &iov, |
2659 | @@ -222,7 +223,23 @@ int swap_writepage(struct page *page, struct writeback_control *wbc) |
2660 | if (ret == PAGE_SIZE) { |
2661 | count_vm_event(PSWPOUT); |
2662 | ret = 0; |
2663 | + } else { |
2664 | + /* |
2665 | + * In the case of swap-over-nfs, this can be a |
2666 | + * temporary failure if the system has limited |
2667 | + * memory for allocating transmit buffers. |
2668 | + * Mark the page dirty and avoid |
2669 | + * rotate_reclaimable_page but rate-limit the |
2670 | + * messages but do not flag PageError like |
2671 | + * the normal direct-to-bio case as it could |
2672 | + * be temporary. |
2673 | + */ |
2674 | + set_page_dirty(page); |
2675 | + ClearPageReclaim(page); |
2676 | + pr_err_ratelimited("Write error on dio swapfile (%Lu)\n", |
2677 | + page_file_offset(page)); |
2678 | } |
2679 | + end_page_writeback(page); |
2680 | return ret; |
2681 | } |
2682 | |
2683 | diff --git a/net/mac80211/pm.c b/net/mac80211/pm.c |
2684 | index 79a48f3..64619f4 100644 |
2685 | --- a/net/mac80211/pm.c |
2686 | +++ b/net/mac80211/pm.c |
2687 | @@ -52,8 +52,8 @@ int __ieee80211_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan) |
2688 | ieee80211_stop_queues_by_reason(hw, |
2689 | IEEE80211_QUEUE_STOP_REASON_SUSPEND); |
2690 | |
2691 | - /* flush out all packets */ |
2692 | - synchronize_net(); |
2693 | + /* flush out all packets and station cleanup call_rcu()s */ |
2694 | + rcu_barrier(); |
2695 | |
2696 | drv_flush(local, false); |
2697 | |
2698 | diff --git a/net/wireless/reg.c b/net/wireless/reg.c |
2699 | index 82c4fc7..91ef82b 100644 |
2700 | --- a/net/wireless/reg.c |
2701 | +++ b/net/wireless/reg.c |
2702 | @@ -883,7 +883,7 @@ static void handle_channel(struct wiphy *wiphy, |
2703 | return; |
2704 | |
2705 | REG_DBG_PRINT("Disabling freq %d MHz\n", chan->center_freq); |
2706 | - chan->flags = IEEE80211_CHAN_DISABLED; |
2707 | + chan->flags |= IEEE80211_CHAN_DISABLED; |
2708 | return; |
2709 | } |
2710 | |
2711 | diff --git a/scripts/kconfig/streamline_config.pl b/scripts/kconfig/streamline_config.pl |
2712 | index 3368939..68b85e1 100644 |
2713 | --- a/scripts/kconfig/streamline_config.pl |
2714 | +++ b/scripts/kconfig/streamline_config.pl |
2715 | @@ -156,7 +156,6 @@ sub read_kconfig { |
2716 | |
2717 | my $state = "NONE"; |
2718 | my $config; |
2719 | - my @kconfigs; |
2720 | |
2721 | my $cont = 0; |
2722 | my $line; |
2723 | @@ -190,7 +189,13 @@ sub read_kconfig { |
2724 | |
2725 | # collect any Kconfig sources |
2726 | if (/^source\s*"(.*)"/) { |
2727 | - $kconfigs[$#kconfigs+1] = $1; |
2728 | + my $kconfig = $1; |
2729 | + # prevent reading twice. |
2730 | + if (!defined($read_kconfigs{$kconfig})) { |
2731 | + $read_kconfigs{$kconfig} = 1; |
2732 | + read_kconfig($kconfig); |
2733 | + } |
2734 | + next; |
2735 | } |
2736 | |
2737 | # configs found |
2738 | @@ -250,14 +255,6 @@ sub read_kconfig { |
2739 | } |
2740 | } |
2741 | close($kinfile); |
2742 | - |
2743 | - # read in any configs that were found. |
2744 | - foreach my $kconfig (@kconfigs) { |
2745 | - if (!defined($read_kconfigs{$kconfig})) { |
2746 | - $read_kconfigs{$kconfig} = 1; |
2747 | - read_kconfig($kconfig); |
2748 | - } |
2749 | - } |
2750 | } |
2751 | |
2752 | if ($kconfig) { |
2753 | diff --git a/sound/pci/emu10k1/emu10k1_main.c b/sound/pci/emu10k1/emu10k1_main.c |
2754 | index e6b0166..bdd888e 100644 |
2755 | --- a/sound/pci/emu10k1/emu10k1_main.c |
2756 | +++ b/sound/pci/emu10k1/emu10k1_main.c |
2757 | @@ -657,14 +657,14 @@ static int snd_emu10k1_cardbus_init(struct snd_emu10k1 *emu) |
2758 | return 0; |
2759 | } |
2760 | |
2761 | -static int snd_emu1010_load_firmware(struct snd_emu10k1 *emu) |
2762 | +static int snd_emu1010_load_firmware(struct snd_emu10k1 *emu, |
2763 | + const struct firmware *fw_entry) |
2764 | { |
2765 | int n, i; |
2766 | int reg; |
2767 | int value; |
2768 | unsigned int write_post; |
2769 | unsigned long flags; |
2770 | - const struct firmware *fw_entry = emu->firmware; |
2771 | |
2772 | if (!fw_entry) |
2773 | return -EIO; |
2774 | @@ -725,9 +725,34 @@ static int emu1010_firmware_thread(void *data) |
2775 | /* Return to Audio Dock programming mode */ |
2776 | snd_printk(KERN_INFO "emu1010: Loading Audio Dock Firmware\n"); |
2777 | snd_emu1010_fpga_write(emu, EMU_HANA_FPGA_CONFIG, EMU_HANA_FPGA_CONFIG_AUDIODOCK); |
2778 | - err = snd_emu1010_load_firmware(emu); |
2779 | - if (err != 0) |
2780 | - continue; |
2781 | + |
2782 | + if (!emu->dock_fw) { |
2783 | + const char *filename = NULL; |
2784 | + switch (emu->card_capabilities->emu_model) { |
2785 | + case EMU_MODEL_EMU1010: |
2786 | + filename = DOCK_FILENAME; |
2787 | + break; |
2788 | + case EMU_MODEL_EMU1010B: |
2789 | + filename = MICRO_DOCK_FILENAME; |
2790 | + break; |
2791 | + case EMU_MODEL_EMU1616: |
2792 | + filename = MICRO_DOCK_FILENAME; |
2793 | + break; |
2794 | + } |
2795 | + if (filename) { |
2796 | + err = request_firmware(&emu->dock_fw, |
2797 | + filename, |
2798 | + &emu->pci->dev); |
2799 | + if (err) |
2800 | + continue; |
2801 | + } |
2802 | + } |
2803 | + |
2804 | + if (emu->dock_fw) { |
2805 | + err = snd_emu1010_load_firmware(emu, emu->dock_fw); |
2806 | + if (err) |
2807 | + continue; |
2808 | + } |
2809 | |
2810 | snd_emu1010_fpga_write(emu, EMU_HANA_FPGA_CONFIG, 0); |
2811 | snd_emu1010_fpga_read(emu, EMU_HANA_IRQ_STATUS, ®); |
2812 | @@ -862,7 +887,7 @@ static int snd_emu10k1_emu1010_init(struct snd_emu10k1 *emu) |
2813 | filename, emu->firmware->size); |
2814 | } |
2815 | |
2816 | - err = snd_emu1010_load_firmware(emu); |
2817 | + err = snd_emu1010_load_firmware(emu, emu->firmware); |
2818 | if (err != 0) { |
2819 | snd_printk(KERN_INFO "emu1010: Loading Firmware failed\n"); |
2820 | return err; |
2821 | @@ -1253,6 +1278,8 @@ static int snd_emu10k1_free(struct snd_emu10k1 *emu) |
2822 | kthread_stop(emu->emu1010.firmware_thread); |
2823 | if (emu->firmware) |
2824 | release_firmware(emu->firmware); |
2825 | + if (emu->dock_fw) |
2826 | + release_firmware(emu->dock_fw); |
2827 | if (emu->irq >= 0) |
2828 | free_irq(emu->irq, emu); |
2829 | /* remove reserved page */ |
2830 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
2831 | index ee975a2..7f45d48 100644 |
2832 | --- a/sound/pci/hda/patch_realtek.c |
2833 | +++ b/sound/pci/hda/patch_realtek.c |
2834 | @@ -5823,6 +5823,7 @@ enum { |
2835 | ALC269_TYPE_ALC280, |
2836 | ALC269_TYPE_ALC282, |
2837 | ALC269_TYPE_ALC284, |
2838 | + ALC269_TYPE_ALC286, |
2839 | }; |
2840 | |
2841 | /* |
2842 | @@ -5846,6 +5847,7 @@ static int alc269_parse_auto_config(struct hda_codec *codec) |
2843 | case ALC269_TYPE_ALC269VB: |
2844 | case ALC269_TYPE_ALC269VD: |
2845 | case ALC269_TYPE_ALC282: |
2846 | + case ALC269_TYPE_ALC286: |
2847 | ssids = alc269_ssids; |
2848 | break; |
2849 | default: |
2850 | @@ -6451,6 +6453,9 @@ static int patch_alc269(struct hda_codec *codec) |
2851 | case 0x10ec0292: |
2852 | spec->codec_variant = ALC269_TYPE_ALC284; |
2853 | break; |
2854 | + case 0x10ec0286: |
2855 | + spec->codec_variant = ALC269_TYPE_ALC286; |
2856 | + break; |
2857 | } |
2858 | |
2859 | /* automatic parse from the BIOS config */ |
2860 | @@ -7157,6 +7162,7 @@ static const struct hda_codec_preset snd_hda_preset_realtek[] = { |
2861 | { .id = 0x10ec0282, .name = "ALC282", .patch = patch_alc269 }, |
2862 | { .id = 0x10ec0283, .name = "ALC283", .patch = patch_alc269 }, |
2863 | { .id = 0x10ec0284, .name = "ALC284", .patch = patch_alc269 }, |
2864 | + { .id = 0x10ec0286, .name = "ALC286", .patch = patch_alc269 }, |
2865 | { .id = 0x10ec0290, .name = "ALC290", .patch = patch_alc269 }, |
2866 | { .id = 0x10ec0292, .name = "ALC292", .patch = patch_alc269 }, |
2867 | { .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660", |
2868 | diff --git a/sound/soc/codecs/max98088.c b/sound/soc/codecs/max98088.c |
2869 | index a4c16fd..5d36319 100644 |
2870 | --- a/sound/soc/codecs/max98088.c |
2871 | +++ b/sound/soc/codecs/max98088.c |
2872 | @@ -2006,7 +2006,7 @@ static int max98088_probe(struct snd_soc_codec *codec) |
2873 | ret); |
2874 | goto err_access; |
2875 | } |
2876 | - dev_info(codec->dev, "revision %c\n", ret + 'A'); |
2877 | + dev_info(codec->dev, "revision %c\n", ret - 0x40 + 'A'); |
2878 | |
2879 | snd_soc_write(codec, M98088_REG_51_PWR_SYS, M98088_PWRSV); |
2880 | |
2881 | diff --git a/sound/usb/6fire/pcm.c b/sound/usb/6fire/pcm.c |
2882 | index e2ca12f..40dd50a 100644 |
2883 | --- a/sound/usb/6fire/pcm.c |
2884 | +++ b/sound/usb/6fire/pcm.c |
2885 | @@ -575,7 +575,6 @@ static void usb6fire_pcm_init_urb(struct pcm_urb *urb, |
2886 | urb->instance.pipe = in ? usb_rcvisocpipe(chip->dev, ep) |
2887 | : usb_sndisocpipe(chip->dev, ep); |
2888 | urb->instance.interval = 1; |
2889 | - urb->instance.transfer_flags = URB_ISO_ASAP; |
2890 | urb->instance.complete = handler; |
2891 | urb->instance.context = urb; |
2892 | urb->instance.number_of_packets = PCM_N_PACKETS_PER_URB; |
2893 | diff --git a/sound/usb/caiaq/audio.c b/sound/usb/caiaq/audio.c |
2894 | index fde9a7a..b45e29b 100644 |
2895 | --- a/sound/usb/caiaq/audio.c |
2896 | +++ b/sound/usb/caiaq/audio.c |
2897 | @@ -670,7 +670,6 @@ static void read_completed(struct urb *urb) |
2898 | |
2899 | if (send_it) { |
2900 | out->number_of_packets = outframe; |
2901 | - out->transfer_flags = URB_ISO_ASAP; |
2902 | usb_submit_urb(out, GFP_ATOMIC); |
2903 | } else { |
2904 | struct snd_usb_caiaq_cb_info *oinfo = out->context; |
2905 | @@ -686,7 +685,6 @@ requeue: |
2906 | } |
2907 | |
2908 | urb->number_of_packets = FRAMES_PER_URB; |
2909 | - urb->transfer_flags = URB_ISO_ASAP; |
2910 | usb_submit_urb(urb, GFP_ATOMIC); |
2911 | } |
2912 | |
2913 | @@ -751,7 +749,6 @@ static struct urb **alloc_urbs(struct snd_usb_caiaqdev *dev, int dir, int *ret) |
2914 | * BYTES_PER_FRAME; |
2915 | urbs[i]->context = &dev->data_cb_info[i]; |
2916 | urbs[i]->interval = 1; |
2917 | - urbs[i]->transfer_flags = URB_ISO_ASAP; |
2918 | urbs[i]->number_of_packets = FRAMES_PER_URB; |
2919 | urbs[i]->complete = (dir == SNDRV_PCM_STREAM_CAPTURE) ? |
2920 | read_completed : write_completed; |
2921 | diff --git a/sound/usb/card.c b/sound/usb/card.c |
2922 | index ccf95cf..a9d5779 100644 |
2923 | --- a/sound/usb/card.c |
2924 | +++ b/sound/usb/card.c |
2925 | @@ -612,7 +612,9 @@ int snd_usb_autoresume(struct snd_usb_audio *chip) |
2926 | int err = -ENODEV; |
2927 | |
2928 | down_read(&chip->shutdown_rwsem); |
2929 | - if (!chip->shutdown && !chip->probing) |
2930 | + if (chip->probing) |
2931 | + err = 0; |
2932 | + else if (!chip->shutdown) |
2933 | err = usb_autopm_get_interface(chip->pm_intf); |
2934 | up_read(&chip->shutdown_rwsem); |
2935 | |
2936 | diff --git a/sound/usb/card.h b/sound/usb/card.h |
2937 | index 8a751b4..d32ea41 100644 |
2938 | --- a/sound/usb/card.h |
2939 | +++ b/sound/usb/card.h |
2940 | @@ -116,6 +116,7 @@ struct snd_usb_substream { |
2941 | unsigned int altset_idx; /* USB data format: index of alternate setting */ |
2942 | unsigned int txfr_quirk:1; /* allow sub-frame alignment */ |
2943 | unsigned int fmt_type; /* USB audio format type (1-3) */ |
2944 | + unsigned int pkt_offset_adj; /* Bytes to drop from beginning of packets (for non-compliant devices) */ |
2945 | |
2946 | unsigned int running: 1; /* running status */ |
2947 | |
2948 | diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c |
2949 | index 21049b8..63cca3a 100644 |
2950 | --- a/sound/usb/endpoint.c |
2951 | +++ b/sound/usb/endpoint.c |
2952 | @@ -677,7 +677,7 @@ static int data_ep_set_params(struct snd_usb_endpoint *ep, |
2953 | if (!u->urb->transfer_buffer) |
2954 | goto out_of_memory; |
2955 | u->urb->pipe = ep->pipe; |
2956 | - u->urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP; |
2957 | + u->urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP; |
2958 | u->urb->interval = 1 << ep->datainterval; |
2959 | u->urb->context = u; |
2960 | u->urb->complete = snd_complete_urb; |
2961 | @@ -716,8 +716,7 @@ static int sync_ep_set_params(struct snd_usb_endpoint *ep, |
2962 | u->urb->transfer_dma = ep->sync_dma + i * 4; |
2963 | u->urb->transfer_buffer_length = 4; |
2964 | u->urb->pipe = ep->pipe; |
2965 | - u->urb->transfer_flags = URB_ISO_ASAP | |
2966 | - URB_NO_TRANSFER_DMA_MAP; |
2967 | + u->urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP; |
2968 | u->urb->number_of_packets = 1; |
2969 | u->urb->interval = 1 << ep->syncinterval; |
2970 | u->urb->context = u; |
2971 | diff --git a/sound/usb/midi.c b/sound/usb/midi.c |
2972 | index 34b9bb7..e5fee18 100644 |
2973 | --- a/sound/usb/midi.c |
2974 | +++ b/sound/usb/midi.c |
2975 | @@ -126,7 +126,6 @@ struct snd_usb_midi { |
2976 | struct snd_usb_midi_in_endpoint *in; |
2977 | } endpoints[MIDI_MAX_ENDPOINTS]; |
2978 | unsigned long input_triggered; |
2979 | - bool autopm_reference; |
2980 | unsigned int opened[2]; |
2981 | unsigned char disconnected; |
2982 | unsigned char input_running; |
2983 | @@ -1040,7 +1039,6 @@ static int substream_open(struct snd_rawmidi_substream *substream, int dir, |
2984 | { |
2985 | struct snd_usb_midi* umidi = substream->rmidi->private_data; |
2986 | struct snd_kcontrol *ctl; |
2987 | - int err; |
2988 | |
2989 | down_read(&umidi->disc_rwsem); |
2990 | if (umidi->disconnected) { |
2991 | @@ -1051,13 +1049,6 @@ static int substream_open(struct snd_rawmidi_substream *substream, int dir, |
2992 | mutex_lock(&umidi->mutex); |
2993 | if (open) { |
2994 | if (!umidi->opened[0] && !umidi->opened[1]) { |
2995 | - err = usb_autopm_get_interface(umidi->iface); |
2996 | - umidi->autopm_reference = err >= 0; |
2997 | - if (err < 0 && err != -EACCES) { |
2998 | - mutex_unlock(&umidi->mutex); |
2999 | - up_read(&umidi->disc_rwsem); |
3000 | - return -EIO; |
3001 | - } |
3002 | if (umidi->roland_load_ctl) { |
3003 | ctl = umidi->roland_load_ctl; |
3004 | ctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE; |
3005 | @@ -1080,8 +1071,6 @@ static int substream_open(struct snd_rawmidi_substream *substream, int dir, |
3006 | snd_ctl_notify(umidi->card, |
3007 | SNDRV_CTL_EVENT_MASK_INFO, &ctl->id); |
3008 | } |
3009 | - if (umidi->autopm_reference) |
3010 | - usb_autopm_put_interface(umidi->iface); |
3011 | } |
3012 | } |
3013 | mutex_unlock(&umidi->mutex); |
3014 | @@ -2256,6 +2245,8 @@ int snd_usbmidi_create(struct snd_card *card, |
3015 | return err; |
3016 | } |
3017 | |
3018 | + usb_autopm_get_interface_no_resume(umidi->iface); |
3019 | + |
3020 | list_add_tail(&umidi->list, midi_list); |
3021 | return 0; |
3022 | } |
3023 | diff --git a/sound/usb/misc/ua101.c b/sound/usb/misc/ua101.c |
3024 | index 8b81cb5..6ad617b 100644 |
3025 | --- a/sound/usb/misc/ua101.c |
3026 | +++ b/sound/usb/misc/ua101.c |
3027 | @@ -1120,8 +1120,7 @@ static int alloc_stream_urbs(struct ua101 *ua, struct ua101_stream *stream, |
3028 | usb_init_urb(&urb->urb); |
3029 | urb->urb.dev = ua->dev; |
3030 | urb->urb.pipe = stream->usb_pipe; |
3031 | - urb->urb.transfer_flags = URB_ISO_ASAP | |
3032 | - URB_NO_TRANSFER_DMA_MAP; |
3033 | + urb->urb.transfer_flags = URB_NO_TRANSFER_DMA_MAP; |
3034 | urb->urb.transfer_buffer = addr; |
3035 | urb->urb.transfer_dma = dma; |
3036 | urb->urb.transfer_buffer_length = max_packet_size; |
3037 | diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c |
3038 | index d82e378..bcc50ed 100644 |
3039 | --- a/sound/usb/pcm.c |
3040 | +++ b/sound/usb/pcm.c |
3041 | @@ -1161,7 +1161,7 @@ static void retire_capture_urb(struct snd_usb_substream *subs, |
3042 | stride = runtime->frame_bits >> 3; |
3043 | |
3044 | for (i = 0; i < urb->number_of_packets; i++) { |
3045 | - cp = (unsigned char *)urb->transfer_buffer + urb->iso_frame_desc[i].offset; |
3046 | + cp = (unsigned char *)urb->transfer_buffer + urb->iso_frame_desc[i].offset + subs->pkt_offset_adj; |
3047 | if (urb->iso_frame_desc[i].status && printk_ratelimit()) { |
3048 | snd_printdd(KERN_ERR "frame %d active: %d\n", i, urb->iso_frame_desc[i].status); |
3049 | // continue; |
3050 | diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c |
3051 | index b9ca776..f581c3e 100644 |
3052 | --- a/sound/usb/quirks.c |
3053 | +++ b/sound/usb/quirks.c |
3054 | @@ -837,6 +837,7 @@ static void set_format_emu_quirk(struct snd_usb_substream *subs, |
3055 | break; |
3056 | } |
3057 | snd_emuusb_set_samplerate(subs->stream->chip, emu_samplerate_id); |
3058 | + subs->pkt_offset_adj = (emu_samplerate_id >= EMU_QUIRK_SR_176400HZ) ? 4 : 0; |
3059 | } |
3060 | |
3061 | void snd_usb_set_format_quirk(struct snd_usb_substream *subs, |
3062 | diff --git a/sound/usb/stream.c b/sound/usb/stream.c |
3063 | index ad181d5..cfc4d4e 100644 |
3064 | --- a/sound/usb/stream.c |
3065 | +++ b/sound/usb/stream.c |
3066 | @@ -94,6 +94,7 @@ static void snd_usb_init_substream(struct snd_usb_stream *as, |
3067 | subs->dev = as->chip->dev; |
3068 | subs->txfr_quirk = as->chip->txfr_quirk; |
3069 | subs->speed = snd_usb_get_speed(subs->dev); |
3070 | + subs->pkt_offset_adj = 0; |
3071 | |
3072 | snd_usb_set_pcm_ops(as->pcm, stream); |
3073 | |
3074 | @@ -396,6 +397,14 @@ static int parse_uac_endpoint_attributes(struct snd_usb_audio *chip, |
3075 | if (!csep && altsd->bNumEndpoints >= 2) |
3076 | csep = snd_usb_find_desc(alts->endpoint[1].extra, alts->endpoint[1].extralen, NULL, USB_DT_CS_ENDPOINT); |
3077 | |
3078 | + /* |
3079 | + * If we can't locate the USB_DT_CS_ENDPOINT descriptor in the extra |
3080 | + * bytes after the first endpoint, go search the entire interface. |
3081 | + * Some devices have it directly *before* the standard endpoint. |
3082 | + */ |
3083 | + if (!csep) |
3084 | + csep = snd_usb_find_desc(alts->extra, alts->extralen, NULL, USB_DT_CS_ENDPOINT); |
3085 | + |
3086 | if (!csep || csep->bLength < 7 || |
3087 | csep->bDescriptorSubtype != UAC_EP_GENERAL) { |
3088 | snd_printk(KERN_WARNING "%d:%u:%d : no or invalid" |
3089 | diff --git a/sound/usb/usx2y/usb_stream.c b/sound/usb/usx2y/usb_stream.c |
3090 | index 1e7a47a..bf618e1 100644 |
3091 | --- a/sound/usb/usx2y/usb_stream.c |
3092 | +++ b/sound/usb/usx2y/usb_stream.c |
3093 | @@ -69,7 +69,6 @@ static void init_pipe_urbs(struct usb_stream_kernel *sk, unsigned use_packsize, |
3094 | ++u, transfer += transfer_length) { |
3095 | struct urb *urb = urbs[u]; |
3096 | struct usb_iso_packet_descriptor *desc; |
3097 | - urb->transfer_flags = URB_ISO_ASAP; |
3098 | urb->transfer_buffer = transfer; |
3099 | urb->dev = dev; |
3100 | urb->pipe = pipe; |
3101 | diff --git a/sound/usb/usx2y/usbusx2yaudio.c b/sound/usb/usx2y/usbusx2yaudio.c |
3102 | index 520ef96..b376532 100644 |
3103 | --- a/sound/usb/usx2y/usbusx2yaudio.c |
3104 | +++ b/sound/usb/usx2y/usbusx2yaudio.c |
3105 | @@ -503,7 +503,6 @@ static int usX2Y_urbs_start(struct snd_usX2Y_substream *subs) |
3106 | if (0 == i) |
3107 | atomic_set(&subs->state, state_STARTING3); |
3108 | urb->dev = usX2Y->dev; |
3109 | - urb->transfer_flags = URB_ISO_ASAP; |
3110 | for (pack = 0; pack < nr_of_packs(); pack++) { |
3111 | urb->iso_frame_desc[pack].offset = subs->maxpacksize * pack; |
3112 | urb->iso_frame_desc[pack].length = subs->maxpacksize; |
3113 | diff --git a/sound/usb/usx2y/usx2yhwdeppcm.c b/sound/usb/usx2y/usx2yhwdeppcm.c |
3114 | index cc56007..f2a1acd 100644 |
3115 | --- a/sound/usb/usx2y/usx2yhwdeppcm.c |
3116 | +++ b/sound/usb/usx2y/usx2yhwdeppcm.c |
3117 | @@ -443,7 +443,6 @@ static int usX2Y_usbpcm_urbs_start(struct snd_usX2Y_substream *subs) |
3118 | if (0 == u) |
3119 | atomic_set(&subs->state, state_STARTING3); |
3120 | urb->dev = usX2Y->dev; |
3121 | - urb->transfer_flags = URB_ISO_ASAP; |
3122 | for (pack = 0; pack < nr_of_packs(); pack++) { |
3123 | urb->iso_frame_desc[pack].offset = subs->maxpacksize * (pack + u * nr_of_packs()); |
3124 | urb->iso_frame_desc[pack].length = subs->maxpacksize; |