diff options
110 files changed, 881 insertions, 711 deletions
diff --git a/Documentation/devicetree/bindings/net/micrel-ks8851.txt b/Documentation/devicetree/bindings/net/micrel-ks8851.txt index 11ace3c3d805..4fc392763611 100644 --- a/Documentation/devicetree/bindings/net/micrel-ks8851.txt +++ b/Documentation/devicetree/bindings/net/micrel-ks8851.txt | |||
| @@ -7,3 +7,4 @@ Required properties: | |||
| 7 | 7 | ||
| 8 | Optional properties: | 8 | Optional properties: |
| 9 | - local-mac-address : Ethernet mac address to use | 9 | - local-mac-address : Ethernet mac address to use |
| 10 | - vdd-supply: supply for Ethernet mac | ||
diff --git a/Documentation/networking/netlink_mmap.txt b/Documentation/networking/netlink_mmap.txt index b26122973525..c6af4bac5aa8 100644 --- a/Documentation/networking/netlink_mmap.txt +++ b/Documentation/networking/netlink_mmap.txt | |||
| @@ -226,9 +226,9 @@ Ring setup: | |||
| 226 | void *rx_ring, *tx_ring; | 226 | void *rx_ring, *tx_ring; |
| 227 | 227 | ||
| 228 | /* Configure ring parameters */ | 228 | /* Configure ring parameters */ |
| 229 | if (setsockopt(fd, NETLINK_RX_RING, &req, sizeof(req)) < 0) | 229 | if (setsockopt(fd, SOL_NETLINK, NETLINK_RX_RING, &req, sizeof(req)) < 0) |
| 230 | exit(1); | 230 | exit(1); |
| 231 | if (setsockopt(fd, NETLINK_TX_RING, &req, sizeof(req)) < 0) | 231 | if (setsockopt(fd, SOL_NETLINK, NETLINK_TX_RING, &req, sizeof(req)) < 0) |
| 232 | exit(1) | 232 | exit(1) |
| 233 | 233 | ||
| 234 | /* Calculate size of each individual ring */ | 234 | /* Calculate size of each individual ring */ |
diff --git a/MAINTAINERS b/MAINTAINERS index 7c42d59effab..ec01455c7afe 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -911,11 +911,11 @@ F: arch/arm/include/asm/hardware/dec21285.h | |||
| 911 | F: arch/arm/mach-footbridge/ | 911 | F: arch/arm/mach-footbridge/ |
| 912 | 912 | ||
| 913 | ARM/FREESCALE IMX / MXC ARM ARCHITECTURE | 913 | ARM/FREESCALE IMX / MXC ARM ARCHITECTURE |
| 914 | M: Shawn Guo <shawn.guo@linaro.org> | 914 | M: Shawn Guo <shawn.guo@freescale.com> |
| 915 | M: Sascha Hauer <kernel@pengutronix.de> | 915 | M: Sascha Hauer <kernel@pengutronix.de> |
| 916 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 916 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
| 917 | S: Maintained | 917 | S: Maintained |
| 918 | T: git git://git.linaro.org/people/shawnguo/linux-2.6.git | 918 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/shawnguo/linux.git |
| 919 | F: arch/arm/mach-imx/ | 919 | F: arch/arm/mach-imx/ |
| 920 | F: arch/arm/boot/dts/imx* | 920 | F: arch/arm/boot/dts/imx* |
| 921 | F: arch/arm/configs/imx*_defconfig | 921 | F: arch/arm/configs/imx*_defconfig |
| @@ -4552,6 +4552,7 @@ M: Greg Rose <gregory.v.rose@intel.com> | |||
| 4552 | M: Alex Duyck <alexander.h.duyck@intel.com> | 4552 | M: Alex Duyck <alexander.h.duyck@intel.com> |
| 4553 | M: John Ronciak <john.ronciak@intel.com> | 4553 | M: John Ronciak <john.ronciak@intel.com> |
| 4554 | M: Mitch Williams <mitch.a.williams@intel.com> | 4554 | M: Mitch Williams <mitch.a.williams@intel.com> |
| 4555 | M: Linux NICS <linux.nics@intel.com> | ||
| 4555 | L: e1000-devel@lists.sourceforge.net | 4556 | L: e1000-devel@lists.sourceforge.net |
| 4556 | W: http://www.intel.com/support/feedback.htm | 4557 | W: http://www.intel.com/support/feedback.htm |
| 4557 | W: http://e1000.sourceforge.net/ | 4558 | W: http://e1000.sourceforge.net/ |
| @@ -1,7 +1,7 @@ | |||
| 1 | VERSION = 3 | 1 | VERSION = 3 |
| 2 | PATCHLEVEL = 14 | 2 | PATCHLEVEL = 14 |
| 3 | SUBLEVEL = 0 | 3 | SUBLEVEL = 0 |
| 4 | EXTRAVERSION = -rc7 | 4 | EXTRAVERSION = -rc8 |
| 5 | NAME = Shuffling Zombie Juror | 5 | NAME = Shuffling Zombie Juror |
| 6 | 6 | ||
| 7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
diff --git a/arch/arm/boot/dts/sama5d36.dtsi b/arch/arm/boot/dts/sama5d36.dtsi index 6c31c26e6cc0..db58cad6acd3 100644 --- a/arch/arm/boot/dts/sama5d36.dtsi +++ b/arch/arm/boot/dts/sama5d36.dtsi | |||
| @@ -8,8 +8,8 @@ | |||
| 8 | */ | 8 | */ |
| 9 | #include "sama5d3.dtsi" | 9 | #include "sama5d3.dtsi" |
| 10 | #include "sama5d3_can.dtsi" | 10 | #include "sama5d3_can.dtsi" |
| 11 | #include "sama5d3_emac.dtsi" | ||
| 12 | #include "sama5d3_gmac.dtsi" | 11 | #include "sama5d3_gmac.dtsi" |
| 12 | #include "sama5d3_emac.dtsi" | ||
| 13 | #include "sama5d3_lcd.dtsi" | 13 | #include "sama5d3_lcd.dtsi" |
| 14 | #include "sama5d3_mci2.dtsi" | 14 | #include "sama5d3_mci2.dtsi" |
| 15 | #include "sama5d3_tcb1.dtsi" | 15 | #include "sama5d3_tcb1.dtsi" |
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index dcae3a7035db..95fa1f1d5c8b 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
| @@ -1776,12 +1776,12 @@ endchoice | |||
| 1776 | 1776 | ||
| 1777 | config FORCE_MAX_ZONEORDER | 1777 | config FORCE_MAX_ZONEORDER |
| 1778 | int "Maximum zone order" | 1778 | int "Maximum zone order" |
| 1779 | range 14 64 if HUGETLB_PAGE && PAGE_SIZE_64KB | 1779 | range 14 64 if MIPS_HUGE_TLB_SUPPORT && PAGE_SIZE_64KB |
| 1780 | default "14" if HUGETLB_PAGE && PAGE_SIZE_64KB | 1780 | default "14" if MIPS_HUGE_TLB_SUPPORT && PAGE_SIZE_64KB |
| 1781 | range 13 64 if HUGETLB_PAGE && PAGE_SIZE_32KB | 1781 | range 13 64 if MIPS_HUGE_TLB_SUPPORT && PAGE_SIZE_32KB |
| 1782 | default "13" if HUGETLB_PAGE && PAGE_SIZE_32KB | 1782 | default "13" if MIPS_HUGE_TLB_SUPPORT && PAGE_SIZE_32KB |
| 1783 | range 12 64 if HUGETLB_PAGE && PAGE_SIZE_16KB | 1783 | range 12 64 if MIPS_HUGE_TLB_SUPPORT && PAGE_SIZE_16KB |
| 1784 | default "12" if HUGETLB_PAGE && PAGE_SIZE_16KB | 1784 | default "12" if MIPS_HUGE_TLB_SUPPORT && PAGE_SIZE_16KB |
| 1785 | range 11 64 | 1785 | range 11 64 |
| 1786 | default "11" | 1786 | default "11" |
| 1787 | help | 1787 | help |
| @@ -2353,9 +2353,8 @@ config SECCOMP | |||
| 2353 | If unsure, say Y. Only embedded should say N here. | 2353 | If unsure, say Y. Only embedded should say N here. |
| 2354 | 2354 | ||
| 2355 | config MIPS_O32_FP64_SUPPORT | 2355 | config MIPS_O32_FP64_SUPPORT |
| 2356 | bool "Support for O32 binaries using 64-bit FP" | 2356 | bool "Support for O32 binaries using 64-bit FP (EXPERIMENTAL)" |
| 2357 | depends on 32BIT || MIPS32_O32 | 2357 | depends on 32BIT || MIPS32_O32 |
| 2358 | default y | ||
| 2359 | help | 2358 | help |
| 2360 | When this is enabled, the kernel will support use of 64-bit floating | 2359 | When this is enabled, the kernel will support use of 64-bit floating |
| 2361 | point registers with binaries using the O32 ABI along with the | 2360 | point registers with binaries using the O32 ABI along with the |
| @@ -2367,7 +2366,14 @@ config MIPS_O32_FP64_SUPPORT | |||
| 2367 | of your kernel & potentially improve FP emulation performance by | 2366 | of your kernel & potentially improve FP emulation performance by |
| 2368 | saying N here. | 2367 | saying N here. |
| 2369 | 2368 | ||
| 2370 | If unsure, say Y. | 2369 | Although binutils currently supports use of this flag the details |
| 2370 | concerning its effect upon the O32 ABI in userland are still being | ||
| 2371 | worked on. In order to avoid userland becoming dependant upon current | ||
| 2372 | behaviour before the details have been finalised, this option should | ||
| 2373 | be considered experimental and only enabled by those working upon | ||
| 2374 | said details. | ||
| 2375 | |||
| 2376 | If unsure, say N. | ||
| 2371 | 2377 | ||
| 2372 | config USE_OF | 2378 | config USE_OF |
| 2373 | bool | 2379 | bool |
diff --git a/arch/mips/alchemy/board-gpr.c b/arch/mips/alchemy/board-gpr.c index 9edc35ff8cf1..acf9a2a37f5a 100644 --- a/arch/mips/alchemy/board-gpr.c +++ b/arch/mips/alchemy/board-gpr.c | |||
| @@ -53,10 +53,8 @@ void __init prom_init(void) | |||
| 53 | prom_init_cmdline(); | 53 | prom_init_cmdline(); |
| 54 | 54 | ||
| 55 | memsize_str = prom_getenv("memsize"); | 55 | memsize_str = prom_getenv("memsize"); |
| 56 | if (!memsize_str) | 56 | if (!memsize_str || kstrtoul(memsize_str, 0, &memsize)) |
| 57 | memsize = 0x04000000; | 57 | memsize = 0x04000000; |
| 58 | else | ||
| 59 | strict_strtoul(memsize_str, 0, &memsize); | ||
| 60 | add_memory_region(0, memsize, BOOT_MEM_RAM); | 58 | add_memory_region(0, memsize, BOOT_MEM_RAM); |
| 61 | } | 59 | } |
| 62 | 60 | ||
diff --git a/arch/mips/alchemy/board-mtx1.c b/arch/mips/alchemy/board-mtx1.c index 9969dbab19e3..25a59a23547e 100644 --- a/arch/mips/alchemy/board-mtx1.c +++ b/arch/mips/alchemy/board-mtx1.c | |||
| @@ -52,10 +52,8 @@ void __init prom_init(void) | |||
| 52 | prom_init_cmdline(); | 52 | prom_init_cmdline(); |
| 53 | 53 | ||
| 54 | memsize_str = prom_getenv("memsize"); | 54 | memsize_str = prom_getenv("memsize"); |
| 55 | if (!memsize_str) | 55 | if (!memsize_str || kstrtoul(memsize_str, 0, &memsize)) |
| 56 | memsize = 0x04000000; | 56 | memsize = 0x04000000; |
| 57 | else | ||
| 58 | strict_strtoul(memsize_str, 0, &memsize); | ||
| 59 | add_memory_region(0, memsize, BOOT_MEM_RAM); | 57 | add_memory_region(0, memsize, BOOT_MEM_RAM); |
| 60 | } | 58 | } |
| 61 | 59 | ||
diff --git a/arch/mips/bcm47xx/board.c b/arch/mips/bcm47xx/board.c index 6d612e2b949b..cdd8246f92b3 100644 --- a/arch/mips/bcm47xx/board.c +++ b/arch/mips/bcm47xx/board.c | |||
| @@ -1,3 +1,4 @@ | |||
| 1 | #include <linux/errno.h> | ||
| 1 | #include <linux/export.h> | 2 | #include <linux/export.h> |
| 2 | #include <linux/string.h> | 3 | #include <linux/string.h> |
| 3 | #include <bcm47xx_board.h> | 4 | #include <bcm47xx_board.h> |
diff --git a/arch/mips/bcm47xx/nvram.c b/arch/mips/bcm47xx/nvram.c index 6decb27cf48b..2bed73a684ae 100644 --- a/arch/mips/bcm47xx/nvram.c +++ b/arch/mips/bcm47xx/nvram.c | |||
| @@ -196,7 +196,7 @@ int bcm47xx_nvram_gpio_pin(const char *name) | |||
| 196 | char nvram_var[10]; | 196 | char nvram_var[10]; |
| 197 | char buf[30]; | 197 | char buf[30]; |
| 198 | 198 | ||
| 199 | for (i = 0; i < 16; i++) { | 199 | for (i = 0; i < 32; i++) { |
| 200 | err = snprintf(nvram_var, sizeof(nvram_var), "gpio%i", i); | 200 | err = snprintf(nvram_var, sizeof(nvram_var), "gpio%i", i); |
| 201 | if (err <= 0) | 201 | if (err <= 0) |
| 202 | continue; | 202 | continue; |
diff --git a/arch/mips/cavium-octeon/octeon-irq.c b/arch/mips/cavium-octeon/octeon-irq.c index 25fbfae06c1f..c2bb4f896ce7 100644 --- a/arch/mips/cavium-octeon/octeon-irq.c +++ b/arch/mips/cavium-octeon/octeon-irq.c | |||
| @@ -975,10 +975,6 @@ static int octeon_irq_ciu_xlat(struct irq_domain *d, | |||
| 975 | if (ciu > 1 || bit > 63) | 975 | if (ciu > 1 || bit > 63) |
| 976 | return -EINVAL; | 976 | return -EINVAL; |
| 977 | 977 | ||
| 978 | /* These are the GPIO lines */ | ||
| 979 | if (ciu == 0 && bit >= 16 && bit < 32) | ||
| 980 | return -EINVAL; | ||
| 981 | |||
| 982 | *out_hwirq = (ciu << 6) | bit; | 978 | *out_hwirq = (ciu << 6) | bit; |
| 983 | *out_type = 0; | 979 | *out_type = 0; |
| 984 | 980 | ||
| @@ -1007,6 +1003,10 @@ static int octeon_irq_ciu_map(struct irq_domain *d, | |||
| 1007 | if (!octeon_irq_virq_in_range(virq)) | 1003 | if (!octeon_irq_virq_in_range(virq)) |
| 1008 | return -EINVAL; | 1004 | return -EINVAL; |
| 1009 | 1005 | ||
| 1006 | /* Don't map irq if it is reserved for GPIO. */ | ||
| 1007 | if (line == 0 && bit >= 16 && bit <32) | ||
| 1008 | return 0; | ||
| 1009 | |||
| 1010 | if (line > 1 || octeon_irq_ciu_to_irq[line][bit] != 0) | 1010 | if (line > 1 || octeon_irq_ciu_to_irq[line][bit] != 0) |
| 1011 | return -EINVAL; | 1011 | return -EINVAL; |
| 1012 | 1012 | ||
| @@ -1525,10 +1525,6 @@ static int octeon_irq_ciu2_xlat(struct irq_domain *d, | |||
| 1525 | ciu = intspec[0]; | 1525 | ciu = intspec[0]; |
| 1526 | bit = intspec[1]; | 1526 | bit = intspec[1]; |
| 1527 | 1527 | ||
| 1528 | /* Line 7 are the GPIO lines */ | ||
| 1529 | if (ciu > 6 || bit > 63) | ||
| 1530 | return -EINVAL; | ||
| 1531 | |||
| 1532 | *out_hwirq = (ciu << 6) | bit; | 1528 | *out_hwirq = (ciu << 6) | bit; |
| 1533 | *out_type = 0; | 1529 | *out_type = 0; |
| 1534 | 1530 | ||
| @@ -1570,8 +1566,14 @@ static int octeon_irq_ciu2_map(struct irq_domain *d, | |||
| 1570 | if (!octeon_irq_virq_in_range(virq)) | 1566 | if (!octeon_irq_virq_in_range(virq)) |
| 1571 | return -EINVAL; | 1567 | return -EINVAL; |
| 1572 | 1568 | ||
| 1573 | /* Line 7 are the GPIO lines */ | 1569 | /* |
| 1574 | if (line > 6 || octeon_irq_ciu_to_irq[line][bit] != 0) | 1570 | * Don't map irq if it is reserved for GPIO. |
| 1571 | * (Line 7 are the GPIO lines.) | ||
| 1572 | */ | ||
| 1573 | if (line == 7) | ||
| 1574 | return 0; | ||
| 1575 | |||
| 1576 | if (line > 7 || octeon_irq_ciu_to_irq[line][bit] != 0) | ||
| 1575 | return -EINVAL; | 1577 | return -EINVAL; |
| 1576 | 1578 | ||
| 1577 | if (octeon_irq_ciu2_is_edge(line, bit)) | 1579 | if (octeon_irq_ciu2_is_edge(line, bit)) |
diff --git a/arch/mips/include/asm/asmmacro.h b/arch/mips/include/asm/asmmacro.h index 3220c93ea981..4225e99bd7bf 100644 --- a/arch/mips/include/asm/asmmacro.h +++ b/arch/mips/include/asm/asmmacro.h | |||
| @@ -9,6 +9,7 @@ | |||
| 9 | #define _ASM_ASMMACRO_H | 9 | #define _ASM_ASMMACRO_H |
| 10 | 10 | ||
| 11 | #include <asm/hazards.h> | 11 | #include <asm/hazards.h> |
| 12 | #include <asm/asm-offsets.h> | ||
| 12 | 13 | ||
| 13 | #ifdef CONFIG_32BIT | 14 | #ifdef CONFIG_32BIT |
| 14 | #include <asm/asmmacro-32.h> | 15 | #include <asm/asmmacro-32.h> |
| @@ -54,11 +55,21 @@ | |||
| 54 | .endm | 55 | .endm |
| 55 | 56 | ||
| 56 | .macro local_irq_disable reg=t0 | 57 | .macro local_irq_disable reg=t0 |
| 58 | #ifdef CONFIG_PREEMPT | ||
| 59 | lw \reg, TI_PRE_COUNT($28) | ||
| 60 | addi \reg, \reg, 1 | ||
| 61 | sw \reg, TI_PRE_COUNT($28) | ||
| 62 | #endif | ||
| 57 | mfc0 \reg, CP0_STATUS | 63 | mfc0 \reg, CP0_STATUS |
| 58 | ori \reg, \reg, 1 | 64 | ori \reg, \reg, 1 |
| 59 | xori \reg, \reg, 1 | 65 | xori \reg, \reg, 1 |
| 60 | mtc0 \reg, CP0_STATUS | 66 | mtc0 \reg, CP0_STATUS |
| 61 | irq_disable_hazard | 67 | irq_disable_hazard |
| 68 | #ifdef CONFIG_PREEMPT | ||
| 69 | lw \reg, TI_PRE_COUNT($28) | ||
| 70 | addi \reg, \reg, -1 | ||
| 71 | sw \reg, TI_PRE_COUNT($28) | ||
| 72 | #endif | ||
| 62 | .endm | 73 | .endm |
| 63 | #endif /* CONFIG_MIPS_MT_SMTC */ | 74 | #endif /* CONFIG_MIPS_MT_SMTC */ |
| 64 | 75 | ||
| @@ -106,7 +117,7 @@ | |||
| 106 | .endm | 117 | .endm |
| 107 | 118 | ||
| 108 | .macro fpu_save_double thread status tmp | 119 | .macro fpu_save_double thread status tmp |
| 109 | #if defined(CONFIG_MIPS64) || defined(CONFIG_CPU_MIPS32_R2) | 120 | #if defined(CONFIG_64BIT) || defined(CONFIG_CPU_MIPS32_R2) |
| 110 | sll \tmp, \status, 5 | 121 | sll \tmp, \status, 5 |
| 111 | bgez \tmp, 10f | 122 | bgez \tmp, 10f |
| 112 | fpu_save_16odd \thread | 123 | fpu_save_16odd \thread |
| @@ -159,7 +170,7 @@ | |||
| 159 | .endm | 170 | .endm |
| 160 | 171 | ||
| 161 | .macro fpu_restore_double thread status tmp | 172 | .macro fpu_restore_double thread status tmp |
| 162 | #if defined(CONFIG_MIPS64) || defined(CONFIG_CPU_MIPS32_R2) | 173 | #if defined(CONFIG_64BIT) || defined(CONFIG_CPU_MIPS32_R2) |
| 163 | sll \tmp, \status, 5 | 174 | sll \tmp, \status, 5 |
| 164 | bgez \tmp, 10f # 16 register mode? | 175 | bgez \tmp, 10f # 16 register mode? |
| 165 | 176 | ||
diff --git a/arch/mips/include/asm/fpu.h b/arch/mips/include/asm/fpu.h index 6b9749540edf..58e50cbdb1a6 100644 --- a/arch/mips/include/asm/fpu.h +++ b/arch/mips/include/asm/fpu.h | |||
| @@ -57,7 +57,7 @@ static inline int __enable_fpu(enum fpu_mode mode) | |||
| 57 | return 0; | 57 | return 0; |
| 58 | 58 | ||
| 59 | case FPU_64BIT: | 59 | case FPU_64BIT: |
| 60 | #if !(defined(CONFIG_CPU_MIPS32_R2) || defined(CONFIG_MIPS64)) | 60 | #if !(defined(CONFIG_CPU_MIPS32_R2) || defined(CONFIG_64BIT)) |
| 61 | /* we only have a 32-bit FPU */ | 61 | /* we only have a 32-bit FPU */ |
| 62 | return SIGFPE; | 62 | return SIGFPE; |
| 63 | #endif | 63 | #endif |
diff --git a/arch/mips/include/asm/ftrace.h b/arch/mips/include/asm/ftrace.h index ce35c9af0c28..992aaba603b5 100644 --- a/arch/mips/include/asm/ftrace.h +++ b/arch/mips/include/asm/ftrace.h | |||
| @@ -22,12 +22,12 @@ extern void _mcount(void); | |||
| 22 | #define safe_load(load, src, dst, error) \ | 22 | #define safe_load(load, src, dst, error) \ |
| 23 | do { \ | 23 | do { \ |
| 24 | asm volatile ( \ | 24 | asm volatile ( \ |
| 25 | "1: " load " %[" STR(dst) "], 0(%[" STR(src) "])\n"\ | 25 | "1: " load " %[tmp_dst], 0(%[tmp_src])\n" \ |
| 26 | " li %[" STR(error) "], 0\n" \ | 26 | " li %[tmp_err], 0\n" \ |
| 27 | "2:\n" \ | 27 | "2:\n" \ |
| 28 | \ | 28 | \ |
| 29 | ".section .fixup, \"ax\"\n" \ | 29 | ".section .fixup, \"ax\"\n" \ |
| 30 | "3: li %[" STR(error) "], 1\n" \ | 30 | "3: li %[tmp_err], 1\n" \ |
| 31 | " j 2b\n" \ | 31 | " j 2b\n" \ |
| 32 | ".previous\n" \ | 32 | ".previous\n" \ |
| 33 | \ | 33 | \ |
| @@ -35,8 +35,8 @@ do { \ | |||
| 35 | STR(PTR) "\t1b, 3b\n\t" \ | 35 | STR(PTR) "\t1b, 3b\n\t" \ |
| 36 | ".previous\n" \ | 36 | ".previous\n" \ |
| 37 | \ | 37 | \ |
| 38 | : [dst] "=&r" (dst), [error] "=r" (error)\ | 38 | : [tmp_dst] "=&r" (dst), [tmp_err] "=r" (error)\ |
| 39 | : [src] "r" (src) \ | 39 | : [tmp_src] "r" (src) \ |
| 40 | : "memory" \ | 40 | : "memory" \ |
| 41 | ); \ | 41 | ); \ |
| 42 | } while (0) | 42 | } while (0) |
| @@ -44,12 +44,12 @@ do { \ | |||
| 44 | #define safe_store(store, src, dst, error) \ | 44 | #define safe_store(store, src, dst, error) \ |
| 45 | do { \ | 45 | do { \ |
| 46 | asm volatile ( \ | 46 | asm volatile ( \ |
| 47 | "1: " store " %[" STR(src) "], 0(%[" STR(dst) "])\n"\ | 47 | "1: " store " %[tmp_src], 0(%[tmp_dst])\n"\ |
| 48 | " li %[" STR(error) "], 0\n" \ | 48 | " li %[tmp_err], 0\n" \ |
| 49 | "2:\n" \ | 49 | "2:\n" \ |
| 50 | \ | 50 | \ |
| 51 | ".section .fixup, \"ax\"\n" \ | 51 | ".section .fixup, \"ax\"\n" \ |
| 52 | "3: li %[" STR(error) "], 1\n" \ | 52 | "3: li %[tmp_err], 1\n" \ |
| 53 | " j 2b\n" \ | 53 | " j 2b\n" \ |
| 54 | ".previous\n" \ | 54 | ".previous\n" \ |
| 55 | \ | 55 | \ |
| @@ -57,8 +57,8 @@ do { \ | |||
| 57 | STR(PTR) "\t1b, 3b\n\t" \ | 57 | STR(PTR) "\t1b, 3b\n\t" \ |
| 58 | ".previous\n" \ | 58 | ".previous\n" \ |
| 59 | \ | 59 | \ |
| 60 | : [error] "=r" (error) \ | 60 | : [tmp_err] "=r" (error) \ |
| 61 | : [dst] "r" (dst), [src] "r" (src)\ | 61 | : [tmp_dst] "r" (dst), [tmp_src] "r" (src)\ |
| 62 | : "memory" \ | 62 | : "memory" \ |
| 63 | ); \ | 63 | ); \ |
| 64 | } while (0) | 64 | } while (0) |
diff --git a/arch/mips/include/asm/syscall.h b/arch/mips/include/asm/syscall.h index 33e8dbfc1b63..f35b131977e6 100644 --- a/arch/mips/include/asm/syscall.h +++ b/arch/mips/include/asm/syscall.h | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | #ifndef __ASM_MIPS_SYSCALL_H | 13 | #ifndef __ASM_MIPS_SYSCALL_H |
| 14 | #define __ASM_MIPS_SYSCALL_H | 14 | #define __ASM_MIPS_SYSCALL_H |
| 15 | 15 | ||
| 16 | #include <linux/compiler.h> | ||
| 16 | #include <linux/audit.h> | 17 | #include <linux/audit.h> |
| 17 | #include <linux/elf-em.h> | 18 | #include <linux/elf-em.h> |
| 18 | #include <linux/kernel.h> | 19 | #include <linux/kernel.h> |
| @@ -39,14 +40,14 @@ static inline unsigned long mips_get_syscall_arg(unsigned long *arg, | |||
| 39 | 40 | ||
| 40 | #ifdef CONFIG_32BIT | 41 | #ifdef CONFIG_32BIT |
| 41 | case 4: case 5: case 6: case 7: | 42 | case 4: case 5: case 6: case 7: |
| 42 | return get_user(*arg, (int *)usp + 4 * n); | 43 | return get_user(*arg, (int *)usp + n); |
| 43 | #endif | 44 | #endif |
| 44 | 45 | ||
| 45 | #ifdef CONFIG_64BIT | 46 | #ifdef CONFIG_64BIT |
| 46 | case 4: case 5: case 6: case 7: | 47 | case 4: case 5: case 6: case 7: |
| 47 | #ifdef CONFIG_MIPS32_O32 | 48 | #ifdef CONFIG_MIPS32_O32 |
| 48 | if (test_thread_flag(TIF_32BIT_REGS)) | 49 | if (test_thread_flag(TIF_32BIT_REGS)) |
| 49 | return get_user(*arg, (int *)usp + 4 * n); | 50 | return get_user(*arg, (int *)usp + n); |
| 50 | else | 51 | else |
| 51 | #endif | 52 | #endif |
| 52 | *arg = regs->regs[4 + n]; | 53 | *arg = regs->regs[4 + n]; |
| @@ -57,6 +58,8 @@ static inline unsigned long mips_get_syscall_arg(unsigned long *arg, | |||
| 57 | default: | 58 | default: |
| 58 | BUG(); | 59 | BUG(); |
| 59 | } | 60 | } |
| 61 | |||
| 62 | unreachable(); | ||
| 60 | } | 63 | } |
| 61 | 64 | ||
| 62 | static inline long syscall_get_return_value(struct task_struct *task, | 65 | static inline long syscall_get_return_value(struct task_struct *task, |
| @@ -83,11 +86,10 @@ static inline void syscall_get_arguments(struct task_struct *task, | |||
| 83 | unsigned int i, unsigned int n, | 86 | unsigned int i, unsigned int n, |
| 84 | unsigned long *args) | 87 | unsigned long *args) |
| 85 | { | 88 | { |
| 86 | unsigned long arg; | ||
| 87 | int ret; | 89 | int ret; |
| 88 | 90 | ||
| 89 | while (n--) | 91 | while (n--) |
| 90 | ret |= mips_get_syscall_arg(&arg, task, regs, i++); | 92 | ret |= mips_get_syscall_arg(args++, task, regs, i++); |
| 91 | 93 | ||
| 92 | /* | 94 | /* |
| 93 | * No way to communicate an error because this is a void function. | 95 | * No way to communicate an error because this is a void function. |
diff --git a/arch/mips/include/uapi/asm/inst.h b/arch/mips/include/uapi/asm/inst.h index b39ba25b41cc..f25181b19941 100644 --- a/arch/mips/include/uapi/asm/inst.h +++ b/arch/mips/include/uapi/asm/inst.h | |||
| @@ -163,8 +163,8 @@ enum cop1_sdw_func { | |||
| 163 | */ | 163 | */ |
| 164 | enum cop1x_func { | 164 | enum cop1x_func { |
| 165 | lwxc1_op = 0x00, ldxc1_op = 0x01, | 165 | lwxc1_op = 0x00, ldxc1_op = 0x01, |
| 166 | pfetch_op = 0x07, swxc1_op = 0x08, | 166 | swxc1_op = 0x08, sdxc1_op = 0x09, |
| 167 | sdxc1_op = 0x09, madd_s_op = 0x20, | 167 | pfetch_op = 0x0f, madd_s_op = 0x20, |
| 168 | madd_d_op = 0x21, madd_e_op = 0x22, | 168 | madd_d_op = 0x21, madd_e_op = 0x22, |
| 169 | msub_s_op = 0x28, msub_d_op = 0x29, | 169 | msub_s_op = 0x28, msub_d_op = 0x29, |
| 170 | msub_e_op = 0x2a, nmadd_s_op = 0x30, | 170 | msub_e_op = 0x2a, nmadd_s_op = 0x30, |
diff --git a/arch/mips/kernel/ftrace.c b/arch/mips/kernel/ftrace.c index 185ba258361b..374ed74cd516 100644 --- a/arch/mips/kernel/ftrace.c +++ b/arch/mips/kernel/ftrace.c | |||
| @@ -111,11 +111,10 @@ static int ftrace_modify_code_2(unsigned long ip, unsigned int new_code1, | |||
| 111 | safe_store_code(new_code1, ip, faulted); | 111 | safe_store_code(new_code1, ip, faulted); |
| 112 | if (unlikely(faulted)) | 112 | if (unlikely(faulted)) |
| 113 | return -EFAULT; | 113 | return -EFAULT; |
| 114 | ip += 4; | 114 | safe_store_code(new_code2, ip + 4, faulted); |
| 115 | safe_store_code(new_code2, ip, faulted); | ||
| 116 | if (unlikely(faulted)) | 115 | if (unlikely(faulted)) |
| 117 | return -EFAULT; | 116 | return -EFAULT; |
| 118 | flush_icache_range(ip, ip + 8); /* original ip + 12 */ | 117 | flush_icache_range(ip, ip + 8); |
| 119 | return 0; | 118 | return 0; |
| 120 | } | 119 | } |
| 121 | #endif | 120 | #endif |
diff --git a/arch/mips/kernel/r4k_fpu.S b/arch/mips/kernel/r4k_fpu.S index 253b2fb52026..73b0ddf910d4 100644 --- a/arch/mips/kernel/r4k_fpu.S +++ b/arch/mips/kernel/r4k_fpu.S | |||
| @@ -35,9 +35,9 @@ | |||
| 35 | LEAF(_save_fp_context) | 35 | LEAF(_save_fp_context) |
| 36 | cfc1 t1, fcr31 | 36 | cfc1 t1, fcr31 |
| 37 | 37 | ||
| 38 | #if defined(CONFIG_64BIT) || defined(CONFIG_MIPS32_R2) | 38 | #if defined(CONFIG_64BIT) || defined(CONFIG_CPU_MIPS32_R2) |
| 39 | .set push | 39 | .set push |
| 40 | #ifdef CONFIG_MIPS32_R2 | 40 | #ifdef CONFIG_CPU_MIPS32_R2 |
| 41 | .set mips64r2 | 41 | .set mips64r2 |
| 42 | mfc0 t0, CP0_STATUS | 42 | mfc0 t0, CP0_STATUS |
| 43 | sll t0, t0, 5 | 43 | sll t0, t0, 5 |
| @@ -146,11 +146,11 @@ LEAF(_save_fp_context32) | |||
| 146 | * - cp1 status/control register | 146 | * - cp1 status/control register |
| 147 | */ | 147 | */ |
| 148 | LEAF(_restore_fp_context) | 148 | LEAF(_restore_fp_context) |
| 149 | EX lw t0, SC_FPC_CSR(a0) | 149 | EX lw t1, SC_FPC_CSR(a0) |
| 150 | 150 | ||
| 151 | #if defined(CONFIG_64BIT) || defined(CONFIG_MIPS32_R2) | 151 | #if defined(CONFIG_64BIT) || defined(CONFIG_CPU_MIPS32_R2) |
| 152 | .set push | 152 | .set push |
| 153 | #ifdef CONFIG_MIPS32_R2 | 153 | #ifdef CONFIG_CPU_MIPS32_R2 |
| 154 | .set mips64r2 | 154 | .set mips64r2 |
| 155 | mfc0 t0, CP0_STATUS | 155 | mfc0 t0, CP0_STATUS |
| 156 | sll t0, t0, 5 | 156 | sll t0, t0, 5 |
| @@ -191,7 +191,7 @@ LEAF(_restore_fp_context) | |||
| 191 | EX ldc1 $f26, SC_FPREGS+208(a0) | 191 | EX ldc1 $f26, SC_FPREGS+208(a0) |
| 192 | EX ldc1 $f28, SC_FPREGS+224(a0) | 192 | EX ldc1 $f28, SC_FPREGS+224(a0) |
| 193 | EX ldc1 $f30, SC_FPREGS+240(a0) | 193 | EX ldc1 $f30, SC_FPREGS+240(a0) |
| 194 | ctc1 t0, fcr31 | 194 | ctc1 t1, fcr31 |
| 195 | jr ra | 195 | jr ra |
| 196 | li v0, 0 # success | 196 | li v0, 0 # success |
| 197 | END(_restore_fp_context) | 197 | END(_restore_fp_context) |
| @@ -199,7 +199,7 @@ LEAF(_restore_fp_context) | |||
| 199 | #ifdef CONFIG_MIPS32_COMPAT | 199 | #ifdef CONFIG_MIPS32_COMPAT |
| 200 | LEAF(_restore_fp_context32) | 200 | LEAF(_restore_fp_context32) |
| 201 | /* Restore an o32 sigcontext. */ | 201 | /* Restore an o32 sigcontext. */ |
| 202 | EX lw t0, SC32_FPC_CSR(a0) | 202 | EX lw t1, SC32_FPC_CSR(a0) |
| 203 | 203 | ||
| 204 | mfc0 t0, CP0_STATUS | 204 | mfc0 t0, CP0_STATUS |
| 205 | sll t0, t0, 5 | 205 | sll t0, t0, 5 |
| @@ -239,7 +239,7 @@ LEAF(_restore_fp_context32) | |||
| 239 | EX ldc1 $f26, SC32_FPREGS+208(a0) | 239 | EX ldc1 $f26, SC32_FPREGS+208(a0) |
| 240 | EX ldc1 $f28, SC32_FPREGS+224(a0) | 240 | EX ldc1 $f28, SC32_FPREGS+224(a0) |
| 241 | EX ldc1 $f30, SC32_FPREGS+240(a0) | 241 | EX ldc1 $f30, SC32_FPREGS+240(a0) |
| 242 | ctc1 t0, fcr31 | 242 | ctc1 t1, fcr31 |
| 243 | jr ra | 243 | jr ra |
| 244 | li v0, 0 # success | 244 | li v0, 0 # success |
| 245 | END(_restore_fp_context32) | 245 | END(_restore_fp_context32) |
diff --git a/arch/mips/kernel/rtlx-cmp.c b/arch/mips/kernel/rtlx-cmp.c index 56dc69635153..758fb3cd2326 100644 --- a/arch/mips/kernel/rtlx-cmp.c +++ b/arch/mips/kernel/rtlx-cmp.c | |||
| @@ -112,5 +112,8 @@ void __exit rtlx_module_exit(void) | |||
| 112 | 112 | ||
| 113 | for (i = 0; i < RTLX_CHANNELS; i++) | 113 | for (i = 0; i < RTLX_CHANNELS; i++) |
| 114 | device_destroy(mt_class, MKDEV(major, i)); | 114 | device_destroy(mt_class, MKDEV(major, i)); |
| 115 | |||
| 115 | unregister_chrdev(major, RTLX_MODULE_NAME); | 116 | unregister_chrdev(major, RTLX_MODULE_NAME); |
| 117 | |||
| 118 | aprp_hook = NULL; | ||
| 116 | } | 119 | } |
diff --git a/arch/mips/kernel/rtlx-mt.c b/arch/mips/kernel/rtlx-mt.c index 91d61ba422b4..9c1aca00fd54 100644 --- a/arch/mips/kernel/rtlx-mt.c +++ b/arch/mips/kernel/rtlx-mt.c | |||
| @@ -144,5 +144,8 @@ void __exit rtlx_module_exit(void) | |||
| 144 | 144 | ||
| 145 | for (i = 0; i < RTLX_CHANNELS; i++) | 145 | for (i = 0; i < RTLX_CHANNELS; i++) |
| 146 | device_destroy(mt_class, MKDEV(major, i)); | 146 | device_destroy(mt_class, MKDEV(major, i)); |
| 147 | |||
| 147 | unregister_chrdev(major, RTLX_MODULE_NAME); | 148 | unregister_chrdev(major, RTLX_MODULE_NAME); |
| 149 | |||
| 150 | aprp_hook = NULL; | ||
| 148 | } | 151 | } |
diff --git a/arch/mips/math-emu/cp1emu.c b/arch/mips/math-emu/cp1emu.c index 506925b2c3f3..0b4e2e38294b 100644 --- a/arch/mips/math-emu/cp1emu.c +++ b/arch/mips/math-emu/cp1emu.c | |||
| @@ -1538,10 +1538,10 @@ static int fpux_emu(struct pt_regs *xcp, struct mips_fpu_struct *ctx, | |||
| 1538 | break; | 1538 | break; |
| 1539 | } | 1539 | } |
| 1540 | 1540 | ||
| 1541 | case 0x7: /* 7 */ | 1541 | case 0x3: |
| 1542 | if (MIPSInst_FUNC(ir) != pfetch_op) { | 1542 | if (MIPSInst_FUNC(ir) != pfetch_op) |
| 1543 | return SIGILL; | 1543 | return SIGILL; |
| 1544 | } | 1544 | |
| 1545 | /* ignore prefx operation */ | 1545 | /* ignore prefx operation */ |
| 1546 | break; | 1546 | break; |
| 1547 | 1547 | ||
diff --git a/arch/mips/mti-malta/malta-amon.c b/arch/mips/mti-malta/malta-amon.c index 592ac0427426..84ac523b0ce0 100644 --- a/arch/mips/mti-malta/malta-amon.c +++ b/arch/mips/mti-malta/malta-amon.c | |||
| @@ -72,7 +72,7 @@ int amon_cpu_start(int cpu, | |||
| 72 | return 0; | 72 | return 0; |
| 73 | } | 73 | } |
| 74 | 74 | ||
| 75 | #ifdef CONFIG_MIPS_VPE_LOADER | 75 | #ifdef CONFIG_MIPS_VPE_LOADER_CMP |
| 76 | int vpe_run(struct vpe *v) | 76 | int vpe_run(struct vpe *v) |
| 77 | { | 77 | { |
| 78 | struct vpe_notifications *n; | 78 | struct vpe_notifications *n; |
diff --git a/arch/mips/mti-malta/malta-int.c b/arch/mips/mti-malta/malta-int.c index ca3e3a46a42f..2242181a6284 100644 --- a/arch/mips/mti-malta/malta-int.c +++ b/arch/mips/mti-malta/malta-int.c | |||
| @@ -119,7 +119,7 @@ static void malta_hw0_irqdispatch(void) | |||
| 119 | 119 | ||
| 120 | do_IRQ(MALTA_INT_BASE + irq); | 120 | do_IRQ(MALTA_INT_BASE + irq); |
| 121 | 121 | ||
| 122 | #ifdef MIPS_VPE_APSP_API | 122 | #ifdef CONFIG_MIPS_VPE_APSP_API_MT |
| 123 | if (aprp_hook) | 123 | if (aprp_hook) |
| 124 | aprp_hook(); | 124 | aprp_hook(); |
| 125 | #endif | 125 | #endif |
| @@ -310,7 +310,7 @@ static void ipi_call_dispatch(void) | |||
| 310 | 310 | ||
| 311 | static irqreturn_t ipi_resched_interrupt(int irq, void *dev_id) | 311 | static irqreturn_t ipi_resched_interrupt(int irq, void *dev_id) |
| 312 | { | 312 | { |
| 313 | #ifdef MIPS_VPE_APSP_API | 313 | #ifdef CONFIG_MIPS_VPE_APSP_API_CMP |
| 314 | if (aprp_hook) | 314 | if (aprp_hook) |
| 315 | aprp_hook(); | 315 | aprp_hook(); |
| 316 | #endif | 316 | #endif |
diff --git a/arch/mips/pci/msi-octeon.c b/arch/mips/pci/msi-octeon.c index d37be36dc659..2b91b0e61566 100644 --- a/arch/mips/pci/msi-octeon.c +++ b/arch/mips/pci/msi-octeon.c | |||
| @@ -150,6 +150,7 @@ msi_irq_allocated: | |||
| 150 | msg.address_lo = | 150 | msg.address_lo = |
| 151 | ((128ul << 20) + CVMX_PCI_MSI_RCV) & 0xffffffff; | 151 | ((128ul << 20) + CVMX_PCI_MSI_RCV) & 0xffffffff; |
| 152 | msg.address_hi = ((128ul << 20) + CVMX_PCI_MSI_RCV) >> 32; | 152 | msg.address_hi = ((128ul << 20) + CVMX_PCI_MSI_RCV) >> 32; |
| 153 | break; | ||
| 153 | case OCTEON_DMA_BAR_TYPE_BIG: | 154 | case OCTEON_DMA_BAR_TYPE_BIG: |
| 154 | /* When using big bar, Bar 0 is based at 0 */ | 155 | /* When using big bar, Bar 0 is based at 0 */ |
| 155 | msg.address_lo = (0 + CVMX_PCI_MSI_RCV) & 0xffffffff; | 156 | msg.address_lo = (0 + CVMX_PCI_MSI_RCV) & 0xffffffff; |
diff --git a/arch/parisc/include/asm/page.h b/arch/parisc/include/asm/page.h index 637fe031aa84..60d5d174dfe4 100644 --- a/arch/parisc/include/asm/page.h +++ b/arch/parisc/include/asm/page.h | |||
| @@ -32,17 +32,6 @@ void copy_page_asm(void *to, void *from); | |||
| 32 | void copy_user_page(void *vto, void *vfrom, unsigned long vaddr, | 32 | void copy_user_page(void *vto, void *vfrom, unsigned long vaddr, |
| 33 | struct page *pg); | 33 | struct page *pg); |
| 34 | 34 | ||
| 35 | /* #define CONFIG_PARISC_TMPALIAS */ | ||
| 36 | |||
| 37 | #ifdef CONFIG_PARISC_TMPALIAS | ||
| 38 | void clear_user_highpage(struct page *page, unsigned long vaddr); | ||
| 39 | #define clear_user_highpage clear_user_highpage | ||
| 40 | struct vm_area_struct; | ||
| 41 | void copy_user_highpage(struct page *to, struct page *from, | ||
| 42 | unsigned long vaddr, struct vm_area_struct *vma); | ||
| 43 | #define __HAVE_ARCH_COPY_USER_HIGHPAGE | ||
| 44 | #endif | ||
| 45 | |||
| 46 | /* | 35 | /* |
| 47 | * These are used to make use of C type-checking.. | 36 | * These are used to make use of C type-checking.. |
| 48 | */ | 37 | */ |
diff --git a/arch/parisc/include/asm/spinlock.h b/arch/parisc/include/asm/spinlock.h index 3516e0b27044..64f2992e439f 100644 --- a/arch/parisc/include/asm/spinlock.h +++ b/arch/parisc/include/asm/spinlock.h | |||
| @@ -191,8 +191,4 @@ static __inline__ int arch_write_can_lock(arch_rwlock_t *rw) | |||
| 191 | #define arch_read_lock_flags(lock, flags) arch_read_lock(lock) | 191 | #define arch_read_lock_flags(lock, flags) arch_read_lock(lock) |
| 192 | #define arch_write_lock_flags(lock, flags) arch_write_lock(lock) | 192 | #define arch_write_lock_flags(lock, flags) arch_write_lock(lock) |
| 193 | 193 | ||
| 194 | #define arch_spin_relax(lock) cpu_relax() | ||
| 195 | #define arch_read_relax(lock) cpu_relax() | ||
| 196 | #define arch_write_relax(lock) cpu_relax() | ||
| 197 | |||
| 198 | #endif /* __ASM_SPINLOCK_H */ | 194 | #endif /* __ASM_SPINLOCK_H */ |
diff --git a/arch/parisc/include/uapi/asm/unistd.h b/arch/parisc/include/uapi/asm/unistd.h index 42706794a36f..265ae5190b0a 100644 --- a/arch/parisc/include/uapi/asm/unistd.h +++ b/arch/parisc/include/uapi/asm/unistd.h | |||
| @@ -828,13 +828,13 @@ | |||
| 828 | #define __NR_finit_module (__NR_Linux + 333) | 828 | #define __NR_finit_module (__NR_Linux + 333) |
| 829 | #define __NR_sched_setattr (__NR_Linux + 334) | 829 | #define __NR_sched_setattr (__NR_Linux + 334) |
| 830 | #define __NR_sched_getattr (__NR_Linux + 335) | 830 | #define __NR_sched_getattr (__NR_Linux + 335) |
| 831 | #define __NR_utimes (__NR_Linux + 336) | ||
| 831 | 832 | ||
| 832 | #define __NR_Linux_syscalls (__NR_sched_getattr + 1) | 833 | #define __NR_Linux_syscalls (__NR_utimes + 1) |
| 833 | 834 | ||
| 834 | 835 | ||
| 835 | #define __IGNORE_select /* newselect */ | 836 | #define __IGNORE_select /* newselect */ |
| 836 | #define __IGNORE_fadvise64 /* fadvise64_64 */ | 837 | #define __IGNORE_fadvise64 /* fadvise64_64 */ |
| 837 | #define __IGNORE_utimes /* utime */ | ||
| 838 | 838 | ||
| 839 | 839 | ||
| 840 | #define HPUX_GATEWAY_ADDR 0xC0000004 | 840 | #define HPUX_GATEWAY_ADDR 0xC0000004 |
diff --git a/arch/parisc/kernel/cache.c b/arch/parisc/kernel/cache.c index ac87a40502e6..a6ffc775a9f8 100644 --- a/arch/parisc/kernel/cache.c +++ b/arch/parisc/kernel/cache.c | |||
| @@ -581,67 +581,3 @@ flush_cache_page(struct vm_area_struct *vma, unsigned long vmaddr, unsigned long | |||
| 581 | __flush_cache_page(vma, vmaddr, PFN_PHYS(pfn)); | 581 | __flush_cache_page(vma, vmaddr, PFN_PHYS(pfn)); |
| 582 | } | 582 | } |
| 583 | } | 583 | } |
| 584 | |||
| 585 | #ifdef CONFIG_PARISC_TMPALIAS | ||
| 586 | |||
| 587 | void clear_user_highpage(struct page *page, unsigned long vaddr) | ||
| 588 | { | ||
| 589 | void *vto; | ||
| 590 | unsigned long flags; | ||
| 591 | |||
| 592 | /* Clear using TMPALIAS region. The page doesn't need to | ||
| 593 | be flushed but the kernel mapping needs to be purged. */ | ||
| 594 | |||
| 595 | vto = kmap_atomic(page); | ||
| 596 | |||
| 597 | /* The PA-RISC 2.0 Architecture book states on page F-6: | ||
| 598 | "Before a write-capable translation is enabled, *all* | ||
| 599 | non-equivalently-aliased translations must be removed | ||
| 600 | from the page table and purged from the TLB. (Note | ||
| 601 | that the caches are not required to be flushed at this | ||
| 602 | time.) Before any non-equivalent aliased translation | ||
| 603 | is re-enabled, the virtual address range for the writeable | ||
| 604 | page (the entire page) must be flushed from the cache, | ||
| 605 | and the write-capable translation removed from the page | ||
| 606 | table and purged from the TLB." */ | ||
| 607 | |||
| 608 | purge_kernel_dcache_page_asm((unsigned long)vto); | ||
| 609 | purge_tlb_start(flags); | ||
| 610 | pdtlb_kernel(vto); | ||
| 611 | purge_tlb_end(flags); | ||
| 612 | preempt_disable(); | ||
| 613 | clear_user_page_asm(vto, vaddr); | ||
| 614 | preempt_enable(); | ||
| 615 | |||
| 616 | pagefault_enable(); /* kunmap_atomic(addr, KM_USER0); */ | ||
| 617 | } | ||
| 618 | |||
| 619 | void copy_user_highpage(struct page *to, struct page *from, | ||
| 620 | unsigned long vaddr, struct vm_area_struct *vma) | ||
| 621 | { | ||
| 622 | void *vfrom, *vto; | ||
| 623 | unsigned long flags; | ||
| 624 | |||
| 625 | /* Copy using TMPALIAS region. This has the advantage | ||
| 626 | that the `from' page doesn't need to be flushed. However, | ||
| 627 | the `to' page must be flushed in copy_user_page_asm since | ||
| 628 | it can be used to bring in executable code. */ | ||
| 629 | |||
| 630 | vfrom = kmap_atomic(from); | ||
| 631 | vto = kmap_atomic(to); | ||
| 632 | |||
| 633 | purge_kernel_dcache_page_asm((unsigned long)vto); | ||
| 634 | purge_tlb_start(flags); | ||
| 635 | pdtlb_kernel(vto); | ||
| 636 | pdtlb_kernel(vfrom); | ||
| 637 | purge_tlb_end(flags); | ||
| 638 | preempt_disable(); | ||
| 639 | copy_user_page_asm(vto, vfrom, vaddr); | ||
| 640 | flush_dcache_page_asm(__pa(vto), vaddr); | ||
| 641 | preempt_enable(); | ||
| 642 | |||
| 643 | pagefault_enable(); /* kunmap_atomic(addr, KM_USER1); */ | ||
| 644 | pagefault_enable(); /* kunmap_atomic(addr, KM_USER0); */ | ||
| 645 | } | ||
| 646 | |||
| 647 | #endif /* CONFIG_PARISC_TMPALIAS */ | ||
diff --git a/arch/parisc/kernel/syscall_table.S b/arch/parisc/kernel/syscall_table.S index 8fa3fbb3e4d3..80e5dd248934 100644 --- a/arch/parisc/kernel/syscall_table.S +++ b/arch/parisc/kernel/syscall_table.S | |||
| @@ -431,6 +431,7 @@ | |||
| 431 | ENTRY_SAME(finit_module) | 431 | ENTRY_SAME(finit_module) |
| 432 | ENTRY_SAME(sched_setattr) | 432 | ENTRY_SAME(sched_setattr) |
| 433 | ENTRY_SAME(sched_getattr) /* 335 */ | 433 | ENTRY_SAME(sched_getattr) /* 335 */ |
| 434 | ENTRY_COMP(utimes) | ||
| 434 | 435 | ||
| 435 | /* Nothing yet */ | 436 | /* Nothing yet */ |
| 436 | 437 | ||
diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S index e66d4ec04d95..818dce344e82 100644 --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S | |||
| @@ -1504,73 +1504,6 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) | |||
| 1504 | 1: addi r8,r8,16 | 1504 | 1: addi r8,r8,16 |
| 1505 | .endr | 1505 | .endr |
| 1506 | 1506 | ||
| 1507 | /* Save DEC */ | ||
| 1508 | mfspr r5,SPRN_DEC | ||
| 1509 | mftb r6 | ||
| 1510 | extsw r5,r5 | ||
| 1511 | add r5,r5,r6 | ||
| 1512 | std r5,VCPU_DEC_EXPIRES(r9) | ||
| 1513 | |||
| 1514 | BEGIN_FTR_SECTION | ||
| 1515 | b 8f | ||
| 1516 | END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S) | ||
| 1517 | /* Turn on TM so we can access TFHAR/TFIAR/TEXASR */ | ||
| 1518 | mfmsr r8 | ||
| 1519 | li r0, 1 | ||
| 1520 | rldimi r8, r0, MSR_TM_LG, 63-MSR_TM_LG | ||
| 1521 | mtmsrd r8 | ||
| 1522 | |||
| 1523 | /* Save POWER8-specific registers */ | ||
| 1524 | mfspr r5, SPRN_IAMR | ||
| 1525 | mfspr r6, SPRN_PSPB | ||
| 1526 | mfspr r7, SPRN_FSCR | ||
| 1527 | std r5, VCPU_IAMR(r9) | ||
| 1528 | stw r6, VCPU_PSPB(r9) | ||
| 1529 | std r7, VCPU_FSCR(r9) | ||
| 1530 | mfspr r5, SPRN_IC | ||
| 1531 | mfspr r6, SPRN_VTB | ||
| 1532 | mfspr r7, SPRN_TAR | ||
| 1533 | std r5, VCPU_IC(r9) | ||
| 1534 | std r6, VCPU_VTB(r9) | ||
| 1535 | std r7, VCPU_TAR(r9) | ||
| 1536 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
| 1537 | mfspr r5, SPRN_TFHAR | ||
| 1538 | mfspr r6, SPRN_TFIAR | ||
| 1539 | mfspr r7, SPRN_TEXASR | ||
| 1540 | std r5, VCPU_TFHAR(r9) | ||
| 1541 | std r6, VCPU_TFIAR(r9) | ||
| 1542 | std r7, VCPU_TEXASR(r9) | ||
| 1543 | #endif | ||
| 1544 | mfspr r8, SPRN_EBBHR | ||
| 1545 | std r8, VCPU_EBBHR(r9) | ||
| 1546 | mfspr r5, SPRN_EBBRR | ||
| 1547 | mfspr r6, SPRN_BESCR | ||
| 1548 | mfspr r7, SPRN_CSIGR | ||
| 1549 | mfspr r8, SPRN_TACR | ||
| 1550 | std r5, VCPU_EBBRR(r9) | ||
| 1551 | std r6, VCPU_BESCR(r9) | ||
| 1552 | std r7, VCPU_CSIGR(r9) | ||
| 1553 | std r8, VCPU_TACR(r9) | ||
| 1554 | mfspr r5, SPRN_TCSCR | ||
| 1555 | mfspr r6, SPRN_ACOP | ||
| 1556 | mfspr r7, SPRN_PID | ||
| 1557 | mfspr r8, SPRN_WORT | ||
| 1558 | std r5, VCPU_TCSCR(r9) | ||
| 1559 | std r6, VCPU_ACOP(r9) | ||
| 1560 | stw r7, VCPU_GUEST_PID(r9) | ||
| 1561 | std r8, VCPU_WORT(r9) | ||
| 1562 | 8: | ||
| 1563 | |||
| 1564 | /* Save and reset AMR and UAMOR before turning on the MMU */ | ||
| 1565 | BEGIN_FTR_SECTION | ||
| 1566 | mfspr r5,SPRN_AMR | ||
| 1567 | mfspr r6,SPRN_UAMOR | ||
| 1568 | std r5,VCPU_AMR(r9) | ||
| 1569 | std r6,VCPU_UAMOR(r9) | ||
| 1570 | li r6,0 | ||
| 1571 | mtspr SPRN_AMR,r6 | ||
| 1572 | END_FTR_SECTION_IFSET(CPU_FTR_ARCH_206) | ||
| 1573 | |||
| 1574 | /* Unset guest mode */ | 1507 | /* Unset guest mode */ |
| 1575 | li r0, KVM_GUEST_MODE_NONE | 1508 | li r0, KVM_GUEST_MODE_NONE |
| 1576 | stb r0, HSTATE_IN_GUEST(r13) | 1509 | stb r0, HSTATE_IN_GUEST(r13) |
| @@ -2203,7 +2136,7 @@ BEGIN_FTR_SECTION | |||
| 2203 | END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) | 2136 | END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) |
| 2204 | #endif | 2137 | #endif |
| 2205 | mfspr r6,SPRN_VRSAVE | 2138 | mfspr r6,SPRN_VRSAVE |
| 2206 | stw r6,VCPU_VRSAVE(r3) | 2139 | stw r6,VCPU_VRSAVE(r31) |
| 2207 | mtlr r30 | 2140 | mtlr r30 |
| 2208 | mtmsrd r5 | 2141 | mtmsrd r5 |
| 2209 | isync | 2142 | isync |
| @@ -2240,7 +2173,7 @@ BEGIN_FTR_SECTION | |||
| 2240 | bl .load_vr_state | 2173 | bl .load_vr_state |
| 2241 | END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) | 2174 | END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) |
| 2242 | #endif | 2175 | #endif |
| 2243 | lwz r7,VCPU_VRSAVE(r4) | 2176 | lwz r7,VCPU_VRSAVE(r31) |
| 2244 | mtspr SPRN_VRSAVE,r7 | 2177 | mtspr SPRN_VRSAVE,r7 |
| 2245 | mtlr r30 | 2178 | mtlr r30 |
| 2246 | mr r4,r31 | 2179 | mr r4,r31 |
diff --git a/arch/sparc/kernel/process_64.c b/arch/sparc/kernel/process_64.c index 32a280ec38c1..d7b4967f8fa6 100644 --- a/arch/sparc/kernel/process_64.c +++ b/arch/sparc/kernel/process_64.c | |||
| @@ -58,9 +58,12 @@ void arch_cpu_idle(void) | |||
| 58 | { | 58 | { |
| 59 | if (tlb_type != hypervisor) { | 59 | if (tlb_type != hypervisor) { |
| 60 | touch_nmi_watchdog(); | 60 | touch_nmi_watchdog(); |
| 61 | local_irq_enable(); | ||
| 61 | } else { | 62 | } else { |
| 62 | unsigned long pstate; | 63 | unsigned long pstate; |
| 63 | 64 | ||
| 65 | local_irq_enable(); | ||
| 66 | |||
| 64 | /* The sun4v sleeping code requires that we have PSTATE.IE cleared over | 67 | /* The sun4v sleeping code requires that we have PSTATE.IE cleared over |
| 65 | * the cpu sleep hypervisor call. | 68 | * the cpu sleep hypervisor call. |
| 66 | */ | 69 | */ |
| @@ -82,7 +85,6 @@ void arch_cpu_idle(void) | |||
| 82 | : "=&r" (pstate) | 85 | : "=&r" (pstate) |
| 83 | : "i" (PSTATE_IE)); | 86 | : "i" (PSTATE_IE)); |
| 84 | } | 87 | } |
| 85 | local_irq_enable(); | ||
| 86 | } | 88 | } |
| 87 | 89 | ||
| 88 | #ifdef CONFIG_HOTPLUG_CPU | 90 | #ifdef CONFIG_HOTPLUG_CPU |
diff --git a/arch/sparc/kernel/syscalls.S b/arch/sparc/kernel/syscalls.S index 87729fff13b9..33a17e7b3ccd 100644 --- a/arch/sparc/kernel/syscalls.S +++ b/arch/sparc/kernel/syscalls.S | |||
| @@ -189,7 +189,8 @@ linux_sparc_syscall32: | |||
| 189 | mov %i0, %l5 ! IEU1 | 189 | mov %i0, %l5 ! IEU1 |
| 190 | 5: call %l7 ! CTI Group brk forced | 190 | 5: call %l7 ! CTI Group brk forced |
| 191 | srl %i5, 0, %o5 ! IEU1 | 191 | srl %i5, 0, %o5 ! IEU1 |
| 192 | ba,a,pt %xcc, 3f | 192 | ba,pt %xcc, 3f |
| 193 | sra %o0, 0, %o0 | ||
| 193 | 194 | ||
| 194 | /* Linux native system calls enter here... */ | 195 | /* Linux native system calls enter here... */ |
| 195 | .align 32 | 196 | .align 32 |
| @@ -217,7 +218,6 @@ linux_sparc_syscall: | |||
| 217 | 3: stx %o0, [%sp + PTREGS_OFF + PT_V9_I0] | 218 | 3: stx %o0, [%sp + PTREGS_OFF + PT_V9_I0] |
| 218 | ret_sys_call: | 219 | ret_sys_call: |
| 219 | ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %g3 | 220 | ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %g3 |
| 220 | sra %o0, 0, %o0 | ||
| 221 | mov %ulo(TSTATE_XCARRY | TSTATE_ICARRY), %g2 | 221 | mov %ulo(TSTATE_XCARRY | TSTATE_ICARRY), %g2 |
| 222 | sllx %g2, 32, %g2 | 222 | sllx %g2, 32, %g2 |
| 223 | 223 | ||
diff --git a/arch/sparc/mm/tsb.c b/arch/sparc/mm/tsb.c index 3b3a360b429a..f5d506fdddad 100644 --- a/arch/sparc/mm/tsb.c +++ b/arch/sparc/mm/tsb.c | |||
| @@ -273,7 +273,7 @@ void __init pgtable_cache_init(void) | |||
| 273 | prom_halt(); | 273 | prom_halt(); |
| 274 | } | 274 | } |
| 275 | 275 | ||
| 276 | for (i = 0; i < 8; i++) { | 276 | for (i = 0; i < ARRAY_SIZE(tsb_cache_names); i++) { |
| 277 | unsigned long size = 8192 << i; | 277 | unsigned long size = 8192 << i; |
| 278 | const char *name = tsb_cache_names[i]; | 278 | const char *name = tsb_cache_names[i]; |
| 279 | 279 | ||
diff --git a/arch/x86/kernel/aperture_64.c b/arch/x86/kernel/aperture_64.c index fd972a3e4cbb..9fa8aa051f54 100644 --- a/arch/x86/kernel/aperture_64.c +++ b/arch/x86/kernel/aperture_64.c | |||
| @@ -18,7 +18,6 @@ | |||
| 18 | #include <linux/pci_ids.h> | 18 | #include <linux/pci_ids.h> |
| 19 | #include <linux/pci.h> | 19 | #include <linux/pci.h> |
| 20 | #include <linux/bitops.h> | 20 | #include <linux/bitops.h> |
| 21 | #include <linux/ioport.h> | ||
| 22 | #include <linux/suspend.h> | 21 | #include <linux/suspend.h> |
| 23 | #include <asm/e820.h> | 22 | #include <asm/e820.h> |
| 24 | #include <asm/io.h> | 23 | #include <asm/io.h> |
| @@ -54,18 +53,6 @@ int fallback_aper_force __initdata; | |||
| 54 | 53 | ||
| 55 | int fix_aperture __initdata = 1; | 54 | int fix_aperture __initdata = 1; |
| 56 | 55 | ||
| 57 | static struct resource gart_resource = { | ||
| 58 | .name = "GART", | ||
| 59 | .flags = IORESOURCE_MEM, | ||
| 60 | }; | ||
| 61 | |||
| 62 | static void __init insert_aperture_resource(u32 aper_base, u32 aper_size) | ||
| 63 | { | ||
| 64 | gart_resource.start = aper_base; | ||
| 65 | gart_resource.end = aper_base + aper_size - 1; | ||
| 66 | insert_resource(&iomem_resource, &gart_resource); | ||
| 67 | } | ||
| 68 | |||
| 69 | /* This code runs before the PCI subsystem is initialized, so just | 56 | /* This code runs before the PCI subsystem is initialized, so just |
| 70 | access the northbridge directly. */ | 57 | access the northbridge directly. */ |
| 71 | 58 | ||
| @@ -96,7 +83,6 @@ static u32 __init allocate_aperture(void) | |||
| 96 | memblock_reserve(addr, aper_size); | 83 | memblock_reserve(addr, aper_size); |
| 97 | printk(KERN_INFO "Mapping aperture over %d KB of RAM @ %lx\n", | 84 | printk(KERN_INFO "Mapping aperture over %d KB of RAM @ %lx\n", |
| 98 | aper_size >> 10, addr); | 85 | aper_size >> 10, addr); |
| 99 | insert_aperture_resource((u32)addr, aper_size); | ||
| 100 | register_nosave_region(addr >> PAGE_SHIFT, | 86 | register_nosave_region(addr >> PAGE_SHIFT, |
| 101 | (addr+aper_size) >> PAGE_SHIFT); | 87 | (addr+aper_size) >> PAGE_SHIFT); |
| 102 | 88 | ||
| @@ -444,12 +430,8 @@ int __init gart_iommu_hole_init(void) | |||
| 444 | 430 | ||
| 445 | out: | 431 | out: |
| 446 | if (!fix && !fallback_aper_force) { | 432 | if (!fix && !fallback_aper_force) { |
| 447 | if (last_aper_base) { | 433 | if (last_aper_base) |
| 448 | unsigned long n = (32 * 1024 * 1024) << last_aper_order; | ||
| 449 | |||
| 450 | insert_aperture_resource((u32)last_aper_base, n); | ||
| 451 | return 1; | 434 | return 1; |
| 452 | } | ||
| 453 | return 0; | 435 | return 0; |
| 454 | } | 436 | } |
| 455 | 437 | ||
diff --git a/block/blk-core.c b/block/blk-core.c index 853f92749202..bfe16d5af9f9 100644 --- a/block/blk-core.c +++ b/block/blk-core.c | |||
| @@ -693,20 +693,11 @@ blk_init_queue_node(request_fn_proc *rfn, spinlock_t *lock, int node_id) | |||
| 693 | if (!uninit_q) | 693 | if (!uninit_q) |
| 694 | return NULL; | 694 | return NULL; |
| 695 | 695 | ||
| 696 | uninit_q->flush_rq = kzalloc(sizeof(struct request), GFP_KERNEL); | ||
| 697 | if (!uninit_q->flush_rq) | ||
| 698 | goto out_cleanup_queue; | ||
| 699 | |||
| 700 | q = blk_init_allocated_queue(uninit_q, rfn, lock); | 696 | q = blk_init_allocated_queue(uninit_q, rfn, lock); |
| 701 | if (!q) | 697 | if (!q) |
| 702 | goto out_free_flush_rq; | 698 | blk_cleanup_queue(uninit_q); |
| 703 | return q; | ||
| 704 | 699 | ||
| 705 | out_free_flush_rq: | 700 | return q; |
| 706 | kfree(uninit_q->flush_rq); | ||
| 707 | out_cleanup_queue: | ||
| 708 | blk_cleanup_queue(uninit_q); | ||
| 709 | return NULL; | ||
| 710 | } | 701 | } |
| 711 | EXPORT_SYMBOL(blk_init_queue_node); | 702 | EXPORT_SYMBOL(blk_init_queue_node); |
| 712 | 703 | ||
| @@ -717,9 +708,13 @@ blk_init_allocated_queue(struct request_queue *q, request_fn_proc *rfn, | |||
| 717 | if (!q) | 708 | if (!q) |
| 718 | return NULL; | 709 | return NULL; |
| 719 | 710 | ||
| 720 | if (blk_init_rl(&q->root_rl, q, GFP_KERNEL)) | 711 | q->flush_rq = kzalloc(sizeof(struct request), GFP_KERNEL); |
| 712 | if (!q->flush_rq) | ||
| 721 | return NULL; | 713 | return NULL; |
| 722 | 714 | ||
| 715 | if (blk_init_rl(&q->root_rl, q, GFP_KERNEL)) | ||
| 716 | goto fail; | ||
| 717 | |||
| 723 | q->request_fn = rfn; | 718 | q->request_fn = rfn; |
| 724 | q->prep_rq_fn = NULL; | 719 | q->prep_rq_fn = NULL; |
| 725 | q->unprep_rq_fn = NULL; | 720 | q->unprep_rq_fn = NULL; |
| @@ -742,12 +737,16 @@ blk_init_allocated_queue(struct request_queue *q, request_fn_proc *rfn, | |||
| 742 | /* init elevator */ | 737 | /* init elevator */ |
| 743 | if (elevator_init(q, NULL)) { | 738 | if (elevator_init(q, NULL)) { |
| 744 | mutex_unlock(&q->sysfs_lock); | 739 | mutex_unlock(&q->sysfs_lock); |
| 745 | return NULL; | 740 | goto fail; |
| 746 | } | 741 | } |
| 747 | 742 | ||
| 748 | mutex_unlock(&q->sysfs_lock); | 743 | mutex_unlock(&q->sysfs_lock); |
| 749 | 744 | ||
| 750 | return q; | 745 | return q; |
| 746 | |||
| 747 | fail: | ||
| 748 | kfree(q->flush_rq); | ||
| 749 | return NULL; | ||
| 751 | } | 750 | } |
| 752 | EXPORT_SYMBOL(blk_init_allocated_queue); | 751 | EXPORT_SYMBOL(blk_init_allocated_queue); |
| 753 | 752 | ||
diff --git a/block/blk-flush.c b/block/blk-flush.c index f598f794c3c6..43e6b4755e9a 100644 --- a/block/blk-flush.c +++ b/block/blk-flush.c | |||
| @@ -140,14 +140,17 @@ static void mq_flush_run(struct work_struct *work) | |||
| 140 | blk_mq_insert_request(rq, false, true, false); | 140 | blk_mq_insert_request(rq, false, true, false); |
| 141 | } | 141 | } |
| 142 | 142 | ||
| 143 | static bool blk_flush_queue_rq(struct request *rq) | 143 | static bool blk_flush_queue_rq(struct request *rq, bool add_front) |
| 144 | { | 144 | { |
| 145 | if (rq->q->mq_ops) { | 145 | if (rq->q->mq_ops) { |
| 146 | INIT_WORK(&rq->mq_flush_work, mq_flush_run); | 146 | INIT_WORK(&rq->mq_flush_work, mq_flush_run); |
| 147 | kblockd_schedule_work(rq->q, &rq->mq_flush_work); | 147 | kblockd_schedule_work(rq->q, &rq->mq_flush_work); |
| 148 | return false; | 148 | return false; |
| 149 | } else { | 149 | } else { |
| 150 | list_add_tail(&rq->queuelist, &rq->q->queue_head); | 150 | if (add_front) |
| 151 | list_add(&rq->queuelist, &rq->q->queue_head); | ||
| 152 | else | ||
| 153 | list_add_tail(&rq->queuelist, &rq->q->queue_head); | ||
| 151 | return true; | 154 | return true; |
| 152 | } | 155 | } |
| 153 | } | 156 | } |
| @@ -193,7 +196,7 @@ static bool blk_flush_complete_seq(struct request *rq, unsigned int seq, | |||
| 193 | 196 | ||
| 194 | case REQ_FSEQ_DATA: | 197 | case REQ_FSEQ_DATA: |
| 195 | list_move_tail(&rq->flush.list, &q->flush_data_in_flight); | 198 | list_move_tail(&rq->flush.list, &q->flush_data_in_flight); |
| 196 | queued = blk_flush_queue_rq(rq); | 199 | queued = blk_flush_queue_rq(rq, true); |
| 197 | break; | 200 | break; |
| 198 | 201 | ||
| 199 | case REQ_FSEQ_DONE: | 202 | case REQ_FSEQ_DONE: |
| @@ -326,7 +329,7 @@ static bool blk_kick_flush(struct request_queue *q) | |||
| 326 | q->flush_rq->rq_disk = first_rq->rq_disk; | 329 | q->flush_rq->rq_disk = first_rq->rq_disk; |
| 327 | q->flush_rq->end_io = flush_end_io; | 330 | q->flush_rq->end_io = flush_end_io; |
| 328 | 331 | ||
| 329 | return blk_flush_queue_rq(q->flush_rq); | 332 | return blk_flush_queue_rq(q->flush_rq, false); |
| 330 | } | 333 | } |
| 331 | 334 | ||
| 332 | static void flush_data_end_io(struct request *rq, int error) | 335 | static void flush_data_end_io(struct request *rq, int error) |
diff --git a/drivers/block/mtip32xx/mtip32xx.c b/drivers/block/mtip32xx/mtip32xx.c index 516026954be6..d777bb7cea93 100644 --- a/drivers/block/mtip32xx/mtip32xx.c +++ b/drivers/block/mtip32xx/mtip32xx.c | |||
| @@ -4498,7 +4498,7 @@ static int mtip_pci_probe(struct pci_dev *pdev, | |||
| 4498 | } | 4498 | } |
| 4499 | dev_info(&pdev->dev, "NUMA node %d (closest: %d,%d, probe on %d:%d)\n", | 4499 | dev_info(&pdev->dev, "NUMA node %d (closest: %d,%d, probe on %d:%d)\n", |
| 4500 | my_node, pcibus_to_node(pdev->bus), dev_to_node(&pdev->dev), | 4500 | my_node, pcibus_to_node(pdev->bus), dev_to_node(&pdev->dev), |
| 4501 | cpu_to_node(smp_processor_id()), smp_processor_id()); | 4501 | cpu_to_node(raw_smp_processor_id()), raw_smp_processor_id()); |
| 4502 | 4502 | ||
| 4503 | dd = kzalloc_node(sizeof(struct driver_data), GFP_KERNEL, my_node); | 4503 | dd = kzalloc_node(sizeof(struct driver_data), GFP_KERNEL, my_node); |
| 4504 | if (dd == NULL) { | 4504 | if (dd == NULL) { |
diff --git a/drivers/clocksource/vf_pit_timer.c b/drivers/clocksource/vf_pit_timer.c index 02821b06a39e..a918bc481c52 100644 --- a/drivers/clocksource/vf_pit_timer.c +++ b/drivers/clocksource/vf_pit_timer.c | |||
| @@ -54,7 +54,7 @@ static inline void pit_irq_acknowledge(void) | |||
| 54 | 54 | ||
| 55 | static u64 pit_read_sched_clock(void) | 55 | static u64 pit_read_sched_clock(void) |
| 56 | { | 56 | { |
| 57 | return __raw_readl(clksrc_base + PITCVAL); | 57 | return ~__raw_readl(clksrc_base + PITCVAL); |
| 58 | } | 58 | } |
| 59 | 59 | ||
| 60 | static int __init pit_clocksource_init(unsigned long rate) | 60 | static int __init pit_clocksource_init(unsigned long rate) |
diff --git a/drivers/gpu/drm/drm_pci.c b/drivers/gpu/drm/drm_pci.c index 5736aaa7e86c..f7af69bcf3f4 100644 --- a/drivers/gpu/drm/drm_pci.c +++ b/drivers/gpu/drm/drm_pci.c | |||
| @@ -468,8 +468,8 @@ void drm_pci_exit(struct drm_driver *driver, struct pci_driver *pdriver) | |||
| 468 | } else { | 468 | } else { |
| 469 | list_for_each_entry_safe(dev, tmp, &driver->legacy_dev_list, | 469 | list_for_each_entry_safe(dev, tmp, &driver->legacy_dev_list, |
| 470 | legacy_dev_list) { | 470 | legacy_dev_list) { |
| 471 | drm_put_dev(dev); | ||
| 472 | list_del(&dev->legacy_dev_list); | 471 | list_del(&dev->legacy_dev_list); |
| 472 | drm_put_dev(dev); | ||
| 473 | } | 473 | } |
| 474 | } | 474 | } |
| 475 | DRM_INFO("Module unloaded\n"); | 475 | DRM_INFO("Module unloaded\n"); |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c index 215131ab1dd2..c204b4e3356e 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_drv.c +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c | |||
| @@ -172,20 +172,24 @@ static int exynos_drm_open(struct drm_device *dev, struct drm_file *file) | |||
| 172 | 172 | ||
| 173 | ret = exynos_drm_subdrv_open(dev, file); | 173 | ret = exynos_drm_subdrv_open(dev, file); |
| 174 | if (ret) | 174 | if (ret) |
| 175 | goto out; | 175 | goto err_file_priv_free; |
| 176 | 176 | ||
| 177 | anon_filp = anon_inode_getfile("exynos_gem", &exynos_drm_gem_fops, | 177 | anon_filp = anon_inode_getfile("exynos_gem", &exynos_drm_gem_fops, |
| 178 | NULL, 0); | 178 | NULL, 0); |
| 179 | if (IS_ERR(anon_filp)) { | 179 | if (IS_ERR(anon_filp)) { |
| 180 | ret = PTR_ERR(anon_filp); | 180 | ret = PTR_ERR(anon_filp); |
| 181 | goto out; | 181 | goto err_subdrv_close; |
| 182 | } | 182 | } |
| 183 | 183 | ||
| 184 | anon_filp->f_mode = FMODE_READ | FMODE_WRITE; | 184 | anon_filp->f_mode = FMODE_READ | FMODE_WRITE; |
| 185 | file_priv->anon_filp = anon_filp; | 185 | file_priv->anon_filp = anon_filp; |
| 186 | 186 | ||
| 187 | return ret; | 187 | return ret; |
| 188 | out: | 188 | |
| 189 | err_subdrv_close: | ||
| 190 | exynos_drm_subdrv_close(dev, file); | ||
| 191 | |||
| 192 | err_file_priv_free: | ||
| 189 | kfree(file_priv); | 193 | kfree(file_priv); |
| 190 | file->driver_priv = NULL; | 194 | file->driver_priv = NULL; |
| 191 | return ret; | 195 | return ret; |
diff --git a/drivers/gpu/drm/i915/i915_gem_stolen.c b/drivers/gpu/drm/i915/i915_gem_stolen.c index d58b4e287e32..28d24caa49f3 100644 --- a/drivers/gpu/drm/i915/i915_gem_stolen.c +++ b/drivers/gpu/drm/i915/i915_gem_stolen.c | |||
| @@ -214,6 +214,13 @@ int i915_gem_init_stolen(struct drm_device *dev) | |||
| 214 | struct drm_i915_private *dev_priv = dev->dev_private; | 214 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 215 | int bios_reserved = 0; | 215 | int bios_reserved = 0; |
| 216 | 216 | ||
| 217 | #ifdef CONFIG_INTEL_IOMMU | ||
| 218 | if (intel_iommu_gfx_mapped) { | ||
| 219 | DRM_INFO("DMAR active, disabling use of stolen memory\n"); | ||
| 220 | return 0; | ||
| 221 | } | ||
| 222 | #endif | ||
| 223 | |||
| 217 | if (dev_priv->gtt.stolen_size == 0) | 224 | if (dev_priv->gtt.stolen_size == 0) |
| 218 | return 0; | 225 | return 0; |
| 219 | 226 | ||
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 9fec71175571..d554169ac592 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
| @@ -618,33 +618,25 @@ static u32 gm45_get_vblank_counter(struct drm_device *dev, int pipe) | |||
| 618 | 618 | ||
| 619 | /* raw reads, only for fast reads of display block, no need for forcewake etc. */ | 619 | /* raw reads, only for fast reads of display block, no need for forcewake etc. */ |
| 620 | #define __raw_i915_read32(dev_priv__, reg__) readl((dev_priv__)->regs + (reg__)) | 620 | #define __raw_i915_read32(dev_priv__, reg__) readl((dev_priv__)->regs + (reg__)) |
| 621 | #define __raw_i915_read16(dev_priv__, reg__) readw((dev_priv__)->regs + (reg__)) | ||
| 622 | 621 | ||
| 623 | static bool ilk_pipe_in_vblank_locked(struct drm_device *dev, enum pipe pipe) | 622 | static bool ilk_pipe_in_vblank_locked(struct drm_device *dev, enum pipe pipe) |
| 624 | { | 623 | { |
| 625 | struct drm_i915_private *dev_priv = dev->dev_private; | 624 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 626 | uint32_t status; | 625 | uint32_t status; |
| 627 | 626 | int reg; | |
| 628 | if (INTEL_INFO(dev)->gen < 7) { | 627 | |
| 629 | status = pipe == PIPE_A ? | 628 | if (INTEL_INFO(dev)->gen >= 8) { |
| 630 | DE_PIPEA_VBLANK : | 629 | status = GEN8_PIPE_VBLANK; |
| 631 | DE_PIPEB_VBLANK; | 630 | reg = GEN8_DE_PIPE_ISR(pipe); |
| 631 | } else if (INTEL_INFO(dev)->gen >= 7) { | ||
| 632 | status = DE_PIPE_VBLANK_IVB(pipe); | ||
| 633 | reg = DEISR; | ||
| 632 | } else { | 634 | } else { |
| 633 | switch (pipe) { | 635 | status = DE_PIPE_VBLANK(pipe); |
| 634 | default: | 636 | reg = DEISR; |
| 635 | case PIPE_A: | ||
| 636 | status = DE_PIPEA_VBLANK_IVB; | ||
| 637 | break; | ||
| 638 | case PIPE_B: | ||
| 639 | status = DE_PIPEB_VBLANK_IVB; | ||
| 640 | break; | ||
| 641 | case PIPE_C: | ||
| 642 | status = DE_PIPEC_VBLANK_IVB; | ||
| 643 | break; | ||
| 644 | } | ||
| 645 | } | 637 | } |
| 646 | 638 | ||
| 647 | return __raw_i915_read32(dev_priv, DEISR) & status; | 639 | return __raw_i915_read32(dev_priv, reg) & status; |
| 648 | } | 640 | } |
| 649 | 641 | ||
| 650 | static int i915_get_crtc_scanoutpos(struct drm_device *dev, int pipe, | 642 | static int i915_get_crtc_scanoutpos(struct drm_device *dev, int pipe, |
| @@ -702,7 +694,28 @@ static int i915_get_crtc_scanoutpos(struct drm_device *dev, int pipe, | |||
| 702 | else | 694 | else |
| 703 | position = __raw_i915_read32(dev_priv, PIPEDSL(pipe)) & DSL_LINEMASK_GEN3; | 695 | position = __raw_i915_read32(dev_priv, PIPEDSL(pipe)) & DSL_LINEMASK_GEN3; |
| 704 | 696 | ||
| 705 | if (HAS_PCH_SPLIT(dev)) { | 697 | if (HAS_DDI(dev)) { |
| 698 | /* | ||
| 699 | * On HSW HDMI outputs there seems to be a 2 line | ||
| 700 | * difference, whereas eDP has the normal 1 line | ||
| 701 | * difference that earlier platforms have. External | ||
| 702 | * DP is unknown. For now just check for the 2 line | ||
| 703 | * difference case on all output types on HSW+. | ||
| 704 | * | ||
| 705 | * This might misinterpret the scanline counter being | ||
| 706 | * one line too far along on eDP, but that's less | ||
| 707 | * dangerous than the alternative since that would lead | ||
| 708 | * the vblank timestamp code astray when it sees a | ||
| 709 | * scanline count before vblank_start during a vblank | ||
| 710 | * interrupt. | ||
| 711 | */ | ||
| 712 | in_vbl = ilk_pipe_in_vblank_locked(dev, pipe); | ||
| 713 | if ((in_vbl && (position == vbl_start - 2 || | ||
| 714 | position == vbl_start - 1)) || | ||
| 715 | (!in_vbl && (position == vbl_end - 2 || | ||
| 716 | position == vbl_end - 1))) | ||
| 717 | position = (position + 2) % vtotal; | ||
| 718 | } else if (HAS_PCH_SPLIT(dev)) { | ||
| 706 | /* | 719 | /* |
| 707 | * The scanline counter increments at the leading edge | 720 | * The scanline counter increments at the leading edge |
| 708 | * of hsync, ie. it completely misses the active portion | 721 | * of hsync, ie. it completely misses the active portion |
| @@ -2769,10 +2782,9 @@ static void ibx_irq_postinstall(struct drm_device *dev) | |||
| 2769 | return; | 2782 | return; |
| 2770 | 2783 | ||
| 2771 | if (HAS_PCH_IBX(dev)) { | 2784 | if (HAS_PCH_IBX(dev)) { |
| 2772 | mask = SDE_GMBUS | SDE_AUX_MASK | SDE_TRANSB_FIFO_UNDER | | 2785 | mask = SDE_GMBUS | SDE_AUX_MASK | SDE_POISON; |
| 2773 | SDE_TRANSA_FIFO_UNDER | SDE_POISON; | ||
| 2774 | } else { | 2786 | } else { |
| 2775 | mask = SDE_GMBUS_CPT | SDE_AUX_MASK_CPT | SDE_ERROR_CPT; | 2787 | mask = SDE_GMBUS_CPT | SDE_AUX_MASK_CPT; |
| 2776 | 2788 | ||
| 2777 | I915_WRITE(SERR_INT, I915_READ(SERR_INT)); | 2789 | I915_WRITE(SERR_INT, I915_READ(SERR_INT)); |
| 2778 | } | 2790 | } |
| @@ -2832,20 +2844,19 @@ static int ironlake_irq_postinstall(struct drm_device *dev) | |||
| 2832 | display_mask = (DE_MASTER_IRQ_CONTROL | DE_GSE_IVB | | 2844 | display_mask = (DE_MASTER_IRQ_CONTROL | DE_GSE_IVB | |
| 2833 | DE_PCH_EVENT_IVB | DE_PLANEC_FLIP_DONE_IVB | | 2845 | DE_PCH_EVENT_IVB | DE_PLANEC_FLIP_DONE_IVB | |
| 2834 | DE_PLANEB_FLIP_DONE_IVB | | 2846 | DE_PLANEB_FLIP_DONE_IVB | |
| 2835 | DE_PLANEA_FLIP_DONE_IVB | DE_AUX_CHANNEL_A_IVB | | 2847 | DE_PLANEA_FLIP_DONE_IVB | DE_AUX_CHANNEL_A_IVB); |
| 2836 | DE_ERR_INT_IVB); | ||
| 2837 | extra_mask = (DE_PIPEC_VBLANK_IVB | DE_PIPEB_VBLANK_IVB | | 2848 | extra_mask = (DE_PIPEC_VBLANK_IVB | DE_PIPEB_VBLANK_IVB | |
| 2838 | DE_PIPEA_VBLANK_IVB); | 2849 | DE_PIPEA_VBLANK_IVB | DE_ERR_INT_IVB); |
| 2839 | 2850 | ||
| 2840 | I915_WRITE(GEN7_ERR_INT, I915_READ(GEN7_ERR_INT)); | 2851 | I915_WRITE(GEN7_ERR_INT, I915_READ(GEN7_ERR_INT)); |
| 2841 | } else { | 2852 | } else { |
| 2842 | display_mask = (DE_MASTER_IRQ_CONTROL | DE_GSE | DE_PCH_EVENT | | 2853 | display_mask = (DE_MASTER_IRQ_CONTROL | DE_GSE | DE_PCH_EVENT | |
| 2843 | DE_PLANEA_FLIP_DONE | DE_PLANEB_FLIP_DONE | | 2854 | DE_PLANEA_FLIP_DONE | DE_PLANEB_FLIP_DONE | |
| 2844 | DE_AUX_CHANNEL_A | | 2855 | DE_AUX_CHANNEL_A | |
| 2845 | DE_PIPEB_FIFO_UNDERRUN | DE_PIPEA_FIFO_UNDERRUN | | ||
| 2846 | DE_PIPEB_CRC_DONE | DE_PIPEA_CRC_DONE | | 2856 | DE_PIPEB_CRC_DONE | DE_PIPEA_CRC_DONE | |
| 2847 | DE_POISON); | 2857 | DE_POISON); |
| 2848 | extra_mask = DE_PIPEA_VBLANK | DE_PIPEB_VBLANK | DE_PCU_EVENT; | 2858 | extra_mask = DE_PIPEA_VBLANK | DE_PIPEB_VBLANK | DE_PCU_EVENT | |
| 2859 | DE_PIPEB_FIFO_UNDERRUN | DE_PIPEA_FIFO_UNDERRUN; | ||
| 2849 | } | 2860 | } |
| 2850 | 2861 | ||
| 2851 | dev_priv->irq_mask = ~display_mask; | 2862 | dev_priv->irq_mask = ~display_mask; |
| @@ -2961,9 +2972,9 @@ static void gen8_de_irq_postinstall(struct drm_i915_private *dev_priv) | |||
| 2961 | struct drm_device *dev = dev_priv->dev; | 2972 | struct drm_device *dev = dev_priv->dev; |
| 2962 | uint32_t de_pipe_masked = GEN8_PIPE_FLIP_DONE | | 2973 | uint32_t de_pipe_masked = GEN8_PIPE_FLIP_DONE | |
| 2963 | GEN8_PIPE_CDCLK_CRC_DONE | | 2974 | GEN8_PIPE_CDCLK_CRC_DONE | |
| 2964 | GEN8_PIPE_FIFO_UNDERRUN | | ||
| 2965 | GEN8_DE_PIPE_IRQ_FAULT_ERRORS; | 2975 | GEN8_DE_PIPE_IRQ_FAULT_ERRORS; |
| 2966 | uint32_t de_pipe_enables = de_pipe_masked | GEN8_PIPE_VBLANK; | 2976 | uint32_t de_pipe_enables = de_pipe_masked | GEN8_PIPE_VBLANK | |
| 2977 | GEN8_PIPE_FIFO_UNDERRUN; | ||
| 2967 | int pipe; | 2978 | int pipe; |
| 2968 | dev_priv->de_irq_mask[PIPE_A] = ~de_pipe_masked; | 2979 | dev_priv->de_irq_mask[PIPE_A] = ~de_pipe_masked; |
| 2969 | dev_priv->de_irq_mask[PIPE_B] = ~de_pipe_masked; | 2980 | dev_priv->de_irq_mask[PIPE_B] = ~de_pipe_masked; |
diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c index e06b9e017d6b..234ac5f7bc5a 100644 --- a/drivers/gpu/drm/i915/intel_ddi.c +++ b/drivers/gpu/drm/i915/intel_ddi.c | |||
| @@ -1244,6 +1244,7 @@ static void intel_ddi_post_disable(struct intel_encoder *intel_encoder) | |||
| 1244 | if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP) { | 1244 | if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP) { |
| 1245 | struct intel_dp *intel_dp = enc_to_intel_dp(encoder); | 1245 | struct intel_dp *intel_dp = enc_to_intel_dp(encoder); |
| 1246 | intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_OFF); | 1246 | intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_OFF); |
| 1247 | ironlake_edp_panel_vdd_on(intel_dp); | ||
| 1247 | ironlake_edp_panel_off(intel_dp); | 1248 | ironlake_edp_panel_off(intel_dp); |
| 1248 | } | 1249 | } |
| 1249 | 1250 | ||
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 57552eb386b0..2688f6d64bb9 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
| @@ -1249,17 +1249,24 @@ void ironlake_edp_panel_off(struct intel_dp *intel_dp) | |||
| 1249 | 1249 | ||
| 1250 | DRM_DEBUG_KMS("Turn eDP power off\n"); | 1250 | DRM_DEBUG_KMS("Turn eDP power off\n"); |
| 1251 | 1251 | ||
| 1252 | WARN(!intel_dp->want_panel_vdd, "Need VDD to turn off panel\n"); | ||
| 1253 | |||
| 1252 | pp = ironlake_get_pp_control(intel_dp); | 1254 | pp = ironlake_get_pp_control(intel_dp); |
| 1253 | /* We need to switch off panel power _and_ force vdd, for otherwise some | 1255 | /* We need to switch off panel power _and_ force vdd, for otherwise some |
| 1254 | * panels get very unhappy and cease to work. */ | 1256 | * panels get very unhappy and cease to work. */ |
| 1255 | pp &= ~(POWER_TARGET_ON | PANEL_POWER_RESET | EDP_BLC_ENABLE); | 1257 | pp &= ~(POWER_TARGET_ON | EDP_FORCE_VDD | PANEL_POWER_RESET | EDP_BLC_ENABLE); |
| 1256 | 1258 | ||
| 1257 | pp_ctrl_reg = _pp_ctrl_reg(intel_dp); | 1259 | pp_ctrl_reg = _pp_ctrl_reg(intel_dp); |
| 1258 | 1260 | ||
| 1259 | I915_WRITE(pp_ctrl_reg, pp); | 1261 | I915_WRITE(pp_ctrl_reg, pp); |
| 1260 | POSTING_READ(pp_ctrl_reg); | 1262 | POSTING_READ(pp_ctrl_reg); |
| 1261 | 1263 | ||
| 1264 | intel_dp->want_panel_vdd = false; | ||
| 1265 | |||
| 1262 | ironlake_wait_panel_off(intel_dp); | 1266 | ironlake_wait_panel_off(intel_dp); |
| 1267 | |||
| 1268 | /* We got a reference when we enabled the VDD. */ | ||
| 1269 | intel_runtime_pm_put(dev_priv); | ||
| 1263 | } | 1270 | } |
| 1264 | 1271 | ||
| 1265 | void ironlake_edp_backlight_on(struct intel_dp *intel_dp) | 1272 | void ironlake_edp_backlight_on(struct intel_dp *intel_dp) |
| @@ -1639,7 +1646,7 @@ static void intel_edp_psr_enable_source(struct intel_dp *intel_dp) | |||
| 1639 | val |= EDP_PSR_LINK_DISABLE; | 1646 | val |= EDP_PSR_LINK_DISABLE; |
| 1640 | 1647 | ||
| 1641 | I915_WRITE(EDP_PSR_CTL(dev), val | | 1648 | I915_WRITE(EDP_PSR_CTL(dev), val | |
| 1642 | IS_BROADWELL(dev) ? 0 : link_entry_time | | 1649 | (IS_BROADWELL(dev) ? 0 : link_entry_time) | |
| 1643 | max_sleep_time << EDP_PSR_MAX_SLEEP_TIME_SHIFT | | 1650 | max_sleep_time << EDP_PSR_MAX_SLEEP_TIME_SHIFT | |
| 1644 | idle_frames << EDP_PSR_IDLE_FRAME_SHIFT | | 1651 | idle_frames << EDP_PSR_IDLE_FRAME_SHIFT | |
| 1645 | EDP_PSR_ENABLE); | 1652 | EDP_PSR_ENABLE); |
| @@ -1784,6 +1791,7 @@ static void intel_disable_dp(struct intel_encoder *encoder) | |||
| 1784 | 1791 | ||
| 1785 | /* Make sure the panel is off before trying to change the mode. But also | 1792 | /* Make sure the panel is off before trying to change the mode. But also |
| 1786 | * ensure that we have vdd while we switch off the panel. */ | 1793 | * ensure that we have vdd while we switch off the panel. */ |
| 1794 | ironlake_edp_panel_vdd_on(intel_dp); | ||
| 1787 | ironlake_edp_backlight_off(intel_dp); | 1795 | ironlake_edp_backlight_off(intel_dp); |
| 1788 | intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_OFF); | 1796 | intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_OFF); |
| 1789 | ironlake_edp_panel_off(intel_dp); | 1797 | ironlake_edp_panel_off(intel_dp); |
diff --git a/drivers/hid/hid-lg4ff.c b/drivers/hid/hid-lg4ff.c index befe0e336471..24883b4d1a49 100644 --- a/drivers/hid/hid-lg4ff.c +++ b/drivers/hid/hid-lg4ff.c | |||
| @@ -43,6 +43,7 @@ | |||
| 43 | #define G25_REV_MIN 0x22 | 43 | #define G25_REV_MIN 0x22 |
| 44 | #define G27_REV_MAJ 0x12 | 44 | #define G27_REV_MAJ 0x12 |
| 45 | #define G27_REV_MIN 0x38 | 45 | #define G27_REV_MIN 0x38 |
| 46 | #define G27_2_REV_MIN 0x39 | ||
| 46 | 47 | ||
| 47 | #define to_hid_device(pdev) container_of(pdev, struct hid_device, dev) | 48 | #define to_hid_device(pdev) container_of(pdev, struct hid_device, dev) |
| 48 | 49 | ||
| @@ -130,6 +131,7 @@ static const struct lg4ff_usb_revision lg4ff_revs[] = { | |||
| 130 | {DFP_REV_MAJ, DFP_REV_MIN, &native_dfp}, /* Driving Force Pro */ | 131 | {DFP_REV_MAJ, DFP_REV_MIN, &native_dfp}, /* Driving Force Pro */ |
| 131 | {G25_REV_MAJ, G25_REV_MIN, &native_g25}, /* G25 */ | 132 | {G25_REV_MAJ, G25_REV_MIN, &native_g25}, /* G25 */ |
| 132 | {G27_REV_MAJ, G27_REV_MIN, &native_g27}, /* G27 */ | 133 | {G27_REV_MAJ, G27_REV_MIN, &native_g27}, /* G27 */ |
| 134 | {G27_REV_MAJ, G27_2_REV_MIN, &native_g27}, /* G27 v2 */ | ||
| 133 | }; | 135 | }; |
| 134 | 136 | ||
| 135 | /* Recalculates X axis value accordingly to currently selected range */ | 137 | /* Recalculates X axis value accordingly to currently selected range */ |
diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c index 12354055d474..2f19b15f47f2 100644 --- a/drivers/hid/hid-sony.c +++ b/drivers/hid/hid-sony.c | |||
| @@ -42,6 +42,7 @@ | |||
| 42 | #define DUALSHOCK4_CONTROLLER_BT BIT(6) | 42 | #define DUALSHOCK4_CONTROLLER_BT BIT(6) |
| 43 | 43 | ||
| 44 | #define SONY_LED_SUPPORT (SIXAXIS_CONTROLLER_USB | BUZZ_CONTROLLER | DUALSHOCK4_CONTROLLER_USB) | 44 | #define SONY_LED_SUPPORT (SIXAXIS_CONTROLLER_USB | BUZZ_CONTROLLER | DUALSHOCK4_CONTROLLER_USB) |
| 45 | #define SONY_FF_SUPPORT (SIXAXIS_CONTROLLER_USB | DUALSHOCK4_CONTROLLER_USB) | ||
| 45 | 46 | ||
| 46 | #define MAX_LEDS 4 | 47 | #define MAX_LEDS 4 |
| 47 | 48 | ||
| @@ -499,6 +500,7 @@ struct sony_sc { | |||
| 499 | __u8 right; | 500 | __u8 right; |
| 500 | #endif | 501 | #endif |
| 501 | 502 | ||
| 503 | __u8 worker_initialized; | ||
| 502 | __u8 led_state[MAX_LEDS]; | 504 | __u8 led_state[MAX_LEDS]; |
| 503 | __u8 led_count; | 505 | __u8 led_count; |
| 504 | }; | 506 | }; |
| @@ -993,22 +995,11 @@ static int sony_init_ff(struct hid_device *hdev) | |||
| 993 | return input_ff_create_memless(input_dev, NULL, sony_play_effect); | 995 | return input_ff_create_memless(input_dev, NULL, sony_play_effect); |
| 994 | } | 996 | } |
| 995 | 997 | ||
| 996 | static void sony_destroy_ff(struct hid_device *hdev) | ||
| 997 | { | ||
| 998 | struct sony_sc *sc = hid_get_drvdata(hdev); | ||
| 999 | |||
| 1000 | cancel_work_sync(&sc->state_worker); | ||
| 1001 | } | ||
| 1002 | |||
| 1003 | #else | 998 | #else |
| 1004 | static int sony_init_ff(struct hid_device *hdev) | 999 | static int sony_init_ff(struct hid_device *hdev) |
| 1005 | { | 1000 | { |
| 1006 | return 0; | 1001 | return 0; |
| 1007 | } | 1002 | } |
| 1008 | |||
| 1009 | static void sony_destroy_ff(struct hid_device *hdev) | ||
| 1010 | { | ||
| 1011 | } | ||
| 1012 | #endif | 1003 | #endif |
| 1013 | 1004 | ||
| 1014 | static int sony_set_output_report(struct sony_sc *sc, int req_id, int req_size) | 1005 | static int sony_set_output_report(struct sony_sc *sc, int req_id, int req_size) |
| @@ -1077,6 +1068,8 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id) | |||
| 1077 | if (sc->quirks & SIXAXIS_CONTROLLER_USB) { | 1068 | if (sc->quirks & SIXAXIS_CONTROLLER_USB) { |
| 1078 | hdev->hid_output_raw_report = sixaxis_usb_output_raw_report; | 1069 | hdev->hid_output_raw_report = sixaxis_usb_output_raw_report; |
| 1079 | ret = sixaxis_set_operational_usb(hdev); | 1070 | ret = sixaxis_set_operational_usb(hdev); |
| 1071 | |||
| 1072 | sc->worker_initialized = 1; | ||
| 1080 | INIT_WORK(&sc->state_worker, sixaxis_state_worker); | 1073 | INIT_WORK(&sc->state_worker, sixaxis_state_worker); |
| 1081 | } | 1074 | } |
| 1082 | else if (sc->quirks & SIXAXIS_CONTROLLER_BT) | 1075 | else if (sc->quirks & SIXAXIS_CONTROLLER_BT) |
| @@ -1087,6 +1080,7 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id) | |||
| 1087 | if (ret < 0) | 1080 | if (ret < 0) |
| 1088 | goto err_stop; | 1081 | goto err_stop; |
| 1089 | 1082 | ||
| 1083 | sc->worker_initialized = 1; | ||
| 1090 | INIT_WORK(&sc->state_worker, dualshock4_state_worker); | 1084 | INIT_WORK(&sc->state_worker, dualshock4_state_worker); |
| 1091 | } else { | 1085 | } else { |
| 1092 | ret = 0; | 1086 | ret = 0; |
| @@ -1101,9 +1095,11 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id) | |||
| 1101 | goto err_stop; | 1095 | goto err_stop; |
| 1102 | } | 1096 | } |
| 1103 | 1097 | ||
| 1104 | ret = sony_init_ff(hdev); | 1098 | if (sc->quirks & SONY_FF_SUPPORT) { |
| 1105 | if (ret < 0) | 1099 | ret = sony_init_ff(hdev); |
| 1106 | goto err_stop; | 1100 | if (ret < 0) |
| 1101 | goto err_stop; | ||
| 1102 | } | ||
| 1107 | 1103 | ||
| 1108 | return 0; | 1104 | return 0; |
| 1109 | err_stop: | 1105 | err_stop: |
| @@ -1120,7 +1116,8 @@ static void sony_remove(struct hid_device *hdev) | |||
| 1120 | if (sc->quirks & SONY_LED_SUPPORT) | 1116 | if (sc->quirks & SONY_LED_SUPPORT) |
| 1121 | sony_leds_remove(hdev); | 1117 | sony_leds_remove(hdev); |
| 1122 | 1118 | ||
| 1123 | sony_destroy_ff(hdev); | 1119 | if (sc->worker_initialized) |
| 1120 | cancel_work_sync(&sc->state_worker); | ||
| 1124 | 1121 | ||
| 1125 | hid_hw_stop(hdev); | 1122 | hid_hw_stop(hdev); |
| 1126 | } | 1123 | } |
diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c index cb0137b3718d..ab24ce2eb28f 100644 --- a/drivers/hid/hidraw.c +++ b/drivers/hid/hidraw.c | |||
| @@ -320,13 +320,13 @@ static void drop_ref(struct hidraw *hidraw, int exists_bit) | |||
| 320 | hid_hw_close(hidraw->hid); | 320 | hid_hw_close(hidraw->hid); |
| 321 | wake_up_interruptible(&hidraw->wait); | 321 | wake_up_interruptible(&hidraw->wait); |
| 322 | } | 322 | } |
| 323 | device_destroy(hidraw_class, | ||
| 324 | MKDEV(hidraw_major, hidraw->minor)); | ||
| 323 | } else { | 325 | } else { |
| 324 | --hidraw->open; | 326 | --hidraw->open; |
| 325 | } | 327 | } |
| 326 | if (!hidraw->open) { | 328 | if (!hidraw->open) { |
| 327 | if (!hidraw->exist) { | 329 | if (!hidraw->exist) { |
| 328 | device_destroy(hidraw_class, | ||
| 329 | MKDEV(hidraw_major, hidraw->minor)); | ||
| 330 | hidraw_table[hidraw->minor] = NULL; | 330 | hidraw_table[hidraw->minor] = NULL; |
| 331 | kfree(hidraw); | 331 | kfree(hidraw); |
| 332 | } else { | 332 | } else { |
diff --git a/drivers/isdn/capi/Kconfig b/drivers/isdn/capi/Kconfig index f04686580040..9816c51eb5c2 100644 --- a/drivers/isdn/capi/Kconfig +++ b/drivers/isdn/capi/Kconfig | |||
| @@ -16,9 +16,17 @@ config CAPI_TRACE | |||
| 16 | This will increase the size of the kernelcapi module by 20 KB. | 16 | This will increase the size of the kernelcapi module by 20 KB. |
| 17 | If unsure, say Y. | 17 | If unsure, say Y. |
| 18 | 18 | ||
| 19 | config ISDN_CAPI_CAPI20 | ||
| 20 | tristate "CAPI2.0 /dev/capi support" | ||
| 21 | help | ||
| 22 | This option will provide the CAPI 2.0 interface to userspace | ||
| 23 | applications via /dev/capi20. Applications should use the | ||
| 24 | standardized libcapi20 to access this functionality. You should say | ||
| 25 | Y/M here. | ||
| 26 | |||
| 19 | config ISDN_CAPI_MIDDLEWARE | 27 | config ISDN_CAPI_MIDDLEWARE |
| 20 | bool "CAPI2.0 Middleware support" | 28 | bool "CAPI2.0 Middleware support" |
| 21 | depends on TTY | 29 | depends on ISDN_CAPI_CAPI20 && TTY |
| 22 | help | 30 | help |
| 23 | This option will enhance the capabilities of the /dev/capi20 | 31 | This option will enhance the capabilities of the /dev/capi20 |
| 24 | interface. It will provide a means of moving a data connection, | 32 | interface. It will provide a means of moving a data connection, |
| @@ -26,14 +34,6 @@ config ISDN_CAPI_MIDDLEWARE | |||
| 26 | device. If you want to use pppd with pppdcapiplugin to dial up to | 34 | device. If you want to use pppd with pppdcapiplugin to dial up to |
| 27 | your ISP, say Y here. | 35 | your ISP, say Y here. |
| 28 | 36 | ||
| 29 | config ISDN_CAPI_CAPI20 | ||
| 30 | tristate "CAPI2.0 /dev/capi support" | ||
| 31 | help | ||
| 32 | This option will provide the CAPI 2.0 interface to userspace | ||
| 33 | applications via /dev/capi20. Applications should use the | ||
| 34 | standardized libcapi20 to access this functionality. You should say | ||
| 35 | Y/M here. | ||
| 36 | |||
| 37 | config ISDN_CAPI_CAPIDRV | 37 | config ISDN_CAPI_CAPIDRV |
| 38 | tristate "CAPI2.0 capidrv interface support" | 38 | tristate "CAPI2.0 capidrv interface support" |
| 39 | depends on ISDN_I4L | 39 | depends on ISDN_I4L |
diff --git a/drivers/net/ethernet/atheros/alx/main.c b/drivers/net/ethernet/atheros/alx/main.c index 2e45f6ec1bf0..380d24922049 100644 --- a/drivers/net/ethernet/atheros/alx/main.c +++ b/drivers/net/ethernet/atheros/alx/main.c | |||
| @@ -1248,19 +1248,13 @@ static int alx_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 1248 | * shared register for the high 32 bits, so only a single, aligned, | 1248 | * shared register for the high 32 bits, so only a single, aligned, |
| 1249 | * 4 GB physical address range can be used for descriptors. | 1249 | * 4 GB physical address range can be used for descriptors. |
| 1250 | */ | 1250 | */ |
| 1251 | if (!dma_set_mask(&pdev->dev, DMA_BIT_MASK(64)) && | 1251 | if (!dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64))) { |
| 1252 | !dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(64))) { | ||
| 1253 | dev_dbg(&pdev->dev, "DMA to 64-BIT addresses\n"); | 1252 | dev_dbg(&pdev->dev, "DMA to 64-BIT addresses\n"); |
| 1254 | } else { | 1253 | } else { |
| 1255 | err = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32)); | 1254 | err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); |
| 1256 | if (err) { | 1255 | if (err) { |
| 1257 | err = dma_set_coherent_mask(&pdev->dev, | 1256 | dev_err(&pdev->dev, "No usable DMA config, aborting\n"); |
| 1258 | DMA_BIT_MASK(32)); | 1257 | goto out_pci_disable; |
| 1259 | if (err) { | ||
| 1260 | dev_err(&pdev->dev, | ||
| 1261 | "No usable DMA config, aborting\n"); | ||
| 1262 | goto out_pci_disable; | ||
| 1263 | } | ||
| 1264 | } | 1258 | } |
| 1265 | } | 1259 | } |
| 1266 | 1260 | ||
diff --git a/drivers/net/ethernet/atheros/atl1e/atl1e_main.c b/drivers/net/ethernet/atheros/atl1e/atl1e_main.c index d5c2d3e912e5..422aab27ea1b 100644 --- a/drivers/net/ethernet/atheros/atl1e/atl1e_main.c +++ b/drivers/net/ethernet/atheros/atl1e/atl1e_main.c | |||
| @@ -2436,7 +2436,7 @@ err_reset: | |||
| 2436 | err_register: | 2436 | err_register: |
| 2437 | err_sw_init: | 2437 | err_sw_init: |
| 2438 | err_eeprom: | 2438 | err_eeprom: |
| 2439 | iounmap(adapter->hw.hw_addr); | 2439 | pci_iounmap(pdev, adapter->hw.hw_addr); |
| 2440 | err_init_netdev: | 2440 | err_init_netdev: |
| 2441 | err_ioremap: | 2441 | err_ioremap: |
| 2442 | free_netdev(netdev); | 2442 | free_netdev(netdev); |
| @@ -2474,7 +2474,7 @@ static void atl1e_remove(struct pci_dev *pdev) | |||
| 2474 | unregister_netdev(netdev); | 2474 | unregister_netdev(netdev); |
| 2475 | atl1e_free_ring_resources(adapter); | 2475 | atl1e_free_ring_resources(adapter); |
| 2476 | atl1e_force_ps(&adapter->hw); | 2476 | atl1e_force_ps(&adapter->hw); |
| 2477 | iounmap(adapter->hw.hw_addr); | 2477 | pci_iounmap(pdev, adapter->hw.hw_addr); |
| 2478 | pci_release_regions(pdev); | 2478 | pci_release_regions(pdev); |
| 2479 | free_netdev(netdev); | 2479 | free_netdev(netdev); |
| 2480 | pci_disable_device(pdev); | 2480 | pci_disable_device(pdev); |
diff --git a/drivers/net/ethernet/broadcom/cnic.c b/drivers/net/ethernet/broadcom/cnic.c index fcf9105a5476..09f3fefcbf9c 100644 --- a/drivers/net/ethernet/broadcom/cnic.c +++ b/drivers/net/ethernet/broadcom/cnic.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* cnic.c: Broadcom CNIC core network driver. | 1 | /* cnic.c: Broadcom CNIC core network driver. |
| 2 | * | 2 | * |
| 3 | * Copyright (c) 2006-2013 Broadcom Corporation | 3 | * Copyright (c) 2006-2014 Broadcom Corporation |
| 4 | * | 4 | * |
| 5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
| 6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
| @@ -342,7 +342,7 @@ static int cnic_send_nlmsg(struct cnic_local *cp, u32 type, | |||
| 342 | while (retry < 3) { | 342 | while (retry < 3) { |
| 343 | rc = 0; | 343 | rc = 0; |
| 344 | rcu_read_lock(); | 344 | rcu_read_lock(); |
| 345 | ulp_ops = rcu_dereference(cnic_ulp_tbl[CNIC_ULP_ISCSI]); | 345 | ulp_ops = rcu_dereference(cp->ulp_ops[CNIC_ULP_ISCSI]); |
| 346 | if (ulp_ops) | 346 | if (ulp_ops) |
| 347 | rc = ulp_ops->iscsi_nl_send_msg( | 347 | rc = ulp_ops->iscsi_nl_send_msg( |
| 348 | cp->ulp_handle[CNIC_ULP_ISCSI], | 348 | cp->ulp_handle[CNIC_ULP_ISCSI], |
| @@ -726,7 +726,7 @@ static void cnic_free_dma(struct cnic_dev *dev, struct cnic_dma *dma) | |||
| 726 | 726 | ||
| 727 | for (i = 0; i < dma->num_pages; i++) { | 727 | for (i = 0; i < dma->num_pages; i++) { |
| 728 | if (dma->pg_arr[i]) { | 728 | if (dma->pg_arr[i]) { |
| 729 | dma_free_coherent(&dev->pcidev->dev, BNX2_PAGE_SIZE, | 729 | dma_free_coherent(&dev->pcidev->dev, CNIC_PAGE_SIZE, |
| 730 | dma->pg_arr[i], dma->pg_map_arr[i]); | 730 | dma->pg_arr[i], dma->pg_map_arr[i]); |
| 731 | dma->pg_arr[i] = NULL; | 731 | dma->pg_arr[i] = NULL; |
| 732 | } | 732 | } |
| @@ -785,7 +785,7 @@ static int cnic_alloc_dma(struct cnic_dev *dev, struct cnic_dma *dma, | |||
| 785 | 785 | ||
| 786 | for (i = 0; i < pages; i++) { | 786 | for (i = 0; i < pages; i++) { |
| 787 | dma->pg_arr[i] = dma_alloc_coherent(&dev->pcidev->dev, | 787 | dma->pg_arr[i] = dma_alloc_coherent(&dev->pcidev->dev, |
| 788 | BNX2_PAGE_SIZE, | 788 | CNIC_PAGE_SIZE, |
| 789 | &dma->pg_map_arr[i], | 789 | &dma->pg_map_arr[i], |
| 790 | GFP_ATOMIC); | 790 | GFP_ATOMIC); |
| 791 | if (dma->pg_arr[i] == NULL) | 791 | if (dma->pg_arr[i] == NULL) |
| @@ -794,8 +794,8 @@ static int cnic_alloc_dma(struct cnic_dev *dev, struct cnic_dma *dma, | |||
| 794 | if (!use_pg_tbl) | 794 | if (!use_pg_tbl) |
| 795 | return 0; | 795 | return 0; |
| 796 | 796 | ||
| 797 | dma->pgtbl_size = ((pages * 8) + BNX2_PAGE_SIZE - 1) & | 797 | dma->pgtbl_size = ((pages * 8) + CNIC_PAGE_SIZE - 1) & |
| 798 | ~(BNX2_PAGE_SIZE - 1); | 798 | ~(CNIC_PAGE_SIZE - 1); |
| 799 | dma->pgtbl = dma_alloc_coherent(&dev->pcidev->dev, dma->pgtbl_size, | 799 | dma->pgtbl = dma_alloc_coherent(&dev->pcidev->dev, dma->pgtbl_size, |
| 800 | &dma->pgtbl_map, GFP_ATOMIC); | 800 | &dma->pgtbl_map, GFP_ATOMIC); |
| 801 | if (dma->pgtbl == NULL) | 801 | if (dma->pgtbl == NULL) |
| @@ -900,8 +900,8 @@ static int cnic_alloc_context(struct cnic_dev *dev) | |||
| 900 | if (BNX2_CHIP(cp) == BNX2_CHIP_5709) { | 900 | if (BNX2_CHIP(cp) == BNX2_CHIP_5709) { |
| 901 | int i, k, arr_size; | 901 | int i, k, arr_size; |
| 902 | 902 | ||
| 903 | cp->ctx_blk_size = BNX2_PAGE_SIZE; | 903 | cp->ctx_blk_size = CNIC_PAGE_SIZE; |
| 904 | cp->cids_per_blk = BNX2_PAGE_SIZE / 128; | 904 | cp->cids_per_blk = CNIC_PAGE_SIZE / 128; |
| 905 | arr_size = BNX2_MAX_CID / cp->cids_per_blk * | 905 | arr_size = BNX2_MAX_CID / cp->cids_per_blk * |
| 906 | sizeof(struct cnic_ctx); | 906 | sizeof(struct cnic_ctx); |
| 907 | cp->ctx_arr = kzalloc(arr_size, GFP_KERNEL); | 907 | cp->ctx_arr = kzalloc(arr_size, GFP_KERNEL); |
| @@ -933,7 +933,7 @@ static int cnic_alloc_context(struct cnic_dev *dev) | |||
| 933 | for (i = 0; i < cp->ctx_blks; i++) { | 933 | for (i = 0; i < cp->ctx_blks; i++) { |
| 934 | cp->ctx_arr[i].ctx = | 934 | cp->ctx_arr[i].ctx = |
| 935 | dma_alloc_coherent(&dev->pcidev->dev, | 935 | dma_alloc_coherent(&dev->pcidev->dev, |
| 936 | BNX2_PAGE_SIZE, | 936 | CNIC_PAGE_SIZE, |
| 937 | &cp->ctx_arr[i].mapping, | 937 | &cp->ctx_arr[i].mapping, |
| 938 | GFP_KERNEL); | 938 | GFP_KERNEL); |
| 939 | if (cp->ctx_arr[i].ctx == NULL) | 939 | if (cp->ctx_arr[i].ctx == NULL) |
| @@ -1013,7 +1013,7 @@ static int __cnic_alloc_uio_rings(struct cnic_uio_dev *udev, int pages) | |||
| 1013 | if (udev->l2_ring) | 1013 | if (udev->l2_ring) |
| 1014 | return 0; | 1014 | return 0; |
| 1015 | 1015 | ||
| 1016 | udev->l2_ring_size = pages * BNX2_PAGE_SIZE; | 1016 | udev->l2_ring_size = pages * CNIC_PAGE_SIZE; |
| 1017 | udev->l2_ring = dma_alloc_coherent(&udev->pdev->dev, udev->l2_ring_size, | 1017 | udev->l2_ring = dma_alloc_coherent(&udev->pdev->dev, udev->l2_ring_size, |
| 1018 | &udev->l2_ring_map, | 1018 | &udev->l2_ring_map, |
| 1019 | GFP_KERNEL | __GFP_COMP); | 1019 | GFP_KERNEL | __GFP_COMP); |
| @@ -1021,7 +1021,7 @@ static int __cnic_alloc_uio_rings(struct cnic_uio_dev *udev, int pages) | |||
| 1021 | return -ENOMEM; | 1021 | return -ENOMEM; |
| 1022 | 1022 | ||
| 1023 | udev->l2_buf_size = (cp->l2_rx_ring_size + 1) * cp->l2_single_buf_size; | 1023 | udev->l2_buf_size = (cp->l2_rx_ring_size + 1) * cp->l2_single_buf_size; |
| 1024 | udev->l2_buf_size = PAGE_ALIGN(udev->l2_buf_size); | 1024 | udev->l2_buf_size = CNIC_PAGE_ALIGN(udev->l2_buf_size); |
| 1025 | udev->l2_buf = dma_alloc_coherent(&udev->pdev->dev, udev->l2_buf_size, | 1025 | udev->l2_buf = dma_alloc_coherent(&udev->pdev->dev, udev->l2_buf_size, |
| 1026 | &udev->l2_buf_map, | 1026 | &udev->l2_buf_map, |
| 1027 | GFP_KERNEL | __GFP_COMP); | 1027 | GFP_KERNEL | __GFP_COMP); |
| @@ -1102,7 +1102,7 @@ static int cnic_init_uio(struct cnic_dev *dev) | |||
| 1102 | uinfo->mem[0].size = MB_GET_CID_ADDR(TX_TSS_CID + | 1102 | uinfo->mem[0].size = MB_GET_CID_ADDR(TX_TSS_CID + |
| 1103 | TX_MAX_TSS_RINGS + 1); | 1103 | TX_MAX_TSS_RINGS + 1); |
| 1104 | uinfo->mem[1].addr = (unsigned long) cp->status_blk.gen & | 1104 | uinfo->mem[1].addr = (unsigned long) cp->status_blk.gen & |
| 1105 | PAGE_MASK; | 1105 | CNIC_PAGE_MASK; |
| 1106 | if (cp->ethdev->drv_state & CNIC_DRV_STATE_USING_MSIX) | 1106 | if (cp->ethdev->drv_state & CNIC_DRV_STATE_USING_MSIX) |
| 1107 | uinfo->mem[1].size = BNX2_SBLK_MSIX_ALIGN_SIZE * 9; | 1107 | uinfo->mem[1].size = BNX2_SBLK_MSIX_ALIGN_SIZE * 9; |
| 1108 | else | 1108 | else |
| @@ -1113,7 +1113,7 @@ static int cnic_init_uio(struct cnic_dev *dev) | |||
| 1113 | uinfo->mem[0].size = pci_resource_len(dev->pcidev, 0); | 1113 | uinfo->mem[0].size = pci_resource_len(dev->pcidev, 0); |
| 1114 | 1114 | ||
| 1115 | uinfo->mem[1].addr = (unsigned long) cp->bnx2x_def_status_blk & | 1115 | uinfo->mem[1].addr = (unsigned long) cp->bnx2x_def_status_blk & |
| 1116 | PAGE_MASK; | 1116 | CNIC_PAGE_MASK; |
| 1117 | uinfo->mem[1].size = sizeof(*cp->bnx2x_def_status_blk); | 1117 | uinfo->mem[1].size = sizeof(*cp->bnx2x_def_status_blk); |
| 1118 | 1118 | ||
| 1119 | uinfo->name = "bnx2x_cnic"; | 1119 | uinfo->name = "bnx2x_cnic"; |
| @@ -1267,14 +1267,14 @@ static int cnic_alloc_bnx2x_resc(struct cnic_dev *dev) | |||
| 1267 | for (i = MAX_ISCSI_TBL_SZ; i < cp->max_cid_space; i++) | 1267 | for (i = MAX_ISCSI_TBL_SZ; i < cp->max_cid_space; i++) |
| 1268 | cp->ctx_tbl[i].ulp_proto_id = CNIC_ULP_FCOE; | 1268 | cp->ctx_tbl[i].ulp_proto_id = CNIC_ULP_FCOE; |
| 1269 | 1269 | ||
| 1270 | pages = PAGE_ALIGN(cp->max_cid_space * CNIC_KWQ16_DATA_SIZE) / | 1270 | pages = CNIC_PAGE_ALIGN(cp->max_cid_space * CNIC_KWQ16_DATA_SIZE) / |
| 1271 | PAGE_SIZE; | 1271 | CNIC_PAGE_SIZE; |
| 1272 | 1272 | ||
| 1273 | ret = cnic_alloc_dma(dev, kwq_16_dma, pages, 0); | 1273 | ret = cnic_alloc_dma(dev, kwq_16_dma, pages, 0); |
| 1274 | if (ret) | 1274 | if (ret) |
| 1275 | return -ENOMEM; | 1275 | return -ENOMEM; |
| 1276 | 1276 | ||
| 1277 | n = PAGE_SIZE / CNIC_KWQ16_DATA_SIZE; | 1277 | n = CNIC_PAGE_SIZE / CNIC_KWQ16_DATA_SIZE; |
| 1278 | for (i = 0, j = 0; i < cp->max_cid_space; i++) { | 1278 | for (i = 0, j = 0; i < cp->max_cid_space; i++) { |
| 1279 | long off = CNIC_KWQ16_DATA_SIZE * (i % n); | 1279 | long off = CNIC_KWQ16_DATA_SIZE * (i % n); |
| 1280 | 1280 | ||
| @@ -1296,7 +1296,7 @@ static int cnic_alloc_bnx2x_resc(struct cnic_dev *dev) | |||
| 1296 | goto error; | 1296 | goto error; |
| 1297 | } | 1297 | } |
| 1298 | 1298 | ||
| 1299 | pages = PAGE_ALIGN(BNX2X_ISCSI_GLB_BUF_SIZE) / PAGE_SIZE; | 1299 | pages = CNIC_PAGE_ALIGN(BNX2X_ISCSI_GLB_BUF_SIZE) / CNIC_PAGE_SIZE; |
| 1300 | ret = cnic_alloc_dma(dev, &cp->gbl_buf_info, pages, 0); | 1300 | ret = cnic_alloc_dma(dev, &cp->gbl_buf_info, pages, 0); |
| 1301 | if (ret) | 1301 | if (ret) |
| 1302 | goto error; | 1302 | goto error; |
| @@ -1466,8 +1466,8 @@ static int cnic_bnx2x_iscsi_init1(struct cnic_dev *dev, struct kwqe *kwqe) | |||
| 1466 | cp->r2tq_size = cp->num_iscsi_tasks * BNX2X_ISCSI_MAX_PENDING_R2TS * | 1466 | cp->r2tq_size = cp->num_iscsi_tasks * BNX2X_ISCSI_MAX_PENDING_R2TS * |
| 1467 | BNX2X_ISCSI_R2TQE_SIZE; | 1467 | BNX2X_ISCSI_R2TQE_SIZE; |
| 1468 | cp->hq_size = cp->num_ccells * BNX2X_ISCSI_HQ_BD_SIZE; | 1468 | cp->hq_size = cp->num_ccells * BNX2X_ISCSI_HQ_BD_SIZE; |
| 1469 | pages = PAGE_ALIGN(cp->hq_size) / PAGE_SIZE; | 1469 | pages = CNIC_PAGE_ALIGN(cp->hq_size) / CNIC_PAGE_SIZE; |
| 1470 | hq_bds = pages * (PAGE_SIZE / BNX2X_ISCSI_HQ_BD_SIZE); | 1470 | hq_bds = pages * (CNIC_PAGE_SIZE / BNX2X_ISCSI_HQ_BD_SIZE); |
| 1471 | cp->num_cqs = req1->num_cqs; | 1471 | cp->num_cqs = req1->num_cqs; |
| 1472 | 1472 | ||
| 1473 | if (!dev->max_iscsi_conn) | 1473 | if (!dev->max_iscsi_conn) |
| @@ -1477,9 +1477,9 @@ static int cnic_bnx2x_iscsi_init1(struct cnic_dev *dev, struct kwqe *kwqe) | |||
| 1477 | CNIC_WR16(dev, BAR_TSTRORM_INTMEM + TSTORM_ISCSI_RQ_SIZE_OFFSET(pfid), | 1477 | CNIC_WR16(dev, BAR_TSTRORM_INTMEM + TSTORM_ISCSI_RQ_SIZE_OFFSET(pfid), |
| 1478 | req1->rq_num_wqes); | 1478 | req1->rq_num_wqes); |
| 1479 | CNIC_WR16(dev, BAR_TSTRORM_INTMEM + TSTORM_ISCSI_PAGE_SIZE_OFFSET(pfid), | 1479 | CNIC_WR16(dev, BAR_TSTRORM_INTMEM + TSTORM_ISCSI_PAGE_SIZE_OFFSET(pfid), |
| 1480 | PAGE_SIZE); | 1480 | CNIC_PAGE_SIZE); |
| 1481 | CNIC_WR8(dev, BAR_TSTRORM_INTMEM + | 1481 | CNIC_WR8(dev, BAR_TSTRORM_INTMEM + |
| 1482 | TSTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(pfid), PAGE_SHIFT); | 1482 | TSTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(pfid), CNIC_PAGE_BITS); |
| 1483 | CNIC_WR16(dev, BAR_TSTRORM_INTMEM + | 1483 | CNIC_WR16(dev, BAR_TSTRORM_INTMEM + |
| 1484 | TSTORM_ISCSI_NUM_OF_TASKS_OFFSET(pfid), | 1484 | TSTORM_ISCSI_NUM_OF_TASKS_OFFSET(pfid), |
| 1485 | req1->num_tasks_per_conn); | 1485 | req1->num_tasks_per_conn); |
| @@ -1489,9 +1489,9 @@ static int cnic_bnx2x_iscsi_init1(struct cnic_dev *dev, struct kwqe *kwqe) | |||
| 1489 | USTORM_ISCSI_RQ_BUFFER_SIZE_OFFSET(pfid), | 1489 | USTORM_ISCSI_RQ_BUFFER_SIZE_OFFSET(pfid), |
| 1490 | req1->rq_buffer_size); | 1490 | req1->rq_buffer_size); |
| 1491 | CNIC_WR16(dev, BAR_USTRORM_INTMEM + USTORM_ISCSI_PAGE_SIZE_OFFSET(pfid), | 1491 | CNIC_WR16(dev, BAR_USTRORM_INTMEM + USTORM_ISCSI_PAGE_SIZE_OFFSET(pfid), |
| 1492 | PAGE_SIZE); | 1492 | CNIC_PAGE_SIZE); |
| 1493 | CNIC_WR8(dev, BAR_USTRORM_INTMEM + | 1493 | CNIC_WR8(dev, BAR_USTRORM_INTMEM + |
| 1494 | USTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(pfid), PAGE_SHIFT); | 1494 | USTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(pfid), CNIC_PAGE_BITS); |
| 1495 | CNIC_WR16(dev, BAR_USTRORM_INTMEM + | 1495 | CNIC_WR16(dev, BAR_USTRORM_INTMEM + |
| 1496 | USTORM_ISCSI_NUM_OF_TASKS_OFFSET(pfid), | 1496 | USTORM_ISCSI_NUM_OF_TASKS_OFFSET(pfid), |
| 1497 | req1->num_tasks_per_conn); | 1497 | req1->num_tasks_per_conn); |
| @@ -1504,9 +1504,9 @@ static int cnic_bnx2x_iscsi_init1(struct cnic_dev *dev, struct kwqe *kwqe) | |||
| 1504 | 1504 | ||
| 1505 | /* init Xstorm RAM */ | 1505 | /* init Xstorm RAM */ |
| 1506 | CNIC_WR16(dev, BAR_XSTRORM_INTMEM + XSTORM_ISCSI_PAGE_SIZE_OFFSET(pfid), | 1506 | CNIC_WR16(dev, BAR_XSTRORM_INTMEM + XSTORM_ISCSI_PAGE_SIZE_OFFSET(pfid), |
| 1507 | PAGE_SIZE); | 1507 | CNIC_PAGE_SIZE); |
| 1508 | CNIC_WR8(dev, BAR_XSTRORM_INTMEM + | 1508 | CNIC_WR8(dev, BAR_XSTRORM_INTMEM + |
| 1509 | XSTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(pfid), PAGE_SHIFT); | 1509 | XSTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(pfid), CNIC_PAGE_BITS); |
| 1510 | CNIC_WR16(dev, BAR_XSTRORM_INTMEM + | 1510 | CNIC_WR16(dev, BAR_XSTRORM_INTMEM + |
| 1511 | XSTORM_ISCSI_NUM_OF_TASKS_OFFSET(pfid), | 1511 | XSTORM_ISCSI_NUM_OF_TASKS_OFFSET(pfid), |
| 1512 | req1->num_tasks_per_conn); | 1512 | req1->num_tasks_per_conn); |
| @@ -1519,9 +1519,9 @@ static int cnic_bnx2x_iscsi_init1(struct cnic_dev *dev, struct kwqe *kwqe) | |||
| 1519 | 1519 | ||
| 1520 | /* init Cstorm RAM */ | 1520 | /* init Cstorm RAM */ |
| 1521 | CNIC_WR16(dev, BAR_CSTRORM_INTMEM + CSTORM_ISCSI_PAGE_SIZE_OFFSET(pfid), | 1521 | CNIC_WR16(dev, BAR_CSTRORM_INTMEM + CSTORM_ISCSI_PAGE_SIZE_OFFSET(pfid), |
| 1522 | PAGE_SIZE); | 1522 | CNIC_PAGE_SIZE); |
| 1523 | CNIC_WR8(dev, BAR_CSTRORM_INTMEM + | 1523 | CNIC_WR8(dev, BAR_CSTRORM_INTMEM + |
| 1524 | CSTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(pfid), PAGE_SHIFT); | 1524 | CSTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(pfid), CNIC_PAGE_BITS); |
| 1525 | CNIC_WR16(dev, BAR_CSTRORM_INTMEM + | 1525 | CNIC_WR16(dev, BAR_CSTRORM_INTMEM + |
| 1526 | CSTORM_ISCSI_NUM_OF_TASKS_OFFSET(pfid), | 1526 | CSTORM_ISCSI_NUM_OF_TASKS_OFFSET(pfid), |
| 1527 | req1->num_tasks_per_conn); | 1527 | req1->num_tasks_per_conn); |
| @@ -1623,18 +1623,18 @@ static int cnic_alloc_bnx2x_conn_resc(struct cnic_dev *dev, u32 l5_cid) | |||
| 1623 | } | 1623 | } |
| 1624 | 1624 | ||
| 1625 | ctx->cid = cid; | 1625 | ctx->cid = cid; |
| 1626 | pages = PAGE_ALIGN(cp->task_array_size) / PAGE_SIZE; | 1626 | pages = CNIC_PAGE_ALIGN(cp->task_array_size) / CNIC_PAGE_SIZE; |
| 1627 | 1627 | ||
| 1628 | ret = cnic_alloc_dma(dev, &iscsi->task_array_info, pages, 1); | 1628 | ret = cnic_alloc_dma(dev, &iscsi->task_array_info, pages, 1); |
| 1629 | if (ret) | 1629 | if (ret) |
| 1630 | goto error; | 1630 | goto error; |
| 1631 | 1631 | ||
| 1632 | pages = PAGE_ALIGN(cp->r2tq_size) / PAGE_SIZE; | 1632 | pages = CNIC_PAGE_ALIGN(cp->r2tq_size) / CNIC_PAGE_SIZE; |
| 1633 | ret = cnic_alloc_dma(dev, &iscsi->r2tq_info, pages, 1); | 1633 | ret = cnic_alloc_dma(dev, &iscsi->r2tq_info, pages, 1); |
| 1634 | if (ret) | 1634 | if (ret) |
| 1635 | goto error; | 1635 | goto error; |
| 1636 | 1636 | ||
| 1637 | pages = PAGE_ALIGN(cp->hq_size) / PAGE_SIZE; | 1637 | pages = CNIC_PAGE_ALIGN(cp->hq_size) / CNIC_PAGE_SIZE; |
| 1638 | ret = cnic_alloc_dma(dev, &iscsi->hq_info, pages, 1); | 1638 | ret = cnic_alloc_dma(dev, &iscsi->hq_info, pages, 1); |
| 1639 | if (ret) | 1639 | if (ret) |
| 1640 | goto error; | 1640 | goto error; |
| @@ -1760,7 +1760,7 @@ static int cnic_setup_bnx2x_ctx(struct cnic_dev *dev, struct kwqe *wqes[], | |||
| 1760 | ictx->tstorm_st_context.iscsi.hdr_bytes_2_fetch = ISCSI_HEADER_SIZE; | 1760 | ictx->tstorm_st_context.iscsi.hdr_bytes_2_fetch = ISCSI_HEADER_SIZE; |
| 1761 | /* TSTORM requires the base address of RQ DB & not PTE */ | 1761 | /* TSTORM requires the base address of RQ DB & not PTE */ |
| 1762 | ictx->tstorm_st_context.iscsi.rq_db_phy_addr.lo = | 1762 | ictx->tstorm_st_context.iscsi.rq_db_phy_addr.lo = |
| 1763 | req2->rq_page_table_addr_lo & PAGE_MASK; | 1763 | req2->rq_page_table_addr_lo & CNIC_PAGE_MASK; |
| 1764 | ictx->tstorm_st_context.iscsi.rq_db_phy_addr.hi = | 1764 | ictx->tstorm_st_context.iscsi.rq_db_phy_addr.hi = |
| 1765 | req2->rq_page_table_addr_hi; | 1765 | req2->rq_page_table_addr_hi; |
| 1766 | ictx->tstorm_st_context.iscsi.iscsi_conn_id = req1->iscsi_conn_id; | 1766 | ictx->tstorm_st_context.iscsi.iscsi_conn_id = req1->iscsi_conn_id; |
| @@ -1842,7 +1842,7 @@ static int cnic_setup_bnx2x_ctx(struct cnic_dev *dev, struct kwqe *wqes[], | |||
| 1842 | /* CSTORM and USTORM initialization is different, CSTORM requires | 1842 | /* CSTORM and USTORM initialization is different, CSTORM requires |
| 1843 | * CQ DB base & not PTE addr */ | 1843 | * CQ DB base & not PTE addr */ |
| 1844 | ictx->cstorm_st_context.cq_db_base.lo = | 1844 | ictx->cstorm_st_context.cq_db_base.lo = |
| 1845 | req1->cq_page_table_addr_lo & PAGE_MASK; | 1845 | req1->cq_page_table_addr_lo & CNIC_PAGE_MASK; |
| 1846 | ictx->cstorm_st_context.cq_db_base.hi = req1->cq_page_table_addr_hi; | 1846 | ictx->cstorm_st_context.cq_db_base.hi = req1->cq_page_table_addr_hi; |
| 1847 | ictx->cstorm_st_context.iscsi_conn_id = req1->iscsi_conn_id; | 1847 | ictx->cstorm_st_context.iscsi_conn_id = req1->iscsi_conn_id; |
| 1848 | ictx->cstorm_st_context.cq_proc_en_bit_map = (1 << cp->num_cqs) - 1; | 1848 | ictx->cstorm_st_context.cq_proc_en_bit_map = (1 << cp->num_cqs) - 1; |
| @@ -2911,7 +2911,7 @@ static int cnic_l2_completion(struct cnic_local *cp) | |||
| 2911 | u16 hw_cons, sw_cons; | 2911 | u16 hw_cons, sw_cons; |
| 2912 | struct cnic_uio_dev *udev = cp->udev; | 2912 | struct cnic_uio_dev *udev = cp->udev; |
| 2913 | union eth_rx_cqe *cqe, *cqe_ring = (union eth_rx_cqe *) | 2913 | union eth_rx_cqe *cqe, *cqe_ring = (union eth_rx_cqe *) |
| 2914 | (udev->l2_ring + (2 * BNX2_PAGE_SIZE)); | 2914 | (udev->l2_ring + (2 * CNIC_PAGE_SIZE)); |
| 2915 | u32 cmd; | 2915 | u32 cmd; |
| 2916 | int comp = 0; | 2916 | int comp = 0; |
| 2917 | 2917 | ||
| @@ -3244,7 +3244,8 @@ static int cnic_copy_ulp_stats(struct cnic_dev *dev, int ulp_type) | |||
| 3244 | int rc; | 3244 | int rc; |
| 3245 | 3245 | ||
| 3246 | mutex_lock(&cnic_lock); | 3246 | mutex_lock(&cnic_lock); |
| 3247 | ulp_ops = cnic_ulp_tbl_prot(ulp_type); | 3247 | ulp_ops = rcu_dereference_protected(cp->ulp_ops[ulp_type], |
| 3248 | lockdep_is_held(&cnic_lock)); | ||
| 3248 | if (ulp_ops && ulp_ops->cnic_get_stats) | 3249 | if (ulp_ops && ulp_ops->cnic_get_stats) |
| 3249 | rc = ulp_ops->cnic_get_stats(cp->ulp_handle[ulp_type]); | 3250 | rc = ulp_ops->cnic_get_stats(cp->ulp_handle[ulp_type]); |
| 3250 | else | 3251 | else |
| @@ -4384,7 +4385,7 @@ static int cnic_setup_5709_context(struct cnic_dev *dev, int valid) | |||
| 4384 | u32 idx = cp->ctx_arr[i].cid / cp->cids_per_blk; | 4385 | u32 idx = cp->ctx_arr[i].cid / cp->cids_per_blk; |
| 4385 | u32 val; | 4386 | u32 val; |
| 4386 | 4387 | ||
| 4387 | memset(cp->ctx_arr[i].ctx, 0, BNX2_PAGE_SIZE); | 4388 | memset(cp->ctx_arr[i].ctx, 0, CNIC_PAGE_SIZE); |
| 4388 | 4389 | ||
| 4389 | CNIC_WR(dev, BNX2_CTX_HOST_PAGE_TBL_DATA0, | 4390 | CNIC_WR(dev, BNX2_CTX_HOST_PAGE_TBL_DATA0, |
| 4390 | (cp->ctx_arr[i].mapping & 0xffffffff) | valid_bit); | 4391 | (cp->ctx_arr[i].mapping & 0xffffffff) | valid_bit); |
| @@ -4628,7 +4629,7 @@ static void cnic_init_bnx2_rx_ring(struct cnic_dev *dev) | |||
| 4628 | val = BNX2_L2CTX_L2_STATUSB_NUM(sb_id); | 4629 | val = BNX2_L2CTX_L2_STATUSB_NUM(sb_id); |
| 4629 | cnic_ctx_wr(dev, cid_addr, BNX2_L2CTX_HOST_BDIDX, val); | 4630 | cnic_ctx_wr(dev, cid_addr, BNX2_L2CTX_HOST_BDIDX, val); |
| 4630 | 4631 | ||
| 4631 | rxbd = udev->l2_ring + BNX2_PAGE_SIZE; | 4632 | rxbd = udev->l2_ring + CNIC_PAGE_SIZE; |
| 4632 | for (i = 0; i < BNX2_MAX_RX_DESC_CNT; i++, rxbd++) { | 4633 | for (i = 0; i < BNX2_MAX_RX_DESC_CNT; i++, rxbd++) { |
| 4633 | dma_addr_t buf_map; | 4634 | dma_addr_t buf_map; |
| 4634 | int n = (i % cp->l2_rx_ring_size) + 1; | 4635 | int n = (i % cp->l2_rx_ring_size) + 1; |
| @@ -4639,11 +4640,11 @@ static void cnic_init_bnx2_rx_ring(struct cnic_dev *dev) | |||
| 4639 | rxbd->rx_bd_haddr_hi = (u64) buf_map >> 32; | 4640 | rxbd->rx_bd_haddr_hi = (u64) buf_map >> 32; |
| 4640 | rxbd->rx_bd_haddr_lo = (u64) buf_map & 0xffffffff; | 4641 | rxbd->rx_bd_haddr_lo = (u64) buf_map & 0xffffffff; |
| 4641 | } | 4642 | } |
| 4642 | val = (u64) (ring_map + BNX2_PAGE_SIZE) >> 32; | 4643 | val = (u64) (ring_map + CNIC_PAGE_SIZE) >> 32; |
| 4643 | cnic_ctx_wr(dev, cid_addr, BNX2_L2CTX_NX_BDHADDR_HI, val); | 4644 | cnic_ctx_wr(dev, cid_addr, BNX2_L2CTX_NX_BDHADDR_HI, val); |
| 4644 | rxbd->rx_bd_haddr_hi = val; | 4645 | rxbd->rx_bd_haddr_hi = val; |
| 4645 | 4646 | ||
| 4646 | val = (u64) (ring_map + BNX2_PAGE_SIZE) & 0xffffffff; | 4647 | val = (u64) (ring_map + CNIC_PAGE_SIZE) & 0xffffffff; |
| 4647 | cnic_ctx_wr(dev, cid_addr, BNX2_L2CTX_NX_BDHADDR_LO, val); | 4648 | cnic_ctx_wr(dev, cid_addr, BNX2_L2CTX_NX_BDHADDR_LO, val); |
| 4648 | rxbd->rx_bd_haddr_lo = val; | 4649 | rxbd->rx_bd_haddr_lo = val; |
| 4649 | 4650 | ||
| @@ -4709,10 +4710,10 @@ static int cnic_start_bnx2_hw(struct cnic_dev *dev) | |||
| 4709 | 4710 | ||
| 4710 | val = CNIC_RD(dev, BNX2_MQ_CONFIG); | 4711 | val = CNIC_RD(dev, BNX2_MQ_CONFIG); |
| 4711 | val &= ~BNX2_MQ_CONFIG_KNL_BYP_BLK_SIZE; | 4712 | val &= ~BNX2_MQ_CONFIG_KNL_BYP_BLK_SIZE; |
| 4712 | if (BNX2_PAGE_BITS > 12) | 4713 | if (CNIC_PAGE_BITS > 12) |
| 4713 | val |= (12 - 8) << 4; | 4714 | val |= (12 - 8) << 4; |
| 4714 | else | 4715 | else |
| 4715 | val |= (BNX2_PAGE_BITS - 8) << 4; | 4716 | val |= (CNIC_PAGE_BITS - 8) << 4; |
| 4716 | 4717 | ||
| 4717 | CNIC_WR(dev, BNX2_MQ_CONFIG, val); | 4718 | CNIC_WR(dev, BNX2_MQ_CONFIG, val); |
| 4718 | 4719 | ||
| @@ -4742,13 +4743,13 @@ static int cnic_start_bnx2_hw(struct cnic_dev *dev) | |||
| 4742 | 4743 | ||
| 4743 | /* Initialize the kernel work queue context. */ | 4744 | /* Initialize the kernel work queue context. */ |
| 4744 | val = KRNLQ_TYPE_TYPE_KRNLQ | KRNLQ_SIZE_TYPE_SIZE | | 4745 | val = KRNLQ_TYPE_TYPE_KRNLQ | KRNLQ_SIZE_TYPE_SIZE | |
| 4745 | (BNX2_PAGE_BITS - 8) | KRNLQ_FLAGS_QE_SELF_SEQ; | 4746 | (CNIC_PAGE_BITS - 8) | KRNLQ_FLAGS_QE_SELF_SEQ; |
| 4746 | cnic_ctx_wr(dev, kwq_cid_addr, L5_KRNLQ_TYPE, val); | 4747 | cnic_ctx_wr(dev, kwq_cid_addr, L5_KRNLQ_TYPE, val); |
| 4747 | 4748 | ||
| 4748 | val = (BNX2_PAGE_SIZE / sizeof(struct kwqe) - 1) << 16; | 4749 | val = (CNIC_PAGE_SIZE / sizeof(struct kwqe) - 1) << 16; |
| 4749 | cnic_ctx_wr(dev, kwq_cid_addr, L5_KRNLQ_QE_SELF_SEQ_MAX, val); | 4750 | cnic_ctx_wr(dev, kwq_cid_addr, L5_KRNLQ_QE_SELF_SEQ_MAX, val); |
| 4750 | 4751 | ||
| 4751 | val = ((BNX2_PAGE_SIZE / sizeof(struct kwqe)) << 16) | KWQ_PAGE_CNT; | 4752 | val = ((CNIC_PAGE_SIZE / sizeof(struct kwqe)) << 16) | KWQ_PAGE_CNT; |
| 4752 | cnic_ctx_wr(dev, kwq_cid_addr, L5_KRNLQ_PGTBL_NPAGES, val); | 4753 | cnic_ctx_wr(dev, kwq_cid_addr, L5_KRNLQ_PGTBL_NPAGES, val); |
| 4753 | 4754 | ||
| 4754 | val = (u32) ((u64) cp->kwq_info.pgtbl_map >> 32); | 4755 | val = (u32) ((u64) cp->kwq_info.pgtbl_map >> 32); |
| @@ -4768,13 +4769,13 @@ static int cnic_start_bnx2_hw(struct cnic_dev *dev) | |||
| 4768 | 4769 | ||
| 4769 | /* Initialize the kernel complete queue context. */ | 4770 | /* Initialize the kernel complete queue context. */ |
| 4770 | val = KRNLQ_TYPE_TYPE_KRNLQ | KRNLQ_SIZE_TYPE_SIZE | | 4771 | val = KRNLQ_TYPE_TYPE_KRNLQ | KRNLQ_SIZE_TYPE_SIZE | |
| 4771 | (BNX2_PAGE_BITS - 8) | KRNLQ_FLAGS_QE_SELF_SEQ; | 4772 | (CNIC_PAGE_BITS - 8) | KRNLQ_FLAGS_QE_SELF_SEQ; |
| 4772 | cnic_ctx_wr(dev, kcq_cid_addr, L5_KRNLQ_TYPE, val); | 4773 | cnic_ctx_wr(dev, kcq_cid_addr, L5_KRNLQ_TYPE, val); |
| 4773 | 4774 | ||
| 4774 | val = (BNX2_PAGE_SIZE / sizeof(struct kcqe) - 1) << 16; | 4775 | val = (CNIC_PAGE_SIZE / sizeof(struct kcqe) - 1) << 16; |
| 4775 | cnic_ctx_wr(dev, kcq_cid_addr, L5_KRNLQ_QE_SELF_SEQ_MAX, val); | 4776 | cnic_ctx_wr(dev, kcq_cid_addr, L5_KRNLQ_QE_SELF_SEQ_MAX, val); |
| 4776 | 4777 | ||
| 4777 | val = ((BNX2_PAGE_SIZE / sizeof(struct kcqe)) << 16) | KCQ_PAGE_CNT; | 4778 | val = ((CNIC_PAGE_SIZE / sizeof(struct kcqe)) << 16) | KCQ_PAGE_CNT; |
| 4778 | cnic_ctx_wr(dev, kcq_cid_addr, L5_KRNLQ_PGTBL_NPAGES, val); | 4779 | cnic_ctx_wr(dev, kcq_cid_addr, L5_KRNLQ_PGTBL_NPAGES, val); |
| 4779 | 4780 | ||
| 4780 | val = (u32) ((u64) cp->kcq1.dma.pgtbl_map >> 32); | 4781 | val = (u32) ((u64) cp->kcq1.dma.pgtbl_map >> 32); |
| @@ -4918,7 +4919,7 @@ static void cnic_init_bnx2x_tx_ring(struct cnic_dev *dev, | |||
| 4918 | u32 cli = cp->ethdev->iscsi_l2_client_id; | 4919 | u32 cli = cp->ethdev->iscsi_l2_client_id; |
| 4919 | u32 val; | 4920 | u32 val; |
| 4920 | 4921 | ||
| 4921 | memset(txbd, 0, BNX2_PAGE_SIZE); | 4922 | memset(txbd, 0, CNIC_PAGE_SIZE); |
| 4922 | 4923 | ||
| 4923 | buf_map = udev->l2_buf_map; | 4924 | buf_map = udev->l2_buf_map; |
| 4924 | for (i = 0; i < BNX2_MAX_TX_DESC_CNT; i += 3, txbd += 3) { | 4925 | for (i = 0; i < BNX2_MAX_TX_DESC_CNT; i += 3, txbd += 3) { |
| @@ -4978,9 +4979,9 @@ static void cnic_init_bnx2x_rx_ring(struct cnic_dev *dev, | |||
| 4978 | struct bnx2x *bp = netdev_priv(dev->netdev); | 4979 | struct bnx2x *bp = netdev_priv(dev->netdev); |
| 4979 | struct cnic_uio_dev *udev = cp->udev; | 4980 | struct cnic_uio_dev *udev = cp->udev; |
| 4980 | struct eth_rx_bd *rxbd = (struct eth_rx_bd *) (udev->l2_ring + | 4981 | struct eth_rx_bd *rxbd = (struct eth_rx_bd *) (udev->l2_ring + |
| 4981 | BNX2_PAGE_SIZE); | 4982 | CNIC_PAGE_SIZE); |
| 4982 | struct eth_rx_cqe_next_page *rxcqe = (struct eth_rx_cqe_next_page *) | 4983 | struct eth_rx_cqe_next_page *rxcqe = (struct eth_rx_cqe_next_page *) |
| 4983 | (udev->l2_ring + (2 * BNX2_PAGE_SIZE)); | 4984 | (udev->l2_ring + (2 * CNIC_PAGE_SIZE)); |
| 4984 | struct host_sp_status_block *sb = cp->bnx2x_def_status_blk; | 4985 | struct host_sp_status_block *sb = cp->bnx2x_def_status_blk; |
| 4985 | int i; | 4986 | int i; |
| 4986 | u32 cli = cp->ethdev->iscsi_l2_client_id; | 4987 | u32 cli = cp->ethdev->iscsi_l2_client_id; |
| @@ -5004,20 +5005,20 @@ static void cnic_init_bnx2x_rx_ring(struct cnic_dev *dev, | |||
| 5004 | rxbd->addr_lo = cpu_to_le32(buf_map & 0xffffffff); | 5005 | rxbd->addr_lo = cpu_to_le32(buf_map & 0xffffffff); |
| 5005 | } | 5006 | } |
| 5006 | 5007 | ||
| 5007 | val = (u64) (ring_map + BNX2_PAGE_SIZE) >> 32; | 5008 | val = (u64) (ring_map + CNIC_PAGE_SIZE) >> 32; |
| 5008 | rxbd->addr_hi = cpu_to_le32(val); | 5009 | rxbd->addr_hi = cpu_to_le32(val); |
| 5009 | data->rx.bd_page_base.hi = cpu_to_le32(val); | 5010 | data->rx.bd_page_base.hi = cpu_to_le32(val); |
| 5010 | 5011 | ||
| 5011 | val = (u64) (ring_map + BNX2_PAGE_SIZE) & 0xffffffff; | 5012 | val = (u64) (ring_map + CNIC_PAGE_SIZE) & 0xffffffff; |
| 5012 | rxbd->addr_lo = cpu_to_le32(val); | 5013 | rxbd->addr_lo = cpu_to_le32(val); |
| 5013 | data->rx.bd_page_base.lo = cpu_to_le32(val); | 5014 | data->rx.bd_page_base.lo = cpu_to_le32(val); |
| 5014 | 5015 | ||
| 5015 | rxcqe += BNX2X_MAX_RCQ_DESC_CNT; | 5016 | rxcqe += BNX2X_MAX_RCQ_DESC_CNT; |
| 5016 | val = (u64) (ring_map + (2 * BNX2_PAGE_SIZE)) >> 32; | 5017 | val = (u64) (ring_map + (2 * CNIC_PAGE_SIZE)) >> 32; |
| 5017 | rxcqe->addr_hi = cpu_to_le32(val); | 5018 | rxcqe->addr_hi = cpu_to_le32(val); |
| 5018 | data->rx.cqe_page_base.hi = cpu_to_le32(val); | 5019 | data->rx.cqe_page_base.hi = cpu_to_le32(val); |
| 5019 | 5020 | ||
| 5020 | val = (u64) (ring_map + (2 * BNX2_PAGE_SIZE)) & 0xffffffff; | 5021 | val = (u64) (ring_map + (2 * CNIC_PAGE_SIZE)) & 0xffffffff; |
| 5021 | rxcqe->addr_lo = cpu_to_le32(val); | 5022 | rxcqe->addr_lo = cpu_to_le32(val); |
| 5022 | data->rx.cqe_page_base.lo = cpu_to_le32(val); | 5023 | data->rx.cqe_page_base.lo = cpu_to_le32(val); |
| 5023 | 5024 | ||
| @@ -5265,8 +5266,8 @@ static void cnic_shutdown_rings(struct cnic_dev *dev) | |||
| 5265 | msleep(10); | 5266 | msleep(10); |
| 5266 | } | 5267 | } |
| 5267 | clear_bit(CNIC_LCL_FL_RINGS_INITED, &cp->cnic_local_flags); | 5268 | clear_bit(CNIC_LCL_FL_RINGS_INITED, &cp->cnic_local_flags); |
| 5268 | rx_ring = udev->l2_ring + BNX2_PAGE_SIZE; | 5269 | rx_ring = udev->l2_ring + CNIC_PAGE_SIZE; |
| 5269 | memset(rx_ring, 0, BNX2_PAGE_SIZE); | 5270 | memset(rx_ring, 0, CNIC_PAGE_SIZE); |
| 5270 | } | 5271 | } |
| 5271 | 5272 | ||
| 5272 | static int cnic_register_netdev(struct cnic_dev *dev) | 5273 | static int cnic_register_netdev(struct cnic_dev *dev) |
diff --git a/drivers/net/ethernet/broadcom/cnic.h b/drivers/net/ethernet/broadcom/cnic.h index 0d6b13f854d9..d535ae4228b4 100644 --- a/drivers/net/ethernet/broadcom/cnic.h +++ b/drivers/net/ethernet/broadcom/cnic.h | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* cnic.h: Broadcom CNIC core network driver. | 1 | /* cnic.h: Broadcom CNIC core network driver. |
| 2 | * | 2 | * |
| 3 | * Copyright (c) 2006-2013 Broadcom Corporation | 3 | * Copyright (c) 2006-2014 Broadcom Corporation |
| 4 | * | 4 | * |
| 5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
| 6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
diff --git a/drivers/net/ethernet/broadcom/cnic_defs.h b/drivers/net/ethernet/broadcom/cnic_defs.h index 95a8e4b11c9f..dcbca6997e8f 100644 --- a/drivers/net/ethernet/broadcom/cnic_defs.h +++ b/drivers/net/ethernet/broadcom/cnic_defs.h | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | 1 | ||
| 2 | /* cnic.c: Broadcom CNIC core network driver. | 2 | /* cnic.c: Broadcom CNIC core network driver. |
| 3 | * | 3 | * |
| 4 | * Copyright (c) 2006-2013 Broadcom Corporation | 4 | * Copyright (c) 2006-2014 Broadcom Corporation |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 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 | 7 | * it under the terms of the GNU General Public License as published by |
diff --git a/drivers/net/ethernet/broadcom/cnic_if.h b/drivers/net/ethernet/broadcom/cnic_if.h index 8cf6b1926069..5f4d5573a73d 100644 --- a/drivers/net/ethernet/broadcom/cnic_if.h +++ b/drivers/net/ethernet/broadcom/cnic_if.h | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* cnic_if.h: Broadcom CNIC core network driver. | 1 | /* cnic_if.h: Broadcom CNIC core network driver. |
| 2 | * | 2 | * |
| 3 | * Copyright (c) 2006-2013 Broadcom Corporation | 3 | * Copyright (c) 2006-2014 Broadcom Corporation |
| 4 | * | 4 | * |
| 5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
| 6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
| @@ -14,8 +14,8 @@ | |||
| 14 | 14 | ||
| 15 | #include "bnx2x/bnx2x_mfw_req.h" | 15 | #include "bnx2x/bnx2x_mfw_req.h" |
| 16 | 16 | ||
| 17 | #define CNIC_MODULE_VERSION "2.5.19" | 17 | #define CNIC_MODULE_VERSION "2.5.20" |
| 18 | #define CNIC_MODULE_RELDATE "December 19, 2013" | 18 | #define CNIC_MODULE_RELDATE "March 14, 2014" |
| 19 | 19 | ||
| 20 | #define CNIC_ULP_RDMA 0 | 20 | #define CNIC_ULP_RDMA 0 |
| 21 | #define CNIC_ULP_ISCSI 1 | 21 | #define CNIC_ULP_ISCSI 1 |
| @@ -24,6 +24,16 @@ | |||
| 24 | #define MAX_CNIC_ULP_TYPE_EXT 3 | 24 | #define MAX_CNIC_ULP_TYPE_EXT 3 |
| 25 | #define MAX_CNIC_ULP_TYPE 4 | 25 | #define MAX_CNIC_ULP_TYPE 4 |
| 26 | 26 | ||
| 27 | /* Use CPU native page size up to 16K for cnic ring sizes. */ | ||
| 28 | #if (PAGE_SHIFT > 14) | ||
| 29 | #define CNIC_PAGE_BITS 14 | ||
| 30 | #else | ||
| 31 | #define CNIC_PAGE_BITS PAGE_SHIFT | ||
| 32 | #endif | ||
| 33 | #define CNIC_PAGE_SIZE (1 << (CNIC_PAGE_BITS)) | ||
| 34 | #define CNIC_PAGE_ALIGN(addr) ALIGN(addr, CNIC_PAGE_SIZE) | ||
| 35 | #define CNIC_PAGE_MASK (~((CNIC_PAGE_SIZE) - 1)) | ||
| 36 | |||
| 27 | struct kwqe { | 37 | struct kwqe { |
| 28 | u32 kwqe_op_flag; | 38 | u32 kwqe_op_flag; |
| 29 | 39 | ||
diff --git a/drivers/net/ethernet/micrel/ks8851.c b/drivers/net/ethernet/micrel/ks8851.c index 727b546a9eb8..e0c92e0e5e1d 100644 --- a/drivers/net/ethernet/micrel/ks8851.c +++ b/drivers/net/ethernet/micrel/ks8851.c | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | #include <linux/crc32.h> | 23 | #include <linux/crc32.h> |
| 24 | #include <linux/mii.h> | 24 | #include <linux/mii.h> |
| 25 | #include <linux/eeprom_93cx6.h> | 25 | #include <linux/eeprom_93cx6.h> |
| 26 | #include <linux/regulator/consumer.h> | ||
| 26 | 27 | ||
| 27 | #include <linux/spi/spi.h> | 28 | #include <linux/spi/spi.h> |
| 28 | 29 | ||
| @@ -83,6 +84,7 @@ union ks8851_tx_hdr { | |||
| 83 | * @rc_rxqcr: Cached copy of KS_RXQCR. | 84 | * @rc_rxqcr: Cached copy of KS_RXQCR. |
| 84 | * @eeprom_size: Companion eeprom size in Bytes, 0 if no eeprom | 85 | * @eeprom_size: Companion eeprom size in Bytes, 0 if no eeprom |
| 85 | * @eeprom: 93CX6 EEPROM state for accessing on-board EEPROM. | 86 | * @eeprom: 93CX6 EEPROM state for accessing on-board EEPROM. |
| 87 | * @vdd_reg: Optional regulator supplying the chip | ||
| 86 | * | 88 | * |
| 87 | * The @lock ensures that the chip is protected when certain operations are | 89 | * The @lock ensures that the chip is protected when certain operations are |
| 88 | * in progress. When the read or write packet transfer is in progress, most | 90 | * in progress. When the read or write packet transfer is in progress, most |
| @@ -130,6 +132,7 @@ struct ks8851_net { | |||
| 130 | struct spi_transfer spi_xfer2[2]; | 132 | struct spi_transfer spi_xfer2[2]; |
| 131 | 133 | ||
| 132 | struct eeprom_93cx6 eeprom; | 134 | struct eeprom_93cx6 eeprom; |
| 135 | struct regulator *vdd_reg; | ||
| 133 | }; | 136 | }; |
| 134 | 137 | ||
| 135 | static int msg_enable; | 138 | static int msg_enable; |
| @@ -1414,6 +1417,21 @@ static int ks8851_probe(struct spi_device *spi) | |||
| 1414 | ks->spidev = spi; | 1417 | ks->spidev = spi; |
| 1415 | ks->tx_space = 6144; | 1418 | ks->tx_space = 6144; |
| 1416 | 1419 | ||
| 1420 | ks->vdd_reg = regulator_get_optional(&spi->dev, "vdd"); | ||
| 1421 | if (IS_ERR(ks->vdd_reg)) { | ||
| 1422 | ret = PTR_ERR(ks->vdd_reg); | ||
| 1423 | if (ret == -EPROBE_DEFER) | ||
| 1424 | goto err_reg; | ||
| 1425 | } else { | ||
| 1426 | ret = regulator_enable(ks->vdd_reg); | ||
| 1427 | if (ret) { | ||
| 1428 | dev_err(&spi->dev, "regulator enable fail: %d\n", | ||
| 1429 | ret); | ||
| 1430 | goto err_reg_en; | ||
| 1431 | } | ||
| 1432 | } | ||
| 1433 | |||
| 1434 | |||
| 1417 | mutex_init(&ks->lock); | 1435 | mutex_init(&ks->lock); |
| 1418 | spin_lock_init(&ks->statelock); | 1436 | spin_lock_init(&ks->statelock); |
| 1419 | 1437 | ||
| @@ -1508,8 +1526,14 @@ static int ks8851_probe(struct spi_device *spi) | |||
| 1508 | err_netdev: | 1526 | err_netdev: |
| 1509 | free_irq(ndev->irq, ks); | 1527 | free_irq(ndev->irq, ks); |
| 1510 | 1528 | ||
| 1511 | err_id: | ||
| 1512 | err_irq: | 1529 | err_irq: |
| 1530 | err_id: | ||
| 1531 | if (!IS_ERR(ks->vdd_reg)) | ||
| 1532 | regulator_disable(ks->vdd_reg); | ||
| 1533 | err_reg_en: | ||
| 1534 | if (!IS_ERR(ks->vdd_reg)) | ||
| 1535 | regulator_put(ks->vdd_reg); | ||
| 1536 | err_reg: | ||
| 1513 | free_netdev(ndev); | 1537 | free_netdev(ndev); |
| 1514 | return ret; | 1538 | return ret; |
| 1515 | } | 1539 | } |
| @@ -1523,6 +1547,10 @@ static int ks8851_remove(struct spi_device *spi) | |||
| 1523 | 1547 | ||
| 1524 | unregister_netdev(priv->netdev); | 1548 | unregister_netdev(priv->netdev); |
| 1525 | free_irq(spi->irq, priv); | 1549 | free_irq(spi->irq, priv); |
| 1550 | if (!IS_ERR(priv->vdd_reg)) { | ||
| 1551 | regulator_disable(priv->vdd_reg); | ||
| 1552 | regulator_put(priv->vdd_reg); | ||
| 1553 | } | ||
| 1526 | free_netdev(priv->netdev); | 1554 | free_netdev(priv->netdev); |
| 1527 | 1555 | ||
| 1528 | return 0; | 1556 | return 0; |
diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c index ffd4d12acf6d..7d6d8ec676c8 100644 --- a/drivers/net/ethernet/ti/cpsw.c +++ b/drivers/net/ethernet/ti/cpsw.c | |||
| @@ -2229,10 +2229,6 @@ static int cpsw_probe(struct platform_device *pdev) | |||
| 2229 | goto clean_ale_ret; | 2229 | goto clean_ale_ret; |
| 2230 | } | 2230 | } |
| 2231 | 2231 | ||
| 2232 | if (cpts_register(&pdev->dev, priv->cpts, | ||
| 2233 | data->cpts_clock_mult, data->cpts_clock_shift)) | ||
| 2234 | dev_err(priv->dev, "error registering cpts device\n"); | ||
| 2235 | |||
| 2236 | cpsw_notice(priv, probe, "initialized device (regs %pa, irq %d)\n", | 2232 | cpsw_notice(priv, probe, "initialized device (regs %pa, irq %d)\n", |
| 2237 | &ss_res->start, ndev->irq); | 2233 | &ss_res->start, ndev->irq); |
| 2238 | 2234 | ||
diff --git a/drivers/net/ethernet/ti/davinci_cpdma.c b/drivers/net/ethernet/ti/davinci_cpdma.c index 364d0c7952c0..88ef27067bf2 100644 --- a/drivers/net/ethernet/ti/davinci_cpdma.c +++ b/drivers/net/ethernet/ti/davinci_cpdma.c | |||
| @@ -355,7 +355,7 @@ int cpdma_ctlr_stop(struct cpdma_ctlr *ctlr) | |||
| 355 | int i; | 355 | int i; |
| 356 | 356 | ||
| 357 | spin_lock_irqsave(&ctlr->lock, flags); | 357 | spin_lock_irqsave(&ctlr->lock, flags); |
| 358 | if (ctlr->state != CPDMA_STATE_ACTIVE) { | 358 | if (ctlr->state == CPDMA_STATE_TEARDOWN) { |
| 359 | spin_unlock_irqrestore(&ctlr->lock, flags); | 359 | spin_unlock_irqrestore(&ctlr->lock, flags); |
| 360 | return -EINVAL; | 360 | return -EINVAL; |
| 361 | } | 361 | } |
| @@ -891,7 +891,7 @@ int cpdma_chan_stop(struct cpdma_chan *chan) | |||
| 891 | unsigned timeout; | 891 | unsigned timeout; |
| 892 | 892 | ||
| 893 | spin_lock_irqsave(&chan->lock, flags); | 893 | spin_lock_irqsave(&chan->lock, flags); |
| 894 | if (chan->state != CPDMA_STATE_ACTIVE) { | 894 | if (chan->state == CPDMA_STATE_TEARDOWN) { |
| 895 | spin_unlock_irqrestore(&chan->lock, flags); | 895 | spin_unlock_irqrestore(&chan->lock, flags); |
| 896 | return -EINVAL; | 896 | return -EINVAL; |
| 897 | } | 897 | } |
diff --git a/drivers/net/ethernet/ti/davinci_emac.c b/drivers/net/ethernet/ti/davinci_emac.c index cd9b164a0434..8f0e69ce07ca 100644 --- a/drivers/net/ethernet/ti/davinci_emac.c +++ b/drivers/net/ethernet/ti/davinci_emac.c | |||
| @@ -1532,9 +1532,9 @@ static int emac_dev_open(struct net_device *ndev) | |||
| 1532 | struct device *emac_dev = &ndev->dev; | 1532 | struct device *emac_dev = &ndev->dev; |
| 1533 | u32 cnt; | 1533 | u32 cnt; |
| 1534 | struct resource *res; | 1534 | struct resource *res; |
| 1535 | int ret; | 1535 | int q, m, ret; |
| 1536 | int res_num = 0, irq_num = 0; | ||
| 1536 | int i = 0; | 1537 | int i = 0; |
| 1537 | int k = 0; | ||
| 1538 | struct emac_priv *priv = netdev_priv(ndev); | 1538 | struct emac_priv *priv = netdev_priv(ndev); |
| 1539 | 1539 | ||
| 1540 | pm_runtime_get(&priv->pdev->dev); | 1540 | pm_runtime_get(&priv->pdev->dev); |
| @@ -1564,15 +1564,24 @@ static int emac_dev_open(struct net_device *ndev) | |||
| 1564 | } | 1564 | } |
| 1565 | 1565 | ||
| 1566 | /* Request IRQ */ | 1566 | /* Request IRQ */ |
| 1567 | while ((res = platform_get_resource(priv->pdev, IORESOURCE_IRQ, | ||
| 1568 | res_num))) { | ||
| 1569 | for (irq_num = res->start; irq_num <= res->end; irq_num++) { | ||
| 1570 | dev_err(emac_dev, "Request IRQ %d\n", irq_num); | ||
| 1571 | if (request_irq(irq_num, emac_irq, 0, ndev->name, | ||
| 1572 | ndev)) { | ||
| 1573 | dev_err(emac_dev, | ||
| 1574 | "DaVinci EMAC: request_irq() failed\n"); | ||
| 1575 | ret = -EBUSY; | ||
| 1567 | 1576 | ||
| 1568 | while ((res = platform_get_resource(priv->pdev, IORESOURCE_IRQ, k))) { | ||
| 1569 | for (i = res->start; i <= res->end; i++) { | ||
| 1570 | if (devm_request_irq(&priv->pdev->dev, i, emac_irq, | ||
| 1571 | 0, ndev->name, ndev)) | ||
| 1572 | goto rollback; | 1577 | goto rollback; |
| 1578 | } | ||
| 1573 | } | 1579 | } |
| 1574 | k++; | 1580 | res_num++; |
| 1575 | } | 1581 | } |
| 1582 | /* prepare counters for rollback in case of an error */ | ||
| 1583 | res_num--; | ||
| 1584 | irq_num--; | ||
| 1576 | 1585 | ||
| 1577 | /* Start/Enable EMAC hardware */ | 1586 | /* Start/Enable EMAC hardware */ |
| 1578 | emac_hw_enable(priv); | 1587 | emac_hw_enable(priv); |
| @@ -1639,11 +1648,23 @@ static int emac_dev_open(struct net_device *ndev) | |||
| 1639 | 1648 | ||
| 1640 | return 0; | 1649 | return 0; |
| 1641 | 1650 | ||
| 1642 | rollback: | ||
| 1643 | |||
| 1644 | dev_err(emac_dev, "DaVinci EMAC: devm_request_irq() failed"); | ||
| 1645 | ret = -EBUSY; | ||
| 1646 | err: | 1651 | err: |
| 1652 | emac_int_disable(priv); | ||
| 1653 | napi_disable(&priv->napi); | ||
| 1654 | |||
| 1655 | rollback: | ||
| 1656 | for (q = res_num; q >= 0; q--) { | ||
| 1657 | res = platform_get_resource(priv->pdev, IORESOURCE_IRQ, q); | ||
| 1658 | /* at the first iteration, irq_num is already set to the | ||
| 1659 | * right value | ||
| 1660 | */ | ||
| 1661 | if (q != res_num) | ||
| 1662 | irq_num = res->end; | ||
| 1663 | |||
| 1664 | for (m = irq_num; m >= res->start; m--) | ||
| 1665 | free_irq(m, ndev); | ||
| 1666 | } | ||
| 1667 | cpdma_ctlr_stop(priv->dma); | ||
| 1647 | pm_runtime_put(&priv->pdev->dev); | 1668 | pm_runtime_put(&priv->pdev->dev); |
| 1648 | return ret; | 1669 | return ret; |
| 1649 | } | 1670 | } |
| @@ -1659,6 +1680,9 @@ err: | |||
| 1659 | */ | 1680 | */ |
| 1660 | static int emac_dev_stop(struct net_device *ndev) | 1681 | static int emac_dev_stop(struct net_device *ndev) |
| 1661 | { | 1682 | { |
| 1683 | struct resource *res; | ||
| 1684 | int i = 0; | ||
| 1685 | int irq_num; | ||
| 1662 | struct emac_priv *priv = netdev_priv(ndev); | 1686 | struct emac_priv *priv = netdev_priv(ndev); |
| 1663 | struct device *emac_dev = &ndev->dev; | 1687 | struct device *emac_dev = &ndev->dev; |
| 1664 | 1688 | ||
| @@ -1674,6 +1698,13 @@ static int emac_dev_stop(struct net_device *ndev) | |||
| 1674 | if (priv->phydev) | 1698 | if (priv->phydev) |
| 1675 | phy_disconnect(priv->phydev); | 1699 | phy_disconnect(priv->phydev); |
| 1676 | 1700 | ||
| 1701 | /* Free IRQ */ | ||
| 1702 | while ((res = platform_get_resource(priv->pdev, IORESOURCE_IRQ, i))) { | ||
| 1703 | for (irq_num = res->start; irq_num <= res->end; irq_num++) | ||
| 1704 | free_irq(irq_num, priv->ndev); | ||
| 1705 | i++; | ||
| 1706 | } | ||
| 1707 | |||
| 1677 | if (netif_msg_drv(priv)) | 1708 | if (netif_msg_drv(priv)) |
| 1678 | dev_notice(emac_dev, "DaVinci EMAC: %s stopped\n", ndev->name); | 1709 | dev_notice(emac_dev, "DaVinci EMAC: %s stopped\n", ndev->name); |
| 1679 | 1710 | ||
diff --git a/drivers/net/ethernet/via/via-rhine.c b/drivers/net/ethernet/via/via-rhine.c index ef312bc6b865..6ac20a6738f4 100644 --- a/drivers/net/ethernet/via/via-rhine.c +++ b/drivers/net/ethernet/via/via-rhine.c | |||
| @@ -923,7 +923,7 @@ static int rhine_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 923 | if (rc) { | 923 | if (rc) { |
| 924 | dev_err(&pdev->dev, | 924 | dev_err(&pdev->dev, |
| 925 | "32-bit PCI DMA addresses not supported by the card!?\n"); | 925 | "32-bit PCI DMA addresses not supported by the card!?\n"); |
| 926 | goto err_out; | 926 | goto err_out_pci_disable; |
| 927 | } | 927 | } |
| 928 | 928 | ||
| 929 | /* sanity check */ | 929 | /* sanity check */ |
| @@ -931,7 +931,7 @@ static int rhine_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 931 | (pci_resource_len(pdev, 1) < io_size)) { | 931 | (pci_resource_len(pdev, 1) < io_size)) { |
| 932 | rc = -EIO; | 932 | rc = -EIO; |
| 933 | dev_err(&pdev->dev, "Insufficient PCI resources, aborting\n"); | 933 | dev_err(&pdev->dev, "Insufficient PCI resources, aborting\n"); |
| 934 | goto err_out; | 934 | goto err_out_pci_disable; |
| 935 | } | 935 | } |
| 936 | 936 | ||
| 937 | pioaddr = pci_resource_start(pdev, 0); | 937 | pioaddr = pci_resource_start(pdev, 0); |
| @@ -942,7 +942,7 @@ static int rhine_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 942 | dev = alloc_etherdev(sizeof(struct rhine_private)); | 942 | dev = alloc_etherdev(sizeof(struct rhine_private)); |
| 943 | if (!dev) { | 943 | if (!dev) { |
| 944 | rc = -ENOMEM; | 944 | rc = -ENOMEM; |
| 945 | goto err_out; | 945 | goto err_out_pci_disable; |
| 946 | } | 946 | } |
| 947 | SET_NETDEV_DEV(dev, &pdev->dev); | 947 | SET_NETDEV_DEV(dev, &pdev->dev); |
| 948 | 948 | ||
| @@ -1084,6 +1084,8 @@ err_out_free_res: | |||
| 1084 | pci_release_regions(pdev); | 1084 | pci_release_regions(pdev); |
| 1085 | err_out_free_netdev: | 1085 | err_out_free_netdev: |
| 1086 | free_netdev(dev); | 1086 | free_netdev(dev); |
| 1087 | err_out_pci_disable: | ||
| 1088 | pci_disable_device(pdev); | ||
| 1087 | err_out: | 1089 | err_out: |
| 1088 | return rc; | 1090 | return rc; |
| 1089 | } | 1091 | } |
diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c index 4b970f7624c0..2f6989b1e0dc 100644 --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c | |||
| @@ -683,10 +683,9 @@ EXPORT_SYMBOL(phy_detach); | |||
| 683 | int phy_suspend(struct phy_device *phydev) | 683 | int phy_suspend(struct phy_device *phydev) |
| 684 | { | 684 | { |
| 685 | struct phy_driver *phydrv = to_phy_driver(phydev->dev.driver); | 685 | struct phy_driver *phydrv = to_phy_driver(phydev->dev.driver); |
| 686 | struct ethtool_wolinfo wol; | 686 | struct ethtool_wolinfo wol = { .cmd = ETHTOOL_GWOL }; |
| 687 | 687 | ||
| 688 | /* If the device has WOL enabled, we cannot suspend the PHY */ | 688 | /* If the device has WOL enabled, we cannot suspend the PHY */ |
| 689 | wol.cmd = ETHTOOL_GWOL; | ||
| 690 | phy_ethtool_get_wol(phydev, &wol); | 689 | phy_ethtool_get_wol(phydev, &wol); |
| 691 | if (wol.wolopts) | 690 | if (wol.wolopts) |
| 692 | return -EBUSY; | 691 | return -EBUSY; |
diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c index dbff290ed0e4..d350d2795e10 100644 --- a/drivers/net/usb/cdc_ncm.c +++ b/drivers/net/usb/cdc_ncm.c | |||
| @@ -68,7 +68,6 @@ static struct usb_driver cdc_ncm_driver; | |||
| 68 | static int cdc_ncm_setup(struct usbnet *dev) | 68 | static int cdc_ncm_setup(struct usbnet *dev) |
| 69 | { | 69 | { |
| 70 | struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0]; | 70 | struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0]; |
| 71 | struct usb_cdc_ncm_ntb_parameters ncm_parm; | ||
| 72 | u32 val; | 71 | u32 val; |
| 73 | u8 flags; | 72 | u8 flags; |
| 74 | u8 iface_no; | 73 | u8 iface_no; |
| @@ -82,22 +81,22 @@ static int cdc_ncm_setup(struct usbnet *dev) | |||
| 82 | err = usbnet_read_cmd(dev, USB_CDC_GET_NTB_PARAMETERS, | 81 | err = usbnet_read_cmd(dev, USB_CDC_GET_NTB_PARAMETERS, |
| 83 | USB_TYPE_CLASS | USB_DIR_IN | 82 | USB_TYPE_CLASS | USB_DIR_IN |
| 84 | |USB_RECIP_INTERFACE, | 83 | |USB_RECIP_INTERFACE, |
| 85 | 0, iface_no, &ncm_parm, | 84 | 0, iface_no, &ctx->ncm_parm, |
| 86 | sizeof(ncm_parm)); | 85 | sizeof(ctx->ncm_parm)); |
| 87 | if (err < 0) { | 86 | if (err < 0) { |
| 88 | dev_err(&dev->intf->dev, "failed GET_NTB_PARAMETERS\n"); | 87 | dev_err(&dev->intf->dev, "failed GET_NTB_PARAMETERS\n"); |
| 89 | return err; /* GET_NTB_PARAMETERS is required */ | 88 | return err; /* GET_NTB_PARAMETERS is required */ |
| 90 | } | 89 | } |
| 91 | 90 | ||
| 92 | /* read correct set of parameters according to device mode */ | 91 | /* read correct set of parameters according to device mode */ |
| 93 | ctx->rx_max = le32_to_cpu(ncm_parm.dwNtbInMaxSize); | 92 | ctx->rx_max = le32_to_cpu(ctx->ncm_parm.dwNtbInMaxSize); |
| 94 | ctx->tx_max = le32_to_cpu(ncm_parm.dwNtbOutMaxSize); | 93 | ctx->tx_max = le32_to_cpu(ctx->ncm_parm.dwNtbOutMaxSize); |
| 95 | ctx->tx_remainder = le16_to_cpu(ncm_parm.wNdpOutPayloadRemainder); | 94 | ctx->tx_remainder = le16_to_cpu(ctx->ncm_parm.wNdpOutPayloadRemainder); |
| 96 | ctx->tx_modulus = le16_to_cpu(ncm_parm.wNdpOutDivisor); | 95 | ctx->tx_modulus = le16_to_cpu(ctx->ncm_parm.wNdpOutDivisor); |
| 97 | ctx->tx_ndp_modulus = le16_to_cpu(ncm_parm.wNdpOutAlignment); | 96 | ctx->tx_ndp_modulus = le16_to_cpu(ctx->ncm_parm.wNdpOutAlignment); |
| 98 | /* devices prior to NCM Errata shall set this field to zero */ | 97 | /* devices prior to NCM Errata shall set this field to zero */ |
| 99 | ctx->tx_max_datagrams = le16_to_cpu(ncm_parm.wNtbOutMaxDatagrams); | 98 | ctx->tx_max_datagrams = le16_to_cpu(ctx->ncm_parm.wNtbOutMaxDatagrams); |
| 100 | ntb_fmt_supported = le16_to_cpu(ncm_parm.bmNtbFormatsSupported); | 99 | ntb_fmt_supported = le16_to_cpu(ctx->ncm_parm.bmNtbFormatsSupported); |
| 101 | 100 | ||
| 102 | /* there are some minor differences in NCM and MBIM defaults */ | 101 | /* there are some minor differences in NCM and MBIM defaults */ |
| 103 | if (cdc_ncm_comm_intf_is_mbim(ctx->control->cur_altsetting)) { | 102 | if (cdc_ncm_comm_intf_is_mbim(ctx->control->cur_altsetting)) { |
| @@ -146,7 +145,7 @@ static int cdc_ncm_setup(struct usbnet *dev) | |||
| 146 | } | 145 | } |
| 147 | 146 | ||
| 148 | /* inform device about NTB input size changes */ | 147 | /* inform device about NTB input size changes */ |
| 149 | if (ctx->rx_max != le32_to_cpu(ncm_parm.dwNtbInMaxSize)) { | 148 | if (ctx->rx_max != le32_to_cpu(ctx->ncm_parm.dwNtbInMaxSize)) { |
| 150 | __le32 dwNtbInMaxSize = cpu_to_le32(ctx->rx_max); | 149 | __le32 dwNtbInMaxSize = cpu_to_le32(ctx->rx_max); |
| 151 | 150 | ||
| 152 | err = usbnet_write_cmd(dev, USB_CDC_SET_NTB_INPUT_SIZE, | 151 | err = usbnet_write_cmd(dev, USB_CDC_SET_NTB_INPUT_SIZE, |
| @@ -162,14 +161,6 @@ static int cdc_ncm_setup(struct usbnet *dev) | |||
| 162 | dev_dbg(&dev->intf->dev, "Using default maximum transmit length=%d\n", | 161 | dev_dbg(&dev->intf->dev, "Using default maximum transmit length=%d\n", |
| 163 | CDC_NCM_NTB_MAX_SIZE_TX); | 162 | CDC_NCM_NTB_MAX_SIZE_TX); |
| 164 | ctx->tx_max = CDC_NCM_NTB_MAX_SIZE_TX; | 163 | ctx->tx_max = CDC_NCM_NTB_MAX_SIZE_TX; |
| 165 | |||
| 166 | /* Adding a pad byte here simplifies the handling in | ||
| 167 | * cdc_ncm_fill_tx_frame, by making tx_max always | ||
| 168 | * represent the real skb max size. | ||
| 169 | */ | ||
| 170 | if (ctx->tx_max % usb_maxpacket(dev->udev, dev->out, 1) == 0) | ||
| 171 | ctx->tx_max++; | ||
| 172 | |||
| 173 | } | 164 | } |
| 174 | 165 | ||
| 175 | /* | 166 | /* |
| @@ -439,6 +430,10 @@ advance: | |||
| 439 | goto error2; | 430 | goto error2; |
| 440 | } | 431 | } |
| 441 | 432 | ||
| 433 | /* initialize data interface */ | ||
| 434 | if (cdc_ncm_setup(dev)) | ||
| 435 | goto error2; | ||
| 436 | |||
| 442 | /* configure data interface */ | 437 | /* configure data interface */ |
| 443 | temp = usb_set_interface(dev->udev, iface_no, data_altsetting); | 438 | temp = usb_set_interface(dev->udev, iface_no, data_altsetting); |
| 444 | if (temp) { | 439 | if (temp) { |
| @@ -453,12 +448,6 @@ advance: | |||
| 453 | goto error2; | 448 | goto error2; |
| 454 | } | 449 | } |
| 455 | 450 | ||
| 456 | /* initialize data interface */ | ||
| 457 | if (cdc_ncm_setup(dev)) { | ||
| 458 | dev_dbg(&intf->dev, "cdc_ncm_setup() failed\n"); | ||
| 459 | goto error2; | ||
| 460 | } | ||
| 461 | |||
| 462 | usb_set_intfdata(ctx->data, dev); | 451 | usb_set_intfdata(ctx->data, dev); |
| 463 | usb_set_intfdata(ctx->control, dev); | 452 | usb_set_intfdata(ctx->control, dev); |
| 464 | 453 | ||
| @@ -475,6 +464,15 @@ advance: | |||
| 475 | dev->hard_mtu = ctx->tx_max; | 464 | dev->hard_mtu = ctx->tx_max; |
| 476 | dev->rx_urb_size = ctx->rx_max; | 465 | dev->rx_urb_size = ctx->rx_max; |
| 477 | 466 | ||
| 467 | /* cdc_ncm_setup will override dwNtbOutMaxSize if it is | ||
| 468 | * outside the sane range. Adding a pad byte here if necessary | ||
| 469 | * simplifies the handling in cdc_ncm_fill_tx_frame, making | ||
| 470 | * tx_max always represent the real skb max size. | ||
| 471 | */ | ||
| 472 | if (ctx->tx_max != le32_to_cpu(ctx->ncm_parm.dwNtbOutMaxSize) && | ||
| 473 | ctx->tx_max % usb_maxpacket(dev->udev, dev->out, 1) == 0) | ||
| 474 | ctx->tx_max++; | ||
| 475 | |||
| 478 | return 0; | 476 | return 0; |
| 479 | 477 | ||
| 480 | error2: | 478 | error2: |
diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c index b0f705c2378f..1236812c7be6 100644 --- a/drivers/net/vxlan.c +++ b/drivers/net/vxlan.c | |||
| @@ -1318,6 +1318,9 @@ static int arp_reduce(struct net_device *dev, struct sk_buff *skb) | |||
| 1318 | 1318 | ||
| 1319 | neigh_release(n); | 1319 | neigh_release(n); |
| 1320 | 1320 | ||
| 1321 | if (reply == NULL) | ||
| 1322 | goto out; | ||
| 1323 | |||
| 1321 | skb_reset_mac_header(reply); | 1324 | skb_reset_mac_header(reply); |
| 1322 | __skb_pull(reply, skb_network_offset(reply)); | 1325 | __skb_pull(reply, skb_network_offset(reply)); |
| 1323 | reply->ip_summed = CHECKSUM_UNNECESSARY; | 1326 | reply->ip_summed = CHECKSUM_UNNECESSARY; |
| @@ -1339,15 +1342,103 @@ out: | |||
| 1339 | } | 1342 | } |
| 1340 | 1343 | ||
| 1341 | #if IS_ENABLED(CONFIG_IPV6) | 1344 | #if IS_ENABLED(CONFIG_IPV6) |
| 1345 | |||
| 1346 | static struct sk_buff *vxlan_na_create(struct sk_buff *request, | ||
| 1347 | struct neighbour *n, bool isrouter) | ||
| 1348 | { | ||
| 1349 | struct net_device *dev = request->dev; | ||
| 1350 | struct sk_buff *reply; | ||
| 1351 | struct nd_msg *ns, *na; | ||
| 1352 | struct ipv6hdr *pip6; | ||
| 1353 | u8 *daddr; | ||
| 1354 | int na_olen = 8; /* opt hdr + ETH_ALEN for target */ | ||
| 1355 | int ns_olen; | ||
| 1356 | int i, len; | ||
| 1357 | |||
| 1358 | if (dev == NULL) | ||
| 1359 | return NULL; | ||
| 1360 | |||
| 1361 | len = LL_RESERVED_SPACE(dev) + sizeof(struct ipv6hdr) + | ||
| 1362 | sizeof(*na) + na_olen + dev->needed_tailroom; | ||
| 1363 | reply = alloc_skb(len, GFP_ATOMIC); | ||
| 1364 | if (reply == NULL) | ||
| 1365 | return NULL; | ||
| 1366 | |||
| 1367 | reply->protocol = htons(ETH_P_IPV6); | ||
| 1368 | reply->dev = dev; | ||
| 1369 | skb_reserve(reply, LL_RESERVED_SPACE(request->dev)); | ||
| 1370 | skb_push(reply, sizeof(struct ethhdr)); | ||
| 1371 | skb_set_mac_header(reply, 0); | ||
| 1372 | |||
| 1373 | ns = (struct nd_msg *)skb_transport_header(request); | ||
| 1374 | |||
| 1375 | daddr = eth_hdr(request)->h_source; | ||
| 1376 | ns_olen = request->len - skb_transport_offset(request) - sizeof(*ns); | ||
| 1377 | for (i = 0; i < ns_olen-1; i += (ns->opt[i+1]<<3)) { | ||
| 1378 | if (ns->opt[i] == ND_OPT_SOURCE_LL_ADDR) { | ||
| 1379 | daddr = ns->opt + i + sizeof(struct nd_opt_hdr); | ||
| 1380 | break; | ||
| 1381 | } | ||
| 1382 | } | ||
| 1383 | |||
| 1384 | /* Ethernet header */ | ||
| 1385 | ether_addr_copy(eth_hdr(reply)->h_dest, daddr); | ||
| 1386 | ether_addr_copy(eth_hdr(reply)->h_source, n->ha); | ||
| 1387 | eth_hdr(reply)->h_proto = htons(ETH_P_IPV6); | ||
| 1388 | reply->protocol = htons(ETH_P_IPV6); | ||
| 1389 | |||
| 1390 | skb_pull(reply, sizeof(struct ethhdr)); | ||
| 1391 | skb_set_network_header(reply, 0); | ||
| 1392 | skb_put(reply, sizeof(struct ipv6hdr)); | ||
| 1393 | |||
| 1394 | /* IPv6 header */ | ||
| 1395 | |||
| 1396 | pip6 = ipv6_hdr(reply); | ||
| 1397 | memset(pip6, 0, sizeof(struct ipv6hdr)); | ||
| 1398 | pip6->version = 6; | ||
| 1399 | pip6->priority = ipv6_hdr(request)->priority; | ||
| 1400 | pip6->nexthdr = IPPROTO_ICMPV6; | ||
| 1401 | pip6->hop_limit = 255; | ||
| 1402 | pip6->daddr = ipv6_hdr(request)->saddr; | ||
| 1403 | pip6->saddr = *(struct in6_addr *)n->primary_key; | ||
| 1404 | |||
| 1405 | skb_pull(reply, sizeof(struct ipv6hdr)); | ||
| 1406 | skb_set_transport_header(reply, 0); | ||
| 1407 | |||
| 1408 | na = (struct nd_msg *)skb_put(reply, sizeof(*na) + na_olen); | ||
| 1409 | |||
| 1410 | /* Neighbor Advertisement */ | ||
| 1411 | memset(na, 0, sizeof(*na)+na_olen); | ||
| 1412 | na->icmph.icmp6_type = NDISC_NEIGHBOUR_ADVERTISEMENT; | ||
| 1413 | na->icmph.icmp6_router = isrouter; | ||
| 1414 | na->icmph.icmp6_override = 1; | ||
| 1415 | na->icmph.icmp6_solicited = 1; | ||
| 1416 | na->target = ns->target; | ||
| 1417 | ether_addr_copy(&na->opt[2], n->ha); | ||
| 1418 | na->opt[0] = ND_OPT_TARGET_LL_ADDR; | ||
| 1419 | na->opt[1] = na_olen >> 3; | ||
| 1420 | |||
| 1421 | na->icmph.icmp6_cksum = csum_ipv6_magic(&pip6->saddr, | ||
| 1422 | &pip6->daddr, sizeof(*na)+na_olen, IPPROTO_ICMPV6, | ||
| 1423 | csum_partial(na, sizeof(*na)+na_olen, 0)); | ||
| 1424 | |||
| 1425 | pip6->payload_len = htons(sizeof(*na)+na_olen); | ||
| 1426 | |||
| 1427 | skb_push(reply, sizeof(struct ipv6hdr)); | ||
| 1428 | |||
| 1429 | reply->ip_summed = CHECKSUM_UNNECESSARY; | ||
| 1430 | |||
| 1431 | return reply; | ||
| 1432 | } | ||
| 1433 | |||
| 1342 | static int neigh_reduce(struct net_device *dev, struct sk_buff *skb) | 1434 | static int neigh_reduce(struct net_device *dev, struct sk_buff *skb) |
| 1343 | { | 1435 | { |
| 1344 | struct vxlan_dev *vxlan = netdev_priv(dev); | 1436 | struct vxlan_dev *vxlan = netdev_priv(dev); |
| 1345 | struct neighbour *n; | 1437 | struct nd_msg *msg; |
| 1346 | union vxlan_addr ipa; | ||
| 1347 | const struct ipv6hdr *iphdr; | 1438 | const struct ipv6hdr *iphdr; |
| 1348 | const struct in6_addr *saddr, *daddr; | 1439 | const struct in6_addr *saddr, *daddr; |
| 1349 | struct nd_msg *msg; | 1440 | struct neighbour *n; |
| 1350 | struct inet6_dev *in6_dev = NULL; | 1441 | struct inet6_dev *in6_dev; |
| 1351 | 1442 | ||
| 1352 | in6_dev = __in6_dev_get(dev); | 1443 | in6_dev = __in6_dev_get(dev); |
| 1353 | if (!in6_dev) | 1444 | if (!in6_dev) |
| @@ -1360,19 +1451,20 @@ static int neigh_reduce(struct net_device *dev, struct sk_buff *skb) | |||
| 1360 | saddr = &iphdr->saddr; | 1451 | saddr = &iphdr->saddr; |
| 1361 | daddr = &iphdr->daddr; | 1452 | daddr = &iphdr->daddr; |
| 1362 | 1453 | ||
| 1363 | if (ipv6_addr_loopback(daddr) || | ||
| 1364 | ipv6_addr_is_multicast(daddr)) | ||
| 1365 | goto out; | ||
| 1366 | |||
| 1367 | msg = (struct nd_msg *)skb_transport_header(skb); | 1454 | msg = (struct nd_msg *)skb_transport_header(skb); |
| 1368 | if (msg->icmph.icmp6_code != 0 || | 1455 | if (msg->icmph.icmp6_code != 0 || |
| 1369 | msg->icmph.icmp6_type != NDISC_NEIGHBOUR_SOLICITATION) | 1456 | msg->icmph.icmp6_type != NDISC_NEIGHBOUR_SOLICITATION) |
| 1370 | goto out; | 1457 | goto out; |
| 1371 | 1458 | ||
| 1372 | n = neigh_lookup(ipv6_stub->nd_tbl, daddr, dev); | 1459 | if (ipv6_addr_loopback(daddr) || |
| 1460 | ipv6_addr_is_multicast(&msg->target)) | ||
| 1461 | goto out; | ||
| 1462 | |||
| 1463 | n = neigh_lookup(ipv6_stub->nd_tbl, &msg->target, dev); | ||
| 1373 | 1464 | ||
| 1374 | if (n) { | 1465 | if (n) { |
| 1375 | struct vxlan_fdb *f; | 1466 | struct vxlan_fdb *f; |
| 1467 | struct sk_buff *reply; | ||
| 1376 | 1468 | ||
| 1377 | if (!(n->nud_state & NUD_CONNECTED)) { | 1469 | if (!(n->nud_state & NUD_CONNECTED)) { |
| 1378 | neigh_release(n); | 1470 | neigh_release(n); |
| @@ -1386,13 +1478,23 @@ static int neigh_reduce(struct net_device *dev, struct sk_buff *skb) | |||
| 1386 | goto out; | 1478 | goto out; |
| 1387 | } | 1479 | } |
| 1388 | 1480 | ||
| 1389 | ipv6_stub->ndisc_send_na(dev, n, saddr, &msg->target, | 1481 | reply = vxlan_na_create(skb, n, |
| 1390 | !!in6_dev->cnf.forwarding, | 1482 | !!(f ? f->flags & NTF_ROUTER : 0)); |
| 1391 | true, false, false); | 1483 | |
| 1392 | neigh_release(n); | 1484 | neigh_release(n); |
| 1485 | |||
| 1486 | if (reply == NULL) | ||
| 1487 | goto out; | ||
| 1488 | |||
| 1489 | if (netif_rx_ni(reply) == NET_RX_DROP) | ||
| 1490 | dev->stats.rx_dropped++; | ||
| 1491 | |||
| 1393 | } else if (vxlan->flags & VXLAN_F_L3MISS) { | 1492 | } else if (vxlan->flags & VXLAN_F_L3MISS) { |
| 1394 | ipa.sin6.sin6_addr = *daddr; | 1493 | union vxlan_addr ipa = { |
| 1395 | ipa.sa.sa_family = AF_INET6; | 1494 | .sin6.sin6_addr = msg->target, |
| 1495 | .sa.sa_family = AF_INET6, | ||
| 1496 | }; | ||
| 1497 | |||
| 1396 | vxlan_ip_miss(dev, &ipa); | 1498 | vxlan_ip_miss(dev, &ipa); |
| 1397 | } | 1499 | } |
| 1398 | 1500 | ||
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c index 303ce27964c1..9078a6c5a74e 100644 --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c | |||
| @@ -1548,6 +1548,7 @@ bool ath9k_hw_check_alive(struct ath_hw *ah) | |||
| 1548 | if (reg != last_val) | 1548 | if (reg != last_val) |
| 1549 | return true; | 1549 | return true; |
| 1550 | 1550 | ||
| 1551 | udelay(1); | ||
| 1551 | last_val = reg; | 1552 | last_val = reg; |
| 1552 | if ((reg & 0x7E7FFFEF) == 0x00702400) | 1553 | if ((reg & 0x7E7FFFEF) == 0x00702400) |
| 1553 | continue; | 1554 | continue; |
| @@ -1560,8 +1561,6 @@ bool ath9k_hw_check_alive(struct ath_hw *ah) | |||
| 1560 | default: | 1561 | default: |
| 1561 | return true; | 1562 | return true; |
| 1562 | } | 1563 | } |
| 1563 | |||
| 1564 | udelay(1); | ||
| 1565 | } while (count-- > 0); | 1564 | } while (count-- > 0); |
| 1566 | 1565 | ||
| 1567 | return false; | 1566 | return false; |
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c index f042a18c8495..55897d508a76 100644 --- a/drivers/net/wireless/ath/ath9k/xmit.c +++ b/drivers/net/wireless/ath/ath9k/xmit.c | |||
| @@ -2063,7 +2063,7 @@ static struct ath_buf *ath_tx_setup_buffer(struct ath_softc *sc, | |||
| 2063 | 2063 | ||
| 2064 | ATH_TXBUF_RESET(bf); | 2064 | ATH_TXBUF_RESET(bf); |
| 2065 | 2065 | ||
| 2066 | if (tid) { | 2066 | if (tid && ieee80211_is_data_present(hdr->frame_control)) { |
| 2067 | fragno = le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_FRAG; | 2067 | fragno = le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_FRAG; |
| 2068 | seqno = tid->seq_next; | 2068 | seqno = tid->seq_next; |
| 2069 | hdr->seq_ctrl = cpu_to_le16(tid->seq_next << IEEE80211_SEQ_SEQ_SHIFT); | 2069 | hdr->seq_ctrl = cpu_to_le16(tid->seq_next << IEEE80211_SEQ_SEQ_SHIFT); |
| @@ -2186,7 +2186,7 @@ int ath_tx_start(struct ieee80211_hw *hw, struct sk_buff *skb, | |||
| 2186 | txq->stopped = true; | 2186 | txq->stopped = true; |
| 2187 | } | 2187 | } |
| 2188 | 2188 | ||
| 2189 | if (txctl->an) | 2189 | if (txctl->an && ieee80211_is_data_present(hdr->frame_control)) |
| 2190 | tid = ath_get_skb_tid(sc, txctl->an, skb); | 2190 | tid = ath_get_skb_tid(sc, txctl->an, skb); |
| 2191 | 2191 | ||
| 2192 | if (info->flags & IEEE80211_TX_CTL_PS_RESPONSE) { | 2192 | if (info->flags & IEEE80211_TX_CTL_PS_RESPONSE) { |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c index 119ee6eaf1c3..ddaa9efd053d 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c | |||
| @@ -1948,8 +1948,10 @@ static int brcmf_sdio_txpkt_prep_sg(struct brcmf_sdio *bus, | |||
| 1948 | if (pkt_pad == NULL) | 1948 | if (pkt_pad == NULL) |
| 1949 | return -ENOMEM; | 1949 | return -ENOMEM; |
| 1950 | ret = brcmf_sdio_txpkt_hdalign(bus, pkt_pad); | 1950 | ret = brcmf_sdio_txpkt_hdalign(bus, pkt_pad); |
| 1951 | if (unlikely(ret < 0)) | 1951 | if (unlikely(ret < 0)) { |
| 1952 | kfree_skb(pkt_pad); | ||
| 1952 | return ret; | 1953 | return ret; |
| 1954 | } | ||
| 1953 | memcpy(pkt_pad->data, | 1955 | memcpy(pkt_pad->data, |
| 1954 | pkt->data + pkt->len - tail_chop, | 1956 | pkt->data + pkt->len - tail_chop, |
| 1955 | tail_chop); | 1957 | tail_chop); |
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c index 7f8b5d156c8c..41d4a8167dc3 100644 --- a/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c | |||
| @@ -5460,14 +5460,15 @@ static void rt2800_init_bbp_53xx(struct rt2x00_dev *rt2x00dev) | |||
| 5460 | 5460 | ||
| 5461 | rt2800_bbp_write(rt2x00dev, 68, 0x0b); | 5461 | rt2800_bbp_write(rt2x00dev, 68, 0x0b); |
| 5462 | 5462 | ||
| 5463 | rt2800_bbp_write(rt2x00dev, 69, 0x0d); | 5463 | rt2800_bbp_write(rt2x00dev, 69, 0x12); |
| 5464 | rt2800_bbp_write(rt2x00dev, 70, 0x06); | ||
| 5465 | rt2800_bbp_write(rt2x00dev, 73, 0x13); | 5464 | rt2800_bbp_write(rt2x00dev, 73, 0x13); |
| 5466 | rt2800_bbp_write(rt2x00dev, 75, 0x46); | 5465 | rt2800_bbp_write(rt2x00dev, 75, 0x46); |
| 5467 | rt2800_bbp_write(rt2x00dev, 76, 0x28); | 5466 | rt2800_bbp_write(rt2x00dev, 76, 0x28); |
| 5468 | 5467 | ||
| 5469 | rt2800_bbp_write(rt2x00dev, 77, 0x59); | 5468 | rt2800_bbp_write(rt2x00dev, 77, 0x59); |
| 5470 | 5469 | ||
| 5470 | rt2800_bbp_write(rt2x00dev, 70, 0x0a); | ||
| 5471 | |||
| 5471 | rt2800_bbp_write(rt2x00dev, 79, 0x13); | 5472 | rt2800_bbp_write(rt2x00dev, 79, 0x13); |
| 5472 | rt2800_bbp_write(rt2x00dev, 80, 0x05); | 5473 | rt2800_bbp_write(rt2x00dev, 80, 0x05); |
| 5473 | rt2800_bbp_write(rt2x00dev, 81, 0x33); | 5474 | rt2800_bbp_write(rt2x00dev, 81, 0x33); |
| @@ -5510,7 +5511,6 @@ static void rt2800_init_bbp_53xx(struct rt2x00_dev *rt2x00dev) | |||
| 5510 | if (rt2x00_rt(rt2x00dev, RT5392)) { | 5511 | if (rt2x00_rt(rt2x00dev, RT5392)) { |
| 5511 | rt2800_bbp_write(rt2x00dev, 134, 0xd0); | 5512 | rt2800_bbp_write(rt2x00dev, 134, 0xd0); |
| 5512 | rt2800_bbp_write(rt2x00dev, 135, 0xf6); | 5513 | rt2800_bbp_write(rt2x00dev, 135, 0xf6); |
| 5513 | rt2800_bbp_write(rt2x00dev, 148, 0x84); | ||
| 5514 | } | 5514 | } |
| 5515 | 5515 | ||
| 5516 | rt2800_disable_unused_dac_adc(rt2x00dev); | 5516 | rt2800_disable_unused_dac_adc(rt2x00dev); |
diff --git a/drivers/scsi/bnx2fc/bnx2fc_io.c b/drivers/scsi/bnx2fc/bnx2fc_io.c index ed880891cb7c..e9279a8c1e1c 100644 --- a/drivers/scsi/bnx2fc/bnx2fc_io.c +++ b/drivers/scsi/bnx2fc/bnx2fc_io.c | |||
| @@ -594,13 +594,13 @@ static void bnx2fc_free_mp_resc(struct bnx2fc_cmd *io_req) | |||
| 594 | mp_req->mp_resp_bd = NULL; | 594 | mp_req->mp_resp_bd = NULL; |
| 595 | } | 595 | } |
| 596 | if (mp_req->req_buf) { | 596 | if (mp_req->req_buf) { |
| 597 | dma_free_coherent(&hba->pcidev->dev, PAGE_SIZE, | 597 | dma_free_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE, |
| 598 | mp_req->req_buf, | 598 | mp_req->req_buf, |
| 599 | mp_req->req_buf_dma); | 599 | mp_req->req_buf_dma); |
| 600 | mp_req->req_buf = NULL; | 600 | mp_req->req_buf = NULL; |
| 601 | } | 601 | } |
| 602 | if (mp_req->resp_buf) { | 602 | if (mp_req->resp_buf) { |
| 603 | dma_free_coherent(&hba->pcidev->dev, PAGE_SIZE, | 603 | dma_free_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE, |
| 604 | mp_req->resp_buf, | 604 | mp_req->resp_buf, |
| 605 | mp_req->resp_buf_dma); | 605 | mp_req->resp_buf_dma); |
| 606 | mp_req->resp_buf = NULL; | 606 | mp_req->resp_buf = NULL; |
| @@ -622,7 +622,7 @@ int bnx2fc_init_mp_req(struct bnx2fc_cmd *io_req) | |||
| 622 | 622 | ||
| 623 | mp_req->req_len = sizeof(struct fcp_cmnd); | 623 | mp_req->req_len = sizeof(struct fcp_cmnd); |
| 624 | io_req->data_xfer_len = mp_req->req_len; | 624 | io_req->data_xfer_len = mp_req->req_len; |
| 625 | mp_req->req_buf = dma_alloc_coherent(&hba->pcidev->dev, PAGE_SIZE, | 625 | mp_req->req_buf = dma_alloc_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE, |
| 626 | &mp_req->req_buf_dma, | 626 | &mp_req->req_buf_dma, |
| 627 | GFP_ATOMIC); | 627 | GFP_ATOMIC); |
| 628 | if (!mp_req->req_buf) { | 628 | if (!mp_req->req_buf) { |
| @@ -631,7 +631,7 @@ int bnx2fc_init_mp_req(struct bnx2fc_cmd *io_req) | |||
| 631 | return FAILED; | 631 | return FAILED; |
| 632 | } | 632 | } |
| 633 | 633 | ||
| 634 | mp_req->resp_buf = dma_alloc_coherent(&hba->pcidev->dev, PAGE_SIZE, | 634 | mp_req->resp_buf = dma_alloc_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE, |
| 635 | &mp_req->resp_buf_dma, | 635 | &mp_req->resp_buf_dma, |
| 636 | GFP_ATOMIC); | 636 | GFP_ATOMIC); |
| 637 | if (!mp_req->resp_buf) { | 637 | if (!mp_req->resp_buf) { |
| @@ -639,8 +639,8 @@ int bnx2fc_init_mp_req(struct bnx2fc_cmd *io_req) | |||
| 639 | bnx2fc_free_mp_resc(io_req); | 639 | bnx2fc_free_mp_resc(io_req); |
| 640 | return FAILED; | 640 | return FAILED; |
| 641 | } | 641 | } |
| 642 | memset(mp_req->req_buf, 0, PAGE_SIZE); | 642 | memset(mp_req->req_buf, 0, CNIC_PAGE_SIZE); |
| 643 | memset(mp_req->resp_buf, 0, PAGE_SIZE); | 643 | memset(mp_req->resp_buf, 0, CNIC_PAGE_SIZE); |
| 644 | 644 | ||
| 645 | /* Allocate and map mp_req_bd and mp_resp_bd */ | 645 | /* Allocate and map mp_req_bd and mp_resp_bd */ |
| 646 | sz = sizeof(struct fcoe_bd_ctx); | 646 | sz = sizeof(struct fcoe_bd_ctx); |
| @@ -665,7 +665,7 @@ int bnx2fc_init_mp_req(struct bnx2fc_cmd *io_req) | |||
| 665 | mp_req_bd = mp_req->mp_req_bd; | 665 | mp_req_bd = mp_req->mp_req_bd; |
| 666 | mp_req_bd->buf_addr_lo = (u32)addr & 0xffffffff; | 666 | mp_req_bd->buf_addr_lo = (u32)addr & 0xffffffff; |
| 667 | mp_req_bd->buf_addr_hi = (u32)((u64)addr >> 32); | 667 | mp_req_bd->buf_addr_hi = (u32)((u64)addr >> 32); |
| 668 | mp_req_bd->buf_len = PAGE_SIZE; | 668 | mp_req_bd->buf_len = CNIC_PAGE_SIZE; |
| 669 | mp_req_bd->flags = 0; | 669 | mp_req_bd->flags = 0; |
| 670 | 670 | ||
| 671 | /* | 671 | /* |
| @@ -677,7 +677,7 @@ int bnx2fc_init_mp_req(struct bnx2fc_cmd *io_req) | |||
| 677 | addr = mp_req->resp_buf_dma; | 677 | addr = mp_req->resp_buf_dma; |
| 678 | mp_resp_bd->buf_addr_lo = (u32)addr & 0xffffffff; | 678 | mp_resp_bd->buf_addr_lo = (u32)addr & 0xffffffff; |
| 679 | mp_resp_bd->buf_addr_hi = (u32)((u64)addr >> 32); | 679 | mp_resp_bd->buf_addr_hi = (u32)((u64)addr >> 32); |
| 680 | mp_resp_bd->buf_len = PAGE_SIZE; | 680 | mp_resp_bd->buf_len = CNIC_PAGE_SIZE; |
| 681 | mp_resp_bd->flags = 0; | 681 | mp_resp_bd->flags = 0; |
| 682 | 682 | ||
| 683 | return SUCCESS; | 683 | return SUCCESS; |
diff --git a/drivers/scsi/bnx2fc/bnx2fc_tgt.c b/drivers/scsi/bnx2fc/bnx2fc_tgt.c index 4d93177dfb53..d9bae5672273 100644 --- a/drivers/scsi/bnx2fc/bnx2fc_tgt.c +++ b/drivers/scsi/bnx2fc/bnx2fc_tgt.c | |||
| @@ -673,7 +673,8 @@ static int bnx2fc_alloc_session_resc(struct bnx2fc_hba *hba, | |||
| 673 | 673 | ||
| 674 | /* Allocate and map SQ */ | 674 | /* Allocate and map SQ */ |
| 675 | tgt->sq_mem_size = tgt->max_sqes * BNX2FC_SQ_WQE_SIZE; | 675 | tgt->sq_mem_size = tgt->max_sqes * BNX2FC_SQ_WQE_SIZE; |
| 676 | tgt->sq_mem_size = (tgt->sq_mem_size + (PAGE_SIZE - 1)) & PAGE_MASK; | 676 | tgt->sq_mem_size = (tgt->sq_mem_size + (CNIC_PAGE_SIZE - 1)) & |
| 677 | CNIC_PAGE_MASK; | ||
| 677 | 678 | ||
| 678 | tgt->sq = dma_alloc_coherent(&hba->pcidev->dev, tgt->sq_mem_size, | 679 | tgt->sq = dma_alloc_coherent(&hba->pcidev->dev, tgt->sq_mem_size, |
| 679 | &tgt->sq_dma, GFP_KERNEL); | 680 | &tgt->sq_dma, GFP_KERNEL); |
| @@ -686,7 +687,8 @@ static int bnx2fc_alloc_session_resc(struct bnx2fc_hba *hba, | |||
| 686 | 687 | ||
| 687 | /* Allocate and map CQ */ | 688 | /* Allocate and map CQ */ |
| 688 | tgt->cq_mem_size = tgt->max_cqes * BNX2FC_CQ_WQE_SIZE; | 689 | tgt->cq_mem_size = tgt->max_cqes * BNX2FC_CQ_WQE_SIZE; |
| 689 | tgt->cq_mem_size = (tgt->cq_mem_size + (PAGE_SIZE - 1)) & PAGE_MASK; | 690 | tgt->cq_mem_size = (tgt->cq_mem_size + (CNIC_PAGE_SIZE - 1)) & |
| 691 | CNIC_PAGE_MASK; | ||
| 690 | 692 | ||
| 691 | tgt->cq = dma_alloc_coherent(&hba->pcidev->dev, tgt->cq_mem_size, | 693 | tgt->cq = dma_alloc_coherent(&hba->pcidev->dev, tgt->cq_mem_size, |
| 692 | &tgt->cq_dma, GFP_KERNEL); | 694 | &tgt->cq_dma, GFP_KERNEL); |
| @@ -699,7 +701,8 @@ static int bnx2fc_alloc_session_resc(struct bnx2fc_hba *hba, | |||
| 699 | 701 | ||
| 700 | /* Allocate and map RQ and RQ PBL */ | 702 | /* Allocate and map RQ and RQ PBL */ |
| 701 | tgt->rq_mem_size = tgt->max_rqes * BNX2FC_RQ_WQE_SIZE; | 703 | tgt->rq_mem_size = tgt->max_rqes * BNX2FC_RQ_WQE_SIZE; |
| 702 | tgt->rq_mem_size = (tgt->rq_mem_size + (PAGE_SIZE - 1)) & PAGE_MASK; | 704 | tgt->rq_mem_size = (tgt->rq_mem_size + (CNIC_PAGE_SIZE - 1)) & |
| 705 | CNIC_PAGE_MASK; | ||
| 703 | 706 | ||
| 704 | tgt->rq = dma_alloc_coherent(&hba->pcidev->dev, tgt->rq_mem_size, | 707 | tgt->rq = dma_alloc_coherent(&hba->pcidev->dev, tgt->rq_mem_size, |
| 705 | &tgt->rq_dma, GFP_KERNEL); | 708 | &tgt->rq_dma, GFP_KERNEL); |
| @@ -710,8 +713,9 @@ static int bnx2fc_alloc_session_resc(struct bnx2fc_hba *hba, | |||
| 710 | } | 713 | } |
| 711 | memset(tgt->rq, 0, tgt->rq_mem_size); | 714 | memset(tgt->rq, 0, tgt->rq_mem_size); |
| 712 | 715 | ||
| 713 | tgt->rq_pbl_size = (tgt->rq_mem_size / PAGE_SIZE) * sizeof(void *); | 716 | tgt->rq_pbl_size = (tgt->rq_mem_size / CNIC_PAGE_SIZE) * sizeof(void *); |
| 714 | tgt->rq_pbl_size = (tgt->rq_pbl_size + (PAGE_SIZE - 1)) & PAGE_MASK; | 717 | tgt->rq_pbl_size = (tgt->rq_pbl_size + (CNIC_PAGE_SIZE - 1)) & |
| 718 | CNIC_PAGE_MASK; | ||
| 715 | 719 | ||
| 716 | tgt->rq_pbl = dma_alloc_coherent(&hba->pcidev->dev, tgt->rq_pbl_size, | 720 | tgt->rq_pbl = dma_alloc_coherent(&hba->pcidev->dev, tgt->rq_pbl_size, |
| 717 | &tgt->rq_pbl_dma, GFP_KERNEL); | 721 | &tgt->rq_pbl_dma, GFP_KERNEL); |
| @@ -722,7 +726,7 @@ static int bnx2fc_alloc_session_resc(struct bnx2fc_hba *hba, | |||
| 722 | } | 726 | } |
| 723 | 727 | ||
| 724 | memset(tgt->rq_pbl, 0, tgt->rq_pbl_size); | 728 | memset(tgt->rq_pbl, 0, tgt->rq_pbl_size); |
| 725 | num_pages = tgt->rq_mem_size / PAGE_SIZE; | 729 | num_pages = tgt->rq_mem_size / CNIC_PAGE_SIZE; |
| 726 | page = tgt->rq_dma; | 730 | page = tgt->rq_dma; |
| 727 | pbl = (u32 *)tgt->rq_pbl; | 731 | pbl = (u32 *)tgt->rq_pbl; |
| 728 | 732 | ||
| @@ -731,13 +735,13 @@ static int bnx2fc_alloc_session_resc(struct bnx2fc_hba *hba, | |||
| 731 | pbl++; | 735 | pbl++; |
| 732 | *pbl = (u32)((u64)page >> 32); | 736 | *pbl = (u32)((u64)page >> 32); |
| 733 | pbl++; | 737 | pbl++; |
| 734 | page += PAGE_SIZE; | 738 | page += CNIC_PAGE_SIZE; |
| 735 | } | 739 | } |
| 736 | 740 | ||
| 737 | /* Allocate and map XFERQ */ | 741 | /* Allocate and map XFERQ */ |
| 738 | tgt->xferq_mem_size = tgt->max_sqes * BNX2FC_XFERQ_WQE_SIZE; | 742 | tgt->xferq_mem_size = tgt->max_sqes * BNX2FC_XFERQ_WQE_SIZE; |
| 739 | tgt->xferq_mem_size = (tgt->xferq_mem_size + (PAGE_SIZE - 1)) & | 743 | tgt->xferq_mem_size = (tgt->xferq_mem_size + (CNIC_PAGE_SIZE - 1)) & |
| 740 | PAGE_MASK; | 744 | CNIC_PAGE_MASK; |
| 741 | 745 | ||
| 742 | tgt->xferq = dma_alloc_coherent(&hba->pcidev->dev, tgt->xferq_mem_size, | 746 | tgt->xferq = dma_alloc_coherent(&hba->pcidev->dev, tgt->xferq_mem_size, |
| 743 | &tgt->xferq_dma, GFP_KERNEL); | 747 | &tgt->xferq_dma, GFP_KERNEL); |
| @@ -750,8 +754,8 @@ static int bnx2fc_alloc_session_resc(struct bnx2fc_hba *hba, | |||
| 750 | 754 | ||
| 751 | /* Allocate and map CONFQ & CONFQ PBL */ | 755 | /* Allocate and map CONFQ & CONFQ PBL */ |
| 752 | tgt->confq_mem_size = tgt->max_sqes * BNX2FC_CONFQ_WQE_SIZE; | 756 | tgt->confq_mem_size = tgt->max_sqes * BNX2FC_CONFQ_WQE_SIZE; |
| 753 | tgt->confq_mem_size = (tgt->confq_mem_size + (PAGE_SIZE - 1)) & | 757 | tgt->confq_mem_size = (tgt->confq_mem_size + (CNIC_PAGE_SIZE - 1)) & |
| 754 | PAGE_MASK; | 758 | CNIC_PAGE_MASK; |
| 755 | 759 | ||
| 756 | tgt->confq = dma_alloc_coherent(&hba->pcidev->dev, tgt->confq_mem_size, | 760 | tgt->confq = dma_alloc_coherent(&hba->pcidev->dev, tgt->confq_mem_size, |
| 757 | &tgt->confq_dma, GFP_KERNEL); | 761 | &tgt->confq_dma, GFP_KERNEL); |
| @@ -763,9 +767,9 @@ static int bnx2fc_alloc_session_resc(struct bnx2fc_hba *hba, | |||
| 763 | memset(tgt->confq, 0, tgt->confq_mem_size); | 767 | memset(tgt->confq, 0, tgt->confq_mem_size); |
| 764 | 768 | ||
| 765 | tgt->confq_pbl_size = | 769 | tgt->confq_pbl_size = |
| 766 | (tgt->confq_mem_size / PAGE_SIZE) * sizeof(void *); | 770 | (tgt->confq_mem_size / CNIC_PAGE_SIZE) * sizeof(void *); |
| 767 | tgt->confq_pbl_size = | 771 | tgt->confq_pbl_size = |
| 768 | (tgt->confq_pbl_size + (PAGE_SIZE - 1)) & PAGE_MASK; | 772 | (tgt->confq_pbl_size + (CNIC_PAGE_SIZE - 1)) & CNIC_PAGE_MASK; |
| 769 | 773 | ||
| 770 | tgt->confq_pbl = dma_alloc_coherent(&hba->pcidev->dev, | 774 | tgt->confq_pbl = dma_alloc_coherent(&hba->pcidev->dev, |
| 771 | tgt->confq_pbl_size, | 775 | tgt->confq_pbl_size, |
| @@ -777,7 +781,7 @@ static int bnx2fc_alloc_session_resc(struct bnx2fc_hba *hba, | |||
| 777 | } | 781 | } |
| 778 | 782 | ||
| 779 | memset(tgt->confq_pbl, 0, tgt->confq_pbl_size); | 783 | memset(tgt->confq_pbl, 0, tgt->confq_pbl_size); |
| 780 | num_pages = tgt->confq_mem_size / PAGE_SIZE; | 784 | num_pages = tgt->confq_mem_size / CNIC_PAGE_SIZE; |
| 781 | page = tgt->confq_dma; | 785 | page = tgt->confq_dma; |
| 782 | pbl = (u32 *)tgt->confq_pbl; | 786 | pbl = (u32 *)tgt->confq_pbl; |
| 783 | 787 | ||
| @@ -786,7 +790,7 @@ static int bnx2fc_alloc_session_resc(struct bnx2fc_hba *hba, | |||
| 786 | pbl++; | 790 | pbl++; |
| 787 | *pbl = (u32)((u64)page >> 32); | 791 | *pbl = (u32)((u64)page >> 32); |
| 788 | pbl++; | 792 | pbl++; |
| 789 | page += PAGE_SIZE; | 793 | page += CNIC_PAGE_SIZE; |
| 790 | } | 794 | } |
| 791 | 795 | ||
| 792 | /* Allocate and map ConnDB */ | 796 | /* Allocate and map ConnDB */ |
| @@ -805,8 +809,8 @@ static int bnx2fc_alloc_session_resc(struct bnx2fc_hba *hba, | |||
| 805 | 809 | ||
| 806 | /* Allocate and map LCQ */ | 810 | /* Allocate and map LCQ */ |
| 807 | tgt->lcq_mem_size = (tgt->max_sqes + 8) * BNX2FC_SQ_WQE_SIZE; | 811 | tgt->lcq_mem_size = (tgt->max_sqes + 8) * BNX2FC_SQ_WQE_SIZE; |
| 808 | tgt->lcq_mem_size = (tgt->lcq_mem_size + (PAGE_SIZE - 1)) & | 812 | tgt->lcq_mem_size = (tgt->lcq_mem_size + (CNIC_PAGE_SIZE - 1)) & |
| 809 | PAGE_MASK; | 813 | CNIC_PAGE_MASK; |
| 810 | 814 | ||
| 811 | tgt->lcq = dma_alloc_coherent(&hba->pcidev->dev, tgt->lcq_mem_size, | 815 | tgt->lcq = dma_alloc_coherent(&hba->pcidev->dev, tgt->lcq_mem_size, |
| 812 | &tgt->lcq_dma, GFP_KERNEL); | 816 | &tgt->lcq_dma, GFP_KERNEL); |
diff --git a/drivers/scsi/bnx2i/bnx2i_hwi.c b/drivers/scsi/bnx2i/bnx2i_hwi.c index e4cf23df4b4f..b87a1933f880 100644 --- a/drivers/scsi/bnx2i/bnx2i_hwi.c +++ b/drivers/scsi/bnx2i/bnx2i_hwi.c | |||
| @@ -61,7 +61,7 @@ static void bnx2i_adjust_qp_size(struct bnx2i_hba *hba) | |||
| 61 | * yield integral num of page buffers | 61 | * yield integral num of page buffers |
| 62 | */ | 62 | */ |
| 63 | /* adjust SQ */ | 63 | /* adjust SQ */ |
| 64 | num_elements_per_pg = PAGE_SIZE / BNX2I_SQ_WQE_SIZE; | 64 | num_elements_per_pg = CNIC_PAGE_SIZE / BNX2I_SQ_WQE_SIZE; |
| 65 | if (hba->max_sqes < num_elements_per_pg) | 65 | if (hba->max_sqes < num_elements_per_pg) |
| 66 | hba->max_sqes = num_elements_per_pg; | 66 | hba->max_sqes = num_elements_per_pg; |
| 67 | else if (hba->max_sqes % num_elements_per_pg) | 67 | else if (hba->max_sqes % num_elements_per_pg) |
| @@ -69,7 +69,7 @@ static void bnx2i_adjust_qp_size(struct bnx2i_hba *hba) | |||
| 69 | ~(num_elements_per_pg - 1); | 69 | ~(num_elements_per_pg - 1); |
| 70 | 70 | ||
| 71 | /* adjust CQ */ | 71 | /* adjust CQ */ |
| 72 | num_elements_per_pg = PAGE_SIZE / BNX2I_CQE_SIZE; | 72 | num_elements_per_pg = CNIC_PAGE_SIZE / BNX2I_CQE_SIZE; |
| 73 | if (hba->max_cqes < num_elements_per_pg) | 73 | if (hba->max_cqes < num_elements_per_pg) |
| 74 | hba->max_cqes = num_elements_per_pg; | 74 | hba->max_cqes = num_elements_per_pg; |
| 75 | else if (hba->max_cqes % num_elements_per_pg) | 75 | else if (hba->max_cqes % num_elements_per_pg) |
| @@ -77,7 +77,7 @@ static void bnx2i_adjust_qp_size(struct bnx2i_hba *hba) | |||
| 77 | ~(num_elements_per_pg - 1); | 77 | ~(num_elements_per_pg - 1); |
| 78 | 78 | ||
| 79 | /* adjust RQ */ | 79 | /* adjust RQ */ |
| 80 | num_elements_per_pg = PAGE_SIZE / BNX2I_RQ_WQE_SIZE; | 80 | num_elements_per_pg = CNIC_PAGE_SIZE / BNX2I_RQ_WQE_SIZE; |
| 81 | if (hba->max_rqes < num_elements_per_pg) | 81 | if (hba->max_rqes < num_elements_per_pg) |
| 82 | hba->max_rqes = num_elements_per_pg; | 82 | hba->max_rqes = num_elements_per_pg; |
| 83 | else if (hba->max_rqes % num_elements_per_pg) | 83 | else if (hba->max_rqes % num_elements_per_pg) |
| @@ -959,7 +959,7 @@ static void setup_qp_page_tables(struct bnx2i_endpoint *ep) | |||
| 959 | 959 | ||
| 960 | /* SQ page table */ | 960 | /* SQ page table */ |
| 961 | memset(ep->qp.sq_pgtbl_virt, 0, ep->qp.sq_pgtbl_size); | 961 | memset(ep->qp.sq_pgtbl_virt, 0, ep->qp.sq_pgtbl_size); |
| 962 | num_pages = ep->qp.sq_mem_size / PAGE_SIZE; | 962 | num_pages = ep->qp.sq_mem_size / CNIC_PAGE_SIZE; |
| 963 | page = ep->qp.sq_phys; | 963 | page = ep->qp.sq_phys; |
| 964 | 964 | ||
| 965 | if (cnic_dev_10g) | 965 | if (cnic_dev_10g) |
| @@ -973,7 +973,7 @@ static void setup_qp_page_tables(struct bnx2i_endpoint *ep) | |||
| 973 | ptbl++; | 973 | ptbl++; |
| 974 | *ptbl = (u32) ((u64) page >> 32); | 974 | *ptbl = (u32) ((u64) page >> 32); |
| 975 | ptbl++; | 975 | ptbl++; |
| 976 | page += PAGE_SIZE; | 976 | page += CNIC_PAGE_SIZE; |
| 977 | } else { | 977 | } else { |
| 978 | /* PTE is written in big endian format for | 978 | /* PTE is written in big endian format for |
| 979 | * 5706/5708/5709 devices */ | 979 | * 5706/5708/5709 devices */ |
| @@ -981,13 +981,13 @@ static void setup_qp_page_tables(struct bnx2i_endpoint *ep) | |||
| 981 | ptbl++; | 981 | ptbl++; |
| 982 | *ptbl = (u32) page; | 982 | *ptbl = (u32) page; |
| 983 | ptbl++; | 983 | ptbl++; |
| 984 | page += PAGE_SIZE; | 984 | page += CNIC_PAGE_SIZE; |
| 985 | } | 985 | } |
| 986 | } | 986 | } |
| 987 | 987 | ||
| 988 | /* RQ page table */ | 988 | /* RQ page table */ |
| 989 | memset(ep->qp.rq_pgtbl_virt, 0, ep->qp.rq_pgtbl_size); | 989 | memset(ep->qp.rq_pgtbl_virt, 0, ep->qp.rq_pgtbl_size); |
| 990 | num_pages = ep->qp.rq_mem_size / PAGE_SIZE; | 990 | num_pages = ep->qp.rq_mem_size / CNIC_PAGE_SIZE; |
| 991 | page = ep->qp.rq_phys; | 991 | page = ep->qp.rq_phys; |
| 992 | 992 | ||
| 993 | if (cnic_dev_10g) | 993 | if (cnic_dev_10g) |
| @@ -1001,7 +1001,7 @@ static void setup_qp_page_tables(struct bnx2i_endpoint *ep) | |||
| 1001 | ptbl++; | 1001 | ptbl++; |
| 1002 | *ptbl = (u32) ((u64) page >> 32); | 1002 | *ptbl = (u32) ((u64) page >> 32); |
| 1003 | ptbl++; | 1003 | ptbl++; |
| 1004 | page += PAGE_SIZE; | 1004 | page += CNIC_PAGE_SIZE; |
| 1005 | } else { | 1005 | } else { |
| 1006 | /* PTE is written in big endian format for | 1006 | /* PTE is written in big endian format for |
| 1007 | * 5706/5708/5709 devices */ | 1007 | * 5706/5708/5709 devices */ |
| @@ -1009,13 +1009,13 @@ static void setup_qp_page_tables(struct bnx2i_endpoint *ep) | |||
| 1009 | ptbl++; | 1009 | ptbl++; |
| 1010 | *ptbl = (u32) page; | 1010 | *ptbl = (u32) page; |
| 1011 | ptbl++; | 1011 | ptbl++; |
| 1012 | page += PAGE_SIZE; | 1012 | page += CNIC_PAGE_SIZE; |
| 1013 | } | 1013 | } |
| 1014 | } | 1014 | } |
| 1015 | 1015 | ||
| 1016 | /* CQ page table */ | 1016 | /* CQ page table */ |
| 1017 | memset(ep->qp.cq_pgtbl_virt, 0, ep->qp.cq_pgtbl_size); | 1017 | memset(ep->qp.cq_pgtbl_virt, 0, ep->qp.cq_pgtbl_size); |
| 1018 | num_pages = ep->qp.cq_mem_size / PAGE_SIZE; | 1018 | num_pages = ep->qp.cq_mem_size / CNIC_PAGE_SIZE; |
| 1019 | page = ep->qp.cq_phys; | 1019 | page = ep->qp.cq_phys; |
| 1020 | 1020 | ||
| 1021 | if (cnic_dev_10g) | 1021 | if (cnic_dev_10g) |
| @@ -1029,7 +1029,7 @@ static void setup_qp_page_tables(struct bnx2i_endpoint *ep) | |||
| 1029 | ptbl++; | 1029 | ptbl++; |
| 1030 | *ptbl = (u32) ((u64) page >> 32); | 1030 | *ptbl = (u32) ((u64) page >> 32); |
| 1031 | ptbl++; | 1031 | ptbl++; |
| 1032 | page += PAGE_SIZE; | 1032 | page += CNIC_PAGE_SIZE; |
| 1033 | } else { | 1033 | } else { |
| 1034 | /* PTE is written in big endian format for | 1034 | /* PTE is written in big endian format for |
| 1035 | * 5706/5708/5709 devices */ | 1035 | * 5706/5708/5709 devices */ |
| @@ -1037,7 +1037,7 @@ static void setup_qp_page_tables(struct bnx2i_endpoint *ep) | |||
| 1037 | ptbl++; | 1037 | ptbl++; |
| 1038 | *ptbl = (u32) page; | 1038 | *ptbl = (u32) page; |
| 1039 | ptbl++; | 1039 | ptbl++; |
| 1040 | page += PAGE_SIZE; | 1040 | page += CNIC_PAGE_SIZE; |
| 1041 | } | 1041 | } |
| 1042 | } | 1042 | } |
| 1043 | } | 1043 | } |
| @@ -1064,11 +1064,11 @@ int bnx2i_alloc_qp_resc(struct bnx2i_hba *hba, struct bnx2i_endpoint *ep) | |||
| 1064 | /* Allocate page table memory for SQ which is page aligned */ | 1064 | /* Allocate page table memory for SQ which is page aligned */ |
| 1065 | ep->qp.sq_mem_size = hba->max_sqes * BNX2I_SQ_WQE_SIZE; | 1065 | ep->qp.sq_mem_size = hba->max_sqes * BNX2I_SQ_WQE_SIZE; |
| 1066 | ep->qp.sq_mem_size = | 1066 | ep->qp.sq_mem_size = |
| 1067 | (ep->qp.sq_mem_size + (PAGE_SIZE - 1)) & PAGE_MASK; | 1067 | (ep->qp.sq_mem_size + (CNIC_PAGE_SIZE - 1)) & CNIC_PAGE_MASK; |
| 1068 | ep->qp.sq_pgtbl_size = | 1068 | ep->qp.sq_pgtbl_size = |
| 1069 | (ep->qp.sq_mem_size / PAGE_SIZE) * sizeof(void *); | 1069 | (ep->qp.sq_mem_size / CNIC_PAGE_SIZE) * sizeof(void *); |
| 1070 | ep->qp.sq_pgtbl_size = | 1070 | ep->qp.sq_pgtbl_size = |
| 1071 | (ep->qp.sq_pgtbl_size + (PAGE_SIZE - 1)) & PAGE_MASK; | 1071 | (ep->qp.sq_pgtbl_size + (CNIC_PAGE_SIZE - 1)) & CNIC_PAGE_MASK; |
| 1072 | 1072 | ||
| 1073 | ep->qp.sq_pgtbl_virt = | 1073 | ep->qp.sq_pgtbl_virt = |
| 1074 | dma_alloc_coherent(&hba->pcidev->dev, ep->qp.sq_pgtbl_size, | 1074 | dma_alloc_coherent(&hba->pcidev->dev, ep->qp.sq_pgtbl_size, |
| @@ -1101,11 +1101,11 @@ int bnx2i_alloc_qp_resc(struct bnx2i_hba *hba, struct bnx2i_endpoint *ep) | |||
| 1101 | /* Allocate page table memory for CQ which is page aligned */ | 1101 | /* Allocate page table memory for CQ which is page aligned */ |
| 1102 | ep->qp.cq_mem_size = hba->max_cqes * BNX2I_CQE_SIZE; | 1102 | ep->qp.cq_mem_size = hba->max_cqes * BNX2I_CQE_SIZE; |
| 1103 | ep->qp.cq_mem_size = | 1103 | ep->qp.cq_mem_size = |
| 1104 | (ep->qp.cq_mem_size + (PAGE_SIZE - 1)) & PAGE_MASK; | 1104 | (ep->qp.cq_mem_size + (CNIC_PAGE_SIZE - 1)) & CNIC_PAGE_MASK; |
| 1105 | ep->qp.cq_pgtbl_size = | 1105 | ep->qp.cq_pgtbl_size = |
| 1106 | (ep->qp.cq_mem_size / PAGE_SIZE) * sizeof(void *); | 1106 | (ep->qp.cq_mem_size / CNIC_PAGE_SIZE) * sizeof(void *); |
| 1107 | ep->qp.cq_pgtbl_size = | 1107 | ep->qp.cq_pgtbl_size = |
| 1108 | (ep->qp.cq_pgtbl_size + (PAGE_SIZE - 1)) & PAGE_MASK; | 1108 | (ep->qp.cq_pgtbl_size + (CNIC_PAGE_SIZE - 1)) & CNIC_PAGE_MASK; |
| 1109 | 1109 | ||
| 1110 | ep->qp.cq_pgtbl_virt = | 1110 | ep->qp.cq_pgtbl_virt = |
| 1111 | dma_alloc_coherent(&hba->pcidev->dev, ep->qp.cq_pgtbl_size, | 1111 | dma_alloc_coherent(&hba->pcidev->dev, ep->qp.cq_pgtbl_size, |
| @@ -1144,11 +1144,11 @@ int bnx2i_alloc_qp_resc(struct bnx2i_hba *hba, struct bnx2i_endpoint *ep) | |||
| 1144 | /* Allocate page table memory for RQ which is page aligned */ | 1144 | /* Allocate page table memory for RQ which is page aligned */ |
| 1145 | ep->qp.rq_mem_size = hba->max_rqes * BNX2I_RQ_WQE_SIZE; | 1145 | ep->qp.rq_mem_size = hba->max_rqes * BNX2I_RQ_WQE_SIZE; |
| 1146 | ep->qp.rq_mem_size = | 1146 | ep->qp.rq_mem_size = |
| 1147 | (ep->qp.rq_mem_size + (PAGE_SIZE - 1)) & PAGE_MASK; | 1147 | (ep->qp.rq_mem_size + (CNIC_PAGE_SIZE - 1)) & CNIC_PAGE_MASK; |
| 1148 | ep->qp.rq_pgtbl_size = | 1148 | ep->qp.rq_pgtbl_size = |
| 1149 | (ep->qp.rq_mem_size / PAGE_SIZE) * sizeof(void *); | 1149 | (ep->qp.rq_mem_size / CNIC_PAGE_SIZE) * sizeof(void *); |
| 1150 | ep->qp.rq_pgtbl_size = | 1150 | ep->qp.rq_pgtbl_size = |
| 1151 | (ep->qp.rq_pgtbl_size + (PAGE_SIZE - 1)) & PAGE_MASK; | 1151 | (ep->qp.rq_pgtbl_size + (CNIC_PAGE_SIZE - 1)) & CNIC_PAGE_MASK; |
| 1152 | 1152 | ||
| 1153 | ep->qp.rq_pgtbl_virt = | 1153 | ep->qp.rq_pgtbl_virt = |
| 1154 | dma_alloc_coherent(&hba->pcidev->dev, ep->qp.rq_pgtbl_size, | 1154 | dma_alloc_coherent(&hba->pcidev->dev, ep->qp.rq_pgtbl_size, |
| @@ -1270,7 +1270,7 @@ int bnx2i_send_fw_iscsi_init_msg(struct bnx2i_hba *hba) | |||
| 1270 | bnx2i_adjust_qp_size(hba); | 1270 | bnx2i_adjust_qp_size(hba); |
| 1271 | 1271 | ||
| 1272 | iscsi_init.flags = | 1272 | iscsi_init.flags = |
| 1273 | ISCSI_PAGE_SIZE_4K << ISCSI_KWQE_INIT1_PAGE_SIZE_SHIFT; | 1273 | (CNIC_PAGE_BITS - 8) << ISCSI_KWQE_INIT1_PAGE_SIZE_SHIFT; |
| 1274 | if (en_tcp_dack) | 1274 | if (en_tcp_dack) |
| 1275 | iscsi_init.flags |= ISCSI_KWQE_INIT1_DELAYED_ACK_ENABLE; | 1275 | iscsi_init.flags |= ISCSI_KWQE_INIT1_DELAYED_ACK_ENABLE; |
| 1276 | iscsi_init.reserved0 = 0; | 1276 | iscsi_init.reserved0 = 0; |
| @@ -1288,15 +1288,15 @@ int bnx2i_send_fw_iscsi_init_msg(struct bnx2i_hba *hba) | |||
| 1288 | ((hba->num_ccell & 0xFFFF) | (hba->max_sqes << 16)); | 1288 | ((hba->num_ccell & 0xFFFF) | (hba->max_sqes << 16)); |
| 1289 | iscsi_init.num_ccells_per_conn = hba->num_ccell; | 1289 | iscsi_init.num_ccells_per_conn = hba->num_ccell; |
| 1290 | iscsi_init.num_tasks_per_conn = hba->max_sqes; | 1290 | iscsi_init.num_tasks_per_conn = hba->max_sqes; |
| 1291 | iscsi_init.sq_wqes_per_page = PAGE_SIZE / BNX2I_SQ_WQE_SIZE; | 1291 | iscsi_init.sq_wqes_per_page = CNIC_PAGE_SIZE / BNX2I_SQ_WQE_SIZE; |
| 1292 | iscsi_init.sq_num_wqes = hba->max_sqes; | 1292 | iscsi_init.sq_num_wqes = hba->max_sqes; |
| 1293 | iscsi_init.cq_log_wqes_per_page = | 1293 | iscsi_init.cq_log_wqes_per_page = |
| 1294 | (u8) bnx2i_power_of2(PAGE_SIZE / BNX2I_CQE_SIZE); | 1294 | (u8) bnx2i_power_of2(CNIC_PAGE_SIZE / BNX2I_CQE_SIZE); |
| 1295 | iscsi_init.cq_num_wqes = hba->max_cqes; | 1295 | iscsi_init.cq_num_wqes = hba->max_cqes; |
| 1296 | iscsi_init.cq_num_pages = (hba->max_cqes * BNX2I_CQE_SIZE + | 1296 | iscsi_init.cq_num_pages = (hba->max_cqes * BNX2I_CQE_SIZE + |
| 1297 | (PAGE_SIZE - 1)) / PAGE_SIZE; | 1297 | (CNIC_PAGE_SIZE - 1)) / CNIC_PAGE_SIZE; |
| 1298 | iscsi_init.sq_num_pages = (hba->max_sqes * BNX2I_SQ_WQE_SIZE + | 1298 | iscsi_init.sq_num_pages = (hba->max_sqes * BNX2I_SQ_WQE_SIZE + |
| 1299 | (PAGE_SIZE - 1)) / PAGE_SIZE; | 1299 | (CNIC_PAGE_SIZE - 1)) / CNIC_PAGE_SIZE; |
| 1300 | iscsi_init.rq_buffer_size = BNX2I_RQ_WQE_SIZE; | 1300 | iscsi_init.rq_buffer_size = BNX2I_RQ_WQE_SIZE; |
| 1301 | iscsi_init.rq_num_wqes = hba->max_rqes; | 1301 | iscsi_init.rq_num_wqes = hba->max_rqes; |
| 1302 | 1302 | ||
diff --git a/drivers/scsi/bnx2i/bnx2i_iscsi.c b/drivers/scsi/bnx2i/bnx2i_iscsi.c index 854dad7d5b03..c8b0aff5bbd4 100644 --- a/drivers/scsi/bnx2i/bnx2i_iscsi.c +++ b/drivers/scsi/bnx2i/bnx2i_iscsi.c | |||
| @@ -525,7 +525,7 @@ static int bnx2i_setup_mp_bdt(struct bnx2i_hba *hba) | |||
| 525 | struct iscsi_bd *mp_bdt; | 525 | struct iscsi_bd *mp_bdt; |
| 526 | u64 addr; | 526 | u64 addr; |
| 527 | 527 | ||
| 528 | hba->mp_bd_tbl = dma_alloc_coherent(&hba->pcidev->dev, PAGE_SIZE, | 528 | hba->mp_bd_tbl = dma_alloc_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE, |
| 529 | &hba->mp_bd_dma, GFP_KERNEL); | 529 | &hba->mp_bd_dma, GFP_KERNEL); |
| 530 | if (!hba->mp_bd_tbl) { | 530 | if (!hba->mp_bd_tbl) { |
| 531 | printk(KERN_ERR "unable to allocate Middle Path BDT\n"); | 531 | printk(KERN_ERR "unable to allocate Middle Path BDT\n"); |
| @@ -533,11 +533,12 @@ static int bnx2i_setup_mp_bdt(struct bnx2i_hba *hba) | |||
| 533 | goto out; | 533 | goto out; |
| 534 | } | 534 | } |
| 535 | 535 | ||
| 536 | hba->dummy_buffer = dma_alloc_coherent(&hba->pcidev->dev, PAGE_SIZE, | 536 | hba->dummy_buffer = dma_alloc_coherent(&hba->pcidev->dev, |
| 537 | CNIC_PAGE_SIZE, | ||
| 537 | &hba->dummy_buf_dma, GFP_KERNEL); | 538 | &hba->dummy_buf_dma, GFP_KERNEL); |
| 538 | if (!hba->dummy_buffer) { | 539 | if (!hba->dummy_buffer) { |
| 539 | printk(KERN_ERR "unable to alloc Middle Path Dummy Buffer\n"); | 540 | printk(KERN_ERR "unable to alloc Middle Path Dummy Buffer\n"); |
| 540 | dma_free_coherent(&hba->pcidev->dev, PAGE_SIZE, | 541 | dma_free_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE, |
| 541 | hba->mp_bd_tbl, hba->mp_bd_dma); | 542 | hba->mp_bd_tbl, hba->mp_bd_dma); |
| 542 | hba->mp_bd_tbl = NULL; | 543 | hba->mp_bd_tbl = NULL; |
| 543 | rc = -1; | 544 | rc = -1; |
| @@ -548,7 +549,7 @@ static int bnx2i_setup_mp_bdt(struct bnx2i_hba *hba) | |||
| 548 | addr = (unsigned long) hba->dummy_buf_dma; | 549 | addr = (unsigned long) hba->dummy_buf_dma; |
| 549 | mp_bdt->buffer_addr_lo = addr & 0xffffffff; | 550 | mp_bdt->buffer_addr_lo = addr & 0xffffffff; |
| 550 | mp_bdt->buffer_addr_hi = addr >> 32; | 551 | mp_bdt->buffer_addr_hi = addr >> 32; |
| 551 | mp_bdt->buffer_length = PAGE_SIZE; | 552 | mp_bdt->buffer_length = CNIC_PAGE_SIZE; |
| 552 | mp_bdt->flags = ISCSI_BD_LAST_IN_BD_CHAIN | | 553 | mp_bdt->flags = ISCSI_BD_LAST_IN_BD_CHAIN | |
| 553 | ISCSI_BD_FIRST_IN_BD_CHAIN; | 554 | ISCSI_BD_FIRST_IN_BD_CHAIN; |
| 554 | out: | 555 | out: |
| @@ -565,12 +566,12 @@ out: | |||
| 565 | static void bnx2i_free_mp_bdt(struct bnx2i_hba *hba) | 566 | static void bnx2i_free_mp_bdt(struct bnx2i_hba *hba) |
| 566 | { | 567 | { |
| 567 | if (hba->mp_bd_tbl) { | 568 | if (hba->mp_bd_tbl) { |
| 568 | dma_free_coherent(&hba->pcidev->dev, PAGE_SIZE, | 569 | dma_free_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE, |
| 569 | hba->mp_bd_tbl, hba->mp_bd_dma); | 570 | hba->mp_bd_tbl, hba->mp_bd_dma); |
| 570 | hba->mp_bd_tbl = NULL; | 571 | hba->mp_bd_tbl = NULL; |
| 571 | } | 572 | } |
| 572 | if (hba->dummy_buffer) { | 573 | if (hba->dummy_buffer) { |
| 573 | dma_free_coherent(&hba->pcidev->dev, PAGE_SIZE, | 574 | dma_free_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE, |
| 574 | hba->dummy_buffer, hba->dummy_buf_dma); | 575 | hba->dummy_buffer, hba->dummy_buf_dma); |
| 575 | hba->dummy_buffer = NULL; | 576 | hba->dummy_buffer = NULL; |
| 576 | } | 577 | } |
| @@ -934,14 +935,14 @@ static void bnx2i_conn_free_login_resources(struct bnx2i_hba *hba, | |||
| 934 | struct bnx2i_conn *bnx2i_conn) | 935 | struct bnx2i_conn *bnx2i_conn) |
| 935 | { | 936 | { |
| 936 | if (bnx2i_conn->gen_pdu.resp_bd_tbl) { | 937 | if (bnx2i_conn->gen_pdu.resp_bd_tbl) { |
| 937 | dma_free_coherent(&hba->pcidev->dev, PAGE_SIZE, | 938 | dma_free_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE, |
| 938 | bnx2i_conn->gen_pdu.resp_bd_tbl, | 939 | bnx2i_conn->gen_pdu.resp_bd_tbl, |
| 939 | bnx2i_conn->gen_pdu.resp_bd_dma); | 940 | bnx2i_conn->gen_pdu.resp_bd_dma); |
| 940 | bnx2i_conn->gen_pdu.resp_bd_tbl = NULL; | 941 | bnx2i_conn->gen_pdu.resp_bd_tbl = NULL; |
| 941 | } | 942 | } |
| 942 | 943 | ||
| 943 | if (bnx2i_conn->gen_pdu.req_bd_tbl) { | 944 | if (bnx2i_conn->gen_pdu.req_bd_tbl) { |
| 944 | dma_free_coherent(&hba->pcidev->dev, PAGE_SIZE, | 945 | dma_free_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE, |
| 945 | bnx2i_conn->gen_pdu.req_bd_tbl, | 946 | bnx2i_conn->gen_pdu.req_bd_tbl, |
| 946 | bnx2i_conn->gen_pdu.req_bd_dma); | 947 | bnx2i_conn->gen_pdu.req_bd_dma); |
| 947 | bnx2i_conn->gen_pdu.req_bd_tbl = NULL; | 948 | bnx2i_conn->gen_pdu.req_bd_tbl = NULL; |
| @@ -998,13 +999,13 @@ static int bnx2i_conn_alloc_login_resources(struct bnx2i_hba *hba, | |||
| 998 | bnx2i_conn->gen_pdu.resp_wr_ptr = bnx2i_conn->gen_pdu.resp_buf; | 999 | bnx2i_conn->gen_pdu.resp_wr_ptr = bnx2i_conn->gen_pdu.resp_buf; |
| 999 | 1000 | ||
| 1000 | bnx2i_conn->gen_pdu.req_bd_tbl = | 1001 | bnx2i_conn->gen_pdu.req_bd_tbl = |
| 1001 | dma_alloc_coherent(&hba->pcidev->dev, PAGE_SIZE, | 1002 | dma_alloc_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE, |
| 1002 | &bnx2i_conn->gen_pdu.req_bd_dma, GFP_KERNEL); | 1003 | &bnx2i_conn->gen_pdu.req_bd_dma, GFP_KERNEL); |
| 1003 | if (bnx2i_conn->gen_pdu.req_bd_tbl == NULL) | 1004 | if (bnx2i_conn->gen_pdu.req_bd_tbl == NULL) |
| 1004 | goto login_req_bd_tbl_failure; | 1005 | goto login_req_bd_tbl_failure; |
| 1005 | 1006 | ||
| 1006 | bnx2i_conn->gen_pdu.resp_bd_tbl = | 1007 | bnx2i_conn->gen_pdu.resp_bd_tbl = |
| 1007 | dma_alloc_coherent(&hba->pcidev->dev, PAGE_SIZE, | 1008 | dma_alloc_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE, |
| 1008 | &bnx2i_conn->gen_pdu.resp_bd_dma, | 1009 | &bnx2i_conn->gen_pdu.resp_bd_dma, |
| 1009 | GFP_KERNEL); | 1010 | GFP_KERNEL); |
| 1010 | if (bnx2i_conn->gen_pdu.resp_bd_tbl == NULL) | 1011 | if (bnx2i_conn->gen_pdu.resp_bd_tbl == NULL) |
| @@ -1013,7 +1014,7 @@ static int bnx2i_conn_alloc_login_resources(struct bnx2i_hba *hba, | |||
| 1013 | return 0; | 1014 | return 0; |
| 1014 | 1015 | ||
| 1015 | login_resp_bd_tbl_failure: | 1016 | login_resp_bd_tbl_failure: |
| 1016 | dma_free_coherent(&hba->pcidev->dev, PAGE_SIZE, | 1017 | dma_free_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE, |
| 1017 | bnx2i_conn->gen_pdu.req_bd_tbl, | 1018 | bnx2i_conn->gen_pdu.req_bd_tbl, |
| 1018 | bnx2i_conn->gen_pdu.req_bd_dma); | 1019 | bnx2i_conn->gen_pdu.req_bd_dma); |
| 1019 | bnx2i_conn->gen_pdu.req_bd_tbl = NULL; | 1020 | bnx2i_conn->gen_pdu.req_bd_tbl = NULL; |
diff --git a/drivers/tty/serial/sunhv.c b/drivers/tty/serial/sunhv.c index cf86e729532b..dc697cee248a 100644 --- a/drivers/tty/serial/sunhv.c +++ b/drivers/tty/serial/sunhv.c | |||
| @@ -433,13 +433,10 @@ static void sunhv_console_write_paged(struct console *con, const char *s, unsign | |||
| 433 | unsigned long flags; | 433 | unsigned long flags; |
| 434 | int locked = 1; | 434 | int locked = 1; |
| 435 | 435 | ||
| 436 | local_irq_save(flags); | 436 | if (port->sysrq || oops_in_progress) |
| 437 | if (port->sysrq) { | 437 | locked = spin_trylock_irqsave(&port->lock, flags); |
| 438 | locked = 0; | 438 | else |
| 439 | } else if (oops_in_progress) { | 439 | spin_lock_irqsave(&port->lock, flags); |
| 440 | locked = spin_trylock(&port->lock); | ||
| 441 | } else | ||
| 442 | spin_lock(&port->lock); | ||
| 443 | 440 | ||
| 444 | while (n > 0) { | 441 | while (n > 0) { |
| 445 | unsigned long ra = __pa(con_write_page); | 442 | unsigned long ra = __pa(con_write_page); |
| @@ -470,8 +467,7 @@ static void sunhv_console_write_paged(struct console *con, const char *s, unsign | |||
| 470 | } | 467 | } |
| 471 | 468 | ||
| 472 | if (locked) | 469 | if (locked) |
| 473 | spin_unlock(&port->lock); | 470 | spin_unlock_irqrestore(&port->lock, flags); |
| 474 | local_irq_restore(flags); | ||
| 475 | } | 471 | } |
| 476 | 472 | ||
| 477 | static inline void sunhv_console_putchar(struct uart_port *port, char c) | 473 | static inline void sunhv_console_putchar(struct uart_port *port, char c) |
| @@ -492,7 +488,10 @@ static void sunhv_console_write_bychar(struct console *con, const char *s, unsig | |||
| 492 | unsigned long flags; | 488 | unsigned long flags; |
| 493 | int i, locked = 1; | 489 | int i, locked = 1; |
| 494 | 490 | ||
| 495 | local_irq_save(flags); | 491 | if (port->sysrq || oops_in_progress) |
| 492 | locked = spin_trylock_irqsave(&port->lock, flags); | ||
| 493 | else | ||
| 494 | spin_lock_irqsave(&port->lock, flags); | ||
| 496 | if (port->sysrq) { | 495 | if (port->sysrq) { |
| 497 | locked = 0; | 496 | locked = 0; |
| 498 | } else if (oops_in_progress) { | 497 | } else if (oops_in_progress) { |
| @@ -507,8 +506,7 @@ static void sunhv_console_write_bychar(struct console *con, const char *s, unsig | |||
| 507 | } | 506 | } |
| 508 | 507 | ||
| 509 | if (locked) | 508 | if (locked) |
| 510 | spin_unlock(&port->lock); | 509 | spin_unlock_irqrestore(&port->lock, flags); |
| 511 | local_irq_restore(flags); | ||
| 512 | } | 510 | } |
| 513 | 511 | ||
| 514 | static struct console sunhv_console = { | 512 | static struct console sunhv_console = { |
diff --git a/drivers/tty/serial/sunsab.c b/drivers/tty/serial/sunsab.c index 380fb5355cb2..5faa8e905e98 100644 --- a/drivers/tty/serial/sunsab.c +++ b/drivers/tty/serial/sunsab.c | |||
| @@ -844,20 +844,16 @@ static void sunsab_console_write(struct console *con, const char *s, unsigned n) | |||
| 844 | unsigned long flags; | 844 | unsigned long flags; |
| 845 | int locked = 1; | 845 | int locked = 1; |
| 846 | 846 | ||
| 847 | local_irq_save(flags); | 847 | if (up->port.sysrq || oops_in_progress) |
| 848 | if (up->port.sysrq) { | 848 | locked = spin_trylock_irqsave(&up->port.lock, flags); |
| 849 | locked = 0; | 849 | else |
| 850 | } else if (oops_in_progress) { | 850 | spin_lock_irqsave(&up->port.lock, flags); |
| 851 | locked = spin_trylock(&up->port.lock); | ||
| 852 | } else | ||
| 853 | spin_lock(&up->port.lock); | ||
| 854 | 851 | ||
| 855 | uart_console_write(&up->port, s, n, sunsab_console_putchar); | 852 | uart_console_write(&up->port, s, n, sunsab_console_putchar); |
| 856 | sunsab_tec_wait(up); | 853 | sunsab_tec_wait(up); |
| 857 | 854 | ||
| 858 | if (locked) | 855 | if (locked) |
| 859 | spin_unlock(&up->port.lock); | 856 | spin_unlock_irqrestore(&up->port.lock, flags); |
| 860 | local_irq_restore(flags); | ||
| 861 | } | 857 | } |
| 862 | 858 | ||
| 863 | static int sunsab_console_setup(struct console *con, char *options) | 859 | static int sunsab_console_setup(struct console *con, char *options) |
diff --git a/drivers/tty/serial/sunsu.c b/drivers/tty/serial/sunsu.c index db79b76f5c8e..9a0f24f83720 100644 --- a/drivers/tty/serial/sunsu.c +++ b/drivers/tty/serial/sunsu.c | |||
| @@ -1295,13 +1295,10 @@ static void sunsu_console_write(struct console *co, const char *s, | |||
| 1295 | unsigned int ier; | 1295 | unsigned int ier; |
| 1296 | int locked = 1; | 1296 | int locked = 1; |
| 1297 | 1297 | ||
| 1298 | local_irq_save(flags); | 1298 | if (up->port.sysrq || oops_in_progress) |
| 1299 | if (up->port.sysrq) { | 1299 | locked = spin_trylock_irqsave(&up->port.lock, flags); |
| 1300 | locked = 0; | 1300 | else |
| 1301 | } else if (oops_in_progress) { | 1301 | spin_lock_irqsave(&up->port.lock, flags); |
| 1302 | locked = spin_trylock(&up->port.lock); | ||
| 1303 | } else | ||
| 1304 | spin_lock(&up->port.lock); | ||
| 1305 | 1302 | ||
| 1306 | /* | 1303 | /* |
| 1307 | * First save the UER then disable the interrupts | 1304 | * First save the UER then disable the interrupts |
| @@ -1319,8 +1316,7 @@ static void sunsu_console_write(struct console *co, const char *s, | |||
| 1319 | serial_out(up, UART_IER, ier); | 1316 | serial_out(up, UART_IER, ier); |
| 1320 | 1317 | ||
| 1321 | if (locked) | 1318 | if (locked) |
| 1322 | spin_unlock(&up->port.lock); | 1319 | spin_unlock_irqrestore(&up->port.lock, flags); |
| 1323 | local_irq_restore(flags); | ||
| 1324 | } | 1320 | } |
| 1325 | 1321 | ||
| 1326 | /* | 1322 | /* |
diff --git a/drivers/tty/serial/sunzilog.c b/drivers/tty/serial/sunzilog.c index 45a8c6aa5837..a2c40ed287d2 100644 --- a/drivers/tty/serial/sunzilog.c +++ b/drivers/tty/serial/sunzilog.c | |||
| @@ -1195,20 +1195,16 @@ sunzilog_console_write(struct console *con, const char *s, unsigned int count) | |||
| 1195 | unsigned long flags; | 1195 | unsigned long flags; |
| 1196 | int locked = 1; | 1196 | int locked = 1; |
| 1197 | 1197 | ||
| 1198 | local_irq_save(flags); | 1198 | if (up->port.sysrq || oops_in_progress) |
| 1199 | if (up->port.sysrq) { | 1199 | locked = spin_trylock_irqsave(&up->port.lock, flags); |
| 1200 | locked = 0; | 1200 | else |
| 1201 | } else if (oops_in_progress) { | 1201 | spin_lock_irqsave(&up->port.lock, flags); |
| 1202 | locked = spin_trylock(&up->port.lock); | ||
| 1203 | } else | ||
| 1204 | spin_lock(&up->port.lock); | ||
| 1205 | 1202 | ||
| 1206 | uart_console_write(&up->port, s, count, sunzilog_putchar); | 1203 | uart_console_write(&up->port, s, count, sunzilog_putchar); |
| 1207 | udelay(2); | 1204 | udelay(2); |
| 1208 | 1205 | ||
| 1209 | if (locked) | 1206 | if (locked) |
| 1210 | spin_unlock(&up->port.lock); | 1207 | spin_unlock_irqrestore(&up->port.lock, flags); |
| 1211 | local_irq_restore(flags); | ||
| 1212 | } | 1208 | } |
| 1213 | 1209 | ||
| 1214 | static int __init sunzilog_console_setup(struct console *con, char *options) | 1210 | static int __init sunzilog_console_setup(struct console *con, char *options) |
diff --git a/include/linux/ftrace_event.h b/include/linux/ftrace_event.h index 4e4cc28623ad..4cdb3a17bcb5 100644 --- a/include/linux/ftrace_event.h +++ b/include/linux/ftrace_event.h | |||
| @@ -495,10 +495,6 @@ enum { | |||
| 495 | FILTER_TRACE_FN, | 495 | FILTER_TRACE_FN, |
| 496 | }; | 496 | }; |
| 497 | 497 | ||
| 498 | #define EVENT_STORAGE_SIZE 128 | ||
| 499 | extern struct mutex event_storage_mutex; | ||
| 500 | extern char event_storage[EVENT_STORAGE_SIZE]; | ||
| 501 | |||
| 502 | extern int trace_event_raw_init(struct ftrace_event_call *call); | 498 | extern int trace_event_raw_init(struct ftrace_event_call *call); |
| 503 | extern int trace_define_field(struct ftrace_event_call *call, const char *type, | 499 | extern int trace_define_field(struct ftrace_event_call *call, const char *type, |
| 504 | const char *name, int offset, int size, | 500 | const char *name, int offset, int size, |
diff --git a/include/linux/rmap.h b/include/linux/rmap.h index 1da693d51255..b66c2110cb1f 100644 --- a/include/linux/rmap.h +++ b/include/linux/rmap.h | |||
| @@ -250,8 +250,7 @@ struct rmap_walk_control { | |||
| 250 | int (*rmap_one)(struct page *page, struct vm_area_struct *vma, | 250 | int (*rmap_one)(struct page *page, struct vm_area_struct *vma, |
| 251 | unsigned long addr, void *arg); | 251 | unsigned long addr, void *arg); |
| 252 | int (*done)(struct page *page); | 252 | int (*done)(struct page *page); |
| 253 | int (*file_nonlinear)(struct page *, struct address_space *, | 253 | int (*file_nonlinear)(struct page *, struct address_space *, void *arg); |
| 254 | struct vm_area_struct *vma); | ||
| 255 | struct anon_vma *(*anon_lock)(struct page *page); | 254 | struct anon_vma *(*anon_lock)(struct page *page); |
| 256 | bool (*invalid_vma)(struct vm_area_struct *vma, void *arg); | 255 | bool (*invalid_vma)(struct vm_area_struct *vma, void *arg); |
| 257 | }; | 256 | }; |
diff --git a/include/linux/security.h b/include/linux/security.h index 5623a7f965b7..2fc42d191f79 100644 --- a/include/linux/security.h +++ b/include/linux/security.h | |||
| @@ -1040,6 +1040,7 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts) | |||
| 1040 | * Allocate a security structure to the xp->security field; the security | 1040 | * Allocate a security structure to the xp->security field; the security |
| 1041 | * field is initialized to NULL when the xfrm_policy is allocated. | 1041 | * field is initialized to NULL when the xfrm_policy is allocated. |
| 1042 | * Return 0 if operation was successful (memory to allocate, legal context) | 1042 | * Return 0 if operation was successful (memory to allocate, legal context) |
| 1043 | * @gfp is to specify the context for the allocation | ||
| 1043 | * @xfrm_policy_clone_security: | 1044 | * @xfrm_policy_clone_security: |
| 1044 | * @old_ctx contains an existing xfrm_sec_ctx. | 1045 | * @old_ctx contains an existing xfrm_sec_ctx. |
| 1045 | * @new_ctxp contains a new xfrm_sec_ctx being cloned from old. | 1046 | * @new_ctxp contains a new xfrm_sec_ctx being cloned from old. |
| @@ -1683,7 +1684,7 @@ struct security_operations { | |||
| 1683 | 1684 | ||
| 1684 | #ifdef CONFIG_SECURITY_NETWORK_XFRM | 1685 | #ifdef CONFIG_SECURITY_NETWORK_XFRM |
| 1685 | int (*xfrm_policy_alloc_security) (struct xfrm_sec_ctx **ctxp, | 1686 | int (*xfrm_policy_alloc_security) (struct xfrm_sec_ctx **ctxp, |
| 1686 | struct xfrm_user_sec_ctx *sec_ctx); | 1687 | struct xfrm_user_sec_ctx *sec_ctx, gfp_t gfp); |
| 1687 | int (*xfrm_policy_clone_security) (struct xfrm_sec_ctx *old_ctx, struct xfrm_sec_ctx **new_ctx); | 1688 | int (*xfrm_policy_clone_security) (struct xfrm_sec_ctx *old_ctx, struct xfrm_sec_ctx **new_ctx); |
| 1688 | void (*xfrm_policy_free_security) (struct xfrm_sec_ctx *ctx); | 1689 | void (*xfrm_policy_free_security) (struct xfrm_sec_ctx *ctx); |
| 1689 | int (*xfrm_policy_delete_security) (struct xfrm_sec_ctx *ctx); | 1690 | int (*xfrm_policy_delete_security) (struct xfrm_sec_ctx *ctx); |
| @@ -2859,7 +2860,8 @@ static inline void security_skb_owned_by(struct sk_buff *skb, struct sock *sk) | |||
| 2859 | 2860 | ||
| 2860 | #ifdef CONFIG_SECURITY_NETWORK_XFRM | 2861 | #ifdef CONFIG_SECURITY_NETWORK_XFRM |
| 2861 | 2862 | ||
| 2862 | int security_xfrm_policy_alloc(struct xfrm_sec_ctx **ctxp, struct xfrm_user_sec_ctx *sec_ctx); | 2863 | int security_xfrm_policy_alloc(struct xfrm_sec_ctx **ctxp, |
| 2864 | struct xfrm_user_sec_ctx *sec_ctx, gfp_t gfp); | ||
| 2863 | int security_xfrm_policy_clone(struct xfrm_sec_ctx *old_ctx, struct xfrm_sec_ctx **new_ctxp); | 2865 | int security_xfrm_policy_clone(struct xfrm_sec_ctx *old_ctx, struct xfrm_sec_ctx **new_ctxp); |
| 2864 | void security_xfrm_policy_free(struct xfrm_sec_ctx *ctx); | 2866 | void security_xfrm_policy_free(struct xfrm_sec_ctx *ctx); |
| 2865 | int security_xfrm_policy_delete(struct xfrm_sec_ctx *ctx); | 2867 | int security_xfrm_policy_delete(struct xfrm_sec_ctx *ctx); |
| @@ -2877,7 +2879,9 @@ void security_skb_classify_flow(struct sk_buff *skb, struct flowi *fl); | |||
| 2877 | 2879 | ||
| 2878 | #else /* CONFIG_SECURITY_NETWORK_XFRM */ | 2880 | #else /* CONFIG_SECURITY_NETWORK_XFRM */ |
| 2879 | 2881 | ||
| 2880 | static inline int security_xfrm_policy_alloc(struct xfrm_sec_ctx **ctxp, struct xfrm_user_sec_ctx *sec_ctx) | 2882 | static inline int security_xfrm_policy_alloc(struct xfrm_sec_ctx **ctxp, |
| 2883 | struct xfrm_user_sec_ctx *sec_ctx, | ||
| 2884 | gfp_t gfp) | ||
| 2881 | { | 2885 | { |
| 2882 | return 0; | 2886 | return 0; |
| 2883 | } | 2887 | } |
diff --git a/include/linux/usb/cdc_ncm.h b/include/linux/usb/cdc_ncm.h index c3fa80745996..2c14d9cdd57a 100644 --- a/include/linux/usb/cdc_ncm.h +++ b/include/linux/usb/cdc_ncm.h | |||
| @@ -88,6 +88,7 @@ | |||
| 88 | #define cdc_ncm_data_intf_is_mbim(x) ((x)->desc.bInterfaceProtocol == USB_CDC_MBIM_PROTO_NTB) | 88 | #define cdc_ncm_data_intf_is_mbim(x) ((x)->desc.bInterfaceProtocol == USB_CDC_MBIM_PROTO_NTB) |
| 89 | 89 | ||
| 90 | struct cdc_ncm_ctx { | 90 | struct cdc_ncm_ctx { |
| 91 | struct usb_cdc_ncm_ntb_parameters ncm_parm; | ||
| 91 | struct hrtimer tx_timer; | 92 | struct hrtimer tx_timer; |
| 92 | struct tasklet_struct bh; | 93 | struct tasklet_struct bh; |
| 93 | 94 | ||
diff --git a/include/net/tcp.h b/include/net/tcp.h index 8c4dd63134d4..743accec6c76 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h | |||
| @@ -480,20 +480,21 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb, | |||
| 480 | #ifdef CONFIG_SYN_COOKIES | 480 | #ifdef CONFIG_SYN_COOKIES |
| 481 | #include <linux/ktime.h> | 481 | #include <linux/ktime.h> |
| 482 | 482 | ||
| 483 | /* Syncookies use a monotonic timer which increments every 64 seconds. | 483 | /* Syncookies use a monotonic timer which increments every 60 seconds. |
| 484 | * This counter is used both as a hash input and partially encoded into | 484 | * This counter is used both as a hash input and partially encoded into |
| 485 | * the cookie value. A cookie is only validated further if the delta | 485 | * the cookie value. A cookie is only validated further if the delta |
| 486 | * between the current counter value and the encoded one is less than this, | 486 | * between the current counter value and the encoded one is less than this, |
| 487 | * i.e. a sent cookie is valid only at most for 128 seconds (or less if | 487 | * i.e. a sent cookie is valid only at most for 2*60 seconds (or less if |
| 488 | * the counter advances immediately after a cookie is generated). | 488 | * the counter advances immediately after a cookie is generated). |
| 489 | */ | 489 | */ |
| 490 | #define MAX_SYNCOOKIE_AGE 2 | 490 | #define MAX_SYNCOOKIE_AGE 2 |
| 491 | 491 | ||
| 492 | static inline u32 tcp_cookie_time(void) | 492 | static inline u32 tcp_cookie_time(void) |
| 493 | { | 493 | { |
| 494 | struct timespec now; | 494 | u64 val = get_jiffies_64(); |
| 495 | getnstimeofday(&now); | 495 | |
| 496 | return now.tv_sec >> 6; /* 64 seconds granularity */ | 496 | do_div(val, 60 * HZ); |
| 497 | return val; | ||
| 497 | } | 498 | } |
| 498 | 499 | ||
| 499 | u32 __cookie_v4_init_sequence(const struct iphdr *iph, const struct tcphdr *th, | 500 | u32 __cookie_v4_init_sequence(const struct iphdr *iph, const struct tcphdr *th, |
diff --git a/include/trace/ftrace.h b/include/trace/ftrace.h index 1a8b28db3775..1ee19a24cc5f 100644 --- a/include/trace/ftrace.h +++ b/include/trace/ftrace.h | |||
| @@ -310,15 +310,12 @@ static struct trace_event_functions ftrace_event_type_funcs_##call = { \ | |||
| 310 | #undef __array | 310 | #undef __array |
| 311 | #define __array(type, item, len) \ | 311 | #define __array(type, item, len) \ |
| 312 | do { \ | 312 | do { \ |
| 313 | mutex_lock(&event_storage_mutex); \ | 313 | char *type_str = #type"["__stringify(len)"]"; \ |
| 314 | BUILD_BUG_ON(len > MAX_FILTER_STR_VAL); \ | 314 | BUILD_BUG_ON(len > MAX_FILTER_STR_VAL); \ |
| 315 | snprintf(event_storage, sizeof(event_storage), \ | 315 | ret = trace_define_field(event_call, type_str, #item, \ |
| 316 | "%s[%d]", #type, len); \ | ||
| 317 | ret = trace_define_field(event_call, event_storage, #item, \ | ||
| 318 | offsetof(typeof(field), item), \ | 316 | offsetof(typeof(field), item), \ |
| 319 | sizeof(field.item), \ | 317 | sizeof(field.item), \ |
| 320 | is_signed_type(type), FILTER_OTHER); \ | 318 | is_signed_type(type), FILTER_OTHER); \ |
| 321 | mutex_unlock(&event_storage_mutex); \ | ||
| 322 | if (ret) \ | 319 | if (ret) \ |
| 323 | return ret; \ | 320 | return ret; \ |
| 324 | } while (0); | 321 | } while (0); |
diff --git a/kernel/cgroup.c b/kernel/cgroup.c index 105f273b6f86..0c753ddd223b 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c | |||
| @@ -4112,17 +4112,17 @@ static int create_css(struct cgroup *cgrp, struct cgroup_subsys *ss) | |||
| 4112 | 4112 | ||
| 4113 | err = percpu_ref_init(&css->refcnt, css_release); | 4113 | err = percpu_ref_init(&css->refcnt, css_release); |
| 4114 | if (err) | 4114 | if (err) |
| 4115 | goto err_free; | 4115 | goto err_free_css; |
| 4116 | 4116 | ||
| 4117 | init_css(css, ss, cgrp); | 4117 | init_css(css, ss, cgrp); |
| 4118 | 4118 | ||
| 4119 | err = cgroup_populate_dir(cgrp, 1 << ss->subsys_id); | 4119 | err = cgroup_populate_dir(cgrp, 1 << ss->subsys_id); |
| 4120 | if (err) | 4120 | if (err) |
| 4121 | goto err_free; | 4121 | goto err_free_percpu_ref; |
| 4122 | 4122 | ||
| 4123 | err = online_css(css); | 4123 | err = online_css(css); |
| 4124 | if (err) | 4124 | if (err) |
| 4125 | goto err_free; | 4125 | goto err_clear_dir; |
| 4126 | 4126 | ||
| 4127 | dget(cgrp->dentry); | 4127 | dget(cgrp->dentry); |
| 4128 | css_get(css->parent); | 4128 | css_get(css->parent); |
| @@ -4138,8 +4138,11 @@ static int create_css(struct cgroup *cgrp, struct cgroup_subsys *ss) | |||
| 4138 | 4138 | ||
| 4139 | return 0; | 4139 | return 0; |
| 4140 | 4140 | ||
| 4141 | err_free: | 4141 | err_clear_dir: |
| 4142 | cgroup_clear_dir(css->cgroup, 1 << css->ss->subsys_id); | ||
| 4143 | err_free_percpu_ref: | ||
| 4142 | percpu_ref_cancel_init(&css->refcnt); | 4144 | percpu_ref_cancel_init(&css->refcnt); |
| 4145 | err_free_css: | ||
| 4143 | ss->css_free(css); | 4146 | ss->css_free(css); |
| 4144 | return err; | 4147 | return err; |
| 4145 | } | 4148 | } |
diff --git a/kernel/futex.c b/kernel/futex.c index 44a1261cb9ff..08ec814ad9d2 100644 --- a/kernel/futex.c +++ b/kernel/futex.c | |||
| @@ -234,6 +234,7 @@ static const struct futex_q futex_q_init = { | |||
| 234 | * waiting on a futex. | 234 | * waiting on a futex. |
| 235 | */ | 235 | */ |
| 236 | struct futex_hash_bucket { | 236 | struct futex_hash_bucket { |
| 237 | atomic_t waiters; | ||
| 237 | spinlock_t lock; | 238 | spinlock_t lock; |
| 238 | struct plist_head chain; | 239 | struct plist_head chain; |
| 239 | } ____cacheline_aligned_in_smp; | 240 | } ____cacheline_aligned_in_smp; |
| @@ -253,22 +254,37 @@ static inline void futex_get_mm(union futex_key *key) | |||
| 253 | smp_mb__after_atomic_inc(); | 254 | smp_mb__after_atomic_inc(); |
| 254 | } | 255 | } |
| 255 | 256 | ||
| 256 | static inline bool hb_waiters_pending(struct futex_hash_bucket *hb) | 257 | /* |
| 258 | * Reflects a new waiter being added to the waitqueue. | ||
| 259 | */ | ||
| 260 | static inline void hb_waiters_inc(struct futex_hash_bucket *hb) | ||
| 257 | { | 261 | { |
| 258 | #ifdef CONFIG_SMP | 262 | #ifdef CONFIG_SMP |
| 263 | atomic_inc(&hb->waiters); | ||
| 259 | /* | 264 | /* |
| 260 | * Tasks trying to enter the critical region are most likely | 265 | * Full barrier (A), see the ordering comment above. |
| 261 | * potential waiters that will be added to the plist. Ensure | ||
| 262 | * that wakers won't miss to-be-slept tasks in the window between | ||
| 263 | * the wait call and the actual plist_add. | ||
| 264 | */ | 266 | */ |
| 265 | if (spin_is_locked(&hb->lock)) | 267 | smp_mb__after_atomic_inc(); |
| 266 | return true; | 268 | #endif |
| 267 | smp_rmb(); /* Make sure we check the lock state first */ | 269 | } |
| 270 | |||
| 271 | /* | ||
| 272 | * Reflects a waiter being removed from the waitqueue by wakeup | ||
| 273 | * paths. | ||
| 274 | */ | ||
| 275 | static inline void hb_waiters_dec(struct futex_hash_bucket *hb) | ||
| 276 | { | ||
| 277 | #ifdef CONFIG_SMP | ||
| 278 | atomic_dec(&hb->waiters); | ||
| 279 | #endif | ||
| 280 | } | ||
| 268 | 281 | ||
| 269 | return !plist_head_empty(&hb->chain); | 282 | static inline int hb_waiters_pending(struct futex_hash_bucket *hb) |
| 283 | { | ||
| 284 | #ifdef CONFIG_SMP | ||
| 285 | return atomic_read(&hb->waiters); | ||
| 270 | #else | 286 | #else |
| 271 | return true; | 287 | return 1; |
| 272 | #endif | 288 | #endif |
| 273 | } | 289 | } |
| 274 | 290 | ||
| @@ -954,6 +970,7 @@ static void __unqueue_futex(struct futex_q *q) | |||
| 954 | 970 | ||
| 955 | hb = container_of(q->lock_ptr, struct futex_hash_bucket, lock); | 971 | hb = container_of(q->lock_ptr, struct futex_hash_bucket, lock); |
| 956 | plist_del(&q->list, &hb->chain); | 972 | plist_del(&q->list, &hb->chain); |
| 973 | hb_waiters_dec(hb); | ||
| 957 | } | 974 | } |
| 958 | 975 | ||
| 959 | /* | 976 | /* |
| @@ -1257,7 +1274,9 @@ void requeue_futex(struct futex_q *q, struct futex_hash_bucket *hb1, | |||
| 1257 | */ | 1274 | */ |
| 1258 | if (likely(&hb1->chain != &hb2->chain)) { | 1275 | if (likely(&hb1->chain != &hb2->chain)) { |
| 1259 | plist_del(&q->list, &hb1->chain); | 1276 | plist_del(&q->list, &hb1->chain); |
| 1277 | hb_waiters_dec(hb1); | ||
| 1260 | plist_add(&q->list, &hb2->chain); | 1278 | plist_add(&q->list, &hb2->chain); |
| 1279 | hb_waiters_inc(hb2); | ||
| 1261 | q->lock_ptr = &hb2->lock; | 1280 | q->lock_ptr = &hb2->lock; |
| 1262 | } | 1281 | } |
| 1263 | get_futex_key_refs(key2); | 1282 | get_futex_key_refs(key2); |
| @@ -1600,6 +1619,17 @@ static inline struct futex_hash_bucket *queue_lock(struct futex_q *q) | |||
| 1600 | struct futex_hash_bucket *hb; | 1619 | struct futex_hash_bucket *hb; |
| 1601 | 1620 | ||
| 1602 | hb = hash_futex(&q->key); | 1621 | hb = hash_futex(&q->key); |
| 1622 | |||
| 1623 | /* | ||
| 1624 | * Increment the counter before taking the lock so that | ||
| 1625 | * a potential waker won't miss a to-be-slept task that is | ||
| 1626 | * waiting for the spinlock. This is safe as all queue_lock() | ||
| 1627 | * users end up calling queue_me(). Similarly, for housekeeping, | ||
| 1628 | * decrement the counter at queue_unlock() when some error has | ||
| 1629 | * occurred and we don't end up adding the task to the list. | ||
| 1630 | */ | ||
| 1631 | hb_waiters_inc(hb); | ||
| 1632 | |||
| 1603 | q->lock_ptr = &hb->lock; | 1633 | q->lock_ptr = &hb->lock; |
| 1604 | 1634 | ||
| 1605 | spin_lock(&hb->lock); /* implies MB (A) */ | 1635 | spin_lock(&hb->lock); /* implies MB (A) */ |
| @@ -1611,6 +1641,7 @@ queue_unlock(struct futex_hash_bucket *hb) | |||
| 1611 | __releases(&hb->lock) | 1641 | __releases(&hb->lock) |
| 1612 | { | 1642 | { |
| 1613 | spin_unlock(&hb->lock); | 1643 | spin_unlock(&hb->lock); |
| 1644 | hb_waiters_dec(hb); | ||
| 1614 | } | 1645 | } |
| 1615 | 1646 | ||
| 1616 | /** | 1647 | /** |
| @@ -2342,6 +2373,7 @@ int handle_early_requeue_pi_wakeup(struct futex_hash_bucket *hb, | |||
| 2342 | * Unqueue the futex_q and determine which it was. | 2373 | * Unqueue the futex_q and determine which it was. |
| 2343 | */ | 2374 | */ |
| 2344 | plist_del(&q->list, &hb->chain); | 2375 | plist_del(&q->list, &hb->chain); |
| 2376 | hb_waiters_dec(hb); | ||
| 2345 | 2377 | ||
| 2346 | /* Handle spurious wakeups gracefully */ | 2378 | /* Handle spurious wakeups gracefully */ |
| 2347 | ret = -EWOULDBLOCK; | 2379 | ret = -EWOULDBLOCK; |
| @@ -2875,6 +2907,7 @@ static int __init futex_init(void) | |||
| 2875 | futex_cmpxchg_enabled = 1; | 2907 | futex_cmpxchg_enabled = 1; |
| 2876 | 2908 | ||
| 2877 | for (i = 0; i < futex_hashsize; i++) { | 2909 | for (i = 0; i < futex_hashsize; i++) { |
| 2910 | atomic_set(&futex_queues[i].waiters, 0); | ||
| 2878 | plist_head_init(&futex_queues[i].chain); | 2911 | plist_head_init(&futex_queues[i].chain); |
| 2879 | spin_lock_init(&futex_queues[i].lock); | 2912 | spin_lock_init(&futex_queues[i].lock); |
| 2880 | } | 2913 | } |
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c index f3989ceb5cd5..7b16d40bd64d 100644 --- a/kernel/trace/trace_events.c +++ b/kernel/trace/trace_events.c | |||
| @@ -27,12 +27,6 @@ | |||
| 27 | 27 | ||
| 28 | DEFINE_MUTEX(event_mutex); | 28 | DEFINE_MUTEX(event_mutex); |
| 29 | 29 | ||
| 30 | DEFINE_MUTEX(event_storage_mutex); | ||
| 31 | EXPORT_SYMBOL_GPL(event_storage_mutex); | ||
| 32 | |||
| 33 | char event_storage[EVENT_STORAGE_SIZE]; | ||
| 34 | EXPORT_SYMBOL_GPL(event_storage); | ||
| 35 | |||
| 36 | LIST_HEAD(ftrace_events); | 30 | LIST_HEAD(ftrace_events); |
| 37 | static LIST_HEAD(ftrace_common_fields); | 31 | static LIST_HEAD(ftrace_common_fields); |
| 38 | 32 | ||
diff --git a/kernel/trace/trace_export.c b/kernel/trace/trace_export.c index 7c3e3e72e2b6..ee0a5098ac43 100644 --- a/kernel/trace/trace_export.c +++ b/kernel/trace/trace_export.c | |||
| @@ -95,15 +95,12 @@ static void __always_unused ____ftrace_check_##name(void) \ | |||
| 95 | #undef __array | 95 | #undef __array |
| 96 | #define __array(type, item, len) \ | 96 | #define __array(type, item, len) \ |
| 97 | do { \ | 97 | do { \ |
| 98 | char *type_str = #type"["__stringify(len)"]"; \ | ||
| 98 | BUILD_BUG_ON(len > MAX_FILTER_STR_VAL); \ | 99 | BUILD_BUG_ON(len > MAX_FILTER_STR_VAL); \ |
| 99 | mutex_lock(&event_storage_mutex); \ | 100 | ret = trace_define_field(event_call, type_str, #item, \ |
| 100 | snprintf(event_storage, sizeof(event_storage), \ | ||
| 101 | "%s[%d]", #type, len); \ | ||
| 102 | ret = trace_define_field(event_call, event_storage, #item, \ | ||
| 103 | offsetof(typeof(field), item), \ | 101 | offsetof(typeof(field), item), \ |
| 104 | sizeof(field.item), \ | 102 | sizeof(field.item), \ |
| 105 | is_signed_type(type), filter_type); \ | 103 | is_signed_type(type), filter_type); \ |
| 106 | mutex_unlock(&event_storage_mutex); \ | ||
| 107 | if (ret) \ | 104 | if (ret) \ |
| 108 | return ret; \ | 105 | return ret; \ |
| 109 | } while (0); | 106 | } while (0); |
diff --git a/lib/fonts/Kconfig b/lib/fonts/Kconfig index 4dc1b990aa23..34fd931b54b5 100644 --- a/lib/fonts/Kconfig +++ b/lib/fonts/Kconfig | |||
| @@ -9,7 +9,7 @@ if FONT_SUPPORT | |||
| 9 | 9 | ||
| 10 | config FONTS | 10 | config FONTS |
| 11 | bool "Select compiled-in fonts" | 11 | bool "Select compiled-in fonts" |
| 12 | depends on FRAMEBUFFER_CONSOLE | 12 | depends on FRAMEBUFFER_CONSOLE || STI_CONSOLE |
| 13 | help | 13 | help |
| 14 | Say Y here if you would like to use fonts other than the default | 14 | Say Y here if you would like to use fonts other than the default |
| 15 | your frame buffer console usually use. | 15 | your frame buffer console usually use. |
| @@ -22,7 +22,7 @@ config FONTS | |||
| 22 | 22 | ||
| 23 | config FONT_8x8 | 23 | config FONT_8x8 |
| 24 | bool "VGA 8x8 font" if FONTS | 24 | bool "VGA 8x8 font" if FONTS |
| 25 | depends on FRAMEBUFFER_CONSOLE | 25 | depends on FRAMEBUFFER_CONSOLE || STI_CONSOLE |
| 26 | default y if !SPARC && !FONTS | 26 | default y if !SPARC && !FONTS |
| 27 | help | 27 | help |
| 28 | This is the "high resolution" font for the VGA frame buffer (the one | 28 | This is the "high resolution" font for the VGA frame buffer (the one |
| @@ -45,7 +45,7 @@ config FONT_8x16 | |||
| 45 | 45 | ||
| 46 | config FONT_6x11 | 46 | config FONT_6x11 |
| 47 | bool "Mac console 6x11 font (not supported by all drivers)" if FONTS | 47 | bool "Mac console 6x11 font (not supported by all drivers)" if FONTS |
| 48 | depends on FRAMEBUFFER_CONSOLE | 48 | depends on FRAMEBUFFER_CONSOLE || STI_CONSOLE |
| 49 | default y if !SPARC && !FONTS && MAC | 49 | default y if !SPARC && !FONTS && MAC |
| 50 | help | 50 | help |
| 51 | Small console font with Macintosh-style high-half glyphs. Some Mac | 51 | Small console font with Macintosh-style high-half glyphs. Some Mac |
diff --git a/mm/fremap.c b/mm/fremap.c index bbc4d660221a..34feba60a17e 100644 --- a/mm/fremap.c +++ b/mm/fremap.c | |||
| @@ -23,28 +23,44 @@ | |||
| 23 | 23 | ||
| 24 | #include "internal.h" | 24 | #include "internal.h" |
| 25 | 25 | ||
| 26 | static int mm_counter(struct page *page) | ||
| 27 | { | ||
| 28 | return PageAnon(page) ? MM_ANONPAGES : MM_FILEPAGES; | ||
| 29 | } | ||
| 30 | |||
| 26 | static void zap_pte(struct mm_struct *mm, struct vm_area_struct *vma, | 31 | static void zap_pte(struct mm_struct *mm, struct vm_area_struct *vma, |
| 27 | unsigned long addr, pte_t *ptep) | 32 | unsigned long addr, pte_t *ptep) |
| 28 | { | 33 | { |
| 29 | pte_t pte = *ptep; | 34 | pte_t pte = *ptep; |
| 35 | struct page *page; | ||
| 36 | swp_entry_t entry; | ||
| 30 | 37 | ||
| 31 | if (pte_present(pte)) { | 38 | if (pte_present(pte)) { |
| 32 | struct page *page; | ||
| 33 | |||
| 34 | flush_cache_page(vma, addr, pte_pfn(pte)); | 39 | flush_cache_page(vma, addr, pte_pfn(pte)); |
| 35 | pte = ptep_clear_flush(vma, addr, ptep); | 40 | pte = ptep_clear_flush(vma, addr, ptep); |
| 36 | page = vm_normal_page(vma, addr, pte); | 41 | page = vm_normal_page(vma, addr, pte); |
| 37 | if (page) { | 42 | if (page) { |
| 38 | if (pte_dirty(pte)) | 43 | if (pte_dirty(pte)) |
| 39 | set_page_dirty(page); | 44 | set_page_dirty(page); |
| 45 | update_hiwater_rss(mm); | ||
| 46 | dec_mm_counter(mm, mm_counter(page)); | ||
| 40 | page_remove_rmap(page); | 47 | page_remove_rmap(page); |
| 41 | page_cache_release(page); | 48 | page_cache_release(page); |
| 49 | } | ||
| 50 | } else { /* zap_pte() is not called when pte_none() */ | ||
| 51 | if (!pte_file(pte)) { | ||
| 42 | update_hiwater_rss(mm); | 52 | update_hiwater_rss(mm); |
| 43 | dec_mm_counter(mm, MM_FILEPAGES); | 53 | entry = pte_to_swp_entry(pte); |
| 54 | if (non_swap_entry(entry)) { | ||
| 55 | if (is_migration_entry(entry)) { | ||
| 56 | page = migration_entry_to_page(entry); | ||
| 57 | dec_mm_counter(mm, mm_counter(page)); | ||
| 58 | } | ||
| 59 | } else { | ||
| 60 | free_swap_and_cache(entry); | ||
| 61 | dec_mm_counter(mm, MM_SWAPENTS); | ||
| 62 | } | ||
| 44 | } | 63 | } |
| 45 | } else { | ||
| 46 | if (!pte_file(pte)) | ||
| 47 | free_swap_and_cache(pte_to_swp_entry(pte)); | ||
| 48 | pte_clear_not_present_full(mm, addr, ptep, 0); | 64 | pte_clear_not_present_full(mm, addr, ptep, 0); |
| 49 | } | 65 | } |
| 50 | } | 66 | } |
diff --git a/mm/migrate.c b/mm/migrate.c index b494fdb9a636..bed48809e5d0 100644 --- a/mm/migrate.c +++ b/mm/migrate.c | |||
| @@ -178,6 +178,37 @@ out: | |||
| 178 | } | 178 | } |
| 179 | 179 | ||
| 180 | /* | 180 | /* |
| 181 | * Congratulations to trinity for discovering this bug. | ||
| 182 | * mm/fremap.c's remap_file_pages() accepts any range within a single vma to | ||
| 183 | * convert that vma to VM_NONLINEAR; and generic_file_remap_pages() will then | ||
| 184 | * replace the specified range by file ptes throughout (maybe populated after). | ||
| 185 | * If page migration finds a page within that range, while it's still located | ||
| 186 | * by vma_interval_tree rather than lost to i_mmap_nonlinear list, no problem: | ||
| 187 | * zap_pte() clears the temporary migration entry before mmap_sem is dropped. | ||
| 188 | * But if the migrating page is in a part of the vma outside the range to be | ||
| 189 | * remapped, then it will not be cleared, and remove_migration_ptes() needs to | ||
| 190 | * deal with it. Fortunately, this part of the vma is of course still linear, | ||
| 191 | * so we just need to use linear location on the nonlinear list. | ||
| 192 | */ | ||
| 193 | static int remove_linear_migration_ptes_from_nonlinear(struct page *page, | ||
| 194 | struct address_space *mapping, void *arg) | ||
| 195 | { | ||
| 196 | struct vm_area_struct *vma; | ||
| 197 | /* hugetlbfs does not support remap_pages, so no huge pgoff worries */ | ||
| 198 | pgoff_t pgoff = page->index << (PAGE_CACHE_SHIFT - PAGE_SHIFT); | ||
| 199 | unsigned long addr; | ||
| 200 | |||
| 201 | list_for_each_entry(vma, | ||
| 202 | &mapping->i_mmap_nonlinear, shared.nonlinear) { | ||
| 203 | |||
| 204 | addr = vma->vm_start + ((pgoff - vma->vm_pgoff) << PAGE_SHIFT); | ||
| 205 | if (addr >= vma->vm_start && addr < vma->vm_end) | ||
| 206 | remove_migration_pte(page, vma, addr, arg); | ||
| 207 | } | ||
| 208 | return SWAP_AGAIN; | ||
| 209 | } | ||
| 210 | |||
| 211 | /* | ||
| 181 | * Get rid of all migration entries and replace them by | 212 | * Get rid of all migration entries and replace them by |
| 182 | * references to the indicated page. | 213 | * references to the indicated page. |
| 183 | */ | 214 | */ |
| @@ -186,6 +217,7 @@ static void remove_migration_ptes(struct page *old, struct page *new) | |||
| 186 | struct rmap_walk_control rwc = { | 217 | struct rmap_walk_control rwc = { |
| 187 | .rmap_one = remove_migration_pte, | 218 | .rmap_one = remove_migration_pte, |
| 188 | .arg = old, | 219 | .arg = old, |
| 220 | .file_nonlinear = remove_linear_migration_ptes_from_nonlinear, | ||
| 189 | }; | 221 | }; |
| 190 | 222 | ||
| 191 | rmap_walk(new, &rwc); | 223 | rmap_walk(new, &rwc); |
| @@ -1360,8 +1360,9 @@ static int try_to_unmap_cluster(unsigned long cursor, unsigned int *mapcount, | |||
| 1360 | } | 1360 | } |
| 1361 | 1361 | ||
| 1362 | static int try_to_unmap_nonlinear(struct page *page, | 1362 | static int try_to_unmap_nonlinear(struct page *page, |
| 1363 | struct address_space *mapping, struct vm_area_struct *vma) | 1363 | struct address_space *mapping, void *arg) |
| 1364 | { | 1364 | { |
| 1365 | struct vm_area_struct *vma; | ||
| 1365 | int ret = SWAP_AGAIN; | 1366 | int ret = SWAP_AGAIN; |
| 1366 | unsigned long cursor; | 1367 | unsigned long cursor; |
| 1367 | unsigned long max_nl_cursor = 0; | 1368 | unsigned long max_nl_cursor = 0; |
| @@ -1663,7 +1664,7 @@ static int rmap_walk_file(struct page *page, struct rmap_walk_control *rwc) | |||
| 1663 | if (list_empty(&mapping->i_mmap_nonlinear)) | 1664 | if (list_empty(&mapping->i_mmap_nonlinear)) |
| 1664 | goto done; | 1665 | goto done; |
| 1665 | 1666 | ||
| 1666 | ret = rwc->file_nonlinear(page, mapping, vma); | 1667 | ret = rwc->file_nonlinear(page, mapping, rwc->arg); |
| 1667 | 1668 | ||
| 1668 | done: | 1669 | done: |
| 1669 | mutex_unlock(&mapping->i_mmap_mutex); | 1670 | mutex_unlock(&mapping->i_mmap_mutex); |
diff --git a/net/core/netpoll.c b/net/core/netpoll.c index a664f7829a6d..df9e6b1a9759 100644 --- a/net/core/netpoll.c +++ b/net/core/netpoll.c | |||
| @@ -742,7 +742,7 @@ static bool pkt_is_ns(struct sk_buff *skb) | |||
| 742 | struct nd_msg *msg; | 742 | struct nd_msg *msg; |
| 743 | struct ipv6hdr *hdr; | 743 | struct ipv6hdr *hdr; |
| 744 | 744 | ||
| 745 | if (skb->protocol != htons(ETH_P_ARP)) | 745 | if (skb->protocol != htons(ETH_P_IPV6)) |
| 746 | return false; | 746 | return false; |
| 747 | if (!pskb_may_pull(skb, sizeof(struct ipv6hdr) + sizeof(struct nd_msg))) | 747 | if (!pskb_may_pull(skb, sizeof(struct ipv6hdr) + sizeof(struct nd_msg))) |
| 748 | return false; | 748 | return false; |
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 1a0dac2ef9ad..120eecc0f5a4 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
| @@ -2121,12 +2121,13 @@ EXPORT_SYMBOL(rtmsg_ifinfo); | |||
| 2121 | static int nlmsg_populate_fdb_fill(struct sk_buff *skb, | 2121 | static int nlmsg_populate_fdb_fill(struct sk_buff *skb, |
| 2122 | struct net_device *dev, | 2122 | struct net_device *dev, |
| 2123 | u8 *addr, u32 pid, u32 seq, | 2123 | u8 *addr, u32 pid, u32 seq, |
| 2124 | int type, unsigned int flags) | 2124 | int type, unsigned int flags, |
| 2125 | int nlflags) | ||
| 2125 | { | 2126 | { |
| 2126 | struct nlmsghdr *nlh; | 2127 | struct nlmsghdr *nlh; |
| 2127 | struct ndmsg *ndm; | 2128 | struct ndmsg *ndm; |
| 2128 | 2129 | ||
| 2129 | nlh = nlmsg_put(skb, pid, seq, type, sizeof(*ndm), NLM_F_MULTI); | 2130 | nlh = nlmsg_put(skb, pid, seq, type, sizeof(*ndm), nlflags); |
| 2130 | if (!nlh) | 2131 | if (!nlh) |
| 2131 | return -EMSGSIZE; | 2132 | return -EMSGSIZE; |
| 2132 | 2133 | ||
| @@ -2164,7 +2165,7 @@ static void rtnl_fdb_notify(struct net_device *dev, u8 *addr, int type) | |||
| 2164 | if (!skb) | 2165 | if (!skb) |
| 2165 | goto errout; | 2166 | goto errout; |
| 2166 | 2167 | ||
| 2167 | err = nlmsg_populate_fdb_fill(skb, dev, addr, 0, 0, type, NTF_SELF); | 2168 | err = nlmsg_populate_fdb_fill(skb, dev, addr, 0, 0, type, NTF_SELF, 0); |
| 2168 | if (err < 0) { | 2169 | if (err < 0) { |
| 2169 | kfree_skb(skb); | 2170 | kfree_skb(skb); |
| 2170 | goto errout; | 2171 | goto errout; |
| @@ -2389,7 +2390,8 @@ static int nlmsg_populate_fdb(struct sk_buff *skb, | |||
| 2389 | 2390 | ||
| 2390 | err = nlmsg_populate_fdb_fill(skb, dev, ha->addr, | 2391 | err = nlmsg_populate_fdb_fill(skb, dev, ha->addr, |
| 2391 | portid, seq, | 2392 | portid, seq, |
| 2392 | RTM_NEWNEIGH, NTF_SELF); | 2393 | RTM_NEWNEIGH, NTF_SELF, |
| 2394 | NLM_F_MULTI); | ||
| 2393 | if (err < 0) | 2395 | if (err < 0) |
| 2394 | return err; | 2396 | return err; |
| 2395 | skip: | 2397 | skip: |
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c index b9b3472975ba..28863570dd60 100644 --- a/net/ipv4/ipmr.c +++ b/net/ipv4/ipmr.c | |||
| @@ -2255,13 +2255,14 @@ int ipmr_get_route(struct net *net, struct sk_buff *skb, | |||
| 2255 | } | 2255 | } |
| 2256 | 2256 | ||
| 2257 | static int ipmr_fill_mroute(struct mr_table *mrt, struct sk_buff *skb, | 2257 | static int ipmr_fill_mroute(struct mr_table *mrt, struct sk_buff *skb, |
| 2258 | u32 portid, u32 seq, struct mfc_cache *c, int cmd) | 2258 | u32 portid, u32 seq, struct mfc_cache *c, int cmd, |
| 2259 | int flags) | ||
| 2259 | { | 2260 | { |
| 2260 | struct nlmsghdr *nlh; | 2261 | struct nlmsghdr *nlh; |
| 2261 | struct rtmsg *rtm; | 2262 | struct rtmsg *rtm; |
| 2262 | int err; | 2263 | int err; |
| 2263 | 2264 | ||
| 2264 | nlh = nlmsg_put(skb, portid, seq, cmd, sizeof(*rtm), NLM_F_MULTI); | 2265 | nlh = nlmsg_put(skb, portid, seq, cmd, sizeof(*rtm), flags); |
| 2265 | if (nlh == NULL) | 2266 | if (nlh == NULL) |
| 2266 | return -EMSGSIZE; | 2267 | return -EMSGSIZE; |
| 2267 | 2268 | ||
| @@ -2329,7 +2330,7 @@ static void mroute_netlink_event(struct mr_table *mrt, struct mfc_cache *mfc, | |||
| 2329 | if (skb == NULL) | 2330 | if (skb == NULL) |
| 2330 | goto errout; | 2331 | goto errout; |
| 2331 | 2332 | ||
| 2332 | err = ipmr_fill_mroute(mrt, skb, 0, 0, mfc, cmd); | 2333 | err = ipmr_fill_mroute(mrt, skb, 0, 0, mfc, cmd, 0); |
| 2333 | if (err < 0) | 2334 | if (err < 0) |
| 2334 | goto errout; | 2335 | goto errout; |
| 2335 | 2336 | ||
| @@ -2368,7 +2369,8 @@ static int ipmr_rtm_dumproute(struct sk_buff *skb, struct netlink_callback *cb) | |||
| 2368 | if (ipmr_fill_mroute(mrt, skb, | 2369 | if (ipmr_fill_mroute(mrt, skb, |
| 2369 | NETLINK_CB(cb->skb).portid, | 2370 | NETLINK_CB(cb->skb).portid, |
| 2370 | cb->nlh->nlmsg_seq, | 2371 | cb->nlh->nlmsg_seq, |
| 2371 | mfc, RTM_NEWROUTE) < 0) | 2372 | mfc, RTM_NEWROUTE, |
| 2373 | NLM_F_MULTI) < 0) | ||
| 2372 | goto done; | 2374 | goto done; |
| 2373 | next_entry: | 2375 | next_entry: |
| 2374 | e++; | 2376 | e++; |
| @@ -2382,7 +2384,8 @@ next_entry: | |||
| 2382 | if (ipmr_fill_mroute(mrt, skb, | 2384 | if (ipmr_fill_mroute(mrt, skb, |
| 2383 | NETLINK_CB(cb->skb).portid, | 2385 | NETLINK_CB(cb->skb).portid, |
| 2384 | cb->nlh->nlmsg_seq, | 2386 | cb->nlh->nlmsg_seq, |
| 2385 | mfc, RTM_NEWROUTE) < 0) { | 2387 | mfc, RTM_NEWROUTE, |
| 2388 | NLM_F_MULTI) < 0) { | ||
| 2386 | spin_unlock_bh(&mfc_unres_lock); | 2389 | spin_unlock_bh(&mfc_unres_lock); |
| 2387 | goto done; | 2390 | goto done; |
| 2388 | } | 2391 | } |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 16f91a2e7888..64d6073731d3 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
| @@ -1101,21 +1101,19 @@ static void ip6_append_data_mtu(unsigned int *mtu, | |||
| 1101 | unsigned int fragheaderlen, | 1101 | unsigned int fragheaderlen, |
| 1102 | struct sk_buff *skb, | 1102 | struct sk_buff *skb, |
| 1103 | struct rt6_info *rt, | 1103 | struct rt6_info *rt, |
| 1104 | bool pmtuprobe) | 1104 | unsigned int orig_mtu) |
| 1105 | { | 1105 | { |
| 1106 | if (!(rt->dst.flags & DST_XFRM_TUNNEL)) { | 1106 | if (!(rt->dst.flags & DST_XFRM_TUNNEL)) { |
| 1107 | if (skb == NULL) { | 1107 | if (skb == NULL) { |
| 1108 | /* first fragment, reserve header_len */ | 1108 | /* first fragment, reserve header_len */ |
| 1109 | *mtu = *mtu - rt->dst.header_len; | 1109 | *mtu = orig_mtu - rt->dst.header_len; |
| 1110 | 1110 | ||
| 1111 | } else { | 1111 | } else { |
| 1112 | /* | 1112 | /* |
| 1113 | * this fragment is not first, the headers | 1113 | * this fragment is not first, the headers |
| 1114 | * space is regarded as data space. | 1114 | * space is regarded as data space. |
| 1115 | */ | 1115 | */ |
| 1116 | *mtu = min(*mtu, pmtuprobe ? | 1116 | *mtu = orig_mtu; |
| 1117 | rt->dst.dev->mtu : | ||
| 1118 | dst_mtu(rt->dst.path)); | ||
| 1119 | } | 1117 | } |
| 1120 | *maxfraglen = ((*mtu - fragheaderlen) & ~7) | 1118 | *maxfraglen = ((*mtu - fragheaderlen) & ~7) |
| 1121 | + fragheaderlen - sizeof(struct frag_hdr); | 1119 | + fragheaderlen - sizeof(struct frag_hdr); |
| @@ -1132,7 +1130,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to, | |||
| 1132 | struct ipv6_pinfo *np = inet6_sk(sk); | 1130 | struct ipv6_pinfo *np = inet6_sk(sk); |
| 1133 | struct inet_cork *cork; | 1131 | struct inet_cork *cork; |
| 1134 | struct sk_buff *skb, *skb_prev = NULL; | 1132 | struct sk_buff *skb, *skb_prev = NULL; |
| 1135 | unsigned int maxfraglen, fragheaderlen, mtu; | 1133 | unsigned int maxfraglen, fragheaderlen, mtu, orig_mtu; |
| 1136 | int exthdrlen; | 1134 | int exthdrlen; |
| 1137 | int dst_exthdrlen; | 1135 | int dst_exthdrlen; |
| 1138 | int hh_len; | 1136 | int hh_len; |
| @@ -1214,6 +1212,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to, | |||
| 1214 | dst_exthdrlen = 0; | 1212 | dst_exthdrlen = 0; |
| 1215 | mtu = cork->fragsize; | 1213 | mtu = cork->fragsize; |
| 1216 | } | 1214 | } |
| 1215 | orig_mtu = mtu; | ||
| 1217 | 1216 | ||
| 1218 | hh_len = LL_RESERVED_SPACE(rt->dst.dev); | 1217 | hh_len = LL_RESERVED_SPACE(rt->dst.dev); |
| 1219 | 1218 | ||
| @@ -1311,8 +1310,7 @@ alloc_new_skb: | |||
| 1311 | if (skb == NULL || skb_prev == NULL) | 1310 | if (skb == NULL || skb_prev == NULL) |
| 1312 | ip6_append_data_mtu(&mtu, &maxfraglen, | 1311 | ip6_append_data_mtu(&mtu, &maxfraglen, |
| 1313 | fragheaderlen, skb, rt, | 1312 | fragheaderlen, skb, rt, |
| 1314 | np->pmtudisc >= | 1313 | orig_mtu); |
| 1315 | IPV6_PMTUDISC_PROBE); | ||
| 1316 | 1314 | ||
| 1317 | skb_prev = skb; | 1315 | skb_prev = skb; |
| 1318 | 1316 | ||
diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c index 0eb4038a4d63..8737400af0a0 100644 --- a/net/ipv6/ip6mr.c +++ b/net/ipv6/ip6mr.c | |||
| @@ -2349,13 +2349,14 @@ int ip6mr_get_route(struct net *net, | |||
| 2349 | } | 2349 | } |
| 2350 | 2350 | ||
| 2351 | static int ip6mr_fill_mroute(struct mr6_table *mrt, struct sk_buff *skb, | 2351 | static int ip6mr_fill_mroute(struct mr6_table *mrt, struct sk_buff *skb, |
| 2352 | u32 portid, u32 seq, struct mfc6_cache *c, int cmd) | 2352 | u32 portid, u32 seq, struct mfc6_cache *c, int cmd, |
| 2353 | int flags) | ||
| 2353 | { | 2354 | { |
| 2354 | struct nlmsghdr *nlh; | 2355 | struct nlmsghdr *nlh; |
| 2355 | struct rtmsg *rtm; | 2356 | struct rtmsg *rtm; |
| 2356 | int err; | 2357 | int err; |
| 2357 | 2358 | ||
| 2358 | nlh = nlmsg_put(skb, portid, seq, cmd, sizeof(*rtm), NLM_F_MULTI); | 2359 | nlh = nlmsg_put(skb, portid, seq, cmd, sizeof(*rtm), flags); |
| 2359 | if (nlh == NULL) | 2360 | if (nlh == NULL) |
| 2360 | return -EMSGSIZE; | 2361 | return -EMSGSIZE; |
| 2361 | 2362 | ||
| @@ -2423,7 +2424,7 @@ static void mr6_netlink_event(struct mr6_table *mrt, struct mfc6_cache *mfc, | |||
| 2423 | if (skb == NULL) | 2424 | if (skb == NULL) |
| 2424 | goto errout; | 2425 | goto errout; |
| 2425 | 2426 | ||
| 2426 | err = ip6mr_fill_mroute(mrt, skb, 0, 0, mfc, cmd); | 2427 | err = ip6mr_fill_mroute(mrt, skb, 0, 0, mfc, cmd, 0); |
| 2427 | if (err < 0) | 2428 | if (err < 0) |
| 2428 | goto errout; | 2429 | goto errout; |
| 2429 | 2430 | ||
| @@ -2462,7 +2463,8 @@ static int ip6mr_rtm_dumproute(struct sk_buff *skb, struct netlink_callback *cb) | |||
| 2462 | if (ip6mr_fill_mroute(mrt, skb, | 2463 | if (ip6mr_fill_mroute(mrt, skb, |
| 2463 | NETLINK_CB(cb->skb).portid, | 2464 | NETLINK_CB(cb->skb).portid, |
| 2464 | cb->nlh->nlmsg_seq, | 2465 | cb->nlh->nlmsg_seq, |
| 2465 | mfc, RTM_NEWROUTE) < 0) | 2466 | mfc, RTM_NEWROUTE, |
| 2467 | NLM_F_MULTI) < 0) | ||
| 2466 | goto done; | 2468 | goto done; |
| 2467 | next_entry: | 2469 | next_entry: |
| 2468 | e++; | 2470 | e++; |
| @@ -2476,7 +2478,8 @@ next_entry: | |||
| 2476 | if (ip6mr_fill_mroute(mrt, skb, | 2478 | if (ip6mr_fill_mroute(mrt, skb, |
| 2477 | NETLINK_CB(cb->skb).portid, | 2479 | NETLINK_CB(cb->skb).portid, |
| 2478 | cb->nlh->nlmsg_seq, | 2480 | cb->nlh->nlmsg_seq, |
| 2479 | mfc, RTM_NEWROUTE) < 0) { | 2481 | mfc, RTM_NEWROUTE, |
| 2482 | NLM_F_MULTI) < 0) { | ||
| 2480 | spin_unlock_bh(&mfc_unres_lock); | 2483 | spin_unlock_bh(&mfc_unres_lock); |
| 2481 | goto done; | 2484 | goto done; |
| 2482 | } | 2485 | } |
diff --git a/net/key/af_key.c b/net/key/af_key.c index 1a04c1329362..79326978517a 100644 --- a/net/key/af_key.c +++ b/net/key/af_key.c | |||
| @@ -433,12 +433,13 @@ static inline int verify_sec_ctx_len(const void *p) | |||
| 433 | return 0; | 433 | return 0; |
| 434 | } | 434 | } |
| 435 | 435 | ||
| 436 | static inline struct xfrm_user_sec_ctx *pfkey_sadb2xfrm_user_sec_ctx(const struct sadb_x_sec_ctx *sec_ctx) | 436 | static inline struct xfrm_user_sec_ctx *pfkey_sadb2xfrm_user_sec_ctx(const struct sadb_x_sec_ctx *sec_ctx, |
| 437 | gfp_t gfp) | ||
| 437 | { | 438 | { |
| 438 | struct xfrm_user_sec_ctx *uctx = NULL; | 439 | struct xfrm_user_sec_ctx *uctx = NULL; |
| 439 | int ctx_size = sec_ctx->sadb_x_ctx_len; | 440 | int ctx_size = sec_ctx->sadb_x_ctx_len; |
| 440 | 441 | ||
| 441 | uctx = kmalloc((sizeof(*uctx)+ctx_size), GFP_KERNEL); | 442 | uctx = kmalloc((sizeof(*uctx)+ctx_size), gfp); |
| 442 | 443 | ||
| 443 | if (!uctx) | 444 | if (!uctx) |
| 444 | return NULL; | 445 | return NULL; |
| @@ -1124,7 +1125,7 @@ static struct xfrm_state * pfkey_msg2xfrm_state(struct net *net, | |||
| 1124 | 1125 | ||
| 1125 | sec_ctx = ext_hdrs[SADB_X_EXT_SEC_CTX - 1]; | 1126 | sec_ctx = ext_hdrs[SADB_X_EXT_SEC_CTX - 1]; |
| 1126 | if (sec_ctx != NULL) { | 1127 | if (sec_ctx != NULL) { |
| 1127 | struct xfrm_user_sec_ctx *uctx = pfkey_sadb2xfrm_user_sec_ctx(sec_ctx); | 1128 | struct xfrm_user_sec_ctx *uctx = pfkey_sadb2xfrm_user_sec_ctx(sec_ctx, GFP_KERNEL); |
| 1128 | 1129 | ||
| 1129 | if (!uctx) | 1130 | if (!uctx) |
| 1130 | goto out; | 1131 | goto out; |
| @@ -2231,14 +2232,14 @@ static int pfkey_spdadd(struct sock *sk, struct sk_buff *skb, const struct sadb_ | |||
| 2231 | 2232 | ||
| 2232 | sec_ctx = ext_hdrs[SADB_X_EXT_SEC_CTX - 1]; | 2233 | sec_ctx = ext_hdrs[SADB_X_EXT_SEC_CTX - 1]; |
| 2233 | if (sec_ctx != NULL) { | 2234 | if (sec_ctx != NULL) { |
| 2234 | struct xfrm_user_sec_ctx *uctx = pfkey_sadb2xfrm_user_sec_ctx(sec_ctx); | 2235 | struct xfrm_user_sec_ctx *uctx = pfkey_sadb2xfrm_user_sec_ctx(sec_ctx, GFP_KERNEL); |
| 2235 | 2236 | ||
| 2236 | if (!uctx) { | 2237 | if (!uctx) { |
| 2237 | err = -ENOBUFS; | 2238 | err = -ENOBUFS; |
| 2238 | goto out; | 2239 | goto out; |
| 2239 | } | 2240 | } |
| 2240 | 2241 | ||
| 2241 | err = security_xfrm_policy_alloc(&xp->security, uctx); | 2242 | err = security_xfrm_policy_alloc(&xp->security, uctx, GFP_KERNEL); |
| 2242 | kfree(uctx); | 2243 | kfree(uctx); |
| 2243 | 2244 | ||
| 2244 | if (err) | 2245 | if (err) |
| @@ -2335,12 +2336,12 @@ static int pfkey_spddelete(struct sock *sk, struct sk_buff *skb, const struct sa | |||
| 2335 | 2336 | ||
| 2336 | sec_ctx = ext_hdrs[SADB_X_EXT_SEC_CTX - 1]; | 2337 | sec_ctx = ext_hdrs[SADB_X_EXT_SEC_CTX - 1]; |
| 2337 | if (sec_ctx != NULL) { | 2338 | if (sec_ctx != NULL) { |
| 2338 | struct xfrm_user_sec_ctx *uctx = pfkey_sadb2xfrm_user_sec_ctx(sec_ctx); | 2339 | struct xfrm_user_sec_ctx *uctx = pfkey_sadb2xfrm_user_sec_ctx(sec_ctx, GFP_KERNEL); |
| 2339 | 2340 | ||
| 2340 | if (!uctx) | 2341 | if (!uctx) |
| 2341 | return -ENOMEM; | 2342 | return -ENOMEM; |
| 2342 | 2343 | ||
| 2343 | err = security_xfrm_policy_alloc(&pol_ctx, uctx); | 2344 | err = security_xfrm_policy_alloc(&pol_ctx, uctx, GFP_KERNEL); |
| 2344 | kfree(uctx); | 2345 | kfree(uctx); |
| 2345 | if (err) | 2346 | if (err) |
| 2346 | return err; | 2347 | return err; |
| @@ -3239,8 +3240,8 @@ static struct xfrm_policy *pfkey_compile_policy(struct sock *sk, int opt, | |||
| 3239 | } | 3240 | } |
| 3240 | if ((*dir = verify_sec_ctx_len(p))) | 3241 | if ((*dir = verify_sec_ctx_len(p))) |
| 3241 | goto out; | 3242 | goto out; |
| 3242 | uctx = pfkey_sadb2xfrm_user_sec_ctx(sec_ctx); | 3243 | uctx = pfkey_sadb2xfrm_user_sec_ctx(sec_ctx, GFP_ATOMIC); |
| 3243 | *dir = security_xfrm_policy_alloc(&xp->security, uctx); | 3244 | *dir = security_xfrm_policy_alloc(&xp->security, uctx, GFP_ATOMIC); |
| 3244 | kfree(uctx); | 3245 | kfree(uctx); |
| 3245 | 3246 | ||
| 3246 | if (*dir) | 3247 | if (*dir) |
diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c index e9a48baf8551..8601b320b443 100644 --- a/net/openvswitch/datapath.c +++ b/net/openvswitch/datapath.c | |||
| @@ -1174,7 +1174,7 @@ static void ovs_dp_reset_user_features(struct sk_buff *skb, struct genl_info *in | |||
| 1174 | struct datapath *dp; | 1174 | struct datapath *dp; |
| 1175 | 1175 | ||
| 1176 | dp = lookup_datapath(sock_net(skb->sk), info->userhdr, info->attrs); | 1176 | dp = lookup_datapath(sock_net(skb->sk), info->userhdr, info->attrs); |
| 1177 | if (!dp) | 1177 | if (IS_ERR(dp)) |
| 1178 | return; | 1178 | return; |
| 1179 | 1179 | ||
| 1180 | WARN(dp->user_features, "Dropping previously announced user features\n"); | 1180 | WARN(dp->user_features, "Dropping previously announced user features\n"); |
| @@ -1762,11 +1762,12 @@ static int ovs_vport_cmd_dump(struct sk_buff *skb, struct netlink_callback *cb) | |||
| 1762 | int bucket = cb->args[0], skip = cb->args[1]; | 1762 | int bucket = cb->args[0], skip = cb->args[1]; |
| 1763 | int i, j = 0; | 1763 | int i, j = 0; |
| 1764 | 1764 | ||
| 1765 | rcu_read_lock(); | ||
| 1765 | dp = get_dp(sock_net(skb->sk), ovs_header->dp_ifindex); | 1766 | dp = get_dp(sock_net(skb->sk), ovs_header->dp_ifindex); |
| 1766 | if (!dp) | 1767 | if (!dp) { |
| 1768 | rcu_read_unlock(); | ||
| 1767 | return -ENODEV; | 1769 | return -ENODEV; |
| 1768 | 1770 | } | |
| 1769 | rcu_read_lock(); | ||
| 1770 | for (i = bucket; i < DP_VPORT_HASH_BUCKETS; i++) { | 1771 | for (i = bucket; i < DP_VPORT_HASH_BUCKETS; i++) { |
| 1771 | struct vport *vport; | 1772 | struct vport *vport; |
| 1772 | 1773 | ||
diff --git a/net/openvswitch/flow.c b/net/openvswitch/flow.c index 16f4b46161d4..dda451f4429c 100644 --- a/net/openvswitch/flow.c +++ b/net/openvswitch/flow.c | |||
| @@ -73,6 +73,7 @@ void ovs_flow_stats_update(struct sw_flow *flow, struct sk_buff *skb) | |||
| 73 | 73 | ||
| 74 | if ((flow->key.eth.type == htons(ETH_P_IP) || | 74 | if ((flow->key.eth.type == htons(ETH_P_IP) || |
| 75 | flow->key.eth.type == htons(ETH_P_IPV6)) && | 75 | flow->key.eth.type == htons(ETH_P_IPV6)) && |
| 76 | flow->key.ip.frag != OVS_FRAG_TYPE_LATER && | ||
| 76 | flow->key.ip.proto == IPPROTO_TCP && | 77 | flow->key.ip.proto == IPPROTO_TCP && |
| 77 | likely(skb->len >= skb_transport_offset(skb) + sizeof(struct tcphdr))) { | 78 | likely(skb->len >= skb_transport_offset(skb) + sizeof(struct tcphdr))) { |
| 78 | tcp_flags = TCP_FLAGS_BE16(tcp_hdr(skb)); | 79 | tcp_flags = TCP_FLAGS_BE16(tcp_hdr(skb)); |
| @@ -91,7 +92,7 @@ static void stats_read(struct flow_stats *stats, | |||
| 91 | unsigned long *used, __be16 *tcp_flags) | 92 | unsigned long *used, __be16 *tcp_flags) |
| 92 | { | 93 | { |
| 93 | spin_lock(&stats->lock); | 94 | spin_lock(&stats->lock); |
| 94 | if (time_after(stats->used, *used)) | 95 | if (!*used || time_after(stats->used, *used)) |
| 95 | *used = stats->used; | 96 | *used = stats->used; |
| 96 | *tcp_flags |= stats->tcp_flags; | 97 | *tcp_flags |= stats->tcp_flags; |
| 97 | ovs_stats->n_packets += stats->packet_count; | 98 | ovs_stats->n_packets += stats->packet_count; |
diff --git a/net/tipc/subscr.c b/net/tipc/subscr.c index 11c9ae00837d..642437231ad5 100644 --- a/net/tipc/subscr.c +++ b/net/tipc/subscr.c | |||
| @@ -263,9 +263,9 @@ static void subscr_cancel(struct tipc_subscr *s, | |||
| 263 | * | 263 | * |
| 264 | * Called with subscriber lock held. | 264 | * Called with subscriber lock held. |
| 265 | */ | 265 | */ |
| 266 | static struct tipc_subscription *subscr_subscribe(struct tipc_subscr *s, | 266 | static int subscr_subscribe(struct tipc_subscr *s, |
| 267 | struct tipc_subscriber *subscriber) | 267 | struct tipc_subscriber *subscriber, |
| 268 | { | 268 | struct tipc_subscription **sub_p) { |
| 269 | struct tipc_subscription *sub; | 269 | struct tipc_subscription *sub; |
| 270 | int swap; | 270 | int swap; |
| 271 | 271 | ||
| @@ -276,23 +276,21 @@ static struct tipc_subscription *subscr_subscribe(struct tipc_subscr *s, | |||
| 276 | if (s->filter & htohl(TIPC_SUB_CANCEL, swap)) { | 276 | if (s->filter & htohl(TIPC_SUB_CANCEL, swap)) { |
| 277 | s->filter &= ~htohl(TIPC_SUB_CANCEL, swap); | 277 | s->filter &= ~htohl(TIPC_SUB_CANCEL, swap); |
| 278 | subscr_cancel(s, subscriber); | 278 | subscr_cancel(s, subscriber); |
| 279 | return NULL; | 279 | return 0; |
| 280 | } | 280 | } |
| 281 | 281 | ||
| 282 | /* Refuse subscription if global limit exceeded */ | 282 | /* Refuse subscription if global limit exceeded */ |
| 283 | if (atomic_read(&subscription_count) >= TIPC_MAX_SUBSCRIPTIONS) { | 283 | if (atomic_read(&subscription_count) >= TIPC_MAX_SUBSCRIPTIONS) { |
| 284 | pr_warn("Subscription rejected, limit reached (%u)\n", | 284 | pr_warn("Subscription rejected, limit reached (%u)\n", |
| 285 | TIPC_MAX_SUBSCRIPTIONS); | 285 | TIPC_MAX_SUBSCRIPTIONS); |
| 286 | subscr_terminate(subscriber); | 286 | return -EINVAL; |
| 287 | return NULL; | ||
| 288 | } | 287 | } |
| 289 | 288 | ||
| 290 | /* Allocate subscription object */ | 289 | /* Allocate subscription object */ |
| 291 | sub = kmalloc(sizeof(*sub), GFP_ATOMIC); | 290 | sub = kmalloc(sizeof(*sub), GFP_ATOMIC); |
| 292 | if (!sub) { | 291 | if (!sub) { |
| 293 | pr_warn("Subscription rejected, no memory\n"); | 292 | pr_warn("Subscription rejected, no memory\n"); |
| 294 | subscr_terminate(subscriber); | 293 | return -ENOMEM; |
| 295 | return NULL; | ||
| 296 | } | 294 | } |
| 297 | 295 | ||
| 298 | /* Initialize subscription object */ | 296 | /* Initialize subscription object */ |
| @@ -306,8 +304,7 @@ static struct tipc_subscription *subscr_subscribe(struct tipc_subscr *s, | |||
| 306 | (sub->seq.lower > sub->seq.upper)) { | 304 | (sub->seq.lower > sub->seq.upper)) { |
| 307 | pr_warn("Subscription rejected, illegal request\n"); | 305 | pr_warn("Subscription rejected, illegal request\n"); |
| 308 | kfree(sub); | 306 | kfree(sub); |
| 309 | subscr_terminate(subscriber); | 307 | return -EINVAL; |
| 310 | return NULL; | ||
| 311 | } | 308 | } |
| 312 | INIT_LIST_HEAD(&sub->nameseq_list); | 309 | INIT_LIST_HEAD(&sub->nameseq_list); |
| 313 | list_add(&sub->subscription_list, &subscriber->subscription_list); | 310 | list_add(&sub->subscription_list, &subscriber->subscription_list); |
| @@ -320,8 +317,8 @@ static struct tipc_subscription *subscr_subscribe(struct tipc_subscr *s, | |||
| 320 | (Handler)subscr_timeout, (unsigned long)sub); | 317 | (Handler)subscr_timeout, (unsigned long)sub); |
| 321 | k_start_timer(&sub->timer, sub->timeout); | 318 | k_start_timer(&sub->timer, sub->timeout); |
| 322 | } | 319 | } |
| 323 | 320 | *sub_p = sub; | |
| 324 | return sub; | 321 | return 0; |
| 325 | } | 322 | } |
| 326 | 323 | ||
| 327 | /* Handle one termination request for the subscriber */ | 324 | /* Handle one termination request for the subscriber */ |
| @@ -335,10 +332,14 @@ static void subscr_conn_msg_event(int conid, struct sockaddr_tipc *addr, | |||
| 335 | void *usr_data, void *buf, size_t len) | 332 | void *usr_data, void *buf, size_t len) |
| 336 | { | 333 | { |
| 337 | struct tipc_subscriber *subscriber = usr_data; | 334 | struct tipc_subscriber *subscriber = usr_data; |
| 338 | struct tipc_subscription *sub; | 335 | struct tipc_subscription *sub = NULL; |
| 339 | 336 | ||
| 340 | spin_lock_bh(&subscriber->lock); | 337 | spin_lock_bh(&subscriber->lock); |
| 341 | sub = subscr_subscribe((struct tipc_subscr *)buf, subscriber); | 338 | if (subscr_subscribe((struct tipc_subscr *)buf, subscriber, &sub) < 0) { |
| 339 | spin_unlock_bh(&subscriber->lock); | ||
| 340 | subscr_terminate(subscriber); | ||
| 341 | return; | ||
| 342 | } | ||
| 342 | if (sub) | 343 | if (sub) |
| 343 | tipc_nametbl_subscribe(sub); | 344 | tipc_nametbl_subscribe(sub); |
| 344 | spin_unlock_bh(&subscriber->lock); | 345 | spin_unlock_bh(&subscriber->lock); |
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index c274179d60a2..2f7ddc3a59b4 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c | |||
| @@ -1221,7 +1221,7 @@ static int copy_from_user_sec_ctx(struct xfrm_policy *pol, struct nlattr **attrs | |||
| 1221 | return 0; | 1221 | return 0; |
| 1222 | 1222 | ||
| 1223 | uctx = nla_data(rt); | 1223 | uctx = nla_data(rt); |
| 1224 | return security_xfrm_policy_alloc(&pol->security, uctx); | 1224 | return security_xfrm_policy_alloc(&pol->security, uctx, GFP_KERNEL); |
| 1225 | } | 1225 | } |
| 1226 | 1226 | ||
| 1227 | static void copy_templates(struct xfrm_policy *xp, struct xfrm_user_tmpl *ut, | 1227 | static void copy_templates(struct xfrm_policy *xp, struct xfrm_user_tmpl *ut, |
| @@ -1626,7 +1626,7 @@ static int xfrm_get_policy(struct sk_buff *skb, struct nlmsghdr *nlh, | |||
| 1626 | if (rt) { | 1626 | if (rt) { |
| 1627 | struct xfrm_user_sec_ctx *uctx = nla_data(rt); | 1627 | struct xfrm_user_sec_ctx *uctx = nla_data(rt); |
| 1628 | 1628 | ||
| 1629 | err = security_xfrm_policy_alloc(&ctx, uctx); | 1629 | err = security_xfrm_policy_alloc(&ctx, uctx, GFP_KERNEL); |
| 1630 | if (err) | 1630 | if (err) |
| 1631 | return err; | 1631 | return err; |
| 1632 | } | 1632 | } |
| @@ -1928,7 +1928,7 @@ static int xfrm_add_pol_expire(struct sk_buff *skb, struct nlmsghdr *nlh, | |||
| 1928 | if (rt) { | 1928 | if (rt) { |
| 1929 | struct xfrm_user_sec_ctx *uctx = nla_data(rt); | 1929 | struct xfrm_user_sec_ctx *uctx = nla_data(rt); |
| 1930 | 1930 | ||
| 1931 | err = security_xfrm_policy_alloc(&ctx, uctx); | 1931 | err = security_xfrm_policy_alloc(&ctx, uctx, GFP_KERNEL); |
| 1932 | if (err) | 1932 | if (err) |
| 1933 | return err; | 1933 | return err; |
| 1934 | } | 1934 | } |
diff --git a/security/capability.c b/security/capability.c index 8b4f24ae4338..21e2b9cae685 100644 --- a/security/capability.c +++ b/security/capability.c | |||
| @@ -757,7 +757,8 @@ static void cap_skb_owned_by(struct sk_buff *skb, struct sock *sk) | |||
| 757 | 757 | ||
| 758 | #ifdef CONFIG_SECURITY_NETWORK_XFRM | 758 | #ifdef CONFIG_SECURITY_NETWORK_XFRM |
| 759 | static int cap_xfrm_policy_alloc_security(struct xfrm_sec_ctx **ctxp, | 759 | static int cap_xfrm_policy_alloc_security(struct xfrm_sec_ctx **ctxp, |
| 760 | struct xfrm_user_sec_ctx *sec_ctx) | 760 | struct xfrm_user_sec_ctx *sec_ctx, |
| 761 | gfp_t gfp) | ||
| 761 | { | 762 | { |
| 762 | return 0; | 763 | return 0; |
| 763 | } | 764 | } |
diff --git a/security/security.c b/security/security.c index 15b6928592ef..919cad93ac82 100644 --- a/security/security.c +++ b/security/security.c | |||
| @@ -1317,9 +1317,11 @@ void security_skb_owned_by(struct sk_buff *skb, struct sock *sk) | |||
| 1317 | 1317 | ||
| 1318 | #ifdef CONFIG_SECURITY_NETWORK_XFRM | 1318 | #ifdef CONFIG_SECURITY_NETWORK_XFRM |
| 1319 | 1319 | ||
| 1320 | int security_xfrm_policy_alloc(struct xfrm_sec_ctx **ctxp, struct xfrm_user_sec_ctx *sec_ctx) | 1320 | int security_xfrm_policy_alloc(struct xfrm_sec_ctx **ctxp, |
| 1321 | struct xfrm_user_sec_ctx *sec_ctx, | ||
| 1322 | gfp_t gfp) | ||
| 1321 | { | 1323 | { |
| 1322 | return security_ops->xfrm_policy_alloc_security(ctxp, sec_ctx); | 1324 | return security_ops->xfrm_policy_alloc_security(ctxp, sec_ctx, gfp); |
| 1323 | } | 1325 | } |
| 1324 | EXPORT_SYMBOL(security_xfrm_policy_alloc); | 1326 | EXPORT_SYMBOL(security_xfrm_policy_alloc); |
| 1325 | 1327 | ||
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 4b34847208cc..b332e2cc0954 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c | |||
| @@ -668,7 +668,7 @@ static int selinux_set_mnt_opts(struct super_block *sb, | |||
| 668 | if (flags[i] == SBLABEL_MNT) | 668 | if (flags[i] == SBLABEL_MNT) |
| 669 | continue; | 669 | continue; |
| 670 | rc = security_context_to_sid(mount_options[i], | 670 | rc = security_context_to_sid(mount_options[i], |
| 671 | strlen(mount_options[i]), &sid); | 671 | strlen(mount_options[i]), &sid, GFP_KERNEL); |
| 672 | if (rc) { | 672 | if (rc) { |
| 673 | printk(KERN_WARNING "SELinux: security_context_to_sid" | 673 | printk(KERN_WARNING "SELinux: security_context_to_sid" |
| 674 | "(%s) failed for (dev %s, type %s) errno=%d\n", | 674 | "(%s) failed for (dev %s, type %s) errno=%d\n", |
| @@ -2489,7 +2489,8 @@ static int selinux_sb_remount(struct super_block *sb, void *data) | |||
| 2489 | if (flags[i] == SBLABEL_MNT) | 2489 | if (flags[i] == SBLABEL_MNT) |
| 2490 | continue; | 2490 | continue; |
| 2491 | len = strlen(mount_options[i]); | 2491 | len = strlen(mount_options[i]); |
| 2492 | rc = security_context_to_sid(mount_options[i], len, &sid); | 2492 | rc = security_context_to_sid(mount_options[i], len, &sid, |
| 2493 | GFP_KERNEL); | ||
| 2493 | if (rc) { | 2494 | if (rc) { |
| 2494 | printk(KERN_WARNING "SELinux: security_context_to_sid" | 2495 | printk(KERN_WARNING "SELinux: security_context_to_sid" |
| 2495 | "(%s) failed for (dev %s, type %s) errno=%d\n", | 2496 | "(%s) failed for (dev %s, type %s) errno=%d\n", |
| @@ -2893,7 +2894,7 @@ static int selinux_inode_setxattr(struct dentry *dentry, const char *name, | |||
| 2893 | if (rc) | 2894 | if (rc) |
| 2894 | return rc; | 2895 | return rc; |
| 2895 | 2896 | ||
| 2896 | rc = security_context_to_sid(value, size, &newsid); | 2897 | rc = security_context_to_sid(value, size, &newsid, GFP_KERNEL); |
| 2897 | if (rc == -EINVAL) { | 2898 | if (rc == -EINVAL) { |
| 2898 | if (!capable(CAP_MAC_ADMIN)) { | 2899 | if (!capable(CAP_MAC_ADMIN)) { |
| 2899 | struct audit_buffer *ab; | 2900 | struct audit_buffer *ab; |
| @@ -3050,7 +3051,7 @@ static int selinux_inode_setsecurity(struct inode *inode, const char *name, | |||
| 3050 | if (!value || !size) | 3051 | if (!value || !size) |
| 3051 | return -EACCES; | 3052 | return -EACCES; |
| 3052 | 3053 | ||
| 3053 | rc = security_context_to_sid((void *)value, size, &newsid); | 3054 | rc = security_context_to_sid((void *)value, size, &newsid, GFP_KERNEL); |
| 3054 | if (rc) | 3055 | if (rc) |
| 3055 | return rc; | 3056 | return rc; |
| 3056 | 3057 | ||
| @@ -5529,7 +5530,7 @@ static int selinux_setprocattr(struct task_struct *p, | |||
| 5529 | str[size-1] = 0; | 5530 | str[size-1] = 0; |
| 5530 | size--; | 5531 | size--; |
| 5531 | } | 5532 | } |
| 5532 | error = security_context_to_sid(value, size, &sid); | 5533 | error = security_context_to_sid(value, size, &sid, GFP_KERNEL); |
| 5533 | if (error == -EINVAL && !strcmp(name, "fscreate")) { | 5534 | if (error == -EINVAL && !strcmp(name, "fscreate")) { |
| 5534 | if (!capable(CAP_MAC_ADMIN)) { | 5535 | if (!capable(CAP_MAC_ADMIN)) { |
| 5535 | struct audit_buffer *ab; | 5536 | struct audit_buffer *ab; |
| @@ -5638,7 +5639,7 @@ static int selinux_secid_to_secctx(u32 secid, char **secdata, u32 *seclen) | |||
| 5638 | 5639 | ||
| 5639 | static int selinux_secctx_to_secid(const char *secdata, u32 seclen, u32 *secid) | 5640 | static int selinux_secctx_to_secid(const char *secdata, u32 seclen, u32 *secid) |
| 5640 | { | 5641 | { |
| 5641 | return security_context_to_sid(secdata, seclen, secid); | 5642 | return security_context_to_sid(secdata, seclen, secid, GFP_KERNEL); |
| 5642 | } | 5643 | } |
| 5643 | 5644 | ||
| 5644 | static void selinux_release_secctx(char *secdata, u32 seclen) | 5645 | static void selinux_release_secctx(char *secdata, u32 seclen) |
diff --git a/security/selinux/include/security.h b/security/selinux/include/security.h index 8ed8daf7f1ee..ce7852cf526b 100644 --- a/security/selinux/include/security.h +++ b/security/selinux/include/security.h | |||
| @@ -134,7 +134,7 @@ int security_sid_to_context(u32 sid, char **scontext, | |||
| 134 | int security_sid_to_context_force(u32 sid, char **scontext, u32 *scontext_len); | 134 | int security_sid_to_context_force(u32 sid, char **scontext, u32 *scontext_len); |
| 135 | 135 | ||
| 136 | int security_context_to_sid(const char *scontext, u32 scontext_len, | 136 | int security_context_to_sid(const char *scontext, u32 scontext_len, |
| 137 | u32 *out_sid); | 137 | u32 *out_sid, gfp_t gfp); |
| 138 | 138 | ||
| 139 | int security_context_to_sid_default(const char *scontext, u32 scontext_len, | 139 | int security_context_to_sid_default(const char *scontext, u32 scontext_len, |
| 140 | u32 *out_sid, u32 def_sid, gfp_t gfp_flags); | 140 | u32 *out_sid, u32 def_sid, gfp_t gfp_flags); |
diff --git a/security/selinux/include/xfrm.h b/security/selinux/include/xfrm.h index 48c3cc94c168..9f0584710c85 100644 --- a/security/selinux/include/xfrm.h +++ b/security/selinux/include/xfrm.h | |||
| @@ -10,7 +10,8 @@ | |||
| 10 | #include <net/flow.h> | 10 | #include <net/flow.h> |
| 11 | 11 | ||
| 12 | int selinux_xfrm_policy_alloc(struct xfrm_sec_ctx **ctxp, | 12 | int selinux_xfrm_policy_alloc(struct xfrm_sec_ctx **ctxp, |
| 13 | struct xfrm_user_sec_ctx *uctx); | 13 | struct xfrm_user_sec_ctx *uctx, |
| 14 | gfp_t gfp); | ||
| 14 | int selinux_xfrm_policy_clone(struct xfrm_sec_ctx *old_ctx, | 15 | int selinux_xfrm_policy_clone(struct xfrm_sec_ctx *old_ctx, |
| 15 | struct xfrm_sec_ctx **new_ctxp); | 16 | struct xfrm_sec_ctx **new_ctxp); |
| 16 | void selinux_xfrm_policy_free(struct xfrm_sec_ctx *ctx); | 17 | void selinux_xfrm_policy_free(struct xfrm_sec_ctx *ctx); |
diff --git a/security/selinux/selinuxfs.c b/security/selinux/selinuxfs.c index 5122affe06a8..d60c0ee66387 100644 --- a/security/selinux/selinuxfs.c +++ b/security/selinux/selinuxfs.c | |||
| @@ -576,7 +576,7 @@ static ssize_t sel_write_context(struct file *file, char *buf, size_t size) | |||
| 576 | if (length) | 576 | if (length) |
| 577 | goto out; | 577 | goto out; |
| 578 | 578 | ||
| 579 | length = security_context_to_sid(buf, size, &sid); | 579 | length = security_context_to_sid(buf, size, &sid, GFP_KERNEL); |
| 580 | if (length) | 580 | if (length) |
| 581 | goto out; | 581 | goto out; |
| 582 | 582 | ||
| @@ -731,11 +731,13 @@ static ssize_t sel_write_access(struct file *file, char *buf, size_t size) | |||
| 731 | if (sscanf(buf, "%s %s %hu", scon, tcon, &tclass) != 3) | 731 | if (sscanf(buf, "%s %s %hu", scon, tcon, &tclass) != 3) |
| 732 | goto out; | 732 | goto out; |
| 733 | 733 | ||
| 734 | length = security_context_to_sid(scon, strlen(scon) + 1, &ssid); | 734 | length = security_context_to_sid(scon, strlen(scon) + 1, &ssid, |
| 735 | GFP_KERNEL); | ||
| 735 | if (length) | 736 | if (length) |
| 736 | goto out; | 737 | goto out; |
| 737 | 738 | ||
| 738 | length = security_context_to_sid(tcon, strlen(tcon) + 1, &tsid); | 739 | length = security_context_to_sid(tcon, strlen(tcon) + 1, &tsid, |
| 740 | GFP_KERNEL); | ||
| 739 | if (length) | 741 | if (length) |
| 740 | goto out; | 742 | goto out; |
| 741 | 743 | ||
| @@ -817,11 +819,13 @@ static ssize_t sel_write_create(struct file *file, char *buf, size_t size) | |||
| 817 | objname = namebuf; | 819 | objname = namebuf; |
| 818 | } | 820 | } |
| 819 | 821 | ||
| 820 | length = security_context_to_sid(scon, strlen(scon) + 1, &ssid); | 822 | length = security_context_to_sid(scon, strlen(scon) + 1, &ssid, |
| 823 | GFP_KERNEL); | ||
| 821 | if (length) | 824 | if (length) |
| 822 | goto out; | 825 | goto out; |
| 823 | 826 | ||
| 824 | length = security_context_to_sid(tcon, strlen(tcon) + 1, &tsid); | 827 | length = security_context_to_sid(tcon, strlen(tcon) + 1, &tsid, |
| 828 | GFP_KERNEL); | ||
| 825 | if (length) | 829 | if (length) |
| 826 | goto out; | 830 | goto out; |
| 827 | 831 | ||
| @@ -878,11 +882,13 @@ static ssize_t sel_write_relabel(struct file *file, char *buf, size_t size) | |||
| 878 | if (sscanf(buf, "%s %s %hu", scon, tcon, &tclass) != 3) | 882 | if (sscanf(buf, "%s %s %hu", scon, tcon, &tclass) != 3) |
| 879 | goto out; | 883 | goto out; |
| 880 | 884 | ||
| 881 | length = security_context_to_sid(scon, strlen(scon) + 1, &ssid); | 885 | length = security_context_to_sid(scon, strlen(scon) + 1, &ssid, |
| 886 | GFP_KERNEL); | ||
| 882 | if (length) | 887 | if (length) |
| 883 | goto out; | 888 | goto out; |
| 884 | 889 | ||
| 885 | length = security_context_to_sid(tcon, strlen(tcon) + 1, &tsid); | 890 | length = security_context_to_sid(tcon, strlen(tcon) + 1, &tsid, |
| 891 | GFP_KERNEL); | ||
| 886 | if (length) | 892 | if (length) |
| 887 | goto out; | 893 | goto out; |
| 888 | 894 | ||
| @@ -934,7 +940,7 @@ static ssize_t sel_write_user(struct file *file, char *buf, size_t size) | |||
| 934 | if (sscanf(buf, "%s %s", con, user) != 2) | 940 | if (sscanf(buf, "%s %s", con, user) != 2) |
| 935 | goto out; | 941 | goto out; |
| 936 | 942 | ||
| 937 | length = security_context_to_sid(con, strlen(con) + 1, &sid); | 943 | length = security_context_to_sid(con, strlen(con) + 1, &sid, GFP_KERNEL); |
| 938 | if (length) | 944 | if (length) |
| 939 | goto out; | 945 | goto out; |
| 940 | 946 | ||
| @@ -994,11 +1000,13 @@ static ssize_t sel_write_member(struct file *file, char *buf, size_t size) | |||
| 994 | if (sscanf(buf, "%s %s %hu", scon, tcon, &tclass) != 3) | 1000 | if (sscanf(buf, "%s %s %hu", scon, tcon, &tclass) != 3) |
| 995 | goto out; | 1001 | goto out; |
| 996 | 1002 | ||
| 997 | length = security_context_to_sid(scon, strlen(scon) + 1, &ssid); | 1003 | length = security_context_to_sid(scon, strlen(scon) + 1, &ssid, |
| 1004 | GFP_KERNEL); | ||
| 998 | if (length) | 1005 | if (length) |
| 999 | goto out; | 1006 | goto out; |
| 1000 | 1007 | ||
| 1001 | length = security_context_to_sid(tcon, strlen(tcon) + 1, &tsid); | 1008 | length = security_context_to_sid(tcon, strlen(tcon) + 1, &tsid, |
| 1009 | GFP_KERNEL); | ||
| 1002 | if (length) | 1010 | if (length) |
| 1003 | goto out; | 1011 | goto out; |
| 1004 | 1012 | ||
diff --git a/security/selinux/ss/services.c b/security/selinux/ss/services.c index 5d0144ee8ed6..4bca49414a40 100644 --- a/security/selinux/ss/services.c +++ b/security/selinux/ss/services.c | |||
| @@ -1289,16 +1289,18 @@ out: | |||
| 1289 | * @scontext: security context | 1289 | * @scontext: security context |
| 1290 | * @scontext_len: length in bytes | 1290 | * @scontext_len: length in bytes |
| 1291 | * @sid: security identifier, SID | 1291 | * @sid: security identifier, SID |
| 1292 | * @gfp: context for the allocation | ||
| 1292 | * | 1293 | * |
| 1293 | * Obtains a SID associated with the security context that | 1294 | * Obtains a SID associated with the security context that |
| 1294 | * has the string representation specified by @scontext. | 1295 | * has the string representation specified by @scontext. |
| 1295 | * Returns -%EINVAL if the context is invalid, -%ENOMEM if insufficient | 1296 | * Returns -%EINVAL if the context is invalid, -%ENOMEM if insufficient |
| 1296 | * memory is available, or 0 on success. | 1297 | * memory is available, or 0 on success. |
| 1297 | */ | 1298 | */ |
| 1298 | int security_context_to_sid(const char *scontext, u32 scontext_len, u32 *sid) | 1299 | int security_context_to_sid(const char *scontext, u32 scontext_len, u32 *sid, |
| 1300 | gfp_t gfp) | ||
| 1299 | { | 1301 | { |
| 1300 | return security_context_to_sid_core(scontext, scontext_len, | 1302 | return security_context_to_sid_core(scontext, scontext_len, |
| 1301 | sid, SECSID_NULL, GFP_KERNEL, 0); | 1303 | sid, SECSID_NULL, gfp, 0); |
| 1302 | } | 1304 | } |
| 1303 | 1305 | ||
| 1304 | /** | 1306 | /** |
diff --git a/security/selinux/xfrm.c b/security/selinux/xfrm.c index 0462cb3ff0a7..98b042630a9e 100644 --- a/security/selinux/xfrm.c +++ b/security/selinux/xfrm.c | |||
| @@ -78,7 +78,8 @@ static inline int selinux_authorizable_xfrm(struct xfrm_state *x) | |||
| 78 | * xfrm_user_sec_ctx context. | 78 | * xfrm_user_sec_ctx context. |
| 79 | */ | 79 | */ |
| 80 | static int selinux_xfrm_alloc_user(struct xfrm_sec_ctx **ctxp, | 80 | static int selinux_xfrm_alloc_user(struct xfrm_sec_ctx **ctxp, |
| 81 | struct xfrm_user_sec_ctx *uctx) | 81 | struct xfrm_user_sec_ctx *uctx, |
| 82 | gfp_t gfp) | ||
| 82 | { | 83 | { |
| 83 | int rc; | 84 | int rc; |
| 84 | const struct task_security_struct *tsec = current_security(); | 85 | const struct task_security_struct *tsec = current_security(); |
| @@ -94,7 +95,7 @@ static int selinux_xfrm_alloc_user(struct xfrm_sec_ctx **ctxp, | |||
| 94 | if (str_len >= PAGE_SIZE) | 95 | if (str_len >= PAGE_SIZE) |
| 95 | return -ENOMEM; | 96 | return -ENOMEM; |
| 96 | 97 | ||
| 97 | ctx = kmalloc(sizeof(*ctx) + str_len + 1, GFP_KERNEL); | 98 | ctx = kmalloc(sizeof(*ctx) + str_len + 1, gfp); |
| 98 | if (!ctx) | 99 | if (!ctx) |
| 99 | return -ENOMEM; | 100 | return -ENOMEM; |
| 100 | 101 | ||
| @@ -103,7 +104,7 @@ static int selinux_xfrm_alloc_user(struct xfrm_sec_ctx **ctxp, | |||
| 103 | ctx->ctx_len = str_len; | 104 | ctx->ctx_len = str_len; |
| 104 | memcpy(ctx->ctx_str, &uctx[1], str_len); | 105 | memcpy(ctx->ctx_str, &uctx[1], str_len); |
| 105 | ctx->ctx_str[str_len] = '\0'; | 106 | ctx->ctx_str[str_len] = '\0'; |
| 106 | rc = security_context_to_sid(ctx->ctx_str, str_len, &ctx->ctx_sid); | 107 | rc = security_context_to_sid(ctx->ctx_str, str_len, &ctx->ctx_sid, gfp); |
| 107 | if (rc) | 108 | if (rc) |
| 108 | goto err; | 109 | goto err; |
| 109 | 110 | ||
| @@ -282,9 +283,10 @@ int selinux_xfrm_skb_sid(struct sk_buff *skb, u32 *sid) | |||
| 282 | * LSM hook implementation that allocs and transfers uctx spec to xfrm_policy. | 283 | * LSM hook implementation that allocs and transfers uctx spec to xfrm_policy. |
| 283 | */ | 284 | */ |
| 284 | int selinux_xfrm_policy_alloc(struct xfrm_sec_ctx **ctxp, | 285 | int selinux_xfrm_policy_alloc(struct xfrm_sec_ctx **ctxp, |
| 285 | struct xfrm_user_sec_ctx *uctx) | 286 | struct xfrm_user_sec_ctx *uctx, |
| 287 | gfp_t gfp) | ||
| 286 | { | 288 | { |
| 287 | return selinux_xfrm_alloc_user(ctxp, uctx); | 289 | return selinux_xfrm_alloc_user(ctxp, uctx, gfp); |
| 288 | } | 290 | } |
| 289 | 291 | ||
| 290 | /* | 292 | /* |
| @@ -332,7 +334,7 @@ int selinux_xfrm_policy_delete(struct xfrm_sec_ctx *ctx) | |||
| 332 | int selinux_xfrm_state_alloc(struct xfrm_state *x, | 334 | int selinux_xfrm_state_alloc(struct xfrm_state *x, |
| 333 | struct xfrm_user_sec_ctx *uctx) | 335 | struct xfrm_user_sec_ctx *uctx) |
| 334 | { | 336 | { |
| 335 | return selinux_xfrm_alloc_user(&x->security, uctx); | 337 | return selinux_xfrm_alloc_user(&x->security, uctx, GFP_KERNEL); |
| 336 | } | 338 | } |
| 337 | 339 | ||
| 338 | /* | 340 | /* |
diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c index 7a20897d33db..7403f348ed14 100644 --- a/sound/core/compress_offload.c +++ b/sound/core/compress_offload.c | |||
| @@ -133,7 +133,7 @@ static int snd_compr_open(struct inode *inode, struct file *f) | |||
| 133 | kfree(data); | 133 | kfree(data); |
| 134 | } | 134 | } |
| 135 | snd_card_unref(compr->card); | 135 | snd_card_unref(compr->card); |
| 136 | return 0; | 136 | return ret; |
| 137 | } | 137 | } |
| 138 | 138 | ||
| 139 | static int snd_compr_free(struct inode *inode, struct file *f) | 139 | static int snd_compr_free(struct inode *inode, struct file *f) |
diff --git a/sound/pci/oxygen/xonar_dg.c b/sound/pci/oxygen/xonar_dg.c index ed6f199f8a38..4cf3200e988b 100644 --- a/sound/pci/oxygen/xonar_dg.c +++ b/sound/pci/oxygen/xonar_dg.c | |||
| @@ -238,11 +238,21 @@ void set_cs4245_adc_params(struct oxygen *chip, | |||
| 238 | cs4245_write_spi(chip, CS4245_MCLK_FREQ); | 238 | cs4245_write_spi(chip, CS4245_MCLK_FREQ); |
| 239 | } | 239 | } |
| 240 | 240 | ||
| 241 | static inline unsigned int shift_bits(unsigned int value, | ||
| 242 | unsigned int shift_from, | ||
| 243 | unsigned int shift_to, | ||
| 244 | unsigned int mask) | ||
| 245 | { | ||
| 246 | if (shift_from < shift_to) | ||
| 247 | return (value << (shift_to - shift_from)) & mask; | ||
| 248 | else | ||
| 249 | return (value >> (shift_from - shift_to)) & mask; | ||
| 250 | } | ||
| 251 | |||
| 241 | unsigned int adjust_dg_dac_routing(struct oxygen *chip, | 252 | unsigned int adjust_dg_dac_routing(struct oxygen *chip, |
| 242 | unsigned int play_routing) | 253 | unsigned int play_routing) |
| 243 | { | 254 | { |
| 244 | struct dg *data = chip->model_data; | 255 | struct dg *data = chip->model_data; |
| 245 | unsigned int routing = 0; | ||
| 246 | 256 | ||
| 247 | switch (data->output_sel) { | 257 | switch (data->output_sel) { |
| 248 | case PLAYBACK_DST_HP: | 258 | case PLAYBACK_DST_HP: |
| @@ -252,15 +262,23 @@ unsigned int adjust_dg_dac_routing(struct oxygen *chip, | |||
| 252 | OXYGEN_PLAY_MUTE67, OXYGEN_PLAY_MUTE_MASK); | 262 | OXYGEN_PLAY_MUTE67, OXYGEN_PLAY_MUTE_MASK); |
| 253 | break; | 263 | break; |
| 254 | case PLAYBACK_DST_MULTICH: | 264 | case PLAYBACK_DST_MULTICH: |
| 255 | routing = (0 << OXYGEN_PLAY_DAC0_SOURCE_SHIFT) | | ||
| 256 | (2 << OXYGEN_PLAY_DAC1_SOURCE_SHIFT) | | ||
| 257 | (1 << OXYGEN_PLAY_DAC2_SOURCE_SHIFT) | | ||
| 258 | (0 << OXYGEN_PLAY_DAC3_SOURCE_SHIFT); | ||
| 259 | oxygen_write8_masked(chip, OXYGEN_PLAY_ROUTING, | 265 | oxygen_write8_masked(chip, OXYGEN_PLAY_ROUTING, |
| 260 | OXYGEN_PLAY_MUTE01, OXYGEN_PLAY_MUTE_MASK); | 266 | OXYGEN_PLAY_MUTE01, OXYGEN_PLAY_MUTE_MASK); |
| 261 | break; | 267 | break; |
| 262 | } | 268 | } |
| 263 | return routing; | 269 | return (play_routing & OXYGEN_PLAY_DAC0_SOURCE_MASK) | |
| 270 | shift_bits(play_routing, | ||
| 271 | OXYGEN_PLAY_DAC2_SOURCE_SHIFT, | ||
| 272 | OXYGEN_PLAY_DAC1_SOURCE_SHIFT, | ||
| 273 | OXYGEN_PLAY_DAC1_SOURCE_MASK) | | ||
| 274 | shift_bits(play_routing, | ||
| 275 | OXYGEN_PLAY_DAC1_SOURCE_SHIFT, | ||
| 276 | OXYGEN_PLAY_DAC2_SOURCE_SHIFT, | ||
| 277 | OXYGEN_PLAY_DAC2_SOURCE_MASK) | | ||
| 278 | shift_bits(play_routing, | ||
| 279 | OXYGEN_PLAY_DAC0_SOURCE_SHIFT, | ||
| 280 | OXYGEN_PLAY_DAC3_SOURCE_SHIFT, | ||
| 281 | OXYGEN_PLAY_DAC3_SOURCE_MASK); | ||
| 264 | } | 282 | } |
| 265 | 283 | ||
| 266 | void dump_cs4245_registers(struct oxygen *chip, | 284 | void dump_cs4245_registers(struct oxygen *chip, |
diff --git a/tools/perf/bench/numa.c b/tools/perf/bench/numa.c index d4c83c60b9b2..97d86d828190 100644 --- a/tools/perf/bench/numa.c +++ b/tools/perf/bench/numa.c | |||
| @@ -1593,6 +1593,7 @@ static void init_params(struct params *p, const char *name, int argc, const char | |||
| 1593 | p->data_rand_walk = true; | 1593 | p->data_rand_walk = true; |
| 1594 | p->nr_loops = -1; | 1594 | p->nr_loops = -1; |
| 1595 | p->init_random = true; | 1595 | p->init_random = true; |
| 1596 | p->run_all = argc == 1; | ||
| 1596 | } | 1597 | } |
| 1597 | 1598 | ||
| 1598 | static int run_bench_numa(const char *name, const char **argv) | 1599 | static int run_bench_numa(const char *name, const char **argv) |
diff --git a/tools/perf/builtin-bench.c b/tools/perf/builtin-bench.c index e47f90cc7b98..8a987d252780 100644 --- a/tools/perf/builtin-bench.c +++ b/tools/perf/builtin-bench.c | |||
| @@ -76,7 +76,7 @@ static struct collection collections[] = { | |||
| 76 | 76 | ||
| 77 | /* Iterate over all benchmarks within a collection: */ | 77 | /* Iterate over all benchmarks within a collection: */ |
| 78 | #define for_each_bench(coll, bench) \ | 78 | #define for_each_bench(coll, bench) \ |
| 79 | for (bench = coll->benchmarks; bench->name; bench++) | 79 | for (bench = coll->benchmarks; bench && bench->name; bench++) |
| 80 | 80 | ||
| 81 | static void dump_benchmarks(struct collection *coll) | 81 | static void dump_benchmarks(struct collection *coll) |
| 82 | { | 82 | { |
