Annotation of /trunk/kernel-magellan/patches-3.6/0101-3.6.2-all-fixes.patch
Parent Directory | Revision Log
Revision 1921 -
(hide annotations)
(download)
Fri Oct 26 08:33:00 2012 UTC (11 years, 11 months ago) by niro
File size: 145571 byte(s)
Fri Oct 26 08:33:00 2012 UTC (11 years, 11 months ago) by niro
File size: 145571 byte(s)
-3.6.3-magellan-r1
1 | niro | 1921 | diff --git a/arch/alpha/kernel/process.c b/arch/alpha/kernel/process.c |
2 | index d6fde98..848ef4a 100644 | ||
3 | --- a/arch/alpha/kernel/process.c | ||
4 | +++ b/arch/alpha/kernel/process.c | ||
5 | @@ -28,6 +28,7 @@ | ||
6 | #include <linux/tty.h> | ||
7 | #include <linux/console.h> | ||
8 | #include <linux/slab.h> | ||
9 | +#include <linux/rcupdate.h> | ||
10 | |||
11 | #include <asm/reg.h> | ||
12 | #include <asm/uaccess.h> | ||
13 | @@ -54,8 +55,10 @@ cpu_idle(void) | ||
14 | /* FIXME -- EV6 and LCA45 know how to power down | ||
15 | the CPU. */ | ||
16 | |||
17 | + rcu_idle_enter(); | ||
18 | while (!need_resched()) | ||
19 | cpu_relax(); | ||
20 | + rcu_idle_exit(); | ||
21 | schedule(); | ||
22 | } | ||
23 | } | ||
24 | diff --git a/arch/arm/include/asm/syscall.h b/arch/arm/include/asm/syscall.h | ||
25 | index c334a23..fce38a6 100644 | ||
26 | --- a/arch/arm/include/asm/syscall.h | ||
27 | +++ b/arch/arm/include/asm/syscall.h | ||
28 | @@ -8,6 +8,7 @@ | ||
29 | #define _ASM_ARM_SYSCALL_H | ||
30 | |||
31 | #include <linux/err.h> | ||
32 | +#include <linux/sched.h> | ||
33 | |||
34 | extern const unsigned long sys_call_table[]; | ||
35 | |||
36 | diff --git a/arch/cris/kernel/process.c b/arch/cris/kernel/process.c | ||
37 | index 66fd017..7f65be6 100644 | ||
38 | --- a/arch/cris/kernel/process.c | ||
39 | +++ b/arch/cris/kernel/process.c | ||
40 | @@ -25,6 +25,7 @@ | ||
41 | #include <linux/elfcore.h> | ||
42 | #include <linux/mqueue.h> | ||
43 | #include <linux/reboot.h> | ||
44 | +#include <linux/rcupdate.h> | ||
45 | |||
46 | //#define DEBUG | ||
47 | |||
48 | @@ -74,6 +75,7 @@ void cpu_idle (void) | ||
49 | { | ||
50 | /* endless idle loop with no priority at all */ | ||
51 | while (1) { | ||
52 | + rcu_idle_enter(); | ||
53 | while (!need_resched()) { | ||
54 | void (*idle)(void); | ||
55 | /* | ||
56 | @@ -86,6 +88,7 @@ void cpu_idle (void) | ||
57 | idle = default_idle; | ||
58 | idle(); | ||
59 | } | ||
60 | + rcu_idle_exit(); | ||
61 | schedule_preempt_disabled(); | ||
62 | } | ||
63 | } | ||
64 | diff --git a/arch/frv/kernel/process.c b/arch/frv/kernel/process.c | ||
65 | index ff95f50..2eb7fa5 100644 | ||
66 | --- a/arch/frv/kernel/process.c | ||
67 | +++ b/arch/frv/kernel/process.c | ||
68 | @@ -25,6 +25,7 @@ | ||
69 | #include <linux/reboot.h> | ||
70 | #include <linux/interrupt.h> | ||
71 | #include <linux/pagemap.h> | ||
72 | +#include <linux/rcupdate.h> | ||
73 | |||
74 | #include <asm/asm-offsets.h> | ||
75 | #include <asm/uaccess.h> | ||
76 | @@ -69,12 +70,14 @@ void cpu_idle(void) | ||
77 | { | ||
78 | /* endless idle loop with no priority at all */ | ||
79 | while (1) { | ||
80 | + rcu_idle_enter(); | ||
81 | while (!need_resched()) { | ||
82 | check_pgt_cache(); | ||
83 | |||
84 | if (!frv_dma_inprogress && idle) | ||
85 | idle(); | ||
86 | } | ||
87 | + rcu_idle_exit(); | ||
88 | |||
89 | schedule_preempt_disabled(); | ||
90 | } | ||
91 | diff --git a/arch/h8300/kernel/process.c b/arch/h8300/kernel/process.c | ||
92 | index 0e9c315..f153ed1 100644 | ||
93 | --- a/arch/h8300/kernel/process.c | ||
94 | +++ b/arch/h8300/kernel/process.c | ||
95 | @@ -36,6 +36,7 @@ | ||
96 | #include <linux/reboot.h> | ||
97 | #include <linux/fs.h> | ||
98 | #include <linux/slab.h> | ||
99 | +#include <linux/rcupdate.h> | ||
100 | |||
101 | #include <asm/uaccess.h> | ||
102 | #include <asm/traps.h> | ||
103 | @@ -78,8 +79,10 @@ void (*idle)(void) = default_idle; | ||
104 | void cpu_idle(void) | ||
105 | { | ||
106 | while (1) { | ||
107 | + rcu_idle_enter(); | ||
108 | while (!need_resched()) | ||
109 | idle(); | ||
110 | + rcu_idle_exit(); | ||
111 | schedule_preempt_disabled(); | ||
112 | } | ||
113 | } | ||
114 | diff --git a/arch/ia64/kernel/process.c b/arch/ia64/kernel/process.c | ||
115 | index dd6fc14..3e316ec 100644 | ||
116 | --- a/arch/ia64/kernel/process.c | ||
117 | +++ b/arch/ia64/kernel/process.c | ||
118 | @@ -29,6 +29,7 @@ | ||
119 | #include <linux/kdebug.h> | ||
120 | #include <linux/utsname.h> | ||
121 | #include <linux/tracehook.h> | ||
122 | +#include <linux/rcupdate.h> | ||
123 | |||
124 | #include <asm/cpu.h> | ||
125 | #include <asm/delay.h> | ||
126 | @@ -279,6 +280,7 @@ cpu_idle (void) | ||
127 | |||
128 | /* endless idle loop with no priority at all */ | ||
129 | while (1) { | ||
130 | + rcu_idle_enter(); | ||
131 | if (can_do_pal_halt) { | ||
132 | current_thread_info()->status &= ~TS_POLLING; | ||
133 | /* | ||
134 | @@ -309,6 +311,7 @@ cpu_idle (void) | ||
135 | normal_xtp(); | ||
136 | #endif | ||
137 | } | ||
138 | + rcu_idle_exit(); | ||
139 | schedule_preempt_disabled(); | ||
140 | check_pgt_cache(); | ||
141 | if (cpu_is_offline(cpu)) | ||
142 | diff --git a/arch/m32r/kernel/process.c b/arch/m32r/kernel/process.c | ||
143 | index 3a4a32b..384e63f 100644 | ||
144 | --- a/arch/m32r/kernel/process.c | ||
145 | +++ b/arch/m32r/kernel/process.c | ||
146 | @@ -26,6 +26,7 @@ | ||
147 | #include <linux/ptrace.h> | ||
148 | #include <linux/unistd.h> | ||
149 | #include <linux/hardirq.h> | ||
150 | +#include <linux/rcupdate.h> | ||
151 | |||
152 | #include <asm/io.h> | ||
153 | #include <asm/uaccess.h> | ||
154 | @@ -82,6 +83,7 @@ void cpu_idle (void) | ||
155 | { | ||
156 | /* endless idle loop with no priority at all */ | ||
157 | while (1) { | ||
158 | + rcu_idle_enter(); | ||
159 | while (!need_resched()) { | ||
160 | void (*idle)(void) = pm_idle; | ||
161 | |||
162 | @@ -90,6 +92,7 @@ void cpu_idle (void) | ||
163 | |||
164 | idle(); | ||
165 | } | ||
166 | + rcu_idle_exit(); | ||
167 | schedule_preempt_disabled(); | ||
168 | } | ||
169 | } | ||
170 | diff --git a/arch/m68k/kernel/process.c b/arch/m68k/kernel/process.c | ||
171 | index c488e3c..ac2892e 100644 | ||
172 | --- a/arch/m68k/kernel/process.c | ||
173 | +++ b/arch/m68k/kernel/process.c | ||
174 | @@ -25,6 +25,7 @@ | ||
175 | #include <linux/reboot.h> | ||
176 | #include <linux/init_task.h> | ||
177 | #include <linux/mqueue.h> | ||
178 | +#include <linux/rcupdate.h> | ||
179 | |||
180 | #include <asm/uaccess.h> | ||
181 | #include <asm/traps.h> | ||
182 | @@ -75,8 +76,10 @@ void cpu_idle(void) | ||
183 | { | ||
184 | /* endless idle loop with no priority at all */ | ||
185 | while (1) { | ||
186 | + rcu_idle_enter(); | ||
187 | while (!need_resched()) | ||
188 | idle(); | ||
189 | + rcu_idle_exit(); | ||
190 | schedule_preempt_disabled(); | ||
191 | } | ||
192 | } | ||
193 | diff --git a/arch/mips/Makefile b/arch/mips/Makefile | ||
194 | index 764e37a..654b1ad 100644 | ||
195 | --- a/arch/mips/Makefile | ||
196 | +++ b/arch/mips/Makefile | ||
197 | @@ -225,7 +225,7 @@ KBUILD_CPPFLAGS += -DDATAOFFSET=$(if $(dataoffset-y),$(dataoffset-y),0) | ||
198 | LDFLAGS += -m $(ld-emul) | ||
199 | |||
200 | ifdef CONFIG_MIPS | ||
201 | -CHECKFLAGS += $(shell $(CC) $(KBUILD_CFLAGS) -dM -E -xc /dev/null | \ | ||
202 | +CHECKFLAGS += $(shell $(CC) $(KBUILD_CFLAGS) -dM -E -x c /dev/null | \ | ||
203 | egrep -vw '__GNUC_(|MINOR_|PATCHLEVEL_)_' | \ | ||
204 | sed -e "s/^\#define /-D'/" -e "s/ /'='/" -e "s/$$/'/") | ||
205 | ifdef CONFIG_64BIT | ||
206 | diff --git a/arch/mips/ath79/clock.c b/arch/mips/ath79/clock.c | ||
207 | index b91ad3e..d272857 100644 | ||
208 | --- a/arch/mips/ath79/clock.c | ||
209 | +++ b/arch/mips/ath79/clock.c | ||
210 | @@ -189,7 +189,7 @@ static void __init ar934x_clocks_init(void) | ||
211 | AR934X_PLL_CPU_CONFIG_NFRAC_MASK; | ||
212 | |||
213 | cpu_pll = nint * ath79_ref_clk.rate / ref_div; | ||
214 | - cpu_pll += frac * ath79_ref_clk.rate / (ref_div * (2 << 6)); | ||
215 | + cpu_pll += frac * ath79_ref_clk.rate / (ref_div * (1 << 6)); | ||
216 | cpu_pll /= (1 << out_div); | ||
217 | |||
218 | pll = ath79_pll_rr(AR934X_PLL_DDR_CONFIG_REG); | ||
219 | @@ -203,7 +203,7 @@ static void __init ar934x_clocks_init(void) | ||
220 | AR934X_PLL_DDR_CONFIG_NFRAC_MASK; | ||
221 | |||
222 | ddr_pll = nint * ath79_ref_clk.rate / ref_div; | ||
223 | - ddr_pll += frac * ath79_ref_clk.rate / (ref_div * (2 << 10)); | ||
224 | + ddr_pll += frac * ath79_ref_clk.rate / (ref_div * (1 << 10)); | ||
225 | ddr_pll /= (1 << out_div); | ||
226 | |||
227 | clk_ctrl = ath79_pll_rr(AR934X_PLL_CPU_DDR_CLK_CTRL_REG); | ||
228 | diff --git a/arch/mips/kernel/Makefile b/arch/mips/kernel/Makefile | ||
229 | index fdaf65e..c6136cb 100644 | ||
230 | --- a/arch/mips/kernel/Makefile | ||
231 | +++ b/arch/mips/kernel/Makefile | ||
232 | @@ -104,7 +104,7 @@ obj-$(CONFIG_MIPS_MACHINE) += mips_machine.o | ||
233 | |||
234 | obj-$(CONFIG_OF) += prom.o | ||
235 | |||
236 | -CFLAGS_cpu-bugs64.o = $(shell if $(CC) $(KBUILD_CFLAGS) -Wa,-mdaddi -c -o /dev/null -xc /dev/null >/dev/null 2>&1; then echo "-DHAVE_AS_SET_DADDI"; fi) | ||
237 | +CFLAGS_cpu-bugs64.o = $(shell if $(CC) $(KBUILD_CFLAGS) -Wa,-mdaddi -c -o /dev/null -x c /dev/null >/dev/null 2>&1; then echo "-DHAVE_AS_SET_DADDI"; fi) | ||
238 | |||
239 | obj-$(CONFIG_HAVE_STD_PC_SERIAL_PORT) += 8250-platform.o | ||
240 | |||
241 | diff --git a/arch/mn10300/Makefile b/arch/mn10300/Makefile | ||
242 | index 33188b6..a3d0fef 100644 | ||
243 | --- a/arch/mn10300/Makefile | ||
244 | +++ b/arch/mn10300/Makefile | ||
245 | @@ -26,7 +26,7 @@ CHECKFLAGS += | ||
246 | PROCESSOR := unset | ||
247 | UNIT := unset | ||
248 | |||
249 | -KBUILD_CFLAGS += -mam33 -mmem-funcs -DCPU=AM33 | ||
250 | +KBUILD_CFLAGS += -mam33 -DCPU=AM33 $(call cc-option,-mmem-funcs,) | ||
251 | KBUILD_AFLAGS += -mam33 -DCPU=AM33 | ||
252 | |||
253 | ifeq ($(CONFIG_MN10300_CURRENT_IN_E2),y) | ||
254 | diff --git a/arch/mn10300/kernel/process.c b/arch/mn10300/kernel/process.c | ||
255 | index 7dab0cd..e9cceba 100644 | ||
256 | --- a/arch/mn10300/kernel/process.c | ||
257 | +++ b/arch/mn10300/kernel/process.c | ||
258 | @@ -25,6 +25,7 @@ | ||
259 | #include <linux/err.h> | ||
260 | #include <linux/fs.h> | ||
261 | #include <linux/slab.h> | ||
262 | +#include <linux/rcupdate.h> | ||
263 | #include <asm/uaccess.h> | ||
264 | #include <asm/pgtable.h> | ||
265 | #include <asm/io.h> | ||
266 | @@ -107,6 +108,7 @@ void cpu_idle(void) | ||
267 | { | ||
268 | /* endless idle loop with no priority at all */ | ||
269 | for (;;) { | ||
270 | + rcu_idle_enter(); | ||
271 | while (!need_resched()) { | ||
272 | void (*idle)(void); | ||
273 | |||
274 | @@ -121,6 +123,7 @@ void cpu_idle(void) | ||
275 | } | ||
276 | idle(); | ||
277 | } | ||
278 | + rcu_idle_exit(); | ||
279 | |||
280 | schedule_preempt_disabled(); | ||
281 | } | ||
282 | diff --git a/arch/parisc/kernel/process.c b/arch/parisc/kernel/process.c | ||
283 | index 2c05a92..8c6b6b6 100644 | ||
284 | --- a/arch/parisc/kernel/process.c | ||
285 | +++ b/arch/parisc/kernel/process.c | ||
286 | @@ -48,6 +48,7 @@ | ||
287 | #include <linux/unistd.h> | ||
288 | #include <linux/kallsyms.h> | ||
289 | #include <linux/uaccess.h> | ||
290 | +#include <linux/rcupdate.h> | ||
291 | |||
292 | #include <asm/io.h> | ||
293 | #include <asm/asm-offsets.h> | ||
294 | @@ -69,8 +70,10 @@ void cpu_idle(void) | ||
295 | |||
296 | /* endless idle loop with no priority at all */ | ||
297 | while (1) { | ||
298 | + rcu_idle_enter(); | ||
299 | while (!need_resched()) | ||
300 | barrier(); | ||
301 | + rcu_idle_exit(); | ||
302 | schedule_preempt_disabled(); | ||
303 | check_pgt_cache(); | ||
304 | } | ||
305 | diff --git a/arch/powerpc/include/asm/pci-bridge.h b/arch/powerpc/include/asm/pci-bridge.h | ||
306 | index 8cccbee..78326de 100644 | ||
307 | --- a/arch/powerpc/include/asm/pci-bridge.h | ||
308 | +++ b/arch/powerpc/include/asm/pci-bridge.h | ||
309 | @@ -182,6 +182,14 @@ static inline int pci_device_from_OF_node(struct device_node *np, | ||
310 | #if defined(CONFIG_EEH) | ||
311 | static inline struct eeh_dev *of_node_to_eeh_dev(struct device_node *dn) | ||
312 | { | ||
313 | + /* | ||
314 | + * For those OF nodes whose parent isn't PCI bridge, they | ||
315 | + * don't have PCI_DN actually. So we have to skip them for | ||
316 | + * any EEH operations. | ||
317 | + */ | ||
318 | + if (!dn || !PCI_DN(dn)) | ||
319 | + return NULL; | ||
320 | + | ||
321 | return PCI_DN(dn)->edev; | ||
322 | } | ||
323 | #endif | ||
324 | diff --git a/arch/powerpc/kernel/iommu.c b/arch/powerpc/kernel/iommu.c | ||
325 | index ff5a6ce..8226c6c 100644 | ||
326 | --- a/arch/powerpc/kernel/iommu.c | ||
327 | +++ b/arch/powerpc/kernel/iommu.c | ||
328 | @@ -215,7 +215,8 @@ static unsigned long iommu_range_alloc(struct device *dev, | ||
329 | spin_lock_irqsave(&(pool->lock), flags); | ||
330 | |||
331 | again: | ||
332 | - if ((pass == 0) && handle && *handle) | ||
333 | + if ((pass == 0) && handle && *handle && | ||
334 | + (*handle >= pool->start) && (*handle < pool->end)) | ||
335 | start = *handle; | ||
336 | else | ||
337 | start = pool->hint; | ||
338 | @@ -236,7 +237,9 @@ again: | ||
339 | * but on second pass, start at 0 in pool 0. | ||
340 | */ | ||
341 | if ((start & mask) >= limit || pass > 0) { | ||
342 | + spin_unlock(&(pool->lock)); | ||
343 | pool = &(tbl->pools[0]); | ||
344 | + spin_lock(&(pool->lock)); | ||
345 | start = pool->start; | ||
346 | } else { | ||
347 | start &= mask; | ||
348 | diff --git a/arch/powerpc/lib/memcpy_power7.S b/arch/powerpc/lib/memcpy_power7.S | ||
349 | index 7ba6c96..0663630 100644 | ||
350 | --- a/arch/powerpc/lib/memcpy_power7.S | ||
351 | +++ b/arch/powerpc/lib/memcpy_power7.S | ||
352 | @@ -239,8 +239,8 @@ _GLOBAL(memcpy_power7) | ||
353 | ori r9,r9,1 /* stream=1 */ | ||
354 | |||
355 | srdi r7,r5,7 /* length in cachelines, capped at 0x3FF */ | ||
356 | - cmpldi cr1,r7,0x3FF | ||
357 | - ble cr1,1f | ||
358 | + cmpldi r7,0x3FF | ||
359 | + ble 1f | ||
360 | li r7,0x3FF | ||
361 | 1: lis r0,0x0E00 /* depth=7 */ | ||
362 | sldi r7,r7,7 | ||
363 | diff --git a/arch/powerpc/platforms/pseries/eeh.c b/arch/powerpc/platforms/pseries/eeh.c | ||
364 | index ecd394c..9a0b5f5 100644 | ||
365 | --- a/arch/powerpc/platforms/pseries/eeh.c | ||
366 | +++ b/arch/powerpc/platforms/pseries/eeh.c | ||
367 | @@ -1029,7 +1029,7 @@ static void eeh_add_device_early(struct device_node *dn) | ||
368 | { | ||
369 | struct pci_controller *phb; | ||
370 | |||
371 | - if (!dn || !of_node_to_eeh_dev(dn)) | ||
372 | + if (!of_node_to_eeh_dev(dn)) | ||
373 | return; | ||
374 | phb = of_node_to_eeh_dev(dn)->phb; | ||
375 | |||
376 | diff --git a/arch/powerpc/sysdev/dart_iommu.c b/arch/powerpc/sysdev/dart_iommu.c | ||
377 | index 4f2680f..b68b0db 100644 | ||
378 | --- a/arch/powerpc/sysdev/dart_iommu.c | ||
379 | +++ b/arch/powerpc/sysdev/dart_iommu.c | ||
380 | @@ -74,11 +74,16 @@ static int dart_is_u4; | ||
381 | |||
382 | #define DBG(...) | ||
383 | |||
384 | +static DEFINE_SPINLOCK(invalidate_lock); | ||
385 | + | ||
386 | static inline void dart_tlb_invalidate_all(void) | ||
387 | { | ||
388 | unsigned long l = 0; | ||
389 | unsigned int reg, inv_bit; | ||
390 | unsigned long limit; | ||
391 | + unsigned long flags; | ||
392 | + | ||
393 | + spin_lock_irqsave(&invalidate_lock, flags); | ||
394 | |||
395 | DBG("dart: flush\n"); | ||
396 | |||
397 | @@ -111,12 +116,17 @@ retry: | ||
398 | panic("DART: TLB did not flush after waiting a long " | ||
399 | "time. Buggy U3 ?"); | ||
400 | } | ||
401 | + | ||
402 | + spin_unlock_irqrestore(&invalidate_lock, flags); | ||
403 | } | ||
404 | |||
405 | static inline void dart_tlb_invalidate_one(unsigned long bus_rpn) | ||
406 | { | ||
407 | unsigned int reg; | ||
408 | unsigned int l, limit; | ||
409 | + unsigned long flags; | ||
410 | + | ||
411 | + spin_lock_irqsave(&invalidate_lock, flags); | ||
412 | |||
413 | reg = DART_CNTL_U4_ENABLE | DART_CNTL_U4_IONE | | ||
414 | (bus_rpn & DART_CNTL_U4_IONE_MASK); | ||
415 | @@ -138,6 +148,8 @@ wait_more: | ||
416 | panic("DART: TLB did not flush after waiting a long " | ||
417 | "time. Buggy U4 ?"); | ||
418 | } | ||
419 | + | ||
420 | + spin_unlock_irqrestore(&invalidate_lock, flags); | ||
421 | } | ||
422 | |||
423 | static void dart_flush(struct iommu_table *tbl) | ||
424 | diff --git a/arch/score/kernel/process.c b/arch/score/kernel/process.c | ||
425 | index 2707023..637970c 100644 | ||
426 | --- a/arch/score/kernel/process.c | ||
427 | +++ b/arch/score/kernel/process.c | ||
428 | @@ -27,6 +27,7 @@ | ||
429 | #include <linux/reboot.h> | ||
430 | #include <linux/elfcore.h> | ||
431 | #include <linux/pm.h> | ||
432 | +#include <linux/rcupdate.h> | ||
433 | |||
434 | void (*pm_power_off)(void); | ||
435 | EXPORT_SYMBOL(pm_power_off); | ||
436 | @@ -50,9 +51,10 @@ void __noreturn cpu_idle(void) | ||
437 | { | ||
438 | /* endless idle loop with no priority at all */ | ||
439 | while (1) { | ||
440 | + rcu_idle_enter(); | ||
441 | while (!need_resched()) | ||
442 | barrier(); | ||
443 | - | ||
444 | + rcu_idle_exit(); | ||
445 | schedule_preempt_disabled(); | ||
446 | } | ||
447 | } | ||
448 | diff --git a/arch/x86/Makefile b/arch/x86/Makefile | ||
449 | index 474ca35..58790bd 100644 | ||
450 | --- a/arch/x86/Makefile | ||
451 | +++ b/arch/x86/Makefile | ||
452 | @@ -92,7 +92,7 @@ endif | ||
453 | ifdef CONFIG_X86_X32 | ||
454 | x32_ld_ok := $(call try-run,\ | ||
455 | /bin/echo -e '1: .quad 1b' | \ | ||
456 | - $(CC) $(KBUILD_AFLAGS) -c -xassembler -o "$$TMP" - && \ | ||
457 | + $(CC) $(KBUILD_AFLAGS) -c -x assembler -o "$$TMP" - && \ | ||
458 | $(OBJCOPY) -O elf32-x86-64 "$$TMP" "$$TMPO" && \ | ||
459 | $(LD) -m elf32_x86_64 "$$TMPO" -o "$$TMP",y,n) | ||
460 | ifeq ($(x32_ld_ok),y) | ||
461 | @@ -142,7 +142,7 @@ KBUILD_CFLAGS += $(call cc-option,-mno-avx,) | ||
462 | KBUILD_CFLAGS += $(mflags-y) | ||
463 | KBUILD_AFLAGS += $(mflags-y) | ||
464 | |||
465 | -archscripts: scripts_basic | ||
466 | +archscripts: | ||
467 | $(Q)$(MAKE) $(build)=arch/x86/tools relocs | ||
468 | |||
469 | ### | ||
470 | diff --git a/arch/x86/boot/compressed/Makefile b/arch/x86/boot/compressed/Makefile | ||
471 | index e398bb5..8a84501 100644 | ||
472 | --- a/arch/x86/boot/compressed/Makefile | ||
473 | +++ b/arch/x86/boot/compressed/Makefile | ||
474 | @@ -28,6 +28,9 @@ VMLINUX_OBJS = $(obj)/vmlinux.lds $(obj)/head_$(BITS).o $(obj)/misc.o \ | ||
475 | $(obj)/string.o $(obj)/cmdline.o $(obj)/early_serial_console.o \ | ||
476 | $(obj)/piggy.o | ||
477 | |||
478 | +$(obj)/eboot.o: KBUILD_CFLAGS += -fshort-wchar -mno-red-zone | ||
479 | +$(obj)/efi_stub_$(BITS).o: KBUILD_CLFAGS += -fshort-wchar -mno-red-zone | ||
480 | + | ||
481 | ifeq ($(CONFIG_EFI_STUB), y) | ||
482 | VMLINUX_OBJS += $(obj)/eboot.o $(obj)/efi_stub_$(BITS).o | ||
483 | endif | ||
484 | diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h | ||
485 | index 49afb3f..c3520d7 100644 | ||
486 | --- a/arch/x86/include/asm/pgtable.h | ||
487 | +++ b/arch/x86/include/asm/pgtable.h | ||
488 | @@ -146,8 +146,7 @@ static inline unsigned long pmd_pfn(pmd_t pmd) | ||
489 | |||
490 | static inline int pmd_large(pmd_t pte) | ||
491 | { | ||
492 | - return (pmd_flags(pte) & (_PAGE_PSE | _PAGE_PRESENT)) == | ||
493 | - (_PAGE_PSE | _PAGE_PRESENT); | ||
494 | + return pmd_flags(pte) & _PAGE_PSE; | ||
495 | } | ||
496 | |||
497 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE | ||
498 | @@ -415,7 +414,13 @@ static inline int pte_hidden(pte_t pte) | ||
499 | |||
500 | static inline int pmd_present(pmd_t pmd) | ||
501 | { | ||
502 | - return pmd_flags(pmd) & _PAGE_PRESENT; | ||
503 | + /* | ||
504 | + * Checking for _PAGE_PSE is needed too because | ||
505 | + * split_huge_page will temporarily clear the present bit (but | ||
506 | + * the _PAGE_PSE flag will remain set at all times while the | ||
507 | + * _PAGE_PRESENT bit is clear). | ||
508 | + */ | ||
509 | + return pmd_flags(pmd) & (_PAGE_PRESENT | _PAGE_PROTNONE | _PAGE_PSE); | ||
510 | } | ||
511 | |||
512 | static inline int pmd_none(pmd_t pmd) | ||
513 | diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c | ||
514 | index 92660eda..f55a4ce 100644 | ||
515 | --- a/arch/x86/platform/efi/efi.c | ||
516 | +++ b/arch/x86/platform/efi/efi.c | ||
517 | @@ -890,6 +890,7 @@ void __init efi_enter_virtual_mode(void) | ||
518 | * | ||
519 | * Call EFI services through wrapper functions. | ||
520 | */ | ||
521 | + efi.runtime_version = efi_systab.fw_revision; | ||
522 | efi.get_time = virt_efi_get_time; | ||
523 | efi.set_time = virt_efi_set_time; | ||
524 | efi.get_wakeup_time = virt_efi_get_wakeup_time; | ||
525 | diff --git a/arch/xtensa/kernel/process.c b/arch/xtensa/kernel/process.c | ||
526 | index 2c8d6a3..bc44311 100644 | ||
527 | --- a/arch/xtensa/kernel/process.c | ||
528 | +++ b/arch/xtensa/kernel/process.c | ||
529 | @@ -31,6 +31,7 @@ | ||
530 | #include <linux/mqueue.h> | ||
531 | #include <linux/fs.h> | ||
532 | #include <linux/slab.h> | ||
533 | +#include <linux/rcupdate.h> | ||
534 | |||
535 | #include <asm/pgtable.h> | ||
536 | #include <asm/uaccess.h> | ||
537 | @@ -110,8 +111,10 @@ void cpu_idle(void) | ||
538 | |||
539 | /* endless idle loop with no priority at all */ | ||
540 | while (1) { | ||
541 | + rcu_idle_enter(); | ||
542 | while (!need_resched()) | ||
543 | platform_idle(); | ||
544 | + rcu_idle_exit(); | ||
545 | schedule_preempt_disabled(); | ||
546 | } | ||
547 | } | ||
548 | diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c | ||
549 | index e059695..d59175e 100644 | ||
550 | --- a/drivers/acpi/bus.c | ||
551 | +++ b/drivers/acpi/bus.c | ||
552 | @@ -994,8 +994,6 @@ static int __init acpi_bus_init(void) | ||
553 | status = acpi_ec_ecdt_probe(); | ||
554 | /* Ignore result. Not having an ECDT is not fatal. */ | ||
555 | |||
556 | - acpi_bus_osc_support(); | ||
557 | - | ||
558 | status = acpi_initialize_objects(ACPI_FULL_INITIALIZATION); | ||
559 | if (ACPI_FAILURE(status)) { | ||
560 | printk(KERN_ERR PREFIX "Unable to initialize ACPI objects\n"); | ||
561 | @@ -1003,6 +1001,12 @@ static int __init acpi_bus_init(void) | ||
562 | } | ||
563 | |||
564 | /* | ||
565 | + * _OSC method may exist in module level code, | ||
566 | + * so it must be run after ACPI_FULL_INITIALIZATION | ||
567 | + */ | ||
568 | + acpi_bus_osc_support(); | ||
569 | + | ||
570 | + /* | ||
571 | * _PDC control method may load dynamic SSDT tables, | ||
572 | * and we need to install the table handler before that. | ||
573 | */ | ||
574 | diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c | ||
575 | index 0113adc..2700f2e 100644 | ||
576 | --- a/drivers/base/power/main.c | ||
577 | +++ b/drivers/base/power/main.c | ||
578 | @@ -996,7 +996,7 @@ int dpm_suspend_end(pm_message_t state) | ||
579 | |||
580 | error = dpm_suspend_noirq(state); | ||
581 | if (error) { | ||
582 | - dpm_resume_early(state); | ||
583 | + dpm_resume_early(resume_event(state)); | ||
584 | return error; | ||
585 | } | ||
586 | |||
587 | diff --git a/drivers/dma/dmaengine.c b/drivers/dma/dmaengine.c | ||
588 | index 3491654..a815d44 100644 | ||
589 | --- a/drivers/dma/dmaengine.c | ||
590 | +++ b/drivers/dma/dmaengine.c | ||
591 | @@ -582,7 +582,7 @@ void dmaengine_get(void) | ||
592 | list_del_rcu(&device->global_node); | ||
593 | break; | ||
594 | } else if (err) | ||
595 | - pr_err("%s: failed to get %s: (%d)\n", | ||
596 | + pr_debug("%s: failed to get %s: (%d)\n", | ||
597 | __func__, dma_chan_name(chan), err); | ||
598 | } | ||
599 | } | ||
600 | diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c | ||
601 | index 6fbfc24..af81f77 100644 | ||
602 | --- a/drivers/gpu/drm/drm_crtc.c | ||
603 | +++ b/drivers/gpu/drm/drm_crtc.c | ||
604 | @@ -1034,15 +1034,15 @@ void drm_mode_config_cleanup(struct drm_device *dev) | ||
605 | fb->funcs->destroy(fb); | ||
606 | } | ||
607 | |||
608 | - list_for_each_entry_safe(crtc, ct, &dev->mode_config.crtc_list, head) { | ||
609 | - crtc->funcs->destroy(crtc); | ||
610 | - } | ||
611 | - | ||
612 | list_for_each_entry_safe(plane, plt, &dev->mode_config.plane_list, | ||
613 | head) { | ||
614 | plane->funcs->destroy(plane); | ||
615 | } | ||
616 | |||
617 | + list_for_each_entry_safe(crtc, ct, &dev->mode_config.crtc_list, head) { | ||
618 | + crtc->funcs->destroy(crtc); | ||
619 | + } | ||
620 | + | ||
621 | idr_remove_all(&dev->mode_config.crtc_idr); | ||
622 | idr_destroy(&dev->mode_config.crtc_idr); | ||
623 | } | ||
624 | diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c | ||
625 | index 5249640..73fa3e1 100644 | ||
626 | --- a/drivers/gpu/drm/i915/i915_irq.c | ||
627 | +++ b/drivers/gpu/drm/i915/i915_irq.c | ||
628 | @@ -680,12 +680,12 @@ static irqreturn_t ivybridge_irq_handler(DRM_IRQ_ARGS) | ||
629 | intel_opregion_gse_intr(dev); | ||
630 | |||
631 | for (i = 0; i < 3; i++) { | ||
632 | + if (de_iir & (DE_PIPEA_VBLANK_IVB << (5 * i))) | ||
633 | + drm_handle_vblank(dev, i); | ||
634 | if (de_iir & (DE_PLANEA_FLIP_DONE_IVB << (5 * i))) { | ||
635 | intel_prepare_page_flip(dev, i); | ||
636 | intel_finish_page_flip_plane(dev, i); | ||
637 | } | ||
638 | - if (de_iir & (DE_PIPEA_VBLANK_IVB << (5 * i))) | ||
639 | - drm_handle_vblank(dev, i); | ||
640 | } | ||
641 | |||
642 | /* check event from PCH */ | ||
643 | @@ -767,6 +767,12 @@ static irqreturn_t ironlake_irq_handler(DRM_IRQ_ARGS) | ||
644 | if (de_iir & DE_GSE) | ||
645 | intel_opregion_gse_intr(dev); | ||
646 | |||
647 | + if (de_iir & DE_PIPEA_VBLANK) | ||
648 | + drm_handle_vblank(dev, 0); | ||
649 | + | ||
650 | + if (de_iir & DE_PIPEB_VBLANK) | ||
651 | + drm_handle_vblank(dev, 1); | ||
652 | + | ||
653 | if (de_iir & DE_PLANEA_FLIP_DONE) { | ||
654 | intel_prepare_page_flip(dev, 0); | ||
655 | intel_finish_page_flip_plane(dev, 0); | ||
656 | @@ -777,12 +783,6 @@ static irqreturn_t ironlake_irq_handler(DRM_IRQ_ARGS) | ||
657 | intel_finish_page_flip_plane(dev, 1); | ||
658 | } | ||
659 | |||
660 | - if (de_iir & DE_PIPEA_VBLANK) | ||
661 | - drm_handle_vblank(dev, 0); | ||
662 | - | ||
663 | - if (de_iir & DE_PIPEB_VBLANK) | ||
664 | - drm_handle_vblank(dev, 1); | ||
665 | - | ||
666 | /* check event from PCH */ | ||
667 | if (de_iir & DE_PCH_EVENT) { | ||
668 | if (pch_iir & hotplug_mask) | ||
669 | diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h | ||
670 | index 28725ce..a3e53c5 100644 | ||
671 | --- a/drivers/gpu/drm/i915/i915_reg.h | ||
672 | +++ b/drivers/gpu/drm/i915/i915_reg.h | ||
673 | @@ -519,6 +519,9 @@ | ||
674 | # define VS_TIMER_DISPATCH (1 << 6) | ||
675 | # define MI_FLUSH_ENABLE (1 << 12) | ||
676 | |||
677 | +#define GEN6_GT_MODE 0x20d0 | ||
678 | +#define GEN6_GT_MODE_HI (1 << 9) | ||
679 | + | ||
680 | #define GFX_MODE 0x02520 | ||
681 | #define GFX_MODE_GEN7 0x0229c | ||
682 | #define RING_MODE_GEN7(ring) ((ring)->mmio_base+0x29c) | ||
683 | @@ -1753,6 +1756,10 @@ | ||
684 | |||
685 | /* Video Data Island Packet control */ | ||
686 | #define VIDEO_DIP_DATA 0x61178 | ||
687 | +/* Read the description of VIDEO_DIP_DATA (before Haswel) or VIDEO_DIP_ECC | ||
688 | + * (Haswell and newer) to see which VIDEO_DIP_DATA byte corresponds to each byte | ||
689 | + * of the infoframe structure specified by CEA-861. */ | ||
690 | +#define VIDEO_DIP_DATA_SIZE 32 | ||
691 | #define VIDEO_DIP_CTL 0x61170 | ||
692 | /* Pre HSW: */ | ||
693 | #define VIDEO_DIP_ENABLE (1 << 31) | ||
694 | diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c | ||
695 | index c040aee..0c7f4aa 100644 | ||
696 | --- a/drivers/gpu/drm/i915/intel_display.c | ||
697 | +++ b/drivers/gpu/drm/i915/intel_display.c | ||
698 | @@ -2823,13 +2823,34 @@ static void ironlake_fdi_disable(struct drm_crtc *crtc) | ||
699 | udelay(100); | ||
700 | } | ||
701 | |||
702 | +static bool intel_crtc_has_pending_flip(struct drm_crtc *crtc) | ||
703 | +{ | ||
704 | + struct drm_device *dev = crtc->dev; | ||
705 | + struct drm_i915_private *dev_priv = dev->dev_private; | ||
706 | + unsigned long flags; | ||
707 | + bool pending; | ||
708 | + | ||
709 | + if (atomic_read(&dev_priv->mm.wedged)) | ||
710 | + return false; | ||
711 | + | ||
712 | + spin_lock_irqsave(&dev->event_lock, flags); | ||
713 | + pending = to_intel_crtc(crtc)->unpin_work != NULL; | ||
714 | + spin_unlock_irqrestore(&dev->event_lock, flags); | ||
715 | + | ||
716 | + return pending; | ||
717 | +} | ||
718 | + | ||
719 | static void intel_crtc_wait_for_pending_flips(struct drm_crtc *crtc) | ||
720 | { | ||
721 | struct drm_device *dev = crtc->dev; | ||
722 | + struct drm_i915_private *dev_priv = dev->dev_private; | ||
723 | |||
724 | if (crtc->fb == NULL) | ||
725 | return; | ||
726 | |||
727 | + wait_event(dev_priv->pending_flip_queue, | ||
728 | + !intel_crtc_has_pending_flip(crtc)); | ||
729 | + | ||
730 | mutex_lock(&dev->struct_mutex); | ||
731 | intel_finish_fb(crtc->fb); | ||
732 | mutex_unlock(&dev->struct_mutex); | ||
733 | @@ -6149,9 +6170,8 @@ static void do_intel_finish_page_flip(struct drm_device *dev, | ||
734 | |||
735 | atomic_clear_mask(1 << intel_crtc->plane, | ||
736 | &obj->pending_flip.counter); | ||
737 | - if (atomic_read(&obj->pending_flip) == 0) | ||
738 | - wake_up(&dev_priv->pending_flip_queue); | ||
739 | |||
740 | + wake_up(&dev_priv->pending_flip_queue); | ||
741 | schedule_work(&work->work); | ||
742 | |||
743 | trace_i915_flip_complete(intel_crtc->plane, work->pending_flip_obj); | ||
744 | @@ -6394,7 +6414,7 @@ static int intel_gen7_queue_flip(struct drm_device *dev, | ||
745 | default: | ||
746 | WARN_ONCE(1, "unknown plane in flip command\n"); | ||
747 | ret = -ENODEV; | ||
748 | - goto err; | ||
749 | + goto err_unpin; | ||
750 | } | ||
751 | |||
752 | ret = intel_ring_begin(ring, 4); | ||
753 | diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c | ||
754 | index 12dc330..34b6724 100644 | ||
755 | --- a/drivers/gpu/drm/i915/intel_hdmi.c | ||
756 | +++ b/drivers/gpu/drm/i915/intel_hdmi.c | ||
757 | @@ -151,6 +151,9 @@ static void g4x_write_infoframe(struct drm_encoder *encoder, | ||
758 | I915_WRITE(VIDEO_DIP_DATA, *data); | ||
759 | data++; | ||
760 | } | ||
761 | + /* Write every possible data byte to force correct ECC calculation. */ | ||
762 | + for (; i < VIDEO_DIP_DATA_SIZE; i += 4) | ||
763 | + I915_WRITE(VIDEO_DIP_DATA, 0); | ||
764 | mmiowb(); | ||
765 | |||
766 | val |= g4x_infoframe_enable(frame); | ||
767 | @@ -186,6 +189,9 @@ static void ibx_write_infoframe(struct drm_encoder *encoder, | ||
768 | I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data); | ||
769 | data++; | ||
770 | } | ||
771 | + /* Write every possible data byte to force correct ECC calculation. */ | ||
772 | + for (; i < VIDEO_DIP_DATA_SIZE; i += 4) | ||
773 | + I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), 0); | ||
774 | mmiowb(); | ||
775 | |||
776 | val |= g4x_infoframe_enable(frame); | ||
777 | @@ -224,6 +230,9 @@ static void cpt_write_infoframe(struct drm_encoder *encoder, | ||
778 | I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data); | ||
779 | data++; | ||
780 | } | ||
781 | + /* Write every possible data byte to force correct ECC calculation. */ | ||
782 | + for (; i < VIDEO_DIP_DATA_SIZE; i += 4) | ||
783 | + I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), 0); | ||
784 | mmiowb(); | ||
785 | |||
786 | val |= g4x_infoframe_enable(frame); | ||
787 | @@ -259,6 +268,9 @@ static void vlv_write_infoframe(struct drm_encoder *encoder, | ||
788 | I915_WRITE(VLV_TVIDEO_DIP_DATA(intel_crtc->pipe), *data); | ||
789 | data++; | ||
790 | } | ||
791 | + /* Write every possible data byte to force correct ECC calculation. */ | ||
792 | + for (; i < VIDEO_DIP_DATA_SIZE; i += 4) | ||
793 | + I915_WRITE(VLV_TVIDEO_DIP_DATA(intel_crtc->pipe), 0); | ||
794 | mmiowb(); | ||
795 | |||
796 | val |= g4x_infoframe_enable(frame); | ||
797 | @@ -292,6 +304,9 @@ static void hsw_write_infoframe(struct drm_encoder *encoder, | ||
798 | I915_WRITE(data_reg + i, *data); | ||
799 | data++; | ||
800 | } | ||
801 | + /* Write every possible data byte to force correct ECC calculation. */ | ||
802 | + for (; i < VIDEO_DIP_DATA_SIZE; i += 4) | ||
803 | + I915_WRITE(data_reg + i, 0); | ||
804 | mmiowb(); | ||
805 | |||
806 | val |= hsw_infoframe_enable(frame); | ||
807 | diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c | ||
808 | index ba8a27b..8c73fae 100644 | ||
809 | --- a/drivers/gpu/drm/i915/intel_pm.c | ||
810 | +++ b/drivers/gpu/drm/i915/intel_pm.c | ||
811 | @@ -3387,6 +3387,11 @@ static void gen6_init_clock_gating(struct drm_device *dev) | ||
812 | DISPPLANE_TRICKLE_FEED_DISABLE); | ||
813 | intel_flush_display_plane(dev_priv, pipe); | ||
814 | } | ||
815 | + | ||
816 | + /* The default value should be 0x200 according to docs, but the two | ||
817 | + * platforms I checked have a 0 for this. (Maybe BIOS overrides?) */ | ||
818 | + I915_WRITE(GEN6_GT_MODE, _MASKED_BIT_DISABLE(0xffff)); | ||
819 | + I915_WRITE(GEN6_GT_MODE, _MASKED_BIT_ENABLE(GEN6_GT_MODE_HI)); | ||
820 | } | ||
821 | |||
822 | static void gen7_setup_fixed_func_scheduler(struct drm_i915_private *dev_priv) | ||
823 | diff --git a/drivers/gpu/drm/nouveau/nvc0_fence.c b/drivers/gpu/drm/nouveau/nvc0_fence.c | ||
824 | index 47ab388..8e5a2f4 100644 | ||
825 | --- a/drivers/gpu/drm/nouveau/nvc0_fence.c | ||
826 | +++ b/drivers/gpu/drm/nouveau/nvc0_fence.c | ||
827 | @@ -32,6 +32,7 @@ | ||
828 | struct nvc0_fence_priv { | ||
829 | struct nouveau_fence_priv base; | ||
830 | struct nouveau_bo *bo; | ||
831 | + u32 *suspend; | ||
832 | }; | ||
833 | |||
834 | struct nvc0_fence_chan { | ||
835 | @@ -125,12 +126,36 @@ nvc0_fence_context_new(struct nouveau_channel *chan, int engine) | ||
836 | static int | ||
837 | nvc0_fence_fini(struct drm_device *dev, int engine, bool suspend) | ||
838 | { | ||
839 | + struct nouveau_fifo_priv *pfifo = nv_engine(dev, NVOBJ_ENGINE_FIFO); | ||
840 | + struct nvc0_fence_priv *priv = nv_engine(dev, engine); | ||
841 | + int i; | ||
842 | + | ||
843 | + if (suspend) { | ||
844 | + priv->suspend = vmalloc(pfifo->channels * sizeof(u32)); | ||
845 | + if (!priv->suspend) | ||
846 | + return -ENOMEM; | ||
847 | + | ||
848 | + for (i = 0; i < pfifo->channels; i++) | ||
849 | + priv->suspend[i] = nouveau_bo_rd32(priv->bo, i); | ||
850 | + } | ||
851 | + | ||
852 | return 0; | ||
853 | } | ||
854 | |||
855 | static int | ||
856 | nvc0_fence_init(struct drm_device *dev, int engine) | ||
857 | { | ||
858 | + struct nouveau_fifo_priv *pfifo = nv_engine(dev, NVOBJ_ENGINE_FIFO); | ||
859 | + struct nvc0_fence_priv *priv = nv_engine(dev, engine); | ||
860 | + int i; | ||
861 | + | ||
862 | + if (priv->suspend) { | ||
863 | + for (i = 0; i < pfifo->channels; i++) | ||
864 | + nouveau_bo_wr32(priv->bo, i, priv->suspend[i]); | ||
865 | + vfree(priv->suspend); | ||
866 | + priv->suspend = NULL; | ||
867 | + } | ||
868 | + | ||
869 | return 0; | ||
870 | } | ||
871 | |||
872 | diff --git a/drivers/gpu/drm/radeon/evergreen_cs.c b/drivers/gpu/drm/radeon/evergreen_cs.c | ||
873 | index e44a62a..d883b20 100644 | ||
874 | --- a/drivers/gpu/drm/radeon/evergreen_cs.c | ||
875 | +++ b/drivers/gpu/drm/radeon/evergreen_cs.c | ||
876 | @@ -846,6 +846,16 @@ static int evergreen_cs_track_validate_texture(struct radeon_cs_parser *p, | ||
877 | return -EINVAL; | ||
878 | } | ||
879 | |||
880 | + if (!mipmap) { | ||
881 | + if (llevel) { | ||
882 | + dev_warn(p->dev, "%s:%i got NULL MIP_ADDRESS relocation\n", | ||
883 | + __func__, __LINE__); | ||
884 | + return -EINVAL; | ||
885 | + } else { | ||
886 | + return 0; /* everything's ok */ | ||
887 | + } | ||
888 | + } | ||
889 | + | ||
890 | /* check mipmap size */ | ||
891 | for (i = 1; i <= llevel; i++) { | ||
892 | unsigned w, h, d; | ||
893 | @@ -1081,6 +1091,27 @@ static int evergreen_cs_packet_next_reloc(struct radeon_cs_parser *p, | ||
894 | } | ||
895 | |||
896 | /** | ||
897 | + * evergreen_cs_packet_next_is_pkt3_nop() - test if the next packet is NOP | ||
898 | + * @p: structure holding the parser context. | ||
899 | + * | ||
900 | + * Check if the next packet is a relocation packet3. | ||
901 | + **/ | ||
902 | +static bool evergreen_cs_packet_next_is_pkt3_nop(struct radeon_cs_parser *p) | ||
903 | +{ | ||
904 | + struct radeon_cs_packet p3reloc; | ||
905 | + int r; | ||
906 | + | ||
907 | + r = evergreen_cs_packet_parse(p, &p3reloc, p->idx); | ||
908 | + if (r) { | ||
909 | + return false; | ||
910 | + } | ||
911 | + if (p3reloc.type != PACKET_TYPE3 || p3reloc.opcode != PACKET3_NOP) { | ||
912 | + return false; | ||
913 | + } | ||
914 | + return true; | ||
915 | +} | ||
916 | + | ||
917 | +/** | ||
918 | * evergreen_cs_packet_next_vline() - parse userspace VLINE packet | ||
919 | * @parser: parser structure holding parsing context. | ||
920 | * | ||
921 | @@ -2330,7 +2361,7 @@ static int evergreen_packet3_check(struct radeon_cs_parser *p, | ||
922 | for (i = 0; i < (pkt->count / 8); i++) { | ||
923 | struct radeon_bo *texture, *mipmap; | ||
924 | u32 toffset, moffset; | ||
925 | - u32 size, offset; | ||
926 | + u32 size, offset, mip_address, tex_dim; | ||
927 | |||
928 | switch (G__SQ_CONSTANT_TYPE(radeon_get_ib_value(p, idx+1+(i*8)+7))) { | ||
929 | case SQ_TEX_VTX_VALID_TEXTURE: | ||
930 | @@ -2359,14 +2390,28 @@ static int evergreen_packet3_check(struct radeon_cs_parser *p, | ||
931 | } | ||
932 | texture = reloc->robj; | ||
933 | toffset = (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff); | ||
934 | + | ||
935 | /* tex mip base */ | ||
936 | - r = evergreen_cs_packet_next_reloc(p, &reloc); | ||
937 | - if (r) { | ||
938 | - DRM_ERROR("bad SET_RESOURCE (tex)\n"); | ||
939 | - return -EINVAL; | ||
940 | + tex_dim = ib[idx+1+(i*8)+0] & 0x7; | ||
941 | + mip_address = ib[idx+1+(i*8)+3]; | ||
942 | + | ||
943 | + if ((tex_dim == SQ_TEX_DIM_2D_MSAA || tex_dim == SQ_TEX_DIM_2D_ARRAY_MSAA) && | ||
944 | + !mip_address && | ||
945 | + !evergreen_cs_packet_next_is_pkt3_nop(p)) { | ||
946 | + /* MIP_ADDRESS should point to FMASK for an MSAA texture. | ||
947 | + * It should be 0 if FMASK is disabled. */ | ||
948 | + moffset = 0; | ||
949 | + mipmap = NULL; | ||
950 | + } else { | ||
951 | + r = evergreen_cs_packet_next_reloc(p, &reloc); | ||
952 | + if (r) { | ||
953 | + DRM_ERROR("bad SET_RESOURCE (tex)\n"); | ||
954 | + return -EINVAL; | ||
955 | + } | ||
956 | + moffset = (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff); | ||
957 | + mipmap = reloc->robj; | ||
958 | } | ||
959 | - moffset = (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff); | ||
960 | - mipmap = reloc->robj; | ||
961 | + | ||
962 | r = evergreen_cs_track_validate_texture(p, texture, mipmap, idx+1+(i*8)); | ||
963 | if (r) | ||
964 | return r; | ||
965 | diff --git a/drivers/gpu/drm/radeon/r600_cs.c b/drivers/gpu/drm/radeon/r600_cs.c | ||
966 | index f37676d..dfa2448 100644 | ||
967 | --- a/drivers/gpu/drm/radeon/r600_cs.c | ||
968 | +++ b/drivers/gpu/drm/radeon/r600_cs.c | ||
969 | @@ -2180,7 +2180,8 @@ static int r600_packet3_check(struct radeon_cs_parser *p, | ||
970 | } | ||
971 | break; | ||
972 | case PACKET3_STRMOUT_BASE_UPDATE: | ||
973 | - if (p->family < CHIP_RV770) { | ||
974 | + /* RS780 and RS880 also need this */ | ||
975 | + if (p->family < CHIP_RS780) { | ||
976 | DRM_ERROR("STRMOUT_BASE_UPDATE only supported on 7xx\n"); | ||
977 | return -EINVAL; | ||
978 | } | ||
979 | diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c | ||
980 | index 8c593ea..27ece75 100644 | ||
981 | --- a/drivers/gpu/drm/radeon/radeon_drv.c | ||
982 | +++ b/drivers/gpu/drm/radeon/radeon_drv.c | ||
983 | @@ -64,9 +64,11 @@ | ||
984 | * 2.20.0 - r600-si: RADEON_INFO_TIMESTAMP query | ||
985 | * 2.21.0 - r600-r700: FMASK and CMASK | ||
986 | * 2.22.0 - r600 only: RESOLVE_BOX allowed | ||
987 | + * 2.23.0 - allow STRMOUT_BASE_UPDATE on RS780 and RS880 | ||
988 | + * 2.24.0 - eg only: allow MIP_ADDRESS=0 for MSAA textures | ||
989 | */ | ||
990 | #define KMS_DRIVER_MAJOR 2 | ||
991 | -#define KMS_DRIVER_MINOR 22 | ||
992 | +#define KMS_DRIVER_MINOR 24 | ||
993 | #define KMS_DRIVER_PATCHLEVEL 0 | ||
994 | int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags); | ||
995 | int radeon_driver_unload_kms(struct drm_device *dev); | ||
996 | diff --git a/drivers/gpu/drm/radeon/radeon_irq_kms.c b/drivers/gpu/drm/radeon/radeon_irq_kms.c | ||
997 | index afaa172..443bd49 100644 | ||
998 | --- a/drivers/gpu/drm/radeon/radeon_irq_kms.c | ||
999 | +++ b/drivers/gpu/drm/radeon/radeon_irq_kms.c | ||
1000 | @@ -204,6 +204,16 @@ static bool radeon_msi_ok(struct radeon_device *rdev) | ||
1001 | (rdev->pdev->subsystem_device == 0x01fd)) | ||
1002 | return true; | ||
1003 | |||
1004 | + /* Gateway RS690 only seems to work with MSIs. */ | ||
1005 | + if ((rdev->pdev->device == 0x791f) && | ||
1006 | + (rdev->pdev->subsystem_vendor == 0x107b) && | ||
1007 | + (rdev->pdev->subsystem_device == 0x0185)) | ||
1008 | + return true; | ||
1009 | + | ||
1010 | + /* try and enable MSIs by default on all RS690s */ | ||
1011 | + if (rdev->family == CHIP_RS690) | ||
1012 | + return true; | ||
1013 | + | ||
1014 | /* RV515 seems to have MSI issues where it loses | ||
1015 | * MSI rearms occasionally. This leads to lockups and freezes. | ||
1016 | * disable it by default. | ||
1017 | diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c | ||
1018 | index 7ae6066..395d7e0 100644 | ||
1019 | --- a/drivers/gpu/drm/radeon/radeon_pm.c | ||
1020 | +++ b/drivers/gpu/drm/radeon/radeon_pm.c | ||
1021 | @@ -547,7 +547,9 @@ void radeon_pm_suspend(struct radeon_device *rdev) | ||
1022 | void radeon_pm_resume(struct radeon_device *rdev) | ||
1023 | { | ||
1024 | /* set up the default clocks if the MC ucode is loaded */ | ||
1025 | - if (ASIC_IS_DCE5(rdev) && rdev->mc_fw) { | ||
1026 | + if ((rdev->family >= CHIP_BARTS) && | ||
1027 | + (rdev->family <= CHIP_CAYMAN) && | ||
1028 | + rdev->mc_fw) { | ||
1029 | if (rdev->pm.default_vddc) | ||
1030 | radeon_atom_set_voltage(rdev, rdev->pm.default_vddc, | ||
1031 | SET_VOLTAGE_TYPE_ASIC_VDDC); | ||
1032 | @@ -602,7 +604,9 @@ int radeon_pm_init(struct radeon_device *rdev) | ||
1033 | radeon_pm_print_states(rdev); | ||
1034 | radeon_pm_init_profile(rdev); | ||
1035 | /* set up the default clocks if the MC ucode is loaded */ | ||
1036 | - if (ASIC_IS_DCE5(rdev) && rdev->mc_fw) { | ||
1037 | + if ((rdev->family >= CHIP_BARTS) && | ||
1038 | + (rdev->family <= CHIP_CAYMAN) && | ||
1039 | + rdev->mc_fw) { | ||
1040 | if (rdev->pm.default_vddc) | ||
1041 | radeon_atom_set_voltage(rdev, rdev->pm.default_vddc, | ||
1042 | SET_VOLTAGE_TYPE_ASIC_VDDC); | ||
1043 | diff --git a/drivers/gpu/drm/savage/savage_bci.c b/drivers/gpu/drm/savage/savage_bci.c | ||
1044 | index 1efbb90..c89aef4 100644 | ||
1045 | --- a/drivers/gpu/drm/savage/savage_bci.c | ||
1046 | +++ b/drivers/gpu/drm/savage/savage_bci.c | ||
1047 | @@ -547,6 +547,8 @@ int savage_driver_load(struct drm_device *dev, unsigned long chipset) | ||
1048 | |||
1049 | dev_priv->chipset = (enum savage_family)chipset; | ||
1050 | |||
1051 | + pci_set_master(dev->pdev); | ||
1052 | + | ||
1053 | return 0; | ||
1054 | } | ||
1055 | |||
1056 | diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c | ||
1057 | index 3b6f7bf..c46c5f1 100644 | ||
1058 | --- a/drivers/hid/hidraw.c | ||
1059 | +++ b/drivers/hid/hidraw.c | ||
1060 | @@ -42,6 +42,7 @@ static struct cdev hidraw_cdev; | ||
1061 | static struct class *hidraw_class; | ||
1062 | static struct hidraw *hidraw_table[HIDRAW_MAX_DEVICES]; | ||
1063 | static DEFINE_MUTEX(minors_lock); | ||
1064 | +static void drop_ref(struct hidraw *hid, int exists_bit); | ||
1065 | |||
1066 | static ssize_t hidraw_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos) | ||
1067 | { | ||
1068 | @@ -113,7 +114,7 @@ static ssize_t hidraw_send_report(struct file *file, const char __user *buffer, | ||
1069 | __u8 *buf; | ||
1070 | int ret = 0; | ||
1071 | |||
1072 | - if (!hidraw_table[minor]) { | ||
1073 | + if (!hidraw_table[minor] || !hidraw_table[minor]->exist) { | ||
1074 | ret = -ENODEV; | ||
1075 | goto out; | ||
1076 | } | ||
1077 | @@ -261,7 +262,7 @@ static int hidraw_open(struct inode *inode, struct file *file) | ||
1078 | } | ||
1079 | |||
1080 | mutex_lock(&minors_lock); | ||
1081 | - if (!hidraw_table[minor]) { | ||
1082 | + if (!hidraw_table[minor] || !hidraw_table[minor]->exist) { | ||
1083 | err = -ENODEV; | ||
1084 | goto out_unlock; | ||
1085 | } | ||
1086 | @@ -298,36 +299,12 @@ out: | ||
1087 | static int hidraw_release(struct inode * inode, struct file * file) | ||
1088 | { | ||
1089 | unsigned int minor = iminor(inode); | ||
1090 | - struct hidraw *dev; | ||
1091 | struct hidraw_list *list = file->private_data; | ||
1092 | - int ret; | ||
1093 | - int i; | ||
1094 | - | ||
1095 | - mutex_lock(&minors_lock); | ||
1096 | - if (!hidraw_table[minor]) { | ||
1097 | - ret = -ENODEV; | ||
1098 | - goto unlock; | ||
1099 | - } | ||
1100 | |||
1101 | + drop_ref(hidraw_table[minor], 0); | ||
1102 | list_del(&list->node); | ||
1103 | - dev = hidraw_table[minor]; | ||
1104 | - if (!--dev->open) { | ||
1105 | - if (list->hidraw->exist) { | ||
1106 | - hid_hw_power(dev->hid, PM_HINT_NORMAL); | ||
1107 | - hid_hw_close(dev->hid); | ||
1108 | - } else { | ||
1109 | - kfree(list->hidraw); | ||
1110 | - } | ||
1111 | - } | ||
1112 | - | ||
1113 | - for (i = 0; i < HIDRAW_BUFFER_SIZE; ++i) | ||
1114 | - kfree(list->buffer[i].value); | ||
1115 | kfree(list); | ||
1116 | - ret = 0; | ||
1117 | -unlock: | ||
1118 | - mutex_unlock(&minors_lock); | ||
1119 | - | ||
1120 | - return ret; | ||
1121 | + return 0; | ||
1122 | } | ||
1123 | |||
1124 | static long hidraw_ioctl(struct file *file, unsigned int cmd, | ||
1125 | @@ -529,21 +506,7 @@ EXPORT_SYMBOL_GPL(hidraw_connect); | ||
1126 | void hidraw_disconnect(struct hid_device *hid) | ||
1127 | { | ||
1128 | struct hidraw *hidraw = hid->hidraw; | ||
1129 | - | ||
1130 | - mutex_lock(&minors_lock); | ||
1131 | - hidraw->exist = 0; | ||
1132 | - | ||
1133 | - device_destroy(hidraw_class, MKDEV(hidraw_major, hidraw->minor)); | ||
1134 | - | ||
1135 | - hidraw_table[hidraw->minor] = NULL; | ||
1136 | - | ||
1137 | - if (hidraw->open) { | ||
1138 | - hid_hw_close(hid); | ||
1139 | - wake_up_interruptible(&hidraw->wait); | ||
1140 | - } else { | ||
1141 | - kfree(hidraw); | ||
1142 | - } | ||
1143 | - mutex_unlock(&minors_lock); | ||
1144 | + drop_ref(hidraw, 1); | ||
1145 | } | ||
1146 | EXPORT_SYMBOL_GPL(hidraw_disconnect); | ||
1147 | |||
1148 | @@ -585,3 +548,23 @@ void hidraw_exit(void) | ||
1149 | unregister_chrdev_region(dev_id, HIDRAW_MAX_DEVICES); | ||
1150 | |||
1151 | } | ||
1152 | + | ||
1153 | +static void drop_ref(struct hidraw *hidraw, int exists_bit) | ||
1154 | +{ | ||
1155 | + mutex_lock(&minors_lock); | ||
1156 | + if (exists_bit) { | ||
1157 | + hid_hw_close(hidraw->hid); | ||
1158 | + hidraw->exist = 0; | ||
1159 | + if (hidraw->open) | ||
1160 | + wake_up_interruptible(&hidraw->wait); | ||
1161 | + } else { | ||
1162 | + --hidraw->open; | ||
1163 | + } | ||
1164 | + | ||
1165 | + if (!hidraw->open && !hidraw->exist) { | ||
1166 | + device_destroy(hidraw_class, MKDEV(hidraw_major, hidraw->minor)); | ||
1167 | + hidraw_table[hidraw->minor] = NULL; | ||
1168 | + kfree(hidraw); | ||
1169 | + } | ||
1170 | + mutex_unlock(&minors_lock); | ||
1171 | +} | ||
1172 | diff --git a/drivers/i2c/busses/i2c-piix4.c b/drivers/i2c/busses/i2c-piix4.c | ||
1173 | index ef511df..8bbd6ec 100644 | ||
1174 | --- a/drivers/i2c/busses/i2c-piix4.c | ||
1175 | +++ b/drivers/i2c/busses/i2c-piix4.c | ||
1176 | @@ -37,6 +37,7 @@ | ||
1177 | #include <linux/stddef.h> | ||
1178 | #include <linux/ioport.h> | ||
1179 | #include <linux/i2c.h> | ||
1180 | +#include <linux/slab.h> | ||
1181 | #include <linux/init.h> | ||
1182 | #include <linux/dmi.h> | ||
1183 | #include <linux/acpi.h> | ||
1184 | diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c | ||
1185 | index 2297ec1..cb9e114 100644 | ||
1186 | --- a/drivers/iommu/intel-iommu.c | ||
1187 | +++ b/drivers/iommu/intel-iommu.c | ||
1188 | @@ -589,7 +589,9 @@ static void domain_update_iommu_coherency(struct dmar_domain *domain) | ||
1189 | { | ||
1190 | int i; | ||
1191 | |||
1192 | - domain->iommu_coherency = 1; | ||
1193 | + i = find_first_bit(domain->iommu_bmp, g_num_of_iommus); | ||
1194 | + | ||
1195 | + domain->iommu_coherency = i < g_num_of_iommus ? 1 : 0; | ||
1196 | |||
1197 | for_each_set_bit(i, domain->iommu_bmp, g_num_of_iommus) { | ||
1198 | if (!ecap_coherent(g_iommus[i]->ecap)) { | ||
1199 | diff --git a/drivers/media/dvb/frontends/drxk.h b/drivers/media/dvb/frontends/drxk.h | ||
1200 | index d615d7d..94fecfb 100644 | ||
1201 | --- a/drivers/media/dvb/frontends/drxk.h | ||
1202 | +++ b/drivers/media/dvb/frontends/drxk.h | ||
1203 | @@ -28,6 +28,7 @@ | ||
1204 | * A value of 0 (default) or lower indicates that | ||
1205 | * the correct number of parameters will be | ||
1206 | * automatically detected. | ||
1207 | + * @load_firmware_sync: Force the firmware load to be synchronous. | ||
1208 | * | ||
1209 | * On the *_gpio vars, bit 0 is UIO-1, bit 1 is UIO-2 and bit 2 is | ||
1210 | * UIO-3. | ||
1211 | @@ -39,6 +40,7 @@ struct drxk_config { | ||
1212 | bool parallel_ts; | ||
1213 | bool dynamic_clk; | ||
1214 | bool enable_merr_cfg; | ||
1215 | + bool load_firmware_sync; | ||
1216 | |||
1217 | bool antenna_dvbt; | ||
1218 | u16 antenna_gpio; | ||
1219 | diff --git a/drivers/media/dvb/frontends/drxk_hard.c b/drivers/media/dvb/frontends/drxk_hard.c | ||
1220 | index 1ab8154..8b4c6d5 100644 | ||
1221 | --- a/drivers/media/dvb/frontends/drxk_hard.c | ||
1222 | +++ b/drivers/media/dvb/frontends/drxk_hard.c | ||
1223 | @@ -6609,15 +6609,25 @@ struct dvb_frontend *drxk_attach(const struct drxk_config *config, | ||
1224 | |||
1225 | /* Load firmware and initialize DRX-K */ | ||
1226 | if (state->microcode_name) { | ||
1227 | - status = request_firmware_nowait(THIS_MODULE, 1, | ||
1228 | + if (config->load_firmware_sync) { | ||
1229 | + const struct firmware *fw = NULL; | ||
1230 | + | ||
1231 | + status = request_firmware(&fw, state->microcode_name, | ||
1232 | + state->i2c->dev.parent); | ||
1233 | + if (status < 0) | ||
1234 | + fw = NULL; | ||
1235 | + load_firmware_cb(fw, state); | ||
1236 | + } else { | ||
1237 | + status = request_firmware_nowait(THIS_MODULE, 1, | ||
1238 | state->microcode_name, | ||
1239 | state->i2c->dev.parent, | ||
1240 | GFP_KERNEL, | ||
1241 | state, load_firmware_cb); | ||
1242 | - if (status < 0) { | ||
1243 | - printk(KERN_ERR | ||
1244 | - "drxk: failed to request a firmware\n"); | ||
1245 | - return NULL; | ||
1246 | + if (status < 0) { | ||
1247 | + printk(KERN_ERR | ||
1248 | + "drxk: failed to request a firmware\n"); | ||
1249 | + return NULL; | ||
1250 | + } | ||
1251 | } | ||
1252 | } else if (init_drxk(state) < 0) | ||
1253 | goto error; | ||
1254 | diff --git a/drivers/media/rc/ite-cir.c b/drivers/media/rc/ite-cir.c | ||
1255 | index 36fe5a3..24c77a4 100644 | ||
1256 | --- a/drivers/media/rc/ite-cir.c | ||
1257 | +++ b/drivers/media/rc/ite-cir.c | ||
1258 | @@ -1473,6 +1473,7 @@ static int ite_probe(struct pnp_dev *pdev, const struct pnp_device_id | ||
1259 | rdev = rc_allocate_device(); | ||
1260 | if (!rdev) | ||
1261 | goto failure; | ||
1262 | + itdev->rdev = rdev; | ||
1263 | |||
1264 | ret = -ENODEV; | ||
1265 | |||
1266 | @@ -1604,7 +1605,6 @@ static int ite_probe(struct pnp_dev *pdev, const struct pnp_device_id | ||
1267 | if (ret) | ||
1268 | goto failure3; | ||
1269 | |||
1270 | - itdev->rdev = rdev; | ||
1271 | ite_pr(KERN_NOTICE, "driver has been successfully loaded\n"); | ||
1272 | |||
1273 | return 0; | ||
1274 | diff --git a/drivers/media/video/em28xx/em28xx-cards.c b/drivers/media/video/em28xx/em28xx-cards.c | ||
1275 | index ca62b99..ab98d08 100644 | ||
1276 | --- a/drivers/media/video/em28xx/em28xx-cards.c | ||
1277 | +++ b/drivers/media/video/em28xx/em28xx-cards.c | ||
1278 | @@ -2875,12 +2875,20 @@ static void em28xx_card_setup(struct em28xx *dev) | ||
1279 | } | ||
1280 | |||
1281 | |||
1282 | -#if defined(CONFIG_MODULES) && defined(MODULE) | ||
1283 | static void request_module_async(struct work_struct *work) | ||
1284 | { | ||
1285 | struct em28xx *dev = container_of(work, | ||
1286 | struct em28xx, request_module_wk); | ||
1287 | |||
1288 | + /* | ||
1289 | + * The em28xx extensions can be modules or builtin. If the | ||
1290 | + * modules are already loaded or are built in, those extensions | ||
1291 | + * can be initialised right now. Otherwise, the module init | ||
1292 | + * code will do it. | ||
1293 | + */ | ||
1294 | + em28xx_init_extension(dev); | ||
1295 | + | ||
1296 | +#if defined(CONFIG_MODULES) && defined(MODULE) | ||
1297 | if (dev->has_audio_class) | ||
1298 | request_module("snd-usb-audio"); | ||
1299 | else if (dev->has_alsa_audio) | ||
1300 | @@ -2890,6 +2898,7 @@ static void request_module_async(struct work_struct *work) | ||
1301 | request_module("em28xx-dvb"); | ||
1302 | if (dev->board.ir_codes && !disable_ir) | ||
1303 | request_module("em28xx-rc"); | ||
1304 | +#endif /* CONFIG_MODULES */ | ||
1305 | } | ||
1306 | |||
1307 | static void request_modules(struct em28xx *dev) | ||
1308 | @@ -2902,10 +2911,6 @@ static void flush_request_modules(struct em28xx *dev) | ||
1309 | { | ||
1310 | flush_work_sync(&dev->request_module_wk); | ||
1311 | } | ||
1312 | -#else | ||
1313 | -#define request_modules(dev) | ||
1314 | -#define flush_request_modules(dev) | ||
1315 | -#endif /* CONFIG_MODULES */ | ||
1316 | |||
1317 | /* | ||
1318 | * em28xx_release_resources() | ||
1319 | @@ -3324,13 +3329,6 @@ static int em28xx_usb_probe(struct usb_interface *interface, | ||
1320 | */ | ||
1321 | mutex_unlock(&dev->lock); | ||
1322 | |||
1323 | - /* | ||
1324 | - * These extensions can be modules. If the modules are already | ||
1325 | - * loaded then we can initialise the device now, otherwise we | ||
1326 | - * will initialise it when the modules load instead. | ||
1327 | - */ | ||
1328 | - em28xx_init_extension(dev); | ||
1329 | - | ||
1330 | return 0; | ||
1331 | |||
1332 | unlock_and_free: | ||
1333 | diff --git a/drivers/media/video/em28xx/em28xx-dvb.c b/drivers/media/video/em28xx/em28xx-dvb.c | ||
1334 | index a16531f..7353143 100644 | ||
1335 | --- a/drivers/media/video/em28xx/em28xx-dvb.c | ||
1336 | +++ b/drivers/media/video/em28xx/em28xx-dvb.c | ||
1337 | @@ -316,6 +316,7 @@ static struct drxk_config terratec_h5_drxk = { | ||
1338 | .no_i2c_bridge = 1, | ||
1339 | .microcode_name = "dvb-usb-terratec-h5-drxk.fw", | ||
1340 | .qam_demod_parameter_count = 2, | ||
1341 | + .load_firmware_sync = true, | ||
1342 | }; | ||
1343 | |||
1344 | static struct drxk_config hauppauge_930c_drxk = { | ||
1345 | @@ -325,6 +326,7 @@ static struct drxk_config hauppauge_930c_drxk = { | ||
1346 | .microcode_name = "dvb-usb-hauppauge-hvr930c-drxk.fw", | ||
1347 | .chunk_size = 56, | ||
1348 | .qam_demod_parameter_count = 2, | ||
1349 | + .load_firmware_sync = true, | ||
1350 | }; | ||
1351 | |||
1352 | struct drxk_config terratec_htc_stick_drxk = { | ||
1353 | @@ -338,12 +340,14 @@ struct drxk_config terratec_htc_stick_drxk = { | ||
1354 | .antenna_dvbt = true, | ||
1355 | /* The windows driver uses the same. This will disable LNA. */ | ||
1356 | .antenna_gpio = 0x6, | ||
1357 | + .load_firmware_sync = true, | ||
1358 | }; | ||
1359 | |||
1360 | static struct drxk_config maxmedia_ub425_tc_drxk = { | ||
1361 | .adr = 0x29, | ||
1362 | .single_master = 1, | ||
1363 | .no_i2c_bridge = 1, | ||
1364 | + .load_firmware_sync = true, | ||
1365 | }; | ||
1366 | |||
1367 | static struct drxk_config pctv_520e_drxk = { | ||
1368 | @@ -354,6 +358,7 @@ static struct drxk_config pctv_520e_drxk = { | ||
1369 | .chunk_size = 58, | ||
1370 | .antenna_dvbt = true, /* disable LNA */ | ||
1371 | .antenna_gpio = (1 << 2), /* disable LNA */ | ||
1372 | + .load_firmware_sync = true, | ||
1373 | }; | ||
1374 | |||
1375 | static int drxk_gate_ctrl(struct dvb_frontend *fe, int enable) | ||
1376 | diff --git a/drivers/media/video/gspca/pac7302.c b/drivers/media/video/gspca/pac7302.c | ||
1377 | index 4877f7a..eb3c90e4 100644 | ||
1378 | --- a/drivers/media/video/gspca/pac7302.c | ||
1379 | +++ b/drivers/media/video/gspca/pac7302.c | ||
1380 | @@ -616,7 +616,7 @@ static int sd_init_controls(struct gspca_dev *gspca_dev) | ||
1381 | sd->red_balance = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, | ||
1382 | V4L2_CID_RED_BALANCE, 0, 3, 1, 1); | ||
1383 | sd->blue_balance = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, | ||
1384 | - V4L2_CID_RED_BALANCE, 0, 3, 1, 1); | ||
1385 | + V4L2_CID_BLUE_BALANCE, 0, 3, 1, 1); | ||
1386 | |||
1387 | gspca_dev->autogain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, | ||
1388 | V4L2_CID_AUTOGAIN, 0, 1, 1, 1); | ||
1389 | @@ -905,6 +905,7 @@ static const struct usb_device_id device_table[] = { | ||
1390 | {USB_DEVICE(0x093a, 0x262a)}, | ||
1391 | {USB_DEVICE(0x093a, 0x262c)}, | ||
1392 | {USB_DEVICE(0x145f, 0x013c)}, | ||
1393 | + {USB_DEVICE(0x1ae7, 0x2001)}, /* SpeedLink Snappy Mic SL-6825-SBK */ | ||
1394 | {} | ||
1395 | }; | ||
1396 | MODULE_DEVICE_TABLE(usb, device_table); | ||
1397 | diff --git a/drivers/mfd/88pm860x-core.c b/drivers/mfd/88pm860x-core.c | ||
1398 | index b73f033..81ba655 100644 | ||
1399 | --- a/drivers/mfd/88pm860x-core.c | ||
1400 | +++ b/drivers/mfd/88pm860x-core.c | ||
1401 | @@ -21,40 +21,73 @@ | ||
1402 | |||
1403 | #define INT_STATUS_NUM 3 | ||
1404 | |||
1405 | +static struct resource io_parent = { | ||
1406 | + .start = 0, | ||
1407 | + .end = 0xffffffff, | ||
1408 | + .flags = IORESOURCE_IO, | ||
1409 | +}; | ||
1410 | + | ||
1411 | static struct resource bk_resources[] __devinitdata = { | ||
1412 | - {PM8606_BACKLIGHT1, PM8606_BACKLIGHT1, "backlight-0", IORESOURCE_IO,}, | ||
1413 | - {PM8606_BACKLIGHT2, PM8606_BACKLIGHT2, "backlight-1", IORESOURCE_IO,}, | ||
1414 | - {PM8606_BACKLIGHT3, PM8606_BACKLIGHT3, "backlight-2", IORESOURCE_IO,}, | ||
1415 | + {PM8606_BACKLIGHT1, PM8606_BACKLIGHT1, "backlight-0", IORESOURCE_IO, | ||
1416 | + &io_parent,}, | ||
1417 | + {PM8606_BACKLIGHT2, PM8606_BACKLIGHT2, "backlight-1", IORESOURCE_IO, | ||
1418 | + &io_parent,}, | ||
1419 | + {PM8606_BACKLIGHT3, PM8606_BACKLIGHT3, "backlight-2", IORESOURCE_IO, | ||
1420 | + &io_parent,}, | ||
1421 | }; | ||
1422 | |||
1423 | static struct resource led_resources[] __devinitdata = { | ||
1424 | - {PM8606_LED1_RED, PM8606_LED1_RED, "led0-red", IORESOURCE_IO,}, | ||
1425 | - {PM8606_LED1_GREEN, PM8606_LED1_GREEN, "led0-green", IORESOURCE_IO,}, | ||
1426 | - {PM8606_LED1_BLUE, PM8606_LED1_BLUE, "led0-blue", IORESOURCE_IO,}, | ||
1427 | - {PM8606_LED2_RED, PM8606_LED2_RED, "led1-red", IORESOURCE_IO,}, | ||
1428 | - {PM8606_LED2_GREEN, PM8606_LED2_GREEN, "led1-green", IORESOURCE_IO,}, | ||
1429 | - {PM8606_LED2_BLUE, PM8606_LED2_BLUE, "led1-blue", IORESOURCE_IO,}, | ||
1430 | + {PM8606_LED1_RED, PM8606_LED1_RED, "led0-red", IORESOURCE_IO, | ||
1431 | + &io_parent,}, | ||
1432 | + {PM8606_LED1_GREEN, PM8606_LED1_GREEN, "led0-green", IORESOURCE_IO, | ||
1433 | + &io_parent,}, | ||
1434 | + {PM8606_LED1_BLUE, PM8606_LED1_BLUE, "led0-blue", IORESOURCE_IO, | ||
1435 | + &io_parent,}, | ||
1436 | + {PM8606_LED2_RED, PM8606_LED2_RED, "led1-red", IORESOURCE_IO, | ||
1437 | + &io_parent,}, | ||
1438 | + {PM8606_LED2_GREEN, PM8606_LED2_GREEN, "led1-green", IORESOURCE_IO, | ||
1439 | + &io_parent,}, | ||
1440 | + {PM8606_LED2_BLUE, PM8606_LED2_BLUE, "led1-blue", IORESOURCE_IO, | ||
1441 | + &io_parent,}, | ||
1442 | }; | ||
1443 | |||
1444 | static struct resource regulator_resources[] __devinitdata = { | ||
1445 | - {PM8607_ID_BUCK1, PM8607_ID_BUCK1, "buck-1", IORESOURCE_IO,}, | ||
1446 | - {PM8607_ID_BUCK2, PM8607_ID_BUCK2, "buck-2", IORESOURCE_IO,}, | ||
1447 | - {PM8607_ID_BUCK3, PM8607_ID_BUCK3, "buck-3", IORESOURCE_IO,}, | ||
1448 | - {PM8607_ID_LDO1, PM8607_ID_LDO1, "ldo-01", IORESOURCE_IO,}, | ||
1449 | - {PM8607_ID_LDO2, PM8607_ID_LDO2, "ldo-02", IORESOURCE_IO,}, | ||
1450 | - {PM8607_ID_LDO3, PM8607_ID_LDO3, "ldo-03", IORESOURCE_IO,}, | ||
1451 | - {PM8607_ID_LDO4, PM8607_ID_LDO4, "ldo-04", IORESOURCE_IO,}, | ||
1452 | - {PM8607_ID_LDO5, PM8607_ID_LDO5, "ldo-05", IORESOURCE_IO,}, | ||
1453 | - {PM8607_ID_LDO6, PM8607_ID_LDO6, "ldo-06", IORESOURCE_IO,}, | ||
1454 | - {PM8607_ID_LDO7, PM8607_ID_LDO7, "ldo-07", IORESOURCE_IO,}, | ||
1455 | - {PM8607_ID_LDO8, PM8607_ID_LDO8, "ldo-08", IORESOURCE_IO,}, | ||
1456 | - {PM8607_ID_LDO9, PM8607_ID_LDO9, "ldo-09", IORESOURCE_IO,}, | ||
1457 | - {PM8607_ID_LDO10, PM8607_ID_LDO10, "ldo-10", IORESOURCE_IO,}, | ||
1458 | - {PM8607_ID_LDO11, PM8607_ID_LDO11, "ldo-11", IORESOURCE_IO,}, | ||
1459 | - {PM8607_ID_LDO12, PM8607_ID_LDO12, "ldo-12", IORESOURCE_IO,}, | ||
1460 | - {PM8607_ID_LDO13, PM8607_ID_LDO13, "ldo-13", IORESOURCE_IO,}, | ||
1461 | - {PM8607_ID_LDO14, PM8607_ID_LDO14, "ldo-14", IORESOURCE_IO,}, | ||
1462 | - {PM8607_ID_LDO15, PM8607_ID_LDO15, "ldo-15", IORESOURCE_IO,}, | ||
1463 | + {PM8607_ID_BUCK1, PM8607_ID_BUCK1, "buck-1", IORESOURCE_IO, | ||
1464 | + &io_parent,}, | ||
1465 | + {PM8607_ID_BUCK2, PM8607_ID_BUCK2, "buck-2", IORESOURCE_IO, | ||
1466 | + &io_parent,}, | ||
1467 | + {PM8607_ID_BUCK3, PM8607_ID_BUCK3, "buck-3", IORESOURCE_IO, | ||
1468 | + &io_parent,}, | ||
1469 | + {PM8607_ID_LDO1, PM8607_ID_LDO1, "ldo-01", IORESOURCE_IO, | ||
1470 | + &io_parent,}, | ||
1471 | + {PM8607_ID_LDO2, PM8607_ID_LDO2, "ldo-02", IORESOURCE_IO, | ||
1472 | + &io_parent,}, | ||
1473 | + {PM8607_ID_LDO3, PM8607_ID_LDO3, "ldo-03", IORESOURCE_IO, | ||
1474 | + &io_parent,}, | ||
1475 | + {PM8607_ID_LDO4, PM8607_ID_LDO4, "ldo-04", IORESOURCE_IO, | ||
1476 | + &io_parent,}, | ||
1477 | + {PM8607_ID_LDO5, PM8607_ID_LDO5, "ldo-05", IORESOURCE_IO, | ||
1478 | + &io_parent,}, | ||
1479 | + {PM8607_ID_LDO6, PM8607_ID_LDO6, "ldo-06", IORESOURCE_IO, | ||
1480 | + &io_parent,}, | ||
1481 | + {PM8607_ID_LDO7, PM8607_ID_LDO7, "ldo-07", IORESOURCE_IO, | ||
1482 | + &io_parent,}, | ||
1483 | + {PM8607_ID_LDO8, PM8607_ID_LDO8, "ldo-08", IORESOURCE_IO, | ||
1484 | + &io_parent,}, | ||
1485 | + {PM8607_ID_LDO9, PM8607_ID_LDO9, "ldo-09", IORESOURCE_IO, | ||
1486 | + &io_parent,}, | ||
1487 | + {PM8607_ID_LDO10, PM8607_ID_LDO10, "ldo-10", IORESOURCE_IO, | ||
1488 | + &io_parent,}, | ||
1489 | + {PM8607_ID_LDO11, PM8607_ID_LDO11, "ldo-11", IORESOURCE_IO, | ||
1490 | + &io_parent,}, | ||
1491 | + {PM8607_ID_LDO12, PM8607_ID_LDO12, "ldo-12", IORESOURCE_IO, | ||
1492 | + &io_parent,}, | ||
1493 | + {PM8607_ID_LDO13, PM8607_ID_LDO13, "ldo-13", IORESOURCE_IO, | ||
1494 | + &io_parent,}, | ||
1495 | + {PM8607_ID_LDO14, PM8607_ID_LDO14, "ldo-14", IORESOURCE_IO, | ||
1496 | + &io_parent,}, | ||
1497 | + {PM8607_ID_LDO15, PM8607_ID_LDO15, "ldo-15", IORESOURCE_IO, | ||
1498 | + &io_parent,}, | ||
1499 | }; | ||
1500 | |||
1501 | static struct resource touch_resources[] __devinitdata = { | ||
1502 | @@ -91,11 +124,12 @@ static struct resource charger_resources[] __devinitdata = { | ||
1503 | }; | ||
1504 | |||
1505 | static struct resource preg_resources[] __devinitdata = { | ||
1506 | - {PM8606_ID_PREG, PM8606_ID_PREG, "preg", IORESOURCE_IO,}, | ||
1507 | + {PM8606_ID_PREG, PM8606_ID_PREG, "preg", IORESOURCE_IO, | ||
1508 | + &io_parent,}, | ||
1509 | }; | ||
1510 | |||
1511 | static struct resource rtc_resources[] __devinitdata = { | ||
1512 | - {PM8607_IRQ_RTC, PM8607_IRQ_RTC, "rtc", IORESOURCE_IRQ,}, | ||
1513 | + {PM8607_IRQ_RTC, PM8607_IRQ_RTC, "rtc", IORESOURCE_IRQ, &io_parent,}, | ||
1514 | }; | ||
1515 | |||
1516 | static struct mfd_cell bk_devs[] = { | ||
1517 | diff --git a/drivers/mfd/max8925-core.c b/drivers/mfd/max8925-core.c | ||
1518 | index ee53757..66d08a7 100644 | ||
1519 | --- a/drivers/mfd/max8925-core.c | ||
1520 | +++ b/drivers/mfd/max8925-core.c | ||
1521 | @@ -18,12 +18,19 @@ | ||
1522 | #include <linux/mfd/core.h> | ||
1523 | #include <linux/mfd/max8925.h> | ||
1524 | |||
1525 | +static struct resource io_parent = { | ||
1526 | + .start = 0, | ||
1527 | + .end = 0xffffffff, | ||
1528 | + .flags = IORESOURCE_IO, | ||
1529 | +}; | ||
1530 | + | ||
1531 | static struct resource backlight_resources[] = { | ||
1532 | { | ||
1533 | .name = "max8925-backlight", | ||
1534 | .start = MAX8925_WLED_MODE_CNTL, | ||
1535 | .end = MAX8925_WLED_CNTL, | ||
1536 | .flags = IORESOURCE_IO, | ||
1537 | + .parent = &io_parent, | ||
1538 | }, | ||
1539 | }; | ||
1540 | |||
1541 | @@ -42,6 +49,7 @@ static struct resource touch_resources[] = { | ||
1542 | .start = MAX8925_TSC_IRQ, | ||
1543 | .end = MAX8925_ADC_RES_END, | ||
1544 | .flags = IORESOURCE_IO, | ||
1545 | + .parent = &io_parent, | ||
1546 | }, | ||
1547 | }; | ||
1548 | |||
1549 | @@ -60,6 +68,7 @@ static struct resource power_supply_resources[] = { | ||
1550 | .start = MAX8925_CHG_IRQ1, | ||
1551 | .end = MAX8925_CHG_IRQ1_MASK, | ||
1552 | .flags = IORESOURCE_IO, | ||
1553 | + .parent = &io_parent, | ||
1554 | }, | ||
1555 | }; | ||
1556 | |||
1557 | @@ -118,6 +127,7 @@ static struct mfd_cell onkey_devs[] = { | ||
1558 | .start = MAX8925_##_start, \ | ||
1559 | .end = MAX8925_##_end, \ | ||
1560 | .flags = IORESOURCE_IO, \ | ||
1561 | + .parent = &io_parent, \ | ||
1562 | } | ||
1563 | |||
1564 | static struct resource regulator_resources[] = { | ||
1565 | diff --git a/drivers/mmc/core/slot-gpio.c b/drivers/mmc/core/slot-gpio.c | ||
1566 | index 0582429..08c6b3d 100644 | ||
1567 | --- a/drivers/mmc/core/slot-gpio.c | ||
1568 | +++ b/drivers/mmc/core/slot-gpio.c | ||
1569 | @@ -100,7 +100,13 @@ int mmc_gpio_request_ro(struct mmc_host *host, unsigned int gpio) | ||
1570 | |||
1571 | ctx = host->slot.handler_priv; | ||
1572 | |||
1573 | - return gpio_request_one(gpio, GPIOF_DIR_IN, ctx->ro_label); | ||
1574 | + ret = gpio_request_one(gpio, GPIOF_DIR_IN, ctx->ro_label); | ||
1575 | + if (ret < 0) | ||
1576 | + return ret; | ||
1577 | + | ||
1578 | + ctx->ro_gpio = gpio; | ||
1579 | + | ||
1580 | + return 0; | ||
1581 | } | ||
1582 | EXPORT_SYMBOL(mmc_gpio_request_ro); | ||
1583 | |||
1584 | diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c | ||
1585 | index 3a09f93..ed4945c 100644 | ||
1586 | --- a/drivers/mmc/host/omap_hsmmc.c | ||
1587 | +++ b/drivers/mmc/host/omap_hsmmc.c | ||
1588 | @@ -2106,8 +2106,7 @@ static int omap_hsmmc_suspend(struct device *dev) | ||
1589 | if (ret) { | ||
1590 | host->suspended = 0; | ||
1591 | if (host->pdata->resume) { | ||
1592 | - ret = host->pdata->resume(dev, host->slot_id); | ||
1593 | - if (ret) | ||
1594 | + if (host->pdata->resume(dev, host->slot_id)) | ||
1595 | dev_dbg(dev, "Unmask interrupt failed\n"); | ||
1596 | } | ||
1597 | goto err; | ||
1598 | diff --git a/drivers/mmc/host/sh_mmcif.c b/drivers/mmc/host/sh_mmcif.c | ||
1599 | index 5d81427..ba0e493 100644 | ||
1600 | --- a/drivers/mmc/host/sh_mmcif.c | ||
1601 | +++ b/drivers/mmc/host/sh_mmcif.c | ||
1602 | @@ -1229,6 +1229,10 @@ static irqreturn_t sh_mmcif_intr(int irq, void *dev_id) | ||
1603 | host->sd_error = true; | ||
1604 | dev_dbg(&host->pd->dev, "int err state = %08x\n", state); | ||
1605 | } | ||
1606 | + if (host->state == STATE_IDLE) { | ||
1607 | + dev_info(&host->pd->dev, "Spurious IRQ status 0x%x", state); | ||
1608 | + return IRQ_HANDLED; | ||
1609 | + } | ||
1610 | if (state & ~(INT_CMD12RBE | INT_CMD12CRE)) { | ||
1611 | if (!host->dma_active) | ||
1612 | return IRQ_WAKE_THREAD; | ||
1613 | diff --git a/drivers/mtd/maps/autcpu12-nvram.c b/drivers/mtd/maps/autcpu12-nvram.c | ||
1614 | index e5bfd0e..0598d52 100644 | ||
1615 | --- a/drivers/mtd/maps/autcpu12-nvram.c | ||
1616 | +++ b/drivers/mtd/maps/autcpu12-nvram.c | ||
1617 | @@ -43,7 +43,8 @@ struct map_info autcpu12_sram_map = { | ||
1618 | |||
1619 | static int __init init_autcpu12_sram (void) | ||
1620 | { | ||
1621 | - int err, save0, save1; | ||
1622 | + map_word tmp, save0, save1; | ||
1623 | + int err; | ||
1624 | |||
1625 | autcpu12_sram_map.virt = ioremap(0x12000000, SZ_128K); | ||
1626 | if (!autcpu12_sram_map.virt) { | ||
1627 | @@ -51,7 +52,7 @@ static int __init init_autcpu12_sram (void) | ||
1628 | err = -EIO; | ||
1629 | goto out; | ||
1630 | } | ||
1631 | - simple_map_init(&autcpu_sram_map); | ||
1632 | + simple_map_init(&autcpu12_sram_map); | ||
1633 | |||
1634 | /* | ||
1635 | * Check for 32K/128K | ||
1636 | @@ -61,20 +62,22 @@ static int __init init_autcpu12_sram (void) | ||
1637 | * Read and check result on ofs 0x0 | ||
1638 | * Restore contents | ||
1639 | */ | ||
1640 | - save0 = map_read32(&autcpu12_sram_map,0); | ||
1641 | - save1 = map_read32(&autcpu12_sram_map,0x10000); | ||
1642 | - map_write32(&autcpu12_sram_map,~save0,0x10000); | ||
1643 | + save0 = map_read(&autcpu12_sram_map, 0); | ||
1644 | + save1 = map_read(&autcpu12_sram_map, 0x10000); | ||
1645 | + tmp.x[0] = ~save0.x[0]; | ||
1646 | + map_write(&autcpu12_sram_map, tmp, 0x10000); | ||
1647 | /* if we find this pattern on 0x0, we have 32K size | ||
1648 | * restore contents and exit | ||
1649 | */ | ||
1650 | - if ( map_read32(&autcpu12_sram_map,0) != save0) { | ||
1651 | - map_write32(&autcpu12_sram_map,save0,0x0); | ||
1652 | + tmp = map_read(&autcpu12_sram_map, 0); | ||
1653 | + if (!map_word_equal(&autcpu12_sram_map, tmp, save0)) { | ||
1654 | + map_write(&autcpu12_sram_map, save0, 0x0); | ||
1655 | goto map; | ||
1656 | } | ||
1657 | /* We have a 128K found, restore 0x10000 and set size | ||
1658 | * to 128K | ||
1659 | */ | ||
1660 | - map_write32(&autcpu12_sram_map,save1,0x10000); | ||
1661 | + map_write(&autcpu12_sram_map, save1, 0x10000); | ||
1662 | autcpu12_sram_map.size = SZ_128K; | ||
1663 | |||
1664 | map: | ||
1665 | diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c | ||
1666 | index d518e4d..f8c08ec 100644 | ||
1667 | --- a/drivers/mtd/mtdpart.c | ||
1668 | +++ b/drivers/mtd/mtdpart.c | ||
1669 | @@ -711,6 +711,8 @@ static const char *default_mtd_part_types[] = { | ||
1670 | * partition parsers, specified in @types. However, if @types is %NULL, then | ||
1671 | * the default list of parsers is used. The default list contains only the | ||
1672 | * "cmdlinepart" and "ofpart" parsers ATM. | ||
1673 | + * Note: If there are more then one parser in @types, the kernel only takes the | ||
1674 | + * partitions parsed out by the first parser. | ||
1675 | * | ||
1676 | * This function may return: | ||
1677 | * o a negative error code in case of failure | ||
1678 | @@ -735,11 +737,12 @@ int parse_mtd_partitions(struct mtd_info *master, const char **types, | ||
1679 | if (!parser) | ||
1680 | continue; | ||
1681 | ret = (*parser->parse_fn)(master, pparts, data); | ||
1682 | + put_partition_parser(parser); | ||
1683 | if (ret > 0) { | ||
1684 | printk(KERN_NOTICE "%d %s partitions found on MTD device %s\n", | ||
1685 | ret, parser->name, master->name); | ||
1686 | + break; | ||
1687 | } | ||
1688 | - put_partition_parser(parser); | ||
1689 | } | ||
1690 | return ret; | ||
1691 | } | ||
1692 | diff --git a/drivers/mtd/nand/nand_bbt.c b/drivers/mtd/nand/nand_bbt.c | ||
1693 | index 30d1319..c126469 100644 | ||
1694 | --- a/drivers/mtd/nand/nand_bbt.c | ||
1695 | +++ b/drivers/mtd/nand/nand_bbt.c | ||
1696 | @@ -390,7 +390,7 @@ static int read_abs_bbts(struct mtd_info *mtd, uint8_t *buf, | ||
1697 | /* Read the mirror version, if available */ | ||
1698 | if (md && (md->options & NAND_BBT_VERSION)) { | ||
1699 | scan_read_raw(mtd, buf, (loff_t)md->pages[0] << this->page_shift, | ||
1700 | - mtd->writesize, td); | ||
1701 | + mtd->writesize, md); | ||
1702 | md->version[0] = buf[bbt_get_ver_offs(mtd, md)]; | ||
1703 | pr_info("Bad block table at page %d, version 0x%02X\n", | ||
1704 | md->pages[0], md->version[0]); | ||
1705 | diff --git a/drivers/mtd/nand/nandsim.c b/drivers/mtd/nand/nandsim.c | ||
1706 | index cf0cd31..5d881180 100644 | ||
1707 | --- a/drivers/mtd/nand/nandsim.c | ||
1708 | +++ b/drivers/mtd/nand/nandsim.c | ||
1709 | @@ -2333,6 +2333,7 @@ static int __init ns_init_module(void) | ||
1710 | uint64_t new_size = (uint64_t)nsmtd->erasesize << overridesize; | ||
1711 | if (new_size >> overridesize != nsmtd->erasesize) { | ||
1712 | NS_ERR("overridesize is too big\n"); | ||
1713 | + retval = -EINVAL; | ||
1714 | goto err_exit; | ||
1715 | } | ||
1716 | /* N.B. This relies on nand_scan not doing anything with the size before we change it */ | ||
1717 | diff --git a/drivers/mtd/nand/omap2.c b/drivers/mtd/nand/omap2.c | ||
1718 | index ac4fd75..48f1d4e 100644 | ||
1719 | --- a/drivers/mtd/nand/omap2.c | ||
1720 | +++ b/drivers/mtd/nand/omap2.c | ||
1721 | @@ -1387,7 +1387,8 @@ static int omap_nand_remove(struct platform_device *pdev) | ||
1722 | /* Release NAND device, its internal structures and partitions */ | ||
1723 | nand_release(&info->mtd); | ||
1724 | iounmap(info->nand.IO_ADDR_R); | ||
1725 | - kfree(&info->mtd); | ||
1726 | + release_mem_region(info->phys_base, NAND_IO_SIZE); | ||
1727 | + kfree(info); | ||
1728 | return 0; | ||
1729 | } | ||
1730 | |||
1731 | diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c | ||
1732 | index 4104ea25..56b20d1 100644 | ||
1733 | --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c | ||
1734 | +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c | ||
1735 | @@ -2690,10 +2690,7 @@ static int ixgbe_get_ts_info(struct net_device *dev, | ||
1736 | (1 << HWTSTAMP_FILTER_NONE) | | ||
1737 | (1 << HWTSTAMP_FILTER_PTP_V1_L4_SYNC) | | ||
1738 | (1 << HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ) | | ||
1739 | - (1 << HWTSTAMP_FILTER_PTP_V2_SYNC) | | ||
1740 | - (1 << HWTSTAMP_FILTER_PTP_V2_DELAY_REQ) | | ||
1741 | - (1 << HWTSTAMP_FILTER_PTP_V2_EVENT) | | ||
1742 | - (1 << HWTSTAMP_FILTER_SOME); | ||
1743 | + (1 << HWTSTAMP_FILTER_PTP_V2_EVENT); | ||
1744 | break; | ||
1745 | #endif /* CONFIG_IXGBE_PTP */ | ||
1746 | default: | ||
1747 | diff --git a/drivers/net/ethernet/ti/davinci_cpdma.c b/drivers/net/ethernet/ti/davinci_cpdma.c | ||
1748 | index d15c888..4995673 100644 | ||
1749 | --- a/drivers/net/ethernet/ti/davinci_cpdma.c | ||
1750 | +++ b/drivers/net/ethernet/ti/davinci_cpdma.c | ||
1751 | @@ -863,6 +863,7 @@ int cpdma_chan_stop(struct cpdma_chan *chan) | ||
1752 | |||
1753 | next_dma = desc_read(desc, hw_next); | ||
1754 | chan->head = desc_from_phys(pool, next_dma); | ||
1755 | + chan->count--; | ||
1756 | chan->stats.teardown_dequeue++; | ||
1757 | |||
1758 | /* issue callback without locks held */ | ||
1759 | diff --git a/drivers/net/rionet.c b/drivers/net/rionet.c | ||
1760 | index 91d2588..1470d3e 100644 | ||
1761 | --- a/drivers/net/rionet.c | ||
1762 | +++ b/drivers/net/rionet.c | ||
1763 | @@ -79,6 +79,7 @@ static int rionet_capable = 1; | ||
1764 | * on system trade-offs. | ||
1765 | */ | ||
1766 | static struct rio_dev **rionet_active; | ||
1767 | +static int nact; /* total number of active rionet peers */ | ||
1768 | |||
1769 | #define is_rionet_capable(src_ops, dst_ops) \ | ||
1770 | ((src_ops & RIO_SRC_OPS_DATA_MSG) && \ | ||
1771 | @@ -175,6 +176,7 @@ static int rionet_start_xmit(struct sk_buff *skb, struct net_device *ndev) | ||
1772 | struct ethhdr *eth = (struct ethhdr *)skb->data; | ||
1773 | u16 destid; | ||
1774 | unsigned long flags; | ||
1775 | + int add_num = 1; | ||
1776 | |||
1777 | local_irq_save(flags); | ||
1778 | if (!spin_trylock(&rnet->tx_lock)) { | ||
1779 | @@ -182,7 +184,10 @@ static int rionet_start_xmit(struct sk_buff *skb, struct net_device *ndev) | ||
1780 | return NETDEV_TX_LOCKED; | ||
1781 | } | ||
1782 | |||
1783 | - if ((rnet->tx_cnt + 1) > RIONET_TX_RING_SIZE) { | ||
1784 | + if (is_multicast_ether_addr(eth->h_dest)) | ||
1785 | + add_num = nact; | ||
1786 | + | ||
1787 | + if ((rnet->tx_cnt + add_num) > RIONET_TX_RING_SIZE) { | ||
1788 | netif_stop_queue(ndev); | ||
1789 | spin_unlock_irqrestore(&rnet->tx_lock, flags); | ||
1790 | printk(KERN_ERR "%s: BUG! Tx Ring full when queue awake!\n", | ||
1791 | @@ -191,11 +196,16 @@ static int rionet_start_xmit(struct sk_buff *skb, struct net_device *ndev) | ||
1792 | } | ||
1793 | |||
1794 | if (is_multicast_ether_addr(eth->h_dest)) { | ||
1795 | + int count = 0; | ||
1796 | for (i = 0; i < RIO_MAX_ROUTE_ENTRIES(rnet->mport->sys_size); | ||
1797 | i++) | ||
1798 | - if (rionet_active[i]) | ||
1799 | + if (rionet_active[i]) { | ||
1800 | rionet_queue_tx_msg(skb, ndev, | ||
1801 | rionet_active[i]); | ||
1802 | + if (count) | ||
1803 | + atomic_inc(&skb->users); | ||
1804 | + count++; | ||
1805 | + } | ||
1806 | } else if (RIONET_MAC_MATCH(eth->h_dest)) { | ||
1807 | destid = RIONET_GET_DESTID(eth->h_dest); | ||
1808 | if (rionet_active[destid]) | ||
1809 | @@ -220,14 +230,17 @@ static void rionet_dbell_event(struct rio_mport *mport, void *dev_id, u16 sid, u | ||
1810 | if (info == RIONET_DOORBELL_JOIN) { | ||
1811 | if (!rionet_active[sid]) { | ||
1812 | list_for_each_entry(peer, &rionet_peers, node) { | ||
1813 | - if (peer->rdev->destid == sid) | ||
1814 | + if (peer->rdev->destid == sid) { | ||
1815 | rionet_active[sid] = peer->rdev; | ||
1816 | + nact++; | ||
1817 | + } | ||
1818 | } | ||
1819 | rio_mport_send_doorbell(mport, sid, | ||
1820 | RIONET_DOORBELL_JOIN); | ||
1821 | } | ||
1822 | } else if (info == RIONET_DOORBELL_LEAVE) { | ||
1823 | rionet_active[sid] = NULL; | ||
1824 | + nact--; | ||
1825 | } else { | ||
1826 | if (netif_msg_intr(rnet)) | ||
1827 | printk(KERN_WARNING "%s: unhandled doorbell\n", | ||
1828 | @@ -523,6 +536,7 @@ static int rionet_probe(struct rio_dev *rdev, const struct rio_device_id *id) | ||
1829 | |||
1830 | rc = rionet_setup_netdev(rdev->net->hport, ndev); | ||
1831 | rionet_check = 1; | ||
1832 | + nact = 0; | ||
1833 | } | ||
1834 | |||
1835 | /* | ||
1836 | diff --git a/drivers/net/usb/asix_devices.c b/drivers/net/usb/asix_devices.c | ||
1837 | index 32e31c5..f778aa0 100644 | ||
1838 | --- a/drivers/net/usb/asix_devices.c | ||
1839 | +++ b/drivers/net/usb/asix_devices.c | ||
1840 | @@ -930,6 +930,10 @@ static const struct usb_device_id products [] = { | ||
1841 | USB_DEVICE (0x04f1, 0x3008), | ||
1842 | .driver_info = (unsigned long) &ax8817x_info, | ||
1843 | }, { | ||
1844 | + // Lenovo U2L100P 10/100 | ||
1845 | + USB_DEVICE (0x17ef, 0x7203), | ||
1846 | + .driver_info = (unsigned long) &ax88772_info, | ||
1847 | +}, { | ||
1848 | // ASIX AX88772B 10/100 | ||
1849 | USB_DEVICE (0x0b95, 0x772b), | ||
1850 | .driver_info = (unsigned long) &ax88772_info, | ||
1851 | diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c | ||
1852 | index 9f8a6b7..61859d0 100644 | ||
1853 | --- a/drivers/pci/probe.c | ||
1854 | +++ b/drivers/pci/probe.c | ||
1855 | @@ -729,8 +729,10 @@ int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev *dev, int max, | ||
1856 | |||
1857 | /* Check if setup is sensible at all */ | ||
1858 | if (!pass && | ||
1859 | - (primary != bus->number || secondary <= bus->number)) { | ||
1860 | - dev_dbg(&dev->dev, "bus configuration invalid, reconfiguring\n"); | ||
1861 | + (primary != bus->number || secondary <= bus->number || | ||
1862 | + secondary > subordinate)) { | ||
1863 | + dev_info(&dev->dev, "bridge configuration invalid ([bus %02x-%02x]), reconfiguring\n", | ||
1864 | + secondary, subordinate); | ||
1865 | broken = 1; | ||
1866 | } | ||
1867 | |||
1868 | diff --git a/drivers/s390/scsi/zfcp_aux.c b/drivers/s390/scsi/zfcp_aux.c | ||
1869 | index aff8621..f6adde4 100644 | ||
1870 | --- a/drivers/s390/scsi/zfcp_aux.c | ||
1871 | +++ b/drivers/s390/scsi/zfcp_aux.c | ||
1872 | @@ -519,6 +519,7 @@ struct zfcp_port *zfcp_port_enqueue(struct zfcp_adapter *adapter, u64 wwpn, | ||
1873 | |||
1874 | rwlock_init(&port->unit_list_lock); | ||
1875 | INIT_LIST_HEAD(&port->unit_list); | ||
1876 | + atomic_set(&port->units, 0); | ||
1877 | |||
1878 | INIT_WORK(&port->gid_pn_work, zfcp_fc_port_did_lookup); | ||
1879 | INIT_WORK(&port->test_link_work, zfcp_fc_link_test_work); | ||
1880 | diff --git a/drivers/s390/scsi/zfcp_ccw.c b/drivers/s390/scsi/zfcp_ccw.c | ||
1881 | index e37f045..9646766 100644 | ||
1882 | --- a/drivers/s390/scsi/zfcp_ccw.c | ||
1883 | +++ b/drivers/s390/scsi/zfcp_ccw.c | ||
1884 | @@ -39,17 +39,23 @@ void zfcp_ccw_adapter_put(struct zfcp_adapter *adapter) | ||
1885 | spin_unlock_irqrestore(&zfcp_ccw_adapter_ref_lock, flags); | ||
1886 | } | ||
1887 | |||
1888 | -static int zfcp_ccw_activate(struct ccw_device *cdev) | ||
1889 | - | ||
1890 | +/** | ||
1891 | + * zfcp_ccw_activate - activate adapter and wait for it to finish | ||
1892 | + * @cdev: pointer to belonging ccw device | ||
1893 | + * @clear: Status flags to clear. | ||
1894 | + * @tag: s390dbf trace record tag | ||
1895 | + */ | ||
1896 | +static int zfcp_ccw_activate(struct ccw_device *cdev, int clear, char *tag) | ||
1897 | { | ||
1898 | struct zfcp_adapter *adapter = zfcp_ccw_adapter_by_cdev(cdev); | ||
1899 | |||
1900 | if (!adapter) | ||
1901 | return 0; | ||
1902 | |||
1903 | + zfcp_erp_clear_adapter_status(adapter, clear); | ||
1904 | zfcp_erp_set_adapter_status(adapter, ZFCP_STATUS_COMMON_RUNNING); | ||
1905 | zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED, | ||
1906 | - "ccresu2"); | ||
1907 | + tag); | ||
1908 | zfcp_erp_wait(adapter); | ||
1909 | flush_work(&adapter->scan_work); | ||
1910 | |||
1911 | @@ -164,26 +170,29 @@ static int zfcp_ccw_set_online(struct ccw_device *cdev) | ||
1912 | BUG_ON(!zfcp_reqlist_isempty(adapter->req_list)); | ||
1913 | adapter->req_no = 0; | ||
1914 | |||
1915 | - zfcp_ccw_activate(cdev); | ||
1916 | + zfcp_ccw_activate(cdev, 0, "ccsonl1"); | ||
1917 | zfcp_ccw_adapter_put(adapter); | ||
1918 | return 0; | ||
1919 | } | ||
1920 | |||
1921 | /** | ||
1922 | - * zfcp_ccw_set_offline - set_offline function of zfcp driver | ||
1923 | + * zfcp_ccw_offline_sync - shut down adapter and wait for it to finish | ||
1924 | * @cdev: pointer to belonging ccw device | ||
1925 | + * @set: Status flags to set. | ||
1926 | + * @tag: s390dbf trace record tag | ||
1927 | * | ||
1928 | * This function gets called by the common i/o layer and sets an adapter | ||
1929 | * into state offline. | ||
1930 | */ | ||
1931 | -static int zfcp_ccw_set_offline(struct ccw_device *cdev) | ||
1932 | +static int zfcp_ccw_offline_sync(struct ccw_device *cdev, int set, char *tag) | ||
1933 | { | ||
1934 | struct zfcp_adapter *adapter = zfcp_ccw_adapter_by_cdev(cdev); | ||
1935 | |||
1936 | if (!adapter) | ||
1937 | return 0; | ||
1938 | |||
1939 | - zfcp_erp_adapter_shutdown(adapter, 0, "ccsoff1"); | ||
1940 | + zfcp_erp_set_adapter_status(adapter, set); | ||
1941 | + zfcp_erp_adapter_shutdown(adapter, 0, tag); | ||
1942 | zfcp_erp_wait(adapter); | ||
1943 | |||
1944 | zfcp_ccw_adapter_put(adapter); | ||
1945 | @@ -191,6 +200,18 @@ static int zfcp_ccw_set_offline(struct ccw_device *cdev) | ||
1946 | } | ||
1947 | |||
1948 | /** | ||
1949 | + * zfcp_ccw_set_offline - set_offline function of zfcp driver | ||
1950 | + * @cdev: pointer to belonging ccw device | ||
1951 | + * | ||
1952 | + * This function gets called by the common i/o layer and sets an adapter | ||
1953 | + * into state offline. | ||
1954 | + */ | ||
1955 | +static int zfcp_ccw_set_offline(struct ccw_device *cdev) | ||
1956 | +{ | ||
1957 | + return zfcp_ccw_offline_sync(cdev, 0, "ccsoff1"); | ||
1958 | +} | ||
1959 | + | ||
1960 | +/** | ||
1961 | * zfcp_ccw_notify - ccw notify function | ||
1962 | * @cdev: pointer to belonging ccw device | ||
1963 | * @event: indicates if adapter was detached or attached | ||
1964 | @@ -207,6 +228,11 @@ static int zfcp_ccw_notify(struct ccw_device *cdev, int event) | ||
1965 | |||
1966 | switch (event) { | ||
1967 | case CIO_GONE: | ||
1968 | + if (atomic_read(&adapter->status) & | ||
1969 | + ZFCP_STATUS_ADAPTER_SUSPENDED) { /* notification ignore */ | ||
1970 | + zfcp_dbf_hba_basic("ccnigo1", adapter); | ||
1971 | + break; | ||
1972 | + } | ||
1973 | dev_warn(&cdev->dev, "The FCP device has been detached\n"); | ||
1974 | zfcp_erp_adapter_shutdown(adapter, 0, "ccnoti1"); | ||
1975 | break; | ||
1976 | @@ -216,6 +242,11 @@ static int zfcp_ccw_notify(struct ccw_device *cdev, int event) | ||
1977 | zfcp_erp_adapter_shutdown(adapter, 0, "ccnoti2"); | ||
1978 | break; | ||
1979 | case CIO_OPER: | ||
1980 | + if (atomic_read(&adapter->status) & | ||
1981 | + ZFCP_STATUS_ADAPTER_SUSPENDED) { /* notification ignore */ | ||
1982 | + zfcp_dbf_hba_basic("ccniop1", adapter); | ||
1983 | + break; | ||
1984 | + } | ||
1985 | dev_info(&cdev->dev, "The FCP device is operational again\n"); | ||
1986 | zfcp_erp_set_adapter_status(adapter, | ||
1987 | ZFCP_STATUS_COMMON_RUNNING); | ||
1988 | @@ -251,6 +282,28 @@ static void zfcp_ccw_shutdown(struct ccw_device *cdev) | ||
1989 | zfcp_ccw_adapter_put(adapter); | ||
1990 | } | ||
1991 | |||
1992 | +static int zfcp_ccw_suspend(struct ccw_device *cdev) | ||
1993 | +{ | ||
1994 | + zfcp_ccw_offline_sync(cdev, ZFCP_STATUS_ADAPTER_SUSPENDED, "ccsusp1"); | ||
1995 | + return 0; | ||
1996 | +} | ||
1997 | + | ||
1998 | +static int zfcp_ccw_thaw(struct ccw_device *cdev) | ||
1999 | +{ | ||
2000 | + /* trace records for thaw and final shutdown during suspend | ||
2001 | + can only be found in system dump until the end of suspend | ||
2002 | + but not after resume because it's based on the memory image | ||
2003 | + right after the very first suspend (freeze) callback */ | ||
2004 | + zfcp_ccw_activate(cdev, 0, "ccthaw1"); | ||
2005 | + return 0; | ||
2006 | +} | ||
2007 | + | ||
2008 | +static int zfcp_ccw_resume(struct ccw_device *cdev) | ||
2009 | +{ | ||
2010 | + zfcp_ccw_activate(cdev, ZFCP_STATUS_ADAPTER_SUSPENDED, "ccresu1"); | ||
2011 | + return 0; | ||
2012 | +} | ||
2013 | + | ||
2014 | struct ccw_driver zfcp_ccw_driver = { | ||
2015 | .driver = { | ||
2016 | .owner = THIS_MODULE, | ||
2017 | @@ -263,7 +316,7 @@ struct ccw_driver zfcp_ccw_driver = { | ||
2018 | .set_offline = zfcp_ccw_set_offline, | ||
2019 | .notify = zfcp_ccw_notify, | ||
2020 | .shutdown = zfcp_ccw_shutdown, | ||
2021 | - .freeze = zfcp_ccw_set_offline, | ||
2022 | - .thaw = zfcp_ccw_activate, | ||
2023 | - .restore = zfcp_ccw_activate, | ||
2024 | + .freeze = zfcp_ccw_suspend, | ||
2025 | + .thaw = zfcp_ccw_thaw, | ||
2026 | + .restore = zfcp_ccw_resume, | ||
2027 | }; | ||
2028 | diff --git a/drivers/s390/scsi/zfcp_cfdc.c b/drivers/s390/scsi/zfcp_cfdc.c | ||
2029 | index fbd8b4d..49b82e4 100644 | ||
2030 | --- a/drivers/s390/scsi/zfcp_cfdc.c | ||
2031 | +++ b/drivers/s390/scsi/zfcp_cfdc.c | ||
2032 | @@ -293,7 +293,7 @@ void zfcp_cfdc_adapter_access_changed(struct zfcp_adapter *adapter) | ||
2033 | } | ||
2034 | read_unlock_irqrestore(&adapter->port_list_lock, flags); | ||
2035 | |||
2036 | - shost_for_each_device(sdev, port->adapter->scsi_host) { | ||
2037 | + shost_for_each_device(sdev, adapter->scsi_host) { | ||
2038 | zfcp_sdev = sdev_to_zfcp(sdev); | ||
2039 | status = atomic_read(&zfcp_sdev->status); | ||
2040 | if ((status & ZFCP_STATUS_COMMON_ACCESS_DENIED) || | ||
2041 | diff --git a/drivers/s390/scsi/zfcp_dbf.c b/drivers/s390/scsi/zfcp_dbf.c | ||
2042 | index 3c1d220..e1a8cc2 100644 | ||
2043 | --- a/drivers/s390/scsi/zfcp_dbf.c | ||
2044 | +++ b/drivers/s390/scsi/zfcp_dbf.c | ||
2045 | @@ -191,7 +191,7 @@ void zfcp_dbf_hba_def_err(struct zfcp_adapter *adapter, u64 req_id, u16 scount, | ||
2046 | length = min((u16)sizeof(struct qdio_buffer), | ||
2047 | (u16)ZFCP_DBF_PAY_MAX_REC); | ||
2048 | |||
2049 | - while ((char *)pl[payload->counter] && payload->counter < scount) { | ||
2050 | + while (payload->counter < scount && (char *)pl[payload->counter]) { | ||
2051 | memcpy(payload->data, (char *)pl[payload->counter], length); | ||
2052 | debug_event(dbf->pay, 1, payload, zfcp_dbf_plen(length)); | ||
2053 | payload->counter++; | ||
2054 | @@ -200,6 +200,26 @@ void zfcp_dbf_hba_def_err(struct zfcp_adapter *adapter, u64 req_id, u16 scount, | ||
2055 | spin_unlock_irqrestore(&dbf->pay_lock, flags); | ||
2056 | } | ||
2057 | |||
2058 | +/** | ||
2059 | + * zfcp_dbf_hba_basic - trace event for basic adapter events | ||
2060 | + * @adapter: pointer to struct zfcp_adapter | ||
2061 | + */ | ||
2062 | +void zfcp_dbf_hba_basic(char *tag, struct zfcp_adapter *adapter) | ||
2063 | +{ | ||
2064 | + struct zfcp_dbf *dbf = adapter->dbf; | ||
2065 | + struct zfcp_dbf_hba *rec = &dbf->hba_buf; | ||
2066 | + unsigned long flags; | ||
2067 | + | ||
2068 | + spin_lock_irqsave(&dbf->hba_lock, flags); | ||
2069 | + memset(rec, 0, sizeof(*rec)); | ||
2070 | + | ||
2071 | + memcpy(rec->tag, tag, ZFCP_DBF_TAG_LEN); | ||
2072 | + rec->id = ZFCP_DBF_HBA_BASIC; | ||
2073 | + | ||
2074 | + debug_event(dbf->hba, 1, rec, sizeof(*rec)); | ||
2075 | + spin_unlock_irqrestore(&dbf->hba_lock, flags); | ||
2076 | +} | ||
2077 | + | ||
2078 | static void zfcp_dbf_set_common(struct zfcp_dbf_rec *rec, | ||
2079 | struct zfcp_adapter *adapter, | ||
2080 | struct zfcp_port *port, | ||
2081 | diff --git a/drivers/s390/scsi/zfcp_dbf.h b/drivers/s390/scsi/zfcp_dbf.h | ||
2082 | index 714f087..3ac7a4b 100644 | ||
2083 | --- a/drivers/s390/scsi/zfcp_dbf.h | ||
2084 | +++ b/drivers/s390/scsi/zfcp_dbf.h | ||
2085 | @@ -154,6 +154,7 @@ enum zfcp_dbf_hba_id { | ||
2086 | ZFCP_DBF_HBA_RES = 1, | ||
2087 | ZFCP_DBF_HBA_USS = 2, | ||
2088 | ZFCP_DBF_HBA_BIT = 3, | ||
2089 | + ZFCP_DBF_HBA_BASIC = 4, | ||
2090 | }; | ||
2091 | |||
2092 | /** | ||
2093 | diff --git a/drivers/s390/scsi/zfcp_def.h b/drivers/s390/scsi/zfcp_def.h | ||
2094 | index 2955e1a..1305955 100644 | ||
2095 | --- a/drivers/s390/scsi/zfcp_def.h | ||
2096 | +++ b/drivers/s390/scsi/zfcp_def.h | ||
2097 | @@ -77,6 +77,7 @@ struct zfcp_reqlist; | ||
2098 | #define ZFCP_STATUS_ADAPTER_SIOSL_ISSUED 0x00000004 | ||
2099 | #define ZFCP_STATUS_ADAPTER_XCONFIG_OK 0x00000008 | ||
2100 | #define ZFCP_STATUS_ADAPTER_HOST_CON_INIT 0x00000010 | ||
2101 | +#define ZFCP_STATUS_ADAPTER_SUSPENDED 0x00000040 | ||
2102 | #define ZFCP_STATUS_ADAPTER_ERP_PENDING 0x00000100 | ||
2103 | #define ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED 0x00000200 | ||
2104 | #define ZFCP_STATUS_ADAPTER_DATA_DIV_ENABLED 0x00000400 | ||
2105 | @@ -204,6 +205,7 @@ struct zfcp_port { | ||
2106 | struct zfcp_adapter *adapter; /* adapter used to access port */ | ||
2107 | struct list_head unit_list; /* head of logical unit list */ | ||
2108 | rwlock_t unit_list_lock; /* unit list lock */ | ||
2109 | + atomic_t units; /* zfcp_unit count */ | ||
2110 | atomic_t status; /* status of this remote port */ | ||
2111 | u64 wwnn; /* WWNN if known */ | ||
2112 | u64 wwpn; /* WWPN */ | ||
2113 | diff --git a/drivers/s390/scsi/zfcp_ext.h b/drivers/s390/scsi/zfcp_ext.h | ||
2114 | index 36f4227..03441a7f 100644 | ||
2115 | --- a/drivers/s390/scsi/zfcp_ext.h | ||
2116 | +++ b/drivers/s390/scsi/zfcp_ext.h | ||
2117 | @@ -54,6 +54,7 @@ extern void zfcp_dbf_hba_fsf_res(char *, struct zfcp_fsf_req *); | ||
2118 | extern void zfcp_dbf_hba_bit_err(char *, struct zfcp_fsf_req *); | ||
2119 | extern void zfcp_dbf_hba_berr(struct zfcp_dbf *, struct zfcp_fsf_req *); | ||
2120 | extern void zfcp_dbf_hba_def_err(struct zfcp_adapter *, u64, u16, void **); | ||
2121 | +extern void zfcp_dbf_hba_basic(char *, struct zfcp_adapter *); | ||
2122 | extern void zfcp_dbf_san_req(char *, struct zfcp_fsf_req *, u32); | ||
2123 | extern void zfcp_dbf_san_res(char *, struct zfcp_fsf_req *); | ||
2124 | extern void zfcp_dbf_san_in_els(char *, struct zfcp_fsf_req *); | ||
2125 | @@ -158,6 +159,7 @@ extern void zfcp_scsi_dif_sense_error(struct scsi_cmnd *, int); | ||
2126 | extern struct attribute_group zfcp_sysfs_unit_attrs; | ||
2127 | extern struct attribute_group zfcp_sysfs_adapter_attrs; | ||
2128 | extern struct attribute_group zfcp_sysfs_port_attrs; | ||
2129 | +extern struct mutex zfcp_sysfs_port_units_mutex; | ||
2130 | extern struct device_attribute *zfcp_sysfs_sdev_attrs[]; | ||
2131 | extern struct device_attribute *zfcp_sysfs_shost_attrs[]; | ||
2132 | |||
2133 | diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c | ||
2134 | index e1c1efc..48f875f 100644 | ||
2135 | --- a/drivers/s390/scsi/zfcp_fsf.c | ||
2136 | +++ b/drivers/s390/scsi/zfcp_fsf.c | ||
2137 | @@ -219,7 +219,7 @@ static void zfcp_fsf_status_read_handler(struct zfcp_fsf_req *req) | ||
2138 | return; | ||
2139 | } | ||
2140 | |||
2141 | - zfcp_dbf_hba_fsf_uss("fssrh_2", req); | ||
2142 | + zfcp_dbf_hba_fsf_uss("fssrh_4", req); | ||
2143 | |||
2144 | switch (sr_buf->status_type) { | ||
2145 | case FSF_STATUS_READ_PORT_CLOSED: | ||
2146 | @@ -437,6 +437,34 @@ void zfcp_fsf_req_dismiss_all(struct zfcp_adapter *adapter) | ||
2147 | } | ||
2148 | } | ||
2149 | |||
2150 | +#define ZFCP_FSF_PORTSPEED_1GBIT (1 << 0) | ||
2151 | +#define ZFCP_FSF_PORTSPEED_2GBIT (1 << 1) | ||
2152 | +#define ZFCP_FSF_PORTSPEED_4GBIT (1 << 2) | ||
2153 | +#define ZFCP_FSF_PORTSPEED_10GBIT (1 << 3) | ||
2154 | +#define ZFCP_FSF_PORTSPEED_8GBIT (1 << 4) | ||
2155 | +#define ZFCP_FSF_PORTSPEED_16GBIT (1 << 5) | ||
2156 | +#define ZFCP_FSF_PORTSPEED_NOT_NEGOTIATED (1 << 15) | ||
2157 | + | ||
2158 | +static u32 zfcp_fsf_convert_portspeed(u32 fsf_speed) | ||
2159 | +{ | ||
2160 | + u32 fdmi_speed = 0; | ||
2161 | + if (fsf_speed & ZFCP_FSF_PORTSPEED_1GBIT) | ||
2162 | + fdmi_speed |= FC_PORTSPEED_1GBIT; | ||
2163 | + if (fsf_speed & ZFCP_FSF_PORTSPEED_2GBIT) | ||
2164 | + fdmi_speed |= FC_PORTSPEED_2GBIT; | ||
2165 | + if (fsf_speed & ZFCP_FSF_PORTSPEED_4GBIT) | ||
2166 | + fdmi_speed |= FC_PORTSPEED_4GBIT; | ||
2167 | + if (fsf_speed & ZFCP_FSF_PORTSPEED_10GBIT) | ||
2168 | + fdmi_speed |= FC_PORTSPEED_10GBIT; | ||
2169 | + if (fsf_speed & ZFCP_FSF_PORTSPEED_8GBIT) | ||
2170 | + fdmi_speed |= FC_PORTSPEED_8GBIT; | ||
2171 | + if (fsf_speed & ZFCP_FSF_PORTSPEED_16GBIT) | ||
2172 | + fdmi_speed |= FC_PORTSPEED_16GBIT; | ||
2173 | + if (fsf_speed & ZFCP_FSF_PORTSPEED_NOT_NEGOTIATED) | ||
2174 | + fdmi_speed |= FC_PORTSPEED_NOT_NEGOTIATED; | ||
2175 | + return fdmi_speed; | ||
2176 | +} | ||
2177 | + | ||
2178 | static int zfcp_fsf_exchange_config_evaluate(struct zfcp_fsf_req *req) | ||
2179 | { | ||
2180 | struct fsf_qtcb_bottom_config *bottom = &req->qtcb->bottom.config; | ||
2181 | @@ -456,7 +484,8 @@ static int zfcp_fsf_exchange_config_evaluate(struct zfcp_fsf_req *req) | ||
2182 | fc_host_port_name(shost) = nsp->fl_wwpn; | ||
2183 | fc_host_node_name(shost) = nsp->fl_wwnn; | ||
2184 | fc_host_port_id(shost) = ntoh24(bottom->s_id); | ||
2185 | - fc_host_speed(shost) = bottom->fc_link_speed; | ||
2186 | + fc_host_speed(shost) = | ||
2187 | + zfcp_fsf_convert_portspeed(bottom->fc_link_speed); | ||
2188 | fc_host_supported_classes(shost) = FC_COS_CLASS2 | FC_COS_CLASS3; | ||
2189 | |||
2190 | adapter->hydra_version = bottom->adapter_type; | ||
2191 | @@ -580,7 +609,8 @@ static void zfcp_fsf_exchange_port_evaluate(struct zfcp_fsf_req *req) | ||
2192 | } else | ||
2193 | fc_host_permanent_port_name(shost) = fc_host_port_name(shost); | ||
2194 | fc_host_maxframe_size(shost) = bottom->maximum_frame_size; | ||
2195 | - fc_host_supported_speeds(shost) = bottom->supported_speed; | ||
2196 | + fc_host_supported_speeds(shost) = | ||
2197 | + zfcp_fsf_convert_portspeed(bottom->supported_speed); | ||
2198 | memcpy(fc_host_supported_fc4s(shost), bottom->supported_fc4_types, | ||
2199 | FC_FC4_LIST_SIZE); | ||
2200 | memcpy(fc_host_active_fc4s(shost), bottom->active_fc4_types, | ||
2201 | @@ -771,12 +801,14 @@ out: | ||
2202 | static void zfcp_fsf_abort_fcp_command_handler(struct zfcp_fsf_req *req) | ||
2203 | { | ||
2204 | struct scsi_device *sdev = req->data; | ||
2205 | - struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev); | ||
2206 | + struct zfcp_scsi_dev *zfcp_sdev; | ||
2207 | union fsf_status_qual *fsq = &req->qtcb->header.fsf_status_qual; | ||
2208 | |||
2209 | if (req->status & ZFCP_STATUS_FSFREQ_ERROR) | ||
2210 | return; | ||
2211 | |||
2212 | + zfcp_sdev = sdev_to_zfcp(sdev); | ||
2213 | + | ||
2214 | switch (req->qtcb->header.fsf_status) { | ||
2215 | case FSF_PORT_HANDLE_NOT_VALID: | ||
2216 | if (fsq->word[0] == fsq->word[1]) { | ||
2217 | @@ -885,7 +917,7 @@ static void zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *req) | ||
2218 | |||
2219 | switch (header->fsf_status) { | ||
2220 | case FSF_GOOD: | ||
2221 | - zfcp_dbf_san_res("fsscth1", req); | ||
2222 | + zfcp_dbf_san_res("fsscth2", req); | ||
2223 | ct->status = 0; | ||
2224 | break; | ||
2225 | case FSF_SERVICE_CLASS_NOT_SUPPORTED: | ||
2226 | @@ -1739,13 +1771,15 @@ static void zfcp_fsf_open_lun_handler(struct zfcp_fsf_req *req) | ||
2227 | { | ||
2228 | struct zfcp_adapter *adapter = req->adapter; | ||
2229 | struct scsi_device *sdev = req->data; | ||
2230 | - struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev); | ||
2231 | + struct zfcp_scsi_dev *zfcp_sdev; | ||
2232 | struct fsf_qtcb_header *header = &req->qtcb->header; | ||
2233 | struct fsf_qtcb_bottom_support *bottom = &req->qtcb->bottom.support; | ||
2234 | |||
2235 | if (req->status & ZFCP_STATUS_FSFREQ_ERROR) | ||
2236 | return; | ||
2237 | |||
2238 | + zfcp_sdev = sdev_to_zfcp(sdev); | ||
2239 | + | ||
2240 | atomic_clear_mask(ZFCP_STATUS_COMMON_ACCESS_DENIED | | ||
2241 | ZFCP_STATUS_COMMON_ACCESS_BOXED | | ||
2242 | ZFCP_STATUS_LUN_SHARED | | ||
2243 | @@ -1856,11 +1890,13 @@ out: | ||
2244 | static void zfcp_fsf_close_lun_handler(struct zfcp_fsf_req *req) | ||
2245 | { | ||
2246 | struct scsi_device *sdev = req->data; | ||
2247 | - struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev); | ||
2248 | + struct zfcp_scsi_dev *zfcp_sdev; | ||
2249 | |||
2250 | if (req->status & ZFCP_STATUS_FSFREQ_ERROR) | ||
2251 | return; | ||
2252 | |||
2253 | + zfcp_sdev = sdev_to_zfcp(sdev); | ||
2254 | + | ||
2255 | switch (req->qtcb->header.fsf_status) { | ||
2256 | case FSF_PORT_HANDLE_NOT_VALID: | ||
2257 | zfcp_erp_adapter_reopen(zfcp_sdev->port->adapter, 0, "fscuh_1"); | ||
2258 | @@ -1950,7 +1986,7 @@ static void zfcp_fsf_req_trace(struct zfcp_fsf_req *req, struct scsi_cmnd *scsi) | ||
2259 | { | ||
2260 | struct fsf_qual_latency_info *lat_in; | ||
2261 | struct latency_cont *lat = NULL; | ||
2262 | - struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(scsi->device); | ||
2263 | + struct zfcp_scsi_dev *zfcp_sdev; | ||
2264 | struct zfcp_blk_drv_data blktrc; | ||
2265 | int ticks = req->adapter->timer_ticks; | ||
2266 | |||
2267 | @@ -1965,6 +2001,7 @@ static void zfcp_fsf_req_trace(struct zfcp_fsf_req *req, struct scsi_cmnd *scsi) | ||
2268 | |||
2269 | if (req->adapter->adapter_features & FSF_FEATURE_MEASUREMENT_DATA && | ||
2270 | !(req->status & ZFCP_STATUS_FSFREQ_ERROR)) { | ||
2271 | + zfcp_sdev = sdev_to_zfcp(scsi->device); | ||
2272 | blktrc.flags |= ZFCP_BLK_LAT_VALID; | ||
2273 | blktrc.channel_lat = lat_in->channel_lat * ticks; | ||
2274 | blktrc.fabric_lat = lat_in->fabric_lat * ticks; | ||
2275 | @@ -2002,12 +2039,14 @@ static void zfcp_fsf_fcp_handler_common(struct zfcp_fsf_req *req) | ||
2276 | { | ||
2277 | struct scsi_cmnd *scmnd = req->data; | ||
2278 | struct scsi_device *sdev = scmnd->device; | ||
2279 | - struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev); | ||
2280 | + struct zfcp_scsi_dev *zfcp_sdev; | ||
2281 | struct fsf_qtcb_header *header = &req->qtcb->header; | ||
2282 | |||
2283 | if (unlikely(req->status & ZFCP_STATUS_FSFREQ_ERROR)) | ||
2284 | return; | ||
2285 | |||
2286 | + zfcp_sdev = sdev_to_zfcp(sdev); | ||
2287 | + | ||
2288 | switch (header->fsf_status) { | ||
2289 | case FSF_HANDLE_MISMATCH: | ||
2290 | case FSF_PORT_HANDLE_NOT_VALID: | ||
2291 | diff --git a/drivers/s390/scsi/zfcp_qdio.c b/drivers/s390/scsi/zfcp_qdio.c | ||
2292 | index b9fffc8..50b5615 100644 | ||
2293 | --- a/drivers/s390/scsi/zfcp_qdio.c | ||
2294 | +++ b/drivers/s390/scsi/zfcp_qdio.c | ||
2295 | @@ -102,18 +102,22 @@ static void zfcp_qdio_int_resp(struct ccw_device *cdev, unsigned int qdio_err, | ||
2296 | { | ||
2297 | struct zfcp_qdio *qdio = (struct zfcp_qdio *) parm; | ||
2298 | struct zfcp_adapter *adapter = qdio->adapter; | ||
2299 | - struct qdio_buffer_element *sbale; | ||
2300 | int sbal_no, sbal_idx; | ||
2301 | - void *pl[ZFCP_QDIO_MAX_SBALS_PER_REQ + 1]; | ||
2302 | - u64 req_id; | ||
2303 | - u8 scount; | ||
2304 | |||
2305 | if (unlikely(qdio_err)) { | ||
2306 | - memset(pl, 0, ZFCP_QDIO_MAX_SBALS_PER_REQ * sizeof(void *)); | ||
2307 | if (zfcp_adapter_multi_buffer_active(adapter)) { | ||
2308 | + void *pl[ZFCP_QDIO_MAX_SBALS_PER_REQ + 1]; | ||
2309 | + struct qdio_buffer_element *sbale; | ||
2310 | + u64 req_id; | ||
2311 | + u8 scount; | ||
2312 | + | ||
2313 | + memset(pl, 0, | ||
2314 | + ZFCP_QDIO_MAX_SBALS_PER_REQ * sizeof(void *)); | ||
2315 | sbale = qdio->res_q[idx]->element; | ||
2316 | req_id = (u64) sbale->addr; | ||
2317 | - scount = sbale->scount + 1; /* incl. signaling SBAL */ | ||
2318 | + scount = min(sbale->scount + 1, | ||
2319 | + ZFCP_QDIO_MAX_SBALS_PER_REQ + 1); | ||
2320 | + /* incl. signaling SBAL */ | ||
2321 | |||
2322 | for (sbal_no = 0; sbal_no < scount; sbal_no++) { | ||
2323 | sbal_idx = (idx + sbal_no) % | ||
2324 | diff --git a/drivers/s390/scsi/zfcp_sysfs.c b/drivers/s390/scsi/zfcp_sysfs.c | ||
2325 | index c66af27..1e0eb08 100644 | ||
2326 | --- a/drivers/s390/scsi/zfcp_sysfs.c | ||
2327 | +++ b/drivers/s390/scsi/zfcp_sysfs.c | ||
2328 | @@ -227,6 +227,8 @@ static ssize_t zfcp_sysfs_port_rescan_store(struct device *dev, | ||
2329 | static ZFCP_DEV_ATTR(adapter, port_rescan, S_IWUSR, NULL, | ||
2330 | zfcp_sysfs_port_rescan_store); | ||
2331 | |||
2332 | +DEFINE_MUTEX(zfcp_sysfs_port_units_mutex); | ||
2333 | + | ||
2334 | static ssize_t zfcp_sysfs_port_remove_store(struct device *dev, | ||
2335 | struct device_attribute *attr, | ||
2336 | const char *buf, size_t count) | ||
2337 | @@ -249,6 +251,16 @@ static ssize_t zfcp_sysfs_port_remove_store(struct device *dev, | ||
2338 | else | ||
2339 | retval = 0; | ||
2340 | |||
2341 | + mutex_lock(&zfcp_sysfs_port_units_mutex); | ||
2342 | + if (atomic_read(&port->units) > 0) { | ||
2343 | + retval = -EBUSY; | ||
2344 | + mutex_unlock(&zfcp_sysfs_port_units_mutex); | ||
2345 | + goto out; | ||
2346 | + } | ||
2347 | + /* port is about to be removed, so no more unit_add */ | ||
2348 | + atomic_set(&port->units, -1); | ||
2349 | + mutex_unlock(&zfcp_sysfs_port_units_mutex); | ||
2350 | + | ||
2351 | write_lock_irq(&adapter->port_list_lock); | ||
2352 | list_del(&port->list); | ||
2353 | write_unlock_irq(&adapter->port_list_lock); | ||
2354 | @@ -289,12 +301,14 @@ static ssize_t zfcp_sysfs_unit_add_store(struct device *dev, | ||
2355 | { | ||
2356 | struct zfcp_port *port = container_of(dev, struct zfcp_port, dev); | ||
2357 | u64 fcp_lun; | ||
2358 | + int retval; | ||
2359 | |||
2360 | if (strict_strtoull(buf, 0, (unsigned long long *) &fcp_lun)) | ||
2361 | return -EINVAL; | ||
2362 | |||
2363 | - if (zfcp_unit_add(port, fcp_lun)) | ||
2364 | - return -EINVAL; | ||
2365 | + retval = zfcp_unit_add(port, fcp_lun); | ||
2366 | + if (retval) | ||
2367 | + return retval; | ||
2368 | |||
2369 | return count; | ||
2370 | } | ||
2371 | diff --git a/drivers/s390/scsi/zfcp_unit.c b/drivers/s390/scsi/zfcp_unit.c | ||
2372 | index 3f2bff0..1cd2b99 100644 | ||
2373 | --- a/drivers/s390/scsi/zfcp_unit.c | ||
2374 | +++ b/drivers/s390/scsi/zfcp_unit.c | ||
2375 | @@ -104,7 +104,7 @@ static void zfcp_unit_release(struct device *dev) | ||
2376 | { | ||
2377 | struct zfcp_unit *unit = container_of(dev, struct zfcp_unit, dev); | ||
2378 | |||
2379 | - put_device(&unit->port->dev); | ||
2380 | + atomic_dec(&unit->port->units); | ||
2381 | kfree(unit); | ||
2382 | } | ||
2383 | |||
2384 | @@ -119,16 +119,27 @@ static void zfcp_unit_release(struct device *dev) | ||
2385 | int zfcp_unit_add(struct zfcp_port *port, u64 fcp_lun) | ||
2386 | { | ||
2387 | struct zfcp_unit *unit; | ||
2388 | + int retval = 0; | ||
2389 | + | ||
2390 | + mutex_lock(&zfcp_sysfs_port_units_mutex); | ||
2391 | + if (atomic_read(&port->units) == -1) { | ||
2392 | + /* port is already gone */ | ||
2393 | + retval = -ENODEV; | ||
2394 | + goto out; | ||
2395 | + } | ||
2396 | |||
2397 | unit = zfcp_unit_find(port, fcp_lun); | ||
2398 | if (unit) { | ||
2399 | put_device(&unit->dev); | ||
2400 | - return -EEXIST; | ||
2401 | + retval = -EEXIST; | ||
2402 | + goto out; | ||
2403 | } | ||
2404 | |||
2405 | unit = kzalloc(sizeof(struct zfcp_unit), GFP_KERNEL); | ||
2406 | - if (!unit) | ||
2407 | - return -ENOMEM; | ||
2408 | + if (!unit) { | ||
2409 | + retval = -ENOMEM; | ||
2410 | + goto out; | ||
2411 | + } | ||
2412 | |||
2413 | unit->port = port; | ||
2414 | unit->fcp_lun = fcp_lun; | ||
2415 | @@ -139,28 +150,33 @@ int zfcp_unit_add(struct zfcp_port *port, u64 fcp_lun) | ||
2416 | if (dev_set_name(&unit->dev, "0x%016llx", | ||
2417 | (unsigned long long) fcp_lun)) { | ||
2418 | kfree(unit); | ||
2419 | - return -ENOMEM; | ||
2420 | + retval = -ENOMEM; | ||
2421 | + goto out; | ||
2422 | } | ||
2423 | |||
2424 | - get_device(&port->dev); | ||
2425 | - | ||
2426 | if (device_register(&unit->dev)) { | ||
2427 | put_device(&unit->dev); | ||
2428 | - return -ENOMEM; | ||
2429 | + retval = -ENOMEM; | ||
2430 | + goto out; | ||
2431 | } | ||
2432 | |||
2433 | if (sysfs_create_group(&unit->dev.kobj, &zfcp_sysfs_unit_attrs)) { | ||
2434 | device_unregister(&unit->dev); | ||
2435 | - return -EINVAL; | ||
2436 | + retval = -EINVAL; | ||
2437 | + goto out; | ||
2438 | } | ||
2439 | |||
2440 | + atomic_inc(&port->units); /* under zfcp_sysfs_port_units_mutex ! */ | ||
2441 | + | ||
2442 | write_lock_irq(&port->unit_list_lock); | ||
2443 | list_add_tail(&unit->list, &port->unit_list); | ||
2444 | write_unlock_irq(&port->unit_list_lock); | ||
2445 | |||
2446 | zfcp_unit_scsi_scan(unit); | ||
2447 | |||
2448 | - return 0; | ||
2449 | +out: | ||
2450 | + mutex_unlock(&zfcp_sysfs_port_units_mutex); | ||
2451 | + return retval; | ||
2452 | } | ||
2453 | |||
2454 | /** | ||
2455 | diff --git a/drivers/scsi/atp870u.c b/drivers/scsi/atp870u.c | ||
2456 | index 68ce085..a540162 100644 | ||
2457 | --- a/drivers/scsi/atp870u.c | ||
2458 | +++ b/drivers/scsi/atp870u.c | ||
2459 | @@ -1173,7 +1173,16 @@ wait_io1: | ||
2460 | outw(val, tmport); | ||
2461 | outb(2, 0x80); | ||
2462 | TCM_SYNC: | ||
2463 | - udelay(0x800); | ||
2464 | + /* | ||
2465 | + * The funny division into multiple delays is to accomodate | ||
2466 | + * arches like ARM where udelay() multiplies its argument by | ||
2467 | + * a large number to initialize a loop counter. To avoid | ||
2468 | + * overflow, the maximum supported udelay is 2000 microseconds. | ||
2469 | + * | ||
2470 | + * XXX it would be more polite to find a way to use msleep() | ||
2471 | + */ | ||
2472 | + mdelay(2); | ||
2473 | + udelay(48); | ||
2474 | if ((inb(tmport) & 0x80) == 0x00) { /* bsy ? */ | ||
2475 | outw(0, tmport--); | ||
2476 | outb(0, tmport); | ||
2477 | diff --git a/fs/buffer.c b/fs/buffer.c | ||
2478 | index 58e2e7b..b5f0442 100644 | ||
2479 | --- a/fs/buffer.c | ||
2480 | +++ b/fs/buffer.c | ||
2481 | @@ -2312,12 +2312,6 @@ int __block_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf, | ||
2482 | loff_t size; | ||
2483 | int ret; | ||
2484 | |||
2485 | - /* | ||
2486 | - * Update file times before taking page lock. We may end up failing the | ||
2487 | - * fault so this update may be superfluous but who really cares... | ||
2488 | - */ | ||
2489 | - file_update_time(vma->vm_file); | ||
2490 | - | ||
2491 | lock_page(page); | ||
2492 | size = i_size_read(inode); | ||
2493 | if ((page->mapping != inode->i_mapping) || | ||
2494 | @@ -2355,6 +2349,13 @@ int block_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf, | ||
2495 | struct super_block *sb = vma->vm_file->f_path.dentry->d_inode->i_sb; | ||
2496 | |||
2497 | sb_start_pagefault(sb); | ||
2498 | + | ||
2499 | + /* | ||
2500 | + * Update file times before taking page lock. We may end up failing the | ||
2501 | + * fault so this update may be superfluous but who really cares... | ||
2502 | + */ | ||
2503 | + file_update_time(vma->vm_file); | ||
2504 | + | ||
2505 | ret = __block_page_mkwrite(vma, vmf, get_block); | ||
2506 | sb_end_pagefault(sb); | ||
2507 | return block_page_mkwrite_return(ret); | ||
2508 | diff --git a/fs/cifs/cifs_unicode.c b/fs/cifs/cifs_unicode.c | ||
2509 | index 53cf2aa..71d5d0a 100644 | ||
2510 | --- a/fs/cifs/cifs_unicode.c | ||
2511 | +++ b/fs/cifs/cifs_unicode.c | ||
2512 | @@ -203,6 +203,27 @@ cifs_strtoUTF16(__le16 *to, const char *from, int len, | ||
2513 | int i; | ||
2514 | wchar_t wchar_to; /* needed to quiet sparse */ | ||
2515 | |||
2516 | + /* special case for utf8 to handle no plane0 chars */ | ||
2517 | + if (!strcmp(codepage->charset, "utf8")) { | ||
2518 | + /* | ||
2519 | + * convert utf8 -> utf16, we assume we have enough space | ||
2520 | + * as caller should have assumed conversion does not overflow | ||
2521 | + * in destination len is length in wchar_t units (16bits) | ||
2522 | + */ | ||
2523 | + i = utf8s_to_utf16s(from, len, UTF16_LITTLE_ENDIAN, | ||
2524 | + (wchar_t *) to, len); | ||
2525 | + | ||
2526 | + /* if success terminate and exit */ | ||
2527 | + if (i >= 0) | ||
2528 | + goto success; | ||
2529 | + /* | ||
2530 | + * if fails fall back to UCS encoding as this | ||
2531 | + * function should not return negative values | ||
2532 | + * currently can fail only if source contains | ||
2533 | + * invalid encoded characters | ||
2534 | + */ | ||
2535 | + } | ||
2536 | + | ||
2537 | for (i = 0; len && *from; i++, from += charlen, len -= charlen) { | ||
2538 | charlen = codepage->char2uni(from, len, &wchar_to); | ||
2539 | if (charlen < 1) { | ||
2540 | @@ -215,6 +236,7 @@ cifs_strtoUTF16(__le16 *to, const char *from, int len, | ||
2541 | put_unaligned_le16(wchar_to, &to[i]); | ||
2542 | } | ||
2543 | |||
2544 | +success: | ||
2545 | put_unaligned_le16(0, &to[i]); | ||
2546 | return i; | ||
2547 | } | ||
2548 | diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c | ||
2549 | index 6df6fa1..b39bb4a 100644 | ||
2550 | --- a/fs/cifs/connect.c | ||
2551 | +++ b/fs/cifs/connect.c | ||
2552 | @@ -67,6 +67,7 @@ enum { | ||
2553 | /* Mount options that take no arguments */ | ||
2554 | Opt_user_xattr, Opt_nouser_xattr, | ||
2555 | Opt_forceuid, Opt_noforceuid, | ||
2556 | + Opt_forcegid, Opt_noforcegid, | ||
2557 | Opt_noblocksend, Opt_noautotune, | ||
2558 | Opt_hard, Opt_soft, Opt_perm, Opt_noperm, | ||
2559 | Opt_mapchars, Opt_nomapchars, Opt_sfu, | ||
2560 | @@ -118,6 +119,8 @@ static const match_table_t cifs_mount_option_tokens = { | ||
2561 | { Opt_nouser_xattr, "nouser_xattr" }, | ||
2562 | { Opt_forceuid, "forceuid" }, | ||
2563 | { Opt_noforceuid, "noforceuid" }, | ||
2564 | + { Opt_forcegid, "forcegid" }, | ||
2565 | + { Opt_noforcegid, "noforcegid" }, | ||
2566 | { Opt_noblocksend, "noblocksend" }, | ||
2567 | { Opt_noautotune, "noautotune" }, | ||
2568 | { Opt_hard, "hard" }, | ||
2569 | @@ -1190,6 +1193,12 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, | ||
2570 | case Opt_noforceuid: | ||
2571 | override_uid = 0; | ||
2572 | break; | ||
2573 | + case Opt_forcegid: | ||
2574 | + override_gid = 1; | ||
2575 | + break; | ||
2576 | + case Opt_noforcegid: | ||
2577 | + override_gid = 0; | ||
2578 | + break; | ||
2579 | case Opt_noblocksend: | ||
2580 | vol->noblocksnd = 1; | ||
2581 | break; | ||
2582 | diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c | ||
2583 | index dff171c..2ce16af 100644 | ||
2584 | --- a/fs/ext4/inode.c | ||
2585 | +++ b/fs/ext4/inode.c | ||
2586 | @@ -2463,6 +2463,16 @@ static int ext4_nonda_switch(struct super_block *sb) | ||
2587 | free_blocks = EXT4_C2B(sbi, | ||
2588 | percpu_counter_read_positive(&sbi->s_freeclusters_counter)); | ||
2589 | dirty_blocks = percpu_counter_read_positive(&sbi->s_dirtyclusters_counter); | ||
2590 | + /* | ||
2591 | + * Start pushing delalloc when 1/2 of free blocks are dirty. | ||
2592 | + */ | ||
2593 | + if (dirty_blocks && (free_blocks < 2 * dirty_blocks) && | ||
2594 | + !writeback_in_progress(sb->s_bdi) && | ||
2595 | + down_read_trylock(&sb->s_umount)) { | ||
2596 | + writeback_inodes_sb(sb, WB_REASON_FS_FREE_SPACE); | ||
2597 | + up_read(&sb->s_umount); | ||
2598 | + } | ||
2599 | + | ||
2600 | if (2 * free_blocks < 3 * dirty_blocks || | ||
2601 | free_blocks < (dirty_blocks + EXT4_FREECLUSTERS_WATERMARK)) { | ||
2602 | /* | ||
2603 | @@ -2471,13 +2481,6 @@ static int ext4_nonda_switch(struct super_block *sb) | ||
2604 | */ | ||
2605 | return 1; | ||
2606 | } | ||
2607 | - /* | ||
2608 | - * Even if we don't switch but are nearing capacity, | ||
2609 | - * start pushing delalloc when 1/2 of free blocks are dirty. | ||
2610 | - */ | ||
2611 | - if (free_blocks < 2 * dirty_blocks) | ||
2612 | - writeback_inodes_sb_if_idle(sb, WB_REASON_FS_FREE_SPACE); | ||
2613 | - | ||
2614 | return 0; | ||
2615 | } | ||
2616 | |||
2617 | @@ -4052,6 +4055,7 @@ static int ext4_do_update_inode(handle_t *handle, | ||
2618 | struct ext4_inode_info *ei = EXT4_I(inode); | ||
2619 | struct buffer_head *bh = iloc->bh; | ||
2620 | int err = 0, rc, block; | ||
2621 | + int need_datasync = 0; | ||
2622 | uid_t i_uid; | ||
2623 | gid_t i_gid; | ||
2624 | |||
2625 | @@ -4102,7 +4106,10 @@ static int ext4_do_update_inode(handle_t *handle, | ||
2626 | raw_inode->i_file_acl_high = | ||
2627 | cpu_to_le16(ei->i_file_acl >> 32); | ||
2628 | raw_inode->i_file_acl_lo = cpu_to_le32(ei->i_file_acl); | ||
2629 | - ext4_isize_set(raw_inode, ei->i_disksize); | ||
2630 | + if (ei->i_disksize != ext4_isize(raw_inode)) { | ||
2631 | + ext4_isize_set(raw_inode, ei->i_disksize); | ||
2632 | + need_datasync = 1; | ||
2633 | + } | ||
2634 | if (ei->i_disksize > 0x7fffffffULL) { | ||
2635 | struct super_block *sb = inode->i_sb; | ||
2636 | if (!EXT4_HAS_RO_COMPAT_FEATURE(sb, | ||
2637 | @@ -4155,7 +4162,7 @@ static int ext4_do_update_inode(handle_t *handle, | ||
2638 | err = rc; | ||
2639 | ext4_clear_inode_state(inode, EXT4_STATE_NEW); | ||
2640 | |||
2641 | - ext4_update_inode_fsync_trans(handle, inode, 0); | ||
2642 | + ext4_update_inode_fsync_trans(handle, inode, need_datasync); | ||
2643 | out_brelse: | ||
2644 | brelse(bh); | ||
2645 | ext4_std_error(inode->i_sb, err); | ||
2646 | @@ -4780,6 +4787,7 @@ int ext4_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) | ||
2647 | int retries = 0; | ||
2648 | |||
2649 | sb_start_pagefault(inode->i_sb); | ||
2650 | + file_update_time(vma->vm_file); | ||
2651 | /* Delalloc case is easy... */ | ||
2652 | if (test_opt(inode->i_sb, DELALLOC) && | ||
2653 | !ext4_should_journal_data(inode) && | ||
2654 | diff --git a/fs/ext4/move_extent.c b/fs/ext4/move_extent.c | ||
2655 | index c5826c6..e2016f3 100644 | ||
2656 | --- a/fs/ext4/move_extent.c | ||
2657 | +++ b/fs/ext4/move_extent.c | ||
2658 | @@ -141,55 +141,21 @@ mext_next_extent(struct inode *inode, struct ext4_ext_path *path, | ||
2659 | } | ||
2660 | |||
2661 | /** | ||
2662 | - * mext_check_null_inode - NULL check for two inodes | ||
2663 | - * | ||
2664 | - * If inode1 or inode2 is NULL, return -EIO. Otherwise, return 0. | ||
2665 | - */ | ||
2666 | -static int | ||
2667 | -mext_check_null_inode(struct inode *inode1, struct inode *inode2, | ||
2668 | - const char *function, unsigned int line) | ||
2669 | -{ | ||
2670 | - int ret = 0; | ||
2671 | - | ||
2672 | - if (inode1 == NULL) { | ||
2673 | - __ext4_error(inode2->i_sb, function, line, | ||
2674 | - "Both inodes should not be NULL: " | ||
2675 | - "inode1 NULL inode2 %lu", inode2->i_ino); | ||
2676 | - ret = -EIO; | ||
2677 | - } else if (inode2 == NULL) { | ||
2678 | - __ext4_error(inode1->i_sb, function, line, | ||
2679 | - "Both inodes should not be NULL: " | ||
2680 | - "inode1 %lu inode2 NULL", inode1->i_ino); | ||
2681 | - ret = -EIO; | ||
2682 | - } | ||
2683 | - return ret; | ||
2684 | -} | ||
2685 | - | ||
2686 | -/** | ||
2687 | * double_down_write_data_sem - Acquire two inodes' write lock of i_data_sem | ||
2688 | * | ||
2689 | - * @orig_inode: original inode structure | ||
2690 | - * @donor_inode: donor inode structure | ||
2691 | - * Acquire write lock of i_data_sem of the two inodes (orig and donor) by | ||
2692 | - * i_ino order. | ||
2693 | + * Acquire write lock of i_data_sem of the two inodes | ||
2694 | */ | ||
2695 | static void | ||
2696 | -double_down_write_data_sem(struct inode *orig_inode, struct inode *donor_inode) | ||
2697 | +double_down_write_data_sem(struct inode *first, struct inode *second) | ||
2698 | { | ||
2699 | - struct inode *first = orig_inode, *second = donor_inode; | ||
2700 | + if (first < second) { | ||
2701 | + down_write(&EXT4_I(first)->i_data_sem); | ||
2702 | + down_write_nested(&EXT4_I(second)->i_data_sem, SINGLE_DEPTH_NESTING); | ||
2703 | + } else { | ||
2704 | + down_write(&EXT4_I(second)->i_data_sem); | ||
2705 | + down_write_nested(&EXT4_I(first)->i_data_sem, SINGLE_DEPTH_NESTING); | ||
2706 | |||
2707 | - /* | ||
2708 | - * Use the inode number to provide the stable locking order instead | ||
2709 | - * of its address, because the C language doesn't guarantee you can | ||
2710 | - * compare pointers that don't come from the same array. | ||
2711 | - */ | ||
2712 | - if (donor_inode->i_ino < orig_inode->i_ino) { | ||
2713 | - first = donor_inode; | ||
2714 | - second = orig_inode; | ||
2715 | } | ||
2716 | - | ||
2717 | - down_write(&EXT4_I(first)->i_data_sem); | ||
2718 | - down_write_nested(&EXT4_I(second)->i_data_sem, SINGLE_DEPTH_NESTING); | ||
2719 | } | ||
2720 | |||
2721 | /** | ||
2722 | @@ -969,14 +935,6 @@ mext_check_arguments(struct inode *orig_inode, | ||
2723 | return -EINVAL; | ||
2724 | } | ||
2725 | |||
2726 | - /* Files should be in the same ext4 FS */ | ||
2727 | - if (orig_inode->i_sb != donor_inode->i_sb) { | ||
2728 | - ext4_debug("ext4 move extent: The argument files " | ||
2729 | - "should be in same FS [ino:orig %lu, donor %lu]\n", | ||
2730 | - orig_inode->i_ino, donor_inode->i_ino); | ||
2731 | - return -EINVAL; | ||
2732 | - } | ||
2733 | - | ||
2734 | /* Ext4 move extent supports only extent based file */ | ||
2735 | if (!(ext4_test_inode_flag(orig_inode, EXT4_INODE_EXTENTS))) { | ||
2736 | ext4_debug("ext4 move extent: orig file is not extents " | ||
2737 | @@ -1072,35 +1030,19 @@ mext_check_arguments(struct inode *orig_inode, | ||
2738 | * @inode1: the inode structure | ||
2739 | * @inode2: the inode structure | ||
2740 | * | ||
2741 | - * Lock two inodes' i_mutex by i_ino order. | ||
2742 | - * If inode1 or inode2 is NULL, return -EIO. Otherwise, return 0. | ||
2743 | + * Lock two inodes' i_mutex | ||
2744 | */ | ||
2745 | -static int | ||
2746 | +static void | ||
2747 | mext_inode_double_lock(struct inode *inode1, struct inode *inode2) | ||
2748 | { | ||
2749 | - int ret = 0; | ||
2750 | - | ||
2751 | - BUG_ON(inode1 == NULL && inode2 == NULL); | ||
2752 | - | ||
2753 | - ret = mext_check_null_inode(inode1, inode2, __func__, __LINE__); | ||
2754 | - if (ret < 0) | ||
2755 | - goto out; | ||
2756 | - | ||
2757 | - if (inode1 == inode2) { | ||
2758 | - mutex_lock(&inode1->i_mutex); | ||
2759 | - goto out; | ||
2760 | - } | ||
2761 | - | ||
2762 | - if (inode1->i_ino < inode2->i_ino) { | ||
2763 | + BUG_ON(inode1 == inode2); | ||
2764 | + if (inode1 < inode2) { | ||
2765 | mutex_lock_nested(&inode1->i_mutex, I_MUTEX_PARENT); | ||
2766 | mutex_lock_nested(&inode2->i_mutex, I_MUTEX_CHILD); | ||
2767 | } else { | ||
2768 | mutex_lock_nested(&inode2->i_mutex, I_MUTEX_PARENT); | ||
2769 | mutex_lock_nested(&inode1->i_mutex, I_MUTEX_CHILD); | ||
2770 | } | ||
2771 | - | ||
2772 | -out: | ||
2773 | - return ret; | ||
2774 | } | ||
2775 | |||
2776 | /** | ||
2777 | @@ -1109,28 +1051,13 @@ out: | ||
2778 | * @inode1: the inode that is released first | ||
2779 | * @inode2: the inode that is released second | ||
2780 | * | ||
2781 | - * If inode1 or inode2 is NULL, return -EIO. Otherwise, return 0. | ||
2782 | */ | ||
2783 | |||
2784 | -static int | ||
2785 | +static void | ||
2786 | mext_inode_double_unlock(struct inode *inode1, struct inode *inode2) | ||
2787 | { | ||
2788 | - int ret = 0; | ||
2789 | - | ||
2790 | - BUG_ON(inode1 == NULL && inode2 == NULL); | ||
2791 | - | ||
2792 | - ret = mext_check_null_inode(inode1, inode2, __func__, __LINE__); | ||
2793 | - if (ret < 0) | ||
2794 | - goto out; | ||
2795 | - | ||
2796 | - if (inode1) | ||
2797 | - mutex_unlock(&inode1->i_mutex); | ||
2798 | - | ||
2799 | - if (inode2 && inode2 != inode1) | ||
2800 | - mutex_unlock(&inode2->i_mutex); | ||
2801 | - | ||
2802 | -out: | ||
2803 | - return ret; | ||
2804 | + mutex_unlock(&inode1->i_mutex); | ||
2805 | + mutex_unlock(&inode2->i_mutex); | ||
2806 | } | ||
2807 | |||
2808 | /** | ||
2809 | @@ -1187,16 +1114,23 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp, | ||
2810 | ext4_lblk_t block_end, seq_start, add_blocks, file_end, seq_blocks = 0; | ||
2811 | ext4_lblk_t rest_blocks; | ||
2812 | pgoff_t orig_page_offset = 0, seq_end_page; | ||
2813 | - int ret1, ret2, depth, last_extent = 0; | ||
2814 | + int ret, depth, last_extent = 0; | ||
2815 | int blocks_per_page = PAGE_CACHE_SIZE >> orig_inode->i_blkbits; | ||
2816 | int data_offset_in_page; | ||
2817 | int block_len_in_page; | ||
2818 | int uninit; | ||
2819 | |||
2820 | - /* orig and donor should be different file */ | ||
2821 | - if (orig_inode->i_ino == donor_inode->i_ino) { | ||
2822 | + if (orig_inode->i_sb != donor_inode->i_sb) { | ||
2823 | + ext4_debug("ext4 move extent: The argument files " | ||
2824 | + "should be in same FS [ino:orig %lu, donor %lu]\n", | ||
2825 | + orig_inode->i_ino, donor_inode->i_ino); | ||
2826 | + return -EINVAL; | ||
2827 | + } | ||
2828 | + | ||
2829 | + /* orig and donor should be different inodes */ | ||
2830 | + if (orig_inode == donor_inode) { | ||
2831 | ext4_debug("ext4 move extent: The argument files should not " | ||
2832 | - "be same file [ino:orig %lu, donor %lu]\n", | ||
2833 | + "be same inode [ino:orig %lu, donor %lu]\n", | ||
2834 | orig_inode->i_ino, donor_inode->i_ino); | ||
2835 | return -EINVAL; | ||
2836 | } | ||
2837 | @@ -1208,18 +1142,21 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp, | ||
2838 | orig_inode->i_ino, donor_inode->i_ino); | ||
2839 | return -EINVAL; | ||
2840 | } | ||
2841 | - | ||
2842 | + /* TODO: This is non obvious task to swap blocks for inodes with full | ||
2843 | + jornaling enabled */ | ||
2844 | + if (ext4_should_journal_data(orig_inode) || | ||
2845 | + ext4_should_journal_data(donor_inode)) { | ||
2846 | + return -EINVAL; | ||
2847 | + } | ||
2848 | /* Protect orig and donor inodes against a truncate */ | ||
2849 | - ret1 = mext_inode_double_lock(orig_inode, donor_inode); | ||
2850 | - if (ret1 < 0) | ||
2851 | - return ret1; | ||
2852 | + mext_inode_double_lock(orig_inode, donor_inode); | ||
2853 | |||
2854 | /* Protect extent tree against block allocations via delalloc */ | ||
2855 | double_down_write_data_sem(orig_inode, donor_inode); | ||
2856 | /* Check the filesystem environment whether move_extent can be done */ | ||
2857 | - ret1 = mext_check_arguments(orig_inode, donor_inode, orig_start, | ||
2858 | + ret = mext_check_arguments(orig_inode, donor_inode, orig_start, | ||
2859 | donor_start, &len); | ||
2860 | - if (ret1) | ||
2861 | + if (ret) | ||
2862 | goto out; | ||
2863 | |||
2864 | file_end = (i_size_read(orig_inode) - 1) >> orig_inode->i_blkbits; | ||
2865 | @@ -1227,13 +1164,13 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp, | ||
2866 | if (file_end < block_end) | ||
2867 | len -= block_end - file_end; | ||
2868 | |||
2869 | - ret1 = get_ext_path(orig_inode, block_start, &orig_path); | ||
2870 | - if (ret1) | ||
2871 | + ret = get_ext_path(orig_inode, block_start, &orig_path); | ||
2872 | + if (ret) | ||
2873 | goto out; | ||
2874 | |||
2875 | /* Get path structure to check the hole */ | ||
2876 | - ret1 = get_ext_path(orig_inode, block_start, &holecheck_path); | ||
2877 | - if (ret1) | ||
2878 | + ret = get_ext_path(orig_inode, block_start, &holecheck_path); | ||
2879 | + if (ret) | ||
2880 | goto out; | ||
2881 | |||
2882 | depth = ext_depth(orig_inode); | ||
2883 | @@ -1252,13 +1189,13 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp, | ||
2884 | last_extent = mext_next_extent(orig_inode, | ||
2885 | holecheck_path, &ext_cur); | ||
2886 | if (last_extent < 0) { | ||
2887 | - ret1 = last_extent; | ||
2888 | + ret = last_extent; | ||
2889 | goto out; | ||
2890 | } | ||
2891 | last_extent = mext_next_extent(orig_inode, orig_path, | ||
2892 | &ext_dummy); | ||
2893 | if (last_extent < 0) { | ||
2894 | - ret1 = last_extent; | ||
2895 | + ret = last_extent; | ||
2896 | goto out; | ||
2897 | } | ||
2898 | seq_start = le32_to_cpu(ext_cur->ee_block); | ||
2899 | @@ -1272,7 +1209,7 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp, | ||
2900 | if (le32_to_cpu(ext_cur->ee_block) > block_end) { | ||
2901 | ext4_debug("ext4 move extent: The specified range of file " | ||
2902 | "may be the hole\n"); | ||
2903 | - ret1 = -EINVAL; | ||
2904 | + ret = -EINVAL; | ||
2905 | goto out; | ||
2906 | } | ||
2907 | |||
2908 | @@ -1292,7 +1229,7 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp, | ||
2909 | last_extent = mext_next_extent(orig_inode, holecheck_path, | ||
2910 | &ext_cur); | ||
2911 | if (last_extent < 0) { | ||
2912 | - ret1 = last_extent; | ||
2913 | + ret = last_extent; | ||
2914 | break; | ||
2915 | } | ||
2916 | add_blocks = ext4_ext_get_actual_len(ext_cur); | ||
2917 | @@ -1349,18 +1286,18 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp, | ||
2918 | orig_page_offset, | ||
2919 | data_offset_in_page, | ||
2920 | block_len_in_page, uninit, | ||
2921 | - &ret1); | ||
2922 | + &ret); | ||
2923 | |||
2924 | /* Count how many blocks we have exchanged */ | ||
2925 | *moved_len += block_len_in_page; | ||
2926 | - if (ret1 < 0) | ||
2927 | + if (ret < 0) | ||
2928 | break; | ||
2929 | if (*moved_len > len) { | ||
2930 | EXT4_ERROR_INODE(orig_inode, | ||
2931 | "We replaced blocks too much! " | ||
2932 | "sum of replaced: %llu requested: %llu", | ||
2933 | *moved_len, len); | ||
2934 | - ret1 = -EIO; | ||
2935 | + ret = -EIO; | ||
2936 | break; | ||
2937 | } | ||
2938 | |||
2939 | @@ -1374,22 +1311,22 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp, | ||
2940 | } | ||
2941 | |||
2942 | double_down_write_data_sem(orig_inode, donor_inode); | ||
2943 | - if (ret1 < 0) | ||
2944 | + if (ret < 0) | ||
2945 | break; | ||
2946 | |||
2947 | /* Decrease buffer counter */ | ||
2948 | if (holecheck_path) | ||
2949 | ext4_ext_drop_refs(holecheck_path); | ||
2950 | - ret1 = get_ext_path(orig_inode, seq_start, &holecheck_path); | ||
2951 | - if (ret1) | ||
2952 | + ret = get_ext_path(orig_inode, seq_start, &holecheck_path); | ||
2953 | + if (ret) | ||
2954 | break; | ||
2955 | depth = holecheck_path->p_depth; | ||
2956 | |||
2957 | /* Decrease buffer counter */ | ||
2958 | if (orig_path) | ||
2959 | ext4_ext_drop_refs(orig_path); | ||
2960 | - ret1 = get_ext_path(orig_inode, seq_start, &orig_path); | ||
2961 | - if (ret1) | ||
2962 | + ret = get_ext_path(orig_inode, seq_start, &orig_path); | ||
2963 | + if (ret) | ||
2964 | break; | ||
2965 | |||
2966 | ext_cur = holecheck_path[depth].p_ext; | ||
2967 | @@ -1412,12 +1349,7 @@ out: | ||
2968 | kfree(holecheck_path); | ||
2969 | } | ||
2970 | double_up_write_data_sem(orig_inode, donor_inode); | ||
2971 | - ret2 = mext_inode_double_unlock(orig_inode, donor_inode); | ||
2972 | - | ||
2973 | - if (ret1) | ||
2974 | - return ret1; | ||
2975 | - else if (ret2) | ||
2976 | - return ret2; | ||
2977 | + mext_inode_double_unlock(orig_inode, donor_inode); | ||
2978 | |||
2979 | - return 0; | ||
2980 | + return ret; | ||
2981 | } | ||
2982 | diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c | ||
2983 | index 2a42cc0..d13873d 100644 | ||
2984 | --- a/fs/ext4/namei.c | ||
2985 | +++ b/fs/ext4/namei.c | ||
2986 | @@ -2149,9 +2149,7 @@ retry: | ||
2987 | err = PTR_ERR(inode); | ||
2988 | if (!IS_ERR(inode)) { | ||
2989 | init_special_inode(inode, inode->i_mode, rdev); | ||
2990 | -#ifdef CONFIG_EXT4_FS_XATTR | ||
2991 | inode->i_op = &ext4_special_inode_operations; | ||
2992 | -#endif | ||
2993 | err = ext4_add_nondir(handle, dentry, inode); | ||
2994 | } | ||
2995 | ext4_journal_stop(handle); | ||
2996 | diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c | ||
2997 | index 41f6ef6..0be1789 100644 | ||
2998 | --- a/fs/ext4/resize.c | ||
2999 | +++ b/fs/ext4/resize.c | ||
3000 | @@ -200,8 +200,11 @@ static void free_flex_gd(struct ext4_new_flex_group_data *flex_gd) | ||
3001 | * be a partial of a flex group. | ||
3002 | * | ||
3003 | * @sb: super block of fs to which the groups belongs | ||
3004 | + * | ||
3005 | + * Returns 0 on a successful allocation of the metadata blocks in the | ||
3006 | + * block group. | ||
3007 | */ | ||
3008 | -static void ext4_alloc_group_tables(struct super_block *sb, | ||
3009 | +static int ext4_alloc_group_tables(struct super_block *sb, | ||
3010 | struct ext4_new_flex_group_data *flex_gd, | ||
3011 | int flexbg_size) | ||
3012 | { | ||
3013 | @@ -226,6 +229,8 @@ static void ext4_alloc_group_tables(struct super_block *sb, | ||
3014 | (last_group & ~(flexbg_size - 1)))); | ||
3015 | next_group: | ||
3016 | group = group_data[0].group; | ||
3017 | + if (src_group >= group_data[0].group + flex_gd->count) | ||
3018 | + return -ENOSPC; | ||
3019 | start_blk = ext4_group_first_block_no(sb, src_group); | ||
3020 | last_blk = start_blk + group_data[src_group - group].blocks_count; | ||
3021 | |||
3022 | @@ -235,7 +240,6 @@ next_group: | ||
3023 | |||
3024 | start_blk += overhead; | ||
3025 | |||
3026 | - BUG_ON(src_group >= group_data[0].group + flex_gd->count); | ||
3027 | /* We collect contiguous blocks as much as possible. */ | ||
3028 | src_group++; | ||
3029 | for (; src_group <= last_group; src_group++) | ||
3030 | @@ -300,6 +304,7 @@ next_group: | ||
3031 | group_data[i].free_blocks_count); | ||
3032 | } | ||
3033 | } | ||
3034 | + return 0; | ||
3035 | } | ||
3036 | |||
3037 | static struct buffer_head *bclean(handle_t *handle, struct super_block *sb, | ||
3038 | @@ -451,6 +456,9 @@ static int setup_new_flex_group_blocks(struct super_block *sb, | ||
3039 | gdblocks = ext4_bg_num_gdb(sb, group); | ||
3040 | start = ext4_group_first_block_no(sb, group); | ||
3041 | |||
3042 | + if (!ext4_bg_has_super(sb, group)) | ||
3043 | + goto handle_itb; | ||
3044 | + | ||
3045 | /* Copy all of the GDT blocks into the backup in this group */ | ||
3046 | for (j = 0, block = start + 1; j < gdblocks; j++, block++) { | ||
3047 | struct buffer_head *gdb; | ||
3048 | @@ -493,6 +501,7 @@ static int setup_new_flex_group_blocks(struct super_block *sb, | ||
3049 | goto out; | ||
3050 | } | ||
3051 | |||
3052 | +handle_itb: | ||
3053 | /* Initialize group tables of the grop @group */ | ||
3054 | if (!(bg_flags[i] & EXT4_BG_INODE_ZEROED)) | ||
3055 | goto handle_bb; | ||
3056 | @@ -1349,13 +1358,15 @@ exit_journal: | ||
3057 | err = err2; | ||
3058 | |||
3059 | if (!err) { | ||
3060 | - int i; | ||
3061 | + int gdb_num = group / EXT4_DESC_PER_BLOCK(sb); | ||
3062 | + int gdb_num_end = ((group + flex_gd->count - 1) / | ||
3063 | + EXT4_DESC_PER_BLOCK(sb)); | ||
3064 | + | ||
3065 | update_backups(sb, sbi->s_sbh->b_blocknr, (char *)es, | ||
3066 | sizeof(struct ext4_super_block)); | ||
3067 | - for (i = 0; i < flex_gd->count; i++, group++) { | ||
3068 | + for (; gdb_num <= gdb_num_end; gdb_num++) { | ||
3069 | struct buffer_head *gdb_bh; | ||
3070 | - int gdb_num; | ||
3071 | - gdb_num = group / EXT4_BLOCKS_PER_GROUP(sb); | ||
3072 | + | ||
3073 | gdb_bh = sbi->s_group_desc[gdb_num]; | ||
3074 | update_backups(sb, gdb_bh->b_blocknr, gdb_bh->b_data, | ||
3075 | gdb_bh->b_size); | ||
3076 | @@ -1729,7 +1740,8 @@ int ext4_resize_fs(struct super_block *sb, ext4_fsblk_t n_blocks_count) | ||
3077 | */ | ||
3078 | while (ext4_setup_next_flex_gd(sb, flex_gd, n_blocks_count, | ||
3079 | flexbg_size)) { | ||
3080 | - ext4_alloc_group_tables(sb, flex_gd, flexbg_size); | ||
3081 | + if (ext4_alloc_group_tables(sb, flex_gd, flexbg_size) != 0) | ||
3082 | + break; | ||
3083 | err = ext4_flex_group_add(sb, resize_inode, flex_gd); | ||
3084 | if (unlikely(err)) | ||
3085 | break; | ||
3086 | diff --git a/fs/ext4/super.c b/fs/ext4/super.c | ||
3087 | index c6e0cb3..e44b233 100644 | ||
3088 | --- a/fs/ext4/super.c | ||
3089 | +++ b/fs/ext4/super.c | ||
3090 | @@ -1735,7 +1735,7 @@ static inline void ext4_show_quota_options(struct seq_file *seq, | ||
3091 | |||
3092 | static const char *token2str(int token) | ||
3093 | { | ||
3094 | - static const struct match_token *t; | ||
3095 | + const struct match_token *t; | ||
3096 | |||
3097 | for (t = tokens; t->token != Opt_err; t++) | ||
3098 | if (t->token == token && !strchr(t->pattern, '=')) | ||
3099 | diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c | ||
3100 | index be3efc4..5602d73 100644 | ||
3101 | --- a/fs/fs-writeback.c | ||
3102 | +++ b/fs/fs-writeback.c | ||
3103 | @@ -63,6 +63,7 @@ int writeback_in_progress(struct backing_dev_info *bdi) | ||
3104 | { | ||
3105 | return test_bit(BDI_writeback_running, &bdi->state); | ||
3106 | } | ||
3107 | +EXPORT_SYMBOL(writeback_in_progress); | ||
3108 | |||
3109 | static inline struct backing_dev_info *inode_to_bdi(struct inode *inode) | ||
3110 | { | ||
3111 | diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c | ||
3112 | index e149b99..484b8d1 100644 | ||
3113 | --- a/fs/jbd2/journal.c | ||
3114 | +++ b/fs/jbd2/journal.c | ||
3115 | @@ -1354,6 +1354,11 @@ static void jbd2_mark_journal_empty(journal_t *journal) | ||
3116 | |||
3117 | BUG_ON(!mutex_is_locked(&journal->j_checkpoint_mutex)); | ||
3118 | read_lock(&journal->j_state_lock); | ||
3119 | + /* Is it already empty? */ | ||
3120 | + if (sb->s_start == 0) { | ||
3121 | + read_unlock(&journal->j_state_lock); | ||
3122 | + return; | ||
3123 | + } | ||
3124 | jbd_debug(1, "JBD2: Marking journal as empty (seq %d)\n", | ||
3125 | journal->j_tail_sequence); | ||
3126 | |||
3127 | diff --git a/fs/jffs2/super.c b/fs/jffs2/super.c | ||
3128 | index 61ea413..1224d6b 100644 | ||
3129 | --- a/fs/jffs2/super.c | ||
3130 | +++ b/fs/jffs2/super.c | ||
3131 | @@ -100,6 +100,10 @@ static int jffs2_sync_fs(struct super_block *sb, int wait) | ||
3132 | { | ||
3133 | struct jffs2_sb_info *c = JFFS2_SB_INFO(sb); | ||
3134 | |||
3135 | +#ifdef CONFIG_JFFS2_FS_WRITEBUFFER | ||
3136 | + cancel_delayed_work_sync(&c->wbuf_dwork); | ||
3137 | +#endif | ||
3138 | + | ||
3139 | mutex_lock(&c->alloc_sem); | ||
3140 | jffs2_flush_wbuf_pad(c); | ||
3141 | mutex_unlock(&c->alloc_sem); | ||
3142 | diff --git a/fs/jffs2/wbuf.c b/fs/jffs2/wbuf.c | ||
3143 | index 6f4529d..a6597d6 100644 | ||
3144 | --- a/fs/jffs2/wbuf.c | ||
3145 | +++ b/fs/jffs2/wbuf.c | ||
3146 | @@ -1044,10 +1044,10 @@ int jffs2_check_oob_empty(struct jffs2_sb_info *c, | ||
3147 | ops.datbuf = NULL; | ||
3148 | |||
3149 | ret = mtd_read_oob(c->mtd, jeb->offset, &ops); | ||
3150 | - if (ret || ops.oobretlen != ops.ooblen) { | ||
3151 | + if ((ret && !mtd_is_bitflip(ret)) || ops.oobretlen != ops.ooblen) { | ||
3152 | pr_err("cannot read OOB for EB at %08x, requested %zd bytes, read %zd bytes, error %d\n", | ||
3153 | jeb->offset, ops.ooblen, ops.oobretlen, ret); | ||
3154 | - if (!ret) | ||
3155 | + if (!ret || mtd_is_bitflip(ret)) | ||
3156 | ret = -EIO; | ||
3157 | return ret; | ||
3158 | } | ||
3159 | @@ -1086,10 +1086,10 @@ int jffs2_check_nand_cleanmarker(struct jffs2_sb_info *c, | ||
3160 | ops.datbuf = NULL; | ||
3161 | |||
3162 | ret = mtd_read_oob(c->mtd, jeb->offset, &ops); | ||
3163 | - if (ret || ops.oobretlen != ops.ooblen) { | ||
3164 | + if ((ret && !mtd_is_bitflip(ret)) || ops.oobretlen != ops.ooblen) { | ||
3165 | pr_err("cannot read OOB for EB at %08x, requested %zd bytes, read %zd bytes, error %d\n", | ||
3166 | jeb->offset, ops.ooblen, ops.oobretlen, ret); | ||
3167 | - if (!ret) | ||
3168 | + if (!ret || mtd_is_bitflip(ret)) | ||
3169 | ret = -EIO; | ||
3170 | return ret; | ||
3171 | } | ||
3172 | diff --git a/fs/nilfs2/file.c b/fs/nilfs2/file.c | ||
3173 | index a4d56ac..5b387a4 100644 | ||
3174 | --- a/fs/nilfs2/file.c | ||
3175 | +++ b/fs/nilfs2/file.c | ||
3176 | @@ -116,6 +116,7 @@ static int nilfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) | ||
3177 | if (unlikely(ret)) | ||
3178 | goto out; | ||
3179 | |||
3180 | + file_update_time(vma->vm_file); | ||
3181 | ret = __block_page_mkwrite(vma, vmf, nilfs_get_block); | ||
3182 | if (ret) { | ||
3183 | nilfs_transaction_abort(inode->i_sb); | ||
3184 | diff --git a/fs/proc/page.c b/fs/proc/page.c | ||
3185 | index 7fcd0d6..b8730d9 100644 | ||
3186 | --- a/fs/proc/page.c | ||
3187 | +++ b/fs/proc/page.c | ||
3188 | @@ -115,7 +115,13 @@ u64 stable_page_flags(struct page *page) | ||
3189 | u |= 1 << KPF_COMPOUND_TAIL; | ||
3190 | if (PageHuge(page)) | ||
3191 | u |= 1 << KPF_HUGE; | ||
3192 | - else if (PageTransCompound(page)) | ||
3193 | + /* | ||
3194 | + * PageTransCompound can be true for non-huge compound pages (slab | ||
3195 | + * pages or pages allocated by drivers with __GFP_COMP) because it | ||
3196 | + * just checks PG_head/PG_tail, so we need to check PageLRU to make | ||
3197 | + * sure a given page is a thp, not a non-huge compound page. | ||
3198 | + */ | ||
3199 | + else if (PageTransCompound(page) && PageLRU(compound_trans_head(page))) | ||
3200 | u |= 1 << KPF_THP; | ||
3201 | |||
3202 | /* | ||
3203 | diff --git a/include/linux/mempolicy.h b/include/linux/mempolicy.h | ||
3204 | index 95b738c..df08254 100644 | ||
3205 | --- a/include/linux/mempolicy.h | ||
3206 | +++ b/include/linux/mempolicy.h | ||
3207 | @@ -188,7 +188,7 @@ struct sp_node { | ||
3208 | |||
3209 | struct shared_policy { | ||
3210 | struct rb_root root; | ||
3211 | - spinlock_t lock; | ||
3212 | + struct mutex mutex; | ||
3213 | }; | ||
3214 | |||
3215 | void mpol_shared_policy_init(struct shared_policy *sp, struct mempolicy *mpol); | ||
3216 | diff --git a/include/net/ip_fib.h b/include/net/ip_fib.h | ||
3217 | index 926142e..9497be1 100644 | ||
3218 | --- a/include/net/ip_fib.h | ||
3219 | +++ b/include/net/ip_fib.h | ||
3220 | @@ -102,6 +102,7 @@ struct fib_info { | ||
3221 | unsigned char fib_dead; | ||
3222 | unsigned char fib_protocol; | ||
3223 | unsigned char fib_scope; | ||
3224 | + unsigned char fib_type; | ||
3225 | __be32 fib_prefsrc; | ||
3226 | u32 fib_priority; | ||
3227 | u32 *fib_metrics; | ||
3228 | diff --git a/kernel/rcutree.c b/kernel/rcutree.c | ||
3229 | index f280e54..f7bcd9e 100644 | ||
3230 | --- a/kernel/rcutree.c | ||
3231 | +++ b/kernel/rcutree.c | ||
3232 | @@ -305,7 +305,9 @@ cpu_has_callbacks_ready_to_invoke(struct rcu_data *rdp) | ||
3233 | static int | ||
3234 | cpu_needs_another_gp(struct rcu_state *rsp, struct rcu_data *rdp) | ||
3235 | { | ||
3236 | - return *rdp->nxttail[RCU_DONE_TAIL] && !rcu_gp_in_progress(rsp); | ||
3237 | + return *rdp->nxttail[RCU_DONE_TAIL + | ||
3238 | + ACCESS_ONCE(rsp->completed) != rdp->completed] && | ||
3239 | + !rcu_gp_in_progress(rsp); | ||
3240 | } | ||
3241 | |||
3242 | /* | ||
3243 | diff --git a/kernel/sched/core.c b/kernel/sched/core.c | ||
3244 | index 649c9f8..1a48cdb 100644 | ||
3245 | --- a/kernel/sched/core.c | ||
3246 | +++ b/kernel/sched/core.c | ||
3247 | @@ -5604,7 +5604,9 @@ migration_call(struct notifier_block *nfb, unsigned long action, void *hcpu) | ||
3248 | migrate_tasks(cpu); | ||
3249 | BUG_ON(rq->nr_running != 1); /* the migration thread */ | ||
3250 | raw_spin_unlock_irqrestore(&rq->lock, flags); | ||
3251 | + break; | ||
3252 | |||
3253 | + case CPU_DEAD: | ||
3254 | calc_load_migrate(rq); | ||
3255 | break; | ||
3256 | #endif | ||
3257 | diff --git a/kernel/sys.c b/kernel/sys.c | ||
3258 | index 241507f..6fab59a 100644 | ||
3259 | --- a/kernel/sys.c | ||
3260 | +++ b/kernel/sys.c | ||
3261 | @@ -368,6 +368,7 @@ EXPORT_SYMBOL(unregister_reboot_notifier); | ||
3262 | void kernel_restart(char *cmd) | ||
3263 | { | ||
3264 | kernel_restart_prepare(cmd); | ||
3265 | + disable_nonboot_cpus(); | ||
3266 | if (!cmd) | ||
3267 | printk(KERN_EMERG "Restarting system.\n"); | ||
3268 | else | ||
3269 | diff --git a/kernel/workqueue.c b/kernel/workqueue.c | ||
3270 | index 3c5a79e..872bd6d 100644 | ||
3271 | --- a/kernel/workqueue.c | ||
3272 | +++ b/kernel/workqueue.c | ||
3273 | @@ -1927,10 +1927,9 @@ static void move_linked_works(struct work_struct *work, struct list_head *head, | ||
3274 | *nextp = n; | ||
3275 | } | ||
3276 | |||
3277 | -static void cwq_activate_first_delayed(struct cpu_workqueue_struct *cwq) | ||
3278 | +static void cwq_activate_delayed_work(struct work_struct *work) | ||
3279 | { | ||
3280 | - struct work_struct *work = list_first_entry(&cwq->delayed_works, | ||
3281 | - struct work_struct, entry); | ||
3282 | + struct cpu_workqueue_struct *cwq = get_work_cwq(work); | ||
3283 | |||
3284 | trace_workqueue_activate_work(work); | ||
3285 | move_linked_works(work, &cwq->pool->worklist, NULL); | ||
3286 | @@ -1938,6 +1937,14 @@ static void cwq_activate_first_delayed(struct cpu_workqueue_struct *cwq) | ||
3287 | cwq->nr_active++; | ||
3288 | } | ||
3289 | |||
3290 | +static void cwq_activate_first_delayed(struct cpu_workqueue_struct *cwq) | ||
3291 | +{ | ||
3292 | + struct work_struct *work = list_first_entry(&cwq->delayed_works, | ||
3293 | + struct work_struct, entry); | ||
3294 | + | ||
3295 | + cwq_activate_delayed_work(work); | ||
3296 | +} | ||
3297 | + | ||
3298 | /** | ||
3299 | * cwq_dec_nr_in_flight - decrement cwq's nr_in_flight | ||
3300 | * @cwq: cwq of interest | ||
3301 | @@ -2073,7 +2080,9 @@ __acquires(&gcwq->lock) | ||
3302 | |||
3303 | spin_unlock_irq(&gcwq->lock); | ||
3304 | |||
3305 | + smp_wmb(); /* paired with test_and_set_bit(PENDING) */ | ||
3306 | work_clear_pending(work); | ||
3307 | + | ||
3308 | lock_map_acquire_read(&cwq->wq->lockdep_map); | ||
3309 | lock_map_acquire(&lockdep_map); | ||
3310 | trace_workqueue_execute_start(work); | ||
3311 | @@ -2844,6 +2853,18 @@ static int try_to_grab_pending(struct work_struct *work) | ||
3312 | smp_rmb(); | ||
3313 | if (gcwq == get_work_gcwq(work)) { | ||
3314 | debug_work_deactivate(work); | ||
3315 | + | ||
3316 | + /* | ||
3317 | + * A delayed work item cannot be grabbed directly | ||
3318 | + * because it might have linked NO_COLOR work items | ||
3319 | + * which, if left on the delayed_list, will confuse | ||
3320 | + * cwq->nr_active management later on and cause | ||
3321 | + * stall. Make sure the work item is activated | ||
3322 | + * before grabbing. | ||
3323 | + */ | ||
3324 | + if (*work_data_bits(work) & WORK_STRUCT_DELAYED) | ||
3325 | + cwq_activate_delayed_work(work); | ||
3326 | + | ||
3327 | list_del_init(&work->entry); | ||
3328 | cwq_dec_nr_in_flight(get_work_cwq(work), | ||
3329 | get_work_color(work), | ||
3330 | diff --git a/lib/gcd.c b/lib/gcd.c | ||
3331 | index cce4f3c..3657f12 100644 | ||
3332 | --- a/lib/gcd.c | ||
3333 | +++ b/lib/gcd.c | ||
3334 | @@ -9,6 +9,9 @@ unsigned long gcd(unsigned long a, unsigned long b) | ||
3335 | |||
3336 | if (a < b) | ||
3337 | swap(a, b); | ||
3338 | + | ||
3339 | + if (!b) | ||
3340 | + return a; | ||
3341 | while ((r = a % b) != 0) { | ||
3342 | a = b; | ||
3343 | b = r; | ||
3344 | diff --git a/mm/hugetlb.c b/mm/hugetlb.c | ||
3345 | index bc72712..3adceaf 100644 | ||
3346 | --- a/mm/hugetlb.c | ||
3347 | +++ b/mm/hugetlb.c | ||
3348 | @@ -2481,7 +2481,8 @@ static int unmap_ref_private(struct mm_struct *mm, struct vm_area_struct *vma, | ||
3349 | * from page cache lookup which is in HPAGE_SIZE units. | ||
3350 | */ | ||
3351 | address = address & huge_page_mask(h); | ||
3352 | - pgoff = vma_hugecache_offset(h, vma, address); | ||
3353 | + pgoff = ((address - vma->vm_start) >> PAGE_SHIFT) + | ||
3354 | + vma->vm_pgoff; | ||
3355 | mapping = vma->vm_file->f_dentry->d_inode->i_mapping; | ||
3356 | |||
3357 | /* | ||
3358 | diff --git a/mm/mempolicy.c b/mm/mempolicy.c | ||
3359 | index 4ada3be..3d64b36 100644 | ||
3360 | --- a/mm/mempolicy.c | ||
3361 | +++ b/mm/mempolicy.c | ||
3362 | @@ -607,6 +607,42 @@ check_range(struct mm_struct *mm, unsigned long start, unsigned long end, | ||
3363 | return first; | ||
3364 | } | ||
3365 | |||
3366 | +/* | ||
3367 | + * Apply policy to a single VMA | ||
3368 | + * This must be called with the mmap_sem held for writing. | ||
3369 | + */ | ||
3370 | +static int vma_replace_policy(struct vm_area_struct *vma, | ||
3371 | + struct mempolicy *pol) | ||
3372 | +{ | ||
3373 | + int err; | ||
3374 | + struct mempolicy *old; | ||
3375 | + struct mempolicy *new; | ||
3376 | + | ||
3377 | + pr_debug("vma %lx-%lx/%lx vm_ops %p vm_file %p set_policy %p\n", | ||
3378 | + vma->vm_start, vma->vm_end, vma->vm_pgoff, | ||
3379 | + vma->vm_ops, vma->vm_file, | ||
3380 | + vma->vm_ops ? vma->vm_ops->set_policy : NULL); | ||
3381 | + | ||
3382 | + new = mpol_dup(pol); | ||
3383 | + if (IS_ERR(new)) | ||
3384 | + return PTR_ERR(new); | ||
3385 | + | ||
3386 | + if (vma->vm_ops && vma->vm_ops->set_policy) { | ||
3387 | + err = vma->vm_ops->set_policy(vma, new); | ||
3388 | + if (err) | ||
3389 | + goto err_out; | ||
3390 | + } | ||
3391 | + | ||
3392 | + old = vma->vm_policy; | ||
3393 | + vma->vm_policy = new; /* protected by mmap_sem */ | ||
3394 | + mpol_put(old); | ||
3395 | + | ||
3396 | + return 0; | ||
3397 | + err_out: | ||
3398 | + mpol_put(new); | ||
3399 | + return err; | ||
3400 | +} | ||
3401 | + | ||
3402 | /* Step 2: apply policy to a range and do splits. */ | ||
3403 | static int mbind_range(struct mm_struct *mm, unsigned long start, | ||
3404 | unsigned long end, struct mempolicy *new_pol) | ||
3405 | @@ -655,23 +691,9 @@ static int mbind_range(struct mm_struct *mm, unsigned long start, | ||
3406 | if (err) | ||
3407 | goto out; | ||
3408 | } | ||
3409 | - | ||
3410 | - /* | ||
3411 | - * Apply policy to a single VMA. The reference counting of | ||
3412 | - * policy for vma_policy linkages has already been handled by | ||
3413 | - * vma_merge and split_vma as necessary. If this is a shared | ||
3414 | - * policy then ->set_policy will increment the reference count | ||
3415 | - * for an sp node. | ||
3416 | - */ | ||
3417 | - pr_debug("vma %lx-%lx/%lx vm_ops %p vm_file %p set_policy %p\n", | ||
3418 | - vma->vm_start, vma->vm_end, vma->vm_pgoff, | ||
3419 | - vma->vm_ops, vma->vm_file, | ||
3420 | - vma->vm_ops ? vma->vm_ops->set_policy : NULL); | ||
3421 | - if (vma->vm_ops && vma->vm_ops->set_policy) { | ||
3422 | - err = vma->vm_ops->set_policy(vma, new_pol); | ||
3423 | - if (err) | ||
3424 | - goto out; | ||
3425 | - } | ||
3426 | + err = vma_replace_policy(vma, new_pol); | ||
3427 | + if (err) | ||
3428 | + goto out; | ||
3429 | } | ||
3430 | |||
3431 | out: | ||
3432 | @@ -1530,8 +1552,18 @@ struct mempolicy *get_vma_policy(struct task_struct *task, | ||
3433 | addr); | ||
3434 | if (vpol) | ||
3435 | pol = vpol; | ||
3436 | - } else if (vma->vm_policy) | ||
3437 | + } else if (vma->vm_policy) { | ||
3438 | pol = vma->vm_policy; | ||
3439 | + | ||
3440 | + /* | ||
3441 | + * shmem_alloc_page() passes MPOL_F_SHARED policy with | ||
3442 | + * a pseudo vma whose vma->vm_ops=NULL. Take a reference | ||
3443 | + * count on these policies which will be dropped by | ||
3444 | + * mpol_cond_put() later | ||
3445 | + */ | ||
3446 | + if (mpol_needs_cond_ref(pol)) | ||
3447 | + mpol_get(pol); | ||
3448 | + } | ||
3449 | } | ||
3450 | if (!pol) | ||
3451 | pol = &default_policy; | ||
3452 | @@ -2061,7 +2093,7 @@ bool __mpol_equal(struct mempolicy *a, struct mempolicy *b) | ||
3453 | */ | ||
3454 | |||
3455 | /* lookup first element intersecting start-end */ | ||
3456 | -/* Caller holds sp->lock */ | ||
3457 | +/* Caller holds sp->mutex */ | ||
3458 | static struct sp_node * | ||
3459 | sp_lookup(struct shared_policy *sp, unsigned long start, unsigned long end) | ||
3460 | { | ||
3461 | @@ -2125,36 +2157,50 @@ mpol_shared_policy_lookup(struct shared_policy *sp, unsigned long idx) | ||
3462 | |||
3463 | if (!sp->root.rb_node) | ||
3464 | return NULL; | ||
3465 | - spin_lock(&sp->lock); | ||
3466 | + mutex_lock(&sp->mutex); | ||
3467 | sn = sp_lookup(sp, idx, idx+1); | ||
3468 | if (sn) { | ||
3469 | mpol_get(sn->policy); | ||
3470 | pol = sn->policy; | ||
3471 | } | ||
3472 | - spin_unlock(&sp->lock); | ||
3473 | + mutex_unlock(&sp->mutex); | ||
3474 | return pol; | ||
3475 | } | ||
3476 | |||
3477 | +static void sp_free(struct sp_node *n) | ||
3478 | +{ | ||
3479 | + mpol_put(n->policy); | ||
3480 | + kmem_cache_free(sn_cache, n); | ||
3481 | +} | ||
3482 | + | ||
3483 | static void sp_delete(struct shared_policy *sp, struct sp_node *n) | ||
3484 | { | ||
3485 | pr_debug("deleting %lx-l%lx\n", n->start, n->end); | ||
3486 | rb_erase(&n->nd, &sp->root); | ||
3487 | - mpol_put(n->policy); | ||
3488 | - kmem_cache_free(sn_cache, n); | ||
3489 | + sp_free(n); | ||
3490 | } | ||
3491 | |||
3492 | static struct sp_node *sp_alloc(unsigned long start, unsigned long end, | ||
3493 | struct mempolicy *pol) | ||
3494 | { | ||
3495 | - struct sp_node *n = kmem_cache_alloc(sn_cache, GFP_KERNEL); | ||
3496 | + struct sp_node *n; | ||
3497 | + struct mempolicy *newpol; | ||
3498 | |||
3499 | + n = kmem_cache_alloc(sn_cache, GFP_KERNEL); | ||
3500 | if (!n) | ||
3501 | return NULL; | ||
3502 | + | ||
3503 | + newpol = mpol_dup(pol); | ||
3504 | + if (IS_ERR(newpol)) { | ||
3505 | + kmem_cache_free(sn_cache, n); | ||
3506 | + return NULL; | ||
3507 | + } | ||
3508 | + newpol->flags |= MPOL_F_SHARED; | ||
3509 | + | ||
3510 | n->start = start; | ||
3511 | n->end = end; | ||
3512 | - mpol_get(pol); | ||
3513 | - pol->flags |= MPOL_F_SHARED; /* for unref */ | ||
3514 | - n->policy = pol; | ||
3515 | + n->policy = newpol; | ||
3516 | + | ||
3517 | return n; | ||
3518 | } | ||
3519 | |||
3520 | @@ -2162,10 +2208,10 @@ static struct sp_node *sp_alloc(unsigned long start, unsigned long end, | ||
3521 | static int shared_policy_replace(struct shared_policy *sp, unsigned long start, | ||
3522 | unsigned long end, struct sp_node *new) | ||
3523 | { | ||
3524 | - struct sp_node *n, *new2 = NULL; | ||
3525 | + struct sp_node *n; | ||
3526 | + int ret = 0; | ||
3527 | |||
3528 | -restart: | ||
3529 | - spin_lock(&sp->lock); | ||
3530 | + mutex_lock(&sp->mutex); | ||
3531 | n = sp_lookup(sp, start, end); | ||
3532 | /* Take care of old policies in the same range. */ | ||
3533 | while (n && n->start < end) { | ||
3534 | @@ -2178,16 +2224,14 @@ restart: | ||
3535 | } else { | ||
3536 | /* Old policy spanning whole new range. */ | ||
3537 | if (n->end > end) { | ||
3538 | + struct sp_node *new2; | ||
3539 | + new2 = sp_alloc(end, n->end, n->policy); | ||
3540 | if (!new2) { | ||
3541 | - spin_unlock(&sp->lock); | ||
3542 | - new2 = sp_alloc(end, n->end, n->policy); | ||
3543 | - if (!new2) | ||
3544 | - return -ENOMEM; | ||
3545 | - goto restart; | ||
3546 | + ret = -ENOMEM; | ||
3547 | + goto out; | ||
3548 | } | ||
3549 | n->end = start; | ||
3550 | sp_insert(sp, new2); | ||
3551 | - new2 = NULL; | ||
3552 | break; | ||
3553 | } else | ||
3554 | n->end = start; | ||
3555 | @@ -2198,12 +2242,9 @@ restart: | ||
3556 | } | ||
3557 | if (new) | ||
3558 | sp_insert(sp, new); | ||
3559 | - spin_unlock(&sp->lock); | ||
3560 | - if (new2) { | ||
3561 | - mpol_put(new2->policy); | ||
3562 | - kmem_cache_free(sn_cache, new2); | ||
3563 | - } | ||
3564 | - return 0; | ||
3565 | +out: | ||
3566 | + mutex_unlock(&sp->mutex); | ||
3567 | + return ret; | ||
3568 | } | ||
3569 | |||
3570 | /** | ||
3571 | @@ -2221,7 +2262,7 @@ void mpol_shared_policy_init(struct shared_policy *sp, struct mempolicy *mpol) | ||
3572 | int ret; | ||
3573 | |||
3574 | sp->root = RB_ROOT; /* empty tree == default mempolicy */ | ||
3575 | - spin_lock_init(&sp->lock); | ||
3576 | + mutex_init(&sp->mutex); | ||
3577 | |||
3578 | if (mpol) { | ||
3579 | struct vm_area_struct pvma; | ||
3580 | @@ -2275,7 +2316,7 @@ int mpol_set_shared_policy(struct shared_policy *info, | ||
3581 | } | ||
3582 | err = shared_policy_replace(info, vma->vm_pgoff, vma->vm_pgoff+sz, new); | ||
3583 | if (err && new) | ||
3584 | - kmem_cache_free(sn_cache, new); | ||
3585 | + sp_free(new); | ||
3586 | return err; | ||
3587 | } | ||
3588 | |||
3589 | @@ -2287,16 +2328,14 @@ void mpol_free_shared_policy(struct shared_policy *p) | ||
3590 | |||
3591 | if (!p->root.rb_node) | ||
3592 | return; | ||
3593 | - spin_lock(&p->lock); | ||
3594 | + mutex_lock(&p->mutex); | ||
3595 | next = rb_first(&p->root); | ||
3596 | while (next) { | ||
3597 | n = rb_entry(next, struct sp_node, nd); | ||
3598 | next = rb_next(&n->nd); | ||
3599 | - rb_erase(&n->nd, &p->root); | ||
3600 | - mpol_put(n->policy); | ||
3601 | - kmem_cache_free(sn_cache, n); | ||
3602 | + sp_delete(p, n); | ||
3603 | } | ||
3604 | - spin_unlock(&p->lock); | ||
3605 | + mutex_unlock(&p->mutex); | ||
3606 | } | ||
3607 | |||
3608 | /* assumes fs == KERNEL_DS */ | ||
3609 | diff --git a/mm/slab.c b/mm/slab.c | ||
3610 | index c685475..d066037 100644 | ||
3611 | --- a/mm/slab.c | ||
3612 | +++ b/mm/slab.c | ||
3613 | @@ -1781,9 +1781,6 @@ void __init kmem_cache_init_late(void) | ||
3614 | |||
3615 | slab_state = UP; | ||
3616 | |||
3617 | - /* Annotate slab for lockdep -- annotate the malloc caches */ | ||
3618 | - init_lock_keys(); | ||
3619 | - | ||
3620 | /* 6) resize the head arrays to their final sizes */ | ||
3621 | mutex_lock(&slab_mutex); | ||
3622 | list_for_each_entry(cachep, &slab_caches, list) | ||
3623 | @@ -1791,6 +1788,9 @@ void __init kmem_cache_init_late(void) | ||
3624 | BUG(); | ||
3625 | mutex_unlock(&slab_mutex); | ||
3626 | |||
3627 | + /* Annotate slab for lockdep -- annotate the malloc caches */ | ||
3628 | + init_lock_keys(); | ||
3629 | + | ||
3630 | /* Done! */ | ||
3631 | slab_state = FULL; | ||
3632 | |||
3633 | diff --git a/mm/truncate.c b/mm/truncate.c | ||
3634 | index 75801ac..f38055c 100644 | ||
3635 | --- a/mm/truncate.c | ||
3636 | +++ b/mm/truncate.c | ||
3637 | @@ -394,11 +394,12 @@ invalidate_complete_page2(struct address_space *mapping, struct page *page) | ||
3638 | if (page_has_private(page) && !try_to_release_page(page, GFP_KERNEL)) | ||
3639 | return 0; | ||
3640 | |||
3641 | + clear_page_mlock(page); | ||
3642 | + | ||
3643 | spin_lock_irq(&mapping->tree_lock); | ||
3644 | if (PageDirty(page)) | ||
3645 | goto failed; | ||
3646 | |||
3647 | - clear_page_mlock(page); | ||
3648 | BUG_ON(page_has_private(page)); | ||
3649 | __delete_from_page_cache(page); | ||
3650 | spin_unlock_irq(&mapping->tree_lock); | ||
3651 | diff --git a/net/8021q/vlan_core.c b/net/8021q/vlan_core.c | ||
3652 | index 8ca533c..830059d 100644 | ||
3653 | --- a/net/8021q/vlan_core.c | ||
3654 | +++ b/net/8021q/vlan_core.c | ||
3655 | @@ -105,7 +105,6 @@ static struct sk_buff *vlan_reorder_header(struct sk_buff *skb) | ||
3656 | return NULL; | ||
3657 | memmove(skb->data - ETH_HLEN, skb->data - VLAN_ETH_HLEN, 2 * ETH_ALEN); | ||
3658 | skb->mac_header += VLAN_HLEN; | ||
3659 | - skb_reset_mac_len(skb); | ||
3660 | return skb; | ||
3661 | } | ||
3662 | |||
3663 | @@ -139,6 +138,8 @@ struct sk_buff *vlan_untag(struct sk_buff *skb) | ||
3664 | |||
3665 | skb_reset_network_header(skb); | ||
3666 | skb_reset_transport_header(skb); | ||
3667 | + skb_reset_mac_len(skb); | ||
3668 | + | ||
3669 | return skb; | ||
3670 | |||
3671 | err_free: | ||
3672 | diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c | ||
3673 | index da80dc1..a747100 100644 | ||
3674 | --- a/net/ipv4/fib_semantics.c | ||
3675 | +++ b/net/ipv4/fib_semantics.c | ||
3676 | @@ -314,6 +314,7 @@ static struct fib_info *fib_find_info(const struct fib_info *nfi) | ||
3677 | nfi->fib_scope == fi->fib_scope && | ||
3678 | nfi->fib_prefsrc == fi->fib_prefsrc && | ||
3679 | nfi->fib_priority == fi->fib_priority && | ||
3680 | + nfi->fib_type == fi->fib_type && | ||
3681 | memcmp(nfi->fib_metrics, fi->fib_metrics, | ||
3682 | sizeof(u32) * RTAX_MAX) == 0 && | ||
3683 | ((nfi->fib_flags ^ fi->fib_flags) & ~RTNH_F_DEAD) == 0 && | ||
3684 | @@ -833,6 +834,7 @@ struct fib_info *fib_create_info(struct fib_config *cfg) | ||
3685 | fi->fib_flags = cfg->fc_flags; | ||
3686 | fi->fib_priority = cfg->fc_priority; | ||
3687 | fi->fib_prefsrc = cfg->fc_prefsrc; | ||
3688 | + fi->fib_type = cfg->fc_type; | ||
3689 | |||
3690 | fi->fib_nhs = nhs; | ||
3691 | change_nexthops(fi) { | ||
3692 | diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c | ||
3693 | index 6bc85f7..ea3e9af 100644 | ||
3694 | --- a/net/ipv6/addrconf.c | ||
3695 | +++ b/net/ipv6/addrconf.c | ||
3696 | @@ -788,10 +788,16 @@ static void ipv6_del_addr(struct inet6_ifaddr *ifp) | ||
3697 | struct in6_addr prefix; | ||
3698 | struct rt6_info *rt; | ||
3699 | struct net *net = dev_net(ifp->idev->dev); | ||
3700 | + struct flowi6 fl6 = {}; | ||
3701 | + | ||
3702 | ipv6_addr_prefix(&prefix, &ifp->addr, ifp->prefix_len); | ||
3703 | - rt = rt6_lookup(net, &prefix, NULL, ifp->idev->dev->ifindex, 1); | ||
3704 | + fl6.flowi6_oif = ifp->idev->dev->ifindex; | ||
3705 | + fl6.daddr = prefix; | ||
3706 | + rt = (struct rt6_info *)ip6_route_lookup(net, &fl6, | ||
3707 | + RT6_LOOKUP_F_IFACE); | ||
3708 | |||
3709 | - if (rt && addrconf_is_prefix_route(rt)) { | ||
3710 | + if (rt != net->ipv6.ip6_null_entry && | ||
3711 | + addrconf_is_prefix_route(rt)) { | ||
3712 | if (onlink == 0) { | ||
3713 | ip6_del_rt(rt); | ||
3714 | rt = NULL; | ||
3715 | diff --git a/net/ipv6/route.c b/net/ipv6/route.c | ||
3716 | index 854e401..46eff42 100644 | ||
3717 | --- a/net/ipv6/route.c | ||
3718 | +++ b/net/ipv6/route.c | ||
3719 | @@ -1589,17 +1589,18 @@ static int __ip6_del_rt(struct rt6_info *rt, struct nl_info *info) | ||
3720 | struct fib6_table *table; | ||
3721 | struct net *net = dev_net(rt->dst.dev); | ||
3722 | |||
3723 | - if (rt == net->ipv6.ip6_null_entry) | ||
3724 | - return -ENOENT; | ||
3725 | + if (rt == net->ipv6.ip6_null_entry) { | ||
3726 | + err = -ENOENT; | ||
3727 | + goto out; | ||
3728 | + } | ||
3729 | |||
3730 | table = rt->rt6i_table; | ||
3731 | write_lock_bh(&table->tb6_lock); | ||
3732 | - | ||
3733 | err = fib6_del(rt, info); | ||
3734 | - dst_release(&rt->dst); | ||
3735 | - | ||
3736 | write_unlock_bh(&table->tb6_lock); | ||
3737 | |||
3738 | +out: | ||
3739 | + dst_release(&rt->dst); | ||
3740 | return err; | ||
3741 | } | ||
3742 | |||
3743 | diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include | ||
3744 | index 6a3ee98..978416d 100644 | ||
3745 | --- a/scripts/Kbuild.include | ||
3746 | +++ b/scripts/Kbuild.include | ||
3747 | @@ -98,24 +98,24 @@ try-run = $(shell set -e; \ | ||
3748 | # Usage: cflags-y += $(call as-option,-Wa$(comma)-isa=foo,) | ||
3749 | |||
3750 | as-option = $(call try-run,\ | ||
3751 | - $(CC) $(KBUILD_CFLAGS) $(1) -c -xassembler /dev/null -o "$$TMP",$(1),$(2)) | ||
3752 | + $(CC) $(KBUILD_CFLAGS) $(1) -c -x assembler /dev/null -o "$$TMP",$(1),$(2)) | ||
3753 | |||
3754 | # as-instr | ||
3755 | # Usage: cflags-y += $(call as-instr,instr,option1,option2) | ||
3756 | |||
3757 | as-instr = $(call try-run,\ | ||
3758 | - printf "%b\n" "$(1)" | $(CC) $(KBUILD_AFLAGS) -c -xassembler -o "$$TMP" -,$(2),$(3)) | ||
3759 | + printf "%b\n" "$(1)" | $(CC) $(KBUILD_AFLAGS) -c -x assembler -o "$$TMP" -,$(2),$(3)) | ||
3760 | |||
3761 | # cc-option | ||
3762 | # Usage: cflags-y += $(call cc-option,-march=winchip-c6,-march=i586) | ||
3763 | |||
3764 | cc-option = $(call try-run,\ | ||
3765 | - $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -xc /dev/null -o "$$TMP",$(1),$(2)) | ||
3766 | + $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -x c /dev/null -o "$$TMP",$(1),$(2)) | ||
3767 | |||
3768 | # cc-option-yn | ||
3769 | # Usage: flag := $(call cc-option-yn,-march=winchip-c6) | ||
3770 | cc-option-yn = $(call try-run,\ | ||
3771 | - $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -xc /dev/null -o "$$TMP",y,n) | ||
3772 | + $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -x c /dev/null -o "$$TMP",y,n) | ||
3773 | |||
3774 | # cc-option-align | ||
3775 | # Prefix align with either -falign or -malign | ||
3776 | @@ -125,7 +125,7 @@ cc-option-align = $(subst -functions=0,,\ | ||
3777 | # cc-disable-warning | ||
3778 | # Usage: cflags-y += $(call cc-disable-warning,unused-but-set-variable) | ||
3779 | cc-disable-warning = $(call try-run,\ | ||
3780 | - $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) -W$(strip $(1)) -c -xc /dev/null -o "$$TMP",-Wno-$(strip $(1))) | ||
3781 | + $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) -W$(strip $(1)) -c -x c /dev/null -o "$$TMP",-Wno-$(strip $(1))) | ||
3782 | |||
3783 | # cc-version | ||
3784 | # Usage gcc-ver := $(call cc-version) | ||
3785 | @@ -143,7 +143,7 @@ cc-ifversion = $(shell [ $(call cc-version, $(CC)) $(1) $(2) ] && echo $(3)) | ||
3786 | # cc-ldoption | ||
3787 | # Usage: ldflags += $(call cc-ldoption, -Wl$(comma)--hash-style=both) | ||
3788 | cc-ldoption = $(call try-run,\ | ||
3789 | - $(CC) $(1) -nostdlib -xc /dev/null -o "$$TMP",$(1),$(2)) | ||
3790 | + $(CC) $(1) -nostdlib -x c /dev/null -o "$$TMP",$(1),$(2)) | ||
3791 | |||
3792 | # ld-option | ||
3793 | # Usage: LDFLAGS += $(call ld-option, -X) | ||
3794 | @@ -209,7 +209,7 @@ endif | ||
3795 | # >$< substitution to preserve $ when reloading .cmd file | ||
3796 | # note: when using inline perl scripts [perl -e '...$$t=1;...'] | ||
3797 | # in $(cmd_xxx) double $$ your perl vars | ||
3798 | -make-cmd = $(subst \#,\\\#,$(subst $$,$$$$,$(call escsq,$(cmd_$(1))))) | ||
3799 | +make-cmd = $(subst \\,\\\\,$(subst \#,\\\#,$(subst $$,$$$$,$(call escsq,$(cmd_$(1)))))) | ||
3800 | |||
3801 | # Find any prerequisites that is newer than target or that does not exist. | ||
3802 | # PHONY targets skipped in both cases. | ||
3803 | diff --git a/scripts/Makefile.fwinst b/scripts/Makefile.fwinst | ||
3804 | index 4d908d1..c3f69ae 100644 | ||
3805 | --- a/scripts/Makefile.fwinst | ||
3806 | +++ b/scripts/Makefile.fwinst | ||
3807 | @@ -27,7 +27,7 @@ endif | ||
3808 | installed-mod-fw := $(addprefix $(INSTALL_FW_PATH)/,$(mod-fw)) | ||
3809 | |||
3810 | installed-fw := $(addprefix $(INSTALL_FW_PATH)/,$(fw-shipped-all)) | ||
3811 | -installed-fw-dirs := $(sort $(dir $(installed-fw))) $(INSTALL_FW_PATH)/./ | ||
3812 | +installed-fw-dirs := $(sort $(dir $(installed-fw))) $(INSTALL_FW_PATH)/. | ||
3813 | |||
3814 | # Workaround for make < 3.81, where .SECONDEXPANSION doesn't work. | ||
3815 | PHONY += $(INSTALL_FW_PATH)/$$(%) install-all-dirs | ||
3816 | @@ -42,7 +42,7 @@ quiet_cmd_install = INSTALL $(subst $(srctree)/,,$@) | ||
3817 | $(installed-fw-dirs): | ||
3818 | $(call cmd,mkdir) | ||
3819 | |||
3820 | -$(installed-fw): $(INSTALL_FW_PATH)/%: $(obj)/% | $(INSTALL_FW_PATH)/$$(dir %) | ||
3821 | +$(installed-fw): $(INSTALL_FW_PATH)/%: $(obj)/% | $$(dir $(INSTALL_FW_PATH)/%) | ||
3822 | $(call cmd,install) | ||
3823 | |||
3824 | PHONY += __fw_install __fw_modinst FORCE | ||
3825 | diff --git a/scripts/gcc-version.sh b/scripts/gcc-version.sh | ||
3826 | index debecb5..7f2126d 100644 | ||
3827 | --- a/scripts/gcc-version.sh | ||
3828 | +++ b/scripts/gcc-version.sh | ||
3829 | @@ -22,10 +22,10 @@ if [ ${#compiler} -eq 0 ]; then | ||
3830 | exit 1 | ||
3831 | fi | ||
3832 | |||
3833 | -MAJOR=$(echo __GNUC__ | $compiler -E -xc - | tail -n 1) | ||
3834 | -MINOR=$(echo __GNUC_MINOR__ | $compiler -E -xc - | tail -n 1) | ||
3835 | +MAJOR=$(echo __GNUC__ | $compiler -E -x c - | tail -n 1) | ||
3836 | +MINOR=$(echo __GNUC_MINOR__ | $compiler -E -x c - | tail -n 1) | ||
3837 | if [ "x$with_patchlevel" != "x" ] ; then | ||
3838 | - PATCHLEVEL=$(echo __GNUC_PATCHLEVEL__ | $compiler -E -xc - | tail -n 1) | ||
3839 | + PATCHLEVEL=$(echo __GNUC_PATCHLEVEL__ | $compiler -E -x c - | tail -n 1) | ||
3840 | printf "%02d%02d%02d\\n" $MAJOR $MINOR $PATCHLEVEL | ||
3841 | else | ||
3842 | printf "%02d%02d\\n" $MAJOR $MINOR | ||
3843 | diff --git a/scripts/gcc-x86_32-has-stack-protector.sh b/scripts/gcc-x86_32-has-stack-protector.sh | ||
3844 | index 29493dc..12dbd0b 100644 | ||
3845 | --- a/scripts/gcc-x86_32-has-stack-protector.sh | ||
3846 | +++ b/scripts/gcc-x86_32-has-stack-protector.sh | ||
3847 | @@ -1,6 +1,6 @@ | ||
3848 | #!/bin/sh | ||
3849 | |||
3850 | -echo "int foo(void) { char X[200]; return 3; }" | $* -S -xc -c -O0 -fstack-protector - -o - 2> /dev/null | grep -q "%gs" | ||
3851 | +echo "int foo(void) { char X[200]; return 3; }" | $* -S -x c -c -O0 -fstack-protector - -o - 2> /dev/null | grep -q "%gs" | ||
3852 | if [ "$?" -eq "0" ] ; then | ||
3853 | echo y | ||
3854 | else | ||
3855 | diff --git a/scripts/gcc-x86_64-has-stack-protector.sh b/scripts/gcc-x86_64-has-stack-protector.sh | ||
3856 | index afaec61..973e8c1 100644 | ||
3857 | --- a/scripts/gcc-x86_64-has-stack-protector.sh | ||
3858 | +++ b/scripts/gcc-x86_64-has-stack-protector.sh | ||
3859 | @@ -1,6 +1,6 @@ | ||
3860 | #!/bin/sh | ||
3861 | |||
3862 | -echo "int foo(void) { char X[200]; return 3; }" | $* -S -xc -c -O0 -mcmodel=kernel -fstack-protector - -o - 2> /dev/null | grep -q "%gs" | ||
3863 | +echo "int foo(void) { char X[200]; return 3; }" | $* -S -x c -c -O0 -mcmodel=kernel -fstack-protector - -o - 2> /dev/null | grep -q "%gs" | ||
3864 | if [ "$?" -eq "0" ] ; then | ||
3865 | echo y | ||
3866 | else | ||
3867 | diff --git a/scripts/kconfig/check.sh b/scripts/kconfig/check.sh | ||
3868 | index fa59cbf..854d9c7 100755 | ||
3869 | --- a/scripts/kconfig/check.sh | ||
3870 | +++ b/scripts/kconfig/check.sh | ||
3871 | @@ -1,6 +1,6 @@ | ||
3872 | #!/bin/sh | ||
3873 | # Needed for systems without gettext | ||
3874 | -$* -xc -o /dev/null - > /dev/null 2>&1 << EOF | ||
3875 | +$* -x c -o /dev/null - > /dev/null 2>&1 << EOF | ||
3876 | #include <libintl.h> | ||
3877 | int main() | ||
3878 | { | ||
3879 | diff --git a/scripts/kconfig/lxdialog/check-lxdialog.sh b/scripts/kconfig/lxdialog/check-lxdialog.sh | ||
3880 | index e3b12c0..c8e8a71 100644 | ||
3881 | --- a/scripts/kconfig/lxdialog/check-lxdialog.sh | ||
3882 | +++ b/scripts/kconfig/lxdialog/check-lxdialog.sh | ||
3883 | @@ -38,7 +38,7 @@ trap "rm -f $tmp" 0 1 2 3 15 | ||
3884 | |||
3885 | # Check if we can link to ncurses | ||
3886 | check() { | ||
3887 | - $cc -xc - -o $tmp 2>/dev/null <<'EOF' | ||
3888 | + $cc -x c - -o $tmp 2>/dev/null <<'EOF' | ||
3889 | #include CURSES_LOC | ||
3890 | main() {} | ||
3891 | EOF | ||
3892 | diff --git a/scripts/kconfig/streamline_config.pl b/scripts/kconfig/streamline_config.pl | ||
3893 | index 2fbbbc1..5eb3777 100644 | ||
3894 | --- a/scripts/kconfig/streamline_config.pl | ||
3895 | +++ b/scripts/kconfig/streamline_config.pl | ||
3896 | @@ -605,6 +605,8 @@ foreach my $line (@config_file) { | ||
3897 | if (defined($configs{$1})) { | ||
3898 | if ($localyesconfig) { | ||
3899 | $setconfigs{$1} = 'y'; | ||
3900 | + print "$1=y\n"; | ||
3901 | + next; | ||
3902 | } else { | ||
3903 | $setconfigs{$1} = $2; | ||
3904 | } | ||
3905 | diff --git a/scripts/package/buildtar b/scripts/package/buildtar | ||
3906 | index 8a7b155..d0d748e 100644 | ||
3907 | --- a/scripts/package/buildtar | ||
3908 | +++ b/scripts/package/buildtar | ||
3909 | @@ -109,7 +109,7 @@ esac | ||
3910 | if tar --owner=root --group=root --help >/dev/null 2>&1; then | ||
3911 | opts="--owner=root --group=root" | ||
3912 | fi | ||
3913 | - tar cf - . $opts | ${compress} > "${tarball}${file_ext}" | ||
3914 | + tar cf - boot/* lib/* $opts | ${compress} > "${tarball}${file_ext}" | ||
3915 | ) | ||
3916 | |||
3917 | echo "Tarball successfully created in ${tarball}${file_ext}" | ||
3918 | diff --git a/sound/drivers/aloop.c b/sound/drivers/aloop.c | ||
3919 | index 5a34355..0fe6d64 100644 | ||
3920 | --- a/sound/drivers/aloop.c | ||
3921 | +++ b/sound/drivers/aloop.c | ||
3922 | @@ -120,6 +120,7 @@ struct loopback_pcm { | ||
3923 | unsigned int last_drift; | ||
3924 | unsigned long last_jiffies; | ||
3925 | struct timer_list timer; | ||
3926 | + spinlock_t timer_lock; | ||
3927 | }; | ||
3928 | |||
3929 | static struct platform_device *devices[SNDRV_CARDS]; | ||
3930 | @@ -170,6 +171,7 @@ static void loopback_timer_start(struct loopback_pcm *dpcm) | ||
3931 | unsigned long tick; | ||
3932 | unsigned int rate_shift = get_rate_shift(dpcm); | ||
3933 | |||
3934 | + spin_lock(&dpcm->timer_lock); | ||
3935 | if (rate_shift != dpcm->pcm_rate_shift) { | ||
3936 | dpcm->pcm_rate_shift = rate_shift; | ||
3937 | dpcm->period_size_frac = frac_pos(dpcm, dpcm->pcm_period_size); | ||
3938 | @@ -182,12 +184,15 @@ static void loopback_timer_start(struct loopback_pcm *dpcm) | ||
3939 | tick = (tick + dpcm->pcm_bps - 1) / dpcm->pcm_bps; | ||
3940 | dpcm->timer.expires = jiffies + tick; | ||
3941 | add_timer(&dpcm->timer); | ||
3942 | + spin_unlock(&dpcm->timer_lock); | ||
3943 | } | ||
3944 | |||
3945 | static inline void loopback_timer_stop(struct loopback_pcm *dpcm) | ||
3946 | { | ||
3947 | + spin_lock(&dpcm->timer_lock); | ||
3948 | del_timer(&dpcm->timer); | ||
3949 | dpcm->timer.expires = 0; | ||
3950 | + spin_unlock(&dpcm->timer_lock); | ||
3951 | } | ||
3952 | |||
3953 | #define CABLE_VALID_PLAYBACK (1 << SNDRV_PCM_STREAM_PLAYBACK) | ||
3954 | @@ -667,6 +672,7 @@ static int loopback_open(struct snd_pcm_substream *substream) | ||
3955 | dpcm->substream = substream; | ||
3956 | setup_timer(&dpcm->timer, loopback_timer_function, | ||
3957 | (unsigned long)dpcm); | ||
3958 | + spin_lock_init(&dpcm->timer_lock); | ||
3959 | |||
3960 | cable = loopback->cables[substream->number][dev]; | ||
3961 | if (!cable) { | ||
3962 | diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c | ||
3963 | index 1c65cc5..38fdefc 100644 | ||
3964 | --- a/sound/pci/hda/hda_codec.c | ||
3965 | +++ b/sound/pci/hda/hda_codec.c | ||
3966 | @@ -3580,7 +3580,7 @@ static inline void hda_exec_init_verbs(struct hda_codec *codec) {} | ||
3967 | /* | ||
3968 | * call suspend and power-down; used both from PM and power-save | ||
3969 | */ | ||
3970 | -static void hda_call_codec_suspend(struct hda_codec *codec) | ||
3971 | +static void hda_call_codec_suspend(struct hda_codec *codec, bool in_wq) | ||
3972 | { | ||
3973 | if (codec->patch_ops.suspend) | ||
3974 | codec->patch_ops.suspend(codec); | ||
3975 | @@ -3589,7 +3589,9 @@ static void hda_call_codec_suspend(struct hda_codec *codec) | ||
3976 | codec->afg ? codec->afg : codec->mfg, | ||
3977 | AC_PWRST_D3); | ||
3978 | #ifdef CONFIG_SND_HDA_POWER_SAVE | ||
3979 | - cancel_delayed_work(&codec->power_work); | ||
3980 | + /* Cancel delayed work if we aren't currently running from it. */ | ||
3981 | + if (!in_wq) | ||
3982 | + cancel_delayed_work_sync(&codec->power_work); | ||
3983 | spin_lock(&codec->power_lock); | ||
3984 | snd_hda_update_power_acct(codec); | ||
3985 | trace_hda_power_down(codec); | ||
3986 | @@ -4410,7 +4412,7 @@ static void hda_power_work(struct work_struct *work) | ||
3987 | } | ||
3988 | spin_unlock(&codec->power_lock); | ||
3989 | |||
3990 | - hda_call_codec_suspend(codec); | ||
3991 | + hda_call_codec_suspend(codec, true); | ||
3992 | if (bus->ops.pm_notify) | ||
3993 | bus->ops.pm_notify(bus); | ||
3994 | } | ||
3995 | @@ -5076,7 +5078,7 @@ int snd_hda_suspend(struct hda_bus *bus) | ||
3996 | |||
3997 | list_for_each_entry(codec, &bus->codec_list, list) { | ||
3998 | if (hda_codec_is_power_on(codec)) | ||
3999 | - hda_call_codec_suspend(codec); | ||
4000 | + hda_call_codec_suspend(codec, false); | ||
4001 | } | ||
4002 | return 0; | ||
4003 | } | ||
4004 | diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c | ||
4005 | index c4763c5..12a9432 100644 | ||
4006 | --- a/sound/pci/hda/hda_intel.c | ||
4007 | +++ b/sound/pci/hda/hda_intel.c | ||
4008 | @@ -538,6 +538,7 @@ enum { | ||
4009 | #define AZX_DCAPS_ALIGN_BUFSIZE (1 << 22) /* buffer size alignment */ | ||
4010 | #define AZX_DCAPS_4K_BDLE_BOUNDARY (1 << 23) /* BDLE in 4k boundary */ | ||
4011 | #define AZX_DCAPS_POSFIX_COMBO (1 << 24) /* Use COMBO as default */ | ||
4012 | +#define AZX_DCAPS_COUNT_LPIB_DELAY (1 << 25) /* Take LPIB as delay */ | ||
4013 | |||
4014 | /* quirks for ATI SB / AMD Hudson */ | ||
4015 | #define AZX_DCAPS_PRESET_ATI_SB \ | ||
4016 | @@ -2120,6 +2121,27 @@ static unsigned int azx_get_position(struct azx *chip, | ||
4017 | |||
4018 | if (pos >= azx_dev->bufsize) | ||
4019 | pos = 0; | ||
4020 | + | ||
4021 | + /* calculate runtime delay from LPIB */ | ||
4022 | + if (azx_dev->substream->runtime && | ||
4023 | + chip->position_fix[stream] == POS_FIX_POSBUF && | ||
4024 | + (chip->driver_caps & AZX_DCAPS_COUNT_LPIB_DELAY)) { | ||
4025 | + unsigned int lpib_pos = azx_sd_readl(azx_dev, SD_LPIB); | ||
4026 | + int delay; | ||
4027 | + if (stream == SNDRV_PCM_STREAM_PLAYBACK) | ||
4028 | + delay = pos - lpib_pos; | ||
4029 | + else | ||
4030 | + delay = lpib_pos - pos; | ||
4031 | + if (delay < 0) | ||
4032 | + delay += azx_dev->bufsize; | ||
4033 | + if (delay >= azx_dev->period_bytes) { | ||
4034 | + snd_printdd("delay %d > period_bytes %d\n", | ||
4035 | + delay, azx_dev->period_bytes); | ||
4036 | + delay = 0; /* something is wrong */ | ||
4037 | + } | ||
4038 | + azx_dev->substream->runtime->delay = | ||
4039 | + bytes_to_frames(azx_dev->substream->runtime, delay); | ||
4040 | + } | ||
4041 | return pos; | ||
4042 | } | ||
4043 | |||
4044 | @@ -3260,7 +3282,7 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = { | ||
4045 | /* CPT */ | ||
4046 | { PCI_DEVICE(0x8086, 0x1c20), | ||
4047 | .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP | | ||
4048 | - AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_COMBO }, | ||
4049 | + AZX_DCAPS_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY }, | ||
4050 | /* PBG */ | ||
4051 | { PCI_DEVICE(0x8086, 0x1d20), | ||
4052 | .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP | | ||
4053 | @@ -3268,23 +3290,26 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = { | ||
4054 | /* Panther Point */ | ||
4055 | { PCI_DEVICE(0x8086, 0x1e20), | ||
4056 | .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP | | ||
4057 | - AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_COMBO }, | ||
4058 | + AZX_DCAPS_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY }, | ||
4059 | /* Lynx Point */ | ||
4060 | { PCI_DEVICE(0x8086, 0x8c20), | ||
4061 | .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP | | ||
4062 | - AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_COMBO }, | ||
4063 | + AZX_DCAPS_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY }, | ||
4064 | /* Lynx Point-LP */ | ||
4065 | { PCI_DEVICE(0x8086, 0x9c20), | ||
4066 | .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP | | ||
4067 | - AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_COMBO }, | ||
4068 | + AZX_DCAPS_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY }, | ||
4069 | /* Lynx Point-LP */ | ||
4070 | { PCI_DEVICE(0x8086, 0x9c21), | ||
4071 | .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP | | ||
4072 | - AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_COMBO }, | ||
4073 | + AZX_DCAPS_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY }, | ||
4074 | /* Haswell */ | ||
4075 | { PCI_DEVICE(0x8086, 0x0c0c), | ||
4076 | .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP | | ||
4077 | - AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_COMBO }, | ||
4078 | + AZX_DCAPS_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY }, | ||
4079 | + { PCI_DEVICE(0x8086, 0x0d0c), | ||
4080 | + .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP | | ||
4081 | + AZX_DCAPS_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY }, | ||
4082 | /* SCH */ | ||
4083 | { PCI_DEVICE(0x8086, 0x811b), | ||
4084 | .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP | | ||
4085 | diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c | ||
4086 | index 5e22a8f..784017e 100644 | ||
4087 | --- a/sound/pci/hda/patch_conexant.c | ||
4088 | +++ b/sound/pci/hda/patch_conexant.c | ||
4089 | @@ -4462,6 +4462,7 @@ static const struct snd_pci_quirk cxt5066_fixups[] = { | ||
4090 | SND_PCI_QUIRK(0x17aa, 0x21ce, "Lenovo T420", CXT_PINCFG_LENOVO_TP410), | ||
4091 | SND_PCI_QUIRK(0x17aa, 0x21cf, "Lenovo T520", CXT_PINCFG_LENOVO_TP410), | ||
4092 | SND_PCI_QUIRK(0x17aa, 0x3975, "Lenovo U300s", CXT_FIXUP_STEREO_DMIC), | ||
4093 | + SND_PCI_QUIRK(0x17aa, 0x3977, "Lenovo IdeaPad U310", CXT_FIXUP_STEREO_DMIC), | ||
4094 | SND_PCI_QUIRK(0x17aa, 0x397b, "Lenovo S205", CXT_FIXUP_STEREO_DMIC), | ||
4095 | {} | ||
4096 | }; | ||
4097 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c | ||
4098 | index 4f81dd4..56a3eef 100644 | ||
4099 | --- a/sound/pci/hda/patch_realtek.c | ||
4100 | +++ b/sound/pci/hda/patch_realtek.c | ||
4101 | @@ -6334,6 +6334,12 @@ static int patch_alc269(struct hda_codec *codec) | ||
4102 | |||
4103 | spec = codec->spec; | ||
4104 | |||
4105 | + alc_pick_fixup(codec, alc269_fixup_models, | ||
4106 | + alc269_fixup_tbl, alc269_fixups); | ||
4107 | + alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); | ||
4108 | + | ||
4109 | + alc_auto_parse_customize_define(codec); | ||
4110 | + | ||
4111 | if (codec->vendor_id == 0x10ec0269) { | ||
4112 | spec->codec_variant = ALC269_TYPE_ALC269VA; | ||
4113 | switch (alc_get_coef0(codec) & 0x00f0) { | ||
4114 | @@ -6361,12 +6367,6 @@ static int patch_alc269(struct hda_codec *codec) | ||
4115 | alc269_fill_coef(codec); | ||
4116 | } | ||
4117 | |||
4118 | - alc_pick_fixup(codec, alc269_fixup_models, | ||
4119 | - alc269_fixup_tbl, alc269_fixups); | ||
4120 | - alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); | ||
4121 | - | ||
4122 | - alc_auto_parse_customize_define(codec); | ||
4123 | - | ||
4124 | /* automatic parse from the BIOS config */ | ||
4125 | err = alc269_parse_auto_config(codec); | ||
4126 | if (err < 0) | ||
4127 | diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c | ||
4128 | index 4307717..4b4072f 100644 | ||
4129 | --- a/sound/pci/hda/patch_via.c | ||
4130 | +++ b/sound/pci/hda/patch_via.c | ||
4131 | @@ -1672,7 +1672,8 @@ static void via_hp_automute(struct hda_codec *codec) | ||
4132 | struct via_spec *spec = codec->spec; | ||
4133 | |||
4134 | if (!spec->hp_independent_mode && spec->autocfg.hp_pins[0] && | ||
4135 | - (spec->codec_type != VT1708 || spec->vt1708_jack_detect)) | ||
4136 | + (spec->codec_type != VT1708 || spec->vt1708_jack_detect) && | ||
4137 | + is_jack_detectable(codec, spec->autocfg.hp_pins[0])) | ||
4138 | present = snd_hda_jack_detect(codec, spec->autocfg.hp_pins[0]); | ||
4139 | |||
4140 | if (spec->smart51_enabled) | ||
4141 | @@ -3669,6 +3670,32 @@ static void set_widgets_power_state_vt2002P(struct hda_codec *codec) | ||
4142 | update_power_state(codec, 0x21, AC_PWRST_D3); | ||
4143 | } | ||
4144 | |||
4145 | +/* | ||
4146 | + * pin fix-up | ||
4147 | + */ | ||
4148 | +enum { | ||
4149 | + VIA_FIXUP_INTMIC_BOOST, | ||
4150 | +}; | ||
4151 | + | ||
4152 | +static void via_fixup_intmic_boost(struct hda_codec *codec, | ||
4153 | + const struct hda_fixup *fix, int action) | ||
4154 | +{ | ||
4155 | + if (action == HDA_FIXUP_ACT_PRE_PROBE) | ||
4156 | + override_mic_boost(codec, 0x30, 0, 2, 40); | ||
4157 | +} | ||
4158 | + | ||
4159 | +static const struct hda_fixup via_fixups[] = { | ||
4160 | + [VIA_FIXUP_INTMIC_BOOST] = { | ||
4161 | + .type = HDA_FIXUP_FUNC, | ||
4162 | + .v.func = via_fixup_intmic_boost, | ||
4163 | + }, | ||
4164 | +}; | ||
4165 | + | ||
4166 | +static const struct snd_pci_quirk vt2002p_fixups[] = { | ||
4167 | + SND_PCI_QUIRK(0x1043, 0x8532, "Asus X202E", VIA_FIXUP_INTMIC_BOOST), | ||
4168 | + {} | ||
4169 | +}; | ||
4170 | + | ||
4171 | /* patch for vt2002P */ | ||
4172 | static int patch_vt2002P(struct hda_codec *codec) | ||
4173 | { | ||
4174 | @@ -3685,6 +3712,9 @@ static int patch_vt2002P(struct hda_codec *codec) | ||
4175 | override_mic_boost(codec, 0x29, 0, 3, 40); | ||
4176 | add_secret_dac_path(codec); | ||
4177 | |||
4178 | + snd_hda_pick_fixup(codec, NULL, vt2002p_fixups, via_fixups); | ||
4179 | + snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); | ||
4180 | + | ||
4181 | /* automatic parse from the BIOS config */ | ||
4182 | err = via_parse_auto_config(codec); | ||
4183 | if (err < 0) { | ||
4184 | diff --git a/sound/soc/codecs/wm5110.c b/sound/soc/codecs/wm5110.c | ||
4185 | index 01ebbcc..11dfc33 100644 | ||
4186 | --- a/sound/soc/codecs/wm5110.c | ||
4187 | +++ b/sound/soc/codecs/wm5110.c | ||
4188 | @@ -869,6 +869,8 @@ static unsigned int wm5110_digital_vu[] = { | ||
4189 | ARIZONA_ADC_DIGITAL_VOLUME_2R, | ||
4190 | ARIZONA_ADC_DIGITAL_VOLUME_3L, | ||
4191 | ARIZONA_ADC_DIGITAL_VOLUME_3R, | ||
4192 | + ARIZONA_ADC_DIGITAL_VOLUME_4L, | ||
4193 | + ARIZONA_ADC_DIGITAL_VOLUME_4R, | ||
4194 | |||
4195 | ARIZONA_DAC_DIGITAL_VOLUME_1L, | ||
4196 | ARIZONA_DAC_DIGITAL_VOLUME_1R, | ||
4197 | @@ -880,6 +882,8 @@ static unsigned int wm5110_digital_vu[] = { | ||
4198 | ARIZONA_DAC_DIGITAL_VOLUME_4R, | ||
4199 | ARIZONA_DAC_DIGITAL_VOLUME_5L, | ||
4200 | ARIZONA_DAC_DIGITAL_VOLUME_5R, | ||
4201 | + ARIZONA_DAC_DIGITAL_VOLUME_6L, | ||
4202 | + ARIZONA_DAC_DIGITAL_VOLUME_6R, | ||
4203 | }; | ||
4204 | |||
4205 | static struct snd_soc_codec_driver soc_codec_dev_wm5110 = { | ||
4206 | diff --git a/sound/soc/codecs/wm9712.c b/sound/soc/codecs/wm9712.c | ||
4207 | index c6d2076..c9516f0 100644 | ||
4208 | --- a/sound/soc/codecs/wm9712.c | ||
4209 | +++ b/sound/soc/codecs/wm9712.c | ||
4210 | @@ -146,7 +146,7 @@ SOC_SINGLE("Playback Attenuate (-6dB) Switch", AC97_MASTER_TONE, 6, 1, 0), | ||
4211 | SOC_SINGLE("Bass Volume", AC97_MASTER_TONE, 8, 15, 1), | ||
4212 | SOC_SINGLE("Treble Volume", AC97_MASTER_TONE, 0, 15, 1), | ||
4213 | |||
4214 | -SOC_SINGLE("Capture ADC Switch", AC97_REC_GAIN, 15, 1, 1), | ||
4215 | +SOC_SINGLE("Capture Switch", AC97_REC_GAIN, 15, 1, 1), | ||
4216 | SOC_ENUM("Capture Volume Steps", wm9712_enum[6]), | ||
4217 | SOC_DOUBLE("Capture Volume", AC97_REC_GAIN, 8, 0, 63, 0), | ||
4218 | SOC_SINGLE("Capture ZC Switch", AC97_REC_GAIN, 7, 1, 0), | ||
4219 | diff --git a/sound/soc/codecs/wm_hubs.c b/sound/soc/codecs/wm_hubs.c | ||
4220 | index 61baa48..57b27ef 100644 | ||
4221 | --- a/sound/soc/codecs/wm_hubs.c | ||
4222 | +++ b/sound/soc/codecs/wm_hubs.c | ||
4223 | @@ -634,6 +634,11 @@ void wm_hubs_update_class_w(struct snd_soc_codec *codec) | ||
4224 | |||
4225 | snd_soc_update_bits(codec, WM8993_CLASS_W_0, | ||
4226 | WM8993_CP_DYN_V | WM8993_CP_DYN_FREQ, enable); | ||
4227 | + | ||
4228 | + snd_soc_write(codec, WM8993_LEFT_OUTPUT_VOLUME, | ||
4229 | + snd_soc_read(codec, WM8993_LEFT_OUTPUT_VOLUME)); | ||
4230 | + snd_soc_write(codec, WM8993_RIGHT_OUTPUT_VOLUME, | ||
4231 | + snd_soc_read(codec, WM8993_RIGHT_OUTPUT_VOLUME)); | ||
4232 | } | ||
4233 | EXPORT_SYMBOL_GPL(wm_hubs_update_class_w); | ||
4234 | |||
4235 | diff --git a/sound/usb/card.h b/sound/usb/card.h | ||
4236 | index 2b9ffff..d9d2b5a 100644 | ||
4237 | --- a/sound/usb/card.h | ||
4238 | +++ b/sound/usb/card.h | ||
4239 | @@ -92,6 +92,8 @@ struct snd_usb_endpoint { | ||
4240 | unsigned char silence_value; | ||
4241 | unsigned int stride; | ||
4242 | int iface, alt_idx; | ||
4243 | + int skip_packets; /* quirks for devices to ignore the first n packets | ||
4244 | + in a stream */ | ||
4245 | |||
4246 | spinlock_t lock; | ||
4247 | struct list_head list; | ||
4248 | diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c | ||
4249 | index 060dccb..d9de667 100644 | ||
4250 | --- a/sound/usb/endpoint.c | ||
4251 | +++ b/sound/usb/endpoint.c | ||
4252 | @@ -31,6 +31,7 @@ | ||
4253 | #include "card.h" | ||
4254 | #include "endpoint.h" | ||
4255 | #include "pcm.h" | ||
4256 | +#include "quirks.h" | ||
4257 | |||
4258 | #define EP_FLAG_ACTIVATED 0 | ||
4259 | #define EP_FLAG_RUNNING 1 | ||
4260 | @@ -170,6 +171,11 @@ static void retire_inbound_urb(struct snd_usb_endpoint *ep, | ||
4261 | { | ||
4262 | struct urb *urb = urb_ctx->urb; | ||
4263 | |||
4264 | + if (unlikely(ep->skip_packets > 0)) { | ||
4265 | + ep->skip_packets--; | ||
4266 | + return; | ||
4267 | + } | ||
4268 | + | ||
4269 | if (ep->sync_slave) | ||
4270 | snd_usb_handle_sync_urb(ep->sync_slave, ep, urb); | ||
4271 | |||
4272 | @@ -828,6 +834,8 @@ int snd_usb_endpoint_start(struct snd_usb_endpoint *ep, int can_sleep) | ||
4273 | ep->unlink_mask = 0; | ||
4274 | ep->phase = 0; | ||
4275 | |||
4276 | + snd_usb_endpoint_start_quirk(ep); | ||
4277 | + | ||
4278 | /* | ||
4279 | * If this endpoint has a data endpoint as implicit feedback source, | ||
4280 | * don't start the urbs here. Instead, mark them all as available, | ||
4281 | diff --git a/sound/usb/helper.c b/sound/usb/helper.c | ||
4282 | index 9eed8f4..c1db28f 100644 | ||
4283 | --- a/sound/usb/helper.c | ||
4284 | +++ b/sound/usb/helper.c | ||
4285 | @@ -21,6 +21,7 @@ | ||
4286 | |||
4287 | #include "usbaudio.h" | ||
4288 | #include "helper.h" | ||
4289 | +#include "quirks.h" | ||
4290 | |||
4291 | /* | ||
4292 | * combine bytes and get an integer value | ||
4293 | @@ -97,6 +98,10 @@ int snd_usb_ctl_msg(struct usb_device *dev, unsigned int pipe, __u8 request, | ||
4294 | memcpy(data, buf, size); | ||
4295 | kfree(buf); | ||
4296 | } | ||
4297 | + | ||
4298 | + snd_usb_ctl_msg_quirk(dev, pipe, request, requesttype, | ||
4299 | + value, index, data, size); | ||
4300 | + | ||
4301 | return err; | ||
4302 | } | ||
4303 | |||
4304 | diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c | ||
4305 | index 4f40ba8..fe56c9d 100644 | ||
4306 | --- a/sound/usb/mixer.c | ||
4307 | +++ b/sound/usb/mixer.c | ||
4308 | @@ -1267,6 +1267,13 @@ static int parse_audio_feature_unit(struct mixer_build *state, int unitid, void | ||
4309 | /* disable non-functional volume control */ | ||
4310 | master_bits &= ~UAC_CONTROL_BIT(UAC_FU_VOLUME); | ||
4311 | break; | ||
4312 | + case USB_ID(0x1130, 0xf211): | ||
4313 | + snd_printk(KERN_INFO | ||
4314 | + "usbmixer: volume control quirk for Tenx TP6911 Audio Headset\n"); | ||
4315 | + /* disable non-functional volume control */ | ||
4316 | + channels = 0; | ||
4317 | + break; | ||
4318 | + | ||
4319 | } | ||
4320 | if (channels > 0) | ||
4321 | first_ch_bits = snd_usb_combine_bytes(bmaControls + csize, csize); | ||
4322 | diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h | ||
4323 | index 79780fa..d73ac9b 100644 | ||
4324 | --- a/sound/usb/quirks-table.h | ||
4325 | +++ b/sound/usb/quirks-table.h | ||
4326 | @@ -2781,6 +2781,59 @@ YAMAHA_DEVICE(0x7010, "UB99"), | ||
4327 | } | ||
4328 | }, | ||
4329 | |||
4330 | +/* Microsoft XboxLive Headset/Xbox Communicator */ | ||
4331 | +{ | ||
4332 | + USB_DEVICE(0x045e, 0x0283), | ||
4333 | + .bInterfaceClass = USB_CLASS_PER_INTERFACE, | ||
4334 | + .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { | ||
4335 | + .vendor_name = "Microsoft", | ||
4336 | + .product_name = "XboxLive Headset/Xbox Communicator", | ||
4337 | + .ifnum = QUIRK_ANY_INTERFACE, | ||
4338 | + .type = QUIRK_COMPOSITE, | ||
4339 | + .data = &(const struct snd_usb_audio_quirk[]) { | ||
4340 | + { | ||
4341 | + /* playback */ | ||
4342 | + .ifnum = 0, | ||
4343 | + .type = QUIRK_AUDIO_FIXED_ENDPOINT, | ||
4344 | + .data = &(const struct audioformat) { | ||
4345 | + .formats = SNDRV_PCM_FMTBIT_S16_LE, | ||
4346 | + .channels = 1, | ||
4347 | + .iface = 0, | ||
4348 | + .altsetting = 0, | ||
4349 | + .altset_idx = 0, | ||
4350 | + .attributes = 0, | ||
4351 | + .endpoint = 0x04, | ||
4352 | + .ep_attr = 0x05, | ||
4353 | + .rates = SNDRV_PCM_RATE_CONTINUOUS, | ||
4354 | + .rate_min = 22050, | ||
4355 | + .rate_max = 22050 | ||
4356 | + } | ||
4357 | + }, | ||
4358 | + { | ||
4359 | + /* capture */ | ||
4360 | + .ifnum = 1, | ||
4361 | + .type = QUIRK_AUDIO_FIXED_ENDPOINT, | ||
4362 | + .data = &(const struct audioformat) { | ||
4363 | + .formats = SNDRV_PCM_FMTBIT_S16_LE, | ||
4364 | + .channels = 1, | ||
4365 | + .iface = 1, | ||
4366 | + .altsetting = 0, | ||
4367 | + .altset_idx = 0, | ||
4368 | + .attributes = 0, | ||
4369 | + .endpoint = 0x85, | ||
4370 | + .ep_attr = 0x05, | ||
4371 | + .rates = SNDRV_PCM_RATE_CONTINUOUS, | ||
4372 | + .rate_min = 16000, | ||
4373 | + .rate_max = 16000 | ||
4374 | + } | ||
4375 | + }, | ||
4376 | + { | ||
4377 | + .ifnum = -1 | ||
4378 | + } | ||
4379 | + } | ||
4380 | + } | ||
4381 | +}, | ||
4382 | + | ||
4383 | { | ||
4384 | /* | ||
4385 | * Some USB MIDI devices don't have an audio control interface, | ||
4386 | diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c | ||
4387 | index 2781726..0f58b4b 100644 | ||
4388 | --- a/sound/usb/quirks.c | ||
4389 | +++ b/sound/usb/quirks.c | ||
4390 | @@ -761,3 +761,27 @@ void snd_usb_set_format_quirk(struct snd_usb_substream *subs, | ||
4391 | } | ||
4392 | } | ||
4393 | |||
4394 | +void snd_usb_endpoint_start_quirk(struct snd_usb_endpoint *ep) | ||
4395 | +{ | ||
4396 | + /* | ||
4397 | + * "Playback Design" products send bogus feedback data at the start | ||
4398 | + * of the stream. Ignore them. | ||
4399 | + */ | ||
4400 | + if ((le16_to_cpu(ep->chip->dev->descriptor.idVendor) == 0x23ba) && | ||
4401 | + ep->type == SND_USB_ENDPOINT_TYPE_SYNC) | ||
4402 | + ep->skip_packets = 4; | ||
4403 | +} | ||
4404 | + | ||
4405 | +void snd_usb_ctl_msg_quirk(struct usb_device *dev, unsigned int pipe, | ||
4406 | + __u8 request, __u8 requesttype, __u16 value, | ||
4407 | + __u16 index, void *data, __u16 size) | ||
4408 | +{ | ||
4409 | + /* | ||
4410 | + * "Playback Design" products need a 20ms delay after each | ||
4411 | + * class compliant request | ||
4412 | + */ | ||
4413 | + if ((le16_to_cpu(dev->descriptor.idVendor) == 0x23ba) && | ||
4414 | + (requesttype & USB_TYPE_MASK) == USB_TYPE_CLASS) | ||
4415 | + mdelay(20); | ||
4416 | +} | ||
4417 | + | ||
4418 | diff --git a/sound/usb/quirks.h b/sound/usb/quirks.h | ||
4419 | index 03e5e94..0ca9e91 100644 | ||
4420 | --- a/sound/usb/quirks.h | ||
4421 | +++ b/sound/usb/quirks.h | ||
4422 | @@ -1,6 +1,10 @@ | ||
4423 | #ifndef __USBAUDIO_QUIRKS_H | ||
4424 | #define __USBAUDIO_QUIRKS_H | ||
4425 | |||
4426 | +struct audioformat; | ||
4427 | +struct snd_usb_endpoint; | ||
4428 | +struct snd_usb_substream; | ||
4429 | + | ||
4430 | int snd_usb_create_quirk(struct snd_usb_audio *chip, | ||
4431 | struct usb_interface *iface, | ||
4432 | struct usb_driver *driver, | ||
4433 | @@ -20,4 +24,10 @@ void snd_usb_set_format_quirk(struct snd_usb_substream *subs, | ||
4434 | int snd_usb_is_big_endian_format(struct snd_usb_audio *chip, | ||
4435 | struct audioformat *fp); | ||
4436 | |||
4437 | +void snd_usb_endpoint_start_quirk(struct snd_usb_endpoint *ep); | ||
4438 | + | ||
4439 | +void snd_usb_ctl_msg_quirk(struct usb_device *dev, unsigned int pipe, | ||
4440 | + __u8 request, __u8 requesttype, __u16 value, | ||
4441 | + __u16 index, void *data, __u16 size); | ||
4442 | + | ||
4443 | #endif /* __USBAUDIO_QUIRKS_H */ | ||
4444 | diff --git a/tools/lguest/lguest.c b/tools/lguest/lguest.c | ||
4445 | index f759f4f..fd2f922 100644 | ||
4446 | --- a/tools/lguest/lguest.c | ||
4447 | +++ b/tools/lguest/lguest.c | ||
4448 | @@ -1299,6 +1299,7 @@ static struct device *new_device(const char *name, u16 type) | ||
4449 | dev->feature_len = 0; | ||
4450 | dev->num_vq = 0; | ||
4451 | dev->running = false; | ||
4452 | + dev->next = NULL; | ||
4453 | |||
4454 | /* | ||
4455 | * Append to device list. Prepending to a single-linked list is | ||
4456 | diff --git a/tools/perf/Makefile b/tools/perf/Makefile | ||
4457 | index 35655c3..3657ab0 100644 | ||
4458 | --- a/tools/perf/Makefile | ||
4459 | +++ b/tools/perf/Makefile | ||
4460 | @@ -62,7 +62,7 @@ ifeq ($(ARCH),x86_64) | ||
4461 | ARCH := x86 | ||
4462 | IS_X86_64 := 0 | ||
4463 | ifeq (, $(findstring m32,$(EXTRA_CFLAGS))) | ||
4464 | - IS_X86_64 := $(shell echo __x86_64__ | ${CC} -E -xc - | tail -n 1) | ||
4465 | + IS_X86_64 := $(shell echo __x86_64__ | ${CC} -E -x c - | tail -n 1) | ||
4466 | endif | ||
4467 | ifeq (${IS_X86_64}, 1) | ||
4468 | RAW_ARCH := x86_64 | ||
4469 | diff --git a/tools/power/cpupower/Makefile b/tools/power/cpupower/Makefile | ||
4470 | index a93e06c..cf397bd 100644 | ||
4471 | --- a/tools/power/cpupower/Makefile | ||
4472 | +++ b/tools/power/cpupower/Makefile | ||
4473 | @@ -111,7 +111,7 @@ GMO_FILES = ${shell for HLANG in ${LANGUAGES}; do echo $(OUTPUT)po/$$HLANG.gmo; | ||
4474 | export CROSS CC AR STRIP RANLIB CFLAGS LDFLAGS LIB_OBJS | ||
4475 | |||
4476 | # check if compiler option is supported | ||
4477 | -cc-supports = ${shell if $(CC) ${1} -S -o /dev/null -xc /dev/null > /dev/null 2>&1; then echo "$(1)"; fi;} | ||
4478 | +cc-supports = ${shell if $(CC) ${1} -S -o /dev/null -x c /dev/null > /dev/null 2>&1; then echo "$(1)"; fi;} | ||
4479 | |||
4480 | # use '-Os' optimization if available, else use -O2 | ||
4481 | OPTIMIZATION := $(call cc-supports,-Os,-O2) |