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) | |
| download | olio-linux-3.10-028940342a906db8da014a7603a0deddc2c323dd.tar.xz olio-linux-3.10-028940342a906db8da014a7603a0deddc2c323dd.zip  | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
232 files changed, 1485 insertions, 1057 deletions
diff --git a/Documentation/devicetree/bindings/sound/sgtl5000.txt b/Documentation/devicetree/bindings/sound/sgtl5000.txt index 2c3cd413f04..9cc44449508 100644 --- a/Documentation/devicetree/bindings/sound/sgtl5000.txt +++ b/Documentation/devicetree/bindings/sound/sgtl5000.txt @@ -3,6 +3,8 @@  Required properties:  - compatible : "fsl,sgtl5000". +- reg : the I2C address of the device +  Example:  codec: sgtl5000@0a { diff --git a/Documentation/feature-removal-schedule.txt b/Documentation/feature-removal-schedule.txt index 03ca210406e..e4b57756b9f 100644 --- a/Documentation/feature-removal-schedule.txt +++ b/Documentation/feature-removal-schedule.txt @@ -539,3 +539,13 @@ When:	3.6  Why:	setitimer is not returning -EFAULT if user pointer is NULL. This  	violates the spec.  Who:	Sasikantha Babu <sasikanth.v19@gmail.com> + +---------------------------- + +What:	V4L2_CID_HCENTER, V4L2_CID_VCENTER V4L2 controls +When:	3.7 +Why:	The V4L2_CID_VCENTER, V4L2_CID_HCENTER controls have been deprecated +	for about 4 years and they are not used by any mainline driver. +	There are newer controls (V4L2_CID_PAN*, V4L2_CID_TILT*) that provide +	similar	functionality. +Who:	Sylwester Nawrocki <sylvester.nawrocki@gmail.com> diff --git a/MAINTAINERS b/MAINTAINERS index 887c965c271..490dd6e640a 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1969,10 +1969,9 @@ S:	Maintained  F:	drivers/net/ethernet/ti/cpmac.c  CPU FREQUENCY DRIVERS -M:	Dave Jones <davej@redhat.com> +M:	Rafael J. Wysocki <rjw@sisk.pl>  L:	cpufreq@vger.kernel.org -W:	http://www.codemonkey.org.uk/projects/cpufreq/ -T:	git git://git.kernel.org/pub/scm/linux/kernel/git/davej/cpufreq.git +L:	linux-pm@vger.kernel.org  S:	Maintained  F:	drivers/cpufreq/  F:	include/linux/cpufreq.h @@ -4032,6 +4031,7 @@ F:	Documentation/scsi/53c700.txt  F:	drivers/scsi/53c700*  LED SUBSYSTEM +M:	Bryan Wu <bryan.wu@canonical.com>  M:	Richard Purdie <rpurdie@rpsys.net>  S:	Maintained  F:	drivers/leds/ @@ -1,7 +1,7 @@  VERSION = 3  PATCHLEVEL = 4  SUBLEVEL = 0 -EXTRAVERSION = -rc5 +EXTRAVERSION = -rc7  NAME = Saber-toothed Squirrel  # *DOCUMENTATION* diff --git a/arch/alpha/Kconfig b/arch/alpha/Kconfig index 56a4df952fb..22e58a99f38 100644 --- a/arch/alpha/Kconfig +++ b/arch/alpha/Kconfig @@ -477,7 +477,7 @@ config ALPHA_BROKEN_IRQ_MASK  config VGA_HOSE  	bool -	depends on ALPHA_GENERIC || ALPHA_TITAN || ALPHA_MARVEL || ALPHA_TSUNAMI +	depends on VGA_CONSOLE && (ALPHA_GENERIC || ALPHA_TITAN || ALPHA_MARVEL || ALPHA_TSUNAMI)  	default y  	help  	  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 1f7fba671ae..d70408d3667 100644 --- a/arch/alpha/include/asm/rtc.h +++ b/arch/alpha/include/asm/rtc.h @@ -1,14 +1,10 @@  #ifndef _ALPHA_RTC_H  #define _ALPHA_RTC_H -#if defined(CONFIG_ALPHA_GENERIC) +#if defined(CONFIG_ALPHA_MARVEL) && defined(CONFIG_SMP) \ + || defined(CONFIG_ALPHA_GENERIC)  # define get_rtc_time		alpha_mv.rtc_get_time  # define set_rtc_time		alpha_mv.rtc_set_time -#else -# if defined(CONFIG_ALPHA_MARVEL) && defined(CONFIG_SMP) -#  define get_rtc_time		marvel_get_rtc_time -#  define set_rtc_time		marvel_set_rtc_time -# endif  #endif  #include <asm-generic/rtc.h> diff --git a/arch/alpha/kernel/core_tsunami.c b/arch/alpha/kernel/core_tsunami.c index 5e7c28f92f1..61893d7bdda 100644 --- a/arch/alpha/kernel/core_tsunami.c +++ b/arch/alpha/kernel/core_tsunami.c @@ -11,6 +11,7 @@  #include <asm/core_tsunami.h>  #undef __EXTERN_INLINE +#include <linux/module.h>  #include <linux/types.h>  #include <linux/pci.h>  #include <linux/sched.h> diff --git a/arch/alpha/kernel/sys_marvel.c b/arch/alpha/kernel/sys_marvel.c index 14a4b6a7cf5..407accc8087 100644 --- a/arch/alpha/kernel/sys_marvel.c +++ b/arch/alpha/kernel/sys_marvel.c @@ -317,7 +317,7 @@ marvel_init_irq(void)  }  static int  -marvel_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) +marvel_map_irq(struct pci_dev *dev, u8 slot, u8 pin)  {  	struct pci_controller *hose = dev->sysdata;  	struct io7_port *io7_port = hose->sysdata; diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c index 80abafb9bf3..9650c143afc 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,  	return ret;  } -#ifdef __ARMEB__ -#define AUDIT_ARCH_NR AUDIT_ARCH_ARMEB -#else -#define AUDIT_ARCH_NR AUDIT_ARCH_ARM -#endif -  asmlinkage int syscall_trace(int why, struct pt_regs *regs, int scno)  {  	unsigned long ip; -	/* -	 * Save IP.  IP is used to denote syscall entry/exit: -	 *  IP = 0 -> entry, = 1 -> exit -	 */ -	ip = regs->ARM_ip; -	regs->ARM_ip = why; - -	if (!ip) +	if (why)  		audit_syscall_exit(regs);  	else -		audit_syscall_entry(AUDIT_ARCH_NR, scno, regs->ARM_r0, +		audit_syscall_entry(AUDIT_ARCH_ARM, scno, regs->ARM_r0,  				    regs->ARM_r1, regs->ARM_r2, regs->ARM_r3);  	if (!test_thread_flag(TIF_SYSCALL_TRACE)) @@ -936,6 +923,13 @@ asmlinkage int syscall_trace(int why, struct pt_regs *regs, int scno)  	current_thread_info()->syscall = scno; +	/* +	 * IP is used to denote syscall entry/exit: +	 * IP = 0 -> entry, =1 -> exit +	 */ +	ip = regs->ARM_ip; +	regs->ARM_ip = why; +  	/* the 0x80 provides a way for the tracing parent to distinguish  	   between a syscall stop and SIGTRAP delivery */  	ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index f6a4d32b042..8f464465977 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c @@ -251,8 +251,6 @@ asmlinkage void __cpuinit secondary_start_kernel(void)  	struct mm_struct *mm = &init_mm;  	unsigned int cpu = smp_processor_id(); -	printk("CPU%u: Booted secondary processor\n", cpu); -  	/*  	 * All kernel threads share the same mm context; grab a  	 * reference and switch to it. @@ -264,6 +262,8 @@ asmlinkage void __cpuinit secondary_start_kernel(void)  	enter_lazy_tlb(mm, current);  	local_flush_tlb_all(); +	printk("CPU%u: Booted secondary processor\n", cpu); +  	cpu_init();  	preempt_disable();  	trace_hardirqs_off(); diff --git a/arch/arm/kernel/sys_arm.c b/arch/arm/kernel/sys_arm.c index d2b177905cd..76cbb055dd0 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,  		  "Ir" (THREAD_START_SP - sizeof(regs)),  		  "r" (®s),  		  "Ir" (sizeof(regs)) -		: "r0", "r1", "r2", "r3", "ip", "lr", "memory"); +		: "r0", "r1", "r2", "r3", "r8", "r9", "ip", "lr", "memory");   out:  	return ret; diff --git a/arch/arm/mach-exynos/Kconfig b/arch/arm/mach-exynos/Kconfig index e81c35f936b..b8df521fb68 100644 --- a/arch/arm/mach-exynos/Kconfig +++ b/arch/arm/mach-exynos/Kconfig @@ -232,6 +232,9 @@ config MACH_ARMLEX4210  config MACH_UNIVERSAL_C210  	bool "Mobile UNIVERSAL_C210 Board"  	select CPU_EXYNOS4210 +	select S5P_HRT +	select CLKSRC_MMIO +	select HAVE_SCHED_CLOCK  	select S5P_GPIO_INT  	select S5P_DEV_FIMC0  	select S5P_DEV_FIMC1 diff --git a/arch/arm/mach-exynos/clock-exynos5.c b/arch/arm/mach-exynos/clock-exynos5.c index 5cd7a8b8868..7ac6ff4c46b 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 = {  	.name		= "dma",  	.devname	= "dma-pl330.1",  	.enable		= exynos5_clk_ip_fsys_ctrl, -	.ctrlbit	= (1 << 1), +	.ctrlbit	= (1 << 2),  };  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 cb2b027f09a..a34036eb8ba 100644 --- a/arch/arm/mach-exynos/mach-universal_c210.c +++ b/arch/arm/mach-exynos/mach-universal_c210.c @@ -40,6 +40,7 @@  #include <plat/pd.h>  #include <plat/regs-fb-v4.h>  #include <plat/fimc-core.h> +#include <plat/s5p-time.h>  #include <plat/camport.h>  #include <plat/mipi_csis.h> @@ -1063,6 +1064,7 @@ static void __init universal_map_io(void)  	exynos_init_io(NULL, 0);  	s3c24xx_init_clocks(24000000);  	s3c24xx_init_uarts(universal_uartcfgs, ARRAY_SIZE(universal_uartcfgs)); +	s5p_set_timer_source(S5P_PWM2, S5P_PWM4);  }  static void s5p_tv_setup(void) @@ -1113,7 +1115,7 @@ MACHINE_START(UNIVERSAL_C210, "UNIVERSAL_C210")  	.map_io		= universal_map_io,  	.handle_irq	= gic_handle_irq,  	.init_machine	= universal_machine_init, -	.timer		= &exynos4_timer, +	.timer		= &s5p_timer,  	.reserve        = &universal_reserve,  	.restart	= exynos4_restart,  MACHINE_END diff --git a/arch/arm/mach-kirkwood/board-dt.c b/arch/arm/mach-kirkwood/board-dt.c index 1c672d9e665..f7fe1b9f317 100644 --- a/arch/arm/mach-kirkwood/board-dt.c +++ b/arch/arm/mach-kirkwood/board-dt.c @@ -14,6 +14,7 @@  #include <linux/init.h>  #include <linux/of.h>  #include <linux/of_platform.h> +#include <linux/kexec.h>  #include <asm/mach/arch.h>  #include <asm/mach/map.h>  #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 fcce7ff3763..cfd98b186fc 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)  	struct irq_chip *irq_chip = NULL;  	int gpio, irq_num, fiq_count; -	irq_desc = irq_to_desc(IH_GPIO_BASE); +	irq_desc = irq_to_desc(gpio_to_irq(AMS_DELTA_GPIO_PIN_KEYBRD_CLK));  	if (irq_desc)  		irq_chip = irq_desc->irq_data.chip; diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-omap2/board-igep0020.c index 930c0d38043..740cee9369b 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[] = {  static void __init igep_init(void)  { -	regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies)); +	regulator_register_fixed(1, dummy_supplies, ARRAY_SIZE(dummy_supplies));  	omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);  	/* 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 1e2d3322f33..c88420de115 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 @@  #define OMAP4_DSI2_LANEENABLE_MASK				(0x7 << 29)  #define OMAP4_DSI1_LANEENABLE_SHIFT				24  #define OMAP4_DSI1_LANEENABLE_MASK				(0x1f << 24) -#define OMAP4_DSI2_PIPD_SHIFT					19 -#define OMAP4_DSI2_PIPD_MASK					(0x1f << 19) -#define OMAP4_DSI1_PIPD_SHIFT					14 -#define OMAP4_DSI1_PIPD_MASK					(0x1f << 14) +#define OMAP4_DSI1_PIPD_SHIFT					19 +#define OMAP4_DSI1_PIPD_MASK					(0x1f << 19) +#define OMAP4_DSI2_PIPD_SHIFT					14 +#define OMAP4_DSI2_PIPD_MASK					(0x1f << 14)  /* CONTROL_MCBSPLP */  #define OMAP4_ALBCTRLRX_FSX_SHIFT				31 diff --git a/arch/arm/mach-orion5x/mpp.h b/arch/arm/mach-orion5x/mpp.h index eac68978a2c..db70e79a119 100644 --- a/arch/arm/mach-orion5x/mpp.h +++ b/arch/arm/mach-orion5x/mpp.h @@ -65,8 +65,8 @@  #define MPP8_GIGE               MPP(8,  0x1, 0, 0, 1,   1,   1)  #define MPP9_UNUSED		MPP(9,  0x0, 0, 0, 1,   1,   1) -#define MPP9_GPIO		MPP(9,  0x0, 0, 0, 1,   1,   1) -#define MPP9_GIGE               MPP(9,  0x1, 1, 1, 1,   1,   1) +#define MPP9_GPIO		MPP(9,  0x0, 1, 1, 1,   1,   1) +#define MPP9_GIGE               MPP(9,  0x1, 0, 0, 1,   1,   1)  #define MPP10_UNUSED		MPP(10, 0x0, 0, 0, 1,   1,   1)  #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 cb224a344af..0891ec6e27f 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 = {  };  /* SDHI0 */ -static irqreturn_t ag5evm_sdhi0_gpio_cd(int irq, void *arg) -{ -	struct device *dev = arg; -	struct sh_mobile_sdhi_info *info = dev->platform_data; -	struct tmio_mmc_data *pdata = info->pdata; - -	tmio_mmc_cd_wakeup(pdata); - -	return IRQ_HANDLED; -} -  static struct sh_mobile_sdhi_info sdhi0_info = {  	.dma_slave_tx	= SHDMA_SLAVE_SDHI0_TX,  	.dma_slave_rx	= SHDMA_SLAVE_SDHI0_RX, -	.tmio_flags	= TMIO_MMC_HAS_IDLE_WAIT, +	.tmio_flags	= TMIO_MMC_HAS_IDLE_WAIT | TMIO_MMC_USE_GPIO_CD,  	.tmio_caps	= MMC_CAP_SD_HIGHSPEED,  	.tmio_ocr_mask	= MMC_VDD_27_28 | MMC_VDD_28_29, +	.cd_gpio	= GPIO_PORT251,  };  static struct resource sdhi0_resources[] = { @@ -557,7 +547,6 @@ static void __init ag5evm_init(void)  	lcd_backlight_reset();  	/* enable SDHI0 on CN15 [SD I/F] */ -	gpio_request(GPIO_FN_SDHICD0, NULL);  	gpio_request(GPIO_FN_SDHIWP0, NULL);  	gpio_request(GPIO_FN_SDHICMD0, NULL);  	gpio_request(GPIO_FN_SDHICLK0, NULL); @@ -566,13 +555,6 @@ static void __init ag5evm_init(void)  	gpio_request(GPIO_FN_SDHID0_1, NULL);  	gpio_request(GPIO_FN_SDHID0_0, NULL); -	if (!request_irq(intcs_evt2irq(0x3c0), ag5evm_sdhi0_gpio_cd, -			 IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, -			 "sdhi0 cd", &sdhi0_device.dev)) -		sdhi0_info.tmio_flags |= TMIO_MMC_HAS_COLD_CD; -	else -		pr_warn("Unable to setup SDHI0 GPIO IRQ\n"); -  	/* enable SDHI1 on CN4 [WLAN I/F] */  	gpio_request(GPIO_FN_SDHICLK1, NULL);  	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 f49e28abe0a..8c6202bb6ae 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)  }  /* SDHI0 */ -static irqreturn_t mackerel_sdhi0_gpio_cd(int irq, void *arg) -{ -	struct device *dev = arg; -	struct sh_mobile_sdhi_info *info = dev->platform_data; -	struct tmio_mmc_data *pdata = info->pdata; - -	tmio_mmc_cd_wakeup(pdata); - -	return IRQ_HANDLED; -} -  static struct sh_mobile_sdhi_info sdhi0_info = {  	.dma_slave_tx	= SHDMA_SLAVE_SDHI0_TX,  	.dma_slave_rx	= SHDMA_SLAVE_SDHI0_RX, +	.tmio_flags	= TMIO_MMC_USE_GPIO_CD,  	.tmio_caps	= MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ, +	.cd_gpio	= GPIO_PORT172,  };  static struct resource sdhi0_resources[] = { @@ -1384,7 +1375,6 @@ static void __init mackerel_init(void)  {  	u32 srcr4;  	struct clk *clk; -	int ret;  	/* External clock source */  	clk_set_rate(&sh7372_dv_clki_clk, 27000000); @@ -1481,7 +1471,6 @@ static void __init mackerel_init(void)  	irq_set_irq_type(IRQ21, IRQ_TYPE_LEVEL_HIGH);  	/* enable SDHI0 */ -	gpio_request(GPIO_FN_SDHICD0, NULL);  	gpio_request(GPIO_FN_SDHIWP0, NULL);  	gpio_request(GPIO_FN_SDHICMD0, NULL);  	gpio_request(GPIO_FN_SDHICLK0, NULL); @@ -1490,13 +1479,6 @@ static void __init mackerel_init(void)  	gpio_request(GPIO_FN_SDHID0_1, NULL);  	gpio_request(GPIO_FN_SDHID0_0, NULL); -	ret = request_irq(evt2irq(0x3340), mackerel_sdhi0_gpio_cd, -			  IRQF_TRIGGER_FALLING, "sdhi0 cd", &sdhi0_device.dev); -	if (!ret) -		sdhi0_info.tmio_flags |= TMIO_MMC_HAS_COLD_CD; -	else -		pr_err("Cannot get IRQ #%d: %d\n", evt2irq(0x3340), ret); -  #if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE)  	/* enable SDHI1 */  	gpio_request(GPIO_FN_SDHICMD1, NULL); diff --git a/arch/arm/mach-shmobile/headsmp.S b/arch/arm/mach-shmobile/headsmp.S index 6ac015c8920..b202c127252 100644 --- a/arch/arm/mach-shmobile/headsmp.S +++ b/arch/arm/mach-shmobile/headsmp.S @@ -16,6 +16,59 @@  	__CPUINIT +/* Cache invalidation nicked from arch/arm/mach-imx/head-v7.S, thanks! + * + * The secondary kernel init calls v7_flush_dcache_all before it enables + * the L1; however, the L1 comes out of reset in an undefined state, so + * the clean + invalidate performed by v7_flush_dcache_all causes a bunch + * of cache lines with uninitialized data and uninitialized tags to get + * written out to memory, which does really unpleasant things to the main + * processor.  We fix this by performing an invalidate, rather than a + * clean + invalidate, before jumping into the kernel. + * + * This funciton is cloned from arch/arm/mach-tegra/headsmp.S, and needs + * to be called for both secondary cores startup and primary core resume + * procedures.  Ideally, it should be moved into arch/arm/mm/cache-v7.S. + */ +ENTRY(v7_invalidate_l1) +	mov	r0, #0 +	mcr	p15, 0, r0, c7, c5, 0	@ invalidate I cache +	mcr	p15, 2, r0, c0, c0, 0 +	mrc	p15, 1, r0, c0, c0, 0 + +	ldr	r1, =0x7fff +	and	r2, r1, r0, lsr #13 + +	ldr	r1, =0x3ff + +	and	r3, r1, r0, lsr #3	@ NumWays - 1 +	add	r2, r2, #1		@ NumSets + +	and	r0, r0, #0x7 +	add	r0, r0, #4	@ SetShift + +	clz	r1, r3		@ WayShift +	add	r4, r3, #1	@ NumWays +1:	sub	r2, r2, #1	@ NumSets-- +	mov	r3, r4		@ Temp = NumWays +2:	subs	r3, r3, #1	@ Temp-- +	mov	r5, r3, lsl r1 +	mov	r6, r2, lsl r0 +	orr	r5, r5, r6	@ Reg = (Temp<<WayShift)|(NumSets<<SetShift) +	mcr	p15, 0, r5, c7, c6, 2 +	bgt	2b +	cmp	r2, #0 +	bgt	1b +	dsb +	isb +	mov	pc, lr +ENDPROC(v7_invalidate_l1) + +ENTRY(shmobile_invalidate_start) +	bl	v7_invalidate_l1 +	b	secondary_startup +ENDPROC(shmobile_invalidate_start) +  /*   * Reset vector for secondary CPUs.   * This will be mapped at address 0 by SBAR register. @@ -24,4 +77,5 @@  	.align  12  ENTRY(shmobile_secondary_vector)  	ldr     pc, 1f -1:	.long   secondary_startup - PAGE_OFFSET + PLAT_PHYS_OFFSET +1:	.long   shmobile_invalidate_start - PAGE_OFFSET + PLAT_PHYS_OFFSET +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 83ad3fe0a75..c85e6ecda60 100644 --- a/arch/arm/mach-shmobile/include/mach/common.h +++ b/arch/arm/mach-shmobile/include/mach/common.h @@ -4,7 +4,6 @@  extern void shmobile_earlytimer_init(void);  extern struct sys_timer shmobile_timer;  struct twd_local_timer; -void shmobile_twd_init(struct twd_local_timer *twd_local_timer);  extern void shmobile_setup_console(void);  extern void shmobile_secondary_vector(void);  extern int shmobile_platform_cpu_kill(unsigned int cpu); @@ -82,5 +81,6 @@ extern int r8a7779_platform_cpu_kill(unsigned int cpu);  extern void r8a7779_secondary_init(unsigned int cpu);  extern int r8a7779_boot_secondary(unsigned int cpu);  extern void r8a7779_smp_prepare_cpus(void); +extern void r8a7779_register_twd(void);  #endif /* __ARCH_MACH_COMMON_H */ diff --git a/arch/arm/mach-shmobile/setup-r8a7779.c b/arch/arm/mach-shmobile/setup-r8a7779.c index 12c6f529ab8..e98e46f6cf5 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)  			    ARRAY_SIZE(r8a7779_late_devices));  } +/* do nothing for !CONFIG_SMP or !CONFIG_HAVE_TWD */ +void __init __weak r8a7779_register_twd(void) { } +  static void __init r8a7779_earlytimer_init(void)  {  	r8a7779_clock_init();  	shmobile_earlytimer_init(); +	r8a7779_register_twd();  }  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 5bebffc1045..04a0dfe7549 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)  			    ARRAY_SIZE(sh73a0_late_devices));  } +/* do nothing for !CONFIG_SMP or !CONFIG_HAVE_TWD */ +void __init __weak sh73a0_register_twd(void) { } +  static void __init sh73a0_earlytimer_init(void)  {  	sh73a0_clock_init();  	shmobile_earlytimer_init(); +	sh73a0_register_twd();  }  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 b62e19d4c9a..6d1d0238cbf 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)  static DEFINE_SPINLOCK(scu_lock);  static unsigned long tmp; +#ifdef CONFIG_HAVE_ARM_TWD  static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, 0xf0000600, 29); +void __init r8a7779_register_twd(void) +{ +	twd_local_timer_register(&twd_local_timer); +} +#endif +  static void modify_scu_cpu_psr(unsigned long set, unsigned long clr)  {  	void __iomem *scu_base = scu_base_addr(); @@ -84,7 +91,6 @@ unsigned int __init r8a7779_get_core_count(void)  {  	void __iomem *scu_base = scu_base_addr(); -	shmobile_twd_init(&twd_local_timer);  	return scu_get_core_count(scu_base);  } diff --git a/arch/arm/mach-shmobile/smp-sh73a0.c b/arch/arm/mach-shmobile/smp-sh73a0.c index 14ad8b052f1..e36c41c4ab4 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)  static DEFINE_SPINLOCK(scu_lock);  static unsigned long tmp; +#ifdef CONFIG_HAVE_ARM_TWD  static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, 0xf0000600, 29); +void __init sh73a0_register_twd(void) +{ +	twd_local_timer_register(&twd_local_timer); +} +#endif  static void modify_scu_cpu_psr(unsigned long set, unsigned long clr)  { @@ -62,7 +68,6 @@ unsigned int __init sh73a0_get_core_count(void)  {  	void __iomem *scu_base = scu_base_addr(); -	shmobile_twd_init(&twd_local_timer);  	return scu_get_core_count(scu_base);  } diff --git a/arch/arm/mach-shmobile/timer.c b/arch/arm/mach-shmobile/timer.c index 2fba5f3d1c8..8b79e7917a2 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)  {  } -void __init shmobile_twd_init(struct twd_local_timer *twd_local_timer) -{ -#ifdef CONFIG_HAVE_ARM_TWD -	int err = twd_local_timer_register(twd_local_timer); -	if (err) -		pr_err("twd_local_timer_register failed %d\n", err); -#endif -} -  struct sys_timer shmobile_timer = {  	.init		= shmobile_timer_init,  }; diff --git a/arch/ia64/kvm/kvm-ia64.c b/arch/ia64/kvm/kvm-ia64.c index f5104b7c52c..463fb3bbe11 100644 --- a/arch/ia64/kvm/kvm-ia64.c +++ b/arch/ia64/kvm/kvm-ia64.c @@ -1174,7 +1174,7 @@ out:  bool kvm_vcpu_compatible(struct kvm_vcpu *vcpu)  { -	return irqchip_in_kernel(vcpu->kcm) == (vcpu->arch.apic != NULL); +	return irqchip_in_kernel(vcpu->kvm) == (vcpu->arch.apic != NULL);  }  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 235947844f2..09df4b89e8b 100644 --- a/arch/m68k/platform/520x/config.c +++ b/arch/m68k/platform/520x/config.c @@ -22,7 +22,7 @@  /***************************************************************************/ -#ifdef CONFIG_SPI_COLDFIRE_QSPI +#if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)  static void __init m520x_qspi_init(void)  { @@ -35,7 +35,7 @@ static void __init m520x_qspi_init(void)  	writew(par, MCF_GPIO_PAR_UART);  } -#endif /* CONFIG_SPI_COLDFIRE_QSPI */ +#endif /* IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) */  /***************************************************************************/ @@ -79,7 +79,7 @@ void __init config_BSP(char *commandp, int size)  	mach_sched_init = hw_timer_init;  	m520x_uarts_init();  	m520x_fec_init(); -#ifdef CONFIG_SPI_COLDFIRE_QSPI +#if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)  	m520x_qspi_init();  #endif  } diff --git a/arch/m68k/platform/523x/config.c b/arch/m68k/platform/523x/config.c index c8b405d5a96..d47dfd8f50a 100644 --- a/arch/m68k/platform/523x/config.c +++ b/arch/m68k/platform/523x/config.c @@ -22,7 +22,7 @@  /***************************************************************************/ -#ifdef CONFIG_SPI_COLDFIRE_QSPI +#if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)  static void __init m523x_qspi_init(void)  { @@ -36,7 +36,7 @@ static void __init m523x_qspi_init(void)  	writew(par, MCFGPIO_PAR_TIMER);  } -#endif /* CONFIG_SPI_COLDFIRE_QSPI */ +#endif /* IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) */  /***************************************************************************/ @@ -58,7 +58,7 @@ void __init config_BSP(char *commandp, int size)  {  	mach_sched_init = hw_timer_init;  	m523x_fec_init(); -#ifdef CONFIG_SPI_COLDFIRE_QSPI +#if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)  	m523x_qspi_init();  #endif  } diff --git a/arch/m68k/platform/5249/config.c b/arch/m68k/platform/5249/config.c index bbf05135bb9..300e729a58d 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 = {  /***************************************************************************/ -#ifdef CONFIG_SPI_COLDFIRE_QSPI +#if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)  static void __init m5249_qspi_init(void)  { @@ -61,7 +61,7 @@ static void __init m5249_qspi_init(void)  	mcf_mapirq2imr(MCF_IRQ_QSPI, MCFINTC_QSPI);  } -#endif /* CONFIG_SPI_COLDFIRE_QSPI */ +#endif /* IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) */  /***************************************************************************/ @@ -90,7 +90,7 @@ void __init config_BSP(char *commandp, int size)  #ifdef CONFIG_M5249C3  	m5249_smc91x_init();  #endif -#ifdef CONFIG_SPI_COLDFIRE_QSPI +#if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)  	m5249_qspi_init();  #endif  } diff --git a/arch/m68k/platform/527x/config.c b/arch/m68k/platform/527x/config.c index f91a53294c3..b3cb378c5e9 100644 --- a/arch/m68k/platform/527x/config.c +++ b/arch/m68k/platform/527x/config.c @@ -23,7 +23,7 @@  /***************************************************************************/ -#ifdef CONFIG_SPI_COLDFIRE_QSPI +#if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)  static void __init m527x_qspi_init(void)  { @@ -42,7 +42,7 @@ static void __init m527x_qspi_init(void)  #endif  } -#endif /* CONFIG_SPI_COLDFIRE_QSPI */ +#endif /* IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) */  /***************************************************************************/ @@ -90,7 +90,7 @@ void __init config_BSP(char *commandp, int size)  	mach_sched_init = hw_timer_init;  	m527x_uarts_init();  	m527x_fec_init(); -#ifdef CONFIG_SPI_COLDFIRE_QSPI +#if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)  	m527x_qspi_init();  #endif  } diff --git a/arch/m68k/platform/528x/config.c b/arch/m68k/platform/528x/config.c index d4492926614..c5f11ba49be 100644 --- a/arch/m68k/platform/528x/config.c +++ b/arch/m68k/platform/528x/config.c @@ -24,7 +24,7 @@  /***************************************************************************/ -#ifdef CONFIG_SPI_COLDFIRE_QSPI +#if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)  static void __init m528x_qspi_init(void)  { @@ -32,7 +32,7 @@ static void __init m528x_qspi_init(void)  	__raw_writeb(0x07, MCFGPIO_PQSPAR);  } -#endif /* CONFIG_SPI_COLDFIRE_QSPI */ +#endif /* IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) */  /***************************************************************************/ @@ -98,7 +98,7 @@ void __init config_BSP(char *commandp, int size)  	mach_sched_init = hw_timer_init;  	m528x_uarts_init();  	m528x_fec_init(); -#ifdef CONFIG_SPI_COLDFIRE_QSPI +#if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)  	m528x_qspi_init();  #endif  } diff --git a/arch/m68k/platform/532x/config.c b/arch/m68k/platform/532x/config.c index 2bec3477b73..37082d02f2b 100644 --- a/arch/m68k/platform/532x/config.c +++ b/arch/m68k/platform/532x/config.c @@ -30,7 +30,7 @@  /***************************************************************************/ -#ifdef CONFIG_SPI_COLDFIRE_QSPI +#if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)  static void __init m532x_qspi_init(void)  { @@ -38,7 +38,7 @@ static void __init m532x_qspi_init(void)  	writew(0x01f0, MCF_GPIO_PAR_QSPI);  } -#endif /* CONFIG_SPI_COLDFIRE_QSPI */ +#endif /* IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) */  /***************************************************************************/ @@ -77,7 +77,7 @@ void __init config_BSP(char *commandp, int size)  	mach_sched_init = hw_timer_init;  	m532x_uarts_init();  	m532x_fec_init(); -#ifdef CONFIG_SPI_COLDFIRE_QSPI +#if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)  	m532x_qspi_init();  #endif diff --git a/arch/m68k/platform/coldfire/device.c b/arch/m68k/platform/coldfire/device.c index 7af97362b95..3aa77ddea89 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 = {  #endif /* MCFFEC_BASE1 */  #endif /* CONFIG_FEC */ -#ifdef CONFIG_SPI_COLDFIRE_QSPI +#if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)  /*   *	The ColdFire QSPI module is an SPI protocol hardware block used   *	on a number of different ColdFire CPUs. @@ -274,7 +274,7 @@ static struct platform_device mcf_qspi = {  	.resource		= mcf_qspi_resources,  	.dev.platform_data	= &mcf_qspi_data,  }; -#endif /* CONFIG_SPI_COLDFIRE_QSPI */ +#endif /* IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) */  static struct platform_device *mcf_devices[] __initdata = {  	&mcf_uart, @@ -284,7 +284,7 @@ static struct platform_device *mcf_devices[] __initdata = {  	&mcf_fec1,  #endif  #endif -#ifdef CONFIG_SPI_COLDFIRE_QSPI +#if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)  	&mcf_qspi,  #endif  }; diff --git a/arch/mn10300/kernel/smp.c b/arch/mn10300/kernel/smp.c index 910dddf65e4..9cd69ad6aa0 100644 --- a/arch/mn10300/kernel/smp.c +++ b/arch/mn10300/kernel/smp.c @@ -24,6 +24,7 @@  #include <linux/sched.h>  #include <linux/profile.h>  #include <linux/smp.h> +#include <linux/cpu.h>  #include <asm/tlbflush.h>  #include <asm/bitops.h>  #include <asm/processor.h> @@ -38,7 +39,6 @@  #include "internal.h"  #ifdef CONFIG_HOTPLUG_CPU -#include <linux/cpu.h>  #include <asm/cacheflush.h>  static unsigned long sleep_mode[NR_CPUS]; @@ -874,10 +874,13 @@ static void __init smp_online(void)  	cpu = smp_processor_id(); -	local_irq_enable(); +	notify_cpu_starting(cpu); +	ipi_call_lock();  	set_cpu_online(cpu, true); -	smp_wmb(); +	ipi_call_unlock(); + +	local_irq_enable();  }  /** diff --git a/arch/parisc/include/asm/hardware.h b/arch/parisc/include/asm/hardware.h index 4e9626836ba..d1d864b81ba 100644 --- a/arch/parisc/include/asm/hardware.h +++ b/arch/parisc/include/asm/hardware.h @@ -2,7 +2,6 @@  #define _PARISC_HARDWARE_H  #include <linux/mod_devicetable.h> -#include <asm/pdc.h>  #define HWTYPE_ANY_ID		PA_HWTYPE_ANY_ID  #define HVERSION_ANY_ID		PA_HVERSION_ANY_ID @@ -95,12 +94,14 @@ struct bc_module {  #define HPHW_MC	       15  #define HPHW_FAULTY    31 +struct parisc_device_id;  /* hardware.c: */  extern const char *parisc_hardware_description(struct parisc_device_id *id);  extern enum cpu_type parisc_get_cpu_type(unsigned long hversion);  struct pci_dev; +struct hardware_path;  /* drivers.c: */  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 a84cc1f925f..4e0e7dbf0f3 100644 --- a/arch/parisc/include/asm/page.h +++ b/arch/parisc/include/asm/page.h @@ -160,5 +160,11 @@ extern int npmem_ranges;  #include <asm-generic/memory_model.h>  #include <asm-generic/getorder.h> +#include <asm/pdc.h> + +#define PAGE0   ((struct zeropage *)__PAGE_OFFSET) + +/* DEFINITION OF THE ZERO-PAGE (PAG0) */ +/* based on work by Jason Eckhardt (jason@equator.com) */  #endif /* _PARISC_PAGE_H */ diff --git a/arch/parisc/include/asm/pdc.h b/arch/parisc/include/asm/pdc.h index 4ca510b3c6f..7f0f2d23059 100644 --- a/arch/parisc/include/asm/pdc.h +++ b/arch/parisc/include/asm/pdc.h @@ -343,8 +343,6 @@  #ifdef __KERNEL__ -#include <asm/page.h> /* for __PAGE_OFFSET */ -  extern int pdc_type;  /* Values for pdc_type */ @@ -677,11 +675,6 @@ static inline char * os_id_to_string(u16 os_id) {  #endif /* __KERNEL__ */ -#define PAGE0   ((struct zeropage *)__PAGE_OFFSET) - -/* DEFINITION OF THE ZERO-PAGE (PAG0) */ -/* based on work by Jason Eckhardt (jason@equator.com) */ -  /* flags of the device_path */  #define	PF_AUTOBOOT	0x80  #define	PF_AUTOSEARCH	0x40 diff --git a/arch/parisc/include/asm/pgtable.h b/arch/parisc/include/asm/pgtable.h index 22dadeb5869..ee99f233935 100644 --- a/arch/parisc/include/asm/pgtable.h +++ b/arch/parisc/include/asm/pgtable.h @@ -44,6 +44,8 @@ struct vm_area_struct;  #endif /* !__ASSEMBLY__ */ +#include <asm/page.h> +  #define pte_ERROR(e) \  	printk("%s:%d: bad pte %08lx.\n", __FILE__, __LINE__, pte_val(e))  #define pmd_ERROR(e) \ diff --git a/arch/parisc/include/asm/spinlock.h b/arch/parisc/include/asm/spinlock.h index 804aa28ab1d..3516e0b2704 100644 --- a/arch/parisc/include/asm/spinlock.h +++ b/arch/parisc/include/asm/spinlock.h @@ -1,6 +1,8 @@  #ifndef __ASM_SPINLOCK_H  #define __ASM_SPINLOCK_H +#include <asm/barrier.h> +#include <asm/ldcw.h>  #include <asm/processor.h>  #include <asm/spinlock_types.h> diff --git a/arch/parisc/kernel/pdc_cons.c b/arch/parisc/kernel/pdc_cons.c index 4f004596a6e..47341aa208f 100644 --- a/arch/parisc/kernel/pdc_cons.c +++ b/arch/parisc/kernel/pdc_cons.c @@ -50,6 +50,7 @@  #include <linux/init.h>  #include <linux/major.h>  #include <linux/tty.h> +#include <asm/page.h>		/* for PAGE0 */  #include <asm/pdc.h>		/* for iodc_call() proto and friends */  static DEFINE_SPINLOCK(pdc_console_lock); @@ -104,7 +105,7 @@ static int pdc_console_tty_open(struct tty_struct *tty, struct file *filp)  static void pdc_console_tty_close(struct tty_struct *tty, struct file *filp)  { -	if (!tty->count) { +	if (tty->count == 1) {  		del_timer_sync(&pdc_console_timer);  		tty_port_tty_set(&tty_port, NULL);  	} diff --git a/arch/parisc/kernel/smp.c b/arch/parisc/kernel/smp.c index 0bb1d63907f..4dc7b7942b4 100644 --- a/arch/parisc/kernel/smp.c +++ b/arch/parisc/kernel/smp.c @@ -31,6 +31,7 @@  #include <linux/delay.h>  #include <linux/bitops.h>  #include <linux/ftrace.h> +#include <linux/cpu.h>  #include <linux/atomic.h>  #include <asm/current.h> @@ -295,8 +296,13 @@ smp_cpu_init(int cpunum)  		printk(KERN_CRIT "CPU#%d already initialized!\n", cpunum);  		machine_halt(); -	}   +	} + +	notify_cpu_starting(cpunum); + +	ipi_call_lock();  	set_cpu_online(cpunum, true); +	ipi_call_unlock();  	/* Initialise the idle task for this CPU */  	atomic_inc(&init_mm.mm_count); diff --git a/arch/parisc/kernel/time.c b/arch/parisc/kernel/time.c index 7c0774397b8..70e105d6242 100644 --- a/arch/parisc/kernel/time.c +++ b/arch/parisc/kernel/time.c @@ -29,6 +29,7 @@  #include <asm/uaccess.h>  #include <asm/io.h>  #include <asm/irq.h> +#include <asm/page.h>  #include <asm/param.h>  #include <asm/pdc.h>  #include <asm/led.h> diff --git a/arch/powerpc/include/asm/exception-64s.h b/arch/powerpc/include/asm/exception-64s.h index 548da3aa0a3..d58fc4e4149 100644 --- a/arch/powerpc/include/asm/exception-64s.h +++ b/arch/powerpc/include/asm/exception-64s.h @@ -288,13 +288,6 @@ label##_hv:								\  /* Exception addition: Hard disable interrupts */  #define DISABLE_INTS	SOFT_DISABLE_INTS(r10,r11) -/* Exception addition: Keep interrupt state */ -#define ENABLE_INTS				\ -	ld	r11,PACAKMSR(r13);		\ -	ld	r12,_MSR(r1);			\ -	rlwimi	r11,r12,0,MSR_EE;		\ -	mtmsrd	r11,1 -  #define ADD_NVGPRS				\  	bl	.save_nvgprs diff --git a/arch/powerpc/include/asm/kvm_book3s.h b/arch/powerpc/include/asm/kvm_book3s.h index aa795ccef29..fd07f43d662 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 {  	u64 sdr1;  	u64 hior;  	u64 msr_mask; -	u64 vsid_next;  #ifdef CONFIG_PPC_BOOK3S_32  	u32 vsid_pool[VSID_POOL_SIZE]; +	u32 vsid_next;  #else -	u64 vsid_first; -	u64 vsid_max; +	u64 proto_vsid_first; +	u64 proto_vsid_max; +	u64 proto_vsid_next;  #endif  	int context_id[SID_CONTEXTS]; diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S index f8a7a1a1a9f..ef2074c3e90 100644 --- a/arch/powerpc/kernel/entry_64.S +++ b/arch/powerpc/kernel/entry_64.S @@ -588,23 +588,19 @@ _GLOBAL(ret_from_except_lite)  fast_exc_return_irq:  restore:  	/* -	 * This is the main kernel exit path, we first check if we -	 * have to change our interrupt state. +	 * This is the main kernel exit path. First we check if we +	 * are about to re-enable interrupts  	 */  	ld	r5,SOFTE(r1)  	lbz	r6,PACASOFTIRQEN(r13) -	cmpwi	cr1,r5,0 -	cmpw	cr0,r5,r6 -	beq	cr0,4f +	cmpwi	cr0,r5,0 +	beq	restore_irq_off -	/* We do, handle disable first, which is easy */ -	bne	cr1,3f; - 	li	r0,0 -	stb	r0,PACASOFTIRQEN(r13); -	TRACE_DISABLE_INTS -	b	4f +	/* We are enabling, were we already enabled ? Yes, just return */ +	cmpwi	cr0,r6,1 +	beq	cr0,do_restore -3:	/* +	/*  	 * We are about to soft-enable interrupts (we are hard disabled  	 * at this point). We check if there's anything that needs to  	 * be replayed first. @@ -626,7 +622,7 @@ restore_no_replay:  	/*  	 * Final return path. BookE is handled in a different file  	 */ -4: +do_restore:  #ifdef CONFIG_PPC_BOOK3E  	b	.exception_return_book3e  #else @@ -700,6 +696,25 @@ fast_exception_return:  #endif /* CONFIG_PPC_BOOK3E */  	/* +	 * We are returning to a context with interrupts soft disabled. +	 * +	 * However, we may also about to hard enable, so we need to +	 * make sure that in this case, we also clear PACA_IRQ_HARD_DIS +	 * or that bit can get out of sync and bad things will happen +	 */ +restore_irq_off: +	ld	r3,_MSR(r1) +	lbz	r7,PACAIRQHAPPENED(r13) +	andi.	r0,r3,MSR_EE +	beq	1f +	rlwinm	r7,r7,0,~PACA_IRQ_HARD_DIS +	stb	r7,PACAIRQHAPPENED(r13) +1:	li	r0,0 +	stb	r0,PACASOFTIRQEN(r13); +	TRACE_DISABLE_INTS +	b	do_restore + +	/*  	 * Something did happen, check if a re-emit is needed  	 * (this also clears paca->irq_happened)  	 */ @@ -748,6 +763,9 @@ restore_check_irq_replay:  #endif /* CONFIG_PPC_BOOK3E */  1:	b	.ret_from_except /* What else to do here ? */ + + +3:  do_work:  #ifdef CONFIG_PREEMPT  	andi.	r0,r3,MSR_PR	/* Returning to user mode? */ @@ -767,16 +785,6 @@ do_work:  	SOFT_DISABLE_INTS(r3,r4)  1:	bl	.preempt_schedule_irq -	/* Hard-disable interrupts again (and update PACA) */ -#ifdef CONFIG_PPC_BOOK3E -	wrteei	0 -#else -	ld	r10,PACAKMSR(r13) /* Get kernel MSR without EE */ -	mtmsrd	r10,1 -#endif /* CONFIG_PPC_BOOK3E */ -	li	r0,PACA_IRQ_HARD_DIS -	stb	r0,PACAIRQHAPPENED(r13) -  	/* Re-test flags and eventually loop */  	clrrdi	r9,r1,THREAD_SHIFT  	ld	r4,TI_FLAGS(r9) @@ -787,14 +795,6 @@ do_work:  user_work:  #endif /* CONFIG_PREEMPT */ -	/* Enable interrupts */ -#ifdef CONFIG_PPC_BOOK3E -	wrteei	1 -#else -	ori	r10,r10,MSR_EE -	mtmsrd	r10,1 -#endif /* CONFIG_PPC_BOOK3E */ -  	andi.	r0,r4,_TIF_NEED_RESCHED  	beq	1f  	bl	.restore_interrupts diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S index cb705fdbb45..8f880bc77c5 100644 --- a/arch/powerpc/kernel/exceptions-64s.S +++ b/arch/powerpc/kernel/exceptions-64s.S @@ -768,8 +768,8 @@ alignment_common:  	std	r3,_DAR(r1)  	std	r4,_DSISR(r1)  	bl	.save_nvgprs +	DISABLE_INTS  	addi	r3,r1,STACK_FRAME_OVERHEAD -	ENABLE_INTS  	bl	.alignment_exception  	b	.ret_from_except diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index 43eb74fcedd..641da9e868c 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)  	 */  	if (unlikely(irq_happened != PACA_IRQ_HARD_DIS))  		__hard_irq_disable(); +#ifdef CONFIG_TRACE_IRQFLAG +	else { +		/* +		 * We should already be hard disabled here. We had bugs +		 * where that wasn't the case so let's dbl check it and +		 * warn if we are wrong. Only do that when IRQ tracing +		 * is enabled as mfmsr() can be costly. +		 */ +		if (WARN_ON(mfmsr() & MSR_EE)) +			__hard_irq_disable(); +	} +#endif /* CONFIG_TRACE_IRQFLAG */ +  	set_soft_enabled(0);  	/* @@ -260,11 +273,17 @@ EXPORT_SYMBOL(arch_local_irq_restore);   * if they are currently disabled. This is typically called before   * schedule() or do_signal() when returning to userspace. We do it   * in C to avoid the burden of dealing with lockdep etc... + * + * NOTE: This is called with interrupts hard disabled but not marked + * as such in paca->irq_happened, so we need to resync this.   */  void restore_interrupts(void)  { -	if (irqs_disabled()) +	if (irqs_disabled()) { +		local_paca->irq_happened |= PACA_IRQ_HARD_DIS;  		local_irq_enable(); +	} else +		__hard_irq_enable();  }  #endif /* CONFIG_PPC64 */ diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c index 6aa0c663e24..158972341a2 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)  				   addr, regs->nip, regs->link, code);  	} -	if (!arch_irq_disabled_regs(regs)) +	if (arch_irqs_disabled() && !arch_irq_disabled_regs(regs))  		local_irq_enable();  	memset(&info, 0, sizeof(info)); @@ -1019,7 +1019,9 @@ void __kprobes program_check_exception(struct pt_regs *regs)  		return;  	} -	local_irq_enable(); +	/* We restore the interrupt state now */ +	if (!arch_irq_disabled_regs(regs)) +		local_irq_enable();  #ifdef CONFIG_MATH_EMULATION  	/* (reason & REASON_ILLEGAL) would be the obvious thing here, @@ -1069,6 +1071,10 @@ void alignment_exception(struct pt_regs *regs)  {  	int sig, code, fixed = 0; +	/* We restore the interrupt state now */ +	if (!arch_irq_disabled_regs(regs)) +		local_irq_enable(); +  	/* we don't implement logging of alignment exceptions */  	if (!(current->thread.align_ctl & PR_UNALIGN_SIGBUS))  		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 6f87f39a1ac..10fc8ec9d2a 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)  	backwards_map = !backwards_map;  	/* Uh-oh ... out of mappings. Let's flush! */ -	if (vcpu_book3s->vsid_next == vcpu_book3s->vsid_max) { -		vcpu_book3s->vsid_next = vcpu_book3s->vsid_first; +	if (vcpu_book3s->proto_vsid_next == vcpu_book3s->proto_vsid_max) { +		vcpu_book3s->proto_vsid_next = vcpu_book3s->proto_vsid_first;  		memset(vcpu_book3s->sid_map, 0,  		       sizeof(struct kvmppc_sid_map) * SID_MAP_NUM);  		kvmppc_mmu_pte_flush(vcpu, 0, 0);  		kvmppc_mmu_flush_segments(vcpu);  	} -	map->host_vsid = vcpu_book3s->vsid_next++; +	map->host_vsid = vsid_scramble(vcpu_book3s->proto_vsid_next++, 256M);  	map->guest_vsid = gvsid;  	map->valid = true; @@ -319,9 +319,10 @@ int kvmppc_mmu_init(struct kvm_vcpu *vcpu)  		return -1;  	vcpu3s->context_id[0] = err; -	vcpu3s->vsid_max = ((vcpu3s->context_id[0] + 1) << USER_ESID_BITS) - 1; -	vcpu3s->vsid_first = vcpu3s->context_id[0] << USER_ESID_BITS; -	vcpu3s->vsid_next = vcpu3s->vsid_first; +	vcpu3s->proto_vsid_max = ((vcpu3s->context_id[0] + 1) +				  << USER_ESID_BITS) - 1; +	vcpu3s->proto_vsid_first = vcpu3s->context_id[0] << USER_ESID_BITS; +	vcpu3s->proto_vsid_next = vcpu3s->proto_vsid_first;  	kvmppc_mmu_hpte_init(vcpu); diff --git a/arch/powerpc/kvm/book3s_64_mmu_hv.c b/arch/powerpc/kvm/book3s_64_mmu_hv.c index ddc485a529f..c3beaeef3f6 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,  			    !(memslot->userspace_addr & (s - 1))) {  				start &= ~(s - 1);  				pgsize = s; +				get_page(hpage); +				put_page(page);  				page = hpage;  			}  		} @@ -281,11 +283,8 @@ static long kvmppc_get_guest_page(struct kvm *kvm, unsigned long gfn,  	err = 0;   out: -	if (got) { -		if (PageHuge(page)) -			page = compound_head(page); +	if (got)  		put_page(page); -	}  	return err;   up_err: @@ -678,8 +677,15 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu,  		SetPageDirty(page);   out_put: -	if (page) -		put_page(page); +	if (page) { +		/* +		 * We drop pages[0] here, not page because page might +		 * have been set to the head page of a compound, but +		 * we have to drop the reference on the correct tail +		 * page to match the get inside gup() +		 */ +		put_page(pages[0]); +	}  	return ret;   out_unlock: @@ -979,6 +985,7 @@ void *kvmppc_pin_guest_page(struct kvm *kvm, unsigned long gpa,  			pa = *physp;  		}  		page = pfn_to_page(pa >> PAGE_SHIFT); +		get_page(page);  	} else {  		hva = gfn_to_hva_memslot(memslot, gfn);  		npages = get_user_pages_fast(hva, 1, 1, pages); @@ -991,8 +998,6 @@ void *kvmppc_pin_guest_page(struct kvm *kvm, unsigned long gpa,  		page = compound_head(page);  		psize <<= compound_order(page);  	} -	if (!kvm->arch.using_mmu_notifiers) -		get_page(page);  	offset = gpa & (psize - 1);  	if (nb_ret)  		*nb_ret = psize - offset; @@ -1003,7 +1008,6 @@ void kvmppc_unpin_guest_page(struct kvm *kvm, void *va)  {  	struct page *page = virt_to_page(va); -	page = compound_head(page);  	put_page(page);  } diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c index 01294a5099d..108d1f58017 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)  				continue;  			pfn = physp[j] >> PAGE_SHIFT;  			page = pfn_to_page(pfn); -			if (PageHuge(page)) -				page = compound_head(page);  			SetPageDirty(page);  			put_page(page);  		} diff --git a/arch/powerpc/kvm/book3s_hv_rm_mmu.c b/arch/powerpc/kvm/book3s_hv_rm_mmu.c index def880aea63..cec4daddbf3 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)  				/* insert R and C bits from PTE */  				rcbits = rev->guest_rpte & (HPTE_R_R|HPTE_R_C);  				args[j] |= rcbits << (56 - 5); +				hp[0] = 0;  				continue;  			} diff --git a/arch/powerpc/kvm/book3s_segment.S b/arch/powerpc/kvm/book3s_segment.S index 0676ae249b9..6e6e9cef34a 100644 --- a/arch/powerpc/kvm/book3s_segment.S +++ b/arch/powerpc/kvm/book3s_segment.S @@ -197,7 +197,8 @@ kvmppc_interrupt:  	/* Save guest PC and MSR */  #ifdef CONFIG_PPC64  BEGIN_FTR_SECTION -	andi.	r0,r12,0x2 +	andi.	r0, r12, 0x2 +	cmpwi	cr1, r0, 0  	beq	1f  	mfspr	r3,SPRN_HSRR0  	mfspr	r4,SPRN_HSRR1 @@ -250,6 +251,12 @@ END_FTR_SECTION_IFSET(CPU_FTR_HVMODE)  	beq	ld_last_prev_inst  	cmpwi	r12, BOOK3S_INTERRUPT_ALIGNMENT  	beq-	ld_last_inst +#ifdef CONFIG_PPC64 +BEGIN_FTR_SECTION +	cmpwi	r12, BOOK3S_INTERRUPT_H_EMUL_ASSIST +	beq-	ld_last_inst +END_FTR_SECTION_IFSET(CPU_FTR_HVMODE) +#endif  	b	no_ld_last_inst @@ -316,23 +323,17 @@ no_dcbz32_off:  	 * Having set up SRR0/1 with the address where we want  	 * to continue with relocation on (potentially in module  	 * space), we either just go straight there with rfi[d], -	 * or we jump to an interrupt handler with bctr if there -	 * is an interrupt to be handled first.  In the latter -	 * case, the rfi[d] at the end of the interrupt handler -	 * will get us back to where we want to continue. +	 * or we jump to an interrupt handler if there is an +	 * interrupt to be handled first.  In the latter case, +	 * the rfi[d] at the end of the interrupt handler will +	 * get us back to where we want to continue.  	 */ -	cmpwi	r12, BOOK3S_INTERRUPT_EXTERNAL -	beq	1f -	cmpwi	r12, BOOK3S_INTERRUPT_DECREMENTER -	beq	1f -	cmpwi	r12, BOOK3S_INTERRUPT_PERFMON -1:	mtctr	r12 -  	/* Register usage at this point:  	 *  	 * R1       = host R1  	 * R2       = host R2 +	 * R10      = raw exit handler id  	 * R12      = exit handler id  	 * R13      = shadow vcpu (32-bit) or PACA (64-bit)  	 * SVCPU.*  = guest * @@ -342,12 +343,25 @@ no_dcbz32_off:  	PPC_LL	r6, HSTATE_HOST_MSR(r13)  	PPC_LL	r8, HSTATE_VMHANDLER(r13) -	/* Restore host msr -> SRR1 */ +#ifdef CONFIG_PPC64 +BEGIN_FTR_SECTION +	beq	cr1, 1f +	mtspr	SPRN_HSRR1, r6 +	mtspr	SPRN_HSRR0, r8 +END_FTR_SECTION_IFSET(CPU_FTR_HVMODE) +#endif +1:	/* Restore host msr -> SRR1 */  	mtsrr1	r6  	/* Load highmem handler address */  	mtsrr0	r8  	/* RFI into the highmem handler, or jump to interrupt handler */ -	beqctr +	cmpwi	r12, BOOK3S_INTERRUPT_EXTERNAL +	beqa	BOOK3S_INTERRUPT_EXTERNAL +	cmpwi	r12, BOOK3S_INTERRUPT_DECREMENTER +	beqa	BOOK3S_INTERRUPT_DECREMENTER +	cmpwi	r12, BOOK3S_INTERRUPT_PERFMON +	beqa	BOOK3S_INTERRUPT_PERFMON +  	RFI  kvmppc_handler_trampoline_exit_end: diff --git a/arch/sparc/kernel/central.c b/arch/sparc/kernel/central.c index 38d48a59879..9708851a8b9 100644 --- a/arch/sparc/kernel/central.c +++ b/arch/sparc/kernel/central.c @@ -269,4 +269,4 @@ static int __init sunfire_init(void)  	return 0;  } -subsys_initcall(sunfire_init); +fs_initcall(sunfire_init); diff --git a/arch/sparc/mm/ultra.S b/arch/sparc/mm/ultra.S index b57a5942ba6..874162a11ce 100644 --- a/arch/sparc/mm/ultra.S +++ b/arch/sparc/mm/ultra.S @@ -495,11 +495,11 @@ xcall_fetch_glob_regs:  	stx		%o7, [%g1 + GR_SNAP_O7]  	stx		%i7, [%g1 + GR_SNAP_I7]  	/* Don't try this at home kids... */ -	rdpr		%cwp, %g2 -	sub		%g2, 1, %g7 +	rdpr		%cwp, %g3 +	sub		%g3, 1, %g7  	wrpr		%g7, %cwp  	mov		%i7, %g7 -	wrpr		%g2, %cwp +	wrpr		%g3, %cwp  	stx		%g7, [%g1 + GR_SNAP_RPC]  	sethi		%hi(trap_block), %g7  	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 bc4f562bd45..7594764d8a6 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,  #else /* __ASSEMBLY__ */ -/* how to get the thread information struct from ASM */ +/* + * How to get the thread information struct from assembly. + * Note that we use different macros since different architectures + * have different semantics in their "mm" instruction and we would + * like to guarantee that the macro expands to exactly one instruction. + */  #ifdef __tilegx__ -#define GET_THREAD_INFO(reg) move reg, sp; mm reg, zero, LOG2_THREAD_SIZE, 63 +#define EXTRACT_THREAD_INFO(reg) mm reg, zero, LOG2_THREAD_SIZE, 63  #else  #define GET_THREAD_INFO(reg) mm reg, sp, zero, LOG2_THREAD_SIZE, 31  #endif diff --git a/arch/tile/kernel/compat_signal.c b/arch/tile/kernel/compat_signal.c index 77763ccd5a7..cdef6e5ec02 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,  	 * Set up registers for signal handler.  	 * Registers that we don't modify keep the value they had from  	 * user-space at the time we took the signal. +	 * We always pass siginfo and mcontext, regardless of SA_SIGINFO, +	 * since some things rely on this (e.g. glibc's debug/segfault.c).  	 */  	regs->pc = ptr_to_compat_reg(ka->sa.sa_handler);  	regs->ex1 = PL_ICS_EX1(USER_PL, 1); /* set crit sec in handler */  	regs->sp = ptr_to_compat_reg(frame);  	regs->lr = restorer;  	regs->regs[0] = (unsigned long) usig; - -	if (ka->sa.sa_flags & SA_SIGINFO) { -		/* Need extra arguments, so mark to restore caller-saves. */ -		regs->regs[1] = ptr_to_compat_reg(&frame->info); -		regs->regs[2] = ptr_to_compat_reg(&frame->uc); -		regs->flags |= PT_FLAGS_CALLER_SAVES; -	} +	regs->regs[1] = ptr_to_compat_reg(&frame->info); +	regs->regs[2] = ptr_to_compat_reg(&frame->uc); +	regs->flags |= PT_FLAGS_CALLER_SAVES;  	/*  	 * 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 5d56a1ef5ba..6943515100f 100644 --- a/arch/tile/kernel/intvec_32.S +++ b/arch/tile/kernel/intvec_32.S @@ -839,6 +839,18 @@ STD_ENTRY(interrupt_return)  	FEEDBACK_REENTER(interrupt_return)  	/* +	 * Use r33 to hold whether we have already loaded the callee-saves +	 * into ptregs.  We don't want to do it twice in this loop, since +	 * then we'd clobber whatever changes are made by ptrace, etc. +	 * Get base of stack in r32. +	 */ +	{ +	 GET_THREAD_INFO(r32) +	 movei  r33, 0 +	} + +.Lretry_work_pending: +	/*  	 * Disable interrupts so as to make sure we don't  	 * miss an interrupt that sets any of the thread flags (like  	 * need_resched or sigpending) between sampling and the iret. @@ -848,9 +860,6 @@ STD_ENTRY(interrupt_return)  	IRQ_DISABLE(r20, r21)  	TRACE_IRQS_OFF  /* Note: clobbers registers r0-r29 */ -	/* Get base of stack in r32; note r30/31 are used as arguments here. */ -	GET_THREAD_INFO(r32) -  	/* Check to see if there is any work to do before returning to user. */  	{ @@ -866,16 +875,18 @@ STD_ENTRY(interrupt_return)  	/*  	 * Make sure we have all the registers saved for signal -	 * handling or single-step.  Call out to C code to figure out -	 * exactly what we need to do for each flag bit, then if -	 * necessary, reload the flags and recheck. +	 * handling, notify-resume, or single-step.  Call out to C +	 * code to figure out exactly what we need to do for each flag bit, +	 * then if necessary, reload the flags and recheck.  	 */ -	push_extra_callee_saves r0  	{  	 PTREGS_PTR(r0, PTREGS_OFFSET_BASE) -	 jal    do_work_pending +	 bnz    r33, 1f  	} -	bnz     r0, .Lresume_userspace +	push_extra_callee_saves r0 +	movei   r33, 1 +1:	jal     do_work_pending +	bnz     r0, .Lretry_work_pending  	/*  	 * In the NMI case we @@ -1180,10 +1191,12 @@ handle_syscall:  	add     r20, r20, tp  	lw      r21, r20  	addi    r21, r21, 1 -	sw      r20, r21 +	{ +	 sw     r20, r21 +	 GET_THREAD_INFO(r31) +	}  	/* Trace syscalls, if requested. */ -	GET_THREAD_INFO(r31)  	addi	r31, r31, THREAD_INFO_FLAGS_OFFSET  	lw	r30, r31  	andi    r30, r30, _TIF_SYSCALL_TRACE @@ -1362,7 +1375,10 @@ handle_ill:  3:  	/* set PC and continue */  	lw      r26, r24 -	sw      r28, r26 +	{ +	 sw     r28, r26 +	 GET_THREAD_INFO(r0) +	}  	/*  	 * Clear TIF_SINGLESTEP to prevent recursion if we execute an ill. @@ -1370,7 +1386,6 @@ handle_ill:  	 * need to clear it here and can't really impose on all other arches.  	 * So what's another write between friends?  	 */ -	GET_THREAD_INFO(r0)  	addi    r1, r0, THREAD_INFO_FLAGS_OFFSET  	{ diff --git a/arch/tile/kernel/intvec_64.S b/arch/tile/kernel/intvec_64.S index 49d9d662168..30ae76e50c4 100644 --- a/arch/tile/kernel/intvec_64.S +++ b/arch/tile/kernel/intvec_64.S @@ -647,6 +647,20 @@ STD_ENTRY(interrupt_return)  	FEEDBACK_REENTER(interrupt_return)  	/* +	 * Use r33 to hold whether we have already loaded the callee-saves +	 * into ptregs.  We don't want to do it twice in this loop, since +	 * then we'd clobber whatever changes are made by ptrace, etc. +	 */ +	{ +	 movei  r33, 0 +	 move   r32, sp +	} + +	/* Get base of stack in r32. */ +	EXTRACT_THREAD_INFO(r32) + +.Lretry_work_pending: +	/*  	 * Disable interrupts so as to make sure we don't  	 * miss an interrupt that sets any of the thread flags (like  	 * need_resched or sigpending) between sampling and the iret. @@ -656,9 +670,6 @@ STD_ENTRY(interrupt_return)  	IRQ_DISABLE(r20, r21)  	TRACE_IRQS_OFF  /* Note: clobbers registers r0-r29 */ -	/* Get base of stack in r32; note r30/31 are used as arguments here. */ -	GET_THREAD_INFO(r32) -  	/* Check to see if there is any work to do before returning to user. */  	{ @@ -674,16 +685,18 @@ STD_ENTRY(interrupt_return)  	/*  	 * Make sure we have all the registers saved for signal -	 * handling or single-step.  Call out to C code to figure out +	 * handling or notify-resume.  Call out to C code to figure out  	 * exactly what we need to do for each flag bit, then if  	 * necessary, reload the flags and recheck.  	 */ -	push_extra_callee_saves r0  	{  	 PTREGS_PTR(r0, PTREGS_OFFSET_BASE) -	 jal    do_work_pending +	 bnez   r33, 1f  	} -	bnez    r0, .Lresume_userspace +	push_extra_callee_saves r0 +	movei   r33, 1 +1:	jal     do_work_pending +	bnez    r0, .Lretry_work_pending  	/*  	 * In the NMI case we @@ -968,11 +981,16 @@ handle_syscall:  	shl16insli r20, r20, hw0(irq_stat + IRQ_CPUSTAT_SYSCALL_COUNT_OFFSET)  	add     r20, r20, tp  	ld4s    r21, r20 -	addi    r21, r21, 1 -	st4     r20, r21 +	{ +	 addi   r21, r21, 1 +	 move   r31, sp +	} +	{ +	 st4    r20, r21 +	 EXTRACT_THREAD_INFO(r31) +	}  	/* Trace syscalls, if requested. */ -	GET_THREAD_INFO(r31)  	addi	r31, r31, THREAD_INFO_FLAGS_OFFSET  	ld	r30, r31  	andi    r30, r30, _TIF_SYSCALL_TRACE diff --git a/arch/tile/kernel/process.c b/arch/tile/kernel/process.c index 2d5ef617bb3..54e6c64b85c 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,   */  int do_work_pending(struct pt_regs *regs, u32 thread_info_flags)  { +	/* If we enter in kernel mode, do nothing and exit the caller loop. */ +	if (!user_mode(regs)) +		return 0; +  	if (thread_info_flags & _TIF_NEED_RESCHED) {  		schedule();  		return 1; @@ -589,8 +593,7 @@ int do_work_pending(struct pt_regs *regs, u32 thread_info_flags)  		return 1;  	}  	if (thread_info_flags & _TIF_SINGLESTEP) { -		if ((regs->ex1 & SPR_EX_CONTEXT_1_1__PL_MASK) == 0) -			single_step_once(regs); +		single_step_once(regs);  		return 0;  	}  	panic("work_pending: bad flags %#x\n", thread_info_flags); diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 1d14cc6b79a..c9866b0b77d 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -81,7 +81,7 @@ config X86  	select CLKEVT_I8253  	select ARCH_HAVE_NMI_SAFE_CMPXCHG  	select GENERIC_IOMAP -	select DCACHE_WORD_ACCESS if !DEBUG_PAGEALLOC +	select DCACHE_WORD_ACCESS  config INSTRUCTION_DECODER  	def_bool (KPROBES || PERF_EVENTS) diff --git a/arch/x86/boot/compressed/relocs.c b/arch/x86/boot/compressed/relocs.c index d3c0b027766..fb7117a4ade 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)  	for (i = 0; i < ehdr.e_shnum; i++) {  		struct section *sec = &secs[i];  		char *sym_strtab; -		Elf32_Sym *sh_symtab;  		int j;  		if (sec->shdr.sh_type != SHT_SYMTAB) {  			continue;  		} -		sh_symtab = sec->symtab;  		sym_strtab = sec->link->strtab;  		for (j = 0; j < sec->shdr.sh_size/sizeof(Elf32_Sym); j++) {  			Elf32_Sym *sym; diff --git a/arch/x86/ia32/ia32_aout.c b/arch/x86/ia32/ia32_aout.c index 4824fb45560..07b3a68d2d2 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)  	/* OK, This is the point of no return */  	set_personality(PER_LINUX); -	set_thread_flag(TIF_IA32); -	current->mm->context.ia32_compat = 1; +	set_personality_ia32(false);  	setup_new_exec(bprm); diff --git a/arch/x86/include/asm/word-at-a-time.h b/arch/x86/include/asm/word-at-a-time.h index 6fe6767b712..e58f03b206c 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)  	return ((a - REPEAT_BYTE(0x01)) & ~a) & REPEAT_BYTE(0x80);  } +/* + * Load an unaligned word from kernel space. + * + * In the (very unlikely) case of the word being a page-crosser + * and the next page not being mapped, take the exception and + * return zeroes in the non-existing part. + */ +static inline unsigned long load_unaligned_zeropad(const void *addr) +{ +	unsigned long ret, dummy; + +	asm( +		"1:\tmov %2,%0\n" +		"2:\n" +		".section .fixup,\"ax\"\n" +		"3:\t" +		"lea %2,%1\n\t" +		"and %3,%1\n\t" +		"mov (%1),%0\n\t" +		"leal %2,%%ecx\n\t" +		"andl %4,%%ecx\n\t" +		"shll $3,%%ecx\n\t" +		"shr %%cl,%0\n\t" +		"jmp 2b\n" +		".previous\n" +		_ASM_EXTABLE(1b, 3b) +		:"=&r" (ret),"=&c" (dummy) +		:"m" (*(unsigned long *)addr), +		 "i" (-sizeof(unsigned long)), +		 "i" (sizeof(unsigned long)-1)); +	return ret; +} +  #endif /* _ASM_WORD_AT_A_TIME_H */ diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index 1c67ca100e4..146bb6218ee 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)  		}  	} +	/* re-enable TopologyExtensions if switched off by BIOS */ +	if ((c->x86 == 0x15) && +	    (c->x86_model >= 0x10) && (c->x86_model <= 0x1f) && +	    !cpu_has(c, X86_FEATURE_TOPOEXT)) { +		u64 val; + +		if (!rdmsrl_amd_safe(0xc0011005, &val)) { +			val |= 1ULL << 54; +			wrmsrl_amd_safe(0xc0011005, val); +			rdmsrl(0xc0011005, val); +			if (val & (1ULL << 54)) { +				set_cpu_cap(c, X86_FEATURE_TOPOEXT); +				printk(KERN_INFO FW_INFO "CPU: Re-enabling " +				  "disabled Topology Extensions Support\n"); +			} +		} +	} +  	cpu_detect_cache_sizes(c);  	/* Multi core CPU? */ diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c index b8ba6e4a27e..e554e5ad2fe 100644 --- a/arch/x86/kernel/kvm.c +++ b/arch/x86/kernel/kvm.c @@ -79,7 +79,6 @@ struct kvm_task_sleep_node {  	u32 token;  	int cpu;  	bool halted; -	struct mm_struct *mm;  };  static struct kvm_task_sleep_head { @@ -126,9 +125,7 @@ void kvm_async_pf_task_wait(u32 token)  	n.token = token;  	n.cpu = smp_processor_id(); -	n.mm = current->active_mm;  	n.halted = idle || preempt_count() > 1; -	atomic_inc(&n.mm->mm_count);  	init_waitqueue_head(&n.wq);  	hlist_add_head(&n.link, &b->list);  	spin_unlock(&b->lock); @@ -161,9 +158,6 @@ EXPORT_SYMBOL_GPL(kvm_async_pf_task_wait);  static void apf_task_wake_one(struct kvm_task_sleep_node *n)  {  	hlist_del_init(&n->link); -	if (!n->mm) -		return; -	mmdrop(n->mm);  	if (n->halted)  		smp_send_reschedule(n->cpu);  	else if (waitqueue_active(&n->wq)) @@ -207,7 +201,7 @@ again:  		 * async PF was not yet handled.  		 * Add dummy entry for the token.  		 */ -		n = kmalloc(sizeof(*n), GFP_ATOMIC); +		n = kzalloc(sizeof(*n), GFP_ATOMIC);  		if (!n) {  			/*  			 * Allocation failed! Busy wait while other cpu @@ -219,7 +213,6 @@ again:  		}  		n->token = token;  		n->cpu = smp_processor_id(); -		n->mm = NULL;  		init_waitqueue_head(&n->wq);  		hlist_add_head(&n->link, &b->list);  	} else diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index 733ca39f367..43d8b48b23e 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)  		current_thread_info()->status |= TS_COMPAT;  	}  } +EXPORT_SYMBOL_GPL(set_personality_ia32);  unsigned long get_wchan(struct task_struct *p)  { diff --git a/arch/x86/kernel/setup_percpu.c b/arch/x86/kernel/setup_percpu.c index 71f4727da37..5a98aa27218 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)  #endif  	rc = -EINVAL;  	if (pcpu_chosen_fc != PCPU_FC_PAGE) { -		const size_t atom_size = cpu_has_pse ? PMD_SIZE : PAGE_SIZE;  		const size_t dyn_size = PERCPU_MODULE_RESERVE +  			PERCPU_DYNAMIC_RESERVE - PERCPU_FIRST_CHUNK_RESERVE; +		size_t atom_size; +		/* +		 * On 64bit, use PMD_SIZE for atom_size so that embedded +		 * percpu areas are aligned to PMD.  This, in the future, +		 * can also allow using PMD mappings in vmalloc area.  Use +		 * PAGE_SIZE on 32bit as vmalloc space is highly contended +		 * and large vmalloc area allocs can easily fail. +		 */ +#ifdef CONFIG_X86_64 +		atom_size = PMD_SIZE; +#else +		atom_size = PAGE_SIZE; +#endif  		rc = pcpu_embed_first_chunk(PERCPU_FIRST_CHUNK_RESERVE,  					    dyn_size, atom_size,  					    pcpu_cpu_distance, diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 91a5e989abc..185a2b823a2 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,  		kvm_inject_page_fault(vcpu, &fault);  	}  	vcpu->arch.apf.halted = false; +	vcpu->arch.mp_state = KVM_MP_STATE_RUNNABLE;  }  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 66d377e334f..646e3b5b4bb 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[] = {  		.name = "net5501:1",  		.gpio = 6,  		.default_trigger = "default-on", -		.active_low = 1, +		.active_low = 0,  	},  }; diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index a8f8844b8d3..95dccce8e97 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c @@ -63,6 +63,7 @@  #include <asm/stackprotector.h>  #include <asm/hypervisor.h>  #include <asm/mwait.h> +#include <asm/pci_x86.h>  #ifdef CONFIG_ACPI  #include <linux/acpi.h> @@ -809,9 +810,40 @@ static void xen_io_delay(void)  }  #ifdef CONFIG_X86_LOCAL_APIC +static unsigned long xen_set_apic_id(unsigned int x) +{ +	WARN_ON(1); +	return x; +} +static unsigned int xen_get_apic_id(unsigned long x) +{ +	return ((x)>>24) & 0xFFu; +}  static u32 xen_apic_read(u32 reg)  { -	return 0; +	struct xen_platform_op op = { +		.cmd = XENPF_get_cpuinfo, +		.interface_version = XENPF_INTERFACE_VERSION, +		.u.pcpu_info.xen_cpuid = 0, +	}; +	int ret = 0; + +	/* Shouldn't need this as APIC is turned off for PV, and we only +	 * get called on the bootup processor. But just in case. */ +	if (!xen_initial_domain() || smp_processor_id()) +		return 0; + +	if (reg == APIC_LVR) +		return 0x10; + +	if (reg != APIC_ID) +		return 0; + +	ret = HYPERVISOR_dom0_op(&op); +	if (ret) +		return 0; + +	return op.u.pcpu_info.apic_id << 24;  }  static void xen_apic_write(u32 reg, u32 val) @@ -849,6 +881,8 @@ static void set_xen_basic_apic_ops(void)  	apic->icr_write = xen_apic_icr_write;  	apic->wait_icr_idle = xen_apic_wait_icr_idle;  	apic->safe_wait_icr_idle = xen_safe_apic_wait_icr_idle; +	apic->set_apic_id = xen_set_apic_id; +	apic->get_apic_id = xen_get_apic_id;  }  #endif @@ -1365,8 +1399,10 @@ asmlinkage void __init xen_start_kernel(void)  		/* Make sure ACS will be enabled */  		pci_request_acs();  	} -		 - +#ifdef CONFIG_PCI +	/* PCI BIOS service won't work from a PV guest. */ +	pci_probe &= ~PCI_PROBE_BIOS; +#endif  	xen_raw_console_write("about to get started...\n");  	xen_setup_runstate_info(0); diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c index b8e279479a6..69f5857660a 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)  {  	if (val & _PAGE_PRESENT) {  		unsigned long mfn = (val & PTE_PFN_MASK) >> PAGE_SHIFT; +		unsigned long pfn = mfn_to_pfn(mfn); +  		pteval_t flags = val & PTE_FLAGS_MASK; -		val = ((pteval_t)mfn_to_pfn(mfn) << PAGE_SHIFT) | flags; +		if (unlikely(pfn == ~0)) +			val = flags & ~_PAGE_PRESENT; +		else +			val = ((pteval_t)pfn << PAGE_SHIFT) | flags;  	}  	return val; diff --git a/drivers/acpi/power.c b/drivers/acpi/power.c index 7049a7d27c4..330bb4d7585 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)  	 * We know a device's inferred power state when all the resources  	 * required for a given D-state are 'on'.  	 */ -	for (i = ACPI_STATE_D0; i < ACPI_STATE_D3; i++) { +	for (i = ACPI_STATE_D0; i < ACPI_STATE_D3_HOT; i++) {  		list = &device->power.states[i].resources;  		if (list->count < 1)  			continue; diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index 767e2dcb961..7417267e88f 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)  	/*  	 * Enumerate supported power management states  	 */ -	for (i = ACPI_STATE_D0; i <= ACPI_STATE_D3; i++) { +	for (i = ACPI_STATE_D0; i <= ACPI_STATE_D3_HOT; i++) {  		struct acpi_device_power_state *ps = &device->power.states[i];  		char object_name[5] = { '_', 'P', 'R', '0' + i, '\0' }; @@ -884,21 +884,18 @@ static int acpi_bus_get_power_flags(struct acpi_device *device)  				acpi_bus_add_power_resource(ps->resources.handles[j]);  		} -		/* The exist of _PR3 indicates D3Cold support */ -		if (i == ACPI_STATE_D3) { -			status = acpi_get_handle(device->handle, object_name, &handle); -			if (ACPI_SUCCESS(status)) -				device->power.states[ACPI_STATE_D3_COLD].flags.valid = 1; -		} -  		/* Evaluate "_PSx" to see if we can do explicit sets */  		object_name[2] = 'S';  		status = acpi_get_handle(device->handle, object_name, &handle);  		if (ACPI_SUCCESS(status))  			ps->flags.explicit_set = 1; -		/* State is valid if we have some power control */ -		if (ps->resources.count || ps->flags.explicit_set) +		/* +		 * State is valid if there are means to put the device into it. +		 * D3hot is only valid if _PR3 present. +		 */ +		if (ps->resources.count || +		    (ps->flags.explicit_set && i < ACPI_STATE_D3_HOT))  			ps->flags.valid = 1;  		ps->power = -1;	/* Unknown - driver assigned */ diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c index 7a3f535e481..bb80853ff27 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,  			map->format.parse_val(val + i);  	} else {  		for (i = 0; i < val_count; i++) { -			ret = regmap_read(map, reg + i, val + (i * val_bytes)); +			unsigned int ival; +			ret = regmap_read(map, reg + i, &ival);  			if (ret != 0)  				return ret; +			memcpy(val + (i * val_bytes), &ival, val_bytes);  		}  	} diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c index abfaacaaf34..946166e1395 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  		return;  	} -	if (!cap_raised(current_cap(), CAP_SYS_ADMIN)) { +	if (!capable(CAP_SYS_ADMIN)) {  		retcode = ERR_PERM;  		goto fail;  	} diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c index 1adc2ec1e38..4461540653a 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)  	}  	_gpio_rmw(base, bank->regs->irqenable, l, bank->regs->irqenable_inv); -	_gpio_rmw(base, bank->regs->irqstatus, l, -					bank->regs->irqenable_inv == false); -	_gpio_rmw(base, bank->regs->irqenable, l, bank->regs->debounce_en != 0); -	_gpio_rmw(base, bank->regs->irqenable, l, bank->regs->ctrl != 0); +	_gpio_rmw(base, bank->regs->irqstatus, l, !bank->regs->irqenable_inv);  	if (bank->regs->debounce_en) -		_gpio_rmw(base, bank->regs->debounce_en, 0, 1); +		__raw_writel(0, base + bank->regs->debounce_en);  	/* Save OE default value (0xffffffff) in the context */  	bank->context.oe = __raw_readl(bank->base + bank->regs->direction);  	 /* Initialize interface clk ungated, module enabled */  	if (bank->regs->ctrl) -		_gpio_rmw(base, bank->regs->ctrl, 0, 1); +		__raw_writel(0, base + bank->regs->ctrl);  }  static __devinit void diff --git a/drivers/gpio/gpio-pch.c b/drivers/gpio/gpio-pch.c index e8729cc2ba2..2cd958e0b82 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)  static int pch_irq_type(struct irq_data *d, unsigned int type)  { -	u32 im; -	u32 __iomem *im_reg; -	u32 ien; -	u32 im_pos; -	int ch; -	unsigned long flags; -	u32 val; -	int irq = d->irq;  	struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);  	struct pch_gpio *chip = gc->private; +	u32 im, im_pos, val; +	u32 __iomem *im_reg; +	unsigned long flags; +	int ch, irq = d->irq;  	ch = irq - chip->irq_base;  	if (irq <= chip->irq_base + 7) { @@ -270,30 +266,22 @@ static int pch_irq_type(struct irq_data *d, unsigned int type)  	case IRQ_TYPE_LEVEL_LOW:  		val = PCH_LEVEL_L;  		break; -	case IRQ_TYPE_PROBE: -		goto end;  	default: -		dev_warn(chip->dev, "%s: unknown type(%dd)", -			__func__, type); -		goto end; +		goto unlock;  	}  	/* Set interrupt mode */  	im = ioread32(im_reg) & ~(PCH_IM_MASK << (im_pos * 4));  	iowrite32(im | (val << (im_pos * 4)), im_reg); -	/* iclr */ -	iowrite32(BIT(ch), &chip->reg->iclr); +	/* And the handler */ +	if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH)) +		__irq_set_handler_locked(d->irq, handle_level_irq); +	else if (type & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING)) +		__irq_set_handler_locked(d->irq, handle_edge_irq); -	/* IMASKCLR */ -	iowrite32(BIT(ch), &chip->reg->imaskclr); - -	/* Enable interrupt */ -	ien = ioread32(&chip->reg->ien); -	iowrite32(ien | BIT(ch), &chip->reg->ien); -end: +unlock:  	spin_unlock_irqrestore(&chip->spinlock, flags); -  	return 0;  } @@ -313,18 +301,24 @@ static void pch_irq_mask(struct irq_data *d)  	iowrite32(1 << (d->irq - chip->irq_base), &chip->reg->imask);  } +static void pch_irq_ack(struct irq_data *d) +{ +	struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); +	struct pch_gpio *chip = gc->private; + +	iowrite32(1 << (d->irq - chip->irq_base), &chip->reg->iclr); +} +  static irqreturn_t pch_gpio_handler(int irq, void *dev_id)  {  	struct pch_gpio *chip = dev_id;  	u32 reg_val = ioread32(&chip->reg->istatus); -	int i; -	int ret = IRQ_NONE; +	int i, ret = IRQ_NONE;  	for (i = 0; i < gpio_pins[chip->ioh]; i++) {  		if (reg_val & BIT(i)) {  			dev_dbg(chip->dev, "%s:[%d]:irq=%d  status=0x%x\n",  				__func__, i, irq, reg_val); -			iowrite32(BIT(i), &chip->reg->iclr);  			generic_handle_irq(chip->irq_base + i);  			ret = IRQ_HANDLED;  		} @@ -343,6 +337,7 @@ static __devinit void pch_gpio_alloc_generic_chip(struct pch_gpio *chip,  	gc->private = chip;  	ct = gc->chip_types; +	ct->chip.irq_ack = pch_irq_ack;  	ct->chip.irq_mask = pch_irq_mask;  	ct->chip.irq_unmask = pch_irq_unmask;  	ct->chip.irq_set_type = pch_irq_type; @@ -357,6 +352,7 @@ static int __devinit pch_gpio_probe(struct pci_dev *pdev,  	s32 ret;  	struct pch_gpio *chip;  	int irq_base; +	u32 msk;  	chip = kzalloc(sizeof(*chip), GFP_KERNEL);  	if (chip == NULL) @@ -408,8 +404,13 @@ static int __devinit pch_gpio_probe(struct pci_dev *pdev,  	}  	chip->irq_base = irq_base; +	/* Mask all interrupts, but enable them */ +	msk = (1 << gpio_pins[chip->ioh]) - 1; +	iowrite32(msk, &chip->reg->imask); +	iowrite32(msk, &chip->reg->ien); +  	ret = request_irq(pdev->irq, pch_gpio_handler, -			     IRQF_SHARED, KBUILD_MODNAME, chip); +			  IRQF_SHARED, KBUILD_MODNAME, chip);  	if (ret != 0) {  		dev_err(&pdev->dev,  			"%s request_irq failed\n", __func__); @@ -418,8 +419,6 @@ static int __devinit pch_gpio_probe(struct pci_dev *pdev,  	pch_gpio_alloc_generic_chip(chip, irq_base, gpio_pins[chip->ioh]); -	/* Initialize interrupt ien register */ -	iowrite32(0, &chip->reg->ien);  end:  	return 0; diff --git a/drivers/gpio/gpio-samsung.c b/drivers/gpio/gpio-samsung.c index 19d6fc0229c..e991d917196 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 = {  };  #endif +#if defined(CONFIG_ARCH_EXYNOS4) || defined(CONFIG_ARCH_EXYNOS5)  static struct samsung_gpio_cfg exynos_gpio_cfg = {  	.set_pull	= exynos_gpio_setpull,  	.get_pull	= exynos_gpio_getpull,  	.set_config	= samsung_gpio_setcfg_4bit,  	.get_config	= samsung_gpio_getcfg_4bit,  }; +#endif  #if defined(CONFIG_CPU_S5P6440) || defined(CONFIG_CPU_S5P6450)  static struct samsung_gpio_cfg s5p64x0_gpio_cfg_rbank = { @@ -2123,8 +2125,8 @@ static struct samsung_gpio_chip s5pv210_gpios_4bit[] = {   * uses the above macro and depends on the banks being listed in order here.   */ -static struct samsung_gpio_chip exynos4_gpios_1[] = {  #ifdef CONFIG_ARCH_EXYNOS4 +static struct samsung_gpio_chip exynos4_gpios_1[] = {  	{  		.chip	= {  			.base	= EXYNOS4_GPA0(0), @@ -2222,11 +2224,11 @@ static struct samsung_gpio_chip exynos4_gpios_1[] = {  			.label	= "GPF3",  		},  	}, -#endif  }; +#endif -static struct samsung_gpio_chip exynos4_gpios_2[] = {  #ifdef CONFIG_ARCH_EXYNOS4 +static struct samsung_gpio_chip exynos4_gpios_2[] = {  	{  		.chip	= {  			.base	= EXYNOS4_GPJ0(0), @@ -2367,11 +2369,11 @@ static struct samsung_gpio_chip exynos4_gpios_2[] = {  			.to_irq	= samsung_gpiolib_to_irq,  		},  	}, -#endif  }; +#endif -static struct samsung_gpio_chip exynos4_gpios_3[] = {  #ifdef CONFIG_ARCH_EXYNOS4 +static struct samsung_gpio_chip exynos4_gpios_3[] = {  	{  		.chip	= {  			.base	= EXYNOS4_GPZ(0), @@ -2379,8 +2381,8 @@ static struct samsung_gpio_chip exynos4_gpios_3[] = {  			.label	= "GPZ",  		},  	}, -#endif  }; +#endif  #ifdef CONFIG_ARCH_EXYNOS5  static struct samsung_gpio_chip exynos5_gpios_1[] = { @@ -2719,7 +2721,9 @@ static __init int samsung_gpiolib_init(void)  {  	struct samsung_gpio_chip *chip;  	int i, nr_chips; +#if defined(CONFIG_CPU_EXYNOS4210) || defined(CONFIG_SOC_EXYNOS5250)  	void __iomem *gpio_base1, *gpio_base2, *gpio_base3, *gpio_base4; +#endif  	int group = 0;  	samsung_gpiolib_set_cfg(samsung_gpio_cfgs, ARRAY_SIZE(samsung_gpio_cfgs)); @@ -2971,6 +2975,7 @@ static __init int samsung_gpiolib_init(void)  	return 0; +#if defined(CONFIG_CPU_EXYNOS4210) || defined(CONFIG_SOC_EXYNOS5250)  err_ioremap4:  	iounmap(gpio_base3);  err_ioremap3: @@ -2979,6 +2984,7 @@ err_ioremap2:  	iounmap(gpio_base1);  err_ioremap1:  	return -ENOMEM; +#endif  }  core_initcall(samsung_gpiolib_init); diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index b505b70dba0..e6162a1681f 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)  	unsigned long temp, chipset, gfx;  	int ret; +	if (!IS_GEN5(dev)) +		return -ENODEV; +  	ret = mutex_lock_interruptible(&dev->struct_mutex);  	if (ret)  		return ret; diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index 785f67f963e..ba60f3c8f91 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)  	unsigned long diffms;  	u32 count; +	if (dev_priv->info->gen != 5) +		return; +  	getrawmonotonic(&now);  	diff1 = timespec_sub(now, dev_priv->last_time2); @@ -2121,12 +2124,14 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)  	setup_timer(&dev_priv->hangcheck_timer, i915_hangcheck_elapsed,  		    (unsigned long) dev); -	spin_lock(&mchdev_lock); -	i915_mch_dev = dev_priv; -	dev_priv->mchdev_lock = &mchdev_lock; -	spin_unlock(&mchdev_lock); +	if (IS_GEN5(dev)) { +		spin_lock(&mchdev_lock); +		i915_mch_dev = dev_priv; +		dev_priv->mchdev_lock = &mchdev_lock; +		spin_unlock(&mchdev_lock); -	ips_ping_for_i915_load(); +		ips_ping_for_i915_load(); +	}  	return 0; diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 5908cd56340..1b1cf3b3ff5 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)  	struct drm_device *dev = crtc->dev;  	drm_i915_private_t *dev_priv = dev->dev_private;  	struct intel_crtc *intel_crtc = to_intel_crtc(crtc); -	int pipe = intel_crtc->pipe; -	int dpll_reg = DPLL(pipe); -	int dpll = I915_READ(dpll_reg);  	if (HAS_PCH_SPLIT(dev))  		return; @@ -7087,10 +7084,15 @@ static void intel_decrease_pllclock(struct drm_crtc *crtc)  	 * the manual case.  	 */  	if (!HAS_PIPE_CXSR(dev) && intel_crtc->lowfreq_avail) { +		int pipe = intel_crtc->pipe; +		int dpll_reg = DPLL(pipe); +		u32 dpll; +  		DRM_DEBUG_DRIVER("downclocking LVDS\n");  		assert_panel_unlocked(dev_priv, pipe); +		dpll = I915_READ(dpll_reg);  		dpll |= DISPLAY_RATE_SELECT_FPA1;  		I915_WRITE(dpll_reg, dpll);  		intel_wait_for_vblank(dev, pipe); @@ -7098,7 +7100,6 @@ static void intel_decrease_pllclock(struct drm_crtc *crtc)  		if (!(dpll & DISPLAY_RATE_SELECT_FPA1))  			DRM_DEBUG_DRIVER("failed to downclock LVDS!\n");  	} -  }  /** diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c index cae3e5f17a4..2d7f47b56b6 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,  	val &= ~VIDEO_DIP_SELECT_MASK; -	I915_WRITE(VIDEO_DIP_CTL, val | port | flags); +	I915_WRITE(VIDEO_DIP_CTL, VIDEO_DIP_ENABLE | val | port | flags);  	for (i = 0; i < len; i += 4) {  		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 30e2c82101d..9c71183629c 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[] = {  		.ident = "Hewlett-Packard t5745",  		.matches = {  			DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), -			DMI_MATCH(DMI_BOARD_NAME, "hp t5745"), +			DMI_MATCH(DMI_PRODUCT_NAME, "hp t5745"),  		},  	},  	{ @@ -758,7 +758,7 @@ static const struct dmi_system_id intel_no_lvds[] = {  		.ident = "Hewlett-Packard st5747",  		.matches = {  			DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), -			DMI_MATCH(DMI_BOARD_NAME, "hp st5747"), +			DMI_MATCH(DMI_PRODUCT_NAME, "hp st5747"),  		},  	},  	{ diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index 80fce51e2f4..62892a826ed 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)  			return ret;  	} -	if (INTEL_INFO(dev)->gen >= 6) { -		I915_WRITE(INSTPM, -			   INSTPM_FORCE_ORDERING << 16 | INSTPM_FORCE_ORDERING); +	if (IS_GEN6(dev)) {  		/* From the Sandybridge PRM, volume 1 part 3, page 24:  		 * "If this bit is set, STCunit will have LRA as replacement  		 *  policy. [...] This bit must be reset.  LRA replacement @@ -411,6 +409,11 @@ static int init_render_ring(struct intel_ring_buffer *ring)  			   CM0_STC_EVICT_DISABLE_LRA_SNB << CM0_MASK_SHIFT);  	} +	if (INTEL_INFO(dev)->gen >= 6) { +		I915_WRITE(INSTPM, +			   INSTPM_FORCE_ORDERING << 16 | INSTPM_FORCE_ORDERING); +	} +  	return ret;  } diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index 232d77d07d8..ae5e748f39b 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  static int intel_sdvo_supports_hotplug(struct intel_sdvo *intel_sdvo)  { +	struct drm_device *dev = intel_sdvo->base.base.dev;  	u8 response[2]; +	/* HW Erratum: SDVO Hotplug is broken on all i945G chips, there's noise +	 * on the line. */ +	if (IS_I945G(dev) || IS_I945GM(dev)) +		return false; +  	return intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_HOT_PLUG_SUPPORT,  				    &response, 2) && response[0];  } diff --git a/drivers/gpu/drm/nouveau/nouveau_i2c.c b/drivers/gpu/drm/nouveau/nouveau_i2c.c index e2be95af2e5..77e564667b5 100644 --- a/drivers/gpu/drm/nouveau/nouveau_i2c.c +++ b/drivers/gpu/drm/nouveau/nouveau_i2c.c @@ -29,10 +29,6 @@  #include "nouveau_i2c.h"  #include "nouveau_hw.h" -#define T_TIMEOUT  2200000 -#define T_RISEFALL 1000 -#define T_HOLD     5000 -  static void  i2c_drive_scl(void *data, int state)  { @@ -113,175 +109,6 @@ i2c_sense_sda(void *data)  	return 0;  } -static void -i2c_delay(struct nouveau_i2c_chan *port, u32 nsec) -{ -	udelay((nsec + 500) / 1000); -} - -static bool -i2c_raise_scl(struct nouveau_i2c_chan *port) -{ -	u32 timeout = T_TIMEOUT / T_RISEFALL; - -	i2c_drive_scl(port, 1); -	do { -		i2c_delay(port, T_RISEFALL); -	} while (!i2c_sense_scl(port) && --timeout); - -	return timeout != 0; -} - -static int -i2c_start(struct nouveau_i2c_chan *port) -{ -	int ret = 0; - -	port->state  = i2c_sense_scl(port); -	port->state |= i2c_sense_sda(port) << 1; -	if (port->state != 3) { -		i2c_drive_scl(port, 0); -		i2c_drive_sda(port, 1); -		if (!i2c_raise_scl(port)) -			ret = -EBUSY; -	} - -	i2c_drive_sda(port, 0); -	i2c_delay(port, T_HOLD); -	i2c_drive_scl(port, 0); -	i2c_delay(port, T_HOLD); -	return ret; -} - -static void -i2c_stop(struct nouveau_i2c_chan *port) -{ -	i2c_drive_scl(port, 0); -	i2c_drive_sda(port, 0); -	i2c_delay(port, T_RISEFALL); - -	i2c_drive_scl(port, 1); -	i2c_delay(port, T_HOLD); -	i2c_drive_sda(port, 1); -	i2c_delay(port, T_HOLD); -} - -static int -i2c_bitw(struct nouveau_i2c_chan *port, int sda) -{ -	i2c_drive_sda(port, sda); -	i2c_delay(port, T_RISEFALL); - -	if (!i2c_raise_scl(port)) -		return -ETIMEDOUT; -	i2c_delay(port, T_HOLD); - -	i2c_drive_scl(port, 0); -	i2c_delay(port, T_HOLD); -	return 0; -} - -static int -i2c_bitr(struct nouveau_i2c_chan *port) -{ -	int sda; - -	i2c_drive_sda(port, 1); -	i2c_delay(port, T_RISEFALL); - -	if (!i2c_raise_scl(port)) -		return -ETIMEDOUT; -	i2c_delay(port, T_HOLD); - -	sda = i2c_sense_sda(port); - -	i2c_drive_scl(port, 0); -	i2c_delay(port, T_HOLD); -	return sda; -} - -static int -i2c_get_byte(struct nouveau_i2c_chan *port, u8 *byte, bool last) -{ -	int i, bit; - -	*byte = 0; -	for (i = 7; i >= 0; i--) { -		bit = i2c_bitr(port); -		if (bit < 0) -			return bit; -		*byte |= bit << i; -	} - -	return i2c_bitw(port, last ? 1 : 0); -} - -static int -i2c_put_byte(struct nouveau_i2c_chan *port, u8 byte) -{ -	int i, ret; -	for (i = 7; i >= 0; i--) { -		ret = i2c_bitw(port, !!(byte & (1 << i))); -		if (ret < 0) -			return ret; -	} - -	ret = i2c_bitr(port); -	if (ret == 1) /* nack */ -		ret = -EIO; -	return ret; -} - -static int -i2c_addr(struct nouveau_i2c_chan *port, struct i2c_msg *msg) -{ -	u32 addr = msg->addr << 1; -	if (msg->flags & I2C_M_RD) -		addr |= 1; -	return i2c_put_byte(port, addr); -} - -static int -i2c_bit_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) -{ -	struct nouveau_i2c_chan *port = (struct nouveau_i2c_chan *)adap; -	struct i2c_msg *msg = msgs; -	int ret = 0, mcnt = num; - -	while (!ret && mcnt--) { -		u8 remaining = msg->len; -		u8 *ptr = msg->buf; - -		ret = i2c_start(port); -		if (ret == 0) -			ret = i2c_addr(port, msg); - -		if (msg->flags & I2C_M_RD) { -			while (!ret && remaining--) -				ret = i2c_get_byte(port, ptr++, !remaining); -		} else { -			while (!ret && remaining--) -				ret = i2c_put_byte(port, *ptr++); -		} - -		msg++; -	} - -	i2c_stop(port); -	return (ret < 0) ? ret : num; -} - -static u32 -i2c_bit_func(struct i2c_adapter *adap) -{ -	return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL; -} - -const struct i2c_algorithm nouveau_i2c_bit_algo = { -	.master_xfer = i2c_bit_xfer, -	.functionality = i2c_bit_func -}; -  static const uint32_t nv50_i2c_port[] = {  	0x00e138, 0x00e150, 0x00e168, 0x00e180,  	0x00e254, 0x00e274, 0x00e764, 0x00e780, @@ -384,12 +211,10 @@ nouveau_i2c_init(struct drm_device *dev)  		case 0: /* NV04:NV50 */  			port->drive = entry[0];  			port->sense = entry[1]; -			port->adapter.algo = &nouveau_i2c_bit_algo;  			break;  		case 4: /* NV4E */  			port->drive = 0x600800 + entry[1];  			port->sense = port->drive; -			port->adapter.algo = &nouveau_i2c_bit_algo;  			break;  		case 5: /* NV50- */  			port->drive = entry[0] & 0x0f; @@ -402,7 +227,6 @@ nouveau_i2c_init(struct drm_device *dev)  				port->drive = 0x00d014 + (port->drive * 0x20);  				port->sense = port->drive;  			} -			port->adapter.algo = &nouveau_i2c_bit_algo;  			break;  		case 6: /* NV50- DP AUX */  			port->drive = entry[0]; @@ -413,7 +237,7 @@ nouveau_i2c_init(struct drm_device *dev)  			break;  		} -		if (!port->adapter.algo) { +		if (!port->adapter.algo && !port->drive) {  			NV_ERROR(dev, "I2C%d: type %d index %x/%x unknown\n",  				 i, port->type, port->drive, port->sense);  			kfree(port); @@ -429,7 +253,26 @@ nouveau_i2c_init(struct drm_device *dev)  		port->dcb = ROM32(entry[0]);  		i2c_set_adapdata(&port->adapter, i2c); -		ret = i2c_add_adapter(&port->adapter); +		if (port->adapter.algo != &nouveau_dp_i2c_algo) { +			port->adapter.algo_data = &port->bit; +			port->bit.udelay = 10; +			port->bit.timeout = usecs_to_jiffies(2200); +			port->bit.data = port; +			port->bit.setsda = i2c_drive_sda; +			port->bit.setscl = i2c_drive_scl; +			port->bit.getsda = i2c_sense_sda; +			port->bit.getscl = i2c_sense_scl; + +			i2c_drive_scl(port, 0); +			i2c_drive_sda(port, 1); +			i2c_drive_scl(port, 1); + +			ret = i2c_bit_add_bus(&port->adapter); +		} else { +			port->adapter.algo = &nouveau_dp_i2c_algo; +			ret = i2c_add_adapter(&port->adapter); +		} +  		if (ret) {  			NV_ERROR(dev, "I2C%d: failed register: %d\n", i, ret);  			kfree(port); diff --git a/drivers/gpu/drm/nouveau/nouveau_i2c.h b/drivers/gpu/drm/nouveau/nouveau_i2c.h index 4d2e4e9031b..1d083893a4d 100644 --- a/drivers/gpu/drm/nouveau/nouveau_i2c.h +++ b/drivers/gpu/drm/nouveau/nouveau_i2c.h @@ -34,6 +34,7 @@  struct nouveau_i2c_chan {  	struct i2c_adapter adapter;  	struct drm_device *dev; +	struct i2c_algo_bit_data bit;  	struct list_head head;  	u8  index;  	u8  type; diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index ea7df16e2f8..5992502a344 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)  				rdev->wb.use_event = true;  		}  	} -	/* always use writeback/events on NI */ -	if (ASIC_IS_DCE5(rdev)) { +	/* always use writeback/events on NI, APUs */ +	if (rdev->family >= CHIP_PALM) {  		rdev->wb.enabled = true;  		rdev->wb.use_event = true;  	} diff --git a/drivers/leds/leds-netxbig.c b/drivers/leds/leds-netxbig.c index d8433f2d53b..73973fdbd8b 100644 --- a/drivers/leds/leds-netxbig.c +++ b/drivers/leds/leds-netxbig.c @@ -112,7 +112,7 @@ err_free_addr:  	return err;  } -static void __devexit gpio_ext_free(struct netxbig_gpio_ext *gpio_ext) +static void gpio_ext_free(struct netxbig_gpio_ext *gpio_ext)  {  	int i; @@ -294,7 +294,7 @@ static ssize_t netxbig_led_sata_show(struct device *dev,  static DEVICE_ATTR(sata, 0644, netxbig_led_sata_show, netxbig_led_sata_store); -static void __devexit delete_netxbig_led(struct netxbig_led_data *led_dat) +static void delete_netxbig_led(struct netxbig_led_data *led_dat)  {  	if (led_dat->mode_val[NETXBIG_LED_SATA] != NETXBIG_LED_INVALID_MODE)  		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 2f0a14421a7..01cf89ec694 100644 --- a/drivers/leds/leds-ns2.c +++ b/drivers/leds/leds-ns2.c @@ -255,7 +255,7 @@ err_free_cmd:  	return ret;  } -static void __devexit delete_ns2_led(struct ns2_led_data *led_dat) +static void delete_ns2_led(struct ns2_led_data *led_dat)  {  	device_remove_file(led_dat->cdev.dev, &dev_attr_sata);  	led_classdev_unregister(&led_dat->cdev); diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c index 97e73e555d1..17e2b472e16 100644 --- a/drivers/md/bitmap.c +++ b/drivers/md/bitmap.c @@ -1727,8 +1727,7 @@ int bitmap_create(struct mddev *mddev)  	bitmap->chunkshift = (ffz(~mddev->bitmap_info.chunksize)  			      - BITMAP_BLOCK_SHIFT); -	/* now that chunksize and chunkshift are set, we can use these macros */ -	chunks = (blocks + bitmap->chunkshift - 1) >> +	chunks = (blocks + (1 << bitmap->chunkshift) - 1) >>  			bitmap->chunkshift;  	pages = (chunks + PAGE_COUNTER_RATIO - 1) / PAGE_COUNTER_RATIO; diff --git a/drivers/md/bitmap.h b/drivers/md/bitmap.h index 55ca5aec84e..b44b0aba2d4 100644 --- a/drivers/md/bitmap.h +++ b/drivers/md/bitmap.h @@ -101,9 +101,6 @@ typedef __u16 bitmap_counter_t;  #define BITMAP_BLOCK_SHIFT 9 -/* how many blocks per chunk? (this is variable) */ -#define CHUNK_BLOCK_RATIO(bitmap) ((bitmap)->mddev->bitmap_info.chunksize >> BITMAP_BLOCK_SHIFT) -  #endif  /* diff --git a/drivers/md/dm-log-userspace-transfer.c b/drivers/md/dm-log-userspace-transfer.c index 1f23e048f07..08d9a207259 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)  {  	struct dm_ulog_request *tfr = (struct dm_ulog_request *)(msg + 1); -	if (!cap_raised(current_cap(), CAP_SYS_ADMIN)) +	if (!capable(CAP_SYS_ADMIN))  		return;  	spin_lock(&receiving_list_lock); diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c index 922a3385eea..754f38f8a69 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)  		return 0;  	m->hw_handler_name = kstrdup(dm_shift_arg(as), GFP_KERNEL); -	request_module("scsi_dh_%s", m->hw_handler_name); -	if (scsi_dh_handler_exist(m->hw_handler_name) == 0) { +	if (!try_then_request_module(scsi_dh_handler_exist(m->hw_handler_name), +				     "scsi_dh_%s", m->hw_handler_name)) {  		ti->error = "unknown hardware handler type";  		ret = -EINVAL;  		goto fail; diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c index 213ae32a0fc..2fd87b544a9 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)  	hlist_del(&cell->list); -	bio_list_add(inmates, cell->holder); -	bio_list_merge(inmates, &cell->bios); +	if (inmates) { +		bio_list_add(inmates, cell->holder); +		bio_list_merge(inmates, &cell->bios); +	}  	mempool_free(cell, prison->cell_pool);  } @@ -303,9 +305,10 @@ static void cell_release(struct cell *cell, struct bio_list *bios)   */  static void __cell_release_singleton(struct cell *cell, struct bio *bio)  { -	hlist_del(&cell->list);  	BUG_ON(cell->holder != bio);  	BUG_ON(!bio_list_empty(&cell->bios)); + +	__cell_release(cell, NULL);  }  static void cell_release_singleton(struct cell *cell, struct bio *bio) @@ -1177,6 +1180,7 @@ static void no_space(struct cell *cell)  static void process_discard(struct thin_c *tc, struct bio *bio)  {  	int r; +	unsigned long flags;  	struct pool *pool = tc->pool;  	struct cell *cell, *cell2;  	struct cell_key key, key2; @@ -1218,7 +1222,9 @@ static void process_discard(struct thin_c *tc, struct bio *bio)  			m->bio = bio;  			if (!ds_add_work(&pool->all_io_ds, &m->list)) { +				spin_lock_irqsave(&pool->lock, flags);  				list_add(&m->list, &pool->prepared_discards); +				spin_unlock_irqrestore(&pool->lock, flags);  				wake_worker(pool);  			}  		} else { @@ -2626,8 +2632,10 @@ static int thin_endio(struct dm_target *ti,  	if (h->all_io_entry) {  		INIT_LIST_HEAD(&work);  		ds_dec(h->all_io_entry, &work); +		spin_lock_irqsave(&pool->lock, flags);  		list_for_each_entry_safe(m, tmp, &work, list)  			list_add(&m->list, &pool->prepared_discards); +		spin_unlock_irqrestore(&pool->lock, flags);  	}  	mempool_free(h, pool->endio_hook_pool); @@ -2759,6 +2767,6 @@ static void dm_thin_exit(void)  module_init(dm_thin_init);  module_exit(dm_thin_exit); -MODULE_DESCRIPTION(DM_NAME "device-mapper thin provisioning target"); +MODULE_DESCRIPTION(DM_NAME " thin provisioning target");  MODULE_AUTHOR("Joe Thornber <dm-devel@redhat.com>");  MODULE_LICENSE("GPL"); diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c index 0f64d718265..cb888d835a8 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)  	} else {  		/* default values */  		switch (c->delivery_system) { +		case SYS_DVBS: +		case SYS_DVBS2: +		case SYS_ISDBS: +		case SYS_TURBO:  		case SYS_DVBC_ANNEX_A:  		case SYS_DVBC_ANNEX_C:  			fepriv->min_delay = HZ / 20; diff --git a/drivers/media/rc/ene_ir.c b/drivers/media/rc/ene_ir.c index 860c112e0fd..bef5296173c 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)  	spin_lock_init(&dev->hw_lock); -	/* claim the resources */ -	error = -EBUSY; -	dev->hw_io = pnp_port_start(pnp_dev, 0); -	if (!request_region(dev->hw_io, ENE_IO_SIZE, ENE_DRIVER_NAME)) { -		dev->hw_io = -1; -		dev->irq = -1; -		goto error; -	} - -	dev->irq = pnp_irq(pnp_dev, 0); -	if (request_irq(dev->irq, ene_isr, -			IRQF_SHARED, ENE_DRIVER_NAME, (void *)dev)) { -		dev->irq = -1; -		goto error; -	} -  	pnp_set_drvdata(pnp_dev, dev);  	dev->pnp_dev = pnp_dev; @@ -1086,6 +1070,22 @@ static int ene_probe(struct pnp_dev *pnp_dev, const struct pnp_device_id *id)  	device_set_wakeup_capable(&pnp_dev->dev, true);  	device_set_wakeup_enable(&pnp_dev->dev, true); +	/* claim the resources */ +	error = -EBUSY; +	dev->hw_io = pnp_port_start(pnp_dev, 0); +	if (!request_region(dev->hw_io, ENE_IO_SIZE, ENE_DRIVER_NAME)) { +		dev->hw_io = -1; +		dev->irq = -1; +		goto error; +	} + +	dev->irq = pnp_irq(pnp_dev, 0); +	if (request_irq(dev->irq, ene_isr, +			IRQF_SHARED, ENE_DRIVER_NAME, (void *)dev)) { +		dev->irq = -1; +		goto error; +	} +  	error = rc_register_device(rdev);  	if (error < 0)  		goto error; diff --git a/drivers/media/rc/fintek-cir.c b/drivers/media/rc/fintek-cir.c index 392d4be91f8..4a3a238bcfb 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)  	/*  	 * Newer reviews of this chipset uses port 8 instead of 5  	 */ -	if ((chip != 0x0408) || (chip != 0x0804)) +	if ((chip != 0x0408) && (chip != 0x0804))  		fintek->logical_dev_cir = LOGICAL_DEV_CIR_REV2;  	else  		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  	spin_lock_init(&fintek->fintek_lock); -	ret = -EBUSY; -	/* now claim resources */ -	if (!request_region(fintek->cir_addr, -			    fintek->cir_port_len, FINTEK_DRIVER_NAME)) -		goto failure; - -	if (request_irq(fintek->cir_irq, fintek_cir_isr, IRQF_SHARED, -			FINTEK_DRIVER_NAME, (void *)fintek)) -		goto failure; -  	pnp_set_drvdata(pdev, fintek);  	fintek->pdev = pdev; @@ -558,6 +548,16 @@ static int fintek_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id  	/* rx resolution is hardwired to 50us atm, 1, 25, 100 also possible */  	rdev->rx_resolution = US_TO_NS(CIR_SAMPLE_PERIOD); +	ret = -EBUSY; +	/* now claim resources */ +	if (!request_region(fintek->cir_addr, +			    fintek->cir_port_len, FINTEK_DRIVER_NAME)) +		goto failure; + +	if (request_irq(fintek->cir_irq, fintek_cir_isr, IRQF_SHARED, +			FINTEK_DRIVER_NAME, (void *)fintek)) +		goto failure; +  	ret = rc_register_device(rdev);  	if (ret)  		goto failure; diff --git a/drivers/media/rc/ite-cir.c b/drivers/media/rc/ite-cir.c index 682009d76cd..0e49c99abf6 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  	/* initialize raw event */  	init_ir_raw_event(&itdev->rawir); -	ret = -EBUSY; -	/* now claim resources */ -	if (!request_region(itdev->cir_addr, -				dev_desc->io_region_size, ITE_DRIVER_NAME)) -		goto failure; - -	if (request_irq(itdev->cir_irq, ite_cir_isr, IRQF_SHARED, -			ITE_DRIVER_NAME, (void *)itdev)) -		goto failure; -  	/* set driver data into the pnp device */  	pnp_set_drvdata(pdev, itdev);  	itdev->pdev = pdev; @@ -1600,6 +1590,16 @@ static int ite_probe(struct pnp_dev *pdev, const struct pnp_device_id  	rdev->driver_name = ITE_DRIVER_NAME;  	rdev->map_name = RC_MAP_RC6_MCE; +	ret = -EBUSY; +	/* now claim resources */ +	if (!request_region(itdev->cir_addr, +				dev_desc->io_region_size, ITE_DRIVER_NAME)) +		goto failure; + +	if (request_irq(itdev->cir_irq, ite_cir_isr, IRQF_SHARED, +			ITE_DRIVER_NAME, (void *)itdev)) +		goto failure; +  	ret = rc_register_device(rdev);  	if (ret)  		goto failure; diff --git a/drivers/media/rc/nuvoton-cir.c b/drivers/media/rc/nuvoton-cir.c index 144f3f55d76..8b2c071ac0a 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)  	spin_lock_init(&nvt->nvt_lock);  	spin_lock_init(&nvt->tx.lock); -	ret = -EBUSY; -	/* now claim resources */ -	if (!request_region(nvt->cir_addr, -			    CIR_IOREG_LENGTH, NVT_DRIVER_NAME)) -		goto failure; - -	if (request_irq(nvt->cir_irq, nvt_cir_isr, IRQF_SHARED, -			NVT_DRIVER_NAME, (void *)nvt)) -		goto failure; - -	if (!request_region(nvt->cir_wake_addr, -			    CIR_IOREG_LENGTH, NVT_DRIVER_NAME)) -		goto failure; - -	if (request_irq(nvt->cir_wake_irq, nvt_cir_wake_isr, IRQF_SHARED, -			NVT_DRIVER_NAME, (void *)nvt)) -		goto failure; -  	pnp_set_drvdata(pdev, nvt);  	nvt->pdev = pdev; @@ -1085,6 +1067,24 @@ static int nvt_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id)  	rdev->tx_resolution = XYZ;  #endif +	ret = -EBUSY; +	/* now claim resources */ +	if (!request_region(nvt->cir_addr, +			    CIR_IOREG_LENGTH, NVT_DRIVER_NAME)) +		goto failure; + +	if (request_irq(nvt->cir_irq, nvt_cir_isr, IRQF_SHARED, +			NVT_DRIVER_NAME, (void *)nvt)) +		goto failure; + +	if (!request_region(nvt->cir_wake_addr, +			    CIR_IOREG_LENGTH, NVT_DRIVER_NAME)) +		goto failure; + +	if (request_irq(nvt->cir_wake_irq, nvt_cir_wake_isr, IRQF_SHARED, +			NVT_DRIVER_NAME, (void *)nvt)) +		goto failure; +  	ret = rc_register_device(rdev);  	if (ret)  		goto failure; diff --git a/drivers/media/rc/winbond-cir.c b/drivers/media/rc/winbond-cir.c index af526586fa2..342c2c8c1dd 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)  		"(w: 0x%lX, e: 0x%lX, s: 0x%lX, i: %u)\n",  		data->wbase, data->ebase, data->sbase, data->irq); -	if (!request_region(data->wbase, WAKEUP_IOMEM_LEN, DRVNAME)) { -		dev_err(dev, "Region 0x%lx-0x%lx already in use!\n", -			data->wbase, data->wbase + WAKEUP_IOMEM_LEN - 1); -		err = -EBUSY; -		goto exit_free_data; -	} - -	if (!request_region(data->ebase, EHFUNC_IOMEM_LEN, DRVNAME)) { -		dev_err(dev, "Region 0x%lx-0x%lx already in use!\n", -			data->ebase, data->ebase + EHFUNC_IOMEM_LEN - 1); -		err = -EBUSY; -		goto exit_release_wbase; -	} - -	if (!request_region(data->sbase, SP_IOMEM_LEN, DRVNAME)) { -		dev_err(dev, "Region 0x%lx-0x%lx already in use!\n", -			data->sbase, data->sbase + SP_IOMEM_LEN - 1); -		err = -EBUSY; -		goto exit_release_ebase; -	} - -	err = request_irq(data->irq, wbcir_irq_handler, -			  IRQF_DISABLED, DRVNAME, device); -	if (err) { -		dev_err(dev, "Failed to claim IRQ %u\n", data->irq); -		err = -EBUSY; -		goto exit_release_sbase; -	} -  	led_trigger_register_simple("cir-tx", &data->txtrigger);  	if (!data->txtrigger) {  		err = -ENOMEM; -		goto exit_free_irq; +		goto exit_free_data;  	}  	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)  	data->dev->priv = data;  	data->dev->dev.parent = &device->dev; +	if (!request_region(data->wbase, WAKEUP_IOMEM_LEN, DRVNAME)) { +		dev_err(dev, "Region 0x%lx-0x%lx already in use!\n", +			data->wbase, data->wbase + WAKEUP_IOMEM_LEN - 1); +		err = -EBUSY; +		goto exit_free_rc; +	} + +	if (!request_region(data->ebase, EHFUNC_IOMEM_LEN, DRVNAME)) { +		dev_err(dev, "Region 0x%lx-0x%lx already in use!\n", +			data->ebase, data->ebase + EHFUNC_IOMEM_LEN - 1); +		err = -EBUSY; +		goto exit_release_wbase; +	} + +	if (!request_region(data->sbase, SP_IOMEM_LEN, DRVNAME)) { +		dev_err(dev, "Region 0x%lx-0x%lx already in use!\n", +			data->sbase, data->sbase + SP_IOMEM_LEN - 1); +		err = -EBUSY; +		goto exit_release_ebase; +	} + +	err = request_irq(data->irq, wbcir_irq_handler, +			  IRQF_DISABLED, DRVNAME, device); +	if (err) { +		dev_err(dev, "Failed to claim IRQ %u\n", data->irq); +		err = -EBUSY; +		goto exit_release_sbase; +	} +  	err = rc_register_device(data->dev);  	if (err) -		goto exit_free_rc; +		goto exit_free_irq;  	device_init_wakeup(&device->dev, 1); @@ -1072,14 +1072,6 @@ wbcir_probe(struct pnp_dev *device, const struct pnp_device_id *dev_id)  	return 0; -exit_free_rc: -	rc_free_device(data->dev); -exit_unregister_led: -	led_classdev_unregister(&data->led); -exit_unregister_rxtrigger: -	led_trigger_unregister_simple(data->rxtrigger); -exit_unregister_txtrigger: -	led_trigger_unregister_simple(data->txtrigger);  exit_free_irq:  	free_irq(data->irq, device);  exit_release_sbase: @@ -1088,6 +1080,14 @@ exit_release_ebase:  	release_region(data->ebase, EHFUNC_IOMEM_LEN);  exit_release_wbase:  	release_region(data->wbase, WAKEUP_IOMEM_LEN); +exit_free_rc: +	rc_free_device(data->dev); +exit_unregister_led: +	led_classdev_unregister(&data->led); +exit_unregister_rxtrigger: +	led_trigger_unregister_simple(data->rxtrigger); +exit_unregister_txtrigger: +	led_trigger_unregister_simple(data->txtrigger);  exit_free_data:  	kfree(data);  	pnp_set_drvdata(device, NULL); diff --git a/drivers/media/video/gspca/sonixj.c b/drivers/media/video/gspca/sonixj.c index db8e5084df0..863c755dd2b 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,  	 * not the JPEG end of frame ('ff d9').  	 */ +	/* count the packets and their size */ +	sd->npkt++; +	sd->pktsz += len; +  /*fixme: assumption about the following code:   *	- there can be only one marker in a packet   */ @@ -2945,10 +2949,6 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,  		data += i;  	} -	/* count the packets and their size */ -	sd->npkt++; -	sd->pktsz += len; -  	/* search backwards if there is a marker in the packet */  	for (i = len - 1; --i >= 0; ) {  		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 d23552323f4..c4c17fe76c0 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)  	INIT_LIST_HEAD(&cam->devlist);  	mcam = &cam->mcam; -	mcam->platform = MHP_Armada610;  	mcam->plat_power_up = mmpcam_power_up;  	mcam->plat_power_down = mmpcam_power_down;  	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 b06efd20832..7e9b2c612b0 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)  } -static unsigned int get_plane_size(struct fimc_frame *fr, unsigned int plane) -{ -	if (!fr || plane >= fr->fmt->memplanes) -		return 0; -	return fr->f_width * fr->f_height * fr->fmt->depth[plane] / 8; -} - -static int queue_setup(struct vb2_queue *vq,  const struct v4l2_format *pfmt, +static int queue_setup(struct vb2_queue *vq, const struct v4l2_format *pfmt,  		       unsigned int *num_buffers, unsigned int *num_planes,  		       unsigned int sizes[], void *allocators[])  { +	const struct v4l2_pix_format_mplane *pixm = NULL;  	struct fimc_ctx *ctx = vq->drv_priv; -	struct fimc_fmt *fmt = ctx->d_frame.fmt; +	struct fimc_frame *frame = &ctx->d_frame; +	struct fimc_fmt *fmt = frame->fmt; +	unsigned long wh;  	int i; -	if (!fmt) +	if (pfmt) { +		pixm = &pfmt->fmt.pix_mp; +		fmt = fimc_find_format(&pixm->pixelformat, NULL, +				       FMT_FLAGS_CAM | FMT_FLAGS_M2M, -1); +		wh = pixm->width * pixm->height; +	} else { +		wh = frame->f_width * frame->f_height; +	} + +	if (fmt == NULL)  		return -EINVAL;  	*num_planes = fmt->memplanes;  	for (i = 0; i < fmt->memplanes; i++) { -		sizes[i] = get_plane_size(&ctx->d_frame, i); +		unsigned int size = (wh * fmt->depth[i]) / 8; +		if (pixm) +			sizes[i] = max(size, pixm->plane_fmt[i].sizeimage); +		else +			sizes[i] = size;  		allocators[i] = ctx->fimc_dev->alloc_ctx;  	} @@ -1383,7 +1392,7 @@ static int fimc_subdev_set_crop(struct v4l2_subdev *sd,  	fimc_capture_try_crop(ctx, r, crop->pad);  	if (crop->which == V4L2_SUBDEV_FORMAT_TRY) { -		mutex_lock(&fimc->lock); +		mutex_unlock(&fimc->lock);  		*v4l2_subdev_get_try_crop(fh, crop->pad) = *r;  		return 0;  	} diff --git a/drivers/media/video/s5p-fimc/fimc-core.c b/drivers/media/video/s5p-fimc/fimc-core.c index e184e650022..e09ba7b0076 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,   * @mask: the color flags to match   * @index: offset in the fimc_formats array, ignored if negative   */ -struct fimc_fmt *fimc_find_format(u32 *pixelformat, u32 *mbus_code, +struct fimc_fmt *fimc_find_format(const u32 *pixelformat, const u32 *mbus_code,  				  unsigned int mask, int index)  {  	struct fimc_fmt *fmt, *def_fmt = NULL;  	unsigned int i;  	int id = 0; -	if (index >= ARRAY_SIZE(fimc_formats)) +	if (index >= (int)ARRAY_SIZE(fimc_formats))  		return NULL;  	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 a18291e648e..84fd83550bd 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);  int fimc_fill_format(struct fimc_frame *frame, struct v4l2_format *f);  void fimc_adjust_mplane_format(struct fimc_fmt *fmt, u32 width, u32 height,  			       struct v4l2_pix_format_mplane *pix); -struct fimc_fmt *fimc_find_format(u32 *pixelformat, u32 *mbus_code, +struct fimc_fmt *fimc_find_format(const u32 *pixelformat, const u32 *mbus_code,  				  unsigned int mask, int index);  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 eb25756a07a..aedb970d13f 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)  		if (icl->reset)  			icl->reset(icd->pdev); +		/* Don't mess with the host during probe */ +		mutex_lock(&ici->host_lock);  		ret = ici->ops->add(icd); +		mutex_unlock(&ici->host_lock);  		if (ret < 0) {  			dev_err(icd->pdev, "Couldn't activate the camera: %d\n", ret);  			goto eiciadd; @@ -956,7 +959,7 @@ static void scan_add_host(struct soc_camera_host *ici)  {  	struct soc_camera_device *icd; -	mutex_lock(&list_lock); +	mutex_lock(&ici->host_lock);  	list_for_each_entry(icd, &devices, list) {  		if (icd->iface == ici->nr) { @@ -967,7 +970,7 @@ static void scan_add_host(struct soc_camera_host *ici)  		}  	} -	mutex_unlock(&list_lock); +	mutex_unlock(&ici->host_lock);  }  #ifdef CONFIG_I2C_BOARDINFO @@ -1313,6 +1316,7 @@ int soc_camera_host_register(struct soc_camera_host *ici)  	list_add_tail(&ici->list, &hosts);  	mutex_unlock(&list_lock); +	mutex_init(&ici->host_lock);  	scan_add_host(ici);  	return 0; diff --git a/drivers/media/video/videobuf2-dma-contig.c b/drivers/media/video/videobuf2-dma-contig.c index f17ad98fcc5..4b7132660a9 100644 --- a/drivers/media/video/videobuf2-dma-contig.c +++ b/drivers/media/video/videobuf2-dma-contig.c @@ -15,6 +15,7 @@  #include <linux/dma-mapping.h>  #include <media/videobuf2-core.h> +#include <media/videobuf2-dma-contig.h>  #include <media/videobuf2-memops.h>  struct vb2_dc_conf { @@ -85,7 +86,7 @@ static void *vb2_dma_contig_vaddr(void *buf_priv)  {  	struct vb2_dc_buf *buf = buf_priv;  	if (!buf) -		return 0; +		return NULL;  	return buf->vaddr;  } diff --git a/drivers/media/video/videobuf2-memops.c b/drivers/media/video/videobuf2-memops.c index c41cb60245d..504cd4cbe29 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)  	return vma_copy;  } +EXPORT_SYMBOL_GPL(vb2_get_vma);  /**   * vb2_put_userptr() - release a userspace virtual memory area diff --git a/drivers/mtd/mtdchar.c b/drivers/mtd/mtdchar.c index 58fc65f5c81..f2f482bec57 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)  	 * Make a fake call to mtd_read_fact_prot_reg() to check if OTP  	 * operations are supported.  	 */ -	if (mtd_read_fact_prot_reg(mtd, -1, -1, &retlen, NULL) == -EOPNOTSUPP) +	if (mtd_read_fact_prot_reg(mtd, -1, 0, &retlen, NULL) == -EOPNOTSUPP)  		return -EOPNOTSUPP;  	switch (mode) { diff --git a/drivers/mtd/nand/ams-delta.c b/drivers/mtd/nand/ams-delta.c index 73416951f4c..861ca8f7e47 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)  	/* Link the private data with the MTD structure */  	ams_delta_mtd->priv = this; -	if (!request_mem_region(res->start, resource_size(res), -			dev_name(&pdev->dev))) { -		dev_err(&pdev->dev, "request_mem_region failed\n"); -		err = -EBUSY; -		goto out_free; -	} +	/* +	 * Don't try to request the memory region from here, +	 * it should have been already requested from the +	 * gpio-omap driver and requesting it again would fail. +	 */  	io_base = ioremap(res->start, resource_size(res));  	if (io_base == NULL) {  		dev_err(&pdev->dev, "ioremap failed\n");  		err = -EIO; -		goto out_release_io; +		goto out_free;  	}  	this->priv = io_base; @@ -271,8 +270,6 @@ out_gpio:  	platform_set_drvdata(pdev, NULL);  	gpio_free(AMS_DELTA_GPIO_PIN_NAND_RB);  	iounmap(io_base); -out_release_io: -	release_mem_region(res->start, resource_size(res));  out_free:  	kfree(ams_delta_mtd);   out: @@ -285,7 +282,6 @@ out_free:  static int __devexit ams_delta_cleanup(struct platform_device *pdev)  {  	void __iomem *io_base = platform_get_drvdata(pdev); -	struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);  	/* Release resources, unregister device */  	nand_release(ams_delta_mtd); @@ -293,7 +289,6 @@ static int __devexit ams_delta_cleanup(struct platform_device *pdev)  	gpio_free_array(_mandatory_gpio, ARRAY_SIZE(_mandatory_gpio));  	gpio_free(AMS_DELTA_GPIO_PIN_NAND_RB);  	iounmap(io_base); -	release_mem_region(res->start, resource_size(res));  	/* Free the MTD device structure */  	kfree(ams_delta_mtd); diff --git a/drivers/net/bonding/bond_3ad.c b/drivers/net/bonding/bond_3ad.c index 793b0013827..3463b469e65 100644 --- a/drivers/net/bonding/bond_3ad.c +++ b/drivers/net/bonding/bond_3ad.c @@ -2173,9 +2173,10 @@ re_arm:   * received frames (loopback). Since only the payload is given to this   * function, it check for loopback.   */ -static void bond_3ad_rx_indication(struct lacpdu *lacpdu, struct slave *slave, u16 length) +static int bond_3ad_rx_indication(struct lacpdu *lacpdu, struct slave *slave, u16 length)  {  	struct port *port; +	int ret = RX_HANDLER_ANOTHER;  	if (length >= sizeof(struct lacpdu)) { @@ -2184,11 +2185,12 @@ static void bond_3ad_rx_indication(struct lacpdu *lacpdu, struct slave *slave, u  		if (!port->slave) {  			pr_warning("%s: Warning: port of slave %s is uninitialized\n",  				   slave->dev->name, slave->dev->master->name); -			return; +			return ret;  		}  		switch (lacpdu->subtype) {  		case AD_TYPE_LACPDU: +			ret = RX_HANDLER_CONSUMED;  			pr_debug("Received LACPDU on port %d\n",  				 port->actor_port_number);  			/* Protect against concurrent state machines */ @@ -2198,6 +2200,7 @@ static void bond_3ad_rx_indication(struct lacpdu *lacpdu, struct slave *slave, u  			break;  		case AD_TYPE_MARKER: +			ret = RX_HANDLER_CONSUMED;  			// No need to convert fields to Little Endian since we don't use the marker's fields.  			switch (((struct bond_marker *)lacpdu)->tlv_type) { @@ -2219,6 +2222,7 @@ static void bond_3ad_rx_indication(struct lacpdu *lacpdu, struct slave *slave, u  			}  		}  	} +	return ret;  }  /** @@ -2456,18 +2460,20 @@ out:  	return NETDEV_TX_OK;  } -void bond_3ad_lacpdu_recv(struct sk_buff *skb, struct bonding *bond, +int bond_3ad_lacpdu_recv(struct sk_buff *skb, struct bonding *bond,  			  struct slave *slave)  { +	int ret = RX_HANDLER_ANOTHER;  	if (skb->protocol != PKT_TYPE_LACPDU) -		return; +		return ret;  	if (!pskb_may_pull(skb, sizeof(struct lacpdu))) -		return; +		return ret;  	read_lock(&bond->lock); -	bond_3ad_rx_indication((struct lacpdu *) skb->data, slave, skb->len); +	ret = bond_3ad_rx_indication((struct lacpdu *) skb->data, slave, skb->len);  	read_unlock(&bond->lock); +	return ret;  }  /* diff --git a/drivers/net/bonding/bond_3ad.h b/drivers/net/bonding/bond_3ad.h index 235b2cc58b2..5ee7e3c45db 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);  void bond_3ad_handle_link_change(struct slave *slave, char link);  int  bond_3ad_get_active_agg_info(struct bonding *bond, struct ad_info *ad_info);  int bond_3ad_xmit_xor(struct sk_buff *skb, struct net_device *dev); -void bond_3ad_lacpdu_recv(struct sk_buff *skb, struct bonding *bond, +int bond_3ad_lacpdu_recv(struct sk_buff *skb, struct bonding *bond,  			  struct slave *slave);  int bond_3ad_set_carrier(struct bonding *bond);  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 b4f1b4ac92c..0f59c1564e5 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)  	_unlock_rx_hashtbl_bh(bond);  } -static void rlb_arp_recv(struct sk_buff *skb, struct bonding *bond, +static int rlb_arp_recv(struct sk_buff *skb, struct bonding *bond,  			 struct slave *slave)  {  	struct arp_pkt *arp;  	if (skb->protocol != cpu_to_be16(ETH_P_ARP)) -		return; +		goto out;  	arp = (struct arp_pkt *) skb->data;  	if (!arp) {  		pr_debug("Packet has no ARP data\n"); -		return; +		goto out;  	}  	if (!pskb_may_pull(skb, arp_hdr_len(bond->dev))) -		return; +		goto out;  	if (skb->len < sizeof(struct arp_pkt)) {  		pr_debug("Packet is too small to be an ARP\n"); -		return; +		goto out;  	}  	if (arp->op_code == htons(ARPOP_REPLY)) { @@ -369,6 +369,8 @@ static void rlb_arp_recv(struct sk_buff *skb, struct bonding *bond,  		rlb_update_entry_from_arp(bond, arp);  		pr_debug("Server received an ARP Reply from client\n");  	} +out: +	return RX_HANDLER_ANOTHER;  }  /* Caller must hold bond lock for read */ diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index bbb004354bb..2ee8cf9e8a3 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)  	struct sk_buff *skb = *pskb;  	struct slave *slave;  	struct bonding *bond; -	void (*recv_probe)(struct sk_buff *, struct bonding *, +	int (*recv_probe)(struct sk_buff *, struct bonding *,  				struct slave *); +	int ret = RX_HANDLER_ANOTHER;  	skb = skb_share_check(skb, GFP_ATOMIC);  	if (unlikely(!skb)) @@ -1464,8 +1465,12 @@ static rx_handler_result_t bond_handle_frame(struct sk_buff **pskb)  		struct sk_buff *nskb = skb_clone(skb, GFP_ATOMIC);  		if (likely(nskb)) { -			recv_probe(nskb, bond, slave); +			ret = recv_probe(nskb, bond, slave);  			dev_kfree_skb(nskb); +			if (ret == RX_HANDLER_CONSUMED) { +				consume_skb(skb); +				return ret; +			}  		}  	} @@ -1487,7 +1492,7 @@ static rx_handler_result_t bond_handle_frame(struct sk_buff **pskb)  		memcpy(eth_hdr(skb)->h_dest, bond->dev->dev_addr, ETH_ALEN);  	} -	return RX_HANDLER_ANOTHER; +	return ret;  }  /* enslave device <slave> to bond device <master> */ @@ -2732,7 +2737,7 @@ static void bond_validate_arp(struct bonding *bond, struct slave *slave, __be32  	}  } -static void bond_arp_rcv(struct sk_buff *skb, struct bonding *bond, +static int bond_arp_rcv(struct sk_buff *skb, struct bonding *bond,  			 struct slave *slave)  {  	struct arphdr *arp; @@ -2740,7 +2745,7 @@ static void bond_arp_rcv(struct sk_buff *skb, struct bonding *bond,  	__be32 sip, tip;  	if (skb->protocol != __cpu_to_be16(ETH_P_ARP)) -		return; +		return RX_HANDLER_ANOTHER;  	read_lock(&bond->lock); @@ -2785,6 +2790,7 @@ static void bond_arp_rcv(struct sk_buff *skb, struct bonding *bond,  out_unlock:  	read_unlock(&bond->lock); +	return RX_HANDLER_ANOTHER;  }  /* diff --git a/drivers/net/bonding/bonding.h b/drivers/net/bonding/bonding.h index 9f2bae6616d..4581aa5ccab 100644 --- a/drivers/net/bonding/bonding.h +++ b/drivers/net/bonding/bonding.h @@ -218,7 +218,7 @@ struct bonding {  	struct   slave *primary_slave;  	bool     force_primary;  	s32      slave_cnt; /* never change this value outside the attach/detach wrappers */ -	void     (*recv_probe)(struct sk_buff *, struct bonding *, +	int     (*recv_probe)(struct sk_buff *, struct bonding *,  			       struct slave *);  	rwlock_t lock;  	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 c9069a28832..f4d2da0db1b 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,  		goto out_shutdown_ports;  	} +	/* Handle any events that might be pending. */ +	tasklet_hi_schedule(&adapter->neq_tasklet);  	ret = 0;  	goto out; diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c index ba21f9c72a2..9bbf1a27594 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:  		adapter->flags |= IGB_FLAG_HAS_MSI;  out:  	/* Notify the stack of the (possibly) reduced queue counts. */ +	rtnl_lock();  	netif_set_real_num_tx_queues(adapter->netdev, adapter->num_tx_queues); -	return netif_set_real_num_rx_queues(adapter->netdev, -					    adapter->num_rx_queues); +	err = netif_set_real_num_rx_queues(adapter->netdev, +		adapter->num_rx_queues); +	rtnl_unlock(); +	return err;  }  /** @@ -6706,18 +6709,7 @@ static int igb_resume(struct device *dev)  	pci_enable_wake(pdev, PCI_D3hot, 0);  	pci_enable_wake(pdev, PCI_D3cold, 0); -	if (!rtnl_is_locked()) { -		/* -		 * shut up ASSERT_RTNL() warning in -		 * netif_set_real_num_tx/rx_queues. -		 */ -		rtnl_lock(); -		err = igb_init_interrupt_scheme(adapter); -		rtnl_unlock(); -	} else { -		err = igb_init_interrupt_scheme(adapter); -	} -	if (err) { +	if (igb_init_interrupt_scheme(adapter)) {  		dev_err(&pdev->dev, "Unable to allocate memory for queues\n");  		return -ENOMEM;  	} diff --git a/drivers/net/ethernet/micrel/ks8851.c b/drivers/net/ethernet/micrel/ks8851.c index f8dda009d3c..5e313e9a252 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)  	netif_dbg(ks, intr, ks->netdev,  		  "%s: status 0x%04x\n", __func__, status); -	if (status & IRQ_LCI) { -		/* should do something about checking link status */ +	if (status & IRQ_LCI)  		handled |= IRQ_LCI; -	}  	if (status & IRQ_LDI) {  		u16 pmecr = ks8851_rdreg16(ks, KS_PMECR); @@ -684,6 +682,9 @@ static void ks8851_irq_work(struct work_struct *work)  	mutex_unlock(&ks->lock); +	if (status & IRQ_LCI) +		mii_check_link(&ks->mii); +  	if (status & IRQ_TXI)  		netif_wake_queue(ks->netdev); 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 9f3dbc4fead..b07311eaa69 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 {  /**   * struct pch_gbe_adapter - board specific private data structure   * @stats_lock:	Spinlock structure for status - * @tx_queue_lock:	Spinlock structure for transmit   * @ethtool_lock:	Spinlock structure for ethtool   * @irq_sem:		Semaphore for interrupt   * @netdev:		Pointer of network device structure @@ -609,7 +608,6 @@ struct pch_gbe_hw_stats {  struct pch_gbe_adapter {  	spinlock_t stats_lock; -	spinlock_t tx_queue_lock;  	spinlock_t ethtool_lock;  	atomic_t irq_sem;  	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 9dc7e502367..3787c64ee71 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)   */  static int pch_gbe_alloc_queues(struct pch_gbe_adapter *adapter)  { -	int size; - -	size = (int)sizeof(struct pch_gbe_tx_ring); -	adapter->tx_ring = kzalloc(size, GFP_KERNEL); +	adapter->tx_ring = kzalloc(sizeof(*adapter->tx_ring), GFP_KERNEL);  	if (!adapter->tx_ring)  		return -ENOMEM; -	size = (int)sizeof(struct pch_gbe_rx_ring); -	adapter->rx_ring = kzalloc(size, GFP_KERNEL); + +	adapter->rx_ring = kzalloc(sizeof(*adapter->rx_ring), GFP_KERNEL);  	if (!adapter->rx_ring) {  		kfree(adapter->tx_ring);  		return -ENOMEM; @@ -1169,7 +1166,6 @@ static void pch_gbe_tx_queue(struct pch_gbe_adapter *adapter,  	struct sk_buff *tmp_skb;  	unsigned int frame_ctrl;  	unsigned int ring_num; -	unsigned long flags;  	/*-- Set frame control --*/  	frame_ctrl = 0; @@ -1216,14 +1212,14 @@ static void pch_gbe_tx_queue(struct pch_gbe_adapter *adapter,  			}  		}  	} -	spin_lock_irqsave(&tx_ring->tx_lock, flags); +  	ring_num = tx_ring->next_to_use;  	if (unlikely((ring_num + 1) == tx_ring->count))  		tx_ring->next_to_use = 0;  	else  		tx_ring->next_to_use = ring_num + 1; -	spin_unlock_irqrestore(&tx_ring->tx_lock, flags); +  	buffer_info = &tx_ring->buffer_info[ring_num];  	tmp_skb = buffer_info->skb; @@ -1525,7 +1521,7 @@ pch_gbe_alloc_rx_buffers_pool(struct pch_gbe_adapter *adapter,  						&rx_ring->rx_buff_pool_logic,  						GFP_KERNEL);  	if (!rx_ring->rx_buff_pool) { -		pr_err("Unable to allocate memory for the receive poll buffer\n"); +		pr_err("Unable to allocate memory for the receive pool buffer\n");  		return -ENOMEM;  	}  	memset(rx_ring->rx_buff_pool, 0, size); @@ -1644,15 +1640,17 @@ pch_gbe_clean_tx(struct pch_gbe_adapter *adapter,  	pr_debug("called pch_gbe_unmap_and_free_tx_resource() %d count\n",  		 cleaned_count);  	/* Recover from running out of Tx resources in xmit_frame */ +	spin_lock(&tx_ring->tx_lock);  	if (unlikely(cleaned && (netif_queue_stopped(adapter->netdev)))) {  		netif_wake_queue(adapter->netdev);  		adapter->stats.tx_restart_count++;  		pr_debug("Tx wake queue\n");  	} -	spin_lock(&adapter->tx_queue_lock); +  	tx_ring->next_to_clean = i; -	spin_unlock(&adapter->tx_queue_lock); +  	pr_debug("next_to_clean : %d\n", tx_ring->next_to_clean); +	spin_unlock(&tx_ring->tx_lock);  	return cleaned;  } @@ -2043,7 +2041,6 @@ static int pch_gbe_sw_init(struct pch_gbe_adapter *adapter)  		return -ENOMEM;  	}  	spin_lock_init(&adapter->hw.miim_lock); -	spin_lock_init(&adapter->tx_queue_lock);  	spin_lock_init(&adapter->stats_lock);  	spin_lock_init(&adapter->ethtool_lock);  	atomic_set(&adapter->irq_sem, 0); @@ -2148,10 +2145,10 @@ static int pch_gbe_xmit_frame(struct sk_buff *skb, struct net_device *netdev)  			 tx_ring->next_to_use, tx_ring->next_to_clean);  		return NETDEV_TX_BUSY;  	} -	spin_unlock_irqrestore(&tx_ring->tx_lock, flags);  	/* CRC,ITAG no support */  	pch_gbe_tx_queue(adapter, tx_ring, skb); +	spin_unlock_irqrestore(&tx_ring->tx_lock, flags);  	return NETDEV_TX_OK;  } diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c index 00628d84342..4f74b9762c2 100644 --- a/drivers/net/ethernet/realtek/r8169.c +++ b/drivers/net/ethernet/realtek/r8169.c @@ -63,8 +63,12 @@  #define R8169_MSG_DEFAULT \  	(NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_IFUP | NETIF_MSG_IFDOWN) -#define TX_BUFFS_AVAIL(tp) \ -	(tp->dirty_tx + NUM_TX_DESC - tp->cur_tx - 1) +#define TX_SLOTS_AVAIL(tp) \ +	(tp->dirty_tx + NUM_TX_DESC - tp->cur_tx) + +/* A skbuff with nr_frags needs nr_frags+1 entries in the tx queue */ +#define TX_FRAGS_READY_FOR(tp,nr_frags) \ +	(TX_SLOTS_AVAIL(tp) >= (nr_frags + 1))  /* Maximum number of multicast addresses to filter (vs. Rx-all-multicast).     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,  	u32 opts[2];  	int frags; -	if (unlikely(TX_BUFFS_AVAIL(tp) < skb_shinfo(skb)->nr_frags)) { +	if (unlikely(!TX_FRAGS_READY_FOR(tp, skb_shinfo(skb)->nr_frags))) {  		netif_err(tp, drv, dev, "BUG! Tx Ring full when queue awake!\n");  		goto err_stop_0;  	} @@ -5548,7 +5552,7 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,  	mmiowb(); -	if (TX_BUFFS_AVAIL(tp) < MAX_SKB_FRAGS) { +	if (!TX_FRAGS_READY_FOR(tp, MAX_SKB_FRAGS)) {  		/* Avoid wrongly optimistic queue wake-up: rtl_tx thread must  		 * not miss a ring update when it notices a stopped queue.  		 */ @@ -5562,7 +5566,7 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,  		 * can't.  		 */  		smp_mb(); -		if (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS) +		if (TX_FRAGS_READY_FOR(tp, MAX_SKB_FRAGS))  			netif_wake_queue(dev);  	} @@ -5685,7 +5689,7 @@ static void rtl_tx(struct net_device *dev, struct rtl8169_private *tp)  		 */  		smp_mb();  		if (netif_queue_stopped(dev) && -		    (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)) { +		    TX_FRAGS_READY_FOR(tp, MAX_SKB_FRAGS)) {  			netif_wake_queue(dev);  		}  		/* diff --git a/drivers/net/ethernet/sfc/efx.c b/drivers/net/ethernet/sfc/efx.c index 8253d2155fe..b95f2e1b33f 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)  	}  	/* RSS might be usable on VFs even if it is disabled on the PF */ -	efx->rss_spread = (efx->n_rx_channels > 1 ? +	efx->rss_spread = ((efx->n_rx_channels > 1 || !efx_sriov_wanted(efx)) ?  			   efx->n_rx_channels : efx_vf_size(efx));  	return 0; diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c index ebacec1944e..66a9bfe7b1c 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)  xmit_world:  	skb->ip_summed = ip_summed; -	skb_set_dev(skb, vlan->lowerdev); +	skb->dev = vlan->lowerdev;  	return dev_queue_xmit(skb);  } diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c index 163559c1698..2ee56de7b0c 100644 --- a/drivers/net/macvtap.c +++ b/drivers/net/macvtap.c @@ -1,5 +1,6 @@  #include <linux/etherdevice.h>  #include <linux/if_macvlan.h> +#include <linux/if_vlan.h>  #include <linux/interrupt.h>  #include <linux/nsproxy.h>  #include <linux/compat.h> @@ -782,6 +783,8 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q,  	struct macvlan_dev *vlan;  	int ret;  	int vnet_hdr_len = 0; +	int vlan_offset = 0; +	int copied;  	if (q->flags & IFF_VNET_HDR) {  		struct virtio_net_hdr vnet_hdr; @@ -796,18 +799,48 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q,  		if (memcpy_toiovecend(iv, (void *)&vnet_hdr, 0, sizeof(vnet_hdr)))  			return -EFAULT;  	} +	copied = vnet_hdr_len; -	len = min_t(int, skb->len, len); +	if (!vlan_tx_tag_present(skb)) +		len = min_t(int, skb->len, len); +	else { +		int copy; +		struct { +			__be16 h_vlan_proto; +			__be16 h_vlan_TCI; +		} veth; +		veth.h_vlan_proto = htons(ETH_P_8021Q); +		veth.h_vlan_TCI = htons(vlan_tx_tag_get(skb)); -	ret = skb_copy_datagram_const_iovec(skb, 0, iv, vnet_hdr_len, len); +		vlan_offset = offsetof(struct vlan_ethhdr, h_vlan_proto); +		len = min_t(int, skb->len + VLAN_HLEN, len); +		copy = min_t(int, vlan_offset, len); +		ret = skb_copy_datagram_const_iovec(skb, 0, iv, copied, copy); +		len -= copy; +		copied += copy; +		if (ret || !len) +			goto done; + +		copy = min_t(int, sizeof(veth), len); +		ret = memcpy_toiovecend(iv, (void *)&veth, copied, copy); +		len -= copy; +		copied += copy; +		if (ret || !len) +			goto done; +	} + +	ret = skb_copy_datagram_const_iovec(skb, vlan_offset, iv, copied, len); +	copied += len; + +done:  	rcu_read_lock_bh();  	vlan = rcu_dereference_bh(q->vlan);  	if (vlan) -		macvlan_count_rx(vlan, len, ret == 0, 0); +		macvlan_count_rx(vlan, copied - vnet_hdr_len, ret == 0, 0);  	rcu_read_unlock_bh(); -	return ret ? ret : (len + vnet_hdr_len); +	return ret ? ret : copied;  }  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 00880edba04..425e201f597 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 = {  /*-------------------------------------------------------------------------*/  #define HUAWEI_VENDOR_ID	0x12D1 +#define NOVATEL_VENDOR_ID	0x1410  static const struct usb_device_id	products [] = {  /* @@ -602,6 +603,21 @@ static const struct usb_device_id	products [] = {   * because of bugs/quirks in a given product (like Zaurus, above).   */  { +	/* Novatel USB551L */ +	/* This match must come *before* the generic CDC-ETHER match so that +	 * we get FLAG_WWAN set on the device, since it's descriptors are +	 * generic CDC-ETHER. +	 */ +	.match_flags    =   USB_DEVICE_ID_MATCH_VENDOR +		 | USB_DEVICE_ID_MATCH_PRODUCT +		 | USB_DEVICE_ID_MATCH_INT_INFO, +	.idVendor               = NOVATEL_VENDOR_ID, +	.idProduct		= 0xB001, +	.bInterfaceClass	= USB_CLASS_COMM, +	.bInterfaceSubClass	= USB_CDC_SUBCLASS_ETHERNET, +	.bInterfaceProtocol	= USB_CDC_PROTO_NONE, +	.driver_info = (unsigned long)&wwan_info, +}, {  	USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ETHERNET,  			USB_CDC_PROTO_NONE),  	.driver_info = (unsigned long) &cdc_info, diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index 80b837c88f0..9f58330f131 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)  }  EXPORT_SYMBOL_GPL(usbnet_change_mtu); +/* The caller must hold list->lock */ +static void __usbnet_queue_skb(struct sk_buff_head *list, +			struct sk_buff *newsk, enum skb_state state) +{ +	struct skb_data *entry = (struct skb_data *) newsk->cb; + +	__skb_queue_tail(list, newsk); +	entry->state = state; +} +  /*-------------------------------------------------------------------------*/  /* some LK 2.4 HCDs oopsed if we freed or resubmitted urbs from   * completion callbacks.  2.5 should have fixed those bugs...   */ -static void defer_bh(struct usbnet *dev, struct sk_buff *skb, struct sk_buff_head *list) +static enum skb_state defer_bh(struct usbnet *dev, struct sk_buff *skb, +		struct sk_buff_head *list, enum skb_state state)  {  	unsigned long		flags; +	enum skb_state 		old_state; +	struct skb_data *entry = (struct skb_data *) skb->cb;  	spin_lock_irqsave(&list->lock, flags); +	old_state = entry->state; +	entry->state = state;  	__skb_unlink(skb, list);  	spin_unlock(&list->lock);  	spin_lock(&dev->done.lock); @@ -300,6 +315,7 @@ static void defer_bh(struct usbnet *dev, struct sk_buff *skb, struct sk_buff_hea  	if (dev->done.qlen == 1)  		tasklet_schedule(&dev->bh);  	spin_unlock_irqrestore(&dev->done.lock, flags); +	return old_state;  }  /* 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)  	entry = (struct skb_data *) skb->cb;  	entry->urb = urb;  	entry->dev = dev; -	entry->state = rx_start;  	entry->length = 0;  	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)  			tasklet_schedule (&dev->bh);  			break;  		case 0: -			__skb_queue_tail (&dev->rxq, skb); +			__usbnet_queue_skb(&dev->rxq, skb, rx_start);  		}  	} else {  		netif_dbg(dev, ifdown, dev->net, "rx: stopped\n"); @@ -423,16 +438,17 @@ static void rx_complete (struct urb *urb)  	struct skb_data		*entry = (struct skb_data *) skb->cb;  	struct usbnet		*dev = entry->dev;  	int			urb_status = urb->status; +	enum skb_state		state;  	skb_put (skb, urb->actual_length); -	entry->state = rx_done; +	state = rx_done;  	entry->urb = NULL;  	switch (urb_status) {  	/* success */  	case 0:  		if (skb->len < dev->net->hard_header_len) { -			entry->state = rx_cleanup; +			state = rx_cleanup;  			dev->net->stats.rx_errors++;  			dev->net->stats.rx_length_errors++;  			netif_dbg(dev, rx_err, dev->net, @@ -471,7 +487,7 @@ static void rx_complete (struct urb *urb)  				  "rx throttle %d\n", urb_status);  		}  block: -		entry->state = rx_cleanup; +		state = rx_cleanup;  		entry->urb = urb;  		urb = NULL;  		break; @@ -482,17 +498,18 @@ block:  		// FALLTHROUGH  	default: -		entry->state = rx_cleanup; +		state = rx_cleanup;  		dev->net->stats.rx_errors++;  		netif_dbg(dev, rx_err, dev->net, "rx status %d\n", urb_status);  		break;  	} -	defer_bh(dev, skb, &dev->rxq); +	state = defer_bh(dev, skb, &dev->rxq, state);  	if (urb) {  		if (netif_running (dev->net) && -		    !test_bit (EVENT_RX_HALT, &dev->flags)) { +		    !test_bit (EVENT_RX_HALT, &dev->flags) && +		    state != unlink_start) {  			rx_submit (dev, urb, GFP_ATOMIC);  			usb_mark_last_busy(dev->udev);  			return; @@ -579,16 +596,23 @@ EXPORT_SYMBOL_GPL(usbnet_purge_paused_rxq);  static int unlink_urbs (struct usbnet *dev, struct sk_buff_head *q)  {  	unsigned long		flags; -	struct sk_buff		*skb, *skbnext; +	struct sk_buff		*skb;  	int			count = 0;  	spin_lock_irqsave (&q->lock, flags); -	skb_queue_walk_safe(q, skb, skbnext) { +	while (!skb_queue_empty(q)) {  		struct skb_data		*entry;  		struct urb		*urb;  		int			retval; -		entry = (struct skb_data *) skb->cb; +		skb_queue_walk(q, skb) { +			entry = (struct skb_data *) skb->cb; +			if (entry->state != unlink_start) +				goto found; +		} +		break; +found: +		entry->state = unlink_start;  		urb = entry->urb;  		/* @@ -1040,8 +1064,7 @@ static void tx_complete (struct urb *urb)  	}  	usb_autopm_put_interface_async(dev->intf); -	entry->state = tx_done; -	defer_bh(dev, skb, &dev->txq); +	(void) defer_bh(dev, skb, &dev->txq, tx_done);  }  /*-------------------------------------------------------------------------*/ @@ -1097,7 +1120,6 @@ netdev_tx_t usbnet_start_xmit (struct sk_buff *skb,  	entry = (struct skb_data *) skb->cb;  	entry->urb = urb;  	entry->dev = dev; -	entry->state = tx_start;  	entry->length = length;  	usb_fill_bulk_urb (urb, dev->udev, dev->out, @@ -1156,7 +1178,7 @@ netdev_tx_t usbnet_start_xmit (struct sk_buff *skb,  		break;  	case 0:  		net->trans_start = jiffies; -		__skb_queue_tail (&dev->txq, skb); +		__usbnet_queue_skb(&dev->txq, skb, tx_start);  		if (dev->txq.qlen >= TX_QLEN (dev))  			netif_stop_queue (net);  	} diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c index f7868c0d79e..2062ea1d7c8 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,  	/*like read eeprom and so on */  	rtlpriv->cfg->ops->read_eeprom_info(hw); -	if (rtlpriv->cfg->ops->init_sw_vars(hw)) { -		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Can't init_sw_vars\n"); -		err = -ENODEV; -		goto fail3; -	} - -	rtlpriv->cfg->ops->init_sw_leds(hw); -  	/*aspm */  	rtl_pci_init_aspm(hw); @@ -1879,6 +1871,14 @@ int __devinit rtl_pci_probe(struct pci_dev *pdev,  		goto fail3;  	} +	if (rtlpriv->cfg->ops->init_sw_vars(hw)) { +		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Can't init_sw_vars\n"); +		err = -ENODEV; +		goto fail3; +	} + +	rtlpriv->cfg->ops->init_sw_leds(hw); +  	err = sysfs_create_group(&pdev->dev.kobj, &rtl_attribute_group);  	if (err) {  		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, diff --git a/drivers/net/wireless/rtlwifi/usb.c b/drivers/net/wireless/rtlwifi/usb.c index d04dbda13f5..a6049d7d51b 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,  	rtlpriv->cfg->ops->read_chip_version(hw);  	/*like read eeprom and so on */  	rtlpriv->cfg->ops->read_eeprom_info(hw); -	if (rtlpriv->cfg->ops->init_sw_vars(hw)) { -		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Can't init_sw_vars\n"); -		goto error_out; -	} -	rtlpriv->cfg->ops->init_sw_leds(hw);  	err = _rtl_usb_init(hw);  	if (err)  		goto error_out; @@ -987,6 +982,11 @@ int __devinit rtl_usb_probe(struct usb_interface *intf,  			 "Can't allocate sw for mac80211\n");  		goto error_out;  	} +	if (rtlpriv->cfg->ops->init_sw_vars(hw)) { +		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Can't init_sw_vars\n"); +		goto error_out; +	} +	rtlpriv->cfg->ops->init_sw_leds(hw);  	return 0;  error_out: diff --git a/drivers/parisc/sba_iommu.c b/drivers/parisc/sba_iommu.c index 8644d5372e7..42cfcd9eb9a 100644 --- a/drivers/parisc/sba_iommu.c +++ b/drivers/parisc/sba_iommu.c @@ -44,6 +44,7 @@  #include <asm/ropes.h>  #include <asm/mckinley.h>	/* for proc_mckinley_root */  #include <asm/runway.h>		/* for proc_runway_root */ +#include <asm/page.h>		/* for PAGE0 */  #include <asm/pdc.h>		/* for PDC_MODEL_* */  #include <asm/pdcpat.h>		/* for is_pdc_pat() */  #include <asm/parisc-device.h> diff --git a/drivers/pci/pci-acpi.c b/drivers/pci/pci-acpi.c index 0f150f271c2..1929c0c63b7 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)  		return PCI_D1;  	case ACPI_STATE_D2:  		return PCI_D2; -	case ACPI_STATE_D3: +	case ACPI_STATE_D3_HOT:  		return PCI_D3hot;  	case ACPI_STATE_D3_COLD:  		return PCI_D3cold; @@ -223,7 +223,7 @@ static int acpi_pci_set_power_state(struct pci_dev *dev, pci_power_t state)  		[PCI_D0] = ACPI_STATE_D0,  		[PCI_D1] = ACPI_STATE_D1,  		[PCI_D2] = ACPI_STATE_D2, -		[PCI_D3hot] = ACPI_STATE_D3, +		[PCI_D3hot] = ACPI_STATE_D3_HOT,  		[PCI_D3cold] = ACPI_STATE_D3  	};  	int error = -EINVAL; diff --git a/drivers/platform/x86/intel_mid_powerbtn.c b/drivers/platform/x86/intel_mid_powerbtn.c index 0a3594c7e91..bcbad8452a6 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)  	input_set_capability(input, EV_KEY, KEY_POWER); -	error = request_threaded_irq(irq, NULL, mfld_pb_isr, 0, +	error = request_threaded_irq(irq, NULL, mfld_pb_isr, IRQF_NO_SUSPEND,  			DRIVER_NAME, input);  	if (error) {  		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 08c331130d8..3a9c17eced1 100644 --- a/drivers/ptp/ptp_pch.c +++ b/drivers/ptp/ptp_pch.c @@ -30,6 +30,7 @@  #include <linux/module.h>  #include <linux/pci.h>  #include <linux/ptp_clock_kernel.h> +#include <linux/slab.h>  #define STATION_ADDR_LEN	20  #define PCI_DEVICE_ID_PCH_1588	0x8819 diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index e70dd382a00..046fb1bd861 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c @@ -1431,7 +1431,10 @@ void devm_regulator_put(struct regulator *regulator)  	rc = devres_destroy(regulator->dev, devm_regulator_release,  			    devm_regulator_match, regulator); -	WARN_ON(rc); +	if (rc == 0) +		regulator_put(regulator); +	else +		WARN_ON(rc);  }  EXPORT_SYMBOL_GPL(devm_regulator_put); diff --git a/drivers/regulator/max8997.c b/drivers/regulator/max8997.c index 96579296f04..17a58c56eeb 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,  		}  		new_val++; -	} while (desc->min + desc->step + new_val <= desc->max); +	} while (desc->min + desc->step * new_val <= desc->max);  	new_idx = tmp_idx;  	new_val = tmp_val; diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c index ee15c68fb51..e756a0df366 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)  {  	struct rproc *rproc = rvdev->rproc; -	for (i--; i > 0; i--) { +	for (i--; i >= 0; i--) {  		struct rproc_vring *rvring = &rvdev->vring[i];  		int size = PAGE_ALIGN(vring_size(rvring->len, rvring->align)); diff --git a/drivers/rtc/rtc-mpc5121.c b/drivers/rtc/rtc-mpc5121.c index 42f5f829b3e..029e421baae 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)  						&mpc5200_rtc_ops, THIS_MODULE);  	} -	rtc->rtc->uie_unsupported = 1; -  	if (IS_ERR(rtc->rtc)) {  		err = PTR_ERR(rtc->rtc);  		goto out_free_irq;  	} +	rtc->rtc->uie_unsupported = 1;  	return 0; diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c index 351dc0b86fa..a3a056a9db6 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,  	if (!shost->shost_gendev.parent)  		shost->shost_gendev.parent = dev ? dev : &platform_bus; +	if (!dma_dev) +		dma_dev = shost->shost_gendev.parent; +  	shost->dma_dev = dma_dev;  	error = device_add(&shost->shost_gendev); diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c index f74cc0602f3..bc3cc6d9111 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)  	struct qla_hw_data *ha = vha->hw;  	int rval = 0; +	if (ha->flags.isp82xx_reset_hdlr_active) +		return -EBUSY; +  	rval = qla2x00_optrom_setup(bsg_job, vha, 0);  	if (rval)  		return rval; diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c index 897731b93df..62324a1d557 100644 --- a/drivers/scsi/qla2xxx/qla_dbg.c +++ b/drivers/scsi/qla2xxx/qla_dbg.c @@ -15,7 +15,7 @@   * | Mailbox commands             |       0x113e       | 0x112c-0x112e  |   * |                              |                    | 0x113a         |   * | Device Discovery             |       0x2086       | 0x2020-0x2022  | - * | Queue Command and IO tracing |       0x302f       | 0x3006,0x3008  | + * | Queue Command and IO tracing |       0x3030       | 0x3006,0x3008  |   * |                              |                    | 0x302d-0x302e  |   * | DPC Thread                   |       0x401c       |		|   * | Async Events                 |       0x505d       | 0x502b-0x502f  | diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c index f79844ce712..ce42288049b 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)  				res = DID_ERROR << 16;  				break;  			} -		} else { +		} else if (lscsi_status != SAM_STAT_TASK_SET_FULL && +			    lscsi_status != SAM_STAT_BUSY) { +			/* +			 * scsi status of task set and busy are considered to be +			 * task not completed. +			 */ +  			ql_dbg(ql_dbg_io, fcport->vha, 0x301f,  			    "Dropped frame(s) detected (0x%x " -			    "of 0x%x bytes).\n", resid, scsi_bufflen(cp)); +			    "of 0x%x bytes).\n", resid, +			    scsi_bufflen(cp));  			res = DID_ERROR << 16 | lscsi_status;  			goto check_scsi_status; +		} else { +			ql_dbg(ql_dbg_io, fcport->vha, 0x3030, +			    "scsi_status: 0x%x, lscsi_status: 0x%x\n", +			    scsi_status, lscsi_status);  		}  		res = DID_OK << 16 | lscsi_status; diff --git a/drivers/scsi/qla2xxx/qla_nx.c b/drivers/scsi/qla2xxx/qla_nx.c index f0528539bbb..de722a93343 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)  		ql_log(ql_log_info, vha, 0x00b7,  		    "HW State: COLD/RE-INIT.\n");  		qla82xx_wr_32(ha, QLA82XX_CRB_DEV_STATE, QLA82XX_DEV_COLD); +		qla82xx_set_rst_ready(ha);  		if (ql2xmdenable) {  			if (qla82xx_md_collect(vha))  				ql_log(ql_log_warn, vha, 0xb02c, diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index a2f999273a5..7db803377c6 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)  						continue;  					/* Attempt a retry. */  					status = 1; -				} else +				} else {  					status = qla2x00_fabric_login(vha,  					    fcport, &next_loopid); +					if (status ==  QLA_SUCCESS) { +						int status2; +						uint8_t opts; + +						opts = 0; +						if (fcport->flags & +						    FCF_FCP2_DEVICE) +							opts |= BIT_1; +							status2 = +							    qla2x00_get_port_database( +								vha, fcport, +								opts); +						if (status2 != QLA_SUCCESS) +							status = 1; +					} +				}  			} else  				status = qla2x00_local_device_login(vha,  								fcport); diff --git a/drivers/scsi/qla2xxx/qla_sup.c b/drivers/scsi/qla2xxx/qla_sup.c index 3c13c0a6be6..a683e766d1a 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)  	    !IS_CNA_CAPABLE(ha) && !IS_QLA2031(ha))  		return; +	if (ha->flags.isp82xx_reset_hdlr_active) +		return; +  	ha->isp_ops->read_optrom(vha, (uint8_t *)&hdr,  	    ha->flt_region_npiv_conf << 2, sizeof(struct qla_npiv_header));  	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 29d780c3804..f5fdb16bec9 100644 --- a/drivers/scsi/qla2xxx/qla_version.h +++ b/drivers/scsi/qla2xxx/qla_version.h @@ -7,9 +7,9 @@  /*   * Driver version   */ -#define QLA2XXX_VERSION      "8.03.07.13-k" +#define QLA2XXX_VERSION      "8.04.00.03-k"  #define QLA_DRIVER_MAJOR_VER	8 -#define QLA_DRIVER_MINOR_VER	3 -#define QLA_DRIVER_PATCH_VER	7 +#define QLA_DRIVER_MINOR_VER	4 +#define QLA_DRIVER_PATCH_VER	0  #define QLA_DRIVER_BETA_VER	3 diff --git a/drivers/scsi/virtio_scsi.c b/drivers/scsi/virtio_scsi.c index efccd72c4a3..1b384311726 100644 --- a/drivers/scsi/virtio_scsi.c +++ b/drivers/scsi/virtio_scsi.c @@ -175,7 +175,8 @@ static void virtscsi_complete_free(void *buf)  	if (cmd->comp)  		complete_all(cmd->comp); -	mempool_free(cmd, virtscsi_cmd_pool); +	else +		mempool_free(cmd, virtscsi_cmd_pool);  }  static void virtscsi_ctrl_done(struct virtqueue *vq) @@ -311,21 +312,22 @@ out:  static int virtscsi_tmf(struct virtio_scsi *vscsi, struct virtio_scsi_cmd *cmd)  {  	DECLARE_COMPLETION_ONSTACK(comp); -	int ret; +	int ret = FAILED;  	cmd->comp = ∁ -	ret = virtscsi_kick_cmd(vscsi, vscsi->ctrl_vq, cmd, -			       sizeof cmd->req.tmf, sizeof cmd->resp.tmf, -			       GFP_NOIO); -	if (ret < 0) -		return FAILED; +	if (virtscsi_kick_cmd(vscsi, vscsi->ctrl_vq, cmd, +			      sizeof cmd->req.tmf, sizeof cmd->resp.tmf, +			      GFP_NOIO) < 0) +		goto out;  	wait_for_completion(&comp); -	if (cmd->resp.tmf.response != VIRTIO_SCSI_S_OK && -	    cmd->resp.tmf.response != VIRTIO_SCSI_S_FUNCTION_SUCCEEDED) -		return FAILED; +	if (cmd->resp.tmf.response == VIRTIO_SCSI_S_OK || +	    cmd->resp.tmf.response == VIRTIO_SCSI_S_FUNCTION_SUCCEEDED) +		ret = SUCCESS; -	return SUCCESS; +out: +	mempool_free(cmd, virtscsi_cmd_pool); +	return ret;  }  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 70c3ffb981e..e320ec24aa1 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(  	int i;  	struct se_dev_entry *deve;  	struct se_lun *lun; -	struct se_lun_acl *acl, *acl_tmp;  	spin_lock_irq(&nacl->device_list_lock);  	for (i = 0; i < TRANSPORT_MAX_LUNS_PER_TPG; i++) { @@ -81,28 +80,7 @@ static void core_clear_initiator_node_from_tpg(  		core_update_device_list_for_node(lun, NULL, deve->mapped_lun,  			TRANSPORT_LUNFLAGS_NO_ACCESS, nacl, tpg, 0); -		spin_lock(&lun->lun_acl_lock); -		list_for_each_entry_safe(acl, acl_tmp, -					&lun->lun_acl_list, lacl_list) { -			if (!strcmp(acl->initiatorname, nacl->initiatorname) && -			    (acl->mapped_lun == deve->mapped_lun)) -				break; -		} - -		if (!acl) { -			pr_err("Unable to locate struct se_lun_acl for %s," -				" mapped_lun: %u\n", nacl->initiatorname, -				deve->mapped_lun); -			spin_unlock(&lun->lun_acl_lock); -			spin_lock_irq(&nacl->device_list_lock); -			continue; -		} - -		list_del(&acl->lacl_list); -		spin_unlock(&lun->lun_acl_lock); -  		spin_lock_irq(&nacl->device_list_lock); -		kfree(acl);  	}  	spin_unlock_irq(&nacl->device_list_lock);  } diff --git a/drivers/tty/vt/keyboard.c b/drivers/tty/vt/keyboard.c index 29ca20dbd33..3b0c4e32ed7 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)  		kbd->default_ledflagstate = ((arg >> 4) & 7);  		set_leds();                  spin_unlock_irqrestore(&kbd_event_lock, flags); -		break; +		return 0;  	/* the ioctls below only set the lights, not the functions */  	/* for those, see KDGKBLED and KDSKBLED above */ diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c index 853db7a08a2..f82a7394756 100644 --- a/drivers/vhost/net.c +++ b/drivers/vhost/net.c @@ -24,6 +24,7 @@  #include <linux/if_arp.h>  #include <linux/if_tun.h>  #include <linux/if_macvlan.h> +#include <linux/if_vlan.h>  #include <net/sock.h> @@ -286,8 +287,12 @@ static int peek_head_len(struct sock *sk)  	spin_lock_irqsave(&sk->sk_receive_queue.lock, flags);  	head = skb_peek(&sk->sk_receive_queue); -	if (likely(head)) +	if (likely(head)) {  		len = head->len; +		if (vlan_tx_tag_present(head)) +			len += VLAN_HLEN; +	} +  	spin_unlock_irqrestore(&sk->sk_receive_queue.lock, flags);  	return len;  } diff --git a/drivers/video/console/sticore.c b/drivers/video/console/sticore.c index 6468a297e34..39571f9e016 100644 --- a/drivers/video/console/sticore.c +++ b/drivers/video/console/sticore.c @@ -22,7 +22,9 @@  #include <linux/font.h>  #include <asm/hardware.h> +#include <asm/page.h>  #include <asm/parisc-device.h> +#include <asm/pdc.h>  #include <asm/cacheflush.h>  #include <asm/grfioctl.h> diff --git a/drivers/video/uvesafb.c b/drivers/video/uvesafb.c index 26e83d7fdd6..b0e2a4261af 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  	struct uvesafb_task *utask;  	struct uvesafb_ktask *task; -	if (!cap_raised(current_cap(), CAP_SYS_ADMIN)) +	if (!capable(CAP_SYS_ADMIN))  		return;  	if (msg->seq >= UVESAFB_TASKS_MAX) diff --git a/drivers/video/xen-fbfront.c b/drivers/video/xen-fbfront.c index cb4529c40d7..b7f5173ff9e 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,  	struct fb_info *fb_info;  	int fb_size;  	int val; -	int ret; +	int ret = 0;  	info = kzalloc(sizeof(*info), GFP_KERNEL);  	if (info == NULL) { @@ -458,26 +458,31 @@ static int __devinit xenfb_probe(struct xenbus_device *dev,  	xenfb_init_shared_page(info, fb_info);  	ret = xenfb_connect_backend(dev, info); -	if (ret < 0) -		goto error; +	if (ret < 0) { +		xenbus_dev_fatal(dev, ret, "xenfb_connect_backend"); +		goto error_fb; +	}  	ret = register_framebuffer(fb_info);  	if (ret) { -		fb_deferred_io_cleanup(fb_info); -		fb_dealloc_cmap(&fb_info->cmap); -		framebuffer_release(fb_info);  		xenbus_dev_fatal(dev, ret, "register_framebuffer"); -		goto error; +		goto error_fb;  	}  	info->fb_info = fb_info;  	xenfb_make_preferred_console();  	return 0; - error_nomem: -	ret = -ENOMEM; -	xenbus_dev_fatal(dev, ret, "allocating device memory"); - error: +error_fb: +	fb_deferred_io_cleanup(fb_info); +	fb_dealloc_cmap(&fb_info->cmap); +	framebuffer_release(fb_info); +error_nomem: +	if (!ret) { +		ret = -ENOMEM; +		xenbus_dev_fatal(dev, ret, "allocating device memory"); +	} +error:  	xenfb_remove(dev);  	return ret;  } diff --git a/drivers/xen/Kconfig b/drivers/xen/Kconfig index 94243136f6b..ea20c51d24c 100644 --- a/drivers/xen/Kconfig +++ b/drivers/xen/Kconfig @@ -183,15 +183,17 @@ config XEN_ACPI_PROCESSOR  	depends on XEN && X86 && ACPI_PROCESSOR && CPU_FREQ  	default m  	help -          This ACPI processor uploads Power Management information to the Xen hypervisor. +          This ACPI processor uploads Power Management information to the Xen +	  hypervisor. -	  To do that the driver parses the Power Management data and uploads said -	  information to the Xen hypervisor. Then the Xen hypervisor can select the -          proper Cx and Pxx states. It also registers itslef as the SMM so that -          other drivers (such as ACPI cpufreq scaling driver) will not load. +	  To do that the driver parses the Power Management data and uploads +	  said information to the Xen hypervisor. Then the Xen hypervisor can +	  select the proper Cx and Pxx states. It also registers itslef as the +	  SMM so that other drivers (such as ACPI cpufreq scaling driver) will +	  not load. -          To compile this driver as a module, choose M here: the -          module will be called xen_acpi_processor  If you do not know what to choose, -          select M here. If the CPUFREQ drivers are built in, select Y here. +          To compile this driver as a module, choose M here: the module will be +	  called xen_acpi_processor  If you do not know what to choose, select +	  M here. If the CPUFREQ drivers are built in, select Y here.  endmenu diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c index e801f226d7e..4106264fbc6 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)   */  static void add_root_to_dirty_list(struct btrfs_root *root)  { +	spin_lock(&root->fs_info->trans_lock);  	if (root->track_dirty && list_empty(&root->dirty_list)) {  		list_add(&root->dirty_list,  			 &root->fs_info->dirty_cowonly_roots);  	} +	spin_unlock(&root->fs_info->trans_lock);  }  /* @@ -723,7 +725,7 @@ int btrfs_realloc_node(struct btrfs_trans_handle *trans,  		cur = btrfs_find_tree_block(root, blocknr, blocksize);  		if (cur) -			uptodate = btrfs_buffer_uptodate(cur, gen); +			uptodate = btrfs_buffer_uptodate(cur, gen, 0);  		else  			uptodate = 0;  		if (!cur || !uptodate) { @@ -1358,7 +1360,12 @@ static noinline int reada_for_balance(struct btrfs_root *root,  		block1 = btrfs_node_blockptr(parent, slot - 1);  		gen = btrfs_node_ptr_generation(parent, slot - 1);  		eb = btrfs_find_tree_block(root, block1, blocksize); -		if (eb && btrfs_buffer_uptodate(eb, gen)) +		/* +		 * if we get -eagain from btrfs_buffer_uptodate, we +		 * don't want to return eagain here.  That will loop +		 * forever +		 */ +		if (eb && btrfs_buffer_uptodate(eb, gen, 1) != 0)  			block1 = 0;  		free_extent_buffer(eb);  	} @@ -1366,7 +1373,7 @@ static noinline int reada_for_balance(struct btrfs_root *root,  		block2 = btrfs_node_blockptr(parent, slot + 1);  		gen = btrfs_node_ptr_generation(parent, slot + 1);  		eb = btrfs_find_tree_block(root, block2, blocksize); -		if (eb && btrfs_buffer_uptodate(eb, gen)) +		if (eb && btrfs_buffer_uptodate(eb, gen, 1) != 0)  			block2 = 0;  		free_extent_buffer(eb);  	} @@ -1504,8 +1511,9 @@ read_block_for_search(struct btrfs_trans_handle *trans,  	tmp = btrfs_find_tree_block(root, blocknr, blocksize);  	if (tmp) { -		if (btrfs_buffer_uptodate(tmp, 0)) { -			if (btrfs_buffer_uptodate(tmp, gen)) { +		/* first we do an atomic uptodate check */ +		if (btrfs_buffer_uptodate(tmp, 0, 1) > 0) { +			if (btrfs_buffer_uptodate(tmp, gen, 1) > 0) {  				/*  				 * we found an up to date block without  				 * sleeping, return @@ -1523,8 +1531,9 @@ read_block_for_search(struct btrfs_trans_handle *trans,  			free_extent_buffer(tmp);  			btrfs_set_path_blocking(p); +			/* now we're allowed to do a blocking uptodate check */  			tmp = read_tree_block(root, blocknr, blocksize, gen); -			if (tmp && btrfs_buffer_uptodate(tmp, gen)) { +			if (tmp && btrfs_buffer_uptodate(tmp, gen, 0) > 0) {  				*eb_ret = tmp;  				return 0;  			} @@ -1559,7 +1568,7 @@ read_block_for_search(struct btrfs_trans_handle *trans,  		 * and give up so that our caller doesn't loop forever  		 * on our EAGAINs.  		 */ -		if (!btrfs_buffer_uptodate(tmp, 0)) +		if (!btrfs_buffer_uptodate(tmp, 0, 0))  			ret = -EIO;  		free_extent_buffer(tmp);  	} @@ -4043,7 +4052,7 @@ again:  			tmp = btrfs_find_tree_block(root, blockptr,  					    btrfs_level_size(root, level - 1)); -			if (tmp && btrfs_buffer_uptodate(tmp, gen)) { +			if (tmp && btrfs_buffer_uptodate(tmp, gen, 1) > 0) {  				free_extent_buffer(tmp);  				break;  			} @@ -4166,7 +4175,8 @@ next:  				struct extent_buffer *cur;  				cur = btrfs_find_tree_block(root, blockptr,  					    btrfs_level_size(root, level - 1)); -				if (!cur || !btrfs_buffer_uptodate(cur, gen)) { +				if (!cur || +				    btrfs_buffer_uptodate(cur, gen, 1) <= 0) {  					slot++;  					if (cur)  						free_extent_buffer(cur); diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index d0c969beaad..a7ffc88a7db 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,   * in the wrong place.   */  static int verify_parent_transid(struct extent_io_tree *io_tree, -				 struct extent_buffer *eb, u64 parent_transid) +				 struct extent_buffer *eb, u64 parent_transid, +				 int atomic)  {  	struct extent_state *cached_state = NULL;  	int ret; @@ -331,6 +332,9 @@ static int verify_parent_transid(struct extent_io_tree *io_tree,  	if (!parent_transid || btrfs_header_generation(eb) == parent_transid)  		return 0; +	if (atomic) +		return -EAGAIN; +  	lock_extent_bits(io_tree, eb->start, eb->start + eb->len - 1,  			 0, &cached_state);  	if (extent_buffer_uptodate(eb) && @@ -372,7 +376,8 @@ static int btree_read_extent_buffer_pages(struct btrfs_root *root,  		ret = read_extent_buffer_pages(io_tree, eb, start,  					       WAIT_COMPLETE,  					       btree_get_extent, mirror_num); -		if (!ret && !verify_parent_transid(io_tree, eb, parent_transid)) +		if (!ret && !verify_parent_transid(io_tree, eb, +						   parent_transid, 0))  			break;  		/* @@ -1202,7 +1207,7 @@ static int __must_check find_and_setup_root(struct btrfs_root *tree_root,  	root->commit_root = NULL;  	root->node = read_tree_block(root, btrfs_root_bytenr(&root->root_item),  				     blocksize, generation); -	if (!root->node || !btrfs_buffer_uptodate(root->node, generation)) { +	if (!root->node || !btrfs_buffer_uptodate(root->node, generation, 0)) {  		free_extent_buffer(root->node);  		root->node = NULL;  		return -EIO; @@ -3143,7 +3148,8 @@ int close_ctree(struct btrfs_root *root)  	return 0;  } -int btrfs_buffer_uptodate(struct extent_buffer *buf, u64 parent_transid) +int btrfs_buffer_uptodate(struct extent_buffer *buf, u64 parent_transid, +			  int atomic)  {  	int ret;  	struct inode *btree_inode = buf->pages[0]->mapping->host; @@ -3153,7 +3159,9 @@ int btrfs_buffer_uptodate(struct extent_buffer *buf, u64 parent_transid)  		return ret;  	ret = verify_parent_transid(&BTRFS_I(btree_inode)->io_tree, buf, -				    parent_transid); +				    parent_transid, atomic); +	if (ret == -EAGAIN) +		return ret;  	return !ret;  } diff --git a/fs/btrfs/disk-io.h b/fs/btrfs/disk-io.h index a7ace1a2dd1..ab1830aaf0e 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);  void __btrfs_btree_balance_dirty(struct btrfs_root *root, unsigned long nr);  void btrfs_free_fs_root(struct btrfs_fs_info *fs_info, struct btrfs_root *root);  void btrfs_mark_buffer_dirty(struct extent_buffer *buf); -int btrfs_buffer_uptodate(struct extent_buffer *buf, u64 parent_transid); +int btrfs_buffer_uptodate(struct extent_buffer *buf, u64 parent_transid, +			  int atomic);  int btrfs_set_buffer_uptodate(struct extent_buffer *buf);  int btrfs_read_buffer(struct extent_buffer *buf, u64 parent_transid);  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 6fc2e6f5aab..49fd7b66d57 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,  			goto skip;  	} -	if (!btrfs_buffer_uptodate(next, generation)) { +	if (!btrfs_buffer_uptodate(next, generation, 0)) {  		btrfs_tree_unlock(next);  		free_extent_buffer(next);  		next = NULL; diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 198c2ba2fa4..c9018a05036 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,  			if (atomic_inc_not_zero(&exists->refs)) {  				spin_unlock(&mapping->private_lock);  				unlock_page(p); +				page_cache_release(p);  				mark_extent_buffer_accessed(exists);  				goto free_eb;  			} @@ -4199,8 +4200,7 @@ free_eb:  			unlock_page(eb->pages[i]);  	} -	if (!atomic_dec_and_test(&eb->refs)) -		return exists; +	WARN_ON(!atomic_dec_and_test(&eb->refs));  	btrfs_release_extent_buffer(eb);  	return exists;  } diff --git a/fs/btrfs/ioctl.h b/fs/btrfs/ioctl.h index 4f69028a68c..086e6bdae1c 100644 --- a/fs/btrfs/ioctl.h +++ b/fs/btrfs/ioctl.h @@ -252,7 +252,7 @@ struct btrfs_data_container {  struct btrfs_ioctl_ino_path_args {  	__u64				inum;		/* in */ -	__u32				size;		/* in */ +	__u64				size;		/* in */  	__u64				reserved[4];  	/* struct btrfs_data_container	*fspath;	   out */  	__u64				fspath;		/* out */ @@ -260,7 +260,7 @@ struct btrfs_ioctl_ino_path_args {  struct btrfs_ioctl_logical_ino_args {  	__u64				logical;	/* in */ -	__u32				size;		/* in */ +	__u64				size;		/* in */  	__u64				reserved[4];  	/* struct btrfs_data_container	*inodes;	out   */  	__u64				inodes; diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index 4f76fc3f8e8..2f3d6f917fb 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,  			page = sblock->pagev + page_index;  			page->logical = logical;  			page->physical = bbio->stripes[mirror_index].physical; +			/* for missing devices, bdev is NULL */  			page->bdev = bbio->stripes[mirror_index].dev->bdev;  			page->mirror_num = mirror_index + 1;  			page->page = alloc_page(GFP_NOFS); @@ -1042,6 +1043,12 @@ static int scrub_recheck_block(struct btrfs_fs_info *fs_info,  		struct scrub_page *page = sblock->pagev + page_num;  		DECLARE_COMPLETION_ONSTACK(complete); +		if (page->bdev == NULL) { +			page->io_error = 1; +			sblock->no_io_error_seen = 0; +			continue; +		} +  		BUG_ON(!page->page);  		bio = bio_alloc(GFP_NOFS, 1);  		if (!bio) diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index d017283ae6f..eb1ae908582 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,  						log->fs_info->extent_root,  						eb->start, eb->len); -	if (btrfs_buffer_uptodate(eb, gen)) { +	if (btrfs_buffer_uptodate(eb, gen, 0)) {  		if (wc->write)  			btrfs_write_tree_block(eb);  		if (wc->wait) diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c index 811245b1ff2..541ef81f6ae 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)  	seq_printf(s, ",rsize=%u", cifs_sb->rsize);  	seq_printf(s, ",wsize=%u", cifs_sb->wsize);  	/* convert actimeo and display it in seconds */ -		seq_printf(s, ",actimeo=%lu", cifs_sb->actimeo / HZ); +	seq_printf(s, ",actimeo=%lu", cifs_sb->actimeo / HZ);  	return 0;  } @@ -699,7 +699,7 @@ static loff_t cifs_llseek(struct file *file, loff_t offset, int origin)  	 * origin == SEEK_END || SEEK_DATA || SEEK_HOLE => we must revalidate  	 * the cached file length  	 */ -	if (origin != SEEK_SET || origin != SEEK_CUR) { +	if (origin != SEEK_SET && origin != SEEK_CUR) {  		int rc;  		struct inode *inode = file->f_path.dentry->d_inode; diff --git a/fs/cifs/cifsfs.h b/fs/cifs/cifsfs.h index d1389bb33ce..65365358c97 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);  extern const struct export_operations cifs_export_ops;  #endif /* CONFIG_CIFS_NFSD_EXPORT */ -#define CIFS_VERSION   "1.77" +#define CIFS_VERSION   "1.78"  #endif				/* _CIFSFS_H */ diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c index f52c5ab78f9..da2f5446fa7 100644 --- a/fs/cifs/cifssmb.c +++ b/fs/cifs/cifssmb.c @@ -4844,8 +4844,12 @@ parse_DFS_referrals(TRANSACTION2_GET_DFS_REFER_RSP *pSMBr,  		max_len = data_end - temp;  		node->node_name = cifs_strndup_from_utf16(temp, max_len,  						is_unicode, nls_codepage); -		if (!node->node_name) +		if (!node->node_name) {  			rc = -ENOMEM; +			goto parse_DFS_referrals_exit; +		} + +		ref++;  	}  parse_DFS_referrals_exit: diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index f4d381e331c..e0b56d7a19c 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c @@ -164,7 +164,8 @@ static const match_table_t cifs_mount_option_tokens = {  	{ Opt_sign, "sign" },  	{ Opt_seal, "seal" },  	{ Opt_direct, "direct" }, -	{ Opt_direct, "forceddirectio" }, +	{ Opt_direct, "directio" }, +	{ Opt_direct, "forcedirectio" },  	{ Opt_strictcache, "strictcache" },  	{ Opt_noac, "noac" },  	{ Opt_fsc, "fsc" }, @@ -215,6 +216,8 @@ static const match_table_t cifs_mount_option_tokens = {  	{ Opt_ignore, "cred" },  	{ Opt_ignore, "credentials" }, +	{ Opt_ignore, "cred=%s" }, +	{ Opt_ignore, "credentials=%s" },  	{ Opt_ignore, "guest" },  	{ Opt_ignore, "rw" },  	{ Opt_ignore, "ro" }, @@ -2183,6 +2186,7 @@ cifs_get_tcp_session(struct smb_vol *volume_info)  	tcp_ses->session_estab = false;  	tcp_ses->sequence_number = 0;  	tcp_ses->lstrp = jiffies; +	spin_lock_init(&tcp_ses->req_lock);  	INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);  	INIT_LIST_HEAD(&tcp_ses->smb_ses_list);  	INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request); @@ -3614,22 +3618,6 @@ cifs_get_volume_info(char *mount_data, const char *devname)  	return volume_info;  } -/* make sure ra_pages is a multiple of rsize */ -static inline unsigned int -cifs_ra_pages(struct cifs_sb_info *cifs_sb) -{ -	unsigned int reads; -	unsigned int rsize_pages = cifs_sb->rsize / PAGE_CACHE_SIZE; - -	if (rsize_pages >= default_backing_dev_info.ra_pages) -		return default_backing_dev_info.ra_pages; -	else if (rsize_pages == 0) -		return rsize_pages; - -	reads = default_backing_dev_info.ra_pages / rsize_pages; -	return reads * rsize_pages; -} -  int  cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info)  { @@ -3717,7 +3705,7 @@ try_mount_again:  	cifs_sb->rsize = cifs_negotiate_rsize(tcon, volume_info);  	/* tune readahead according to rsize */ -	cifs_sb->bdi.ra_pages = cifs_ra_pages(cifs_sb); +	cifs_sb->bdi.ra_pages = cifs_sb->rsize / PAGE_CACHE_SIZE;  remote_path_check:  #ifdef CONFIG_CIFS_DFS_UPCALL diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c index d172c8ed901..ec4e9a2a12f 100644 --- a/fs/cifs/dir.c +++ b/fs/cifs/dir.c @@ -668,12 +668,19 @@ cifs_d_revalidate(struct dentry *direntry, struct nameidata *nd)  			return 0;  		else {  			/* -			 * Forcibly invalidate automounting directory inodes -			 * (remote DFS directories) so to have them -			 * instantiated again for automount +			 * If the inode wasn't known to be a dfs entry when +			 * the dentry was instantiated, such as when created +			 * via ->readdir(), it needs to be set now since the +			 * attributes will have been updated by +			 * cifs_revalidate_dentry().  			 */ -			if (IS_AUTOMOUNT(direntry->d_inode)) -				return 0; +			if (IS_AUTOMOUNT(direntry->d_inode) && +			   !(direntry->d_flags & DCACHE_NEED_AUTOMOUNT)) { +				spin_lock(&direntry->d_lock); +				direntry->d_flags |= DCACHE_NEED_AUTOMOUNT; +				spin_unlock(&direntry->d_lock); +			} +  			return 1;  		}  	} diff --git a/fs/dcache.c b/fs/dcache.c index b60ddc41d78..b80531c9177 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,   * Compare 2 name strings, return 0 if they match, otherwise non-zero.   * The strings are both count bytes long, and count is non-zero.   */ +#ifdef CONFIG_DCACHE_WORD_ACCESS + +#include <asm/word-at-a-time.h> +/* + * NOTE! 'cs' and 'scount' come from a dentry, so it has a + * aligned allocation for this particular component. We don't + * strictly need the load_unaligned_zeropad() safety, but it + * doesn't hurt either. + * + * In contrast, 'ct' and 'tcount' can be from a pathname, and do + * need the careful unaligned handling. + */  static inline int dentry_cmp(const unsigned char *cs, size_t scount,  				const unsigned char *ct, size_t tcount)  { -#ifdef CONFIG_DCACHE_WORD_ACCESS  	unsigned long a,b,mask;  	if (unlikely(scount != tcount))  		return 1;  	for (;;) { -		a = *(unsigned long *)cs; -		b = *(unsigned long *)ct; +		a = load_unaligned_zeropad(cs); +		b = load_unaligned_zeropad(ct);  		if (tcount < sizeof(unsigned long))  			break;  		if (unlikely(a != b)) @@ -165,7 +176,13 @@ static inline int dentry_cmp(const unsigned char *cs, size_t scount,  	}  	mask = ~(~0ul << tcount*8);  	return unlikely(!!((a ^ b) & mask)); +} +  #else + +static inline int dentry_cmp(const unsigned char *cs, size_t scount, +				const unsigned char *ct, size_t tcount) +{  	if (scount != tcount)  		return 1; @@ -177,9 +194,10 @@ static inline int dentry_cmp(const unsigned char *cs, size_t scount,  		tcount--;  	} while (tcount);  	return 0; -#endif  } +#endif +  static void __d_free(struct rcu_head *head)  {  	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 4dfbfec357e..ec2a9c23f0c 100644 --- a/fs/hfsplus/catalog.c +++ b/fs/hfsplus/catalog.c @@ -366,6 +366,10 @@ int hfsplus_rename_cat(u32 cnid,  	err = hfs_brec_find(&src_fd);  	if (err)  		goto out; +	if (src_fd.entrylength > sizeof(entry) || src_fd.entrylength < 0) { +		err = -EIO; +		goto out; +	}  	hfs_bnode_read(src_fd.bnode, &entry, src_fd.entryoffset,  				src_fd.entrylength); diff --git a/fs/hfsplus/dir.c b/fs/hfsplus/dir.c index 88e155f895c..26b53fb09f6 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)  		filp->f_pos++;  		/* fall through */  	case 1: +		if (fd.entrylength > sizeof(entry) || fd.entrylength < 0) { +			err = -EIO; +			goto out; +		} +  		hfs_bnode_read(fd.bnode, &entry, fd.entryoffset,  			fd.entrylength);  		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)  			err = -EIO;  			goto out;  		} + +		if (fd.entrylength > sizeof(entry) || fd.entrylength < 0) { +			err = -EIO; +			goto out; +		} +  		hfs_bnode_read(fd.bnode, &entry, fd.entryoffset,  			fd.entrylength);  		type = be16_to_cpu(entry.type); diff --git a/fs/jffs2/gc.c b/fs/jffs2/gc.c index ad271c70aa2..5a2dec2b064 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)  			return 0;  		jffs2_dbg(1, "No progress from erasing block; doing GC anyway\n"); -		spin_lock(&c->erase_completion_lock);  		mutex_lock(&c->alloc_sem); +		spin_lock(&c->erase_completion_lock);  	}  	/* First, work out which block we're garbage-collecting */ diff --git a/fs/namei.c b/fs/namei.c index 0062dd17eb5..c42791914f8 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)  	unsigned long hash = 0;  	for (;;) { -		a = *(unsigned long *)name; +		a = load_unaligned_zeropad(name);  		if (len < sizeof(unsigned long))  			break;  		hash += a; @@ -1459,7 +1459,7 @@ static inline unsigned long hash_name(const char *name, unsigned int *hashp)  	do {  		hash = (hash + a) * 9;  		len += sizeof(unsigned long); -		a = *(unsigned long *)(name+len); +		a = load_unaligned_zeropad(name+len);  		/* Do we have any NUL or '/' bytes in this word? */  		mask = has_zero(a) | has_zero(a ^ REPEAT_BYTE('/'));  	} while (!mask); diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 2d60492d6df..1030a716d15 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)  	else if (pte_present(pte))  		*pme = make_pme(PM_PFRAME(pte_pfn(pte))  				| PM_PSHIFT(PAGE_SHIFT) | PM_PRESENT); +	else +		*pme = make_pme(PM_NOT_PRESENT);  }  #ifdef CONFIG_TRANSPARENT_HUGEPAGE @@ -761,6 +763,8 @@ static void thp_pmd_to_pagemap_entry(pagemap_entry_t *pme,  	if (pmd_present(pmd))  		*pme = make_pme(PM_PFRAME(pmd_pfn(pmd) + offset)  				| PM_PSHIFT(PAGE_SHIFT) | PM_PRESENT); +	else +		*pme = make_pme(PM_NOT_PRESENT);  }  #else  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,  		/* check to see if we've left 'vma' behind  		 * and need a new, higher one */ -		if (vma && (addr >= vma->vm_end)) +		if (vma && (addr >= vma->vm_end)) {  			vma = find_vma(walk->mm, addr); +			pme = make_pme(PM_NOT_PRESENT); +		}  		/* check that 'vma' actually covers this address,  		 * and that it isn't a huge page vma */ @@ -830,6 +836,8 @@ static void huge_pte_to_pagemap_entry(pagemap_entry_t *pme,  	if (pte_present(pte))  		*pme = make_pme(PM_PFRAME(pte_pfn(pte) + offset)  				| PM_PSHIFT(PAGE_SHIFT) | PM_PRESENT); +	else +		*pme = make_pme(PM_NOT_PRESENT);  }  /* 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,  {  	struct pagemapread *pm = walk->private;  	int err = 0; -	pagemap_entry_t pme = make_pme(PM_NOT_PRESENT); +	pagemap_entry_t pme;  	for (; addr != end; addr += PAGE_SIZE) {  		int offset = (addr & ~hmask) >> PAGE_SHIFT; diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h index eba66043cf1..e8bcc4742e0 100644 --- a/include/acpi/actypes.h +++ b/include/acpi/actypes.h @@ -499,9 +499,10 @@ typedef u64 acpi_integer;  #define ACPI_STATE_D0                   (u8) 0  #define ACPI_STATE_D1                   (u8) 1  #define ACPI_STATE_D2                   (u8) 2 -#define ACPI_STATE_D3                   (u8) 3 -#define ACPI_STATE_D3_COLD              (u8) 4 -#define ACPI_D_STATES_MAX               ACPI_STATE_D3_COLD +#define ACPI_STATE_D3_HOT               (u8) 3 +#define ACPI_STATE_D3                   (u8) 4 +#define ACPI_STATE_D3_COLD              ACPI_STATE_D3 +#define ACPI_D_STATES_MAX               ACPI_STATE_D3  #define ACPI_D_STATE_COUNT              5  #define ACPI_STATE_C0                   (u8) 0 diff --git a/include/asm-generic/statfs.h b/include/asm-generic/statfs.h index 0fd28e028de..c749af9c098 100644 --- a/include/asm-generic/statfs.h +++ b/include/asm-generic/statfs.h @@ -15,7 +15,7 @@ typedef __kernel_fsid_t	fsid_t;   * with a 10' pole.   */  #ifndef __statfs_word -#if BITS_PER_LONG == 64 +#if __BITS_PER_LONG == 64  #define __statfs_word long  #else  #define __statfs_word __u32 diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 7f377fb8b52..b0f6f22723c 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)  	return 0;  } -#ifndef CONFIG_NET_NS -static inline void skb_set_dev(struct sk_buff *skb, struct net_device *dev) -{ -	skb->dev = dev; -} -#else /* CONFIG_NET_NS */ -void skb_set_dev(struct sk_buff *skb, struct net_device *dev); -#endif -  static inline bool netdev_uses_trailer_tags(struct net_device *dev)  {  #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 289b62d9dd1..b114d35aea5 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 {  #endif  }; +static size_t +htable_size(u8 hbits) +{ +	size_t hsize; + +	/* We must fit both into u32 in jhash and size_t */ +	if (hbits > 31) +		return 0; +	hsize = jhash_size(hbits); +	if ((((size_t)-1) - sizeof(struct htable))/sizeof(struct hbucket) +	    < hsize) +		return 0; + +	return hsize * sizeof(struct hbucket) + sizeof(struct htable); +} +  /* Compute htable_bits from the user input parameter hashsize */  static u8  htable_bits(u32 hashsize) diff --git a/include/linux/seqlock.h b/include/linux/seqlock.h index c6db9fb33c4..600060e25ec 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)  	unsigned ret;  repeat: -	ret = s->sequence; +	ret = ACCESS_ONCE(s->sequence);  	if (unlikely(ret & 1)) {  		cpu_relax();  		goto repeat; @@ -166,6 +166,27 @@ static inline unsigned read_seqcount_begin(const seqcount_t *s)  }  /** + * raw_seqcount_begin - begin a seq-read critical section + * @s: pointer to seqcount_t + * Returns: count to be passed to read_seqcount_retry + * + * raw_seqcount_begin opens a read critical section of the given seqcount. + * Validity of the critical section is tested by checking read_seqcount_retry + * function. + * + * Unlike read_seqcount_begin(), this function will not wait for the count + * to stabilize. If a writer is active when we begin, we will fail the + * read_seqcount_retry() instead of stabilizing at the beginning of the + * critical section. + */ +static inline unsigned raw_seqcount_begin(const seqcount_t *s) +{ +	unsigned ret = ACCESS_ONCE(s->sequence); +	smp_rmb(); +	return ret & ~1; +} + +/**   * __read_seqcount_retry - end a seq-read critical section (without barrier)   * @s: pointer to seqcount_t   * @start: count, from read_seqcount_begin diff --git a/include/linux/usb/usbnet.h b/include/linux/usb/usbnet.h index 605b0aa8d85..76f439647c4 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 *);  enum skb_state {  	illegal = 0,  	tx_start, tx_done, -	rx_start, rx_done, rx_cleanup +	rx_start, rx_done, rx_cleanup, +	unlink_start  };  struct skb_data {	/* skb->cb is one of these */ diff --git a/include/media/soc_camera.h b/include/media/soc_camera.h index b5c2b6cb0d8..cad374bdcf4 100644 --- a/include/media/soc_camera.h +++ b/include/media/soc_camera.h @@ -59,7 +59,8 @@ struct soc_camera_device {  struct soc_camera_host {  	struct v4l2_device v4l2_dev;  	struct list_head list; -	unsigned char nr;				/* Host number */ +	struct mutex host_lock;		/* Protect during probing */ +	unsigned char nr;		/* Host number */  	void *priv;  	const char *drv_name;  	struct soc_camera_host_ops *ops; diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h index 262ebd1747d..a65910bda38 100644 --- a/include/net/bluetooth/bluetooth.h +++ b/include/net/bluetooth/bluetooth.h @@ -191,6 +191,7 @@ struct bt_sock {  	struct list_head accept_q;  	struct sock *parent;  	u32 defer_setup; +	bool suspended;  };  struct bt_sock_list { diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h index 6ee44b24864..a2ef81466b0 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)  	addr->v6.sin6_addr.s6_addr32[2] = htonl(0x0000ffff);  } +/* The cookie is always 0 since this is how it's used in the + * pmtu code. + */ +static inline struct dst_entry *sctp_transport_dst_check(struct sctp_transport *t) +{ +	if (t->dst && !dst_check(t->dst, 0)) { +		dst_release(t->dst); +		t->dst = NULL; +	} + +	return t->dst; +} +  #endif /* __net_sctp_h__ */ diff --git a/init/do_mounts.c b/init/do_mounts.c index 0e93f92a034..42b0707c348 100644 --- a/init/do_mounts.c +++ b/init/do_mounts.c @@ -472,7 +472,7 @@ void __init change_floppy(char *fmt, ...)  void __init mount_root(void)  {  #ifdef CONFIG_ROOT_NFS -	if (MAJOR(ROOT_DEV) == UNNAMED_MAJOR) { +	if (ROOT_DEV == Root_NFS) {  		if (mount_nfs_root())  			return; diff --git a/kernel/compat.c b/kernel/compat.c index 74ff8498809..d2c67aa49ae 100644 --- a/kernel/compat.c +++ b/kernel/compat.c @@ -372,25 +372,54 @@ asmlinkage long compat_sys_sigpending(compat_old_sigset_t __user *set)  #ifdef __ARCH_WANT_SYS_SIGPROCMASK -asmlinkage long compat_sys_sigprocmask(int how, compat_old_sigset_t __user *set, -		compat_old_sigset_t __user *oset) +/* + * sys_sigprocmask SIG_SETMASK sets the first (compat) word of the + * blocked set of signals to the supplied signal set + */ +static inline void compat_sig_setmask(sigset_t *blocked, compat_sigset_word set)  { -	old_sigset_t s; -	long ret; -	mm_segment_t old_fs; +	memcpy(blocked->sig, &set, sizeof(set)); +} -	if (set && get_user(s, set)) -		return -EFAULT; -	old_fs = get_fs(); -	set_fs(KERNEL_DS); -	ret = sys_sigprocmask(how, -			      set ? (old_sigset_t __user *) &s : NULL, -			      oset ? (old_sigset_t __user *) &s : NULL); -	set_fs(old_fs); -	if (ret == 0) -		if (oset) -			ret = put_user(s, oset); -	return ret; +asmlinkage long compat_sys_sigprocmask(int how, +				       compat_old_sigset_t __user *nset, +				       compat_old_sigset_t __user *oset) +{ +	old_sigset_t old_set, new_set; +	sigset_t new_blocked; + +	old_set = current->blocked.sig[0]; + +	if (nset) { +		if (get_user(new_set, nset)) +			return -EFAULT; +		new_set &= ~(sigmask(SIGKILL) | sigmask(SIGSTOP)); + +		new_blocked = current->blocked; + +		switch (how) { +		case SIG_BLOCK: +			sigaddsetmask(&new_blocked, new_set); +			break; +		case SIG_UNBLOCK: +			sigdelsetmask(&new_blocked, new_set); +			break; +		case SIG_SETMASK: +			compat_sig_setmask(&new_blocked, new_set); +			break; +		default: +			return -EINVAL; +		} + +		set_current_blocked(&new_blocked); +	} + +	if (oset) { +		if (put_user(old_set, oset)) +			return -EFAULT; +	} + +	return 0;  }  #endif diff --git a/kernel/fork.c b/kernel/fork.c index b9372a0bff1..687a15d5624 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -47,6 +47,7 @@  #include <linux/audit.h>  #include <linux/memcontrol.h>  #include <linux/ftrace.h> +#include <linux/proc_fs.h>  #include <linux/profile.h>  #include <linux/rmap.h>  #include <linux/ksm.h> @@ -1464,6 +1465,8 @@ bad_fork_cleanup_io:  	if (p->io_context)  		exit_io_context(p);  bad_fork_cleanup_namespaces: +	if (unlikely(clone_flags & CLONE_NEWPID)) +		pid_ns_release_proc(p->nsproxy->pid_ns);  	exit_task_namespaces(p);  bad_fork_cleanup_mm:  	if (p->mm) diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index 6080f6bc8c3..3914c1e03cf 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)  out_unlock:  	raw_spin_unlock(&desc->lock);  } +EXPORT_SYMBOL(handle_edge_irq);  #ifdef CONFIG_IRQ_EDGE_EOI_HANDLER  /** diff --git a/kernel/irq/irqdesc.c b/kernel/irq/irqdesc.c index d86e254b95e..192a302d6cf 100644 --- a/kernel/irq/irqdesc.c +++ b/kernel/irq/irqdesc.c @@ -112,6 +112,7 @@ struct irq_desc *irq_to_desc(unsigned int irq)  {  	return radix_tree_lookup(&irq_desc_tree, irq);  } +EXPORT_SYMBOL(irq_to_desc);  static void delete_irq_desc(unsigned int irq)  { diff --git a/mm/hugetlb.c b/mm/hugetlb.c index 5a16423a512..ae8f708e3d7 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -2498,7 +2498,6 @@ retry_avoidcopy:  		if (outside_reserve) {  			BUG_ON(huge_pte_none(pte));  			if (unmap_ref_private(mm, vma, old_page, address)) { -				BUG_ON(page_count(old_page) != 1);  				BUG_ON(huge_pte_none(pte));  				spin_lock(&mm->page_table_lock);  				ptep = huge_pte_offset(mm, address & huge_page_mask(h)); diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 31ab9c3f017..b659260c56a 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -4507,6 +4507,12 @@ static void mem_cgroup_usage_unregister_event(struct cgroup *cgrp,  swap_buffers:  	/* Swap primary and spare array */  	thresholds->spare = thresholds->primary; +	/* If all events are unregistered, free the spare array */ +	if (!new) { +		kfree(thresholds->spare); +		thresholds->spare = NULL; +	} +  	rcu_assign_pointer(thresholds->primary, new);  	/* To be sure that nobody uses thresholds */ diff --git a/mm/nobootmem.c b/mm/nobootmem.c index e53bb8a256b..1983fb1c702 100644 --- a/mm/nobootmem.c +++ b/mm/nobootmem.c @@ -82,8 +82,7 @@ void __init free_bootmem_late(unsigned long addr, unsigned long size)  static void __init __free_pages_memory(unsigned long start, unsigned long end)  { -	int i; -	unsigned long start_aligned, end_aligned; +	unsigned long i, start_aligned, end_aligned;  	int order = ilog2(BITS_PER_LONG);  	start_aligned = (start + (BITS_PER_LONG - 1)) & ~(BITS_PER_LONG - 1); diff --git a/mm/page_alloc.c b/mm/page_alloc.c index a712fb9e04c..918330f71db 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,  	int ret;  	ret = proc_dointvec_minmax(table, write, buffer, length, ppos); -	if (!write || (ret == -EINVAL)) +	if (!write || (ret < 0))  		return ret;  	for_each_populated_zone(zone) {  		for_each_possible_cpu(cpu) { diff --git a/mm/percpu.c b/mm/percpu.c index f47af9123af..bb4be7435ce 100644 --- a/mm/percpu.c +++ b/mm/percpu.c @@ -1132,20 +1132,20 @@ static void pcpu_dump_alloc_info(const char *lvl,  		for (alloc_end += gi->nr_units / upa;  		     alloc < alloc_end; alloc++) {  			if (!(alloc % apl)) { -				printk("\n"); +				printk(KERN_CONT "\n");  				printk("%spcpu-alloc: ", lvl);  			} -			printk("[%0*d] ", group_width, group); +			printk(KERN_CONT "[%0*d] ", group_width, group);  			for (unit_end += upa; unit < unit_end; unit++)  				if (gi->cpu_map[unit] != NR_CPUS) -					printk("%0*d ", cpu_width, +					printk(KERN_CONT "%0*d ", cpu_width,  					       gi->cpu_map[unit]);  				else -					printk("%s ", empty_str); +					printk(KERN_CONT "%s ", empty_str);  		}  	} -	printk("\n"); +	printk(KERN_CONT "\n");  }  /** @@ -1650,6 +1650,16 @@ int __init pcpu_embed_first_chunk(size_t reserved_size, size_t dyn_size,  		areas[group] = ptr;  		base = min(ptr, base); +	} + +	/* +	 * Copy data and free unused parts.  This should happen after all +	 * allocations are complete; otherwise, we may end up with +	 * overlapping groups. +	 */ +	for (group = 0; group < ai->nr_groups; group++) { +		struct pcpu_group_info *gi = &ai->groups[group]; +		void *ptr = areas[group];  		for (i = 0; i < gi->nr_units; i++, ptr += ai->unit_size) {  			if (gi->cpu_map[i] == NR_CPUS) { @@ -1885,6 +1895,8 @@ void __init setup_per_cpu_areas(void)  	fc = __alloc_bootmem(unit_size, PAGE_SIZE, __pa(MAX_DMA_ADDRESS));  	if (!ai || !fc)  		panic("Failed to allocate memory for percpu areas."); +	/* kmemleak tracks the percpu allocations separately */ +	kmemleak_free(fc);  	ai->dyn_size = unit_size;  	ai->unit_size = unit_size; diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c index eaf5f21b0ef..da1bc9c3cf3 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,  		skb = __vlan_hwaccel_put_tag(skb, vlan_tci);  	} -	skb_set_dev(skb, vlan_dev_priv(dev)->real_dev); +	skb->dev = vlan_dev_priv(dev)->real_dev;  	len = skb->len;  	if (netpoll_tx_running(dev))  		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 72eb187a5f6..6fb68a9743a 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  			sk->sk_state == BT_CONFIG)  		return mask; -	if (sock_writeable(sk)) +	if (!bt_sk(sk)->suspended && sock_writeable(sk))  		mask |= POLLOUT | POLLWRNORM | POLLWRBAND;  	else  		set_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags); diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index edfd61addce..d6dc44cd15b 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)  	if (conn) {  		hci_conn_enter_active_mode(conn, BT_POWER_FORCE_ACTIVE_OFF); +		hci_dev_lock(hdev); +		if (test_bit(HCI_MGMT, &hdev->dev_flags) && +		    !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) +			mgmt_device_connected(hdev, &conn->dst, conn->type, +					      conn->dst_type, 0, NULL, 0, +					      conn->dev_class); +		hci_dev_unlock(hdev); +  		/* Send to upper protocol */  		l2cap_recv_acldata(conn, skb, flags);  		return; diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index 6c065254afc..1266f78fa8e 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 *  		clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags); +		if (ev->status && conn->state == BT_CONNECTED) { +			hci_acl_disconn(conn, 0x13); +			hci_conn_put(conn); +			goto unlock; +		} +  		if (conn->state == BT_CONFIG) {  			if (!ev->status)  				conn->state = BT_CONNECTED; @@ -2049,6 +2055,7 @@ static inline void hci_encrypt_change_evt(struct hci_dev *hdev, struct sk_buff *  			hci_encrypt_cfm(conn, ev->status, ev->encrypt);  	} +unlock:  	hci_dev_unlock(hdev);  } @@ -2102,7 +2109,7 @@ static inline void hci_remote_features_evt(struct hci_dev *hdev, struct sk_buff  		goto unlock;  	} -	if (!ev->status) { +	if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {  		struct hci_cp_remote_name_req cp;  		memset(&cp, 0, sizeof(cp));  		bacpy(&cp.bdaddr, &conn->dst); @@ -2871,7 +2878,7 @@ static inline void hci_remote_ext_features_evt(struct hci_dev *hdev, struct sk_b  	if (conn->state != BT_CONFIG)  		goto unlock; -	if (!ev->status) { +	if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {  		struct hci_cp_remote_name_req cp;  		memset(&cp, 0, sizeof(cp));  		bacpy(&cp.bdaddr, &conn->dst); diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index 94552b33d52..6f9c25b633a 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)  		if (!status && (chan->state == BT_CONNECTED ||  						chan->state == BT_CONFIG)) { +			struct sock *sk = chan->sk; + +			bt_sk(sk)->suspended = false; +			sk->sk_state_change(sk); +  			l2cap_check_encryption(chan, encrypt);  			l2cap_chan_unlock(chan);  			continue; diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index 29122ed28ea..04e7c172d49 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  			sk->sk_state = BT_CONFIG;  			chan->state = BT_CONFIG; -		/* or for ACL link, under defer_setup time */ -		} else if (sk->sk_state == BT_CONNECT2 && -					bt_sk(sk)->defer_setup) { -			err = l2cap_chan_check_security(chan); +		/* or for ACL link */ +		} else if ((sk->sk_state == BT_CONNECT2 && +			   bt_sk(sk)->defer_setup) || +			   sk->sk_state == BT_CONNECTED) { +			if (!l2cap_chan_check_security(chan)) +				bt_sk(sk)->suspended = true; +			else +				sk->sk_state_change(sk);  		} else {  			err = -EINVAL;  		} diff --git a/net/core/dev.c b/net/core/dev.c index 66cae6e975d..33684b6e95e 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)  		return NET_RX_DROP;  	}  	skb->skb_iif = 0; -	skb_set_dev(skb, dev); +	skb->dev = dev; +	skb_dst_drop(skb);  	skb->tstamp.tv64 = 0;  	skb->pkt_type = PACKET_HOST;  	skb->protocol = eth_type_trans(skb, dev); +	skb->mark = 0; +	secpath_reset(skb); +	nf_reset(skb);  	return netif_rx(skb);  }  EXPORT_SYMBOL_GPL(dev_forward_skb); @@ -1867,36 +1871,6 @@ void netif_device_attach(struct net_device *dev)  }  EXPORT_SYMBOL(netif_device_attach); -/** - * skb_dev_set -- assign a new device to a buffer - * @skb: buffer for the new device - * @dev: network device - * - * If an skb is owned by a device already, we have to reset - * all data private to the namespace a device belongs to - * before assigning it a new device. - */ -#ifdef CONFIG_NET_NS -void skb_set_dev(struct sk_buff *skb, struct net_device *dev) -{ -	skb_dst_drop(skb); -	if (skb->dev && !net_eq(dev_net(skb->dev), dev_net(dev))) { -		secpath_reset(skb); -		nf_reset(skb); -		skb_init_secmark(skb); -		skb->mark = 0; -		skb->priority = 0; -		skb->nf_trace = 0; -		skb->ipvs_property = 0; -#ifdef CONFIG_NET_SCHED -		skb->tc_index = 0; -#endif -	} -	skb->dev = dev; -} -EXPORT_SYMBOL(skb_set_dev); -#endif /* CONFIG_NET_NS */ -  static void skb_warn_bad_offload(const struct sk_buff *skb)  {  	static const netdev_features_t null_features = 0; diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 33912573959..70236db0fb4 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c @@ -1931,7 +1931,7 @@ static int pktgen_device_event(struct notifier_block *unused,  {  	struct net_device *dev = ptr; -	if (!net_eq(dev_net(dev), &init_net)) +	if (!net_eq(dev_net(dev), &init_net) || pktgen_exiting)  		return NOTIFY_DONE;  	/* It is OK that we do not hold the group lock right now, @@ -3754,12 +3754,18 @@ static void __exit pg_cleanup(void)  {  	struct pktgen_thread *t;  	struct list_head *q, *n; +	struct list_head list;  	/* Stop all interfaces & threads */  	pktgen_exiting = true; -	list_for_each_safe(q, n, &pktgen_threads) { +	mutex_lock(&pktgen_thread_lock); +	list_splice(&list, &pktgen_threads); +	mutex_unlock(&pktgen_thread_lock); + +	list_for_each_safe(q, n, &list) {  		t = list_entry(q, struct pktgen_thread, th_list); +		list_del(&t->th_list);  		kthread_stop(t->tsk);  		kfree(t);  	} diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c index bce36f1a37b..30b88d7b4bd 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,  			if (fa->fa_tos && fa->fa_tos != flp->flowi4_tos)  				continue; +			if (fi->fib_dead) +				continue;  			if (fa->fa_info->fib_scope < flp->flowi4_scope)  				continue;  			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 507fe93794a..a68dbd4f1e4 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)  {  	u32 hashsize = IPSET_DEFAULT_HASHSIZE, maxelem = IPSET_DEFAULT_MAXELEM;  	u8 netmask, hbits; +	size_t hsize;  	struct ip_set_hash *h;  	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)  	h->timeout = IPSET_NO_TIMEOUT;  	hbits = htable_bits(hashsize); -	h->table = ip_set_alloc( -			sizeof(struct htable) -			+ jhash_size(hbits) * sizeof(struct hbucket)); +	hsize = htable_size(hbits); +	if (hsize == 0) { +		kfree(h); +		return -ENOMEM; +	} +	h->table = ip_set_alloc(hsize);  	if (!h->table) {  		kfree(h);  		return -ENOMEM; diff --git a/net/netfilter/ipset/ip_set_hash_ipport.c b/net/netfilter/ipset/ip_set_hash_ipport.c index 68f284c9749..92722bb82ee 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)  	struct ip_set_hash *h;  	u32 hashsize = IPSET_DEFAULT_HASHSIZE, maxelem = IPSET_DEFAULT_MAXELEM;  	u8 hbits; +	size_t hsize;  	if (!(set->family == NFPROTO_IPV4 || set->family == NFPROTO_IPV6))  		return -IPSET_ERR_INVALID_FAMILY; @@ -479,9 +480,12 @@ hash_ipport_create(struct ip_set *set, struct nlattr *tb[], u32 flags)  	h->timeout = IPSET_NO_TIMEOUT;  	hbits = htable_bits(hashsize); -	h->table = ip_set_alloc( -			sizeof(struct htable) -			+ jhash_size(hbits) * sizeof(struct hbucket)); +	hsize = htable_size(hbits); +	if (hsize == 0) { +		kfree(h); +		return -ENOMEM; +	} +	h->table = ip_set_alloc(hsize);  	if (!h->table) {  		kfree(h);  		return -ENOMEM; diff --git a/net/netfilter/ipset/ip_set_hash_ipportip.c b/net/netfilter/ipset/ip_set_hash_ipportip.c index 1eec4b9e0dc..0637ce096de 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)  	struct ip_set_hash *h;  	u32 hashsize = IPSET_DEFAULT_HASHSIZE, maxelem = IPSET_DEFAULT_MAXELEM;  	u8 hbits; +	size_t hsize;  	if (!(set->family == NFPROTO_IPV4 || set->family == NFPROTO_IPV6))  		return -IPSET_ERR_INVALID_FAMILY; @@ -497,9 +498,12 @@ hash_ipportip_create(struct ip_set *set, struct nlattr *tb[], u32 flags)  	h->timeout = IPSET_NO_TIMEOUT;  	hbits = htable_bits(hashsize); -	h->table = ip_set_alloc( -			sizeof(struct htable) -			+ jhash_size(hbits) * sizeof(struct hbucket)); +	hsize = htable_size(hbits); +	if (hsize == 0) { +		kfree(h); +		return -ENOMEM; +	} +	h->table = ip_set_alloc(hsize);  	if (!h->table) {  		kfree(h);  		return -ENOMEM; diff --git a/net/netfilter/ipset/ip_set_hash_ipportnet.c b/net/netfilter/ipset/ip_set_hash_ipportnet.c index 62d66ecef36..1ce21ca976e 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)  	struct ip_set_hash *h;  	u32 hashsize = IPSET_DEFAULT_HASHSIZE, maxelem = IPSET_DEFAULT_MAXELEM;  	u8 hbits; +	size_t hsize;  	if (!(set->family == NFPROTO_IPV4 || set->family == NFPROTO_IPV6))  		return -IPSET_ERR_INVALID_FAMILY; @@ -648,9 +649,12 @@ hash_ipportnet_create(struct ip_set *set, struct nlattr *tb[], u32 flags)  	h->timeout = IPSET_NO_TIMEOUT;  	hbits = htable_bits(hashsize); -	h->table = ip_set_alloc( -			sizeof(struct htable) -			+ jhash_size(hbits) * sizeof(struct hbucket)); +	hsize = htable_size(hbits); +	if (hsize == 0) { +		kfree(h); +		return -ENOMEM; +	} +	h->table = ip_set_alloc(hsize);  	if (!h->table) {  		kfree(h);  		return -ENOMEM; diff --git a/net/netfilter/ipset/ip_set_hash_net.c b/net/netfilter/ipset/ip_set_hash_net.c index 6607a814be5..c57a6a09906 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)  	u32 hashsize = IPSET_DEFAULT_HASHSIZE, maxelem = IPSET_DEFAULT_MAXELEM;  	struct ip_set_hash *h;  	u8 hbits; +	size_t hsize;  	if (!(set->family == NFPROTO_IPV4 || set->family == NFPROTO_IPV6))  		return -IPSET_ERR_INVALID_FAMILY; @@ -492,9 +493,12 @@ hash_net_create(struct ip_set *set, struct nlattr *tb[], u32 flags)  	h->timeout = IPSET_NO_TIMEOUT;  	hbits = htable_bits(hashsize); -	h->table = ip_set_alloc( -			sizeof(struct htable) -			+ jhash_size(hbits) * sizeof(struct hbucket)); +	hsize = htable_size(hbits); +	if (hsize == 0) { +		kfree(h); +		return -ENOMEM; +	} +	h->table = ip_set_alloc(hsize);  	if (!h->table) {  		kfree(h);  		return -ENOMEM; diff --git a/net/netfilter/ipset/ip_set_hash_netiface.c b/net/netfilter/ipset/ip_set_hash_netiface.c index 6093f3daa91..ee863943c82 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)  	struct ip_set_hash *h;  	u32 hashsize = IPSET_DEFAULT_HASHSIZE, maxelem = IPSET_DEFAULT_MAXELEM;  	u8 hbits; +	size_t hsize;  	if (!(set->family == NFPROTO_IPV4 || set->family == NFPROTO_IPV6))  		return -IPSET_ERR_INVALID_FAMILY; @@ -756,9 +757,12 @@ hash_netiface_create(struct ip_set *set, struct nlattr *tb[], u32 flags)  	h->ahash_max = AHASH_MAX_SIZE;  	hbits = htable_bits(hashsize); -	h->table = ip_set_alloc( -			sizeof(struct htable) -			+ jhash_size(hbits) * sizeof(struct hbucket)); +	hsize = htable_size(hbits); +	if (hsize == 0) { +		kfree(h); +		return -ENOMEM; +	} +	h->table = ip_set_alloc(hsize);  	if (!h->table) {  		kfree(h);  		return -ENOMEM; diff --git a/net/netfilter/ipset/ip_set_hash_netport.c b/net/netfilter/ipset/ip_set_hash_netport.c index ae3c644adc1..fc3143a2d41 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)  	struct ip_set_hash *h;  	u32 hashsize = IPSET_DEFAULT_HASHSIZE, maxelem = IPSET_DEFAULT_MAXELEM;  	u8 hbits; +	size_t hsize;  	if (!(set->family == NFPROTO_IPV4 || set->family == NFPROTO_IPV6))  		return -IPSET_ERR_INVALID_FAMILY; @@ -604,9 +605,12 @@ hash_netport_create(struct ip_set *set, struct nlattr *tb[], u32 flags)  	h->timeout = IPSET_NO_TIMEOUT;  	hbits = htable_bits(hashsize); -	h->table = ip_set_alloc( -			sizeof(struct htable) -			+ jhash_size(hbits) * sizeof(struct hbucket)); +	hsize = htable_size(hbits); +	if (hsize == 0) { +		kfree(h); +		return -ENOMEM; +	} +	h->table = ip_set_alloc(hsize);  	if (!h->table) {  		kfree(h);  		return -ENOMEM; diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c index f86de29979e..2c74daa5aca 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,  			return -ENOMEM;  		nskb = __vlan_put_tag(nskb, vlan_tx_tag_get(nskb)); -		if (!skb) +		if (!nskb)  			return -ENOMEM;  		nskb->vlan_tci = 0; @@ -421,6 +421,19 @@ static int validate_sample(const struct nlattr *attr,  	return validate_actions(actions, key, depth + 1);  } +static int validate_tp_port(const struct sw_flow_key *flow_key) +{ +	if (flow_key->eth.type == htons(ETH_P_IP)) { +		if (flow_key->ipv4.tp.src && flow_key->ipv4.tp.dst) +			return 0; +	} else if (flow_key->eth.type == htons(ETH_P_IPV6)) { +		if (flow_key->ipv6.tp.src && flow_key->ipv6.tp.dst) +			return 0; +	} + +	return -EINVAL; +} +  static int validate_set(const struct nlattr *a,  			const struct sw_flow_key *flow_key)  { @@ -462,18 +475,13 @@ static int validate_set(const struct nlattr *a,  		if (flow_key->ip.proto != IPPROTO_TCP)  			return -EINVAL; -		if (!flow_key->ipv4.tp.src || !flow_key->ipv4.tp.dst) -			return -EINVAL; - -		break; +		return validate_tp_port(flow_key);  	case OVS_KEY_ATTR_UDP:  		if (flow_key->ip.proto != IPPROTO_UDP)  			return -EINVAL; -		if (!flow_key->ipv4.tp.src || !flow_key->ipv4.tp.dst) -			return -EINVAL; -		break; +		return validate_tp_port(flow_key);  	default:  		return -EINVAL; @@ -1647,10 +1655,9 @@ static int ovs_vport_cmd_set(struct sk_buff *skb, struct genl_info *info)  	reply = ovs_vport_cmd_build_info(vport, info->snd_pid, info->snd_seq,  					 OVS_VPORT_CMD_NEW);  	if (IS_ERR(reply)) { -		err = PTR_ERR(reply);  		netlink_set_err(init_net.genl_sock, 0, -				ovs_dp_vport_multicast_group.id, err); -		return 0; +				ovs_dp_vport_multicast_group.id, PTR_ERR(reply)); +		goto exit_unlock;  	}  	genl_notify(reply, genl_info_net(info), info->snd_pid, diff --git a/net/openvswitch/flow.c b/net/openvswitch/flow.c index 7cb416381e8..6d4d8097cf9 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)  	u8 tcp_flags = 0;  	if (flow->key.eth.type == htons(ETH_P_IP) && -	    flow->key.ip.proto == IPPROTO_TCP) { +	    flow->key.ip.proto == IPPROTO_TCP && +	    likely(skb->len >= skb_transport_offset(skb) + sizeof(struct tcphdr))) {  		u8 *tcp = (u8 *)tcp_hdr(skb);  		tcp_flags = *(tcp + TCP_FLAGS_OFFSET) & TCP_FLAG_MASK;  	} diff --git a/net/sctp/output.c b/net/sctp/output.c index 69534c5f8af..f1b7d4bb591 100644 --- a/net/sctp/output.c +++ b/net/sctp/output.c @@ -377,9 +377,7 @@ int sctp_packet_transmit(struct sctp_packet *packet)  	 */  	skb_set_owner_w(nskb, sk); -	/* The 'obsolete' field of dst is set to 2 when a dst is freed. */ -	if (!dst || (dst->obsolete > 1)) { -		dst_release(dst); +	if (!sctp_transport_dst_check(tp)) {  		sctp_transport_route(tp, NULL, sctp_sk(sk));  		if (asoc && (asoc->param_flags & SPP_PMTUD_ENABLE)) {  			sctp_assoc_sync_pmtu(asoc); diff --git a/net/sctp/transport.c b/net/sctp/transport.c index 3889330b7b0..b026ba0c699 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)  		transport->pathmtu = SCTP_DEFAULT_MAXSEGMENT;  } -/* this is a complete rip-off from __sk_dst_check - * the cookie is always 0 since this is how it's used in the - * pmtu code - */ -static struct dst_entry *sctp_transport_dst_check(struct sctp_transport *t) -{ -	struct dst_entry *dst = t->dst; - -	if (dst && dst->obsolete && dst->ops->check(dst, 0) == NULL) { -		dst_release(t->dst); -		t->dst = NULL; -		return NULL; -	} - -	return dst; -} -  void sctp_transport_update_pmtu(struct sctp_transport *t, u32 pmtu)  {  	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 ca8cad8251c..782bfe1b646 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);  int gss_mech_list_pseudoflavors(rpc_authflavor_t *array_ptr)  {  	struct gss_api_mech *pos = NULL; -	int i = 0; +	int j, i = 0;  	spin_lock(®istered_mechs_lock);  	list_for_each_entry(pos, ®istered_mechs, gm_list) { -		array_ptr[i] = pos->gm_pfs->pseudoflavor; -		i++; +		for (j=0; j < pos->gm_pf_num; j++) { +			array_ptr[i++] = pos->gm_pfs[j].pseudoflavor; +		}  	}  	spin_unlock(®istered_mechs_lock);  	return i; diff --git a/sound/pci/echoaudio/echoaudio_dsp.c b/sound/pci/echoaudio/echoaudio_dsp.c index 64417a73322..d8c670c9d62 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)  	const struct firmware *fw;  	int box_type, err; -	if (snd_BUG_ON(!chip->dsp_code_to_load || !chip->comm_page)) +	if (snd_BUG_ON(!chip->comm_page))  		return -EPERM;  	/* 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 7a8fcc4c15f..841475cc13b 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)  	list_for_each_entry(codec, &bus->codec_list, list) {  		if (hda_codec_is_power_on(codec))  			hda_call_codec_suspend(codec); -		else /* forcibly change the power to D3 even if not used */ -			hda_set_power_state(codec, -					    codec->afg ? codec->afg : codec->mfg, -					    AC_PWRST_D3);  		if (codec->patch_ops.post_suspend)  			codec->patch_ops.post_suspend(codec);  	} diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index c19e71a94e1..1f350522bed 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,  {  	struct azx *chip = bus->private_data;  	unsigned long timeout; +	unsigned long loopcounter;  	int do_poll = 0;   again:  	timeout = jiffies + msecs_to_jiffies(1000); -	for (;;) { + +	for (loopcounter = 0;; loopcounter++) {  		if (chip->polling_mode || do_poll) {  			spin_lock_irq(&chip->reg_lock);  			azx_update_rirb(chip); @@ -803,7 +805,7 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus,  		}  		if (time_after(jiffies, timeout))  			break; -		if (bus->needs_damn_long_delay) +		if (bus->needs_damn_long_delay || loopcounter > 3000)  			msleep(2); /* temporary workaround */  		else {  			udelay(10); @@ -2351,6 +2353,17 @@ static void azx_power_notify(struct hda_bus *bus)   * power management   */ +static int snd_hda_codecs_inuse(struct hda_bus *bus) +{ +	struct hda_codec *codec; + +	list_for_each_entry(codec, &bus->codec_list, list) { +		if (snd_hda_codec_needs_resume(codec)) +			return 1; +	} +	return 0; +} +  static int azx_suspend(struct pci_dev *pci, pm_message_t state)  {  	struct snd_card *card = pci_get_drvdata(pci); @@ -2397,7 +2410,8 @@ static int azx_resume(struct pci_dev *pci)  		return -EIO;  	azx_init_pci(chip); -	azx_init_chip(chip, 1); +	if (snd_hda_codecs_inuse(chip->bus)) +		azx_init_chip(chip, 1);  	snd_hda_resume(chip->bus);  	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 818f90bc7d5..7810913d07a 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[] = {  	SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",  		      ALC882_FIXUP_ACER_ASPIRE_4930G),  	SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210), +	SND_PCI_QUIRK(0x1025, 0x021e, "Acer Aspire 5739G", +		      ALC882_FIXUP_ACER_ASPIRE_4930G),  	SND_PCI_QUIRK(0x1025, 0x0259, "Acer Aspire 5935", ALC889_FIXUP_DAC_ROUTE),  	SND_PCI_QUIRK(0x1025, 0x026b, "Acer Aspire 8940G", ALC882_FIXUP_ACER_ASPIRE_8930G),  	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[] = {  	SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_IMAC91_VREF),  	SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD), +	SND_PCI_QUIRK(0x1462, 0x7350, "MSI-7350", ALC889_FIXUP_CD),  	SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3),  	SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte EP45-DS3", ALC889_FIXUP_CD),  	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)  	snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_PROC_COEF, tmp | 0x80);  	}  #endif -	alc_auto_parse_customize_define(codec); -  	alc_fix_pll_init(codec, 0x20, 0x0a, 10);  	alc_pick_fixup(codec, NULL, alc262_fixup_tbl, alc262_fixups);  	alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); +	alc_auto_parse_customize_define(codec); +  	/* automatic parse from the BIOS config */  	err = alc262_parse_auto_config(codec);  	if (err < 0) @@ -6249,8 +6252,6 @@ static int patch_alc269(struct hda_codec *codec)  	spec->mixer_nid = 0x0b; -	alc_auto_parse_customize_define(codec); -  	err = alc_codec_rename_from_preset(codec);  	if (err < 0)  		goto error; @@ -6283,6 +6284,8 @@ static int patch_alc269(struct hda_codec *codec)  		       alc269_fixup_tbl, alc269_fixups);  	alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); +	alc_auto_parse_customize_define(codec); +  	/* automatic parse from the BIOS config */  	err = alc269_parse_auto_config(codec);  	if (err < 0) @@ -6859,8 +6862,6 @@ static int patch_alc662(struct hda_codec *codec)  	/* handle multiple HPs as is */  	spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP; -	alc_auto_parse_customize_define(codec); -  	alc_fix_pll_init(codec, 0x20, 0x04, 15);  	err = alc_codec_rename_from_preset(codec); @@ -6877,6 +6878,9 @@ static int patch_alc662(struct hda_codec *codec)  	alc_pick_fixup(codec, alc662_fixup_models,  		       alc662_fixup_tbl, alc662_fixups);  	alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); + +	alc_auto_parse_customize_define(codec); +  	/* automatic parse from the BIOS config */  	err = alc662_parse_auto_config(codec);  	if (err < 0) diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 4742cac26aa..2cb1e08f962 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)  		def_conf = get_defcfg_connect(def_conf);  		/* skip any ports that don't have jacks since presence   		 * detection is useless */ -		if (def_conf != AC_JACK_PORT_COMPLEX) { -			if (def_conf != AC_JACK_PORT_NONE) -				stac_toggle_power_map(codec, nid, 1); +		if (def_conf != AC_JACK_PORT_NONE && +		    !is_jack_detectable(codec, nid)) { +			stac_toggle_power_map(codec, nid, 1);  			continue;  		}  		if (enable_pin_detect(codec, nid, STAC_PWR_EVENT)) { diff --git a/sound/pci/rme9652/hdsp.c b/sound/pci/rme9652/hdsp.c index b68cdec03b9..0b2aea2ce17 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)  	strcpy(hw->name, "HDSP hwdep interface");  	hw->ops.ioctl = snd_hdsp_hwdep_ioctl; +	hw->ops.ioctl_compat = snd_hdsp_hwdep_ioctl;  	return 0;  } diff --git a/sound/soc/blackfin/bf5xx-ssm2602.c b/sound/soc/blackfin/bf5xx-ssm2602.c index df3ac73f877..b39ad356b92 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[] = {  		.platform_name = "bfin-i2s-pcm-audio",  		.codec_name = "ssm2602.0-001b",  		.ops = &bf5xx_ssm2602_ops, +		.dai_fmt = BF5XX_SSM2602_DAIFMT,  	},  	{  		.name = "ssm2602", @@ -108,6 +109,7 @@ static struct snd_soc_dai_link bf5xx_ssm2602_dai[] = {  		.platform_name = "bfin-i2s-pcm-audio",  		.codec_name = "ssm2602.0-001b",  		.ops = &bf5xx_ssm2602_ops, +		.dai_fmt = BF5XX_SSM2602_DAIFMT,  	},  }; diff --git a/sound/soc/codecs/cs42l73.c b/sound/soc/codecs/cs42l73.c index 07c44b71f09..3686417f5ea 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[] = {  			attn_tlv),  	SOC_SINGLE_TLV("SPK-IP Mono Volume", -			CS42L73_SPKMIPMA, 0, 0x3E, 1, attn_tlv), +			CS42L73_SPKMIPMA, 0, 0x3F, 1, attn_tlv),  	SOC_SINGLE_TLV("SPK-XSP Mono Volume", -			CS42L73_SPKMXSPA, 0, 0x3E, 1, attn_tlv), +			CS42L73_SPKMXSPA, 0, 0x3F, 1, attn_tlv),  	SOC_SINGLE_TLV("SPK-ASP Mono Volume", -			CS42L73_SPKMASPA, 0, 0x3E, 1, attn_tlv), +			CS42L73_SPKMASPA, 0, 0x3F, 1, attn_tlv),  	SOC_SINGLE_TLV("SPK-VSP Mono Volume", -			CS42L73_SPKMVSPMA, 0, 0x3E, 1, attn_tlv), +			CS42L73_SPKMVSPMA, 0, 0x3F, 1, attn_tlv),  	SOC_SINGLE_TLV("ESL-IP Mono Volume", -			CS42L73_ESLMIPMA, 0, 0x3E, 1, attn_tlv), +			CS42L73_ESLMIPMA, 0, 0x3F, 1, attn_tlv),  	SOC_SINGLE_TLV("ESL-XSP Mono Volume", -			CS42L73_ESLMXSPA, 0, 0x3E, 1, attn_tlv), +			CS42L73_ESLMXSPA, 0, 0x3F, 1, attn_tlv),  	SOC_SINGLE_TLV("ESL-ASP Mono Volume", -			CS42L73_ESLMASPA, 0, 0x3E, 1, attn_tlv), +			CS42L73_ESLMASPA, 0, 0x3F, 1, attn_tlv),  	SOC_SINGLE_TLV("ESL-VSP Mono Volume", -			CS42L73_ESLMVSPMA, 0, 0x3E, 1, attn_tlv), +			CS42L73_ESLMVSPMA, 0, 0x3F, 1, attn_tlv),  	SOC_ENUM("IP Digital Swap/Mono Select", ip_swap_enum), diff --git a/sound/soc/codecs/tlv320aic23.c b/sound/soc/codecs/tlv320aic23.c index 16d55f91a65..df1e07ffac3 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,  static int tlv320aic23_set_bias_level(struct snd_soc_codec *codec,  				      enum snd_soc_bias_level level)  { -	u16 reg = snd_soc_read(codec, TLV320AIC23_PWR) & 0xff7f; +	u16 reg = snd_soc_read(codec, TLV320AIC23_PWR) & 0x17f;  	switch (level) {  	case SND_SOC_BIAS_ON: @@ -491,7 +491,7 @@ static int tlv320aic23_set_bias_level(struct snd_soc_codec *codec,  	case SND_SOC_BIAS_OFF:  		/* everything off, dac mute, inactive */  		snd_soc_write(codec, TLV320AIC23_ACTIVE, 0x0); -		snd_soc_write(codec, TLV320AIC23_PWR, 0xffff); +		snd_soc_write(codec, TLV320AIC23_PWR, 0x1ff);  		break;  	}  	codec->dapm.bias_level = level; diff --git a/sound/soc/codecs/wm8350.c b/sound/soc/codecs/wm8350.c index 8c4c9591ec0..aa12c6b6bee 100644 --- a/sound/soc/codecs/wm8350.c +++ b/sound/soc/codecs/wm8350.c @@ -60,7 +60,7 @@ struct wm8350_jack_data {  };  struct wm8350_data { -	struct snd_soc_codec codec; +	struct wm8350 *wm8350;  	struct wm8350_output out1;  	struct wm8350_output out2;  	struct wm8350_jack_data hpl; @@ -1309,7 +1309,7 @@ static void wm8350_hp_work(struct wm8350_data *priv,  			   struct wm8350_jack_data *jack,  			   u16 mask)  { -	struct wm8350 *wm8350 = priv->codec.control_data; +	struct wm8350 *wm8350 = priv->wm8350;  	u16 reg;  	int report; @@ -1342,7 +1342,7 @@ static void wm8350_hpr_work(struct work_struct *work)  static irqreturn_t wm8350_hp_jack_handler(int irq, void *data)  {  	struct wm8350_data *priv = data; -	struct wm8350 *wm8350 = priv->codec.control_data; +	struct wm8350 *wm8350 = priv->wm8350;  	struct wm8350_jack_data *jack = NULL;  	switch (irq - wm8350->irq_base) { @@ -1427,7 +1427,7 @@ EXPORT_SYMBOL_GPL(wm8350_hp_jack_detect);  static irqreturn_t wm8350_mic_handler(int irq, void *data)  {  	struct wm8350_data *priv = data; -	struct wm8350 *wm8350 = priv->codec.control_data; +	struct wm8350 *wm8350 = priv->wm8350;  	u16 reg;  	int report = 0; @@ -1536,6 +1536,8 @@ static  int wm8350_codec_probe(struct snd_soc_codec *codec)  		return -ENOMEM;  	snd_soc_codec_set_drvdata(codec, priv); +	priv->wm8350 = wm8350; +  	for (i = 0; i < ARRAY_SIZE(supply_names); i++)  		priv->supplies[i].supply = supply_names[i]; @@ -1544,7 +1546,6 @@ static  int wm8350_codec_probe(struct snd_soc_codec *codec)  	if (ret != 0)  		return ret; -	wm8350->codec.codec = codec;  	codec->control_data = wm8350;  	/* 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 6c1fe3afd4b..2de12ebe43b 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,  		snd_soc_update_bits(codec, WM8994_POWER_MANAGEMENT_5,  				    WM8994_AIF2DACL_ENA |  				    WM8994_AIF2DACR_ENA, 0); -		snd_soc_update_bits(codec, WM8994_POWER_MANAGEMENT_5, +		snd_soc_update_bits(codec, WM8994_POWER_MANAGEMENT_4,  				    WM8994_AIF2ADCL_ENA |  				    WM8994_AIF2ADCR_ENA, 0); diff --git a/sound/soc/codecs/wm_hubs.c b/sound/soc/codecs/wm_hubs.c index f13f2886339..6c028c47060 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,  			    enum snd_soc_bias_level level)  {  	struct wm_hubs_data *hubs = snd_soc_codec_get_drvdata(codec); -	int val; +	int mask, val;  	switch (level) {  	case SND_SOC_BIAS_STANDBY: @@ -1047,6 +1047,13 @@ void wm_hubs_set_bias_level(struct snd_soc_codec *codec,  	case SND_SOC_BIAS_ON:  		/* Turn off any unneded single ended outputs */  		val = 0; +		mask = 0; + +		if (hubs->lineout1_se) +			mask |= WM8993_LINEOUT1N_ENA | WM8993_LINEOUT1P_ENA; + +		if (hubs->lineout2_se) +			mask |= WM8993_LINEOUT2N_ENA | WM8993_LINEOUT2P_ENA;  		if (hubs->lineout1_se && hubs->lineout1n_ena)  			val |= WM8993_LINEOUT1N_ENA; @@ -1061,11 +1068,7 @@ void wm_hubs_set_bias_level(struct snd_soc_codec *codec,  			val |= WM8993_LINEOUT2P_ENA;  		snd_soc_update_bits(codec, WM8993_POWER_MANAGEMENT_3, -				    WM8993_LINEOUT1N_ENA | -				    WM8993_LINEOUT1P_ENA | -				    WM8993_LINEOUT2N_ENA | -				    WM8993_LINEOUT2P_ENA, -				    val); +				    mask, val);  		/* Remove the input clamps */  		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 a59bd352d34..5a649da9122 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)  	}  out: +	/* free preallocated buffers in case of error */ +	if (ret) +		omap_pcm_free_dma_buffers(pcm); +  	return ret;  } diff --git a/sound/soc/samsung/s3c2412-i2s.c b/sound/soc/samsung/s3c2412-i2s.c index 72185078ddf..79fbeea99d4 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 = {  static __devinit int s3c2412_iis_dev_probe(struct platform_device *pdev)  { -	return snd_soc_register_dai(&pdev->dev, &s3c2412_i2s_dai); +	return s3c_i2sv2_register_dai(&pdev->dev, -1, &s3c2412_i2s_dai);  }  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 9d9ad8d61c0..8526e1edaf4 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)  	return codec_freq;  } -static struct clk_ops siumckb_clk_ops = { +static struct sh_clk_ops siumckb_clk_ops = {  	.recalc = siumckb_recalc,  }; diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 1d6a80c9f4c..c88d9741b9e 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,  	int i, ret;  	num_routes = of_property_count_strings(np, propname); -	if (num_routes & 1) { +	if (num_routes < 0 || num_routes & 1) {  		dev_err(card->dev, -			"Property '%s's length is not even\n", -			propname); +		     "Property '%s' does not exist or its length is not even\n", +		     propname);  		return -EINVAL;  	}  	num_routes /= 2;  |