diff options
author | David S. Miller <davem@davemloft.net> | 2012-05-16 22:17:37 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-05-16 22:17:37 -0400 |
commit | 028940342a906db8da014a7603a0deddc2c323dd (patch) | |
tree | 688dbc38a3e218f2493d311b1d70a67668837347 | |
parent | be3eed2e96340d3c7a4d1ea1d63e7bd6095d1e34 (diff) | |
parent | 0e93b4b304ae052ba1bc73f6d34a68556fe93429 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
232 files changed, 1488 insertions, 1060 deletions
diff --git a/Documentation/devicetree/bindings/sound/sgtl5000.txt b/Documentation/devicetree/bindings/sound/sgtl5000.txt index 2c3cd413f042..9cc44449508d 100644 --- a/Documentation/devicetree/bindings/sound/sgtl5000.txt +++ b/Documentation/devicetree/bindings/sound/sgtl5000.txt | |||
@@ -3,6 +3,8 @@ | |||
3 | Required properties: | 3 | Required properties: |
4 | - compatible : "fsl,sgtl5000". | 4 | - compatible : "fsl,sgtl5000". |
5 | 5 | ||
6 | - reg : the I2C address of the device | ||
7 | |||
6 | Example: | 8 | Example: |
7 | 9 | ||
8 | codec: sgtl5000@0a { | 10 | codec: sgtl5000@0a { |
diff --git a/Documentation/feature-removal-schedule.txt b/Documentation/feature-removal-schedule.txt index 03ca210406ed..e4b57756b9f5 100644 --- a/Documentation/feature-removal-schedule.txt +++ b/Documentation/feature-removal-schedule.txt | |||
@@ -539,3 +539,13 @@ When: 3.6 | |||
539 | Why: setitimer is not returning -EFAULT if user pointer is NULL. This | 539 | Why: setitimer is not returning -EFAULT if user pointer is NULL. This |
540 | violates the spec. | 540 | violates the spec. |
541 | Who: Sasikantha Babu <sasikanth.v19@gmail.com> | 541 | Who: Sasikantha Babu <sasikanth.v19@gmail.com> |
542 | |||
543 | ---------------------------- | ||
544 | |||
545 | What: V4L2_CID_HCENTER, V4L2_CID_VCENTER V4L2 controls | ||
546 | When: 3.7 | ||
547 | Why: The V4L2_CID_VCENTER, V4L2_CID_HCENTER controls have been deprecated | ||
548 | for about 4 years and they are not used by any mainline driver. | ||
549 | There are newer controls (V4L2_CID_PAN*, V4L2_CID_TILT*) that provide | ||
550 | similar functionality. | ||
551 | Who: Sylwester Nawrocki <sylvester.nawrocki@gmail.com> | ||
diff --git a/MAINTAINERS b/MAINTAINERS index 887c965c2711..490dd6e640ac 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -1969,10 +1969,9 @@ S: Maintained | |||
1969 | F: drivers/net/ethernet/ti/cpmac.c | 1969 | F: drivers/net/ethernet/ti/cpmac.c |
1970 | 1970 | ||
1971 | CPU FREQUENCY DRIVERS | 1971 | CPU FREQUENCY DRIVERS |
1972 | M: Dave Jones <davej@redhat.com> | 1972 | M: Rafael J. Wysocki <rjw@sisk.pl> |
1973 | L: cpufreq@vger.kernel.org | 1973 | L: cpufreq@vger.kernel.org |
1974 | W: http://www.codemonkey.org.uk/projects/cpufreq/ | 1974 | L: linux-pm@vger.kernel.org |
1975 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/davej/cpufreq.git | ||
1976 | S: Maintained | 1975 | S: Maintained |
1977 | F: drivers/cpufreq/ | 1976 | F: drivers/cpufreq/ |
1978 | F: include/linux/cpufreq.h | 1977 | F: include/linux/cpufreq.h |
@@ -4032,6 +4031,7 @@ F: Documentation/scsi/53c700.txt | |||
4032 | F: drivers/scsi/53c700* | 4031 | F: drivers/scsi/53c700* |
4033 | 4032 | ||
4034 | LED SUBSYSTEM | 4033 | LED SUBSYSTEM |
4034 | M: Bryan Wu <bryan.wu@canonical.com> | ||
4035 | M: Richard Purdie <rpurdie@rpsys.net> | 4035 | M: Richard Purdie <rpurdie@rpsys.net> |
4036 | S: Maintained | 4036 | S: Maintained |
4037 | F: drivers/leds/ | 4037 | F: drivers/leds/ |
@@ -1,7 +1,7 @@ | |||
1 | VERSION = 3 | 1 | VERSION = 3 |
2 | PATCHLEVEL = 4 | 2 | PATCHLEVEL = 4 |
3 | SUBLEVEL = 0 | 3 | SUBLEVEL = 0 |
4 | EXTRAVERSION = -rc5 | 4 | EXTRAVERSION = -rc7 |
5 | NAME = Saber-toothed Squirrel | 5 | NAME = Saber-toothed Squirrel |
6 | 6 | ||
7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
diff --git a/arch/alpha/Kconfig b/arch/alpha/Kconfig index 56a4df952fb0..22e58a99f38b 100644 --- a/arch/alpha/Kconfig +++ b/arch/alpha/Kconfig | |||
@@ -477,7 +477,7 @@ config ALPHA_BROKEN_IRQ_MASK | |||
477 | 477 | ||
478 | config VGA_HOSE | 478 | config VGA_HOSE |
479 | bool | 479 | bool |
480 | depends on ALPHA_GENERIC || ALPHA_TITAN || ALPHA_MARVEL || ALPHA_TSUNAMI | 480 | depends on VGA_CONSOLE && (ALPHA_GENERIC || ALPHA_TITAN || ALPHA_MARVEL || ALPHA_TSUNAMI) |
481 | default y | 481 | default y |
482 | help | 482 | help |
483 | Support VGA on an arbitrary hose; needed for several platforms | 483 | Support VGA on an arbitrary hose; needed for several platforms |
diff --git a/arch/alpha/include/asm/rtc.h b/arch/alpha/include/asm/rtc.h index 1f7fba671ae6..d70408d36677 100644 --- a/arch/alpha/include/asm/rtc.h +++ b/arch/alpha/include/asm/rtc.h | |||
@@ -1,14 +1,10 @@ | |||
1 | #ifndef _ALPHA_RTC_H | 1 | #ifndef _ALPHA_RTC_H |
2 | #define _ALPHA_RTC_H | 2 | #define _ALPHA_RTC_H |
3 | 3 | ||
4 | #if defined(CONFIG_ALPHA_GENERIC) | 4 | #if defined(CONFIG_ALPHA_MARVEL) && defined(CONFIG_SMP) \ |
5 | || defined(CONFIG_ALPHA_GENERIC) | ||
5 | # define get_rtc_time alpha_mv.rtc_get_time | 6 | # define get_rtc_time alpha_mv.rtc_get_time |
6 | # define set_rtc_time alpha_mv.rtc_set_time | 7 | # define set_rtc_time alpha_mv.rtc_set_time |
7 | #else | ||
8 | # if defined(CONFIG_ALPHA_MARVEL) && defined(CONFIG_SMP) | ||
9 | # define get_rtc_time marvel_get_rtc_time | ||
10 | # define set_rtc_time marvel_set_rtc_time | ||
11 | # endif | ||
12 | #endif | 8 | #endif |
13 | 9 | ||
14 | #include <asm-generic/rtc.h> | 10 | #include <asm-generic/rtc.h> |
diff --git a/arch/alpha/kernel/core_tsunami.c b/arch/alpha/kernel/core_tsunami.c index 5e7c28f92f19..61893d7bdda5 100644 --- a/arch/alpha/kernel/core_tsunami.c +++ b/arch/alpha/kernel/core_tsunami.c | |||
@@ -11,6 +11,7 @@ | |||
11 | #include <asm/core_tsunami.h> | 11 | #include <asm/core_tsunami.h> |
12 | #undef __EXTERN_INLINE | 12 | #undef __EXTERN_INLINE |
13 | 13 | ||
14 | #include <linux/module.h> | ||
14 | #include <linux/types.h> | 15 | #include <linux/types.h> |
15 | #include <linux/pci.h> | 16 | #include <linux/pci.h> |
16 | #include <linux/sched.h> | 17 | #include <linux/sched.h> |
diff --git a/arch/alpha/kernel/sys_marvel.c b/arch/alpha/kernel/sys_marvel.c index 14a4b6a7cf59..407accc80877 100644 --- a/arch/alpha/kernel/sys_marvel.c +++ b/arch/alpha/kernel/sys_marvel.c | |||
@@ -317,7 +317,7 @@ marvel_init_irq(void) | |||
317 | } | 317 | } |
318 | 318 | ||
319 | static int | 319 | static int |
320 | marvel_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) | 320 | marvel_map_irq(struct pci_dev *dev, u8 slot, u8 pin) |
321 | { | 321 | { |
322 | struct pci_controller *hose = dev->sysdata; | 322 | struct pci_controller *hose = dev->sysdata; |
323 | struct io7_port *io7_port = hose->sysdata; | 323 | struct io7_port *io7_port = hose->sysdata; |
diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c index 80abafb9bf33..9650c143afc1 100644 --- a/arch/arm/kernel/ptrace.c +++ b/arch/arm/kernel/ptrace.c | |||
@@ -906,27 +906,14 @@ long arch_ptrace(struct task_struct *child, long request, | |||
906 | return ret; | 906 | return ret; |
907 | } | 907 | } |
908 | 908 | ||
909 | #ifdef __ARMEB__ | ||
910 | #define AUDIT_ARCH_NR AUDIT_ARCH_ARMEB | ||
911 | #else | ||
912 | #define AUDIT_ARCH_NR AUDIT_ARCH_ARM | ||
913 | #endif | ||
914 | |||
915 | asmlinkage int syscall_trace(int why, struct pt_regs *regs, int scno) | 909 | asmlinkage int syscall_trace(int why, struct pt_regs *regs, int scno) |
916 | { | 910 | { |
917 | unsigned long ip; | 911 | unsigned long ip; |
918 | 912 | ||
919 | /* | 913 | if (why) |
920 | * Save IP. IP is used to denote syscall entry/exit: | ||
921 | * IP = 0 -> entry, = 1 -> exit | ||
922 | */ | ||
923 | ip = regs->ARM_ip; | ||
924 | regs->ARM_ip = why; | ||
925 | |||
926 | if (!ip) | ||
927 | audit_syscall_exit(regs); | 914 | audit_syscall_exit(regs); |
928 | else | 915 | else |
929 | audit_syscall_entry(AUDIT_ARCH_NR, scno, regs->ARM_r0, | 916 | audit_syscall_entry(AUDIT_ARCH_ARM, scno, regs->ARM_r0, |
930 | regs->ARM_r1, regs->ARM_r2, regs->ARM_r3); | 917 | regs->ARM_r1, regs->ARM_r2, regs->ARM_r3); |
931 | 918 | ||
932 | if (!test_thread_flag(TIF_SYSCALL_TRACE)) | 919 | if (!test_thread_flag(TIF_SYSCALL_TRACE)) |
@@ -936,6 +923,13 @@ asmlinkage int syscall_trace(int why, struct pt_regs *regs, int scno) | |||
936 | 923 | ||
937 | current_thread_info()->syscall = scno; | 924 | current_thread_info()->syscall = scno; |
938 | 925 | ||
926 | /* | ||
927 | * IP is used to denote syscall entry/exit: | ||
928 | * IP = 0 -> entry, =1 -> exit | ||
929 | */ | ||
930 | ip = regs->ARM_ip; | ||
931 | regs->ARM_ip = why; | ||
932 | |||
939 | /* the 0x80 provides a way for the tracing parent to distinguish | 933 | /* the 0x80 provides a way for the tracing parent to distinguish |
940 | between a syscall stop and SIGTRAP delivery */ | 934 | between a syscall stop and SIGTRAP delivery */ |
941 | ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) | 935 | ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) |
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index f6a4d32b0421..8f4644659777 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c | |||
@@ -251,8 +251,6 @@ asmlinkage void __cpuinit secondary_start_kernel(void) | |||
251 | struct mm_struct *mm = &init_mm; | 251 | struct mm_struct *mm = &init_mm; |
252 | unsigned int cpu = smp_processor_id(); | 252 | unsigned int cpu = smp_processor_id(); |
253 | 253 | ||
254 | printk("CPU%u: Booted secondary processor\n", cpu); | ||
255 | |||
256 | /* | 254 | /* |
257 | * All kernel threads share the same mm context; grab a | 255 | * All kernel threads share the same mm context; grab a |
258 | * reference and switch to it. | 256 | * reference and switch to it. |
@@ -264,6 +262,8 @@ asmlinkage void __cpuinit secondary_start_kernel(void) | |||
264 | enter_lazy_tlb(mm, current); | 262 | enter_lazy_tlb(mm, current); |
265 | local_flush_tlb_all(); | 263 | local_flush_tlb_all(); |
266 | 264 | ||
265 | printk("CPU%u: Booted secondary processor\n", cpu); | ||
266 | |||
267 | cpu_init(); | 267 | cpu_init(); |
268 | preempt_disable(); | 268 | preempt_disable(); |
269 | trace_hardirqs_off(); | 269 | trace_hardirqs_off(); |
diff --git a/arch/arm/kernel/sys_arm.c b/arch/arm/kernel/sys_arm.c index d2b177905cdb..76cbb055dd05 100644 --- a/arch/arm/kernel/sys_arm.c +++ b/arch/arm/kernel/sys_arm.c | |||
@@ -115,7 +115,7 @@ int kernel_execve(const char *filename, | |||
115 | "Ir" (THREAD_START_SP - sizeof(regs)), | 115 | "Ir" (THREAD_START_SP - sizeof(regs)), |
116 | "r" (®s), | 116 | "r" (®s), |
117 | "Ir" (sizeof(regs)) | 117 | "Ir" (sizeof(regs)) |
118 | : "r0", "r1", "r2", "r3", "ip", "lr", "memory"); | 118 | : "r0", "r1", "r2", "r3", "r8", "r9", "ip", "lr", "memory"); |
119 | 119 | ||
120 | out: | 120 | out: |
121 | return ret; | 121 | return ret; |
diff --git a/arch/arm/mach-exynos/Kconfig b/arch/arm/mach-exynos/Kconfig index e81c35f936b5..b8df521fb68e 100644 --- a/arch/arm/mach-exynos/Kconfig +++ b/arch/arm/mach-exynos/Kconfig | |||
@@ -232,6 +232,9 @@ config MACH_ARMLEX4210 | |||
232 | config MACH_UNIVERSAL_C210 | 232 | config MACH_UNIVERSAL_C210 |
233 | bool "Mobile UNIVERSAL_C210 Board" | 233 | bool "Mobile UNIVERSAL_C210 Board" |
234 | select CPU_EXYNOS4210 | 234 | select CPU_EXYNOS4210 |
235 | select S5P_HRT | ||
236 | select CLKSRC_MMIO | ||
237 | select HAVE_SCHED_CLOCK | ||
235 | select S5P_GPIO_INT | 238 | select S5P_GPIO_INT |
236 | select S5P_DEV_FIMC0 | 239 | select S5P_DEV_FIMC0 |
237 | select S5P_DEV_FIMC1 | 240 | select S5P_DEV_FIMC1 |
diff --git a/arch/arm/mach-exynos/clock-exynos5.c b/arch/arm/mach-exynos/clock-exynos5.c index 5cd7a8b8868c..7ac6ff4c46bd 100644 --- a/arch/arm/mach-exynos/clock-exynos5.c +++ b/arch/arm/mach-exynos/clock-exynos5.c | |||
@@ -678,7 +678,7 @@ static struct clk exynos5_clk_pdma1 = { | |||
678 | .name = "dma", | 678 | .name = "dma", |
679 | .devname = "dma-pl330.1", | 679 | .devname = "dma-pl330.1", |
680 | .enable = exynos5_clk_ip_fsys_ctrl, | 680 | .enable = exynos5_clk_ip_fsys_ctrl, |
681 | .ctrlbit = (1 << 1), | 681 | .ctrlbit = (1 << 2), |
682 | }; | 682 | }; |
683 | 683 | ||
684 | static struct clk exynos5_clk_mdma1 = { | 684 | static struct clk exynos5_clk_mdma1 = { |
diff --git a/arch/arm/mach-exynos/mach-universal_c210.c b/arch/arm/mach-exynos/mach-universal_c210.c index cb2b027f09a6..a34036eb8ba2 100644 --- a/arch/arm/mach-exynos/mach-universal_c210.c +++ b/arch/arm/mach-exynos/mach-universal_c210.c | |||
@@ -40,6 +40,7 @@ | |||
40 | #include <plat/pd.h> | 40 | #include <plat/pd.h> |
41 | #include <plat/regs-fb-v4.h> | 41 | #include <plat/regs-fb-v4.h> |
42 | #include <plat/fimc-core.h> | 42 | #include <plat/fimc-core.h> |
43 | #include <plat/s5p-time.h> | ||
43 | #include <plat/camport.h> | 44 | #include <plat/camport.h> |
44 | #include <plat/mipi_csis.h> | 45 | #include <plat/mipi_csis.h> |
45 | 46 | ||
@@ -1063,6 +1064,7 @@ static void __init universal_map_io(void) | |||
1063 | exynos_init_io(NULL, 0); | 1064 | exynos_init_io(NULL, 0); |
1064 | s3c24xx_init_clocks(24000000); | 1065 | s3c24xx_init_clocks(24000000); |
1065 | s3c24xx_init_uarts(universal_uartcfgs, ARRAY_SIZE(universal_uartcfgs)); | 1066 | s3c24xx_init_uarts(universal_uartcfgs, ARRAY_SIZE(universal_uartcfgs)); |
1067 | s5p_set_timer_source(S5P_PWM2, S5P_PWM4); | ||
1066 | } | 1068 | } |
1067 | 1069 | ||
1068 | static void s5p_tv_setup(void) | 1070 | static void s5p_tv_setup(void) |
@@ -1113,7 +1115,7 @@ MACHINE_START(UNIVERSAL_C210, "UNIVERSAL_C210") | |||
1113 | .map_io = universal_map_io, | 1115 | .map_io = universal_map_io, |
1114 | .handle_irq = gic_handle_irq, | 1116 | .handle_irq = gic_handle_irq, |
1115 | .init_machine = universal_machine_init, | 1117 | .init_machine = universal_machine_init, |
1116 | .timer = &exynos4_timer, | 1118 | .timer = &s5p_timer, |
1117 | .reserve = &universal_reserve, | 1119 | .reserve = &universal_reserve, |
1118 | .restart = exynos4_restart, | 1120 | .restart = exynos4_restart, |
1119 | MACHINE_END | 1121 | MACHINE_END |
diff --git a/arch/arm/mach-kirkwood/board-dt.c b/arch/arm/mach-kirkwood/board-dt.c index 1c672d9e6656..f7fe1b9f3170 100644 --- a/arch/arm/mach-kirkwood/board-dt.c +++ b/arch/arm/mach-kirkwood/board-dt.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
15 | #include <linux/of.h> | 15 | #include <linux/of.h> |
16 | #include <linux/of_platform.h> | 16 | #include <linux/of_platform.h> |
17 | #include <linux/kexec.h> | ||
17 | #include <asm/mach/arch.h> | 18 | #include <asm/mach/arch.h> |
18 | #include <asm/mach/map.h> | 19 | #include <asm/mach/map.h> |
19 | #include <mach/bridge-regs.h> | 20 | #include <mach/bridge-regs.h> |
diff --git a/arch/arm/mach-omap1/ams-delta-fiq.c b/arch/arm/mach-omap1/ams-delta-fiq.c index fcce7ff37630..cfd98b186fcc 100644 --- a/arch/arm/mach-omap1/ams-delta-fiq.c +++ b/arch/arm/mach-omap1/ams-delta-fiq.c | |||
@@ -48,7 +48,7 @@ static irqreturn_t deferred_fiq(int irq, void *dev_id) | |||
48 | struct irq_chip *irq_chip = NULL; | 48 | struct irq_chip *irq_chip = NULL; |
49 | int gpio, irq_num, fiq_count; | 49 | int gpio, irq_num, fiq_count; |
50 | 50 | ||
51 | irq_desc = irq_to_desc(IH_GPIO_BASE); | 51 | irq_desc = irq_to_desc(gpio_to_irq(AMS_DELTA_GPIO_PIN_KEYBRD_CLK)); |
52 | if (irq_desc) | 52 | if (irq_desc) |
53 | irq_chip = irq_desc->irq_data.chip; | 53 | irq_chip = irq_desc->irq_data.chip; |
54 | 54 | ||
diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-omap2/board-igep0020.c index 930c0d380435..740cee9369ba 100644 --- a/arch/arm/mach-omap2/board-igep0020.c +++ b/arch/arm/mach-omap2/board-igep0020.c | |||
@@ -641,7 +641,7 @@ static struct regulator_consumer_supply dummy_supplies[] = { | |||
641 | 641 | ||
642 | static void __init igep_init(void) | 642 | static void __init igep_init(void) |
643 | { | 643 | { |
644 | regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies)); | 644 | regulator_register_fixed(1, dummy_supplies, ARRAY_SIZE(dummy_supplies)); |
645 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); | 645 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); |
646 | 646 | ||
647 | /* Get IGEP2 hardware revision */ | 647 | /* Get IGEP2 hardware revision */ |
diff --git a/arch/arm/mach-omap2/include/mach/ctrl_module_pad_core_44xx.h b/arch/arm/mach-omap2/include/mach/ctrl_module_pad_core_44xx.h index 1e2d3322f33e..c88420de1151 100644 --- a/arch/arm/mach-omap2/include/mach/ctrl_module_pad_core_44xx.h +++ b/arch/arm/mach-omap2/include/mach/ctrl_module_pad_core_44xx.h | |||
@@ -941,10 +941,10 @@ | |||
941 | #define OMAP4_DSI2_LANEENABLE_MASK (0x7 << 29) | 941 | #define OMAP4_DSI2_LANEENABLE_MASK (0x7 << 29) |
942 | #define OMAP4_DSI1_LANEENABLE_SHIFT 24 | 942 | #define OMAP4_DSI1_LANEENABLE_SHIFT 24 |
943 | #define OMAP4_DSI1_LANEENABLE_MASK (0x1f << 24) | 943 | #define OMAP4_DSI1_LANEENABLE_MASK (0x1f << 24) |
944 | #define OMAP4_DSI2_PIPD_SHIFT 19 | 944 | #define OMAP4_DSI1_PIPD_SHIFT 19 |
945 | #define OMAP4_DSI2_PIPD_MASK (0x1f << 19) | 945 | #define OMAP4_DSI1_PIPD_MASK (0x1f << 19) |
946 | #define OMAP4_DSI1_PIPD_SHIFT 14 | 946 | #define OMAP4_DSI2_PIPD_SHIFT 14 |
947 | #define OMAP4_DSI1_PIPD_MASK (0x1f << 14) | 947 | #define OMAP4_DSI2_PIPD_MASK (0x1f << 14) |
948 | 948 | ||
949 | /* CONTROL_MCBSPLP */ | 949 | /* CONTROL_MCBSPLP */ |
950 | #define OMAP4_ALBCTRLRX_FSX_SHIFT 31 | 950 | #define OMAP4_ALBCTRLRX_FSX_SHIFT 31 |
diff --git a/arch/arm/mach-orion5x/mpp.h b/arch/arm/mach-orion5x/mpp.h index eac68978a2c2..db70e79a1198 100644 --- a/arch/arm/mach-orion5x/mpp.h +++ b/arch/arm/mach-orion5x/mpp.h | |||
@@ -65,8 +65,8 @@ | |||
65 | #define MPP8_GIGE MPP(8, 0x1, 0, 0, 1, 1, 1) | 65 | #define MPP8_GIGE MPP(8, 0x1, 0, 0, 1, 1, 1) |
66 | 66 | ||
67 | #define MPP9_UNUSED MPP(9, 0x0, 0, 0, 1, 1, 1) | 67 | #define MPP9_UNUSED MPP(9, 0x0, 0, 0, 1, 1, 1) |
68 | #define MPP9_GPIO MPP(9, 0x0, 0, 0, 1, 1, 1) | 68 | #define MPP9_GPIO MPP(9, 0x0, 1, 1, 1, 1, 1) |
69 | #define MPP9_GIGE MPP(9, 0x1, 1, 1, 1, 1, 1) | 69 | #define MPP9_GIGE MPP(9, 0x1, 0, 0, 1, 1, 1) |
70 | 70 | ||
71 | #define MPP10_UNUSED MPP(10, 0x0, 0, 0, 1, 1, 1) | 71 | #define MPP10_UNUSED MPP(10, 0x0, 0, 0, 1, 1, 1) |
72 | #define MPP10_GPIO MPP(10, 0x0, 1, 1, 1, 1, 1) | 72 | #define MPP10_GPIO MPP(10, 0x0, 1, 1, 1, 1, 1) |
diff --git a/arch/arm/mach-shmobile/board-ag5evm.c b/arch/arm/mach-shmobile/board-ag5evm.c index cb224a344af0..0891ec6e27f5 100644 --- a/arch/arm/mach-shmobile/board-ag5evm.c +++ b/arch/arm/mach-shmobile/board-ag5evm.c | |||
@@ -365,23 +365,13 @@ static struct platform_device mipidsi0_device = { | |||
365 | }; | 365 | }; |
366 | 366 | ||
367 | /* SDHI0 */ | 367 | /* SDHI0 */ |
368 | static irqreturn_t ag5evm_sdhi0_gpio_cd(int irq, void *arg) | ||
369 | { | ||
370 | struct device *dev = arg; | ||
371 | struct sh_mobile_sdhi_info *info = dev->platform_data; | ||
372 | struct tmio_mmc_data *pdata = info->pdata; | ||
373 | |||
374 | tmio_mmc_cd_wakeup(pdata); | ||
375 | |||
376 | return IRQ_HANDLED; | ||
377 | } | ||
378 | |||
379 | static struct sh_mobile_sdhi_info sdhi0_info = { | 368 | static struct sh_mobile_sdhi_info sdhi0_info = { |
380 | .dma_slave_tx = SHDMA_SLAVE_SDHI0_TX, | 369 | .dma_slave_tx = SHDMA_SLAVE_SDHI0_TX, |
381 | .dma_slave_rx = SHDMA_SLAVE_SDHI0_RX, | 370 | .dma_slave_rx = SHDMA_SLAVE_SDHI0_RX, |
382 | .tmio_flags = TMIO_MMC_HAS_IDLE_WAIT, | 371 | .tmio_flags = TMIO_MMC_HAS_IDLE_WAIT | TMIO_MMC_USE_GPIO_CD, |
383 | .tmio_caps = MMC_CAP_SD_HIGHSPEED, | 372 | .tmio_caps = MMC_CAP_SD_HIGHSPEED, |
384 | .tmio_ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29, | 373 | .tmio_ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29, |
374 | .cd_gpio = GPIO_PORT251, | ||
385 | }; | 375 | }; |
386 | 376 | ||
387 | static struct resource sdhi0_resources[] = { | 377 | static struct resource sdhi0_resources[] = { |
@@ -557,7 +547,6 @@ static void __init ag5evm_init(void) | |||
557 | lcd_backlight_reset(); | 547 | lcd_backlight_reset(); |
558 | 548 | ||
559 | /* enable SDHI0 on CN15 [SD I/F] */ | 549 | /* enable SDHI0 on CN15 [SD I/F] */ |
560 | gpio_request(GPIO_FN_SDHICD0, NULL); | ||
561 | gpio_request(GPIO_FN_SDHIWP0, NULL); | 550 | gpio_request(GPIO_FN_SDHIWP0, NULL); |
562 | gpio_request(GPIO_FN_SDHICMD0, NULL); | 551 | gpio_request(GPIO_FN_SDHICMD0, NULL); |
563 | gpio_request(GPIO_FN_SDHICLK0, NULL); | 552 | gpio_request(GPIO_FN_SDHICLK0, NULL); |
@@ -566,13 +555,6 @@ static void __init ag5evm_init(void) | |||
566 | gpio_request(GPIO_FN_SDHID0_1, NULL); | 555 | gpio_request(GPIO_FN_SDHID0_1, NULL); |
567 | gpio_request(GPIO_FN_SDHID0_0, NULL); | 556 | gpio_request(GPIO_FN_SDHID0_0, NULL); |
568 | 557 | ||
569 | if (!request_irq(intcs_evt2irq(0x3c0), ag5evm_sdhi0_gpio_cd, | ||
570 | IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, | ||
571 | "sdhi0 cd", &sdhi0_device.dev)) | ||
572 | sdhi0_info.tmio_flags |= TMIO_MMC_HAS_COLD_CD; | ||
573 | else | ||
574 | pr_warn("Unable to setup SDHI0 GPIO IRQ\n"); | ||
575 | |||
576 | /* enable SDHI1 on CN4 [WLAN I/F] */ | 558 | /* enable SDHI1 on CN4 [WLAN I/F] */ |
577 | gpio_request(GPIO_FN_SDHICLK1, NULL); | 559 | gpio_request(GPIO_FN_SDHICLK1, NULL); |
578 | gpio_request(GPIO_FN_SDHICMD1_PU, NULL); | 560 | gpio_request(GPIO_FN_SDHICMD1_PU, NULL); |
diff --git a/arch/arm/mach-shmobile/board-mackerel.c b/arch/arm/mach-shmobile/board-mackerel.c index f49e28abe0ab..8c6202bb6aeb 100644 --- a/arch/arm/mach-shmobile/board-mackerel.c +++ b/arch/arm/mach-shmobile/board-mackerel.c | |||
@@ -1011,21 +1011,12 @@ static int slot_cn7_get_cd(struct platform_device *pdev) | |||
1011 | } | 1011 | } |
1012 | 1012 | ||
1013 | /* SDHI0 */ | 1013 | /* SDHI0 */ |
1014 | static irqreturn_t mackerel_sdhi0_gpio_cd(int irq, void *arg) | ||
1015 | { | ||
1016 | struct device *dev = arg; | ||
1017 | struct sh_mobile_sdhi_info *info = dev->platform_data; | ||
1018 | struct tmio_mmc_data *pdata = info->pdata; | ||
1019 | |||
1020 | tmio_mmc_cd_wakeup(pdata); | ||
1021 | |||
1022 | return IRQ_HANDLED; | ||
1023 | } | ||
1024 | |||
1025 | static struct sh_mobile_sdhi_info sdhi0_info = { | 1014 | static struct sh_mobile_sdhi_info sdhi0_info = { |
1026 | .dma_slave_tx = SHDMA_SLAVE_SDHI0_TX, | 1015 | .dma_slave_tx = SHDMA_SLAVE_SDHI0_TX, |
1027 | .dma_slave_rx = SHDMA_SLAVE_SDHI0_RX, | 1016 | .dma_slave_rx = SHDMA_SLAVE_SDHI0_RX, |
1017 | .tmio_flags = TMIO_MMC_USE_GPIO_CD, | ||
1028 | .tmio_caps = MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ, | 1018 | .tmio_caps = MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ, |
1019 | .cd_gpio = GPIO_PORT172, | ||
1029 | }; | 1020 | }; |
1030 | 1021 | ||
1031 | static struct resource sdhi0_resources[] = { | 1022 | static struct resource sdhi0_resources[] = { |
@@ -1384,7 +1375,6 @@ static void __init mackerel_init(void) | |||
1384 | { | 1375 | { |
1385 | u32 srcr4; | 1376 | u32 srcr4; |
1386 | struct clk *clk; | 1377 | struct clk *clk; |
1387 | int ret; | ||
1388 | 1378 | ||
1389 | /* External clock source */ | 1379 | /* External clock source */ |
1390 | clk_set_rate(&sh7372_dv_clki_clk, 27000000); | 1380 | clk_set_rate(&sh7372_dv_clki_clk, 27000000); |
@@ -1481,7 +1471,6 @@ static void __init mackerel_init(void) | |||
1481 | irq_set_irq_type(IRQ21, IRQ_TYPE_LEVEL_HIGH); | 1471 | irq_set_irq_type(IRQ21, IRQ_TYPE_LEVEL_HIGH); |
1482 | 1472 | ||
1483 | /* enable SDHI0 */ | 1473 | /* enable SDHI0 */ |
1484 | gpio_request(GPIO_FN_SDHICD0, NULL); | ||
1485 | gpio_request(GPIO_FN_SDHIWP0, NULL); | 1474 | gpio_request(GPIO_FN_SDHIWP0, NULL); |
1486 | gpio_request(GPIO_FN_SDHICMD0, NULL); | 1475 | gpio_request(GPIO_FN_SDHICMD0, NULL); |
1487 | gpio_request(GPIO_FN_SDHICLK0, NULL); | 1476 | gpio_request(GPIO_FN_SDHICLK0, NULL); |
@@ -1490,13 +1479,6 @@ static void __init mackerel_init(void) | |||
1490 | gpio_request(GPIO_FN_SDHID0_1, NULL); | 1479 | gpio_request(GPIO_FN_SDHID0_1, NULL); |
1491 | gpio_request(GPIO_FN_SDHID0_0, NULL); | 1480 | gpio_request(GPIO_FN_SDHID0_0, NULL); |
1492 | 1481 | ||
1493 | ret = request_irq(evt2irq(0x3340), mackerel_sdhi0_gpio_cd, | ||
1494 | IRQF_TRIGGER_FALLING, "sdhi0 cd", &sdhi0_device.dev); | ||
1495 | if (!ret) | ||
1496 | sdhi0_info.tmio_flags |= TMIO_MMC_HAS_COLD_CD; | ||
1497 | else | ||
1498 | pr_err("Cannot get IRQ #%d: %d\n", evt2irq(0x3340), ret); | ||
1499 | |||
1500 | #if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE) | 1482 | #if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE) |
1501 | /* enable SDHI1 */ | 1483 | /* enable SDHI1 */ |
1502 | gpio_request(GPIO_FN_SDHICMD1, NULL); | 1484 | gpio_request(GPIO_FN_SDHICMD1, NULL); |
diff --git a/arch/arm/mach-shmobile/headsmp.S b/arch/arm/mach-shmobile/headsmp.S index 6ac015c89206..b202c1272526 100644 --- a/arch/arm/mach-shmobile/headsmp.S +++ b/arch/arm/mach-shmobile/headsmp.S | |||
@@ -16,6 +16,59 @@ | |||
16 | 16 | ||
17 | __CPUINIT | 17 | __CPUINIT |
18 | 18 | ||
19 | /* Cache invalidation nicked from arch/arm/mach-imx/head-v7.S, thanks! | ||
20 | * | ||
21 | * The secondary kernel init calls v7_flush_dcache_all before it enables | ||
22 | * the L1; however, the L1 comes out of reset in an undefined state, so | ||
23 | * the clean + invalidate performed by v7_flush_dcache_all causes a bunch | ||
24 | * of cache lines with uninitialized data and uninitialized tags to get | ||
25 | * written out to memory, which does really unpleasant things to the main | ||
26 | * processor. We fix this by performing an invalidate, rather than a | ||
27 | * clean + invalidate, before jumping into the kernel. | ||
28 | * | ||
29 | * This funciton is cloned from arch/arm/mach-tegra/headsmp.S, and needs | ||
30 | * to be called for both secondary cores startup and primary core resume | ||
31 | * procedures. Ideally, it should be moved into arch/arm/mm/cache-v7.S. | ||
32 | */ | ||
33 | ENTRY(v7_invalidate_l1) | ||
34 | mov r0, #0 | ||
35 | mcr p15, 0, r0, c7, c5, 0 @ invalidate I cache | ||
36 | mcr p15, 2, r0, c0, c0, 0 | ||
37 | mrc p15, 1, r0, c0, c0, 0 | ||
38 | |||
39 | ldr r1, =0x7fff | ||
40 | and r2, r1, r0, lsr #13 | ||
41 | |||
42 | ldr r1, =0x3ff | ||
43 | |||
44 | and r3, r1, r0, lsr #3 @ NumWays - 1 | ||
45 | add r2, r2, #1 @ NumSets | ||
46 | |||
47 | and r0, r0, #0x7 | ||
48 | add r0, r0, #4 @ SetShift | ||
49 | |||
50 | clz r1, r3 @ WayShift | ||
51 | add r4, r3, #1 @ NumWays | ||
52 | 1: sub r2, r2, #1 @ NumSets-- | ||
53 | mov r3, r4 @ Temp = NumWays | ||
54 | 2: subs r3, r3, #1 @ Temp-- | ||
55 | mov r5, r3, lsl r1 | ||
56 | mov r6, r2, lsl r0 | ||
57 | orr r5, r5, r6 @ Reg = (Temp<<WayShift)|(NumSets<<SetShift) | ||
58 | mcr p15, 0, r5, c7, c6, 2 | ||
59 | bgt 2b | ||
60 | cmp r2, #0 | ||
61 | bgt 1b | ||
62 | dsb | ||
63 | isb | ||
64 | mov pc, lr | ||
65 | ENDPROC(v7_invalidate_l1) | ||
66 | |||
67 | ENTRY(shmobile_invalidate_start) | ||
68 | bl v7_invalidate_l1 | ||
69 | b secondary_startup | ||
70 | ENDPROC(shmobile_invalidate_start) | ||
71 | |||
19 | /* | 72 | /* |
20 | * Reset vector for secondary CPUs. | 73 | * Reset vector for secondary CPUs. |
21 | * This will be mapped at address 0 by SBAR register. | 74 | * This will be mapped at address 0 by SBAR register. |
@@ -24,4 +77,5 @@ | |||
24 | .align 12 | 77 | .align 12 |
25 | ENTRY(shmobile_secondary_vector) | 78 | ENTRY(shmobile_secondary_vector) |
26 | ldr pc, 1f | 79 | ldr pc, 1f |
27 | 1: .long secondary_startup - PAGE_OFFSET + PLAT_PHYS_OFFSET | 80 | 1: .long shmobile_invalidate_start - PAGE_OFFSET + PLAT_PHYS_OFFSET |
81 | ENDPROC(shmobile_secondary_vector) | ||
diff --git a/arch/arm/mach-shmobile/include/mach/common.h b/arch/arm/mach-shmobile/include/mach/common.h index 83ad3fe0a75f..c85e6ecda606 100644 --- a/arch/arm/mach-shmobile/include/mach/common.h +++ b/arch/arm/mach-shmobile/include/mach/common.h | |||
@@ -4,7 +4,6 @@ | |||
4 | extern void shmobile_earlytimer_init(void); | 4 | extern void shmobile_earlytimer_init(void); |
5 | extern struct sys_timer shmobile_timer; | 5 | extern struct sys_timer shmobile_timer; |
6 | struct twd_local_timer; | 6 | struct twd_local_timer; |
7 | void shmobile_twd_init(struct twd_local_timer *twd_local_timer); | ||
8 | extern void shmobile_setup_console(void); | 7 | extern void shmobile_setup_console(void); |
9 | extern void shmobile_secondary_vector(void); | 8 | extern void shmobile_secondary_vector(void); |
10 | extern int shmobile_platform_cpu_kill(unsigned int cpu); | 9 | extern int shmobile_platform_cpu_kill(unsigned int cpu); |
@@ -82,5 +81,6 @@ extern int r8a7779_platform_cpu_kill(unsigned int cpu); | |||
82 | extern void r8a7779_secondary_init(unsigned int cpu); | 81 | extern void r8a7779_secondary_init(unsigned int cpu); |
83 | extern int r8a7779_boot_secondary(unsigned int cpu); | 82 | extern int r8a7779_boot_secondary(unsigned int cpu); |
84 | extern void r8a7779_smp_prepare_cpus(void); | 83 | extern void r8a7779_smp_prepare_cpus(void); |
84 | extern void r8a7779_register_twd(void); | ||
85 | 85 | ||
86 | #endif /* __ARCH_MACH_COMMON_H */ | 86 | #endif /* __ARCH_MACH_COMMON_H */ |
diff --git a/arch/arm/mach-shmobile/setup-r8a7779.c b/arch/arm/mach-shmobile/setup-r8a7779.c index 12c6f529ab89..e98e46f6cf55 100644 --- a/arch/arm/mach-shmobile/setup-r8a7779.c +++ b/arch/arm/mach-shmobile/setup-r8a7779.c | |||
@@ -262,10 +262,14 @@ void __init r8a7779_add_standard_devices(void) | |||
262 | ARRAY_SIZE(r8a7779_late_devices)); | 262 | ARRAY_SIZE(r8a7779_late_devices)); |
263 | } | 263 | } |
264 | 264 | ||
265 | /* do nothing for !CONFIG_SMP or !CONFIG_HAVE_TWD */ | ||
266 | void __init __weak r8a7779_register_twd(void) { } | ||
267 | |||
265 | static void __init r8a7779_earlytimer_init(void) | 268 | static void __init r8a7779_earlytimer_init(void) |
266 | { | 269 | { |
267 | r8a7779_clock_init(); | 270 | r8a7779_clock_init(); |
268 | shmobile_earlytimer_init(); | 271 | shmobile_earlytimer_init(); |
272 | r8a7779_register_twd(); | ||
269 | } | 273 | } |
270 | 274 | ||
271 | void __init r8a7779_add_early_devices(void) | 275 | void __init r8a7779_add_early_devices(void) |
diff --git a/arch/arm/mach-shmobile/setup-sh73a0.c b/arch/arm/mach-shmobile/setup-sh73a0.c index 5bebffc10455..04a0dfe75493 100644 --- a/arch/arm/mach-shmobile/setup-sh73a0.c +++ b/arch/arm/mach-shmobile/setup-sh73a0.c | |||
@@ -688,10 +688,14 @@ void __init sh73a0_add_standard_devices(void) | |||
688 | ARRAY_SIZE(sh73a0_late_devices)); | 688 | ARRAY_SIZE(sh73a0_late_devices)); |
689 | } | 689 | } |
690 | 690 | ||
691 | /* do nothing for !CONFIG_SMP or !CONFIG_HAVE_TWD */ | ||
692 | void __init __weak sh73a0_register_twd(void) { } | ||
693 | |||
691 | static void __init sh73a0_earlytimer_init(void) | 694 | static void __init sh73a0_earlytimer_init(void) |
692 | { | 695 | { |
693 | sh73a0_clock_init(); | 696 | sh73a0_clock_init(); |
694 | shmobile_earlytimer_init(); | 697 | shmobile_earlytimer_init(); |
698 | sh73a0_register_twd(); | ||
695 | } | 699 | } |
696 | 700 | ||
697 | void __init sh73a0_add_early_devices(void) | 701 | void __init sh73a0_add_early_devices(void) |
diff --git a/arch/arm/mach-shmobile/smp-r8a7779.c b/arch/arm/mach-shmobile/smp-r8a7779.c index b62e19d4c9af..6d1d0238cbf7 100644 --- a/arch/arm/mach-shmobile/smp-r8a7779.c +++ b/arch/arm/mach-shmobile/smp-r8a7779.c | |||
@@ -64,8 +64,15 @@ static void __iomem *scu_base_addr(void) | |||
64 | static DEFINE_SPINLOCK(scu_lock); | 64 | static DEFINE_SPINLOCK(scu_lock); |
65 | static unsigned long tmp; | 65 | static unsigned long tmp; |
66 | 66 | ||
67 | #ifdef CONFIG_HAVE_ARM_TWD | ||
67 | static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, 0xf0000600, 29); | 68 | static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, 0xf0000600, 29); |
68 | 69 | ||
70 | void __init r8a7779_register_twd(void) | ||
71 | { | ||
72 | twd_local_timer_register(&twd_local_timer); | ||
73 | } | ||
74 | #endif | ||
75 | |||
69 | static void modify_scu_cpu_psr(unsigned long set, unsigned long clr) | 76 | static void modify_scu_cpu_psr(unsigned long set, unsigned long clr) |
70 | { | 77 | { |
71 | void __iomem *scu_base = scu_base_addr(); | 78 | void __iomem *scu_base = scu_base_addr(); |
@@ -84,7 +91,6 @@ unsigned int __init r8a7779_get_core_count(void) | |||
84 | { | 91 | { |
85 | void __iomem *scu_base = scu_base_addr(); | 92 | void __iomem *scu_base = scu_base_addr(); |
86 | 93 | ||
87 | shmobile_twd_init(&twd_local_timer); | ||
88 | return scu_get_core_count(scu_base); | 94 | return scu_get_core_count(scu_base); |
89 | } | 95 | } |
90 | 96 | ||
diff --git a/arch/arm/mach-shmobile/smp-sh73a0.c b/arch/arm/mach-shmobile/smp-sh73a0.c index 14ad8b052f1a..e36c41c4ab40 100644 --- a/arch/arm/mach-shmobile/smp-sh73a0.c +++ b/arch/arm/mach-shmobile/smp-sh73a0.c | |||
@@ -42,7 +42,13 @@ static void __iomem *scu_base_addr(void) | |||
42 | static DEFINE_SPINLOCK(scu_lock); | 42 | static DEFINE_SPINLOCK(scu_lock); |
43 | static unsigned long tmp; | 43 | static unsigned long tmp; |
44 | 44 | ||
45 | #ifdef CONFIG_HAVE_ARM_TWD | ||
45 | static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, 0xf0000600, 29); | 46 | static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, 0xf0000600, 29); |
47 | void __init sh73a0_register_twd(void) | ||
48 | { | ||
49 | twd_local_timer_register(&twd_local_timer); | ||
50 | } | ||
51 | #endif | ||
46 | 52 | ||
47 | static void modify_scu_cpu_psr(unsigned long set, unsigned long clr) | 53 | static void modify_scu_cpu_psr(unsigned long set, unsigned long clr) |
48 | { | 54 | { |
@@ -62,7 +68,6 @@ unsigned int __init sh73a0_get_core_count(void) | |||
62 | { | 68 | { |
63 | void __iomem *scu_base = scu_base_addr(); | 69 | void __iomem *scu_base = scu_base_addr(); |
64 | 70 | ||
65 | shmobile_twd_init(&twd_local_timer); | ||
66 | return scu_get_core_count(scu_base); | 71 | return scu_get_core_count(scu_base); |
67 | } | 72 | } |
68 | 73 | ||
diff --git a/arch/arm/mach-shmobile/timer.c b/arch/arm/mach-shmobile/timer.c index 2fba5f3d1c8a..8b79e7917a23 100644 --- a/arch/arm/mach-shmobile/timer.c +++ b/arch/arm/mach-shmobile/timer.c | |||
@@ -46,15 +46,6 @@ static void __init shmobile_timer_init(void) | |||
46 | { | 46 | { |
47 | } | 47 | } |
48 | 48 | ||
49 | void __init shmobile_twd_init(struct twd_local_timer *twd_local_timer) | ||
50 | { | ||
51 | #ifdef CONFIG_HAVE_ARM_TWD | ||
52 | int err = twd_local_timer_register(twd_local_timer); | ||
53 | if (err) | ||
54 | pr_err("twd_local_timer_register failed %d\n", err); | ||
55 | #endif | ||
56 | } | ||
57 | |||
58 | struct sys_timer shmobile_timer = { | 49 | struct sys_timer shmobile_timer = { |
59 | .init = shmobile_timer_init, | 50 | .init = shmobile_timer_init, |
60 | }; | 51 | }; |
diff --git a/arch/ia64/kvm/kvm-ia64.c b/arch/ia64/kvm/kvm-ia64.c index f5104b7c52cd..463fb3bbe11e 100644 --- a/arch/ia64/kvm/kvm-ia64.c +++ b/arch/ia64/kvm/kvm-ia64.c | |||
@@ -1174,7 +1174,7 @@ out: | |||
1174 | 1174 | ||
1175 | bool kvm_vcpu_compatible(struct kvm_vcpu *vcpu) | 1175 | bool kvm_vcpu_compatible(struct kvm_vcpu *vcpu) |
1176 | { | 1176 | { |
1177 | return irqchip_in_kernel(vcpu->kcm) == (vcpu->arch.apic != NULL); | 1177 | return irqchip_in_kernel(vcpu->kvm) == (vcpu->arch.apic != NULL); |
1178 | } | 1178 | } |
1179 | 1179 | ||
1180 | int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu) | 1180 | int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu) |
diff --git a/arch/m68k/platform/520x/config.c b/arch/m68k/platform/520x/config.c index 235947844f27..09df4b89e8be 100644 --- a/arch/m68k/platform/520x/config.c +++ b/arch/m68k/platform/520x/config.c | |||
@@ -22,7 +22,7 @@ | |||
22 | 22 | ||
23 | /***************************************************************************/ | 23 | /***************************************************************************/ |
24 | 24 | ||
25 | #ifdef CONFIG_SPI_COLDFIRE_QSPI | 25 | #if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) |
26 | 26 | ||
27 | static void __init m520x_qspi_init(void) | 27 | static void __init m520x_qspi_init(void) |
28 | { | 28 | { |
@@ -35,7 +35,7 @@ static void __init m520x_qspi_init(void) | |||
35 | writew(par, MCF_GPIO_PAR_UART); | 35 | writew(par, MCF_GPIO_PAR_UART); |
36 | } | 36 | } |
37 | 37 | ||
38 | #endif /* CONFIG_SPI_COLDFIRE_QSPI */ | 38 | #endif /* IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) */ |
39 | 39 | ||
40 | /***************************************************************************/ | 40 | /***************************************************************************/ |
41 | 41 | ||
@@ -79,7 +79,7 @@ void __init config_BSP(char *commandp, int size) | |||
79 | mach_sched_init = hw_timer_init; | 79 | mach_sched_init = hw_timer_init; |
80 | m520x_uarts_init(); | 80 | m520x_uarts_init(); |
81 | m520x_fec_init(); | 81 | m520x_fec_init(); |
82 | #ifdef CONFIG_SPI_COLDFIRE_QSPI | 82 | #if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) |
83 | m520x_qspi_init(); | 83 | m520x_qspi_init(); |
84 | #endif | 84 | #endif |
85 | } | 85 | } |
diff --git a/arch/m68k/platform/523x/config.c b/arch/m68k/platform/523x/config.c index c8b405d5a961..d47dfd8f50a2 100644 --- a/arch/m68k/platform/523x/config.c +++ b/arch/m68k/platform/523x/config.c | |||
@@ -22,7 +22,7 @@ | |||
22 | 22 | ||
23 | /***************************************************************************/ | 23 | /***************************************************************************/ |
24 | 24 | ||
25 | #ifdef CONFIG_SPI_COLDFIRE_QSPI | 25 | #if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) |
26 | 26 | ||
27 | static void __init m523x_qspi_init(void) | 27 | static void __init m523x_qspi_init(void) |
28 | { | 28 | { |
@@ -36,7 +36,7 @@ static void __init m523x_qspi_init(void) | |||
36 | writew(par, MCFGPIO_PAR_TIMER); | 36 | writew(par, MCFGPIO_PAR_TIMER); |
37 | } | 37 | } |
38 | 38 | ||
39 | #endif /* CONFIG_SPI_COLDFIRE_QSPI */ | 39 | #endif /* IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) */ |
40 | 40 | ||
41 | /***************************************************************************/ | 41 | /***************************************************************************/ |
42 | 42 | ||
@@ -58,7 +58,7 @@ void __init config_BSP(char *commandp, int size) | |||
58 | { | 58 | { |
59 | mach_sched_init = hw_timer_init; | 59 | mach_sched_init = hw_timer_init; |
60 | m523x_fec_init(); | 60 | m523x_fec_init(); |
61 | #ifdef CONFIG_SPI_COLDFIRE_QSPI | 61 | #if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) |
62 | m523x_qspi_init(); | 62 | m523x_qspi_init(); |
63 | #endif | 63 | #endif |
64 | } | 64 | } |
diff --git a/arch/m68k/platform/5249/config.c b/arch/m68k/platform/5249/config.c index bbf05135bb98..300e729a58d0 100644 --- a/arch/m68k/platform/5249/config.c +++ b/arch/m68k/platform/5249/config.c | |||
@@ -51,7 +51,7 @@ static struct platform_device *m5249_devices[] __initdata = { | |||
51 | 51 | ||
52 | /***************************************************************************/ | 52 | /***************************************************************************/ |
53 | 53 | ||
54 | #ifdef CONFIG_SPI_COLDFIRE_QSPI | 54 | #if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) |
55 | 55 | ||
56 | static void __init m5249_qspi_init(void) | 56 | static void __init m5249_qspi_init(void) |
57 | { | 57 | { |
@@ -61,7 +61,7 @@ static void __init m5249_qspi_init(void) | |||
61 | mcf_mapirq2imr(MCF_IRQ_QSPI, MCFINTC_QSPI); | 61 | mcf_mapirq2imr(MCF_IRQ_QSPI, MCFINTC_QSPI); |
62 | } | 62 | } |
63 | 63 | ||
64 | #endif /* CONFIG_SPI_COLDFIRE_QSPI */ | 64 | #endif /* IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) */ |
65 | 65 | ||
66 | /***************************************************************************/ | 66 | /***************************************************************************/ |
67 | 67 | ||
@@ -90,7 +90,7 @@ void __init config_BSP(char *commandp, int size) | |||
90 | #ifdef CONFIG_M5249C3 | 90 | #ifdef CONFIG_M5249C3 |
91 | m5249_smc91x_init(); | 91 | m5249_smc91x_init(); |
92 | #endif | 92 | #endif |
93 | #ifdef CONFIG_SPI_COLDFIRE_QSPI | 93 | #if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) |
94 | m5249_qspi_init(); | 94 | m5249_qspi_init(); |
95 | #endif | 95 | #endif |
96 | } | 96 | } |
diff --git a/arch/m68k/platform/527x/config.c b/arch/m68k/platform/527x/config.c index f91a53294c35..b3cb378c5e94 100644 --- a/arch/m68k/platform/527x/config.c +++ b/arch/m68k/platform/527x/config.c | |||
@@ -23,7 +23,7 @@ | |||
23 | 23 | ||
24 | /***************************************************************************/ | 24 | /***************************************************************************/ |
25 | 25 | ||
26 | #ifdef CONFIG_SPI_COLDFIRE_QSPI | 26 | #if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) |
27 | 27 | ||
28 | static void __init m527x_qspi_init(void) | 28 | static void __init m527x_qspi_init(void) |
29 | { | 29 | { |
@@ -42,7 +42,7 @@ static void __init m527x_qspi_init(void) | |||
42 | #endif | 42 | #endif |
43 | } | 43 | } |
44 | 44 | ||
45 | #endif /* CONFIG_SPI_COLDFIRE_QSPI */ | 45 | #endif /* IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) */ |
46 | 46 | ||
47 | /***************************************************************************/ | 47 | /***************************************************************************/ |
48 | 48 | ||
@@ -90,7 +90,7 @@ void __init config_BSP(char *commandp, int size) | |||
90 | mach_sched_init = hw_timer_init; | 90 | mach_sched_init = hw_timer_init; |
91 | m527x_uarts_init(); | 91 | m527x_uarts_init(); |
92 | m527x_fec_init(); | 92 | m527x_fec_init(); |
93 | #ifdef CONFIG_SPI_COLDFIRE_QSPI | 93 | #if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) |
94 | m527x_qspi_init(); | 94 | m527x_qspi_init(); |
95 | #endif | 95 | #endif |
96 | } | 96 | } |
diff --git a/arch/m68k/platform/528x/config.c b/arch/m68k/platform/528x/config.c index d4492926614c..c5f11ba49be5 100644 --- a/arch/m68k/platform/528x/config.c +++ b/arch/m68k/platform/528x/config.c | |||
@@ -24,7 +24,7 @@ | |||
24 | 24 | ||
25 | /***************************************************************************/ | 25 | /***************************************************************************/ |
26 | 26 | ||
27 | #ifdef CONFIG_SPI_COLDFIRE_QSPI | 27 | #if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) |
28 | 28 | ||
29 | static void __init m528x_qspi_init(void) | 29 | static void __init m528x_qspi_init(void) |
30 | { | 30 | { |
@@ -32,7 +32,7 @@ static void __init m528x_qspi_init(void) | |||
32 | __raw_writeb(0x07, MCFGPIO_PQSPAR); | 32 | __raw_writeb(0x07, MCFGPIO_PQSPAR); |
33 | } | 33 | } |
34 | 34 | ||
35 | #endif /* CONFIG_SPI_COLDFIRE_QSPI */ | 35 | #endif /* IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) */ |
36 | 36 | ||
37 | /***************************************************************************/ | 37 | /***************************************************************************/ |
38 | 38 | ||
@@ -98,7 +98,7 @@ void __init config_BSP(char *commandp, int size) | |||
98 | mach_sched_init = hw_timer_init; | 98 | mach_sched_init = hw_timer_init; |
99 | m528x_uarts_init(); | 99 | m528x_uarts_init(); |
100 | m528x_fec_init(); | 100 | m528x_fec_init(); |
101 | #ifdef CONFIG_SPI_COLDFIRE_QSPI | 101 | #if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) |
102 | m528x_qspi_init(); | 102 | m528x_qspi_init(); |
103 | #endif | 103 | #endif |
104 | } | 104 | } |
diff --git a/arch/m68k/platform/532x/config.c b/arch/m68k/platform/532x/config.c index 2bec3477b739..37082d02f2bd 100644 --- a/arch/m68k/platform/532x/config.c +++ b/arch/m68k/platform/532x/config.c | |||
@@ -30,7 +30,7 @@ | |||
30 | 30 | ||
31 | /***************************************************************************/ | 31 | /***************************************************************************/ |
32 | 32 | ||
33 | #ifdef CONFIG_SPI_COLDFIRE_QSPI | 33 | #if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) |
34 | 34 | ||
35 | static void __init m532x_qspi_init(void) | 35 | static void __init m532x_qspi_init(void) |
36 | { | 36 | { |
@@ -38,7 +38,7 @@ static void __init m532x_qspi_init(void) | |||
38 | writew(0x01f0, MCF_GPIO_PAR_QSPI); | 38 | writew(0x01f0, MCF_GPIO_PAR_QSPI); |
39 | } | 39 | } |
40 | 40 | ||
41 | #endif /* CONFIG_SPI_COLDFIRE_QSPI */ | 41 | #endif /* IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) */ |
42 | 42 | ||
43 | /***************************************************************************/ | 43 | /***************************************************************************/ |
44 | 44 | ||
@@ -77,7 +77,7 @@ void __init config_BSP(char *commandp, int size) | |||
77 | mach_sched_init = hw_timer_init; | 77 | mach_sched_init = hw_timer_init; |
78 | m532x_uarts_init(); | 78 | m532x_uarts_init(); |
79 | m532x_fec_init(); | 79 | m532x_fec_init(); |
80 | #ifdef CONFIG_SPI_COLDFIRE_QSPI | 80 | #if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) |
81 | m532x_qspi_init(); | 81 | m532x_qspi_init(); |
82 | #endif | 82 | #endif |
83 | 83 | ||
diff --git a/arch/m68k/platform/coldfire/device.c b/arch/m68k/platform/coldfire/device.c index 7af97362b95c..3aa77ddea89d 100644 --- a/arch/m68k/platform/coldfire/device.c +++ b/arch/m68k/platform/coldfire/device.c | |||
@@ -121,7 +121,7 @@ static struct platform_device mcf_fec1 = { | |||
121 | #endif /* MCFFEC_BASE1 */ | 121 | #endif /* MCFFEC_BASE1 */ |
122 | #endif /* CONFIG_FEC */ | 122 | #endif /* CONFIG_FEC */ |
123 | 123 | ||
124 | #ifdef CONFIG_SPI_COLDFIRE_QSPI | 124 | #if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) |
125 | /* | 125 | /* |
126 | * The ColdFire QSPI module is an SPI protocol hardware block used | 126 | * The ColdFire QSPI module is an SPI protocol hardware block used |
127 | * on a number of different ColdFire CPUs. | 127 | * on a number of different ColdFire CPUs. |
@@ -274,7 +274,7 @@ static struct platform_device mcf_qspi = { | |||
274 | .resource = mcf_qspi_resources, | 274 | .resource = mcf_qspi_resources, |
275 | .dev.platform_data = &mcf_qspi_data, | 275 | .dev.platform_data = &mcf_qspi_data, |
276 | }; | 276 | }; |
277 | #endif /* CONFIG_SPI_COLDFIRE_QSPI */ | 277 | #endif /* IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) */ |
278 | 278 | ||
279 | static struct platform_device *mcf_devices[] __initdata = { | 279 | static struct platform_device *mcf_devices[] __initdata = { |
280 | &mcf_uart, | 280 | &mcf_uart, |
@@ -284,7 +284,7 @@ static struct platform_device *mcf_devices[] __initdata = { | |||
284 | &mcf_fec1, | 284 | &mcf_fec1, |
285 | #endif | 285 | #endif |
286 | #endif | 286 | #endif |
287 | #ifdef CONFIG_SPI_COLDFIRE_QSPI | 287 | #if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) |
288 | &mcf_qspi, | 288 | &mcf_qspi, |
289 | #endif | 289 | #endif |
290 | }; | 290 | }; |
diff --git a/arch/mn10300/kernel/smp.c b/arch/mn10300/kernel/smp.c index 910dddf65e44..9cd69ad6aa02 100644 --- a/arch/mn10300/kernel/smp.c +++ b/arch/mn10300/kernel/smp.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/sched.h> | 24 | #include <linux/sched.h> |
25 | #include <linux/profile.h> | 25 | #include <linux/profile.h> |
26 | #include <linux/smp.h> | 26 | #include <linux/smp.h> |
27 | #include <linux/cpu.h> | ||
27 | #include <asm/tlbflush.h> | 28 | #include <asm/tlbflush.h> |
28 | #include <asm/bitops.h> | 29 | #include <asm/bitops.h> |
29 | #include <asm/processor.h> | 30 | #include <asm/processor.h> |
@@ -38,7 +39,6 @@ | |||
38 | #include "internal.h" | 39 | #include "internal.h" |
39 | 40 | ||
40 | #ifdef CONFIG_HOTPLUG_CPU | 41 | #ifdef CONFIG_HOTPLUG_CPU |
41 | #include <linux/cpu.h> | ||
42 | #include <asm/cacheflush.h> | 42 | #include <asm/cacheflush.h> |
43 | 43 | ||
44 | static unsigned long sleep_mode[NR_CPUS]; | 44 | static unsigned long sleep_mode[NR_CPUS]; |
@@ -874,10 +874,13 @@ static void __init smp_online(void) | |||
874 | 874 | ||
875 | cpu = smp_processor_id(); | 875 | cpu = smp_processor_id(); |
876 | 876 | ||
877 | local_irq_enable(); | 877 | notify_cpu_starting(cpu); |
878 | 878 | ||
879 | ipi_call_lock(); | ||
879 | set_cpu_online(cpu, true); | 880 | set_cpu_online(cpu, true); |
880 | smp_wmb(); | 881 | ipi_call_unlock(); |
882 | |||
883 | local_irq_enable(); | ||
881 | } | 884 | } |
882 | 885 | ||
883 | /** | 886 | /** |
diff --git a/arch/parisc/include/asm/hardware.h b/arch/parisc/include/asm/hardware.h index 4e9626836bab..d1d864b81bae 100644 --- a/arch/parisc/include/asm/hardware.h +++ b/arch/parisc/include/asm/hardware.h | |||
@@ -2,7 +2,6 @@ | |||
2 | #define _PARISC_HARDWARE_H | 2 | #define _PARISC_HARDWARE_H |
3 | 3 | ||
4 | #include <linux/mod_devicetable.h> | 4 | #include <linux/mod_devicetable.h> |
5 | #include <asm/pdc.h> | ||
6 | 5 | ||
7 | #define HWTYPE_ANY_ID PA_HWTYPE_ANY_ID | 6 | #define HWTYPE_ANY_ID PA_HWTYPE_ANY_ID |
8 | #define HVERSION_ANY_ID PA_HVERSION_ANY_ID | 7 | #define HVERSION_ANY_ID PA_HVERSION_ANY_ID |
@@ -95,12 +94,14 @@ struct bc_module { | |||
95 | #define HPHW_MC 15 | 94 | #define HPHW_MC 15 |
96 | #define HPHW_FAULTY 31 | 95 | #define HPHW_FAULTY 31 |
97 | 96 | ||
97 | struct parisc_device_id; | ||
98 | 98 | ||
99 | /* hardware.c: */ | 99 | /* hardware.c: */ |
100 | extern const char *parisc_hardware_description(struct parisc_device_id *id); | 100 | extern const char *parisc_hardware_description(struct parisc_device_id *id); |
101 | extern enum cpu_type parisc_get_cpu_type(unsigned long hversion); | 101 | extern enum cpu_type parisc_get_cpu_type(unsigned long hversion); |
102 | 102 | ||
103 | struct pci_dev; | 103 | struct pci_dev; |
104 | struct hardware_path; | ||
104 | 105 | ||
105 | /* drivers.c: */ | 106 | /* drivers.c: */ |
106 | extern struct parisc_device *alloc_pa_dev(unsigned long hpa, | 107 | extern struct parisc_device *alloc_pa_dev(unsigned long hpa, |
diff --git a/arch/parisc/include/asm/page.h b/arch/parisc/include/asm/page.h index a84cc1f925f6..4e0e7dbf0f3f 100644 --- a/arch/parisc/include/asm/page.h +++ b/arch/parisc/include/asm/page.h | |||
@@ -160,5 +160,11 @@ extern int npmem_ranges; | |||
160 | 160 | ||
161 | #include <asm-generic/memory_model.h> | 161 | #include <asm-generic/memory_model.h> |
162 | #include <asm-generic/getorder.h> | 162 | #include <asm-generic/getorder.h> |
163 | #include <asm/pdc.h> | ||
164 | |||
165 | #define PAGE0 ((struct zeropage *)__PAGE_OFFSET) | ||
166 | |||
167 | /* DEFINITION OF THE ZERO-PAGE (PAG0) */ | ||
168 | /* based on work by Jason Eckhardt (jason@equator.com) */ | ||
163 | 169 | ||
164 | #endif /* _PARISC_PAGE_H */ | 170 | #endif /* _PARISC_PAGE_H */ |
diff --git a/arch/parisc/include/asm/pdc.h b/arch/parisc/include/asm/pdc.h index 4ca510b3c6f8..7f0f2d23059d 100644 --- a/arch/parisc/include/asm/pdc.h +++ b/arch/parisc/include/asm/pdc.h | |||
@@ -343,8 +343,6 @@ | |||
343 | 343 | ||
344 | #ifdef __KERNEL__ | 344 | #ifdef __KERNEL__ |
345 | 345 | ||
346 | #include <asm/page.h> /* for __PAGE_OFFSET */ | ||
347 | |||
348 | extern int pdc_type; | 346 | extern int pdc_type; |
349 | 347 | ||
350 | /* Values for pdc_type */ | 348 | /* Values for pdc_type */ |
@@ -677,11 +675,6 @@ static inline char * os_id_to_string(u16 os_id) { | |||
677 | 675 | ||
678 | #endif /* __KERNEL__ */ | 676 | #endif /* __KERNEL__ */ |
679 | 677 | ||
680 | #define PAGE0 ((struct zeropage *)__PAGE_OFFSET) | ||
681 | |||
682 | /* DEFINITION OF THE ZERO-PAGE (PAG0) */ | ||
683 | /* based on work by Jason Eckhardt (jason@equator.com) */ | ||
684 | |||
685 | /* flags of the device_path */ | 678 | /* flags of the device_path */ |
686 | #define PF_AUTOBOOT 0x80 | 679 | #define PF_AUTOBOOT 0x80 |
687 | #define PF_AUTOSEARCH 0x40 | 680 | #define PF_AUTOSEARCH 0x40 |
diff --git a/arch/parisc/include/asm/pgtable.h b/arch/parisc/include/asm/pgtable.h index 22dadeb58695..ee99f2339356 100644 --- a/arch/parisc/include/asm/pgtable.h +++ b/arch/parisc/include/asm/pgtable.h | |||
@@ -44,6 +44,8 @@ struct vm_area_struct; | |||
44 | 44 | ||
45 | #endif /* !__ASSEMBLY__ */ | 45 | #endif /* !__ASSEMBLY__ */ |
46 | 46 | ||
47 | #include <asm/page.h> | ||
48 | |||
47 | #define pte_ERROR(e) \ | 49 | #define pte_ERROR(e) \ |
48 | printk("%s:%d: bad pte %08lx.\n", __FILE__, __LINE__, pte_val(e)) | 50 | printk("%s:%d: bad pte %08lx.\n", __FILE__, __LINE__, pte_val(e)) |
49 | #define pmd_ERROR(e) \ | 51 | #define pmd_ERROR(e) \ |
diff --git a/arch/parisc/include/asm/spinlock.h b/arch/parisc/include/asm/spinlock.h index 804aa28ab1d6..3516e0b27044 100644 --- a/arch/parisc/include/asm/spinlock.h +++ b/arch/parisc/include/asm/spinlock.h | |||
@@ -1,6 +1,8 @@ | |||
1 | #ifndef __ASM_SPINLOCK_H | 1 | #ifndef __ASM_SPINLOCK_H |
2 | #define __ASM_SPINLOCK_H | 2 | #define __ASM_SPINLOCK_H |
3 | 3 | ||
4 | #include <asm/barrier.h> | ||
5 | #include <asm/ldcw.h> | ||
4 | #include <asm/processor.h> | 6 | #include <asm/processor.h> |
5 | #include <asm/spinlock_types.h> | 7 | #include <asm/spinlock_types.h> |
6 | 8 | ||
diff --git a/arch/parisc/kernel/pdc_cons.c b/arch/parisc/kernel/pdc_cons.c index 4f004596a6e7..47341aa208f2 100644 --- a/arch/parisc/kernel/pdc_cons.c +++ b/arch/parisc/kernel/pdc_cons.c | |||
@@ -50,6 +50,7 @@ | |||
50 | #include <linux/init.h> | 50 | #include <linux/init.h> |
51 | #include <linux/major.h> | 51 | #include <linux/major.h> |
52 | #include <linux/tty.h> | 52 | #include <linux/tty.h> |
53 | #include <asm/page.h> /* for PAGE0 */ | ||
53 | #include <asm/pdc.h> /* for iodc_call() proto and friends */ | 54 | #include <asm/pdc.h> /* for iodc_call() proto and friends */ |
54 | 55 | ||
55 | static DEFINE_SPINLOCK(pdc_console_lock); | 56 | static DEFINE_SPINLOCK(pdc_console_lock); |
@@ -104,7 +105,7 @@ static int pdc_console_tty_open(struct tty_struct *tty, struct file *filp) | |||
104 | 105 | ||
105 | static void pdc_console_tty_close(struct tty_struct *tty, struct file *filp) | 106 | static void pdc_console_tty_close(struct tty_struct *tty, struct file *filp) |
106 | { | 107 | { |
107 | if (!tty->count) { | 108 | if (tty->count == 1) { |
108 | del_timer_sync(&pdc_console_timer); | 109 | del_timer_sync(&pdc_console_timer); |
109 | tty_port_tty_set(&tty_port, NULL); | 110 | tty_port_tty_set(&tty_port, NULL); |
110 | } | 111 | } |
diff --git a/arch/parisc/kernel/smp.c b/arch/parisc/kernel/smp.c index 0bb1d63907f8..4dc7b7942b4c 100644 --- a/arch/parisc/kernel/smp.c +++ b/arch/parisc/kernel/smp.c | |||
@@ -31,6 +31,7 @@ | |||
31 | #include <linux/delay.h> | 31 | #include <linux/delay.h> |
32 | #include <linux/bitops.h> | 32 | #include <linux/bitops.h> |
33 | #include <linux/ftrace.h> | 33 | #include <linux/ftrace.h> |
34 | #include <linux/cpu.h> | ||
34 | 35 | ||
35 | #include <linux/atomic.h> | 36 | #include <linux/atomic.h> |
36 | #include <asm/current.h> | 37 | #include <asm/current.h> |
@@ -295,8 +296,13 @@ smp_cpu_init(int cpunum) | |||
295 | 296 | ||
296 | printk(KERN_CRIT "CPU#%d already initialized!\n", cpunum); | 297 | printk(KERN_CRIT "CPU#%d already initialized!\n", cpunum); |
297 | machine_halt(); | 298 | machine_halt(); |
298 | } | 299 | } |
300 | |||
301 | notify_cpu_starting(cpunum); | ||
302 | |||
303 | ipi_call_lock(); | ||
299 | set_cpu_online(cpunum, true); | 304 | set_cpu_online(cpunum, true); |
305 | ipi_call_unlock(); | ||
300 | 306 | ||
301 | /* Initialise the idle task for this CPU */ | 307 | /* Initialise the idle task for this CPU */ |
302 | atomic_inc(&init_mm.mm_count); | 308 | atomic_inc(&init_mm.mm_count); |
diff --git a/arch/parisc/kernel/time.c b/arch/parisc/kernel/time.c index 7c0774397b89..70e105d62423 100644 --- a/arch/parisc/kernel/time.c +++ b/arch/parisc/kernel/time.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <asm/uaccess.h> | 29 | #include <asm/uaccess.h> |
30 | #include <asm/io.h> | 30 | #include <asm/io.h> |
31 | #include <asm/irq.h> | 31 | #include <asm/irq.h> |
32 | #include <asm/page.h> | ||
32 | #include <asm/param.h> | 33 | #include <asm/param.h> |
33 | #include <asm/pdc.h> | 34 | #include <asm/pdc.h> |
34 | #include <asm/led.h> | 35 | #include <asm/led.h> |
diff --git a/arch/powerpc/include/asm/exception-64s.h b/arch/powerpc/include/asm/exception-64s.h index 548da3aa0a30..d58fc4e4149c 100644 --- a/arch/powerpc/include/asm/exception-64s.h +++ b/arch/powerpc/include/asm/exception-64s.h | |||
@@ -288,13 +288,6 @@ label##_hv: \ | |||
288 | /* Exception addition: Hard disable interrupts */ | 288 | /* Exception addition: Hard disable interrupts */ |
289 | #define DISABLE_INTS SOFT_DISABLE_INTS(r10,r11) | 289 | #define DISABLE_INTS SOFT_DISABLE_INTS(r10,r11) |
290 | 290 | ||
291 | /* Exception addition: Keep interrupt state */ | ||
292 | #define ENABLE_INTS \ | ||
293 | ld r11,PACAKMSR(r13); \ | ||
294 | ld r12,_MSR(r1); \ | ||
295 | rlwimi r11,r12,0,MSR_EE; \ | ||
296 | mtmsrd r11,1 | ||
297 | |||
298 | #define ADD_NVGPRS \ | 291 | #define ADD_NVGPRS \ |
299 | bl .save_nvgprs | 292 | bl .save_nvgprs |
300 | 293 | ||
diff --git a/arch/powerpc/include/asm/kvm_book3s.h b/arch/powerpc/include/asm/kvm_book3s.h index aa795ccef294..fd07f43d6622 100644 --- a/arch/powerpc/include/asm/kvm_book3s.h +++ b/arch/powerpc/include/asm/kvm_book3s.h | |||
@@ -81,12 +81,13 @@ struct kvmppc_vcpu_book3s { | |||
81 | u64 sdr1; | 81 | u64 sdr1; |
82 | u64 hior; | 82 | u64 hior; |
83 | u64 msr_mask; | 83 | u64 msr_mask; |
84 | u64 vsid_next; | ||
85 | #ifdef CONFIG_PPC_BOOK3S_32 | 84 | #ifdef CONFIG_PPC_BOOK3S_32 |
86 | u32 vsid_pool[VSID_POOL_SIZE]; | 85 | u32 vsid_pool[VSID_POOL_SIZE]; |
86 | u32 vsid_next; | ||
87 | #else | 87 | #else |
88 | u64 vsid_first; | 88 | u64 proto_vsid_first; |
89 | u64 vsid_max; | 89 | u64 proto_vsid_max; |
90 | u64 proto_vsid_next; | ||
90 | #endif | 91 | #endif |
91 | int context_id[SID_CONTEXTS]; | 92 | int context_id[SID_CONTEXTS]; |
92 | 93 | ||
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S index f8a7a1a1a9f4..ef2074c3e906 100644 --- a/arch/powerpc/kernel/entry_64.S +++ b/arch/powerpc/kernel/entry_64.S | |||
@@ -588,23 +588,19 @@ _GLOBAL(ret_from_except_lite) | |||
588 | fast_exc_return_irq: | 588 | fast_exc_return_irq: |
589 | restore: | 589 | restore: |
590 | /* | 590 | /* |
591 | * This is the main kernel exit path, we first check if we | 591 | * This is the main kernel exit path. First we check if we |
592 | * have to change our interrupt state. | 592 | * are about to re-enable interrupts |
593 | */ | 593 | */ |
594 | ld r5,SOFTE(r1) | 594 | ld r5,SOFTE(r1) |
595 | lbz r6,PACASOFTIRQEN(r13) | 595 | lbz r6,PACASOFTIRQEN(r13) |
596 | cmpwi cr1,r5,0 | 596 | cmpwi cr0,r5,0 |
597 | cmpw cr0,r5,r6 | 597 | beq restore_irq_off |
598 | beq cr0,4f | ||
599 | 598 | ||
600 | /* We do, handle disable first, which is easy */ | 599 | /* We are enabling, were we already enabled ? Yes, just return */ |
601 | bne cr1,3f; | 600 | cmpwi cr0,r6,1 |
602 | li r0,0 | 601 | beq cr0,do_restore |
603 | stb r0,PACASOFTIRQEN(r13); | ||
604 | TRACE_DISABLE_INTS | ||
605 | b 4f | ||
606 | 602 | ||
607 | 3: /* | 603 | /* |
608 | * We are about to soft-enable interrupts (we are hard disabled | 604 | * We are about to soft-enable interrupts (we are hard disabled |
609 | * at this point). We check if there's anything that needs to | 605 | * at this point). We check if there's anything that needs to |
610 | * be replayed first. | 606 | * be replayed first. |
@@ -626,7 +622,7 @@ restore_no_replay: | |||
626 | /* | 622 | /* |
627 | * Final return path. BookE is handled in a different file | 623 | * Final return path. BookE is handled in a different file |
628 | */ | 624 | */ |
629 | 4: | 625 | do_restore: |
630 | #ifdef CONFIG_PPC_BOOK3E | 626 | #ifdef CONFIG_PPC_BOOK3E |
631 | b .exception_return_book3e | 627 | b .exception_return_book3e |
632 | #else | 628 | #else |
@@ -700,6 +696,25 @@ fast_exception_return: | |||
700 | #endif /* CONFIG_PPC_BOOK3E */ | 696 | #endif /* CONFIG_PPC_BOOK3E */ |
701 | 697 | ||
702 | /* | 698 | /* |
699 | * We are returning to a context with interrupts soft disabled. | ||
700 | * | ||
701 | * However, we may also about to hard enable, so we need to | ||
702 | * make sure that in this case, we also clear PACA_IRQ_HARD_DIS | ||
703 | * or that bit can get out of sync and bad things will happen | ||
704 | */ | ||
705 | restore_irq_off: | ||
706 | ld r3,_MSR(r1) | ||
707 | lbz r7,PACAIRQHAPPENED(r13) | ||
708 | andi. r0,r3,MSR_EE | ||
709 | beq 1f | ||
710 | rlwinm r7,r7,0,~PACA_IRQ_HARD_DIS | ||
711 | stb r7,PACAIRQHAPPENED(r13) | ||
712 | 1: li r0,0 | ||
713 | stb r0,PACASOFTIRQEN(r13); | ||
714 | TRACE_DISABLE_INTS | ||
715 | b do_restore | ||
716 | |||
717 | /* | ||
703 | * Something did happen, check if a re-emit is needed | 718 | * Something did happen, check if a re-emit is needed |
704 | * (this also clears paca->irq_happened) | 719 | * (this also clears paca->irq_happened) |
705 | */ | 720 | */ |
@@ -748,6 +763,9 @@ restore_check_irq_replay: | |||
748 | #endif /* CONFIG_PPC_BOOK3E */ | 763 | #endif /* CONFIG_PPC_BOOK3E */ |
749 | 1: b .ret_from_except /* What else to do here ? */ | 764 | 1: b .ret_from_except /* What else to do here ? */ |
750 | 765 | ||
766 | |||
767 | |||
768 | 3: | ||
751 | do_work: | 769 | do_work: |
752 | #ifdef CONFIG_PREEMPT | 770 | #ifdef CONFIG_PREEMPT |
753 | andi. r0,r3,MSR_PR /* Returning to user mode? */ | 771 | andi. r0,r3,MSR_PR /* Returning to user mode? */ |
@@ -767,16 +785,6 @@ do_work: | |||
767 | SOFT_DISABLE_INTS(r3,r4) | 785 | SOFT_DISABLE_INTS(r3,r4) |
768 | 1: bl .preempt_schedule_irq | 786 | 1: bl .preempt_schedule_irq |
769 | 787 | ||
770 | /* Hard-disable interrupts again (and update PACA) */ | ||
771 | #ifdef CONFIG_PPC_BOOK3E | ||
772 | wrteei 0 | ||
773 | #else | ||
774 | ld r10,PACAKMSR(r13) /* Get kernel MSR without EE */ | ||
775 | mtmsrd r10,1 | ||
776 | #endif /* CONFIG_PPC_BOOK3E */ | ||
777 | li r0,PACA_IRQ_HARD_DIS | ||
778 | stb r0,PACAIRQHAPPENED(r13) | ||
779 | |||
780 | /* Re-test flags and eventually loop */ | 788 | /* Re-test flags and eventually loop */ |
781 | clrrdi r9,r1,THREAD_SHIFT | 789 | clrrdi r9,r1,THREAD_SHIFT |
782 | ld r4,TI_FLAGS(r9) | 790 | ld r4,TI_FLAGS(r9) |
@@ -787,14 +795,6 @@ do_work: | |||
787 | user_work: | 795 | user_work: |
788 | #endif /* CONFIG_PREEMPT */ | 796 | #endif /* CONFIG_PREEMPT */ |
789 | 797 | ||
790 | /* Enable interrupts */ | ||
791 | #ifdef CONFIG_PPC_BOOK3E | ||
792 | wrteei 1 | ||
793 | #else | ||
794 | ori r10,r10,MSR_EE | ||
795 | mtmsrd r10,1 | ||
796 | #endif /* CONFIG_PPC_BOOK3E */ | ||
797 | |||
798 | andi. r0,r4,_TIF_NEED_RESCHED | 798 | andi. r0,r4,_TIF_NEED_RESCHED |
799 | beq 1f | 799 | beq 1f |
800 | bl .restore_interrupts | 800 | bl .restore_interrupts |
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S index cb705fdbb458..8f880bc77c56 100644 --- a/arch/powerpc/kernel/exceptions-64s.S +++ b/arch/powerpc/kernel/exceptions-64s.S | |||
@@ -768,8 +768,8 @@ alignment_common: | |||
768 | std r3,_DAR(r1) | 768 | std r3,_DAR(r1) |
769 | std r4,_DSISR(r1) | 769 | std r4,_DSISR(r1) |
770 | bl .save_nvgprs | 770 | bl .save_nvgprs |
771 | DISABLE_INTS | ||
771 | addi r3,r1,STACK_FRAME_OVERHEAD | 772 | addi r3,r1,STACK_FRAME_OVERHEAD |
772 | ENABLE_INTS | ||
773 | bl .alignment_exception | 773 | bl .alignment_exception |
774 | b .ret_from_except | 774 | b .ret_from_except |
775 | 775 | ||
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index 43eb74fcedde..641da9e868ce 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c | |||
@@ -229,6 +229,19 @@ notrace void arch_local_irq_restore(unsigned long en) | |||
229 | */ | 229 | */ |
230 | if (unlikely(irq_happened != PACA_IRQ_HARD_DIS)) | 230 | if (unlikely(irq_happened != PACA_IRQ_HARD_DIS)) |
231 | __hard_irq_disable(); | 231 | __hard_irq_disable(); |
232 | #ifdef CONFIG_TRACE_IRQFLAG | ||
233 | else { | ||
234 | /* | ||
235 | * We should already be hard disabled here. We had bugs | ||
236 | * where that wasn't the case so let's dbl check it and | ||
237 | * warn if we are wrong. Only do that when IRQ tracing | ||
238 | * is enabled as mfmsr() can be costly. | ||
239 | */ | ||
240 | if (WARN_ON(mfmsr() & MSR_EE)) | ||
241 | __hard_irq_disable(); | ||
242 | } | ||
243 | #endif /* CONFIG_TRACE_IRQFLAG */ | ||
244 | |||
232 | set_soft_enabled(0); | 245 | set_soft_enabled(0); |
233 | 246 | ||
234 | /* | 247 | /* |
@@ -260,11 +273,17 @@ EXPORT_SYMBOL(arch_local_irq_restore); | |||
260 | * if they are currently disabled. This is typically called before | 273 | * if they are currently disabled. This is typically called before |
261 | * schedule() or do_signal() when returning to userspace. We do it | 274 | * schedule() or do_signal() when returning to userspace. We do it |
262 | * in C to avoid the burden of dealing with lockdep etc... | 275 | * in C to avoid the burden of dealing with lockdep etc... |
276 | * | ||
277 | * NOTE: This is called with interrupts hard disabled but not marked | ||
278 | * as such in paca->irq_happened, so we need to resync this. | ||
263 | */ | 279 | */ |
264 | void restore_interrupts(void) | 280 | void restore_interrupts(void) |
265 | { | 281 | { |
266 | if (irqs_disabled()) | 282 | if (irqs_disabled()) { |
283 | local_paca->irq_happened |= PACA_IRQ_HARD_DIS; | ||
267 | local_irq_enable(); | 284 | local_irq_enable(); |
285 | } else | ||
286 | __hard_irq_enable(); | ||
268 | } | 287 | } |
269 | 288 | ||
270 | #endif /* CONFIG_PPC64 */ | 289 | #endif /* CONFIG_PPC64 */ |
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c index 6aa0c663e247..158972341a2d 100644 --- a/arch/powerpc/kernel/traps.c +++ b/arch/powerpc/kernel/traps.c | |||
@@ -248,7 +248,7 @@ void _exception(int signr, struct pt_regs *regs, int code, unsigned long addr) | |||
248 | addr, regs->nip, regs->link, code); | 248 | addr, regs->nip, regs->link, code); |
249 | } | 249 | } |
250 | 250 | ||
251 | if (!arch_irq_disabled_regs(regs)) | 251 | if (arch_irqs_disabled() && !arch_irq_disabled_regs(regs)) |
252 | local_irq_enable(); | 252 | local_irq_enable(); |
253 | 253 | ||
254 | memset(&info, 0, sizeof(info)); | 254 | memset(&info, 0, sizeof(info)); |
@@ -1019,7 +1019,9 @@ void __kprobes program_check_exception(struct pt_regs *regs) | |||
1019 | return; | 1019 | return; |
1020 | } | 1020 | } |
1021 | 1021 | ||
1022 | local_irq_enable(); | 1022 | /* We restore the interrupt state now */ |
1023 | if (!arch_irq_disabled_regs(regs)) | ||
1024 | local_irq_enable(); | ||
1023 | 1025 | ||
1024 | #ifdef CONFIG_MATH_EMULATION | 1026 | #ifdef CONFIG_MATH_EMULATION |
1025 | /* (reason & REASON_ILLEGAL) would be the obvious thing here, | 1027 | /* (reason & REASON_ILLEGAL) would be the obvious thing here, |
@@ -1069,6 +1071,10 @@ void alignment_exception(struct pt_regs *regs) | |||
1069 | { | 1071 | { |
1070 | int sig, code, fixed = 0; | 1072 | int sig, code, fixed = 0; |
1071 | 1073 | ||
1074 | /* We restore the interrupt state now */ | ||
1075 | if (!arch_irq_disabled_regs(regs)) | ||
1076 | local_irq_enable(); | ||
1077 | |||
1072 | /* we don't implement logging of alignment exceptions */ | 1078 | /* we don't implement logging of alignment exceptions */ |
1073 | if (!(current->thread.align_ctl & PR_UNALIGN_SIGBUS)) | 1079 | if (!(current->thread.align_ctl & PR_UNALIGN_SIGBUS)) |
1074 | fixed = fix_alignment(regs); | 1080 | fixed = fix_alignment(regs); |
diff --git a/arch/powerpc/kvm/book3s_64_mmu_host.c b/arch/powerpc/kvm/book3s_64_mmu_host.c index 6f87f39a1ac2..10fc8ec9d2a8 100644 --- a/arch/powerpc/kvm/book3s_64_mmu_host.c +++ b/arch/powerpc/kvm/book3s_64_mmu_host.c | |||
@@ -194,14 +194,14 @@ static struct kvmppc_sid_map *create_sid_map(struct kvm_vcpu *vcpu, u64 gvsid) | |||
194 | backwards_map = !backwards_map; | 194 | backwards_map = !backwards_map; |
195 | 195 | ||
196 | /* Uh-oh ... out of mappings. Let's flush! */ | 196 | /* Uh-oh ... out of mappings. Let's flush! */ |
197 | if (vcpu_book3s->vsid_next == vcpu_book3s->vsid_max) { | 197 | if (vcpu_book3s->proto_vsid_next == vcpu_book3s->proto_vsid_max) { |
198 | vcpu_book3s->vsid_next = vcpu_book3s->vsid_first; | 198 | vcpu_book3s->proto_vsid_next = vcpu_book3s->proto_vsid_first; |
199 | memset(vcpu_book3s->sid_map, 0, | 199 | memset(vcpu_book3s->sid_map, 0, |
200 | sizeof(struct kvmppc_sid_map) * SID_MAP_NUM); | 200 | sizeof(struct kvmppc_sid_map) * SID_MAP_NUM); |
201 | kvmppc_mmu_pte_flush(vcpu, 0, 0); | 201 | kvmppc_mmu_pte_flush(vcpu, 0, 0); |
202 | kvmppc_mmu_flush_segments(vcpu); | 202 | kvmppc_mmu_flush_segments(vcpu); |
203 | } | 203 | } |
204 | map->host_vsid = vcpu_book3s->vsid_next++; | 204 | map->host_vsid = vsid_scramble(vcpu_book3s->proto_vsid_next++, 256M); |
205 | 205 | ||
206 | map->guest_vsid = gvsid; | 206 | map->guest_vsid = gvsid; |
207 | map->valid = true; | 207 | map->valid = true; |
@@ -319,9 +319,10 @@ int kvmppc_mmu_init(struct kvm_vcpu *vcpu) | |||
319 | return -1; | 319 | return -1; |
320 | vcpu3s->context_id[0] = err; | 320 | vcpu3s->context_id[0] = err; |
321 | 321 | ||
322 | vcpu3s->vsid_max = ((vcpu3s->context_id[0] + 1) << USER_ESID_BITS) - 1; | 322 | vcpu3s->proto_vsid_max = ((vcpu3s->context_id[0] + 1) |
323 | vcpu3s->vsid_first = vcpu3s->context_id[0] << USER_ESID_BITS; | 323 | << USER_ESID_BITS) - 1; |
324 | vcpu3s->vsid_next = vcpu3s->vsid_first; | 324 | vcpu3s->proto_vsid_first = vcpu3s->context_id[0] << USER_ESID_BITS; |
325 | vcpu3s->proto_vsid_next = vcpu3s->proto_vsid_first; | ||
325 | 326 | ||
326 | kvmppc_mmu_hpte_init(vcpu); | 327 | kvmppc_mmu_hpte_init(vcpu); |
327 | 328 | ||
diff --git a/arch/powerpc/kvm/book3s_64_mmu_hv.c b/arch/powerpc/kvm/book3s_64_mmu_hv.c index ddc485a529f2..c3beaeef3f60 100644 --- a/arch/powerpc/kvm/book3s_64_mmu_hv.c +++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c | |||
@@ -258,6 +258,8 @@ static long kvmppc_get_guest_page(struct kvm *kvm, unsigned long gfn, | |||
258 | !(memslot->userspace_addr & (s - 1))) { | 258 | !(memslot->userspace_addr & (s - 1))) { |
259 | start &= ~(s - 1); | 259 | start &= ~(s - 1); |
260 | pgsize = s; | 260 | pgsize = s; |
261 | get_page(hpage); | ||
262 | put_page(page); | ||
261 | page = hpage; | 263 | page = hpage; |
262 | } | 264 | } |
263 | } | 265 | } |
@@ -281,11 +283,8 @@ static long kvmppc_get_guest_page(struct kvm *kvm, unsigned long gfn, | |||
281 | err = 0; | 283 | err = 0; |
282 | 284 | ||
283 | out: | 285 | out: |
284 | if (got) { | 286 | if (got) |
285 | if (PageHuge(page)) | ||
286 | page = compound_head(page); | ||
287 | put_page(page); | 287 | put_page(page); |
288 | } | ||
289 | return err; | 288 | return err; |
290 | 289 | ||
291 | up_err: | 290 | up_err: |
@@ -678,8 +677,15 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu, | |||
678 | SetPageDirty(page); | 677 | SetPageDirty(page); |
679 | 678 | ||
680 | out_put: | 679 | out_put: |
681 | if (page) | 680 | if (page) { |
682 | put_page(page); | 681 | /* |
682 | * We drop pages[0] here, not page because page might | ||
683 | * have been set to the head page of a compound, but | ||
684 | * we have to drop the reference on the correct tail | ||
685 | * page to match the get inside gup() | ||
686 | */ | ||
687 | put_page(pages[0]); | ||
688 | } | ||
683 | return ret; | 689 | return ret; |
684 | 690 | ||
685 | out_unlock: | 691 | out_unlock: |
@@ -979,6 +985,7 @@ void *kvmppc_pin_guest_page(struct kvm *kvm, unsigned long gpa, | |||
979 | pa = *physp; | 985 | pa = *physp; |
980 | } | 986 | } |
981 | page = pfn_to_page(pa >> PAGE_SHIFT); | 987 | page = pfn_to_page(pa >> PAGE_SHIFT); |
988 | get_page(page); | ||
982 | } else { | 989 | } else { |
983 | hva = gfn_to_hva_memslot(memslot, gfn); | 990 | hva = gfn_to_hva_memslot(memslot, gfn); |
984 | npages = get_user_pages_fast(hva, 1, 1, pages); | 991 | npages = get_user_pages_fast(hva, 1, 1, pages); |
@@ -991,8 +998,6 @@ void *kvmppc_pin_guest_page(struct kvm *kvm, unsigned long gpa, | |||
991 | page = compound_head(page); | 998 | page = compound_head(page); |
992 | psize <<= compound_order(page); | 999 | psize <<= compound_order(page); |
993 | } | 1000 | } |
994 | if (!kvm->arch.using_mmu_notifiers) | ||
995 | get_page(page); | ||
996 | offset = gpa & (psize - 1); | 1001 | offset = gpa & (psize - 1); |
997 | if (nb_ret) | 1002 | if (nb_ret) |
998 | *nb_ret = psize - offset; | 1003 | *nb_ret = psize - offset; |
@@ -1003,7 +1008,6 @@ void kvmppc_unpin_guest_page(struct kvm *kvm, void *va) | |||
1003 | { | 1008 | { |
1004 | struct page *page = virt_to_page(va); | 1009 | struct page *page = virt_to_page(va); |
1005 | 1010 | ||
1006 | page = compound_head(page); | ||
1007 | put_page(page); | 1011 | put_page(page); |
1008 | } | 1012 | } |
1009 | 1013 | ||
diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c index 01294a5099dd..108d1f580177 100644 --- a/arch/powerpc/kvm/book3s_hv.c +++ b/arch/powerpc/kvm/book3s_hv.c | |||
@@ -1192,8 +1192,6 @@ static void unpin_slot(struct kvm *kvm, int slot_id) | |||
1192 | continue; | 1192 | continue; |
1193 | pfn = physp[j] >> PAGE_SHIFT; | 1193 | pfn = physp[j] >> PAGE_SHIFT; |
1194 | page = pfn_to_page(pfn); | 1194 | page = pfn_to_page(pfn); |
1195 | if (PageHuge(page)) | ||
1196 | page = compound_head(page); | ||
1197 | SetPageDirty(page); | 1195 | SetPageDirty(page); |
1198 | put_page(page); | 1196 | put_page(page); |
1199 | } | 1197 | } |
diff --git a/arch/powerpc/kvm/book3s_hv_rm_mmu.c b/arch/powerpc/kvm/book3s_hv_rm_mmu.c index def880aea63a..cec4daddbf31 100644 --- a/arch/powerpc/kvm/book3s_hv_rm_mmu.c +++ b/arch/powerpc/kvm/book3s_hv_rm_mmu.c | |||
@@ -463,6 +463,7 @@ long kvmppc_h_bulk_remove(struct kvm_vcpu *vcpu) | |||
463 | /* insert R and C bits from PTE */ | 463 | /* insert R and C bits from PTE */ |
464 | rcbits = rev->guest_rpte & (HPTE_R_R|HPTE_R_C); | 464 | rcbits = rev->guest_rpte & (HPTE_R_R|HPTE_R_C); |
465 | args[j] |= rcbits << (56 - 5); | 465 | args[j] |= rcbits << (56 - 5); |
466 | hp[0] = 0; | ||
466 | continue; | 467 | continue; |
467 | } | 468 | } |
468 | 469 | ||
diff --git a/arch/powerpc/kvm/book3s_segment.S b/arch/powerpc/kvm/book3s_segment.S index 0676ae249b9f..6e6e9cef34a8 100644 --- a/arch/powerpc/kvm/book3s_segment.S +++ b/arch/powerpc/kvm/book3s_segment.S | |||
@@ -197,7 +197,8 @@ kvmppc_interrupt: | |||
197 | /* Save guest PC and MSR */ | 197 | /* Save guest PC and MSR */ |
198 | #ifdef CONFIG_PPC64 | 198 | #ifdef CONFIG_PPC64 |
199 | BEGIN_FTR_SECTION | 199 | BEGIN_FTR_SECTION |
200 | andi. r0,r12,0x2 | 200 | andi. r0, r12, 0x2 |
201 | cmpwi cr1, r0, 0 | ||
201 | beq 1f | 202 | beq 1f |
202 | mfspr r3,SPRN_HSRR0 | 203 | mfspr r3,SPRN_HSRR0 |
203 | mfspr r4,SPRN_HSRR1 | 204 | mfspr r4,SPRN_HSRR1 |
@@ -250,6 +251,12 @@ END_FTR_SECTION_IFSET(CPU_FTR_HVMODE) | |||
250 | beq ld_last_prev_inst | 251 | beq ld_last_prev_inst |
251 | cmpwi r12, BOOK3S_INTERRUPT_ALIGNMENT | 252 | cmpwi r12, BOOK3S_INTERRUPT_ALIGNMENT |
252 | beq- ld_last_inst | 253 | beq- ld_last_inst |
254 | #ifdef CONFIG_PPC64 | ||
255 | BEGIN_FTR_SECTION | ||
256 | cmpwi r12, BOOK3S_INTERRUPT_H_EMUL_ASSIST | ||
257 | beq- ld_last_inst | ||
258 | END_FTR_SECTION_IFSET(CPU_FTR_HVMODE) | ||
259 | #endif | ||
253 | 260 | ||
254 | b no_ld_last_inst | 261 | b no_ld_last_inst |
255 | 262 | ||
@@ -316,23 +323,17 @@ no_dcbz32_off: | |||
316 | * Having set up SRR0/1 with the address where we want | 323 | * Having set up SRR0/1 with the address where we want |
317 | * to continue with relocation on (potentially in module | 324 | * to continue with relocation on (potentially in module |
318 | * space), we either just go straight there with rfi[d], | 325 | * space), we either just go straight there with rfi[d], |
319 | * or we jump to an interrupt handler with bctr if there | 326 | * or we jump to an interrupt handler if there is an |
320 | * is an interrupt to be handled first. In the latter | 327 | * interrupt to be handled first. In the latter case, |
321 | * case, the rfi[d] at the end of the interrupt handler | 328 | * the rfi[d] at the end of the interrupt handler will |
322 | * will get us back to where we want to continue. | 329 | * get us back to where we want to continue. |
323 | */ | 330 | */ |
324 | 331 | ||
325 | cmpwi r12, BOOK3S_INTERRUPT_EXTERNAL | ||
326 | beq 1f | ||
327 | cmpwi r12, BOOK3S_INTERRUPT_DECREMENTER | ||
328 | beq 1f | ||
329 | cmpwi r12, BOOK3S_INTERRUPT_PERFMON | ||
330 | 1: mtctr r12 | ||
331 | |||
332 | /* Register usage at this point: | 332 | /* Register usage at this point: |
333 | * | 333 | * |
334 | * R1 = host R1 | 334 | * R1 = host R1 |
335 | * R2 = host R2 | 335 | * R2 = host R2 |
336 | * R10 = raw exit handler id | ||
336 | * R12 = exit handler id | 337 | * R12 = exit handler id |
337 | * R13 = shadow vcpu (32-bit) or PACA (64-bit) | 338 | * R13 = shadow vcpu (32-bit) or PACA (64-bit) |
338 | * SVCPU.* = guest * | 339 | * SVCPU.* = guest * |
@@ -342,12 +343,25 @@ no_dcbz32_off: | |||
342 | PPC_LL r6, HSTATE_HOST_MSR(r13) | 343 | PPC_LL r6, HSTATE_HOST_MSR(r13) |
343 | PPC_LL r8, HSTATE_VMHANDLER(r13) | 344 | PPC_LL r8, HSTATE_VMHANDLER(r13) |
344 | 345 | ||
345 | /* Restore host msr -> SRR1 */ | 346 | #ifdef CONFIG_PPC64 |
347 | BEGIN_FTR_SECTION | ||
348 | beq cr1, 1f | ||
349 | mtspr SPRN_HSRR1, r6 | ||
350 | mtspr SPRN_HSRR0, r8 | ||
351 | END_FTR_SECTION_IFSET(CPU_FTR_HVMODE) | ||
352 | #endif | ||
353 | 1: /* Restore host msr -> SRR1 */ | ||
346 | mtsrr1 r6 | 354 | mtsrr1 r6 |
347 | /* Load highmem handler address */ | 355 | /* Load highmem handler address */ |
348 | mtsrr0 r8 | 356 | mtsrr0 r8 |
349 | 357 | ||
350 | /* RFI into the highmem handler, or jump to interrupt handler */ | 358 | /* RFI into the highmem handler, or jump to interrupt handler */ |
351 | beqctr | 359 | cmpwi r12, BOOK3S_INTERRUPT_EXTERNAL |
360 | beqa BOOK3S_INTERRUPT_EXTERNAL | ||
361 | cmpwi r12, BOOK3S_INTERRUPT_DECREMENTER | ||
362 | beqa BOOK3S_INTERRUPT_DECREMENTER | ||
363 | cmpwi r12, BOOK3S_INTERRUPT_PERFMON | ||
364 | beqa BOOK3S_INTERRUPT_PERFMON | ||
365 | |||
352 | RFI | 366 | RFI |
353 | kvmppc_handler_trampoline_exit_end: | 367 | kvmppc_handler_trampoline_exit_end: |
diff --git a/arch/sparc/kernel/central.c b/arch/sparc/kernel/central.c index 38d48a59879c..9708851a8b9f 100644 --- a/arch/sparc/kernel/central.c +++ b/arch/sparc/kernel/central.c | |||
@@ -269,4 +269,4 @@ static int __init sunfire_init(void) | |||
269 | return 0; | 269 | return 0; |
270 | } | 270 | } |
271 | 271 | ||
272 | subsys_initcall(sunfire_init); | 272 | fs_initcall(sunfire_init); |
diff --git a/arch/sparc/mm/ultra.S b/arch/sparc/mm/ultra.S index b57a5942ba64..874162a11ceb 100644 --- a/arch/sparc/mm/ultra.S +++ b/arch/sparc/mm/ultra.S | |||
@@ -495,11 +495,11 @@ xcall_fetch_glob_regs: | |||
495 | stx %o7, [%g1 + GR_SNAP_O7] | 495 | stx %o7, [%g1 + GR_SNAP_O7] |
496 | stx %i7, [%g1 + GR_SNAP_I7] | 496 | stx %i7, [%g1 + GR_SNAP_I7] |
497 | /* Don't try this at home kids... */ | 497 | /* Don't try this at home kids... */ |
498 | rdpr %cwp, %g2 | 498 | rdpr %cwp, %g3 |
499 | sub %g2, 1, %g7 | 499 | sub %g3, 1, %g7 |
500 | wrpr %g7, %cwp | 500 | wrpr %g7, %cwp |
501 | mov %i7, %g7 | 501 | mov %i7, %g7 |
502 | wrpr %g2, %cwp | 502 | wrpr %g3, %cwp |
503 | stx %g7, [%g1 + GR_SNAP_RPC] | 503 | stx %g7, [%g1 + GR_SNAP_RPC] |
504 | sethi %hi(trap_block), %g7 | 504 | sethi %hi(trap_block), %g7 |
505 | or %g7, %lo(trap_block), %g7 | 505 | or %g7, %lo(trap_block), %g7 |
diff --git a/arch/tile/include/asm/thread_info.h b/arch/tile/include/asm/thread_info.h index bc4f562bd459..7594764d8a69 100644 --- a/arch/tile/include/asm/thread_info.h +++ b/arch/tile/include/asm/thread_info.h | |||
@@ -100,9 +100,14 @@ extern void cpu_idle_on_new_stack(struct thread_info *old_ti, | |||
100 | 100 | ||
101 | #else /* __ASSEMBLY__ */ | 101 | #else /* __ASSEMBLY__ */ |
102 | 102 | ||
103 | /* how to get the thread information struct from ASM */ | 103 | /* |
104 | * How to get the thread information struct from assembly. | ||
105 | * Note that we use different macros since different architectures | ||
106 | * have different semantics in their "mm" instruction and we would | ||
107 | * like to guarantee that the macro expands to exactly one instruction. | ||
108 | */ | ||
104 | #ifdef __tilegx__ | 109 | #ifdef __tilegx__ |
105 | #define GET_THREAD_INFO(reg) move reg, sp; mm reg, zero, LOG2_THREAD_SIZE, 63 | 110 | #define EXTRACT_THREAD_INFO(reg) mm reg, zero, LOG2_THREAD_SIZE, 63 |
106 | #else | 111 | #else |
107 | #define GET_THREAD_INFO(reg) mm reg, sp, zero, LOG2_THREAD_SIZE, 31 | 112 | #define GET_THREAD_INFO(reg) mm reg, sp, zero, LOG2_THREAD_SIZE, 31 |
108 | #endif | 113 | #endif |
diff --git a/arch/tile/kernel/compat_signal.c b/arch/tile/kernel/compat_signal.c index 77763ccd5a7d..cdef6e5ec022 100644 --- a/arch/tile/kernel/compat_signal.c +++ b/arch/tile/kernel/compat_signal.c | |||
@@ -403,19 +403,17 @@ int compat_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
403 | * Set up registers for signal handler. | 403 | * Set up registers for signal handler. |
404 | * Registers that we don't modify keep the value they had from | 404 | * Registers that we don't modify keep the value they had from |
405 | * user-space at the time we took the signal. | 405 | * user-space at the time we took the signal. |
406 | * We always pass siginfo and mcontext, regardless of SA_SIGINFO, | ||
407 | * since some things rely on this (e.g. glibc's debug/segfault.c). | ||
406 | */ | 408 | */ |
407 | regs->pc = ptr_to_compat_reg(ka->sa.sa_handler); | 409 | regs->pc = ptr_to_compat_reg(ka->sa.sa_handler); |
408 | regs->ex1 = PL_ICS_EX1(USER_PL, 1); /* set crit sec in handler */ | 410 | regs->ex1 = PL_ICS_EX1(USER_PL, 1); /* set crit sec in handler */ |
409 | regs->sp = ptr_to_compat_reg(frame); | 411 | regs->sp = ptr_to_compat_reg(frame); |
410 | regs->lr = restorer; | 412 | regs->lr = restorer; |
411 | regs->regs[0] = (unsigned long) usig; | 413 | regs->regs[0] = (unsigned long) usig; |
412 | 414 | regs->regs[1] = ptr_to_compat_reg(&frame->info); | |
413 | if (ka->sa.sa_flags & SA_SIGINFO) { | 415 | regs->regs[2] = ptr_to_compat_reg(&frame->uc); |
414 | /* Need extra arguments, so mark to restore caller-saves. */ | 416 | regs->flags |= PT_FLAGS_CALLER_SAVES; |
415 | regs->regs[1] = ptr_to_compat_reg(&frame->info); | ||
416 | regs->regs[2] = ptr_to_compat_reg(&frame->uc); | ||
417 | regs->flags |= PT_FLAGS_CALLER_SAVES; | ||
418 | } | ||
419 | 417 | ||
420 | /* | 418 | /* |
421 | * Notify any tracer that was single-stepping it. | 419 | * Notify any tracer that was single-stepping it. |
diff --git a/arch/tile/kernel/intvec_32.S b/arch/tile/kernel/intvec_32.S index 5d56a1ef5ba5..6943515100f8 100644 --- a/arch/tile/kernel/intvec_32.S +++ b/arch/tile/kernel/intvec_32.S | |||
@@ -839,6 +839,18 @@ STD_ENTRY(interrupt_return) | |||
839 | FEEDBACK_REENTER(interrupt_return) | 839 | FEEDBACK_REENTER(interrupt_return) |
840 | 840 | ||
841 | /* | 841 | /* |
842 | * Use r33 to hold whether we have already loaded the callee-saves | ||
843 | * into ptregs. We don't want to do it twice in this loop, since | ||
844 | * then we'd clobber whatever changes are made by ptrace, etc. | ||
845 | * Get base of stack in r32. | ||
846 | */ | ||
847 | { | ||
848 | GET_THREAD_INFO(r32) | ||
849 | movei r33, 0 | ||
850 | } | ||
851 | |||
852 | .Lretry_work_pending: | ||
853 | /* | ||
842 | * Disable interrupts so as to make sure we don't | 854 | * Disable interrupts so as to make sure we don't |
843 | * miss an interrupt that sets any of the thread flags (like | 855 | * miss an interrupt that sets any of the thread flags (like |
844 | * need_resched or sigpending) between sampling and the iret. | 856 | * need_resched or sigpending) between sampling and the iret. |
@@ -848,9 +860,6 @@ STD_ENTRY(interrupt_return) | |||
848 | IRQ_DISABLE(r20, r21) | 860 | IRQ_DISABLE(r20, r21) |
849 | TRACE_IRQS_OFF /* Note: clobbers registers r0-r29 */ | 861 | TRACE_IRQS_OFF /* Note: clobbers registers r0-r29 */ |
850 | 862 | ||
851 | /* Get base of stack in r32; note r30/31 are used as arguments here. */ | ||
852 | GET_THREAD_INFO(r32) | ||
853 | |||
854 | 863 | ||
855 | /* Check to see if there is any work to do before returning to user. */ | 864 | /* Check to see if there is any work to do before returning to user. */ |
856 | { | 865 | { |
@@ -866,16 +875,18 @@ STD_ENTRY(interrupt_return) | |||
866 | 875 | ||
867 | /* | 876 | /* |
868 | * Make sure we have all the registers saved for signal | 877 | * Make sure we have all the registers saved for signal |
869 | * handling or single-step. Call out to C code to figure out | 878 | * handling, notify-resume, or single-step. Call out to C |
870 | * exactly what we need to do for each flag bit, then if | 879 | * code to figure out exactly what we need to do for each flag bit, |
871 | * necessary, reload the flags and recheck. | 880 | * then if necessary, reload the flags and recheck. |
872 | */ | 881 | */ |
873 | push_extra_callee_saves r0 | ||
874 | { | 882 | { |
875 | PTREGS_PTR(r0, PTREGS_OFFSET_BASE) | 883 | PTREGS_PTR(r0, PTREGS_OFFSET_BASE) |
876 | jal do_work_pending | 884 | bnz r33, 1f |
877 | } | 885 | } |
878 | bnz r0, .Lresume_userspace | 886 | push_extra_callee_saves r0 |
887 | movei r33, 1 | ||
888 | 1: jal do_work_pending | ||
889 | bnz r0, .Lretry_work_pending | ||
879 | 890 | ||
880 | /* | 891 | /* |
881 | * In the NMI case we | 892 | * In the NMI case we |
@@ -1180,10 +1191,12 @@ handle_syscall: | |||
1180 | add r20, r20, tp | 1191 | add r20, r20, tp |
1181 | lw r21, r20 | 1192 | lw r21, r20 |
1182 | addi r21, r21, 1 | 1193 | addi r21, r21, 1 |
1183 | sw r20, r21 | 1194 | { |
1195 | sw r20, r21 | ||
1196 | GET_THREAD_INFO(r31) | ||
1197 | } | ||
1184 | 1198 | ||
1185 | /* Trace syscalls, if requested. */ | 1199 | /* Trace syscalls, if requested. */ |
1186 | GET_THREAD_INFO(r31) | ||
1187 | addi r31, r31, THREAD_INFO_FLAGS_OFFSET | 1200 | addi r31, r31, THREAD_INFO_FLAGS_OFFSET |
1188 | lw r30, r31 | 1201 | lw r30, r31 |
1189 | andi r30, r30, _TIF_SYSCALL_TRACE | 1202 | andi r30, r30, _TIF_SYSCALL_TRACE |
@@ -1362,7 +1375,10 @@ handle_ill: | |||
1362 | 3: | 1375 | 3: |
1363 | /* set PC and continue */ | 1376 | /* set PC and continue */ |
1364 | lw r26, r24 | 1377 | lw r26, r24 |
1365 | sw r28, r26 | 1378 | { |
1379 | sw r28, r26 | ||
1380 | GET_THREAD_INFO(r0) | ||
1381 | } | ||
1366 | 1382 | ||
1367 | /* | 1383 | /* |
1368 | * Clear TIF_SINGLESTEP to prevent recursion if we execute an ill. | 1384 | * Clear TIF_SINGLESTEP to prevent recursion if we execute an ill. |
@@ -1370,7 +1386,6 @@ handle_ill: | |||
1370 | * need to clear it here and can't really impose on all other arches. | 1386 | * need to clear it here and can't really impose on all other arches. |
1371 | * So what's another write between friends? | 1387 | * So what's another write between friends? |
1372 | */ | 1388 | */ |
1373 | GET_THREAD_INFO(r0) | ||
1374 | 1389 | ||
1375 | addi r1, r0, THREAD_INFO_FLAGS_OFFSET | 1390 | addi r1, r0, THREAD_INFO_FLAGS_OFFSET |
1376 | { | 1391 | { |
diff --git a/arch/tile/kernel/intvec_64.S b/arch/tile/kernel/intvec_64.S index 49d9d6621682..30ae76e50c44 100644 --- a/arch/tile/kernel/intvec_64.S +++ b/arch/tile/kernel/intvec_64.S | |||
@@ -647,6 +647,20 @@ STD_ENTRY(interrupt_return) | |||
647 | FEEDBACK_REENTER(interrupt_return) | 647 | FEEDBACK_REENTER(interrupt_return) |
648 | 648 | ||
649 | /* | 649 | /* |
650 | * Use r33 to hold whether we have already loaded the callee-saves | ||
651 | * into ptregs. We don't want to do it twice in this loop, since | ||
652 | * then we'd clobber whatever changes are made by ptrace, etc. | ||
653 | */ | ||
654 | { | ||
655 | movei r33, 0 | ||
656 | move r32, sp | ||
657 | } | ||
658 | |||
659 | /* Get base of stack in r32. */ | ||
660 | EXTRACT_THREAD_INFO(r32) | ||
661 | |||
662 | .Lretry_work_pending: | ||
663 | /* | ||
650 | * Disable interrupts so as to make sure we don't | 664 | * Disable interrupts so as to make sure we don't |
651 | * miss an interrupt that sets any of the thread flags (like | 665 | * miss an interrupt that sets any of the thread flags (like |
652 | * need_resched or sigpending) between sampling and the iret. | 666 | * need_resched or sigpending) between sampling and the iret. |
@@ -656,9 +670,6 @@ STD_ENTRY(interrupt_return) | |||
656 | IRQ_DISABLE(r20, r21) | 670 | IRQ_DISABLE(r20, r21) |
657 | TRACE_IRQS_OFF /* Note: clobbers registers r0-r29 */ | 671 | TRACE_IRQS_OFF /* Note: clobbers registers r0-r29 */ |
658 | 672 | ||
659 | /* Get base of stack in r32; note r30/31 are used as arguments here. */ | ||
660 | GET_THREAD_INFO(r32) | ||
661 | |||
662 | 673 | ||
663 | /* Check to see if there is any work to do before returning to user. */ | 674 | /* Check to see if there is any work to do before returning to user. */ |
664 | { | 675 | { |
@@ -674,16 +685,18 @@ STD_ENTRY(interrupt_return) | |||
674 | 685 | ||
675 | /* | 686 | /* |
676 | * Make sure we have all the registers saved for signal | 687 | * Make sure we have all the registers saved for signal |
677 | * handling or single-step. Call out to C code to figure out | 688 | * handling or notify-resume. Call out to C code to figure out |
678 | * exactly what we need to do for each flag bit, then if | 689 | * exactly what we need to do for each flag bit, then if |
679 | * necessary, reload the flags and recheck. | 690 | * necessary, reload the flags and recheck. |
680 | */ | 691 | */ |
681 | push_extra_callee_saves r0 | ||
682 | { | 692 | { |
683 | PTREGS_PTR(r0, PTREGS_OFFSET_BASE) | 693 | PTREGS_PTR(r0, PTREGS_OFFSET_BASE) |
684 | jal do_work_pending | 694 | bnez r33, 1f |
685 | } | 695 | } |
686 | bnez r0, .Lresume_userspace | 696 | push_extra_callee_saves r0 |
697 | movei r33, 1 | ||
698 | 1: jal do_work_pending | ||
699 | bnez r0, .Lretry_work_pending | ||
687 | 700 | ||
688 | /* | 701 | /* |
689 | * In the NMI case we | 702 | * In the NMI case we |
@@ -968,11 +981,16 @@ handle_syscall: | |||
968 | shl16insli r20, r20, hw0(irq_stat + IRQ_CPUSTAT_SYSCALL_COUNT_OFFSET) | 981 | shl16insli r20, r20, hw0(irq_stat + IRQ_CPUSTAT_SYSCALL_COUNT_OFFSET) |
969 | add r20, r20, tp | 982 | add r20, r20, tp |
970 | ld4s r21, r20 | 983 | ld4s r21, r20 |
971 | addi r21, r21, 1 | 984 | { |
972 | st4 r20, r21 | 985 | addi r21, r21, 1 |
986 | move r31, sp | ||
987 | } | ||
988 | { | ||
989 | st4 r20, r21 | ||
990 | EXTRACT_THREAD_INFO(r31) | ||
991 | } | ||
973 | 992 | ||
974 | /* Trace syscalls, if requested. */ | 993 | /* Trace syscalls, if requested. */ |
975 | GET_THREAD_INFO(r31) | ||
976 | addi r31, r31, THREAD_INFO_FLAGS_OFFSET | 994 | addi r31, r31, THREAD_INFO_FLAGS_OFFSET |
977 | ld r30, r31 | 995 | ld r30, r31 |
978 | andi r30, r30, _TIF_SYSCALL_TRACE | 996 | andi r30, r30, _TIF_SYSCALL_TRACE |
diff --git a/arch/tile/kernel/process.c b/arch/tile/kernel/process.c index 2d5ef617bb39..54e6c64b85cc 100644 --- a/arch/tile/kernel/process.c +++ b/arch/tile/kernel/process.c | |||
@@ -567,6 +567,10 @@ struct task_struct *__sched _switch_to(struct task_struct *prev, | |||
567 | */ | 567 | */ |
568 | int do_work_pending(struct pt_regs *regs, u32 thread_info_flags) | 568 | int do_work_pending(struct pt_regs *regs, u32 thread_info_flags) |
569 | { | 569 | { |
570 | /* If we enter in kernel mode, do nothing and exit the caller loop. */ | ||
571 | if (!user_mode(regs)) | ||
572 | return 0; | ||
573 | |||
570 | if (thread_info_flags & _TIF_NEED_RESCHED) { | 574 | if (thread_info_flags & _TIF_NEED_RESCHED) { |
571 | schedule(); | 575 | schedule(); |
572 | return 1; | 576 | return 1; |
@@ -589,8 +593,7 @@ int do_work_pending(struct pt_regs *regs, u32 thread_info_flags) | |||
589 | return 1; | 593 | return 1; |
590 | } | 594 | } |
591 | if (thread_info_flags & _TIF_SINGLESTEP) { | 595 | if (thread_info_flags & _TIF_SINGLESTEP) { |
592 | if ((regs->ex1 & SPR_EX_CONTEXT_1_1__PL_MASK) == 0) | 596 | single_step_once(regs); |
593 | single_step_once(regs); | ||
594 | return 0; | 597 | return 0; |
595 | } | 598 | } |
596 | panic("work_pending: bad flags %#x\n", thread_info_flags); | 599 | panic("work_pending: bad flags %#x\n", thread_info_flags); |
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 1d14cc6b79ad..c9866b0b77d8 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
@@ -81,7 +81,7 @@ config X86 | |||
81 | select CLKEVT_I8253 | 81 | select CLKEVT_I8253 |
82 | select ARCH_HAVE_NMI_SAFE_CMPXCHG | 82 | select ARCH_HAVE_NMI_SAFE_CMPXCHG |
83 | select GENERIC_IOMAP | 83 | select GENERIC_IOMAP |
84 | select DCACHE_WORD_ACCESS if !DEBUG_PAGEALLOC | 84 | select DCACHE_WORD_ACCESS |
85 | 85 | ||
86 | config INSTRUCTION_DECODER | 86 | config INSTRUCTION_DECODER |
87 | def_bool (KPROBES || PERF_EVENTS) | 87 | def_bool (KPROBES || PERF_EVENTS) |
diff --git a/arch/x86/boot/compressed/relocs.c b/arch/x86/boot/compressed/relocs.c index d3c0b0277666..fb7117a4ade1 100644 --- a/arch/x86/boot/compressed/relocs.c +++ b/arch/x86/boot/compressed/relocs.c | |||
@@ -403,13 +403,11 @@ static void print_absolute_symbols(void) | |||
403 | for (i = 0; i < ehdr.e_shnum; i++) { | 403 | for (i = 0; i < ehdr.e_shnum; i++) { |
404 | struct section *sec = &secs[i]; | 404 | struct section *sec = &secs[i]; |
405 | char *sym_strtab; | 405 | char *sym_strtab; |
406 | Elf32_Sym *sh_symtab; | ||
407 | int j; | 406 | int j; |
408 | 407 | ||
409 | if (sec->shdr.sh_type != SHT_SYMTAB) { | 408 | if (sec->shdr.sh_type != SHT_SYMTAB) { |
410 | continue; | 409 | continue; |
411 | } | 410 | } |
412 | sh_symtab = sec->symtab; | ||
413 | sym_strtab = sec->link->strtab; | 411 | sym_strtab = sec->link->strtab; |
414 | for (j = 0; j < sec->shdr.sh_size/sizeof(Elf32_Sym); j++) { | 412 | for (j = 0; j < sec->shdr.sh_size/sizeof(Elf32_Sym); j++) { |
415 | Elf32_Sym *sym; | 413 | Elf32_Sym *sym; |
diff --git a/arch/x86/ia32/ia32_aout.c b/arch/x86/ia32/ia32_aout.c index 4824fb45560f..07b3a68d2d29 100644 --- a/arch/x86/ia32/ia32_aout.c +++ b/arch/x86/ia32/ia32_aout.c | |||
@@ -294,8 +294,7 @@ static int load_aout_binary(struct linux_binprm *bprm, struct pt_regs *regs) | |||
294 | 294 | ||
295 | /* OK, This is the point of no return */ | 295 | /* OK, This is the point of no return */ |
296 | set_personality(PER_LINUX); | 296 | set_personality(PER_LINUX); |
297 | set_thread_flag(TIF_IA32); | 297 | set_personality_ia32(false); |
298 | current->mm->context.ia32_compat = 1; | ||
299 | 298 | ||
300 | setup_new_exec(bprm); | 299 | setup_new_exec(bprm); |
301 | 300 | ||
diff --git a/arch/x86/include/asm/word-at-a-time.h b/arch/x86/include/asm/word-at-a-time.h index 6fe6767b7124..e58f03b206c3 100644 --- a/arch/x86/include/asm/word-at-a-time.h +++ b/arch/x86/include/asm/word-at-a-time.h | |||
@@ -43,4 +43,37 @@ static inline unsigned long has_zero(unsigned long a) | |||
43 | return ((a - REPEAT_BYTE(0x01)) & ~a) & REPEAT_BYTE(0x80); | 43 | return ((a - REPEAT_BYTE(0x01)) & ~a) & REPEAT_BYTE(0x80); |
44 | } | 44 | } |
45 | 45 | ||
46 | /* | ||
47 | * Load an unaligned word from kernel space. | ||
48 | * | ||
49 | * In the (very unlikely) case of the word being a page-crosser | ||
50 | * and the next page not being mapped, take the exception and | ||
51 | * return zeroes in the non-existing part. | ||
52 | */ | ||
53 | static inline unsigned long load_unaligned_zeropad(const void *addr) | ||
54 | { | ||
55 | unsigned long ret, dummy; | ||
56 | |||
57 | asm( | ||
58 | "1:\tmov %2,%0\n" | ||
59 | "2:\n" | ||
60 | ".section .fixup,\"ax\"\n" | ||
61 | "3:\t" | ||
62 | "lea %2,%1\n\t" | ||
63 | "and %3,%1\n\t" | ||
64 | "mov (%1),%0\n\t" | ||
65 | "leal %2,%%ecx\n\t" | ||
66 | "andl %4,%%ecx\n\t" | ||
67 | "shll $3,%%ecx\n\t" | ||
68 | "shr %%cl,%0\n\t" | ||
69 | "jmp 2b\n" | ||
70 | ".previous\n" | ||
71 | _ASM_EXTABLE(1b, 3b) | ||
72 | :"=&r" (ret),"=&c" (dummy) | ||
73 | :"m" (*(unsigned long *)addr), | ||
74 | "i" (-sizeof(unsigned long)), | ||
75 | "i" (sizeof(unsigned long)-1)); | ||
76 | return ret; | ||
77 | } | ||
78 | |||
46 | #endif /* _ASM_WORD_AT_A_TIME_H */ | 79 | #endif /* _ASM_WORD_AT_A_TIME_H */ |
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index 1c67ca100e4c..146bb6218eec 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c | |||
@@ -580,6 +580,24 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c) | |||
580 | } | 580 | } |
581 | } | 581 | } |
582 | 582 | ||
583 | /* re-enable TopologyExtensions if switched off by BIOS */ | ||
584 | if ((c->x86 == 0x15) && | ||
585 | (c->x86_model >= 0x10) && (c->x86_model <= 0x1f) && | ||
586 | !cpu_has(c, X86_FEATURE_TOPOEXT)) { | ||
587 | u64 val; | ||
588 | |||
589 | if (!rdmsrl_amd_safe(0xc0011005, &val)) { | ||
590 | val |= 1ULL << 54; | ||
591 | wrmsrl_amd_safe(0xc0011005, val); | ||
592 | rdmsrl(0xc0011005, val); | ||
593 | if (val & (1ULL << 54)) { | ||
594 | set_cpu_cap(c, X86_FEATURE_TOPOEXT); | ||
595 | printk(KERN_INFO FW_INFO "CPU: Re-enabling " | ||
596 | "disabled Topology Extensions Support\n"); | ||
597 | } | ||
598 | } | ||
599 | } | ||
600 | |||
583 | cpu_detect_cache_sizes(c); | 601 | cpu_detect_cache_sizes(c); |
584 | 602 | ||
585 | /* Multi core CPU? */ | 603 | /* Multi core CPU? */ |
diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c index b8ba6e4a27e4..e554e5ad2fe8 100644 --- a/arch/x86/kernel/kvm.c +++ b/arch/x86/kernel/kvm.c | |||
@@ -79,7 +79,6 @@ struct kvm_task_sleep_node { | |||
79 | u32 token; | 79 | u32 token; |
80 | int cpu; | 80 | int cpu; |
81 | bool halted; | 81 | bool halted; |
82 | struct mm_struct *mm; | ||
83 | }; | 82 | }; |
84 | 83 | ||
85 | static struct kvm_task_sleep_head { | 84 | static struct kvm_task_sleep_head { |
@@ -126,9 +125,7 @@ void kvm_async_pf_task_wait(u32 token) | |||
126 | 125 | ||
127 | n.token = token; | 126 | n.token = token; |
128 | n.cpu = smp_processor_id(); | 127 | n.cpu = smp_processor_id(); |
129 | n.mm = current->active_mm; | ||
130 | n.halted = idle || preempt_count() > 1; | 128 | n.halted = idle || preempt_count() > 1; |
131 | atomic_inc(&n.mm->mm_count); | ||
132 | init_waitqueue_head(&n.wq); | 129 | init_waitqueue_head(&n.wq); |
133 | hlist_add_head(&n.link, &b->list); | 130 | hlist_add_head(&n.link, &b->list); |
134 | spin_unlock(&b->lock); | 131 | spin_unlock(&b->lock); |
@@ -161,9 +158,6 @@ EXPORT_SYMBOL_GPL(kvm_async_pf_task_wait); | |||
161 | static void apf_task_wake_one(struct kvm_task_sleep_node *n) | 158 | static void apf_task_wake_one(struct kvm_task_sleep_node *n) |
162 | { | 159 | { |
163 | hlist_del_init(&n->link); | 160 | hlist_del_init(&n->link); |
164 | if (!n->mm) | ||
165 | return; | ||
166 | mmdrop(n->mm); | ||
167 | if (n->halted) | 161 | if (n->halted) |
168 | smp_send_reschedule(n->cpu); | 162 | smp_send_reschedule(n->cpu); |
169 | else if (waitqueue_active(&n->wq)) | 163 | else if (waitqueue_active(&n->wq)) |
@@ -207,7 +201,7 @@ again: | |||
207 | * async PF was not yet handled. | 201 | * async PF was not yet handled. |
208 | * Add dummy entry for the token. | 202 | * Add dummy entry for the token. |
209 | */ | 203 | */ |
210 | n = kmalloc(sizeof(*n), GFP_ATOMIC); | 204 | n = kzalloc(sizeof(*n), GFP_ATOMIC); |
211 | if (!n) { | 205 | if (!n) { |
212 | /* | 206 | /* |
213 | * Allocation failed! Busy wait while other cpu | 207 | * Allocation failed! Busy wait while other cpu |
@@ -219,7 +213,6 @@ again: | |||
219 | } | 213 | } |
220 | n->token = token; | 214 | n->token = token; |
221 | n->cpu = smp_processor_id(); | 215 | n->cpu = smp_processor_id(); |
222 | n->mm = NULL; | ||
223 | init_waitqueue_head(&n->wq); | 216 | init_waitqueue_head(&n->wq); |
224 | hlist_add_head(&n->link, &b->list); | 217 | hlist_add_head(&n->link, &b->list); |
225 | } else | 218 | } else |
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index 733ca39f367e..43d8b48b23e6 100644 --- a/arch/x86/kernel/process_64.c +++ b/arch/x86/kernel/process_64.c | |||
@@ -423,6 +423,7 @@ void set_personality_ia32(bool x32) | |||
423 | current_thread_info()->status |= TS_COMPAT; | 423 | current_thread_info()->status |= TS_COMPAT; |
424 | } | 424 | } |
425 | } | 425 | } |
426 | EXPORT_SYMBOL_GPL(set_personality_ia32); | ||
426 | 427 | ||
427 | unsigned long get_wchan(struct task_struct *p) | 428 | unsigned long get_wchan(struct task_struct *p) |
428 | { | 429 | { |
diff --git a/arch/x86/kernel/setup_percpu.c b/arch/x86/kernel/setup_percpu.c index 71f4727da373..5a98aa272184 100644 --- a/arch/x86/kernel/setup_percpu.c +++ b/arch/x86/kernel/setup_percpu.c | |||
@@ -185,10 +185,22 @@ void __init setup_per_cpu_areas(void) | |||
185 | #endif | 185 | #endif |
186 | rc = -EINVAL; | 186 | rc = -EINVAL; |
187 | if (pcpu_chosen_fc != PCPU_FC_PAGE) { | 187 | if (pcpu_chosen_fc != PCPU_FC_PAGE) { |
188 | const size_t atom_size = cpu_has_pse ? PMD_SIZE : PAGE_SIZE; | ||
189 | const size_t dyn_size = PERCPU_MODULE_RESERVE + | 188 | const size_t dyn_size = PERCPU_MODULE_RESERVE + |
190 | PERCPU_DYNAMIC_RESERVE - PERCPU_FIRST_CHUNK_RESERVE; | 189 | PERCPU_DYNAMIC_RESERVE - PERCPU_FIRST_CHUNK_RESERVE; |
190 | size_t atom_size; | ||
191 | 191 | ||
192 | /* | ||
193 | * On 64bit, use PMD_SIZE for atom_size so that embedded | ||
194 | * percpu areas are aligned to PMD. This, in the future, | ||
195 | * can also allow using PMD mappings in vmalloc area. Use | ||
196 | * PAGE_SIZE on 32bit as vmalloc space is highly contended | ||
197 | * and large vmalloc area allocs can easily fail. | ||
198 | */ | ||
199 | #ifdef CONFIG_X86_64 | ||
200 | atom_size = PMD_SIZE; | ||
201 | #else | ||
202 | atom_size = PAGE_SIZE; | ||
203 | #endif | ||
192 | rc = pcpu_embed_first_chunk(PERCPU_FIRST_CHUNK_RESERVE, | 204 | rc = pcpu_embed_first_chunk(PERCPU_FIRST_CHUNK_RESERVE, |
193 | dyn_size, atom_size, | 205 | dyn_size, atom_size, |
194 | pcpu_cpu_distance, | 206 | pcpu_cpu_distance, |
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 91a5e989abcf..185a2b823a2d 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
@@ -6581,6 +6581,7 @@ void kvm_arch_async_page_present(struct kvm_vcpu *vcpu, | |||
6581 | kvm_inject_page_fault(vcpu, &fault); | 6581 | kvm_inject_page_fault(vcpu, &fault); |
6582 | } | 6582 | } |
6583 | vcpu->arch.apf.halted = false; | 6583 | vcpu->arch.apf.halted = false; |
6584 | vcpu->arch.mp_state = KVM_MP_STATE_RUNNABLE; | ||
6584 | } | 6585 | } |
6585 | 6586 | ||
6586 | bool kvm_arch_can_inject_async_page_present(struct kvm_vcpu *vcpu) | 6587 | bool kvm_arch_can_inject_async_page_present(struct kvm_vcpu *vcpu) |
diff --git a/arch/x86/platform/geode/net5501.c b/arch/x86/platform/geode/net5501.c index 66d377e334f7..646e3b5b4bb6 100644 --- a/arch/x86/platform/geode/net5501.c +++ b/arch/x86/platform/geode/net5501.c | |||
@@ -63,7 +63,7 @@ static struct gpio_led net5501_leds[] = { | |||
63 | .name = "net5501:1", | 63 | .name = "net5501:1", |
64 | .gpio = 6, | 64 | .gpio = 6, |
65 | .default_trigger = "default-on", | 65 | .default_trigger = "default-on", |
66 | .active_low = 1, | 66 | .active_low = 0, |
67 | }, | 67 | }, |
68 | }; | 68 | }; |
69 | 69 | ||
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index a8f8844b8d32..95dccce8e979 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c | |||
@@ -63,6 +63,7 @@ | |||
63 | #include <asm/stackprotector.h> | 63 | #include <asm/stackprotector.h> |
64 | #include <asm/hypervisor.h> | 64 | #include <asm/hypervisor.h> |
65 | #include <asm/mwait.h> | 65 | #include <asm/mwait.h> |
66 | #include <asm/pci_x86.h> | ||
66 | 67 | ||
67 | #ifdef CONFIG_ACPI | 68 | #ifdef CONFIG_ACPI |
68 | #include <linux/acpi.h> | 69 | #include <linux/acpi.h> |
@@ -809,9 +810,40 @@ static void xen_io_delay(void) | |||
809 | } | 810 | } |
810 | 811 | ||
811 | #ifdef CONFIG_X86_LOCAL_APIC | 812 | #ifdef CONFIG_X86_LOCAL_APIC |
813 | static unsigned long xen_set_apic_id(unsigned int x) | ||
814 | { | ||
815 | WARN_ON(1); | ||
816 | return x; | ||
817 | } | ||
818 | static unsigned int xen_get_apic_id(unsigned long x) | ||
819 | { | ||
820 | return ((x)>>24) & 0xFFu; | ||
821 | } | ||
812 | static u32 xen_apic_read(u32 reg) | 822 | static u32 xen_apic_read(u32 reg) |
813 | { | 823 | { |
814 | return 0; | 824 | struct xen_platform_op op = { |
825 | .cmd = XENPF_get_cpuinfo, | ||
826 | .interface_version = XENPF_INTERFACE_VERSION, | ||
827 | .u.pcpu_info.xen_cpuid = 0, | ||
828 | }; | ||
829 | int ret = 0; | ||
830 | |||
831 | /* Shouldn't need this as APIC is turned off for PV, and we only | ||
832 | * get called on the bootup processor. But just in case. */ | ||
833 | if (!xen_initial_domain() || smp_processor_id()) | ||
834 | return 0; | ||
835 | |||
836 | if (reg == APIC_LVR) | ||
837 | return 0x10; | ||
838 | |||
839 | if (reg != APIC_ID) | ||
840 | return 0; | ||
841 | |||
842 | ret = HYPERVISOR_dom0_op(&op); | ||
843 | if (ret) | ||
844 | return 0; | ||
845 | |||
846 | return op.u.pcpu_info.apic_id << 24; | ||
815 | } | 847 | } |
816 | 848 | ||
817 | static void xen_apic_write(u32 reg, u32 val) | 849 | static void xen_apic_write(u32 reg, u32 val) |
@@ -849,6 +881,8 @@ static void set_xen_basic_apic_ops(void) | |||
849 | apic->icr_write = xen_apic_icr_write; | 881 | apic->icr_write = xen_apic_icr_write; |
850 | apic->wait_icr_idle = xen_apic_wait_icr_idle; | 882 | apic->wait_icr_idle = xen_apic_wait_icr_idle; |
851 | apic->safe_wait_icr_idle = xen_safe_apic_wait_icr_idle; | 883 | apic->safe_wait_icr_idle = xen_safe_apic_wait_icr_idle; |
884 | apic->set_apic_id = xen_set_apic_id; | ||
885 | apic->get_apic_id = xen_get_apic_id; | ||
852 | } | 886 | } |
853 | 887 | ||
854 | #endif | 888 | #endif |
@@ -1365,8 +1399,10 @@ asmlinkage void __init xen_start_kernel(void) | |||
1365 | /* Make sure ACS will be enabled */ | 1399 | /* Make sure ACS will be enabled */ |
1366 | pci_request_acs(); | 1400 | pci_request_acs(); |
1367 | } | 1401 | } |
1368 | 1402 | #ifdef CONFIG_PCI | |
1369 | 1403 | /* PCI BIOS service won't work from a PV guest. */ | |
1404 | pci_probe &= ~PCI_PROBE_BIOS; | ||
1405 | #endif | ||
1370 | xen_raw_console_write("about to get started...\n"); | 1406 | xen_raw_console_write("about to get started...\n"); |
1371 | 1407 | ||
1372 | xen_setup_runstate_info(0); | 1408 | xen_setup_runstate_info(0); |
diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c index b8e279479a6b..69f5857660ac 100644 --- a/arch/x86/xen/mmu.c +++ b/arch/x86/xen/mmu.c | |||
@@ -353,8 +353,13 @@ static pteval_t pte_mfn_to_pfn(pteval_t val) | |||
353 | { | 353 | { |
354 | if (val & _PAGE_PRESENT) { | 354 | if (val & _PAGE_PRESENT) { |
355 | unsigned long mfn = (val & PTE_PFN_MASK) >> PAGE_SHIFT; | 355 | unsigned long mfn = (val & PTE_PFN_MASK) >> PAGE_SHIFT; |
356 | unsigned long pfn = mfn_to_pfn(mfn); | ||
357 | |||
356 | pteval_t flags = val & PTE_FLAGS_MASK; | 358 | pteval_t flags = val & PTE_FLAGS_MASK; |
357 | val = ((pteval_t)mfn_to_pfn(mfn) << PAGE_SHIFT) | flags; | 359 | if (unlikely(pfn == ~0)) |
360 | val = flags & ~_PAGE_PRESENT; | ||
361 | else | ||
362 | val = ((pteval_t)pfn << PAGE_SHIFT) | flags; | ||
358 | } | 363 | } |
359 | 364 | ||
360 | return val; | 365 | return val; |
diff --git a/drivers/acpi/power.c b/drivers/acpi/power.c index 7049a7d27c4f..330bb4d75852 100644 --- a/drivers/acpi/power.c +++ b/drivers/acpi/power.c | |||
@@ -631,7 +631,7 @@ int acpi_power_get_inferred_state(struct acpi_device *device, int *state) | |||
631 | * We know a device's inferred power state when all the resources | 631 | * We know a device's inferred power state when all the resources |
632 | * required for a given D-state are 'on'. | 632 | * required for a given D-state are 'on'. |
633 | */ | 633 | */ |
634 | for (i = ACPI_STATE_D0; i < ACPI_STATE_D3; i++) { | 634 | for (i = ACPI_STATE_D0; i < ACPI_STATE_D3_HOT; i++) { |
635 | list = &device->power.states[i].resources; | 635 | list = &device->power.states[i].resources; |
636 | if (list->count < 1) | 636 | if (list->count < 1) |
637 | continue; | 637 | continue; |
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index 767e2dcb9616..7417267e88fa 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c | |||
@@ -869,7 +869,7 @@ static int acpi_bus_get_power_flags(struct acpi_device *device) | |||
869 | /* | 869 | /* |
870 | * Enumerate supported power management states | 870 | * Enumerate supported power management states |
871 | */ | 871 | */ |
872 | for (i = ACPI_STATE_D0; i <= ACPI_STATE_D3; i++) { | 872 | for (i = ACPI_STATE_D0; i <= ACPI_STATE_D3_HOT; i++) { |
873 | struct acpi_device_power_state *ps = &device->power.states[i]; | 873 | struct acpi_device_power_state *ps = &device->power.states[i]; |
874 | char object_name[5] = { '_', 'P', 'R', '0' + i, '\0' }; | 874 | char object_name[5] = { '_', 'P', 'R', '0' + i, '\0' }; |
875 | 875 | ||
@@ -884,21 +884,18 @@ static int acpi_bus_get_power_flags(struct acpi_device *device) | |||
884 | acpi_bus_add_power_resource(ps->resources.handles[j]); | 884 | acpi_bus_add_power_resource(ps->resources.handles[j]); |
885 | } | 885 | } |
886 | 886 | ||
887 | /* The exist of _PR3 indicates D3Cold support */ | ||
888 | if (i == ACPI_STATE_D3) { | ||
889 | status = acpi_get_handle(device->handle, object_name, &handle); | ||
890 | if (ACPI_SUCCESS(status)) | ||
891 | device->power.states[ACPI_STATE_D3_COLD].flags.valid = 1; | ||
892 | } | ||
893 | |||
894 | /* Evaluate "_PSx" to see if we can do explicit sets */ | 887 | /* Evaluate "_PSx" to see if we can do explicit sets */ |
895 | object_name[2] = 'S'; | 888 | object_name[2] = 'S'; |
896 | status = acpi_get_handle(device->handle, object_name, &handle); | 889 | status = acpi_get_handle(device->handle, object_name, &handle); |
897 | if (ACPI_SUCCESS(status)) | 890 | if (ACPI_SUCCESS(status)) |
898 | ps->flags.explicit_set = 1; | 891 | ps->flags.explicit_set = 1; |
899 | 892 | ||
900 | /* State is valid if we have some power control */ | 893 | /* |
901 | if (ps->resources.count || ps->flags.explicit_set) | 894 | * State is valid if there are means to put the device into it. |
895 | * D3hot is only valid if _PR3 present. | ||
896 | */ | ||
897 | if (ps->resources.count || | ||
898 | (ps->flags.explicit_set && i < ACPI_STATE_D3_HOT)) | ||
902 | ps->flags.valid = 1; | 899 | ps->flags.valid = 1; |
903 | 900 | ||
904 | ps->power = -1; /* Unknown - driver assigned */ | 901 | ps->power = -1; /* Unknown - driver assigned */ |
diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c index 7a3f535e481c..bb80853ff27a 100644 --- a/drivers/base/regmap/regmap.c +++ b/drivers/base/regmap/regmap.c | |||
@@ -775,9 +775,11 @@ int regmap_bulk_read(struct regmap *map, unsigned int reg, void *val, | |||
775 | map->format.parse_val(val + i); | 775 | map->format.parse_val(val + i); |
776 | } else { | 776 | } else { |
777 | for (i = 0; i < val_count; i++) { | 777 | for (i = 0; i < val_count; i++) { |
778 | ret = regmap_read(map, reg + i, val + (i * val_bytes)); | 778 | unsigned int ival; |
779 | ret = regmap_read(map, reg + i, &ival); | ||
779 | if (ret != 0) | 780 | if (ret != 0) |
780 | return ret; | 781 | return ret; |
782 | memcpy(val + (i * val_bytes), &ival, val_bytes); | ||
781 | } | 783 | } |
782 | } | 784 | } |
783 | 785 | ||
diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c index abfaacaaf346..946166e13953 100644 --- a/drivers/block/drbd/drbd_nl.c +++ b/drivers/block/drbd/drbd_nl.c | |||
@@ -2297,7 +2297,7 @@ static void drbd_connector_callback(struct cn_msg *req, struct netlink_skb_parms | |||
2297 | return; | 2297 | return; |
2298 | } | 2298 | } |
2299 | 2299 | ||
2300 | if (!cap_raised(current_cap(), CAP_SYS_ADMIN)) { | 2300 | if (!capable(CAP_SYS_ADMIN)) { |
2301 | retcode = ERR_PERM; | 2301 | retcode = ERR_PERM; |
2302 | goto fail; | 2302 | goto fail; |
2303 | } | 2303 | } |
diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c index 1adc2ec1e383..4461540653a8 100644 --- a/drivers/gpio/gpio-omap.c +++ b/drivers/gpio/gpio-omap.c | |||
@@ -965,18 +965,15 @@ static void omap_gpio_mod_init(struct gpio_bank *bank) | |||
965 | } | 965 | } |
966 | 966 | ||
967 | _gpio_rmw(base, bank->regs->irqenable, l, bank->regs->irqenable_inv); | 967 | _gpio_rmw(base, bank->regs->irqenable, l, bank->regs->irqenable_inv); |
968 | _gpio_rmw(base, bank->regs->irqstatus, l, | 968 | _gpio_rmw(base, bank->regs->irqstatus, l, !bank->regs->irqenable_inv); |
969 | bank->regs->irqenable_inv == false); | ||
970 | _gpio_rmw(base, bank->regs->irqenable, l, bank->regs->debounce_en != 0); | ||
971 | _gpio_rmw(base, bank->regs->irqenable, l, bank->regs->ctrl != 0); | ||
972 | if (bank->regs->debounce_en) | 969 | if (bank->regs->debounce_en) |
973 | _gpio_rmw(base, bank->regs->debounce_en, 0, 1); | 970 | __raw_writel(0, base + bank->regs->debounce_en); |
974 | 971 | ||
975 | /* Save OE default value (0xffffffff) in the context */ | 972 | /* Save OE default value (0xffffffff) in the context */ |
976 | bank->context.oe = __raw_readl(bank->base + bank->regs->direction); | 973 | bank->context.oe = __raw_readl(bank->base + bank->regs->direction); |
977 | /* Initialize interface clk ungated, module enabled */ | 974 | /* Initialize interface clk ungated, module enabled */ |
978 | if (bank->regs->ctrl) | 975 | if (bank->regs->ctrl) |
979 | _gpio_rmw(base, bank->regs->ctrl, 0, 1); | 976 | __raw_writel(0, base + bank->regs->ctrl); |
980 | } | 977 | } |
981 | 978 | ||
982 | static __devinit void | 979 | static __devinit void |
diff --git a/drivers/gpio/gpio-pch.c b/drivers/gpio/gpio-pch.c index e8729cc2ba2b..2cd958e0b822 100644 --- a/drivers/gpio/gpio-pch.c +++ b/drivers/gpio/gpio-pch.c | |||
@@ -230,16 +230,12 @@ static void pch_gpio_setup(struct pch_gpio *chip) | |||
230 | 230 | ||
231 | static int pch_irq_type(struct irq_data *d, unsigned int type) | 231 | static int pch_irq_type(struct irq_data *d, unsigned int type) |
232 | { | 232 | { |
233 | u32 im; | ||
234 | u32 __iomem *im_reg; | ||
235 | u32 ien; | ||
236 | u32 im_pos; | ||
237 | int ch; | ||
238 | unsigned long flags; | ||
239 | u32 val; | ||
240 | int irq = d->irq; | ||
241 | struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); | 233 | struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); |
242 | struct pch_gpio *chip = gc->private; | 234 | struct pch_gpio *chip = gc->private; |
235 | u32 im, im_pos, val; | ||
236 | u32 __iomem *im_reg; | ||
237 | unsigned long flags; | ||
238 | int ch, irq = d->irq; | ||
243 | 239 | ||
244 | ch = irq - chip->irq_base; | 240 | ch = irq - chip->irq_base; |
245 | if (irq <= chip->irq_base + 7) { | 241 | if (irq <= chip->irq_base + 7) { |
@@ -270,30 +266,22 @@ static int pch_irq_type(struct irq_data *d, unsigned int type) | |||
270 | case IRQ_TYPE_LEVEL_LOW: | 266 | case IRQ_TYPE_LEVEL_LOW: |
271 | val = PCH_LEVEL_L; | 267 | val = PCH_LEVEL_L; |
272 | break; | 268 | break; |
273 | case IRQ_TYPE_PROBE: | ||
274 | goto end; | ||
275 | default: | 269 | default: |
276 | dev_warn(chip->dev, "%s: unknown type(%dd)", | 270 | goto unlock; |
277 | __func__, type); | ||
278 | goto end; | ||
279 | } | 271 | } |
280 | 272 | ||
281 | /* Set interrupt mode */ | 273 | /* Set interrupt mode */ |
282 | im = ioread32(im_reg) & ~(PCH_IM_MASK << (im_pos * 4)); | 274 | im = ioread32(im_reg) & ~(PCH_IM_MASK << (im_pos * 4)); |
283 | iowrite32(im | (val << (im_pos * 4)), im_reg); | 275 | iowrite32(im | (val << (im_pos * 4)), im_reg); |
284 | 276 | ||
285 | /* iclr */ | 277 | /* And the handler */ |
286 | iowrite32(BIT(ch), &chip->reg->iclr); | 278 | if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH)) |
279 | __irq_set_handler_locked(d->irq, handle_level_irq); | ||
280 | else if (type & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING)) | ||
281 | __irq_set_handler_locked(d->irq, handle_edge_irq); | ||
287 | 282 | ||
288 | /* IMASKCLR */ | 283 | unlock: |
289 | iowrite32(BIT(ch), &chip->reg->imaskclr); | ||
290 | |||
291 | /* Enable interrupt */ | ||
292 | ien = ioread32(&chip->reg->ien); | ||
293 | iowrite32(ien | BIT(ch), &chip->reg->ien); | ||
294 | end: | ||
295 | spin_unlock_irqrestore(&chip->spinlock, flags); | 284 | spin_unlock_irqrestore(&chip->spinlock, flags); |
296 | |||
297 | return 0; | 285 | return 0; |
298 | } | 286 | } |
299 | 287 | ||
@@ -313,18 +301,24 @@ static void pch_irq_mask(struct irq_data *d) | |||
313 | iowrite32(1 << (d->irq - chip->irq_base), &chip->reg->imask); | 301 | iowrite32(1 << (d->irq - chip->irq_base), &chip->reg->imask); |
314 | } | 302 | } |
315 | 303 | ||
304 | static void pch_irq_ack(struct irq_data *d) | ||
305 | { | ||
306 | struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); | ||
307 | struct pch_gpio *chip = gc->private; | ||
308 | |||
309 | iowrite32(1 << (d->irq - chip->irq_base), &chip->reg->iclr); | ||
310 | } | ||
311 | |||
316 | static irqreturn_t pch_gpio_handler(int irq, void *dev_id) | 312 | static irqreturn_t pch_gpio_handler(int irq, void *dev_id) |
317 | { | 313 | { |
318 | struct pch_gpio *chip = dev_id; | 314 | struct pch_gpio *chip = dev_id; |
319 | u32 reg_val = ioread32(&chip->reg->istatus); | 315 | u32 reg_val = ioread32(&chip->reg->istatus); |
320 | int i; | 316 | int i, ret = IRQ_NONE; |
321 | int ret = IRQ_NONE; | ||
322 | 317 | ||
323 | for (i = 0; i < gpio_pins[chip->ioh]; i++) { | 318 | for (i = 0; i < gpio_pins[chip->ioh]; i++) { |
324 | if (reg_val & BIT(i)) { | 319 | if (reg_val & BIT(i)) { |
325 | dev_dbg(chip->dev, "%s:[%d]:irq=%d status=0x%x\n", | 320 | dev_dbg(chip->dev, "%s:[%d]:irq=%d status=0x%x\n", |
326 | __func__, i, irq, reg_val); | 321 | __func__, i, irq, reg_val); |
327 | iowrite32(BIT(i), &chip->reg->iclr); | ||
328 | generic_handle_irq(chip->irq_base + i); | 322 | generic_handle_irq(chip->irq_base + i); |
329 | ret = IRQ_HANDLED; | 323 | ret = IRQ_HANDLED; |
330 | } | 324 | } |
@@ -343,6 +337,7 @@ static __devinit void pch_gpio_alloc_generic_chip(struct pch_gpio *chip, | |||
343 | gc->private = chip; | 337 | gc->private = chip; |
344 | ct = gc->chip_types; | 338 | ct = gc->chip_types; |
345 | 339 | ||
340 | ct->chip.irq_ack = pch_irq_ack; | ||
346 | ct->chip.irq_mask = pch_irq_mask; | 341 | ct->chip.irq_mask = pch_irq_mask; |
347 | ct->chip.irq_unmask = pch_irq_unmask; | 342 | ct->chip.irq_unmask = pch_irq_unmask; |
348 | ct->chip.irq_set_type = pch_irq_type; | 343 | ct->chip.irq_set_type = pch_irq_type; |
@@ -357,6 +352,7 @@ static int __devinit pch_gpio_probe(struct pci_dev *pdev, | |||
357 | s32 ret; | 352 | s32 ret; |
358 | struct pch_gpio *chip; | 353 | struct pch_gpio *chip; |
359 | int irq_base; | 354 | int irq_base; |
355 | u32 msk; | ||
360 | 356 | ||
361 | chip = kzalloc(sizeof(*chip), GFP_KERNEL); | 357 | chip = kzalloc(sizeof(*chip), GFP_KERNEL); |
362 | if (chip == NULL) | 358 | if (chip == NULL) |
@@ -408,8 +404,13 @@ static int __devinit pch_gpio_probe(struct pci_dev *pdev, | |||
408 | } | 404 | } |
409 | chip->irq_base = irq_base; | 405 | chip->irq_base = irq_base; |
410 | 406 | ||
407 | /* Mask all interrupts, but enable them */ | ||
408 | msk = (1 << gpio_pins[chip->ioh]) - 1; | ||
409 | iowrite32(msk, &chip->reg->imask); | ||
410 | iowrite32(msk, &chip->reg->ien); | ||
411 | |||
411 | ret = request_irq(pdev->irq, pch_gpio_handler, | 412 | ret = request_irq(pdev->irq, pch_gpio_handler, |
412 | IRQF_SHARED, KBUILD_MODNAME, chip); | 413 | IRQF_SHARED, KBUILD_MODNAME, chip); |
413 | if (ret != 0) { | 414 | if (ret != 0) { |
414 | dev_err(&pdev->dev, | 415 | dev_err(&pdev->dev, |
415 | "%s request_irq failed\n", __func__); | 416 | "%s request_irq failed\n", __func__); |
@@ -418,8 +419,6 @@ static int __devinit pch_gpio_probe(struct pci_dev *pdev, | |||
418 | 419 | ||
419 | pch_gpio_alloc_generic_chip(chip, irq_base, gpio_pins[chip->ioh]); | 420 | pch_gpio_alloc_generic_chip(chip, irq_base, gpio_pins[chip->ioh]); |
420 | 421 | ||
421 | /* Initialize interrupt ien register */ | ||
422 | iowrite32(0, &chip->reg->ien); | ||
423 | end: | 422 | end: |
424 | return 0; | 423 | return 0; |
425 | 424 | ||
diff --git a/drivers/gpio/gpio-samsung.c b/drivers/gpio/gpio-samsung.c index 19d6fc0229c3..e991d9171961 100644 --- a/drivers/gpio/gpio-samsung.c +++ b/drivers/gpio/gpio-samsung.c | |||
@@ -452,12 +452,14 @@ static struct samsung_gpio_cfg s3c24xx_gpiocfg_banka = { | |||
452 | }; | 452 | }; |
453 | #endif | 453 | #endif |
454 | 454 | ||
455 | #if defined(CONFIG_ARCH_EXYNOS4) || defined(CONFIG_ARCH_EXYNOS5) | ||
455 | static struct samsung_gpio_cfg exynos_gpio_cfg = { | 456 | static struct samsung_gpio_cfg exynos_gpio_cfg = { |
456 | .set_pull = exynos_gpio_setpull, | 457 | .set_pull = exynos_gpio_setpull, |
457 | .get_pull = exynos_gpio_getpull, | 458 | .get_pull = exynos_gpio_getpull, |
458 | .set_config = samsung_gpio_setcfg_4bit, | 459 | .set_config = samsung_gpio_setcfg_4bit, |
459 | .get_config = samsung_gpio_getcfg_4bit, | 460 | .get_config = samsung_gpio_getcfg_4bit, |
460 | }; | 461 | }; |
462 | #endif | ||
461 | 463 | ||
462 | #if defined(CONFIG_CPU_S5P6440) || defined(CONFIG_CPU_S5P6450) | 464 | #if defined(CONFIG_CPU_S5P6440) || defined(CONFIG_CPU_S5P6450) |
463 | static struct samsung_gpio_cfg s5p64x0_gpio_cfg_rbank = { | 465 | static struct samsung_gpio_cfg s5p64x0_gpio_cfg_rbank = { |
@@ -2123,8 +2125,8 @@ static struct samsung_gpio_chip s5pv210_gpios_4bit[] = { | |||
2123 | * uses the above macro and depends on the banks being listed in order here. | 2125 | * uses the above macro and depends on the banks being listed in order here. |
2124 | */ | 2126 | */ |
2125 | 2127 | ||
2126 | static struct samsung_gpio_chip exynos4_gpios_1[] = { | ||
2127 | #ifdef CONFIG_ARCH_EXYNOS4 | 2128 | #ifdef CONFIG_ARCH_EXYNOS4 |
2129 | static struct samsung_gpio_chip exynos4_gpios_1[] = { | ||
2128 | { | 2130 | { |
2129 | .chip = { | 2131 | .chip = { |
2130 | .base = EXYNOS4_GPA0(0), | 2132 | .base = EXYNOS4_GPA0(0), |
@@ -2222,11 +2224,11 @@ static struct samsung_gpio_chip exynos4_gpios_1[] = { | |||
2222 | .label = "GPF3", | 2224 | .label = "GPF3", |
2223 | }, | 2225 | }, |
2224 | }, | 2226 | }, |
2225 | #endif | ||
2226 | }; | 2227 | }; |
2228 | #endif | ||
2227 | 2229 | ||
2228 | static struct samsung_gpio_chip exynos4_gpios_2[] = { | ||
2229 | #ifdef CONFIG_ARCH_EXYNOS4 | 2230 | #ifdef CONFIG_ARCH_EXYNOS4 |
2231 | static struct samsung_gpio_chip exynos4_gpios_2[] = { | ||
2230 | { | 2232 | { |
2231 | .chip = { | 2233 | .chip = { |
2232 | .base = EXYNOS4_GPJ0(0), | 2234 | .base = EXYNOS4_GPJ0(0), |
@@ -2367,11 +2369,11 @@ static struct samsung_gpio_chip exynos4_gpios_2[] = { | |||
2367 | .to_irq = samsung_gpiolib_to_irq, | 2369 | .to_irq = samsung_gpiolib_to_irq, |
2368 | }, | 2370 | }, |
2369 | }, | 2371 | }, |
2370 | #endif | ||
2371 | }; | 2372 | }; |
2373 | #endif | ||
2372 | 2374 | ||
2373 | static struct samsung_gpio_chip exynos4_gpios_3[] = { | ||
2374 | #ifdef CONFIG_ARCH_EXYNOS4 | 2375 | #ifdef CONFIG_ARCH_EXYNOS4 |
2376 | static struct samsung_gpio_chip exynos4_gpios_3[] = { | ||
2375 | { | 2377 | { |
2376 | .chip = { | 2378 | .chip = { |
2377 | .base = EXYNOS4_GPZ(0), | 2379 | .base = EXYNOS4_GPZ(0), |
@@ -2379,8 +2381,8 @@ static struct samsung_gpio_chip exynos4_gpios_3[] = { | |||
2379 | .label = "GPZ", | 2381 | .label = "GPZ", |
2380 | }, | 2382 | }, |
2381 | }, | 2383 | }, |
2382 | #endif | ||
2383 | }; | 2384 | }; |
2385 | #endif | ||
2384 | 2386 | ||
2385 | #ifdef CONFIG_ARCH_EXYNOS5 | 2387 | #ifdef CONFIG_ARCH_EXYNOS5 |
2386 | static struct samsung_gpio_chip exynos5_gpios_1[] = { | 2388 | static struct samsung_gpio_chip exynos5_gpios_1[] = { |
@@ -2719,7 +2721,9 @@ static __init int samsung_gpiolib_init(void) | |||
2719 | { | 2721 | { |
2720 | struct samsung_gpio_chip *chip; | 2722 | struct samsung_gpio_chip *chip; |
2721 | int i, nr_chips; | 2723 | int i, nr_chips; |
2724 | #if defined(CONFIG_CPU_EXYNOS4210) || defined(CONFIG_SOC_EXYNOS5250) | ||
2722 | void __iomem *gpio_base1, *gpio_base2, *gpio_base3, *gpio_base4; | 2725 | void __iomem *gpio_base1, *gpio_base2, *gpio_base3, *gpio_base4; |
2726 | #endif | ||
2723 | int group = 0; | 2727 | int group = 0; |
2724 | 2728 | ||
2725 | samsung_gpiolib_set_cfg(samsung_gpio_cfgs, ARRAY_SIZE(samsung_gpio_cfgs)); | 2729 | samsung_gpiolib_set_cfg(samsung_gpio_cfgs, ARRAY_SIZE(samsung_gpio_cfgs)); |
@@ -2971,6 +2975,7 @@ static __init int samsung_gpiolib_init(void) | |||
2971 | 2975 | ||
2972 | return 0; | 2976 | return 0; |
2973 | 2977 | ||
2978 | #if defined(CONFIG_CPU_EXYNOS4210) || defined(CONFIG_SOC_EXYNOS5250) | ||
2974 | err_ioremap4: | 2979 | err_ioremap4: |
2975 | iounmap(gpio_base3); | 2980 | iounmap(gpio_base3); |
2976 | err_ioremap3: | 2981 | err_ioremap3: |
@@ -2979,6 +2984,7 @@ err_ioremap2: | |||
2979 | iounmap(gpio_base1); | 2984 | iounmap(gpio_base1); |
2980 | err_ioremap1: | 2985 | err_ioremap1: |
2981 | return -ENOMEM; | 2986 | return -ENOMEM; |
2987 | #endif | ||
2982 | } | 2988 | } |
2983 | core_initcall(samsung_gpiolib_init); | 2989 | core_initcall(samsung_gpiolib_init); |
2984 | 2990 | ||
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index b505b70dba05..e6162a1681f0 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c | |||
@@ -1224,6 +1224,9 @@ static int i915_emon_status(struct seq_file *m, void *unused) | |||
1224 | unsigned long temp, chipset, gfx; | 1224 | unsigned long temp, chipset, gfx; |
1225 | int ret; | 1225 | int ret; |
1226 | 1226 | ||
1227 | if (!IS_GEN5(dev)) | ||
1228 | return -ENODEV; | ||
1229 | |||
1227 | ret = mutex_lock_interruptible(&dev->struct_mutex); | 1230 | ret = mutex_lock_interruptible(&dev->struct_mutex); |
1228 | if (ret) | 1231 | if (ret) |
1229 | return ret; | 1232 | return ret; |
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index 785f67f963ef..ba60f3c8f911 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c | |||
@@ -1701,6 +1701,9 @@ void i915_update_gfx_val(struct drm_i915_private *dev_priv) | |||
1701 | unsigned long diffms; | 1701 | unsigned long diffms; |
1702 | u32 count; | 1702 | u32 count; |
1703 | 1703 | ||
1704 | if (dev_priv->info->gen != 5) | ||
1705 | return; | ||
1706 | |||
1704 | getrawmonotonic(&now); | 1707 | getrawmonotonic(&now); |
1705 | diff1 = timespec_sub(now, dev_priv->last_time2); | 1708 | diff1 = timespec_sub(now, dev_priv->last_time2); |
1706 | 1709 | ||
@@ -2121,12 +2124,14 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) | |||
2121 | setup_timer(&dev_priv->hangcheck_timer, i915_hangcheck_elapsed, | 2124 | setup_timer(&dev_priv->hangcheck_timer, i915_hangcheck_elapsed, |
2122 | (unsigned long) dev); | 2125 | (unsigned long) dev); |
2123 | 2126 | ||
2124 | spin_lock(&mchdev_lock); | 2127 | if (IS_GEN5(dev)) { |
2125 | i915_mch_dev = dev_priv; | 2128 | spin_lock(&mchdev_lock); |
2126 | dev_priv->mchdev_lock = &mchdev_lock; | 2129 | i915_mch_dev = dev_priv; |
2127 | spin_unlock(&mchdev_lock); | 2130 | dev_priv->mchdev_lock = &mchdev_lock; |
2131 | spin_unlock(&mchdev_lock); | ||
2128 | 2132 | ||
2129 | ips_ping_for_i915_load(); | 2133 | ips_ping_for_i915_load(); |
2134 | } | ||
2130 | 2135 | ||
2131 | return 0; | 2136 | return 0; |
2132 | 2137 | ||
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 5908cd563400..1b1cf3b3ff51 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -7072,9 +7072,6 @@ static void intel_decrease_pllclock(struct drm_crtc *crtc) | |||
7072 | struct drm_device *dev = crtc->dev; | 7072 | struct drm_device *dev = crtc->dev; |
7073 | drm_i915_private_t *dev_priv = dev->dev_private; | 7073 | drm_i915_private_t *dev_priv = dev->dev_private; |
7074 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | 7074 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); |
7075 | int pipe = intel_crtc->pipe; | ||
7076 | int dpll_reg = DPLL(pipe); | ||
7077 | int dpll = I915_READ(dpll_reg); | ||
7078 | 7075 | ||
7079 | if (HAS_PCH_SPLIT(dev)) | 7076 | if (HAS_PCH_SPLIT(dev)) |
7080 | return; | 7077 | return; |
@@ -7087,10 +7084,15 @@ static void intel_decrease_pllclock(struct drm_crtc *crtc) | |||
7087 | * the manual case. | 7084 | * the manual case. |
7088 | */ | 7085 | */ |
7089 | if (!HAS_PIPE_CXSR(dev) && intel_crtc->lowfreq_avail) { | 7086 | if (!HAS_PIPE_CXSR(dev) && intel_crtc->lowfreq_avail) { |
7087 | int pipe = intel_crtc->pipe; | ||
7088 | int dpll_reg = DPLL(pipe); | ||
7089 | u32 dpll; | ||
7090 | |||
7090 | DRM_DEBUG_DRIVER("downclocking LVDS\n"); | 7091 | DRM_DEBUG_DRIVER("downclocking LVDS\n"); |
7091 | 7092 | ||
7092 | assert_panel_unlocked(dev_priv, pipe); | 7093 | assert_panel_unlocked(dev_priv, pipe); |
7093 | 7094 | ||
7095 | dpll = I915_READ(dpll_reg); | ||
7094 | dpll |= DISPLAY_RATE_SELECT_FPA1; | 7096 | dpll |= DISPLAY_RATE_SELECT_FPA1; |
7095 | I915_WRITE(dpll_reg, dpll); | 7097 | I915_WRITE(dpll_reg, dpll); |
7096 | intel_wait_for_vblank(dev, pipe); | 7098 | intel_wait_for_vblank(dev, pipe); |
@@ -7098,7 +7100,6 @@ static void intel_decrease_pllclock(struct drm_crtc *crtc) | |||
7098 | if (!(dpll & DISPLAY_RATE_SELECT_FPA1)) | 7100 | if (!(dpll & DISPLAY_RATE_SELECT_FPA1)) |
7099 | DRM_DEBUG_DRIVER("failed to downclock LVDS!\n"); | 7101 | DRM_DEBUG_DRIVER("failed to downclock LVDS!\n"); |
7100 | } | 7102 | } |
7101 | |||
7102 | } | 7103 | } |
7103 | 7104 | ||
7104 | /** | 7105 | /** |
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c index cae3e5f17a49..2d7f47b56b6a 100644 --- a/drivers/gpu/drm/i915/intel_hdmi.c +++ b/drivers/gpu/drm/i915/intel_hdmi.c | |||
@@ -136,7 +136,7 @@ static void i9xx_write_infoframe(struct drm_encoder *encoder, | |||
136 | 136 | ||
137 | val &= ~VIDEO_DIP_SELECT_MASK; | 137 | val &= ~VIDEO_DIP_SELECT_MASK; |
138 | 138 | ||
139 | I915_WRITE(VIDEO_DIP_CTL, val | port | flags); | 139 | I915_WRITE(VIDEO_DIP_CTL, VIDEO_DIP_ENABLE | val | port | flags); |
140 | 140 | ||
141 | for (i = 0; i < len; i += 4) { | 141 | for (i = 0; i < len; i += 4) { |
142 | I915_WRITE(VIDEO_DIP_DATA, *data); | 142 | I915_WRITE(VIDEO_DIP_DATA, *data); |
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c index 30e2c82101de..9c71183629c2 100644 --- a/drivers/gpu/drm/i915/intel_lvds.c +++ b/drivers/gpu/drm/i915/intel_lvds.c | |||
@@ -750,7 +750,7 @@ static const struct dmi_system_id intel_no_lvds[] = { | |||
750 | .ident = "Hewlett-Packard t5745", | 750 | .ident = "Hewlett-Packard t5745", |
751 | .matches = { | 751 | .matches = { |
752 | DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), | 752 | DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), |
753 | DMI_MATCH(DMI_BOARD_NAME, "hp t5745"), | 753 | DMI_MATCH(DMI_PRODUCT_NAME, "hp t5745"), |
754 | }, | 754 | }, |
755 | }, | 755 | }, |
756 | { | 756 | { |
@@ -758,7 +758,7 @@ static const struct dmi_system_id intel_no_lvds[] = { | |||
758 | .ident = "Hewlett-Packard st5747", | 758 | .ident = "Hewlett-Packard st5747", |
759 | .matches = { | 759 | .matches = { |
760 | DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), | 760 | DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), |
761 | DMI_MATCH(DMI_BOARD_NAME, "hp st5747"), | 761 | DMI_MATCH(DMI_PRODUCT_NAME, "hp st5747"), |
762 | }, | 762 | }, |
763 | }, | 763 | }, |
764 | { | 764 | { |
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index 80fce51e2f43..62892a826ede 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c | |||
@@ -398,10 +398,8 @@ static int init_render_ring(struct intel_ring_buffer *ring) | |||
398 | return ret; | 398 | return ret; |
399 | } | 399 | } |
400 | 400 | ||
401 | if (INTEL_INFO(dev)->gen >= 6) { | ||
402 | I915_WRITE(INSTPM, | ||
403 | INSTPM_FORCE_ORDERING << 16 | INSTPM_FORCE_ORDERING); | ||
404 | 401 | ||
402 | if (IS_GEN6(dev)) { | ||
405 | /* From the Sandybridge PRM, volume 1 part 3, page 24: | 403 | /* From the Sandybridge PRM, volume 1 part 3, page 24: |
406 | * "If this bit is set, STCunit will have LRA as replacement | 404 | * "If this bit is set, STCunit will have LRA as replacement |
407 | * policy. [...] This bit must be reset. LRA replacement | 405 | * policy. [...] This bit must be reset. LRA replacement |
@@ -411,6 +409,11 @@ static int init_render_ring(struct intel_ring_buffer *ring) | |||
411 | CM0_STC_EVICT_DISABLE_LRA_SNB << CM0_MASK_SHIFT); | 409 | CM0_STC_EVICT_DISABLE_LRA_SNB << CM0_MASK_SHIFT); |
412 | } | 410 | } |
413 | 411 | ||
412 | if (INTEL_INFO(dev)->gen >= 6) { | ||
413 | I915_WRITE(INSTPM, | ||
414 | INSTPM_FORCE_ORDERING << 16 | INSTPM_FORCE_ORDERING); | ||
415 | } | ||
416 | |||
414 | return ret; | 417 | return ret; |
415 | } | 418 | } |
416 | 419 | ||
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index 232d77d07d8b..ae5e748f39bb 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c | |||
@@ -1220,8 +1220,14 @@ static bool intel_sdvo_get_capabilities(struct intel_sdvo *intel_sdvo, struct in | |||
1220 | 1220 | ||
1221 | static int intel_sdvo_supports_hotplug(struct intel_sdvo *intel_sdvo) | 1221 | static int intel_sdvo_supports_hotplug(struct intel_sdvo *intel_sdvo) |
1222 | { | 1222 | { |
1223 | struct drm_device *dev = intel_sdvo->base.base.dev; | ||
1223 | u8 response[2]; | 1224 | u8 response[2]; |
1224 | 1225 | ||
1226 | /* HW Erratum: SDVO Hotplug is broken on all i945G chips, there's noise | ||
1227 | * on the line. */ | ||
1228 | if (IS_I945G(dev) || IS_I945GM(dev)) | ||
1229 | return false; | ||
1230 | |||
1225 | return intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_HOT_PLUG_SUPPORT, | 1231 | return intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_HOT_PLUG_SUPPORT, |
1226 | &response, 2) && response[0]; | 1232 | &response, 2) && response[0]; |
1227 | } | 1233 | } |
diff --git a/drivers/gpu/drm/nouveau/nouveau_i2c.c b/drivers/gpu/drm/nouveau/nouveau_i2c.c index e2be95af2e52..77e564667b5c 100644 --- a/drivers/gpu/drm/nouveau/nouveau_i2c.c +++ b/drivers/gpu/drm/nouveau/nouveau_i2c.c | |||
@@ -29,10 +29,6 @@ | |||
29 | #include "nouveau_i2c.h" | 29 | #include "nouveau_i2c.h" |
30 | #include "nouveau_hw.h" | 30 | #include "nouveau_hw.h" |
31 | 31 | ||
32 | #define T_TIMEOUT 2200000 | ||
33 | #define T_RISEFALL 1000 | ||
34 | #define T_HOLD 5000 | ||
35 | |||
36 | static void | 32 | static void |
37 | i2c_drive_scl(void *data, int state) | 33 | i2c_drive_scl(void *data, int state) |
38 | { | 34 | { |
@@ -113,175 +109,6 @@ i2c_sense_sda(void *data) | |||
113 | return 0; | 109 | return 0; |
114 | } | 110 | } |
115 | 111 | ||
116 | static void | ||
117 | i2c_delay(struct nouveau_i2c_chan *port, u32 nsec) | ||
118 | { | ||
119 | udelay((nsec + 500) / 1000); | ||
120 | } | ||
121 | |||
122 | static bool | ||
123 | i2c_raise_scl(struct nouveau_i2c_chan *port) | ||
124 | { | ||
125 | u32 timeout = T_TIMEOUT / T_RISEFALL; | ||
126 | |||
127 | i2c_drive_scl(port, 1); | ||
128 | do { | ||
129 | i2c_delay(port, T_RISEFALL); | ||
130 | } while (!i2c_sense_scl(port) && --timeout); | ||
131 | |||
132 | return timeout != 0; | ||
133 | } | ||
134 | |||
135 | static int | ||
136 | i2c_start(struct nouveau_i2c_chan *port) | ||
137 | { | ||
138 | int ret = 0; | ||
139 | |||
140 | port->state = i2c_sense_scl(port); | ||
141 | port->state |= i2c_sense_sda(port) << 1; | ||
142 | if (port->state != 3) { | ||
143 | i2c_drive_scl(port, 0); | ||
144 | i2c_drive_sda(port, 1); | ||
145 | if (!i2c_raise_scl(port)) | ||
146 | ret = -EBUSY; | ||
147 | } | ||
148 | |||
149 | i2c_drive_sda(port, 0); | ||
150 | i2c_delay(port, T_HOLD); | ||
151 | i2c_drive_scl(port, 0); | ||
152 | i2c_delay(port, T_HOLD); | ||
153 | return ret; | ||
154 | } | ||
155 | |||
156 | static void | ||
157 | i2c_stop(struct nouveau_i2c_chan *port) | ||
158 | { | ||
159 | i2c_drive_scl(port, 0); | ||
160 | i2c_drive_sda(port, 0); | ||
161 | i2c_delay(port, T_RISEFALL); | ||
162 | |||
163 | i2c_drive_scl(port, 1); | ||
164 | i2c_delay(port, T_HOLD); | ||
165 | i2c_drive_sda(port, 1); | ||
166 | i2c_delay(port, T_HOLD); | ||
167 | } | ||
168 | |||
169 | static int | ||
170 | i2c_bitw(struct nouveau_i2c_chan *port, int sda) | ||
171 | { | ||
172 | i2c_drive_sda(port, sda); | ||
173 | i2c_delay(port, T_RISEFALL); | ||
174 | |||
175 | if (!i2c_raise_scl(port)) | ||
176 | return -ETIMEDOUT; | ||
177 | i2c_delay(port, T_HOLD); | ||
178 | |||
179 | i2c_drive_scl(port, 0); | ||
180 | i2c_delay(port, T_HOLD); | ||
181 | return 0; | ||
182 | } | ||
183 | |||
184 | static int | ||
185 | i2c_bitr(struct nouveau_i2c_chan *port) | ||
186 | { | ||
187 | int sda; | ||
188 | |||
189 | i2c_drive_sda(port, 1); | ||
190 | i2c_delay(port, T_RISEFALL); | ||
191 | |||
192 | if (!i2c_raise_scl(port)) | ||
193 | return -ETIMEDOUT; | ||
194 | i2c_delay(port, T_HOLD); | ||
195 | |||
196 | sda = i2c_sense_sda(port); | ||
197 | |||
198 | i2c_drive_scl(port, 0); | ||
199 | i2c_delay(port, T_HOLD); | ||
200 | return sda; | ||
201 | } | ||
202 | |||
203 | static int | ||
204 | i2c_get_byte(struct nouveau_i2c_chan *port, u8 *byte, bool last) | ||
205 | { | ||
206 | int i, bit; | ||
207 | |||
208 | *byte = 0; | ||
209 | for (i = 7; i >= 0; i--) { | ||
210 | bit = i2c_bitr(port); | ||
211 | if (bit < 0) | ||
212 | return bit; | ||
213 | *byte |= bit << i; | ||
214 | } | ||
215 | |||
216 | return i2c_bitw(port, last ? 1 : 0); | ||
217 | } | ||
218 | |||
219 | static int | ||
220 | i2c_put_byte(struct nouveau_i2c_chan *port, u8 byte) | ||
221 | { | ||
222 | int i, ret; | ||
223 | for (i = 7; i >= 0; i--) { | ||
224 | ret = i2c_bitw(port, !!(byte & (1 << i))); | ||
225 | if (ret < 0) | ||
226 | return ret; | ||
227 | } | ||
228 | |||
229 | ret = i2c_bitr(port); | ||
230 | if (ret == 1) /* nack */ | ||
231 | ret = -EIO; | ||
232 | return ret; | ||
233 | } | ||
234 | |||
235 | static int | ||
236 | i2c_addr(struct nouveau_i2c_chan *port, struct i2c_msg *msg) | ||
237 | { | ||
238 | u32 addr = msg->addr << 1; | ||
239 | if (msg->flags & I2C_M_RD) | ||
240 | addr |= 1; | ||
241 | return i2c_put_byte(port, addr); | ||
242 | } | ||
243 | |||
244 | static int | ||
245 | i2c_bit_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) | ||
246 | { | ||
247 | struct nouveau_i2c_chan *port = (struct nouveau_i2c_chan *)adap; | ||
248 | struct i2c_msg *msg = msgs; | ||
249 | int ret = 0, mcnt = num; | ||
250 | |||
251 | while (!ret && mcnt--) { | ||
252 | u8 remaining = msg->len; | ||
253 | u8 *ptr = msg->buf; | ||
254 | |||
255 | ret = i2c_start(port); | ||
256 | if (ret == 0) | ||
257 | ret = i2c_addr(port, msg); | ||
258 | |||
259 | if (msg->flags & I2C_M_RD) { | ||
260 | while (!ret && remaining--) | ||
261 | ret = i2c_get_byte(port, ptr++, !remaining); | ||
262 | } else { | ||
263 | while (!ret && remaining--) | ||
264 | ret = i2c_put_byte(port, *ptr++); | ||
265 | } | ||
266 | |||
267 | msg++; | ||
268 | } | ||
269 | |||
270 | i2c_stop(port); | ||
271 | return (ret < 0) ? ret : num; | ||
272 | } | ||
273 | |||
274 | static u32 | ||
275 | i2c_bit_func(struct i2c_adapter *adap) | ||
276 | { | ||
277 | return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL; | ||
278 | } | ||
279 | |||
280 | const struct i2c_algorithm nouveau_i2c_bit_algo = { | ||
281 | .master_xfer = i2c_bit_xfer, | ||
282 | .functionality = i2c_bit_func | ||
283 | }; | ||
284 | |||
285 | static const uint32_t nv50_i2c_port[] = { | 112 | static const uint32_t nv50_i2c_port[] = { |
286 | 0x00e138, 0x00e150, 0x00e168, 0x00e180, | 113 | 0x00e138, 0x00e150, 0x00e168, 0x00e180, |
287 | 0x00e254, 0x00e274, 0x00e764, 0x00e780, | 114 | 0x00e254, 0x00e274, 0x00e764, 0x00e780, |
@@ -384,12 +211,10 @@ nouveau_i2c_init(struct drm_device *dev) | |||
384 | case 0: /* NV04:NV50 */ | 211 | case 0: /* NV04:NV50 */ |
385 | port->drive = entry[0]; | 212 | port->drive = entry[0]; |
386 | port->sense = entry[1]; | 213 | port->sense = entry[1]; |
387 | port->adapter.algo = &nouveau_i2c_bit_algo; | ||
388 | break; | 214 | break; |
389 | case 4: /* NV4E */ | 215 | case 4: /* NV4E */ |
390 | port->drive = 0x600800 + entry[1]; | 216 | port->drive = 0x600800 + entry[1]; |
391 | port->sense = port->drive; | 217 | port->sense = port->drive; |
392 | port->adapter.algo = &nouveau_i2c_bit_algo; | ||
393 | break; | 218 | break; |
394 | case 5: /* NV50- */ | 219 | case 5: /* NV50- */ |
395 | port->drive = entry[0] & 0x0f; | 220 | port->drive = entry[0] & 0x0f; |
@@ -402,7 +227,6 @@ nouveau_i2c_init(struct drm_device *dev) | |||
402 | port->drive = 0x00d014 + (port->drive * 0x20); | 227 | port->drive = 0x00d014 + (port->drive * 0x20); |
403 | port->sense = port->drive; | 228 | port->sense = port->drive; |
404 | } | 229 | } |
405 | port->adapter.algo = &nouveau_i2c_bit_algo; | ||
406 | break; | 230 | break; |
407 | case 6: /* NV50- DP AUX */ | 231 | case 6: /* NV50- DP AUX */ |
408 | port->drive = entry[0]; | 232 | port->drive = entry[0]; |
@@ -413,7 +237,7 @@ nouveau_i2c_init(struct drm_device *dev) | |||
413 | break; | 237 | break; |
414 | } | 238 | } |
415 | 239 | ||
416 | if (!port->adapter.algo) { | 240 | if (!port->adapter.algo && !port->drive) { |
417 | NV_ERROR(dev, "I2C%d: type %d index %x/%x unknown\n", | 241 | NV_ERROR(dev, "I2C%d: type %d index %x/%x unknown\n", |
418 | i, port->type, port->drive, port->sense); | 242 | i, port->type, port->drive, port->sense); |
419 | kfree(port); | 243 | kfree(port); |
@@ -429,7 +253,26 @@ nouveau_i2c_init(struct drm_device *dev) | |||
429 | port->dcb = ROM32(entry[0]); | 253 | port->dcb = ROM32(entry[0]); |
430 | i2c_set_adapdata(&port->adapter, i2c); | 254 | i2c_set_adapdata(&port->adapter, i2c); |
431 | 255 | ||
432 | ret = i2c_add_adapter(&port->adapter); | 256 | if (port->adapter.algo != &nouveau_dp_i2c_algo) { |
257 | port->adapter.algo_data = &port->bit; | ||
258 | port->bit.udelay = 10; | ||
259 | port->bit.timeout = usecs_to_jiffies(2200); | ||
260 | port->bit.data = port; | ||
261 | port->bit.setsda = i2c_drive_sda; | ||
262 | port->bit.setscl = i2c_drive_scl; | ||
263 | port->bit.getsda = i2c_sense_sda; | ||
264 | port->bit.getscl = i2c_sense_scl; | ||
265 | |||
266 | i2c_drive_scl(port, 0); | ||
267 | i2c_drive_sda(port, 1); | ||
268 | i2c_drive_scl(port, 1); | ||
269 | |||
270 | ret = i2c_bit_add_bus(&port->adapter); | ||
271 | } else { | ||
272 | port->adapter.algo = &nouveau_dp_i2c_algo; | ||
273 | ret = i2c_add_adapter(&port->adapter); | ||
274 | } | ||
275 | |||
433 | if (ret) { | 276 | if (ret) { |
434 | NV_ERROR(dev, "I2C%d: failed register: %d\n", i, ret); | 277 | NV_ERROR(dev, "I2C%d: failed register: %d\n", i, ret); |
435 | kfree(port); | 278 | kfree(port); |
diff --git a/drivers/gpu/drm/nouveau/nouveau_i2c.h b/drivers/gpu/drm/nouveau/nouveau_i2c.h index 4d2e4e9031be..1d083893a4d7 100644 --- a/drivers/gpu/drm/nouveau/nouveau_i2c.h +++ b/drivers/gpu/drm/nouveau/nouveau_i2c.h | |||
@@ -34,6 +34,7 @@ | |||
34 | struct nouveau_i2c_chan { | 34 | struct nouveau_i2c_chan { |
35 | struct i2c_adapter adapter; | 35 | struct i2c_adapter adapter; |
36 | struct drm_device *dev; | 36 | struct drm_device *dev; |
37 | struct i2c_algo_bit_data bit; | ||
37 | struct list_head head; | 38 | struct list_head head; |
38 | u8 index; | 39 | u8 index; |
39 | u8 type; | 40 | u8 type; |
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index ea7df16e2f84..5992502a3448 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
@@ -241,8 +241,8 @@ int radeon_wb_init(struct radeon_device *rdev) | |||
241 | rdev->wb.use_event = true; | 241 | rdev->wb.use_event = true; |
242 | } | 242 | } |
243 | } | 243 | } |
244 | /* always use writeback/events on NI */ | 244 | /* always use writeback/events on NI, APUs */ |
245 | if (ASIC_IS_DCE5(rdev)) { | 245 | if (rdev->family >= CHIP_PALM) { |
246 | rdev->wb.enabled = true; | 246 | rdev->wb.enabled = true; |
247 | rdev->wb.use_event = true; | 247 | rdev->wb.use_event = true; |
248 | } | 248 | } |
diff --git a/drivers/leds/leds-netxbig.c b/drivers/leds/leds-netxbig.c index d8433f2d53bc..73973fdbd8be 100644 --- a/drivers/leds/leds-netxbig.c +++ b/drivers/leds/leds-netxbig.c | |||
@@ -112,7 +112,7 @@ err_free_addr: | |||
112 | return err; | 112 | return err; |
113 | } | 113 | } |
114 | 114 | ||
115 | static void __devexit gpio_ext_free(struct netxbig_gpio_ext *gpio_ext) | 115 | static void gpio_ext_free(struct netxbig_gpio_ext *gpio_ext) |
116 | { | 116 | { |
117 | int i; | 117 | int i; |
118 | 118 | ||
@@ -294,7 +294,7 @@ static ssize_t netxbig_led_sata_show(struct device *dev, | |||
294 | 294 | ||
295 | static DEVICE_ATTR(sata, 0644, netxbig_led_sata_show, netxbig_led_sata_store); | 295 | static DEVICE_ATTR(sata, 0644, netxbig_led_sata_show, netxbig_led_sata_store); |
296 | 296 | ||
297 | static void __devexit delete_netxbig_led(struct netxbig_led_data *led_dat) | 297 | static void delete_netxbig_led(struct netxbig_led_data *led_dat) |
298 | { | 298 | { |
299 | if (led_dat->mode_val[NETXBIG_LED_SATA] != NETXBIG_LED_INVALID_MODE) | 299 | if (led_dat->mode_val[NETXBIG_LED_SATA] != NETXBIG_LED_INVALID_MODE) |
300 | device_remove_file(led_dat->cdev.dev, &dev_attr_sata); | 300 | device_remove_file(led_dat->cdev.dev, &dev_attr_sata); |
diff --git a/drivers/leds/leds-ns2.c b/drivers/leds/leds-ns2.c index 2f0a14421a73..01cf89ec6944 100644 --- a/drivers/leds/leds-ns2.c +++ b/drivers/leds/leds-ns2.c | |||
@@ -255,7 +255,7 @@ err_free_cmd: | |||
255 | return ret; | 255 | return ret; |
256 | } | 256 | } |
257 | 257 | ||
258 | static void __devexit delete_ns2_led(struct ns2_led_data *led_dat) | 258 | static void delete_ns2_led(struct ns2_led_data *led_dat) |
259 | { | 259 | { |
260 | device_remove_file(led_dat->cdev.dev, &dev_attr_sata); | 260 | device_remove_file(led_dat->cdev.dev, &dev_attr_sata); |
261 | led_classdev_unregister(&led_dat->cdev); | 261 | led_classdev_unregister(&led_dat->cdev); |
diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c index 97e73e555d11..17e2b472e16d 100644 --- a/drivers/md/bitmap.c +++ b/drivers/md/bitmap.c | |||
@@ -1727,8 +1727,7 @@ int bitmap_create(struct mddev *mddev) | |||
1727 | bitmap->chunkshift = (ffz(~mddev->bitmap_info.chunksize) | 1727 | bitmap->chunkshift = (ffz(~mddev->bitmap_info.chunksize) |
1728 | - BITMAP_BLOCK_SHIFT); | 1728 | - BITMAP_BLOCK_SHIFT); |
1729 | 1729 | ||
1730 | /* now that chunksize and chunkshift are set, we can use these macros */ | 1730 | chunks = (blocks + (1 << bitmap->chunkshift) - 1) >> |
1731 | chunks = (blocks + bitmap->chunkshift - 1) >> | ||
1732 | bitmap->chunkshift; | 1731 | bitmap->chunkshift; |
1733 | pages = (chunks + PAGE_COUNTER_RATIO - 1) / PAGE_COUNTER_RATIO; | 1732 | pages = (chunks + PAGE_COUNTER_RATIO - 1) / PAGE_COUNTER_RATIO; |
1734 | 1733 | ||
diff --git a/drivers/md/bitmap.h b/drivers/md/bitmap.h index 55ca5aec84e4..b44b0aba2d47 100644 --- a/drivers/md/bitmap.h +++ b/drivers/md/bitmap.h | |||
@@ -101,9 +101,6 @@ typedef __u16 bitmap_counter_t; | |||
101 | 101 | ||
102 | #define BITMAP_BLOCK_SHIFT 9 | 102 | #define BITMAP_BLOCK_SHIFT 9 |
103 | 103 | ||
104 | /* how many blocks per chunk? (this is variable) */ | ||
105 | #define CHUNK_BLOCK_RATIO(bitmap) ((bitmap)->mddev->bitmap_info.chunksize >> BITMAP_BLOCK_SHIFT) | ||
106 | |||
107 | #endif | 104 | #endif |
108 | 105 | ||
109 | /* | 106 | /* |
diff --git a/drivers/md/dm-log-userspace-transfer.c b/drivers/md/dm-log-userspace-transfer.c index 1f23e048f077..08d9a207259a 100644 --- a/drivers/md/dm-log-userspace-transfer.c +++ b/drivers/md/dm-log-userspace-transfer.c | |||
@@ -134,7 +134,7 @@ static void cn_ulog_callback(struct cn_msg *msg, struct netlink_skb_parms *nsp) | |||
134 | { | 134 | { |
135 | struct dm_ulog_request *tfr = (struct dm_ulog_request *)(msg + 1); | 135 | struct dm_ulog_request *tfr = (struct dm_ulog_request *)(msg + 1); |
136 | 136 | ||
137 | if (!cap_raised(current_cap(), CAP_SYS_ADMIN)) | 137 | if (!capable(CAP_SYS_ADMIN)) |
138 | return; | 138 | return; |
139 | 139 | ||
140 | spin_lock(&receiving_list_lock); | 140 | spin_lock(&receiving_list_lock); |
diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c index 922a3385eead..754f38f8a692 100644 --- a/drivers/md/dm-mpath.c +++ b/drivers/md/dm-mpath.c | |||
@@ -718,8 +718,8 @@ static int parse_hw_handler(struct dm_arg_set *as, struct multipath *m) | |||
718 | return 0; | 718 | return 0; |
719 | 719 | ||
720 | m->hw_handler_name = kstrdup(dm_shift_arg(as), GFP_KERNEL); | 720 | m->hw_handler_name = kstrdup(dm_shift_arg(as), GFP_KERNEL); |
721 | request_module("scsi_dh_%s", m->hw_handler_name); | 721 | if (!try_then_request_module(scsi_dh_handler_exist(m->hw_handler_name), |
722 | if (scsi_dh_handler_exist(m->hw_handler_name) == 0) { | 722 | "scsi_dh_%s", m->hw_handler_name)) { |
723 | ti->error = "unknown hardware handler type"; | 723 | ti->error = "unknown hardware handler type"; |
724 | ret = -EINVAL; | 724 | ret = -EINVAL; |
725 | goto fail; | 725 | goto fail; |
diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c index 213ae32a0fc4..2fd87b544a93 100644 --- a/drivers/md/dm-thin.c +++ b/drivers/md/dm-thin.c | |||
@@ -279,8 +279,10 @@ static void __cell_release(struct cell *cell, struct bio_list *inmates) | |||
279 | 279 | ||
280 | hlist_del(&cell->list); | 280 | hlist_del(&cell->list); |
281 | 281 | ||
282 | bio_list_add(inmates, cell->holder); | 282 | if (inmates) { |
283 | bio_list_merge(inmates, &cell->bios); | 283 | bio_list_add(inmates, cell->holder); |
284 | bio_list_merge(inmates, &cell->bios); | ||
285 | } | ||
284 | 286 | ||
285 | mempool_free(cell, prison->cell_pool); | 287 | mempool_free(cell, prison->cell_pool); |
286 | } | 288 | } |
@@ -303,9 +305,10 @@ static void cell_release(struct cell *cell, struct bio_list *bios) | |||
303 | */ | 305 | */ |
304 | static void __cell_release_singleton(struct cell *cell, struct bio *bio) | 306 | static void __cell_release_singleton(struct cell *cell, struct bio *bio) |
305 | { | 307 | { |
306 | hlist_del(&cell->list); | ||
307 | BUG_ON(cell->holder != bio); | 308 | BUG_ON(cell->holder != bio); |
308 | BUG_ON(!bio_list_empty(&cell->bios)); | 309 | BUG_ON(!bio_list_empty(&cell->bios)); |
310 | |||
311 | __cell_release(cell, NULL); | ||
309 | } | 312 | } |
310 | 313 | ||
311 | static void cell_release_singleton(struct cell *cell, struct bio *bio) | 314 | static void cell_release_singleton(struct cell *cell, struct bio *bio) |
@@ -1177,6 +1180,7 @@ static void no_space(struct cell *cell) | |||
1177 | static void process_discard(struct thin_c *tc, struct bio *bio) | 1180 | static void process_discard(struct thin_c *tc, struct bio *bio) |
1178 | { | 1181 | { |
1179 | int r; | 1182 | int r; |
1183 | unsigned long flags; | ||
1180 | struct pool *pool = tc->pool; | 1184 | struct pool *pool = tc->pool; |
1181 | struct cell *cell, *cell2; | 1185 | struct cell *cell, *cell2; |
1182 | struct cell_key key, key2; | 1186 | struct cell_key key, key2; |
@@ -1218,7 +1222,9 @@ static void process_discard(struct thin_c *tc, struct bio *bio) | |||
1218 | m->bio = bio; | 1222 | m->bio = bio; |
1219 | 1223 | ||
1220 | if (!ds_add_work(&pool->all_io_ds, &m->list)) { | 1224 | if (!ds_add_work(&pool->all_io_ds, &m->list)) { |
1225 | spin_lock_irqsave(&pool->lock, flags); | ||
1221 | list_add(&m->list, &pool->prepared_discards); | 1226 | list_add(&m->list, &pool->prepared_discards); |
1227 | spin_unlock_irqrestore(&pool->lock, flags); | ||
1222 | wake_worker(pool); | 1228 | wake_worker(pool); |
1223 | } | 1229 | } |
1224 | } else { | 1230 | } else { |
@@ -2626,8 +2632,10 @@ static int thin_endio(struct dm_target *ti, | |||
2626 | if (h->all_io_entry) { | 2632 | if (h->all_io_entry) { |
2627 | INIT_LIST_HEAD(&work); | 2633 | INIT_LIST_HEAD(&work); |
2628 | ds_dec(h->all_io_entry, &work); | 2634 | ds_dec(h->all_io_entry, &work); |
2635 | spin_lock_irqsave(&pool->lock, flags); | ||
2629 | list_for_each_entry_safe(m, tmp, &work, list) | 2636 | list_for_each_entry_safe(m, tmp, &work, list) |
2630 | list_add(&m->list, &pool->prepared_discards); | 2637 | list_add(&m->list, &pool->prepared_discards); |
2638 | spin_unlock_irqrestore(&pool->lock, flags); | ||
2631 | } | 2639 | } |
2632 | 2640 | ||
2633 | mempool_free(h, pool->endio_hook_pool); | 2641 | mempool_free(h, pool->endio_hook_pool); |
@@ -2759,6 +2767,6 @@ static void dm_thin_exit(void) | |||
2759 | module_init(dm_thin_init); | 2767 | module_init(dm_thin_init); |
2760 | module_exit(dm_thin_exit); | 2768 | module_exit(dm_thin_exit); |
2761 | 2769 | ||
2762 | MODULE_DESCRIPTION(DM_NAME "device-mapper thin provisioning target"); | 2770 | MODULE_DESCRIPTION(DM_NAME " thin provisioning target"); |
2763 | MODULE_AUTHOR("Joe Thornber <dm-devel@redhat.com>"); | 2771 | MODULE_AUTHOR("Joe Thornber <dm-devel@redhat.com>"); |
2764 | MODULE_LICENSE("GPL"); | 2772 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c index 0f64d7182657..cb888d835a89 100644 --- a/drivers/media/dvb/dvb-core/dvb_frontend.c +++ b/drivers/media/dvb/dvb-core/dvb_frontend.c | |||
@@ -1921,6 +1921,10 @@ static int dtv_set_frontend(struct dvb_frontend *fe) | |||
1921 | } else { | 1921 | } else { |
1922 | /* default values */ | 1922 | /* default values */ |
1923 | switch (c->delivery_system) { | 1923 | switch (c->delivery_system) { |
1924 | case SYS_DVBS: | ||
1925 | case SYS_DVBS2: | ||
1926 | case SYS_ISDBS: | ||
1927 | case SYS_TURBO: | ||
1924 | case SYS_DVBC_ANNEX_A: | 1928 | case SYS_DVBC_ANNEX_A: |
1925 | case SYS_DVBC_ANNEX_C: | 1929 | case SYS_DVBC_ANNEX_C: |
1926 | fepriv->min_delay = HZ / 20; | 1930 | fepriv->min_delay = HZ / 20; |
diff --git a/drivers/media/rc/ene_ir.c b/drivers/media/rc/ene_ir.c index 860c112e0fd2..bef5296173c9 100644 --- a/drivers/media/rc/ene_ir.c +++ b/drivers/media/rc/ene_ir.c | |||
@@ -1018,22 +1018,6 @@ static int ene_probe(struct pnp_dev *pnp_dev, const struct pnp_device_id *id) | |||
1018 | 1018 | ||
1019 | spin_lock_init(&dev->hw_lock); | 1019 | spin_lock_init(&dev->hw_lock); |
1020 | 1020 | ||
1021 | /* claim the resources */ | ||
1022 | error = -EBUSY; | ||
1023 | dev->hw_io = pnp_port_start(pnp_dev, 0); | ||
1024 | if (!request_region(dev->hw_io, ENE_IO_SIZE, ENE_DRIVER_NAME)) { | ||
1025 | dev->hw_io = -1; | ||
1026 | dev->irq = -1; | ||
1027 | goto error; | ||
1028 | } | ||
1029 | |||
1030 | dev->irq = pnp_irq(pnp_dev, 0); | ||
1031 | if (request_irq(dev->irq, ene_isr, | ||
1032 | IRQF_SHARED, ENE_DRIVER_NAME, (void *)dev)) { | ||
1033 | dev->irq = -1; | ||
1034 | goto error; | ||
1035 | } | ||
1036 | |||
1037 | pnp_set_drvdata(pnp_dev, dev); | 1021 | pnp_set_drvdata(pnp_dev, dev); |
1038 | dev->pnp_dev = pnp_dev; | 1022 | dev->pnp_dev = pnp_dev; |
1039 | 1023 | ||
@@ -1086,6 +1070,22 @@ static int ene_probe(struct pnp_dev *pnp_dev, const struct pnp_device_id *id) | |||
1086 | device_set_wakeup_capable(&pnp_dev->dev, true); | 1070 | device_set_wakeup_capable(&pnp_dev->dev, true); |
1087 | device_set_wakeup_enable(&pnp_dev->dev, true); | 1071 | device_set_wakeup_enable(&pnp_dev->dev, true); |
1088 | 1072 | ||
1073 | /* claim the resources */ | ||
1074 | error = -EBUSY; | ||
1075 | dev->hw_io = pnp_port_start(pnp_dev, 0); | ||
1076 | if (!request_region(dev->hw_io, ENE_IO_SIZE, ENE_DRIVER_NAME)) { | ||
1077 | dev->hw_io = -1; | ||
1078 | dev->irq = -1; | ||
1079 | goto error; | ||
1080 | } | ||
1081 | |||
1082 | dev->irq = pnp_irq(pnp_dev, 0); | ||
1083 | if (request_irq(dev->irq, ene_isr, | ||
1084 | IRQF_SHARED, ENE_DRIVER_NAME, (void *)dev)) { | ||
1085 | dev->irq = -1; | ||
1086 | goto error; | ||
1087 | } | ||
1088 | |||
1089 | error = rc_register_device(rdev); | 1089 | error = rc_register_device(rdev); |
1090 | if (error < 0) | 1090 | if (error < 0) |
1091 | goto error; | 1091 | goto error; |
diff --git a/drivers/media/rc/fintek-cir.c b/drivers/media/rc/fintek-cir.c index 392d4be91f8f..4a3a238bcfbc 100644 --- a/drivers/media/rc/fintek-cir.c +++ b/drivers/media/rc/fintek-cir.c | |||
@@ -197,7 +197,7 @@ static int fintek_hw_detect(struct fintek_dev *fintek) | |||
197 | /* | 197 | /* |
198 | * Newer reviews of this chipset uses port 8 instead of 5 | 198 | * Newer reviews of this chipset uses port 8 instead of 5 |
199 | */ | 199 | */ |
200 | if ((chip != 0x0408) || (chip != 0x0804)) | 200 | if ((chip != 0x0408) && (chip != 0x0804)) |
201 | fintek->logical_dev_cir = LOGICAL_DEV_CIR_REV2; | 201 | fintek->logical_dev_cir = LOGICAL_DEV_CIR_REV2; |
202 | else | 202 | else |
203 | fintek->logical_dev_cir = LOGICAL_DEV_CIR_REV1; | 203 | fintek->logical_dev_cir = LOGICAL_DEV_CIR_REV1; |
@@ -514,16 +514,6 @@ static int fintek_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id | |||
514 | 514 | ||
515 | spin_lock_init(&fintek->fintek_lock); | 515 | spin_lock_init(&fintek->fintek_lock); |
516 | 516 | ||
517 | ret = -EBUSY; | ||
518 | /* now claim resources */ | ||
519 | if (!request_region(fintek->cir_addr, | ||
520 | fintek->cir_port_len, FINTEK_DRIVER_NAME)) | ||
521 | goto failure; | ||
522 | |||
523 | if (request_irq(fintek->cir_irq, fintek_cir_isr, IRQF_SHARED, | ||
524 | FINTEK_DRIVER_NAME, (void *)fintek)) | ||
525 | goto failure; | ||
526 | |||
527 | pnp_set_drvdata(pdev, fintek); | 517 | pnp_set_drvdata(pdev, fintek); |
528 | fintek->pdev = pdev; | 518 | fintek->pdev = pdev; |
529 | 519 | ||
@@ -558,6 +548,16 @@ static int fintek_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id | |||
558 | /* rx resolution is hardwired to 50us atm, 1, 25, 100 also possible */ | 548 | /* rx resolution is hardwired to 50us atm, 1, 25, 100 also possible */ |
559 | rdev->rx_resolution = US_TO_NS(CIR_SAMPLE_PERIOD); | 549 | rdev->rx_resolution = US_TO_NS(CIR_SAMPLE_PERIOD); |
560 | 550 | ||
551 | ret = -EBUSY; | ||
552 | /* now claim resources */ | ||
553 | if (!request_region(fintek->cir_addr, | ||
554 | fintek->cir_port_len, FINTEK_DRIVER_NAME)) | ||
555 | goto failure; | ||
556 | |||
557 | if (request_irq(fintek->cir_irq, fintek_cir_isr, IRQF_SHARED, | ||
558 | FINTEK_DRIVER_NAME, (void *)fintek)) | ||
559 | goto failure; | ||
560 | |||
561 | ret = rc_register_device(rdev); | 561 | ret = rc_register_device(rdev); |
562 | if (ret) | 562 | if (ret) |
563 | goto failure; | 563 | goto failure; |
diff --git a/drivers/media/rc/ite-cir.c b/drivers/media/rc/ite-cir.c index 682009d76cdf..0e49c99abf68 100644 --- a/drivers/media/rc/ite-cir.c +++ b/drivers/media/rc/ite-cir.c | |||
@@ -1515,16 +1515,6 @@ static int ite_probe(struct pnp_dev *pdev, const struct pnp_device_id | |||
1515 | /* initialize raw event */ | 1515 | /* initialize raw event */ |
1516 | init_ir_raw_event(&itdev->rawir); | 1516 | init_ir_raw_event(&itdev->rawir); |
1517 | 1517 | ||
1518 | ret = -EBUSY; | ||
1519 | /* now claim resources */ | ||
1520 | if (!request_region(itdev->cir_addr, | ||
1521 | dev_desc->io_region_size, ITE_DRIVER_NAME)) | ||
1522 | goto failure; | ||
1523 | |||
1524 | if (request_irq(itdev->cir_irq, ite_cir_isr, IRQF_SHARED, | ||
1525 | ITE_DRIVER_NAME, (void *)itdev)) | ||
1526 | goto failure; | ||
1527 | |||
1528 | /* set driver data into the pnp device */ | 1518 | /* set driver data into the pnp device */ |
1529 | pnp_set_drvdata(pdev, itdev); | 1519 | pnp_set_drvdata(pdev, itdev); |
1530 | itdev->pdev = pdev; | 1520 | itdev->pdev = pdev; |
@@ -1600,6 +1590,16 @@ static int ite_probe(struct pnp_dev *pdev, const struct pnp_device_id | |||
1600 | rdev->driver_name = ITE_DRIVER_NAME; | 1590 | rdev->driver_name = ITE_DRIVER_NAME; |
1601 | rdev->map_name = RC_MAP_RC6_MCE; | 1591 | rdev->map_name = RC_MAP_RC6_MCE; |
1602 | 1592 | ||
1593 | ret = -EBUSY; | ||
1594 | /* now claim resources */ | ||
1595 | if (!request_region(itdev->cir_addr, | ||
1596 | dev_desc->io_region_size, ITE_DRIVER_NAME)) | ||
1597 | goto failure; | ||
1598 | |||
1599 | if (request_irq(itdev->cir_irq, ite_cir_isr, IRQF_SHARED, | ||
1600 | ITE_DRIVER_NAME, (void *)itdev)) | ||
1601 | goto failure; | ||
1602 | |||
1603 | ret = rc_register_device(rdev); | 1603 | ret = rc_register_device(rdev); |
1604 | if (ret) | 1604 | if (ret) |
1605 | goto failure; | 1605 | goto failure; |
diff --git a/drivers/media/rc/nuvoton-cir.c b/drivers/media/rc/nuvoton-cir.c index 144f3f55d765..8b2c071ac0ab 100644 --- a/drivers/media/rc/nuvoton-cir.c +++ b/drivers/media/rc/nuvoton-cir.c | |||
@@ -1021,24 +1021,6 @@ static int nvt_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id) | |||
1021 | spin_lock_init(&nvt->nvt_lock); | 1021 | spin_lock_init(&nvt->nvt_lock); |
1022 | spin_lock_init(&nvt->tx.lock); | 1022 | spin_lock_init(&nvt->tx.lock); |
1023 | 1023 | ||
1024 | ret = -EBUSY; | ||
1025 | /* now claim resources */ | ||
1026 | if (!request_region(nvt->cir_addr, | ||
1027 | CIR_IOREG_LENGTH, NVT_DRIVER_NAME)) | ||
1028 | goto failure; | ||
1029 | |||
1030 | if (request_irq(nvt->cir_irq, nvt_cir_isr, IRQF_SHARED, | ||
1031 | NVT_DRIVER_NAME, (void *)nvt)) | ||
1032 | goto failure; | ||
1033 | |||
1034 | if (!request_region(nvt->cir_wake_addr, | ||
1035 | CIR_IOREG_LENGTH, NVT_DRIVER_NAME)) | ||
1036 | goto failure; | ||
1037 | |||
1038 | if (request_irq(nvt->cir_wake_irq, nvt_cir_wake_isr, IRQF_SHARED, | ||
1039 | NVT_DRIVER_NAME, (void *)nvt)) | ||
1040 | goto failure; | ||
1041 | |||
1042 | pnp_set_drvdata(pdev, nvt); | 1024 | pnp_set_drvdata(pdev, nvt); |
1043 | nvt->pdev = pdev; | 1025 | nvt->pdev = pdev; |
1044 | 1026 | ||
@@ -1085,6 +1067,24 @@ static int nvt_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id) | |||
1085 | rdev->tx_resolution = XYZ; | 1067 | rdev->tx_resolution = XYZ; |
1086 | #endif | 1068 | #endif |
1087 | 1069 | ||
1070 | ret = -EBUSY; | ||
1071 | /* now claim resources */ | ||
1072 | if (!request_region(nvt->cir_addr, | ||
1073 | CIR_IOREG_LENGTH, NVT_DRIVER_NAME)) | ||
1074 | goto failure; | ||
1075 | |||
1076 | if (request_irq(nvt->cir_irq, nvt_cir_isr, IRQF_SHARED, | ||
1077 | NVT_DRIVER_NAME, (void *)nvt)) | ||
1078 | goto failure; | ||
1079 | |||
1080 | if (!request_region(nvt->cir_wake_addr, | ||
1081 | CIR_IOREG_LENGTH, NVT_DRIVER_NAME)) | ||
1082 | goto failure; | ||
1083 | |||
1084 | if (request_irq(nvt->cir_wake_irq, nvt_cir_wake_isr, IRQF_SHARED, | ||
1085 | NVT_DRIVER_NAME, (void *)nvt)) | ||
1086 | goto failure; | ||
1087 | |||
1088 | ret = rc_register_device(rdev); | 1088 | ret = rc_register_device(rdev); |
1089 | if (ret) | 1089 | if (ret) |
1090 | goto failure; | 1090 | goto failure; |
diff --git a/drivers/media/rc/winbond-cir.c b/drivers/media/rc/winbond-cir.c index af526586fa26..342c2c8c1ddf 100644 --- a/drivers/media/rc/winbond-cir.c +++ b/drivers/media/rc/winbond-cir.c | |||
@@ -991,39 +991,10 @@ wbcir_probe(struct pnp_dev *device, const struct pnp_device_id *dev_id) | |||
991 | "(w: 0x%lX, e: 0x%lX, s: 0x%lX, i: %u)\n", | 991 | "(w: 0x%lX, e: 0x%lX, s: 0x%lX, i: %u)\n", |
992 | data->wbase, data->ebase, data->sbase, data->irq); | 992 | data->wbase, data->ebase, data->sbase, data->irq); |
993 | 993 | ||
994 | if (!request_region(data->wbase, WAKEUP_IOMEM_LEN, DRVNAME)) { | ||
995 | dev_err(dev, "Region 0x%lx-0x%lx already in use!\n", | ||
996 | data->wbase, data->wbase + WAKEUP_IOMEM_LEN - 1); | ||
997 | err = -EBUSY; | ||
998 | goto exit_free_data; | ||
999 | } | ||
1000 | |||
1001 | if (!request_region(data->ebase, EHFUNC_IOMEM_LEN, DRVNAME)) { | ||
1002 | dev_err(dev, "Region 0x%lx-0x%lx already in use!\n", | ||
1003 | data->ebase, data->ebase + EHFUNC_IOMEM_LEN - 1); | ||
1004 | err = -EBUSY; | ||
1005 | goto exit_release_wbase; | ||
1006 | } | ||
1007 | |||
1008 | if (!request_region(data->sbase, SP_IOMEM_LEN, DRVNAME)) { | ||
1009 | dev_err(dev, "Region 0x%lx-0x%lx already in use!\n", | ||
1010 | data->sbase, data->sbase + SP_IOMEM_LEN - 1); | ||
1011 | err = -EBUSY; | ||
1012 | goto exit_release_ebase; | ||
1013 | } | ||
1014 | |||
1015 | err = request_irq(data->irq, wbcir_irq_handler, | ||
1016 | IRQF_DISABLED, DRVNAME, device); | ||
1017 | if (err) { | ||
1018 | dev_err(dev, "Failed to claim IRQ %u\n", data->irq); | ||
1019 | err = -EBUSY; | ||
1020 | goto exit_release_sbase; | ||
1021 | } | ||
1022 | |||
1023 | led_trigger_register_simple("cir-tx", &data->txtrigger); | 994 | led_trigger_register_simple("cir-tx", &data->txtrigger); |
1024 | if (!data->txtrigger) { | 995 | if (!data->txtrigger) { |
1025 | err = -ENOMEM; | 996 | err = -ENOMEM; |
1026 | goto exit_free_irq; | 997 | goto exit_free_data; |
1027 | } | 998 | } |
1028 | 999 | ||
1029 | led_trigger_register_simple("cir-rx", &data->rxtrigger); | 1000 | led_trigger_register_simple("cir-rx", &data->rxtrigger); |
@@ -1062,9 +1033,38 @@ wbcir_probe(struct pnp_dev *device, const struct pnp_device_id *dev_id) | |||
1062 | data->dev->priv = data; | 1033 | data->dev->priv = data; |
1063 | data->dev->dev.parent = &device->dev; | 1034 | data->dev->dev.parent = &device->dev; |
1064 | 1035 | ||
1036 | if (!request_region(data->wbase, WAKEUP_IOMEM_LEN, DRVNAME)) { | ||
1037 | dev_err(dev, "Region 0x%lx-0x%lx already in use!\n", | ||
1038 | data->wbase, data->wbase + WAKEUP_IOMEM_LEN - 1); | ||
1039 | err = -EBUSY; | ||
1040 | goto exit_free_rc; | ||
1041 | } | ||
1042 | |||
1043 | if (!request_region(data->ebase, EHFUNC_IOMEM_LEN, DRVNAME)) { | ||
1044 | dev_err(dev, "Region 0x%lx-0x%lx already in use!\n", | ||
1045 | data->ebase, data->ebase + EHFUNC_IOMEM_LEN - 1); | ||
1046 | err = -EBUSY; | ||
1047 | goto exit_release_wbase; | ||
1048 | } | ||
1049 | |||
1050 | if (!request_region(data->sbase, SP_IOMEM_LEN, DRVNAME)) { | ||
1051 | dev_err(dev, "Region 0x%lx-0x%lx already in use!\n", | ||
1052 | data->sbase, data->sbase + SP_IOMEM_LEN - 1); | ||
1053 | err = -EBUSY; | ||
1054 | goto exit_release_ebase; | ||
1055 | } | ||
1056 | |||
1057 | err = request_irq(data->irq, wbcir_irq_handler, | ||
1058 | IRQF_DISABLED, DRVNAME, device); | ||
1059 | if (err) { | ||
1060 | dev_err(dev, "Failed to claim IRQ %u\n", data->irq); | ||
1061 | err = -EBUSY; | ||
1062 | goto exit_release_sbase; | ||
1063 | } | ||
1064 | |||
1065 | err = rc_register_device(data->dev); | 1065 | err = rc_register_device(data->dev); |
1066 | if (err) | 1066 | if (err) |
1067 | goto exit_free_rc; | 1067 | goto exit_free_irq; |
1068 | 1068 | ||
1069 | device_init_wakeup(&device->dev, 1); | 1069 | device_init_wakeup(&device->dev, 1); |
1070 | 1070 | ||
@@ -1072,14 +1072,6 @@ wbcir_probe(struct pnp_dev *device, const struct pnp_device_id *dev_id) | |||
1072 | 1072 | ||
1073 | return 0; | 1073 | return 0; |
1074 | 1074 | ||
1075 | exit_free_rc: | ||
1076 | rc_free_device(data->dev); | ||
1077 | exit_unregister_led: | ||
1078 | led_classdev_unregister(&data->led); | ||
1079 | exit_unregister_rxtrigger: | ||
1080 | led_trigger_unregister_simple(data->rxtrigger); | ||
1081 | exit_unregister_txtrigger: | ||
1082 | led_trigger_unregister_simple(data->txtrigger); | ||
1083 | exit_free_irq: | 1075 | exit_free_irq: |
1084 | free_irq(data->irq, device); | 1076 | free_irq(data->irq, device); |
1085 | exit_release_sbase: | 1077 | exit_release_sbase: |
@@ -1088,6 +1080,14 @@ exit_release_ebase: | |||
1088 | release_region(data->ebase, EHFUNC_IOMEM_LEN); | 1080 | release_region(data->ebase, EHFUNC_IOMEM_LEN); |
1089 | exit_release_wbase: | 1081 | exit_release_wbase: |
1090 | release_region(data->wbase, WAKEUP_IOMEM_LEN); | 1082 | release_region(data->wbase, WAKEUP_IOMEM_LEN); |
1083 | exit_free_rc: | ||
1084 | rc_free_device(data->dev); | ||
1085 | exit_unregister_led: | ||
1086 | led_classdev_unregister(&data->led); | ||
1087 | exit_unregister_rxtrigger: | ||
1088 | led_trigger_unregister_simple(data->rxtrigger); | ||
1089 | exit_unregister_txtrigger: | ||
1090 | led_trigger_unregister_simple(data->txtrigger); | ||
1091 | exit_free_data: | 1091 | exit_free_data: |
1092 | kfree(data); | 1092 | kfree(data); |
1093 | pnp_set_drvdata(device, NULL); | 1093 | pnp_set_drvdata(device, NULL); |
diff --git a/drivers/media/video/gspca/sonixj.c b/drivers/media/video/gspca/sonixj.c index db8e5084df06..863c755dd2b7 100644 --- a/drivers/media/video/gspca/sonixj.c +++ b/drivers/media/video/gspca/sonixj.c | |||
@@ -2923,6 +2923,10 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, | |||
2923 | * not the JPEG end of frame ('ff d9'). | 2923 | * not the JPEG end of frame ('ff d9'). |
2924 | */ | 2924 | */ |
2925 | 2925 | ||
2926 | /* count the packets and their size */ | ||
2927 | sd->npkt++; | ||
2928 | sd->pktsz += len; | ||
2929 | |||
2926 | /*fixme: assumption about the following code: | 2930 | /*fixme: assumption about the following code: |
2927 | * - there can be only one marker in a packet | 2931 | * - there can be only one marker in a packet |
2928 | */ | 2932 | */ |
@@ -2945,10 +2949,6 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, | |||
2945 | data += i; | 2949 | data += i; |
2946 | } | 2950 | } |
2947 | 2951 | ||
2948 | /* count the packets and their size */ | ||
2949 | sd->npkt++; | ||
2950 | sd->pktsz += len; | ||
2951 | |||
2952 | /* search backwards if there is a marker in the packet */ | 2952 | /* search backwards if there is a marker in the packet */ |
2953 | for (i = len - 1; --i >= 0; ) { | 2953 | for (i = len - 1; --i >= 0; ) { |
2954 | if (data[i] != 0xff) { | 2954 | if (data[i] != 0xff) { |
diff --git a/drivers/media/video/marvell-ccic/mmp-driver.c b/drivers/media/video/marvell-ccic/mmp-driver.c index d23552323f45..c4c17fe76c0d 100644 --- a/drivers/media/video/marvell-ccic/mmp-driver.c +++ b/drivers/media/video/marvell-ccic/mmp-driver.c | |||
@@ -181,7 +181,6 @@ static int mmpcam_probe(struct platform_device *pdev) | |||
181 | INIT_LIST_HEAD(&cam->devlist); | 181 | INIT_LIST_HEAD(&cam->devlist); |
182 | 182 | ||
183 | mcam = &cam->mcam; | 183 | mcam = &cam->mcam; |
184 | mcam->platform = MHP_Armada610; | ||
185 | mcam->plat_power_up = mmpcam_power_up; | 184 | mcam->plat_power_up = mmpcam_power_up; |
186 | mcam->plat_power_down = mmpcam_power_down; | 185 | mcam->plat_power_down = mmpcam_power_down; |
187 | mcam->dev = &pdev->dev; | 186 | mcam->dev = &pdev->dev; |
diff --git a/drivers/media/video/s5p-fimc/fimc-capture.c b/drivers/media/video/s5p-fimc/fimc-capture.c index b06efd208328..7e9b2c612b03 100644 --- a/drivers/media/video/s5p-fimc/fimc-capture.c +++ b/drivers/media/video/s5p-fimc/fimc-capture.c | |||
@@ -246,28 +246,37 @@ int fimc_capture_resume(struct fimc_dev *fimc) | |||
246 | 246 | ||
247 | } | 247 | } |
248 | 248 | ||
249 | static unsigned int get_plane_size(struct fimc_frame *fr, unsigned int plane) | 249 | static int queue_setup(struct vb2_queue *vq, const struct v4l2_format *pfmt, |
250 | { | ||
251 | if (!fr || plane >= fr->fmt->memplanes) | ||
252 | return 0; | ||
253 | return fr->f_width * fr->f_height * fr->fmt->depth[plane] / 8; | ||
254 | } | ||
255 | |||
256 | static int queue_setup(struct vb2_queue *vq, const struct v4l2_format *pfmt, | ||
257 | unsigned int *num_buffers, unsigned int *num_planes, | 250 | unsigned int *num_buffers, unsigned int *num_planes, |
258 | unsigned int sizes[], void *allocators[]) | 251 | unsigned int sizes[], void *allocators[]) |
259 | { | 252 | { |
253 | const struct v4l2_pix_format_mplane *pixm = NULL; | ||
260 | struct fimc_ctx *ctx = vq->drv_priv; | 254 | struct fimc_ctx *ctx = vq->drv_priv; |
261 | struct fimc_fmt *fmt = ctx->d_frame.fmt; | 255 | struct fimc_frame *frame = &ctx->d_frame; |
256 | struct fimc_fmt *fmt = frame->fmt; | ||
257 | unsigned long wh; | ||
262 | int i; | 258 | int i; |
263 | 259 | ||
264 | if (!fmt) | 260 | if (pfmt) { |
261 | pixm = &pfmt->fmt.pix_mp; | ||
262 | fmt = fimc_find_format(&pixm->pixelformat, NULL, | ||
263 | FMT_FLAGS_CAM | FMT_FLAGS_M2M, -1); | ||
264 | wh = pixm->width * pixm->height; | ||
265 | } else { | ||
266 | wh = frame->f_width * frame->f_height; | ||
267 | } | ||
268 | |||
269 | if (fmt == NULL) | ||
265 | return -EINVAL; | 270 | return -EINVAL; |
266 | 271 | ||
267 | *num_planes = fmt->memplanes; | 272 | *num_planes = fmt->memplanes; |
268 | 273 | ||
269 | for (i = 0; i < fmt->memplanes; i++) { | 274 | for (i = 0; i < fmt->memplanes; i++) { |
270 | sizes[i] = get_plane_size(&ctx->d_frame, i); | 275 | unsigned int size = (wh * fmt->depth[i]) / 8; |
276 | if (pixm) | ||
277 | sizes[i] = max(size, pixm->plane_fmt[i].sizeimage); | ||
278 | else | ||
279 | sizes[i] = size; | ||
271 | allocators[i] = ctx->fimc_dev->alloc_ctx; | 280 | allocators[i] = ctx->fimc_dev->alloc_ctx; |
272 | } | 281 | } |
273 | 282 | ||
@@ -1383,7 +1392,7 @@ static int fimc_subdev_set_crop(struct v4l2_subdev *sd, | |||
1383 | fimc_capture_try_crop(ctx, r, crop->pad); | 1392 | fimc_capture_try_crop(ctx, r, crop->pad); |
1384 | 1393 | ||
1385 | if (crop->which == V4L2_SUBDEV_FORMAT_TRY) { | 1394 | if (crop->which == V4L2_SUBDEV_FORMAT_TRY) { |
1386 | mutex_lock(&fimc->lock); | 1395 | mutex_unlock(&fimc->lock); |
1387 | *v4l2_subdev_get_try_crop(fh, crop->pad) = *r; | 1396 | *v4l2_subdev_get_try_crop(fh, crop->pad) = *r; |
1388 | return 0; | 1397 | return 0; |
1389 | } | 1398 | } |
diff --git a/drivers/media/video/s5p-fimc/fimc-core.c b/drivers/media/video/s5p-fimc/fimc-core.c index e184e650022a..e09ba7b0076e 100644 --- a/drivers/media/video/s5p-fimc/fimc-core.c +++ b/drivers/media/video/s5p-fimc/fimc-core.c | |||
@@ -1048,14 +1048,14 @@ static int fimc_m2m_g_fmt_mplane(struct file *file, void *fh, | |||
1048 | * @mask: the color flags to match | 1048 | * @mask: the color flags to match |
1049 | * @index: offset in the fimc_formats array, ignored if negative | 1049 | * @index: offset in the fimc_formats array, ignored if negative |
1050 | */ | 1050 | */ |
1051 | struct fimc_fmt *fimc_find_format(u32 *pixelformat, u32 *mbus_code, | 1051 | struct fimc_fmt *fimc_find_format(const u32 *pixelformat, const u32 *mbus_code, |
1052 | unsigned int mask, int index) | 1052 | unsigned int mask, int index) |
1053 | { | 1053 | { |
1054 | struct fimc_fmt *fmt, *def_fmt = NULL; | 1054 | struct fimc_fmt *fmt, *def_fmt = NULL; |
1055 | unsigned int i; | 1055 | unsigned int i; |
1056 | int id = 0; | 1056 | int id = 0; |
1057 | 1057 | ||
1058 | if (index >= ARRAY_SIZE(fimc_formats)) | 1058 | if (index >= (int)ARRAY_SIZE(fimc_formats)) |
1059 | return NULL; | 1059 | return NULL; |
1060 | 1060 | ||
1061 | for (i = 0; i < ARRAY_SIZE(fimc_formats); ++i) { | 1061 | for (i = 0; i < ARRAY_SIZE(fimc_formats); ++i) { |
diff --git a/drivers/media/video/s5p-fimc/fimc-core.h b/drivers/media/video/s5p-fimc/fimc-core.h index a18291e648e2..84fd83550bd7 100644 --- a/drivers/media/video/s5p-fimc/fimc-core.h +++ b/drivers/media/video/s5p-fimc/fimc-core.h | |||
@@ -718,7 +718,7 @@ void fimc_alpha_ctrl_update(struct fimc_ctx *ctx); | |||
718 | int fimc_fill_format(struct fimc_frame *frame, struct v4l2_format *f); | 718 | int fimc_fill_format(struct fimc_frame *frame, struct v4l2_format *f); |
719 | void fimc_adjust_mplane_format(struct fimc_fmt *fmt, u32 width, u32 height, | 719 | void fimc_adjust_mplane_format(struct fimc_fmt *fmt, u32 width, u32 height, |
720 | struct v4l2_pix_format_mplane *pix); | 720 | struct v4l2_pix_format_mplane *pix); |
721 | struct fimc_fmt *fimc_find_format(u32 *pixelformat, u32 *mbus_code, | 721 | struct fimc_fmt *fimc_find_format(const u32 *pixelformat, const u32 *mbus_code, |
722 | unsigned int mask, int index); | 722 | unsigned int mask, int index); |
723 | 723 | ||
724 | int fimc_check_scaler_ratio(struct fimc_ctx *ctx, int sw, int sh, | 724 | int fimc_check_scaler_ratio(struct fimc_ctx *ctx, int sw, int sh, |
diff --git a/drivers/media/video/soc_camera.c b/drivers/media/video/soc_camera.c index eb25756a07af..aedb970d13f6 100644 --- a/drivers/media/video/soc_camera.c +++ b/drivers/media/video/soc_camera.c | |||
@@ -530,7 +530,10 @@ static int soc_camera_open(struct file *file) | |||
530 | if (icl->reset) | 530 | if (icl->reset) |
531 | icl->reset(icd->pdev); | 531 | icl->reset(icd->pdev); |
532 | 532 | ||
533 | /* Don't mess with the host during probe */ | ||
534 | mutex_lock(&ici->host_lock); | ||
533 | ret = ici->ops->add(icd); | 535 | ret = ici->ops->add(icd); |
536 | mutex_unlock(&ici->host_lock); | ||
534 | if (ret < 0) { | 537 | if (ret < 0) { |
535 | dev_err(icd->pdev, "Couldn't activate the camera: %d\n", ret); | 538 | dev_err(icd->pdev, "Couldn't activate the camera: %d\n", ret); |
536 | goto eiciadd; | 539 | goto eiciadd; |
@@ -956,7 +959,7 @@ static void scan_add_host(struct soc_camera_host *ici) | |||
956 | { | 959 | { |
957 | struct soc_camera_device *icd; | 960 | struct soc_camera_device *icd; |
958 | 961 | ||
959 | mutex_lock(&list_lock); | 962 | mutex_lock(&ici->host_lock); |
960 | 963 | ||
961 | list_for_each_entry(icd, &devices, list) { | 964 | list_for_each_entry(icd, &devices, list) { |
962 | if (icd->iface == ici->nr) { | 965 | if (icd->iface == ici->nr) { |
@@ -967,7 +970,7 @@ static void scan_add_host(struct soc_camera_host *ici) | |||
967 | } | 970 | } |
968 | } | 971 | } |
969 | 972 | ||
970 | mutex_unlock(&list_lock); | 973 | mutex_unlock(&ici->host_lock); |
971 | } | 974 | } |
972 | 975 | ||
973 | #ifdef CONFIG_I2C_BOARDINFO | 976 | #ifdef CONFIG_I2C_BOARDINFO |
@@ -1313,6 +1316,7 @@ int soc_camera_host_register(struct soc_camera_host *ici) | |||
1313 | list_add_tail(&ici->list, &hosts); | 1316 | list_add_tail(&ici->list, &hosts); |
1314 | mutex_unlock(&list_lock); | 1317 | mutex_unlock(&list_lock); |
1315 | 1318 | ||
1319 | mutex_init(&ici->host_lock); | ||
1316 | scan_add_host(ici); | 1320 | scan_add_host(ici); |
1317 | 1321 | ||
1318 | return 0; | 1322 | return 0; |
diff --git a/drivers/media/video/videobuf2-dma-contig.c b/drivers/media/video/videobuf2-dma-contig.c index f17ad98fcc5f..4b7132660a93 100644 --- a/drivers/media/video/videobuf2-dma-contig.c +++ b/drivers/media/video/videobuf2-dma-contig.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/dma-mapping.h> | 15 | #include <linux/dma-mapping.h> |
16 | 16 | ||
17 | #include <media/videobuf2-core.h> | 17 | #include <media/videobuf2-core.h> |
18 | #include <media/videobuf2-dma-contig.h> | ||
18 | #include <media/videobuf2-memops.h> | 19 | #include <media/videobuf2-memops.h> |
19 | 20 | ||
20 | struct vb2_dc_conf { | 21 | struct vb2_dc_conf { |
@@ -85,7 +86,7 @@ static void *vb2_dma_contig_vaddr(void *buf_priv) | |||
85 | { | 86 | { |
86 | struct vb2_dc_buf *buf = buf_priv; | 87 | struct vb2_dc_buf *buf = buf_priv; |
87 | if (!buf) | 88 | if (!buf) |
88 | return 0; | 89 | return NULL; |
89 | 90 | ||
90 | return buf->vaddr; | 91 | return buf->vaddr; |
91 | } | 92 | } |
diff --git a/drivers/media/video/videobuf2-memops.c b/drivers/media/video/videobuf2-memops.c index c41cb60245d6..504cd4cbe29e 100644 --- a/drivers/media/video/videobuf2-memops.c +++ b/drivers/media/video/videobuf2-memops.c | |||
@@ -55,6 +55,7 @@ struct vm_area_struct *vb2_get_vma(struct vm_area_struct *vma) | |||
55 | 55 | ||
56 | return vma_copy; | 56 | return vma_copy; |
57 | } | 57 | } |
58 | EXPORT_SYMBOL_GPL(vb2_get_vma); | ||
58 | 59 | ||
59 | /** | 60 | /** |
60 | * vb2_put_userptr() - release a userspace virtual memory area | 61 | * vb2_put_userptr() - release a userspace virtual memory area |
diff --git a/drivers/mtd/mtdchar.c b/drivers/mtd/mtdchar.c index 58fc65f5c817..f2f482bec573 100644 --- a/drivers/mtd/mtdchar.c +++ b/drivers/mtd/mtdchar.c | |||
@@ -376,7 +376,7 @@ static int otp_select_filemode(struct mtd_file_info *mfi, int mode) | |||
376 | * Make a fake call to mtd_read_fact_prot_reg() to check if OTP | 376 | * Make a fake call to mtd_read_fact_prot_reg() to check if OTP |
377 | * operations are supported. | 377 | * operations are supported. |
378 | */ | 378 | */ |
379 | if (mtd_read_fact_prot_reg(mtd, -1, -1, &retlen, NULL) == -EOPNOTSUPP) | 379 | if (mtd_read_fact_prot_reg(mtd, -1, 0, &retlen, NULL) == -EOPNOTSUPP) |
380 | return -EOPNOTSUPP; | 380 | return -EOPNOTSUPP; |
381 | 381 | ||
382 | switch (mode) { | 382 | switch (mode) { |
diff --git a/drivers/mtd/nand/ams-delta.c b/drivers/mtd/nand/ams-delta.c index 73416951f4c1..861ca8f7e47d 100644 --- a/drivers/mtd/nand/ams-delta.c +++ b/drivers/mtd/nand/ams-delta.c | |||
@@ -212,18 +212,17 @@ static int __devinit ams_delta_init(struct platform_device *pdev) | |||
212 | /* Link the private data with the MTD structure */ | 212 | /* Link the private data with the MTD structure */ |
213 | ams_delta_mtd->priv = this; | 213 | ams_delta_mtd->priv = this; |
214 | 214 | ||
215 | if (!request_mem_region(res->start, resource_size(res), | 215 | /* |
216 | dev_name(&pdev->dev))) { | 216 | * Don't try to request the memory region from here, |
217 | dev_err(&pdev->dev, "request_mem_region failed\n"); | 217 | * it should have been already requested from the |
218 | err = -EBUSY; | 218 | * gpio-omap driver and requesting it again would fail. |
219 | goto out_free; | 219 | */ |
220 | } | ||
221 | 220 | ||
222 | io_base = ioremap(res->start, resource_size(res)); | 221 | io_base = ioremap(res->start, resource_size(res)); |
223 | if (io_base == NULL) { | 222 | if (io_base == NULL) { |
224 | dev_err(&pdev->dev, "ioremap failed\n"); | 223 | dev_err(&pdev->dev, "ioremap failed\n"); |
225 | err = -EIO; | 224 | err = -EIO; |
226 | goto out_release_io; | 225 | goto out_free; |
227 | } | 226 | } |
228 | 227 | ||
229 | this->priv = io_base; | 228 | this->priv = io_base; |
@@ -271,8 +270,6 @@ out_gpio: | |||
271 | platform_set_drvdata(pdev, NULL); | 270 | platform_set_drvdata(pdev, NULL); |
272 | gpio_free(AMS_DELTA_GPIO_PIN_NAND_RB); | 271 | gpio_free(AMS_DELTA_GPIO_PIN_NAND_RB); |
273 | iounmap(io_base); | 272 | iounmap(io_base); |
274 | out_release_io: | ||
275 | release_mem_region(res->start, resource_size(res)); | ||
276 | out_free: | 273 | out_free: |
277 | kfree(ams_delta_mtd); | 274 | kfree(ams_delta_mtd); |
278 | out: | 275 | out: |
@@ -285,7 +282,6 @@ out_free: | |||
285 | static int __devexit ams_delta_cleanup(struct platform_device *pdev) | 282 | static int __devexit ams_delta_cleanup(struct platform_device *pdev) |
286 | { | 283 | { |
287 | void __iomem *io_base = platform_get_drvdata(pdev); | 284 | void __iomem *io_base = platform_get_drvdata(pdev); |
288 | struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
289 | 285 | ||
290 | /* Release resources, unregister device */ | 286 | /* Release resources, unregister device */ |
291 | nand_release(ams_delta_mtd); | 287 | nand_release(ams_delta_mtd); |
@@ -293,7 +289,6 @@ static int __devexit ams_delta_cleanup(struct platform_device *pdev) | |||
293 | gpio_free_array(_mandatory_gpio, ARRAY_SIZE(_mandatory_gpio)); | 289 | gpio_free_array(_mandatory_gpio, ARRAY_SIZE(_mandatory_gpio)); |
294 | gpio_free(AMS_DELTA_GPIO_PIN_NAND_RB); | 290 | gpio_free(AMS_DELTA_GPIO_PIN_NAND_RB); |
295 | iounmap(io_base); | 291 | iounmap(io_base); |
296 | release_mem_region(res->start, resource_size(res)); | ||
297 | 292 | ||
298 | /* Free the MTD device structure */ | 293 | /* Free the MTD device structure */ |
299 | kfree(ams_delta_mtd); | 294 | kfree(ams_delta_mtd); |
diff --git a/drivers/net/bonding/bond_3ad.c b/drivers/net/bonding/bond_3ad.c index 793b00138275..3463b469e657 100644 --- a/drivers/net/bonding/bond_3ad.c +++ b/drivers/net/bonding/bond_3ad.c | |||
@@ -2173,9 +2173,10 @@ re_arm: | |||
2173 | * received frames (loopback). Since only the payload is given to this | 2173 | * received frames (loopback). Since only the payload is given to this |
2174 | * function, it check for loopback. | 2174 | * function, it check for loopback. |
2175 | */ | 2175 | */ |
2176 | static void bond_3ad_rx_indication(struct lacpdu *lacpdu, struct slave *slave, u16 length) | 2176 | static int bond_3ad_rx_indication(struct lacpdu *lacpdu, struct slave *slave, u16 length) |
2177 | { | 2177 | { |
2178 | struct port *port; | 2178 | struct port *port; |
2179 | int ret = RX_HANDLER_ANOTHER; | ||
2179 | 2180 | ||
2180 | if (length >= sizeof(struct lacpdu)) { | 2181 | if (length >= sizeof(struct lacpdu)) { |
2181 | 2182 | ||
@@ -2184,11 +2185,12 @@ static void bond_3ad_rx_indication(struct lacpdu *lacpdu, struct slave *slave, u | |||
2184 | if (!port->slave) { | 2185 | if (!port->slave) { |
2185 | pr_warning("%s: Warning: port of slave %s is uninitialized\n", | 2186 | pr_warning("%s: Warning: port of slave %s is uninitialized\n", |
2186 | slave->dev->name, slave->dev->master->name); | 2187 | slave->dev->name, slave->dev->master->name); |
2187 | return; | 2188 | return ret; |
2188 | } | 2189 | } |
2189 | 2190 | ||
2190 | switch (lacpdu->subtype) { | 2191 | switch (lacpdu->subtype) { |
2191 | case AD_TYPE_LACPDU: | 2192 | case AD_TYPE_LACPDU: |
2193 | ret = RX_HANDLER_CONSUMED; | ||
2192 | pr_debug("Received LACPDU on port %d\n", | 2194 | pr_debug("Received LACPDU on port %d\n", |
2193 | port->actor_port_number); | 2195 | port->actor_port_number); |
2194 | /* Protect against concurrent state machines */ | 2196 | /* Protect against concurrent state machines */ |
@@ -2198,6 +2200,7 @@ static void bond_3ad_rx_indication(struct lacpdu *lacpdu, struct slave *slave, u | |||
2198 | break; | 2200 | break; |
2199 | 2201 | ||
2200 | case AD_TYPE_MARKER: | 2202 | case AD_TYPE_MARKER: |
2203 | ret = RX_HANDLER_CONSUMED; | ||
2201 | // No need to convert fields to Little Endian since we don't use the marker's fields. | 2204 | // No need to convert fields to Little Endian since we don't use the marker's fields. |
2202 | 2205 | ||
2203 | switch (((struct bond_marker *)lacpdu)->tlv_type) { | 2206 | switch (((struct bond_marker *)lacpdu)->tlv_type) { |
@@ -2219,6 +2222,7 @@ static void bond_3ad_rx_indication(struct lacpdu *lacpdu, struct slave *slave, u | |||
2219 | } | 2222 | } |
2220 | } | 2223 | } |
2221 | } | 2224 | } |
2225 | return ret; | ||
2222 | } | 2226 | } |
2223 | 2227 | ||
2224 | /** | 2228 | /** |
@@ -2456,18 +2460,20 @@ out: | |||
2456 | return NETDEV_TX_OK; | 2460 | return NETDEV_TX_OK; |
2457 | } | 2461 | } |
2458 | 2462 | ||
2459 | void bond_3ad_lacpdu_recv(struct sk_buff *skb, struct bonding *bond, | 2463 | int bond_3ad_lacpdu_recv(struct sk_buff *skb, struct bonding *bond, |
2460 | struct slave *slave) | 2464 | struct slave *slave) |
2461 | { | 2465 | { |
2466 | int ret = RX_HANDLER_ANOTHER; | ||
2462 | if (skb->protocol != PKT_TYPE_LACPDU) | 2467 | if (skb->protocol != PKT_TYPE_LACPDU) |
2463 | return; | 2468 | return ret; |
2464 | 2469 | ||
2465 | if (!pskb_may_pull(skb, sizeof(struct lacpdu))) | 2470 | if (!pskb_may_pull(skb, sizeof(struct lacpdu))) |
2466 | return; | 2471 | return ret; |
2467 | 2472 | ||
2468 | read_lock(&bond->lock); | 2473 | read_lock(&bond->lock); |
2469 | bond_3ad_rx_indication((struct lacpdu *) skb->data, slave, skb->len); | 2474 | ret = bond_3ad_rx_indication((struct lacpdu *) skb->data, slave, skb->len); |
2470 | read_unlock(&bond->lock); | 2475 | read_unlock(&bond->lock); |
2476 | return ret; | ||
2471 | } | 2477 | } |
2472 | 2478 | ||
2473 | /* | 2479 | /* |
diff --git a/drivers/net/bonding/bond_3ad.h b/drivers/net/bonding/bond_3ad.h index 235b2cc58b28..5ee7e3c45db7 100644 --- a/drivers/net/bonding/bond_3ad.h +++ b/drivers/net/bonding/bond_3ad.h | |||
@@ -274,7 +274,7 @@ void bond_3ad_adapter_duplex_changed(struct slave *slave); | |||
274 | void bond_3ad_handle_link_change(struct slave *slave, char link); | 274 | void bond_3ad_handle_link_change(struct slave *slave, char link); |
275 | int bond_3ad_get_active_agg_info(struct bonding *bond, struct ad_info *ad_info); | 275 | int bond_3ad_get_active_agg_info(struct bonding *bond, struct ad_info *ad_info); |
276 | int bond_3ad_xmit_xor(struct sk_buff *skb, struct net_device *dev); | 276 | int bond_3ad_xmit_xor(struct sk_buff *skb, struct net_device *dev); |
277 | void bond_3ad_lacpdu_recv(struct sk_buff *skb, struct bonding *bond, | 277 | int bond_3ad_lacpdu_recv(struct sk_buff *skb, struct bonding *bond, |
278 | struct slave *slave); | 278 | struct slave *slave); |
279 | int bond_3ad_set_carrier(struct bonding *bond); | 279 | int bond_3ad_set_carrier(struct bonding *bond); |
280 | void bond_3ad_update_lacp_rate(struct bonding *bond); | 280 | void bond_3ad_update_lacp_rate(struct bonding *bond); |
diff --git a/drivers/net/bonding/bond_alb.c b/drivers/net/bonding/bond_alb.c index b4f1b4ac92c6..0f59c1564e53 100644 --- a/drivers/net/bonding/bond_alb.c +++ b/drivers/net/bonding/bond_alb.c | |||
@@ -342,26 +342,26 @@ static void rlb_update_entry_from_arp(struct bonding *bond, struct arp_pkt *arp) | |||
342 | _unlock_rx_hashtbl_bh(bond); | 342 | _unlock_rx_hashtbl_bh(bond); |
343 | } | 343 | } |
344 | 344 | ||
345 | static void rlb_arp_recv(struct sk_buff *skb, struct bonding *bond, | 345 | static int rlb_arp_recv(struct sk_buff *skb, struct bonding *bond, |
346 | struct slave *slave) | 346 | struct slave *slave) |
347 | { | 347 | { |
348 | struct arp_pkt *arp; | 348 | struct arp_pkt *arp; |
349 | 349 | ||
350 | if (skb->protocol != cpu_to_be16(ETH_P_ARP)) | 350 | if (skb->protocol != cpu_to_be16(ETH_P_ARP)) |
351 | return; | 351 | goto out; |
352 | 352 | ||
353 | arp = (struct arp_pkt *) skb->data; | 353 | arp = (struct arp_pkt *) skb->data; |
354 | if (!arp) { | 354 | if (!arp) { |
355 | pr_debug("Packet has no ARP data\n"); | 355 | pr_debug("Packet has no ARP data\n"); |
356 | return; | 356 | goto out; |
357 | } | 357 | } |
358 | 358 | ||
359 | if (!pskb_may_pull(skb, arp_hdr_len(bond->dev))) | 359 | if (!pskb_may_pull(skb, arp_hdr_len(bond->dev))) |
360 | return; | 360 | goto out; |
361 | 361 | ||
362 | if (skb->len < sizeof(struct arp_pkt)) { | 362 | if (skb->len < sizeof(struct arp_pkt)) { |
363 | pr_debug("Packet is too small to be an ARP\n"); | 363 | pr_debug("Packet is too small to be an ARP\n"); |
364 | return; | 364 | goto out; |
365 | } | 365 | } |
366 | 366 | ||
367 | if (arp->op_code == htons(ARPOP_REPLY)) { | 367 | if (arp->op_code == htons(ARPOP_REPLY)) { |
@@ -369,6 +369,8 @@ static void rlb_arp_recv(struct sk_buff *skb, struct bonding *bond, | |||
369 | rlb_update_entry_from_arp(bond, arp); | 369 | rlb_update_entry_from_arp(bond, arp); |
370 | pr_debug("Server received an ARP Reply from client\n"); | 370 | pr_debug("Server received an ARP Reply from client\n"); |
371 | } | 371 | } |
372 | out: | ||
373 | return RX_HANDLER_ANOTHER; | ||
372 | } | 374 | } |
373 | 375 | ||
374 | /* Caller must hold bond lock for read */ | 376 | /* Caller must hold bond lock for read */ |
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index bbb004354bbd..2ee8cf9e8a3b 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
@@ -1444,8 +1444,9 @@ static rx_handler_result_t bond_handle_frame(struct sk_buff **pskb) | |||
1444 | struct sk_buff *skb = *pskb; | 1444 | struct sk_buff *skb = *pskb; |
1445 | struct slave *slave; | 1445 | struct slave *slave; |
1446 | struct bonding *bond; | 1446 | struct bonding *bond; |
1447 | void (*recv_probe)(struct sk_buff *, struct bonding *, | 1447 | int (*recv_probe)(struct sk_buff *, struct bonding *, |
1448 | struct slave *); | 1448 | struct slave *); |
1449 | int ret = RX_HANDLER_ANOTHER; | ||
1449 | 1450 | ||
1450 | skb = skb_share_check(skb, GFP_ATOMIC); | 1451 | skb = skb_share_check(skb, GFP_ATOMIC); |
1451 | if (unlikely(!skb)) | 1452 | if (unlikely(!skb)) |
@@ -1464,8 +1465,12 @@ static rx_handler_result_t bond_handle_frame(struct sk_buff **pskb) | |||
1464 | struct sk_buff *nskb = skb_clone(skb, GFP_ATOMIC); | 1465 | struct sk_buff *nskb = skb_clone(skb, GFP_ATOMIC); |
1465 | 1466 | ||
1466 | if (likely(nskb)) { | 1467 | if (likely(nskb)) { |
1467 | recv_probe(nskb, bond, slave); | 1468 | ret = recv_probe(nskb, bond, slave); |
1468 | dev_kfree_skb(nskb); | 1469 | dev_kfree_skb(nskb); |
1470 | if (ret == RX_HANDLER_CONSUMED) { | ||
1471 | consume_skb(skb); | ||
1472 | return ret; | ||
1473 | } | ||
1469 | } | 1474 | } |
1470 | } | 1475 | } |
1471 | 1476 | ||
@@ -1487,7 +1492,7 @@ static rx_handler_result_t bond_handle_frame(struct sk_buff **pskb) | |||
1487 | memcpy(eth_hdr(skb)->h_dest, bond->dev->dev_addr, ETH_ALEN); | 1492 | memcpy(eth_hdr(skb)->h_dest, bond->dev->dev_addr, ETH_ALEN); |
1488 | } | 1493 | } |
1489 | 1494 | ||
1490 | return RX_HANDLER_ANOTHER; | 1495 | return ret; |
1491 | } | 1496 | } |
1492 | 1497 | ||
1493 | /* enslave device <slave> to bond device <master> */ | 1498 | /* enslave device <slave> to bond device <master> */ |
@@ -2732,7 +2737,7 @@ static void bond_validate_arp(struct bonding *bond, struct slave *slave, __be32 | |||
2732 | } | 2737 | } |
2733 | } | 2738 | } |
2734 | 2739 | ||
2735 | static void bond_arp_rcv(struct sk_buff *skb, struct bonding *bond, | 2740 | static int bond_arp_rcv(struct sk_buff *skb, struct bonding *bond, |
2736 | struct slave *slave) | 2741 | struct slave *slave) |
2737 | { | 2742 | { |
2738 | struct arphdr *arp; | 2743 | struct arphdr *arp; |
@@ -2740,7 +2745,7 @@ static void bond_arp_rcv(struct sk_buff *skb, struct bonding *bond, | |||
2740 | __be32 sip, tip; | 2745 | __be32 sip, tip; |
2741 | 2746 | ||
2742 | if (skb->protocol != __cpu_to_be16(ETH_P_ARP)) | 2747 | if (skb->protocol != __cpu_to_be16(ETH_P_ARP)) |
2743 | return; | 2748 | return RX_HANDLER_ANOTHER; |
2744 | 2749 | ||
2745 | read_lock(&bond->lock); | 2750 | read_lock(&bond->lock); |
2746 | 2751 | ||
@@ -2785,6 +2790,7 @@ static void bond_arp_rcv(struct sk_buff *skb, struct bonding *bond, | |||
2785 | 2790 | ||
2786 | out_unlock: | 2791 | out_unlock: |
2787 | read_unlock(&bond->lock); | 2792 | read_unlock(&bond->lock); |
2793 | return RX_HANDLER_ANOTHER; | ||
2788 | } | 2794 | } |
2789 | 2795 | ||
2790 | /* | 2796 | /* |
diff --git a/drivers/net/bonding/bonding.h b/drivers/net/bonding/bonding.h index 9f2bae6616d3..4581aa5ccaba 100644 --- a/drivers/net/bonding/bonding.h +++ b/drivers/net/bonding/bonding.h | |||
@@ -218,7 +218,7 @@ struct bonding { | |||
218 | struct slave *primary_slave; | 218 | struct slave *primary_slave; |
219 | bool force_primary; | 219 | bool force_primary; |
220 | s32 slave_cnt; /* never change this value outside the attach/detach wrappers */ | 220 | s32 slave_cnt; /* never change this value outside the attach/detach wrappers */ |
221 | void (*recv_probe)(struct sk_buff *, struct bonding *, | 221 | int (*recv_probe)(struct sk_buff *, struct bonding *, |
222 | struct slave *); | 222 | struct slave *); |
223 | rwlock_t lock; | 223 | rwlock_t lock; |
224 | rwlock_t curr_slave_lock; | 224 | rwlock_t curr_slave_lock; |
diff --git a/drivers/net/ethernet/ibm/ehea/ehea_main.c b/drivers/net/ethernet/ibm/ehea/ehea_main.c index c9069a28832b..f4d2da0db1b1 100644 --- a/drivers/net/ethernet/ibm/ehea/ehea_main.c +++ b/drivers/net/ethernet/ibm/ehea/ehea_main.c | |||
@@ -3335,6 +3335,8 @@ static int __devinit ehea_probe_adapter(struct platform_device *dev, | |||
3335 | goto out_shutdown_ports; | 3335 | goto out_shutdown_ports; |
3336 | } | 3336 | } |
3337 | 3337 | ||
3338 | /* Handle any events that might be pending. */ | ||
3339 | tasklet_hi_schedule(&adapter->neq_tasklet); | ||
3338 | 3340 | ||
3339 | ret = 0; | 3341 | ret = 0; |
3340 | goto out; | 3342 | goto out; |
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c index ba21f9c72a21..9bbf1a275947 100644 --- a/drivers/net/ethernet/intel/igb/igb_main.c +++ b/drivers/net/ethernet/intel/igb/igb_main.c | |||
@@ -1103,9 +1103,12 @@ msi_only: | |||
1103 | adapter->flags |= IGB_FLAG_HAS_MSI; | 1103 | adapter->flags |= IGB_FLAG_HAS_MSI; |
1104 | out: | 1104 | out: |
1105 | /* Notify the stack of the (possibly) reduced queue counts. */ | 1105 | /* Notify the stack of the (possibly) reduced queue counts. */ |
1106 | rtnl_lock(); | ||
1106 | netif_set_real_num_tx_queues(adapter->netdev, adapter->num_tx_queues); | 1107 | netif_set_real_num_tx_queues(adapter->netdev, adapter->num_tx_queues); |
1107 | return netif_set_real_num_rx_queues(adapter->netdev, | 1108 | err = netif_set_real_num_rx_queues(adapter->netdev, |
1108 | adapter->num_rx_queues); | 1109 | adapter->num_rx_queues); |
1110 | rtnl_unlock(); | ||
1111 | return err; | ||
1109 | } | 1112 | } |
1110 | 1113 | ||
1111 | /** | 1114 | /** |
@@ -6706,18 +6709,7 @@ static int igb_resume(struct device *dev) | |||
6706 | pci_enable_wake(pdev, PCI_D3hot, 0); | 6709 | pci_enable_wake(pdev, PCI_D3hot, 0); |
6707 | pci_enable_wake(pdev, PCI_D3cold, 0); | 6710 | pci_enable_wake(pdev, PCI_D3cold, 0); |
6708 | 6711 | ||
6709 | if (!rtnl_is_locked()) { | 6712 | if (igb_init_interrupt_scheme(adapter)) { |
6710 | /* | ||
6711 | * shut up ASSERT_RTNL() warning in | ||
6712 | * netif_set_real_num_tx/rx_queues. | ||
6713 | */ | ||
6714 | rtnl_lock(); | ||
6715 | err = igb_init_interrupt_scheme(adapter); | ||
6716 | rtnl_unlock(); | ||
6717 | } else { | ||
6718 | err = igb_init_interrupt_scheme(adapter); | ||
6719 | } | ||
6720 | if (err) { | ||
6721 | dev_err(&pdev->dev, "Unable to allocate memory for queues\n"); | 6713 | dev_err(&pdev->dev, "Unable to allocate memory for queues\n"); |
6722 | return -ENOMEM; | 6714 | return -ENOMEM; |
6723 | } | 6715 | } |
diff --git a/drivers/net/ethernet/micrel/ks8851.c b/drivers/net/ethernet/micrel/ks8851.c index f8dda009d3c0..5e313e9a252f 100644 --- a/drivers/net/ethernet/micrel/ks8851.c +++ b/drivers/net/ethernet/micrel/ks8851.c | |||
@@ -618,10 +618,8 @@ static void ks8851_irq_work(struct work_struct *work) | |||
618 | netif_dbg(ks, intr, ks->netdev, | 618 | netif_dbg(ks, intr, ks->netdev, |
619 | "%s: status 0x%04x\n", __func__, status); | 619 | "%s: status 0x%04x\n", __func__, status); |
620 | 620 | ||
621 | if (status & IRQ_LCI) { | 621 | if (status & IRQ_LCI) |
622 | /* should do something about checking link status */ | ||
623 | handled |= IRQ_LCI; | 622 | handled |= IRQ_LCI; |
624 | } | ||
625 | 623 | ||
626 | if (status & IRQ_LDI) { | 624 | if (status & IRQ_LDI) { |
627 | u16 pmecr = ks8851_rdreg16(ks, KS_PMECR); | 625 | u16 pmecr = ks8851_rdreg16(ks, KS_PMECR); |
@@ -684,6 +682,9 @@ static void ks8851_irq_work(struct work_struct *work) | |||
684 | 682 | ||
685 | mutex_unlock(&ks->lock); | 683 | mutex_unlock(&ks->lock); |
686 | 684 | ||
685 | if (status & IRQ_LCI) | ||
686 | mii_check_link(&ks->mii); | ||
687 | |||
687 | if (status & IRQ_TXI) | 688 | if (status & IRQ_TXI) |
688 | netif_wake_queue(ks->netdev); | 689 | netif_wake_queue(ks->netdev); |
689 | 690 | ||
diff --git a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe.h b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe.h index 9f3dbc4feadc..b07311eaa693 100644 --- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe.h +++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe.h | |||
@@ -584,7 +584,6 @@ struct pch_gbe_hw_stats { | |||
584 | /** | 584 | /** |
585 | * struct pch_gbe_adapter - board specific private data structure | 585 | * struct pch_gbe_adapter - board specific private data structure |
586 | * @stats_lock: Spinlock structure for status | 586 | * @stats_lock: Spinlock structure for status |
587 | * @tx_queue_lock: Spinlock structure for transmit | ||
588 | * @ethtool_lock: Spinlock structure for ethtool | 587 | * @ethtool_lock: Spinlock structure for ethtool |
589 | * @irq_sem: Semaphore for interrupt | 588 | * @irq_sem: Semaphore for interrupt |
590 | * @netdev: Pointer of network device structure | 589 | * @netdev: Pointer of network device structure |
@@ -609,7 +608,6 @@ struct pch_gbe_hw_stats { | |||
609 | 608 | ||
610 | struct pch_gbe_adapter { | 609 | struct pch_gbe_adapter { |
611 | spinlock_t stats_lock; | 610 | spinlock_t stats_lock; |
612 | spinlock_t tx_queue_lock; | ||
613 | spinlock_t ethtool_lock; | 611 | spinlock_t ethtool_lock; |
614 | atomic_t irq_sem; | 612 | atomic_t irq_sem; |
615 | struct net_device *netdev; | 613 | struct net_device *netdev; |
diff --git a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c index 9dc7e5023671..3787c64ee71c 100644 --- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c +++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c | |||
@@ -645,14 +645,11 @@ static void pch_gbe_mac_set_pause_packet(struct pch_gbe_hw *hw) | |||
645 | */ | 645 | */ |
646 | static int pch_gbe_alloc_queues(struct pch_gbe_adapter *adapter) | 646 | static int pch_gbe_alloc_queues(struct pch_gbe_adapter *adapter) |
647 | { | 647 | { |
648 | int size; | 648 | adapter->tx_ring = kzalloc(sizeof(*adapter->tx_ring), GFP_KERNEL); |
649 | |||
650 | size = (int)sizeof(struct pch_gbe_tx_ring); | ||
651 | adapter->tx_ring = kzalloc(size, GFP_KERNEL); | ||
652 | if (!adapter->tx_ring) | 649 | if (!adapter->tx_ring) |
653 | return -ENOMEM; | 650 | return -ENOMEM; |
654 | size = (int)sizeof(struct pch_gbe_rx_ring); | 651 | |
655 | adapter->rx_ring = kzalloc(size, GFP_KERNEL); | 652 | adapter->rx_ring = kzalloc(sizeof(*adapter->rx_ring), GFP_KERNEL); |
656 | if (!adapter->rx_ring) { | 653 | if (!adapter->rx_ring) { |
657 | kfree(adapter->tx_ring); | 654 | kfree(adapter->tx_ring); |
658 | return -ENOMEM; | 655 | return -ENOMEM; |
@@ -1169,7 +1166,6 @@ static void pch_gbe_tx_queue(struct pch_gbe_adapter *adapter, | |||
1169 | struct sk_buff *tmp_skb; | 1166 | struct sk_buff *tmp_skb; |
1170 | unsigned int frame_ctrl; | 1167 | unsigned int frame_ctrl; |
1171 | unsigned int ring_num; | 1168 | unsigned int ring_num; |
1172 | unsigned long flags; | ||
1173 | 1169 | ||
1174 | /*-- Set frame control --*/ | 1170 | /*-- Set frame control --*/ |
1175 | frame_ctrl = 0; | 1171 | frame_ctrl = 0; |
@@ -1216,14 +1212,14 @@ static void pch_gbe_tx_queue(struct pch_gbe_adapter *adapter, | |||
1216 | } | 1212 | } |
1217 | } | 1213 | } |
1218 | } | 1214 | } |
1219 | spin_lock_irqsave(&tx_ring->tx_lock, flags); | 1215 | |
1220 | ring_num = tx_ring->next_to_use; | 1216 | ring_num = tx_ring->next_to_use; |
1221 | if (unlikely((ring_num + 1) == tx_ring->count)) | 1217 | if (unlikely((ring_num + 1) == tx_ring->count)) |
1222 | tx_ring->next_to_use = 0; | 1218 | tx_ring->next_to_use = 0; |
1223 | else | 1219 | else |
1224 | tx_ring->next_to_use = ring_num + 1; | 1220 | tx_ring->next_to_use = ring_num + 1; |
1225 | 1221 | ||
1226 | spin_unlock_irqrestore(&tx_ring->tx_lock, flags); | 1222 | |
1227 | buffer_info = &tx_ring->buffer_info[ring_num]; | 1223 | buffer_info = &tx_ring->buffer_info[ring_num]; |
1228 | tmp_skb = buffer_info->skb; | 1224 | tmp_skb = buffer_info->skb; |
1229 | 1225 | ||
@@ -1525,7 +1521,7 @@ pch_gbe_alloc_rx_buffers_pool(struct pch_gbe_adapter *adapter, | |||
1525 | &rx_ring->rx_buff_pool_logic, | 1521 | &rx_ring->rx_buff_pool_logic, |
1526 | GFP_KERNEL); | 1522 | GFP_KERNEL); |
1527 | if (!rx_ring->rx_buff_pool) { | 1523 | if (!rx_ring->rx_buff_pool) { |
1528 | pr_err("Unable to allocate memory for the receive poll buffer\n"); | 1524 | pr_err("Unable to allocate memory for the receive pool buffer\n"); |
1529 | return -ENOMEM; | 1525 | return -ENOMEM; |
1530 | } | 1526 | } |
1531 | memset(rx_ring->rx_buff_pool, 0, size); | 1527 | memset(rx_ring->rx_buff_pool, 0, size); |
@@ -1644,15 +1640,17 @@ pch_gbe_clean_tx(struct pch_gbe_adapter *adapter, | |||
1644 | pr_debug("called pch_gbe_unmap_and_free_tx_resource() %d count\n", | 1640 | pr_debug("called pch_gbe_unmap_and_free_tx_resource() %d count\n", |
1645 | cleaned_count); | 1641 | cleaned_count); |
1646 | /* Recover from running out of Tx resources in xmit_frame */ | 1642 | /* Recover from running out of Tx resources in xmit_frame */ |
1643 | spin_lock(&tx_ring->tx_lock); | ||
1647 | if (unlikely(cleaned && (netif_queue_stopped(adapter->netdev)))) { | 1644 | if (unlikely(cleaned && (netif_queue_stopped(adapter->netdev)))) { |
1648 | netif_wake_queue(adapter->netdev); | 1645 | netif_wake_queue(adapter->netdev); |
1649 | adapter->stats.tx_restart_count++; | 1646 | adapter->stats.tx_restart_count++; |
1650 | pr_debug("Tx wake queue\n"); | 1647 | pr_debug("Tx wake queue\n"); |
1651 | } | 1648 | } |
1652 | spin_lock(&adapter->tx_queue_lock); | 1649 | |
1653 | tx_ring->next_to_clean = i; | 1650 | tx_ring->next_to_clean = i; |
1654 | spin_unlock(&adapter->tx_queue_lock); | 1651 | |
1655 | pr_debug("next_to_clean : %d\n", tx_ring->next_to_clean); | 1652 | pr_debug("next_to_clean : %d\n", tx_ring->next_to_clean); |
1653 | spin_unlock(&tx_ring->tx_lock); | ||
1656 | return cleaned; | 1654 | return cleaned; |
1657 | } | 1655 | } |
1658 | 1656 | ||
@@ -2043,7 +2041,6 @@ static int pch_gbe_sw_init(struct pch_gbe_adapter *adapter) | |||
2043 | return -ENOMEM; | 2041 | return -ENOMEM; |
2044 | } | 2042 | } |
2045 | spin_lock_init(&adapter->hw.miim_lock); | 2043 | spin_lock_init(&adapter->hw.miim_lock); |
2046 | spin_lock_init(&adapter->tx_queue_lock); | ||
2047 | spin_lock_init(&adapter->stats_lock); | 2044 | spin_lock_init(&adapter->stats_lock); |
2048 | spin_lock_init(&adapter->ethtool_lock); | 2045 | spin_lock_init(&adapter->ethtool_lock); |
2049 | atomic_set(&adapter->irq_sem, 0); | 2046 | atomic_set(&adapter->irq_sem, 0); |
@@ -2148,10 +2145,10 @@ static int pch_gbe_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
2148 | tx_ring->next_to_use, tx_ring->next_to_clean); | 2145 | tx_ring->next_to_use, tx_ring->next_to_clean); |
2149 | return NETDEV_TX_BUSY; | 2146 | return NETDEV_TX_BUSY; |
2150 | } | 2147 | } |
2151 | spin_unlock_irqrestore(&tx_ring->tx_lock, flags); | ||
2152 | 2148 | ||
2153 | /* CRC,ITAG no support */ | 2149 | /* CRC,ITAG no support */ |
2154 | pch_gbe_tx_queue(adapter, tx_ring, skb); | 2150 | pch_gbe_tx_queue(adapter, tx_ring, skb); |
2151 | spin_unlock_irqrestore(&tx_ring->tx_lock, flags); | ||
2155 | return NETDEV_TX_OK; | 2152 | return NETDEV_TX_OK; |
2156 | } | 2153 | } |
2157 | 2154 | ||
diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c index 00628d84342f..4f74b9762c29 100644 --- a/drivers/net/ethernet/realtek/r8169.c +++ b/drivers/net/ethernet/realtek/r8169.c | |||
@@ -63,8 +63,12 @@ | |||
63 | #define R8169_MSG_DEFAULT \ | 63 | #define R8169_MSG_DEFAULT \ |
64 | (NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_IFUP | NETIF_MSG_IFDOWN) | 64 | (NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_IFUP | NETIF_MSG_IFDOWN) |
65 | 65 | ||
66 | #define TX_BUFFS_AVAIL(tp) \ | 66 | #define TX_SLOTS_AVAIL(tp) \ |
67 | (tp->dirty_tx + NUM_TX_DESC - tp->cur_tx - 1) | 67 | (tp->dirty_tx + NUM_TX_DESC - tp->cur_tx) |
68 | |||
69 | /* A skbuff with nr_frags needs nr_frags+1 entries in the tx queue */ | ||
70 | #define TX_FRAGS_READY_FOR(tp,nr_frags) \ | ||
71 | (TX_SLOTS_AVAIL(tp) >= (nr_frags + 1)) | ||
68 | 72 | ||
69 | /* Maximum number of multicast addresses to filter (vs. Rx-all-multicast). | 73 | /* Maximum number of multicast addresses to filter (vs. Rx-all-multicast). |
70 | The RTL chips use a 64 element hash table based on the Ethernet CRC. */ | 74 | The RTL chips use a 64 element hash table based on the Ethernet CRC. */ |
@@ -5494,7 +5498,7 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb, | |||
5494 | u32 opts[2]; | 5498 | u32 opts[2]; |
5495 | int frags; | 5499 | int frags; |
5496 | 5500 | ||
5497 | if (unlikely(TX_BUFFS_AVAIL(tp) < skb_shinfo(skb)->nr_frags)) { | 5501 | if (unlikely(!TX_FRAGS_READY_FOR(tp, skb_shinfo(skb)->nr_frags))) { |
5498 | netif_err(tp, drv, dev, "BUG! Tx Ring full when queue awake!\n"); | 5502 | netif_err(tp, drv, dev, "BUG! Tx Ring full when queue awake!\n"); |
5499 | goto err_stop_0; | 5503 | goto err_stop_0; |
5500 | } | 5504 | } |
@@ -5548,7 +5552,7 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb, | |||
5548 | 5552 | ||
5549 | mmiowb(); | 5553 | mmiowb(); |
5550 | 5554 | ||
5551 | if (TX_BUFFS_AVAIL(tp) < MAX_SKB_FRAGS) { | 5555 | if (!TX_FRAGS_READY_FOR(tp, MAX_SKB_FRAGS)) { |
5552 | /* Avoid wrongly optimistic queue wake-up: rtl_tx thread must | 5556 | /* Avoid wrongly optimistic queue wake-up: rtl_tx thread must |
5553 | * not miss a ring update when it notices a stopped queue. | 5557 | * not miss a ring update when it notices a stopped queue. |
5554 | */ | 5558 | */ |
@@ -5562,7 +5566,7 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb, | |||
5562 | * can't. | 5566 | * can't. |
5563 | */ | 5567 | */ |
5564 | smp_mb(); | 5568 | smp_mb(); |
5565 | if (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS) | 5569 | if (TX_FRAGS_READY_FOR(tp, MAX_SKB_FRAGS)) |
5566 | netif_wake_queue(dev); | 5570 | netif_wake_queue(dev); |
5567 | } | 5571 | } |
5568 | 5572 | ||
@@ -5685,7 +5689,7 @@ static void rtl_tx(struct net_device *dev, struct rtl8169_private *tp) | |||
5685 | */ | 5689 | */ |
5686 | smp_mb(); | 5690 | smp_mb(); |
5687 | if (netif_queue_stopped(dev) && | 5691 | if (netif_queue_stopped(dev) && |
5688 | (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)) { | 5692 | TX_FRAGS_READY_FOR(tp, MAX_SKB_FRAGS)) { |
5689 | netif_wake_queue(dev); | 5693 | netif_wake_queue(dev); |
5690 | } | 5694 | } |
5691 | /* | 5695 | /* |
diff --git a/drivers/net/ethernet/sfc/efx.c b/drivers/net/ethernet/sfc/efx.c index 8253d2155fe3..b95f2e1b33f0 100644 --- a/drivers/net/ethernet/sfc/efx.c +++ b/drivers/net/ethernet/sfc/efx.c | |||
@@ -1354,7 +1354,7 @@ static int efx_probe_interrupts(struct efx_nic *efx) | |||
1354 | } | 1354 | } |
1355 | 1355 | ||
1356 | /* RSS might be usable on VFs even if it is disabled on the PF */ | 1356 | /* RSS might be usable on VFs even if it is disabled on the PF */ |
1357 | efx->rss_spread = (efx->n_rx_channels > 1 ? | 1357 | efx->rss_spread = ((efx->n_rx_channels > 1 || !efx_sriov_wanted(efx)) ? |
1358 | efx->n_rx_channels : efx_vf_size(efx)); | 1358 | efx->n_rx_channels : efx_vf_size(efx)); |
1359 | 1359 | ||
1360 | return 0; | 1360 | return 0; |
diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c index ebacec1944ed..66a9bfe7b1c8 100644 --- a/drivers/net/macvlan.c +++ b/drivers/net/macvlan.c | |||
@@ -258,7 +258,7 @@ static int macvlan_queue_xmit(struct sk_buff *skb, struct net_device *dev) | |||
258 | 258 | ||
259 | xmit_world: | 259 | xmit_world: |
260 | skb->ip_summed = ip_summed; | 260 | skb->ip_summed = ip_summed; |
261 | skb_set_dev(skb, vlan->lowerdev); | 261 | skb->dev = vlan->lowerdev; |
262 | return dev_queue_xmit(skb); | 262 | return dev_queue_xmit(skb); |
263 | } | 263 | } |
264 | 264 | ||
diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c index 163559c16988..2ee56de7b0ca 100644 --- a/drivers/net/macvtap.c +++ b/drivers/net/macvtap.c | |||
@@ -1,5 +1,6 @@ | |||
1 | #include <linux/etherdevice.h> | 1 | #include <linux/etherdevice.h> |
2 | #include <linux/if_macvlan.h> | 2 | #include <linux/if_macvlan.h> |
3 | #include <linux/if_vlan.h> | ||
3 | #include <linux/interrupt.h> | 4 | #include <linux/interrupt.h> |
4 | #include <linux/nsproxy.h> | 5 | #include <linux/nsproxy.h> |
5 | #include <linux/compat.h> | 6 | #include <linux/compat.h> |
@@ -782,6 +783,8 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q, | |||
782 | struct macvlan_dev *vlan; | 783 | struct macvlan_dev *vlan; |
783 | int ret; | 784 | int ret; |
784 | int vnet_hdr_len = 0; | 785 | int vnet_hdr_len = 0; |
786 | int vlan_offset = 0; | ||
787 | int copied; | ||
785 | 788 | ||
786 | if (q->flags & IFF_VNET_HDR) { | 789 | if (q->flags & IFF_VNET_HDR) { |
787 | struct virtio_net_hdr vnet_hdr; | 790 | struct virtio_net_hdr vnet_hdr; |
@@ -796,18 +799,48 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q, | |||
796 | if (memcpy_toiovecend(iv, (void *)&vnet_hdr, 0, sizeof(vnet_hdr))) | 799 | if (memcpy_toiovecend(iv, (void *)&vnet_hdr, 0, sizeof(vnet_hdr))) |
797 | return -EFAULT; | 800 | return -EFAULT; |
798 | } | 801 | } |
802 | copied = vnet_hdr_len; | ||
803 | |||
804 | if (!vlan_tx_tag_present(skb)) | ||
805 | len = min_t(int, skb->len, len); | ||
806 | else { | ||
807 | int copy; | ||
808 | struct { | ||
809 | __be16 h_vlan_proto; | ||
810 | __be16 h_vlan_TCI; | ||
811 | } veth; | ||
812 | veth.h_vlan_proto = htons(ETH_P_8021Q); | ||
813 | veth.h_vlan_TCI = htons(vlan_tx_tag_get(skb)); | ||
814 | |||
815 | vlan_offset = offsetof(struct vlan_ethhdr, h_vlan_proto); | ||
816 | len = min_t(int, skb->len + VLAN_HLEN, len); | ||
817 | |||
818 | copy = min_t(int, vlan_offset, len); | ||
819 | ret = skb_copy_datagram_const_iovec(skb, 0, iv, copied, copy); | ||
820 | len -= copy; | ||
821 | copied += copy; | ||
822 | if (ret || !len) | ||
823 | goto done; | ||
824 | |||
825 | copy = min_t(int, sizeof(veth), len); | ||
826 | ret = memcpy_toiovecend(iv, (void *)&veth, copied, copy); | ||
827 | len -= copy; | ||
828 | copied += copy; | ||
829 | if (ret || !len) | ||
830 | goto done; | ||
831 | } | ||
799 | 832 | ||
800 | len = min_t(int, skb->len, len); | 833 | ret = skb_copy_datagram_const_iovec(skb, vlan_offset, iv, copied, len); |
801 | 834 | copied += len; | |
802 | ret = skb_copy_datagram_const_iovec(skb, 0, iv, vnet_hdr_len, len); | ||
803 | 835 | ||
836 | done: | ||
804 | rcu_read_lock_bh(); | 837 | rcu_read_lock_bh(); |
805 | vlan = rcu_dereference_bh(q->vlan); | 838 | vlan = rcu_dereference_bh(q->vlan); |
806 | if (vlan) | 839 | if (vlan) |
807 | macvlan_count_rx(vlan, len, ret == 0, 0); | 840 | macvlan_count_rx(vlan, copied - vnet_hdr_len, ret == 0, 0); |
808 | rcu_read_unlock_bh(); | 841 | rcu_read_unlock_bh(); |
809 | 842 | ||
810 | return ret ? ret : (len + vnet_hdr_len); | 843 | return ret ? ret : copied; |
811 | } | 844 | } |
812 | 845 | ||
813 | static ssize_t macvtap_do_read(struct macvtap_queue *q, struct kiocb *iocb, | 846 | static ssize_t macvtap_do_read(struct macvtap_queue *q, struct kiocb *iocb, |
diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c index 00880edba048..425e201f597c 100644 --- a/drivers/net/usb/cdc_ether.c +++ b/drivers/net/usb/cdc_ether.c | |||
@@ -485,6 +485,7 @@ static const struct driver_info wwan_info = { | |||
485 | /*-------------------------------------------------------------------------*/ | 485 | /*-------------------------------------------------------------------------*/ |
486 | 486 | ||
487 | #define HUAWEI_VENDOR_ID 0x12D1 | 487 | #define HUAWEI_VENDOR_ID 0x12D1 |
488 | #define NOVATEL_VENDOR_ID 0x1410 | ||
488 | 489 | ||
489 | static const struct usb_device_id products [] = { | 490 | static const struct usb_device_id products [] = { |
490 | /* | 491 | /* |
@@ -602,6 +603,21 @@ static const struct usb_device_id products [] = { | |||
602 | * because of bugs/quirks in a given product (like Zaurus, above). | 603 | * because of bugs/quirks in a given product (like Zaurus, above). |
603 | */ | 604 | */ |
604 | { | 605 | { |
606 | /* Novatel USB551L */ | ||
607 | /* This match must come *before* the generic CDC-ETHER match so that | ||
608 | * we get FLAG_WWAN set on the device, since it's descriptors are | ||
609 | * generic CDC-ETHER. | ||
610 | */ | ||
611 | .match_flags = USB_DEVICE_ID_MATCH_VENDOR | ||
612 | | USB_DEVICE_ID_MATCH_PRODUCT | ||
613 | | USB_DEVICE_ID_MATCH_INT_INFO, | ||
614 | .idVendor = NOVATEL_VENDOR_ID, | ||
615 | .idProduct = 0xB001, | ||
616 | .bInterfaceClass = USB_CLASS_COMM, | ||
617 | .bInterfaceSubClass = USB_CDC_SUBCLASS_ETHERNET, | ||
618 | .bInterfaceProtocol = USB_CDC_PROTO_NONE, | ||
619 | .driver_info = (unsigned long)&wwan_info, | ||
620 | }, { | ||
605 | USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ETHERNET, | 621 | USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ETHERNET, |
606 | USB_CDC_PROTO_NONE), | 622 | USB_CDC_PROTO_NONE), |
607 | .driver_info = (unsigned long) &cdc_info, | 623 | .driver_info = (unsigned long) &cdc_info, |
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index 80b837c88f0d..9f58330f1312 100644 --- a/drivers/net/usb/usbnet.c +++ b/drivers/net/usb/usbnet.c | |||
@@ -282,17 +282,32 @@ int usbnet_change_mtu (struct net_device *net, int new_mtu) | |||
282 | } | 282 | } |
283 | EXPORT_SYMBOL_GPL(usbnet_change_mtu); | 283 | EXPORT_SYMBOL_GPL(usbnet_change_mtu); |
284 | 284 | ||
285 | /* The caller must hold list->lock */ | ||
286 | static void __usbnet_queue_skb(struct sk_buff_head *list, | ||
287 | struct sk_buff *newsk, enum skb_state state) | ||
288 | { | ||
289 | struct skb_data *entry = (struct skb_data *) newsk->cb; | ||
290 | |||
291 | __skb_queue_tail(list, newsk); | ||
292 | entry->state = state; | ||
293 | } | ||
294 | |||
285 | /*-------------------------------------------------------------------------*/ | 295 | /*-------------------------------------------------------------------------*/ |
286 | 296 | ||
287 | /* some LK 2.4 HCDs oopsed if we freed or resubmitted urbs from | 297 | /* some LK 2.4 HCDs oopsed if we freed or resubmitted urbs from |
288 | * completion callbacks. 2.5 should have fixed those bugs... | 298 | * completion callbacks. 2.5 should have fixed those bugs... |
289 | */ | 299 | */ |
290 | 300 | ||
291 | static void defer_bh(struct usbnet *dev, struct sk_buff *skb, struct sk_buff_head *list) | 301 | static enum skb_state defer_bh(struct usbnet *dev, struct sk_buff *skb, |
302 | struct sk_buff_head *list, enum skb_state state) | ||
292 | { | 303 | { |
293 | unsigned long flags; | 304 | unsigned long flags; |
305 | enum skb_state old_state; | ||
306 | struct skb_data *entry = (struct skb_data *) skb->cb; | ||
294 | 307 | ||
295 | spin_lock_irqsave(&list->lock, flags); | 308 | spin_lock_irqsave(&list->lock, flags); |
309 | old_state = entry->state; | ||
310 | entry->state = state; | ||
296 | __skb_unlink(skb, list); | 311 | __skb_unlink(skb, list); |
297 | spin_unlock(&list->lock); | 312 | spin_unlock(&list->lock); |
298 | spin_lock(&dev->done.lock); | 313 | spin_lock(&dev->done.lock); |
@@ -300,6 +315,7 @@ static void defer_bh(struct usbnet *dev, struct sk_buff *skb, struct sk_buff_hea | |||
300 | if (dev->done.qlen == 1) | 315 | if (dev->done.qlen == 1) |
301 | tasklet_schedule(&dev->bh); | 316 | tasklet_schedule(&dev->bh); |
302 | spin_unlock_irqrestore(&dev->done.lock, flags); | 317 | spin_unlock_irqrestore(&dev->done.lock, flags); |
318 | return old_state; | ||
303 | } | 319 | } |
304 | 320 | ||
305 | /* some work can't be done in tasklets, so we use keventd | 321 | /* some work can't be done in tasklets, so we use keventd |
@@ -340,7 +356,6 @@ static int rx_submit (struct usbnet *dev, struct urb *urb, gfp_t flags) | |||
340 | entry = (struct skb_data *) skb->cb; | 356 | entry = (struct skb_data *) skb->cb; |
341 | entry->urb = urb; | 357 | entry->urb = urb; |
342 | entry->dev = dev; | 358 | entry->dev = dev; |
343 | entry->state = rx_start; | ||
344 | entry->length = 0; | 359 | entry->length = 0; |
345 | 360 | ||
346 | usb_fill_bulk_urb (urb, dev->udev, dev->in, | 361 | usb_fill_bulk_urb (urb, dev->udev, dev->in, |
@@ -372,7 +387,7 @@ static int rx_submit (struct usbnet *dev, struct urb *urb, gfp_t flags) | |||
372 | tasklet_schedule (&dev->bh); | 387 | tasklet_schedule (&dev->bh); |
373 | break; | 388 | break; |
374 | case 0: | 389 | case 0: |
375 | __skb_queue_tail (&dev->rxq, skb); | 390 | __usbnet_queue_skb(&dev->rxq, skb, rx_start); |
376 | } | 391 | } |
377 | } else { | 392 | } else { |
378 | netif_dbg(dev, ifdown, dev->net, "rx: stopped\n"); | 393 | netif_dbg(dev, ifdown, dev->net, "rx: stopped\n"); |
@@ -423,16 +438,17 @@ static void rx_complete (struct urb *urb) | |||
423 | struct skb_data *entry = (struct skb_data *) skb->cb; | 438 | struct skb_data *entry = (struct skb_data *) skb->cb; |
424 | struct usbnet *dev = entry->dev; | 439 | struct usbnet *dev = entry->dev; |
425 | int urb_status = urb->status; | 440 | int urb_status = urb->status; |
441 | enum skb_state state; | ||
426 | 442 | ||
427 | skb_put (skb, urb->actual_length); | 443 | skb_put (skb, urb->actual_length); |
428 | entry->state = rx_done; | 444 | state = rx_done; |
429 | entry->urb = NULL; | 445 | entry->urb = NULL; |
430 | 446 | ||
431 | switch (urb_status) { | 447 | switch (urb_status) { |
432 | /* success */ | 448 | /* success */ |
433 | case 0: | 449 | case 0: |
434 | if (skb->len < dev->net->hard_header_len) { | 450 | if (skb->len < dev->net->hard_header_len) { |
435 | entry->state = rx_cleanup; | 451 | state = rx_cleanup; |
436 | dev->net->stats.rx_errors++; | 452 | dev->net->stats.rx_errors++; |
437 | dev->net->stats.rx_length_errors++; | 453 | dev->net->stats.rx_length_errors++; |
438 | netif_dbg(dev, rx_err, dev->net, | 454 | netif_dbg(dev, rx_err, dev->net, |
@@ -471,7 +487,7 @@ static void rx_complete (struct urb *urb) | |||
471 | "rx throttle %d\n", urb_status); | 487 | "rx throttle %d\n", urb_status); |
472 | } | 488 | } |
473 | block: | 489 | block: |
474 | entry->state = rx_cleanup; | 490 | state = rx_cleanup; |
475 | entry->urb = urb; | 491 | entry->urb = urb; |
476 | urb = NULL; | 492 | urb = NULL; |
477 | break; | 493 | break; |
@@ -482,17 +498,18 @@ block: | |||
482 | // FALLTHROUGH | 498 | // FALLTHROUGH |
483 | 499 | ||
484 | default: | 500 | default: |
485 | entry->state = rx_cleanup; | 501 | state = rx_cleanup; |
486 | dev->net->stats.rx_errors++; | 502 | dev->net->stats.rx_errors++; |
487 | netif_dbg(dev, rx_err, dev->net, "rx status %d\n", urb_status); | 503 | netif_dbg(dev, rx_err, dev->net, "rx status %d\n", urb_status); |
488 | break; | 504 | break; |
489 | } | 505 | } |
490 | 506 | ||
491 | defer_bh(dev, skb, &dev->rxq); | 507 | state = defer_bh(dev, skb, &dev->rxq, state); |
492 | 508 | ||
493 | if (urb) { | 509 | if (urb) { |
494 | if (netif_running (dev->net) && | 510 | if (netif_running (dev->net) && |
495 | !test_bit (EVENT_RX_HALT, &dev->flags)) { | 511 | !test_bit (EVENT_RX_HALT, &dev->flags) && |
512 | state != unlink_start) { | ||
496 | rx_submit (dev, urb, GFP_ATOMIC); | 513 | rx_submit (dev, urb, GFP_ATOMIC); |
497 | usb_mark_last_busy(dev->udev); | 514 | usb_mark_last_busy(dev->udev); |
498 | return; | 515 | return; |
@@ -579,16 +596,23 @@ EXPORT_SYMBOL_GPL(usbnet_purge_paused_rxq); | |||
579 | static int unlink_urbs (struct usbnet *dev, struct sk_buff_head *q) | 596 | static int unlink_urbs (struct usbnet *dev, struct sk_buff_head *q) |
580 | { | 597 | { |
581 | unsigned long flags; | 598 | unsigned long flags; |
582 | struct sk_buff *skb, *skbnext; | 599 | struct sk_buff *skb; |
583 | int count = 0; | 600 | int count = 0; |
584 | 601 | ||
585 | spin_lock_irqsave (&q->lock, flags); | 602 | spin_lock_irqsave (&q->lock, flags); |
586 | skb_queue_walk_safe(q, skb, skbnext) { | 603 | while (!skb_queue_empty(q)) { |
587 | struct skb_data *entry; | 604 | struct skb_data *entry; |
588 | struct urb *urb; | 605 | struct urb *urb; |
589 | int retval; | 606 | int retval; |
590 | 607 | ||
591 | entry = (struct skb_data *) skb->cb; | 608 | skb_queue_walk(q, skb) { |
609 | entry = (struct skb_data *) skb->cb; | ||
610 | if (entry->state != unlink_start) | ||
611 | goto found; | ||
612 | } | ||
613 | break; | ||
614 | found: | ||
615 | entry->state = unlink_start; | ||
592 | urb = entry->urb; | 616 | urb = entry->urb; |
593 | 617 | ||
594 | /* | 618 | /* |
@@ -1040,8 +1064,7 @@ static void tx_complete (struct urb *urb) | |||
1040 | } | 1064 | } |
1041 | 1065 | ||
1042 | usb_autopm_put_interface_async(dev->intf); | 1066 | usb_autopm_put_interface_async(dev->intf); |
1043 | entry->state = tx_done; | 1067 | (void) defer_bh(dev, skb, &dev->txq, tx_done); |
1044 | defer_bh(dev, skb, &dev->txq); | ||
1045 | } | 1068 | } |
1046 | 1069 | ||
1047 | /*-------------------------------------------------------------------------*/ | 1070 | /*-------------------------------------------------------------------------*/ |
@@ -1097,7 +1120,6 @@ netdev_tx_t usbnet_start_xmit (struct sk_buff *skb, | |||
1097 | entry = (struct skb_data *) skb->cb; | 1120 | entry = (struct skb_data *) skb->cb; |
1098 | entry->urb = urb; | 1121 | entry->urb = urb; |
1099 | entry->dev = dev; | 1122 | entry->dev = dev; |
1100 | entry->state = tx_start; | ||
1101 | entry->length = length; | 1123 | entry->length = length; |
1102 | 1124 | ||
1103 | usb_fill_bulk_urb (urb, dev->udev, dev->out, | 1125 | usb_fill_bulk_urb (urb, dev->udev, dev->out, |
@@ -1156,7 +1178,7 @@ netdev_tx_t usbnet_start_xmit (struct sk_buff *skb, | |||
1156 | break; | 1178 | break; |
1157 | case 0: | 1179 | case 0: |
1158 | net->trans_start = jiffies; | 1180 | net->trans_start = jiffies; |
1159 | __skb_queue_tail (&dev->txq, skb); | 1181 | __usbnet_queue_skb(&dev->txq, skb, tx_start); |
1160 | if (dev->txq.qlen >= TX_QLEN (dev)) | 1182 | if (dev->txq.qlen >= TX_QLEN (dev)) |
1161 | netif_stop_queue (net); | 1183 | netif_stop_queue (net); |
1162 | } | 1184 | } |
diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c index f7868c0d79ed..2062ea1d7c80 100644 --- a/drivers/net/wireless/rtlwifi/pci.c +++ b/drivers/net/wireless/rtlwifi/pci.c | |||
@@ -1853,14 +1853,6 @@ int __devinit rtl_pci_probe(struct pci_dev *pdev, | |||
1853 | /*like read eeprom and so on */ | 1853 | /*like read eeprom and so on */ |
1854 | rtlpriv->cfg->ops->read_eeprom_info(hw); | 1854 | rtlpriv->cfg->ops->read_eeprom_info(hw); |
1855 | 1855 | ||
1856 | if (rtlpriv->cfg->ops->init_sw_vars(hw)) { | ||
1857 | RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Can't init_sw_vars\n"); | ||
1858 | err = -ENODEV; | ||
1859 | goto fail3; | ||
1860 | } | ||
1861 | |||
1862 | rtlpriv->cfg->ops->init_sw_leds(hw); | ||
1863 | |||
1864 | /*aspm */ | 1856 | /*aspm */ |
1865 | rtl_pci_init_aspm(hw); | 1857 | rtl_pci_init_aspm(hw); |
1866 | 1858 | ||
@@ -1879,6 +1871,14 @@ int __devinit rtl_pci_probe(struct pci_dev *pdev, | |||
1879 | goto fail3; | 1871 | goto fail3; |
1880 | } | 1872 | } |
1881 | 1873 | ||
1874 | if (rtlpriv->cfg->ops->init_sw_vars(hw)) { | ||
1875 | RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Can't init_sw_vars\n"); | ||
1876 | err = -ENODEV; | ||
1877 | goto fail3; | ||
1878 | } | ||
1879 | |||
1880 | rtlpriv->cfg->ops->init_sw_leds(hw); | ||
1881 | |||
1882 | err = sysfs_create_group(&pdev->dev.kobj, &rtl_attribute_group); | 1882 | err = sysfs_create_group(&pdev->dev.kobj, &rtl_attribute_group); |
1883 | if (err) { | 1883 | if (err) { |
1884 | RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, | 1884 | RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, |
diff --git a/drivers/net/wireless/rtlwifi/usb.c b/drivers/net/wireless/rtlwifi/usb.c index d04dbda13f5a..a6049d7d51b3 100644 --- a/drivers/net/wireless/rtlwifi/usb.c +++ b/drivers/net/wireless/rtlwifi/usb.c | |||
@@ -971,11 +971,6 @@ int __devinit rtl_usb_probe(struct usb_interface *intf, | |||
971 | rtlpriv->cfg->ops->read_chip_version(hw); | 971 | rtlpriv->cfg->ops->read_chip_version(hw); |
972 | /*like read eeprom and so on */ | 972 | /*like read eeprom and so on */ |
973 | rtlpriv->cfg->ops->read_eeprom_info(hw); | 973 | rtlpriv->cfg->ops->read_eeprom_info(hw); |
974 | if (rtlpriv->cfg->ops->init_sw_vars(hw)) { | ||
975 | RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Can't init_sw_vars\n"); | ||
976 | goto error_out; | ||
977 | } | ||
978 | rtlpriv->cfg->ops->init_sw_leds(hw); | ||
979 | err = _rtl_usb_init(hw); | 974 | err = _rtl_usb_init(hw); |
980 | if (err) | 975 | if (err) |
981 | goto error_out; | 976 | goto error_out; |
@@ -987,6 +982,11 @@ int __devinit rtl_usb_probe(struct usb_interface *intf, | |||
987 | "Can't allocate sw for mac80211\n"); | 982 | "Can't allocate sw for mac80211\n"); |
988 | goto error_out; | 983 | goto error_out; |
989 | } | 984 | } |
985 | if (rtlpriv->cfg->ops->init_sw_vars(hw)) { | ||
986 | RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Can't init_sw_vars\n"); | ||
987 | goto error_out; | ||
988 | } | ||
989 | rtlpriv->cfg->ops->init_sw_leds(hw); | ||
990 | 990 | ||
991 | return 0; | 991 | return 0; |
992 | error_out: | 992 | error_out: |
diff --git a/drivers/parisc/sba_iommu.c b/drivers/parisc/sba_iommu.c index 8644d5372e7f..42cfcd9eb9aa 100644 --- a/drivers/parisc/sba_iommu.c +++ b/drivers/parisc/sba_iommu.c | |||
@@ -44,6 +44,7 @@ | |||
44 | #include <asm/ropes.h> | 44 | #include <asm/ropes.h> |
45 | #include <asm/mckinley.h> /* for proc_mckinley_root */ | 45 | #include <asm/mckinley.h> /* for proc_mckinley_root */ |
46 | #include <asm/runway.h> /* for proc_runway_root */ | 46 | #include <asm/runway.h> /* for proc_runway_root */ |
47 | #include <asm/page.h> /* for PAGE0 */ | ||
47 | #include <asm/pdc.h> /* for PDC_MODEL_* */ | 48 | #include <asm/pdc.h> /* for PDC_MODEL_* */ |
48 | #include <asm/pdcpat.h> /* for is_pdc_pat() */ | 49 | #include <asm/pdcpat.h> /* for is_pdc_pat() */ |
49 | #include <asm/parisc-device.h> | 50 | #include <asm/parisc-device.h> |
diff --git a/drivers/pci/pci-acpi.c b/drivers/pci/pci-acpi.c index 0f150f271c2a..1929c0c63b75 100644 --- a/drivers/pci/pci-acpi.c +++ b/drivers/pci/pci-acpi.c | |||
@@ -200,7 +200,7 @@ static pci_power_t acpi_pci_choose_state(struct pci_dev *pdev) | |||
200 | return PCI_D1; | 200 | return PCI_D1; |
201 | case ACPI_STATE_D2: | 201 | case ACPI_STATE_D2: |
202 | return PCI_D2; | 202 | return PCI_D2; |
203 | case ACPI_STATE_D3: | 203 | case ACPI_STATE_D3_HOT: |
204 | return PCI_D3hot; | 204 | return PCI_D3hot; |
205 | case ACPI_STATE_D3_COLD: | 205 | case ACPI_STATE_D3_COLD: |
206 | return PCI_D3cold; | 206 | return PCI_D3cold; |
@@ -223,7 +223,7 @@ static int acpi_pci_set_power_state(struct pci_dev *dev, pci_power_t state) | |||
223 | [PCI_D0] = ACPI_STATE_D0, | 223 | [PCI_D0] = ACPI_STATE_D0, |
224 | [PCI_D1] = ACPI_STATE_D1, | 224 | [PCI_D1] = ACPI_STATE_D1, |
225 | [PCI_D2] = ACPI_STATE_D2, | 225 | [PCI_D2] = ACPI_STATE_D2, |
226 | [PCI_D3hot] = ACPI_STATE_D3, | 226 | [PCI_D3hot] = ACPI_STATE_D3_HOT, |
227 | [PCI_D3cold] = ACPI_STATE_D3 | 227 | [PCI_D3cold] = ACPI_STATE_D3 |
228 | }; | 228 | }; |
229 | int error = -EINVAL; | 229 | int error = -EINVAL; |
diff --git a/drivers/platform/x86/intel_mid_powerbtn.c b/drivers/platform/x86/intel_mid_powerbtn.c index 0a3594c7e912..bcbad8452a6f 100644 --- a/drivers/platform/x86/intel_mid_powerbtn.c +++ b/drivers/platform/x86/intel_mid_powerbtn.c | |||
@@ -78,7 +78,7 @@ static int __devinit mfld_pb_probe(struct platform_device *pdev) | |||
78 | 78 | ||
79 | input_set_capability(input, EV_KEY, KEY_POWER); | 79 | input_set_capability(input, EV_KEY, KEY_POWER); |
80 | 80 | ||
81 | error = request_threaded_irq(irq, NULL, mfld_pb_isr, 0, | 81 | error = request_threaded_irq(irq, NULL, mfld_pb_isr, IRQF_NO_SUSPEND, |
82 | DRIVER_NAME, input); | 82 | DRIVER_NAME, input); |
83 | if (error) { | 83 | if (error) { |
84 | dev_err(&pdev->dev, "Unable to request irq %d for mfld power" | 84 | dev_err(&pdev->dev, "Unable to request irq %d for mfld power" |
diff --git a/drivers/ptp/ptp_pch.c b/drivers/ptp/ptp_pch.c index 08c331130d88..3a9c17eced10 100644 --- a/drivers/ptp/ptp_pch.c +++ b/drivers/ptp/ptp_pch.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <linux/module.h> | 30 | #include <linux/module.h> |
31 | #include <linux/pci.h> | 31 | #include <linux/pci.h> |
32 | #include <linux/ptp_clock_kernel.h> | 32 | #include <linux/ptp_clock_kernel.h> |
33 | #include <linux/slab.h> | ||
33 | 34 | ||
34 | #define STATION_ADDR_LEN 20 | 35 | #define STATION_ADDR_LEN 20 |
35 | #define PCI_DEVICE_ID_PCH_1588 0x8819 | 36 | #define PCI_DEVICE_ID_PCH_1588 0x8819 |
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index e70dd382a009..046fb1bd8619 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c | |||
@@ -1431,7 +1431,10 @@ void devm_regulator_put(struct regulator *regulator) | |||
1431 | 1431 | ||
1432 | rc = devres_destroy(regulator->dev, devm_regulator_release, | 1432 | rc = devres_destroy(regulator->dev, devm_regulator_release, |
1433 | devm_regulator_match, regulator); | 1433 | devm_regulator_match, regulator); |
1434 | WARN_ON(rc); | 1434 | if (rc == 0) |
1435 | regulator_put(regulator); | ||
1436 | else | ||
1437 | WARN_ON(rc); | ||
1435 | } | 1438 | } |
1436 | EXPORT_SYMBOL_GPL(devm_regulator_put); | 1439 | EXPORT_SYMBOL_GPL(devm_regulator_put); |
1437 | 1440 | ||
diff --git a/drivers/regulator/max8997.c b/drivers/regulator/max8997.c index 96579296f04d..17a58c56eebf 100644 --- a/drivers/regulator/max8997.c +++ b/drivers/regulator/max8997.c | |||
@@ -684,7 +684,7 @@ static int max8997_set_voltage_buck(struct regulator_dev *rdev, | |||
684 | } | 684 | } |
685 | 685 | ||
686 | new_val++; | 686 | new_val++; |
687 | } while (desc->min + desc->step + new_val <= desc->max); | 687 | } while (desc->min + desc->step * new_val <= desc->max); |
688 | 688 | ||
689 | new_idx = tmp_idx; | 689 | new_idx = tmp_idx; |
690 | new_val = tmp_val; | 690 | new_val = tmp_val; |
diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c index ee15c68fb519..e756a0df3664 100644 --- a/drivers/remoteproc/remoteproc_core.c +++ b/drivers/remoteproc/remoteproc_core.c | |||
@@ -354,7 +354,7 @@ static void __rproc_free_vrings(struct rproc_vdev *rvdev, int i) | |||
354 | { | 354 | { |
355 | struct rproc *rproc = rvdev->rproc; | 355 | struct rproc *rproc = rvdev->rproc; |
356 | 356 | ||
357 | for (i--; i > 0; i--) { | 357 | for (i--; i >= 0; i--) { |
358 | struct rproc_vring *rvring = &rvdev->vring[i]; | 358 | struct rproc_vring *rvring = &rvdev->vring[i]; |
359 | int size = PAGE_ALIGN(vring_size(rvring->len, rvring->align)); | 359 | int size = PAGE_ALIGN(vring_size(rvring->len, rvring->align)); |
360 | 360 | ||
diff --git a/drivers/rtc/rtc-mpc5121.c b/drivers/rtc/rtc-mpc5121.c index 42f5f829b3ee..029e421baaed 100644 --- a/drivers/rtc/rtc-mpc5121.c +++ b/drivers/rtc/rtc-mpc5121.c | |||
@@ -360,12 +360,11 @@ static int __devinit mpc5121_rtc_probe(struct platform_device *op) | |||
360 | &mpc5200_rtc_ops, THIS_MODULE); | 360 | &mpc5200_rtc_ops, THIS_MODULE); |
361 | } | 361 | } |
362 | 362 | ||
363 | rtc->rtc->uie_unsupported = 1; | ||
364 | |||
365 | if (IS_ERR(rtc->rtc)) { | 363 | if (IS_ERR(rtc->rtc)) { |
366 | err = PTR_ERR(rtc->rtc); | 364 | err = PTR_ERR(rtc->rtc); |
367 | goto out_free_irq; | 365 | goto out_free_irq; |
368 | } | 366 | } |
367 | rtc->rtc->uie_unsupported = 1; | ||
369 | 368 | ||
370 | return 0; | 369 | return 0; |
371 | 370 | ||
diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c index 351dc0b86fab..a3a056a9db67 100644 --- a/drivers/scsi/hosts.c +++ b/drivers/scsi/hosts.c | |||
@@ -218,6 +218,9 @@ int scsi_add_host_with_dma(struct Scsi_Host *shost, struct device *dev, | |||
218 | 218 | ||
219 | if (!shost->shost_gendev.parent) | 219 | if (!shost->shost_gendev.parent) |
220 | shost->shost_gendev.parent = dev ? dev : &platform_bus; | 220 | shost->shost_gendev.parent = dev ? dev : &platform_bus; |
221 | if (!dma_dev) | ||
222 | dma_dev = shost->shost_gendev.parent; | ||
223 | |||
221 | shost->dma_dev = dma_dev; | 224 | shost->dma_dev = dma_dev; |
222 | 225 | ||
223 | error = device_add(&shost->shost_gendev); | 226 | error = device_add(&shost->shost_gendev); |
diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c index f74cc0602f3b..bc3cc6d91117 100644 --- a/drivers/scsi/qla2xxx/qla_bsg.c +++ b/drivers/scsi/qla2xxx/qla_bsg.c | |||
@@ -1367,6 +1367,9 @@ qla2x00_read_optrom(struct fc_bsg_job *bsg_job) | |||
1367 | struct qla_hw_data *ha = vha->hw; | 1367 | struct qla_hw_data *ha = vha->hw; |
1368 | int rval = 0; | 1368 | int rval = 0; |
1369 | 1369 | ||
1370 | if (ha->flags.isp82xx_reset_hdlr_active) | ||
1371 | return -EBUSY; | ||
1372 | |||
1370 | rval = qla2x00_optrom_setup(bsg_job, vha, 0); | 1373 | rval = qla2x00_optrom_setup(bsg_job, vha, 0); |
1371 | if (rval) | 1374 | if (rval) |
1372 | return rval; | 1375 | return rval; |
diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c index 897731b93df2..62324a1d5573 100644 --- a/drivers/scsi/qla2xxx/qla_dbg.c +++ b/drivers/scsi/qla2xxx/qla_dbg.c | |||
@@ -15,7 +15,7 @@ | |||
15 | * | Mailbox commands | 0x113e | 0x112c-0x112e | | 15 | * | Mailbox commands | 0x113e | 0x112c-0x112e | |
16 | * | | | 0x113a | | 16 | * | | | 0x113a | |
17 | * | Device Discovery | 0x2086 | 0x2020-0x2022 | | 17 | * | Device Discovery | 0x2086 | 0x2020-0x2022 | |
18 | * | Queue Command and IO tracing | 0x302f | 0x3006,0x3008 | | 18 | * | Queue Command and IO tracing | 0x3030 | 0x3006,0x3008 | |
19 | * | | | 0x302d-0x302e | | 19 | * | | | 0x302d-0x302e | |
20 | * | DPC Thread | 0x401c | | | 20 | * | DPC Thread | 0x401c | | |
21 | * | Async Events | 0x505d | 0x502b-0x502f | | 21 | * | Async Events | 0x505d | 0x502b-0x502f | |
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c index f79844ce7122..ce42288049b5 100644 --- a/drivers/scsi/qla2xxx/qla_isr.c +++ b/drivers/scsi/qla2xxx/qla_isr.c | |||
@@ -1715,13 +1715,24 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt) | |||
1715 | res = DID_ERROR << 16; | 1715 | res = DID_ERROR << 16; |
1716 | break; | 1716 | break; |
1717 | } | 1717 | } |
1718 | } else { | 1718 | } else if (lscsi_status != SAM_STAT_TASK_SET_FULL && |
1719 | lscsi_status != SAM_STAT_BUSY) { | ||
1720 | /* | ||
1721 | * scsi status of task set and busy are considered to be | ||
1722 | * task not completed. | ||
1723 | */ | ||
1724 | |||
1719 | ql_dbg(ql_dbg_io, fcport->vha, 0x301f, | 1725 | ql_dbg(ql_dbg_io, fcport->vha, 0x301f, |
1720 | "Dropped frame(s) detected (0x%x " | 1726 | "Dropped frame(s) detected (0x%x " |
1721 | "of 0x%x bytes).\n", resid, scsi_bufflen(cp)); | 1727 | "of 0x%x bytes).\n", resid, |
1728 | scsi_bufflen(cp)); | ||
1722 | 1729 | ||
1723 | res = DID_ERROR << 16 | lscsi_status; | 1730 | res = DID_ERROR << 16 | lscsi_status; |
1724 | goto check_scsi_status; | 1731 | goto check_scsi_status; |
1732 | } else { | ||
1733 | ql_dbg(ql_dbg_io, fcport->vha, 0x3030, | ||
1734 | "scsi_status: 0x%x, lscsi_status: 0x%x\n", | ||
1735 | scsi_status, lscsi_status); | ||
1725 | } | 1736 | } |
1726 | 1737 | ||
1727 | res = DID_OK << 16 | lscsi_status; | 1738 | res = DID_OK << 16 | lscsi_status; |
diff --git a/drivers/scsi/qla2xxx/qla_nx.c b/drivers/scsi/qla2xxx/qla_nx.c index f0528539bbbc..de722a933438 100644 --- a/drivers/scsi/qla2xxx/qla_nx.c +++ b/drivers/scsi/qla2xxx/qla_nx.c | |||
@@ -3125,6 +3125,7 @@ qla82xx_need_reset_handler(scsi_qla_host_t *vha) | |||
3125 | ql_log(ql_log_info, vha, 0x00b7, | 3125 | ql_log(ql_log_info, vha, 0x00b7, |
3126 | "HW State: COLD/RE-INIT.\n"); | 3126 | "HW State: COLD/RE-INIT.\n"); |
3127 | qla82xx_wr_32(ha, QLA82XX_CRB_DEV_STATE, QLA82XX_DEV_COLD); | 3127 | qla82xx_wr_32(ha, QLA82XX_CRB_DEV_STATE, QLA82XX_DEV_COLD); |
3128 | qla82xx_set_rst_ready(ha); | ||
3128 | if (ql2xmdenable) { | 3129 | if (ql2xmdenable) { |
3129 | if (qla82xx_md_collect(vha)) | 3130 | if (qla82xx_md_collect(vha)) |
3130 | ql_log(ql_log_warn, vha, 0xb02c, | 3131 | ql_log(ql_log_warn, vha, 0xb02c, |
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index a2f999273a5f..7db803377c64 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c | |||
@@ -3577,9 +3577,25 @@ void qla2x00_relogin(struct scsi_qla_host *vha) | |||
3577 | continue; | 3577 | continue; |
3578 | /* Attempt a retry. */ | 3578 | /* Attempt a retry. */ |
3579 | status = 1; | 3579 | status = 1; |
3580 | } else | 3580 | } else { |
3581 | status = qla2x00_fabric_login(vha, | 3581 | status = qla2x00_fabric_login(vha, |
3582 | fcport, &next_loopid); | 3582 | fcport, &next_loopid); |
3583 | if (status == QLA_SUCCESS) { | ||
3584 | int status2; | ||
3585 | uint8_t opts; | ||
3586 | |||
3587 | opts = 0; | ||
3588 | if (fcport->flags & | ||
3589 | FCF_FCP2_DEVICE) | ||
3590 | opts |= BIT_1; | ||
3591 | status2 = | ||
3592 | qla2x00_get_port_database( | ||
3593 | vha, fcport, | ||
3594 | opts); | ||
3595 | if (status2 != QLA_SUCCESS) | ||
3596 | status = 1; | ||
3597 | } | ||
3598 | } | ||
3583 | } else | 3599 | } else |
3584 | status = qla2x00_local_device_login(vha, | 3600 | status = qla2x00_local_device_login(vha, |
3585 | fcport); | 3601 | fcport); |
diff --git a/drivers/scsi/qla2xxx/qla_sup.c b/drivers/scsi/qla2xxx/qla_sup.c index 3c13c0a6be63..a683e766d1ae 100644 --- a/drivers/scsi/qla2xxx/qla_sup.c +++ b/drivers/scsi/qla2xxx/qla_sup.c | |||
@@ -1017,6 +1017,9 @@ qla2xxx_flash_npiv_conf(scsi_qla_host_t *vha) | |||
1017 | !IS_CNA_CAPABLE(ha) && !IS_QLA2031(ha)) | 1017 | !IS_CNA_CAPABLE(ha) && !IS_QLA2031(ha)) |
1018 | return; | 1018 | return; |
1019 | 1019 | ||
1020 | if (ha->flags.isp82xx_reset_hdlr_active) | ||
1021 | return; | ||
1022 | |||
1020 | ha->isp_ops->read_optrom(vha, (uint8_t *)&hdr, | 1023 | ha->isp_ops->read_optrom(vha, (uint8_t *)&hdr, |
1021 | ha->flt_region_npiv_conf << 2, sizeof(struct qla_npiv_header)); | 1024 | ha->flt_region_npiv_conf << 2, sizeof(struct qla_npiv_header)); |
1022 | if (hdr.version == __constant_cpu_to_le16(0xffff)) | 1025 | if (hdr.version == __constant_cpu_to_le16(0xffff)) |
diff --git a/drivers/scsi/qla2xxx/qla_version.h b/drivers/scsi/qla2xxx/qla_version.h index 29d780c38040..f5fdb16bec9b 100644 --- a/drivers/scsi/qla2xxx/qla_version.h +++ b/drivers/scsi/qla2xxx/qla_version.h | |||
@@ -7,9 +7,9 @@ | |||
7 | /* | 7 | /* |
8 | * Driver version | 8 | * Driver version |
9 | */ | 9 | */ |
10 | #define QLA2XXX_VERSION "8.03.07.13-k" | 10 | #define QLA2XXX_VERSION "8.04.00.03-k" |
11 | 11 | ||
12 | #define QLA_DRIVER_MAJOR_VER 8 | 12 | #define QLA_DRIVER_MAJOR_VER 8 |
13 | #define QLA_DRIVER_MINOR_VER 3 | 13 | #define QLA_DRIVER_MINOR_VER 4 |
14 | #define QLA_DRIVER_PATCH_VER 7 | 14 | #define QLA_DRIVER_PATCH_VER 0 |
15 | #define QLA_DRIVER_BETA_VER 3 | 15 | #define QLA_DRIVER_BETA_VER 3 |
diff --git a/drivers/scsi/virtio_scsi.c b/drivers/scsi/virtio_scsi.c index efccd72c4a3e..1b3843117268 100644 --- a/drivers/scsi/virtio_scsi.c +++ b/drivers/scsi/virtio_scsi.c | |||
@@ -175,7 +175,8 @@ static void virtscsi_complete_free(void *buf) | |||
175 | 175 | ||
176 | if (cmd->comp) | 176 | if (cmd->comp) |
177 | complete_all(cmd->comp); | 177 | complete_all(cmd->comp); |
178 | mempool_free(cmd, virtscsi_cmd_pool); | 178 | else |
179 | mempool_free(cmd, virtscsi_cmd_pool); | ||
179 | } | 180 | } |
180 | 181 | ||
181 | static void virtscsi_ctrl_done(struct virtqueue *vq) | 182 | static void virtscsi_ctrl_done(struct virtqueue *vq) |
@@ -311,21 +312,22 @@ out: | |||
311 | static int virtscsi_tmf(struct virtio_scsi *vscsi, struct virtio_scsi_cmd *cmd) | 312 | static int virtscsi_tmf(struct virtio_scsi *vscsi, struct virtio_scsi_cmd *cmd) |
312 | { | 313 | { |
313 | DECLARE_COMPLETION_ONSTACK(comp); | 314 | DECLARE_COMPLETION_ONSTACK(comp); |
314 | int ret; | 315 | int ret = FAILED; |
315 | 316 | ||
316 | cmd->comp = ∁ | 317 | cmd->comp = ∁ |
317 | ret = virtscsi_kick_cmd(vscsi, vscsi->ctrl_vq, cmd, | 318 | if (virtscsi_kick_cmd(vscsi, vscsi->ctrl_vq, cmd, |
318 | sizeof cmd->req.tmf, sizeof cmd->resp.tmf, | 319 | sizeof cmd->req.tmf, sizeof cmd->resp.tmf, |
319 | GFP_NOIO); | 320 | GFP_NOIO) < 0) |
320 | if (ret < 0) | 321 | goto out; |
321 | return FAILED; | ||
322 | 322 | ||
323 | wait_for_completion(&comp); | 323 | wait_for_completion(&comp); |
324 | if (cmd->resp.tmf.response != VIRTIO_SCSI_S_OK && | 324 | if (cmd->resp.tmf.response == VIRTIO_SCSI_S_OK || |
325 | cmd->resp.tmf.response != VIRTIO_SCSI_S_FUNCTION_SUCCEEDED) | 325 | cmd->resp.tmf.response == VIRTIO_SCSI_S_FUNCTION_SUCCEEDED) |
326 | return FAILED; | 326 | ret = SUCCESS; |
327 | 327 | ||
328 | return SUCCESS; | 328 | out: |
329 | mempool_free(cmd, virtscsi_cmd_pool); | ||
330 | return ret; | ||
329 | } | 331 | } |
330 | 332 | ||
331 | static int virtscsi_device_reset(struct scsi_cmnd *sc) | 333 | static int virtscsi_device_reset(struct scsi_cmnd *sc) |
diff --git a/drivers/target/target_core_tpg.c b/drivers/target/target_core_tpg.c index 70c3ffb981e7..e320ec24aa1b 100644 --- a/drivers/target/target_core_tpg.c +++ b/drivers/target/target_core_tpg.c | |||
@@ -60,7 +60,6 @@ static void core_clear_initiator_node_from_tpg( | |||
60 | int i; | 60 | int i; |
61 | struct se_dev_entry *deve; | 61 | struct se_dev_entry *deve; |
62 | struct se_lun *lun; | 62 | struct se_lun *lun; |
63 | struct se_lun_acl *acl, *acl_tmp; | ||
64 | 63 | ||
65 | spin_lock_irq(&nacl->device_list_lock); | 64 | spin_lock_irq(&nacl->device_list_lock); |
66 | for (i = 0; i < TRANSPORT_MAX_LUNS_PER_TPG; i++) { | 65 | for (i = 0; i < TRANSPORT_MAX_LUNS_PER_TPG; i++) { |
@@ -81,28 +80,7 @@ static void core_clear_initiator_node_from_tpg( | |||
81 | core_update_device_list_for_node(lun, NULL, deve->mapped_lun, | 80 | core_update_device_list_for_node(lun, NULL, deve->mapped_lun, |
82 | TRANSPORT_LUNFLAGS_NO_ACCESS, nacl, tpg, 0); | 81 | TRANSPORT_LUNFLAGS_NO_ACCESS, nacl, tpg, 0); |
83 | 82 | ||
84 | spin_lock(&lun->lun_acl_lock); | ||
85 | list_for_each_entry_safe(acl, acl_tmp, | ||
86 | &lun->lun_acl_list, lacl_list) { | ||
87 | if (!strcmp(acl->initiatorname, nacl->initiatorname) && | ||
88 | (acl->mapped_lun == deve->mapped_lun)) | ||
89 | break; | ||
90 | } | ||
91 | |||
92 | if (!acl) { | ||
93 | pr_err("Unable to locate struct se_lun_acl for %s," | ||
94 | " mapped_lun: %u\n", nacl->initiatorname, | ||
95 | deve->mapped_lun); | ||
96 | spin_unlock(&lun->lun_acl_lock); | ||
97 | spin_lock_irq(&nacl->device_list_lock); | ||
98 | continue; | ||
99 | } | ||
100 | |||
101 | list_del(&acl->lacl_list); | ||
102 | spin_unlock(&lun->lun_acl_lock); | ||
103 | |||
104 | spin_lock_irq(&nacl->device_list_lock); | 83 | spin_lock_irq(&nacl->device_list_lock); |
105 | kfree(acl); | ||
106 | } | 84 | } |
107 | spin_unlock_irq(&nacl->device_list_lock); | 85 | spin_unlock_irq(&nacl->device_list_lock); |
108 | } | 86 | } |
diff --git a/drivers/tty/vt/keyboard.c b/drivers/tty/vt/keyboard.c index 29ca20dbd335..3b0c4e32ed7b 100644 --- a/drivers/tty/vt/keyboard.c +++ b/drivers/tty/vt/keyboard.c | |||
@@ -2044,7 +2044,7 @@ int vt_do_kdskled(int console, int cmd, unsigned long arg, int perm) | |||
2044 | kbd->default_ledflagstate = ((arg >> 4) & 7); | 2044 | kbd->default_ledflagstate = ((arg >> 4) & 7); |
2045 | set_leds(); | 2045 | set_leds(); |
2046 | spin_unlock_irqrestore(&kbd_event_lock, flags); | 2046 | spin_unlock_irqrestore(&kbd_event_lock, flags); |
2047 | break; | 2047 | return 0; |
2048 | 2048 | ||
2049 | /* the ioctls below only set the lights, not the functions */ | 2049 | /* the ioctls below only set the lights, not the functions */ |
2050 | /* for those, see KDGKBLED and KDSKBLED above */ | 2050 | /* for those, see KDGKBLED and KDSKBLED above */ |
diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c index 853db7a08a26..f82a7394756e 100644 --- a/drivers/vhost/net.c +++ b/drivers/vhost/net.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/if_arp.h> | 24 | #include <linux/if_arp.h> |
25 | #include <linux/if_tun.h> | 25 | #include <linux/if_tun.h> |
26 | #include <linux/if_macvlan.h> | 26 | #include <linux/if_macvlan.h> |
27 | #include <linux/if_vlan.h> | ||
27 | 28 | ||
28 | #include <net/sock.h> | 29 | #include <net/sock.h> |
29 | 30 | ||
@@ -286,8 +287,12 @@ static int peek_head_len(struct sock *sk) | |||
286 | 287 | ||
287 | spin_lock_irqsave(&sk->sk_receive_queue.lock, flags); | 288 | spin_lock_irqsave(&sk->sk_receive_queue.lock, flags); |
288 | head = skb_peek(&sk->sk_receive_queue); | 289 | head = skb_peek(&sk->sk_receive_queue); |
289 | if (likely(head)) | 290 | if (likely(head)) { |
290 | len = head->len; | 291 | len = head->len; |
292 | if (vlan_tx_tag_present(head)) | ||
293 | len += VLAN_HLEN; | ||
294 | } | ||
295 | |||
291 | spin_unlock_irqrestore(&sk->sk_receive_queue.lock, flags); | 296 | spin_unlock_irqrestore(&sk->sk_receive_queue.lock, flags); |
292 | return len; | 297 | return len; |
293 | } | 298 | } |
diff --git a/drivers/video/console/sticore.c b/drivers/video/console/sticore.c index 6468a297e341..39571f9e0162 100644 --- a/drivers/video/console/sticore.c +++ b/drivers/video/console/sticore.c | |||
@@ -22,7 +22,9 @@ | |||
22 | #include <linux/font.h> | 22 | #include <linux/font.h> |
23 | 23 | ||
24 | #include <asm/hardware.h> | 24 | #include <asm/hardware.h> |
25 | #include <asm/page.h> | ||
25 | #include <asm/parisc-device.h> | 26 | #include <asm/parisc-device.h> |
27 | #include <asm/pdc.h> | ||
26 | #include <asm/cacheflush.h> | 28 | #include <asm/cacheflush.h> |
27 | #include <asm/grfioctl.h> | 29 | #include <asm/grfioctl.h> |
28 | 30 | ||
diff --git a/drivers/video/uvesafb.c b/drivers/video/uvesafb.c index 26e83d7fdd6f..b0e2a4261afe 100644 --- a/drivers/video/uvesafb.c +++ b/drivers/video/uvesafb.c | |||
@@ -73,7 +73,7 @@ static void uvesafb_cn_callback(struct cn_msg *msg, struct netlink_skb_parms *ns | |||
73 | struct uvesafb_task *utask; | 73 | struct uvesafb_task *utask; |
74 | struct uvesafb_ktask *task; | 74 | struct uvesafb_ktask *task; |
75 | 75 | ||
76 | if (!cap_raised(current_cap(), CAP_SYS_ADMIN)) | 76 | if (!capable(CAP_SYS_ADMIN)) |
77 | return; | 77 | return; |
78 | 78 | ||
79 | if (msg->seq >= UVESAFB_TASKS_MAX) | 79 | if (msg->seq >= UVESAFB_TASKS_MAX) |
diff --git a/drivers/video/xen-fbfront.c b/drivers/video/xen-fbfront.c index cb4529c40d74..b7f5173ff9e9 100644 --- a/drivers/video/xen-fbfront.c +++ b/drivers/video/xen-fbfront.c | |||
@@ -365,7 +365,7 @@ static int __devinit xenfb_probe(struct xenbus_device *dev, | |||
365 | struct fb_info *fb_info; | 365 | struct fb_info *fb_info; |
366 | int fb_size; | 366 | int fb_size; |
367 | int val; | 367 | int val; |
368 | int ret; | 368 | int ret = 0; |
369 | 369 | ||
370 | info = kzalloc(sizeof(*info), GFP_KERNEL); | 370 | info = kzalloc(sizeof(*info), GFP_KERNEL); |
371 | if (info == NULL) { | 371 | if (info == NULL) { |
@@ -458,26 +458,31 @@ static int __devinit xenfb_probe(struct xenbus_device *dev, | |||
458 | xenfb_init_shared_page(info, fb_info); | 458 | xenfb_init_shared_page(info, fb_info); |
459 | 459 | ||
460 | ret = xenfb_connect_backend(dev, info); | 460 | ret = xenfb_connect_backend(dev, info); |
461 | if (ret < 0) | 461 | if (ret < 0) { |
462 | goto error; | 462 | xenbus_dev_fatal(dev, ret, "xenfb_connect_backend"); |
463 | goto error_fb; | ||
464 | } | ||
463 | 465 | ||
464 | ret = register_framebuffer(fb_info); | 466 | ret = register_framebuffer(fb_info); |
465 | if (ret) { | 467 | if (ret) { |
466 | fb_deferred_io_cleanup(fb_info); | ||
467 | fb_dealloc_cmap(&fb_info->cmap); | ||
468 | framebuffer_release(fb_info); | ||
469 | xenbus_dev_fatal(dev, ret, "register_framebuffer"); | 468 | xenbus_dev_fatal(dev, ret, "register_framebuffer"); |
470 | goto error; | 469 | goto error_fb; |
471 | } | 470 | } |
472 | info->fb_info = fb_info; | 471 | info->fb_info = fb_info; |
473 | 472 | ||
474 | xenfb_make_preferred_console(); | 473 | xenfb_make_preferred_console(); |
475 | return 0; | 474 | return 0; |
476 | 475 | ||
477 | error_nomem: | 476 | error_fb: |
478 | ret = -ENOMEM; | 477 | fb_deferred_io_cleanup(fb_info); |
479 | xenbus_dev_fatal(dev, ret, "allocating device memory"); | 478 | fb_dealloc_cmap(&fb_info->cmap); |
480 | error: | 479 | framebuffer_release(fb_info); |
480 | error_nomem: | ||
481 | if (!ret) { | ||
482 | ret = -ENOMEM; | ||
483 | xenbus_dev_fatal(dev, ret, "allocating device memory"); | ||
484 | } | ||
485 | error: | ||
481 | xenfb_remove(dev); | 486 | xenfb_remove(dev); |
482 | return ret; | 487 | return ret; |
483 | } | 488 | } |
diff --git a/drivers/xen/Kconfig b/drivers/xen/Kconfig index 94243136f6bf..ea20c51d24c7 100644 --- a/drivers/xen/Kconfig +++ b/drivers/xen/Kconfig | |||
@@ -183,15 +183,17 @@ config XEN_ACPI_PROCESSOR | |||
183 | depends on XEN && X86 && ACPI_PROCESSOR && CPU_FREQ | 183 | depends on XEN && X86 && ACPI_PROCESSOR && CPU_FREQ |
184 | default m | 184 | default m |
185 | help | 185 | help |
186 | This ACPI processor uploads Power Management information to the Xen hypervisor. | 186 | This ACPI processor uploads Power Management information to the Xen |
187 | 187 | hypervisor. | |
188 | To do that the driver parses the Power Management data and uploads said | 188 | |
189 | information to the Xen hypervisor. Then the Xen hypervisor can select the | 189 | To do that the driver parses the Power Management data and uploads |
190 | proper Cx and Pxx states. It also registers itslef as the SMM so that | 190 | said information to the Xen hypervisor. Then the Xen hypervisor can |
191 | other drivers (such as ACPI cpufreq scaling driver) will not load. | 191 | select the proper Cx and Pxx states. It also registers itslef as the |
192 | 192 | SMM so that other drivers (such as ACPI cpufreq scaling driver) will | |
193 | To compile this driver as a module, choose M here: the | 193 | not load. |
194 | module will be called xen_acpi_processor If you do not know what to choose, | 194 | |
195 | select M here. If the CPUFREQ drivers are built in, select Y here. | 195 | To compile this driver as a module, choose M here: the module will be |
196 | called xen_acpi_processor If you do not know what to choose, select | ||
197 | M here. If the CPUFREQ drivers are built in, select Y here. | ||
196 | 198 | ||
197 | endmenu | 199 | endmenu |
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c index e801f226d7e0..4106264fbc65 100644 --- a/fs/btrfs/ctree.c +++ b/fs/btrfs/ctree.c | |||
@@ -220,10 +220,12 @@ struct extent_buffer *btrfs_read_lock_root_node(struct btrfs_root *root) | |||
220 | */ | 220 | */ |
221 | static void add_root_to_dirty_list(struct btrfs_root *root) | 221 | static void add_root_to_dirty_list(struct btrfs_root *root) |
222 | { | 222 | { |
223 | spin_lock(&root->fs_info->trans_lock); | ||
223 | if (root->track_dirty && list_empty(&root->dirty_list)) { | 224 | if (root->track_dirty && list_empty(&root->dirty_list)) { |
224 | list_add(&root->dirty_list, | 225 | list_add(&root->dirty_list, |
225 | &root->fs_info->dirty_cowonly_roots); | 226 | &root->fs_info->dirty_cowonly_roots); |
226 | } | 227 | } |
228 | spin_unlock(&root->fs_info->trans_lock); | ||
227 | } | 229 | } |
228 | 230 | ||
229 | /* | 231 | /* |
@@ -723,7 +725,7 @@ int btrfs_realloc_node(struct btrfs_trans_handle *trans, | |||
723 | 725 | ||
724 | cur = btrfs_find_tree_block(root, blocknr, blocksize); | 726 | cur = btrfs_find_tree_block(root, blocknr, blocksize); |
725 | if (cur) | 727 | if (cur) |
726 | uptodate = btrfs_buffer_uptodate(cur, gen); | 728 | uptodate = btrfs_buffer_uptodate(cur, gen, 0); |
727 | else | 729 | else |
728 | uptodate = 0; | 730 | uptodate = 0; |
729 | if (!cur || !uptodate) { | 731 | if (!cur || !uptodate) { |
@@ -1358,7 +1360,12 @@ static noinline int reada_for_balance(struct btrfs_root *root, | |||
1358 | block1 = btrfs_node_blockptr(parent, slot - 1); | 1360 | block1 = btrfs_node_blockptr(parent, slot - 1); |
1359 | gen = btrfs_node_ptr_generation(parent, slot - 1); | 1361 | gen = btrfs_node_ptr_generation(parent, slot - 1); |
1360 | eb = btrfs_find_tree_block(root, block1, blocksize); | 1362 | eb = btrfs_find_tree_block(root, block1, blocksize); |
1361 | if (eb && btrfs_buffer_uptodate(eb, gen)) | 1363 | /* |
1364 | * if we get -eagain from btrfs_buffer_uptodate, we | ||
1365 | * don't want to return eagain here. That will loop | ||
1366 | * forever | ||
1367 | */ | ||
1368 | if (eb && btrfs_buffer_uptodate(eb, gen, 1) != 0) | ||
1362 | block1 = 0; | 1369 | block1 = 0; |
1363 | free_extent_buffer(eb); | 1370 | free_extent_buffer(eb); |
1364 | } | 1371 | } |
@@ -1366,7 +1373,7 @@ static noinline int reada_for_balance(struct btrfs_root *root, | |||
1366 | block2 = btrfs_node_blockptr(parent, slot + 1); | 1373 | block2 = btrfs_node_blockptr(parent, slot + 1); |
1367 | gen = btrfs_node_ptr_generation(parent, slot + 1); | 1374 | gen = btrfs_node_ptr_generation(parent, slot + 1); |
1368 | eb = btrfs_find_tree_block(root, block2, blocksize); | 1375 | eb = btrfs_find_tree_block(root, block2, blocksize); |
1369 | if (eb && btrfs_buffer_uptodate(eb, gen)) | 1376 | if (eb && btrfs_buffer_uptodate(eb, gen, 1) != 0) |
1370 | block2 = 0; | 1377 | block2 = 0; |
1371 | free_extent_buffer(eb); | 1378 | free_extent_buffer(eb); |
1372 | } | 1379 | } |
@@ -1504,8 +1511,9 @@ read_block_for_search(struct btrfs_trans_handle *trans, | |||
1504 | 1511 | ||
1505 | tmp = btrfs_find_tree_block(root, blocknr, blocksize); | 1512 | tmp = btrfs_find_tree_block(root, blocknr, blocksize); |
1506 | if (tmp) { | 1513 | if (tmp) { |
1507 | if (btrfs_buffer_uptodate(tmp, 0)) { | 1514 | /* first we do an atomic uptodate check */ |
1508 | if (btrfs_buffer_uptodate(tmp, gen)) { | 1515 | if (btrfs_buffer_uptodate(tmp, 0, 1) > 0) { |
1516 | if (btrfs_buffer_uptodate(tmp, gen, 1) > 0) { | ||
1509 | /* | 1517 | /* |
1510 | * we found an up to date block without | 1518 | * we found an up to date block without |
1511 | * sleeping, return | 1519 | * sleeping, return |
@@ -1523,8 +1531,9 @@ read_block_for_search(struct btrfs_trans_handle *trans, | |||
1523 | free_extent_buffer(tmp); | 1531 | free_extent_buffer(tmp); |
1524 | btrfs_set_path_blocking(p); | 1532 | btrfs_set_path_blocking(p); |
1525 | 1533 | ||
1534 | /* now we're allowed to do a blocking uptodate check */ | ||
1526 | tmp = read_tree_block(root, blocknr, blocksize, gen); | 1535 | tmp = read_tree_block(root, blocknr, blocksize, gen); |
1527 | if (tmp && btrfs_buffer_uptodate(tmp, gen)) { | 1536 | if (tmp && btrfs_buffer_uptodate(tmp, gen, 0) > 0) { |
1528 | *eb_ret = tmp; | 1537 | *eb_ret = tmp; |
1529 | return 0; | 1538 | return 0; |
1530 | } | 1539 | } |
@@ -1559,7 +1568,7 @@ read_block_for_search(struct btrfs_trans_handle *trans, | |||
1559 | * and give up so that our caller doesn't loop forever | 1568 | * and give up so that our caller doesn't loop forever |
1560 | * on our EAGAINs. | 1569 | * on our EAGAINs. |
1561 | */ | 1570 | */ |
1562 | if (!btrfs_buffer_uptodate(tmp, 0)) | 1571 | if (!btrfs_buffer_uptodate(tmp, 0, 0)) |
1563 | ret = -EIO; | 1572 | ret = -EIO; |
1564 | free_extent_buffer(tmp); | 1573 | free_extent_buffer(tmp); |
1565 | } | 1574 | } |
@@ -4043,7 +4052,7 @@ again: | |||
4043 | tmp = btrfs_find_tree_block(root, blockptr, | 4052 | tmp = btrfs_find_tree_block(root, blockptr, |
4044 | btrfs_level_size(root, level - 1)); | 4053 | btrfs_level_size(root, level - 1)); |
4045 | 4054 | ||
4046 | if (tmp && btrfs_buffer_uptodate(tmp, gen)) { | 4055 | if (tmp && btrfs_buffer_uptodate(tmp, gen, 1) > 0) { |
4047 | free_extent_buffer(tmp); | 4056 | free_extent_buffer(tmp); |
4048 | break; | 4057 | break; |
4049 | } | 4058 | } |
@@ -4166,7 +4175,8 @@ next: | |||
4166 | struct extent_buffer *cur; | 4175 | struct extent_buffer *cur; |
4167 | cur = btrfs_find_tree_block(root, blockptr, | 4176 | cur = btrfs_find_tree_block(root, blockptr, |
4168 | btrfs_level_size(root, level - 1)); | 4177 | btrfs_level_size(root, level - 1)); |
4169 | if (!cur || !btrfs_buffer_uptodate(cur, gen)) { | 4178 | if (!cur || |
4179 | btrfs_buffer_uptodate(cur, gen, 1) <= 0) { | ||
4170 | slot++; | 4180 | slot++; |
4171 | if (cur) | 4181 | if (cur) |
4172 | free_extent_buffer(cur); | 4182 | free_extent_buffer(cur); |
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index d0c969beaad4..a7ffc88a7dbe 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
@@ -323,7 +323,8 @@ static int csum_tree_block(struct btrfs_root *root, struct extent_buffer *buf, | |||
323 | * in the wrong place. | 323 | * in the wrong place. |
324 | */ | 324 | */ |
325 | static int verify_parent_transid(struct extent_io_tree *io_tree, | 325 | static int verify_parent_transid(struct extent_io_tree *io_tree, |
326 | struct extent_buffer *eb, u64 parent_transid) | 326 | struct extent_buffer *eb, u64 parent_transid, |
327 | int atomic) | ||
327 | { | 328 | { |
328 | struct extent_state *cached_state = NULL; | 329 | struct extent_state *cached_state = NULL; |
329 | int ret; | 330 | int ret; |
@@ -331,6 +332,9 @@ static int verify_parent_transid(struct extent_io_tree *io_tree, | |||
331 | if (!parent_transid || btrfs_header_generation(eb) == parent_transid) | 332 | if (!parent_transid || btrfs_header_generation(eb) == parent_transid) |
332 | return 0; | 333 | return 0; |
333 | 334 | ||
335 | if (atomic) | ||
336 | return -EAGAIN; | ||
337 | |||
334 | lock_extent_bits(io_tree, eb->start, eb->start + eb->len - 1, | 338 | lock_extent_bits(io_tree, eb->start, eb->start + eb->len - 1, |
335 | 0, &cached_state); | 339 | 0, &cached_state); |
336 | if (extent_buffer_uptodate(eb) && | 340 | if (extent_buffer_uptodate(eb) && |
@@ -372,7 +376,8 @@ static int btree_read_extent_buffer_pages(struct btrfs_root *root, | |||
372 | ret = read_extent_buffer_pages(io_tree, eb, start, | 376 | ret = read_extent_buffer_pages(io_tree, eb, start, |
373 | WAIT_COMPLETE, | 377 | WAIT_COMPLETE, |
374 | btree_get_extent, mirror_num); | 378 | btree_get_extent, mirror_num); |
375 | if (!ret && !verify_parent_transid(io_tree, eb, parent_transid)) | 379 | if (!ret && !verify_parent_transid(io_tree, eb, |
380 | parent_transid, 0)) | ||
376 | break; | 381 | break; |
377 | 382 | ||
378 | /* | 383 | /* |
@@ -1202,7 +1207,7 @@ static int __must_check find_and_setup_root(struct btrfs_root *tree_root, | |||
1202 | root->commit_root = NULL; | 1207 | root->commit_root = NULL; |
1203 | root->node = read_tree_block(root, btrfs_root_bytenr(&root->root_item), | 1208 | root->node = read_tree_block(root, btrfs_root_bytenr(&root->root_item), |
1204 | blocksize, generation); | 1209 | blocksize, generation); |
1205 | if (!root->node || !btrfs_buffer_uptodate(root->node, generation)) { | 1210 | if (!root->node || !btrfs_buffer_uptodate(root->node, generation, 0)) { |
1206 | free_extent_buffer(root->node); | 1211 | free_extent_buffer(root->node); |
1207 | root->node = NULL; | 1212 | root->node = NULL; |
1208 | return -EIO; | 1213 | return -EIO; |
@@ -3143,7 +3148,8 @@ int close_ctree(struct btrfs_root *root) | |||
3143 | return 0; | 3148 | return 0; |
3144 | } | 3149 | } |
3145 | 3150 | ||
3146 | int btrfs_buffer_uptodate(struct extent_buffer *buf, u64 parent_transid) | 3151 | int btrfs_buffer_uptodate(struct extent_buffer *buf, u64 parent_transid, |
3152 | int atomic) | ||
3147 | { | 3153 | { |
3148 | int ret; | 3154 | int ret; |
3149 | struct inode *btree_inode = buf->pages[0]->mapping->host; | 3155 | struct inode *btree_inode = buf->pages[0]->mapping->host; |
@@ -3153,7 +3159,9 @@ int btrfs_buffer_uptodate(struct extent_buffer *buf, u64 parent_transid) | |||
3153 | return ret; | 3159 | return ret; |
3154 | 3160 | ||
3155 | ret = verify_parent_transid(&BTRFS_I(btree_inode)->io_tree, buf, | 3161 | ret = verify_parent_transid(&BTRFS_I(btree_inode)->io_tree, buf, |
3156 | parent_transid); | 3162 | parent_transid, atomic); |
3163 | if (ret == -EAGAIN) | ||
3164 | return ret; | ||
3157 | return !ret; | 3165 | return !ret; |
3158 | } | 3166 | } |
3159 | 3167 | ||
diff --git a/fs/btrfs/disk-io.h b/fs/btrfs/disk-io.h index a7ace1a2dd12..ab1830aaf0ed 100644 --- a/fs/btrfs/disk-io.h +++ b/fs/btrfs/disk-io.h | |||
@@ -66,7 +66,8 @@ void btrfs_btree_balance_dirty(struct btrfs_root *root, unsigned long nr); | |||
66 | void __btrfs_btree_balance_dirty(struct btrfs_root *root, unsigned long nr); | 66 | void __btrfs_btree_balance_dirty(struct btrfs_root *root, unsigned long nr); |
67 | void btrfs_free_fs_root(struct btrfs_fs_info *fs_info, struct btrfs_root *root); | 67 | void btrfs_free_fs_root(struct btrfs_fs_info *fs_info, struct btrfs_root *root); |
68 | void btrfs_mark_buffer_dirty(struct extent_buffer *buf); | 68 | void btrfs_mark_buffer_dirty(struct extent_buffer *buf); |
69 | int btrfs_buffer_uptodate(struct extent_buffer *buf, u64 parent_transid); | 69 | int btrfs_buffer_uptodate(struct extent_buffer *buf, u64 parent_transid, |
70 | int atomic); | ||
70 | int btrfs_set_buffer_uptodate(struct extent_buffer *buf); | 71 | int btrfs_set_buffer_uptodate(struct extent_buffer *buf); |
71 | int btrfs_read_buffer(struct extent_buffer *buf, u64 parent_transid); | 72 | int btrfs_read_buffer(struct extent_buffer *buf, u64 parent_transid); |
72 | u32 btrfs_csum_data(struct btrfs_root *root, char *data, u32 seed, size_t len); | 73 | u32 btrfs_csum_data(struct btrfs_root *root, char *data, u32 seed, size_t len); |
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 6fc2e6f5aab8..49fd7b66d57b 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -6568,7 +6568,7 @@ static noinline int do_walk_down(struct btrfs_trans_handle *trans, | |||
6568 | goto skip; | 6568 | goto skip; |
6569 | } | 6569 | } |
6570 | 6570 | ||
6571 | if (!btrfs_buffer_uptodate(next, generation)) { | 6571 | if (!btrfs_buffer_uptodate(next, generation, 0)) { |
6572 | btrfs_tree_unlock(next); | 6572 | btrfs_tree_unlock(next); |
6573 | free_extent_buffer(next); | 6573 | free_extent_buffer(next); |
6574 | next = NULL; | 6574 | next = NULL; |
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 198c2ba2fa40..c9018a05036e 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c | |||
@@ -4120,6 +4120,7 @@ struct extent_buffer *alloc_extent_buffer(struct extent_io_tree *tree, | |||
4120 | if (atomic_inc_not_zero(&exists->refs)) { | 4120 | if (atomic_inc_not_zero(&exists->refs)) { |
4121 | spin_unlock(&mapping->private_lock); | 4121 | spin_unlock(&mapping->private_lock); |
4122 | unlock_page(p); | 4122 | unlock_page(p); |
4123 | page_cache_release(p); | ||
4123 | mark_extent_buffer_accessed(exists); | 4124 | mark_extent_buffer_accessed(exists); |
4124 | goto free_eb; | 4125 | goto free_eb; |
4125 | } | 4126 | } |
@@ -4199,8 +4200,7 @@ free_eb: | |||
4199 | unlock_page(eb->pages[i]); | 4200 | unlock_page(eb->pages[i]); |
4200 | } | 4201 | } |
4201 | 4202 | ||
4202 | if (!atomic_dec_and_test(&eb->refs)) | 4203 | WARN_ON(!atomic_dec_and_test(&eb->refs)); |
4203 | return exists; | ||
4204 | btrfs_release_extent_buffer(eb); | 4204 | btrfs_release_extent_buffer(eb); |
4205 | return exists; | 4205 | return exists; |
4206 | } | 4206 | } |
diff --git a/fs/btrfs/ioctl.h b/fs/btrfs/ioctl.h index 4f69028a68c4..086e6bdae1c4 100644 --- a/fs/btrfs/ioctl.h +++ b/fs/btrfs/ioctl.h | |||
@@ -252,7 +252,7 @@ struct btrfs_data_container { | |||
252 | 252 | ||
253 | struct btrfs_ioctl_ino_path_args { | 253 | struct btrfs_ioctl_ino_path_args { |
254 | __u64 inum; /* in */ | 254 | __u64 inum; /* in */ |
255 | __u32 size; /* in */ | 255 | __u64 size; /* in */ |
256 | __u64 reserved[4]; | 256 | __u64 reserved[4]; |
257 | /* struct btrfs_data_container *fspath; out */ | 257 | /* struct btrfs_data_container *fspath; out */ |
258 | __u64 fspath; /* out */ | 258 | __u64 fspath; /* out */ |
@@ -260,7 +260,7 @@ struct btrfs_ioctl_ino_path_args { | |||
260 | 260 | ||
261 | struct btrfs_ioctl_logical_ino_args { | 261 | struct btrfs_ioctl_logical_ino_args { |
262 | __u64 logical; /* in */ | 262 | __u64 logical; /* in */ |
263 | __u32 size; /* in */ | 263 | __u64 size; /* in */ |
264 | __u64 reserved[4]; | 264 | __u64 reserved[4]; |
265 | /* struct btrfs_data_container *inodes; out */ | 265 | /* struct btrfs_data_container *inodes; out */ |
266 | __u64 inodes; | 266 | __u64 inodes; |
diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index 4f76fc3f8e89..2f3d6f917fb3 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c | |||
@@ -998,6 +998,7 @@ static int scrub_setup_recheck_block(struct scrub_dev *sdev, | |||
998 | page = sblock->pagev + page_index; | 998 | page = sblock->pagev + page_index; |
999 | page->logical = logical; | 999 | page->logical = logical; |
1000 | page->physical = bbio->stripes[mirror_index].physical; | 1000 | page->physical = bbio->stripes[mirror_index].physical; |
1001 | /* for missing devices, bdev is NULL */ | ||
1001 | page->bdev = bbio->stripes[mirror_index].dev->bdev; | 1002 | page->bdev = bbio->stripes[mirror_index].dev->bdev; |
1002 | page->mirror_num = mirror_index + 1; | 1003 | page->mirror_num = mirror_index + 1; |
1003 | page->page = alloc_page(GFP_NOFS); | 1004 | page->page = alloc_page(GFP_NOFS); |
@@ -1042,6 +1043,12 @@ static int scrub_recheck_block(struct btrfs_fs_info *fs_info, | |||
1042 | struct scrub_page *page = sblock->pagev + page_num; | 1043 | struct scrub_page *page = sblock->pagev + page_num; |
1043 | DECLARE_COMPLETION_ONSTACK(complete); | 1044 | DECLARE_COMPLETION_ONSTACK(complete); |
1044 | 1045 | ||
1046 | if (page->bdev == NULL) { | ||
1047 | page->io_error = 1; | ||
1048 | sblock->no_io_error_seen = 0; | ||
1049 | continue; | ||
1050 | } | ||
1051 | |||
1045 | BUG_ON(!page->page); | 1052 | BUG_ON(!page->page); |
1046 | bio = bio_alloc(GFP_NOFS, 1); | 1053 | bio = bio_alloc(GFP_NOFS, 1); |
1047 | if (!bio) | 1054 | if (!bio) |
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index d017283ae6f5..eb1ae908582c 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c | |||
@@ -279,7 +279,7 @@ static int process_one_buffer(struct btrfs_root *log, | |||
279 | log->fs_info->extent_root, | 279 | log->fs_info->extent_root, |
280 | eb->start, eb->len); | 280 | eb->start, eb->len); |
281 | 281 | ||
282 | if (btrfs_buffer_uptodate(eb, gen)) { | 282 | if (btrfs_buffer_uptodate(eb, gen, 0)) { |
283 | if (wc->write) | 283 | if (wc->write) |
284 | btrfs_write_tree_block(eb); | 284 | btrfs_write_tree_block(eb); |
285 | if (wc->wait) | 285 | if (wc->wait) |
diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c index 811245b1ff2e..541ef81f6ae8 100644 --- a/fs/cifs/cifsfs.c +++ b/fs/cifs/cifsfs.c | |||
@@ -442,7 +442,7 @@ cifs_show_options(struct seq_file *s, struct dentry *root) | |||
442 | seq_printf(s, ",rsize=%u", cifs_sb->rsize); | 442 | seq_printf(s, ",rsize=%u", cifs_sb->rsize); |
443 | seq_printf(s, ",wsize=%u", cifs_sb->wsize); | 443 | seq_printf(s, ",wsize=%u", cifs_sb->wsize); |
444 | /* convert actimeo and display it in seconds */ | 444 | /* convert actimeo and display it in seconds */ |
445 | seq_printf(s, ",actimeo=%lu", cifs_sb->actimeo / HZ); | 445 | seq_printf(s, ",actimeo=%lu", cifs_sb->actimeo / HZ); |
446 | 446 | ||
447 | return 0; | 447 | return 0; |
448 | } | 448 | } |
@@ -699,7 +699,7 @@ static loff_t cifs_llseek(struct file *file, loff_t offset, int origin) | |||
699 | * origin == SEEK_END || SEEK_DATA || SEEK_HOLE => we must revalidate | 699 | * origin == SEEK_END || SEEK_DATA || SEEK_HOLE => we must revalidate |
700 | * the cached file length | 700 | * the cached file length |
701 | */ | 701 | */ |
702 | if (origin != SEEK_SET || origin != SEEK_CUR) { | 702 | if (origin != SEEK_SET && origin != SEEK_CUR) { |
703 | int rc; | 703 | int rc; |
704 | struct inode *inode = file->f_path.dentry->d_inode; | 704 | struct inode *inode = file->f_path.dentry->d_inode; |
705 | 705 | ||
diff --git a/fs/cifs/cifsfs.h b/fs/cifs/cifsfs.h index d1389bb33ceb..65365358c976 100644 --- a/fs/cifs/cifsfs.h +++ b/fs/cifs/cifsfs.h | |||
@@ -125,5 +125,5 @@ extern long cifs_ioctl(struct file *filep, unsigned int cmd, unsigned long arg); | |||
125 | extern const struct export_operations cifs_export_ops; | 125 | extern const struct export_operations cifs_export_ops; |
126 | #endif /* CONFIG_CIFS_NFSD_EXPORT */ | 126 | #endif /* CONFIG_CIFS_NFSD_EXPORT */ |
127 | 127 | ||
128 | #define CIFS_VERSION "1.77" | 128 | #define CIFS_VERSION "1.78" |
129 | #endif /* _CIFSFS_H */ | 129 | #endif /* _CIFSFS_H */ |
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c index f52c5ab78f9d..da2f5446fa7a 100644 --- a/fs/cifs/cifssmb.c +++ b/fs/cifs/cifssmb.c | |||
@@ -4844,8 +4844,12 @@ parse_DFS_referrals(TRANSACTION2_GET_DFS_REFER_RSP *pSMBr, | |||
4844 | max_len = data_end - temp; | 4844 | max_len = data_end - temp; |
4845 | node->node_name = cifs_strndup_from_utf16(temp, max_len, | 4845 | node->node_name = cifs_strndup_from_utf16(temp, max_len, |
4846 | is_unicode, nls_codepage); | 4846 | is_unicode, nls_codepage); |
4847 | if (!node->node_name) | 4847 | if (!node->node_name) { |
4848 | rc = -ENOMEM; | 4848 | rc = -ENOMEM; |
4849 | goto parse_DFS_referrals_exit; | ||
4850 | } | ||
4851 | |||
4852 | ref++; | ||
4849 | } | 4853 | } |
4850 | 4854 | ||
4851 | parse_DFS_referrals_exit: | 4855 | parse_DFS_referrals_exit: |
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index f4d381e331ce..e0b56d7a19c5 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c | |||
@@ -164,7 +164,8 @@ static const match_table_t cifs_mount_option_tokens = { | |||
164 | { Opt_sign, "sign" }, | 164 | { Opt_sign, "sign" }, |
165 | { Opt_seal, "seal" }, | 165 | { Opt_seal, "seal" }, |
166 | { Opt_direct, "direct" }, | 166 | { Opt_direct, "direct" }, |
167 | { Opt_direct, "forceddirectio" }, | 167 | { Opt_direct, "directio" }, |
168 | { Opt_direct, "forcedirectio" }, | ||
168 | { Opt_strictcache, "strictcache" }, | 169 | { Opt_strictcache, "strictcache" }, |
169 | { Opt_noac, "noac" }, | 170 | { Opt_noac, "noac" }, |
170 | { Opt_fsc, "fsc" }, | 171 | { Opt_fsc, "fsc" }, |
@@ -215,6 +216,8 @@ static const match_table_t cifs_mount_option_tokens = { | |||
215 | 216 | ||
216 | { Opt_ignore, "cred" }, | 217 | { Opt_ignore, "cred" }, |
217 | { Opt_ignore, "credentials" }, | 218 | { Opt_ignore, "credentials" }, |
219 | { Opt_ignore, "cred=%s" }, | ||
220 | { Opt_ignore, "credentials=%s" }, | ||
218 | { Opt_ignore, "guest" }, | 221 | { Opt_ignore, "guest" }, |
219 | { Opt_ignore, "rw" }, | 222 | { Opt_ignore, "rw" }, |
220 | { Opt_ignore, "ro" }, | 223 | { Opt_ignore, "ro" }, |
@@ -2183,6 +2186,7 @@ cifs_get_tcp_session(struct smb_vol *volume_info) | |||
2183 | tcp_ses->session_estab = false; | 2186 | tcp_ses->session_estab = false; |
2184 | tcp_ses->sequence_number = 0; | 2187 | tcp_ses->sequence_number = 0; |
2185 | tcp_ses->lstrp = jiffies; | 2188 | tcp_ses->lstrp = jiffies; |
2189 | spin_lock_init(&tcp_ses->req_lock); | ||
2186 | INIT_LIST_HEAD(&tcp_ses->tcp_ses_list); | 2190 | INIT_LIST_HEAD(&tcp_ses->tcp_ses_list); |
2187 | INIT_LIST_HEAD(&tcp_ses->smb_ses_list); | 2191 | INIT_LIST_HEAD(&tcp_ses->smb_ses_list); |
2188 | INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request); | 2192 | INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request); |
@@ -3614,22 +3618,6 @@ cifs_get_volume_info(char *mount_data, const char *devname) | |||
3614 | return volume_info; | 3618 | return volume_info; |
3615 | } | 3619 | } |
3616 | 3620 | ||
3617 | /* make sure ra_pages is a multiple of rsize */ | ||
3618 | static inline unsigned int | ||
3619 | cifs_ra_pages(struct cifs_sb_info *cifs_sb) | ||
3620 | { | ||
3621 | unsigned int reads; | ||
3622 | unsigned int rsize_pages = cifs_sb->rsize / PAGE_CACHE_SIZE; | ||
3623 | |||
3624 | if (rsize_pages >= default_backing_dev_info.ra_pages) | ||
3625 | return default_backing_dev_info.ra_pages; | ||
3626 | else if (rsize_pages == 0) | ||
3627 | return rsize_pages; | ||
3628 | |||
3629 | reads = default_backing_dev_info.ra_pages / rsize_pages; | ||
3630 | return reads * rsize_pages; | ||
3631 | } | ||
3632 | |||
3633 | int | 3621 | int |
3634 | cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info) | 3622 | cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info) |
3635 | { | 3623 | { |
@@ -3717,7 +3705,7 @@ try_mount_again: | |||
3717 | cifs_sb->rsize = cifs_negotiate_rsize(tcon, volume_info); | 3705 | cifs_sb->rsize = cifs_negotiate_rsize(tcon, volume_info); |
3718 | 3706 | ||
3719 | /* tune readahead according to rsize */ | 3707 | /* tune readahead according to rsize */ |
3720 | cifs_sb->bdi.ra_pages = cifs_ra_pages(cifs_sb); | 3708 | cifs_sb->bdi.ra_pages = cifs_sb->rsize / PAGE_CACHE_SIZE; |
3721 | 3709 | ||
3722 | remote_path_check: | 3710 | remote_path_check: |
3723 | #ifdef CONFIG_CIFS_DFS_UPCALL | 3711 | #ifdef CONFIG_CIFS_DFS_UPCALL |
diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c index d172c8ed9017..ec4e9a2a12f8 100644 --- a/fs/cifs/dir.c +++ b/fs/cifs/dir.c | |||
@@ -668,12 +668,19 @@ cifs_d_revalidate(struct dentry *direntry, struct nameidata *nd) | |||
668 | return 0; | 668 | return 0; |
669 | else { | 669 | else { |
670 | /* | 670 | /* |
671 | * Forcibly invalidate automounting directory inodes | 671 | * If the inode wasn't known to be a dfs entry when |
672 | * (remote DFS directories) so to have them | 672 | * the dentry was instantiated, such as when created |
673 | * instantiated again for automount | 673 | * via ->readdir(), it needs to be set now since the |
674 | * attributes will have been updated by | ||
675 | * cifs_revalidate_dentry(). | ||
674 | */ | 676 | */ |
675 | if (IS_AUTOMOUNT(direntry->d_inode)) | 677 | if (IS_AUTOMOUNT(direntry->d_inode) && |
676 | return 0; | 678 | !(direntry->d_flags & DCACHE_NEED_AUTOMOUNT)) { |
679 | spin_lock(&direntry->d_lock); | ||
680 | direntry->d_flags |= DCACHE_NEED_AUTOMOUNT; | ||
681 | spin_unlock(&direntry->d_lock); | ||
682 | } | ||
683 | |||
677 | return 1; | 684 | return 1; |
678 | } | 685 | } |
679 | } | 686 | } |
diff --git a/fs/dcache.c b/fs/dcache.c index b60ddc41d783..b80531c91779 100644 --- a/fs/dcache.c +++ b/fs/dcache.c | |||
@@ -141,18 +141,29 @@ int proc_nr_dentry(ctl_table *table, int write, void __user *buffer, | |||
141 | * Compare 2 name strings, return 0 if they match, otherwise non-zero. | 141 | * Compare 2 name strings, return 0 if they match, otherwise non-zero. |
142 | * The strings are both count bytes long, and count is non-zero. | 142 | * The strings are both count bytes long, and count is non-zero. |
143 | */ | 143 | */ |
144 | #ifdef CONFIG_DCACHE_WORD_ACCESS | ||
145 | |||
146 | #include <asm/word-at-a-time.h> | ||
147 | /* | ||
148 | * NOTE! 'cs' and 'scount' come from a dentry, so it has a | ||
149 | * aligned allocation for this particular component. We don't | ||
150 | * strictly need the load_unaligned_zeropad() safety, but it | ||
151 | * doesn't hurt either. | ||
152 | * | ||
153 | * In contrast, 'ct' and 'tcount' can be from a pathname, and do | ||
154 | * need the careful unaligned handling. | ||
155 | */ | ||
144 | static inline int dentry_cmp(const unsigned char *cs, size_t scount, | 156 | static inline int dentry_cmp(const unsigned char *cs, size_t scount, |
145 | const unsigned char *ct, size_t tcount) | 157 | const unsigned char *ct, size_t tcount) |
146 | { | 158 | { |
147 | #ifdef CONFIG_DCACHE_WORD_ACCESS | ||
148 | unsigned long a,b,mask; | 159 | unsigned long a,b,mask; |
149 | 160 | ||
150 | if (unlikely(scount != tcount)) | 161 | if (unlikely(scount != tcount)) |
151 | return 1; | 162 | return 1; |
152 | 163 | ||
153 | for (;;) { | 164 | for (;;) { |
154 | a = *(unsigned long *)cs; | 165 | a = load_unaligned_zeropad(cs); |
155 | b = *(unsigned long *)ct; | 166 | b = load_unaligned_zeropad(ct); |
156 | if (tcount < sizeof(unsigned long)) | 167 | if (tcount < sizeof(unsigned long)) |
157 | break; | 168 | break; |
158 | if (unlikely(a != b)) | 169 | if (unlikely(a != b)) |
@@ -165,7 +176,13 @@ static inline int dentry_cmp(const unsigned char *cs, size_t scount, | |||
165 | } | 176 | } |
166 | mask = ~(~0ul << tcount*8); | 177 | mask = ~(~0ul << tcount*8); |
167 | return unlikely(!!((a ^ b) & mask)); | 178 | return unlikely(!!((a ^ b) & mask)); |
179 | } | ||
180 | |||
168 | #else | 181 | #else |
182 | |||
183 | static inline int dentry_cmp(const unsigned char *cs, size_t scount, | ||
184 | const unsigned char *ct, size_t tcount) | ||
185 | { | ||
169 | if (scount != tcount) | 186 | if (scount != tcount) |
170 | return 1; | 187 | return 1; |
171 | 188 | ||
@@ -177,9 +194,10 @@ static inline int dentry_cmp(const unsigned char *cs, size_t scount, | |||
177 | tcount--; | 194 | tcount--; |
178 | } while (tcount); | 195 | } while (tcount); |
179 | return 0; | 196 | return 0; |
180 | #endif | ||
181 | } | 197 | } |
182 | 198 | ||
199 | #endif | ||
200 | |||
183 | static void __d_free(struct rcu_head *head) | 201 | static void __d_free(struct rcu_head *head) |
184 | { | 202 | { |
185 | struct dentry *dentry = container_of(head, struct dentry, d_u.d_rcu); | 203 | struct dentry *dentry = container_of(head, struct dentry, d_u.d_rcu); |
diff --git a/fs/hfsplus/catalog.c b/fs/hfsplus/catalog.c index 4dfbfec357e8..ec2a9c23f0c9 100644 --- a/fs/hfsplus/catalog.c +++ b/fs/hfsplus/catalog.c | |||
@@ -366,6 +366,10 @@ int hfsplus_rename_cat(u32 cnid, | |||
366 | err = hfs_brec_find(&src_fd); | 366 | err = hfs_brec_find(&src_fd); |
367 | if (err) | 367 | if (err) |
368 | goto out; | 368 | goto out; |
369 | if (src_fd.entrylength > sizeof(entry) || src_fd.entrylength < 0) { | ||
370 | err = -EIO; | ||
371 | goto out; | ||
372 | } | ||
369 | 373 | ||
370 | hfs_bnode_read(src_fd.bnode, &entry, src_fd.entryoffset, | 374 | hfs_bnode_read(src_fd.bnode, &entry, src_fd.entryoffset, |
371 | src_fd.entrylength); | 375 | src_fd.entrylength); |
diff --git a/fs/hfsplus/dir.c b/fs/hfsplus/dir.c index 88e155f895c6..26b53fb09f68 100644 --- a/fs/hfsplus/dir.c +++ b/fs/hfsplus/dir.c | |||
@@ -150,6 +150,11 @@ static int hfsplus_readdir(struct file *filp, void *dirent, filldir_t filldir) | |||
150 | filp->f_pos++; | 150 | filp->f_pos++; |
151 | /* fall through */ | 151 | /* fall through */ |
152 | case 1: | 152 | case 1: |
153 | if (fd.entrylength > sizeof(entry) || fd.entrylength < 0) { | ||
154 | err = -EIO; | ||
155 | goto out; | ||
156 | } | ||
157 | |||
153 | hfs_bnode_read(fd.bnode, &entry, fd.entryoffset, | 158 | hfs_bnode_read(fd.bnode, &entry, fd.entryoffset, |
154 | fd.entrylength); | 159 | fd.entrylength); |
155 | if (be16_to_cpu(entry.type) != HFSPLUS_FOLDER_THREAD) { | 160 | if (be16_to_cpu(entry.type) != HFSPLUS_FOLDER_THREAD) { |
@@ -181,6 +186,12 @@ static int hfsplus_readdir(struct file *filp, void *dirent, filldir_t filldir) | |||
181 | err = -EIO; | 186 | err = -EIO; |
182 | goto out; | 187 | goto out; |
183 | } | 188 | } |
189 | |||
190 | if (fd.entrylength > sizeof(entry) || fd.entrylength < 0) { | ||
191 | err = -EIO; | ||
192 | goto out; | ||
193 | } | ||
194 | |||
184 | hfs_bnode_read(fd.bnode, &entry, fd.entryoffset, | 195 | hfs_bnode_read(fd.bnode, &entry, fd.entryoffset, |
185 | fd.entrylength); | 196 | fd.entrylength); |
186 | type = be16_to_cpu(entry.type); | 197 | type = be16_to_cpu(entry.type); |
diff --git a/fs/jffs2/gc.c b/fs/jffs2/gc.c index ad271c70aa25..5a2dec2b064c 100644 --- a/fs/jffs2/gc.c +++ b/fs/jffs2/gc.c | |||
@@ -234,8 +234,8 @@ int jffs2_garbage_collect_pass(struct jffs2_sb_info *c) | |||
234 | return 0; | 234 | return 0; |
235 | 235 | ||
236 | jffs2_dbg(1, "No progress from erasing block; doing GC anyway\n"); | 236 | jffs2_dbg(1, "No progress from erasing block; doing GC anyway\n"); |
237 | spin_lock(&c->erase_completion_lock); | ||
238 | mutex_lock(&c->alloc_sem); | 237 | mutex_lock(&c->alloc_sem); |
238 | spin_lock(&c->erase_completion_lock); | ||
239 | } | 239 | } |
240 | 240 | ||
241 | /* First, work out which block we're garbage-collecting */ | 241 | /* First, work out which block we're garbage-collecting */ |
diff --git a/fs/namei.c b/fs/namei.c index 0062dd17eb55..c42791914f82 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
@@ -1429,7 +1429,7 @@ unsigned int full_name_hash(const unsigned char *name, unsigned int len) | |||
1429 | unsigned long hash = 0; | 1429 | unsigned long hash = 0; |
1430 | 1430 | ||
1431 | for (;;) { | 1431 | for (;;) { |
1432 | a = *(unsigned long *)name; | 1432 | a = load_unaligned_zeropad(name); |
1433 | if (len < sizeof(unsigned long)) | 1433 | if (len < sizeof(unsigned long)) |
1434 | break; | 1434 | break; |
1435 | hash += a; | 1435 | hash += a; |
@@ -1459,7 +1459,7 @@ static inline unsigned long hash_name(const char *name, unsigned int *hashp) | |||
1459 | do { | 1459 | do { |
1460 | hash = (hash + a) * 9; | 1460 | hash = (hash + a) * 9; |
1461 | len += sizeof(unsigned long); | 1461 | len += sizeof(unsigned long); |
1462 | a = *(unsigned long *)(name+len); | 1462 | a = load_unaligned_zeropad(name+len); |
1463 | /* Do we have any NUL or '/' bytes in this word? */ | 1463 | /* Do we have any NUL or '/' bytes in this word? */ |
1464 | mask = has_zero(a) | has_zero(a ^ REPEAT_BYTE('/')); | 1464 | mask = has_zero(a) | has_zero(a ^ REPEAT_BYTE('/')); |
1465 | } while (!mask); | 1465 | } while (!mask); |
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 2d60492d6df8..1030a716d155 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c | |||
@@ -747,6 +747,8 @@ static void pte_to_pagemap_entry(pagemap_entry_t *pme, pte_t pte) | |||
747 | else if (pte_present(pte)) | 747 | else if (pte_present(pte)) |
748 | *pme = make_pme(PM_PFRAME(pte_pfn(pte)) | 748 | *pme = make_pme(PM_PFRAME(pte_pfn(pte)) |
749 | | PM_PSHIFT(PAGE_SHIFT) | PM_PRESENT); | 749 | | PM_PSHIFT(PAGE_SHIFT) | PM_PRESENT); |
750 | else | ||
751 | *pme = make_pme(PM_NOT_PRESENT); | ||
750 | } | 752 | } |
751 | 753 | ||
752 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE | 754 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE |
@@ -761,6 +763,8 @@ static void thp_pmd_to_pagemap_entry(pagemap_entry_t *pme, | |||
761 | if (pmd_present(pmd)) | 763 | if (pmd_present(pmd)) |
762 | *pme = make_pme(PM_PFRAME(pmd_pfn(pmd) + offset) | 764 | *pme = make_pme(PM_PFRAME(pmd_pfn(pmd) + offset) |
763 | | PM_PSHIFT(PAGE_SHIFT) | PM_PRESENT); | 765 | | PM_PSHIFT(PAGE_SHIFT) | PM_PRESENT); |
766 | else | ||
767 | *pme = make_pme(PM_NOT_PRESENT); | ||
764 | } | 768 | } |
765 | #else | 769 | #else |
766 | static inline void thp_pmd_to_pagemap_entry(pagemap_entry_t *pme, | 770 | static inline void thp_pmd_to_pagemap_entry(pagemap_entry_t *pme, |
@@ -801,8 +805,10 @@ static int pagemap_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end, | |||
801 | 805 | ||
802 | /* check to see if we've left 'vma' behind | 806 | /* check to see if we've left 'vma' behind |
803 | * and need a new, higher one */ | 807 | * and need a new, higher one */ |
804 | if (vma && (addr >= vma->vm_end)) | 808 | if (vma && (addr >= vma->vm_end)) { |
805 | vma = find_vma(walk->mm, addr); | 809 | vma = find_vma(walk->mm, addr); |
810 | pme = make_pme(PM_NOT_PRESENT); | ||
811 | } | ||
806 | 812 | ||
807 | /* check that 'vma' actually covers this address, | 813 | /* check that 'vma' actually covers this address, |
808 | * and that it isn't a huge page vma */ | 814 | * and that it isn't a huge page vma */ |
@@ -830,6 +836,8 @@ static void huge_pte_to_pagemap_entry(pagemap_entry_t *pme, | |||
830 | if (pte_present(pte)) | 836 | if (pte_present(pte)) |
831 | *pme = make_pme(PM_PFRAME(pte_pfn(pte) + offset) | 837 | *pme = make_pme(PM_PFRAME(pte_pfn(pte) + offset) |
832 | | PM_PSHIFT(PAGE_SHIFT) | PM_PRESENT); | 838 | | PM_PSHIFT(PAGE_SHIFT) | PM_PRESENT); |
839 | else | ||
840 | *pme = make_pme(PM_NOT_PRESENT); | ||
833 | } | 841 | } |
834 | 842 | ||
835 | /* This function walks within one hugetlb entry in the single call */ | 843 | /* This function walks within one hugetlb entry in the single call */ |
@@ -839,7 +847,7 @@ static int pagemap_hugetlb_range(pte_t *pte, unsigned long hmask, | |||
839 | { | 847 | { |
840 | struct pagemapread *pm = walk->private; | 848 | struct pagemapread *pm = walk->private; |
841 | int err = 0; | 849 | int err = 0; |
842 | pagemap_entry_t pme = make_pme(PM_NOT_PRESENT); | 850 | pagemap_entry_t pme; |
843 | 851 | ||
844 | for (; addr != end; addr += PAGE_SIZE) { | 852 | for (; addr != end; addr += PAGE_SIZE) { |
845 | int offset = (addr & ~hmask) >> PAGE_SHIFT; | 853 | int offset = (addr & ~hmask) >> PAGE_SHIFT; |
diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h index eba66043cf1b..e8bcc4742e0e 100644 --- a/include/acpi/actypes.h +++ b/include/acpi/actypes.h | |||
@@ -499,9 +499,10 @@ typedef u64 acpi_integer; | |||
499 | #define ACPI_STATE_D0 (u8) 0 | 499 | #define ACPI_STATE_D0 (u8) 0 |
500 | #define ACPI_STATE_D1 (u8) 1 | 500 | #define ACPI_STATE_D1 (u8) 1 |
501 | #define ACPI_STATE_D2 (u8) 2 | 501 | #define ACPI_STATE_D2 (u8) 2 |
502 | #define ACPI_STATE_D3 (u8) 3 | 502 | #define ACPI_STATE_D3_HOT (u8) 3 |
503 | #define ACPI_STATE_D3_COLD (u8) 4 | 503 | #define ACPI_STATE_D3 (u8) 4 |
504 | #define ACPI_D_STATES_MAX ACPI_STATE_D3_COLD | 504 | #define ACPI_STATE_D3_COLD ACPI_STATE_D3 |
505 | #define ACPI_D_STATES_MAX ACPI_STATE_D3 | ||
505 | #define ACPI_D_STATE_COUNT 5 | 506 | #define ACPI_D_STATE_COUNT 5 |
506 | 507 | ||
507 | #define ACPI_STATE_C0 (u8) 0 | 508 | #define ACPI_STATE_C0 (u8) 0 |
diff --git a/include/asm-generic/statfs.h b/include/asm-generic/statfs.h index 0fd28e028de1..c749af9c0983 100644 --- a/include/asm-generic/statfs.h +++ b/include/asm-generic/statfs.h | |||
@@ -15,7 +15,7 @@ typedef __kernel_fsid_t fsid_t; | |||
15 | * with a 10' pole. | 15 | * with a 10' pole. |
16 | */ | 16 | */ |
17 | #ifndef __statfs_word | 17 | #ifndef __statfs_word |
18 | #if BITS_PER_LONG == 64 | 18 | #if __BITS_PER_LONG == 64 |
19 | #define __statfs_word long | 19 | #define __statfs_word long |
20 | #else | 20 | #else |
21 | #define __statfs_word __u32 | 21 | #define __statfs_word __u32 |
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 7f377fb8b527..b0f6f22723c3 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
@@ -1426,15 +1426,6 @@ static inline bool netdev_uses_dsa_tags(struct net_device *dev) | |||
1426 | return 0; | 1426 | return 0; |
1427 | } | 1427 | } |
1428 | 1428 | ||
1429 | #ifndef CONFIG_NET_NS | ||
1430 | static inline void skb_set_dev(struct sk_buff *skb, struct net_device *dev) | ||
1431 | { | ||
1432 | skb->dev = dev; | ||
1433 | } | ||
1434 | #else /* CONFIG_NET_NS */ | ||
1435 | void skb_set_dev(struct sk_buff *skb, struct net_device *dev); | ||
1436 | #endif | ||
1437 | |||
1438 | static inline bool netdev_uses_trailer_tags(struct net_device *dev) | 1429 | static inline bool netdev_uses_trailer_tags(struct net_device *dev) |
1439 | { | 1430 | { |
1440 | #ifdef CONFIG_NET_DSA_TAG_TRAILER | 1431 | #ifdef CONFIG_NET_DSA_TAG_TRAILER |
diff --git a/include/linux/netfilter/ipset/ip_set_ahash.h b/include/linux/netfilter/ipset/ip_set_ahash.h index 289b62d9dd1f..b114d35aea5e 100644 --- a/include/linux/netfilter/ipset/ip_set_ahash.h +++ b/include/linux/netfilter/ipset/ip_set_ahash.h | |||
@@ -99,6 +99,22 @@ struct ip_set_hash { | |||
99 | #endif | 99 | #endif |
100 | }; | 100 | }; |
101 | 101 | ||
102 | static size_t | ||
103 | htable_size(u8 hbits) | ||
104 | { | ||
105 | size_t hsize; | ||
106 | |||
107 | /* We must fit both into u32 in jhash and size_t */ | ||
108 | if (hbits > 31) | ||
109 | return 0; | ||
110 | hsize = jhash_size(hbits); | ||
111 | if ((((size_t)-1) - sizeof(struct htable))/sizeof(struct hbucket) | ||
112 | < hsize) | ||
113 | return 0; | ||
114 | |||
115 | return hsize * sizeof(struct hbucket) + sizeof(struct htable); | ||
116 | } | ||
117 | |||
102 | /* Compute htable_bits from the user input parameter hashsize */ | 118 | /* Compute htable_bits from the user input parameter hashsize */ |
103 | static u8 | 119 | static u8 |
104 | htable_bits(u32 hashsize) | 120 | htable_bits(u32 hashsize) |
diff --git a/include/linux/seqlock.h b/include/linux/seqlock.h index c6db9fb33c44..600060e25ec6 100644 --- a/include/linux/seqlock.h +++ b/include/linux/seqlock.h | |||
@@ -141,7 +141,7 @@ static inline unsigned __read_seqcount_begin(const seqcount_t *s) | |||
141 | unsigned ret; | 141 | unsigned ret; |
142 | 142 | ||
143 | repeat: | 143 | repeat: |
144 | ret = s->sequence; | 144 | ret = ACCESS_ONCE(s->sequence); |
145 | if (unlikely(ret & 1)) { | 145 | if (unlikely(ret & 1)) { |
146 | cpu_relax(); | 146 | cpu_relax(); |
147 | goto repeat; | 147 | goto repeat; |
@@ -166,6 +166,27 @@ static inline unsigned read_seqcount_begin(const seqcount_t *s) | |||
166 | } | 166 | } |
167 | 167 | ||
168 | /** | 168 | /** |
169 | * raw_seqcount_begin - begin a seq-read critical section | ||
170 | * @s: pointer to seqcount_t | ||
171 | * Returns: count to be passed to read_seqcount_retry | ||
172 | * | ||
173 | * raw_seqcount_begin opens a read critical section of the given seqcount. | ||
174 | * Validity of the critical section is tested by checking read_seqcount_retry | ||
175 | * function. | ||
176 | * | ||
177 | * Unlike read_seqcount_begin(), this function will not wait for the count | ||
178 | * to stabilize. If a writer is active when we begin, we will fail the | ||
179 | * read_seqcount_retry() instead of stabilizing at the beginning of the | ||
180 | * critical section. | ||
181 | */ | ||
182 | static inline unsigned raw_seqcount_begin(const seqcount_t *s) | ||
183 | { | ||
184 | unsigned ret = ACCESS_ONCE(s->sequence); | ||
185 | smp_rmb(); | ||
186 | return ret & ~1; | ||
187 | } | ||
188 | |||
189 | /** | ||
169 | * __read_seqcount_retry - end a seq-read critical section (without barrier) | 190 | * __read_seqcount_retry - end a seq-read critical section (without barrier) |
170 | * @s: pointer to seqcount_t | 191 | * @s: pointer to seqcount_t |
171 | * @start: count, from read_seqcount_begin | 192 | * @start: count, from read_seqcount_begin |
diff --git a/include/linux/usb/usbnet.h b/include/linux/usb/usbnet.h index 605b0aa8d852..76f439647c4b 100644 --- a/include/linux/usb/usbnet.h +++ b/include/linux/usb/usbnet.h | |||
@@ -191,7 +191,8 @@ extern void usbnet_cdc_status(struct usbnet *, struct urb *); | |||
191 | enum skb_state { | 191 | enum skb_state { |
192 | illegal = 0, | 192 | illegal = 0, |
193 | tx_start, tx_done, | 193 | tx_start, tx_done, |
194 | rx_start, rx_done, rx_cleanup | 194 | rx_start, rx_done, rx_cleanup, |
195 | unlink_start | ||
195 | }; | 196 | }; |
196 | 197 | ||
197 | struct skb_data { /* skb->cb is one of these */ | 198 | struct skb_data { /* skb->cb is one of these */ |
diff --git a/include/media/soc_camera.h b/include/media/soc_camera.h index b5c2b6cb0d81..cad374bdcf4b 100644 --- a/include/media/soc_camera.h +++ b/include/media/soc_camera.h | |||
@@ -59,7 +59,8 @@ struct soc_camera_device { | |||
59 | struct soc_camera_host { | 59 | struct soc_camera_host { |
60 | struct v4l2_device v4l2_dev; | 60 | struct v4l2_device v4l2_dev; |
61 | struct list_head list; | 61 | struct list_head list; |
62 | unsigned char nr; /* Host number */ | 62 | struct mutex host_lock; /* Protect during probing */ |
63 | unsigned char nr; /* Host number */ | ||
63 | void *priv; | 64 | void *priv; |
64 | const char *drv_name; | 65 | const char *drv_name; |
65 | struct soc_camera_host_ops *ops; | 66 | struct soc_camera_host_ops *ops; |
diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h index 262ebd1747d4..a65910bda381 100644 --- a/include/net/bluetooth/bluetooth.h +++ b/include/net/bluetooth/bluetooth.h | |||
@@ -191,6 +191,7 @@ struct bt_sock { | |||
191 | struct list_head accept_q; | 191 | struct list_head accept_q; |
192 | struct sock *parent; | 192 | struct sock *parent; |
193 | u32 defer_setup; | 193 | u32 defer_setup; |
194 | bool suspended; | ||
194 | }; | 195 | }; |
195 | 196 | ||
196 | struct bt_sock_list { | 197 | struct bt_sock_list { |
diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h index 6ee44b24864a..a2ef81466b00 100644 --- a/include/net/sctp/sctp.h +++ b/include/net/sctp/sctp.h | |||
@@ -704,4 +704,17 @@ static inline void sctp_v4_map_v6(union sctp_addr *addr) | |||
704 | addr->v6.sin6_addr.s6_addr32[2] = htonl(0x0000ffff); | 704 | addr->v6.sin6_addr.s6_addr32[2] = htonl(0x0000ffff); |
705 | } | 705 | } |
706 | 706 | ||
707 | /* The cookie is always 0 since this is how it's used in the | ||
708 | * pmtu code. | ||
709 | */ | ||
710 | static inline struct dst_entry *sctp_transport_dst_check(struct sctp_transport *t) | ||
711 | { | ||
712 | if (t->dst && !dst_check(t->dst, 0)) { | ||
713 | dst_release(t->dst); | ||
714 | t->dst = NULL; | ||
715 | } | ||
716 | |||
717 | return t->dst; | ||
718 | } | ||
719 | |||
707 | #endif /* __net_sctp_h__ */ | 720 | #endif /* __net_sctp_h__ */ |
diff --git a/init/do_mounts.c b/init/do_mounts.c index 0e93f92a0345..42b0707c3481 100644 --- a/init/do_mounts.c +++ b/init/do_mounts.c | |||
@@ -472,7 +472,7 @@ void __init change_floppy(char *fmt, ...) | |||
472 | void __init mount_root(void) | 472 | void __init mount_root(void) |
473 | { | 473 | { |
474 | #ifdef CONFIG_ROOT_NFS | 474 | #ifdef CONFIG_ROOT_NFS |
475 | if (MAJOR(ROOT_DEV) == UNNAMED_MAJOR) { | 475 | if (ROOT_DEV == Root_NFS) { |
476 | if (mount_nfs_root()) | 476 | if (mount_nfs_root()) |
477 | return; | 477 | return; |
478 | 478 | ||
diff --git a/kernel/compat.c b/kernel/compat.c index 74ff8498809a..d2c67aa49ae6 100644 --- a/kernel/compat.c +++ b/kernel/compat.c | |||
@@ -372,25 +372,54 @@ asmlinkage long compat_sys_sigpending(compat_old_sigset_t __user *set) | |||
372 | 372 | ||
373 | #ifdef __ARCH_WANT_SYS_SIGPROCMASK | 373 | #ifdef __ARCH_WANT_SYS_SIGPROCMASK |
374 | 374 | ||
375 | asmlinkage long compat_sys_sigprocmask(int how, compat_old_sigset_t __user *set, | 375 | /* |
376 | compat_old_sigset_t __user *oset) | 376 | * sys_sigprocmask SIG_SETMASK sets the first (compat) word of the |
377 | * blocked set of signals to the supplied signal set | ||
378 | */ | ||
379 | static inline void compat_sig_setmask(sigset_t *blocked, compat_sigset_word set) | ||
377 | { | 380 | { |
378 | old_sigset_t s; | 381 | memcpy(blocked->sig, &set, sizeof(set)); |
379 | long ret; | 382 | } |
380 | mm_segment_t old_fs; | ||
381 | 383 | ||
382 | if (set && get_user(s, set)) | 384 | asmlinkage long compat_sys_sigprocmask(int how, |
383 | return -EFAULT; | 385 | compat_old_sigset_t __user *nset, |
384 | old_fs = get_fs(); | 386 | compat_old_sigset_t __user *oset) |
385 | set_fs(KERNEL_DS); | 387 | { |
386 | ret = sys_sigprocmask(how, | 388 | old_sigset_t old_set, new_set; |
387 | set ? (old_sigset_t __user *) &s : NULL, | 389 | sigset_t new_blocked; |
388 | oset ? (old_sigset_t __user *) &s : NULL); | 390 | |
389 | set_fs(old_fs); | 391 | old_set = current->blocked.sig[0]; |
390 | if (ret == 0) | 392 | |
391 | if (oset) | 393 | if (nset) { |
392 | ret = put_user(s, oset); | 394 | if (get_user(new_set, nset)) |
393 | return ret; | 395 | return -EFAULT; |
396 | new_set &= ~(sigmask(SIGKILL) | sigmask(SIGSTOP)); | ||
397 | |||
398 | new_blocked = current->blocked; | ||
399 | |||
400 | switch (how) { | ||
401 | case SIG_BLOCK: | ||
402 | sigaddsetmask(&new_blocked, new_set); | ||
403 | break; | ||
404 | case SIG_UNBLOCK: | ||
405 | sigdelsetmask(&new_blocked, new_set); | ||
406 | break; | ||
407 | case SIG_SETMASK: | ||
408 | compat_sig_setmask(&new_blocked, new_set); | ||
409 | break; | ||
410 | default: | ||
411 | return -EINVAL; | ||
412 | } | ||
413 | |||
414 | set_current_blocked(&new_blocked); | ||
415 | } | ||
416 | |||
417 | if (oset) { | ||
418 | if (put_user(old_set, oset)) | ||
419 | return -EFAULT; | ||
420 | } | ||
421 | |||
422 | return 0; | ||
394 | } | 423 | } |
395 | 424 | ||
396 | #endif | 425 | #endif |
diff --git a/kernel/fork.c b/kernel/fork.c index b9372a0bff18..687a15d56243 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
@@ -47,6 +47,7 @@ | |||
47 | #include <linux/audit.h> | 47 | #include <linux/audit.h> |
48 | #include <linux/memcontrol.h> | 48 | #include <linux/memcontrol.h> |
49 | #include <linux/ftrace.h> | 49 | #include <linux/ftrace.h> |
50 | #include <linux/proc_fs.h> | ||
50 | #include <linux/profile.h> | 51 | #include <linux/profile.h> |
51 | #include <linux/rmap.h> | 52 | #include <linux/rmap.h> |
52 | #include <linux/ksm.h> | 53 | #include <linux/ksm.h> |
@@ -1464,6 +1465,8 @@ bad_fork_cleanup_io: | |||
1464 | if (p->io_context) | 1465 | if (p->io_context) |
1465 | exit_io_context(p); | 1466 | exit_io_context(p); |
1466 | bad_fork_cleanup_namespaces: | 1467 | bad_fork_cleanup_namespaces: |
1468 | if (unlikely(clone_flags & CLONE_NEWPID)) | ||
1469 | pid_ns_release_proc(p->nsproxy->pid_ns); | ||
1467 | exit_task_namespaces(p); | 1470 | exit_task_namespaces(p); |
1468 | bad_fork_cleanup_mm: | 1471 | bad_fork_cleanup_mm: |
1469 | if (p->mm) | 1472 | if (p->mm) |
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index 6080f6bc8c33..3914c1e03cff 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c | |||
@@ -518,6 +518,7 @@ handle_edge_irq(unsigned int irq, struct irq_desc *desc) | |||
518 | out_unlock: | 518 | out_unlock: |
519 | raw_spin_unlock(&desc->lock); | 519 | raw_spin_unlock(&desc->lock); |
520 | } | 520 | } |
521 | EXPORT_SYMBOL(handle_edge_irq); | ||
521 | 522 | ||
522 | #ifdef CONFIG_IRQ_EDGE_EOI_HANDLER | 523 | #ifdef CONFIG_IRQ_EDGE_EOI_HANDLER |
523 | /** | 524 | /** |
diff --git a/kernel/irq/irqdesc.c b/kernel/irq/irqdesc.c index d86e254b95eb..192a302d6cfd 100644 --- a/kernel/irq/irqdesc.c +++ b/kernel/irq/irqdesc.c | |||
@@ -112,6 +112,7 @@ struct irq_desc *irq_to_desc(unsigned int irq) | |||
112 | { | 112 | { |
113 | return radix_tree_lookup(&irq_desc_tree, irq); | 113 | return radix_tree_lookup(&irq_desc_tree, irq); |
114 | } | 114 | } |
115 | EXPORT_SYMBOL(irq_to_desc); | ||
115 | 116 | ||
116 | static void delete_irq_desc(unsigned int irq) | 117 | static void delete_irq_desc(unsigned int irq) |
117 | { | 118 | { |
diff --git a/mm/hugetlb.c b/mm/hugetlb.c index 5a16423a512c..ae8f708e3d75 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c | |||
@@ -2498,7 +2498,6 @@ retry_avoidcopy: | |||
2498 | if (outside_reserve) { | 2498 | if (outside_reserve) { |
2499 | BUG_ON(huge_pte_none(pte)); | 2499 | BUG_ON(huge_pte_none(pte)); |
2500 | if (unmap_ref_private(mm, vma, old_page, address)) { | 2500 | if (unmap_ref_private(mm, vma, old_page, address)) { |
2501 | BUG_ON(page_count(old_page) != 1); | ||
2502 | BUG_ON(huge_pte_none(pte)); | 2501 | BUG_ON(huge_pte_none(pte)); |
2503 | spin_lock(&mm->page_table_lock); | 2502 | spin_lock(&mm->page_table_lock); |
2504 | ptep = huge_pte_offset(mm, address & huge_page_mask(h)); | 2503 | ptep = huge_pte_offset(mm, address & huge_page_mask(h)); |
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 31ab9c3f0178..b659260c56ad 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -4507,6 +4507,12 @@ static void mem_cgroup_usage_unregister_event(struct cgroup *cgrp, | |||
4507 | swap_buffers: | 4507 | swap_buffers: |
4508 | /* Swap primary and spare array */ | 4508 | /* Swap primary and spare array */ |
4509 | thresholds->spare = thresholds->primary; | 4509 | thresholds->spare = thresholds->primary; |
4510 | /* If all events are unregistered, free the spare array */ | ||
4511 | if (!new) { | ||
4512 | kfree(thresholds->spare); | ||
4513 | thresholds->spare = NULL; | ||
4514 | } | ||
4515 | |||
4510 | rcu_assign_pointer(thresholds->primary, new); | 4516 | rcu_assign_pointer(thresholds->primary, new); |
4511 | 4517 | ||
4512 | /* To be sure that nobody uses thresholds */ | 4518 | /* To be sure that nobody uses thresholds */ |
diff --git a/mm/nobootmem.c b/mm/nobootmem.c index e53bb8a256b1..1983fb1c7026 100644 --- a/mm/nobootmem.c +++ b/mm/nobootmem.c | |||
@@ -82,8 +82,7 @@ void __init free_bootmem_late(unsigned long addr, unsigned long size) | |||
82 | 82 | ||
83 | static void __init __free_pages_memory(unsigned long start, unsigned long end) | 83 | static void __init __free_pages_memory(unsigned long start, unsigned long end) |
84 | { | 84 | { |
85 | int i; | 85 | unsigned long i, start_aligned, end_aligned; |
86 | unsigned long start_aligned, end_aligned; | ||
87 | int order = ilog2(BITS_PER_LONG); | 86 | int order = ilog2(BITS_PER_LONG); |
88 | 87 | ||
89 | start_aligned = (start + (BITS_PER_LONG - 1)) & ~(BITS_PER_LONG - 1); | 88 | start_aligned = (start + (BITS_PER_LONG - 1)) & ~(BITS_PER_LONG - 1); |
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index a712fb9e04ce..918330f71dba 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -5203,7 +5203,7 @@ int percpu_pagelist_fraction_sysctl_handler(ctl_table *table, int write, | |||
5203 | int ret; | 5203 | int ret; |
5204 | 5204 | ||
5205 | ret = proc_dointvec_minmax(table, write, buffer, length, ppos); | 5205 | ret = proc_dointvec_minmax(table, write, buffer, length, ppos); |
5206 | if (!write || (ret == -EINVAL)) | 5206 | if (!write || (ret < 0)) |
5207 | return ret; | 5207 | return ret; |
5208 | for_each_populated_zone(zone) { | 5208 | for_each_populated_zone(zone) { |
5209 | for_each_possible_cpu(cpu) { | 5209 | for_each_possible_cpu(cpu) { |
diff --git a/mm/percpu.c b/mm/percpu.c index f47af9123af7..bb4be7435ce3 100644 --- a/mm/percpu.c +++ b/mm/percpu.c | |||
@@ -1132,20 +1132,20 @@ static void pcpu_dump_alloc_info(const char *lvl, | |||
1132 | for (alloc_end += gi->nr_units / upa; | 1132 | for (alloc_end += gi->nr_units / upa; |
1133 | alloc < alloc_end; alloc++) { | 1133 | alloc < alloc_end; alloc++) { |
1134 | if (!(alloc % apl)) { | 1134 | if (!(alloc % apl)) { |
1135 | printk("\n"); | 1135 | printk(KERN_CONT "\n"); |
1136 | printk("%spcpu-alloc: ", lvl); | 1136 | printk("%spcpu-alloc: ", lvl); |
1137 | } | 1137 | } |
1138 | printk("[%0*d] ", group_width, group); | 1138 | printk(KERN_CONT "[%0*d] ", group_width, group); |
1139 | 1139 | ||
1140 | for (unit_end += upa; unit < unit_end; unit++) | 1140 | for (unit_end += upa; unit < unit_end; unit++) |
1141 | if (gi->cpu_map[unit] != NR_CPUS) | 1141 | if (gi->cpu_map[unit] != NR_CPUS) |
1142 | printk("%0*d ", cpu_width, | 1142 | printk(KERN_CONT "%0*d ", cpu_width, |
1143 | gi->cpu_map[unit]); | 1143 | gi->cpu_map[unit]); |
1144 | else | 1144 | else |
1145 | printk("%s ", empty_str); | 1145 | printk(KERN_CONT "%s ", empty_str); |
1146 | } | 1146 | } |
1147 | } | 1147 | } |
1148 | printk("\n"); | 1148 | printk(KERN_CONT "\n"); |
1149 | } | 1149 | } |
1150 | 1150 | ||
1151 | /** | 1151 | /** |
@@ -1650,6 +1650,16 @@ int __init pcpu_embed_first_chunk(size_t reserved_size, size_t dyn_size, | |||
1650 | areas[group] = ptr; | 1650 | areas[group] = ptr; |
1651 | 1651 | ||
1652 | base = min(ptr, base); | 1652 | base = min(ptr, base); |
1653 | } | ||
1654 | |||
1655 | /* | ||
1656 | * Copy data and free unused parts. This should happen after all | ||
1657 | * allocations are complete; otherwise, we may end up with | ||
1658 | * overlapping groups. | ||
1659 | */ | ||
1660 | for (group = 0; group < ai->nr_groups; group++) { | ||
1661 | struct pcpu_group_info *gi = &ai->groups[group]; | ||
1662 | void *ptr = areas[group]; | ||
1653 | 1663 | ||
1654 | for (i = 0; i < gi->nr_units; i++, ptr += ai->unit_size) { | 1664 | for (i = 0; i < gi->nr_units; i++, ptr += ai->unit_size) { |
1655 | if (gi->cpu_map[i] == NR_CPUS) { | 1665 | if (gi->cpu_map[i] == NR_CPUS) { |
@@ -1885,6 +1895,8 @@ void __init setup_per_cpu_areas(void) | |||
1885 | fc = __alloc_bootmem(unit_size, PAGE_SIZE, __pa(MAX_DMA_ADDRESS)); | 1895 | fc = __alloc_bootmem(unit_size, PAGE_SIZE, __pa(MAX_DMA_ADDRESS)); |
1886 | if (!ai || !fc) | 1896 | if (!ai || !fc) |
1887 | panic("Failed to allocate memory for percpu areas."); | 1897 | panic("Failed to allocate memory for percpu areas."); |
1898 | /* kmemleak tracks the percpu allocations separately */ | ||
1899 | kmemleak_free(fc); | ||
1888 | 1900 | ||
1889 | ai->dyn_size = unit_size; | 1901 | ai->dyn_size = unit_size; |
1890 | ai->unit_size = unit_size; | 1902 | ai->unit_size = unit_size; |
diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c index eaf5f21b0ef7..da1bc9c3cf38 100644 --- a/net/8021q/vlan_dev.c +++ b/net/8021q/vlan_dev.c | |||
@@ -157,7 +157,7 @@ static netdev_tx_t vlan_dev_hard_start_xmit(struct sk_buff *skb, | |||
157 | skb = __vlan_hwaccel_put_tag(skb, vlan_tci); | 157 | skb = __vlan_hwaccel_put_tag(skb, vlan_tci); |
158 | } | 158 | } |
159 | 159 | ||
160 | skb_set_dev(skb, vlan_dev_priv(dev)->real_dev); | 160 | skb->dev = vlan_dev_priv(dev)->real_dev; |
161 | len = skb->len; | 161 | len = skb->len; |
162 | if (netpoll_tx_running(dev)) | 162 | if (netpoll_tx_running(dev)) |
163 | return skb->dev->netdev_ops->ndo_start_xmit(skb, skb->dev); | 163 | return skb->dev->netdev_ops->ndo_start_xmit(skb, skb->dev); |
diff --git a/net/bluetooth/af_bluetooth.c b/net/bluetooth/af_bluetooth.c index 72eb187a5f60..6fb68a9743af 100644 --- a/net/bluetooth/af_bluetooth.c +++ b/net/bluetooth/af_bluetooth.c | |||
@@ -450,7 +450,7 @@ unsigned int bt_sock_poll(struct file *file, struct socket *sock, poll_table *wa | |||
450 | sk->sk_state == BT_CONFIG) | 450 | sk->sk_state == BT_CONFIG) |
451 | return mask; | 451 | return mask; |
452 | 452 | ||
453 | if (sock_writeable(sk)) | 453 | if (!bt_sk(sk)->suspended && sock_writeable(sk)) |
454 | mask |= POLLOUT | POLLWRNORM | POLLWRBAND; | 454 | mask |= POLLOUT | POLLWRNORM | POLLWRBAND; |
455 | else | 455 | else |
456 | set_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags); | 456 | set_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags); |
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index edfd61addcec..d6dc44cd15b0 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c | |||
@@ -2784,6 +2784,14 @@ static inline void hci_acldata_packet(struct hci_dev *hdev, struct sk_buff *skb) | |||
2784 | if (conn) { | 2784 | if (conn) { |
2785 | hci_conn_enter_active_mode(conn, BT_POWER_FORCE_ACTIVE_OFF); | 2785 | hci_conn_enter_active_mode(conn, BT_POWER_FORCE_ACTIVE_OFF); |
2786 | 2786 | ||
2787 | hci_dev_lock(hdev); | ||
2788 | if (test_bit(HCI_MGMT, &hdev->dev_flags) && | ||
2789 | !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) | ||
2790 | mgmt_device_connected(hdev, &conn->dst, conn->type, | ||
2791 | conn->dst_type, 0, NULL, 0, | ||
2792 | conn->dev_class); | ||
2793 | hci_dev_unlock(hdev); | ||
2794 | |||
2787 | /* Send to upper protocol */ | 2795 | /* Send to upper protocol */ |
2788 | l2cap_recv_acldata(conn, skb, flags); | 2796 | l2cap_recv_acldata(conn, skb, flags); |
2789 | return; | 2797 | return; |
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index 6c065254afc0..1266f78fa8e3 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c | |||
@@ -2039,6 +2039,12 @@ static inline void hci_encrypt_change_evt(struct hci_dev *hdev, struct sk_buff * | |||
2039 | 2039 | ||
2040 | clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags); | 2040 | clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags); |
2041 | 2041 | ||
2042 | if (ev->status && conn->state == BT_CONNECTED) { | ||
2043 | hci_acl_disconn(conn, 0x13); | ||
2044 | hci_conn_put(conn); | ||
2045 | goto unlock; | ||
2046 | } | ||
2047 | |||
2042 | if (conn->state == BT_CONFIG) { | 2048 | if (conn->state == BT_CONFIG) { |
2043 | if (!ev->status) | 2049 | if (!ev->status) |
2044 | conn->state = BT_CONNECTED; | 2050 | conn->state = BT_CONNECTED; |
@@ -2049,6 +2055,7 @@ static inline void hci_encrypt_change_evt(struct hci_dev *hdev, struct sk_buff * | |||
2049 | hci_encrypt_cfm(conn, ev->status, ev->encrypt); | 2055 | hci_encrypt_cfm(conn, ev->status, ev->encrypt); |
2050 | } | 2056 | } |
2051 | 2057 | ||
2058 | unlock: | ||
2052 | hci_dev_unlock(hdev); | 2059 | hci_dev_unlock(hdev); |
2053 | } | 2060 | } |
2054 | 2061 | ||
@@ -2102,7 +2109,7 @@ static inline void hci_remote_features_evt(struct hci_dev *hdev, struct sk_buff | |||
2102 | goto unlock; | 2109 | goto unlock; |
2103 | } | 2110 | } |
2104 | 2111 | ||
2105 | if (!ev->status) { | 2112 | if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) { |
2106 | struct hci_cp_remote_name_req cp; | 2113 | struct hci_cp_remote_name_req cp; |
2107 | memset(&cp, 0, sizeof(cp)); | 2114 | memset(&cp, 0, sizeof(cp)); |
2108 | bacpy(&cp.bdaddr, &conn->dst); | 2115 | bacpy(&cp.bdaddr, &conn->dst); |
@@ -2871,7 +2878,7 @@ static inline void hci_remote_ext_features_evt(struct hci_dev *hdev, struct sk_b | |||
2871 | if (conn->state != BT_CONFIG) | 2878 | if (conn->state != BT_CONFIG) |
2872 | goto unlock; | 2879 | goto unlock; |
2873 | 2880 | ||
2874 | if (!ev->status) { | 2881 | if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) { |
2875 | struct hci_cp_remote_name_req cp; | 2882 | struct hci_cp_remote_name_req cp; |
2876 | memset(&cp, 0, sizeof(cp)); | 2883 | memset(&cp, 0, sizeof(cp)); |
2877 | bacpy(&cp.bdaddr, &conn->dst); | 2884 | bacpy(&cp.bdaddr, &conn->dst); |
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index 94552b33d528..6f9c25b633a6 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c | |||
@@ -4589,6 +4589,11 @@ int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt) | |||
4589 | 4589 | ||
4590 | if (!status && (chan->state == BT_CONNECTED || | 4590 | if (!status && (chan->state == BT_CONNECTED || |
4591 | chan->state == BT_CONFIG)) { | 4591 | chan->state == BT_CONFIG)) { |
4592 | struct sock *sk = chan->sk; | ||
4593 | |||
4594 | bt_sk(sk)->suspended = false; | ||
4595 | sk->sk_state_change(sk); | ||
4596 | |||
4592 | l2cap_check_encryption(chan, encrypt); | 4597 | l2cap_check_encryption(chan, encrypt); |
4593 | l2cap_chan_unlock(chan); | 4598 | l2cap_chan_unlock(chan); |
4594 | continue; | 4599 | continue; |
diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index 29122ed28ea9..04e7c172d49c 100644 --- a/net/bluetooth/l2cap_sock.c +++ b/net/bluetooth/l2cap_sock.c | |||
@@ -592,10 +592,14 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, ch | |||
592 | sk->sk_state = BT_CONFIG; | 592 | sk->sk_state = BT_CONFIG; |
593 | chan->state = BT_CONFIG; | 593 | chan->state = BT_CONFIG; |
594 | 594 | ||
595 | /* or for ACL link, under defer_setup time */ | 595 | /* or for ACL link */ |
596 | } else if (sk->sk_state == BT_CONNECT2 && | 596 | } else if ((sk->sk_state == BT_CONNECT2 && |
597 | bt_sk(sk)->defer_setup) { | 597 | bt_sk(sk)->defer_setup) || |
598 | err = l2cap_chan_check_security(chan); | 598 | sk->sk_state == BT_CONNECTED) { |
599 | if (!l2cap_chan_check_security(chan)) | ||
600 | bt_sk(sk)->suspended = true; | ||
601 | else | ||
602 | sk->sk_state_change(sk); | ||
599 | } else { | 603 | } else { |
600 | err = -EINVAL; | 604 | err = -EINVAL; |
601 | } | 605 | } |
diff --git a/net/core/dev.c b/net/core/dev.c index 66cae6e975d9..33684b6e95e2 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -1616,10 +1616,14 @@ int dev_forward_skb(struct net_device *dev, struct sk_buff *skb) | |||
1616 | return NET_RX_DROP; | 1616 | return NET_RX_DROP; |
1617 | } | 1617 | } |
1618 | skb->skb_iif = 0; | 1618 | skb->skb_iif = 0; |
1619 | skb_set_dev(skb, dev); | 1619 | skb->dev = dev; |
1620 | skb_dst_drop(skb); | ||
1620 | skb->tstamp.tv64 = 0; | 1621 | skb->tstamp.tv64 = 0; |
1621 | skb->pkt_type = PACKET_HOST; | 1622 | skb->pkt_type = PACKET_HOST; |
1622 | skb->protocol = eth_type_trans(skb, dev); | 1623 | skb->protocol = eth_type_trans(skb, dev); |
1624 | skb->mark = 0; | ||
1625 | secpath_reset(skb); | ||
1626 | nf_reset(skb); | ||
1623 | return netif_rx(skb); | 1627 | return netif_rx(skb); |
1624 | } | 1628 | } |
1625 | EXPORT_SYMBOL_GPL(dev_forward_skb); | 1629 | EXPORT_SYMBOL_GPL(dev_forward_skb); |
@@ -1867,36 +1871,6 @@ void netif_device_attach(struct net_device *dev) | |||
1867 | } | 1871 | } |
1868 | EXPORT_SYMBOL(netif_device_attach); | 1872 | EXPORT_SYMBOL(netif_device_attach); |
1869 | 1873 | ||
1870 | /** | ||
1871 | * skb_dev_set -- assign a new device to a buffer | ||
1872 | * @skb: buffer for the new device | ||
1873 | * @dev: network device | ||
1874 | * | ||
1875 | * If an skb is owned by a device already, we have to reset | ||
1876 | * all data private to the namespace a device belongs to | ||
1877 | * before assigning it a new device. | ||
1878 | */ | ||
1879 | #ifdef CONFIG_NET_NS | ||
1880 | void skb_set_dev(struct sk_buff *skb, struct net_device *dev) | ||
1881 | { | ||
1882 | skb_dst_drop(skb); | ||
1883 | if (skb->dev && !net_eq(dev_net(skb->dev), dev_net(dev))) { | ||
1884 | secpath_reset(skb); | ||
1885 | nf_reset(skb); | ||
1886 | skb_init_secmark(skb); | ||
1887 | skb->mark = 0; | ||
1888 | skb->priority = 0; | ||
1889 | skb->nf_trace = 0; | ||
1890 | skb->ipvs_property = 0; | ||
1891 | #ifdef CONFIG_NET_SCHED | ||
1892 | skb->tc_index = 0; | ||
1893 | #endif | ||
1894 | } | ||
1895 | skb->dev = dev; | ||
1896 | } | ||
1897 | EXPORT_SYMBOL(skb_set_dev); | ||
1898 | #endif /* CONFIG_NET_NS */ | ||
1899 | |||
1900 | static void skb_warn_bad_offload(const struct sk_buff *skb) | 1874 | static void skb_warn_bad_offload(const struct sk_buff *skb) |
1901 | { | 1875 | { |
1902 | static const netdev_features_t null_features = 0; | 1876 | static const netdev_features_t null_features = 0; |
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 33912573959d..70236db0fb4f 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c | |||
@@ -1931,7 +1931,7 @@ static int pktgen_device_event(struct notifier_block *unused, | |||
1931 | { | 1931 | { |
1932 | struct net_device *dev = ptr; | 1932 | struct net_device *dev = ptr; |
1933 | 1933 | ||
1934 | if (!net_eq(dev_net(dev), &init_net)) | 1934 | if (!net_eq(dev_net(dev), &init_net) || pktgen_exiting) |
1935 | return NOTIFY_DONE; | 1935 | return NOTIFY_DONE; |
1936 | 1936 | ||
1937 | /* It is OK that we do not hold the group lock right now, | 1937 | /* It is OK that we do not hold the group lock right now, |
@@ -3754,12 +3754,18 @@ static void __exit pg_cleanup(void) | |||
3754 | { | 3754 | { |
3755 | struct pktgen_thread *t; | 3755 | struct pktgen_thread *t; |
3756 | struct list_head *q, *n; | 3756 | struct list_head *q, *n; |
3757 | struct list_head list; | ||
3757 | 3758 | ||
3758 | /* Stop all interfaces & threads */ | 3759 | /* Stop all interfaces & threads */ |
3759 | pktgen_exiting = true; | 3760 | pktgen_exiting = true; |
3760 | 3761 | ||
3761 | list_for_each_safe(q, n, &pktgen_threads) { | 3762 | mutex_lock(&pktgen_thread_lock); |
3763 | list_splice(&list, &pktgen_threads); | ||
3764 | mutex_unlock(&pktgen_thread_lock); | ||
3765 | |||
3766 | list_for_each_safe(q, n, &list) { | ||
3762 | t = list_entry(q, struct pktgen_thread, th_list); | 3767 | t = list_entry(q, struct pktgen_thread, th_list); |
3768 | list_del(&t->th_list); | ||
3763 | kthread_stop(t->tsk); | 3769 | kthread_stop(t->tsk); |
3764 | kfree(t); | 3770 | kfree(t); |
3765 | } | 3771 | } |
diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c index bce36f1a37b4..30b88d7b4bd6 100644 --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c | |||
@@ -1370,6 +1370,8 @@ static int check_leaf(struct fib_table *tb, struct trie *t, struct leaf *l, | |||
1370 | 1370 | ||
1371 | if (fa->fa_tos && fa->fa_tos != flp->flowi4_tos) | 1371 | if (fa->fa_tos && fa->fa_tos != flp->flowi4_tos) |
1372 | continue; | 1372 | continue; |
1373 | if (fi->fib_dead) | ||
1374 | continue; | ||
1373 | if (fa->fa_info->fib_scope < flp->flowi4_scope) | 1375 | if (fa->fa_info->fib_scope < flp->flowi4_scope) |
1374 | continue; | 1376 | continue; |
1375 | fib_alias_accessed(fa); | 1377 | fib_alias_accessed(fa); |
diff --git a/net/netfilter/ipset/ip_set_hash_ip.c b/net/netfilter/ipset/ip_set_hash_ip.c index 507fe93794aa..a68dbd4f1e4e 100644 --- a/net/netfilter/ipset/ip_set_hash_ip.c +++ b/net/netfilter/ipset/ip_set_hash_ip.c | |||
@@ -368,6 +368,7 @@ hash_ip_create(struct ip_set *set, struct nlattr *tb[], u32 flags) | |||
368 | { | 368 | { |
369 | u32 hashsize = IPSET_DEFAULT_HASHSIZE, maxelem = IPSET_DEFAULT_MAXELEM; | 369 | u32 hashsize = IPSET_DEFAULT_HASHSIZE, maxelem = IPSET_DEFAULT_MAXELEM; |
370 | u8 netmask, hbits; | 370 | u8 netmask, hbits; |
371 | size_t hsize; | ||
371 | struct ip_set_hash *h; | 372 | struct ip_set_hash *h; |
372 | 373 | ||
373 | if (!(set->family == NFPROTO_IPV4 || set->family == NFPROTO_IPV6)) | 374 | if (!(set->family == NFPROTO_IPV4 || set->family == NFPROTO_IPV6)) |
@@ -409,9 +410,12 @@ hash_ip_create(struct ip_set *set, struct nlattr *tb[], u32 flags) | |||
409 | h->timeout = IPSET_NO_TIMEOUT; | 410 | h->timeout = IPSET_NO_TIMEOUT; |
410 | 411 | ||
411 | hbits = htable_bits(hashsize); | 412 | hbits = htable_bits(hashsize); |
412 | h->table = ip_set_alloc( | 413 | hsize = htable_size(hbits); |
413 | sizeof(struct htable) | 414 | if (hsize == 0) { |
414 | + jhash_size(hbits) * sizeof(struct hbucket)); | 415 | kfree(h); |
416 | return -ENOMEM; | ||
417 | } | ||
418 | h->table = ip_set_alloc(hsize); | ||
415 | if (!h->table) { | 419 | if (!h->table) { |
416 | kfree(h); | 420 | kfree(h); |
417 | return -ENOMEM; | 421 | return -ENOMEM; |
diff --git a/net/netfilter/ipset/ip_set_hash_ipport.c b/net/netfilter/ipset/ip_set_hash_ipport.c index 68f284c97490..92722bb82eea 100644 --- a/net/netfilter/ipset/ip_set_hash_ipport.c +++ b/net/netfilter/ipset/ip_set_hash_ipport.c | |||
@@ -452,6 +452,7 @@ hash_ipport_create(struct ip_set *set, struct nlattr *tb[], u32 flags) | |||
452 | struct ip_set_hash *h; | 452 | struct ip_set_hash *h; |
453 | u32 hashsize = IPSET_DEFAULT_HASHSIZE, maxelem = IPSET_DEFAULT_MAXELEM; | 453 | u32 hashsize = IPSET_DEFAULT_HASHSIZE, maxelem = IPSET_DEFAULT_MAXELEM; |
454 | u8 hbits; | 454 | u8 hbits; |
455 | size_t hsize; | ||
455 | 456 | ||
456 | if (!(set->family == NFPROTO_IPV4 || set->family == NFPROTO_IPV6)) | 457 | if (!(set->family == NFPROTO_IPV4 || set->family == NFPROTO_IPV6)) |
457 | return -IPSET_ERR_INVALID_FAMILY; | 458 | return -IPSET_ERR_INVALID_FAMILY; |
@@ -479,9 +480,12 @@ hash_ipport_create(struct ip_set *set, struct nlattr *tb[], u32 flags) | |||
479 | h->timeout = IPSET_NO_TIMEOUT; | 480 | h->timeout = IPSET_NO_TIMEOUT; |
480 | 481 | ||
481 | hbits = htable_bits(hashsize); | 482 | hbits = htable_bits(hashsize); |
482 | h->table = ip_set_alloc( | 483 | hsize = htable_size(hbits); |
483 | sizeof(struct htable) | 484 | if (hsize == 0) { |
484 | + jhash_size(hbits) * sizeof(struct hbucket)); | 485 | kfree(h); |
486 | return -ENOMEM; | ||
487 | } | ||
488 | h->table = ip_set_alloc(hsize); | ||
485 | if (!h->table) { | 489 | if (!h->table) { |
486 | kfree(h); | 490 | kfree(h); |
487 | return -ENOMEM; | 491 | return -ENOMEM; |
diff --git a/net/netfilter/ipset/ip_set_hash_ipportip.c b/net/netfilter/ipset/ip_set_hash_ipportip.c index 1eec4b9e0dca..0637ce096def 100644 --- a/net/netfilter/ipset/ip_set_hash_ipportip.c +++ b/net/netfilter/ipset/ip_set_hash_ipportip.c | |||
@@ -470,6 +470,7 @@ hash_ipportip_create(struct ip_set *set, struct nlattr *tb[], u32 flags) | |||
470 | struct ip_set_hash *h; | 470 | struct ip_set_hash *h; |
471 | u32 hashsize = IPSET_DEFAULT_HASHSIZE, maxelem = IPSET_DEFAULT_MAXELEM; | 471 | u32 hashsize = IPSET_DEFAULT_HASHSIZE, maxelem = IPSET_DEFAULT_MAXELEM; |
472 | u8 hbits; | 472 | u8 hbits; |
473 | size_t hsize; | ||
473 | 474 | ||
474 | if (!(set->family == NFPROTO_IPV4 || set->family == NFPROTO_IPV6)) | 475 | if (!(set->family == NFPROTO_IPV4 || set->family == NFPROTO_IPV6)) |
475 | return -IPSET_ERR_INVALID_FAMILY; | 476 | return -IPSET_ERR_INVALID_FAMILY; |
@@ -497,9 +498,12 @@ hash_ipportip_create(struct ip_set *set, struct nlattr *tb[], u32 flags) | |||
497 | h->timeout = IPSET_NO_TIMEOUT; | 498 | h->timeout = IPSET_NO_TIMEOUT; |
498 | 499 | ||
499 | hbits = htable_bits(hashsize); | 500 | hbits = htable_bits(hashsize); |
500 | h->table = ip_set_alloc( | 501 | hsize = htable_size(hbits); |
501 | sizeof(struct htable) | 502 | if (hsize == 0) { |
502 | + jhash_size(hbits) * sizeof(struct hbucket)); | 503 | kfree(h); |
504 | return -ENOMEM; | ||
505 | } | ||
506 | h->table = ip_set_alloc(hsize); | ||
503 | if (!h->table) { | 507 | if (!h->table) { |
504 | kfree(h); | 508 | kfree(h); |
505 | return -ENOMEM; | 509 | return -ENOMEM; |
diff --git a/net/netfilter/ipset/ip_set_hash_ipportnet.c b/net/netfilter/ipset/ip_set_hash_ipportnet.c index 62d66ecef369..1ce21ca976e1 100644 --- a/net/netfilter/ipset/ip_set_hash_ipportnet.c +++ b/net/netfilter/ipset/ip_set_hash_ipportnet.c | |||
@@ -619,6 +619,7 @@ hash_ipportnet_create(struct ip_set *set, struct nlattr *tb[], u32 flags) | |||
619 | struct ip_set_hash *h; | 619 | struct ip_set_hash *h; |
620 | u32 hashsize = IPSET_DEFAULT_HASHSIZE, maxelem = IPSET_DEFAULT_MAXELEM; | 620 | u32 hashsize = IPSET_DEFAULT_HASHSIZE, maxelem = IPSET_DEFAULT_MAXELEM; |
621 | u8 hbits; | 621 | u8 hbits; |
622 | size_t hsize; | ||
622 | 623 | ||
623 | if (!(set->family == NFPROTO_IPV4 || set->family == NFPROTO_IPV6)) | 624 | if (!(set->family == NFPROTO_IPV4 || set->family == NFPROTO_IPV6)) |
624 | return -IPSET_ERR_INVALID_FAMILY; | 625 | return -IPSET_ERR_INVALID_FAMILY; |
@@ -648,9 +649,12 @@ hash_ipportnet_create(struct ip_set *set, struct nlattr *tb[], u32 flags) | |||
648 | h->timeout = IPSET_NO_TIMEOUT; | 649 | h->timeout = IPSET_NO_TIMEOUT; |
649 | 650 | ||
650 | hbits = htable_bits(hashsize); | 651 | hbits = htable_bits(hashsize); |
651 | h->table = ip_set_alloc( | 652 | hsize = htable_size(hbits); |
652 | sizeof(struct htable) | 653 | if (hsize == 0) { |
653 | + jhash_size(hbits) * sizeof(struct hbucket)); | 654 | kfree(h); |
655 | return -ENOMEM; | ||
656 | } | ||
657 | h->table = ip_set_alloc(hsize); | ||
654 | if (!h->table) { | 658 | if (!h->table) { |
655 | kfree(h); | 659 | kfree(h); |
656 | return -ENOMEM; | 660 | return -ENOMEM; |
diff --git a/net/netfilter/ipset/ip_set_hash_net.c b/net/netfilter/ipset/ip_set_hash_net.c index 6607a814be57..c57a6a09906d 100644 --- a/net/netfilter/ipset/ip_set_hash_net.c +++ b/net/netfilter/ipset/ip_set_hash_net.c | |||
@@ -463,6 +463,7 @@ hash_net_create(struct ip_set *set, struct nlattr *tb[], u32 flags) | |||
463 | u32 hashsize = IPSET_DEFAULT_HASHSIZE, maxelem = IPSET_DEFAULT_MAXELEM; | 463 | u32 hashsize = IPSET_DEFAULT_HASHSIZE, maxelem = IPSET_DEFAULT_MAXELEM; |
464 | struct ip_set_hash *h; | 464 | struct ip_set_hash *h; |
465 | u8 hbits; | 465 | u8 hbits; |
466 | size_t hsize; | ||
466 | 467 | ||
467 | if (!(set->family == NFPROTO_IPV4 || set->family == NFPROTO_IPV6)) | 468 | if (!(set->family == NFPROTO_IPV4 || set->family == NFPROTO_IPV6)) |
468 | return -IPSET_ERR_INVALID_FAMILY; | 469 | return -IPSET_ERR_INVALID_FAMILY; |
@@ -492,9 +493,12 @@ hash_net_create(struct ip_set *set, struct nlattr *tb[], u32 flags) | |||
492 | h->timeout = IPSET_NO_TIMEOUT; | 493 | h->timeout = IPSET_NO_TIMEOUT; |
493 | 494 | ||
494 | hbits = htable_bits(hashsize); | 495 | hbits = htable_bits(hashsize); |
495 | h->table = ip_set_alloc( | 496 | hsize = htable_size(hbits); |
496 | sizeof(struct htable) | 497 | if (hsize == 0) { |
497 | + jhash_size(hbits) * sizeof(struct hbucket)); | 498 | kfree(h); |
499 | return -ENOMEM; | ||
500 | } | ||
501 | h->table = ip_set_alloc(hsize); | ||
498 | if (!h->table) { | 502 | if (!h->table) { |
499 | kfree(h); | 503 | kfree(h); |
500 | return -ENOMEM; | 504 | return -ENOMEM; |
diff --git a/net/netfilter/ipset/ip_set_hash_netiface.c b/net/netfilter/ipset/ip_set_hash_netiface.c index 6093f3daa911..ee863943c826 100644 --- a/net/netfilter/ipset/ip_set_hash_netiface.c +++ b/net/netfilter/ipset/ip_set_hash_netiface.c | |||
@@ -726,6 +726,7 @@ hash_netiface_create(struct ip_set *set, struct nlattr *tb[], u32 flags) | |||
726 | struct ip_set_hash *h; | 726 | struct ip_set_hash *h; |
727 | u32 hashsize = IPSET_DEFAULT_HASHSIZE, maxelem = IPSET_DEFAULT_MAXELEM; | 727 | u32 hashsize = IPSET_DEFAULT_HASHSIZE, maxelem = IPSET_DEFAULT_MAXELEM; |
728 | u8 hbits; | 728 | u8 hbits; |
729 | size_t hsize; | ||
729 | 730 | ||
730 | if (!(set->family == NFPROTO_IPV4 || set->family == NFPROTO_IPV6)) | 731 | if (!(set->family == NFPROTO_IPV4 || set->family == NFPROTO_IPV6)) |
731 | return -IPSET_ERR_INVALID_FAMILY; | 732 | return -IPSET_ERR_INVALID_FAMILY; |
@@ -756,9 +757,12 @@ hash_netiface_create(struct ip_set *set, struct nlattr *tb[], u32 flags) | |||
756 | h->ahash_max = AHASH_MAX_SIZE; | 757 | h->ahash_max = AHASH_MAX_SIZE; |
757 | 758 | ||
758 | hbits = htable_bits(hashsize); | 759 | hbits = htable_bits(hashsize); |
759 | h->table = ip_set_alloc( | 760 | hsize = htable_size(hbits); |
760 | sizeof(struct htable) | 761 | if (hsize == 0) { |
761 | + jhash_size(hbits) * sizeof(struct hbucket)); | 762 | kfree(h); |
763 | return -ENOMEM; | ||
764 | } | ||
765 | h->table = ip_set_alloc(hsize); | ||
762 | if (!h->table) { | 766 | if (!h->table) { |
763 | kfree(h); | 767 | kfree(h); |
764 | return -ENOMEM; | 768 | return -ENOMEM; |
diff --git a/net/netfilter/ipset/ip_set_hash_netport.c b/net/netfilter/ipset/ip_set_hash_netport.c index ae3c644adc14..fc3143a2d41b 100644 --- a/net/netfilter/ipset/ip_set_hash_netport.c +++ b/net/netfilter/ipset/ip_set_hash_netport.c | |||
@@ -575,6 +575,7 @@ hash_netport_create(struct ip_set *set, struct nlattr *tb[], u32 flags) | |||
575 | struct ip_set_hash *h; | 575 | struct ip_set_hash *h; |
576 | u32 hashsize = IPSET_DEFAULT_HASHSIZE, maxelem = IPSET_DEFAULT_MAXELEM; | 576 | u32 hashsize = IPSET_DEFAULT_HASHSIZE, maxelem = IPSET_DEFAULT_MAXELEM; |
577 | u8 hbits; | 577 | u8 hbits; |
578 | size_t hsize; | ||
578 | 579 | ||
579 | if (!(set->family == NFPROTO_IPV4 || set->family == NFPROTO_IPV6)) | 580 | if (!(set->family == NFPROTO_IPV4 || set->family == NFPROTO_IPV6)) |
580 | return -IPSET_ERR_INVALID_FAMILY; | 581 | return -IPSET_ERR_INVALID_FAMILY; |
@@ -604,9 +605,12 @@ hash_netport_create(struct ip_set *set, struct nlattr *tb[], u32 flags) | |||
604 | h->timeout = IPSET_NO_TIMEOUT; | 605 | h->timeout = IPSET_NO_TIMEOUT; |
605 | 606 | ||
606 | hbits = htable_bits(hashsize); | 607 | hbits = htable_bits(hashsize); |
607 | h->table = ip_set_alloc( | 608 | hsize = htable_size(hbits); |
608 | sizeof(struct htable) | 609 | if (hsize == 0) { |
609 | + jhash_size(hbits) * sizeof(struct hbucket)); | 610 | kfree(h); |
611 | return -ENOMEM; | ||
612 | } | ||
613 | h->table = ip_set_alloc(hsize); | ||
610 | if (!h->table) { | 614 | if (!h->table) { |
611 | kfree(h); | 615 | kfree(h); |
612 | return -ENOMEM; | 616 | return -ENOMEM; |
diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c index f86de29979ef..2c74daa5aca5 100644 --- a/net/openvswitch/datapath.c +++ b/net/openvswitch/datapath.c | |||
@@ -321,7 +321,7 @@ static int queue_userspace_packet(int dp_ifindex, struct sk_buff *skb, | |||
321 | return -ENOMEM; | 321 | return -ENOMEM; |
322 | 322 | ||
323 | nskb = __vlan_put_tag(nskb, vlan_tx_tag_get(nskb)); | 323 | nskb = __vlan_put_tag(nskb, vlan_tx_tag_get(nskb)); |
324 | if (!skb) | 324 | if (!nskb) |
325 | return -ENOMEM; | 325 | return -ENOMEM; |
326 | 326 | ||
327 | nskb->vlan_tci = 0; | 327 | nskb->vlan_tci = 0; |
@@ -421,6 +421,19 @@ static int validate_sample(const struct nlattr *attr, | |||
421 | return validate_actions(actions, key, depth + 1); | 421 | return validate_actions(actions, key, depth + 1); |
422 | } | 422 | } |
423 | 423 | ||
424 | static int validate_tp_port(const struct sw_flow_key *flow_key) | ||
425 | { | ||
426 | if (flow_key->eth.type == htons(ETH_P_IP)) { | ||
427 | if (flow_key->ipv4.tp.src && flow_key->ipv4.tp.dst) | ||
428 | return 0; | ||
429 | } else if (flow_key->eth.type == htons(ETH_P_IPV6)) { | ||
430 | if (flow_key->ipv6.tp.src && flow_key->ipv6.tp.dst) | ||
431 | return 0; | ||
432 | } | ||
433 | |||
434 | return -EINVAL; | ||
435 | } | ||
436 | |||
424 | static int validate_set(const struct nlattr *a, | 437 | static int validate_set(const struct nlattr *a, |
425 | const struct sw_flow_key *flow_key) | 438 | const struct sw_flow_key *flow_key) |
426 | { | 439 | { |
@@ -462,18 +475,13 @@ static int validate_set(const struct nlattr *a, | |||
462 | if (flow_key->ip.proto != IPPROTO_TCP) | 475 | if (flow_key->ip.proto != IPPROTO_TCP) |
463 | return -EINVAL; | 476 | return -EINVAL; |
464 | 477 | ||
465 | if (!flow_key->ipv4.tp.src || !flow_key->ipv4.tp.dst) | 478 | return validate_tp_port(flow_key); |
466 | return -EINVAL; | ||
467 | |||
468 | break; | ||
469 | 479 | ||
470 | case OVS_KEY_ATTR_UDP: | 480 | case OVS_KEY_ATTR_UDP: |
471 | if (flow_key->ip.proto != IPPROTO_UDP) | 481 | if (flow_key->ip.proto != IPPROTO_UDP) |
472 | return -EINVAL; | 482 | return -EINVAL; |
473 | 483 | ||
474 | if (!flow_key->ipv4.tp.src || !flow_key->ipv4.tp.dst) | 484 | return validate_tp_port(flow_key); |
475 | return -EINVAL; | ||
476 | break; | ||
477 | 485 | ||
478 | default: | 486 | default: |
479 | return -EINVAL; | 487 | return -EINVAL; |
@@ -1647,10 +1655,9 @@ static int ovs_vport_cmd_set(struct sk_buff *skb, struct genl_info *info) | |||
1647 | reply = ovs_vport_cmd_build_info(vport, info->snd_pid, info->snd_seq, | 1655 | reply = ovs_vport_cmd_build_info(vport, info->snd_pid, info->snd_seq, |
1648 | OVS_VPORT_CMD_NEW); | 1656 | OVS_VPORT_CMD_NEW); |
1649 | if (IS_ERR(reply)) { | 1657 | if (IS_ERR(reply)) { |
1650 | err = PTR_ERR(reply); | ||
1651 | netlink_set_err(init_net.genl_sock, 0, | 1658 | netlink_set_err(init_net.genl_sock, 0, |
1652 | ovs_dp_vport_multicast_group.id, err); | 1659 | ovs_dp_vport_multicast_group.id, PTR_ERR(reply)); |
1653 | return 0; | 1660 | goto exit_unlock; |
1654 | } | 1661 | } |
1655 | 1662 | ||
1656 | genl_notify(reply, genl_info_net(info), info->snd_pid, | 1663 | genl_notify(reply, genl_info_net(info), info->snd_pid, |
diff --git a/net/openvswitch/flow.c b/net/openvswitch/flow.c index 7cb416381e87..6d4d8097cf96 100644 --- a/net/openvswitch/flow.c +++ b/net/openvswitch/flow.c | |||
@@ -183,7 +183,8 @@ void ovs_flow_used(struct sw_flow *flow, struct sk_buff *skb) | |||
183 | u8 tcp_flags = 0; | 183 | u8 tcp_flags = 0; |
184 | 184 | ||
185 | if (flow->key.eth.type == htons(ETH_P_IP) && | 185 | if (flow->key.eth.type == htons(ETH_P_IP) && |
186 | flow->key.ip.proto == IPPROTO_TCP) { | 186 | flow->key.ip.proto == IPPROTO_TCP && |
187 | likely(skb->len >= skb_transport_offset(skb) + sizeof(struct tcphdr))) { | ||
187 | u8 *tcp = (u8 *)tcp_hdr(skb); | 188 | u8 *tcp = (u8 *)tcp_hdr(skb); |
188 | tcp_flags = *(tcp + TCP_FLAGS_OFFSET) & TCP_FLAG_MASK; | 189 | tcp_flags = *(tcp + TCP_FLAGS_OFFSET) & TCP_FLAG_MASK; |
189 | } | 190 | } |
diff --git a/net/sctp/output.c b/net/sctp/output.c index 69534c5f8afa..f1b7d4bb591e 100644 --- a/net/sctp/output.c +++ b/net/sctp/output.c | |||
@@ -377,9 +377,7 @@ int sctp_packet_transmit(struct sctp_packet *packet) | |||
377 | */ | 377 | */ |
378 | skb_set_owner_w(nskb, sk); | 378 | skb_set_owner_w(nskb, sk); |
379 | 379 | ||
380 | /* The 'obsolete' field of dst is set to 2 when a dst is freed. */ | 380 | if (!sctp_transport_dst_check(tp)) { |
381 | if (!dst || (dst->obsolete > 1)) { | ||
382 | dst_release(dst); | ||
383 | sctp_transport_route(tp, NULL, sctp_sk(sk)); | 381 | sctp_transport_route(tp, NULL, sctp_sk(sk)); |
384 | if (asoc && (asoc->param_flags & SPP_PMTUD_ENABLE)) { | 382 | if (asoc && (asoc->param_flags & SPP_PMTUD_ENABLE)) { |
385 | sctp_assoc_sync_pmtu(asoc); | 383 | sctp_assoc_sync_pmtu(asoc); |
diff --git a/net/sctp/transport.c b/net/sctp/transport.c index 3889330b7b04..b026ba0c6992 100644 --- a/net/sctp/transport.c +++ b/net/sctp/transport.c | |||
@@ -226,23 +226,6 @@ void sctp_transport_pmtu(struct sctp_transport *transport, struct sock *sk) | |||
226 | transport->pathmtu = SCTP_DEFAULT_MAXSEGMENT; | 226 | transport->pathmtu = SCTP_DEFAULT_MAXSEGMENT; |
227 | } | 227 | } |
228 | 228 | ||
229 | /* this is a complete rip-off from __sk_dst_check | ||
230 | * the cookie is always 0 since this is how it's used in the | ||
231 | * pmtu code | ||
232 | */ | ||
233 | static struct dst_entry *sctp_transport_dst_check(struct sctp_transport *t) | ||
234 | { | ||
235 | struct dst_entry *dst = t->dst; | ||
236 | |||
237 | if (dst && dst->obsolete && dst->ops->check(dst, 0) == NULL) { | ||
238 | dst_release(t->dst); | ||
239 | t->dst = NULL; | ||
240 | return NULL; | ||
241 | } | ||
242 | |||
243 | return dst; | ||
244 | } | ||
245 | |||
246 | void sctp_transport_update_pmtu(struct sctp_transport *t, u32 pmtu) | 229 | void sctp_transport_update_pmtu(struct sctp_transport *t, u32 pmtu) |
247 | { | 230 | { |
248 | struct dst_entry *dst; | 231 | struct dst_entry *dst; |
diff --git a/net/sunrpc/auth_gss/gss_mech_switch.c b/net/sunrpc/auth_gss/gss_mech_switch.c index ca8cad8251c7..782bfe1b6465 100644 --- a/net/sunrpc/auth_gss/gss_mech_switch.c +++ b/net/sunrpc/auth_gss/gss_mech_switch.c | |||
@@ -242,12 +242,13 @@ EXPORT_SYMBOL_GPL(gss_mech_get_by_pseudoflavor); | |||
242 | int gss_mech_list_pseudoflavors(rpc_authflavor_t *array_ptr) | 242 | int gss_mech_list_pseudoflavors(rpc_authflavor_t *array_ptr) |
243 | { | 243 | { |
244 | struct gss_api_mech *pos = NULL; | 244 | struct gss_api_mech *pos = NULL; |
245 | int i = 0; | 245 | int j, i = 0; |
246 | 246 | ||
247 | spin_lock(®istered_mechs_lock); | 247 | spin_lock(®istered_mechs_lock); |
248 | list_for_each_entry(pos, ®istered_mechs, gm_list) { | 248 | list_for_each_entry(pos, ®istered_mechs, gm_list) { |
249 | array_ptr[i] = pos->gm_pfs->pseudoflavor; | 249 | for (j=0; j < pos->gm_pf_num; j++) { |
250 | i++; | 250 | array_ptr[i++] = pos->gm_pfs[j].pseudoflavor; |
251 | } | ||
251 | } | 252 | } |
252 | spin_unlock(®istered_mechs_lock); | 253 | spin_unlock(®istered_mechs_lock); |
253 | return i; | 254 | return i; |
diff --git a/sound/pci/echoaudio/echoaudio_dsp.c b/sound/pci/echoaudio/echoaudio_dsp.c index 64417a733220..d8c670c9d62c 100644 --- a/sound/pci/echoaudio/echoaudio_dsp.c +++ b/sound/pci/echoaudio/echoaudio_dsp.c | |||
@@ -475,7 +475,7 @@ static int load_firmware(struct echoaudio *chip) | |||
475 | const struct firmware *fw; | 475 | const struct firmware *fw; |
476 | int box_type, err; | 476 | int box_type, err; |
477 | 477 | ||
478 | if (snd_BUG_ON(!chip->dsp_code_to_load || !chip->comm_page)) | 478 | if (snd_BUG_ON(!chip->comm_page)) |
479 | return -EPERM; | 479 | return -EPERM; |
480 | 480 | ||
481 | /* See if the ASIC is present and working - only if the DSP is already loaded */ | 481 | /* See if the ASIC is present and working - only if the DSP is already loaded */ |
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index 7a8fcc4c15f8..841475cc13b6 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c | |||
@@ -5444,10 +5444,6 @@ int snd_hda_suspend(struct hda_bus *bus) | |||
5444 | list_for_each_entry(codec, &bus->codec_list, list) { | 5444 | list_for_each_entry(codec, &bus->codec_list, list) { |
5445 | if (hda_codec_is_power_on(codec)) | 5445 | if (hda_codec_is_power_on(codec)) |
5446 | hda_call_codec_suspend(codec); | 5446 | hda_call_codec_suspend(codec); |
5447 | else /* forcibly change the power to D3 even if not used */ | ||
5448 | hda_set_power_state(codec, | ||
5449 | codec->afg ? codec->afg : codec->mfg, | ||
5450 | AC_PWRST_D3); | ||
5451 | if (codec->patch_ops.post_suspend) | 5447 | if (codec->patch_ops.post_suspend) |
5452 | codec->patch_ops.post_suspend(codec); | 5448 | codec->patch_ops.post_suspend(codec); |
5453 | } | 5449 | } |
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index c19e71a94e1b..1f350522bed4 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
@@ -783,11 +783,13 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus, | |||
783 | { | 783 | { |
784 | struct azx *chip = bus->private_data; | 784 | struct azx *chip = bus->private_data; |
785 | unsigned long timeout; | 785 | unsigned long timeout; |
786 | unsigned long loopcounter; | ||
786 | int do_poll = 0; | 787 | int do_poll = 0; |
787 | 788 | ||
788 | again: | 789 | again: |
789 | timeout = jiffies + msecs_to_jiffies(1000); | 790 | timeout = jiffies + msecs_to_jiffies(1000); |
790 | for (;;) { | 791 | |
792 | for (loopcounter = 0;; loopcounter++) { | ||
791 | if (chip->polling_mode || do_poll) { | 793 | if (chip->polling_mode || do_poll) { |
792 | spin_lock_irq(&chip->reg_lock); | 794 | spin_lock_irq(&chip->reg_lock); |
793 | azx_update_rirb(chip); | 795 | azx_update_rirb(chip); |
@@ -803,7 +805,7 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus, | |||
803 | } | 805 | } |
804 | if (time_after(jiffies, timeout)) | 806 | if (time_after(jiffies, timeout)) |
805 | break; | 807 | break; |
806 | if (bus->needs_damn_long_delay) | 808 | if (bus->needs_damn_long_delay || loopcounter > 3000) |
807 | msleep(2); /* temporary workaround */ | 809 | msleep(2); /* temporary workaround */ |
808 | else { | 810 | else { |
809 | udelay(10); | 811 | udelay(10); |
@@ -2351,6 +2353,17 @@ static void azx_power_notify(struct hda_bus *bus) | |||
2351 | * power management | 2353 | * power management |
2352 | */ | 2354 | */ |
2353 | 2355 | ||
2356 | static int snd_hda_codecs_inuse(struct hda_bus *bus) | ||
2357 | { | ||
2358 | struct hda_codec *codec; | ||
2359 | |||
2360 | list_for_each_entry(codec, &bus->codec_list, list) { | ||
2361 | if (snd_hda_codec_needs_resume(codec)) | ||
2362 | return 1; | ||
2363 | } | ||
2364 | return 0; | ||
2365 | } | ||
2366 | |||
2354 | static int azx_suspend(struct pci_dev *pci, pm_message_t state) | 2367 | static int azx_suspend(struct pci_dev *pci, pm_message_t state) |
2355 | { | 2368 | { |
2356 | struct snd_card *card = pci_get_drvdata(pci); | 2369 | struct snd_card *card = pci_get_drvdata(pci); |
@@ -2397,7 +2410,8 @@ static int azx_resume(struct pci_dev *pci) | |||
2397 | return -EIO; | 2410 | return -EIO; |
2398 | azx_init_pci(chip); | 2411 | azx_init_pci(chip); |
2399 | 2412 | ||
2400 | azx_init_chip(chip, 1); | 2413 | if (snd_hda_codecs_inuse(chip->bus)) |
2414 | azx_init_chip(chip, 1); | ||
2401 | 2415 | ||
2402 | snd_hda_resume(chip->bus); | 2416 | snd_hda_resume(chip->bus); |
2403 | snd_power_change_state(card, SNDRV_CTL_POWER_D0); | 2417 | snd_power_change_state(card, SNDRV_CTL_POWER_D0); |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 818f90bc7d57..7810913d07a0 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -5405,6 +5405,8 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = { | |||
5405 | SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G", | 5405 | SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G", |
5406 | ALC882_FIXUP_ACER_ASPIRE_4930G), | 5406 | ALC882_FIXUP_ACER_ASPIRE_4930G), |
5407 | SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210), | 5407 | SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210), |
5408 | SND_PCI_QUIRK(0x1025, 0x021e, "Acer Aspire 5739G", | ||
5409 | ALC882_FIXUP_ACER_ASPIRE_4930G), | ||
5408 | SND_PCI_QUIRK(0x1025, 0x0259, "Acer Aspire 5935", ALC889_FIXUP_DAC_ROUTE), | 5410 | SND_PCI_QUIRK(0x1025, 0x0259, "Acer Aspire 5935", ALC889_FIXUP_DAC_ROUTE), |
5409 | SND_PCI_QUIRK(0x1025, 0x026b, "Acer Aspire 8940G", ALC882_FIXUP_ACER_ASPIRE_8930G), | 5411 | SND_PCI_QUIRK(0x1025, 0x026b, "Acer Aspire 8940G", ALC882_FIXUP_ACER_ASPIRE_8930G), |
5410 | SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736), | 5412 | SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736), |
@@ -5438,6 +5440,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = { | |||
5438 | SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_IMAC91_VREF), | 5440 | SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_IMAC91_VREF), |
5439 | 5441 | ||
5440 | SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD), | 5442 | SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD), |
5443 | SND_PCI_QUIRK(0x1462, 0x7350, "MSI-7350", ALC889_FIXUP_CD), | ||
5441 | SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3), | 5444 | SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3), |
5442 | SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte EP45-DS3", ALC889_FIXUP_CD), | 5445 | SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte EP45-DS3", ALC889_FIXUP_CD), |
5443 | SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX), | 5446 | SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX), |
@@ -5638,13 +5641,13 @@ static int patch_alc262(struct hda_codec *codec) | |||
5638 | snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_PROC_COEF, tmp | 0x80); | 5641 | snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_PROC_COEF, tmp | 0x80); |
5639 | } | 5642 | } |
5640 | #endif | 5643 | #endif |
5641 | alc_auto_parse_customize_define(codec); | ||
5642 | |||
5643 | alc_fix_pll_init(codec, 0x20, 0x0a, 10); | 5644 | alc_fix_pll_init(codec, 0x20, 0x0a, 10); |
5644 | 5645 | ||
5645 | alc_pick_fixup(codec, NULL, alc262_fixup_tbl, alc262_fixups); | 5646 | alc_pick_fixup(codec, NULL, alc262_fixup_tbl, alc262_fixups); |
5646 | alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); | 5647 | alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); |
5647 | 5648 | ||
5649 | alc_auto_parse_customize_define(codec); | ||
5650 | |||
5648 | /* automatic parse from the BIOS config */ | 5651 | /* automatic parse from the BIOS config */ |
5649 | err = alc262_parse_auto_config(codec); | 5652 | err = alc262_parse_auto_config(codec); |
5650 | if (err < 0) | 5653 | if (err < 0) |
@@ -6249,8 +6252,6 @@ static int patch_alc269(struct hda_codec *codec) | |||
6249 | 6252 | ||
6250 | spec->mixer_nid = 0x0b; | 6253 | spec->mixer_nid = 0x0b; |
6251 | 6254 | ||
6252 | alc_auto_parse_customize_define(codec); | ||
6253 | |||
6254 | err = alc_codec_rename_from_preset(codec); | 6255 | err = alc_codec_rename_from_preset(codec); |
6255 | if (err < 0) | 6256 | if (err < 0) |
6256 | goto error; | 6257 | goto error; |
@@ -6283,6 +6284,8 @@ static int patch_alc269(struct hda_codec *codec) | |||
6283 | alc269_fixup_tbl, alc269_fixups); | 6284 | alc269_fixup_tbl, alc269_fixups); |
6284 | alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); | 6285 | alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); |
6285 | 6286 | ||
6287 | alc_auto_parse_customize_define(codec); | ||
6288 | |||
6286 | /* automatic parse from the BIOS config */ | 6289 | /* automatic parse from the BIOS config */ |
6287 | err = alc269_parse_auto_config(codec); | 6290 | err = alc269_parse_auto_config(codec); |
6288 | if (err < 0) | 6291 | if (err < 0) |
@@ -6859,8 +6862,6 @@ static int patch_alc662(struct hda_codec *codec) | |||
6859 | /* handle multiple HPs as is */ | 6862 | /* handle multiple HPs as is */ |
6860 | spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP; | 6863 | spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP; |
6861 | 6864 | ||
6862 | alc_auto_parse_customize_define(codec); | ||
6863 | |||
6864 | alc_fix_pll_init(codec, 0x20, 0x04, 15); | 6865 | alc_fix_pll_init(codec, 0x20, 0x04, 15); |
6865 | 6866 | ||
6866 | err = alc_codec_rename_from_preset(codec); | 6867 | err = alc_codec_rename_from_preset(codec); |
@@ -6877,6 +6878,9 @@ static int patch_alc662(struct hda_codec *codec) | |||
6877 | alc_pick_fixup(codec, alc662_fixup_models, | 6878 | alc_pick_fixup(codec, alc662_fixup_models, |
6878 | alc662_fixup_tbl, alc662_fixups); | 6879 | alc662_fixup_tbl, alc662_fixups); |
6879 | alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); | 6880 | alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); |
6881 | |||
6882 | alc_auto_parse_customize_define(codec); | ||
6883 | |||
6880 | /* automatic parse from the BIOS config */ | 6884 | /* automatic parse from the BIOS config */ |
6881 | err = alc662_parse_auto_config(codec); | 6885 | err = alc662_parse_auto_config(codec); |
6882 | if (err < 0) | 6886 | if (err < 0) |
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 4742cac26aa9..2cb1e08f962a 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
@@ -4415,9 +4415,9 @@ static int stac92xx_init(struct hda_codec *codec) | |||
4415 | def_conf = get_defcfg_connect(def_conf); | 4415 | def_conf = get_defcfg_connect(def_conf); |
4416 | /* skip any ports that don't have jacks since presence | 4416 | /* skip any ports that don't have jacks since presence |
4417 | * detection is useless */ | 4417 | * detection is useless */ |
4418 | if (def_conf != AC_JACK_PORT_COMPLEX) { | 4418 | if (def_conf != AC_JACK_PORT_NONE && |
4419 | if (def_conf != AC_JACK_PORT_NONE) | 4419 | !is_jack_detectable(codec, nid)) { |
4420 | stac_toggle_power_map(codec, nid, 1); | 4420 | stac_toggle_power_map(codec, nid, 1); |
4421 | continue; | 4421 | continue; |
4422 | } | 4422 | } |
4423 | if (enable_pin_detect(codec, nid, STAC_PWR_EVENT)) { | 4423 | if (enable_pin_detect(codec, nid, STAC_PWR_EVENT)) { |
diff --git a/sound/pci/rme9652/hdsp.c b/sound/pci/rme9652/hdsp.c index b68cdec03b9e..0b2aea2ce172 100644 --- a/sound/pci/rme9652/hdsp.c +++ b/sound/pci/rme9652/hdsp.c | |||
@@ -5170,6 +5170,7 @@ static int snd_hdsp_create_hwdep(struct snd_card *card, struct hdsp *hdsp) | |||
5170 | strcpy(hw->name, "HDSP hwdep interface"); | 5170 | strcpy(hw->name, "HDSP hwdep interface"); |
5171 | 5171 | ||
5172 | hw->ops.ioctl = snd_hdsp_hwdep_ioctl; | 5172 | hw->ops.ioctl = snd_hdsp_hwdep_ioctl; |
5173 | hw->ops.ioctl_compat = snd_hdsp_hwdep_ioctl; | ||
5173 | 5174 | ||
5174 | return 0; | 5175 | return 0; |
5175 | } | 5176 | } |
diff --git a/sound/soc/blackfin/bf5xx-ssm2602.c b/sound/soc/blackfin/bf5xx-ssm2602.c index df3ac73f8778..b39ad356b92b 100644 --- a/sound/soc/blackfin/bf5xx-ssm2602.c +++ b/sound/soc/blackfin/bf5xx-ssm2602.c | |||
@@ -99,6 +99,7 @@ static struct snd_soc_dai_link bf5xx_ssm2602_dai[] = { | |||
99 | .platform_name = "bfin-i2s-pcm-audio", | 99 | .platform_name = "bfin-i2s-pcm-audio", |
100 | .codec_name = "ssm2602.0-001b", | 100 | .codec_name = "ssm2602.0-001b", |
101 | .ops = &bf5xx_ssm2602_ops, | 101 | .ops = &bf5xx_ssm2602_ops, |
102 | .dai_fmt = BF5XX_SSM2602_DAIFMT, | ||
102 | }, | 103 | }, |
103 | { | 104 | { |
104 | .name = "ssm2602", | 105 | .name = "ssm2602", |
@@ -108,6 +109,7 @@ static struct snd_soc_dai_link bf5xx_ssm2602_dai[] = { | |||
108 | .platform_name = "bfin-i2s-pcm-audio", | 109 | .platform_name = "bfin-i2s-pcm-audio", |
109 | .codec_name = "ssm2602.0-001b", | 110 | .codec_name = "ssm2602.0-001b", |
110 | .ops = &bf5xx_ssm2602_ops, | 111 | .ops = &bf5xx_ssm2602_ops, |
112 | .dai_fmt = BF5XX_SSM2602_DAIFMT, | ||
111 | }, | 113 | }, |
112 | }; | 114 | }; |
113 | 115 | ||
diff --git a/sound/soc/codecs/cs42l73.c b/sound/soc/codecs/cs42l73.c index 07c44b71f096..3686417f5ea5 100644 --- a/sound/soc/codecs/cs42l73.c +++ b/sound/soc/codecs/cs42l73.c | |||
@@ -568,22 +568,22 @@ static const struct snd_kcontrol_new cs42l73_snd_controls[] = { | |||
568 | attn_tlv), | 568 | attn_tlv), |
569 | 569 | ||
570 | SOC_SINGLE_TLV("SPK-IP Mono Volume", | 570 | SOC_SINGLE_TLV("SPK-IP Mono Volume", |
571 | CS42L73_SPKMIPMA, 0, 0x3E, 1, attn_tlv), | 571 | CS42L73_SPKMIPMA, 0, 0x3F, 1, attn_tlv), |
572 | SOC_SINGLE_TLV("SPK-XSP Mono Volume", | 572 | SOC_SINGLE_TLV("SPK-XSP Mono Volume", |
573 | CS42L73_SPKMXSPA, 0, 0x3E, 1, attn_tlv), | 573 | CS42L73_SPKMXSPA, 0, 0x3F, 1, attn_tlv), |
574 | SOC_SINGLE_TLV("SPK-ASP Mono Volume", | 574 | SOC_SINGLE_TLV("SPK-ASP Mono Volume", |
575 | CS42L73_SPKMASPA, 0, 0x3E, 1, attn_tlv), | 575 | CS42L73_SPKMASPA, 0, 0x3F, 1, attn_tlv), |
576 | SOC_SINGLE_TLV("SPK-VSP Mono Volume", | 576 | SOC_SINGLE_TLV("SPK-VSP Mono Volume", |
577 | CS42L73_SPKMVSPMA, 0, 0x3E, 1, attn_tlv), | 577 | CS42L73_SPKMVSPMA, 0, 0x3F, 1, attn_tlv), |
578 | 578 | ||
579 | SOC_SINGLE_TLV("ESL-IP Mono Volume", | 579 | SOC_SINGLE_TLV("ESL-IP Mono Volume", |
580 | CS42L73_ESLMIPMA, 0, 0x3E, 1, attn_tlv), | 580 | CS42L73_ESLMIPMA, 0, 0x3F, 1, attn_tlv), |
581 | SOC_SINGLE_TLV("ESL-XSP Mono Volume", | 581 | SOC_SINGLE_TLV("ESL-XSP Mono Volume", |
582 | CS42L73_ESLMXSPA, 0, 0x3E, 1, attn_tlv), | 582 | CS42L73_ESLMXSPA, 0, 0x3F, 1, attn_tlv), |
583 | SOC_SINGLE_TLV("ESL-ASP Mono Volume", | 583 | SOC_SINGLE_TLV("ESL-ASP Mono Volume", |
584 | CS42L73_ESLMASPA, 0, 0x3E, 1, attn_tlv), | 584 | CS42L73_ESLMASPA, 0, 0x3F, 1, attn_tlv), |
585 | SOC_SINGLE_TLV("ESL-VSP Mono Volume", | 585 | SOC_SINGLE_TLV("ESL-VSP Mono Volume", |
586 | CS42L73_ESLMVSPMA, 0, 0x3E, 1, attn_tlv), | 586 | CS42L73_ESLMVSPMA, 0, 0x3F, 1, attn_tlv), |
587 | 587 | ||
588 | SOC_ENUM("IP Digital Swap/Mono Select", ip_swap_enum), | 588 | SOC_ENUM("IP Digital Swap/Mono Select", ip_swap_enum), |
589 | 589 | ||
diff --git a/sound/soc/codecs/tlv320aic23.c b/sound/soc/codecs/tlv320aic23.c index 16d55f91a653..df1e07ffac32 100644 --- a/sound/soc/codecs/tlv320aic23.c +++ b/sound/soc/codecs/tlv320aic23.c | |||
@@ -472,7 +472,7 @@ static int tlv320aic23_set_dai_sysclk(struct snd_soc_dai *codec_dai, | |||
472 | static int tlv320aic23_set_bias_level(struct snd_soc_codec *codec, | 472 | static int tlv320aic23_set_bias_level(struct snd_soc_codec *codec, |
473 | enum snd_soc_bias_level level) | 473 | enum snd_soc_bias_level level) |
474 | { | 474 | { |
475 | u16 reg = snd_soc_read(codec, TLV320AIC23_PWR) & 0xff7f; | 475 | u16 reg = snd_soc_read(codec, TLV320AIC23_PWR) & 0x17f; |
476 | 476 | ||
477 | switch (level) { | 477 | switch (level) { |
478 | case SND_SOC_BIAS_ON: | 478 | case SND_SOC_BIAS_ON: |
@@ -491,7 +491,7 @@ static int tlv320aic23_set_bias_level(struct snd_soc_codec *codec, | |||
491 | case SND_SOC_BIAS_OFF: | 491 | case SND_SOC_BIAS_OFF: |
492 | /* everything off, dac mute, inactive */ | 492 | /* everything off, dac mute, inactive */ |
493 | snd_soc_write(codec, TLV320AIC23_ACTIVE, 0x0); | 493 | snd_soc_write(codec, TLV320AIC23_ACTIVE, 0x0); |
494 | snd_soc_write(codec, TLV320AIC23_PWR, 0xffff); | 494 | snd_soc_write(codec, TLV320AIC23_PWR, 0x1ff); |
495 | break; | 495 | break; |
496 | } | 496 | } |
497 | codec->dapm.bias_level = level; | 497 | codec->dapm.bias_level = level; |
diff --git a/sound/soc/codecs/wm8350.c b/sound/soc/codecs/wm8350.c index 8c4c9591ec05..aa12c6b6beeb 100644 --- a/sound/soc/codecs/wm8350.c +++ b/sound/soc/codecs/wm8350.c | |||
@@ -60,7 +60,7 @@ struct wm8350_jack_data { | |||
60 | }; | 60 | }; |
61 | 61 | ||
62 | struct wm8350_data { | 62 | struct wm8350_data { |
63 | struct snd_soc_codec codec; | 63 | struct wm8350 *wm8350; |
64 | struct wm8350_output out1; | 64 | struct wm8350_output out1; |
65 | struct wm8350_output out2; | 65 | struct wm8350_output out2; |
66 | struct wm8350_jack_data hpl; | 66 | struct wm8350_jack_data hpl; |
@@ -1309,7 +1309,7 @@ static void wm8350_hp_work(struct wm8350_data *priv, | |||
1309 | struct wm8350_jack_data *jack, | 1309 | struct wm8350_jack_data *jack, |
1310 | u16 mask) | 1310 | u16 mask) |
1311 | { | 1311 | { |
1312 | struct wm8350 *wm8350 = priv->codec.control_data; | 1312 | struct wm8350 *wm8350 = priv->wm8350; |
1313 | u16 reg; | 1313 | u16 reg; |
1314 | int report; | 1314 | int report; |
1315 | 1315 | ||
@@ -1342,7 +1342,7 @@ static void wm8350_hpr_work(struct work_struct *work) | |||
1342 | static irqreturn_t wm8350_hp_jack_handler(int irq, void *data) | 1342 | static irqreturn_t wm8350_hp_jack_handler(int irq, void *data) |
1343 | { | 1343 | { |
1344 | struct wm8350_data *priv = data; | 1344 | struct wm8350_data *priv = data; |
1345 | struct wm8350 *wm8350 = priv->codec.control_data; | 1345 | struct wm8350 *wm8350 = priv->wm8350; |
1346 | struct wm8350_jack_data *jack = NULL; | 1346 | struct wm8350_jack_data *jack = NULL; |
1347 | 1347 | ||
1348 | switch (irq - wm8350->irq_base) { | 1348 | switch (irq - wm8350->irq_base) { |
@@ -1427,7 +1427,7 @@ EXPORT_SYMBOL_GPL(wm8350_hp_jack_detect); | |||
1427 | static irqreturn_t wm8350_mic_handler(int irq, void *data) | 1427 | static irqreturn_t wm8350_mic_handler(int irq, void *data) |
1428 | { | 1428 | { |
1429 | struct wm8350_data *priv = data; | 1429 | struct wm8350_data *priv = data; |
1430 | struct wm8350 *wm8350 = priv->codec.control_data; | 1430 | struct wm8350 *wm8350 = priv->wm8350; |
1431 | u16 reg; | 1431 | u16 reg; |
1432 | int report = 0; | 1432 | int report = 0; |
1433 | 1433 | ||
@@ -1536,6 +1536,8 @@ static int wm8350_codec_probe(struct snd_soc_codec *codec) | |||
1536 | return -ENOMEM; | 1536 | return -ENOMEM; |
1537 | snd_soc_codec_set_drvdata(codec, priv); | 1537 | snd_soc_codec_set_drvdata(codec, priv); |
1538 | 1538 | ||
1539 | priv->wm8350 = wm8350; | ||
1540 | |||
1539 | for (i = 0; i < ARRAY_SIZE(supply_names); i++) | 1541 | for (i = 0; i < ARRAY_SIZE(supply_names); i++) |
1540 | priv->supplies[i].supply = supply_names[i]; | 1542 | priv->supplies[i].supply = supply_names[i]; |
1541 | 1543 | ||
@@ -1544,7 +1546,6 @@ static int wm8350_codec_probe(struct snd_soc_codec *codec) | |||
1544 | if (ret != 0) | 1546 | if (ret != 0) |
1545 | return ret; | 1547 | return ret; |
1546 | 1548 | ||
1547 | wm8350->codec.codec = codec; | ||
1548 | codec->control_data = wm8350; | 1549 | codec->control_data = wm8350; |
1549 | 1550 | ||
1550 | /* Put the codec into reset if it wasn't already */ | 1551 | /* Put the codec into reset if it wasn't already */ |
diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c index 6c1fe3afd4b5..2de12ebe43b5 100644 --- a/sound/soc/codecs/wm8994.c +++ b/sound/soc/codecs/wm8994.c | |||
@@ -1144,7 +1144,7 @@ static int aif2clk_ev(struct snd_soc_dapm_widget *w, | |||
1144 | snd_soc_update_bits(codec, WM8994_POWER_MANAGEMENT_5, | 1144 | snd_soc_update_bits(codec, WM8994_POWER_MANAGEMENT_5, |
1145 | WM8994_AIF2DACL_ENA | | 1145 | WM8994_AIF2DACL_ENA | |
1146 | WM8994_AIF2DACR_ENA, 0); | 1146 | WM8994_AIF2DACR_ENA, 0); |
1147 | snd_soc_update_bits(codec, WM8994_POWER_MANAGEMENT_5, | 1147 | snd_soc_update_bits(codec, WM8994_POWER_MANAGEMENT_4, |
1148 | WM8994_AIF2ADCL_ENA | | 1148 | WM8994_AIF2ADCL_ENA | |
1149 | WM8994_AIF2ADCR_ENA, 0); | 1149 | WM8994_AIF2ADCR_ENA, 0); |
1150 | 1150 | ||
diff --git a/sound/soc/codecs/wm_hubs.c b/sound/soc/codecs/wm_hubs.c index f13f2886339c..6c028c470601 100644 --- a/sound/soc/codecs/wm_hubs.c +++ b/sound/soc/codecs/wm_hubs.c | |||
@@ -1035,7 +1035,7 @@ void wm_hubs_set_bias_level(struct snd_soc_codec *codec, | |||
1035 | enum snd_soc_bias_level level) | 1035 | enum snd_soc_bias_level level) |
1036 | { | 1036 | { |
1037 | struct wm_hubs_data *hubs = snd_soc_codec_get_drvdata(codec); | 1037 | struct wm_hubs_data *hubs = snd_soc_codec_get_drvdata(codec); |
1038 | int val; | 1038 | int mask, val; |
1039 | 1039 | ||
1040 | switch (level) { | 1040 | switch (level) { |
1041 | case SND_SOC_BIAS_STANDBY: | 1041 | case SND_SOC_BIAS_STANDBY: |
@@ -1047,6 +1047,13 @@ void wm_hubs_set_bias_level(struct snd_soc_codec *codec, | |||
1047 | case SND_SOC_BIAS_ON: | 1047 | case SND_SOC_BIAS_ON: |
1048 | /* Turn off any unneded single ended outputs */ | 1048 | /* Turn off any unneded single ended outputs */ |
1049 | val = 0; | 1049 | val = 0; |
1050 | mask = 0; | ||
1051 | |||
1052 | if (hubs->lineout1_se) | ||
1053 | mask |= WM8993_LINEOUT1N_ENA | WM8993_LINEOUT1P_ENA; | ||
1054 | |||
1055 | if (hubs->lineout2_se) | ||
1056 | mask |= WM8993_LINEOUT2N_ENA | WM8993_LINEOUT2P_ENA; | ||
1050 | 1057 | ||
1051 | if (hubs->lineout1_se && hubs->lineout1n_ena) | 1058 | if (hubs->lineout1_se && hubs->lineout1n_ena) |
1052 | val |= WM8993_LINEOUT1N_ENA; | 1059 | val |= WM8993_LINEOUT1N_ENA; |
@@ -1061,11 +1068,7 @@ void wm_hubs_set_bias_level(struct snd_soc_codec *codec, | |||
1061 | val |= WM8993_LINEOUT2P_ENA; | 1068 | val |= WM8993_LINEOUT2P_ENA; |
1062 | 1069 | ||
1063 | snd_soc_update_bits(codec, WM8993_POWER_MANAGEMENT_3, | 1070 | snd_soc_update_bits(codec, WM8993_POWER_MANAGEMENT_3, |
1064 | WM8993_LINEOUT1N_ENA | | 1071 | mask, val); |
1065 | WM8993_LINEOUT1P_ENA | | ||
1066 | WM8993_LINEOUT2N_ENA | | ||
1067 | WM8993_LINEOUT2P_ENA, | ||
1068 | val); | ||
1069 | 1072 | ||
1070 | /* Remove the input clamps */ | 1073 | /* Remove the input clamps */ |
1071 | snd_soc_update_bits(codec, WM8993_INPUTS_CLAMP_REG, | 1074 | snd_soc_update_bits(codec, WM8993_INPUTS_CLAMP_REG, |
diff --git a/sound/soc/omap/omap-pcm.c b/sound/soc/omap/omap-pcm.c index a59bd352d342..5a649da9122a 100644 --- a/sound/soc/omap/omap-pcm.c +++ b/sound/soc/omap/omap-pcm.c | |||
@@ -401,6 +401,10 @@ static int omap_pcm_new(struct snd_soc_pcm_runtime *rtd) | |||
401 | } | 401 | } |
402 | 402 | ||
403 | out: | 403 | out: |
404 | /* free preallocated buffers in case of error */ | ||
405 | if (ret) | ||
406 | omap_pcm_free_dma_buffers(pcm); | ||
407 | |||
404 | return ret; | 408 | return ret; |
405 | } | 409 | } |
406 | 410 | ||
diff --git a/sound/soc/samsung/s3c2412-i2s.c b/sound/soc/samsung/s3c2412-i2s.c index 72185078ddf8..79fbeea99d46 100644 --- a/sound/soc/samsung/s3c2412-i2s.c +++ b/sound/soc/samsung/s3c2412-i2s.c | |||
@@ -166,7 +166,7 @@ static struct snd_soc_dai_driver s3c2412_i2s_dai = { | |||
166 | 166 | ||
167 | static __devinit int s3c2412_iis_dev_probe(struct platform_device *pdev) | 167 | static __devinit int s3c2412_iis_dev_probe(struct platform_device *pdev) |
168 | { | 168 | { |
169 | return snd_soc_register_dai(&pdev->dev, &s3c2412_i2s_dai); | 169 | return s3c_i2sv2_register_dai(&pdev->dev, -1, &s3c2412_i2s_dai); |
170 | } | 170 | } |
171 | 171 | ||
172 | static __devexit int s3c2412_iis_dev_remove(struct platform_device *pdev) | 172 | static __devexit int s3c2412_iis_dev_remove(struct platform_device *pdev) |
diff --git a/sound/soc/sh/migor.c b/sound/soc/sh/migor.c index 9d9ad8d61c0a..8526e1edaf45 100644 --- a/sound/soc/sh/migor.c +++ b/sound/soc/sh/migor.c | |||
@@ -35,7 +35,7 @@ static unsigned long siumckb_recalc(struct clk *clk) | |||
35 | return codec_freq; | 35 | return codec_freq; |
36 | } | 36 | } |
37 | 37 | ||
38 | static struct clk_ops siumckb_clk_ops = { | 38 | static struct sh_clk_ops siumckb_clk_ops = { |
39 | .recalc = siumckb_recalc, | 39 | .recalc = siumckb_recalc, |
40 | }; | 40 | }; |
41 | 41 | ||
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 1d6a80c9f4c2..c88d9741b9e7 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c | |||
@@ -3625,10 +3625,10 @@ int snd_soc_of_parse_audio_routing(struct snd_soc_card *card, | |||
3625 | int i, ret; | 3625 | int i, ret; |
3626 | 3626 | ||
3627 | num_routes = of_property_count_strings(np, propname); | 3627 | num_routes = of_property_count_strings(np, propname); |
3628 | if (num_routes & 1) { | 3628 | if (num_routes < 0 || num_routes & 1) { |
3629 | dev_err(card->dev, | 3629 | dev_err(card->dev, |
3630 | "Property '%s's length is not even\n", | 3630 | "Property '%s' does not exist or its length is not even\n", |
3631 | propname); | 3631 | propname); |
3632 | return -EINVAL; | 3632 | return -EINVAL; |
3633 | } | 3633 | } |
3634 | num_routes /= 2; | 3634 | num_routes /= 2; |