Contents of /trunk/kernel-magellan/patches-4.0/0102-4.0.3-all-fixes.patch
Parent Directory | Revision Log
Revision 2565 -
(show annotations)
(download)
Tue Nov 25 22:54:26 2014 UTC (9 years, 10 months ago) by niro
File size: 101401 byte(s)
Tue Nov 25 22:54:26 2014 UTC (9 years, 10 months ago) by niro
File size: 101401 byte(s)
-linux-4.0.3
1 | diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt |
2 | index bfcb1a62a7b4..4d68ec841304 100644 |
3 | --- a/Documentation/kernel-parameters.txt |
4 | +++ b/Documentation/kernel-parameters.txt |
5 | @@ -3746,6 +3746,8 @@ bytes respectively. Such letter suffixes can also be entirely omitted. |
6 | READ_CAPACITY_16 command); |
7 | f = NO_REPORT_OPCODES (don't use report opcodes |
8 | command, uas only); |
9 | + g = MAX_SECTORS_240 (don't transfer more than |
10 | + 240 sectors at a time, uas only); |
11 | h = CAPACITY_HEURISTICS (decrease the |
12 | reported device capacity by one |
13 | sector if the number is odd); |
14 | diff --git a/Makefile b/Makefile |
15 | index 0649a6011a76..dc9f43a019d6 100644 |
16 | --- a/Makefile |
17 | +++ b/Makefile |
18 | @@ -1,6 +1,6 @@ |
19 | VERSION = 4 |
20 | PATCHLEVEL = 0 |
21 | -SUBLEVEL = 2 |
22 | +SUBLEVEL = 3 |
23 | EXTRAVERSION = |
24 | NAME = Hurr durr I'ma sheep |
25 | |
26 | diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c |
27 | index ef7d112f5ce0..b0bd4e5fd5cf 100644 |
28 | --- a/arch/arm64/mm/dma-mapping.c |
29 | +++ b/arch/arm64/mm/dma-mapping.c |
30 | @@ -67,8 +67,7 @@ static void *__alloc_from_pool(size_t size, struct page **ret_page, gfp_t flags) |
31 | |
32 | *ret_page = phys_to_page(phys); |
33 | ptr = (void *)val; |
34 | - if (flags & __GFP_ZERO) |
35 | - memset(ptr, 0, size); |
36 | + memset(ptr, 0, size); |
37 | } |
38 | |
39 | return ptr; |
40 | @@ -105,7 +104,6 @@ static void *__dma_alloc_coherent(struct device *dev, size_t size, |
41 | struct page *page; |
42 | void *addr; |
43 | |
44 | - size = PAGE_ALIGN(size); |
45 | page = dma_alloc_from_contiguous(dev, size >> PAGE_SHIFT, |
46 | get_order(size)); |
47 | if (!page) |
48 | @@ -113,8 +111,7 @@ static void *__dma_alloc_coherent(struct device *dev, size_t size, |
49 | |
50 | *dma_handle = phys_to_dma(dev, page_to_phys(page)); |
51 | addr = page_address(page); |
52 | - if (flags & __GFP_ZERO) |
53 | - memset(addr, 0, size); |
54 | + memset(addr, 0, size); |
55 | return addr; |
56 | } else { |
57 | return swiotlb_alloc_coherent(dev, size, dma_handle, flags); |
58 | @@ -195,6 +192,8 @@ static void __dma_free(struct device *dev, size_t size, |
59 | { |
60 | void *swiotlb_addr = phys_to_virt(dma_to_phys(dev, dma_handle)); |
61 | |
62 | + size = PAGE_ALIGN(size); |
63 | + |
64 | if (!is_device_dma_coherent(dev)) { |
65 | if (__free_from_pool(vaddr, size)) |
66 | return; |
67 | diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig |
68 | index c7a16904cd03..1a313c468d65 100644 |
69 | --- a/arch/mips/Kconfig |
70 | +++ b/arch/mips/Kconfig |
71 | @@ -2072,7 +2072,7 @@ config MIPSR2_TO_R6_EMULATOR |
72 | help |
73 | Choose this option if you want to run non-R6 MIPS userland code. |
74 | Even if you say 'Y' here, the emulator will still be disabled by |
75 | - default. You can enable it using the 'mipsr2emul' kernel option. |
76 | + default. You can enable it using the 'mipsr2emu' kernel option. |
77 | The only reason this is a build-time option is to save ~14K from the |
78 | final kernel image. |
79 | comment "MIPS R2-to-R6 emulator is only available for UP kernels" |
80 | @@ -2142,7 +2142,7 @@ config MIPS_CMP |
81 | |
82 | config MIPS_CPS |
83 | bool "MIPS Coherent Processing System support" |
84 | - depends on SYS_SUPPORTS_MIPS_CPS |
85 | + depends on SYS_SUPPORTS_MIPS_CPS && !64BIT |
86 | select MIPS_CM |
87 | select MIPS_CPC |
88 | select MIPS_CPS_PM if HOTPLUG_CPU |
89 | diff --git a/arch/mips/Makefile b/arch/mips/Makefile |
90 | index 8f57fc72d62c..1b4dab1e6ab8 100644 |
91 | --- a/arch/mips/Makefile |
92 | +++ b/arch/mips/Makefile |
93 | @@ -197,11 +197,17 @@ endif |
94 | # Warning: the 64-bit MIPS architecture does not support the `smartmips' extension |
95 | # Pass -Wa,--no-warn to disable all assembler warnings until the kernel code has |
96 | # been fixed properly. |
97 | -mips-cflags := "$(cflags-y)" |
98 | -cflags-$(CONFIG_CPU_HAS_SMARTMIPS) += $(call cc-option,$(mips-cflags),-msmartmips) -Wa,--no-warn |
99 | -cflags-$(CONFIG_CPU_MICROMIPS) += $(call cc-option,$(mips-cflags),-mmicromips) |
100 | +mips-cflags := $(cflags-y) |
101 | +ifeq ($(CONFIG_CPU_HAS_SMARTMIPS),y) |
102 | +smartmips-ase := $(call cc-option-yn,$(mips-cflags) -msmartmips) |
103 | +cflags-$(smartmips-ase) += -msmartmips -Wa,--no-warn |
104 | +endif |
105 | +ifeq ($(CONFIG_CPU_MICROMIPS),y) |
106 | +micromips-ase := $(call cc-option-yn,$(mips-cflags) -mmicromips) |
107 | +cflags-$(micromips-ase) += -mmicromips |
108 | +endif |
109 | ifeq ($(CONFIG_CPU_HAS_MSA),y) |
110 | -toolchain-msa := $(call cc-option-yn,-$(mips-cflags),mhard-float -mfp64 -Wa$(comma)-mmsa) |
111 | +toolchain-msa := $(call cc-option-yn,$(mips-cflags) -mhard-float -mfp64 -Wa$(comma)-mmsa) |
112 | cflags-$(toolchain-msa) += -DTOOLCHAIN_SUPPORTS_MSA |
113 | endif |
114 | |
115 | diff --git a/arch/mips/bcm47xx/board.c b/arch/mips/bcm47xx/board.c |
116 | index b3ae068ca4fa..3fd369d74444 100644 |
117 | --- a/arch/mips/bcm47xx/board.c |
118 | +++ b/arch/mips/bcm47xx/board.c |
119 | @@ -247,8 +247,8 @@ static __init const struct bcm47xx_board_type *bcm47xx_board_get_nvram(void) |
120 | } |
121 | |
122 | if (bcm47xx_nvram_getenv("hardware_version", buf1, sizeof(buf1)) >= 0 && |
123 | - bcm47xx_nvram_getenv("boardtype", buf2, sizeof(buf2)) >= 0) { |
124 | - for (e2 = bcm47xx_board_list_boot_hw; e2->value1; e2++) { |
125 | + bcm47xx_nvram_getenv("boardnum", buf2, sizeof(buf2)) >= 0) { |
126 | + for (e2 = bcm47xx_board_list_hw_version_num; e2->value1; e2++) { |
127 | if (!strstarts(buf1, e2->value1) && |
128 | !strcmp(buf2, e2->value2)) |
129 | return &e2->board; |
130 | diff --git a/arch/mips/bcm63xx/prom.c b/arch/mips/bcm63xx/prom.c |
131 | index e1f27d653f60..7019e2967009 100644 |
132 | --- a/arch/mips/bcm63xx/prom.c |
133 | +++ b/arch/mips/bcm63xx/prom.c |
134 | @@ -17,7 +17,6 @@ |
135 | #include <bcm63xx_cpu.h> |
136 | #include <bcm63xx_io.h> |
137 | #include <bcm63xx_regs.h> |
138 | -#include <bcm63xx_gpio.h> |
139 | |
140 | void __init prom_init(void) |
141 | { |
142 | @@ -53,9 +52,6 @@ void __init prom_init(void) |
143 | reg &= ~mask; |
144 | bcm_perf_writel(reg, PERF_CKCTL_REG); |
145 | |
146 | - /* register gpiochip */ |
147 | - bcm63xx_gpio_init(); |
148 | - |
149 | /* do low level board init */ |
150 | board_prom_init(); |
151 | |
152 | diff --git a/arch/mips/bcm63xx/setup.c b/arch/mips/bcm63xx/setup.c |
153 | index 6660c7ddf87b..240fb4ffa55c 100644 |
154 | --- a/arch/mips/bcm63xx/setup.c |
155 | +++ b/arch/mips/bcm63xx/setup.c |
156 | @@ -20,6 +20,7 @@ |
157 | #include <bcm63xx_cpu.h> |
158 | #include <bcm63xx_regs.h> |
159 | #include <bcm63xx_io.h> |
160 | +#include <bcm63xx_gpio.h> |
161 | |
162 | void bcm63xx_machine_halt(void) |
163 | { |
164 | @@ -160,6 +161,9 @@ void __init plat_mem_setup(void) |
165 | |
166 | int __init bcm63xx_register_devices(void) |
167 | { |
168 | + /* register gpiochip */ |
169 | + bcm63xx_gpio_init(); |
170 | + |
171 | return board_register_devices(); |
172 | } |
173 | |
174 | diff --git a/arch/mips/cavium-octeon/dma-octeon.c b/arch/mips/cavium-octeon/dma-octeon.c |
175 | index 7d8987818ccf..d8960d46417b 100644 |
176 | --- a/arch/mips/cavium-octeon/dma-octeon.c |
177 | +++ b/arch/mips/cavium-octeon/dma-octeon.c |
178 | @@ -306,7 +306,7 @@ void __init plat_swiotlb_setup(void) |
179 | swiotlbsize = 64 * (1<<20); |
180 | } |
181 | #endif |
182 | -#ifdef CONFIG_USB_OCTEON_OHCI |
183 | +#ifdef CONFIG_USB_OHCI_HCD_PLATFORM |
184 | /* OCTEON II ohci is only 32-bit. */ |
185 | if (OCTEON_IS_OCTEON2() && max_addr >= 0x100000000ul) |
186 | swiotlbsize = 64 * (1<<20); |
187 | diff --git a/arch/mips/cavium-octeon/setup.c b/arch/mips/cavium-octeon/setup.c |
188 | index a42110e7edbc..a7f40820e567 100644 |
189 | --- a/arch/mips/cavium-octeon/setup.c |
190 | +++ b/arch/mips/cavium-octeon/setup.c |
191 | @@ -413,7 +413,10 @@ static void octeon_restart(char *command) |
192 | |
193 | mb(); |
194 | while (1) |
195 | - cvmx_write_csr(CVMX_CIU_SOFT_RST, 1); |
196 | + if (OCTEON_IS_OCTEON3()) |
197 | + cvmx_write_csr(CVMX_RST_SOFT_RST, 1); |
198 | + else |
199 | + cvmx_write_csr(CVMX_CIU_SOFT_RST, 1); |
200 | } |
201 | |
202 | |
203 | diff --git a/arch/mips/include/asm/cacheflush.h b/arch/mips/include/asm/cacheflush.h |
204 | index e08381a37f8b..723229f4cf27 100644 |
205 | --- a/arch/mips/include/asm/cacheflush.h |
206 | +++ b/arch/mips/include/asm/cacheflush.h |
207 | @@ -29,6 +29,20 @@ |
208 | * - flush_icache_all() flush the entire instruction cache |
209 | * - flush_data_cache_page() flushes a page from the data cache |
210 | */ |
211 | + |
212 | + /* |
213 | + * This flag is used to indicate that the page pointed to by a pte |
214 | + * is dirty and requires cleaning before returning it to the user. |
215 | + */ |
216 | +#define PG_dcache_dirty PG_arch_1 |
217 | + |
218 | +#define Page_dcache_dirty(page) \ |
219 | + test_bit(PG_dcache_dirty, &(page)->flags) |
220 | +#define SetPageDcacheDirty(page) \ |
221 | + set_bit(PG_dcache_dirty, &(page)->flags) |
222 | +#define ClearPageDcacheDirty(page) \ |
223 | + clear_bit(PG_dcache_dirty, &(page)->flags) |
224 | + |
225 | extern void (*flush_cache_all)(void); |
226 | extern void (*__flush_cache_all)(void); |
227 | extern void (*flush_cache_mm)(struct mm_struct *mm); |
228 | @@ -37,13 +51,15 @@ extern void (*flush_cache_range)(struct vm_area_struct *vma, |
229 | unsigned long start, unsigned long end); |
230 | extern void (*flush_cache_page)(struct vm_area_struct *vma, unsigned long page, unsigned long pfn); |
231 | extern void __flush_dcache_page(struct page *page); |
232 | +extern void __flush_icache_page(struct vm_area_struct *vma, struct page *page); |
233 | |
234 | #define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 1 |
235 | static inline void flush_dcache_page(struct page *page) |
236 | { |
237 | - if (cpu_has_dc_aliases || !cpu_has_ic_fills_f_dc) |
238 | + if (cpu_has_dc_aliases) |
239 | __flush_dcache_page(page); |
240 | - |
241 | + else if (!cpu_has_ic_fills_f_dc) |
242 | + SetPageDcacheDirty(page); |
243 | } |
244 | |
245 | #define flush_dcache_mmap_lock(mapping) do { } while (0) |
246 | @@ -61,6 +77,11 @@ static inline void flush_anon_page(struct vm_area_struct *vma, |
247 | static inline void flush_icache_page(struct vm_area_struct *vma, |
248 | struct page *page) |
249 | { |
250 | + if (!cpu_has_ic_fills_f_dc && (vma->vm_flags & VM_EXEC) && |
251 | + Page_dcache_dirty(page)) { |
252 | + __flush_icache_page(vma, page); |
253 | + ClearPageDcacheDirty(page); |
254 | + } |
255 | } |
256 | |
257 | extern void (*flush_icache_range)(unsigned long start, unsigned long end); |
258 | @@ -95,19 +116,6 @@ extern void (*flush_icache_all)(void); |
259 | extern void (*local_flush_data_cache_page)(void * addr); |
260 | extern void (*flush_data_cache_page)(unsigned long addr); |
261 | |
262 | -/* |
263 | - * This flag is used to indicate that the page pointed to by a pte |
264 | - * is dirty and requires cleaning before returning it to the user. |
265 | - */ |
266 | -#define PG_dcache_dirty PG_arch_1 |
267 | - |
268 | -#define Page_dcache_dirty(page) \ |
269 | - test_bit(PG_dcache_dirty, &(page)->flags) |
270 | -#define SetPageDcacheDirty(page) \ |
271 | - set_bit(PG_dcache_dirty, &(page)->flags) |
272 | -#define ClearPageDcacheDirty(page) \ |
273 | - clear_bit(PG_dcache_dirty, &(page)->flags) |
274 | - |
275 | /* Run kernel code uncached, useful for cache probing functions. */ |
276 | unsigned long run_uncached(void *func); |
277 | |
278 | diff --git a/arch/mips/include/asm/cpu-features.h b/arch/mips/include/asm/cpu-features.h |
279 | index 0d8208de9a3f..345fd7f80730 100644 |
280 | --- a/arch/mips/include/asm/cpu-features.h |
281 | +++ b/arch/mips/include/asm/cpu-features.h |
282 | @@ -235,8 +235,39 @@ |
283 | /* MIPSR2 and MIPSR6 have a lot of similarities */ |
284 | #define cpu_has_mips_r2_r6 (cpu_has_mips_r2 | cpu_has_mips_r6) |
285 | |
286 | +/* |
287 | + * cpu_has_mips_r2_exec_hazard - return if IHB is required on current processor |
288 | + * |
289 | + * Returns non-zero value if the current processor implementation requires |
290 | + * an IHB instruction to deal with an instruction hazard as per MIPS R2 |
291 | + * architecture specification, zero otherwise. |
292 | + */ |
293 | #ifndef cpu_has_mips_r2_exec_hazard |
294 | -#define cpu_has_mips_r2_exec_hazard (cpu_has_mips_r2 | cpu_has_mips_r6) |
295 | +#define cpu_has_mips_r2_exec_hazard \ |
296 | +({ \ |
297 | + int __res; \ |
298 | + \ |
299 | + switch (current_cpu_type()) { \ |
300 | + case CPU_M14KC: \ |
301 | + case CPU_74K: \ |
302 | + case CPU_1074K: \ |
303 | + case CPU_PROAPTIV: \ |
304 | + case CPU_P5600: \ |
305 | + case CPU_M5150: \ |
306 | + case CPU_QEMU_GENERIC: \ |
307 | + case CPU_CAVIUM_OCTEON: \ |
308 | + case CPU_CAVIUM_OCTEON_PLUS: \ |
309 | + case CPU_CAVIUM_OCTEON2: \ |
310 | + case CPU_CAVIUM_OCTEON3: \ |
311 | + __res = 0; \ |
312 | + break; \ |
313 | + \ |
314 | + default: \ |
315 | + __res = 1; \ |
316 | + } \ |
317 | + \ |
318 | + __res; \ |
319 | +}) |
320 | #endif |
321 | |
322 | /* |
323 | diff --git a/arch/mips/include/asm/elf.h b/arch/mips/include/asm/elf.h |
324 | index 535f196ffe02..694925a26924 100644 |
325 | --- a/arch/mips/include/asm/elf.h |
326 | +++ b/arch/mips/include/asm/elf.h |
327 | @@ -294,6 +294,9 @@ do { \ |
328 | if (personality(current->personality) != PER_LINUX) \ |
329 | set_personality(PER_LINUX); \ |
330 | \ |
331 | + clear_thread_flag(TIF_HYBRID_FPREGS); \ |
332 | + set_thread_flag(TIF_32BIT_FPREGS); \ |
333 | + \ |
334 | mips_set_personality_fp(state); \ |
335 | \ |
336 | current->thread.abi = &mips_abi; \ |
337 | @@ -319,6 +322,8 @@ do { \ |
338 | do { \ |
339 | set_thread_flag(TIF_32BIT_REGS); \ |
340 | set_thread_flag(TIF_32BIT_ADDR); \ |
341 | + clear_thread_flag(TIF_HYBRID_FPREGS); \ |
342 | + set_thread_flag(TIF_32BIT_FPREGS); \ |
343 | \ |
344 | mips_set_personality_fp(state); \ |
345 | \ |
346 | diff --git a/arch/mips/include/asm/mach-cavium-octeon/cpu-feature-overrides.h b/arch/mips/include/asm/mach-cavium-octeon/cpu-feature-overrides.h |
347 | index fa1f3cfbae8d..d68e685cde60 100644 |
348 | --- a/arch/mips/include/asm/mach-cavium-octeon/cpu-feature-overrides.h |
349 | +++ b/arch/mips/include/asm/mach-cavium-octeon/cpu-feature-overrides.h |
350 | @@ -50,7 +50,6 @@ |
351 | #define cpu_has_mips32r2 0 |
352 | #define cpu_has_mips64r1 0 |
353 | #define cpu_has_mips64r2 1 |
354 | -#define cpu_has_mips_r2_exec_hazard 0 |
355 | #define cpu_has_dsp 0 |
356 | #define cpu_has_dsp2 0 |
357 | #define cpu_has_mipsmt 0 |
358 | diff --git a/arch/mips/include/asm/octeon/cvmx.h b/arch/mips/include/asm/octeon/cvmx.h |
359 | index 33db1c806b01..774bb45834cb 100644 |
360 | --- a/arch/mips/include/asm/octeon/cvmx.h |
361 | +++ b/arch/mips/include/asm/octeon/cvmx.h |
362 | @@ -436,14 +436,6 @@ static inline uint64_t cvmx_get_cycle_global(void) |
363 | |
364 | /***************************************************************************/ |
365 | |
366 | -static inline void cvmx_reset_octeon(void) |
367 | -{ |
368 | - union cvmx_ciu_soft_rst ciu_soft_rst; |
369 | - ciu_soft_rst.u64 = 0; |
370 | - ciu_soft_rst.s.soft_rst = 1; |
371 | - cvmx_write_csr(CVMX_CIU_SOFT_RST, ciu_soft_rst.u64); |
372 | -} |
373 | - |
374 | /* Return the number of cores available in the chip */ |
375 | static inline uint32_t cvmx_octeon_num_cores(void) |
376 | { |
377 | diff --git a/arch/mips/include/asm/octeon/pci-octeon.h b/arch/mips/include/asm/octeon/pci-octeon.h |
378 | index 64ba56a02843..1884609741a8 100644 |
379 | --- a/arch/mips/include/asm/octeon/pci-octeon.h |
380 | +++ b/arch/mips/include/asm/octeon/pci-octeon.h |
381 | @@ -11,9 +11,6 @@ |
382 | |
383 | #include <linux/pci.h> |
384 | |
385 | -/* Some PCI cards require delays when accessing config space. */ |
386 | -#define PCI_CONFIG_SPACE_DELAY 10000 |
387 | - |
388 | /* |
389 | * The physical memory base mapped by BAR1. 256MB at the end of the |
390 | * first 4GB. |
391 | diff --git a/arch/mips/include/asm/pgtable.h b/arch/mips/include/asm/pgtable.h |
392 | index bef782c4a44b..f8f809fd6c6d 100644 |
393 | --- a/arch/mips/include/asm/pgtable.h |
394 | +++ b/arch/mips/include/asm/pgtable.h |
395 | @@ -127,10 +127,6 @@ do { \ |
396 | } \ |
397 | } while(0) |
398 | |
399 | - |
400 | -extern void set_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, |
401 | - pte_t pteval); |
402 | - |
403 | #if defined(CONFIG_PHYS_ADDR_T_64BIT) && defined(CONFIG_CPU_MIPS32) |
404 | |
405 | #define pte_none(pte) (!(((pte).pte_low | (pte).pte_high) & ~_PAGE_GLOBAL)) |
406 | @@ -154,6 +150,7 @@ static inline void set_pte(pte_t *ptep, pte_t pte) |
407 | } |
408 | } |
409 | } |
410 | +#define set_pte_at(mm, addr, ptep, pteval) set_pte(ptep, pteval) |
411 | |
412 | static inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep) |
413 | { |
414 | @@ -192,6 +189,7 @@ static inline void set_pte(pte_t *ptep, pte_t pteval) |
415 | } |
416 | #endif |
417 | } |
418 | +#define set_pte_at(mm, addr, ptep, pteval) set_pte(ptep, pteval) |
419 | |
420 | static inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep) |
421 | { |
422 | @@ -407,12 +405,15 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) |
423 | |
424 | extern void __update_tlb(struct vm_area_struct *vma, unsigned long address, |
425 | pte_t pte); |
426 | +extern void __update_cache(struct vm_area_struct *vma, unsigned long address, |
427 | + pte_t pte); |
428 | |
429 | static inline void update_mmu_cache(struct vm_area_struct *vma, |
430 | unsigned long address, pte_t *ptep) |
431 | { |
432 | pte_t pte = *ptep; |
433 | __update_tlb(vma, address, pte); |
434 | + __update_cache(vma, address, pte); |
435 | } |
436 | |
437 | static inline void update_mmu_cache_pmd(struct vm_area_struct *vma, |
438 | diff --git a/arch/mips/include/asm/r4kcache.h b/arch/mips/include/asm/r4kcache.h |
439 | index 1b22d2da88a1..38902bf97adc 100644 |
440 | --- a/arch/mips/include/asm/r4kcache.h |
441 | +++ b/arch/mips/include/asm/r4kcache.h |
442 | @@ -12,6 +12,8 @@ |
443 | #ifndef _ASM_R4KCACHE_H |
444 | #define _ASM_R4KCACHE_H |
445 | |
446 | +#include <linux/stringify.h> |
447 | + |
448 | #include <asm/asm.h> |
449 | #include <asm/cacheops.h> |
450 | #include <asm/compiler.h> |
451 | @@ -344,7 +346,7 @@ static inline void invalidate_tcache_page(unsigned long addr) |
452 | " cache %1, 0x0a0(%0); cache %1, 0x0b0(%0)\n" \ |
453 | " cache %1, 0x0c0(%0); cache %1, 0x0d0(%0)\n" \ |
454 | " cache %1, 0x0e0(%0); cache %1, 0x0f0(%0)\n" \ |
455 | - " addiu $1, $0, 0x100 \n" \ |
456 | + " "__stringify(LONG_ADDIU)" $1, %0, 0x100 \n" \ |
457 | " cache %1, 0x000($1); cache %1, 0x010($1)\n" \ |
458 | " cache %1, 0x020($1); cache %1, 0x030($1)\n" \ |
459 | " cache %1, 0x040($1); cache %1, 0x050($1)\n" \ |
460 | @@ -368,17 +370,17 @@ static inline void invalidate_tcache_page(unsigned long addr) |
461 | " cache %1, 0x040(%0); cache %1, 0x060(%0)\n" \ |
462 | " cache %1, 0x080(%0); cache %1, 0x0a0(%0)\n" \ |
463 | " cache %1, 0x0c0(%0); cache %1, 0x0e0(%0)\n" \ |
464 | - " addiu $1, %0, 0x100\n" \ |
465 | + " "__stringify(LONG_ADDIU)" $1, %0, 0x100 \n" \ |
466 | " cache %1, 0x000($1); cache %1, 0x020($1)\n" \ |
467 | " cache %1, 0x040($1); cache %1, 0x060($1)\n" \ |
468 | " cache %1, 0x080($1); cache %1, 0x0a0($1)\n" \ |
469 | " cache %1, 0x0c0($1); cache %1, 0x0e0($1)\n" \ |
470 | - " addiu $1, $1, 0x100\n" \ |
471 | + " "__stringify(LONG_ADDIU)" $1, $1, 0x100 \n" \ |
472 | " cache %1, 0x000($1); cache %1, 0x020($1)\n" \ |
473 | " cache %1, 0x040($1); cache %1, 0x060($1)\n" \ |
474 | " cache %1, 0x080($1); cache %1, 0x0a0($1)\n" \ |
475 | " cache %1, 0x0c0($1); cache %1, 0x0e0($1)\n" \ |
476 | - " addiu $1, $1, 0x100\n" \ |
477 | + " "__stringify(LONG_ADDIU)" $1, $1, 0x100\n" \ |
478 | " cache %1, 0x000($1); cache %1, 0x020($1)\n" \ |
479 | " cache %1, 0x040($1); cache %1, 0x060($1)\n" \ |
480 | " cache %1, 0x080($1); cache %1, 0x0a0($1)\n" \ |
481 | @@ -396,25 +398,25 @@ static inline void invalidate_tcache_page(unsigned long addr) |
482 | " .set noat\n" \ |
483 | " cache %1, 0x000(%0); cache %1, 0x040(%0)\n" \ |
484 | " cache %1, 0x080(%0); cache %1, 0x0c0(%0)\n" \ |
485 | - " addiu $1, %0, 0x100\n" \ |
486 | + " "__stringify(LONG_ADDIU)" $1, %0, 0x100 \n" \ |
487 | " cache %1, 0x000($1); cache %1, 0x040($1)\n" \ |
488 | " cache %1, 0x080($1); cache %1, 0x0c0($1)\n" \ |
489 | - " addiu $1, %0, 0x100\n" \ |
490 | + " "__stringify(LONG_ADDIU)" $1, $1, 0x100 \n" \ |
491 | " cache %1, 0x000($1); cache %1, 0x040($1)\n" \ |
492 | " cache %1, 0x080($1); cache %1, 0x0c0($1)\n" \ |
493 | - " addiu $1, %0, 0x100\n" \ |
494 | + " "__stringify(LONG_ADDIU)" $1, $1, 0x100 \n" \ |
495 | " cache %1, 0x000($1); cache %1, 0x040($1)\n" \ |
496 | " cache %1, 0x080($1); cache %1, 0x0c0($1)\n" \ |
497 | - " addiu $1, %0, 0x100\n" \ |
498 | + " "__stringify(LONG_ADDIU)" $1, $1, 0x100 \n" \ |
499 | " cache %1, 0x000($1); cache %1, 0x040($1)\n" \ |
500 | " cache %1, 0x080($1); cache %1, 0x0c0($1)\n" \ |
501 | - " addiu $1, %0, 0x100\n" \ |
502 | + " "__stringify(LONG_ADDIU)" $1, $1, 0x100 \n" \ |
503 | " cache %1, 0x000($1); cache %1, 0x040($1)\n" \ |
504 | " cache %1, 0x080($1); cache %1, 0x0c0($1)\n" \ |
505 | - " addiu $1, %0, 0x100\n" \ |
506 | + " "__stringify(LONG_ADDIU)" $1, $1, 0x100 \n" \ |
507 | " cache %1, 0x000($1); cache %1, 0x040($1)\n" \ |
508 | " cache %1, 0x080($1); cache %1, 0x0c0($1)\n" \ |
509 | - " addiu $1, %0, 0x100\n" \ |
510 | + " "__stringify(LONG_ADDIU)" $1, $1, 0x100 \n" \ |
511 | " cache %1, 0x000($1); cache %1, 0x040($1)\n" \ |
512 | " cache %1, 0x080($1); cache %1, 0x0c0($1)\n" \ |
513 | " .set pop\n" \ |
514 | @@ -429,39 +431,38 @@ static inline void invalidate_tcache_page(unsigned long addr) |
515 | " .set mips64r6\n" \ |
516 | " .set noat\n" \ |
517 | " cache %1, 0x000(%0); cache %1, 0x080(%0)\n" \ |
518 | - " addiu $1, %0, 0x100\n" \ |
519 | - " cache %1, 0x000(%0); cache %1, 0x080(%0)\n" \ |
520 | - " addiu $1, %0, 0x100\n" \ |
521 | - " cache %1, 0x000(%0); cache %1, 0x080(%0)\n" \ |
522 | - " addiu $1, %0, 0x100\n" \ |
523 | - " cache %1, 0x000(%0); cache %1, 0x080(%0)\n" \ |
524 | - " addiu $1, %0, 0x100\n" \ |
525 | - " cache %1, 0x000(%0); cache %1, 0x080(%0)\n" \ |
526 | - " addiu $1, %0, 0x100\n" \ |
527 | - " cache %1, 0x000(%0); cache %1, 0x080(%0)\n" \ |
528 | - " addiu $1, %0, 0x100\n" \ |
529 | - " cache %1, 0x000(%0); cache %1, 0x080(%0)\n" \ |
530 | - " addiu $1, %0, 0x100\n" \ |
531 | - " cache %1, 0x000(%0); cache %1, 0x080(%0)\n" \ |
532 | - " addiu $1, %0, 0x100\n" \ |
533 | - " cache %1, 0x000(%0); cache %1, 0x080(%0)\n" \ |
534 | - " addiu $1, %0, 0x100\n" \ |
535 | - " cache %1, 0x000(%0); cache %1, 0x080(%0)\n" \ |
536 | - " addiu $1, %0, 0x100\n" \ |
537 | - " cache %1, 0x000(%0); cache %1, 0x080(%0)\n" \ |
538 | - " addiu $1, %0, 0x100\n" \ |
539 | - " cache %1, 0x000(%0); cache %1, 0x080(%0)\n" \ |
540 | - " addiu $1, %0, 0x100\n" \ |
541 | - " cache %1, 0x000(%0); cache %1, 0x080(%0)\n" \ |
542 | - " addiu $1, %0, 0x100\n" \ |
543 | - " cache %1, 0x000(%0); cache %1, 0x080(%0)\n" \ |
544 | - " addiu $1, %0, 0x100\n" \ |
545 | - " cache %1, 0x000(%0); cache %1, 0x080(%0)\n" \ |
546 | - " addiu $1, %0, 0x100\n" \ |
547 | - " cache %1, 0x000(%0); cache %1, 0x080(%0)\n" \ |
548 | - " addiu $1, %0, 0x100\n" \ |
549 | - " cache %1, 0x000(%0); cache %1, 0x080(%0)\n" \ |
550 | - " addiu $1, %0, 0x100\n" \ |
551 | + " "__stringify(LONG_ADDIU)" $1, %0, 0x100 \n" \ |
552 | + " cache %1, 0x000($1); cache %1, 0x080($1)\n" \ |
553 | + " "__stringify(LONG_ADDIU)" $1, $1, 0x100 \n" \ |
554 | + " cache %1, 0x000($1); cache %1, 0x080($1)\n" \ |
555 | + " "__stringify(LONG_ADDIU)" $1, $1, 0x100 \n" \ |
556 | + " cache %1, 0x000($1); cache %1, 0x080($1)\n" \ |
557 | + " "__stringify(LONG_ADDIU)" $1, $1, 0x100 \n" \ |
558 | + " cache %1, 0x000($1); cache %1, 0x080($1)\n" \ |
559 | + " "__stringify(LONG_ADDIU)" $1, $1, 0x100 \n" \ |
560 | + " cache %1, 0x000($1); cache %1, 0x080($1)\n" \ |
561 | + " "__stringify(LONG_ADDIU)" $1, $1, 0x100 \n" \ |
562 | + " cache %1, 0x000($1); cache %1, 0x080($1)\n" \ |
563 | + " "__stringify(LONG_ADDIU)" $1, $1, 0x100 \n" \ |
564 | + " cache %1, 0x000($1); cache %1, 0x080($1)\n" \ |
565 | + " "__stringify(LONG_ADDIU)" $1, $1, 0x100 \n" \ |
566 | + " cache %1, 0x000($1); cache %1, 0x080($1)\n" \ |
567 | + " "__stringify(LONG_ADDIU)" $1, $1, 0x100 \n" \ |
568 | + " cache %1, 0x000($1); cache %1, 0x080($1)\n" \ |
569 | + " "__stringify(LONG_ADDIU)" $1, $1, 0x100 \n" \ |
570 | + " cache %1, 0x000($1); cache %1, 0x080($1)\n" \ |
571 | + " "__stringify(LONG_ADDIU)" $1, $1, 0x100 \n" \ |
572 | + " cache %1, 0x000($1); cache %1, 0x080($1)\n" \ |
573 | + " "__stringify(LONG_ADDIU)" $1, $1, 0x100 \n" \ |
574 | + " cache %1, 0x000($1); cache %1, 0x080($1)\n" \ |
575 | + " "__stringify(LONG_ADDIU)" $1, $1, 0x100 \n" \ |
576 | + " cache %1, 0x000($1); cache %1, 0x080($1)\n" \ |
577 | + " "__stringify(LONG_ADDIU)" $1, $1, 0x100 \n" \ |
578 | + " cache %1, 0x000($1); cache %1, 0x080($1)\n" \ |
579 | + " "__stringify(LONG_ADDIU)" $1, $1, 0x100 \n" \ |
580 | + " cache %1, 0x000($1); cache %1, 0x080($1)\n" \ |
581 | + " "__stringify(LONG_ADDIU)" $1, $1, 0x100 \n" \ |
582 | + " cache %1, 0x000($1); cache %1, 0x080($1)\n" \ |
583 | " .set pop\n" \ |
584 | : \ |
585 | : "r" (base), \ |
586 | diff --git a/arch/mips/include/asm/spinlock.h b/arch/mips/include/asm/spinlock.h |
587 | index b4548690ade9..1fca2e0793dc 100644 |
588 | --- a/arch/mips/include/asm/spinlock.h |
589 | +++ b/arch/mips/include/asm/spinlock.h |
590 | @@ -263,7 +263,7 @@ static inline void arch_read_unlock(arch_rwlock_t *rw) |
591 | if (R10000_LLSC_WAR) { |
592 | __asm__ __volatile__( |
593 | "1: ll %1, %2 # arch_read_unlock \n" |
594 | - " addiu %1, 1 \n" |
595 | + " addiu %1, -1 \n" |
596 | " sc %1, %0 \n" |
597 | " beqzl %1, 1b \n" |
598 | : "=" GCC_OFF_SMALL_ASM() (rw->lock), "=&r" (tmp) |
599 | diff --git a/arch/mips/kernel/entry.S b/arch/mips/kernel/entry.S |
600 | index af41ba6db960..7791840cf22c 100644 |
601 | --- a/arch/mips/kernel/entry.S |
602 | +++ b/arch/mips/kernel/entry.S |
603 | @@ -10,6 +10,7 @@ |
604 | |
605 | #include <asm/asm.h> |
606 | #include <asm/asmmacro.h> |
607 | +#include <asm/compiler.h> |
608 | #include <asm/regdef.h> |
609 | #include <asm/mipsregs.h> |
610 | #include <asm/stackframe.h> |
611 | @@ -185,7 +186,7 @@ syscall_exit_work: |
612 | * For C code use the inline version named instruction_hazard(). |
613 | */ |
614 | LEAF(mips_ihb) |
615 | - .set mips32r2 |
616 | + .set MIPS_ISA_LEVEL_RAW |
617 | jr.hb ra |
618 | nop |
619 | END(mips_ihb) |
620 | diff --git a/arch/mips/kernel/smp-cps.c b/arch/mips/kernel/smp-cps.c |
621 | index bed7590e475f..d5589bedd0a4 100644 |
622 | --- a/arch/mips/kernel/smp-cps.c |
623 | +++ b/arch/mips/kernel/smp-cps.c |
624 | @@ -88,6 +88,12 @@ static void __init cps_smp_setup(void) |
625 | |
626 | /* Make core 0 coherent with everything */ |
627 | write_gcr_cl_coherence(0xff); |
628 | + |
629 | +#ifdef CONFIG_MIPS_MT_FPAFF |
630 | + /* If we have an FPU, enroll ourselves in the FPU-full mask */ |
631 | + if (cpu_has_fpu) |
632 | + cpu_set(0, mt_fpu_cpumask); |
633 | +#endif /* CONFIG_MIPS_MT_FPAFF */ |
634 | } |
635 | |
636 | static void __init cps_prepare_cpus(unsigned int max_cpus) |
637 | diff --git a/arch/mips/mm/cache.c b/arch/mips/mm/cache.c |
638 | index 7e3ea7766822..77d96db8253c 100644 |
639 | --- a/arch/mips/mm/cache.c |
640 | +++ b/arch/mips/mm/cache.c |
641 | @@ -119,36 +119,37 @@ void __flush_anon_page(struct page *page, unsigned long vmaddr) |
642 | |
643 | EXPORT_SYMBOL(__flush_anon_page); |
644 | |
645 | -static void mips_flush_dcache_from_pte(pte_t pteval, unsigned long address) |
646 | +void __flush_icache_page(struct vm_area_struct *vma, struct page *page) |
647 | +{ |
648 | + unsigned long addr; |
649 | + |
650 | + if (PageHighMem(page)) |
651 | + return; |
652 | + |
653 | + addr = (unsigned long) page_address(page); |
654 | + flush_data_cache_page(addr); |
655 | +} |
656 | +EXPORT_SYMBOL_GPL(__flush_icache_page); |
657 | + |
658 | +void __update_cache(struct vm_area_struct *vma, unsigned long address, |
659 | + pte_t pte) |
660 | { |
661 | struct page *page; |
662 | - unsigned long pfn = pte_pfn(pteval); |
663 | + unsigned long pfn, addr; |
664 | + int exec = (vma->vm_flags & VM_EXEC) && !cpu_has_ic_fills_f_dc; |
665 | |
666 | + pfn = pte_pfn(pte); |
667 | if (unlikely(!pfn_valid(pfn))) |
668 | return; |
669 | - |
670 | page = pfn_to_page(pfn); |
671 | if (page_mapping(page) && Page_dcache_dirty(page)) { |
672 | - unsigned long page_addr = (unsigned long) page_address(page); |
673 | - |
674 | - if (!cpu_has_ic_fills_f_dc || |
675 | - pages_do_alias(page_addr, address & PAGE_MASK)) |
676 | - flush_data_cache_page(page_addr); |
677 | + addr = (unsigned long) page_address(page); |
678 | + if (exec || pages_do_alias(addr, address & PAGE_MASK)) |
679 | + flush_data_cache_page(addr); |
680 | ClearPageDcacheDirty(page); |
681 | } |
682 | } |
683 | |
684 | -void set_pte_at(struct mm_struct *mm, unsigned long addr, |
685 | - pte_t *ptep, pte_t pteval) |
686 | -{ |
687 | - if (cpu_has_dc_aliases || !cpu_has_ic_fills_f_dc) { |
688 | - if (pte_present(pteval)) |
689 | - mips_flush_dcache_from_pte(pteval, addr); |
690 | - } |
691 | - |
692 | - set_pte(ptep, pteval); |
693 | -} |
694 | - |
695 | unsigned long _page_cachable_default; |
696 | EXPORT_SYMBOL(_page_cachable_default); |
697 | |
698 | diff --git a/arch/mips/mm/tlbex.c b/arch/mips/mm/tlbex.c |
699 | index d75ff73a2012..a79fd0af0224 100644 |
700 | --- a/arch/mips/mm/tlbex.c |
701 | +++ b/arch/mips/mm/tlbex.c |
702 | @@ -501,26 +501,9 @@ static void build_tlb_write_entry(u32 **p, struct uasm_label **l, |
703 | case tlb_indexed: tlbw = uasm_i_tlbwi; break; |
704 | } |
705 | |
706 | - if (cpu_has_mips_r2_exec_hazard) { |
707 | - /* |
708 | - * The architecture spec says an ehb is required here, |
709 | - * but a number of cores do not have the hazard and |
710 | - * using an ehb causes an expensive pipeline stall. |
711 | - */ |
712 | - switch (current_cpu_type()) { |
713 | - case CPU_M14KC: |
714 | - case CPU_74K: |
715 | - case CPU_1074K: |
716 | - case CPU_PROAPTIV: |
717 | - case CPU_P5600: |
718 | - case CPU_M5150: |
719 | - case CPU_QEMU_GENERIC: |
720 | - break; |
721 | - |
722 | - default: |
723 | + if (cpu_has_mips_r2_r6) { |
724 | + if (cpu_has_mips_r2_exec_hazard) |
725 | uasm_i_ehb(p); |
726 | - break; |
727 | - } |
728 | tlbw(p); |
729 | return; |
730 | } |
731 | diff --git a/arch/mips/netlogic/xlp/ahci-init-xlp2.c b/arch/mips/netlogic/xlp/ahci-init-xlp2.c |
732 | index c83dbf3689e2..7b066a44e679 100644 |
733 | --- a/arch/mips/netlogic/xlp/ahci-init-xlp2.c |
734 | +++ b/arch/mips/netlogic/xlp/ahci-init-xlp2.c |
735 | @@ -203,6 +203,7 @@ static u8 read_phy_reg(u64 regbase, u32 addr, u32 physel) |
736 | static void config_sata_phy(u64 regbase) |
737 | { |
738 | u32 port, i, reg; |
739 | + u8 val; |
740 | |
741 | for (port = 0; port < 2; port++) { |
742 | for (i = 0, reg = RXCDRCALFOSC0; reg <= CALDUTY; reg++, i++) |
743 | @@ -210,6 +211,18 @@ static void config_sata_phy(u64 regbase) |
744 | |
745 | for (i = 0, reg = RXDPIF; reg <= PPMDRIFTMAX_HI; reg++, i++) |
746 | write_phy_reg(regbase, reg, port, sata_phy_config2[i]); |
747 | + |
748 | + /* Fix for PHY link up failures at lower temperatures */ |
749 | + write_phy_reg(regbase, 0x800F, port, 0x1f); |
750 | + |
751 | + val = read_phy_reg(regbase, 0x0029, port); |
752 | + write_phy_reg(regbase, 0x0029, port, val | (0x7 << 1)); |
753 | + |
754 | + val = read_phy_reg(regbase, 0x0056, port); |
755 | + write_phy_reg(regbase, 0x0056, port, val & ~(1 << 3)); |
756 | + |
757 | + val = read_phy_reg(regbase, 0x0018, port); |
758 | + write_phy_reg(regbase, 0x0018, port, val & ~(0x7 << 0)); |
759 | } |
760 | } |
761 | |
762 | diff --git a/arch/mips/pci/Makefile b/arch/mips/pci/Makefile |
763 | index 300591c6278d..2eda01e6e08f 100644 |
764 | --- a/arch/mips/pci/Makefile |
765 | +++ b/arch/mips/pci/Makefile |
766 | @@ -43,7 +43,7 @@ obj-$(CONFIG_SIBYTE_BCM1x80) += pci-bcm1480.o pci-bcm1480ht.o |
767 | obj-$(CONFIG_SNI_RM) += fixup-sni.o ops-sni.o |
768 | obj-$(CONFIG_LANTIQ) += fixup-lantiq.o |
769 | obj-$(CONFIG_PCI_LANTIQ) += pci-lantiq.o ops-lantiq.o |
770 | -obj-$(CONFIG_SOC_RT2880) += pci-rt2880.o |
771 | +obj-$(CONFIG_SOC_RT288X) += pci-rt2880.o |
772 | obj-$(CONFIG_SOC_RT3883) += pci-rt3883.o |
773 | obj-$(CONFIG_TANBAC_TB0219) += fixup-tb0219.o |
774 | obj-$(CONFIG_TANBAC_TB0226) += fixup-tb0226.o |
775 | diff --git a/arch/mips/pci/pci-octeon.c b/arch/mips/pci/pci-octeon.c |
776 | index a04af55d89f1..c258cd406fbb 100644 |
777 | --- a/arch/mips/pci/pci-octeon.c |
778 | +++ b/arch/mips/pci/pci-octeon.c |
779 | @@ -214,6 +214,8 @@ const char *octeon_get_pci_interrupts(void) |
780 | return "AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; |
781 | case CVMX_BOARD_TYPE_BBGW_REF: |
782 | return "AABCD"; |
783 | + case CVMX_BOARD_TYPE_CUST_DSR1000N: |
784 | + return "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"; |
785 | case CVMX_BOARD_TYPE_THUNDER: |
786 | case CVMX_BOARD_TYPE_EBH3000: |
787 | default: |
788 | @@ -271,9 +273,6 @@ static int octeon_read_config(struct pci_bus *bus, unsigned int devfn, |
789 | pci_addr.s.func = devfn & 0x7; |
790 | pci_addr.s.reg = reg; |
791 | |
792 | -#if PCI_CONFIG_SPACE_DELAY |
793 | - udelay(PCI_CONFIG_SPACE_DELAY); |
794 | -#endif |
795 | switch (size) { |
796 | case 4: |
797 | *val = le32_to_cpu(cvmx_read64_uint32(pci_addr.u64)); |
798 | @@ -308,9 +307,6 @@ static int octeon_write_config(struct pci_bus *bus, unsigned int devfn, |
799 | pci_addr.s.func = devfn & 0x7; |
800 | pci_addr.s.reg = reg; |
801 | |
802 | -#if PCI_CONFIG_SPACE_DELAY |
803 | - udelay(PCI_CONFIG_SPACE_DELAY); |
804 | -#endif |
805 | switch (size) { |
806 | case 4: |
807 | cvmx_write64_uint32(pci_addr.u64, cpu_to_le32(val)); |
808 | diff --git a/arch/mips/pci/pcie-octeon.c b/arch/mips/pci/pcie-octeon.c |
809 | index 1bb0b2bf8d6e..99f3db4f0a9b 100644 |
810 | --- a/arch/mips/pci/pcie-octeon.c |
811 | +++ b/arch/mips/pci/pcie-octeon.c |
812 | @@ -1762,14 +1762,6 @@ static int octeon_pcie_write_config(unsigned int pcie_port, struct pci_bus *bus, |
813 | default: |
814 | return PCIBIOS_FUNC_NOT_SUPPORTED; |
815 | } |
816 | -#if PCI_CONFIG_SPACE_DELAY |
817 | - /* |
818 | - * Delay on writes so that devices have time to come up. Some |
819 | - * bridges need this to allow time for the secondary busses to |
820 | - * work |
821 | - */ |
822 | - udelay(PCI_CONFIG_SPACE_DELAY); |
823 | -#endif |
824 | return PCIBIOS_SUCCESSFUL; |
825 | } |
826 | |
827 | diff --git a/arch/mips/ralink/Kconfig b/arch/mips/ralink/Kconfig |
828 | index b1c52ca580f9..e9bc8c96174e 100644 |
829 | --- a/arch/mips/ralink/Kconfig |
830 | +++ b/arch/mips/ralink/Kconfig |
831 | @@ -7,6 +7,11 @@ config CLKEVT_RT3352 |
832 | select CLKSRC_OF |
833 | select CLKSRC_MMIO |
834 | |
835 | +config RALINK_ILL_ACC |
836 | + bool |
837 | + depends on SOC_RT305X |
838 | + default y |
839 | + |
840 | choice |
841 | prompt "Ralink SoC selection" |
842 | default SOC_RT305X |
843 | diff --git a/drivers/acpi/sbs.c b/drivers/acpi/sbs.c |
844 | index a7a3edd28beb..f23179e84128 100644 |
845 | --- a/drivers/acpi/sbs.c |
846 | +++ b/drivers/acpi/sbs.c |
847 | @@ -670,7 +670,7 @@ static int acpi_sbs_add(struct acpi_device *device) |
848 | if (!sbs_manager_broken) { |
849 | result = acpi_manager_get_info(sbs); |
850 | if (!result) { |
851 | - sbs->manager_present = 0; |
852 | + sbs->manager_present = 1; |
853 | for (id = 0; id < MAX_SBS_BAT; ++id) |
854 | if ((sbs->batteries_supported & (1 << id))) |
855 | acpi_battery_add(sbs, id); |
856 | diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c |
857 | index b40af3203089..b67066d0d9a6 100644 |
858 | --- a/drivers/block/rbd.c |
859 | +++ b/drivers/block/rbd.c |
860 | @@ -2264,6 +2264,11 @@ static bool rbd_img_obj_end_request(struct rbd_obj_request *obj_request) |
861 | result, xferred); |
862 | if (!img_request->result) |
863 | img_request->result = result; |
864 | + /* |
865 | + * Need to end I/O on the entire obj_request worth of |
866 | + * bytes in case of error. |
867 | + */ |
868 | + xferred = obj_request->length; |
869 | } |
870 | |
871 | /* Image object requests don't own their page array */ |
872 | diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c |
873 | index 9bd56116fd5a..1afc0b419da2 100644 |
874 | --- a/drivers/gpu/drm/radeon/atombios_crtc.c |
875 | +++ b/drivers/gpu/drm/radeon/atombios_crtc.c |
876 | @@ -580,6 +580,9 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc, |
877 | else |
878 | radeon_crtc->pll_flags |= RADEON_PLL_PREFER_LOW_REF_DIV; |
879 | |
880 | + /* if there is no audio, set MINM_OVER_MAXP */ |
881 | + if (!drm_detect_monitor_audio(radeon_connector_edid(connector))) |
882 | + radeon_crtc->pll_flags |= RADEON_PLL_PREFER_MINM_OVER_MAXP; |
883 | if (rdev->family < CHIP_RV770) |
884 | radeon_crtc->pll_flags |= RADEON_PLL_PREFER_MINM_OVER_MAXP; |
885 | /* use frac fb div on APUs */ |
886 | diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c |
887 | index c39c1d0d9d4e..f20eb32406d1 100644 |
888 | --- a/drivers/gpu/drm/radeon/atombios_encoders.c |
889 | +++ b/drivers/gpu/drm/radeon/atombios_encoders.c |
890 | @@ -1729,17 +1729,15 @@ radeon_atom_encoder_dpms(struct drm_encoder *encoder, int mode) |
891 | struct drm_device *dev = encoder->dev; |
892 | struct radeon_device *rdev = dev->dev_private; |
893 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
894 | - struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); |
895 | int encoder_mode = atombios_get_encoder_mode(encoder); |
896 | |
897 | DRM_DEBUG_KMS("encoder dpms %d to mode %d, devices %08x, active_devices %08x\n", |
898 | radeon_encoder->encoder_id, mode, radeon_encoder->devices, |
899 | radeon_encoder->active_device); |
900 | |
901 | - if (connector && (radeon_audio != 0) && |
902 | + if ((radeon_audio != 0) && |
903 | ((encoder_mode == ATOM_ENCODER_MODE_HDMI) || |
904 | - (ENCODER_MODE_IS_DP(encoder_mode) && |
905 | - drm_detect_monitor_audio(radeon_connector_edid(connector))))) |
906 | + ENCODER_MODE_IS_DP(encoder_mode))) |
907 | radeon_audio_dpms(encoder, mode); |
908 | |
909 | switch (radeon_encoder->encoder_id) { |
910 | diff --git a/drivers/gpu/drm/radeon/dce6_afmt.c b/drivers/gpu/drm/radeon/dce6_afmt.c |
911 | index 3adc2afe32aa..68fd9fc677e3 100644 |
912 | --- a/drivers/gpu/drm/radeon/dce6_afmt.c |
913 | +++ b/drivers/gpu/drm/radeon/dce6_afmt.c |
914 | @@ -295,28 +295,3 @@ void dce6_dp_audio_set_dto(struct radeon_device *rdev, |
915 | WREG32(DCCG_AUDIO_DTO1_MODULE, clock); |
916 | } |
917 | } |
918 | - |
919 | -void dce6_dp_enable(struct drm_encoder *encoder, bool enable) |
920 | -{ |
921 | - struct drm_device *dev = encoder->dev; |
922 | - struct radeon_device *rdev = dev->dev_private; |
923 | - struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
924 | - struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
925 | - |
926 | - if (!dig || !dig->afmt) |
927 | - return; |
928 | - |
929 | - if (enable) { |
930 | - WREG32(EVERGREEN_DP_SEC_TIMESTAMP + dig->afmt->offset, |
931 | - EVERGREEN_DP_SEC_TIMESTAMP_MODE(1)); |
932 | - WREG32(EVERGREEN_DP_SEC_CNTL + dig->afmt->offset, |
933 | - EVERGREEN_DP_SEC_ASP_ENABLE | /* Audio packet transmission */ |
934 | - EVERGREEN_DP_SEC_ATP_ENABLE | /* Audio timestamp packet transmission */ |
935 | - EVERGREEN_DP_SEC_AIP_ENABLE | /* Audio infoframe packet transmission */ |
936 | - EVERGREEN_DP_SEC_STREAM_ENABLE); /* Master enable for secondary stream engine */ |
937 | - } else { |
938 | - WREG32(EVERGREEN_DP_SEC_CNTL + dig->afmt->offset, 0); |
939 | - } |
940 | - |
941 | - dig->afmt->enabled = enable; |
942 | -} |
943 | diff --git a/drivers/gpu/drm/radeon/evergreen_hdmi.c b/drivers/gpu/drm/radeon/evergreen_hdmi.c |
944 | index c18d4ecbd95d..0926739c9fa7 100644 |
945 | --- a/drivers/gpu/drm/radeon/evergreen_hdmi.c |
946 | +++ b/drivers/gpu/drm/radeon/evergreen_hdmi.c |
947 | @@ -219,13 +219,9 @@ void evergreen_set_avi_packet(struct radeon_device *rdev, u32 offset, |
948 | WREG32(AFMT_AVI_INFO3 + offset, |
949 | frame[0xC] | (frame[0xD] << 8) | (buffer[1] << 24)); |
950 | |
951 | - WREG32_OR(HDMI_INFOFRAME_CONTROL0 + offset, |
952 | - HDMI_AVI_INFO_SEND | /* enable AVI info frames */ |
953 | - HDMI_AVI_INFO_CONT); /* required for audio info values to be updated */ |
954 | - |
955 | WREG32_P(HDMI_INFOFRAME_CONTROL1 + offset, |
956 | - HDMI_AVI_INFO_LINE(2), /* anything other than 0 */ |
957 | - ~HDMI_AVI_INFO_LINE_MASK); |
958 | + HDMI_AVI_INFO_LINE(2), /* anything other than 0 */ |
959 | + ~HDMI_AVI_INFO_LINE_MASK); |
960 | } |
961 | |
962 | void dce4_hdmi_audio_set_dto(struct radeon_device *rdev, |
963 | @@ -370,9 +366,13 @@ void dce4_set_audio_packet(struct drm_encoder *encoder, u32 offset) |
964 | WREG32(AFMT_AUDIO_PACKET_CONTROL2 + offset, |
965 | AFMT_AUDIO_CHANNEL_ENABLE(0xff)); |
966 | |
967 | + WREG32(HDMI_AUDIO_PACKET_CONTROL + offset, |
968 | + HDMI_AUDIO_DELAY_EN(1) | /* set the default audio delay */ |
969 | + HDMI_AUDIO_PACKETS_PER_LINE(3)); /* should be suffient for all audio modes and small enough for all hblanks */ |
970 | + |
971 | /* allow 60958 channel status and send audio packets fields to be updated */ |
972 | - WREG32(AFMT_AUDIO_PACKET_CONTROL + offset, |
973 | - AFMT_AUDIO_SAMPLE_SEND | AFMT_RESET_FIFO_WHEN_AUDIO_DIS | AFMT_60958_CS_UPDATE); |
974 | + WREG32_OR(AFMT_AUDIO_PACKET_CONTROL + offset, |
975 | + AFMT_RESET_FIFO_WHEN_AUDIO_DIS | AFMT_60958_CS_UPDATE); |
976 | } |
977 | |
978 | |
979 | @@ -398,17 +398,26 @@ void evergreen_hdmi_enable(struct drm_encoder *encoder, bool enable) |
980 | return; |
981 | |
982 | if (enable) { |
983 | - WREG32(HDMI_INFOFRAME_CONTROL1 + dig->afmt->offset, |
984 | - HDMI_AUDIO_INFO_LINE(2)); /* anything other than 0 */ |
985 | - |
986 | - WREG32(HDMI_AUDIO_PACKET_CONTROL + dig->afmt->offset, |
987 | - HDMI_AUDIO_DELAY_EN(1) | /* set the default audio delay */ |
988 | - HDMI_AUDIO_PACKETS_PER_LINE(3)); /* should be suffient for all audio modes and small enough for all hblanks */ |
989 | + struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); |
990 | |
991 | - WREG32(HDMI_INFOFRAME_CONTROL0 + dig->afmt->offset, |
992 | - HDMI_AUDIO_INFO_SEND | /* enable audio info frames (frames won't be set until audio is enabled) */ |
993 | - HDMI_AUDIO_INFO_CONT); /* required for audio info values to be updated */ |
994 | + if (drm_detect_monitor_audio(radeon_connector_edid(connector))) { |
995 | + WREG32(HDMI_INFOFRAME_CONTROL0 + dig->afmt->offset, |
996 | + HDMI_AVI_INFO_SEND | /* enable AVI info frames */ |
997 | + HDMI_AVI_INFO_CONT | /* required for audio info values to be updated */ |
998 | + HDMI_AUDIO_INFO_SEND | /* enable audio info frames (frames won't be set until audio is enabled) */ |
999 | + HDMI_AUDIO_INFO_CONT); /* required for audio info values to be updated */ |
1000 | + WREG32_OR(AFMT_AUDIO_PACKET_CONTROL + dig->afmt->offset, |
1001 | + AFMT_AUDIO_SAMPLE_SEND); |
1002 | + } else { |
1003 | + WREG32(HDMI_INFOFRAME_CONTROL0 + dig->afmt->offset, |
1004 | + HDMI_AVI_INFO_SEND | /* enable AVI info frames */ |
1005 | + HDMI_AVI_INFO_CONT); /* required for audio info values to be updated */ |
1006 | + WREG32_AND(AFMT_AUDIO_PACKET_CONTROL + dig->afmt->offset, |
1007 | + ~AFMT_AUDIO_SAMPLE_SEND); |
1008 | + } |
1009 | } else { |
1010 | + WREG32_AND(AFMT_AUDIO_PACKET_CONTROL + dig->afmt->offset, |
1011 | + ~AFMT_AUDIO_SAMPLE_SEND); |
1012 | WREG32(HDMI_INFOFRAME_CONTROL0 + dig->afmt->offset, 0); |
1013 | } |
1014 | |
1015 | @@ -424,20 +433,24 @@ void evergreen_dp_enable(struct drm_encoder *encoder, bool enable) |
1016 | struct radeon_device *rdev = dev->dev_private; |
1017 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
1018 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
1019 | + struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); |
1020 | |
1021 | if (!dig || !dig->afmt) |
1022 | return; |
1023 | |
1024 | - if (enable) { |
1025 | + if (enable && drm_detect_monitor_audio(radeon_connector_edid(connector))) { |
1026 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); |
1027 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
1028 | struct radeon_connector_atom_dig *dig_connector; |
1029 | uint32_t val; |
1030 | |
1031 | + WREG32_OR(AFMT_AUDIO_PACKET_CONTROL + dig->afmt->offset, |
1032 | + AFMT_AUDIO_SAMPLE_SEND); |
1033 | + |
1034 | WREG32(EVERGREEN_DP_SEC_TIMESTAMP + dig->afmt->offset, |
1035 | EVERGREEN_DP_SEC_TIMESTAMP_MODE(1)); |
1036 | |
1037 | - if (radeon_connector->con_priv) { |
1038 | + if (!ASIC_IS_DCE6(rdev) && radeon_connector->con_priv) { |
1039 | dig_connector = radeon_connector->con_priv; |
1040 | val = RREG32(EVERGREEN_DP_SEC_AUD_N + dig->afmt->offset); |
1041 | val &= ~EVERGREEN_DP_SEC_N_BASE_MULTIPLE(0xf); |
1042 | @@ -457,6 +470,8 @@ void evergreen_dp_enable(struct drm_encoder *encoder, bool enable) |
1043 | EVERGREEN_DP_SEC_STREAM_ENABLE); /* Master enable for secondary stream engine */ |
1044 | } else { |
1045 | WREG32(EVERGREEN_DP_SEC_CNTL + dig->afmt->offset, 0); |
1046 | + WREG32_AND(AFMT_AUDIO_PACKET_CONTROL + dig->afmt->offset, |
1047 | + ~AFMT_AUDIO_SAMPLE_SEND); |
1048 | } |
1049 | |
1050 | dig->afmt->enabled = enable; |
1051 | diff --git a/drivers/gpu/drm/radeon/r600_hdmi.c b/drivers/gpu/drm/radeon/r600_hdmi.c |
1052 | index dd6606b8e23c..e85894ade95c 100644 |
1053 | --- a/drivers/gpu/drm/radeon/r600_hdmi.c |
1054 | +++ b/drivers/gpu/drm/radeon/r600_hdmi.c |
1055 | @@ -228,12 +228,13 @@ void r600_set_avi_packet(struct radeon_device *rdev, u32 offset, |
1056 | WREG32(HDMI0_AVI_INFO3 + offset, |
1057 | frame[0xC] | (frame[0xD] << 8) | (buffer[1] << 24)); |
1058 | |
1059 | + WREG32_OR(HDMI0_INFOFRAME_CONTROL1 + offset, |
1060 | + HDMI0_AVI_INFO_LINE(2)); /* anything other than 0 */ |
1061 | + |
1062 | WREG32_OR(HDMI0_INFOFRAME_CONTROL0 + offset, |
1063 | - HDMI0_AVI_INFO_SEND | /* enable AVI info frames */ |
1064 | - HDMI0_AVI_INFO_CONT); /* send AVI info frames every frame/field */ |
1065 | + HDMI0_AVI_INFO_SEND | /* enable AVI info frames */ |
1066 | + HDMI0_AVI_INFO_CONT); /* send AVI info frames every frame/field */ |
1067 | |
1068 | - WREG32_OR(HDMI0_INFOFRAME_CONTROL1 + offset, |
1069 | - HDMI0_AVI_INFO_LINE(2)); /* anything other than 0 */ |
1070 | } |
1071 | |
1072 | /* |
1073 | diff --git a/drivers/gpu/drm/radeon/radeon_audio.c b/drivers/gpu/drm/radeon/radeon_audio.c |
1074 | index b21ef69a34ac..b7d33a13db9f 100644 |
1075 | --- a/drivers/gpu/drm/radeon/radeon_audio.c |
1076 | +++ b/drivers/gpu/drm/radeon/radeon_audio.c |
1077 | @@ -102,7 +102,6 @@ static void radeon_audio_dp_mode_set(struct drm_encoder *encoder, |
1078 | void r600_hdmi_enable(struct drm_encoder *encoder, bool enable); |
1079 | void evergreen_hdmi_enable(struct drm_encoder *encoder, bool enable); |
1080 | void evergreen_dp_enable(struct drm_encoder *encoder, bool enable); |
1081 | -void dce6_dp_enable(struct drm_encoder *encoder, bool enable); |
1082 | |
1083 | static const u32 pin_offsets[7] = |
1084 | { |
1085 | @@ -240,7 +239,7 @@ static struct radeon_audio_funcs dce6_dp_funcs = { |
1086 | .set_avi_packet = evergreen_set_avi_packet, |
1087 | .set_audio_packet = dce4_set_audio_packet, |
1088 | .mode_set = radeon_audio_dp_mode_set, |
1089 | - .dpms = dce6_dp_enable, |
1090 | + .dpms = evergreen_dp_enable, |
1091 | }; |
1092 | |
1093 | static void radeon_audio_interface_init(struct radeon_device *rdev) |
1094 | @@ -461,30 +460,33 @@ void radeon_audio_detect(struct drm_connector *connector, |
1095 | if (!connector || !connector->encoder) |
1096 | return; |
1097 | |
1098 | + if (!radeon_encoder_is_digital(connector->encoder)) |
1099 | + return; |
1100 | + |
1101 | rdev = connector->encoder->dev->dev_private; |
1102 | radeon_encoder = to_radeon_encoder(connector->encoder); |
1103 | dig = radeon_encoder->enc_priv; |
1104 | |
1105 | - if (status == connector_status_connected) { |
1106 | - struct radeon_connector *radeon_connector; |
1107 | - int sink_type; |
1108 | - |
1109 | - if (!drm_detect_monitor_audio(radeon_connector_edid(connector))) { |
1110 | - radeon_encoder->audio = NULL; |
1111 | - return; |
1112 | - } |
1113 | + if (!dig->afmt) |
1114 | + return; |
1115 | |
1116 | - radeon_connector = to_radeon_connector(connector); |
1117 | - sink_type = radeon_dp_getsinktype(radeon_connector); |
1118 | + if (status == connector_status_connected) { |
1119 | + struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
1120 | |
1121 | if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort && |
1122 | - sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) |
1123 | + radeon_dp_getsinktype(radeon_connector) == |
1124 | + CONNECTOR_OBJECT_ID_DISPLAYPORT) |
1125 | radeon_encoder->audio = rdev->audio.dp_funcs; |
1126 | else |
1127 | radeon_encoder->audio = rdev->audio.hdmi_funcs; |
1128 | |
1129 | dig->afmt->pin = radeon_audio_get_pin(connector->encoder); |
1130 | - radeon_audio_enable(rdev, dig->afmt->pin, 0xf); |
1131 | + if (drm_detect_monitor_audio(radeon_connector_edid(connector))) { |
1132 | + radeon_audio_enable(rdev, dig->afmt->pin, 0xf); |
1133 | + } else { |
1134 | + radeon_audio_enable(rdev, dig->afmt->pin, 0); |
1135 | + dig->afmt->pin = NULL; |
1136 | + } |
1137 | } else { |
1138 | radeon_audio_enable(rdev, dig->afmt->pin, 0); |
1139 | dig->afmt->pin = NULL; |
1140 | diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c |
1141 | index 27def67cb6be..27973e3faf0e 100644 |
1142 | --- a/drivers/gpu/drm/radeon/radeon_connectors.c |
1143 | +++ b/drivers/gpu/drm/radeon/radeon_connectors.c |
1144 | @@ -1333,8 +1333,10 @@ out: |
1145 | /* updated in get modes as well since we need to know if it's analog or digital */ |
1146 | radeon_connector_update_scratch_regs(connector, ret); |
1147 | |
1148 | - if (radeon_audio != 0) |
1149 | + if (radeon_audio != 0) { |
1150 | + radeon_connector_get_edid(connector); |
1151 | radeon_audio_detect(connector, ret); |
1152 | + } |
1153 | |
1154 | exit: |
1155 | pm_runtime_mark_last_busy(connector->dev->dev); |
1156 | @@ -1659,8 +1661,10 @@ radeon_dp_detect(struct drm_connector *connector, bool force) |
1157 | |
1158 | radeon_connector_update_scratch_regs(connector, ret); |
1159 | |
1160 | - if (radeon_audio != 0) |
1161 | + if (radeon_audio != 0) { |
1162 | + radeon_connector_get_edid(connector); |
1163 | radeon_audio_detect(connector, ret); |
1164 | + } |
1165 | |
1166 | out: |
1167 | pm_runtime_mark_last_busy(connector->dev->dev); |
1168 | diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c |
1169 | index 4d0f96cc3da4..ab39b85e0f76 100644 |
1170 | --- a/drivers/gpu/drm/radeon/radeon_cs.c |
1171 | +++ b/drivers/gpu/drm/radeon/radeon_cs.c |
1172 | @@ -88,7 +88,7 @@ static int radeon_cs_parser_relocs(struct radeon_cs_parser *p) |
1173 | p->dma_reloc_idx = 0; |
1174 | /* FIXME: we assume that each relocs use 4 dwords */ |
1175 | p->nrelocs = chunk->length_dw / 4; |
1176 | - p->relocs = kcalloc(p->nrelocs, sizeof(struct radeon_bo_list), GFP_KERNEL); |
1177 | + p->relocs = drm_calloc_large(p->nrelocs, sizeof(struct radeon_bo_list)); |
1178 | if (p->relocs == NULL) { |
1179 | return -ENOMEM; |
1180 | } |
1181 | @@ -428,7 +428,7 @@ static void radeon_cs_parser_fini(struct radeon_cs_parser *parser, int error, bo |
1182 | } |
1183 | } |
1184 | kfree(parser->track); |
1185 | - kfree(parser->relocs); |
1186 | + drm_free_large(parser->relocs); |
1187 | drm_free_large(parser->vm_bos); |
1188 | for (i = 0; i < parser->nchunks; i++) |
1189 | drm_free_large(parser->chunks[i].kdata); |
1190 | diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c |
1191 | index 2a5a4a9e772d..de42fc4a22b8 100644 |
1192 | --- a/drivers/gpu/drm/radeon/radeon_vm.c |
1193 | +++ b/drivers/gpu/drm/radeon/radeon_vm.c |
1194 | @@ -473,6 +473,23 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev, |
1195 | } |
1196 | |
1197 | mutex_lock(&vm->mutex); |
1198 | + soffset /= RADEON_GPU_PAGE_SIZE; |
1199 | + eoffset /= RADEON_GPU_PAGE_SIZE; |
1200 | + if (soffset || eoffset) { |
1201 | + struct interval_tree_node *it; |
1202 | + it = interval_tree_iter_first(&vm->va, soffset, eoffset - 1); |
1203 | + if (it && it != &bo_va->it) { |
1204 | + struct radeon_bo_va *tmp; |
1205 | + tmp = container_of(it, struct radeon_bo_va, it); |
1206 | + /* bo and tmp overlap, invalid offset */ |
1207 | + dev_err(rdev->dev, "bo %p va 0x%010Lx conflict with " |
1208 | + "(bo %p 0x%010lx 0x%010lx)\n", bo_va->bo, |
1209 | + soffset, tmp->bo, tmp->it.start, tmp->it.last); |
1210 | + mutex_unlock(&vm->mutex); |
1211 | + return -EINVAL; |
1212 | + } |
1213 | + } |
1214 | + |
1215 | if (bo_va->it.start || bo_va->it.last) { |
1216 | if (bo_va->addr) { |
1217 | /* add a clone of the bo_va to clear the old address */ |
1218 | @@ -490,6 +507,8 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev, |
1219 | spin_lock(&vm->status_lock); |
1220 | list_add(&tmp->vm_status, &vm->freed); |
1221 | spin_unlock(&vm->status_lock); |
1222 | + |
1223 | + bo_va->addr = 0; |
1224 | } |
1225 | |
1226 | interval_tree_remove(&bo_va->it, &vm->va); |
1227 | @@ -497,21 +516,7 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev, |
1228 | bo_va->it.last = 0; |
1229 | } |
1230 | |
1231 | - soffset /= RADEON_GPU_PAGE_SIZE; |
1232 | - eoffset /= RADEON_GPU_PAGE_SIZE; |
1233 | if (soffset || eoffset) { |
1234 | - struct interval_tree_node *it; |
1235 | - it = interval_tree_iter_first(&vm->va, soffset, eoffset - 1); |
1236 | - if (it) { |
1237 | - struct radeon_bo_va *tmp; |
1238 | - tmp = container_of(it, struct radeon_bo_va, it); |
1239 | - /* bo and tmp overlap, invalid offset */ |
1240 | - dev_err(rdev->dev, "bo %p va 0x%010Lx conflict with " |
1241 | - "(bo %p 0x%010lx 0x%010lx)\n", bo_va->bo, |
1242 | - soffset, tmp->bo, tmp->it.start, tmp->it.last); |
1243 | - mutex_unlock(&vm->mutex); |
1244 | - return -EINVAL; |
1245 | - } |
1246 | bo_va->it.start = soffset; |
1247 | bo_va->it.last = eoffset - 1; |
1248 | interval_tree_insert(&bo_va->it, &vm->va); |
1249 | @@ -1107,7 +1112,8 @@ void radeon_vm_bo_rmv(struct radeon_device *rdev, |
1250 | list_del(&bo_va->bo_list); |
1251 | |
1252 | mutex_lock(&vm->mutex); |
1253 | - interval_tree_remove(&bo_va->it, &vm->va); |
1254 | + if (bo_va->it.start || bo_va->it.last) |
1255 | + interval_tree_remove(&bo_va->it, &vm->va); |
1256 | spin_lock(&vm->status_lock); |
1257 | list_del(&bo_va->vm_status); |
1258 | |
1259 | diff --git a/drivers/gpu/drm/radeon/si_dpm.c b/drivers/gpu/drm/radeon/si_dpm.c |
1260 | index 7be11651b7e6..9dbb3154d559 100644 |
1261 | --- a/drivers/gpu/drm/radeon/si_dpm.c |
1262 | +++ b/drivers/gpu/drm/radeon/si_dpm.c |
1263 | @@ -2924,6 +2924,7 @@ struct si_dpm_quirk { |
1264 | static struct si_dpm_quirk si_dpm_quirk_list[] = { |
1265 | /* PITCAIRN - https://bugs.freedesktop.org/show_bug.cgi?id=76490 */ |
1266 | { PCI_VENDOR_ID_ATI, 0x6810, 0x1462, 0x3036, 0, 120000 }, |
1267 | + { PCI_VENDOR_ID_ATI, 0x6811, 0x174b, 0xe271, 0, 120000 }, |
1268 | { 0, 0, 0, 0 }, |
1269 | }; |
1270 | |
1271 | diff --git a/drivers/hv/channel_mgmt.c b/drivers/hv/channel_mgmt.c |
1272 | index 3736f71bdec5..18def3022f6e 100644 |
1273 | --- a/drivers/hv/channel_mgmt.c |
1274 | +++ b/drivers/hv/channel_mgmt.c |
1275 | @@ -787,7 +787,7 @@ int vmbus_request_offers(void) |
1276 | { |
1277 | struct vmbus_channel_message_header *msg; |
1278 | struct vmbus_channel_msginfo *msginfo; |
1279 | - int ret, t; |
1280 | + int ret; |
1281 | |
1282 | msginfo = kmalloc(sizeof(*msginfo) + |
1283 | sizeof(struct vmbus_channel_message_header), |
1284 | @@ -795,8 +795,6 @@ int vmbus_request_offers(void) |
1285 | if (!msginfo) |
1286 | return -ENOMEM; |
1287 | |
1288 | - init_completion(&msginfo->waitevent); |
1289 | - |
1290 | msg = (struct vmbus_channel_message_header *)msginfo->msg; |
1291 | |
1292 | msg->msgtype = CHANNELMSG_REQUESTOFFERS; |
1293 | @@ -810,14 +808,6 @@ int vmbus_request_offers(void) |
1294 | goto cleanup; |
1295 | } |
1296 | |
1297 | - t = wait_for_completion_timeout(&msginfo->waitevent, 5*HZ); |
1298 | - if (t == 0) { |
1299 | - ret = -ETIMEDOUT; |
1300 | - goto cleanup; |
1301 | - } |
1302 | - |
1303 | - |
1304 | - |
1305 | cleanup: |
1306 | kfree(msginfo); |
1307 | |
1308 | diff --git a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c |
1309 | index ee394dc68303..ec1ea8ba7aac 100644 |
1310 | --- a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c |
1311 | +++ b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c |
1312 | @@ -492,7 +492,7 @@ int t4_memory_rw(struct adapter *adap, int win, int mtype, u32 addr, |
1313 | memoffset = (mtype * (edc_size * 1024 * 1024)); |
1314 | else { |
1315 | mc_size = EXT_MEM0_SIZE_G(t4_read_reg(adap, |
1316 | - MA_EXT_MEMORY1_BAR_A)); |
1317 | + MA_EXT_MEMORY0_BAR_A)); |
1318 | memoffset = (MEM_MC0 * edc_size + mc_size) * 1024 * 1024; |
1319 | } |
1320 | |
1321 | diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c |
1322 | index 3485acf03014..2f1324bed7b3 100644 |
1323 | --- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c |
1324 | +++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c |
1325 | @@ -1467,6 +1467,7 @@ static void mlx4_en_service_task(struct work_struct *work) |
1326 | if (mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_TS) |
1327 | mlx4_en_ptp_overflow_check(mdev); |
1328 | |
1329 | + mlx4_en_recover_from_oom(priv); |
1330 | queue_delayed_work(mdev->workqueue, &priv->service_task, |
1331 | SERVICE_TASK_DELAY); |
1332 | } |
1333 | diff --git a/drivers/net/ethernet/mellanox/mlx4/en_rx.c b/drivers/net/ethernet/mellanox/mlx4/en_rx.c |
1334 | index 698d60de1255..05ec5e151ded 100644 |
1335 | --- a/drivers/net/ethernet/mellanox/mlx4/en_rx.c |
1336 | +++ b/drivers/net/ethernet/mellanox/mlx4/en_rx.c |
1337 | @@ -244,6 +244,12 @@ static int mlx4_en_prepare_rx_desc(struct mlx4_en_priv *priv, |
1338 | return mlx4_en_alloc_frags(priv, rx_desc, frags, ring->page_alloc, gfp); |
1339 | } |
1340 | |
1341 | +static inline bool mlx4_en_is_ring_empty(struct mlx4_en_rx_ring *ring) |
1342 | +{ |
1343 | + BUG_ON((u32)(ring->prod - ring->cons) > ring->actual_size); |
1344 | + return ring->prod == ring->cons; |
1345 | +} |
1346 | + |
1347 | static inline void mlx4_en_update_rx_prod_db(struct mlx4_en_rx_ring *ring) |
1348 | { |
1349 | *ring->wqres.db.db = cpu_to_be32(ring->prod & 0xffff); |
1350 | @@ -315,8 +321,7 @@ static void mlx4_en_free_rx_buf(struct mlx4_en_priv *priv, |
1351 | ring->cons, ring->prod); |
1352 | |
1353 | /* Unmap and free Rx buffers */ |
1354 | - BUG_ON((u32) (ring->prod - ring->cons) > ring->actual_size); |
1355 | - while (ring->cons != ring->prod) { |
1356 | + while (!mlx4_en_is_ring_empty(ring)) { |
1357 | index = ring->cons & ring->size_mask; |
1358 | en_dbg(DRV, priv, "Processing descriptor:%d\n", index); |
1359 | mlx4_en_free_rx_desc(priv, ring, index); |
1360 | @@ -491,6 +496,23 @@ err_allocator: |
1361 | return err; |
1362 | } |
1363 | |
1364 | +/* We recover from out of memory by scheduling our napi poll |
1365 | + * function (mlx4_en_process_cq), which tries to allocate |
1366 | + * all missing RX buffers (call to mlx4_en_refill_rx_buffers). |
1367 | + */ |
1368 | +void mlx4_en_recover_from_oom(struct mlx4_en_priv *priv) |
1369 | +{ |
1370 | + int ring; |
1371 | + |
1372 | + if (!priv->port_up) |
1373 | + return; |
1374 | + |
1375 | + for (ring = 0; ring < priv->rx_ring_num; ring++) { |
1376 | + if (mlx4_en_is_ring_empty(priv->rx_ring[ring])) |
1377 | + napi_reschedule(&priv->rx_cq[ring]->napi); |
1378 | + } |
1379 | +} |
1380 | + |
1381 | void mlx4_en_destroy_rx_ring(struct mlx4_en_priv *priv, |
1382 | struct mlx4_en_rx_ring **pring, |
1383 | u32 size, u16 stride) |
1384 | diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c |
1385 | index 55f9f5c5344e..8c234ec1d8aa 100644 |
1386 | --- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c |
1387 | +++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c |
1388 | @@ -143,8 +143,10 @@ int mlx4_en_create_tx_ring(struct mlx4_en_priv *priv, |
1389 | ring->hwtstamp_tx_type = priv->hwtstamp_config.tx_type; |
1390 | ring->queue_index = queue_index; |
1391 | |
1392 | - if (queue_index < priv->num_tx_rings_p_up && cpu_online(queue_index)) |
1393 | - cpumask_set_cpu(queue_index, &ring->affinity_mask); |
1394 | + if (queue_index < priv->num_tx_rings_p_up) |
1395 | + cpumask_set_cpu_local_first(queue_index, |
1396 | + priv->mdev->dev->numa_node, |
1397 | + &ring->affinity_mask); |
1398 | |
1399 | *pring = ring; |
1400 | return 0; |
1401 | @@ -213,7 +215,7 @@ int mlx4_en_activate_tx_ring(struct mlx4_en_priv *priv, |
1402 | |
1403 | err = mlx4_qp_to_ready(mdev->dev, &ring->wqres.mtt, &ring->context, |
1404 | &ring->qp, &ring->qp_state); |
1405 | - if (!user_prio && cpu_online(ring->queue_index)) |
1406 | + if (!cpumask_empty(&ring->affinity_mask)) |
1407 | netif_set_xps_queue(priv->dev, &ring->affinity_mask, |
1408 | ring->queue_index); |
1409 | |
1410 | diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h |
1411 | index ebbe244e80dd..8687c8d54227 100644 |
1412 | --- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h |
1413 | +++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h |
1414 | @@ -790,6 +790,7 @@ int mlx4_en_activate_tx_ring(struct mlx4_en_priv *priv, |
1415 | void mlx4_en_deactivate_tx_ring(struct mlx4_en_priv *priv, |
1416 | struct mlx4_en_tx_ring *ring); |
1417 | void mlx4_en_set_num_rx_rings(struct mlx4_en_dev *mdev); |
1418 | +void mlx4_en_recover_from_oom(struct mlx4_en_priv *priv); |
1419 | int mlx4_en_create_rx_ring(struct mlx4_en_priv *priv, |
1420 | struct mlx4_en_rx_ring **pring, |
1421 | u32 size, u16 stride, int node); |
1422 | diff --git a/drivers/scsi/3w-9xxx.c b/drivers/scsi/3w-9xxx.c |
1423 | index 7600639db4c4..add419d6ff34 100644 |
1424 | --- a/drivers/scsi/3w-9xxx.c |
1425 | +++ b/drivers/scsi/3w-9xxx.c |
1426 | @@ -149,7 +149,6 @@ static int twa_reset_sequence(TW_Device_Extension *tw_dev, int soft_reset); |
1427 | static int twa_scsiop_execute_scsi(TW_Device_Extension *tw_dev, int request_id, char *cdb, int use_sg, TW_SG_Entry *sglistarg); |
1428 | static void twa_scsiop_execute_scsi_complete(TW_Device_Extension *tw_dev, int request_id); |
1429 | static char *twa_string_lookup(twa_message_type *table, unsigned int aen_code); |
1430 | -static void twa_unmap_scsi_data(TW_Device_Extension *tw_dev, int request_id); |
1431 | |
1432 | /* Functions */ |
1433 | |
1434 | @@ -1340,11 +1339,11 @@ static irqreturn_t twa_interrupt(int irq, void *dev_instance) |
1435 | } |
1436 | |
1437 | /* Now complete the io */ |
1438 | + scsi_dma_unmap(cmd); |
1439 | + cmd->scsi_done(cmd); |
1440 | tw_dev->state[request_id] = TW_S_COMPLETED; |
1441 | twa_free_request_id(tw_dev, request_id); |
1442 | tw_dev->posted_request_count--; |
1443 | - tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]); |
1444 | - twa_unmap_scsi_data(tw_dev, request_id); |
1445 | } |
1446 | |
1447 | /* Check for valid status after each drain */ |
1448 | @@ -1402,26 +1401,6 @@ static void twa_load_sgl(TW_Device_Extension *tw_dev, TW_Command_Full *full_comm |
1449 | } |
1450 | } /* End twa_load_sgl() */ |
1451 | |
1452 | -/* This function will perform a pci-dma mapping for a scatter gather list */ |
1453 | -static int twa_map_scsi_sg_data(TW_Device_Extension *tw_dev, int request_id) |
1454 | -{ |
1455 | - int use_sg; |
1456 | - struct scsi_cmnd *cmd = tw_dev->srb[request_id]; |
1457 | - |
1458 | - use_sg = scsi_dma_map(cmd); |
1459 | - if (!use_sg) |
1460 | - return 0; |
1461 | - else if (use_sg < 0) { |
1462 | - TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1c, "Failed to map scatter gather list"); |
1463 | - return 0; |
1464 | - } |
1465 | - |
1466 | - cmd->SCp.phase = TW_PHASE_SGLIST; |
1467 | - cmd->SCp.have_data_in = use_sg; |
1468 | - |
1469 | - return use_sg; |
1470 | -} /* End twa_map_scsi_sg_data() */ |
1471 | - |
1472 | /* This function will poll for a response interrupt of a request */ |
1473 | static int twa_poll_response(TW_Device_Extension *tw_dev, int request_id, int seconds) |
1474 | { |
1475 | @@ -1600,9 +1579,11 @@ static int twa_reset_device_extension(TW_Device_Extension *tw_dev) |
1476 | (tw_dev->state[i] != TW_S_INITIAL) && |
1477 | (tw_dev->state[i] != TW_S_COMPLETED)) { |
1478 | if (tw_dev->srb[i]) { |
1479 | - tw_dev->srb[i]->result = (DID_RESET << 16); |
1480 | - tw_dev->srb[i]->scsi_done(tw_dev->srb[i]); |
1481 | - twa_unmap_scsi_data(tw_dev, i); |
1482 | + struct scsi_cmnd *cmd = tw_dev->srb[i]; |
1483 | + |
1484 | + cmd->result = (DID_RESET << 16); |
1485 | + scsi_dma_unmap(cmd); |
1486 | + cmd->scsi_done(cmd); |
1487 | } |
1488 | } |
1489 | } |
1490 | @@ -1781,21 +1762,18 @@ static int twa_scsi_queue_lck(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_ |
1491 | /* Save the scsi command for use by the ISR */ |
1492 | tw_dev->srb[request_id] = SCpnt; |
1493 | |
1494 | - /* Initialize phase to zero */ |
1495 | - SCpnt->SCp.phase = TW_PHASE_INITIAL; |
1496 | - |
1497 | retval = twa_scsiop_execute_scsi(tw_dev, request_id, NULL, 0, NULL); |
1498 | switch (retval) { |
1499 | case SCSI_MLQUEUE_HOST_BUSY: |
1500 | + scsi_dma_unmap(SCpnt); |
1501 | twa_free_request_id(tw_dev, request_id); |
1502 | - twa_unmap_scsi_data(tw_dev, request_id); |
1503 | break; |
1504 | case 1: |
1505 | - tw_dev->state[request_id] = TW_S_COMPLETED; |
1506 | - twa_free_request_id(tw_dev, request_id); |
1507 | - twa_unmap_scsi_data(tw_dev, request_id); |
1508 | SCpnt->result = (DID_ERROR << 16); |
1509 | + scsi_dma_unmap(SCpnt); |
1510 | done(SCpnt); |
1511 | + tw_dev->state[request_id] = TW_S_COMPLETED; |
1512 | + twa_free_request_id(tw_dev, request_id); |
1513 | retval = 0; |
1514 | } |
1515 | out: |
1516 | @@ -1863,8 +1841,8 @@ static int twa_scsiop_execute_scsi(TW_Device_Extension *tw_dev, int request_id, |
1517 | command_packet->sg_list[0].address = TW_CPU_TO_SGL(tw_dev->generic_buffer_phys[request_id]); |
1518 | command_packet->sg_list[0].length = cpu_to_le32(TW_MIN_SGL_LENGTH); |
1519 | } else { |
1520 | - sg_count = twa_map_scsi_sg_data(tw_dev, request_id); |
1521 | - if (sg_count == 0) |
1522 | + sg_count = scsi_dma_map(srb); |
1523 | + if (sg_count < 0) |
1524 | goto out; |
1525 | |
1526 | scsi_for_each_sg(srb, sg, sg_count, i) { |
1527 | @@ -1979,15 +1957,6 @@ static char *twa_string_lookup(twa_message_type *table, unsigned int code) |
1528 | return(table[index].text); |
1529 | } /* End twa_string_lookup() */ |
1530 | |
1531 | -/* This function will perform a pci-dma unmap */ |
1532 | -static void twa_unmap_scsi_data(TW_Device_Extension *tw_dev, int request_id) |
1533 | -{ |
1534 | - struct scsi_cmnd *cmd = tw_dev->srb[request_id]; |
1535 | - |
1536 | - if (cmd->SCp.phase == TW_PHASE_SGLIST) |
1537 | - scsi_dma_unmap(cmd); |
1538 | -} /* End twa_unmap_scsi_data() */ |
1539 | - |
1540 | /* This function gets called when a disk is coming on-line */ |
1541 | static int twa_slave_configure(struct scsi_device *sdev) |
1542 | { |
1543 | diff --git a/drivers/scsi/3w-9xxx.h b/drivers/scsi/3w-9xxx.h |
1544 | index 040f7214e5b7..0fdc83cfa0e1 100644 |
1545 | --- a/drivers/scsi/3w-9xxx.h |
1546 | +++ b/drivers/scsi/3w-9xxx.h |
1547 | @@ -324,11 +324,6 @@ static twa_message_type twa_error_table[] = { |
1548 | #define TW_CURRENT_DRIVER_BUILD 0 |
1549 | #define TW_CURRENT_DRIVER_BRANCH 0 |
1550 | |
1551 | -/* Phase defines */ |
1552 | -#define TW_PHASE_INITIAL 0 |
1553 | -#define TW_PHASE_SINGLE 1 |
1554 | -#define TW_PHASE_SGLIST 2 |
1555 | - |
1556 | /* Misc defines */ |
1557 | #define TW_9550SX_DRAIN_COMPLETED 0xFFFF |
1558 | #define TW_SECTOR_SIZE 512 |
1559 | diff --git a/drivers/scsi/3w-sas.c b/drivers/scsi/3w-sas.c |
1560 | index 2361772d5909..f8374850f714 100644 |
1561 | --- a/drivers/scsi/3w-sas.c |
1562 | +++ b/drivers/scsi/3w-sas.c |
1563 | @@ -290,26 +290,6 @@ static int twl_post_command_packet(TW_Device_Extension *tw_dev, int request_id) |
1564 | return 0; |
1565 | } /* End twl_post_command_packet() */ |
1566 | |
1567 | -/* This function will perform a pci-dma mapping for a scatter gather list */ |
1568 | -static int twl_map_scsi_sg_data(TW_Device_Extension *tw_dev, int request_id) |
1569 | -{ |
1570 | - int use_sg; |
1571 | - struct scsi_cmnd *cmd = tw_dev->srb[request_id]; |
1572 | - |
1573 | - use_sg = scsi_dma_map(cmd); |
1574 | - if (!use_sg) |
1575 | - return 0; |
1576 | - else if (use_sg < 0) { |
1577 | - TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1, "Failed to map scatter gather list"); |
1578 | - return 0; |
1579 | - } |
1580 | - |
1581 | - cmd->SCp.phase = TW_PHASE_SGLIST; |
1582 | - cmd->SCp.have_data_in = use_sg; |
1583 | - |
1584 | - return use_sg; |
1585 | -} /* End twl_map_scsi_sg_data() */ |
1586 | - |
1587 | /* This function hands scsi cdb's to the firmware */ |
1588 | static int twl_scsiop_execute_scsi(TW_Device_Extension *tw_dev, int request_id, char *cdb, int use_sg, TW_SG_Entry_ISO *sglistarg) |
1589 | { |
1590 | @@ -357,8 +337,8 @@ static int twl_scsiop_execute_scsi(TW_Device_Extension *tw_dev, int request_id, |
1591 | if (!sglistarg) { |
1592 | /* Map sglist from scsi layer to cmd packet */ |
1593 | if (scsi_sg_count(srb)) { |
1594 | - sg_count = twl_map_scsi_sg_data(tw_dev, request_id); |
1595 | - if (sg_count == 0) |
1596 | + sg_count = scsi_dma_map(srb); |
1597 | + if (sg_count <= 0) |
1598 | goto out; |
1599 | |
1600 | scsi_for_each_sg(srb, sg, sg_count, i) { |
1601 | @@ -1102,15 +1082,6 @@ out: |
1602 | return retval; |
1603 | } /* End twl_initialize_device_extension() */ |
1604 | |
1605 | -/* This function will perform a pci-dma unmap */ |
1606 | -static void twl_unmap_scsi_data(TW_Device_Extension *tw_dev, int request_id) |
1607 | -{ |
1608 | - struct scsi_cmnd *cmd = tw_dev->srb[request_id]; |
1609 | - |
1610 | - if (cmd->SCp.phase == TW_PHASE_SGLIST) |
1611 | - scsi_dma_unmap(cmd); |
1612 | -} /* End twl_unmap_scsi_data() */ |
1613 | - |
1614 | /* This function will handle attention interrupts */ |
1615 | static int twl_handle_attention_interrupt(TW_Device_Extension *tw_dev) |
1616 | { |
1617 | @@ -1251,11 +1222,11 @@ static irqreturn_t twl_interrupt(int irq, void *dev_instance) |
1618 | } |
1619 | |
1620 | /* Now complete the io */ |
1621 | + scsi_dma_unmap(cmd); |
1622 | + cmd->scsi_done(cmd); |
1623 | tw_dev->state[request_id] = TW_S_COMPLETED; |
1624 | twl_free_request_id(tw_dev, request_id); |
1625 | tw_dev->posted_request_count--; |
1626 | - tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]); |
1627 | - twl_unmap_scsi_data(tw_dev, request_id); |
1628 | } |
1629 | |
1630 | /* Check for another response interrupt */ |
1631 | @@ -1400,10 +1371,12 @@ static int twl_reset_device_extension(TW_Device_Extension *tw_dev, int ioctl_res |
1632 | if ((tw_dev->state[i] != TW_S_FINISHED) && |
1633 | (tw_dev->state[i] != TW_S_INITIAL) && |
1634 | (tw_dev->state[i] != TW_S_COMPLETED)) { |
1635 | - if (tw_dev->srb[i]) { |
1636 | - tw_dev->srb[i]->result = (DID_RESET << 16); |
1637 | - tw_dev->srb[i]->scsi_done(tw_dev->srb[i]); |
1638 | - twl_unmap_scsi_data(tw_dev, i); |
1639 | + struct scsi_cmnd *cmd = tw_dev->srb[i]; |
1640 | + |
1641 | + if (cmd) { |
1642 | + cmd->result = (DID_RESET << 16); |
1643 | + scsi_dma_unmap(cmd); |
1644 | + cmd->scsi_done(cmd); |
1645 | } |
1646 | } |
1647 | } |
1648 | @@ -1507,9 +1480,6 @@ static int twl_scsi_queue_lck(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_ |
1649 | /* Save the scsi command for use by the ISR */ |
1650 | tw_dev->srb[request_id] = SCpnt; |
1651 | |
1652 | - /* Initialize phase to zero */ |
1653 | - SCpnt->SCp.phase = TW_PHASE_INITIAL; |
1654 | - |
1655 | retval = twl_scsiop_execute_scsi(tw_dev, request_id, NULL, 0, NULL); |
1656 | if (retval) { |
1657 | tw_dev->state[request_id] = TW_S_COMPLETED; |
1658 | diff --git a/drivers/scsi/3w-sas.h b/drivers/scsi/3w-sas.h |
1659 | index d474892701d4..fec6449c7595 100644 |
1660 | --- a/drivers/scsi/3w-sas.h |
1661 | +++ b/drivers/scsi/3w-sas.h |
1662 | @@ -103,10 +103,6 @@ static char *twl_aen_severity_table[] = |
1663 | #define TW_CURRENT_DRIVER_BUILD 0 |
1664 | #define TW_CURRENT_DRIVER_BRANCH 0 |
1665 | |
1666 | -/* Phase defines */ |
1667 | -#define TW_PHASE_INITIAL 0 |
1668 | -#define TW_PHASE_SGLIST 2 |
1669 | - |
1670 | /* Misc defines */ |
1671 | #define TW_SECTOR_SIZE 512 |
1672 | #define TW_MAX_UNITS 32 |
1673 | diff --git a/drivers/scsi/3w-xxxx.c b/drivers/scsi/3w-xxxx.c |
1674 | index c75f2048319f..2940bd769936 100644 |
1675 | --- a/drivers/scsi/3w-xxxx.c |
1676 | +++ b/drivers/scsi/3w-xxxx.c |
1677 | @@ -1271,32 +1271,6 @@ static int tw_initialize_device_extension(TW_Device_Extension *tw_dev) |
1678 | return 0; |
1679 | } /* End tw_initialize_device_extension() */ |
1680 | |
1681 | -static int tw_map_scsi_sg_data(struct pci_dev *pdev, struct scsi_cmnd *cmd) |
1682 | -{ |
1683 | - int use_sg; |
1684 | - |
1685 | - dprintk(KERN_WARNING "3w-xxxx: tw_map_scsi_sg_data()\n"); |
1686 | - |
1687 | - use_sg = scsi_dma_map(cmd); |
1688 | - if (use_sg < 0) { |
1689 | - printk(KERN_WARNING "3w-xxxx: tw_map_scsi_sg_data(): pci_map_sg() failed.\n"); |
1690 | - return 0; |
1691 | - } |
1692 | - |
1693 | - cmd->SCp.phase = TW_PHASE_SGLIST; |
1694 | - cmd->SCp.have_data_in = use_sg; |
1695 | - |
1696 | - return use_sg; |
1697 | -} /* End tw_map_scsi_sg_data() */ |
1698 | - |
1699 | -static void tw_unmap_scsi_data(struct pci_dev *pdev, struct scsi_cmnd *cmd) |
1700 | -{ |
1701 | - dprintk(KERN_WARNING "3w-xxxx: tw_unmap_scsi_data()\n"); |
1702 | - |
1703 | - if (cmd->SCp.phase == TW_PHASE_SGLIST) |
1704 | - scsi_dma_unmap(cmd); |
1705 | -} /* End tw_unmap_scsi_data() */ |
1706 | - |
1707 | /* This function will reset a device extension */ |
1708 | static int tw_reset_device_extension(TW_Device_Extension *tw_dev) |
1709 | { |
1710 | @@ -1319,8 +1293,8 @@ static int tw_reset_device_extension(TW_Device_Extension *tw_dev) |
1711 | srb = tw_dev->srb[i]; |
1712 | if (srb != NULL) { |
1713 | srb->result = (DID_RESET << 16); |
1714 | - tw_dev->srb[i]->scsi_done(tw_dev->srb[i]); |
1715 | - tw_unmap_scsi_data(tw_dev->tw_pci_dev, tw_dev->srb[i]); |
1716 | + scsi_dma_unmap(srb); |
1717 | + srb->scsi_done(srb); |
1718 | } |
1719 | } |
1720 | } |
1721 | @@ -1767,8 +1741,8 @@ static int tw_scsiop_read_write(TW_Device_Extension *tw_dev, int request_id) |
1722 | command_packet->byte8.io.lba = lba; |
1723 | command_packet->byte6.block_count = num_sectors; |
1724 | |
1725 | - use_sg = tw_map_scsi_sg_data(tw_dev->tw_pci_dev, tw_dev->srb[request_id]); |
1726 | - if (!use_sg) |
1727 | + use_sg = scsi_dma_map(srb); |
1728 | + if (use_sg <= 0) |
1729 | return 1; |
1730 | |
1731 | scsi_for_each_sg(tw_dev->srb[request_id], sg, use_sg, i) { |
1732 | @@ -1955,9 +1929,6 @@ static int tw_scsi_queue_lck(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_c |
1733 | /* Save the scsi command for use by the ISR */ |
1734 | tw_dev->srb[request_id] = SCpnt; |
1735 | |
1736 | - /* Initialize phase to zero */ |
1737 | - SCpnt->SCp.phase = TW_PHASE_INITIAL; |
1738 | - |
1739 | switch (*command) { |
1740 | case READ_10: |
1741 | case READ_6: |
1742 | @@ -2185,12 +2156,11 @@ static irqreturn_t tw_interrupt(int irq, void *dev_instance) |
1743 | |
1744 | /* Now complete the io */ |
1745 | if ((error != TW_ISR_DONT_COMPLETE)) { |
1746 | + scsi_dma_unmap(tw_dev->srb[request_id]); |
1747 | + tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]); |
1748 | tw_dev->state[request_id] = TW_S_COMPLETED; |
1749 | tw_state_request_finish(tw_dev, request_id); |
1750 | tw_dev->posted_request_count--; |
1751 | - tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]); |
1752 | - |
1753 | - tw_unmap_scsi_data(tw_dev->tw_pci_dev, tw_dev->srb[request_id]); |
1754 | } |
1755 | } |
1756 | |
1757 | diff --git a/drivers/scsi/3w-xxxx.h b/drivers/scsi/3w-xxxx.h |
1758 | index 29b0b84ed69e..6f65e663d393 100644 |
1759 | --- a/drivers/scsi/3w-xxxx.h |
1760 | +++ b/drivers/scsi/3w-xxxx.h |
1761 | @@ -195,11 +195,6 @@ static unsigned char tw_sense_table[][4] = |
1762 | #define TW_AEN_SMART_FAIL 0x000F |
1763 | #define TW_AEN_SBUF_FAIL 0x0024 |
1764 | |
1765 | -/* Phase defines */ |
1766 | -#define TW_PHASE_INITIAL 0 |
1767 | -#define TW_PHASE_SINGLE 1 |
1768 | -#define TW_PHASE_SGLIST 2 |
1769 | - |
1770 | /* Misc defines */ |
1771 | #define TW_ALIGNMENT_6000 64 /* 64 bytes */ |
1772 | #define TW_ALIGNMENT_7000 4 /* 4 bytes */ |
1773 | diff --git a/drivers/scsi/scsi_devinfo.c b/drivers/scsi/scsi_devinfo.c |
1774 | index 262ab837a704..9f77d23239a2 100644 |
1775 | --- a/drivers/scsi/scsi_devinfo.c |
1776 | +++ b/drivers/scsi/scsi_devinfo.c |
1777 | @@ -226,6 +226,7 @@ static struct { |
1778 | {"PIONEER", "CD-ROM DRM-624X", NULL, BLIST_FORCELUN | BLIST_SINGLELUN}, |
1779 | {"Promise", "VTrak E610f", NULL, BLIST_SPARSELUN | BLIST_NO_RSOC}, |
1780 | {"Promise", "", NULL, BLIST_SPARSELUN}, |
1781 | + {"QNAP", "iSCSI Storage", NULL, BLIST_MAX_1024}, |
1782 | {"QUANTUM", "XP34301", "1071", BLIST_NOTQ}, |
1783 | {"REGAL", "CDC-4X", NULL, BLIST_MAX5LUN | BLIST_SINGLELUN}, |
1784 | {"SanDisk", "ImageMate CF-SD1", NULL, BLIST_FORCELUN}, |
1785 | diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c |
1786 | index 9c0a520d933c..3e6142f61499 100644 |
1787 | --- a/drivers/scsi/scsi_scan.c |
1788 | +++ b/drivers/scsi/scsi_scan.c |
1789 | @@ -897,6 +897,12 @@ static int scsi_add_lun(struct scsi_device *sdev, unsigned char *inq_result, |
1790 | */ |
1791 | if (*bflags & BLIST_MAX_512) |
1792 | blk_queue_max_hw_sectors(sdev->request_queue, 512); |
1793 | + /* |
1794 | + * Max 1024 sector transfer length for targets that report incorrect |
1795 | + * max/optimal lengths and relied on the old block layer safe default |
1796 | + */ |
1797 | + else if (*bflags & BLIST_MAX_1024) |
1798 | + blk_queue_max_hw_sectors(sdev->request_queue, 1024); |
1799 | |
1800 | /* |
1801 | * Some devices may not want to have a start command automatically |
1802 | diff --git a/drivers/ssb/Kconfig b/drivers/ssb/Kconfig |
1803 | index 75b3603906c1..f0d22cdb51cd 100644 |
1804 | --- a/drivers/ssb/Kconfig |
1805 | +++ b/drivers/ssb/Kconfig |
1806 | @@ -130,6 +130,7 @@ config SSB_DRIVER_MIPS |
1807 | bool "SSB Broadcom MIPS core driver" |
1808 | depends on SSB && MIPS |
1809 | select SSB_SERIAL |
1810 | + select SSB_SFLASH |
1811 | help |
1812 | Driver for the Sonics Silicon Backplane attached |
1813 | Broadcom MIPS core. |
1814 | diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c |
1815 | index 4e959c43f680..6afce7eb3d74 100644 |
1816 | --- a/drivers/tty/serial/atmel_serial.c |
1817 | +++ b/drivers/tty/serial/atmel_serial.c |
1818 | @@ -880,6 +880,7 @@ static int atmel_prepare_tx_dma(struct uart_port *port) |
1819 | config.direction = DMA_MEM_TO_DEV; |
1820 | config.dst_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE; |
1821 | config.dst_addr = port->mapbase + ATMEL_US_THR; |
1822 | + config.dst_maxburst = 1; |
1823 | |
1824 | ret = dmaengine_slave_config(atmel_port->chan_tx, |
1825 | &config); |
1826 | @@ -1059,6 +1060,7 @@ static int atmel_prepare_rx_dma(struct uart_port *port) |
1827 | config.direction = DMA_DEV_TO_MEM; |
1828 | config.src_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE; |
1829 | config.src_addr = port->mapbase + ATMEL_US_RHR; |
1830 | + config.src_maxburst = 1; |
1831 | |
1832 | ret = dmaengine_slave_config(atmel_port->chan_rx, |
1833 | &config); |
1834 | diff --git a/drivers/tty/serial/of_serial.c b/drivers/tty/serial/of_serial.c |
1835 | index 33fb94f78967..0a52c8b55a5f 100644 |
1836 | --- a/drivers/tty/serial/of_serial.c |
1837 | +++ b/drivers/tty/serial/of_serial.c |
1838 | @@ -344,7 +344,6 @@ static struct of_device_id of_platform_serial_table[] = { |
1839 | { .compatible = "ibm,qpace-nwp-serial", |
1840 | .data = (void *)PORT_NWPSERIAL, }, |
1841 | #endif |
1842 | - { .type = "serial", .data = (void *)PORT_UNKNOWN, }, |
1843 | { /* end of list */ }, |
1844 | }; |
1845 | |
1846 | diff --git a/drivers/tty/serial/uartlite.c b/drivers/tty/serial/uartlite.c |
1847 | index 189f52e3111f..a0099a7f60d4 100644 |
1848 | --- a/drivers/tty/serial/uartlite.c |
1849 | +++ b/drivers/tty/serial/uartlite.c |
1850 | @@ -632,7 +632,8 @@ MODULE_DEVICE_TABLE(of, ulite_of_match); |
1851 | |
1852 | static int ulite_probe(struct platform_device *pdev) |
1853 | { |
1854 | - struct resource *res, *res2; |
1855 | + struct resource *res; |
1856 | + int irq; |
1857 | int id = pdev->id; |
1858 | #ifdef CONFIG_OF |
1859 | const __be32 *prop; |
1860 | @@ -646,11 +647,11 @@ static int ulite_probe(struct platform_device *pdev) |
1861 | if (!res) |
1862 | return -ENODEV; |
1863 | |
1864 | - res2 = platform_get_resource(pdev, IORESOURCE_IRQ, 0); |
1865 | - if (!res2) |
1866 | - return -ENODEV; |
1867 | + irq = platform_get_irq(pdev, 0); |
1868 | + if (irq <= 0) |
1869 | + return -ENXIO; |
1870 | |
1871 | - return ulite_assign(&pdev->dev, id, res->start, res2->start); |
1872 | + return ulite_assign(&pdev->dev, id, res->start, irq); |
1873 | } |
1874 | |
1875 | static int ulite_remove(struct platform_device *pdev) |
1876 | diff --git a/drivers/tty/serial/xilinx_uartps.c b/drivers/tty/serial/xilinx_uartps.c |
1877 | index cff531a51a78..54853a02ce9e 100644 |
1878 | --- a/drivers/tty/serial/xilinx_uartps.c |
1879 | +++ b/drivers/tty/serial/xilinx_uartps.c |
1880 | @@ -1325,9 +1325,9 @@ static SIMPLE_DEV_PM_OPS(cdns_uart_dev_pm_ops, cdns_uart_suspend, |
1881 | */ |
1882 | static int cdns_uart_probe(struct platform_device *pdev) |
1883 | { |
1884 | - int rc, id; |
1885 | + int rc, id, irq; |
1886 | struct uart_port *port; |
1887 | - struct resource *res, *res2; |
1888 | + struct resource *res; |
1889 | struct cdns_uart *cdns_uart_data; |
1890 | |
1891 | cdns_uart_data = devm_kzalloc(&pdev->dev, sizeof(*cdns_uart_data), |
1892 | @@ -1374,9 +1374,9 @@ static int cdns_uart_probe(struct platform_device *pdev) |
1893 | goto err_out_clk_disable; |
1894 | } |
1895 | |
1896 | - res2 = platform_get_resource(pdev, IORESOURCE_IRQ, 0); |
1897 | - if (!res2) { |
1898 | - rc = -ENODEV; |
1899 | + irq = platform_get_irq(pdev, 0); |
1900 | + if (irq <= 0) { |
1901 | + rc = -ENXIO; |
1902 | goto err_out_clk_disable; |
1903 | } |
1904 | |
1905 | @@ -1405,7 +1405,7 @@ static int cdns_uart_probe(struct platform_device *pdev) |
1906 | * and triggers invocation of the config_port() entry point. |
1907 | */ |
1908 | port->mapbase = res->start; |
1909 | - port->irq = res2->start; |
1910 | + port->irq = irq; |
1911 | port->dev = &pdev->dev; |
1912 | port->uartclk = clk_get_rate(cdns_uart_data->uartclk); |
1913 | port->private_data = cdns_uart_data; |
1914 | diff --git a/drivers/usb/chipidea/otg_fsm.c b/drivers/usb/chipidea/otg_fsm.c |
1915 | index 562e581f6765..3770330a2201 100644 |
1916 | --- a/drivers/usb/chipidea/otg_fsm.c |
1917 | +++ b/drivers/usb/chipidea/otg_fsm.c |
1918 | @@ -537,7 +537,6 @@ static int ci_otg_start_host(struct otg_fsm *fsm, int on) |
1919 | { |
1920 | struct ci_hdrc *ci = container_of(fsm, struct ci_hdrc, fsm); |
1921 | |
1922 | - mutex_unlock(&fsm->lock); |
1923 | if (on) { |
1924 | ci_role_stop(ci); |
1925 | ci_role_start(ci, CI_ROLE_HOST); |
1926 | @@ -546,7 +545,6 @@ static int ci_otg_start_host(struct otg_fsm *fsm, int on) |
1927 | hw_device_reset(ci); |
1928 | ci_role_start(ci, CI_ROLE_GADGET); |
1929 | } |
1930 | - mutex_lock(&fsm->lock); |
1931 | return 0; |
1932 | } |
1933 | |
1934 | @@ -554,12 +552,10 @@ static int ci_otg_start_gadget(struct otg_fsm *fsm, int on) |
1935 | { |
1936 | struct ci_hdrc *ci = container_of(fsm, struct ci_hdrc, fsm); |
1937 | |
1938 | - mutex_unlock(&fsm->lock); |
1939 | if (on) |
1940 | usb_gadget_vbus_connect(&ci->gadget); |
1941 | else |
1942 | usb_gadget_vbus_disconnect(&ci->gadget); |
1943 | - mutex_lock(&fsm->lock); |
1944 | |
1945 | return 0; |
1946 | } |
1947 | diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c |
1948 | index 683617714e7c..220c0fd059bb 100644 |
1949 | --- a/drivers/usb/class/cdc-acm.c |
1950 | +++ b/drivers/usb/class/cdc-acm.c |
1951 | @@ -1133,11 +1133,16 @@ static int acm_probe(struct usb_interface *intf, |
1952 | } |
1953 | |
1954 | while (buflen > 0) { |
1955 | + elength = buffer[0]; |
1956 | + if (!elength) { |
1957 | + dev_err(&intf->dev, "skipping garbage byte\n"); |
1958 | + elength = 1; |
1959 | + goto next_desc; |
1960 | + } |
1961 | if (buffer[1] != USB_DT_CS_INTERFACE) { |
1962 | dev_err(&intf->dev, "skipping garbage\n"); |
1963 | goto next_desc; |
1964 | } |
1965 | - elength = buffer[0]; |
1966 | |
1967 | switch (buffer[2]) { |
1968 | case USB_CDC_UNION_TYPE: /* we've found it */ |
1969 | diff --git a/drivers/usb/storage/uas-detect.h b/drivers/usb/storage/uas-detect.h |
1970 | index 9893d696fc97..f58caa9e6a27 100644 |
1971 | --- a/drivers/usb/storage/uas-detect.h |
1972 | +++ b/drivers/usb/storage/uas-detect.h |
1973 | @@ -51,7 +51,8 @@ static int uas_find_endpoints(struct usb_host_interface *alt, |
1974 | } |
1975 | |
1976 | static int uas_use_uas_driver(struct usb_interface *intf, |
1977 | - const struct usb_device_id *id) |
1978 | + const struct usb_device_id *id, |
1979 | + unsigned long *flags_ret) |
1980 | { |
1981 | struct usb_host_endpoint *eps[4] = { }; |
1982 | struct usb_device *udev = interface_to_usbdev(intf); |
1983 | @@ -73,7 +74,7 @@ static int uas_use_uas_driver(struct usb_interface *intf, |
1984 | * this writing the following versions exist: |
1985 | * ASM1051 - no uas support version |
1986 | * ASM1051 - with broken (*) uas support |
1987 | - * ASM1053 - with working uas support |
1988 | + * ASM1053 - with working uas support, but problems with large xfers |
1989 | * ASM1153 - with working uas support |
1990 | * |
1991 | * Devices with these chips re-use a number of device-ids over the |
1992 | @@ -103,6 +104,9 @@ static int uas_use_uas_driver(struct usb_interface *intf, |
1993 | } else if (usb_ss_max_streams(&eps[1]->ss_ep_comp) == 32) { |
1994 | /* Possibly an ASM1051, disable uas */ |
1995 | flags |= US_FL_IGNORE_UAS; |
1996 | + } else { |
1997 | + /* ASM1053, these have issues with large transfers */ |
1998 | + flags |= US_FL_MAX_SECTORS_240; |
1999 | } |
2000 | } |
2001 | |
2002 | @@ -132,5 +136,8 @@ static int uas_use_uas_driver(struct usb_interface *intf, |
2003 | return 0; |
2004 | } |
2005 | |
2006 | + if (flags_ret) |
2007 | + *flags_ret = flags; |
2008 | + |
2009 | return 1; |
2010 | } |
2011 | diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c |
2012 | index 6cdabdc119a7..6d3122afeed3 100644 |
2013 | --- a/drivers/usb/storage/uas.c |
2014 | +++ b/drivers/usb/storage/uas.c |
2015 | @@ -759,7 +759,10 @@ static int uas_eh_bus_reset_handler(struct scsi_cmnd *cmnd) |
2016 | |
2017 | static int uas_slave_alloc(struct scsi_device *sdev) |
2018 | { |
2019 | - sdev->hostdata = (void *)sdev->host->hostdata; |
2020 | + struct uas_dev_info *devinfo = |
2021 | + (struct uas_dev_info *)sdev->host->hostdata; |
2022 | + |
2023 | + sdev->hostdata = devinfo; |
2024 | |
2025 | /* USB has unusual DMA-alignment requirements: Although the |
2026 | * starting address of each scatter-gather element doesn't matter, |
2027 | @@ -778,6 +781,11 @@ static int uas_slave_alloc(struct scsi_device *sdev) |
2028 | */ |
2029 | blk_queue_update_dma_alignment(sdev->request_queue, (512 - 1)); |
2030 | |
2031 | + if (devinfo->flags & US_FL_MAX_SECTORS_64) |
2032 | + blk_queue_max_hw_sectors(sdev->request_queue, 64); |
2033 | + else if (devinfo->flags & US_FL_MAX_SECTORS_240) |
2034 | + blk_queue_max_hw_sectors(sdev->request_queue, 240); |
2035 | + |
2036 | return 0; |
2037 | } |
2038 | |
2039 | @@ -887,8 +895,9 @@ static int uas_probe(struct usb_interface *intf, const struct usb_device_id *id) |
2040 | struct Scsi_Host *shost = NULL; |
2041 | struct uas_dev_info *devinfo; |
2042 | struct usb_device *udev = interface_to_usbdev(intf); |
2043 | + unsigned long dev_flags; |
2044 | |
2045 | - if (!uas_use_uas_driver(intf, id)) |
2046 | + if (!uas_use_uas_driver(intf, id, &dev_flags)) |
2047 | return -ENODEV; |
2048 | |
2049 | if (uas_switch_interface(udev, intf)) |
2050 | @@ -910,8 +919,7 @@ static int uas_probe(struct usb_interface *intf, const struct usb_device_id *id) |
2051 | devinfo->udev = udev; |
2052 | devinfo->resetting = 0; |
2053 | devinfo->shutdown = 0; |
2054 | - devinfo->flags = id->driver_info; |
2055 | - usb_stor_adjust_quirks(udev, &devinfo->flags); |
2056 | + devinfo->flags = dev_flags; |
2057 | init_usb_anchor(&devinfo->cmd_urbs); |
2058 | init_usb_anchor(&devinfo->sense_urbs); |
2059 | init_usb_anchor(&devinfo->data_urbs); |
2060 | diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c |
2061 | index 5600c33fcadb..6c10c888f35f 100644 |
2062 | --- a/drivers/usb/storage/usb.c |
2063 | +++ b/drivers/usb/storage/usb.c |
2064 | @@ -479,7 +479,8 @@ void usb_stor_adjust_quirks(struct usb_device *udev, unsigned long *fflags) |
2065 | US_FL_SINGLE_LUN | US_FL_NO_WP_DETECT | |
2066 | US_FL_NO_READ_DISC_INFO | US_FL_NO_READ_CAPACITY_16 | |
2067 | US_FL_INITIAL_READ10 | US_FL_WRITE_CACHE | |
2068 | - US_FL_NO_ATA_1X | US_FL_NO_REPORT_OPCODES); |
2069 | + US_FL_NO_ATA_1X | US_FL_NO_REPORT_OPCODES | |
2070 | + US_FL_MAX_SECTORS_240); |
2071 | |
2072 | p = quirks; |
2073 | while (*p) { |
2074 | @@ -520,6 +521,9 @@ void usb_stor_adjust_quirks(struct usb_device *udev, unsigned long *fflags) |
2075 | case 'f': |
2076 | f |= US_FL_NO_REPORT_OPCODES; |
2077 | break; |
2078 | + case 'g': |
2079 | + f |= US_FL_MAX_SECTORS_240; |
2080 | + break; |
2081 | case 'h': |
2082 | f |= US_FL_CAPACITY_HEURISTICS; |
2083 | break; |
2084 | @@ -1080,7 +1084,7 @@ static int storage_probe(struct usb_interface *intf, |
2085 | |
2086 | /* If uas is enabled and this device can do uas then ignore it. */ |
2087 | #if IS_ENABLED(CONFIG_USB_UAS) |
2088 | - if (uas_use_uas_driver(intf, id)) |
2089 | + if (uas_use_uas_driver(intf, id, NULL)) |
2090 | return -ENXIO; |
2091 | #endif |
2092 | |
2093 | diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c |
2094 | index f23d4be3280e..2b4c5423672d 100644 |
2095 | --- a/fs/btrfs/ioctl.c |
2096 | +++ b/fs/btrfs/ioctl.c |
2097 | @@ -2403,7 +2403,7 @@ static noinline int btrfs_ioctl_snap_destroy(struct file *file, |
2098 | "Attempt to delete subvolume %llu during send", |
2099 | dest->root_key.objectid); |
2100 | err = -EPERM; |
2101 | - goto out_dput; |
2102 | + goto out_unlock_inode; |
2103 | } |
2104 | |
2105 | d_invalidate(dentry); |
2106 | @@ -2498,6 +2498,7 @@ out_up_write: |
2107 | root_flags & ~BTRFS_ROOT_SUBVOL_DEAD); |
2108 | spin_unlock(&dest->root_item_lock); |
2109 | } |
2110 | +out_unlock_inode: |
2111 | mutex_unlock(&inode->i_mutex); |
2112 | if (!err) { |
2113 | shrink_dcache_sb(root->fs_info->sb); |
2114 | diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c |
2115 | index bed43081720f..16f6365f65e7 100644 |
2116 | --- a/fs/ext4/extents.c |
2117 | +++ b/fs/ext4/extents.c |
2118 | @@ -4934,13 +4934,6 @@ long ext4_fallocate(struct file *file, int mode, loff_t offset, loff_t len) |
2119 | if (ret) |
2120 | return ret; |
2121 | |
2122 | - /* |
2123 | - * currently supporting (pre)allocate mode for extent-based |
2124 | - * files _only_ |
2125 | - */ |
2126 | - if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) |
2127 | - return -EOPNOTSUPP; |
2128 | - |
2129 | if (mode & FALLOC_FL_COLLAPSE_RANGE) |
2130 | return ext4_collapse_range(inode, offset, len); |
2131 | |
2132 | @@ -4962,6 +4955,14 @@ long ext4_fallocate(struct file *file, int mode, loff_t offset, loff_t len) |
2133 | |
2134 | mutex_lock(&inode->i_mutex); |
2135 | |
2136 | + /* |
2137 | + * We only support preallocation for extent-based files only |
2138 | + */ |
2139 | + if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) { |
2140 | + ret = -EOPNOTSUPP; |
2141 | + goto out; |
2142 | + } |
2143 | + |
2144 | if (!(mode & FALLOC_FL_KEEP_SIZE) && |
2145 | offset + len > i_size_read(inode)) { |
2146 | new_size = offset + len; |
2147 | diff --git a/fs/ext4/extents_status.c b/fs/ext4/extents_status.c |
2148 | index e04d45733976..9a0121376358 100644 |
2149 | --- a/fs/ext4/extents_status.c |
2150 | +++ b/fs/ext4/extents_status.c |
2151 | @@ -705,6 +705,14 @@ int ext4_es_insert_extent(struct inode *inode, ext4_lblk_t lblk, |
2152 | |
2153 | BUG_ON(end < lblk); |
2154 | |
2155 | + if ((status & EXTENT_STATUS_DELAYED) && |
2156 | + (status & EXTENT_STATUS_WRITTEN)) { |
2157 | + ext4_warning(inode->i_sb, "Inserting extent [%u/%u] as " |
2158 | + " delayed and written which can potentially " |
2159 | + " cause data loss.\n", lblk, len); |
2160 | + WARN_ON(1); |
2161 | + } |
2162 | + |
2163 | newes.es_lblk = lblk; |
2164 | newes.es_len = len; |
2165 | ext4_es_store_pblock_status(&newes, pblk, status); |
2166 | diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c |
2167 | index 5cb9a212b86f..852cc521f327 100644 |
2168 | --- a/fs/ext4/inode.c |
2169 | +++ b/fs/ext4/inode.c |
2170 | @@ -534,6 +534,7 @@ int ext4_map_blocks(handle_t *handle, struct inode *inode, |
2171 | status = map->m_flags & EXT4_MAP_UNWRITTEN ? |
2172 | EXTENT_STATUS_UNWRITTEN : EXTENT_STATUS_WRITTEN; |
2173 | if (!(flags & EXT4_GET_BLOCKS_DELALLOC_RESERVE) && |
2174 | + !(status & EXTENT_STATUS_WRITTEN) && |
2175 | ext4_find_delalloc_range(inode, map->m_lblk, |
2176 | map->m_lblk + map->m_len - 1)) |
2177 | status |= EXTENT_STATUS_DELAYED; |
2178 | @@ -638,6 +639,7 @@ found: |
2179 | status = map->m_flags & EXT4_MAP_UNWRITTEN ? |
2180 | EXTENT_STATUS_UNWRITTEN : EXTENT_STATUS_WRITTEN; |
2181 | if (!(flags & EXT4_GET_BLOCKS_DELALLOC_RESERVE) && |
2182 | + !(status & EXTENT_STATUS_WRITTEN) && |
2183 | ext4_find_delalloc_range(inode, map->m_lblk, |
2184 | map->m_lblk + map->m_len - 1)) |
2185 | status |= EXTENT_STATUS_DELAYED; |
2186 | diff --git a/fs/hfsplus/xattr.c b/fs/hfsplus/xattr.c |
2187 | index d98094a9f476..ff10f3decbc9 100644 |
2188 | --- a/fs/hfsplus/xattr.c |
2189 | +++ b/fs/hfsplus/xattr.c |
2190 | @@ -806,9 +806,6 @@ end_removexattr: |
2191 | static int hfsplus_osx_getxattr(struct dentry *dentry, const char *name, |
2192 | void *buffer, size_t size, int type) |
2193 | { |
2194 | - char *xattr_name; |
2195 | - int res; |
2196 | - |
2197 | if (!strcmp(name, "")) |
2198 | return -EINVAL; |
2199 | |
2200 | @@ -818,24 +815,19 @@ static int hfsplus_osx_getxattr(struct dentry *dentry, const char *name, |
2201 | */ |
2202 | if (is_known_namespace(name)) |
2203 | return -EOPNOTSUPP; |
2204 | - xattr_name = kmalloc(NLS_MAX_CHARSET_SIZE * HFSPLUS_ATTR_MAX_STRLEN |
2205 | - + XATTR_MAC_OSX_PREFIX_LEN + 1, GFP_KERNEL); |
2206 | - if (!xattr_name) |
2207 | - return -ENOMEM; |
2208 | - strcpy(xattr_name, XATTR_MAC_OSX_PREFIX); |
2209 | - strcpy(xattr_name + XATTR_MAC_OSX_PREFIX_LEN, name); |
2210 | |
2211 | - res = hfsplus_getxattr(dentry, xattr_name, buffer, size); |
2212 | - kfree(xattr_name); |
2213 | - return res; |
2214 | + /* |
2215 | + * osx is the namespace we use to indicate an unprefixed |
2216 | + * attribute on the filesystem (like the ones that OS X |
2217 | + * creates), so we pass the name through unmodified (after |
2218 | + * ensuring it doesn't conflict with another namespace). |
2219 | + */ |
2220 | + return hfsplus_getxattr(dentry, name, buffer, size); |
2221 | } |
2222 | |
2223 | static int hfsplus_osx_setxattr(struct dentry *dentry, const char *name, |
2224 | const void *buffer, size_t size, int flags, int type) |
2225 | { |
2226 | - char *xattr_name; |
2227 | - int res; |
2228 | - |
2229 | if (!strcmp(name, "")) |
2230 | return -EINVAL; |
2231 | |
2232 | @@ -845,16 +837,14 @@ static int hfsplus_osx_setxattr(struct dentry *dentry, const char *name, |
2233 | */ |
2234 | if (is_known_namespace(name)) |
2235 | return -EOPNOTSUPP; |
2236 | - xattr_name = kmalloc(NLS_MAX_CHARSET_SIZE * HFSPLUS_ATTR_MAX_STRLEN |
2237 | - + XATTR_MAC_OSX_PREFIX_LEN + 1, GFP_KERNEL); |
2238 | - if (!xattr_name) |
2239 | - return -ENOMEM; |
2240 | - strcpy(xattr_name, XATTR_MAC_OSX_PREFIX); |
2241 | - strcpy(xattr_name + XATTR_MAC_OSX_PREFIX_LEN, name); |
2242 | |
2243 | - res = hfsplus_setxattr(dentry, xattr_name, buffer, size, flags); |
2244 | - kfree(xattr_name); |
2245 | - return res; |
2246 | + /* |
2247 | + * osx is the namespace we use to indicate an unprefixed |
2248 | + * attribute on the filesystem (like the ones that OS X |
2249 | + * creates), so we pass the name through unmodified (after |
2250 | + * ensuring it doesn't conflict with another namespace). |
2251 | + */ |
2252 | + return hfsplus_setxattr(dentry, name, buffer, size, flags); |
2253 | } |
2254 | |
2255 | static size_t hfsplus_osx_listxattr(struct dentry *dentry, char *list, |
2256 | diff --git a/include/linux/usb_usual.h b/include/linux/usb_usual.h |
2257 | index a7f2604c5f25..7f5f78bd15ad 100644 |
2258 | --- a/include/linux/usb_usual.h |
2259 | +++ b/include/linux/usb_usual.h |
2260 | @@ -77,6 +77,8 @@ |
2261 | /* Cannot handle ATA_12 or ATA_16 CDBs */ \ |
2262 | US_FLAG(NO_REPORT_OPCODES, 0x04000000) \ |
2263 | /* Cannot handle MI_REPORT_SUPPORTED_OPERATION_CODES */ \ |
2264 | + US_FLAG(MAX_SECTORS_240, 0x08000000) \ |
2265 | + /* Sets max_sectors to 240 */ \ |
2266 | |
2267 | #define US_FLAG(name, value) US_FL_##name = value , |
2268 | enum { US_DO_ALL_FLAGS }; |
2269 | diff --git a/include/scsi/scsi_devinfo.h b/include/scsi/scsi_devinfo.h |
2270 | index 183eaab7c380..96e3f56519e7 100644 |
2271 | --- a/include/scsi/scsi_devinfo.h |
2272 | +++ b/include/scsi/scsi_devinfo.h |
2273 | @@ -36,5 +36,6 @@ |
2274 | for sequential scan */ |
2275 | #define BLIST_TRY_VPD_PAGES 0x10000000 /* Attempt to read VPD pages */ |
2276 | #define BLIST_NO_RSOC 0x20000000 /* don't try to issue RSOC */ |
2277 | +#define BLIST_MAX_1024 0x40000000 /* maximum 1024 sector cdb length */ |
2278 | |
2279 | #endif |
2280 | diff --git a/include/sound/emu10k1.h b/include/sound/emu10k1.h |
2281 | index 0de95ccb92cf..5bd134651f5e 100644 |
2282 | --- a/include/sound/emu10k1.h |
2283 | +++ b/include/sound/emu10k1.h |
2284 | @@ -41,7 +41,8 @@ |
2285 | |
2286 | #define EMUPAGESIZE 4096 |
2287 | #define MAXREQVOICES 8 |
2288 | -#define MAXPAGES 8192 |
2289 | +#define MAXPAGES0 4096 /* 32 bit mode */ |
2290 | +#define MAXPAGES1 8192 /* 31 bit mode */ |
2291 | #define RESERVED 0 |
2292 | #define NUM_MIDI 16 |
2293 | #define NUM_G 64 /* use all channels */ |
2294 | @@ -50,8 +51,7 @@ |
2295 | |
2296 | /* FIXME? - according to the OSS driver the EMU10K1 needs a 29 bit DMA mask */ |
2297 | #define EMU10K1_DMA_MASK 0x7fffffffUL /* 31bit */ |
2298 | -#define AUDIGY_DMA_MASK 0x7fffffffUL /* 31bit FIXME - 32 should work? */ |
2299 | - /* See ALSA bug #1276 - rlrevell */ |
2300 | +#define AUDIGY_DMA_MASK 0xffffffffUL /* 32bit mode */ |
2301 | |
2302 | #define TMEMSIZE 256*1024 |
2303 | #define TMEMSIZEREG 4 |
2304 | @@ -466,8 +466,11 @@ |
2305 | |
2306 | #define MAPB 0x0d /* Cache map B */ |
2307 | |
2308 | -#define MAP_PTE_MASK 0xffffe000 /* The 19 MSBs of the PTE indexed by the PTI */ |
2309 | -#define MAP_PTI_MASK 0x00001fff /* The 13 bit index to one of the 8192 PTE dwords */ |
2310 | +#define MAP_PTE_MASK0 0xfffff000 /* The 20 MSBs of the PTE indexed by the PTI */ |
2311 | +#define MAP_PTI_MASK0 0x00000fff /* The 12 bit index to one of the 4096 PTE dwords */ |
2312 | + |
2313 | +#define MAP_PTE_MASK1 0xffffe000 /* The 19 MSBs of the PTE indexed by the PTI */ |
2314 | +#define MAP_PTI_MASK1 0x00001fff /* The 13 bit index to one of the 8192 PTE dwords */ |
2315 | |
2316 | /* 0x0e, 0x0f: Not used */ |
2317 | |
2318 | @@ -1704,6 +1707,7 @@ struct snd_emu10k1 { |
2319 | unsigned short model; /* subsystem id */ |
2320 | unsigned int card_type; /* EMU10K1_CARD_* */ |
2321 | unsigned int ecard_ctrl; /* ecard control bits */ |
2322 | + unsigned int address_mode; /* address mode */ |
2323 | unsigned long dma_mask; /* PCI DMA mask */ |
2324 | unsigned int delay_pcm_irq; /* in samples */ |
2325 | int max_cache_pages; /* max memory size / PAGE_SIZE */ |
2326 | diff --git a/include/sound/soc-dapm.h b/include/sound/soc-dapm.h |
2327 | index 8d7416e46861..15355892a0ff 100644 |
2328 | --- a/include/sound/soc-dapm.h |
2329 | +++ b/include/sound/soc-dapm.h |
2330 | @@ -287,7 +287,7 @@ struct device; |
2331 | .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | SNDRV_CTL_ELEM_ACCESS_READWRITE,\ |
2332 | .tlv.p = (tlv_array), \ |
2333 | .get = snd_soc_dapm_get_volsw, .put = snd_soc_dapm_put_volsw, \ |
2334 | - .private_value = SOC_SINGLE_VALUE(reg, shift, max, invert, 0) } |
2335 | + .private_value = SOC_SINGLE_VALUE(reg, shift, max, invert, 1) } |
2336 | #define SOC_DAPM_SINGLE_TLV_VIRT(xname, max, tlv_array) \ |
2337 | SOC_DAPM_SINGLE(xname, SND_SOC_NOPM, 0, max, 0, tlv_array) |
2338 | #define SOC_DAPM_ENUM(xname, xenum) \ |
2339 | diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c |
2340 | index a64e7a207d2b..0c5796eadae1 100644 |
2341 | --- a/kernel/bpf/core.c |
2342 | +++ b/kernel/bpf/core.c |
2343 | @@ -357,8 +357,8 @@ select_insn: |
2344 | ALU64_MOD_X: |
2345 | if (unlikely(SRC == 0)) |
2346 | return 0; |
2347 | - tmp = DST; |
2348 | - DST = do_div(tmp, SRC); |
2349 | + div64_u64_rem(DST, SRC, &tmp); |
2350 | + DST = tmp; |
2351 | CONT; |
2352 | ALU_MOD_X: |
2353 | if (unlikely(SRC == 0)) |
2354 | @@ -367,8 +367,8 @@ select_insn: |
2355 | DST = do_div(tmp, (u32) SRC); |
2356 | CONT; |
2357 | ALU64_MOD_K: |
2358 | - tmp = DST; |
2359 | - DST = do_div(tmp, IMM); |
2360 | + div64_u64_rem(DST, IMM, &tmp); |
2361 | + DST = tmp; |
2362 | CONT; |
2363 | ALU_MOD_K: |
2364 | tmp = (u32) DST; |
2365 | @@ -377,7 +377,7 @@ select_insn: |
2366 | ALU64_DIV_X: |
2367 | if (unlikely(SRC == 0)) |
2368 | return 0; |
2369 | - do_div(DST, SRC); |
2370 | + DST = div64_u64(DST, SRC); |
2371 | CONT; |
2372 | ALU_DIV_X: |
2373 | if (unlikely(SRC == 0)) |
2374 | @@ -387,7 +387,7 @@ select_insn: |
2375 | DST = (u32) tmp; |
2376 | CONT; |
2377 | ALU64_DIV_K: |
2378 | - do_div(DST, IMM); |
2379 | + DST = div64_u64(DST, IMM); |
2380 | CONT; |
2381 | ALU_DIV_K: |
2382 | tmp = (u32) DST; |
2383 | diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c |
2384 | index 208d5439e59b..787b0d699969 100644 |
2385 | --- a/net/ipv4/ping.c |
2386 | +++ b/net/ipv4/ping.c |
2387 | @@ -158,6 +158,7 @@ void ping_unhash(struct sock *sk) |
2388 | if (sk_hashed(sk)) { |
2389 | write_lock_bh(&ping_table.lock); |
2390 | hlist_nulls_del(&sk->sk_nulls_node); |
2391 | + sk_nulls_node_init(&sk->sk_nulls_node); |
2392 | sock_put(sk); |
2393 | isk->inet_num = 0; |
2394 | isk->inet_sport = 0; |
2395 | diff --git a/net/ipv4/route.c b/net/ipv4/route.c |
2396 | index ad5064362c5c..20fc0202cbbe 100644 |
2397 | --- a/net/ipv4/route.c |
2398 | +++ b/net/ipv4/route.c |
2399 | @@ -963,10 +963,7 @@ static void __ip_rt_update_pmtu(struct rtable *rt, struct flowi4 *fl4, u32 mtu) |
2400 | if (dst_metric_locked(dst, RTAX_MTU)) |
2401 | return; |
2402 | |
2403 | - if (dst->dev->mtu < mtu) |
2404 | - return; |
2405 | - |
2406 | - if (rt->rt_pmtu && rt->rt_pmtu < mtu) |
2407 | + if (ipv4_mtu(dst) < mtu) |
2408 | return; |
2409 | |
2410 | if (mtu < ip_rt_min_pmtu) |
2411 | diff --git a/sound/pci/emu10k1/emu10k1.c b/sound/pci/emu10k1/emu10k1.c |
2412 | index 37d0220a094c..db7a2e5e4a14 100644 |
2413 | --- a/sound/pci/emu10k1/emu10k1.c |
2414 | +++ b/sound/pci/emu10k1/emu10k1.c |
2415 | @@ -183,8 +183,10 @@ static int snd_card_emu10k1_probe(struct pci_dev *pci, |
2416 | } |
2417 | #endif |
2418 | |
2419 | - strcpy(card->driver, emu->card_capabilities->driver); |
2420 | - strcpy(card->shortname, emu->card_capabilities->name); |
2421 | + strlcpy(card->driver, emu->card_capabilities->driver, |
2422 | + sizeof(card->driver)); |
2423 | + strlcpy(card->shortname, emu->card_capabilities->name, |
2424 | + sizeof(card->shortname)); |
2425 | snprintf(card->longname, sizeof(card->longname), |
2426 | "%s (rev.%d, serial:0x%x) at 0x%lx, irq %i", |
2427 | card->shortname, emu->revision, emu->serial, emu->port, emu->irq); |
2428 | diff --git a/sound/pci/emu10k1/emu10k1_callback.c b/sound/pci/emu10k1/emu10k1_callback.c |
2429 | index 874cd76c7b7f..d2c7ea3a7610 100644 |
2430 | --- a/sound/pci/emu10k1/emu10k1_callback.c |
2431 | +++ b/sound/pci/emu10k1/emu10k1_callback.c |
2432 | @@ -415,7 +415,7 @@ start_voice(struct snd_emux_voice *vp) |
2433 | snd_emu10k1_ptr_write(hw, Z2, ch, 0); |
2434 | |
2435 | /* invalidate maps */ |
2436 | - temp = (hw->silent_page.addr << 1) | MAP_PTI_MASK; |
2437 | + temp = (hw->silent_page.addr << hw->address_mode) | (hw->address_mode ? MAP_PTI_MASK1 : MAP_PTI_MASK0); |
2438 | snd_emu10k1_ptr_write(hw, MAPA, ch, temp); |
2439 | snd_emu10k1_ptr_write(hw, MAPB, ch, temp); |
2440 | #if 0 |
2441 | @@ -436,7 +436,7 @@ start_voice(struct snd_emux_voice *vp) |
2442 | snd_emu10k1_ptr_write(hw, CDF, ch, sample); |
2443 | |
2444 | /* invalidate maps */ |
2445 | - temp = ((unsigned int)hw->silent_page.addr << 1) | MAP_PTI_MASK; |
2446 | + temp = ((unsigned int)hw->silent_page.addr << hw_address_mode) | (hw->address_mode ? MAP_PTI_MASK1 : MAP_PTI_MASK0); |
2447 | snd_emu10k1_ptr_write(hw, MAPA, ch, temp); |
2448 | snd_emu10k1_ptr_write(hw, MAPB, ch, temp); |
2449 | |
2450 | diff --git a/sound/pci/emu10k1/emu10k1_main.c b/sound/pci/emu10k1/emu10k1_main.c |
2451 | index b4458a630a7c..df9f5c7c9c77 100644 |
2452 | --- a/sound/pci/emu10k1/emu10k1_main.c |
2453 | +++ b/sound/pci/emu10k1/emu10k1_main.c |
2454 | @@ -282,7 +282,7 @@ static int snd_emu10k1_init(struct snd_emu10k1 *emu, int enable_ir, int resume) |
2455 | snd_emu10k1_ptr_write(emu, TCB, 0, 0); /* taken from original driver */ |
2456 | snd_emu10k1_ptr_write(emu, TCBS, 0, 4); /* taken from original driver */ |
2457 | |
2458 | - silent_page = (emu->silent_page.addr << 1) | MAP_PTI_MASK; |
2459 | + silent_page = (emu->silent_page.addr << emu->address_mode) | (emu->address_mode ? MAP_PTI_MASK1 : MAP_PTI_MASK0); |
2460 | for (ch = 0; ch < NUM_G; ch++) { |
2461 | snd_emu10k1_ptr_write(emu, MAPA, ch, silent_page); |
2462 | snd_emu10k1_ptr_write(emu, MAPB, ch, silent_page); |
2463 | @@ -348,6 +348,11 @@ static int snd_emu10k1_init(struct snd_emu10k1 *emu, int enable_ir, int resume) |
2464 | outl(reg | A_IOCFG_GPOUT0, emu->port + A_IOCFG); |
2465 | } |
2466 | |
2467 | + if (emu->address_mode == 0) { |
2468 | + /* use 16M in 4G */ |
2469 | + outl(inl(emu->port + HCFG) | HCFG_EXPANDED_MEM, emu->port + HCFG); |
2470 | + } |
2471 | + |
2472 | return 0; |
2473 | } |
2474 | |
2475 | @@ -1421,7 +1426,7 @@ static struct snd_emu_chip_details emu_chip_details[] = { |
2476 | * |
2477 | */ |
2478 | {.vendor = 0x1102, .device = 0x0008, .subsystem = 0x20011102, |
2479 | - .driver = "Audigy2", .name = "SB Audigy 2 ZS Notebook [SB0530]", |
2480 | + .driver = "Audigy2", .name = "Audigy 2 ZS Notebook [SB0530]", |
2481 | .id = "Audigy2", |
2482 | .emu10k2_chip = 1, |
2483 | .ca0108_chip = 1, |
2484 | @@ -1571,7 +1576,7 @@ static struct snd_emu_chip_details emu_chip_details[] = { |
2485 | .adc_1361t = 1, /* 24 bit capture instead of 16bit */ |
2486 | .ac97_chip = 1} , |
2487 | {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x10051102, |
2488 | - .driver = "Audigy2", .name = "SB Audigy 2 Platinum EX [SB0280]", |
2489 | + .driver = "Audigy2", .name = "Audigy 2 Platinum EX [SB0280]", |
2490 | .id = "Audigy2", |
2491 | .emu10k2_chip = 1, |
2492 | .ca0102_chip = 1, |
2493 | @@ -1877,8 +1882,10 @@ int snd_emu10k1_create(struct snd_card *card, |
2494 | |
2495 | is_audigy = emu->audigy = c->emu10k2_chip; |
2496 | |
2497 | + /* set addressing mode */ |
2498 | + emu->address_mode = is_audigy ? 0 : 1; |
2499 | /* set the DMA transfer mask */ |
2500 | - emu->dma_mask = is_audigy ? AUDIGY_DMA_MASK : EMU10K1_DMA_MASK; |
2501 | + emu->dma_mask = emu->address_mode ? EMU10K1_DMA_MASK : AUDIGY_DMA_MASK; |
2502 | if (pci_set_dma_mask(pci, emu->dma_mask) < 0 || |
2503 | pci_set_consistent_dma_mask(pci, emu->dma_mask) < 0) { |
2504 | dev_err(card->dev, |
2505 | @@ -1903,7 +1910,7 @@ int snd_emu10k1_create(struct snd_card *card, |
2506 | |
2507 | emu->max_cache_pages = max_cache_bytes >> PAGE_SHIFT; |
2508 | if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(pci), |
2509 | - 32 * 1024, &emu->ptb_pages) < 0) { |
2510 | + (emu->address_mode ? 32 : 16) * 1024, &emu->ptb_pages) < 0) { |
2511 | err = -ENOMEM; |
2512 | goto error; |
2513 | } |
2514 | @@ -2002,8 +2009,8 @@ int snd_emu10k1_create(struct snd_card *card, |
2515 | |
2516 | /* Clear silent pages and set up pointers */ |
2517 | memset(emu->silent_page.area, 0, PAGE_SIZE); |
2518 | - silent_page = emu->silent_page.addr << 1; |
2519 | - for (idx = 0; idx < MAXPAGES; idx++) |
2520 | + silent_page = emu->silent_page.addr << emu->address_mode; |
2521 | + for (idx = 0; idx < (emu->address_mode ? MAXPAGES1 : MAXPAGES0); idx++) |
2522 | ((u32 *)emu->ptb_pages.area)[idx] = cpu_to_le32(silent_page | idx); |
2523 | |
2524 | /* set up voice indices */ |
2525 | diff --git a/sound/pci/emu10k1/emupcm.c b/sound/pci/emu10k1/emupcm.c |
2526 | index 0dc07385af0e..14a305bd8a98 100644 |
2527 | --- a/sound/pci/emu10k1/emupcm.c |
2528 | +++ b/sound/pci/emu10k1/emupcm.c |
2529 | @@ -380,7 +380,7 @@ static void snd_emu10k1_pcm_init_voice(struct snd_emu10k1 *emu, |
2530 | snd_emu10k1_ptr_write(emu, Z1, voice, 0); |
2531 | snd_emu10k1_ptr_write(emu, Z2, voice, 0); |
2532 | /* invalidate maps */ |
2533 | - silent_page = ((unsigned int)emu->silent_page.addr << 1) | MAP_PTI_MASK; |
2534 | + silent_page = ((unsigned int)emu->silent_page.addr << emu->address_mode) | (emu->address_mode ? MAP_PTI_MASK1 : MAP_PTI_MASK0); |
2535 | snd_emu10k1_ptr_write(emu, MAPA, voice, silent_page); |
2536 | snd_emu10k1_ptr_write(emu, MAPB, voice, silent_page); |
2537 | /* modulation envelope */ |
2538 | diff --git a/sound/pci/emu10k1/memory.c b/sound/pci/emu10k1/memory.c |
2539 | index c68e6dd2fa67..4f1f69be1865 100644 |
2540 | --- a/sound/pci/emu10k1/memory.c |
2541 | +++ b/sound/pci/emu10k1/memory.c |
2542 | @@ -34,10 +34,11 @@ |
2543 | * aligned pages in others |
2544 | */ |
2545 | #define __set_ptb_entry(emu,page,addr) \ |
2546 | - (((u32 *)(emu)->ptb_pages.area)[page] = cpu_to_le32(((addr) << 1) | (page))) |
2547 | + (((u32 *)(emu)->ptb_pages.area)[page] = cpu_to_le32(((addr) << (emu->address_mode)) | (page))) |
2548 | |
2549 | #define UNIT_PAGES (PAGE_SIZE / EMUPAGESIZE) |
2550 | -#define MAX_ALIGN_PAGES (MAXPAGES / UNIT_PAGES) |
2551 | +#define MAX_ALIGN_PAGES0 (MAXPAGES0 / UNIT_PAGES) |
2552 | +#define MAX_ALIGN_PAGES1 (MAXPAGES1 / UNIT_PAGES) |
2553 | /* get aligned page from offset address */ |
2554 | #define get_aligned_page(offset) ((offset) >> PAGE_SHIFT) |
2555 | /* get offset address from aligned page */ |
2556 | @@ -124,7 +125,7 @@ static int search_empty_map_area(struct snd_emu10k1 *emu, int npages, struct lis |
2557 | } |
2558 | page = blk->mapped_page + blk->pages; |
2559 | } |
2560 | - size = MAX_ALIGN_PAGES - page; |
2561 | + size = (emu->address_mode ? MAX_ALIGN_PAGES1 : MAX_ALIGN_PAGES0) - page; |
2562 | if (size >= max_size) { |
2563 | *nextp = pos; |
2564 | return page; |
2565 | @@ -181,7 +182,7 @@ static int unmap_memblk(struct snd_emu10k1 *emu, struct snd_emu10k1_memblk *blk) |
2566 | q = get_emu10k1_memblk(p, mapped_link); |
2567 | end_page = q->mapped_page; |
2568 | } else |
2569 | - end_page = MAX_ALIGN_PAGES; |
2570 | + end_page = (emu->address_mode ? MAX_ALIGN_PAGES1 : MAX_ALIGN_PAGES0); |
2571 | |
2572 | /* remove links */ |
2573 | list_del(&blk->mapped_link); |
2574 | @@ -307,7 +308,7 @@ snd_emu10k1_alloc_pages(struct snd_emu10k1 *emu, struct snd_pcm_substream *subst |
2575 | if (snd_BUG_ON(!emu)) |
2576 | return NULL; |
2577 | if (snd_BUG_ON(runtime->dma_bytes <= 0 || |
2578 | - runtime->dma_bytes >= MAXPAGES * EMUPAGESIZE)) |
2579 | + runtime->dma_bytes >= (emu->address_mode ? MAXPAGES1 : MAXPAGES0) * EMUPAGESIZE)) |
2580 | return NULL; |
2581 | hdr = emu->memhdr; |
2582 | if (snd_BUG_ON(!hdr)) |
2583 | diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c |
2584 | index 2fe86d2e1b09..a63a86332deb 100644 |
2585 | --- a/sound/pci/hda/hda_codec.c |
2586 | +++ b/sound/pci/hda/hda_codec.c |
2587 | @@ -3027,6 +3027,16 @@ static struct snd_kcontrol_new vmaster_mute_mode = { |
2588 | .put = vmaster_mute_mode_put, |
2589 | }; |
2590 | |
2591 | +/* meta hook to call each driver's vmaster hook */ |
2592 | +static void vmaster_hook(void *private_data, int enabled) |
2593 | +{ |
2594 | + struct hda_vmaster_mute_hook *hook = private_data; |
2595 | + |
2596 | + if (hook->mute_mode != HDA_VMUTE_FOLLOW_MASTER) |
2597 | + enabled = hook->mute_mode; |
2598 | + hook->hook(hook->codec, enabled); |
2599 | +} |
2600 | + |
2601 | /** |
2602 | * snd_hda_add_vmaster_hook - Add a vmaster hook for mute-LED |
2603 | * @codec: the HDA codec |
2604 | @@ -3045,9 +3055,9 @@ int snd_hda_add_vmaster_hook(struct hda_codec *codec, |
2605 | |
2606 | if (!hook->hook || !hook->sw_kctl) |
2607 | return 0; |
2608 | - snd_ctl_add_vmaster_hook(hook->sw_kctl, hook->hook, codec); |
2609 | hook->codec = codec; |
2610 | hook->mute_mode = HDA_VMUTE_FOLLOW_MASTER; |
2611 | + snd_ctl_add_vmaster_hook(hook->sw_kctl, vmaster_hook, hook); |
2612 | if (!expose_enum_ctl) |
2613 | return 0; |
2614 | kctl = snd_ctl_new1(&vmaster_mute_mode, hook); |
2615 | @@ -3073,14 +3083,7 @@ void snd_hda_sync_vmaster_hook(struct hda_vmaster_mute_hook *hook) |
2616 | */ |
2617 | if (hook->codec->bus->shutdown) |
2618 | return; |
2619 | - switch (hook->mute_mode) { |
2620 | - case HDA_VMUTE_FOLLOW_MASTER: |
2621 | - snd_ctl_sync_vmaster_hook(hook->sw_kctl); |
2622 | - break; |
2623 | - default: |
2624 | - hook->hook(hook->codec, hook->mute_mode); |
2625 | - break; |
2626 | - } |
2627 | + snd_ctl_sync_vmaster_hook(hook->sw_kctl); |
2628 | } |
2629 | EXPORT_SYMBOL_GPL(snd_hda_sync_vmaster_hook); |
2630 | |
2631 | diff --git a/sound/pci/hda/thinkpad_helper.c b/sound/pci/hda/thinkpad_helper.c |
2632 | index 6ba0b5517c40..2341fc334163 100644 |
2633 | --- a/sound/pci/hda/thinkpad_helper.c |
2634 | +++ b/sound/pci/hda/thinkpad_helper.c |
2635 | @@ -72,6 +72,7 @@ static void hda_fixup_thinkpad_acpi(struct hda_codec *codec, |
2636 | if (led_set_func(TPACPI_LED_MUTE, false) >= 0) { |
2637 | old_vmaster_hook = spec->vmaster_mute.hook; |
2638 | spec->vmaster_mute.hook = update_tpacpi_mute_led; |
2639 | + spec->vmaster_mute_enum = 1; |
2640 | removefunc = false; |
2641 | } |
2642 | if (led_set_func(TPACPI_LED_MICMUTE, false) >= 0) { |
2643 | diff --git a/sound/soc/codecs/rt5677.c b/sound/soc/codecs/rt5677.c |
2644 | index fb9c20eace3f..97b33e96439a 100644 |
2645 | --- a/sound/soc/codecs/rt5677.c |
2646 | +++ b/sound/soc/codecs/rt5677.c |
2647 | @@ -62,6 +62,9 @@ static const struct reg_default init_list[] = { |
2648 | {RT5677_PR_BASE + 0x1e, 0x0000}, |
2649 | {RT5677_PR_BASE + 0x12, 0x0eaa}, |
2650 | {RT5677_PR_BASE + 0x14, 0x018a}, |
2651 | + {RT5677_PR_BASE + 0x15, 0x0490}, |
2652 | + {RT5677_PR_BASE + 0x38, 0x0f71}, |
2653 | + {RT5677_PR_BASE + 0x39, 0x0f71}, |
2654 | }; |
2655 | #define RT5677_INIT_REG_LEN ARRAY_SIZE(init_list) |
2656 | |
2657 | @@ -901,7 +904,7 @@ static int set_dmic_clk(struct snd_soc_dapm_widget *w, |
2658 | { |
2659 | struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); |
2660 | struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec); |
2661 | - int idx = rl6231_calc_dmic_clk(rt5677->sysclk); |
2662 | + int idx = rl6231_calc_dmic_clk(rt5677->lrck[RT5677_AIF1] << 8); |
2663 | |
2664 | if (idx < 0) |
2665 | dev_err(codec->dev, "Failed to set DMIC clock\n"); |
2666 | diff --git a/sound/soc/codecs/tfa9879.c b/sound/soc/codecs/tfa9879.c |
2667 | index 16f1b71edb55..aab0af681e8c 100644 |
2668 | --- a/sound/soc/codecs/tfa9879.c |
2669 | +++ b/sound/soc/codecs/tfa9879.c |
2670 | @@ -280,8 +280,8 @@ static int tfa9879_i2c_probe(struct i2c_client *i2c, |
2671 | int i; |
2672 | |
2673 | tfa9879 = devm_kzalloc(&i2c->dev, sizeof(*tfa9879), GFP_KERNEL); |
2674 | - if (IS_ERR(tfa9879)) |
2675 | - return PTR_ERR(tfa9879); |
2676 | + if (!tfa9879) |
2677 | + return -ENOMEM; |
2678 | |
2679 | i2c_set_clientdata(i2c, tfa9879); |
2680 | |
2681 | diff --git a/sound/soc/samsung/s3c24xx-i2s.c b/sound/soc/samsung/s3c24xx-i2s.c |
2682 | index 326d3c3804e3..5bf723689692 100644 |
2683 | --- a/sound/soc/samsung/s3c24xx-i2s.c |
2684 | +++ b/sound/soc/samsung/s3c24xx-i2s.c |
2685 | @@ -461,8 +461,8 @@ static int s3c24xx_iis_dev_probe(struct platform_device *pdev) |
2686 | return -ENOENT; |
2687 | } |
2688 | s3c24xx_i2s.regs = devm_ioremap_resource(&pdev->dev, res); |
2689 | - if (s3c24xx_i2s.regs == NULL) |
2690 | - return -ENXIO; |
2691 | + if (IS_ERR(s3c24xx_i2s.regs)) |
2692 | + return PTR_ERR(s3c24xx_i2s.regs); |
2693 | |
2694 | s3c24xx_i2s_pcm_stereo_out.dma_addr = res->start + S3C2410_IISFIFO; |
2695 | s3c24xx_i2s_pcm_stereo_in.dma_addr = res->start + S3C2410_IISFIFO; |
2696 | diff --git a/sound/synth/emux/emux_oss.c b/sound/synth/emux/emux_oss.c |
2697 | index ab37add269ae..82e350e9501c 100644 |
2698 | --- a/sound/synth/emux/emux_oss.c |
2699 | +++ b/sound/synth/emux/emux_oss.c |
2700 | @@ -118,12 +118,8 @@ snd_emux_open_seq_oss(struct snd_seq_oss_arg *arg, void *closure) |
2701 | if (snd_BUG_ON(!arg || !emu)) |
2702 | return -ENXIO; |
2703 | |
2704 | - mutex_lock(&emu->register_mutex); |
2705 | - |
2706 | - if (!snd_emux_inc_count(emu)) { |
2707 | - mutex_unlock(&emu->register_mutex); |
2708 | + if (!snd_emux_inc_count(emu)) |
2709 | return -EFAULT; |
2710 | - } |
2711 | |
2712 | memset(&callback, 0, sizeof(callback)); |
2713 | callback.owner = THIS_MODULE; |
2714 | @@ -135,7 +131,6 @@ snd_emux_open_seq_oss(struct snd_seq_oss_arg *arg, void *closure) |
2715 | if (p == NULL) { |
2716 | snd_printk(KERN_ERR "can't create port\n"); |
2717 | snd_emux_dec_count(emu); |
2718 | - mutex_unlock(&emu->register_mutex); |
2719 | return -ENOMEM; |
2720 | } |
2721 | |
2722 | @@ -148,8 +143,6 @@ snd_emux_open_seq_oss(struct snd_seq_oss_arg *arg, void *closure) |
2723 | reset_port_mode(p, arg->seq_mode); |
2724 | |
2725 | snd_emux_reset_port(p); |
2726 | - |
2727 | - mutex_unlock(&emu->register_mutex); |
2728 | return 0; |
2729 | } |
2730 | |
2731 | @@ -195,13 +188,11 @@ snd_emux_close_seq_oss(struct snd_seq_oss_arg *arg) |
2732 | if (snd_BUG_ON(!emu)) |
2733 | return -ENXIO; |
2734 | |
2735 | - mutex_lock(&emu->register_mutex); |
2736 | snd_emux_sounds_off_all(p); |
2737 | snd_soundfont_close_check(emu->sflist, SF_CLIENT_NO(p->chset.port)); |
2738 | snd_seq_event_port_detach(p->chset.client, p->chset.port); |
2739 | snd_emux_dec_count(emu); |
2740 | |
2741 | - mutex_unlock(&emu->register_mutex); |
2742 | return 0; |
2743 | } |
2744 | |
2745 | diff --git a/sound/synth/emux/emux_seq.c b/sound/synth/emux/emux_seq.c |
2746 | index 7778b8e19782..a0209204ae48 100644 |
2747 | --- a/sound/synth/emux/emux_seq.c |
2748 | +++ b/sound/synth/emux/emux_seq.c |
2749 | @@ -124,12 +124,10 @@ snd_emux_detach_seq(struct snd_emux *emu) |
2750 | if (emu->voices) |
2751 | snd_emux_terminate_all(emu); |
2752 | |
2753 | - mutex_lock(&emu->register_mutex); |
2754 | if (emu->client >= 0) { |
2755 | snd_seq_delete_kernel_client(emu->client); |
2756 | emu->client = -1; |
2757 | } |
2758 | - mutex_unlock(&emu->register_mutex); |
2759 | } |
2760 | |
2761 | |
2762 | @@ -269,8 +267,8 @@ snd_emux_event_input(struct snd_seq_event *ev, int direct, void *private_data, |
2763 | /* |
2764 | * increment usage count |
2765 | */ |
2766 | -int |
2767 | -snd_emux_inc_count(struct snd_emux *emu) |
2768 | +static int |
2769 | +__snd_emux_inc_count(struct snd_emux *emu) |
2770 | { |
2771 | emu->used++; |
2772 | if (!try_module_get(emu->ops.owner)) |
2773 | @@ -284,12 +282,21 @@ snd_emux_inc_count(struct snd_emux *emu) |
2774 | return 1; |
2775 | } |
2776 | |
2777 | +int snd_emux_inc_count(struct snd_emux *emu) |
2778 | +{ |
2779 | + int ret; |
2780 | + |
2781 | + mutex_lock(&emu->register_mutex); |
2782 | + ret = __snd_emux_inc_count(emu); |
2783 | + mutex_unlock(&emu->register_mutex); |
2784 | + return ret; |
2785 | +} |
2786 | |
2787 | /* |
2788 | * decrease usage count |
2789 | */ |
2790 | -void |
2791 | -snd_emux_dec_count(struct snd_emux *emu) |
2792 | +static void |
2793 | +__snd_emux_dec_count(struct snd_emux *emu) |
2794 | { |
2795 | module_put(emu->card->module); |
2796 | emu->used--; |
2797 | @@ -298,6 +305,12 @@ snd_emux_dec_count(struct snd_emux *emu) |
2798 | module_put(emu->ops.owner); |
2799 | } |
2800 | |
2801 | +void snd_emux_dec_count(struct snd_emux *emu) |
2802 | +{ |
2803 | + mutex_lock(&emu->register_mutex); |
2804 | + __snd_emux_dec_count(emu); |
2805 | + mutex_unlock(&emu->register_mutex); |
2806 | +} |
2807 | |
2808 | /* |
2809 | * Routine that is called upon a first use of a particular port |
2810 | @@ -317,7 +330,7 @@ snd_emux_use(void *private_data, struct snd_seq_port_subscribe *info) |
2811 | |
2812 | mutex_lock(&emu->register_mutex); |
2813 | snd_emux_init_port(p); |
2814 | - snd_emux_inc_count(emu); |
2815 | + __snd_emux_inc_count(emu); |
2816 | mutex_unlock(&emu->register_mutex); |
2817 | return 0; |
2818 | } |
2819 | @@ -340,7 +353,7 @@ snd_emux_unuse(void *private_data, struct snd_seq_port_subscribe *info) |
2820 | |
2821 | mutex_lock(&emu->register_mutex); |
2822 | snd_emux_sounds_off_all(p); |
2823 | - snd_emux_dec_count(emu); |
2824 | + __snd_emux_dec_count(emu); |
2825 | mutex_unlock(&emu->register_mutex); |
2826 | return 0; |
2827 | } |