diff options
| author | Takashi Iwai <tiwai@suse.de> | 2014-01-29 01:35:19 -0500 |
|---|---|---|
| committer | Takashi Iwai <tiwai@suse.de> | 2014-01-29 01:35:19 -0500 |
| commit | a31886669f6277a8576af6e917c3958c780a4ebf (patch) | |
| tree | 195338489a866f54af718a67122150bd78c5cc42 | |
| parent | e7729a415315fcd9516912050d85d5aaebcededc (diff) | |
| parent | e65523ca79fd087d9888598eadeb9554e2bd2102 (diff) | |
Merge tag 'asoc-v3.14-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-linus
ASoC: Fixes for v3.14
A few fixes, all in drivers. Nothing stands out particularly, the
biggest set of fixes is some build coverage issues from Sachin.
93 files changed, 525 insertions, 296 deletions
diff --git a/Documentation/devicetree/bindings/sound/simple-card.txt b/Documentation/devicetree/bindings/sound/simple-card.txt index e9e20ec67d62..19c84df5fffa 100644 --- a/Documentation/devicetree/bindings/sound/simple-card.txt +++ b/Documentation/devicetree/bindings/sound/simple-card.txt | |||
| @@ -43,7 +43,7 @@ Example: | |||
| 43 | sound { | 43 | sound { |
| 44 | compatible = "simple-audio-card"; | 44 | compatible = "simple-audio-card"; |
| 45 | simple-audio-card,format = "left_j"; | 45 | simple-audio-card,format = "left_j"; |
| 46 | simple-audio-routing = | 46 | simple-audio-card,routing = |
| 47 | "MIC_IN", "Mic Jack", | 47 | "MIC_IN", "Mic Jack", |
| 48 | "Headphone Jack", "HP_OUT", | 48 | "Headphone Jack", "HP_OUT", |
| 49 | "Ext Spk", "LINE_OUT"; | 49 | "Ext Spk", "LINE_OUT"; |
diff --git a/MAINTAINERS b/MAINTAINERS index 31a046213274..6a6e4ac72287 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -9231,6 +9231,7 @@ F: include/media/videobuf2-* | |||
| 9231 | 9231 | ||
| 9232 | VIRTIO CONSOLE DRIVER | 9232 | VIRTIO CONSOLE DRIVER |
| 9233 | M: Amit Shah <amit.shah@redhat.com> | 9233 | M: Amit Shah <amit.shah@redhat.com> |
| 9234 | L: virtio-dev@lists.oasis-open.org | ||
| 9234 | L: virtualization@lists.linux-foundation.org | 9235 | L: virtualization@lists.linux-foundation.org |
| 9235 | S: Maintained | 9236 | S: Maintained |
| 9236 | F: drivers/char/virtio_console.c | 9237 | F: drivers/char/virtio_console.c |
| @@ -9240,6 +9241,7 @@ F: include/uapi/linux/virtio_console.h | |||
| 9240 | VIRTIO CORE, NET AND BLOCK DRIVERS | 9241 | VIRTIO CORE, NET AND BLOCK DRIVERS |
| 9241 | M: Rusty Russell <rusty@rustcorp.com.au> | 9242 | M: Rusty Russell <rusty@rustcorp.com.au> |
| 9242 | M: "Michael S. Tsirkin" <mst@redhat.com> | 9243 | M: "Michael S. Tsirkin" <mst@redhat.com> |
| 9244 | L: virtio-dev@lists.oasis-open.org | ||
| 9243 | L: virtualization@lists.linux-foundation.org | 9245 | L: virtualization@lists.linux-foundation.org |
| 9244 | S: Maintained | 9246 | S: Maintained |
| 9245 | F: drivers/virtio/ | 9247 | F: drivers/virtio/ |
| @@ -9252,6 +9254,7 @@ F: include/uapi/linux/virtio_*.h | |||
| 9252 | VIRTIO HOST (VHOST) | 9254 | VIRTIO HOST (VHOST) |
| 9253 | M: "Michael S. Tsirkin" <mst@redhat.com> | 9255 | M: "Michael S. Tsirkin" <mst@redhat.com> |
| 9254 | L: kvm@vger.kernel.org | 9256 | L: kvm@vger.kernel.org |
| 9257 | L: virtio-dev@lists.oasis-open.org | ||
| 9255 | L: virtualization@lists.linux-foundation.org | 9258 | L: virtualization@lists.linux-foundation.org |
| 9256 | L: netdev@vger.kernel.org | 9259 | L: netdev@vger.kernel.org |
| 9257 | S: Maintained | 9260 | S: Maintained |
| @@ -1,7 +1,7 @@ | |||
| 1 | VERSION = 3 | 1 | VERSION = 3 |
| 2 | PATCHLEVEL = 13 | 2 | PATCHLEVEL = 13 |
| 3 | SUBLEVEL = 0 | 3 | SUBLEVEL = 0 |
| 4 | EXTRAVERSION = -rc8 | 4 | EXTRAVERSION = |
| 5 | NAME = One Giant Leap for Frogkind | 5 | NAME = One Giant Leap for Frogkind |
| 6 | 6 | ||
| 7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
diff --git a/arch/arm/kernel/devtree.c b/arch/arm/kernel/devtree.c index 739c3dfc1da2..34d5fd585bbb 100644 --- a/arch/arm/kernel/devtree.c +++ b/arch/arm/kernel/devtree.c | |||
| @@ -171,7 +171,7 @@ void __init arm_dt_init_cpu_maps(void) | |||
| 171 | 171 | ||
| 172 | bool arch_match_cpu_phys_id(int cpu, u64 phys_id) | 172 | bool arch_match_cpu_phys_id(int cpu, u64 phys_id) |
| 173 | { | 173 | { |
| 174 | return (phys_id & MPIDR_HWID_BITMASK) == cpu_logical_map(cpu); | 174 | return phys_id == cpu_logical_map(cpu); |
| 175 | } | 175 | } |
| 176 | 176 | ||
| 177 | static const void * __init arch_get_next_mach(const char *const **match) | 177 | static const void * __init arch_get_next_mach(const char *const **match) |
diff --git a/arch/arm/kernel/perf_event_cpu.c b/arch/arm/kernel/perf_event_cpu.c index d85055cd24ba..20d553c9f5e2 100644 --- a/arch/arm/kernel/perf_event_cpu.c +++ b/arch/arm/kernel/perf_event_cpu.c | |||
| @@ -254,7 +254,7 @@ static int probe_current_pmu(struct arm_pmu *pmu) | |||
| 254 | static int cpu_pmu_device_probe(struct platform_device *pdev) | 254 | static int cpu_pmu_device_probe(struct platform_device *pdev) |
| 255 | { | 255 | { |
| 256 | const struct of_device_id *of_id; | 256 | const struct of_device_id *of_id; |
| 257 | int (*init_fn)(struct arm_pmu *); | 257 | const int (*init_fn)(struct arm_pmu *); |
| 258 | struct device_node *node = pdev->dev.of_node; | 258 | struct device_node *node = pdev->dev.of_node; |
| 259 | struct arm_pmu *pmu; | 259 | struct arm_pmu *pmu; |
| 260 | int ret = -ENODEV; | 260 | int ret = -ENODEV; |
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index 6eda3bf85c52..4636d56af2db 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c | |||
| @@ -431,9 +431,10 @@ asmlinkage void __exception do_undefinstr(struct pt_regs *regs) | |||
| 431 | instr2 = __mem_to_opcode_thumb16(instr2); | 431 | instr2 = __mem_to_opcode_thumb16(instr2); |
| 432 | instr = __opcode_thumb32_compose(instr, instr2); | 432 | instr = __opcode_thumb32_compose(instr, instr2); |
| 433 | } | 433 | } |
| 434 | } else if (get_user(instr, (u32 __user *)pc)) { | 434 | } else { |
| 435 | if (get_user(instr, (u32 __user *)pc)) | ||
| 436 | goto die_sig; | ||
| 435 | instr = __mem_to_opcode_arm(instr); | 437 | instr = __mem_to_opcode_arm(instr); |
| 436 | goto die_sig; | ||
| 437 | } | 438 | } |
| 438 | 439 | ||
| 439 | if (call_undef_hook(regs, instr) == 0) | 440 | if (call_undef_hook(regs, instr) == 0) |
diff --git a/arch/arm/mach-highbank/highbank.c b/arch/arm/mach-highbank/highbank.c index bd3bf66ce344..c7de89b263dd 100644 --- a/arch/arm/mach-highbank/highbank.c +++ b/arch/arm/mach-highbank/highbank.c | |||
| @@ -53,6 +53,7 @@ static void __init highbank_scu_map_io(void) | |||
| 53 | 53 | ||
| 54 | static void highbank_l2x0_disable(void) | 54 | static void highbank_l2x0_disable(void) |
| 55 | { | 55 | { |
| 56 | outer_flush_all(); | ||
| 56 | /* Disable PL310 L2 Cache controller */ | 57 | /* Disable PL310 L2 Cache controller */ |
| 57 | highbank_smc1(0x102, 0x0); | 58 | highbank_smc1(0x102, 0x0); |
| 58 | } | 59 | } |
diff --git a/arch/arm/mach-omap2/omap4-common.c b/arch/arm/mach-omap2/omap4-common.c index b39efd46abf9..c0ab9b26be3d 100644 --- a/arch/arm/mach-omap2/omap4-common.c +++ b/arch/arm/mach-omap2/omap4-common.c | |||
| @@ -162,6 +162,7 @@ void __iomem *omap4_get_l2cache_base(void) | |||
| 162 | 162 | ||
| 163 | static void omap4_l2x0_disable(void) | 163 | static void omap4_l2x0_disable(void) |
| 164 | { | 164 | { |
| 165 | outer_flush_all(); | ||
| 165 | /* Disable PL310 L2 Cache controller */ | 166 | /* Disable PL310 L2 Cache controller */ |
| 166 | omap_smc1(0x102, 0x0); | 167 | omap_smc1(0x102, 0x0); |
| 167 | } | 168 | } |
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index 1f7b19a47060..3e8f106ee5fe 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c | |||
| @@ -229,7 +229,7 @@ void __init setup_dma_zone(const struct machine_desc *mdesc) | |||
| 229 | #ifdef CONFIG_ZONE_DMA | 229 | #ifdef CONFIG_ZONE_DMA |
| 230 | if (mdesc->dma_zone_size) { | 230 | if (mdesc->dma_zone_size) { |
| 231 | arm_dma_zone_size = mdesc->dma_zone_size; | 231 | arm_dma_zone_size = mdesc->dma_zone_size; |
| 232 | arm_dma_limit = __pv_phys_offset + arm_dma_zone_size - 1; | 232 | arm_dma_limit = PHYS_OFFSET + arm_dma_zone_size - 1; |
| 233 | } else | 233 | } else |
| 234 | arm_dma_limit = 0xffffffff; | 234 | arm_dma_limit = 0xffffffff; |
| 235 | arm_dma_pfn_limit = arm_dma_limit >> PAGE_SHIFT; | 235 | arm_dma_pfn_limit = arm_dma_limit >> PAGE_SHIFT; |
diff --git a/arch/arm/net/bpf_jit_32.c b/arch/arm/net/bpf_jit_32.c index 9ed155ad0f97..271b5e971568 100644 --- a/arch/arm/net/bpf_jit_32.c +++ b/arch/arm/net/bpf_jit_32.c | |||
| @@ -641,10 +641,10 @@ load_ind: | |||
| 641 | emit(ARM_MUL(r_A, r_A, r_X), ctx); | 641 | emit(ARM_MUL(r_A, r_A, r_X), ctx); |
| 642 | break; | 642 | break; |
| 643 | case BPF_S_ALU_DIV_K: | 643 | case BPF_S_ALU_DIV_K: |
| 644 | /* current k == reciprocal_value(userspace k) */ | 644 | if (k == 1) |
| 645 | break; | ||
| 645 | emit_mov_i(r_scratch, k, ctx); | 646 | emit_mov_i(r_scratch, k, ctx); |
| 646 | /* A = top 32 bits of the product */ | 647 | emit_udiv(r_A, r_A, r_scratch, ctx); |
| 647 | emit(ARM_UMULL(r_scratch, r_A, r_A, r_scratch), ctx); | ||
| 648 | break; | 648 | break; |
| 649 | case BPF_S_ALU_DIV_X: | 649 | case BPF_S_ALU_DIV_X: |
| 650 | update_on_xread(ctx); | 650 | update_on_xread(ctx); |
diff --git a/arch/arm64/include/asm/io.h b/arch/arm64/include/asm/io.h index 572769727227..4cc813eddacb 100644 --- a/arch/arm64/include/asm/io.h +++ b/arch/arm64/include/asm/io.h | |||
| @@ -229,7 +229,7 @@ extern void __iomem *__ioremap(phys_addr_t phys_addr, size_t size, pgprot_t prot | |||
| 229 | extern void __iounmap(volatile void __iomem *addr); | 229 | extern void __iounmap(volatile void __iomem *addr); |
| 230 | extern void __iomem *ioremap_cache(phys_addr_t phys_addr, size_t size); | 230 | extern void __iomem *ioremap_cache(phys_addr_t phys_addr, size_t size); |
| 231 | 231 | ||
| 232 | #define PROT_DEFAULT (pgprot_default | PTE_DIRTY) | 232 | #define PROT_DEFAULT (PTE_TYPE_PAGE | PTE_AF | PTE_DIRTY) |
| 233 | #define PROT_DEVICE_nGnRE (PROT_DEFAULT | PTE_PXN | PTE_UXN | PTE_ATTRINDX(MT_DEVICE_nGnRE)) | 233 | #define PROT_DEVICE_nGnRE (PROT_DEFAULT | PTE_PXN | PTE_UXN | PTE_ATTRINDX(MT_DEVICE_nGnRE)) |
| 234 | #define PROT_NORMAL_NC (PROT_DEFAULT | PTE_ATTRINDX(MT_NORMAL_NC)) | 234 | #define PROT_NORMAL_NC (PROT_DEFAULT | PTE_ATTRINDX(MT_NORMAL_NC)) |
| 235 | #define PROT_NORMAL (PROT_DEFAULT | PTE_ATTRINDX(MT_NORMAL)) | 235 | #define PROT_NORMAL (PROT_DEFAULT | PTE_ATTRINDX(MT_NORMAL)) |
diff --git a/arch/mips/include/asm/cacheops.h b/arch/mips/include/asm/cacheops.h index c75025f27c20..06b9bc7ea14b 100644 --- a/arch/mips/include/asm/cacheops.h +++ b/arch/mips/include/asm/cacheops.h | |||
| @@ -83,6 +83,6 @@ | |||
| 83 | /* | 83 | /* |
| 84 | * Loongson2-specific cacheops | 84 | * Loongson2-specific cacheops |
| 85 | */ | 85 | */ |
| 86 | #define Hit_Invalidate_I_Loongson23 0x00 | 86 | #define Hit_Invalidate_I_Loongson2 0x00 |
| 87 | 87 | ||
| 88 | #endif /* __ASM_CACHEOPS_H */ | 88 | #endif /* __ASM_CACHEOPS_H */ |
diff --git a/arch/mips/include/asm/r4kcache.h b/arch/mips/include/asm/r4kcache.h index 34d1a1917125..c84caddb8bde 100644 --- a/arch/mips/include/asm/r4kcache.h +++ b/arch/mips/include/asm/r4kcache.h | |||
| @@ -165,7 +165,7 @@ static inline void flush_icache_line(unsigned long addr) | |||
| 165 | __iflush_prologue | 165 | __iflush_prologue |
| 166 | switch (boot_cpu_type()) { | 166 | switch (boot_cpu_type()) { |
| 167 | case CPU_LOONGSON2: | 167 | case CPU_LOONGSON2: |
| 168 | cache_op(Hit_Invalidate_I_Loongson23, addr); | 168 | cache_op(Hit_Invalidate_I_Loongson2, addr); |
| 169 | break; | 169 | break; |
| 170 | 170 | ||
| 171 | default: | 171 | default: |
| @@ -219,7 +219,7 @@ static inline void protected_flush_icache_line(unsigned long addr) | |||
| 219 | { | 219 | { |
| 220 | switch (boot_cpu_type()) { | 220 | switch (boot_cpu_type()) { |
| 221 | case CPU_LOONGSON2: | 221 | case CPU_LOONGSON2: |
| 222 | protected_cache_op(Hit_Invalidate_I_Loongson23, addr); | 222 | protected_cache_op(Hit_Invalidate_I_Loongson2, addr); |
| 223 | break; | 223 | break; |
| 224 | 224 | ||
| 225 | default: | 225 | default: |
| @@ -357,8 +357,8 @@ static inline void invalidate_tcache_page(unsigned long addr) | |||
| 357 | "i" (op)); | 357 | "i" (op)); |
| 358 | 358 | ||
| 359 | /* build blast_xxx, blast_xxx_page, blast_xxx_page_indexed */ | 359 | /* build blast_xxx, blast_xxx_page, blast_xxx_page_indexed */ |
| 360 | #define __BUILD_BLAST_CACHE(pfx, desc, indexop, hitop, lsize) \ | 360 | #define __BUILD_BLAST_CACHE(pfx, desc, indexop, hitop, lsize, extra) \ |
| 361 | static inline void blast_##pfx##cache##lsize(void) \ | 361 | static inline void extra##blast_##pfx##cache##lsize(void) \ |
| 362 | { \ | 362 | { \ |
| 363 | unsigned long start = INDEX_BASE; \ | 363 | unsigned long start = INDEX_BASE; \ |
| 364 | unsigned long end = start + current_cpu_data.desc.waysize; \ | 364 | unsigned long end = start + current_cpu_data.desc.waysize; \ |
| @@ -376,7 +376,7 @@ static inline void blast_##pfx##cache##lsize(void) \ | |||
| 376 | __##pfx##flush_epilogue \ | 376 | __##pfx##flush_epilogue \ |
| 377 | } \ | 377 | } \ |
| 378 | \ | 378 | \ |
| 379 | static inline void blast_##pfx##cache##lsize##_page(unsigned long page) \ | 379 | static inline void extra##blast_##pfx##cache##lsize##_page(unsigned long page) \ |
| 380 | { \ | 380 | { \ |
| 381 | unsigned long start = page; \ | 381 | unsigned long start = page; \ |
| 382 | unsigned long end = page + PAGE_SIZE; \ | 382 | unsigned long end = page + PAGE_SIZE; \ |
| @@ -391,7 +391,7 @@ static inline void blast_##pfx##cache##lsize##_page(unsigned long page) \ | |||
| 391 | __##pfx##flush_epilogue \ | 391 | __##pfx##flush_epilogue \ |
| 392 | } \ | 392 | } \ |
| 393 | \ | 393 | \ |
| 394 | static inline void blast_##pfx##cache##lsize##_page_indexed(unsigned long page) \ | 394 | static inline void extra##blast_##pfx##cache##lsize##_page_indexed(unsigned long page) \ |
| 395 | { \ | 395 | { \ |
| 396 | unsigned long indexmask = current_cpu_data.desc.waysize - 1; \ | 396 | unsigned long indexmask = current_cpu_data.desc.waysize - 1; \ |
| 397 | unsigned long start = INDEX_BASE + (page & indexmask); \ | 397 | unsigned long start = INDEX_BASE + (page & indexmask); \ |
| @@ -410,23 +410,24 @@ static inline void blast_##pfx##cache##lsize##_page_indexed(unsigned long page) | |||
| 410 | __##pfx##flush_epilogue \ | 410 | __##pfx##flush_epilogue \ |
| 411 | } | 411 | } |
| 412 | 412 | ||
| 413 | __BUILD_BLAST_CACHE(d, dcache, Index_Writeback_Inv_D, Hit_Writeback_Inv_D, 16) | 413 | __BUILD_BLAST_CACHE(d, dcache, Index_Writeback_Inv_D, Hit_Writeback_Inv_D, 16, ) |
| 414 | __BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I, 16) | 414 | __BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I, 16, ) |
| 415 | __BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 16) | 415 | __BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 16, ) |
| 416 | __BUILD_BLAST_CACHE(d, dcache, Index_Writeback_Inv_D, Hit_Writeback_Inv_D, 32) | 416 | __BUILD_BLAST_CACHE(d, dcache, Index_Writeback_Inv_D, Hit_Writeback_Inv_D, 32, ) |
| 417 | __BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I, 32) | 417 | __BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I, 32, ) |
| 418 | __BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 32) | 418 | __BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I_Loongson2, 32, loongson2_) |
| 419 | __BUILD_BLAST_CACHE(d, dcache, Index_Writeback_Inv_D, Hit_Writeback_Inv_D, 64) | 419 | __BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 32, ) |
| 420 | __BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I, 64) | 420 | __BUILD_BLAST_CACHE(d, dcache, Index_Writeback_Inv_D, Hit_Writeback_Inv_D, 64, ) |
| 421 | __BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 64) | 421 | __BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I, 64, ) |
| 422 | __BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 128) | 422 | __BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 64, ) |
| 423 | 423 | __BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 128, ) | |
| 424 | __BUILD_BLAST_CACHE(inv_d, dcache, Index_Writeback_Inv_D, Hit_Invalidate_D, 16) | 424 | |
| 425 | __BUILD_BLAST_CACHE(inv_d, dcache, Index_Writeback_Inv_D, Hit_Invalidate_D, 32) | 425 | __BUILD_BLAST_CACHE(inv_d, dcache, Index_Writeback_Inv_D, Hit_Invalidate_D, 16, ) |
| 426 | __BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 16) | 426 | __BUILD_BLAST_CACHE(inv_d, dcache, Index_Writeback_Inv_D, Hit_Invalidate_D, 32, ) |
| 427 | __BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 32) | 427 | __BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 16, ) |
| 428 | __BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 64) | 428 | __BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 32, ) |
| 429 | __BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 128) | 429 | __BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 64, ) |
| 430 | __BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 128, ) | ||
| 430 | 431 | ||
| 431 | /* build blast_xxx_range, protected_blast_xxx_range */ | 432 | /* build blast_xxx_range, protected_blast_xxx_range */ |
| 432 | #define __BUILD_BLAST_CACHE_RANGE(pfx, desc, hitop, prot, extra) \ | 433 | #define __BUILD_BLAST_CACHE_RANGE(pfx, desc, hitop, prot, extra) \ |
| @@ -452,8 +453,8 @@ static inline void prot##extra##blast_##pfx##cache##_range(unsigned long start, | |||
| 452 | __BUILD_BLAST_CACHE_RANGE(d, dcache, Hit_Writeback_Inv_D, protected_, ) | 453 | __BUILD_BLAST_CACHE_RANGE(d, dcache, Hit_Writeback_Inv_D, protected_, ) |
| 453 | __BUILD_BLAST_CACHE_RANGE(s, scache, Hit_Writeback_Inv_SD, protected_, ) | 454 | __BUILD_BLAST_CACHE_RANGE(s, scache, Hit_Writeback_Inv_SD, protected_, ) |
| 454 | __BUILD_BLAST_CACHE_RANGE(i, icache, Hit_Invalidate_I, protected_, ) | 455 | __BUILD_BLAST_CACHE_RANGE(i, icache, Hit_Invalidate_I, protected_, ) |
| 455 | __BUILD_BLAST_CACHE_RANGE(i, icache, Hit_Invalidate_I_Loongson23, \ | 456 | __BUILD_BLAST_CACHE_RANGE(i, icache, Hit_Invalidate_I_Loongson2, \ |
| 456 | protected_, loongson23_) | 457 | protected_, loongson2_) |
| 457 | __BUILD_BLAST_CACHE_RANGE(d, dcache, Hit_Writeback_Inv_D, , ) | 458 | __BUILD_BLAST_CACHE_RANGE(d, dcache, Hit_Writeback_Inv_D, , ) |
| 458 | __BUILD_BLAST_CACHE_RANGE(s, scache, Hit_Writeback_Inv_SD, , ) | 459 | __BUILD_BLAST_CACHE_RANGE(s, scache, Hit_Writeback_Inv_SD, , ) |
| 459 | /* blast_inv_dcache_range */ | 460 | /* blast_inv_dcache_range */ |
diff --git a/arch/mips/mm/c-r4k.c b/arch/mips/mm/c-r4k.c index 62ffd20ea869..49e572d879e1 100644 --- a/arch/mips/mm/c-r4k.c +++ b/arch/mips/mm/c-r4k.c | |||
| @@ -237,6 +237,8 @@ static void r4k_blast_icache_page_setup(void) | |||
| 237 | r4k_blast_icache_page = (void *)cache_noop; | 237 | r4k_blast_icache_page = (void *)cache_noop; |
| 238 | else if (ic_lsize == 16) | 238 | else if (ic_lsize == 16) |
| 239 | r4k_blast_icache_page = blast_icache16_page; | 239 | r4k_blast_icache_page = blast_icache16_page; |
| 240 | else if (ic_lsize == 32 && current_cpu_type() == CPU_LOONGSON2) | ||
| 241 | r4k_blast_icache_page = loongson2_blast_icache32_page; | ||
| 240 | else if (ic_lsize == 32) | 242 | else if (ic_lsize == 32) |
| 241 | r4k_blast_icache_page = blast_icache32_page; | 243 | r4k_blast_icache_page = blast_icache32_page; |
| 242 | else if (ic_lsize == 64) | 244 | else if (ic_lsize == 64) |
| @@ -261,6 +263,9 @@ static void r4k_blast_icache_page_indexed_setup(void) | |||
| 261 | else if (TX49XX_ICACHE_INDEX_INV_WAR) | 263 | else if (TX49XX_ICACHE_INDEX_INV_WAR) |
| 262 | r4k_blast_icache_page_indexed = | 264 | r4k_blast_icache_page_indexed = |
| 263 | tx49_blast_icache32_page_indexed; | 265 | tx49_blast_icache32_page_indexed; |
| 266 | else if (current_cpu_type() == CPU_LOONGSON2) | ||
| 267 | r4k_blast_icache_page_indexed = | ||
| 268 | loongson2_blast_icache32_page_indexed; | ||
| 264 | else | 269 | else |
| 265 | r4k_blast_icache_page_indexed = | 270 | r4k_blast_icache_page_indexed = |
| 266 | blast_icache32_page_indexed; | 271 | blast_icache32_page_indexed; |
| @@ -284,6 +289,8 @@ static void r4k_blast_icache_setup(void) | |||
| 284 | r4k_blast_icache = blast_r4600_v1_icache32; | 289 | r4k_blast_icache = blast_r4600_v1_icache32; |
| 285 | else if (TX49XX_ICACHE_INDEX_INV_WAR) | 290 | else if (TX49XX_ICACHE_INDEX_INV_WAR) |
| 286 | r4k_blast_icache = tx49_blast_icache32; | 291 | r4k_blast_icache = tx49_blast_icache32; |
| 292 | else if (current_cpu_type() == CPU_LOONGSON2) | ||
| 293 | r4k_blast_icache = loongson2_blast_icache32; | ||
| 287 | else | 294 | else |
| 288 | r4k_blast_icache = blast_icache32; | 295 | r4k_blast_icache = blast_icache32; |
| 289 | } else if (ic_lsize == 64) | 296 | } else if (ic_lsize == 64) |
| @@ -580,11 +587,11 @@ static inline void local_r4k_flush_icache_range(unsigned long start, unsigned lo | |||
| 580 | else { | 587 | else { |
| 581 | switch (boot_cpu_type()) { | 588 | switch (boot_cpu_type()) { |
| 582 | case CPU_LOONGSON2: | 589 | case CPU_LOONGSON2: |
| 583 | protected_blast_icache_range(start, end); | 590 | protected_loongson2_blast_icache_range(start, end); |
| 584 | break; | 591 | break; |
| 585 | 592 | ||
| 586 | default: | 593 | default: |
| 587 | protected_loongson23_blast_icache_range(start, end); | 594 | protected_blast_icache_range(start, end); |
| 588 | break; | 595 | break; |
| 589 | } | 596 | } |
| 590 | } | 597 | } |
diff --git a/arch/parisc/include/uapi/asm/socket.h b/arch/parisc/include/uapi/asm/socket.h index f33113a6141e..70b3674dac4e 100644 --- a/arch/parisc/include/uapi/asm/socket.h +++ b/arch/parisc/include/uapi/asm/socket.h | |||
| @@ -75,6 +75,6 @@ | |||
| 75 | 75 | ||
| 76 | #define SO_BUSY_POLL 0x4027 | 76 | #define SO_BUSY_POLL 0x4027 |
| 77 | 77 | ||
| 78 | #define SO_MAX_PACING_RATE 0x4048 | 78 | #define SO_MAX_PACING_RATE 0x4028 |
| 79 | 79 | ||
| 80 | #endif /* _UAPI_ASM_SOCKET_H */ | 80 | #endif /* _UAPI_ASM_SOCKET_H */ |
diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c index cb64a6e1dc51..078145acf7fb 100644 --- a/arch/powerpc/kernel/prom_init.c +++ b/arch/powerpc/kernel/prom_init.c | |||
| @@ -1986,19 +1986,23 @@ static void __init prom_init_stdout(void) | |||
| 1986 | /* Get the full OF pathname of the stdout device */ | 1986 | /* Get the full OF pathname of the stdout device */ |
| 1987 | memset(path, 0, 256); | 1987 | memset(path, 0, 256); |
| 1988 | call_prom("instance-to-path", 3, 1, prom.stdout, path, 255); | 1988 | call_prom("instance-to-path", 3, 1, prom.stdout, path, 255); |
| 1989 | stdout_node = call_prom("instance-to-package", 1, 1, prom.stdout); | ||
| 1990 | val = cpu_to_be32(stdout_node); | ||
| 1991 | prom_setprop(prom.chosen, "/chosen", "linux,stdout-package", | ||
| 1992 | &val, sizeof(val)); | ||
| 1993 | prom_printf("OF stdout device is: %s\n", of_stdout_device); | 1989 | prom_printf("OF stdout device is: %s\n", of_stdout_device); |
| 1994 | prom_setprop(prom.chosen, "/chosen", "linux,stdout-path", | 1990 | prom_setprop(prom.chosen, "/chosen", "linux,stdout-path", |
| 1995 | path, strlen(path) + 1); | 1991 | path, strlen(path) + 1); |
| 1996 | 1992 | ||
| 1997 | /* If it's a display, note it */ | 1993 | /* instance-to-package fails on PA-Semi */ |
| 1998 | memset(type, 0, sizeof(type)); | 1994 | stdout_node = call_prom("instance-to-package", 1, 1, prom.stdout); |
| 1999 | prom_getprop(stdout_node, "device_type", type, sizeof(type)); | 1995 | if (stdout_node != PROM_ERROR) { |
| 2000 | if (strcmp(type, "display") == 0) | 1996 | val = cpu_to_be32(stdout_node); |
| 2001 | prom_setprop(stdout_node, path, "linux,boot-display", NULL, 0); | 1997 | prom_setprop(prom.chosen, "/chosen", "linux,stdout-package", |
| 1998 | &val, sizeof(val)); | ||
| 1999 | |||
| 2000 | /* If it's a display, note it */ | ||
| 2001 | memset(type, 0, sizeof(type)); | ||
| 2002 | prom_getprop(stdout_node, "device_type", type, sizeof(type)); | ||
| 2003 | if (strcmp(type, "display") == 0) | ||
| 2004 | prom_setprop(stdout_node, path, "linux,boot-display", NULL, 0); | ||
| 2005 | } | ||
| 2002 | } | 2006 | } |
| 2003 | 2007 | ||
| 2004 | static int __init prom_find_machine_type(void) | 2008 | static int __init prom_find_machine_type(void) |
diff --git a/arch/powerpc/net/bpf_jit_comp.c b/arch/powerpc/net/bpf_jit_comp.c index ac3c2a10dafd..555034f8505e 100644 --- a/arch/powerpc/net/bpf_jit_comp.c +++ b/arch/powerpc/net/bpf_jit_comp.c | |||
| @@ -223,10 +223,11 @@ static int bpf_jit_build_body(struct sk_filter *fp, u32 *image, | |||
| 223 | } | 223 | } |
| 224 | PPC_DIVWU(r_A, r_A, r_X); | 224 | PPC_DIVWU(r_A, r_A, r_X); |
| 225 | break; | 225 | break; |
| 226 | case BPF_S_ALU_DIV_K: /* A = reciprocal_divide(A, K); */ | 226 | case BPF_S_ALU_DIV_K: /* A /= K */ |
| 227 | if (K == 1) | ||
| 228 | break; | ||
| 227 | PPC_LI32(r_scratch1, K); | 229 | PPC_LI32(r_scratch1, K); |
| 228 | /* Top 32 bits of 64bit result -> A */ | 230 | PPC_DIVWU(r_A, r_A, r_scratch1); |
| 229 | PPC_MULHWU(r_A, r_A, r_scratch1); | ||
| 230 | break; | 231 | break; |
| 231 | case BPF_S_ALU_AND_X: | 232 | case BPF_S_ALU_AND_X: |
| 232 | ctx->seen |= SEEN_XREG; | 233 | ctx->seen |= SEEN_XREG; |
diff --git a/arch/s390/net/bpf_jit_comp.c b/arch/s390/net/bpf_jit_comp.c index 16871da37371..708d60e40066 100644 --- a/arch/s390/net/bpf_jit_comp.c +++ b/arch/s390/net/bpf_jit_comp.c | |||
| @@ -368,14 +368,16 @@ static int bpf_jit_insn(struct bpf_jit *jit, struct sock_filter *filter, | |||
| 368 | EMIT4_PCREL(0xa7840000, (jit->ret0_ip - jit->prg)); | 368 | EMIT4_PCREL(0xa7840000, (jit->ret0_ip - jit->prg)); |
| 369 | /* lhi %r4,0 */ | 369 | /* lhi %r4,0 */ |
| 370 | EMIT4(0xa7480000); | 370 | EMIT4(0xa7480000); |
| 371 | /* dr %r4,%r12 */ | 371 | /* dlr %r4,%r12 */ |
| 372 | EMIT2(0x1d4c); | 372 | EMIT4(0xb997004c); |
| 373 | break; | 373 | break; |
| 374 | case BPF_S_ALU_DIV_K: /* A = reciprocal_divide(A, K) */ | 374 | case BPF_S_ALU_DIV_K: /* A /= K */ |
| 375 | /* m %r4,<d(K)>(%r13) */ | 375 | if (K == 1) |
| 376 | EMIT4_DISP(0x5c40d000, EMIT_CONST(K)); | 376 | break; |
| 377 | /* lr %r5,%r4 */ | 377 | /* lhi %r4,0 */ |
| 378 | EMIT2(0x1854); | 378 | EMIT4(0xa7480000); |
| 379 | /* dl %r4,<d(K)>(%r13) */ | ||
| 380 | EMIT6_DISP(0xe340d000, 0x0097, EMIT_CONST(K)); | ||
| 379 | break; | 381 | break; |
| 380 | case BPF_S_ALU_MOD_X: /* A %= X */ | 382 | case BPF_S_ALU_MOD_X: /* A %= X */ |
| 381 | jit->seen |= SEEN_XREG | SEEN_RET0; | 383 | jit->seen |= SEEN_XREG | SEEN_RET0; |
| @@ -385,16 +387,21 @@ static int bpf_jit_insn(struct bpf_jit *jit, struct sock_filter *filter, | |||
| 385 | EMIT4_PCREL(0xa7840000, (jit->ret0_ip - jit->prg)); | 387 | EMIT4_PCREL(0xa7840000, (jit->ret0_ip - jit->prg)); |
| 386 | /* lhi %r4,0 */ | 388 | /* lhi %r4,0 */ |
| 387 | EMIT4(0xa7480000); | 389 | EMIT4(0xa7480000); |
| 388 | /* dr %r4,%r12 */ | 390 | /* dlr %r4,%r12 */ |
| 389 | EMIT2(0x1d4c); | 391 | EMIT4(0xb997004c); |
| 390 | /* lr %r5,%r4 */ | 392 | /* lr %r5,%r4 */ |
| 391 | EMIT2(0x1854); | 393 | EMIT2(0x1854); |
| 392 | break; | 394 | break; |
| 393 | case BPF_S_ALU_MOD_K: /* A %= K */ | 395 | case BPF_S_ALU_MOD_K: /* A %= K */ |
| 396 | if (K == 1) { | ||
| 397 | /* lhi %r5,0 */ | ||
| 398 | EMIT4(0xa7580000); | ||
| 399 | break; | ||
| 400 | } | ||
| 394 | /* lhi %r4,0 */ | 401 | /* lhi %r4,0 */ |
| 395 | EMIT4(0xa7480000); | 402 | EMIT4(0xa7480000); |
| 396 | /* d %r4,<d(K)>(%r13) */ | 403 | /* dl %r4,<d(K)>(%r13) */ |
| 397 | EMIT4_DISP(0x5d40d000, EMIT_CONST(K)); | 404 | EMIT6_DISP(0xe340d000, 0x0097, EMIT_CONST(K)); |
| 398 | /* lr %r5,%r4 */ | 405 | /* lr %r5,%r4 */ |
| 399 | EMIT2(0x1854); | 406 | EMIT2(0x1854); |
| 400 | break; | 407 | break; |
diff --git a/arch/sparc/net/bpf_jit_comp.c b/arch/sparc/net/bpf_jit_comp.c index 218b6b23c378..01fe9946d388 100644 --- a/arch/sparc/net/bpf_jit_comp.c +++ b/arch/sparc/net/bpf_jit_comp.c | |||
| @@ -497,9 +497,20 @@ void bpf_jit_compile(struct sk_filter *fp) | |||
| 497 | case BPF_S_ALU_MUL_K: /* A *= K */ | 497 | case BPF_S_ALU_MUL_K: /* A *= K */ |
| 498 | emit_alu_K(MUL, K); | 498 | emit_alu_K(MUL, K); |
| 499 | break; | 499 | break; |
| 500 | case BPF_S_ALU_DIV_K: /* A /= K */ | 500 | case BPF_S_ALU_DIV_K: /* A /= K with K != 0*/ |
| 501 | emit_alu_K(MUL, K); | 501 | if (K == 1) |
| 502 | emit_read_y(r_A); | 502 | break; |
| 503 | emit_write_y(G0); | ||
| 504 | #ifdef CONFIG_SPARC32 | ||
| 505 | /* The Sparc v8 architecture requires | ||
| 506 | * three instructions between a %y | ||
| 507 | * register write and the first use. | ||
| 508 | */ | ||
| 509 | emit_nop(); | ||
| 510 | emit_nop(); | ||
| 511 | emit_nop(); | ||
| 512 | #endif | ||
| 513 | emit_alu_K(DIV, K); | ||
| 503 | break; | 514 | break; |
| 504 | case BPF_S_ALU_DIV_X: /* A /= X; */ | 515 | case BPF_S_ALU_DIV_X: /* A /= X; */ |
| 505 | emit_cmpi(r_X, 0); | 516 | emit_cmpi(r_X, 0); |
diff --git a/arch/x86/include/asm/fpu-internal.h b/arch/x86/include/asm/fpu-internal.h index c49a613c6452..cea1c76d49bf 100644 --- a/arch/x86/include/asm/fpu-internal.h +++ b/arch/x86/include/asm/fpu-internal.h | |||
| @@ -293,12 +293,13 @@ static inline int restore_fpu_checking(struct task_struct *tsk) | |||
| 293 | /* AMD K7/K8 CPUs don't save/restore FDP/FIP/FOP unless an exception | 293 | /* AMD K7/K8 CPUs don't save/restore FDP/FIP/FOP unless an exception |
| 294 | is pending. Clear the x87 state here by setting it to fixed | 294 | is pending. Clear the x87 state here by setting it to fixed |
| 295 | values. "m" is a random variable that should be in L1 */ | 295 | values. "m" is a random variable that should be in L1 */ |
| 296 | alternative_input( | 296 | if (unlikely(static_cpu_has(X86_FEATURE_FXSAVE_LEAK))) { |
| 297 | ASM_NOP8 ASM_NOP2, | 297 | asm volatile( |
| 298 | "emms\n\t" /* clear stack tags */ | 298 | "fnclex\n\t" |
| 299 | "fildl %P[addr]", /* set F?P to defined value */ | 299 | "emms\n\t" |
| 300 | X86_FEATURE_FXSAVE_LEAK, | 300 | "fildl %P[addr]" /* set F?P to defined value */ |
| 301 | [addr] "m" (tsk->thread.fpu.has_fpu)); | 301 | : : [addr] "m" (tsk->thread.fpu.has_fpu)); |
| 302 | } | ||
| 302 | 303 | ||
| 303 | return fpu_restore_checking(&tsk->thread.fpu); | 304 | return fpu_restore_checking(&tsk->thread.fpu); |
| 304 | } | 305 | } |
diff --git a/arch/x86/kernel/cpu/perf_event_amd_ibs.c b/arch/x86/kernel/cpu/perf_event_amd_ibs.c index e09f0bfb7b8f..4b8e4d3cd6ea 100644 --- a/arch/x86/kernel/cpu/perf_event_amd_ibs.c +++ b/arch/x86/kernel/cpu/perf_event_amd_ibs.c | |||
| @@ -10,6 +10,7 @@ | |||
| 10 | #include <linux/module.h> | 10 | #include <linux/module.h> |
| 11 | #include <linux/pci.h> | 11 | #include <linux/pci.h> |
| 12 | #include <linux/ptrace.h> | 12 | #include <linux/ptrace.h> |
| 13 | #include <linux/syscore_ops.h> | ||
| 13 | 14 | ||
| 14 | #include <asm/apic.h> | 15 | #include <asm/apic.h> |
| 15 | 16 | ||
| @@ -816,6 +817,18 @@ out: | |||
| 816 | return ret; | 817 | return ret; |
| 817 | } | 818 | } |
| 818 | 819 | ||
| 820 | static void ibs_eilvt_setup(void) | ||
| 821 | { | ||
| 822 | /* | ||
| 823 | * Force LVT offset assignment for family 10h: The offsets are | ||
| 824 | * not assigned by the BIOS for this family, so the OS is | ||
| 825 | * responsible for doing it. If the OS assignment fails, fall | ||
| 826 | * back to BIOS settings and try to setup this. | ||
| 827 | */ | ||
| 828 | if (boot_cpu_data.x86 == 0x10) | ||
| 829 | force_ibs_eilvt_setup(); | ||
| 830 | } | ||
| 831 | |||
| 819 | static inline int get_ibs_lvt_offset(void) | 832 | static inline int get_ibs_lvt_offset(void) |
| 820 | { | 833 | { |
| 821 | u64 val; | 834 | u64 val; |
| @@ -851,6 +864,36 @@ static void clear_APIC_ibs(void *dummy) | |||
| 851 | setup_APIC_eilvt(offset, 0, APIC_EILVT_MSG_FIX, 1); | 864 | setup_APIC_eilvt(offset, 0, APIC_EILVT_MSG_FIX, 1); |
| 852 | } | 865 | } |
| 853 | 866 | ||
| 867 | #ifdef CONFIG_PM | ||
| 868 | |||
| 869 | static int perf_ibs_suspend(void) | ||
| 870 | { | ||
| 871 | clear_APIC_ibs(NULL); | ||
| 872 | return 0; | ||
| 873 | } | ||
| 874 | |||
| 875 | static void perf_ibs_resume(void) | ||
| 876 | { | ||
| 877 | ibs_eilvt_setup(); | ||
| 878 | setup_APIC_ibs(NULL); | ||
| 879 | } | ||
| 880 | |||
| 881 | static struct syscore_ops perf_ibs_syscore_ops = { | ||
| 882 | .resume = perf_ibs_resume, | ||
| 883 | .suspend = perf_ibs_suspend, | ||
| 884 | }; | ||
| 885 | |||
| 886 | static void perf_ibs_pm_init(void) | ||
| 887 | { | ||
| 888 | register_syscore_ops(&perf_ibs_syscore_ops); | ||
| 889 | } | ||
| 890 | |||
| 891 | #else | ||
| 892 | |||
| 893 | static inline void perf_ibs_pm_init(void) { } | ||
| 894 | |||
| 895 | #endif | ||
| 896 | |||
| 854 | static int | 897 | static int |
| 855 | perf_ibs_cpu_notifier(struct notifier_block *self, unsigned long action, void *hcpu) | 898 | perf_ibs_cpu_notifier(struct notifier_block *self, unsigned long action, void *hcpu) |
| 856 | { | 899 | { |
| @@ -877,18 +920,12 @@ static __init int amd_ibs_init(void) | |||
| 877 | if (!caps) | 920 | if (!caps) |
| 878 | return -ENODEV; /* ibs not supported by the cpu */ | 921 | return -ENODEV; /* ibs not supported by the cpu */ |
| 879 | 922 | ||
| 880 | /* | 923 | ibs_eilvt_setup(); |
| 881 | * Force LVT offset assignment for family 10h: The offsets are | ||
| 882 | * not assigned by the BIOS for this family, so the OS is | ||
| 883 | * responsible for doing it. If the OS assignment fails, fall | ||
| 884 | * back to BIOS settings and try to setup this. | ||
| 885 | */ | ||
| 886 | if (boot_cpu_data.x86 == 0x10) | ||
| 887 | force_ibs_eilvt_setup(); | ||
| 888 | 924 | ||
| 889 | if (!ibs_eilvt_valid()) | 925 | if (!ibs_eilvt_valid()) |
| 890 | goto out; | 926 | goto out; |
| 891 | 927 | ||
| 928 | perf_ibs_pm_init(); | ||
| 892 | get_online_cpus(); | 929 | get_online_cpus(); |
| 893 | ibs_caps = caps; | 930 | ibs_caps = caps; |
| 894 | /* make ibs_caps visible to other cpus: */ | 931 | /* make ibs_caps visible to other cpus: */ |
diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S index 51e2988c5728..a2a4f4697889 100644 --- a/arch/x86/kernel/entry_32.S +++ b/arch/x86/kernel/entry_32.S | |||
| @@ -1082,7 +1082,7 @@ ENTRY(ftrace_caller) | |||
| 1082 | pushl $0 /* Pass NULL as regs pointer */ | 1082 | pushl $0 /* Pass NULL as regs pointer */ |
| 1083 | movl 4*4(%esp), %eax | 1083 | movl 4*4(%esp), %eax |
| 1084 | movl 0x4(%ebp), %edx | 1084 | movl 0x4(%ebp), %edx |
| 1085 | leal function_trace_op, %ecx | 1085 | movl function_trace_op, %ecx |
| 1086 | subl $MCOUNT_INSN_SIZE, %eax | 1086 | subl $MCOUNT_INSN_SIZE, %eax |
| 1087 | 1087 | ||
| 1088 | .globl ftrace_call | 1088 | .globl ftrace_call |
| @@ -1140,7 +1140,7 @@ ENTRY(ftrace_regs_caller) | |||
| 1140 | movl 12*4(%esp), %eax /* Load ip (1st parameter) */ | 1140 | movl 12*4(%esp), %eax /* Load ip (1st parameter) */ |
| 1141 | subl $MCOUNT_INSN_SIZE, %eax /* Adjust ip */ | 1141 | subl $MCOUNT_INSN_SIZE, %eax /* Adjust ip */ |
| 1142 | movl 0x4(%ebp), %edx /* Load parent ip (2nd parameter) */ | 1142 | movl 0x4(%ebp), %edx /* Load parent ip (2nd parameter) */ |
| 1143 | leal function_trace_op, %ecx /* Save ftrace_pos in 3rd parameter */ | 1143 | movl function_trace_op, %ecx /* Save ftrace_pos in 3rd parameter */ |
| 1144 | pushl %esp /* Save pt_regs as 4th parameter */ | 1144 | pushl %esp /* Save pt_regs as 4th parameter */ |
| 1145 | 1145 | ||
| 1146 | GLOBAL(ftrace_regs_call) | 1146 | GLOBAL(ftrace_regs_call) |
diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index e21b0785a85b..1e96c3628bf2 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S | |||
| @@ -88,7 +88,7 @@ END(function_hook) | |||
| 88 | MCOUNT_SAVE_FRAME \skip | 88 | MCOUNT_SAVE_FRAME \skip |
| 89 | 89 | ||
| 90 | /* Load the ftrace_ops into the 3rd parameter */ | 90 | /* Load the ftrace_ops into the 3rd parameter */ |
| 91 | leaq function_trace_op, %rdx | 91 | movq function_trace_op(%rip), %rdx |
| 92 | 92 | ||
| 93 | /* Load ip into the first parameter */ | 93 | /* Load ip into the first parameter */ |
| 94 | movq RIP(%rsp), %rdi | 94 | movq RIP(%rsp), %rdi |
diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index 1673940cf9c3..775702f649ca 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c | |||
| @@ -1355,7 +1355,7 @@ void kvm_lapic_set_base(struct kvm_vcpu *vcpu, u64 value) | |||
| 1355 | vcpu->arch.apic_base = value; | 1355 | vcpu->arch.apic_base = value; |
| 1356 | 1356 | ||
| 1357 | /* update jump label if enable bit changes */ | 1357 | /* update jump label if enable bit changes */ |
| 1358 | if ((vcpu->arch.apic_base ^ value) & MSR_IA32_APICBASE_ENABLE) { | 1358 | if ((old_value ^ value) & MSR_IA32_APICBASE_ENABLE) { |
| 1359 | if (value & MSR_IA32_APICBASE_ENABLE) | 1359 | if (value & MSR_IA32_APICBASE_ENABLE) |
| 1360 | static_key_slow_dec_deferred(&apic_hw_disabled); | 1360 | static_key_slow_dec_deferred(&apic_hw_disabled); |
| 1361 | else | 1361 | else |
diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c index 9ff85bb8dd69..9d591c895803 100644 --- a/arch/x86/mm/fault.c +++ b/arch/x86/mm/fault.c | |||
| @@ -641,6 +641,20 @@ no_context(struct pt_regs *regs, unsigned long error_code, | |||
| 641 | 641 | ||
| 642 | /* Are we prepared to handle this kernel fault? */ | 642 | /* Are we prepared to handle this kernel fault? */ |
| 643 | if (fixup_exception(regs)) { | 643 | if (fixup_exception(regs)) { |
| 644 | /* | ||
| 645 | * Any interrupt that takes a fault gets the fixup. This makes | ||
| 646 | * the below recursive fault logic only apply to a faults from | ||
| 647 | * task context. | ||
| 648 | */ | ||
| 649 | if (in_interrupt()) | ||
| 650 | return; | ||
| 651 | |||
| 652 | /* | ||
| 653 | * Per the above we're !in_interrupt(), aka. task context. | ||
| 654 | * | ||
| 655 | * In this case we need to make sure we're not recursively | ||
| 656 | * faulting through the emulate_vsyscall() logic. | ||
| 657 | */ | ||
| 644 | if (current_thread_info()->sig_on_uaccess_error && signal) { | 658 | if (current_thread_info()->sig_on_uaccess_error && signal) { |
| 645 | tsk->thread.trap_nr = X86_TRAP_PF; | 659 | tsk->thread.trap_nr = X86_TRAP_PF; |
| 646 | tsk->thread.error_code = error_code | PF_USER; | 660 | tsk->thread.error_code = error_code | PF_USER; |
| @@ -649,6 +663,10 @@ no_context(struct pt_regs *regs, unsigned long error_code, | |||
| 649 | /* XXX: hwpoison faults will set the wrong code. */ | 663 | /* XXX: hwpoison faults will set the wrong code. */ |
| 650 | force_sig_info_fault(signal, si_code, address, tsk, 0); | 664 | force_sig_info_fault(signal, si_code, address, tsk, 0); |
| 651 | } | 665 | } |
| 666 | |||
| 667 | /* | ||
| 668 | * Barring that, we can do the fixup and be happy. | ||
| 669 | */ | ||
| 652 | return; | 670 | return; |
| 653 | } | 671 | } |
| 654 | 672 | ||
diff --git a/arch/x86/net/bpf_jit_comp.c b/arch/x86/net/bpf_jit_comp.c index 26328e800869..4ed75dd81d05 100644 --- a/arch/x86/net/bpf_jit_comp.c +++ b/arch/x86/net/bpf_jit_comp.c | |||
| @@ -359,15 +359,21 @@ void bpf_jit_compile(struct sk_filter *fp) | |||
| 359 | EMIT2(0x89, 0xd0); /* mov %edx,%eax */ | 359 | EMIT2(0x89, 0xd0); /* mov %edx,%eax */ |
| 360 | break; | 360 | break; |
| 361 | case BPF_S_ALU_MOD_K: /* A %= K; */ | 361 | case BPF_S_ALU_MOD_K: /* A %= K; */ |
| 362 | if (K == 1) { | ||
| 363 | CLEAR_A(); | ||
| 364 | break; | ||
| 365 | } | ||
| 362 | EMIT2(0x31, 0xd2); /* xor %edx,%edx */ | 366 | EMIT2(0x31, 0xd2); /* xor %edx,%edx */ |
| 363 | EMIT1(0xb9);EMIT(K, 4); /* mov imm32,%ecx */ | 367 | EMIT1(0xb9);EMIT(K, 4); /* mov imm32,%ecx */ |
| 364 | EMIT2(0xf7, 0xf1); /* div %ecx */ | 368 | EMIT2(0xf7, 0xf1); /* div %ecx */ |
| 365 | EMIT2(0x89, 0xd0); /* mov %edx,%eax */ | 369 | EMIT2(0x89, 0xd0); /* mov %edx,%eax */ |
| 366 | break; | 370 | break; |
| 367 | case BPF_S_ALU_DIV_K: /* A = reciprocal_divide(A, K); */ | 371 | case BPF_S_ALU_DIV_K: /* A /= K */ |
| 368 | EMIT3(0x48, 0x69, 0xc0); /* imul imm32,%rax,%rax */ | 372 | if (K == 1) |
| 369 | EMIT(K, 4); | 373 | break; |
| 370 | EMIT4(0x48, 0xc1, 0xe8, 0x20); /* shr $0x20,%rax */ | 374 | EMIT2(0x31, 0xd2); /* xor %edx,%edx */ |
| 375 | EMIT1(0xb9);EMIT(K, 4); /* mov imm32,%ecx */ | ||
| 376 | EMIT2(0xf7, 0xf1); /* div %ecx */ | ||
| 371 | break; | 377 | break; |
| 372 | case BPF_S_ALU_AND_X: | 378 | case BPF_S_ALU_AND_X: |
| 373 | seen |= SEEN_XREG; | 379 | seen |= SEEN_XREG; |
diff --git a/arch/x86/vdso/vclock_gettime.c b/arch/x86/vdso/vclock_gettime.c index 2ada505067cc..eb5d7a56f8d4 100644 --- a/arch/x86/vdso/vclock_gettime.c +++ b/arch/x86/vdso/vclock_gettime.c | |||
| @@ -178,7 +178,7 @@ notrace static int __always_inline do_realtime(struct timespec *ts) | |||
| 178 | 178 | ||
| 179 | ts->tv_nsec = 0; | 179 | ts->tv_nsec = 0; |
| 180 | do { | 180 | do { |
| 181 | seq = read_seqcount_begin_no_lockdep(>od->seq); | 181 | seq = raw_read_seqcount_begin(>od->seq); |
| 182 | mode = gtod->clock.vclock_mode; | 182 | mode = gtod->clock.vclock_mode; |
| 183 | ts->tv_sec = gtod->wall_time_sec; | 183 | ts->tv_sec = gtod->wall_time_sec; |
| 184 | ns = gtod->wall_time_snsec; | 184 | ns = gtod->wall_time_snsec; |
| @@ -198,7 +198,7 @@ notrace static int do_monotonic(struct timespec *ts) | |||
| 198 | 198 | ||
| 199 | ts->tv_nsec = 0; | 199 | ts->tv_nsec = 0; |
| 200 | do { | 200 | do { |
| 201 | seq = read_seqcount_begin_no_lockdep(>od->seq); | 201 | seq = raw_read_seqcount_begin(>od->seq); |
| 202 | mode = gtod->clock.vclock_mode; | 202 | mode = gtod->clock.vclock_mode; |
| 203 | ts->tv_sec = gtod->monotonic_time_sec; | 203 | ts->tv_sec = gtod->monotonic_time_sec; |
| 204 | ns = gtod->monotonic_time_snsec; | 204 | ns = gtod->monotonic_time_snsec; |
| @@ -214,7 +214,7 @@ notrace static int do_realtime_coarse(struct timespec *ts) | |||
| 214 | { | 214 | { |
| 215 | unsigned long seq; | 215 | unsigned long seq; |
| 216 | do { | 216 | do { |
| 217 | seq = read_seqcount_begin_no_lockdep(>od->seq); | 217 | seq = raw_read_seqcount_begin(>od->seq); |
| 218 | ts->tv_sec = gtod->wall_time_coarse.tv_sec; | 218 | ts->tv_sec = gtod->wall_time_coarse.tv_sec; |
| 219 | ts->tv_nsec = gtod->wall_time_coarse.tv_nsec; | 219 | ts->tv_nsec = gtod->wall_time_coarse.tv_nsec; |
| 220 | } while (unlikely(read_seqcount_retry(>od->seq, seq))); | 220 | } while (unlikely(read_seqcount_retry(>od->seq, seq))); |
| @@ -225,7 +225,7 @@ notrace static int do_monotonic_coarse(struct timespec *ts) | |||
| 225 | { | 225 | { |
| 226 | unsigned long seq; | 226 | unsigned long seq; |
| 227 | do { | 227 | do { |
| 228 | seq = read_seqcount_begin_no_lockdep(>od->seq); | 228 | seq = raw_read_seqcount_begin(>od->seq); |
| 229 | ts->tv_sec = gtod->monotonic_time_coarse.tv_sec; | 229 | ts->tv_sec = gtod->monotonic_time_coarse.tv_sec; |
| 230 | ts->tv_nsec = gtod->monotonic_time_coarse.tv_nsec; | 230 | ts->tv_nsec = gtod->monotonic_time_coarse.tv_nsec; |
| 231 | } while (unlikely(read_seqcount_retry(>od->seq, seq))); | 231 | } while (unlikely(read_seqcount_retry(>od->seq, seq))); |
diff --git a/drivers/acpi/acpi_lpss.c b/drivers/acpi/acpi_lpss.c index e60390597372..6745fe137b9e 100644 --- a/drivers/acpi/acpi_lpss.c +++ b/drivers/acpi/acpi_lpss.c | |||
| @@ -162,7 +162,6 @@ static const struct acpi_device_id acpi_lpss_device_ids[] = { | |||
| 162 | { "80860F14", (unsigned long)&byt_sdio_dev_desc }, | 162 | { "80860F14", (unsigned long)&byt_sdio_dev_desc }, |
| 163 | { "80860F41", (unsigned long)&byt_i2c_dev_desc }, | 163 | { "80860F41", (unsigned long)&byt_i2c_dev_desc }, |
| 164 | { "INT33B2", }, | 164 | { "INT33B2", }, |
| 165 | { "INT33FC", }, | ||
| 166 | 165 | ||
| 167 | { "INT3430", (unsigned long)&lpt_dev_desc }, | 166 | { "INT3430", (unsigned long)&lpt_dev_desc }, |
| 168 | { "INT3431", (unsigned long)&lpt_dev_desc }, | 167 | { "INT3431", (unsigned long)&lpt_dev_desc }, |
diff --git a/drivers/clocksource/cadence_ttc_timer.c b/drivers/clocksource/cadence_ttc_timer.c index b2bb3a4bc205..a92350b55d32 100644 --- a/drivers/clocksource/cadence_ttc_timer.c +++ b/drivers/clocksource/cadence_ttc_timer.c | |||
| @@ -67,11 +67,13 @@ | |||
| 67 | * struct ttc_timer - This definition defines local timer structure | 67 | * struct ttc_timer - This definition defines local timer structure |
| 68 | * | 68 | * |
| 69 | * @base_addr: Base address of timer | 69 | * @base_addr: Base address of timer |
| 70 | * @freq: Timer input clock frequency | ||
| 70 | * @clk: Associated clock source | 71 | * @clk: Associated clock source |
| 71 | * @clk_rate_change_nb Notifier block for clock rate changes | 72 | * @clk_rate_change_nb Notifier block for clock rate changes |
| 72 | */ | 73 | */ |
| 73 | struct ttc_timer { | 74 | struct ttc_timer { |
| 74 | void __iomem *base_addr; | 75 | void __iomem *base_addr; |
| 76 | unsigned long freq; | ||
| 75 | struct clk *clk; | 77 | struct clk *clk; |
| 76 | struct notifier_block clk_rate_change_nb; | 78 | struct notifier_block clk_rate_change_nb; |
| 77 | }; | 79 | }; |
| @@ -196,9 +198,8 @@ static void ttc_set_mode(enum clock_event_mode mode, | |||
| 196 | 198 | ||
| 197 | switch (mode) { | 199 | switch (mode) { |
| 198 | case CLOCK_EVT_MODE_PERIODIC: | 200 | case CLOCK_EVT_MODE_PERIODIC: |
| 199 | ttc_set_interval(timer, | 201 | ttc_set_interval(timer, DIV_ROUND_CLOSEST(ttce->ttc.freq, |
| 200 | DIV_ROUND_CLOSEST(clk_get_rate(ttce->ttc.clk), | 202 | PRESCALE * HZ)); |
| 201 | PRESCALE * HZ)); | ||
| 202 | break; | 203 | break; |
| 203 | case CLOCK_EVT_MODE_ONESHOT: | 204 | case CLOCK_EVT_MODE_ONESHOT: |
| 204 | case CLOCK_EVT_MODE_UNUSED: | 205 | case CLOCK_EVT_MODE_UNUSED: |
| @@ -273,6 +274,8 @@ static void __init ttc_setup_clocksource(struct clk *clk, void __iomem *base) | |||
| 273 | return; | 274 | return; |
| 274 | } | 275 | } |
| 275 | 276 | ||
| 277 | ttccs->ttc.freq = clk_get_rate(ttccs->ttc.clk); | ||
| 278 | |||
| 276 | ttccs->ttc.clk_rate_change_nb.notifier_call = | 279 | ttccs->ttc.clk_rate_change_nb.notifier_call = |
| 277 | ttc_rate_change_clocksource_cb; | 280 | ttc_rate_change_clocksource_cb; |
| 278 | ttccs->ttc.clk_rate_change_nb.next = NULL; | 281 | ttccs->ttc.clk_rate_change_nb.next = NULL; |
| @@ -298,16 +301,14 @@ static void __init ttc_setup_clocksource(struct clk *clk, void __iomem *base) | |||
| 298 | __raw_writel(CNT_CNTRL_RESET, | 301 | __raw_writel(CNT_CNTRL_RESET, |
| 299 | ttccs->ttc.base_addr + TTC_CNT_CNTRL_OFFSET); | 302 | ttccs->ttc.base_addr + TTC_CNT_CNTRL_OFFSET); |
| 300 | 303 | ||
| 301 | err = clocksource_register_hz(&ttccs->cs, | 304 | err = clocksource_register_hz(&ttccs->cs, ttccs->ttc.freq / PRESCALE); |
| 302 | clk_get_rate(ttccs->ttc.clk) / PRESCALE); | ||
| 303 | if (WARN_ON(err)) { | 305 | if (WARN_ON(err)) { |
| 304 | kfree(ttccs); | 306 | kfree(ttccs); |
| 305 | return; | 307 | return; |
| 306 | } | 308 | } |
| 307 | 309 | ||
| 308 | ttc_sched_clock_val_reg = base + TTC_COUNT_VAL_OFFSET; | 310 | ttc_sched_clock_val_reg = base + TTC_COUNT_VAL_OFFSET; |
| 309 | setup_sched_clock(ttc_sched_clock_read, 16, | 311 | setup_sched_clock(ttc_sched_clock_read, 16, ttccs->ttc.freq / PRESCALE); |
| 310 | clk_get_rate(ttccs->ttc.clk) / PRESCALE); | ||
| 311 | } | 312 | } |
| 312 | 313 | ||
| 313 | static int ttc_rate_change_clockevent_cb(struct notifier_block *nb, | 314 | static int ttc_rate_change_clockevent_cb(struct notifier_block *nb, |
| @@ -334,6 +335,9 @@ static int ttc_rate_change_clockevent_cb(struct notifier_block *nb, | |||
| 334 | ndata->new_rate / PRESCALE); | 335 | ndata->new_rate / PRESCALE); |
| 335 | local_irq_restore(flags); | 336 | local_irq_restore(flags); |
| 336 | 337 | ||
| 338 | /* update cached frequency */ | ||
| 339 | ttc->freq = ndata->new_rate; | ||
| 340 | |||
| 337 | /* fall through */ | 341 | /* fall through */ |
| 338 | } | 342 | } |
| 339 | case PRE_RATE_CHANGE: | 343 | case PRE_RATE_CHANGE: |
| @@ -367,6 +371,7 @@ static void __init ttc_setup_clockevent(struct clk *clk, | |||
| 367 | if (clk_notifier_register(ttcce->ttc.clk, | 371 | if (clk_notifier_register(ttcce->ttc.clk, |
| 368 | &ttcce->ttc.clk_rate_change_nb)) | 372 | &ttcce->ttc.clk_rate_change_nb)) |
| 369 | pr_warn("Unable to register clock notifier.\n"); | 373 | pr_warn("Unable to register clock notifier.\n"); |
| 374 | ttcce->ttc.freq = clk_get_rate(ttcce->ttc.clk); | ||
| 370 | 375 | ||
| 371 | ttcce->ttc.base_addr = base; | 376 | ttcce->ttc.base_addr = base; |
| 372 | ttcce->ce.name = "ttc_clockevent"; | 377 | ttcce->ce.name = "ttc_clockevent"; |
| @@ -396,7 +401,7 @@ static void __init ttc_setup_clockevent(struct clk *clk, | |||
| 396 | } | 401 | } |
| 397 | 402 | ||
| 398 | clockevents_config_and_register(&ttcce->ce, | 403 | clockevents_config_and_register(&ttcce->ce, |
| 399 | clk_get_rate(ttcce->ttc.clk) / PRESCALE, 1, 0xfffe); | 404 | ttcce->ttc.freq / PRESCALE, 1, 0xfffe); |
| 400 | } | 405 | } |
| 401 | 406 | ||
| 402 | /** | 407 | /** |
diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c index 85071a1c4547..b0733153dfd2 100644 --- a/drivers/gpu/drm/drm_modes.c +++ b/drivers/gpu/drm/drm_modes.c | |||
| @@ -1041,7 +1041,7 @@ void drm_mode_connector_list_update(struct drm_connector *connector) | |||
| 1041 | /* if equal delete the probed mode */ | 1041 | /* if equal delete the probed mode */ |
| 1042 | mode->status = pmode->status; | 1042 | mode->status = pmode->status; |
| 1043 | /* Merge type bits together */ | 1043 | /* Merge type bits together */ |
| 1044 | mode->type = pmode->type; | 1044 | mode->type |= pmode->type; |
| 1045 | list_del(&pmode->head); | 1045 | list_del(&pmode->head); |
| 1046 | drm_mode_destroy(connector->dev, pmode); | 1046 | drm_mode_destroy(connector->dev, pmode); |
| 1047 | break; | 1047 | break; |
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 5d1dedc02f15..f13d5edc39d5 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
| @@ -2713,6 +2713,8 @@ static void gen8_irq_preinstall(struct drm_device *dev) | |||
| 2713 | #undef GEN8_IRQ_INIT_NDX | 2713 | #undef GEN8_IRQ_INIT_NDX |
| 2714 | 2714 | ||
| 2715 | POSTING_READ(GEN8_PCU_IIR); | 2715 | POSTING_READ(GEN8_PCU_IIR); |
| 2716 | |||
| 2717 | ibx_irq_preinstall(dev); | ||
| 2716 | } | 2718 | } |
| 2717 | 2719 | ||
| 2718 | static void ibx_hpd_irq_setup(struct drm_device *dev) | 2720 | static void ibx_hpd_irq_setup(struct drm_device *dev) |
diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c index 526c8ded16b0..b69dc3e66c16 100644 --- a/drivers/gpu/drm/i915/intel_ddi.c +++ b/drivers/gpu/drm/i915/intel_ddi.c | |||
| @@ -1057,12 +1057,18 @@ void intel_ddi_setup_hw_pll_state(struct drm_device *dev) | |||
| 1057 | enum pipe pipe; | 1057 | enum pipe pipe; |
| 1058 | struct intel_crtc *intel_crtc; | 1058 | struct intel_crtc *intel_crtc; |
| 1059 | 1059 | ||
| 1060 | dev_priv->ddi_plls.spll_refcount = 0; | ||
| 1061 | dev_priv->ddi_plls.wrpll1_refcount = 0; | ||
| 1062 | dev_priv->ddi_plls.wrpll2_refcount = 0; | ||
| 1063 | |||
| 1060 | for_each_pipe(pipe) { | 1064 | for_each_pipe(pipe) { |
| 1061 | intel_crtc = | 1065 | intel_crtc = |
| 1062 | to_intel_crtc(dev_priv->pipe_to_crtc_mapping[pipe]); | 1066 | to_intel_crtc(dev_priv->pipe_to_crtc_mapping[pipe]); |
| 1063 | 1067 | ||
| 1064 | if (!intel_crtc->active) | 1068 | if (!intel_crtc->active) { |
| 1069 | intel_crtc->ddi_pll_sel = PORT_CLK_SEL_NONE; | ||
| 1065 | continue; | 1070 | continue; |
| 1071 | } | ||
| 1066 | 1072 | ||
| 1067 | intel_crtc->ddi_pll_sel = intel_ddi_get_crtc_pll(dev_priv, | 1073 | intel_crtc->ddi_pll_sel = intel_ddi_get_crtc_pll(dev_priv, |
| 1068 | pipe); | 1074 | pipe); |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 769b864465a9..2bde35d34eb9 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -11053,10 +11053,10 @@ void intel_modeset_gem_init(struct drm_device *dev) | |||
| 11053 | 11053 | ||
| 11054 | intel_setup_overlay(dev); | 11054 | intel_setup_overlay(dev); |
| 11055 | 11055 | ||
| 11056 | drm_modeset_lock_all(dev); | 11056 | mutex_lock(&dev->mode_config.mutex); |
| 11057 | drm_mode_config_reset(dev); | 11057 | drm_mode_config_reset(dev); |
| 11058 | intel_modeset_setup_hw_state(dev, false); | 11058 | intel_modeset_setup_hw_state(dev, false); |
| 11059 | drm_modeset_unlock_all(dev); | 11059 | mutex_unlock(&dev->mode_config.mutex); |
| 11060 | } | 11060 | } |
| 11061 | 11061 | ||
| 11062 | void intel_modeset_cleanup(struct drm_device *dev) | 11062 | void intel_modeset_cleanup(struct drm_device *dev) |
diff --git a/drivers/gpu/drm/nouveau/core/include/subdev/i2c.h b/drivers/gpu/drm/nouveau/core/include/subdev/i2c.h index 9fa5da723871..7f50a858b16f 100644 --- a/drivers/gpu/drm/nouveau/core/include/subdev/i2c.h +++ b/drivers/gpu/drm/nouveau/core/include/subdev/i2c.h | |||
| @@ -73,7 +73,7 @@ struct nouveau_i2c { | |||
| 73 | int (*identify)(struct nouveau_i2c *, int index, | 73 | int (*identify)(struct nouveau_i2c *, int index, |
| 74 | const char *what, struct nouveau_i2c_board_info *, | 74 | const char *what, struct nouveau_i2c_board_info *, |
| 75 | bool (*match)(struct nouveau_i2c_port *, | 75 | bool (*match)(struct nouveau_i2c_port *, |
| 76 | struct i2c_board_info *)); | 76 | struct i2c_board_info *, void *), void *); |
| 77 | struct list_head ports; | 77 | struct list_head ports; |
| 78 | }; | 78 | }; |
| 79 | 79 | ||
diff --git a/drivers/gpu/drm/nouveau/core/include/subdev/instmem.h b/drivers/gpu/drm/nouveau/core/include/subdev/instmem.h index ec7a54e91a08..4aca33887aaa 100644 --- a/drivers/gpu/drm/nouveau/core/include/subdev/instmem.h +++ b/drivers/gpu/drm/nouveau/core/include/subdev/instmem.h | |||
| @@ -50,6 +50,13 @@ struct nouveau_instmem { | |||
| 50 | static inline struct nouveau_instmem * | 50 | static inline struct nouveau_instmem * |
| 51 | nouveau_instmem(void *obj) | 51 | nouveau_instmem(void *obj) |
| 52 | { | 52 | { |
| 53 | /* nv04/nv40 impls need to create objects in their constructor, | ||
| 54 | * which is before the subdev pointer is valid | ||
| 55 | */ | ||
| 56 | if (nv_iclass(obj, NV_SUBDEV_CLASS) && | ||
| 57 | nv_subidx(obj) == NVDEV_SUBDEV_INSTMEM) | ||
| 58 | return obj; | ||
| 59 | |||
| 53 | return (void *)nv_device(obj)->subdev[NVDEV_SUBDEV_INSTMEM]; | 60 | return (void *)nv_device(obj)->subdev[NVDEV_SUBDEV_INSTMEM]; |
| 54 | } | 61 | } |
| 55 | 62 | ||
diff --git a/drivers/gpu/drm/nouveau/core/subdev/i2c/base.c b/drivers/gpu/drm/nouveau/core/subdev/i2c/base.c index 041fd5edaebf..c33c03d2f4af 100644 --- a/drivers/gpu/drm/nouveau/core/subdev/i2c/base.c +++ b/drivers/gpu/drm/nouveau/core/subdev/i2c/base.c | |||
| @@ -197,7 +197,7 @@ static int | |||
| 197 | nouveau_i2c_identify(struct nouveau_i2c *i2c, int index, const char *what, | 197 | nouveau_i2c_identify(struct nouveau_i2c *i2c, int index, const char *what, |
| 198 | struct nouveau_i2c_board_info *info, | 198 | struct nouveau_i2c_board_info *info, |
| 199 | bool (*match)(struct nouveau_i2c_port *, | 199 | bool (*match)(struct nouveau_i2c_port *, |
| 200 | struct i2c_board_info *)) | 200 | struct i2c_board_info *, void *), void *data) |
| 201 | { | 201 | { |
| 202 | struct nouveau_i2c_port *port = nouveau_i2c_find(i2c, index); | 202 | struct nouveau_i2c_port *port = nouveau_i2c_find(i2c, index); |
| 203 | int i; | 203 | int i; |
| @@ -221,7 +221,7 @@ nouveau_i2c_identify(struct nouveau_i2c *i2c, int index, const char *what, | |||
| 221 | } | 221 | } |
| 222 | 222 | ||
| 223 | if (nv_probe_i2c(port, info[i].dev.addr) && | 223 | if (nv_probe_i2c(port, info[i].dev.addr) && |
| 224 | (!match || match(port, &info[i].dev))) { | 224 | (!match || match(port, &info[i].dev, data))) { |
| 225 | nv_info(i2c, "detected %s: %s\n", what, | 225 | nv_info(i2c, "detected %s: %s\n", what, |
| 226 | info[i].dev.type); | 226 | info[i].dev.type); |
| 227 | return i; | 227 | return i; |
diff --git a/drivers/gpu/drm/nouveau/core/subdev/mxm/nv50.c b/drivers/gpu/drm/nouveau/core/subdev/mxm/nv50.c index af129c2e8113..64f8b4702bf7 100644 --- a/drivers/gpu/drm/nouveau/core/subdev/mxm/nv50.c +++ b/drivers/gpu/drm/nouveau/core/subdev/mxm/nv50.c | |||
| @@ -100,7 +100,7 @@ mxm_match_dcb(struct nouveau_mxm *mxm, u8 *data, void *info) | |||
| 100 | static int | 100 | static int |
| 101 | mxm_dcb_sanitise_entry(struct nouveau_bios *bios, void *data, int idx, u16 pdcb) | 101 | mxm_dcb_sanitise_entry(struct nouveau_bios *bios, void *data, int idx, u16 pdcb) |
| 102 | { | 102 | { |
| 103 | struct nouveau_mxm *mxm = nouveau_mxm(bios); | 103 | struct nouveau_mxm *mxm = data; |
| 104 | struct context ctx = { .outp = (u32 *)(bios->data + pdcb) }; | 104 | struct context ctx = { .outp = (u32 *)(bios->data + pdcb) }; |
| 105 | u8 type, i2cidx, link, ver, len; | 105 | u8 type, i2cidx, link, ver, len; |
| 106 | u8 *conn; | 106 | u8 *conn; |
| @@ -199,7 +199,7 @@ mxm_dcb_sanitise(struct nouveau_mxm *mxm) | |||
| 199 | return; | 199 | return; |
| 200 | } | 200 | } |
| 201 | 201 | ||
| 202 | dcb_outp_foreach(bios, NULL, mxm_dcb_sanitise_entry); | 202 | dcb_outp_foreach(bios, mxm, mxm_dcb_sanitise_entry); |
| 203 | mxms_foreach(mxm, 0x01, mxm_show_unmatched, NULL); | 203 | mxms_foreach(mxm, 0x01, mxm_show_unmatched, NULL); |
| 204 | } | 204 | } |
| 205 | 205 | ||
diff --git a/drivers/gpu/drm/nouveau/core/subdev/therm/ic.c b/drivers/gpu/drm/nouveau/core/subdev/therm/ic.c index e44ed7b93c6d..7610fc5f8fa2 100644 --- a/drivers/gpu/drm/nouveau/core/subdev/therm/ic.c +++ b/drivers/gpu/drm/nouveau/core/subdev/therm/ic.c | |||
| @@ -29,9 +29,9 @@ | |||
| 29 | 29 | ||
| 30 | static bool | 30 | static bool |
| 31 | probe_monitoring_device(struct nouveau_i2c_port *i2c, | 31 | probe_monitoring_device(struct nouveau_i2c_port *i2c, |
| 32 | struct i2c_board_info *info) | 32 | struct i2c_board_info *info, void *data) |
| 33 | { | 33 | { |
| 34 | struct nouveau_therm_priv *priv = (void *)nouveau_therm(i2c); | 34 | struct nouveau_therm_priv *priv = data; |
| 35 | struct nvbios_therm_sensor *sensor = &priv->bios_sensor; | 35 | struct nvbios_therm_sensor *sensor = &priv->bios_sensor; |
| 36 | struct i2c_client *client; | 36 | struct i2c_client *client; |
| 37 | 37 | ||
| @@ -96,7 +96,7 @@ nouveau_therm_ic_ctor(struct nouveau_therm *therm) | |||
| 96 | }; | 96 | }; |
| 97 | 97 | ||
| 98 | i2c->identify(i2c, NV_I2C_DEFAULT(0), "monitoring device", | 98 | i2c->identify(i2c, NV_I2C_DEFAULT(0), "monitoring device", |
| 99 | board, probe_monitoring_device); | 99 | board, probe_monitoring_device, therm); |
| 100 | if (priv->ic) | 100 | if (priv->ic) |
| 101 | return; | 101 | return; |
| 102 | } | 102 | } |
| @@ -108,7 +108,7 @@ nouveau_therm_ic_ctor(struct nouveau_therm *therm) | |||
| 108 | }; | 108 | }; |
| 109 | 109 | ||
| 110 | i2c->identify(i2c, NV_I2C_DEFAULT(0), "monitoring device", | 110 | i2c->identify(i2c, NV_I2C_DEFAULT(0), "monitoring device", |
| 111 | board, probe_monitoring_device); | 111 | board, probe_monitoring_device, therm); |
| 112 | if (priv->ic) | 112 | if (priv->ic) |
| 113 | return; | 113 | return; |
| 114 | } | 114 | } |
| @@ -117,5 +117,5 @@ nouveau_therm_ic_ctor(struct nouveau_therm *therm) | |||
| 117 | device. Let's try our static list. | 117 | device. Let's try our static list. |
| 118 | */ | 118 | */ |
| 119 | i2c->identify(i2c, NV_I2C_DEFAULT(0), "monitoring device", | 119 | i2c->identify(i2c, NV_I2C_DEFAULT(0), "monitoring device", |
| 120 | nv_board_infos, probe_monitoring_device); | 120 | nv_board_infos, probe_monitoring_device, therm); |
| 121 | } | 121 | } |
diff --git a/drivers/gpu/drm/nouveau/dispnv04/dfp.c b/drivers/gpu/drm/nouveau/dispnv04/dfp.c index 936a71c59080..7fdc51e2a571 100644 --- a/drivers/gpu/drm/nouveau/dispnv04/dfp.c +++ b/drivers/gpu/drm/nouveau/dispnv04/dfp.c | |||
| @@ -643,7 +643,7 @@ static void nv04_tmds_slave_init(struct drm_encoder *encoder) | |||
| 643 | get_tmds_slave(encoder)) | 643 | get_tmds_slave(encoder)) |
| 644 | return; | 644 | return; |
| 645 | 645 | ||
| 646 | type = i2c->identify(i2c, 2, "TMDS transmitter", info, NULL); | 646 | type = i2c->identify(i2c, 2, "TMDS transmitter", info, NULL, NULL); |
| 647 | if (type < 0) | 647 | if (type < 0) |
| 648 | return; | 648 | return; |
| 649 | 649 | ||
diff --git a/drivers/gpu/drm/nouveau/dispnv04/tvnv04.c b/drivers/gpu/drm/nouveau/dispnv04/tvnv04.c index cc4b208ce546..244822df8ffc 100644 --- a/drivers/gpu/drm/nouveau/dispnv04/tvnv04.c +++ b/drivers/gpu/drm/nouveau/dispnv04/tvnv04.c | |||
| @@ -59,7 +59,7 @@ int nv04_tv_identify(struct drm_device *dev, int i2c_index) | |||
| 59 | struct nouveau_i2c *i2c = nouveau_i2c(drm->device); | 59 | struct nouveau_i2c *i2c = nouveau_i2c(drm->device); |
| 60 | 60 | ||
| 61 | return i2c->identify(i2c, i2c_index, "TV encoder", | 61 | return i2c->identify(i2c, i2c_index, "TV encoder", |
| 62 | nv04_tv_encoder_info, NULL); | 62 | nv04_tv_encoder_info, NULL, NULL); |
| 63 | } | 63 | } |
| 64 | 64 | ||
| 65 | 65 | ||
diff --git a/drivers/hwmon/coretemp.c b/drivers/hwmon/coretemp.c index 78be66176840..942509892895 100644 --- a/drivers/hwmon/coretemp.c +++ b/drivers/hwmon/coretemp.c | |||
| @@ -52,7 +52,7 @@ MODULE_PARM_DESC(tjmax, "TjMax value in degrees Celsius"); | |||
| 52 | 52 | ||
| 53 | #define BASE_SYSFS_ATTR_NO 2 /* Sysfs Base attr no for coretemp */ | 53 | #define BASE_SYSFS_ATTR_NO 2 /* Sysfs Base attr no for coretemp */ |
| 54 | #define NUM_REAL_CORES 32 /* Number of Real cores per cpu */ | 54 | #define NUM_REAL_CORES 32 /* Number of Real cores per cpu */ |
| 55 | #define CORETEMP_NAME_LENGTH 17 /* String Length of attrs */ | 55 | #define CORETEMP_NAME_LENGTH 19 /* String Length of attrs */ |
| 56 | #define MAX_CORE_ATTRS 4 /* Maximum no of basic attrs */ | 56 | #define MAX_CORE_ATTRS 4 /* Maximum no of basic attrs */ |
| 57 | #define TOTAL_ATTRS (MAX_CORE_ATTRS + 1) | 57 | #define TOTAL_ATTRS (MAX_CORE_ATTRS + 1) |
| 58 | #define MAX_CORE_DATA (NUM_REAL_CORES + BASE_SYSFS_ATTR_NO) | 58 | #define MAX_CORE_DATA (NUM_REAL_CORES + BASE_SYSFS_ATTR_NO) |
diff --git a/drivers/md/md.c b/drivers/md/md.c index 21f4d7ff0da2..369d919bdafe 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
| @@ -1077,6 +1077,7 @@ static int super_90_validate(struct mddev *mddev, struct md_rdev *rdev) | |||
| 1077 | rdev->raid_disk = -1; | 1077 | rdev->raid_disk = -1; |
| 1078 | clear_bit(Faulty, &rdev->flags); | 1078 | clear_bit(Faulty, &rdev->flags); |
| 1079 | clear_bit(In_sync, &rdev->flags); | 1079 | clear_bit(In_sync, &rdev->flags); |
| 1080 | clear_bit(Bitmap_sync, &rdev->flags); | ||
| 1080 | clear_bit(WriteMostly, &rdev->flags); | 1081 | clear_bit(WriteMostly, &rdev->flags); |
| 1081 | 1082 | ||
| 1082 | if (mddev->raid_disks == 0) { | 1083 | if (mddev->raid_disks == 0) { |
| @@ -1155,6 +1156,8 @@ static int super_90_validate(struct mddev *mddev, struct md_rdev *rdev) | |||
| 1155 | */ | 1156 | */ |
| 1156 | if (ev1 < mddev->bitmap->events_cleared) | 1157 | if (ev1 < mddev->bitmap->events_cleared) |
| 1157 | return 0; | 1158 | return 0; |
| 1159 | if (ev1 < mddev->events) | ||
| 1160 | set_bit(Bitmap_sync, &rdev->flags); | ||
| 1158 | } else { | 1161 | } else { |
| 1159 | if (ev1 < mddev->events) | 1162 | if (ev1 < mddev->events) |
| 1160 | /* just a hot-add of a new device, leave raid_disk at -1 */ | 1163 | /* just a hot-add of a new device, leave raid_disk at -1 */ |
| @@ -1563,6 +1566,7 @@ static int super_1_validate(struct mddev *mddev, struct md_rdev *rdev) | |||
| 1563 | rdev->raid_disk = -1; | 1566 | rdev->raid_disk = -1; |
| 1564 | clear_bit(Faulty, &rdev->flags); | 1567 | clear_bit(Faulty, &rdev->flags); |
| 1565 | clear_bit(In_sync, &rdev->flags); | 1568 | clear_bit(In_sync, &rdev->flags); |
| 1569 | clear_bit(Bitmap_sync, &rdev->flags); | ||
| 1566 | clear_bit(WriteMostly, &rdev->flags); | 1570 | clear_bit(WriteMostly, &rdev->flags); |
| 1567 | 1571 | ||
| 1568 | if (mddev->raid_disks == 0) { | 1572 | if (mddev->raid_disks == 0) { |
| @@ -1645,6 +1649,8 @@ static int super_1_validate(struct mddev *mddev, struct md_rdev *rdev) | |||
| 1645 | */ | 1649 | */ |
| 1646 | if (ev1 < mddev->bitmap->events_cleared) | 1650 | if (ev1 < mddev->bitmap->events_cleared) |
| 1647 | return 0; | 1651 | return 0; |
| 1652 | if (ev1 < mddev->events) | ||
| 1653 | set_bit(Bitmap_sync, &rdev->flags); | ||
| 1648 | } else { | 1654 | } else { |
| 1649 | if (ev1 < mddev->events) | 1655 | if (ev1 < mddev->events) |
| 1650 | /* just a hot-add of a new device, leave raid_disk at -1 */ | 1656 | /* just a hot-add of a new device, leave raid_disk at -1 */ |
| @@ -2788,6 +2794,7 @@ slot_store(struct md_rdev *rdev, const char *buf, size_t len) | |||
| 2788 | else | 2794 | else |
| 2789 | rdev->saved_raid_disk = -1; | 2795 | rdev->saved_raid_disk = -1; |
| 2790 | clear_bit(In_sync, &rdev->flags); | 2796 | clear_bit(In_sync, &rdev->flags); |
| 2797 | clear_bit(Bitmap_sync, &rdev->flags); | ||
| 2791 | err = rdev->mddev->pers-> | 2798 | err = rdev->mddev->pers-> |
| 2792 | hot_add_disk(rdev->mddev, rdev); | 2799 | hot_add_disk(rdev->mddev, rdev); |
| 2793 | if (err) { | 2800 | if (err) { |
| @@ -5760,6 +5767,7 @@ static int add_new_disk(struct mddev * mddev, mdu_disk_info_t *info) | |||
| 5760 | info->raid_disk < mddev->raid_disks) { | 5767 | info->raid_disk < mddev->raid_disks) { |
| 5761 | rdev->raid_disk = info->raid_disk; | 5768 | rdev->raid_disk = info->raid_disk; |
| 5762 | set_bit(In_sync, &rdev->flags); | 5769 | set_bit(In_sync, &rdev->flags); |
| 5770 | clear_bit(Bitmap_sync, &rdev->flags); | ||
| 5763 | } else | 5771 | } else |
| 5764 | rdev->raid_disk = -1; | 5772 | rdev->raid_disk = -1; |
| 5765 | } else | 5773 | } else |
| @@ -7706,7 +7714,8 @@ static int remove_and_add_spares(struct mddev *mddev, | |||
| 7706 | if (test_bit(Faulty, &rdev->flags)) | 7714 | if (test_bit(Faulty, &rdev->flags)) |
| 7707 | continue; | 7715 | continue; |
| 7708 | if (mddev->ro && | 7716 | if (mddev->ro && |
| 7709 | rdev->saved_raid_disk < 0) | 7717 | ! (rdev->saved_raid_disk >= 0 && |
| 7718 | !test_bit(Bitmap_sync, &rdev->flags))) | ||
| 7710 | continue; | 7719 | continue; |
| 7711 | 7720 | ||
| 7712 | rdev->recovery_offset = 0; | 7721 | rdev->recovery_offset = 0; |
| @@ -7787,9 +7796,12 @@ void md_check_recovery(struct mddev *mddev) | |||
| 7787 | * As we only add devices that are already in-sync, | 7796 | * As we only add devices that are already in-sync, |
| 7788 | * we can activate the spares immediately. | 7797 | * we can activate the spares immediately. |
| 7789 | */ | 7798 | */ |
| 7790 | clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery); | ||
| 7791 | remove_and_add_spares(mddev, NULL); | 7799 | remove_and_add_spares(mddev, NULL); |
| 7792 | mddev->pers->spare_active(mddev); | 7800 | /* There is no thread, but we need to call |
| 7801 | * ->spare_active and clear saved_raid_disk | ||
| 7802 | */ | ||
| 7803 | md_reap_sync_thread(mddev); | ||
| 7804 | clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery); | ||
| 7793 | goto unlock; | 7805 | goto unlock; |
| 7794 | } | 7806 | } |
| 7795 | 7807 | ||
diff --git a/drivers/md/md.h b/drivers/md/md.h index 2f5cc8a7ef3e..0095ec84ffc7 100644 --- a/drivers/md/md.h +++ b/drivers/md/md.h | |||
| @@ -129,6 +129,9 @@ struct md_rdev { | |||
| 129 | enum flag_bits { | 129 | enum flag_bits { |
| 130 | Faulty, /* device is known to have a fault */ | 130 | Faulty, /* device is known to have a fault */ |
| 131 | In_sync, /* device is in_sync with rest of array */ | 131 | In_sync, /* device is in_sync with rest of array */ |
| 132 | Bitmap_sync, /* ..actually, not quite In_sync. Need a | ||
| 133 | * bitmap-based recovery to get fully in sync | ||
| 134 | */ | ||
| 132 | Unmerged, /* device is being added to array and should | 135 | Unmerged, /* device is being added to array and should |
| 133 | * be considerred for bvec_merge_fn but not | 136 | * be considerred for bvec_merge_fn but not |
| 134 | * yet for actual IO | 137 | * yet for actual IO |
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 1e5a540995e9..a49cfcc7a343 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
| @@ -924,9 +924,8 @@ static sector_t wait_barrier(struct r1conf *conf, struct bio *bio) | |||
| 924 | conf->next_window_requests++; | 924 | conf->next_window_requests++; |
| 925 | else | 925 | else |
| 926 | conf->current_window_requests++; | 926 | conf->current_window_requests++; |
| 927 | } | ||
| 928 | if (bio->bi_sector >= conf->start_next_window) | ||
| 929 | sector = conf->start_next_window; | 927 | sector = conf->start_next_window; |
| 928 | } | ||
| 930 | } | 929 | } |
| 931 | 930 | ||
| 932 | conf->nr_pending++; | 931 | conf->nr_pending++; |
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index c504e8389e69..06eeb99ea6fc 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c | |||
| @@ -1319,7 +1319,7 @@ read_again: | |||
| 1319 | /* Could not read all from this device, so we will | 1319 | /* Could not read all from this device, so we will |
| 1320 | * need another r10_bio. | 1320 | * need another r10_bio. |
| 1321 | */ | 1321 | */ |
| 1322 | sectors_handled = (r10_bio->sectors + max_sectors | 1322 | sectors_handled = (r10_bio->sector + max_sectors |
| 1323 | - bio->bi_sector); | 1323 | - bio->bi_sector); |
| 1324 | r10_bio->sectors = max_sectors; | 1324 | r10_bio->sectors = max_sectors; |
| 1325 | spin_lock_irq(&conf->device_lock); | 1325 | spin_lock_irq(&conf->device_lock); |
| @@ -1327,7 +1327,7 @@ read_again: | |||
| 1327 | bio->bi_phys_segments = 2; | 1327 | bio->bi_phys_segments = 2; |
| 1328 | else | 1328 | else |
| 1329 | bio->bi_phys_segments++; | 1329 | bio->bi_phys_segments++; |
| 1330 | spin_unlock(&conf->device_lock); | 1330 | spin_unlock_irq(&conf->device_lock); |
| 1331 | /* Cannot call generic_make_request directly | 1331 | /* Cannot call generic_make_request directly |
| 1332 | * as that will be queued in __generic_make_request | 1332 | * as that will be queued in __generic_make_request |
| 1333 | * and subsequent mempool_alloc might block | 1333 | * and subsequent mempool_alloc might block |
| @@ -3218,10 +3218,6 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr, | |||
| 3218 | if (j == conf->copies) { | 3218 | if (j == conf->copies) { |
| 3219 | /* Cannot recover, so abort the recovery or | 3219 | /* Cannot recover, so abort the recovery or |
| 3220 | * record a bad block */ | 3220 | * record a bad block */ |
| 3221 | put_buf(r10_bio); | ||
| 3222 | if (rb2) | ||
| 3223 | atomic_dec(&rb2->remaining); | ||
| 3224 | r10_bio = rb2; | ||
| 3225 | if (any_working) { | 3221 | if (any_working) { |
| 3226 | /* problem is that there are bad blocks | 3222 | /* problem is that there are bad blocks |
| 3227 | * on other device(s) | 3223 | * on other device(s) |
| @@ -3253,6 +3249,10 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr, | |||
| 3253 | mirror->recovery_disabled | 3249 | mirror->recovery_disabled |
| 3254 | = mddev->recovery_disabled; | 3250 | = mddev->recovery_disabled; |
| 3255 | } | 3251 | } |
| 3252 | put_buf(r10_bio); | ||
| 3253 | if (rb2) | ||
| 3254 | atomic_dec(&rb2->remaining); | ||
| 3255 | r10_bio = rb2; | ||
| 3256 | break; | 3256 | break; |
| 3257 | } | 3257 | } |
| 3258 | } | 3258 | } |
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index cc055da02e2a..cbb15716a5db 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
| @@ -687,7 +687,8 @@ get_active_stripe(struct r5conf *conf, sector_t sector, | |||
| 687 | } else { | 687 | } else { |
| 688 | if (!test_bit(STRIPE_HANDLE, &sh->state)) | 688 | if (!test_bit(STRIPE_HANDLE, &sh->state)) |
| 689 | atomic_inc(&conf->active_stripes); | 689 | atomic_inc(&conf->active_stripes); |
| 690 | BUG_ON(list_empty(&sh->lru)); | 690 | BUG_ON(list_empty(&sh->lru) && |
| 691 | !test_bit(STRIPE_EXPANDING, &sh->state)); | ||
| 691 | list_del_init(&sh->lru); | 692 | list_del_init(&sh->lru); |
| 692 | if (sh->group) { | 693 | if (sh->group) { |
| 693 | sh->group->stripes_cnt--; | 694 | sh->group->stripes_cnt--; |
| @@ -3608,7 +3609,7 @@ static void analyse_stripe(struct stripe_head *sh, struct stripe_head_state *s) | |||
| 3608 | */ | 3609 | */ |
| 3609 | set_bit(R5_Insync, &dev->flags); | 3610 | set_bit(R5_Insync, &dev->flags); |
| 3610 | 3611 | ||
| 3611 | if (rdev && test_bit(R5_WriteError, &dev->flags)) { | 3612 | if (test_bit(R5_WriteError, &dev->flags)) { |
| 3612 | /* This flag does not apply to '.replacement' | 3613 | /* This flag does not apply to '.replacement' |
| 3613 | * only to .rdev, so make sure to check that*/ | 3614 | * only to .rdev, so make sure to check that*/ |
| 3614 | struct md_rdev *rdev2 = rcu_dereference( | 3615 | struct md_rdev *rdev2 = rcu_dereference( |
| @@ -3621,7 +3622,7 @@ static void analyse_stripe(struct stripe_head *sh, struct stripe_head_state *s) | |||
| 3621 | } else | 3622 | } else |
| 3622 | clear_bit(R5_WriteError, &dev->flags); | 3623 | clear_bit(R5_WriteError, &dev->flags); |
| 3623 | } | 3624 | } |
| 3624 | if (rdev && test_bit(R5_MadeGood, &dev->flags)) { | 3625 | if (test_bit(R5_MadeGood, &dev->flags)) { |
| 3625 | /* This flag does not apply to '.replacement' | 3626 | /* This flag does not apply to '.replacement' |
| 3626 | * only to .rdev, so make sure to check that*/ | 3627 | * only to .rdev, so make sure to check that*/ |
| 3627 | struct md_rdev *rdev2 = rcu_dereference( | 3628 | struct md_rdev *rdev2 = rcu_dereference( |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c index 8b3107b2fcc1..0067b975873f 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | |||
| @@ -12942,25 +12942,26 @@ static void __bnx2x_remove(struct pci_dev *pdev, | |||
| 12942 | pci_set_power_state(pdev, PCI_D3hot); | 12942 | pci_set_power_state(pdev, PCI_D3hot); |
| 12943 | } | 12943 | } |
| 12944 | 12944 | ||
| 12945 | if (bp->regview) | 12945 | if (remove_netdev) { |
| 12946 | iounmap(bp->regview); | 12946 | if (bp->regview) |
| 12947 | iounmap(bp->regview); | ||
| 12947 | 12948 | ||
| 12948 | /* for vf doorbells are part of the regview and were unmapped along with | 12949 | /* For vfs, doorbells are part of the regview and were unmapped |
| 12949 | * it. FW is only loaded by PF. | 12950 | * along with it. FW is only loaded by PF. |
| 12950 | */ | 12951 | */ |
| 12951 | if (IS_PF(bp)) { | 12952 | if (IS_PF(bp)) { |
| 12952 | if (bp->doorbells) | 12953 | if (bp->doorbells) |
| 12953 | iounmap(bp->doorbells); | 12954 | iounmap(bp->doorbells); |
| 12954 | 12955 | ||
| 12955 | bnx2x_release_firmware(bp); | 12956 | bnx2x_release_firmware(bp); |
| 12956 | } | 12957 | } |
| 12957 | bnx2x_free_mem_bp(bp); | 12958 | bnx2x_free_mem_bp(bp); |
| 12958 | 12959 | ||
| 12959 | if (remove_netdev) | ||
| 12960 | free_netdev(dev); | 12960 | free_netdev(dev); |
| 12961 | 12961 | ||
| 12962 | if (atomic_read(&pdev->enable_cnt) == 1) | 12962 | if (atomic_read(&pdev->enable_cnt) == 1) |
| 12963 | pci_release_regions(pdev); | 12963 | pci_release_regions(pdev); |
| 12964 | } | ||
| 12964 | 12965 | ||
| 12965 | pci_disable_device(pdev); | 12966 | pci_disable_device(pdev); |
| 12966 | } | 12967 | } |
diff --git a/drivers/net/ethernet/chelsio/cxgb4/l2t.c b/drivers/net/ethernet/chelsio/cxgb4/l2t.c index cb05be905def..81e8402a74b4 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/l2t.c +++ b/drivers/net/ethernet/chelsio/cxgb4/l2t.c | |||
| @@ -423,7 +423,7 @@ u64 cxgb4_select_ntuple(struct net_device *dev, | |||
| 423 | * in the Compressed Filter Tuple. | 423 | * in the Compressed Filter Tuple. |
| 424 | */ | 424 | */ |
| 425 | if (tp->vlan_shift >= 0 && l2t->vlan != VLAN_NONE) | 425 | if (tp->vlan_shift >= 0 && l2t->vlan != VLAN_NONE) |
| 426 | ntuple |= (F_FT_VLAN_VLD | l2t->vlan) << tp->vlan_shift; | 426 | ntuple |= (u64)(F_FT_VLAN_VLD | l2t->vlan) << tp->vlan_shift; |
| 427 | 427 | ||
| 428 | if (tp->port_shift >= 0) | 428 | if (tp->port_shift >= 0) |
| 429 | ntuple |= (u64)l2t->lport << tp->port_shift; | 429 | ntuple |= (u64)l2t->lport << tp->port_shift; |
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index bf40fdaecfa3..a37039d353c5 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c | |||
| @@ -1776,6 +1776,7 @@ static void be_post_rx_frags(struct be_rx_obj *rxo, gfp_t gfp) | |||
| 1776 | struct be_rx_page_info *page_info = NULL, *prev_page_info = NULL; | 1776 | struct be_rx_page_info *page_info = NULL, *prev_page_info = NULL; |
| 1777 | struct be_queue_info *rxq = &rxo->q; | 1777 | struct be_queue_info *rxq = &rxo->q; |
| 1778 | struct page *pagep = NULL; | 1778 | struct page *pagep = NULL; |
| 1779 | struct device *dev = &adapter->pdev->dev; | ||
| 1779 | struct be_eth_rx_d *rxd; | 1780 | struct be_eth_rx_d *rxd; |
| 1780 | u64 page_dmaaddr = 0, frag_dmaaddr; | 1781 | u64 page_dmaaddr = 0, frag_dmaaddr; |
| 1781 | u32 posted, page_offset = 0; | 1782 | u32 posted, page_offset = 0; |
| @@ -1788,9 +1789,15 @@ static void be_post_rx_frags(struct be_rx_obj *rxo, gfp_t gfp) | |||
| 1788 | rx_stats(rxo)->rx_post_fail++; | 1789 | rx_stats(rxo)->rx_post_fail++; |
| 1789 | break; | 1790 | break; |
| 1790 | } | 1791 | } |
| 1791 | page_dmaaddr = dma_map_page(&adapter->pdev->dev, pagep, | 1792 | page_dmaaddr = dma_map_page(dev, pagep, 0, |
| 1792 | 0, adapter->big_page_size, | 1793 | adapter->big_page_size, |
| 1793 | DMA_FROM_DEVICE); | 1794 | DMA_FROM_DEVICE); |
| 1795 | if (dma_mapping_error(dev, page_dmaaddr)) { | ||
| 1796 | put_page(pagep); | ||
| 1797 | pagep = NULL; | ||
| 1798 | rx_stats(rxo)->rx_post_fail++; | ||
| 1799 | break; | ||
| 1800 | } | ||
| 1794 | page_info->page_offset = 0; | 1801 | page_info->page_offset = 0; |
| 1795 | } else { | 1802 | } else { |
| 1796 | get_page(pagep); | 1803 | get_page(pagep); |
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c index c30d41d6e426..6d14eea17918 100644 --- a/drivers/net/ethernet/intel/e1000e/netdev.c +++ b/drivers/net/ethernet/intel/e1000e/netdev.c | |||
| @@ -6174,7 +6174,7 @@ static int __e1000_resume(struct pci_dev *pdev) | |||
| 6174 | return 0; | 6174 | return 0; |
| 6175 | } | 6175 | } |
| 6176 | 6176 | ||
| 6177 | #ifdef CONFIG_PM | 6177 | #ifdef CONFIG_PM_SLEEP |
| 6178 | static int e1000_suspend(struct device *dev) | 6178 | static int e1000_suspend(struct device *dev) |
| 6179 | { | 6179 | { |
| 6180 | struct pci_dev *pdev = to_pci_dev(dev); | 6180 | struct pci_dev *pdev = to_pci_dev(dev); |
| @@ -6193,7 +6193,7 @@ static int e1000_resume(struct device *dev) | |||
| 6193 | 6193 | ||
| 6194 | return __e1000_resume(pdev); | 6194 | return __e1000_resume(pdev); |
| 6195 | } | 6195 | } |
| 6196 | #endif /* CONFIG_PM */ | 6196 | #endif /* CONFIG_PM_SLEEP */ |
| 6197 | 6197 | ||
| 6198 | #ifdef CONFIG_PM_RUNTIME | 6198 | #ifdef CONFIG_PM_RUNTIME |
| 6199 | static int e1000_runtime_suspend(struct device *dev) | 6199 | static int e1000_runtime_suspend(struct device *dev) |
| @@ -7015,13 +7015,11 @@ static DEFINE_PCI_DEVICE_TABLE(e1000_pci_tbl) = { | |||
| 7015 | }; | 7015 | }; |
| 7016 | MODULE_DEVICE_TABLE(pci, e1000_pci_tbl); | 7016 | MODULE_DEVICE_TABLE(pci, e1000_pci_tbl); |
| 7017 | 7017 | ||
| 7018 | #ifdef CONFIG_PM | ||
| 7019 | static const struct dev_pm_ops e1000_pm_ops = { | 7018 | static const struct dev_pm_ops e1000_pm_ops = { |
| 7020 | SET_SYSTEM_SLEEP_PM_OPS(e1000_suspend, e1000_resume) | 7019 | SET_SYSTEM_SLEEP_PM_OPS(e1000_suspend, e1000_resume) |
| 7021 | SET_RUNTIME_PM_OPS(e1000_runtime_suspend, e1000_runtime_resume, | 7020 | SET_RUNTIME_PM_OPS(e1000_runtime_suspend, e1000_runtime_resume, |
| 7022 | e1000_idle) | 7021 | e1000_idle) |
| 7023 | }; | 7022 | }; |
| 7024 | #endif | ||
| 7025 | 7023 | ||
| 7026 | /* PCI Device API Driver */ | 7024 | /* PCI Device API Driver */ |
| 7027 | static struct pci_driver e1000_driver = { | 7025 | static struct pci_driver e1000_driver = { |
| @@ -7029,11 +7027,9 @@ static struct pci_driver e1000_driver = { | |||
| 7029 | .id_table = e1000_pci_tbl, | 7027 | .id_table = e1000_pci_tbl, |
| 7030 | .probe = e1000_probe, | 7028 | .probe = e1000_probe, |
| 7031 | .remove = e1000_remove, | 7029 | .remove = e1000_remove, |
| 7032 | #ifdef CONFIG_PM | ||
| 7033 | .driver = { | 7030 | .driver = { |
| 7034 | .pm = &e1000_pm_ops, | 7031 | .pm = &e1000_pm_ops, |
| 7035 | }, | 7032 | }, |
| 7036 | #endif | ||
| 7037 | .shutdown = e1000_shutdown, | 7033 | .shutdown = e1000_shutdown, |
| 7038 | .err_handler = &e1000_err_handler | 7034 | .err_handler = &e1000_err_handler |
| 7039 | }; | 7035 | }; |
diff --git a/drivers/net/ethernet/qlogic/qlge/qlge_main.c b/drivers/net/ethernet/qlogic/qlge/qlge_main.c index 449f506d2e8f..f705aeeba767 100644 --- a/drivers/net/ethernet/qlogic/qlge/qlge_main.c +++ b/drivers/net/ethernet/qlogic/qlge/qlge_main.c | |||
| @@ -4765,6 +4765,8 @@ static int qlge_probe(struct pci_dev *pdev, | |||
| 4765 | NETIF_F_RXCSUM; | 4765 | NETIF_F_RXCSUM; |
| 4766 | ndev->features = ndev->hw_features; | 4766 | ndev->features = ndev->hw_features; |
| 4767 | ndev->vlan_features = ndev->hw_features; | 4767 | ndev->vlan_features = ndev->hw_features; |
| 4768 | /* vlan gets same features (except vlan filter) */ | ||
| 4769 | ndev->vlan_features &= ~NETIF_F_HW_VLAN_CTAG_FILTER; | ||
| 4768 | 4770 | ||
| 4769 | if (test_bit(QL_DMA64, &qdev->flags)) | 4771 | if (test_bit(QL_DMA64, &qdev->flags)) |
| 4770 | ndev->features |= NETIF_F_HIGHDMA; | 4772 | ndev->features |= NETIF_F_HIGHDMA; |
diff --git a/drivers/net/ethernet/via/via-rhine.c b/drivers/net/ethernet/via/via-rhine.c index cce6c4bc556a..ef312bc6b865 100644 --- a/drivers/net/ethernet/via/via-rhine.c +++ b/drivers/net/ethernet/via/via-rhine.c | |||
| @@ -1618,6 +1618,7 @@ static void rhine_reset_task(struct work_struct *work) | |||
| 1618 | goto out_unlock; | 1618 | goto out_unlock; |
| 1619 | 1619 | ||
| 1620 | napi_disable(&rp->napi); | 1620 | napi_disable(&rp->napi); |
| 1621 | netif_tx_disable(dev); | ||
| 1621 | spin_lock_bh(&rp->lock); | 1622 | spin_lock_bh(&rp->lock); |
| 1622 | 1623 | ||
| 1623 | /* clear all descriptors */ | 1624 | /* clear all descriptors */ |
diff --git a/drivers/net/usb/dm9601.c b/drivers/net/usb/dm9601.c index 14aa48fa8d7e..e80219877730 100644 --- a/drivers/net/usb/dm9601.c +++ b/drivers/net/usb/dm9601.c | |||
| @@ -614,6 +614,18 @@ static const struct usb_device_id products[] = { | |||
| 614 | USB_DEVICE(0x0a46, 0x9621), /* DM9621A USB to Fast Ethernet Adapter */ | 614 | USB_DEVICE(0x0a46, 0x9621), /* DM9621A USB to Fast Ethernet Adapter */ |
| 615 | .driver_info = (unsigned long)&dm9601_info, | 615 | .driver_info = (unsigned long)&dm9601_info, |
| 616 | }, | 616 | }, |
| 617 | { | ||
| 618 | USB_DEVICE(0x0a46, 0x9622), /* DM9622 USB to Fast Ethernet Adapter */ | ||
| 619 | .driver_info = (unsigned long)&dm9601_info, | ||
| 620 | }, | ||
| 621 | { | ||
| 622 | USB_DEVICE(0x0a46, 0x0269), /* DM962OA USB to Fast Ethernet Adapter */ | ||
| 623 | .driver_info = (unsigned long)&dm9601_info, | ||
| 624 | }, | ||
| 625 | { | ||
| 626 | USB_DEVICE(0x0a46, 0x1269), /* DM9621A USB to Fast Ethernet Adapter */ | ||
| 627 | .driver_info = (unsigned long)&dm9601_info, | ||
| 628 | }, | ||
| 617 | {}, // END | 629 | {}, // END |
| 618 | }; | 630 | }; |
| 619 | 631 | ||
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index 8494bb53ebdc..aba04f561760 100644 --- a/drivers/net/usb/usbnet.c +++ b/drivers/net/usb/usbnet.c | |||
| @@ -1245,7 +1245,7 @@ static int build_dma_sg(const struct sk_buff *skb, struct urb *urb) | |||
| 1245 | return -ENOMEM; | 1245 | return -ENOMEM; |
| 1246 | 1246 | ||
| 1247 | urb->num_sgs = num_sgs; | 1247 | urb->num_sgs = num_sgs; |
| 1248 | sg_init_table(urb->sg, urb->num_sgs); | 1248 | sg_init_table(urb->sg, urb->num_sgs + 1); |
| 1249 | 1249 | ||
| 1250 | sg_set_buf(&urb->sg[s++], skb->data, skb_headlen(skb)); | 1250 | sg_set_buf(&urb->sg[s++], skb->data, skb_headlen(skb)); |
| 1251 | total_len += skb_headlen(skb); | 1251 | total_len += skb_headlen(skb); |
diff --git a/drivers/pinctrl/pinctrl-baytrail.c b/drivers/pinctrl/pinctrl-baytrail.c index 114f5ef4b73a..2832576d8b12 100644 --- a/drivers/pinctrl/pinctrl-baytrail.c +++ b/drivers/pinctrl/pinctrl-baytrail.c | |||
| @@ -512,7 +512,6 @@ static const struct dev_pm_ops byt_gpio_pm_ops = { | |||
| 512 | 512 | ||
| 513 | static const struct acpi_device_id byt_gpio_acpi_match[] = { | 513 | static const struct acpi_device_id byt_gpio_acpi_match[] = { |
| 514 | { "INT33B2", 0 }, | 514 | { "INT33B2", 0 }, |
| 515 | { "INT33FC", 0 }, | ||
| 516 | { } | 515 | { } |
| 517 | }; | 516 | }; |
| 518 | MODULE_DEVICE_TABLE(acpi, byt_gpio_acpi_match); | 517 | MODULE_DEVICE_TABLE(acpi, byt_gpio_acpi_match); |
diff --git a/fs/dcache.c b/fs/dcache.c index 6055d61811d3..cb4a10690868 100644 --- a/fs/dcache.c +++ b/fs/dcache.c | |||
| @@ -3061,8 +3061,13 @@ char *d_path(const struct path *path, char *buf, int buflen) | |||
| 3061 | * thus don't need to be hashed. They also don't need a name until a | 3061 | * thus don't need to be hashed. They also don't need a name until a |
| 3062 | * user wants to identify the object in /proc/pid/fd/. The little hack | 3062 | * user wants to identify the object in /proc/pid/fd/. The little hack |
| 3063 | * below allows us to generate a name for these objects on demand: | 3063 | * below allows us to generate a name for these objects on demand: |
| 3064 | * | ||
| 3065 | * Some pseudo inodes are mountable. When they are mounted | ||
| 3066 | * path->dentry == path->mnt->mnt_root. In that case don't call d_dname | ||
| 3067 | * and instead have d_path return the mounted path. | ||
| 3064 | */ | 3068 | */ |
| 3065 | if (path->dentry->d_op && path->dentry->d_op->d_dname) | 3069 | if (path->dentry->d_op && path->dentry->d_op->d_dname && |
| 3070 | (!IS_ROOT(path->dentry) || path->dentry != path->mnt->mnt_root)) | ||
| 3066 | return path->dentry->d_op->d_dname(path->dentry, buf, buflen); | 3071 | return path->dentry->d_op->d_dname(path->dentry, buf, buflen); |
| 3067 | 3072 | ||
| 3068 | rcu_read_lock(); | 3073 | rcu_read_lock(); |
diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index 1f4a10ece2f1..e0259a163f98 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c | |||
| @@ -516,13 +516,16 @@ writeback_single_inode(struct inode *inode, struct bdi_writeback *wb, | |||
| 516 | } | 516 | } |
| 517 | WARN_ON(inode->i_state & I_SYNC); | 517 | WARN_ON(inode->i_state & I_SYNC); |
| 518 | /* | 518 | /* |
| 519 | * Skip inode if it is clean. We don't want to mess with writeback | 519 | * Skip inode if it is clean and we have no outstanding writeback in |
| 520 | * lists in this function since flusher thread may be doing for example | 520 | * WB_SYNC_ALL mode. We don't want to mess with writeback lists in this |
| 521 | * sync in parallel and if we move the inode, it could get skipped. So | 521 | * function since flusher thread may be doing for example sync in |
| 522 | * here we make sure inode is on some writeback list and leave it there | 522 | * parallel and if we move the inode, it could get skipped. So here we |
| 523 | * unless we have completely cleaned the inode. | 523 | * make sure inode is on some writeback list and leave it there unless |
| 524 | * we have completely cleaned the inode. | ||
| 524 | */ | 525 | */ |
| 525 | if (!(inode->i_state & I_DIRTY)) | 526 | if (!(inode->i_state & I_DIRTY) && |
| 527 | (wbc->sync_mode != WB_SYNC_ALL || | ||
| 528 | !mapping_tagged(inode->i_mapping, PAGECACHE_TAG_WRITEBACK))) | ||
| 526 | goto out; | 529 | goto out; |
| 527 | inode->i_state |= I_SYNC; | 530 | inode->i_state |= I_SYNC; |
| 528 | spin_unlock(&inode->i_lock); | 531 | spin_unlock(&inode->i_lock); |
diff --git a/fs/namespace.c b/fs/namespace.c index ac2ce8a766e1..be32ebccdeb1 100644 --- a/fs/namespace.c +++ b/fs/namespace.c | |||
| @@ -2886,7 +2886,7 @@ bool fs_fully_visible(struct file_system_type *type) | |||
| 2886 | struct inode *inode = child->mnt_mountpoint->d_inode; | 2886 | struct inode *inode = child->mnt_mountpoint->d_inode; |
| 2887 | if (!S_ISDIR(inode->i_mode)) | 2887 | if (!S_ISDIR(inode->i_mode)) |
| 2888 | goto next; | 2888 | goto next; |
| 2889 | if (inode->i_nlink != 2) | 2889 | if (inode->i_nlink > 2) |
| 2890 | goto next; | 2890 | goto next; |
| 2891 | } | 2891 | } |
| 2892 | visible = true; | 2892 | visible = true; |
diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c index 9f6b486b6c01..a1a191634abc 100644 --- a/fs/nilfs2/segment.c +++ b/fs/nilfs2/segment.c | |||
| @@ -1440,17 +1440,19 @@ static int nilfs_segctor_collect(struct nilfs_sc_info *sci, | |||
| 1440 | 1440 | ||
| 1441 | nilfs_clear_logs(&sci->sc_segbufs); | 1441 | nilfs_clear_logs(&sci->sc_segbufs); |
| 1442 | 1442 | ||
| 1443 | err = nilfs_segctor_extend_segments(sci, nilfs, nadd); | ||
| 1444 | if (unlikely(err)) | ||
| 1445 | return err; | ||
| 1446 | |||
| 1447 | if (sci->sc_stage.flags & NILFS_CF_SUFREED) { | 1443 | if (sci->sc_stage.flags & NILFS_CF_SUFREED) { |
| 1448 | err = nilfs_sufile_cancel_freev(nilfs->ns_sufile, | 1444 | err = nilfs_sufile_cancel_freev(nilfs->ns_sufile, |
| 1449 | sci->sc_freesegs, | 1445 | sci->sc_freesegs, |
| 1450 | sci->sc_nfreesegs, | 1446 | sci->sc_nfreesegs, |
| 1451 | NULL); | 1447 | NULL); |
| 1452 | WARN_ON(err); /* do not happen */ | 1448 | WARN_ON(err); /* do not happen */ |
| 1449 | sci->sc_stage.flags &= ~NILFS_CF_SUFREED; | ||
| 1453 | } | 1450 | } |
| 1451 | |||
| 1452 | err = nilfs_segctor_extend_segments(sci, nilfs, nadd); | ||
| 1453 | if (unlikely(err)) | ||
| 1454 | return err; | ||
| 1455 | |||
| 1454 | nadd = min_t(int, nadd << 1, SC_MAX_SEGDELTA); | 1456 | nadd = min_t(int, nadd << 1, SC_MAX_SEGDELTA); |
| 1455 | sci->sc_stage = prev_stage; | 1457 | sci->sc_stage = prev_stage; |
| 1456 | } | 1458 | } |
diff --git a/include/linux/crash_dump.h b/include/linux/crash_dump.h index fe68a5a98583..7032518f8542 100644 --- a/include/linux/crash_dump.h +++ b/include/linux/crash_dump.h | |||
| @@ -6,6 +6,8 @@ | |||
| 6 | #include <linux/proc_fs.h> | 6 | #include <linux/proc_fs.h> |
| 7 | #include <linux/elf.h> | 7 | #include <linux/elf.h> |
| 8 | 8 | ||
| 9 | #include <asm/pgtable.h> /* for pgprot_t */ | ||
| 10 | |||
| 9 | #define ELFCORE_ADDR_MAX (-1ULL) | 11 | #define ELFCORE_ADDR_MAX (-1ULL) |
| 10 | #define ELFCORE_ADDR_ERR (-2ULL) | 12 | #define ELFCORE_ADDR_ERR (-2ULL) |
| 11 | 13 | ||
diff --git a/include/linux/i2c.h b/include/linux/i2c.h index eff50e062be8..d9c8dbd3373f 100644 --- a/include/linux/i2c.h +++ b/include/linux/i2c.h | |||
| @@ -445,7 +445,7 @@ static inline void i2c_set_adapdata(struct i2c_adapter *dev, void *data) | |||
| 445 | static inline struct i2c_adapter * | 445 | static inline struct i2c_adapter * |
| 446 | i2c_parent_is_i2c_adapter(const struct i2c_adapter *adapter) | 446 | i2c_parent_is_i2c_adapter(const struct i2c_adapter *adapter) |
| 447 | { | 447 | { |
| 448 | #if IS_ENABLED(I2C_MUX) | 448 | #if IS_ENABLED(CONFIG_I2C_MUX) |
| 449 | struct device *parent = adapter->dev.parent; | 449 | struct device *parent = adapter->dev.parent; |
| 450 | 450 | ||
| 451 | if (parent != NULL && parent->type == &i2c_adapter_type) | 451 | if (parent != NULL && parent->type == &i2c_adapter_type) |
diff --git a/include/linux/seqlock.h b/include/linux/seqlock.h index cf87a24c0f92..535f158977b9 100644 --- a/include/linux/seqlock.h +++ b/include/linux/seqlock.h | |||
| @@ -117,15 +117,15 @@ repeat: | |||
| 117 | } | 117 | } |
| 118 | 118 | ||
| 119 | /** | 119 | /** |
| 120 | * read_seqcount_begin_no_lockdep - start seq-read critical section w/o lockdep | 120 | * raw_read_seqcount_begin - start seq-read critical section w/o lockdep |
| 121 | * @s: pointer to seqcount_t | 121 | * @s: pointer to seqcount_t |
| 122 | * Returns: count to be passed to read_seqcount_retry | 122 | * Returns: count to be passed to read_seqcount_retry |
| 123 | * | 123 | * |
| 124 | * read_seqcount_begin_no_lockdep opens a read critical section of the given | 124 | * raw_read_seqcount_begin opens a read critical section of the given |
| 125 | * seqcount, but without any lockdep checking. Validity of the critical | 125 | * seqcount, but without any lockdep checking. Validity of the critical |
| 126 | * section is tested by checking read_seqcount_retry function. | 126 | * section is tested by checking read_seqcount_retry function. |
| 127 | */ | 127 | */ |
| 128 | static inline unsigned read_seqcount_begin_no_lockdep(const seqcount_t *s) | 128 | static inline unsigned raw_read_seqcount_begin(const seqcount_t *s) |
| 129 | { | 129 | { |
| 130 | unsigned ret = __read_seqcount_begin(s); | 130 | unsigned ret = __read_seqcount_begin(s); |
| 131 | smp_rmb(); | 131 | smp_rmb(); |
| @@ -144,7 +144,7 @@ static inline unsigned read_seqcount_begin_no_lockdep(const seqcount_t *s) | |||
| 144 | static inline unsigned read_seqcount_begin(const seqcount_t *s) | 144 | static inline unsigned read_seqcount_begin(const seqcount_t *s) |
| 145 | { | 145 | { |
| 146 | seqcount_lockdep_reader_access(s); | 146 | seqcount_lockdep_reader_access(s); |
| 147 | return read_seqcount_begin_no_lockdep(s); | 147 | return raw_read_seqcount_begin(s); |
| 148 | } | 148 | } |
| 149 | 149 | ||
| 150 | /** | 150 | /** |
| @@ -206,14 +206,26 @@ static inline int read_seqcount_retry(const seqcount_t *s, unsigned start) | |||
| 206 | } | 206 | } |
| 207 | 207 | ||
| 208 | 208 | ||
| 209 | |||
| 210 | static inline void raw_write_seqcount_begin(seqcount_t *s) | ||
| 211 | { | ||
| 212 | s->sequence++; | ||
| 213 | smp_wmb(); | ||
| 214 | } | ||
| 215 | |||
| 216 | static inline void raw_write_seqcount_end(seqcount_t *s) | ||
| 217 | { | ||
| 218 | smp_wmb(); | ||
| 219 | s->sequence++; | ||
| 220 | } | ||
| 221 | |||
| 209 | /* | 222 | /* |
| 210 | * Sequence counter only version assumes that callers are using their | 223 | * Sequence counter only version assumes that callers are using their |
| 211 | * own mutexing. | 224 | * own mutexing. |
| 212 | */ | 225 | */ |
| 213 | static inline void write_seqcount_begin_nested(seqcount_t *s, int subclass) | 226 | static inline void write_seqcount_begin_nested(seqcount_t *s, int subclass) |
| 214 | { | 227 | { |
| 215 | s->sequence++; | 228 | raw_write_seqcount_begin(s); |
| 216 | smp_wmb(); | ||
| 217 | seqcount_acquire(&s->dep_map, subclass, 0, _RET_IP_); | 229 | seqcount_acquire(&s->dep_map, subclass, 0, _RET_IP_); |
| 218 | } | 230 | } |
| 219 | 231 | ||
| @@ -225,8 +237,7 @@ static inline void write_seqcount_begin(seqcount_t *s) | |||
| 225 | static inline void write_seqcount_end(seqcount_t *s) | 237 | static inline void write_seqcount_end(seqcount_t *s) |
| 226 | { | 238 | { |
| 227 | seqcount_release(&s->dep_map, 1, _RET_IP_); | 239 | seqcount_release(&s->dep_map, 1, _RET_IP_); |
| 228 | smp_wmb(); | 240 | raw_write_seqcount_end(s); |
| 229 | s->sequence++; | ||
| 230 | } | 241 | } |
| 231 | 242 | ||
| 232 | /** | 243 | /** |
diff --git a/include/net/if_inet6.h b/include/net/if_inet6.h index 76d54270f2e2..65bb13035598 100644 --- a/include/net/if_inet6.h +++ b/include/net/if_inet6.h | |||
| @@ -165,7 +165,6 @@ struct inet6_dev { | |||
| 165 | struct net_device *dev; | 165 | struct net_device *dev; |
| 166 | 166 | ||
| 167 | struct list_head addr_list; | 167 | struct list_head addr_list; |
| 168 | int valid_ll_addr_cnt; | ||
| 169 | 168 | ||
| 170 | struct ifmcaddr6 *mc_list; | 169 | struct ifmcaddr6 *mc_list; |
| 171 | struct ifmcaddr6 *mc_tomb; | 170 | struct ifmcaddr6 *mc_tomb; |
diff --git a/kernel/fork.c b/kernel/fork.c index 5721f0e3f2da..dfa736c98d17 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
| @@ -1172,7 +1172,7 @@ static struct task_struct *copy_process(unsigned long clone_flags, | |||
| 1172 | * do not allow it to share a thread group or signal handlers or | 1172 | * do not allow it to share a thread group or signal handlers or |
| 1173 | * parent with the forking task. | 1173 | * parent with the forking task. |
| 1174 | */ | 1174 | */ |
| 1175 | if (clone_flags & (CLONE_SIGHAND | CLONE_PARENT)) { | 1175 | if (clone_flags & CLONE_SIGHAND) { |
| 1176 | if ((clone_flags & (CLONE_NEWUSER | CLONE_NEWPID)) || | 1176 | if ((clone_flags & (CLONE_NEWUSER | CLONE_NEWPID)) || |
| 1177 | (task_active_pid_ns(current) != | 1177 | (task_active_pid_ns(current) != |
| 1178 | current->nsproxy->pid_ns_for_children)) | 1178 | current->nsproxy->pid_ns_for_children)) |
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index c7395d97e4cb..e64b0794060e 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c | |||
| @@ -3923,7 +3923,7 @@ static long effective_load(struct task_group *tg, int cpu, long wl, long wg) | |||
| 3923 | { | 3923 | { |
| 3924 | struct sched_entity *se = tg->se[cpu]; | 3924 | struct sched_entity *se = tg->se[cpu]; |
| 3925 | 3925 | ||
| 3926 | if (!tg->parent || !wl) /* the trivial, non-cgroup case */ | 3926 | if (!tg->parent) /* the trivial, non-cgroup case */ |
| 3927 | return wl; | 3927 | return wl; |
| 3928 | 3928 | ||
| 3929 | for_each_sched_entity(se) { | 3929 | for_each_sched_entity(se) { |
diff --git a/kernel/time/sched_clock.c b/kernel/time/sched_clock.c index 68b799375981..0abb36464281 100644 --- a/kernel/time/sched_clock.c +++ b/kernel/time/sched_clock.c | |||
| @@ -74,7 +74,7 @@ unsigned long long notrace sched_clock(void) | |||
| 74 | return cd.epoch_ns; | 74 | return cd.epoch_ns; |
| 75 | 75 | ||
| 76 | do { | 76 | do { |
| 77 | seq = read_seqcount_begin(&cd.seq); | 77 | seq = raw_read_seqcount_begin(&cd.seq); |
| 78 | epoch_cyc = cd.epoch_cyc; | 78 | epoch_cyc = cd.epoch_cyc; |
| 79 | epoch_ns = cd.epoch_ns; | 79 | epoch_ns = cd.epoch_ns; |
| 80 | } while (read_seqcount_retry(&cd.seq, seq)); | 80 | } while (read_seqcount_retry(&cd.seq, seq)); |
| @@ -99,10 +99,10 @@ static void notrace update_sched_clock(void) | |||
| 99 | cd.mult, cd.shift); | 99 | cd.mult, cd.shift); |
| 100 | 100 | ||
| 101 | raw_local_irq_save(flags); | 101 | raw_local_irq_save(flags); |
| 102 | write_seqcount_begin(&cd.seq); | 102 | raw_write_seqcount_begin(&cd.seq); |
| 103 | cd.epoch_ns = ns; | 103 | cd.epoch_ns = ns; |
| 104 | cd.epoch_cyc = cyc; | 104 | cd.epoch_cyc = cyc; |
| 105 | write_seqcount_end(&cd.seq); | 105 | raw_write_seqcount_end(&cd.seq); |
| 106 | raw_local_irq_restore(flags); | 106 | raw_local_irq_restore(flags); |
| 107 | } | 107 | } |
| 108 | 108 | ||
diff --git a/lib/percpu_counter.c b/lib/percpu_counter.c index 7473ee3b4ee7..8280a5dd1727 100644 --- a/lib/percpu_counter.c +++ b/lib/percpu_counter.c | |||
| @@ -82,10 +82,10 @@ void __percpu_counter_add(struct percpu_counter *fbc, s64 amount, s32 batch) | |||
| 82 | unsigned long flags; | 82 | unsigned long flags; |
| 83 | raw_spin_lock_irqsave(&fbc->lock, flags); | 83 | raw_spin_lock_irqsave(&fbc->lock, flags); |
| 84 | fbc->count += count; | 84 | fbc->count += count; |
| 85 | __this_cpu_sub(*fbc->counters, count - amount); | ||
| 85 | raw_spin_unlock_irqrestore(&fbc->lock, flags); | 86 | raw_spin_unlock_irqrestore(&fbc->lock, flags); |
| 86 | __this_cpu_write(*fbc->counters, 0); | ||
| 87 | } else { | 87 | } else { |
| 88 | __this_cpu_write(*fbc->counters, count); | 88 | this_cpu_add(*fbc->counters, amount); |
| 89 | } | 89 | } |
| 90 | preempt_enable(); | 90 | preempt_enable(); |
| 91 | } | 91 | } |
| @@ -390,7 +390,10 @@ struct address_space *page_mapping(struct page *page) | |||
| 390 | { | 390 | { |
| 391 | struct address_space *mapping = page->mapping; | 391 | struct address_space *mapping = page->mapping; |
| 392 | 392 | ||
| 393 | VM_BUG_ON(PageSlab(page)); | 393 | /* This happens if someone calls flush_dcache_page on slab page */ |
| 394 | if (unlikely(PageSlab(page))) | ||
| 395 | return NULL; | ||
| 396 | |||
| 394 | if (unlikely(PageSwapCache(page))) { | 397 | if (unlikely(PageSwapCache(page))) { |
| 395 | swp_entry_t entry; | 398 | swp_entry_t entry; |
| 396 | 399 | ||
diff --git a/net/batman-adv/main.c b/net/batman-adv/main.c index 1511f64a6cea..faba0f61ad53 100644 --- a/net/batman-adv/main.c +++ b/net/batman-adv/main.c | |||
| @@ -277,7 +277,7 @@ int batadv_max_header_len(void) | |||
| 277 | sizeof(struct batadv_coded_packet)); | 277 | sizeof(struct batadv_coded_packet)); |
| 278 | #endif | 278 | #endif |
| 279 | 279 | ||
| 280 | return header_len; | 280 | return header_len + ETH_HLEN; |
| 281 | } | 281 | } |
| 282 | 282 | ||
| 283 | /** | 283 | /** |
diff --git a/net/core/filter.c b/net/core/filter.c index 01b780856db2..ad30d626a5bd 100644 --- a/net/core/filter.c +++ b/net/core/filter.c | |||
| @@ -36,7 +36,6 @@ | |||
| 36 | #include <asm/uaccess.h> | 36 | #include <asm/uaccess.h> |
| 37 | #include <asm/unaligned.h> | 37 | #include <asm/unaligned.h> |
| 38 | #include <linux/filter.h> | 38 | #include <linux/filter.h> |
| 39 | #include <linux/reciprocal_div.h> | ||
| 40 | #include <linux/ratelimit.h> | 39 | #include <linux/ratelimit.h> |
| 41 | #include <linux/seccomp.h> | 40 | #include <linux/seccomp.h> |
| 42 | #include <linux/if_vlan.h> | 41 | #include <linux/if_vlan.h> |
| @@ -166,7 +165,7 @@ unsigned int sk_run_filter(const struct sk_buff *skb, | |||
| 166 | A /= X; | 165 | A /= X; |
| 167 | continue; | 166 | continue; |
| 168 | case BPF_S_ALU_DIV_K: | 167 | case BPF_S_ALU_DIV_K: |
| 169 | A = reciprocal_divide(A, K); | 168 | A /= K; |
| 170 | continue; | 169 | continue; |
| 171 | case BPF_S_ALU_MOD_X: | 170 | case BPF_S_ALU_MOD_X: |
| 172 | if (X == 0) | 171 | if (X == 0) |
| @@ -553,11 +552,6 @@ int sk_chk_filter(struct sock_filter *filter, unsigned int flen) | |||
| 553 | /* Some instructions need special checks */ | 552 | /* Some instructions need special checks */ |
| 554 | switch (code) { | 553 | switch (code) { |
| 555 | case BPF_S_ALU_DIV_K: | 554 | case BPF_S_ALU_DIV_K: |
| 556 | /* check for division by zero */ | ||
| 557 | if (ftest->k == 0) | ||
| 558 | return -EINVAL; | ||
| 559 | ftest->k = reciprocal_value(ftest->k); | ||
| 560 | break; | ||
| 561 | case BPF_S_ALU_MOD_K: | 555 | case BPF_S_ALU_MOD_K: |
| 562 | /* check for division by zero */ | 556 | /* check for division by zero */ |
| 563 | if (ftest->k == 0) | 557 | if (ftest->k == 0) |
| @@ -853,27 +847,7 @@ void sk_decode_filter(struct sock_filter *filt, struct sock_filter *to) | |||
| 853 | to->code = decodes[code]; | 847 | to->code = decodes[code]; |
| 854 | to->jt = filt->jt; | 848 | to->jt = filt->jt; |
| 855 | to->jf = filt->jf; | 849 | to->jf = filt->jf; |
| 856 | 850 | to->k = filt->k; | |
| 857 | if (code == BPF_S_ALU_DIV_K) { | ||
| 858 | /* | ||
| 859 | * When loaded this rule user gave us X, which was | ||
| 860 | * translated into R = r(X). Now we calculate the | ||
| 861 | * RR = r(R) and report it back. If next time this | ||
| 862 | * value is loaded and RRR = r(RR) is calculated | ||
| 863 | * then the R == RRR will be true. | ||
| 864 | * | ||
| 865 | * One exception. X == 1 translates into R == 0 and | ||
| 866 | * we can't calculate RR out of it with r(). | ||
| 867 | */ | ||
| 868 | |||
| 869 | if (filt->k == 0) | ||
| 870 | to->k = 1; | ||
| 871 | else | ||
| 872 | to->k = reciprocal_value(filt->k); | ||
| 873 | |||
| 874 | BUG_ON(reciprocal_value(to->k) != filt->k); | ||
| 875 | } else | ||
| 876 | to->k = filt->k; | ||
| 877 | } | 851 | } |
| 878 | 852 | ||
| 879 | int sk_get_filter(struct sock *sk, struct sock_filter __user *ubuf, unsigned int len) | 853 | int sk_get_filter(struct sock *sk, struct sock_filter __user *ubuf, unsigned int len) |
diff --git a/net/ieee802154/nl-phy.c b/net/ieee802154/nl-phy.c index d08c7a43dcd1..89b265aea151 100644 --- a/net/ieee802154/nl-phy.c +++ b/net/ieee802154/nl-phy.c | |||
| @@ -221,8 +221,10 @@ int ieee802154_add_iface(struct sk_buff *skb, struct genl_info *info) | |||
| 221 | 221 | ||
| 222 | if (info->attrs[IEEE802154_ATTR_DEV_TYPE]) { | 222 | if (info->attrs[IEEE802154_ATTR_DEV_TYPE]) { |
| 223 | type = nla_get_u8(info->attrs[IEEE802154_ATTR_DEV_TYPE]); | 223 | type = nla_get_u8(info->attrs[IEEE802154_ATTR_DEV_TYPE]); |
| 224 | if (type >= __IEEE802154_DEV_MAX) | 224 | if (type >= __IEEE802154_DEV_MAX) { |
| 225 | return -EINVAL; | 225 | rc = -EINVAL; |
| 226 | goto nla_put_failure; | ||
| 227 | } | ||
| 226 | } | 228 | } |
| 227 | 229 | ||
| 228 | dev = phy->add_iface(phy, devname, type); | 230 | dev = phy->add_iface(phy, devname, type); |
diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c index a0f52dac8940..e34dccbc4d70 100644 --- a/net/ipv4/inet_diag.c +++ b/net/ipv4/inet_diag.c | |||
| @@ -930,12 +930,15 @@ skip_listen_ht: | |||
| 930 | spin_lock_bh(lock); | 930 | spin_lock_bh(lock); |
| 931 | sk_nulls_for_each(sk, node, &head->chain) { | 931 | sk_nulls_for_each(sk, node, &head->chain) { |
| 932 | int res; | 932 | int res; |
| 933 | int state; | ||
| 933 | 934 | ||
| 934 | if (!net_eq(sock_net(sk), net)) | 935 | if (!net_eq(sock_net(sk), net)) |
| 935 | continue; | 936 | continue; |
| 936 | if (num < s_num) | 937 | if (num < s_num) |
| 937 | goto next_normal; | 938 | goto next_normal; |
| 938 | if (!(r->idiag_states & (1 << sk->sk_state))) | 939 | state = (sk->sk_state == TCP_TIME_WAIT) ? |
| 940 | inet_twsk(sk)->tw_substate : sk->sk_state; | ||
| 941 | if (!(r->idiag_states & (1 << state))) | ||
| 939 | goto next_normal; | 942 | goto next_normal; |
| 940 | if (r->sdiag_family != AF_UNSPEC && | 943 | if (r->sdiag_family != AF_UNSPEC && |
| 941 | sk->sk_family != r->sdiag_family) | 944 | sk->sk_family != r->sdiag_family) |
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c index 62212c772a4b..1672409f5ba5 100644 --- a/net/ipv4/ipmr.c +++ b/net/ipv4/ipmr.c | |||
| @@ -157,9 +157,12 @@ static struct mr_table *ipmr_get_table(struct net *net, u32 id) | |||
| 157 | static int ipmr_fib_lookup(struct net *net, struct flowi4 *flp4, | 157 | static int ipmr_fib_lookup(struct net *net, struct flowi4 *flp4, |
| 158 | struct mr_table **mrt) | 158 | struct mr_table **mrt) |
| 159 | { | 159 | { |
| 160 | struct ipmr_result res; | ||
| 161 | struct fib_lookup_arg arg = { .result = &res, }; | ||
| 162 | int err; | 160 | int err; |
| 161 | struct ipmr_result res; | ||
| 162 | struct fib_lookup_arg arg = { | ||
| 163 | .result = &res, | ||
| 164 | .flags = FIB_LOOKUP_NOREF, | ||
| 165 | }; | ||
| 163 | 166 | ||
| 164 | err = fib_rules_lookup(net->ipv4.mr_rules_ops, | 167 | err = fib_rules_lookup(net->ipv4.mr_rules_ops, |
| 165 | flowi4_to_flowi(flp4), 0, &arg); | 168 | flowi4_to_flowi(flp4), 0, &arg); |
diff --git a/net/ipv4/tcp_metrics.c b/net/ipv4/tcp_metrics.c index 06493736fbc8..098b3a29f6f3 100644 --- a/net/ipv4/tcp_metrics.c +++ b/net/ipv4/tcp_metrics.c | |||
| @@ -22,6 +22,9 @@ | |||
| 22 | 22 | ||
| 23 | int sysctl_tcp_nometrics_save __read_mostly; | 23 | int sysctl_tcp_nometrics_save __read_mostly; |
| 24 | 24 | ||
| 25 | static struct tcp_metrics_block *__tcp_get_metrics(const struct inetpeer_addr *addr, | ||
| 26 | struct net *net, unsigned int hash); | ||
| 27 | |||
| 25 | struct tcp_fastopen_metrics { | 28 | struct tcp_fastopen_metrics { |
| 26 | u16 mss; | 29 | u16 mss; |
| 27 | u16 syn_loss:10; /* Recurring Fast Open SYN losses */ | 30 | u16 syn_loss:10; /* Recurring Fast Open SYN losses */ |
| @@ -130,16 +133,41 @@ static void tcpm_suck_dst(struct tcp_metrics_block *tm, struct dst_entry *dst, | |||
| 130 | } | 133 | } |
| 131 | } | 134 | } |
| 132 | 135 | ||
| 136 | #define TCP_METRICS_TIMEOUT (60 * 60 * HZ) | ||
| 137 | |||
| 138 | static void tcpm_check_stamp(struct tcp_metrics_block *tm, struct dst_entry *dst) | ||
| 139 | { | ||
| 140 | if (tm && unlikely(time_after(jiffies, tm->tcpm_stamp + TCP_METRICS_TIMEOUT))) | ||
| 141 | tcpm_suck_dst(tm, dst, false); | ||
| 142 | } | ||
| 143 | |||
| 144 | #define TCP_METRICS_RECLAIM_DEPTH 5 | ||
| 145 | #define TCP_METRICS_RECLAIM_PTR (struct tcp_metrics_block *) 0x1UL | ||
| 146 | |||
| 133 | static struct tcp_metrics_block *tcpm_new(struct dst_entry *dst, | 147 | static struct tcp_metrics_block *tcpm_new(struct dst_entry *dst, |
| 134 | struct inetpeer_addr *addr, | 148 | struct inetpeer_addr *addr, |
| 135 | unsigned int hash, | 149 | unsigned int hash) |
| 136 | bool reclaim) | ||
| 137 | { | 150 | { |
| 138 | struct tcp_metrics_block *tm; | 151 | struct tcp_metrics_block *tm; |
| 139 | struct net *net; | 152 | struct net *net; |
| 153 | bool reclaim = false; | ||
| 140 | 154 | ||
| 141 | spin_lock_bh(&tcp_metrics_lock); | 155 | spin_lock_bh(&tcp_metrics_lock); |
| 142 | net = dev_net(dst->dev); | 156 | net = dev_net(dst->dev); |
| 157 | |||
| 158 | /* While waiting for the spin-lock the cache might have been populated | ||
| 159 | * with this entry and so we have to check again. | ||
| 160 | */ | ||
| 161 | tm = __tcp_get_metrics(addr, net, hash); | ||
| 162 | if (tm == TCP_METRICS_RECLAIM_PTR) { | ||
| 163 | reclaim = true; | ||
| 164 | tm = NULL; | ||
| 165 | } | ||
| 166 | if (tm) { | ||
| 167 | tcpm_check_stamp(tm, dst); | ||
| 168 | goto out_unlock; | ||
| 169 | } | ||
| 170 | |||
| 143 | if (unlikely(reclaim)) { | 171 | if (unlikely(reclaim)) { |
| 144 | struct tcp_metrics_block *oldest; | 172 | struct tcp_metrics_block *oldest; |
| 145 | 173 | ||
| @@ -169,17 +197,6 @@ out_unlock: | |||
| 169 | return tm; | 197 | return tm; |
| 170 | } | 198 | } |
| 171 | 199 | ||
| 172 | #define TCP_METRICS_TIMEOUT (60 * 60 * HZ) | ||
| 173 | |||
| 174 | static void tcpm_check_stamp(struct tcp_metrics_block *tm, struct dst_entry *dst) | ||
| 175 | { | ||
| 176 | if (tm && unlikely(time_after(jiffies, tm->tcpm_stamp + TCP_METRICS_TIMEOUT))) | ||
| 177 | tcpm_suck_dst(tm, dst, false); | ||
| 178 | } | ||
| 179 | |||
| 180 | #define TCP_METRICS_RECLAIM_DEPTH 5 | ||
| 181 | #define TCP_METRICS_RECLAIM_PTR (struct tcp_metrics_block *) 0x1UL | ||
| 182 | |||
| 183 | static struct tcp_metrics_block *tcp_get_encode(struct tcp_metrics_block *tm, int depth) | 200 | static struct tcp_metrics_block *tcp_get_encode(struct tcp_metrics_block *tm, int depth) |
| 184 | { | 201 | { |
| 185 | if (tm) | 202 | if (tm) |
| @@ -282,7 +299,6 @@ static struct tcp_metrics_block *tcp_get_metrics(struct sock *sk, | |||
| 282 | struct inetpeer_addr addr; | 299 | struct inetpeer_addr addr; |
| 283 | unsigned int hash; | 300 | unsigned int hash; |
| 284 | struct net *net; | 301 | struct net *net; |
| 285 | bool reclaim; | ||
| 286 | 302 | ||
| 287 | addr.family = sk->sk_family; | 303 | addr.family = sk->sk_family; |
| 288 | switch (addr.family) { | 304 | switch (addr.family) { |
| @@ -304,13 +320,10 @@ static struct tcp_metrics_block *tcp_get_metrics(struct sock *sk, | |||
| 304 | hash = hash_32(hash, net->ipv4.tcp_metrics_hash_log); | 320 | hash = hash_32(hash, net->ipv4.tcp_metrics_hash_log); |
| 305 | 321 | ||
| 306 | tm = __tcp_get_metrics(&addr, net, hash); | 322 | tm = __tcp_get_metrics(&addr, net, hash); |
| 307 | reclaim = false; | 323 | if (tm == TCP_METRICS_RECLAIM_PTR) |
| 308 | if (tm == TCP_METRICS_RECLAIM_PTR) { | ||
| 309 | reclaim = true; | ||
| 310 | tm = NULL; | 324 | tm = NULL; |
| 311 | } | ||
| 312 | if (!tm && create) | 325 | if (!tm && create) |
| 313 | tm = tcpm_new(dst, &addr, hash, reclaim); | 326 | tm = tcpm_new(dst, &addr, hash); |
| 314 | else | 327 | else |
| 315 | tcpm_check_stamp(tm, dst); | 328 | tcpm_check_stamp(tm, dst); |
| 316 | 329 | ||
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index abe46a4228ce..4b6b720971b9 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
| @@ -3189,6 +3189,22 @@ out: | |||
| 3189 | in6_ifa_put(ifp); | 3189 | in6_ifa_put(ifp); |
| 3190 | } | 3190 | } |
| 3191 | 3191 | ||
| 3192 | /* ifp->idev must be at least read locked */ | ||
| 3193 | static bool ipv6_lonely_lladdr(struct inet6_ifaddr *ifp) | ||
| 3194 | { | ||
| 3195 | struct inet6_ifaddr *ifpiter; | ||
| 3196 | struct inet6_dev *idev = ifp->idev; | ||
| 3197 | |||
| 3198 | list_for_each_entry(ifpiter, &idev->addr_list, if_list) { | ||
| 3199 | if (ifp != ifpiter && ifpiter->scope == IFA_LINK && | ||
| 3200 | (ifpiter->flags & (IFA_F_PERMANENT|IFA_F_TENTATIVE| | ||
| 3201 | IFA_F_OPTIMISTIC|IFA_F_DADFAILED)) == | ||
| 3202 | IFA_F_PERMANENT) | ||
| 3203 | return false; | ||
| 3204 | } | ||
| 3205 | return true; | ||
| 3206 | } | ||
| 3207 | |||
| 3192 | static void addrconf_dad_completed(struct inet6_ifaddr *ifp) | 3208 | static void addrconf_dad_completed(struct inet6_ifaddr *ifp) |
| 3193 | { | 3209 | { |
| 3194 | struct net_device *dev = ifp->idev->dev; | 3210 | struct net_device *dev = ifp->idev->dev; |
| @@ -3208,14 +3224,11 @@ static void addrconf_dad_completed(struct inet6_ifaddr *ifp) | |||
| 3208 | */ | 3224 | */ |
| 3209 | 3225 | ||
| 3210 | read_lock_bh(&ifp->idev->lock); | 3226 | read_lock_bh(&ifp->idev->lock); |
| 3211 | spin_lock(&ifp->lock); | 3227 | send_mld = ifp->scope == IFA_LINK && ipv6_lonely_lladdr(ifp); |
| 3212 | send_mld = ipv6_addr_type(&ifp->addr) & IPV6_ADDR_LINKLOCAL && | ||
| 3213 | ifp->idev->valid_ll_addr_cnt == 1; | ||
| 3214 | send_rs = send_mld && | 3228 | send_rs = send_mld && |
| 3215 | ipv6_accept_ra(ifp->idev) && | 3229 | ipv6_accept_ra(ifp->idev) && |
| 3216 | ifp->idev->cnf.rtr_solicits > 0 && | 3230 | ifp->idev->cnf.rtr_solicits > 0 && |
| 3217 | (dev->flags&IFF_LOOPBACK) == 0; | 3231 | (dev->flags&IFF_LOOPBACK) == 0; |
| 3218 | spin_unlock(&ifp->lock); | ||
| 3219 | read_unlock_bh(&ifp->idev->lock); | 3232 | read_unlock_bh(&ifp->idev->lock); |
| 3220 | 3233 | ||
| 3221 | /* While dad is in progress mld report's source address is in6_addrany. | 3234 | /* While dad is in progress mld report's source address is in6_addrany. |
| @@ -4512,19 +4525,6 @@ errout: | |||
| 4512 | rtnl_set_sk_err(net, RTNLGRP_IPV6_PREFIX, err); | 4525 | rtnl_set_sk_err(net, RTNLGRP_IPV6_PREFIX, err); |
| 4513 | } | 4526 | } |
| 4514 | 4527 | ||
| 4515 | static void update_valid_ll_addr_cnt(struct inet6_ifaddr *ifp, int count) | ||
| 4516 | { | ||
| 4517 | write_lock_bh(&ifp->idev->lock); | ||
| 4518 | spin_lock(&ifp->lock); | ||
| 4519 | if (((ifp->flags & (IFA_F_PERMANENT|IFA_F_TENTATIVE|IFA_F_OPTIMISTIC| | ||
| 4520 | IFA_F_DADFAILED)) == IFA_F_PERMANENT) && | ||
| 4521 | (ipv6_addr_type(&ifp->addr) & IPV6_ADDR_LINKLOCAL)) | ||
| 4522 | ifp->idev->valid_ll_addr_cnt += count; | ||
| 4523 | WARN_ON(ifp->idev->valid_ll_addr_cnt < 0); | ||
| 4524 | spin_unlock(&ifp->lock); | ||
| 4525 | write_unlock_bh(&ifp->idev->lock); | ||
| 4526 | } | ||
| 4527 | |||
| 4528 | static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp) | 4528 | static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp) |
| 4529 | { | 4529 | { |
| 4530 | struct net *net = dev_net(ifp->idev->dev); | 4530 | struct net *net = dev_net(ifp->idev->dev); |
| @@ -4533,8 +4533,6 @@ static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp) | |||
| 4533 | 4533 | ||
| 4534 | switch (event) { | 4534 | switch (event) { |
| 4535 | case RTM_NEWADDR: | 4535 | case RTM_NEWADDR: |
| 4536 | update_valid_ll_addr_cnt(ifp, 1); | ||
| 4537 | |||
| 4538 | /* | 4536 | /* |
| 4539 | * If the address was optimistic | 4537 | * If the address was optimistic |
| 4540 | * we inserted the route at the start of | 4538 | * we inserted the route at the start of |
| @@ -4550,8 +4548,6 @@ static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp) | |||
| 4550 | ifp->idev->dev, 0, 0); | 4548 | ifp->idev->dev, 0, 0); |
| 4551 | break; | 4549 | break; |
| 4552 | case RTM_DELADDR: | 4550 | case RTM_DELADDR: |
| 4553 | update_valid_ll_addr_cnt(ifp, -1); | ||
| 4554 | |||
| 4555 | if (ifp->idev->cnf.forwarding) | 4551 | if (ifp->idev->cnf.forwarding) |
| 4556 | addrconf_leave_anycast(ifp); | 4552 | addrconf_leave_anycast(ifp); |
| 4557 | addrconf_leave_solict(ifp->idev, &ifp->addr); | 4553 | addrconf_leave_solict(ifp->idev, &ifp->addr); |
diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c index f365310bfcca..0eb4038a4d63 100644 --- a/net/ipv6/ip6mr.c +++ b/net/ipv6/ip6mr.c | |||
| @@ -141,9 +141,12 @@ static struct mr6_table *ip6mr_get_table(struct net *net, u32 id) | |||
| 141 | static int ip6mr_fib_lookup(struct net *net, struct flowi6 *flp6, | 141 | static int ip6mr_fib_lookup(struct net *net, struct flowi6 *flp6, |
| 142 | struct mr6_table **mrt) | 142 | struct mr6_table **mrt) |
| 143 | { | 143 | { |
| 144 | struct ip6mr_result res; | ||
| 145 | struct fib_lookup_arg arg = { .result = &res, }; | ||
| 146 | int err; | 144 | int err; |
| 145 | struct ip6mr_result res; | ||
| 146 | struct fib_lookup_arg arg = { | ||
| 147 | .result = &res, | ||
| 148 | .flags = FIB_LOOKUP_NOREF, | ||
| 149 | }; | ||
| 147 | 150 | ||
| 148 | err = fib_rules_lookup(net->ipv6.mr6_rules_ops, | 151 | err = fib_rules_lookup(net->ipv6.mr6_rules_ops, |
| 149 | flowi6_to_flowi(flp6), 0, &arg); | 152 | flowi6_to_flowi(flp6), 0, &arg); |
diff --git a/net/rds/ib_recv.c b/net/rds/ib_recv.c index 8eb9501e3d60..b7ebe23cdedf 100644 --- a/net/rds/ib_recv.c +++ b/net/rds/ib_recv.c | |||
| @@ -421,8 +421,7 @@ static void rds_ib_recv_cache_put(struct list_head *new_item, | |||
| 421 | struct rds_ib_refill_cache *cache) | 421 | struct rds_ib_refill_cache *cache) |
| 422 | { | 422 | { |
| 423 | unsigned long flags; | 423 | unsigned long flags; |
| 424 | struct list_head *old; | 424 | struct list_head *old, *chpfirst; |
| 425 | struct list_head __percpu *chpfirst; | ||
| 426 | 425 | ||
| 427 | local_irq_save(flags); | 426 | local_irq_save(flags); |
| 428 | 427 | ||
| @@ -432,7 +431,7 @@ static void rds_ib_recv_cache_put(struct list_head *new_item, | |||
| 432 | else /* put on front */ | 431 | else /* put on front */ |
| 433 | list_add_tail(new_item, chpfirst); | 432 | list_add_tail(new_item, chpfirst); |
| 434 | 433 | ||
| 435 | __this_cpu_write(chpfirst, new_item); | 434 | __this_cpu_write(cache->percpu->first, new_item); |
| 436 | __this_cpu_inc(cache->percpu->count); | 435 | __this_cpu_inc(cache->percpu->count); |
| 437 | 436 | ||
| 438 | if (__this_cpu_read(cache->percpu->count) < RDS_IB_RECYCLE_BATCH_COUNT) | 437 | if (__this_cpu_read(cache->percpu->count) < RDS_IB_RECYCLE_BATCH_COUNT) |
| @@ -452,7 +451,7 @@ static void rds_ib_recv_cache_put(struct list_head *new_item, | |||
| 452 | } while (old); | 451 | } while (old); |
| 453 | 452 | ||
| 454 | 453 | ||
| 455 | __this_cpu_write(chpfirst, NULL); | 454 | __this_cpu_write(cache->percpu->first, NULL); |
| 456 | __this_cpu_write(cache->percpu->count, 0); | 455 | __this_cpu_write(cache->percpu->count, 0); |
| 457 | end: | 456 | end: |
| 458 | local_irq_restore(flags); | 457 | local_irq_restore(flags); |
diff --git a/sound/soc/codecs/tlv320aic32x4.c b/sound/soc/codecs/tlv320aic32x4.c index 385dec16eb8a..688151ba309a 100644 --- a/sound/soc/codecs/tlv320aic32x4.c +++ b/sound/soc/codecs/tlv320aic32x4.c | |||
| @@ -450,6 +450,17 @@ static int aic32x4_hw_params(struct snd_pcm_substream *substream, | |||
| 450 | } | 450 | } |
| 451 | snd_soc_write(codec, AIC32X4_IFACE1, data); | 451 | snd_soc_write(codec, AIC32X4_IFACE1, data); |
| 452 | 452 | ||
| 453 | if (params_channels(params) == 1) { | ||
| 454 | data = AIC32X4_RDAC2LCHN | AIC32X4_LDAC2LCHN; | ||
| 455 | } else { | ||
| 456 | if (aic32x4->swapdacs) | ||
| 457 | data = AIC32X4_RDAC2LCHN | AIC32X4_LDAC2RCHN; | ||
| 458 | else | ||
| 459 | data = AIC32X4_LDAC2LCHN | AIC32X4_RDAC2RCHN; | ||
| 460 | } | ||
| 461 | snd_soc_update_bits(codec, AIC32X4_DACSETUP, AIC32X4_DAC_CHAN_MASK, | ||
| 462 | data); | ||
| 463 | |||
| 453 | return 0; | 464 | return 0; |
| 454 | } | 465 | } |
| 455 | 466 | ||
| @@ -606,20 +617,15 @@ static int aic32x4_probe(struct snd_soc_codec *codec) | |||
| 606 | } | 617 | } |
| 607 | snd_soc_write(codec, AIC32X4_CMMODE, tmp_reg); | 618 | snd_soc_write(codec, AIC32X4_CMMODE, tmp_reg); |
| 608 | 619 | ||
| 609 | /* Do DACs need to be swapped? */ | ||
| 610 | if (aic32x4->swapdacs) { | ||
| 611 | snd_soc_write(codec, AIC32X4_DACSETUP, AIC32X4_LDAC2RCHN | AIC32X4_RDAC2LCHN); | ||
| 612 | } else { | ||
| 613 | snd_soc_write(codec, AIC32X4_DACSETUP, AIC32X4_LDAC2LCHN | AIC32X4_RDAC2RCHN); | ||
| 614 | } | ||
| 615 | |||
| 616 | /* Mic PGA routing */ | 620 | /* Mic PGA routing */ |
| 617 | if (aic32x4->micpga_routing & AIC32X4_MICPGA_ROUTE_LMIC_IN2R_10K) { | 621 | if (aic32x4->micpga_routing & AIC32X4_MICPGA_ROUTE_LMIC_IN2R_10K) |
| 618 | snd_soc_write(codec, AIC32X4_LMICPGANIN, AIC32X4_LMICPGANIN_IN2R_10K); | 622 | snd_soc_write(codec, AIC32X4_LMICPGANIN, AIC32X4_LMICPGANIN_IN2R_10K); |
| 619 | } | 623 | else |
| 620 | if (aic32x4->micpga_routing & AIC32X4_MICPGA_ROUTE_RMIC_IN1L_10K) { | 624 | snd_soc_write(codec, AIC32X4_LMICPGANIN, AIC32X4_LMICPGANIN_CM1L_10K); |
| 625 | if (aic32x4->micpga_routing & AIC32X4_MICPGA_ROUTE_RMIC_IN1L_10K) | ||
| 621 | snd_soc_write(codec, AIC32X4_RMICPGANIN, AIC32X4_RMICPGANIN_IN1L_10K); | 626 | snd_soc_write(codec, AIC32X4_RMICPGANIN, AIC32X4_RMICPGANIN_IN1L_10K); |
| 622 | } | 627 | else |
| 628 | snd_soc_write(codec, AIC32X4_RMICPGANIN, AIC32X4_RMICPGANIN_CM1R_10K); | ||
| 623 | 629 | ||
| 624 | aic32x4_set_bias_level(codec, SND_SOC_BIAS_STANDBY); | 630 | aic32x4_set_bias_level(codec, SND_SOC_BIAS_STANDBY); |
| 625 | 631 | ||
diff --git a/sound/soc/codecs/tlv320aic32x4.h b/sound/soc/codecs/tlv320aic32x4.h index 35774223fd91..995f033a855d 100644 --- a/sound/soc/codecs/tlv320aic32x4.h +++ b/sound/soc/codecs/tlv320aic32x4.h | |||
| @@ -120,7 +120,9 @@ | |||
| 120 | #define AIC32X4_MICBIAS_2075V 0x60 | 120 | #define AIC32X4_MICBIAS_2075V 0x60 |
| 121 | 121 | ||
| 122 | #define AIC32X4_LMICPGANIN_IN2R_10K 0x10 | 122 | #define AIC32X4_LMICPGANIN_IN2R_10K 0x10 |
| 123 | #define AIC32X4_LMICPGANIN_CM1L_10K 0x40 | ||
| 123 | #define AIC32X4_RMICPGANIN_IN1L_10K 0x10 | 124 | #define AIC32X4_RMICPGANIN_IN1L_10K 0x10 |
| 125 | #define AIC32X4_RMICPGANIN_CM1R_10K 0x40 | ||
| 124 | 126 | ||
| 125 | #define AIC32X4_LMICPGAVOL_NOGAIN 0x80 | 127 | #define AIC32X4_LMICPGAVOL_NOGAIN 0x80 |
| 126 | #define AIC32X4_RMICPGAVOL_NOGAIN 0x80 | 128 | #define AIC32X4_RMICPGAVOL_NOGAIN 0x80 |
| @@ -138,6 +140,7 @@ | |||
| 138 | #define AIC32X4_LDAC2RCHN (0x02 << 4) | 140 | #define AIC32X4_LDAC2RCHN (0x02 << 4) |
| 139 | #define AIC32X4_LDAC2LCHN (0x01 << 4) | 141 | #define AIC32X4_LDAC2LCHN (0x01 << 4) |
| 140 | #define AIC32X4_RDAC2RCHN (0x01 << 2) | 142 | #define AIC32X4_RDAC2RCHN (0x01 << 2) |
| 143 | #define AIC32X4_DAC_CHAN_MASK 0x3c | ||
| 141 | 144 | ||
| 142 | #define AIC32X4_SSTEP2WCLK 0x01 | 145 | #define AIC32X4_SSTEP2WCLK 0x01 |
| 143 | #define AIC32X4_MUTEON 0x0C | 146 | #define AIC32X4_MUTEON 0x0C |
diff --git a/sound/soc/codecs/wm5100.c b/sound/soc/codecs/wm5100.c index 4cf91deabc02..4e3e31aaf509 100644 --- a/sound/soc/codecs/wm5100.c +++ b/sound/soc/codecs/wm5100.c | |||
| @@ -14,6 +14,7 @@ | |||
| 14 | #include <linux/moduleparam.h> | 14 | #include <linux/moduleparam.h> |
| 15 | #include <linux/init.h> | 15 | #include <linux/init.h> |
| 16 | #include <linux/delay.h> | 16 | #include <linux/delay.h> |
| 17 | #include <linux/export.h> | ||
| 17 | #include <linux/pm.h> | 18 | #include <linux/pm.h> |
| 18 | #include <linux/gcd.h> | 19 | #include <linux/gcd.h> |
| 19 | #include <linux/gpio.h> | 20 | #include <linux/gpio.h> |
| @@ -2141,6 +2142,7 @@ int wm5100_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack) | |||
| 2141 | 2142 | ||
| 2142 | return 0; | 2143 | return 0; |
| 2143 | } | 2144 | } |
| 2145 | EXPORT_SYMBOL_GPL(wm5100_detect); | ||
| 2144 | 2146 | ||
| 2145 | static irqreturn_t wm5100_irq(int irq, void *data) | 2147 | static irqreturn_t wm5100_irq(int irq, void *data) |
| 2146 | { | 2148 | { |
diff --git a/sound/soc/codecs/wm5110.c b/sound/soc/codecs/wm5110.c index d862f76b59f9..2c3c962d9a85 100644 --- a/sound/soc/codecs/wm5110.c +++ b/sound/soc/codecs/wm5110.c | |||
| @@ -81,6 +81,54 @@ static const struct reg_default wm5110_sysclk_revd_patch[] = { | |||
| 81 | { 0x3133, 0x1201 }, | 81 | { 0x3133, 0x1201 }, |
| 82 | { 0x3183, 0x1501 }, | 82 | { 0x3183, 0x1501 }, |
| 83 | { 0x31D3, 0x1401 }, | 83 | { 0x31D3, 0x1401 }, |
| 84 | { 0x0049, 0x01ea }, | ||
| 85 | { 0x004a, 0x01f2 }, | ||
| 86 | { 0x0057, 0x01e7 }, | ||
| 87 | { 0x0058, 0x01fb }, | ||
| 88 | { 0x33ce, 0xc4f5 }, | ||
| 89 | { 0x33cf, 0x1361 }, | ||
| 90 | { 0x33d0, 0x0402 }, | ||
| 91 | { 0x33d1, 0x4700 }, | ||
| 92 | { 0x33d2, 0x026d }, | ||
| 93 | { 0x33d3, 0xff00 }, | ||
| 94 | { 0x33d4, 0x026d }, | ||
| 95 | { 0x33d5, 0x0101 }, | ||
| 96 | { 0x33d6, 0xc4f5 }, | ||
| 97 | { 0x33d7, 0x0361 }, | ||
| 98 | { 0x33d8, 0x0402 }, | ||
| 99 | { 0x33d9, 0x6701 }, | ||
| 100 | { 0x33da, 0xc4f5 }, | ||
| 101 | { 0x33db, 0x136f }, | ||
| 102 | { 0x33dc, 0xc4f5 }, | ||
| 103 | { 0x33dd, 0x134f }, | ||
| 104 | { 0x33de, 0xc4f5 }, | ||
| 105 | { 0x33df, 0x131f }, | ||
| 106 | { 0x33e0, 0x026d }, | ||
| 107 | { 0x33e1, 0x4f01 }, | ||
| 108 | { 0x33e2, 0x026d }, | ||
| 109 | { 0x33e3, 0xf100 }, | ||
| 110 | { 0x33e4, 0x026d }, | ||
| 111 | { 0x33e5, 0x0001 }, | ||
| 112 | { 0x33e6, 0xc4f5 }, | ||
| 113 | { 0x33e7, 0x0361 }, | ||
| 114 | { 0x33e8, 0x0402 }, | ||
| 115 | { 0x33e9, 0x6601 }, | ||
| 116 | { 0x33ea, 0xc4f5 }, | ||
| 117 | { 0x33eb, 0x136f }, | ||
| 118 | { 0x33ec, 0xc4f5 }, | ||
| 119 | { 0x33ed, 0x134f }, | ||
| 120 | { 0x33ee, 0xc4f5 }, | ||
| 121 | { 0x33ef, 0x131f }, | ||
| 122 | { 0x33f0, 0x026d }, | ||
| 123 | { 0x33f1, 0x4e01 }, | ||
| 124 | { 0x33f2, 0x026d }, | ||
| 125 | { 0x33f3, 0xf000 }, | ||
| 126 | { 0x33f6, 0xc4f5 }, | ||
| 127 | { 0x33f7, 0x1361 }, | ||
| 128 | { 0x33f8, 0x0402 }, | ||
| 129 | { 0x33f9, 0x4600 }, | ||
| 130 | { 0x33fa, 0x026d }, | ||
| 131 | { 0x33fb, 0xfe00 }, | ||
| 84 | }; | 132 | }; |
| 85 | 133 | ||
| 86 | static int wm5110_sysclk_ev(struct snd_soc_dapm_widget *w, | 134 | static int wm5110_sysclk_ev(struct snd_soc_dapm_widget *w, |
diff --git a/sound/soc/fsl/fsl_ssi.c b/sound/soc/fsl/fsl_ssi.c index f9090b167ad7..1c791ddbf006 100644 --- a/sound/soc/fsl/fsl_ssi.c +++ b/sound/soc/fsl/fsl_ssi.c | |||
| @@ -1262,18 +1262,13 @@ static int fsl_ssi_probe(struct platform_device *pdev) | |||
| 1262 | return -EINVAL; | 1262 | return -EINVAL; |
| 1263 | hw_type = (enum fsl_ssi_type) of_id->data; | 1263 | hw_type = (enum fsl_ssi_type) of_id->data; |
| 1264 | 1264 | ||
| 1265 | /* We only support the SSI in "I2S Slave" mode */ | ||
| 1266 | sprop = of_get_property(np, "fsl,mode", NULL); | 1265 | sprop = of_get_property(np, "fsl,mode", NULL); |
| 1267 | if (!sprop) { | 1266 | if (!sprop) { |
| 1268 | dev_err(&pdev->dev, "fsl,mode property is necessary\n"); | 1267 | dev_err(&pdev->dev, "fsl,mode property is necessary\n"); |
| 1269 | return -EINVAL; | 1268 | return -EINVAL; |
| 1270 | } | 1269 | } |
| 1271 | if (!strcmp(sprop, "ac97-slave")) { | 1270 | if (!strcmp(sprop, "ac97-slave")) |
| 1272 | ac97 = true; | 1271 | ac97 = true; |
| 1273 | } else if (strcmp(sprop, "i2s-slave")) { | ||
| 1274 | dev_notice(&pdev->dev, "mode %s is unsupported\n", sprop); | ||
| 1275 | return -ENODEV; | ||
| 1276 | } | ||
| 1277 | 1272 | ||
| 1278 | /* The DAI name is the last part of the full name of the node. */ | 1273 | /* The DAI name is the last part of the full name of the node. */ |
| 1279 | p = strrchr(np->full_name, '/') + 1; | 1274 | p = strrchr(np->full_name, '/') + 1; |
| @@ -1391,7 +1386,7 @@ static int fsl_ssi_probe(struct platform_device *pdev) | |||
| 1391 | */ | 1386 | */ |
| 1392 | ssi_private->baudclk = devm_clk_get(&pdev->dev, "baud"); | 1387 | ssi_private->baudclk = devm_clk_get(&pdev->dev, "baud"); |
| 1393 | if (IS_ERR(ssi_private->baudclk)) | 1388 | if (IS_ERR(ssi_private->baudclk)) |
| 1394 | dev_warn(&pdev->dev, "could not get baud clock: %ld\n", | 1389 | dev_dbg(&pdev->dev, "could not get baud clock: %ld\n", |
| 1395 | PTR_ERR(ssi_private->baudclk)); | 1390 | PTR_ERR(ssi_private->baudclk)); |
| 1396 | else | 1391 | else |
| 1397 | clk_prepare_enable(ssi_private->baudclk); | 1392 | clk_prepare_enable(ssi_private->baudclk); |
diff --git a/sound/soc/omap/Kconfig b/sound/soc/omap/Kconfig index 4a07f7179690..22ad9c5654b5 100644 --- a/sound/soc/omap/Kconfig +++ b/sound/soc/omap/Kconfig | |||
| @@ -30,6 +30,7 @@ config SND_OMAP_SOC_RX51 | |||
| 30 | select SND_OMAP_SOC_MCBSP | 30 | select SND_OMAP_SOC_MCBSP |
| 31 | select SND_SOC_TLV320AIC3X | 31 | select SND_SOC_TLV320AIC3X |
| 32 | select SND_SOC_TPA6130A2 | 32 | select SND_SOC_TPA6130A2 |
| 33 | depends on GPIOLIB | ||
| 33 | help | 34 | help |
| 34 | Say Y if you want to add support for SoC audio on Nokia RX-51 | 35 | Say Y if you want to add support for SoC audio on Nokia RX-51 |
| 35 | hardware. This is also known as Nokia N900 product. | 36 | hardware. This is also known as Nokia N900 product. |
diff --git a/sound/soc/samsung/Kconfig b/sound/soc/samsung/Kconfig index 27930fc432dc..454f41cfc828 100644 --- a/sound/soc/samsung/Kconfig +++ b/sound/soc/samsung/Kconfig | |||
| @@ -19,7 +19,7 @@ config SND_S3C_DMA_LEGACY | |||
| 19 | 19 | ||
| 20 | config SND_S3C24XX_I2S | 20 | config SND_S3C24XX_I2S |
| 21 | tristate | 21 | tristate |
| 22 | select S3C2410_DMA | 22 | select S3C24XX_DMA |
| 23 | 23 | ||
| 24 | config SND_S3C_I2SV2_SOC | 24 | config SND_S3C_I2SV2_SOC |
| 25 | tristate | 25 | tristate |
| @@ -210,7 +210,7 @@ config SND_SOC_TOBERMORY | |||
| 210 | 210 | ||
| 211 | config SND_SOC_BELLS | 211 | config SND_SOC_BELLS |
| 212 | tristate "Audio support for Wolfson Bells" | 212 | tristate "Audio support for Wolfson Bells" |
| 213 | depends on SND_SOC_SAMSUNG && MACH_WLF_CRAGG_6410 | 213 | depends on SND_SOC_SAMSUNG && MACH_WLF_CRAGG_6410 && MFD_ARIZONA |
| 214 | select SND_SAMSUNG_I2S | 214 | select SND_SAMSUNG_I2S |
| 215 | select SND_SOC_WM5102 | 215 | select SND_SOC_WM5102 |
| 216 | select SND_SOC_WM5110 | 216 | select SND_SOC_WM5110 |
diff --git a/sound/soc/samsung/h1940_uda1380.c b/sound/soc/samsung/h1940_uda1380.c index fa91376e323d..fbced589d077 100644 --- a/sound/soc/samsung/h1940_uda1380.c +++ b/sound/soc/samsung/h1940_uda1380.c | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | #include "regs-iis.h" | 23 | #include "regs-iis.h" |
| 24 | #include <asm/mach-types.h> | 24 | #include <asm/mach-types.h> |
| 25 | 25 | ||
| 26 | #include <mach/gpio-samsung.h> | ||
| 26 | #include "s3c24xx-i2s.h" | 27 | #include "s3c24xx-i2s.h" |
| 27 | 28 | ||
| 28 | static unsigned int rates[] = { | 29 | static unsigned int rates[] = { |
diff --git a/sound/soc/samsung/i2s.c b/sound/soc/samsung/i2s.c index 92f64363427d..0a9b44c940ce 100644 --- a/sound/soc/samsung/i2s.c +++ b/sound/soc/samsung/i2s.c | |||
| @@ -22,8 +22,6 @@ | |||
| 22 | #include <sound/soc.h> | 22 | #include <sound/soc.h> |
| 23 | #include <sound/pcm_params.h> | 23 | #include <sound/pcm_params.h> |
| 24 | 24 | ||
| 25 | #include <mach/dma.h> | ||
| 26 | |||
| 27 | #include <linux/platform_data/asoc-s3c.h> | 25 | #include <linux/platform_data/asoc-s3c.h> |
| 28 | 26 | ||
| 29 | #include "dma.h" | 27 | #include "dma.h" |
| @@ -1268,7 +1266,8 @@ static int samsung_i2s_probe(struct platform_device *pdev) | |||
| 1268 | 1266 | ||
| 1269 | return 0; | 1267 | return 0; |
| 1270 | err: | 1268 | err: |
| 1271 | release_mem_region(regs_base, resource_size(res)); | 1269 | if (res) |
| 1270 | release_mem_region(regs_base, resource_size(res)); | ||
| 1272 | 1271 | ||
| 1273 | return ret; | 1272 | return ret; |
| 1274 | } | 1273 | } |
diff --git a/sound/soc/samsung/neo1973_wm8753.c b/sound/soc/samsung/neo1973_wm8753.c index 807db417d234..98a04c11202d 100644 --- a/sound/soc/samsung/neo1973_wm8753.c +++ b/sound/soc/samsung/neo1973_wm8753.c | |||
| @@ -20,6 +20,7 @@ | |||
| 20 | 20 | ||
| 21 | #include <sound/soc.h> | 21 | #include <sound/soc.h> |
| 22 | 22 | ||
| 23 | #include <mach/gpio-samsung.h> | ||
| 23 | #include <asm/mach-types.h> | 24 | #include <asm/mach-types.h> |
| 24 | #include "regs-iis.h" | 25 | #include "regs-iis.h" |
| 25 | 26 | ||
diff --git a/sound/soc/samsung/rx1950_uda1380.c b/sound/soc/samsung/rx1950_uda1380.c index 704460a37005..06ebdc061770 100644 --- a/sound/soc/samsung/rx1950_uda1380.c +++ b/sound/soc/samsung/rx1950_uda1380.c | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | #include <sound/soc.h> | 24 | #include <sound/soc.h> |
| 25 | #include <sound/jack.h> | 25 | #include <sound/jack.h> |
| 26 | 26 | ||
| 27 | #include <mach/gpio-samsung.h> | ||
| 27 | #include "regs-iis.h" | 28 | #include "regs-iis.h" |
| 28 | #include <asm/mach-types.h> | 29 | #include <asm/mach-types.h> |
| 29 | 30 | ||
diff --git a/sound/soc/samsung/s3c-i2s-v2.c b/sound/soc/samsung/s3c-i2s-v2.c index fefc56100349..79e7efb9283c 100644 --- a/sound/soc/samsung/s3c-i2s-v2.c +++ b/sound/soc/samsung/s3c-i2s-v2.c | |||
| @@ -729,7 +729,7 @@ int s3c_i2sv2_register_component(struct device *dev, int id, | |||
| 729 | struct snd_soc_component_driver *cmp_drv, | 729 | struct snd_soc_component_driver *cmp_drv, |
| 730 | struct snd_soc_dai_driver *dai_drv) | 730 | struct snd_soc_dai_driver *dai_drv) |
| 731 | { | 731 | { |
| 732 | struct snd_soc_dai_ops *ops = drv->ops; | 732 | struct snd_soc_dai_ops *ops = dai_drv->ops; |
| 733 | 733 | ||
| 734 | ops->trigger = s3c2412_i2s_trigger; | 734 | ops->trigger = s3c2412_i2s_trigger; |
| 735 | if (!ops->hw_params) | 735 | if (!ops->hw_params) |
| @@ -742,8 +742,8 @@ int s3c_i2sv2_register_component(struct device *dev, int id, | |||
| 742 | if (!ops->delay) | 742 | if (!ops->delay) |
| 743 | ops->delay = s3c2412_i2s_delay; | 743 | ops->delay = s3c2412_i2s_delay; |
| 744 | 744 | ||
| 745 | drv->suspend = s3c2412_i2s_suspend; | 745 | dai_drv->suspend = s3c2412_i2s_suspend; |
| 746 | drv->resume = s3c2412_i2s_resume; | 746 | dai_drv->resume = s3c2412_i2s_resume; |
| 747 | 747 | ||
| 748 | return snd_soc_register_component(dev, cmp_drv, dai_drv, 1); | 748 | return snd_soc_register_component(dev, cmp_drv, dai_drv, 1); |
| 749 | } | 749 | } |
diff --git a/sound/soc/samsung/s3c2412-i2s.c b/sound/soc/samsung/s3c2412-i2s.c index ea885cb9f76c..d0794458963a 100644 --- a/sound/soc/samsung/s3c2412-i2s.c +++ b/sound/soc/samsung/s3c2412-i2s.c | |||
| @@ -26,6 +26,8 @@ | |||
| 26 | #include <sound/pcm_params.h> | 26 | #include <sound/pcm_params.h> |
| 27 | 27 | ||
| 28 | #include <mach/dma.h> | 28 | #include <mach/dma.h> |
| 29 | #include <mach/gpio-samsung.h> | ||
| 30 | #include <plat/gpio-cfg.h> | ||
| 29 | 31 | ||
| 30 | #include "dma.h" | 32 | #include "dma.h" |
| 31 | #include "regs-i2s-v2.h" | 33 | #include "regs-i2s-v2.h" |
diff --git a/sound/soc/samsung/s3c24xx-i2s.c b/sound/soc/samsung/s3c24xx-i2s.c index 9c8ebd872fac..f31e916dd8c4 100644 --- a/sound/soc/samsung/s3c24xx-i2s.c +++ b/sound/soc/samsung/s3c24xx-i2s.c | |||
| @@ -24,6 +24,8 @@ | |||
| 24 | #include <sound/pcm_params.h> | 24 | #include <sound/pcm_params.h> |
| 25 | 25 | ||
| 26 | #include <mach/dma.h> | 26 | #include <mach/dma.h> |
| 27 | #include <mach/gpio-samsung.h> | ||
| 28 | #include <plat/gpio-cfg.h> | ||
| 27 | #include "regs-iis.h" | 29 | #include "regs-iis.h" |
| 28 | 30 | ||
| 29 | #include "dma.h" | 31 | #include "dma.h" |
diff --git a/sound/soc/samsung/smartq_wm8987.c b/sound/soc/samsung/smartq_wm8987.c index 58ae3237ef69..c3b2adafb7b5 100644 --- a/sound/soc/samsung/smartq_wm8987.c +++ b/sound/soc/samsung/smartq_wm8987.c | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | #include <sound/soc.h> | 19 | #include <sound/soc.h> |
| 20 | #include <sound/jack.h> | 20 | #include <sound/jack.h> |
| 21 | 21 | ||
| 22 | #include <mach/gpio-samsung.h> | ||
| 22 | #include <asm/mach-types.h> | 23 | #include <asm/mach-types.h> |
| 23 | 24 | ||
| 24 | #include "i2s.h" | 25 | #include "i2s.h" |
diff --git a/sound/soc/samsung/smdk_wm8994.c b/sound/soc/samsung/smdk_wm8994.c index b072bd107b31..d38ae98e2f32 100644 --- a/sound/soc/samsung/smdk_wm8994.c +++ b/sound/soc/samsung/smdk_wm8994.c | |||
| @@ -152,13 +152,11 @@ static struct snd_soc_card smdk = { | |||
| 152 | .num_links = ARRAY_SIZE(smdk_dai), | 152 | .num_links = ARRAY_SIZE(smdk_dai), |
| 153 | }; | 153 | }; |
| 154 | 154 | ||
| 155 | #ifdef CONFIG_OF | ||
| 156 | static const struct of_device_id samsung_wm8994_of_match[] = { | 155 | static const struct of_device_id samsung_wm8994_of_match[] = { |
| 157 | { .compatible = "samsung,smdk-wm8994", .data = &smdk_board_data }, | 156 | { .compatible = "samsung,smdk-wm8994", .data = &smdk_board_data }, |
| 158 | {}, | 157 | {}, |
| 159 | }; | 158 | }; |
| 160 | MODULE_DEVICE_TABLE(of, samsung_wm8994_of_match); | 159 | MODULE_DEVICE_TABLE(of, samsung_wm8994_of_match); |
| 161 | #endif /* CONFIG_OF */ | ||
| 162 | 160 | ||
| 163 | static int smdk_audio_probe(struct platform_device *pdev) | 161 | static int smdk_audio_probe(struct platform_device *pdev) |
| 164 | { | 162 | { |
| @@ -188,7 +186,7 @@ static int smdk_audio_probe(struct platform_device *pdev) | |||
| 188 | smdk_dai[0].platform_of_node = smdk_dai[0].cpu_of_node; | 186 | smdk_dai[0].platform_of_node = smdk_dai[0].cpu_of_node; |
| 189 | } | 187 | } |
| 190 | 188 | ||
| 191 | id = of_match_device(samsung_wm8994_of_match, &pdev->dev); | 189 | id = of_match_device(of_match_ptr(samsung_wm8994_of_match), &pdev->dev); |
| 192 | if (id) | 190 | if (id) |
| 193 | *board = *((struct smdk_wm8994_data *)id->data); | 191 | *board = *((struct smdk_wm8994_data *)id->data); |
| 194 | 192 | ||
