diff options
312 files changed, 3175 insertions, 1557 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index d9a203b058f1..fd248a318211 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
| @@ -2598,6 +2598,8 @@ bytes respectively. Such letter suffixes can also be entirely omitted. | |||
| 2598 | unlock ejectable media); | 2598 | unlock ejectable media); |
| 2599 | m = MAX_SECTORS_64 (don't transfer more | 2599 | m = MAX_SECTORS_64 (don't transfer more |
| 2600 | than 64 sectors = 32 KB at a time); | 2600 | than 64 sectors = 32 KB at a time); |
| 2601 | n = INITIAL_READ10 (force a retry of the | ||
| 2602 | initial READ(10) command); | ||
| 2601 | o = CAPACITY_OK (accept the capacity | 2603 | o = CAPACITY_OK (accept the capacity |
| 2602 | reported by the device); | 2604 | reported by the device); |
| 2603 | r = IGNORE_RESIDUE (the device reports | 2605 | r = IGNORE_RESIDUE (the device reports |
diff --git a/MAINTAINERS b/MAINTAINERS index fb0294919adc..e50fc6eb99e0 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -1739,7 +1739,7 @@ S: Supported | |||
| 1739 | F: drivers/net/enic/ | 1739 | F: drivers/net/enic/ |
| 1740 | 1740 | ||
| 1741 | CIRRUS LOGIC EP93XX ETHERNET DRIVER | 1741 | CIRRUS LOGIC EP93XX ETHERNET DRIVER |
| 1742 | M: Lennert Buytenhek <kernel@wantstofly.org> | 1742 | M: Hartley Sweeten <hsweeten@visionengravers.com> |
| 1743 | L: netdev@vger.kernel.org | 1743 | L: netdev@vger.kernel.org |
| 1744 | S: Maintained | 1744 | S: Maintained |
| 1745 | F: drivers/net/arm/ep93xx_eth.c | 1745 | F: drivers/net/arm/ep93xx_eth.c |
| @@ -4945,6 +4945,7 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/epip/linux-2.6-unicore32.gi | |||
| 4945 | F: drivers/input/serio/i8042-unicore32io.h | 4945 | F: drivers/input/serio/i8042-unicore32io.h |
| 4946 | F: drivers/i2c/busses/i2c-puv3.c | 4946 | F: drivers/i2c/busses/i2c-puv3.c |
| 4947 | F: drivers/video/fb-puv3.c | 4947 | F: drivers/video/fb-puv3.c |
| 4948 | F: drivers/rtc/rtc-puv3.c | ||
| 4948 | 4949 | ||
| 4949 | PMC SIERRA MaxRAID DRIVER | 4950 | PMC SIERRA MaxRAID DRIVER |
| 4950 | M: Anil Ravindranath <anil_ravindranath@pmc-sierra.com> | 4951 | M: Anil Ravindranath <anil_ravindranath@pmc-sierra.com> |
| @@ -6444,9 +6445,11 @@ S: Maintained | |||
| 6444 | F: drivers/media/video/et61x251/ | 6445 | F: drivers/media/video/et61x251/ |
| 6445 | 6446 | ||
| 6446 | USB GADGET/PERIPHERAL SUBSYSTEM | 6447 | USB GADGET/PERIPHERAL SUBSYSTEM |
| 6448 | M: Felipe Balbi <balbi@ti.com> | ||
| 6447 | L: linux-usb@vger.kernel.org | 6449 | L: linux-usb@vger.kernel.org |
| 6448 | W: http://www.linux-usb.org/gadget | 6450 | W: http://www.linux-usb.org/gadget |
| 6449 | S: Orphan | 6451 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git |
| 6452 | S: Maintained | ||
| 6450 | F: drivers/usb/gadget/ | 6453 | F: drivers/usb/gadget/ |
| 6451 | F: include/linux/usb/gadget* | 6454 | F: include/linux/usb/gadget* |
| 6452 | 6455 | ||
| @@ -378,7 +378,7 @@ KBUILD_LDFLAGS_MODULE := -T $(srctree)/scripts/module-common.lds | |||
| 378 | 378 | ||
| 379 | # Read KERNELRELEASE from include/config/kernel.release (if it exists) | 379 | # Read KERNELRELEASE from include/config/kernel.release (if it exists) |
| 380 | KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null) | 380 | KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null) |
| 381 | KERNELVERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) | 381 | KERNELVERSION = $(VERSION)$(if $(PATCHLEVEL),.$(PATCHLEVEL)$(if $(SUBLEVEL),.$(SUBLEVEL)))$(EXTRAVERSION) |
| 382 | 382 | ||
| 383 | export VERSION PATCHLEVEL SUBLEVEL KERNELRELEASE KERNELVERSION | 383 | export VERSION PATCHLEVEL SUBLEVEL KERNELRELEASE KERNELVERSION |
| 384 | export ARCH SRCARCH CONFIG_SHELL HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC | 384 | export ARCH SRCARCH CONFIG_SHELL HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC |
| @@ -1005,7 +1005,7 @@ endef | |||
| 1005 | 1005 | ||
| 1006 | define filechk_version.h | 1006 | define filechk_version.h |
| 1007 | (echo \#define LINUX_VERSION_CODE $(shell \ | 1007 | (echo \#define LINUX_VERSION_CODE $(shell \ |
| 1008 | expr $(VERSION) \* 65536 + $(PATCHLEVEL) \* 256 + $(SUBLEVEL)); \ | 1008 | expr $(VERSION) \* 65536 + 0$(PATCHLEVEL) \* 256 + 0$(SUBLEVEL)); \ |
| 1009 | echo '#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))';) | 1009 | echo '#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))';) |
| 1010 | endef | 1010 | endef |
| 1011 | 1011 | ||
| @@ -1110,11 +1110,6 @@ modules_install: _modinst_ _modinst_post | |||
| 1110 | 1110 | ||
| 1111 | PHONY += _modinst_ | 1111 | PHONY += _modinst_ |
| 1112 | _modinst_: | 1112 | _modinst_: |
| 1113 | @if [ -z "`$(DEPMOD) -V 2>/dev/null | grep module-init-tools`" ]; then \ | ||
| 1114 | echo "Warning: you may need to install module-init-tools"; \ | ||
| 1115 | echo "See http://www.codemonkey.org.uk/docs/post-halloween-2.6.txt";\ | ||
| 1116 | sleep 1; \ | ||
| 1117 | fi | ||
| 1118 | @rm -rf $(MODLIB)/kernel | 1113 | @rm -rf $(MODLIB)/kernel |
| 1119 | @rm -f $(MODLIB)/source | 1114 | @rm -f $(MODLIB)/source |
| 1120 | @mkdir -p $(MODLIB)/kernel | 1115 | @mkdir -p $(MODLIB)/kernel |
| @@ -1531,12 +1526,7 @@ quiet_cmd_rmfiles = $(if $(wildcard $(rm-files)),CLEAN $(wildcard $(rm-files)) | |||
| 1531 | 1526 | ||
| 1532 | # Run depmod only if we have System.map and depmod is executable | 1527 | # Run depmod only if we have System.map and depmod is executable |
| 1533 | quiet_cmd_depmod = DEPMOD $(KERNELRELEASE) | 1528 | quiet_cmd_depmod = DEPMOD $(KERNELRELEASE) |
| 1534 | cmd_depmod = \ | 1529 | cmd_depmod = $(srctree)/scripts/depmod.sh $(DEPMOD) $(KERNELRELEASE) |
| 1535 | if [ -r System.map -a -x $(DEPMOD) ]; then \ | ||
| 1536 | $(DEPMOD) -ae -F System.map \ | ||
| 1537 | $(if $(strip $(INSTALL_MOD_PATH)), -b $(INSTALL_MOD_PATH) ) \ | ||
| 1538 | $(KERNELRELEASE); \ | ||
| 1539 | fi | ||
| 1540 | 1530 | ||
| 1541 | # Create temporary dir for module support files | 1531 | # Create temporary dir for module support files |
| 1542 | # clean it up only when building all modules | 1532 | # clean it up only when building all modules |
diff --git a/arch/arm/mach-ep93xx/core.c b/arch/arm/mach-ep93xx/core.c index 82079545adc4..1d4b65fd673e 100644 --- a/arch/arm/mach-ep93xx/core.c +++ b/arch/arm/mach-ep93xx/core.c | |||
| @@ -402,11 +402,15 @@ static struct resource ep93xx_eth_resource[] = { | |||
| 402 | } | 402 | } |
| 403 | }; | 403 | }; |
| 404 | 404 | ||
| 405 | static u64 ep93xx_eth_dma_mask = DMA_BIT_MASK(32); | ||
| 406 | |||
| 405 | static struct platform_device ep93xx_eth_device = { | 407 | static struct platform_device ep93xx_eth_device = { |
| 406 | .name = "ep93xx-eth", | 408 | .name = "ep93xx-eth", |
| 407 | .id = -1, | 409 | .id = -1, |
| 408 | .dev = { | 410 | .dev = { |
| 409 | .platform_data = &ep93xx_eth_data, | 411 | .platform_data = &ep93xx_eth_data, |
| 412 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
| 413 | .dma_mask = &ep93xx_eth_dma_mask, | ||
| 410 | }, | 414 | }, |
| 411 | .num_resources = ARRAY_SIZE(ep93xx_eth_resource), | 415 | .num_resources = ARRAY_SIZE(ep93xx_eth_resource), |
| 412 | .resource = ep93xx_eth_resource, | 416 | .resource = ep93xx_eth_resource, |
diff --git a/arch/arm/mach-exynos4/Kconfig b/arch/arm/mach-exynos4/Kconfig index b92c1e557145..1435fc31c4b2 100644 --- a/arch/arm/mach-exynos4/Kconfig +++ b/arch/arm/mach-exynos4/Kconfig | |||
| @@ -91,6 +91,11 @@ config EXYNOS4_SETUP_FIMC | |||
| 91 | help | 91 | help |
| 92 | Common setup code for the camera interfaces. | 92 | Common setup code for the camera interfaces. |
| 93 | 93 | ||
| 94 | config EXYNOS4_SETUP_USB_PHY | ||
| 95 | bool | ||
| 96 | help | ||
| 97 | Common setup code for USB PHY controller | ||
| 98 | |||
| 94 | # machine support | 99 | # machine support |
| 95 | 100 | ||
| 96 | menu "EXYNOS4 Machines" | 101 | menu "EXYNOS4 Machines" |
| @@ -176,6 +181,7 @@ config MACH_NURI | |||
| 176 | select EXYNOS4_SETUP_I2C3 | 181 | select EXYNOS4_SETUP_I2C3 |
| 177 | select EXYNOS4_SETUP_I2C5 | 182 | select EXYNOS4_SETUP_I2C5 |
| 178 | select EXYNOS4_SETUP_SDHCI | 183 | select EXYNOS4_SETUP_SDHCI |
| 184 | select EXYNOS4_SETUP_USB_PHY | ||
| 179 | select SAMSUNG_DEV_PWM | 185 | select SAMSUNG_DEV_PWM |
| 180 | help | 186 | help |
| 181 | Machine support for Samsung Mobile NURI Board. | 187 | Machine support for Samsung Mobile NURI Board. |
diff --git a/arch/arm/mach-exynos4/Makefile b/arch/arm/mach-exynos4/Makefile index a9bb94fabaa7..60fe5ecf3599 100644 --- a/arch/arm/mach-exynos4/Makefile +++ b/arch/arm/mach-exynos4/Makefile | |||
| @@ -56,4 +56,4 @@ obj-$(CONFIG_EXYNOS4_SETUP_KEYPAD) += setup-keypad.o | |||
| 56 | obj-$(CONFIG_EXYNOS4_SETUP_SDHCI) += setup-sdhci.o | 56 | obj-$(CONFIG_EXYNOS4_SETUP_SDHCI) += setup-sdhci.o |
| 57 | obj-$(CONFIG_EXYNOS4_SETUP_SDHCI_GPIO) += setup-sdhci-gpio.o | 57 | obj-$(CONFIG_EXYNOS4_SETUP_SDHCI_GPIO) += setup-sdhci-gpio.o |
| 58 | 58 | ||
| 59 | obj-$(CONFIG_USB_SUPPORT) += usb-phy.o | 59 | obj-$(CONFIG_EXYNOS4_SETUP_USB_PHY) += setup-usb-phy.o |
diff --git a/arch/arm/mach-exynos4/cpu.c b/arch/arm/mach-exynos4/cpu.c index 08813a6f66b1..9babe4473e88 100644 --- a/arch/arm/mach-exynos4/cpu.c +++ b/arch/arm/mach-exynos4/cpu.c | |||
| @@ -98,7 +98,7 @@ static struct map_desc exynos4_iodesc[] __initdata = { | |||
| 98 | .length = SZ_4K, | 98 | .length = SZ_4K, |
| 99 | .type = MT_DEVICE, | 99 | .type = MT_DEVICE, |
| 100 | }, { | 100 | }, { |
| 101 | .virtual = (unsigned long)S5P_VA_USB_HSPHY, | 101 | .virtual = (unsigned long)S3C_VA_USB_HSPHY, |
| 102 | .pfn = __phys_to_pfn(EXYNOS4_PA_HSPHY), | 102 | .pfn = __phys_to_pfn(EXYNOS4_PA_HSPHY), |
| 103 | .length = SZ_4K, | 103 | .length = SZ_4K, |
| 104 | .type = MT_DEVICE, | 104 | .type = MT_DEVICE, |
diff --git a/arch/arm/mach-exynos4/include/mach/regs-usb-phy.h b/arch/arm/mach-exynos4/include/mach/regs-usb-phy.h index 703118d5173c..c337cf3a71bf 100644 --- a/arch/arm/mach-exynos4/include/mach/regs-usb-phy.h +++ b/arch/arm/mach-exynos4/include/mach/regs-usb-phy.h | |||
| @@ -11,7 +11,7 @@ | |||
| 11 | #ifndef __PLAT_S5P_REGS_USB_PHY_H | 11 | #ifndef __PLAT_S5P_REGS_USB_PHY_H |
| 12 | #define __PLAT_S5P_REGS_USB_PHY_H | 12 | #define __PLAT_S5P_REGS_USB_PHY_H |
| 13 | 13 | ||
| 14 | #define EXYNOS4_HSOTG_PHYREG(x) ((x) + S5P_VA_USB_HSPHY) | 14 | #define EXYNOS4_HSOTG_PHYREG(x) ((x) + S3C_VA_USB_HSPHY) |
| 15 | 15 | ||
| 16 | #define EXYNOS4_PHYPWR EXYNOS4_HSOTG_PHYREG(0x00) | 16 | #define EXYNOS4_PHYPWR EXYNOS4_HSOTG_PHYREG(0x00) |
| 17 | #define PHY1_HSIC_NORMAL_MASK (0xf << 9) | 17 | #define PHY1_HSIC_NORMAL_MASK (0xf << 9) |
diff --git a/arch/arm/mach-exynos4/usb-phy.c b/arch/arm/mach-exynos4/setup-usb-phy.c index 0883c1b824b9..0883c1b824b9 100644 --- a/arch/arm/mach-exynos4/usb-phy.c +++ b/arch/arm/mach-exynos4/setup-usb-phy.c | |||
diff --git a/arch/arm/mach-exynos4/time.c b/arch/arm/mach-exynos4/time.c index 86b9fa0d3639..ebb8f38d5405 100644 --- a/arch/arm/mach-exynos4/time.c +++ b/arch/arm/mach-exynos4/time.c | |||
| @@ -206,6 +206,7 @@ static cycle_t exynos4_pwm4_read(struct clocksource *cs) | |||
| 206 | return (cycle_t) ~__raw_readl(S3C_TIMERREG(0x40)); | 206 | return (cycle_t) ~__raw_readl(S3C_TIMERREG(0x40)); |
| 207 | } | 207 | } |
| 208 | 208 | ||
| 209 | #ifdef CONFIG_PM | ||
| 209 | static void exynos4_pwm4_resume(struct clocksource *cs) | 210 | static void exynos4_pwm4_resume(struct clocksource *cs) |
| 210 | { | 211 | { |
| 211 | unsigned long pclk; | 212 | unsigned long pclk; |
| @@ -218,6 +219,7 @@ static void exynos4_pwm4_resume(struct clocksource *cs) | |||
| 218 | exynos4_pwm_init(4, ~0); | 219 | exynos4_pwm_init(4, ~0); |
| 219 | exynos4_pwm_start(4, 1); | 220 | exynos4_pwm_start(4, 1); |
| 220 | } | 221 | } |
| 222 | #endif | ||
| 221 | 223 | ||
| 222 | struct clocksource pwm_clocksource = { | 224 | struct clocksource pwm_clocksource = { |
| 223 | .name = "pwm_timer4", | 225 | .name = "pwm_timer4", |
diff --git a/arch/arm/mach-s3c2410/Makefile b/arch/arm/mach-s3c2410/Makefile index 0d468e96e83e..81695353d8f4 100644 --- a/arch/arm/mach-s3c2410/Makefile +++ b/arch/arm/mach-s3c2410/Makefile | |||
| @@ -10,7 +10,6 @@ obj-n := | |||
| 10 | obj- := | 10 | obj- := |
| 11 | 11 | ||
| 12 | obj-$(CONFIG_CPU_S3C2410) += s3c2410.o | 12 | obj-$(CONFIG_CPU_S3C2410) += s3c2410.o |
| 13 | obj-$(CONFIG_CPU_S3C2410) += irq.o | ||
| 14 | obj-$(CONFIG_CPU_S3C2410_DMA) += dma.o | 13 | obj-$(CONFIG_CPU_S3C2410_DMA) += dma.o |
| 15 | obj-$(CONFIG_CPU_S3C2410_DMA) += dma.o | 14 | obj-$(CONFIG_CPU_S3C2410_DMA) += dma.o |
| 16 | obj-$(CONFIG_S3C2410_PM) += pm.o sleep.o | 15 | obj-$(CONFIG_S3C2410_PM) += pm.o sleep.o |
diff --git a/arch/arm/mach-s3c2410/irq.c b/arch/arm/mach-s3c2410/irq.c deleted file mode 100644 index 2854129f8cc7..000000000000 --- a/arch/arm/mach-s3c2410/irq.c +++ /dev/null | |||
| @@ -1,34 +0,0 @@ | |||
| 1 | /* linux/arch/arm/mach-s3c2410/irq.c | ||
| 2 | * | ||
| 3 | * Copyright (c) 2006 Simtec Electronics | ||
| 4 | * Ben Dooks <ben@simtec.co.uk> | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License as published by | ||
| 8 | * the Free Software Foundation; either version 2 of the License, or | ||
| 9 | * (at your option) any later version. | ||
| 10 | * | ||
| 11 | * This program is distributed in the hope that it will be useful, | ||
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 14 | * GNU General Public License for more details. | ||
| 15 | * | ||
| 16 | * You should have received a copy of the GNU General Public License | ||
| 17 | * along with this program; if not, write to the Free Software | ||
| 18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 19 | * | ||
| 20 | */ | ||
| 21 | |||
| 22 | #include <linux/init.h> | ||
| 23 | #include <linux/module.h> | ||
| 24 | #include <linux/interrupt.h> | ||
| 25 | #include <linux/ioport.h> | ||
| 26 | #include <linux/syscore_ops.h> | ||
| 27 | |||
| 28 | #include <plat/cpu.h> | ||
| 29 | #include <plat/pm.h> | ||
| 30 | |||
| 31 | struct syscore_ops s3c24xx_irq_syscore_ops = { | ||
| 32 | .suspend = s3c24xx_irq_suspend, | ||
| 33 | .resume = s3c24xx_irq_resume, | ||
| 34 | }; | ||
diff --git a/arch/arm/mach-s5pv210/cpufreq.c b/arch/arm/mach-s5pv210/cpufreq.c index 22046e2f53c2..153af8b359ec 100644 --- a/arch/arm/mach-s5pv210/cpufreq.c +++ b/arch/arm/mach-s5pv210/cpufreq.c | |||
| @@ -101,12 +101,14 @@ static void s5pv210_set_refresh(enum s5pv210_dmc_port ch, unsigned long freq) | |||
| 101 | unsigned long tmp, tmp1; | 101 | unsigned long tmp, tmp1; |
| 102 | void __iomem *reg = NULL; | 102 | void __iomem *reg = NULL; |
| 103 | 103 | ||
| 104 | if (ch == DMC0) | 104 | if (ch == DMC0) { |
| 105 | reg = (S5P_VA_DMC0 + 0x30); | 105 | reg = (S5P_VA_DMC0 + 0x30); |
| 106 | else if (ch == DMC1) | 106 | } else if (ch == DMC1) { |
| 107 | reg = (S5P_VA_DMC1 + 0x30); | 107 | reg = (S5P_VA_DMC1 + 0x30); |
| 108 | else | 108 | } else { |
| 109 | printk(KERN_ERR "Cannot find DMC port\n"); | 109 | printk(KERN_ERR "Cannot find DMC port\n"); |
| 110 | return; | ||
| 111 | } | ||
| 110 | 112 | ||
| 111 | /* Find current DRAM frequency */ | 113 | /* Find current DRAM frequency */ |
| 112 | tmp = s5pv210_dram_conf[ch].freq; | 114 | tmp = s5pv210_dram_conf[ch].freq; |
diff --git a/arch/arm/mach-ux500/cpu-db8500.c b/arch/arm/mach-ux500/cpu-db8500.c index c3c417656bd9..4598b06c8c55 100644 --- a/arch/arm/mach-ux500/cpu-db8500.c +++ b/arch/arm/mach-ux500/cpu-db8500.c | |||
| @@ -159,6 +159,9 @@ static void __init db8500_add_gpios(void) | |||
| 159 | /* No custom data yet */ | 159 | /* No custom data yet */ |
| 160 | }; | 160 | }; |
| 161 | 161 | ||
| 162 | if (cpu_is_u8500v2()) | ||
| 163 | pdata.supports_sleepmode = true; | ||
| 164 | |||
| 162 | dbx500_add_gpios(ARRAY_AND_SIZE(db8500_gpio_base), | 165 | dbx500_add_gpios(ARRAY_AND_SIZE(db8500_gpio_base), |
| 163 | IRQ_DB8500_GPIO0, &pdata); | 166 | IRQ_DB8500_GPIO0, &pdata); |
| 164 | } | 167 | } |
diff --git a/arch/arm/plat-nomadik/include/plat/gpio.h b/arch/arm/plat-nomadik/include/plat/gpio.h index ea19a5b2f227..d5d7e651269c 100644 --- a/arch/arm/plat-nomadik/include/plat/gpio.h +++ b/arch/arm/plat-nomadik/include/plat/gpio.h | |||
| @@ -90,6 +90,7 @@ struct nmk_gpio_platform_data { | |||
| 90 | int num_gpio; | 90 | int num_gpio; |
| 91 | u32 (*get_secondary_status)(unsigned int bank); | 91 | u32 (*get_secondary_status)(unsigned int bank); |
| 92 | void (*set_ioforce)(bool enable); | 92 | void (*set_ioforce)(bool enable); |
| 93 | bool supports_sleepmode; | ||
| 93 | }; | 94 | }; |
| 94 | 95 | ||
| 95 | #endif /* __ASM_PLAT_GPIO_H */ | 96 | #endif /* __ASM_PLAT_GPIO_H */ |
diff --git a/arch/arm/plat-s3c24xx/dma.c b/arch/arm/plat-s3c24xx/dma.c index c10d10c56e2e..2abf9660bc6c 100644 --- a/arch/arm/plat-s3c24xx/dma.c +++ b/arch/arm/plat-s3c24xx/dma.c | |||
| @@ -1199,7 +1199,7 @@ EXPORT_SYMBOL(s3c2410_dma_getposition); | |||
| 1199 | 1199 | ||
| 1200 | #ifdef CONFIG_PM | 1200 | #ifdef CONFIG_PM |
| 1201 | 1201 | ||
| 1202 | static void s3c2410_dma_suspend_chan(s3c2410_dma_chan *cp) | 1202 | static void s3c2410_dma_suspend_chan(struct s3c2410_dma_chan *cp) |
| 1203 | { | 1203 | { |
| 1204 | printk(KERN_DEBUG "suspending dma channel %d\n", cp->number); | 1204 | printk(KERN_DEBUG "suspending dma channel %d\n", cp->number); |
| 1205 | 1205 | ||
diff --git a/arch/arm/plat-s3c24xx/irq.c b/arch/arm/plat-s3c24xx/irq.c index 9aee7e1668b1..fc8c5f89954d 100644 --- a/arch/arm/plat-s3c24xx/irq.c +++ b/arch/arm/plat-s3c24xx/irq.c | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | #include <linux/interrupt.h> | 23 | #include <linux/interrupt.h> |
| 24 | #include <linux/ioport.h> | 24 | #include <linux/ioport.h> |
| 25 | #include <linux/sysdev.h> | 25 | #include <linux/sysdev.h> |
| 26 | #include <linux/syscore_ops.h> | ||
| 26 | 27 | ||
| 27 | #include <asm/irq.h> | 28 | #include <asm/irq.h> |
| 28 | #include <asm/mach/irq.h> | 29 | #include <asm/mach/irq.h> |
| @@ -668,3 +669,8 @@ void __init s3c24xx_init_irq(void) | |||
| 668 | 669 | ||
| 669 | irqdbf("s3c2410: registered interrupt handlers\n"); | 670 | irqdbf("s3c2410: registered interrupt handlers\n"); |
| 670 | } | 671 | } |
| 672 | |||
| 673 | struct syscore_ops s3c24xx_irq_syscore_ops = { | ||
| 674 | .suspend = s3c24xx_irq_suspend, | ||
| 675 | .resume = s3c24xx_irq_resume, | ||
| 676 | }; | ||
diff --git a/arch/arm/plat-s5p/dev-onenand.c b/arch/arm/plat-s5p/dev-onenand.c index 6db926202caa..20336c8f2479 100644 --- a/arch/arm/plat-s5p/dev-onenand.c +++ b/arch/arm/plat-s5p/dev-onenand.c | |||
| @@ -15,8 +15,6 @@ | |||
| 15 | 15 | ||
| 16 | #include <linux/kernel.h> | 16 | #include <linux/kernel.h> |
| 17 | #include <linux/platform_device.h> | 17 | #include <linux/platform_device.h> |
| 18 | #include <linux/mtd/mtd.h> | ||
| 19 | #include <linux/mtd/onenand.h> | ||
| 20 | 18 | ||
| 21 | #include <mach/irqs.h> | 19 | #include <mach/irqs.h> |
| 22 | #include <mach/map.h> | 20 | #include <mach/map.h> |
| @@ -45,13 +43,3 @@ struct platform_device s5p_device_onenand = { | |||
| 45 | .num_resources = ARRAY_SIZE(s5p_onenand_resources), | 43 | .num_resources = ARRAY_SIZE(s5p_onenand_resources), |
| 46 | .resource = s5p_onenand_resources, | 44 | .resource = s5p_onenand_resources, |
| 47 | }; | 45 | }; |
| 48 | |||
| 49 | void s5p_onenand_set_platdata(struct onenand_platform_data *pdata) | ||
| 50 | { | ||
| 51 | struct onenand_platform_data *pd; | ||
| 52 | |||
| 53 | pd = kmemdup(pdata, sizeof(struct onenand_platform_data), GFP_KERNEL); | ||
| 54 | if (!pd) | ||
| 55 | printk(KERN_ERR "%s: no memory for platform data\n", __func__); | ||
| 56 | s5p_device_onenand.dev.platform_data = pd; | ||
| 57 | } | ||
diff --git a/arch/arm/plat-s5p/include/plat/map-s5p.h b/arch/arm/plat-s5p/include/plat/map-s5p.h index a6c3d327ce72..d973d39666a3 100644 --- a/arch/arm/plat-s5p/include/plat/map-s5p.h +++ b/arch/arm/plat-s5p/include/plat/map-s5p.h | |||
| @@ -39,7 +39,7 @@ | |||
| 39 | #define S5P_VA_TWD S5P_VA_COREPERI(0x600) | 39 | #define S5P_VA_TWD S5P_VA_COREPERI(0x600) |
| 40 | #define S5P_VA_GIC_DIST S5P_VA_COREPERI(0x1000) | 40 | #define S5P_VA_GIC_DIST S5P_VA_COREPERI(0x1000) |
| 41 | 41 | ||
| 42 | #define S5P_VA_USB_HSPHY S3C_ADDR(0x02900000) | 42 | #define S3C_VA_USB_HSPHY S3C_ADDR(0x02900000) |
| 43 | 43 | ||
| 44 | #define VA_VIC(x) (S3C_VA_IRQ + ((x) * 0x10000)) | 44 | #define VA_VIC(x) (S3C_VA_IRQ + ((x) * 0x10000)) |
| 45 | #define VA_VIC0 VA_VIC(0) | 45 | #define VA_VIC0 VA_VIC(0) |
diff --git a/arch/arm/plat-samsung/dev-onenand.c b/arch/arm/plat-samsung/dev-onenand.c index 45ec73287d8c..f54ae71f0cd2 100644 --- a/arch/arm/plat-samsung/dev-onenand.c +++ b/arch/arm/plat-samsung/dev-onenand.c | |||
| @@ -13,8 +13,6 @@ | |||
| 13 | 13 | ||
| 14 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
| 15 | #include <linux/platform_device.h> | 15 | #include <linux/platform_device.h> |
| 16 | #include <linux/mtd/mtd.h> | ||
| 17 | #include <linux/mtd/onenand.h> | ||
| 18 | 16 | ||
| 19 | #include <mach/irqs.h> | 17 | #include <mach/irqs.h> |
| 20 | #include <mach/map.h> | 18 | #include <mach/map.h> |
| @@ -43,13 +41,3 @@ struct platform_device s3c_device_onenand = { | |||
| 43 | .num_resources = ARRAY_SIZE(s3c_onenand_resources), | 41 | .num_resources = ARRAY_SIZE(s3c_onenand_resources), |
| 44 | .resource = s3c_onenand_resources, | 42 | .resource = s3c_onenand_resources, |
| 45 | }; | 43 | }; |
| 46 | |||
| 47 | void s3c_onenand_set_platdata(struct onenand_platform_data *pdata) | ||
| 48 | { | ||
| 49 | struct onenand_platform_data *pd; | ||
| 50 | |||
| 51 | pd = kmemdup(pdata, sizeof(struct onenand_platform_data), GFP_KERNEL); | ||
| 52 | if (!pd) | ||
| 53 | printk(KERN_ERR "%s: no memory for platform data\n", __func__); | ||
| 54 | s3c_device_onenand.dev.platform_data = pd; | ||
| 55 | } | ||
diff --git a/arch/arm/plat-samsung/include/plat/devs.h b/arch/arm/plat-samsung/include/plat/devs.h index b61b8ee7cc52..4af108ff4112 100644 --- a/arch/arm/plat-samsung/include/plat/devs.h +++ b/arch/arm/plat-samsung/include/plat/devs.h | |||
| @@ -75,10 +75,8 @@ extern struct platform_device s5pc100_device_spi1; | |||
| 75 | extern struct platform_device s5pc100_device_spi2; | 75 | extern struct platform_device s5pc100_device_spi2; |
| 76 | extern struct platform_device s5pv210_device_spi0; | 76 | extern struct platform_device s5pv210_device_spi0; |
| 77 | extern struct platform_device s5pv210_device_spi1; | 77 | extern struct platform_device s5pv210_device_spi1; |
| 78 | extern struct platform_device s5p6440_device_spi0; | 78 | extern struct platform_device s5p64x0_device_spi0; |
| 79 | extern struct platform_device s5p6440_device_spi1; | 79 | extern struct platform_device s5p64x0_device_spi1; |
| 80 | extern struct platform_device s5p6450_device_spi0; | ||
| 81 | extern struct platform_device s5p6450_device_spi1; | ||
| 82 | 80 | ||
| 83 | extern struct platform_device s3c_device_hwmon; | 81 | extern struct platform_device s3c_device_hwmon; |
| 84 | 82 | ||
diff --git a/arch/powerpc/boot/.gitignore b/arch/powerpc/boot/.gitignore index 3d80c3e9cf60..12da77ec0228 100644 --- a/arch/powerpc/boot/.gitignore +++ b/arch/powerpc/boot/.gitignore | |||
| @@ -1,5 +1,4 @@ | |||
| 1 | addnote | 1 | addnote |
| 2 | dtc | ||
| 3 | empty.c | 2 | empty.c |
| 4 | hack-coff | 3 | hack-coff |
| 5 | infblock.c | 4 | infblock.c |
diff --git a/arch/powerpc/boot/dtc-src/.gitignore b/arch/powerpc/boot/dtc-src/.gitignore deleted file mode 100644 index a7c3f94e5e75..000000000000 --- a/arch/powerpc/boot/dtc-src/.gitignore +++ /dev/null | |||
| @@ -1,3 +0,0 @@ | |||
| 1 | dtc-lexer.lex.c | ||
| 2 | dtc-parser.tab.c | ||
| 3 | dtc-parser.tab.h | ||
diff --git a/arch/powerpc/include/asm/rio.h b/arch/powerpc/include/asm/rio.h index d902abd33995..b1d2deceeedb 100644 --- a/arch/powerpc/include/asm/rio.h +++ b/arch/powerpc/include/asm/rio.h | |||
| @@ -14,7 +14,7 @@ | |||
| 14 | #define ASM_PPC_RIO_H | 14 | #define ASM_PPC_RIO_H |
| 15 | 15 | ||
| 16 | extern void platform_rio_init(void); | 16 | extern void platform_rio_init(void); |
| 17 | #ifdef CONFIG_RAPIDIO | 17 | #ifdef CONFIG_FSL_RIO |
| 18 | extern int fsl_rio_mcheck_exception(struct pt_regs *); | 18 | extern int fsl_rio_mcheck_exception(struct pt_regs *); |
| 19 | #else | 19 | #else |
| 20 | static inline int fsl_rio_mcheck_exception(struct pt_regs *regs) {return 0; } | 20 | static inline int fsl_rio_mcheck_exception(struct pt_regs *regs) {return 0; } |
diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c index 34d2722b9451..9fb933248ab6 100644 --- a/arch/powerpc/kernel/cputable.c +++ b/arch/powerpc/kernel/cputable.c | |||
| @@ -1979,7 +1979,7 @@ static struct cpu_spec __initdata cpu_specs[] = { | |||
| 1979 | .pvr_value = 0x80240000, | 1979 | .pvr_value = 0x80240000, |
| 1980 | .cpu_name = "e5500", | 1980 | .cpu_name = "e5500", |
| 1981 | .cpu_features = CPU_FTRS_E5500, | 1981 | .cpu_features = CPU_FTRS_E5500, |
| 1982 | .cpu_user_features = COMMON_USER_BOOKE, | 1982 | .cpu_user_features = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU, |
| 1983 | .mmu_features = MMU_FTR_TYPE_FSL_E | MMU_FTR_BIG_PHYS | | 1983 | .mmu_features = MMU_FTR_TYPE_FSL_E | MMU_FTR_BIG_PHYS | |
| 1984 | MMU_FTR_USE_TLBILX, | 1984 | MMU_FTR_USE_TLBILX, |
| 1985 | .icache_bsize = 64, | 1985 | .icache_bsize = 64, |
diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c index f2c906b1d8d3..8c3112a57cf2 100644 --- a/arch/powerpc/kernel/prom.c +++ b/arch/powerpc/kernel/prom.c | |||
| @@ -82,11 +82,29 @@ static int __init early_parse_mem(char *p) | |||
| 82 | } | 82 | } |
| 83 | early_param("mem", early_parse_mem); | 83 | early_param("mem", early_parse_mem); |
| 84 | 84 | ||
| 85 | /* | ||
| 86 | * overlaps_initrd - check for overlap with page aligned extension of | ||
| 87 | * initrd. | ||
| 88 | */ | ||
| 89 | static inline int overlaps_initrd(unsigned long start, unsigned long size) | ||
| 90 | { | ||
| 91 | #ifdef CONFIG_BLK_DEV_INITRD | ||
| 92 | if (!initrd_start) | ||
| 93 | return 0; | ||
| 94 | |||
| 95 | return (start + size) > _ALIGN_DOWN(initrd_start, PAGE_SIZE) && | ||
| 96 | start <= _ALIGN_UP(initrd_end, PAGE_SIZE); | ||
| 97 | #else | ||
| 98 | return 0; | ||
| 99 | #endif | ||
| 100 | } | ||
| 101 | |||
| 85 | /** | 102 | /** |
| 86 | * move_device_tree - move tree to an unused area, if needed. | 103 | * move_device_tree - move tree to an unused area, if needed. |
| 87 | * | 104 | * |
| 88 | * The device tree may be allocated beyond our memory limit, or inside the | 105 | * The device tree may be allocated beyond our memory limit, or inside the |
| 89 | * crash kernel region for kdump. If so, move it out of the way. | 106 | * crash kernel region for kdump, or within the page aligned range of initrd. |
| 107 | * If so, move it out of the way. | ||
| 90 | */ | 108 | */ |
| 91 | static void __init move_device_tree(void) | 109 | static void __init move_device_tree(void) |
| 92 | { | 110 | { |
| @@ -99,7 +117,8 @@ static void __init move_device_tree(void) | |||
| 99 | size = be32_to_cpu(initial_boot_params->totalsize); | 117 | size = be32_to_cpu(initial_boot_params->totalsize); |
| 100 | 118 | ||
| 101 | if ((memory_limit && (start + size) > PHYSICAL_START + memory_limit) || | 119 | if ((memory_limit && (start + size) > PHYSICAL_START + memory_limit) || |
| 102 | overlaps_crashkernel(start, size)) { | 120 | overlaps_crashkernel(start, size) || |
| 121 | overlaps_initrd(start, size)) { | ||
| 103 | p = __va(memblock_alloc(size, PAGE_SIZE)); | 122 | p = __va(memblock_alloc(size, PAGE_SIZE)); |
| 104 | memcpy(p, initial_boot_params, size); | 123 | memcpy(p, initial_boot_params, size); |
| 105 | initial_boot_params = (struct boot_param_header *)p; | 124 | initial_boot_params = (struct boot_param_header *)p; |
| @@ -555,7 +574,9 @@ static void __init early_reserve_mem(void) | |||
| 555 | #ifdef CONFIG_BLK_DEV_INITRD | 574 | #ifdef CONFIG_BLK_DEV_INITRD |
| 556 | /* then reserve the initrd, if any */ | 575 | /* then reserve the initrd, if any */ |
| 557 | if (initrd_start && (initrd_end > initrd_start)) | 576 | if (initrd_start && (initrd_end > initrd_start)) |
| 558 | memblock_reserve(__pa(initrd_start), initrd_end - initrd_start); | 577 | memblock_reserve(_ALIGN_DOWN(__pa(initrd_start), PAGE_SIZE), |
| 578 | _ALIGN_UP(initrd_end, PAGE_SIZE) - | ||
| 579 | _ALIGN_DOWN(initrd_start, PAGE_SIZE)); | ||
| 559 | #endif /* CONFIG_BLK_DEV_INITRD */ | 580 | #endif /* CONFIG_BLK_DEV_INITRD */ |
| 560 | 581 | ||
| 561 | #ifdef CONFIG_PPC32 | 582 | #ifdef CONFIG_PPC32 |
diff --git a/arch/powerpc/mm/init_32.c b/arch/powerpc/mm/init_32.c index d65b591e5556..5de0f254dbb5 100644 --- a/arch/powerpc/mm/init_32.c +++ b/arch/powerpc/mm/init_32.c | |||
| @@ -223,21 +223,6 @@ void free_initmem(void) | |||
| 223 | #undef FREESEC | 223 | #undef FREESEC |
| 224 | } | 224 | } |
| 225 | 225 | ||
| 226 | #ifdef CONFIG_BLK_DEV_INITRD | ||
| 227 | void free_initrd_mem(unsigned long start, unsigned long end) | ||
| 228 | { | ||
| 229 | if (start < end) | ||
| 230 | printk ("Freeing initrd memory: %ldk freed\n", (end - start) >> 10); | ||
| 231 | for (; start < end; start += PAGE_SIZE) { | ||
| 232 | ClearPageReserved(virt_to_page(start)); | ||
| 233 | init_page_count(virt_to_page(start)); | ||
| 234 | free_page(start); | ||
| 235 | totalram_pages++; | ||
| 236 | } | ||
| 237 | } | ||
| 238 | #endif | ||
| 239 | |||
| 240 | |||
| 241 | #ifdef CONFIG_8xx /* No 8xx specific .c file to put that in ... */ | 226 | #ifdef CONFIG_8xx /* No 8xx specific .c file to put that in ... */ |
| 242 | void setup_initial_memory_limit(phys_addr_t first_memblock_base, | 227 | void setup_initial_memory_limit(phys_addr_t first_memblock_base, |
| 243 | phys_addr_t first_memblock_size) | 228 | phys_addr_t first_memblock_size) |
diff --git a/arch/powerpc/mm/init_64.c b/arch/powerpc/mm/init_64.c index 6374b2196a17..f6dbb4c20e64 100644 --- a/arch/powerpc/mm/init_64.c +++ b/arch/powerpc/mm/init_64.c | |||
| @@ -99,20 +99,6 @@ void free_initmem(void) | |||
| 99 | ((unsigned long)__init_end - (unsigned long)__init_begin) >> 10); | 99 | ((unsigned long)__init_end - (unsigned long)__init_begin) >> 10); |
| 100 | } | 100 | } |
| 101 | 101 | ||
| 102 | #ifdef CONFIG_BLK_DEV_INITRD | ||
| 103 | void free_initrd_mem(unsigned long start, unsigned long end) | ||
| 104 | { | ||
| 105 | if (start < end) | ||
| 106 | printk ("Freeing initrd memory: %ldk freed\n", (end - start) >> 10); | ||
| 107 | for (; start < end; start += PAGE_SIZE) { | ||
| 108 | ClearPageReserved(virt_to_page(start)); | ||
| 109 | init_page_count(virt_to_page(start)); | ||
| 110 | free_page(start); | ||
| 111 | totalram_pages++; | ||
| 112 | } | ||
| 113 | } | ||
| 114 | #endif | ||
| 115 | |||
| 116 | static void pgd_ctor(void *addr) | 102 | static void pgd_ctor(void *addr) |
| 117 | { | 103 | { |
| 118 | memset(addr, 0, PGD_TABLE_SIZE); | 104 | memset(addr, 0, PGD_TABLE_SIZE); |
diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c index 57e545b84bf1..29d4dde65c45 100644 --- a/arch/powerpc/mm/mem.c +++ b/arch/powerpc/mm/mem.c | |||
| @@ -382,6 +382,25 @@ void __init mem_init(void) | |||
| 382 | mem_init_done = 1; | 382 | mem_init_done = 1; |
| 383 | } | 383 | } |
| 384 | 384 | ||
| 385 | #ifdef CONFIG_BLK_DEV_INITRD | ||
| 386 | void __init free_initrd_mem(unsigned long start, unsigned long end) | ||
| 387 | { | ||
| 388 | if (start >= end) | ||
| 389 | return; | ||
| 390 | |||
| 391 | start = _ALIGN_DOWN(start, PAGE_SIZE); | ||
| 392 | end = _ALIGN_UP(end, PAGE_SIZE); | ||
| 393 | pr_info("Freeing initrd memory: %ldk freed\n", (end - start) >> 10); | ||
| 394 | |||
| 395 | for (; start < end; start += PAGE_SIZE) { | ||
| 396 | ClearPageReserved(virt_to_page(start)); | ||
| 397 | init_page_count(virt_to_page(start)); | ||
| 398 | free_page(start); | ||
| 399 | totalram_pages++; | ||
| 400 | } | ||
| 401 | } | ||
| 402 | #endif | ||
| 403 | |||
| 385 | /* | 404 | /* |
| 386 | * This is called when a page has been modified by the kernel. | 405 | * This is called when a page has been modified by the kernel. |
| 387 | * It just marks the page as not i-cache clean. We do the i-cache | 406 | * It just marks the page as not i-cache clean. We do the i-cache |
diff --git a/arch/powerpc/sysdev/fsl_lbc.c b/arch/powerpc/sysdev/fsl_lbc.c index 0608b1657da4..d917573cf1a8 100644 --- a/arch/powerpc/sysdev/fsl_lbc.c +++ b/arch/powerpc/sysdev/fsl_lbc.c | |||
| @@ -196,9 +196,6 @@ static int __devinit fsl_lbc_ctrl_init(struct fsl_lbc_ctrl *ctrl, | |||
| 196 | out_be32(&lbc->lteccr, LTECCR_CLEAR); | 196 | out_be32(&lbc->lteccr, LTECCR_CLEAR); |
| 197 | out_be32(&lbc->ltedr, LTEDR_ENABLE); | 197 | out_be32(&lbc->ltedr, LTEDR_ENABLE); |
| 198 | 198 | ||
| 199 | /* Enable interrupts for any detected events */ | ||
| 200 | out_be32(&lbc->lteir, LTEIR_ENABLE); | ||
| 201 | |||
| 202 | /* Set the monitor timeout value to the maximum for erratum A001 */ | 199 | /* Set the monitor timeout value to the maximum for erratum A001 */ |
| 203 | if (of_device_is_compatible(node, "fsl,elbc")) | 200 | if (of_device_is_compatible(node, "fsl,elbc")) |
| 204 | clrsetbits_be32(&lbc->lbcr, LBCR_BMT, LBCR_BMTPS); | 201 | clrsetbits_be32(&lbc->lbcr, LBCR_BMT, LBCR_BMTPS); |
| @@ -322,6 +319,9 @@ static int __devinit fsl_lbc_ctrl_probe(struct platform_device *dev) | |||
| 322 | goto err; | 319 | goto err; |
| 323 | } | 320 | } |
| 324 | 321 | ||
| 322 | /* Enable interrupts for any detected events */ | ||
| 323 | out_be32(&fsl_lbc_ctrl_dev->regs->lteir, LTEIR_ENABLE); | ||
| 324 | |||
| 325 | return 0; | 325 | return 0; |
| 326 | 326 | ||
| 327 | err: | 327 | err: |
diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig index af32e17fa170..253986bd6bb6 100644 --- a/arch/sparc/Kconfig +++ b/arch/sparc/Kconfig | |||
| @@ -26,7 +26,6 @@ config SPARC | |||
| 26 | select HAVE_DMA_API_DEBUG | 26 | select HAVE_DMA_API_DEBUG |
| 27 | select HAVE_ARCH_JUMP_LABEL | 27 | select HAVE_ARCH_JUMP_LABEL |
| 28 | select HAVE_GENERIC_HARDIRQS | 28 | select HAVE_GENERIC_HARDIRQS |
| 29 | select GENERIC_HARDIRQS_NO_DEPRECATED | ||
| 30 | select GENERIC_IRQ_SHOW | 29 | select GENERIC_IRQ_SHOW |
| 31 | select USE_GENERIC_SMP_HELPERS if SMP | 30 | select USE_GENERIC_SMP_HELPERS if SMP |
| 32 | 31 | ||
| @@ -528,6 +527,23 @@ config PCI_DOMAINS | |||
| 528 | config PCI_SYSCALL | 527 | config PCI_SYSCALL |
| 529 | def_bool PCI | 528 | def_bool PCI |
| 530 | 529 | ||
| 530 | config PCIC_PCI | ||
| 531 | bool | ||
| 532 | depends on PCI && SPARC32 && !SPARC_LEON | ||
| 533 | default y | ||
| 534 | |||
| 535 | config LEON_PCI | ||
| 536 | bool | ||
| 537 | depends on PCI && SPARC_LEON | ||
| 538 | default y | ||
| 539 | |||
| 540 | config GRPCI2 | ||
| 541 | bool "GRPCI2 Host Bridge Support" | ||
| 542 | depends on LEON_PCI | ||
| 543 | default y | ||
| 544 | help | ||
| 545 | Say Y here to include the GRPCI2 Host Bridge Driver. | ||
| 546 | |||
| 531 | source "drivers/pci/Kconfig" | 547 | source "drivers/pci/Kconfig" |
| 532 | 548 | ||
| 533 | source "drivers/pcmcia/Kconfig" | 549 | source "drivers/pcmcia/Kconfig" |
diff --git a/arch/sparc/include/asm/floppy_32.h b/arch/sparc/include/asm/floppy_32.h index 482c79e2a416..7440915e86d8 100644 --- a/arch/sparc/include/asm/floppy_32.h +++ b/arch/sparc/include/asm/floppy_32.h | |||
| @@ -138,7 +138,7 @@ static unsigned char sun_82072_fd_inb(int port) | |||
| 138 | return sun_fdc->data_82072; | 138 | return sun_fdc->data_82072; |
| 139 | case 7: /* FD_DIR */ | 139 | case 7: /* FD_DIR */ |
| 140 | return sun_read_dir(); | 140 | return sun_read_dir(); |
| 141 | }; | 141 | } |
| 142 | panic("sun_82072_fd_inb: How did I get here?"); | 142 | panic("sun_82072_fd_inb: How did I get here?"); |
| 143 | } | 143 | } |
| 144 | 144 | ||
| @@ -161,7 +161,7 @@ static void sun_82072_fd_outb(unsigned char value, int port) | |||
| 161 | case 4: /* FD_STATUS */ | 161 | case 4: /* FD_STATUS */ |
| 162 | sun_fdc->status_82072 = value; | 162 | sun_fdc->status_82072 = value; |
| 163 | break; | 163 | break; |
| 164 | }; | 164 | } |
| 165 | return; | 165 | return; |
| 166 | } | 166 | } |
| 167 | 167 | ||
| @@ -186,7 +186,7 @@ static unsigned char sun_82077_fd_inb(int port) | |||
| 186 | return sun_fdc->data_82077; | 186 | return sun_fdc->data_82077; |
| 187 | case 7: /* FD_DIR */ | 187 | case 7: /* FD_DIR */ |
| 188 | return sun_read_dir(); | 188 | return sun_read_dir(); |
| 189 | }; | 189 | } |
| 190 | panic("sun_82077_fd_inb: How did I get here?"); | 190 | panic("sun_82077_fd_inb: How did I get here?"); |
| 191 | } | 191 | } |
| 192 | 192 | ||
| @@ -212,7 +212,7 @@ static void sun_82077_fd_outb(unsigned char value, int port) | |||
| 212 | case 3: /* FD_TDR */ | 212 | case 3: /* FD_TDR */ |
| 213 | sun_fdc->tapectl_82077 = value; | 213 | sun_fdc->tapectl_82077 = value; |
| 214 | break; | 214 | break; |
| 215 | }; | 215 | } |
| 216 | return; | 216 | return; |
| 217 | } | 217 | } |
| 218 | 218 | ||
diff --git a/arch/sparc/include/asm/floppy_64.h b/arch/sparc/include/asm/floppy_64.h index 6597ce874d78..bcef1f5a2a6d 100644 --- a/arch/sparc/include/asm/floppy_64.h +++ b/arch/sparc/include/asm/floppy_64.h | |||
| @@ -111,7 +111,7 @@ static unsigned char sun_82077_fd_inb(unsigned long port) | |||
| 111 | case 7: /* FD_DIR */ | 111 | case 7: /* FD_DIR */ |
| 112 | /* XXX: Is DCL on 0x80 in sun4m? */ | 112 | /* XXX: Is DCL on 0x80 in sun4m? */ |
| 113 | return sbus_readb(&sun_fdc->dir_82077); | 113 | return sbus_readb(&sun_fdc->dir_82077); |
| 114 | }; | 114 | } |
| 115 | panic("sun_82072_fd_inb: How did I get here?"); | 115 | panic("sun_82072_fd_inb: How did I get here?"); |
| 116 | } | 116 | } |
| 117 | 117 | ||
| @@ -135,7 +135,7 @@ static void sun_82077_fd_outb(unsigned char value, unsigned long port) | |||
| 135 | case 4: /* FD_STATUS */ | 135 | case 4: /* FD_STATUS */ |
| 136 | sbus_writeb(value, &sun_fdc->status_82077); | 136 | sbus_writeb(value, &sun_fdc->status_82077); |
| 137 | break; | 137 | break; |
| 138 | }; | 138 | } |
| 139 | return; | 139 | return; |
| 140 | } | 140 | } |
| 141 | 141 | ||
diff --git a/arch/sparc/include/asm/leon.h b/arch/sparc/include/asm/leon.h index 6bdaf1e43d2a..a4e457f003ed 100644 --- a/arch/sparc/include/asm/leon.h +++ b/arch/sparc/include/asm/leon.h | |||
| @@ -318,6 +318,9 @@ struct device_node; | |||
| 318 | extern unsigned int leon_build_device_irq(unsigned int real_irq, | 318 | extern unsigned int leon_build_device_irq(unsigned int real_irq, |
| 319 | irq_flow_handler_t flow_handler, | 319 | irq_flow_handler_t flow_handler, |
| 320 | const char *name, int do_ack); | 320 | const char *name, int do_ack); |
| 321 | extern void leon_update_virq_handling(unsigned int virq, | ||
| 322 | irq_flow_handler_t flow_handler, | ||
| 323 | const char *name, int do_ack); | ||
| 321 | extern void leon_clear_clock_irq(void); | 324 | extern void leon_clear_clock_irq(void); |
| 322 | extern void leon_load_profile_irq(int cpu, unsigned int limit); | 325 | extern void leon_load_profile_irq(int cpu, unsigned int limit); |
| 323 | extern void leon_init_timers(irq_handler_t counter_fn); | 326 | extern void leon_init_timers(irq_handler_t counter_fn); |
diff --git a/arch/sparc/include/asm/leon_pci.h b/arch/sparc/include/asm/leon_pci.h new file mode 100644 index 000000000000..42b4b31a82fe --- /dev/null +++ b/arch/sparc/include/asm/leon_pci.h | |||
| @@ -0,0 +1,21 @@ | |||
| 1 | /* | ||
| 2 | * asm/leon_pci.h | ||
| 3 | * | ||
| 4 | * Copyright (C) 2011 Aeroflex Gaisler AB, Daniel Hellstrom | ||
| 5 | */ | ||
| 6 | |||
| 7 | #ifndef _ASM_LEON_PCI_H_ | ||
| 8 | #define _ASM_LEON_PCI_H_ | ||
| 9 | |||
| 10 | /* PCI related definitions */ | ||
| 11 | struct leon_pci_info { | ||
| 12 | struct pci_ops *ops; | ||
| 13 | struct resource io_space; | ||
| 14 | struct resource mem_space; | ||
| 15 | int (*map_irq)(struct pci_dev *dev, u8 slot, u8 pin); | ||
| 16 | }; | ||
| 17 | |||
| 18 | extern void leon_pci_init(struct platform_device *ofdev, | ||
| 19 | struct leon_pci_info *info); | ||
| 20 | |||
| 21 | #endif /* _ASM_LEON_PCI_H_ */ | ||
diff --git a/arch/sparc/include/asm/pci_32.h b/arch/sparc/include/asm/pci_32.h index 332ac9ab36bc..862e3ce92b15 100644 --- a/arch/sparc/include/asm/pci_32.h +++ b/arch/sparc/include/asm/pci_32.h | |||
| @@ -47,7 +47,31 @@ extern struct device_node *pci_device_to_OF_node(struct pci_dev *pdev); | |||
| 47 | 47 | ||
| 48 | #endif /* __KERNEL__ */ | 48 | #endif /* __KERNEL__ */ |
| 49 | 49 | ||
| 50 | #ifndef CONFIG_LEON_PCI | ||
| 50 | /* generic pci stuff */ | 51 | /* generic pci stuff */ |
| 51 | #include <asm-generic/pci.h> | 52 | #include <asm-generic/pci.h> |
| 53 | #else | ||
| 54 | /* | ||
| 55 | * On LEON PCI Memory space is mapped 1:1 with physical address space. | ||
| 56 | * | ||
| 57 | * I/O space is located at low 64Kbytes in PCI I/O space. The I/O addresses | ||
| 58 | * are converted into CPU addresses to virtual addresses that are mapped with | ||
| 59 | * MMU to the PCI Host PCI I/O space window which are translated to the low | ||
| 60 | * 64Kbytes by the Host controller. | ||
| 61 | */ | ||
| 62 | |||
| 63 | extern void | ||
| 64 | pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, | ||
| 65 | struct resource *res); | ||
| 66 | |||
| 67 | extern void | ||
| 68 | pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, | ||
| 69 | struct pci_bus_region *region); | ||
| 70 | |||
| 71 | static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel) | ||
| 72 | { | ||
| 73 | return PCI_IRQ_NONE; | ||
| 74 | } | ||
| 75 | #endif | ||
| 52 | 76 | ||
| 53 | #endif /* __SPARC_PCI_H */ | 77 | #endif /* __SPARC_PCI_H */ |
diff --git a/arch/sparc/include/asm/pcic.h b/arch/sparc/include/asm/pcic.h index 7eb5d78f5211..6676cbcc8b6a 100644 --- a/arch/sparc/include/asm/pcic.h +++ b/arch/sparc/include/asm/pcic.h | |||
| @@ -29,7 +29,7 @@ struct linux_pcic { | |||
| 29 | int pcic_imdim; | 29 | int pcic_imdim; |
| 30 | }; | 30 | }; |
| 31 | 31 | ||
| 32 | #ifdef CONFIG_PCI | 32 | #ifdef CONFIG_PCIC_PCI |
| 33 | extern int pcic_present(void); | 33 | extern int pcic_present(void); |
| 34 | extern int pcic_probe(void); | 34 | extern int pcic_probe(void); |
| 35 | extern void pci_time_init(void); | 35 | extern void pci_time_init(void); |
diff --git a/arch/sparc/include/asm/system_32.h b/arch/sparc/include/asm/system_32.h index 47a7e862474e..aba16092a81b 100644 --- a/arch/sparc/include/asm/system_32.h +++ b/arch/sparc/include/asm/system_32.h | |||
| @@ -220,7 +220,7 @@ static inline unsigned long __xchg(unsigned long x, __volatile__ void * ptr, int | |||
| 220 | switch (size) { | 220 | switch (size) { |
| 221 | case 4: | 221 | case 4: |
| 222 | return xchg_u32(ptr, x); | 222 | return xchg_u32(ptr, x); |
| 223 | }; | 223 | } |
| 224 | __xchg_called_with_bad_pointer(); | 224 | __xchg_called_with_bad_pointer(); |
| 225 | return x; | 225 | return x; |
| 226 | } | 226 | } |
diff --git a/arch/sparc/include/asm/system_64.h b/arch/sparc/include/asm/system_64.h index 3c96d3bb9f15..10bcabce97b2 100644 --- a/arch/sparc/include/asm/system_64.h +++ b/arch/sparc/include/asm/system_64.h | |||
| @@ -234,7 +234,7 @@ static inline unsigned long __xchg(unsigned long x, __volatile__ void * ptr, | |||
| 234 | return xchg32(ptr, x); | 234 | return xchg32(ptr, x); |
| 235 | case 8: | 235 | case 8: |
| 236 | return xchg64(ptr, x); | 236 | return xchg64(ptr, x); |
| 237 | }; | 237 | } |
| 238 | __xchg_called_with_bad_pointer(); | 238 | __xchg_called_with_bad_pointer(); |
| 239 | return x; | 239 | return x; |
| 240 | } | 240 | } |
diff --git a/arch/sparc/kernel/Makefile b/arch/sparc/kernel/Makefile index 9cff2709a96d..b90b4a1d070a 100644 --- a/arch/sparc/kernel/Makefile +++ b/arch/sparc/kernel/Makefile | |||
| @@ -73,7 +73,9 @@ obj-$(CONFIG_SPARC64_SMP) += cpumap.o | |||
| 73 | 73 | ||
| 74 | obj-y += dma.o | 74 | obj-y += dma.o |
| 75 | 75 | ||
| 76 | obj-$(CONFIG_SPARC32_PCI) += pcic.o | 76 | obj-$(CONFIG_PCIC_PCI) += pcic.o |
| 77 | obj-$(CONFIG_LEON_PCI) += leon_pci.o | ||
| 78 | obj-$(CONFIG_GRPCI2) += leon_pci_grpci2.o | ||
| 77 | 79 | ||
| 78 | obj-$(CONFIG_SMP) += trampoline_$(BITS).o smp_$(BITS).o | 80 | obj-$(CONFIG_SMP) += trampoline_$(BITS).o smp_$(BITS).o |
| 79 | obj-$(CONFIG_SPARC32_SMP) += sun4m_smp.o sun4d_smp.o leon_smp.o | 81 | obj-$(CONFIG_SPARC32_SMP) += sun4m_smp.o sun4d_smp.o leon_smp.o |
diff --git a/arch/sparc/kernel/apc.c b/arch/sparc/kernel/apc.c index 1e34f29e58bb..caef9deb5866 100644 --- a/arch/sparc/kernel/apc.c +++ b/arch/sparc/kernel/apc.c | |||
| @@ -123,7 +123,7 @@ static long apc_ioctl(struct file *f, unsigned int cmd, unsigned long __arg) | |||
| 123 | 123 | ||
| 124 | default: | 124 | default: |
| 125 | return -EINVAL; | 125 | return -EINVAL; |
| 126 | }; | 126 | } |
| 127 | 127 | ||
| 128 | return 0; | 128 | return 0; |
| 129 | } | 129 | } |
diff --git a/arch/sparc/kernel/auxio_32.c b/arch/sparc/kernel/auxio_32.c index 8505e0ac78ba..acf5151f3c1d 100644 --- a/arch/sparc/kernel/auxio_32.c +++ b/arch/sparc/kernel/auxio_32.c | |||
| @@ -101,7 +101,7 @@ void set_auxio(unsigned char bits_on, unsigned char bits_off) | |||
| 101 | break; | 101 | break; |
| 102 | default: | 102 | default: |
| 103 | panic("Can't set AUXIO register on this machine."); | 103 | panic("Can't set AUXIO register on this machine."); |
| 104 | }; | 104 | } |
| 105 | spin_unlock_irqrestore(&auxio_lock, flags); | 105 | spin_unlock_irqrestore(&auxio_lock, flags); |
| 106 | } | 106 | } |
| 107 | EXPORT_SYMBOL(set_auxio); | 107 | EXPORT_SYMBOL(set_auxio); |
diff --git a/arch/sparc/kernel/chmc.c b/arch/sparc/kernel/chmc.c index 668c7be5d365..5f450260981d 100644 --- a/arch/sparc/kernel/chmc.c +++ b/arch/sparc/kernel/chmc.c | |||
| @@ -664,7 +664,7 @@ static void chmc_interpret_one_decode_reg(struct chmc *p, int which_bank, u64 va | |||
| 664 | case 0x0: | 664 | case 0x0: |
| 665 | bp->interleave = 16; | 665 | bp->interleave = 16; |
| 666 | break; | 666 | break; |
| 667 | }; | 667 | } |
| 668 | 668 | ||
| 669 | /* UK[10] is reserved, and UK[11] is not set for the SDRAM | 669 | /* UK[10] is reserved, and UK[11] is not set for the SDRAM |
| 670 | * bank size definition. | 670 | * bank size definition. |
diff --git a/arch/sparc/kernel/entry.S b/arch/sparc/kernel/entry.S index 8341963f4c84..9fe08a1ea6c6 100644 --- a/arch/sparc/kernel/entry.S +++ b/arch/sparc/kernel/entry.S | |||
| @@ -229,7 +229,7 @@ real_irq_entry: | |||
| 229 | #ifdef CONFIG_SMP | 229 | #ifdef CONFIG_SMP |
| 230 | .globl patchme_maybe_smp_msg | 230 | .globl patchme_maybe_smp_msg |
| 231 | 231 | ||
| 232 | cmp %l7, 12 | 232 | cmp %l7, 11 |
| 233 | patchme_maybe_smp_msg: | 233 | patchme_maybe_smp_msg: |
| 234 | bgu maybe_smp4m_msg | 234 | bgu maybe_smp4m_msg |
| 235 | nop | 235 | nop |
| @@ -293,7 +293,7 @@ maybe_smp4m_msg: | |||
| 293 | WRITE_PAUSE | 293 | WRITE_PAUSE |
| 294 | wr %l4, PSR_ET, %psr | 294 | wr %l4, PSR_ET, %psr |
| 295 | WRITE_PAUSE | 295 | WRITE_PAUSE |
| 296 | sll %o2, 28, %o2 ! shift for simpler checks below | 296 | sll %o3, 28, %o2 ! shift for simpler checks below |
| 297 | maybe_smp4m_msg_check_single: | 297 | maybe_smp4m_msg_check_single: |
| 298 | andcc %o2, 0x1, %g0 | 298 | andcc %o2, 0x1, %g0 |
| 299 | beq,a maybe_smp4m_msg_check_mask | 299 | beq,a maybe_smp4m_msg_check_mask |
| @@ -1604,7 +1604,7 @@ restore_current: | |||
| 1604 | retl | 1604 | retl |
| 1605 | nop | 1605 | nop |
| 1606 | 1606 | ||
| 1607 | #ifdef CONFIG_PCI | 1607 | #ifdef CONFIG_PCIC_PCI |
| 1608 | #include <asm/pcic.h> | 1608 | #include <asm/pcic.h> |
| 1609 | 1609 | ||
| 1610 | .align 4 | 1610 | .align 4 |
| @@ -1650,7 +1650,7 @@ pcic_nmi_trap_patch: | |||
| 1650 | rd %psr, %l0 | 1650 | rd %psr, %l0 |
| 1651 | .word 0 | 1651 | .word 0 |
| 1652 | 1652 | ||
| 1653 | #endif /* CONFIG_PCI */ | 1653 | #endif /* CONFIG_PCIC_PCI */ |
| 1654 | 1654 | ||
| 1655 | .globl flushw_all | 1655 | .globl flushw_all |
| 1656 | flushw_all: | 1656 | flushw_all: |
diff --git a/arch/sparc/kernel/leon_kernel.c b/arch/sparc/kernel/leon_kernel.c index 2f538ac2e139..d17255a2bbac 100644 --- a/arch/sparc/kernel/leon_kernel.c +++ b/arch/sparc/kernel/leon_kernel.c | |||
| @@ -236,6 +236,21 @@ static unsigned int _leon_build_device_irq(struct platform_device *op, | |||
| 236 | return leon_build_device_irq(real_irq, handle_simple_irq, "edge", 0); | 236 | return leon_build_device_irq(real_irq, handle_simple_irq, "edge", 0); |
| 237 | } | 237 | } |
| 238 | 238 | ||
| 239 | void leon_update_virq_handling(unsigned int virq, | ||
| 240 | irq_flow_handler_t flow_handler, | ||
| 241 | const char *name, int do_ack) | ||
| 242 | { | ||
| 243 | unsigned long mask = (unsigned long)irq_get_chip_data(virq); | ||
| 244 | |||
| 245 | mask &= ~LEON_DO_ACK_HW; | ||
| 246 | if (do_ack) | ||
| 247 | mask |= LEON_DO_ACK_HW; | ||
| 248 | |||
| 249 | irq_set_chip_and_handler_name(virq, &leon_irq, | ||
| 250 | flow_handler, name); | ||
| 251 | irq_set_chip_data(virq, (void *)mask); | ||
| 252 | } | ||
| 253 | |||
| 239 | void __init leon_init_timers(irq_handler_t counter_fn) | 254 | void __init leon_init_timers(irq_handler_t counter_fn) |
| 240 | { | 255 | { |
| 241 | int irq, eirq; | 256 | int irq, eirq; |
| @@ -361,6 +376,22 @@ void __init leon_init_timers(irq_handler_t counter_fn) | |||
| 361 | prom_halt(); | 376 | prom_halt(); |
| 362 | } | 377 | } |
| 363 | 378 | ||
| 379 | #ifdef CONFIG_SMP | ||
| 380 | { | ||
| 381 | unsigned long flags; | ||
| 382 | |||
| 383 | /* | ||
| 384 | * In SMP, sun4m adds a IPI handler to IRQ trap handler that | ||
| 385 | * LEON never must take, sun4d and LEON overwrites the branch | ||
| 386 | * with a NOP. | ||
| 387 | */ | ||
| 388 | local_irq_save(flags); | ||
| 389 | patchme_maybe_smp_msg[0] = 0x01000000; /* NOP out the branch */ | ||
| 390 | local_flush_cache_all(); | ||
| 391 | local_irq_restore(flags); | ||
| 392 | } | ||
| 393 | #endif | ||
| 394 | |||
| 364 | LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[leon3_gptimer_idx].ctrl, | 395 | LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[leon3_gptimer_idx].ctrl, |
| 365 | LEON3_GPTIMER_EN | | 396 | LEON3_GPTIMER_EN | |
| 366 | LEON3_GPTIMER_RL | | 397 | LEON3_GPTIMER_RL | |
diff --git a/arch/sparc/kernel/leon_pci.c b/arch/sparc/kernel/leon_pci.c new file mode 100644 index 000000000000..a8a9a275037d --- /dev/null +++ b/arch/sparc/kernel/leon_pci.c | |||
| @@ -0,0 +1,253 @@ | |||
| 1 | /* | ||
| 2 | * leon_pci.c: LEON Host PCI support | ||
| 3 | * | ||
| 4 | * Copyright (C) 2011 Aeroflex Gaisler AB, Daniel Hellstrom | ||
| 5 | * | ||
| 6 | * Code is partially derived from pcic.c | ||
| 7 | */ | ||
| 8 | |||
| 9 | #include <linux/of_device.h> | ||
| 10 | #include <linux/kernel.h> | ||
| 11 | #include <linux/pci.h> | ||
| 12 | #include <asm/leon.h> | ||
| 13 | #include <asm/leon_pci.h> | ||
| 14 | |||
| 15 | /* The LEON architecture does not rely on a BIOS or bootloader to setup | ||
| 16 | * PCI for us. The Linux generic routines are used to setup resources, | ||
| 17 | * reset values of confuration-space registers settings ae preseved. | ||
| 18 | */ | ||
| 19 | void leon_pci_init(struct platform_device *ofdev, struct leon_pci_info *info) | ||
| 20 | { | ||
| 21 | struct pci_bus *root_bus; | ||
| 22 | |||
| 23 | root_bus = pci_scan_bus_parented(&ofdev->dev, 0, info->ops, info); | ||
| 24 | if (root_bus) { | ||
| 25 | root_bus->resource[0] = &info->io_space; | ||
| 26 | root_bus->resource[1] = &info->mem_space; | ||
| 27 | root_bus->resource[2] = NULL; | ||
| 28 | |||
| 29 | /* Init all PCI devices into PCI tree */ | ||
| 30 | pci_bus_add_devices(root_bus); | ||
| 31 | |||
| 32 | /* Setup IRQs of all devices using custom routines */ | ||
| 33 | pci_fixup_irqs(pci_common_swizzle, info->map_irq); | ||
| 34 | |||
| 35 | /* Assign devices with resources */ | ||
| 36 | pci_assign_unassigned_resources(); | ||
| 37 | } | ||
| 38 | } | ||
| 39 | |||
| 40 | /* PCI Memory and Prefetchable Memory is direct-mapped. However I/O Space is | ||
| 41 | * accessed through a Window which is translated to low 64KB in PCI space, the | ||
| 42 | * first 4KB is not used so 60KB is available. | ||
| 43 | * | ||
| 44 | * This function is used by generic code to translate resource addresses into | ||
| 45 | * PCI addresses. | ||
| 46 | */ | ||
| 47 | void pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, | ||
| 48 | struct resource *res) | ||
| 49 | { | ||
| 50 | struct leon_pci_info *info = dev->bus->sysdata; | ||
| 51 | |||
| 52 | region->start = res->start; | ||
| 53 | region->end = res->end; | ||
| 54 | |||
| 55 | if (res->flags & IORESOURCE_IO) { | ||
| 56 | region->start -= (info->io_space.start - 0x1000); | ||
| 57 | region->end -= (info->io_space.start - 0x1000); | ||
| 58 | } | ||
| 59 | } | ||
| 60 | EXPORT_SYMBOL(pcibios_resource_to_bus); | ||
| 61 | |||
| 62 | /* see pcibios_resource_to_bus() comment */ | ||
| 63 | void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, | ||
| 64 | struct pci_bus_region *region) | ||
| 65 | { | ||
| 66 | struct leon_pci_info *info = dev->bus->sysdata; | ||
| 67 | |||
| 68 | res->start = region->start; | ||
| 69 | res->end = region->end; | ||
| 70 | |||
| 71 | if (res->flags & IORESOURCE_IO) { | ||
| 72 | res->start += (info->io_space.start - 0x1000); | ||
| 73 | res->end += (info->io_space.start - 0x1000); | ||
| 74 | } | ||
| 75 | } | ||
| 76 | EXPORT_SYMBOL(pcibios_bus_to_resource); | ||
| 77 | |||
| 78 | void __devinit pcibios_fixup_bus(struct pci_bus *pbus) | ||
| 79 | { | ||
| 80 | struct leon_pci_info *info = pbus->sysdata; | ||
| 81 | struct pci_dev *dev; | ||
| 82 | int i, has_io, has_mem; | ||
| 83 | u16 cmd; | ||
| 84 | |||
| 85 | /* Generic PCI bus probing sets these to point at | ||
| 86 | * &io{port,mem}_resouce which is wrong for us. | ||
| 87 | */ | ||
| 88 | if (pbus->self == NULL) { | ||
| 89 | pbus->resource[0] = &info->io_space; | ||
| 90 | pbus->resource[1] = &info->mem_space; | ||
| 91 | pbus->resource[2] = NULL; | ||
| 92 | } | ||
| 93 | |||
| 94 | list_for_each_entry(dev, &pbus->devices, bus_list) { | ||
| 95 | /* | ||
| 96 | * We can not rely on that the bootloader has enabled I/O | ||
| 97 | * or memory access to PCI devices. Instead we enable it here | ||
| 98 | * if the device has BARs of respective type. | ||
| 99 | */ | ||
| 100 | has_io = has_mem = 0; | ||
| 101 | for (i = 0; i < PCI_ROM_RESOURCE; i++) { | ||
| 102 | unsigned long f = dev->resource[i].flags; | ||
| 103 | if (f & IORESOURCE_IO) | ||
| 104 | has_io = 1; | ||
| 105 | else if (f & IORESOURCE_MEM) | ||
| 106 | has_mem = 1; | ||
| 107 | } | ||
| 108 | /* ROM BARs are mapped into 32-bit memory space */ | ||
| 109 | if (dev->resource[PCI_ROM_RESOURCE].end != 0) { | ||
| 110 | dev->resource[PCI_ROM_RESOURCE].flags |= | ||
| 111 | IORESOURCE_ROM_ENABLE; | ||
| 112 | has_mem = 1; | ||
| 113 | } | ||
| 114 | pci_bus_read_config_word(pbus, dev->devfn, PCI_COMMAND, &cmd); | ||
| 115 | if (has_io && !(cmd & PCI_COMMAND_IO)) { | ||
| 116 | #ifdef CONFIG_PCI_DEBUG | ||
| 117 | printk(KERN_INFO "LEONPCI: Enabling I/O for dev %s\n", | ||
| 118 | pci_name(dev)); | ||
| 119 | #endif | ||
| 120 | cmd |= PCI_COMMAND_IO; | ||
| 121 | pci_bus_write_config_word(pbus, dev->devfn, PCI_COMMAND, | ||
| 122 | cmd); | ||
| 123 | } | ||
| 124 | if (has_mem && !(cmd & PCI_COMMAND_MEMORY)) { | ||
| 125 | #ifdef CONFIG_PCI_DEBUG | ||
| 126 | printk(KERN_INFO "LEONPCI: Enabling MEMORY for dev" | ||
| 127 | "%s\n", pci_name(dev)); | ||
| 128 | #endif | ||
| 129 | cmd |= PCI_COMMAND_MEMORY; | ||
| 130 | pci_bus_write_config_word(pbus, dev->devfn, PCI_COMMAND, | ||
| 131 | cmd); | ||
| 132 | } | ||
| 133 | } | ||
| 134 | } | ||
| 135 | |||
| 136 | /* | ||
| 137 | * Other archs parse arguments here. | ||
| 138 | */ | ||
| 139 | char * __devinit pcibios_setup(char *str) | ||
| 140 | { | ||
| 141 | return str; | ||
| 142 | } | ||
| 143 | |||
| 144 | resource_size_t pcibios_align_resource(void *data, const struct resource *res, | ||
| 145 | resource_size_t size, resource_size_t align) | ||
| 146 | { | ||
| 147 | return res->start; | ||
| 148 | } | ||
| 149 | |||
| 150 | int pcibios_enable_device(struct pci_dev *dev, int mask) | ||
| 151 | { | ||
| 152 | return pci_enable_resources(dev, mask); | ||
| 153 | } | ||
| 154 | |||
| 155 | struct device_node *pci_device_to_OF_node(struct pci_dev *pdev) | ||
| 156 | { | ||
| 157 | /* | ||
| 158 | * Currently the OpenBoot nodes are not connected with the PCI device, | ||
| 159 | * this is because the LEON PROM does not create PCI nodes. Eventually | ||
| 160 | * this will change and the same approach as pcic.c can be used to | ||
| 161 | * match PROM nodes with pci devices. | ||
| 162 | */ | ||
| 163 | return NULL; | ||
| 164 | } | ||
| 165 | EXPORT_SYMBOL(pci_device_to_OF_node); | ||
| 166 | |||
| 167 | void __devinit pcibios_update_irq(struct pci_dev *dev, int irq) | ||
| 168 | { | ||
| 169 | #ifdef CONFIG_PCI_DEBUG | ||
| 170 | printk(KERN_DEBUG "LEONPCI: Assigning IRQ %02d to %s\n", irq, | ||
| 171 | pci_name(dev)); | ||
| 172 | #endif | ||
| 173 | pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq); | ||
| 174 | } | ||
| 175 | |||
| 176 | /* in/out routines taken from pcic.c | ||
| 177 | * | ||
| 178 | * This probably belongs here rather than ioport.c because | ||
| 179 | * we do not want this crud linked into SBus kernels. | ||
| 180 | * Also, think for a moment about likes of floppy.c that | ||
| 181 | * include architecture specific parts. They may want to redefine ins/outs. | ||
| 182 | * | ||
| 183 | * We do not use horrible macros here because we want to | ||
| 184 | * advance pointer by sizeof(size). | ||
| 185 | */ | ||
| 186 | void outsb(unsigned long addr, const void *src, unsigned long count) | ||
| 187 | { | ||
| 188 | while (count) { | ||
| 189 | count -= 1; | ||
| 190 | outb(*(const char *)src, addr); | ||
| 191 | src += 1; | ||
| 192 | /* addr += 1; */ | ||
| 193 | } | ||
| 194 | } | ||
| 195 | EXPORT_SYMBOL(outsb); | ||
| 196 | |||
| 197 | void outsw(unsigned long addr, const void *src, unsigned long count) | ||
| 198 | { | ||
| 199 | while (count) { | ||
| 200 | count -= 2; | ||
| 201 | outw(*(const short *)src, addr); | ||
| 202 | src += 2; | ||
| 203 | /* addr += 2; */ | ||
| 204 | } | ||
| 205 | } | ||
| 206 | EXPORT_SYMBOL(outsw); | ||
| 207 | |||
| 208 | void outsl(unsigned long addr, const void *src, unsigned long count) | ||
| 209 | { | ||
| 210 | while (count) { | ||
| 211 | count -= 4; | ||
| 212 | outl(*(const long *)src, addr); | ||
| 213 | src += 4; | ||
| 214 | /* addr += 4; */ | ||
| 215 | } | ||
| 216 | } | ||
| 217 | EXPORT_SYMBOL(outsl); | ||
| 218 | |||
| 219 | void insb(unsigned long addr, void *dst, unsigned long count) | ||
| 220 | { | ||
| 221 | while (count) { | ||
| 222 | count -= 1; | ||
| 223 | *(unsigned char *)dst = inb(addr); | ||
| 224 | dst += 1; | ||
| 225 | /* addr += 1; */ | ||
| 226 | } | ||
| 227 | } | ||
| 228 | EXPORT_SYMBOL(insb); | ||
| 229 | |||
| 230 | void insw(unsigned long addr, void *dst, unsigned long count) | ||
| 231 | { | ||
| 232 | while (count) { | ||
| 233 | count -= 2; | ||
| 234 | *(unsigned short *)dst = inw(addr); | ||
| 235 | dst += 2; | ||
| 236 | /* addr += 2; */ | ||
| 237 | } | ||
| 238 | } | ||
| 239 | EXPORT_SYMBOL(insw); | ||
| 240 | |||
| 241 | void insl(unsigned long addr, void *dst, unsigned long count) | ||
| 242 | { | ||
| 243 | while (count) { | ||
| 244 | count -= 4; | ||
| 245 | /* | ||
| 246 | * XXX I am sure we are in for an unaligned trap here. | ||
| 247 | */ | ||
| 248 | *(unsigned long *)dst = inl(addr); | ||
| 249 | dst += 4; | ||
| 250 | /* addr += 4; */ | ||
| 251 | } | ||
| 252 | } | ||
| 253 | EXPORT_SYMBOL(insl); | ||
diff --git a/arch/sparc/kernel/leon_pci_grpci2.c b/arch/sparc/kernel/leon_pci_grpci2.c new file mode 100644 index 000000000000..44dc093ee33a --- /dev/null +++ b/arch/sparc/kernel/leon_pci_grpci2.c | |||
| @@ -0,0 +1,897 @@ | |||
| 1 | /* | ||
| 2 | * leon_pci_grpci2.c: GRPCI2 Host PCI driver | ||
| 3 | * | ||
| 4 | * Copyright (C) 2011 Aeroflex Gaisler AB, Daniel Hellstrom | ||
| 5 | * | ||
| 6 | */ | ||
| 7 | |||
| 8 | #include <linux/of_device.h> | ||
| 9 | #include <linux/kernel.h> | ||
| 10 | #include <linux/pci.h> | ||
| 11 | #include <linux/delay.h> | ||
| 12 | #include <linux/module.h> | ||
| 13 | #include <asm/io.h> | ||
| 14 | #include <asm/leon.h> | ||
| 15 | #include <asm/vaddrs.h> | ||
| 16 | #include <asm/sections.h> | ||
| 17 | #include <asm/leon_pci.h> | ||
| 18 | |||
| 19 | #include "irq.h" | ||
| 20 | |||
| 21 | struct grpci2_barcfg { | ||
| 22 | unsigned long pciadr; /* PCI Space Address */ | ||
| 23 | unsigned long ahbadr; /* PCI Base address mapped to this AHB addr */ | ||
| 24 | }; | ||
| 25 | |||
| 26 | /* Device Node Configuration options: | ||
| 27 | * - barcfgs : Custom Configuration of Host's 6 target BARs | ||
| 28 | * - irq_mask : Limit which PCI interrupts are enabled | ||
| 29 | * - do_reset : Force PCI Reset on startup | ||
| 30 | * | ||
| 31 | * barcfgs | ||
| 32 | * ======= | ||
| 33 | * | ||
| 34 | * Optional custom Target BAR configuration (see struct grpci2_barcfg). All | ||
| 35 | * addresses are physical. Array always contains 6 elements (len=2*4*6 bytes) | ||
| 36 | * | ||
| 37 | * -1 means not configured (let host driver do default setup). | ||
| 38 | * | ||
| 39 | * [i*2+0] = PCI Address of BAR[i] on target interface | ||
| 40 | * [i*2+1] = Accessing PCI address of BAR[i] result in this AMBA address | ||
| 41 | * | ||
| 42 | * | ||
| 43 | * irq_mask | ||
| 44 | * ======== | ||
| 45 | * | ||
| 46 | * Limit which PCI interrupts are enabled. 0=Disable, 1=Enable. By default | ||
| 47 | * all are enabled. Use this when PCI interrupt pins are floating on PCB. | ||
| 48 | * int, len=4. | ||
| 49 | * bit0 = PCI INTA# | ||
| 50 | * bit1 = PCI INTB# | ||
| 51 | * bit2 = PCI INTC# | ||
| 52 | * bit3 = PCI INTD# | ||
| 53 | * | ||
| 54 | * | ||
| 55 | * reset | ||
| 56 | * ===== | ||
| 57 | * | ||
| 58 | * Force PCI reset on startup. int, len=4 | ||
| 59 | */ | ||
| 60 | |||
| 61 | /* Enable Debugging Configuration Space Access */ | ||
| 62 | #undef GRPCI2_DEBUG_CFGACCESS | ||
| 63 | |||
| 64 | /* | ||
| 65 | * GRPCI2 APB Register MAP | ||
| 66 | */ | ||
| 67 | struct grpci2_regs { | ||
| 68 | unsigned int ctrl; /* 0x00 Control */ | ||
| 69 | unsigned int sts_cap; /* 0x04 Status / Capabilities */ | ||
| 70 | int res1; /* 0x08 */ | ||
| 71 | unsigned int io_map; /* 0x0C I/O Map address */ | ||
| 72 | unsigned int dma_ctrl; /* 0x10 DMA */ | ||
| 73 | unsigned int dma_bdbase; /* 0x14 DMA */ | ||
| 74 | int res2[2]; /* 0x18 */ | ||
| 75 | unsigned int bars[6]; /* 0x20 read-only PCI BARs */ | ||
| 76 | int res3[2]; /* 0x38 */ | ||
| 77 | unsigned int ahbmst_map[16]; /* 0x40 AHB->PCI Map per AHB Master */ | ||
| 78 | |||
| 79 | /* PCI Trace Buffer Registers (OPTIONAL) */ | ||
| 80 | unsigned int t_ctrl; /* 0x80 */ | ||
| 81 | unsigned int t_cnt; /* 0x84 */ | ||
| 82 | unsigned int t_adpat; /* 0x88 */ | ||
| 83 | unsigned int t_admask; /* 0x8C */ | ||
| 84 | unsigned int t_sigpat; /* 0x90 */ | ||
| 85 | unsigned int t_sigmask; /* 0x94 */ | ||
| 86 | unsigned int t_adstate; /* 0x98 */ | ||
| 87 | unsigned int t_sigstate; /* 0x9C */ | ||
| 88 | }; | ||
| 89 | |||
| 90 | #define REGLOAD(a) (be32_to_cpu(__raw_readl(&(a)))) | ||
| 91 | #define REGSTORE(a, v) (__raw_writel(cpu_to_be32(v), &(a))) | ||
| 92 | |||
| 93 | #define CTRL_BUS_BIT 16 | ||
| 94 | |||
| 95 | #define CTRL_RESET (1<<31) | ||
| 96 | #define CTRL_SI (1<<27) | ||
| 97 | #define CTRL_PE (1<<26) | ||
| 98 | #define CTRL_EI (1<<25) | ||
| 99 | #define CTRL_ER (1<<24) | ||
| 100 | #define CTRL_BUS (0xff<<CTRL_BUS_BIT) | ||
| 101 | #define CTRL_HOSTINT 0xf | ||
| 102 | |||
| 103 | #define STS_HOST_BIT 31 | ||
| 104 | #define STS_MST_BIT 30 | ||
| 105 | #define STS_TAR_BIT 29 | ||
| 106 | #define STS_DMA_BIT 28 | ||
| 107 | #define STS_DI_BIT 27 | ||
| 108 | #define STS_HI_BIT 26 | ||
| 109 | #define STS_IRQMODE_BIT 24 | ||
| 110 | #define STS_TRACE_BIT 23 | ||
| 111 | #define STS_CFGERRVALID_BIT 20 | ||
| 112 | #define STS_CFGERR_BIT 19 | ||
| 113 | #define STS_INTTYPE_BIT 12 | ||
| 114 | #define STS_INTSTS_BIT 8 | ||
| 115 | #define STS_FDEPTH_BIT 2 | ||
| 116 | #define STS_FNUM_BIT 0 | ||
| 117 | |||
| 118 | #define STS_HOST (1<<STS_HOST_BIT) | ||
| 119 | #define STS_MST (1<<STS_MST_BIT) | ||
| 120 | #define STS_TAR (1<<STS_TAR_BIT) | ||
| 121 | #define STS_DMA (1<<STS_DMA_BIT) | ||
| 122 | #define STS_DI (1<<STS_DI_BIT) | ||
| 123 | #define STS_HI (1<<STS_HI_BIT) | ||
| 124 | #define STS_IRQMODE (0x3<<STS_IRQMODE_BIT) | ||
| 125 | #define STS_TRACE (1<<STS_TRACE_BIT) | ||
| 126 | #define STS_CFGERRVALID (1<<STS_CFGERRVALID_BIT) | ||
| 127 | #define STS_CFGERR (1<<STS_CFGERR_BIT) | ||
| 128 | #define STS_INTTYPE (0x3f<<STS_INTTYPE_BIT) | ||
| 129 | #define STS_INTSTS (0xf<<STS_INTSTS_BIT) | ||
| 130 | #define STS_FDEPTH (0x7<<STS_FDEPTH_BIT) | ||
| 131 | #define STS_FNUM (0x3<<STS_FNUM_BIT) | ||
| 132 | |||
| 133 | #define STS_ISYSERR (1<<17) | ||
| 134 | #define STS_IDMA (1<<16) | ||
| 135 | #define STS_IDMAERR (1<<15) | ||
| 136 | #define STS_IMSTABRT (1<<14) | ||
| 137 | #define STS_ITGTABRT (1<<13) | ||
| 138 | #define STS_IPARERR (1<<12) | ||
| 139 | |||
| 140 | #define STS_ERR_IRQ (STS_ISYSERR | STS_IMSTABRT | STS_ITGTABRT | STS_IPARERR) | ||
| 141 | |||
| 142 | struct grpci2_bd_chan { | ||
| 143 | unsigned int ctrl; /* 0x00 DMA Control */ | ||
| 144 | unsigned int nchan; /* 0x04 Next DMA Channel Address */ | ||
| 145 | unsigned int nbd; /* 0x08 Next Data Descriptor in chan */ | ||
| 146 | unsigned int res; /* 0x0C Reserved */ | ||
| 147 | }; | ||
| 148 | |||
| 149 | #define BD_CHAN_EN 0x80000000 | ||
| 150 | #define BD_CHAN_TYPE 0x00300000 | ||
| 151 | #define BD_CHAN_BDCNT 0x0000ffff | ||
| 152 | #define BD_CHAN_EN_BIT 31 | ||
| 153 | #define BD_CHAN_TYPE_BIT 20 | ||
| 154 | #define BD_CHAN_BDCNT_BIT 0 | ||
| 155 | |||
| 156 | struct grpci2_bd_data { | ||
| 157 | unsigned int ctrl; /* 0x00 DMA Data Control */ | ||
| 158 | unsigned int pci_adr; /* 0x04 PCI Start Address */ | ||
| 159 | unsigned int ahb_adr; /* 0x08 AHB Start address */ | ||
| 160 | unsigned int next; /* 0x0C Next Data Descriptor in chan */ | ||
| 161 | }; | ||
| 162 | |||
| 163 | #define BD_DATA_EN 0x80000000 | ||
| 164 | #define BD_DATA_IE 0x40000000 | ||
| 165 | #define BD_DATA_DR 0x20000000 | ||
| 166 | #define BD_DATA_TYPE 0x00300000 | ||
| 167 | #define BD_DATA_ER 0x00080000 | ||
| 168 | #define BD_DATA_LEN 0x0000ffff | ||
| 169 | #define BD_DATA_EN_BIT 31 | ||
| 170 | #define BD_DATA_IE_BIT 30 | ||
| 171 | #define BD_DATA_DR_BIT 29 | ||
| 172 | #define BD_DATA_TYPE_BIT 20 | ||
| 173 | #define BD_DATA_ER_BIT 19 | ||
| 174 | #define BD_DATA_LEN_BIT 0 | ||
| 175 | |||
| 176 | /* GRPCI2 Capability */ | ||
| 177 | struct grpci2_cap_first { | ||
| 178 | unsigned int ctrl; | ||
| 179 | unsigned int pci2ahb_map[6]; | ||
| 180 | unsigned int ext2ahb_map; | ||
| 181 | unsigned int io_map; | ||
| 182 | unsigned int pcibar_size[6]; | ||
| 183 | }; | ||
| 184 | #define CAP9_CTRL_OFS 0 | ||
| 185 | #define CAP9_BAR_OFS 0x4 | ||
| 186 | #define CAP9_IOMAP_OFS 0x20 | ||
| 187 | #define CAP9_BARSIZE_OFS 0x24 | ||
| 188 | |||
| 189 | struct grpci2_priv { | ||
| 190 | struct leon_pci_info info; /* must be on top of this structure */ | ||
| 191 | struct grpci2_regs *regs; | ||
| 192 | char irq; | ||
| 193 | char irq_mode; /* IRQ Mode from CAPSTS REG */ | ||
| 194 | char bt_enabled; | ||
| 195 | char do_reset; | ||
| 196 | char irq_mask; | ||
| 197 | u32 pciid; /* PCI ID of Host */ | ||
| 198 | unsigned char irq_map[4]; | ||
| 199 | |||
| 200 | /* Virtual IRQ numbers */ | ||
| 201 | unsigned int virq_err; | ||
| 202 | unsigned int virq_dma; | ||
| 203 | |||
| 204 | /* AHB PCI Windows */ | ||
| 205 | unsigned long pci_area; /* MEMORY */ | ||
| 206 | unsigned long pci_area_end; | ||
| 207 | unsigned long pci_io; /* I/O */ | ||
| 208 | unsigned long pci_conf; /* CONFIGURATION */ | ||
| 209 | unsigned long pci_conf_end; | ||
| 210 | unsigned long pci_io_va; | ||
| 211 | |||
| 212 | struct grpci2_barcfg tgtbars[6]; | ||
| 213 | }; | ||
| 214 | |||
| 215 | DEFINE_SPINLOCK(grpci2_dev_lock); | ||
| 216 | struct grpci2_priv *grpci2priv; | ||
| 217 | |||
| 218 | int grpci2_map_irq(struct pci_dev *dev, u8 slot, u8 pin) | ||
| 219 | { | ||
| 220 | struct grpci2_priv *priv = dev->bus->sysdata; | ||
| 221 | int irq_group; | ||
| 222 | |||
| 223 | /* Use default IRQ decoding on PCI BUS0 according slot numbering */ | ||
| 224 | irq_group = slot & 0x3; | ||
| 225 | pin = ((pin - 1) + irq_group) & 0x3; | ||
| 226 | |||
| 227 | return priv->irq_map[pin]; | ||
| 228 | } | ||
| 229 | |||
| 230 | static int grpci2_cfg_r32(struct grpci2_priv *priv, unsigned int bus, | ||
| 231 | unsigned int devfn, int where, u32 *val) | ||
| 232 | { | ||
| 233 | unsigned int *pci_conf; | ||
| 234 | unsigned long flags; | ||
| 235 | u32 tmp; | ||
| 236 | |||
| 237 | if (where & 0x3) | ||
| 238 | return -EINVAL; | ||
| 239 | |||
| 240 | if (bus == 0 && PCI_SLOT(devfn) != 0) | ||
| 241 | devfn += (0x8 * 6); | ||
| 242 | |||
| 243 | /* Select bus */ | ||
| 244 | spin_lock_irqsave(&grpci2_dev_lock, flags); | ||
| 245 | REGSTORE(priv->regs->ctrl, (REGLOAD(priv->regs->ctrl) & ~(0xff << 16)) | | ||
| 246 | (bus << 16)); | ||
| 247 | spin_unlock_irqrestore(&grpci2_dev_lock, flags); | ||
| 248 | |||
| 249 | /* clear old status */ | ||
| 250 | REGSTORE(priv->regs->sts_cap, (STS_CFGERR | STS_CFGERRVALID)); | ||
| 251 | |||
| 252 | pci_conf = (unsigned int *) (priv->pci_conf | | ||
| 253 | (devfn << 8) | (where & 0xfc)); | ||
| 254 | tmp = LEON3_BYPASS_LOAD_PA(pci_conf); | ||
| 255 | |||
| 256 | /* Wait until GRPCI2 signals that CFG access is done, it should be | ||
| 257 | * done instantaneously unless a DMA operation is ongoing... | ||
| 258 | */ | ||
| 259 | while ((REGLOAD(priv->regs->sts_cap) & STS_CFGERRVALID) == 0) | ||
| 260 | ; | ||
| 261 | |||
| 262 | if (REGLOAD(priv->regs->sts_cap) & STS_CFGERR) { | ||
| 263 | *val = 0xffffffff; | ||
| 264 | } else { | ||
| 265 | /* Bus always little endian (unaffected by byte-swapping) */ | ||
| 266 | *val = flip_dword(tmp); | ||
| 267 | } | ||
| 268 | |||
| 269 | return 0; | ||
| 270 | } | ||
| 271 | |||
| 272 | static int grpci2_cfg_r16(struct grpci2_priv *priv, unsigned int bus, | ||
| 273 | unsigned int devfn, int where, u32 *val) | ||
| 274 | { | ||
| 275 | u32 v; | ||
| 276 | int ret; | ||
| 277 | |||
| 278 | if (where & 0x1) | ||
| 279 | return -EINVAL; | ||
| 280 | ret = grpci2_cfg_r32(priv, bus, devfn, where & ~0x3, &v); | ||
| 281 | *val = 0xffff & (v >> (8 * (where & 0x3))); | ||
| 282 | return ret; | ||
| 283 | } | ||
| 284 | |||
| 285 | static int grpci2_cfg_r8(struct grpci2_priv *priv, unsigned int bus, | ||
| 286 | unsigned int devfn, int where, u32 *val) | ||
| 287 | { | ||
| 288 | u32 v; | ||
| 289 | int ret; | ||
| 290 | |||
| 291 | ret = grpci2_cfg_r32(priv, bus, devfn, where & ~0x3, &v); | ||
| 292 | *val = 0xff & (v >> (8 * (where & 3))); | ||
| 293 | |||
| 294 | return ret; | ||
| 295 | } | ||
| 296 | |||
| 297 | static int grpci2_cfg_w32(struct grpci2_priv *priv, unsigned int bus, | ||
| 298 | unsigned int devfn, int where, u32 val) | ||
| 299 | { | ||
| 300 | unsigned int *pci_conf; | ||
| 301 | unsigned long flags; | ||
| 302 | |||
| 303 | if (where & 0x3) | ||
| 304 | return -EINVAL; | ||
| 305 | |||
| 306 | if (bus == 0 && PCI_SLOT(devfn) != 0) | ||
| 307 | devfn += (0x8 * 6); | ||
| 308 | |||
| 309 | /* Select bus */ | ||
| 310 | spin_lock_irqsave(&grpci2_dev_lock, flags); | ||
| 311 | REGSTORE(priv->regs->ctrl, (REGLOAD(priv->regs->ctrl) & ~(0xff << 16)) | | ||
| 312 | (bus << 16)); | ||
| 313 | spin_unlock_irqrestore(&grpci2_dev_lock, flags); | ||
| 314 | |||
| 315 | /* clear old status */ | ||
| 316 | REGSTORE(priv->regs->sts_cap, (STS_CFGERR | STS_CFGERRVALID)); | ||
| 317 | |||
| 318 | pci_conf = (unsigned int *) (priv->pci_conf | | ||
| 319 | (devfn << 8) | (where & 0xfc)); | ||
| 320 | LEON3_BYPASS_STORE_PA(pci_conf, flip_dword(val)); | ||
| 321 | |||
| 322 | /* Wait until GRPCI2 signals that CFG access is done, it should be | ||
| 323 | * done instantaneously unless a DMA operation is ongoing... | ||
| 324 | */ | ||
| 325 | while ((REGLOAD(priv->regs->sts_cap) & STS_CFGERRVALID) == 0) | ||
| 326 | ; | ||
| 327 | |||
| 328 | return 0; | ||
| 329 | } | ||
| 330 | |||
| 331 | static int grpci2_cfg_w16(struct grpci2_priv *priv, unsigned int bus, | ||
| 332 | unsigned int devfn, int where, u32 val) | ||
| 333 | { | ||
| 334 | int ret; | ||
| 335 | u32 v; | ||
| 336 | |||
| 337 | if (where & 0x1) | ||
| 338 | return -EINVAL; | ||
| 339 | ret = grpci2_cfg_r32(priv, bus, devfn, where&~3, &v); | ||
| 340 | if (ret) | ||
| 341 | return ret; | ||
| 342 | v = (v & ~(0xffff << (8 * (where & 0x3)))) | | ||
| 343 | ((0xffff & val) << (8 * (where & 0x3))); | ||
| 344 | return grpci2_cfg_w32(priv, bus, devfn, where & ~0x3, v); | ||
| 345 | } | ||
| 346 | |||
| 347 | static int grpci2_cfg_w8(struct grpci2_priv *priv, unsigned int bus, | ||
| 348 | unsigned int devfn, int where, u32 val) | ||
| 349 | { | ||
| 350 | int ret; | ||
| 351 | u32 v; | ||
| 352 | |||
| 353 | ret = grpci2_cfg_r32(priv, bus, devfn, where & ~0x3, &v); | ||
| 354 | if (ret != 0) | ||
| 355 | return ret; | ||
| 356 | v = (v & ~(0xff << (8 * (where & 0x3)))) | | ||
| 357 | ((0xff & val) << (8 * (where & 0x3))); | ||
| 358 | return grpci2_cfg_w32(priv, bus, devfn, where & ~0x3, v); | ||
| 359 | } | ||
| 360 | |||
| 361 | /* Read from Configuration Space. When entering here the PCI layer has taken | ||
| 362 | * the pci_lock spinlock and IRQ is off. | ||
| 363 | */ | ||
| 364 | static int grpci2_read_config(struct pci_bus *bus, unsigned int devfn, | ||
| 365 | int where, int size, u32 *val) | ||
| 366 | { | ||
| 367 | struct grpci2_priv *priv = grpci2priv; | ||
| 368 | unsigned int busno = bus->number; | ||
| 369 | int ret; | ||
| 370 | |||
| 371 | if (PCI_SLOT(devfn) > 15 || (PCI_SLOT(devfn) == 0 && busno == 0)) { | ||
| 372 | *val = ~0; | ||
| 373 | return 0; | ||
| 374 | } | ||
| 375 | |||
| 376 | switch (size) { | ||
| 377 | case 1: | ||
| 378 | ret = grpci2_cfg_r8(priv, busno, devfn, where, val); | ||
| 379 | break; | ||
| 380 | case 2: | ||
| 381 | ret = grpci2_cfg_r16(priv, busno, devfn, where, val); | ||
| 382 | break; | ||
| 383 | case 4: | ||
| 384 | ret = grpci2_cfg_r32(priv, busno, devfn, where, val); | ||
| 385 | break; | ||
| 386 | default: | ||
| 387 | ret = -EINVAL; | ||
| 388 | break; | ||
| 389 | } | ||
| 390 | |||
| 391 | #ifdef GRPCI2_DEBUG_CFGACCESS | ||
| 392 | printk(KERN_INFO "grpci2_read_config: [%02x:%02x:%x] ofs=%d val=%x " | ||
| 393 | "size=%d\n", busno, PCI_SLOT(devfn), PCI_FUNC(devfn), where, | ||
| 394 | *val, size); | ||
| 395 | #endif | ||
| 396 | |||
| 397 | return ret; | ||
| 398 | } | ||
| 399 | |||
| 400 | /* Write to Configuration Space. When entering here the PCI layer has taken | ||
| 401 | * the pci_lock spinlock and IRQ is off. | ||
| 402 | */ | ||
| 403 | static int grpci2_write_config(struct pci_bus *bus, unsigned int devfn, | ||
| 404 | int where, int size, u32 val) | ||
| 405 | { | ||
| 406 | struct grpci2_priv *priv = grpci2priv; | ||
| 407 | unsigned int busno = bus->number; | ||
| 408 | |||
| 409 | if (PCI_SLOT(devfn) > 15 || (PCI_SLOT(devfn) == 0 && busno == 0)) | ||
| 410 | return 0; | ||
| 411 | |||
| 412 | #ifdef GRPCI2_DEBUG_CFGACCESS | ||
| 413 | printk(KERN_INFO "grpci2_write_config: [%02x:%02x:%x] ofs=%d size=%d " | ||
| 414 | "val=%x\n", busno, PCI_SLOT(devfn), PCI_FUNC(devfn), | ||
| 415 | where, size, val); | ||
| 416 | #endif | ||
| 417 | |||
| 418 | switch (size) { | ||
| 419 | default: | ||
| 420 | return -EINVAL; | ||
| 421 | case 1: | ||
| 422 | return grpci2_cfg_w8(priv, busno, devfn, where, val); | ||
| 423 | case 2: | ||
| 424 | return grpci2_cfg_w16(priv, busno, devfn, where, val); | ||
| 425 | case 4: | ||
| 426 | return grpci2_cfg_w32(priv, busno, devfn, where, val); | ||
| 427 | } | ||
| 428 | } | ||
| 429 | |||
| 430 | static struct pci_ops grpci2_ops = { | ||
| 431 | .read = grpci2_read_config, | ||
| 432 | .write = grpci2_write_config, | ||
| 433 | }; | ||
| 434 | |||
| 435 | /* GENIRQ IRQ chip implementation for GRPCI2 irqmode=0..2. In configuration | ||
| 436 | * 3 where all PCI Interrupts has a separate IRQ on the system IRQ controller | ||
| 437 | * this is not needed and the standard IRQ controller can be used. | ||
| 438 | */ | ||
| 439 | |||
| 440 | static void grpci2_mask_irq(struct irq_data *data) | ||
| 441 | { | ||
| 442 | unsigned long flags; | ||
| 443 | unsigned int irqidx; | ||
| 444 | struct grpci2_priv *priv = grpci2priv; | ||
| 445 | |||
| 446 | irqidx = (unsigned int)data->chip_data - 1; | ||
| 447 | if (irqidx > 3) /* only mask PCI interrupts here */ | ||
| 448 | return; | ||
| 449 | |||
| 450 | spin_lock_irqsave(&grpci2_dev_lock, flags); | ||
| 451 | REGSTORE(priv->regs->ctrl, REGLOAD(priv->regs->ctrl) & ~(1 << irqidx)); | ||
| 452 | spin_unlock_irqrestore(&grpci2_dev_lock, flags); | ||
| 453 | } | ||
| 454 | |||
| 455 | static void grpci2_unmask_irq(struct irq_data *data) | ||
| 456 | { | ||
| 457 | unsigned long flags; | ||
| 458 | unsigned int irqidx; | ||
| 459 | struct grpci2_priv *priv = grpci2priv; | ||
| 460 | |||
| 461 | irqidx = (unsigned int)data->chip_data - 1; | ||
| 462 | if (irqidx > 3) /* only unmask PCI interrupts here */ | ||
| 463 | return; | ||
| 464 | |||
| 465 | spin_lock_irqsave(&grpci2_dev_lock, flags); | ||
| 466 | REGSTORE(priv->regs->ctrl, REGLOAD(priv->regs->ctrl) | (1 << irqidx)); | ||
| 467 | spin_unlock_irqrestore(&grpci2_dev_lock, flags); | ||
| 468 | } | ||
| 469 | |||
| 470 | static unsigned int grpci2_startup_irq(struct irq_data *data) | ||
| 471 | { | ||
| 472 | grpci2_unmask_irq(data); | ||
| 473 | return 0; | ||
| 474 | } | ||
| 475 | |||
| 476 | static void grpci2_shutdown_irq(struct irq_data *data) | ||
| 477 | { | ||
| 478 | grpci2_mask_irq(data); | ||
| 479 | } | ||
| 480 | |||
| 481 | static struct irq_chip grpci2_irq = { | ||
| 482 | .name = "grpci2", | ||
| 483 | .irq_startup = grpci2_startup_irq, | ||
| 484 | .irq_shutdown = grpci2_shutdown_irq, | ||
| 485 | .irq_mask = grpci2_mask_irq, | ||
| 486 | .irq_unmask = grpci2_unmask_irq, | ||
| 487 | }; | ||
| 488 | |||
| 489 | /* Handle one or multiple IRQs from the PCI core */ | ||
| 490 | static void grpci2_pci_flow_irq(unsigned int irq, struct irq_desc *desc) | ||
| 491 | { | ||
| 492 | struct grpci2_priv *priv = grpci2priv; | ||
| 493 | int i, ack = 0; | ||
| 494 | unsigned int ctrl, sts_cap, pci_ints; | ||
| 495 | |||
| 496 | ctrl = REGLOAD(priv->regs->ctrl); | ||
| 497 | sts_cap = REGLOAD(priv->regs->sts_cap); | ||
| 498 | |||
| 499 | /* Error Interrupt? */ | ||
| 500 | if (sts_cap & STS_ERR_IRQ) { | ||
| 501 | generic_handle_irq(priv->virq_err); | ||
| 502 | ack = 1; | ||
| 503 | } | ||
| 504 | |||
| 505 | /* PCI Interrupt? */ | ||
| 506 | pci_ints = ((~sts_cap) >> STS_INTSTS_BIT) & ctrl & CTRL_HOSTINT; | ||
| 507 | if (pci_ints) { | ||
| 508 | /* Call respective PCI Interrupt handler */ | ||
| 509 | for (i = 0; i < 4; i++) { | ||
| 510 | if (pci_ints & (1 << i)) | ||
| 511 | generic_handle_irq(priv->irq_map[i]); | ||
| 512 | } | ||
| 513 | ack = 1; | ||
| 514 | } | ||
| 515 | |||
| 516 | /* | ||
| 517 | * Decode DMA Interrupt only when shared with Err and PCI INTX#, when | ||
| 518 | * the DMA is a unique IRQ the DMA interrupts doesn't end up here, they | ||
| 519 | * goes directly to DMA ISR. | ||
| 520 | */ | ||
| 521 | if ((priv->irq_mode == 0) && (sts_cap & (STS_IDMA | STS_IDMAERR))) { | ||
| 522 | generic_handle_irq(priv->virq_dma); | ||
| 523 | ack = 1; | ||
| 524 | } | ||
| 525 | |||
| 526 | /* | ||
| 527 | * Call "first level" IRQ chip end-of-irq handler. It will ACK LEON IRQ | ||
| 528 | * Controller, this must be done after IRQ sources have been handled to | ||
| 529 | * avoid double IRQ generation | ||
| 530 | */ | ||
| 531 | if (ack) | ||
| 532 | desc->irq_data.chip->irq_eoi(&desc->irq_data); | ||
| 533 | } | ||
| 534 | |||
| 535 | /* Create a virtual IRQ */ | ||
| 536 | static unsigned int grpci2_build_device_irq(unsigned int irq) | ||
| 537 | { | ||
| 538 | unsigned int virq = 0, pil; | ||
| 539 | |||
| 540 | pil = 1 << 8; | ||
| 541 | virq = irq_alloc(irq, pil); | ||
| 542 | if (virq == 0) | ||
| 543 | goto out; | ||
| 544 | |||
| 545 | irq_set_chip_and_handler_name(virq, &grpci2_irq, handle_simple_irq, | ||
| 546 | "pcilvl"); | ||
| 547 | irq_set_chip_data(virq, (void *)irq); | ||
| 548 | |||
| 549 | out: | ||
| 550 | return virq; | ||
| 551 | } | ||
| 552 | |||
| 553 | void grpci2_hw_init(struct grpci2_priv *priv) | ||
| 554 | { | ||
| 555 | u32 ahbadr, pciadr, bar_sz, capptr, io_map, data; | ||
| 556 | struct grpci2_regs *regs = priv->regs; | ||
| 557 | int i; | ||
| 558 | struct grpci2_barcfg *barcfg = priv->tgtbars; | ||
| 559 | |||
| 560 | /* Reset any earlier setup */ | ||
| 561 | if (priv->do_reset) { | ||
| 562 | printk(KERN_INFO "GRPCI2: Resetting PCI bus\n"); | ||
| 563 | REGSTORE(regs->ctrl, CTRL_RESET); | ||
| 564 | ssleep(1); /* Wait for boards to settle */ | ||
| 565 | } | ||
| 566 | REGSTORE(regs->ctrl, 0); | ||
| 567 | REGSTORE(regs->sts_cap, ~0); /* Clear Status */ | ||
| 568 | REGSTORE(regs->dma_ctrl, 0); | ||
| 569 | REGSTORE(regs->dma_bdbase, 0); | ||
| 570 | |||
| 571 | /* Translate I/O accesses to 0, I/O Space always @ PCI low 64Kbytes */ | ||
| 572 | REGSTORE(regs->io_map, REGLOAD(regs->io_map) & 0x0000ffff); | ||
| 573 | |||
| 574 | /* set 1:1 mapping between AHB -> PCI memory space, for all Masters | ||
| 575 | * Each AHB master has it's own mapping registers. Max 16 AHB masters. | ||
| 576 | */ | ||
| 577 | for (i = 0; i < 16; i++) | ||
| 578 | REGSTORE(regs->ahbmst_map[i], priv->pci_area); | ||
| 579 | |||
| 580 | /* Get the GRPCI2 Host PCI ID */ | ||
| 581 | grpci2_cfg_r32(priv, 0, 0, PCI_VENDOR_ID, &priv->pciid); | ||
| 582 | |||
| 583 | /* Get address to first (always defined) capability structure */ | ||
| 584 | grpci2_cfg_r8(priv, 0, 0, PCI_CAPABILITY_LIST, &capptr); | ||
| 585 | |||
| 586 | /* Enable/Disable Byte twisting */ | ||
| 587 | grpci2_cfg_r32(priv, 0, 0, capptr+CAP9_IOMAP_OFS, &io_map); | ||
| 588 | io_map = (io_map & ~0x1) | (priv->bt_enabled ? 1 : 0); | ||
| 589 | grpci2_cfg_w32(priv, 0, 0, capptr+CAP9_IOMAP_OFS, io_map); | ||
| 590 | |||
| 591 | /* Setup the Host's PCI Target BARs for other peripherals to access, | ||
| 592 | * and do DMA to the host's memory. The target BARs can be sized and | ||
| 593 | * enabled individually. | ||
| 594 | * | ||
| 595 | * User may set custom target BARs, but default is: | ||
| 596 | * The first BARs is used to map kernel low (DMA is part of normal | ||
| 597 | * region on sparc which is SRMMU_MAXMEM big) main memory 1:1 to the | ||
| 598 | * PCI bus, the other BARs are disabled. We assume that the first BAR | ||
| 599 | * is always available. | ||
| 600 | */ | ||
| 601 | for (i = 0; i < 6; i++) { | ||
| 602 | if (barcfg[i].pciadr != ~0 && barcfg[i].ahbadr != ~0) { | ||
| 603 | /* Target BARs must have the proper alignment */ | ||
| 604 | ahbadr = barcfg[i].ahbadr; | ||
| 605 | pciadr = barcfg[i].pciadr; | ||
| 606 | bar_sz = ((pciadr - 1) & ~pciadr) + 1; | ||
| 607 | } else { | ||
| 608 | if (i == 0) { | ||
| 609 | /* Map main memory */ | ||
| 610 | bar_sz = 0xf0000008; /* 256MB prefetchable */ | ||
| 611 | ahbadr = 0xf0000000 & (u32)__pa(PAGE_ALIGN( | ||
| 612 | (unsigned long) &_end)); | ||
| 613 | pciadr = ahbadr; | ||
| 614 | } else { | ||
| 615 | bar_sz = 0; | ||
| 616 | ahbadr = 0; | ||
| 617 | pciadr = 0; | ||
| 618 | } | ||
| 619 | } | ||
| 620 | grpci2_cfg_w32(priv, 0, 0, capptr+CAP9_BARSIZE_OFS+i*4, bar_sz); | ||
| 621 | grpci2_cfg_w32(priv, 0, 0, PCI_BASE_ADDRESS_0+i*4, pciadr); | ||
| 622 | grpci2_cfg_w32(priv, 0, 0, capptr+CAP9_BAR_OFS+i*4, ahbadr); | ||
| 623 | printk(KERN_INFO " TGT BAR[%d]: 0x%08x (PCI)-> 0x%08x\n", | ||
| 624 | i, pciadr, ahbadr); | ||
| 625 | } | ||
| 626 | |||
| 627 | /* set as bus master and enable pci memory responses */ | ||
| 628 | grpci2_cfg_r32(priv, 0, 0, PCI_COMMAND, &data); | ||
| 629 | data |= (PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER); | ||
| 630 | grpci2_cfg_w32(priv, 0, 0, PCI_COMMAND, data); | ||
| 631 | |||
| 632 | /* Enable Error respone (CPU-TRAP) on illegal memory access. */ | ||
| 633 | REGSTORE(regs->ctrl, CTRL_ER | CTRL_PE); | ||
| 634 | } | ||
| 635 | |||
| 636 | static irqreturn_t grpci2_jump_interrupt(int irq, void *arg) | ||
| 637 | { | ||
| 638 | printk(KERN_ERR "GRPCI2: Jump IRQ happened\n"); | ||
| 639 | return IRQ_NONE; | ||
| 640 | } | ||
| 641 | |||
| 642 | /* Handle GRPCI2 Error Interrupt */ | ||
| 643 | static irqreturn_t grpci2_err_interrupt(int irq, void *arg) | ||
| 644 | { | ||
| 645 | struct grpci2_priv *priv = arg; | ||
| 646 | struct grpci2_regs *regs = priv->regs; | ||
| 647 | unsigned int status; | ||
| 648 | |||
| 649 | status = REGLOAD(regs->sts_cap); | ||
| 650 | if ((status & STS_ERR_IRQ) == 0) | ||
| 651 | return IRQ_NONE; | ||
| 652 | |||
| 653 | if (status & STS_IPARERR) | ||
| 654 | printk(KERN_ERR "GRPCI2: Parity Error\n"); | ||
| 655 | |||
| 656 | if (status & STS_ITGTABRT) | ||
| 657 | printk(KERN_ERR "GRPCI2: Target Abort\n"); | ||
| 658 | |||
| 659 | if (status & STS_IMSTABRT) | ||
| 660 | printk(KERN_ERR "GRPCI2: Master Abort\n"); | ||
| 661 | |||
| 662 | if (status & STS_ISYSERR) | ||
| 663 | printk(KERN_ERR "GRPCI2: System Error\n"); | ||
| 664 | |||
| 665 | /* Clear handled INT TYPE IRQs */ | ||
| 666 | REGSTORE(regs->sts_cap, status & STS_ERR_IRQ); | ||
| 667 | |||
| 668 | return IRQ_HANDLED; | ||
| 669 | } | ||
| 670 | |||
| 671 | static int __devinit grpci2_of_probe(struct platform_device *ofdev) | ||
| 672 | { | ||
| 673 | struct grpci2_regs *regs; | ||
| 674 | struct grpci2_priv *priv; | ||
| 675 | int err, i, len; | ||
| 676 | const int *tmp; | ||
| 677 | unsigned int capability; | ||
| 678 | |||
| 679 | if (grpci2priv) { | ||
| 680 | printk(KERN_ERR "GRPCI2: only one GRPCI2 core supported\n"); | ||
| 681 | return -ENODEV; | ||
| 682 | } | ||
| 683 | |||
| 684 | if (ofdev->num_resources < 3) { | ||
| 685 | printk(KERN_ERR "GRPCI2: not enough APB/AHB resources\n"); | ||
| 686 | return -EIO; | ||
| 687 | } | ||
| 688 | |||
| 689 | /* Find Device Address */ | ||
| 690 | regs = of_ioremap(&ofdev->resource[0], 0, | ||
| 691 | resource_size(&ofdev->resource[0]), | ||
| 692 | "grlib-grpci2 regs"); | ||
| 693 | if (regs == NULL) { | ||
| 694 | printk(KERN_ERR "GRPCI2: ioremap failed\n"); | ||
| 695 | return -EIO; | ||
| 696 | } | ||
| 697 | |||
| 698 | /* | ||
| 699 | * Check that we're in Host Slot and that we can act as a Host Bridge | ||
| 700 | * and not only as target. | ||
| 701 | */ | ||
| 702 | capability = REGLOAD(regs->sts_cap); | ||
| 703 | if ((capability & STS_HOST) || !(capability & STS_MST)) { | ||
| 704 | printk(KERN_INFO "GRPCI2: not in host system slot\n"); | ||
| 705 | err = -EIO; | ||
| 706 | goto err1; | ||
| 707 | } | ||
| 708 | |||
| 709 | priv = grpci2priv = kzalloc(sizeof(struct grpci2_priv), GFP_KERNEL); | ||
| 710 | if (grpci2priv == NULL) { | ||
| 711 | err = -ENOMEM; | ||
| 712 | goto err1; | ||
| 713 | } | ||
| 714 | memset(grpci2priv, 0, sizeof(*grpci2priv)); | ||
| 715 | priv->regs = regs; | ||
| 716 | priv->irq = ofdev->archdata.irqs[0]; /* BASE IRQ */ | ||
| 717 | priv->irq_mode = (capability & STS_IRQMODE) >> STS_IRQMODE_BIT; | ||
| 718 | |||
| 719 | printk(KERN_INFO "GRPCI2: host found at %p, irq%d\n", regs, priv->irq); | ||
| 720 | |||
| 721 | /* Byte twisting should be made configurable from kernel command line */ | ||
| 722 | priv->bt_enabled = 1; | ||
| 723 | |||
| 724 | /* Let user do custom Target BAR assignment */ | ||
| 725 | tmp = of_get_property(ofdev->dev.of_node, "barcfg", &len); | ||
| 726 | if (tmp && (len == 2*4*6)) | ||
| 727 | memcpy(priv->tgtbars, tmp, 2*4*6); | ||
| 728 | else | ||
| 729 | memset(priv->tgtbars, -1, 2*4*6); | ||
| 730 | |||
| 731 | /* Limit IRQ unmasking in irq_mode 2 and 3 */ | ||
| 732 | tmp = of_get_property(ofdev->dev.of_node, "irq_mask", &len); | ||
| 733 | if (tmp && (len == 4)) | ||
| 734 | priv->do_reset = *tmp; | ||
| 735 | else | ||
| 736 | priv->irq_mask = 0xf; | ||
| 737 | |||
| 738 | /* Optional PCI reset. Force PCI reset on startup */ | ||
| 739 | tmp = of_get_property(ofdev->dev.of_node, "reset", &len); | ||
| 740 | if (tmp && (len == 4)) | ||
| 741 | priv->do_reset = *tmp; | ||
| 742 | else | ||
| 743 | priv->do_reset = 0; | ||
| 744 | |||
| 745 | /* Find PCI Memory, I/O and Configuration Space Windows */ | ||
| 746 | priv->pci_area = ofdev->resource[1].start; | ||
| 747 | priv->pci_area_end = ofdev->resource[1].end+1; | ||
| 748 | priv->pci_io = ofdev->resource[2].start; | ||
| 749 | priv->pci_conf = ofdev->resource[2].start + 0x10000; | ||
| 750 | priv->pci_conf_end = priv->pci_conf + 0x10000; | ||
| 751 | priv->pci_io_va = (unsigned long)ioremap(priv->pci_io, 0x10000); | ||
| 752 | if (!priv->pci_io_va) { | ||
| 753 | err = -EIO; | ||
| 754 | goto err2; | ||
| 755 | } | ||
| 756 | |||
| 757 | printk(KERN_INFO | ||
| 758 | "GRPCI2: MEMORY SPACE [0x%08lx - 0x%08lx]\n" | ||
| 759 | " I/O SPACE [0x%08lx - 0x%08lx]\n" | ||
| 760 | " CONFIG SPACE [0x%08lx - 0x%08lx]\n", | ||
| 761 | priv->pci_area, priv->pci_area_end-1, | ||
| 762 | priv->pci_io, priv->pci_conf-1, | ||
| 763 | priv->pci_conf, priv->pci_conf_end-1); | ||
| 764 | |||
| 765 | /* | ||
| 766 | * I/O Space resources in I/O Window mapped into Virtual Adr Space | ||
| 767 | * We never use low 4KB because some devices seem have problems using | ||
| 768 | * address 0. | ||
| 769 | */ | ||
| 770 | memset(&priv->info.io_space, 0, sizeof(struct resource)); | ||
| 771 | priv->info.io_space.name = "GRPCI2 PCI I/O Space"; | ||
| 772 | priv->info.io_space.start = priv->pci_io_va + 0x1000; | ||
| 773 | priv->info.io_space.end = priv->pci_io_va + 0x10000 - 1; | ||
| 774 | priv->info.io_space.flags = IORESOURCE_IO; | ||
| 775 | |||
| 776 | /* | ||
| 777 | * GRPCI2 has no prefetchable memory, map everything as | ||
| 778 | * non-prefetchable memory | ||
| 779 | */ | ||
| 780 | memset(&priv->info.mem_space, 0, sizeof(struct resource)); | ||
| 781 | priv->info.mem_space.name = "GRPCI2 PCI MEM Space"; | ||
| 782 | priv->info.mem_space.start = priv->pci_area; | ||
| 783 | priv->info.mem_space.end = priv->pci_area_end - 1; | ||
| 784 | priv->info.mem_space.flags = IORESOURCE_MEM; | ||
| 785 | |||
| 786 | if (request_resource(&iomem_resource, &priv->info.mem_space) < 0) | ||
| 787 | goto err3; | ||
| 788 | if (request_resource(&ioport_resource, &priv->info.io_space) < 0) | ||
| 789 | goto err4; | ||
| 790 | |||
| 791 | grpci2_hw_init(priv); | ||
| 792 | |||
| 793 | /* | ||
| 794 | * Get PCI Interrupt to System IRQ mapping and setup IRQ handling | ||
| 795 | * Error IRQ always on PCI INTA. | ||
| 796 | */ | ||
| 797 | if (priv->irq_mode < 2) { | ||
| 798 | /* All PCI interrupts are shared using the same system IRQ */ | ||
| 799 | leon_update_virq_handling(priv->irq, grpci2_pci_flow_irq, | ||
| 800 | "pcilvl", 0); | ||
| 801 | |||
| 802 | priv->irq_map[0] = grpci2_build_device_irq(1); | ||
| 803 | priv->irq_map[1] = grpci2_build_device_irq(2); | ||
| 804 | priv->irq_map[2] = grpci2_build_device_irq(3); | ||
| 805 | priv->irq_map[3] = grpci2_build_device_irq(4); | ||
| 806 | |||
| 807 | priv->virq_err = grpci2_build_device_irq(5); | ||
| 808 | if (priv->irq_mode & 1) | ||
| 809 | priv->virq_dma = ofdev->archdata.irqs[1]; | ||
| 810 | else | ||
| 811 | priv->virq_dma = grpci2_build_device_irq(6); | ||
| 812 | |||
| 813 | /* Enable IRQs on LEON IRQ controller */ | ||
| 814 | err = request_irq(priv->irq, grpci2_jump_interrupt, 0, | ||
| 815 | "GRPCI2_JUMP", priv); | ||
| 816 | if (err) | ||
| 817 | printk(KERN_ERR "GRPCI2: ERR IRQ request failed\n"); | ||
| 818 | } else { | ||
| 819 | /* All PCI interrupts have an unique IRQ interrupt */ | ||
| 820 | for (i = 0; i < 4; i++) { | ||
| 821 | /* Make LEON IRQ layer handle level IRQ by acking */ | ||
| 822 | leon_update_virq_handling(ofdev->archdata.irqs[i], | ||
| 823 | handle_fasteoi_irq, "pcilvl", | ||
| 824 | 1); | ||
| 825 | priv->irq_map[i] = ofdev->archdata.irqs[i]; | ||
| 826 | } | ||
| 827 | priv->virq_err = priv->irq_map[0]; | ||
| 828 | if (priv->irq_mode & 1) | ||
| 829 | priv->virq_dma = ofdev->archdata.irqs[4]; | ||
| 830 | else | ||
| 831 | priv->virq_dma = priv->irq_map[0]; | ||
| 832 | |||
| 833 | /* Unmask all PCI interrupts, request_irq will not do that */ | ||
| 834 | REGSTORE(regs->ctrl, REGLOAD(regs->ctrl)|(priv->irq_mask&0xf)); | ||
| 835 | } | ||
| 836 | |||
| 837 | /* Setup IRQ handler for non-configuration space access errors */ | ||
| 838 | err = request_irq(priv->virq_err, grpci2_err_interrupt, IRQF_SHARED, | ||
| 839 | "GRPCI2_ERR", priv); | ||
| 840 | if (err) { | ||
| 841 | printk(KERN_DEBUG "GRPCI2: ERR VIRQ request failed: %d\n", err); | ||
| 842 | goto err5; | ||
| 843 | } | ||
| 844 | |||
| 845 | /* | ||
| 846 | * Enable Error Interrupts. PCI interrupts are unmasked once request_irq | ||
| 847 | * is called by the PCI Device drivers | ||
| 848 | */ | ||
| 849 | REGSTORE(regs->ctrl, REGLOAD(regs->ctrl) | CTRL_EI | CTRL_SI); | ||
| 850 | |||
| 851 | /* Init common layer and scan buses */ | ||
| 852 | priv->info.ops = &grpci2_ops; | ||
| 853 | priv->info.map_irq = grpci2_map_irq; | ||
| 854 | leon_pci_init(ofdev, &priv->info); | ||
| 855 | |||
| 856 | return 0; | ||
| 857 | |||
| 858 | err5: | ||
| 859 | release_resource(&priv->info.io_space); | ||
| 860 | err4: | ||
| 861 | release_resource(&priv->info.mem_space); | ||
| 862 | err3: | ||
| 863 | err = -ENOMEM; | ||
| 864 | iounmap((void *)priv->pci_io_va); | ||
| 865 | err2: | ||
| 866 | kfree(priv); | ||
| 867 | err1: | ||
| 868 | of_iounmap(&ofdev->resource[0], regs, | ||
| 869 | resource_size(&ofdev->resource[0])); | ||
| 870 | return err; | ||
| 871 | } | ||
| 872 | |||
| 873 | static struct of_device_id grpci2_of_match[] = { | ||
| 874 | { | ||
| 875 | .name = "GAISLER_GRPCI2", | ||
| 876 | }, | ||
| 877 | { | ||
| 878 | .name = "01_07c", | ||
| 879 | }, | ||
| 880 | {}, | ||
| 881 | }; | ||
| 882 | |||
| 883 | static struct platform_driver grpci2_of_driver = { | ||
| 884 | .driver = { | ||
| 885 | .name = "grpci2", | ||
| 886 | .owner = THIS_MODULE, | ||
| 887 | .of_match_table = grpci2_of_match, | ||
| 888 | }, | ||
| 889 | .probe = grpci2_of_probe, | ||
| 890 | }; | ||
| 891 | |||
| 892 | static int __init grpci2_init(void) | ||
| 893 | { | ||
| 894 | return platform_driver_register(&grpci2_of_driver); | ||
| 895 | } | ||
| 896 | |||
| 897 | subsys_initcall(grpci2_init); | ||
diff --git a/arch/sparc/kernel/module.c b/arch/sparc/kernel/module.c index 8d348c474a2f..99ba5baa9497 100644 --- a/arch/sparc/kernel/module.c +++ b/arch/sparc/kernel/module.c | |||
| @@ -214,7 +214,7 @@ int apply_relocate_add(Elf_Shdr *sechdrs, | |||
| 214 | me->name, | 214 | me->name, |
| 215 | (int) (ELF_R_TYPE(rel[i].r_info) & 0xff)); | 215 | (int) (ELF_R_TYPE(rel[i].r_info) & 0xff)); |
| 216 | return -ENOEXEC; | 216 | return -ENOEXEC; |
| 217 | }; | 217 | } |
| 218 | } | 218 | } |
| 219 | return 0; | 219 | return 0; |
| 220 | } | 220 | } |
diff --git a/arch/sparc/kernel/pci_common.c b/arch/sparc/kernel/pci_common.c index 6e3874b64488..a6895987fb70 100644 --- a/arch/sparc/kernel/pci_common.c +++ b/arch/sparc/kernel/pci_common.c | |||
| @@ -281,7 +281,7 @@ static int sun4v_read_pci_cfg(struct pci_bus *bus_dev, unsigned int devfn, | |||
| 281 | case 4: | 281 | case 4: |
| 282 | *value = ret & 0xffffffff; | 282 | *value = ret & 0xffffffff; |
| 283 | break; | 283 | break; |
| 284 | }; | 284 | } |
| 285 | 285 | ||
| 286 | 286 | ||
| 287 | return PCIBIOS_SUCCESSFUL; | 287 | return PCIBIOS_SUCCESSFUL; |
| @@ -456,7 +456,7 @@ void pci_determine_mem_io_space(struct pci_pbm_info *pbm) | |||
| 456 | 456 | ||
| 457 | default: | 457 | default: |
| 458 | break; | 458 | break; |
| 459 | }; | 459 | } |
| 460 | } | 460 | } |
| 461 | 461 | ||
| 462 | if (!saw_io || !saw_mem) { | 462 | if (!saw_io || !saw_mem) { |
diff --git a/arch/sparc/kernel/pci_schizo.c b/arch/sparc/kernel/pci_schizo.c index 283fbc329a43..f030b02edddd 100644 --- a/arch/sparc/kernel/pci_schizo.c +++ b/arch/sparc/kernel/pci_schizo.c | |||
| @@ -264,7 +264,7 @@ static void schizo_check_iommu_error_pbm(struct pci_pbm_info *pbm, | |||
| 264 | default: | 264 | default: |
| 265 | type_string = "ECC Error"; | 265 | type_string = "ECC Error"; |
| 266 | break; | 266 | break; |
| 267 | }; | 267 | } |
| 268 | printk("%s: IOMMU Error, type[%s]\n", | 268 | printk("%s: IOMMU Error, type[%s]\n", |
| 269 | pbm->name, type_string); | 269 | pbm->name, type_string); |
| 270 | 270 | ||
| @@ -319,7 +319,7 @@ static void schizo_check_iommu_error_pbm(struct pci_pbm_info *pbm, | |||
| 319 | default: | 319 | default: |
| 320 | type_string = "ECC Error"; | 320 | type_string = "ECC Error"; |
| 321 | break; | 321 | break; |
| 322 | }; | 322 | } |
| 323 | printk("%s: IOMMU TAG(%d)[error(%s) ctx(%x) wr(%d) str(%d) " | 323 | printk("%s: IOMMU TAG(%d)[error(%s) ctx(%x) wr(%d) str(%d) " |
| 324 | "sz(%dK) vpg(%08lx)]\n", | 324 | "sz(%dK) vpg(%08lx)]\n", |
| 325 | pbm->name, i, type_string, | 325 | pbm->name, i, type_string, |
| @@ -1328,7 +1328,7 @@ static int __devinit schizo_pbm_init(struct pci_pbm_info *pbm, | |||
| 1328 | default: | 1328 | default: |
| 1329 | chipset_name = "SCHIZO"; | 1329 | chipset_name = "SCHIZO"; |
| 1330 | break; | 1330 | break; |
| 1331 | }; | 1331 | } |
| 1332 | 1332 | ||
| 1333 | /* For SCHIZO, three OBP regs: | 1333 | /* For SCHIZO, three OBP regs: |
| 1334 | * 1) PBM controller regs | 1334 | * 1) PBM controller regs |
diff --git a/arch/sparc/kernel/prom_irqtrans.c b/arch/sparc/kernel/prom_irqtrans.c index 570b98f6e897..40e4936bd479 100644 --- a/arch/sparc/kernel/prom_irqtrans.c +++ b/arch/sparc/kernel/prom_irqtrans.c | |||
| @@ -694,7 +694,7 @@ static unsigned int sbus_of_build_irq(struct device_node *dp, | |||
| 694 | case 3: | 694 | case 3: |
| 695 | iclr = reg_base + SYSIO_ICLR_SLOT3; | 695 | iclr = reg_base + SYSIO_ICLR_SLOT3; |
| 696 | break; | 696 | break; |
| 697 | }; | 697 | } |
| 698 | 698 | ||
| 699 | iclr += ((unsigned long)sbus_level - 1UL) * 8UL; | 699 | iclr += ((unsigned long)sbus_level - 1UL) * 8UL; |
| 700 | } | 700 | } |
diff --git a/arch/sparc/kernel/psycho_common.c b/arch/sparc/kernel/psycho_common.c index fe2af66bb198..8db48e808ed4 100644 --- a/arch/sparc/kernel/psycho_common.c +++ b/arch/sparc/kernel/psycho_common.c | |||
| @@ -228,7 +228,7 @@ void psycho_check_iommu_error(struct pci_pbm_info *pbm, | |||
| 228 | default: | 228 | default: |
| 229 | type_str = "ECC Error"; | 229 | type_str = "ECC Error"; |
| 230 | break; | 230 | break; |
| 231 | }; | 231 | } |
| 232 | printk(KERN_ERR "%s: IOMMU Error, type[%s]\n", | 232 | printk(KERN_ERR "%s: IOMMU Error, type[%s]\n", |
| 233 | pbm->name, type_str); | 233 | pbm->name, type_str); |
| 234 | 234 | ||
diff --git a/arch/sparc/kernel/sbus.c b/arch/sparc/kernel/sbus.c index 2ca32d13abcf..a161b9c77f05 100644 --- a/arch/sparc/kernel/sbus.c +++ b/arch/sparc/kernel/sbus.c | |||
| @@ -97,7 +97,7 @@ void sbus_set_sbus64(struct device *dev, int bursts) | |||
| 97 | 97 | ||
| 98 | default: | 98 | default: |
| 99 | return; | 99 | return; |
| 100 | }; | 100 | } |
| 101 | 101 | ||
| 102 | val = upa_readq(cfg_reg); | 102 | val = upa_readq(cfg_reg); |
| 103 | if (val & (1UL << 14UL)) { | 103 | if (val & (1UL << 14UL)) { |
| @@ -244,7 +244,7 @@ static unsigned int sbus_build_irq(struct platform_device *op, unsigned int ino) | |||
| 244 | case 3: | 244 | case 3: |
| 245 | iclr = reg_base + SYSIO_ICLR_SLOT3; | 245 | iclr = reg_base + SYSIO_ICLR_SLOT3; |
| 246 | break; | 246 | break; |
| 247 | }; | 247 | } |
| 248 | 248 | ||
| 249 | iclr += ((unsigned long)sbus_level - 1UL) * 8UL; | 249 | iclr += ((unsigned long)sbus_level - 1UL) * 8UL; |
| 250 | } | 250 | } |
diff --git a/arch/sparc/kernel/setup_32.c b/arch/sparc/kernel/setup_32.c index 3249d3f3234d..d26e1f6c717a 100644 --- a/arch/sparc/kernel/setup_32.c +++ b/arch/sparc/kernel/setup_32.c | |||
| @@ -267,7 +267,7 @@ void __init setup_arch(char **cmdline_p) | |||
| 267 | default: | 267 | default: |
| 268 | printk("UNKNOWN!\n"); | 268 | printk("UNKNOWN!\n"); |
| 269 | break; | 269 | break; |
| 270 | }; | 270 | } |
| 271 | 271 | ||
| 272 | #ifdef CONFIG_DUMMY_CONSOLE | 272 | #ifdef CONFIG_DUMMY_CONSOLE |
| 273 | conswitchp = &dummy_con; | 273 | conswitchp = &dummy_con; |
diff --git a/arch/sparc/kernel/setup_64.c b/arch/sparc/kernel/setup_64.c index f3b6850cc8db..c4dd0999da86 100644 --- a/arch/sparc/kernel/setup_64.c +++ b/arch/sparc/kernel/setup_64.c | |||
| @@ -209,7 +209,7 @@ void __init per_cpu_patch(void) | |||
| 209 | default: | 209 | default: |
| 210 | prom_printf("Unknown cpu type, halting.\n"); | 210 | prom_printf("Unknown cpu type, halting.\n"); |
| 211 | prom_halt(); | 211 | prom_halt(); |
| 212 | }; | 212 | } |
| 213 | 213 | ||
| 214 | *(unsigned int *) (addr + 0) = insns[0]; | 214 | *(unsigned int *) (addr + 0) = insns[0]; |
| 215 | wmb(); | 215 | wmb(); |
diff --git a/arch/sparc/kernel/smp_32.c b/arch/sparc/kernel/smp_32.c index d5b3958be0b4..21b125341bf7 100644 --- a/arch/sparc/kernel/smp_32.c +++ b/arch/sparc/kernel/smp_32.c | |||
| @@ -114,7 +114,7 @@ void __init smp_cpus_done(unsigned int max_cpus) | |||
| 114 | printk("UNKNOWN!\n"); | 114 | printk("UNKNOWN!\n"); |
| 115 | BUG(); | 115 | BUG(); |
| 116 | break; | 116 | break; |
| 117 | }; | 117 | } |
| 118 | } | 118 | } |
| 119 | 119 | ||
| 120 | void cpu_panic(void) | 120 | void cpu_panic(void) |
| @@ -374,7 +374,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus) | |||
| 374 | printk("UNKNOWN!\n"); | 374 | printk("UNKNOWN!\n"); |
| 375 | BUG(); | 375 | BUG(); |
| 376 | break; | 376 | break; |
| 377 | }; | 377 | } |
| 378 | } | 378 | } |
| 379 | 379 | ||
| 380 | /* Set this up early so that things like the scheduler can init | 380 | /* Set this up early so that things like the scheduler can init |
| @@ -447,7 +447,7 @@ int __cpuinit __cpu_up(unsigned int cpu) | |||
| 447 | printk("UNKNOWN!\n"); | 447 | printk("UNKNOWN!\n"); |
| 448 | BUG(); | 448 | BUG(); |
| 449 | break; | 449 | break; |
| 450 | }; | 450 | } |
| 451 | 451 | ||
| 452 | if (!ret) { | 452 | if (!ret) { |
| 453 | cpumask_set_cpu(cpu, &smp_commenced_mask); | 453 | cpumask_set_cpu(cpu, &smp_commenced_mask); |
diff --git a/arch/sparc/kernel/sun4d_irq.c b/arch/sparc/kernel/sun4d_irq.c index a9ea60eb2c10..1d13c5bda0b1 100644 --- a/arch/sparc/kernel/sun4d_irq.c +++ b/arch/sparc/kernel/sun4d_irq.c | |||
| @@ -103,10 +103,9 @@ static void sun4d_sbus_handler_irq(int sbusl) | |||
| 103 | 103 | ||
| 104 | sbil = (sbusl << 2); | 104 | sbil = (sbusl << 2); |
| 105 | /* Loop for each pending SBI */ | 105 | /* Loop for each pending SBI */ |
| 106 | for (sbino = 0; bus_mask; sbino++) { | 106 | for (sbino = 0; bus_mask; sbino++, bus_mask >>= 1) { |
| 107 | unsigned int idx, mask; | 107 | unsigned int idx, mask; |
| 108 | 108 | ||
| 109 | bus_mask >>= 1; | ||
| 110 | if (!(bus_mask & 1)) | 109 | if (!(bus_mask & 1)) |
| 111 | continue; | 110 | continue; |
| 112 | /* XXX This seems to ACK the irq twice. acquire_sbi() | 111 | /* XXX This seems to ACK the irq twice. acquire_sbi() |
| @@ -118,19 +117,16 @@ static void sun4d_sbus_handler_irq(int sbusl) | |||
| 118 | mask &= (0xf << sbil); | 117 | mask &= (0xf << sbil); |
| 119 | 118 | ||
| 120 | /* Loop for each pending SBI slot */ | 119 | /* Loop for each pending SBI slot */ |
| 121 | idx = 0; | ||
| 122 | slot = (1 << sbil); | 120 | slot = (1 << sbil); |
| 123 | while (mask != 0) { | 121 | for (idx = 0; mask != 0; idx++, slot <<= 1) { |
| 124 | unsigned int pil; | 122 | unsigned int pil; |
| 125 | struct irq_bucket *p; | 123 | struct irq_bucket *p; |
| 126 | 124 | ||
| 127 | idx++; | ||
| 128 | slot <<= 1; | ||
| 129 | if (!(mask & slot)) | 125 | if (!(mask & slot)) |
| 130 | continue; | 126 | continue; |
| 131 | 127 | ||
| 132 | mask &= ~slot; | 128 | mask &= ~slot; |
| 133 | pil = sun4d_encode_irq(sbino, sbil, idx); | 129 | pil = sun4d_encode_irq(sbino, sbusl, idx); |
| 134 | 130 | ||
| 135 | p = irq_map[pil]; | 131 | p = irq_map[pil]; |
| 136 | while (p) { | 132 | while (p) { |
| @@ -218,10 +214,10 @@ static void sun4d_unmask_irq(struct irq_data *data) | |||
| 218 | 214 | ||
| 219 | #ifdef CONFIG_SMP | 215 | #ifdef CONFIG_SMP |
| 220 | spin_lock_irqsave(&sun4d_imsk_lock, flags); | 216 | spin_lock_irqsave(&sun4d_imsk_lock, flags); |
| 221 | cc_set_imsk_other(cpuid, cc_get_imsk_other(cpuid) | ~(1 << real_irq)); | 217 | cc_set_imsk_other(cpuid, cc_get_imsk_other(cpuid) & ~(1 << real_irq)); |
| 222 | spin_unlock_irqrestore(&sun4d_imsk_lock, flags); | 218 | spin_unlock_irqrestore(&sun4d_imsk_lock, flags); |
| 223 | #else | 219 | #else |
| 224 | cc_set_imsk(cc_get_imsk() | ~(1 << real_irq)); | 220 | cc_set_imsk(cc_get_imsk() & ~(1 << real_irq)); |
| 225 | #endif | 221 | #endif |
| 226 | } | 222 | } |
| 227 | 223 | ||
| @@ -299,26 +295,68 @@ static void __init sun4d_load_profile_irqs(void) | |||
| 299 | } | 295 | } |
| 300 | } | 296 | } |
| 301 | 297 | ||
| 298 | unsigned int _sun4d_build_device_irq(unsigned int real_irq, | ||
| 299 | unsigned int pil, | ||
| 300 | unsigned int board) | ||
| 301 | { | ||
| 302 | struct sun4d_handler_data *handler_data; | ||
| 303 | unsigned int irq; | ||
| 304 | |||
| 305 | irq = irq_alloc(real_irq, pil); | ||
| 306 | if (irq == 0) { | ||
| 307 | prom_printf("IRQ: allocate for %d %d %d failed\n", | ||
| 308 | real_irq, pil, board); | ||
| 309 | goto err_out; | ||
| 310 | } | ||
| 311 | |||
| 312 | handler_data = irq_get_handler_data(irq); | ||
| 313 | if (unlikely(handler_data)) | ||
| 314 | goto err_out; | ||
| 315 | |||
| 316 | handler_data = kzalloc(sizeof(struct sun4d_handler_data), GFP_ATOMIC); | ||
| 317 | if (unlikely(!handler_data)) { | ||
| 318 | prom_printf("IRQ: kzalloc(sun4d_handler_data) failed.\n"); | ||
| 319 | prom_halt(); | ||
| 320 | } | ||
| 321 | handler_data->cpuid = board_to_cpu[board]; | ||
| 322 | handler_data->real_irq = real_irq; | ||
| 323 | irq_set_chip_and_handler_name(irq, &sun4d_irq, | ||
| 324 | handle_level_irq, "level"); | ||
| 325 | irq_set_handler_data(irq, handler_data); | ||
| 326 | |||
| 327 | err_out: | ||
| 328 | return irq; | ||
| 329 | } | ||
| 330 | |||
| 331 | |||
| 332 | |||
| 302 | unsigned int sun4d_build_device_irq(struct platform_device *op, | 333 | unsigned int sun4d_build_device_irq(struct platform_device *op, |
| 303 | unsigned int real_irq) | 334 | unsigned int real_irq) |
| 304 | { | 335 | { |
| 305 | struct device_node *dp = op->dev.of_node; | 336 | struct device_node *dp = op->dev.of_node; |
| 306 | struct device_node *io_unit, *sbi = dp->parent; | 337 | struct device_node *board_parent, *bus = dp->parent; |
| 338 | char *bus_connection; | ||
| 307 | const struct linux_prom_registers *regs; | 339 | const struct linux_prom_registers *regs; |
| 308 | struct sun4d_handler_data *handler_data; | ||
| 309 | unsigned int pil; | 340 | unsigned int pil; |
| 310 | unsigned int irq; | 341 | unsigned int irq; |
| 311 | int board, slot; | 342 | int board, slot; |
| 312 | int sbusl; | 343 | int sbusl; |
| 313 | 344 | ||
| 314 | irq = 0; | 345 | irq = real_irq; |
| 315 | while (sbi) { | 346 | while (bus) { |
| 316 | if (!strcmp(sbi->name, "sbi")) | 347 | if (!strcmp(bus->name, "sbi")) { |
| 348 | bus_connection = "io-unit"; | ||
| 349 | break; | ||
| 350 | } | ||
| 351 | |||
| 352 | if (!strcmp(bus->name, "bootbus")) { | ||
| 353 | bus_connection = "cpu-unit"; | ||
| 317 | break; | 354 | break; |
| 355 | } | ||
| 318 | 356 | ||
| 319 | sbi = sbi->parent; | 357 | bus = bus->parent; |
| 320 | } | 358 | } |
| 321 | if (!sbi) | 359 | if (!bus) |
| 322 | goto err_out; | 360 | goto err_out; |
| 323 | 361 | ||
| 324 | regs = of_get_property(dp, "reg", NULL); | 362 | regs = of_get_property(dp, "reg", NULL); |
| @@ -328,17 +366,19 @@ unsigned int sun4d_build_device_irq(struct platform_device *op, | |||
| 328 | slot = regs->which_io; | 366 | slot = regs->which_io; |
| 329 | 367 | ||
| 330 | /* | 368 | /* |
| 331 | * If SBI's parent is not io-unit or the io-unit lacks | 369 | * If Bus nodes parent is not io-unit/cpu-unit or the io-unit/cpu-unit |
| 332 | * a "board#" property, something is very wrong. | 370 | * lacks a "board#" property, something is very wrong. |
| 333 | */ | 371 | */ |
| 334 | if (!sbi->parent || strcmp(sbi->parent->name, "io-unit")) { | 372 | if (!bus->parent || strcmp(bus->parent->name, bus_connection)) { |
| 335 | printk("%s: Error, parent is not io-unit.\n", sbi->full_name); | 373 | printk(KERN_ERR "%s: Error, parent is not %s.\n", |
| 374 | bus->full_name, bus_connection); | ||
| 336 | goto err_out; | 375 | goto err_out; |
| 337 | } | 376 | } |
| 338 | io_unit = sbi->parent; | 377 | board_parent = bus->parent; |
| 339 | board = of_getintprop_default(io_unit, "board#", -1); | 378 | board = of_getintprop_default(board_parent, "board#", -1); |
| 340 | if (board == -1) { | 379 | if (board == -1) { |
| 341 | printk("%s: Error, lacks board# property.\n", io_unit->full_name); | 380 | printk(KERN_ERR "%s: Error, lacks board# property.\n", |
| 381 | board_parent->full_name); | ||
| 342 | goto err_out; | 382 | goto err_out; |
| 343 | } | 383 | } |
| 344 | 384 | ||
| @@ -348,29 +388,17 @@ unsigned int sun4d_build_device_irq(struct platform_device *op, | |||
| 348 | else | 388 | else |
| 349 | pil = real_irq; | 389 | pil = real_irq; |
| 350 | 390 | ||
| 351 | irq = irq_alloc(real_irq, pil); | 391 | irq = _sun4d_build_device_irq(real_irq, pil, board); |
| 352 | if (irq == 0) | ||
| 353 | goto err_out; | ||
| 354 | |||
| 355 | handler_data = irq_get_handler_data(irq); | ||
| 356 | if (unlikely(handler_data)) | ||
| 357 | goto err_out; | ||
| 358 | |||
| 359 | handler_data = kzalloc(sizeof(struct sun4d_handler_data), GFP_ATOMIC); | ||
| 360 | if (unlikely(!handler_data)) { | ||
| 361 | prom_printf("IRQ: kzalloc(sun4d_handler_data) failed.\n"); | ||
| 362 | prom_halt(); | ||
| 363 | } | ||
| 364 | handler_data->cpuid = board_to_cpu[board]; | ||
| 365 | handler_data->real_irq = real_irq; | ||
| 366 | irq_set_chip_and_handler_name(irq, &sun4d_irq, | ||
| 367 | handle_level_irq, "level"); | ||
| 368 | irq_set_handler_data(irq, handler_data); | ||
| 369 | |||
| 370 | err_out: | 392 | err_out: |
| 371 | return real_irq; | 393 | return irq; |
| 372 | } | 394 | } |
| 373 | 395 | ||
| 396 | unsigned int sun4d_build_timer_irq(unsigned int board, unsigned int real_irq) | ||
| 397 | { | ||
| 398 | return _sun4d_build_device_irq(real_irq, real_irq, board); | ||
| 399 | } | ||
| 400 | |||
| 401 | |||
| 374 | static void __init sun4d_fixup_trap_table(void) | 402 | static void __init sun4d_fixup_trap_table(void) |
| 375 | { | 403 | { |
| 376 | #ifdef CONFIG_SMP | 404 | #ifdef CONFIG_SMP |
| @@ -402,6 +430,7 @@ static void __init sun4d_init_timers(irq_handler_t counter_fn) | |||
| 402 | unsigned int irq; | 430 | unsigned int irq; |
| 403 | const u32 *reg; | 431 | const u32 *reg; |
| 404 | int err; | 432 | int err; |
| 433 | int board; | ||
| 405 | 434 | ||
| 406 | dp = of_find_node_by_name(NULL, "cpu-unit"); | 435 | dp = of_find_node_by_name(NULL, "cpu-unit"); |
| 407 | if (!dp) { | 436 | if (!dp) { |
| @@ -414,12 +443,19 @@ static void __init sun4d_init_timers(irq_handler_t counter_fn) | |||
| 414 | * bootbus. | 443 | * bootbus. |
| 415 | */ | 444 | */ |
| 416 | reg = of_get_property(dp, "reg", NULL); | 445 | reg = of_get_property(dp, "reg", NULL); |
| 417 | of_node_put(dp); | ||
| 418 | if (!reg) { | 446 | if (!reg) { |
| 419 | prom_printf("sun4d_init_timers: No reg property\n"); | 447 | prom_printf("sun4d_init_timers: No reg property\n"); |
| 420 | prom_halt(); | 448 | prom_halt(); |
| 421 | } | 449 | } |
| 422 | 450 | ||
| 451 | board = of_getintprop_default(dp, "board#", -1); | ||
| 452 | if (board == -1) { | ||
| 453 | prom_printf("sun4d_init_timers: No board# property on cpu-unit\n"); | ||
| 454 | prom_halt(); | ||
| 455 | } | ||
| 456 | |||
| 457 | of_node_put(dp); | ||
| 458 | |||
| 423 | res.start = reg[1]; | 459 | res.start = reg[1]; |
| 424 | res.end = reg[2] - 1; | 460 | res.end = reg[2] - 1; |
| 425 | res.flags = reg[0] & 0xff; | 461 | res.flags = reg[0] & 0xff; |
| @@ -434,7 +470,7 @@ static void __init sun4d_init_timers(irq_handler_t counter_fn) | |||
| 434 | 470 | ||
| 435 | master_l10_counter = &sun4d_timers->l10_cur_count; | 471 | master_l10_counter = &sun4d_timers->l10_cur_count; |
| 436 | 472 | ||
| 437 | irq = sun4d_build_device_irq(NULL, SUN4D_TIMER_IRQ); | 473 | irq = sun4d_build_timer_irq(board, SUN4D_TIMER_IRQ); |
| 438 | err = request_irq(irq, counter_fn, IRQF_TIMER, "timer", NULL); | 474 | err = request_irq(irq, counter_fn, IRQF_TIMER, "timer", NULL); |
| 439 | if (err) { | 475 | if (err) { |
| 440 | prom_printf("sun4d_init_timers: request_irq() failed with %d\n", | 476 | prom_printf("sun4d_init_timers: request_irq() failed with %d\n", |
diff --git a/arch/sparc/kernel/sys_sparc32.c b/arch/sparc/kernel/sys_sparc32.c index 6db18c6927fb..170cd8e8eb2a 100644 --- a/arch/sparc/kernel/sys_sparc32.c +++ b/arch/sparc/kernel/sys_sparc32.c | |||
| @@ -109,7 +109,7 @@ asmlinkage long compat_sys_ipc(u32 call, u32 first, u32 second, u32 third, compa | |||
| 109 | 109 | ||
| 110 | default: | 110 | default: |
| 111 | return -ENOSYS; | 111 | return -ENOSYS; |
| 112 | }; | 112 | } |
| 113 | 113 | ||
| 114 | return -ENOSYS; | 114 | return -ENOSYS; |
| 115 | } | 115 | } |
diff --git a/arch/sparc/kernel/sys_sparc_64.c b/arch/sparc/kernel/sys_sparc_64.c index 96082d30def0..908b47a5ee24 100644 --- a/arch/sparc/kernel/sys_sparc_64.c +++ b/arch/sparc/kernel/sys_sparc_64.c | |||
| @@ -460,7 +460,7 @@ SYSCALL_DEFINE6(sparc_ipc, unsigned int, call, int, first, unsigned long, second | |||
| 460 | default: | 460 | default: |
| 461 | err = -ENOSYS; | 461 | err = -ENOSYS; |
| 462 | goto out; | 462 | goto out; |
| 463 | }; | 463 | } |
| 464 | } | 464 | } |
| 465 | if (call <= MSGCTL) { | 465 | if (call <= MSGCTL) { |
| 466 | switch (call) { | 466 | switch (call) { |
| @@ -481,7 +481,7 @@ SYSCALL_DEFINE6(sparc_ipc, unsigned int, call, int, first, unsigned long, second | |||
| 481 | default: | 481 | default: |
| 482 | err = -ENOSYS; | 482 | err = -ENOSYS; |
| 483 | goto out; | 483 | goto out; |
| 484 | }; | 484 | } |
| 485 | } | 485 | } |
| 486 | if (call <= SHMCTL) { | 486 | if (call <= SHMCTL) { |
| 487 | switch (call) { | 487 | switch (call) { |
| @@ -507,7 +507,7 @@ SYSCALL_DEFINE6(sparc_ipc, unsigned int, call, int, first, unsigned long, second | |||
| 507 | default: | 507 | default: |
| 508 | err = -ENOSYS; | 508 | err = -ENOSYS; |
| 509 | goto out; | 509 | goto out; |
| 510 | }; | 510 | } |
| 511 | } else { | 511 | } else { |
| 512 | err = -ENOSYS; | 512 | err = -ENOSYS; |
| 513 | } | 513 | } |
diff --git a/arch/sparc/kernel/time_64.c b/arch/sparc/kernel/time_64.c index 2b8d54b2d850..1db6b18964d2 100644 --- a/arch/sparc/kernel/time_64.c +++ b/arch/sparc/kernel/time_64.c | |||
| @@ -708,7 +708,7 @@ static void sparc64_timer_setup(enum clock_event_mode mode, | |||
| 708 | case CLOCK_EVT_MODE_UNUSED: | 708 | case CLOCK_EVT_MODE_UNUSED: |
| 709 | WARN_ON(1); | 709 | WARN_ON(1); |
| 710 | break; | 710 | break; |
| 711 | }; | 711 | } |
| 712 | } | 712 | } |
| 713 | 713 | ||
| 714 | static struct clock_event_device sparc64_clockevent = { | 714 | static struct clock_event_device sparc64_clockevent = { |
diff --git a/arch/sparc/kernel/traps_64.c b/arch/sparc/kernel/traps_64.c index 1ed547bd850f..0cbdaa41cd1e 100644 --- a/arch/sparc/kernel/traps_64.c +++ b/arch/sparc/kernel/traps_64.c | |||
| @@ -1804,7 +1804,7 @@ static const char *sun4v_err_type_to_str(u32 type) | |||
| 1804 | return "warning resumable"; | 1804 | return "warning resumable"; |
| 1805 | default: | 1805 | default: |
| 1806 | return "unknown"; | 1806 | return "unknown"; |
| 1807 | }; | 1807 | } |
| 1808 | } | 1808 | } |
| 1809 | 1809 | ||
| 1810 | static void sun4v_log_error(struct pt_regs *regs, struct sun4v_error_entry *ent, int cpu, const char *pfx, atomic_t *ocnt) | 1810 | static void sun4v_log_error(struct pt_regs *regs, struct sun4v_error_entry *ent, int cpu, const char *pfx, atomic_t *ocnt) |
diff --git a/arch/sparc/kernel/unaligned_64.c b/arch/sparc/kernel/unaligned_64.c index c752c4c479bd..b2b019ea8caa 100644 --- a/arch/sparc/kernel/unaligned_64.c +++ b/arch/sparc/kernel/unaligned_64.c | |||
| @@ -211,7 +211,7 @@ static inline int do_int_store(int reg_num, int size, unsigned long *dst_addr, | |||
| 211 | default: | 211 | default: |
| 212 | BUG(); | 212 | BUG(); |
| 213 | break; | 213 | break; |
| 214 | }; | 214 | } |
| 215 | } | 215 | } |
| 216 | return __do_int_store(dst_addr, size, src_val, asi); | 216 | return __do_int_store(dst_addr, size, src_val, asi); |
| 217 | } | 217 | } |
| @@ -328,7 +328,7 @@ asmlinkage void kernel_unaligned_trap(struct pt_regs *regs, unsigned int insn) | |||
| 328 | case ASI_SNFL: | 328 | case ASI_SNFL: |
| 329 | asi &= ~0x08; | 329 | asi &= ~0x08; |
| 330 | break; | 330 | break; |
| 331 | }; | 331 | } |
| 332 | switch (dir) { | 332 | switch (dir) { |
| 333 | case load: | 333 | case load: |
| 334 | reg_addr = fetch_reg_addr(((insn>>25)&0x1f), regs); | 334 | reg_addr = fetch_reg_addr(((insn>>25)&0x1f), regs); |
| @@ -351,7 +351,7 @@ asmlinkage void kernel_unaligned_trap(struct pt_regs *regs, unsigned int insn) | |||
| 351 | default: | 351 | default: |
| 352 | BUG(); | 352 | BUG(); |
| 353 | break; | 353 | break; |
| 354 | }; | 354 | } |
| 355 | *reg_addr = val_in; | 355 | *reg_addr = val_in; |
| 356 | } | 356 | } |
| 357 | break; | 357 | break; |
diff --git a/arch/sparc/kernel/us2e_cpufreq.c b/arch/sparc/kernel/us2e_cpufreq.c index 531d54fc9829..489fc15f3194 100644 --- a/arch/sparc/kernel/us2e_cpufreq.c +++ b/arch/sparc/kernel/us2e_cpufreq.c | |||
| @@ -176,7 +176,7 @@ static unsigned long index_to_estar_mode(unsigned int index) | |||
| 176 | 176 | ||
| 177 | default: | 177 | default: |
| 178 | BUG(); | 178 | BUG(); |
| 179 | }; | 179 | } |
| 180 | } | 180 | } |
| 181 | 181 | ||
| 182 | static unsigned long index_to_divisor(unsigned int index) | 182 | static unsigned long index_to_divisor(unsigned int index) |
| @@ -199,7 +199,7 @@ static unsigned long index_to_divisor(unsigned int index) | |||
| 199 | 199 | ||
| 200 | default: | 200 | default: |
| 201 | BUG(); | 201 | BUG(); |
| 202 | }; | 202 | } |
| 203 | } | 203 | } |
| 204 | 204 | ||
| 205 | static unsigned long estar_to_divisor(unsigned long estar) | 205 | static unsigned long estar_to_divisor(unsigned long estar) |
| @@ -224,7 +224,7 @@ static unsigned long estar_to_divisor(unsigned long estar) | |||
| 224 | break; | 224 | break; |
| 225 | default: | 225 | default: |
| 226 | BUG(); | 226 | BUG(); |
| 227 | }; | 227 | } |
| 228 | 228 | ||
| 229 | return ret; | 229 | return ret; |
| 230 | } | 230 | } |
diff --git a/arch/sparc/kernel/us3_cpufreq.c b/arch/sparc/kernel/us3_cpufreq.c index 9a8ceb700833..eb1624b931d9 100644 --- a/arch/sparc/kernel/us3_cpufreq.c +++ b/arch/sparc/kernel/us3_cpufreq.c | |||
| @@ -71,7 +71,7 @@ static unsigned long get_current_freq(unsigned int cpu, unsigned long safari_cfg | |||
| 71 | break; | 71 | break; |
| 72 | default: | 72 | default: |
| 73 | BUG(); | 73 | BUG(); |
| 74 | }; | 74 | } |
| 75 | 75 | ||
| 76 | return ret; | 76 | return ret; |
| 77 | } | 77 | } |
| @@ -125,7 +125,7 @@ static void us3_set_cpu_divider_index(unsigned int cpu, unsigned int index) | |||
| 125 | 125 | ||
| 126 | default: | 126 | default: |
| 127 | BUG(); | 127 | BUG(); |
| 128 | }; | 128 | } |
| 129 | 129 | ||
| 130 | reg = read_safari_cfg(); | 130 | reg = read_safari_cfg(); |
| 131 | 131 | ||
diff --git a/arch/sparc/kernel/viohs.c b/arch/sparc/kernel/viohs.c index aa6ac70d4fd5..29348ea139c3 100644 --- a/arch/sparc/kernel/viohs.c +++ b/arch/sparc/kernel/viohs.c | |||
| @@ -363,7 +363,7 @@ static int process_ver(struct vio_driver_state *vio, struct vio_ver_info *pkt) | |||
| 363 | 363 | ||
| 364 | default: | 364 | default: |
| 365 | return handshake_failure(vio); | 365 | return handshake_failure(vio); |
| 366 | }; | 366 | } |
| 367 | } | 367 | } |
| 368 | 368 | ||
| 369 | static int process_attr(struct vio_driver_state *vio, void *pkt) | 369 | static int process_attr(struct vio_driver_state *vio, void *pkt) |
diff --git a/arch/sparc/kernel/visemul.c b/arch/sparc/kernel/visemul.c index 9dfd2ebcb157..36357717d691 100644 --- a/arch/sparc/kernel/visemul.c +++ b/arch/sparc/kernel/visemul.c | |||
| @@ -334,7 +334,7 @@ static void edge(struct pt_regs *regs, unsigned int insn, unsigned int opf) | |||
| 334 | left = edge32_tab_l[(rs1 >> 2) & 0x1].left; | 334 | left = edge32_tab_l[(rs1 >> 2) & 0x1].left; |
| 335 | right = edge32_tab_l[(rs2 >> 2) & 0x1].right; | 335 | right = edge32_tab_l[(rs2 >> 2) & 0x1].right; |
| 336 | break; | 336 | break; |
| 337 | }; | 337 | } |
| 338 | 338 | ||
| 339 | if ((rs1 & ~0x7UL) == (rs2 & ~0x7UL)) | 339 | if ((rs1 & ~0x7UL) == (rs2 & ~0x7UL)) |
| 340 | rd_val = right & left; | 340 | rd_val = right & left; |
| @@ -360,7 +360,7 @@ static void edge(struct pt_regs *regs, unsigned int insn, unsigned int opf) | |||
| 360 | tstate = regs->tstate & ~(TSTATE_XCC | TSTATE_ICC); | 360 | tstate = regs->tstate & ~(TSTATE_XCC | TSTATE_ICC); |
| 361 | regs->tstate = tstate | (ccr << 32UL); | 361 | regs->tstate = tstate | (ccr << 32UL); |
| 362 | } | 362 | } |
| 363 | }; | 363 | } |
| 364 | } | 364 | } |
| 365 | 365 | ||
| 366 | static void array(struct pt_regs *regs, unsigned int insn, unsigned int opf) | 366 | static void array(struct pt_regs *regs, unsigned int insn, unsigned int opf) |
| @@ -392,7 +392,7 @@ static void array(struct pt_regs *regs, unsigned int insn, unsigned int opf) | |||
| 392 | 392 | ||
| 393 | case ARRAY32_OPF: | 393 | case ARRAY32_OPF: |
| 394 | rd_val <<= 2; | 394 | rd_val <<= 2; |
| 395 | }; | 395 | } |
| 396 | 396 | ||
| 397 | store_reg(regs, rd_val, RD(insn)); | 397 | store_reg(regs, rd_val, RD(insn)); |
| 398 | } | 398 | } |
| @@ -577,7 +577,7 @@ static void pformat(struct pt_regs *regs, unsigned int insn, unsigned int opf) | |||
| 577 | *fpd_regaddr(f, RD(insn)) = rd_val; | 577 | *fpd_regaddr(f, RD(insn)) = rd_val; |
| 578 | break; | 578 | break; |
| 579 | } | 579 | } |
| 580 | }; | 580 | } |
| 581 | } | 581 | } |
| 582 | 582 | ||
| 583 | static void pmul(struct pt_regs *regs, unsigned int insn, unsigned int opf) | 583 | static void pmul(struct pt_regs *regs, unsigned int insn, unsigned int opf) |
| @@ -693,7 +693,7 @@ static void pmul(struct pt_regs *regs, unsigned int insn, unsigned int opf) | |||
| 693 | *fpd_regaddr(f, RD(insn)) = rd_val; | 693 | *fpd_regaddr(f, RD(insn)) = rd_val; |
| 694 | break; | 694 | break; |
| 695 | } | 695 | } |
| 696 | }; | 696 | } |
| 697 | } | 697 | } |
| 698 | 698 | ||
| 699 | static void pcmp(struct pt_regs *regs, unsigned int insn, unsigned int opf) | 699 | static void pcmp(struct pt_regs *regs, unsigned int insn, unsigned int opf) |
| @@ -786,7 +786,7 @@ static void pcmp(struct pt_regs *regs, unsigned int insn, unsigned int opf) | |||
| 786 | rd_val |= 1 << i; | 786 | rd_val |= 1 << i; |
| 787 | } | 787 | } |
| 788 | break; | 788 | break; |
| 789 | }; | 789 | } |
| 790 | 790 | ||
| 791 | maybe_flush_windows(0, 0, RD(insn), 0); | 791 | maybe_flush_windows(0, 0, RD(insn), 0); |
| 792 | store_reg(regs, rd_val, RD(insn)); | 792 | store_reg(regs, rd_val, RD(insn)); |
| @@ -885,7 +885,7 @@ int vis_emul(struct pt_regs *regs, unsigned int insn) | |||
| 885 | case BSHUFFLE_OPF: | 885 | case BSHUFFLE_OPF: |
| 886 | bshuffle(regs, insn); | 886 | bshuffle(regs, insn); |
| 887 | break; | 887 | break; |
| 888 | }; | 888 | } |
| 889 | 889 | ||
| 890 | regs->tpc = regs->tnpc; | 890 | regs->tpc = regs->tnpc; |
| 891 | regs->tnpc += 4; | 891 | regs->tnpc += 4; |
diff --git a/arch/sparc/mm/fault_32.c b/arch/sparc/mm/fault_32.c index b10ac4d62378..7543ddbdadb2 100644 --- a/arch/sparc/mm/fault_32.c +++ b/arch/sparc/mm/fault_32.c | |||
| @@ -135,7 +135,7 @@ asmlinkage int lookup_fault(unsigned long pc, unsigned long ret_pc, | |||
| 135 | 135 | ||
| 136 | default: | 136 | default: |
| 137 | break; | 137 | break; |
| 138 | }; | 138 | } |
| 139 | 139 | ||
| 140 | memset(®s, 0, sizeof (regs)); | 140 | memset(®s, 0, sizeof (regs)); |
| 141 | regs.pc = pc; | 141 | regs.pc = pc; |
diff --git a/arch/sparc/mm/init_32.c b/arch/sparc/mm/init_32.c index ca217327e8d2..7b00de61c5f1 100644 --- a/arch/sparc/mm/init_32.c +++ b/arch/sparc/mm/init_32.c | |||
| @@ -340,7 +340,7 @@ void __init paging_init(void) | |||
| 340 | prom_printf("paging_init: sparc_cpu_model = %d\n", sparc_cpu_model); | 340 | prom_printf("paging_init: sparc_cpu_model = %d\n", sparc_cpu_model); |
| 341 | prom_printf("paging_init: Halting...\n"); | 341 | prom_printf("paging_init: Halting...\n"); |
| 342 | prom_halt(); | 342 | prom_halt(); |
| 343 | }; | 343 | } |
| 344 | 344 | ||
| 345 | /* Initialize the protection map with non-constant, MMU dependent values. */ | 345 | /* Initialize the protection map with non-constant, MMU dependent values. */ |
| 346 | protection_map[0] = PAGE_NONE; | 346 | protection_map[0] = PAGE_NONE; |
diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c index e10cd03fab80..3fd8e18bed80 100644 --- a/arch/sparc/mm/init_64.c +++ b/arch/sparc/mm/init_64.c | |||
| @@ -1625,7 +1625,7 @@ static void __init sun4v_ktsb_init(void) | |||
| 1625 | ktsb_descr[0].pgsz_idx = HV_PGSZ_IDX_4MB; | 1625 | ktsb_descr[0].pgsz_idx = HV_PGSZ_IDX_4MB; |
| 1626 | ktsb_descr[0].pgsz_mask = HV_PGSZ_MASK_4MB; | 1626 | ktsb_descr[0].pgsz_mask = HV_PGSZ_MASK_4MB; |
| 1627 | break; | 1627 | break; |
| 1628 | }; | 1628 | } |
| 1629 | 1629 | ||
| 1630 | ktsb_descr[0].assoc = 1; | 1630 | ktsb_descr[0].assoc = 1; |
| 1631 | ktsb_descr[0].num_ttes = KERNEL_TSB_NENTRIES; | 1631 | ktsb_descr[0].num_ttes = KERNEL_TSB_NENTRIES; |
| @@ -2266,7 +2266,7 @@ unsigned long pte_sz_bits(unsigned long sz) | |||
| 2266 | return _PAGE_SZ512K_4V; | 2266 | return _PAGE_SZ512K_4V; |
| 2267 | case 4 * 1024 * 1024: | 2267 | case 4 * 1024 * 1024: |
| 2268 | return _PAGE_SZ4MB_4V; | 2268 | return _PAGE_SZ4MB_4V; |
| 2269 | }; | 2269 | } |
| 2270 | } else { | 2270 | } else { |
| 2271 | switch (sz) { | 2271 | switch (sz) { |
| 2272 | case 8 * 1024: | 2272 | case 8 * 1024: |
| @@ -2278,7 +2278,7 @@ unsigned long pte_sz_bits(unsigned long sz) | |||
| 2278 | return _PAGE_SZ512K_4U; | 2278 | return _PAGE_SZ512K_4U; |
| 2279 | case 4 * 1024 * 1024: | 2279 | case 4 * 1024 * 1024: |
| 2280 | return _PAGE_SZ4MB_4U; | 2280 | return _PAGE_SZ4MB_4U; |
| 2281 | }; | 2281 | } |
| 2282 | } | 2282 | } |
| 2283 | } | 2283 | } |
| 2284 | 2284 | ||
diff --git a/arch/sparc/mm/srmmu.c b/arch/sparc/mm/srmmu.c index fe09fd8be695..cbef74e793b8 100644 --- a/arch/sparc/mm/srmmu.c +++ b/arch/sparc/mm/srmmu.c | |||
| @@ -1665,7 +1665,7 @@ static void __init init_swift(void) | |||
| 1665 | default: | 1665 | default: |
| 1666 | srmmu_modtype = Swift_ok; | 1666 | srmmu_modtype = Swift_ok; |
| 1667 | break; | 1667 | break; |
| 1668 | }; | 1668 | } |
| 1669 | 1669 | ||
| 1670 | BTFIXUPSET_CALL(flush_cache_all, swift_flush_cache_all, BTFIXUPCALL_NORM); | 1670 | BTFIXUPSET_CALL(flush_cache_all, swift_flush_cache_all, BTFIXUPCALL_NORM); |
| 1671 | BTFIXUPSET_CALL(flush_cache_mm, swift_flush_cache_mm, BTFIXUPCALL_NORM); | 1671 | BTFIXUPSET_CALL(flush_cache_mm, swift_flush_cache_mm, BTFIXUPCALL_NORM); |
| @@ -2069,7 +2069,7 @@ static void __init get_srmmu_type(void) | |||
| 2069 | /* Some other Cypress revision, assume a 605. */ | 2069 | /* Some other Cypress revision, assume a 605. */ |
| 2070 | init_cypress_605(mod_rev); | 2070 | init_cypress_605(mod_rev); |
| 2071 | break; | 2071 | break; |
| 2072 | }; | 2072 | } |
| 2073 | return; | 2073 | return; |
| 2074 | } | 2074 | } |
| 2075 | 2075 | ||
diff --git a/arch/sparc/mm/sun4c.c b/arch/sparc/mm/sun4c.c index a2350b5e68aa..1cf4f198709a 100644 --- a/arch/sparc/mm/sun4c.c +++ b/arch/sparc/mm/sun4c.c | |||
| @@ -318,7 +318,7 @@ void __init sun4c_probe_vac(void) | |||
| 318 | prom_printf("probe_vac: Didn't expect vac-linesize of %d, halting\n", | 318 | prom_printf("probe_vac: Didn't expect vac-linesize of %d, halting\n", |
| 319 | sun4c_vacinfo.linesize); | 319 | sun4c_vacinfo.linesize); |
| 320 | prom_halt(); | 320 | prom_halt(); |
| 321 | }; | 321 | } |
| 322 | 322 | ||
| 323 | sun4c_flush_all(); | 323 | sun4c_flush_all(); |
| 324 | sun4c_enable_vac(); | 324 | sun4c_enable_vac(); |
| @@ -364,7 +364,7 @@ static void __init patch_kernel_fault_handler(void) | |||
| 364 | prom_printf("Unhandled number of segmaps: %d\n", | 364 | prom_printf("Unhandled number of segmaps: %d\n", |
| 365 | num_segmaps); | 365 | num_segmaps); |
| 366 | prom_halt(); | 366 | prom_halt(); |
| 367 | }; | 367 | } |
| 368 | switch (num_contexts) { | 368 | switch (num_contexts) { |
| 369 | case 8: | 369 | case 8: |
| 370 | /* Default, nothing to do. */ | 370 | /* Default, nothing to do. */ |
| @@ -377,7 +377,7 @@ static void __init patch_kernel_fault_handler(void) | |||
| 377 | prom_printf("Unhandled number of contexts: %d\n", | 377 | prom_printf("Unhandled number of contexts: %d\n", |
| 378 | num_contexts); | 378 | num_contexts); |
| 379 | prom_halt(); | 379 | prom_halt(); |
| 380 | }; | 380 | } |
| 381 | 381 | ||
| 382 | if (sun4c_vacinfo.do_hwflushes != 0) { | 382 | if (sun4c_vacinfo.do_hwflushes != 0) { |
| 383 | PATCH_INSN(vac_hwflush_patch1_on, vac_hwflush_patch1); | 383 | PATCH_INSN(vac_hwflush_patch1_on, vac_hwflush_patch1); |
| @@ -394,7 +394,7 @@ static void __init patch_kernel_fault_handler(void) | |||
| 394 | prom_printf("Impossible VAC linesize %d, halting...\n", | 394 | prom_printf("Impossible VAC linesize %d, halting...\n", |
| 395 | sun4c_vacinfo.linesize); | 395 | sun4c_vacinfo.linesize); |
| 396 | prom_halt(); | 396 | prom_halt(); |
| 397 | }; | 397 | } |
| 398 | } | 398 | } |
| 399 | } | 399 | } |
| 400 | 400 | ||
diff --git a/arch/sparc/mm/tsb.c b/arch/sparc/mm/tsb.c index 948461513499..a5f51b22fcbe 100644 --- a/arch/sparc/mm/tsb.c +++ b/arch/sparc/mm/tsb.c | |||
| @@ -180,7 +180,7 @@ static void setup_tsb_params(struct mm_struct *mm, unsigned long tsb_idx, unsign | |||
| 180 | printk(KERN_ERR "TSB[%s:%d]: Impossible TSB size %lu, killing process.\n", | 180 | printk(KERN_ERR "TSB[%s:%d]: Impossible TSB size %lu, killing process.\n", |
| 181 | current->comm, current->pid, tsb_bytes); | 181 | current->comm, current->pid, tsb_bytes); |
| 182 | do_exit(SIGSEGV); | 182 | do_exit(SIGSEGV); |
| 183 | }; | 183 | } |
| 184 | tte |= pte_sz_bits(page_sz); | 184 | tte |= pte_sz_bits(page_sz); |
| 185 | 185 | ||
| 186 | if (tlb_type == cheetah_plus || tlb_type == hypervisor) { | 186 | if (tlb_type == cheetah_plus || tlb_type == hypervisor) { |
| @@ -215,7 +215,7 @@ static void setup_tsb_params(struct mm_struct *mm, unsigned long tsb_idx, unsign | |||
| 215 | #endif | 215 | #endif |
| 216 | default: | 216 | default: |
| 217 | BUG(); | 217 | BUG(); |
| 218 | }; | 218 | } |
| 219 | hp->assoc = 1; | 219 | hp->assoc = 1; |
| 220 | hp->num_ttes = tsb_bytes / 16; | 220 | hp->num_ttes = tsb_bytes / 16; |
| 221 | hp->ctx_idx = 0; | 221 | hp->ctx_idx = 0; |
| @@ -230,7 +230,7 @@ static void setup_tsb_params(struct mm_struct *mm, unsigned long tsb_idx, unsign | |||
| 230 | #endif | 230 | #endif |
| 231 | default: | 231 | default: |
| 232 | BUG(); | 232 | BUG(); |
| 233 | }; | 233 | } |
| 234 | hp->tsb_base = tsb_paddr; | 234 | hp->tsb_base = tsb_paddr; |
| 235 | hp->resv = 0; | 235 | hp->resv = 0; |
| 236 | } | 236 | } |
diff --git a/arch/sparc/prom/console_32.c b/arch/sparc/prom/console_32.c index b05e3db5fa63..a00f47b16c10 100644 --- a/arch/sparc/prom/console_32.c +++ b/arch/sparc/prom/console_32.c | |||
| @@ -38,7 +38,7 @@ static int prom_nbputchar(const char *buf) | |||
| 38 | break; | 38 | break; |
| 39 | default: | 39 | default: |
| 40 | break; | 40 | break; |
| 41 | }; | 41 | } |
| 42 | restore_current(); | 42 | restore_current(); |
| 43 | spin_unlock_irqrestore(&prom_lock, flags); | 43 | spin_unlock_irqrestore(&prom_lock, flags); |
| 44 | return i; /* Ugh, we could spin forever on unsupported proms ;( */ | 44 | return i; /* Ugh, we could spin forever on unsupported proms ;( */ |
diff --git a/arch/sparc/prom/init_32.c b/arch/sparc/prom/init_32.c index 0a601b300639..26c64cea3c9c 100644 --- a/arch/sparc/prom/init_32.c +++ b/arch/sparc/prom/init_32.c | |||
| @@ -53,7 +53,7 @@ void __init prom_init(struct linux_romvec *rp) | |||
| 53 | romvec->pv_romvers); | 53 | romvec->pv_romvers); |
| 54 | prom_halt(); | 54 | prom_halt(); |
| 55 | break; | 55 | break; |
| 56 | }; | 56 | } |
| 57 | 57 | ||
| 58 | prom_rev = romvec->pv_plugin_revision; | 58 | prom_rev = romvec->pv_plugin_revision; |
| 59 | prom_prev = romvec->pv_printrev; | 59 | prom_prev = romvec->pv_printrev; |
diff --git a/arch/sparc/prom/mp.c b/arch/sparc/prom/mp.c index 97c44c9ddbc8..0da8256cf76f 100644 --- a/arch/sparc/prom/mp.c +++ b/arch/sparc/prom/mp.c | |||
| @@ -35,7 +35,7 @@ prom_startcpu(int cpunode, struct linux_prom_registers *ctable_reg, int ctx, cha | |||
| 35 | case PROM_V3: | 35 | case PROM_V3: |
| 36 | ret = (*(romvec->v3_cpustart))(cpunode, (int) ctable_reg, ctx, pc); | 36 | ret = (*(romvec->v3_cpustart))(cpunode, (int) ctable_reg, ctx, pc); |
| 37 | break; | 37 | break; |
| 38 | }; | 38 | } |
| 39 | restore_current(); | 39 | restore_current(); |
| 40 | spin_unlock_irqrestore(&prom_lock, flags); | 40 | spin_unlock_irqrestore(&prom_lock, flags); |
| 41 | 41 | ||
diff --git a/arch/unicore32/Kconfig b/arch/unicore32/Kconfig index d3a303246c9f..e57dcce9bfda 100644 --- a/arch/unicore32/Kconfig +++ b/arch/unicore32/Kconfig | |||
| @@ -231,10 +231,6 @@ config PUV3_PWM | |||
| 231 | help | 231 | help |
| 232 | Enable support for NB0916 PWM controllers | 232 | Enable support for NB0916 PWM controllers |
| 233 | 233 | ||
| 234 | config PUV3_RTC | ||
| 235 | tristate "PKUnity v3 RTC Support" | ||
| 236 | depends on !ARCH_FPGA | ||
| 237 | |||
| 238 | if PUV3_NB0916 | 234 | if PUV3_NB0916 |
| 239 | 235 | ||
| 240 | menu "PKUnity NetBook-0916 Features" | 236 | menu "PKUnity NetBook-0916 Features" |
diff --git a/arch/unicore32/Makefile b/arch/unicore32/Makefile index 76a8beec7d03..6af4bc415f2b 100644 --- a/arch/unicore32/Makefile +++ b/arch/unicore32/Makefile | |||
| @@ -40,42 +40,10 @@ core-y += arch/unicore32/mm/ | |||
| 40 | 40 | ||
| 41 | libs-y += arch/unicore32/lib/ | 41 | libs-y += arch/unicore32/lib/ |
| 42 | 42 | ||
| 43 | ASM_GENERATED_DIR := $(srctree)/arch/unicore32/include/generated | ||
| 44 | LINUXINCLUDE += -I$(ASM_GENERATED_DIR) | ||
| 45 | |||
| 46 | ASM_GENERIC_HEADERS := atomic.h auxvec.h | ||
| 47 | ASM_GENERIC_HEADERS += bitsperlong.h bug.h bugs.h | ||
| 48 | ASM_GENERIC_HEADERS += cputime.h current.h | ||
| 49 | ASM_GENERIC_HEADERS += device.h div64.h | ||
| 50 | ASM_GENERIC_HEADERS += emergency-restart.h errno.h | ||
| 51 | ASM_GENERIC_HEADERS += fb.h fcntl.h ftrace.h futex.h | ||
| 52 | ASM_GENERIC_HEADERS += hardirq.h hw_irq.h | ||
| 53 | ASM_GENERIC_HEADERS += ioctl.h ioctls.h ipcbuf.h irq_regs.h | ||
| 54 | ASM_GENERIC_HEADERS += kdebug.h kmap_types.h | ||
| 55 | ASM_GENERIC_HEADERS += local.h | ||
| 56 | ASM_GENERIC_HEADERS += mman.h module.h msgbuf.h | ||
| 57 | ASM_GENERIC_HEADERS += param.h parport.h percpu.h poll.h posix_types.h | ||
| 58 | ASM_GENERIC_HEADERS += resource.h | ||
| 59 | ASM_GENERIC_HEADERS += scatterlist.h sections.h segment.h sembuf.h serial.h | ||
| 60 | ASM_GENERIC_HEADERS += setup.h shmbuf.h shmparam.h | ||
| 61 | ASM_GENERIC_HEADERS += siginfo.h signal.h sizes.h | ||
| 62 | ASM_GENERIC_HEADERS += socket.h sockios.h stat.h statfs.h swab.h syscalls.h | ||
| 63 | ASM_GENERIC_HEADERS += termbits.h termios.h topology.h types.h | ||
| 64 | ASM_GENERIC_HEADERS += ucontext.h unaligned.h user.h | ||
| 65 | ASM_GENERIC_HEADERS += vga.h | ||
| 66 | ASM_GENERIC_HEADERS += xor.h | ||
| 67 | |||
| 68 | archprepare: | ||
| 69 | ifneq ($(ASM_GENERATED_DIR), $(wildcard $(ASM_GENERATED_DIR))) | ||
| 70 | $(Q)mkdir -p $(ASM_GENERATED_DIR)/asm | ||
| 71 | $(Q)$(foreach a, $(ASM_GENERIC_HEADERS), \ | ||
| 72 | echo '#include <asm-generic/$a>' \ | ||
| 73 | > $(ASM_GENERATED_DIR)/asm/$a; ) | ||
| 74 | endif | ||
| 75 | |||
| 76 | boot := arch/unicore32/boot | 43 | boot := arch/unicore32/boot |
| 77 | 44 | ||
| 78 | # Default target when executing plain make | 45 | # Default defconfig and target when executing plain make |
| 46 | KBUILD_DEFCONFIG := $(ARCH)_defconfig | ||
| 79 | KBUILD_IMAGE := zImage | 47 | KBUILD_IMAGE := zImage |
| 80 | 48 | ||
| 81 | all: $(KBUILD_IMAGE) | 49 | all: $(KBUILD_IMAGE) |
| @@ -83,8 +51,6 @@ all: $(KBUILD_IMAGE) | |||
| 83 | zImage Image uImage: vmlinux | 51 | zImage Image uImage: vmlinux |
| 84 | $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@ | 52 | $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@ |
| 85 | 53 | ||
| 86 | MRPROPER_DIRS += $(ASM_GENERATED_DIR) | ||
| 87 | |||
| 88 | archclean: | 54 | archclean: |
| 89 | $(Q)$(MAKE) $(clean)=$(boot) | 55 | $(Q)$(MAKE) $(clean)=$(boot) |
| 90 | 56 | ||
diff --git a/arch/unicore32/boot/compressed/Makefile b/arch/unicore32/boot/compressed/Makefile index 95373428cb3d..b0954a2d23cf 100644 --- a/arch/unicore32/boot/compressed/Makefile +++ b/arch/unicore32/boot/compressed/Makefile | |||
| @@ -59,7 +59,7 @@ $(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/head.o $(obj)/piggy.o \ | |||
| 59 | # We now have a PIC decompressor implementation. Decompressors running | 59 | # We now have a PIC decompressor implementation. Decompressors running |
| 60 | # from RAM should not define ZTEXTADDR. Decompressors running directly | 60 | # from RAM should not define ZTEXTADDR. Decompressors running directly |
| 61 | # from ROM or Flash must define ZTEXTADDR (preferably via the config) | 61 | # from ROM or Flash must define ZTEXTADDR (preferably via the config) |
| 62 | ZTEXTADDR := 0 | 62 | ZTEXTADDR := 0x03000000 |
| 63 | ZBSSADDR := ALIGN(4) | 63 | ZBSSADDR := ALIGN(4) |
| 64 | 64 | ||
| 65 | SEDFLAGS_lds = s/TEXT_START/$(ZTEXTADDR)/;s/BSS_START/$(ZBSSADDR)/ | 65 | SEDFLAGS_lds = s/TEXT_START/$(ZTEXTADDR)/;s/BSS_START/$(ZBSSADDR)/ |
diff --git a/arch/unicore32/configs/debug_defconfig b/arch/unicore32/configs/unicore32_defconfig index b5fbde9f1cb2..c9dd3198b6f7 100644 --- a/arch/unicore32/configs/debug_defconfig +++ b/arch/unicore32/configs/unicore32_defconfig | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | ### General setup | 1 | ### General setup |
| 2 | CONFIG_EXPERIMENTAL=y | 2 | CONFIG_EXPERIMENTAL=y |
| 3 | CONFIG_LOCALVERSION="-debug" | 3 | CONFIG_LOCALVERSION="-unicore32" |
| 4 | CONFIG_SWAP=y | 4 | CONFIG_SWAP=y |
| 5 | CONFIG_SYSVIPC=y | 5 | CONFIG_SYSVIPC=y |
| 6 | CONFIG_POSIX_MQUEUE=y | 6 | CONFIG_POSIX_MQUEUE=y |
| @@ -64,7 +64,6 @@ CONFIG_I2C_BATTERY_BQ27200=n | |||
| 64 | CONFIG_I2C_EEPROM_AT24=n | 64 | CONFIG_I2C_EEPROM_AT24=n |
| 65 | CONFIG_LCD_BACKLIGHT=n | 65 | CONFIG_LCD_BACKLIGHT=n |
| 66 | 66 | ||
| 67 | CONFIG_PUV3_RTC=y | ||
| 68 | CONFIG_PUV3_UMAL=y | 67 | CONFIG_PUV3_UMAL=y |
| 69 | CONFIG_PUV3_MUSB=n | 68 | CONFIG_PUV3_MUSB=n |
| 70 | CONFIG_PUV3_AC97=n | 69 | CONFIG_PUV3_AC97=n |
| @@ -167,8 +166,9 @@ CONFIG_LEDS_TRIGGER_IDE_DISK=y | |||
| 167 | CONFIG_LEDS_TRIGGER_HEARTBEAT=y | 166 | CONFIG_LEDS_TRIGGER_HEARTBEAT=y |
| 168 | 167 | ||
| 169 | # Real Time Clock | 168 | # Real Time Clock |
| 170 | CONFIG_RTC_LIB=m | 169 | CONFIG_RTC_LIB=y |
| 171 | CONFIG_RTC_CLASS=m | 170 | CONFIG_RTC_CLASS=y |
| 171 | CONFIG_RTC_DRV_PUV3=y | ||
| 172 | 172 | ||
| 173 | ### File systems | 173 | ### File systems |
| 174 | CONFIG_EXT2_FS=m | 174 | CONFIG_EXT2_FS=m |
diff --git a/arch/unicore32/include/asm/Kbuild b/arch/unicore32/include/asm/Kbuild index b200fdaca44d..ca113d6999c5 100644 --- a/arch/unicore32/include/asm/Kbuild +++ b/arch/unicore32/include/asm/Kbuild | |||
| @@ -1,2 +1,61 @@ | |||
| 1 | include include/asm-generic/Kbuild.asm | 1 | include include/asm-generic/Kbuild.asm |
| 2 | 2 | ||
| 3 | generic-y += atomic.h | ||
| 4 | generic-y += auxvec.h | ||
| 5 | generic-y += bitsperlong.h | ||
| 6 | generic-y += bug.h | ||
| 7 | generic-y += bugs.h | ||
| 8 | generic-y += cputime.h | ||
| 9 | generic-y += current.h | ||
| 10 | generic-y += device.h | ||
| 11 | generic-y += div64.h | ||
| 12 | generic-y += emergency-restart.h | ||
| 13 | generic-y += errno.h | ||
| 14 | generic-y += fb.h | ||
| 15 | generic-y += fcntl.h | ||
| 16 | generic-y += ftrace.h | ||
| 17 | generic-y += futex.h | ||
| 18 | generic-y += hardirq.h | ||
| 19 | generic-y += hw_irq.h | ||
| 20 | generic-y += ioctl.h | ||
| 21 | generic-y += ioctls.h | ||
| 22 | generic-y += ipcbuf.h | ||
| 23 | generic-y += irq_regs.h | ||
| 24 | generic-y += kdebug.h | ||
| 25 | generic-y += kmap_types.h | ||
| 26 | generic-y += local.h | ||
| 27 | generic-y += mman.h | ||
| 28 | generic-y += module.h | ||
| 29 | generic-y += msgbuf.h | ||
| 30 | generic-y += param.h | ||
| 31 | generic-y += parport.h | ||
| 32 | generic-y += percpu.h | ||
| 33 | generic-y += poll.h | ||
| 34 | generic-y += posix_types.h | ||
| 35 | generic-y += resource.h | ||
| 36 | generic-y += scatterlist.h | ||
| 37 | generic-y += sections.h | ||
| 38 | generic-y += segment.h | ||
| 39 | generic-y += sembuf.h | ||
| 40 | generic-y += serial.h | ||
| 41 | generic-y += setup.h | ||
| 42 | generic-y += shmbuf.h | ||
| 43 | generic-y += shmparam.h | ||
| 44 | generic-y += siginfo.h | ||
| 45 | generic-y += signal.h | ||
| 46 | generic-y += sizes.h | ||
| 47 | generic-y += socket.h | ||
| 48 | generic-y += sockios.h | ||
| 49 | generic-y += stat.h | ||
| 50 | generic-y += statfs.h | ||
| 51 | generic-y += swab.h | ||
| 52 | generic-y += syscalls.h | ||
| 53 | generic-y += termbits.h | ||
| 54 | generic-y += termios.h | ||
| 55 | generic-y += topology.h | ||
| 56 | generic-y += types.h | ||
| 57 | generic-y += ucontext.h | ||
| 58 | generic-y += unaligned.h | ||
| 59 | generic-y += user.h | ||
| 60 | generic-y += vga.h | ||
| 61 | generic-y += xor.h | ||
diff --git a/arch/unicore32/kernel/Makefile b/arch/unicore32/kernel/Makefile index ec23a2fb2f50..aeb0f181568e 100644 --- a/arch/unicore32/kernel/Makefile +++ b/arch/unicore32/kernel/Makefile | |||
| @@ -16,7 +16,6 @@ obj-$(CONFIG_UNICORE_FPU_F64) += fpu-ucf64.o | |||
| 16 | obj-$(CONFIG_ARCH_PUV3) += clock.o irq.o time.o | 16 | obj-$(CONFIG_ARCH_PUV3) += clock.o irq.o time.o |
| 17 | 17 | ||
| 18 | obj-$(CONFIG_PUV3_GPIO) += gpio.o | 18 | obj-$(CONFIG_PUV3_GPIO) += gpio.o |
| 19 | obj-$(CONFIG_PUV3_RTC) += rtc.o | ||
| 20 | obj-$(CONFIG_PUV3_PWM) += pwm.o | 19 | obj-$(CONFIG_PUV3_PWM) += pwm.o |
| 21 | obj-$(CONFIG_PUV3_PM) += pm.o sleep.o | 20 | obj-$(CONFIG_PUV3_PM) += pm.o sleep.o |
| 22 | obj-$(CONFIG_HIBERNATION) += hibernate.o hibernate_asm.o | 21 | obj-$(CONFIG_HIBERNATION) += hibernate.o hibernate_asm.o |
diff --git a/arch/unicore32/kernel/vmlinux.lds.S b/arch/unicore32/kernel/vmlinux.lds.S index 9bf7f7af52c5..77e407e49a63 100644 --- a/arch/unicore32/kernel/vmlinux.lds.S +++ b/arch/unicore32/kernel/vmlinux.lds.S | |||
| @@ -30,7 +30,7 @@ SECTIONS | |||
| 30 | HEAD_TEXT_SECTION | 30 | HEAD_TEXT_SECTION |
| 31 | INIT_TEXT_SECTION(PAGE_SIZE) | 31 | INIT_TEXT_SECTION(PAGE_SIZE) |
| 32 | INIT_DATA_SECTION(16) | 32 | INIT_DATA_SECTION(16) |
| 33 | PERCPU(L1_CACHE_BYTES, PAGE_SIZE) | 33 | PERCPU_SECTION(L1_CACHE_BYTES) |
| 34 | __init_end = .; | 34 | __init_end = .; |
| 35 | 35 | ||
| 36 | _stext = .; | 36 | _stext = .; |
diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c index 8d128783af47..a3d0dc59067b 100644 --- a/arch/x86/kernel/process_32.c +++ b/arch/x86/kernel/process_32.c | |||
| @@ -245,7 +245,6 @@ start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp) | |||
| 245 | { | 245 | { |
| 246 | set_user_gs(regs, 0); | 246 | set_user_gs(regs, 0); |
| 247 | regs->fs = 0; | 247 | regs->fs = 0; |
| 248 | set_fs(USER_DS); | ||
| 249 | regs->ds = __USER_DS; | 248 | regs->ds = __USER_DS; |
| 250 | regs->es = __USER_DS; | 249 | regs->es = __USER_DS; |
| 251 | regs->ss = __USER_DS; | 250 | regs->ss = __USER_DS; |
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index 6c9dd922ac0d..ca6f7ab8df33 100644 --- a/arch/x86/kernel/process_64.c +++ b/arch/x86/kernel/process_64.c | |||
| @@ -338,7 +338,6 @@ start_thread_common(struct pt_regs *regs, unsigned long new_ip, | |||
| 338 | regs->cs = _cs; | 338 | regs->cs = _cs; |
| 339 | regs->ss = _ss; | 339 | regs->ss = _ss; |
| 340 | regs->flags = X86_EFLAGS_IF; | 340 | regs->flags = X86_EFLAGS_IF; |
| 341 | set_fs(USER_DS); | ||
| 342 | /* | 341 | /* |
| 343 | * Free the old FP and other extended state | 342 | * Free the old FP and other extended state |
| 344 | */ | 343 | */ |
diff --git a/arch/x86/xen/multicalls.c b/arch/x86/xen/multicalls.c index 8bff7e7c290b..1b2b73ff0a6e 100644 --- a/arch/x86/xen/multicalls.c +++ b/arch/x86/xen/multicalls.c | |||
| @@ -189,10 +189,10 @@ struct multicall_space __xen_mc_entry(size_t args) | |||
| 189 | unsigned argidx = roundup(b->argidx, sizeof(u64)); | 189 | unsigned argidx = roundup(b->argidx, sizeof(u64)); |
| 190 | 190 | ||
| 191 | BUG_ON(preemptible()); | 191 | BUG_ON(preemptible()); |
| 192 | BUG_ON(b->argidx > MC_ARGS); | 192 | BUG_ON(b->argidx >= MC_ARGS); |
| 193 | 193 | ||
| 194 | if (b->mcidx == MC_BATCH || | 194 | if (b->mcidx == MC_BATCH || |
| 195 | (argidx + args) > MC_ARGS) { | 195 | (argidx + args) >= MC_ARGS) { |
| 196 | mc_stats_flush(b->mcidx == MC_BATCH ? FL_SLOTS : FL_ARGS); | 196 | mc_stats_flush(b->mcidx == MC_BATCH ? FL_SLOTS : FL_ARGS); |
| 197 | xen_mc_flush(); | 197 | xen_mc_flush(); |
| 198 | argidx = roundup(b->argidx, sizeof(u64)); | 198 | argidx = roundup(b->argidx, sizeof(u64)); |
| @@ -206,7 +206,7 @@ struct multicall_space __xen_mc_entry(size_t args) | |||
| 206 | ret.args = &b->args[argidx]; | 206 | ret.args = &b->args[argidx]; |
| 207 | b->argidx = argidx + args; | 207 | b->argidx = argidx + args; |
| 208 | 208 | ||
| 209 | BUG_ON(b->argidx > MC_ARGS); | 209 | BUG_ON(b->argidx >= MC_ARGS); |
| 210 | return ret; | 210 | return ret; |
| 211 | } | 211 | } |
| 212 | 212 | ||
| @@ -216,7 +216,7 @@ struct multicall_space xen_mc_extend_args(unsigned long op, size_t size) | |||
| 216 | struct multicall_space ret = { NULL, NULL }; | 216 | struct multicall_space ret = { NULL, NULL }; |
| 217 | 217 | ||
| 218 | BUG_ON(preemptible()); | 218 | BUG_ON(preemptible()); |
| 219 | BUG_ON(b->argidx > MC_ARGS); | 219 | BUG_ON(b->argidx >= MC_ARGS); |
| 220 | 220 | ||
| 221 | if (b->mcidx == 0) | 221 | if (b->mcidx == 0) |
| 222 | return ret; | 222 | return ret; |
| @@ -224,14 +224,14 @@ struct multicall_space xen_mc_extend_args(unsigned long op, size_t size) | |||
| 224 | if (b->entries[b->mcidx - 1].op != op) | 224 | if (b->entries[b->mcidx - 1].op != op) |
| 225 | return ret; | 225 | return ret; |
| 226 | 226 | ||
| 227 | if ((b->argidx + size) > MC_ARGS) | 227 | if ((b->argidx + size) >= MC_ARGS) |
| 228 | return ret; | 228 | return ret; |
| 229 | 229 | ||
| 230 | ret.mc = &b->entries[b->mcidx - 1]; | 230 | ret.mc = &b->entries[b->mcidx - 1]; |
| 231 | ret.args = &b->args[b->argidx]; | 231 | ret.args = &b->args[b->argidx]; |
| 232 | b->argidx += size; | 232 | b->argidx += size; |
| 233 | 233 | ||
| 234 | BUG_ON(b->argidx > MC_ARGS); | 234 | BUG_ON(b->argidx >= MC_ARGS); |
| 235 | return ret; | 235 | return ret; |
| 236 | } | 236 | } |
| 237 | 237 | ||
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index dfb6e9d3d759..7f099d6e4e0b 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c | |||
| @@ -2802,10 +2802,11 @@ int ata_eh_reset(struct ata_link *link, int classify, | |||
| 2802 | } | 2802 | } |
| 2803 | 2803 | ||
| 2804 | /* | 2804 | /* |
| 2805 | * Some controllers can't be frozen very well and may set | 2805 | * Some controllers can't be frozen very well and may set spurious |
| 2806 | * spuruious error conditions during reset. Clear accumulated | 2806 | * error conditions during reset. Clear accumulated error |
| 2807 | * error information. As reset is the final recovery action, | 2807 | * information and re-thaw the port if frozen. As reset is the |
| 2808 | * nothing is lost by doing this. | 2808 | * final recovery action and we cross check link onlineness against |
| 2809 | * device classification later, no hotplug event is lost by this. | ||
| 2809 | */ | 2810 | */ |
| 2810 | spin_lock_irqsave(link->ap->lock, flags); | 2811 | spin_lock_irqsave(link->ap->lock, flags); |
| 2811 | memset(&link->eh_info, 0, sizeof(link->eh_info)); | 2812 | memset(&link->eh_info, 0, sizeof(link->eh_info)); |
| @@ -2814,6 +2815,9 @@ int ata_eh_reset(struct ata_link *link, int classify, | |||
| 2814 | ap->pflags &= ~ATA_PFLAG_EH_PENDING; | 2815 | ap->pflags &= ~ATA_PFLAG_EH_PENDING; |
| 2815 | spin_unlock_irqrestore(link->ap->lock, flags); | 2816 | spin_unlock_irqrestore(link->ap->lock, flags); |
| 2816 | 2817 | ||
| 2818 | if (ap->pflags & ATA_PFLAG_FROZEN) | ||
| 2819 | ata_eh_thaw_port(ap); | ||
| 2820 | |||
| 2817 | /* | 2821 | /* |
| 2818 | * Make sure onlineness and classification result correspond. | 2822 | * Make sure onlineness and classification result correspond. |
| 2819 | * Hotplug could have happened during reset and some | 2823 | * Hotplug could have happened during reset and some |
diff --git a/drivers/base/power/clock_ops.c b/drivers/base/power/clock_ops.c index c0dd09df7be8..eaa8a854af03 100644 --- a/drivers/base/power/clock_ops.c +++ b/drivers/base/power/clock_ops.c | |||
| @@ -291,7 +291,7 @@ static int pm_runtime_clk_notify(struct notifier_block *nb, | |||
| 291 | { | 291 | { |
| 292 | struct pm_clk_notifier_block *clknb; | 292 | struct pm_clk_notifier_block *clknb; |
| 293 | struct device *dev = data; | 293 | struct device *dev = data; |
| 294 | char *con_id; | 294 | char **con_id; |
| 295 | int error; | 295 | int error; |
| 296 | 296 | ||
| 297 | dev_dbg(dev, "%s() %ld\n", __func__, action); | 297 | dev_dbg(dev, "%s() %ld\n", __func__, action); |
| @@ -309,8 +309,8 @@ static int pm_runtime_clk_notify(struct notifier_block *nb, | |||
| 309 | 309 | ||
| 310 | dev->pwr_domain = clknb->pwr_domain; | 310 | dev->pwr_domain = clknb->pwr_domain; |
| 311 | if (clknb->con_ids[0]) { | 311 | if (clknb->con_ids[0]) { |
| 312 | for (con_id = clknb->con_ids[0]; *con_id; con_id++) | 312 | for (con_id = clknb->con_ids; *con_id; con_id++) |
| 313 | pm_runtime_clk_add(dev, con_id); | 313 | pm_runtime_clk_add(dev, *con_id); |
| 314 | } else { | 314 | } else { |
| 315 | pm_runtime_clk_add(dev, NULL); | 315 | pm_runtime_clk_add(dev, NULL); |
| 316 | } | 316 | } |
| @@ -380,7 +380,7 @@ static int pm_runtime_clk_notify(struct notifier_block *nb, | |||
| 380 | { | 380 | { |
| 381 | struct pm_clk_notifier_block *clknb; | 381 | struct pm_clk_notifier_block *clknb; |
| 382 | struct device *dev = data; | 382 | struct device *dev = data; |
| 383 | char *con_id; | 383 | char **con_id; |
| 384 | 384 | ||
| 385 | dev_dbg(dev, "%s() %ld\n", __func__, action); | 385 | dev_dbg(dev, "%s() %ld\n", __func__, action); |
| 386 | 386 | ||
| @@ -389,16 +389,16 @@ static int pm_runtime_clk_notify(struct notifier_block *nb, | |||
| 389 | switch (action) { | 389 | switch (action) { |
| 390 | case BUS_NOTIFY_ADD_DEVICE: | 390 | case BUS_NOTIFY_ADD_DEVICE: |
| 391 | if (clknb->con_ids[0]) { | 391 | if (clknb->con_ids[0]) { |
| 392 | for (con_id = clknb->con_ids[0]; *con_id; con_id++) | 392 | for (con_id = clknb->con_ids; *con_id; con_id++) |
| 393 | enable_clock(dev, con_id); | 393 | enable_clock(dev, *con_id); |
| 394 | } else { | 394 | } else { |
| 395 | enable_clock(dev, NULL); | 395 | enable_clock(dev, NULL); |
| 396 | } | 396 | } |
| 397 | break; | 397 | break; |
| 398 | case BUS_NOTIFY_DEL_DEVICE: | 398 | case BUS_NOTIFY_DEL_DEVICE: |
| 399 | if (clknb->con_ids[0]) { | 399 | if (clknb->con_ids[0]) { |
| 400 | for (con_id = clknb->con_ids[0]; *con_id; con_id++) | 400 | for (con_id = clknb->con_ids; *con_id; con_id++) |
| 401 | disable_clock(dev, con_id); | 401 | disable_clock(dev, *con_id); |
| 402 | } else { | 402 | } else { |
| 403 | disable_clock(dev, NULL); | 403 | disable_clock(dev, NULL); |
| 404 | } | 404 | } |
diff --git a/drivers/firmware/iscsi_ibft_find.c b/drivers/firmware/iscsi_ibft_find.c index f032e446fc11..bfe723266fd8 100644 --- a/drivers/firmware/iscsi_ibft_find.c +++ b/drivers/firmware/iscsi_ibft_find.c | |||
| @@ -108,7 +108,9 @@ done: | |||
| 108 | */ | 108 | */ |
| 109 | unsigned long __init find_ibft_region(unsigned long *sizep) | 109 | unsigned long __init find_ibft_region(unsigned long *sizep) |
| 110 | { | 110 | { |
| 111 | #ifdef CONFIG_ACPI | ||
| 111 | int i; | 112 | int i; |
| 113 | #endif | ||
| 112 | ibft_addr = NULL; | 114 | ibft_addr = NULL; |
| 113 | 115 | ||
| 114 | #ifdef CONFIG_ACPI | 116 | #ifdef CONFIG_ACPI |
diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig index 4a7f63143455..2967002a9f82 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig | |||
| @@ -87,32 +87,20 @@ config GPIO_IT8761E | |||
| 87 | Say yes here to support GPIO functionality of IT8761E super I/O chip. | 87 | Say yes here to support GPIO functionality of IT8761E super I/O chip. |
| 88 | 88 | ||
| 89 | config GPIO_EXYNOS4 | 89 | config GPIO_EXYNOS4 |
| 90 | bool "Samsung Exynos4 GPIO library support" | 90 | def_bool y |
| 91 | default y if CPU_EXYNOS4210 | 91 | depends on CPU_EXYNOS4210 |
| 92 | depends on ARM | ||
| 93 | help | ||
| 94 | Say yes here to support Samsung Exynos4 series SoCs GPIO library | ||
| 95 | 92 | ||
| 96 | config GPIO_PLAT_SAMSUNG | 93 | config GPIO_PLAT_SAMSUNG |
| 97 | bool "Samsung SoCs GPIO library support" | 94 | def_bool y |
| 98 | default y if SAMSUNG_GPIOLIB_4BIT | 95 | depends on SAMSUNG_GPIOLIB_4BIT |
| 99 | depends on ARM | ||
| 100 | help | ||
| 101 | Say yes here to support Samsung SoCs GPIO library | ||
| 102 | 96 | ||
| 103 | config GPIO_S5PC100 | 97 | config GPIO_S5PC100 |
| 104 | bool "Samsung S5PC100 GPIO library support" | 98 | def_bool y |
| 105 | default y if CPU_S5PC100 | 99 | depends on CPU_S5PC100 |
| 106 | depends on ARM | ||
| 107 | help | ||
| 108 | Say yes here to support Samsung S5PC100 SoCs GPIO library | ||
| 109 | 100 | ||
| 110 | config GPIO_S5PV210 | 101 | config GPIO_S5PV210 |
| 111 | bool "Samsung S5PV210/S5PC110 GPIO library support" | 102 | def_bool y |
| 112 | default y if CPU_S5PV210 | 103 | depends on CPU_S5PV210 |
| 113 | depends on ARM | ||
| 114 | help | ||
| 115 | Say yes here to support Samsung S5PV210/S5PC110 SoCs GPIO library | ||
| 116 | 104 | ||
| 117 | config GPIO_PL061 | 105 | config GPIO_PL061 |
| 118 | bool "PrimeCell PL061 GPIO support" | 106 | bool "PrimeCell PL061 GPIO support" |
diff --git a/drivers/gpio/gpio-exynos4.c b/drivers/gpio/gpio-exynos4.c index d54ca6adb660..9029835112e7 100644 --- a/drivers/gpio/gpio-exynos4.c +++ b/drivers/gpio/gpio-exynos4.c | |||
| @@ -21,16 +21,37 @@ | |||
| 21 | #include <plat/gpio-cfg.h> | 21 | #include <plat/gpio-cfg.h> |
| 22 | #include <plat/gpio-cfg-helpers.h> | 22 | #include <plat/gpio-cfg-helpers.h> |
| 23 | 23 | ||
| 24 | int s3c_gpio_setpull_exynos4(struct s3c_gpio_chip *chip, | ||
| 25 | unsigned int off, s3c_gpio_pull_t pull) | ||
| 26 | { | ||
| 27 | if (pull == S3C_GPIO_PULL_UP) | ||
| 28 | pull = 3; | ||
| 29 | |||
| 30 | return s3c_gpio_setpull_updown(chip, off, pull); | ||
| 31 | } | ||
| 32 | |||
| 33 | s3c_gpio_pull_t s3c_gpio_getpull_exynos4(struct s3c_gpio_chip *chip, | ||
| 34 | unsigned int off) | ||
| 35 | { | ||
| 36 | s3c_gpio_pull_t pull; | ||
| 37 | |||
| 38 | pull = s3c_gpio_getpull_updown(chip, off); | ||
| 39 | if (pull == 3) | ||
| 40 | pull = S3C_GPIO_PULL_UP; | ||
| 41 | |||
| 42 | return pull; | ||
| 43 | } | ||
| 44 | |||
| 24 | static struct s3c_gpio_cfg gpio_cfg = { | 45 | static struct s3c_gpio_cfg gpio_cfg = { |
| 25 | .set_config = s3c_gpio_setcfg_s3c64xx_4bit, | 46 | .set_config = s3c_gpio_setcfg_s3c64xx_4bit, |
| 26 | .set_pull = s3c_gpio_setpull_updown, | 47 | .set_pull = s3c_gpio_setpull_exynos4, |
| 27 | .get_pull = s3c_gpio_getpull_updown, | 48 | .get_pull = s3c_gpio_getpull_exynos4, |
| 28 | }; | 49 | }; |
| 29 | 50 | ||
| 30 | static struct s3c_gpio_cfg gpio_cfg_noint = { | 51 | static struct s3c_gpio_cfg gpio_cfg_noint = { |
| 31 | .set_config = s3c_gpio_setcfg_s3c64xx_4bit, | 52 | .set_config = s3c_gpio_setcfg_s3c64xx_4bit, |
| 32 | .set_pull = s3c_gpio_setpull_updown, | 53 | .set_pull = s3c_gpio_setpull_exynos4, |
| 33 | .get_pull = s3c_gpio_getpull_updown, | 54 | .get_pull = s3c_gpio_getpull_exynos4, |
| 34 | }; | 55 | }; |
| 35 | 56 | ||
| 36 | /* | 57 | /* |
diff --git a/drivers/gpio/gpio-nomadik.c b/drivers/gpio/gpio-nomadik.c index 4961ef9bc153..2c212c732d76 100644 --- a/drivers/gpio/gpio-nomadik.c +++ b/drivers/gpio/gpio-nomadik.c | |||
| @@ -4,6 +4,7 @@ | |||
| 4 | * Copyright (C) 2008,2009 STMicroelectronics | 4 | * Copyright (C) 2008,2009 STMicroelectronics |
| 5 | * Copyright (C) 2009 Alessandro Rubini <rubini@unipv.it> | 5 | * Copyright (C) 2009 Alessandro Rubini <rubini@unipv.it> |
| 6 | * Rewritten based on work by Prafulla WADASKAR <prafulla.wadaskar@st.com> | 6 | * Rewritten based on work by Prafulla WADASKAR <prafulla.wadaskar@st.com> |
| 7 | * Copyright (C) 2011 Linus Walleij <linus.walleij@linaro.org> | ||
| 7 | * | 8 | * |
| 8 | * This program is free software; you can redistribute it and/or modify | 9 | * This program is free software; you can redistribute it and/or modify |
| 9 | * it under the terms of the GNU General Public License version 2 as | 10 | * it under the terms of the GNU General Public License version 2 as |
| @@ -49,6 +50,7 @@ struct nmk_gpio_chip { | |||
| 49 | u32 (*get_secondary_status)(unsigned int bank); | 50 | u32 (*get_secondary_status)(unsigned int bank); |
| 50 | void (*set_ioforce)(bool enable); | 51 | void (*set_ioforce)(bool enable); |
| 51 | spinlock_t lock; | 52 | spinlock_t lock; |
| 53 | bool sleepmode; | ||
| 52 | /* Keep track of configured edges */ | 54 | /* Keep track of configured edges */ |
| 53 | u32 edge_rising; | 55 | u32 edge_rising; |
| 54 | u32 edge_falling; | 56 | u32 edge_falling; |
| @@ -393,14 +395,25 @@ EXPORT_SYMBOL(nmk_config_pins_sleep); | |||
| 393 | * @gpio: pin number | 395 | * @gpio: pin number |
| 394 | * @mode: NMK_GPIO_SLPM_INPUT or NMK_GPIO_SLPM_NOCHANGE, | 396 | * @mode: NMK_GPIO_SLPM_INPUT or NMK_GPIO_SLPM_NOCHANGE, |
| 395 | * | 397 | * |
| 396 | * Sets the sleep mode of a pin. If @mode is NMK_GPIO_SLPM_INPUT, the pin is | 398 | * This register is actually in the pinmux layer, not the GPIO block itself. |
| 397 | * changed to an input (with pullup/down enabled) in sleep and deep sleep. If | 399 | * The GPIO1B_SLPM register defines the GPIO mode when SLEEP/DEEP-SLEEP |
| 398 | * @mode is NMK_GPIO_SLPM_NOCHANGE, the pin remains in the state it was | 400 | * mode is entered (i.e. when signal IOFORCE is HIGH by the platform code). |
| 399 | * configured even when in sleep and deep sleep. | 401 | * Each GPIO can be configured to be forced into GPIO mode when IOFORCE is |
| 402 | * HIGH, overriding the normal setting defined by GPIO_AFSELx registers. | ||
| 403 | * When IOFORCE returns LOW (by software, after SLEEP/DEEP-SLEEP exit), | ||
| 404 | * the GPIOs return to the normal setting defined by GPIO_AFSELx registers. | ||
| 400 | * | 405 | * |
| 401 | * On DB8500v2 onwards, this setting loses the previous meaning and instead | 406 | * If @mode is NMK_GPIO_SLPM_INPUT, the corresponding GPIO is switched to GPIO |
| 402 | * indicates if wakeup detection is enabled on the pin. Note that | 407 | * mode when signal IOFORCE is HIGH (i.e. when SLEEP/DEEP-SLEEP mode is |
| 403 | * enable_irq_wake() will automatically enable wakeup detection. | 408 | * entered) regardless of the altfunction selected. Also wake-up detection is |
| 409 | * ENABLED. | ||
| 410 | * | ||
| 411 | * If @mode is NMK_GPIO_SLPM_NOCHANGE, the corresponding GPIO remains | ||
| 412 | * controlled by NMK_GPIO_DATC, NMK_GPIO_DATS, NMK_GPIO_DIR, NMK_GPIO_PDIS | ||
| 413 | * (for altfunction GPIO) or respective on-chip peripherals (for other | ||
| 414 | * altfuncs) when IOFORCE is HIGH. Also wake-up detection DISABLED. | ||
| 415 | * | ||
| 416 | * Note that enable_irq_wake() will automatically enable wakeup detection. | ||
| 404 | */ | 417 | */ |
| 405 | int nmk_gpio_set_slpm(int gpio, enum nmk_gpio_slpm mode) | 418 | int nmk_gpio_set_slpm(int gpio, enum nmk_gpio_slpm mode) |
| 406 | { | 419 | { |
| @@ -551,6 +564,12 @@ static void __nmk_gpio_irq_modify(struct nmk_gpio_chip *nmk_chip, | |||
| 551 | static void __nmk_gpio_set_wake(struct nmk_gpio_chip *nmk_chip, | 564 | static void __nmk_gpio_set_wake(struct nmk_gpio_chip *nmk_chip, |
| 552 | int gpio, bool on) | 565 | int gpio, bool on) |
| 553 | { | 566 | { |
| 567 | if (nmk_chip->sleepmode) { | ||
| 568 | __nmk_gpio_set_slpm(nmk_chip, gpio - nmk_chip->chip.base, | ||
| 569 | on ? NMK_GPIO_SLPM_WAKEUP_ENABLE | ||
| 570 | : NMK_GPIO_SLPM_WAKEUP_DISABLE); | ||
| 571 | } | ||
| 572 | |||
| 554 | __nmk_gpio_irq_modify(nmk_chip, gpio, WAKE, on); | 573 | __nmk_gpio_irq_modify(nmk_chip, gpio, WAKE, on); |
| 555 | } | 574 | } |
| 556 | 575 | ||
| @@ -901,7 +920,7 @@ void nmk_gpio_wakeups_suspend(void) | |||
| 901 | writel(chip->fwimsc & chip->real_wake, | 920 | writel(chip->fwimsc & chip->real_wake, |
| 902 | chip->addr + NMK_GPIO_FWIMSC); | 921 | chip->addr + NMK_GPIO_FWIMSC); |
| 903 | 922 | ||
| 904 | if (cpu_is_u8500v2()) { | 923 | if (chip->sleepmode) { |
| 905 | chip->slpm = readl(chip->addr + NMK_GPIO_SLPC); | 924 | chip->slpm = readl(chip->addr + NMK_GPIO_SLPC); |
| 906 | 925 | ||
| 907 | /* 0 -> wakeup enable */ | 926 | /* 0 -> wakeup enable */ |
| @@ -923,7 +942,7 @@ void nmk_gpio_wakeups_resume(void) | |||
| 923 | writel(chip->rwimsc, chip->addr + NMK_GPIO_RWIMSC); | 942 | writel(chip->rwimsc, chip->addr + NMK_GPIO_RWIMSC); |
| 924 | writel(chip->fwimsc, chip->addr + NMK_GPIO_FWIMSC); | 943 | writel(chip->fwimsc, chip->addr + NMK_GPIO_FWIMSC); |
| 925 | 944 | ||
| 926 | if (cpu_is_u8500v2()) | 945 | if (chip->sleepmode) |
| 927 | writel(chip->slpm, chip->addr + NMK_GPIO_SLPC); | 946 | writel(chip->slpm, chip->addr + NMK_GPIO_SLPC); |
| 928 | } | 947 | } |
| 929 | } | 948 | } |
| @@ -1010,6 +1029,7 @@ static int __devinit nmk_gpio_probe(struct platform_device *dev) | |||
| 1010 | nmk_chip->secondary_parent_irq = secondary_irq; | 1029 | nmk_chip->secondary_parent_irq = secondary_irq; |
| 1011 | nmk_chip->get_secondary_status = pdata->get_secondary_status; | 1030 | nmk_chip->get_secondary_status = pdata->get_secondary_status; |
| 1012 | nmk_chip->set_ioforce = pdata->set_ioforce; | 1031 | nmk_chip->set_ioforce = pdata->set_ioforce; |
| 1032 | nmk_chip->sleepmode = pdata->supports_sleepmode; | ||
| 1013 | spin_lock_init(&nmk_chip->lock); | 1033 | spin_lock_init(&nmk_chip->lock); |
| 1014 | 1034 | ||
| 1015 | chip = &nmk_chip->chip; | 1035 | chip = &nmk_chip->chip; |
| @@ -1065,5 +1085,3 @@ core_initcall(nmk_gpio_init); | |||
| 1065 | MODULE_AUTHOR("Prafulla WADASKAR and Alessandro Rubini"); | 1085 | MODULE_AUTHOR("Prafulla WADASKAR and Alessandro Rubini"); |
| 1066 | MODULE_DESCRIPTION("Nomadik GPIO Driver"); | 1086 | MODULE_DESCRIPTION("Nomadik GPIO Driver"); |
| 1067 | MODULE_LICENSE("GPL"); | 1087 | MODULE_LICENSE("GPL"); |
| 1068 | |||
| 1069 | |||
diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c index 6c51191da567..01f74a8459d9 100644 --- a/drivers/gpio/gpio-omap.c +++ b/drivers/gpio/gpio-omap.c | |||
| @@ -432,7 +432,6 @@ static inline void set_24xx_gpio_triggering(struct gpio_bank *bank, int gpio, | |||
| 432 | { | 432 | { |
| 433 | void __iomem *base = bank->base; | 433 | void __iomem *base = bank->base; |
| 434 | u32 gpio_bit = 1 << gpio; | 434 | u32 gpio_bit = 1 << gpio; |
| 435 | u32 val; | ||
| 436 | 435 | ||
| 437 | if (cpu_is_omap44xx()) { | 436 | if (cpu_is_omap44xx()) { |
| 438 | MOD_REG_BIT(OMAP4_GPIO_LEVELDETECT0, gpio_bit, | 437 | MOD_REG_BIT(OMAP4_GPIO_LEVELDETECT0, gpio_bit, |
| @@ -455,15 +454,8 @@ static inline void set_24xx_gpio_triggering(struct gpio_bank *bank, int gpio, | |||
| 455 | } | 454 | } |
| 456 | if (likely(!(bank->non_wakeup_gpios & gpio_bit))) { | 455 | if (likely(!(bank->non_wakeup_gpios & gpio_bit))) { |
| 457 | if (cpu_is_omap44xx()) { | 456 | if (cpu_is_omap44xx()) { |
| 458 | if (trigger != 0) | 457 | MOD_REG_BIT(OMAP4_GPIO_IRQWAKEN0, gpio_bit, |
| 459 | __raw_writel(1 << gpio, bank->base+ | 458 | trigger != 0); |
| 460 | OMAP4_GPIO_IRQWAKEN0); | ||
| 461 | else { | ||
| 462 | val = __raw_readl(bank->base + | ||
| 463 | OMAP4_GPIO_IRQWAKEN0); | ||
| 464 | __raw_writel(val & (~(1 << gpio)), bank->base + | ||
| 465 | OMAP4_GPIO_IRQWAKEN0); | ||
| 466 | } | ||
| 467 | } else { | 459 | } else { |
| 468 | /* | 460 | /* |
| 469 | * GPIO wakeup request can only be generated on edge | 461 | * GPIO wakeup request can only be generated on edge |
| @@ -1134,8 +1126,11 @@ static void gpio_irq_shutdown(struct irq_data *d) | |||
| 1134 | { | 1126 | { |
| 1135 | unsigned int gpio = d->irq - IH_GPIO_BASE; | 1127 | unsigned int gpio = d->irq - IH_GPIO_BASE; |
| 1136 | struct gpio_bank *bank = irq_data_get_irq_chip_data(d); | 1128 | struct gpio_bank *bank = irq_data_get_irq_chip_data(d); |
| 1129 | unsigned long flags; | ||
| 1137 | 1130 | ||
| 1131 | spin_lock_irqsave(&bank->lock, flags); | ||
| 1138 | _reset_gpio(bank, gpio); | 1132 | _reset_gpio(bank, gpio); |
| 1133 | spin_unlock_irqrestore(&bank->lock, flags); | ||
| 1139 | } | 1134 | } |
| 1140 | 1135 | ||
| 1141 | static void gpio_ack_irq(struct irq_data *d) | 1136 | static void gpio_ack_irq(struct irq_data *d) |
| @@ -1150,9 +1145,12 @@ static void gpio_mask_irq(struct irq_data *d) | |||
| 1150 | { | 1145 | { |
| 1151 | unsigned int gpio = d->irq - IH_GPIO_BASE; | 1146 | unsigned int gpio = d->irq - IH_GPIO_BASE; |
| 1152 | struct gpio_bank *bank = irq_data_get_irq_chip_data(d); | 1147 | struct gpio_bank *bank = irq_data_get_irq_chip_data(d); |
| 1148 | unsigned long flags; | ||
| 1153 | 1149 | ||
| 1150 | spin_lock_irqsave(&bank->lock, flags); | ||
| 1154 | _set_gpio_irqenable(bank, gpio, 0); | 1151 | _set_gpio_irqenable(bank, gpio, 0); |
| 1155 | _set_gpio_triggering(bank, get_gpio_index(gpio), IRQ_TYPE_NONE); | 1152 | _set_gpio_triggering(bank, get_gpio_index(gpio), IRQ_TYPE_NONE); |
| 1153 | spin_unlock_irqrestore(&bank->lock, flags); | ||
| 1156 | } | 1154 | } |
| 1157 | 1155 | ||
| 1158 | static void gpio_unmask_irq(struct irq_data *d) | 1156 | static void gpio_unmask_irq(struct irq_data *d) |
| @@ -1161,7 +1159,9 @@ static void gpio_unmask_irq(struct irq_data *d) | |||
| 1161 | struct gpio_bank *bank = irq_data_get_irq_chip_data(d); | 1159 | struct gpio_bank *bank = irq_data_get_irq_chip_data(d); |
| 1162 | unsigned int irq_mask = 1 << get_gpio_index(gpio); | 1160 | unsigned int irq_mask = 1 << get_gpio_index(gpio); |
| 1163 | u32 trigger = irqd_get_trigger_type(d); | 1161 | u32 trigger = irqd_get_trigger_type(d); |
| 1162 | unsigned long flags; | ||
| 1164 | 1163 | ||
| 1164 | spin_lock_irqsave(&bank->lock, flags); | ||
| 1165 | if (trigger) | 1165 | if (trigger) |
| 1166 | _set_gpio_triggering(bank, get_gpio_index(gpio), trigger); | 1166 | _set_gpio_triggering(bank, get_gpio_index(gpio), trigger); |
| 1167 | 1167 | ||
| @@ -1173,6 +1173,7 @@ static void gpio_unmask_irq(struct irq_data *d) | |||
| 1173 | } | 1173 | } |
| 1174 | 1174 | ||
| 1175 | _set_gpio_irqenable(bank, gpio, 1); | 1175 | _set_gpio_irqenable(bank, gpio, 1); |
| 1176 | spin_unlock_irqrestore(&bank->lock, flags); | ||
| 1176 | } | 1177 | } |
| 1177 | 1178 | ||
| 1178 | static struct irq_chip gpio_irq_chip = { | 1179 | static struct irq_chip gpio_irq_chip = { |
| @@ -1524,7 +1525,7 @@ static void omap_gpio_mod_init(struct gpio_bank *bank, int id) | |||
| 1524 | } | 1525 | } |
| 1525 | } | 1526 | } |
| 1526 | 1527 | ||
| 1527 | static void __init omap_gpio_chip_init(struct gpio_bank *bank) | 1528 | static void __devinit omap_gpio_chip_init(struct gpio_bank *bank) |
| 1528 | { | 1529 | { |
| 1529 | int j; | 1530 | int j; |
| 1530 | static int gpio; | 1531 | static int gpio; |
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c index 8c1916941871..fae00c0d75aa 100644 --- a/drivers/gpu/drm/radeon/radeon_cs.c +++ b/drivers/gpu/drm/radeon/radeon_cs.c | |||
| @@ -228,6 +228,7 @@ int radeon_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) | |||
| 228 | parser.filp = filp; | 228 | parser.filp = filp; |
| 229 | parser.rdev = rdev; | 229 | parser.rdev = rdev; |
| 230 | parser.dev = rdev->dev; | 230 | parser.dev = rdev->dev; |
| 231 | parser.family = rdev->family; | ||
| 231 | r = radeon_cs_parser_init(&parser, data); | 232 | r = radeon_cs_parser_init(&parser, data); |
| 232 | if (r) { | 233 | if (r) { |
| 233 | DRM_ERROR("Failed to initialize parser !\n"); | 234 | DRM_ERROR("Failed to initialize parser !\n"); |
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index d77ede3e67ce..e680501c78ea 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
| @@ -754,6 +754,7 @@ int radeon_device_init(struct radeon_device *rdev, | |||
| 754 | dma_bits = rdev->need_dma32 ? 32 : 40; | 754 | dma_bits = rdev->need_dma32 ? 32 : 40; |
| 755 | r = pci_set_dma_mask(rdev->pdev, DMA_BIT_MASK(dma_bits)); | 755 | r = pci_set_dma_mask(rdev->pdev, DMA_BIT_MASK(dma_bits)); |
| 756 | if (r) { | 756 | if (r) { |
| 757 | rdev->need_dma32 = true; | ||
| 757 | printk(KERN_WARNING "radeon: No suitable DMA available.\n"); | 758 | printk(KERN_WARNING "radeon: No suitable DMA available.\n"); |
| 758 | } | 759 | } |
| 759 | 760 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c index 1d330606292f..73dfbe8e5f9e 100644 --- a/drivers/gpu/drm/radeon/radeon_drv.c +++ b/drivers/gpu/drm/radeon/radeon_drv.c | |||
| @@ -113,7 +113,7 @@ int radeon_benchmarking = 0; | |||
| 113 | int radeon_testing = 0; | 113 | int radeon_testing = 0; |
| 114 | int radeon_connector_table = 0; | 114 | int radeon_connector_table = 0; |
| 115 | int radeon_tv = 1; | 115 | int radeon_tv = 1; |
| 116 | int radeon_audio = 1; | 116 | int radeon_audio = 0; |
| 117 | int radeon_disp_priority = 0; | 117 | int radeon_disp_priority = 0; |
| 118 | int radeon_hw_i2c = 0; | 118 | int radeon_hw_i2c = 0; |
| 119 | int radeon_pcie_gen2 = 0; | 119 | int radeon_pcie_gen2 = 0; |
| @@ -151,7 +151,7 @@ module_param_named(connector_table, radeon_connector_table, int, 0444); | |||
| 151 | MODULE_PARM_DESC(tv, "TV enable (0 = disable)"); | 151 | MODULE_PARM_DESC(tv, "TV enable (0 = disable)"); |
| 152 | module_param_named(tv, radeon_tv, int, 0444); | 152 | module_param_named(tv, radeon_tv, int, 0444); |
| 153 | 153 | ||
| 154 | MODULE_PARM_DESC(audio, "Audio enable (0 = disable)"); | 154 | MODULE_PARM_DESC(audio, "Audio enable (1 = enable)"); |
| 155 | module_param_named(audio, radeon_audio, int, 0444); | 155 | module_param_named(audio, radeon_audio, int, 0444); |
| 156 | 156 | ||
| 157 | MODULE_PARM_DESC(disp_priority, "Display Priority (0 = auto, 1 = normal, 2 = high)"); | 157 | MODULE_PARM_DESC(disp_priority, "Display Priority (0 = auto, 1 = normal, 2 = high)"); |
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index 144d27261e43..04b09564bfa9 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c | |||
| @@ -778,7 +778,8 @@ static ide_startstop_t ide_cd_do_request(ide_drive_t *drive, struct request *rq, | |||
| 778 | sector_t block) | 778 | sector_t block) |
| 779 | { | 779 | { |
| 780 | struct ide_cmd cmd; | 780 | struct ide_cmd cmd; |
| 781 | int uptodate = 0, nsectors; | 781 | int uptodate = 0; |
| 782 | unsigned int nsectors; | ||
| 782 | 783 | ||
| 783 | ide_debug_log(IDE_DBG_RQ, "cmd: 0x%x, block: %llu", | 784 | ide_debug_log(IDE_DBG_RQ, "cmd: 0x%x, block: %llu", |
| 784 | rq->cmd[0], (unsigned long long)block); | 785 | rq->cmd[0], (unsigned long long)block); |
diff --git a/drivers/isdn/hardware/mISDN/hfcsusb.c b/drivers/isdn/hardware/mISDN/hfcsusb.c index 3ccbff13eaf2..71a8eb6ef71e 100644 --- a/drivers/isdn/hardware/mISDN/hfcsusb.c +++ b/drivers/isdn/hardware/mISDN/hfcsusb.c | |||
| @@ -283,6 +283,7 @@ hfcsusb_ph_info(struct hfcsusb *hw) | |||
| 283 | _queue_data(&dch->dev.D, MPH_INFORMATION_IND, MISDN_ID_ANY, | 283 | _queue_data(&dch->dev.D, MPH_INFORMATION_IND, MISDN_ID_ANY, |
| 284 | sizeof(struct ph_info_dch) + dch->dev.nrbchan * | 284 | sizeof(struct ph_info_dch) + dch->dev.nrbchan * |
| 285 | sizeof(struct ph_info_ch), phi, GFP_ATOMIC); | 285 | sizeof(struct ph_info_ch), phi, GFP_ATOMIC); |
| 286 | kfree(phi); | ||
| 286 | } | 287 | } |
| 287 | 288 | ||
| 288 | /* | 289 | /* |
diff --git a/drivers/media/dvb/dvb-usb/anysee.c b/drivers/media/dvb/dvb-usb/anysee.c index 4dc1ca333236..7c327b54308e 100644 --- a/drivers/media/dvb/dvb-usb/anysee.c +++ b/drivers/media/dvb/dvb-usb/anysee.c | |||
| @@ -60,8 +60,6 @@ static int anysee_ctrl_msg(struct dvb_usb_device *d, u8 *sbuf, u8 slen, | |||
| 60 | int act_len, ret; | 60 | int act_len, ret; |
| 61 | u8 buf[64]; | 61 | u8 buf[64]; |
| 62 | 62 | ||
| 63 | if (slen > sizeof(buf)) | ||
| 64 | slen = sizeof(buf); | ||
| 65 | memcpy(&buf[0], sbuf, slen); | 63 | memcpy(&buf[0], sbuf, slen); |
| 66 | buf[60] = state->seq++; | 64 | buf[60] = state->seq++; |
| 67 | 65 | ||
| @@ -180,30 +178,37 @@ static int anysee_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msg, | |||
| 180 | { | 178 | { |
| 181 | struct dvb_usb_device *d = i2c_get_adapdata(adap); | 179 | struct dvb_usb_device *d = i2c_get_adapdata(adap); |
| 182 | int ret = 0, inc, i = 0; | 180 | int ret = 0, inc, i = 0; |
| 181 | u8 buf[52]; /* 4 + 48 (I2C WR USB command header + I2C WR max) */ | ||
| 183 | 182 | ||
| 184 | if (mutex_lock_interruptible(&d->i2c_mutex) < 0) | 183 | if (mutex_lock_interruptible(&d->i2c_mutex) < 0) |
| 185 | return -EAGAIN; | 184 | return -EAGAIN; |
| 186 | 185 | ||
| 187 | while (i < num) { | 186 | while (i < num) { |
| 188 | if (num > i + 1 && (msg[i+1].flags & I2C_M_RD)) { | 187 | if (num > i + 1 && (msg[i+1].flags & I2C_M_RD)) { |
| 189 | u8 buf[6]; | 188 | if (msg[i].len > 2 || msg[i+1].len > 60) { |
| 189 | ret = -EOPNOTSUPP; | ||
| 190 | break; | ||
| 191 | } | ||
| 190 | buf[0] = CMD_I2C_READ; | 192 | buf[0] = CMD_I2C_READ; |
| 191 | buf[1] = (msg[i].addr << 1) | 0x01; | 193 | buf[1] = (msg[i].addr << 1) | 0x01; |
| 192 | buf[2] = msg[i].buf[0]; | 194 | buf[2] = msg[i].buf[0]; |
| 193 | buf[3] = msg[i].buf[1]; | 195 | buf[3] = msg[i].buf[1]; |
| 194 | buf[4] = msg[i].len-1; | 196 | buf[4] = msg[i].len-1; |
| 195 | buf[5] = msg[i+1].len; | 197 | buf[5] = msg[i+1].len; |
| 196 | ret = anysee_ctrl_msg(d, buf, sizeof(buf), msg[i+1].buf, | 198 | ret = anysee_ctrl_msg(d, buf, 6, msg[i+1].buf, |
| 197 | msg[i+1].len); | 199 | msg[i+1].len); |
| 198 | inc = 2; | 200 | inc = 2; |
| 199 | } else { | 201 | } else { |
| 200 | u8 buf[4+msg[i].len]; | 202 | if (msg[i].len > 48) { |
| 203 | ret = -EOPNOTSUPP; | ||
| 204 | break; | ||
| 205 | } | ||
| 201 | buf[0] = CMD_I2C_WRITE; | 206 | buf[0] = CMD_I2C_WRITE; |
| 202 | buf[1] = (msg[i].addr << 1); | 207 | buf[1] = (msg[i].addr << 1); |
| 203 | buf[2] = msg[i].len; | 208 | buf[2] = msg[i].len; |
| 204 | buf[3] = 0x01; | 209 | buf[3] = 0x01; |
| 205 | memcpy(&buf[4], msg[i].buf, msg[i].len); | 210 | memcpy(&buf[4], msg[i].buf, msg[i].len); |
| 206 | ret = anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0); | 211 | ret = anysee_ctrl_msg(d, buf, 4 + msg[i].len, NULL, 0); |
| 207 | inc = 1; | 212 | inc = 1; |
| 208 | } | 213 | } |
| 209 | if (ret) | 214 | if (ret) |
diff --git a/drivers/media/media-devnode.c b/drivers/media/media-devnode.c index af5263c6625a..7b42ace419d9 100644 --- a/drivers/media/media-devnode.c +++ b/drivers/media/media-devnode.c | |||
| @@ -213,14 +213,14 @@ int __must_check media_devnode_register(struct media_devnode *mdev) | |||
| 213 | 213 | ||
| 214 | /* Part 1: Find a free minor number */ | 214 | /* Part 1: Find a free minor number */ |
| 215 | mutex_lock(&media_devnode_lock); | 215 | mutex_lock(&media_devnode_lock); |
| 216 | minor = find_next_zero_bit(media_devnode_nums, 0, MEDIA_NUM_DEVICES); | 216 | minor = find_next_zero_bit(media_devnode_nums, MEDIA_NUM_DEVICES, 0); |
| 217 | if (minor == MEDIA_NUM_DEVICES) { | 217 | if (minor == MEDIA_NUM_DEVICES) { |
| 218 | mutex_unlock(&media_devnode_lock); | 218 | mutex_unlock(&media_devnode_lock); |
| 219 | printk(KERN_ERR "could not get a free minor\n"); | 219 | printk(KERN_ERR "could not get a free minor\n"); |
| 220 | return -ENFILE; | 220 | return -ENFILE; |
| 221 | } | 221 | } |
| 222 | 222 | ||
| 223 | set_bit(mdev->minor, media_devnode_nums); | 223 | set_bit(minor, media_devnode_nums); |
| 224 | mutex_unlock(&media_devnode_lock); | 224 | mutex_unlock(&media_devnode_lock); |
| 225 | 225 | ||
| 226 | mdev->minor = minor; | 226 | mdev->minor = minor; |
diff --git a/drivers/media/video/cx23885/cx23885-cards.c b/drivers/media/video/cx23885/cx23885-cards.c index 2354336862cf..934185cca758 100644 --- a/drivers/media/video/cx23885/cx23885-cards.c +++ b/drivers/media/video/cx23885/cx23885-cards.c | |||
| @@ -25,8 +25,8 @@ | |||
| 25 | #include <linux/delay.h> | 25 | #include <linux/delay.h> |
| 26 | #include <media/cx25840.h> | 26 | #include <media/cx25840.h> |
| 27 | #include <linux/firmware.h> | 27 | #include <linux/firmware.h> |
| 28 | #include <staging/altera.h> | ||
| 29 | 28 | ||
| 29 | #include "../../../staging/altera-stapl/altera.h" | ||
| 30 | #include "cx23885.h" | 30 | #include "cx23885.h" |
| 31 | #include "tuner-xc2028.h" | 31 | #include "tuner-xc2028.h" |
| 32 | #include "netup-init.h" | 32 | #include "netup-init.h" |
diff --git a/drivers/media/video/gspca/coarse_expo_autogain.h b/drivers/media/video/gspca/coarse_expo_autogain.h deleted file mode 100644 index 1cb9d941eaf6..000000000000 --- a/drivers/media/video/gspca/coarse_expo_autogain.h +++ /dev/null | |||
| @@ -1,116 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Auto gain algorithm for camera's with a coarse exposure control | ||
| 3 | * | ||
| 4 | * Copyright (C) 2010 Hans de Goede <hdegoede@redhat.com> | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License as published by | ||
| 8 | * the Free Software Foundation; either version 2 of the License, or | ||
| 9 | * (at your option) any later version. | ||
| 10 | * | ||
| 11 | * This program is distributed in the hope that it will be useful, | ||
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 14 | * GNU General Public License for more details. | ||
| 15 | * | ||
| 16 | * You should have received a copy of the GNU General Public License | ||
| 17 | * along with this program; if not, write to the Free Software | ||
| 18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 19 | */ | ||
| 20 | |||
| 21 | /* Autogain + exposure algorithm for cameras with a coarse exposure control | ||
| 22 | (usually this means we can only control the clockdiv to change exposure) | ||
| 23 | As changing the clockdiv so that the fps drops from 30 to 15 fps for | ||
| 24 | example, will lead to a huge exposure change (it effectively doubles), | ||
| 25 | this algorithm normally tries to only adjust the gain (between 40 and | ||
| 26 | 80 %) and if that does not help, only then changes exposure. This leads | ||
| 27 | to a much more stable image then using the knee algorithm which at | ||
| 28 | certain points of the knee graph will only try to adjust exposure, | ||
| 29 | which leads to oscilating as one exposure step is huge. | ||
| 30 | |||
| 31 | Note this assumes that the sd struct for the cam in question has | ||
| 32 | exp_too_high_cnt and exp_too_high_cnt int members for use by this function. | ||
| 33 | |||
| 34 | Returns 0 if no changes were made, 1 if the gain and or exposure settings | ||
| 35 | where changed. */ | ||
| 36 | static int gspca_coarse_grained_expo_autogain(struct gspca_dev *gspca_dev, | ||
| 37 | int avg_lum, int desired_avg_lum, int deadzone) | ||
| 38 | { | ||
| 39 | int i, steps, gain, orig_gain, exposure, orig_exposure; | ||
| 40 | int gain_low, gain_high; | ||
| 41 | const struct ctrl *gain_ctrl = NULL; | ||
| 42 | const struct ctrl *exposure_ctrl = NULL; | ||
| 43 | struct sd *sd = (struct sd *) gspca_dev; | ||
| 44 | int retval = 0; | ||
| 45 | |||
| 46 | for (i = 0; i < gspca_dev->sd_desc->nctrls; i++) { | ||
| 47 | if (gspca_dev->ctrl_dis & (1 << i)) | ||
| 48 | continue; | ||
| 49 | if (gspca_dev->sd_desc->ctrls[i].qctrl.id == V4L2_CID_GAIN) | ||
| 50 | gain_ctrl = &gspca_dev->sd_desc->ctrls[i]; | ||
| 51 | if (gspca_dev->sd_desc->ctrls[i].qctrl.id == V4L2_CID_EXPOSURE) | ||
| 52 | exposure_ctrl = &gspca_dev->sd_desc->ctrls[i]; | ||
| 53 | } | ||
| 54 | if (!gain_ctrl || !exposure_ctrl) { | ||
| 55 | PDEBUG(D_ERR, "Error: gspca_coarse_grained_expo_autogain " | ||
| 56 | "called on cam without gain or exposure"); | ||
| 57 | return 0; | ||
| 58 | } | ||
| 59 | |||
| 60 | if (gain_ctrl->get(gspca_dev, &gain) || | ||
| 61 | exposure_ctrl->get(gspca_dev, &exposure)) | ||
| 62 | return 0; | ||
| 63 | |||
| 64 | orig_gain = gain; | ||
| 65 | orig_exposure = exposure; | ||
| 66 | gain_low = | ||
| 67 | (gain_ctrl->qctrl.maximum - gain_ctrl->qctrl.minimum) / 5 * 2; | ||
| 68 | gain_low += gain_ctrl->qctrl.minimum; | ||
| 69 | gain_high = | ||
| 70 | (gain_ctrl->qctrl.maximum - gain_ctrl->qctrl.minimum) / 5 * 4; | ||
| 71 | gain_high += gain_ctrl->qctrl.minimum; | ||
| 72 | |||
| 73 | /* If we are of a multiple of deadzone, do multiple steps to reach the | ||
| 74 | desired lumination fast (with the risc of a slight overshoot) */ | ||
| 75 | steps = (desired_avg_lum - avg_lum) / deadzone; | ||
| 76 | |||
| 77 | PDEBUG(D_FRAM, "autogain: lum: %d, desired: %d, steps: %d", | ||
| 78 | avg_lum, desired_avg_lum, steps); | ||
| 79 | |||
| 80 | if ((gain + steps) > gain_high && | ||
| 81 | sd->exposure < exposure_ctrl->qctrl.maximum) { | ||
| 82 | gain = gain_high; | ||
| 83 | sd->exp_too_low_cnt++; | ||
| 84 | } else if ((gain + steps) < gain_low && | ||
| 85 | sd->exposure > exposure_ctrl->qctrl.minimum) { | ||
| 86 | gain = gain_low; | ||
| 87 | sd->exp_too_high_cnt++; | ||
| 88 | } else { | ||
| 89 | gain += steps; | ||
| 90 | if (gain > gain_ctrl->qctrl.maximum) | ||
| 91 | gain = gain_ctrl->qctrl.maximum; | ||
| 92 | else if (gain < gain_ctrl->qctrl.minimum) | ||
| 93 | gain = gain_ctrl->qctrl.minimum; | ||
| 94 | sd->exp_too_high_cnt = 0; | ||
| 95 | sd->exp_too_low_cnt = 0; | ||
| 96 | } | ||
| 97 | |||
| 98 | if (sd->exp_too_high_cnt > 3) { | ||
| 99 | exposure--; | ||
| 100 | sd->exp_too_high_cnt = 0; | ||
| 101 | } else if (sd->exp_too_low_cnt > 3) { | ||
| 102 | exposure++; | ||
| 103 | sd->exp_too_low_cnt = 0; | ||
| 104 | } | ||
| 105 | |||
| 106 | if (gain != orig_gain) { | ||
| 107 | gain_ctrl->set(gspca_dev, gain); | ||
| 108 | retval = 1; | ||
| 109 | } | ||
| 110 | if (exposure != orig_exposure) { | ||
| 111 | exposure_ctrl->set(gspca_dev, exposure); | ||
| 112 | retval = 1; | ||
| 113 | } | ||
| 114 | |||
| 115 | return retval; | ||
| 116 | } | ||
diff --git a/drivers/media/video/gspca/ov519.c b/drivers/media/video/gspca/ov519.c index 36a46fc78734..057e287b9152 100644 --- a/drivers/media/video/gspca/ov519.c +++ b/drivers/media/video/gspca/ov519.c | |||
| @@ -609,7 +609,7 @@ static const struct v4l2_pix_format ovfx2_ov3610_mode[] = { | |||
| 609 | * buffers, there are some pretty strict real time constraints for | 609 | * buffers, there are some pretty strict real time constraints for |
| 610 | * isochronous transfer for larger frame sizes). | 610 | * isochronous transfer for larger frame sizes). |
| 611 | */ | 611 | */ |
| 612 | /*jfm: this value works well for 1600x1200, but not 800x600 - see isoc_init */ | 612 | /*jfm: this value does not work for 800x600 - see isoc_init */ |
| 613 | #define OVFX2_BULK_SIZE (13 * 4096) | 613 | #define OVFX2_BULK_SIZE (13 * 4096) |
| 614 | 614 | ||
| 615 | /* I2C registers */ | 615 | /* I2C registers */ |
| @@ -3307,6 +3307,7 @@ static int sd_config(struct gspca_dev *gspca_dev, | |||
| 3307 | 3307 | ||
| 3308 | gspca_dev->cam.ctrls = sd->ctrls; | 3308 | gspca_dev->cam.ctrls = sd->ctrls; |
| 3309 | sd->quality = QUALITY_DEF; | 3309 | sd->quality = QUALITY_DEF; |
| 3310 | sd->frame_rate = 15; | ||
| 3310 | 3311 | ||
| 3311 | return 0; | 3312 | return 0; |
| 3312 | } | 3313 | } |
| @@ -3469,7 +3470,6 @@ static int sd_init(struct gspca_dev *gspca_dev) | |||
| 3469 | ARRAY_SIZE(init_519_ov7660)); | 3470 | ARRAY_SIZE(init_519_ov7660)); |
| 3470 | write_i2c_regvals(sd, norm_7660, ARRAY_SIZE(norm_7660)); | 3471 | write_i2c_regvals(sd, norm_7660, ARRAY_SIZE(norm_7660)); |
| 3471 | sd->gspca_dev.curr_mode = 1; /* 640x480 */ | 3472 | sd->gspca_dev.curr_mode = 1; /* 640x480 */ |
| 3472 | sd->frame_rate = 15; | ||
| 3473 | ov519_set_mode(sd); | 3473 | ov519_set_mode(sd); |
| 3474 | ov519_set_fr(sd); | 3474 | ov519_set_fr(sd); |
| 3475 | sd->ctrls[COLORS].max = 4; /* 0..4 */ | 3475 | sd->ctrls[COLORS].max = 4; /* 0..4 */ |
| @@ -3511,7 +3511,7 @@ static int sd_isoc_init(struct gspca_dev *gspca_dev) | |||
| 3511 | 3511 | ||
| 3512 | switch (sd->bridge) { | 3512 | switch (sd->bridge) { |
| 3513 | case BRIDGE_OVFX2: | 3513 | case BRIDGE_OVFX2: |
| 3514 | if (gspca_dev->width == 1600) | 3514 | if (gspca_dev->width != 800) |
| 3515 | gspca_dev->cam.bulk_size = OVFX2_BULK_SIZE; | 3515 | gspca_dev->cam.bulk_size = OVFX2_BULK_SIZE; |
| 3516 | else | 3516 | else |
| 3517 | gspca_dev->cam.bulk_size = 7 * 4096; | 3517 | gspca_dev->cam.bulk_size = 7 * 4096; |
| @@ -4478,7 +4478,7 @@ static void ovfx2_pkt_scan(struct gspca_dev *gspca_dev, | |||
| 4478 | gspca_frame_add(gspca_dev, INTER_PACKET, data, len); | 4478 | gspca_frame_add(gspca_dev, INTER_PACKET, data, len); |
| 4479 | 4479 | ||
| 4480 | /* A short read signals EOF */ | 4480 | /* A short read signals EOF */ |
| 4481 | if (len < OVFX2_BULK_SIZE) { | 4481 | if (len < gspca_dev->cam.bulk_size) { |
| 4482 | /* If the frame is short, and it is one of the first ones | 4482 | /* If the frame is short, and it is one of the first ones |
| 4483 | the sensor and bridge are still syncing, so drop it. */ | 4483 | the sensor and bridge are still syncing, so drop it. */ |
| 4484 | if (sd->first_frame) { | 4484 | if (sd->first_frame) { |
diff --git a/drivers/media/video/gspca/sonixj.c b/drivers/media/video/gspca/sonixj.c index 6415aff5cbd1..81b8a600783b 100644 --- a/drivers/media/video/gspca/sonixj.c +++ b/drivers/media/video/gspca/sonixj.c | |||
| @@ -60,7 +60,7 @@ struct sd { | |||
| 60 | 60 | ||
| 61 | u32 pktsz; /* (used by pkt_scan) */ | 61 | u32 pktsz; /* (used by pkt_scan) */ |
| 62 | u16 npkt; | 62 | u16 npkt; |
| 63 | u8 nchg; | 63 | s8 nchg; |
| 64 | s8 short_mark; | 64 | s8 short_mark; |
| 65 | 65 | ||
| 66 | u8 quality; /* image quality */ | 66 | u8 quality; /* image quality */ |
diff --git a/drivers/media/video/gspca/stv06xx/stv06xx_hdcs.h b/drivers/media/video/gspca/stv06xx/stv06xx_hdcs.h index b538dce96f78..a14a84a5079b 100644 --- a/drivers/media/video/gspca/stv06xx/stv06xx_hdcs.h +++ b/drivers/media/video/gspca/stv06xx/stv06xx_hdcs.h | |||
| @@ -125,7 +125,7 @@ | |||
| 125 | #define HDCS_SLEEP_MODE (1 << 1) | 125 | #define HDCS_SLEEP_MODE (1 << 1) |
| 126 | 126 | ||
| 127 | #define HDCS_DEFAULT_EXPOSURE 48 | 127 | #define HDCS_DEFAULT_EXPOSURE 48 |
| 128 | #define HDCS_DEFAULT_GAIN 128 | 128 | #define HDCS_DEFAULT_GAIN 50 |
| 129 | 129 | ||
| 130 | static int hdcs_probe_1x00(struct sd *sd); | 130 | static int hdcs_probe_1x00(struct sd *sd); |
| 131 | static int hdcs_probe_1020(struct sd *sd); | 131 | static int hdcs_probe_1020(struct sd *sd); |
diff --git a/drivers/media/video/ivtv/ivtv-driver.c b/drivers/media/video/ivtv/ivtv-driver.c index a4e4dfdbc2f2..0fb75524484d 100644 --- a/drivers/media/video/ivtv/ivtv-driver.c +++ b/drivers/media/video/ivtv/ivtv-driver.c | |||
| @@ -1328,6 +1328,8 @@ int ivtv_init_on_first_open(struct ivtv *itv) | |||
| 1328 | if (!itv->has_cx23415) | 1328 | if (!itv->has_cx23415) |
| 1329 | write_reg_sync(0x03, IVTV_REG_DMACONTROL); | 1329 | write_reg_sync(0x03, IVTV_REG_DMACONTROL); |
| 1330 | 1330 | ||
| 1331 | ivtv_s_std_enc(itv, &itv->tuner_std); | ||
| 1332 | |||
| 1331 | /* Default interrupts enabled. For the PVR350 this includes the | 1333 | /* Default interrupts enabled. For the PVR350 this includes the |
| 1332 | decoder VSYNC interrupt, which is always on. It is not only used | 1334 | decoder VSYNC interrupt, which is always on. It is not only used |
| 1333 | during decoding but also by the OSD. | 1335 | during decoding but also by the OSD. |
| @@ -1336,12 +1338,10 @@ int ivtv_init_on_first_open(struct ivtv *itv) | |||
| 1336 | if (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT) { | 1338 | if (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT) { |
| 1337 | ivtv_clear_irq_mask(itv, IVTV_IRQ_MASK_INIT | IVTV_IRQ_DEC_VSYNC); | 1339 | ivtv_clear_irq_mask(itv, IVTV_IRQ_MASK_INIT | IVTV_IRQ_DEC_VSYNC); |
| 1338 | ivtv_set_osd_alpha(itv); | 1340 | ivtv_set_osd_alpha(itv); |
| 1339 | } | 1341 | ivtv_s_std_dec(itv, &itv->tuner_std); |
| 1340 | else | 1342 | } else { |
| 1341 | ivtv_clear_irq_mask(itv, IVTV_IRQ_MASK_INIT); | 1343 | ivtv_clear_irq_mask(itv, IVTV_IRQ_MASK_INIT); |
| 1342 | 1344 | } | |
| 1343 | /* For cards with video out, this call needs interrupts enabled */ | ||
| 1344 | ivtv_s_std(NULL, &fh, &itv->tuner_std); | ||
| 1345 | 1345 | ||
| 1346 | /* Setup initial controls */ | 1346 | /* Setup initial controls */ |
| 1347 | cx2341x_handler_setup(&itv->cxhdl); | 1347 | cx2341x_handler_setup(&itv->cxhdl); |
diff --git a/drivers/media/video/ivtv/ivtv-firmware.c b/drivers/media/video/ivtv/ivtv-firmware.c index 14a1cea1d70d..02c5adebf517 100644 --- a/drivers/media/video/ivtv/ivtv-firmware.c +++ b/drivers/media/video/ivtv/ivtv-firmware.c | |||
| @@ -280,8 +280,6 @@ int ivtv_firmware_restart(struct ivtv *itv) | |||
| 280 | { | 280 | { |
| 281 | int rc = 0; | 281 | int rc = 0; |
| 282 | v4l2_std_id std; | 282 | v4l2_std_id std; |
| 283 | struct ivtv_open_id fh; | ||
| 284 | fh.itv = itv; | ||
| 285 | 283 | ||
| 286 | if (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT) | 284 | if (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT) |
| 287 | /* Display test image during restart */ | 285 | /* Display test image during restart */ |
| @@ -301,14 +299,19 @@ int ivtv_firmware_restart(struct ivtv *itv) | |||
| 301 | /* Allow settings to reload */ | 299 | /* Allow settings to reload */ |
| 302 | ivtv_mailbox_cache_invalidate(itv); | 300 | ivtv_mailbox_cache_invalidate(itv); |
| 303 | 301 | ||
| 304 | /* Restore video standard */ | 302 | /* Restore encoder video standard */ |
| 305 | std = itv->std; | 303 | std = itv->std; |
| 306 | itv->std = 0; | 304 | itv->std = 0; |
| 307 | ivtv_s_std(NULL, &fh, &std); | 305 | ivtv_s_std_enc(itv, &std); |
| 308 | 306 | ||
| 309 | if (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT) { | 307 | if (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT) { |
| 310 | ivtv_init_mpeg_decoder(itv); | 308 | ivtv_init_mpeg_decoder(itv); |
| 311 | 309 | ||
| 310 | /* Restore decoder video standard */ | ||
| 311 | std = itv->std_out; | ||
| 312 | itv->std_out = 0; | ||
| 313 | ivtv_s_std_dec(itv, &std); | ||
| 314 | |||
| 312 | /* Restore framebuffer if active */ | 315 | /* Restore framebuffer if active */ |
| 313 | if (itv->ivtvfb_restore) | 316 | if (itv->ivtvfb_restore) |
| 314 | itv->ivtvfb_restore(itv); | 317 | itv->ivtvfb_restore(itv); |
diff --git a/drivers/media/video/ivtv/ivtv-ioctl.c b/drivers/media/video/ivtv/ivtv-ioctl.c index 1689783cd19a..f9e347dae739 100644 --- a/drivers/media/video/ivtv/ivtv-ioctl.c +++ b/drivers/media/video/ivtv/ivtv-ioctl.c | |||
| @@ -1071,28 +1071,8 @@ static int ivtv_g_std(struct file *file, void *fh, v4l2_std_id *std) | |||
| 1071 | return 0; | 1071 | return 0; |
| 1072 | } | 1072 | } |
| 1073 | 1073 | ||
| 1074 | int ivtv_s_std(struct file *file, void *fh, v4l2_std_id *std) | 1074 | void ivtv_s_std_enc(struct ivtv *itv, v4l2_std_id *std) |
| 1075 | { | 1075 | { |
| 1076 | DEFINE_WAIT(wait); | ||
| 1077 | struct ivtv *itv = fh2id(fh)->itv; | ||
| 1078 | struct yuv_playback_info *yi = &itv->yuv_info; | ||
| 1079 | int f; | ||
| 1080 | |||
| 1081 | if ((*std & V4L2_STD_ALL) == 0) | ||
| 1082 | return -EINVAL; | ||
| 1083 | |||
| 1084 | if (*std == itv->std) | ||
| 1085 | return 0; | ||
| 1086 | |||
| 1087 | if (test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags) || | ||
| 1088 | atomic_read(&itv->capturing) > 0 || | ||
| 1089 | atomic_read(&itv->decoding) > 0) { | ||
| 1090 | /* Switching standard would turn off the radio or mess | ||
| 1091 | with already running streams, prevent that by | ||
| 1092 | returning EBUSY. */ | ||
| 1093 | return -EBUSY; | ||
| 1094 | } | ||
| 1095 | |||
| 1096 | itv->std = *std; | 1076 | itv->std = *std; |
| 1097 | itv->is_60hz = (*std & V4L2_STD_525_60) ? 1 : 0; | 1077 | itv->is_60hz = (*std & V4L2_STD_525_60) ? 1 : 0; |
| 1098 | itv->is_50hz = !itv->is_60hz; | 1078 | itv->is_50hz = !itv->is_60hz; |
| @@ -1106,48 +1086,79 @@ int ivtv_s_std(struct file *file, void *fh, v4l2_std_id *std) | |||
| 1106 | if (itv->hw_flags & IVTV_HW_CX25840) | 1086 | if (itv->hw_flags & IVTV_HW_CX25840) |
| 1107 | itv->vbi.sliced_decoder_line_size = itv->is_60hz ? 272 : 284; | 1087 | itv->vbi.sliced_decoder_line_size = itv->is_60hz ? 272 : 284; |
| 1108 | 1088 | ||
| 1109 | IVTV_DEBUG_INFO("Switching standard to %llx.\n", (unsigned long long)itv->std); | ||
| 1110 | |||
| 1111 | /* Tuner */ | 1089 | /* Tuner */ |
| 1112 | ivtv_call_all(itv, core, s_std, itv->std); | 1090 | ivtv_call_all(itv, core, s_std, itv->std); |
| 1091 | } | ||
| 1113 | 1092 | ||
| 1114 | if (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT) { | 1093 | void ivtv_s_std_dec(struct ivtv *itv, v4l2_std_id *std) |
| 1115 | /* set display standard */ | 1094 | { |
| 1116 | itv->std_out = *std; | 1095 | struct yuv_playback_info *yi = &itv->yuv_info; |
| 1117 | itv->is_out_60hz = itv->is_60hz; | 1096 | DEFINE_WAIT(wait); |
| 1118 | itv->is_out_50hz = itv->is_50hz; | 1097 | int f; |
| 1119 | ivtv_call_all(itv, video, s_std_output, itv->std_out); | 1098 | |
| 1120 | 1099 | /* set display standard */ | |
| 1121 | /* | 1100 | itv->std_out = *std; |
| 1122 | * The next firmware call is time sensitive. Time it to | 1101 | itv->is_out_60hz = (*std & V4L2_STD_525_60) ? 1 : 0; |
| 1123 | * avoid risk of a hard lock, by trying to ensure the call | 1102 | itv->is_out_50hz = !itv->is_out_60hz; |
| 1124 | * happens within the first 100 lines of the top field. | 1103 | ivtv_call_all(itv, video, s_std_output, itv->std_out); |
| 1125 | * Make 4 attempts to sync to the decoder before giving up. | 1104 | |
| 1126 | */ | 1105 | /* |
| 1127 | for (f = 0; f < 4; f++) { | 1106 | * The next firmware call is time sensitive. Time it to |
| 1128 | prepare_to_wait(&itv->vsync_waitq, &wait, | 1107 | * avoid risk of a hard lock, by trying to ensure the call |
| 1129 | TASK_UNINTERRUPTIBLE); | 1108 | * happens within the first 100 lines of the top field. |
| 1130 | if ((read_reg(IVTV_REG_DEC_LINE_FIELD) >> 16) < 100) | 1109 | * Make 4 attempts to sync to the decoder before giving up. |
| 1131 | break; | 1110 | */ |
| 1132 | schedule_timeout(msecs_to_jiffies(25)); | 1111 | for (f = 0; f < 4; f++) { |
| 1133 | } | 1112 | prepare_to_wait(&itv->vsync_waitq, &wait, |
| 1134 | finish_wait(&itv->vsync_waitq, &wait); | 1113 | TASK_UNINTERRUPTIBLE); |
| 1135 | 1114 | if ((read_reg(IVTV_REG_DEC_LINE_FIELD) >> 16) < 100) | |
| 1136 | if (f == 4) | 1115 | break; |
| 1137 | IVTV_WARN("Mode change failed to sync to decoder\n"); | 1116 | schedule_timeout(msecs_to_jiffies(25)); |
| 1138 | |||
| 1139 | ivtv_vapi(itv, CX2341X_DEC_SET_STANDARD, 1, itv->is_out_50hz); | ||
| 1140 | itv->main_rect.left = itv->main_rect.top = 0; | ||
| 1141 | itv->main_rect.width = 720; | ||
| 1142 | itv->main_rect.height = itv->cxhdl.height; | ||
| 1143 | ivtv_vapi(itv, CX2341X_OSD_SET_FRAMEBUFFER_WINDOW, 4, | ||
| 1144 | 720, itv->main_rect.height, 0, 0); | ||
| 1145 | yi->main_rect = itv->main_rect; | ||
| 1146 | if (!itv->osd_info) { | ||
| 1147 | yi->osd_full_w = 720; | ||
| 1148 | yi->osd_full_h = itv->is_out_50hz ? 576 : 480; | ||
| 1149 | } | ||
| 1150 | } | 1117 | } |
| 1118 | finish_wait(&itv->vsync_waitq, &wait); | ||
| 1119 | |||
| 1120 | if (f == 4) | ||
| 1121 | IVTV_WARN("Mode change failed to sync to decoder\n"); | ||
| 1122 | |||
| 1123 | ivtv_vapi(itv, CX2341X_DEC_SET_STANDARD, 1, itv->is_out_50hz); | ||
| 1124 | itv->main_rect.left = 0; | ||
| 1125 | itv->main_rect.top = 0; | ||
| 1126 | itv->main_rect.width = 720; | ||
| 1127 | itv->main_rect.height = itv->is_out_50hz ? 576 : 480; | ||
| 1128 | ivtv_vapi(itv, CX2341X_OSD_SET_FRAMEBUFFER_WINDOW, 4, | ||
| 1129 | 720, itv->main_rect.height, 0, 0); | ||
| 1130 | yi->main_rect = itv->main_rect; | ||
| 1131 | if (!itv->osd_info) { | ||
| 1132 | yi->osd_full_w = 720; | ||
| 1133 | yi->osd_full_h = itv->is_out_50hz ? 576 : 480; | ||
| 1134 | } | ||
| 1135 | } | ||
| 1136 | |||
| 1137 | int ivtv_s_std(struct file *file, void *fh, v4l2_std_id *std) | ||
| 1138 | { | ||
| 1139 | struct ivtv *itv = fh2id(fh)->itv; | ||
| 1140 | |||
| 1141 | if ((*std & V4L2_STD_ALL) == 0) | ||
| 1142 | return -EINVAL; | ||
| 1143 | |||
| 1144 | if (*std == itv->std) | ||
| 1145 | return 0; | ||
| 1146 | |||
| 1147 | if (test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags) || | ||
| 1148 | atomic_read(&itv->capturing) > 0 || | ||
| 1149 | atomic_read(&itv->decoding) > 0) { | ||
| 1150 | /* Switching standard would mess with already running | ||
| 1151 | streams, prevent that by returning EBUSY. */ | ||
| 1152 | return -EBUSY; | ||
| 1153 | } | ||
| 1154 | |||
| 1155 | IVTV_DEBUG_INFO("Switching standard to %llx.\n", | ||
| 1156 | (unsigned long long)itv->std); | ||
| 1157 | |||
| 1158 | ivtv_s_std_enc(itv, std); | ||
| 1159 | if (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT) | ||
| 1160 | ivtv_s_std_dec(itv, std); | ||
| 1161 | |||
| 1151 | return 0; | 1162 | return 0; |
| 1152 | } | 1163 | } |
| 1153 | 1164 | ||
diff --git a/drivers/media/video/ivtv/ivtv-ioctl.h b/drivers/media/video/ivtv/ivtv-ioctl.h index 58f003412afd..89185caeafae 100644 --- a/drivers/media/video/ivtv/ivtv-ioctl.h +++ b/drivers/media/video/ivtv/ivtv-ioctl.h | |||
| @@ -27,7 +27,8 @@ u16 ivtv_get_service_set(struct v4l2_sliced_vbi_format *fmt); | |||
| 27 | void ivtv_set_osd_alpha(struct ivtv *itv); | 27 | void ivtv_set_osd_alpha(struct ivtv *itv); |
| 28 | int ivtv_set_speed(struct ivtv *itv, int speed); | 28 | int ivtv_set_speed(struct ivtv *itv, int speed); |
| 29 | void ivtv_set_funcs(struct video_device *vdev); | 29 | void ivtv_set_funcs(struct video_device *vdev); |
| 30 | int ivtv_s_std(struct file *file, void *fh, v4l2_std_id *std); | 30 | void ivtv_s_std_enc(struct ivtv *itv, v4l2_std_id *std); |
| 31 | void ivtv_s_std_dec(struct ivtv *itv, v4l2_std_id *std); | ||
| 31 | int ivtv_s_frequency(struct file *file, void *fh, struct v4l2_frequency *vf); | 32 | int ivtv_s_frequency(struct file *file, void *fh, struct v4l2_frequency *vf); |
| 32 | int ivtv_s_input(struct file *file, void *fh, unsigned int inp); | 33 | int ivtv_s_input(struct file *file, void *fh, unsigned int inp); |
| 33 | long ivtv_v4l2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg); | 34 | long ivtv_v4l2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg); |
diff --git a/drivers/media/video/ivtv/ivtv-streams.c b/drivers/media/video/ivtv/ivtv-streams.c index 942683336555..e7794dc1330e 100644 --- a/drivers/media/video/ivtv/ivtv-streams.c +++ b/drivers/media/video/ivtv/ivtv-streams.c | |||
| @@ -589,7 +589,7 @@ int ivtv_start_v4l2_encode_stream(struct ivtv_stream *s) | |||
| 589 | v4l2_subdev_call(itv->sd_audio, audio, s_stream, 1); | 589 | v4l2_subdev_call(itv->sd_audio, audio, s_stream, 1); |
| 590 | /* Avoid unpredictable PCI bus hang - disable video clocks */ | 590 | /* Avoid unpredictable PCI bus hang - disable video clocks */ |
| 591 | v4l2_subdev_call(itv->sd_video, video, s_stream, 0); | 591 | v4l2_subdev_call(itv->sd_video, video, s_stream, 0); |
| 592 | ivtv_msleep_timeout(300, 1); | 592 | ivtv_msleep_timeout(300, 0); |
| 593 | ivtv_vapi(itv, CX2341X_ENC_INITIALIZE_INPUT, 0); | 593 | ivtv_vapi(itv, CX2341X_ENC_INITIALIZE_INPUT, 0); |
| 594 | v4l2_subdev_call(itv->sd_video, video, s_stream, 1); | 594 | v4l2_subdev_call(itv->sd_video, video, s_stream, 1); |
| 595 | } | 595 | } |
| @@ -834,7 +834,7 @@ int ivtv_stop_v4l2_encode_stream(struct ivtv_stream *s, int gop_end) | |||
| 834 | } | 834 | } |
| 835 | 835 | ||
| 836 | /* Handle any pending interrupts */ | 836 | /* Handle any pending interrupts */ |
| 837 | ivtv_msleep_timeout(100, 1); | 837 | ivtv_msleep_timeout(100, 0); |
| 838 | } | 838 | } |
| 839 | 839 | ||
| 840 | atomic_dec(&itv->capturing); | 840 | atomic_dec(&itv->capturing); |
diff --git a/drivers/media/video/ivtv/ivtv-vbi.c b/drivers/media/video/ivtv/ivtv-vbi.c index b6eb51ce7735..293db806d936 100644 --- a/drivers/media/video/ivtv/ivtv-vbi.c +++ b/drivers/media/video/ivtv/ivtv-vbi.c | |||
| @@ -71,7 +71,7 @@ static void ivtv_set_wss(struct ivtv *itv, int enabled, int mode) | |||
| 71 | Turning this signal on and off can confuse certain | 71 | Turning this signal on and off can confuse certain |
| 72 | TVs. As far as I can tell there is no reason not to | 72 | TVs. As far as I can tell there is no reason not to |
| 73 | transmit this signal. */ | 73 | transmit this signal. */ |
| 74 | if ((itv->std & V4L2_STD_625_50) && !enabled) { | 74 | if ((itv->std_out & V4L2_STD_625_50) && !enabled) { |
| 75 | enabled = 1; | 75 | enabled = 1; |
| 76 | mode = 0x08; /* 4x3 full format */ | 76 | mode = 0x08; /* 4x3 full format */ |
| 77 | } | 77 | } |
diff --git a/drivers/media/video/ivtv/ivtvfb.c b/drivers/media/video/ivtv/ivtvfb.c index 17247451c693..6b7c9c823330 100644 --- a/drivers/media/video/ivtv/ivtvfb.c +++ b/drivers/media/video/ivtv/ivtvfb.c | |||
| @@ -247,7 +247,7 @@ static int ivtvfb_set_osd_coords(struct ivtv *itv, const struct ivtv_osd_coords | |||
| 247 | 247 | ||
| 248 | static int ivtvfb_set_display_window(struct ivtv *itv, struct v4l2_rect *ivtv_window) | 248 | static int ivtvfb_set_display_window(struct ivtv *itv, struct v4l2_rect *ivtv_window) |
| 249 | { | 249 | { |
| 250 | int osd_height_limit = itv->is_50hz ? 576 : 480; | 250 | int osd_height_limit = itv->is_out_50hz ? 576 : 480; |
| 251 | 251 | ||
| 252 | /* Only fail if resolution too high, otherwise fudge the start coords. */ | 252 | /* Only fail if resolution too high, otherwise fudge the start coords. */ |
| 253 | if ((ivtv_window->height > osd_height_limit) || (ivtv_window->width > IVTV_OSD_MAX_WIDTH)) | 253 | if ((ivtv_window->height > osd_height_limit) || (ivtv_window->width > IVTV_OSD_MAX_WIDTH)) |
| @@ -471,9 +471,9 @@ static int ivtvfb_ioctl(struct fb_info *info, unsigned int cmd, unsigned long ar | |||
| 471 | vblank.flags = FB_VBLANK_HAVE_COUNT |FB_VBLANK_HAVE_VCOUNT | | 471 | vblank.flags = FB_VBLANK_HAVE_COUNT |FB_VBLANK_HAVE_VCOUNT | |
| 472 | FB_VBLANK_HAVE_VSYNC; | 472 | FB_VBLANK_HAVE_VSYNC; |
| 473 | trace = read_reg(IVTV_REG_DEC_LINE_FIELD) >> 16; | 473 | trace = read_reg(IVTV_REG_DEC_LINE_FIELD) >> 16; |
| 474 | if (itv->is_50hz && trace > 312) | 474 | if (itv->is_out_50hz && trace > 312) |
| 475 | trace -= 312; | 475 | trace -= 312; |
| 476 | else if (itv->is_60hz && trace > 262) | 476 | else if (itv->is_out_60hz && trace > 262) |
| 477 | trace -= 262; | 477 | trace -= 262; |
| 478 | if (trace == 1) | 478 | if (trace == 1) |
| 479 | vblank.flags |= FB_VBLANK_VSYNCING; | 479 | vblank.flags |= FB_VBLANK_VSYNCING; |
| @@ -656,7 +656,7 @@ static int _ivtvfb_check_var(struct fb_var_screeninfo *var, struct ivtv *itv) | |||
| 656 | IVTVFB_DEBUG_INFO("ivtvfb_check_var\n"); | 656 | IVTVFB_DEBUG_INFO("ivtvfb_check_var\n"); |
| 657 | 657 | ||
| 658 | /* Set base references for mode calcs. */ | 658 | /* Set base references for mode calcs. */ |
| 659 | if (itv->is_50hz) { | 659 | if (itv->is_out_50hz) { |
| 660 | pixclock = 84316; | 660 | pixclock = 84316; |
| 661 | hlimit = 776; | 661 | hlimit = 776; |
| 662 | vlimit = 591; | 662 | vlimit = 591; |
| @@ -784,12 +784,12 @@ static int _ivtvfb_check_var(struct fb_var_screeninfo *var, struct ivtv *itv) | |||
| 784 | If the margins are too large, just center the screen | 784 | If the margins are too large, just center the screen |
| 785 | (enforcing margins causes too many problems) */ | 785 | (enforcing margins causes too many problems) */ |
| 786 | 786 | ||
| 787 | if (var->left_margin + var->xres > IVTV_OSD_MAX_WIDTH + 1) { | 787 | if (var->left_margin + var->xres > IVTV_OSD_MAX_WIDTH + 1) |
| 788 | var->left_margin = 1 + ((IVTV_OSD_MAX_WIDTH - var->xres) / 2); | 788 | var->left_margin = 1 + ((IVTV_OSD_MAX_WIDTH - var->xres) / 2); |
| 789 | } | 789 | |
| 790 | if (var->upper_margin + var->yres > (itv->is_50hz ? 577 : 481)) { | 790 | if (var->upper_margin + var->yres > (itv->is_out_50hz ? 577 : 481)) |
| 791 | var->upper_margin = 1 + (((itv->is_50hz ? 576 : 480) - var->yres) / 2); | 791 | var->upper_margin = 1 + (((itv->is_out_50hz ? 576 : 480) - |
| 792 | } | 792 | var->yres) / 2); |
| 793 | 793 | ||
| 794 | /* Maintain overall 'size' for a constant refresh rate */ | 794 | /* Maintain overall 'size' for a constant refresh rate */ |
| 795 | var->right_margin = hlimit - var->left_margin - var->xres; | 795 | var->right_margin = hlimit - var->left_margin - var->xres; |
| @@ -836,7 +836,12 @@ static int ivtvfb_pan_display(struct fb_var_screeninfo *var, struct fb_info *inf | |||
| 836 | u32 osd_pan_index; | 836 | u32 osd_pan_index; |
| 837 | struct ivtv *itv = (struct ivtv *) info->par; | 837 | struct ivtv *itv = (struct ivtv *) info->par; |
| 838 | 838 | ||
| 839 | osd_pan_index = (var->xoffset + (var->yoffset * var->xres_virtual))*var->bits_per_pixel/8; | 839 | if (var->yoffset + info->var.yres > info->var.yres_virtual || |
| 840 | var->xoffset + info->var.xres > info->var.xres_virtual) | ||
| 841 | return -EINVAL; | ||
| 842 | |||
| 843 | osd_pan_index = var->yoffset * info->fix.line_length | ||
| 844 | + var->xoffset * info->var.bits_per_pixel / 8; | ||
| 840 | write_reg(osd_pan_index, 0x02A0C); | 845 | write_reg(osd_pan_index, 0x02A0C); |
| 841 | 846 | ||
| 842 | /* Pass this info back the yuv handler */ | 847 | /* Pass this info back the yuv handler */ |
| @@ -1003,19 +1008,21 @@ static int ivtvfb_init_vidmode(struct ivtv *itv) | |||
| 1003 | /* Hardware coords start at 0, user coords start at 1. */ | 1008 | /* Hardware coords start at 0, user coords start at 1. */ |
| 1004 | osd_left--; | 1009 | osd_left--; |
| 1005 | 1010 | ||
| 1006 | start_window.left = osd_left >= 0 ? osd_left : ((IVTV_OSD_MAX_WIDTH - start_window.width) / 2); | 1011 | start_window.left = osd_left >= 0 ? |
| 1012 | osd_left : ((IVTV_OSD_MAX_WIDTH - start_window.width) / 2); | ||
| 1007 | 1013 | ||
| 1008 | oi->display_byte_stride = | 1014 | oi->display_byte_stride = |
| 1009 | start_window.width * oi->bytes_per_pixel; | 1015 | start_window.width * oi->bytes_per_pixel; |
| 1010 | 1016 | ||
| 1011 | /* Vertical size & position */ | 1017 | /* Vertical size & position */ |
| 1012 | 1018 | ||
| 1013 | max_height = itv->is_50hz ? 576 : 480; | 1019 | max_height = itv->is_out_50hz ? 576 : 480; |
| 1014 | 1020 | ||
| 1015 | if (osd_yres > max_height) | 1021 | if (osd_yres > max_height) |
| 1016 | osd_yres = max_height; | 1022 | osd_yres = max_height; |
| 1017 | 1023 | ||
| 1018 | start_window.height = osd_yres ? osd_yres : itv->is_50hz ? 480 : 400; | 1024 | start_window.height = osd_yres ? |
| 1025 | osd_yres : itv->is_out_50hz ? 480 : 400; | ||
| 1019 | 1026 | ||
| 1020 | /* Check vertical start (osd_upper). */ | 1027 | /* Check vertical start (osd_upper). */ |
| 1021 | if (osd_upper + start_window.height > max_height + 1) { | 1028 | if (osd_upper + start_window.height > max_height + 1) { |
diff --git a/drivers/media/video/omap3isp/isp.c b/drivers/media/video/omap3isp/isp.c index 472a69359e60..c9fd04ee70a8 100644 --- a/drivers/media/video/omap3isp/isp.c +++ b/drivers/media/video/omap3isp/isp.c | |||
| @@ -391,7 +391,7 @@ static inline void isp_isr_dbg(struct isp_device *isp, u32 irqstatus) | |||
| 391 | }; | 391 | }; |
| 392 | int i; | 392 | int i; |
| 393 | 393 | ||
| 394 | dev_dbg(isp->dev, ""); | 394 | dev_dbg(isp->dev, "ISP IRQ: "); |
| 395 | 395 | ||
| 396 | for (i = 0; i < ARRAY_SIZE(name); i++) { | 396 | for (i = 0; i < ARRAY_SIZE(name); i++) { |
| 397 | if ((1 << i) & irqstatus) | 397 | if ((1 << i) & irqstatus) |
diff --git a/drivers/media/video/soc_camera.c b/drivers/media/video/soc_camera.c index 398864370267..4e4d4122d9a6 100644 --- a/drivers/media/video/soc_camera.c +++ b/drivers/media/video/soc_camera.c | |||
| @@ -1512,7 +1512,7 @@ static int video_dev_create(struct soc_camera_device *icd) | |||
| 1512 | */ | 1512 | */ |
| 1513 | static int soc_camera_video_start(struct soc_camera_device *icd) | 1513 | static int soc_camera_video_start(struct soc_camera_device *icd) |
| 1514 | { | 1514 | { |
| 1515 | struct device_type *type = icd->vdev->dev.type; | 1515 | const struct device_type *type = icd->vdev->dev.type; |
| 1516 | int ret; | 1516 | int ret; |
| 1517 | 1517 | ||
| 1518 | if (!icd->dev.parent) | 1518 | if (!icd->dev.parent) |
diff --git a/drivers/media/video/uvc/uvc_entity.c b/drivers/media/video/uvc/uvc_entity.c index ede7852bb1df..c3ab0c813be2 100644 --- a/drivers/media/video/uvc/uvc_entity.c +++ b/drivers/media/video/uvc/uvc_entity.c | |||
| @@ -30,7 +30,7 @@ static int uvc_mc_register_entity(struct uvc_video_chain *chain, | |||
| 30 | struct uvc_entity *remote; | 30 | struct uvc_entity *remote; |
| 31 | unsigned int i; | 31 | unsigned int i; |
| 32 | u8 remote_pad; | 32 | u8 remote_pad; |
| 33 | int ret; | 33 | int ret = 0; |
| 34 | 34 | ||
| 35 | for (i = 0; i < entity->num_pads; ++i) { | 35 | for (i = 0; i < entity->num_pads; ++i) { |
| 36 | struct media_entity *source; | 36 | struct media_entity *source; |
diff --git a/drivers/net/arm/am79c961a.c b/drivers/net/arm/am79c961a.c index 0c9217f48b72..7b3e23f38913 100644 --- a/drivers/net/arm/am79c961a.c +++ b/drivers/net/arm/am79c961a.c | |||
| @@ -50,7 +50,7 @@ static const char version[] = | |||
| 50 | #ifdef __arm__ | 50 | #ifdef __arm__ |
| 51 | static void write_rreg(u_long base, u_int reg, u_int val) | 51 | static void write_rreg(u_long base, u_int reg, u_int val) |
| 52 | { | 52 | { |
| 53 | __asm__( | 53 | asm volatile( |
| 54 | "str%?h %1, [%2] @ NET_RAP\n\t" | 54 | "str%?h %1, [%2] @ NET_RAP\n\t" |
| 55 | "str%?h %0, [%2, #-4] @ NET_RDP" | 55 | "str%?h %0, [%2, #-4] @ NET_RDP" |
| 56 | : | 56 | : |
| @@ -60,7 +60,7 @@ static void write_rreg(u_long base, u_int reg, u_int val) | |||
| 60 | static inline unsigned short read_rreg(u_long base_addr, u_int reg) | 60 | static inline unsigned short read_rreg(u_long base_addr, u_int reg) |
| 61 | { | 61 | { |
| 62 | unsigned short v; | 62 | unsigned short v; |
| 63 | __asm__( | 63 | asm volatile( |
| 64 | "str%?h %1, [%2] @ NET_RAP\n\t" | 64 | "str%?h %1, [%2] @ NET_RAP\n\t" |
| 65 | "ldr%?h %0, [%2, #-4] @ NET_RDP" | 65 | "ldr%?h %0, [%2, #-4] @ NET_RDP" |
| 66 | : "=r" (v) | 66 | : "=r" (v) |
| @@ -70,7 +70,7 @@ static inline unsigned short read_rreg(u_long base_addr, u_int reg) | |||
| 70 | 70 | ||
| 71 | static inline void write_ireg(u_long base, u_int reg, u_int val) | 71 | static inline void write_ireg(u_long base, u_int reg, u_int val) |
| 72 | { | 72 | { |
| 73 | __asm__( | 73 | asm volatile( |
| 74 | "str%?h %1, [%2] @ NET_RAP\n\t" | 74 | "str%?h %1, [%2] @ NET_RAP\n\t" |
| 75 | "str%?h %0, [%2, #8] @ NET_IDP" | 75 | "str%?h %0, [%2, #8] @ NET_IDP" |
| 76 | : | 76 | : |
| @@ -80,7 +80,7 @@ static inline void write_ireg(u_long base, u_int reg, u_int val) | |||
| 80 | static inline unsigned short read_ireg(u_long base_addr, u_int reg) | 80 | static inline unsigned short read_ireg(u_long base_addr, u_int reg) |
| 81 | { | 81 | { |
| 82 | u_short v; | 82 | u_short v; |
| 83 | __asm__( | 83 | asm volatile( |
| 84 | "str%?h %1, [%2] @ NAT_RAP\n\t" | 84 | "str%?h %1, [%2] @ NAT_RAP\n\t" |
| 85 | "ldr%?h %0, [%2, #8] @ NET_IDP\n\t" | 85 | "ldr%?h %0, [%2, #8] @ NET_IDP\n\t" |
| 86 | : "=r" (v) | 86 | : "=r" (v) |
| @@ -91,47 +91,48 @@ static inline unsigned short read_ireg(u_long base_addr, u_int reg) | |||
| 91 | #define am_writeword(dev,off,val) __raw_writew(val, ISAMEM_BASE + ((off) << 1)) | 91 | #define am_writeword(dev,off,val) __raw_writew(val, ISAMEM_BASE + ((off) << 1)) |
| 92 | #define am_readword(dev,off) __raw_readw(ISAMEM_BASE + ((off) << 1)) | 92 | #define am_readword(dev,off) __raw_readw(ISAMEM_BASE + ((off) << 1)) |
| 93 | 93 | ||
| 94 | static inline void | 94 | static void |
| 95 | am_writebuffer(struct net_device *dev, u_int offset, unsigned char *buf, unsigned int length) | 95 | am_writebuffer(struct net_device *dev, u_int offset, unsigned char *buf, unsigned int length) |
| 96 | { | 96 | { |
| 97 | offset = ISAMEM_BASE + (offset << 1); | 97 | offset = ISAMEM_BASE + (offset << 1); |
| 98 | length = (length + 1) & ~1; | 98 | length = (length + 1) & ~1; |
| 99 | if ((int)buf & 2) { | 99 | if ((int)buf & 2) { |
| 100 | __asm__ __volatile__("str%?h %2, [%0], #4" | 100 | asm volatile("str%?h %2, [%0], #4" |
| 101 | : "=&r" (offset) : "0" (offset), "r" (buf[0] | (buf[1] << 8))); | 101 | : "=&r" (offset) : "0" (offset), "r" (buf[0] | (buf[1] << 8))); |
| 102 | buf += 2; | 102 | buf += 2; |
| 103 | length -= 2; | 103 | length -= 2; |
| 104 | } | 104 | } |
| 105 | while (length > 8) { | 105 | while (length > 8) { |
| 106 | unsigned int tmp, tmp2; | 106 | register unsigned int tmp asm("r2"), tmp2 asm("r3"); |
| 107 | __asm__ __volatile__( | 107 | asm volatile( |
| 108 | "ldm%?ia %1!, {%2, %3}\n\t" | 108 | "ldm%?ia %0!, {%1, %2}" |
| 109 | : "+r" (buf), "=&r" (tmp), "=&r" (tmp2)); | ||
| 110 | length -= 8; | ||
| 111 | asm volatile( | ||
| 112 | "str%?h %1, [%0], #4\n\t" | ||
| 113 | "mov%? %1, %1, lsr #16\n\t" | ||
| 114 | "str%?h %1, [%0], #4\n\t" | ||
| 109 | "str%?h %2, [%0], #4\n\t" | 115 | "str%?h %2, [%0], #4\n\t" |
| 110 | "mov%? %2, %2, lsr #16\n\t" | 116 | "mov%? %2, %2, lsr #16\n\t" |
| 111 | "str%?h %2, [%0], #4\n\t" | 117 | "str%?h %2, [%0], #4" |
| 112 | "str%?h %3, [%0], #4\n\t" | 118 | : "+r" (offset), "=&r" (tmp), "=&r" (tmp2)); |
| 113 | "mov%? %3, %3, lsr #16\n\t" | ||
| 114 | "str%?h %3, [%0], #4" | ||
| 115 | : "=&r" (offset), "=&r" (buf), "=r" (tmp), "=r" (tmp2) | ||
| 116 | : "0" (offset), "1" (buf)); | ||
| 117 | length -= 8; | ||
| 118 | } | 119 | } |
| 119 | while (length > 0) { | 120 | while (length > 0) { |
| 120 | __asm__ __volatile__("str%?h %2, [%0], #4" | 121 | asm volatile("str%?h %2, [%0], #4" |
| 121 | : "=&r" (offset) : "0" (offset), "r" (buf[0] | (buf[1] << 8))); | 122 | : "=&r" (offset) : "0" (offset), "r" (buf[0] | (buf[1] << 8))); |
| 122 | buf += 2; | 123 | buf += 2; |
| 123 | length -= 2; | 124 | length -= 2; |
| 124 | } | 125 | } |
| 125 | } | 126 | } |
| 126 | 127 | ||
| 127 | static inline void | 128 | static void |
| 128 | am_readbuffer(struct net_device *dev, u_int offset, unsigned char *buf, unsigned int length) | 129 | am_readbuffer(struct net_device *dev, u_int offset, unsigned char *buf, unsigned int length) |
| 129 | { | 130 | { |
| 130 | offset = ISAMEM_BASE + (offset << 1); | 131 | offset = ISAMEM_BASE + (offset << 1); |
| 131 | length = (length + 1) & ~1; | 132 | length = (length + 1) & ~1; |
| 132 | if ((int)buf & 2) { | 133 | if ((int)buf & 2) { |
| 133 | unsigned int tmp; | 134 | unsigned int tmp; |
| 134 | __asm__ __volatile__( | 135 | asm volatile( |
| 135 | "ldr%?h %2, [%0], #4\n\t" | 136 | "ldr%?h %2, [%0], #4\n\t" |
| 136 | "str%?b %2, [%1], #1\n\t" | 137 | "str%?b %2, [%1], #1\n\t" |
| 137 | "mov%? %2, %2, lsr #8\n\t" | 138 | "mov%? %2, %2, lsr #8\n\t" |
| @@ -140,12 +141,12 @@ am_readbuffer(struct net_device *dev, u_int offset, unsigned char *buf, unsigned | |||
| 140 | length -= 2; | 141 | length -= 2; |
| 141 | } | 142 | } |
| 142 | while (length > 8) { | 143 | while (length > 8) { |
| 143 | unsigned int tmp, tmp2, tmp3; | 144 | register unsigned int tmp asm("r2"), tmp2 asm("r3"), tmp3; |
| 144 | __asm__ __volatile__( | 145 | asm volatile( |
| 145 | "ldr%?h %2, [%0], #4\n\t" | 146 | "ldr%?h %2, [%0], #4\n\t" |
| 147 | "ldr%?h %4, [%0], #4\n\t" | ||
| 146 | "ldr%?h %3, [%0], #4\n\t" | 148 | "ldr%?h %3, [%0], #4\n\t" |
| 147 | "orr%? %2, %2, %3, lsl #16\n\t" | 149 | "orr%? %2, %2, %4, lsl #16\n\t" |
| 148 | "ldr%?h %3, [%0], #4\n\t" | ||
| 149 | "ldr%?h %4, [%0], #4\n\t" | 150 | "ldr%?h %4, [%0], #4\n\t" |
| 150 | "orr%? %3, %3, %4, lsl #16\n\t" | 151 | "orr%? %3, %3, %4, lsl #16\n\t" |
| 151 | "stm%?ia %1!, {%2, %3}" | 152 | "stm%?ia %1!, {%2, %3}" |
| @@ -155,7 +156,7 @@ am_readbuffer(struct net_device *dev, u_int offset, unsigned char *buf, unsigned | |||
| 155 | } | 156 | } |
| 156 | while (length > 0) { | 157 | while (length > 0) { |
| 157 | unsigned int tmp; | 158 | unsigned int tmp; |
| 158 | __asm__ __volatile__( | 159 | asm volatile( |
| 159 | "ldr%?h %2, [%0], #4\n\t" | 160 | "ldr%?h %2, [%0], #4\n\t" |
| 160 | "str%?b %2, [%1], #1\n\t" | 161 | "str%?b %2, [%1], #1\n\t" |
| 161 | "mov%? %2, %2, lsr #8\n\t" | 162 | "mov%? %2, %2, lsr #8\n\t" |
| @@ -196,6 +197,42 @@ am79c961_ramtest(struct net_device *dev, unsigned int val) | |||
| 196 | return errorcount; | 197 | return errorcount; |
| 197 | } | 198 | } |
| 198 | 199 | ||
| 200 | static void am79c961_mc_hash(char *addr, u16 *hash) | ||
| 201 | { | ||
| 202 | if (addr[0] & 0x01) { | ||
| 203 | int idx, bit; | ||
| 204 | u32 crc; | ||
| 205 | |||
| 206 | crc = ether_crc_le(ETH_ALEN, addr); | ||
| 207 | |||
| 208 | idx = crc >> 30; | ||
| 209 | bit = (crc >> 26) & 15; | ||
| 210 | |||
| 211 | hash[idx] |= 1 << bit; | ||
| 212 | } | ||
| 213 | } | ||
| 214 | |||
| 215 | static unsigned int am79c961_get_rx_mode(struct net_device *dev, u16 *hash) | ||
| 216 | { | ||
| 217 | unsigned int mode = MODE_PORT_10BT; | ||
| 218 | |||
| 219 | if (dev->flags & IFF_PROMISC) { | ||
| 220 | mode |= MODE_PROMISC; | ||
| 221 | memset(hash, 0xff, 4 * sizeof(*hash)); | ||
| 222 | } else if (dev->flags & IFF_ALLMULTI) { | ||
| 223 | memset(hash, 0xff, 4 * sizeof(*hash)); | ||
| 224 | } else { | ||
| 225 | struct netdev_hw_addr *ha; | ||
| 226 | |||
| 227 | memset(hash, 0, 4 * sizeof(*hash)); | ||
| 228 | |||
| 229 | netdev_for_each_mc_addr(ha, dev) | ||
| 230 | am79c961_mc_hash(ha->addr, hash); | ||
| 231 | } | ||
| 232 | |||
| 233 | return mode; | ||
| 234 | } | ||
| 235 | |||
| 199 | static void | 236 | static void |
| 200 | am79c961_init_for_open(struct net_device *dev) | 237 | am79c961_init_for_open(struct net_device *dev) |
| 201 | { | 238 | { |
| @@ -203,6 +240,7 @@ am79c961_init_for_open(struct net_device *dev) | |||
| 203 | unsigned long flags; | 240 | unsigned long flags; |
| 204 | unsigned char *p; | 241 | unsigned char *p; |
| 205 | u_int hdr_addr, first_free_addr; | 242 | u_int hdr_addr, first_free_addr; |
| 243 | u16 multi_hash[4], mode = am79c961_get_rx_mode(dev, multi_hash); | ||
| 206 | int i; | 244 | int i; |
| 207 | 245 | ||
| 208 | /* | 246 | /* |
| @@ -218,16 +256,12 @@ am79c961_init_for_open(struct net_device *dev) | |||
| 218 | write_ireg (dev->base_addr, 2, 0x0000); /* MODE register selects media */ | 256 | write_ireg (dev->base_addr, 2, 0x0000); /* MODE register selects media */ |
| 219 | 257 | ||
| 220 | for (i = LADRL; i <= LADRH; i++) | 258 | for (i = LADRL; i <= LADRH; i++) |
| 221 | write_rreg (dev->base_addr, i, 0); | 259 | write_rreg (dev->base_addr, i, multi_hash[i - LADRL]); |
| 222 | 260 | ||
| 223 | for (i = PADRL, p = dev->dev_addr; i <= PADRH; i++, p += 2) | 261 | for (i = PADRL, p = dev->dev_addr; i <= PADRH; i++, p += 2) |
| 224 | write_rreg (dev->base_addr, i, p[0] | (p[1] << 8)); | 262 | write_rreg (dev->base_addr, i, p[0] | (p[1] << 8)); |
| 225 | 263 | ||
| 226 | i = MODE_PORT_10BT; | 264 | write_rreg (dev->base_addr, MODE, mode); |
| 227 | if (dev->flags & IFF_PROMISC) | ||
| 228 | i |= MODE_PROMISC; | ||
| 229 | |||
| 230 | write_rreg (dev->base_addr, MODE, i); | ||
| 231 | write_rreg (dev->base_addr, POLLINT, 0); | 265 | write_rreg (dev->base_addr, POLLINT, 0); |
| 232 | write_rreg (dev->base_addr, SIZERXR, -RX_BUFFERS); | 266 | write_rreg (dev->base_addr, SIZERXR, -RX_BUFFERS); |
| 233 | write_rreg (dev->base_addr, SIZETXR, -TX_BUFFERS); | 267 | write_rreg (dev->base_addr, SIZETXR, -TX_BUFFERS); |
| @@ -340,21 +374,6 @@ am79c961_close(struct net_device *dev) | |||
| 340 | return 0; | 374 | return 0; |
| 341 | } | 375 | } |
| 342 | 376 | ||
| 343 | static void am79c961_mc_hash(char *addr, unsigned short *hash) | ||
| 344 | { | ||
| 345 | if (addr[0] & 0x01) { | ||
| 346 | int idx, bit; | ||
| 347 | u32 crc; | ||
| 348 | |||
| 349 | crc = ether_crc_le(ETH_ALEN, addr); | ||
| 350 | |||
| 351 | idx = crc >> 30; | ||
| 352 | bit = (crc >> 26) & 15; | ||
| 353 | |||
| 354 | hash[idx] |= 1 << bit; | ||
| 355 | } | ||
| 356 | } | ||
| 357 | |||
| 358 | /* | 377 | /* |
| 359 | * Set or clear promiscuous/multicast mode filter for this adapter. | 378 | * Set or clear promiscuous/multicast mode filter for this adapter. |
| 360 | */ | 379 | */ |
| @@ -362,24 +381,9 @@ static void am79c961_setmulticastlist (struct net_device *dev) | |||
| 362 | { | 381 | { |
| 363 | struct dev_priv *priv = netdev_priv(dev); | 382 | struct dev_priv *priv = netdev_priv(dev); |
| 364 | unsigned long flags; | 383 | unsigned long flags; |
| 365 | unsigned short multi_hash[4], mode; | 384 | u16 multi_hash[4], mode = am79c961_get_rx_mode(dev, multi_hash); |
| 366 | int i, stopped; | 385 | int i, stopped; |
| 367 | 386 | ||
| 368 | mode = MODE_PORT_10BT; | ||
| 369 | |||
| 370 | if (dev->flags & IFF_PROMISC) { | ||
| 371 | mode |= MODE_PROMISC; | ||
| 372 | } else if (dev->flags & IFF_ALLMULTI) { | ||
| 373 | memset(multi_hash, 0xff, sizeof(multi_hash)); | ||
| 374 | } else { | ||
| 375 | struct netdev_hw_addr *ha; | ||
| 376 | |||
| 377 | memset(multi_hash, 0x00, sizeof(multi_hash)); | ||
| 378 | |||
| 379 | netdev_for_each_mc_addr(ha, dev) | ||
| 380 | am79c961_mc_hash(ha->addr, multi_hash); | ||
| 381 | } | ||
| 382 | |||
| 383 | spin_lock_irqsave(&priv->chip_lock, flags); | 387 | spin_lock_irqsave(&priv->chip_lock, flags); |
| 384 | 388 | ||
| 385 | stopped = read_rreg(dev->base_addr, CSR0) & CSR0_STOP; | 389 | stopped = read_rreg(dev->base_addr, CSR0) & CSR0_STOP; |
diff --git a/drivers/net/arm/ep93xx_eth.c b/drivers/net/arm/ep93xx_eth.c index 5a77001b6d10..0b46b8ea0e80 100644 --- a/drivers/net/arm/ep93xx_eth.c +++ b/drivers/net/arm/ep93xx_eth.c | |||
| @@ -283,10 +283,14 @@ static int ep93xx_rx(struct net_device *dev, int processed, int budget) | |||
| 283 | 283 | ||
| 284 | skb = dev_alloc_skb(length + 2); | 284 | skb = dev_alloc_skb(length + 2); |
| 285 | if (likely(skb != NULL)) { | 285 | if (likely(skb != NULL)) { |
| 286 | struct ep93xx_rdesc *rxd = &ep->descs->rdesc[entry]; | ||
| 286 | skb_reserve(skb, 2); | 287 | skb_reserve(skb, 2); |
| 287 | dma_sync_single_for_cpu(NULL, ep->descs->rdesc[entry].buf_addr, | 288 | dma_sync_single_for_cpu(dev->dev.parent, rxd->buf_addr, |
| 288 | length, DMA_FROM_DEVICE); | 289 | length, DMA_FROM_DEVICE); |
| 289 | skb_copy_to_linear_data(skb, ep->rx_buf[entry], length); | 290 | skb_copy_to_linear_data(skb, ep->rx_buf[entry], length); |
| 291 | dma_sync_single_for_device(dev->dev.parent, | ||
| 292 | rxd->buf_addr, length, | ||
| 293 | DMA_FROM_DEVICE); | ||
| 290 | skb_put(skb, length); | 294 | skb_put(skb, length); |
| 291 | skb->protocol = eth_type_trans(skb, dev); | 295 | skb->protocol = eth_type_trans(skb, dev); |
| 292 | 296 | ||
| @@ -348,6 +352,7 @@ poll_some_more: | |||
| 348 | static int ep93xx_xmit(struct sk_buff *skb, struct net_device *dev) | 352 | static int ep93xx_xmit(struct sk_buff *skb, struct net_device *dev) |
| 349 | { | 353 | { |
| 350 | struct ep93xx_priv *ep = netdev_priv(dev); | 354 | struct ep93xx_priv *ep = netdev_priv(dev); |
| 355 | struct ep93xx_tdesc *txd; | ||
| 351 | int entry; | 356 | int entry; |
| 352 | 357 | ||
| 353 | if (unlikely(skb->len > MAX_PKT_SIZE)) { | 358 | if (unlikely(skb->len > MAX_PKT_SIZE)) { |
| @@ -359,11 +364,14 @@ static int ep93xx_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 359 | entry = ep->tx_pointer; | 364 | entry = ep->tx_pointer; |
| 360 | ep->tx_pointer = (ep->tx_pointer + 1) & (TX_QUEUE_ENTRIES - 1); | 365 | ep->tx_pointer = (ep->tx_pointer + 1) & (TX_QUEUE_ENTRIES - 1); |
| 361 | 366 | ||
| 362 | ep->descs->tdesc[entry].tdesc1 = | 367 | txd = &ep->descs->tdesc[entry]; |
| 363 | TDESC1_EOF | (entry << 16) | (skb->len & 0xfff); | 368 | |
| 369 | txd->tdesc1 = TDESC1_EOF | (entry << 16) | (skb->len & 0xfff); | ||
| 370 | dma_sync_single_for_cpu(dev->dev.parent, txd->buf_addr, skb->len, | ||
| 371 | DMA_TO_DEVICE); | ||
| 364 | skb_copy_and_csum_dev(skb, ep->tx_buf[entry]); | 372 | skb_copy_and_csum_dev(skb, ep->tx_buf[entry]); |
| 365 | dma_sync_single_for_cpu(NULL, ep->descs->tdesc[entry].buf_addr, | 373 | dma_sync_single_for_device(dev->dev.parent, txd->buf_addr, skb->len, |
| 366 | skb->len, DMA_TO_DEVICE); | 374 | DMA_TO_DEVICE); |
| 367 | dev_kfree_skb(skb); | 375 | dev_kfree_skb(skb); |
| 368 | 376 | ||
| 369 | spin_lock_irq(&ep->tx_pending_lock); | 377 | spin_lock_irq(&ep->tx_pending_lock); |
| @@ -457,89 +465,80 @@ static irqreturn_t ep93xx_irq(int irq, void *dev_id) | |||
| 457 | 465 | ||
| 458 | static void ep93xx_free_buffers(struct ep93xx_priv *ep) | 466 | static void ep93xx_free_buffers(struct ep93xx_priv *ep) |
| 459 | { | 467 | { |
| 468 | struct device *dev = ep->dev->dev.parent; | ||
| 460 | int i; | 469 | int i; |
| 461 | 470 | ||
| 462 | for (i = 0; i < RX_QUEUE_ENTRIES; i += 2) { | 471 | for (i = 0; i < RX_QUEUE_ENTRIES; i++) { |
| 463 | dma_addr_t d; | 472 | dma_addr_t d; |
| 464 | 473 | ||
| 465 | d = ep->descs->rdesc[i].buf_addr; | 474 | d = ep->descs->rdesc[i].buf_addr; |
| 466 | if (d) | 475 | if (d) |
| 467 | dma_unmap_single(NULL, d, PAGE_SIZE, DMA_FROM_DEVICE); | 476 | dma_unmap_single(dev, d, PKT_BUF_SIZE, DMA_FROM_DEVICE); |
| 468 | 477 | ||
| 469 | if (ep->rx_buf[i] != NULL) | 478 | if (ep->rx_buf[i] != NULL) |
| 470 | free_page((unsigned long)ep->rx_buf[i]); | 479 | kfree(ep->rx_buf[i]); |
| 471 | } | 480 | } |
| 472 | 481 | ||
| 473 | for (i = 0; i < TX_QUEUE_ENTRIES; i += 2) { | 482 | for (i = 0; i < TX_QUEUE_ENTRIES; i++) { |
| 474 | dma_addr_t d; | 483 | dma_addr_t d; |
| 475 | 484 | ||
| 476 | d = ep->descs->tdesc[i].buf_addr; | 485 | d = ep->descs->tdesc[i].buf_addr; |
| 477 | if (d) | 486 | if (d) |
| 478 | dma_unmap_single(NULL, d, PAGE_SIZE, DMA_TO_DEVICE); | 487 | dma_unmap_single(dev, d, PKT_BUF_SIZE, DMA_TO_DEVICE); |
| 479 | 488 | ||
| 480 | if (ep->tx_buf[i] != NULL) | 489 | if (ep->tx_buf[i] != NULL) |
| 481 | free_page((unsigned long)ep->tx_buf[i]); | 490 | kfree(ep->tx_buf[i]); |
| 482 | } | 491 | } |
| 483 | 492 | ||
| 484 | dma_free_coherent(NULL, sizeof(struct ep93xx_descs), ep->descs, | 493 | dma_free_coherent(dev, sizeof(struct ep93xx_descs), ep->descs, |
| 485 | ep->descs_dma_addr); | 494 | ep->descs_dma_addr); |
| 486 | } | 495 | } |
| 487 | 496 | ||
| 488 | /* | ||
| 489 | * The hardware enforces a sub-2K maximum packet size, so we put | ||
| 490 | * two buffers on every hardware page. | ||
| 491 | */ | ||
| 492 | static int ep93xx_alloc_buffers(struct ep93xx_priv *ep) | 497 | static int ep93xx_alloc_buffers(struct ep93xx_priv *ep) |
| 493 | { | 498 | { |
| 499 | struct device *dev = ep->dev->dev.parent; | ||
| 494 | int i; | 500 | int i; |
| 495 | 501 | ||
| 496 | ep->descs = dma_alloc_coherent(NULL, sizeof(struct ep93xx_descs), | 502 | ep->descs = dma_alloc_coherent(dev, sizeof(struct ep93xx_descs), |
| 497 | &ep->descs_dma_addr, GFP_KERNEL | GFP_DMA); | 503 | &ep->descs_dma_addr, GFP_KERNEL); |
| 498 | if (ep->descs == NULL) | 504 | if (ep->descs == NULL) |
| 499 | return 1; | 505 | return 1; |
| 500 | 506 | ||
| 501 | for (i = 0; i < RX_QUEUE_ENTRIES; i += 2) { | 507 | for (i = 0; i < RX_QUEUE_ENTRIES; i++) { |
| 502 | void *page; | 508 | void *buf; |
| 503 | dma_addr_t d; | 509 | dma_addr_t d; |
| 504 | 510 | ||
| 505 | page = (void *)__get_free_page(GFP_KERNEL | GFP_DMA); | 511 | buf = kmalloc(PKT_BUF_SIZE, GFP_KERNEL); |
| 506 | if (page == NULL) | 512 | if (buf == NULL) |
| 507 | goto err; | 513 | goto err; |
| 508 | 514 | ||
| 509 | d = dma_map_single(NULL, page, PAGE_SIZE, DMA_FROM_DEVICE); | 515 | d = dma_map_single(dev, buf, PKT_BUF_SIZE, DMA_FROM_DEVICE); |
| 510 | if (dma_mapping_error(NULL, d)) { | 516 | if (dma_mapping_error(dev, d)) { |
| 511 | free_page((unsigned long)page); | 517 | kfree(buf); |
| 512 | goto err; | 518 | goto err; |
| 513 | } | 519 | } |
| 514 | 520 | ||
| 515 | ep->rx_buf[i] = page; | 521 | ep->rx_buf[i] = buf; |
| 516 | ep->descs->rdesc[i].buf_addr = d; | 522 | ep->descs->rdesc[i].buf_addr = d; |
| 517 | ep->descs->rdesc[i].rdesc1 = (i << 16) | PKT_BUF_SIZE; | 523 | ep->descs->rdesc[i].rdesc1 = (i << 16) | PKT_BUF_SIZE; |
| 518 | |||
| 519 | ep->rx_buf[i + 1] = page + PKT_BUF_SIZE; | ||
| 520 | ep->descs->rdesc[i + 1].buf_addr = d + PKT_BUF_SIZE; | ||
| 521 | ep->descs->rdesc[i + 1].rdesc1 = ((i + 1) << 16) | PKT_BUF_SIZE; | ||
| 522 | } | 524 | } |
| 523 | 525 | ||
| 524 | for (i = 0; i < TX_QUEUE_ENTRIES; i += 2) { | 526 | for (i = 0; i < TX_QUEUE_ENTRIES; i++) { |
| 525 | void *page; | 527 | void *buf; |
| 526 | dma_addr_t d; | 528 | dma_addr_t d; |
| 527 | 529 | ||
| 528 | page = (void *)__get_free_page(GFP_KERNEL | GFP_DMA); | 530 | buf = kmalloc(PKT_BUF_SIZE, GFP_KERNEL); |
| 529 | if (page == NULL) | 531 | if (buf == NULL) |
| 530 | goto err; | 532 | goto err; |
| 531 | 533 | ||
| 532 | d = dma_map_single(NULL, page, PAGE_SIZE, DMA_TO_DEVICE); | 534 | d = dma_map_single(dev, buf, PKT_BUF_SIZE, DMA_TO_DEVICE); |
| 533 | if (dma_mapping_error(NULL, d)) { | 535 | if (dma_mapping_error(dev, d)) { |
| 534 | free_page((unsigned long)page); | 536 | kfree(buf); |
| 535 | goto err; | 537 | goto err; |
| 536 | } | 538 | } |
| 537 | 539 | ||
| 538 | ep->tx_buf[i] = page; | 540 | ep->tx_buf[i] = buf; |
| 539 | ep->descs->tdesc[i].buf_addr = d; | 541 | ep->descs->tdesc[i].buf_addr = d; |
| 540 | |||
| 541 | ep->tx_buf[i + 1] = page + PKT_BUF_SIZE; | ||
| 542 | ep->descs->tdesc[i + 1].buf_addr = d + PKT_BUF_SIZE; | ||
| 543 | } | 542 | } |
| 544 | 543 | ||
| 545 | return 0; | 544 | return 0; |
| @@ -829,6 +828,7 @@ static int ep93xx_eth_probe(struct platform_device *pdev) | |||
| 829 | } | 828 | } |
| 830 | ep = netdev_priv(dev); | 829 | ep = netdev_priv(dev); |
| 831 | ep->dev = dev; | 830 | ep->dev = dev; |
| 831 | SET_NETDEV_DEV(dev, &pdev->dev); | ||
| 832 | netif_napi_add(dev, &ep->napi, ep93xx_poll, 64); | 832 | netif_napi_add(dev, &ep->napi, ep93xx_poll, 64); |
| 833 | 833 | ||
| 834 | platform_set_drvdata(pdev, dev); | 834 | platform_set_drvdata(pdev, dev); |
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 17b4dd94da90..652b30e525d0 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
| @@ -388,6 +388,8 @@ struct vlan_entry *bond_next_vlan(struct bonding *bond, struct vlan_entry *curr) | |||
| 388 | return next; | 388 | return next; |
| 389 | } | 389 | } |
| 390 | 390 | ||
| 391 | #define bond_queue_mapping(skb) (*(u16 *)((skb)->cb)) | ||
| 392 | |||
| 391 | /** | 393 | /** |
| 392 | * bond_dev_queue_xmit - Prepare skb for xmit. | 394 | * bond_dev_queue_xmit - Prepare skb for xmit. |
| 393 | * | 395 | * |
| @@ -400,6 +402,9 @@ int bond_dev_queue_xmit(struct bonding *bond, struct sk_buff *skb, | |||
| 400 | { | 402 | { |
| 401 | skb->dev = slave_dev; | 403 | skb->dev = slave_dev; |
| 402 | skb->priority = 1; | 404 | skb->priority = 1; |
| 405 | |||
| 406 | skb->queue_mapping = bond_queue_mapping(skb); | ||
| 407 | |||
| 403 | if (unlikely(netpoll_tx_running(slave_dev))) | 408 | if (unlikely(netpoll_tx_running(slave_dev))) |
| 404 | bond_netpoll_send_skb(bond_get_slave_by_dev(bond, slave_dev), skb); | 409 | bond_netpoll_send_skb(bond_get_slave_by_dev(bond, slave_dev), skb); |
| 405 | else | 410 | else |
| @@ -4206,6 +4211,7 @@ static inline int bond_slave_override(struct bonding *bond, | |||
| 4206 | return res; | 4211 | return res; |
| 4207 | } | 4212 | } |
| 4208 | 4213 | ||
| 4214 | |||
| 4209 | static u16 bond_select_queue(struct net_device *dev, struct sk_buff *skb) | 4215 | static u16 bond_select_queue(struct net_device *dev, struct sk_buff *skb) |
| 4210 | { | 4216 | { |
| 4211 | /* | 4217 | /* |
| @@ -4216,6 +4222,11 @@ static u16 bond_select_queue(struct net_device *dev, struct sk_buff *skb) | |||
| 4216 | */ | 4222 | */ |
| 4217 | u16 txq = skb_rx_queue_recorded(skb) ? skb_get_rx_queue(skb) : 0; | 4223 | u16 txq = skb_rx_queue_recorded(skb) ? skb_get_rx_queue(skb) : 0; |
| 4218 | 4224 | ||
| 4225 | /* | ||
| 4226 | * Save the original txq to restore before passing to the driver | ||
| 4227 | */ | ||
| 4228 | bond_queue_mapping(skb) = skb->queue_mapping; | ||
| 4229 | |||
| 4219 | if (unlikely(txq >= dev->real_num_tx_queues)) { | 4230 | if (unlikely(txq >= dev->real_num_tx_queues)) { |
| 4220 | do { | 4231 | do { |
| 4221 | txq -= dev->real_num_tx_queues; | 4232 | txq -= dev->real_num_tx_queues; |
diff --git a/drivers/net/dl2k.c b/drivers/net/dl2k.c index c445457b66d5..23179dbcedd2 100644 --- a/drivers/net/dl2k.c +++ b/drivers/net/dl2k.c | |||
| @@ -346,7 +346,7 @@ parse_eeprom (struct net_device *dev) | |||
| 346 | if (np->pdev->vendor == PCI_VENDOR_ID_DLINK) { /* D-Link Only */ | 346 | if (np->pdev->vendor == PCI_VENDOR_ID_DLINK) { /* D-Link Only */ |
| 347 | /* Check CRC */ | 347 | /* Check CRC */ |
| 348 | crc = ~ether_crc_le (256 - 4, sromdata); | 348 | crc = ~ether_crc_le (256 - 4, sromdata); |
| 349 | if (psrom->crc != crc) { | 349 | if (psrom->crc != cpu_to_le32(crc)) { |
| 350 | printk (KERN_ERR "%s: EEPROM data CRC error.\n", | 350 | printk (KERN_ERR "%s: EEPROM data CRC error.\n", |
| 351 | dev->name); | 351 | dev->name); |
| 352 | return -1; | 352 | return -1; |
diff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c index ff60b23a5b74..2dfcc8047847 100644 --- a/drivers/net/gianfar.c +++ b/drivers/net/gianfar.c | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | * Maintainer: Kumar Gala | 10 | * Maintainer: Kumar Gala |
| 11 | * Modifier: Sandeep Gopalpet <sandeep.kumar@freescale.com> | 11 | * Modifier: Sandeep Gopalpet <sandeep.kumar@freescale.com> |
| 12 | * | 12 | * |
| 13 | * Copyright 2002-2009 Freescale Semiconductor, Inc. | 13 | * Copyright 2002-2009, 2011 Freescale Semiconductor, Inc. |
| 14 | * Copyright 2007 MontaVista Software, Inc. | 14 | * Copyright 2007 MontaVista Software, Inc. |
| 15 | * | 15 | * |
| 16 | * This program is free software; you can redistribute it and/or modify it | 16 | * This program is free software; you can redistribute it and/or modify it |
| @@ -476,9 +476,6 @@ static const struct net_device_ops gfar_netdev_ops = { | |||
| 476 | #endif | 476 | #endif |
| 477 | }; | 477 | }; |
| 478 | 478 | ||
| 479 | unsigned int ftp_rqfpr[MAX_FILER_IDX + 1]; | ||
| 480 | unsigned int ftp_rqfcr[MAX_FILER_IDX + 1]; | ||
| 481 | |||
| 482 | void lock_rx_qs(struct gfar_private *priv) | 479 | void lock_rx_qs(struct gfar_private *priv) |
| 483 | { | 480 | { |
| 484 | int i = 0x0; | 481 | int i = 0x0; |
| @@ -868,28 +865,28 @@ static u32 cluster_entry_per_class(struct gfar_private *priv, u32 rqfar, | |||
| 868 | 865 | ||
| 869 | rqfar--; | 866 | rqfar--; |
| 870 | rqfcr = RQFCR_CLE | RQFCR_PID_MASK | RQFCR_CMP_EXACT; | 867 | rqfcr = RQFCR_CLE | RQFCR_PID_MASK | RQFCR_CMP_EXACT; |
| 871 | ftp_rqfpr[rqfar] = rqfpr; | 868 | priv->ftp_rqfpr[rqfar] = rqfpr; |
| 872 | ftp_rqfcr[rqfar] = rqfcr; | 869 | priv->ftp_rqfcr[rqfar] = rqfcr; |
| 873 | gfar_write_filer(priv, rqfar, rqfcr, rqfpr); | 870 | gfar_write_filer(priv, rqfar, rqfcr, rqfpr); |
| 874 | 871 | ||
| 875 | rqfar--; | 872 | rqfar--; |
| 876 | rqfcr = RQFCR_CMP_NOMATCH; | 873 | rqfcr = RQFCR_CMP_NOMATCH; |
| 877 | ftp_rqfpr[rqfar] = rqfpr; | 874 | priv->ftp_rqfpr[rqfar] = rqfpr; |
| 878 | ftp_rqfcr[rqfar] = rqfcr; | 875 | priv->ftp_rqfcr[rqfar] = rqfcr; |
| 879 | gfar_write_filer(priv, rqfar, rqfcr, rqfpr); | 876 | gfar_write_filer(priv, rqfar, rqfcr, rqfpr); |
| 880 | 877 | ||
| 881 | rqfar--; | 878 | rqfar--; |
| 882 | rqfcr = RQFCR_CMP_EXACT | RQFCR_PID_PARSE | RQFCR_CLE | RQFCR_AND; | 879 | rqfcr = RQFCR_CMP_EXACT | RQFCR_PID_PARSE | RQFCR_CLE | RQFCR_AND; |
| 883 | rqfpr = class; | 880 | rqfpr = class; |
| 884 | ftp_rqfcr[rqfar] = rqfcr; | 881 | priv->ftp_rqfcr[rqfar] = rqfcr; |
| 885 | ftp_rqfpr[rqfar] = rqfpr; | 882 | priv->ftp_rqfpr[rqfar] = rqfpr; |
| 886 | gfar_write_filer(priv, rqfar, rqfcr, rqfpr); | 883 | gfar_write_filer(priv, rqfar, rqfcr, rqfpr); |
| 887 | 884 | ||
| 888 | rqfar--; | 885 | rqfar--; |
| 889 | rqfcr = RQFCR_CMP_EXACT | RQFCR_PID_MASK | RQFCR_AND; | 886 | rqfcr = RQFCR_CMP_EXACT | RQFCR_PID_MASK | RQFCR_AND; |
| 890 | rqfpr = class; | 887 | rqfpr = class; |
| 891 | ftp_rqfcr[rqfar] = rqfcr; | 888 | priv->ftp_rqfcr[rqfar] = rqfcr; |
| 892 | ftp_rqfpr[rqfar] = rqfpr; | 889 | priv->ftp_rqfpr[rqfar] = rqfpr; |
| 893 | gfar_write_filer(priv, rqfar, rqfcr, rqfpr); | 890 | gfar_write_filer(priv, rqfar, rqfcr, rqfpr); |
| 894 | 891 | ||
| 895 | return rqfar; | 892 | return rqfar; |
| @@ -904,8 +901,8 @@ static void gfar_init_filer_table(struct gfar_private *priv) | |||
| 904 | 901 | ||
| 905 | /* Default rule */ | 902 | /* Default rule */ |
| 906 | rqfcr = RQFCR_CMP_MATCH; | 903 | rqfcr = RQFCR_CMP_MATCH; |
| 907 | ftp_rqfcr[rqfar] = rqfcr; | 904 | priv->ftp_rqfcr[rqfar] = rqfcr; |
| 908 | ftp_rqfpr[rqfar] = rqfpr; | 905 | priv->ftp_rqfpr[rqfar] = rqfpr; |
| 909 | gfar_write_filer(priv, rqfar, rqfcr, rqfpr); | 906 | gfar_write_filer(priv, rqfar, rqfcr, rqfpr); |
| 910 | 907 | ||
| 911 | rqfar = cluster_entry_per_class(priv, rqfar, RQFPR_IPV6); | 908 | rqfar = cluster_entry_per_class(priv, rqfar, RQFPR_IPV6); |
| @@ -921,8 +918,8 @@ static void gfar_init_filer_table(struct gfar_private *priv) | |||
| 921 | /* Rest are masked rules */ | 918 | /* Rest are masked rules */ |
| 922 | rqfcr = RQFCR_CMP_NOMATCH; | 919 | rqfcr = RQFCR_CMP_NOMATCH; |
| 923 | for (i = 0; i < rqfar; i++) { | 920 | for (i = 0; i < rqfar; i++) { |
| 924 | ftp_rqfcr[i] = rqfcr; | 921 | priv->ftp_rqfcr[i] = rqfcr; |
| 925 | ftp_rqfpr[i] = rqfpr; | 922 | priv->ftp_rqfpr[i] = rqfpr; |
| 926 | gfar_write_filer(priv, i, rqfcr, rqfpr); | 923 | gfar_write_filer(priv, i, rqfcr, rqfpr); |
| 927 | } | 924 | } |
| 928 | } | 925 | } |
diff --git a/drivers/net/gianfar.h b/drivers/net/gianfar.h index fc86f5195445..ba36dc7a3435 100644 --- a/drivers/net/gianfar.h +++ b/drivers/net/gianfar.h | |||
| @@ -9,7 +9,7 @@ | |||
| 9 | * Maintainer: Kumar Gala | 9 | * Maintainer: Kumar Gala |
| 10 | * Modifier: Sandeep Gopalpet <sandeep.kumar@freescale.com> | 10 | * Modifier: Sandeep Gopalpet <sandeep.kumar@freescale.com> |
| 11 | * | 11 | * |
| 12 | * Copyright 2002-2009 Freescale Semiconductor, Inc. | 12 | * Copyright 2002-2009, 2011 Freescale Semiconductor, Inc. |
| 13 | * | 13 | * |
| 14 | * This program is free software; you can redistribute it and/or modify it | 14 | * This program is free software; you can redistribute it and/or modify it |
| 15 | * under the terms of the GNU General Public License as published by the | 15 | * under the terms of the GNU General Public License as published by the |
| @@ -1107,10 +1107,12 @@ struct gfar_private { | |||
| 1107 | /* HW time stamping enabled flag */ | 1107 | /* HW time stamping enabled flag */ |
| 1108 | int hwts_rx_en; | 1108 | int hwts_rx_en; |
| 1109 | int hwts_tx_en; | 1109 | int hwts_tx_en; |
| 1110 | |||
| 1111 | /*Filer table*/ | ||
| 1112 | unsigned int ftp_rqfpr[MAX_FILER_IDX + 1]; | ||
| 1113 | unsigned int ftp_rqfcr[MAX_FILER_IDX + 1]; | ||
| 1110 | }; | 1114 | }; |
| 1111 | 1115 | ||
| 1112 | extern unsigned int ftp_rqfpr[MAX_FILER_IDX + 1]; | ||
| 1113 | extern unsigned int ftp_rqfcr[MAX_FILER_IDX + 1]; | ||
| 1114 | 1116 | ||
| 1115 | static inline int gfar_has_errata(struct gfar_private *priv, | 1117 | static inline int gfar_has_errata(struct gfar_private *priv, |
| 1116 | enum gfar_errata err) | 1118 | enum gfar_errata err) |
diff --git a/drivers/net/gianfar_ethtool.c b/drivers/net/gianfar_ethtool.c index 493d743839d9..239e3330495f 100644 --- a/drivers/net/gianfar_ethtool.c +++ b/drivers/net/gianfar_ethtool.c | |||
| @@ -9,7 +9,7 @@ | |||
| 9 | * Maintainer: Kumar Gala | 9 | * Maintainer: Kumar Gala |
| 10 | * Modifier: Sandeep Gopalpet <sandeep.kumar@freescale.com> | 10 | * Modifier: Sandeep Gopalpet <sandeep.kumar@freescale.com> |
| 11 | * | 11 | * |
| 12 | * Copyright 2003-2006, 2008-2009 Freescale Semiconductor, Inc. | 12 | * Copyright 2003-2006, 2008-2009, 2011 Freescale Semiconductor, Inc. |
| 13 | * | 13 | * |
| 14 | * This software may be used and distributed according to | 14 | * This software may be used and distributed according to |
| 15 | * the terms of the GNU Public License, Version 2, incorporated herein | 15 | * the terms of the GNU Public License, Version 2, incorporated herein |
| @@ -609,15 +609,15 @@ static void ethflow_to_filer_rules (struct gfar_private *priv, u64 ethflow) | |||
| 609 | if (ethflow & RXH_L2DA) { | 609 | if (ethflow & RXH_L2DA) { |
| 610 | fcr = RQFCR_PID_DAH |RQFCR_CMP_NOMATCH | | 610 | fcr = RQFCR_PID_DAH |RQFCR_CMP_NOMATCH | |
| 611 | RQFCR_HASH | RQFCR_AND | RQFCR_HASHTBL_0; | 611 | RQFCR_HASH | RQFCR_AND | RQFCR_HASHTBL_0; |
| 612 | ftp_rqfpr[priv->cur_filer_idx] = fpr; | 612 | priv->ftp_rqfpr[priv->cur_filer_idx] = fpr; |
| 613 | ftp_rqfcr[priv->cur_filer_idx] = fcr; | 613 | priv->ftp_rqfcr[priv->cur_filer_idx] = fcr; |
| 614 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); | 614 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); |
| 615 | priv->cur_filer_idx = priv->cur_filer_idx - 1; | 615 | priv->cur_filer_idx = priv->cur_filer_idx - 1; |
| 616 | 616 | ||
| 617 | fcr = RQFCR_PID_DAL | RQFCR_AND | RQFCR_CMP_NOMATCH | | 617 | fcr = RQFCR_PID_DAL | RQFCR_AND | RQFCR_CMP_NOMATCH | |
| 618 | RQFCR_HASH | RQFCR_AND | RQFCR_HASHTBL_0; | 618 | RQFCR_HASH | RQFCR_AND | RQFCR_HASHTBL_0; |
| 619 | ftp_rqfpr[priv->cur_filer_idx] = fpr; | 619 | priv->ftp_rqfpr[priv->cur_filer_idx] = fpr; |
| 620 | ftp_rqfcr[priv->cur_filer_idx] = fcr; | 620 | priv->ftp_rqfcr[priv->cur_filer_idx] = fcr; |
| 621 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); | 621 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); |
| 622 | priv->cur_filer_idx = priv->cur_filer_idx - 1; | 622 | priv->cur_filer_idx = priv->cur_filer_idx - 1; |
| 623 | } | 623 | } |
| @@ -626,16 +626,16 @@ static void ethflow_to_filer_rules (struct gfar_private *priv, u64 ethflow) | |||
| 626 | fcr = RQFCR_PID_VID | RQFCR_CMP_NOMATCH | RQFCR_HASH | | 626 | fcr = RQFCR_PID_VID | RQFCR_CMP_NOMATCH | RQFCR_HASH | |
| 627 | RQFCR_AND | RQFCR_HASHTBL_0; | 627 | RQFCR_AND | RQFCR_HASHTBL_0; |
| 628 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); | 628 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); |
| 629 | ftp_rqfpr[priv->cur_filer_idx] = fpr; | 629 | priv->ftp_rqfpr[priv->cur_filer_idx] = fpr; |
| 630 | ftp_rqfcr[priv->cur_filer_idx] = fcr; | 630 | priv->ftp_rqfcr[priv->cur_filer_idx] = fcr; |
| 631 | priv->cur_filer_idx = priv->cur_filer_idx - 1; | 631 | priv->cur_filer_idx = priv->cur_filer_idx - 1; |
| 632 | } | 632 | } |
| 633 | 633 | ||
| 634 | if (ethflow & RXH_IP_SRC) { | 634 | if (ethflow & RXH_IP_SRC) { |
| 635 | fcr = RQFCR_PID_SIA | RQFCR_CMP_NOMATCH | RQFCR_HASH | | 635 | fcr = RQFCR_PID_SIA | RQFCR_CMP_NOMATCH | RQFCR_HASH | |
| 636 | RQFCR_AND | RQFCR_HASHTBL_0; | 636 | RQFCR_AND | RQFCR_HASHTBL_0; |
| 637 | ftp_rqfpr[priv->cur_filer_idx] = fpr; | 637 | priv->ftp_rqfpr[priv->cur_filer_idx] = fpr; |
| 638 | ftp_rqfcr[priv->cur_filer_idx] = fcr; | 638 | priv->ftp_rqfcr[priv->cur_filer_idx] = fcr; |
| 639 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); | 639 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); |
| 640 | priv->cur_filer_idx = priv->cur_filer_idx - 1; | 640 | priv->cur_filer_idx = priv->cur_filer_idx - 1; |
| 641 | } | 641 | } |
| @@ -643,8 +643,8 @@ static void ethflow_to_filer_rules (struct gfar_private *priv, u64 ethflow) | |||
| 643 | if (ethflow & (RXH_IP_DST)) { | 643 | if (ethflow & (RXH_IP_DST)) { |
| 644 | fcr = RQFCR_PID_DIA | RQFCR_CMP_NOMATCH | RQFCR_HASH | | 644 | fcr = RQFCR_PID_DIA | RQFCR_CMP_NOMATCH | RQFCR_HASH | |
| 645 | RQFCR_AND | RQFCR_HASHTBL_0; | 645 | RQFCR_AND | RQFCR_HASHTBL_0; |
| 646 | ftp_rqfpr[priv->cur_filer_idx] = fpr; | 646 | priv->ftp_rqfpr[priv->cur_filer_idx] = fpr; |
| 647 | ftp_rqfcr[priv->cur_filer_idx] = fcr; | 647 | priv->ftp_rqfcr[priv->cur_filer_idx] = fcr; |
| 648 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); | 648 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); |
| 649 | priv->cur_filer_idx = priv->cur_filer_idx - 1; | 649 | priv->cur_filer_idx = priv->cur_filer_idx - 1; |
| 650 | } | 650 | } |
| @@ -652,8 +652,8 @@ static void ethflow_to_filer_rules (struct gfar_private *priv, u64 ethflow) | |||
| 652 | if (ethflow & RXH_L3_PROTO) { | 652 | if (ethflow & RXH_L3_PROTO) { |
| 653 | fcr = RQFCR_PID_L4P | RQFCR_CMP_NOMATCH | RQFCR_HASH | | 653 | fcr = RQFCR_PID_L4P | RQFCR_CMP_NOMATCH | RQFCR_HASH | |
| 654 | RQFCR_AND | RQFCR_HASHTBL_0; | 654 | RQFCR_AND | RQFCR_HASHTBL_0; |
| 655 | ftp_rqfpr[priv->cur_filer_idx] = fpr; | 655 | priv->ftp_rqfpr[priv->cur_filer_idx] = fpr; |
| 656 | ftp_rqfcr[priv->cur_filer_idx] = fcr; | 656 | priv->ftp_rqfcr[priv->cur_filer_idx] = fcr; |
| 657 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); | 657 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); |
| 658 | priv->cur_filer_idx = priv->cur_filer_idx - 1; | 658 | priv->cur_filer_idx = priv->cur_filer_idx - 1; |
| 659 | } | 659 | } |
| @@ -661,8 +661,8 @@ static void ethflow_to_filer_rules (struct gfar_private *priv, u64 ethflow) | |||
| 661 | if (ethflow & RXH_L4_B_0_1) { | 661 | if (ethflow & RXH_L4_B_0_1) { |
| 662 | fcr = RQFCR_PID_SPT | RQFCR_CMP_NOMATCH | RQFCR_HASH | | 662 | fcr = RQFCR_PID_SPT | RQFCR_CMP_NOMATCH | RQFCR_HASH | |
| 663 | RQFCR_AND | RQFCR_HASHTBL_0; | 663 | RQFCR_AND | RQFCR_HASHTBL_0; |
| 664 | ftp_rqfpr[priv->cur_filer_idx] = fpr; | 664 | priv->ftp_rqfpr[priv->cur_filer_idx] = fpr; |
| 665 | ftp_rqfcr[priv->cur_filer_idx] = fcr; | 665 | priv->ftp_rqfcr[priv->cur_filer_idx] = fcr; |
| 666 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); | 666 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); |
| 667 | priv->cur_filer_idx = priv->cur_filer_idx - 1; | 667 | priv->cur_filer_idx = priv->cur_filer_idx - 1; |
| 668 | } | 668 | } |
| @@ -670,8 +670,8 @@ static void ethflow_to_filer_rules (struct gfar_private *priv, u64 ethflow) | |||
| 670 | if (ethflow & RXH_L4_B_2_3) { | 670 | if (ethflow & RXH_L4_B_2_3) { |
| 671 | fcr = RQFCR_PID_DPT | RQFCR_CMP_NOMATCH | RQFCR_HASH | | 671 | fcr = RQFCR_PID_DPT | RQFCR_CMP_NOMATCH | RQFCR_HASH | |
| 672 | RQFCR_AND | RQFCR_HASHTBL_0; | 672 | RQFCR_AND | RQFCR_HASHTBL_0; |
| 673 | ftp_rqfpr[priv->cur_filer_idx] = fpr; | 673 | priv->ftp_rqfpr[priv->cur_filer_idx] = fpr; |
| 674 | ftp_rqfcr[priv->cur_filer_idx] = fcr; | 674 | priv->ftp_rqfcr[priv->cur_filer_idx] = fcr; |
| 675 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); | 675 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); |
| 676 | priv->cur_filer_idx = priv->cur_filer_idx - 1; | 676 | priv->cur_filer_idx = priv->cur_filer_idx - 1; |
| 677 | } | 677 | } |
| @@ -705,12 +705,12 @@ static int gfar_ethflow_to_filer_table(struct gfar_private *priv, u64 ethflow, u | |||
| 705 | } | 705 | } |
| 706 | 706 | ||
| 707 | for (i = 0; i < MAX_FILER_IDX + 1; i++) { | 707 | for (i = 0; i < MAX_FILER_IDX + 1; i++) { |
| 708 | local_rqfpr[j] = ftp_rqfpr[i]; | 708 | local_rqfpr[j] = priv->ftp_rqfpr[i]; |
| 709 | local_rqfcr[j] = ftp_rqfcr[i]; | 709 | local_rqfcr[j] = priv->ftp_rqfcr[i]; |
| 710 | j--; | 710 | j--; |
| 711 | if ((ftp_rqfcr[i] == (RQFCR_PID_PARSE | | 711 | if ((priv->ftp_rqfcr[i] == (RQFCR_PID_PARSE | |
| 712 | RQFCR_CLE |RQFCR_AND)) && | 712 | RQFCR_CLE |RQFCR_AND)) && |
| 713 | (ftp_rqfpr[i] == cmp_rqfpr)) | 713 | (priv->ftp_rqfpr[i] == cmp_rqfpr)) |
| 714 | break; | 714 | break; |
| 715 | } | 715 | } |
| 716 | 716 | ||
| @@ -724,20 +724,22 @@ static int gfar_ethflow_to_filer_table(struct gfar_private *priv, u64 ethflow, u | |||
| 724 | * if it was already programmed, we need to overwrite these rules | 724 | * if it was already programmed, we need to overwrite these rules |
| 725 | */ | 725 | */ |
| 726 | for (l = i+1; l < MAX_FILER_IDX; l++) { | 726 | for (l = i+1; l < MAX_FILER_IDX; l++) { |
| 727 | if ((ftp_rqfcr[l] & RQFCR_CLE) && | 727 | if ((priv->ftp_rqfcr[l] & RQFCR_CLE) && |
| 728 | !(ftp_rqfcr[l] & RQFCR_AND)) { | 728 | !(priv->ftp_rqfcr[l] & RQFCR_AND)) { |
| 729 | ftp_rqfcr[l] = RQFCR_CLE | RQFCR_CMP_EXACT | | 729 | priv->ftp_rqfcr[l] = RQFCR_CLE | RQFCR_CMP_EXACT | |
| 730 | RQFCR_HASHTBL_0 | RQFCR_PID_MASK; | 730 | RQFCR_HASHTBL_0 | RQFCR_PID_MASK; |
| 731 | ftp_rqfpr[l] = FPR_FILER_MASK; | 731 | priv->ftp_rqfpr[l] = FPR_FILER_MASK; |
| 732 | gfar_write_filer(priv, l, ftp_rqfcr[l], ftp_rqfpr[l]); | 732 | gfar_write_filer(priv, l, priv->ftp_rqfcr[l], |
| 733 | priv->ftp_rqfpr[l]); | ||
| 733 | break; | 734 | break; |
| 734 | } | 735 | } |
| 735 | 736 | ||
| 736 | if (!(ftp_rqfcr[l] & RQFCR_CLE) && (ftp_rqfcr[l] & RQFCR_AND)) | 737 | if (!(priv->ftp_rqfcr[l] & RQFCR_CLE) && |
| 738 | (priv->ftp_rqfcr[l] & RQFCR_AND)) | ||
| 737 | continue; | 739 | continue; |
| 738 | else { | 740 | else { |
| 739 | local_rqfpr[j] = ftp_rqfpr[l]; | 741 | local_rqfpr[j] = priv->ftp_rqfpr[l]; |
| 740 | local_rqfcr[j] = ftp_rqfcr[l]; | 742 | local_rqfcr[j] = priv->ftp_rqfcr[l]; |
| 741 | j--; | 743 | j--; |
| 742 | } | 744 | } |
| 743 | } | 745 | } |
| @@ -750,8 +752,8 @@ static int gfar_ethflow_to_filer_table(struct gfar_private *priv, u64 ethflow, u | |||
| 750 | 752 | ||
| 751 | /* Write back the popped out rules again */ | 753 | /* Write back the popped out rules again */ |
| 752 | for (k = j+1; k < MAX_FILER_IDX; k++) { | 754 | for (k = j+1; k < MAX_FILER_IDX; k++) { |
| 753 | ftp_rqfpr[priv->cur_filer_idx] = local_rqfpr[k]; | 755 | priv->ftp_rqfpr[priv->cur_filer_idx] = local_rqfpr[k]; |
| 754 | ftp_rqfcr[priv->cur_filer_idx] = local_rqfcr[k]; | 756 | priv->ftp_rqfcr[priv->cur_filer_idx] = local_rqfcr[k]; |
| 755 | gfar_write_filer(priv, priv->cur_filer_idx, | 757 | gfar_write_filer(priv, priv->cur_filer_idx, |
| 756 | local_rqfcr[k], local_rqfpr[k]); | 758 | local_rqfcr[k], local_rqfpr[k]); |
| 757 | if (!priv->cur_filer_idx) | 759 | if (!priv->cur_filer_idx) |
diff --git a/drivers/net/igb/igb_main.c b/drivers/net/igb/igb_main.c index 18fccf913635..2c28621eb30b 100644 --- a/drivers/net/igb/igb_main.c +++ b/drivers/net/igb/igb_main.c | |||
| @@ -2373,6 +2373,9 @@ static int __devinit igb_sw_init(struct igb_adapter *adapter) | |||
| 2373 | } | 2373 | } |
| 2374 | #endif /* CONFIG_PCI_IOV */ | 2374 | #endif /* CONFIG_PCI_IOV */ |
| 2375 | adapter->rss_queues = min_t(u32, IGB_MAX_RX_QUEUES, num_online_cpus()); | 2375 | adapter->rss_queues = min_t(u32, IGB_MAX_RX_QUEUES, num_online_cpus()); |
| 2376 | /* i350 cannot do RSS and SR-IOV at the same time */ | ||
| 2377 | if (hw->mac.type == e1000_i350 && adapter->vfs_allocated_count) | ||
| 2378 | adapter->rss_queues = 1; | ||
| 2376 | 2379 | ||
| 2377 | /* | 2380 | /* |
| 2378 | * if rss_queues > 4 or vfs are going to be allocated with rss_queues | 2381 | * if rss_queues > 4 or vfs are going to be allocated with rss_queues |
diff --git a/drivers/net/qlcnic/qlcnic_hw.c b/drivers/net/qlcnic/qlcnic_hw.c index e9656616f2a2..a5d9fbf9d816 100644 --- a/drivers/net/qlcnic/qlcnic_hw.c +++ b/drivers/net/qlcnic/qlcnic_hw.c | |||
| @@ -1406,6 +1406,7 @@ qlcnic_dump_que(struct qlcnic_adapter *adapter, struct qlcnic_dump_entry *entry, | |||
| 1406 | 1406 | ||
| 1407 | for (loop = 0; loop < que->no_ops; loop++) { | 1407 | for (loop = 0; loop < que->no_ops; loop++) { |
| 1408 | QLCNIC_WR_DUMP_REG(que->sel_addr, base, que_id); | 1408 | QLCNIC_WR_DUMP_REG(que->sel_addr, base, que_id); |
| 1409 | addr = que->read_addr; | ||
| 1409 | for (i = 0; i < cnt; i++) { | 1410 | for (i = 0; i < cnt; i++) { |
| 1410 | QLCNIC_RD_DUMP_REG(addr, base, &data); | 1411 | QLCNIC_RD_DUMP_REG(addr, base, &data); |
| 1411 | *buffer++ = cpu_to_le32(data); | 1412 | *buffer++ = cpu_to_le32(data); |
diff --git a/drivers/net/qlcnic/qlcnic_main.c b/drivers/net/qlcnic/qlcnic_main.c index 3ab7d2c7baf2..0f6af5c61a7c 100644 --- a/drivers/net/qlcnic/qlcnic_main.c +++ b/drivers/net/qlcnic/qlcnic_main.c | |||
| @@ -2159,6 +2159,7 @@ qlcnic_unmap_buffers(struct pci_dev *pdev, struct sk_buff *skb, | |||
| 2159 | 2159 | ||
| 2160 | nf = &pbuf->frag_array[0]; | 2160 | nf = &pbuf->frag_array[0]; |
| 2161 | pci_unmap_single(pdev, nf->dma, skb_headlen(skb), PCI_DMA_TODEVICE); | 2161 | pci_unmap_single(pdev, nf->dma, skb_headlen(skb), PCI_DMA_TODEVICE); |
| 2162 | pbuf->skb = NULL; | ||
| 2162 | } | 2163 | } |
| 2163 | 2164 | ||
| 2164 | static inline void | 2165 | static inline void |
diff --git a/drivers/net/smc91x.c b/drivers/net/smc91x.c index dc4805f473e3..f6285748bd3c 100644 --- a/drivers/net/smc91x.c +++ b/drivers/net/smc91x.c | |||
| @@ -2400,8 +2400,10 @@ static const struct of_device_id smc91x_match[] = { | |||
| 2400 | { .compatible = "smsc,lan91c94", }, | 2400 | { .compatible = "smsc,lan91c94", }, |
| 2401 | { .compatible = "smsc,lan91c111", }, | 2401 | { .compatible = "smsc,lan91c111", }, |
| 2402 | {}, | 2402 | {}, |
| 2403 | } | 2403 | }; |
| 2404 | MODULE_DEVICE_TABLE(of, smc91x_match); | 2404 | MODULE_DEVICE_TABLE(of, smc91x_match); |
| 2405 | #else | ||
| 2406 | #define smc91x_match NULL | ||
| 2405 | #endif | 2407 | #endif |
| 2406 | 2408 | ||
| 2407 | static struct dev_pm_ops smc_drv_pm_ops = { | 2409 | static struct dev_pm_ops smc_drv_pm_ops = { |
| @@ -2416,9 +2418,7 @@ static struct platform_driver smc_driver = { | |||
| 2416 | .name = CARDNAME, | 2418 | .name = CARDNAME, |
| 2417 | .owner = THIS_MODULE, | 2419 | .owner = THIS_MODULE, |
| 2418 | .pm = &smc_drv_pm_ops, | 2420 | .pm = &smc_drv_pm_ops, |
| 2419 | #ifdef CONFIG_OF | ||
| 2420 | .of_match_table = smc91x_match, | 2421 | .of_match_table = smc91x_match, |
| 2421 | #endif | ||
| 2422 | }, | 2422 | }, |
| 2423 | }; | 2423 | }; |
| 2424 | 2424 | ||
diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c index 22047628ccfa..b6c5d3715b96 100644 --- a/drivers/net/wireless/ath/ath5k/base.c +++ b/drivers/net/wireless/ath/ath5k/base.c | |||
| @@ -72,6 +72,11 @@ static int modparam_all_channels; | |||
| 72 | module_param_named(all_channels, modparam_all_channels, bool, S_IRUGO); | 72 | module_param_named(all_channels, modparam_all_channels, bool, S_IRUGO); |
| 73 | MODULE_PARM_DESC(all_channels, "Expose all channels the device can use."); | 73 | MODULE_PARM_DESC(all_channels, "Expose all channels the device can use."); |
| 74 | 74 | ||
| 75 | static int modparam_fastchanswitch; | ||
| 76 | module_param_named(fastchanswitch, modparam_fastchanswitch, bool, S_IRUGO); | ||
| 77 | MODULE_PARM_DESC(fastchanswitch, "Enable fast channel switching for AR2413/AR5413 radios."); | ||
| 78 | |||
| 79 | |||
| 75 | /* Module info */ | 80 | /* Module info */ |
| 76 | MODULE_AUTHOR("Jiri Slaby"); | 81 | MODULE_AUTHOR("Jiri Slaby"); |
| 77 | MODULE_AUTHOR("Nick Kossifidis"); | 82 | MODULE_AUTHOR("Nick Kossifidis"); |
| @@ -2686,6 +2691,7 @@ ath5k_reset(struct ath5k_softc *sc, struct ieee80211_channel *chan, | |||
| 2686 | struct ath5k_hw *ah = sc->ah; | 2691 | struct ath5k_hw *ah = sc->ah; |
| 2687 | struct ath_common *common = ath5k_hw_common(ah); | 2692 | struct ath_common *common = ath5k_hw_common(ah); |
| 2688 | int ret, ani_mode; | 2693 | int ret, ani_mode; |
| 2694 | bool fast; | ||
| 2689 | 2695 | ||
| 2690 | ATH5K_DBG(sc, ATH5K_DEBUG_RESET, "resetting\n"); | 2696 | ATH5K_DBG(sc, ATH5K_DEBUG_RESET, "resetting\n"); |
| 2691 | 2697 | ||
| @@ -2705,7 +2711,10 @@ ath5k_reset(struct ath5k_softc *sc, struct ieee80211_channel *chan, | |||
| 2705 | ath5k_drain_tx_buffs(sc); | 2711 | ath5k_drain_tx_buffs(sc); |
| 2706 | if (chan) | 2712 | if (chan) |
| 2707 | sc->curchan = chan; | 2713 | sc->curchan = chan; |
| 2708 | ret = ath5k_hw_reset(ah, sc->opmode, sc->curchan, chan != NULL, | 2714 | |
| 2715 | fast = ((chan != NULL) && modparam_fastchanswitch) ? 1 : 0; | ||
| 2716 | |||
| 2717 | ret = ath5k_hw_reset(ah, sc->opmode, sc->curchan, fast, | ||
| 2709 | skip_pcu); | 2718 | skip_pcu); |
| 2710 | if (ret) { | 2719 | if (ret) { |
| 2711 | ATH5K_ERR(sc, "can't reset hardware (%d)\n", ret); | 2720 | ATH5K_ERR(sc, "can't reset hardware (%d)\n", ret); |
diff --git a/drivers/net/wireless/ath/ath5k/reset.c b/drivers/net/wireless/ath/ath5k/reset.c index 3510de2cf622..126a4eab35f3 100644 --- a/drivers/net/wireless/ath/ath5k/reset.c +++ b/drivers/net/wireless/ath/ath5k/reset.c | |||
| @@ -1124,8 +1124,11 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum nl80211_iftype op_mode, | |||
| 1124 | /* Non fatal, can happen eg. | 1124 | /* Non fatal, can happen eg. |
| 1125 | * on mode change */ | 1125 | * on mode change */ |
| 1126 | ret = 0; | 1126 | ret = 0; |
| 1127 | } else | 1127 | } else { |
| 1128 | ATH5K_DBG(ah->ah_sc, ATH5K_DEBUG_RESET, | ||
| 1129 | "fast chan change successful\n"); | ||
| 1128 | return 0; | 1130 | return 0; |
| 1131 | } | ||
| 1129 | } | 1132 | } |
| 1130 | 1133 | ||
| 1131 | /* | 1134 | /* |
diff --git a/drivers/net/wireless/iwlegacy/iwl-4965.c b/drivers/net/wireless/iwlegacy/iwl-4965.c index f9db25bb35c3..facc94e74b07 100644 --- a/drivers/net/wireless/iwlegacy/iwl-4965.c +++ b/drivers/net/wireless/iwlegacy/iwl-4965.c | |||
| @@ -1218,10 +1218,10 @@ static int iwl4965_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *c | |||
| 1218 | * receive commit_rxon request | 1218 | * receive commit_rxon request |
| 1219 | * abort any previous channel switch if still in process | 1219 | * abort any previous channel switch if still in process |
| 1220 | */ | 1220 | */ |
| 1221 | if (priv->switch_rxon.switch_in_progress && | 1221 | if (test_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status) && |
| 1222 | (priv->switch_rxon.channel != ctx->staging.channel)) { | 1222 | (priv->switch_channel != ctx->staging.channel)) { |
| 1223 | IWL_DEBUG_11H(priv, "abort channel switch on %d\n", | 1223 | IWL_DEBUG_11H(priv, "abort channel switch on %d\n", |
| 1224 | le16_to_cpu(priv->switch_rxon.channel)); | 1224 | le16_to_cpu(priv->switch_channel)); |
| 1225 | iwl_legacy_chswitch_done(priv, false); | 1225 | iwl_legacy_chswitch_done(priv, false); |
| 1226 | } | 1226 | } |
| 1227 | 1227 | ||
| @@ -1237,7 +1237,7 @@ static int iwl4965_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *c | |||
| 1237 | 1237 | ||
| 1238 | memcpy(active_rxon, &ctx->staging, sizeof(*active_rxon)); | 1238 | memcpy(active_rxon, &ctx->staging, sizeof(*active_rxon)); |
| 1239 | iwl_legacy_print_rx_config_cmd(priv, ctx); | 1239 | iwl_legacy_print_rx_config_cmd(priv, ctx); |
| 1240 | return 0; | 1240 | goto set_tx_power; |
| 1241 | } | 1241 | } |
| 1242 | 1242 | ||
| 1243 | /* If we are currently associated and the new config requires | 1243 | /* If we are currently associated and the new config requires |
| @@ -1317,6 +1317,7 @@ static int iwl4965_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *c | |||
| 1317 | 1317 | ||
| 1318 | iwl4965_init_sensitivity(priv); | 1318 | iwl4965_init_sensitivity(priv); |
| 1319 | 1319 | ||
| 1320 | set_tx_power: | ||
| 1320 | /* If we issue a new RXON command which required a tune then we must | 1321 | /* If we issue a new RXON command which required a tune then we must |
| 1321 | * send a new TXPOWER command or we won't be able to Tx any frames */ | 1322 | * send a new TXPOWER command or we won't be able to Tx any frames */ |
| 1322 | ret = iwl_legacy_set_tx_power(priv, priv->tx_power_next, true); | 1323 | ret = iwl_legacy_set_tx_power(priv, priv->tx_power_next, true); |
| @@ -1403,9 +1404,6 @@ static int iwl4965_hw_channel_switch(struct iwl_priv *priv, | |||
| 1403 | return rc; | 1404 | return rc; |
| 1404 | } | 1405 | } |
| 1405 | 1406 | ||
| 1406 | priv->switch_rxon.channel = cmd.channel; | ||
| 1407 | priv->switch_rxon.switch_in_progress = true; | ||
| 1408 | |||
| 1409 | return iwl_legacy_send_cmd_pdu(priv, | 1407 | return iwl_legacy_send_cmd_pdu(priv, |
| 1410 | REPLY_CHANNEL_SWITCH, sizeof(cmd), &cmd); | 1408 | REPLY_CHANNEL_SWITCH, sizeof(cmd), &cmd); |
| 1411 | } | 1409 | } |
diff --git a/drivers/net/wireless/iwlegacy/iwl-core.c b/drivers/net/wireless/iwlegacy/iwl-core.c index 42df8321dae8..3be76bd5499a 100644 --- a/drivers/net/wireless/iwlegacy/iwl-core.c +++ b/drivers/net/wireless/iwlegacy/iwl-core.c | |||
| @@ -859,12 +859,8 @@ void iwl_legacy_chswitch_done(struct iwl_priv *priv, bool is_success) | |||
| 859 | if (test_bit(STATUS_EXIT_PENDING, &priv->status)) | 859 | if (test_bit(STATUS_EXIT_PENDING, &priv->status)) |
| 860 | return; | 860 | return; |
| 861 | 861 | ||
| 862 | if (priv->switch_rxon.switch_in_progress) { | 862 | if (test_and_clear_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status)) |
| 863 | ieee80211_chswitch_done(ctx->vif, is_success); | 863 | ieee80211_chswitch_done(ctx->vif, is_success); |
| 864 | mutex_lock(&priv->mutex); | ||
| 865 | priv->switch_rxon.switch_in_progress = false; | ||
| 866 | mutex_unlock(&priv->mutex); | ||
| 867 | } | ||
| 868 | } | 864 | } |
| 869 | EXPORT_SYMBOL(iwl_legacy_chswitch_done); | 865 | EXPORT_SYMBOL(iwl_legacy_chswitch_done); |
| 870 | 866 | ||
| @@ -876,19 +872,19 @@ void iwl_legacy_rx_csa(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb) | |||
| 876 | struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS]; | 872 | struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS]; |
| 877 | struct iwl_legacy_rxon_cmd *rxon = (void *)&ctx->active; | 873 | struct iwl_legacy_rxon_cmd *rxon = (void *)&ctx->active; |
| 878 | 874 | ||
| 879 | if (priv->switch_rxon.switch_in_progress) { | 875 | if (!test_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status)) |
| 880 | if (!le32_to_cpu(csa->status) && | 876 | return; |
| 881 | (csa->channel == priv->switch_rxon.channel)) { | 877 | |
| 882 | rxon->channel = csa->channel; | 878 | if (!le32_to_cpu(csa->status) && csa->channel == priv->switch_channel) { |
| 883 | ctx->staging.channel = csa->channel; | 879 | rxon->channel = csa->channel; |
| 884 | IWL_DEBUG_11H(priv, "CSA notif: channel %d\n", | 880 | ctx->staging.channel = csa->channel; |
| 885 | le16_to_cpu(csa->channel)); | 881 | IWL_DEBUG_11H(priv, "CSA notif: channel %d\n", |
| 886 | iwl_legacy_chswitch_done(priv, true); | ||
| 887 | } else { | ||
| 888 | IWL_ERR(priv, "CSA notif (fail) : channel %d\n", | ||
| 889 | le16_to_cpu(csa->channel)); | 882 | le16_to_cpu(csa->channel)); |
| 890 | iwl_legacy_chswitch_done(priv, false); | 883 | iwl_legacy_chswitch_done(priv, true); |
| 891 | } | 884 | } else { |
| 885 | IWL_ERR(priv, "CSA notif (fail) : channel %d\n", | ||
| 886 | le16_to_cpu(csa->channel)); | ||
| 887 | iwl_legacy_chswitch_done(priv, false); | ||
| 892 | } | 888 | } |
| 893 | } | 889 | } |
| 894 | EXPORT_SYMBOL(iwl_legacy_rx_csa); | 890 | EXPORT_SYMBOL(iwl_legacy_rx_csa); |
diff --git a/drivers/net/wireless/iwlegacy/iwl-core.h b/drivers/net/wireless/iwlegacy/iwl-core.h index bc66c604106c..c5fbda0760de 100644 --- a/drivers/net/wireless/iwlegacy/iwl-core.h +++ b/drivers/net/wireless/iwlegacy/iwl-core.h | |||
| @@ -560,7 +560,7 @@ void iwl_legacy_free_geos(struct iwl_priv *priv); | |||
| 560 | #define STATUS_SCAN_HW 15 | 560 | #define STATUS_SCAN_HW 15 |
| 561 | #define STATUS_POWER_PMI 16 | 561 | #define STATUS_POWER_PMI 16 |
| 562 | #define STATUS_FW_ERROR 17 | 562 | #define STATUS_FW_ERROR 17 |
| 563 | 563 | #define STATUS_CHANNEL_SWITCH_PENDING 18 | |
| 564 | 564 | ||
| 565 | static inline int iwl_legacy_is_ready(struct iwl_priv *priv) | 565 | static inline int iwl_legacy_is_ready(struct iwl_priv *priv) |
| 566 | { | 566 | { |
diff --git a/drivers/net/wireless/iwlegacy/iwl-dev.h b/drivers/net/wireless/iwlegacy/iwl-dev.h index be0106c6a2da..ea30122669ee 100644 --- a/drivers/net/wireless/iwlegacy/iwl-dev.h +++ b/drivers/net/wireless/iwlegacy/iwl-dev.h | |||
| @@ -855,17 +855,6 @@ struct traffic_stats { | |||
| 855 | }; | 855 | }; |
| 856 | 856 | ||
| 857 | /* | 857 | /* |
| 858 | * iwl_switch_rxon: "channel switch" structure | ||
| 859 | * | ||
| 860 | * @ switch_in_progress: channel switch in progress | ||
| 861 | * @ channel: new channel | ||
| 862 | */ | ||
| 863 | struct iwl_switch_rxon { | ||
| 864 | bool switch_in_progress; | ||
| 865 | __le16 channel; | ||
| 866 | }; | ||
| 867 | |||
| 868 | /* | ||
| 869 | * schedule the timer to wake up every UCODE_TRACE_PERIOD milliseconds | 858 | * schedule the timer to wake up every UCODE_TRACE_PERIOD milliseconds |
| 870 | * to perform continuous uCode event logging operation if enabled | 859 | * to perform continuous uCode event logging operation if enabled |
| 871 | */ | 860 | */ |
| @@ -1115,7 +1104,7 @@ struct iwl_priv { | |||
| 1115 | 1104 | ||
| 1116 | struct iwl_rxon_context contexts[NUM_IWL_RXON_CTX]; | 1105 | struct iwl_rxon_context contexts[NUM_IWL_RXON_CTX]; |
| 1117 | 1106 | ||
| 1118 | struct iwl_switch_rxon switch_rxon; | 1107 | __le16 switch_channel; |
| 1119 | 1108 | ||
| 1120 | /* 1st responses from initialize and runtime uCode images. | 1109 | /* 1st responses from initialize and runtime uCode images. |
| 1121 | * _4965's initialize alive response contains some calibration data. */ | 1110 | * _4965's initialize alive response contains some calibration data. */ |
diff --git a/drivers/net/wireless/iwlegacy/iwl4965-base.c b/drivers/net/wireless/iwlegacy/iwl4965-base.c index af2ae22fcfd3..7157ba529680 100644 --- a/drivers/net/wireless/iwlegacy/iwl4965-base.c +++ b/drivers/net/wireless/iwlegacy/iwl4965-base.c | |||
| @@ -2861,16 +2861,13 @@ void iwl4965_mac_channel_switch(struct ieee80211_hw *hw, | |||
| 2861 | goto out; | 2861 | goto out; |
| 2862 | 2862 | ||
| 2863 | if (test_bit(STATUS_EXIT_PENDING, &priv->status) || | 2863 | if (test_bit(STATUS_EXIT_PENDING, &priv->status) || |
| 2864 | test_bit(STATUS_SCANNING, &priv->status)) | 2864 | test_bit(STATUS_SCANNING, &priv->status) || |
| 2865 | test_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status)) | ||
| 2865 | goto out; | 2866 | goto out; |
| 2866 | 2867 | ||
| 2867 | if (!iwl_legacy_is_associated_ctx(ctx)) | 2868 | if (!iwl_legacy_is_associated_ctx(ctx)) |
| 2868 | goto out; | 2869 | goto out; |
| 2869 | 2870 | ||
| 2870 | /* channel switch in progress */ | ||
| 2871 | if (priv->switch_rxon.switch_in_progress == true) | ||
| 2872 | goto out; | ||
| 2873 | |||
| 2874 | if (priv->cfg->ops->lib->set_channel_switch) { | 2871 | if (priv->cfg->ops->lib->set_channel_switch) { |
| 2875 | 2872 | ||
| 2876 | ch = channel->hw_value; | 2873 | ch = channel->hw_value; |
| @@ -2919,15 +2916,18 @@ void iwl4965_mac_channel_switch(struct ieee80211_hw *hw, | |||
| 2919 | * at this point, staging_rxon has the | 2916 | * at this point, staging_rxon has the |
| 2920 | * configuration for channel switch | 2917 | * configuration for channel switch |
| 2921 | */ | 2918 | */ |
| 2922 | if (priv->cfg->ops->lib->set_channel_switch(priv, | 2919 | set_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status); |
| 2923 | ch_switch)) | 2920 | priv->switch_channel = cpu_to_le16(ch); |
| 2924 | priv->switch_rxon.switch_in_progress = false; | 2921 | if (priv->cfg->ops->lib->set_channel_switch(priv, ch_switch)) { |
| 2922 | clear_bit(STATUS_CHANNEL_SWITCH_PENDING, | ||
| 2923 | &priv->status); | ||
| 2924 | priv->switch_channel = 0; | ||
| 2925 | ieee80211_chswitch_done(ctx->vif, false); | ||
| 2926 | } | ||
| 2925 | } | 2927 | } |
| 2926 | } | 2928 | } |
| 2927 | out: | 2929 | out: |
| 2928 | mutex_unlock(&priv->mutex); | 2930 | mutex_unlock(&priv->mutex); |
| 2929 | if (!priv->switch_rxon.switch_in_progress) | ||
| 2930 | ieee80211_chswitch_done(ctx->vif, false); | ||
| 2931 | IWL_DEBUG_MAC80211(priv, "leave\n"); | 2931 | IWL_DEBUG_MAC80211(priv, "leave\n"); |
| 2932 | } | 2932 | } |
| 2933 | 2933 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-2000.c b/drivers/net/wireless/iwlwifi/iwl-2000.c index 86feec86d130..2282279cffc4 100644 --- a/drivers/net/wireless/iwlwifi/iwl-2000.c +++ b/drivers/net/wireless/iwlwifi/iwl-2000.c | |||
| @@ -177,79 +177,6 @@ static int iwl2000_hw_set_hw_params(struct iwl_priv *priv) | |||
| 177 | return 0; | 177 | return 0; |
| 178 | } | 178 | } |
| 179 | 179 | ||
| 180 | static int iwl2030_hw_channel_switch(struct iwl_priv *priv, | ||
| 181 | struct ieee80211_channel_switch *ch_switch) | ||
| 182 | { | ||
| 183 | /* | ||
| 184 | * MULTI-FIXME | ||
| 185 | * See iwl_mac_channel_switch. | ||
| 186 | */ | ||
| 187 | struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS]; | ||
| 188 | struct iwl6000_channel_switch_cmd cmd; | ||
| 189 | const struct iwl_channel_info *ch_info; | ||
| 190 | u32 switch_time_in_usec, ucode_switch_time; | ||
| 191 | u16 ch; | ||
| 192 | u32 tsf_low; | ||
| 193 | u8 switch_count; | ||
| 194 | u16 beacon_interval = le16_to_cpu(ctx->timing.beacon_interval); | ||
| 195 | struct ieee80211_vif *vif = ctx->vif; | ||
| 196 | struct iwl_host_cmd hcmd = { | ||
| 197 | .id = REPLY_CHANNEL_SWITCH, | ||
| 198 | .len = { sizeof(cmd), }, | ||
| 199 | .flags = CMD_SYNC, | ||
| 200 | .data = { &cmd, }, | ||
| 201 | }; | ||
| 202 | |||
| 203 | cmd.band = priv->band == IEEE80211_BAND_2GHZ; | ||
| 204 | ch = ch_switch->channel->hw_value; | ||
| 205 | IWL_DEBUG_11H(priv, "channel switch from %u to %u\n", | ||
| 206 | ctx->active.channel, ch); | ||
| 207 | cmd.channel = cpu_to_le16(ch); | ||
| 208 | cmd.rxon_flags = ctx->staging.flags; | ||
| 209 | cmd.rxon_filter_flags = ctx->staging.filter_flags; | ||
| 210 | switch_count = ch_switch->count; | ||
| 211 | tsf_low = ch_switch->timestamp & 0x0ffffffff; | ||
| 212 | /* | ||
| 213 | * calculate the ucode channel switch time | ||
| 214 | * adding TSF as one of the factor for when to switch | ||
| 215 | */ | ||
| 216 | if ((priv->ucode_beacon_time > tsf_low) && beacon_interval) { | ||
| 217 | if (switch_count > ((priv->ucode_beacon_time - tsf_low) / | ||
| 218 | beacon_interval)) { | ||
| 219 | switch_count -= (priv->ucode_beacon_time - | ||
| 220 | tsf_low) / beacon_interval; | ||
| 221 | } else | ||
| 222 | switch_count = 0; | ||
| 223 | } | ||
| 224 | if (switch_count <= 1) | ||
| 225 | cmd.switch_time = cpu_to_le32(priv->ucode_beacon_time); | ||
| 226 | else { | ||
| 227 | switch_time_in_usec = | ||
| 228 | vif->bss_conf.beacon_int * switch_count * TIME_UNIT; | ||
| 229 | ucode_switch_time = iwl_usecs_to_beacons(priv, | ||
| 230 | switch_time_in_usec, | ||
| 231 | beacon_interval); | ||
| 232 | cmd.switch_time = iwl_add_beacon_time(priv, | ||
| 233 | priv->ucode_beacon_time, | ||
| 234 | ucode_switch_time, | ||
| 235 | beacon_interval); | ||
| 236 | } | ||
| 237 | IWL_DEBUG_11H(priv, "uCode time for the switch is 0x%x\n", | ||
| 238 | cmd.switch_time); | ||
| 239 | ch_info = iwl_get_channel_info(priv, priv->band, ch); | ||
| 240 | if (ch_info) | ||
| 241 | cmd.expect_beacon = is_channel_radar(ch_info); | ||
| 242 | else { | ||
| 243 | IWL_ERR(priv, "invalid channel switch from %u to %u\n", | ||
| 244 | ctx->active.channel, ch); | ||
| 245 | return -EFAULT; | ||
| 246 | } | ||
| 247 | priv->switch_rxon.channel = cmd.channel; | ||
| 248 | priv->switch_rxon.switch_in_progress = true; | ||
| 249 | |||
| 250 | return iwl_send_cmd_sync(priv, &hcmd); | ||
| 251 | } | ||
| 252 | |||
| 253 | static struct iwl_lib_ops iwl2000_lib = { | 180 | static struct iwl_lib_ops iwl2000_lib = { |
| 254 | .set_hw_params = iwl2000_hw_set_hw_params, | 181 | .set_hw_params = iwl2000_hw_set_hw_params, |
| 255 | .rx_handler_setup = iwlagn_rx_handler_setup, | 182 | .rx_handler_setup = iwlagn_rx_handler_setup, |
| @@ -258,7 +185,6 @@ static struct iwl_lib_ops iwl2000_lib = { | |||
| 258 | .is_valid_rtc_data_addr = iwlagn_hw_valid_rtc_data_addr, | 185 | .is_valid_rtc_data_addr = iwlagn_hw_valid_rtc_data_addr, |
| 259 | .send_tx_power = iwlagn_send_tx_power, | 186 | .send_tx_power = iwlagn_send_tx_power, |
| 260 | .update_chain_flags = iwl_update_chain_flags, | 187 | .update_chain_flags = iwl_update_chain_flags, |
| 261 | .set_channel_switch = iwl2030_hw_channel_switch, | ||
| 262 | .apm_ops = { | 188 | .apm_ops = { |
| 263 | .init = iwl_apm_init, | 189 | .init = iwl_apm_init, |
| 264 | .config = iwl2000_nic_config, | 190 | .config = iwl2000_nic_config, |
diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c index a70b8cfafda1..f99f9c193352 100644 --- a/drivers/net/wireless/iwlwifi/iwl-5000.c +++ b/drivers/net/wireless/iwlwifi/iwl-5000.c | |||
| @@ -331,8 +331,6 @@ static int iwl5000_hw_channel_switch(struct iwl_priv *priv, | |||
| 331 | ctx->active.channel, ch); | 331 | ctx->active.channel, ch); |
| 332 | return -EFAULT; | 332 | return -EFAULT; |
| 333 | } | 333 | } |
| 334 | priv->switch_rxon.channel = cmd.channel; | ||
| 335 | priv->switch_rxon.switch_in_progress = true; | ||
| 336 | 334 | ||
| 337 | return iwl_send_cmd_sync(priv, &hcmd); | 335 | return iwl_send_cmd_sync(priv, &hcmd); |
| 338 | } | 336 | } |
| @@ -425,7 +423,6 @@ static struct iwl_base_params iwl5000_base_params = { | |||
| 425 | }; | 423 | }; |
| 426 | static struct iwl_ht_params iwl5000_ht_params = { | 424 | static struct iwl_ht_params iwl5000_ht_params = { |
| 427 | .ht_greenfield_support = true, | 425 | .ht_greenfield_support = true, |
| 428 | .use_rts_for_aggregation = true, /* use rts/cts protection */ | ||
| 429 | }; | 426 | }; |
| 430 | 427 | ||
| 431 | #define IWL_DEVICE_5000 \ | 428 | #define IWL_DEVICE_5000 \ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-6000.c b/drivers/net/wireless/iwlwifi/iwl-6000.c index fda6fe08cf91..fbe565c816e3 100644 --- a/drivers/net/wireless/iwlwifi/iwl-6000.c +++ b/drivers/net/wireless/iwlwifi/iwl-6000.c | |||
| @@ -270,8 +270,6 @@ static int iwl6000_hw_channel_switch(struct iwl_priv *priv, | |||
| 270 | ctx->active.channel, ch); | 270 | ctx->active.channel, ch); |
| 271 | return -EFAULT; | 271 | return -EFAULT; |
| 272 | } | 272 | } |
| 273 | priv->switch_rxon.channel = cmd.channel; | ||
| 274 | priv->switch_rxon.switch_in_progress = true; | ||
| 275 | 273 | ||
| 276 | return iwl_send_cmd_sync(priv, &hcmd); | 274 | return iwl_send_cmd_sync(priv, &hcmd); |
| 277 | } | 275 | } |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-hcmd.c b/drivers/net/wireless/iwlwifi/iwl-agn-hcmd.c index b12c72d63ccb..23fa93deae96 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-hcmd.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-hcmd.c | |||
| @@ -163,17 +163,9 @@ static void iwlagn_tx_cmd_protection(struct iwl_priv *priv, | |||
| 163 | __le16 fc, __le32 *tx_flags) | 163 | __le16 fc, __le32 *tx_flags) |
| 164 | { | 164 | { |
| 165 | if (info->control.rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS || | 165 | if (info->control.rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS || |
| 166 | info->control.rates[0].flags & IEEE80211_TX_RC_USE_CTS_PROTECT) { | 166 | info->control.rates[0].flags & IEEE80211_TX_RC_USE_CTS_PROTECT || |
| 167 | info->flags & IEEE80211_TX_CTL_AMPDU) | ||
| 167 | *tx_flags |= TX_CMD_FLG_PROT_REQUIRE_MSK; | 168 | *tx_flags |= TX_CMD_FLG_PROT_REQUIRE_MSK; |
| 168 | return; | ||
| 169 | } | ||
| 170 | |||
| 171 | if (priv->cfg->ht_params && | ||
| 172 | priv->cfg->ht_params->use_rts_for_aggregation && | ||
| 173 | info->flags & IEEE80211_TX_CTL_AMPDU) { | ||
| 174 | *tx_flags |= TX_CMD_FLG_PROT_REQUIRE_MSK; | ||
| 175 | return; | ||
| 176 | } | ||
| 177 | } | 169 | } |
| 178 | 170 | ||
| 179 | /* Calc max signal level (dBm) among 3 possible receivers */ | 171 | /* Calc max signal level (dBm) among 3 possible receivers */ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c b/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c index a95ad84c5377..09f679d6046f 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c | |||
| @@ -325,6 +325,14 @@ int iwlagn_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *ctx) | |||
| 325 | return 0; | 325 | return 0; |
| 326 | } | 326 | } |
| 327 | 327 | ||
| 328 | /* | ||
| 329 | * force CTS-to-self frames protection if RTS-CTS is not preferred | ||
| 330 | * one aggregation protection method | ||
| 331 | */ | ||
| 332 | if (!(priv->cfg->ht_params && | ||
| 333 | priv->cfg->ht_params->use_rts_for_aggregation)) | ||
| 334 | ctx->staging.flags |= RXON_FLG_SELF_CTS_EN; | ||
| 335 | |||
| 328 | if ((ctx->vif && ctx->vif->bss_conf.use_short_slot) || | 336 | if ((ctx->vif && ctx->vif->bss_conf.use_short_slot) || |
| 329 | !(ctx->staging.flags & RXON_FLG_BAND_24G_MSK)) | 337 | !(ctx->staging.flags & RXON_FLG_BAND_24G_MSK)) |
| 330 | ctx->staging.flags |= RXON_FLG_SHORT_SLOT_MSK; | 338 | ctx->staging.flags |= RXON_FLG_SHORT_SLOT_MSK; |
| @@ -342,10 +350,10 @@ int iwlagn_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *ctx) | |||
| 342 | * receive commit_rxon request | 350 | * receive commit_rxon request |
| 343 | * abort any previous channel switch if still in process | 351 | * abort any previous channel switch if still in process |
| 344 | */ | 352 | */ |
| 345 | if (priv->switch_rxon.switch_in_progress && | 353 | if (test_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status) && |
| 346 | (priv->switch_rxon.channel != ctx->staging.channel)) { | 354 | (priv->switch_channel != ctx->staging.channel)) { |
| 347 | IWL_DEBUG_11H(priv, "abort channel switch on %d\n", | 355 | IWL_DEBUG_11H(priv, "abort channel switch on %d\n", |
| 348 | le16_to_cpu(priv->switch_rxon.channel)); | 356 | le16_to_cpu(priv->switch_channel)); |
| 349 | iwl_chswitch_done(priv, false); | 357 | iwl_chswitch_done(priv, false); |
| 350 | } | 358 | } |
| 351 | 359 | ||
| @@ -362,6 +370,11 @@ int iwlagn_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *ctx) | |||
| 362 | } | 370 | } |
| 363 | 371 | ||
| 364 | memcpy(active, &ctx->staging, sizeof(*active)); | 372 | memcpy(active, &ctx->staging, sizeof(*active)); |
| 373 | /* | ||
| 374 | * We do not commit tx power settings while channel changing, | ||
| 375 | * do it now if after settings changed. | ||
| 376 | */ | ||
| 377 | iwl_set_tx_power(priv, priv->tx_power_next, false); | ||
| 365 | return 0; | 378 | return 0; |
| 366 | } | 379 | } |
| 367 | 380 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index a662adcb2adb..8e1942ebd9a0 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | |||
| @@ -2843,16 +2843,13 @@ static void iwlagn_mac_channel_switch(struct ieee80211_hw *hw, | |||
| 2843 | goto out; | 2843 | goto out; |
| 2844 | 2844 | ||
| 2845 | if (test_bit(STATUS_EXIT_PENDING, &priv->status) || | 2845 | if (test_bit(STATUS_EXIT_PENDING, &priv->status) || |
| 2846 | test_bit(STATUS_SCANNING, &priv->status)) | 2846 | test_bit(STATUS_SCANNING, &priv->status) || |
| 2847 | test_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status)) | ||
| 2847 | goto out; | 2848 | goto out; |
| 2848 | 2849 | ||
| 2849 | if (!iwl_is_associated_ctx(ctx)) | 2850 | if (!iwl_is_associated_ctx(ctx)) |
| 2850 | goto out; | 2851 | goto out; |
| 2851 | 2852 | ||
| 2852 | /* channel switch in progress */ | ||
| 2853 | if (priv->switch_rxon.switch_in_progress == true) | ||
| 2854 | goto out; | ||
| 2855 | |||
| 2856 | if (priv->cfg->ops->lib->set_channel_switch) { | 2853 | if (priv->cfg->ops->lib->set_channel_switch) { |
| 2857 | 2854 | ||
| 2858 | ch = channel->hw_value; | 2855 | ch = channel->hw_value; |
| @@ -2901,15 +2898,19 @@ static void iwlagn_mac_channel_switch(struct ieee80211_hw *hw, | |||
| 2901 | * at this point, staging_rxon has the | 2898 | * at this point, staging_rxon has the |
| 2902 | * configuration for channel switch | 2899 | * configuration for channel switch |
| 2903 | */ | 2900 | */ |
| 2901 | set_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status); | ||
| 2902 | priv->switch_channel = cpu_to_le16(ch); | ||
| 2904 | if (priv->cfg->ops->lib->set_channel_switch(priv, | 2903 | if (priv->cfg->ops->lib->set_channel_switch(priv, |
| 2905 | ch_switch)) | 2904 | ch_switch)) { |
| 2906 | priv->switch_rxon.switch_in_progress = false; | 2905 | clear_bit(STATUS_CHANNEL_SWITCH_PENDING, |
| 2906 | &priv->status); | ||
| 2907 | priv->switch_channel = 0; | ||
| 2908 | ieee80211_chswitch_done(ctx->vif, false); | ||
| 2909 | } | ||
| 2907 | } | 2910 | } |
| 2908 | } | 2911 | } |
| 2909 | out: | 2912 | out: |
| 2910 | mutex_unlock(&priv->mutex); | 2913 | mutex_unlock(&priv->mutex); |
| 2911 | if (!priv->switch_rxon.switch_in_progress) | ||
| 2912 | ieee80211_chswitch_done(ctx->vif, false); | ||
| 2913 | IWL_DEBUG_MAC80211(priv, "leave\n"); | 2914 | IWL_DEBUG_MAC80211(priv, "leave\n"); |
| 2914 | } | 2915 | } |
| 2915 | 2916 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c index 4653deada05b..213c80c6a668 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.c +++ b/drivers/net/wireless/iwlwifi/iwl-core.c | |||
| @@ -843,12 +843,8 @@ void iwl_chswitch_done(struct iwl_priv *priv, bool is_success) | |||
| 843 | if (test_bit(STATUS_EXIT_PENDING, &priv->status)) | 843 | if (test_bit(STATUS_EXIT_PENDING, &priv->status)) |
| 844 | return; | 844 | return; |
| 845 | 845 | ||
| 846 | if (priv->switch_rxon.switch_in_progress) { | 846 | if (test_and_clear_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status)) |
| 847 | ieee80211_chswitch_done(ctx->vif, is_success); | 847 | ieee80211_chswitch_done(ctx->vif, is_success); |
| 848 | mutex_lock(&priv->mutex); | ||
| 849 | priv->switch_rxon.switch_in_progress = false; | ||
| 850 | mutex_unlock(&priv->mutex); | ||
| 851 | } | ||
| 852 | } | 848 | } |
| 853 | 849 | ||
| 854 | #ifdef CONFIG_IWLWIFI_DEBUG | 850 | #ifdef CONFIG_IWLWIFI_DEBUG |
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h index 3bb76f6ea410..a54d416ec345 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.h +++ b/drivers/net/wireless/iwlwifi/iwl-core.h | |||
| @@ -560,6 +560,7 @@ void iwlcore_free_geos(struct iwl_priv *priv); | |||
| 560 | #define STATUS_POWER_PMI 16 | 560 | #define STATUS_POWER_PMI 16 |
| 561 | #define STATUS_FW_ERROR 17 | 561 | #define STATUS_FW_ERROR 17 |
| 562 | #define STATUS_DEVICE_ENABLED 18 | 562 | #define STATUS_DEVICE_ENABLED 18 |
| 563 | #define STATUS_CHANNEL_SWITCH_PENDING 19 | ||
| 563 | 564 | ||
| 564 | 565 | ||
| 565 | static inline int iwl_is_ready(struct iwl_priv *priv) | 566 | static inline int iwl_is_ready(struct iwl_priv *priv) |
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h index 22a6e3ec7094..c8de236c141b 100644 --- a/drivers/net/wireless/iwlwifi/iwl-dev.h +++ b/drivers/net/wireless/iwlwifi/iwl-dev.h | |||
| @@ -982,17 +982,6 @@ struct traffic_stats { | |||
| 982 | }; | 982 | }; |
| 983 | 983 | ||
| 984 | /* | 984 | /* |
| 985 | * iwl_switch_rxon: "channel switch" structure | ||
| 986 | * | ||
| 987 | * @ switch_in_progress: channel switch in progress | ||
| 988 | * @ channel: new channel | ||
| 989 | */ | ||
| 990 | struct iwl_switch_rxon { | ||
| 991 | bool switch_in_progress; | ||
| 992 | __le16 channel; | ||
| 993 | }; | ||
| 994 | |||
| 995 | /* | ||
| 996 | * schedule the timer to wake up every UCODE_TRACE_PERIOD milliseconds | 985 | * schedule the timer to wake up every UCODE_TRACE_PERIOD milliseconds |
| 997 | * to perform continuous uCode event logging operation if enabled | 986 | * to perform continuous uCode event logging operation if enabled |
| 998 | */ | 987 | */ |
| @@ -1287,7 +1276,7 @@ struct iwl_priv { | |||
| 1287 | 1276 | ||
| 1288 | struct iwl_rxon_context contexts[NUM_IWL_RXON_CTX]; | 1277 | struct iwl_rxon_context contexts[NUM_IWL_RXON_CTX]; |
| 1289 | 1278 | ||
| 1290 | struct iwl_switch_rxon switch_rxon; | 1279 | __le16 switch_channel; |
| 1291 | 1280 | ||
| 1292 | struct { | 1281 | struct { |
| 1293 | u32 error_event_table; | 1282 | u32 error_event_table; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-rx.c b/drivers/net/wireless/iwlwifi/iwl-rx.c index 0053e9ea9021..b774517aa9fa 100644 --- a/drivers/net/wireless/iwlwifi/iwl-rx.c +++ b/drivers/net/wireless/iwlwifi/iwl-rx.c | |||
| @@ -250,19 +250,19 @@ static void iwl_rx_csa(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb) | |||
| 250 | struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS]; | 250 | struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS]; |
| 251 | struct iwl_rxon_cmd *rxon = (void *)&ctx->active; | 251 | struct iwl_rxon_cmd *rxon = (void *)&ctx->active; |
| 252 | 252 | ||
| 253 | if (priv->switch_rxon.switch_in_progress) { | 253 | if (!test_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status)) |
| 254 | if (!le32_to_cpu(csa->status) && | 254 | return; |
| 255 | (csa->channel == priv->switch_rxon.channel)) { | 255 | |
| 256 | rxon->channel = csa->channel; | 256 | if (!le32_to_cpu(csa->status) && csa->channel == priv->switch_channel) { |
| 257 | ctx->staging.channel = csa->channel; | 257 | rxon->channel = csa->channel; |
| 258 | IWL_DEBUG_11H(priv, "CSA notif: channel %d\n", | 258 | ctx->staging.channel = csa->channel; |
| 259 | le16_to_cpu(csa->channel)); | 259 | IWL_DEBUG_11H(priv, "CSA notif: channel %d\n", |
| 260 | iwl_chswitch_done(priv, true); | ||
| 261 | } else { | ||
| 262 | IWL_ERR(priv, "CSA notif (fail) : channel %d\n", | ||
| 263 | le16_to_cpu(csa->channel)); | 260 | le16_to_cpu(csa->channel)); |
| 264 | iwl_chswitch_done(priv, false); | 261 | iwl_chswitch_done(priv, true); |
| 265 | } | 262 | } else { |
| 263 | IWL_ERR(priv, "CSA notif (fail) : channel %d\n", | ||
| 264 | le16_to_cpu(csa->channel)); | ||
| 265 | iwl_chswitch_done(priv, false); | ||
| 266 | } | 266 | } |
| 267 | } | 267 | } |
| 268 | 268 | ||
diff --git a/drivers/net/wireless/libertas/if_sdio.c b/drivers/net/wireless/libertas/if_sdio.c index a7b5cb0c2753..224e9853c480 100644 --- a/drivers/net/wireless/libertas/if_sdio.c +++ b/drivers/net/wireless/libertas/if_sdio.c | |||
| @@ -907,7 +907,7 @@ static void if_sdio_interrupt(struct sdio_func *func) | |||
| 907 | card = sdio_get_drvdata(func); | 907 | card = sdio_get_drvdata(func); |
| 908 | 908 | ||
| 909 | cause = sdio_readb(card->func, IF_SDIO_H_INT_STATUS, &ret); | 909 | cause = sdio_readb(card->func, IF_SDIO_H_INT_STATUS, &ret); |
| 910 | if (ret) | 910 | if (ret || !cause) |
| 911 | goto out; | 911 | goto out; |
| 912 | 912 | ||
| 913 | lbs_deb_sdio("interrupt: 0x%X\n", (unsigned)cause); | 913 | lbs_deb_sdio("interrupt: 0x%X\n", (unsigned)cause); |
| @@ -1008,10 +1008,6 @@ static int if_sdio_probe(struct sdio_func *func, | |||
| 1008 | if (ret) | 1008 | if (ret) |
| 1009 | goto release; | 1009 | goto release; |
| 1010 | 1010 | ||
| 1011 | ret = sdio_claim_irq(func, if_sdio_interrupt); | ||
| 1012 | if (ret) | ||
| 1013 | goto disable; | ||
| 1014 | |||
| 1015 | /* For 1-bit transfers to the 8686 model, we need to enable the | 1011 | /* For 1-bit transfers to the 8686 model, we need to enable the |
| 1016 | * interrupt flag in the CCCR register. Set the MMC_QUIRK_LENIENT_FN0 | 1012 | * interrupt flag in the CCCR register. Set the MMC_QUIRK_LENIENT_FN0 |
| 1017 | * bit to allow access to non-vendor registers. */ | 1013 | * bit to allow access to non-vendor registers. */ |
| @@ -1083,6 +1079,21 @@ static int if_sdio_probe(struct sdio_func *func, | |||
| 1083 | card->rx_unit = 0; | 1079 | card->rx_unit = 0; |
| 1084 | 1080 | ||
| 1085 | /* | 1081 | /* |
| 1082 | * Set up the interrupt handler late. | ||
| 1083 | * | ||
| 1084 | * If we set it up earlier, the (buggy) hardware generates a spurious | ||
| 1085 | * interrupt, even before the interrupt has been enabled, with | ||
| 1086 | * CCCR_INTx = 0. | ||
| 1087 | * | ||
| 1088 | * We register the interrupt handler late so that we can handle any | ||
| 1089 | * spurious interrupts, and also to avoid generation of that known | ||
| 1090 | * spurious interrupt in the first place. | ||
| 1091 | */ | ||
| 1092 | ret = sdio_claim_irq(func, if_sdio_interrupt); | ||
| 1093 | if (ret) | ||
| 1094 | goto disable; | ||
| 1095 | |||
| 1096 | /* | ||
| 1086 | * Enable interrupts now that everything is set up | 1097 | * Enable interrupts now that everything is set up |
| 1087 | */ | 1098 | */ |
| 1088 | sdio_writeb(func, 0x0f, IF_SDIO_H_INT_MASK, &ret); | 1099 | sdio_writeb(func, 0x0f, IF_SDIO_H_INT_MASK, &ret); |
diff --git a/drivers/net/wireless/rt2x00/rt2x00config.c b/drivers/net/wireless/rt2x00/rt2x00config.c index 555180d8f4aa..b704e5b183d0 100644 --- a/drivers/net/wireless/rt2x00/rt2x00config.c +++ b/drivers/net/wireless/rt2x00/rt2x00config.c | |||
| @@ -250,7 +250,8 @@ void rt2x00lib_config(struct rt2x00_dev *rt2x00dev, | |||
| 250 | if (ieee80211_flags & IEEE80211_CONF_CHANGE_CHANNEL) | 250 | if (ieee80211_flags & IEEE80211_CONF_CHANGE_CHANNEL) |
| 251 | rt2x00link_reset_tuner(rt2x00dev, false); | 251 | rt2x00link_reset_tuner(rt2x00dev, false); |
| 252 | 252 | ||
| 253 | if (test_bit(REQUIRE_PS_AUTOWAKE, &rt2x00dev->cap_flags) && | 253 | if (test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags) && |
| 254 | test_bit(REQUIRE_PS_AUTOWAKE, &rt2x00dev->cap_flags) && | ||
| 254 | (ieee80211_flags & IEEE80211_CONF_CHANGE_PS) && | 255 | (ieee80211_flags & IEEE80211_CONF_CHANGE_PS) && |
| 255 | (conf->flags & IEEE80211_CONF_PS)) { | 256 | (conf->flags & IEEE80211_CONF_PS)) { |
| 256 | beacon_diff = (long)jiffies - (long)rt2x00dev->last_beacon; | 257 | beacon_diff = (long)jiffies - (long)rt2x00dev->last_beacon; |
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c index c018d67aab8e..939821b4af2f 100644 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c | |||
| @@ -146,6 +146,9 @@ static void rt2x00lib_autowakeup(struct work_struct *work) | |||
| 146 | struct rt2x00_dev *rt2x00dev = | 146 | struct rt2x00_dev *rt2x00dev = |
| 147 | container_of(work, struct rt2x00_dev, autowakeup_work.work); | 147 | container_of(work, struct rt2x00_dev, autowakeup_work.work); |
| 148 | 148 | ||
| 149 | if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags)) | ||
| 150 | return; | ||
| 151 | |||
| 149 | if (rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_AWAKE)) | 152 | if (rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_AWAKE)) |
| 150 | ERROR(rt2x00dev, "Device failed to wakeup.\n"); | 153 | ERROR(rt2x00dev, "Device failed to wakeup.\n"); |
| 151 | clear_bit(CONFIG_POWERSAVING, &rt2x00dev->flags); | 154 | clear_bit(CONFIG_POWERSAVING, &rt2x00dev->flags); |
| @@ -1160,6 +1163,7 @@ void rt2x00lib_remove_dev(struct rt2x00_dev *rt2x00dev) | |||
| 1160 | * Stop all work. | 1163 | * Stop all work. |
| 1161 | */ | 1164 | */ |
| 1162 | cancel_work_sync(&rt2x00dev->intf_work); | 1165 | cancel_work_sync(&rt2x00dev->intf_work); |
| 1166 | cancel_delayed_work_sync(&rt2x00dev->autowakeup_work); | ||
| 1163 | if (rt2x00_is_usb(rt2x00dev)) { | 1167 | if (rt2x00_is_usb(rt2x00dev)) { |
| 1164 | del_timer_sync(&rt2x00dev->txstatus_timer); | 1168 | del_timer_sync(&rt2x00dev->txstatus_timer); |
| 1165 | cancel_work_sync(&rt2x00dev->rxdone_work); | 1169 | cancel_work_sync(&rt2x00dev->rxdone_work); |
diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c index 89100e7c553b..9f8ccae93317 100644 --- a/drivers/net/wireless/rtlwifi/pci.c +++ b/drivers/net/wireless/rtlwifi/pci.c | |||
| @@ -669,6 +669,19 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw) | |||
| 669 | &rx_status, | 669 | &rx_status, |
| 670 | (u8 *) pdesc, skb); | 670 | (u8 *) pdesc, skb); |
| 671 | 671 | ||
| 672 | new_skb = dev_alloc_skb(rtlpci->rxbuffersize); | ||
| 673 | if (unlikely(!new_skb)) { | ||
| 674 | RT_TRACE(rtlpriv, (COMP_INTR | COMP_RECV), | ||
| 675 | DBG_DMESG, | ||
| 676 | ("can't alloc skb for rx\n")); | ||
| 677 | goto done; | ||
| 678 | } | ||
| 679 | |||
| 680 | pci_unmap_single(rtlpci->pdev, | ||
| 681 | *((dma_addr_t *) skb->cb), | ||
| 682 | rtlpci->rxbuffersize, | ||
| 683 | PCI_DMA_FROMDEVICE); | ||
| 684 | |||
| 672 | skb_put(skb, rtlpriv->cfg->ops->get_desc((u8 *) pdesc, | 685 | skb_put(skb, rtlpriv->cfg->ops->get_desc((u8 *) pdesc, |
| 673 | false, | 686 | false, |
| 674 | HW_DESC_RXPKT_LEN)); | 687 | HW_DESC_RXPKT_LEN)); |
| @@ -685,22 +698,7 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw) | |||
| 685 | hdr = rtl_get_hdr(skb); | 698 | hdr = rtl_get_hdr(skb); |
| 686 | fc = rtl_get_fc(skb); | 699 | fc = rtl_get_fc(skb); |
| 687 | 700 | ||
| 688 | /* try for new buffer - if allocation fails, drop | 701 | if (!stats.crc && !stats.hwerror) { |
| 689 | * frame and reuse old buffer | ||
| 690 | */ | ||
| 691 | new_skb = dev_alloc_skb(rtlpci->rxbuffersize); | ||
| 692 | if (unlikely(!new_skb)) { | ||
| 693 | RT_TRACE(rtlpriv, (COMP_INTR | COMP_RECV), | ||
| 694 | DBG_DMESG, | ||
| 695 | ("can't alloc skb for rx\n")); | ||
| 696 | goto done; | ||
| 697 | } | ||
| 698 | pci_unmap_single(rtlpci->pdev, | ||
| 699 | *((dma_addr_t *) skb->cb), | ||
| 700 | rtlpci->rxbuffersize, | ||
| 701 | PCI_DMA_FROMDEVICE); | ||
| 702 | |||
| 703 | if (!stats.crc || !stats.hwerror) { | ||
| 704 | memcpy(IEEE80211_SKB_RXCB(skb), &rx_status, | 702 | memcpy(IEEE80211_SKB_RXCB(skb), &rx_status, |
| 705 | sizeof(rx_status)); | 703 | sizeof(rx_status)); |
| 706 | 704 | ||
diff --git a/drivers/pci/Makefile b/drivers/pci/Makefile index c85f744270a5..094308e41be5 100644 --- a/drivers/pci/Makefile +++ b/drivers/pci/Makefile | |||
| @@ -51,6 +51,7 @@ obj-$(CONFIG_X86_VISWS) += setup-irq.o | |||
| 51 | obj-$(CONFIG_MN10300) += setup-bus.o | 51 | obj-$(CONFIG_MN10300) += setup-bus.o |
| 52 | obj-$(CONFIG_MICROBLAZE) += setup-bus.o | 52 | obj-$(CONFIG_MICROBLAZE) += setup-bus.o |
| 53 | obj-$(CONFIG_TILE) += setup-bus.o setup-irq.o | 53 | obj-$(CONFIG_TILE) += setup-bus.o setup-irq.o |
| 54 | obj-$(CONFIG_SPARC_LEON) += setup-bus.o setup-irq.o | ||
| 54 | 55 | ||
| 55 | # | 56 | # |
| 56 | # ACPI Related PCI FW Functions | 57 | # ACPI Related PCI FW Functions |
diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c index 59f17acf7f68..f02c34d26d1b 100644 --- a/drivers/pci/intel-iommu.c +++ b/drivers/pci/intel-iommu.c | |||
| @@ -3388,7 +3388,7 @@ static void __init init_iommu_pm_ops(void) | |||
| 3388 | } | 3388 | } |
| 3389 | 3389 | ||
| 3390 | #else | 3390 | #else |
| 3391 | static inline int init_iommu_pm_ops(void) { } | 3391 | static inline void init_iommu_pm_ops(void) {} |
| 3392 | #endif /* CONFIG_PM */ | 3392 | #endif /* CONFIG_PM */ |
| 3393 | 3393 | ||
| 3394 | /* | 3394 | /* |
diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index f822e13dc04b..ce2aabf5c550 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig | |||
| @@ -1051,4 +1051,13 @@ config RTC_DRV_TILE | |||
| 1051 | Enable support for the Linux driver side of the Tilera | 1051 | Enable support for the Linux driver side of the Tilera |
| 1052 | hypervisor's real-time clock interface. | 1052 | hypervisor's real-time clock interface. |
| 1053 | 1053 | ||
| 1054 | config RTC_DRV_PUV3 | ||
| 1055 | tristate "PKUnity v3 RTC support" | ||
| 1056 | depends on ARCH_PUV3 | ||
| 1057 | help | ||
| 1058 | This enables support for the RTC in the PKUnity-v3 SoCs. | ||
| 1059 | |||
| 1060 | This drive can also be built as a module. If so, the module | ||
| 1061 | will be called rtc-puv3. | ||
| 1062 | |||
| 1054 | endif # RTC_CLASS | 1063 | endif # RTC_CLASS |
diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile index 213d725f16d4..0ffefe877bfa 100644 --- a/drivers/rtc/Makefile +++ b/drivers/rtc/Makefile | |||
| @@ -78,6 +78,7 @@ obj-$(CONFIG_RTC_DRV_PCF50633) += rtc-pcf50633.o | |||
| 78 | obj-$(CONFIG_RTC_DRV_PL030) += rtc-pl030.o | 78 | obj-$(CONFIG_RTC_DRV_PL030) += rtc-pl030.o |
| 79 | obj-$(CONFIG_RTC_DRV_PL031) += rtc-pl031.o | 79 | obj-$(CONFIG_RTC_DRV_PL031) += rtc-pl031.o |
| 80 | obj-$(CONFIG_RTC_DRV_PS3) += rtc-ps3.o | 80 | obj-$(CONFIG_RTC_DRV_PS3) += rtc-ps3.o |
| 81 | obj-$(CONFIG_RTC_DRV_PUV3) += rtc-puv3.o | ||
| 81 | obj-$(CONFIG_RTC_DRV_PXA) += rtc-pxa.o | 82 | obj-$(CONFIG_RTC_DRV_PXA) += rtc-pxa.o |
| 82 | obj-$(CONFIG_RTC_DRV_R9701) += rtc-r9701.o | 83 | obj-$(CONFIG_RTC_DRV_R9701) += rtc-r9701.o |
| 83 | obj-$(CONFIG_RTC_DRV_RP5C01) += rtc-rp5c01.o | 84 | obj-$(CONFIG_RTC_DRV_RP5C01) += rtc-rp5c01.o |
diff --git a/drivers/rtc/rtc-m41t93.c b/drivers/rtc/rtc-m41t93.c index 1a84b3e227d1..7317d3b9a3d5 100644 --- a/drivers/rtc/rtc-m41t93.c +++ b/drivers/rtc/rtc-m41t93.c | |||
| @@ -189,7 +189,7 @@ static int __devinit m41t93_probe(struct spi_device *spi) | |||
| 189 | 189 | ||
| 190 | static int __devexit m41t93_remove(struct spi_device *spi) | 190 | static int __devexit m41t93_remove(struct spi_device *spi) |
| 191 | { | 191 | { |
| 192 | struct rtc_device *rtc = platform_get_drvdata(spi); | 192 | struct rtc_device *rtc = spi_get_drvdata(spi); |
| 193 | 193 | ||
| 194 | if (rtc) | 194 | if (rtc) |
| 195 | rtc_device_unregister(rtc); | 195 | rtc_device_unregister(rtc); |
diff --git a/arch/unicore32/kernel/rtc.c b/drivers/rtc/rtc-puv3.c index 8cad70b3302c..46f14b82f3ab 100644 --- a/arch/unicore32/kernel/rtc.c +++ b/drivers/rtc/rtc-puv3.c | |||
| @@ -1,7 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * linux/arch/unicore32/kernel/rtc.c | 2 | * RTC driver code specific to PKUnity SoC and UniCore ISA |
| 3 | * | ||
| 4 | * Code specific to PKUnity SoC and UniCore ISA | ||
| 5 | * | 3 | * |
| 6 | * Maintained by GUAN Xue-tao <gxt@mprc.pku.edu.cn> | 4 | * Maintained by GUAN Xue-tao <gxt@mprc.pku.edu.cn> |
| 7 | * Copyright (C) 2001-2010 Guan Xuetao | 5 | * Copyright (C) 2001-2010 Guan Xuetao |
| @@ -36,7 +34,6 @@ static int puv3_rtc_tickno = IRQ_RTC; | |||
| 36 | static DEFINE_SPINLOCK(puv3_rtc_pie_lock); | 34 | static DEFINE_SPINLOCK(puv3_rtc_pie_lock); |
| 37 | 35 | ||
| 38 | /* IRQ Handlers */ | 36 | /* IRQ Handlers */ |
| 39 | |||
| 40 | static irqreturn_t puv3_rtc_alarmirq(int irq, void *id) | 37 | static irqreturn_t puv3_rtc_alarmirq(int irq, void *id) |
| 41 | { | 38 | { |
| 42 | struct rtc_device *rdev = id; | 39 | struct rtc_device *rdev = id; |
| @@ -89,7 +86,6 @@ static int puv3_rtc_setpie(struct device *dev, int enabled) | |||
| 89 | } | 86 | } |
| 90 | 87 | ||
| 91 | /* Time read/write */ | 88 | /* Time read/write */ |
| 92 | |||
| 93 | static int puv3_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm) | 89 | static int puv3_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm) |
| 94 | { | 90 | { |
| 95 | rtc_time_to_tm(readl(RTC_RCNR), rtc_tm); | 91 | rtc_time_to_tm(readl(RTC_RCNR), rtc_tm); |
| @@ -196,7 +192,6 @@ static void puv3_rtc_release(struct device *dev) | |||
| 196 | struct rtc_device *rtc_dev = platform_get_drvdata(pdev); | 192 | struct rtc_device *rtc_dev = platform_get_drvdata(pdev); |
| 197 | 193 | ||
| 198 | /* do not clear AIE here, it may be needed for wake */ | 194 | /* do not clear AIE here, it may be needed for wake */ |
| 199 | |||
| 200 | puv3_rtc_setpie(dev, 0); | 195 | puv3_rtc_setpie(dev, 0); |
| 201 | free_irq(puv3_rtc_alarmno, rtc_dev); | 196 | free_irq(puv3_rtc_alarmno, rtc_dev); |
| 202 | free_irq(puv3_rtc_tickno, rtc_dev); | 197 | free_irq(puv3_rtc_tickno, rtc_dev); |
| @@ -218,7 +213,6 @@ static void puv3_rtc_enable(struct platform_device *pdev, int en) | |||
| 218 | writel(readl(RTC_RTSR) & ~RTC_RTSR_HZE, RTC_RTSR); | 213 | writel(readl(RTC_RTSR) & ~RTC_RTSR_HZE, RTC_RTSR); |
| 219 | } else { | 214 | } else { |
| 220 | /* re-enable the device, and check it is ok */ | 215 | /* re-enable the device, and check it is ok */ |
| 221 | |||
| 222 | if ((readl(RTC_RTSR) & RTC_RTSR_HZE) == 0) { | 216 | if ((readl(RTC_RTSR) & RTC_RTSR_HZE) == 0) { |
| 223 | dev_info(&pdev->dev, "rtc disabled, re-enabling\n"); | 217 | dev_info(&pdev->dev, "rtc disabled, re-enabling\n"); |
| 224 | writel(readl(RTC_RTSR) | RTC_RTSR_HZE, RTC_RTSR); | 218 | writel(readl(RTC_RTSR) | RTC_RTSR_HZE, RTC_RTSR); |
| @@ -251,7 +245,6 @@ static int puv3_rtc_probe(struct platform_device *pdev) | |||
| 251 | pr_debug("%s: probe=%p\n", __func__, pdev); | 245 | pr_debug("%s: probe=%p\n", __func__, pdev); |
| 252 | 246 | ||
| 253 | /* find the IRQs */ | 247 | /* find the IRQs */ |
| 254 | |||
| 255 | puv3_rtc_tickno = platform_get_irq(pdev, 1); | 248 | puv3_rtc_tickno = platform_get_irq(pdev, 1); |
| 256 | if (puv3_rtc_tickno < 0) { | 249 | if (puv3_rtc_tickno < 0) { |
| 257 | dev_err(&pdev->dev, "no irq for rtc tick\n"); | 250 | dev_err(&pdev->dev, "no irq for rtc tick\n"); |
| @@ -268,7 +261,6 @@ static int puv3_rtc_probe(struct platform_device *pdev) | |||
| 268 | puv3_rtc_tickno, puv3_rtc_alarmno); | 261 | puv3_rtc_tickno, puv3_rtc_alarmno); |
| 269 | 262 | ||
| 270 | /* get the memory region */ | 263 | /* get the memory region */ |
| 271 | |||
| 272 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 264 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 273 | if (res == NULL) { | 265 | if (res == NULL) { |
| 274 | dev_err(&pdev->dev, "failed to get memory region resource\n"); | 266 | dev_err(&pdev->dev, "failed to get memory region resource\n"); |
| @@ -288,7 +280,6 @@ static int puv3_rtc_probe(struct platform_device *pdev) | |||
| 288 | puv3_rtc_enable(pdev, 1); | 280 | puv3_rtc_enable(pdev, 1); |
| 289 | 281 | ||
| 290 | /* register RTC and exit */ | 282 | /* register RTC and exit */ |
| 291 | |||
| 292 | rtc = rtc_device_register("pkunity", &pdev->dev, &puv3_rtcops, | 283 | rtc = rtc_device_register("pkunity", &pdev->dev, &puv3_rtcops, |
| 293 | THIS_MODULE); | 284 | THIS_MODULE); |
| 294 | 285 | ||
| @@ -315,8 +306,6 @@ static int puv3_rtc_probe(struct platform_device *pdev) | |||
| 315 | 306 | ||
| 316 | #ifdef CONFIG_PM | 307 | #ifdef CONFIG_PM |
| 317 | 308 | ||
| 318 | /* RTC Power management control */ | ||
| 319 | |||
| 320 | static int ticnt_save; | 309 | static int ticnt_save; |
| 321 | 310 | ||
| 322 | static int puv3_rtc_suspend(struct platform_device *pdev, pm_message_t state) | 311 | static int puv3_rtc_suspend(struct platform_device *pdev, pm_message_t state) |
| @@ -368,4 +357,3 @@ module_exit(puv3_rtc_exit); | |||
| 368 | MODULE_DESCRIPTION("RTC Driver for the PKUnity v3 chip"); | 357 | MODULE_DESCRIPTION("RTC Driver for the PKUnity v3 chip"); |
| 369 | MODULE_AUTHOR("Hu Dongliang"); | 358 | MODULE_AUTHOR("Hu Dongliang"); |
| 370 | MODULE_LICENSE("GPL v2"); | 359 | MODULE_LICENSE("GPL v2"); |
| 371 | |||
diff --git a/drivers/spi/amba-pl022.c b/drivers/spi/amba-pl022.c index 6a9e58dd36c7..d18ce9e946d8 100644 --- a/drivers/spi/amba-pl022.c +++ b/drivers/spi/amba-pl022.c | |||
| @@ -1861,6 +1861,7 @@ static int pl022_setup(struct spi_device *spi) | |||
| 1861 | } | 1861 | } |
| 1862 | if ((clk_freq.cpsdvsr < CPSDVR_MIN) | 1862 | if ((clk_freq.cpsdvsr < CPSDVR_MIN) |
| 1863 | || (clk_freq.cpsdvsr > CPSDVR_MAX)) { | 1863 | || (clk_freq.cpsdvsr > CPSDVR_MAX)) { |
| 1864 | status = -EINVAL; | ||
| 1864 | dev_err(&spi->dev, | 1865 | dev_err(&spi->dev, |
| 1865 | "cpsdvsr is configured incorrectly\n"); | 1866 | "cpsdvsr is configured incorrectly\n"); |
| 1866 | goto err_config_params; | 1867 | goto err_config_params; |
diff --git a/drivers/spi/omap2_mcspi.c b/drivers/spi/omap2_mcspi.c index 6f86ba0175ac..969cdd2fe124 100644 --- a/drivers/spi/omap2_mcspi.c +++ b/drivers/spi/omap2_mcspi.c | |||
| @@ -298,7 +298,7 @@ omap2_mcspi_txrx_dma(struct spi_device *spi, struct spi_transfer *xfer) | |||
| 298 | unsigned int count, c; | 298 | unsigned int count, c; |
| 299 | unsigned long base, tx_reg, rx_reg; | 299 | unsigned long base, tx_reg, rx_reg; |
| 300 | int word_len, data_type, element_count; | 300 | int word_len, data_type, element_count; |
| 301 | int elements; | 301 | int elements = 0; |
| 302 | u32 l; | 302 | u32 l; |
| 303 | u8 * rx; | 303 | u8 * rx; |
| 304 | const u8 * tx; | 304 | const u8 * tx; |
diff --git a/drivers/ssb/driver_pcicore.c b/drivers/ssb/driver_pcicore.c index 82feb348c8bb..2a20dabec76d 100644 --- a/drivers/ssb/driver_pcicore.c +++ b/drivers/ssb/driver_pcicore.c | |||
| @@ -539,10 +539,12 @@ void ssb_pcicore_init(struct ssb_pcicore *pc) | |||
| 539 | if (!pc->hostmode) | 539 | if (!pc->hostmode) |
| 540 | ssb_pcicore_init_clientmode(pc); | 540 | ssb_pcicore_init_clientmode(pc); |
| 541 | 541 | ||
| 542 | /* Additional always once-executed workarounds */ | 542 | /* Additional PCIe always once-executed workarounds */ |
| 543 | ssb_pcicore_serdes_workaround(pc); | 543 | if (dev->id.coreid == SSB_DEV_PCIE) { |
| 544 | /* TODO: ASPM */ | 544 | ssb_pcicore_serdes_workaround(pc); |
| 545 | /* TODO: Clock Request Update */ | 545 | /* TODO: ASPM */ |
| 546 | /* TODO: Clock Request Update */ | ||
| 547 | } | ||
| 546 | } | 548 | } |
| 547 | 549 | ||
| 548 | static u32 ssb_pcie_read(struct ssb_pcicore *pc, u32 address) | 550 | static u32 ssb_pcie_read(struct ssb_pcicore *pc, u32 address) |
diff --git a/drivers/staging/Kconfig b/drivers/staging/Kconfig index dfc16f955eb8..196284dc2f36 100644 --- a/drivers/staging/Kconfig +++ b/drivers/staging/Kconfig | |||
| @@ -24,23 +24,6 @@ menuconfig STAGING | |||
| 24 | 24 | ||
| 25 | if STAGING | 25 | if STAGING |
| 26 | 26 | ||
| 27 | config STAGING_EXCLUDE_BUILD | ||
| 28 | bool "Exclude Staging drivers from being built" if STAGING | ||
| 29 | default y | ||
| 30 | ---help--- | ||
| 31 | Are you sure you really want to build the staging drivers? | ||
| 32 | They taint your kernel, don't live up to the normal Linux | ||
| 33 | kernel quality standards, are a bit crufty around the edges, | ||
| 34 | and might go off and kick your dog when you aren't paying | ||
| 35 | attention. | ||
| 36 | |||
| 37 | Say N here to be able to select and build the Staging drivers. | ||
| 38 | This option is primarily here to prevent them from being built | ||
| 39 | when selecting 'make allyesconfg' and 'make allmodconfig' so | ||
| 40 | don't be all that put off, your dog will be just fine. | ||
| 41 | |||
| 42 | if !STAGING_EXCLUDE_BUILD | ||
| 43 | |||
| 44 | source "drivers/staging/tty/Kconfig" | 27 | source "drivers/staging/tty/Kconfig" |
| 45 | 28 | ||
| 46 | source "drivers/staging/generic_serial/Kconfig" | 29 | source "drivers/staging/generic_serial/Kconfig" |
| @@ -177,5 +160,4 @@ source "drivers/staging/mei/Kconfig" | |||
| 177 | 160 | ||
| 178 | source "drivers/staging/nvec/Kconfig" | 161 | source "drivers/staging/nvec/Kconfig" |
| 179 | 162 | ||
| 180 | endif # !STAGING_EXCLUDE_BUILD | ||
| 181 | endif # STAGING | 163 | endif # STAGING |
diff --git a/drivers/staging/altera-stapl/altera-jtag.c b/drivers/staging/altera-stapl/altera-jtag.c index 876308858b82..8b1620b1b2d0 100644 --- a/drivers/staging/altera-stapl/altera-jtag.c +++ b/drivers/staging/altera-stapl/altera-jtag.c | |||
| @@ -26,7 +26,7 @@ | |||
| 26 | #include <linux/delay.h> | 26 | #include <linux/delay.h> |
| 27 | #include <linux/firmware.h> | 27 | #include <linux/firmware.h> |
| 28 | #include <linux/slab.h> | 28 | #include <linux/slab.h> |
| 29 | #include <staging/altera.h> | 29 | #include "altera.h" |
| 30 | #include "altera-exprt.h" | 30 | #include "altera-exprt.h" |
| 31 | #include "altera-jtag.h" | 31 | #include "altera-jtag.h" |
| 32 | 32 | ||
diff --git a/drivers/staging/altera-stapl/altera.c b/drivers/staging/altera-stapl/altera.c index 05aad351b120..9cd5e76880c0 100644 --- a/drivers/staging/altera-stapl/altera.c +++ b/drivers/staging/altera-stapl/altera.c | |||
| @@ -28,7 +28,7 @@ | |||
| 28 | #include <linux/string.h> | 28 | #include <linux/string.h> |
| 29 | #include <linux/firmware.h> | 29 | #include <linux/firmware.h> |
| 30 | #include <linux/slab.h> | 30 | #include <linux/slab.h> |
| 31 | #include <staging/altera.h> | 31 | #include "altera.h" |
| 32 | #include "altera-exprt.h" | 32 | #include "altera-exprt.h" |
| 33 | #include "altera-jtag.h" | 33 | #include "altera-jtag.h" |
| 34 | 34 | ||
diff --git a/include/staging/altera.h b/drivers/staging/altera-stapl/altera.h index 94c0c6181daf..94c0c6181daf 100644 --- a/include/staging/altera.h +++ b/drivers/staging/altera-stapl/altera.h | |||
diff --git a/drivers/staging/ath6kl/Kconfig b/drivers/staging/ath6kl/Kconfig index 1f15e1fb1ab2..afd6cc16a2b8 100644 --- a/drivers/staging/ath6kl/Kconfig +++ b/drivers/staging/ath6kl/Kconfig | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | config ATH6K_LEGACY | 1 | config ATH6K_LEGACY |
| 2 | tristate "Atheros AR6003 support (non mac80211)" | 2 | tristate "Atheros AR6003 support (non mac80211)" |
| 3 | depends on MMC && WLAN | 3 | depends on MMC && WLAN |
| 4 | depends on CFG80211 | ||
| 4 | select WIRELESS_EXT | 5 | select WIRELESS_EXT |
| 5 | select WEXT_PRIV | 6 | select WEXT_PRIV |
| 6 | help | 7 | help |
diff --git a/drivers/staging/ath6kl/os/linux/cfg80211.c b/drivers/staging/ath6kl/os/linux/cfg80211.c index 77dfb4070c1d..d3a774dbb7e8 100644 --- a/drivers/staging/ath6kl/os/linux/cfg80211.c +++ b/drivers/staging/ath6kl/os/linux/cfg80211.c | |||
| @@ -870,7 +870,8 @@ ar6k_cfg80211_scanComplete_event(struct ar6_softc *ar, int status) | |||
| 870 | if(ar->scan_request) | 870 | if(ar->scan_request) |
| 871 | { | 871 | { |
| 872 | /* Translate data to cfg80211 mgmt format */ | 872 | /* Translate data to cfg80211 mgmt format */ |
| 873 | wmi_iterate_nodes(ar->arWmi, ar6k_cfg80211_scan_node, ar->wdev->wiphy); | 873 | if (ar->arWmi) |
| 874 | wmi_iterate_nodes(ar->arWmi, ar6k_cfg80211_scan_node, ar->wdev->wiphy); | ||
| 874 | 875 | ||
| 875 | cfg80211_scan_done(ar->scan_request, | 876 | cfg80211_scan_done(ar->scan_request, |
| 876 | ((status & A_ECANCELED) || (status & A_EBUSY)) ? true : false); | 877 | ((status & A_ECANCELED) || (status & A_EBUSY)) ? true : false); |
diff --git a/drivers/staging/brcm80211/brcmfmac/wl_iw.c b/drivers/staging/brcm80211/brcmfmac/wl_iw.c index 929ceaf363be..15e1b05ca92d 100644 --- a/drivers/staging/brcm80211/brcmfmac/wl_iw.c +++ b/drivers/staging/brcm80211/brcmfmac/wl_iw.c | |||
| @@ -64,8 +64,6 @@ wl_iw_extra_params_t g_wl_iw_params; | |||
| 64 | extern bool wl_iw_conn_status_str(u32 event_type, u32 status, | 64 | extern bool wl_iw_conn_status_str(u32 event_type, u32 status, |
| 65 | u32 reason, char *stringBuf, uint buflen); | 65 | u32 reason, char *stringBuf, uint buflen); |
| 66 | 66 | ||
| 67 | uint wl_msg_level = WL_ERROR_VAL; | ||
| 68 | |||
| 69 | #define MAX_WLIW_IOCTL_LEN 1024 | 67 | #define MAX_WLIW_IOCTL_LEN 1024 |
| 70 | 68 | ||
| 71 | #ifdef CONFIG_WIRELESS_EXT | 69 | #ifdef CONFIG_WIRELESS_EXT |
diff --git a/drivers/staging/gma500/psb_drv.c b/drivers/staging/gma500/psb_drv.c index 1c45c11a774e..aa87b1b6a44a 100644 --- a/drivers/staging/gma500/psb_drv.c +++ b/drivers/staging/gma500/psb_drv.c | |||
| @@ -542,6 +542,8 @@ static int psb_driver_load(struct drm_device *dev, unsigned long chipset) | |||
| 542 | unsigned long irqflags; | 542 | unsigned long irqflags; |
| 543 | int ret = -ENOMEM; | 543 | int ret = -ENOMEM; |
| 544 | uint32_t tt_pages; | 544 | uint32_t tt_pages; |
| 545 | struct drm_connector *connector; | ||
| 546 | struct psb_intel_output *psb_intel_output; | ||
| 545 | 547 | ||
| 546 | dev_priv = kzalloc(sizeof(*dev_priv), GFP_KERNEL); | 548 | dev_priv = kzalloc(sizeof(*dev_priv), GFP_KERNEL); |
| 547 | if (dev_priv == NULL) | 549 | if (dev_priv == NULL) |
| @@ -663,7 +665,18 @@ static int psb_driver_load(struct drm_device *dev, unsigned long chipset) | |||
| 663 | drm_kms_helper_poll_init(dev); | 665 | drm_kms_helper_poll_init(dev); |
| 664 | } | 666 | } |
| 665 | 667 | ||
| 666 | ret = psb_backlight_init(dev); | 668 | /* Only add backlight support if we have LVDS output */ |
| 669 | list_for_each_entry(connector, &dev->mode_config.connector_list, | ||
| 670 | head) { | ||
| 671 | psb_intel_output = to_psb_intel_output(connector); | ||
| 672 | |||
| 673 | switch (psb_intel_output->type) { | ||
| 674 | case INTEL_OUTPUT_LVDS: | ||
| 675 | ret = psb_backlight_init(dev); | ||
| 676 | break; | ||
| 677 | } | ||
| 678 | } | ||
| 679 | |||
| 667 | if (ret) | 680 | if (ret) |
| 668 | return ret; | 681 | return ret; |
| 669 | #if 0 | 682 | #if 0 |
diff --git a/drivers/staging/gma500/psb_fb.c b/drivers/staging/gma500/psb_fb.c index 99c03a2e06bd..084c36bbfe86 100644 --- a/drivers/staging/gma500/psb_fb.c +++ b/drivers/staging/gma500/psb_fb.c | |||
| @@ -441,6 +441,16 @@ static int psbfb_create(struct psb_fbdev *fbdev, | |||
| 441 | info->screen_size = size; | 441 | info->screen_size = size; |
| 442 | memset(info->screen_base, 0, size); | 442 | memset(info->screen_base, 0, size); |
| 443 | 443 | ||
| 444 | if (dev_priv->pg->stolen_size) { | ||
| 445 | info->apertures = alloc_apertures(1); | ||
| 446 | if (!info->apertures) { | ||
| 447 | ret = -ENOMEM; | ||
| 448 | goto out_err0; | ||
| 449 | } | ||
| 450 | info->apertures->ranges[0].base = dev->mode_config.fb_base; | ||
| 451 | info->apertures->ranges[0].size = dev_priv->pg->stolen_size; | ||
| 452 | } | ||
| 453 | |||
| 444 | drm_fb_helper_fill_fix(info, fb->pitch, fb->depth); | 454 | drm_fb_helper_fill_fix(info, fb->pitch, fb->depth); |
| 445 | drm_fb_helper_fill_var(info, &fbdev->psb_fb_helper, | 455 | drm_fb_helper_fill_var(info, &fbdev->psb_fb_helper, |
| 446 | sizes->fb_width, sizes->fb_height); | 456 | sizes->fb_width, sizes->fb_height); |
diff --git a/drivers/staging/gma500/psb_intel_bios.c b/drivers/staging/gma500/psb_intel_bios.c index 48ac8ba7f40b..417965da5e24 100644 --- a/drivers/staging/gma500/psb_intel_bios.c +++ b/drivers/staging/gma500/psb_intel_bios.c | |||
| @@ -154,10 +154,15 @@ static void parse_lfp_panel_data(struct drm_psb_private *dev_priv, | |||
| 154 | 154 | ||
| 155 | fill_detail_timing_data(panel_fixed_mode, dvo_timing); | 155 | fill_detail_timing_data(panel_fixed_mode, dvo_timing); |
| 156 | 156 | ||
| 157 | dev_priv->lfp_lvds_vbt_mode = panel_fixed_mode; | 157 | if (panel_fixed_mode->htotal > 0 && panel_fixed_mode->vtotal > 0) { |
| 158 | 158 | dev_priv->lfp_lvds_vbt_mode = panel_fixed_mode; | |
| 159 | DRM_DEBUG("Found panel mode in BIOS VBT tables:\n"); | 159 | DRM_DEBUG("Found panel mode in BIOS VBT tables:\n"); |
| 160 | drm_mode_debug_printmodeline(panel_fixed_mode); | 160 | drm_mode_debug_printmodeline(panel_fixed_mode); |
| 161 | } else { | ||
| 162 | DRM_DEBUG("Ignoring bogus LVDS VBT mode.\n"); | ||
| 163 | dev_priv->lvds_vbt = 0; | ||
| 164 | kfree(panel_fixed_mode); | ||
| 165 | } | ||
| 161 | 166 | ||
| 162 | return; | 167 | return; |
| 163 | } | 168 | } |
diff --git a/drivers/staging/iio/dac/max517.c b/drivers/staging/iio/dac/max517.c index 881768df47a6..2fe34d21b6aa 100644 --- a/drivers/staging/iio/dac/max517.c +++ b/drivers/staging/iio/dac/max517.c | |||
| @@ -195,7 +195,7 @@ static const struct iio_info max517_info = { | |||
| 195 | }; | 195 | }; |
| 196 | 196 | ||
| 197 | static const struct iio_info max518_info = { | 197 | static const struct iio_info max518_info = { |
| 198 | .attrs = &max517_attribute_group, | 198 | .attrs = &max518_attribute_group, |
| 199 | .driver_module = THIS_MODULE, | 199 | .driver_module = THIS_MODULE, |
| 200 | }; | 200 | }; |
| 201 | 201 | ||
diff --git a/drivers/staging/iio/imu/adis16400_ring.c b/drivers/staging/iio/imu/adis16400_ring.c index 2589a7e167e4..3612373ddede 100644 --- a/drivers/staging/iio/imu/adis16400_ring.c +++ b/drivers/staging/iio/imu/adis16400_ring.c | |||
| @@ -137,13 +137,13 @@ static irqreturn_t adis16400_trigger_handler(int irq, void *p) | |||
| 137 | if (st->variant->flags & ADIS16400_NO_BURST) { | 137 | if (st->variant->flags & ADIS16400_NO_BURST) { |
| 138 | ret = adis16350_spi_read_all(&indio_dev->dev, st->rx); | 138 | ret = adis16350_spi_read_all(&indio_dev->dev, st->rx); |
| 139 | if (ret < 0) | 139 | if (ret < 0) |
| 140 | return ret; | 140 | goto err; |
| 141 | for (; i < ring->scan_count; i++) | 141 | for (; i < ring->scan_count; i++) |
| 142 | data[i] = *(s16 *)(st->rx + i*2); | 142 | data[i] = *(s16 *)(st->rx + i*2); |
| 143 | } else { | 143 | } else { |
| 144 | ret = adis16400_spi_read_burst(&indio_dev->dev, st->rx); | 144 | ret = adis16400_spi_read_burst(&indio_dev->dev, st->rx); |
| 145 | if (ret < 0) | 145 | if (ret < 0) |
| 146 | return ret; | 146 | goto err; |
| 147 | for (; i < indio_dev->ring->scan_count; i++) { | 147 | for (; i < indio_dev->ring->scan_count; i++) { |
| 148 | j = __ffs(mask); | 148 | j = __ffs(mask); |
| 149 | mask &= ~(1 << j); | 149 | mask &= ~(1 << j); |
| @@ -158,9 +158,13 @@ static irqreturn_t adis16400_trigger_handler(int irq, void *p) | |||
| 158 | ring->access->store_to(indio_dev->ring, (u8 *) data, pf->timestamp); | 158 | ring->access->store_to(indio_dev->ring, (u8 *) data, pf->timestamp); |
| 159 | 159 | ||
| 160 | iio_trigger_notify_done(indio_dev->trig); | 160 | iio_trigger_notify_done(indio_dev->trig); |
| 161 | kfree(data); | ||
| 162 | 161 | ||
| 162 | kfree(data); | ||
| 163 | return IRQ_HANDLED; | 163 | return IRQ_HANDLED; |
| 164 | |||
| 165 | err: | ||
| 166 | kfree(data); | ||
| 167 | return ret; | ||
| 164 | } | 168 | } |
| 165 | 169 | ||
| 166 | void adis16400_unconfigure_ring(struct iio_dev *indio_dev) | 170 | void adis16400_unconfigure_ring(struct iio_dev *indio_dev) |
diff --git a/drivers/staging/iio/industrialio-trigger.c b/drivers/staging/iio/industrialio-trigger.c index 615902333fb0..d504aa251ced 100644 --- a/drivers/staging/iio/industrialio-trigger.c +++ b/drivers/staging/iio/industrialio-trigger.c | |||
| @@ -294,6 +294,7 @@ struct iio_poll_func | |||
| 294 | pf->h = h; | 294 | pf->h = h; |
| 295 | pf->thread = thread; | 295 | pf->thread = thread; |
| 296 | pf->type = type; | 296 | pf->type = type; |
| 297 | pf->private_data = private; | ||
| 297 | 298 | ||
| 298 | return pf; | 299 | return pf; |
| 299 | } | 300 | } |
diff --git a/drivers/staging/mei/init.c b/drivers/staging/mei/init.c index 2818851c0761..d1ffa32cd141 100644 --- a/drivers/staging/mei/init.c +++ b/drivers/staging/mei/init.c | |||
| @@ -205,10 +205,10 @@ int mei_hw_init(struct mei_device *dev) | |||
| 205 | "host_hw_state = 0x%08x, me_hw_state = 0x%08x.\n", | 205 | "host_hw_state = 0x%08x, me_hw_state = 0x%08x.\n", |
| 206 | dev->host_hw_state, dev->me_hw_state); | 206 | dev->host_hw_state, dev->me_hw_state); |
| 207 | 207 | ||
| 208 | if (!(dev->host_hw_state & H_RDY) != H_RDY) | 208 | if (!(dev->host_hw_state & H_RDY)) |
| 209 | dev_dbg(&dev->pdev->dev, "host turn off H_RDY.\n"); | 209 | dev_dbg(&dev->pdev->dev, "host turn off H_RDY.\n"); |
| 210 | 210 | ||
| 211 | if (!(dev->me_hw_state & ME_RDY_HRA) != ME_RDY_HRA) | 211 | if (!(dev->me_hw_state & ME_RDY_HRA)) |
| 212 | dev_dbg(&dev->pdev->dev, "ME turn off ME_RDY.\n"); | 212 | dev_dbg(&dev->pdev->dev, "ME turn off ME_RDY.\n"); |
| 213 | 213 | ||
| 214 | printk(KERN_ERR "mei: link layer initialization failed.\n"); | 214 | printk(KERN_ERR "mei: link layer initialization failed.\n"); |
diff --git a/drivers/staging/olpc_dcon/Kconfig b/drivers/staging/olpc_dcon/Kconfig index b05306766870..fe40e0b6f675 100644 --- a/drivers/staging/olpc_dcon/Kconfig +++ b/drivers/staging/olpc_dcon/Kconfig | |||
| @@ -2,6 +2,7 @@ config FB_OLPC_DCON | |||
| 2 | tristate "One Laptop Per Child Display CONtroller support" | 2 | tristate "One Laptop Per Child Display CONtroller support" |
| 3 | depends on OLPC && FB | 3 | depends on OLPC && FB |
| 4 | select I2C | 4 | select I2C |
| 5 | select BACKLIGHT_CLASS_DEVICE | ||
| 5 | ---help--- | 6 | ---help--- |
| 6 | Add support for the OLPC XO DCON controller. This controller is | 7 | Add support for the OLPC XO DCON controller. This controller is |
| 7 | only available on OLPC platforms. Unless you have one of these | 8 | only available on OLPC platforms. Unless you have one of these |
diff --git a/drivers/staging/rts_pstor/sd.c b/drivers/staging/rts_pstor/sd.c index bddb0312b31e..cdae497d5467 100644 --- a/drivers/staging/rts_pstor/sd.c +++ b/drivers/staging/rts_pstor/sd.c | |||
| @@ -2328,7 +2328,7 @@ Switch_Fail: | |||
| 2328 | 2328 | ||
| 2329 | retval = sd_send_cmd_get_rsp(chip, IO_SEND_OP_COND, 0, SD_RSP_TYPE_R4, rsp, 5); | 2329 | retval = sd_send_cmd_get_rsp(chip, IO_SEND_OP_COND, 0, SD_RSP_TYPE_R4, rsp, 5); |
| 2330 | if (retval == STATUS_SUCCESS) { | 2330 | if (retval == STATUS_SUCCESS) { |
| 2331 | int func_num = (rsp[1] >> 4) && 0x07; | 2331 | int func_num = (rsp[1] >> 4) & 0x07; |
| 2332 | if (func_num) { | 2332 | if (func_num) { |
| 2333 | RTSX_DEBUGP("SD_IO card (Function number: %d)!\n", func_num); | 2333 | RTSX_DEBUGP("SD_IO card (Function number: %d)!\n", func_num); |
| 2334 | chip->sd_io = 1; | 2334 | chip->sd_io = 1; |
diff --git a/drivers/staging/usbip/stub_dev.c b/drivers/staging/usbip/stub_dev.c index 6e99ec87fee0..8cbea42b69bc 100644 --- a/drivers/staging/usbip/stub_dev.c +++ b/drivers/staging/usbip/stub_dev.c | |||
| @@ -26,6 +26,8 @@ | |||
| 26 | static int stub_probe(struct usb_interface *interface, | 26 | static int stub_probe(struct usb_interface *interface, |
| 27 | const struct usb_device_id *id); | 27 | const struct usb_device_id *id); |
| 28 | static void stub_disconnect(struct usb_interface *interface); | 28 | static void stub_disconnect(struct usb_interface *interface); |
| 29 | static int stub_pre_reset(struct usb_interface *interface); | ||
| 30 | static int stub_post_reset(struct usb_interface *interface); | ||
| 29 | 31 | ||
| 30 | /* | 32 | /* |
| 31 | * Define device IDs here if you want to explicitly limit exportable devices. | 33 | * Define device IDs here if you want to explicitly limit exportable devices. |
| @@ -59,6 +61,8 @@ struct usb_driver stub_driver = { | |||
| 59 | .probe = stub_probe, | 61 | .probe = stub_probe, |
| 60 | .disconnect = stub_disconnect, | 62 | .disconnect = stub_disconnect, |
| 61 | .id_table = stub_table, | 63 | .id_table = stub_table, |
| 64 | .pre_reset = stub_pre_reset, | ||
| 65 | .post_reset = stub_post_reset, | ||
| 62 | }; | 66 | }; |
| 63 | 67 | ||
| 64 | /* | 68 | /* |
| @@ -541,3 +545,20 @@ static void stub_disconnect(struct usb_interface *interface) | |||
| 541 | del_match_busid((char *)udev_busid); | 545 | del_match_busid((char *)udev_busid); |
| 542 | } | 546 | } |
| 543 | } | 547 | } |
| 548 | |||
| 549 | /* | ||
| 550 | * Presence of pre_reset and post_reset prevents the driver from being unbound | ||
| 551 | * when the device is being reset | ||
| 552 | */ | ||
| 553 | |||
| 554 | int stub_pre_reset(struct usb_interface *interface) | ||
| 555 | { | ||
| 556 | dev_dbg(&interface->dev, "pre_reset\n"); | ||
| 557 | return 0; | ||
| 558 | } | ||
| 559 | |||
| 560 | int stub_post_reset(struct usb_interface *interface) | ||
| 561 | { | ||
| 562 | dev_dbg(&interface->dev, "post_reset\n"); | ||
| 563 | return 0; | ||
| 564 | } | ||
diff --git a/drivers/staging/usbip/stub_rx.c b/drivers/staging/usbip/stub_rx.c index a5c1fa1f0430..bc57844600b9 100644 --- a/drivers/staging/usbip/stub_rx.c +++ b/drivers/staging/usbip/stub_rx.c | |||
| @@ -175,16 +175,18 @@ static int tweak_reset_device_cmd(struct urb *urb) | |||
| 175 | dev_info(&urb->dev->dev, "usb_queue_reset_device\n"); | 175 | dev_info(&urb->dev->dev, "usb_queue_reset_device\n"); |
| 176 | 176 | ||
| 177 | /* | 177 | /* |
| 178 | * usb_lock_device_for_reset caused a deadlock: it causes the driver | 178 | * With the implementation of pre_reset and post_reset the driver no |
| 179 | * to unbind. In the shutdown the rx thread is signalled to shut down | 179 | * longer unbinds. This allows the use of synchronous reset. |
| 180 | * but this thread is pending in the usb_lock_device_for_reset. | ||
| 181 | * | ||
| 182 | * Instead queue the reset. | ||
| 183 | * | ||
| 184 | * Unfortunatly an existing usbip connection will be dropped due to | ||
| 185 | * driver unbinding. | ||
| 186 | */ | 180 | */ |
| 187 | usb_queue_reset_device(sdev->interface); | 181 | |
| 182 | if (usb_lock_device_for_reset(sdev->udev, sdev->interface)<0) | ||
| 183 | { | ||
| 184 | dev_err(&urb->dev->dev, "could not obtain lock to reset device\n"); | ||
| 185 | return 0; | ||
| 186 | } | ||
| 187 | usb_reset_device(sdev->udev); | ||
| 188 | usb_unlock_device(sdev->udev); | ||
| 189 | |||
| 188 | return 0; | 190 | return 0; |
| 189 | } | 191 | } |
| 190 | 192 | ||
diff --git a/drivers/tty/tty_buffer.c b/drivers/tty/tty_buffer.c index f1a7918d71aa..6c9b7cd6778a 100644 --- a/drivers/tty/tty_buffer.c +++ b/drivers/tty/tty_buffer.c | |||
| @@ -413,8 +413,7 @@ static void flush_to_ldisc(struct work_struct *work) | |||
| 413 | spin_lock_irqsave(&tty->buf.lock, flags); | 413 | spin_lock_irqsave(&tty->buf.lock, flags); |
| 414 | 414 | ||
| 415 | if (!test_and_set_bit(TTY_FLUSHING, &tty->flags)) { | 415 | if (!test_and_set_bit(TTY_FLUSHING, &tty->flags)) { |
| 416 | struct tty_buffer *head, *tail = tty->buf.tail; | 416 | struct tty_buffer *head; |
| 417 | int seen_tail = 0; | ||
| 418 | while ((head = tty->buf.head) != NULL) { | 417 | while ((head = tty->buf.head) != NULL) { |
| 419 | int count; | 418 | int count; |
| 420 | char *char_buf; | 419 | char *char_buf; |
| @@ -424,15 +423,6 @@ static void flush_to_ldisc(struct work_struct *work) | |||
| 424 | if (!count) { | 423 | if (!count) { |
| 425 | if (head->next == NULL) | 424 | if (head->next == NULL) |
| 426 | break; | 425 | break; |
| 427 | /* | ||
| 428 | There's a possibility tty might get new buffer | ||
| 429 | added during the unlock window below. We could | ||
| 430 | end up spinning in here forever hogging the CPU | ||
| 431 | completely. To avoid this let's have a rest each | ||
| 432 | time we processed the tail buffer. | ||
| 433 | */ | ||
| 434 | if (tail == head) | ||
| 435 | seen_tail = 1; | ||
| 436 | tty->buf.head = head->next; | 426 | tty->buf.head = head->next; |
| 437 | tty_buffer_free(tty, head); | 427 | tty_buffer_free(tty, head); |
| 438 | continue; | 428 | continue; |
| @@ -442,7 +432,7 @@ static void flush_to_ldisc(struct work_struct *work) | |||
| 442 | line discipline as we want to empty the queue */ | 432 | line discipline as we want to empty the queue */ |
| 443 | if (test_bit(TTY_FLUSHPENDING, &tty->flags)) | 433 | if (test_bit(TTY_FLUSHPENDING, &tty->flags)) |
| 444 | break; | 434 | break; |
| 445 | if (!tty->receive_room || seen_tail) | 435 | if (!tty->receive_room) |
| 446 | break; | 436 | break; |
| 447 | if (count > tty->receive_room) | 437 | if (count > tty->receive_room) |
| 448 | count = tty->receive_room; | 438 | count = tty->receive_room; |
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index 395a347f2ebb..dac7676ce21b 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c | |||
| @@ -1530,6 +1530,8 @@ static const struct usb_device_id acm_ids[] = { | |||
| 1530 | { NOKIA_PCSUITE_ACM_INFO(0x04ce), }, /* Nokia E90 */ | 1530 | { NOKIA_PCSUITE_ACM_INFO(0x04ce), }, /* Nokia E90 */ |
| 1531 | { NOKIA_PCSUITE_ACM_INFO(0x01d4), }, /* Nokia E55 */ | 1531 | { NOKIA_PCSUITE_ACM_INFO(0x01d4), }, /* Nokia E55 */ |
| 1532 | { NOKIA_PCSUITE_ACM_INFO(0x0302), }, /* Nokia N8 */ | 1532 | { NOKIA_PCSUITE_ACM_INFO(0x0302), }, /* Nokia N8 */ |
| 1533 | { NOKIA_PCSUITE_ACM_INFO(0x0335), }, /* Nokia E7 */ | ||
| 1534 | { NOKIA_PCSUITE_ACM_INFO(0x03cd), }, /* Nokia C7 */ | ||
| 1533 | { SAMSUNG_PCSUITE_ACM_INFO(0x6651), }, /* Samsung GTi8510 (INNOV8) */ | 1535 | { SAMSUNG_PCSUITE_ACM_INFO(0x6651), }, /* Samsung GTi8510 (INNOV8) */ |
| 1534 | 1536 | ||
| 1535 | /* NOTE: non-Nokia COMM/ACM/0xff is likely MSFT RNDIS... NOT a modem! */ | 1537 | /* NOTE: non-Nokia COMM/ACM/0xff is likely MSFT RNDIS... NOT a modem! */ |
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 79a58c3a2e2a..90ae1753dda1 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
| @@ -339,7 +339,8 @@ static int get_hub_status(struct usb_device *hdev, | |||
| 339 | { | 339 | { |
| 340 | int i, status = -ETIMEDOUT; | 340 | int i, status = -ETIMEDOUT; |
| 341 | 341 | ||
| 342 | for (i = 0; i < USB_STS_RETRIES && status == -ETIMEDOUT; i++) { | 342 | for (i = 0; i < USB_STS_RETRIES && |
| 343 | (status == -ETIMEDOUT || status == -EPIPE); i++) { | ||
| 343 | status = usb_control_msg(hdev, usb_rcvctrlpipe(hdev, 0), | 344 | status = usb_control_msg(hdev, usb_rcvctrlpipe(hdev, 0), |
| 344 | USB_REQ_GET_STATUS, USB_DIR_IN | USB_RT_HUB, 0, 0, | 345 | USB_REQ_GET_STATUS, USB_DIR_IN | USB_RT_HUB, 0, 0, |
| 345 | data, sizeof(*data), USB_STS_TIMEOUT); | 346 | data, sizeof(*data), USB_STS_TIMEOUT); |
| @@ -355,7 +356,8 @@ static int get_port_status(struct usb_device *hdev, int port1, | |||
| 355 | { | 356 | { |
| 356 | int i, status = -ETIMEDOUT; | 357 | int i, status = -ETIMEDOUT; |
| 357 | 358 | ||
| 358 | for (i = 0; i < USB_STS_RETRIES && status == -ETIMEDOUT; i++) { | 359 | for (i = 0; i < USB_STS_RETRIES && |
| 360 | (status == -ETIMEDOUT || status == -EPIPE); i++) { | ||
| 359 | status = usb_control_msg(hdev, usb_rcvctrlpipe(hdev, 0), | 361 | status = usb_control_msg(hdev, usb_rcvctrlpipe(hdev, 0), |
| 360 | USB_REQ_GET_STATUS, USB_DIR_IN | USB_RT_PORT, 0, port1, | 362 | USB_REQ_GET_STATUS, USB_DIR_IN | USB_RT_PORT, 0, port1, |
| 361 | data, sizeof(*data), USB_STS_TIMEOUT); | 363 | data, sizeof(*data), USB_STS_TIMEOUT); |
diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig index 58456d1aec21..029e288805b6 100644 --- a/drivers/usb/gadget/Kconfig +++ b/drivers/usb/gadget/Kconfig | |||
| @@ -632,13 +632,10 @@ config USB_DUMMY_HCD | |||
| 632 | 632 | ||
| 633 | endchoice | 633 | endchoice |
| 634 | 634 | ||
| 635 | # Selected by UDC drivers that support high-speed operation. | ||
| 635 | config USB_GADGET_DUALSPEED | 636 | config USB_GADGET_DUALSPEED |
| 636 | bool | 637 | bool |
| 637 | depends on USB_GADGET | 638 | depends on USB_GADGET |
| 638 | default n | ||
| 639 | help | ||
| 640 | Means that gadget drivers should include extra descriptors | ||
| 641 | and code to handle dual-speed controllers. | ||
| 642 | 639 | ||
| 643 | # | 640 | # |
| 644 | # USB Gadget Drivers | 641 | # USB Gadget Drivers |
diff --git a/drivers/usb/gadget/amd5536udc.c b/drivers/usb/gadget/amd5536udc.c index 6e42aab75806..95e8138cd48f 100644 --- a/drivers/usb/gadget/amd5536udc.c +++ b/drivers/usb/gadget/amd5536udc.c | |||
| @@ -60,6 +60,7 @@ | |||
| 60 | #include <linux/device.h> | 60 | #include <linux/device.h> |
| 61 | #include <linux/io.h> | 61 | #include <linux/io.h> |
| 62 | #include <linux/irq.h> | 62 | #include <linux/irq.h> |
| 63 | #include <linux/prefetch.h> | ||
| 63 | 64 | ||
| 64 | #include <asm/byteorder.h> | 65 | #include <asm/byteorder.h> |
| 65 | #include <asm/system.h> | 66 | #include <asm/system.h> |
diff --git a/drivers/usb/gadget/at91_udc.c b/drivers/usb/gadget/at91_udc.c index 41dc093c0a1b..f4690ffcb489 100644 --- a/drivers/usb/gadget/at91_udc.c +++ b/drivers/usb/gadget/at91_udc.c | |||
| @@ -38,6 +38,7 @@ | |||
| 38 | #include <linux/clk.h> | 38 | #include <linux/clk.h> |
| 39 | #include <linux/usb/ch9.h> | 39 | #include <linux/usb/ch9.h> |
| 40 | #include <linux/usb/gadget.h> | 40 | #include <linux/usb/gadget.h> |
| 41 | #include <linux/prefetch.h> | ||
| 41 | 42 | ||
| 42 | #include <asm/byteorder.h> | 43 | #include <asm/byteorder.h> |
| 43 | #include <mach/hardware.h> | 44 | #include <mach/hardware.h> |
diff --git a/drivers/usb/gadget/dummy_hcd.c b/drivers/usb/gadget/dummy_hcd.c index 61ff927928ab..d3dcabc1a5fc 100644 --- a/drivers/usb/gadget/dummy_hcd.c +++ b/drivers/usb/gadget/dummy_hcd.c | |||
| @@ -1906,6 +1906,7 @@ static int dummy_hcd_probe(struct platform_device *pdev) | |||
| 1906 | if (!hcd) | 1906 | if (!hcd) |
| 1907 | return -ENOMEM; | 1907 | return -ENOMEM; |
| 1908 | the_controller = hcd_to_dummy (hcd); | 1908 | the_controller = hcd_to_dummy (hcd); |
| 1909 | hcd->has_tt = 1; | ||
| 1909 | 1910 | ||
| 1910 | retval = usb_add_hcd(hcd, 0, 0); | 1911 | retval = usb_add_hcd(hcd, 0, 0); |
| 1911 | if (retval != 0) { | 1912 | if (retval != 0) { |
diff --git a/drivers/usb/gadget/inode.c b/drivers/usb/gadget/inode.c index a01383f71f38..a56876aaf76c 100644 --- a/drivers/usb/gadget/inode.c +++ b/drivers/usb/gadget/inode.c | |||
| @@ -431,8 +431,10 @@ ep_write (struct file *fd, const char __user *buf, size_t len, loff_t *ptr) | |||
| 431 | 431 | ||
| 432 | /* halt any endpoint by doing a "wrong direction" i/o call */ | 432 | /* halt any endpoint by doing a "wrong direction" i/o call */ |
| 433 | if (!usb_endpoint_dir_in(&data->desc)) { | 433 | if (!usb_endpoint_dir_in(&data->desc)) { |
| 434 | if (usb_endpoint_xfer_isoc(&data->desc)) | 434 | if (usb_endpoint_xfer_isoc(&data->desc)) { |
| 435 | mutex_unlock(&data->lock); | ||
| 435 | return -EINVAL; | 436 | return -EINVAL; |
| 437 | } | ||
| 436 | DBG (data->dev, "%s halt\n", data->name); | 438 | DBG (data->dev, "%s halt\n", data->name); |
| 437 | spin_lock_irq (&data->dev->lock); | 439 | spin_lock_irq (&data->dev->lock); |
| 438 | if (likely (data->ep != NULL)) | 440 | if (likely (data->ep != NULL)) |
diff --git a/drivers/usb/gadget/mv_udc_core.c b/drivers/usb/gadget/mv_udc_core.c index b62b2640deb0..b1a8146b9d50 100644 --- a/drivers/usb/gadget/mv_udc_core.c +++ b/drivers/usb/gadget/mv_udc_core.c | |||
| @@ -2083,7 +2083,7 @@ out: | |||
| 2083 | } | 2083 | } |
| 2084 | 2084 | ||
| 2085 | #ifdef CONFIG_PM | 2085 | #ifdef CONFIG_PM |
| 2086 | static int mv_udc_suspend(struct platform_device *_dev, pm_message_t state) | 2086 | static int mv_udc_suspend(struct device *_dev) |
| 2087 | { | 2087 | { |
| 2088 | struct mv_udc *udc = the_controller; | 2088 | struct mv_udc *udc = the_controller; |
| 2089 | 2089 | ||
| @@ -2092,7 +2092,7 @@ static int mv_udc_suspend(struct platform_device *_dev, pm_message_t state) | |||
| 2092 | return 0; | 2092 | return 0; |
| 2093 | } | 2093 | } |
| 2094 | 2094 | ||
| 2095 | static int mv_udc_resume(struct platform_device *_dev) | 2095 | static int mv_udc_resume(struct device *_dev) |
| 2096 | { | 2096 | { |
| 2097 | struct mv_udc *udc = the_controller; | 2097 | struct mv_udc *udc = the_controller; |
| 2098 | int retval; | 2098 | int retval; |
| @@ -2100,7 +2100,7 @@ static int mv_udc_resume(struct platform_device *_dev) | |||
| 2100 | retval = mv_udc_phy_init(udc->phy_regs); | 2100 | retval = mv_udc_phy_init(udc->phy_regs); |
| 2101 | if (retval) { | 2101 | if (retval) { |
| 2102 | dev_err(_dev, "phy initialization error %d\n", retval); | 2102 | dev_err(_dev, "phy initialization error %d\n", retval); |
| 2103 | goto error; | 2103 | return retval; |
| 2104 | } | 2104 | } |
| 2105 | udc_reset(udc); | 2105 | udc_reset(udc); |
| 2106 | ep0_reset(udc); | 2106 | ep0_reset(udc); |
| @@ -2122,7 +2122,7 @@ static struct platform_driver udc_driver = { | |||
| 2122 | .owner = THIS_MODULE, | 2122 | .owner = THIS_MODULE, |
| 2123 | .name = "pxa-u2o", | 2123 | .name = "pxa-u2o", |
| 2124 | #ifdef CONFIG_PM | 2124 | #ifdef CONFIG_PM |
| 2125 | .pm = mv_udc_pm_ops, | 2125 | .pm = &mv_udc_pm_ops, |
| 2126 | #endif | 2126 | #endif |
| 2127 | }, | 2127 | }, |
| 2128 | }; | 2128 | }; |
diff --git a/drivers/usb/gadget/net2280.c b/drivers/usb/gadget/net2280.c index 24696f7fa6a9..476d88e1ae97 100644 --- a/drivers/usb/gadget/net2280.c +++ b/drivers/usb/gadget/net2280.c | |||
| @@ -63,6 +63,7 @@ | |||
| 63 | #include <linux/device.h> | 63 | #include <linux/device.h> |
| 64 | #include <linux/usb/ch9.h> | 64 | #include <linux/usb/ch9.h> |
| 65 | #include <linux/usb/gadget.h> | 65 | #include <linux/usb/gadget.h> |
| 66 | #include <linux/prefetch.h> | ||
| 66 | 67 | ||
| 67 | #include <asm/byteorder.h> | 68 | #include <asm/byteorder.h> |
| 68 | #include <asm/io.h> | 69 | #include <asm/io.h> |
diff --git a/drivers/usb/gadget/pxa25x_udc.c b/drivers/usb/gadget/pxa25x_udc.c index 365c02fc25fc..774545494cf2 100644 --- a/drivers/usb/gadget/pxa25x_udc.c +++ b/drivers/usb/gadget/pxa25x_udc.c | |||
| @@ -2216,7 +2216,6 @@ static int __init pxa25x_udc_probe(struct platform_device *pdev) | |||
| 2216 | if (retval != 0) { | 2216 | if (retval != 0) { |
| 2217 | pr_err("%s: can't get irq %i, err %d\n", | 2217 | pr_err("%s: can't get irq %i, err %d\n", |
| 2218 | driver_name, LUBBOCK_USB_DISC_IRQ, retval); | 2218 | driver_name, LUBBOCK_USB_DISC_IRQ, retval); |
| 2219 | lubbock_fail0: | ||
| 2220 | goto err_irq_lub; | 2219 | goto err_irq_lub; |
| 2221 | } | 2220 | } |
| 2222 | retval = request_irq(LUBBOCK_USB_IRQ, | 2221 | retval = request_irq(LUBBOCK_USB_IRQ, |
| @@ -2226,7 +2225,6 @@ lubbock_fail0: | |||
| 2226 | if (retval != 0) { | 2225 | if (retval != 0) { |
| 2227 | pr_err("%s: can't get irq %i, err %d\n", | 2226 | pr_err("%s: can't get irq %i, err %d\n", |
| 2228 | driver_name, LUBBOCK_USB_IRQ, retval); | 2227 | driver_name, LUBBOCK_USB_IRQ, retval); |
| 2229 | free_irq(LUBBOCK_USB_DISC_IRQ, dev); | ||
| 2230 | goto lubbock_fail0; | 2228 | goto lubbock_fail0; |
| 2231 | } | 2229 | } |
| 2232 | } else | 2230 | } else |
| @@ -2236,10 +2234,11 @@ lubbock_fail0: | |||
| 2236 | return 0; | 2234 | return 0; |
| 2237 | 2235 | ||
| 2238 | #ifdef CONFIG_ARCH_LUBBOCK | 2236 | #ifdef CONFIG_ARCH_LUBBOCK |
| 2237 | lubbock_fail0: | ||
| 2239 | free_irq(LUBBOCK_USB_DISC_IRQ, dev); | 2238 | free_irq(LUBBOCK_USB_DISC_IRQ, dev); |
| 2240 | err_irq_lub: | 2239 | err_irq_lub: |
| 2241 | #endif | ||
| 2242 | free_irq(irq, dev); | 2240 | free_irq(irq, dev); |
| 2241 | #endif | ||
| 2243 | err_irq1: | 2242 | err_irq1: |
| 2244 | if (gpio_is_valid(dev->mach->gpio_pullup)) | 2243 | if (gpio_is_valid(dev->mach->gpio_pullup)) |
| 2245 | gpio_free(dev->mach->gpio_pullup); | 2244 | gpio_free(dev->mach->gpio_pullup); |
diff --git a/drivers/usb/gadget/s3c-hsotg.c b/drivers/usb/gadget/s3c-hsotg.c index acb9cc418df9..0dfee282878a 100644 --- a/drivers/usb/gadget/s3c-hsotg.c +++ b/drivers/usb/gadget/s3c-hsotg.c | |||
| @@ -2680,9 +2680,9 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver, | |||
| 2680 | 2680 | ||
| 2681 | writel(0, hsotg->regs + S3C_DAINTMSK); | 2681 | writel(0, hsotg->regs + S3C_DAINTMSK); |
| 2682 | 2682 | ||
| 2683 | dev_info(hsotg->dev, "EP0: DIEPCTL0=0x%08x, DOEPCTL0=0x%08x\n", | 2683 | dev_dbg(hsotg->dev, "EP0: DIEPCTL0=0x%08x, DOEPCTL0=0x%08x\n", |
| 2684 | readl(hsotg->regs + S3C_DIEPCTL0), | 2684 | readl(hsotg->regs + S3C_DIEPCTL0), |
| 2685 | readl(hsotg->regs + S3C_DOEPCTL0)); | 2685 | readl(hsotg->regs + S3C_DOEPCTL0)); |
| 2686 | 2686 | ||
| 2687 | /* enable in and out endpoint interrupts */ | 2687 | /* enable in and out endpoint interrupts */ |
| 2688 | s3c_hsotg_en_gsint(hsotg, S3C_GINTSTS_OEPInt | S3C_GINTSTS_IEPInt); | 2688 | s3c_hsotg_en_gsint(hsotg, S3C_GINTSTS_OEPInt | S3C_GINTSTS_IEPInt); |
| @@ -2701,7 +2701,7 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver, | |||
| 2701 | udelay(10); /* see openiboot */ | 2701 | udelay(10); /* see openiboot */ |
| 2702 | __bic32(hsotg->regs + S3C_DCTL, S3C_DCTL_PWROnPrgDone); | 2702 | __bic32(hsotg->regs + S3C_DCTL, S3C_DCTL_PWROnPrgDone); |
| 2703 | 2703 | ||
| 2704 | dev_info(hsotg->dev, "DCTL=0x%08x\n", readl(hsotg->regs + S3C_DCTL)); | 2704 | dev_dbg(hsotg->dev, "DCTL=0x%08x\n", readl(hsotg->regs + S3C_DCTL)); |
| 2705 | 2705 | ||
| 2706 | /* S3C_DxEPCTL_USBActEp says RO in manual, but seems to be set by | 2706 | /* S3C_DxEPCTL_USBActEp says RO in manual, but seems to be set by |
| 2707 | writing to the EPCTL register.. */ | 2707 | writing to the EPCTL register.. */ |
| @@ -2721,9 +2721,9 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver, | |||
| 2721 | 2721 | ||
| 2722 | s3c_hsotg_enqueue_setup(hsotg); | 2722 | s3c_hsotg_enqueue_setup(hsotg); |
| 2723 | 2723 | ||
| 2724 | dev_info(hsotg->dev, "EP0: DIEPCTL0=0x%08x, DOEPCTL0=0x%08x\n", | 2724 | dev_dbg(hsotg->dev, "EP0: DIEPCTL0=0x%08x, DOEPCTL0=0x%08x\n", |
| 2725 | readl(hsotg->regs + S3C_DIEPCTL0), | 2725 | readl(hsotg->regs + S3C_DIEPCTL0), |
| 2726 | readl(hsotg->regs + S3C_DOEPCTL0)); | 2726 | readl(hsotg->regs + S3C_DOEPCTL0)); |
| 2727 | 2727 | ||
| 2728 | /* clear global NAKs */ | 2728 | /* clear global NAKs */ |
| 2729 | writel(S3C_DCTL_CGOUTNak | S3C_DCTL_CGNPInNAK, | 2729 | writel(S3C_DCTL_CGOUTNak | S3C_DCTL_CGNPInNAK, |
| @@ -2921,9 +2921,9 @@ static void s3c_hsotg_init(struct s3c_hsotg *hsotg) | |||
| 2921 | 2921 | ||
| 2922 | /* setup fifos */ | 2922 | /* setup fifos */ |
| 2923 | 2923 | ||
| 2924 | dev_info(hsotg->dev, "GRXFSIZ=0x%08x, GNPTXFSIZ=0x%08x\n", | 2924 | dev_dbg(hsotg->dev, "GRXFSIZ=0x%08x, GNPTXFSIZ=0x%08x\n", |
| 2925 | readl(hsotg->regs + S3C_GRXFSIZ), | 2925 | readl(hsotg->regs + S3C_GRXFSIZ), |
| 2926 | readl(hsotg->regs + S3C_GNPTXFSIZ)); | 2926 | readl(hsotg->regs + S3C_GNPTXFSIZ)); |
| 2927 | 2927 | ||
| 2928 | s3c_hsotg_init_fifo(hsotg); | 2928 | s3c_hsotg_init_fifo(hsotg); |
| 2929 | 2929 | ||
| @@ -2945,6 +2945,7 @@ static void s3c_hsotg_init(struct s3c_hsotg *hsotg) | |||
| 2945 | 2945 | ||
| 2946 | static void s3c_hsotg_dump(struct s3c_hsotg *hsotg) | 2946 | static void s3c_hsotg_dump(struct s3c_hsotg *hsotg) |
| 2947 | { | 2947 | { |
| 2948 | #ifdef DEBUG | ||
| 2948 | struct device *dev = hsotg->dev; | 2949 | struct device *dev = hsotg->dev; |
| 2949 | void __iomem *regs = hsotg->regs; | 2950 | void __iomem *regs = hsotg->regs; |
| 2950 | u32 val; | 2951 | u32 val; |
| @@ -2987,6 +2988,7 @@ static void s3c_hsotg_dump(struct s3c_hsotg *hsotg) | |||
| 2987 | 2988 | ||
| 2988 | dev_info(dev, "DVBUSDIS=0x%08x, DVBUSPULSE=%08x\n", | 2989 | dev_info(dev, "DVBUSDIS=0x%08x, DVBUSPULSE=%08x\n", |
| 2989 | readl(regs + S3C_DVBUSDIS), readl(regs + S3C_DVBUSPULSE)); | 2990 | readl(regs + S3C_DVBUSDIS), readl(regs + S3C_DVBUSPULSE)); |
| 2991 | #endif | ||
| 2990 | } | 2992 | } |
| 2991 | 2993 | ||
| 2992 | 2994 | ||
diff --git a/drivers/usb/gadget/s3c-hsudc.c b/drivers/usb/gadget/s3c-hsudc.c index cfe3cf56d6bd..d5e3e1e58626 100644 --- a/drivers/usb/gadget/s3c-hsudc.c +++ b/drivers/usb/gadget/s3c-hsudc.c | |||
| @@ -26,6 +26,7 @@ | |||
| 26 | #include <linux/clk.h> | 26 | #include <linux/clk.h> |
| 27 | #include <linux/usb/ch9.h> | 27 | #include <linux/usb/ch9.h> |
| 28 | #include <linux/usb/gadget.h> | 28 | #include <linux/usb/gadget.h> |
| 29 | #include <linux/prefetch.h> | ||
| 29 | 30 | ||
| 30 | #include <mach/regs-s3c2443-clock.h> | 31 | #include <mach/regs-s3c2443-clock.h> |
| 31 | #include <plat/udc.h> | 32 | #include <plat/udc.h> |
| @@ -1301,7 +1302,8 @@ static int s3c_hsudc_probe(struct platform_device *pdev) | |||
| 1301 | hsudc->uclk = clk_get(&pdev->dev, "usb-device"); | 1302 | hsudc->uclk = clk_get(&pdev->dev, "usb-device"); |
| 1302 | if (IS_ERR(hsudc->uclk)) { | 1303 | if (IS_ERR(hsudc->uclk)) { |
| 1303 | dev_err(dev, "failed to find usb-device clock source\n"); | 1304 | dev_err(dev, "failed to find usb-device clock source\n"); |
| 1304 | return PTR_ERR(hsudc->uclk); | 1305 | ret = PTR_ERR(hsudc->uclk); |
| 1306 | goto err_clk; | ||
| 1305 | } | 1307 | } |
| 1306 | clk_enable(hsudc->uclk); | 1308 | clk_enable(hsudc->uclk); |
| 1307 | 1309 | ||
| @@ -1310,7 +1312,8 @@ static int s3c_hsudc_probe(struct platform_device *pdev) | |||
| 1310 | disable_irq(hsudc->irq); | 1312 | disable_irq(hsudc->irq); |
| 1311 | local_irq_enable(); | 1313 | local_irq_enable(); |
| 1312 | return 0; | 1314 | return 0; |
| 1313 | 1315 | err_clk: | |
| 1316 | free_irq(hsudc->irq, hsudc); | ||
| 1314 | err_irq: | 1317 | err_irq: |
| 1315 | iounmap(hsudc->regs); | 1318 | iounmap(hsudc->regs); |
| 1316 | 1319 | ||
diff --git a/drivers/usb/gadget/s3c2410_udc.c b/drivers/usb/gadget/s3c2410_udc.c index 6d8b04061d5d..100f2635cf0a 100644 --- a/drivers/usb/gadget/s3c2410_udc.c +++ b/drivers/usb/gadget/s3c2410_udc.c | |||
| @@ -36,6 +36,7 @@ | |||
| 36 | #include <linux/platform_device.h> | 36 | #include <linux/platform_device.h> |
| 37 | #include <linux/clk.h> | 37 | #include <linux/clk.h> |
| 38 | #include <linux/gpio.h> | 38 | #include <linux/gpio.h> |
| 39 | #include <linux/prefetch.h> | ||
| 39 | 40 | ||
| 40 | #include <linux/debugfs.h> | 41 | #include <linux/debugfs.h> |
| 41 | #include <linux/seq_file.h> | 42 | #include <linux/seq_file.h> |
diff --git a/drivers/usb/host/ohci-pxa27x.c b/drivers/usb/host/ohci-pxa27x.c index afef7b0a4195..80be5472783a 100644 --- a/drivers/usb/host/ohci-pxa27x.c +++ b/drivers/usb/host/ohci-pxa27x.c | |||
| @@ -312,8 +312,10 @@ int usb_hcd_pxa27x_probe (const struct hc_driver *driver, struct platform_device | |||
| 312 | return PTR_ERR(usb_clk); | 312 | return PTR_ERR(usb_clk); |
| 313 | 313 | ||
| 314 | hcd = usb_create_hcd (driver, &pdev->dev, "pxa27x"); | 314 | hcd = usb_create_hcd (driver, &pdev->dev, "pxa27x"); |
| 315 | if (!hcd) | 315 | if (!hcd) { |
| 316 | return -ENOMEM; | 316 | retval = -ENOMEM; |
| 317 | goto err0; | ||
| 318 | } | ||
| 317 | 319 | ||
| 318 | r = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 320 | r = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 319 | if (!r) { | 321 | if (!r) { |
| @@ -368,6 +370,7 @@ int usb_hcd_pxa27x_probe (const struct hc_driver *driver, struct platform_device | |||
| 368 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | 370 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); |
| 369 | err1: | 371 | err1: |
| 370 | usb_put_hcd(hcd); | 372 | usb_put_hcd(hcd); |
| 373 | err0: | ||
| 371 | clk_put(usb_clk); | 374 | clk_put(usb_clk); |
| 372 | return retval; | 375 | return retval; |
| 373 | } | 376 | } |
diff --git a/drivers/usb/host/xhci-dbg.c b/drivers/usb/host/xhci-dbg.c index 2e0486178dbe..1f50b4468e87 100644 --- a/drivers/usb/host/xhci-dbg.c +++ b/drivers/usb/host/xhci-dbg.c | |||
| @@ -438,13 +438,13 @@ char *xhci_get_slot_state(struct xhci_hcd *xhci, | |||
| 438 | struct xhci_slot_ctx *slot_ctx = xhci_get_slot_ctx(xhci, ctx); | 438 | struct xhci_slot_ctx *slot_ctx = xhci_get_slot_ctx(xhci, ctx); |
| 439 | 439 | ||
| 440 | switch (GET_SLOT_STATE(le32_to_cpu(slot_ctx->dev_state))) { | 440 | switch (GET_SLOT_STATE(le32_to_cpu(slot_ctx->dev_state))) { |
| 441 | case 0: | 441 | case SLOT_STATE_ENABLED: |
| 442 | return "enabled/disabled"; | 442 | return "enabled/disabled"; |
| 443 | case 1: | 443 | case SLOT_STATE_DEFAULT: |
| 444 | return "default"; | 444 | return "default"; |
| 445 | case 2: | 445 | case SLOT_STATE_ADDRESSED: |
| 446 | return "addressed"; | 446 | return "addressed"; |
| 447 | case 3: | 447 | case SLOT_STATE_CONFIGURED: |
| 448 | return "configured"; | 448 | return "configured"; |
| 449 | default: | 449 | default: |
| 450 | return "reserved"; | 450 | return "reserved"; |
diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c index 26caba4c1950..0f8e1d29a858 100644 --- a/drivers/usb/host/xhci-mem.c +++ b/drivers/usb/host/xhci-mem.c | |||
| @@ -985,9 +985,19 @@ static unsigned int xhci_parse_exponent_interval(struct usb_device *udev, | |||
| 985 | interval = clamp_val(ep->desc.bInterval, 1, 16) - 1; | 985 | interval = clamp_val(ep->desc.bInterval, 1, 16) - 1; |
| 986 | if (interval != ep->desc.bInterval - 1) | 986 | if (interval != ep->desc.bInterval - 1) |
| 987 | dev_warn(&udev->dev, | 987 | dev_warn(&udev->dev, |
| 988 | "ep %#x - rounding interval to %d microframes\n", | 988 | "ep %#x - rounding interval to %d %sframes\n", |
| 989 | ep->desc.bEndpointAddress, | 989 | ep->desc.bEndpointAddress, |
| 990 | 1 << interval); | 990 | 1 << interval, |
| 991 | udev->speed == USB_SPEED_FULL ? "" : "micro"); | ||
| 992 | |||
| 993 | if (udev->speed == USB_SPEED_FULL) { | ||
| 994 | /* | ||
| 995 | * Full speed isoc endpoints specify interval in frames, | ||
| 996 | * not microframes. We are using microframes everywhere, | ||
| 997 | * so adjust accordingly. | ||
| 998 | */ | ||
| 999 | interval += 3; /* 1 frame = 2^3 uframes */ | ||
| 1000 | } | ||
| 991 | 1001 | ||
| 992 | return interval; | 1002 | return interval; |
| 993 | } | 1003 | } |
diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c index c408e9f6a707..17541d09eabb 100644 --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c | |||
| @@ -106,12 +106,22 @@ static int xhci_pci_setup(struct usb_hcd *hcd) | |||
| 106 | 106 | ||
| 107 | /* Look for vendor-specific quirks */ | 107 | /* Look for vendor-specific quirks */ |
| 108 | if (pdev->vendor == PCI_VENDOR_ID_FRESCO_LOGIC && | 108 | if (pdev->vendor == PCI_VENDOR_ID_FRESCO_LOGIC && |
| 109 | pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_PDK && | 109 | pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_PDK) { |
| 110 | pdev->revision == 0x0) { | 110 | if (pdev->revision == 0x0) { |
| 111 | xhci->quirks |= XHCI_RESET_EP_QUIRK; | 111 | xhci->quirks |= XHCI_RESET_EP_QUIRK; |
| 112 | xhci_dbg(xhci, "QUIRK: Fresco Logic xHC needs configure" | 112 | xhci_dbg(xhci, "QUIRK: Fresco Logic xHC needs configure" |
| 113 | " endpoint cmd after reset endpoint\n"); | 113 | " endpoint cmd after reset endpoint\n"); |
| 114 | } | ||
| 115 | /* Fresco Logic confirms: all revisions of this chip do not | ||
| 116 | * support MSI, even though some of them claim to in their PCI | ||
| 117 | * capabilities. | ||
| 118 | */ | ||
| 119 | xhci->quirks |= XHCI_BROKEN_MSI; | ||
| 120 | xhci_dbg(xhci, "QUIRK: Fresco Logic revision %u " | ||
| 121 | "has broken MSI implementation\n", | ||
| 122 | pdev->revision); | ||
| 114 | } | 123 | } |
| 124 | |||
| 115 | if (pdev->vendor == PCI_VENDOR_ID_NEC) | 125 | if (pdev->vendor == PCI_VENDOR_ID_NEC) |
| 116 | xhci->quirks |= XHCI_NEC_HOST; | 126 | xhci->quirks |= XHCI_NEC_HOST; |
| 117 | 127 | ||
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index cc1485bfed38..800f417c7309 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c | |||
| @@ -1782,7 +1782,7 @@ static int skip_isoc_td(struct xhci_hcd *xhci, struct xhci_td *td, | |||
| 1782 | struct usb_iso_packet_descriptor *frame; | 1782 | struct usb_iso_packet_descriptor *frame; |
| 1783 | int idx; | 1783 | int idx; |
| 1784 | 1784 | ||
| 1785 | ep_ring = xhci_dma_to_transfer_ring(ep, event->buffer); | 1785 | ep_ring = xhci_dma_to_transfer_ring(ep, le64_to_cpu(event->buffer)); |
| 1786 | urb_priv = td->urb->hcpriv; | 1786 | urb_priv = td->urb->hcpriv; |
| 1787 | idx = urb_priv->td_cnt; | 1787 | idx = urb_priv->td_cnt; |
| 1788 | frame = &td->urb->iso_frame_desc[idx]; | 1788 | frame = &td->urb->iso_frame_desc[idx]; |
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index d9660eb97eb9..06e7023258d0 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c | |||
| @@ -430,12 +430,19 @@ int xhci_run(struct usb_hcd *hcd) | |||
| 430 | free_irq(hcd->irq, hcd); | 430 | free_irq(hcd->irq, hcd); |
| 431 | hcd->irq = -1; | 431 | hcd->irq = -1; |
| 432 | 432 | ||
| 433 | /* Some Fresco Logic host controllers advertise MSI, but fail to | ||
| 434 | * generate interrupts. Don't even try to enable MSI. | ||
| 435 | */ | ||
| 436 | if (xhci->quirks & XHCI_BROKEN_MSI) | ||
| 437 | goto legacy_irq; | ||
| 438 | |||
| 433 | ret = xhci_setup_msix(xhci); | 439 | ret = xhci_setup_msix(xhci); |
| 434 | if (ret) | 440 | if (ret) |
| 435 | /* fall back to msi*/ | 441 | /* fall back to msi*/ |
| 436 | ret = xhci_setup_msi(xhci); | 442 | ret = xhci_setup_msi(xhci); |
| 437 | 443 | ||
| 438 | if (ret) { | 444 | if (ret) { |
| 445 | legacy_irq: | ||
| 439 | /* fall back to legacy interrupt*/ | 446 | /* fall back to legacy interrupt*/ |
| 440 | ret = request_irq(pdev->irq, &usb_hcd_irq, IRQF_SHARED, | 447 | ret = request_irq(pdev->irq, &usb_hcd_irq, IRQF_SHARED, |
| 441 | hcd->irq_descr, hcd); | 448 | hcd->irq_descr, hcd); |
| @@ -1849,8 +1856,8 @@ int xhci_check_bandwidth(struct usb_hcd *hcd, struct usb_device *udev) | |||
| 1849 | 1856 | ||
| 1850 | /* Free any rings that were dropped, but not changed. */ | 1857 | /* Free any rings that were dropped, but not changed. */ |
| 1851 | for (i = 1; i < 31; ++i) { | 1858 | for (i = 1; i < 31; ++i) { |
| 1852 | if ((ctrl_ctx->drop_flags & (1 << (i + 1))) && | 1859 | if ((le32_to_cpu(ctrl_ctx->drop_flags) & (1 << (i + 1))) && |
| 1853 | !(ctrl_ctx->add_flags & (1 << (i + 1)))) | 1860 | !(le32_to_cpu(ctrl_ctx->add_flags) & (1 << (i + 1)))) |
| 1854 | xhci_free_or_cache_endpoint_ring(xhci, virt_dev, i); | 1861 | xhci_free_or_cache_endpoint_ring(xhci, virt_dev, i); |
| 1855 | } | 1862 | } |
| 1856 | xhci_zero_in_ctx(xhci, virt_dev); | 1863 | xhci_zero_in_ctx(xhci, virt_dev); |
| @@ -2467,6 +2474,7 @@ int xhci_discover_or_reset_device(struct usb_hcd *hcd, struct usb_device *udev) | |||
| 2467 | struct xhci_command *reset_device_cmd; | 2474 | struct xhci_command *reset_device_cmd; |
| 2468 | int timeleft; | 2475 | int timeleft; |
| 2469 | int last_freed_endpoint; | 2476 | int last_freed_endpoint; |
| 2477 | struct xhci_slot_ctx *slot_ctx; | ||
| 2470 | 2478 | ||
| 2471 | ret = xhci_check_args(hcd, udev, NULL, 0, false, __func__); | 2479 | ret = xhci_check_args(hcd, udev, NULL, 0, false, __func__); |
| 2472 | if (ret <= 0) | 2480 | if (ret <= 0) |
| @@ -2499,6 +2507,12 @@ int xhci_discover_or_reset_device(struct usb_hcd *hcd, struct usb_device *udev) | |||
| 2499 | return -EINVAL; | 2507 | return -EINVAL; |
| 2500 | } | 2508 | } |
| 2501 | 2509 | ||
| 2510 | /* If device is not setup, there is no point in resetting it */ | ||
| 2511 | slot_ctx = xhci_get_slot_ctx(xhci, virt_dev->out_ctx); | ||
| 2512 | if (GET_SLOT_STATE(le32_to_cpu(slot_ctx->dev_state)) == | ||
| 2513 | SLOT_STATE_DISABLED) | ||
| 2514 | return 0; | ||
| 2515 | |||
| 2502 | xhci_dbg(xhci, "Resetting device with slot ID %u\n", slot_id); | 2516 | xhci_dbg(xhci, "Resetting device with slot ID %u\n", slot_id); |
| 2503 | /* Allocate the command structure that holds the struct completion. | 2517 | /* Allocate the command structure that holds the struct completion. |
| 2504 | * Assume we're in process context, since the normal device reset | 2518 | * Assume we're in process context, since the normal device reset |
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index ac0196e7fcf1..7d1ea3bf5e1f 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h | |||
| @@ -560,6 +560,11 @@ struct xhci_slot_ctx { | |||
| 560 | #define SLOT_STATE (0x1f << 27) | 560 | #define SLOT_STATE (0x1f << 27) |
| 561 | #define GET_SLOT_STATE(p) (((p) & (0x1f << 27)) >> 27) | 561 | #define GET_SLOT_STATE(p) (((p) & (0x1f << 27)) >> 27) |
| 562 | 562 | ||
| 563 | #define SLOT_STATE_DISABLED 0 | ||
| 564 | #define SLOT_STATE_ENABLED SLOT_STATE_DISABLED | ||
| 565 | #define SLOT_STATE_DEFAULT 1 | ||
| 566 | #define SLOT_STATE_ADDRESSED 2 | ||
| 567 | #define SLOT_STATE_CONFIGURED 3 | ||
| 563 | 568 | ||
| 564 | /** | 569 | /** |
| 565 | * struct xhci_ep_ctx | 570 | * struct xhci_ep_ctx |
| @@ -1302,6 +1307,7 @@ struct xhci_hcd { | |||
| 1302 | * commands. | 1307 | * commands. |
| 1303 | */ | 1308 | */ |
| 1304 | #define XHCI_EP_LIMIT_QUIRK (1 << 5) | 1309 | #define XHCI_EP_LIMIT_QUIRK (1 << 5) |
| 1310 | #define XHCI_BROKEN_MSI (1 << 6) | ||
| 1305 | unsigned int num_active_eps; | 1311 | unsigned int num_active_eps; |
| 1306 | unsigned int limit_active_eps; | 1312 | unsigned int limit_active_eps; |
| 1307 | /* There are two roothubs to keep track of bus suspend info for */ | 1313 | /* There are two roothubs to keep track of bus suspend info for */ |
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c index ab8e1001e5e2..c71b0372786e 100644 --- a/drivers/usb/musb/musb_core.c +++ b/drivers/usb/musb/musb_core.c | |||
| @@ -96,6 +96,7 @@ | |||
| 96 | #include <linux/init.h> | 96 | #include <linux/init.h> |
| 97 | #include <linux/list.h> | 97 | #include <linux/list.h> |
| 98 | #include <linux/kobject.h> | 98 | #include <linux/kobject.h> |
| 99 | #include <linux/prefetch.h> | ||
| 99 | #include <linux/platform_device.h> | 100 | #include <linux/platform_device.h> |
| 100 | #include <linux/io.h> | 101 | #include <linux/io.h> |
| 101 | 102 | ||
diff --git a/drivers/usb/renesas_usbhs/mod_gadget.c b/drivers/usb/renesas_usbhs/mod_gadget.c index 206cfabc9286..547486ccd059 100644 --- a/drivers/usb/renesas_usbhs/mod_gadget.c +++ b/drivers/usb/renesas_usbhs/mod_gadget.c | |||
| @@ -1380,5 +1380,6 @@ void __devexit usbhs_mod_gadget_remove(struct usbhs_priv *priv) | |||
| 1380 | { | 1380 | { |
| 1381 | struct usbhsg_gpriv *gpriv = usbhsg_priv_to_gpriv(priv); | 1381 | struct usbhsg_gpriv *gpriv = usbhsg_priv_to_gpriv(priv); |
| 1382 | 1382 | ||
| 1383 | kfree(gpriv->uep); | ||
| 1383 | kfree(gpriv); | 1384 | kfree(gpriv); |
| 1384 | } | 1385 | } |
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index e8dbde55f6c5..162728977553 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
| @@ -647,6 +647,7 @@ static struct usb_device_id id_table_combined [] = { | |||
| 647 | { USB_DEVICE(FTDI_VID, EVER_ECO_PRO_CDS) }, | 647 | { USB_DEVICE(FTDI_VID, EVER_ECO_PRO_CDS) }, |
| 648 | { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_1_PID) }, | 648 | { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_1_PID) }, |
| 649 | { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_2_PID) }, | 649 | { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_2_PID) }, |
| 650 | { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_3_PID) }, | ||
| 650 | { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_0_PID) }, | 651 | { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_0_PID) }, |
| 651 | { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_1_PID) }, | 652 | { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_1_PID) }, |
| 652 | { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_2_PID) }, | 653 | { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_2_PID) }, |
diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h index 1d946cd238ba..ab1fcdf3c378 100644 --- a/drivers/usb/serial/ftdi_sio_ids.h +++ b/drivers/usb/serial/ftdi_sio_ids.h | |||
| @@ -351,6 +351,7 @@ | |||
| 351 | */ | 351 | */ |
| 352 | #define FTDI_4N_GALAXY_DE_1_PID 0xF3C0 | 352 | #define FTDI_4N_GALAXY_DE_1_PID 0xF3C0 |
| 353 | #define FTDI_4N_GALAXY_DE_2_PID 0xF3C1 | 353 | #define FTDI_4N_GALAXY_DE_2_PID 0xF3C1 |
| 354 | #define FTDI_4N_GALAXY_DE_3_PID 0xF3C2 | ||
| 354 | 355 | ||
| 355 | /* | 356 | /* |
| 356 | * Linx Technologies product ids | 357 | * Linx Technologies product ids |
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 318dd00040a3..60b25d8ea0e2 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
| @@ -311,10 +311,6 @@ static void option_instat_callback(struct urb *urb); | |||
| 311 | #define ZTE_PRODUCT_AC2726 0xfff5 | 311 | #define ZTE_PRODUCT_AC2726 0xfff5 |
| 312 | #define ZTE_PRODUCT_AC8710T 0xffff | 312 | #define ZTE_PRODUCT_AC8710T 0xffff |
| 313 | 313 | ||
| 314 | /* ZTE PRODUCTS -- alternate vendor ID */ | ||
| 315 | #define ZTE_VENDOR_ID2 0x1d6b | ||
| 316 | #define ZTE_PRODUCT_MF_330 0x0002 | ||
| 317 | |||
| 318 | #define BENQ_VENDOR_ID 0x04a5 | 314 | #define BENQ_VENDOR_ID 0x04a5 |
| 319 | #define BENQ_PRODUCT_H10 0x4068 | 315 | #define BENQ_PRODUCT_H10 0x4068 |
| 320 | 316 | ||
| @@ -340,11 +336,12 @@ static void option_instat_callback(struct urb *urb); | |||
| 340 | #define TOSHIBA_PRODUCT_G450 0x0d45 | 336 | #define TOSHIBA_PRODUCT_G450 0x0d45 |
| 341 | 337 | ||
| 342 | #define ALINK_VENDOR_ID 0x1e0e | 338 | #define ALINK_VENDOR_ID 0x1e0e |
| 339 | #define ALINK_PRODUCT_PH300 0x9100 | ||
| 343 | #define ALINK_PRODUCT_3GU 0x9200 | 340 | #define ALINK_PRODUCT_3GU 0x9200 |
| 344 | 341 | ||
| 345 | /* ALCATEL PRODUCTS */ | 342 | /* ALCATEL PRODUCTS */ |
| 346 | #define ALCATEL_VENDOR_ID 0x1bbb | 343 | #define ALCATEL_VENDOR_ID 0x1bbb |
| 347 | #define ALCATEL_PRODUCT_X060S 0x0000 | 344 | #define ALCATEL_PRODUCT_X060S_X200 0x0000 |
| 348 | 345 | ||
| 349 | #define PIRELLI_VENDOR_ID 0x1266 | 346 | #define PIRELLI_VENDOR_ID 0x1266 |
| 350 | #define PIRELLI_PRODUCT_C100_1 0x1002 | 347 | #define PIRELLI_PRODUCT_C100_1 0x1002 |
| @@ -379,6 +376,9 @@ static void option_instat_callback(struct urb *urb); | |||
| 379 | * It seems to contain a Qualcomm QSC6240/6290 chipset */ | 376 | * It seems to contain a Qualcomm QSC6240/6290 chipset */ |
| 380 | #define FOUR_G_SYSTEMS_PRODUCT_W14 0x9603 | 377 | #define FOUR_G_SYSTEMS_PRODUCT_W14 0x9603 |
| 381 | 378 | ||
| 379 | /* Zoom */ | ||
| 380 | #define ZOOM_PRODUCT_4597 0x9607 | ||
| 381 | |||
| 382 | /* Haier products */ | 382 | /* Haier products */ |
| 383 | #define HAIER_VENDOR_ID 0x201e | 383 | #define HAIER_VENDOR_ID 0x201e |
| 384 | #define HAIER_PRODUCT_CE100 0x2009 | 384 | #define HAIER_PRODUCT_CE100 0x2009 |
| @@ -432,6 +432,20 @@ static const struct option_blacklist_info four_g_w14_blacklist = { | |||
| 432 | .reason = OPTION_BLACKLIST_SENDSETUP | 432 | .reason = OPTION_BLACKLIST_SENDSETUP |
| 433 | }; | 433 | }; |
| 434 | 434 | ||
| 435 | static const u8 alcatel_x200_no_sendsetup[] = { 0, 1 }; | ||
| 436 | static const struct option_blacklist_info alcatel_x200_blacklist = { | ||
| 437 | .infolen = ARRAY_SIZE(alcatel_x200_no_sendsetup), | ||
| 438 | .ifaceinfo = alcatel_x200_no_sendsetup, | ||
| 439 | .reason = OPTION_BLACKLIST_SENDSETUP | ||
| 440 | }; | ||
| 441 | |||
| 442 | static const u8 zte_k3765_z_no_sendsetup[] = { 0, 1, 2 }; | ||
| 443 | static const struct option_blacklist_info zte_k3765_z_blacklist = { | ||
| 444 | .infolen = ARRAY_SIZE(zte_k3765_z_no_sendsetup), | ||
| 445 | .ifaceinfo = zte_k3765_z_no_sendsetup, | ||
| 446 | .reason = OPTION_BLACKLIST_SENDSETUP | ||
| 447 | }; | ||
| 448 | |||
| 435 | static const struct usb_device_id option_ids[] = { | 449 | static const struct usb_device_id option_ids[] = { |
| 436 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) }, | 450 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) }, |
| 437 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) }, | 451 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) }, |
| @@ -916,13 +930,13 @@ static const struct usb_device_id option_ids[] = { | |||
| 916 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0073, 0xff, 0xff, 0xff) }, | 930 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0073, 0xff, 0xff, 0xff) }, |
| 917 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0130, 0xff, 0xff, 0xff) }, | 931 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0130, 0xff, 0xff, 0xff) }, |
| 918 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0141, 0xff, 0xff, 0xff) }, | 932 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0141, 0xff, 0xff, 0xff) }, |
| 919 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x2002, 0xff, 0xff, 0xff) }, | 933 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x2002, 0xff, |
| 934 | 0xff, 0xff), .driver_info = (kernel_ulong_t)&zte_k3765_z_blacklist }, | ||
| 920 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x2003, 0xff, 0xff, 0xff) }, | 935 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x2003, 0xff, 0xff, 0xff) }, |
| 921 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH, 0xff, 0xff, 0xff) }, | 936 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH, 0xff, 0xff, 0xff) }, |
| 922 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC8710, 0xff, 0xff, 0xff) }, | 937 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC8710, 0xff, 0xff, 0xff) }, |
| 923 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC2726, 0xff, 0xff, 0xff) }, | 938 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC2726, 0xff, 0xff, 0xff) }, |
| 924 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC8710T, 0xff, 0xff, 0xff) }, | 939 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC8710T, 0xff, 0xff, 0xff) }, |
| 925 | { USB_DEVICE(ZTE_VENDOR_ID2, ZTE_PRODUCT_MF_330) }, | ||
| 926 | { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_H10) }, | 940 | { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_H10) }, |
| 927 | { USB_DEVICE(DLINK_VENDOR_ID, DLINK_PRODUCT_DWM_652) }, | 941 | { USB_DEVICE(DLINK_VENDOR_ID, DLINK_PRODUCT_DWM_652) }, |
| 928 | { USB_DEVICE(ALINK_VENDOR_ID, DLINK_PRODUCT_DWM_652_U5) }, /* Yes, ALINK_VENDOR_ID */ | 942 | { USB_DEVICE(ALINK_VENDOR_ID, DLINK_PRODUCT_DWM_652_U5) }, /* Yes, ALINK_VENDOR_ID */ |
| @@ -935,13 +949,17 @@ static const struct usb_device_id option_ids[] = { | |||
| 935 | { USB_DEVICE(TOSHIBA_VENDOR_ID, TOSHIBA_PRODUCT_G450) }, | 949 | { USB_DEVICE(TOSHIBA_VENDOR_ID, TOSHIBA_PRODUCT_G450) }, |
| 936 | { USB_DEVICE(TOSHIBA_VENDOR_ID, TOSHIBA_PRODUCT_HSDPA_MINICARD ) }, /* Toshiba 3G HSDPA == Novatel Expedite EU870D MiniCard */ | 950 | { USB_DEVICE(TOSHIBA_VENDOR_ID, TOSHIBA_PRODUCT_HSDPA_MINICARD ) }, /* Toshiba 3G HSDPA == Novatel Expedite EU870D MiniCard */ |
| 937 | { USB_DEVICE(ALINK_VENDOR_ID, 0x9000) }, | 951 | { USB_DEVICE(ALINK_VENDOR_ID, 0x9000) }, |
| 952 | { USB_DEVICE(ALINK_VENDOR_ID, ALINK_PRODUCT_PH300) }, | ||
| 938 | { USB_DEVICE_AND_INTERFACE_INFO(ALINK_VENDOR_ID, ALINK_PRODUCT_3GU, 0xff, 0xff, 0xff) }, | 953 | { USB_DEVICE_AND_INTERFACE_INFO(ALINK_VENDOR_ID, ALINK_PRODUCT_3GU, 0xff, 0xff, 0xff) }, |
| 939 | { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_X060S) }, | 954 | { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_X060S_X200), |
| 955 | .driver_info = (kernel_ulong_t)&alcatel_x200_blacklist | ||
| 956 | }, | ||
| 940 | { USB_DEVICE(AIRPLUS_VENDOR_ID, AIRPLUS_PRODUCT_MCD650) }, | 957 | { USB_DEVICE(AIRPLUS_VENDOR_ID, AIRPLUS_PRODUCT_MCD650) }, |
| 941 | { USB_DEVICE(TLAYTECH_VENDOR_ID, TLAYTECH_PRODUCT_TEU800) }, | 958 | { USB_DEVICE(TLAYTECH_VENDOR_ID, TLAYTECH_PRODUCT_TEU800) }, |
| 942 | { USB_DEVICE(LONGCHEER_VENDOR_ID, FOUR_G_SYSTEMS_PRODUCT_W14), | 959 | { USB_DEVICE(LONGCHEER_VENDOR_ID, FOUR_G_SYSTEMS_PRODUCT_W14), |
| 943 | .driver_info = (kernel_ulong_t)&four_g_w14_blacklist | 960 | .driver_info = (kernel_ulong_t)&four_g_w14_blacklist |
| 944 | }, | 961 | }, |
| 962 | { USB_DEVICE(LONGCHEER_VENDOR_ID, ZOOM_PRODUCT_4597) }, | ||
| 945 | { USB_DEVICE(HAIER_VENDOR_ID, HAIER_PRODUCT_CE100) }, | 963 | { USB_DEVICE(HAIER_VENDOR_ID, HAIER_PRODUCT_CE100) }, |
| 946 | /* Pirelli */ | 964 | /* Pirelli */ |
| 947 | { USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_C100_1)}, | 965 | { USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_C100_1)}, |
diff --git a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c index 00418995d8e9..e8ae21b2d387 100644 --- a/drivers/usb/storage/transport.c +++ b/drivers/usb/storage/transport.c | |||
| @@ -819,6 +819,35 @@ Retry_Sense: | |||
| 819 | } | 819 | } |
| 820 | } | 820 | } |
| 821 | 821 | ||
| 822 | /* | ||
| 823 | * Some devices don't work or return incorrect data the first | ||
| 824 | * time they get a READ(10) command, or for the first READ(10) | ||
| 825 | * after a media change. If the INITIAL_READ10 flag is set, | ||
| 826 | * keep track of whether READ(10) commands succeed. If the | ||
| 827 | * previous one succeeded and this one failed, set the REDO_READ10 | ||
| 828 | * flag to force a retry. | ||
| 829 | */ | ||
| 830 | if (unlikely((us->fflags & US_FL_INITIAL_READ10) && | ||
| 831 | srb->cmnd[0] == READ_10)) { | ||
| 832 | if (srb->result == SAM_STAT_GOOD) { | ||
| 833 | set_bit(US_FLIDX_READ10_WORKED, &us->dflags); | ||
| 834 | } else if (test_bit(US_FLIDX_READ10_WORKED, &us->dflags)) { | ||
| 835 | clear_bit(US_FLIDX_READ10_WORKED, &us->dflags); | ||
| 836 | set_bit(US_FLIDX_REDO_READ10, &us->dflags); | ||
| 837 | } | ||
| 838 | |||
| 839 | /* | ||
| 840 | * Next, if the REDO_READ10 flag is set, return a result | ||
| 841 | * code that will cause the SCSI core to retry the READ(10) | ||
| 842 | * command immediately. | ||
| 843 | */ | ||
| 844 | if (test_bit(US_FLIDX_REDO_READ10, &us->dflags)) { | ||
| 845 | clear_bit(US_FLIDX_REDO_READ10, &us->dflags); | ||
| 846 | srb->result = DID_IMM_RETRY << 16; | ||
| 847 | srb->sense_buffer[0] = 0; | ||
| 848 | } | ||
| 849 | } | ||
| 850 | |||
| 822 | /* Did we transfer less than the minimum amount required? */ | 851 | /* Did we transfer less than the minimum amount required? */ |
| 823 | if ((srb->result == SAM_STAT_GOOD || srb->sense_buffer[2] == 0) && | 852 | if ((srb->result == SAM_STAT_GOOD || srb->sense_buffer[2] == 0) && |
| 824 | scsi_bufflen(srb) - scsi_get_resid(srb) < srb->underflow) | 853 | scsi_bufflen(srb) - scsi_get_resid(srb) < srb->underflow) |
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index c1602b8c5594..ccff3483eebc 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
| @@ -1114,6 +1114,16 @@ UNUSUAL_DEV( 0x090c, 0x1132, 0x0000, 0xffff, | |||
| 1114 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | 1114 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
| 1115 | US_FL_FIX_CAPACITY ), | 1115 | US_FL_FIX_CAPACITY ), |
| 1116 | 1116 | ||
| 1117 | /* Reported by Paul Hartman <paul.hartman+linux@gmail.com> | ||
| 1118 | * This card reader returns "Illegal Request, Logical Block Address | ||
| 1119 | * Out of Range" for the first READ(10) after a new card is inserted. | ||
| 1120 | */ | ||
| 1121 | UNUSUAL_DEV( 0x090c, 0x6000, 0x0100, 0x0100, | ||
| 1122 | "Feiya", | ||
| 1123 | "SD/SDHC Card Reader", | ||
| 1124 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
| 1125 | US_FL_INITIAL_READ10 ), | ||
| 1126 | |||
| 1117 | /* This Pentax still camera is not conformant | 1127 | /* This Pentax still camera is not conformant |
| 1118 | * to the USB storage specification: - | 1128 | * to the USB storage specification: - |
| 1119 | * - It does not like the INQUIRY command. So we must handle this command | 1129 | * - It does not like the INQUIRY command. So we must handle this command |
| @@ -1888,6 +1898,15 @@ UNUSUAL_DEV( 0x1908, 0x3335, 0x0200, 0x0200, | |||
| 1888 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | 1898 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
| 1889 | US_FL_NO_READ_DISC_INFO ), | 1899 | US_FL_NO_READ_DISC_INFO ), |
| 1890 | 1900 | ||
| 1901 | /* Reported by Sven Geggus <sven-usbst@geggus.net> | ||
| 1902 | * This encrypted pen drive returns bogus data for the initial READ(10). | ||
| 1903 | */ | ||
| 1904 | UNUSUAL_DEV( 0x1b1c, 0x1ab5, 0x0200, 0x0200, | ||
| 1905 | "Corsair", | ||
| 1906 | "Padlock v2", | ||
| 1907 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
| 1908 | US_FL_INITIAL_READ10 ), | ||
| 1909 | |||
| 1891 | /* Patch by Richard Schütz <r.schtz@t-online.de> | 1910 | /* Patch by Richard Schütz <r.schtz@t-online.de> |
| 1892 | * This external hard drive enclosure uses a JMicron chip which | 1911 | * This external hard drive enclosure uses a JMicron chip which |
| 1893 | * needs the US_FL_IGNORE_RESIDUE flag to work properly. */ | 1912 | * needs the US_FL_IGNORE_RESIDUE flag to work properly. */ |
diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c index 5ee7ac42e08f..0ca095820f3e 100644 --- a/drivers/usb/storage/usb.c +++ b/drivers/usb/storage/usb.c | |||
| @@ -440,7 +440,8 @@ static void adjust_quirks(struct us_data *us) | |||
| 440 | US_FL_NOT_LOCKABLE | US_FL_MAX_SECTORS_64 | | 440 | US_FL_NOT_LOCKABLE | US_FL_MAX_SECTORS_64 | |
| 441 | US_FL_CAPACITY_OK | US_FL_IGNORE_RESIDUE | | 441 | US_FL_CAPACITY_OK | US_FL_IGNORE_RESIDUE | |
| 442 | US_FL_SINGLE_LUN | US_FL_NO_WP_DETECT | | 442 | US_FL_SINGLE_LUN | US_FL_NO_WP_DETECT | |
| 443 | US_FL_NO_READ_DISC_INFO | US_FL_NO_READ_CAPACITY_16); | 443 | US_FL_NO_READ_DISC_INFO | US_FL_NO_READ_CAPACITY_16 | |
| 444 | US_FL_INITIAL_READ10); | ||
| 444 | 445 | ||
| 445 | p = quirks; | 446 | p = quirks; |
| 446 | while (*p) { | 447 | while (*p) { |
| @@ -490,6 +491,9 @@ static void adjust_quirks(struct us_data *us) | |||
| 490 | case 'm': | 491 | case 'm': |
| 491 | f |= US_FL_MAX_SECTORS_64; | 492 | f |= US_FL_MAX_SECTORS_64; |
| 492 | break; | 493 | break; |
| 494 | case 'n': | ||
| 495 | f |= US_FL_INITIAL_READ10; | ||
| 496 | break; | ||
| 493 | case 'o': | 497 | case 'o': |
| 494 | f |= US_FL_CAPACITY_OK; | 498 | f |= US_FL_CAPACITY_OK; |
| 495 | break; | 499 | break; |
| @@ -953,6 +957,13 @@ int usb_stor_probe2(struct us_data *us) | |||
| 953 | if (result) | 957 | if (result) |
| 954 | goto BadDevice; | 958 | goto BadDevice; |
| 955 | 959 | ||
| 960 | /* | ||
| 961 | * If the device returns invalid data for the first READ(10) | ||
| 962 | * command, indicate the command should be retried. | ||
| 963 | */ | ||
| 964 | if (us->fflags & US_FL_INITIAL_READ10) | ||
| 965 | set_bit(US_FLIDX_REDO_READ10, &us->dflags); | ||
| 966 | |||
| 956 | /* Acquire all the other resources and add the host */ | 967 | /* Acquire all the other resources and add the host */ |
| 957 | result = usb_stor_acquire_resources(us); | 968 | result = usb_stor_acquire_resources(us); |
| 958 | if (result) | 969 | if (result) |
diff --git a/drivers/usb/storage/usb.h b/drivers/usb/storage/usb.h index 89d3bfff98df..7b0f2113632e 100644 --- a/drivers/usb/storage/usb.h +++ b/drivers/usb/storage/usb.h | |||
| @@ -73,6 +73,8 @@ struct us_unusual_dev { | |||
| 73 | #define US_FLIDX_RESETTING 4 /* device reset in progress */ | 73 | #define US_FLIDX_RESETTING 4 /* device reset in progress */ |
| 74 | #define US_FLIDX_TIMED_OUT 5 /* SCSI midlayer timed out */ | 74 | #define US_FLIDX_TIMED_OUT 5 /* SCSI midlayer timed out */ |
| 75 | #define US_FLIDX_DONT_SCAN 6 /* don't scan (disconnect) */ | 75 | #define US_FLIDX_DONT_SCAN 6 /* don't scan (disconnect) */ |
| 76 | #define US_FLIDX_REDO_READ10 7 /* redo READ(10) command */ | ||
| 77 | #define US_FLIDX_READ10_WORKED 8 /* previous READ(10) succeeded */ | ||
| 76 | 78 | ||
| 77 | #define USB_STOR_STRING_LEN 32 | 79 | #define USB_STOR_STRING_LEN 32 |
| 78 | 80 | ||
diff --git a/drivers/xen/events.c b/drivers/xen/events.c index 3ff822b48145..553da68bd510 100644 --- a/drivers/xen/events.c +++ b/drivers/xen/events.c | |||
| @@ -626,6 +626,9 @@ int xen_allocate_pirq_gsi(unsigned gsi) | |||
| 626 | * | 626 | * |
| 627 | * Note: We don't assign an event channel until the irq actually started | 627 | * Note: We don't assign an event channel until the irq actually started |
| 628 | * up. Return an existing irq if we've already got one for the gsi. | 628 | * up. Return an existing irq if we've already got one for the gsi. |
| 629 | * | ||
| 630 | * Shareable implies level triggered, not shareable implies edge | ||
| 631 | * triggered here. | ||
| 629 | */ | 632 | */ |
| 630 | int xen_bind_pirq_gsi_to_irq(unsigned gsi, | 633 | int xen_bind_pirq_gsi_to_irq(unsigned gsi, |
| 631 | unsigned pirq, int shareable, char *name) | 634 | unsigned pirq, int shareable, char *name) |
| @@ -664,16 +667,13 @@ int xen_bind_pirq_gsi_to_irq(unsigned gsi, | |||
| 664 | 667 | ||
| 665 | pirq_query_unmask(irq); | 668 | pirq_query_unmask(irq); |
| 666 | /* We try to use the handler with the appropriate semantic for the | 669 | /* We try to use the handler with the appropriate semantic for the |
| 667 | * type of interrupt: if the interrupt doesn't need an eoi | 670 | * type of interrupt: if the interrupt is an edge triggered |
| 668 | * (pirq_needs_eoi returns false), we treat it like an edge | 671 | * interrupt we use handle_edge_irq. |
| 669 | * triggered interrupt so we use handle_edge_irq. | ||
| 670 | * As a matter of fact this only happens when the corresponding | ||
| 671 | * physical interrupt is edge triggered or an msi. | ||
| 672 | * | 672 | * |
| 673 | * On the other hand if the interrupt needs an eoi (pirq_needs_eoi | 673 | * On the other hand if the interrupt is level triggered we use |
| 674 | * returns true) we treat it like a level triggered interrupt so we | 674 | * handle_fasteoi_irq like the native code does for this kind of |
| 675 | * use handle_fasteoi_irq like the native code does for this kind of | ||
| 676 | * interrupts. | 675 | * interrupts. |
| 676 | * | ||
| 677 | * Depending on the Xen version, pirq_needs_eoi might return true | 677 | * Depending on the Xen version, pirq_needs_eoi might return true |
| 678 | * not only for level triggered interrupts but for edge triggered | 678 | * not only for level triggered interrupts but for edge triggered |
| 679 | * interrupts too. In any case Xen always honors the eoi mechanism, | 679 | * interrupts too. In any case Xen always honors the eoi mechanism, |
| @@ -681,7 +681,7 @@ int xen_bind_pirq_gsi_to_irq(unsigned gsi, | |||
| 681 | * hasn't received an eoi yet. Therefore using the fasteoi handler | 681 | * hasn't received an eoi yet. Therefore using the fasteoi handler |
| 682 | * is the right choice either way. | 682 | * is the right choice either way. |
| 683 | */ | 683 | */ |
| 684 | if (pirq_needs_eoi(irq)) | 684 | if (shareable) |
| 685 | irq_set_chip_and_handler_name(irq, &xen_pirq_chip, | 685 | irq_set_chip_and_handler_name(irq, &xen_pirq_chip, |
| 686 | handle_fasteoi_irq, name); | 686 | handle_fasteoi_irq, name); |
| 687 | else | 687 | else |
diff --git a/drivers/xen/swiotlb-xen.c b/drivers/xen/swiotlb-xen.c index 65ea21a97492..6e8c15a23201 100644 --- a/drivers/xen/swiotlb-xen.c +++ b/drivers/xen/swiotlb-xen.c | |||
| @@ -147,9 +147,15 @@ void __init xen_swiotlb_init(int verbose) | |||
| 147 | { | 147 | { |
| 148 | unsigned long bytes; | 148 | unsigned long bytes; |
| 149 | int rc; | 149 | int rc; |
| 150 | 150 | unsigned long nr_tbl; | |
| 151 | xen_io_tlb_nslabs = (64 * 1024 * 1024 >> IO_TLB_SHIFT); | 151 | |
| 152 | xen_io_tlb_nslabs = ALIGN(xen_io_tlb_nslabs, IO_TLB_SEGSIZE); | 152 | nr_tbl = swioltb_nr_tbl(); |
| 153 | if (nr_tbl) | ||
| 154 | xen_io_tlb_nslabs = nr_tbl; | ||
| 155 | else { | ||
| 156 | xen_io_tlb_nslabs = (64 * 1024 * 1024 >> IO_TLB_SHIFT); | ||
| 157 | xen_io_tlb_nslabs = ALIGN(xen_io_tlb_nslabs, IO_TLB_SEGSIZE); | ||
| 158 | } | ||
| 153 | 159 | ||
| 154 | bytes = xen_io_tlb_nslabs << IO_TLB_SHIFT; | 160 | bytes = xen_io_tlb_nslabs << IO_TLB_SHIFT; |
| 155 | 161 | ||
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c index d84089349c82..2e667868e0d2 100644 --- a/fs/btrfs/ctree.c +++ b/fs/btrfs/ctree.c | |||
| @@ -1228,6 +1228,7 @@ static void reada_for_search(struct btrfs_root *root, | |||
| 1228 | u32 nr; | 1228 | u32 nr; |
| 1229 | u32 blocksize; | 1229 | u32 blocksize; |
| 1230 | u32 nscan = 0; | 1230 | u32 nscan = 0; |
| 1231 | bool map = true; | ||
| 1231 | 1232 | ||
| 1232 | if (level != 1) | 1233 | if (level != 1) |
| 1233 | return; | 1234 | return; |
| @@ -1249,8 +1250,11 @@ static void reada_for_search(struct btrfs_root *root, | |||
| 1249 | 1250 | ||
| 1250 | nritems = btrfs_header_nritems(node); | 1251 | nritems = btrfs_header_nritems(node); |
| 1251 | nr = slot; | 1252 | nr = slot; |
| 1253 | if (node->map_token || path->skip_locking) | ||
| 1254 | map = false; | ||
| 1255 | |||
| 1252 | while (1) { | 1256 | while (1) { |
| 1253 | if (!node->map_token) { | 1257 | if (map && !node->map_token) { |
| 1254 | unsigned long offset = btrfs_node_key_ptr_offset(nr); | 1258 | unsigned long offset = btrfs_node_key_ptr_offset(nr); |
| 1255 | map_private_extent_buffer(node, offset, | 1259 | map_private_extent_buffer(node, offset, |
| 1256 | sizeof(struct btrfs_key_ptr), | 1260 | sizeof(struct btrfs_key_ptr), |
| @@ -1277,7 +1281,7 @@ static void reada_for_search(struct btrfs_root *root, | |||
| 1277 | if ((search <= target && target - search <= 65536) || | 1281 | if ((search <= target && target - search <= 65536) || |
| 1278 | (search > target && search - target <= 65536)) { | 1282 | (search > target && search - target <= 65536)) { |
| 1279 | gen = btrfs_node_ptr_generation(node, nr); | 1283 | gen = btrfs_node_ptr_generation(node, nr); |
| 1280 | if (node->map_token) { | 1284 | if (map && node->map_token) { |
| 1281 | unmap_extent_buffer(node, node->map_token, | 1285 | unmap_extent_buffer(node, node->map_token, |
| 1282 | KM_USER1); | 1286 | KM_USER1); |
| 1283 | node->map_token = NULL; | 1287 | node->map_token = NULL; |
| @@ -1289,7 +1293,7 @@ static void reada_for_search(struct btrfs_root *root, | |||
| 1289 | if ((nread > 65536 || nscan > 32)) | 1293 | if ((nread > 65536 || nscan > 32)) |
| 1290 | break; | 1294 | break; |
| 1291 | } | 1295 | } |
| 1292 | if (node->map_token) { | 1296 | if (map && node->map_token) { |
| 1293 | unmap_extent_buffer(node, node->map_token, KM_USER1); | 1297 | unmap_extent_buffer(node, node->map_token, KM_USER1); |
| 1294 | node->map_token = NULL; | 1298 | node->map_token = NULL; |
| 1295 | } | 1299 | } |
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index a203d363184d..9f68c6898653 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
| @@ -1668,8 +1668,6 @@ struct btrfs_root *open_ctree(struct super_block *sb, | |||
| 1668 | init_waitqueue_head(&fs_info->scrub_pause_wait); | 1668 | init_waitqueue_head(&fs_info->scrub_pause_wait); |
| 1669 | init_rwsem(&fs_info->scrub_super_lock); | 1669 | init_rwsem(&fs_info->scrub_super_lock); |
| 1670 | fs_info->scrub_workers_refcnt = 0; | 1670 | fs_info->scrub_workers_refcnt = 0; |
| 1671 | btrfs_init_workers(&fs_info->scrub_workers, "scrub", | ||
| 1672 | fs_info->thread_pool_size, &fs_info->generic_worker); | ||
| 1673 | 1671 | ||
| 1674 | sb->s_blocksize = 4096; | 1672 | sb->s_blocksize = 4096; |
| 1675 | sb->s_blocksize_bits = blksize_bits(4096); | 1673 | sb->s_blocksize_bits = blksize_bits(4096); |
| @@ -2911,9 +2909,8 @@ static int btrfs_destroy_delalloc_inodes(struct btrfs_root *root) | |||
| 2911 | 2909 | ||
| 2912 | INIT_LIST_HEAD(&splice); | 2910 | INIT_LIST_HEAD(&splice); |
| 2913 | 2911 | ||
| 2914 | list_splice_init(&root->fs_info->delalloc_inodes, &splice); | ||
| 2915 | |||
| 2916 | spin_lock(&root->fs_info->delalloc_lock); | 2912 | spin_lock(&root->fs_info->delalloc_lock); |
| 2913 | list_splice_init(&root->fs_info->delalloc_inodes, &splice); | ||
| 2917 | 2914 | ||
| 2918 | while (!list_empty(&splice)) { | 2915 | while (!list_empty(&splice)) { |
| 2919 | btrfs_inode = list_entry(splice.next, struct btrfs_inode, | 2916 | btrfs_inode = list_entry(splice.next, struct btrfs_inode, |
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 5b9b6b6df242..b42efc2ded51 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
| @@ -3089,6 +3089,13 @@ alloc: | |||
| 3089 | } | 3089 | } |
| 3090 | goto again; | 3090 | goto again; |
| 3091 | } | 3091 | } |
| 3092 | |||
| 3093 | /* | ||
| 3094 | * If we have less pinned bytes than we want to allocate then | ||
| 3095 | * don't bother committing the transaction, it won't help us. | ||
| 3096 | */ | ||
| 3097 | if (data_sinfo->bytes_pinned < bytes) | ||
| 3098 | committed = 1; | ||
| 3092 | spin_unlock(&data_sinfo->lock); | 3099 | spin_unlock(&data_sinfo->lock); |
| 3093 | 3100 | ||
| 3094 | /* commit the current transaction and try again */ | 3101 | /* commit the current transaction and try again */ |
| @@ -5211,9 +5218,7 @@ loop: | |||
| 5211 | * LOOP_NO_EMPTY_SIZE, set empty_size and empty_cluster to 0 and try | 5218 | * LOOP_NO_EMPTY_SIZE, set empty_size and empty_cluster to 0 and try |
| 5212 | * again | 5219 | * again |
| 5213 | */ | 5220 | */ |
| 5214 | if (!ins->objectid && loop < LOOP_NO_EMPTY_SIZE && | 5221 | if (!ins->objectid && loop < LOOP_NO_EMPTY_SIZE) { |
| 5215 | (found_uncached_bg || empty_size || empty_cluster || | ||
| 5216 | allowed_chunk_alloc)) { | ||
| 5217 | index = 0; | 5222 | index = 0; |
| 5218 | if (loop == LOOP_FIND_IDEAL && found_uncached_bg) { | 5223 | if (loop == LOOP_FIND_IDEAL && found_uncached_bg) { |
| 5219 | found_uncached_bg = false; | 5224 | found_uncached_bg = false; |
| @@ -5253,32 +5258,36 @@ loop: | |||
| 5253 | goto search; | 5258 | goto search; |
| 5254 | } | 5259 | } |
| 5255 | 5260 | ||
| 5256 | if (loop < LOOP_CACHING_WAIT) { | 5261 | loop++; |
| 5257 | loop++; | ||
| 5258 | goto search; | ||
| 5259 | } | ||
| 5260 | 5262 | ||
| 5261 | if (loop == LOOP_ALLOC_CHUNK) { | 5263 | if (loop == LOOP_ALLOC_CHUNK) { |
| 5262 | empty_size = 0; | 5264 | if (allowed_chunk_alloc) { |
| 5263 | empty_cluster = 0; | 5265 | ret = do_chunk_alloc(trans, root, num_bytes + |
| 5264 | } | 5266 | 2 * 1024 * 1024, data, |
| 5267 | CHUNK_ALLOC_LIMITED); | ||
| 5268 | allowed_chunk_alloc = 0; | ||
| 5269 | if (ret == 1) | ||
| 5270 | done_chunk_alloc = 1; | ||
| 5271 | } else if (!done_chunk_alloc && | ||
| 5272 | space_info->force_alloc == | ||
| 5273 | CHUNK_ALLOC_NO_FORCE) { | ||
| 5274 | space_info->force_alloc = CHUNK_ALLOC_LIMITED; | ||
| 5275 | } | ||
| 5265 | 5276 | ||
| 5266 | if (allowed_chunk_alloc) { | 5277 | /* |
| 5267 | ret = do_chunk_alloc(trans, root, num_bytes + | 5278 | * We didn't allocate a chunk, go ahead and drop the |
| 5268 | 2 * 1024 * 1024, data, | 5279 | * empty size and loop again. |
| 5269 | CHUNK_ALLOC_LIMITED); | 5280 | */ |
| 5270 | allowed_chunk_alloc = 0; | 5281 | if (!done_chunk_alloc) |
| 5271 | done_chunk_alloc = 1; | 5282 | loop = LOOP_NO_EMPTY_SIZE; |
| 5272 | } else if (!done_chunk_alloc && | ||
| 5273 | space_info->force_alloc == CHUNK_ALLOC_NO_FORCE) { | ||
| 5274 | space_info->force_alloc = CHUNK_ALLOC_LIMITED; | ||
| 5275 | } | 5283 | } |
| 5276 | 5284 | ||
| 5277 | if (loop < LOOP_NO_EMPTY_SIZE) { | 5285 | if (loop == LOOP_NO_EMPTY_SIZE) { |
| 5278 | loop++; | 5286 | empty_size = 0; |
| 5279 | goto search; | 5287 | empty_cluster = 0; |
| 5280 | } | 5288 | } |
| 5281 | ret = -ENOSPC; | 5289 | |
| 5290 | goto search; | ||
| 5282 | } else if (!ins->objectid) { | 5291 | } else if (!ins->objectid) { |
| 5283 | ret = -ENOSPC; | 5292 | ret = -ENOSPC; |
| 5284 | } else if (ins->objectid) { | 5293 | } else if (ins->objectid) { |
diff --git a/fs/btrfs/extent_io.h b/fs/btrfs/extent_io.h index 4e8445a4757c..a11a92ee2d30 100644 --- a/fs/btrfs/extent_io.h +++ b/fs/btrfs/extent_io.h | |||
| @@ -126,9 +126,9 @@ struct extent_buffer { | |||
| 126 | unsigned long map_len; | 126 | unsigned long map_len; |
| 127 | struct page *first_page; | 127 | struct page *first_page; |
| 128 | unsigned long bflags; | 128 | unsigned long bflags; |
| 129 | atomic_t refs; | ||
| 130 | struct list_head leak_list; | 129 | struct list_head leak_list; |
| 131 | struct rcu_head rcu_head; | 130 | struct rcu_head rcu_head; |
| 131 | atomic_t refs; | ||
| 132 | 132 | ||
| 133 | /* the spinlock is used to protect most operations */ | 133 | /* the spinlock is used to protect most operations */ |
| 134 | spinlock_t lock; | 134 | spinlock_t lock; |
diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c index ad144736a5fd..9f985a429877 100644 --- a/fs/btrfs/free-space-cache.c +++ b/fs/btrfs/free-space-cache.c | |||
| @@ -250,7 +250,7 @@ int __load_free_space_cache(struct btrfs_root *root, struct inode *inode, | |||
| 250 | pgoff_t index = 0; | 250 | pgoff_t index = 0; |
| 251 | unsigned long first_page_offset; | 251 | unsigned long first_page_offset; |
| 252 | int num_checksums; | 252 | int num_checksums; |
| 253 | int ret = 0, ret2; | 253 | int ret = 0; |
| 254 | 254 | ||
| 255 | INIT_LIST_HEAD(&bitmaps); | 255 | INIT_LIST_HEAD(&bitmaps); |
| 256 | 256 | ||
| @@ -421,11 +421,10 @@ int __load_free_space_cache(struct btrfs_root *root, struct inode *inode, | |||
| 421 | goto free_cache; | 421 | goto free_cache; |
| 422 | } | 422 | } |
| 423 | spin_lock(&ctl->tree_lock); | 423 | spin_lock(&ctl->tree_lock); |
| 424 | ret2 = link_free_space(ctl, e); | 424 | ret = link_free_space(ctl, e); |
| 425 | ctl->total_bitmaps++; | 425 | ctl->total_bitmaps++; |
| 426 | ctl->op->recalc_thresholds(ctl); | 426 | ctl->op->recalc_thresholds(ctl); |
| 427 | spin_unlock(&ctl->tree_lock); | 427 | spin_unlock(&ctl->tree_lock); |
| 428 | list_add_tail(&e->list, &bitmaps); | ||
| 429 | if (ret) { | 428 | if (ret) { |
| 430 | printk(KERN_ERR "Duplicate entries in " | 429 | printk(KERN_ERR "Duplicate entries in " |
| 431 | "free space cache, dumping\n"); | 430 | "free space cache, dumping\n"); |
| @@ -434,6 +433,7 @@ int __load_free_space_cache(struct btrfs_root *root, struct inode *inode, | |||
| 434 | page_cache_release(page); | 433 | page_cache_release(page); |
| 435 | goto free_cache; | 434 | goto free_cache; |
| 436 | } | 435 | } |
| 436 | list_add_tail(&e->list, &bitmaps); | ||
| 437 | } | 437 | } |
| 438 | 438 | ||
| 439 | num_entries--; | 439 | num_entries--; |
| @@ -1417,6 +1417,23 @@ again: | |||
| 1417 | return 0; | 1417 | return 0; |
| 1418 | } | 1418 | } |
| 1419 | 1419 | ||
| 1420 | static u64 add_bytes_to_bitmap(struct btrfs_free_space_ctl *ctl, | ||
| 1421 | struct btrfs_free_space *info, u64 offset, | ||
| 1422 | u64 bytes) | ||
| 1423 | { | ||
| 1424 | u64 bytes_to_set = 0; | ||
| 1425 | u64 end; | ||
| 1426 | |||
| 1427 | end = info->offset + (u64)(BITS_PER_BITMAP * ctl->unit); | ||
| 1428 | |||
| 1429 | bytes_to_set = min(end - offset, bytes); | ||
| 1430 | |||
| 1431 | bitmap_set_bits(ctl, info, offset, bytes_to_set); | ||
| 1432 | |||
| 1433 | return bytes_to_set; | ||
| 1434 | |||
| 1435 | } | ||
| 1436 | |||
| 1420 | static bool use_bitmap(struct btrfs_free_space_ctl *ctl, | 1437 | static bool use_bitmap(struct btrfs_free_space_ctl *ctl, |
| 1421 | struct btrfs_free_space *info) | 1438 | struct btrfs_free_space *info) |
| 1422 | { | 1439 | { |
| @@ -1453,12 +1470,18 @@ static bool use_bitmap(struct btrfs_free_space_ctl *ctl, | |||
| 1453 | return true; | 1470 | return true; |
| 1454 | } | 1471 | } |
| 1455 | 1472 | ||
| 1473 | static struct btrfs_free_space_op free_space_op = { | ||
| 1474 | .recalc_thresholds = recalculate_thresholds, | ||
| 1475 | .use_bitmap = use_bitmap, | ||
| 1476 | }; | ||
| 1477 | |||
| 1456 | static int insert_into_bitmap(struct btrfs_free_space_ctl *ctl, | 1478 | static int insert_into_bitmap(struct btrfs_free_space_ctl *ctl, |
| 1457 | struct btrfs_free_space *info) | 1479 | struct btrfs_free_space *info) |
| 1458 | { | 1480 | { |
| 1459 | struct btrfs_free_space *bitmap_info; | 1481 | struct btrfs_free_space *bitmap_info; |
| 1482 | struct btrfs_block_group_cache *block_group = NULL; | ||
| 1460 | int added = 0; | 1483 | int added = 0; |
| 1461 | u64 bytes, offset, end; | 1484 | u64 bytes, offset, bytes_added; |
| 1462 | int ret; | 1485 | int ret; |
| 1463 | 1486 | ||
| 1464 | bytes = info->bytes; | 1487 | bytes = info->bytes; |
| @@ -1467,7 +1490,49 @@ static int insert_into_bitmap(struct btrfs_free_space_ctl *ctl, | |||
| 1467 | if (!ctl->op->use_bitmap(ctl, info)) | 1490 | if (!ctl->op->use_bitmap(ctl, info)) |
| 1468 | return 0; | 1491 | return 0; |
| 1469 | 1492 | ||
| 1493 | if (ctl->op == &free_space_op) | ||
| 1494 | block_group = ctl->private; | ||
| 1470 | again: | 1495 | again: |
| 1496 | /* | ||
| 1497 | * Since we link bitmaps right into the cluster we need to see if we | ||
| 1498 | * have a cluster here, and if so and it has our bitmap we need to add | ||
| 1499 | * the free space to that bitmap. | ||
| 1500 | */ | ||
| 1501 | if (block_group && !list_empty(&block_group->cluster_list)) { | ||
| 1502 | struct btrfs_free_cluster *cluster; | ||
| 1503 | struct rb_node *node; | ||
| 1504 | struct btrfs_free_space *entry; | ||
| 1505 | |||
| 1506 | cluster = list_entry(block_group->cluster_list.next, | ||
| 1507 | struct btrfs_free_cluster, | ||
| 1508 | block_group_list); | ||
| 1509 | spin_lock(&cluster->lock); | ||
| 1510 | node = rb_first(&cluster->root); | ||
| 1511 | if (!node) { | ||
| 1512 | spin_unlock(&cluster->lock); | ||
| 1513 | goto no_cluster_bitmap; | ||
| 1514 | } | ||
| 1515 | |||
| 1516 | entry = rb_entry(node, struct btrfs_free_space, offset_index); | ||
| 1517 | if (!entry->bitmap) { | ||
| 1518 | spin_unlock(&cluster->lock); | ||
| 1519 | goto no_cluster_bitmap; | ||
| 1520 | } | ||
| 1521 | |||
| 1522 | if (entry->offset == offset_to_bitmap(ctl, offset)) { | ||
| 1523 | bytes_added = add_bytes_to_bitmap(ctl, entry, | ||
| 1524 | offset, bytes); | ||
| 1525 | bytes -= bytes_added; | ||
| 1526 | offset += bytes_added; | ||
| 1527 | } | ||
| 1528 | spin_unlock(&cluster->lock); | ||
| 1529 | if (!bytes) { | ||
| 1530 | ret = 1; | ||
| 1531 | goto out; | ||
| 1532 | } | ||
| 1533 | } | ||
| 1534 | |||
| 1535 | no_cluster_bitmap: | ||
| 1471 | bitmap_info = tree_search_offset(ctl, offset_to_bitmap(ctl, offset), | 1536 | bitmap_info = tree_search_offset(ctl, offset_to_bitmap(ctl, offset), |
| 1472 | 1, 0); | 1537 | 1, 0); |
| 1473 | if (!bitmap_info) { | 1538 | if (!bitmap_info) { |
| @@ -1475,19 +1540,10 @@ again: | |||
| 1475 | goto new_bitmap; | 1540 | goto new_bitmap; |
| 1476 | } | 1541 | } |
| 1477 | 1542 | ||
| 1478 | end = bitmap_info->offset + (u64)(BITS_PER_BITMAP * ctl->unit); | 1543 | bytes_added = add_bytes_to_bitmap(ctl, bitmap_info, offset, bytes); |
| 1479 | 1544 | bytes -= bytes_added; | |
| 1480 | if (offset >= bitmap_info->offset && offset + bytes > end) { | 1545 | offset += bytes_added; |
| 1481 | bitmap_set_bits(ctl, bitmap_info, offset, end - offset); | 1546 | added = 0; |
| 1482 | bytes -= end - offset; | ||
| 1483 | offset = end; | ||
| 1484 | added = 0; | ||
| 1485 | } else if (offset >= bitmap_info->offset && offset + bytes <= end) { | ||
| 1486 | bitmap_set_bits(ctl, bitmap_info, offset, bytes); | ||
| 1487 | bytes = 0; | ||
| 1488 | } else { | ||
| 1489 | BUG(); | ||
| 1490 | } | ||
| 1491 | 1547 | ||
| 1492 | if (!bytes) { | 1548 | if (!bytes) { |
| 1493 | ret = 1; | 1549 | ret = 1; |
| @@ -1766,11 +1822,6 @@ void btrfs_dump_free_space(struct btrfs_block_group_cache *block_group, | |||
| 1766 | "\n", count); | 1822 | "\n", count); |
| 1767 | } | 1823 | } |
| 1768 | 1824 | ||
| 1769 | static struct btrfs_free_space_op free_space_op = { | ||
| 1770 | .recalc_thresholds = recalculate_thresholds, | ||
| 1771 | .use_bitmap = use_bitmap, | ||
| 1772 | }; | ||
| 1773 | |||
| 1774 | void btrfs_init_free_space_ctl(struct btrfs_block_group_cache *block_group) | 1825 | void btrfs_init_free_space_ctl(struct btrfs_block_group_cache *block_group) |
| 1775 | { | 1826 | { |
| 1776 | struct btrfs_free_space_ctl *ctl = block_group->free_space_ctl; | 1827 | struct btrfs_free_space_ctl *ctl = block_group->free_space_ctl; |
| @@ -2142,9 +2193,11 @@ again: | |||
| 2142 | /* | 2193 | /* |
| 2143 | * This searches the block group for just extents to fill the cluster with. | 2194 | * This searches the block group for just extents to fill the cluster with. |
| 2144 | */ | 2195 | */ |
| 2145 | static int setup_cluster_no_bitmap(struct btrfs_block_group_cache *block_group, | 2196 | static noinline int |
| 2146 | struct btrfs_free_cluster *cluster, | 2197 | setup_cluster_no_bitmap(struct btrfs_block_group_cache *block_group, |
| 2147 | u64 offset, u64 bytes, u64 min_bytes) | 2198 | struct btrfs_free_cluster *cluster, |
| 2199 | struct list_head *bitmaps, u64 offset, u64 bytes, | ||
| 2200 | u64 min_bytes) | ||
| 2148 | { | 2201 | { |
| 2149 | struct btrfs_free_space_ctl *ctl = block_group->free_space_ctl; | 2202 | struct btrfs_free_space_ctl *ctl = block_group->free_space_ctl; |
| 2150 | struct btrfs_free_space *first = NULL; | 2203 | struct btrfs_free_space *first = NULL; |
| @@ -2166,6 +2219,8 @@ static int setup_cluster_no_bitmap(struct btrfs_block_group_cache *block_group, | |||
| 2166 | * extent entry. | 2219 | * extent entry. |
| 2167 | */ | 2220 | */ |
| 2168 | while (entry->bitmap) { | 2221 | while (entry->bitmap) { |
| 2222 | if (list_empty(&entry->list)) | ||
| 2223 | list_add_tail(&entry->list, bitmaps); | ||
| 2169 | node = rb_next(&entry->offset_index); | 2224 | node = rb_next(&entry->offset_index); |
| 2170 | if (!node) | 2225 | if (!node) |
| 2171 | return -ENOSPC; | 2226 | return -ENOSPC; |
| @@ -2185,8 +2240,12 @@ static int setup_cluster_no_bitmap(struct btrfs_block_group_cache *block_group, | |||
| 2185 | return -ENOSPC; | 2240 | return -ENOSPC; |
| 2186 | entry = rb_entry(node, struct btrfs_free_space, offset_index); | 2241 | entry = rb_entry(node, struct btrfs_free_space, offset_index); |
| 2187 | 2242 | ||
| 2188 | if (entry->bitmap) | 2243 | if (entry->bitmap) { |
| 2244 | if (list_empty(&entry->list)) | ||
| 2245 | list_add_tail(&entry->list, bitmaps); | ||
| 2189 | continue; | 2246 | continue; |
| 2247 | } | ||
| 2248 | |||
| 2190 | /* | 2249 | /* |
| 2191 | * we haven't filled the empty size and the window is | 2250 | * we haven't filled the empty size and the window is |
| 2192 | * very large. reset and try again | 2251 | * very large. reset and try again |
| @@ -2238,9 +2297,11 @@ static int setup_cluster_no_bitmap(struct btrfs_block_group_cache *block_group, | |||
| 2238 | * This specifically looks for bitmaps that may work in the cluster, we assume | 2297 | * This specifically looks for bitmaps that may work in the cluster, we assume |
| 2239 | * that we have already failed to find extents that will work. | 2298 | * that we have already failed to find extents that will work. |
| 2240 | */ | 2299 | */ |
| 2241 | static int setup_cluster_bitmap(struct btrfs_block_group_cache *block_group, | 2300 | static noinline int |
| 2242 | struct btrfs_free_cluster *cluster, | 2301 | setup_cluster_bitmap(struct btrfs_block_group_cache *block_group, |
| 2243 | u64 offset, u64 bytes, u64 min_bytes) | 2302 | struct btrfs_free_cluster *cluster, |
| 2303 | struct list_head *bitmaps, u64 offset, u64 bytes, | ||
| 2304 | u64 min_bytes) | ||
| 2244 | { | 2305 | { |
| 2245 | struct btrfs_free_space_ctl *ctl = block_group->free_space_ctl; | 2306 | struct btrfs_free_space_ctl *ctl = block_group->free_space_ctl; |
| 2246 | struct btrfs_free_space *entry; | 2307 | struct btrfs_free_space *entry; |
| @@ -2250,10 +2311,39 @@ static int setup_cluster_bitmap(struct btrfs_block_group_cache *block_group, | |||
| 2250 | if (ctl->total_bitmaps == 0) | 2311 | if (ctl->total_bitmaps == 0) |
| 2251 | return -ENOSPC; | 2312 | return -ENOSPC; |
| 2252 | 2313 | ||
| 2314 | /* | ||
| 2315 | * First check our cached list of bitmaps and see if there is an entry | ||
| 2316 | * here that will work. | ||
| 2317 | */ | ||
| 2318 | list_for_each_entry(entry, bitmaps, list) { | ||
| 2319 | if (entry->bytes < min_bytes) | ||
| 2320 | continue; | ||
| 2321 | ret = btrfs_bitmap_cluster(block_group, entry, cluster, offset, | ||
| 2322 | bytes, min_bytes); | ||
| 2323 | if (!ret) | ||
| 2324 | return 0; | ||
| 2325 | } | ||
| 2326 | |||
| 2327 | /* | ||
| 2328 | * If we do have entries on our list and we are here then we didn't find | ||
| 2329 | * anything, so go ahead and get the next entry after the last entry in | ||
| 2330 | * this list and start the search from there. | ||
| 2331 | */ | ||
| 2332 | if (!list_empty(bitmaps)) { | ||
| 2333 | entry = list_entry(bitmaps->prev, struct btrfs_free_space, | ||
| 2334 | list); | ||
| 2335 | node = rb_next(&entry->offset_index); | ||
| 2336 | if (!node) | ||
| 2337 | return -ENOSPC; | ||
| 2338 | entry = rb_entry(node, struct btrfs_free_space, offset_index); | ||
| 2339 | goto search; | ||
| 2340 | } | ||
| 2341 | |||
| 2253 | entry = tree_search_offset(ctl, offset_to_bitmap(ctl, offset), 0, 1); | 2342 | entry = tree_search_offset(ctl, offset_to_bitmap(ctl, offset), 0, 1); |
| 2254 | if (!entry) | 2343 | if (!entry) |
| 2255 | return -ENOSPC; | 2344 | return -ENOSPC; |
| 2256 | 2345 | ||
| 2346 | search: | ||
| 2257 | node = &entry->offset_index; | 2347 | node = &entry->offset_index; |
| 2258 | do { | 2348 | do { |
| 2259 | entry = rb_entry(node, struct btrfs_free_space, offset_index); | 2349 | entry = rb_entry(node, struct btrfs_free_space, offset_index); |
| @@ -2284,6 +2374,8 @@ int btrfs_find_space_cluster(struct btrfs_trans_handle *trans, | |||
| 2284 | u64 offset, u64 bytes, u64 empty_size) | 2374 | u64 offset, u64 bytes, u64 empty_size) |
| 2285 | { | 2375 | { |
| 2286 | struct btrfs_free_space_ctl *ctl = block_group->free_space_ctl; | 2376 | struct btrfs_free_space_ctl *ctl = block_group->free_space_ctl; |
| 2377 | struct list_head bitmaps; | ||
| 2378 | struct btrfs_free_space *entry, *tmp; | ||
| 2287 | u64 min_bytes; | 2379 | u64 min_bytes; |
| 2288 | int ret; | 2380 | int ret; |
| 2289 | 2381 | ||
| @@ -2322,11 +2414,16 @@ int btrfs_find_space_cluster(struct btrfs_trans_handle *trans, | |||
| 2322 | goto out; | 2414 | goto out; |
| 2323 | } | 2415 | } |
| 2324 | 2416 | ||
| 2325 | ret = setup_cluster_no_bitmap(block_group, cluster, offset, bytes, | 2417 | INIT_LIST_HEAD(&bitmaps); |
| 2326 | min_bytes); | 2418 | ret = setup_cluster_no_bitmap(block_group, cluster, &bitmaps, offset, |
| 2419 | bytes, min_bytes); | ||
| 2327 | if (ret) | 2420 | if (ret) |
| 2328 | ret = setup_cluster_bitmap(block_group, cluster, offset, | 2421 | ret = setup_cluster_bitmap(block_group, cluster, &bitmaps, |
| 2329 | bytes, min_bytes); | 2422 | offset, bytes, min_bytes); |
| 2423 | |||
| 2424 | /* Clear our temporary list */ | ||
| 2425 | list_for_each_entry_safe(entry, tmp, &bitmaps, list) | ||
| 2426 | list_del_init(&entry->list); | ||
| 2330 | 2427 | ||
| 2331 | if (!ret) { | 2428 | if (!ret) { |
| 2332 | atomic_inc(&block_group->count); | 2429 | atomic_inc(&block_group->count); |
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index ebf95f7a44d6..751ddf8fc58a 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
| @@ -1986,7 +1986,7 @@ static int btrfs_readpage_end_io_hook(struct page *page, u64 start, u64 end, | |||
| 1986 | } | 1986 | } |
| 1987 | 1987 | ||
| 1988 | if (BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM) | 1988 | if (BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM) |
| 1989 | return 0; | 1989 | goto good; |
| 1990 | 1990 | ||
| 1991 | if (root->root_key.objectid == BTRFS_DATA_RELOC_TREE_OBJECTID && | 1991 | if (root->root_key.objectid == BTRFS_DATA_RELOC_TREE_OBJECTID && |
| 1992 | test_range_bit(io_tree, start, end, EXTENT_NODATASUM, 1, NULL)) { | 1992 | test_range_bit(io_tree, start, end, EXTENT_NODATASUM, 1, NULL)) { |
| @@ -3646,7 +3646,7 @@ void btrfs_evict_inode(struct inode *inode) | |||
| 3646 | btrfs_i_size_write(inode, 0); | 3646 | btrfs_i_size_write(inode, 0); |
| 3647 | 3647 | ||
| 3648 | while (1) { | 3648 | while (1) { |
| 3649 | trans = btrfs_start_transaction(root, 0); | 3649 | trans = btrfs_join_transaction(root); |
| 3650 | BUG_ON(IS_ERR(trans)); | 3650 | BUG_ON(IS_ERR(trans)); |
| 3651 | trans->block_rsv = root->orphan_block_rsv; | 3651 | trans->block_rsv = root->orphan_block_rsv; |
| 3652 | 3652 | ||
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index ac37040e426a..b793d112d1f6 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c | |||
| @@ -2054,29 +2054,34 @@ static long btrfs_ioctl_rm_dev(struct btrfs_root *root, void __user *arg) | |||
| 2054 | 2054 | ||
| 2055 | static long btrfs_ioctl_fs_info(struct btrfs_root *root, void __user *arg) | 2055 | static long btrfs_ioctl_fs_info(struct btrfs_root *root, void __user *arg) |
| 2056 | { | 2056 | { |
| 2057 | struct btrfs_ioctl_fs_info_args fi_args; | 2057 | struct btrfs_ioctl_fs_info_args *fi_args; |
| 2058 | struct btrfs_device *device; | 2058 | struct btrfs_device *device; |
| 2059 | struct btrfs_device *next; | 2059 | struct btrfs_device *next; |
| 2060 | struct btrfs_fs_devices *fs_devices = root->fs_info->fs_devices; | 2060 | struct btrfs_fs_devices *fs_devices = root->fs_info->fs_devices; |
| 2061 | int ret = 0; | ||
| 2061 | 2062 | ||
| 2062 | if (!capable(CAP_SYS_ADMIN)) | 2063 | if (!capable(CAP_SYS_ADMIN)) |
| 2063 | return -EPERM; | 2064 | return -EPERM; |
| 2064 | 2065 | ||
| 2065 | fi_args.num_devices = fs_devices->num_devices; | 2066 | fi_args = kzalloc(sizeof(*fi_args), GFP_KERNEL); |
| 2066 | fi_args.max_id = 0; | 2067 | if (!fi_args) |
| 2067 | memcpy(&fi_args.fsid, root->fs_info->fsid, sizeof(fi_args.fsid)); | 2068 | return -ENOMEM; |
| 2069 | |||
| 2070 | fi_args->num_devices = fs_devices->num_devices; | ||
| 2071 | memcpy(&fi_args->fsid, root->fs_info->fsid, sizeof(fi_args->fsid)); | ||
| 2068 | 2072 | ||
| 2069 | mutex_lock(&fs_devices->device_list_mutex); | 2073 | mutex_lock(&fs_devices->device_list_mutex); |
| 2070 | list_for_each_entry_safe(device, next, &fs_devices->devices, dev_list) { | 2074 | list_for_each_entry_safe(device, next, &fs_devices->devices, dev_list) { |
| 2071 | if (device->devid > fi_args.max_id) | 2075 | if (device->devid > fi_args->max_id) |
| 2072 | fi_args.max_id = device->devid; | 2076 | fi_args->max_id = device->devid; |
| 2073 | } | 2077 | } |
| 2074 | mutex_unlock(&fs_devices->device_list_mutex); | 2078 | mutex_unlock(&fs_devices->device_list_mutex); |
| 2075 | 2079 | ||
| 2076 | if (copy_to_user(arg, &fi_args, sizeof(fi_args))) | 2080 | if (copy_to_user(arg, fi_args, sizeof(*fi_args))) |
| 2077 | return -EFAULT; | 2081 | ret = -EFAULT; |
| 2078 | 2082 | ||
| 2079 | return 0; | 2083 | kfree(fi_args); |
| 2084 | return ret; | ||
| 2080 | } | 2085 | } |
| 2081 | 2086 | ||
| 2082 | static long btrfs_ioctl_dev_info(struct btrfs_root *root, void __user *arg) | 2087 | static long btrfs_ioctl_dev_info(struct btrfs_root *root, void __user *arg) |
diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index df50fd1eca8f..a8d03d5efb5d 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c | |||
| @@ -16,13 +16,7 @@ | |||
| 16 | * Boston, MA 021110-1307, USA. | 16 | * Boston, MA 021110-1307, USA. |
| 17 | */ | 17 | */ |
| 18 | 18 | ||
| 19 | #include <linux/sched.h> | ||
| 20 | #include <linux/pagemap.h> | ||
| 21 | #include <linux/writeback.h> | ||
| 22 | #include <linux/blkdev.h> | 19 | #include <linux/blkdev.h> |
| 23 | #include <linux/rbtree.h> | ||
| 24 | #include <linux/slab.h> | ||
| 25 | #include <linux/workqueue.h> | ||
| 26 | #include "ctree.h" | 20 | #include "ctree.h" |
| 27 | #include "volumes.h" | 21 | #include "volumes.h" |
| 28 | #include "disk-io.h" | 22 | #include "disk-io.h" |
| @@ -804,18 +798,12 @@ static noinline_for_stack int scrub_stripe(struct scrub_dev *sdev, | |||
| 804 | 798 | ||
| 805 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); | 799 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); |
| 806 | if (ret < 0) | 800 | if (ret < 0) |
| 807 | goto out; | 801 | goto out_noplug; |
| 808 | |||
| 809 | l = path->nodes[0]; | ||
| 810 | slot = path->slots[0]; | ||
| 811 | btrfs_item_key_to_cpu(l, &key, slot); | ||
| 812 | if (key.objectid != logical) { | ||
| 813 | ret = btrfs_previous_item(root, path, 0, | ||
| 814 | BTRFS_EXTENT_ITEM_KEY); | ||
| 815 | if (ret < 0) | ||
| 816 | goto out; | ||
| 817 | } | ||
| 818 | 802 | ||
| 803 | /* | ||
| 804 | * we might miss half an extent here, but that doesn't matter, | ||
| 805 | * as it's only the prefetch | ||
| 806 | */ | ||
| 819 | while (1) { | 807 | while (1) { |
| 820 | l = path->nodes[0]; | 808 | l = path->nodes[0]; |
| 821 | slot = path->slots[0]; | 809 | slot = path->slots[0]; |
| @@ -824,7 +812,7 @@ static noinline_for_stack int scrub_stripe(struct scrub_dev *sdev, | |||
| 824 | if (ret == 0) | 812 | if (ret == 0) |
| 825 | continue; | 813 | continue; |
| 826 | if (ret < 0) | 814 | if (ret < 0) |
| 827 | goto out; | 815 | goto out_noplug; |
| 828 | 816 | ||
| 829 | break; | 817 | break; |
| 830 | } | 818 | } |
| @@ -906,15 +894,20 @@ again: | |||
| 906 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); | 894 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); |
| 907 | if (ret < 0) | 895 | if (ret < 0) |
| 908 | goto out; | 896 | goto out; |
| 909 | 897 | if (ret > 0) { | |
| 910 | l = path->nodes[0]; | ||
| 911 | slot = path->slots[0]; | ||
| 912 | btrfs_item_key_to_cpu(l, &key, slot); | ||
| 913 | if (key.objectid != logical) { | ||
| 914 | ret = btrfs_previous_item(root, path, 0, | 898 | ret = btrfs_previous_item(root, path, 0, |
| 915 | BTRFS_EXTENT_ITEM_KEY); | 899 | BTRFS_EXTENT_ITEM_KEY); |
| 916 | if (ret < 0) | 900 | if (ret < 0) |
| 917 | goto out; | 901 | goto out; |
| 902 | if (ret > 0) { | ||
| 903 | /* there's no smaller item, so stick with the | ||
| 904 | * larger one */ | ||
| 905 | btrfs_release_path(path); | ||
| 906 | ret = btrfs_search_slot(NULL, root, &key, | ||
| 907 | path, 0, 0); | ||
| 908 | if (ret < 0) | ||
| 909 | goto out; | ||
| 910 | } | ||
| 918 | } | 911 | } |
| 919 | 912 | ||
| 920 | while (1) { | 913 | while (1) { |
| @@ -989,6 +982,7 @@ next: | |||
| 989 | 982 | ||
| 990 | out: | 983 | out: |
| 991 | blk_finish_plug(&plug); | 984 | blk_finish_plug(&plug); |
| 985 | out_noplug: | ||
| 992 | btrfs_free_path(path); | 986 | btrfs_free_path(path); |
| 993 | return ret < 0 ? ret : 0; | 987 | return ret < 0 ? ret : 0; |
| 994 | } | 988 | } |
| @@ -1064,8 +1058,15 @@ int scrub_enumerate_chunks(struct scrub_dev *sdev, u64 start, u64 end) | |||
| 1064 | while (1) { | 1058 | while (1) { |
| 1065 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); | 1059 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); |
| 1066 | if (ret < 0) | 1060 | if (ret < 0) |
| 1067 | goto out; | 1061 | break; |
| 1068 | ret = 0; | 1062 | if (ret > 0) { |
| 1063 | if (path->slots[0] >= | ||
| 1064 | btrfs_header_nritems(path->nodes[0])) { | ||
| 1065 | ret = btrfs_next_leaf(root, path); | ||
| 1066 | if (ret) | ||
| 1067 | break; | ||
| 1068 | } | ||
| 1069 | } | ||
| 1069 | 1070 | ||
| 1070 | l = path->nodes[0]; | 1071 | l = path->nodes[0]; |
| 1071 | slot = path->slots[0]; | 1072 | slot = path->slots[0]; |
| @@ -1075,7 +1076,7 @@ int scrub_enumerate_chunks(struct scrub_dev *sdev, u64 start, u64 end) | |||
| 1075 | if (found_key.objectid != sdev->dev->devid) | 1076 | if (found_key.objectid != sdev->dev->devid) |
| 1076 | break; | 1077 | break; |
| 1077 | 1078 | ||
| 1078 | if (btrfs_key_type(&key) != BTRFS_DEV_EXTENT_KEY) | 1079 | if (btrfs_key_type(&found_key) != BTRFS_DEV_EXTENT_KEY) |
| 1079 | break; | 1080 | break; |
| 1080 | 1081 | ||
| 1081 | if (found_key.offset >= end) | 1082 | if (found_key.offset >= end) |
| @@ -1104,7 +1105,7 @@ int scrub_enumerate_chunks(struct scrub_dev *sdev, u64 start, u64 end) | |||
| 1104 | cache = btrfs_lookup_block_group(fs_info, chunk_offset); | 1105 | cache = btrfs_lookup_block_group(fs_info, chunk_offset); |
| 1105 | if (!cache) { | 1106 | if (!cache) { |
| 1106 | ret = -ENOENT; | 1107 | ret = -ENOENT; |
| 1107 | goto out; | 1108 | break; |
| 1108 | } | 1109 | } |
| 1109 | ret = scrub_chunk(sdev, chunk_tree, chunk_objectid, | 1110 | ret = scrub_chunk(sdev, chunk_tree, chunk_objectid, |
| 1110 | chunk_offset, length); | 1111 | chunk_offset, length); |
| @@ -1116,9 +1117,13 @@ int scrub_enumerate_chunks(struct scrub_dev *sdev, u64 start, u64 end) | |||
| 1116 | btrfs_release_path(path); | 1117 | btrfs_release_path(path); |
| 1117 | } | 1118 | } |
| 1118 | 1119 | ||
| 1119 | out: | ||
| 1120 | btrfs_free_path(path); | 1120 | btrfs_free_path(path); |
| 1121 | return ret; | 1121 | |
| 1122 | /* | ||
| 1123 | * ret can still be 1 from search_slot or next_leaf, | ||
| 1124 | * that's not an error | ||
| 1125 | */ | ||
| 1126 | return ret < 0 ? ret : 0; | ||
| 1122 | } | 1127 | } |
| 1123 | 1128 | ||
| 1124 | static noinline_for_stack int scrub_supers(struct scrub_dev *sdev) | 1129 | static noinline_for_stack int scrub_supers(struct scrub_dev *sdev) |
| @@ -1155,8 +1160,12 @@ static noinline_for_stack int scrub_workers_get(struct btrfs_root *root) | |||
| 1155 | struct btrfs_fs_info *fs_info = root->fs_info; | 1160 | struct btrfs_fs_info *fs_info = root->fs_info; |
| 1156 | 1161 | ||
| 1157 | mutex_lock(&fs_info->scrub_lock); | 1162 | mutex_lock(&fs_info->scrub_lock); |
| 1158 | if (fs_info->scrub_workers_refcnt == 0) | 1163 | if (fs_info->scrub_workers_refcnt == 0) { |
| 1164 | btrfs_init_workers(&fs_info->scrub_workers, "scrub", | ||
| 1165 | fs_info->thread_pool_size, &fs_info->generic_worker); | ||
| 1166 | fs_info->scrub_workers.idle_thresh = 4; | ||
| 1159 | btrfs_start_workers(&fs_info->scrub_workers, 1); | 1167 | btrfs_start_workers(&fs_info->scrub_workers, 1); |
| 1168 | } | ||
| 1160 | ++fs_info->scrub_workers_refcnt; | 1169 | ++fs_info->scrub_workers_refcnt; |
| 1161 | mutex_unlock(&fs_info->scrub_lock); | 1170 | mutex_unlock(&fs_info->scrub_lock); |
| 1162 | 1171 | ||
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index dd719662340e..2b3590b9fe98 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c | |||
| @@ -349,7 +349,7 @@ int btrfs_wait_for_commit(struct btrfs_root *root, u64 transid) | |||
| 349 | list) { | 349 | list) { |
| 350 | if (t->in_commit) { | 350 | if (t->in_commit) { |
| 351 | if (t->commit_done) | 351 | if (t->commit_done) |
| 352 | goto out; | 352 | break; |
| 353 | cur_trans = t; | 353 | cur_trans = t; |
| 354 | atomic_inc(&cur_trans->use_count); | 354 | atomic_inc(&cur_trans->use_count); |
| 355 | break; | 355 | break; |
| @@ -1118,8 +1118,11 @@ int btrfs_commit_transaction_async(struct btrfs_trans_handle *trans, | |||
| 1118 | wait_current_trans_commit_start_and_unblock(root, cur_trans); | 1118 | wait_current_trans_commit_start_and_unblock(root, cur_trans); |
| 1119 | else | 1119 | else |
| 1120 | wait_current_trans_commit_start(root, cur_trans); | 1120 | wait_current_trans_commit_start(root, cur_trans); |
| 1121 | put_transaction(cur_trans); | ||
| 1122 | 1121 | ||
| 1122 | if (current->journal_info == trans) | ||
| 1123 | current->journal_info = NULL; | ||
| 1124 | |||
| 1125 | put_transaction(cur_trans); | ||
| 1123 | return 0; | 1126 | return 0; |
| 1124 | } | 1127 | } |
| 1125 | 1128 | ||
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index da541dfca2e3..1efa56e18f9b 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c | |||
| @@ -689,12 +689,8 @@ int btrfs_scan_one_device(const char *path, fmode_t flags, void *holder, | |||
| 689 | transid = btrfs_super_generation(disk_super); | 689 | transid = btrfs_super_generation(disk_super); |
| 690 | if (disk_super->label[0]) | 690 | if (disk_super->label[0]) |
| 691 | printk(KERN_INFO "device label %s ", disk_super->label); | 691 | printk(KERN_INFO "device label %s ", disk_super->label); |
| 692 | else { | 692 | else |
| 693 | /* FIXME, make a readl uuid parser */ | 693 | printk(KERN_INFO "device fsid %pU ", disk_super->fsid); |
| 694 | printk(KERN_INFO "device fsid %llx-%llx ", | ||
| 695 | *(unsigned long long *)disk_super->fsid, | ||
| 696 | *(unsigned long long *)(disk_super->fsid + 8)); | ||
| 697 | } | ||
| 698 | printk(KERN_CONT "devid %llu transid %llu %s\n", | 694 | printk(KERN_CONT "devid %llu transid %llu %s\n", |
| 699 | (unsigned long long)devid, (unsigned long long)transid, path); | 695 | (unsigned long long)devid, (unsigned long long)transid, path); |
| 700 | ret = device_list_add(path, disk_super, devid, fs_devices_ret); | 696 | ret = device_list_add(path, disk_super, devid, fs_devices_ret); |
diff --git a/fs/cifs/Kconfig b/fs/cifs/Kconfig index 1cd4c3a1862d..53ed1ad2c112 100644 --- a/fs/cifs/Kconfig +++ b/fs/cifs/Kconfig | |||
| @@ -7,6 +7,7 @@ config CIFS | |||
| 7 | select CRYPTO_MD5 | 7 | select CRYPTO_MD5 |
| 8 | select CRYPTO_HMAC | 8 | select CRYPTO_HMAC |
| 9 | select CRYPTO_ARC4 | 9 | select CRYPTO_ARC4 |
| 10 | select CRYPTO_ECB | ||
| 10 | select CRYPTO_DES | 11 | select CRYPTO_DES |
| 11 | help | 12 | help |
| 12 | This is the client VFS module for the Common Internet File System | 13 | This is the client VFS module for the Common Internet File System |
| @@ -148,7 +149,7 @@ config CIFS_FSCACHE | |||
| 148 | 149 | ||
| 149 | config CIFS_ACL | 150 | config CIFS_ACL |
| 150 | bool "Provide CIFS ACL support (EXPERIMENTAL)" | 151 | bool "Provide CIFS ACL support (EXPERIMENTAL)" |
| 151 | depends on EXPERIMENTAL && CIFS_XATTR | 152 | depends on EXPERIMENTAL && CIFS_XATTR && KEYS |
| 152 | help | 153 | help |
| 153 | Allows to fetch CIFS/NTFS ACL from the server. The DACL blob | 154 | Allows to fetch CIFS/NTFS ACL from the server. The DACL blob |
| 154 | is handed over to the application/caller. | 155 | is handed over to the application/caller. |
diff --git a/fs/cifs/cifsencrypt.c b/fs/cifs/cifsencrypt.c index dfbd9f1f373d..5a0ee7f2af06 100644 --- a/fs/cifs/cifsencrypt.c +++ b/fs/cifs/cifsencrypt.c | |||
| @@ -184,7 +184,7 @@ int cifs_verify_signature(struct smb_hdr *cifs_pdu, | |||
| 184 | if (cifs_pdu == NULL || server == NULL) | 184 | if (cifs_pdu == NULL || server == NULL) |
| 185 | return -EINVAL; | 185 | return -EINVAL; |
| 186 | 186 | ||
| 187 | if (cifs_pdu->Command == SMB_COM_NEGOTIATE) | 187 | if (!server->session_estab) |
| 188 | return 0; | 188 | return 0; |
| 189 | 189 | ||
| 190 | if (cifs_pdu->Command == SMB_COM_LOCKING_ANDX) { | 190 | if (cifs_pdu->Command == SMB_COM_LOCKING_ANDX) { |
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index 6d88b82537c3..bb659eb73810 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c | |||
| @@ -784,7 +784,7 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, | |||
| 784 | struct smb_vol *vol) | 784 | struct smb_vol *vol) |
| 785 | { | 785 | { |
| 786 | char *value, *data, *end; | 786 | char *value, *data, *end; |
| 787 | char *mountdata_copy, *options; | 787 | char *mountdata_copy = NULL, *options; |
| 788 | unsigned int temp_len, i, j; | 788 | unsigned int temp_len, i, j; |
| 789 | char separator[2]; | 789 | char separator[2]; |
| 790 | short int override_uid = -1; | 790 | short int override_uid = -1; |
| @@ -1391,7 +1391,7 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, | |||
| 1391 | "/proc/fs/cifs/LookupCacheEnabled to 0\n"); | 1391 | "/proc/fs/cifs/LookupCacheEnabled to 0\n"); |
| 1392 | } else if (strnicmp(data, "fsc", 3) == 0) { | 1392 | } else if (strnicmp(data, "fsc", 3) == 0) { |
| 1393 | #ifndef CONFIG_CIFS_FSCACHE | 1393 | #ifndef CONFIG_CIFS_FSCACHE |
| 1394 | cERROR(1, "FS-Cache support needs CONFIG_CIFS_FSCACHE" | 1394 | cERROR(1, "FS-Cache support needs CONFIG_CIFS_FSCACHE " |
| 1395 | "kernel config option set"); | 1395 | "kernel config option set"); |
| 1396 | goto cifs_parse_mount_err; | 1396 | goto cifs_parse_mount_err; |
| 1397 | #endif | 1397 | #endif |
| @@ -1976,7 +1976,7 @@ cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info) | |||
| 1976 | warned_on_ntlm = true; | 1976 | warned_on_ntlm = true; |
| 1977 | cERROR(1, "default security mechanism requested. The default " | 1977 | cERROR(1, "default security mechanism requested. The default " |
| 1978 | "security mechanism will be upgraded from ntlm to " | 1978 | "security mechanism will be upgraded from ntlm to " |
| 1979 | "ntlmv2 in kernel release 2.6.41"); | 1979 | "ntlmv2 in kernel release 3.1"); |
| 1980 | } | 1980 | } |
| 1981 | ses->overrideSecFlg = volume_info->secFlg; | 1981 | ses->overrideSecFlg = volume_info->secFlg; |
| 1982 | 1982 | ||
| @@ -1093,6 +1093,7 @@ int flush_old_exec(struct linux_binprm * bprm) | |||
| 1093 | 1093 | ||
| 1094 | bprm->mm = NULL; /* We're using it now */ | 1094 | bprm->mm = NULL; /* We're using it now */ |
| 1095 | 1095 | ||
| 1096 | set_fs(USER_DS); | ||
| 1096 | current->flags &= ~(PF_RANDOMIZE | PF_KTHREAD); | 1097 | current->flags &= ~(PF_RANDOMIZE | PF_KTHREAD); |
| 1097 | flush_thread(); | 1098 | flush_thread(); |
| 1098 | current->personality &= ~bprm->per_clear; | 1099 | current->personality &= ~bprm->per_clear; |
| @@ -1357,10 +1358,6 @@ int search_binary_handler(struct linux_binprm *bprm,struct pt_regs *regs) | |||
| 1357 | if (retval) | 1358 | if (retval) |
| 1358 | return retval; | 1359 | return retval; |
| 1359 | 1360 | ||
| 1360 | /* kernel module loader fixup */ | ||
| 1361 | /* so we don't try to load run modprobe in kernel space. */ | ||
| 1362 | set_fs(USER_DS); | ||
| 1363 | |||
| 1364 | retval = audit_bprm(bprm); | 1361 | retval = audit_bprm(bprm); |
| 1365 | if (retval) | 1362 | if (retval) |
| 1366 | return retval; | 1363 | return retval; |
diff --git a/fs/nilfs2/btree.c b/fs/nilfs2/btree.c index 7eafe468a29c..b2e3ff347620 100644 --- a/fs/nilfs2/btree.c +++ b/fs/nilfs2/btree.c | |||
| @@ -1346,6 +1346,11 @@ static void nilfs_btree_shrink(struct nilfs_bmap *btree, | |||
| 1346 | path[level].bp_bh = NULL; | 1346 | path[level].bp_bh = NULL; |
| 1347 | } | 1347 | } |
| 1348 | 1348 | ||
| 1349 | static void nilfs_btree_nop(struct nilfs_bmap *btree, | ||
| 1350 | struct nilfs_btree_path *path, | ||
| 1351 | int level, __u64 *keyp, __u64 *ptrp) | ||
| 1352 | { | ||
| 1353 | } | ||
| 1349 | 1354 | ||
| 1350 | static int nilfs_btree_prepare_delete(struct nilfs_bmap *btree, | 1355 | static int nilfs_btree_prepare_delete(struct nilfs_bmap *btree, |
| 1351 | struct nilfs_btree_path *path, | 1356 | struct nilfs_btree_path *path, |
| @@ -1356,20 +1361,19 @@ static int nilfs_btree_prepare_delete(struct nilfs_bmap *btree, | |||
| 1356 | struct buffer_head *bh; | 1361 | struct buffer_head *bh; |
| 1357 | struct nilfs_btree_node *node, *parent, *sib; | 1362 | struct nilfs_btree_node *node, *parent, *sib; |
| 1358 | __u64 sibptr; | 1363 | __u64 sibptr; |
| 1359 | int pindex, level, ncmin, ncmax, ncblk, ret; | 1364 | int pindex, dindex, level, ncmin, ncmax, ncblk, ret; |
| 1360 | 1365 | ||
| 1361 | ret = 0; | 1366 | ret = 0; |
| 1362 | stats->bs_nblocks = 0; | 1367 | stats->bs_nblocks = 0; |
| 1363 | ncmin = NILFS_BTREE_NODE_NCHILDREN_MIN(nilfs_btree_node_size(btree)); | 1368 | ncmin = NILFS_BTREE_NODE_NCHILDREN_MIN(nilfs_btree_node_size(btree)); |
| 1364 | ncblk = nilfs_btree_nchildren_per_block(btree); | 1369 | ncblk = nilfs_btree_nchildren_per_block(btree); |
| 1365 | 1370 | ||
| 1366 | for (level = NILFS_BTREE_LEVEL_NODE_MIN; | 1371 | for (level = NILFS_BTREE_LEVEL_NODE_MIN, dindex = path[level].bp_index; |
| 1367 | level < nilfs_btree_height(btree) - 1; | 1372 | level < nilfs_btree_height(btree) - 1; |
| 1368 | level++) { | 1373 | level++) { |
| 1369 | node = nilfs_btree_get_nonroot_node(path, level); | 1374 | node = nilfs_btree_get_nonroot_node(path, level); |
| 1370 | path[level].bp_oldreq.bpr_ptr = | 1375 | path[level].bp_oldreq.bpr_ptr = |
| 1371 | nilfs_btree_node_get_ptr(node, path[level].bp_index, | 1376 | nilfs_btree_node_get_ptr(node, dindex, ncblk); |
| 1372 | ncblk); | ||
| 1373 | ret = nilfs_bmap_prepare_end_ptr(btree, | 1377 | ret = nilfs_bmap_prepare_end_ptr(btree, |
| 1374 | &path[level].bp_oldreq, dat); | 1378 | &path[level].bp_oldreq, dat); |
| 1375 | if (ret < 0) | 1379 | if (ret < 0) |
| @@ -1383,6 +1387,7 @@ static int nilfs_btree_prepare_delete(struct nilfs_bmap *btree, | |||
| 1383 | 1387 | ||
| 1384 | parent = nilfs_btree_get_node(btree, path, level + 1, &ncmax); | 1388 | parent = nilfs_btree_get_node(btree, path, level + 1, &ncmax); |
| 1385 | pindex = path[level + 1].bp_index; | 1389 | pindex = path[level + 1].bp_index; |
| 1390 | dindex = pindex; | ||
| 1386 | 1391 | ||
| 1387 | if (pindex > 0) { | 1392 | if (pindex > 0) { |
| 1388 | /* left sibling */ | 1393 | /* left sibling */ |
| @@ -1421,6 +1426,14 @@ static int nilfs_btree_prepare_delete(struct nilfs_bmap *btree, | |||
| 1421 | path[level].bp_sib_bh = bh; | 1426 | path[level].bp_sib_bh = bh; |
| 1422 | path[level].bp_op = nilfs_btree_concat_right; | 1427 | path[level].bp_op = nilfs_btree_concat_right; |
| 1423 | stats->bs_nblocks++; | 1428 | stats->bs_nblocks++; |
| 1429 | /* | ||
| 1430 | * When merging right sibling node | ||
| 1431 | * into the current node, pointer to | ||
| 1432 | * the right sibling node must be | ||
| 1433 | * terminated instead. The adjustment | ||
| 1434 | * below is required for that. | ||
| 1435 | */ | ||
| 1436 | dindex = pindex + 1; | ||
| 1424 | /* continue; */ | 1437 | /* continue; */ |
| 1425 | } | 1438 | } |
| 1426 | } else { | 1439 | } else { |
| @@ -1431,29 +1444,31 @@ static int nilfs_btree_prepare_delete(struct nilfs_bmap *btree, | |||
| 1431 | NILFS_BTREE_ROOT_NCHILDREN_MAX) { | 1444 | NILFS_BTREE_ROOT_NCHILDREN_MAX) { |
| 1432 | path[level].bp_op = nilfs_btree_shrink; | 1445 | path[level].bp_op = nilfs_btree_shrink; |
| 1433 | stats->bs_nblocks += 2; | 1446 | stats->bs_nblocks += 2; |
| 1447 | level++; | ||
| 1448 | path[level].bp_op = nilfs_btree_nop; | ||
| 1449 | goto shrink_root_child; | ||
| 1434 | } else { | 1450 | } else { |
| 1435 | path[level].bp_op = nilfs_btree_do_delete; | 1451 | path[level].bp_op = nilfs_btree_do_delete; |
| 1436 | stats->bs_nblocks++; | 1452 | stats->bs_nblocks++; |
| 1453 | goto out; | ||
| 1437 | } | 1454 | } |
| 1438 | |||
| 1439 | goto out; | ||
| 1440 | |||
| 1441 | } | 1455 | } |
| 1442 | } | 1456 | } |
| 1443 | 1457 | ||
| 1458 | /* child of the root node is deleted */ | ||
| 1459 | path[level].bp_op = nilfs_btree_do_delete; | ||
| 1460 | stats->bs_nblocks++; | ||
| 1461 | |||
| 1462 | shrink_root_child: | ||
| 1444 | node = nilfs_btree_get_root(btree); | 1463 | node = nilfs_btree_get_root(btree); |
| 1445 | path[level].bp_oldreq.bpr_ptr = | 1464 | path[level].bp_oldreq.bpr_ptr = |
| 1446 | nilfs_btree_node_get_ptr(node, path[level].bp_index, | 1465 | nilfs_btree_node_get_ptr(node, dindex, |
| 1447 | NILFS_BTREE_ROOT_NCHILDREN_MAX); | 1466 | NILFS_BTREE_ROOT_NCHILDREN_MAX); |
| 1448 | 1467 | ||
| 1449 | ret = nilfs_bmap_prepare_end_ptr(btree, &path[level].bp_oldreq, dat); | 1468 | ret = nilfs_bmap_prepare_end_ptr(btree, &path[level].bp_oldreq, dat); |
| 1450 | if (ret < 0) | 1469 | if (ret < 0) |
| 1451 | goto err_out_child_node; | 1470 | goto err_out_child_node; |
| 1452 | 1471 | ||
| 1453 | /* child of the root node is deleted */ | ||
| 1454 | path[level].bp_op = nilfs_btree_do_delete; | ||
| 1455 | stats->bs_nblocks++; | ||
| 1456 | |||
| 1457 | /* success */ | 1472 | /* success */ |
| 1458 | out: | 1473 | out: |
| 1459 | *levelp = level; | 1474 | *levelp = level; |
diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c index 141646e88fb5..bb24ab6c282f 100644 --- a/fs/nilfs2/segment.c +++ b/fs/nilfs2/segment.c | |||
| @@ -2573,7 +2573,7 @@ static struct nilfs_sc_info *nilfs_segctor_new(struct super_block *sb, | |||
| 2573 | sci->sc_watermark = NILFS_SC_DEFAULT_WATERMARK; | 2573 | sci->sc_watermark = NILFS_SC_DEFAULT_WATERMARK; |
| 2574 | 2574 | ||
| 2575 | if (nilfs->ns_interval) | 2575 | if (nilfs->ns_interval) |
| 2576 | sci->sc_interval = nilfs->ns_interval; | 2576 | sci->sc_interval = HZ * nilfs->ns_interval; |
| 2577 | if (nilfs->ns_watermark) | 2577 | if (nilfs->ns_watermark) |
| 2578 | sci->sc_watermark = nilfs->ns_watermark; | 2578 | sci->sc_watermark = nilfs->ns_watermark; |
| 2579 | return sci; | 2579 | return sci; |
diff --git a/include/linux/basic_mmio_gpio.h b/include/linux/basic_mmio_gpio.h index 1ae12710d732..98999cf107ce 100644 --- a/include/linux/basic_mmio_gpio.h +++ b/include/linux/basic_mmio_gpio.h | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | #include <linux/gpio.h> | 16 | #include <linux/gpio.h> |
| 17 | #include <linux/types.h> | 17 | #include <linux/types.h> |
| 18 | #include <linux/compiler.h> | 18 | #include <linux/compiler.h> |
| 19 | #include <linux/spinlock_types.h> | ||
| 19 | 20 | ||
| 20 | struct bgpio_pdata { | 21 | struct bgpio_pdata { |
| 21 | int base; | 22 | int base; |
diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h index c6a850ab2ec5..439b173c5882 100644 --- a/include/linux/ethtool.h +++ b/include/linux/ethtool.h | |||
| @@ -268,7 +268,7 @@ struct ethtool_pauseparam { | |||
| 268 | __u32 cmd; /* ETHTOOL_{G,S}PAUSEPARAM */ | 268 | __u32 cmd; /* ETHTOOL_{G,S}PAUSEPARAM */ |
| 269 | 269 | ||
| 270 | /* If the link is being auto-negotiated (via ethtool_cmd.autoneg | 270 | /* If the link is being auto-negotiated (via ethtool_cmd.autoneg |
| 271 | * being true) the user may set 'autonet' here non-zero to have the | 271 | * being true) the user may set 'autoneg' here non-zero to have the |
| 272 | * pause parameters be auto-negotiated too. In such a case, the | 272 | * pause parameters be auto-negotiated too. In such a case, the |
| 273 | * {rx,tx}_pause values below determine what capabilities are | 273 | * {rx,tx}_pause values below determine what capabilities are |
| 274 | * advertised. | 274 | * advertised. |
| @@ -811,7 +811,7 @@ bool ethtool_invalid_flags(struct net_device *dev, u32 data, u32 supported); | |||
| 811 | * @get_tx_csum: Deprecated as redundant. Report whether transmit checksums | 811 | * @get_tx_csum: Deprecated as redundant. Report whether transmit checksums |
| 812 | * are turned on or off. | 812 | * are turned on or off. |
| 813 | * @set_tx_csum: Deprecated in favour of generic netdev features. Turn | 813 | * @set_tx_csum: Deprecated in favour of generic netdev features. Turn |
| 814 | * transmit checksums on or off. Returns a egative error code or zero. | 814 | * transmit checksums on or off. Returns a negative error code or zero. |
| 815 | * @get_sg: Deprecated as redundant. Report whether scatter-gather is | 815 | * @get_sg: Deprecated as redundant. Report whether scatter-gather is |
| 816 | * enabled. | 816 | * enabled. |
| 817 | * @set_sg: Deprecated in favour of generic netdev features. Turn | 817 | * @set_sg: Deprecated in favour of generic netdev features. Turn |
| @@ -1087,7 +1087,7 @@ struct ethtool_ops { | |||
| 1087 | /* The following are all involved in forcing a particular link | 1087 | /* The following are all involved in forcing a particular link |
| 1088 | * mode for the device for setting things. When getting the | 1088 | * mode for the device for setting things. When getting the |
| 1089 | * devices settings, these indicate the current mode and whether | 1089 | * devices settings, these indicate the current mode and whether |
| 1090 | * it was foced up into this mode or autonegotiated. | 1090 | * it was forced up into this mode or autonegotiated. |
| 1091 | */ | 1091 | */ |
| 1092 | 1092 | ||
| 1093 | /* The forced speed, 10Mb, 100Mb, gigabit, 2.5Gb, 10GbE. */ | 1093 | /* The forced speed, 10Mb, 100Mb, gigabit, 2.5Gb, 10GbE. */ |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 646a1836152a..1c777878f1ea 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
| @@ -744,9 +744,13 @@ struct inode { | |||
| 744 | 744 | ||
| 745 | spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */ | 745 | spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */ |
| 746 | unsigned int i_flags; | 746 | unsigned int i_flags; |
| 747 | unsigned int i_state; | ||
| 748 | #ifdef CONFIG_SECURITY | ||
| 749 | void *i_security; | ||
| 750 | #endif | ||
| 747 | struct mutex i_mutex; | 751 | struct mutex i_mutex; |
| 748 | 752 | ||
| 749 | unsigned long i_state; | 753 | |
| 750 | unsigned long dirtied_when; /* jiffies of first dirtying */ | 754 | unsigned long dirtied_when; /* jiffies of first dirtying */ |
| 751 | 755 | ||
| 752 | struct hlist_node i_hash; | 756 | struct hlist_node i_hash; |
| @@ -798,9 +802,6 @@ struct inode { | |||
| 798 | atomic_t i_readcount; /* struct files open RO */ | 802 | atomic_t i_readcount; /* struct files open RO */ |
| 799 | #endif | 803 | #endif |
| 800 | atomic_t i_writecount; | 804 | atomic_t i_writecount; |
| 801 | #ifdef CONFIG_SECURITY | ||
| 802 | void *i_security; | ||
| 803 | #endif | ||
| 804 | #ifdef CONFIG_FS_POSIX_ACL | 805 | #ifdef CONFIG_FS_POSIX_ACL |
| 805 | struct posix_acl *i_acl; | 806 | struct posix_acl *i_acl; |
| 806 | struct posix_acl *i_default_acl; | 807 | struct posix_acl *i_default_acl; |
diff --git a/include/linux/if_packet.h b/include/linux/if_packet.h index 6d66ce1791a9..7b318630139f 100644 --- a/include/linux/if_packet.h +++ b/include/linux/if_packet.h | |||
| @@ -62,6 +62,7 @@ struct tpacket_auxdata { | |||
| 62 | __u16 tp_mac; | 62 | __u16 tp_mac; |
| 63 | __u16 tp_net; | 63 | __u16 tp_net; |
| 64 | __u16 tp_vlan_tci; | 64 | __u16 tp_vlan_tci; |
| 65 | __u16 tp_padding; | ||
| 65 | }; | 66 | }; |
| 66 | 67 | ||
| 67 | /* Rx ring - header status */ | 68 | /* Rx ring - header status */ |
| @@ -101,6 +102,7 @@ struct tpacket2_hdr { | |||
| 101 | __u32 tp_sec; | 102 | __u32 tp_sec; |
| 102 | __u32 tp_nsec; | 103 | __u32 tp_nsec; |
| 103 | __u16 tp_vlan_tci; | 104 | __u16 tp_vlan_tci; |
| 105 | __u16 tp_padding; | ||
| 104 | }; | 106 | }; |
| 105 | 107 | ||
| 106 | #define TPACKET2_HDRLEN (TPACKET_ALIGN(sizeof(struct tpacket2_hdr)) + sizeof(struct sockaddr_ll)) | 108 | #define TPACKET2_HDRLEN (TPACKET_ALIGN(sizeof(struct tpacket2_hdr)) + sizeof(struct sockaddr_ll)) |
diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h index dc01681fbb42..affa27380b72 100644 --- a/include/linux/if_vlan.h +++ b/include/linux/if_vlan.h | |||
| @@ -225,7 +225,7 @@ static inline int vlan_hwaccel_receive_skb(struct sk_buff *skb, | |||
| 225 | } | 225 | } |
| 226 | 226 | ||
| 227 | /** | 227 | /** |
| 228 | * __vlan_put_tag - regular VLAN tag inserting | 228 | * vlan_insert_tag - regular VLAN tag inserting |
| 229 | * @skb: skbuff to tag | 229 | * @skb: skbuff to tag |
| 230 | * @vlan_tci: VLAN TCI to insert | 230 | * @vlan_tci: VLAN TCI to insert |
| 231 | * | 231 | * |
| @@ -234,8 +234,10 @@ static inline int vlan_hwaccel_receive_skb(struct sk_buff *skb, | |||
| 234 | * | 234 | * |
| 235 | * Following the skb_unshare() example, in case of error, the calling function | 235 | * Following the skb_unshare() example, in case of error, the calling function |
| 236 | * doesn't have to worry about freeing the original skb. | 236 | * doesn't have to worry about freeing the original skb. |
| 237 | * | ||
| 238 | * Does not change skb->protocol so this function can be used during receive. | ||
| 237 | */ | 239 | */ |
| 238 | static inline struct sk_buff *__vlan_put_tag(struct sk_buff *skb, u16 vlan_tci) | 240 | static inline struct sk_buff *vlan_insert_tag(struct sk_buff *skb, u16 vlan_tci) |
| 239 | { | 241 | { |
| 240 | struct vlan_ethhdr *veth; | 242 | struct vlan_ethhdr *veth; |
| 241 | 243 | ||
| @@ -255,8 +257,25 @@ static inline struct sk_buff *__vlan_put_tag(struct sk_buff *skb, u16 vlan_tci) | |||
| 255 | /* now, the TCI */ | 257 | /* now, the TCI */ |
| 256 | veth->h_vlan_TCI = htons(vlan_tci); | 258 | veth->h_vlan_TCI = htons(vlan_tci); |
| 257 | 259 | ||
| 258 | skb->protocol = htons(ETH_P_8021Q); | 260 | return skb; |
| 261 | } | ||
| 259 | 262 | ||
| 263 | /** | ||
| 264 | * __vlan_put_tag - regular VLAN tag inserting | ||
| 265 | * @skb: skbuff to tag | ||
| 266 | * @vlan_tci: VLAN TCI to insert | ||
| 267 | * | ||
| 268 | * Inserts the VLAN tag into @skb as part of the payload | ||
| 269 | * Returns a VLAN tagged skb. If a new skb is created, @skb is freed. | ||
| 270 | * | ||
| 271 | * Following the skb_unshare() example, in case of error, the calling function | ||
| 272 | * doesn't have to worry about freeing the original skb. | ||
| 273 | */ | ||
| 274 | static inline struct sk_buff *__vlan_put_tag(struct sk_buff *skb, u16 vlan_tci) | ||
| 275 | { | ||
| 276 | skb = vlan_insert_tag(skb, vlan_tci); | ||
| 277 | if (skb) | ||
| 278 | skb->protocol = htons(ETH_P_8021Q); | ||
| 260 | return skb; | 279 | return skb; |
| 261 | } | 280 | } |
| 262 | 281 | ||
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index ca333e79e10f..54b8b4d7b68f 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
| @@ -2555,7 +2555,7 @@ extern void netdev_class_remove_file(struct class_attribute *class_attr); | |||
| 2555 | 2555 | ||
| 2556 | extern struct kobj_ns_type_operations net_ns_type_operations; | 2556 | extern struct kobj_ns_type_operations net_ns_type_operations; |
| 2557 | 2557 | ||
| 2558 | extern char *netdev_drivername(const struct net_device *dev, char *buffer, int len); | 2558 | extern const char *netdev_drivername(const struct net_device *dev); |
| 2559 | 2559 | ||
| 2560 | extern void linkwatch_run_queue(void); | 2560 | extern void linkwatch_run_queue(void); |
| 2561 | 2561 | ||
diff --git a/include/linux/netfilter/nf_conntrack_common.h b/include/linux/netfilter/nf_conntrack_common.h index 50cdc2559a5a..0d3dd66322ec 100644 --- a/include/linux/netfilter/nf_conntrack_common.h +++ b/include/linux/netfilter/nf_conntrack_common.h | |||
| @@ -18,6 +18,9 @@ enum ip_conntrack_info { | |||
| 18 | /* >= this indicates reply direction */ | 18 | /* >= this indicates reply direction */ |
| 19 | IP_CT_IS_REPLY, | 19 | IP_CT_IS_REPLY, |
| 20 | 20 | ||
| 21 | IP_CT_ESTABLISHED_REPLY = IP_CT_ESTABLISHED + IP_CT_IS_REPLY, | ||
| 22 | IP_CT_RELATED_REPLY = IP_CT_RELATED + IP_CT_IS_REPLY, | ||
| 23 | IP_CT_NEW_REPLY = IP_CT_NEW + IP_CT_IS_REPLY, | ||
| 21 | /* Number of distinct IP_CT types (no NEW in reply dirn). */ | 24 | /* Number of distinct IP_CT types (no NEW in reply dirn). */ |
| 22 | IP_CT_NUMBER = IP_CT_IS_REPLY * 2 - 1 | 25 | IP_CT_NUMBER = IP_CT_IS_REPLY * 2 - 1 |
| 23 | }; | 26 | }; |
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 3412684ce5d5..e0786e35f247 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h | |||
| @@ -137,14 +137,14 @@ enum perf_event_sample_format { | |||
| 137 | * | 137 | * |
| 138 | * struct read_format { | 138 | * struct read_format { |
| 139 | * { u64 value; | 139 | * { u64 value; |
| 140 | * { u64 time_enabled; } && PERF_FORMAT_ENABLED | 140 | * { u64 time_enabled; } && PERF_FORMAT_TOTAL_TIME_ENABLED |
| 141 | * { u64 time_running; } && PERF_FORMAT_RUNNING | 141 | * { u64 time_running; } && PERF_FORMAT_TOTAL_TIME_RUNNING |
| 142 | * { u64 id; } && PERF_FORMAT_ID | 142 | * { u64 id; } && PERF_FORMAT_ID |
| 143 | * } && !PERF_FORMAT_GROUP | 143 | * } && !PERF_FORMAT_GROUP |
| 144 | * | 144 | * |
| 145 | * { u64 nr; | 145 | * { u64 nr; |
| 146 | * { u64 time_enabled; } && PERF_FORMAT_ENABLED | 146 | * { u64 time_enabled; } && PERF_FORMAT_TOTAL_TIME_ENABLED |
| 147 | * { u64 time_running; } && PERF_FORMAT_RUNNING | 147 | * { u64 time_running; } && PERF_FORMAT_TOTAL_TIME_RUNNING |
| 148 | * { u64 value; | 148 | * { u64 value; |
| 149 | * { u64 id; } && PERF_FORMAT_ID | 149 | * { u64 id; } && PERF_FORMAT_ID |
| 150 | * } cntr[nr]; | 150 | * } cntr[nr]; |
diff --git a/include/linux/seqlock.h b/include/linux/seqlock.h index e9811892844f..c6db9fb33c44 100644 --- a/include/linux/seqlock.h +++ b/include/linux/seqlock.h | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | 28 | ||
| 29 | #include <linux/spinlock.h> | 29 | #include <linux/spinlock.h> |
| 30 | #include <linux/preempt.h> | 30 | #include <linux/preempt.h> |
| 31 | #include <asm/processor.h> | ||
| 31 | 32 | ||
| 32 | typedef struct { | 33 | typedef struct { |
| 33 | unsigned sequence; | 34 | unsigned sequence; |
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index e8b78ce14474..c0a4f3ab0cc0 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
| @@ -1256,6 +1256,11 @@ static inline void skb_reserve(struct sk_buff *skb, int len) | |||
| 1256 | skb->tail += len; | 1256 | skb->tail += len; |
| 1257 | } | 1257 | } |
| 1258 | 1258 | ||
| 1259 | static inline void skb_reset_mac_len(struct sk_buff *skb) | ||
| 1260 | { | ||
| 1261 | skb->mac_len = skb->network_header - skb->mac_header; | ||
| 1262 | } | ||
| 1263 | |||
| 1259 | #ifdef NET_SKBUFF_DATA_USES_OFFSET | 1264 | #ifdef NET_SKBUFF_DATA_USES_OFFSET |
| 1260 | static inline unsigned char *skb_transport_header(const struct sk_buff *skb) | 1265 | static inline unsigned char *skb_transport_header(const struct sk_buff *skb) |
| 1261 | { | 1266 | { |
diff --git a/include/linux/swiotlb.h b/include/linux/swiotlb.h index 8c0e349f4a6c..445702c60d04 100644 --- a/include/linux/swiotlb.h +++ b/include/linux/swiotlb.h | |||
| @@ -24,6 +24,7 @@ extern int swiotlb_force; | |||
| 24 | 24 | ||
| 25 | extern void swiotlb_init(int verbose); | 25 | extern void swiotlb_init(int verbose); |
| 26 | extern void swiotlb_init_with_tbl(char *tlb, unsigned long nslabs, int verbose); | 26 | extern void swiotlb_init_with_tbl(char *tlb, unsigned long nslabs, int verbose); |
| 27 | extern unsigned long swioltb_nr_tbl(void); | ||
| 27 | 28 | ||
| 28 | /* | 29 | /* |
| 29 | * Enumeration for sync targets | 30 | * Enumeration for sync targets |
diff --git a/include/linux/usb_usual.h b/include/linux/usb_usual.h index 71693d4a4fe1..17df3600bcef 100644 --- a/include/linux/usb_usual.h +++ b/include/linux/usb_usual.h | |||
| @@ -62,7 +62,9 @@ | |||
| 62 | US_FLAG(NO_READ_DISC_INFO, 0x00040000) \ | 62 | US_FLAG(NO_READ_DISC_INFO, 0x00040000) \ |
| 63 | /* cannot handle READ_DISC_INFO */ \ | 63 | /* cannot handle READ_DISC_INFO */ \ |
| 64 | US_FLAG(NO_READ_CAPACITY_16, 0x00080000) \ | 64 | US_FLAG(NO_READ_CAPACITY_16, 0x00080000) \ |
| 65 | /* cannot handle READ_CAPACITY_16 */ | 65 | /* cannot handle READ_CAPACITY_16 */ \ |
| 66 | US_FLAG(INITIAL_READ10, 0x00100000) \ | ||
| 67 | /* Initial READ(10) (and others) must be retried */ | ||
| 66 | 68 | ||
| 67 | #define US_FLAG(name, value) US_FL_##name = value , | 69 | #define US_FLAG(name, value) US_FL_##name = value , |
| 68 | enum { US_DO_ALL_FLAGS }; | 70 | enum { US_DO_ALL_FLAGS }; |
diff --git a/include/media/v4l2-dev.h b/include/media/v4l2-dev.h index 93e96fb93452..c7c40f1d2624 100644 --- a/include/media/v4l2-dev.h +++ b/include/media/v4l2-dev.h | |||
| @@ -128,8 +128,8 @@ struct video_device | |||
| 128 | struct mutex *lock; | 128 | struct mutex *lock; |
| 129 | }; | 129 | }; |
| 130 | 130 | ||
| 131 | #define media_entity_to_video_device(entity) \ | 131 | #define media_entity_to_video_device(__e) \ |
| 132 | container_of(entity, struct video_device, entity) | 132 | container_of(__e, struct video_device, entity) |
| 133 | /* dev to video-device */ | 133 | /* dev to video-device */ |
| 134 | #define to_video_device(cd) container_of(cd, struct video_device, dev) | 134 | #define to_video_device(cd) container_of(cd, struct video_device, dev) |
| 135 | 135 | ||
diff --git a/kernel/events/core.c b/kernel/events/core.c index d863b3c057bb..9efe7108ccaf 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
| @@ -7402,26 +7402,12 @@ static int __perf_cgroup_move(void *info) | |||
| 7402 | return 0; | 7402 | return 0; |
| 7403 | } | 7403 | } |
| 7404 | 7404 | ||
| 7405 | static void perf_cgroup_move(struct task_struct *task) | 7405 | static void |
| 7406 | perf_cgroup_attach_task(struct cgroup *cgrp, struct task_struct *task) | ||
| 7406 | { | 7407 | { |
| 7407 | task_function_call(task, __perf_cgroup_move, task); | 7408 | task_function_call(task, __perf_cgroup_move, task); |
| 7408 | } | 7409 | } |
| 7409 | 7410 | ||
| 7410 | static void perf_cgroup_attach(struct cgroup_subsys *ss, struct cgroup *cgrp, | ||
| 7411 | struct cgroup *old_cgrp, struct task_struct *task, | ||
| 7412 | bool threadgroup) | ||
| 7413 | { | ||
| 7414 | perf_cgroup_move(task); | ||
| 7415 | if (threadgroup) { | ||
| 7416 | struct task_struct *c; | ||
| 7417 | rcu_read_lock(); | ||
| 7418 | list_for_each_entry_rcu(c, &task->thread_group, thread_group) { | ||
| 7419 | perf_cgroup_move(c); | ||
| 7420 | } | ||
| 7421 | rcu_read_unlock(); | ||
| 7422 | } | ||
| 7423 | } | ||
| 7424 | |||
| 7425 | static void perf_cgroup_exit(struct cgroup_subsys *ss, struct cgroup *cgrp, | 7411 | static void perf_cgroup_exit(struct cgroup_subsys *ss, struct cgroup *cgrp, |
| 7426 | struct cgroup *old_cgrp, struct task_struct *task) | 7412 | struct cgroup *old_cgrp, struct task_struct *task) |
| 7427 | { | 7413 | { |
| @@ -7433,7 +7419,7 @@ static void perf_cgroup_exit(struct cgroup_subsys *ss, struct cgroup *cgrp, | |||
| 7433 | if (!(task->flags & PF_EXITING)) | 7419 | if (!(task->flags & PF_EXITING)) |
| 7434 | return; | 7420 | return; |
| 7435 | 7421 | ||
| 7436 | perf_cgroup_move(task); | 7422 | perf_cgroup_attach_task(cgrp, task); |
| 7437 | } | 7423 | } |
| 7438 | 7424 | ||
| 7439 | struct cgroup_subsys perf_subsys = { | 7425 | struct cgroup_subsys perf_subsys = { |
| @@ -7442,6 +7428,6 @@ struct cgroup_subsys perf_subsys = { | |||
| 7442 | .create = perf_cgroup_create, | 7428 | .create = perf_cgroup_create, |
| 7443 | .destroy = perf_cgroup_destroy, | 7429 | .destroy = perf_cgroup_destroy, |
| 7444 | .exit = perf_cgroup_exit, | 7430 | .exit = perf_cgroup_exit, |
| 7445 | .attach = perf_cgroup_attach, | 7431 | .attach_task = perf_cgroup_attach_task, |
| 7446 | }; | 7432 | }; |
| 7447 | #endif /* CONFIG_CGROUP_PERF */ | 7433 | #endif /* CONFIG_CGROUP_PERF */ |
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index d64bafb1afd0..0a7840aeb0fb 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c | |||
| @@ -491,6 +491,9 @@ int irq_set_irq_wake(unsigned int irq, unsigned int on) | |||
| 491 | struct irq_desc *desc = irq_get_desc_buslock(irq, &flags); | 491 | struct irq_desc *desc = irq_get_desc_buslock(irq, &flags); |
| 492 | int ret = 0; | 492 | int ret = 0; |
| 493 | 493 | ||
| 494 | if (!desc) | ||
| 495 | return -EINVAL; | ||
| 496 | |||
| 494 | /* wakeup-capable irqs can be shared between drivers that | 497 | /* wakeup-capable irqs can be shared between drivers that |
| 495 | * don't need to have the same sleep mode behaviors. | 498 | * don't need to have the same sleep mode behaviors. |
| 496 | */ | 499 | */ |
diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 4fc92445a29c..f175d98bd355 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c | |||
| @@ -938,6 +938,12 @@ static struct ctl_table kern_table[] = { | |||
| 938 | }, | 938 | }, |
| 939 | #endif | 939 | #endif |
| 940 | #ifdef CONFIG_PERF_EVENTS | 940 | #ifdef CONFIG_PERF_EVENTS |
| 941 | /* | ||
| 942 | * User-space scripts rely on the existence of this file | ||
| 943 | * as a feature check for perf_events being enabled. | ||
| 944 | * | ||
| 945 | * So it's an ABI, do not remove! | ||
| 946 | */ | ||
| 941 | { | 947 | { |
| 942 | .procname = "perf_event_paranoid", | 948 | .procname = "perf_event_paranoid", |
| 943 | .data = &sysctl_perf_event_paranoid, | 949 | .data = &sysctl_perf_event_paranoid, |
diff --git a/lib/swiotlb.c b/lib/swiotlb.c index 93ca08b8a451..99093b396145 100644 --- a/lib/swiotlb.c +++ b/lib/swiotlb.c | |||
| @@ -110,6 +110,11 @@ setup_io_tlb_npages(char *str) | |||
| 110 | __setup("swiotlb=", setup_io_tlb_npages); | 110 | __setup("swiotlb=", setup_io_tlb_npages); |
| 111 | /* make io_tlb_overflow tunable too? */ | 111 | /* make io_tlb_overflow tunable too? */ |
| 112 | 112 | ||
| 113 | unsigned long swioltb_nr_tbl(void) | ||
| 114 | { | ||
| 115 | return io_tlb_nslabs; | ||
| 116 | } | ||
| 117 | |||
| 113 | /* Note that this doesn't work with highmem page */ | 118 | /* Note that this doesn't work with highmem page */ |
| 114 | static dma_addr_t swiotlb_virt_to_bus(struct device *hwdev, | 119 | static dma_addr_t swiotlb_virt_to_bus(struct device *hwdev, |
| 115 | volatile void *address) | 120 | volatile void *address) |
diff --git a/lib/vsprintf.c b/lib/vsprintf.c index c11205688fb4..4365df31a1d5 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c | |||
| @@ -666,6 +666,8 @@ char *ip6_compressed_string(char *p, const char *addr) | |||
| 666 | colonpos = i; | 666 | colonpos = i; |
| 667 | } | 667 | } |
| 668 | } | 668 | } |
| 669 | if (longest == 1) /* don't compress a single 0 */ | ||
| 670 | colonpos = -1; | ||
| 669 | 671 | ||
| 670 | /* emit address */ | 672 | /* emit address */ |
| 671 | for (i = 0; i < range; i++) { | 673 | for (i = 0; i < range; i++) { |
| @@ -826,7 +828,7 @@ int kptr_restrict __read_mostly; | |||
| 826 | * IPv4 uses dot-separated decimal with leading 0's (010.123.045.006) | 828 | * IPv4 uses dot-separated decimal with leading 0's (010.123.045.006) |
| 827 | * - '[Ii]4[hnbl]' IPv4 addresses in host, network, big or little endian order | 829 | * - '[Ii]4[hnbl]' IPv4 addresses in host, network, big or little endian order |
| 828 | * - 'I6c' for IPv6 addresses printed as specified by | 830 | * - 'I6c' for IPv6 addresses printed as specified by |
| 829 | * http://tools.ietf.org/html/draft-ietf-6man-text-addr-representation-00 | 831 | * http://tools.ietf.org/html/rfc5952 |
| 830 | * - 'U' For a 16 byte UUID/GUID, it prints the UUID/GUID in the form | 832 | * - 'U' For a 16 byte UUID/GUID, it prints the UUID/GUID in the form |
| 831 | * "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" | 833 | * "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" |
| 832 | * Options for %pU are: | 834 | * Options for %pU are: |
diff --git a/net/8021q/vlan_core.c b/net/8021q/vlan_core.c index 41495dc2a4c9..fcc684678af6 100644 --- a/net/8021q/vlan_core.c +++ b/net/8021q/vlan_core.c | |||
| @@ -23,6 +23,31 @@ bool vlan_do_receive(struct sk_buff **skbp) | |||
| 23 | return false; | 23 | return false; |
| 24 | 24 | ||
| 25 | skb->dev = vlan_dev; | 25 | skb->dev = vlan_dev; |
| 26 | if (skb->pkt_type == PACKET_OTHERHOST) { | ||
| 27 | /* Our lower layer thinks this is not local, let's make sure. | ||
| 28 | * This allows the VLAN to have a different MAC than the | ||
| 29 | * underlying device, and still route correctly. */ | ||
| 30 | if (!compare_ether_addr(eth_hdr(skb)->h_dest, | ||
| 31 | vlan_dev->dev_addr)) | ||
| 32 | skb->pkt_type = PACKET_HOST; | ||
| 33 | } | ||
| 34 | |||
| 35 | if (!(vlan_dev_info(vlan_dev)->flags & VLAN_FLAG_REORDER_HDR)) { | ||
| 36 | unsigned int offset = skb->data - skb_mac_header(skb); | ||
| 37 | |||
| 38 | /* | ||
| 39 | * vlan_insert_tag expect skb->data pointing to mac header. | ||
| 40 | * So change skb->data before calling it and change back to | ||
| 41 | * original position later | ||
| 42 | */ | ||
| 43 | skb_push(skb, offset); | ||
| 44 | skb = *skbp = vlan_insert_tag(skb, skb->vlan_tci); | ||
| 45 | if (!skb) | ||
| 46 | return false; | ||
| 47 | skb_pull(skb, offset + VLAN_HLEN); | ||
| 48 | skb_reset_mac_len(skb); | ||
| 49 | } | ||
| 50 | |||
| 26 | skb->priority = vlan_get_ingress_priority(vlan_dev, skb->vlan_tci); | 51 | skb->priority = vlan_get_ingress_priority(vlan_dev, skb->vlan_tci); |
| 27 | skb->vlan_tci = 0; | 52 | skb->vlan_tci = 0; |
| 28 | 53 | ||
| @@ -31,22 +56,8 @@ bool vlan_do_receive(struct sk_buff **skbp) | |||
| 31 | u64_stats_update_begin(&rx_stats->syncp); | 56 | u64_stats_update_begin(&rx_stats->syncp); |
| 32 | rx_stats->rx_packets++; | 57 | rx_stats->rx_packets++; |
| 33 | rx_stats->rx_bytes += skb->len; | 58 | rx_stats->rx_bytes += skb->len; |
| 34 | 59 | if (skb->pkt_type == PACKET_MULTICAST) | |
| 35 | switch (skb->pkt_type) { | ||
| 36 | case PACKET_BROADCAST: | ||
| 37 | break; | ||
| 38 | case PACKET_MULTICAST: | ||
| 39 | rx_stats->rx_multicast++; | 60 | rx_stats->rx_multicast++; |
| 40 | break; | ||
| 41 | case PACKET_OTHERHOST: | ||
| 42 | /* Our lower layer thinks this is not local, let's make sure. | ||
| 43 | * This allows the VLAN to have a different MAC than the | ||
| 44 | * underlying device, and still route correctly. */ | ||
| 45 | if (!compare_ether_addr(eth_hdr(skb)->h_dest, | ||
| 46 | vlan_dev->dev_addr)) | ||
| 47 | skb->pkt_type = PACKET_HOST; | ||
| 48 | break; | ||
| 49 | } | ||
| 50 | u64_stats_update_end(&rx_stats->syncp); | 61 | u64_stats_update_end(&rx_stats->syncp); |
| 51 | 62 | ||
| 52 | return true; | 63 | return true; |
| @@ -89,18 +100,13 @@ gro_result_t vlan_gro_frags(struct napi_struct *napi, struct vlan_group *grp, | |||
| 89 | } | 100 | } |
| 90 | EXPORT_SYMBOL(vlan_gro_frags); | 101 | EXPORT_SYMBOL(vlan_gro_frags); |
| 91 | 102 | ||
| 92 | static struct sk_buff *vlan_check_reorder_header(struct sk_buff *skb) | 103 | static struct sk_buff *vlan_reorder_header(struct sk_buff *skb) |
| 93 | { | 104 | { |
| 94 | if (vlan_dev_info(skb->dev)->flags & VLAN_FLAG_REORDER_HDR) { | 105 | if (skb_cow(skb, skb_headroom(skb)) < 0) |
| 95 | if (skb_cow(skb, skb_headroom(skb)) < 0) | 106 | return NULL; |
| 96 | skb = NULL; | 107 | memmove(skb->data - ETH_HLEN, skb->data - VLAN_ETH_HLEN, 2 * ETH_ALEN); |
| 97 | if (skb) { | 108 | skb->mac_header += VLAN_HLEN; |
| 98 | /* Lifted from Gleb's VLAN code... */ | 109 | skb_reset_mac_len(skb); |
| 99 | memmove(skb->data - ETH_HLEN, | ||
| 100 | skb->data - VLAN_ETH_HLEN, 12); | ||
| 101 | skb->mac_header += VLAN_HLEN; | ||
| 102 | } | ||
| 103 | } | ||
| 104 | return skb; | 110 | return skb; |
| 105 | } | 111 | } |
| 106 | 112 | ||
| @@ -161,7 +167,7 @@ struct sk_buff *vlan_untag(struct sk_buff *skb) | |||
| 161 | skb_pull_rcsum(skb, VLAN_HLEN); | 167 | skb_pull_rcsum(skb, VLAN_HLEN); |
| 162 | vlan_set_encap_proto(skb, vhdr); | 168 | vlan_set_encap_proto(skb, vhdr); |
| 163 | 169 | ||
| 164 | skb = vlan_check_reorder_header(skb); | 170 | skb = vlan_reorder_header(skb); |
| 165 | if (unlikely(!skb)) | 171 | if (unlikely(!skb)) |
| 166 | goto err_free; | 172 | goto err_free; |
| 167 | 173 | ||
diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c index 3fa123185e89..56149ec36d7f 100644 --- a/net/bridge/br_netfilter.c +++ b/net/bridge/br_netfilter.c | |||
| @@ -104,10 +104,16 @@ static void fake_update_pmtu(struct dst_entry *dst, u32 mtu) | |||
| 104 | { | 104 | { |
| 105 | } | 105 | } |
| 106 | 106 | ||
| 107 | static u32 *fake_cow_metrics(struct dst_entry *dst, unsigned long old) | ||
| 108 | { | ||
| 109 | return NULL; | ||
| 110 | } | ||
| 111 | |||
| 107 | static struct dst_ops fake_dst_ops = { | 112 | static struct dst_ops fake_dst_ops = { |
| 108 | .family = AF_INET, | 113 | .family = AF_INET, |
| 109 | .protocol = cpu_to_be16(ETH_P_IP), | 114 | .protocol = cpu_to_be16(ETH_P_IP), |
| 110 | .update_pmtu = fake_update_pmtu, | 115 | .update_pmtu = fake_update_pmtu, |
| 116 | .cow_metrics = fake_cow_metrics, | ||
| 111 | }; | 117 | }; |
| 112 | 118 | ||
| 113 | /* | 119 | /* |
diff --git a/net/core/dev.c b/net/core/dev.c index 939307891e71..9c58c1ec41a9 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -3114,7 +3114,7 @@ static int __netif_receive_skb(struct sk_buff *skb) | |||
| 3114 | 3114 | ||
| 3115 | skb_reset_network_header(skb); | 3115 | skb_reset_network_header(skb); |
| 3116 | skb_reset_transport_header(skb); | 3116 | skb_reset_transport_header(skb); |
| 3117 | skb->mac_len = skb->network_header - skb->mac_header; | 3117 | skb_reset_mac_len(skb); |
| 3118 | 3118 | ||
| 3119 | pt_prev = NULL; | 3119 | pt_prev = NULL; |
| 3120 | 3120 | ||
| @@ -6178,6 +6178,11 @@ static int dev_cpu_callback(struct notifier_block *nfb, | |||
| 6178 | oldsd->output_queue = NULL; | 6178 | oldsd->output_queue = NULL; |
| 6179 | oldsd->output_queue_tailp = &oldsd->output_queue; | 6179 | oldsd->output_queue_tailp = &oldsd->output_queue; |
| 6180 | } | 6180 | } |
| 6181 | /* Append NAPI poll list from offline CPU. */ | ||
| 6182 | if (!list_empty(&oldsd->poll_list)) { | ||
| 6183 | list_splice_init(&oldsd->poll_list, &sd->poll_list); | ||
| 6184 | raise_softirq_irqoff(NET_RX_SOFTIRQ); | ||
| 6185 | } | ||
| 6181 | 6186 | ||
| 6182 | raise_softirq_irqoff(NET_TX_SOFTIRQ); | 6187 | raise_softirq_irqoff(NET_TX_SOFTIRQ); |
| 6183 | local_irq_enable(); | 6188 | local_irq_enable(); |
| @@ -6264,29 +6269,23 @@ err_name: | |||
| 6264 | /** | 6269 | /** |
| 6265 | * netdev_drivername - network driver for the device | 6270 | * netdev_drivername - network driver for the device |
| 6266 | * @dev: network device | 6271 | * @dev: network device |
| 6267 | * @buffer: buffer for resulting name | ||
| 6268 | * @len: size of buffer | ||
| 6269 | * | 6272 | * |
| 6270 | * Determine network driver for device. | 6273 | * Determine network driver for device. |
| 6271 | */ | 6274 | */ |
| 6272 | char *netdev_drivername(const struct net_device *dev, char *buffer, int len) | 6275 | const char *netdev_drivername(const struct net_device *dev) |
| 6273 | { | 6276 | { |
| 6274 | const struct device_driver *driver; | 6277 | const struct device_driver *driver; |
| 6275 | const struct device *parent; | 6278 | const struct device *parent; |
| 6276 | 6279 | const char *empty = ""; | |
| 6277 | if (len <= 0 || !buffer) | ||
| 6278 | return buffer; | ||
| 6279 | buffer[0] = 0; | ||
| 6280 | 6280 | ||
| 6281 | parent = dev->dev.parent; | 6281 | parent = dev->dev.parent; |
| 6282 | |||
| 6283 | if (!parent) | 6282 | if (!parent) |
| 6284 | return buffer; | 6283 | return empty; |
| 6285 | 6284 | ||
| 6286 | driver = parent->driver; | 6285 | driver = parent->driver; |
| 6287 | if (driver && driver->name) | 6286 | if (driver && driver->name) |
| 6288 | strlcpy(buffer, driver->name, len); | 6287 | return driver->name; |
| 6289 | return buffer; | 6288 | return empty; |
| 6290 | } | 6289 | } |
| 6291 | 6290 | ||
| 6292 | static int __netdev_printk(const char *level, const struct net_device *dev, | 6291 | static int __netdev_printk(const char *level, const struct net_device *dev, |
diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c index 6c6b86d0da15..e41e5110c65c 100644 --- a/net/core/net_namespace.c +++ b/net/core/net_namespace.c | |||
| @@ -310,19 +310,17 @@ struct net *get_net_ns_by_fd(int fd) | |||
| 310 | struct file *file; | 310 | struct file *file; |
| 311 | struct net *net; | 311 | struct net *net; |
| 312 | 312 | ||
| 313 | net = ERR_PTR(-EINVAL); | ||
| 314 | file = proc_ns_fget(fd); | 313 | file = proc_ns_fget(fd); |
| 315 | if (!file) | 314 | if (IS_ERR(file)) |
| 316 | goto out; | 315 | return ERR_CAST(file); |
| 317 | 316 | ||
| 318 | ei = PROC_I(file->f_dentry->d_inode); | 317 | ei = PROC_I(file->f_dentry->d_inode); |
| 319 | if (ei->ns_ops != &netns_operations) | 318 | if (ei->ns_ops == &netns_operations) |
| 320 | goto out; | 319 | net = get_net(ei->ns); |
| 320 | else | ||
| 321 | net = ERR_PTR(-EINVAL); | ||
| 321 | 322 | ||
| 322 | net = get_net(ei->ns); | 323 | fput(file); |
| 323 | out: | ||
| 324 | if (file) | ||
| 325 | fput(file); | ||
| 326 | return net; | 324 | return net; |
| 327 | } | 325 | } |
| 328 | 326 | ||
diff --git a/net/core/netpoll.c b/net/core/netpoll.c index 2d7d6d473781..18d9cbda3a39 100644 --- a/net/core/netpoll.c +++ b/net/core/netpoll.c | |||
| @@ -792,6 +792,13 @@ int netpoll_setup(struct netpoll *np) | |||
| 792 | return -ENODEV; | 792 | return -ENODEV; |
| 793 | } | 793 | } |
| 794 | 794 | ||
| 795 | if (ndev->master) { | ||
| 796 | printk(KERN_ERR "%s: %s is a slave device, aborting.\n", | ||
| 797 | np->name, np->dev_name); | ||
| 798 | err = -EBUSY; | ||
| 799 | goto put; | ||
| 800 | } | ||
| 801 | |||
| 795 | if (!netif_running(ndev)) { | 802 | if (!netif_running(ndev)) { |
| 796 | unsigned long atmost, atleast; | 803 | unsigned long atmost, atleast; |
| 797 | 804 | ||
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index 98af3697c718..a8024eaa0e87 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
| @@ -799,7 +799,9 @@ static int __ip_append_data(struct sock *sk, | |||
| 799 | int csummode = CHECKSUM_NONE; | 799 | int csummode = CHECKSUM_NONE; |
| 800 | struct rtable *rt = (struct rtable *)cork->dst; | 800 | struct rtable *rt = (struct rtable *)cork->dst; |
| 801 | 801 | ||
| 802 | exthdrlen = transhdrlen ? rt->dst.header_len : 0; | 802 | skb = skb_peek_tail(queue); |
| 803 | |||
| 804 | exthdrlen = !skb ? rt->dst.header_len : 0; | ||
| 803 | length += exthdrlen; | 805 | length += exthdrlen; |
| 804 | transhdrlen += exthdrlen; | 806 | transhdrlen += exthdrlen; |
| 805 | mtu = cork->fragsize; | 807 | mtu = cork->fragsize; |
| @@ -825,8 +827,6 @@ static int __ip_append_data(struct sock *sk, | |||
| 825 | !exthdrlen) | 827 | !exthdrlen) |
| 826 | csummode = CHECKSUM_PARTIAL; | 828 | csummode = CHECKSUM_PARTIAL; |
| 827 | 829 | ||
| 828 | skb = skb_peek_tail(queue); | ||
| 829 | |||
| 830 | cork->length += length; | 830 | cork->length += length; |
| 831 | if (((length > mtu) || (skb && skb_is_gso(skb))) && | 831 | if (((length > mtu) || (skb && skb_is_gso(skb))) && |
| 832 | (sk->sk_protocol == IPPROTO_UDP) && | 832 | (sk->sk_protocol == IPPROTO_UDP) && |
diff --git a/net/ipv4/netfilter/ip_queue.c b/net/ipv4/netfilter/ip_queue.c index d2c1311cb28d..f7f9bd7ba12d 100644 --- a/net/ipv4/netfilter/ip_queue.c +++ b/net/ipv4/netfilter/ip_queue.c | |||
| @@ -402,7 +402,8 @@ ipq_dev_drop(int ifindex) | |||
| 402 | static inline void | 402 | static inline void |
| 403 | __ipq_rcv_skb(struct sk_buff *skb) | 403 | __ipq_rcv_skb(struct sk_buff *skb) |
| 404 | { | 404 | { |
| 405 | int status, type, pid, flags, nlmsglen, skblen; | 405 | int status, type, pid, flags; |
| 406 | unsigned int nlmsglen, skblen; | ||
| 406 | struct nlmsghdr *nlh; | 407 | struct nlmsghdr *nlh; |
| 407 | 408 | ||
| 408 | skblen = skb->len; | 409 | skblen = skb->len; |
diff --git a/net/ipv4/netfilter/ipt_CLUSTERIP.c b/net/ipv4/netfilter/ipt_CLUSTERIP.c index d609ac3cb9a4..5c9e97c79017 100644 --- a/net/ipv4/netfilter/ipt_CLUSTERIP.c +++ b/net/ipv4/netfilter/ipt_CLUSTERIP.c | |||
| @@ -307,7 +307,7 @@ clusterip_tg(struct sk_buff *skb, const struct xt_action_param *par) | |||
| 307 | * error messages (RELATED) and information requests (see below) */ | 307 | * error messages (RELATED) and information requests (see below) */ |
| 308 | if (ip_hdr(skb)->protocol == IPPROTO_ICMP && | 308 | if (ip_hdr(skb)->protocol == IPPROTO_ICMP && |
| 309 | (ctinfo == IP_CT_RELATED || | 309 | (ctinfo == IP_CT_RELATED || |
| 310 | ctinfo == IP_CT_RELATED + IP_CT_IS_REPLY)) | 310 | ctinfo == IP_CT_RELATED_REPLY)) |
| 311 | return XT_CONTINUE; | 311 | return XT_CONTINUE; |
| 312 | 312 | ||
| 313 | /* ip_conntrack_icmp guarantees us that we only have ICMP_ECHO, | 313 | /* ip_conntrack_icmp guarantees us that we only have ICMP_ECHO, |
| @@ -321,12 +321,12 @@ clusterip_tg(struct sk_buff *skb, const struct xt_action_param *par) | |||
| 321 | ct->mark = hash; | 321 | ct->mark = hash; |
| 322 | break; | 322 | break; |
| 323 | case IP_CT_RELATED: | 323 | case IP_CT_RELATED: |
| 324 | case IP_CT_RELATED+IP_CT_IS_REPLY: | 324 | case IP_CT_RELATED_REPLY: |
| 325 | /* FIXME: we don't handle expectations at the | 325 | /* FIXME: we don't handle expectations at the |
| 326 | * moment. they can arrive on a different node than | 326 | * moment. they can arrive on a different node than |
| 327 | * the master connection (e.g. FTP passive mode) */ | 327 | * the master connection (e.g. FTP passive mode) */ |
| 328 | case IP_CT_ESTABLISHED: | 328 | case IP_CT_ESTABLISHED: |
| 329 | case IP_CT_ESTABLISHED+IP_CT_IS_REPLY: | 329 | case IP_CT_ESTABLISHED_REPLY: |
| 330 | break; | 330 | break; |
| 331 | default: | 331 | default: |
| 332 | break; | 332 | break; |
diff --git a/net/ipv4/netfilter/ipt_MASQUERADE.c b/net/ipv4/netfilter/ipt_MASQUERADE.c index d2ed9dc74ebc..9931152a78b5 100644 --- a/net/ipv4/netfilter/ipt_MASQUERADE.c +++ b/net/ipv4/netfilter/ipt_MASQUERADE.c | |||
| @@ -60,7 +60,7 @@ masquerade_tg(struct sk_buff *skb, const struct xt_action_param *par) | |||
| 60 | nat = nfct_nat(ct); | 60 | nat = nfct_nat(ct); |
| 61 | 61 | ||
| 62 | NF_CT_ASSERT(ct && (ctinfo == IP_CT_NEW || ctinfo == IP_CT_RELATED || | 62 | NF_CT_ASSERT(ct && (ctinfo == IP_CT_NEW || ctinfo == IP_CT_RELATED || |
| 63 | ctinfo == IP_CT_RELATED + IP_CT_IS_REPLY)); | 63 | ctinfo == IP_CT_RELATED_REPLY)); |
| 64 | 64 | ||
| 65 | /* Source address is 0.0.0.0 - locally generated packet that is | 65 | /* Source address is 0.0.0.0 - locally generated packet that is |
| 66 | * probably not supposed to be masqueraded. | 66 | * probably not supposed to be masqueraded. |
diff --git a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c index 5a03c02af999..db10075dd88e 100644 --- a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c +++ b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c | |||
| @@ -101,7 +101,7 @@ static unsigned int ipv4_confirm(unsigned int hooknum, | |||
| 101 | 101 | ||
| 102 | /* This is where we call the helper: as the packet goes out. */ | 102 | /* This is where we call the helper: as the packet goes out. */ |
| 103 | ct = nf_ct_get(skb, &ctinfo); | 103 | ct = nf_ct_get(skb, &ctinfo); |
| 104 | if (!ct || ctinfo == IP_CT_RELATED + IP_CT_IS_REPLY) | 104 | if (!ct || ctinfo == IP_CT_RELATED_REPLY) |
| 105 | goto out; | 105 | goto out; |
| 106 | 106 | ||
| 107 | help = nfct_help(ct); | 107 | help = nfct_help(ct); |
diff --git a/net/ipv4/netfilter/nf_conntrack_proto_icmp.c b/net/ipv4/netfilter/nf_conntrack_proto_icmp.c index 7404bde95994..ab5b27a2916f 100644 --- a/net/ipv4/netfilter/nf_conntrack_proto_icmp.c +++ b/net/ipv4/netfilter/nf_conntrack_proto_icmp.c | |||
| @@ -160,7 +160,7 @@ icmp_error_message(struct net *net, struct nf_conn *tmpl, struct sk_buff *skb, | |||
| 160 | /* Update skb to refer to this connection */ | 160 | /* Update skb to refer to this connection */ |
| 161 | skb->nfct = &nf_ct_tuplehash_to_ctrack(h)->ct_general; | 161 | skb->nfct = &nf_ct_tuplehash_to_ctrack(h)->ct_general; |
| 162 | skb->nfctinfo = *ctinfo; | 162 | skb->nfctinfo = *ctinfo; |
| 163 | return -NF_ACCEPT; | 163 | return NF_ACCEPT; |
| 164 | } | 164 | } |
| 165 | 165 | ||
| 166 | /* Small and modified version of icmp_rcv */ | 166 | /* Small and modified version of icmp_rcv */ |
diff --git a/net/ipv4/netfilter/nf_nat_core.c b/net/ipv4/netfilter/nf_nat_core.c index 9c71b2755ce3..3346de5d94d0 100644 --- a/net/ipv4/netfilter/nf_nat_core.c +++ b/net/ipv4/netfilter/nf_nat_core.c | |||
| @@ -433,7 +433,7 @@ int nf_nat_icmp_reply_translation(struct nf_conn *ct, | |||
| 433 | 433 | ||
| 434 | /* Must be RELATED */ | 434 | /* Must be RELATED */ |
| 435 | NF_CT_ASSERT(skb->nfctinfo == IP_CT_RELATED || | 435 | NF_CT_ASSERT(skb->nfctinfo == IP_CT_RELATED || |
| 436 | skb->nfctinfo == IP_CT_RELATED+IP_CT_IS_REPLY); | 436 | skb->nfctinfo == IP_CT_RELATED_REPLY); |
| 437 | 437 | ||
| 438 | /* Redirects on non-null nats must be dropped, else they'll | 438 | /* Redirects on non-null nats must be dropped, else they'll |
| 439 | start talking to each other without our translation, and be | 439 | start talking to each other without our translation, and be |
diff --git a/net/ipv4/netfilter/nf_nat_helper.c b/net/ipv4/netfilter/nf_nat_helper.c index 99cfa28b6d38..ebc5f8894f99 100644 --- a/net/ipv4/netfilter/nf_nat_helper.c +++ b/net/ipv4/netfilter/nf_nat_helper.c | |||
| @@ -160,7 +160,7 @@ static void nf_nat_csum(struct sk_buff *skb, const struct iphdr *iph, void *data | |||
| 160 | 160 | ||
| 161 | if (skb->ip_summed != CHECKSUM_PARTIAL) { | 161 | if (skb->ip_summed != CHECKSUM_PARTIAL) { |
| 162 | if (!(rt->rt_flags & RTCF_LOCAL) && | 162 | if (!(rt->rt_flags & RTCF_LOCAL) && |
| 163 | skb->dev->features & NETIF_F_V4_CSUM) { | 163 | (!skb->dev || skb->dev->features & NETIF_F_V4_CSUM)) { |
| 164 | skb->ip_summed = CHECKSUM_PARTIAL; | 164 | skb->ip_summed = CHECKSUM_PARTIAL; |
| 165 | skb->csum_start = skb_headroom(skb) + | 165 | skb->csum_start = skb_headroom(skb) + |
| 166 | skb_network_offset(skb) + | 166 | skb_network_offset(skb) + |
diff --git a/net/ipv4/netfilter/nf_nat_rule.c b/net/ipv4/netfilter/nf_nat_rule.c index 21c30426480b..733c9abc1cbd 100644 --- a/net/ipv4/netfilter/nf_nat_rule.c +++ b/net/ipv4/netfilter/nf_nat_rule.c | |||
| @@ -53,7 +53,7 @@ ipt_snat_target(struct sk_buff *skb, const struct xt_action_param *par) | |||
| 53 | 53 | ||
| 54 | /* Connection must be valid and new. */ | 54 | /* Connection must be valid and new. */ |
| 55 | NF_CT_ASSERT(ct && (ctinfo == IP_CT_NEW || ctinfo == IP_CT_RELATED || | 55 | NF_CT_ASSERT(ct && (ctinfo == IP_CT_NEW || ctinfo == IP_CT_RELATED || |
| 56 | ctinfo == IP_CT_RELATED + IP_CT_IS_REPLY)); | 56 | ctinfo == IP_CT_RELATED_REPLY)); |
| 57 | NF_CT_ASSERT(par->out != NULL); | 57 | NF_CT_ASSERT(par->out != NULL); |
| 58 | 58 | ||
| 59 | return nf_nat_setup_info(ct, &mr->range[0], IP_NAT_MANIP_SRC); | 59 | return nf_nat_setup_info(ct, &mr->range[0], IP_NAT_MANIP_SRC); |
diff --git a/net/ipv4/netfilter/nf_nat_standalone.c b/net/ipv4/netfilter/nf_nat_standalone.c index 7317bdf1d457..483b76d042da 100644 --- a/net/ipv4/netfilter/nf_nat_standalone.c +++ b/net/ipv4/netfilter/nf_nat_standalone.c | |||
| @@ -116,7 +116,7 @@ nf_nat_fn(unsigned int hooknum, | |||
| 116 | 116 | ||
| 117 | switch (ctinfo) { | 117 | switch (ctinfo) { |
| 118 | case IP_CT_RELATED: | 118 | case IP_CT_RELATED: |
| 119 | case IP_CT_RELATED+IP_CT_IS_REPLY: | 119 | case IP_CT_RELATED_REPLY: |
| 120 | if (ip_hdr(skb)->protocol == IPPROTO_ICMP) { | 120 | if (ip_hdr(skb)->protocol == IPPROTO_ICMP) { |
| 121 | if (!nf_nat_icmp_reply_translation(ct, ctinfo, | 121 | if (!nf_nat_icmp_reply_translation(ct, ctinfo, |
| 122 | hooknum, skb)) | 122 | hooknum, skb)) |
| @@ -144,7 +144,7 @@ nf_nat_fn(unsigned int hooknum, | |||
| 144 | default: | 144 | default: |
| 145 | /* ESTABLISHED */ | 145 | /* ESTABLISHED */ |
| 146 | NF_CT_ASSERT(ctinfo == IP_CT_ESTABLISHED || | 146 | NF_CT_ASSERT(ctinfo == IP_CT_ESTABLISHED || |
| 147 | ctinfo == (IP_CT_ESTABLISHED+IP_CT_IS_REPLY)); | 147 | ctinfo == IP_CT_ESTABLISHED_REPLY); |
| 148 | } | 148 | } |
| 149 | 149 | ||
| 150 | return nf_nat_packet(ct, ctinfo, hooknum, skb); | 150 | return nf_nat_packet(ct, ctinfo, hooknum, skb); |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 52b0b956508b..045f0ec6a4a0 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
| @@ -1316,6 +1316,23 @@ reject_redirect: | |||
| 1316 | ; | 1316 | ; |
| 1317 | } | 1317 | } |
| 1318 | 1318 | ||
| 1319 | static bool peer_pmtu_expired(struct inet_peer *peer) | ||
| 1320 | { | ||
| 1321 | unsigned long orig = ACCESS_ONCE(peer->pmtu_expires); | ||
| 1322 | |||
| 1323 | return orig && | ||
| 1324 | time_after_eq(jiffies, orig) && | ||
| 1325 | cmpxchg(&peer->pmtu_expires, orig, 0) == orig; | ||
| 1326 | } | ||
| 1327 | |||
| 1328 | static bool peer_pmtu_cleaned(struct inet_peer *peer) | ||
| 1329 | { | ||
| 1330 | unsigned long orig = ACCESS_ONCE(peer->pmtu_expires); | ||
| 1331 | |||
| 1332 | return orig && | ||
| 1333 | cmpxchg(&peer->pmtu_expires, orig, 0) == orig; | ||
| 1334 | } | ||
| 1335 | |||
| 1319 | static struct dst_entry *ipv4_negative_advice(struct dst_entry *dst) | 1336 | static struct dst_entry *ipv4_negative_advice(struct dst_entry *dst) |
| 1320 | { | 1337 | { |
| 1321 | struct rtable *rt = (struct rtable *)dst; | 1338 | struct rtable *rt = (struct rtable *)dst; |
| @@ -1331,14 +1348,8 @@ static struct dst_entry *ipv4_negative_advice(struct dst_entry *dst) | |||
| 1331 | rt_genid(dev_net(dst->dev))); | 1348 | rt_genid(dev_net(dst->dev))); |
| 1332 | rt_del(hash, rt); | 1349 | rt_del(hash, rt); |
| 1333 | ret = NULL; | 1350 | ret = NULL; |
| 1334 | } else if (rt->peer && | 1351 | } else if (rt->peer && peer_pmtu_expired(rt->peer)) { |
| 1335 | rt->peer->pmtu_expires && | 1352 | dst_metric_set(dst, RTAX_MTU, rt->peer->pmtu_orig); |
| 1336 | time_after_eq(jiffies, rt->peer->pmtu_expires)) { | ||
| 1337 | unsigned long orig = rt->peer->pmtu_expires; | ||
| 1338 | |||
| 1339 | if (cmpxchg(&rt->peer->pmtu_expires, orig, 0) == orig) | ||
| 1340 | dst_metric_set(dst, RTAX_MTU, | ||
| 1341 | rt->peer->pmtu_orig); | ||
| 1342 | } | 1353 | } |
| 1343 | } | 1354 | } |
| 1344 | return ret; | 1355 | return ret; |
| @@ -1531,8 +1542,10 @@ unsigned short ip_rt_frag_needed(struct net *net, const struct iphdr *iph, | |||
| 1531 | 1542 | ||
| 1532 | static void check_peer_pmtu(struct dst_entry *dst, struct inet_peer *peer) | 1543 | static void check_peer_pmtu(struct dst_entry *dst, struct inet_peer *peer) |
| 1533 | { | 1544 | { |
| 1534 | unsigned long expires = peer->pmtu_expires; | 1545 | unsigned long expires = ACCESS_ONCE(peer->pmtu_expires); |
| 1535 | 1546 | ||
| 1547 | if (!expires) | ||
| 1548 | return; | ||
| 1536 | if (time_before(jiffies, expires)) { | 1549 | if (time_before(jiffies, expires)) { |
| 1537 | u32 orig_dst_mtu = dst_mtu(dst); | 1550 | u32 orig_dst_mtu = dst_mtu(dst); |
| 1538 | if (peer->pmtu_learned < orig_dst_mtu) { | 1551 | if (peer->pmtu_learned < orig_dst_mtu) { |
| @@ -1555,10 +1568,11 @@ static void ip_rt_update_pmtu(struct dst_entry *dst, u32 mtu) | |||
| 1555 | rt_bind_peer(rt, rt->rt_dst, 1); | 1568 | rt_bind_peer(rt, rt->rt_dst, 1); |
| 1556 | peer = rt->peer; | 1569 | peer = rt->peer; |
| 1557 | if (peer) { | 1570 | if (peer) { |
| 1571 | unsigned long pmtu_expires = ACCESS_ONCE(peer->pmtu_expires); | ||
| 1572 | |||
| 1558 | if (mtu < ip_rt_min_pmtu) | 1573 | if (mtu < ip_rt_min_pmtu) |
| 1559 | mtu = ip_rt_min_pmtu; | 1574 | mtu = ip_rt_min_pmtu; |
| 1560 | if (!peer->pmtu_expires || mtu < peer->pmtu_learned) { | 1575 | if (!pmtu_expires || mtu < peer->pmtu_learned) { |
| 1561 | unsigned long pmtu_expires; | ||
| 1562 | 1576 | ||
| 1563 | pmtu_expires = jiffies + ip_rt_mtu_expires; | 1577 | pmtu_expires = jiffies + ip_rt_mtu_expires; |
| 1564 | if (!pmtu_expires) | 1578 | if (!pmtu_expires) |
| @@ -1612,13 +1626,14 @@ static struct dst_entry *ipv4_dst_check(struct dst_entry *dst, u32 cookie) | |||
| 1612 | rt_bind_peer(rt, rt->rt_dst, 0); | 1626 | rt_bind_peer(rt, rt->rt_dst, 0); |
| 1613 | 1627 | ||
| 1614 | peer = rt->peer; | 1628 | peer = rt->peer; |
| 1615 | if (peer && peer->pmtu_expires) | 1629 | if (peer) { |
| 1616 | check_peer_pmtu(dst, peer); | 1630 | check_peer_pmtu(dst, peer); |
| 1617 | 1631 | ||
| 1618 | if (peer && peer->redirect_learned.a4 && | 1632 | if (peer->redirect_learned.a4 && |
| 1619 | peer->redirect_learned.a4 != rt->rt_gateway) { | 1633 | peer->redirect_learned.a4 != rt->rt_gateway) { |
| 1620 | if (check_peer_redir(dst, peer)) | 1634 | if (check_peer_redir(dst, peer)) |
| 1621 | return NULL; | 1635 | return NULL; |
| 1636 | } | ||
| 1622 | } | 1637 | } |
| 1623 | 1638 | ||
| 1624 | rt->rt_peer_genid = rt_peer_genid(); | 1639 | rt->rt_peer_genid = rt_peer_genid(); |
| @@ -1649,14 +1664,8 @@ static void ipv4_link_failure(struct sk_buff *skb) | |||
| 1649 | icmp_send(skb, ICMP_DEST_UNREACH, ICMP_HOST_UNREACH, 0); | 1664 | icmp_send(skb, ICMP_DEST_UNREACH, ICMP_HOST_UNREACH, 0); |
| 1650 | 1665 | ||
| 1651 | rt = skb_rtable(skb); | 1666 | rt = skb_rtable(skb); |
| 1652 | if (rt && | 1667 | if (rt && rt->peer && peer_pmtu_cleaned(rt->peer)) |
| 1653 | rt->peer && | 1668 | dst_metric_set(&rt->dst, RTAX_MTU, rt->peer->pmtu_orig); |
| 1654 | rt->peer->pmtu_expires) { | ||
| 1655 | unsigned long orig = rt->peer->pmtu_expires; | ||
| 1656 | |||
| 1657 | if (cmpxchg(&rt->peer->pmtu_expires, orig, 0) == orig) | ||
| 1658 | dst_metric_set(&rt->dst, RTAX_MTU, rt->peer->pmtu_orig); | ||
| 1659 | } | ||
| 1660 | } | 1669 | } |
| 1661 | 1670 | ||
| 1662 | static int ip_rt_bug(struct sk_buff *skb) | 1671 | static int ip_rt_bug(struct sk_buff *skb) |
| @@ -1770,8 +1779,7 @@ static void rt_init_metrics(struct rtable *rt, const struct flowi4 *fl4, | |||
| 1770 | sizeof(u32) * RTAX_MAX); | 1779 | sizeof(u32) * RTAX_MAX); |
| 1771 | dst_init_metrics(&rt->dst, peer->metrics, false); | 1780 | dst_init_metrics(&rt->dst, peer->metrics, false); |
| 1772 | 1781 | ||
| 1773 | if (peer->pmtu_expires) | 1782 | check_peer_pmtu(&rt->dst, peer); |
| 1774 | check_peer_pmtu(&rt->dst, peer); | ||
| 1775 | if (peer->redirect_learned.a4 && | 1783 | if (peer->redirect_learned.a4 && |
| 1776 | peer->redirect_learned.a4 != rt->rt_gateway) { | 1784 | peer->redirect_learned.a4 != rt->rt_gateway) { |
| 1777 | rt->rt_gateway = peer->redirect_learned.a4; | 1785 | rt->rt_gateway = peer->redirect_learned.a4; |
| @@ -2775,7 +2783,8 @@ static int rt_fill_info(struct net *net, | |||
| 2775 | struct rtable *rt = skb_rtable(skb); | 2783 | struct rtable *rt = skb_rtable(skb); |
| 2776 | struct rtmsg *r; | 2784 | struct rtmsg *r; |
| 2777 | struct nlmsghdr *nlh; | 2785 | struct nlmsghdr *nlh; |
| 2778 | long expires; | 2786 | long expires = 0; |
| 2787 | const struct inet_peer *peer = rt->peer; | ||
| 2779 | u32 id = 0, ts = 0, tsage = 0, error; | 2788 | u32 id = 0, ts = 0, tsage = 0, error; |
| 2780 | 2789 | ||
| 2781 | nlh = nlmsg_put(skb, pid, seq, event, sizeof(*r), flags); | 2790 | nlh = nlmsg_put(skb, pid, seq, event, sizeof(*r), flags); |
| @@ -2823,15 +2832,16 @@ static int rt_fill_info(struct net *net, | |||
| 2823 | NLA_PUT_BE32(skb, RTA_MARK, rt->rt_mark); | 2832 | NLA_PUT_BE32(skb, RTA_MARK, rt->rt_mark); |
| 2824 | 2833 | ||
| 2825 | error = rt->dst.error; | 2834 | error = rt->dst.error; |
| 2826 | expires = (rt->peer && rt->peer->pmtu_expires) ? | 2835 | if (peer) { |
| 2827 | rt->peer->pmtu_expires - jiffies : 0; | ||
| 2828 | if (rt->peer) { | ||
| 2829 | inet_peer_refcheck(rt->peer); | 2836 | inet_peer_refcheck(rt->peer); |
| 2830 | id = atomic_read(&rt->peer->ip_id_count) & 0xffff; | 2837 | id = atomic_read(&peer->ip_id_count) & 0xffff; |
| 2831 | if (rt->peer->tcp_ts_stamp) { | 2838 | if (peer->tcp_ts_stamp) { |
| 2832 | ts = rt->peer->tcp_ts; | 2839 | ts = peer->tcp_ts; |
| 2833 | tsage = get_seconds() - rt->peer->tcp_ts_stamp; | 2840 | tsage = get_seconds() - peer->tcp_ts_stamp; |
| 2834 | } | 2841 | } |
| 2842 | expires = ACCESS_ONCE(peer->pmtu_expires); | ||
| 2843 | if (expires) | ||
| 2844 | expires -= jiffies; | ||
| 2835 | } | 2845 | } |
| 2836 | 2846 | ||
| 2837 | if (rt_is_input_route(rt)) { | 2847 | if (rt_is_input_route(rt)) { |
diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c index b7919f901fbf..d450a2f9fc06 100644 --- a/net/ipv6/af_inet6.c +++ b/net/ipv6/af_inet6.c | |||
| @@ -272,6 +272,10 @@ int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) | |||
| 272 | 272 | ||
| 273 | if (addr_len < SIN6_LEN_RFC2133) | 273 | if (addr_len < SIN6_LEN_RFC2133) |
| 274 | return -EINVAL; | 274 | return -EINVAL; |
| 275 | |||
| 276 | if (addr->sin6_family != AF_INET6) | ||
| 277 | return -EINVAL; | ||
| 278 | |||
| 275 | addr_type = ipv6_addr_type(&addr->sin6_addr); | 279 | addr_type = ipv6_addr_type(&addr->sin6_addr); |
| 276 | if ((addr_type & IPV6_ADDR_MULTICAST) && sock->type == SOCK_STREAM) | 280 | if ((addr_type & IPV6_ADDR_MULTICAST) && sock->type == SOCK_STREAM) |
| 277 | return -EINVAL; | 281 | return -EINVAL; |
diff --git a/net/ipv6/netfilter/ip6_queue.c b/net/ipv6/netfilter/ip6_queue.c index 413ab0754e1f..065fe405fb58 100644 --- a/net/ipv6/netfilter/ip6_queue.c +++ b/net/ipv6/netfilter/ip6_queue.c | |||
| @@ -403,7 +403,8 @@ ipq_dev_drop(int ifindex) | |||
| 403 | static inline void | 403 | static inline void |
| 404 | __ipq_rcv_skb(struct sk_buff *skb) | 404 | __ipq_rcv_skb(struct sk_buff *skb) |
| 405 | { | 405 | { |
| 406 | int status, type, pid, flags, nlmsglen, skblen; | 406 | int status, type, pid, flags; |
| 407 | unsigned int nlmsglen, skblen; | ||
| 407 | struct nlmsghdr *nlh; | 408 | struct nlmsghdr *nlh; |
| 408 | 409 | ||
| 409 | skblen = skb->len; | 410 | skblen = skb->len; |
diff --git a/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c b/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c index c8af58b22562..4111050a9fc5 100644 --- a/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c +++ b/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c | |||
| @@ -160,7 +160,7 @@ static unsigned int ipv6_confirm(unsigned int hooknum, | |||
| 160 | 160 | ||
| 161 | /* This is where we call the helper: as the packet goes out. */ | 161 | /* This is where we call the helper: as the packet goes out. */ |
| 162 | ct = nf_ct_get(skb, &ctinfo); | 162 | ct = nf_ct_get(skb, &ctinfo); |
| 163 | if (!ct || ctinfo == IP_CT_RELATED + IP_CT_IS_REPLY) | 163 | if (!ct || ctinfo == IP_CT_RELATED_REPLY) |
| 164 | goto out; | 164 | goto out; |
| 165 | 165 | ||
| 166 | help = nfct_help(ct); | 166 | help = nfct_help(ct); |
diff --git a/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c b/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c index 1df3c8b6bf47..7c05e7eacbc6 100644 --- a/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c +++ b/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c | |||
| @@ -177,7 +177,7 @@ icmpv6_error_message(struct net *net, struct nf_conn *tmpl, | |||
| 177 | /* Update skb to refer to this connection */ | 177 | /* Update skb to refer to this connection */ |
| 178 | skb->nfct = &nf_ct_tuplehash_to_ctrack(h)->ct_general; | 178 | skb->nfct = &nf_ct_tuplehash_to_ctrack(h)->ct_general; |
| 179 | skb->nfctinfo = *ctinfo; | 179 | skb->nfctinfo = *ctinfo; |
| 180 | return -NF_ACCEPT; | 180 | return NF_ACCEPT; |
| 181 | } | 181 | } |
| 182 | 182 | ||
| 183 | static int | 183 | static int |
diff --git a/net/irda/iriap.c b/net/irda/iriap.c index 36477538cea8..f876eed7d4aa 100644 --- a/net/irda/iriap.c +++ b/net/irda/iriap.c | |||
| @@ -87,6 +87,8 @@ static inline void iriap_start_watchdog_timer(struct iriap_cb *self, | |||
| 87 | iriap_watchdog_timer_expired); | 87 | iriap_watchdog_timer_expired); |
| 88 | } | 88 | } |
| 89 | 89 | ||
| 90 | static struct lock_class_key irias_objects_key; | ||
| 91 | |||
| 90 | /* | 92 | /* |
| 91 | * Function iriap_init (void) | 93 | * Function iriap_init (void) |
| 92 | * | 94 | * |
| @@ -114,6 +116,9 @@ int __init iriap_init(void) | |||
| 114 | return -ENOMEM; | 116 | return -ENOMEM; |
| 115 | } | 117 | } |
| 116 | 118 | ||
| 119 | lockdep_set_class_and_name(&irias_objects->hb_spinlock, &irias_objects_key, | ||
| 120 | "irias_objects"); | ||
| 121 | |||
| 117 | /* | 122 | /* |
| 118 | * Register some default services for IrLMP | 123 | * Register some default services for IrLMP |
| 119 | */ | 124 | */ |
diff --git a/net/l2tp/l2tp_debugfs.c b/net/l2tp/l2tp_debugfs.c index b8dbae82fab8..76130134bfa6 100644 --- a/net/l2tp/l2tp_debugfs.c +++ b/net/l2tp/l2tp_debugfs.c | |||
| @@ -258,7 +258,7 @@ static int l2tp_dfs_seq_open(struct inode *inode, struct file *file) | |||
| 258 | */ | 258 | */ |
| 259 | pd->net = get_net_ns_by_pid(current->pid); | 259 | pd->net = get_net_ns_by_pid(current->pid); |
| 260 | if (IS_ERR(pd->net)) { | 260 | if (IS_ERR(pd->net)) { |
| 261 | rc = -PTR_ERR(pd->net); | 261 | rc = PTR_ERR(pd->net); |
| 262 | goto err_free_pd; | 262 | goto err_free_pd; |
| 263 | } | 263 | } |
| 264 | 264 | ||
diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c index 421eaa6b0c2b..56c24cabf26d 100644 --- a/net/mac80211/ibss.c +++ b/net/mac80211/ibss.c | |||
| @@ -965,6 +965,10 @@ int ieee80211_ibss_leave(struct ieee80211_sub_if_data *sdata) | |||
| 965 | 965 | ||
| 966 | mutex_lock(&sdata->u.ibss.mtx); | 966 | mutex_lock(&sdata->u.ibss.mtx); |
| 967 | 967 | ||
| 968 | sdata->u.ibss.state = IEEE80211_IBSS_MLME_SEARCH; | ||
| 969 | memset(sdata->u.ibss.bssid, 0, ETH_ALEN); | ||
| 970 | sdata->u.ibss.ssid_len = 0; | ||
| 971 | |||
| 968 | active_ibss = ieee80211_sta_active_ibss(sdata); | 972 | active_ibss = ieee80211_sta_active_ibss(sdata); |
| 969 | 973 | ||
| 970 | if (!active_ibss && !is_zero_ether_addr(ifibss->bssid)) { | 974 | if (!active_ibss && !is_zero_ether_addr(ifibss->bssid)) { |
| @@ -999,8 +1003,6 @@ int ieee80211_ibss_leave(struct ieee80211_sub_if_data *sdata) | |||
| 999 | kfree_skb(skb); | 1003 | kfree_skb(skb); |
| 1000 | 1004 | ||
| 1001 | skb_queue_purge(&sdata->skb_queue); | 1005 | skb_queue_purge(&sdata->skb_queue); |
| 1002 | memset(sdata->u.ibss.bssid, 0, ETH_ALEN); | ||
| 1003 | sdata->u.ibss.ssid_len = 0; | ||
| 1004 | 1006 | ||
| 1005 | del_timer_sync(&sdata->u.ibss.timer); | 1007 | del_timer_sync(&sdata->u.ibss.timer); |
| 1006 | 1008 | ||
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index 2025af52b195..090b0ec1e056 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h | |||
| @@ -775,9 +775,6 @@ struct ieee80211_local { | |||
| 775 | 775 | ||
| 776 | int tx_headroom; /* required headroom for hardware/radiotap */ | 776 | int tx_headroom; /* required headroom for hardware/radiotap */ |
| 777 | 777 | ||
| 778 | /* count for keys needing tailroom space allocation */ | ||
| 779 | int crypto_tx_tailroom_needed_cnt; | ||
| 780 | |||
| 781 | /* Tasklet and skb queue to process calls from IRQ mode. All frames | 778 | /* Tasklet and skb queue to process calls from IRQ mode. All frames |
| 782 | * added to skb_queue will be processed, but frames in | 779 | * added to skb_queue will be processed, but frames in |
| 783 | * skb_queue_unreliable may be dropped if the total length of these | 780 | * skb_queue_unreliable may be dropped if the total length of these |
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c index 49d4f869e0bc..dee30aea9ab3 100644 --- a/net/mac80211/iface.c +++ b/net/mac80211/iface.c | |||
| @@ -1145,6 +1145,10 @@ int ieee80211_if_add(struct ieee80211_local *local, const char *name, | |||
| 1145 | + IEEE80211_ENCRYPT_HEADROOM; | 1145 | + IEEE80211_ENCRYPT_HEADROOM; |
| 1146 | ndev->needed_tailroom = IEEE80211_ENCRYPT_TAILROOM; | 1146 | ndev->needed_tailroom = IEEE80211_ENCRYPT_TAILROOM; |
| 1147 | 1147 | ||
| 1148 | ret = dev_alloc_name(ndev, ndev->name); | ||
| 1149 | if (ret < 0) | ||
| 1150 | goto fail; | ||
| 1151 | |||
| 1148 | ieee80211_assign_perm_addr(local, ndev, type); | 1152 | ieee80211_assign_perm_addr(local, ndev, type); |
| 1149 | memcpy(ndev->dev_addr, ndev->perm_addr, ETH_ALEN); | 1153 | memcpy(ndev->dev_addr, ndev->perm_addr, ETH_ALEN); |
| 1150 | SET_NETDEV_DEV(ndev, wiphy_dev(local->hw.wiphy)); | 1154 | SET_NETDEV_DEV(ndev, wiphy_dev(local->hw.wiphy)); |
diff --git a/net/mac80211/key.c b/net/mac80211/key.c index 31afd712930d..f825e2f0a57e 100644 --- a/net/mac80211/key.c +++ b/net/mac80211/key.c | |||
| @@ -101,11 +101,6 @@ static int ieee80211_key_enable_hw_accel(struct ieee80211_key *key) | |||
| 101 | 101 | ||
| 102 | if (!ret) { | 102 | if (!ret) { |
| 103 | key->flags |= KEY_FLAG_UPLOADED_TO_HARDWARE; | 103 | key->flags |= KEY_FLAG_UPLOADED_TO_HARDWARE; |
| 104 | |||
| 105 | if (!((key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC) || | ||
| 106 | (key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV))) | ||
| 107 | key->local->crypto_tx_tailroom_needed_cnt--; | ||
| 108 | |||
| 109 | return 0; | 104 | return 0; |
| 110 | } | 105 | } |
| 111 | 106 | ||
| @@ -161,10 +156,6 @@ static void ieee80211_key_disable_hw_accel(struct ieee80211_key *key) | |||
| 161 | key->conf.keyidx, sta ? sta->addr : bcast_addr, ret); | 156 | key->conf.keyidx, sta ? sta->addr : bcast_addr, ret); |
| 162 | 157 | ||
| 163 | key->flags &= ~KEY_FLAG_UPLOADED_TO_HARDWARE; | 158 | key->flags &= ~KEY_FLAG_UPLOADED_TO_HARDWARE; |
| 164 | |||
| 165 | if (!((key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC) || | ||
| 166 | (key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV))) | ||
| 167 | key->local->crypto_tx_tailroom_needed_cnt++; | ||
| 168 | } | 159 | } |
| 169 | 160 | ||
| 170 | void ieee80211_key_removed(struct ieee80211_key_conf *key_conf) | 161 | void ieee80211_key_removed(struct ieee80211_key_conf *key_conf) |
| @@ -403,10 +394,8 @@ static void __ieee80211_key_destroy(struct ieee80211_key *key) | |||
| 403 | ieee80211_aes_key_free(key->u.ccmp.tfm); | 394 | ieee80211_aes_key_free(key->u.ccmp.tfm); |
| 404 | if (key->conf.cipher == WLAN_CIPHER_SUITE_AES_CMAC) | 395 | if (key->conf.cipher == WLAN_CIPHER_SUITE_AES_CMAC) |
| 405 | ieee80211_aes_cmac_key_free(key->u.aes_cmac.tfm); | 396 | ieee80211_aes_cmac_key_free(key->u.aes_cmac.tfm); |
| 406 | if (key->local) { | 397 | if (key->local) |
| 407 | ieee80211_debugfs_key_remove(key); | 398 | ieee80211_debugfs_key_remove(key); |
| 408 | key->local->crypto_tx_tailroom_needed_cnt--; | ||
| 409 | } | ||
| 410 | 399 | ||
| 411 | kfree(key); | 400 | kfree(key); |
| 412 | } | 401 | } |
| @@ -468,8 +457,6 @@ int ieee80211_key_link(struct ieee80211_key *key, | |||
| 468 | 457 | ||
| 469 | ieee80211_debugfs_key_add(key); | 458 | ieee80211_debugfs_key_add(key); |
| 470 | 459 | ||
| 471 | key->local->crypto_tx_tailroom_needed_cnt++; | ||
| 472 | |||
| 473 | ret = ieee80211_key_enable_hw_accel(key); | 460 | ret = ieee80211_key_enable_hw_accel(key); |
| 474 | 461 | ||
| 475 | mutex_unlock(&sdata->local->key_mtx); | 462 | mutex_unlock(&sdata->local->key_mtx); |
| @@ -511,12 +498,8 @@ void ieee80211_enable_keys(struct ieee80211_sub_if_data *sdata) | |||
| 511 | 498 | ||
| 512 | mutex_lock(&sdata->local->key_mtx); | 499 | mutex_lock(&sdata->local->key_mtx); |
| 513 | 500 | ||
| 514 | sdata->local->crypto_tx_tailroom_needed_cnt = 0; | 501 | list_for_each_entry(key, &sdata->key_list, list) |
| 515 | |||
| 516 | list_for_each_entry(key, &sdata->key_list, list) { | ||
| 517 | sdata->local->crypto_tx_tailroom_needed_cnt++; | ||
| 518 | ieee80211_key_enable_hw_accel(key); | 502 | ieee80211_key_enable_hw_accel(key); |
| 519 | } | ||
| 520 | 503 | ||
| 521 | mutex_unlock(&sdata->local->key_mtx); | 504 | mutex_unlock(&sdata->local->key_mtx); |
| 522 | } | 505 | } |
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 456cccf26b51..d595265d6c22 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
| @@ -232,9 +232,6 @@ static u32 ieee80211_enable_ht(struct ieee80211_sub_if_data *sdata, | |||
| 232 | WARN_ON(!ieee80211_set_channel_type(local, sdata, channel_type)); | 232 | WARN_ON(!ieee80211_set_channel_type(local, sdata, channel_type)); |
| 233 | } | 233 | } |
| 234 | 234 | ||
| 235 | ieee80211_stop_queues_by_reason(&sdata->local->hw, | ||
| 236 | IEEE80211_QUEUE_STOP_REASON_CSA); | ||
| 237 | |||
| 238 | /* channel_type change automatically detected */ | 235 | /* channel_type change automatically detected */ |
| 239 | ieee80211_hw_config(local, 0); | 236 | ieee80211_hw_config(local, 0); |
| 240 | 237 | ||
| @@ -248,9 +245,6 @@ static u32 ieee80211_enable_ht(struct ieee80211_sub_if_data *sdata, | |||
| 248 | rcu_read_unlock(); | 245 | rcu_read_unlock(); |
| 249 | } | 246 | } |
| 250 | 247 | ||
| 251 | ieee80211_wake_queues_by_reason(&sdata->local->hw, | ||
| 252 | IEEE80211_QUEUE_STOP_REASON_CSA); | ||
| 253 | |||
| 254 | ht_opmode = le16_to_cpu(hti->operation_mode); | 248 | ht_opmode = le16_to_cpu(hti->operation_mode); |
| 255 | 249 | ||
| 256 | /* if bss configuration changed store the new one */ | 250 | /* if bss configuration changed store the new one */ |
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index 64e0f7587e6d..3104c844b544 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c | |||
| @@ -1480,7 +1480,12 @@ static int ieee80211_skb_resize(struct ieee80211_local *local, | |||
| 1480 | { | 1480 | { |
| 1481 | int tail_need = 0; | 1481 | int tail_need = 0; |
| 1482 | 1482 | ||
| 1483 | if (may_encrypt && local->crypto_tx_tailroom_needed_cnt) { | 1483 | /* |
| 1484 | * This could be optimised, devices that do full hardware | ||
| 1485 | * crypto (including TKIP MMIC) need no tailroom... But we | ||
| 1486 | * have no drivers for such devices currently. | ||
| 1487 | */ | ||
| 1488 | if (may_encrypt) { | ||
| 1484 | tail_need = IEEE80211_ENCRYPT_TAILROOM; | 1489 | tail_need = IEEE80211_ENCRYPT_TAILROOM; |
| 1485 | tail_need -= skb_tailroom(skb); | 1490 | tail_need -= skb_tailroom(skb); |
| 1486 | tail_need = max_t(int, tail_need, 0); | 1491 | tail_need = max_t(int, tail_need, 0); |
diff --git a/net/netfilter/ipset/ip_set_core.c b/net/netfilter/ipset/ip_set_core.c index 8041befc6555..42aa64b6b0b1 100644 --- a/net/netfilter/ipset/ip_set_core.c +++ b/net/netfilter/ipset/ip_set_core.c | |||
| @@ -767,7 +767,7 @@ ip_set_destroy(struct sock *ctnl, struct sk_buff *skb, | |||
| 767 | if (!attr[IPSET_ATTR_SETNAME]) { | 767 | if (!attr[IPSET_ATTR_SETNAME]) { |
| 768 | for (i = 0; i < ip_set_max; i++) { | 768 | for (i = 0; i < ip_set_max; i++) { |
| 769 | if (ip_set_list[i] != NULL && ip_set_list[i]->ref) { | 769 | if (ip_set_list[i] != NULL && ip_set_list[i]->ref) { |
| 770 | ret = IPSET_ERR_BUSY; | 770 | ret = -IPSET_ERR_BUSY; |
| 771 | goto out; | 771 | goto out; |
| 772 | } | 772 | } |
| 773 | } | 773 | } |
diff --git a/net/netfilter/ipset/ip_set_hash_ipportnet.c b/net/netfilter/ipset/ip_set_hash_ipportnet.c index 4743e5402522..565a7c5b8818 100644 --- a/net/netfilter/ipset/ip_set_hash_ipportnet.c +++ b/net/netfilter/ipset/ip_set_hash_ipportnet.c | |||
| @@ -146,8 +146,9 @@ hash_ipportnet4_kadt(struct ip_set *set, const struct sk_buff *skb, | |||
| 146 | { | 146 | { |
| 147 | const struct ip_set_hash *h = set->data; | 147 | const struct ip_set_hash *h = set->data; |
| 148 | ipset_adtfn adtfn = set->variant->adt[adt]; | 148 | ipset_adtfn adtfn = set->variant->adt[adt]; |
| 149 | struct hash_ipportnet4_elem data = | 149 | struct hash_ipportnet4_elem data = { |
| 150 | { .cidr = h->nets[0].cidr || HOST_MASK }; | 150 | .cidr = h->nets[0].cidr ? h->nets[0].cidr : HOST_MASK |
| 151 | }; | ||
| 151 | 152 | ||
| 152 | if (data.cidr == 0) | 153 | if (data.cidr == 0) |
| 153 | return -EINVAL; | 154 | return -EINVAL; |
| @@ -394,8 +395,9 @@ hash_ipportnet6_kadt(struct ip_set *set, const struct sk_buff *skb, | |||
| 394 | { | 395 | { |
| 395 | const struct ip_set_hash *h = set->data; | 396 | const struct ip_set_hash *h = set->data; |
| 396 | ipset_adtfn adtfn = set->variant->adt[adt]; | 397 | ipset_adtfn adtfn = set->variant->adt[adt]; |
| 397 | struct hash_ipportnet6_elem data = | 398 | struct hash_ipportnet6_elem data = { |
| 398 | { .cidr = h->nets[0].cidr || HOST_MASK }; | 399 | .cidr = h->nets[0].cidr ? h->nets[0].cidr : HOST_MASK |
| 400 | }; | ||
| 399 | 401 | ||
| 400 | if (data.cidr == 0) | 402 | if (data.cidr == 0) |
| 401 | return -EINVAL; | 403 | return -EINVAL; |
diff --git a/net/netfilter/ipset/ip_set_hash_net.c b/net/netfilter/ipset/ip_set_hash_net.c index c4db202b7da4..2aeeabcd5a21 100644 --- a/net/netfilter/ipset/ip_set_hash_net.c +++ b/net/netfilter/ipset/ip_set_hash_net.c | |||
| @@ -131,7 +131,9 @@ hash_net4_kadt(struct ip_set *set, const struct sk_buff *skb, | |||
| 131 | { | 131 | { |
| 132 | const struct ip_set_hash *h = set->data; | 132 | const struct ip_set_hash *h = set->data; |
| 133 | ipset_adtfn adtfn = set->variant->adt[adt]; | 133 | ipset_adtfn adtfn = set->variant->adt[adt]; |
| 134 | struct hash_net4_elem data = { .cidr = h->nets[0].cidr || HOST_MASK }; | 134 | struct hash_net4_elem data = { |
| 135 | .cidr = h->nets[0].cidr ? h->nets[0].cidr : HOST_MASK | ||
| 136 | }; | ||
| 135 | 137 | ||
| 136 | if (data.cidr == 0) | 138 | if (data.cidr == 0) |
| 137 | return -EINVAL; | 139 | return -EINVAL; |
| @@ -296,7 +298,9 @@ hash_net6_kadt(struct ip_set *set, const struct sk_buff *skb, | |||
| 296 | { | 298 | { |
| 297 | const struct ip_set_hash *h = set->data; | 299 | const struct ip_set_hash *h = set->data; |
| 298 | ipset_adtfn adtfn = set->variant->adt[adt]; | 300 | ipset_adtfn adtfn = set->variant->adt[adt]; |
| 299 | struct hash_net6_elem data = { .cidr = h->nets[0].cidr || HOST_MASK }; | 301 | struct hash_net6_elem data = { |
| 302 | .cidr = h->nets[0].cidr ? h->nets[0].cidr : HOST_MASK | ||
| 303 | }; | ||
| 300 | 304 | ||
| 301 | if (data.cidr == 0) | 305 | if (data.cidr == 0) |
| 302 | return -EINVAL; | 306 | return -EINVAL; |
diff --git a/net/netfilter/ipset/ip_set_hash_netport.c b/net/netfilter/ipset/ip_set_hash_netport.c index d2a40362dd3a..e50d9bb8820b 100644 --- a/net/netfilter/ipset/ip_set_hash_netport.c +++ b/net/netfilter/ipset/ip_set_hash_netport.c | |||
| @@ -144,7 +144,8 @@ hash_netport4_kadt(struct ip_set *set, const struct sk_buff *skb, | |||
| 144 | const struct ip_set_hash *h = set->data; | 144 | const struct ip_set_hash *h = set->data; |
| 145 | ipset_adtfn adtfn = set->variant->adt[adt]; | 145 | ipset_adtfn adtfn = set->variant->adt[adt]; |
| 146 | struct hash_netport4_elem data = { | 146 | struct hash_netport4_elem data = { |
| 147 | .cidr = h->nets[0].cidr || HOST_MASK }; | 147 | .cidr = h->nets[0].cidr ? h->nets[0].cidr : HOST_MASK |
| 148 | }; | ||
| 148 | 149 | ||
| 149 | if (data.cidr == 0) | 150 | if (data.cidr == 0) |
| 150 | return -EINVAL; | 151 | return -EINVAL; |
| @@ -357,7 +358,8 @@ hash_netport6_kadt(struct ip_set *set, const struct sk_buff *skb, | |||
| 357 | const struct ip_set_hash *h = set->data; | 358 | const struct ip_set_hash *h = set->data; |
| 358 | ipset_adtfn adtfn = set->variant->adt[adt]; | 359 | ipset_adtfn adtfn = set->variant->adt[adt]; |
| 359 | struct hash_netport6_elem data = { | 360 | struct hash_netport6_elem data = { |
| 360 | .cidr = h->nets[0].cidr || HOST_MASK }; | 361 | .cidr = h->nets[0].cidr ? h->nets[0].cidr : HOST_MASK |
| 362 | }; | ||
| 361 | 363 | ||
| 362 | if (data.cidr == 0) | 364 | if (data.cidr == 0) |
| 363 | return -EINVAL; | 365 | return -EINVAL; |
diff --git a/net/netfilter/ipvs/ip_vs_core.c b/net/netfilter/ipvs/ip_vs_core.c index bfa808f4da13..55af2242bccd 100644 --- a/net/netfilter/ipvs/ip_vs_core.c +++ b/net/netfilter/ipvs/ip_vs_core.c | |||
| @@ -1772,7 +1772,7 @@ static struct nf_hook_ops ip_vs_ops[] __read_mostly = { | |||
| 1772 | .owner = THIS_MODULE, | 1772 | .owner = THIS_MODULE, |
| 1773 | .pf = PF_INET, | 1773 | .pf = PF_INET, |
| 1774 | .hooknum = NF_INET_LOCAL_IN, | 1774 | .hooknum = NF_INET_LOCAL_IN, |
| 1775 | .priority = 99, | 1775 | .priority = NF_IP_PRI_NAT_SRC - 2, |
| 1776 | }, | 1776 | }, |
| 1777 | /* After packet filtering, forward packet through VS/DR, VS/TUN, | 1777 | /* After packet filtering, forward packet through VS/DR, VS/TUN, |
| 1778 | * or VS/NAT(change destination), so that filtering rules can be | 1778 | * or VS/NAT(change destination), so that filtering rules can be |
| @@ -1782,7 +1782,7 @@ static struct nf_hook_ops ip_vs_ops[] __read_mostly = { | |||
| 1782 | .owner = THIS_MODULE, | 1782 | .owner = THIS_MODULE, |
| 1783 | .pf = PF_INET, | 1783 | .pf = PF_INET, |
| 1784 | .hooknum = NF_INET_LOCAL_IN, | 1784 | .hooknum = NF_INET_LOCAL_IN, |
| 1785 | .priority = 101, | 1785 | .priority = NF_IP_PRI_NAT_SRC - 1, |
| 1786 | }, | 1786 | }, |
| 1787 | /* Before ip_vs_in, change source only for VS/NAT */ | 1787 | /* Before ip_vs_in, change source only for VS/NAT */ |
| 1788 | { | 1788 | { |
| @@ -1790,7 +1790,7 @@ static struct nf_hook_ops ip_vs_ops[] __read_mostly = { | |||
| 1790 | .owner = THIS_MODULE, | 1790 | .owner = THIS_MODULE, |
| 1791 | .pf = PF_INET, | 1791 | .pf = PF_INET, |
| 1792 | .hooknum = NF_INET_LOCAL_OUT, | 1792 | .hooknum = NF_INET_LOCAL_OUT, |
| 1793 | .priority = -99, | 1793 | .priority = NF_IP_PRI_NAT_DST + 1, |
| 1794 | }, | 1794 | }, |
| 1795 | /* After mangle, schedule and forward local requests */ | 1795 | /* After mangle, schedule and forward local requests */ |
| 1796 | { | 1796 | { |
| @@ -1798,7 +1798,7 @@ static struct nf_hook_ops ip_vs_ops[] __read_mostly = { | |||
| 1798 | .owner = THIS_MODULE, | 1798 | .owner = THIS_MODULE, |
| 1799 | .pf = PF_INET, | 1799 | .pf = PF_INET, |
| 1800 | .hooknum = NF_INET_LOCAL_OUT, | 1800 | .hooknum = NF_INET_LOCAL_OUT, |
| 1801 | .priority = -98, | 1801 | .priority = NF_IP_PRI_NAT_DST + 2, |
| 1802 | }, | 1802 | }, |
| 1803 | /* After packet filtering (but before ip_vs_out_icmp), catch icmp | 1803 | /* After packet filtering (but before ip_vs_out_icmp), catch icmp |
| 1804 | * destined for 0.0.0.0/0, which is for incoming IPVS connections */ | 1804 | * destined for 0.0.0.0/0, which is for incoming IPVS connections */ |
| @@ -1824,7 +1824,7 @@ static struct nf_hook_ops ip_vs_ops[] __read_mostly = { | |||
| 1824 | .owner = THIS_MODULE, | 1824 | .owner = THIS_MODULE, |
| 1825 | .pf = PF_INET6, | 1825 | .pf = PF_INET6, |
| 1826 | .hooknum = NF_INET_LOCAL_IN, | 1826 | .hooknum = NF_INET_LOCAL_IN, |
| 1827 | .priority = 99, | 1827 | .priority = NF_IP6_PRI_NAT_SRC - 2, |
| 1828 | }, | 1828 | }, |
| 1829 | /* After packet filtering, forward packet through VS/DR, VS/TUN, | 1829 | /* After packet filtering, forward packet through VS/DR, VS/TUN, |
| 1830 | * or VS/NAT(change destination), so that filtering rules can be | 1830 | * or VS/NAT(change destination), so that filtering rules can be |
| @@ -1834,7 +1834,7 @@ static struct nf_hook_ops ip_vs_ops[] __read_mostly = { | |||
| 1834 | .owner = THIS_MODULE, | 1834 | .owner = THIS_MODULE, |
| 1835 | .pf = PF_INET6, | 1835 | .pf = PF_INET6, |
| 1836 | .hooknum = NF_INET_LOCAL_IN, | 1836 | .hooknum = NF_INET_LOCAL_IN, |
| 1837 | .priority = 101, | 1837 | .priority = NF_IP6_PRI_NAT_SRC - 1, |
| 1838 | }, | 1838 | }, |
| 1839 | /* Before ip_vs_in, change source only for VS/NAT */ | 1839 | /* Before ip_vs_in, change source only for VS/NAT */ |
| 1840 | { | 1840 | { |
| @@ -1842,7 +1842,7 @@ static struct nf_hook_ops ip_vs_ops[] __read_mostly = { | |||
| 1842 | .owner = THIS_MODULE, | 1842 | .owner = THIS_MODULE, |
| 1843 | .pf = PF_INET, | 1843 | .pf = PF_INET, |
| 1844 | .hooknum = NF_INET_LOCAL_OUT, | 1844 | .hooknum = NF_INET_LOCAL_OUT, |
| 1845 | .priority = -99, | 1845 | .priority = NF_IP6_PRI_NAT_DST + 1, |
| 1846 | }, | 1846 | }, |
| 1847 | /* After mangle, schedule and forward local requests */ | 1847 | /* After mangle, schedule and forward local requests */ |
| 1848 | { | 1848 | { |
| @@ -1850,7 +1850,7 @@ static struct nf_hook_ops ip_vs_ops[] __read_mostly = { | |||
| 1850 | .owner = THIS_MODULE, | 1850 | .owner = THIS_MODULE, |
| 1851 | .pf = PF_INET6, | 1851 | .pf = PF_INET6, |
| 1852 | .hooknum = NF_INET_LOCAL_OUT, | 1852 | .hooknum = NF_INET_LOCAL_OUT, |
| 1853 | .priority = -98, | 1853 | .priority = NF_IP6_PRI_NAT_DST + 2, |
| 1854 | }, | 1854 | }, |
| 1855 | /* After packet filtering (but before ip_vs_out_icmp), catch icmp | 1855 | /* After packet filtering (but before ip_vs_out_icmp), catch icmp |
| 1856 | * destined for 0.0.0.0/0, which is for incoming IPVS connections */ | 1856 | * destined for 0.0.0.0/0, which is for incoming IPVS connections */ |
diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c index 2e1c11f78419..f7af8b866017 100644 --- a/net/netfilter/nf_conntrack_core.c +++ b/net/netfilter/nf_conntrack_core.c | |||
| @@ -850,7 +850,7 @@ resolve_normal_ct(struct net *net, struct nf_conn *tmpl, | |||
| 850 | 850 | ||
| 851 | /* It exists; we have (non-exclusive) reference. */ | 851 | /* It exists; we have (non-exclusive) reference. */ |
| 852 | if (NF_CT_DIRECTION(h) == IP_CT_DIR_REPLY) { | 852 | if (NF_CT_DIRECTION(h) == IP_CT_DIR_REPLY) { |
| 853 | *ctinfo = IP_CT_ESTABLISHED + IP_CT_IS_REPLY; | 853 | *ctinfo = IP_CT_ESTABLISHED_REPLY; |
| 854 | /* Please set reply bit if this packet OK */ | 854 | /* Please set reply bit if this packet OK */ |
| 855 | *set_reply = 1; | 855 | *set_reply = 1; |
| 856 | } else { | 856 | } else { |
| @@ -922,6 +922,9 @@ nf_conntrack_in(struct net *net, u_int8_t pf, unsigned int hooknum, | |||
| 922 | ret = -ret; | 922 | ret = -ret; |
| 923 | goto out; | 923 | goto out; |
| 924 | } | 924 | } |
| 925 | /* ICMP[v6] protocol trackers may assign one conntrack. */ | ||
| 926 | if (skb->nfct) | ||
| 927 | goto out; | ||
| 925 | } | 928 | } |
| 926 | 929 | ||
| 927 | ct = resolve_normal_ct(net, tmpl, skb, dataoff, pf, protonum, | 930 | ct = resolve_normal_ct(net, tmpl, skb, dataoff, pf, protonum, |
| @@ -1143,7 +1146,7 @@ static void nf_conntrack_attach(struct sk_buff *nskb, struct sk_buff *skb) | |||
| 1143 | /* This ICMP is in reverse direction to the packet which caused it */ | 1146 | /* This ICMP is in reverse direction to the packet which caused it */ |
| 1144 | ct = nf_ct_get(skb, &ctinfo); | 1147 | ct = nf_ct_get(skb, &ctinfo); |
| 1145 | if (CTINFO2DIR(ctinfo) == IP_CT_DIR_ORIGINAL) | 1148 | if (CTINFO2DIR(ctinfo) == IP_CT_DIR_ORIGINAL) |
| 1146 | ctinfo = IP_CT_RELATED + IP_CT_IS_REPLY; | 1149 | ctinfo = IP_CT_RELATED_REPLY; |
| 1147 | else | 1150 | else |
| 1148 | ctinfo = IP_CT_RELATED; | 1151 | ctinfo = IP_CT_RELATED; |
| 1149 | 1152 | ||
diff --git a/net/netfilter/nf_conntrack_ftp.c b/net/netfilter/nf_conntrack_ftp.c index e17cb7c7dd8f..6f5801eac999 100644 --- a/net/netfilter/nf_conntrack_ftp.c +++ b/net/netfilter/nf_conntrack_ftp.c | |||
| @@ -368,7 +368,7 @@ static int help(struct sk_buff *skb, | |||
| 368 | 368 | ||
| 369 | /* Until there's been traffic both ways, don't look in packets. */ | 369 | /* Until there's been traffic both ways, don't look in packets. */ |
| 370 | if (ctinfo != IP_CT_ESTABLISHED && | 370 | if (ctinfo != IP_CT_ESTABLISHED && |
| 371 | ctinfo != IP_CT_ESTABLISHED + IP_CT_IS_REPLY) { | 371 | ctinfo != IP_CT_ESTABLISHED_REPLY) { |
| 372 | pr_debug("ftp: Conntrackinfo = %u\n", ctinfo); | 372 | pr_debug("ftp: Conntrackinfo = %u\n", ctinfo); |
| 373 | return NF_ACCEPT; | 373 | return NF_ACCEPT; |
| 374 | } | 374 | } |
diff --git a/net/netfilter/nf_conntrack_h323_main.c b/net/netfilter/nf_conntrack_h323_main.c index 18b2ce5c8ced..f03c2d4539f6 100644 --- a/net/netfilter/nf_conntrack_h323_main.c +++ b/net/netfilter/nf_conntrack_h323_main.c | |||
| @@ -571,10 +571,9 @@ static int h245_help(struct sk_buff *skb, unsigned int protoff, | |||
| 571 | int ret; | 571 | int ret; |
| 572 | 572 | ||
| 573 | /* Until there's been traffic both ways, don't look in packets. */ | 573 | /* Until there's been traffic both ways, don't look in packets. */ |
| 574 | if (ctinfo != IP_CT_ESTABLISHED && | 574 | if (ctinfo != IP_CT_ESTABLISHED && ctinfo != IP_CT_ESTABLISHED_REPLY) |
| 575 | ctinfo != IP_CT_ESTABLISHED + IP_CT_IS_REPLY) { | ||
| 576 | return NF_ACCEPT; | 575 | return NF_ACCEPT; |
| 577 | } | 576 | |
| 578 | pr_debug("nf_ct_h245: skblen = %u\n", skb->len); | 577 | pr_debug("nf_ct_h245: skblen = %u\n", skb->len); |
| 579 | 578 | ||
| 580 | spin_lock_bh(&nf_h323_lock); | 579 | spin_lock_bh(&nf_h323_lock); |
| @@ -1125,10 +1124,9 @@ static int q931_help(struct sk_buff *skb, unsigned int protoff, | |||
| 1125 | int ret; | 1124 | int ret; |
| 1126 | 1125 | ||
| 1127 | /* Until there's been traffic both ways, don't look in packets. */ | 1126 | /* Until there's been traffic both ways, don't look in packets. */ |
| 1128 | if (ctinfo != IP_CT_ESTABLISHED && | 1127 | if (ctinfo != IP_CT_ESTABLISHED && ctinfo != IP_CT_ESTABLISHED_REPLY) |
| 1129 | ctinfo != IP_CT_ESTABLISHED + IP_CT_IS_REPLY) { | ||
| 1130 | return NF_ACCEPT; | 1128 | return NF_ACCEPT; |
| 1131 | } | 1129 | |
| 1132 | pr_debug("nf_ct_q931: skblen = %u\n", skb->len); | 1130 | pr_debug("nf_ct_q931: skblen = %u\n", skb->len); |
| 1133 | 1131 | ||
| 1134 | spin_lock_bh(&nf_h323_lock); | 1132 | spin_lock_bh(&nf_h323_lock); |
diff --git a/net/netfilter/nf_conntrack_irc.c b/net/netfilter/nf_conntrack_irc.c index b394aa318776..4f9390b98697 100644 --- a/net/netfilter/nf_conntrack_irc.c +++ b/net/netfilter/nf_conntrack_irc.c | |||
| @@ -125,8 +125,7 @@ static int help(struct sk_buff *skb, unsigned int protoff, | |||
| 125 | return NF_ACCEPT; | 125 | return NF_ACCEPT; |
| 126 | 126 | ||
| 127 | /* Until there's been traffic both ways, don't look in packets. */ | 127 | /* Until there's been traffic both ways, don't look in packets. */ |
| 128 | if (ctinfo != IP_CT_ESTABLISHED && | 128 | if (ctinfo != IP_CT_ESTABLISHED && ctinfo != IP_CT_ESTABLISHED_REPLY) |
| 129 | ctinfo != IP_CT_ESTABLISHED + IP_CT_IS_REPLY) | ||
| 130 | return NF_ACCEPT; | 129 | return NF_ACCEPT; |
| 131 | 130 | ||
| 132 | /* Not a full tcp header? */ | 131 | /* Not a full tcp header? */ |
diff --git a/net/netfilter/nf_conntrack_pptp.c b/net/netfilter/nf_conntrack_pptp.c index 088944824e13..2fd4565144de 100644 --- a/net/netfilter/nf_conntrack_pptp.c +++ b/net/netfilter/nf_conntrack_pptp.c | |||
| @@ -519,8 +519,7 @@ conntrack_pptp_help(struct sk_buff *skb, unsigned int protoff, | |||
| 519 | u_int16_t msg; | 519 | u_int16_t msg; |
| 520 | 520 | ||
| 521 | /* don't do any tracking before tcp handshake complete */ | 521 | /* don't do any tracking before tcp handshake complete */ |
| 522 | if (ctinfo != IP_CT_ESTABLISHED && | 522 | if (ctinfo != IP_CT_ESTABLISHED && ctinfo != IP_CT_ESTABLISHED_REPLY) |
| 523 | ctinfo != IP_CT_ESTABLISHED + IP_CT_IS_REPLY) | ||
| 524 | return NF_ACCEPT; | 523 | return NF_ACCEPT; |
| 525 | 524 | ||
| 526 | nexthdr_off = protoff; | 525 | nexthdr_off = protoff; |
diff --git a/net/netfilter/nf_conntrack_sane.c b/net/netfilter/nf_conntrack_sane.c index d9e27734b2a2..8501823b3f9b 100644 --- a/net/netfilter/nf_conntrack_sane.c +++ b/net/netfilter/nf_conntrack_sane.c | |||
| @@ -78,7 +78,7 @@ static int help(struct sk_buff *skb, | |||
| 78 | ct_sane_info = &nfct_help(ct)->help.ct_sane_info; | 78 | ct_sane_info = &nfct_help(ct)->help.ct_sane_info; |
| 79 | /* Until there's been traffic both ways, don't look in packets. */ | 79 | /* Until there's been traffic both ways, don't look in packets. */ |
| 80 | if (ctinfo != IP_CT_ESTABLISHED && | 80 | if (ctinfo != IP_CT_ESTABLISHED && |
| 81 | ctinfo != IP_CT_ESTABLISHED+IP_CT_IS_REPLY) | 81 | ctinfo != IP_CT_ESTABLISHED_REPLY) |
| 82 | return NF_ACCEPT; | 82 | return NF_ACCEPT; |
| 83 | 83 | ||
| 84 | /* Not a full tcp header? */ | 84 | /* Not a full tcp header? */ |
diff --git a/net/netfilter/nf_conntrack_sip.c b/net/netfilter/nf_conntrack_sip.c index cb5a28581782..93faf6a3a637 100644 --- a/net/netfilter/nf_conntrack_sip.c +++ b/net/netfilter/nf_conntrack_sip.c | |||
| @@ -1423,7 +1423,7 @@ static int sip_help_tcp(struct sk_buff *skb, unsigned int protoff, | |||
| 1423 | typeof(nf_nat_sip_seq_adjust_hook) nf_nat_sip_seq_adjust; | 1423 | typeof(nf_nat_sip_seq_adjust_hook) nf_nat_sip_seq_adjust; |
| 1424 | 1424 | ||
| 1425 | if (ctinfo != IP_CT_ESTABLISHED && | 1425 | if (ctinfo != IP_CT_ESTABLISHED && |
| 1426 | ctinfo != IP_CT_ESTABLISHED + IP_CT_IS_REPLY) | 1426 | ctinfo != IP_CT_ESTABLISHED_REPLY) |
| 1427 | return NF_ACCEPT; | 1427 | return NF_ACCEPT; |
| 1428 | 1428 | ||
| 1429 | /* No Data ? */ | 1429 | /* No Data ? */ |
diff --git a/net/netfilter/xt_socket.c b/net/netfilter/xt_socket.c index 9cc46356b577..fe39f7e913df 100644 --- a/net/netfilter/xt_socket.c +++ b/net/netfilter/xt_socket.c | |||
| @@ -143,9 +143,9 @@ socket_match(const struct sk_buff *skb, struct xt_action_param *par, | |||
| 143 | ct = nf_ct_get(skb, &ctinfo); | 143 | ct = nf_ct_get(skb, &ctinfo); |
| 144 | if (ct && !nf_ct_is_untracked(ct) && | 144 | if (ct && !nf_ct_is_untracked(ct) && |
| 145 | ((iph->protocol != IPPROTO_ICMP && | 145 | ((iph->protocol != IPPROTO_ICMP && |
| 146 | ctinfo == IP_CT_IS_REPLY + IP_CT_ESTABLISHED) || | 146 | ctinfo == IP_CT_ESTABLISHED_REPLY) || |
| 147 | (iph->protocol == IPPROTO_ICMP && | 147 | (iph->protocol == IPPROTO_ICMP && |
| 148 | ctinfo == IP_CT_IS_REPLY + IP_CT_RELATED)) && | 148 | ctinfo == IP_CT_RELATED_REPLY)) && |
| 149 | (ct->status & IPS_SRC_NAT_DONE)) { | 149 | (ct->status & IPS_SRC_NAT_DONE)) { |
| 150 | 150 | ||
| 151 | daddr = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3.ip; | 151 | daddr = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3.ip; |
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index ba248d93399a..c0c3cda19712 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c | |||
| @@ -804,6 +804,7 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, | |||
| 804 | } else { | 804 | } else { |
| 805 | h.h2->tp_vlan_tci = 0; | 805 | h.h2->tp_vlan_tci = 0; |
| 806 | } | 806 | } |
| 807 | h.h2->tp_padding = 0; | ||
| 807 | hdrlen = sizeof(*h.h2); | 808 | hdrlen = sizeof(*h.h2); |
| 808 | break; | 809 | break; |
| 809 | default: | 810 | default: |
| @@ -1736,6 +1737,7 @@ static int packet_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
| 1736 | } else { | 1737 | } else { |
| 1737 | aux.tp_vlan_tci = 0; | 1738 | aux.tp_vlan_tci = 0; |
| 1738 | } | 1739 | } |
| 1740 | aux.tp_padding = 0; | ||
| 1739 | put_cmsg(msg, SOL_PACKET, PACKET_AUXDATA, sizeof(aux), &aux); | 1741 | put_cmsg(msg, SOL_PACKET, PACKET_AUXDATA, sizeof(aux), &aux); |
| 1740 | } | 1742 | } |
| 1741 | 1743 | ||
diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c index b1721d71c27c..b4c680900d7a 100644 --- a/net/sched/sch_generic.c +++ b/net/sched/sch_generic.c | |||
| @@ -251,9 +251,8 @@ static void dev_watchdog(unsigned long arg) | |||
| 251 | } | 251 | } |
| 252 | 252 | ||
| 253 | if (some_queue_timedout) { | 253 | if (some_queue_timedout) { |
| 254 | char drivername[64]; | ||
| 255 | WARN_ONCE(1, KERN_INFO "NETDEV WATCHDOG: %s (%s): transmit queue %u timed out\n", | 254 | WARN_ONCE(1, KERN_INFO "NETDEV WATCHDOG: %s (%s): transmit queue %u timed out\n", |
| 256 | dev->name, netdev_drivername(dev, drivername, 64), i); | 255 | dev->name, netdev_drivername(dev), i); |
| 257 | dev->netdev_ops->ndo_tx_timeout(dev); | 256 | dev->netdev_ops->ndo_tx_timeout(dev); |
| 258 | } | 257 | } |
| 259 | if (!mod_timer(&dev->watchdog_timer, | 258 | if (!mod_timer(&dev->watchdog_timer, |
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 88a565f130a5..98fa8eb6cc4b 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
| @@ -3406,11 +3406,11 @@ static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info) | |||
| 3406 | i = 0; | 3406 | i = 0; |
| 3407 | if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) { | 3407 | if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) { |
| 3408 | nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) { | 3408 | nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) { |
| 3409 | request->ssids[i].ssid_len = nla_len(attr); | 3409 | if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) { |
| 3410 | if (request->ssids[i].ssid_len > IEEE80211_MAX_SSID_LEN) { | ||
| 3411 | err = -EINVAL; | 3410 | err = -EINVAL; |
| 3412 | goto out_free; | 3411 | goto out_free; |
| 3413 | } | 3412 | } |
| 3413 | request->ssids[i].ssid_len = nla_len(attr); | ||
| 3414 | memcpy(request->ssids[i].ssid, nla_data(attr), nla_len(attr)); | 3414 | memcpy(request->ssids[i].ssid, nla_data(attr), nla_len(attr)); |
| 3415 | i++; | 3415 | i++; |
| 3416 | } | 3416 | } |
| @@ -3572,12 +3572,11 @@ static int nl80211_start_sched_scan(struct sk_buff *skb, | |||
| 3572 | if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) { | 3572 | if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) { |
| 3573 | nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], | 3573 | nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], |
| 3574 | tmp) { | 3574 | tmp) { |
| 3575 | request->ssids[i].ssid_len = nla_len(attr); | 3575 | if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) { |
| 3576 | if (request->ssids[i].ssid_len > | ||
| 3577 | IEEE80211_MAX_SSID_LEN) { | ||
| 3578 | err = -EINVAL; | 3576 | err = -EINVAL; |
| 3579 | goto out_free; | 3577 | goto out_free; |
| 3580 | } | 3578 | } |
| 3579 | request->ssids[i].ssid_len = nla_len(attr); | ||
| 3581 | memcpy(request->ssids[i].ssid, nla_data(attr), | 3580 | memcpy(request->ssids[i].ssid, nla_data(attr), |
| 3582 | nla_len(attr)); | 3581 | nla_len(attr)); |
| 3583 | i++; | 3582 | i++; |
diff --git a/net/xfrm/xfrm_replay.c b/net/xfrm/xfrm_replay.c index 47f1b8638df9..b11ea692bd7d 100644 --- a/net/xfrm/xfrm_replay.c +++ b/net/xfrm/xfrm_replay.c | |||
| @@ -265,7 +265,7 @@ static void xfrm_replay_advance_bmp(struct xfrm_state *x, __be32 net_seq) | |||
| 265 | bitnr = bitnr & 0x1F; | 265 | bitnr = bitnr & 0x1F; |
| 266 | replay_esn->bmp[nr] |= (1U << bitnr); | 266 | replay_esn->bmp[nr] |= (1U << bitnr); |
| 267 | } else { | 267 | } else { |
| 268 | nr = replay_esn->replay_window >> 5; | 268 | nr = (replay_esn->replay_window - 1) >> 5; |
| 269 | for (i = 0; i <= nr; i++) | 269 | for (i = 0; i <= nr; i++) |
| 270 | replay_esn->bmp[i] = 0; | 270 | replay_esn->bmp[i] = 0; |
| 271 | 271 | ||
| @@ -471,7 +471,7 @@ static void xfrm_replay_advance_esn(struct xfrm_state *x, __be32 net_seq) | |||
| 471 | bitnr = bitnr & 0x1F; | 471 | bitnr = bitnr & 0x1F; |
| 472 | replay_esn->bmp[nr] |= (1U << bitnr); | 472 | replay_esn->bmp[nr] |= (1U << bitnr); |
| 473 | } else { | 473 | } else { |
| 474 | nr = replay_esn->replay_window >> 5; | 474 | nr = (replay_esn->replay_window - 1) >> 5; |
| 475 | for (i = 0; i <= nr; i++) | 475 | for (i = 0; i <= nr; i++) |
| 476 | replay_esn->bmp[i] = 0; | 476 | replay_esn->bmp[i] = 0; |
| 477 | 477 | ||
diff --git a/scripts/Makefile.asm-generic b/scripts/Makefile.asm-generic index 490122c3e2aa..40caf3c26cd5 100644 --- a/scripts/Makefile.asm-generic +++ b/scripts/Makefile.asm-generic | |||
| @@ -17,6 +17,7 @@ quiet_cmd_wrap = WRAP $@ | |||
| 17 | cmd_wrap = echo "\#include <asm-generic/$*.h>" >$@ | 17 | cmd_wrap = echo "\#include <asm-generic/$*.h>" >$@ |
| 18 | 18 | ||
| 19 | all: $(patsubst %, $(obj)/%, $(generic-y)) | 19 | all: $(patsubst %, $(obj)/%, $(generic-y)) |
| 20 | @: | ||
| 20 | 21 | ||
| 21 | $(obj)/%.h: | 22 | $(obj)/%.h: |
| 22 | $(call cmd,wrap) | 23 | $(call cmd,wrap) |
diff --git a/scripts/depmod.sh b/scripts/depmod.sh new file mode 100755 index 000000000000..3b029cba2baf --- /dev/null +++ b/scripts/depmod.sh | |||
| @@ -0,0 +1,48 @@ | |||
| 1 | #!/bin/sh | ||
| 2 | # | ||
| 3 | # A depmod wrapper used by the toplevel Makefile | ||
| 4 | |||
| 5 | if test $# -ne 2; then | ||
| 6 | echo "Usage: $0 /sbin/depmod <kernelrelease>" >&2 | ||
| 7 | exit 1 | ||
| 8 | fi | ||
| 9 | DEPMOD=$1 | ||
| 10 | KERNELRELEASE=$2 | ||
| 11 | |||
| 12 | if ! "$DEPMOD" -V 2>/dev/null | grep -q module-init-tools; then | ||
| 13 | echo "Warning: you may need to install module-init-tools" >&2 | ||
| 14 | echo "See http://www.codemonkey.org.uk/docs/post-halloween-2.6.txt" >&2 | ||
| 15 | sleep 1 | ||
| 16 | fi | ||
| 17 | |||
| 18 | if ! test -r System.map -a -x "$DEPMOD"; then | ||
| 19 | exit 0 | ||
| 20 | fi | ||
| 21 | # older versions of depmod require the version string to start with three | ||
| 22 | # numbers, so we cheat with a symlink here | ||
| 23 | depmod_hack_needed=true | ||
| 24 | mkdir -p .tmp_depmod/lib/modules/$KERNELRELEASE | ||
| 25 | if "$DEPMOD" -b .tmp_depmod $KERNELRELEASE 2>/dev/null; then | ||
| 26 | if test -e .tmp_depmod/lib/modules/$KERNELRELEASE/modules.dep -o \ | ||
| 27 | -e .tmp_depmod/lib/modules/$KERNELRELEASE/modules.dep.bin; then | ||
| 28 | depmod_hack_needed=false | ||
| 29 | fi | ||
| 30 | fi | ||
| 31 | if $depmod_hack_needed; then | ||
| 32 | symlink="$INSTALL_MOD_PATH/lib/modules/99.98.$KERNELRELEASE" | ||
| 33 | ln -s "$KERNELRELEASE" "$symlink" | ||
| 34 | KERNELRELEASE=99.98.$KERNELRELEASE | ||
| 35 | fi | ||
| 36 | |||
| 37 | set -- -ae -F System.map | ||
| 38 | if test -n "$INSTALL_MOD_PATH"; then | ||
| 39 | set -- "$@" -b "$INSTALL_MOD_PATH" | ||
| 40 | fi | ||
| 41 | "$DEPMOD" "$@" "$KERNELRELEASE" | ||
| 42 | ret=$? | ||
| 43 | |||
| 44 | if $depmod_hack_needed; then | ||
| 45 | rm -f "$symlink" | ||
| 46 | fi | ||
| 47 | |||
| 48 | exit $ret | ||
diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c index ec1bcecf2cda..3d2fd141dff7 100644 --- a/security/apparmor/lsm.c +++ b/security/apparmor/lsm.c | |||
| @@ -612,7 +612,7 @@ static int apparmor_setprocattr(struct task_struct *task, char *name, | |||
| 612 | static int apparmor_task_setrlimit(struct task_struct *task, | 612 | static int apparmor_task_setrlimit(struct task_struct *task, |
| 613 | unsigned int resource, struct rlimit *new_rlim) | 613 | unsigned int resource, struct rlimit *new_rlim) |
| 614 | { | 614 | { |
| 615 | struct aa_profile *profile = aa_current_profile(); | 615 | struct aa_profile *profile = __aa_current_profile(); |
| 616 | int error = 0; | 616 | int error = 0; |
| 617 | 617 | ||
| 618 | if (!unconfined(profile)) | 618 | if (!unconfined(profile)) |
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index a0d38459d650..20219ef5439a 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c | |||
| @@ -1476,7 +1476,6 @@ static int inode_has_perm(const struct cred *cred, | |||
| 1476 | unsigned flags) | 1476 | unsigned flags) |
| 1477 | { | 1477 | { |
| 1478 | struct inode_security_struct *isec; | 1478 | struct inode_security_struct *isec; |
| 1479 | struct common_audit_data ad; | ||
| 1480 | u32 sid; | 1479 | u32 sid; |
| 1481 | 1480 | ||
| 1482 | validate_creds(cred); | 1481 | validate_creds(cred); |
| @@ -1487,15 +1486,21 @@ static int inode_has_perm(const struct cred *cred, | |||
| 1487 | sid = cred_sid(cred); | 1486 | sid = cred_sid(cred); |
| 1488 | isec = inode->i_security; | 1487 | isec = inode->i_security; |
| 1489 | 1488 | ||
| 1490 | if (!adp) { | ||
| 1491 | adp = &ad; | ||
| 1492 | COMMON_AUDIT_DATA_INIT(&ad, INODE); | ||
| 1493 | ad.u.inode = inode; | ||
| 1494 | } | ||
| 1495 | |||
| 1496 | return avc_has_perm_flags(sid, isec->sid, isec->sclass, perms, adp, flags); | 1489 | return avc_has_perm_flags(sid, isec->sid, isec->sclass, perms, adp, flags); |
| 1497 | } | 1490 | } |
| 1498 | 1491 | ||
| 1492 | static int inode_has_perm_noadp(const struct cred *cred, | ||
| 1493 | struct inode *inode, | ||
| 1494 | u32 perms, | ||
| 1495 | unsigned flags) | ||
| 1496 | { | ||
| 1497 | struct common_audit_data ad; | ||
| 1498 | |||
| 1499 | COMMON_AUDIT_DATA_INIT(&ad, INODE); | ||
| 1500 | ad.u.inode = inode; | ||
| 1501 | return inode_has_perm(cred, inode, perms, &ad, flags); | ||
| 1502 | } | ||
| 1503 | |||
| 1499 | /* Same as inode_has_perm, but pass explicit audit data containing | 1504 | /* Same as inode_has_perm, but pass explicit audit data containing |
| 1500 | the dentry to help the auditing code to more easily generate the | 1505 | the dentry to help the auditing code to more easily generate the |
| 1501 | pathname if needed. */ | 1506 | pathname if needed. */ |
| @@ -2122,8 +2127,8 @@ static inline void flush_unauthorized_files(const struct cred *cred, | |||
| 2122 | struct tty_file_private, list); | 2127 | struct tty_file_private, list); |
| 2123 | file = file_priv->file; | 2128 | file = file_priv->file; |
| 2124 | inode = file->f_path.dentry->d_inode; | 2129 | inode = file->f_path.dentry->d_inode; |
| 2125 | if (inode_has_perm(cred, inode, | 2130 | if (inode_has_perm_noadp(cred, inode, |
| 2126 | FILE__READ | FILE__WRITE, NULL, 0)) { | 2131 | FILE__READ | FILE__WRITE, 0)) { |
| 2127 | drop_tty = 1; | 2132 | drop_tty = 1; |
| 2128 | } | 2133 | } |
| 2129 | } | 2134 | } |
| @@ -3228,7 +3233,7 @@ static int selinux_dentry_open(struct file *file, const struct cred *cred) | |||
| 3228 | * new inode label or new policy. | 3233 | * new inode label or new policy. |
| 3229 | * This check is not redundant - do not remove. | 3234 | * This check is not redundant - do not remove. |
| 3230 | */ | 3235 | */ |
| 3231 | return inode_has_perm(cred, inode, open_file_to_av(file), NULL, 0); | 3236 | return inode_has_perm_noadp(cred, inode, open_file_to_av(file), 0); |
| 3232 | } | 3237 | } |
| 3233 | 3238 | ||
| 3234 | /* task security operations */ | 3239 | /* task security operations */ |
diff --git a/sound/core/misc.c b/sound/core/misc.c index 2c41825c836e..eb9fe2e1d291 100644 --- a/sound/core/misc.c +++ b/sound/core/misc.c | |||
| @@ -58,26 +58,6 @@ static const char *sanity_file_name(const char *path) | |||
| 58 | else | 58 | else |
| 59 | return path; | 59 | return path; |
| 60 | } | 60 | } |
| 61 | |||
| 62 | /* print file and line with a certain printk prefix */ | ||
| 63 | static int print_snd_pfx(unsigned int level, const char *path, int line, | ||
| 64 | const char *format) | ||
| 65 | { | ||
| 66 | const char *file = sanity_file_name(path); | ||
| 67 | char tmp[] = "<0>"; | ||
| 68 | const char *pfx = level ? KERN_DEBUG : KERN_DEFAULT; | ||
| 69 | int ret = 0; | ||
| 70 | |||
| 71 | if (format[0] == '<' && format[2] == '>') { | ||
| 72 | tmp[1] = format[1]; | ||
| 73 | pfx = tmp; | ||
| 74 | ret = 1; | ||
| 75 | } | ||
| 76 | printk("%sALSA %s:%d: ", pfx, file, line); | ||
| 77 | return ret; | ||
| 78 | } | ||
| 79 | #else | ||
| 80 | #define print_snd_pfx(level, path, line, format) 0 | ||
| 81 | #endif | 61 | #endif |
| 82 | 62 | ||
| 83 | #if defined(CONFIG_SND_DEBUG) || defined(CONFIG_SND_VERBOSE_PRINTK) | 63 | #if defined(CONFIG_SND_DEBUG) || defined(CONFIG_SND_VERBOSE_PRINTK) |
| @@ -85,15 +65,29 @@ void __snd_printk(unsigned int level, const char *path, int line, | |||
| 85 | const char *format, ...) | 65 | const char *format, ...) |
| 86 | { | 66 | { |
| 87 | va_list args; | 67 | va_list args; |
| 88 | 68 | #ifdef CONFIG_SND_VERBOSE_PRINTK | |
| 69 | struct va_format vaf; | ||
| 70 | char verbose_fmt[] = KERN_DEFAULT "ALSA %s:%d %pV"; | ||
| 71 | #endif | ||
| 72 | |||
| 89 | #ifdef CONFIG_SND_DEBUG | 73 | #ifdef CONFIG_SND_DEBUG |
| 90 | if (debug < level) | 74 | if (debug < level) |
| 91 | return; | 75 | return; |
| 92 | #endif | 76 | #endif |
| 77 | |||
| 93 | va_start(args, format); | 78 | va_start(args, format); |
| 94 | if (print_snd_pfx(level, path, line, format)) | 79 | #ifdef CONFIG_SND_VERBOSE_PRINTK |
| 95 | format += 3; /* skip the printk level-prefix */ | 80 | vaf.fmt = format; |
| 81 | vaf.va = &args; | ||
| 82 | if (format[0] == '<' && format[2] == '>') { | ||
| 83 | memcpy(verbose_fmt, format, 3); | ||
| 84 | vaf.fmt = format + 3; | ||
| 85 | } else if (level) | ||
| 86 | memcpy(verbose_fmt, KERN_DEBUG, 3); | ||
| 87 | printk(verbose_fmt, sanity_file_name(path), line, &vaf); | ||
| 88 | #else | ||
| 96 | vprintk(format, args); | 89 | vprintk(format, args); |
| 90 | #endif | ||
| 97 | va_end(args); | 91 | va_end(args); |
| 98 | } | 92 | } |
| 99 | EXPORT_SYMBOL_GPL(__snd_printk); | 93 | EXPORT_SYMBOL_GPL(__snd_printk); |
diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index 3e6b9a8539c2..694b9daf691f 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c | |||
| @@ -3102,6 +3102,7 @@ static const struct snd_pci_quirk cxt5066_cfg_tbl[] = { | |||
| 3102 | SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo G560", CXT5066_ASUS), | 3102 | SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo G560", CXT5066_ASUS), |
| 3103 | SND_PCI_QUIRK(0x17aa, 0x3938, "Lenovo G565", CXT5066_AUTO), | 3103 | SND_PCI_QUIRK(0x17aa, 0x3938, "Lenovo G565", CXT5066_AUTO), |
| 3104 | SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo", CXT5066_IDEAPAD), /* Fallback for Lenovos without dock mic */ | 3104 | SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo", CXT5066_IDEAPAD), /* Fallback for Lenovos without dock mic */ |
| 3105 | SND_PCI_QUIRK(0x1b0a, 0x2092, "CyberpowerPC Gamer Xplorer N57001", CXT5066_AUTO), | ||
| 3105 | {} | 3106 | {} |
| 3106 | }; | 3107 | }; |
| 3107 | 3108 | ||
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 7a4e10002f56..43fcfbd32847 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -1141,6 +1141,13 @@ static void update_speakers(struct hda_codec *codec) | |||
| 1141 | struct alc_spec *spec = codec->spec; | 1141 | struct alc_spec *spec = codec->spec; |
| 1142 | int on; | 1142 | int on; |
| 1143 | 1143 | ||
| 1144 | /* Control HP pins/amps depending on master_mute state; | ||
| 1145 | * in general, HP pins/amps control should be enabled in all cases, | ||
| 1146 | * but currently set only for master_mute, just to be safe | ||
| 1147 | */ | ||
| 1148 | do_automute(codec, ARRAY_SIZE(spec->autocfg.hp_pins), | ||
| 1149 | spec->autocfg.hp_pins, spec->master_mute, true); | ||
| 1150 | |||
| 1144 | if (!spec->automute) | 1151 | if (!spec->automute) |
| 1145 | on = 0; | 1152 | on = 0; |
| 1146 | else | 1153 | else |
| @@ -6201,11 +6208,6 @@ static const struct snd_kcontrol_new alc260_input_mixer[] = { | |||
| 6201 | /* update HP, line and mono out pins according to the master switch */ | 6208 | /* update HP, line and mono out pins according to the master switch */ |
| 6202 | static void alc260_hp_master_update(struct hda_codec *codec) | 6209 | static void alc260_hp_master_update(struct hda_codec *codec) |
| 6203 | { | 6210 | { |
| 6204 | struct alc_spec *spec = codec->spec; | ||
| 6205 | |||
| 6206 | /* change HP pins */ | ||
| 6207 | do_automute(codec, ARRAY_SIZE(spec->autocfg.hp_pins), | ||
| 6208 | spec->autocfg.hp_pins, spec->master_mute, true); | ||
| 6209 | update_speakers(codec); | 6211 | update_speakers(codec); |
| 6210 | } | 6212 | } |
| 6211 | 6213 | ||
| @@ -11924,7 +11926,7 @@ static const struct hda_verb alc262_nec_verbs[] = { | |||
| 11924 | * 0x1b = port replicator headphone out | 11926 | * 0x1b = port replicator headphone out |
| 11925 | */ | 11927 | */ |
| 11926 | 11928 | ||
| 11927 | #define ALC_HP_EVENT 0x37 | 11929 | #define ALC_HP_EVENT ALC880_HP_EVENT |
| 11928 | 11930 | ||
| 11929 | static const struct hda_verb alc262_fujitsu_unsol_verbs[] = { | 11931 | static const struct hda_verb alc262_fujitsu_unsol_verbs[] = { |
| 11930 | {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT}, | 11932 | {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT}, |
| @@ -13860,6 +13862,7 @@ static const struct snd_pci_quirk alc268_cfg_tbl[] = { | |||
| 13860 | SND_PCI_QUIRK(0x1025, 0x015b, "Acer Aspire One", | 13862 | SND_PCI_QUIRK(0x1025, 0x015b, "Acer Aspire One", |
| 13861 | ALC268_ACER_ASPIRE_ONE), | 13863 | ALC268_ACER_ASPIRE_ONE), |
| 13862 | SND_PCI_QUIRK(0x1028, 0x0253, "Dell OEM", ALC268_DELL), | 13864 | SND_PCI_QUIRK(0x1028, 0x0253, "Dell OEM", ALC268_DELL), |
| 13865 | SND_PCI_QUIRK(0x1028, 0x02b0, "Dell Inspiron 910", ALC268_AUTO), | ||
| 13863 | SND_PCI_QUIRK_MASK(0x1028, 0xfff0, 0x02b0, | 13866 | SND_PCI_QUIRK_MASK(0x1028, 0xfff0, 0x02b0, |
| 13864 | "Dell Inspiron Mini9/Vostro A90", ALC268_DELL), | 13867 | "Dell Inspiron Mini9/Vostro A90", ALC268_DELL), |
| 13865 | /* almost compatible with toshiba but with optional digital outs; | 13868 | /* almost compatible with toshiba but with optional digital outs; |
diff --git a/sound/soc/atmel/atmel_ssc_dai.c b/sound/soc/atmel/atmel_ssc_dai.c index 7fbfa051f6e1..eda955b15834 100644 --- a/sound/soc/atmel/atmel_ssc_dai.c +++ b/sound/soc/atmel/atmel_ssc_dai.c | |||
| @@ -848,9 +848,10 @@ int atmel_ssc_set_audio(int ssc_id) | |||
| 848 | if (IS_ERR(ssc)) | 848 | if (IS_ERR(ssc)) |
| 849 | pr_warn("Unable to parent ASoC SSC DAI on SSC: %ld\n", | 849 | pr_warn("Unable to parent ASoC SSC DAI on SSC: %ld\n", |
| 850 | PTR_ERR(ssc)); | 850 | PTR_ERR(ssc)); |
| 851 | else | 851 | else { |
| 852 | ssc_pdev->dev.parent = &(ssc->pdev->dev); | 852 | ssc_pdev->dev.parent = &(ssc->pdev->dev); |
| 853 | ssc_free(ssc); | 853 | ssc_free(ssc); |
| 854 | } | ||
| 854 | 855 | ||
| 855 | ret = platform_device_add(ssc_pdev); | 856 | ret = platform_device_add(ssc_pdev); |
| 856 | if (ret < 0) | 857 | if (ret < 0) |
diff --git a/sound/soc/blackfin/bf5xx-ad1836.c b/sound/soc/blackfin/bf5xx-ad1836.c index ea4951cf5526..f79d1655e035 100644 --- a/sound/soc/blackfin/bf5xx-ad1836.c +++ b/sound/soc/blackfin/bf5xx-ad1836.c | |||
| @@ -75,7 +75,7 @@ static struct snd_soc_dai_link bf5xx_ad1836_dai[] = { | |||
| 75 | .cpu_dai_name = "bfin-tdm.0", | 75 | .cpu_dai_name = "bfin-tdm.0", |
| 76 | .codec_dai_name = "ad1836-hifi", | 76 | .codec_dai_name = "ad1836-hifi", |
| 77 | .platform_name = "bfin-tdm-pcm-audio", | 77 | .platform_name = "bfin-tdm-pcm-audio", |
| 78 | .codec_name = "ad1836.0", | 78 | .codec_name = "spi0.4", |
| 79 | .ops = &bf5xx_ad1836_ops, | 79 | .ops = &bf5xx_ad1836_ops, |
| 80 | }, | 80 | }, |
| 81 | { | 81 | { |
| @@ -84,7 +84,7 @@ static struct snd_soc_dai_link bf5xx_ad1836_dai[] = { | |||
| 84 | .cpu_dai_name = "bfin-tdm.1", | 84 | .cpu_dai_name = "bfin-tdm.1", |
| 85 | .codec_dai_name = "ad1836-hifi", | 85 | .codec_dai_name = "ad1836-hifi", |
| 86 | .platform_name = "bfin-tdm-pcm-audio", | 86 | .platform_name = "bfin-tdm-pcm-audio", |
| 87 | .codec_name = "ad1836.0", | 87 | .codec_name = "spi0.4", |
| 88 | .ops = &bf5xx_ad1836_ops, | 88 | .ops = &bf5xx_ad1836_ops, |
| 89 | }, | 89 | }, |
| 90 | }; | 90 | }; |
diff --git a/sound/soc/codecs/ad1836.c b/sound/soc/codecs/ad1836.c index ab63d52e36e1..754c496412bd 100644 --- a/sound/soc/codecs/ad1836.c +++ b/sound/soc/codecs/ad1836.c | |||
| @@ -145,22 +145,22 @@ static int ad1836_hw_params(struct snd_pcm_substream *substream, | |||
| 145 | /* bit size */ | 145 | /* bit size */ |
| 146 | switch (params_format(params)) { | 146 | switch (params_format(params)) { |
| 147 | case SNDRV_PCM_FORMAT_S16_LE: | 147 | case SNDRV_PCM_FORMAT_S16_LE: |
| 148 | word_len = 3; | 148 | word_len = AD1836_WORD_LEN_16; |
| 149 | break; | 149 | break; |
| 150 | case SNDRV_PCM_FORMAT_S20_3LE: | 150 | case SNDRV_PCM_FORMAT_S20_3LE: |
| 151 | word_len = 1; | 151 | word_len = AD1836_WORD_LEN_20; |
| 152 | break; | 152 | break; |
| 153 | case SNDRV_PCM_FORMAT_S24_LE: | 153 | case SNDRV_PCM_FORMAT_S24_LE: |
| 154 | case SNDRV_PCM_FORMAT_S32_LE: | 154 | case SNDRV_PCM_FORMAT_S32_LE: |
| 155 | word_len = 0; | 155 | word_len = AD1836_WORD_LEN_24; |
| 156 | break; | 156 | break; |
| 157 | } | 157 | } |
| 158 | 158 | ||
| 159 | snd_soc_update_bits(codec, AD1836_DAC_CTRL1, | 159 | snd_soc_update_bits(codec, AD1836_DAC_CTRL1, AD1836_DAC_WORD_LEN_MASK, |
| 160 | AD1836_DAC_WORD_LEN_MASK, word_len); | 160 | word_len << AD1836_DAC_WORD_LEN_OFFSET); |
| 161 | 161 | ||
| 162 | snd_soc_update_bits(codec, AD1836_ADC_CTRL2, | 162 | snd_soc_update_bits(codec, AD1836_ADC_CTRL2, AD1836_ADC_WORD_LEN_MASK, |
| 163 | AD1836_ADC_WORD_LEN_MASK, word_len); | 163 | word_len << AD1836_ADC_WORD_OFFSET); |
| 164 | 164 | ||
| 165 | return 0; | 165 | return 0; |
| 166 | } | 166 | } |
diff --git a/sound/soc/codecs/ad1836.h b/sound/soc/codecs/ad1836.h index 845596717fdf..9d6a3f8f8aaf 100644 --- a/sound/soc/codecs/ad1836.h +++ b/sound/soc/codecs/ad1836.h | |||
| @@ -25,6 +25,7 @@ | |||
| 25 | #define AD1836_DAC_SERFMT_PCK256 (0x4 << 5) | 25 | #define AD1836_DAC_SERFMT_PCK256 (0x4 << 5) |
| 26 | #define AD1836_DAC_SERFMT_PCK128 (0x5 << 5) | 26 | #define AD1836_DAC_SERFMT_PCK128 (0x5 << 5) |
| 27 | #define AD1836_DAC_WORD_LEN_MASK 0x18 | 27 | #define AD1836_DAC_WORD_LEN_MASK 0x18 |
| 28 | #define AD1836_DAC_WORD_LEN_OFFSET 3 | ||
| 28 | 29 | ||
| 29 | #define AD1836_DAC_CTRL2 1 | 30 | #define AD1836_DAC_CTRL2 1 |
| 30 | #define AD1836_DACL1_MUTE 0 | 31 | #define AD1836_DACL1_MUTE 0 |
| @@ -51,6 +52,7 @@ | |||
| 51 | #define AD1836_ADCL2_MUTE 2 | 52 | #define AD1836_ADCL2_MUTE 2 |
| 52 | #define AD1836_ADCR2_MUTE 3 | 53 | #define AD1836_ADCR2_MUTE 3 |
| 53 | #define AD1836_ADC_WORD_LEN_MASK 0x30 | 54 | #define AD1836_ADC_WORD_LEN_MASK 0x30 |
| 55 | #define AD1836_ADC_WORD_OFFSET 5 | ||
| 54 | #define AD1836_ADC_SERFMT_MASK (7 << 6) | 56 | #define AD1836_ADC_SERFMT_MASK (7 << 6) |
| 55 | #define AD1836_ADC_SERFMT_PCK256 (0x4 << 6) | 57 | #define AD1836_ADC_SERFMT_PCK256 (0x4 << 6) |
| 56 | #define AD1836_ADC_SERFMT_PCK128 (0x5 << 6) | 58 | #define AD1836_ADC_SERFMT_PCK128 (0x5 << 6) |
| @@ -60,4 +62,8 @@ | |||
| 60 | 62 | ||
| 61 | #define AD1836_NUM_REGS 16 | 63 | #define AD1836_NUM_REGS 16 |
| 62 | 64 | ||
| 65 | #define AD1836_WORD_LEN_24 0x0 | ||
| 66 | #define AD1836_WORD_LEN_20 0x1 | ||
| 67 | #define AD1836_WORD_LEN_16 0x2 | ||
| 68 | |||
| 63 | #endif | 69 | #endif |
diff --git a/sound/soc/codecs/wm8804.c b/sound/soc/codecs/wm8804.c index 6785688f8806..9a5e67c5a6bd 100644 --- a/sound/soc/codecs/wm8804.c +++ b/sound/soc/codecs/wm8804.c | |||
| @@ -680,20 +680,25 @@ static struct snd_soc_dai_ops wm8804_dai_ops = { | |||
| 680 | #define WM8804_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \ | 680 | #define WM8804_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \ |
| 681 | SNDRV_PCM_FMTBIT_S24_LE) | 681 | SNDRV_PCM_FMTBIT_S24_LE) |
| 682 | 682 | ||
| 683 | #define WM8804_RATES (SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \ | ||
| 684 | SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_64000 | \ | ||
| 685 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 | \ | ||
| 686 | SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_192000) | ||
| 687 | |||
| 683 | static struct snd_soc_dai_driver wm8804_dai = { | 688 | static struct snd_soc_dai_driver wm8804_dai = { |
| 684 | .name = "wm8804-spdif", | 689 | .name = "wm8804-spdif", |
| 685 | .playback = { | 690 | .playback = { |
| 686 | .stream_name = "Playback", | 691 | .stream_name = "Playback", |
| 687 | .channels_min = 2, | 692 | .channels_min = 2, |
| 688 | .channels_max = 2, | 693 | .channels_max = 2, |
| 689 | .rates = SNDRV_PCM_RATE_8000_192000, | 694 | .rates = WM8804_RATES, |
| 690 | .formats = WM8804_FORMATS, | 695 | .formats = WM8804_FORMATS, |
| 691 | }, | 696 | }, |
| 692 | .capture = { | 697 | .capture = { |
| 693 | .stream_name = "Capture", | 698 | .stream_name = "Capture", |
| 694 | .channels_min = 2, | 699 | .channels_min = 2, |
| 695 | .channels_max = 2, | 700 | .channels_max = 2, |
| 696 | .rates = SNDRV_PCM_RATE_8000_192000, | 701 | .rates = WM8804_RATES, |
| 697 | .formats = WM8804_FORMATS, | 702 | .formats = WM8804_FORMATS, |
| 698 | }, | 703 | }, |
| 699 | .ops = &wm8804_dai_ops, | 704 | .ops = &wm8804_dai_ops, |
diff --git a/sound/soc/codecs/wm8915.c b/sound/soc/codecs/wm8915.c index a0b1a7278284..e2ab4fac2819 100644 --- a/sound/soc/codecs/wm8915.c +++ b/sound/soc/codecs/wm8915.c | |||
| @@ -1839,7 +1839,7 @@ static int wm8915_set_sysclk(struct snd_soc_dai *dai, | |||
| 1839 | int old; | 1839 | int old; |
| 1840 | 1840 | ||
| 1841 | /* Disable SYSCLK while we reconfigure */ | 1841 | /* Disable SYSCLK while we reconfigure */ |
| 1842 | old = snd_soc_read(codec, WM8915_AIF_CLOCKING_1); | 1842 | old = snd_soc_read(codec, WM8915_AIF_CLOCKING_1) & WM8915_SYSCLK_ENA; |
| 1843 | snd_soc_update_bits(codec, WM8915_AIF_CLOCKING_1, | 1843 | snd_soc_update_bits(codec, WM8915_AIF_CLOCKING_1, |
| 1844 | WM8915_SYSCLK_ENA, 0); | 1844 | WM8915_SYSCLK_ENA, 0); |
| 1845 | 1845 | ||
| @@ -2038,6 +2038,7 @@ static int wm8915_set_fll(struct snd_soc_codec *codec, int fll_id, int source, | |||
| 2038 | break; | 2038 | break; |
| 2039 | case WM8915_FLL_MCLK2: | 2039 | case WM8915_FLL_MCLK2: |
| 2040 | reg = 1; | 2040 | reg = 1; |
| 2041 | break; | ||
| 2041 | case WM8915_FLL_DACLRCLK1: | 2042 | case WM8915_FLL_DACLRCLK1: |
| 2042 | reg = 2; | 2043 | reg = 2; |
| 2043 | break; | 2044 | break; |
diff --git a/sound/soc/codecs/wm8962.c b/sound/soc/codecs/wm8962.c index f90ae427242b..5e05eed96c38 100644 --- a/sound/soc/codecs/wm8962.c +++ b/sound/soc/codecs/wm8962.c | |||
| @@ -1999,12 +1999,12 @@ static int wm8962_put_hp_sw(struct snd_kcontrol *kcontrol, | |||
| 1999 | return 0; | 1999 | return 0; |
| 2000 | 2000 | ||
| 2001 | /* If the left PGA is enabled hit that VU bit... */ | 2001 | /* If the left PGA is enabled hit that VU bit... */ |
| 2002 | if (reg_cache[WM8962_PWR_MGMT_2] & WM8962_HPOUTL_PGA_ENA) | 2002 | if (snd_soc_read(codec, WM8962_PWR_MGMT_2) & WM8962_HPOUTL_PGA_ENA) |
| 2003 | return snd_soc_write(codec, WM8962_HPOUTL_VOLUME, | 2003 | return snd_soc_write(codec, WM8962_HPOUTL_VOLUME, |
| 2004 | reg_cache[WM8962_HPOUTL_VOLUME]); | 2004 | reg_cache[WM8962_HPOUTL_VOLUME]); |
| 2005 | 2005 | ||
| 2006 | /* ...otherwise the right. The VU is stereo. */ | 2006 | /* ...otherwise the right. The VU is stereo. */ |
| 2007 | if (reg_cache[WM8962_PWR_MGMT_2] & WM8962_HPOUTR_PGA_ENA) | 2007 | if (snd_soc_read(codec, WM8962_PWR_MGMT_2) & WM8962_HPOUTR_PGA_ENA) |
| 2008 | return snd_soc_write(codec, WM8962_HPOUTR_VOLUME, | 2008 | return snd_soc_write(codec, WM8962_HPOUTR_VOLUME, |
| 2009 | reg_cache[WM8962_HPOUTR_VOLUME]); | 2009 | reg_cache[WM8962_HPOUTR_VOLUME]); |
| 2010 | 2010 | ||
diff --git a/sound/soc/fsl/fsl_dma.c b/sound/soc/fsl/fsl_dma.c index 15dac0f20cd8..6680c0b4d203 100644 --- a/sound/soc/fsl/fsl_dma.c +++ b/sound/soc/fsl/fsl_dma.c | |||
| @@ -310,7 +310,7 @@ static int fsl_dma_new(struct snd_card *card, struct snd_soc_dai *dai, | |||
| 310 | * should allocate a DMA buffer only for the streams that are valid. | 310 | * should allocate a DMA buffer only for the streams that are valid. |
| 311 | */ | 311 | */ |
| 312 | 312 | ||
| 313 | if (dai->driver->playback.channels_min) { | 313 | if (pcm->streams[0].substream) { |
| 314 | ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, card->dev, | 314 | ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, card->dev, |
| 315 | fsl_dma_hardware.buffer_bytes_max, | 315 | fsl_dma_hardware.buffer_bytes_max, |
| 316 | &pcm->streams[0].substream->dma_buffer); | 316 | &pcm->streams[0].substream->dma_buffer); |
| @@ -320,13 +320,13 @@ static int fsl_dma_new(struct snd_card *card, struct snd_soc_dai *dai, | |||
| 320 | } | 320 | } |
| 321 | } | 321 | } |
| 322 | 322 | ||
| 323 | if (dai->driver->capture.channels_min) { | 323 | if (pcm->streams[1].substream) { |
| 324 | ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, card->dev, | 324 | ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, card->dev, |
| 325 | fsl_dma_hardware.buffer_bytes_max, | 325 | fsl_dma_hardware.buffer_bytes_max, |
| 326 | &pcm->streams[1].substream->dma_buffer); | 326 | &pcm->streams[1].substream->dma_buffer); |
| 327 | if (ret) { | 327 | if (ret) { |
| 328 | snd_dma_free_pages(&pcm->streams[0].substream->dma_buffer); | ||
| 329 | dev_err(card->dev, "can't alloc capture dma buffer\n"); | 328 | dev_err(card->dev, "can't alloc capture dma buffer\n"); |
| 329 | snd_dma_free_pages(&pcm->streams[0].substream->dma_buffer); | ||
| 330 | return ret; | 330 | return ret; |
| 331 | } | 331 | } |
| 332 | } | 332 | } |
| @@ -449,7 +449,8 @@ static int fsl_dma_open(struct snd_pcm_substream *substream) | |||
| 449 | dma_private->ld_buf_phys = ld_buf_phys; | 449 | dma_private->ld_buf_phys = ld_buf_phys; |
| 450 | dma_private->dma_buf_phys = substream->dma_buffer.addr; | 450 | dma_private->dma_buf_phys = substream->dma_buffer.addr; |
| 451 | 451 | ||
| 452 | ret = request_irq(dma_private->irq, fsl_dma_isr, 0, "DMA", dma_private); | 452 | ret = request_irq(dma_private->irq, fsl_dma_isr, 0, "fsldma-audio", |
| 453 | dma_private); | ||
| 453 | if (ret) { | 454 | if (ret) { |
| 454 | dev_err(dev, "can't register ISR for IRQ %u (ret=%i)\n", | 455 | dev_err(dev, "can't register ISR for IRQ %u (ret=%i)\n", |
| 455 | dma_private->irq, ret); | 456 | dma_private->irq, ret); |
diff --git a/sound/soc/samsung/i2s.c b/sound/soc/samsung/i2s.c index ffa09b3b2caa..992a732b5211 100644 --- a/sound/soc/samsung/i2s.c +++ b/sound/soc/samsung/i2s.c | |||
| @@ -191,7 +191,7 @@ static inline bool tx_active(struct i2s_dai *i2s) | |||
| 191 | if (!i2s) | 191 | if (!i2s) |
| 192 | return false; | 192 | return false; |
| 193 | 193 | ||
| 194 | active = readl(i2s->addr + I2SMOD); | 194 | active = readl(i2s->addr + I2SCON); |
| 195 | 195 | ||
| 196 | if (is_secondary(i2s)) | 196 | if (is_secondary(i2s)) |
| 197 | active &= CON_TXSDMA_ACTIVE; | 197 | active &= CON_TXSDMA_ACTIVE; |
| @@ -223,7 +223,7 @@ static inline bool rx_active(struct i2s_dai *i2s) | |||
| 223 | if (!i2s) | 223 | if (!i2s) |
| 224 | return false; | 224 | return false; |
| 225 | 225 | ||
| 226 | active = readl(i2s->addr + I2SMOD) & CON_RXDMA_ACTIVE; | 226 | active = readl(i2s->addr + I2SCON) & CON_RXDMA_ACTIVE; |
| 227 | 227 | ||
| 228 | return active ? true : false; | 228 | return active ? true : false; |
| 229 | } | 229 | } |
diff --git a/sound/soc/soc-cache.c b/sound/soc/soc-cache.c index 06b7b81a1601..c005ceb70c9d 100644 --- a/sound/soc/soc-cache.c +++ b/sound/soc/soc-cache.c | |||
| @@ -466,6 +466,9 @@ static bool snd_soc_set_cache_val(void *base, unsigned int idx, | |||
| 466 | static unsigned int snd_soc_get_cache_val(const void *base, unsigned int idx, | 466 | static unsigned int snd_soc_get_cache_val(const void *base, unsigned int idx, |
| 467 | unsigned int word_size) | 467 | unsigned int word_size) |
| 468 | { | 468 | { |
| 469 | if (!base) | ||
| 470 | return -1; | ||
| 471 | |||
| 469 | switch (word_size) { | 472 | switch (word_size) { |
| 470 | case 1: { | 473 | case 1: { |
| 471 | const u8 *cache = base; | 474 | const u8 *cache = base; |
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c index 776e6f418306..32ab7fc4579a 100644 --- a/sound/soc/soc-dapm.c +++ b/sound/soc/soc-dapm.c | |||
| @@ -350,9 +350,9 @@ static int dapm_is_shared_kcontrol(struct snd_soc_dapm_context *dapm, | |||
| 350 | } | 350 | } |
| 351 | 351 | ||
| 352 | /* create new dapm mixer control */ | 352 | /* create new dapm mixer control */ |
| 353 | static int dapm_new_mixer(struct snd_soc_dapm_context *dapm, | 353 | static int dapm_new_mixer(struct snd_soc_dapm_widget *w) |
| 354 | struct snd_soc_dapm_widget *w) | ||
| 355 | { | 354 | { |
| 355 | struct snd_soc_dapm_context *dapm = w->dapm; | ||
| 356 | int i, ret = 0; | 356 | int i, ret = 0; |
| 357 | size_t name_len, prefix_len; | 357 | size_t name_len, prefix_len; |
| 358 | struct snd_soc_dapm_path *path; | 358 | struct snd_soc_dapm_path *path; |
| @@ -450,9 +450,9 @@ static int dapm_new_mixer(struct snd_soc_dapm_context *dapm, | |||
| 450 | } | 450 | } |
| 451 | 451 | ||
| 452 | /* create new dapm mux control */ | 452 | /* create new dapm mux control */ |
| 453 | static int dapm_new_mux(struct snd_soc_dapm_context *dapm, | 453 | static int dapm_new_mux(struct snd_soc_dapm_widget *w) |
| 454 | struct snd_soc_dapm_widget *w) | ||
| 455 | { | 454 | { |
| 455 | struct snd_soc_dapm_context *dapm = w->dapm; | ||
| 456 | struct snd_soc_dapm_path *path = NULL; | 456 | struct snd_soc_dapm_path *path = NULL; |
| 457 | struct snd_kcontrol *kcontrol; | 457 | struct snd_kcontrol *kcontrol; |
| 458 | struct snd_card *card = dapm->card->snd_card; | 458 | struct snd_card *card = dapm->card->snd_card; |
| @@ -535,8 +535,7 @@ static int dapm_new_mux(struct snd_soc_dapm_context *dapm, | |||
| 535 | } | 535 | } |
| 536 | 536 | ||
| 537 | /* create new dapm volume control */ | 537 | /* create new dapm volume control */ |
| 538 | static int dapm_new_pga(struct snd_soc_dapm_context *dapm, | 538 | static int dapm_new_pga(struct snd_soc_dapm_widget *w) |
| 539 | struct snd_soc_dapm_widget *w) | ||
| 540 | { | 539 | { |
| 541 | if (w->num_kcontrols) | 540 | if (w->num_kcontrols) |
| 542 | dev_err(w->dapm->dev, | 541 | dev_err(w->dapm->dev, |
| @@ -1826,13 +1825,13 @@ int snd_soc_dapm_new_widgets(struct snd_soc_dapm_context *dapm) | |||
| 1826 | case snd_soc_dapm_mixer: | 1825 | case snd_soc_dapm_mixer: |
| 1827 | case snd_soc_dapm_mixer_named_ctl: | 1826 | case snd_soc_dapm_mixer_named_ctl: |
| 1828 | w->power_check = dapm_generic_check_power; | 1827 | w->power_check = dapm_generic_check_power; |
| 1829 | dapm_new_mixer(dapm, w); | 1828 | dapm_new_mixer(w); |
| 1830 | break; | 1829 | break; |
| 1831 | case snd_soc_dapm_mux: | 1830 | case snd_soc_dapm_mux: |
| 1832 | case snd_soc_dapm_virt_mux: | 1831 | case snd_soc_dapm_virt_mux: |
| 1833 | case snd_soc_dapm_value_mux: | 1832 | case snd_soc_dapm_value_mux: |
| 1834 | w->power_check = dapm_generic_check_power; | 1833 | w->power_check = dapm_generic_check_power; |
| 1835 | dapm_new_mux(dapm, w); | 1834 | dapm_new_mux(w); |
| 1836 | break; | 1835 | break; |
| 1837 | case snd_soc_dapm_adc: | 1836 | case snd_soc_dapm_adc: |
| 1838 | case snd_soc_dapm_aif_out: | 1837 | case snd_soc_dapm_aif_out: |
| @@ -1845,7 +1844,7 @@ int snd_soc_dapm_new_widgets(struct snd_soc_dapm_context *dapm) | |||
| 1845 | case snd_soc_dapm_pga: | 1844 | case snd_soc_dapm_pga: |
| 1846 | case snd_soc_dapm_out_drv: | 1845 | case snd_soc_dapm_out_drv: |
| 1847 | w->power_check = dapm_generic_check_power; | 1846 | w->power_check = dapm_generic_check_power; |
| 1848 | dapm_new_pga(dapm, w); | 1847 | dapm_new_pga(w); |
| 1849 | break; | 1848 | break; |
| 1850 | case snd_soc_dapm_input: | 1849 | case snd_soc_dapm_input: |
| 1851 | case snd_soc_dapm_output: | 1850 | case snd_soc_dapm_output: |
diff --git a/tools/perf/builtin-test.c b/tools/perf/builtin-test.c index b67186228c89..2da9162262b0 100644 --- a/tools/perf/builtin-test.c +++ b/tools/perf/builtin-test.c | |||
| @@ -474,7 +474,7 @@ static int test__basic_mmap(void) | |||
| 474 | unsigned int nr_events[nsyscalls], | 474 | unsigned int nr_events[nsyscalls], |
| 475 | expected_nr_events[nsyscalls], i, j; | 475 | expected_nr_events[nsyscalls], i, j; |
| 476 | struct perf_evsel *evsels[nsyscalls], *evsel; | 476 | struct perf_evsel *evsels[nsyscalls], *evsel; |
| 477 | int sample_size = perf_sample_size(attr.sample_type); | 477 | int sample_size = __perf_evsel__sample_size(attr.sample_type); |
| 478 | 478 | ||
| 479 | for (i = 0; i < nsyscalls; ++i) { | 479 | for (i = 0; i < nsyscalls; ++i) { |
| 480 | char name[64]; | 480 | char name[64]; |
diff --git a/tools/perf/util/PERF-VERSION-GEN b/tools/perf/util/PERF-VERSION-GEN index 26d4d3fd6deb..9c5fb4d93824 100755 --- a/tools/perf/util/PERF-VERSION-GEN +++ b/tools/perf/util/PERF-VERSION-GEN | |||
| @@ -23,12 +23,7 @@ if test -d ../../.git -o -f ../../.git && | |||
| 23 | then | 23 | then |
| 24 | VN=$(echo "$VN" | sed -e 's/-/./g'); | 24 | VN=$(echo "$VN" | sed -e 's/-/./g'); |
| 25 | else | 25 | else |
| 26 | eval $(grep '^VERSION[[:space:]]*=' ../../Makefile|tr -d ' ') | 26 | VN=$(make -sC ../.. kernelversion) |
| 27 | eval $(grep '^PATCHLEVEL[[:space:]]*=' ../../Makefile|tr -d ' ') | ||
| 28 | eval $(grep '^SUBLEVEL[[:space:]]*=' ../../Makefile|tr -d ' ') | ||
| 29 | eval $(grep '^EXTRAVERSION[[:space:]]*=' ../../Makefile|tr -d ' ') | ||
| 30 | |||
| 31 | VN="${VERSION}.${PATCHLEVEL}.${SUBLEVEL}${EXTRAVERSION}" | ||
| 32 | fi | 27 | fi |
| 33 | 28 | ||
| 34 | VN=$(expr "$VN" : v*'\(.*\)') | 29 | VN=$(expr "$VN" : v*'\(.*\)') |
diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c index 0fe9adf76379..3c1b8a632101 100644 --- a/tools/perf/util/event.c +++ b/tools/perf/util/event.c | |||
| @@ -35,22 +35,6 @@ const char *perf_event__name(unsigned int id) | |||
| 35 | return perf_event__names[id]; | 35 | return perf_event__names[id]; |
| 36 | } | 36 | } |
| 37 | 37 | ||
| 38 | int perf_sample_size(u64 sample_type) | ||
| 39 | { | ||
| 40 | u64 mask = sample_type & PERF_SAMPLE_MASK; | ||
| 41 | int size = 0; | ||
| 42 | int i; | ||
| 43 | |||
| 44 | for (i = 0; i < 64; i++) { | ||
| 45 | if (mask & (1ULL << i)) | ||
| 46 | size++; | ||
| 47 | } | ||
| 48 | |||
| 49 | size *= sizeof(u64); | ||
| 50 | |||
| 51 | return size; | ||
| 52 | } | ||
| 53 | |||
| 54 | static struct perf_sample synth_sample = { | 38 | static struct perf_sample synth_sample = { |
| 55 | .pid = -1, | 39 | .pid = -1, |
| 56 | .tid = -1, | 40 | .tid = -1, |
diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h index c08332871408..1d7f66488a88 100644 --- a/tools/perf/util/event.h +++ b/tools/perf/util/event.h | |||
| @@ -82,8 +82,6 @@ struct perf_sample { | |||
| 82 | struct ip_callchain *callchain; | 82 | struct ip_callchain *callchain; |
| 83 | }; | 83 | }; |
| 84 | 84 | ||
| 85 | int perf_sample_size(u64 sample_type); | ||
| 86 | |||
| 87 | #define BUILD_ID_SIZE 20 | 85 | #define BUILD_ID_SIZE 20 |
| 88 | 86 | ||
| 89 | struct build_id_event { | 87 | struct build_id_event { |
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index 50aa34879c33..b021ea9265c3 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c | |||
| @@ -12,7 +12,6 @@ | |||
| 12 | #include "evlist.h" | 12 | #include "evlist.h" |
| 13 | #include "evsel.h" | 13 | #include "evsel.h" |
| 14 | #include "util.h" | 14 | #include "util.h" |
| 15 | #include "debug.h" | ||
| 16 | 15 | ||
| 17 | #include <sys/mman.h> | 16 | #include <sys/mman.h> |
| 18 | 17 | ||
| @@ -257,19 +256,15 @@ int perf_evlist__alloc_mmap(struct perf_evlist *evlist) | |||
| 257 | return evlist->mmap != NULL ? 0 : -ENOMEM; | 256 | return evlist->mmap != NULL ? 0 : -ENOMEM; |
| 258 | } | 257 | } |
| 259 | 258 | ||
| 260 | static int __perf_evlist__mmap(struct perf_evlist *evlist, struct perf_evsel *evsel, | 259 | static int __perf_evlist__mmap(struct perf_evlist *evlist, |
| 261 | int idx, int prot, int mask, int fd) | 260 | int idx, int prot, int mask, int fd) |
| 262 | { | 261 | { |
| 263 | evlist->mmap[idx].prev = 0; | 262 | evlist->mmap[idx].prev = 0; |
| 264 | evlist->mmap[idx].mask = mask; | 263 | evlist->mmap[idx].mask = mask; |
| 265 | evlist->mmap[idx].base = mmap(NULL, evlist->mmap_len, prot, | 264 | evlist->mmap[idx].base = mmap(NULL, evlist->mmap_len, prot, |
| 266 | MAP_SHARED, fd, 0); | 265 | MAP_SHARED, fd, 0); |
| 267 | if (evlist->mmap[idx].base == MAP_FAILED) { | 266 | if (evlist->mmap[idx].base == MAP_FAILED) |
| 268 | if (evlist->cpus->map[idx] == -1 && evsel->attr.inherit) | ||
| 269 | ui__warning("Inherit is not allowed on per-task " | ||
| 270 | "events using mmap.\n"); | ||
| 271 | return -1; | 267 | return -1; |
| 272 | } | ||
| 273 | 268 | ||
| 274 | perf_evlist__add_pollfd(evlist, fd); | 269 | perf_evlist__add_pollfd(evlist, fd); |
| 275 | return 0; | 270 | return 0; |
| @@ -289,7 +284,7 @@ static int perf_evlist__mmap_per_cpu(struct perf_evlist *evlist, int prot, int m | |||
| 289 | 284 | ||
| 290 | if (output == -1) { | 285 | if (output == -1) { |
| 291 | output = fd; | 286 | output = fd; |
| 292 | if (__perf_evlist__mmap(evlist, evsel, cpu, | 287 | if (__perf_evlist__mmap(evlist, cpu, |
| 293 | prot, mask, output) < 0) | 288 | prot, mask, output) < 0) |
| 294 | goto out_unmap; | 289 | goto out_unmap; |
| 295 | } else { | 290 | } else { |
| @@ -329,7 +324,7 @@ static int perf_evlist__mmap_per_thread(struct perf_evlist *evlist, int prot, in | |||
| 329 | 324 | ||
| 330 | if (output == -1) { | 325 | if (output == -1) { |
| 331 | output = fd; | 326 | output = fd; |
| 332 | if (__perf_evlist__mmap(evlist, evsel, thread, | 327 | if (__perf_evlist__mmap(evlist, thread, |
| 333 | prot, mask, output) < 0) | 328 | prot, mask, output) < 0) |
| 334 | goto out_unmap; | 329 | goto out_unmap; |
| 335 | } else { | 330 | } else { |
| @@ -460,33 +455,46 @@ int perf_evlist__set_filters(struct perf_evlist *evlist) | |||
| 460 | return 0; | 455 | return 0; |
| 461 | } | 456 | } |
| 462 | 457 | ||
| 463 | u64 perf_evlist__sample_type(struct perf_evlist *evlist) | 458 | bool perf_evlist__valid_sample_type(const struct perf_evlist *evlist) |
| 464 | { | 459 | { |
| 465 | struct perf_evsel *pos; | 460 | struct perf_evsel *pos, *first; |
| 466 | u64 type = 0; | 461 | |
| 467 | 462 | pos = first = list_entry(evlist->entries.next, struct perf_evsel, node); | |
| 468 | list_for_each_entry(pos, &evlist->entries, node) { | 463 | |
| 469 | if (!type) | 464 | list_for_each_entry_continue(pos, &evlist->entries, node) { |
| 470 | type = pos->attr.sample_type; | 465 | if (first->attr.sample_type != pos->attr.sample_type) |
| 471 | else if (type != pos->attr.sample_type) | 466 | return false; |
| 472 | die("non matching sample_type"); | ||
| 473 | } | 467 | } |
| 474 | 468 | ||
| 475 | return type; | 469 | return true; |
| 476 | } | 470 | } |
| 477 | 471 | ||
| 478 | bool perf_evlist__sample_id_all(const struct perf_evlist *evlist) | 472 | u64 perf_evlist__sample_type(const struct perf_evlist *evlist) |
| 473 | { | ||
| 474 | struct perf_evsel *first; | ||
| 475 | |||
| 476 | first = list_entry(evlist->entries.next, struct perf_evsel, node); | ||
| 477 | return first->attr.sample_type; | ||
| 478 | } | ||
| 479 | |||
| 480 | bool perf_evlist__valid_sample_id_all(const struct perf_evlist *evlist) | ||
| 479 | { | 481 | { |
| 480 | bool value = false, first = true; | 482 | struct perf_evsel *pos, *first; |
| 481 | struct perf_evsel *pos; | 483 | |
| 482 | 484 | pos = first = list_entry(evlist->entries.next, struct perf_evsel, node); | |
| 483 | list_for_each_entry(pos, &evlist->entries, node) { | 485 | |
| 484 | if (first) { | 486 | list_for_each_entry_continue(pos, &evlist->entries, node) { |
| 485 | value = pos->attr.sample_id_all; | 487 | if (first->attr.sample_id_all != pos->attr.sample_id_all) |
| 486 | first = false; | 488 | return false; |
| 487 | } else if (value != pos->attr.sample_id_all) | ||
| 488 | die("non matching sample_id_all"); | ||
| 489 | } | 489 | } |
| 490 | 490 | ||
| 491 | return value; | 491 | return true; |
| 492 | } | ||
| 493 | |||
| 494 | bool perf_evlist__sample_id_all(const struct perf_evlist *evlist) | ||
| 495 | { | ||
| 496 | struct perf_evsel *first; | ||
| 497 | |||
| 498 | first = list_entry(evlist->entries.next, struct perf_evsel, node); | ||
| 499 | return first->attr.sample_id_all; | ||
| 492 | } | 500 | } |
diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h index 0a1ef1f051f0..b2b862374f37 100644 --- a/tools/perf/util/evlist.h +++ b/tools/perf/util/evlist.h | |||
| @@ -66,7 +66,9 @@ int perf_evlist__create_maps(struct perf_evlist *evlist, pid_t target_pid, | |||
| 66 | void perf_evlist__delete_maps(struct perf_evlist *evlist); | 66 | void perf_evlist__delete_maps(struct perf_evlist *evlist); |
| 67 | int perf_evlist__set_filters(struct perf_evlist *evlist); | 67 | int perf_evlist__set_filters(struct perf_evlist *evlist); |
| 68 | 68 | ||
| 69 | u64 perf_evlist__sample_type(struct perf_evlist *evlist); | 69 | u64 perf_evlist__sample_type(const struct perf_evlist *evlist); |
| 70 | bool perf_evlist__sample_id_all(const struct perf_evlist *evlist); | 70 | bool perf_evlist__sample_id_all(const const struct perf_evlist *evlist); |
| 71 | 71 | ||
| 72 | bool perf_evlist__valid_sample_type(const struct perf_evlist *evlist); | ||
| 73 | bool perf_evlist__valid_sample_id_all(const struct perf_evlist *evlist); | ||
| 72 | #endif /* __PERF_EVLIST_H */ | 74 | #endif /* __PERF_EVLIST_H */ |
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index cca29ededb5b..0239eb87b232 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c | |||
| @@ -15,6 +15,22 @@ | |||
| 15 | 15 | ||
| 16 | #define FD(e, x, y) (*(int *)xyarray__entry(e->fd, x, y)) | 16 | #define FD(e, x, y) (*(int *)xyarray__entry(e->fd, x, y)) |
| 17 | 17 | ||
| 18 | int __perf_evsel__sample_size(u64 sample_type) | ||
| 19 | { | ||
| 20 | u64 mask = sample_type & PERF_SAMPLE_MASK; | ||
| 21 | int size = 0; | ||
| 22 | int i; | ||
| 23 | |||
| 24 | for (i = 0; i < 64; i++) { | ||
| 25 | if (mask & (1ULL << i)) | ||
| 26 | size++; | ||
| 27 | } | ||
| 28 | |||
| 29 | size *= sizeof(u64); | ||
| 30 | |||
| 31 | return size; | ||
| 32 | } | ||
| 33 | |||
| 18 | void perf_evsel__init(struct perf_evsel *evsel, | 34 | void perf_evsel__init(struct perf_evsel *evsel, |
| 19 | struct perf_event_attr *attr, int idx) | 35 | struct perf_event_attr *attr, int idx) |
| 20 | { | 36 | { |
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index f79bb2c09a6c..7e9366e4490b 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h | |||
| @@ -149,4 +149,11 @@ static inline int perf_evsel__read_scaled(struct perf_evsel *evsel, | |||
| 149 | return __perf_evsel__read(evsel, ncpus, nthreads, true); | 149 | return __perf_evsel__read(evsel, ncpus, nthreads, true); |
| 150 | } | 150 | } |
| 151 | 151 | ||
| 152 | int __perf_evsel__sample_size(u64 sample_type); | ||
| 153 | |||
| 154 | static inline int perf_evsel__sample_size(struct perf_evsel *evsel) | ||
| 155 | { | ||
| 156 | return __perf_evsel__sample_size(evsel->attr.sample_type); | ||
| 157 | } | ||
| 158 | |||
| 152 | #endif /* __PERF_EVSEL_H */ | 159 | #endif /* __PERF_EVSEL_H */ |
diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c index 69436b3200a4..a9ac0504aabd 100644 --- a/tools/perf/util/python.c +++ b/tools/perf/util/python.c | |||
| @@ -674,7 +674,7 @@ static PyObject *pyrf_evlist__read_on_cpu(struct pyrf_evlist *pevlist, | |||
| 674 | struct perf_evlist *evlist = &pevlist->evlist; | 674 | struct perf_evlist *evlist = &pevlist->evlist; |
| 675 | union perf_event *event; | 675 | union perf_event *event; |
| 676 | int sample_id_all = 1, cpu; | 676 | int sample_id_all = 1, cpu; |
| 677 | static char *kwlist[] = {"sample_id_all", NULL, NULL}; | 677 | static char *kwlist[] = {"cpu", "sample_id_all", NULL, NULL}; |
| 678 | int err; | 678 | int err; |
| 679 | 679 | ||
| 680 | if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i", kwlist, | 680 | if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i", kwlist, |
| @@ -692,16 +692,14 @@ static PyObject *pyrf_evlist__read_on_cpu(struct pyrf_evlist *pevlist, | |||
| 692 | 692 | ||
| 693 | first = list_entry(evlist->entries.next, struct perf_evsel, node); | 693 | first = list_entry(evlist->entries.next, struct perf_evsel, node); |
| 694 | err = perf_event__parse_sample(event, first->attr.sample_type, | 694 | err = perf_event__parse_sample(event, first->attr.sample_type, |
| 695 | perf_sample_size(first->attr.sample_type), | 695 | perf_evsel__sample_size(first), |
| 696 | sample_id_all, &pevent->sample); | 696 | sample_id_all, &pevent->sample); |
| 697 | if (err) { | 697 | if (err) |
| 698 | pr_err("Can't parse sample, err = %d\n", err); | 698 | return PyErr_Format(PyExc_OSError, |
| 699 | goto end; | 699 | "perf: can't parse sample, err=%d", err); |
| 700 | } | ||
| 701 | |||
| 702 | return pyevent; | 700 | return pyevent; |
| 703 | } | 701 | } |
| 704 | end: | 702 | |
| 705 | Py_INCREF(Py_None); | 703 | Py_INCREF(Py_None); |
| 706 | return Py_None; | 704 | return Py_None; |
| 707 | } | 705 | } |
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 64500fc78799..f5a8fbdd3f76 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c | |||
| @@ -58,6 +58,16 @@ static int perf_session__open(struct perf_session *self, bool force) | |||
| 58 | goto out_close; | 58 | goto out_close; |
| 59 | } | 59 | } |
| 60 | 60 | ||
| 61 | if (!perf_evlist__valid_sample_type(self->evlist)) { | ||
| 62 | pr_err("non matching sample_type"); | ||
| 63 | goto out_close; | ||
| 64 | } | ||
| 65 | |||
| 66 | if (!perf_evlist__valid_sample_id_all(self->evlist)) { | ||
| 67 | pr_err("non matching sample_id_all"); | ||
| 68 | goto out_close; | ||
| 69 | } | ||
| 70 | |||
| 61 | self->size = input_stat.st_size; | 71 | self->size = input_stat.st_size; |
| 62 | return 0; | 72 | return 0; |
| 63 | 73 | ||
| @@ -97,7 +107,7 @@ out: | |||
| 97 | void perf_session__update_sample_type(struct perf_session *self) | 107 | void perf_session__update_sample_type(struct perf_session *self) |
| 98 | { | 108 | { |
| 99 | self->sample_type = perf_evlist__sample_type(self->evlist); | 109 | self->sample_type = perf_evlist__sample_type(self->evlist); |
| 100 | self->sample_size = perf_sample_size(self->sample_type); | 110 | self->sample_size = __perf_evsel__sample_size(self->sample_type); |
| 101 | self->sample_id_all = perf_evlist__sample_id_all(self->evlist); | 111 | self->sample_id_all = perf_evlist__sample_id_all(self->evlist); |
| 102 | perf_session__id_header_size(self); | 112 | perf_session__id_header_size(self); |
| 103 | } | 113 | } |
