Annotation of /trunk/kernel-alx/patches-3.18/0105-3.18.6-all-fixes.patch
Parent Directory | Revision Log
Revision 2553 -
(hide annotations)
(download)
Wed Mar 18 09:24:38 2015 UTC (9 years, 6 months ago) by niro
File size: 141256 byte(s)
Wed Mar 18 09:24:38 2015 UTC (9 years, 6 months ago) by niro
File size: 141256 byte(s)
-import from kernel-magellan
1 | niro | 2553 | diff --git a/Makefile b/Makefile |
2 | index 6276fcaabf21..d2bff2d5ae25 100644 | ||
3 | --- a/Makefile | ||
4 | +++ b/Makefile | ||
5 | @@ -1,6 +1,6 @@ | ||
6 | VERSION = 3 | ||
7 | PATCHLEVEL = 18 | ||
8 | -SUBLEVEL = 5 | ||
9 | +SUBLEVEL = 6 | ||
10 | EXTRAVERSION = | ||
11 | NAME = Diseased Newt | ||
12 | |||
13 | diff --git a/arch/alpha/mm/fault.c b/arch/alpha/mm/fault.c | ||
14 | index 98838a05ba6d..9d0ac091a52a 100644 | ||
15 | --- a/arch/alpha/mm/fault.c | ||
16 | +++ b/arch/alpha/mm/fault.c | ||
17 | @@ -156,6 +156,8 @@ retry: | ||
18 | if (unlikely(fault & VM_FAULT_ERROR)) { | ||
19 | if (fault & VM_FAULT_OOM) | ||
20 | goto out_of_memory; | ||
21 | + else if (fault & VM_FAULT_SIGSEGV) | ||
22 | + goto bad_area; | ||
23 | else if (fault & VM_FAULT_SIGBUS) | ||
24 | goto do_sigbus; | ||
25 | BUG(); | ||
26 | diff --git a/arch/arc/mm/fault.c b/arch/arc/mm/fault.c | ||
27 | index 6f7e3a68803a..563cb27e37f5 100644 | ||
28 | --- a/arch/arc/mm/fault.c | ||
29 | +++ b/arch/arc/mm/fault.c | ||
30 | @@ -161,6 +161,8 @@ good_area: | ||
31 | |||
32 | if (fault & VM_FAULT_OOM) | ||
33 | goto out_of_memory; | ||
34 | + else if (fault & VM_FAULT_SIGSEGV) | ||
35 | + goto bad_area; | ||
36 | else if (fault & VM_FAULT_SIGBUS) | ||
37 | goto do_sigbus; | ||
38 | |||
39 | diff --git a/arch/arm/include/asm/xen/page.h b/arch/arm/include/asm/xen/page.h | ||
40 | index 135c24a5ba26..68c739b3fdf4 100644 | ||
41 | --- a/arch/arm/include/asm/xen/page.h | ||
42 | +++ b/arch/arm/include/asm/xen/page.h | ||
43 | @@ -107,4 +107,8 @@ static inline bool set_phys_to_machine(unsigned long pfn, unsigned long mfn) | ||
44 | #define xen_remap(cookie, size) ioremap_cache((cookie), (size)) | ||
45 | #define xen_unmap(cookie) iounmap((cookie)) | ||
46 | |||
47 | +bool xen_arch_need_swiotlb(struct device *dev, | ||
48 | + unsigned long pfn, | ||
49 | + unsigned long mfn); | ||
50 | + | ||
51 | #endif /* _ASM_ARM_XEN_PAGE_H */ | ||
52 | diff --git a/arch/arm/mach-mvebu/coherency.c b/arch/arm/mach-mvebu/coherency.c | ||
53 | index 1163a3e9accd..2ffccd4eb084 100644 | ||
54 | --- a/arch/arm/mach-mvebu/coherency.c | ||
55 | +++ b/arch/arm/mach-mvebu/coherency.c | ||
56 | @@ -342,6 +342,13 @@ static void __init armada_375_380_coherency_init(struct device_node *np) | ||
57 | arch_ioremap_caller = armada_pcie_wa_ioremap_caller; | ||
58 | |||
59 | /* | ||
60 | + * We should switch the PL310 to I/O coherency mode only if | ||
61 | + * I/O coherency is actually enabled. | ||
62 | + */ | ||
63 | + if (!coherency_available()) | ||
64 | + return; | ||
65 | + | ||
66 | + /* | ||
67 | * Add the PL310 property "arm,io-coherent". This makes sure the | ||
68 | * outer sync operation is not used, which allows to | ||
69 | * workaround the system erratum that causes deadlocks when | ||
70 | diff --git a/arch/arm/xen/mm.c b/arch/arm/xen/mm.c | ||
71 | index b0e77de99148..f8a576b1d9bb 100644 | ||
72 | --- a/arch/arm/xen/mm.c | ||
73 | +++ b/arch/arm/xen/mm.c | ||
74 | @@ -16,6 +16,13 @@ | ||
75 | #include <asm/xen/hypercall.h> | ||
76 | #include <asm/xen/interface.h> | ||
77 | |||
78 | +bool xen_arch_need_swiotlb(struct device *dev, | ||
79 | + unsigned long pfn, | ||
80 | + unsigned long mfn) | ||
81 | +{ | ||
82 | + return (pfn != mfn); | ||
83 | +} | ||
84 | + | ||
85 | int xen_create_contiguous_region(phys_addr_t pstart, unsigned int order, | ||
86 | unsigned int address_bits, | ||
87 | dma_addr_t *dma_handle) | ||
88 | diff --git a/arch/avr32/mm/fault.c b/arch/avr32/mm/fault.c | ||
89 | index 0eca93327195..d223a8b57c1e 100644 | ||
90 | --- a/arch/avr32/mm/fault.c | ||
91 | +++ b/arch/avr32/mm/fault.c | ||
92 | @@ -142,6 +142,8 @@ good_area: | ||
93 | if (unlikely(fault & VM_FAULT_ERROR)) { | ||
94 | if (fault & VM_FAULT_OOM) | ||
95 | goto out_of_memory; | ||
96 | + else if (fault & VM_FAULT_SIGSEGV) | ||
97 | + goto bad_area; | ||
98 | else if (fault & VM_FAULT_SIGBUS) | ||
99 | goto do_sigbus; | ||
100 | BUG(); | ||
101 | diff --git a/arch/cris/mm/fault.c b/arch/cris/mm/fault.c | ||
102 | index 1790f22e71a2..2686a7aa8ec8 100644 | ||
103 | --- a/arch/cris/mm/fault.c | ||
104 | +++ b/arch/cris/mm/fault.c | ||
105 | @@ -176,6 +176,8 @@ retry: | ||
106 | if (unlikely(fault & VM_FAULT_ERROR)) { | ||
107 | if (fault & VM_FAULT_OOM) | ||
108 | goto out_of_memory; | ||
109 | + else if (fault & VM_FAULT_SIGSEGV) | ||
110 | + goto bad_area; | ||
111 | else if (fault & VM_FAULT_SIGBUS) | ||
112 | goto do_sigbus; | ||
113 | BUG(); | ||
114 | diff --git a/arch/frv/mm/fault.c b/arch/frv/mm/fault.c | ||
115 | index 9a66372fc7c7..ec4917ddf678 100644 | ||
116 | --- a/arch/frv/mm/fault.c | ||
117 | +++ b/arch/frv/mm/fault.c | ||
118 | @@ -168,6 +168,8 @@ asmlinkage void do_page_fault(int datammu, unsigned long esr0, unsigned long ear | ||
119 | if (unlikely(fault & VM_FAULT_ERROR)) { | ||
120 | if (fault & VM_FAULT_OOM) | ||
121 | goto out_of_memory; | ||
122 | + else if (fault & VM_FAULT_SIGSEGV) | ||
123 | + goto bad_area; | ||
124 | else if (fault & VM_FAULT_SIGBUS) | ||
125 | goto do_sigbus; | ||
126 | BUG(); | ||
127 | diff --git a/arch/ia64/mm/fault.c b/arch/ia64/mm/fault.c | ||
128 | index 7225dad87094..ba5ba7accd0d 100644 | ||
129 | --- a/arch/ia64/mm/fault.c | ||
130 | +++ b/arch/ia64/mm/fault.c | ||
131 | @@ -172,6 +172,8 @@ retry: | ||
132 | */ | ||
133 | if (fault & VM_FAULT_OOM) { | ||
134 | goto out_of_memory; | ||
135 | + } else if (fault & VM_FAULT_SIGSEGV) { | ||
136 | + goto bad_area; | ||
137 | } else if (fault & VM_FAULT_SIGBUS) { | ||
138 | signal = SIGBUS; | ||
139 | goto bad_area; | ||
140 | diff --git a/arch/m32r/mm/fault.c b/arch/m32r/mm/fault.c | ||
141 | index e9c6a8014bd6..e3d4d4890104 100644 | ||
142 | --- a/arch/m32r/mm/fault.c | ||
143 | +++ b/arch/m32r/mm/fault.c | ||
144 | @@ -200,6 +200,8 @@ good_area: | ||
145 | if (unlikely(fault & VM_FAULT_ERROR)) { | ||
146 | if (fault & VM_FAULT_OOM) | ||
147 | goto out_of_memory; | ||
148 | + else if (fault & VM_FAULT_SIGSEGV) | ||
149 | + goto bad_area; | ||
150 | else if (fault & VM_FAULT_SIGBUS) | ||
151 | goto do_sigbus; | ||
152 | BUG(); | ||
153 | diff --git a/arch/m68k/mm/fault.c b/arch/m68k/mm/fault.c | ||
154 | index 2bd7487440c4..b2f04aee46ec 100644 | ||
155 | --- a/arch/m68k/mm/fault.c | ||
156 | +++ b/arch/m68k/mm/fault.c | ||
157 | @@ -145,6 +145,8 @@ good_area: | ||
158 | if (unlikely(fault & VM_FAULT_ERROR)) { | ||
159 | if (fault & VM_FAULT_OOM) | ||
160 | goto out_of_memory; | ||
161 | + else if (fault & VM_FAULT_SIGSEGV) | ||
162 | + goto map_err; | ||
163 | else if (fault & VM_FAULT_SIGBUS) | ||
164 | goto bus_err; | ||
165 | BUG(); | ||
166 | diff --git a/arch/metag/mm/fault.c b/arch/metag/mm/fault.c | ||
167 | index 332680e5ebf2..2de5dc695a87 100644 | ||
168 | --- a/arch/metag/mm/fault.c | ||
169 | +++ b/arch/metag/mm/fault.c | ||
170 | @@ -141,6 +141,8 @@ good_area: | ||
171 | if (unlikely(fault & VM_FAULT_ERROR)) { | ||
172 | if (fault & VM_FAULT_OOM) | ||
173 | goto out_of_memory; | ||
174 | + else if (fault & VM_FAULT_SIGSEGV) | ||
175 | + goto bad_area; | ||
176 | else if (fault & VM_FAULT_SIGBUS) | ||
177 | goto do_sigbus; | ||
178 | BUG(); | ||
179 | diff --git a/arch/microblaze/mm/fault.c b/arch/microblaze/mm/fault.c | ||
180 | index fa4cf52aa7a6..d46a5ebb7570 100644 | ||
181 | --- a/arch/microblaze/mm/fault.c | ||
182 | +++ b/arch/microblaze/mm/fault.c | ||
183 | @@ -224,6 +224,8 @@ good_area: | ||
184 | if (unlikely(fault & VM_FAULT_ERROR)) { | ||
185 | if (fault & VM_FAULT_OOM) | ||
186 | goto out_of_memory; | ||
187 | + else if (fault & VM_FAULT_SIGSEGV) | ||
188 | + goto bad_area; | ||
189 | else if (fault & VM_FAULT_SIGBUS) | ||
190 | goto do_sigbus; | ||
191 | BUG(); | ||
192 | diff --git a/arch/mips/mm/fault.c b/arch/mips/mm/fault.c | ||
193 | index becc42bb1849..70ab5d664332 100644 | ||
194 | --- a/arch/mips/mm/fault.c | ||
195 | +++ b/arch/mips/mm/fault.c | ||
196 | @@ -158,6 +158,8 @@ good_area: | ||
197 | if (unlikely(fault & VM_FAULT_ERROR)) { | ||
198 | if (fault & VM_FAULT_OOM) | ||
199 | goto out_of_memory; | ||
200 | + else if (fault & VM_FAULT_SIGSEGV) | ||
201 | + goto bad_area; | ||
202 | else if (fault & VM_FAULT_SIGBUS) | ||
203 | goto do_sigbus; | ||
204 | BUG(); | ||
205 | diff --git a/arch/mn10300/mm/fault.c b/arch/mn10300/mm/fault.c | ||
206 | index 3516cbdf1ee9..0c2cc5d39c8e 100644 | ||
207 | --- a/arch/mn10300/mm/fault.c | ||
208 | +++ b/arch/mn10300/mm/fault.c | ||
209 | @@ -262,6 +262,8 @@ good_area: | ||
210 | if (unlikely(fault & VM_FAULT_ERROR)) { | ||
211 | if (fault & VM_FAULT_OOM) | ||
212 | goto out_of_memory; | ||
213 | + else if (fault & VM_FAULT_SIGSEGV) | ||
214 | + goto bad_area; | ||
215 | else if (fault & VM_FAULT_SIGBUS) | ||
216 | goto do_sigbus; | ||
217 | BUG(); | ||
218 | diff --git a/arch/openrisc/mm/fault.c b/arch/openrisc/mm/fault.c | ||
219 | index 0703acf7d327..230ac20ae794 100644 | ||
220 | --- a/arch/openrisc/mm/fault.c | ||
221 | +++ b/arch/openrisc/mm/fault.c | ||
222 | @@ -171,6 +171,8 @@ good_area: | ||
223 | if (unlikely(fault & VM_FAULT_ERROR)) { | ||
224 | if (fault & VM_FAULT_OOM) | ||
225 | goto out_of_memory; | ||
226 | + else if (fault & VM_FAULT_SIGSEGV) | ||
227 | + goto bad_area; | ||
228 | else if (fault & VM_FAULT_SIGBUS) | ||
229 | goto do_sigbus; | ||
230 | BUG(); | ||
231 | diff --git a/arch/parisc/mm/fault.c b/arch/parisc/mm/fault.c | ||
232 | index 3ca9c1131cfe..e5120e653240 100644 | ||
233 | --- a/arch/parisc/mm/fault.c | ||
234 | +++ b/arch/parisc/mm/fault.c | ||
235 | @@ -256,6 +256,8 @@ good_area: | ||
236 | */ | ||
237 | if (fault & VM_FAULT_OOM) | ||
238 | goto out_of_memory; | ||
239 | + else if (fault & VM_FAULT_SIGSEGV) | ||
240 | + goto bad_area; | ||
241 | else if (fault & VM_FAULT_SIGBUS) | ||
242 | goto bad_area; | ||
243 | BUG(); | ||
244 | diff --git a/arch/powerpc/mm/copro_fault.c b/arch/powerpc/mm/copro_fault.c | ||
245 | index 5a236f082c78..1b5305d4bdab 100644 | ||
246 | --- a/arch/powerpc/mm/copro_fault.c | ||
247 | +++ b/arch/powerpc/mm/copro_fault.c | ||
248 | @@ -76,7 +76,7 @@ int copro_handle_mm_fault(struct mm_struct *mm, unsigned long ea, | ||
249 | if (*flt & VM_FAULT_OOM) { | ||
250 | ret = -ENOMEM; | ||
251 | goto out_unlock; | ||
252 | - } else if (*flt & VM_FAULT_SIGBUS) { | ||
253 | + } else if (*flt & (VM_FAULT_SIGBUS | VM_FAULT_SIGSEGV)) { | ||
254 | ret = -EFAULT; | ||
255 | goto out_unlock; | ||
256 | } | ||
257 | diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c | ||
258 | index 08d659a9fcdb..f06b56baf0b3 100644 | ||
259 | --- a/arch/powerpc/mm/fault.c | ||
260 | +++ b/arch/powerpc/mm/fault.c | ||
261 | @@ -444,6 +444,8 @@ good_area: | ||
262 | */ | ||
263 | fault = handle_mm_fault(mm, vma, address, flags); | ||
264 | if (unlikely(fault & (VM_FAULT_RETRY|VM_FAULT_ERROR))) { | ||
265 | + if (fault & VM_FAULT_SIGSEGV) | ||
266 | + goto bad_area; | ||
267 | rc = mm_fault_error(regs, address, fault); | ||
268 | if (rc >= MM_FAULT_RETURN) | ||
269 | goto bail; | ||
270 | diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c | ||
271 | index c8efbb37d6e0..e23f559faa47 100644 | ||
272 | --- a/arch/powerpc/xmon/xmon.c | ||
273 | +++ b/arch/powerpc/xmon/xmon.c | ||
274 | @@ -293,6 +293,7 @@ static inline void disable_surveillance(void) | ||
275 | args.token = rtas_token("set-indicator"); | ||
276 | if (args.token == RTAS_UNKNOWN_SERVICE) | ||
277 | return; | ||
278 | + args.token = cpu_to_be32(args.token); | ||
279 | args.nargs = cpu_to_be32(3); | ||
280 | args.nret = cpu_to_be32(1); | ||
281 | args.rets = &args.args[3]; | ||
282 | diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c | ||
283 | index a2b81d6ce8a5..fbe8f2cf9245 100644 | ||
284 | --- a/arch/s390/mm/fault.c | ||
285 | +++ b/arch/s390/mm/fault.c | ||
286 | @@ -374,6 +374,12 @@ static noinline void do_fault_error(struct pt_regs *regs, int fault) | ||
287 | do_no_context(regs); | ||
288 | else | ||
289 | pagefault_out_of_memory(); | ||
290 | + } else if (fault & VM_FAULT_SIGSEGV) { | ||
291 | + /* Kernel mode? Handle exceptions or die */ | ||
292 | + if (!user_mode(regs)) | ||
293 | + do_no_context(regs); | ||
294 | + else | ||
295 | + do_sigsegv(regs, SEGV_MAPERR); | ||
296 | } else if (fault & VM_FAULT_SIGBUS) { | ||
297 | /* Kernel mode? Handle exceptions or die */ | ||
298 | if (!user_mode(regs)) | ||
299 | diff --git a/arch/score/mm/fault.c b/arch/score/mm/fault.c | ||
300 | index 52238983527d..6860beb2a280 100644 | ||
301 | --- a/arch/score/mm/fault.c | ||
302 | +++ b/arch/score/mm/fault.c | ||
303 | @@ -114,6 +114,8 @@ good_area: | ||
304 | if (unlikely(fault & VM_FAULT_ERROR)) { | ||
305 | if (fault & VM_FAULT_OOM) | ||
306 | goto out_of_memory; | ||
307 | + else if (fault & VM_FAULT_SIGSEGV) | ||
308 | + goto bad_area; | ||
309 | else if (fault & VM_FAULT_SIGBUS) | ||
310 | goto do_sigbus; | ||
311 | BUG(); | ||
312 | diff --git a/arch/sh/mm/fault.c b/arch/sh/mm/fault.c | ||
313 | index 541dc6101508..a58fec9b55e0 100644 | ||
314 | --- a/arch/sh/mm/fault.c | ||
315 | +++ b/arch/sh/mm/fault.c | ||
316 | @@ -353,6 +353,8 @@ mm_fault_error(struct pt_regs *regs, unsigned long error_code, | ||
317 | } else { | ||
318 | if (fault & VM_FAULT_SIGBUS) | ||
319 | do_sigbus(regs, error_code, address); | ||
320 | + else if (fault & VM_FAULT_SIGSEGV) | ||
321 | + bad_area(regs, error_code, address); | ||
322 | else | ||
323 | BUG(); | ||
324 | } | ||
325 | diff --git a/arch/sparc/mm/fault_32.c b/arch/sparc/mm/fault_32.c | ||
326 | index 908e8c17c902..70d817154fe8 100644 | ||
327 | --- a/arch/sparc/mm/fault_32.c | ||
328 | +++ b/arch/sparc/mm/fault_32.c | ||
329 | @@ -249,6 +249,8 @@ good_area: | ||
330 | if (unlikely(fault & VM_FAULT_ERROR)) { | ||
331 | if (fault & VM_FAULT_OOM) | ||
332 | goto out_of_memory; | ||
333 | + else if (fault & VM_FAULT_SIGSEGV) | ||
334 | + goto bad_area; | ||
335 | else if (fault & VM_FAULT_SIGBUS) | ||
336 | goto do_sigbus; | ||
337 | BUG(); | ||
338 | diff --git a/arch/sparc/mm/fault_64.c b/arch/sparc/mm/fault_64.c | ||
339 | index 18fcd7167095..479823249429 100644 | ||
340 | --- a/arch/sparc/mm/fault_64.c | ||
341 | +++ b/arch/sparc/mm/fault_64.c | ||
342 | @@ -446,6 +446,8 @@ good_area: | ||
343 | if (unlikely(fault & VM_FAULT_ERROR)) { | ||
344 | if (fault & VM_FAULT_OOM) | ||
345 | goto out_of_memory; | ||
346 | + else if (fault & VM_FAULT_SIGSEGV) | ||
347 | + goto bad_area; | ||
348 | else if (fault & VM_FAULT_SIGBUS) | ||
349 | goto do_sigbus; | ||
350 | BUG(); | ||
351 | diff --git a/arch/tile/mm/fault.c b/arch/tile/mm/fault.c | ||
352 | index 6c0571216a9d..c6d2a76d91a8 100644 | ||
353 | --- a/arch/tile/mm/fault.c | ||
354 | +++ b/arch/tile/mm/fault.c | ||
355 | @@ -444,6 +444,8 @@ good_area: | ||
356 | if (unlikely(fault & VM_FAULT_ERROR)) { | ||
357 | if (fault & VM_FAULT_OOM) | ||
358 | goto out_of_memory; | ||
359 | + else if (fault & VM_FAULT_SIGSEGV) | ||
360 | + goto bad_area; | ||
361 | else if (fault & VM_FAULT_SIGBUS) | ||
362 | goto do_sigbus; | ||
363 | BUG(); | ||
364 | diff --git a/arch/um/kernel/trap.c b/arch/um/kernel/trap.c | ||
365 | index 5678c3571e7c..209617302df8 100644 | ||
366 | --- a/arch/um/kernel/trap.c | ||
367 | +++ b/arch/um/kernel/trap.c | ||
368 | @@ -80,6 +80,8 @@ good_area: | ||
369 | if (unlikely(fault & VM_FAULT_ERROR)) { | ||
370 | if (fault & VM_FAULT_OOM) { | ||
371 | goto out_of_memory; | ||
372 | + } else if (fault & VM_FAULT_SIGSEGV) { | ||
373 | + goto out; | ||
374 | } else if (fault & VM_FAULT_SIGBUS) { | ||
375 | err = -EACCES; | ||
376 | goto out; | ||
377 | diff --git a/arch/x86/boot/compressed/Makefile b/arch/x86/boot/compressed/Makefile | ||
378 | index 45abc363dd3e..6a1a8458c042 100644 | ||
379 | --- a/arch/x86/boot/compressed/Makefile | ||
380 | +++ b/arch/x86/boot/compressed/Makefile | ||
381 | @@ -77,7 +77,7 @@ suffix-$(CONFIG_KERNEL_LZO) := lzo | ||
382 | suffix-$(CONFIG_KERNEL_LZ4) := lz4 | ||
383 | |||
384 | RUN_SIZE = $(shell $(OBJDUMP) -h vmlinux | \ | ||
385 | - perl $(srctree)/arch/x86/tools/calc_run_size.pl) | ||
386 | + $(CONFIG_SHELL) $(srctree)/arch/x86/tools/calc_run_size.sh) | ||
387 | quiet_cmd_mkpiggy = MKPIGGY $@ | ||
388 | cmd_mkpiggy = $(obj)/mkpiggy $< $(RUN_SIZE) > $@ || ( rm -f $@ ; false ) | ||
389 | |||
390 | diff --git a/arch/x86/include/asm/xen/page.h b/arch/x86/include/asm/xen/page.h | ||
391 | index c949923a5668..f58ef6c0613b 100644 | ||
392 | --- a/arch/x86/include/asm/xen/page.h | ||
393 | +++ b/arch/x86/include/asm/xen/page.h | ||
394 | @@ -236,4 +236,11 @@ void make_lowmem_page_readwrite(void *vaddr); | ||
395 | #define xen_remap(cookie, size) ioremap((cookie), (size)); | ||
396 | #define xen_unmap(cookie) iounmap((cookie)) | ||
397 | |||
398 | +static inline bool xen_arch_need_swiotlb(struct device *dev, | ||
399 | + unsigned long pfn, | ||
400 | + unsigned long mfn) | ||
401 | +{ | ||
402 | + return false; | ||
403 | +} | ||
404 | + | ||
405 | #endif /* _ASM_X86_XEN_PAGE_H */ | ||
406 | diff --git a/arch/x86/kernel/cpu/perf_event_intel.c b/arch/x86/kernel/cpu/perf_event_intel.c | ||
407 | index 944bf019b74f..498b6d967138 100644 | ||
408 | --- a/arch/x86/kernel/cpu/perf_event_intel.c | ||
409 | +++ b/arch/x86/kernel/cpu/perf_event_intel.c | ||
410 | @@ -2431,6 +2431,7 @@ __init int intel_pmu_init(void) | ||
411 | break; | ||
412 | |||
413 | case 55: /* 22nm Atom "Silvermont" */ | ||
414 | + case 76: /* 14nm Atom "Airmont" */ | ||
415 | case 77: /* 22nm Atom "Silvermont Avoton/Rangely" */ | ||
416 | memcpy(hw_cache_event_ids, slm_hw_cache_event_ids, | ||
417 | sizeof(hw_cache_event_ids)); | ||
418 | diff --git a/arch/x86/kernel/cpu/perf_event_intel_rapl.c b/arch/x86/kernel/cpu/perf_event_intel_rapl.c | ||
419 | index d64f275fe274..8c256749882c 100644 | ||
420 | --- a/arch/x86/kernel/cpu/perf_event_intel_rapl.c | ||
421 | +++ b/arch/x86/kernel/cpu/perf_event_intel_rapl.c | ||
422 | @@ -135,7 +135,7 @@ static inline u64 rapl_scale(u64 v) | ||
423 | * or use ldexp(count, -32). | ||
424 | * Watts = Joules/Time delta | ||
425 | */ | ||
426 | - return v << (32 - __this_cpu_read(rapl_pmu->hw_unit)); | ||
427 | + return v << (32 - __this_cpu_read(rapl_pmu)->hw_unit); | ||
428 | } | ||
429 | |||
430 | static u64 rapl_event_update(struct perf_event *event) | ||
431 | diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c | ||
432 | index d973e61e450d..a8612aafeca1 100644 | ||
433 | --- a/arch/x86/mm/fault.c | ||
434 | +++ b/arch/x86/mm/fault.c | ||
435 | @@ -905,6 +905,8 @@ mm_fault_error(struct pt_regs *regs, unsigned long error_code, | ||
436 | if (fault & (VM_FAULT_SIGBUS|VM_FAULT_HWPOISON| | ||
437 | VM_FAULT_HWPOISON_LARGE)) | ||
438 | do_sigbus(regs, error_code, address, fault); | ||
439 | + else if (fault & VM_FAULT_SIGSEGV) | ||
440 | + bad_area_nosemaphore(regs, error_code, address); | ||
441 | else | ||
442 | BUG(); | ||
443 | } | ||
444 | diff --git a/arch/x86/tools/calc_run_size.pl b/arch/x86/tools/calc_run_size.pl | ||
445 | deleted file mode 100644 | ||
446 | index 23210baade2d..000000000000 | ||
447 | --- a/arch/x86/tools/calc_run_size.pl | ||
448 | +++ /dev/null | ||
449 | @@ -1,39 +0,0 @@ | ||
450 | -#!/usr/bin/perl | ||
451 | -# | ||
452 | -# Calculate the amount of space needed to run the kernel, including room for | ||
453 | -# the .bss and .brk sections. | ||
454 | -# | ||
455 | -# Usage: | ||
456 | -# objdump -h a.out | perl calc_run_size.pl | ||
457 | -use strict; | ||
458 | - | ||
459 | -my $mem_size = 0; | ||
460 | -my $file_offset = 0; | ||
461 | - | ||
462 | -my $sections=" *[0-9]+ \.(?:bss|brk) +"; | ||
463 | -while (<>) { | ||
464 | - if (/^$sections([0-9a-f]+) +(?:[0-9a-f]+ +){2}([0-9a-f]+)/) { | ||
465 | - my $size = hex($1); | ||
466 | - my $offset = hex($2); | ||
467 | - $mem_size += $size; | ||
468 | - if ($file_offset == 0) { | ||
469 | - $file_offset = $offset; | ||
470 | - } elsif ($file_offset != $offset) { | ||
471 | - # BFD linker shows the same file offset in ELF. | ||
472 | - # Gold linker shows them as consecutive. | ||
473 | - next if ($file_offset + $mem_size == $offset + $size); | ||
474 | - | ||
475 | - printf STDERR "file_offset: 0x%lx\n", $file_offset; | ||
476 | - printf STDERR "mem_size: 0x%lx\n", $mem_size; | ||
477 | - printf STDERR "offset: 0x%lx\n", $offset; | ||
478 | - printf STDERR "size: 0x%lx\n", $size; | ||
479 | - | ||
480 | - die ".bss and .brk are non-contiguous\n"; | ||
481 | - } | ||
482 | - } | ||
483 | -} | ||
484 | - | ||
485 | -if ($file_offset == 0) { | ||
486 | - die "Never found .bss or .brk file offset\n"; | ||
487 | -} | ||
488 | -printf("%d\n", $mem_size + $file_offset); | ||
489 | diff --git a/arch/x86/tools/calc_run_size.sh b/arch/x86/tools/calc_run_size.sh | ||
490 | new file mode 100644 | ||
491 | index 000000000000..1a4c17bb3910 | ||
492 | --- /dev/null | ||
493 | +++ b/arch/x86/tools/calc_run_size.sh | ||
494 | @@ -0,0 +1,42 @@ | ||
495 | +#!/bin/sh | ||
496 | +# | ||
497 | +# Calculate the amount of space needed to run the kernel, including room for | ||
498 | +# the .bss and .brk sections. | ||
499 | +# | ||
500 | +# Usage: | ||
501 | +# objdump -h a.out | sh calc_run_size.sh | ||
502 | + | ||
503 | +NUM='\([0-9a-fA-F]*[ \t]*\)' | ||
504 | +OUT=$(sed -n 's/^[ \t0-9]*.b[sr][sk][ \t]*'"$NUM$NUM$NUM$NUM"'.*/\1\4/p') | ||
505 | +if [ -z "$OUT" ] ; then | ||
506 | + echo "Never found .bss or .brk file offset" >&2 | ||
507 | + exit 1 | ||
508 | +fi | ||
509 | + | ||
510 | +OUT=$(echo ${OUT# }) | ||
511 | +sizeA=$(printf "%d" 0x${OUT%% *}) | ||
512 | +OUT=${OUT#* } | ||
513 | +offsetA=$(printf "%d" 0x${OUT%% *}) | ||
514 | +OUT=${OUT#* } | ||
515 | +sizeB=$(printf "%d" 0x${OUT%% *}) | ||
516 | +OUT=${OUT#* } | ||
517 | +offsetB=$(printf "%d" 0x${OUT%% *}) | ||
518 | + | ||
519 | +run_size=$(( $offsetA + $sizeA + $sizeB )) | ||
520 | + | ||
521 | +# BFD linker shows the same file offset in ELF. | ||
522 | +if [ "$offsetA" -ne "$offsetB" ] ; then | ||
523 | + # Gold linker shows them as consecutive. | ||
524 | + endB=$(( $offsetB + $sizeB )) | ||
525 | + if [ "$endB" != "$run_size" ] ; then | ||
526 | + printf "sizeA: 0x%x\n" $sizeA >&2 | ||
527 | + printf "offsetA: 0x%x\n" $offsetA >&2 | ||
528 | + printf "sizeB: 0x%x\n" $sizeB >&2 | ||
529 | + printf "offsetB: 0x%x\n" $offsetB >&2 | ||
530 | + echo ".bss and .brk are non-contiguous" >&2 | ||
531 | + exit 1 | ||
532 | + fi | ||
533 | +fi | ||
534 | + | ||
535 | +printf "%d\n" $run_size | ||
536 | +exit 0 | ||
537 | diff --git a/arch/xtensa/mm/fault.c b/arch/xtensa/mm/fault.c | ||
538 | index b57c4f91f487..9e3571a6535c 100644 | ||
539 | --- a/arch/xtensa/mm/fault.c | ||
540 | +++ b/arch/xtensa/mm/fault.c | ||
541 | @@ -117,6 +117,8 @@ good_area: | ||
542 | if (unlikely(fault & VM_FAULT_ERROR)) { | ||
543 | if (fault & VM_FAULT_OOM) | ||
544 | goto out_of_memory; | ||
545 | + else if (fault & VM_FAULT_SIGSEGV) | ||
546 | + goto bad_area; | ||
547 | else if (fault & VM_FAULT_SIGBUS) | ||
548 | goto do_sigbus; | ||
549 | BUG(); | ||
550 | diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c | ||
551 | index 27b71a0b72d0..76b5be937de6 100644 | ||
552 | --- a/drivers/block/rbd.c | ||
553 | +++ b/drivers/block/rbd.c | ||
554 | @@ -2098,32 +2098,26 @@ static void rbd_dev_parent_put(struct rbd_device *rbd_dev) | ||
555 | * If an image has a non-zero parent overlap, get a reference to its | ||
556 | * parent. | ||
557 | * | ||
558 | - * We must get the reference before checking for the overlap to | ||
559 | - * coordinate properly with zeroing the parent overlap in | ||
560 | - * rbd_dev_v2_parent_info() when an image gets flattened. We | ||
561 | - * drop it again if there is no overlap. | ||
562 | - * | ||
563 | * Returns true if the rbd device has a parent with a non-zero | ||
564 | * overlap and a reference for it was successfully taken, or | ||
565 | * false otherwise. | ||
566 | */ | ||
567 | static bool rbd_dev_parent_get(struct rbd_device *rbd_dev) | ||
568 | { | ||
569 | - int counter; | ||
570 | + int counter = 0; | ||
571 | |||
572 | if (!rbd_dev->parent_spec) | ||
573 | return false; | ||
574 | |||
575 | - counter = atomic_inc_return_safe(&rbd_dev->parent_ref); | ||
576 | - if (counter > 0 && rbd_dev->parent_overlap) | ||
577 | - return true; | ||
578 | - | ||
579 | - /* Image was flattened, but parent is not yet torn down */ | ||
580 | + down_read(&rbd_dev->header_rwsem); | ||
581 | + if (rbd_dev->parent_overlap) | ||
582 | + counter = atomic_inc_return_safe(&rbd_dev->parent_ref); | ||
583 | + up_read(&rbd_dev->header_rwsem); | ||
584 | |||
585 | if (counter < 0) | ||
586 | rbd_warn(rbd_dev, "parent reference overflow"); | ||
587 | |||
588 | - return false; | ||
589 | + return counter > 0; | ||
590 | } | ||
591 | |||
592 | /* | ||
593 | @@ -4236,7 +4230,6 @@ static int rbd_dev_v2_parent_info(struct rbd_device *rbd_dev) | ||
594 | */ | ||
595 | if (rbd_dev->parent_overlap) { | ||
596 | rbd_dev->parent_overlap = 0; | ||
597 | - smp_mb(); | ||
598 | rbd_dev_parent_put(rbd_dev); | ||
599 | pr_info("%s: clone image has been flattened\n", | ||
600 | rbd_dev->disk->disk_name); | ||
601 | @@ -4282,7 +4275,6 @@ static int rbd_dev_v2_parent_info(struct rbd_device *rbd_dev) | ||
602 | * treat it specially. | ||
603 | */ | ||
604 | rbd_dev->parent_overlap = overlap; | ||
605 | - smp_mb(); | ||
606 | if (!overlap) { | ||
607 | |||
608 | /* A null parent_spec indicates it's the initial probe */ | ||
609 | @@ -5111,10 +5103,7 @@ static void rbd_dev_unprobe(struct rbd_device *rbd_dev) | ||
610 | { | ||
611 | struct rbd_image_header *header; | ||
612 | |||
613 | - /* Drop parent reference unless it's already been done (or none) */ | ||
614 | - | ||
615 | - if (rbd_dev->parent_overlap) | ||
616 | - rbd_dev_parent_put(rbd_dev); | ||
617 | + rbd_dev_parent_put(rbd_dev); | ||
618 | |||
619 | /* Free dynamic fields from the header, then zero it out */ | ||
620 | |||
621 | diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c | ||
622 | index 1fa2af957b18..84b4c8b7fbd1 100644 | ||
623 | --- a/drivers/clocksource/arm_arch_timer.c | ||
624 | +++ b/drivers/clocksource/arm_arch_timer.c | ||
625 | @@ -462,7 +462,7 @@ static void __init arch_counter_register(unsigned type) | ||
626 | |||
627 | /* Register the CP15 based counter if we have one */ | ||
628 | if (type & ARCH_CP15_TIMER) { | ||
629 | - if (arch_timer_use_virtual) | ||
630 | + if (IS_ENABLED(CONFIG_ARM64) || arch_timer_use_virtual) | ||
631 | arch_timer_read_counter = arch_counter_get_cntvct; | ||
632 | else | ||
633 | arch_timer_read_counter = arch_counter_get_cntpct; | ||
634 | diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c | ||
635 | index ef757f712a3d..e9a2827ad1c4 100644 | ||
636 | --- a/drivers/gpu/drm/drm_fb_helper.c | ||
637 | +++ b/drivers/gpu/drm/drm_fb_helper.c | ||
638 | @@ -145,6 +145,31 @@ int drm_fb_helper_add_one_connector(struct drm_fb_helper *fb_helper, struct drm_ | ||
639 | } | ||
640 | EXPORT_SYMBOL(drm_fb_helper_add_one_connector); | ||
641 | |||
642 | +static void remove_from_modeset(struct drm_mode_set *set, | ||
643 | + struct drm_connector *connector) | ||
644 | +{ | ||
645 | + int i, j; | ||
646 | + | ||
647 | + for (i = 0; i < set->num_connectors; i++) { | ||
648 | + if (set->connectors[i] == connector) | ||
649 | + break; | ||
650 | + } | ||
651 | + | ||
652 | + if (i == set->num_connectors) | ||
653 | + return; | ||
654 | + | ||
655 | + for (j = i + 1; j < set->num_connectors; j++) { | ||
656 | + set->connectors[j - 1] = set->connectors[j]; | ||
657 | + } | ||
658 | + set->num_connectors--; | ||
659 | + | ||
660 | + /* because i915 is pissy about this.. | ||
661 | + * TODO maybe need to makes sure we set it back to !=NULL somewhere? | ||
662 | + */ | ||
663 | + if (set->num_connectors == 0) | ||
664 | + set->fb = NULL; | ||
665 | +} | ||
666 | + | ||
667 | int drm_fb_helper_remove_one_connector(struct drm_fb_helper *fb_helper, | ||
668 | struct drm_connector *connector) | ||
669 | { | ||
670 | @@ -167,6 +192,11 @@ int drm_fb_helper_remove_one_connector(struct drm_fb_helper *fb_helper, | ||
671 | } | ||
672 | fb_helper->connector_count--; | ||
673 | kfree(fb_helper_connector); | ||
674 | + | ||
675 | + /* also cleanup dangling references to the connector: */ | ||
676 | + for (i = 0; i < fb_helper->crtc_count; i++) | ||
677 | + remove_from_modeset(&fb_helper->crtc_info[i].mode_set, connector); | ||
678 | + | ||
679 | return 0; | ||
680 | } | ||
681 | EXPORT_SYMBOL(drm_fb_helper_remove_one_connector); | ||
682 | diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h | ||
683 | index 346aee828dc3..c33327d5c543 100644 | ||
684 | --- a/drivers/gpu/drm/i915/i915_drv.h | ||
685 | +++ b/drivers/gpu/drm/i915/i915_drv.h | ||
686 | @@ -2076,8 +2076,7 @@ struct drm_i915_cmd_table { | ||
687 | #define IS_HSW_EARLY_SDV(dev) (IS_HASWELL(dev) && \ | ||
688 | (INTEL_DEVID(dev) & 0xFF00) == 0x0C00) | ||
689 | #define IS_BDW_ULT(dev) (IS_BROADWELL(dev) && \ | ||
690 | - ((INTEL_DEVID(dev) & 0xf) == 0x2 || \ | ||
691 | - (INTEL_DEVID(dev) & 0xf) == 0x6 || \ | ||
692 | + ((INTEL_DEVID(dev) & 0xf) == 0x6 || \ | ||
693 | (INTEL_DEVID(dev) & 0xf) == 0xe)) | ||
694 | #define IS_HSW_ULT(dev) (IS_HASWELL(dev) && \ | ||
695 | (INTEL_DEVID(dev) & 0xFF00) == 0x0A00) | ||
696 | diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c | ||
697 | index fd76933eed04..d88dbedeaa77 100644 | ||
698 | --- a/drivers/gpu/drm/i915/i915_gem.c | ||
699 | +++ b/drivers/gpu/drm/i915/i915_gem.c | ||
700 | @@ -3050,6 +3050,13 @@ static void i965_write_fence_reg(struct drm_device *dev, int reg, | ||
701 | u32 size = i915_gem_obj_ggtt_size(obj); | ||
702 | uint64_t val; | ||
703 | |||
704 | + /* Adjust fence size to match tiled area */ | ||
705 | + if (obj->tiling_mode != I915_TILING_NONE) { | ||
706 | + uint32_t row_size = obj->stride * | ||
707 | + (obj->tiling_mode == I915_TILING_Y ? 32 : 8); | ||
708 | + size = (size / row_size) * row_size; | ||
709 | + } | ||
710 | + | ||
711 | val = (uint64_t)((i915_gem_obj_ggtt_offset(obj) + size - 4096) & | ||
712 | 0xfffff000) << 32; | ||
713 | val |= i915_gem_obj_ggtt_offset(obj) & 0xfffff000; | ||
714 | @@ -4811,25 +4818,18 @@ i915_gem_init_hw(struct drm_device *dev) | ||
715 | for (i = 0; i < NUM_L3_SLICES(dev); i++) | ||
716 | i915_gem_l3_remap(&dev_priv->ring[RCS], i); | ||
717 | |||
718 | - /* | ||
719 | - * XXX: Contexts should only be initialized once. Doing a switch to the | ||
720 | - * default context switch however is something we'd like to do after | ||
721 | - * reset or thaw (the latter may not actually be necessary for HW, but | ||
722 | - * goes with our code better). Context switching requires rings (for | ||
723 | - * the do_switch), but before enabling PPGTT. So don't move this. | ||
724 | - */ | ||
725 | - ret = i915_gem_context_enable(dev_priv); | ||
726 | + ret = i915_ppgtt_init_hw(dev); | ||
727 | if (ret && ret != -EIO) { | ||
728 | - DRM_ERROR("Context enable failed %d\n", ret); | ||
729 | + DRM_ERROR("PPGTT enable failed %d\n", ret); | ||
730 | i915_gem_cleanup_ringbuffer(dev); | ||
731 | - | ||
732 | - return ret; | ||
733 | } | ||
734 | |||
735 | - ret = i915_ppgtt_init_hw(dev); | ||
736 | + ret = i915_gem_context_enable(dev_priv); | ||
737 | if (ret && ret != -EIO) { | ||
738 | - DRM_ERROR("PPGTT enable failed %d\n", ret); | ||
739 | + DRM_ERROR("Context enable failed %d\n", ret); | ||
740 | i915_gem_cleanup_ringbuffer(dev); | ||
741 | + | ||
742 | + return ret; | ||
743 | } | ||
744 | |||
745 | return ret; | ||
746 | diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c | ||
747 | index 41b3be217493..8bc193f81333 100644 | ||
748 | --- a/drivers/gpu/drm/i915/intel_panel.c | ||
749 | +++ b/drivers/gpu/drm/i915/intel_panel.c | ||
750 | @@ -947,7 +947,7 @@ void intel_panel_enable_backlight(struct intel_connector *connector) | ||
751 | |||
752 | WARN_ON(panel->backlight.max == 0); | ||
753 | |||
754 | - if (panel->backlight.level == 0) { | ||
755 | + if (panel->backlight.level <= panel->backlight.min) { | ||
756 | panel->backlight.level = panel->backlight.max; | ||
757 | if (panel->backlight.device) | ||
758 | panel->backlight.device->props.brightness = | ||
759 | diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c | ||
760 | index b53b31a7b76f..cdf6e2149539 100644 | ||
761 | --- a/drivers/gpu/drm/radeon/r100.c | ||
762 | +++ b/drivers/gpu/drm/radeon/r100.c | ||
763 | @@ -644,6 +644,7 @@ int r100_pci_gart_init(struct radeon_device *rdev) | ||
764 | return r; | ||
765 | rdev->gart.table_size = rdev->gart.num_gpu_pages * 4; | ||
766 | rdev->asic->gart.tlb_flush = &r100_pci_gart_tlb_flush; | ||
767 | + rdev->asic->gart.get_page_entry = &r100_pci_gart_get_page_entry; | ||
768 | rdev->asic->gart.set_page = &r100_pci_gart_set_page; | ||
769 | return radeon_gart_table_ram_alloc(rdev); | ||
770 | } | ||
771 | @@ -681,11 +682,16 @@ void r100_pci_gart_disable(struct radeon_device *rdev) | ||
772 | WREG32(RADEON_AIC_HI_ADDR, 0); | ||
773 | } | ||
774 | |||
775 | +uint64_t r100_pci_gart_get_page_entry(uint64_t addr, uint32_t flags) | ||
776 | +{ | ||
777 | + return addr; | ||
778 | +} | ||
779 | + | ||
780 | void r100_pci_gart_set_page(struct radeon_device *rdev, unsigned i, | ||
781 | - uint64_t addr, uint32_t flags) | ||
782 | + uint64_t entry) | ||
783 | { | ||
784 | u32 *gtt = rdev->gart.ptr; | ||
785 | - gtt[i] = cpu_to_le32(lower_32_bits(addr)); | ||
786 | + gtt[i] = cpu_to_le32(lower_32_bits(entry)); | ||
787 | } | ||
788 | |||
789 | void r100_pci_gart_fini(struct radeon_device *rdev) | ||
790 | diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c | ||
791 | index 1bc4704034ce..f3ef6257d669 100644 | ||
792 | --- a/drivers/gpu/drm/radeon/r300.c | ||
793 | +++ b/drivers/gpu/drm/radeon/r300.c | ||
794 | @@ -73,11 +73,8 @@ void rv370_pcie_gart_tlb_flush(struct radeon_device *rdev) | ||
795 | #define R300_PTE_WRITEABLE (1 << 2) | ||
796 | #define R300_PTE_READABLE (1 << 3) | ||
797 | |||
798 | -void rv370_pcie_gart_set_page(struct radeon_device *rdev, unsigned i, | ||
799 | - uint64_t addr, uint32_t flags) | ||
800 | +uint64_t rv370_pcie_gart_get_page_entry(uint64_t addr, uint32_t flags) | ||
801 | { | ||
802 | - void __iomem *ptr = rdev->gart.ptr; | ||
803 | - | ||
804 | addr = (lower_32_bits(addr) >> 8) | | ||
805 | ((upper_32_bits(addr) & 0xff) << 24); | ||
806 | if (flags & RADEON_GART_PAGE_READ) | ||
807 | @@ -86,10 +83,18 @@ void rv370_pcie_gart_set_page(struct radeon_device *rdev, unsigned i, | ||
808 | addr |= R300_PTE_WRITEABLE; | ||
809 | if (!(flags & RADEON_GART_PAGE_SNOOP)) | ||
810 | addr |= R300_PTE_UNSNOOPED; | ||
811 | + return addr; | ||
812 | +} | ||
813 | + | ||
814 | +void rv370_pcie_gart_set_page(struct radeon_device *rdev, unsigned i, | ||
815 | + uint64_t entry) | ||
816 | +{ | ||
817 | + void __iomem *ptr = rdev->gart.ptr; | ||
818 | + | ||
819 | /* on x86 we want this to be CPU endian, on powerpc | ||
820 | * on powerpc without HW swappers, it'll get swapped on way | ||
821 | * into VRAM - so no need for cpu_to_le32 on VRAM tables */ | ||
822 | - writel(addr, ((void __iomem *)ptr) + (i * 4)); | ||
823 | + writel(entry, ((void __iomem *)ptr) + (i * 4)); | ||
824 | } | ||
825 | |||
826 | int rv370_pcie_gart_init(struct radeon_device *rdev) | ||
827 | @@ -109,6 +114,7 @@ int rv370_pcie_gart_init(struct radeon_device *rdev) | ||
828 | DRM_ERROR("Failed to register debugfs file for PCIE gart !\n"); | ||
829 | rdev->gart.table_size = rdev->gart.num_gpu_pages * 4; | ||
830 | rdev->asic->gart.tlb_flush = &rv370_pcie_gart_tlb_flush; | ||
831 | + rdev->asic->gart.get_page_entry = &rv370_pcie_gart_get_page_entry; | ||
832 | rdev->asic->gart.set_page = &rv370_pcie_gart_set_page; | ||
833 | return radeon_gart_table_vram_alloc(rdev); | ||
834 | } | ||
835 | diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h | ||
836 | index a9717b3fbf1b..dbe51bfe3ef4 100644 | ||
837 | --- a/drivers/gpu/drm/radeon/radeon.h | ||
838 | +++ b/drivers/gpu/drm/radeon/radeon.h | ||
839 | @@ -245,6 +245,7 @@ bool radeon_get_bios(struct radeon_device *rdev); | ||
840 | * Dummy page | ||
841 | */ | ||
842 | struct radeon_dummy_page { | ||
843 | + uint64_t entry; | ||
844 | struct page *page; | ||
845 | dma_addr_t addr; | ||
846 | }; | ||
847 | @@ -626,6 +627,7 @@ struct radeon_gart { | ||
848 | unsigned table_size; | ||
849 | struct page **pages; | ||
850 | dma_addr_t *pages_addr; | ||
851 | + uint64_t *pages_entry; | ||
852 | bool ready; | ||
853 | }; | ||
854 | |||
855 | @@ -1819,8 +1821,9 @@ struct radeon_asic { | ||
856 | /* gart */ | ||
857 | struct { | ||
858 | void (*tlb_flush)(struct radeon_device *rdev); | ||
859 | + uint64_t (*get_page_entry)(uint64_t addr, uint32_t flags); | ||
860 | void (*set_page)(struct radeon_device *rdev, unsigned i, | ||
861 | - uint64_t addr, uint32_t flags); | ||
862 | + uint64_t entry); | ||
863 | } gart; | ||
864 | struct { | ||
865 | int (*init)(struct radeon_device *rdev); | ||
866 | @@ -2818,7 +2821,8 @@ static inline void radeon_ring_write(struct radeon_ring *ring, uint32_t v) | ||
867 | #define radeon_vga_set_state(rdev, state) (rdev)->asic->vga_set_state((rdev), (state)) | ||
868 | #define radeon_asic_reset(rdev) (rdev)->asic->asic_reset((rdev)) | ||
869 | #define radeon_gart_tlb_flush(rdev) (rdev)->asic->gart.tlb_flush((rdev)) | ||
870 | -#define radeon_gart_set_page(rdev, i, p, f) (rdev)->asic->gart.set_page((rdev), (i), (p), (f)) | ||
871 | +#define radeon_gart_get_page_entry(a, f) (rdev)->asic->gart.get_page_entry((a), (f)) | ||
872 | +#define radeon_gart_set_page(rdev, i, e) (rdev)->asic->gart.set_page((rdev), (i), (e)) | ||
873 | #define radeon_asic_vm_init(rdev) (rdev)->asic->vm.init((rdev)) | ||
874 | #define radeon_asic_vm_fini(rdev) (rdev)->asic->vm.fini((rdev)) | ||
875 | #define radeon_asic_vm_copy_pages(rdev, ib, pe, src, count) ((rdev)->asic->vm.copy_pages((rdev), (ib), (pe), (src), (count))) | ||
876 | diff --git a/drivers/gpu/drm/radeon/radeon_asic.c b/drivers/gpu/drm/radeon/radeon_asic.c | ||
877 | index 121aff6a3b41..ed0e10eee2dc 100644 | ||
878 | --- a/drivers/gpu/drm/radeon/radeon_asic.c | ||
879 | +++ b/drivers/gpu/drm/radeon/radeon_asic.c | ||
880 | @@ -159,11 +159,13 @@ void radeon_agp_disable(struct radeon_device *rdev) | ||
881 | DRM_INFO("Forcing AGP to PCIE mode\n"); | ||
882 | rdev->flags |= RADEON_IS_PCIE; | ||
883 | rdev->asic->gart.tlb_flush = &rv370_pcie_gart_tlb_flush; | ||
884 | + rdev->asic->gart.get_page_entry = &rv370_pcie_gart_get_page_entry; | ||
885 | rdev->asic->gart.set_page = &rv370_pcie_gart_set_page; | ||
886 | } else { | ||
887 | DRM_INFO("Forcing AGP to PCI mode\n"); | ||
888 | rdev->flags |= RADEON_IS_PCI; | ||
889 | rdev->asic->gart.tlb_flush = &r100_pci_gart_tlb_flush; | ||
890 | + rdev->asic->gart.get_page_entry = &r100_pci_gart_get_page_entry; | ||
891 | rdev->asic->gart.set_page = &r100_pci_gart_set_page; | ||
892 | } | ||
893 | rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024; | ||
894 | @@ -199,6 +201,7 @@ static struct radeon_asic r100_asic = { | ||
895 | .mc_wait_for_idle = &r100_mc_wait_for_idle, | ||
896 | .gart = { | ||
897 | .tlb_flush = &r100_pci_gart_tlb_flush, | ||
898 | + .get_page_entry = &r100_pci_gart_get_page_entry, | ||
899 | .set_page = &r100_pci_gart_set_page, | ||
900 | }, | ||
901 | .ring = { | ||
902 | @@ -265,6 +268,7 @@ static struct radeon_asic r200_asic = { | ||
903 | .mc_wait_for_idle = &r100_mc_wait_for_idle, | ||
904 | .gart = { | ||
905 | .tlb_flush = &r100_pci_gart_tlb_flush, | ||
906 | + .get_page_entry = &r100_pci_gart_get_page_entry, | ||
907 | .set_page = &r100_pci_gart_set_page, | ||
908 | }, | ||
909 | .ring = { | ||
910 | @@ -359,6 +363,7 @@ static struct radeon_asic r300_asic = { | ||
911 | .mc_wait_for_idle = &r300_mc_wait_for_idle, | ||
912 | .gart = { | ||
913 | .tlb_flush = &r100_pci_gart_tlb_flush, | ||
914 | + .get_page_entry = &r100_pci_gart_get_page_entry, | ||
915 | .set_page = &r100_pci_gart_set_page, | ||
916 | }, | ||
917 | .ring = { | ||
918 | @@ -425,6 +430,7 @@ static struct radeon_asic r300_asic_pcie = { | ||
919 | .mc_wait_for_idle = &r300_mc_wait_for_idle, | ||
920 | .gart = { | ||
921 | .tlb_flush = &rv370_pcie_gart_tlb_flush, | ||
922 | + .get_page_entry = &rv370_pcie_gart_get_page_entry, | ||
923 | .set_page = &rv370_pcie_gart_set_page, | ||
924 | }, | ||
925 | .ring = { | ||
926 | @@ -491,6 +497,7 @@ static struct radeon_asic r420_asic = { | ||
927 | .mc_wait_for_idle = &r300_mc_wait_for_idle, | ||
928 | .gart = { | ||
929 | .tlb_flush = &rv370_pcie_gart_tlb_flush, | ||
930 | + .get_page_entry = &rv370_pcie_gart_get_page_entry, | ||
931 | .set_page = &rv370_pcie_gart_set_page, | ||
932 | }, | ||
933 | .ring = { | ||
934 | @@ -557,6 +564,7 @@ static struct radeon_asic rs400_asic = { | ||
935 | .mc_wait_for_idle = &rs400_mc_wait_for_idle, | ||
936 | .gart = { | ||
937 | .tlb_flush = &rs400_gart_tlb_flush, | ||
938 | + .get_page_entry = &rs400_gart_get_page_entry, | ||
939 | .set_page = &rs400_gart_set_page, | ||
940 | }, | ||
941 | .ring = { | ||
942 | @@ -623,6 +631,7 @@ static struct radeon_asic rs600_asic = { | ||
943 | .mc_wait_for_idle = &rs600_mc_wait_for_idle, | ||
944 | .gart = { | ||
945 | .tlb_flush = &rs600_gart_tlb_flush, | ||
946 | + .get_page_entry = &rs600_gart_get_page_entry, | ||
947 | .set_page = &rs600_gart_set_page, | ||
948 | }, | ||
949 | .ring = { | ||
950 | @@ -691,6 +700,7 @@ static struct radeon_asic rs690_asic = { | ||
951 | .mc_wait_for_idle = &rs690_mc_wait_for_idle, | ||
952 | .gart = { | ||
953 | .tlb_flush = &rs400_gart_tlb_flush, | ||
954 | + .get_page_entry = &rs400_gart_get_page_entry, | ||
955 | .set_page = &rs400_gart_set_page, | ||
956 | }, | ||
957 | .ring = { | ||
958 | @@ -759,6 +769,7 @@ static struct radeon_asic rv515_asic = { | ||
959 | .mc_wait_for_idle = &rv515_mc_wait_for_idle, | ||
960 | .gart = { | ||
961 | .tlb_flush = &rv370_pcie_gart_tlb_flush, | ||
962 | + .get_page_entry = &rv370_pcie_gart_get_page_entry, | ||
963 | .set_page = &rv370_pcie_gart_set_page, | ||
964 | }, | ||
965 | .ring = { | ||
966 | @@ -825,6 +836,7 @@ static struct radeon_asic r520_asic = { | ||
967 | .mc_wait_for_idle = &r520_mc_wait_for_idle, | ||
968 | .gart = { | ||
969 | .tlb_flush = &rv370_pcie_gart_tlb_flush, | ||
970 | + .get_page_entry = &rv370_pcie_gart_get_page_entry, | ||
971 | .set_page = &rv370_pcie_gart_set_page, | ||
972 | }, | ||
973 | .ring = { | ||
974 | @@ -919,6 +931,7 @@ static struct radeon_asic r600_asic = { | ||
975 | .get_gpu_clock_counter = &r600_get_gpu_clock_counter, | ||
976 | .gart = { | ||
977 | .tlb_flush = &r600_pcie_gart_tlb_flush, | ||
978 | + .get_page_entry = &rs600_gart_get_page_entry, | ||
979 | .set_page = &rs600_gart_set_page, | ||
980 | }, | ||
981 | .ring = { | ||
982 | @@ -1004,6 +1017,7 @@ static struct radeon_asic rv6xx_asic = { | ||
983 | .get_gpu_clock_counter = &r600_get_gpu_clock_counter, | ||
984 | .gart = { | ||
985 | .tlb_flush = &r600_pcie_gart_tlb_flush, | ||
986 | + .get_page_entry = &rs600_gart_get_page_entry, | ||
987 | .set_page = &rs600_gart_set_page, | ||
988 | }, | ||
989 | .ring = { | ||
990 | @@ -1095,6 +1109,7 @@ static struct radeon_asic rs780_asic = { | ||
991 | .get_gpu_clock_counter = &r600_get_gpu_clock_counter, | ||
992 | .gart = { | ||
993 | .tlb_flush = &r600_pcie_gart_tlb_flush, | ||
994 | + .get_page_entry = &rs600_gart_get_page_entry, | ||
995 | .set_page = &rs600_gart_set_page, | ||
996 | }, | ||
997 | .ring = { | ||
998 | @@ -1199,6 +1214,7 @@ static struct radeon_asic rv770_asic = { | ||
999 | .get_gpu_clock_counter = &r600_get_gpu_clock_counter, | ||
1000 | .gart = { | ||
1001 | .tlb_flush = &r600_pcie_gart_tlb_flush, | ||
1002 | + .get_page_entry = &rs600_gart_get_page_entry, | ||
1003 | .set_page = &rs600_gart_set_page, | ||
1004 | }, | ||
1005 | .ring = { | ||
1006 | @@ -1317,6 +1333,7 @@ static struct radeon_asic evergreen_asic = { | ||
1007 | .get_gpu_clock_counter = &r600_get_gpu_clock_counter, | ||
1008 | .gart = { | ||
1009 | .tlb_flush = &evergreen_pcie_gart_tlb_flush, | ||
1010 | + .get_page_entry = &rs600_gart_get_page_entry, | ||
1011 | .set_page = &rs600_gart_set_page, | ||
1012 | }, | ||
1013 | .ring = { | ||
1014 | @@ -1409,6 +1426,7 @@ static struct radeon_asic sumo_asic = { | ||
1015 | .get_gpu_clock_counter = &r600_get_gpu_clock_counter, | ||
1016 | .gart = { | ||
1017 | .tlb_flush = &evergreen_pcie_gart_tlb_flush, | ||
1018 | + .get_page_entry = &rs600_gart_get_page_entry, | ||
1019 | .set_page = &rs600_gart_set_page, | ||
1020 | }, | ||
1021 | .ring = { | ||
1022 | @@ -1500,6 +1518,7 @@ static struct radeon_asic btc_asic = { | ||
1023 | .get_gpu_clock_counter = &r600_get_gpu_clock_counter, | ||
1024 | .gart = { | ||
1025 | .tlb_flush = &evergreen_pcie_gart_tlb_flush, | ||
1026 | + .get_page_entry = &rs600_gart_get_page_entry, | ||
1027 | .set_page = &rs600_gart_set_page, | ||
1028 | }, | ||
1029 | .ring = { | ||
1030 | @@ -1635,6 +1654,7 @@ static struct radeon_asic cayman_asic = { | ||
1031 | .get_gpu_clock_counter = &r600_get_gpu_clock_counter, | ||
1032 | .gart = { | ||
1033 | .tlb_flush = &cayman_pcie_gart_tlb_flush, | ||
1034 | + .get_page_entry = &rs600_gart_get_page_entry, | ||
1035 | .set_page = &rs600_gart_set_page, | ||
1036 | }, | ||
1037 | .vm = { | ||
1038 | @@ -1738,6 +1758,7 @@ static struct radeon_asic trinity_asic = { | ||
1039 | .get_gpu_clock_counter = &r600_get_gpu_clock_counter, | ||
1040 | .gart = { | ||
1041 | .tlb_flush = &cayman_pcie_gart_tlb_flush, | ||
1042 | + .get_page_entry = &rs600_gart_get_page_entry, | ||
1043 | .set_page = &rs600_gart_set_page, | ||
1044 | }, | ||
1045 | .vm = { | ||
1046 | @@ -1871,6 +1892,7 @@ static struct radeon_asic si_asic = { | ||
1047 | .get_gpu_clock_counter = &si_get_gpu_clock_counter, | ||
1048 | .gart = { | ||
1049 | .tlb_flush = &si_pcie_gart_tlb_flush, | ||
1050 | + .get_page_entry = &rs600_gart_get_page_entry, | ||
1051 | .set_page = &rs600_gart_set_page, | ||
1052 | }, | ||
1053 | .vm = { | ||
1054 | @@ -2032,6 +2054,7 @@ static struct radeon_asic ci_asic = { | ||
1055 | .get_gpu_clock_counter = &cik_get_gpu_clock_counter, | ||
1056 | .gart = { | ||
1057 | .tlb_flush = &cik_pcie_gart_tlb_flush, | ||
1058 | + .get_page_entry = &rs600_gart_get_page_entry, | ||
1059 | .set_page = &rs600_gart_set_page, | ||
1060 | }, | ||
1061 | .vm = { | ||
1062 | @@ -2139,6 +2162,7 @@ static struct radeon_asic kv_asic = { | ||
1063 | .get_gpu_clock_counter = &cik_get_gpu_clock_counter, | ||
1064 | .gart = { | ||
1065 | .tlb_flush = &cik_pcie_gart_tlb_flush, | ||
1066 | + .get_page_entry = &rs600_gart_get_page_entry, | ||
1067 | .set_page = &rs600_gart_set_page, | ||
1068 | }, | ||
1069 | .vm = { | ||
1070 | diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h | ||
1071 | index d8ace5b28a5b..0c1da2bf1fb4 100644 | ||
1072 | --- a/drivers/gpu/drm/radeon/radeon_asic.h | ||
1073 | +++ b/drivers/gpu/drm/radeon/radeon_asic.h | ||
1074 | @@ -67,8 +67,9 @@ bool r100_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp); | ||
1075 | int r100_asic_reset(struct radeon_device *rdev); | ||
1076 | u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc); | ||
1077 | void r100_pci_gart_tlb_flush(struct radeon_device *rdev); | ||
1078 | +uint64_t r100_pci_gart_get_page_entry(uint64_t addr, uint32_t flags); | ||
1079 | void r100_pci_gart_set_page(struct radeon_device *rdev, unsigned i, | ||
1080 | - uint64_t addr, uint32_t flags); | ||
1081 | + uint64_t entry); | ||
1082 | void r100_ring_start(struct radeon_device *rdev, struct radeon_ring *ring); | ||
1083 | int r100_irq_set(struct radeon_device *rdev); | ||
1084 | int r100_irq_process(struct radeon_device *rdev); | ||
1085 | @@ -172,8 +173,9 @@ extern void r300_fence_ring_emit(struct radeon_device *rdev, | ||
1086 | struct radeon_fence *fence); | ||
1087 | extern int r300_cs_parse(struct radeon_cs_parser *p); | ||
1088 | extern void rv370_pcie_gart_tlb_flush(struct radeon_device *rdev); | ||
1089 | +extern uint64_t rv370_pcie_gart_get_page_entry(uint64_t addr, uint32_t flags); | ||
1090 | extern void rv370_pcie_gart_set_page(struct radeon_device *rdev, unsigned i, | ||
1091 | - uint64_t addr, uint32_t flags); | ||
1092 | + uint64_t entry); | ||
1093 | extern void rv370_set_pcie_lanes(struct radeon_device *rdev, int lanes); | ||
1094 | extern int rv370_get_pcie_lanes(struct radeon_device *rdev); | ||
1095 | extern void r300_set_reg_safe(struct radeon_device *rdev); | ||
1096 | @@ -208,8 +210,9 @@ extern void rs400_fini(struct radeon_device *rdev); | ||
1097 | extern int rs400_suspend(struct radeon_device *rdev); | ||
1098 | extern int rs400_resume(struct radeon_device *rdev); | ||
1099 | void rs400_gart_tlb_flush(struct radeon_device *rdev); | ||
1100 | +uint64_t rs400_gart_get_page_entry(uint64_t addr, uint32_t flags); | ||
1101 | void rs400_gart_set_page(struct radeon_device *rdev, unsigned i, | ||
1102 | - uint64_t addr, uint32_t flags); | ||
1103 | + uint64_t entry); | ||
1104 | uint32_t rs400_mc_rreg(struct radeon_device *rdev, uint32_t reg); | ||
1105 | void rs400_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); | ||
1106 | int rs400_gart_init(struct radeon_device *rdev); | ||
1107 | @@ -232,8 +235,9 @@ int rs600_irq_process(struct radeon_device *rdev); | ||
1108 | void rs600_irq_disable(struct radeon_device *rdev); | ||
1109 | u32 rs600_get_vblank_counter(struct radeon_device *rdev, int crtc); | ||
1110 | void rs600_gart_tlb_flush(struct radeon_device *rdev); | ||
1111 | +uint64_t rs600_gart_get_page_entry(uint64_t addr, uint32_t flags); | ||
1112 | void rs600_gart_set_page(struct radeon_device *rdev, unsigned i, | ||
1113 | - uint64_t addr, uint32_t flags); | ||
1114 | + uint64_t entry); | ||
1115 | uint32_t rs600_mc_rreg(struct radeon_device *rdev, uint32_t reg); | ||
1116 | void rs600_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); | ||
1117 | void rs600_bandwidth_update(struct radeon_device *rdev); | ||
1118 | diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c | ||
1119 | index 995a8b1770dd..bdf263a4a67c 100644 | ||
1120 | --- a/drivers/gpu/drm/radeon/radeon_device.c | ||
1121 | +++ b/drivers/gpu/drm/radeon/radeon_device.c | ||
1122 | @@ -743,6 +743,8 @@ int radeon_dummy_page_init(struct radeon_device *rdev) | ||
1123 | rdev->dummy_page.page = NULL; | ||
1124 | return -ENOMEM; | ||
1125 | } | ||
1126 | + rdev->dummy_page.entry = radeon_gart_get_page_entry(rdev->dummy_page.addr, | ||
1127 | + RADEON_GART_PAGE_DUMMY); | ||
1128 | return 0; | ||
1129 | } | ||
1130 | |||
1131 | diff --git a/drivers/gpu/drm/radeon/radeon_gart.c b/drivers/gpu/drm/radeon/radeon_gart.c | ||
1132 | index 84146d5901aa..c7be612b60c9 100644 | ||
1133 | --- a/drivers/gpu/drm/radeon/radeon_gart.c | ||
1134 | +++ b/drivers/gpu/drm/radeon/radeon_gart.c | ||
1135 | @@ -165,6 +165,19 @@ int radeon_gart_table_vram_pin(struct radeon_device *rdev) | ||
1136 | radeon_bo_unpin(rdev->gart.robj); | ||
1137 | radeon_bo_unreserve(rdev->gart.robj); | ||
1138 | rdev->gart.table_addr = gpu_addr; | ||
1139 | + | ||
1140 | + if (!r) { | ||
1141 | + int i; | ||
1142 | + | ||
1143 | + /* We might have dropped some GART table updates while it wasn't | ||
1144 | + * mapped, restore all entries | ||
1145 | + */ | ||
1146 | + for (i = 0; i < rdev->gart.num_gpu_pages; i++) | ||
1147 | + radeon_gart_set_page(rdev, i, rdev->gart.pages_entry[i]); | ||
1148 | + mb(); | ||
1149 | + radeon_gart_tlb_flush(rdev); | ||
1150 | + } | ||
1151 | + | ||
1152 | return r; | ||
1153 | } | ||
1154 | |||
1155 | @@ -228,7 +241,6 @@ void radeon_gart_unbind(struct radeon_device *rdev, unsigned offset, | ||
1156 | unsigned t; | ||
1157 | unsigned p; | ||
1158 | int i, j; | ||
1159 | - u64 page_base; | ||
1160 | |||
1161 | if (!rdev->gart.ready) { | ||
1162 | WARN(1, "trying to unbind memory from uninitialized GART !\n"); | ||
1163 | @@ -240,13 +252,12 @@ void radeon_gart_unbind(struct radeon_device *rdev, unsigned offset, | ||
1164 | if (rdev->gart.pages[p]) { | ||
1165 | rdev->gart.pages[p] = NULL; | ||
1166 | rdev->gart.pages_addr[p] = rdev->dummy_page.addr; | ||
1167 | - page_base = rdev->gart.pages_addr[p]; | ||
1168 | for (j = 0; j < (PAGE_SIZE / RADEON_GPU_PAGE_SIZE); j++, t++) { | ||
1169 | + rdev->gart.pages_entry[t] = rdev->dummy_page.entry; | ||
1170 | if (rdev->gart.ptr) { | ||
1171 | - radeon_gart_set_page(rdev, t, page_base, | ||
1172 | - RADEON_GART_PAGE_DUMMY); | ||
1173 | + radeon_gart_set_page(rdev, t, | ||
1174 | + rdev->dummy_page.entry); | ||
1175 | } | ||
1176 | - page_base += RADEON_GPU_PAGE_SIZE; | ||
1177 | } | ||
1178 | } | ||
1179 | } | ||
1180 | @@ -274,7 +285,7 @@ int radeon_gart_bind(struct radeon_device *rdev, unsigned offset, | ||
1181 | { | ||
1182 | unsigned t; | ||
1183 | unsigned p; | ||
1184 | - uint64_t page_base; | ||
1185 | + uint64_t page_base, page_entry; | ||
1186 | int i, j; | ||
1187 | |||
1188 | if (!rdev->gart.ready) { | ||
1189 | @@ -287,12 +298,14 @@ int radeon_gart_bind(struct radeon_device *rdev, unsigned offset, | ||
1190 | for (i = 0; i < pages; i++, p++) { | ||
1191 | rdev->gart.pages_addr[p] = dma_addr[i]; | ||
1192 | rdev->gart.pages[p] = pagelist[i]; | ||
1193 | - if (rdev->gart.ptr) { | ||
1194 | - page_base = rdev->gart.pages_addr[p]; | ||
1195 | - for (j = 0; j < (PAGE_SIZE / RADEON_GPU_PAGE_SIZE); j++, t++) { | ||
1196 | - radeon_gart_set_page(rdev, t, page_base, flags); | ||
1197 | - page_base += RADEON_GPU_PAGE_SIZE; | ||
1198 | + page_base = dma_addr[i]; | ||
1199 | + for (j = 0; j < (PAGE_SIZE / RADEON_GPU_PAGE_SIZE); j++, t++) { | ||
1200 | + page_entry = radeon_gart_get_page_entry(page_base, flags); | ||
1201 | + rdev->gart.pages_entry[t] = page_entry; | ||
1202 | + if (rdev->gart.ptr) { | ||
1203 | + radeon_gart_set_page(rdev, t, page_entry); | ||
1204 | } | ||
1205 | + page_base += RADEON_GPU_PAGE_SIZE; | ||
1206 | } | ||
1207 | } | ||
1208 | mb(); | ||
1209 | @@ -340,10 +353,17 @@ int radeon_gart_init(struct radeon_device *rdev) | ||
1210 | radeon_gart_fini(rdev); | ||
1211 | return -ENOMEM; | ||
1212 | } | ||
1213 | + rdev->gart.pages_entry = vmalloc(sizeof(uint64_t) * | ||
1214 | + rdev->gart.num_gpu_pages); | ||
1215 | + if (rdev->gart.pages_entry == NULL) { | ||
1216 | + radeon_gart_fini(rdev); | ||
1217 | + return -ENOMEM; | ||
1218 | + } | ||
1219 | /* set GART entry to point to the dummy page by default */ | ||
1220 | - for (i = 0; i < rdev->gart.num_cpu_pages; i++) { | ||
1221 | + for (i = 0; i < rdev->gart.num_cpu_pages; i++) | ||
1222 | rdev->gart.pages_addr[i] = rdev->dummy_page.addr; | ||
1223 | - } | ||
1224 | + for (i = 0; i < rdev->gart.num_gpu_pages; i++) | ||
1225 | + rdev->gart.pages_entry[i] = rdev->dummy_page.entry; | ||
1226 | return 0; | ||
1227 | } | ||
1228 | |||
1229 | @@ -356,15 +376,17 @@ int radeon_gart_init(struct radeon_device *rdev) | ||
1230 | */ | ||
1231 | void radeon_gart_fini(struct radeon_device *rdev) | ||
1232 | { | ||
1233 | - if (rdev->gart.pages && rdev->gart.pages_addr && rdev->gart.ready) { | ||
1234 | + if (rdev->gart.ready) { | ||
1235 | /* unbind pages */ | ||
1236 | radeon_gart_unbind(rdev, 0, rdev->gart.num_cpu_pages); | ||
1237 | } | ||
1238 | rdev->gart.ready = false; | ||
1239 | vfree(rdev->gart.pages); | ||
1240 | vfree(rdev->gart.pages_addr); | ||
1241 | + vfree(rdev->gart.pages_entry); | ||
1242 | rdev->gart.pages = NULL; | ||
1243 | rdev->gart.pages_addr = NULL; | ||
1244 | + rdev->gart.pages_entry = NULL; | ||
1245 | |||
1246 | radeon_dummy_page_fini(rdev); | ||
1247 | } | ||
1248 | diff --git a/drivers/gpu/drm/radeon/rs400.c b/drivers/gpu/drm/radeon/rs400.c | ||
1249 | index c5799f16aa4b..34e3235f41d2 100644 | ||
1250 | --- a/drivers/gpu/drm/radeon/rs400.c | ||
1251 | +++ b/drivers/gpu/drm/radeon/rs400.c | ||
1252 | @@ -212,11 +212,9 @@ void rs400_gart_fini(struct radeon_device *rdev) | ||
1253 | #define RS400_PTE_WRITEABLE (1 << 2) | ||
1254 | #define RS400_PTE_READABLE (1 << 3) | ||
1255 | |||
1256 | -void rs400_gart_set_page(struct radeon_device *rdev, unsigned i, | ||
1257 | - uint64_t addr, uint32_t flags) | ||
1258 | +uint64_t rs400_gart_get_page_entry(uint64_t addr, uint32_t flags) | ||
1259 | { | ||
1260 | uint32_t entry; | ||
1261 | - u32 *gtt = rdev->gart.ptr; | ||
1262 | |||
1263 | entry = (lower_32_bits(addr) & PAGE_MASK) | | ||
1264 | ((upper_32_bits(addr) & 0xff) << 4); | ||
1265 | @@ -226,8 +224,14 @@ void rs400_gart_set_page(struct radeon_device *rdev, unsigned i, | ||
1266 | entry |= RS400_PTE_WRITEABLE; | ||
1267 | if (!(flags & RADEON_GART_PAGE_SNOOP)) | ||
1268 | entry |= RS400_PTE_UNSNOOPED; | ||
1269 | - entry = cpu_to_le32(entry); | ||
1270 | - gtt[i] = entry; | ||
1271 | + return entry; | ||
1272 | +} | ||
1273 | + | ||
1274 | +void rs400_gart_set_page(struct radeon_device *rdev, unsigned i, | ||
1275 | + uint64_t entry) | ||
1276 | +{ | ||
1277 | + u32 *gtt = rdev->gart.ptr; | ||
1278 | + gtt[i] = cpu_to_le32(lower_32_bits(entry)); | ||
1279 | } | ||
1280 | |||
1281 | int rs400_mc_wait_for_idle(struct radeon_device *rdev) | ||
1282 | diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c | ||
1283 | index 9acb1c3c005b..74bce91aecc1 100644 | ||
1284 | --- a/drivers/gpu/drm/radeon/rs600.c | ||
1285 | +++ b/drivers/gpu/drm/radeon/rs600.c | ||
1286 | @@ -625,11 +625,8 @@ static void rs600_gart_fini(struct radeon_device *rdev) | ||
1287 | radeon_gart_table_vram_free(rdev); | ||
1288 | } | ||
1289 | |||
1290 | -void rs600_gart_set_page(struct radeon_device *rdev, unsigned i, | ||
1291 | - uint64_t addr, uint32_t flags) | ||
1292 | +uint64_t rs600_gart_get_page_entry(uint64_t addr, uint32_t flags) | ||
1293 | { | ||
1294 | - void __iomem *ptr = (void *)rdev->gart.ptr; | ||
1295 | - | ||
1296 | addr = addr & 0xFFFFFFFFFFFFF000ULL; | ||
1297 | addr |= R600_PTE_SYSTEM; | ||
1298 | if (flags & RADEON_GART_PAGE_VALID) | ||
1299 | @@ -640,7 +637,14 @@ void rs600_gart_set_page(struct radeon_device *rdev, unsigned i, | ||
1300 | addr |= R600_PTE_WRITEABLE; | ||
1301 | if (flags & RADEON_GART_PAGE_SNOOP) | ||
1302 | addr |= R600_PTE_SNOOPED; | ||
1303 | - writeq(addr, ptr + (i * 8)); | ||
1304 | + return addr; | ||
1305 | +} | ||
1306 | + | ||
1307 | +void rs600_gart_set_page(struct radeon_device *rdev, unsigned i, | ||
1308 | + uint64_t entry) | ||
1309 | +{ | ||
1310 | + void __iomem *ptr = (void *)rdev->gart.ptr; | ||
1311 | + writeq(entry, ptr + (i * 8)); | ||
1312 | } | ||
1313 | |||
1314 | int rs600_irq_set(struct radeon_device *rdev) | ||
1315 | diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | ||
1316 | index daeca571b42f..810dac80179c 100644 | ||
1317 | --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | ||
1318 | +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | ||
1319 | @@ -406,11 +406,9 @@ int vmw_3d_resource_inc(struct vmw_private *dev_priv, | ||
1320 | if (unlikely(ret != 0)) | ||
1321 | --dev_priv->num_3d_resources; | ||
1322 | } else if (unhide_svga) { | ||
1323 | - mutex_lock(&dev_priv->hw_mutex); | ||
1324 | vmw_write(dev_priv, SVGA_REG_ENABLE, | ||
1325 | vmw_read(dev_priv, SVGA_REG_ENABLE) & | ||
1326 | ~SVGA_REG_ENABLE_HIDE); | ||
1327 | - mutex_unlock(&dev_priv->hw_mutex); | ||
1328 | } | ||
1329 | |||
1330 | mutex_unlock(&dev_priv->release_mutex); | ||
1331 | @@ -433,13 +431,10 @@ void vmw_3d_resource_dec(struct vmw_private *dev_priv, | ||
1332 | mutex_lock(&dev_priv->release_mutex); | ||
1333 | if (unlikely(--dev_priv->num_3d_resources == 0)) | ||
1334 | vmw_release_device(dev_priv); | ||
1335 | - else if (hide_svga) { | ||
1336 | - mutex_lock(&dev_priv->hw_mutex); | ||
1337 | + else if (hide_svga) | ||
1338 | vmw_write(dev_priv, SVGA_REG_ENABLE, | ||
1339 | vmw_read(dev_priv, SVGA_REG_ENABLE) | | ||
1340 | SVGA_REG_ENABLE_HIDE); | ||
1341 | - mutex_unlock(&dev_priv->hw_mutex); | ||
1342 | - } | ||
1343 | |||
1344 | n3d = (int32_t) dev_priv->num_3d_resources; | ||
1345 | mutex_unlock(&dev_priv->release_mutex); | ||
1346 | @@ -600,12 +595,14 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset) | ||
1347 | dev_priv->dev = dev; | ||
1348 | dev_priv->vmw_chipset = chipset; | ||
1349 | dev_priv->last_read_seqno = (uint32_t) -100; | ||
1350 | - mutex_init(&dev_priv->hw_mutex); | ||
1351 | mutex_init(&dev_priv->cmdbuf_mutex); | ||
1352 | mutex_init(&dev_priv->release_mutex); | ||
1353 | mutex_init(&dev_priv->binding_mutex); | ||
1354 | rwlock_init(&dev_priv->resource_lock); | ||
1355 | ttm_lock_init(&dev_priv->reservation_sem); | ||
1356 | + spin_lock_init(&dev_priv->hw_lock); | ||
1357 | + spin_lock_init(&dev_priv->waiter_lock); | ||
1358 | + spin_lock_init(&dev_priv->cap_lock); | ||
1359 | |||
1360 | for (i = vmw_res_context; i < vmw_res_max; ++i) { | ||
1361 | idr_init(&dev_priv->res_idr[i]); | ||
1362 | @@ -626,14 +623,11 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset) | ||
1363 | |||
1364 | dev_priv->enable_fb = enable_fbdev; | ||
1365 | |||
1366 | - mutex_lock(&dev_priv->hw_mutex); | ||
1367 | - | ||
1368 | vmw_write(dev_priv, SVGA_REG_ID, SVGA_ID_2); | ||
1369 | svga_id = vmw_read(dev_priv, SVGA_REG_ID); | ||
1370 | if (svga_id != SVGA_ID_2) { | ||
1371 | ret = -ENOSYS; | ||
1372 | DRM_ERROR("Unsupported SVGA ID 0x%x\n", svga_id); | ||
1373 | - mutex_unlock(&dev_priv->hw_mutex); | ||
1374 | goto out_err0; | ||
1375 | } | ||
1376 | |||
1377 | @@ -683,10 +677,8 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset) | ||
1378 | dev_priv->prim_bb_mem = dev_priv->vram_size; | ||
1379 | |||
1380 | ret = vmw_dma_masks(dev_priv); | ||
1381 | - if (unlikely(ret != 0)) { | ||
1382 | - mutex_unlock(&dev_priv->hw_mutex); | ||
1383 | + if (unlikely(ret != 0)) | ||
1384 | goto out_err0; | ||
1385 | - } | ||
1386 | |||
1387 | /* | ||
1388 | * Limit back buffer size to VRAM size. Remove this once | ||
1389 | @@ -695,8 +687,6 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset) | ||
1390 | if (dev_priv->prim_bb_mem > dev_priv->vram_size) | ||
1391 | dev_priv->prim_bb_mem = dev_priv->vram_size; | ||
1392 | |||
1393 | - mutex_unlock(&dev_priv->hw_mutex); | ||
1394 | - | ||
1395 | vmw_print_capabilities(dev_priv->capabilities); | ||
1396 | |||
1397 | if (dev_priv->capabilities & SVGA_CAP_GMR2) { | ||
1398 | @@ -1161,9 +1151,7 @@ static int vmw_master_set(struct drm_device *dev, | ||
1399 | if (unlikely(ret != 0)) | ||
1400 | return ret; | ||
1401 | vmw_kms_save_vga(dev_priv); | ||
1402 | - mutex_lock(&dev_priv->hw_mutex); | ||
1403 | vmw_write(dev_priv, SVGA_REG_TRACES, 0); | ||
1404 | - mutex_unlock(&dev_priv->hw_mutex); | ||
1405 | } | ||
1406 | |||
1407 | if (active) { | ||
1408 | @@ -1197,9 +1185,7 @@ out_no_active_lock: | ||
1409 | if (!dev_priv->enable_fb) { | ||
1410 | vmw_kms_restore_vga(dev_priv); | ||
1411 | vmw_3d_resource_dec(dev_priv, true); | ||
1412 | - mutex_lock(&dev_priv->hw_mutex); | ||
1413 | vmw_write(dev_priv, SVGA_REG_TRACES, 1); | ||
1414 | - mutex_unlock(&dev_priv->hw_mutex); | ||
1415 | } | ||
1416 | return ret; | ||
1417 | } | ||
1418 | @@ -1234,9 +1220,7 @@ static void vmw_master_drop(struct drm_device *dev, | ||
1419 | DRM_ERROR("Unable to clean VRAM on master drop.\n"); | ||
1420 | vmw_kms_restore_vga(dev_priv); | ||
1421 | vmw_3d_resource_dec(dev_priv, true); | ||
1422 | - mutex_lock(&dev_priv->hw_mutex); | ||
1423 | vmw_write(dev_priv, SVGA_REG_TRACES, 1); | ||
1424 | - mutex_unlock(&dev_priv->hw_mutex); | ||
1425 | } | ||
1426 | |||
1427 | dev_priv->active_master = &dev_priv->fbdev_master; | ||
1428 | @@ -1368,10 +1352,8 @@ static void vmw_pm_complete(struct device *kdev) | ||
1429 | struct drm_device *dev = pci_get_drvdata(pdev); | ||
1430 | struct vmw_private *dev_priv = vmw_priv(dev); | ||
1431 | |||
1432 | - mutex_lock(&dev_priv->hw_mutex); | ||
1433 | vmw_write(dev_priv, SVGA_REG_ID, SVGA_ID_2); | ||
1434 | (void) vmw_read(dev_priv, SVGA_REG_ID); | ||
1435 | - mutex_unlock(&dev_priv->hw_mutex); | ||
1436 | |||
1437 | /** | ||
1438 | * Reclaim 3d reference held by fbdev and potentially | ||
1439 | diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | ||
1440 | index 4ee799b43d5d..d26a6daa9719 100644 | ||
1441 | --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | ||
1442 | +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | ||
1443 | @@ -399,7 +399,8 @@ struct vmw_private { | ||
1444 | uint32_t memory_size; | ||
1445 | bool has_gmr; | ||
1446 | bool has_mob; | ||
1447 | - struct mutex hw_mutex; | ||
1448 | + spinlock_t hw_lock; | ||
1449 | + spinlock_t cap_lock; | ||
1450 | |||
1451 | /* | ||
1452 | * VGA registers. | ||
1453 | @@ -449,8 +450,9 @@ struct vmw_private { | ||
1454 | atomic_t marker_seq; | ||
1455 | wait_queue_head_t fence_queue; | ||
1456 | wait_queue_head_t fifo_queue; | ||
1457 | - int fence_queue_waiters; /* Protected by hw_mutex */ | ||
1458 | - int goal_queue_waiters; /* Protected by hw_mutex */ | ||
1459 | + spinlock_t waiter_lock; | ||
1460 | + int fence_queue_waiters; /* Protected by waiter_lock */ | ||
1461 | + int goal_queue_waiters; /* Protected by waiter_lock */ | ||
1462 | atomic_t fifo_queue_waiters; | ||
1463 | uint32_t last_read_seqno; | ||
1464 | spinlock_t irq_lock; | ||
1465 | @@ -553,20 +555,35 @@ static inline struct vmw_master *vmw_master(struct drm_master *master) | ||
1466 | return (struct vmw_master *) master->driver_priv; | ||
1467 | } | ||
1468 | |||
1469 | +/* | ||
1470 | + * The locking here is fine-grained, so that it is performed once | ||
1471 | + * for every read- and write operation. This is of course costly, but we | ||
1472 | + * don't perform much register access in the timing critical paths anyway. | ||
1473 | + * Instead we have the extra benefit of being sure that we don't forget | ||
1474 | + * the hw lock around register accesses. | ||
1475 | + */ | ||
1476 | static inline void vmw_write(struct vmw_private *dev_priv, | ||
1477 | unsigned int offset, uint32_t value) | ||
1478 | { | ||
1479 | + unsigned long irq_flags; | ||
1480 | + | ||
1481 | + spin_lock_irqsave(&dev_priv->hw_lock, irq_flags); | ||
1482 | outl(offset, dev_priv->io_start + VMWGFX_INDEX_PORT); | ||
1483 | outl(value, dev_priv->io_start + VMWGFX_VALUE_PORT); | ||
1484 | + spin_unlock_irqrestore(&dev_priv->hw_lock, irq_flags); | ||
1485 | } | ||
1486 | |||
1487 | static inline uint32_t vmw_read(struct vmw_private *dev_priv, | ||
1488 | unsigned int offset) | ||
1489 | { | ||
1490 | - uint32_t val; | ||
1491 | + unsigned long irq_flags; | ||
1492 | + u32 val; | ||
1493 | |||
1494 | + spin_lock_irqsave(&dev_priv->hw_lock, irq_flags); | ||
1495 | outl(offset, dev_priv->io_start + VMWGFX_INDEX_PORT); | ||
1496 | val = inl(dev_priv->io_start + VMWGFX_VALUE_PORT); | ||
1497 | + spin_unlock_irqrestore(&dev_priv->hw_lock, irq_flags); | ||
1498 | + | ||
1499 | return val; | ||
1500 | } | ||
1501 | |||
1502 | diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_fence.c b/drivers/gpu/drm/vmwgfx/vmwgfx_fence.c | ||
1503 | index b7594cb758af..945f1e0dad92 100644 | ||
1504 | --- a/drivers/gpu/drm/vmwgfx/vmwgfx_fence.c | ||
1505 | +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fence.c | ||
1506 | @@ -35,7 +35,7 @@ struct vmw_fence_manager { | ||
1507 | struct vmw_private *dev_priv; | ||
1508 | spinlock_t lock; | ||
1509 | struct list_head fence_list; | ||
1510 | - struct work_struct work, ping_work; | ||
1511 | + struct work_struct work; | ||
1512 | u32 user_fence_size; | ||
1513 | u32 fence_size; | ||
1514 | u32 event_fence_action_size; | ||
1515 | @@ -134,14 +134,6 @@ static const char *vmw_fence_get_timeline_name(struct fence *f) | ||
1516 | return "svga"; | ||
1517 | } | ||
1518 | |||
1519 | -static void vmw_fence_ping_func(struct work_struct *work) | ||
1520 | -{ | ||
1521 | - struct vmw_fence_manager *fman = | ||
1522 | - container_of(work, struct vmw_fence_manager, ping_work); | ||
1523 | - | ||
1524 | - vmw_fifo_ping_host(fman->dev_priv, SVGA_SYNC_GENERIC); | ||
1525 | -} | ||
1526 | - | ||
1527 | static bool vmw_fence_enable_signaling(struct fence *f) | ||
1528 | { | ||
1529 | struct vmw_fence_obj *fence = | ||
1530 | @@ -155,11 +147,7 @@ static bool vmw_fence_enable_signaling(struct fence *f) | ||
1531 | if (seqno - fence->base.seqno < VMW_FENCE_WRAP) | ||
1532 | return false; | ||
1533 | |||
1534 | - if (mutex_trylock(&dev_priv->hw_mutex)) { | ||
1535 | - vmw_fifo_ping_host_locked(dev_priv, SVGA_SYNC_GENERIC); | ||
1536 | - mutex_unlock(&dev_priv->hw_mutex); | ||
1537 | - } else | ||
1538 | - schedule_work(&fman->ping_work); | ||
1539 | + vmw_fifo_ping_host(dev_priv, SVGA_SYNC_GENERIC); | ||
1540 | |||
1541 | return true; | ||
1542 | } | ||
1543 | @@ -305,7 +293,6 @@ struct vmw_fence_manager *vmw_fence_manager_init(struct vmw_private *dev_priv) | ||
1544 | INIT_LIST_HEAD(&fman->fence_list); | ||
1545 | INIT_LIST_HEAD(&fman->cleanup_list); | ||
1546 | INIT_WORK(&fman->work, &vmw_fence_work_func); | ||
1547 | - INIT_WORK(&fman->ping_work, &vmw_fence_ping_func); | ||
1548 | fman->fifo_down = true; | ||
1549 | fman->user_fence_size = ttm_round_pot(sizeof(struct vmw_user_fence)); | ||
1550 | fman->fence_size = ttm_round_pot(sizeof(struct vmw_fence_obj)); | ||
1551 | @@ -323,7 +310,6 @@ void vmw_fence_manager_takedown(struct vmw_fence_manager *fman) | ||
1552 | bool lists_empty; | ||
1553 | |||
1554 | (void) cancel_work_sync(&fman->work); | ||
1555 | - (void) cancel_work_sync(&fman->ping_work); | ||
1556 | |||
1557 | spin_lock_irqsave(&fman->lock, irq_flags); | ||
1558 | lists_empty = list_empty(&fman->fence_list) && | ||
1559 | diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c b/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c | ||
1560 | index 09e10aefcd8e..39f2b03888e7 100644 | ||
1561 | --- a/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c | ||
1562 | +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c | ||
1563 | @@ -44,10 +44,10 @@ bool vmw_fifo_have_3d(struct vmw_private *dev_priv) | ||
1564 | if (!dev_priv->has_mob) | ||
1565 | return false; | ||
1566 | |||
1567 | - mutex_lock(&dev_priv->hw_mutex); | ||
1568 | + spin_lock(&dev_priv->cap_lock); | ||
1569 | vmw_write(dev_priv, SVGA_REG_DEV_CAP, SVGA3D_DEVCAP_3D); | ||
1570 | result = vmw_read(dev_priv, SVGA_REG_DEV_CAP); | ||
1571 | - mutex_unlock(&dev_priv->hw_mutex); | ||
1572 | + spin_unlock(&dev_priv->cap_lock); | ||
1573 | |||
1574 | return (result != 0); | ||
1575 | } | ||
1576 | @@ -120,7 +120,6 @@ int vmw_fifo_init(struct vmw_private *dev_priv, struct vmw_fifo_state *fifo) | ||
1577 | DRM_INFO("height %d\n", vmw_read(dev_priv, SVGA_REG_HEIGHT)); | ||
1578 | DRM_INFO("bpp %d\n", vmw_read(dev_priv, SVGA_REG_BITS_PER_PIXEL)); | ||
1579 | |||
1580 | - mutex_lock(&dev_priv->hw_mutex); | ||
1581 | dev_priv->enable_state = vmw_read(dev_priv, SVGA_REG_ENABLE); | ||
1582 | dev_priv->config_done_state = vmw_read(dev_priv, SVGA_REG_CONFIG_DONE); | ||
1583 | dev_priv->traces_state = vmw_read(dev_priv, SVGA_REG_TRACES); | ||
1584 | @@ -143,7 +142,6 @@ int vmw_fifo_init(struct vmw_private *dev_priv, struct vmw_fifo_state *fifo) | ||
1585 | mb(); | ||
1586 | |||
1587 | vmw_write(dev_priv, SVGA_REG_CONFIG_DONE, 1); | ||
1588 | - mutex_unlock(&dev_priv->hw_mutex); | ||
1589 | |||
1590 | max = ioread32(fifo_mem + SVGA_FIFO_MAX); | ||
1591 | min = ioread32(fifo_mem + SVGA_FIFO_MIN); | ||
1592 | @@ -160,31 +158,28 @@ int vmw_fifo_init(struct vmw_private *dev_priv, struct vmw_fifo_state *fifo) | ||
1593 | return vmw_fifo_send_fence(dev_priv, &dummy); | ||
1594 | } | ||
1595 | |||
1596 | -void vmw_fifo_ping_host_locked(struct vmw_private *dev_priv, uint32_t reason) | ||
1597 | +void vmw_fifo_ping_host(struct vmw_private *dev_priv, uint32_t reason) | ||
1598 | { | ||
1599 | __le32 __iomem *fifo_mem = dev_priv->mmio_virt; | ||
1600 | + static DEFINE_SPINLOCK(ping_lock); | ||
1601 | + unsigned long irq_flags; | ||
1602 | |||
1603 | + /* | ||
1604 | + * The ping_lock is needed because we don't have an atomic | ||
1605 | + * test-and-set of the SVGA_FIFO_BUSY register. | ||
1606 | + */ | ||
1607 | + spin_lock_irqsave(&ping_lock, irq_flags); | ||
1608 | if (unlikely(ioread32(fifo_mem + SVGA_FIFO_BUSY) == 0)) { | ||
1609 | iowrite32(1, fifo_mem + SVGA_FIFO_BUSY); | ||
1610 | vmw_write(dev_priv, SVGA_REG_SYNC, reason); | ||
1611 | } | ||
1612 | -} | ||
1613 | - | ||
1614 | -void vmw_fifo_ping_host(struct vmw_private *dev_priv, uint32_t reason) | ||
1615 | -{ | ||
1616 | - mutex_lock(&dev_priv->hw_mutex); | ||
1617 | - | ||
1618 | - vmw_fifo_ping_host_locked(dev_priv, reason); | ||
1619 | - | ||
1620 | - mutex_unlock(&dev_priv->hw_mutex); | ||
1621 | + spin_unlock_irqrestore(&ping_lock, irq_flags); | ||
1622 | } | ||
1623 | |||
1624 | void vmw_fifo_release(struct vmw_private *dev_priv, struct vmw_fifo_state *fifo) | ||
1625 | { | ||
1626 | __le32 __iomem *fifo_mem = dev_priv->mmio_virt; | ||
1627 | |||
1628 | - mutex_lock(&dev_priv->hw_mutex); | ||
1629 | - | ||
1630 | vmw_write(dev_priv, SVGA_REG_SYNC, SVGA_SYNC_GENERIC); | ||
1631 | while (vmw_read(dev_priv, SVGA_REG_BUSY) != 0) | ||
1632 | ; | ||
1633 | @@ -198,7 +193,6 @@ void vmw_fifo_release(struct vmw_private *dev_priv, struct vmw_fifo_state *fifo) | ||
1634 | vmw_write(dev_priv, SVGA_REG_TRACES, | ||
1635 | dev_priv->traces_state); | ||
1636 | |||
1637 | - mutex_unlock(&dev_priv->hw_mutex); | ||
1638 | vmw_marker_queue_takedown(&fifo->marker_queue); | ||
1639 | |||
1640 | if (likely(fifo->static_buffer != NULL)) { | ||
1641 | @@ -271,7 +265,7 @@ static int vmw_fifo_wait(struct vmw_private *dev_priv, | ||
1642 | return vmw_fifo_wait_noirq(dev_priv, bytes, | ||
1643 | interruptible, timeout); | ||
1644 | |||
1645 | - mutex_lock(&dev_priv->hw_mutex); | ||
1646 | + spin_lock(&dev_priv->waiter_lock); | ||
1647 | if (atomic_add_return(1, &dev_priv->fifo_queue_waiters) > 0) { | ||
1648 | spin_lock_irqsave(&dev_priv->irq_lock, irq_flags); | ||
1649 | outl(SVGA_IRQFLAG_FIFO_PROGRESS, | ||
1650 | @@ -280,7 +274,7 @@ static int vmw_fifo_wait(struct vmw_private *dev_priv, | ||
1651 | vmw_write(dev_priv, SVGA_REG_IRQMASK, dev_priv->irq_mask); | ||
1652 | spin_unlock_irqrestore(&dev_priv->irq_lock, irq_flags); | ||
1653 | } | ||
1654 | - mutex_unlock(&dev_priv->hw_mutex); | ||
1655 | + spin_unlock(&dev_priv->waiter_lock); | ||
1656 | |||
1657 | if (interruptible) | ||
1658 | ret = wait_event_interruptible_timeout | ||
1659 | @@ -296,14 +290,14 @@ static int vmw_fifo_wait(struct vmw_private *dev_priv, | ||
1660 | else if (likely(ret > 0)) | ||
1661 | ret = 0; | ||
1662 | |||
1663 | - mutex_lock(&dev_priv->hw_mutex); | ||
1664 | + spin_lock(&dev_priv->waiter_lock); | ||
1665 | if (atomic_dec_and_test(&dev_priv->fifo_queue_waiters)) { | ||
1666 | spin_lock_irqsave(&dev_priv->irq_lock, irq_flags); | ||
1667 | dev_priv->irq_mask &= ~SVGA_IRQFLAG_FIFO_PROGRESS; | ||
1668 | vmw_write(dev_priv, SVGA_REG_IRQMASK, dev_priv->irq_mask); | ||
1669 | spin_unlock_irqrestore(&dev_priv->irq_lock, irq_flags); | ||
1670 | } | ||
1671 | - mutex_unlock(&dev_priv->hw_mutex); | ||
1672 | + spin_unlock(&dev_priv->waiter_lock); | ||
1673 | |||
1674 | return ret; | ||
1675 | } | ||
1676 | diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c | ||
1677 | index 37881ecf5d7a..69c8ce23123c 100644 | ||
1678 | --- a/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c | ||
1679 | +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c | ||
1680 | @@ -135,13 +135,13 @@ static int vmw_fill_compat_cap(struct vmw_private *dev_priv, void *bounce, | ||
1681 | (pair_offset + max_size * sizeof(SVGA3dCapPair)) / sizeof(u32); | ||
1682 | compat_cap->header.type = SVGA3DCAPS_RECORD_DEVCAPS; | ||
1683 | |||
1684 | - mutex_lock(&dev_priv->hw_mutex); | ||
1685 | + spin_lock(&dev_priv->cap_lock); | ||
1686 | for (i = 0; i < max_size; ++i) { | ||
1687 | vmw_write(dev_priv, SVGA_REG_DEV_CAP, i); | ||
1688 | compat_cap->pairs[i][0] = i; | ||
1689 | compat_cap->pairs[i][1] = vmw_read(dev_priv, SVGA_REG_DEV_CAP); | ||
1690 | } | ||
1691 | - mutex_unlock(&dev_priv->hw_mutex); | ||
1692 | + spin_unlock(&dev_priv->cap_lock); | ||
1693 | |||
1694 | return 0; | ||
1695 | } | ||
1696 | @@ -191,12 +191,12 @@ int vmw_get_cap_3d_ioctl(struct drm_device *dev, void *data, | ||
1697 | if (num > SVGA3D_DEVCAP_MAX) | ||
1698 | num = SVGA3D_DEVCAP_MAX; | ||
1699 | |||
1700 | - mutex_lock(&dev_priv->hw_mutex); | ||
1701 | + spin_lock(&dev_priv->cap_lock); | ||
1702 | for (i = 0; i < num; ++i) { | ||
1703 | vmw_write(dev_priv, SVGA_REG_DEV_CAP, i); | ||
1704 | *bounce32++ = vmw_read(dev_priv, SVGA_REG_DEV_CAP); | ||
1705 | } | ||
1706 | - mutex_unlock(&dev_priv->hw_mutex); | ||
1707 | + spin_unlock(&dev_priv->cap_lock); | ||
1708 | } else if (gb_objects) { | ||
1709 | ret = vmw_fill_compat_cap(dev_priv, bounce, size); | ||
1710 | if (unlikely(ret != 0)) | ||
1711 | diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_irq.c b/drivers/gpu/drm/vmwgfx/vmwgfx_irq.c | ||
1712 | index 0c423766c441..9fe9827ee499 100644 | ||
1713 | --- a/drivers/gpu/drm/vmwgfx/vmwgfx_irq.c | ||
1714 | +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_irq.c | ||
1715 | @@ -62,13 +62,8 @@ irqreturn_t vmw_irq_handler(int irq, void *arg) | ||
1716 | |||
1717 | static bool vmw_fifo_idle(struct vmw_private *dev_priv, uint32_t seqno) | ||
1718 | { | ||
1719 | - uint32_t busy; | ||
1720 | |||
1721 | - mutex_lock(&dev_priv->hw_mutex); | ||
1722 | - busy = vmw_read(dev_priv, SVGA_REG_BUSY); | ||
1723 | - mutex_unlock(&dev_priv->hw_mutex); | ||
1724 | - | ||
1725 | - return (busy == 0); | ||
1726 | + return (vmw_read(dev_priv, SVGA_REG_BUSY) == 0); | ||
1727 | } | ||
1728 | |||
1729 | void vmw_update_seqno(struct vmw_private *dev_priv, | ||
1730 | @@ -184,7 +179,7 @@ int vmw_fallback_wait(struct vmw_private *dev_priv, | ||
1731 | |||
1732 | void vmw_seqno_waiter_add(struct vmw_private *dev_priv) | ||
1733 | { | ||
1734 | - mutex_lock(&dev_priv->hw_mutex); | ||
1735 | + spin_lock(&dev_priv->waiter_lock); | ||
1736 | if (dev_priv->fence_queue_waiters++ == 0) { | ||
1737 | unsigned long irq_flags; | ||
1738 | |||
1739 | @@ -195,12 +190,12 @@ void vmw_seqno_waiter_add(struct vmw_private *dev_priv) | ||
1740 | vmw_write(dev_priv, SVGA_REG_IRQMASK, dev_priv->irq_mask); | ||
1741 | spin_unlock_irqrestore(&dev_priv->irq_lock, irq_flags); | ||
1742 | } | ||
1743 | - mutex_unlock(&dev_priv->hw_mutex); | ||
1744 | + spin_unlock(&dev_priv->waiter_lock); | ||
1745 | } | ||
1746 | |||
1747 | void vmw_seqno_waiter_remove(struct vmw_private *dev_priv) | ||
1748 | { | ||
1749 | - mutex_lock(&dev_priv->hw_mutex); | ||
1750 | + spin_lock(&dev_priv->waiter_lock); | ||
1751 | if (--dev_priv->fence_queue_waiters == 0) { | ||
1752 | unsigned long irq_flags; | ||
1753 | |||
1754 | @@ -209,13 +204,13 @@ void vmw_seqno_waiter_remove(struct vmw_private *dev_priv) | ||
1755 | vmw_write(dev_priv, SVGA_REG_IRQMASK, dev_priv->irq_mask); | ||
1756 | spin_unlock_irqrestore(&dev_priv->irq_lock, irq_flags); | ||
1757 | } | ||
1758 | - mutex_unlock(&dev_priv->hw_mutex); | ||
1759 | + spin_unlock(&dev_priv->waiter_lock); | ||
1760 | } | ||
1761 | |||
1762 | |||
1763 | void vmw_goal_waiter_add(struct vmw_private *dev_priv) | ||
1764 | { | ||
1765 | - mutex_lock(&dev_priv->hw_mutex); | ||
1766 | + spin_lock(&dev_priv->waiter_lock); | ||
1767 | if (dev_priv->goal_queue_waiters++ == 0) { | ||
1768 | unsigned long irq_flags; | ||
1769 | |||
1770 | @@ -226,12 +221,12 @@ void vmw_goal_waiter_add(struct vmw_private *dev_priv) | ||
1771 | vmw_write(dev_priv, SVGA_REG_IRQMASK, dev_priv->irq_mask); | ||
1772 | spin_unlock_irqrestore(&dev_priv->irq_lock, irq_flags); | ||
1773 | } | ||
1774 | - mutex_unlock(&dev_priv->hw_mutex); | ||
1775 | + spin_unlock(&dev_priv->waiter_lock); | ||
1776 | } | ||
1777 | |||
1778 | void vmw_goal_waiter_remove(struct vmw_private *dev_priv) | ||
1779 | { | ||
1780 | - mutex_lock(&dev_priv->hw_mutex); | ||
1781 | + spin_lock(&dev_priv->waiter_lock); | ||
1782 | if (--dev_priv->goal_queue_waiters == 0) { | ||
1783 | unsigned long irq_flags; | ||
1784 | |||
1785 | @@ -240,7 +235,7 @@ void vmw_goal_waiter_remove(struct vmw_private *dev_priv) | ||
1786 | vmw_write(dev_priv, SVGA_REG_IRQMASK, dev_priv->irq_mask); | ||
1787 | spin_unlock_irqrestore(&dev_priv->irq_lock, irq_flags); | ||
1788 | } | ||
1789 | - mutex_unlock(&dev_priv->hw_mutex); | ||
1790 | + spin_unlock(&dev_priv->waiter_lock); | ||
1791 | } | ||
1792 | |||
1793 | int vmw_wait_seqno(struct vmw_private *dev_priv, | ||
1794 | @@ -315,9 +310,7 @@ void vmw_irq_uninstall(struct drm_device *dev) | ||
1795 | if (!(dev_priv->capabilities & SVGA_CAP_IRQMASK)) | ||
1796 | return; | ||
1797 | |||
1798 | - mutex_lock(&dev_priv->hw_mutex); | ||
1799 | vmw_write(dev_priv, SVGA_REG_IRQMASK, 0); | ||
1800 | - mutex_unlock(&dev_priv->hw_mutex); | ||
1801 | |||
1802 | status = inl(dev_priv->io_start + VMWGFX_IRQSTATUS_PORT); | ||
1803 | outl(status, dev_priv->io_start + VMWGFX_IRQSTATUS_PORT); | ||
1804 | diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | ||
1805 | index 941a7bc0b791..fddd53335237 100644 | ||
1806 | --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | ||
1807 | +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | ||
1808 | @@ -1828,9 +1828,7 @@ vmw_du_connector_detect(struct drm_connector *connector, bool force) | ||
1809 | struct vmw_private *dev_priv = vmw_priv(dev); | ||
1810 | struct vmw_display_unit *du = vmw_connector_to_du(connector); | ||
1811 | |||
1812 | - mutex_lock(&dev_priv->hw_mutex); | ||
1813 | num_displays = vmw_read(dev_priv, SVGA_REG_NUM_DISPLAYS); | ||
1814 | - mutex_unlock(&dev_priv->hw_mutex); | ||
1815 | |||
1816 | return ((vmw_connector_to_du(connector)->unit < num_displays && | ||
1817 | du->pref_active) ? | ||
1818 | diff --git a/drivers/hid/hid-rmi.c b/drivers/hid/hid-rmi.c | ||
1819 | index 3cccff73b9b9..a994477bd25a 100644 | ||
1820 | --- a/drivers/hid/hid-rmi.c | ||
1821 | +++ b/drivers/hid/hid-rmi.c | ||
1822 | @@ -584,11 +584,15 @@ static int rmi_populate_f11(struct hid_device *hdev) | ||
1823 | bool has_query10 = false; | ||
1824 | bool has_query11; | ||
1825 | bool has_query12; | ||
1826 | + bool has_query27; | ||
1827 | + bool has_query28; | ||
1828 | + bool has_query36 = false; | ||
1829 | bool has_physical_props; | ||
1830 | bool has_gestures; | ||
1831 | bool has_rel; | ||
1832 | + bool has_data40 = false; | ||
1833 | unsigned x_size, y_size; | ||
1834 | - u16 query12_offset; | ||
1835 | + u16 query_offset; | ||
1836 | |||
1837 | if (!data->f11.query_base_addr) { | ||
1838 | hid_err(hdev, "No 2D sensor found, giving up.\n"); | ||
1839 | @@ -604,6 +608,8 @@ static int rmi_populate_f11(struct hid_device *hdev) | ||
1840 | has_query9 = !!(buf[0] & BIT(3)); | ||
1841 | has_query11 = !!(buf[0] & BIT(4)); | ||
1842 | has_query12 = !!(buf[0] & BIT(5)); | ||
1843 | + has_query27 = !!(buf[0] & BIT(6)); | ||
1844 | + has_query28 = !!(buf[0] & BIT(7)); | ||
1845 | |||
1846 | /* query 1 to get the max number of fingers */ | ||
1847 | ret = rmi_read(hdev, data->f11.query_base_addr + 1, buf); | ||
1848 | @@ -642,27 +648,27 @@ static int rmi_populate_f11(struct hid_device *hdev) | ||
1849 | * +1 for query 5 which is present since absolute events are | ||
1850 | * reported and +1 for query 12. | ||
1851 | */ | ||
1852 | - query12_offset = 6; | ||
1853 | + query_offset = 6; | ||
1854 | |||
1855 | if (has_rel) | ||
1856 | - ++query12_offset; /* query 6 is present */ | ||
1857 | + ++query_offset; /* query 6 is present */ | ||
1858 | |||
1859 | if (has_gestures) | ||
1860 | - query12_offset += 2; /* query 7 and 8 are present */ | ||
1861 | + query_offset += 2; /* query 7 and 8 are present */ | ||
1862 | |||
1863 | if (has_query9) | ||
1864 | - ++query12_offset; | ||
1865 | + ++query_offset; | ||
1866 | |||
1867 | if (has_query10) | ||
1868 | - ++query12_offset; | ||
1869 | + ++query_offset; | ||
1870 | |||
1871 | if (has_query11) | ||
1872 | - ++query12_offset; | ||
1873 | + ++query_offset; | ||
1874 | |||
1875 | /* query 12 to know if the physical properties are reported */ | ||
1876 | if (has_query12) { | ||
1877 | ret = rmi_read(hdev, data->f11.query_base_addr | ||
1878 | - + query12_offset, buf); | ||
1879 | + + query_offset, buf); | ||
1880 | if (ret) { | ||
1881 | hid_err(hdev, "can not get query 12: %d.\n", ret); | ||
1882 | return ret; | ||
1883 | @@ -670,9 +676,10 @@ static int rmi_populate_f11(struct hid_device *hdev) | ||
1884 | has_physical_props = !!(buf[0] & BIT(5)); | ||
1885 | |||
1886 | if (has_physical_props) { | ||
1887 | + query_offset += 1; | ||
1888 | ret = rmi_read_block(hdev, | ||
1889 | data->f11.query_base_addr | ||
1890 | - + query12_offset + 1, buf, 4); | ||
1891 | + + query_offset, buf, 4); | ||
1892 | if (ret) { | ||
1893 | hid_err(hdev, "can not read query 15-18: %d.\n", | ||
1894 | ret); | ||
1895 | @@ -687,9 +694,45 @@ static int rmi_populate_f11(struct hid_device *hdev) | ||
1896 | |||
1897 | hid_info(hdev, "%s: size in mm: %d x %d\n", | ||
1898 | __func__, data->x_size_mm, data->y_size_mm); | ||
1899 | + | ||
1900 | + /* | ||
1901 | + * query 15 - 18 contain the size of the sensor | ||
1902 | + * and query 19 - 26 contain bezel dimensions | ||
1903 | + */ | ||
1904 | + query_offset += 12; | ||
1905 | + } | ||
1906 | + } | ||
1907 | + | ||
1908 | + if (has_query27) | ||
1909 | + ++query_offset; | ||
1910 | + | ||
1911 | + if (has_query28) { | ||
1912 | + ret = rmi_read(hdev, data->f11.query_base_addr | ||
1913 | + + query_offset, buf); | ||
1914 | + if (ret) { | ||
1915 | + hid_err(hdev, "can not get query 28: %d.\n", ret); | ||
1916 | + return ret; | ||
1917 | + } | ||
1918 | + | ||
1919 | + has_query36 = !!(buf[0] & BIT(6)); | ||
1920 | + } | ||
1921 | + | ||
1922 | + if (has_query36) { | ||
1923 | + query_offset += 2; | ||
1924 | + ret = rmi_read(hdev, data->f11.query_base_addr | ||
1925 | + + query_offset, buf); | ||
1926 | + if (ret) { | ||
1927 | + hid_err(hdev, "can not get query 36: %d.\n", ret); | ||
1928 | + return ret; | ||
1929 | } | ||
1930 | + | ||
1931 | + has_data40 = !!(buf[0] & BIT(5)); | ||
1932 | } | ||
1933 | |||
1934 | + | ||
1935 | + if (has_data40) | ||
1936 | + data->f11.report_size += data->max_fingers * 2; | ||
1937 | + | ||
1938 | /* | ||
1939 | * retrieve the ctrl registers | ||
1940 | * the ctrl register has a size of 20 but a fw bug split it into 16 + 4, | ||
1941 | diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c | ||
1942 | index 65244774bfa3..c127af99a0e0 100644 | ||
1943 | --- a/drivers/i2c/busses/i2c-s3c2410.c | ||
1944 | +++ b/drivers/i2c/busses/i2c-s3c2410.c | ||
1945 | @@ -778,14 +778,16 @@ static int s3c24xx_i2c_xfer(struct i2c_adapter *adap, | ||
1946 | int ret; | ||
1947 | |||
1948 | pm_runtime_get_sync(&adap->dev); | ||
1949 | - clk_prepare_enable(i2c->clk); | ||
1950 | + ret = clk_enable(i2c->clk); | ||
1951 | + if (ret) | ||
1952 | + return ret; | ||
1953 | |||
1954 | for (retry = 0; retry < adap->retries; retry++) { | ||
1955 | |||
1956 | ret = s3c24xx_i2c_doxfer(i2c, msgs, num); | ||
1957 | |||
1958 | if (ret != -EAGAIN) { | ||
1959 | - clk_disable_unprepare(i2c->clk); | ||
1960 | + clk_disable(i2c->clk); | ||
1961 | pm_runtime_put(&adap->dev); | ||
1962 | return ret; | ||
1963 | } | ||
1964 | @@ -795,7 +797,7 @@ static int s3c24xx_i2c_xfer(struct i2c_adapter *adap, | ||
1965 | udelay(100); | ||
1966 | } | ||
1967 | |||
1968 | - clk_disable_unprepare(i2c->clk); | ||
1969 | + clk_disable(i2c->clk); | ||
1970 | pm_runtime_put(&adap->dev); | ||
1971 | return -EREMOTEIO; | ||
1972 | } | ||
1973 | @@ -1174,7 +1176,7 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev) | ||
1974 | |||
1975 | clk_prepare_enable(i2c->clk); | ||
1976 | ret = s3c24xx_i2c_init(i2c); | ||
1977 | - clk_disable_unprepare(i2c->clk); | ||
1978 | + clk_disable(i2c->clk); | ||
1979 | if (ret != 0) { | ||
1980 | dev_err(&pdev->dev, "I2C controller init failed\n"); | ||
1981 | return ret; | ||
1982 | @@ -1187,6 +1189,7 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev) | ||
1983 | i2c->irq = ret = platform_get_irq(pdev, 0); | ||
1984 | if (ret <= 0) { | ||
1985 | dev_err(&pdev->dev, "cannot find IRQ\n"); | ||
1986 | + clk_unprepare(i2c->clk); | ||
1987 | return ret; | ||
1988 | } | ||
1989 | |||
1990 | @@ -1195,6 +1198,7 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev) | ||
1991 | |||
1992 | if (ret != 0) { | ||
1993 | dev_err(&pdev->dev, "cannot claim IRQ %d\n", i2c->irq); | ||
1994 | + clk_unprepare(i2c->clk); | ||
1995 | return ret; | ||
1996 | } | ||
1997 | } | ||
1998 | @@ -1202,6 +1206,7 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev) | ||
1999 | ret = s3c24xx_i2c_register_cpufreq(i2c); | ||
2000 | if (ret < 0) { | ||
2001 | dev_err(&pdev->dev, "failed to register cpufreq notifier\n"); | ||
2002 | + clk_unprepare(i2c->clk); | ||
2003 | return ret; | ||
2004 | } | ||
2005 | |||
2006 | @@ -1218,6 +1223,7 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev) | ||
2007 | if (ret < 0) { | ||
2008 | dev_err(&pdev->dev, "failed to add bus to i2c core\n"); | ||
2009 | s3c24xx_i2c_deregister_cpufreq(i2c); | ||
2010 | + clk_unprepare(i2c->clk); | ||
2011 | return ret; | ||
2012 | } | ||
2013 | |||
2014 | @@ -1239,6 +1245,8 @@ static int s3c24xx_i2c_remove(struct platform_device *pdev) | ||
2015 | { | ||
2016 | struct s3c24xx_i2c *i2c = platform_get_drvdata(pdev); | ||
2017 | |||
2018 | + clk_unprepare(i2c->clk); | ||
2019 | + | ||
2020 | pm_runtime_disable(&i2c->adap.dev); | ||
2021 | pm_runtime_disable(&pdev->dev); | ||
2022 | |||
2023 | @@ -1267,10 +1275,13 @@ static int s3c24xx_i2c_resume_noirq(struct device *dev) | ||
2024 | { | ||
2025 | struct platform_device *pdev = to_platform_device(dev); | ||
2026 | struct s3c24xx_i2c *i2c = platform_get_drvdata(pdev); | ||
2027 | + int ret; | ||
2028 | |||
2029 | - clk_prepare_enable(i2c->clk); | ||
2030 | + ret = clk_enable(i2c->clk); | ||
2031 | + if (ret) | ||
2032 | + return ret; | ||
2033 | s3c24xx_i2c_init(i2c); | ||
2034 | - clk_disable_unprepare(i2c->clk); | ||
2035 | + clk_disable(i2c->clk); | ||
2036 | i2c->suspended = 0; | ||
2037 | |||
2038 | return 0; | ||
2039 | diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c | ||
2040 | index 77ecf6d32237..6e22682c8255 100644 | ||
2041 | --- a/drivers/input/mouse/elantech.c | ||
2042 | +++ b/drivers/input/mouse/elantech.c | ||
2043 | @@ -1097,6 +1097,8 @@ static int elantech_get_resolution_v4(struct psmouse *psmouse, | ||
2044 | * Asus UX31 0x361f00 20, 15, 0e clickpad | ||
2045 | * Asus UX32VD 0x361f02 00, 15, 0e clickpad | ||
2046 | * Avatar AVIU-145A2 0x361f00 ? clickpad | ||
2047 | + * Fujitsu LIFEBOOK E544 0x470f00 d0, 12, 09 2 hw buttons | ||
2048 | + * Fujitsu LIFEBOOK E554 0x570f01 40, 14, 0c 2 hw buttons | ||
2049 | * Fujitsu H730 0x570f00 c0, 14, 0c 3 hw buttons (**) | ||
2050 | * Gigabyte U2442 0x450f01 58, 17, 0c 2 hw buttons | ||
2051 | * Lenovo L430 0x350f02 b9, 15, 0c 2 hw buttons (*) | ||
2052 | @@ -1475,6 +1477,20 @@ static const struct dmi_system_id elantech_dmi_force_crc_enabled[] = { | ||
2053 | DMI_MATCH(DMI_PRODUCT_NAME, "CELSIUS H730"), | ||
2054 | }, | ||
2055 | }, | ||
2056 | + { | ||
2057 | + /* Fujitsu LIFEBOOK E554 does not work with crc_enabled == 0 */ | ||
2058 | + .matches = { | ||
2059 | + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | ||
2060 | + DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK E554"), | ||
2061 | + }, | ||
2062 | + }, | ||
2063 | + { | ||
2064 | + /* Fujitsu LIFEBOOK E544 does not work with crc_enabled == 0 */ | ||
2065 | + .matches = { | ||
2066 | + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | ||
2067 | + DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK E544"), | ||
2068 | + }, | ||
2069 | + }, | ||
2070 | #endif | ||
2071 | { } | ||
2072 | }; | ||
2073 | diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c | ||
2074 | index f9472920d986..23e26e0768b5 100644 | ||
2075 | --- a/drivers/input/mouse/synaptics.c | ||
2076 | +++ b/drivers/input/mouse/synaptics.c | ||
2077 | @@ -135,8 +135,9 @@ static const struct min_max_quirk min_max_pnpid_table[] = { | ||
2078 | 1232, 5710, 1156, 4696 | ||
2079 | }, | ||
2080 | { | ||
2081 | - (const char * const []){"LEN0034", "LEN0036", "LEN0039", | ||
2082 | - "LEN2002", "LEN2004", NULL}, | ||
2083 | + (const char * const []){"LEN0034", "LEN0036", "LEN0037", | ||
2084 | + "LEN0039", "LEN2002", "LEN2004", | ||
2085 | + NULL}, | ||
2086 | 1024, 5112, 2024, 4832 | ||
2087 | }, | ||
2088 | { | ||
2089 | @@ -165,7 +166,7 @@ static const char * const topbuttonpad_pnp_ids[] = { | ||
2090 | "LEN0034", /* T431s, L440, L540, T540, W540, X1 Carbon 2nd */ | ||
2091 | "LEN0035", /* X240 */ | ||
2092 | "LEN0036", /* T440 */ | ||
2093 | - "LEN0037", | ||
2094 | + "LEN0037", /* X1 Carbon 2nd */ | ||
2095 | "LEN0038", | ||
2096 | "LEN0039", /* T440s */ | ||
2097 | "LEN0041", | ||
2098 | diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h | ||
2099 | index 1a858c86a72b..39bec4715f2c 100644 | ||
2100 | --- a/drivers/input/serio/i8042-x86ia64io.h | ||
2101 | +++ b/drivers/input/serio/i8042-x86ia64io.h | ||
2102 | @@ -152,6 +152,14 @@ static const struct dmi_system_id __initconst i8042_dmi_noloop_table[] = { | ||
2103 | }, | ||
2104 | }, | ||
2105 | { | ||
2106 | + /* Medion Akoya E7225 */ | ||
2107 | + .matches = { | ||
2108 | + DMI_MATCH(DMI_SYS_VENDOR, "Medion"), | ||
2109 | + DMI_MATCH(DMI_PRODUCT_NAME, "Akoya E7225"), | ||
2110 | + DMI_MATCH(DMI_PRODUCT_VERSION, "1.0"), | ||
2111 | + }, | ||
2112 | + }, | ||
2113 | + { | ||
2114 | /* Blue FB5601 */ | ||
2115 | .matches = { | ||
2116 | DMI_MATCH(DMI_SYS_VENDOR, "blue"), | ||
2117 | diff --git a/drivers/md/dm-cache-metadata.c b/drivers/md/dm-cache-metadata.c | ||
2118 | index 97e3a6c07e31..1e64e9c50d85 100644 | ||
2119 | --- a/drivers/md/dm-cache-metadata.c | ||
2120 | +++ b/drivers/md/dm-cache-metadata.c | ||
2121 | @@ -683,7 +683,7 @@ static struct dm_cache_metadata *metadata_open(struct block_device *bdev, | ||
2122 | cmd = kzalloc(sizeof(*cmd), GFP_KERNEL); | ||
2123 | if (!cmd) { | ||
2124 | DMERR("could not allocate metadata struct"); | ||
2125 | - return NULL; | ||
2126 | + return ERR_PTR(-ENOMEM); | ||
2127 | } | ||
2128 | |||
2129 | atomic_set(&cmd->ref_count, 1); | ||
2130 | @@ -745,7 +745,7 @@ static struct dm_cache_metadata *lookup_or_open(struct block_device *bdev, | ||
2131 | return cmd; | ||
2132 | |||
2133 | cmd = metadata_open(bdev, data_block_size, may_format_device, policy_hint_size); | ||
2134 | - if (cmd) { | ||
2135 | + if (!IS_ERR(cmd)) { | ||
2136 | mutex_lock(&table_lock); | ||
2137 | cmd2 = lookup(bdev); | ||
2138 | if (cmd2) { | ||
2139 | @@ -780,9 +780,10 @@ struct dm_cache_metadata *dm_cache_metadata_open(struct block_device *bdev, | ||
2140 | { | ||
2141 | struct dm_cache_metadata *cmd = lookup_or_open(bdev, data_block_size, | ||
2142 | may_format_device, policy_hint_size); | ||
2143 | - if (cmd && !same_params(cmd, data_block_size)) { | ||
2144 | + | ||
2145 | + if (!IS_ERR(cmd) && !same_params(cmd, data_block_size)) { | ||
2146 | dm_cache_metadata_close(cmd); | ||
2147 | - return NULL; | ||
2148 | + return ERR_PTR(-EINVAL); | ||
2149 | } | ||
2150 | |||
2151 | return cmd; | ||
2152 | diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c | ||
2153 | index aae19133cfac..ac6b0ff161ea 100644 | ||
2154 | --- a/drivers/md/dm-thin.c | ||
2155 | +++ b/drivers/md/dm-thin.c | ||
2156 | @@ -2978,6 +2978,12 @@ static int pool_message(struct dm_target *ti, unsigned argc, char **argv) | ||
2157 | struct pool_c *pt = ti->private; | ||
2158 | struct pool *pool = pt->pool; | ||
2159 | |||
2160 | + if (get_pool_mode(pool) >= PM_READ_ONLY) { | ||
2161 | + DMERR("%s: unable to service pool target messages in READ_ONLY or FAIL mode", | ||
2162 | + dm_device_name(pool->pool_md)); | ||
2163 | + return -EINVAL; | ||
2164 | + } | ||
2165 | + | ||
2166 | if (!strcasecmp(argv[0], "create_thin")) | ||
2167 | r = process_create_thin_mesg(argc, argv, pool); | ||
2168 | |||
2169 | diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c | ||
2170 | index 8e78bb48f5a4..60285820f7b4 100644 | ||
2171 | --- a/drivers/net/can/c_can/c_can.c | ||
2172 | +++ b/drivers/net/can/c_can/c_can.c | ||
2173 | @@ -611,6 +611,10 @@ static void c_can_stop(struct net_device *dev) | ||
2174 | struct c_can_priv *priv = netdev_priv(dev); | ||
2175 | |||
2176 | c_can_irq_control(priv, false); | ||
2177 | + | ||
2178 | + /* put ctrl to init on stop to end ongoing transmission */ | ||
2179 | + priv->write_reg(priv, C_CAN_CTRL_REG, CONTROL_INIT); | ||
2180 | + | ||
2181 | priv->can.state = CAN_STATE_STOPPED; | ||
2182 | } | ||
2183 | |||
2184 | diff --git a/drivers/net/can/usb/kvaser_usb.c b/drivers/net/can/usb/kvaser_usb.c | ||
2185 | index cc7bfc0c0a71..8b255e777cc7 100644 | ||
2186 | --- a/drivers/net/can/usb/kvaser_usb.c | ||
2187 | +++ b/drivers/net/can/usb/kvaser_usb.c | ||
2188 | @@ -587,7 +587,7 @@ static int kvaser_usb_simple_msg_async(struct kvaser_usb_net_priv *priv, | ||
2189 | usb_sndbulkpipe(dev->udev, | ||
2190 | dev->bulk_out->bEndpointAddress), | ||
2191 | buf, msg->len, | ||
2192 | - kvaser_usb_simple_msg_callback, priv); | ||
2193 | + kvaser_usb_simple_msg_callback, netdev); | ||
2194 | usb_anchor_urb(urb, &priv->tx_submitted); | ||
2195 | |||
2196 | err = usb_submit_urb(urb, GFP_ATOMIC); | ||
2197 | @@ -662,11 +662,6 @@ static void kvaser_usb_rx_error(const struct kvaser_usb *dev, | ||
2198 | priv = dev->nets[channel]; | ||
2199 | stats = &priv->netdev->stats; | ||
2200 | |||
2201 | - if (status & M16C_STATE_BUS_RESET) { | ||
2202 | - kvaser_usb_unlink_tx_urbs(priv); | ||
2203 | - return; | ||
2204 | - } | ||
2205 | - | ||
2206 | skb = alloc_can_err_skb(priv->netdev, &cf); | ||
2207 | if (!skb) { | ||
2208 | stats->rx_dropped++; | ||
2209 | @@ -677,7 +672,7 @@ static void kvaser_usb_rx_error(const struct kvaser_usb *dev, | ||
2210 | |||
2211 | netdev_dbg(priv->netdev, "Error status: 0x%02x\n", status); | ||
2212 | |||
2213 | - if (status & M16C_STATE_BUS_OFF) { | ||
2214 | + if (status & (M16C_STATE_BUS_OFF | M16C_STATE_BUS_RESET)) { | ||
2215 | cf->can_id |= CAN_ERR_BUSOFF; | ||
2216 | |||
2217 | priv->can.can_stats.bus_off++; | ||
2218 | @@ -703,9 +698,7 @@ static void kvaser_usb_rx_error(const struct kvaser_usb *dev, | ||
2219 | } | ||
2220 | |||
2221 | new_state = CAN_STATE_ERROR_PASSIVE; | ||
2222 | - } | ||
2223 | - | ||
2224 | - if (status == M16C_STATE_BUS_ERROR) { | ||
2225 | + } else if (status & M16C_STATE_BUS_ERROR) { | ||
2226 | if ((priv->can.state < CAN_STATE_ERROR_WARNING) && | ||
2227 | ((txerr >= 96) || (rxerr >= 96))) { | ||
2228 | cf->can_id |= CAN_ERR_CRTL; | ||
2229 | @@ -715,7 +708,8 @@ static void kvaser_usb_rx_error(const struct kvaser_usb *dev, | ||
2230 | |||
2231 | priv->can.can_stats.error_warning++; | ||
2232 | new_state = CAN_STATE_ERROR_WARNING; | ||
2233 | - } else if (priv->can.state > CAN_STATE_ERROR_ACTIVE) { | ||
2234 | + } else if ((priv->can.state > CAN_STATE_ERROR_ACTIVE) && | ||
2235 | + ((txerr < 96) && (rxerr < 96))) { | ||
2236 | cf->can_id |= CAN_ERR_PROT; | ||
2237 | cf->data[2] = CAN_ERR_PROT_ACTIVE; | ||
2238 | |||
2239 | @@ -1593,7 +1587,7 @@ static int kvaser_usb_probe(struct usb_interface *intf, | ||
2240 | { | ||
2241 | struct kvaser_usb *dev; | ||
2242 | int err = -ENOMEM; | ||
2243 | - int i; | ||
2244 | + int i, retry = 3; | ||
2245 | |||
2246 | dev = devm_kzalloc(&intf->dev, sizeof(*dev), GFP_KERNEL); | ||
2247 | if (!dev) | ||
2248 | @@ -1611,7 +1605,15 @@ static int kvaser_usb_probe(struct usb_interface *intf, | ||
2249 | |||
2250 | usb_set_intfdata(intf, dev); | ||
2251 | |||
2252 | - err = kvaser_usb_get_software_info(dev); | ||
2253 | + /* On some x86 laptops, plugging a Kvaser device again after | ||
2254 | + * an unplug makes the firmware always ignore the very first | ||
2255 | + * command. For such a case, provide some room for retries | ||
2256 | + * instead of completely exiting the driver. | ||
2257 | + */ | ||
2258 | + do { | ||
2259 | + err = kvaser_usb_get_software_info(dev); | ||
2260 | + } while (--retry && err == -ETIMEDOUT); | ||
2261 | + | ||
2262 | if (err) { | ||
2263 | dev_err(&intf->dev, | ||
2264 | "Cannot get software infos, error %d\n", err); | ||
2265 | diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c | ||
2266 | index 64d1cef4cda1..48645504106e 100644 | ||
2267 | --- a/drivers/net/ethernet/ti/cpsw.c | ||
2268 | +++ b/drivers/net/ethernet/ti/cpsw.c | ||
2269 | @@ -1676,6 +1676,19 @@ static int cpsw_ndo_vlan_rx_add_vid(struct net_device *ndev, | ||
2270 | if (vid == priv->data.default_vlan) | ||
2271 | return 0; | ||
2272 | |||
2273 | + if (priv->data.dual_emac) { | ||
2274 | + /* In dual EMAC, reserved VLAN id should not be used for | ||
2275 | + * creating VLAN interfaces as this can break the dual | ||
2276 | + * EMAC port separation | ||
2277 | + */ | ||
2278 | + int i; | ||
2279 | + | ||
2280 | + for (i = 0; i < priv->data.slaves; i++) { | ||
2281 | + if (vid == priv->slaves[i].port_vlan) | ||
2282 | + return -EINVAL; | ||
2283 | + } | ||
2284 | + } | ||
2285 | + | ||
2286 | dev_info(priv->dev, "Adding vlanid %d to vlan filter\n", vid); | ||
2287 | return cpsw_add_vlan_ale_entry(priv, vid); | ||
2288 | } | ||
2289 | @@ -1689,6 +1702,15 @@ static int cpsw_ndo_vlan_rx_kill_vid(struct net_device *ndev, | ||
2290 | if (vid == priv->data.default_vlan) | ||
2291 | return 0; | ||
2292 | |||
2293 | + if (priv->data.dual_emac) { | ||
2294 | + int i; | ||
2295 | + | ||
2296 | + for (i = 0; i < priv->data.slaves; i++) { | ||
2297 | + if (vid == priv->slaves[i].port_vlan) | ||
2298 | + return -EINVAL; | ||
2299 | + } | ||
2300 | + } | ||
2301 | + | ||
2302 | dev_info(priv->dev, "removing vlanid %d from vlan filter\n", vid); | ||
2303 | ret = cpsw_ale_del_vlan(priv->ale, vid, 0); | ||
2304 | if (ret != 0) | ||
2305 | diff --git a/drivers/pinctrl/pinctrl-at91.c b/drivers/pinctrl/pinctrl-at91.c | ||
2306 | index 354a81d40925..d6380c187db6 100644 | ||
2307 | --- a/drivers/pinctrl/pinctrl-at91.c | ||
2308 | +++ b/drivers/pinctrl/pinctrl-at91.c | ||
2309 | @@ -179,7 +179,7 @@ struct at91_pinctrl { | ||
2310 | struct device *dev; | ||
2311 | struct pinctrl_dev *pctl; | ||
2312 | |||
2313 | - int nbanks; | ||
2314 | + int nactive_banks; | ||
2315 | |||
2316 | uint32_t *mux_mask; | ||
2317 | int nmux; | ||
2318 | @@ -655,12 +655,18 @@ static int pin_check_config(struct at91_pinctrl *info, const char *name, | ||
2319 | int mux; | ||
2320 | |||
2321 | /* check if it's a valid config */ | ||
2322 | - if (pin->bank >= info->nbanks) { | ||
2323 | + if (pin->bank >= gpio_banks) { | ||
2324 | dev_err(info->dev, "%s: pin conf %d bank_id %d >= nbanks %d\n", | ||
2325 | - name, index, pin->bank, info->nbanks); | ||
2326 | + name, index, pin->bank, gpio_banks); | ||
2327 | return -EINVAL; | ||
2328 | } | ||
2329 | |||
2330 | + if (!gpio_chips[pin->bank]) { | ||
2331 | + dev_err(info->dev, "%s: pin conf %d bank_id %d not enabled\n", | ||
2332 | + name, index, pin->bank); | ||
2333 | + return -ENXIO; | ||
2334 | + } | ||
2335 | + | ||
2336 | if (pin->pin >= MAX_NB_GPIO_PER_BANK) { | ||
2337 | dev_err(info->dev, "%s: pin conf %d pin_bank_id %d >= %d\n", | ||
2338 | name, index, pin->pin, MAX_NB_GPIO_PER_BANK); | ||
2339 | @@ -983,7 +989,8 @@ static void at91_pinctrl_child_count(struct at91_pinctrl *info, | ||
2340 | |||
2341 | for_each_child_of_node(np, child) { | ||
2342 | if (of_device_is_compatible(child, gpio_compat)) { | ||
2343 | - info->nbanks++; | ||
2344 | + if (of_device_is_available(child)) | ||
2345 | + info->nactive_banks++; | ||
2346 | } else { | ||
2347 | info->nfunctions++; | ||
2348 | info->ngroups += of_get_child_count(child); | ||
2349 | @@ -1005,11 +1012,11 @@ static int at91_pinctrl_mux_mask(struct at91_pinctrl *info, | ||
2350 | } | ||
2351 | |||
2352 | size /= sizeof(*list); | ||
2353 | - if (!size || size % info->nbanks) { | ||
2354 | - dev_err(info->dev, "wrong mux mask array should be by %d\n", info->nbanks); | ||
2355 | + if (!size || size % gpio_banks) { | ||
2356 | + dev_err(info->dev, "wrong mux mask array should be by %d\n", gpio_banks); | ||
2357 | return -EINVAL; | ||
2358 | } | ||
2359 | - info->nmux = size / info->nbanks; | ||
2360 | + info->nmux = size / gpio_banks; | ||
2361 | |||
2362 | info->mux_mask = devm_kzalloc(info->dev, sizeof(u32) * size, GFP_KERNEL); | ||
2363 | if (!info->mux_mask) { | ||
2364 | @@ -1133,7 +1140,7 @@ static int at91_pinctrl_probe_dt(struct platform_device *pdev, | ||
2365 | of_match_device(at91_pinctrl_of_match, &pdev->dev)->data; | ||
2366 | at91_pinctrl_child_count(info, np); | ||
2367 | |||
2368 | - if (info->nbanks < 1) { | ||
2369 | + if (gpio_banks < 1) { | ||
2370 | dev_err(&pdev->dev, "you need to specify at least one gpio-controller\n"); | ||
2371 | return -EINVAL; | ||
2372 | } | ||
2373 | @@ -1146,7 +1153,7 @@ static int at91_pinctrl_probe_dt(struct platform_device *pdev, | ||
2374 | |||
2375 | dev_dbg(&pdev->dev, "mux-mask\n"); | ||
2376 | tmp = info->mux_mask; | ||
2377 | - for (i = 0; i < info->nbanks; i++) { | ||
2378 | + for (i = 0; i < gpio_banks; i++) { | ||
2379 | for (j = 0; j < info->nmux; j++, tmp++) { | ||
2380 | dev_dbg(&pdev->dev, "%d:%d\t0x%x\n", i, j, tmp[0]); | ||
2381 | } | ||
2382 | @@ -1164,7 +1171,7 @@ static int at91_pinctrl_probe_dt(struct platform_device *pdev, | ||
2383 | if (!info->groups) | ||
2384 | return -ENOMEM; | ||
2385 | |||
2386 | - dev_dbg(&pdev->dev, "nbanks = %d\n", info->nbanks); | ||
2387 | + dev_dbg(&pdev->dev, "nbanks = %d\n", gpio_banks); | ||
2388 | dev_dbg(&pdev->dev, "nfunctions = %d\n", info->nfunctions); | ||
2389 | dev_dbg(&pdev->dev, "ngroups = %d\n", info->ngroups); | ||
2390 | |||
2391 | @@ -1187,7 +1194,7 @@ static int at91_pinctrl_probe(struct platform_device *pdev) | ||
2392 | { | ||
2393 | struct at91_pinctrl *info; | ||
2394 | struct pinctrl_pin_desc *pdesc; | ||
2395 | - int ret, i, j, k; | ||
2396 | + int ret, i, j, k, ngpio_chips_enabled = 0; | ||
2397 | |||
2398 | info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL); | ||
2399 | if (!info) | ||
2400 | @@ -1202,23 +1209,27 @@ static int at91_pinctrl_probe(struct platform_device *pdev) | ||
2401 | * to obtain references to the struct gpio_chip * for them, and we | ||
2402 | * need this to proceed. | ||
2403 | */ | ||
2404 | - for (i = 0; i < info->nbanks; i++) { | ||
2405 | - if (!gpio_chips[i]) { | ||
2406 | - dev_warn(&pdev->dev, "GPIO chip %d not registered yet\n", i); | ||
2407 | - devm_kfree(&pdev->dev, info); | ||
2408 | - return -EPROBE_DEFER; | ||
2409 | - } | ||
2410 | + for (i = 0; i < gpio_banks; i++) | ||
2411 | + if (gpio_chips[i]) | ||
2412 | + ngpio_chips_enabled++; | ||
2413 | + | ||
2414 | + if (ngpio_chips_enabled < info->nactive_banks) { | ||
2415 | + dev_warn(&pdev->dev, | ||
2416 | + "All GPIO chips are not registered yet (%d/%d)\n", | ||
2417 | + ngpio_chips_enabled, info->nactive_banks); | ||
2418 | + devm_kfree(&pdev->dev, info); | ||
2419 | + return -EPROBE_DEFER; | ||
2420 | } | ||
2421 | |||
2422 | at91_pinctrl_desc.name = dev_name(&pdev->dev); | ||
2423 | - at91_pinctrl_desc.npins = info->nbanks * MAX_NB_GPIO_PER_BANK; | ||
2424 | + at91_pinctrl_desc.npins = gpio_banks * MAX_NB_GPIO_PER_BANK; | ||
2425 | at91_pinctrl_desc.pins = pdesc = | ||
2426 | devm_kzalloc(&pdev->dev, sizeof(*pdesc) * at91_pinctrl_desc.npins, GFP_KERNEL); | ||
2427 | |||
2428 | if (!at91_pinctrl_desc.pins) | ||
2429 | return -ENOMEM; | ||
2430 | |||
2431 | - for (i = 0 , k = 0; i < info->nbanks; i++) { | ||
2432 | + for (i = 0, k = 0; i < gpio_banks; i++) { | ||
2433 | for (j = 0; j < MAX_NB_GPIO_PER_BANK; j++, k++) { | ||
2434 | pdesc->number = k; | ||
2435 | pdesc->name = kasprintf(GFP_KERNEL, "pio%c%d", i + 'A', j); | ||
2436 | @@ -1236,8 +1247,9 @@ static int at91_pinctrl_probe(struct platform_device *pdev) | ||
2437 | } | ||
2438 | |||
2439 | /* We will handle a range of GPIO pins */ | ||
2440 | - for (i = 0; i < info->nbanks; i++) | ||
2441 | - pinctrl_add_gpio_range(info->pctl, &gpio_chips[i]->range); | ||
2442 | + for (i = 0; i < gpio_banks; i++) | ||
2443 | + if (gpio_chips[i]) | ||
2444 | + pinctrl_add_gpio_range(info->pctl, &gpio_chips[i]->range); | ||
2445 | |||
2446 | dev_info(&pdev->dev, "initialized AT91 pinctrl driver\n"); | ||
2447 | |||
2448 | @@ -1614,9 +1626,10 @@ static void gpio_irq_handler(unsigned irq, struct irq_desc *desc) | ||
2449 | static int at91_gpio_of_irq_setup(struct platform_device *pdev, | ||
2450 | struct at91_gpio_chip *at91_gpio) | ||
2451 | { | ||
2452 | + struct gpio_chip *gpiochip_prev = NULL; | ||
2453 | struct at91_gpio_chip *prev = NULL; | ||
2454 | struct irq_data *d = irq_get_irq_data(at91_gpio->pioc_virq); | ||
2455 | - int ret; | ||
2456 | + int ret, i; | ||
2457 | |||
2458 | at91_gpio->pioc_hwirq = irqd_to_hwirq(d); | ||
2459 | |||
2460 | @@ -1642,24 +1655,33 @@ static int at91_gpio_of_irq_setup(struct platform_device *pdev, | ||
2461 | return ret; | ||
2462 | } | ||
2463 | |||
2464 | - /* Setup chained handler */ | ||
2465 | - if (at91_gpio->pioc_idx) | ||
2466 | - prev = gpio_chips[at91_gpio->pioc_idx - 1]; | ||
2467 | - | ||
2468 | /* The top level handler handles one bank of GPIOs, except | ||
2469 | * on some SoC it can handle up to three... | ||
2470 | * We only set up the handler for the first of the list. | ||
2471 | */ | ||
2472 | - if (prev && prev->next == at91_gpio) | ||
2473 | + gpiochip_prev = irq_get_handler_data(at91_gpio->pioc_virq); | ||
2474 | + if (!gpiochip_prev) { | ||
2475 | + /* Then register the chain on the parent IRQ */ | ||
2476 | + gpiochip_set_chained_irqchip(&at91_gpio->chip, | ||
2477 | + &gpio_irqchip, | ||
2478 | + at91_gpio->pioc_virq, | ||
2479 | + gpio_irq_handler); | ||
2480 | return 0; | ||
2481 | + } | ||
2482 | |||
2483 | - /* Then register the chain on the parent IRQ */ | ||
2484 | - gpiochip_set_chained_irqchip(&at91_gpio->chip, | ||
2485 | - &gpio_irqchip, | ||
2486 | - at91_gpio->pioc_virq, | ||
2487 | - gpio_irq_handler); | ||
2488 | + prev = container_of(gpiochip_prev, struct at91_gpio_chip, chip); | ||
2489 | |||
2490 | - return 0; | ||
2491 | + /* we can only have 2 banks before */ | ||
2492 | + for (i = 0; i < 2; i++) { | ||
2493 | + if (prev->next) { | ||
2494 | + prev = prev->next; | ||
2495 | + } else { | ||
2496 | + prev->next = at91_gpio; | ||
2497 | + return 0; | ||
2498 | + } | ||
2499 | + } | ||
2500 | + | ||
2501 | + return -EINVAL; | ||
2502 | } | ||
2503 | |||
2504 | /* This structure is replicated for each GPIO block allocated at probe time */ | ||
2505 | @@ -1676,24 +1698,6 @@ static struct gpio_chip at91_gpio_template = { | ||
2506 | .ngpio = MAX_NB_GPIO_PER_BANK, | ||
2507 | }; | ||
2508 | |||
2509 | -static void at91_gpio_probe_fixup(void) | ||
2510 | -{ | ||
2511 | - unsigned i; | ||
2512 | - struct at91_gpio_chip *at91_gpio, *last = NULL; | ||
2513 | - | ||
2514 | - for (i = 0; i < gpio_banks; i++) { | ||
2515 | - at91_gpio = gpio_chips[i]; | ||
2516 | - | ||
2517 | - /* | ||
2518 | - * GPIO controller are grouped on some SoC: | ||
2519 | - * PIOC, PIOD and PIOE can share the same IRQ line | ||
2520 | - */ | ||
2521 | - if (last && last->pioc_virq == at91_gpio->pioc_virq) | ||
2522 | - last->next = at91_gpio; | ||
2523 | - last = at91_gpio; | ||
2524 | - } | ||
2525 | -} | ||
2526 | - | ||
2527 | static struct of_device_id at91_gpio_of_match[] = { | ||
2528 | { .compatible = "atmel,at91sam9x5-gpio", .data = &at91sam9x5_ops, }, | ||
2529 | { .compatible = "atmel,at91rm9200-gpio", .data = &at91rm9200_ops }, | ||
2530 | @@ -1806,8 +1810,6 @@ static int at91_gpio_probe(struct platform_device *pdev) | ||
2531 | gpio_chips[alias_idx] = at91_chip; | ||
2532 | gpio_banks = max(gpio_banks, alias_idx + 1); | ||
2533 | |||
2534 | - at91_gpio_probe_fixup(); | ||
2535 | - | ||
2536 | ret = at91_gpio_of_irq_setup(pdev, at91_chip); | ||
2537 | if (ret) | ||
2538 | goto irq_setup_err; | ||
2539 | diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c | ||
2540 | index cd87c0c37034..fc6fb5422b6f 100644 | ||
2541 | --- a/drivers/regulator/core.c | ||
2542 | +++ b/drivers/regulator/core.c | ||
2543 | @@ -1488,7 +1488,7 @@ struct regulator *regulator_get_optional(struct device *dev, const char *id) | ||
2544 | } | ||
2545 | EXPORT_SYMBOL_GPL(regulator_get_optional); | ||
2546 | |||
2547 | -/* Locks held by regulator_put() */ | ||
2548 | +/* regulator_list_mutex lock held by regulator_put() */ | ||
2549 | static void _regulator_put(struct regulator *regulator) | ||
2550 | { | ||
2551 | struct regulator_dev *rdev; | ||
2552 | @@ -1503,12 +1503,14 @@ static void _regulator_put(struct regulator *regulator) | ||
2553 | /* remove any sysfs entries */ | ||
2554 | if (regulator->dev) | ||
2555 | sysfs_remove_link(&rdev->dev.kobj, regulator->supply_name); | ||
2556 | + mutex_lock(&rdev->mutex); | ||
2557 | kfree(regulator->supply_name); | ||
2558 | list_del(®ulator->list); | ||
2559 | kfree(regulator); | ||
2560 | |||
2561 | rdev->open_count--; | ||
2562 | rdev->exclusive = 0; | ||
2563 | + mutex_unlock(&rdev->mutex); | ||
2564 | |||
2565 | module_put(rdev->owner); | ||
2566 | } | ||
2567 | diff --git a/drivers/rtc/rtc-s5m.c b/drivers/rtc/rtc-s5m.c | ||
2568 | index 8754c33361e8..28799d39db8e 100644 | ||
2569 | --- a/drivers/rtc/rtc-s5m.c | ||
2570 | +++ b/drivers/rtc/rtc-s5m.c | ||
2571 | @@ -832,6 +832,7 @@ static SIMPLE_DEV_PM_OPS(s5m_rtc_pm_ops, s5m_rtc_suspend, s5m_rtc_resume); | ||
2572 | static const struct platform_device_id s5m_rtc_id[] = { | ||
2573 | { "s5m-rtc", S5M8767X }, | ||
2574 | { "s2mps14-rtc", S2MPS14X }, | ||
2575 | + { }, | ||
2576 | }; | ||
2577 | |||
2578 | static struct platform_driver s5m_rtc_driver = { | ||
2579 | diff --git a/drivers/spi/spi-dw-mid.c b/drivers/spi/spi-dw-mid.c | ||
2580 | index 46c6d58e1fda..efff55537d8a 100644 | ||
2581 | --- a/drivers/spi/spi-dw-mid.c | ||
2582 | +++ b/drivers/spi/spi-dw-mid.c | ||
2583 | @@ -219,7 +219,6 @@ int dw_spi_mid_init(struct dw_spi *dws) | ||
2584 | iounmap(clk_reg); | ||
2585 | |||
2586 | dws->num_cs = 16; | ||
2587 | - dws->fifo_len = 40; /* FIFO has 40 words buffer */ | ||
2588 | |||
2589 | #ifdef CONFIG_SPI_DW_MID_DMA | ||
2590 | dws->dma_priv = kzalloc(sizeof(struct mid_dma), GFP_KERNEL); | ||
2591 | diff --git a/drivers/spi/spi-dw.c b/drivers/spi/spi-dw.c | ||
2592 | index d0d5542efc06..1a0f266c4268 100644 | ||
2593 | --- a/drivers/spi/spi-dw.c | ||
2594 | +++ b/drivers/spi/spi-dw.c | ||
2595 | @@ -621,13 +621,13 @@ static void spi_hw_init(struct dw_spi *dws) | ||
2596 | if (!dws->fifo_len) { | ||
2597 | u32 fifo; | ||
2598 | |||
2599 | - for (fifo = 2; fifo <= 257; fifo++) { | ||
2600 | + for (fifo = 2; fifo <= 256; fifo++) { | ||
2601 | dw_writew(dws, DW_SPI_TXFLTR, fifo); | ||
2602 | if (fifo != dw_readw(dws, DW_SPI_TXFLTR)) | ||
2603 | break; | ||
2604 | } | ||
2605 | |||
2606 | - dws->fifo_len = (fifo == 257) ? 0 : fifo; | ||
2607 | + dws->fifo_len = (fifo == 2) ? 0 : fifo - 1; | ||
2608 | dw_writew(dws, DW_SPI_TXFLTR, 0); | ||
2609 | } | ||
2610 | } | ||
2611 | diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c | ||
2612 | index 9e9e0f971e6c..d95656d05eb6 100644 | ||
2613 | --- a/drivers/spi/spi-pxa2xx.c | ||
2614 | +++ b/drivers/spi/spi-pxa2xx.c | ||
2615 | @@ -402,8 +402,8 @@ static void giveback(struct driver_data *drv_data) | ||
2616 | cs_deassert(drv_data); | ||
2617 | } | ||
2618 | |||
2619 | - spi_finalize_current_message(drv_data->master); | ||
2620 | drv_data->cur_chip = NULL; | ||
2621 | + spi_finalize_current_message(drv_data->master); | ||
2622 | } | ||
2623 | |||
2624 | static void reset_sccr1(struct driver_data *drv_data) | ||
2625 | diff --git a/drivers/staging/lustre/lustre/llite/vvp_io.c b/drivers/staging/lustre/lustre/llite/vvp_io.c | ||
2626 | index d3f967a78138..1f453b275dbc 100644 | ||
2627 | --- a/drivers/staging/lustre/lustre/llite/vvp_io.c | ||
2628 | +++ b/drivers/staging/lustre/lustre/llite/vvp_io.c | ||
2629 | @@ -632,7 +632,7 @@ static int vvp_io_kernel_fault(struct vvp_fault_io *cfio) | ||
2630 | return 0; | ||
2631 | } | ||
2632 | |||
2633 | - if (cfio->fault.ft_flags & VM_FAULT_SIGBUS) { | ||
2634 | + if (cfio->fault.ft_flags & (VM_FAULT_SIGBUS | VM_FAULT_SIGSEGV)) { | ||
2635 | CDEBUG(D_PAGE, "got addr %p - SIGBUS\n", vmf->virtual_address); | ||
2636 | return -EFAULT; | ||
2637 | } | ||
2638 | diff --git a/drivers/usb/core/otg_whitelist.h b/drivers/usb/core/otg_whitelist.h | ||
2639 | index de0c9c9d7091..a6315abe7b7c 100644 | ||
2640 | --- a/drivers/usb/core/otg_whitelist.h | ||
2641 | +++ b/drivers/usb/core/otg_whitelist.h | ||
2642 | @@ -55,6 +55,11 @@ static int is_targeted(struct usb_device *dev) | ||
2643 | le16_to_cpu(dev->descriptor.idProduct) == 0xbadd)) | ||
2644 | return 0; | ||
2645 | |||
2646 | + /* OTG PET device is always targeted (see OTG 2.0 ECN 6.4.2) */ | ||
2647 | + if ((le16_to_cpu(dev->descriptor.idVendor) == 0x1a0a && | ||
2648 | + le16_to_cpu(dev->descriptor.idProduct) == 0x0200)) | ||
2649 | + return 1; | ||
2650 | + | ||
2651 | /* NOTE: can't use usb_match_id() since interface caches | ||
2652 | * aren't set up yet. this is cut/paste from that code. | ||
2653 | */ | ||
2654 | diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c | ||
2655 | index 0ffb4ed0a945..41e510ae8c83 100644 | ||
2656 | --- a/drivers/usb/core/quirks.c | ||
2657 | +++ b/drivers/usb/core/quirks.c | ||
2658 | @@ -179,6 +179,10 @@ static const struct usb_device_id usb_quirk_list[] = { | ||
2659 | { USB_DEVICE(0x0b05, 0x17e0), .driver_info = | ||
2660 | USB_QUIRK_IGNORE_REMOTE_WAKEUP }, | ||
2661 | |||
2662 | + /* Protocol and OTG Electrical Test Device */ | ||
2663 | + { USB_DEVICE(0x1a0a, 0x0200), .driver_info = | ||
2664 | + USB_QUIRK_LINEAR_UFRAME_INTR_BINTERVAL }, | ||
2665 | + | ||
2666 | { } /* terminating entry must be last */ | ||
2667 | }; | ||
2668 | |||
2669 | diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h | ||
2670 | index 11c7a9676441..8adb53044079 100644 | ||
2671 | --- a/drivers/usb/storage/unusual_devs.h | ||
2672 | +++ b/drivers/usb/storage/unusual_devs.h | ||
2673 | @@ -1995,6 +1995,13 @@ UNUSUAL_DEV( 0x152d, 0x2329, 0x0100, 0x0100, | ||
2674 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
2675 | US_FL_IGNORE_RESIDUE | US_FL_SANE_SENSE ), | ||
2676 | |||
2677 | +/* Reported by Dmitry Nezhevenko <dion@dion.org.ua> */ | ||
2678 | +UNUSUAL_DEV( 0x152d, 0x2566, 0x0114, 0x0114, | ||
2679 | + "JMicron", | ||
2680 | + "USB to ATA/ATAPI Bridge", | ||
2681 | + USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
2682 | + US_FL_BROKEN_FUA ), | ||
2683 | + | ||
2684 | /* Entrega Technologies U1-SC25 (later Xircom PortGear PGSCSI) | ||
2685 | * and Mac USB Dock USB-SCSI */ | ||
2686 | UNUSUAL_DEV( 0x1645, 0x0007, 0x0100, 0x0133, | ||
2687 | diff --git a/drivers/usb/storage/unusual_uas.h b/drivers/usb/storage/unusual_uas.h | ||
2688 | index 1f430bb02ca1..2706a434fdbb 100644 | ||
2689 | --- a/drivers/usb/storage/unusual_uas.h | ||
2690 | +++ b/drivers/usb/storage/unusual_uas.h | ||
2691 | @@ -138,3 +138,10 @@ UNUSUAL_DEV(0x4971, 0x1012, 0x0000, 0x9999, | ||
2692 | "External HDD", | ||
2693 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
2694 | US_FL_IGNORE_UAS), | ||
2695 | + | ||
2696 | +/* Reported-by: Richard Henderson <rth@redhat.com> */ | ||
2697 | +UNUSUAL_DEV(0x4971, 0x8017, 0x0000, 0x9999, | ||
2698 | + "SimpleTech", | ||
2699 | + "External HDD", | ||
2700 | + USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
2701 | + US_FL_NO_REPORT_OPCODES), | ||
2702 | diff --git a/drivers/xen/swiotlb-xen.c b/drivers/xen/swiotlb-xen.c | ||
2703 | index f3a9d831d0f9..c9d0d5a0e662 100644 | ||
2704 | --- a/drivers/xen/swiotlb-xen.c | ||
2705 | +++ b/drivers/xen/swiotlb-xen.c | ||
2706 | @@ -397,7 +397,9 @@ dma_addr_t xen_swiotlb_map_page(struct device *dev, struct page *page, | ||
2707 | * buffering it. | ||
2708 | */ | ||
2709 | if (dma_capable(dev, dev_addr, size) && | ||
2710 | - !range_straddles_page_boundary(phys, size) && !swiotlb_force) { | ||
2711 | + !range_straddles_page_boundary(phys, size) && | ||
2712 | + !xen_arch_need_swiotlb(dev, PFN_DOWN(phys), PFN_DOWN(dev_addr)) && | ||
2713 | + !swiotlb_force) { | ||
2714 | /* we are not interested in the dma_addr returned by | ||
2715 | * xen_dma_map_page, only in the potential cache flushes executed | ||
2716 | * by the function. */ | ||
2717 | @@ -555,6 +557,7 @@ xen_swiotlb_map_sg_attrs(struct device *hwdev, struct scatterlist *sgl, | ||
2718 | dma_addr_t dev_addr = xen_phys_to_bus(paddr); | ||
2719 | |||
2720 | if (swiotlb_force || | ||
2721 | + xen_arch_need_swiotlb(hwdev, PFN_DOWN(paddr), PFN_DOWN(dev_addr)) || | ||
2722 | !dma_capable(hwdev, dev_addr, sg->length) || | ||
2723 | range_straddles_page_boundary(paddr, sg->length)) { | ||
2724 | phys_addr_t map = swiotlb_tbl_map_single(hwdev, | ||
2725 | diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c | ||
2726 | index 64b29f7f6b4c..dc482ffff659 100644 | ||
2727 | --- a/fs/gfs2/quota.c | ||
2728 | +++ b/fs/gfs2/quota.c | ||
2729 | @@ -667,7 +667,7 @@ static void do_qc(struct gfs2_quota_data *qd, s64 change) | ||
2730 | |||
2731 | static int gfs2_adjust_quota(struct gfs2_inode *ip, loff_t loc, | ||
2732 | s64 change, struct gfs2_quota_data *qd, | ||
2733 | - struct fs_disk_quota *fdq) | ||
2734 | + struct qc_dqblk *fdq) | ||
2735 | { | ||
2736 | struct inode *inode = &ip->i_inode; | ||
2737 | struct gfs2_sbd *sdp = GFS2_SB(inode); | ||
2738 | @@ -697,16 +697,16 @@ static int gfs2_adjust_quota(struct gfs2_inode *ip, loff_t loc, | ||
2739 | be64_add_cpu(&q.qu_value, change); | ||
2740 | qd->qd_qb.qb_value = q.qu_value; | ||
2741 | if (fdq) { | ||
2742 | - if (fdq->d_fieldmask & FS_DQ_BSOFT) { | ||
2743 | - q.qu_warn = cpu_to_be64(fdq->d_blk_softlimit >> sdp->sd_fsb2bb_shift); | ||
2744 | + if (fdq->d_fieldmask & QC_SPC_SOFT) { | ||
2745 | + q.qu_warn = cpu_to_be64(fdq->d_spc_softlimit >> sdp->sd_sb.sb_bsize_shift); | ||
2746 | qd->qd_qb.qb_warn = q.qu_warn; | ||
2747 | } | ||
2748 | - if (fdq->d_fieldmask & FS_DQ_BHARD) { | ||
2749 | - q.qu_limit = cpu_to_be64(fdq->d_blk_hardlimit >> sdp->sd_fsb2bb_shift); | ||
2750 | + if (fdq->d_fieldmask & QC_SPC_HARD) { | ||
2751 | + q.qu_limit = cpu_to_be64(fdq->d_spc_hardlimit >> sdp->sd_sb.sb_bsize_shift); | ||
2752 | qd->qd_qb.qb_limit = q.qu_limit; | ||
2753 | } | ||
2754 | - if (fdq->d_fieldmask & FS_DQ_BCOUNT) { | ||
2755 | - q.qu_value = cpu_to_be64(fdq->d_bcount >> sdp->sd_fsb2bb_shift); | ||
2756 | + if (fdq->d_fieldmask & QC_SPACE) { | ||
2757 | + q.qu_value = cpu_to_be64(fdq->d_space >> sdp->sd_sb.sb_bsize_shift); | ||
2758 | qd->qd_qb.qb_value = q.qu_value; | ||
2759 | } | ||
2760 | } | ||
2761 | @@ -1502,7 +1502,7 @@ static int gfs2_quota_get_xstate(struct super_block *sb, | ||
2762 | } | ||
2763 | |||
2764 | static int gfs2_get_dqblk(struct super_block *sb, struct kqid qid, | ||
2765 | - struct fs_disk_quota *fdq) | ||
2766 | + struct qc_dqblk *fdq) | ||
2767 | { | ||
2768 | struct gfs2_sbd *sdp = sb->s_fs_info; | ||
2769 | struct gfs2_quota_lvb *qlvb; | ||
2770 | @@ -1510,7 +1510,7 @@ static int gfs2_get_dqblk(struct super_block *sb, struct kqid qid, | ||
2771 | struct gfs2_holder q_gh; | ||
2772 | int error; | ||
2773 | |||
2774 | - memset(fdq, 0, sizeof(struct fs_disk_quota)); | ||
2775 | + memset(fdq, 0, sizeof(*fdq)); | ||
2776 | |||
2777 | if (sdp->sd_args.ar_quota == GFS2_QUOTA_OFF) | ||
2778 | return -ESRCH; /* Crazy XFS error code */ | ||
2779 | @@ -1527,12 +1527,9 @@ static int gfs2_get_dqblk(struct super_block *sb, struct kqid qid, | ||
2780 | goto out; | ||
2781 | |||
2782 | qlvb = (struct gfs2_quota_lvb *)qd->qd_gl->gl_lksb.sb_lvbptr; | ||
2783 | - fdq->d_version = FS_DQUOT_VERSION; | ||
2784 | - fdq->d_flags = (qid.type == USRQUOTA) ? FS_USER_QUOTA : FS_GROUP_QUOTA; | ||
2785 | - fdq->d_id = from_kqid_munged(current_user_ns(), qid); | ||
2786 | - fdq->d_blk_hardlimit = be64_to_cpu(qlvb->qb_limit) << sdp->sd_fsb2bb_shift; | ||
2787 | - fdq->d_blk_softlimit = be64_to_cpu(qlvb->qb_warn) << sdp->sd_fsb2bb_shift; | ||
2788 | - fdq->d_bcount = be64_to_cpu(qlvb->qb_value) << sdp->sd_fsb2bb_shift; | ||
2789 | + fdq->d_spc_hardlimit = be64_to_cpu(qlvb->qb_limit) << sdp->sd_sb.sb_bsize_shift; | ||
2790 | + fdq->d_spc_softlimit = be64_to_cpu(qlvb->qb_warn) << sdp->sd_sb.sb_bsize_shift; | ||
2791 | + fdq->d_space = be64_to_cpu(qlvb->qb_value) << sdp->sd_sb.sb_bsize_shift; | ||
2792 | |||
2793 | gfs2_glock_dq_uninit(&q_gh); | ||
2794 | out: | ||
2795 | @@ -1541,10 +1538,10 @@ out: | ||
2796 | } | ||
2797 | |||
2798 | /* GFS2 only supports a subset of the XFS fields */ | ||
2799 | -#define GFS2_FIELDMASK (FS_DQ_BSOFT|FS_DQ_BHARD|FS_DQ_BCOUNT) | ||
2800 | +#define GFS2_FIELDMASK (QC_SPC_SOFT|QC_SPC_HARD|QC_SPACE) | ||
2801 | |||
2802 | static int gfs2_set_dqblk(struct super_block *sb, struct kqid qid, | ||
2803 | - struct fs_disk_quota *fdq) | ||
2804 | + struct qc_dqblk *fdq) | ||
2805 | { | ||
2806 | struct gfs2_sbd *sdp = sb->s_fs_info; | ||
2807 | struct gfs2_inode *ip = GFS2_I(sdp->sd_quota_inode); | ||
2808 | @@ -1588,17 +1585,17 @@ static int gfs2_set_dqblk(struct super_block *sb, struct kqid qid, | ||
2809 | goto out_i; | ||
2810 | |||
2811 | /* If nothing has changed, this is a no-op */ | ||
2812 | - if ((fdq->d_fieldmask & FS_DQ_BSOFT) && | ||
2813 | - ((fdq->d_blk_softlimit >> sdp->sd_fsb2bb_shift) == be64_to_cpu(qd->qd_qb.qb_warn))) | ||
2814 | - fdq->d_fieldmask ^= FS_DQ_BSOFT; | ||
2815 | + if ((fdq->d_fieldmask & QC_SPC_SOFT) && | ||
2816 | + ((fdq->d_spc_softlimit >> sdp->sd_sb.sb_bsize_shift) == be64_to_cpu(qd->qd_qb.qb_warn))) | ||
2817 | + fdq->d_fieldmask ^= QC_SPC_SOFT; | ||
2818 | |||
2819 | - if ((fdq->d_fieldmask & FS_DQ_BHARD) && | ||
2820 | - ((fdq->d_blk_hardlimit >> sdp->sd_fsb2bb_shift) == be64_to_cpu(qd->qd_qb.qb_limit))) | ||
2821 | - fdq->d_fieldmask ^= FS_DQ_BHARD; | ||
2822 | + if ((fdq->d_fieldmask & QC_SPC_HARD) && | ||
2823 | + ((fdq->d_spc_hardlimit >> sdp->sd_sb.sb_bsize_shift) == be64_to_cpu(qd->qd_qb.qb_limit))) | ||
2824 | + fdq->d_fieldmask ^= QC_SPC_HARD; | ||
2825 | |||
2826 | - if ((fdq->d_fieldmask & FS_DQ_BCOUNT) && | ||
2827 | - ((fdq->d_bcount >> sdp->sd_fsb2bb_shift) == be64_to_cpu(qd->qd_qb.qb_value))) | ||
2828 | - fdq->d_fieldmask ^= FS_DQ_BCOUNT; | ||
2829 | + if ((fdq->d_fieldmask & QC_SPACE) && | ||
2830 | + ((fdq->d_space >> sdp->sd_sb.sb_bsize_shift) == be64_to_cpu(qd->qd_qb.qb_value))) | ||
2831 | + fdq->d_fieldmask ^= QC_SPACE; | ||
2832 | |||
2833 | if (fdq->d_fieldmask == 0) | ||
2834 | goto out_i; | ||
2835 | diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c | ||
2836 | index 10bf07280f4a..294692ff83b1 100644 | ||
2837 | --- a/fs/nfs/direct.c | ||
2838 | +++ b/fs/nfs/direct.c | ||
2839 | @@ -212,6 +212,12 @@ static int nfs_direct_cmp_commit_data_verf(struct nfs_direct_req *dreq, | ||
2840 | */ | ||
2841 | ssize_t nfs_direct_IO(int rw, struct kiocb *iocb, struct iov_iter *iter, loff_t pos) | ||
2842 | { | ||
2843 | + struct inode *inode = iocb->ki_filp->f_mapping->host; | ||
2844 | + | ||
2845 | + /* we only support swap file calling nfs_direct_IO */ | ||
2846 | + if (!IS_SWAPFILE(inode)) | ||
2847 | + return 0; | ||
2848 | + | ||
2849 | #ifndef CONFIG_NFS_SWAP | ||
2850 | dprintk("NFS: nfs_direct_IO (%pD) off/no(%Ld/%lu) EINVAL\n", | ||
2851 | iocb->ki_filp, (long long) pos, iter->nr_segs); | ||
2852 | diff --git a/fs/nfs/nfs4client.c b/fs/nfs/nfs4client.c | ||
2853 | index 9588873d4c46..368a6b72290c 100644 | ||
2854 | --- a/fs/nfs/nfs4client.c | ||
2855 | +++ b/fs/nfs/nfs4client.c | ||
2856 | @@ -640,7 +640,7 @@ int nfs41_walk_client_list(struct nfs_client *new, | ||
2857 | prev = pos; | ||
2858 | |||
2859 | status = nfs_wait_client_init_complete(pos); | ||
2860 | - if (status == 0) { | ||
2861 | + if (pos->cl_cons_state == NFS_CS_SESSION_INITING) { | ||
2862 | nfs4_schedule_lease_recovery(pos); | ||
2863 | status = nfs4_wait_clnt_recover(pos); | ||
2864 | } | ||
2865 | diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c | ||
2866 | index 6b4527216a7f..9340228aff6e 100644 | ||
2867 | --- a/fs/quota/dquot.c | ||
2868 | +++ b/fs/quota/dquot.c | ||
2869 | @@ -2391,30 +2391,25 @@ static inline qsize_t stoqb(qsize_t space) | ||
2870 | } | ||
2871 | |||
2872 | /* Generic routine for getting common part of quota structure */ | ||
2873 | -static void do_get_dqblk(struct dquot *dquot, struct fs_disk_quota *di) | ||
2874 | +static void do_get_dqblk(struct dquot *dquot, struct qc_dqblk *di) | ||
2875 | { | ||
2876 | struct mem_dqblk *dm = &dquot->dq_dqb; | ||
2877 | |||
2878 | memset(di, 0, sizeof(*di)); | ||
2879 | - di->d_version = FS_DQUOT_VERSION; | ||
2880 | - di->d_flags = dquot->dq_id.type == USRQUOTA ? | ||
2881 | - FS_USER_QUOTA : FS_GROUP_QUOTA; | ||
2882 | - di->d_id = from_kqid_munged(current_user_ns(), dquot->dq_id); | ||
2883 | - | ||
2884 | spin_lock(&dq_data_lock); | ||
2885 | - di->d_blk_hardlimit = stoqb(dm->dqb_bhardlimit); | ||
2886 | - di->d_blk_softlimit = stoqb(dm->dqb_bsoftlimit); | ||
2887 | + di->d_spc_hardlimit = dm->dqb_bhardlimit; | ||
2888 | + di->d_spc_softlimit = dm->dqb_bsoftlimit; | ||
2889 | di->d_ino_hardlimit = dm->dqb_ihardlimit; | ||
2890 | di->d_ino_softlimit = dm->dqb_isoftlimit; | ||
2891 | - di->d_bcount = dm->dqb_curspace + dm->dqb_rsvspace; | ||
2892 | - di->d_icount = dm->dqb_curinodes; | ||
2893 | - di->d_btimer = dm->dqb_btime; | ||
2894 | - di->d_itimer = dm->dqb_itime; | ||
2895 | + di->d_space = dm->dqb_curspace + dm->dqb_rsvspace; | ||
2896 | + di->d_ino_count = dm->dqb_curinodes; | ||
2897 | + di->d_spc_timer = dm->dqb_btime; | ||
2898 | + di->d_ino_timer = dm->dqb_itime; | ||
2899 | spin_unlock(&dq_data_lock); | ||
2900 | } | ||
2901 | |||
2902 | int dquot_get_dqblk(struct super_block *sb, struct kqid qid, | ||
2903 | - struct fs_disk_quota *di) | ||
2904 | + struct qc_dqblk *di) | ||
2905 | { | ||
2906 | struct dquot *dquot; | ||
2907 | |||
2908 | @@ -2428,70 +2423,70 @@ int dquot_get_dqblk(struct super_block *sb, struct kqid qid, | ||
2909 | } | ||
2910 | EXPORT_SYMBOL(dquot_get_dqblk); | ||
2911 | |||
2912 | -#define VFS_FS_DQ_MASK \ | ||
2913 | - (FS_DQ_BCOUNT | FS_DQ_BSOFT | FS_DQ_BHARD | \ | ||
2914 | - FS_DQ_ICOUNT | FS_DQ_ISOFT | FS_DQ_IHARD | \ | ||
2915 | - FS_DQ_BTIMER | FS_DQ_ITIMER) | ||
2916 | +#define VFS_QC_MASK \ | ||
2917 | + (QC_SPACE | QC_SPC_SOFT | QC_SPC_HARD | \ | ||
2918 | + QC_INO_COUNT | QC_INO_SOFT | QC_INO_HARD | \ | ||
2919 | + QC_SPC_TIMER | QC_INO_TIMER) | ||
2920 | |||
2921 | /* Generic routine for setting common part of quota structure */ | ||
2922 | -static int do_set_dqblk(struct dquot *dquot, struct fs_disk_quota *di) | ||
2923 | +static int do_set_dqblk(struct dquot *dquot, struct qc_dqblk *di) | ||
2924 | { | ||
2925 | struct mem_dqblk *dm = &dquot->dq_dqb; | ||
2926 | int check_blim = 0, check_ilim = 0; | ||
2927 | struct mem_dqinfo *dqi = &sb_dqopt(dquot->dq_sb)->info[dquot->dq_id.type]; | ||
2928 | |||
2929 | - if (di->d_fieldmask & ~VFS_FS_DQ_MASK) | ||
2930 | + if (di->d_fieldmask & ~VFS_QC_MASK) | ||
2931 | return -EINVAL; | ||
2932 | |||
2933 | - if (((di->d_fieldmask & FS_DQ_BSOFT) && | ||
2934 | - (di->d_blk_softlimit > dqi->dqi_maxblimit)) || | ||
2935 | - ((di->d_fieldmask & FS_DQ_BHARD) && | ||
2936 | - (di->d_blk_hardlimit > dqi->dqi_maxblimit)) || | ||
2937 | - ((di->d_fieldmask & FS_DQ_ISOFT) && | ||
2938 | + if (((di->d_fieldmask & QC_SPC_SOFT) && | ||
2939 | + stoqb(di->d_spc_softlimit) > dqi->dqi_maxblimit) || | ||
2940 | + ((di->d_fieldmask & QC_SPC_HARD) && | ||
2941 | + stoqb(di->d_spc_hardlimit) > dqi->dqi_maxblimit) || | ||
2942 | + ((di->d_fieldmask & QC_INO_SOFT) && | ||
2943 | (di->d_ino_softlimit > dqi->dqi_maxilimit)) || | ||
2944 | - ((di->d_fieldmask & FS_DQ_IHARD) && | ||
2945 | + ((di->d_fieldmask & QC_INO_HARD) && | ||
2946 | (di->d_ino_hardlimit > dqi->dqi_maxilimit))) | ||
2947 | return -ERANGE; | ||
2948 | |||
2949 | spin_lock(&dq_data_lock); | ||
2950 | - if (di->d_fieldmask & FS_DQ_BCOUNT) { | ||
2951 | - dm->dqb_curspace = di->d_bcount - dm->dqb_rsvspace; | ||
2952 | + if (di->d_fieldmask & QC_SPACE) { | ||
2953 | + dm->dqb_curspace = di->d_space - dm->dqb_rsvspace; | ||
2954 | check_blim = 1; | ||
2955 | set_bit(DQ_LASTSET_B + QIF_SPACE_B, &dquot->dq_flags); | ||
2956 | } | ||
2957 | |||
2958 | - if (di->d_fieldmask & FS_DQ_BSOFT) | ||
2959 | - dm->dqb_bsoftlimit = qbtos(di->d_blk_softlimit); | ||
2960 | - if (di->d_fieldmask & FS_DQ_BHARD) | ||
2961 | - dm->dqb_bhardlimit = qbtos(di->d_blk_hardlimit); | ||
2962 | - if (di->d_fieldmask & (FS_DQ_BSOFT | FS_DQ_BHARD)) { | ||
2963 | + if (di->d_fieldmask & QC_SPC_SOFT) | ||
2964 | + dm->dqb_bsoftlimit = di->d_spc_softlimit; | ||
2965 | + if (di->d_fieldmask & QC_SPC_HARD) | ||
2966 | + dm->dqb_bhardlimit = di->d_spc_hardlimit; | ||
2967 | + if (di->d_fieldmask & (QC_SPC_SOFT | QC_SPC_HARD)) { | ||
2968 | check_blim = 1; | ||
2969 | set_bit(DQ_LASTSET_B + QIF_BLIMITS_B, &dquot->dq_flags); | ||
2970 | } | ||
2971 | |||
2972 | - if (di->d_fieldmask & FS_DQ_ICOUNT) { | ||
2973 | - dm->dqb_curinodes = di->d_icount; | ||
2974 | + if (di->d_fieldmask & QC_INO_COUNT) { | ||
2975 | + dm->dqb_curinodes = di->d_ino_count; | ||
2976 | check_ilim = 1; | ||
2977 | set_bit(DQ_LASTSET_B + QIF_INODES_B, &dquot->dq_flags); | ||
2978 | } | ||
2979 | |||
2980 | - if (di->d_fieldmask & FS_DQ_ISOFT) | ||
2981 | + if (di->d_fieldmask & QC_INO_SOFT) | ||
2982 | dm->dqb_isoftlimit = di->d_ino_softlimit; | ||
2983 | - if (di->d_fieldmask & FS_DQ_IHARD) | ||
2984 | + if (di->d_fieldmask & QC_INO_HARD) | ||
2985 | dm->dqb_ihardlimit = di->d_ino_hardlimit; | ||
2986 | - if (di->d_fieldmask & (FS_DQ_ISOFT | FS_DQ_IHARD)) { | ||
2987 | + if (di->d_fieldmask & (QC_INO_SOFT | QC_INO_HARD)) { | ||
2988 | check_ilim = 1; | ||
2989 | set_bit(DQ_LASTSET_B + QIF_ILIMITS_B, &dquot->dq_flags); | ||
2990 | } | ||
2991 | |||
2992 | - if (di->d_fieldmask & FS_DQ_BTIMER) { | ||
2993 | - dm->dqb_btime = di->d_btimer; | ||
2994 | + if (di->d_fieldmask & QC_SPC_TIMER) { | ||
2995 | + dm->dqb_btime = di->d_spc_timer; | ||
2996 | check_blim = 1; | ||
2997 | set_bit(DQ_LASTSET_B + QIF_BTIME_B, &dquot->dq_flags); | ||
2998 | } | ||
2999 | |||
3000 | - if (di->d_fieldmask & FS_DQ_ITIMER) { | ||
3001 | - dm->dqb_itime = di->d_itimer; | ||
3002 | + if (di->d_fieldmask & QC_INO_TIMER) { | ||
3003 | + dm->dqb_itime = di->d_ino_timer; | ||
3004 | check_ilim = 1; | ||
3005 | set_bit(DQ_LASTSET_B + QIF_ITIME_B, &dquot->dq_flags); | ||
3006 | } | ||
3007 | @@ -2501,7 +2496,7 @@ static int do_set_dqblk(struct dquot *dquot, struct fs_disk_quota *di) | ||
3008 | dm->dqb_curspace < dm->dqb_bsoftlimit) { | ||
3009 | dm->dqb_btime = 0; | ||
3010 | clear_bit(DQ_BLKS_B, &dquot->dq_flags); | ||
3011 | - } else if (!(di->d_fieldmask & FS_DQ_BTIMER)) | ||
3012 | + } else if (!(di->d_fieldmask & QC_SPC_TIMER)) | ||
3013 | /* Set grace only if user hasn't provided his own... */ | ||
3014 | dm->dqb_btime = get_seconds() + dqi->dqi_bgrace; | ||
3015 | } | ||
3016 | @@ -2510,7 +2505,7 @@ static int do_set_dqblk(struct dquot *dquot, struct fs_disk_quota *di) | ||
3017 | dm->dqb_curinodes < dm->dqb_isoftlimit) { | ||
3018 | dm->dqb_itime = 0; | ||
3019 | clear_bit(DQ_INODES_B, &dquot->dq_flags); | ||
3020 | - } else if (!(di->d_fieldmask & FS_DQ_ITIMER)) | ||
3021 | + } else if (!(di->d_fieldmask & QC_INO_TIMER)) | ||
3022 | /* Set grace only if user hasn't provided his own... */ | ||
3023 | dm->dqb_itime = get_seconds() + dqi->dqi_igrace; | ||
3024 | } | ||
3025 | @@ -2526,7 +2521,7 @@ static int do_set_dqblk(struct dquot *dquot, struct fs_disk_quota *di) | ||
3026 | } | ||
3027 | |||
3028 | int dquot_set_dqblk(struct super_block *sb, struct kqid qid, | ||
3029 | - struct fs_disk_quota *di) | ||
3030 | + struct qc_dqblk *di) | ||
3031 | { | ||
3032 | struct dquot *dquot; | ||
3033 | int rc; | ||
3034 | diff --git a/fs/quota/quota.c b/fs/quota/quota.c | ||
3035 | index 75621649dbd7..2ce66201c366 100644 | ||
3036 | --- a/fs/quota/quota.c | ||
3037 | +++ b/fs/quota/quota.c | ||
3038 | @@ -115,17 +115,27 @@ static int quota_setinfo(struct super_block *sb, int type, void __user *addr) | ||
3039 | return sb->s_qcop->set_info(sb, type, &info); | ||
3040 | } | ||
3041 | |||
3042 | -static void copy_to_if_dqblk(struct if_dqblk *dst, struct fs_disk_quota *src) | ||
3043 | +static inline qsize_t qbtos(qsize_t blocks) | ||
3044 | +{ | ||
3045 | + return blocks << QIF_DQBLKSIZE_BITS; | ||
3046 | +} | ||
3047 | + | ||
3048 | +static inline qsize_t stoqb(qsize_t space) | ||
3049 | +{ | ||
3050 | + return (space + QIF_DQBLKSIZE - 1) >> QIF_DQBLKSIZE_BITS; | ||
3051 | +} | ||
3052 | + | ||
3053 | +static void copy_to_if_dqblk(struct if_dqblk *dst, struct qc_dqblk *src) | ||
3054 | { | ||
3055 | memset(dst, 0, sizeof(*dst)); | ||
3056 | - dst->dqb_bhardlimit = src->d_blk_hardlimit; | ||
3057 | - dst->dqb_bsoftlimit = src->d_blk_softlimit; | ||
3058 | - dst->dqb_curspace = src->d_bcount; | ||
3059 | + dst->dqb_bhardlimit = stoqb(src->d_spc_hardlimit); | ||
3060 | + dst->dqb_bsoftlimit = stoqb(src->d_spc_softlimit); | ||
3061 | + dst->dqb_curspace = src->d_space; | ||
3062 | dst->dqb_ihardlimit = src->d_ino_hardlimit; | ||
3063 | dst->dqb_isoftlimit = src->d_ino_softlimit; | ||
3064 | - dst->dqb_curinodes = src->d_icount; | ||
3065 | - dst->dqb_btime = src->d_btimer; | ||
3066 | - dst->dqb_itime = src->d_itimer; | ||
3067 | + dst->dqb_curinodes = src->d_ino_count; | ||
3068 | + dst->dqb_btime = src->d_spc_timer; | ||
3069 | + dst->dqb_itime = src->d_ino_timer; | ||
3070 | dst->dqb_valid = QIF_ALL; | ||
3071 | } | ||
3072 | |||
3073 | @@ -133,7 +143,7 @@ static int quota_getquota(struct super_block *sb, int type, qid_t id, | ||
3074 | void __user *addr) | ||
3075 | { | ||
3076 | struct kqid qid; | ||
3077 | - struct fs_disk_quota fdq; | ||
3078 | + struct qc_dqblk fdq; | ||
3079 | struct if_dqblk idq; | ||
3080 | int ret; | ||
3081 | |||
3082 | @@ -151,36 +161,36 @@ static int quota_getquota(struct super_block *sb, int type, qid_t id, | ||
3083 | return 0; | ||
3084 | } | ||
3085 | |||
3086 | -static void copy_from_if_dqblk(struct fs_disk_quota *dst, struct if_dqblk *src) | ||
3087 | +static void copy_from_if_dqblk(struct qc_dqblk *dst, struct if_dqblk *src) | ||
3088 | { | ||
3089 | - dst->d_blk_hardlimit = src->dqb_bhardlimit; | ||
3090 | - dst->d_blk_softlimit = src->dqb_bsoftlimit; | ||
3091 | - dst->d_bcount = src->dqb_curspace; | ||
3092 | + dst->d_spc_hardlimit = qbtos(src->dqb_bhardlimit); | ||
3093 | + dst->d_spc_softlimit = qbtos(src->dqb_bsoftlimit); | ||
3094 | + dst->d_space = src->dqb_curspace; | ||
3095 | dst->d_ino_hardlimit = src->dqb_ihardlimit; | ||
3096 | dst->d_ino_softlimit = src->dqb_isoftlimit; | ||
3097 | - dst->d_icount = src->dqb_curinodes; | ||
3098 | - dst->d_btimer = src->dqb_btime; | ||
3099 | - dst->d_itimer = src->dqb_itime; | ||
3100 | + dst->d_ino_count = src->dqb_curinodes; | ||
3101 | + dst->d_spc_timer = src->dqb_btime; | ||
3102 | + dst->d_ino_timer = src->dqb_itime; | ||
3103 | |||
3104 | dst->d_fieldmask = 0; | ||
3105 | if (src->dqb_valid & QIF_BLIMITS) | ||
3106 | - dst->d_fieldmask |= FS_DQ_BSOFT | FS_DQ_BHARD; | ||
3107 | + dst->d_fieldmask |= QC_SPC_SOFT | QC_SPC_HARD; | ||
3108 | if (src->dqb_valid & QIF_SPACE) | ||
3109 | - dst->d_fieldmask |= FS_DQ_BCOUNT; | ||
3110 | + dst->d_fieldmask |= QC_SPACE; | ||
3111 | if (src->dqb_valid & QIF_ILIMITS) | ||
3112 | - dst->d_fieldmask |= FS_DQ_ISOFT | FS_DQ_IHARD; | ||
3113 | + dst->d_fieldmask |= QC_INO_SOFT | QC_INO_HARD; | ||
3114 | if (src->dqb_valid & QIF_INODES) | ||
3115 | - dst->d_fieldmask |= FS_DQ_ICOUNT; | ||
3116 | + dst->d_fieldmask |= QC_INO_COUNT; | ||
3117 | if (src->dqb_valid & QIF_BTIME) | ||
3118 | - dst->d_fieldmask |= FS_DQ_BTIMER; | ||
3119 | + dst->d_fieldmask |= QC_SPC_TIMER; | ||
3120 | if (src->dqb_valid & QIF_ITIME) | ||
3121 | - dst->d_fieldmask |= FS_DQ_ITIMER; | ||
3122 | + dst->d_fieldmask |= QC_INO_TIMER; | ||
3123 | } | ||
3124 | |||
3125 | static int quota_setquota(struct super_block *sb, int type, qid_t id, | ||
3126 | void __user *addr) | ||
3127 | { | ||
3128 | - struct fs_disk_quota fdq; | ||
3129 | + struct qc_dqblk fdq; | ||
3130 | struct if_dqblk idq; | ||
3131 | struct kqid qid; | ||
3132 | |||
3133 | @@ -244,10 +254,78 @@ static int quota_getxstatev(struct super_block *sb, void __user *addr) | ||
3134 | return ret; | ||
3135 | } | ||
3136 | |||
3137 | +/* | ||
3138 | + * XFS defines BBTOB and BTOBB macros inside fs/xfs/ and we cannot move them | ||
3139 | + * out of there as xfsprogs rely on definitions being in that header file. So | ||
3140 | + * just define same functions here for quota purposes. | ||
3141 | + */ | ||
3142 | +#define XFS_BB_SHIFT 9 | ||
3143 | + | ||
3144 | +static inline u64 quota_bbtob(u64 blocks) | ||
3145 | +{ | ||
3146 | + return blocks << XFS_BB_SHIFT; | ||
3147 | +} | ||
3148 | + | ||
3149 | +static inline u64 quota_btobb(u64 bytes) | ||
3150 | +{ | ||
3151 | + return (bytes + (1 << XFS_BB_SHIFT) - 1) >> XFS_BB_SHIFT; | ||
3152 | +} | ||
3153 | + | ||
3154 | +static void copy_from_xfs_dqblk(struct qc_dqblk *dst, struct fs_disk_quota *src) | ||
3155 | +{ | ||
3156 | + dst->d_spc_hardlimit = quota_bbtob(src->d_blk_hardlimit); | ||
3157 | + dst->d_spc_softlimit = quota_bbtob(src->d_blk_softlimit); | ||
3158 | + dst->d_ino_hardlimit = src->d_ino_hardlimit; | ||
3159 | + dst->d_ino_softlimit = src->d_ino_softlimit; | ||
3160 | + dst->d_space = quota_bbtob(src->d_bcount); | ||
3161 | + dst->d_ino_count = src->d_icount; | ||
3162 | + dst->d_ino_timer = src->d_itimer; | ||
3163 | + dst->d_spc_timer = src->d_btimer; | ||
3164 | + dst->d_ino_warns = src->d_iwarns; | ||
3165 | + dst->d_spc_warns = src->d_bwarns; | ||
3166 | + dst->d_rt_spc_hardlimit = quota_bbtob(src->d_rtb_hardlimit); | ||
3167 | + dst->d_rt_spc_softlimit = quota_bbtob(src->d_rtb_softlimit); | ||
3168 | + dst->d_rt_space = quota_bbtob(src->d_rtbcount); | ||
3169 | + dst->d_rt_spc_timer = src->d_rtbtimer; | ||
3170 | + dst->d_rt_spc_warns = src->d_rtbwarns; | ||
3171 | + dst->d_fieldmask = 0; | ||
3172 | + if (src->d_fieldmask & FS_DQ_ISOFT) | ||
3173 | + dst->d_fieldmask |= QC_INO_SOFT; | ||
3174 | + if (src->d_fieldmask & FS_DQ_IHARD) | ||
3175 | + dst->d_fieldmask |= QC_INO_HARD; | ||
3176 | + if (src->d_fieldmask & FS_DQ_BSOFT) | ||
3177 | + dst->d_fieldmask |= QC_SPC_SOFT; | ||
3178 | + if (src->d_fieldmask & FS_DQ_BHARD) | ||
3179 | + dst->d_fieldmask |= QC_SPC_HARD; | ||
3180 | + if (src->d_fieldmask & FS_DQ_RTBSOFT) | ||
3181 | + dst->d_fieldmask |= QC_RT_SPC_SOFT; | ||
3182 | + if (src->d_fieldmask & FS_DQ_RTBHARD) | ||
3183 | + dst->d_fieldmask |= QC_RT_SPC_HARD; | ||
3184 | + if (src->d_fieldmask & FS_DQ_BTIMER) | ||
3185 | + dst->d_fieldmask |= QC_SPC_TIMER; | ||
3186 | + if (src->d_fieldmask & FS_DQ_ITIMER) | ||
3187 | + dst->d_fieldmask |= QC_INO_TIMER; | ||
3188 | + if (src->d_fieldmask & FS_DQ_RTBTIMER) | ||
3189 | + dst->d_fieldmask |= QC_RT_SPC_TIMER; | ||
3190 | + if (src->d_fieldmask & FS_DQ_BWARNS) | ||
3191 | + dst->d_fieldmask |= QC_SPC_WARNS; | ||
3192 | + if (src->d_fieldmask & FS_DQ_IWARNS) | ||
3193 | + dst->d_fieldmask |= QC_INO_WARNS; | ||
3194 | + if (src->d_fieldmask & FS_DQ_RTBWARNS) | ||
3195 | + dst->d_fieldmask |= QC_RT_SPC_WARNS; | ||
3196 | + if (src->d_fieldmask & FS_DQ_BCOUNT) | ||
3197 | + dst->d_fieldmask |= QC_SPACE; | ||
3198 | + if (src->d_fieldmask & FS_DQ_ICOUNT) | ||
3199 | + dst->d_fieldmask |= QC_INO_COUNT; | ||
3200 | + if (src->d_fieldmask & FS_DQ_RTBCOUNT) | ||
3201 | + dst->d_fieldmask |= QC_RT_SPACE; | ||
3202 | +} | ||
3203 | + | ||
3204 | static int quota_setxquota(struct super_block *sb, int type, qid_t id, | ||
3205 | void __user *addr) | ||
3206 | { | ||
3207 | struct fs_disk_quota fdq; | ||
3208 | + struct qc_dqblk qdq; | ||
3209 | struct kqid qid; | ||
3210 | |||
3211 | if (copy_from_user(&fdq, addr, sizeof(fdq))) | ||
3212 | @@ -257,13 +335,44 @@ static int quota_setxquota(struct super_block *sb, int type, qid_t id, | ||
3213 | qid = make_kqid(current_user_ns(), type, id); | ||
3214 | if (!qid_valid(qid)) | ||
3215 | return -EINVAL; | ||
3216 | - return sb->s_qcop->set_dqblk(sb, qid, &fdq); | ||
3217 | + copy_from_xfs_dqblk(&qdq, &fdq); | ||
3218 | + return sb->s_qcop->set_dqblk(sb, qid, &qdq); | ||
3219 | +} | ||
3220 | + | ||
3221 | +static void copy_to_xfs_dqblk(struct fs_disk_quota *dst, struct qc_dqblk *src, | ||
3222 | + int type, qid_t id) | ||
3223 | +{ | ||
3224 | + memset(dst, 0, sizeof(*dst)); | ||
3225 | + dst->d_version = FS_DQUOT_VERSION; | ||
3226 | + dst->d_id = id; | ||
3227 | + if (type == USRQUOTA) | ||
3228 | + dst->d_flags = FS_USER_QUOTA; | ||
3229 | + else if (type == PRJQUOTA) | ||
3230 | + dst->d_flags = FS_PROJ_QUOTA; | ||
3231 | + else | ||
3232 | + dst->d_flags = FS_GROUP_QUOTA; | ||
3233 | + dst->d_blk_hardlimit = quota_btobb(src->d_spc_hardlimit); | ||
3234 | + dst->d_blk_softlimit = quota_btobb(src->d_spc_softlimit); | ||
3235 | + dst->d_ino_hardlimit = src->d_ino_hardlimit; | ||
3236 | + dst->d_ino_softlimit = src->d_ino_softlimit; | ||
3237 | + dst->d_bcount = quota_btobb(src->d_space); | ||
3238 | + dst->d_icount = src->d_ino_count; | ||
3239 | + dst->d_itimer = src->d_ino_timer; | ||
3240 | + dst->d_btimer = src->d_spc_timer; | ||
3241 | + dst->d_iwarns = src->d_ino_warns; | ||
3242 | + dst->d_bwarns = src->d_spc_warns; | ||
3243 | + dst->d_rtb_hardlimit = quota_btobb(src->d_rt_spc_hardlimit); | ||
3244 | + dst->d_rtb_softlimit = quota_btobb(src->d_rt_spc_softlimit); | ||
3245 | + dst->d_rtbcount = quota_btobb(src->d_rt_space); | ||
3246 | + dst->d_rtbtimer = src->d_rt_spc_timer; | ||
3247 | + dst->d_rtbwarns = src->d_rt_spc_warns; | ||
3248 | } | ||
3249 | |||
3250 | static int quota_getxquota(struct super_block *sb, int type, qid_t id, | ||
3251 | void __user *addr) | ||
3252 | { | ||
3253 | struct fs_disk_quota fdq; | ||
3254 | + struct qc_dqblk qdq; | ||
3255 | struct kqid qid; | ||
3256 | int ret; | ||
3257 | |||
3258 | @@ -272,8 +381,11 @@ static int quota_getxquota(struct super_block *sb, int type, qid_t id, | ||
3259 | qid = make_kqid(current_user_ns(), type, id); | ||
3260 | if (!qid_valid(qid)) | ||
3261 | return -EINVAL; | ||
3262 | - ret = sb->s_qcop->get_dqblk(sb, qid, &fdq); | ||
3263 | - if (!ret && copy_to_user(addr, &fdq, sizeof(fdq))) | ||
3264 | + ret = sb->s_qcop->get_dqblk(sb, qid, &qdq); | ||
3265 | + if (ret) | ||
3266 | + return ret; | ||
3267 | + copy_to_xfs_dqblk(&fdq, &qdq, type, id); | ||
3268 | + if (copy_to_user(addr, &fdq, sizeof(fdq))) | ||
3269 | return -EFAULT; | ||
3270 | return ret; | ||
3271 | } | ||
3272 | diff --git a/fs/udf/file.c b/fs/udf/file.c | ||
3273 | index bb15771b92ae..08f3555fbeac 100644 | ||
3274 | --- a/fs/udf/file.c | ||
3275 | +++ b/fs/udf/file.c | ||
3276 | @@ -224,7 +224,7 @@ out: | ||
3277 | static int udf_release_file(struct inode *inode, struct file *filp) | ||
3278 | { | ||
3279 | if (filp->f_mode & FMODE_WRITE && | ||
3280 | - atomic_read(&inode->i_writecount) > 1) { | ||
3281 | + atomic_read(&inode->i_writecount) == 1) { | ||
3282 | /* | ||
3283 | * Grab i_mutex to avoid races with writes changing i_size | ||
3284 | * while we are running. | ||
3285 | diff --git a/fs/xfs/xfs_qm.h b/fs/xfs/xfs_qm.h | ||
3286 | index 3a07a937e232..41f6c0b9d51c 100644 | ||
3287 | --- a/fs/xfs/xfs_qm.h | ||
3288 | +++ b/fs/xfs/xfs_qm.h | ||
3289 | @@ -166,9 +166,9 @@ extern void xfs_qm_dqrele_all_inodes(struct xfs_mount *, uint); | ||
3290 | /* quota ops */ | ||
3291 | extern int xfs_qm_scall_trunc_qfiles(struct xfs_mount *, uint); | ||
3292 | extern int xfs_qm_scall_getquota(struct xfs_mount *, xfs_dqid_t, | ||
3293 | - uint, struct fs_disk_quota *); | ||
3294 | + uint, struct qc_dqblk *); | ||
3295 | extern int xfs_qm_scall_setqlim(struct xfs_mount *, xfs_dqid_t, uint, | ||
3296 | - struct fs_disk_quota *); | ||
3297 | + struct qc_dqblk *); | ||
3298 | extern int xfs_qm_scall_getqstat(struct xfs_mount *, | ||
3299 | struct fs_quota_stat *); | ||
3300 | extern int xfs_qm_scall_getqstatv(struct xfs_mount *, | ||
3301 | diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c | ||
3302 | index 80f2d77d929a..327f85abbea8 100644 | ||
3303 | --- a/fs/xfs/xfs_qm_syscalls.c | ||
3304 | +++ b/fs/xfs/xfs_qm_syscalls.c | ||
3305 | @@ -40,7 +40,6 @@ STATIC int xfs_qm_log_quotaoff(xfs_mount_t *, xfs_qoff_logitem_t **, uint); | ||
3306 | STATIC int xfs_qm_log_quotaoff_end(xfs_mount_t *, xfs_qoff_logitem_t *, | ||
3307 | uint); | ||
3308 | STATIC uint xfs_qm_export_flags(uint); | ||
3309 | -STATIC uint xfs_qm_export_qtype_flags(uint); | ||
3310 | |||
3311 | /* | ||
3312 | * Turn off quota accounting and/or enforcement for all udquots and/or | ||
3313 | @@ -574,8 +573,8 @@ xfs_qm_scall_getqstatv( | ||
3314 | return 0; | ||
3315 | } | ||
3316 | |||
3317 | -#define XFS_DQ_MASK \ | ||
3318 | - (FS_DQ_LIMIT_MASK | FS_DQ_TIMER_MASK | FS_DQ_WARNS_MASK) | ||
3319 | +#define XFS_QC_MASK \ | ||
3320 | + (QC_LIMIT_MASK | QC_TIMER_MASK | QC_WARNS_MASK) | ||
3321 | |||
3322 | /* | ||
3323 | * Adjust quota limits, and start/stop timers accordingly. | ||
3324 | @@ -585,7 +584,7 @@ xfs_qm_scall_setqlim( | ||
3325 | struct xfs_mount *mp, | ||
3326 | xfs_dqid_t id, | ||
3327 | uint type, | ||
3328 | - fs_disk_quota_t *newlim) | ||
3329 | + struct qc_dqblk *newlim) | ||
3330 | { | ||
3331 | struct xfs_quotainfo *q = mp->m_quotainfo; | ||
3332 | struct xfs_disk_dquot *ddq; | ||
3333 | @@ -594,9 +593,9 @@ xfs_qm_scall_setqlim( | ||
3334 | int error; | ||
3335 | xfs_qcnt_t hard, soft; | ||
3336 | |||
3337 | - if (newlim->d_fieldmask & ~XFS_DQ_MASK) | ||
3338 | + if (newlim->d_fieldmask & ~XFS_QC_MASK) | ||
3339 | return -EINVAL; | ||
3340 | - if ((newlim->d_fieldmask & XFS_DQ_MASK) == 0) | ||
3341 | + if ((newlim->d_fieldmask & XFS_QC_MASK) == 0) | ||
3342 | return 0; | ||
3343 | |||
3344 | /* | ||
3345 | @@ -634,11 +633,11 @@ xfs_qm_scall_setqlim( | ||
3346 | /* | ||
3347 | * Make sure that hardlimits are >= soft limits before changing. | ||
3348 | */ | ||
3349 | - hard = (newlim->d_fieldmask & FS_DQ_BHARD) ? | ||
3350 | - (xfs_qcnt_t) XFS_BB_TO_FSB(mp, newlim->d_blk_hardlimit) : | ||
3351 | + hard = (newlim->d_fieldmask & QC_SPC_HARD) ? | ||
3352 | + (xfs_qcnt_t) XFS_B_TO_FSB(mp, newlim->d_spc_hardlimit) : | ||
3353 | be64_to_cpu(ddq->d_blk_hardlimit); | ||
3354 | - soft = (newlim->d_fieldmask & FS_DQ_BSOFT) ? | ||
3355 | - (xfs_qcnt_t) XFS_BB_TO_FSB(mp, newlim->d_blk_softlimit) : | ||
3356 | + soft = (newlim->d_fieldmask & QC_SPC_SOFT) ? | ||
3357 | + (xfs_qcnt_t) XFS_B_TO_FSB(mp, newlim->d_spc_softlimit) : | ||
3358 | be64_to_cpu(ddq->d_blk_softlimit); | ||
3359 | if (hard == 0 || hard >= soft) { | ||
3360 | ddq->d_blk_hardlimit = cpu_to_be64(hard); | ||
3361 | @@ -651,11 +650,11 @@ xfs_qm_scall_setqlim( | ||
3362 | } else { | ||
3363 | xfs_debug(mp, "blkhard %Ld < blksoft %Ld", hard, soft); | ||
3364 | } | ||
3365 | - hard = (newlim->d_fieldmask & FS_DQ_RTBHARD) ? | ||
3366 | - (xfs_qcnt_t) XFS_BB_TO_FSB(mp, newlim->d_rtb_hardlimit) : | ||
3367 | + hard = (newlim->d_fieldmask & QC_RT_SPC_HARD) ? | ||
3368 | + (xfs_qcnt_t) XFS_B_TO_FSB(mp, newlim->d_rt_spc_hardlimit) : | ||
3369 | be64_to_cpu(ddq->d_rtb_hardlimit); | ||
3370 | - soft = (newlim->d_fieldmask & FS_DQ_RTBSOFT) ? | ||
3371 | - (xfs_qcnt_t) XFS_BB_TO_FSB(mp, newlim->d_rtb_softlimit) : | ||
3372 | + soft = (newlim->d_fieldmask & QC_RT_SPC_SOFT) ? | ||
3373 | + (xfs_qcnt_t) XFS_B_TO_FSB(mp, newlim->d_rt_spc_softlimit) : | ||
3374 | be64_to_cpu(ddq->d_rtb_softlimit); | ||
3375 | if (hard == 0 || hard >= soft) { | ||
3376 | ddq->d_rtb_hardlimit = cpu_to_be64(hard); | ||
3377 | @@ -668,10 +667,10 @@ xfs_qm_scall_setqlim( | ||
3378 | xfs_debug(mp, "rtbhard %Ld < rtbsoft %Ld", hard, soft); | ||
3379 | } | ||
3380 | |||
3381 | - hard = (newlim->d_fieldmask & FS_DQ_IHARD) ? | ||
3382 | + hard = (newlim->d_fieldmask & QC_INO_HARD) ? | ||
3383 | (xfs_qcnt_t) newlim->d_ino_hardlimit : | ||
3384 | be64_to_cpu(ddq->d_ino_hardlimit); | ||
3385 | - soft = (newlim->d_fieldmask & FS_DQ_ISOFT) ? | ||
3386 | + soft = (newlim->d_fieldmask & QC_INO_SOFT) ? | ||
3387 | (xfs_qcnt_t) newlim->d_ino_softlimit : | ||
3388 | be64_to_cpu(ddq->d_ino_softlimit); | ||
3389 | if (hard == 0 || hard >= soft) { | ||
3390 | @@ -688,12 +687,12 @@ xfs_qm_scall_setqlim( | ||
3391 | /* | ||
3392 | * Update warnings counter(s) if requested | ||
3393 | */ | ||
3394 | - if (newlim->d_fieldmask & FS_DQ_BWARNS) | ||
3395 | - ddq->d_bwarns = cpu_to_be16(newlim->d_bwarns); | ||
3396 | - if (newlim->d_fieldmask & FS_DQ_IWARNS) | ||
3397 | - ddq->d_iwarns = cpu_to_be16(newlim->d_iwarns); | ||
3398 | - if (newlim->d_fieldmask & FS_DQ_RTBWARNS) | ||
3399 | - ddq->d_rtbwarns = cpu_to_be16(newlim->d_rtbwarns); | ||
3400 | + if (newlim->d_fieldmask & QC_SPC_WARNS) | ||
3401 | + ddq->d_bwarns = cpu_to_be16(newlim->d_spc_warns); | ||
3402 | + if (newlim->d_fieldmask & QC_INO_WARNS) | ||
3403 | + ddq->d_iwarns = cpu_to_be16(newlim->d_ino_warns); | ||
3404 | + if (newlim->d_fieldmask & QC_RT_SPC_WARNS) | ||
3405 | + ddq->d_rtbwarns = cpu_to_be16(newlim->d_rt_spc_warns); | ||
3406 | |||
3407 | if (id == 0) { | ||
3408 | /* | ||
3409 | @@ -703,24 +702,24 @@ xfs_qm_scall_setqlim( | ||
3410 | * soft and hard limit values (already done, above), and | ||
3411 | * for warnings. | ||
3412 | */ | ||
3413 | - if (newlim->d_fieldmask & FS_DQ_BTIMER) { | ||
3414 | - q->qi_btimelimit = newlim->d_btimer; | ||
3415 | - ddq->d_btimer = cpu_to_be32(newlim->d_btimer); | ||
3416 | + if (newlim->d_fieldmask & QC_SPC_TIMER) { | ||
3417 | + q->qi_btimelimit = newlim->d_spc_timer; | ||
3418 | + ddq->d_btimer = cpu_to_be32(newlim->d_spc_timer); | ||
3419 | } | ||
3420 | - if (newlim->d_fieldmask & FS_DQ_ITIMER) { | ||
3421 | - q->qi_itimelimit = newlim->d_itimer; | ||
3422 | - ddq->d_itimer = cpu_to_be32(newlim->d_itimer); | ||
3423 | + if (newlim->d_fieldmask & QC_INO_TIMER) { | ||
3424 | + q->qi_itimelimit = newlim->d_ino_timer; | ||
3425 | + ddq->d_itimer = cpu_to_be32(newlim->d_ino_timer); | ||
3426 | } | ||
3427 | - if (newlim->d_fieldmask & FS_DQ_RTBTIMER) { | ||
3428 | - q->qi_rtbtimelimit = newlim->d_rtbtimer; | ||
3429 | - ddq->d_rtbtimer = cpu_to_be32(newlim->d_rtbtimer); | ||
3430 | + if (newlim->d_fieldmask & QC_RT_SPC_TIMER) { | ||
3431 | + q->qi_rtbtimelimit = newlim->d_rt_spc_timer; | ||
3432 | + ddq->d_rtbtimer = cpu_to_be32(newlim->d_rt_spc_timer); | ||
3433 | } | ||
3434 | - if (newlim->d_fieldmask & FS_DQ_BWARNS) | ||
3435 | - q->qi_bwarnlimit = newlim->d_bwarns; | ||
3436 | - if (newlim->d_fieldmask & FS_DQ_IWARNS) | ||
3437 | - q->qi_iwarnlimit = newlim->d_iwarns; | ||
3438 | - if (newlim->d_fieldmask & FS_DQ_RTBWARNS) | ||
3439 | - q->qi_rtbwarnlimit = newlim->d_rtbwarns; | ||
3440 | + if (newlim->d_fieldmask & QC_SPC_WARNS) | ||
3441 | + q->qi_bwarnlimit = newlim->d_spc_warns; | ||
3442 | + if (newlim->d_fieldmask & QC_INO_WARNS) | ||
3443 | + q->qi_iwarnlimit = newlim->d_ino_warns; | ||
3444 | + if (newlim->d_fieldmask & QC_RT_SPC_WARNS) | ||
3445 | + q->qi_rtbwarnlimit = newlim->d_rt_spc_warns; | ||
3446 | } else { | ||
3447 | /* | ||
3448 | * If the user is now over quota, start the timelimit. | ||
3449 | @@ -831,7 +830,7 @@ xfs_qm_scall_getquota( | ||
3450 | struct xfs_mount *mp, | ||
3451 | xfs_dqid_t id, | ||
3452 | uint type, | ||
3453 | - struct fs_disk_quota *dst) | ||
3454 | + struct qc_dqblk *dst) | ||
3455 | { | ||
3456 | struct xfs_dquot *dqp; | ||
3457 | int error; | ||
3458 | @@ -855,28 +854,25 @@ xfs_qm_scall_getquota( | ||
3459 | } | ||
3460 | |||
3461 | memset(dst, 0, sizeof(*dst)); | ||
3462 | - dst->d_version = FS_DQUOT_VERSION; | ||
3463 | - dst->d_flags = xfs_qm_export_qtype_flags(dqp->q_core.d_flags); | ||
3464 | - dst->d_id = be32_to_cpu(dqp->q_core.d_id); | ||
3465 | - dst->d_blk_hardlimit = | ||
3466 | - XFS_FSB_TO_BB(mp, be64_to_cpu(dqp->q_core.d_blk_hardlimit)); | ||
3467 | - dst->d_blk_softlimit = | ||
3468 | - XFS_FSB_TO_BB(mp, be64_to_cpu(dqp->q_core.d_blk_softlimit)); | ||
3469 | + dst->d_spc_hardlimit = | ||
3470 | + XFS_FSB_TO_B(mp, be64_to_cpu(dqp->q_core.d_blk_hardlimit)); | ||
3471 | + dst->d_spc_softlimit = | ||
3472 | + XFS_FSB_TO_B(mp, be64_to_cpu(dqp->q_core.d_blk_softlimit)); | ||
3473 | dst->d_ino_hardlimit = be64_to_cpu(dqp->q_core.d_ino_hardlimit); | ||
3474 | dst->d_ino_softlimit = be64_to_cpu(dqp->q_core.d_ino_softlimit); | ||
3475 | - dst->d_bcount = XFS_FSB_TO_BB(mp, dqp->q_res_bcount); | ||
3476 | - dst->d_icount = dqp->q_res_icount; | ||
3477 | - dst->d_btimer = be32_to_cpu(dqp->q_core.d_btimer); | ||
3478 | - dst->d_itimer = be32_to_cpu(dqp->q_core.d_itimer); | ||
3479 | - dst->d_iwarns = be16_to_cpu(dqp->q_core.d_iwarns); | ||
3480 | - dst->d_bwarns = be16_to_cpu(dqp->q_core.d_bwarns); | ||
3481 | - dst->d_rtb_hardlimit = | ||
3482 | - XFS_FSB_TO_BB(mp, be64_to_cpu(dqp->q_core.d_rtb_hardlimit)); | ||
3483 | - dst->d_rtb_softlimit = | ||
3484 | - XFS_FSB_TO_BB(mp, be64_to_cpu(dqp->q_core.d_rtb_softlimit)); | ||
3485 | - dst->d_rtbcount = XFS_FSB_TO_BB(mp, dqp->q_res_rtbcount); | ||
3486 | - dst->d_rtbtimer = be32_to_cpu(dqp->q_core.d_rtbtimer); | ||
3487 | - dst->d_rtbwarns = be16_to_cpu(dqp->q_core.d_rtbwarns); | ||
3488 | + dst->d_space = XFS_FSB_TO_B(mp, dqp->q_res_bcount); | ||
3489 | + dst->d_ino_count = dqp->q_res_icount; | ||
3490 | + dst->d_spc_timer = be32_to_cpu(dqp->q_core.d_btimer); | ||
3491 | + dst->d_ino_timer = be32_to_cpu(dqp->q_core.d_itimer); | ||
3492 | + dst->d_ino_warns = be16_to_cpu(dqp->q_core.d_iwarns); | ||
3493 | + dst->d_spc_warns = be16_to_cpu(dqp->q_core.d_bwarns); | ||
3494 | + dst->d_rt_spc_hardlimit = | ||
3495 | + XFS_FSB_TO_B(mp, be64_to_cpu(dqp->q_core.d_rtb_hardlimit)); | ||
3496 | + dst->d_rt_spc_softlimit = | ||
3497 | + XFS_FSB_TO_B(mp, be64_to_cpu(dqp->q_core.d_rtb_softlimit)); | ||
3498 | + dst->d_rt_space = XFS_FSB_TO_B(mp, dqp->q_res_rtbcount); | ||
3499 | + dst->d_rt_spc_timer = be32_to_cpu(dqp->q_core.d_rtbtimer); | ||
3500 | + dst->d_rt_spc_warns = be16_to_cpu(dqp->q_core.d_rtbwarns); | ||
3501 | |||
3502 | /* | ||
3503 | * Internally, we don't reset all the timers when quota enforcement | ||
3504 | @@ -889,23 +885,23 @@ xfs_qm_scall_getquota( | ||
3505 | dqp->q_core.d_flags == XFS_DQ_GROUP) || | ||
3506 | (!XFS_IS_PQUOTA_ENFORCED(mp) && | ||
3507 | dqp->q_core.d_flags == XFS_DQ_PROJ)) { | ||
3508 | - dst->d_btimer = 0; | ||
3509 | - dst->d_itimer = 0; | ||
3510 | - dst->d_rtbtimer = 0; | ||
3511 | + dst->d_spc_timer = 0; | ||
3512 | + dst->d_ino_timer = 0; | ||
3513 | + dst->d_rt_spc_timer = 0; | ||
3514 | } | ||
3515 | |||
3516 | #ifdef DEBUG | ||
3517 | - if (((XFS_IS_UQUOTA_ENFORCED(mp) && dst->d_flags == FS_USER_QUOTA) || | ||
3518 | - (XFS_IS_GQUOTA_ENFORCED(mp) && dst->d_flags == FS_GROUP_QUOTA) || | ||
3519 | - (XFS_IS_PQUOTA_ENFORCED(mp) && dst->d_flags == FS_PROJ_QUOTA)) && | ||
3520 | - dst->d_id != 0) { | ||
3521 | - if ((dst->d_bcount > dst->d_blk_softlimit) && | ||
3522 | - (dst->d_blk_softlimit > 0)) { | ||
3523 | - ASSERT(dst->d_btimer != 0); | ||
3524 | + if (((XFS_IS_UQUOTA_ENFORCED(mp) && type == XFS_DQ_USER) || | ||
3525 | + (XFS_IS_GQUOTA_ENFORCED(mp) && type == XFS_DQ_GROUP) || | ||
3526 | + (XFS_IS_PQUOTA_ENFORCED(mp) && type == XFS_DQ_PROJ)) && | ||
3527 | + id != 0) { | ||
3528 | + if ((dst->d_space > dst->d_spc_softlimit) && | ||
3529 | + (dst->d_spc_softlimit > 0)) { | ||
3530 | + ASSERT(dst->d_spc_timer != 0); | ||
3531 | } | ||
3532 | - if ((dst->d_icount > dst->d_ino_softlimit) && | ||
3533 | + if ((dst->d_ino_count > dst->d_ino_softlimit) && | ||
3534 | (dst->d_ino_softlimit > 0)) { | ||
3535 | - ASSERT(dst->d_itimer != 0); | ||
3536 | + ASSERT(dst->d_ino_timer != 0); | ||
3537 | } | ||
3538 | } | ||
3539 | #endif | ||
3540 | @@ -915,26 +911,6 @@ out_put: | ||
3541 | } | ||
3542 | |||
3543 | STATIC uint | ||
3544 | -xfs_qm_export_qtype_flags( | ||
3545 | - uint flags) | ||
3546 | -{ | ||
3547 | - /* | ||
3548 | - * Can't be more than one, or none. | ||
3549 | - */ | ||
3550 | - ASSERT((flags & (FS_PROJ_QUOTA | FS_USER_QUOTA)) != | ||
3551 | - (FS_PROJ_QUOTA | FS_USER_QUOTA)); | ||
3552 | - ASSERT((flags & (FS_PROJ_QUOTA | FS_GROUP_QUOTA)) != | ||
3553 | - (FS_PROJ_QUOTA | FS_GROUP_QUOTA)); | ||
3554 | - ASSERT((flags & (FS_USER_QUOTA | FS_GROUP_QUOTA)) != | ||
3555 | - (FS_USER_QUOTA | FS_GROUP_QUOTA)); | ||
3556 | - ASSERT((flags & (FS_PROJ_QUOTA|FS_USER_QUOTA|FS_GROUP_QUOTA)) != 0); | ||
3557 | - | ||
3558 | - return (flags & XFS_DQ_USER) ? | ||
3559 | - FS_USER_QUOTA : (flags & XFS_DQ_PROJ) ? | ||
3560 | - FS_PROJ_QUOTA : FS_GROUP_QUOTA; | ||
3561 | -} | ||
3562 | - | ||
3563 | -STATIC uint | ||
3564 | xfs_qm_export_flags( | ||
3565 | uint flags) | ||
3566 | { | ||
3567 | diff --git a/fs/xfs/xfs_quotaops.c b/fs/xfs/xfs_quotaops.c | ||
3568 | index b238027df987..320c814bb9a5 100644 | ||
3569 | --- a/fs/xfs/xfs_quotaops.c | ||
3570 | +++ b/fs/xfs/xfs_quotaops.c | ||
3571 | @@ -133,7 +133,7 @@ STATIC int | ||
3572 | xfs_fs_get_dqblk( | ||
3573 | struct super_block *sb, | ||
3574 | struct kqid qid, | ||
3575 | - struct fs_disk_quota *fdq) | ||
3576 | + struct qc_dqblk *qdq) | ||
3577 | { | ||
3578 | struct xfs_mount *mp = XFS_M(sb); | ||
3579 | |||
3580 | @@ -143,14 +143,14 @@ xfs_fs_get_dqblk( | ||
3581 | return -ESRCH; | ||
3582 | |||
3583 | return xfs_qm_scall_getquota(mp, from_kqid(&init_user_ns, qid), | ||
3584 | - xfs_quota_type(qid.type), fdq); | ||
3585 | + xfs_quota_type(qid.type), qdq); | ||
3586 | } | ||
3587 | |||
3588 | STATIC int | ||
3589 | xfs_fs_set_dqblk( | ||
3590 | struct super_block *sb, | ||
3591 | struct kqid qid, | ||
3592 | - struct fs_disk_quota *fdq) | ||
3593 | + struct qc_dqblk *qdq) | ||
3594 | { | ||
3595 | struct xfs_mount *mp = XFS_M(sb); | ||
3596 | |||
3597 | @@ -162,7 +162,7 @@ xfs_fs_set_dqblk( | ||
3598 | return -ESRCH; | ||
3599 | |||
3600 | return xfs_qm_scall_setqlim(mp, from_kqid(&init_user_ns, qid), | ||
3601 | - xfs_quota_type(qid.type), fdq); | ||
3602 | + xfs_quota_type(qid.type), qdq); | ||
3603 | } | ||
3604 | |||
3605 | const struct quotactl_ops xfs_quotactl_operations = { | ||
3606 | diff --git a/include/linux/mm.h b/include/linux/mm.h | ||
3607 | index 5ab2da9811c1..86a977bf4f79 100644 | ||
3608 | --- a/include/linux/mm.h | ||
3609 | +++ b/include/linux/mm.h | ||
3610 | @@ -1054,6 +1054,7 @@ static inline int page_mapped(struct page *page) | ||
3611 | #define VM_FAULT_WRITE 0x0008 /* Special case for get_user_pages */ | ||
3612 | #define VM_FAULT_HWPOISON 0x0010 /* Hit poisoned small page */ | ||
3613 | #define VM_FAULT_HWPOISON_LARGE 0x0020 /* Hit poisoned large page. Index encoded in upper bits */ | ||
3614 | +#define VM_FAULT_SIGSEGV 0x0040 | ||
3615 | |||
3616 | #define VM_FAULT_NOPAGE 0x0100 /* ->fault installed the pte, not return page */ | ||
3617 | #define VM_FAULT_LOCKED 0x0200 /* ->fault locked the returned page */ | ||
3618 | @@ -1062,8 +1063,9 @@ static inline int page_mapped(struct page *page) | ||
3619 | |||
3620 | #define VM_FAULT_HWPOISON_LARGE_MASK 0xf000 /* encodes hpage index for large hwpoison */ | ||
3621 | |||
3622 | -#define VM_FAULT_ERROR (VM_FAULT_OOM | VM_FAULT_SIGBUS | VM_FAULT_HWPOISON | \ | ||
3623 | - VM_FAULT_FALLBACK | VM_FAULT_HWPOISON_LARGE) | ||
3624 | +#define VM_FAULT_ERROR (VM_FAULT_OOM | VM_FAULT_SIGBUS | VM_FAULT_SIGSEGV | \ | ||
3625 | + VM_FAULT_HWPOISON | VM_FAULT_HWPOISON_LARGE | \ | ||
3626 | + VM_FAULT_FALLBACK) | ||
3627 | |||
3628 | /* Encode hstate index for a hwpoisoned large page */ | ||
3629 | #define VM_FAULT_SET_HINDEX(x) ((x) << 12) | ||
3630 | diff --git a/include/linux/quota.h b/include/linux/quota.h | ||
3631 | index 80d345a3524c..224fb8154f8f 100644 | ||
3632 | --- a/include/linux/quota.h | ||
3633 | +++ b/include/linux/quota.h | ||
3634 | @@ -316,6 +316,49 @@ struct dquot_operations { | ||
3635 | |||
3636 | struct path; | ||
3637 | |||
3638 | +/* Structure for communicating via ->get_dqblk() & ->set_dqblk() */ | ||
3639 | +struct qc_dqblk { | ||
3640 | + int d_fieldmask; /* mask of fields to change in ->set_dqblk() */ | ||
3641 | + u64 d_spc_hardlimit; /* absolute limit on used space */ | ||
3642 | + u64 d_spc_softlimit; /* preferred limit on used space */ | ||
3643 | + u64 d_ino_hardlimit; /* maximum # allocated inodes */ | ||
3644 | + u64 d_ino_softlimit; /* preferred inode limit */ | ||
3645 | + u64 d_space; /* Space owned by the user */ | ||
3646 | + u64 d_ino_count; /* # inodes owned by the user */ | ||
3647 | + s64 d_ino_timer; /* zero if within inode limits */ | ||
3648 | + /* if not, we refuse service */ | ||
3649 | + s64 d_spc_timer; /* similar to above; for space */ | ||
3650 | + int d_ino_warns; /* # warnings issued wrt num inodes */ | ||
3651 | + int d_spc_warns; /* # warnings issued wrt used space */ | ||
3652 | + u64 d_rt_spc_hardlimit; /* absolute limit on realtime space */ | ||
3653 | + u64 d_rt_spc_softlimit; /* preferred limit on RT space */ | ||
3654 | + u64 d_rt_space; /* realtime space owned */ | ||
3655 | + s64 d_rt_spc_timer; /* similar to above; for RT space */ | ||
3656 | + int d_rt_spc_warns; /* # warnings issued wrt RT space */ | ||
3657 | +}; | ||
3658 | + | ||
3659 | +/* Field specifiers for ->set_dqblk() in struct qc_dqblk */ | ||
3660 | +#define QC_INO_SOFT (1<<0) | ||
3661 | +#define QC_INO_HARD (1<<1) | ||
3662 | +#define QC_SPC_SOFT (1<<2) | ||
3663 | +#define QC_SPC_HARD (1<<3) | ||
3664 | +#define QC_RT_SPC_SOFT (1<<4) | ||
3665 | +#define QC_RT_SPC_HARD (1<<5) | ||
3666 | +#define QC_LIMIT_MASK (QC_INO_SOFT | QC_INO_HARD | QC_SPC_SOFT | QC_SPC_HARD | \ | ||
3667 | + QC_RT_SPC_SOFT | QC_RT_SPC_HARD) | ||
3668 | +#define QC_SPC_TIMER (1<<6) | ||
3669 | +#define QC_INO_TIMER (1<<7) | ||
3670 | +#define QC_RT_SPC_TIMER (1<<8) | ||
3671 | +#define QC_TIMER_MASK (QC_SPC_TIMER | QC_INO_TIMER | QC_RT_SPC_TIMER) | ||
3672 | +#define QC_SPC_WARNS (1<<9) | ||
3673 | +#define QC_INO_WARNS (1<<10) | ||
3674 | +#define QC_RT_SPC_WARNS (1<<11) | ||
3675 | +#define QC_WARNS_MASK (QC_SPC_WARNS | QC_INO_WARNS | QC_RT_SPC_WARNS) | ||
3676 | +#define QC_SPACE (1<<12) | ||
3677 | +#define QC_INO_COUNT (1<<13) | ||
3678 | +#define QC_RT_SPACE (1<<14) | ||
3679 | +#define QC_ACCT_MASK (QC_SPACE | QC_INO_COUNT | QC_RT_SPACE) | ||
3680 | + | ||
3681 | /* Operations handling requests from userspace */ | ||
3682 | struct quotactl_ops { | ||
3683 | int (*quota_on)(struct super_block *, int, int, struct path *); | ||
3684 | @@ -324,8 +367,8 @@ struct quotactl_ops { | ||
3685 | int (*quota_sync)(struct super_block *, int); | ||
3686 | int (*get_info)(struct super_block *, int, struct if_dqinfo *); | ||
3687 | int (*set_info)(struct super_block *, int, struct if_dqinfo *); | ||
3688 | - int (*get_dqblk)(struct super_block *, struct kqid, struct fs_disk_quota *); | ||
3689 | - int (*set_dqblk)(struct super_block *, struct kqid, struct fs_disk_quota *); | ||
3690 | + int (*get_dqblk)(struct super_block *, struct kqid, struct qc_dqblk *); | ||
3691 | + int (*set_dqblk)(struct super_block *, struct kqid, struct qc_dqblk *); | ||
3692 | int (*get_xstate)(struct super_block *, struct fs_quota_stat *); | ||
3693 | int (*set_xstate)(struct super_block *, unsigned int, int); | ||
3694 | int (*get_xstatev)(struct super_block *, struct fs_quota_statv *); | ||
3695 | diff --git a/include/linux/quotaops.h b/include/linux/quotaops.h | ||
3696 | index 1d3eee594cd6..bfaf7138d5ee 100644 | ||
3697 | --- a/include/linux/quotaops.h | ||
3698 | +++ b/include/linux/quotaops.h | ||
3699 | @@ -98,9 +98,9 @@ int dquot_quota_sync(struct super_block *sb, int type); | ||
3700 | int dquot_get_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii); | ||
3701 | int dquot_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii); | ||
3702 | int dquot_get_dqblk(struct super_block *sb, struct kqid id, | ||
3703 | - struct fs_disk_quota *di); | ||
3704 | + struct qc_dqblk *di); | ||
3705 | int dquot_set_dqblk(struct super_block *sb, struct kqid id, | ||
3706 | - struct fs_disk_quota *di); | ||
3707 | + struct qc_dqblk *di); | ||
3708 | |||
3709 | int __dquot_transfer(struct inode *inode, struct dquot **transfer_to); | ||
3710 | int dquot_transfer(struct inode *inode, struct iattr *iattr); | ||
3711 | diff --git a/mm/gup.c b/mm/gup.c | ||
3712 | index cd62c8c90d4a..a0d57ec05510 100644 | ||
3713 | --- a/mm/gup.c | ||
3714 | +++ b/mm/gup.c | ||
3715 | @@ -296,7 +296,7 @@ static int faultin_page(struct task_struct *tsk, struct vm_area_struct *vma, | ||
3716 | return -ENOMEM; | ||
3717 | if (ret & (VM_FAULT_HWPOISON | VM_FAULT_HWPOISON_LARGE)) | ||
3718 | return *flags & FOLL_HWPOISON ? -EHWPOISON : -EFAULT; | ||
3719 | - if (ret & VM_FAULT_SIGBUS) | ||
3720 | + if (ret & (VM_FAULT_SIGBUS | VM_FAULT_SIGSEGV)) | ||
3721 | return -EFAULT; | ||
3722 | BUG(); | ||
3723 | } | ||
3724 | @@ -571,7 +571,7 @@ int fixup_user_fault(struct task_struct *tsk, struct mm_struct *mm, | ||
3725 | return -ENOMEM; | ||
3726 | if (ret & (VM_FAULT_HWPOISON | VM_FAULT_HWPOISON_LARGE)) | ||
3727 | return -EHWPOISON; | ||
3728 | - if (ret & VM_FAULT_SIGBUS) | ||
3729 | + if (ret & (VM_FAULT_SIGBUS | VM_FAULT_SIGSEGV)) | ||
3730 | return -EFAULT; | ||
3731 | BUG(); | ||
3732 | } | ||
3733 | diff --git a/mm/ksm.c b/mm/ksm.c | ||
3734 | index 6b2e337bc03c..a0ed043a1096 100644 | ||
3735 | --- a/mm/ksm.c | ||
3736 | +++ b/mm/ksm.c | ||
3737 | @@ -376,7 +376,7 @@ static int break_ksm(struct vm_area_struct *vma, unsigned long addr) | ||
3738 | else | ||
3739 | ret = VM_FAULT_WRITE; | ||
3740 | put_page(page); | ||
3741 | - } while (!(ret & (VM_FAULT_WRITE | VM_FAULT_SIGBUS | VM_FAULT_OOM))); | ||
3742 | + } while (!(ret & (VM_FAULT_WRITE | VM_FAULT_SIGBUS | VM_FAULT_SIGSEGV | VM_FAULT_OOM))); | ||
3743 | /* | ||
3744 | * We must loop because handle_mm_fault() may back out if there's | ||
3745 | * any difficulty e.g. if pte accessed bit gets updated concurrently. | ||
3746 | diff --git a/mm/memcontrol.c b/mm/memcontrol.c | ||
3747 | index d6ac0e33e150..4918b6eefae2 100644 | ||
3748 | --- a/mm/memcontrol.c | ||
3749 | +++ b/mm/memcontrol.c | ||
3750 | @@ -1638,9 +1638,9 @@ void mem_cgroup_print_oom_info(struct mem_cgroup *memcg, struct task_struct *p) | ||
3751 | |||
3752 | pr_info("Task in "); | ||
3753 | pr_cont_cgroup_path(task_cgroup(p, memory_cgrp_id)); | ||
3754 | - pr_info(" killed as a result of limit of "); | ||
3755 | + pr_cont(" killed as a result of limit of "); | ||
3756 | pr_cont_cgroup_path(memcg->css.cgroup); | ||
3757 | - pr_info("\n"); | ||
3758 | + pr_cont("\n"); | ||
3759 | |||
3760 | rcu_read_unlock(); | ||
3761 | |||
3762 | diff --git a/mm/memory.c b/mm/memory.c | ||
3763 | index 7f86cf6252bd..d442584fd281 100644 | ||
3764 | --- a/mm/memory.c | ||
3765 | +++ b/mm/memory.c | ||
3766 | @@ -2645,7 +2645,7 @@ static int do_anonymous_page(struct mm_struct *mm, struct vm_area_struct *vma, | ||
3767 | |||
3768 | /* Check if we need to add a guard page to the stack */ | ||
3769 | if (check_stack_guard_page(vma, address) < 0) | ||
3770 | - return VM_FAULT_SIGBUS; | ||
3771 | + return VM_FAULT_SIGSEGV; | ||
3772 | |||
3773 | /* Use the zero-page for reads */ | ||
3774 | if (!(flags & FAULT_FLAG_WRITE)) { | ||
3775 | diff --git a/net/mac80211/pm.c b/net/mac80211/pm.c | ||
3776 | index 4c5192e0d66c..4a95fe3cffbc 100644 | ||
3777 | --- a/net/mac80211/pm.c | ||
3778 | +++ b/net/mac80211/pm.c | ||
3779 | @@ -86,20 +86,6 @@ int __ieee80211_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan) | ||
3780 | } | ||
3781 | } | ||
3782 | |||
3783 | - /* tear down aggregation sessions and remove STAs */ | ||
3784 | - mutex_lock(&local->sta_mtx); | ||
3785 | - list_for_each_entry(sta, &local->sta_list, list) { | ||
3786 | - if (sta->uploaded) { | ||
3787 | - enum ieee80211_sta_state state; | ||
3788 | - | ||
3789 | - state = sta->sta_state; | ||
3790 | - for (; state > IEEE80211_STA_NOTEXIST; state--) | ||
3791 | - WARN_ON(drv_sta_state(local, sta->sdata, sta, | ||
3792 | - state, state - 1)); | ||
3793 | - } | ||
3794 | - } | ||
3795 | - mutex_unlock(&local->sta_mtx); | ||
3796 | - | ||
3797 | /* remove all interfaces that were created in the driver */ | ||
3798 | list_for_each_entry(sdata, &local->interfaces, list) { | ||
3799 | if (!ieee80211_sdata_running(sdata)) | ||
3800 | @@ -111,6 +97,21 @@ int __ieee80211_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan) | ||
3801 | case NL80211_IFTYPE_STATION: | ||
3802 | ieee80211_mgd_quiesce(sdata); | ||
3803 | break; | ||
3804 | + case NL80211_IFTYPE_WDS: | ||
3805 | + /* tear down aggregation sessions and remove STAs */ | ||
3806 | + mutex_lock(&local->sta_mtx); | ||
3807 | + sta = sdata->u.wds.sta; | ||
3808 | + if (sta && sta->uploaded) { | ||
3809 | + enum ieee80211_sta_state state; | ||
3810 | + | ||
3811 | + state = sta->sta_state; | ||
3812 | + for (; state > IEEE80211_STA_NOTEXIST; state--) | ||
3813 | + WARN_ON(drv_sta_state(local, sta->sdata, | ||
3814 | + sta, state, | ||
3815 | + state - 1)); | ||
3816 | + } | ||
3817 | + mutex_unlock(&local->sta_mtx); | ||
3818 | + break; | ||
3819 | default: | ||
3820 | break; | ||
3821 | } | ||
3822 | diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c | ||
3823 | index e60da9a062c2..7d6379bd2cb8 100644 | ||
3824 | --- a/net/mac80211/rx.c | ||
3825 | +++ b/net/mac80211/rx.c | ||
3826 | @@ -235,7 +235,7 @@ ieee80211_add_rx_radiotap_header(struct ieee80211_local *local, | ||
3827 | else if (rate && rate->flags & IEEE80211_RATE_ERP_G) | ||
3828 | channel_flags |= IEEE80211_CHAN_OFDM | IEEE80211_CHAN_2GHZ; | ||
3829 | else if (rate) | ||
3830 | - channel_flags |= IEEE80211_CHAN_OFDM | IEEE80211_CHAN_2GHZ; | ||
3831 | + channel_flags |= IEEE80211_CHAN_CCK | IEEE80211_CHAN_2GHZ; | ||
3832 | else | ||
3833 | channel_flags |= IEEE80211_CHAN_2GHZ; | ||
3834 | put_unaligned_le16(channel_flags, pos); | ||
3835 | diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c | ||
3836 | index ea558e07981f..213048ad31c7 100644 | ||
3837 | --- a/net/wireless/nl80211.c | ||
3838 | +++ b/net/wireless/nl80211.c | ||
3839 | @@ -2805,6 +2805,9 @@ static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info) | ||
3840 | if (!rdev->ops->get_key) | ||
3841 | return -EOPNOTSUPP; | ||
3842 | |||
3843 | + if (!pairwise && mac_addr && !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) | ||
3844 | + return -ENOENT; | ||
3845 | + | ||
3846 | msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); | ||
3847 | if (!msg) | ||
3848 | return -ENOMEM; | ||
3849 | @@ -2824,10 +2827,6 @@ static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info) | ||
3850 | nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr)) | ||
3851 | goto nla_put_failure; | ||
3852 | |||
3853 | - if (pairwise && mac_addr && | ||
3854 | - !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) | ||
3855 | - return -ENOENT; | ||
3856 | - | ||
3857 | err = rdev_get_key(rdev, dev, key_idx, pairwise, mac_addr, &cookie, | ||
3858 | get_key_callback); | ||
3859 | |||
3860 | @@ -2998,7 +2997,7 @@ static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info) | ||
3861 | wdev_lock(dev->ieee80211_ptr); | ||
3862 | err = nl80211_key_allowed(dev->ieee80211_ptr); | ||
3863 | |||
3864 | - if (key.type == NL80211_KEYTYPE_PAIRWISE && mac_addr && | ||
3865 | + if (key.type == NL80211_KEYTYPE_GROUP && mac_addr && | ||
3866 | !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) | ||
3867 | err = -ENOENT; | ||
3868 | |||
3869 | diff --git a/sound/core/seq/seq_dummy.c b/sound/core/seq/seq_dummy.c | ||
3870 | index ec667f158f19..5d905d90d504 100644 | ||
3871 | --- a/sound/core/seq/seq_dummy.c | ||
3872 | +++ b/sound/core/seq/seq_dummy.c | ||
3873 | @@ -82,36 +82,6 @@ struct snd_seq_dummy_port { | ||
3874 | static int my_client = -1; | ||
3875 | |||
3876 | /* | ||
3877 | - * unuse callback - send ALL_SOUNDS_OFF and RESET_CONTROLLERS events | ||
3878 | - * to subscribers. | ||
3879 | - * Note: this callback is called only after all subscribers are removed. | ||
3880 | - */ | ||
3881 | -static int | ||
3882 | -dummy_unuse(void *private_data, struct snd_seq_port_subscribe *info) | ||
3883 | -{ | ||
3884 | - struct snd_seq_dummy_port *p; | ||
3885 | - int i; | ||
3886 | - struct snd_seq_event ev; | ||
3887 | - | ||
3888 | - p = private_data; | ||
3889 | - memset(&ev, 0, sizeof(ev)); | ||
3890 | - if (p->duplex) | ||
3891 | - ev.source.port = p->connect; | ||
3892 | - else | ||
3893 | - ev.source.port = p->port; | ||
3894 | - ev.dest.client = SNDRV_SEQ_ADDRESS_SUBSCRIBERS; | ||
3895 | - ev.type = SNDRV_SEQ_EVENT_CONTROLLER; | ||
3896 | - for (i = 0; i < 16; i++) { | ||
3897 | - ev.data.control.channel = i; | ||
3898 | - ev.data.control.param = MIDI_CTL_ALL_SOUNDS_OFF; | ||
3899 | - snd_seq_kernel_client_dispatch(p->client, &ev, 0, 0); | ||
3900 | - ev.data.control.param = MIDI_CTL_RESET_CONTROLLERS; | ||
3901 | - snd_seq_kernel_client_dispatch(p->client, &ev, 0, 0); | ||
3902 | - } | ||
3903 | - return 0; | ||
3904 | -} | ||
3905 | - | ||
3906 | -/* | ||
3907 | * event input callback - just redirect events to subscribers | ||
3908 | */ | ||
3909 | static int | ||
3910 | @@ -175,7 +145,6 @@ create_port(int idx, int type) | ||
3911 | | SNDRV_SEQ_PORT_TYPE_PORT; | ||
3912 | memset(&pcb, 0, sizeof(pcb)); | ||
3913 | pcb.owner = THIS_MODULE; | ||
3914 | - pcb.unuse = dummy_unuse; | ||
3915 | pcb.event_input = dummy_input; | ||
3916 | pcb.private_free = dummy_free; | ||
3917 | pcb.private_data = rec; | ||
3918 | diff --git a/sound/soc/codecs/pcm512x.c b/sound/soc/codecs/pcm512x.c | ||
3919 | index 0c8aefab404c..640c99198cda 100644 | ||
3920 | --- a/sound/soc/codecs/pcm512x.c | ||
3921 | +++ b/sound/soc/codecs/pcm512x.c | ||
3922 | @@ -188,8 +188,8 @@ static const DECLARE_TLV_DB_SCALE(boost_tlv, 0, 80, 0); | ||
3923 | static const char * const pcm512x_dsp_program_texts[] = { | ||
3924 | "FIR interpolation with de-emphasis", | ||
3925 | "Low latency IIR with de-emphasis", | ||
3926 | - "Fixed process flow", | ||
3927 | "High attenuation with de-emphasis", | ||
3928 | + "Fixed process flow", | ||
3929 | "Ringing-less low latency FIR", | ||
3930 | }; | ||
3931 | |||
3932 | diff --git a/sound/soc/codecs/wm8960.c b/sound/soc/codecs/wm8960.c | ||
3933 | index 4dc4e85116cd..641f940c138d 100644 | ||
3934 | --- a/sound/soc/codecs/wm8960.c | ||
3935 | +++ b/sound/soc/codecs/wm8960.c | ||
3936 | @@ -555,7 +555,7 @@ static struct { | ||
3937 | { 22050, 2 }, | ||
3938 | { 24000, 2 }, | ||
3939 | { 16000, 3 }, | ||
3940 | - { 11250, 4 }, | ||
3941 | + { 11025, 4 }, | ||
3942 | { 12000, 4 }, | ||
3943 | { 8000, 5 }, | ||
3944 | }; | ||
3945 | diff --git a/sound/soc/fsl/fsl_esai.h b/sound/soc/fsl/fsl_esai.h | ||
3946 | index 91a550f4a10d..5e793bbb6b02 100644 | ||
3947 | --- a/sound/soc/fsl/fsl_esai.h | ||
3948 | +++ b/sound/soc/fsl/fsl_esai.h | ||
3949 | @@ -302,7 +302,7 @@ | ||
3950 | #define ESAI_xCCR_xFP_MASK (((1 << ESAI_xCCR_xFP_WIDTH) - 1) << ESAI_xCCR_xFP_SHIFT) | ||
3951 | #define ESAI_xCCR_xFP(v) ((((v) - 1) << ESAI_xCCR_xFP_SHIFT) & ESAI_xCCR_xFP_MASK) | ||
3952 | #define ESAI_xCCR_xDC_SHIFT 9 | ||
3953 | -#define ESAI_xCCR_xDC_WIDTH 4 | ||
3954 | +#define ESAI_xCCR_xDC_WIDTH 5 | ||
3955 | #define ESAI_xCCR_xDC_MASK (((1 << ESAI_xCCR_xDC_WIDTH) - 1) << ESAI_xCCR_xDC_SHIFT) | ||
3956 | #define ESAI_xCCR_xDC(v) ((((v) - 1) << ESAI_xCCR_xDC_SHIFT) & ESAI_xCCR_xDC_MASK) | ||
3957 | #define ESAI_xCCR_xPSR_SHIFT 8 | ||
3958 | diff --git a/sound/soc/generic/simple-card.c b/sound/soc/generic/simple-card.c | ||
3959 | index d1b7293c133e..c6a6693bbfc9 100644 | ||
3960 | --- a/sound/soc/generic/simple-card.c | ||
3961 | +++ b/sound/soc/generic/simple-card.c | ||
3962 | @@ -453,9 +453,8 @@ static int asoc_simple_card_parse_of(struct device_node *node, | ||
3963 | } | ||
3964 | |||
3965 | /* Decrease the reference count of the device nodes */ | ||
3966 | -static int asoc_simple_card_unref(struct platform_device *pdev) | ||
3967 | +static int asoc_simple_card_unref(struct snd_soc_card *card) | ||
3968 | { | ||
3969 | - struct snd_soc_card *card = platform_get_drvdata(pdev); | ||
3970 | struct snd_soc_dai_link *dai_link; | ||
3971 | struct device_node *np; | ||
3972 | int num_links; | ||
3973 | @@ -562,7 +561,7 @@ static int asoc_simple_card_probe(struct platform_device *pdev) | ||
3974 | return ret; | ||
3975 | |||
3976 | err: | ||
3977 | - asoc_simple_card_unref(pdev); | ||
3978 | + asoc_simple_card_unref(&priv->snd_card); | ||
3979 | return ret; | ||
3980 | } | ||
3981 | |||
3982 | @@ -578,7 +577,7 @@ static int asoc_simple_card_remove(struct platform_device *pdev) | ||
3983 | snd_soc_jack_free_gpios(&simple_card_mic_jack, 1, | ||
3984 | &simple_card_mic_jack_gpio); | ||
3985 | |||
3986 | - return asoc_simple_card_unref(pdev); | ||
3987 | + return asoc_simple_card_unref(card); | ||
3988 | } | ||
3989 | |||
3990 | static const struct of_device_id asoc_simple_of_match[] = { | ||
3991 | diff --git a/sound/soc/omap/omap-mcbsp.c b/sound/soc/omap/omap-mcbsp.c | ||
3992 | index bd3ef2a88be0..aafc0686ab22 100644 | ||
3993 | --- a/sound/soc/omap/omap-mcbsp.c | ||
3994 | +++ b/sound/soc/omap/omap-mcbsp.c | ||
3995 | @@ -434,7 +434,7 @@ static int omap_mcbsp_dai_set_dai_fmt(struct snd_soc_dai *cpu_dai, | ||
3996 | case SND_SOC_DAIFMT_CBM_CFS: | ||
3997 | /* McBSP slave. FS clock as output */ | ||
3998 | regs->srgr2 |= FSGM; | ||
3999 | - regs->pcr0 |= FSXM; | ||
4000 | + regs->pcr0 |= FSXM | FSRM; | ||
4001 | break; | ||
4002 | case SND_SOC_DAIFMT_CBM_CFM: | ||
4003 | /* McBSP slave */ | ||
4004 | diff --git a/sound/soc/soc-compress.c b/sound/soc/soc-compress.c | ||
4005 | index cecfab3cc948..08e430d664cd 100644 | ||
4006 | --- a/sound/soc/soc-compress.c | ||
4007 | +++ b/sound/soc/soc-compress.c | ||
4008 | @@ -666,7 +666,8 @@ int soc_new_compress(struct snd_soc_pcm_runtime *rtd, int num) | ||
4009 | rtd->dai_link->stream_name); | ||
4010 | |||
4011 | ret = snd_pcm_new_internal(rtd->card->snd_card, new_name, num, | ||
4012 | - 1, 0, &be_pcm); | ||
4013 | + rtd->dai_link->dpcm_playback, | ||
4014 | + rtd->dai_link->dpcm_capture, &be_pcm); | ||
4015 | if (ret < 0) { | ||
4016 | dev_err(rtd->card->dev, "ASoC: can't create compressed for %s\n", | ||
4017 | rtd->dai_link->name); | ||
4018 | @@ -675,8 +676,10 @@ int soc_new_compress(struct snd_soc_pcm_runtime *rtd, int num) | ||
4019 | |||
4020 | rtd->pcm = be_pcm; | ||
4021 | rtd->fe_compr = 1; | ||
4022 | - be_pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream->private_data = rtd; | ||
4023 | - be_pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream->private_data = rtd; | ||
4024 | + if (rtd->dai_link->dpcm_playback) | ||
4025 | + be_pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream->private_data = rtd; | ||
4026 | + else if (rtd->dai_link->dpcm_capture) | ||
4027 | + be_pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream->private_data = rtd; | ||
4028 | memcpy(compr->ops, &soc_compr_dyn_ops, sizeof(soc_compr_dyn_ops)); | ||
4029 | } else | ||
4030 | memcpy(compr->ops, &soc_compr_ops, sizeof(soc_compr_ops)); |