diff options
author | Arnd Bergmann <arnd@arndb.de> | 2012-03-16 16:25:17 -0400 |
---|---|---|
committer | Arnd Bergmann <arnd@arndb.de> | 2012-03-16 16:25:17 -0400 |
commit | a94c7b0a8f31a8bcf3b136d469f7eb6b6b57bb78 (patch) | |
tree | cac33ce0abaaeb56b6e08a396cb7ff4e3e3b8f61 | |
parent | d4ef467aea0fdcd5e75a4bbfaf97e579bbe532f3 (diff) | |
parent | 9652e8bd16e73f7a34cabf1ab114aaa5c97db660 (diff) |
Merge branch 'spear/dt' into next/dt2
* spear/dt:
ARM: SPEAr600: Add device-tree support to SPEAr600 boards
(update to v3.3-rc7)
Conflicts:
arch/arm/mach-spear6xx/spear6xx.c
arch/arm/mach-vexpress/Kconfig
The conflicts are between the previous contents of the next/dt2
branch and upstream changes from v3.3-rc7.
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
227 files changed, 1492 insertions, 904 deletions
diff --git a/Documentation/devicetree/bindings/arm/spear.txt b/Documentation/devicetree/bindings/arm/spear.txt new file mode 100644 index 000000000000..f8e54f092328 --- /dev/null +++ b/Documentation/devicetree/bindings/arm/spear.txt | |||
@@ -0,0 +1,8 @@ | |||
1 | ST SPEAr Platforms Device Tree Bindings | ||
2 | --------------------------------------- | ||
3 | |||
4 | Boards with the ST SPEAr600 SoC shall have the following properties: | ||
5 | |||
6 | Required root node property: | ||
7 | |||
8 | compatible = "st,spear600"; | ||
diff --git a/Documentation/devicetree/bindings/gpio/led.txt b/Documentation/devicetree/bindings/gpio/led.txt index 141087cf3107..fd2bd56e7195 100644 --- a/Documentation/devicetree/bindings/gpio/led.txt +++ b/Documentation/devicetree/bindings/gpio/led.txt | |||
@@ -7,9 +7,9 @@ Each LED is represented as a sub-node of the gpio-leds device. Each | |||
7 | node's name represents the name of the corresponding LED. | 7 | node's name represents the name of the corresponding LED. |
8 | 8 | ||
9 | LED sub-node properties: | 9 | LED sub-node properties: |
10 | - gpios : Should specify the LED's GPIO, see "Specifying GPIO information | 10 | - gpios : Should specify the LED's GPIO, see "gpios property" in |
11 | for devices" in Documentation/devicetree/booting-without-of.txt. Active | 11 | Documentation/devicetree/gpio.txt. Active low LEDs should be |
12 | low LEDs should be indicated using flags in the GPIO specifier. | 12 | indicated using flags in the GPIO specifier. |
13 | - label : (optional) The label for this LED. If omitted, the label is | 13 | - label : (optional) The label for this LED. If omitted, the label is |
14 | taken from the node name (excluding the unit address). | 14 | taken from the node name (excluding the unit address). |
15 | - linux,default-trigger : (optional) This parameter, if present, is a | 15 | - linux,default-trigger : (optional) This parameter, if present, is a |
diff --git a/Documentation/devicetree/bindings/vendor-prefixes.txt b/Documentation/devicetree/bindings/vendor-prefixes.txt index ecc6a6cd26c1..a20008ab319a 100644 --- a/Documentation/devicetree/bindings/vendor-prefixes.txt +++ b/Documentation/devicetree/bindings/vendor-prefixes.txt | |||
@@ -30,6 +30,7 @@ national National Semiconductor | |||
30 | nintendo Nintendo | 30 | nintendo Nintendo |
31 | nvidia NVIDIA | 31 | nvidia NVIDIA |
32 | nxp NXP Semiconductors | 32 | nxp NXP Semiconductors |
33 | picochip Picochip Ltd | ||
33 | powervr Imagination Technologies | 34 | powervr Imagination Technologies |
34 | qcom Qualcomm, Inc. | 35 | qcom Qualcomm, Inc. |
35 | ramtron Ramtron International | 36 | ramtron Ramtron International |
diff --git a/Documentation/hwmon/jc42 b/Documentation/hwmon/jc42 index a22ecf48f255..52729a756c1b 100644 --- a/Documentation/hwmon/jc42 +++ b/Documentation/hwmon/jc42 | |||
@@ -7,21 +7,29 @@ Supported chips: | |||
7 | Addresses scanned: I2C 0x18 - 0x1f | 7 | Addresses scanned: I2C 0x18 - 0x1f |
8 | Datasheets: | 8 | Datasheets: |
9 | http://www.analog.com/static/imported-files/data_sheets/ADT7408.pdf | 9 | http://www.analog.com/static/imported-files/data_sheets/ADT7408.pdf |
10 | * IDT TSE2002B3, TS3000B3 | 10 | * Atmel AT30TS00 |
11 | Prefix: 'tse2002b3', 'ts3000b3' | 11 | Prefix: 'at30ts00' |
12 | Addresses scanned: I2C 0x18 - 0x1f | 12 | Addresses scanned: I2C 0x18 - 0x1f |
13 | Datasheets: | 13 | Datasheets: |
14 | http://www.idt.com/products/getdoc.cfm?docid=18715691 | 14 | http://www.atmel.com/Images/doc8585.pdf |
15 | http://www.idt.com/products/getdoc.cfm?docid=18715692 | 15 | * IDT TSE2002B3, TSE2002GB2, TS3000B3, TS3000GB2 |
16 | Prefix: 'tse2002', 'ts3000' | ||
17 | Addresses scanned: I2C 0x18 - 0x1f | ||
18 | Datasheets: | ||
19 | http://www.idt.com/sites/default/files/documents/IDT_TSE2002B3C_DST_20100512_120303152056.pdf | ||
20 | http://www.idt.com/sites/default/files/documents/IDT_TSE2002GB2A1_DST_20111107_120303145914.pdf | ||
21 | http://www.idt.com/sites/default/files/documents/IDT_TS3000B3A_DST_20101129_120303152013.pdf | ||
22 | http://www.idt.com/sites/default/files/documents/IDT_TS3000GB2A1_DST_20111104_120303151012.pdf | ||
16 | * Maxim MAX6604 | 23 | * Maxim MAX6604 |
17 | Prefix: 'max6604' | 24 | Prefix: 'max6604' |
18 | Addresses scanned: I2C 0x18 - 0x1f | 25 | Addresses scanned: I2C 0x18 - 0x1f |
19 | Datasheets: | 26 | Datasheets: |
20 | http://datasheets.maxim-ic.com/en/ds/MAX6604.pdf | 27 | http://datasheets.maxim-ic.com/en/ds/MAX6604.pdf |
21 | * Microchip MCP9805, MCP98242, MCP98243, MCP9843 | 28 | * Microchip MCP9804, MCP9805, MCP98242, MCP98243, MCP9843 |
22 | Prefixes: 'mcp9805', 'mcp98242', 'mcp98243', 'mcp9843' | 29 | Prefixes: 'mcp9804', 'mcp9805', 'mcp98242', 'mcp98243', 'mcp9843' |
23 | Addresses scanned: I2C 0x18 - 0x1f | 30 | Addresses scanned: I2C 0x18 - 0x1f |
24 | Datasheets: | 31 | Datasheets: |
32 | http://ww1.microchip.com/downloads/en/DeviceDoc/22203C.pdf | ||
25 | http://ww1.microchip.com/downloads/en/DeviceDoc/21977b.pdf | 33 | http://ww1.microchip.com/downloads/en/DeviceDoc/21977b.pdf |
26 | http://ww1.microchip.com/downloads/en/DeviceDoc/21996a.pdf | 34 | http://ww1.microchip.com/downloads/en/DeviceDoc/21996a.pdf |
27 | http://ww1.microchip.com/downloads/en/DeviceDoc/22153c.pdf | 35 | http://ww1.microchip.com/downloads/en/DeviceDoc/22153c.pdf |
@@ -48,6 +56,12 @@ Supported chips: | |||
48 | Datasheets: | 56 | Datasheets: |
49 | http://www.st.com/stonline/products/literature/ds/13447/stts424.pdf | 57 | http://www.st.com/stonline/products/literature/ds/13447/stts424.pdf |
50 | http://www.st.com/stonline/products/literature/ds/13448/stts424e02.pdf | 58 | http://www.st.com/stonline/products/literature/ds/13448/stts424e02.pdf |
59 | * ST Microelectronics STTS2002, STTS3000 | ||
60 | Prefix: 'stts2002', 'stts3000' | ||
61 | Addresses scanned: I2C 0x18 - 0x1f | ||
62 | Datasheets: | ||
63 | http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATASHEET/CD00225278.pdf | ||
64 | http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATA_BRIEF/CD00270920.pdf | ||
51 | * JEDEC JC 42.4 compliant temperature sensor chips | 65 | * JEDEC JC 42.4 compliant temperature sensor chips |
52 | Prefix: 'jc42' | 66 | Prefix: 'jc42' |
53 | Addresses scanned: I2C 0x18 - 0x1f | 67 | Addresses scanned: I2C 0x18 - 0x1f |
diff --git a/Documentation/input/alps.txt b/Documentation/input/alps.txt index f274c28b5103..2f95308251d4 100644 --- a/Documentation/input/alps.txt +++ b/Documentation/input/alps.txt | |||
@@ -13,7 +13,8 @@ Detection | |||
13 | 13 | ||
14 | All ALPS touchpads should respond to the "E6 report" command sequence: | 14 | All ALPS touchpads should respond to the "E6 report" command sequence: |
15 | E8-E6-E6-E6-E9. An ALPS touchpad should respond with either 00-00-0A or | 15 | E8-E6-E6-E6-E9. An ALPS touchpad should respond with either 00-00-0A or |
16 | 00-00-64. | 16 | 00-00-64 if no buttons are pressed. The bits 0-2 of the first byte will be 1s |
17 | if some buttons are pressed. | ||
17 | 18 | ||
18 | If the E6 report is successful, the touchpad model is identified using the "E7 | 19 | If the E6 report is successful, the touchpad model is identified using the "E7 |
19 | report" sequence: E8-E7-E7-E7-E9. The response is the model signature and is | 20 | report" sequence: E8-E7-E7-E7-E9. The response is the model signature and is |
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index 033d4e69b43b..d99fd9c0ec0e 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
@@ -2211,6 +2211,12 @@ bytes respectively. Such letter suffixes can also be entirely omitted. | |||
2211 | 2211 | ||
2212 | default: off. | 2212 | default: off. |
2213 | 2213 | ||
2214 | printk.always_kmsg_dump= | ||
2215 | Trigger kmsg_dump for cases other than kernel oops or | ||
2216 | panics | ||
2217 | Format: <bool> (1/Y/y=enable, 0/N/n=disable) | ||
2218 | default: disabled | ||
2219 | |||
2214 | printk.time= Show timing data prefixed to each printk message line | 2220 | printk.time= Show timing data prefixed to each printk message line |
2215 | Format: <bool> (1/Y/y=enable, 0/N/n=disable) | 2221 | Format: <bool> (1/Y/y=enable, 0/N/n=disable) |
2216 | 2222 | ||
diff --git a/MAINTAINERS b/MAINTAINERS index f096b0d8e973..24c94d68a39b 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -962,7 +962,7 @@ F: drivers/tty/serial/msm_serial.c | |||
962 | F: drivers/platform/msm/ | 962 | F: drivers/platform/msm/ |
963 | F: drivers/*/pm8???-* | 963 | F: drivers/*/pm8???-* |
964 | F: include/linux/mfd/pm8xxx/ | 964 | F: include/linux/mfd/pm8xxx/ |
965 | T: git git://codeaurora.org/quic/kernel/davidb/linux-msm.git | 965 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/davidb/linux-msm.git |
966 | S: Maintained | 966 | S: Maintained |
967 | 967 | ||
968 | ARM/TOSA MACHINE SUPPORT | 968 | ARM/TOSA MACHINE SUPPORT |
@@ -1310,7 +1310,7 @@ F: drivers/atm/ | |||
1310 | F: include/linux/atm* | 1310 | F: include/linux/atm* |
1311 | 1311 | ||
1312 | ATMEL AT91 MCI DRIVER | 1312 | ATMEL AT91 MCI DRIVER |
1313 | M: Nicolas Ferre <nicolas.ferre@atmel.com> | 1313 | M: Ludovic Desroches <ludovic.desroches@atmel.com> |
1314 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 1314 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
1315 | W: http://www.atmel.com/products/AT91/ | 1315 | W: http://www.atmel.com/products/AT91/ |
1316 | W: http://www.at91.com/ | 1316 | W: http://www.at91.com/ |
@@ -1318,7 +1318,7 @@ S: Maintained | |||
1318 | F: drivers/mmc/host/at91_mci.c | 1318 | F: drivers/mmc/host/at91_mci.c |
1319 | 1319 | ||
1320 | ATMEL AT91 / AT32 MCI DRIVER | 1320 | ATMEL AT91 / AT32 MCI DRIVER |
1321 | M: Nicolas Ferre <nicolas.ferre@atmel.com> | 1321 | M: Ludovic Desroches <ludovic.desroches@atmel.com> |
1322 | S: Maintained | 1322 | S: Maintained |
1323 | F: drivers/mmc/host/atmel-mci.c | 1323 | F: drivers/mmc/host/atmel-mci.c |
1324 | F: drivers/mmc/host/atmel-mci-regs.h | 1324 | F: drivers/mmc/host/atmel-mci-regs.h |
@@ -1,7 +1,7 @@ | |||
1 | VERSION = 3 | 1 | VERSION = 3 |
2 | PATCHLEVEL = 3 | 2 | PATCHLEVEL = 3 |
3 | SUBLEVEL = 0 | 3 | SUBLEVEL = 0 |
4 | EXTRAVERSION = -rc6 | 4 | EXTRAVERSION = -rc7 |
5 | NAME = Saber-toothed Squirrel | 5 | NAME = Saber-toothed Squirrel |
6 | 6 | ||
7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
diff --git a/arch/alpha/include/asm/futex.h b/arch/alpha/include/asm/futex.h index e8a761aee088..f939794363ac 100644 --- a/arch/alpha/include/asm/futex.h +++ b/arch/alpha/include/asm/futex.h | |||
@@ -108,7 +108,7 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, | |||
108 | " lda $31,3b-2b(%0)\n" | 108 | " lda $31,3b-2b(%0)\n" |
109 | " .previous\n" | 109 | " .previous\n" |
110 | : "+r"(ret), "=&r"(prev), "=&r"(cmp) | 110 | : "+r"(ret), "=&r"(prev), "=&r"(cmp) |
111 | : "r"(uaddr), "r"((long)oldval), "r"(newval) | 111 | : "r"(uaddr), "r"((long)(int)oldval), "r"(newval) |
112 | : "memory"); | 112 | : "memory"); |
113 | 113 | ||
114 | *uval = prev; | 114 | *uval = prev; |
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index cabd8f556a1f..b0e65d6f1193 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -1281,7 +1281,7 @@ config ARM_ERRATA_743622 | |||
1281 | depends on CPU_V7 | 1281 | depends on CPU_V7 |
1282 | help | 1282 | help |
1283 | This option enables the workaround for the 743622 Cortex-A9 | 1283 | This option enables the workaround for the 743622 Cortex-A9 |
1284 | (r2p0..r2p2) erratum. Under very rare conditions, a faulty | 1284 | (r2p*) erratum. Under very rare conditions, a faulty |
1285 | optimisation in the Cortex-A9 Store Buffer may lead to data | 1285 | optimisation in the Cortex-A9 Store Buffer may lead to data |
1286 | corruption. This workaround sets a specific bit in the diagnostic | 1286 | corruption. This workaround sets a specific bit in the diagnostic |
1287 | register of the Cortex-A9 which disables the Store Buffer | 1287 | register of the Cortex-A9 which disables the Store Buffer |
diff --git a/arch/arm/boot/.gitignore b/arch/arm/boot/.gitignore index ce1c5ff746e7..3c79f85975aa 100644 --- a/arch/arm/boot/.gitignore +++ b/arch/arm/boot/.gitignore | |||
@@ -3,3 +3,4 @@ zImage | |||
3 | xipImage | 3 | xipImage |
4 | bootpImage | 4 | bootpImage |
5 | uImage | 5 | uImage |
6 | *.dtb | ||
diff --git a/arch/arm/boot/dts/spear600-evb.dts b/arch/arm/boot/dts/spear600-evb.dts new file mode 100644 index 000000000000..636292e18c90 --- /dev/null +++ b/arch/arm/boot/dts/spear600-evb.dts | |||
@@ -0,0 +1,47 @@ | |||
1 | /* | ||
2 | * Copyright 2012 Stefan Roese <sr@denx.de> | ||
3 | * | ||
4 | * The code contained herein is licensed under the GNU General Public | ||
5 | * License. You may obtain a copy of the GNU General Public License | ||
6 | * Version 2 or later at the following locations: | ||
7 | * | ||
8 | * http://www.opensource.org/licenses/gpl-license.html | ||
9 | * http://www.gnu.org/copyleft/gpl.html | ||
10 | */ | ||
11 | |||
12 | /dts-v1/; | ||
13 | /include/ "spear600.dtsi" | ||
14 | |||
15 | / { | ||
16 | model = "ST SPEAr600 Evaluation Board"; | ||
17 | compatible = "st,spear600-evb", "st,spear600"; | ||
18 | #address-cells = <1>; | ||
19 | #size-cells = <1>; | ||
20 | |||
21 | memory { | ||
22 | device_type = "memory"; | ||
23 | reg = <0 0x10000000>; | ||
24 | }; | ||
25 | |||
26 | ahb { | ||
27 | gmac: ethernet@e0800000 { | ||
28 | phy-mode = "gmii"; | ||
29 | status = "okay"; | ||
30 | }; | ||
31 | |||
32 | apb { | ||
33 | serial@d0000000 { | ||
34 | status = "okay"; | ||
35 | }; | ||
36 | |||
37 | serial@d0080000 { | ||
38 | status = "okay"; | ||
39 | }; | ||
40 | |||
41 | i2c@d0200000 { | ||
42 | clock-frequency = <400000>; | ||
43 | status = "okay"; | ||
44 | }; | ||
45 | }; | ||
46 | }; | ||
47 | }; | ||
diff --git a/arch/arm/boot/dts/spear600.dtsi b/arch/arm/boot/dts/spear600.dtsi new file mode 100644 index 000000000000..ebe0885a2b98 --- /dev/null +++ b/arch/arm/boot/dts/spear600.dtsi | |||
@@ -0,0 +1,174 @@ | |||
1 | /* | ||
2 | * Copyright 2012 Stefan Roese <sr@denx.de> | ||
3 | * | ||
4 | * The code contained herein is licensed under the GNU General Public | ||
5 | * License. You may obtain a copy of the GNU General Public License | ||
6 | * Version 2 or later at the following locations: | ||
7 | * | ||
8 | * http://www.opensource.org/licenses/gpl-license.html | ||
9 | * http://www.gnu.org/copyleft/gpl.html | ||
10 | */ | ||
11 | |||
12 | /include/ "skeleton.dtsi" | ||
13 | |||
14 | / { | ||
15 | compatible = "st,spear600"; | ||
16 | |||
17 | cpus { | ||
18 | cpu@0 { | ||
19 | compatible = "arm,arm926ejs"; | ||
20 | }; | ||
21 | }; | ||
22 | |||
23 | memory { | ||
24 | device_type = "memory"; | ||
25 | reg = <0 0x40000000>; | ||
26 | }; | ||
27 | |||
28 | ahb { | ||
29 | #address-cells = <1>; | ||
30 | #size-cells = <1>; | ||
31 | compatible = "simple-bus"; | ||
32 | ranges = <0xd0000000 0xd0000000 0x30000000>; | ||
33 | |||
34 | vic0: interrupt-controller@f1100000 { | ||
35 | compatible = "arm,pl190-vic"; | ||
36 | interrupt-controller; | ||
37 | reg = <0xf1100000 0x1000>; | ||
38 | #interrupt-cells = <1>; | ||
39 | }; | ||
40 | |||
41 | vic1: interrupt-controller@f1000000 { | ||
42 | compatible = "arm,pl190-vic"; | ||
43 | interrupt-controller; | ||
44 | reg = <0xf1000000 0x1000>; | ||
45 | #interrupt-cells = <1>; | ||
46 | }; | ||
47 | |||
48 | gmac: ethernet@e0800000 { | ||
49 | compatible = "st,spear600-gmac"; | ||
50 | reg = <0xe0800000 0x8000>; | ||
51 | interrupt-parent = <&vic1>; | ||
52 | interrupts = <24 23>; | ||
53 | interrupt-names = "macirq", "eth_wake_irq"; | ||
54 | status = "disabled"; | ||
55 | }; | ||
56 | |||
57 | fsmc: flash@d1800000 { | ||
58 | compatible = "st,spear600-fsmc-nand"; | ||
59 | #address-cells = <1>; | ||
60 | #size-cells = <1>; | ||
61 | reg = <0xd1800000 0x1000 /* FSMC Register */ | ||
62 | 0xd2000000 0x4000>; /* NAND Base */ | ||
63 | reg-names = "fsmc_regs", "nand_data"; | ||
64 | st,ale-off = <0x20000>; | ||
65 | st,cle-off = <0x10000>; | ||
66 | status = "disabled"; | ||
67 | }; | ||
68 | |||
69 | smi: flash@fc000000 { | ||
70 | compatible = "st,spear600-smi"; | ||
71 | #address-cells = <1>; | ||
72 | #size-cells = <1>; | ||
73 | reg = <0xfc000000 0x1000>; | ||
74 | interrupt-parent = <&vic1>; | ||
75 | interrupts = <12>; | ||
76 | status = "disabled"; | ||
77 | }; | ||
78 | |||
79 | ehci@e1800000 { | ||
80 | compatible = "st,spear600-ehci", "usb-ehci"; | ||
81 | reg = <0xe1800000 0x1000>; | ||
82 | interrupt-parent = <&vic1>; | ||
83 | interrupts = <27>; | ||
84 | status = "disabled"; | ||
85 | }; | ||
86 | |||
87 | ehci@e2000000 { | ||
88 | compatible = "st,spear600-ehci", "usb-ehci"; | ||
89 | reg = <0xe2000000 0x1000>; | ||
90 | interrupt-parent = <&vic1>; | ||
91 | interrupts = <29>; | ||
92 | status = "disabled"; | ||
93 | }; | ||
94 | |||
95 | ohci@e1900000 { | ||
96 | compatible = "st,spear600-ohci", "usb-ohci"; | ||
97 | reg = <0xe1900000 0x1000>; | ||
98 | interrupt-parent = <&vic1>; | ||
99 | interrupts = <26>; | ||
100 | status = "disabled"; | ||
101 | }; | ||
102 | |||
103 | ohci@e2100000 { | ||
104 | compatible = "st,spear600-ohci", "usb-ohci"; | ||
105 | reg = <0xe2100000 0x1000>; | ||
106 | interrupt-parent = <&vic1>; | ||
107 | interrupts = <28>; | ||
108 | status = "disabled"; | ||
109 | }; | ||
110 | |||
111 | apb { | ||
112 | #address-cells = <1>; | ||
113 | #size-cells = <1>; | ||
114 | compatible = "simple-bus"; | ||
115 | ranges = <0xd0000000 0xd0000000 0x30000000>; | ||
116 | |||
117 | serial@d0000000 { | ||
118 | compatible = "arm,pl011", "arm,primecell"; | ||
119 | reg = <0xd0000000 0x1000>; | ||
120 | interrupt-parent = <&vic0>; | ||
121 | interrupts = <24>; | ||
122 | status = "disabled"; | ||
123 | }; | ||
124 | |||
125 | serial@d0080000 { | ||
126 | compatible = "arm,pl011", "arm,primecell"; | ||
127 | reg = <0xd0080000 0x1000>; | ||
128 | interrupt-parent = <&vic0>; | ||
129 | interrupts = <25>; | ||
130 | status = "disabled"; | ||
131 | }; | ||
132 | |||
133 | /* local/cpu GPIO */ | ||
134 | gpio0: gpio@f0100000 { | ||
135 | #gpio-cells = <2>; | ||
136 | compatible = "arm,pl061", "arm,primecell"; | ||
137 | gpio-controller; | ||
138 | reg = <0xf0100000 0x1000>; | ||
139 | interrupt-parent = <&vic0>; | ||
140 | interrupts = <18>; | ||
141 | }; | ||
142 | |||
143 | /* basic GPIO */ | ||
144 | gpio1: gpio@fc980000 { | ||
145 | #gpio-cells = <2>; | ||
146 | compatible = "arm,pl061", "arm,primecell"; | ||
147 | gpio-controller; | ||
148 | reg = <0xfc980000 0x1000>; | ||
149 | interrupt-parent = <&vic1>; | ||
150 | interrupts = <19>; | ||
151 | }; | ||
152 | |||
153 | /* appl GPIO */ | ||
154 | gpio2: gpio@d8100000 { | ||
155 | #gpio-cells = <2>; | ||
156 | compatible = "arm,pl061", "arm,primecell"; | ||
157 | gpio-controller; | ||
158 | reg = <0xd8100000 0x1000>; | ||
159 | interrupt-parent = <&vic1>; | ||
160 | interrupts = <4>; | ||
161 | }; | ||
162 | |||
163 | i2c@d0200000 { | ||
164 | #address-cells = <1>; | ||
165 | #size-cells = <0>; | ||
166 | compatible = "snps,designware-i2c"; | ||
167 | reg = <0xd0200000 0x1000>; | ||
168 | interrupt-parent = <&vic0>; | ||
169 | interrupts = <28>; | ||
170 | status = "disabled"; | ||
171 | }; | ||
172 | }; | ||
173 | }; | ||
174 | }; | ||
diff --git a/arch/arm/include/asm/pmu.h b/arch/arm/include/asm/pmu.h index b5a5be2536c1..90114faa9f3c 100644 --- a/arch/arm/include/asm/pmu.h +++ b/arch/arm/include/asm/pmu.h | |||
@@ -134,7 +134,7 @@ int __init armpmu_register(struct arm_pmu *armpmu, char *name, int type); | |||
134 | 134 | ||
135 | u64 armpmu_event_update(struct perf_event *event, | 135 | u64 armpmu_event_update(struct perf_event *event, |
136 | struct hw_perf_event *hwc, | 136 | struct hw_perf_event *hwc, |
137 | int idx, int overflow); | 137 | int idx); |
138 | 138 | ||
139 | int armpmu_event_set_period(struct perf_event *event, | 139 | int armpmu_event_set_period(struct perf_event *event, |
140 | struct hw_perf_event *hwc, | 140 | struct hw_perf_event *hwc, |
diff --git a/arch/arm/kernel/ecard.c b/arch/arm/kernel/ecard.c index 4dd0edab6a65..1651d4950744 100644 --- a/arch/arm/kernel/ecard.c +++ b/arch/arm/kernel/ecard.c | |||
@@ -242,6 +242,7 @@ static void ecard_init_pgtables(struct mm_struct *mm) | |||
242 | 242 | ||
243 | memcpy(dst_pgd, src_pgd, sizeof(pgd_t) * (EASI_SIZE / PGDIR_SIZE)); | 243 | memcpy(dst_pgd, src_pgd, sizeof(pgd_t) * (EASI_SIZE / PGDIR_SIZE)); |
244 | 244 | ||
245 | vma.vm_flags = VM_EXEC; | ||
245 | vma.vm_mm = mm; | 246 | vma.vm_mm = mm; |
246 | 247 | ||
247 | flush_tlb_range(&vma, IO_START, IO_START + IO_SIZE); | 248 | flush_tlb_range(&vma, IO_START, IO_START + IO_SIZE); |
diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c index 5bb91bf3d47f..b2abfa18f137 100644 --- a/arch/arm/kernel/perf_event.c +++ b/arch/arm/kernel/perf_event.c | |||
@@ -180,7 +180,7 @@ armpmu_event_set_period(struct perf_event *event, | |||
180 | u64 | 180 | u64 |
181 | armpmu_event_update(struct perf_event *event, | 181 | armpmu_event_update(struct perf_event *event, |
182 | struct hw_perf_event *hwc, | 182 | struct hw_perf_event *hwc, |
183 | int idx, int overflow) | 183 | int idx) |
184 | { | 184 | { |
185 | struct arm_pmu *armpmu = to_arm_pmu(event->pmu); | 185 | struct arm_pmu *armpmu = to_arm_pmu(event->pmu); |
186 | u64 delta, prev_raw_count, new_raw_count; | 186 | u64 delta, prev_raw_count, new_raw_count; |
@@ -193,13 +193,7 @@ again: | |||
193 | new_raw_count) != prev_raw_count) | 193 | new_raw_count) != prev_raw_count) |
194 | goto again; | 194 | goto again; |
195 | 195 | ||
196 | new_raw_count &= armpmu->max_period; | 196 | delta = (new_raw_count - prev_raw_count) & armpmu->max_period; |
197 | prev_raw_count &= armpmu->max_period; | ||
198 | |||
199 | if (overflow) | ||
200 | delta = armpmu->max_period - prev_raw_count + new_raw_count + 1; | ||
201 | else | ||
202 | delta = new_raw_count - prev_raw_count; | ||
203 | 197 | ||
204 | local64_add(delta, &event->count); | 198 | local64_add(delta, &event->count); |
205 | local64_sub(delta, &hwc->period_left); | 199 | local64_sub(delta, &hwc->period_left); |
@@ -216,7 +210,7 @@ armpmu_read(struct perf_event *event) | |||
216 | if (hwc->idx < 0) | 210 | if (hwc->idx < 0) |
217 | return; | 211 | return; |
218 | 212 | ||
219 | armpmu_event_update(event, hwc, hwc->idx, 0); | 213 | armpmu_event_update(event, hwc, hwc->idx); |
220 | } | 214 | } |
221 | 215 | ||
222 | static void | 216 | static void |
@@ -232,7 +226,7 @@ armpmu_stop(struct perf_event *event, int flags) | |||
232 | if (!(hwc->state & PERF_HES_STOPPED)) { | 226 | if (!(hwc->state & PERF_HES_STOPPED)) { |
233 | armpmu->disable(hwc, hwc->idx); | 227 | armpmu->disable(hwc, hwc->idx); |
234 | barrier(); /* why? */ | 228 | barrier(); /* why? */ |
235 | armpmu_event_update(event, hwc, hwc->idx, 0); | 229 | armpmu_event_update(event, hwc, hwc->idx); |
236 | hwc->state |= PERF_HES_STOPPED | PERF_HES_UPTODATE; | 230 | hwc->state |= PERF_HES_STOPPED | PERF_HES_UPTODATE; |
237 | } | 231 | } |
238 | } | 232 | } |
@@ -518,7 +512,13 @@ __hw_perf_event_init(struct perf_event *event) | |||
518 | hwc->config_base |= (unsigned long)mapping; | 512 | hwc->config_base |= (unsigned long)mapping; |
519 | 513 | ||
520 | if (!hwc->sample_period) { | 514 | if (!hwc->sample_period) { |
521 | hwc->sample_period = armpmu->max_period; | 515 | /* |
516 | * For non-sampling runs, limit the sample_period to half | ||
517 | * of the counter width. That way, the new counter value | ||
518 | * is far less likely to overtake the previous one unless | ||
519 | * you have some serious IRQ latency issues. | ||
520 | */ | ||
521 | hwc->sample_period = armpmu->max_period >> 1; | ||
522 | hwc->last_period = hwc->sample_period; | 522 | hwc->last_period = hwc->sample_period; |
523 | local64_set(&hwc->period_left, hwc->sample_period); | 523 | local64_set(&hwc->period_left, hwc->sample_period); |
524 | } | 524 | } |
@@ -680,6 +680,28 @@ static void __init cpu_pmu_init(struct arm_pmu *armpmu) | |||
680 | } | 680 | } |
681 | 681 | ||
682 | /* | 682 | /* |
683 | * PMU hardware loses all context when a CPU goes offline. | ||
684 | * When a CPU is hotplugged back in, since some hardware registers are | ||
685 | * UNKNOWN at reset, the PMU must be explicitly reset to avoid reading | ||
686 | * junk values out of them. | ||
687 | */ | ||
688 | static int __cpuinit pmu_cpu_notify(struct notifier_block *b, | ||
689 | unsigned long action, void *hcpu) | ||
690 | { | ||
691 | if ((action & ~CPU_TASKS_FROZEN) != CPU_STARTING) | ||
692 | return NOTIFY_DONE; | ||
693 | |||
694 | if (cpu_pmu && cpu_pmu->reset) | ||
695 | cpu_pmu->reset(NULL); | ||
696 | |||
697 | return NOTIFY_OK; | ||
698 | } | ||
699 | |||
700 | static struct notifier_block __cpuinitdata pmu_cpu_notifier = { | ||
701 | .notifier_call = pmu_cpu_notify, | ||
702 | }; | ||
703 | |||
704 | /* | ||
683 | * CPU PMU identification and registration. | 705 | * CPU PMU identification and registration. |
684 | */ | 706 | */ |
685 | static int __init | 707 | static int __init |
@@ -730,6 +752,7 @@ init_hw_perf_events(void) | |||
730 | pr_info("enabled with %s PMU driver, %d counters available\n", | 752 | pr_info("enabled with %s PMU driver, %d counters available\n", |
731 | cpu_pmu->name, cpu_pmu->num_events); | 753 | cpu_pmu->name, cpu_pmu->num_events); |
732 | cpu_pmu_init(cpu_pmu); | 754 | cpu_pmu_init(cpu_pmu); |
755 | register_cpu_notifier(&pmu_cpu_notifier); | ||
733 | armpmu_register(cpu_pmu, "cpu", PERF_TYPE_RAW); | 756 | armpmu_register(cpu_pmu, "cpu", PERF_TYPE_RAW); |
734 | } else { | 757 | } else { |
735 | pr_info("no hardware support available\n"); | 758 | pr_info("no hardware support available\n"); |
diff --git a/arch/arm/kernel/perf_event_v6.c b/arch/arm/kernel/perf_event_v6.c index 533be9930ec2..b78af0cc6ef3 100644 --- a/arch/arm/kernel/perf_event_v6.c +++ b/arch/arm/kernel/perf_event_v6.c | |||
@@ -467,23 +467,6 @@ armv6pmu_enable_event(struct hw_perf_event *hwc, | |||
467 | raw_spin_unlock_irqrestore(&events->pmu_lock, flags); | 467 | raw_spin_unlock_irqrestore(&events->pmu_lock, flags); |
468 | } | 468 | } |
469 | 469 | ||
470 | static int counter_is_active(unsigned long pmcr, int idx) | ||
471 | { | ||
472 | unsigned long mask = 0; | ||
473 | if (idx == ARMV6_CYCLE_COUNTER) | ||
474 | mask = ARMV6_PMCR_CCOUNT_IEN; | ||
475 | else if (idx == ARMV6_COUNTER0) | ||
476 | mask = ARMV6_PMCR_COUNT0_IEN; | ||
477 | else if (idx == ARMV6_COUNTER1) | ||
478 | mask = ARMV6_PMCR_COUNT1_IEN; | ||
479 | |||
480 | if (mask) | ||
481 | return pmcr & mask; | ||
482 | |||
483 | WARN_ONCE(1, "invalid counter number (%d)\n", idx); | ||
484 | return 0; | ||
485 | } | ||
486 | |||
487 | static irqreturn_t | 470 | static irqreturn_t |
488 | armv6pmu_handle_irq(int irq_num, | 471 | armv6pmu_handle_irq(int irq_num, |
489 | void *dev) | 472 | void *dev) |
@@ -513,7 +496,8 @@ armv6pmu_handle_irq(int irq_num, | |||
513 | struct perf_event *event = cpuc->events[idx]; | 496 | struct perf_event *event = cpuc->events[idx]; |
514 | struct hw_perf_event *hwc; | 497 | struct hw_perf_event *hwc; |
515 | 498 | ||
516 | if (!counter_is_active(pmcr, idx)) | 499 | /* Ignore if we don't have an event. */ |
500 | if (!event) | ||
517 | continue; | 501 | continue; |
518 | 502 | ||
519 | /* | 503 | /* |
@@ -524,7 +508,7 @@ armv6pmu_handle_irq(int irq_num, | |||
524 | continue; | 508 | continue; |
525 | 509 | ||
526 | hwc = &event->hw; | 510 | hwc = &event->hw; |
527 | armpmu_event_update(event, hwc, idx, 1); | 511 | armpmu_event_update(event, hwc, idx); |
528 | data.period = event->hw.last_period; | 512 | data.period = event->hw.last_period; |
529 | if (!armpmu_event_set_period(event, hwc, idx)) | 513 | if (!armpmu_event_set_period(event, hwc, idx)) |
530 | continue; | 514 | continue; |
diff --git a/arch/arm/kernel/perf_event_v7.c b/arch/arm/kernel/perf_event_v7.c index 6933244c68f9..4d7095af2ab3 100644 --- a/arch/arm/kernel/perf_event_v7.c +++ b/arch/arm/kernel/perf_event_v7.c | |||
@@ -809,6 +809,11 @@ static inline int armv7_pmnc_disable_intens(int idx) | |||
809 | 809 | ||
810 | counter = ARMV7_IDX_TO_COUNTER(idx); | 810 | counter = ARMV7_IDX_TO_COUNTER(idx); |
811 | asm volatile("mcr p15, 0, %0, c9, c14, 2" : : "r" (BIT(counter))); | 811 | asm volatile("mcr p15, 0, %0, c9, c14, 2" : : "r" (BIT(counter))); |
812 | isb(); | ||
813 | /* Clear the overflow flag in case an interrupt is pending. */ | ||
814 | asm volatile("mcr p15, 0, %0, c9, c12, 3" : : "r" (BIT(counter))); | ||
815 | isb(); | ||
816 | |||
812 | return idx; | 817 | return idx; |
813 | } | 818 | } |
814 | 819 | ||
@@ -955,6 +960,10 @@ static irqreturn_t armv7pmu_handle_irq(int irq_num, void *dev) | |||
955 | struct perf_event *event = cpuc->events[idx]; | 960 | struct perf_event *event = cpuc->events[idx]; |
956 | struct hw_perf_event *hwc; | 961 | struct hw_perf_event *hwc; |
957 | 962 | ||
963 | /* Ignore if we don't have an event. */ | ||
964 | if (!event) | ||
965 | continue; | ||
966 | |||
958 | /* | 967 | /* |
959 | * We have a single interrupt for all counters. Check that | 968 | * We have a single interrupt for all counters. Check that |
960 | * each counter has overflowed before we process it. | 969 | * each counter has overflowed before we process it. |
@@ -963,7 +972,7 @@ static irqreturn_t armv7pmu_handle_irq(int irq_num, void *dev) | |||
963 | continue; | 972 | continue; |
964 | 973 | ||
965 | hwc = &event->hw; | 974 | hwc = &event->hw; |
966 | armpmu_event_update(event, hwc, idx, 1); | 975 | armpmu_event_update(event, hwc, idx); |
967 | data.period = event->hw.last_period; | 976 | data.period = event->hw.last_period; |
968 | if (!armpmu_event_set_period(event, hwc, idx)) | 977 | if (!armpmu_event_set_period(event, hwc, idx)) |
969 | continue; | 978 | continue; |
diff --git a/arch/arm/kernel/perf_event_xscale.c b/arch/arm/kernel/perf_event_xscale.c index 3b99d8269829..71a21e6712f5 100644 --- a/arch/arm/kernel/perf_event_xscale.c +++ b/arch/arm/kernel/perf_event_xscale.c | |||
@@ -255,11 +255,14 @@ xscale1pmu_handle_irq(int irq_num, void *dev) | |||
255 | struct perf_event *event = cpuc->events[idx]; | 255 | struct perf_event *event = cpuc->events[idx]; |
256 | struct hw_perf_event *hwc; | 256 | struct hw_perf_event *hwc; |
257 | 257 | ||
258 | if (!event) | ||
259 | continue; | ||
260 | |||
258 | if (!xscale1_pmnc_counter_has_overflowed(pmnc, idx)) | 261 | if (!xscale1_pmnc_counter_has_overflowed(pmnc, idx)) |
259 | continue; | 262 | continue; |
260 | 263 | ||
261 | hwc = &event->hw; | 264 | hwc = &event->hw; |
262 | armpmu_event_update(event, hwc, idx, 1); | 265 | armpmu_event_update(event, hwc, idx); |
263 | data.period = event->hw.last_period; | 266 | data.period = event->hw.last_period; |
264 | if (!armpmu_event_set_period(event, hwc, idx)) | 267 | if (!armpmu_event_set_period(event, hwc, idx)) |
265 | continue; | 268 | continue; |
@@ -592,11 +595,14 @@ xscale2pmu_handle_irq(int irq_num, void *dev) | |||
592 | struct perf_event *event = cpuc->events[idx]; | 595 | struct perf_event *event = cpuc->events[idx]; |
593 | struct hw_perf_event *hwc; | 596 | struct hw_perf_event *hwc; |
594 | 597 | ||
595 | if (!xscale2_pmnc_counter_has_overflowed(pmnc, idx)) | 598 | if (!event) |
599 | continue; | ||
600 | |||
601 | if (!xscale2_pmnc_counter_has_overflowed(of_flags, idx)) | ||
596 | continue; | 602 | continue; |
597 | 603 | ||
598 | hwc = &event->hw; | 604 | hwc = &event->hw; |
599 | armpmu_event_update(event, hwc, idx, 1); | 605 | armpmu_event_update(event, hwc, idx); |
600 | data.period = event->hw.last_period; | 606 | data.period = event->hw.last_period; |
601 | if (!armpmu_event_set_period(event, hwc, idx)) | 607 | if (!armpmu_event_set_period(event, hwc, idx)) |
602 | continue; | 608 | continue; |
@@ -663,7 +669,7 @@ xscale2pmu_enable_event(struct hw_perf_event *hwc, int idx) | |||
663 | static void | 669 | static void |
664 | xscale2pmu_disable_event(struct hw_perf_event *hwc, int idx) | 670 | xscale2pmu_disable_event(struct hw_perf_event *hwc, int idx) |
665 | { | 671 | { |
666 | unsigned long flags, ien, evtsel; | 672 | unsigned long flags, ien, evtsel, of_flags; |
667 | struct pmu_hw_events *events = cpu_pmu->get_hw_events(); | 673 | struct pmu_hw_events *events = cpu_pmu->get_hw_events(); |
668 | 674 | ||
669 | ien = xscale2pmu_read_int_enable(); | 675 | ien = xscale2pmu_read_int_enable(); |
@@ -672,26 +678,31 @@ xscale2pmu_disable_event(struct hw_perf_event *hwc, int idx) | |||
672 | switch (idx) { | 678 | switch (idx) { |
673 | case XSCALE_CYCLE_COUNTER: | 679 | case XSCALE_CYCLE_COUNTER: |
674 | ien &= ~XSCALE2_CCOUNT_INT_EN; | 680 | ien &= ~XSCALE2_CCOUNT_INT_EN; |
681 | of_flags = XSCALE2_CCOUNT_OVERFLOW; | ||
675 | break; | 682 | break; |
676 | case XSCALE_COUNTER0: | 683 | case XSCALE_COUNTER0: |
677 | ien &= ~XSCALE2_COUNT0_INT_EN; | 684 | ien &= ~XSCALE2_COUNT0_INT_EN; |
678 | evtsel &= ~XSCALE2_COUNT0_EVT_MASK; | 685 | evtsel &= ~XSCALE2_COUNT0_EVT_MASK; |
679 | evtsel |= XSCALE_PERFCTR_UNUSED << XSCALE2_COUNT0_EVT_SHFT; | 686 | evtsel |= XSCALE_PERFCTR_UNUSED << XSCALE2_COUNT0_EVT_SHFT; |
687 | of_flags = XSCALE2_COUNT0_OVERFLOW; | ||
680 | break; | 688 | break; |
681 | case XSCALE_COUNTER1: | 689 | case XSCALE_COUNTER1: |
682 | ien &= ~XSCALE2_COUNT1_INT_EN; | 690 | ien &= ~XSCALE2_COUNT1_INT_EN; |
683 | evtsel &= ~XSCALE2_COUNT1_EVT_MASK; | 691 | evtsel &= ~XSCALE2_COUNT1_EVT_MASK; |
684 | evtsel |= XSCALE_PERFCTR_UNUSED << XSCALE2_COUNT1_EVT_SHFT; | 692 | evtsel |= XSCALE_PERFCTR_UNUSED << XSCALE2_COUNT1_EVT_SHFT; |
693 | of_flags = XSCALE2_COUNT1_OVERFLOW; | ||
685 | break; | 694 | break; |
686 | case XSCALE_COUNTER2: | 695 | case XSCALE_COUNTER2: |
687 | ien &= ~XSCALE2_COUNT2_INT_EN; | 696 | ien &= ~XSCALE2_COUNT2_INT_EN; |
688 | evtsel &= ~XSCALE2_COUNT2_EVT_MASK; | 697 | evtsel &= ~XSCALE2_COUNT2_EVT_MASK; |
689 | evtsel |= XSCALE_PERFCTR_UNUSED << XSCALE2_COUNT2_EVT_SHFT; | 698 | evtsel |= XSCALE_PERFCTR_UNUSED << XSCALE2_COUNT2_EVT_SHFT; |
699 | of_flags = XSCALE2_COUNT2_OVERFLOW; | ||
690 | break; | 700 | break; |
691 | case XSCALE_COUNTER3: | 701 | case XSCALE_COUNTER3: |
692 | ien &= ~XSCALE2_COUNT3_INT_EN; | 702 | ien &= ~XSCALE2_COUNT3_INT_EN; |
693 | evtsel &= ~XSCALE2_COUNT3_EVT_MASK; | 703 | evtsel &= ~XSCALE2_COUNT3_EVT_MASK; |
694 | evtsel |= XSCALE_PERFCTR_UNUSED << XSCALE2_COUNT3_EVT_SHFT; | 704 | evtsel |= XSCALE_PERFCTR_UNUSED << XSCALE2_COUNT3_EVT_SHFT; |
705 | of_flags = XSCALE2_COUNT3_OVERFLOW; | ||
695 | break; | 706 | break; |
696 | default: | 707 | default: |
697 | WARN_ONCE(1, "invalid counter number (%d)\n", idx); | 708 | WARN_ONCE(1, "invalid counter number (%d)\n", idx); |
@@ -701,6 +712,7 @@ xscale2pmu_disable_event(struct hw_perf_event *hwc, int idx) | |||
701 | raw_spin_lock_irqsave(&events->pmu_lock, flags); | 712 | raw_spin_lock_irqsave(&events->pmu_lock, flags); |
702 | xscale2pmu_write_event_select(evtsel); | 713 | xscale2pmu_write_event_select(evtsel); |
703 | xscale2pmu_write_int_enable(ien); | 714 | xscale2pmu_write_int_enable(ien); |
715 | xscale2pmu_write_overflow_flags(of_flags); | ||
704 | raw_spin_unlock_irqrestore(&events->pmu_lock, flags); | 716 | raw_spin_unlock_irqrestore(&events->pmu_lock, flags); |
705 | } | 717 | } |
706 | 718 | ||
diff --git a/arch/arm/mach-ep93xx/vision_ep9307.c b/arch/arm/mach-ep93xx/vision_ep9307.c index d5fb44f16d31..d67d0b4feb6f 100644 --- a/arch/arm/mach-ep93xx/vision_ep9307.c +++ b/arch/arm/mach-ep93xx/vision_ep9307.c | |||
@@ -34,6 +34,7 @@ | |||
34 | #include <mach/ep93xx_spi.h> | 34 | #include <mach/ep93xx_spi.h> |
35 | #include <mach/gpio-ep93xx.h> | 35 | #include <mach/gpio-ep93xx.h> |
36 | 36 | ||
37 | #include <asm/hardware/vic.h> | ||
37 | #include <asm/mach-types.h> | 38 | #include <asm/mach-types.h> |
38 | #include <asm/mach/map.h> | 39 | #include <asm/mach/map.h> |
39 | #include <asm/mach/arch.h> | 40 | #include <asm/mach/arch.h> |
@@ -361,6 +362,7 @@ MACHINE_START(VISION_EP9307, "Vision Engraving Systems EP9307") | |||
361 | .atag_offset = 0x100, | 362 | .atag_offset = 0x100, |
362 | .map_io = vision_map_io, | 363 | .map_io = vision_map_io, |
363 | .init_irq = ep93xx_init_irq, | 364 | .init_irq = ep93xx_init_irq, |
365 | .handle_irq = vic_handle_irq, | ||
364 | .timer = &ep93xx_timer, | 366 | .timer = &ep93xx_timer, |
365 | .init_machine = vision_init_machine, | 367 | .init_machine = vision_init_machine, |
366 | .restart = ep93xx_restart, | 368 | .restart = ep93xx_restart, |
diff --git a/arch/arm/mach-exynos/mach-universal_c210.c b/arch/arm/mach-exynos/mach-universal_c210.c index 0fc65ffde8ff..38939956c34f 100644 --- a/arch/arm/mach-exynos/mach-universal_c210.c +++ b/arch/arm/mach-exynos/mach-universal_c210.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/i2c.h> | 13 | #include <linux/i2c.h> |
14 | #include <linux/gpio_keys.h> | 14 | #include <linux/gpio_keys.h> |
15 | #include <linux/gpio.h> | 15 | #include <linux/gpio.h> |
16 | #include <linux/interrupt.h> | ||
16 | #include <linux/fb.h> | 17 | #include <linux/fb.h> |
17 | #include <linux/mfd/max8998.h> | 18 | #include <linux/mfd/max8998.h> |
18 | #include <linux/regulator/machine.h> | 19 | #include <linux/regulator/machine.h> |
@@ -595,6 +596,7 @@ static struct mxt_platform_data qt602240_platform_data = { | |||
595 | .threshold = 0x28, | 596 | .threshold = 0x28, |
596 | .voltage = 2800000, /* 2.8V */ | 597 | .voltage = 2800000, /* 2.8V */ |
597 | .orient = MXT_DIAGONAL, | 598 | .orient = MXT_DIAGONAL, |
599 | .irqflags = IRQF_TRIGGER_FALLING, | ||
598 | }; | 600 | }; |
599 | 601 | ||
600 | static struct i2c_board_info i2c3_devs[] __initdata = { | 602 | static struct i2c_board_info i2c3_devs[] __initdata = { |
diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c index 6c5826605eae..719ee423abe2 100644 --- a/arch/arm/mach-omap2/id.c +++ b/arch/arm/mach-omap2/id.c | |||
@@ -343,6 +343,7 @@ static void __init omap3_check_revision(const char **cpu_rev) | |||
343 | case 0xb944: | 343 | case 0xb944: |
344 | omap_revision = AM335X_REV_ES1_0; | 344 | omap_revision = AM335X_REV_ES1_0; |
345 | *cpu_rev = "1.0"; | 345 | *cpu_rev = "1.0"; |
346 | break; | ||
346 | case 0xb8f2: | 347 | case 0xb8f2: |
347 | switch (rev) { | 348 | switch (rev) { |
348 | case 0: | 349 | case 0: |
diff --git a/arch/arm/mach-omap2/mailbox.c b/arch/arm/mach-omap2/mailbox.c index 2cc1aa004b94..415a6f1cf419 100644 --- a/arch/arm/mach-omap2/mailbox.c +++ b/arch/arm/mach-omap2/mailbox.c | |||
@@ -420,8 +420,7 @@ static void __exit omap2_mbox_exit(void) | |||
420 | platform_driver_unregister(&omap2_mbox_driver); | 420 | platform_driver_unregister(&omap2_mbox_driver); |
421 | } | 421 | } |
422 | 422 | ||
423 | /* must be ready before omap3isp is probed */ | 423 | module_init(omap2_mbox_init); |
424 | subsys_initcall(omap2_mbox_init); | ||
425 | module_exit(omap2_mbox_exit); | 424 | module_exit(omap2_mbox_exit); |
426 | 425 | ||
427 | MODULE_LICENSE("GPL v2"); | 426 | MODULE_LICENSE("GPL v2"); |
diff --git a/arch/arm/mach-omap2/omap-iommu.c b/arch/arm/mach-omap2/omap-iommu.c index b8822048e409..ac49384d0285 100644 --- a/arch/arm/mach-omap2/omap-iommu.c +++ b/arch/arm/mach-omap2/omap-iommu.c | |||
@@ -150,7 +150,8 @@ err_out: | |||
150 | platform_device_put(omap_iommu_pdev[i]); | 150 | platform_device_put(omap_iommu_pdev[i]); |
151 | return err; | 151 | return err; |
152 | } | 152 | } |
153 | module_init(omap_iommu_init); | 153 | /* must be ready before omap3isp is probed */ |
154 | subsys_initcall(omap_iommu_init); | ||
154 | 155 | ||
155 | static void __exit omap_iommu_exit(void) | 156 | static void __exit omap_iommu_exit(void) |
156 | { | 157 | { |
diff --git a/arch/arm/mach-omap2/omap4-common.c b/arch/arm/mach-omap2/omap4-common.c index ebc595091312..70de277f5c15 100644 --- a/arch/arm/mach-omap2/omap4-common.c +++ b/arch/arm/mach-omap2/omap4-common.c | |||
@@ -31,6 +31,7 @@ | |||
31 | 31 | ||
32 | #include "common.h" | 32 | #include "common.h" |
33 | #include "omap4-sar-layout.h" | 33 | #include "omap4-sar-layout.h" |
34 | #include <linux/export.h> | ||
34 | 35 | ||
35 | #ifdef CONFIG_CACHE_L2X0 | 36 | #ifdef CONFIG_CACHE_L2X0 |
36 | static void __iomem *l2cache_base; | 37 | static void __iomem *l2cache_base; |
@@ -55,6 +56,7 @@ void omap_bus_sync(void) | |||
55 | isb(); | 56 | isb(); |
56 | } | 57 | } |
57 | } | 58 | } |
59 | EXPORT_SYMBOL(omap_bus_sync); | ||
58 | 60 | ||
59 | /* Steal one page physical memory for barrier implementation */ | 61 | /* Steal one page physical memory for barrier implementation */ |
60 | int __init omap_barrier_reserve_memblock(void) | 62 | int __init omap_barrier_reserve_memblock(void) |
diff --git a/arch/arm/mach-omap2/twl-common.c b/arch/arm/mach-omap2/twl-common.c index 10b20c652e5d..4b57757bf9d1 100644 --- a/arch/arm/mach-omap2/twl-common.c +++ b/arch/arm/mach-omap2/twl-common.c | |||
@@ -270,7 +270,6 @@ static struct regulator_init_data omap4_vusb_idata = { | |||
270 | .constraints = { | 270 | .constraints = { |
271 | .min_uV = 3300000, | 271 | .min_uV = 3300000, |
272 | .max_uV = 3300000, | 272 | .max_uV = 3300000, |
273 | .apply_uV = true, | ||
274 | .valid_modes_mask = REGULATOR_MODE_NORMAL | 273 | .valid_modes_mask = REGULATOR_MODE_NORMAL |
275 | | REGULATOR_MODE_STANDBY, | 274 | | REGULATOR_MODE_STANDBY, |
276 | .valid_ops_mask = REGULATOR_CHANGE_MODE | 275 | .valid_ops_mask = REGULATOR_CHANGE_MODE |
diff --git a/arch/arm/mach-pxa/generic.h b/arch/arm/mach-pxa/generic.h index 0d729e6619df..42d5cca66257 100644 --- a/arch/arm/mach-pxa/generic.h +++ b/arch/arm/mach-pxa/generic.h | |||
@@ -49,7 +49,6 @@ extern unsigned pxa3xx_get_clk_frequency_khz(int); | |||
49 | #endif | 49 | #endif |
50 | 50 | ||
51 | extern struct syscore_ops pxa_irq_syscore_ops; | 51 | extern struct syscore_ops pxa_irq_syscore_ops; |
52 | extern struct syscore_ops pxa_gpio_syscore_ops; | ||
53 | extern struct syscore_ops pxa2xx_mfp_syscore_ops; | 52 | extern struct syscore_ops pxa2xx_mfp_syscore_ops; |
54 | extern struct syscore_ops pxa3xx_mfp_syscore_ops; | 53 | extern struct syscore_ops pxa3xx_mfp_syscore_ops; |
55 | 54 | ||
diff --git a/arch/arm/mach-pxa/mfp-pxa2xx.c b/arch/arm/mach-pxa/mfp-pxa2xx.c index f14775536b83..29b62afc6f7c 100644 --- a/arch/arm/mach-pxa/mfp-pxa2xx.c +++ b/arch/arm/mach-pxa/mfp-pxa2xx.c | |||
@@ -226,6 +226,12 @@ static void __init pxa25x_mfp_init(void) | |||
226 | { | 226 | { |
227 | int i; | 227 | int i; |
228 | 228 | ||
229 | /* running before pxa_gpio_probe() */ | ||
230 | #ifdef CONFIG_CPU_PXA26x | ||
231 | pxa_last_gpio = 89; | ||
232 | #else | ||
233 | pxa_last_gpio = 84; | ||
234 | #endif | ||
229 | for (i = 0; i <= pxa_last_gpio; i++) | 235 | for (i = 0; i <= pxa_last_gpio; i++) |
230 | gpio_desc[i].valid = 1; | 236 | gpio_desc[i].valid = 1; |
231 | 237 | ||
@@ -295,6 +301,7 @@ static void __init pxa27x_mfp_init(void) | |||
295 | { | 301 | { |
296 | int i, gpio; | 302 | int i, gpio; |
297 | 303 | ||
304 | pxa_last_gpio = 120; /* running before pxa_gpio_probe() */ | ||
298 | for (i = 0; i <= pxa_last_gpio; i++) { | 305 | for (i = 0; i <= pxa_last_gpio; i++) { |
299 | /* skip GPIO2, 5, 6, 7, 8, they are not | 306 | /* skip GPIO2, 5, 6, 7, 8, they are not |
300 | * valid pins allow configuration | 307 | * valid pins allow configuration |
diff --git a/arch/arm/mach-pxa/pxa25x.c b/arch/arm/mach-pxa/pxa25x.c index 00d6eacab8e4..3352b37b60cf 100644 --- a/arch/arm/mach-pxa/pxa25x.c +++ b/arch/arm/mach-pxa/pxa25x.c | |||
@@ -208,6 +208,7 @@ static struct clk_lookup pxa25x_clkregs[] = { | |||
208 | INIT_CLKREG(&clk_pxa25x_gpio11, NULL, "GPIO11_CLK"), | 208 | INIT_CLKREG(&clk_pxa25x_gpio11, NULL, "GPIO11_CLK"), |
209 | INIT_CLKREG(&clk_pxa25x_gpio12, NULL, "GPIO12_CLK"), | 209 | INIT_CLKREG(&clk_pxa25x_gpio12, NULL, "GPIO12_CLK"), |
210 | INIT_CLKREG(&clk_pxa25x_mem, "pxa2xx-pcmcia", NULL), | 210 | INIT_CLKREG(&clk_pxa25x_mem, "pxa2xx-pcmcia", NULL), |
211 | INIT_CLKREG(&clk_dummy, "pxa-gpio", NULL), | ||
211 | }; | 212 | }; |
212 | 213 | ||
213 | static struct clk_lookup pxa25x_hwuart_clkreg = | 214 | static struct clk_lookup pxa25x_hwuart_clkreg = |
@@ -367,7 +368,6 @@ static int __init pxa25x_init(void) | |||
367 | 368 | ||
368 | register_syscore_ops(&pxa_irq_syscore_ops); | 369 | register_syscore_ops(&pxa_irq_syscore_ops); |
369 | register_syscore_ops(&pxa2xx_mfp_syscore_ops); | 370 | register_syscore_ops(&pxa2xx_mfp_syscore_ops); |
370 | register_syscore_ops(&pxa_gpio_syscore_ops); | ||
371 | register_syscore_ops(&pxa2xx_clock_syscore_ops); | 371 | register_syscore_ops(&pxa2xx_clock_syscore_ops); |
372 | 372 | ||
373 | ret = platform_add_devices(pxa25x_devices, | 373 | ret = platform_add_devices(pxa25x_devices, |
diff --git a/arch/arm/mach-pxa/pxa27x.c b/arch/arm/mach-pxa/pxa27x.c index c1673b3441d4..6bce78edce7a 100644 --- a/arch/arm/mach-pxa/pxa27x.c +++ b/arch/arm/mach-pxa/pxa27x.c | |||
@@ -229,6 +229,7 @@ static struct clk_lookup pxa27x_clkregs[] = { | |||
229 | INIT_CLKREG(&clk_pxa27x_im, NULL, "IMCLK"), | 229 | INIT_CLKREG(&clk_pxa27x_im, NULL, "IMCLK"), |
230 | INIT_CLKREG(&clk_pxa27x_memc, NULL, "MEMCLK"), | 230 | INIT_CLKREG(&clk_pxa27x_memc, NULL, "MEMCLK"), |
231 | INIT_CLKREG(&clk_pxa27x_mem, "pxa2xx-pcmcia", NULL), | 231 | INIT_CLKREG(&clk_pxa27x_mem, "pxa2xx-pcmcia", NULL), |
232 | INIT_CLKREG(&clk_dummy, "pxa-gpio", NULL), | ||
232 | }; | 233 | }; |
233 | 234 | ||
234 | #ifdef CONFIG_PM | 235 | #ifdef CONFIG_PM |
@@ -455,7 +456,6 @@ static int __init pxa27x_init(void) | |||
455 | 456 | ||
456 | register_syscore_ops(&pxa_irq_syscore_ops); | 457 | register_syscore_ops(&pxa_irq_syscore_ops); |
457 | register_syscore_ops(&pxa2xx_mfp_syscore_ops); | 458 | register_syscore_ops(&pxa2xx_mfp_syscore_ops); |
458 | register_syscore_ops(&pxa_gpio_syscore_ops); | ||
459 | register_syscore_ops(&pxa2xx_clock_syscore_ops); | 459 | register_syscore_ops(&pxa2xx_clock_syscore_ops); |
460 | 460 | ||
461 | ret = platform_add_devices(devices, ARRAY_SIZE(devices)); | 461 | ret = platform_add_devices(devices, ARRAY_SIZE(devices)); |
diff --git a/arch/arm/mach-pxa/pxa3xx.c b/arch/arm/mach-pxa/pxa3xx.c index 4f402afa6609..3918a672238e 100644 --- a/arch/arm/mach-pxa/pxa3xx.c +++ b/arch/arm/mach-pxa/pxa3xx.c | |||
@@ -462,7 +462,6 @@ static int __init pxa3xx_init(void) | |||
462 | 462 | ||
463 | register_syscore_ops(&pxa_irq_syscore_ops); | 463 | register_syscore_ops(&pxa_irq_syscore_ops); |
464 | register_syscore_ops(&pxa3xx_mfp_syscore_ops); | 464 | register_syscore_ops(&pxa3xx_mfp_syscore_ops); |
465 | register_syscore_ops(&pxa_gpio_syscore_ops); | ||
466 | register_syscore_ops(&pxa3xx_clock_syscore_ops); | 465 | register_syscore_ops(&pxa3xx_clock_syscore_ops); |
467 | 466 | ||
468 | ret = platform_add_devices(devices, ARRAY_SIZE(devices)); | 467 | ret = platform_add_devices(devices, ARRAY_SIZE(devices)); |
diff --git a/arch/arm/mach-pxa/pxa95x.c b/arch/arm/mach-pxa/pxa95x.c index d082a583df78..5ce434b95e87 100644 --- a/arch/arm/mach-pxa/pxa95x.c +++ b/arch/arm/mach-pxa/pxa95x.c | |||
@@ -283,7 +283,6 @@ static int __init pxa95x_init(void) | |||
283 | return ret; | 283 | return ret; |
284 | 284 | ||
285 | register_syscore_ops(&pxa_irq_syscore_ops); | 285 | register_syscore_ops(&pxa_irq_syscore_ops); |
286 | register_syscore_ops(&pxa_gpio_syscore_ops); | ||
287 | register_syscore_ops(&pxa3xx_clock_syscore_ops); | 286 | register_syscore_ops(&pxa3xx_clock_syscore_ops); |
288 | 287 | ||
289 | ret = platform_add_devices(devices, ARRAY_SIZE(devices)); | 288 | ret = platform_add_devices(devices, ARRAY_SIZE(devices)); |
diff --git a/arch/arm/mach-s3c2440/common.h b/arch/arm/mach-s3c2440/common.h index db8a98ac68c5..0c1eb1dfc534 100644 --- a/arch/arm/mach-s3c2440/common.h +++ b/arch/arm/mach-s3c2440/common.h | |||
@@ -12,6 +12,6 @@ | |||
12 | #ifndef __ARCH_ARM_MACH_S3C2440_COMMON_H | 12 | #ifndef __ARCH_ARM_MACH_S3C2440_COMMON_H |
13 | #define __ARCH_ARM_MACH_S3C2440_COMMON_H | 13 | #define __ARCH_ARM_MACH_S3C2440_COMMON_H |
14 | 14 | ||
15 | void s3c2440_restart(char mode, const char *cmd); | 15 | void s3c244x_restart(char mode, const char *cmd); |
16 | 16 | ||
17 | #endif /* __ARCH_ARM_MACH_S3C2440_COMMON_H */ | 17 | #endif /* __ARCH_ARM_MACH_S3C2440_COMMON_H */ |
diff --git a/arch/arm/mach-s3c2440/mach-anubis.c b/arch/arm/mach-s3c2440/mach-anubis.c index 24569550de1a..19b577bc09b8 100644 --- a/arch/arm/mach-s3c2440/mach-anubis.c +++ b/arch/arm/mach-s3c2440/mach-anubis.c | |||
@@ -487,5 +487,5 @@ MACHINE_START(ANUBIS, "Simtec-Anubis") | |||
487 | .init_machine = anubis_init, | 487 | .init_machine = anubis_init, |
488 | .init_irq = s3c24xx_init_irq, | 488 | .init_irq = s3c24xx_init_irq, |
489 | .timer = &s3c24xx_timer, | 489 | .timer = &s3c24xx_timer, |
490 | .restart = s3c2440_restart, | 490 | .restart = s3c244x_restart, |
491 | MACHINE_END | 491 | MACHINE_END |
diff --git a/arch/arm/mach-s3c2440/mach-at2440evb.c b/arch/arm/mach-s3c2440/mach-at2440evb.c index d6a9763110cd..d7ae49c90118 100644 --- a/arch/arm/mach-s3c2440/mach-at2440evb.c +++ b/arch/arm/mach-s3c2440/mach-at2440evb.c | |||
@@ -222,5 +222,5 @@ MACHINE_START(AT2440EVB, "AT2440EVB") | |||
222 | .init_machine = at2440evb_init, | 222 | .init_machine = at2440evb_init, |
223 | .init_irq = s3c24xx_init_irq, | 223 | .init_irq = s3c24xx_init_irq, |
224 | .timer = &s3c24xx_timer, | 224 | .timer = &s3c24xx_timer, |
225 | .restart = s3c2440_restart, | 225 | .restart = s3c244x_restart, |
226 | MACHINE_END | 226 | MACHINE_END |
diff --git a/arch/arm/mach-s3c2440/mach-gta02.c b/arch/arm/mach-s3c2440/mach-gta02.c index 5859e609d28c..9a4a5bc008e6 100644 --- a/arch/arm/mach-s3c2440/mach-gta02.c +++ b/arch/arm/mach-s3c2440/mach-gta02.c | |||
@@ -601,5 +601,5 @@ MACHINE_START(NEO1973_GTA02, "GTA02") | |||
601 | .init_irq = s3c24xx_init_irq, | 601 | .init_irq = s3c24xx_init_irq, |
602 | .init_machine = gta02_machine_init, | 602 | .init_machine = gta02_machine_init, |
603 | .timer = &s3c24xx_timer, | 603 | .timer = &s3c24xx_timer, |
604 | .restart = s3c2440_restart, | 604 | .restart = s3c244x_restart, |
605 | MACHINE_END | 605 | MACHINE_END |
diff --git a/arch/arm/mach-s3c2440/mach-mini2440.c b/arch/arm/mach-s3c2440/mach-mini2440.c index adbbb85bc4cd..5d66fb218a41 100644 --- a/arch/arm/mach-s3c2440/mach-mini2440.c +++ b/arch/arm/mach-s3c2440/mach-mini2440.c | |||
@@ -701,5 +701,5 @@ MACHINE_START(MINI2440, "MINI2440") | |||
701 | .init_machine = mini2440_init, | 701 | .init_machine = mini2440_init, |
702 | .init_irq = s3c24xx_init_irq, | 702 | .init_irq = s3c24xx_init_irq, |
703 | .timer = &s3c24xx_timer, | 703 | .timer = &s3c24xx_timer, |
704 | .restart = s3c2440_restart, | 704 | .restart = s3c244x_restart, |
705 | MACHINE_END | 705 | MACHINE_END |
diff --git a/arch/arm/mach-s3c2440/mach-nexcoder.c b/arch/arm/mach-s3c2440/mach-nexcoder.c index 40eaf844bc1f..5198e3e1c5be 100644 --- a/arch/arm/mach-s3c2440/mach-nexcoder.c +++ b/arch/arm/mach-s3c2440/mach-nexcoder.c | |||
@@ -158,5 +158,5 @@ MACHINE_START(NEXCODER_2440, "NexVision - Nexcoder 2440") | |||
158 | .init_machine = nexcoder_init, | 158 | .init_machine = nexcoder_init, |
159 | .init_irq = s3c24xx_init_irq, | 159 | .init_irq = s3c24xx_init_irq, |
160 | .timer = &s3c24xx_timer, | 160 | .timer = &s3c24xx_timer, |
161 | .restart = s3c2440_restart, | 161 | .restart = s3c244x_restart, |
162 | MACHINE_END | 162 | MACHINE_END |
diff --git a/arch/arm/mach-s3c2440/mach-osiris.c b/arch/arm/mach-s3c2440/mach-osiris.c index 4c480ef734f6..c5daeb612a88 100644 --- a/arch/arm/mach-s3c2440/mach-osiris.c +++ b/arch/arm/mach-s3c2440/mach-osiris.c | |||
@@ -436,5 +436,5 @@ MACHINE_START(OSIRIS, "Simtec-OSIRIS") | |||
436 | .init_irq = s3c24xx_init_irq, | 436 | .init_irq = s3c24xx_init_irq, |
437 | .init_machine = osiris_init, | 437 | .init_machine = osiris_init, |
438 | .timer = &s3c24xx_timer, | 438 | .timer = &s3c24xx_timer, |
439 | .restart = s3c2440_restart, | 439 | .restart = s3c244x_restart, |
440 | MACHINE_END | 440 | MACHINE_END |
diff --git a/arch/arm/mach-s3c2440/mach-rx1950.c b/arch/arm/mach-s3c2440/mach-rx1950.c index 80077f6472ee..6f68abf44fab 100644 --- a/arch/arm/mach-s3c2440/mach-rx1950.c +++ b/arch/arm/mach-s3c2440/mach-rx1950.c | |||
@@ -822,5 +822,5 @@ MACHINE_START(RX1950, "HP iPAQ RX1950") | |||
822 | .init_irq = s3c24xx_init_irq, | 822 | .init_irq = s3c24xx_init_irq, |
823 | .init_machine = rx1950_init_machine, | 823 | .init_machine = rx1950_init_machine, |
824 | .timer = &s3c24xx_timer, | 824 | .timer = &s3c24xx_timer, |
825 | .restart = s3c2440_restart, | 825 | .restart = s3c244x_restart, |
826 | MACHINE_END | 826 | MACHINE_END |
diff --git a/arch/arm/mach-s3c2440/mach-rx3715.c b/arch/arm/mach-s3c2440/mach-rx3715.c index 20103bafbd4b..56af35447598 100644 --- a/arch/arm/mach-s3c2440/mach-rx3715.c +++ b/arch/arm/mach-s3c2440/mach-rx3715.c | |||
@@ -213,5 +213,5 @@ MACHINE_START(RX3715, "IPAQ-RX3715") | |||
213 | .init_irq = rx3715_init_irq, | 213 | .init_irq = rx3715_init_irq, |
214 | .init_machine = rx3715_init_machine, | 214 | .init_machine = rx3715_init_machine, |
215 | .timer = &s3c24xx_timer, | 215 | .timer = &s3c24xx_timer, |
216 | .restart = s3c2440_restart, | 216 | .restart = s3c244x_restart, |
217 | MACHINE_END | 217 | MACHINE_END |
diff --git a/arch/arm/mach-s3c2440/mach-smdk2440.c b/arch/arm/mach-s3c2440/mach-smdk2440.c index 1deb60d12a60..83a1036d7dcb 100644 --- a/arch/arm/mach-s3c2440/mach-smdk2440.c +++ b/arch/arm/mach-s3c2440/mach-smdk2440.c | |||
@@ -183,5 +183,5 @@ MACHINE_START(S3C2440, "SMDK2440") | |||
183 | .map_io = smdk2440_map_io, | 183 | .map_io = smdk2440_map_io, |
184 | .init_machine = smdk2440_machine_init, | 184 | .init_machine = smdk2440_machine_init, |
185 | .timer = &s3c24xx_timer, | 185 | .timer = &s3c24xx_timer, |
186 | .restart = s3c2440_restart, | 186 | .restart = s3c244x_restart, |
187 | MACHINE_END | 187 | MACHINE_END |
diff --git a/arch/arm/mach-s3c2440/s3c2440.c b/arch/arm/mach-s3c2440/s3c2440.c index 517623a09fc5..2b3dddb49af7 100644 --- a/arch/arm/mach-s3c2440/s3c2440.c +++ b/arch/arm/mach-s3c2440/s3c2440.c | |||
@@ -35,7 +35,6 @@ | |||
35 | #include <plat/cpu.h> | 35 | #include <plat/cpu.h> |
36 | #include <plat/s3c244x.h> | 36 | #include <plat/s3c244x.h> |
37 | #include <plat/pm.h> | 37 | #include <plat/pm.h> |
38 | #include <plat/watchdog-reset.h> | ||
39 | 38 | ||
40 | #include <plat/gpio-core.h> | 39 | #include <plat/gpio-core.h> |
41 | #include <plat/gpio-cfg.h> | 40 | #include <plat/gpio-cfg.h> |
@@ -74,15 +73,3 @@ void __init s3c2440_map_io(void) | |||
74 | s3c24xx_gpiocfg_default.set_pull = s3c24xx_gpio_setpull_1up; | 73 | s3c24xx_gpiocfg_default.set_pull = s3c24xx_gpio_setpull_1up; |
75 | s3c24xx_gpiocfg_default.get_pull = s3c24xx_gpio_getpull_1up; | 74 | s3c24xx_gpiocfg_default.get_pull = s3c24xx_gpio_getpull_1up; |
76 | } | 75 | } |
77 | |||
78 | void s3c2440_restart(char mode, const char *cmd) | ||
79 | { | ||
80 | if (mode == 's') { | ||
81 | soft_restart(0); | ||
82 | } | ||
83 | |||
84 | arch_wdt_reset(); | ||
85 | |||
86 | /* we'll take a jump through zero as a poor second */ | ||
87 | soft_restart(0); | ||
88 | } | ||
diff --git a/arch/arm/mach-s3c2440/s3c244x.c b/arch/arm/mach-s3c2440/s3c244x.c index 36bc60f61d0a..d15852f642b7 100644 --- a/arch/arm/mach-s3c2440/s3c244x.c +++ b/arch/arm/mach-s3c2440/s3c244x.c | |||
@@ -46,6 +46,7 @@ | |||
46 | #include <plat/pm.h> | 46 | #include <plat/pm.h> |
47 | #include <plat/pll.h> | 47 | #include <plat/pll.h> |
48 | #include <plat/nand-core.h> | 48 | #include <plat/nand-core.h> |
49 | #include <plat/watchdog-reset.h> | ||
49 | 50 | ||
50 | static struct map_desc s3c244x_iodesc[] __initdata = { | 51 | static struct map_desc s3c244x_iodesc[] __initdata = { |
51 | IODESC_ENT(CLKPWR), | 52 | IODESC_ENT(CLKPWR), |
@@ -196,3 +197,14 @@ struct syscore_ops s3c244x_pm_syscore_ops = { | |||
196 | .suspend = s3c244x_suspend, | 197 | .suspend = s3c244x_suspend, |
197 | .resume = s3c244x_resume, | 198 | .resume = s3c244x_resume, |
198 | }; | 199 | }; |
200 | |||
201 | void s3c244x_restart(char mode, const char *cmd) | ||
202 | { | ||
203 | if (mode == 's') | ||
204 | soft_restart(0); | ||
205 | |||
206 | arch_wdt_reset(); | ||
207 | |||
208 | /* we'll take a jump through zero as a poor second */ | ||
209 | soft_restart(0); | ||
210 | } | ||
diff --git a/arch/arm/mach-spear6xx/Kconfig b/arch/arm/mach-spear6xx/Kconfig index ff4ae5ba00f1..fbe298bd1d92 100644 --- a/arch/arm/mach-spear6xx/Kconfig +++ b/arch/arm/mach-spear6xx/Kconfig | |||
@@ -5,11 +5,12 @@ | |||
5 | if ARCH_SPEAR6XX | 5 | if ARCH_SPEAR6XX |
6 | 6 | ||
7 | menu "SPEAr6xx Implementations" | 7 | menu "SPEAr6xx Implementations" |
8 | config BOARD_SPEAR600_EVB | 8 | config BOARD_SPEAR600_DT |
9 | bool "SPEAr600 Evaluation Board" | 9 | bool "SPEAr600 generic board configured via device-tree" |
10 | select MACH_SPEAR600 | 10 | select MACH_SPEAR600 |
11 | select USE_OF | ||
11 | help | 12 | help |
12 | Supports ST SPEAr600 Evaluation Board | 13 | Supports ST SPEAr600 boards configured via the device-tree |
13 | 14 | ||
14 | endmenu | 15 | endmenu |
15 | 16 | ||
diff --git a/arch/arm/mach-spear6xx/Makefile b/arch/arm/mach-spear6xx/Makefile index cc1a4d82d459..76e5750552fc 100644 --- a/arch/arm/mach-spear6xx/Makefile +++ b/arch/arm/mach-spear6xx/Makefile | |||
@@ -4,9 +4,3 @@ | |||
4 | 4 | ||
5 | # common files | 5 | # common files |
6 | obj-y += clock.o spear6xx.o | 6 | obj-y += clock.o spear6xx.o |
7 | |||
8 | # spear600 specific files | ||
9 | obj-$(CONFIG_MACH_SPEAR600) += spear600.o | ||
10 | |||
11 | # spear600 boards files | ||
12 | obj-$(CONFIG_BOARD_SPEAR600_EVB) += spear600_evb.o | ||
diff --git a/arch/arm/mach-spear6xx/clock.c b/arch/arm/mach-spear6xx/clock.c index ac70e0d88fef..358f2800f17b 100644 --- a/arch/arm/mach-spear6xx/clock.c +++ b/arch/arm/mach-spear6xx/clock.c | |||
@@ -641,8 +641,8 @@ static struct clk_lookup spear_clk_lookups[] = { | |||
641 | { .con_id = "gpt0_synth_clk", .clk = &gpt0_synth_clk}, | 641 | { .con_id = "gpt0_synth_clk", .clk = &gpt0_synth_clk}, |
642 | { .con_id = "gpt2_synth_clk", .clk = &gpt2_synth_clk}, | 642 | { .con_id = "gpt2_synth_clk", .clk = &gpt2_synth_clk}, |
643 | { .con_id = "gpt3_synth_clk", .clk = &gpt3_synth_clk}, | 643 | { .con_id = "gpt3_synth_clk", .clk = &gpt3_synth_clk}, |
644 | { .dev_id = "uart0", .clk = &uart0_clk}, | 644 | { .dev_id = "d0000000.serial", .clk = &uart0_clk}, |
645 | { .dev_id = "uart1", .clk = &uart1_clk}, | 645 | { .dev_id = "d0080000.serial", .clk = &uart1_clk}, |
646 | { .dev_id = "firda", .clk = &firda_clk}, | 646 | { .dev_id = "firda", .clk = &firda_clk}, |
647 | { .dev_id = "clcd", .clk = &clcd_clk}, | 647 | { .dev_id = "clcd", .clk = &clcd_clk}, |
648 | { .dev_id = "gpt0", .clk = &gpt0_clk}, | 648 | { .dev_id = "gpt0", .clk = &gpt0_clk}, |
@@ -655,20 +655,20 @@ static struct clk_lookup spear_clk_lookups[] = { | |||
655 | { .con_id = "usbh.1_clk", .clk = &usbh1_clk}, | 655 | { .con_id = "usbh.1_clk", .clk = &usbh1_clk}, |
656 | /* clock derived from ahb clk */ | 656 | /* clock derived from ahb clk */ |
657 | { .con_id = "apb_clk", .clk = &apb_clk}, | 657 | { .con_id = "apb_clk", .clk = &apb_clk}, |
658 | { .dev_id = "i2c_designware.0", .clk = &i2c_clk}, | 658 | { .dev_id = "d0200000.i2c", .clk = &i2c_clk}, |
659 | { .dev_id = "dma", .clk = &dma_clk}, | 659 | { .dev_id = "dma", .clk = &dma_clk}, |
660 | { .dev_id = "jpeg", .clk = &jpeg_clk}, | 660 | { .dev_id = "jpeg", .clk = &jpeg_clk}, |
661 | { .dev_id = "gmac", .clk = &gmac_clk}, | 661 | { .dev_id = "gmac", .clk = &gmac_clk}, |
662 | { .dev_id = "smi", .clk = &smi_clk}, | 662 | { .dev_id = "smi", .clk = &smi_clk}, |
663 | { .con_id = "fsmc", .clk = &fsmc_clk}, | 663 | { .dev_id = "fsmc-nand", .clk = &fsmc_clk}, |
664 | /* clock derived from apb clk */ | 664 | /* clock derived from apb clk */ |
665 | { .dev_id = "adc", .clk = &adc_clk}, | 665 | { .dev_id = "adc", .clk = &adc_clk}, |
666 | { .dev_id = "ssp-pl022.0", .clk = &ssp0_clk}, | 666 | { .dev_id = "ssp-pl022.0", .clk = &ssp0_clk}, |
667 | { .dev_id = "ssp-pl022.1", .clk = &ssp1_clk}, | 667 | { .dev_id = "ssp-pl022.1", .clk = &ssp1_clk}, |
668 | { .dev_id = "ssp-pl022.2", .clk = &ssp2_clk}, | 668 | { .dev_id = "ssp-pl022.2", .clk = &ssp2_clk}, |
669 | { .dev_id = "gpio0", .clk = &gpio0_clk}, | 669 | { .dev_id = "f0100000.gpio", .clk = &gpio0_clk}, |
670 | { .dev_id = "gpio1", .clk = &gpio1_clk}, | 670 | { .dev_id = "fc980000.gpio", .clk = &gpio1_clk}, |
671 | { .dev_id = "gpio2", .clk = &gpio2_clk}, | 671 | { .dev_id = "d8100000.gpio", .clk = &gpio2_clk}, |
672 | }; | 672 | }; |
673 | 673 | ||
674 | void __init spear6xx_clk_init(void) | 674 | void __init spear6xx_clk_init(void) |
diff --git a/arch/arm/mach-spear6xx/spear600.c b/arch/arm/mach-spear6xx/spear600.c deleted file mode 100644 index d0e6eeae9b04..000000000000 --- a/arch/arm/mach-spear6xx/spear600.c +++ /dev/null | |||
@@ -1,25 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-spear6xx/spear600.c | ||
3 | * | ||
4 | * SPEAr600 machine source file | ||
5 | * | ||
6 | * Copyright (C) 2009 ST Microelectronics | ||
7 | * Rajeev Kumar<rajeev-dlh.kumar@st.com> | ||
8 | * | ||
9 | * This file is licensed under the terms of the GNU General Public | ||
10 | * License version 2. This program is licensed "as is" without any | ||
11 | * warranty of any kind, whether express or implied. | ||
12 | */ | ||
13 | |||
14 | #include <linux/ptrace.h> | ||
15 | #include <asm/irq.h> | ||
16 | #include <mach/generic.h> | ||
17 | #include <mach/hardware.h> | ||
18 | |||
19 | /* Add spear600 specific devices here */ | ||
20 | |||
21 | void __init spear600_init(void) | ||
22 | { | ||
23 | /* call spear6xx family common init function */ | ||
24 | spear6xx_init(); | ||
25 | } | ||
diff --git a/arch/arm/mach-spear6xx/spear600_evb.c b/arch/arm/mach-spear6xx/spear600_evb.c deleted file mode 100644 index c6e4254741cc..000000000000 --- a/arch/arm/mach-spear6xx/spear600_evb.c +++ /dev/null | |||
@@ -1,54 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-spear6xx/spear600_evb.c | ||
3 | * | ||
4 | * SPEAr600 evaluation board source file | ||
5 | * | ||
6 | * Copyright (C) 2009 ST Microelectronics | ||
7 | * Viresh Kumar<viresh.kumar@st.com> | ||
8 | * | ||
9 | * This file is licensed under the terms of the GNU General Public | ||
10 | * License version 2. This program is licensed "as is" without any | ||
11 | * warranty of any kind, whether express or implied. | ||
12 | */ | ||
13 | |||
14 | #include <asm/hardware/vic.h> | ||
15 | #include <asm/mach/arch.h> | ||
16 | #include <asm/mach-types.h> | ||
17 | #include <mach/generic.h> | ||
18 | #include <mach/hardware.h> | ||
19 | |||
20 | static struct amba_device *amba_devs[] __initdata = { | ||
21 | &gpio_device[0], | ||
22 | &gpio_device[1], | ||
23 | &gpio_device[2], | ||
24 | &uart_device[0], | ||
25 | &uart_device[1], | ||
26 | }; | ||
27 | |||
28 | static struct platform_device *plat_devs[] __initdata = { | ||
29 | }; | ||
30 | |||
31 | static void __init spear600_evb_init(void) | ||
32 | { | ||
33 | unsigned int i; | ||
34 | |||
35 | /* call spear600 machine init function */ | ||
36 | spear600_init(); | ||
37 | |||
38 | /* Add Platform Devices */ | ||
39 | platform_add_devices(plat_devs, ARRAY_SIZE(plat_devs)); | ||
40 | |||
41 | /* Add Amba Devices */ | ||
42 | for (i = 0; i < ARRAY_SIZE(amba_devs); i++) | ||
43 | amba_device_register(amba_devs[i], &iomem_resource); | ||
44 | } | ||
45 | |||
46 | MACHINE_START(SPEAR600, "ST-SPEAR600-EVB") | ||
47 | .atag_offset = 0x100, | ||
48 | .map_io = spear6xx_map_io, | ||
49 | .init_irq = spear6xx_init_irq, | ||
50 | .handle_irq = vic_handle_irq, | ||
51 | .timer = &spear6xx_timer, | ||
52 | .init_machine = spear600_evb_init, | ||
53 | .restart = spear_restart, | ||
54 | MACHINE_END | ||
diff --git a/arch/arm/mach-spear6xx/spear6xx.c b/arch/arm/mach-spear6xx/spear6xx.c index b997b1b10ba0..2ed8b14c82c8 100644 --- a/arch/arm/mach-spear6xx/spear6xx.c +++ b/arch/arm/mach-spear6xx/spear6xx.c | |||
@@ -6,111 +6,21 @@ | |||
6 | * Copyright (C) 2009 ST Microelectronics | 6 | * Copyright (C) 2009 ST Microelectronics |
7 | * Rajeev Kumar<rajeev-dlh.kumar@st.com> | 7 | * Rajeev Kumar<rajeev-dlh.kumar@st.com> |
8 | * | 8 | * |
9 | * Copyright 2012 Stefan Roese <sr@denx.de> | ||
10 | * | ||
9 | * This file is licensed under the terms of the GNU General Public | 11 | * This file is licensed under the terms of the GNU General Public |
10 | * License version 2. This program is licensed "as is" without any | 12 | * License version 2. This program is licensed "as is" without any |
11 | * warranty of any kind, whether express or implied. | 13 | * warranty of any kind, whether express or implied. |
12 | */ | 14 | */ |
13 | 15 | ||
14 | #include <linux/types.h> | 16 | #include <linux/of.h> |
15 | #include <linux/amba/pl061.h> | 17 | #include <linux/of_address.h> |
16 | #include <linux/ptrace.h> | 18 | #include <linux/of_irq.h> |
17 | #include <linux/io.h> | 19 | #include <linux/of_platform.h> |
18 | #include <asm/hardware/vic.h> | 20 | #include <asm/hardware/vic.h> |
19 | #include <asm/irq.h> | ||
20 | #include <asm/mach/arch.h> | 21 | #include <asm/mach/arch.h> |
21 | #include <mach/generic.h> | 22 | #include <mach/generic.h> |
22 | #include <mach/hardware.h> | 23 | #include <mach/hardware.h> |
23 | #include <mach/irqs.h> | ||
24 | |||
25 | /* Add spear6xx machines common devices here */ | ||
26 | /* uart device registration */ | ||
27 | struct amba_device uart_device[] = { | ||
28 | { | ||
29 | .dev = { | ||
30 | .init_name = "uart0", | ||
31 | }, | ||
32 | .res = { | ||
33 | .start = SPEAR6XX_ICM1_UART0_BASE, | ||
34 | .end = SPEAR6XX_ICM1_UART0_BASE + SZ_4K - 1, | ||
35 | .flags = IORESOURCE_MEM, | ||
36 | }, | ||
37 | .irq = {IRQ_UART_0}, | ||
38 | }, { | ||
39 | .dev = { | ||
40 | .init_name = "uart1", | ||
41 | }, | ||
42 | .res = { | ||
43 | .start = SPEAR6XX_ICM1_UART1_BASE, | ||
44 | .end = SPEAR6XX_ICM1_UART1_BASE + SZ_4K - 1, | ||
45 | .flags = IORESOURCE_MEM, | ||
46 | }, | ||
47 | .irq = {IRQ_UART_1}, | ||
48 | } | ||
49 | }; | ||
50 | |||
51 | /* gpio device registration */ | ||
52 | static struct pl061_platform_data gpio_plat_data[] = { | ||
53 | { | ||
54 | .gpio_base = 0, | ||
55 | .irq_base = SPEAR_GPIO0_INT_BASE, | ||
56 | }, { | ||
57 | .gpio_base = 8, | ||
58 | .irq_base = SPEAR_GPIO1_INT_BASE, | ||
59 | }, { | ||
60 | .gpio_base = 16, | ||
61 | .irq_base = SPEAR_GPIO2_INT_BASE, | ||
62 | }, | ||
63 | }; | ||
64 | |||
65 | struct amba_device gpio_device[] = { | ||
66 | { | ||
67 | .dev = { | ||
68 | .init_name = "gpio0", | ||
69 | .platform_data = &gpio_plat_data[0], | ||
70 | }, | ||
71 | .res = { | ||
72 | .start = SPEAR6XX_CPU_GPIO_BASE, | ||
73 | .end = SPEAR6XX_CPU_GPIO_BASE + SZ_4K - 1, | ||
74 | .flags = IORESOURCE_MEM, | ||
75 | }, | ||
76 | .irq = {IRQ_LOCAL_GPIO}, | ||
77 | }, { | ||
78 | .dev = { | ||
79 | .init_name = "gpio1", | ||
80 | .platform_data = &gpio_plat_data[1], | ||
81 | }, | ||
82 | .res = { | ||
83 | .start = SPEAR6XX_ICM3_GPIO_BASE, | ||
84 | .end = SPEAR6XX_ICM3_GPIO_BASE + SZ_4K - 1, | ||
85 | .flags = IORESOURCE_MEM, | ||
86 | }, | ||
87 | .irq = {IRQ_BASIC_GPIO}, | ||
88 | }, { | ||
89 | .dev = { | ||
90 | .init_name = "gpio2", | ||
91 | .platform_data = &gpio_plat_data[2], | ||
92 | }, | ||
93 | .res = { | ||
94 | .start = SPEAR6XX_ICM2_GPIO_BASE, | ||
95 | .end = SPEAR6XX_ICM2_GPIO_BASE + SZ_4K - 1, | ||
96 | .flags = IORESOURCE_MEM, | ||
97 | }, | ||
98 | .irq = {IRQ_APPL_GPIO}, | ||
99 | } | ||
100 | }; | ||
101 | |||
102 | /* This will add devices, and do machine specific tasks */ | ||
103 | void __init spear6xx_init(void) | ||
104 | { | ||
105 | /* nothing to do for now */ | ||
106 | } | ||
107 | |||
108 | /* This will initialize vic */ | ||
109 | void __init spear6xx_init_irq(void) | ||
110 | { | ||
111 | vic_init((void __iomem *)VA_SPEAR6XX_CPU_VIC_PRI_BASE, 0, ~0, 0); | ||
112 | vic_init((void __iomem *)VA_SPEAR6XX_CPU_VIC_SEC_BASE, 32, ~0, 0); | ||
113 | } | ||
114 | 24 | ||
115 | /* Following will create static virtual/physical mappings */ | 25 | /* Following will create static virtual/physical mappings */ |
116 | static struct map_desc spear6xx_io_desc[] __initdata = { | 26 | static struct map_desc spear6xx_io_desc[] __initdata = { |
@@ -181,3 +91,33 @@ static void __init spear6xx_timer_init(void) | |||
181 | struct sys_timer spear6xx_timer = { | 91 | struct sys_timer spear6xx_timer = { |
182 | .init = spear6xx_timer_init, | 92 | .init = spear6xx_timer_init, |
183 | }; | 93 | }; |
94 | |||
95 | static void __init spear600_dt_init(void) | ||
96 | { | ||
97 | of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); | ||
98 | } | ||
99 | |||
100 | static const char *spear600_dt_board_compat[] = { | ||
101 | "st,spear600", | ||
102 | NULL | ||
103 | }; | ||
104 | |||
105 | static const struct of_device_id vic_of_match[] __initconst = { | ||
106 | { .compatible = "arm,pl190-vic", .data = vic_of_init, }, | ||
107 | { /* Sentinel */ } | ||
108 | }; | ||
109 | |||
110 | static void __init spear6xx_dt_init_irq(void) | ||
111 | { | ||
112 | of_irq_init(vic_of_match); | ||
113 | } | ||
114 | |||
115 | DT_MACHINE_START(SPEAR600_DT, "ST SPEAr600 (Flattened Device Tree)") | ||
116 | .map_io = spear6xx_map_io, | ||
117 | .init_irq = spear6xx_dt_init_irq, | ||
118 | .handle_irq = vic_handle_irq, | ||
119 | .timer = &spear6xx_timer, | ||
120 | .init_machine = spear600_dt_init, | ||
121 | .restart = spear_restart, | ||
122 | .dt_compat = spear600_dt_board_compat, | ||
123 | MACHINE_END | ||
diff --git a/arch/arm/mach-ux500/Kconfig b/arch/arm/mach-ux500/Kconfig index afb3706bab2a..ea908c66aebd 100644 --- a/arch/arm/mach-ux500/Kconfig +++ b/arch/arm/mach-ux500/Kconfig | |||
@@ -5,7 +5,7 @@ config UX500_SOC_COMMON | |||
5 | default y | 5 | default y |
6 | select ARM_GIC | 6 | select ARM_GIC |
7 | select HAS_MTU | 7 | select HAS_MTU |
8 | select ARM_ERRATA_753970 | 8 | select PL310_ERRATA_753970 |
9 | select ARM_ERRATA_754322 | 9 | select ARM_ERRATA_754322 |
10 | select ARM_ERRATA_764369 | 10 | select ARM_ERRATA_764369 |
11 | 11 | ||
diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S index 0404ccbb8aa3..f1c8486f7501 100644 --- a/arch/arm/mm/proc-v7.S +++ b/arch/arm/mm/proc-v7.S | |||
@@ -230,9 +230,7 @@ __v7_setup: | |||
230 | mcreq p15, 0, r10, c15, c0, 1 @ write diagnostic register | 230 | mcreq p15, 0, r10, c15, c0, 1 @ write diagnostic register |
231 | #endif | 231 | #endif |
232 | #ifdef CONFIG_ARM_ERRATA_743622 | 232 | #ifdef CONFIG_ARM_ERRATA_743622 |
233 | teq r6, #0x20 @ present in r2p0 | 233 | teq r5, #0x00200000 @ only present in r2p* |
234 | teqne r6, #0x21 @ present in r2p1 | ||
235 | teqne r6, #0x22 @ present in r2p2 | ||
236 | mrceq p15, 0, r10, c15, c0, 1 @ read diagnostic register | 234 | mrceq p15, 0, r10, c15, c0, 1 @ read diagnostic register |
237 | orreq r10, r10, #1 << 6 @ set bit #6 | 235 | orreq r10, r10, #1 << 6 @ set bit #6 |
238 | mcreq p15, 0, r10, c15, c0, 1 @ write diagnostic register | 236 | mcreq p15, 0, r10, c15, c0, 1 @ write diagnostic register |
diff --git a/arch/arm/plat-omap/include/plat/irqs.h b/arch/arm/plat-omap/include/plat/irqs.h index 2efd6454bce0..37bbbbb981b2 100644 --- a/arch/arm/plat-omap/include/plat/irqs.h +++ b/arch/arm/plat-omap/include/plat/irqs.h | |||
@@ -428,8 +428,16 @@ | |||
428 | #define OMAP_GPMC_NR_IRQS 8 | 428 | #define OMAP_GPMC_NR_IRQS 8 |
429 | #define OMAP_GPMC_IRQ_END (OMAP_GPMC_IRQ_BASE + OMAP_GPMC_NR_IRQS) | 429 | #define OMAP_GPMC_IRQ_END (OMAP_GPMC_IRQ_BASE + OMAP_GPMC_NR_IRQS) |
430 | 430 | ||
431 | /* PRCM IRQ handler */ | ||
432 | #ifdef CONFIG_ARCH_OMAP2PLUS | ||
433 | #define OMAP_PRCM_IRQ_BASE (OMAP_GPMC_IRQ_END) | ||
434 | #define OMAP_PRCM_NR_IRQS 64 | ||
435 | #define OMAP_PRCM_IRQ_END (OMAP_PRCM_IRQ_BASE + OMAP_PRCM_NR_IRQS) | ||
436 | #else | ||
437 | #define OMAP_PRCM_IRQ_END OMAP_GPMC_IRQ_END | ||
438 | #endif | ||
431 | 439 | ||
432 | #define NR_IRQS OMAP_GPMC_IRQ_END | 440 | #define NR_IRQS OMAP_PRCM_IRQ_END |
433 | 441 | ||
434 | #define OMAP_IRQ_BIT(irq) (1 << ((irq) % 32)) | 442 | #define OMAP_IRQ_BIT(irq) (1 << ((irq) % 32)) |
435 | 443 | ||
diff --git a/arch/arm/plat-s3c24xx/dma.c b/arch/arm/plat-s3c24xx/dma.c index 9fe35348e03b..2bab4c99a234 100644 --- a/arch/arm/plat-s3c24xx/dma.c +++ b/arch/arm/plat-s3c24xx/dma.c | |||
@@ -1249,7 +1249,7 @@ static void s3c2410_dma_resume(void) | |||
1249 | struct s3c2410_dma_chan *cp = s3c2410_chans + dma_channels - 1; | 1249 | struct s3c2410_dma_chan *cp = s3c2410_chans + dma_channels - 1; |
1250 | int channel; | 1250 | int channel; |
1251 | 1251 | ||
1252 | for (channel = dma_channels - 1; channel >= 0; cp++, channel--) | 1252 | for (channel = dma_channels - 1; channel >= 0; cp--, channel--) |
1253 | s3c2410_dma_resume_chan(cp); | 1253 | s3c2410_dma_resume_chan(cp); |
1254 | } | 1254 | } |
1255 | 1255 | ||
diff --git a/arch/arm/plat-samsung/devs.c b/arch/arm/plat-samsung/devs.c index f10768e988d4..d21d744e4d99 100644 --- a/arch/arm/plat-samsung/devs.c +++ b/arch/arm/plat-samsung/devs.c | |||
@@ -1409,7 +1409,7 @@ void __init s5p_ehci_set_platdata(struct s5p_ehci_platdata *pd) | |||
1409 | 1409 | ||
1410 | #ifdef CONFIG_S3C_DEV_USB_HSOTG | 1410 | #ifdef CONFIG_S3C_DEV_USB_HSOTG |
1411 | static struct resource s3c_usb_hsotg_resources[] = { | 1411 | static struct resource s3c_usb_hsotg_resources[] = { |
1412 | [0] = DEFINE_RES_MEM(S3C_PA_USB_HSOTG, SZ_16K), | 1412 | [0] = DEFINE_RES_MEM(S3C_PA_USB_HSOTG, SZ_128K), |
1413 | [1] = DEFINE_RES_IRQ(IRQ_OTG), | 1413 | [1] = DEFINE_RES_IRQ(IRQ_OTG), |
1414 | }; | 1414 | }; |
1415 | 1415 | ||
diff --git a/arch/arm/plat-spear/time.c b/arch/arm/plat-spear/time.c index 0c77e4298675..abb5bdecd509 100644 --- a/arch/arm/plat-spear/time.c +++ b/arch/arm/plat-spear/time.c | |||
@@ -145,11 +145,13 @@ static void clockevent_set_mode(enum clock_event_mode mode, | |||
145 | static int clockevent_next_event(unsigned long cycles, | 145 | static int clockevent_next_event(unsigned long cycles, |
146 | struct clock_event_device *clk_event_dev) | 146 | struct clock_event_device *clk_event_dev) |
147 | { | 147 | { |
148 | u16 val; | 148 | u16 val = readw(gpt_base + CR(CLKEVT)); |
149 | |||
150 | if (val & CTRL_ENABLE) | ||
151 | writew(val & ~CTRL_ENABLE, gpt_base + CR(CLKEVT)); | ||
149 | 152 | ||
150 | writew(cycles, gpt_base + LOAD(CLKEVT)); | 153 | writew(cycles, gpt_base + LOAD(CLKEVT)); |
151 | 154 | ||
152 | val = readw(gpt_base + CR(CLKEVT)); | ||
153 | val |= CTRL_ENABLE | CTRL_INT_ENABLE; | 155 | val |= CTRL_ENABLE | CTRL_INT_ENABLE; |
154 | writew(val, gpt_base + CR(CLKEVT)); | 156 | writew(val, gpt_base + CR(CLKEVT)); |
155 | 157 | ||
diff --git a/arch/c6x/include/asm/processor.h b/arch/c6x/include/asm/processor.h index 8154c4ee8c9c..77ecbded1f37 100644 --- a/arch/c6x/include/asm/processor.h +++ b/arch/c6x/include/asm/processor.h | |||
@@ -122,8 +122,8 @@ extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags); | |||
122 | 122 | ||
123 | extern unsigned long get_wchan(struct task_struct *p); | 123 | extern unsigned long get_wchan(struct task_struct *p); |
124 | 124 | ||
125 | #define KSTK_EIP(tsk) (task_pt_regs(task)->pc) | 125 | #define KSTK_EIP(task) (task_pt_regs(task)->pc) |
126 | #define KSTK_ESP(tsk) (task_pt_regs(task)->sp) | 126 | #define KSTK_ESP(task) (task_pt_regs(task)->sp) |
127 | 127 | ||
128 | #define cpu_relax() do { } while (0) | 128 | #define cpu_relax() do { } while (0) |
129 | 129 | ||
diff --git a/arch/mips/alchemy/common/time.c b/arch/mips/alchemy/common/time.c index 7da4d0081487..a7193ae13a5d 100644 --- a/arch/mips/alchemy/common/time.c +++ b/arch/mips/alchemy/common/time.c | |||
@@ -146,7 +146,7 @@ static int __init alchemy_time_init(unsigned int m2int) | |||
146 | cd->shift = 32; | 146 | cd->shift = 32; |
147 | cd->mult = div_sc(32768, NSEC_PER_SEC, cd->shift); | 147 | cd->mult = div_sc(32768, NSEC_PER_SEC, cd->shift); |
148 | cd->max_delta_ns = clockevent_delta2ns(0xffffffff, cd); | 148 | cd->max_delta_ns = clockevent_delta2ns(0xffffffff, cd); |
149 | cd->min_delta_ns = clockevent_delta2ns(8, cd); /* ~0.25ms */ | 149 | cd->min_delta_ns = clockevent_delta2ns(9, cd); /* ~0.28ms */ |
150 | clockevents_register_device(cd); | 150 | clockevents_register_device(cd); |
151 | setup_irq(m2int, &au1x_rtcmatch2_irqaction); | 151 | setup_irq(m2int, &au1x_rtcmatch2_irqaction); |
152 | 152 | ||
diff --git a/arch/mips/ath79/dev-wmac.c b/arch/mips/ath79/dev-wmac.c index 24f546985b69..e21507052066 100644 --- a/arch/mips/ath79/dev-wmac.c +++ b/arch/mips/ath79/dev-wmac.c | |||
@@ -96,7 +96,7 @@ void __init ath79_register_wmac(u8 *cal_data) | |||
96 | { | 96 | { |
97 | if (soc_is_ar913x()) | 97 | if (soc_is_ar913x()) |
98 | ar913x_wmac_setup(); | 98 | ar913x_wmac_setup(); |
99 | if (soc_is_ar933x()) | 99 | else if (soc_is_ar933x()) |
100 | ar933x_wmac_setup(); | 100 | ar933x_wmac_setup(); |
101 | else | 101 | else |
102 | BUG(); | 102 | BUG(); |
diff --git a/arch/mips/configs/nlm_xlp_defconfig b/arch/mips/configs/nlm_xlp_defconfig index 4479fd669ac1..28c6b276c216 100644 --- a/arch/mips/configs/nlm_xlp_defconfig +++ b/arch/mips/configs/nlm_xlp_defconfig | |||
@@ -8,7 +8,7 @@ CONFIG_HIGH_RES_TIMERS=y | |||
8 | # CONFIG_SECCOMP is not set | 8 | # CONFIG_SECCOMP is not set |
9 | CONFIG_USE_OF=y | 9 | CONFIG_USE_OF=y |
10 | CONFIG_EXPERIMENTAL=y | 10 | CONFIG_EXPERIMENTAL=y |
11 | CONFIG_CROSS_COMPILE="mips-linux-gnu-" | 11 | CONFIG_CROSS_COMPILE="" |
12 | # CONFIG_LOCALVERSION_AUTO is not set | 12 | # CONFIG_LOCALVERSION_AUTO is not set |
13 | CONFIG_SYSVIPC=y | 13 | CONFIG_SYSVIPC=y |
14 | CONFIG_POSIX_MQUEUE=y | 14 | CONFIG_POSIX_MQUEUE=y |
@@ -22,7 +22,7 @@ CONFIG_AUDIT=y | |||
22 | CONFIG_CGROUPS=y | 22 | CONFIG_CGROUPS=y |
23 | CONFIG_NAMESPACES=y | 23 | CONFIG_NAMESPACES=y |
24 | CONFIG_BLK_DEV_INITRD=y | 24 | CONFIG_BLK_DEV_INITRD=y |
25 | CONFIG_INITRAMFS_SOURCE="usr/dev_file_list usr/rootfs.xlp" | 25 | CONFIG_INITRAMFS_SOURCE="" |
26 | CONFIG_RD_BZIP2=y | 26 | CONFIG_RD_BZIP2=y |
27 | CONFIG_RD_LZMA=y | 27 | CONFIG_RD_LZMA=y |
28 | CONFIG_INITRAMFS_COMPRESSION_LZMA=y | 28 | CONFIG_INITRAMFS_COMPRESSION_LZMA=y |
diff --git a/arch/mips/configs/nlm_xlr_defconfig b/arch/mips/configs/nlm_xlr_defconfig index 7c68666fdd64..d0b857d98c91 100644 --- a/arch/mips/configs/nlm_xlr_defconfig +++ b/arch/mips/configs/nlm_xlr_defconfig | |||
@@ -8,7 +8,7 @@ CONFIG_HIGH_RES_TIMERS=y | |||
8 | CONFIG_PREEMPT_VOLUNTARY=y | 8 | CONFIG_PREEMPT_VOLUNTARY=y |
9 | CONFIG_KEXEC=y | 9 | CONFIG_KEXEC=y |
10 | CONFIG_EXPERIMENTAL=y | 10 | CONFIG_EXPERIMENTAL=y |
11 | CONFIG_CROSS_COMPILE="mips-linux-gnu-" | 11 | CONFIG_CROSS_COMPILE="" |
12 | # CONFIG_LOCALVERSION_AUTO is not set | 12 | # CONFIG_LOCALVERSION_AUTO is not set |
13 | CONFIG_SYSVIPC=y | 13 | CONFIG_SYSVIPC=y |
14 | CONFIG_POSIX_MQUEUE=y | 14 | CONFIG_POSIX_MQUEUE=y |
@@ -22,7 +22,7 @@ CONFIG_AUDIT=y | |||
22 | CONFIG_NAMESPACES=y | 22 | CONFIG_NAMESPACES=y |
23 | CONFIG_SCHED_AUTOGROUP=y | 23 | CONFIG_SCHED_AUTOGROUP=y |
24 | CONFIG_BLK_DEV_INITRD=y | 24 | CONFIG_BLK_DEV_INITRD=y |
25 | CONFIG_INITRAMFS_SOURCE="usr/dev_file_list usr/rootfs.xlr" | 25 | CONFIG_INITRAMFS_SOURCE="" |
26 | CONFIG_RD_BZIP2=y | 26 | CONFIG_RD_BZIP2=y |
27 | CONFIG_RD_LZMA=y | 27 | CONFIG_RD_LZMA=y |
28 | CONFIG_INITRAMFS_COMPRESSION_GZIP=y | 28 | CONFIG_INITRAMFS_COMPRESSION_GZIP=y |
diff --git a/arch/mips/configs/powertv_defconfig b/arch/mips/configs/powertv_defconfig index 3b0b6e8c8533..7fda0ce5f692 100644 --- a/arch/mips/configs/powertv_defconfig +++ b/arch/mips/configs/powertv_defconfig | |||
@@ -6,7 +6,7 @@ CONFIG_HZ_1000=y | |||
6 | CONFIG_PREEMPT=y | 6 | CONFIG_PREEMPT=y |
7 | # CONFIG_SECCOMP is not set | 7 | # CONFIG_SECCOMP is not set |
8 | CONFIG_EXPERIMENTAL=y | 8 | CONFIG_EXPERIMENTAL=y |
9 | CONFIG_CROSS_COMPILE="mips-linux-" | 9 | CONFIG_CROSS_COMPILE="" |
10 | # CONFIG_SWAP is not set | 10 | # CONFIG_SWAP is not set |
11 | CONFIG_SYSVIPC=y | 11 | CONFIG_SYSVIPC=y |
12 | CONFIG_LOG_BUF_SHIFT=16 | 12 | CONFIG_LOG_BUF_SHIFT=16 |
diff --git a/arch/mips/include/asm/mach-au1x00/gpio-au1300.h b/arch/mips/include/asm/mach-au1x00/gpio-au1300.h index 556e1be20bf6..fb9975c74c57 100644 --- a/arch/mips/include/asm/mach-au1x00/gpio-au1300.h +++ b/arch/mips/include/asm/mach-au1x00/gpio-au1300.h | |||
@@ -11,6 +11,9 @@ | |||
11 | #include <asm/io.h> | 11 | #include <asm/io.h> |
12 | #include <asm/mach-au1x00/au1000.h> | 12 | #include <asm/mach-au1x00/au1000.h> |
13 | 13 | ||
14 | struct gpio; | ||
15 | struct gpio_chip; | ||
16 | |||
14 | /* with the current GPIC design, up to 128 GPIOs are possible. | 17 | /* with the current GPIC design, up to 128 GPIOs are possible. |
15 | * The only implementation so far is in the Au1300, which has 75 externally | 18 | * The only implementation so far is in the Au1300, which has 75 externally |
16 | * available GPIOs. | 19 | * available GPIOs. |
@@ -203,7 +206,22 @@ static inline int gpio_request(unsigned int gpio, const char *label) | |||
203 | return 0; | 206 | return 0; |
204 | } | 207 | } |
205 | 208 | ||
206 | static inline void gpio_free(unsigned int gpio) | 209 | static inline int gpio_request_one(unsigned gpio, |
210 | unsigned long flags, const char *label) | ||
211 | { | ||
212 | return 0; | ||
213 | } | ||
214 | |||
215 | static inline int gpio_request_array(struct gpio *array, size_t num) | ||
216 | { | ||
217 | return 0; | ||
218 | } | ||
219 | |||
220 | static inline void gpio_free(unsigned gpio) | ||
221 | { | ||
222 | } | ||
223 | |||
224 | static inline void gpio_free_array(struct gpio *array, size_t num) | ||
207 | { | 225 | { |
208 | } | 226 | } |
209 | 227 | ||
diff --git a/arch/mips/include/asm/page.h b/arch/mips/include/asm/page.h index d41790928c64..da9bd7d270d1 100644 --- a/arch/mips/include/asm/page.h +++ b/arch/mips/include/asm/page.h | |||
@@ -39,9 +39,6 @@ | |||
39 | #define HPAGE_MASK (~(HPAGE_SIZE - 1)) | 39 | #define HPAGE_MASK (~(HPAGE_SIZE - 1)) |
40 | #define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT) | 40 | #define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT) |
41 | #else /* !CONFIG_HUGETLB_PAGE */ | 41 | #else /* !CONFIG_HUGETLB_PAGE */ |
42 | # ifndef BUILD_BUG | ||
43 | # define BUILD_BUG() do { extern void __build_bug(void); __build_bug(); } while (0) | ||
44 | # endif | ||
45 | #define HPAGE_SHIFT ({BUILD_BUG(); 0; }) | 42 | #define HPAGE_SHIFT ({BUILD_BUG(); 0; }) |
46 | #define HPAGE_SIZE ({BUILD_BUG(); 0; }) | 43 | #define HPAGE_SIZE ({BUILD_BUG(); 0; }) |
47 | #define HPAGE_MASK ({BUILD_BUG(); 0; }) | 44 | #define HPAGE_MASK ({BUILD_BUG(); 0; }) |
diff --git a/arch/mips/kernel/smp-bmips.c b/arch/mips/kernel/smp-bmips.c index 58fe71afd879..d5e950ab8527 100644 --- a/arch/mips/kernel/smp-bmips.c +++ b/arch/mips/kernel/smp-bmips.c | |||
@@ -8,7 +8,6 @@ | |||
8 | * SMP support for BMIPS | 8 | * SMP support for BMIPS |
9 | */ | 9 | */ |
10 | 10 | ||
11 | #include <linux/version.h> | ||
12 | #include <linux/init.h> | 11 | #include <linux/init.h> |
13 | #include <linux/sched.h> | 12 | #include <linux/sched.h> |
14 | #include <linux/mm.h> | 13 | #include <linux/mm.h> |
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index cc4a3f120f54..d79ae5437b58 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c | |||
@@ -1135,7 +1135,7 @@ asmlinkage void do_mt(struct pt_regs *regs) | |||
1135 | printk(KERN_DEBUG "YIELD Scheduler Exception\n"); | 1135 | printk(KERN_DEBUG "YIELD Scheduler Exception\n"); |
1136 | break; | 1136 | break; |
1137 | case 5: | 1137 | case 5: |
1138 | printk(KERN_DEBUG "Gating Storage Schedulier Exception\n"); | 1138 | printk(KERN_DEBUG "Gating Storage Scheduler Exception\n"); |
1139 | break; | 1139 | break; |
1140 | default: | 1140 | default: |
1141 | printk(KERN_DEBUG "*** UNKNOWN THREAD EXCEPTION %d ***\n", | 1141 | printk(KERN_DEBUG "*** UNKNOWN THREAD EXCEPTION %d ***\n", |
diff --git a/arch/mips/kernel/vmlinux.lds.S b/arch/mips/kernel/vmlinux.lds.S index a81176f44c74..924da5eb7031 100644 --- a/arch/mips/kernel/vmlinux.lds.S +++ b/arch/mips/kernel/vmlinux.lds.S | |||
@@ -69,7 +69,6 @@ SECTIONS | |||
69 | RODATA | 69 | RODATA |
70 | 70 | ||
71 | /* writeable */ | 71 | /* writeable */ |
72 | _sdata = .; /* Start of data section */ | ||
73 | .data : { /* Data */ | 72 | .data : { /* Data */ |
74 | . = . + DATAOFFSET; /* for CONFIG_MAPPED_KERNEL */ | 73 | . = . + DATAOFFSET; /* for CONFIG_MAPPED_KERNEL */ |
75 | 74 | ||
diff --git a/arch/mips/mm/fault.c b/arch/mips/mm/fault.c index 937cf3368164..69ebd586d7ff 100644 --- a/arch/mips/mm/fault.c +++ b/arch/mips/mm/fault.c | |||
@@ -42,6 +42,8 @@ asmlinkage void __kprobes do_page_fault(struct pt_regs *regs, unsigned long writ | |||
42 | const int field = sizeof(unsigned long) * 2; | 42 | const int field = sizeof(unsigned long) * 2; |
43 | siginfo_t info; | 43 | siginfo_t info; |
44 | int fault; | 44 | int fault; |
45 | unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE | | ||
46 | (write ? FAULT_FLAG_WRITE : 0); | ||
45 | 47 | ||
46 | #if 0 | 48 | #if 0 |
47 | printk("Cpu%d[%s:%d:%0*lx:%ld:%0*lx]\n", raw_smp_processor_id(), | 49 | printk("Cpu%d[%s:%d:%0*lx:%ld:%0*lx]\n", raw_smp_processor_id(), |
@@ -91,6 +93,7 @@ asmlinkage void __kprobes do_page_fault(struct pt_regs *regs, unsigned long writ | |||
91 | if (in_atomic() || !mm) | 93 | if (in_atomic() || !mm) |
92 | goto bad_area_nosemaphore; | 94 | goto bad_area_nosemaphore; |
93 | 95 | ||
96 | retry: | ||
94 | down_read(&mm->mmap_sem); | 97 | down_read(&mm->mmap_sem); |
95 | vma = find_vma(mm, address); | 98 | vma = find_vma(mm, address); |
96 | if (!vma) | 99 | if (!vma) |
@@ -144,7 +147,11 @@ good_area: | |||
144 | * make sure we exit gracefully rather than endlessly redo | 147 | * make sure we exit gracefully rather than endlessly redo |
145 | * the fault. | 148 | * the fault. |
146 | */ | 149 | */ |
147 | fault = handle_mm_fault(mm, vma, address, write ? FAULT_FLAG_WRITE : 0); | 150 | fault = handle_mm_fault(mm, vma, address, flags); |
151 | |||
152 | if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current)) | ||
153 | return; | ||
154 | |||
148 | perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address); | 155 | perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address); |
149 | if (unlikely(fault & VM_FAULT_ERROR)) { | 156 | if (unlikely(fault & VM_FAULT_ERROR)) { |
150 | if (fault & VM_FAULT_OOM) | 157 | if (fault & VM_FAULT_OOM) |
@@ -153,12 +160,27 @@ good_area: | |||
153 | goto do_sigbus; | 160 | goto do_sigbus; |
154 | BUG(); | 161 | BUG(); |
155 | } | 162 | } |
156 | if (fault & VM_FAULT_MAJOR) { | 163 | if (flags & FAULT_FLAG_ALLOW_RETRY) { |
157 | perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ, 1, regs, address); | 164 | if (fault & VM_FAULT_MAJOR) { |
158 | tsk->maj_flt++; | 165 | perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ, 1, |
159 | } else { | 166 | regs, address); |
160 | perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MIN, 1, regs, address); | 167 | tsk->maj_flt++; |
161 | tsk->min_flt++; | 168 | } else { |
169 | perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MIN, 1, | ||
170 | regs, address); | ||
171 | tsk->min_flt++; | ||
172 | } | ||
173 | if (fault & VM_FAULT_RETRY) { | ||
174 | flags &= ~FAULT_FLAG_ALLOW_RETRY; | ||
175 | |||
176 | /* | ||
177 | * No need to up_read(&mm->mmap_sem) as we would | ||
178 | * have already released it in __lock_page_or_retry | ||
179 | * in mm/filemap.c. | ||
180 | */ | ||
181 | |||
182 | goto retry; | ||
183 | } | ||
162 | } | 184 | } |
163 | 185 | ||
164 | up_read(&mm->mmap_sem); | 186 | up_read(&mm->mmap_sem); |
diff --git a/arch/mips/pci/pci.c b/arch/mips/pci/pci.c index aec2b111d35b..15521505ebe8 100644 --- a/arch/mips/pci/pci.c +++ b/arch/mips/pci/pci.c | |||
@@ -279,7 +279,6 @@ void __devinit pcibios_fixup_bus(struct pci_bus *bus) | |||
279 | { | 279 | { |
280 | /* Propagate hose info into the subordinate devices. */ | 280 | /* Propagate hose info into the subordinate devices. */ |
281 | 281 | ||
282 | struct list_head *ln; | ||
283 | struct pci_dev *dev = bus->self; | 282 | struct pci_dev *dev = bus->self; |
284 | 283 | ||
285 | if (pci_probe_only && dev && | 284 | if (pci_probe_only && dev && |
@@ -288,9 +287,7 @@ void __devinit pcibios_fixup_bus(struct pci_bus *bus) | |||
288 | pcibios_fixup_device_resources(dev, bus); | 287 | pcibios_fixup_device_resources(dev, bus); |
289 | } | 288 | } |
290 | 289 | ||
291 | for (ln = bus->devices.next; ln != &bus->devices; ln = ln->next) { | 290 | list_for_each_entry(dev, &bus->devices, bus_list) { |
292 | dev = pci_dev_b(ln); | ||
293 | |||
294 | if ((dev->class >> 8) != PCI_CLASS_BRIDGE_PCI) | 291 | if ((dev->class >> 8) != PCI_CLASS_BRIDGE_PCI) |
295 | pcibios_fixup_device_resources(dev, bus); | 292 | pcibios_fixup_device_resources(dev, bus); |
296 | } | 293 | } |
diff --git a/arch/mips/pmc-sierra/yosemite/ht-irq.c b/arch/mips/pmc-sierra/yosemite/ht-irq.c index 86b98e98fb4f..62ead6601c69 100644 --- a/arch/mips/pmc-sierra/yosemite/ht-irq.c +++ b/arch/mips/pmc-sierra/yosemite/ht-irq.c | |||
@@ -35,16 +35,6 @@ | |||
35 | */ | 35 | */ |
36 | void __init titan_ht_pcibios_fixup_bus(struct pci_bus *bus) | 36 | void __init titan_ht_pcibios_fixup_bus(struct pci_bus *bus) |
37 | { | 37 | { |
38 | struct pci_bus *current_bus = bus; | ||
39 | struct pci_dev *devices; | ||
40 | struct list_head *devices_link; | ||
41 | |||
42 | list_for_each(devices_link, &(current_bus->devices)) { | ||
43 | devices = pci_dev_b(devices_link); | ||
44 | if (devices == NULL) | ||
45 | continue; | ||
46 | } | ||
47 | |||
48 | /* | 38 | /* |
49 | * PLX and SPKT related changes go here | 39 | * PLX and SPKT related changes go here |
50 | */ | 40 | */ |
diff --git a/arch/mips/txx9/generic/7segled.c b/arch/mips/txx9/generic/7segled.c index 8e93b2122524..4642f56e70e5 100644 --- a/arch/mips/txx9/generic/7segled.c +++ b/arch/mips/txx9/generic/7segled.c | |||
@@ -102,7 +102,7 @@ static int __init tx_7segled_init_sysfs(void) | |||
102 | break; | 102 | break; |
103 | } | 103 | } |
104 | dev->id = i; | 104 | dev->id = i; |
105 | dev->dev = &tx_7segled_subsys; | 105 | dev->bus = &tx_7segled_subsys; |
106 | error = device_register(dev); | 106 | error = device_register(dev); |
107 | if (!error) { | 107 | if (!error) { |
108 | device_create_file(dev, &dev_attr_ascii); | 108 | device_create_file(dev, &dev_attr_ascii); |
diff --git a/arch/x86/ia32/ia32_aout.c b/arch/x86/ia32/ia32_aout.c index fd843877e841..39e49091f648 100644 --- a/arch/x86/ia32/ia32_aout.c +++ b/arch/x86/ia32/ia32_aout.c | |||
@@ -315,6 +315,13 @@ static int load_aout_binary(struct linux_binprm *bprm, struct pt_regs *regs) | |||
315 | current->mm->free_area_cache = TASK_UNMAPPED_BASE; | 315 | current->mm->free_area_cache = TASK_UNMAPPED_BASE; |
316 | current->mm->cached_hole_size = 0; | 316 | current->mm->cached_hole_size = 0; |
317 | 317 | ||
318 | retval = setup_arg_pages(bprm, IA32_STACK_TOP, EXSTACK_DEFAULT); | ||
319 | if (retval < 0) { | ||
320 | /* Someone check-me: is this error path enough? */ | ||
321 | send_sig(SIGKILL, current, 0); | ||
322 | return retval; | ||
323 | } | ||
324 | |||
318 | install_exec_creds(bprm); | 325 | install_exec_creds(bprm); |
319 | current->flags &= ~PF_FORKNOEXEC; | 326 | current->flags &= ~PF_FORKNOEXEC; |
320 | 327 | ||
@@ -410,13 +417,6 @@ beyond_if: | |||
410 | 417 | ||
411 | set_brk(current->mm->start_brk, current->mm->brk); | 418 | set_brk(current->mm->start_brk, current->mm->brk); |
412 | 419 | ||
413 | retval = setup_arg_pages(bprm, IA32_STACK_TOP, EXSTACK_DEFAULT); | ||
414 | if (retval < 0) { | ||
415 | /* Someone check-me: is this error path enough? */ | ||
416 | send_sig(SIGKILL, current, 0); | ||
417 | return retval; | ||
418 | } | ||
419 | |||
420 | current->mm->start_stack = | 420 | current->mm->start_stack = |
421 | (unsigned long)create_aout_tables((char __user *)bprm->p, bprm); | 421 | (unsigned long)create_aout_tables((char __user *)bprm->p, bprm); |
422 | /* start thread */ | 422 | /* start thread */ |
diff --git a/arch/x86/lib/delay.c b/arch/x86/lib/delay.c index fc45ba887d05..e395693abdb1 100644 --- a/arch/x86/lib/delay.c +++ b/arch/x86/lib/delay.c | |||
@@ -48,9 +48,9 @@ static void delay_loop(unsigned long loops) | |||
48 | } | 48 | } |
49 | 49 | ||
50 | /* TSC based delay: */ | 50 | /* TSC based delay: */ |
51 | static void delay_tsc(unsigned long loops) | 51 | static void delay_tsc(unsigned long __loops) |
52 | { | 52 | { |
53 | unsigned long bclock, now; | 53 | u32 bclock, now, loops = __loops; |
54 | int cpu; | 54 | int cpu; |
55 | 55 | ||
56 | preempt_disable(); | 56 | preempt_disable(); |
diff --git a/arch/x86/mm/hugetlbpage.c b/arch/x86/mm/hugetlbpage.c index f581a18c0d4d..8ecbb4bba4b3 100644 --- a/arch/x86/mm/hugetlbpage.c +++ b/arch/x86/mm/hugetlbpage.c | |||
@@ -333,13 +333,15 @@ try_again: | |||
333 | * Lookup failure means no vma is above this address, | 333 | * Lookup failure means no vma is above this address, |
334 | * i.e. return with success: | 334 | * i.e. return with success: |
335 | */ | 335 | */ |
336 | if (!(vma = find_vma_prev(mm, addr, &prev_vma))) | 336 | vma = find_vma(mm, addr); |
337 | if (!vma) | ||
337 | return addr; | 338 | return addr; |
338 | 339 | ||
339 | /* | 340 | /* |
340 | * new region fits between prev_vma->vm_end and | 341 | * new region fits between prev_vma->vm_end and |
341 | * vma->vm_start, use it: | 342 | * vma->vm_start, use it: |
342 | */ | 343 | */ |
344 | prev_vma = vma->vm_prev; | ||
343 | if (addr + len <= vma->vm_start && | 345 | if (addr + len <= vma->vm_start && |
344 | (!prev_vma || (addr >= prev_vma->vm_end))) { | 346 | (!prev_vma || (addr >= prev_vma->vm_end))) { |
345 | /* remember the address as a hint for next time */ | 347 | /* remember the address as a hint for next time */ |
diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c index a312e76063a7..49a5cb55429b 100644 --- a/arch/x86/pci/acpi.c +++ b/arch/x86/pci/acpi.c | |||
@@ -60,6 +60,16 @@ static const struct dmi_system_id pci_use_crs_table[] __initconst = { | |||
60 | DMI_MATCH(DMI_BIOS_VENDOR, "American Megatrends Inc."), | 60 | DMI_MATCH(DMI_BIOS_VENDOR, "American Megatrends Inc."), |
61 | }, | 61 | }, |
62 | }, | 62 | }, |
63 | /* https://bugzilla.kernel.org/show_bug.cgi?id=42619 */ | ||
64 | { | ||
65 | .callback = set_use_crs, | ||
66 | .ident = "MSI MS-7253", | ||
67 | .matches = { | ||
68 | DMI_MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"), | ||
69 | DMI_MATCH(DMI_BOARD_NAME, "MS-7253"), | ||
70 | DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies, LTD"), | ||
71 | }, | ||
72 | }, | ||
63 | 73 | ||
64 | /* Now for the blacklist.. */ | 74 | /* Now for the blacklist.. */ |
65 | 75 | ||
@@ -282,9 +292,6 @@ static void add_resources(struct pci_root_info *info) | |||
282 | int i; | 292 | int i; |
283 | struct resource *res, *root, *conflict; | 293 | struct resource *res, *root, *conflict; |
284 | 294 | ||
285 | if (!pci_use_crs) | ||
286 | return; | ||
287 | |||
288 | coalesce_windows(info, IORESOURCE_MEM); | 295 | coalesce_windows(info, IORESOURCE_MEM); |
289 | coalesce_windows(info, IORESOURCE_IO); | 296 | coalesce_windows(info, IORESOURCE_IO); |
290 | 297 | ||
@@ -336,8 +343,13 @@ get_current_resources(struct acpi_device *device, int busnum, | |||
336 | acpi_walk_resources(device->handle, METHOD_NAME__CRS, setup_resource, | 343 | acpi_walk_resources(device->handle, METHOD_NAME__CRS, setup_resource, |
337 | &info); | 344 | &info); |
338 | 345 | ||
339 | add_resources(&info); | 346 | if (pci_use_crs) { |
340 | return; | 347 | add_resources(&info); |
348 | |||
349 | return; | ||
350 | } | ||
351 | |||
352 | kfree(info.name); | ||
341 | 353 | ||
342 | name_alloc_fail: | 354 | name_alloc_fail: |
343 | kfree(info.res); | 355 | kfree(info.res); |
diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c index 9baf11e86362..744f078f4dd8 100644 --- a/drivers/block/floppy.c +++ b/drivers/block/floppy.c | |||
@@ -3832,7 +3832,7 @@ static int __floppy_read_block_0(struct block_device *bdev) | |||
3832 | bio.bi_size = size; | 3832 | bio.bi_size = size; |
3833 | bio.bi_bdev = bdev; | 3833 | bio.bi_bdev = bdev; |
3834 | bio.bi_sector = 0; | 3834 | bio.bi_sector = 0; |
3835 | bio.bi_flags = BIO_QUIET; | 3835 | bio.bi_flags = (1 << BIO_QUIET); |
3836 | init_completion(&complete); | 3836 | init_completion(&complete); |
3837 | bio.bi_private = &complete; | 3837 | bio.bi_private = &complete; |
3838 | bio.bi_end_io = floppy_rb0_complete; | 3838 | bio.bi_end_io = floppy_rb0_complete; |
diff --git a/drivers/gpu/drm/gma500/cdv_device.c b/drivers/gpu/drm/gma500/cdv_device.c index 4a5b099c3bc5..53404af2e748 100644 --- a/drivers/gpu/drm/gma500/cdv_device.c +++ b/drivers/gpu/drm/gma500/cdv_device.c | |||
@@ -321,6 +321,8 @@ static int cdv_chip_setup(struct drm_device *dev) | |||
321 | cdv_get_core_freq(dev); | 321 | cdv_get_core_freq(dev); |
322 | gma_intel_opregion_init(dev); | 322 | gma_intel_opregion_init(dev); |
323 | psb_intel_init_bios(dev); | 323 | psb_intel_init_bios(dev); |
324 | REG_WRITE(PORT_HOTPLUG_EN, 0); | ||
325 | REG_WRITE(PORT_HOTPLUG_STAT, REG_READ(PORT_HOTPLUG_STAT)); | ||
324 | return 0; | 326 | return 0; |
325 | } | 327 | } |
326 | 328 | ||
diff --git a/drivers/gpu/drm/gma500/framebuffer.c b/drivers/gpu/drm/gma500/framebuffer.c index 830dfdd6bf15..be616735ec91 100644 --- a/drivers/gpu/drm/gma500/framebuffer.c +++ b/drivers/gpu/drm/gma500/framebuffer.c | |||
@@ -247,7 +247,6 @@ static struct fb_ops psbfb_roll_ops = { | |||
247 | .fb_imageblit = cfb_imageblit, | 247 | .fb_imageblit = cfb_imageblit, |
248 | .fb_pan_display = psbfb_pan, | 248 | .fb_pan_display = psbfb_pan, |
249 | .fb_mmap = psbfb_mmap, | 249 | .fb_mmap = psbfb_mmap, |
250 | .fb_sync = psbfb_sync, | ||
251 | .fb_ioctl = psbfb_ioctl, | 250 | .fb_ioctl = psbfb_ioctl, |
252 | }; | 251 | }; |
253 | 252 | ||
diff --git a/drivers/gpu/drm/gma500/gtt.c b/drivers/gpu/drm/gma500/gtt.c index 5d5330f667f1..aff194fbe9f3 100644 --- a/drivers/gpu/drm/gma500/gtt.c +++ b/drivers/gpu/drm/gma500/gtt.c | |||
@@ -446,10 +446,9 @@ int psb_gtt_init(struct drm_device *dev, int resume) | |||
446 | pg->gtt_start = pci_resource_start(dev->pdev, PSB_GTT_RESOURCE); | 446 | pg->gtt_start = pci_resource_start(dev->pdev, PSB_GTT_RESOURCE); |
447 | gtt_pages = pci_resource_len(dev->pdev, PSB_GTT_RESOURCE) | 447 | gtt_pages = pci_resource_len(dev->pdev, PSB_GTT_RESOURCE) |
448 | >> PAGE_SHIFT; | 448 | >> PAGE_SHIFT; |
449 | /* Some CDV firmware doesn't report this currently. In which case the | 449 | /* CDV doesn't report this. In which case the system has 64 gtt pages */ |
450 | system has 64 gtt pages */ | ||
451 | if (pg->gtt_start == 0 || gtt_pages == 0) { | 450 | if (pg->gtt_start == 0 || gtt_pages == 0) { |
452 | dev_err(dev->dev, "GTT PCI BAR not initialized.\n"); | 451 | dev_dbg(dev->dev, "GTT PCI BAR not initialized.\n"); |
453 | gtt_pages = 64; | 452 | gtt_pages = 64; |
454 | pg->gtt_start = dev_priv->pge_ctl; | 453 | pg->gtt_start = dev_priv->pge_ctl; |
455 | } | 454 | } |
@@ -461,10 +460,10 @@ int psb_gtt_init(struct drm_device *dev, int resume) | |||
461 | 460 | ||
462 | if (pg->gatt_pages == 0 || pg->gatt_start == 0) { | 461 | if (pg->gatt_pages == 0 || pg->gatt_start == 0) { |
463 | static struct resource fudge; /* Preferably peppermint */ | 462 | static struct resource fudge; /* Preferably peppermint */ |
464 | /* This can occur on CDV SDV systems. Fudge it in this case. | 463 | /* This can occur on CDV systems. Fudge it in this case. |
465 | We really don't care what imaginary space is being allocated | 464 | We really don't care what imaginary space is being allocated |
466 | at this point */ | 465 | at this point */ |
467 | dev_err(dev->dev, "GATT PCI BAR not initialized.\n"); | 466 | dev_dbg(dev->dev, "GATT PCI BAR not initialized.\n"); |
468 | pg->gatt_start = 0x40000000; | 467 | pg->gatt_start = 0x40000000; |
469 | pg->gatt_pages = (128 * 1024 * 1024) >> PAGE_SHIFT; | 468 | pg->gatt_pages = (128 * 1024 * 1024) >> PAGE_SHIFT; |
470 | /* This is a little confusing but in fact the GTT is providing | 469 | /* This is a little confusing but in fact the GTT is providing |
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index fbcd84803b60..17ca72ce3027 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
@@ -2362,6 +2362,9 @@ void r600_semaphore_ring_emit(struct radeon_device *rdev, | |||
2362 | uint64_t addr = semaphore->gpu_addr; | 2362 | uint64_t addr = semaphore->gpu_addr; |
2363 | unsigned sel = emit_wait ? PACKET3_SEM_SEL_WAIT : PACKET3_SEM_SEL_SIGNAL; | 2363 | unsigned sel = emit_wait ? PACKET3_SEM_SEL_WAIT : PACKET3_SEM_SEL_SIGNAL; |
2364 | 2364 | ||
2365 | if (rdev->family < CHIP_CAYMAN) | ||
2366 | sel |= PACKET3_SEM_WAIT_ON_SIGNAL; | ||
2367 | |||
2365 | radeon_ring_write(ring, PACKET3(PACKET3_MEM_SEMAPHORE, 1)); | 2368 | radeon_ring_write(ring, PACKET3(PACKET3_MEM_SEMAPHORE, 1)); |
2366 | radeon_ring_write(ring, addr & 0xffffffff); | 2369 | radeon_ring_write(ring, addr & 0xffffffff); |
2367 | radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | sel); | 2370 | radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | sel); |
diff --git a/drivers/gpu/drm/radeon/r600_blit_shaders.c b/drivers/gpu/drm/radeon/r600_blit_shaders.c index 2d1f6c5ee2a7..73e2c7c6edbc 100644 --- a/drivers/gpu/drm/radeon/r600_blit_shaders.c +++ b/drivers/gpu/drm/radeon/r600_blit_shaders.c | |||
@@ -314,6 +314,10 @@ const u32 r6xx_default_state[] = | |||
314 | 0x00000000, /* VGT_VTX_CNT_EN */ | 314 | 0x00000000, /* VGT_VTX_CNT_EN */ |
315 | 315 | ||
316 | 0xc0016900, | 316 | 0xc0016900, |
317 | 0x000000d4, | ||
318 | 0x00000000, /* SX_MISC */ | ||
319 | |||
320 | 0xc0016900, | ||
317 | 0x000002c8, | 321 | 0x000002c8, |
318 | 0x00000000, /* VGT_STRMOUT_BUFFER_EN */ | 322 | 0x00000000, /* VGT_STRMOUT_BUFFER_EN */ |
319 | 323 | ||
@@ -626,6 +630,10 @@ const u32 r7xx_default_state[] = | |||
626 | 0x00000000, /* VGT_VTX_CNT_EN */ | 630 | 0x00000000, /* VGT_VTX_CNT_EN */ |
627 | 631 | ||
628 | 0xc0016900, | 632 | 0xc0016900, |
633 | 0x000000d4, | ||
634 | 0x00000000, /* SX_MISC */ | ||
635 | |||
636 | 0xc0016900, | ||
629 | 0x000002c8, | 637 | 0x000002c8, |
630 | 0x00000000, /* VGT_STRMOUT_BUFFER_EN */ | 638 | 0x00000000, /* VGT_STRMOUT_BUFFER_EN */ |
631 | 639 | ||
diff --git a/drivers/gpu/drm/radeon/r600d.h b/drivers/gpu/drm/radeon/r600d.h index 3ee1fd7ef394..9b23670716f1 100644 --- a/drivers/gpu/drm/radeon/r600d.h +++ b/drivers/gpu/drm/radeon/r600d.h | |||
@@ -831,6 +831,7 @@ | |||
831 | #define PACKET3_STRMOUT_BUFFER_UPDATE 0x34 | 831 | #define PACKET3_STRMOUT_BUFFER_UPDATE 0x34 |
832 | #define PACKET3_INDIRECT_BUFFER_MP 0x38 | 832 | #define PACKET3_INDIRECT_BUFFER_MP 0x38 |
833 | #define PACKET3_MEM_SEMAPHORE 0x39 | 833 | #define PACKET3_MEM_SEMAPHORE 0x39 |
834 | # define PACKET3_SEM_WAIT_ON_SIGNAL (0x1 << 12) | ||
834 | # define PACKET3_SEM_SEL_SIGNAL (0x6 << 29) | 835 | # define PACKET3_SEM_SEL_SIGNAL (0x6 << 29) |
835 | # define PACKET3_SEM_SEL_WAIT (0x7 << 29) | 836 | # define PACKET3_SEM_SEL_WAIT (0x7 << 29) |
836 | #define PACKET3_MPEG_INDEX 0x3A | 837 | #define PACKET3_MPEG_INDEX 0x3A |
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c index 8b3d8ed52ff6..8c9a8115b632 100644 --- a/drivers/gpu/drm/radeon/radeon_connectors.c +++ b/drivers/gpu/drm/radeon/radeon_connectors.c | |||
@@ -1057,7 +1057,7 @@ static int radeon_dvi_mode_valid(struct drm_connector *connector, | |||
1057 | (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_B)) | 1057 | (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_B)) |
1058 | return MODE_OK; | 1058 | return MODE_OK; |
1059 | else if (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_A) { | 1059 | else if (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_A) { |
1060 | if (ASIC_IS_DCE3(rdev)) { | 1060 | if (0) { |
1061 | /* HDMI 1.3+ supports max clock of 340 Mhz */ | 1061 | /* HDMI 1.3+ supports max clock of 340 Mhz */ |
1062 | if (mode->clock > 340000) | 1062 | if (mode->clock > 340000) |
1063 | return MODE_CLOCK_HIGH; | 1063 | return MODE_CLOCK_HIGH; |
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c index 8c49fef1ce78..3d314338d843 100644 --- a/drivers/gpu/drm/radeon/radeon_display.c +++ b/drivers/gpu/drm/radeon/radeon_display.c | |||
@@ -1078,15 +1078,21 @@ static const struct drm_framebuffer_funcs radeon_fb_funcs = { | |||
1078 | .create_handle = radeon_user_framebuffer_create_handle, | 1078 | .create_handle = radeon_user_framebuffer_create_handle, |
1079 | }; | 1079 | }; |
1080 | 1080 | ||
1081 | void | 1081 | int |
1082 | radeon_framebuffer_init(struct drm_device *dev, | 1082 | radeon_framebuffer_init(struct drm_device *dev, |
1083 | struct radeon_framebuffer *rfb, | 1083 | struct radeon_framebuffer *rfb, |
1084 | struct drm_mode_fb_cmd2 *mode_cmd, | 1084 | struct drm_mode_fb_cmd2 *mode_cmd, |
1085 | struct drm_gem_object *obj) | 1085 | struct drm_gem_object *obj) |
1086 | { | 1086 | { |
1087 | int ret; | ||
1087 | rfb->obj = obj; | 1088 | rfb->obj = obj; |
1088 | drm_framebuffer_init(dev, &rfb->base, &radeon_fb_funcs); | 1089 | ret = drm_framebuffer_init(dev, &rfb->base, &radeon_fb_funcs); |
1090 | if (ret) { | ||
1091 | rfb->obj = NULL; | ||
1092 | return ret; | ||
1093 | } | ||
1089 | drm_helper_mode_fill_fb_struct(&rfb->base, mode_cmd); | 1094 | drm_helper_mode_fill_fb_struct(&rfb->base, mode_cmd); |
1095 | return 0; | ||
1090 | } | 1096 | } |
1091 | 1097 | ||
1092 | static struct drm_framebuffer * | 1098 | static struct drm_framebuffer * |
@@ -1096,6 +1102,7 @@ radeon_user_framebuffer_create(struct drm_device *dev, | |||
1096 | { | 1102 | { |
1097 | struct drm_gem_object *obj; | 1103 | struct drm_gem_object *obj; |
1098 | struct radeon_framebuffer *radeon_fb; | 1104 | struct radeon_framebuffer *radeon_fb; |
1105 | int ret; | ||
1099 | 1106 | ||
1100 | obj = drm_gem_object_lookup(dev, file_priv, mode_cmd->handles[0]); | 1107 | obj = drm_gem_object_lookup(dev, file_priv, mode_cmd->handles[0]); |
1101 | if (obj == NULL) { | 1108 | if (obj == NULL) { |
@@ -1108,7 +1115,12 @@ radeon_user_framebuffer_create(struct drm_device *dev, | |||
1108 | if (radeon_fb == NULL) | 1115 | if (radeon_fb == NULL) |
1109 | return ERR_PTR(-ENOMEM); | 1116 | return ERR_PTR(-ENOMEM); |
1110 | 1117 | ||
1111 | radeon_framebuffer_init(dev, radeon_fb, mode_cmd, obj); | 1118 | ret = radeon_framebuffer_init(dev, radeon_fb, mode_cmd, obj); |
1119 | if (ret) { | ||
1120 | kfree(radeon_fb); | ||
1121 | drm_gem_object_unreference_unlocked(obj); | ||
1122 | return NULL; | ||
1123 | } | ||
1112 | 1124 | ||
1113 | return &radeon_fb->base; | 1125 | return &radeon_fb->base; |
1114 | } | 1126 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c b/drivers/gpu/drm/radeon/radeon_encoders.c index 9419c51bcf50..26e92708d114 100644 --- a/drivers/gpu/drm/radeon/radeon_encoders.c +++ b/drivers/gpu/drm/radeon/radeon_encoders.c | |||
@@ -307,8 +307,6 @@ void radeon_panel_mode_fixup(struct drm_encoder *encoder, | |||
307 | bool radeon_dig_monitor_is_duallink(struct drm_encoder *encoder, | 307 | bool radeon_dig_monitor_is_duallink(struct drm_encoder *encoder, |
308 | u32 pixel_clock) | 308 | u32 pixel_clock) |
309 | { | 309 | { |
310 | struct drm_device *dev = encoder->dev; | ||
311 | struct radeon_device *rdev = dev->dev_private; | ||
312 | struct drm_connector *connector; | 310 | struct drm_connector *connector; |
313 | struct radeon_connector *radeon_connector; | 311 | struct radeon_connector *radeon_connector; |
314 | struct radeon_connector_atom_dig *dig_connector; | 312 | struct radeon_connector_atom_dig *dig_connector; |
@@ -326,7 +324,7 @@ bool radeon_dig_monitor_is_duallink(struct drm_encoder *encoder, | |||
326 | case DRM_MODE_CONNECTOR_HDMIB: | 324 | case DRM_MODE_CONNECTOR_HDMIB: |
327 | if (radeon_connector->use_digital) { | 325 | if (radeon_connector->use_digital) { |
328 | /* HDMI 1.3 supports up to 340 Mhz over single link */ | 326 | /* HDMI 1.3 supports up to 340 Mhz over single link */ |
329 | if (ASIC_IS_DCE3(rdev) && drm_detect_hdmi_monitor(radeon_connector->edid)) { | 327 | if (0 && drm_detect_hdmi_monitor(radeon_connector->edid)) { |
330 | if (pixel_clock > 340000) | 328 | if (pixel_clock > 340000) |
331 | return true; | 329 | return true; |
332 | else | 330 | else |
@@ -348,7 +346,7 @@ bool radeon_dig_monitor_is_duallink(struct drm_encoder *encoder, | |||
348 | return false; | 346 | return false; |
349 | else { | 347 | else { |
350 | /* HDMI 1.3 supports up to 340 Mhz over single link */ | 348 | /* HDMI 1.3 supports up to 340 Mhz over single link */ |
351 | if (ASIC_IS_DCE3(rdev) && drm_detect_hdmi_monitor(radeon_connector->edid)) { | 349 | if (0 && drm_detect_hdmi_monitor(radeon_connector->edid)) { |
352 | if (pixel_clock > 340000) | 350 | if (pixel_clock > 340000) |
353 | return true; | 351 | return true; |
354 | else | 352 | else |
diff --git a/drivers/gpu/drm/radeon/radeon_fb.c b/drivers/gpu/drm/radeon/radeon_fb.c index cf2bf35b56b8..195471cf65d3 100644 --- a/drivers/gpu/drm/radeon/radeon_fb.c +++ b/drivers/gpu/drm/radeon/radeon_fb.c | |||
@@ -209,6 +209,11 @@ static int radeonfb_create(struct radeon_fbdev *rfbdev, | |||
209 | sizes->surface_depth); | 209 | sizes->surface_depth); |
210 | 210 | ||
211 | ret = radeonfb_create_pinned_object(rfbdev, &mode_cmd, &gobj); | 211 | ret = radeonfb_create_pinned_object(rfbdev, &mode_cmd, &gobj); |
212 | if (ret) { | ||
213 | DRM_ERROR("failed to create fbcon object %d\n", ret); | ||
214 | return ret; | ||
215 | } | ||
216 | |||
212 | rbo = gem_to_radeon_bo(gobj); | 217 | rbo = gem_to_radeon_bo(gobj); |
213 | 218 | ||
214 | /* okay we have an object now allocate the framebuffer */ | 219 | /* okay we have an object now allocate the framebuffer */ |
@@ -220,7 +225,11 @@ static int radeonfb_create(struct radeon_fbdev *rfbdev, | |||
220 | 225 | ||
221 | info->par = rfbdev; | 226 | info->par = rfbdev; |
222 | 227 | ||
223 | radeon_framebuffer_init(rdev->ddev, &rfbdev->rfb, &mode_cmd, gobj); | 228 | ret = radeon_framebuffer_init(rdev->ddev, &rfbdev->rfb, &mode_cmd, gobj); |
229 | if (ret) { | ||
230 | DRM_ERROR("failed to initalise framebuffer %d\n", ret); | ||
231 | goto out_unref; | ||
232 | } | ||
224 | 233 | ||
225 | fb = &rfbdev->rfb.base; | 234 | fb = &rfbdev->rfb.base; |
226 | 235 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h index 4330e3253573..8a85598fb242 100644 --- a/drivers/gpu/drm/radeon/radeon_mode.h +++ b/drivers/gpu/drm/radeon/radeon_mode.h | |||
@@ -649,7 +649,7 @@ extern void radeon_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green, | |||
649 | u16 blue, int regno); | 649 | u16 blue, int regno); |
650 | extern void radeon_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green, | 650 | extern void radeon_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green, |
651 | u16 *blue, int regno); | 651 | u16 *blue, int regno); |
652 | void radeon_framebuffer_init(struct drm_device *dev, | 652 | int radeon_framebuffer_init(struct drm_device *dev, |
653 | struct radeon_framebuffer *rfb, | 653 | struct radeon_framebuffer *rfb, |
654 | struct drm_mode_fb_cmd2 *mode_cmd, | 654 | struct drm_mode_fb_cmd2 *mode_cmd, |
655 | struct drm_gem_object *obj); | 655 | struct drm_gem_object *obj); |
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index b8574cddd953..63552e30d0c3 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h | |||
@@ -59,6 +59,9 @@ | |||
59 | #define USB_VENDOR_ID_AIRCABLE 0x16CA | 59 | #define USB_VENDOR_ID_AIRCABLE 0x16CA |
60 | #define USB_DEVICE_ID_AIRCABLE1 0x1502 | 60 | #define USB_DEVICE_ID_AIRCABLE1 0x1502 |
61 | 61 | ||
62 | #define USB_VENDOR_ID_AIREN 0x1a2c | ||
63 | #define USB_DEVICE_ID_AIREN_SLIMPLUS 0x0002 | ||
64 | |||
62 | #define USB_VENDOR_ID_ALCOR 0x058f | 65 | #define USB_VENDOR_ID_ALCOR 0x058f |
63 | #define USB_DEVICE_ID_ALCOR_USBRS232 0x9720 | 66 | #define USB_DEVICE_ID_ALCOR_USBRS232 0x9720 |
64 | 67 | ||
diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c index 9333d692a786..627850a54d34 100644 --- a/drivers/hid/hid-input.c +++ b/drivers/hid/hid-input.c | |||
@@ -986,8 +986,13 @@ void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct | |||
986 | return; | 986 | return; |
987 | } | 987 | } |
988 | 988 | ||
989 | /* Ignore out-of-range values as per HID specification, section 5.10 */ | 989 | /* |
990 | if (value < field->logical_minimum || value > field->logical_maximum) { | 990 | * Ignore out-of-range values as per HID specification, |
991 | * section 5.10 and 6.2.25 | ||
992 | */ | ||
993 | if ((field->flags & HID_MAIN_ITEM_VARIABLE) && | ||
994 | (value < field->logical_minimum || | ||
995 | value > field->logical_maximum)) { | ||
991 | dbg_hid("Ignoring out-of-range value %x\n", value); | 996 | dbg_hid("Ignoring out-of-range value %x\n", value); |
992 | return; | 997 | return; |
993 | } | 998 | } |
diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c index c831af937481..57d4e1e1df48 100644 --- a/drivers/hid/usbhid/hid-quirks.c +++ b/drivers/hid/usbhid/hid-quirks.c | |||
@@ -54,6 +54,7 @@ static const struct hid_blacklist { | |||
54 | { USB_VENDOR_ID_PLAYDOTCOM, USB_DEVICE_ID_PLAYDOTCOM_EMS_USBII, HID_QUIRK_MULTI_INPUT }, | 54 | { USB_VENDOR_ID_PLAYDOTCOM, USB_DEVICE_ID_PLAYDOTCOM_EMS_USBII, HID_QUIRK_MULTI_INPUT }, |
55 | { USB_VENDOR_ID_TOUCHPACK, USB_DEVICE_ID_TOUCHPACK_RTS, HID_QUIRK_MULTI_INPUT }, | 55 | { USB_VENDOR_ID_TOUCHPACK, USB_DEVICE_ID_TOUCHPACK_RTS, HID_QUIRK_MULTI_INPUT }, |
56 | 56 | ||
57 | { USB_VENDOR_ID_AIREN, USB_DEVICE_ID_AIREN_SLIMPLUS, HID_QUIRK_NOGET }, | ||
57 | { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_UC100KM, HID_QUIRK_NOGET }, | 58 | { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_UC100KM, HID_QUIRK_NOGET }, |
58 | { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_CS124U, HID_QUIRK_NOGET }, | 59 | { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_CS124U, HID_QUIRK_NOGET }, |
59 | { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_2PORTKVM, HID_QUIRK_NOGET }, | 60 | { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_2PORTKVM, HID_QUIRK_NOGET }, |
diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig index 02260406b9e4..dad895fec62a 100644 --- a/drivers/hwmon/Kconfig +++ b/drivers/hwmon/Kconfig | |||
@@ -497,8 +497,9 @@ config SENSORS_JC42 | |||
497 | If you say yes here, you get support for JEDEC JC42.4 compliant | 497 | If you say yes here, you get support for JEDEC JC42.4 compliant |
498 | temperature sensors, which are used on many DDR3 memory modules for | 498 | temperature sensors, which are used on many DDR3 memory modules for |
499 | mobile devices and servers. Support will include, but not be limited | 499 | mobile devices and servers. Support will include, but not be limited |
500 | to, ADT7408, CAT34TS02, CAT6095, MAX6604, MCP9805, MCP98242, MCP98243, | 500 | to, ADT7408, AT30TS00, CAT34TS02, CAT6095, MAX6604, MCP9804, MCP9805, |
501 | MCP9843, SE97, SE98, STTS424(E), TSE2002B3, and TS3000B3. | 501 | MCP98242, MCP98243, MCP9843, SE97, SE98, STTS424(E), STTS2002, |
502 | STTS3000, TSE2002B3, TSE2002GB2, TS3000B3, and TS3000GB2. | ||
502 | 503 | ||
503 | This driver can also be built as a module. If so, the module | 504 | This driver can also be built as a module. If so, the module |
504 | will be called jc42. | 505 | will be called jc42. |
diff --git a/drivers/hwmon/jc42.c b/drivers/hwmon/jc42.c index 28c09eead36b..b927ee5ccdd7 100644 --- a/drivers/hwmon/jc42.c +++ b/drivers/hwmon/jc42.c | |||
@@ -64,6 +64,7 @@ static const unsigned short normal_i2c[] = { | |||
64 | 64 | ||
65 | /* Manufacturer IDs */ | 65 | /* Manufacturer IDs */ |
66 | #define ADT_MANID 0x11d4 /* Analog Devices */ | 66 | #define ADT_MANID 0x11d4 /* Analog Devices */ |
67 | #define ATMEL_MANID 0x001f /* Atmel */ | ||
67 | #define MAX_MANID 0x004d /* Maxim */ | 68 | #define MAX_MANID 0x004d /* Maxim */ |
68 | #define IDT_MANID 0x00b3 /* IDT */ | 69 | #define IDT_MANID 0x00b3 /* IDT */ |
69 | #define MCP_MANID 0x0054 /* Microchip */ | 70 | #define MCP_MANID 0x0054 /* Microchip */ |
@@ -77,15 +78,25 @@ static const unsigned short normal_i2c[] = { | |||
77 | #define ADT7408_DEVID 0x0801 | 78 | #define ADT7408_DEVID 0x0801 |
78 | #define ADT7408_DEVID_MASK 0xffff | 79 | #define ADT7408_DEVID_MASK 0xffff |
79 | 80 | ||
81 | /* Atmel */ | ||
82 | #define AT30TS00_DEVID 0x8201 | ||
83 | #define AT30TS00_DEVID_MASK 0xffff | ||
84 | |||
80 | /* IDT */ | 85 | /* IDT */ |
81 | #define TS3000B3_DEVID 0x2903 /* Also matches TSE2002B3 */ | 86 | #define TS3000B3_DEVID 0x2903 /* Also matches TSE2002B3 */ |
82 | #define TS3000B3_DEVID_MASK 0xffff | 87 | #define TS3000B3_DEVID_MASK 0xffff |
83 | 88 | ||
89 | #define TS3000GB2_DEVID 0x2912 /* Also matches TSE2002GB2 */ | ||
90 | #define TS3000GB2_DEVID_MASK 0xffff | ||
91 | |||
84 | /* Maxim */ | 92 | /* Maxim */ |
85 | #define MAX6604_DEVID 0x3e00 | 93 | #define MAX6604_DEVID 0x3e00 |
86 | #define MAX6604_DEVID_MASK 0xffff | 94 | #define MAX6604_DEVID_MASK 0xffff |
87 | 95 | ||
88 | /* Microchip */ | 96 | /* Microchip */ |
97 | #define MCP9804_DEVID 0x0200 | ||
98 | #define MCP9804_DEVID_MASK 0xfffc | ||
99 | |||
89 | #define MCP98242_DEVID 0x2000 | 100 | #define MCP98242_DEVID 0x2000 |
90 | #define MCP98242_DEVID_MASK 0xfffc | 101 | #define MCP98242_DEVID_MASK 0xfffc |
91 | 102 | ||
@@ -113,6 +124,12 @@ static const unsigned short normal_i2c[] = { | |||
113 | #define STTS424E_DEVID 0x0000 | 124 | #define STTS424E_DEVID 0x0000 |
114 | #define STTS424E_DEVID_MASK 0xfffe | 125 | #define STTS424E_DEVID_MASK 0xfffe |
115 | 126 | ||
127 | #define STTS2002_DEVID 0x0300 | ||
128 | #define STTS2002_DEVID_MASK 0xffff | ||
129 | |||
130 | #define STTS3000_DEVID 0x0200 | ||
131 | #define STTS3000_DEVID_MASK 0xffff | ||
132 | |||
116 | static u16 jc42_hysteresis[] = { 0, 1500, 3000, 6000 }; | 133 | static u16 jc42_hysteresis[] = { 0, 1500, 3000, 6000 }; |
117 | 134 | ||
118 | struct jc42_chips { | 135 | struct jc42_chips { |
@@ -123,8 +140,11 @@ struct jc42_chips { | |||
123 | 140 | ||
124 | static struct jc42_chips jc42_chips[] = { | 141 | static struct jc42_chips jc42_chips[] = { |
125 | { ADT_MANID, ADT7408_DEVID, ADT7408_DEVID_MASK }, | 142 | { ADT_MANID, ADT7408_DEVID, ADT7408_DEVID_MASK }, |
143 | { ATMEL_MANID, AT30TS00_DEVID, AT30TS00_DEVID_MASK }, | ||
126 | { IDT_MANID, TS3000B3_DEVID, TS3000B3_DEVID_MASK }, | 144 | { IDT_MANID, TS3000B3_DEVID, TS3000B3_DEVID_MASK }, |
145 | { IDT_MANID, TS3000GB2_DEVID, TS3000GB2_DEVID_MASK }, | ||
127 | { MAX_MANID, MAX6604_DEVID, MAX6604_DEVID_MASK }, | 146 | { MAX_MANID, MAX6604_DEVID, MAX6604_DEVID_MASK }, |
147 | { MCP_MANID, MCP9804_DEVID, MCP9804_DEVID_MASK }, | ||
128 | { MCP_MANID, MCP98242_DEVID, MCP98242_DEVID_MASK }, | 148 | { MCP_MANID, MCP98242_DEVID, MCP98242_DEVID_MASK }, |
129 | { MCP_MANID, MCP98243_DEVID, MCP98243_DEVID_MASK }, | 149 | { MCP_MANID, MCP98243_DEVID, MCP98243_DEVID_MASK }, |
130 | { MCP_MANID, MCP9843_DEVID, MCP9843_DEVID_MASK }, | 150 | { MCP_MANID, MCP9843_DEVID, MCP9843_DEVID_MASK }, |
@@ -133,6 +153,8 @@ static struct jc42_chips jc42_chips[] = { | |||
133 | { NXP_MANID, SE98_DEVID, SE98_DEVID_MASK }, | 153 | { NXP_MANID, SE98_DEVID, SE98_DEVID_MASK }, |
134 | { STM_MANID, STTS424_DEVID, STTS424_DEVID_MASK }, | 154 | { STM_MANID, STTS424_DEVID, STTS424_DEVID_MASK }, |
135 | { STM_MANID, STTS424E_DEVID, STTS424E_DEVID_MASK }, | 155 | { STM_MANID, STTS424E_DEVID, STTS424E_DEVID_MASK }, |
156 | { STM_MANID, STTS2002_DEVID, STTS2002_DEVID_MASK }, | ||
157 | { STM_MANID, STTS3000_DEVID, STTS3000_DEVID_MASK }, | ||
136 | }; | 158 | }; |
137 | 159 | ||
138 | /* Each client has this additional data */ | 160 | /* Each client has this additional data */ |
@@ -159,10 +181,12 @@ static struct jc42_data *jc42_update_device(struct device *dev); | |||
159 | 181 | ||
160 | static const struct i2c_device_id jc42_id[] = { | 182 | static const struct i2c_device_id jc42_id[] = { |
161 | { "adt7408", 0 }, | 183 | { "adt7408", 0 }, |
184 | { "at30ts00", 0 }, | ||
162 | { "cat94ts02", 0 }, | 185 | { "cat94ts02", 0 }, |
163 | { "cat6095", 0 }, | 186 | { "cat6095", 0 }, |
164 | { "jc42", 0 }, | 187 | { "jc42", 0 }, |
165 | { "max6604", 0 }, | 188 | { "max6604", 0 }, |
189 | { "mcp9804", 0 }, | ||
166 | { "mcp9805", 0 }, | 190 | { "mcp9805", 0 }, |
167 | { "mcp98242", 0 }, | 191 | { "mcp98242", 0 }, |
168 | { "mcp98243", 0 }, | 192 | { "mcp98243", 0 }, |
@@ -171,8 +195,10 @@ static const struct i2c_device_id jc42_id[] = { | |||
171 | { "se97b", 0 }, | 195 | { "se97b", 0 }, |
172 | { "se98", 0 }, | 196 | { "se98", 0 }, |
173 | { "stts424", 0 }, | 197 | { "stts424", 0 }, |
174 | { "tse2002b3", 0 }, | 198 | { "stts2002", 0 }, |
175 | { "ts3000b3", 0 }, | 199 | { "stts3000", 0 }, |
200 | { "tse2002", 0 }, | ||
201 | { "ts3000", 0 }, | ||
176 | { } | 202 | { } |
177 | }; | 203 | }; |
178 | MODULE_DEVICE_TABLE(i2c, jc42_id); | 204 | MODULE_DEVICE_TABLE(i2c, jc42_id); |
diff --git a/drivers/hwmon/pmbus/pmbus_core.c b/drivers/hwmon/pmbus/pmbus_core.c index 00460d8d8423..d89b33967a85 100644 --- a/drivers/hwmon/pmbus/pmbus_core.c +++ b/drivers/hwmon/pmbus/pmbus_core.c | |||
@@ -54,7 +54,8 @@ | |||
54 | lcrit_alarm, crit_alarm */ | 54 | lcrit_alarm, crit_alarm */ |
55 | #define PMBUS_IOUT_BOOLEANS_PER_PAGE 3 /* alarm, lcrit_alarm, | 55 | #define PMBUS_IOUT_BOOLEANS_PER_PAGE 3 /* alarm, lcrit_alarm, |
56 | crit_alarm */ | 56 | crit_alarm */ |
57 | #define PMBUS_POUT_BOOLEANS_PER_PAGE 2 /* alarm, crit_alarm */ | 57 | #define PMBUS_POUT_BOOLEANS_PER_PAGE 3 /* cap_alarm, alarm, crit_alarm |
58 | */ | ||
58 | #define PMBUS_MAX_BOOLEANS_PER_FAN 2 /* alarm, fault */ | 59 | #define PMBUS_MAX_BOOLEANS_PER_FAN 2 /* alarm, fault */ |
59 | #define PMBUS_MAX_BOOLEANS_PER_TEMP 4 /* min_alarm, max_alarm, | 60 | #define PMBUS_MAX_BOOLEANS_PER_TEMP 4 /* min_alarm, max_alarm, |
60 | lcrit_alarm, crit_alarm */ | 61 | lcrit_alarm, crit_alarm */ |
diff --git a/drivers/hwmon/pmbus/zl6100.c b/drivers/hwmon/pmbus/zl6100.c index 48c7b4a716ae..880b90cf4d32 100644 --- a/drivers/hwmon/pmbus/zl6100.c +++ b/drivers/hwmon/pmbus/zl6100.c | |||
@@ -33,6 +33,7 @@ enum chips { zl2004, zl2005, zl2006, zl2008, zl2105, zl2106, zl6100, zl6105 }; | |||
33 | struct zl6100_data { | 33 | struct zl6100_data { |
34 | int id; | 34 | int id; |
35 | ktime_t access; /* chip access time */ | 35 | ktime_t access; /* chip access time */ |
36 | int delay; /* Delay between chip accesses in uS */ | ||
36 | struct pmbus_driver_info info; | 37 | struct pmbus_driver_info info; |
37 | }; | 38 | }; |
38 | 39 | ||
@@ -52,10 +53,10 @@ MODULE_PARM_DESC(delay, "Delay between chip accesses in uS"); | |||
52 | /* Some chips need a delay between accesses */ | 53 | /* Some chips need a delay between accesses */ |
53 | static inline void zl6100_wait(const struct zl6100_data *data) | 54 | static inline void zl6100_wait(const struct zl6100_data *data) |
54 | { | 55 | { |
55 | if (delay) { | 56 | if (data->delay) { |
56 | s64 delta = ktime_us_delta(ktime_get(), data->access); | 57 | s64 delta = ktime_us_delta(ktime_get(), data->access); |
57 | if (delta < delay) | 58 | if (delta < data->delay) |
58 | udelay(delay - delta); | 59 | udelay(data->delay - delta); |
59 | } | 60 | } |
60 | } | 61 | } |
61 | 62 | ||
@@ -207,8 +208,9 @@ static int zl6100_probe(struct i2c_client *client, | |||
207 | * can be cleared later for additional chips if tests show that it | 208 | * can be cleared later for additional chips if tests show that it |
208 | * is not needed (in other words, better be safe than sorry). | 209 | * is not needed (in other words, better be safe than sorry). |
209 | */ | 210 | */ |
211 | data->delay = delay; | ||
210 | if (data->id == zl2004 || data->id == zl6105) | 212 | if (data->id == zl2004 || data->id == zl6105) |
211 | delay = 0; | 213 | data->delay = 0; |
212 | 214 | ||
213 | /* | 215 | /* |
214 | * Since there was a direct I2C device access above, wait before | 216 | * Since there was a direct I2C device access above, wait before |
diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c index afc166fcc3d9..7df5bfef2624 100644 --- a/drivers/input/evdev.c +++ b/drivers/input/evdev.c | |||
@@ -332,7 +332,7 @@ static ssize_t evdev_write(struct file *file, const char __user *buffer, | |||
332 | struct evdev_client *client = file->private_data; | 332 | struct evdev_client *client = file->private_data; |
333 | struct evdev *evdev = client->evdev; | 333 | struct evdev *evdev = client->evdev; |
334 | struct input_event event; | 334 | struct input_event event; |
335 | int retval; | 335 | int retval = 0; |
336 | 336 | ||
337 | if (count < input_event_size()) | 337 | if (count < input_event_size()) |
338 | return -EINVAL; | 338 | return -EINVAL; |
diff --git a/drivers/input/misc/twl4030-vibra.c b/drivers/input/misc/twl4030-vibra.c index 37651373a95b..f3bc4189a7ba 100644 --- a/drivers/input/misc/twl4030-vibra.c +++ b/drivers/input/misc/twl4030-vibra.c | |||
@@ -172,7 +172,7 @@ static void twl4030_vibra_close(struct input_dev *input) | |||
172 | } | 172 | } |
173 | 173 | ||
174 | /*** Module ***/ | 174 | /*** Module ***/ |
175 | #if CONFIG_PM | 175 | #if CONFIG_PM_SLEEP |
176 | static int twl4030_vibra_suspend(struct device *dev) | 176 | static int twl4030_vibra_suspend(struct device *dev) |
177 | { | 177 | { |
178 | struct platform_device *pdev = to_platform_device(dev); | 178 | struct platform_device *pdev = to_platform_device(dev); |
@@ -189,10 +189,10 @@ static int twl4030_vibra_resume(struct device *dev) | |||
189 | vibra_disable_leds(); | 189 | vibra_disable_leds(); |
190 | return 0; | 190 | return 0; |
191 | } | 191 | } |
192 | #endif | ||
192 | 193 | ||
193 | static SIMPLE_DEV_PM_OPS(twl4030_vibra_pm_ops, | 194 | static SIMPLE_DEV_PM_OPS(twl4030_vibra_pm_ops, |
194 | twl4030_vibra_suspend, twl4030_vibra_resume); | 195 | twl4030_vibra_suspend, twl4030_vibra_resume); |
195 | #endif | ||
196 | 196 | ||
197 | static int __devinit twl4030_vibra_probe(struct platform_device *pdev) | 197 | static int __devinit twl4030_vibra_probe(struct platform_device *pdev) |
198 | { | 198 | { |
@@ -273,9 +273,7 @@ static struct platform_driver twl4030_vibra_driver = { | |||
273 | .driver = { | 273 | .driver = { |
274 | .name = "twl4030-vibra", | 274 | .name = "twl4030-vibra", |
275 | .owner = THIS_MODULE, | 275 | .owner = THIS_MODULE, |
276 | #ifdef CONFIG_PM | ||
277 | .pm = &twl4030_vibra_pm_ops, | 276 | .pm = &twl4030_vibra_pm_ops, |
278 | #endif | ||
279 | }, | 277 | }, |
280 | }; | 278 | }; |
281 | module_platform_driver(twl4030_vibra_driver); | 279 | module_platform_driver(twl4030_vibra_driver); |
diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c index bd87380bd879..4c6a72d3d48c 100644 --- a/drivers/input/mouse/alps.c +++ b/drivers/input/mouse/alps.c | |||
@@ -952,7 +952,9 @@ static const struct alps_model_info *alps_get_model(struct psmouse *psmouse, int | |||
952 | 952 | ||
953 | /* | 953 | /* |
954 | * First try "E6 report". | 954 | * First try "E6 report". |
955 | * ALPS should return 0,0,10 or 0,0,100 | 955 | * ALPS should return 0,0,10 or 0,0,100 if no buttons are pressed. |
956 | * The bits 0-2 of the first byte will be 1s if some buttons are | ||
957 | * pressed. | ||
956 | */ | 958 | */ |
957 | param[0] = 0; | 959 | param[0] = 0; |
958 | if (ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES) || | 960 | if (ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES) || |
@@ -968,7 +970,8 @@ static const struct alps_model_info *alps_get_model(struct psmouse *psmouse, int | |||
968 | psmouse_dbg(psmouse, "E6 report: %2.2x %2.2x %2.2x", | 970 | psmouse_dbg(psmouse, "E6 report: %2.2x %2.2x %2.2x", |
969 | param[0], param[1], param[2]); | 971 | param[0], param[1], param[2]); |
970 | 972 | ||
971 | if (param[0] != 0 || param[1] != 0 || (param[2] != 10 && param[2] != 100)) | 973 | if ((param[0] & 0xf8) != 0 || param[1] != 0 || |
974 | (param[2] != 10 && param[2] != 100)) | ||
972 | return NULL; | 975 | return NULL; |
973 | 976 | ||
974 | /* | 977 | /* |
diff --git a/drivers/input/tablet/Kconfig b/drivers/input/tablet/Kconfig index 58a87755b936..e53f4081a586 100644 --- a/drivers/input/tablet/Kconfig +++ b/drivers/input/tablet/Kconfig | |||
@@ -77,6 +77,8 @@ config TABLET_USB_WACOM | |||
77 | tristate "Wacom Intuos/Graphire tablet support (USB)" | 77 | tristate "Wacom Intuos/Graphire tablet support (USB)" |
78 | depends on USB_ARCH_HAS_HCD | 78 | depends on USB_ARCH_HAS_HCD |
79 | select USB | 79 | select USB |
80 | select NEW_LEDS | ||
81 | select LEDS_CLASS | ||
80 | help | 82 | help |
81 | Say Y here if you want to use the USB version of the Wacom Intuos | 83 | Say Y here if you want to use the USB version of the Wacom Intuos |
82 | or Graphire tablet. Make sure to say Y to "Mouse support" | 84 | or Graphire tablet. Make sure to say Y to "Mouse support" |
diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c index 88672ec296c1..cd3ed29e0801 100644 --- a/drivers/input/tablet/wacom_wac.c +++ b/drivers/input/tablet/wacom_wac.c | |||
@@ -926,7 +926,7 @@ static int wacom_bpt3_touch(struct wacom_wac *wacom) | |||
926 | { | 926 | { |
927 | struct input_dev *input = wacom->input; | 927 | struct input_dev *input = wacom->input; |
928 | unsigned char *data = wacom->data; | 928 | unsigned char *data = wacom->data; |
929 | int count = data[1] & 0x03; | 929 | int count = data[1] & 0x07; |
930 | int i; | 930 | int i; |
931 | 931 | ||
932 | if (data[0] != 0x02) | 932 | if (data[0] != 0x02) |
diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c index bdea288dc185..a35e98ad9725 100644 --- a/drivers/iommu/amd_iommu_init.c +++ b/drivers/iommu/amd_iommu_init.c | |||
@@ -275,7 +275,7 @@ static void iommu_set_exclusion_range(struct amd_iommu *iommu) | |||
275 | } | 275 | } |
276 | 276 | ||
277 | /* Programs the physical address of the device table into the IOMMU hardware */ | 277 | /* Programs the physical address of the device table into the IOMMU hardware */ |
278 | static void __init iommu_set_device_table(struct amd_iommu *iommu) | 278 | static void iommu_set_device_table(struct amd_iommu *iommu) |
279 | { | 279 | { |
280 | u64 entry; | 280 | u64 entry; |
281 | 281 | ||
diff --git a/drivers/md/dm-flakey.c b/drivers/md/dm-flakey.c index 9fb18c147825..b280c433e4a0 100644 --- a/drivers/md/dm-flakey.c +++ b/drivers/md/dm-flakey.c | |||
@@ -323,7 +323,7 @@ static int flakey_end_io(struct dm_target *ti, struct bio *bio, | |||
323 | * Corrupt successful READs while in down state. | 323 | * Corrupt successful READs while in down state. |
324 | * If flags were specified, only corrupt those that match. | 324 | * If flags were specified, only corrupt those that match. |
325 | */ | 325 | */ |
326 | if (!error && bio_submitted_while_down && | 326 | if (fc->corrupt_bio_byte && !error && bio_submitted_while_down && |
327 | (bio_data_dir(bio) == READ) && (fc->corrupt_bio_rw == READ) && | 327 | (bio_data_dir(bio) == READ) && (fc->corrupt_bio_rw == READ) && |
328 | all_corrupt_bio_flags_match(bio, fc)) | 328 | all_corrupt_bio_flags_match(bio, fc)) |
329 | corrupt_bio_data(bio, fc); | 329 | corrupt_bio_data(bio, fc); |
diff --git a/drivers/md/dm-io.c b/drivers/md/dm-io.c index ad2eba40e319..ea5dd289fe2a 100644 --- a/drivers/md/dm-io.c +++ b/drivers/md/dm-io.c | |||
@@ -296,6 +296,8 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where, | |||
296 | unsigned offset; | 296 | unsigned offset; |
297 | unsigned num_bvecs; | 297 | unsigned num_bvecs; |
298 | sector_t remaining = where->count; | 298 | sector_t remaining = where->count; |
299 | struct request_queue *q = bdev_get_queue(where->bdev); | ||
300 | sector_t discard_sectors; | ||
299 | 301 | ||
300 | /* | 302 | /* |
301 | * where->count may be zero if rw holds a flush and we need to | 303 | * where->count may be zero if rw holds a flush and we need to |
@@ -305,9 +307,12 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where, | |||
305 | /* | 307 | /* |
306 | * Allocate a suitably sized-bio. | 308 | * Allocate a suitably sized-bio. |
307 | */ | 309 | */ |
308 | num_bvecs = dm_sector_div_up(remaining, | 310 | if (rw & REQ_DISCARD) |
309 | (PAGE_SIZE >> SECTOR_SHIFT)); | 311 | num_bvecs = 1; |
310 | num_bvecs = min_t(int, bio_get_nr_vecs(where->bdev), num_bvecs); | 312 | else |
313 | num_bvecs = min_t(int, bio_get_nr_vecs(where->bdev), | ||
314 | dm_sector_div_up(remaining, (PAGE_SIZE >> SECTOR_SHIFT))); | ||
315 | |||
311 | bio = bio_alloc_bioset(GFP_NOIO, num_bvecs, io->client->bios); | 316 | bio = bio_alloc_bioset(GFP_NOIO, num_bvecs, io->client->bios); |
312 | bio->bi_sector = where->sector + (where->count - remaining); | 317 | bio->bi_sector = where->sector + (where->count - remaining); |
313 | bio->bi_bdev = where->bdev; | 318 | bio->bi_bdev = where->bdev; |
@@ -315,10 +320,14 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where, | |||
315 | bio->bi_destructor = dm_bio_destructor; | 320 | bio->bi_destructor = dm_bio_destructor; |
316 | store_io_and_region_in_bio(bio, io, region); | 321 | store_io_and_region_in_bio(bio, io, region); |
317 | 322 | ||
318 | /* | 323 | if (rw & REQ_DISCARD) { |
319 | * Try and add as many pages as possible. | 324 | discard_sectors = min_t(sector_t, q->limits.max_discard_sectors, remaining); |
320 | */ | 325 | bio->bi_size = discard_sectors << SECTOR_SHIFT; |
321 | while (remaining) { | 326 | remaining -= discard_sectors; |
327 | } else while (remaining) { | ||
328 | /* | ||
329 | * Try and add as many pages as possible. | ||
330 | */ | ||
322 | dp->get_page(dp, &page, &len, &offset); | 331 | dp->get_page(dp, &page, &len, &offset); |
323 | len = min(len, to_bytes(remaining)); | 332 | len = min(len, to_bytes(remaining)); |
324 | if (!bio_add_page(bio, page, len, offset)) | 333 | if (!bio_add_page(bio, page, len, offset)) |
diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c index 31c2dc25886d..1ce84ed0b765 100644 --- a/drivers/md/dm-ioctl.c +++ b/drivers/md/dm-ioctl.c | |||
@@ -1437,7 +1437,7 @@ static int target_message(struct dm_ioctl *param, size_t param_size) | |||
1437 | 1437 | ||
1438 | if (!argc) { | 1438 | if (!argc) { |
1439 | DMWARN("Empty message received."); | 1439 | DMWARN("Empty message received."); |
1440 | goto out; | 1440 | goto out_argv; |
1441 | } | 1441 | } |
1442 | 1442 | ||
1443 | table = dm_get_live_table(md); | 1443 | table = dm_get_live_table(md); |
diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c index 86cb7e5d83d5..787022c18187 100644 --- a/drivers/md/dm-raid.c +++ b/drivers/md/dm-raid.c | |||
@@ -668,7 +668,14 @@ static int super_load(struct md_rdev *rdev, struct md_rdev *refdev) | |||
668 | return ret; | 668 | return ret; |
669 | 669 | ||
670 | sb = page_address(rdev->sb_page); | 670 | sb = page_address(rdev->sb_page); |
671 | if (sb->magic != cpu_to_le32(DM_RAID_MAGIC)) { | 671 | |
672 | /* | ||
673 | * Two cases that we want to write new superblocks and rebuild: | ||
674 | * 1) New device (no matching magic number) | ||
675 | * 2) Device specified for rebuild (!In_sync w/ offset == 0) | ||
676 | */ | ||
677 | if ((sb->magic != cpu_to_le32(DM_RAID_MAGIC)) || | ||
678 | (!test_bit(In_sync, &rdev->flags) && !rdev->recovery_offset)) { | ||
672 | super_sync(rdev->mddev, rdev); | 679 | super_sync(rdev->mddev, rdev); |
673 | 680 | ||
674 | set_bit(FirstUse, &rdev->flags); | 681 | set_bit(FirstUse, &rdev->flags); |
@@ -745,11 +752,8 @@ static int super_init_validation(struct mddev *mddev, struct md_rdev *rdev) | |||
745 | */ | 752 | */ |
746 | rdev_for_each(r, t, mddev) { | 753 | rdev_for_each(r, t, mddev) { |
747 | if (!test_bit(In_sync, &r->flags)) { | 754 | if (!test_bit(In_sync, &r->flags)) { |
748 | if (!test_bit(FirstUse, &r->flags)) | 755 | DMINFO("Device %d specified for rebuild: " |
749 | DMERR("Superblock area of " | 756 | "Clearing superblock", r->raid_disk); |
750 | "rebuild device %d should have been " | ||
751 | "cleared.", r->raid_disk); | ||
752 | set_bit(FirstUse, &r->flags); | ||
753 | rebuilds++; | 757 | rebuilds++; |
754 | } else if (test_bit(FirstUse, &r->flags)) | 758 | } else if (test_bit(FirstUse, &r->flags)) |
755 | new_devs++; | 759 | new_devs++; |
@@ -971,6 +975,7 @@ static int raid_ctr(struct dm_target *ti, unsigned argc, char **argv) | |||
971 | 975 | ||
972 | INIT_WORK(&rs->md.event_work, do_table_event); | 976 | INIT_WORK(&rs->md.event_work, do_table_event); |
973 | ti->private = rs; | 977 | ti->private = rs; |
978 | ti->num_flush_requests = 1; | ||
974 | 979 | ||
975 | mutex_lock(&rs->md.reconfig_mutex); | 980 | mutex_lock(&rs->md.reconfig_mutex); |
976 | ret = md_run(&rs->md); | 981 | ret = md_run(&rs->md); |
diff --git a/drivers/md/dm-thin-metadata.c b/drivers/md/dm-thin-metadata.c index 59c4f0446ffa..237571af77fd 100644 --- a/drivers/md/dm-thin-metadata.c +++ b/drivers/md/dm-thin-metadata.c | |||
@@ -385,6 +385,7 @@ static int init_pmd(struct dm_pool_metadata *pmd, | |||
385 | data_sm = dm_sm_disk_create(tm, nr_blocks); | 385 | data_sm = dm_sm_disk_create(tm, nr_blocks); |
386 | if (IS_ERR(data_sm)) { | 386 | if (IS_ERR(data_sm)) { |
387 | DMERR("sm_disk_create failed"); | 387 | DMERR("sm_disk_create failed"); |
388 | dm_tm_unlock(tm, sblock); | ||
388 | r = PTR_ERR(data_sm); | 389 | r = PTR_ERR(data_sm); |
389 | goto bad; | 390 | goto bad; |
390 | } | 391 | } |
@@ -789,6 +790,11 @@ int dm_pool_metadata_close(struct dm_pool_metadata *pmd) | |||
789 | return 0; | 790 | return 0; |
790 | } | 791 | } |
791 | 792 | ||
793 | /* | ||
794 | * __open_device: Returns @td corresponding to device with id @dev, | ||
795 | * creating it if @create is set and incrementing @td->open_count. | ||
796 | * On failure, @td is undefined. | ||
797 | */ | ||
792 | static int __open_device(struct dm_pool_metadata *pmd, | 798 | static int __open_device(struct dm_pool_metadata *pmd, |
793 | dm_thin_id dev, int create, | 799 | dm_thin_id dev, int create, |
794 | struct dm_thin_device **td) | 800 | struct dm_thin_device **td) |
@@ -799,10 +805,16 @@ static int __open_device(struct dm_pool_metadata *pmd, | |||
799 | struct disk_device_details details_le; | 805 | struct disk_device_details details_le; |
800 | 806 | ||
801 | /* | 807 | /* |
802 | * Check the device isn't already open. | 808 | * If the device is already open, return it. |
803 | */ | 809 | */ |
804 | list_for_each_entry(td2, &pmd->thin_devices, list) | 810 | list_for_each_entry(td2, &pmd->thin_devices, list) |
805 | if (td2->id == dev) { | 811 | if (td2->id == dev) { |
812 | /* | ||
813 | * May not create an already-open device. | ||
814 | */ | ||
815 | if (create) | ||
816 | return -EEXIST; | ||
817 | |||
806 | td2->open_count++; | 818 | td2->open_count++; |
807 | *td = td2; | 819 | *td = td2; |
808 | return 0; | 820 | return 0; |
@@ -817,6 +829,9 @@ static int __open_device(struct dm_pool_metadata *pmd, | |||
817 | if (r != -ENODATA || !create) | 829 | if (r != -ENODATA || !create) |
818 | return r; | 830 | return r; |
819 | 831 | ||
832 | /* | ||
833 | * Create new device. | ||
834 | */ | ||
820 | changed = 1; | 835 | changed = 1; |
821 | details_le.mapped_blocks = 0; | 836 | details_le.mapped_blocks = 0; |
822 | details_le.transaction_id = cpu_to_le64(pmd->trans_id); | 837 | details_le.transaction_id = cpu_to_le64(pmd->trans_id); |
@@ -882,12 +897,10 @@ static int __create_thin(struct dm_pool_metadata *pmd, | |||
882 | 897 | ||
883 | r = __open_device(pmd, dev, 1, &td); | 898 | r = __open_device(pmd, dev, 1, &td); |
884 | if (r) { | 899 | if (r) { |
885 | __close_device(td); | ||
886 | dm_btree_remove(&pmd->tl_info, pmd->root, &key, &pmd->root); | 900 | dm_btree_remove(&pmd->tl_info, pmd->root, &key, &pmd->root); |
887 | dm_btree_del(&pmd->bl_info, dev_root); | 901 | dm_btree_del(&pmd->bl_info, dev_root); |
888 | return r; | 902 | return r; |
889 | } | 903 | } |
890 | td->changed = 1; | ||
891 | __close_device(td); | 904 | __close_device(td); |
892 | 905 | ||
893 | return r; | 906 | return r; |
@@ -967,14 +980,14 @@ static int __create_snap(struct dm_pool_metadata *pmd, | |||
967 | goto bad; | 980 | goto bad; |
968 | 981 | ||
969 | r = __set_snapshot_details(pmd, td, origin, pmd->time); | 982 | r = __set_snapshot_details(pmd, td, origin, pmd->time); |
983 | __close_device(td); | ||
984 | |||
970 | if (r) | 985 | if (r) |
971 | goto bad; | 986 | goto bad; |
972 | 987 | ||
973 | __close_device(td); | ||
974 | return 0; | 988 | return 0; |
975 | 989 | ||
976 | bad: | 990 | bad: |
977 | __close_device(td); | ||
978 | dm_btree_remove(&pmd->tl_info, pmd->root, &key, &pmd->root); | 991 | dm_btree_remove(&pmd->tl_info, pmd->root, &key, &pmd->root); |
979 | dm_btree_remove(&pmd->details_info, pmd->details_root, | 992 | dm_btree_remove(&pmd->details_info, pmd->details_root, |
980 | &key, &pmd->details_root); | 993 | &key, &pmd->details_root); |
@@ -1211,6 +1224,8 @@ static int __remove(struct dm_thin_device *td, dm_block_t block) | |||
1211 | if (r) | 1224 | if (r) |
1212 | return r; | 1225 | return r; |
1213 | 1226 | ||
1227 | td->mapped_blocks--; | ||
1228 | td->changed = 1; | ||
1214 | pmd->need_commit = 1; | 1229 | pmd->need_commit = 1; |
1215 | 1230 | ||
1216 | return 0; | 1231 | return 0; |
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index a368db2431a5..a0b225eb4ac4 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
@@ -624,7 +624,7 @@ int md_raid1_congested(struct mddev *mddev, int bits) | |||
624 | return 1; | 624 | return 1; |
625 | 625 | ||
626 | rcu_read_lock(); | 626 | rcu_read_lock(); |
627 | for (i = 0; i < conf->raid_disks; i++) { | 627 | for (i = 0; i < conf->raid_disks * 2; i++) { |
628 | struct md_rdev *rdev = rcu_dereference(conf->mirrors[i].rdev); | 628 | struct md_rdev *rdev = rcu_dereference(conf->mirrors[i].rdev); |
629 | if (rdev && !test_bit(Faulty, &rdev->flags)) { | 629 | if (rdev && !test_bit(Faulty, &rdev->flags)) { |
630 | struct request_queue *q = bdev_get_queue(rdev->bdev); | 630 | struct request_queue *q = bdev_get_queue(rdev->bdev); |
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 6e8aa213f0d5..58c44d6453a0 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c | |||
@@ -67,6 +67,7 @@ static int max_queued_requests = 1024; | |||
67 | 67 | ||
68 | static void allow_barrier(struct r10conf *conf); | 68 | static void allow_barrier(struct r10conf *conf); |
69 | static void lower_barrier(struct r10conf *conf); | 69 | static void lower_barrier(struct r10conf *conf); |
70 | static int enough(struct r10conf *conf, int ignore); | ||
70 | 71 | ||
71 | static void * r10bio_pool_alloc(gfp_t gfp_flags, void *data) | 72 | static void * r10bio_pool_alloc(gfp_t gfp_flags, void *data) |
72 | { | 73 | { |
@@ -347,6 +348,19 @@ static void raid10_end_read_request(struct bio *bio, int error) | |||
347 | * wait for the 'master' bio. | 348 | * wait for the 'master' bio. |
348 | */ | 349 | */ |
349 | set_bit(R10BIO_Uptodate, &r10_bio->state); | 350 | set_bit(R10BIO_Uptodate, &r10_bio->state); |
351 | } else { | ||
352 | /* If all other devices that store this block have | ||
353 | * failed, we want to return the error upwards rather | ||
354 | * than fail the last device. Here we redefine | ||
355 | * "uptodate" to mean "Don't want to retry" | ||
356 | */ | ||
357 | unsigned long flags; | ||
358 | spin_lock_irqsave(&conf->device_lock, flags); | ||
359 | if (!enough(conf, rdev->raid_disk)) | ||
360 | uptodate = 1; | ||
361 | spin_unlock_irqrestore(&conf->device_lock, flags); | ||
362 | } | ||
363 | if (uptodate) { | ||
350 | raid_end_bio_io(r10_bio); | 364 | raid_end_bio_io(r10_bio); |
351 | rdev_dec_pending(rdev, conf->mddev); | 365 | rdev_dec_pending(rdev, conf->mddev); |
352 | } else { | 366 | } else { |
@@ -2052,6 +2066,7 @@ static void fix_read_error(struct r10conf *conf, struct mddev *mddev, struct r10 | |||
2052 | "md/raid10:%s: %s: Failing raid device\n", | 2066 | "md/raid10:%s: %s: Failing raid device\n", |
2053 | mdname(mddev), b); | 2067 | mdname(mddev), b); |
2054 | md_error(mddev, conf->mirrors[d].rdev); | 2068 | md_error(mddev, conf->mirrors[d].rdev); |
2069 | r10_bio->devs[r10_bio->read_slot].bio = IO_BLOCKED; | ||
2055 | return; | 2070 | return; |
2056 | } | 2071 | } |
2057 | 2072 | ||
@@ -2105,8 +2120,11 @@ static void fix_read_error(struct r10conf *conf, struct mddev *mddev, struct r10 | |||
2105 | rdev, | 2120 | rdev, |
2106 | r10_bio->devs[r10_bio->read_slot].addr | 2121 | r10_bio->devs[r10_bio->read_slot].addr |
2107 | + sect, | 2122 | + sect, |
2108 | s, 0)) | 2123 | s, 0)) { |
2109 | md_error(mddev, rdev); | 2124 | md_error(mddev, rdev); |
2125 | r10_bio->devs[r10_bio->read_slot].bio | ||
2126 | = IO_BLOCKED; | ||
2127 | } | ||
2110 | break; | 2128 | break; |
2111 | } | 2129 | } |
2112 | 2130 | ||
@@ -2299,17 +2317,20 @@ static void handle_read_error(struct mddev *mddev, struct r10bio *r10_bio) | |||
2299 | * This is all done synchronously while the array is | 2317 | * This is all done synchronously while the array is |
2300 | * frozen. | 2318 | * frozen. |
2301 | */ | 2319 | */ |
2320 | bio = r10_bio->devs[slot].bio; | ||
2321 | bdevname(bio->bi_bdev, b); | ||
2322 | bio_put(bio); | ||
2323 | r10_bio->devs[slot].bio = NULL; | ||
2324 | |||
2302 | if (mddev->ro == 0) { | 2325 | if (mddev->ro == 0) { |
2303 | freeze_array(conf); | 2326 | freeze_array(conf); |
2304 | fix_read_error(conf, mddev, r10_bio); | 2327 | fix_read_error(conf, mddev, r10_bio); |
2305 | unfreeze_array(conf); | 2328 | unfreeze_array(conf); |
2306 | } | 2329 | } else |
2330 | r10_bio->devs[slot].bio = IO_BLOCKED; | ||
2331 | |||
2307 | rdev_dec_pending(rdev, mddev); | 2332 | rdev_dec_pending(rdev, mddev); |
2308 | 2333 | ||
2309 | bio = r10_bio->devs[slot].bio; | ||
2310 | bdevname(bio->bi_bdev, b); | ||
2311 | r10_bio->devs[slot].bio = | ||
2312 | mddev->ro ? IO_BLOCKED : NULL; | ||
2313 | read_more: | 2334 | read_more: |
2314 | rdev = read_balance(conf, r10_bio, &max_sectors); | 2335 | rdev = read_balance(conf, r10_bio, &max_sectors); |
2315 | if (rdev == NULL) { | 2336 | if (rdev == NULL) { |
@@ -2318,13 +2339,10 @@ read_more: | |||
2318 | mdname(mddev), b, | 2339 | mdname(mddev), b, |
2319 | (unsigned long long)r10_bio->sector); | 2340 | (unsigned long long)r10_bio->sector); |
2320 | raid_end_bio_io(r10_bio); | 2341 | raid_end_bio_io(r10_bio); |
2321 | bio_put(bio); | ||
2322 | return; | 2342 | return; |
2323 | } | 2343 | } |
2324 | 2344 | ||
2325 | do_sync = (r10_bio->master_bio->bi_rw & REQ_SYNC); | 2345 | do_sync = (r10_bio->master_bio->bi_rw & REQ_SYNC); |
2326 | if (bio) | ||
2327 | bio_put(bio); | ||
2328 | slot = r10_bio->read_slot; | 2346 | slot = r10_bio->read_slot; |
2329 | printk_ratelimited( | 2347 | printk_ratelimited( |
2330 | KERN_ERR | 2348 | KERN_ERR |
@@ -2360,7 +2378,6 @@ read_more: | |||
2360 | mbio->bi_phys_segments++; | 2378 | mbio->bi_phys_segments++; |
2361 | spin_unlock_irq(&conf->device_lock); | 2379 | spin_unlock_irq(&conf->device_lock); |
2362 | generic_make_request(bio); | 2380 | generic_make_request(bio); |
2363 | bio = NULL; | ||
2364 | 2381 | ||
2365 | r10_bio = mempool_alloc(conf->r10bio_pool, | 2382 | r10_bio = mempool_alloc(conf->r10bio_pool, |
2366 | GFP_NOIO); | 2383 | GFP_NOIO); |
@@ -3243,7 +3260,6 @@ static int run(struct mddev *mddev) | |||
3243 | disk->rdev = rdev; | 3260 | disk->rdev = rdev; |
3244 | } | 3261 | } |
3245 | 3262 | ||
3246 | disk->rdev = rdev; | ||
3247 | disk_stack_limits(mddev->gendisk, rdev->bdev, | 3263 | disk_stack_limits(mddev->gendisk, rdev->bdev, |
3248 | rdev->data_offset << 9); | 3264 | rdev->data_offset << 9); |
3249 | /* as we don't honour merge_bvec_fn, we must never risk | 3265 | /* as we don't honour merge_bvec_fn, we must never risk |
diff --git a/drivers/mfd/ab8500-core.c b/drivers/mfd/ab8500-core.c index 53e2a80f42fa..d295941c9a3d 100644 --- a/drivers/mfd/ab8500-core.c +++ b/drivers/mfd/ab8500-core.c | |||
@@ -956,11 +956,12 @@ int __devinit ab8500_init(struct ab8500 *ab8500) | |||
956 | return ret; | 956 | return ret; |
957 | 957 | ||
958 | out_freeirq: | 958 | out_freeirq: |
959 | if (ab8500->irq_base) { | 959 | if (ab8500->irq_base) |
960 | free_irq(ab8500->irq, ab8500); | 960 | free_irq(ab8500->irq, ab8500); |
961 | out_removeirq: | 961 | out_removeirq: |
962 | if (ab8500->irq_base) | ||
962 | ab8500_irq_remove(ab8500); | 963 | ab8500_irq_remove(ab8500); |
963 | } | 964 | |
964 | return ret; | 965 | return ret; |
965 | } | 966 | } |
966 | 967 | ||
diff --git a/drivers/mfd/mfd-core.c b/drivers/mfd/mfd-core.c index 0f5922812bff..411f523d4878 100644 --- a/drivers/mfd/mfd-core.c +++ b/drivers/mfd/mfd-core.c | |||
@@ -123,7 +123,7 @@ static int mfd_add_device(struct device *parent, int id, | |||
123 | } | 123 | } |
124 | 124 | ||
125 | if (!cell->ignore_resource_conflicts) { | 125 | if (!cell->ignore_resource_conflicts) { |
126 | ret = acpi_check_resource_conflict(res); | 126 | ret = acpi_check_resource_conflict(&res[r]); |
127 | if (ret) | 127 | if (ret) |
128 | goto fail_res; | 128 | goto fail_res; |
129 | } | 129 | } |
diff --git a/drivers/mfd/s5m-core.c b/drivers/mfd/s5m-core.c index e075c113eec6..caadabeed8e9 100644 --- a/drivers/mfd/s5m-core.c +++ b/drivers/mfd/s5m-core.c | |||
@@ -105,7 +105,7 @@ static int s5m87xx_i2c_probe(struct i2c_client *i2c, | |||
105 | s5m87xx->rtc = i2c_new_dummy(i2c->adapter, RTC_I2C_ADDR); | 105 | s5m87xx->rtc = i2c_new_dummy(i2c->adapter, RTC_I2C_ADDR); |
106 | i2c_set_clientdata(s5m87xx->rtc, s5m87xx); | 106 | i2c_set_clientdata(s5m87xx->rtc, s5m87xx); |
107 | 107 | ||
108 | if (pdata->cfg_pmic_irq) | 108 | if (pdata && pdata->cfg_pmic_irq) |
109 | pdata->cfg_pmic_irq(); | 109 | pdata->cfg_pmic_irq(); |
110 | 110 | ||
111 | s5m_irq_init(s5m87xx); | 111 | s5m_irq_init(s5m87xx); |
diff --git a/drivers/mfd/tps65910.c b/drivers/mfd/tps65910.c index 01cf5012a08f..4392f6bca156 100644 --- a/drivers/mfd/tps65910.c +++ b/drivers/mfd/tps65910.c | |||
@@ -168,7 +168,7 @@ static int tps65910_i2c_probe(struct i2c_client *i2c, | |||
168 | goto err; | 168 | goto err; |
169 | 169 | ||
170 | init_data->irq = pmic_plat_data->irq; | 170 | init_data->irq = pmic_plat_data->irq; |
171 | init_data->irq_base = pmic_plat_data->irq; | 171 | init_data->irq_base = pmic_plat_data->irq_base; |
172 | 172 | ||
173 | tps65910_gpio_init(tps65910, pmic_plat_data->gpio_base); | 173 | tps65910_gpio_init(tps65910, pmic_plat_data->gpio_base); |
174 | 174 | ||
diff --git a/drivers/mfd/tps65912-core.c b/drivers/mfd/tps65912-core.c index 5fec23a9ac03..74fd8cb5f372 100644 --- a/drivers/mfd/tps65912-core.c +++ b/drivers/mfd/tps65912-core.c | |||
@@ -151,7 +151,7 @@ int tps65912_device_init(struct tps65912 *tps65912) | |||
151 | goto err; | 151 | goto err; |
152 | 152 | ||
153 | init_data->irq = pmic_plat_data->irq; | 153 | init_data->irq = pmic_plat_data->irq; |
154 | init_data->irq_base = pmic_plat_data->irq; | 154 | init_data->irq_base = pmic_plat_data->irq_base; |
155 | ret = tps65912_irq_init(tps65912, init_data->irq, init_data); | 155 | ret = tps65912_irq_init(tps65912, init_data->irq, init_data); |
156 | if (ret < 0) | 156 | if (ret < 0) |
157 | goto err; | 157 | goto err; |
diff --git a/drivers/mfd/wm8350-irq.c b/drivers/mfd/wm8350-irq.c index 8a1fafd0bf7d..9fd01bf63c51 100644 --- a/drivers/mfd/wm8350-irq.c +++ b/drivers/mfd/wm8350-irq.c | |||
@@ -496,7 +496,6 @@ int wm8350_irq_init(struct wm8350 *wm8350, int irq, | |||
496 | 496 | ||
497 | mutex_init(&wm8350->irq_lock); | 497 | mutex_init(&wm8350->irq_lock); |
498 | wm8350->chip_irq = irq; | 498 | wm8350->chip_irq = irq; |
499 | wm8350->irq_base = pdata->irq_base; | ||
500 | 499 | ||
501 | if (pdata && pdata->irq_base > 0) | 500 | if (pdata && pdata->irq_base > 0) |
502 | irq_base = pdata->irq_base; | 501 | irq_base = pdata->irq_base; |
diff --git a/drivers/mfd/wm8994-core.c b/drivers/mfd/wm8994-core.c index f117e7fb9321..a04b3c108c8c 100644 --- a/drivers/mfd/wm8994-core.c +++ b/drivers/mfd/wm8994-core.c | |||
@@ -256,6 +256,20 @@ static int wm8994_suspend(struct device *dev) | |||
256 | break; | 256 | break; |
257 | } | 257 | } |
258 | 258 | ||
259 | switch (wm8994->type) { | ||
260 | case WM1811: | ||
261 | ret = wm8994_reg_read(wm8994, WM8994_ANTIPOP_2); | ||
262 | if (ret < 0) { | ||
263 | dev_err(dev, "Failed to read jackdet: %d\n", ret); | ||
264 | } else if (ret & WM1811_JACKDET_MODE_MASK) { | ||
265 | dev_dbg(dev, "CODEC still active, ignoring suspend\n"); | ||
266 | return 0; | ||
267 | } | ||
268 | break; | ||
269 | default: | ||
270 | break; | ||
271 | } | ||
272 | |||
259 | /* Disable LDO pulldowns while the device is suspended if we | 273 | /* Disable LDO pulldowns while the device is suspended if we |
260 | * don't know that something will be driving them. */ | 274 | * don't know that something will be driving them. */ |
261 | if (!wm8994->ldo_ena_always_driven) | 275 | if (!wm8994->ldo_ena_always_driven) |
diff --git a/drivers/mfd/wm8994-regmap.c b/drivers/mfd/wm8994-regmap.c index c598ae69b8ff..bc0c5096539a 100644 --- a/drivers/mfd/wm8994-regmap.c +++ b/drivers/mfd/wm8994-regmap.c | |||
@@ -806,6 +806,7 @@ static bool wm1811_readable_register(struct device *dev, unsigned int reg) | |||
806 | case WM8994_DC_SERVO_2: | 806 | case WM8994_DC_SERVO_2: |
807 | case WM8994_DC_SERVO_READBACK: | 807 | case WM8994_DC_SERVO_READBACK: |
808 | case WM8994_DC_SERVO_4: | 808 | case WM8994_DC_SERVO_4: |
809 | case WM8994_DC_SERVO_4E: | ||
809 | case WM8994_ANALOGUE_HP_1: | 810 | case WM8994_ANALOGUE_HP_1: |
810 | case WM8958_MIC_DETECT_1: | 811 | case WM8958_MIC_DETECT_1: |
811 | case WM8958_MIC_DETECT_2: | 812 | case WM8958_MIC_DETECT_2: |
diff --git a/drivers/misc/c2port/core.c b/drivers/misc/c2port/core.c index 19fc7c1cb428..f428d86bfc10 100644 --- a/drivers/misc/c2port/core.c +++ b/drivers/misc/c2port/core.c | |||
@@ -984,9 +984,9 @@ static int __init c2port_init(void) | |||
984 | " - (C) 2007 Rodolfo Giometti\n"); | 984 | " - (C) 2007 Rodolfo Giometti\n"); |
985 | 985 | ||
986 | c2port_class = class_create(THIS_MODULE, "c2port"); | 986 | c2port_class = class_create(THIS_MODULE, "c2port"); |
987 | if (!c2port_class) { | 987 | if (IS_ERR(c2port_class)) { |
988 | printk(KERN_ERR "c2port: failed to allocate class\n"); | 988 | printk(KERN_ERR "c2port: failed to allocate class\n"); |
989 | return -ENOMEM; | 989 | return PTR_ERR(c2port_class); |
990 | } | 990 | } |
991 | c2port_class->dev_attrs = c2port_attrs; | 991 | c2port_class->dev_attrs = c2port_attrs; |
992 | 992 | ||
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index 690255c7d4dc..132378b89d76 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c | |||
@@ -2068,6 +2068,9 @@ static int mmc_rescan_try_freq(struct mmc_host *host, unsigned freq) | |||
2068 | */ | 2068 | */ |
2069 | mmc_hw_reset_for_init(host); | 2069 | mmc_hw_reset_for_init(host); |
2070 | 2070 | ||
2071 | /* Initialization should be done at 3.3 V I/O voltage. */ | ||
2072 | mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330, 0); | ||
2073 | |||
2071 | /* | 2074 | /* |
2072 | * sdio_reset sends CMD52 to reset card. Since we do not know | 2075 | * sdio_reset sends CMD52 to reset card. Since we do not know |
2073 | * if the card is being re-initialized, just send it. CMD52 | 2076 | * if the card is being re-initialized, just send it. CMD52 |
diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c index 30055f2b0d44..c3704e293a7b 100644 --- a/drivers/mmc/core/host.c +++ b/drivers/mmc/core/host.c | |||
@@ -238,10 +238,10 @@ static inline void mmc_host_clk_init(struct mmc_host *host) | |||
238 | /* Hold MCI clock for 8 cycles by default */ | 238 | /* Hold MCI clock for 8 cycles by default */ |
239 | host->clk_delay = 8; | 239 | host->clk_delay = 8; |
240 | /* | 240 | /* |
241 | * Default clock gating delay is 200ms. | 241 | * Default clock gating delay is 0ms to avoid wasting power. |
242 | * This value can be tuned by writing into sysfs entry. | 242 | * This value can be tuned by writing into sysfs entry. |
243 | */ | 243 | */ |
244 | host->clkgate_delay = 200; | 244 | host->clkgate_delay = 0; |
245 | host->clk_gated = false; | 245 | host->clk_gated = false; |
246 | INIT_DELAYED_WORK(&host->clk_gate_work, mmc_host_clk_gate_work); | 246 | INIT_DELAYED_WORK(&host->clk_gate_work, mmc_host_clk_gate_work); |
247 | spin_lock_init(&host->clk_lock); | 247 | spin_lock_init(&host->clk_lock); |
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index a48066344fa8..2b9ed1401dc4 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c | |||
@@ -816,6 +816,9 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, | |||
816 | if (!mmc_host_is_spi(host)) | 816 | if (!mmc_host_is_spi(host)) |
817 | mmc_set_bus_mode(host, MMC_BUSMODE_OPENDRAIN); | 817 | mmc_set_bus_mode(host, MMC_BUSMODE_OPENDRAIN); |
818 | 818 | ||
819 | /* Initialization should be done at 3.3 V I/O voltage. */ | ||
820 | mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330, 0); | ||
821 | |||
819 | /* | 822 | /* |
820 | * Since we're changing the OCR value, we seem to | 823 | * Since we're changing the OCR value, we seem to |
821 | * need to tell some cards to go back to the idle | 824 | * need to tell some cards to go back to the idle |
diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c index 5017f9354ce2..c272c6868ecf 100644 --- a/drivers/mmc/core/sd.c +++ b/drivers/mmc/core/sd.c | |||
@@ -911,6 +911,9 @@ static int mmc_sd_init_card(struct mmc_host *host, u32 ocr, | |||
911 | BUG_ON(!host); | 911 | BUG_ON(!host); |
912 | WARN_ON(!host->claimed); | 912 | WARN_ON(!host->claimed); |
913 | 913 | ||
914 | /* The initialization should be done at 3.3 V I/O voltage. */ | ||
915 | mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330, 0); | ||
916 | |||
914 | err = mmc_sd_get_cid(host, ocr, cid, &rocr); | 917 | err = mmc_sd_get_cid(host, ocr, cid, &rocr); |
915 | if (err) | 918 | if (err) |
916 | return err; | 919 | return err; |
@@ -1156,11 +1159,6 @@ int mmc_attach_sd(struct mmc_host *host) | |||
1156 | BUG_ON(!host); | 1159 | BUG_ON(!host); |
1157 | WARN_ON(!host->claimed); | 1160 | WARN_ON(!host->claimed); |
1158 | 1161 | ||
1159 | /* Make sure we are at 3.3V signalling voltage */ | ||
1160 | err = mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330, false); | ||
1161 | if (err) | ||
1162 | return err; | ||
1163 | |||
1164 | /* Disable preset value enable if already set since last time */ | 1162 | /* Disable preset value enable if already set since last time */ |
1165 | if (host->ops->enable_preset_value) { | 1163 | if (host->ops->enable_preset_value) { |
1166 | mmc_host_clk_hold(host); | 1164 | mmc_host_clk_hold(host); |
diff --git a/drivers/mmc/core/sdio.c b/drivers/mmc/core/sdio.c index 12cde6ee17f5..2c7c83f832d2 100644 --- a/drivers/mmc/core/sdio.c +++ b/drivers/mmc/core/sdio.c | |||
@@ -585,6 +585,9 @@ static int mmc_sdio_init_card(struct mmc_host *host, u32 ocr, | |||
585 | * Inform the card of the voltage | 585 | * Inform the card of the voltage |
586 | */ | 586 | */ |
587 | if (!powered_resume) { | 587 | if (!powered_resume) { |
588 | /* The initialization should be done at 3.3 V I/O voltage. */ | ||
589 | mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330, 0); | ||
590 | |||
588 | err = mmc_send_io_op_cond(host, host->ocr, &ocr); | 591 | err = mmc_send_io_op_cond(host, host->ocr, &ocr); |
589 | if (err) | 592 | if (err) |
590 | goto err; | 593 | goto err; |
@@ -996,6 +999,11 @@ static int mmc_sdio_power_restore(struct mmc_host *host) | |||
996 | * With these steps taken, mmc_select_voltage() is also required to | 999 | * With these steps taken, mmc_select_voltage() is also required to |
997 | * restore the correct voltage setting of the card. | 1000 | * restore the correct voltage setting of the card. |
998 | */ | 1001 | */ |
1002 | |||
1003 | /* The initialization should be done at 3.3 V I/O voltage. */ | ||
1004 | if (!mmc_card_keep_power(host)) | ||
1005 | mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330, 0); | ||
1006 | |||
999 | sdio_reset(host); | 1007 | sdio_reset(host); |
1000 | mmc_go_idle(host); | 1008 | mmc_go_idle(host); |
1001 | mmc_send_if_cond(host, host->ocr_avail); | 1009 | mmc_send_if_cond(host, host->ocr_avail); |
diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c index 6985cdb0bb26..e4449a54ae8f 100644 --- a/drivers/mmc/host/atmel-mci.c +++ b/drivers/mmc/host/atmel-mci.c | |||
@@ -1948,12 +1948,12 @@ static bool atmci_filter(struct dma_chan *chan, void *slave) | |||
1948 | } | 1948 | } |
1949 | } | 1949 | } |
1950 | 1950 | ||
1951 | static void atmci_configure_dma(struct atmel_mci *host) | 1951 | static bool atmci_configure_dma(struct atmel_mci *host) |
1952 | { | 1952 | { |
1953 | struct mci_platform_data *pdata; | 1953 | struct mci_platform_data *pdata; |
1954 | 1954 | ||
1955 | if (host == NULL) | 1955 | if (host == NULL) |
1956 | return; | 1956 | return false; |
1957 | 1957 | ||
1958 | pdata = host->pdev->dev.platform_data; | 1958 | pdata = host->pdev->dev.platform_data; |
1959 | 1959 | ||
@@ -1970,12 +1970,15 @@ static void atmci_configure_dma(struct atmel_mci *host) | |||
1970 | host->dma.chan = | 1970 | host->dma.chan = |
1971 | dma_request_channel(mask, atmci_filter, pdata->dma_slave); | 1971 | dma_request_channel(mask, atmci_filter, pdata->dma_slave); |
1972 | } | 1972 | } |
1973 | if (!host->dma.chan) | 1973 | if (!host->dma.chan) { |
1974 | dev_notice(&host->pdev->dev, "DMA not available, using PIO\n"); | 1974 | dev_warn(&host->pdev->dev, "no DMA channel available\n"); |
1975 | else | 1975 | return false; |
1976 | } else { | ||
1976 | dev_info(&host->pdev->dev, | 1977 | dev_info(&host->pdev->dev, |
1977 | "Using %s for DMA transfers\n", | 1978 | "Using %s for DMA transfers\n", |
1978 | dma_chan_name(host->dma.chan)); | 1979 | dma_chan_name(host->dma.chan)); |
1980 | return true; | ||
1981 | } | ||
1979 | } | 1982 | } |
1980 | 1983 | ||
1981 | static inline unsigned int atmci_get_version(struct atmel_mci *host) | 1984 | static inline unsigned int atmci_get_version(struct atmel_mci *host) |
@@ -2085,8 +2088,7 @@ static int __init atmci_probe(struct platform_device *pdev) | |||
2085 | 2088 | ||
2086 | /* Get MCI capabilities and set operations according to it */ | 2089 | /* Get MCI capabilities and set operations according to it */ |
2087 | atmci_get_cap(host); | 2090 | atmci_get_cap(host); |
2088 | if (host->caps.has_dma) { | 2091 | if (host->caps.has_dma && atmci_configure_dma(host)) { |
2089 | dev_info(&pdev->dev, "using DMA\n"); | ||
2090 | host->prepare_data = &atmci_prepare_data_dma; | 2092 | host->prepare_data = &atmci_prepare_data_dma; |
2091 | host->submit_data = &atmci_submit_data_dma; | 2093 | host->submit_data = &atmci_submit_data_dma; |
2092 | host->stop_transfer = &atmci_stop_transfer_dma; | 2094 | host->stop_transfer = &atmci_stop_transfer_dma; |
@@ -2096,15 +2098,12 @@ static int __init atmci_probe(struct platform_device *pdev) | |||
2096 | host->submit_data = &atmci_submit_data_pdc; | 2098 | host->submit_data = &atmci_submit_data_pdc; |
2097 | host->stop_transfer = &atmci_stop_transfer_pdc; | 2099 | host->stop_transfer = &atmci_stop_transfer_pdc; |
2098 | } else { | 2100 | } else { |
2099 | dev_info(&pdev->dev, "no DMA, no PDC\n"); | 2101 | dev_info(&pdev->dev, "using PIO\n"); |
2100 | host->prepare_data = &atmci_prepare_data; | 2102 | host->prepare_data = &atmci_prepare_data; |
2101 | host->submit_data = &atmci_submit_data; | 2103 | host->submit_data = &atmci_submit_data; |
2102 | host->stop_transfer = &atmci_stop_transfer; | 2104 | host->stop_transfer = &atmci_stop_transfer; |
2103 | } | 2105 | } |
2104 | 2106 | ||
2105 | if (host->caps.has_dma) | ||
2106 | atmci_configure_dma(host); | ||
2107 | |||
2108 | platform_set_drvdata(pdev, host); | 2107 | platform_set_drvdata(pdev, host); |
2109 | 2108 | ||
2110 | /* We need at least one slot to succeed */ | 2109 | /* We need at least one slot to succeed */ |
diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c index 304f2f98b680..bdfd05517dd5 100644 --- a/drivers/mmc/host/mmci.c +++ b/drivers/mmc/host/mmci.c | |||
@@ -1271,12 +1271,13 @@ static int __devinit mmci_probe(struct amba_device *dev, | |||
1271 | /* | 1271 | /* |
1272 | * Block size can be up to 2048 bytes, but must be a power of two. | 1272 | * Block size can be up to 2048 bytes, but must be a power of two. |
1273 | */ | 1273 | */ |
1274 | mmc->max_blk_size = 2048; | 1274 | mmc->max_blk_size = 1 << 11; |
1275 | 1275 | ||
1276 | /* | 1276 | /* |
1277 | * No limit on the number of blocks transferred. | 1277 | * Limit the number of blocks transferred so that we don't overflow |
1278 | * the maximum request size. | ||
1278 | */ | 1279 | */ |
1279 | mmc->max_blk_count = mmc->max_req_size; | 1280 | mmc->max_blk_count = mmc->max_req_size >> 11; |
1280 | 1281 | ||
1281 | spin_lock_init(&host->lock); | 1282 | spin_lock_init(&host->lock); |
1282 | 1283 | ||
diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c index d601e41af282..0be4e2013632 100644 --- a/drivers/mmc/host/sdhci-esdhc-imx.c +++ b/drivers/mmc/host/sdhci-esdhc-imx.c | |||
@@ -269,8 +269,9 @@ static void esdhc_writew_le(struct sdhci_host *host, u16 val, int reg) | |||
269 | imx_data->scratchpad = val; | 269 | imx_data->scratchpad = val; |
270 | return; | 270 | return; |
271 | case SDHCI_COMMAND: | 271 | case SDHCI_COMMAND: |
272 | if ((host->cmd->opcode == MMC_STOP_TRANSMISSION) | 272 | if ((host->cmd->opcode == MMC_STOP_TRANSMISSION || |
273 | && (imx_data->flags & ESDHC_FLAG_MULTIBLK_NO_INT)) | 273 | host->cmd->opcode == MMC_SET_BLOCK_COUNT) && |
274 | (imx_data->flags & ESDHC_FLAG_MULTIBLK_NO_INT)) | ||
274 | val |= SDHCI_CMD_ABORTCMD; | 275 | val |= SDHCI_CMD_ABORTCMD; |
275 | 276 | ||
276 | if (is_imx6q_usdhc(imx_data)) { | 277 | if (is_imx6q_usdhc(imx_data)) { |
diff --git a/drivers/net/caif/caif_hsi.c b/drivers/net/caif/caif_hsi.c index 0a4fc62a381d..c998e1afebc6 100644 --- a/drivers/net/caif/caif_hsi.c +++ b/drivers/net/caif/caif_hsi.c | |||
@@ -978,7 +978,7 @@ static void cfhsi_setup(struct net_device *dev) | |||
978 | dev->netdev_ops = &cfhsi_ops; | 978 | dev->netdev_ops = &cfhsi_ops; |
979 | dev->type = ARPHRD_CAIF; | 979 | dev->type = ARPHRD_CAIF; |
980 | dev->flags = IFF_POINTOPOINT | IFF_NOARP; | 980 | dev->flags = IFF_POINTOPOINT | IFF_NOARP; |
981 | dev->mtu = CFHSI_MAX_PAYLOAD_SZ; | 981 | dev->mtu = CFHSI_MAX_CAIF_FRAME_SZ; |
982 | dev->tx_queue_len = 0; | 982 | dev->tx_queue_len = 0; |
983 | dev->destructor = free_netdev; | 983 | dev->destructor = free_netdev; |
984 | skb_queue_head_init(&cfhsi->qhead); | 984 | skb_queue_head_init(&cfhsi->qhead); |
diff --git a/drivers/net/ethernet/atheros/atl1c/atl1c_main.c b/drivers/net/ethernet/atheros/atl1c/atl1c_main.c index 1ff3c6df35a2..47a9bb2c813c 100644 --- a/drivers/net/ethernet/atheros/atl1c/atl1c_main.c +++ b/drivers/net/ethernet/atheros/atl1c/atl1c_main.c | |||
@@ -1710,7 +1710,7 @@ static irqreturn_t atl1c_intr(int irq, void *data) | |||
1710 | "atl1c hardware error (status = 0x%x)\n", | 1710 | "atl1c hardware error (status = 0x%x)\n", |
1711 | status & ISR_ERROR); | 1711 | status & ISR_ERROR); |
1712 | /* reset MAC */ | 1712 | /* reset MAC */ |
1713 | adapter->work_event |= ATL1C_WORK_EVENT_RESET; | 1713 | set_bit(ATL1C_WORK_EVENT_RESET, &adapter->work_event); |
1714 | schedule_work(&adapter->common_task); | 1714 | schedule_work(&adapter->common_task); |
1715 | return IRQ_HANDLED; | 1715 | return IRQ_HANDLED; |
1716 | } | 1716 | } |
diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c index a1f2e0fed78b..35c2a202d67a 100644 --- a/drivers/net/ethernet/broadcom/tg3.c +++ b/drivers/net/ethernet/broadcom/tg3.c | |||
@@ -5352,7 +5352,7 @@ static void tg3_tx(struct tg3_napi *tnapi) | |||
5352 | } | 5352 | } |
5353 | } | 5353 | } |
5354 | 5354 | ||
5355 | netdev_completed_queue(tp->dev, pkts_compl, bytes_compl); | 5355 | netdev_tx_completed_queue(txq, pkts_compl, bytes_compl); |
5356 | 5356 | ||
5357 | tnapi->tx_cons = sw_idx; | 5357 | tnapi->tx_cons = sw_idx; |
5358 | 5358 | ||
@@ -6793,7 +6793,7 @@ static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
6793 | } | 6793 | } |
6794 | 6794 | ||
6795 | skb_tx_timestamp(skb); | 6795 | skb_tx_timestamp(skb); |
6796 | netdev_sent_queue(tp->dev, skb->len); | 6796 | netdev_tx_sent_queue(txq, skb->len); |
6797 | 6797 | ||
6798 | /* Packets are ready, update Tx producer idx local and on card. */ | 6798 | /* Packets are ready, update Tx producer idx local and on card. */ |
6799 | tw32_tx_mbox(tnapi->prodmbox, entry); | 6799 | tw32_tx_mbox(tnapi->prodmbox, entry); |
@@ -7275,8 +7275,8 @@ static void tg3_free_rings(struct tg3 *tp) | |||
7275 | 7275 | ||
7276 | dev_kfree_skb_any(skb); | 7276 | dev_kfree_skb_any(skb); |
7277 | } | 7277 | } |
7278 | netdev_tx_reset_queue(netdev_get_tx_queue(tp->dev, j)); | ||
7278 | } | 7279 | } |
7279 | netdev_reset_queue(tp->dev); | ||
7280 | } | 7280 | } |
7281 | 7281 | ||
7282 | /* Initialize tx/rx rings for packet processing. | 7282 | /* Initialize tx/rx rings for packet processing. |
@@ -7886,10 +7886,8 @@ static int tg3_chip_reset(struct tg3 *tp) | |||
7886 | return 0; | 7886 | return 0; |
7887 | } | 7887 | } |
7888 | 7888 | ||
7889 | static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *, | 7889 | static void tg3_get_nstats(struct tg3 *, struct rtnl_link_stats64 *); |
7890 | struct rtnl_link_stats64 *); | 7890 | static void tg3_get_estats(struct tg3 *, struct tg3_ethtool_stats *); |
7891 | static struct tg3_ethtool_stats *tg3_get_estats(struct tg3 *, | ||
7892 | struct tg3_ethtool_stats *); | ||
7893 | 7891 | ||
7894 | /* tp->lock is held. */ | 7892 | /* tp->lock is held. */ |
7895 | static int tg3_halt(struct tg3 *tp, int kind, int silent) | 7893 | static int tg3_halt(struct tg3 *tp, int kind, int silent) |
@@ -7910,7 +7908,7 @@ static int tg3_halt(struct tg3 *tp, int kind, int silent) | |||
7910 | 7908 | ||
7911 | if (tp->hw_stats) { | 7909 | if (tp->hw_stats) { |
7912 | /* Save the stats across chip resets... */ | 7910 | /* Save the stats across chip resets... */ |
7913 | tg3_get_stats64(tp->dev, &tp->net_stats_prev), | 7911 | tg3_get_nstats(tp, &tp->net_stats_prev), |
7914 | tg3_get_estats(tp, &tp->estats_prev); | 7912 | tg3_get_estats(tp, &tp->estats_prev); |
7915 | 7913 | ||
7916 | /* And make sure the next sample is new data */ | 7914 | /* And make sure the next sample is new data */ |
@@ -9847,7 +9845,7 @@ static inline u64 get_stat64(tg3_stat64_t *val) | |||
9847 | return ((u64)val->high << 32) | ((u64)val->low); | 9845 | return ((u64)val->high << 32) | ((u64)val->low); |
9848 | } | 9846 | } |
9849 | 9847 | ||
9850 | static u64 calc_crc_errors(struct tg3 *tp) | 9848 | static u64 tg3_calc_crc_errors(struct tg3 *tp) |
9851 | { | 9849 | { |
9852 | struct tg3_hw_stats *hw_stats = tp->hw_stats; | 9850 | struct tg3_hw_stats *hw_stats = tp->hw_stats; |
9853 | 9851 | ||
@@ -9856,14 +9854,12 @@ static u64 calc_crc_errors(struct tg3 *tp) | |||
9856 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701)) { | 9854 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701)) { |
9857 | u32 val; | 9855 | u32 val; |
9858 | 9856 | ||
9859 | spin_lock_bh(&tp->lock); | ||
9860 | if (!tg3_readphy(tp, MII_TG3_TEST1, &val)) { | 9857 | if (!tg3_readphy(tp, MII_TG3_TEST1, &val)) { |
9861 | tg3_writephy(tp, MII_TG3_TEST1, | 9858 | tg3_writephy(tp, MII_TG3_TEST1, |
9862 | val | MII_TG3_TEST1_CRC_EN); | 9859 | val | MII_TG3_TEST1_CRC_EN); |
9863 | tg3_readphy(tp, MII_TG3_RXR_COUNTERS, &val); | 9860 | tg3_readphy(tp, MII_TG3_RXR_COUNTERS, &val); |
9864 | } else | 9861 | } else |
9865 | val = 0; | 9862 | val = 0; |
9866 | spin_unlock_bh(&tp->lock); | ||
9867 | 9863 | ||
9868 | tp->phy_crc_errors += val; | 9864 | tp->phy_crc_errors += val; |
9869 | 9865 | ||
@@ -9877,14 +9873,13 @@ static u64 calc_crc_errors(struct tg3 *tp) | |||
9877 | estats->member = old_estats->member + \ | 9873 | estats->member = old_estats->member + \ |
9878 | get_stat64(&hw_stats->member) | 9874 | get_stat64(&hw_stats->member) |
9879 | 9875 | ||
9880 | static struct tg3_ethtool_stats *tg3_get_estats(struct tg3 *tp, | 9876 | static void tg3_get_estats(struct tg3 *tp, struct tg3_ethtool_stats *estats) |
9881 | struct tg3_ethtool_stats *estats) | ||
9882 | { | 9877 | { |
9883 | struct tg3_ethtool_stats *old_estats = &tp->estats_prev; | 9878 | struct tg3_ethtool_stats *old_estats = &tp->estats_prev; |
9884 | struct tg3_hw_stats *hw_stats = tp->hw_stats; | 9879 | struct tg3_hw_stats *hw_stats = tp->hw_stats; |
9885 | 9880 | ||
9886 | if (!hw_stats) | 9881 | if (!hw_stats) |
9887 | return old_estats; | 9882 | return; |
9888 | 9883 | ||
9889 | ESTAT_ADD(rx_octets); | 9884 | ESTAT_ADD(rx_octets); |
9890 | ESTAT_ADD(rx_fragments); | 9885 | ESTAT_ADD(rx_fragments); |
@@ -9963,20 +9958,13 @@ static struct tg3_ethtool_stats *tg3_get_estats(struct tg3 *tp, | |||
9963 | ESTAT_ADD(nic_tx_threshold_hit); | 9958 | ESTAT_ADD(nic_tx_threshold_hit); |
9964 | 9959 | ||
9965 | ESTAT_ADD(mbuf_lwm_thresh_hit); | 9960 | ESTAT_ADD(mbuf_lwm_thresh_hit); |
9966 | |||
9967 | return estats; | ||
9968 | } | 9961 | } |
9969 | 9962 | ||
9970 | static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *dev, | 9963 | static void tg3_get_nstats(struct tg3 *tp, struct rtnl_link_stats64 *stats) |
9971 | struct rtnl_link_stats64 *stats) | ||
9972 | { | 9964 | { |
9973 | struct tg3 *tp = netdev_priv(dev); | ||
9974 | struct rtnl_link_stats64 *old_stats = &tp->net_stats_prev; | 9965 | struct rtnl_link_stats64 *old_stats = &tp->net_stats_prev; |
9975 | struct tg3_hw_stats *hw_stats = tp->hw_stats; | 9966 | struct tg3_hw_stats *hw_stats = tp->hw_stats; |
9976 | 9967 | ||
9977 | if (!hw_stats) | ||
9978 | return old_stats; | ||
9979 | |||
9980 | stats->rx_packets = old_stats->rx_packets + | 9968 | stats->rx_packets = old_stats->rx_packets + |
9981 | get_stat64(&hw_stats->rx_ucast_packets) + | 9969 | get_stat64(&hw_stats->rx_ucast_packets) + |
9982 | get_stat64(&hw_stats->rx_mcast_packets) + | 9970 | get_stat64(&hw_stats->rx_mcast_packets) + |
@@ -10019,15 +10007,13 @@ static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *dev, | |||
10019 | get_stat64(&hw_stats->tx_carrier_sense_errors); | 10007 | get_stat64(&hw_stats->tx_carrier_sense_errors); |
10020 | 10008 | ||
10021 | stats->rx_crc_errors = old_stats->rx_crc_errors + | 10009 | stats->rx_crc_errors = old_stats->rx_crc_errors + |
10022 | calc_crc_errors(tp); | 10010 | tg3_calc_crc_errors(tp); |
10023 | 10011 | ||
10024 | stats->rx_missed_errors = old_stats->rx_missed_errors + | 10012 | stats->rx_missed_errors = old_stats->rx_missed_errors + |
10025 | get_stat64(&hw_stats->rx_discards); | 10013 | get_stat64(&hw_stats->rx_discards); |
10026 | 10014 | ||
10027 | stats->rx_dropped = tp->rx_dropped; | 10015 | stats->rx_dropped = tp->rx_dropped; |
10028 | stats->tx_dropped = tp->tx_dropped; | 10016 | stats->tx_dropped = tp->tx_dropped; |
10029 | |||
10030 | return stats; | ||
10031 | } | 10017 | } |
10032 | 10018 | ||
10033 | static inline u32 calc_crc(unsigned char *buf, int len) | 10019 | static inline u32 calc_crc(unsigned char *buf, int len) |
@@ -15409,6 +15395,21 @@ static void __devinit tg3_init_coal(struct tg3 *tp) | |||
15409 | } | 15395 | } |
15410 | } | 15396 | } |
15411 | 15397 | ||
15398 | static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *dev, | ||
15399 | struct rtnl_link_stats64 *stats) | ||
15400 | { | ||
15401 | struct tg3 *tp = netdev_priv(dev); | ||
15402 | |||
15403 | if (!tp->hw_stats) | ||
15404 | return &tp->net_stats_prev; | ||
15405 | |||
15406 | spin_lock_bh(&tp->lock); | ||
15407 | tg3_get_nstats(tp, stats); | ||
15408 | spin_unlock_bh(&tp->lock); | ||
15409 | |||
15410 | return stats; | ||
15411 | } | ||
15412 | |||
15412 | static const struct net_device_ops tg3_netdev_ops = { | 15413 | static const struct net_device_ops tg3_netdev_ops = { |
15413 | .ndo_open = tg3_open, | 15414 | .ndo_open = tg3_open, |
15414 | .ndo_stop = tg3_close, | 15415 | .ndo_stop = tg3_close, |
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c index e83d12c7bf20..9d76e59d9526 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | |||
@@ -196,6 +196,8 @@ static DEFINE_PCI_DEVICE_TABLE(cxgb4_pci_tbl) = { | |||
196 | CH_DEVICE(0x4408, 4), | 196 | CH_DEVICE(0x4408, 4), |
197 | CH_DEVICE(0x4409, 4), | 197 | CH_DEVICE(0x4409, 4), |
198 | CH_DEVICE(0x440a, 4), | 198 | CH_DEVICE(0x440a, 4), |
199 | CH_DEVICE(0x440d, 4), | ||
200 | CH_DEVICE(0x440e, 4), | ||
199 | { 0, } | 201 | { 0, } |
200 | }; | 202 | }; |
201 | 203 | ||
diff --git a/drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c b/drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c index e53365a71484..d963c1d57f71 100644 --- a/drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c +++ b/drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c | |||
@@ -2892,6 +2892,8 @@ static struct pci_device_id cxgb4vf_pci_tbl[] = { | |||
2892 | CH_DEVICE(0x4808, 0), /* T420-cx */ | 2892 | CH_DEVICE(0x4808, 0), /* T420-cx */ |
2893 | CH_DEVICE(0x4809, 0), /* T420-bt */ | 2893 | CH_DEVICE(0x4809, 0), /* T420-bt */ |
2894 | CH_DEVICE(0x480a, 0), /* T404-bt */ | 2894 | CH_DEVICE(0x480a, 0), /* T404-bt */ |
2895 | CH_DEVICE(0x480d, 0), /* T480-cr */ | ||
2896 | CH_DEVICE(0x480e, 0), /* T440-lp-cr */ | ||
2895 | { 0, } | 2897 | { 0, } |
2896 | }; | 2898 | }; |
2897 | 2899 | ||
diff --git a/drivers/net/ethernet/cisco/enic/enic.h b/drivers/net/ethernet/cisco/enic/enic.h index ee93a2087fe6..c52295cd05ef 100644 --- a/drivers/net/ethernet/cisco/enic/enic.h +++ b/drivers/net/ethernet/cisco/enic/enic.h | |||
@@ -94,7 +94,7 @@ struct enic { | |||
94 | u32 rx_coalesce_usecs; | 94 | u32 rx_coalesce_usecs; |
95 | u32 tx_coalesce_usecs; | 95 | u32 tx_coalesce_usecs; |
96 | #ifdef CONFIG_PCI_IOV | 96 | #ifdef CONFIG_PCI_IOV |
97 | u32 num_vfs; | 97 | u16 num_vfs; |
98 | #endif | 98 | #endif |
99 | struct enic_port_profile *pp; | 99 | struct enic_port_profile *pp; |
100 | 100 | ||
diff --git a/drivers/net/ethernet/cisco/enic/enic_main.c b/drivers/net/ethernet/cisco/enic/enic_main.c index ab3f67f980d8..0e4edd3b6bee 100644 --- a/drivers/net/ethernet/cisco/enic/enic_main.c +++ b/drivers/net/ethernet/cisco/enic/enic_main.c | |||
@@ -2370,7 +2370,7 @@ static int __devinit enic_probe(struct pci_dev *pdev, | |||
2370 | pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_SRIOV); | 2370 | pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_SRIOV); |
2371 | if (pos) { | 2371 | if (pos) { |
2372 | pci_read_config_word(pdev, pos + PCI_SRIOV_TOTAL_VF, | 2372 | pci_read_config_word(pdev, pos + PCI_SRIOV_TOTAL_VF, |
2373 | (u16 *)&enic->num_vfs); | 2373 | &enic->num_vfs); |
2374 | if (enic->num_vfs) { | 2374 | if (enic->num_vfs) { |
2375 | err = pci_enable_sriov(pdev, enic->num_vfs); | 2375 | err = pci_enable_sriov(pdev, enic->num_vfs); |
2376 | if (err) { | 2376 | if (err) { |
diff --git a/drivers/net/ethernet/ibm/ehea/ehea_main.c b/drivers/net/ethernet/ibm/ehea/ehea_main.c index 5d5fb2627184..e6893cdfd13b 100644 --- a/drivers/net/ethernet/ibm/ehea/ehea_main.c +++ b/drivers/net/ethernet/ibm/ehea/ehea_main.c | |||
@@ -336,7 +336,9 @@ static struct rtnl_link_stats64 *ehea_get_stats64(struct net_device *dev, | |||
336 | stats->tx_bytes = tx_bytes; | 336 | stats->tx_bytes = tx_bytes; |
337 | stats->rx_packets = rx_packets; | 337 | stats->rx_packets = rx_packets; |
338 | 338 | ||
339 | return &port->stats; | 339 | stats->multicast = port->stats.multicast; |
340 | stats->rx_errors = port->stats.rx_errors; | ||
341 | return stats; | ||
340 | } | 342 | } |
341 | 343 | ||
342 | static void ehea_update_stats(struct work_struct *work) | 344 | static void ehea_update_stats(struct work_struct *work) |
diff --git a/drivers/net/ethernet/mellanox/mlx4/qp.c b/drivers/net/ethernet/mellanox/mlx4/qp.c index 738f950a1ce5..fb2b36759cbf 100644 --- a/drivers/net/ethernet/mellanox/mlx4/qp.c +++ b/drivers/net/ethernet/mellanox/mlx4/qp.c | |||
@@ -151,11 +151,6 @@ static int __mlx4_qp_modify(struct mlx4_dev *dev, struct mlx4_mtt *mtt, | |||
151 | context->log_page_size = mtt->page_shift - MLX4_ICM_PAGE_SHIFT; | 151 | context->log_page_size = mtt->page_shift - MLX4_ICM_PAGE_SHIFT; |
152 | } | 152 | } |
153 | 153 | ||
154 | port = ((context->pri_path.sched_queue >> 6) & 1) + 1; | ||
155 | if (dev->caps.port_type[port] == MLX4_PORT_TYPE_ETH) | ||
156 | context->pri_path.sched_queue = (context->pri_path.sched_queue & | ||
157 | 0xc3); | ||
158 | |||
159 | *(__be32 *) mailbox->buf = cpu_to_be32(optpar); | 154 | *(__be32 *) mailbox->buf = cpu_to_be32(optpar); |
160 | memcpy(mailbox->buf + 8, context, sizeof *context); | 155 | memcpy(mailbox->buf + 8, context, sizeof *context); |
161 | 156 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c index bfdb7af19e49..8752e6e08169 100644 --- a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c +++ b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c | |||
@@ -2255,8 +2255,7 @@ int mlx4_MODIFY_CQ_wrapper(struct mlx4_dev *dev, int slave, | |||
2255 | 2255 | ||
2256 | if (vhcr->op_modifier == 0) { | 2256 | if (vhcr->op_modifier == 0) { |
2257 | err = handle_resize(dev, slave, vhcr, inbox, outbox, cmd, cq); | 2257 | err = handle_resize(dev, slave, vhcr, inbox, outbox, cmd, cq); |
2258 | if (err) | 2258 | goto ex_put; |
2259 | goto ex_put; | ||
2260 | } | 2259 | } |
2261 | 2260 | ||
2262 | err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); | 2261 | err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); |
diff --git a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_param.c b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_param.c index 9cb5f912e489..29e23bec809c 100644 --- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_param.c +++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_param.c | |||
@@ -321,10 +321,10 @@ static void pch_gbe_check_copper_options(struct pch_gbe_adapter *adapter) | |||
321 | pr_debug("AutoNeg specified along with Speed or Duplex, AutoNeg parameter ignored\n"); | 321 | pr_debug("AutoNeg specified along with Speed or Duplex, AutoNeg parameter ignored\n"); |
322 | hw->phy.autoneg_advertised = opt.def; | 322 | hw->phy.autoneg_advertised = opt.def; |
323 | } else { | 323 | } else { |
324 | hw->phy.autoneg_advertised = AutoNeg; | 324 | int tmp = AutoNeg; |
325 | pch_gbe_validate_option( | 325 | |
326 | (int *)(&hw->phy.autoneg_advertised), | 326 | pch_gbe_validate_option(&tmp, &opt, adapter); |
327 | &opt, adapter); | 327 | hw->phy.autoneg_advertised = tmp; |
328 | } | 328 | } |
329 | } | 329 | } |
330 | 330 | ||
@@ -495,9 +495,10 @@ void pch_gbe_check_options(struct pch_gbe_adapter *adapter) | |||
495 | .arg = { .l = { .nr = (int)ARRAY_SIZE(fc_list), | 495 | .arg = { .l = { .nr = (int)ARRAY_SIZE(fc_list), |
496 | .p = fc_list } } | 496 | .p = fc_list } } |
497 | }; | 497 | }; |
498 | hw->mac.fc = FlowControl; | 498 | int tmp = FlowControl; |
499 | pch_gbe_validate_option((int *)(&hw->mac.fc), | 499 | |
500 | &opt, adapter); | 500 | pch_gbe_validate_option(&tmp, &opt, adapter); |
501 | hw->mac.fc = tmp; | ||
501 | } | 502 | } |
502 | 503 | ||
503 | pch_gbe_check_copper_options(adapter); | 504 | pch_gbe_check_copper_options(adapter); |
diff --git a/drivers/net/ethernet/packetengines/Kconfig b/drivers/net/ethernet/packetengines/Kconfig index b97132d9dff0..8f29feb35548 100644 --- a/drivers/net/ethernet/packetengines/Kconfig +++ b/drivers/net/ethernet/packetengines/Kconfig | |||
@@ -4,6 +4,7 @@ | |||
4 | 4 | ||
5 | config NET_PACKET_ENGINE | 5 | config NET_PACKET_ENGINE |
6 | bool "Packet Engine devices" | 6 | bool "Packet Engine devices" |
7 | default y | ||
7 | depends on PCI | 8 | depends on PCI |
8 | ---help--- | 9 | ---help--- |
9 | If you have a network (Ethernet) card belonging to this class, say Y | 10 | If you have a network (Ethernet) card belonging to this class, say Y |
diff --git a/drivers/net/ethernet/qlogic/qla3xxx.c b/drivers/net/ethernet/qlogic/qla3xxx.c index 7931531c3a40..e61560e16385 100644 --- a/drivers/net/ethernet/qlogic/qla3xxx.c +++ b/drivers/net/ethernet/qlogic/qla3xxx.c | |||
@@ -3017,7 +3017,6 @@ static int ql_adapter_initialize(struct ql3_adapter *qdev) | |||
3017 | (void __iomem *)port_regs; | 3017 | (void __iomem *)port_regs; |
3018 | u32 delay = 10; | 3018 | u32 delay = 10; |
3019 | int status = 0; | 3019 | int status = 0; |
3020 | unsigned long hw_flags = 0; | ||
3021 | 3020 | ||
3022 | if (ql_mii_setup(qdev)) | 3021 | if (ql_mii_setup(qdev)) |
3023 | return -1; | 3022 | return -1; |
@@ -3228,9 +3227,9 @@ static int ql_adapter_initialize(struct ql3_adapter *qdev) | |||
3228 | value = ql_read_page0_reg(qdev, &port_regs->portStatus); | 3227 | value = ql_read_page0_reg(qdev, &port_regs->portStatus); |
3229 | if (value & PORT_STATUS_IC) | 3228 | if (value & PORT_STATUS_IC) |
3230 | break; | 3229 | break; |
3231 | spin_unlock_irqrestore(&qdev->hw_lock, hw_flags); | 3230 | spin_unlock_irq(&qdev->hw_lock); |
3232 | msleep(500); | 3231 | msleep(500); |
3233 | spin_lock_irqsave(&qdev->hw_lock, hw_flags); | 3232 | spin_lock_irq(&qdev->hw_lock); |
3234 | } while (--delay); | 3233 | } while (--delay); |
3235 | 3234 | ||
3236 | if (delay == 0) { | 3235 | if (delay == 0) { |
diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c index 7a0c800b50ad..bbacb3741ec0 100644 --- a/drivers/net/ethernet/realtek/r8169.c +++ b/drivers/net/ethernet/realtek/r8169.c | |||
@@ -3781,12 +3781,20 @@ static void rtl8169_init_ring_indexes(struct rtl8169_private *tp) | |||
3781 | 3781 | ||
3782 | static void rtl_hw_jumbo_enable(struct rtl8169_private *tp) | 3782 | static void rtl_hw_jumbo_enable(struct rtl8169_private *tp) |
3783 | { | 3783 | { |
3784 | void __iomem *ioaddr = tp->mmio_addr; | ||
3785 | |||
3786 | RTL_W8(Cfg9346, Cfg9346_Unlock); | ||
3784 | rtl_generic_op(tp, tp->jumbo_ops.enable); | 3787 | rtl_generic_op(tp, tp->jumbo_ops.enable); |
3788 | RTL_W8(Cfg9346, Cfg9346_Lock); | ||
3785 | } | 3789 | } |
3786 | 3790 | ||
3787 | static void rtl_hw_jumbo_disable(struct rtl8169_private *tp) | 3791 | static void rtl_hw_jumbo_disable(struct rtl8169_private *tp) |
3788 | { | 3792 | { |
3793 | void __iomem *ioaddr = tp->mmio_addr; | ||
3794 | |||
3795 | RTL_W8(Cfg9346, Cfg9346_Unlock); | ||
3789 | rtl_generic_op(tp, tp->jumbo_ops.disable); | 3796 | rtl_generic_op(tp, tp->jumbo_ops.disable); |
3797 | RTL_W8(Cfg9346, Cfg9346_Lock); | ||
3790 | } | 3798 | } |
3791 | 3799 | ||
3792 | static void r8168c_hw_jumbo_enable(struct rtl8169_private *tp) | 3800 | static void r8168c_hw_jumbo_enable(struct rtl8169_private *tp) |
@@ -6186,6 +6194,9 @@ static void rtl_shutdown(struct pci_dev *pdev) | |||
6186 | { | 6194 | { |
6187 | struct net_device *dev = pci_get_drvdata(pdev); | 6195 | struct net_device *dev = pci_get_drvdata(pdev); |
6188 | struct rtl8169_private *tp = netdev_priv(dev); | 6196 | struct rtl8169_private *tp = netdev_priv(dev); |
6197 | struct device *d = &pdev->dev; | ||
6198 | |||
6199 | pm_runtime_get_sync(d); | ||
6189 | 6200 | ||
6190 | rtl8169_net_suspend(dev); | 6201 | rtl8169_net_suspend(dev); |
6191 | 6202 | ||
@@ -6207,6 +6218,8 @@ static void rtl_shutdown(struct pci_dev *pdev) | |||
6207 | pci_wake_from_d3(pdev, true); | 6218 | pci_wake_from_d3(pdev, true); |
6208 | pci_set_power_state(pdev, PCI_D3hot); | 6219 | pci_set_power_state(pdev, PCI_D3hot); |
6209 | } | 6220 | } |
6221 | |||
6222 | pm_runtime_put_noidle(d); | ||
6210 | } | 6223 | } |
6211 | 6224 | ||
6212 | static struct pci_driver rtl8169_pci_driver = { | 6225 | static struct pci_driver rtl8169_pci_driver = { |
diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c index 466c58a7353d..bf01841bda5b 100644 --- a/drivers/net/hyperv/netvsc_drv.c +++ b/drivers/net/hyperv/netvsc_drv.c | |||
@@ -313,7 +313,7 @@ int netvsc_recv_callback(struct hv_device *device_obj, | |||
313 | static void netvsc_get_drvinfo(struct net_device *net, | 313 | static void netvsc_get_drvinfo(struct net_device *net, |
314 | struct ethtool_drvinfo *info) | 314 | struct ethtool_drvinfo *info) |
315 | { | 315 | { |
316 | strcpy(info->driver, "hv_netvsc"); | 316 | strcpy(info->driver, KBUILD_MODNAME); |
317 | strcpy(info->version, HV_DRV_VERSION); | 317 | strcpy(info->version, HV_DRV_VERSION); |
318 | strcpy(info->fw_version, "N/A"); | 318 | strcpy(info->fw_version, "N/A"); |
319 | } | 319 | } |
@@ -485,7 +485,7 @@ MODULE_DEVICE_TABLE(vmbus, id_table); | |||
485 | 485 | ||
486 | /* The one and only one */ | 486 | /* The one and only one */ |
487 | static struct hv_driver netvsc_drv = { | 487 | static struct hv_driver netvsc_drv = { |
488 | .name = "netvsc", | 488 | .name = KBUILD_MODNAME, |
489 | .id_table = id_table, | 489 | .id_table = id_table, |
490 | .probe = netvsc_probe, | 490 | .probe = netvsc_probe, |
491 | .remove = netvsc_remove, | 491 | .remove = netvsc_remove, |
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index fae0fbd8bc88..81b96e303757 100644 --- a/drivers/net/usb/usbnet.c +++ b/drivers/net/usb/usbnet.c | |||
@@ -589,6 +589,7 @@ static int unlink_urbs (struct usbnet *dev, struct sk_buff_head *q) | |||
589 | entry = (struct skb_data *) skb->cb; | 589 | entry = (struct skb_data *) skb->cb; |
590 | urb = entry->urb; | 590 | urb = entry->urb; |
591 | 591 | ||
592 | spin_unlock_irqrestore(&q->lock, flags); | ||
592 | // during some PM-driven resume scenarios, | 593 | // during some PM-driven resume scenarios, |
593 | // these (async) unlinks complete immediately | 594 | // these (async) unlinks complete immediately |
594 | retval = usb_unlink_urb (urb); | 595 | retval = usb_unlink_urb (urb); |
@@ -596,6 +597,7 @@ static int unlink_urbs (struct usbnet *dev, struct sk_buff_head *q) | |||
596 | netdev_dbg(dev->net, "unlink urb err, %d\n", retval); | 597 | netdev_dbg(dev->net, "unlink urb err, %d\n", retval); |
597 | else | 598 | else |
598 | count++; | 599 | count++; |
600 | spin_lock_irqsave(&q->lock, flags); | ||
599 | } | 601 | } |
600 | spin_unlock_irqrestore (&q->lock, flags); | 602 | spin_unlock_irqrestore (&q->lock, flags); |
601 | return count; | 603 | return count; |
diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c index 3dcd3857a36c..756c0f5565a5 100644 --- a/drivers/net/vmxnet3/vmxnet3_drv.c +++ b/drivers/net/vmxnet3/vmxnet3_drv.c | |||
@@ -830,13 +830,8 @@ vmxnet3_parse_and_copy_hdr(struct sk_buff *skb, struct vmxnet3_tx_queue *tq, | |||
830 | ctx->l4_hdr_size = ((struct tcphdr *) | 830 | ctx->l4_hdr_size = ((struct tcphdr *) |
831 | skb_transport_header(skb))->doff * 4; | 831 | skb_transport_header(skb))->doff * 4; |
832 | else if (iph->protocol == IPPROTO_UDP) | 832 | else if (iph->protocol == IPPROTO_UDP) |
833 | /* | ||
834 | * Use tcp header size so that bytes to | ||
835 | * be copied are more than required by | ||
836 | * the device. | ||
837 | */ | ||
838 | ctx->l4_hdr_size = | 833 | ctx->l4_hdr_size = |
839 | sizeof(struct tcphdr); | 834 | sizeof(struct udphdr); |
840 | else | 835 | else |
841 | ctx->l4_hdr_size = 0; | 836 | ctx->l4_hdr_size = 0; |
842 | } else { | 837 | } else { |
diff --git a/drivers/net/vmxnet3/vmxnet3_int.h b/drivers/net/vmxnet3/vmxnet3_int.h index ed54797db191..fc46a81ad538 100644 --- a/drivers/net/vmxnet3/vmxnet3_int.h +++ b/drivers/net/vmxnet3/vmxnet3_int.h | |||
@@ -70,10 +70,10 @@ | |||
70 | /* | 70 | /* |
71 | * Version numbers | 71 | * Version numbers |
72 | */ | 72 | */ |
73 | #define VMXNET3_DRIVER_VERSION_STRING "1.1.18.0-k" | 73 | #define VMXNET3_DRIVER_VERSION_STRING "1.1.29.0-k" |
74 | 74 | ||
75 | /* a 32-bit int, each byte encode a verion number in VMXNET3_DRIVER_VERSION */ | 75 | /* a 32-bit int, each byte encode a verion number in VMXNET3_DRIVER_VERSION */ |
76 | #define VMXNET3_DRIVER_VERSION_NUM 0x01011200 | 76 | #define VMXNET3_DRIVER_VERSION_NUM 0x01011D00 |
77 | 77 | ||
78 | #if defined(CONFIG_PCI_MSI) | 78 | #if defined(CONFIG_PCI_MSI) |
79 | /* RSS only makes sense if MSI-X is supported. */ | 79 | /* RSS only makes sense if MSI-X is supported. */ |
diff --git a/drivers/net/wireless/ath/ath9k/ar5008_phy.c b/drivers/net/wireless/ath/ath9k/ar5008_phy.c index f901a17f76ba..86a891f93fc9 100644 --- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c +++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c | |||
@@ -489,8 +489,6 @@ static int ar5008_hw_rf_alloc_ext_banks(struct ath_hw *ah) | |||
489 | ATH_ALLOC_BANK(ah->analogBank6Data, ah->iniBank6.ia_rows); | 489 | ATH_ALLOC_BANK(ah->analogBank6Data, ah->iniBank6.ia_rows); |
490 | ATH_ALLOC_BANK(ah->analogBank6TPCData, ah->iniBank6TPC.ia_rows); | 490 | ATH_ALLOC_BANK(ah->analogBank6TPCData, ah->iniBank6TPC.ia_rows); |
491 | ATH_ALLOC_BANK(ah->analogBank7Data, ah->iniBank7.ia_rows); | 491 | ATH_ALLOC_BANK(ah->analogBank7Data, ah->iniBank7.ia_rows); |
492 | ATH_ALLOC_BANK(ah->addac5416_21, | ||
493 | ah->iniAddac.ia_rows * ah->iniAddac.ia_columns); | ||
494 | ATH_ALLOC_BANK(ah->bank6Temp, ah->iniBank6.ia_rows); | 492 | ATH_ALLOC_BANK(ah->bank6Temp, ah->iniBank6.ia_rows); |
495 | 493 | ||
496 | return 0; | 494 | return 0; |
@@ -519,7 +517,6 @@ static void ar5008_hw_rf_free_ext_banks(struct ath_hw *ah) | |||
519 | ATH_FREE_BANK(ah->analogBank6Data); | 517 | ATH_FREE_BANK(ah->analogBank6Data); |
520 | ATH_FREE_BANK(ah->analogBank6TPCData); | 518 | ATH_FREE_BANK(ah->analogBank6TPCData); |
521 | ATH_FREE_BANK(ah->analogBank7Data); | 519 | ATH_FREE_BANK(ah->analogBank7Data); |
522 | ATH_FREE_BANK(ah->addac5416_21); | ||
523 | ATH_FREE_BANK(ah->bank6Temp); | 520 | ATH_FREE_BANK(ah->bank6Temp); |
524 | 521 | ||
525 | #undef ATH_FREE_BANK | 522 | #undef ATH_FREE_BANK |
@@ -805,27 +802,7 @@ static int ar5008_hw_process_ini(struct ath_hw *ah, | |||
805 | if (ah->eep_ops->set_addac) | 802 | if (ah->eep_ops->set_addac) |
806 | ah->eep_ops->set_addac(ah, chan); | 803 | ah->eep_ops->set_addac(ah, chan); |
807 | 804 | ||
808 | if (AR_SREV_5416_22_OR_LATER(ah)) { | 805 | REG_WRITE_ARRAY(&ah->iniAddac, 1, regWrites); |
809 | REG_WRITE_ARRAY(&ah->iniAddac, 1, regWrites); | ||
810 | } else { | ||
811 | struct ar5416IniArray temp; | ||
812 | u32 addacSize = | ||
813 | sizeof(u32) * ah->iniAddac.ia_rows * | ||
814 | ah->iniAddac.ia_columns; | ||
815 | |||
816 | /* For AR5416 2.0/2.1 */ | ||
817 | memcpy(ah->addac5416_21, | ||
818 | ah->iniAddac.ia_array, addacSize); | ||
819 | |||
820 | /* override CLKDRV value at [row, column] = [31, 1] */ | ||
821 | (ah->addac5416_21)[31 * ah->iniAddac.ia_columns + 1] = 0; | ||
822 | |||
823 | temp.ia_array = ah->addac5416_21; | ||
824 | temp.ia_columns = ah->iniAddac.ia_columns; | ||
825 | temp.ia_rows = ah->iniAddac.ia_rows; | ||
826 | REG_WRITE_ARRAY(&temp, 1, regWrites); | ||
827 | } | ||
828 | |||
829 | REG_WRITE(ah, AR_PHY_ADC_SERIAL_CTL, AR_PHY_SEL_INTERNAL_ADDAC); | 806 | REG_WRITE(ah, AR_PHY_ADC_SERIAL_CTL, AR_PHY_SEL_INTERNAL_ADDAC); |
830 | 807 | ||
831 | ENABLE_REGWRITE_BUFFER(ah); | 808 | ENABLE_REGWRITE_BUFFER(ah); |
diff --git a/drivers/net/wireless/ath/ath9k/ar9002_hw.c b/drivers/net/wireless/ath/ath9k/ar9002_hw.c index 11f192a1ceb7..d190411ac8f5 100644 --- a/drivers/net/wireless/ath/ath9k/ar9002_hw.c +++ b/drivers/net/wireless/ath/ath9k/ar9002_hw.c | |||
@@ -180,6 +180,25 @@ static void ar9002_hw_init_mode_regs(struct ath_hw *ah) | |||
180 | INIT_INI_ARRAY(&ah->iniAddac, ar5416Addac, | 180 | INIT_INI_ARRAY(&ah->iniAddac, ar5416Addac, |
181 | ARRAY_SIZE(ar5416Addac), 2); | 181 | ARRAY_SIZE(ar5416Addac), 2); |
182 | } | 182 | } |
183 | |||
184 | /* iniAddac needs to be modified for these chips */ | ||
185 | if (AR_SREV_9160(ah) || !AR_SREV_5416_22_OR_LATER(ah)) { | ||
186 | struct ar5416IniArray *addac = &ah->iniAddac; | ||
187 | u32 size = sizeof(u32) * addac->ia_rows * addac->ia_columns; | ||
188 | u32 *data; | ||
189 | |||
190 | data = kmalloc(size, GFP_KERNEL); | ||
191 | if (!data) | ||
192 | return; | ||
193 | |||
194 | memcpy(data, addac->ia_array, size); | ||
195 | addac->ia_array = data; | ||
196 | |||
197 | if (!AR_SREV_5416_22_OR_LATER(ah)) { | ||
198 | /* override CLKDRV value */ | ||
199 | INI_RA(addac, 31,1) = 0; | ||
200 | } | ||
201 | } | ||
183 | } | 202 | } |
184 | 203 | ||
185 | /* Support for Japan ch.14 (2484) spread */ | 204 | /* Support for Japan ch.14 (2484) spread */ |
diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h index 6a29004a71b0..c8261d4fc780 100644 --- a/drivers/net/wireless/ath/ath9k/hw.h +++ b/drivers/net/wireless/ath/ath9k/hw.h | |||
@@ -940,7 +940,6 @@ struct ath_hw { | |||
940 | u32 *analogBank6Data; | 940 | u32 *analogBank6Data; |
941 | u32 *analogBank6TPCData; | 941 | u32 *analogBank6TPCData; |
942 | u32 *analogBank7Data; | 942 | u32 *analogBank7Data; |
943 | u32 *addac5416_21; | ||
944 | u32 *bank6Temp; | 943 | u32 *bank6Temp; |
945 | 944 | ||
946 | u8 txpower_limit; | 945 | u8 txpower_limit; |
diff --git a/drivers/net/wireless/ath/carl9170/tx.c b/drivers/net/wireless/ath/carl9170/tx.c index d19a9ee9d057..bbc813dee983 100644 --- a/drivers/net/wireless/ath/carl9170/tx.c +++ b/drivers/net/wireless/ath/carl9170/tx.c | |||
@@ -1234,6 +1234,7 @@ static bool carl9170_tx_ps_drop(struct ar9170 *ar, struct sk_buff *skb) | |||
1234 | { | 1234 | { |
1235 | struct ieee80211_sta *sta; | 1235 | struct ieee80211_sta *sta; |
1236 | struct carl9170_sta_info *sta_info; | 1236 | struct carl9170_sta_info *sta_info; |
1237 | struct ieee80211_tx_info *tx_info; | ||
1237 | 1238 | ||
1238 | rcu_read_lock(); | 1239 | rcu_read_lock(); |
1239 | sta = __carl9170_get_tx_sta(ar, skb); | 1240 | sta = __carl9170_get_tx_sta(ar, skb); |
@@ -1241,16 +1242,18 @@ static bool carl9170_tx_ps_drop(struct ar9170 *ar, struct sk_buff *skb) | |||
1241 | goto out_rcu; | 1242 | goto out_rcu; |
1242 | 1243 | ||
1243 | sta_info = (void *) sta->drv_priv; | 1244 | sta_info = (void *) sta->drv_priv; |
1244 | if (unlikely(sta_info->sleeping)) { | 1245 | tx_info = IEEE80211_SKB_CB(skb); |
1245 | struct ieee80211_tx_info *tx_info; | ||
1246 | 1246 | ||
1247 | if (unlikely(sta_info->sleeping) && | ||
1248 | !(tx_info->flags & (IEEE80211_TX_CTL_POLL_RESPONSE | | ||
1249 | IEEE80211_TX_CTL_CLEAR_PS_FILT))) { | ||
1247 | rcu_read_unlock(); | 1250 | rcu_read_unlock(); |
1248 | 1251 | ||
1249 | tx_info = IEEE80211_SKB_CB(skb); | ||
1250 | if (tx_info->flags & IEEE80211_TX_CTL_AMPDU) | 1252 | if (tx_info->flags & IEEE80211_TX_CTL_AMPDU) |
1251 | atomic_dec(&ar->tx_ampdu_upload); | 1253 | atomic_dec(&ar->tx_ampdu_upload); |
1252 | 1254 | ||
1253 | tx_info->flags |= IEEE80211_TX_STAT_TX_FILTERED; | 1255 | tx_info->flags |= IEEE80211_TX_STAT_TX_FILTERED; |
1256 | carl9170_release_dev_space(ar, skb); | ||
1254 | carl9170_tx_status(ar, skb, false); | 1257 | carl9170_tx_status(ar, skb, false); |
1255 | return true; | 1258 | return true; |
1256 | } | 1259 | } |
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/ampdu.c b/drivers/net/wireless/brcm80211/brcmsmac/ampdu.c index 90911eec0cf5..30b58870b1b6 100644 --- a/drivers/net/wireless/brcm80211/brcmsmac/ampdu.c +++ b/drivers/net/wireless/brcm80211/brcmsmac/ampdu.c | |||
@@ -1051,17 +1051,13 @@ brcms_c_ampdu_dotxstatus_complete(struct ampdu_info *ampdu, struct scb *scb, | |||
1051 | } | 1051 | } |
1052 | /* either retransmit or send bar if ack not recd */ | 1052 | /* either retransmit or send bar if ack not recd */ |
1053 | if (!ack_recd) { | 1053 | if (!ack_recd) { |
1054 | struct ieee80211_tx_rate *txrate = | 1054 | if (retry && (ini->txretry[index] < (int)retry_limit)) { |
1055 | tx_info->status.rates; | ||
1056 | if (retry && (txrate[0].count < (int)retry_limit)) { | ||
1057 | ini->txretry[index]++; | 1055 | ini->txretry[index]++; |
1058 | ini->tx_in_transit--; | 1056 | ini->tx_in_transit--; |
1059 | /* | 1057 | /* |
1060 | * Use high prededence for retransmit to | 1058 | * Use high prededence for retransmit to |
1061 | * give some punch | 1059 | * give some punch |
1062 | */ | 1060 | */ |
1063 | /* brcms_c_txq_enq(wlc, scb, p, | ||
1064 | * BRCMS_PRIO_TO_PREC(tid)); */ | ||
1065 | brcms_c_txq_enq(wlc, scb, p, | 1061 | brcms_c_txq_enq(wlc, scb, p, |
1066 | BRCMS_PRIO_TO_HI_PREC(tid)); | 1062 | BRCMS_PRIO_TO_HI_PREC(tid)); |
1067 | } else { | 1063 | } else { |
@@ -1074,9 +1070,9 @@ brcms_c_ampdu_dotxstatus_complete(struct ampdu_info *ampdu, struct scb *scb, | |||
1074 | IEEE80211_TX_STAT_AMPDU_NO_BACK; | 1070 | IEEE80211_TX_STAT_AMPDU_NO_BACK; |
1075 | skb_pull(p, D11_PHY_HDR_LEN); | 1071 | skb_pull(p, D11_PHY_HDR_LEN); |
1076 | skb_pull(p, D11_TXH_LEN); | 1072 | skb_pull(p, D11_TXH_LEN); |
1077 | wiphy_err(wiphy, "%s: BA Timeout, seq %d, in_" | 1073 | BCMMSG(wiphy, |
1078 | "transit %d\n", "AMPDU status", seq, | 1074 | "BA Timeout, seq %d, in_transit %d\n", |
1079 | ini->tx_in_transit); | 1075 | seq, ini->tx_in_transit); |
1080 | ieee80211_tx_status_irqsafe(wlc->pub->ieee_hw, | 1076 | ieee80211_tx_status_irqsafe(wlc->pub->ieee_hw, |
1081 | p); | 1077 | p); |
1082 | } | 1078 | } |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-lib.c b/drivers/net/wireless/iwlwifi/iwl-agn-lib.c index 64cf439035c3..ca78e91de86c 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-lib.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-lib.c | |||
@@ -1240,7 +1240,7 @@ int iwlagn_suspend(struct iwl_priv *priv, | |||
1240 | .flags = CMD_SYNC, | 1240 | .flags = CMD_SYNC, |
1241 | .data[0] = key_data.rsc_tsc, | 1241 | .data[0] = key_data.rsc_tsc, |
1242 | .dataflags[0] = IWL_HCMD_DFL_NOCOPY, | 1242 | .dataflags[0] = IWL_HCMD_DFL_NOCOPY, |
1243 | .len[0] = sizeof(key_data.rsc_tsc), | 1243 | .len[0] = sizeof(*key_data.rsc_tsc), |
1244 | }; | 1244 | }; |
1245 | 1245 | ||
1246 | ret = iwl_trans_send_cmd(trans(priv), &rsc_tsc_cmd); | 1246 | ret = iwl_trans_send_cmd(trans(priv), &rsc_tsc_cmd); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-sta.c b/drivers/net/wireless/iwlwifi/iwl-agn-sta.c index 7353826095f1..e483cfa8d14e 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-sta.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-sta.c | |||
@@ -1187,6 +1187,7 @@ int iwl_remove_dynamic_key(struct iwl_priv *priv, | |||
1187 | unsigned long flags; | 1187 | unsigned long flags; |
1188 | struct iwl_addsta_cmd sta_cmd; | 1188 | struct iwl_addsta_cmd sta_cmd; |
1189 | u8 sta_id = iwlagn_key_sta_id(priv, ctx->vif, sta); | 1189 | u8 sta_id = iwlagn_key_sta_id(priv, ctx->vif, sta); |
1190 | __le16 key_flags; | ||
1190 | 1191 | ||
1191 | /* if station isn't there, neither is the key */ | 1192 | /* if station isn't there, neither is the key */ |
1192 | if (sta_id == IWL_INVALID_STATION) | 1193 | if (sta_id == IWL_INVALID_STATION) |
@@ -1212,7 +1213,14 @@ int iwl_remove_dynamic_key(struct iwl_priv *priv, | |||
1212 | IWL_ERR(priv, "offset %d not used in uCode key table.\n", | 1213 | IWL_ERR(priv, "offset %d not used in uCode key table.\n", |
1213 | keyconf->hw_key_idx); | 1214 | keyconf->hw_key_idx); |
1214 | 1215 | ||
1215 | sta_cmd.key.key_flags = STA_KEY_FLG_NO_ENC | STA_KEY_FLG_INVALID; | 1216 | key_flags = cpu_to_le16(keyconf->keyidx << STA_KEY_FLG_KEYID_POS); |
1217 | key_flags |= STA_KEY_FLG_MAP_KEY_MSK | STA_KEY_FLG_NO_ENC | | ||
1218 | STA_KEY_FLG_INVALID; | ||
1219 | |||
1220 | if (!(keyconf->flags & IEEE80211_KEY_FLAG_PAIRWISE)) | ||
1221 | key_flags |= STA_KEY_MULTICAST_MSK; | ||
1222 | |||
1223 | sta_cmd.key.key_flags = key_flags; | ||
1216 | sta_cmd.key.key_offset = WEP_INVALID_OFFSET; | 1224 | sta_cmd.key.key_offset = WEP_INVALID_OFFSET; |
1217 | sta_cmd.sta.modify_mask = STA_MODIFY_KEY_MASK; | 1225 | sta_cmd.sta.modify_mask = STA_MODIFY_KEY_MASK; |
1218 | sta_cmd.mode = STA_CONTROL_MODIFY_MSK; | 1226 | sta_cmd.mode = STA_CONTROL_MODIFY_MSK; |
diff --git a/drivers/net/wireless/mwifiex/cfg80211.c b/drivers/net/wireless/mwifiex/cfg80211.c index 5b2972b43b0e..2210a0f9af2d 100644 --- a/drivers/net/wireless/mwifiex/cfg80211.c +++ b/drivers/net/wireless/mwifiex/cfg80211.c | |||
@@ -846,6 +846,7 @@ mwifiex_cfg80211_assoc(struct mwifiex_private *priv, size_t ssid_len, u8 *ssid, | |||
846 | priv->sec_info.wpa_enabled = false; | 846 | priv->sec_info.wpa_enabled = false; |
847 | priv->sec_info.wpa2_enabled = false; | 847 | priv->sec_info.wpa2_enabled = false; |
848 | priv->wep_key_curr_index = 0; | 848 | priv->wep_key_curr_index = 0; |
849 | priv->sec_info.encryption_mode = 0; | ||
849 | ret = mwifiex_set_encode(priv, NULL, 0, 0, 1); | 850 | ret = mwifiex_set_encode(priv, NULL, 0, 0, 1); |
850 | 851 | ||
851 | if (mode == NL80211_IFTYPE_ADHOC) { | 852 | if (mode == NL80211_IFTYPE_ADHOC) { |
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c index c3e1aa7c1a80..d2a1ea98d0f2 100644 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c | |||
@@ -1220,7 +1220,8 @@ void rt2x00lib_remove_dev(struct rt2x00_dev *rt2x00dev) | |||
1220 | cancel_work_sync(&rt2x00dev->rxdone_work); | 1220 | cancel_work_sync(&rt2x00dev->rxdone_work); |
1221 | cancel_work_sync(&rt2x00dev->txdone_work); | 1221 | cancel_work_sync(&rt2x00dev->txdone_work); |
1222 | } | 1222 | } |
1223 | destroy_workqueue(rt2x00dev->workqueue); | 1223 | if (rt2x00dev->workqueue) |
1224 | destroy_workqueue(rt2x00dev->workqueue); | ||
1224 | 1225 | ||
1225 | /* | 1226 | /* |
1226 | * Free the tx status fifo. | 1227 | * Free the tx status fifo. |
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c index ea2bd1be2640..91a375fb6ae6 100644 --- a/drivers/of/fdt.c +++ b/drivers/of/fdt.c | |||
@@ -23,7 +23,6 @@ | |||
23 | #include <asm/machdep.h> | 23 | #include <asm/machdep.h> |
24 | #endif /* CONFIG_PPC */ | 24 | #endif /* CONFIG_PPC */ |
25 | 25 | ||
26 | #include <asm/setup.h> | ||
27 | #include <asm/page.h> | 26 | #include <asm/page.h> |
28 | 27 | ||
29 | char *of_fdt_get_string(struct boot_param_header *blob, u32 offset) | 28 | char *of_fdt_get_string(struct boot_param_header *blob, u32 offset) |
diff --git a/drivers/of/of_mdio.c b/drivers/of/of_mdio.c index 980c079e4443..483c0adcad87 100644 --- a/drivers/of/of_mdio.c +++ b/drivers/of/of_mdio.c | |||
@@ -182,7 +182,7 @@ struct phy_device *of_phy_connect_fixed_link(struct net_device *dev, | |||
182 | if (!phy_id || sz < sizeof(*phy_id)) | 182 | if (!phy_id || sz < sizeof(*phy_id)) |
183 | return NULL; | 183 | return NULL; |
184 | 184 | ||
185 | sprintf(bus_id, PHY_ID_FMT, "0", be32_to_cpu(phy_id[0])); | 185 | sprintf(bus_id, PHY_ID_FMT, "fixed-0", be32_to_cpu(phy_id[0])); |
186 | 186 | ||
187 | phy = phy_connect(dev, bus_id, hndlr, 0, iface); | 187 | phy = phy_connect(dev, bus_id, hndlr, 0, iface); |
188 | return IS_ERR(phy) ? NULL : phy; | 188 | return IS_ERR(phy) ? NULL : phy; |
diff --git a/drivers/pps/pps.c b/drivers/pps/pps.c index 2baadd21b7a6..98fbe62694d4 100644 --- a/drivers/pps/pps.c +++ b/drivers/pps/pps.c | |||
@@ -369,9 +369,9 @@ static int __init pps_init(void) | |||
369 | int err; | 369 | int err; |
370 | 370 | ||
371 | pps_class = class_create(THIS_MODULE, "pps"); | 371 | pps_class = class_create(THIS_MODULE, "pps"); |
372 | if (!pps_class) { | 372 | if (IS_ERR(pps_class)) { |
373 | pr_err("failed to allocate class\n"); | 373 | pr_err("failed to allocate class\n"); |
374 | return -ENOMEM; | 374 | return PTR_ERR(pps_class); |
375 | } | 375 | } |
376 | pps_class->dev_attrs = pps_attrs; | 376 | pps_class->dev_attrs = pps_attrs; |
377 | 377 | ||
diff --git a/drivers/rapidio/devices/tsi721.c b/drivers/rapidio/devices/tsi721.c index 691b1ab1a3d0..30d2072f480b 100644 --- a/drivers/rapidio/devices/tsi721.c +++ b/drivers/rapidio/devices/tsi721.c | |||
@@ -410,13 +410,14 @@ static void tsi721_db_dpc(struct work_struct *work) | |||
410 | */ | 410 | */ |
411 | mport = priv->mport; | 411 | mport = priv->mport; |
412 | 412 | ||
413 | wr_ptr = ioread32(priv->regs + TSI721_IDQ_WP(IDB_QUEUE)); | 413 | wr_ptr = ioread32(priv->regs + TSI721_IDQ_WP(IDB_QUEUE)) % IDB_QSIZE; |
414 | rd_ptr = ioread32(priv->regs + TSI721_IDQ_RP(IDB_QUEUE)); | 414 | rd_ptr = ioread32(priv->regs + TSI721_IDQ_RP(IDB_QUEUE)) % IDB_QSIZE; |
415 | 415 | ||
416 | while (wr_ptr != rd_ptr) { | 416 | while (wr_ptr != rd_ptr) { |
417 | idb_entry = (u64 *)(priv->idb_base + | 417 | idb_entry = (u64 *)(priv->idb_base + |
418 | (TSI721_IDB_ENTRY_SIZE * rd_ptr)); | 418 | (TSI721_IDB_ENTRY_SIZE * rd_ptr)); |
419 | rd_ptr++; | 419 | rd_ptr++; |
420 | rd_ptr %= IDB_QSIZE; | ||
420 | idb.msg = *idb_entry; | 421 | idb.msg = *idb_entry; |
421 | *idb_entry = 0; | 422 | *idb_entry = 0; |
422 | 423 | ||
diff --git a/drivers/regulator/da9052-regulator.c b/drivers/regulator/da9052-regulator.c index 3767364452fd..ea4d8f575ac6 100644 --- a/drivers/regulator/da9052-regulator.c +++ b/drivers/regulator/da9052-regulator.c | |||
@@ -260,8 +260,8 @@ static int da9052_set_ldo5_6_voltage(struct regulator_dev *rdev, | |||
260 | * the LDO activate bit to implment the changes on the | 260 | * the LDO activate bit to implment the changes on the |
261 | * LDO output. | 261 | * LDO output. |
262 | */ | 262 | */ |
263 | return da9052_reg_update(regulator->da9052, DA9052_SUPPLY_REG, 0, | 263 | return da9052_reg_update(regulator->da9052, DA9052_SUPPLY_REG, |
264 | info->activate_bit); | 264 | info->activate_bit, info->activate_bit); |
265 | } | 265 | } |
266 | 266 | ||
267 | static int da9052_set_dcdc_voltage(struct regulator_dev *rdev, | 267 | static int da9052_set_dcdc_voltage(struct regulator_dev *rdev, |
@@ -280,8 +280,8 @@ static int da9052_set_dcdc_voltage(struct regulator_dev *rdev, | |||
280 | * the DCDC activate bit to implment the changes on the | 280 | * the DCDC activate bit to implment the changes on the |
281 | * DCDC output. | 281 | * DCDC output. |
282 | */ | 282 | */ |
283 | return da9052_reg_update(regulator->da9052, DA9052_SUPPLY_REG, 0, | 283 | return da9052_reg_update(regulator->da9052, DA9052_SUPPLY_REG, |
284 | info->activate_bit); | 284 | info->activate_bit, info->activate_bit); |
285 | } | 285 | } |
286 | 286 | ||
287 | static int da9052_get_regulator_voltage_sel(struct regulator_dev *rdev) | 287 | static int da9052_get_regulator_voltage_sel(struct regulator_dev *rdev) |
diff --git a/drivers/regulator/tps65910-regulator.c b/drivers/regulator/tps65910-regulator.c index 5c15ba01e9c7..40ecf5165899 100644 --- a/drivers/regulator/tps65910-regulator.c +++ b/drivers/regulator/tps65910-regulator.c | |||
@@ -662,7 +662,7 @@ static int tps65910_set_voltage_dcdc(struct regulator_dev *dev, | |||
662 | tps65910_reg_write(pmic, TPS65910_VDD2_OP, vsel); | 662 | tps65910_reg_write(pmic, TPS65910_VDD2_OP, vsel); |
663 | break; | 663 | break; |
664 | case TPS65911_REG_VDDCTRL: | 664 | case TPS65911_REG_VDDCTRL: |
665 | vsel = selector; | 665 | vsel = selector + 3; |
666 | tps65910_reg_write(pmic, TPS65911_VDDCTRL_OP, vsel); | 666 | tps65910_reg_write(pmic, TPS65911_VDDCTRL_OP, vsel); |
667 | } | 667 | } |
668 | 668 | ||
diff --git a/drivers/rtc/rtc-r9701.c b/drivers/rtc/rtc-r9701.c index 9beba49c3c5b..2853c2a6f10f 100644 --- a/drivers/rtc/rtc-r9701.c +++ b/drivers/rtc/rtc-r9701.c | |||
@@ -125,6 +125,13 @@ static int __devinit r9701_probe(struct spi_device *spi) | |||
125 | unsigned char tmp; | 125 | unsigned char tmp; |
126 | int res; | 126 | int res; |
127 | 127 | ||
128 | tmp = R100CNT; | ||
129 | res = read_regs(&spi->dev, &tmp, 1); | ||
130 | if (res || tmp != 0x20) { | ||
131 | dev_err(&spi->dev, "cannot read RTC register\n"); | ||
132 | return -ENODEV; | ||
133 | } | ||
134 | |||
128 | rtc = rtc_device_register("r9701", | 135 | rtc = rtc_device_register("r9701", |
129 | &spi->dev, &r9701_rtc_ops, THIS_MODULE); | 136 | &spi->dev, &r9701_rtc_ops, THIS_MODULE); |
130 | if (IS_ERR(rtc)) | 137 | if (IS_ERR(rtc)) |
@@ -132,13 +139,6 @@ static int __devinit r9701_probe(struct spi_device *spi) | |||
132 | 139 | ||
133 | dev_set_drvdata(&spi->dev, rtc); | 140 | dev_set_drvdata(&spi->dev, rtc); |
134 | 141 | ||
135 | tmp = R100CNT; | ||
136 | res = read_regs(&spi->dev, &tmp, 1); | ||
137 | if (res || tmp != 0x20) { | ||
138 | rtc_device_unregister(rtc); | ||
139 | return res; | ||
140 | } | ||
141 | |||
142 | return 0; | 142 | return 0; |
143 | } | 143 | } |
144 | 144 | ||
diff --git a/drivers/s390/cio/qdio_main.c b/drivers/s390/cio/qdio_main.c index 3ef8d071c64a..770a740a393c 100644 --- a/drivers/s390/cio/qdio_main.c +++ b/drivers/s390/cio/qdio_main.c | |||
@@ -167,7 +167,7 @@ again: | |||
167 | DBF_ERROR("%4x EQBS ERROR", SCH_NO(q)); | 167 | DBF_ERROR("%4x EQBS ERROR", SCH_NO(q)); |
168 | DBF_ERROR("%3d%3d%2d", count, tmp_count, nr); | 168 | DBF_ERROR("%3d%3d%2d", count, tmp_count, nr); |
169 | q->handler(q->irq_ptr->cdev, QDIO_ERROR_ACTIVATE_CHECK_CONDITION, | 169 | q->handler(q->irq_ptr->cdev, QDIO_ERROR_ACTIVATE_CHECK_CONDITION, |
170 | 0, -1, -1, q->irq_ptr->int_parm); | 170 | q->nr, q->first_to_kick, count, q->irq_ptr->int_parm); |
171 | return 0; | 171 | return 0; |
172 | } | 172 | } |
173 | 173 | ||
@@ -215,7 +215,7 @@ again: | |||
215 | DBF_ERROR("%4x SQBS ERROR", SCH_NO(q)); | 215 | DBF_ERROR("%4x SQBS ERROR", SCH_NO(q)); |
216 | DBF_ERROR("%3d%3d%2d", count, tmp_count, nr); | 216 | DBF_ERROR("%3d%3d%2d", count, tmp_count, nr); |
217 | q->handler(q->irq_ptr->cdev, QDIO_ERROR_ACTIVATE_CHECK_CONDITION, | 217 | q->handler(q->irq_ptr->cdev, QDIO_ERROR_ACTIVATE_CHECK_CONDITION, |
218 | 0, -1, -1, q->irq_ptr->int_parm); | 218 | q->nr, q->first_to_kick, count, q->irq_ptr->int_parm); |
219 | return 0; | 219 | return 0; |
220 | } | 220 | } |
221 | 221 | ||
diff --git a/drivers/scsi/sd_dif.c b/drivers/scsi/sd_dif.c index 0cb39ff21171..f8fb2d691c0a 100644 --- a/drivers/scsi/sd_dif.c +++ b/drivers/scsi/sd_dif.c | |||
@@ -408,7 +408,7 @@ int sd_dif_prepare(struct request *rq, sector_t hw_sector, unsigned int sector_s | |||
408 | kunmap_atomic(sdt, KM_USER0); | 408 | kunmap_atomic(sdt, KM_USER0); |
409 | } | 409 | } |
410 | 410 | ||
411 | bio->bi_flags |= BIO_MAPPED_INTEGRITY; | 411 | bio->bi_flags |= (1 << BIO_MAPPED_INTEGRITY); |
412 | } | 412 | } |
413 | 413 | ||
414 | return 0; | 414 | return 0; |
diff --git a/drivers/spi/spi-pl022.c b/drivers/spi/spi-pl022.c index 2f9cb43a2398..f37ad2271ad5 100644 --- a/drivers/spi/spi-pl022.c +++ b/drivers/spi/spi-pl022.c | |||
@@ -1083,7 +1083,7 @@ err_alloc_rx_sg: | |||
1083 | return -ENOMEM; | 1083 | return -ENOMEM; |
1084 | } | 1084 | } |
1085 | 1085 | ||
1086 | static int __init pl022_dma_probe(struct pl022 *pl022) | 1086 | static int __devinit pl022_dma_probe(struct pl022 *pl022) |
1087 | { | 1087 | { |
1088 | dma_cap_mask_t mask; | 1088 | dma_cap_mask_t mask; |
1089 | 1089 | ||
diff --git a/drivers/tty/Kconfig b/drivers/tty/Kconfig index b3d17416d86a..830cd62d8492 100644 --- a/drivers/tty/Kconfig +++ b/drivers/tty/Kconfig | |||
@@ -365,7 +365,7 @@ config PPC_EPAPR_HV_BYTECHAN | |||
365 | 365 | ||
366 | config PPC_EARLY_DEBUG_EHV_BC | 366 | config PPC_EARLY_DEBUG_EHV_BC |
367 | bool "Early console (udbg) support for ePAPR hypervisors" | 367 | bool "Early console (udbg) support for ePAPR hypervisors" |
368 | depends on PPC_EPAPR_HV_BYTECHAN | 368 | depends on PPC_EPAPR_HV_BYTECHAN=y |
369 | help | 369 | help |
370 | Select this option to enable early console (a.k.a. "udbg") support | 370 | Select this option to enable early console (a.k.a. "udbg") support |
371 | via an ePAPR byte channel. You also need to choose the byte channel | 371 | via an ePAPR byte channel. You also need to choose the byte channel |
diff --git a/drivers/usb/host/ehci-fsl.c b/drivers/usb/host/ehci-fsl.c index c26a82e83f6e..b556a72264d1 100644 --- a/drivers/usb/host/ehci-fsl.c +++ b/drivers/usb/host/ehci-fsl.c | |||
@@ -239,7 +239,7 @@ static void ehci_fsl_setup_phy(struct ehci_hcd *ehci, | |||
239 | ehci_writel(ehci, portsc, &ehci->regs->port_status[port_offset]); | 239 | ehci_writel(ehci, portsc, &ehci->regs->port_status[port_offset]); |
240 | } | 240 | } |
241 | 241 | ||
242 | static int ehci_fsl_usb_setup(struct ehci_hcd *ehci) | 242 | static void ehci_fsl_usb_setup(struct ehci_hcd *ehci) |
243 | { | 243 | { |
244 | struct usb_hcd *hcd = ehci_to_hcd(ehci); | 244 | struct usb_hcd *hcd = ehci_to_hcd(ehci); |
245 | struct fsl_usb2_platform_data *pdata; | 245 | struct fsl_usb2_platform_data *pdata; |
@@ -299,19 +299,12 @@ static int ehci_fsl_usb_setup(struct ehci_hcd *ehci) | |||
299 | #endif | 299 | #endif |
300 | out_be32(non_ehci + FSL_SOC_USB_SICTRL, 0x00000001); | 300 | out_be32(non_ehci + FSL_SOC_USB_SICTRL, 0x00000001); |
301 | } | 301 | } |
302 | |||
303 | if (!(in_be32(non_ehci + FSL_SOC_USB_CTRL) & CTRL_PHY_CLK_VALID)) { | ||
304 | printk(KERN_WARNING "fsl-ehci: USB PHY clock invalid\n"); | ||
305 | return -ENODEV; | ||
306 | } | ||
307 | return 0; | ||
308 | } | 302 | } |
309 | 303 | ||
310 | /* called after powerup, by probe or system-pm "wakeup" */ | 304 | /* called after powerup, by probe or system-pm "wakeup" */ |
311 | static int ehci_fsl_reinit(struct ehci_hcd *ehci) | 305 | static int ehci_fsl_reinit(struct ehci_hcd *ehci) |
312 | { | 306 | { |
313 | if (ehci_fsl_usb_setup(ehci)) | 307 | ehci_fsl_usb_setup(ehci); |
314 | return -ENODEV; | ||
315 | ehci_port_power(ehci, 0); | 308 | ehci_port_power(ehci, 0); |
316 | 309 | ||
317 | return 0; | 310 | return 0; |
diff --git a/drivers/usb/host/ehci-fsl.h b/drivers/usb/host/ehci-fsl.h index bdf43e2adc51..491806221165 100644 --- a/drivers/usb/host/ehci-fsl.h +++ b/drivers/usb/host/ehci-fsl.h | |||
@@ -45,6 +45,5 @@ | |||
45 | #define FSL_SOC_USB_PRICTRL 0x40c /* NOTE: big-endian */ | 45 | #define FSL_SOC_USB_PRICTRL 0x40c /* NOTE: big-endian */ |
46 | #define FSL_SOC_USB_SICTRL 0x410 /* NOTE: big-endian */ | 46 | #define FSL_SOC_USB_SICTRL 0x410 /* NOTE: big-endian */ |
47 | #define FSL_SOC_USB_CTRL 0x500 /* NOTE: big-endian */ | 47 | #define FSL_SOC_USB_CTRL 0x500 /* NOTE: big-endian */ |
48 | #define CTRL_PHY_CLK_VALID (1 << 17) | ||
49 | #define SNOOP_SIZE_2GB 0x1e | 48 | #define SNOOP_SIZE_2GB 0x1e |
50 | #endif /* _EHCI_FSL_H */ | 49 | #endif /* _EHCI_FSL_H */ |
@@ -228,12 +228,6 @@ static void __put_ioctx(struct kioctx *ctx) | |||
228 | call_rcu(&ctx->rcu_head, ctx_rcu_free); | 228 | call_rcu(&ctx->rcu_head, ctx_rcu_free); |
229 | } | 229 | } |
230 | 230 | ||
231 | static inline void get_ioctx(struct kioctx *kioctx) | ||
232 | { | ||
233 | BUG_ON(atomic_read(&kioctx->users) <= 0); | ||
234 | atomic_inc(&kioctx->users); | ||
235 | } | ||
236 | |||
237 | static inline int try_get_ioctx(struct kioctx *kioctx) | 231 | static inline int try_get_ioctx(struct kioctx *kioctx) |
238 | { | 232 | { |
239 | return atomic_inc_not_zero(&kioctx->users); | 233 | return atomic_inc_not_zero(&kioctx->users); |
@@ -273,7 +267,7 @@ static struct kioctx *ioctx_alloc(unsigned nr_events) | |||
273 | mm = ctx->mm = current->mm; | 267 | mm = ctx->mm = current->mm; |
274 | atomic_inc(&mm->mm_count); | 268 | atomic_inc(&mm->mm_count); |
275 | 269 | ||
276 | atomic_set(&ctx->users, 1); | 270 | atomic_set(&ctx->users, 2); |
277 | spin_lock_init(&ctx->ctx_lock); | 271 | spin_lock_init(&ctx->ctx_lock); |
278 | spin_lock_init(&ctx->ring_info.ring_lock); | 272 | spin_lock_init(&ctx->ring_info.ring_lock); |
279 | init_waitqueue_head(&ctx->wait); | 273 | init_waitqueue_head(&ctx->wait); |
@@ -490,6 +484,8 @@ static void kiocb_batch_free(struct kioctx *ctx, struct kiocb_batch *batch) | |||
490 | kmem_cache_free(kiocb_cachep, req); | 484 | kmem_cache_free(kiocb_cachep, req); |
491 | ctx->reqs_active--; | 485 | ctx->reqs_active--; |
492 | } | 486 | } |
487 | if (unlikely(!ctx->reqs_active && ctx->dead)) | ||
488 | wake_up_all(&ctx->wait); | ||
493 | spin_unlock_irq(&ctx->ctx_lock); | 489 | spin_unlock_irq(&ctx->ctx_lock); |
494 | } | 490 | } |
495 | 491 | ||
@@ -607,11 +603,16 @@ static void aio_fput_routine(struct work_struct *data) | |||
607 | fput(req->ki_filp); | 603 | fput(req->ki_filp); |
608 | 604 | ||
609 | /* Link the iocb into the context's free list */ | 605 | /* Link the iocb into the context's free list */ |
606 | rcu_read_lock(); | ||
610 | spin_lock_irq(&ctx->ctx_lock); | 607 | spin_lock_irq(&ctx->ctx_lock); |
611 | really_put_req(ctx, req); | 608 | really_put_req(ctx, req); |
609 | /* | ||
610 | * at that point ctx might've been killed, but actual | ||
611 | * freeing is RCU'd | ||
612 | */ | ||
612 | spin_unlock_irq(&ctx->ctx_lock); | 613 | spin_unlock_irq(&ctx->ctx_lock); |
614 | rcu_read_unlock(); | ||
613 | 615 | ||
614 | put_ioctx(ctx); | ||
615 | spin_lock_irq(&fput_lock); | 616 | spin_lock_irq(&fput_lock); |
616 | } | 617 | } |
617 | spin_unlock_irq(&fput_lock); | 618 | spin_unlock_irq(&fput_lock); |
@@ -642,7 +643,6 @@ static int __aio_put_req(struct kioctx *ctx, struct kiocb *req) | |||
642 | * this function will be executed w/out any aio kthread wakeup. | 643 | * this function will be executed w/out any aio kthread wakeup. |
643 | */ | 644 | */ |
644 | if (unlikely(!fput_atomic(req->ki_filp))) { | 645 | if (unlikely(!fput_atomic(req->ki_filp))) { |
645 | get_ioctx(ctx); | ||
646 | spin_lock(&fput_lock); | 646 | spin_lock(&fput_lock); |
647 | list_add(&req->ki_list, &fput_head); | 647 | list_add(&req->ki_list, &fput_head); |
648 | spin_unlock(&fput_lock); | 648 | spin_unlock(&fput_lock); |
@@ -1336,10 +1336,10 @@ SYSCALL_DEFINE2(io_setup, unsigned, nr_events, aio_context_t __user *, ctxp) | |||
1336 | ret = PTR_ERR(ioctx); | 1336 | ret = PTR_ERR(ioctx); |
1337 | if (!IS_ERR(ioctx)) { | 1337 | if (!IS_ERR(ioctx)) { |
1338 | ret = put_user(ioctx->user_id, ctxp); | 1338 | ret = put_user(ioctx->user_id, ctxp); |
1339 | if (!ret) | 1339 | if (!ret) { |
1340 | put_ioctx(ioctx); | ||
1340 | return 0; | 1341 | return 0; |
1341 | 1342 | } | |
1342 | get_ioctx(ioctx); /* io_destroy() expects us to hold a ref */ | ||
1343 | io_destroy(ioctx); | 1343 | io_destroy(ioctx); |
1344 | } | 1344 | } |
1345 | 1345 | ||
diff --git a/fs/binfmt_aout.c b/fs/binfmt_aout.c index a6395bdb26ae..1ff94054d35a 100644 --- a/fs/binfmt_aout.c +++ b/fs/binfmt_aout.c | |||
@@ -259,6 +259,13 @@ static int load_aout_binary(struct linux_binprm * bprm, struct pt_regs * regs) | |||
259 | current->mm->free_area_cache = current->mm->mmap_base; | 259 | current->mm->free_area_cache = current->mm->mmap_base; |
260 | current->mm->cached_hole_size = 0; | 260 | current->mm->cached_hole_size = 0; |
261 | 261 | ||
262 | retval = setup_arg_pages(bprm, STACK_TOP, EXSTACK_DEFAULT); | ||
263 | if (retval < 0) { | ||
264 | /* Someone check-me: is this error path enough? */ | ||
265 | send_sig(SIGKILL, current, 0); | ||
266 | return retval; | ||
267 | } | ||
268 | |||
262 | install_exec_creds(bprm); | 269 | install_exec_creds(bprm); |
263 | current->flags &= ~PF_FORKNOEXEC; | 270 | current->flags &= ~PF_FORKNOEXEC; |
264 | 271 | ||
@@ -352,13 +359,6 @@ beyond_if: | |||
352 | return retval; | 359 | return retval; |
353 | } | 360 | } |
354 | 361 | ||
355 | retval = setup_arg_pages(bprm, STACK_TOP, EXSTACK_DEFAULT); | ||
356 | if (retval < 0) { | ||
357 | /* Someone check-me: is this error path enough? */ | ||
358 | send_sig(SIGKILL, current, 0); | ||
359 | return retval; | ||
360 | } | ||
361 | |||
362 | current->mm->start_stack = | 362 | current->mm->start_stack = |
363 | (unsigned long) create_aout_tables((char __user *) bprm->p, bprm); | 363 | (unsigned long) create_aout_tables((char __user *) bprm->p, bprm); |
364 | #ifdef __alpha__ | 364 | #ifdef __alpha__ |
diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c index 98f6bf10bbd4..0436c12da8c2 100644 --- a/fs/btrfs/backref.c +++ b/fs/btrfs/backref.c | |||
@@ -583,7 +583,7 @@ static int find_parent_nodes(struct btrfs_trans_handle *trans, | |||
583 | struct btrfs_path *path; | 583 | struct btrfs_path *path; |
584 | struct btrfs_key info_key = { 0 }; | 584 | struct btrfs_key info_key = { 0 }; |
585 | struct btrfs_delayed_ref_root *delayed_refs = NULL; | 585 | struct btrfs_delayed_ref_root *delayed_refs = NULL; |
586 | struct btrfs_delayed_ref_head *head = NULL; | 586 | struct btrfs_delayed_ref_head *head; |
587 | int info_level = 0; | 587 | int info_level = 0; |
588 | int ret; | 588 | int ret; |
589 | struct list_head prefs_delayed; | 589 | struct list_head prefs_delayed; |
@@ -607,6 +607,8 @@ static int find_parent_nodes(struct btrfs_trans_handle *trans, | |||
607 | * at a specified point in time | 607 | * at a specified point in time |
608 | */ | 608 | */ |
609 | again: | 609 | again: |
610 | head = NULL; | ||
611 | |||
610 | ret = btrfs_search_slot(trans, fs_info->extent_root, &key, path, 0, 0); | 612 | ret = btrfs_search_slot(trans, fs_info->extent_root, &key, path, 0, 0); |
611 | if (ret < 0) | 613 | if (ret < 0) |
612 | goto out; | 614 | goto out; |
@@ -635,8 +637,10 @@ again: | |||
635 | goto again; | 637 | goto again; |
636 | } | 638 | } |
637 | ret = __add_delayed_refs(head, seq, &info_key, &prefs_delayed); | 639 | ret = __add_delayed_refs(head, seq, &info_key, &prefs_delayed); |
638 | if (ret) | 640 | if (ret) { |
641 | spin_unlock(&delayed_refs->lock); | ||
639 | goto out; | 642 | goto out; |
643 | } | ||
640 | } | 644 | } |
641 | spin_unlock(&delayed_refs->lock); | 645 | spin_unlock(&delayed_refs->lock); |
642 | 646 | ||
diff --git a/fs/btrfs/reada.c b/fs/btrfs/reada.c index 2373b39a132b..22db04550f6a 100644 --- a/fs/btrfs/reada.c +++ b/fs/btrfs/reada.c | |||
@@ -305,7 +305,7 @@ again: | |||
305 | 305 | ||
306 | spin_lock(&fs_info->reada_lock); | 306 | spin_lock(&fs_info->reada_lock); |
307 | ret = radix_tree_insert(&dev->reada_zones, | 307 | ret = radix_tree_insert(&dev->reada_zones, |
308 | (unsigned long)zone->end >> PAGE_CACHE_SHIFT, | 308 | (unsigned long)(zone->end >> PAGE_CACHE_SHIFT), |
309 | zone); | 309 | zone); |
310 | spin_unlock(&fs_info->reada_lock); | 310 | spin_unlock(&fs_info->reada_lock); |
311 | 311 | ||
diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c index 63a196b97d50..bc7e24420ac0 100644 --- a/fs/cifs/dir.c +++ b/fs/cifs/dir.c | |||
@@ -584,10 +584,26 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry, | |||
584 | * If either that or op not supported returned, follow | 584 | * If either that or op not supported returned, follow |
585 | * the normal lookup. | 585 | * the normal lookup. |
586 | */ | 586 | */ |
587 | if ((rc == 0) || (rc == -ENOENT)) | 587 | switch (rc) { |
588 | case 0: | ||
589 | /* | ||
590 | * The server may allow us to open things like | ||
591 | * FIFOs, but the client isn't set up to deal | ||
592 | * with that. If it's not a regular file, just | ||
593 | * close it and proceed as if it were a normal | ||
594 | * lookup. | ||
595 | */ | ||
596 | if (newInode && !S_ISREG(newInode->i_mode)) { | ||
597 | CIFSSMBClose(xid, pTcon, fileHandle); | ||
598 | break; | ||
599 | } | ||
600 | case -ENOENT: | ||
588 | posix_open = true; | 601 | posix_open = true; |
589 | else if ((rc == -EINVAL) || (rc != -EOPNOTSUPP)) | 602 | case -EOPNOTSUPP: |
603 | break; | ||
604 | default: | ||
590 | pTcon->broken_posix_open = true; | 605 | pTcon->broken_posix_open = true; |
606 | } | ||
591 | } | 607 | } |
592 | if (!posix_open) | 608 | if (!posix_open) |
593 | rc = cifs_get_inode_info_unix(&newInode, full_path, | 609 | rc = cifs_get_inode_info_unix(&newInode, full_path, |
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c index a5f54b7d9822..745da3d0653e 100644 --- a/fs/cifs/inode.c +++ b/fs/cifs/inode.c | |||
@@ -534,6 +534,11 @@ cifs_all_info_to_fattr(struct cifs_fattr *fattr, FILE_ALL_INFO *info, | |||
534 | if (fattr->cf_cifsattrs & ATTR_DIRECTORY) { | 534 | if (fattr->cf_cifsattrs & ATTR_DIRECTORY) { |
535 | fattr->cf_mode = S_IFDIR | cifs_sb->mnt_dir_mode; | 535 | fattr->cf_mode = S_IFDIR | cifs_sb->mnt_dir_mode; |
536 | fattr->cf_dtype = DT_DIR; | 536 | fattr->cf_dtype = DT_DIR; |
537 | /* | ||
538 | * Server can return wrong NumberOfLinks value for directories | ||
539 | * when Unix extensions are disabled - fake it. | ||
540 | */ | ||
541 | fattr->cf_nlink = 2; | ||
537 | } else { | 542 | } else { |
538 | fattr->cf_mode = S_IFREG | cifs_sb->mnt_file_mode; | 543 | fattr->cf_mode = S_IFREG | cifs_sb->mnt_file_mode; |
539 | fattr->cf_dtype = DT_REG; | 544 | fattr->cf_dtype = DT_REG; |
@@ -541,9 +546,9 @@ cifs_all_info_to_fattr(struct cifs_fattr *fattr, FILE_ALL_INFO *info, | |||
541 | /* clear write bits if ATTR_READONLY is set */ | 546 | /* clear write bits if ATTR_READONLY is set */ |
542 | if (fattr->cf_cifsattrs & ATTR_READONLY) | 547 | if (fattr->cf_cifsattrs & ATTR_READONLY) |
543 | fattr->cf_mode &= ~(S_IWUGO); | 548 | fattr->cf_mode &= ~(S_IWUGO); |
544 | } | ||
545 | 549 | ||
546 | fattr->cf_nlink = le32_to_cpu(info->NumberOfLinks); | 550 | fattr->cf_nlink = le32_to_cpu(info->NumberOfLinks); |
551 | } | ||
547 | 552 | ||
548 | fattr->cf_uid = cifs_sb->mnt_uid; | 553 | fattr->cf_uid = cifs_sb->mnt_uid; |
549 | fattr->cf_gid = cifs_sb->mnt_gid; | 554 | fattr->cf_gid = cifs_sb->mnt_gid; |
@@ -1322,7 +1327,6 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, umode_t mode) | |||
1322 | } | 1327 | } |
1323 | /*BB check (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID ) to see if need | 1328 | /*BB check (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID ) to see if need |
1324 | to set uid/gid */ | 1329 | to set uid/gid */ |
1325 | inc_nlink(inode); | ||
1326 | 1330 | ||
1327 | cifs_unix_basic_to_fattr(&fattr, pInfo, cifs_sb); | 1331 | cifs_unix_basic_to_fattr(&fattr, pInfo, cifs_sb); |
1328 | cifs_fill_uniqueid(inode->i_sb, &fattr); | 1332 | cifs_fill_uniqueid(inode->i_sb, &fattr); |
@@ -1355,7 +1359,6 @@ mkdir_retry_old: | |||
1355 | d_drop(direntry); | 1359 | d_drop(direntry); |
1356 | } else { | 1360 | } else { |
1357 | mkdir_get_info: | 1361 | mkdir_get_info: |
1358 | inc_nlink(inode); | ||
1359 | if (pTcon->unix_ext) | 1362 | if (pTcon->unix_ext) |
1360 | rc = cifs_get_inode_info_unix(&newinode, full_path, | 1363 | rc = cifs_get_inode_info_unix(&newinode, full_path, |
1361 | inode->i_sb, xid); | 1364 | inode->i_sb, xid); |
@@ -1436,6 +1439,11 @@ mkdir_get_info: | |||
1436 | } | 1439 | } |
1437 | } | 1440 | } |
1438 | mkdir_out: | 1441 | mkdir_out: |
1442 | /* | ||
1443 | * Force revalidate to get parent dir info when needed since cached | ||
1444 | * attributes are invalid now. | ||
1445 | */ | ||
1446 | CIFS_I(inode)->time = 0; | ||
1439 | kfree(full_path); | 1447 | kfree(full_path); |
1440 | FreeXid(xid); | 1448 | FreeXid(xid); |
1441 | cifs_put_tlink(tlink); | 1449 | cifs_put_tlink(tlink); |
@@ -1475,7 +1483,6 @@ int cifs_rmdir(struct inode *inode, struct dentry *direntry) | |||
1475 | cifs_put_tlink(tlink); | 1483 | cifs_put_tlink(tlink); |
1476 | 1484 | ||
1477 | if (!rc) { | 1485 | if (!rc) { |
1478 | drop_nlink(inode); | ||
1479 | spin_lock(&direntry->d_inode->i_lock); | 1486 | spin_lock(&direntry->d_inode->i_lock); |
1480 | i_size_write(direntry->d_inode, 0); | 1487 | i_size_write(direntry->d_inode, 0); |
1481 | clear_nlink(direntry->d_inode); | 1488 | clear_nlink(direntry->d_inode); |
@@ -1483,12 +1490,15 @@ int cifs_rmdir(struct inode *inode, struct dentry *direntry) | |||
1483 | } | 1490 | } |
1484 | 1491 | ||
1485 | cifsInode = CIFS_I(direntry->d_inode); | 1492 | cifsInode = CIFS_I(direntry->d_inode); |
1486 | cifsInode->time = 0; /* force revalidate to go get info when | 1493 | /* force revalidate to go get info when needed */ |
1487 | needed */ | 1494 | cifsInode->time = 0; |
1488 | 1495 | ||
1489 | cifsInode = CIFS_I(inode); | 1496 | cifsInode = CIFS_I(inode); |
1490 | cifsInode->time = 0; /* force revalidate to get parent dir info | 1497 | /* |
1491 | since cached search results now invalid */ | 1498 | * Force revalidate to get parent dir info when needed since cached |
1499 | * attributes are invalid now. | ||
1500 | */ | ||
1501 | cifsInode->time = 0; | ||
1492 | 1502 | ||
1493 | direntry->d_inode->i_ctime = inode->i_ctime = inode->i_mtime = | 1503 | direntry->d_inode->i_ctime = inode->i_ctime = inode->i_mtime = |
1494 | current_fs_time(inode->i_sb); | 1504 | current_fs_time(inode->i_sb); |
diff --git a/fs/dcache.c b/fs/dcache.c index 138be96e25b6..bcbdb33fcc20 100644 --- a/fs/dcache.c +++ b/fs/dcache.c | |||
@@ -137,6 +137,26 @@ int proc_nr_dentry(ctl_table *table, int write, void __user *buffer, | |||
137 | } | 137 | } |
138 | #endif | 138 | #endif |
139 | 139 | ||
140 | /* | ||
141 | * Compare 2 name strings, return 0 if they match, otherwise non-zero. | ||
142 | * The strings are both count bytes long, and count is non-zero. | ||
143 | */ | ||
144 | static inline int dentry_cmp(const unsigned char *cs, size_t scount, | ||
145 | const unsigned char *ct, size_t tcount) | ||
146 | { | ||
147 | if (scount != tcount) | ||
148 | return 1; | ||
149 | |||
150 | do { | ||
151 | if (*cs != *ct) | ||
152 | return 1; | ||
153 | cs++; | ||
154 | ct++; | ||
155 | tcount--; | ||
156 | } while (tcount); | ||
157 | return 0; | ||
158 | } | ||
159 | |||
140 | static void __d_free(struct rcu_head *head) | 160 | static void __d_free(struct rcu_head *head) |
141 | { | 161 | { |
142 | struct dentry *dentry = container_of(head, struct dentry, d_u.d_rcu); | 162 | struct dentry *dentry = container_of(head, struct dentry, d_u.d_rcu); |
@@ -1915,7 +1915,6 @@ static int coredump_wait(int exit_code, struct core_state *core_state) | |||
1915 | { | 1915 | { |
1916 | struct task_struct *tsk = current; | 1916 | struct task_struct *tsk = current; |
1917 | struct mm_struct *mm = tsk->mm; | 1917 | struct mm_struct *mm = tsk->mm; |
1918 | struct completion *vfork_done; | ||
1919 | int core_waiters = -EBUSY; | 1918 | int core_waiters = -EBUSY; |
1920 | 1919 | ||
1921 | init_completion(&core_state->startup); | 1920 | init_completion(&core_state->startup); |
@@ -1927,22 +1926,9 @@ static int coredump_wait(int exit_code, struct core_state *core_state) | |||
1927 | core_waiters = zap_threads(tsk, mm, core_state, exit_code); | 1926 | core_waiters = zap_threads(tsk, mm, core_state, exit_code); |
1928 | up_write(&mm->mmap_sem); | 1927 | up_write(&mm->mmap_sem); |
1929 | 1928 | ||
1930 | if (unlikely(core_waiters < 0)) | 1929 | if (core_waiters > 0) |
1931 | goto fail; | ||
1932 | |||
1933 | /* | ||
1934 | * Make sure nobody is waiting for us to release the VM, | ||
1935 | * otherwise we can deadlock when we wait on each other | ||
1936 | */ | ||
1937 | vfork_done = tsk->vfork_done; | ||
1938 | if (vfork_done) { | ||
1939 | tsk->vfork_done = NULL; | ||
1940 | complete(vfork_done); | ||
1941 | } | ||
1942 | |||
1943 | if (core_waiters) | ||
1944 | wait_for_completion(&core_state->startup); | 1930 | wait_for_completion(&core_state->startup); |
1945 | fail: | 1931 | |
1946 | return core_waiters; | 1932 | return core_waiters; |
1947 | } | 1933 | } |
1948 | 1934 | ||
diff --git a/include/linux/amba/serial.h b/include/linux/amba/serial.h index 514ed45c462e..d117b29d1062 100644 --- a/include/linux/amba/serial.h +++ b/include/linux/amba/serial.h | |||
@@ -23,6 +23,8 @@ | |||
23 | #ifndef ASM_ARM_HARDWARE_SERIAL_AMBA_H | 23 | #ifndef ASM_ARM_HARDWARE_SERIAL_AMBA_H |
24 | #define ASM_ARM_HARDWARE_SERIAL_AMBA_H | 24 | #define ASM_ARM_HARDWARE_SERIAL_AMBA_H |
25 | 25 | ||
26 | #include <linux/types.h> | ||
27 | |||
26 | /* ------------------------------------------------------------------------------- | 28 | /* ------------------------------------------------------------------------------- |
27 | * From AMBA UART (PL010) Block Specification | 29 | * From AMBA UART (PL010) Block Specification |
28 | * ------------------------------------------------------------------------------- | 30 | * ------------------------------------------------------------------------------- |
diff --git a/include/linux/dcache.h b/include/linux/dcache.h index 4270bedd2308..ff5f5256d175 100644 --- a/include/linux/dcache.h +++ b/include/linux/dcache.h | |||
@@ -47,26 +47,6 @@ struct dentry_stat_t { | |||
47 | }; | 47 | }; |
48 | extern struct dentry_stat_t dentry_stat; | 48 | extern struct dentry_stat_t dentry_stat; |
49 | 49 | ||
50 | /* | ||
51 | * Compare 2 name strings, return 0 if they match, otherwise non-zero. | ||
52 | * The strings are both count bytes long, and count is non-zero. | ||
53 | */ | ||
54 | static inline int dentry_cmp(const unsigned char *cs, size_t scount, | ||
55 | const unsigned char *ct, size_t tcount) | ||
56 | { | ||
57 | if (scount != tcount) | ||
58 | return 1; | ||
59 | |||
60 | do { | ||
61 | if (*cs != *ct) | ||
62 | return 1; | ||
63 | cs++; | ||
64 | ct++; | ||
65 | tcount--; | ||
66 | } while (tcount); | ||
67 | return 0; | ||
68 | } | ||
69 | |||
70 | /* Name hashing routines. Initial hash value */ | 50 | /* Name hashing routines. Initial hash value */ |
71 | /* Hash courtesy of the R5 hash in reiserfs modulo sign bits */ | 51 | /* Hash courtesy of the R5 hash in reiserfs modulo sign bits */ |
72 | #define init_name_hash() 0 | 52 | #define init_name_hash() 0 |
diff --git a/include/linux/kmsg_dump.h b/include/linux/kmsg_dump.h index fee66317e071..35f7237ec972 100644 --- a/include/linux/kmsg_dump.h +++ b/include/linux/kmsg_dump.h | |||
@@ -15,13 +15,18 @@ | |||
15 | #include <linux/errno.h> | 15 | #include <linux/errno.h> |
16 | #include <linux/list.h> | 16 | #include <linux/list.h> |
17 | 17 | ||
18 | /* | ||
19 | * Keep this list arranged in rough order of priority. Anything listed after | ||
20 | * KMSG_DUMP_OOPS will not be logged by default unless printk.always_kmsg_dump | ||
21 | * is passed to the kernel. | ||
22 | */ | ||
18 | enum kmsg_dump_reason { | 23 | enum kmsg_dump_reason { |
19 | KMSG_DUMP_OOPS, | ||
20 | KMSG_DUMP_PANIC, | 24 | KMSG_DUMP_PANIC, |
25 | KMSG_DUMP_OOPS, | ||
26 | KMSG_DUMP_EMERG, | ||
21 | KMSG_DUMP_RESTART, | 27 | KMSG_DUMP_RESTART, |
22 | KMSG_DUMP_HALT, | 28 | KMSG_DUMP_HALT, |
23 | KMSG_DUMP_POWEROFF, | 29 | KMSG_DUMP_POWEROFF, |
24 | KMSG_DUMP_EMERG, | ||
25 | }; | 30 | }; |
26 | 31 | ||
27 | /** | 32 | /** |
diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index 4d34356fe644..b80de520670b 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h | |||
@@ -129,7 +129,6 @@ extern void mem_cgroup_print_oom_info(struct mem_cgroup *memcg, | |||
129 | extern void mem_cgroup_replace_page_cache(struct page *oldpage, | 129 | extern void mem_cgroup_replace_page_cache(struct page *oldpage, |
130 | struct page *newpage); | 130 | struct page *newpage); |
131 | 131 | ||
132 | extern void mem_cgroup_reset_owner(struct page *page); | ||
133 | #ifdef CONFIG_CGROUP_MEM_RES_CTLR_SWAP | 132 | #ifdef CONFIG_CGROUP_MEM_RES_CTLR_SWAP |
134 | extern int do_swap_account; | 133 | extern int do_swap_account; |
135 | #endif | 134 | #endif |
@@ -392,10 +391,6 @@ static inline void mem_cgroup_replace_page_cache(struct page *oldpage, | |||
392 | struct page *newpage) | 391 | struct page *newpage) |
393 | { | 392 | { |
394 | } | 393 | } |
395 | |||
396 | static inline void mem_cgroup_reset_owner(struct page *page) | ||
397 | { | ||
398 | } | ||
399 | #endif /* CONFIG_CGROUP_MEM_CONT */ | 394 | #endif /* CONFIG_CGROUP_MEM_CONT */ |
400 | 395 | ||
401 | #if !defined(CONFIG_CGROUP_MEM_RES_CTLR) || !defined(CONFIG_DEBUG_VM) | 396 | #if !defined(CONFIG_CGROUP_MEM_RES_CTLR) || !defined(CONFIG_DEBUG_VM) |
diff --git a/include/linux/of.h b/include/linux/of.h index 50059cf63135..612f84b007c6 100644 --- a/include/linux/of.h +++ b/include/linux/of.h | |||
@@ -281,6 +281,14 @@ static inline struct property *of_find_property(const struct device_node *np, | |||
281 | return NULL; | 281 | return NULL; |
282 | } | 282 | } |
283 | 283 | ||
284 | static inline struct device_node *of_find_compatible_node( | ||
285 | struct device_node *from, | ||
286 | const char *type, | ||
287 | const char *compat) | ||
288 | { | ||
289 | return NULL; | ||
290 | } | ||
291 | |||
284 | static inline int of_property_read_u32_array(const struct device_node *np, | 292 | static inline int of_property_read_u32_array(const struct device_node *np, |
285 | const char *propname, | 293 | const char *propname, |
286 | u32 *out_values, size_t sz) | 294 | u32 *out_values, size_t sz) |
diff --git a/include/linux/percpu.h b/include/linux/percpu.h index 32cd1f67462e..21638ae14e07 100644 --- a/include/linux/percpu.h +++ b/include/linux/percpu.h | |||
@@ -348,9 +348,9 @@ do { \ | |||
348 | #define _this_cpu_generic_to_op(pcp, val, op) \ | 348 | #define _this_cpu_generic_to_op(pcp, val, op) \ |
349 | do { \ | 349 | do { \ |
350 | unsigned long flags; \ | 350 | unsigned long flags; \ |
351 | local_irq_save(flags); \ | 351 | raw_local_irq_save(flags); \ |
352 | *__this_cpu_ptr(&(pcp)) op val; \ | 352 | *__this_cpu_ptr(&(pcp)) op val; \ |
353 | local_irq_restore(flags); \ | 353 | raw_local_irq_restore(flags); \ |
354 | } while (0) | 354 | } while (0) |
355 | 355 | ||
356 | #ifndef this_cpu_write | 356 | #ifndef this_cpu_write |
@@ -449,10 +449,10 @@ do { \ | |||
449 | ({ \ | 449 | ({ \ |
450 | typeof(pcp) ret__; \ | 450 | typeof(pcp) ret__; \ |
451 | unsigned long flags; \ | 451 | unsigned long flags; \ |
452 | local_irq_save(flags); \ | 452 | raw_local_irq_save(flags); \ |
453 | __this_cpu_add(pcp, val); \ | 453 | __this_cpu_add(pcp, val); \ |
454 | ret__ = __this_cpu_read(pcp); \ | 454 | ret__ = __this_cpu_read(pcp); \ |
455 | local_irq_restore(flags); \ | 455 | raw_local_irq_restore(flags); \ |
456 | ret__; \ | 456 | ret__; \ |
457 | }) | 457 | }) |
458 | 458 | ||
@@ -479,10 +479,10 @@ do { \ | |||
479 | #define _this_cpu_generic_xchg(pcp, nval) \ | 479 | #define _this_cpu_generic_xchg(pcp, nval) \ |
480 | ({ typeof(pcp) ret__; \ | 480 | ({ typeof(pcp) ret__; \ |
481 | unsigned long flags; \ | 481 | unsigned long flags; \ |
482 | local_irq_save(flags); \ | 482 | raw_local_irq_save(flags); \ |
483 | ret__ = __this_cpu_read(pcp); \ | 483 | ret__ = __this_cpu_read(pcp); \ |
484 | __this_cpu_write(pcp, nval); \ | 484 | __this_cpu_write(pcp, nval); \ |
485 | local_irq_restore(flags); \ | 485 | raw_local_irq_restore(flags); \ |
486 | ret__; \ | 486 | ret__; \ |
487 | }) | 487 | }) |
488 | 488 | ||
@@ -507,11 +507,11 @@ do { \ | |||
507 | ({ \ | 507 | ({ \ |
508 | typeof(pcp) ret__; \ | 508 | typeof(pcp) ret__; \ |
509 | unsigned long flags; \ | 509 | unsigned long flags; \ |
510 | local_irq_save(flags); \ | 510 | raw_local_irq_save(flags); \ |
511 | ret__ = __this_cpu_read(pcp); \ | 511 | ret__ = __this_cpu_read(pcp); \ |
512 | if (ret__ == (oval)) \ | 512 | if (ret__ == (oval)) \ |
513 | __this_cpu_write(pcp, nval); \ | 513 | __this_cpu_write(pcp, nval); \ |
514 | local_irq_restore(flags); \ | 514 | raw_local_irq_restore(flags); \ |
515 | ret__; \ | 515 | ret__; \ |
516 | }) | 516 | }) |
517 | 517 | ||
@@ -544,10 +544,10 @@ do { \ | |||
544 | ({ \ | 544 | ({ \ |
545 | int ret__; \ | 545 | int ret__; \ |
546 | unsigned long flags; \ | 546 | unsigned long flags; \ |
547 | local_irq_save(flags); \ | 547 | raw_local_irq_save(flags); \ |
548 | ret__ = __this_cpu_generic_cmpxchg_double(pcp1, pcp2, \ | 548 | ret__ = __this_cpu_generic_cmpxchg_double(pcp1, pcp2, \ |
549 | oval1, oval2, nval1, nval2); \ | 549 | oval1, oval2, nval1, nval2); \ |
550 | local_irq_restore(flags); \ | 550 | raw_local_irq_restore(flags); \ |
551 | ret__; \ | 551 | ret__; \ |
552 | }) | 552 | }) |
553 | 553 | ||
@@ -718,12 +718,13 @@ do { \ | |||
718 | # ifndef __this_cpu_add_return_8 | 718 | # ifndef __this_cpu_add_return_8 |
719 | # define __this_cpu_add_return_8(pcp, val) __this_cpu_generic_add_return(pcp, val) | 719 | # define __this_cpu_add_return_8(pcp, val) __this_cpu_generic_add_return(pcp, val) |
720 | # endif | 720 | # endif |
721 | # define __this_cpu_add_return(pcp, val) __pcpu_size_call_return2(this_cpu_add_return_, pcp, val) | 721 | # define __this_cpu_add_return(pcp, val) \ |
722 | __pcpu_size_call_return2(__this_cpu_add_return_, pcp, val) | ||
722 | #endif | 723 | #endif |
723 | 724 | ||
724 | #define __this_cpu_sub_return(pcp, val) this_cpu_add_return(pcp, -(val)) | 725 | #define __this_cpu_sub_return(pcp, val) __this_cpu_add_return(pcp, -(val)) |
725 | #define __this_cpu_inc_return(pcp) this_cpu_add_return(pcp, 1) | 726 | #define __this_cpu_inc_return(pcp) __this_cpu_add_return(pcp, 1) |
726 | #define __this_cpu_dec_return(pcp) this_cpu_add_return(pcp, -1) | 727 | #define __this_cpu_dec_return(pcp) __this_cpu_add_return(pcp, -1) |
727 | 728 | ||
728 | #define __this_cpu_generic_xchg(pcp, nval) \ | 729 | #define __this_cpu_generic_xchg(pcp, nval) \ |
729 | ({ typeof(pcp) ret__; \ | 730 | ({ typeof(pcp) ret__; \ |
diff --git a/include/linux/sched.h b/include/linux/sched.h index 7d379a6bfd88..0657368bd78f 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
@@ -1777,7 +1777,6 @@ extern void thread_group_times(struct task_struct *p, cputime_t *ut, cputime_t * | |||
1777 | /* | 1777 | /* |
1778 | * Per process flags | 1778 | * Per process flags |
1779 | */ | 1779 | */ |
1780 | #define PF_STARTING 0x00000002 /* being created */ | ||
1781 | #define PF_EXITING 0x00000004 /* getting shut down */ | 1780 | #define PF_EXITING 0x00000004 /* getting shut down */ |
1782 | #define PF_EXITPIDONE 0x00000008 /* pi exit done on shut down */ | 1781 | #define PF_EXITPIDONE 0x00000008 /* pi exit done on shut down */ |
1783 | #define PF_VCPU 0x00000010 /* I'm a virtual CPU */ | 1782 | #define PF_VCPU 0x00000010 /* I'm a virtual CPU */ |
@@ -2371,7 +2370,7 @@ static inline int thread_group_empty(struct task_struct *p) | |||
2371 | * Protects ->fs, ->files, ->mm, ->group_info, ->comm, keyring | 2370 | * Protects ->fs, ->files, ->mm, ->group_info, ->comm, keyring |
2372 | * subscriptions and synchronises with wait4(). Also used in procfs. Also | 2371 | * subscriptions and synchronises with wait4(). Also used in procfs. Also |
2373 | * pins the final release of task.io_context. Also protects ->cpuset and | 2372 | * pins the final release of task.io_context. Also protects ->cpuset and |
2374 | * ->cgroup.subsys[]. | 2373 | * ->cgroup.subsys[]. And ->vfork_done. |
2375 | * | 2374 | * |
2376 | * Nests both inside and outside of read_lock(&tasklist_lock). | 2375 | * Nests both inside and outside of read_lock(&tasklist_lock). |
2377 | * It must not be nested with write_lock_irq(&tasklist_lock), | 2376 | * It must not be nested with write_lock_irq(&tasklist_lock), |
diff --git a/include/linux/tcp.h b/include/linux/tcp.h index 46a85c9e1f25..3c7ffdb40dc6 100644 --- a/include/linux/tcp.h +++ b/include/linux/tcp.h | |||
@@ -412,7 +412,8 @@ struct tcp_sock { | |||
412 | 412 | ||
413 | struct tcp_sack_block recv_sack_cache[4]; | 413 | struct tcp_sack_block recv_sack_cache[4]; |
414 | 414 | ||
415 | struct sk_buff *highest_sack; /* highest skb with SACK received | 415 | struct sk_buff *highest_sack; /* skb just after the highest |
416 | * skb with SACKed bit set | ||
416 | * (validity guaranteed only if | 417 | * (validity guaranteed only if |
417 | * sacked_out > 0) | 418 | * sacked_out > 0) |
418 | */ | 419 | */ |
diff --git a/include/net/inetpeer.h b/include/net/inetpeer.h index 06b795dd5906..b94765e38e80 100644 --- a/include/net/inetpeer.h +++ b/include/net/inetpeer.h | |||
@@ -35,12 +35,12 @@ struct inet_peer { | |||
35 | 35 | ||
36 | u32 metrics[RTAX_MAX]; | 36 | u32 metrics[RTAX_MAX]; |
37 | u32 rate_tokens; /* rate limiting for ICMP */ | 37 | u32 rate_tokens; /* rate limiting for ICMP */ |
38 | int redirect_genid; | ||
39 | unsigned long rate_last; | 38 | unsigned long rate_last; |
40 | unsigned long pmtu_expires; | 39 | unsigned long pmtu_expires; |
41 | u32 pmtu_orig; | 40 | u32 pmtu_orig; |
42 | u32 pmtu_learned; | 41 | u32 pmtu_learned; |
43 | struct inetpeer_addr_base redirect_learned; | 42 | struct inetpeer_addr_base redirect_learned; |
43 | struct list_head gc_list; | ||
44 | /* | 44 | /* |
45 | * Once inet_peer is queued for deletion (refcnt == -1), following fields | 45 | * Once inet_peer is queued for deletion (refcnt == -1), following fields |
46 | * are not available: rid, ip_id_count, tcp_ts, tcp_ts_stamp | 46 | * are not available: rid, ip_id_count, tcp_ts, tcp_ts_stamp |
@@ -96,6 +96,8 @@ static inline struct inet_peer *inet_getpeer_v6(const struct in6_addr *v6daddr, | |||
96 | extern void inet_putpeer(struct inet_peer *p); | 96 | extern void inet_putpeer(struct inet_peer *p); |
97 | extern bool inet_peer_xrlim_allow(struct inet_peer *peer, int timeout); | 97 | extern bool inet_peer_xrlim_allow(struct inet_peer *peer, int timeout); |
98 | 98 | ||
99 | extern void inetpeer_invalidate_tree(int family); | ||
100 | |||
99 | /* | 101 | /* |
100 | * temporary check to make sure we dont access rid, ip_id_count, tcp_ts, | 102 | * temporary check to make sure we dont access rid, ip_id_count, tcp_ts, |
101 | * tcp_ts_stamp if no refcount is taken on inet_peer | 103 | * tcp_ts_stamp if no refcount is taken on inet_peer |
diff --git a/include/net/tcp.h b/include/net/tcp.h index 42c29bfbcee3..2d80c291fffb 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h | |||
@@ -1364,8 +1364,9 @@ static inline void tcp_push_pending_frames(struct sock *sk) | |||
1364 | } | 1364 | } |
1365 | } | 1365 | } |
1366 | 1366 | ||
1367 | /* Start sequence of the highest skb with SACKed bit, valid only if | 1367 | /* Start sequence of the skb just after the highest skb with SACKed |
1368 | * sacked > 0 or when the caller has ensured validity by itself. | 1368 | * bit, valid only if sacked_out > 0 or when the caller has ensured |
1369 | * validity by itself. | ||
1369 | */ | 1370 | */ |
1370 | static inline u32 tcp_highest_sack_seq(struct tcp_sock *tp) | 1371 | static inline u32 tcp_highest_sack_seq(struct tcp_sock *tp) |
1371 | { | 1372 | { |
diff --git a/kernel/fork.c b/kernel/fork.c index e2cd3e2a5ae8..26a7a6707fa7 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
@@ -668,6 +668,38 @@ struct mm_struct *mm_access(struct task_struct *task, unsigned int mode) | |||
668 | return mm; | 668 | return mm; |
669 | } | 669 | } |
670 | 670 | ||
671 | static void complete_vfork_done(struct task_struct *tsk) | ||
672 | { | ||
673 | struct completion *vfork; | ||
674 | |||
675 | task_lock(tsk); | ||
676 | vfork = tsk->vfork_done; | ||
677 | if (likely(vfork)) { | ||
678 | tsk->vfork_done = NULL; | ||
679 | complete(vfork); | ||
680 | } | ||
681 | task_unlock(tsk); | ||
682 | } | ||
683 | |||
684 | static int wait_for_vfork_done(struct task_struct *child, | ||
685 | struct completion *vfork) | ||
686 | { | ||
687 | int killed; | ||
688 | |||
689 | freezer_do_not_count(); | ||
690 | killed = wait_for_completion_killable(vfork); | ||
691 | freezer_count(); | ||
692 | |||
693 | if (killed) { | ||
694 | task_lock(child); | ||
695 | child->vfork_done = NULL; | ||
696 | task_unlock(child); | ||
697 | } | ||
698 | |||
699 | put_task_struct(child); | ||
700 | return killed; | ||
701 | } | ||
702 | |||
671 | /* Please note the differences between mmput and mm_release. | 703 | /* Please note the differences between mmput and mm_release. |
672 | * mmput is called whenever we stop holding onto a mm_struct, | 704 | * mmput is called whenever we stop holding onto a mm_struct, |
673 | * error success whatever. | 705 | * error success whatever. |
@@ -683,8 +715,6 @@ struct mm_struct *mm_access(struct task_struct *task, unsigned int mode) | |||
683 | */ | 715 | */ |
684 | void mm_release(struct task_struct *tsk, struct mm_struct *mm) | 716 | void mm_release(struct task_struct *tsk, struct mm_struct *mm) |
685 | { | 717 | { |
686 | struct completion *vfork_done = tsk->vfork_done; | ||
687 | |||
688 | /* Get rid of any futexes when releasing the mm */ | 718 | /* Get rid of any futexes when releasing the mm */ |
689 | #ifdef CONFIG_FUTEX | 719 | #ifdef CONFIG_FUTEX |
690 | if (unlikely(tsk->robust_list)) { | 720 | if (unlikely(tsk->robust_list)) { |
@@ -704,17 +734,15 @@ void mm_release(struct task_struct *tsk, struct mm_struct *mm) | |||
704 | /* Get rid of any cached register state */ | 734 | /* Get rid of any cached register state */ |
705 | deactivate_mm(tsk, mm); | 735 | deactivate_mm(tsk, mm); |
706 | 736 | ||
707 | /* notify parent sleeping on vfork() */ | 737 | if (tsk->vfork_done) |
708 | if (vfork_done) { | 738 | complete_vfork_done(tsk); |
709 | tsk->vfork_done = NULL; | ||
710 | complete(vfork_done); | ||
711 | } | ||
712 | 739 | ||
713 | /* | 740 | /* |
714 | * If we're exiting normally, clear a user-space tid field if | 741 | * If we're exiting normally, clear a user-space tid field if |
715 | * requested. We leave this alone when dying by signal, to leave | 742 | * requested. We leave this alone when dying by signal, to leave |
716 | * the value intact in a core dump, and to save the unnecessary | 743 | * the value intact in a core dump, and to save the unnecessary |
717 | * trouble otherwise. Userland only wants this done for a sys_exit. | 744 | * trouble, say, a killed vfork parent shouldn't touch this mm. |
745 | * Userland only wants this done for a sys_exit. | ||
718 | */ | 746 | */ |
719 | if (tsk->clear_child_tid) { | 747 | if (tsk->clear_child_tid) { |
720 | if (!(tsk->flags & PF_SIGNALED) && | 748 | if (!(tsk->flags & PF_SIGNALED) && |
@@ -1018,7 +1046,6 @@ static void copy_flags(unsigned long clone_flags, struct task_struct *p) | |||
1018 | 1046 | ||
1019 | new_flags &= ~(PF_SUPERPRIV | PF_WQ_WORKER); | 1047 | new_flags &= ~(PF_SUPERPRIV | PF_WQ_WORKER); |
1020 | new_flags |= PF_FORKNOEXEC; | 1048 | new_flags |= PF_FORKNOEXEC; |
1021 | new_flags |= PF_STARTING; | ||
1022 | p->flags = new_flags; | 1049 | p->flags = new_flags; |
1023 | } | 1050 | } |
1024 | 1051 | ||
@@ -1548,16 +1575,9 @@ long do_fork(unsigned long clone_flags, | |||
1548 | if (clone_flags & CLONE_VFORK) { | 1575 | if (clone_flags & CLONE_VFORK) { |
1549 | p->vfork_done = &vfork; | 1576 | p->vfork_done = &vfork; |
1550 | init_completion(&vfork); | 1577 | init_completion(&vfork); |
1578 | get_task_struct(p); | ||
1551 | } | 1579 | } |
1552 | 1580 | ||
1553 | /* | ||
1554 | * We set PF_STARTING at creation in case tracing wants to | ||
1555 | * use this to distinguish a fully live task from one that | ||
1556 | * hasn't finished SIGSTOP raising yet. Now we clear it | ||
1557 | * and set the child going. | ||
1558 | */ | ||
1559 | p->flags &= ~PF_STARTING; | ||
1560 | |||
1561 | wake_up_new_task(p); | 1581 | wake_up_new_task(p); |
1562 | 1582 | ||
1563 | /* forking complete and child started to run, tell ptracer */ | 1583 | /* forking complete and child started to run, tell ptracer */ |
@@ -1565,10 +1585,8 @@ long do_fork(unsigned long clone_flags, | |||
1565 | ptrace_event(trace, nr); | 1585 | ptrace_event(trace, nr); |
1566 | 1586 | ||
1567 | if (clone_flags & CLONE_VFORK) { | 1587 | if (clone_flags & CLONE_VFORK) { |
1568 | freezer_do_not_count(); | 1588 | if (!wait_for_vfork_done(p, &vfork)) |
1569 | wait_for_completion(&vfork); | 1589 | ptrace_event(PTRACE_EVENT_VFORK_DONE, nr); |
1570 | freezer_count(); | ||
1571 | ptrace_event(PTRACE_EVENT_VFORK_DONE, nr); | ||
1572 | } | 1590 | } |
1573 | } else { | 1591 | } else { |
1574 | nr = PTR_ERR(p); | 1592 | nr = PTR_ERR(p); |
diff --git a/kernel/hung_task.c b/kernel/hung_task.c index 2e48ec0c2e91..c21449f85a2a 100644 --- a/kernel/hung_task.c +++ b/kernel/hung_task.c | |||
@@ -119,15 +119,20 @@ static void check_hung_task(struct task_struct *t, unsigned long timeout) | |||
119 | * For preemptible RCU it is sufficient to call rcu_read_unlock in order | 119 | * For preemptible RCU it is sufficient to call rcu_read_unlock in order |
120 | * to exit the grace period. For classic RCU, a reschedule is required. | 120 | * to exit the grace period. For classic RCU, a reschedule is required. |
121 | */ | 121 | */ |
122 | static void rcu_lock_break(struct task_struct *g, struct task_struct *t) | 122 | static bool rcu_lock_break(struct task_struct *g, struct task_struct *t) |
123 | { | 123 | { |
124 | bool can_cont; | ||
125 | |||
124 | get_task_struct(g); | 126 | get_task_struct(g); |
125 | get_task_struct(t); | 127 | get_task_struct(t); |
126 | rcu_read_unlock(); | 128 | rcu_read_unlock(); |
127 | cond_resched(); | 129 | cond_resched(); |
128 | rcu_read_lock(); | 130 | rcu_read_lock(); |
131 | can_cont = pid_alive(g) && pid_alive(t); | ||
129 | put_task_struct(t); | 132 | put_task_struct(t); |
130 | put_task_struct(g); | 133 | put_task_struct(g); |
134 | |||
135 | return can_cont; | ||
131 | } | 136 | } |
132 | 137 | ||
133 | /* | 138 | /* |
@@ -154,9 +159,7 @@ static void check_hung_uninterruptible_tasks(unsigned long timeout) | |||
154 | goto unlock; | 159 | goto unlock; |
155 | if (!--batch_count) { | 160 | if (!--batch_count) { |
156 | batch_count = HUNG_TASK_BATCHING; | 161 | batch_count = HUNG_TASK_BATCHING; |
157 | rcu_lock_break(g, t); | 162 | if (!rcu_lock_break(g, t)) |
158 | /* Exit if t or g was unhashed during refresh. */ | ||
159 | if (t->state == TASK_DEAD || g->state == TASK_DEAD) | ||
160 | goto unlock; | 163 | goto unlock; |
161 | } | 164 | } |
162 | /* use "==" to skip the TASK_KILLABLE tasks waiting on NFS */ | 165 | /* use "==" to skip the TASK_KILLABLE tasks waiting on NFS */ |
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 32313c084442..0f0d4704ddd8 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c | |||
@@ -985,6 +985,11 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new) | |||
985 | 985 | ||
986 | /* add new interrupt at end of irq queue */ | 986 | /* add new interrupt at end of irq queue */ |
987 | do { | 987 | do { |
988 | /* | ||
989 | * Or all existing action->thread_mask bits, | ||
990 | * so we can find the next zero bit for this | ||
991 | * new action. | ||
992 | */ | ||
988 | thread_mask |= old->thread_mask; | 993 | thread_mask |= old->thread_mask; |
989 | old_ptr = &old->next; | 994 | old_ptr = &old->next; |
990 | old = *old_ptr; | 995 | old = *old_ptr; |
@@ -993,14 +998,41 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new) | |||
993 | } | 998 | } |
994 | 999 | ||
995 | /* | 1000 | /* |
996 | * Setup the thread mask for this irqaction. Unlikely to have | 1001 | * Setup the thread mask for this irqaction for ONESHOT. For |
997 | * 32 resp 64 irqs sharing one line, but who knows. | 1002 | * !ONESHOT irqs the thread mask is 0 so we can avoid a |
1003 | * conditional in irq_wake_thread(). | ||
998 | */ | 1004 | */ |
999 | if (new->flags & IRQF_ONESHOT && thread_mask == ~0UL) { | 1005 | if (new->flags & IRQF_ONESHOT) { |
1000 | ret = -EBUSY; | 1006 | /* |
1001 | goto out_mask; | 1007 | * Unlikely to have 32 resp 64 irqs sharing one line, |
1008 | * but who knows. | ||
1009 | */ | ||
1010 | if (thread_mask == ~0UL) { | ||
1011 | ret = -EBUSY; | ||
1012 | goto out_mask; | ||
1013 | } | ||
1014 | /* | ||
1015 | * The thread_mask for the action is or'ed to | ||
1016 | * desc->thread_active to indicate that the | ||
1017 | * IRQF_ONESHOT thread handler has been woken, but not | ||
1018 | * yet finished. The bit is cleared when a thread | ||
1019 | * completes. When all threads of a shared interrupt | ||
1020 | * line have completed desc->threads_active becomes | ||
1021 | * zero and the interrupt line is unmasked. See | ||
1022 | * handle.c:irq_wake_thread() for further information. | ||
1023 | * | ||
1024 | * If no thread is woken by primary (hard irq context) | ||
1025 | * interrupt handlers, then desc->threads_active is | ||
1026 | * also checked for zero to unmask the irq line in the | ||
1027 | * affected hard irq flow handlers | ||
1028 | * (handle_[fasteoi|level]_irq). | ||
1029 | * | ||
1030 | * The new action gets the first zero bit of | ||
1031 | * thread_mask assigned. See the loop above which or's | ||
1032 | * all existing action->thread_mask bits. | ||
1033 | */ | ||
1034 | new->thread_mask = 1 << ffz(thread_mask); | ||
1002 | } | 1035 | } |
1003 | new->thread_mask = 1 << ffz(thread_mask); | ||
1004 | 1036 | ||
1005 | if (!shared) { | 1037 | if (!shared) { |
1006 | init_waitqueue_head(&desc->wait_for_threads); | 1038 | init_waitqueue_head(&desc->wait_for_threads); |
diff --git a/kernel/kprobes.c b/kernel/kprobes.c index 9788c0ec6f43..c62b8546cc90 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c | |||
@@ -1334,8 +1334,10 @@ int __kprobes register_kprobe(struct kprobe *p) | |||
1334 | if (!kernel_text_address((unsigned long) p->addr) || | 1334 | if (!kernel_text_address((unsigned long) p->addr) || |
1335 | in_kprobes_functions((unsigned long) p->addr) || | 1335 | in_kprobes_functions((unsigned long) p->addr) || |
1336 | ftrace_text_reserved(p->addr, p->addr) || | 1336 | ftrace_text_reserved(p->addr, p->addr) || |
1337 | jump_label_text_reserved(p->addr, p->addr)) | 1337 | jump_label_text_reserved(p->addr, p->addr)) { |
1338 | goto fail_with_jump_label; | 1338 | ret = -EINVAL; |
1339 | goto cannot_probe; | ||
1340 | } | ||
1339 | 1341 | ||
1340 | /* User can pass only KPROBE_FLAG_DISABLED to register_kprobe */ | 1342 | /* User can pass only KPROBE_FLAG_DISABLED to register_kprobe */ |
1341 | p->flags &= KPROBE_FLAG_DISABLED; | 1343 | p->flags &= KPROBE_FLAG_DISABLED; |
@@ -1352,7 +1354,7 @@ int __kprobes register_kprobe(struct kprobe *p) | |||
1352 | * its code to prohibit unexpected unloading. | 1354 | * its code to prohibit unexpected unloading. |
1353 | */ | 1355 | */ |
1354 | if (unlikely(!try_module_get(probed_mod))) | 1356 | if (unlikely(!try_module_get(probed_mod))) |
1355 | goto fail_with_jump_label; | 1357 | goto cannot_probe; |
1356 | 1358 | ||
1357 | /* | 1359 | /* |
1358 | * If the module freed .init.text, we couldn't insert | 1360 | * If the module freed .init.text, we couldn't insert |
@@ -1361,7 +1363,7 @@ int __kprobes register_kprobe(struct kprobe *p) | |||
1361 | if (within_module_init((unsigned long)p->addr, probed_mod) && | 1363 | if (within_module_init((unsigned long)p->addr, probed_mod) && |
1362 | probed_mod->state != MODULE_STATE_COMING) { | 1364 | probed_mod->state != MODULE_STATE_COMING) { |
1363 | module_put(probed_mod); | 1365 | module_put(probed_mod); |
1364 | goto fail_with_jump_label; | 1366 | goto cannot_probe; |
1365 | } | 1367 | } |
1366 | /* ret will be updated by following code */ | 1368 | /* ret will be updated by following code */ |
1367 | } | 1369 | } |
@@ -1409,7 +1411,7 @@ out: | |||
1409 | 1411 | ||
1410 | return ret; | 1412 | return ret; |
1411 | 1413 | ||
1412 | fail_with_jump_label: | 1414 | cannot_probe: |
1413 | preempt_enable(); | 1415 | preempt_enable(); |
1414 | jump_label_unlock(); | 1416 | jump_label_unlock(); |
1415 | return ret; | 1417 | return ret; |
diff --git a/kernel/printk.c b/kernel/printk.c index 13c0a1143f49..32690a0b7a18 100644 --- a/kernel/printk.c +++ b/kernel/printk.c | |||
@@ -702,6 +702,9 @@ static bool printk_time = 0; | |||
702 | #endif | 702 | #endif |
703 | module_param_named(time, printk_time, bool, S_IRUGO | S_IWUSR); | 703 | module_param_named(time, printk_time, bool, S_IRUGO | S_IWUSR); |
704 | 704 | ||
705 | static bool always_kmsg_dump; | ||
706 | module_param_named(always_kmsg_dump, always_kmsg_dump, bool, S_IRUGO | S_IWUSR); | ||
707 | |||
705 | /* Check if we have any console registered that can be called early in boot. */ | 708 | /* Check if we have any console registered that can be called early in boot. */ |
706 | static int have_callable_console(void) | 709 | static int have_callable_console(void) |
707 | { | 710 | { |
@@ -1732,6 +1735,9 @@ void kmsg_dump(enum kmsg_dump_reason reason) | |||
1732 | unsigned long l1, l2; | 1735 | unsigned long l1, l2; |
1733 | unsigned long flags; | 1736 | unsigned long flags; |
1734 | 1737 | ||
1738 | if ((reason > KMSG_DUMP_OOPS) && !always_kmsg_dump) | ||
1739 | return; | ||
1740 | |||
1735 | /* Theoretically, the log could move on after we do this, but | 1741 | /* Theoretically, the log could move on after we do this, but |
1736 | there's not a lot we can do about that. The new messages | 1742 | there's not a lot we can do about that. The new messages |
1737 | will overwrite the start of what we dump. */ | 1743 | will overwrite the start of what we dump. */ |
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 33a0676ea744..b342f57879e6 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c | |||
@@ -6728,7 +6728,7 @@ int __init sched_create_sysfs_power_savings_entries(struct device *dev) | |||
6728 | static int cpuset_cpu_active(struct notifier_block *nfb, unsigned long action, | 6728 | static int cpuset_cpu_active(struct notifier_block *nfb, unsigned long action, |
6729 | void *hcpu) | 6729 | void *hcpu) |
6730 | { | 6730 | { |
6731 | switch (action) { | 6731 | switch (action & ~CPU_TASKS_FROZEN) { |
6732 | case CPU_ONLINE: | 6732 | case CPU_ONLINE: |
6733 | case CPU_DOWN_FAILED: | 6733 | case CPU_DOWN_FAILED: |
6734 | cpuset_update_active_cpus(); | 6734 | cpuset_update_active_cpus(); |
@@ -6741,7 +6741,7 @@ static int cpuset_cpu_active(struct notifier_block *nfb, unsigned long action, | |||
6741 | static int cpuset_cpu_inactive(struct notifier_block *nfb, unsigned long action, | 6741 | static int cpuset_cpu_inactive(struct notifier_block *nfb, unsigned long action, |
6742 | void *hcpu) | 6742 | void *hcpu) |
6743 | { | 6743 | { |
6744 | switch (action) { | 6744 | switch (action & ~CPU_TASKS_FROZEN) { |
6745 | case CPU_DOWN_PREPARE: | 6745 | case CPU_DOWN_PREPARE: |
6746 | cpuset_update_active_cpus(); | 6746 | cpuset_update_active_cpus(); |
6747 | return NOTIFY_OK; | 6747 | return NOTIFY_OK; |
diff --git a/lib/debugobjects.c b/lib/debugobjects.c index 77cb245f8e7b..0ab9ae8057f0 100644 --- a/lib/debugobjects.c +++ b/lib/debugobjects.c | |||
@@ -818,17 +818,9 @@ static int __init fixup_activate(void *addr, enum debug_obj_state state) | |||
818 | if (obj->static_init == 1) { | 818 | if (obj->static_init == 1) { |
819 | debug_object_init(obj, &descr_type_test); | 819 | debug_object_init(obj, &descr_type_test); |
820 | debug_object_activate(obj, &descr_type_test); | 820 | debug_object_activate(obj, &descr_type_test); |
821 | /* | 821 | return 0; |
822 | * Real code should return 0 here ! This is | ||
823 | * not a fixup of some bad behaviour. We | ||
824 | * merily call the debug_init function to keep | ||
825 | * track of the object. | ||
826 | */ | ||
827 | return 1; | ||
828 | } else { | ||
829 | /* Real code needs to emit a warning here */ | ||
830 | } | 822 | } |
831 | return 0; | 823 | return 1; |
832 | 824 | ||
833 | case ODEBUG_STATE_ACTIVE: | 825 | case ODEBUG_STATE_ACTIVE: |
834 | debug_object_deactivate(obj, &descr_type_test); | 826 | debug_object_deactivate(obj, &descr_type_test); |
@@ -967,7 +959,7 @@ static void __init debug_objects_selftest(void) | |||
967 | 959 | ||
968 | obj.static_init = 1; | 960 | obj.static_init = 1; |
969 | debug_object_activate(&obj, &descr_type_test); | 961 | debug_object_activate(&obj, &descr_type_test); |
970 | if (check_results(&obj, ODEBUG_STATE_ACTIVE, ++fixups, warnings)) | 962 | if (check_results(&obj, ODEBUG_STATE_ACTIVE, fixups, warnings)) |
971 | goto out; | 963 | goto out; |
972 | debug_object_init(&obj, &descr_type_test); | 964 | debug_object_init(&obj, &descr_type_test); |
973 | if (check_results(&obj, ODEBUG_STATE_INIT, ++fixups, ++warnings)) | 965 | if (check_results(&obj, ODEBUG_STATE_INIT, ++fixups, ++warnings)) |
diff --git a/lib/vsprintf.c b/lib/vsprintf.c index 8e75003d62f6..38e612e66da5 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c | |||
@@ -891,9 +891,15 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr, | |||
891 | case 'U': | 891 | case 'U': |
892 | return uuid_string(buf, end, ptr, spec, fmt); | 892 | return uuid_string(buf, end, ptr, spec, fmt); |
893 | case 'V': | 893 | case 'V': |
894 | return buf + vsnprintf(buf, end > buf ? end - buf : 0, | 894 | { |
895 | ((struct va_format *)ptr)->fmt, | 895 | va_list va; |
896 | *(((struct va_format *)ptr)->va)); | 896 | |
897 | va_copy(va, *((struct va_format *)ptr)->va); | ||
898 | buf += vsnprintf(buf, end > buf ? end - buf : 0, | ||
899 | ((struct va_format *)ptr)->fmt, va); | ||
900 | va_end(va); | ||
901 | return buf; | ||
902 | } | ||
897 | case 'K': | 903 | case 'K': |
898 | /* | 904 | /* |
899 | * %pK cannot be used in IRQ context because its test | 905 | * %pK cannot be used in IRQ context because its test |
diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 91d3efb25d15..8f7fc394f636 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c | |||
@@ -671,6 +671,7 @@ static int __do_huge_pmd_anonymous_page(struct mm_struct *mm, | |||
671 | set_pmd_at(mm, haddr, pmd, entry); | 671 | set_pmd_at(mm, haddr, pmd, entry); |
672 | prepare_pmd_huge_pte(pgtable, mm); | 672 | prepare_pmd_huge_pte(pgtable, mm); |
673 | add_mm_counter(mm, MM_ANONPAGES, HPAGE_PMD_NR); | 673 | add_mm_counter(mm, MM_ANONPAGES, HPAGE_PMD_NR); |
674 | mm->nr_ptes++; | ||
674 | spin_unlock(&mm->page_table_lock); | 675 | spin_unlock(&mm->page_table_lock); |
675 | } | 676 | } |
676 | 677 | ||
@@ -789,6 +790,7 @@ int copy_huge_pmd(struct mm_struct *dst_mm, struct mm_struct *src_mm, | |||
789 | pmd = pmd_mkold(pmd_wrprotect(pmd)); | 790 | pmd = pmd_mkold(pmd_wrprotect(pmd)); |
790 | set_pmd_at(dst_mm, addr, dst_pmd, pmd); | 791 | set_pmd_at(dst_mm, addr, dst_pmd, pmd); |
791 | prepare_pmd_huge_pte(pgtable, dst_mm); | 792 | prepare_pmd_huge_pte(pgtable, dst_mm); |
793 | dst_mm->nr_ptes++; | ||
792 | 794 | ||
793 | ret = 0; | 795 | ret = 0; |
794 | out_unlock: | 796 | out_unlock: |
@@ -887,7 +889,6 @@ static int do_huge_pmd_wp_page_fallback(struct mm_struct *mm, | |||
887 | } | 889 | } |
888 | kfree(pages); | 890 | kfree(pages); |
889 | 891 | ||
890 | mm->nr_ptes++; | ||
891 | smp_wmb(); /* make pte visible before pmd */ | 892 | smp_wmb(); /* make pte visible before pmd */ |
892 | pmd_populate(mm, pmd, pgtable); | 893 | pmd_populate(mm, pmd, pgtable); |
893 | page_remove_rmap(page); | 894 | page_remove_rmap(page); |
@@ -1047,6 +1048,7 @@ int zap_huge_pmd(struct mmu_gather *tlb, struct vm_area_struct *vma, | |||
1047 | VM_BUG_ON(page_mapcount(page) < 0); | 1048 | VM_BUG_ON(page_mapcount(page) < 0); |
1048 | add_mm_counter(tlb->mm, MM_ANONPAGES, -HPAGE_PMD_NR); | 1049 | add_mm_counter(tlb->mm, MM_ANONPAGES, -HPAGE_PMD_NR); |
1049 | VM_BUG_ON(!PageHead(page)); | 1050 | VM_BUG_ON(!PageHead(page)); |
1051 | tlb->mm->nr_ptes--; | ||
1050 | spin_unlock(&tlb->mm->page_table_lock); | 1052 | spin_unlock(&tlb->mm->page_table_lock); |
1051 | tlb_remove_page(tlb, page); | 1053 | tlb_remove_page(tlb, page); |
1052 | pte_free(tlb->mm, pgtable); | 1054 | pte_free(tlb->mm, pgtable); |
@@ -1375,7 +1377,6 @@ static int __split_huge_page_map(struct page *page, | |||
1375 | pte_unmap(pte); | 1377 | pte_unmap(pte); |
1376 | } | 1378 | } |
1377 | 1379 | ||
1378 | mm->nr_ptes++; | ||
1379 | smp_wmb(); /* make pte visible before pmd */ | 1380 | smp_wmb(); /* make pte visible before pmd */ |
1380 | /* | 1381 | /* |
1381 | * Up to this point the pmd is present and huge and | 1382 | * Up to this point the pmd is present and huge and |
@@ -1988,7 +1989,6 @@ static void collapse_huge_page(struct mm_struct *mm, | |||
1988 | set_pmd_at(mm, address, pmd, _pmd); | 1989 | set_pmd_at(mm, address, pmd, _pmd); |
1989 | update_mmu_cache(vma, address, _pmd); | 1990 | update_mmu_cache(vma, address, _pmd); |
1990 | prepare_pmd_huge_pte(pgtable, mm); | 1991 | prepare_pmd_huge_pte(pgtable, mm); |
1991 | mm->nr_ptes--; | ||
1992 | spin_unlock(&mm->page_table_lock); | 1992 | spin_unlock(&mm->page_table_lock); |
1993 | 1993 | ||
1994 | #ifndef CONFIG_NUMA | 1994 | #ifndef CONFIG_NUMA |
diff --git a/mm/hugetlb.c b/mm/hugetlb.c index 5f34bd8dda34..a876871f6be5 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c | |||
@@ -2277,8 +2277,8 @@ void __unmap_hugepage_range(struct vm_area_struct *vma, unsigned long start, | |||
2277 | set_page_dirty(page); | 2277 | set_page_dirty(page); |
2278 | list_add(&page->lru, &page_list); | 2278 | list_add(&page->lru, &page_list); |
2279 | } | 2279 | } |
2280 | spin_unlock(&mm->page_table_lock); | ||
2281 | flush_tlb_range(vma, start, end); | 2280 | flush_tlb_range(vma, start, end); |
2281 | spin_unlock(&mm->page_table_lock); | ||
2282 | mmu_notifier_invalidate_range_end(mm, start, end); | 2282 | mmu_notifier_invalidate_range_end(mm, start, end); |
2283 | list_for_each_entry_safe(page, tmp, &page_list, lru) { | 2283 | list_for_each_entry_safe(page, tmp, &page_list, lru) { |
2284 | page_remove_rmap(page); | 2284 | page_remove_rmap(page); |
@@ -28,7 +28,6 @@ | |||
28 | #include <linux/kthread.h> | 28 | #include <linux/kthread.h> |
29 | #include <linux/wait.h> | 29 | #include <linux/wait.h> |
30 | #include <linux/slab.h> | 30 | #include <linux/slab.h> |
31 | #include <linux/memcontrol.h> | ||
32 | #include <linux/rbtree.h> | 31 | #include <linux/rbtree.h> |
33 | #include <linux/memory.h> | 32 | #include <linux/memory.h> |
34 | #include <linux/mmu_notifier.h> | 33 | #include <linux/mmu_notifier.h> |
@@ -1572,16 +1571,6 @@ struct page *ksm_does_need_to_copy(struct page *page, | |||
1572 | 1571 | ||
1573 | new_page = alloc_page_vma(GFP_HIGHUSER_MOVABLE, vma, address); | 1572 | new_page = alloc_page_vma(GFP_HIGHUSER_MOVABLE, vma, address); |
1574 | if (new_page) { | 1573 | if (new_page) { |
1575 | /* | ||
1576 | * The memcg-specific accounting when moving | ||
1577 | * pages around the LRU lists relies on the | ||
1578 | * page's owner (memcg) to be valid. Usually, | ||
1579 | * pages are assigned to a new owner before | ||
1580 | * being put on the LRU list, but since this | ||
1581 | * is not the case here, the stale owner from | ||
1582 | * a previous allocation cycle must be reset. | ||
1583 | */ | ||
1584 | mem_cgroup_reset_owner(new_page); | ||
1585 | copy_user_highpage(new_page, page, address, vma); | 1574 | copy_user_highpage(new_page, page, address, vma); |
1586 | 1575 | ||
1587 | SetPageDirty(new_page); | 1576 | SetPageDirty(new_page); |
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 228d6461c12a..d0e57a3cda18 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -1042,6 +1042,19 @@ struct lruvec *mem_cgroup_lru_add_list(struct zone *zone, struct page *page, | |||
1042 | 1042 | ||
1043 | pc = lookup_page_cgroup(page); | 1043 | pc = lookup_page_cgroup(page); |
1044 | memcg = pc->mem_cgroup; | 1044 | memcg = pc->mem_cgroup; |
1045 | |||
1046 | /* | ||
1047 | * Surreptitiously switch any uncharged page to root: | ||
1048 | * an uncharged page off lru does nothing to secure | ||
1049 | * its former mem_cgroup from sudden removal. | ||
1050 | * | ||
1051 | * Our caller holds lru_lock, and PageCgroupUsed is updated | ||
1052 | * under page_cgroup lock: between them, they make all uses | ||
1053 | * of pc->mem_cgroup safe. | ||
1054 | */ | ||
1055 | if (!PageCgroupUsed(pc) && memcg != root_mem_cgroup) | ||
1056 | pc->mem_cgroup = memcg = root_mem_cgroup; | ||
1057 | |||
1045 | mz = page_cgroup_zoneinfo(memcg, page); | 1058 | mz = page_cgroup_zoneinfo(memcg, page); |
1046 | /* compound_order() is stabilized through lru_lock */ | 1059 | /* compound_order() is stabilized through lru_lock */ |
1047 | MEM_CGROUP_ZSTAT(mz, lru) += 1 << compound_order(page); | 1060 | MEM_CGROUP_ZSTAT(mz, lru) += 1 << compound_order(page); |
@@ -2408,8 +2421,12 @@ static void __mem_cgroup_commit_charge(struct mem_cgroup *memcg, | |||
2408 | struct page *page, | 2421 | struct page *page, |
2409 | unsigned int nr_pages, | 2422 | unsigned int nr_pages, |
2410 | struct page_cgroup *pc, | 2423 | struct page_cgroup *pc, |
2411 | enum charge_type ctype) | 2424 | enum charge_type ctype, |
2425 | bool lrucare) | ||
2412 | { | 2426 | { |
2427 | struct zone *uninitialized_var(zone); | ||
2428 | bool was_on_lru = false; | ||
2429 | |||
2413 | lock_page_cgroup(pc); | 2430 | lock_page_cgroup(pc); |
2414 | if (unlikely(PageCgroupUsed(pc))) { | 2431 | if (unlikely(PageCgroupUsed(pc))) { |
2415 | unlock_page_cgroup(pc); | 2432 | unlock_page_cgroup(pc); |
@@ -2420,6 +2437,21 @@ static void __mem_cgroup_commit_charge(struct mem_cgroup *memcg, | |||
2420 | * we don't need page_cgroup_lock about tail pages, becase they are not | 2437 | * we don't need page_cgroup_lock about tail pages, becase they are not |
2421 | * accessed by any other context at this point. | 2438 | * accessed by any other context at this point. |
2422 | */ | 2439 | */ |
2440 | |||
2441 | /* | ||
2442 | * In some cases, SwapCache and FUSE(splice_buf->radixtree), the page | ||
2443 | * may already be on some other mem_cgroup's LRU. Take care of it. | ||
2444 | */ | ||
2445 | if (lrucare) { | ||
2446 | zone = page_zone(page); | ||
2447 | spin_lock_irq(&zone->lru_lock); | ||
2448 | if (PageLRU(page)) { | ||
2449 | ClearPageLRU(page); | ||
2450 | del_page_from_lru_list(zone, page, page_lru(page)); | ||
2451 | was_on_lru = true; | ||
2452 | } | ||
2453 | } | ||
2454 | |||
2423 | pc->mem_cgroup = memcg; | 2455 | pc->mem_cgroup = memcg; |
2424 | /* | 2456 | /* |
2425 | * We access a page_cgroup asynchronously without lock_page_cgroup(). | 2457 | * We access a page_cgroup asynchronously without lock_page_cgroup(). |
@@ -2443,9 +2475,18 @@ static void __mem_cgroup_commit_charge(struct mem_cgroup *memcg, | |||
2443 | break; | 2475 | break; |
2444 | } | 2476 | } |
2445 | 2477 | ||
2478 | if (lrucare) { | ||
2479 | if (was_on_lru) { | ||
2480 | VM_BUG_ON(PageLRU(page)); | ||
2481 | SetPageLRU(page); | ||
2482 | add_page_to_lru_list(zone, page, page_lru(page)); | ||
2483 | } | ||
2484 | spin_unlock_irq(&zone->lru_lock); | ||
2485 | } | ||
2486 | |||
2446 | mem_cgroup_charge_statistics(memcg, PageCgroupCache(pc), nr_pages); | 2487 | mem_cgroup_charge_statistics(memcg, PageCgroupCache(pc), nr_pages); |
2447 | unlock_page_cgroup(pc); | 2488 | unlock_page_cgroup(pc); |
2448 | WARN_ON_ONCE(PageLRU(page)); | 2489 | |
2449 | /* | 2490 | /* |
2450 | * "charge_statistics" updated event counter. Then, check it. | 2491 | * "charge_statistics" updated event counter. Then, check it. |
2451 | * Insert ancestor (and ancestor's ancestors), to softlimit RB-tree. | 2492 | * Insert ancestor (and ancestor's ancestors), to softlimit RB-tree. |
@@ -2643,7 +2684,7 @@ static int mem_cgroup_charge_common(struct page *page, struct mm_struct *mm, | |||
2643 | ret = __mem_cgroup_try_charge(mm, gfp_mask, nr_pages, &memcg, oom); | 2684 | ret = __mem_cgroup_try_charge(mm, gfp_mask, nr_pages, &memcg, oom); |
2644 | if (ret == -ENOMEM) | 2685 | if (ret == -ENOMEM) |
2645 | return ret; | 2686 | return ret; |
2646 | __mem_cgroup_commit_charge(memcg, page, nr_pages, pc, ctype); | 2687 | __mem_cgroup_commit_charge(memcg, page, nr_pages, pc, ctype, false); |
2647 | return 0; | 2688 | return 0; |
2648 | } | 2689 | } |
2649 | 2690 | ||
@@ -2663,35 +2704,6 @@ static void | |||
2663 | __mem_cgroup_commit_charge_swapin(struct page *page, struct mem_cgroup *ptr, | 2704 | __mem_cgroup_commit_charge_swapin(struct page *page, struct mem_cgroup *ptr, |
2664 | enum charge_type ctype); | 2705 | enum charge_type ctype); |
2665 | 2706 | ||
2666 | static void | ||
2667 | __mem_cgroup_commit_charge_lrucare(struct page *page, struct mem_cgroup *memcg, | ||
2668 | enum charge_type ctype) | ||
2669 | { | ||
2670 | struct page_cgroup *pc = lookup_page_cgroup(page); | ||
2671 | struct zone *zone = page_zone(page); | ||
2672 | unsigned long flags; | ||
2673 | bool removed = false; | ||
2674 | |||
2675 | /* | ||
2676 | * In some case, SwapCache, FUSE(splice_buf->radixtree), the page | ||
2677 | * is already on LRU. It means the page may on some other page_cgroup's | ||
2678 | * LRU. Take care of it. | ||
2679 | */ | ||
2680 | spin_lock_irqsave(&zone->lru_lock, flags); | ||
2681 | if (PageLRU(page)) { | ||
2682 | del_page_from_lru_list(zone, page, page_lru(page)); | ||
2683 | ClearPageLRU(page); | ||
2684 | removed = true; | ||
2685 | } | ||
2686 | __mem_cgroup_commit_charge(memcg, page, 1, pc, ctype); | ||
2687 | if (removed) { | ||
2688 | add_page_to_lru_list(zone, page, page_lru(page)); | ||
2689 | SetPageLRU(page); | ||
2690 | } | ||
2691 | spin_unlock_irqrestore(&zone->lru_lock, flags); | ||
2692 | return; | ||
2693 | } | ||
2694 | |||
2695 | int mem_cgroup_cache_charge(struct page *page, struct mm_struct *mm, | 2707 | int mem_cgroup_cache_charge(struct page *page, struct mm_struct *mm, |
2696 | gfp_t gfp_mask) | 2708 | gfp_t gfp_mask) |
2697 | { | 2709 | { |
@@ -2769,13 +2781,16 @@ static void | |||
2769 | __mem_cgroup_commit_charge_swapin(struct page *page, struct mem_cgroup *memcg, | 2781 | __mem_cgroup_commit_charge_swapin(struct page *page, struct mem_cgroup *memcg, |
2770 | enum charge_type ctype) | 2782 | enum charge_type ctype) |
2771 | { | 2783 | { |
2784 | struct page_cgroup *pc; | ||
2785 | |||
2772 | if (mem_cgroup_disabled()) | 2786 | if (mem_cgroup_disabled()) |
2773 | return; | 2787 | return; |
2774 | if (!memcg) | 2788 | if (!memcg) |
2775 | return; | 2789 | return; |
2776 | cgroup_exclude_rmdir(&memcg->css); | 2790 | cgroup_exclude_rmdir(&memcg->css); |
2777 | 2791 | ||
2778 | __mem_cgroup_commit_charge_lrucare(page, memcg, ctype); | 2792 | pc = lookup_page_cgroup(page); |
2793 | __mem_cgroup_commit_charge(memcg, page, 1, pc, ctype, true); | ||
2779 | /* | 2794 | /* |
2780 | * Now swap is on-memory. This means this page may be | 2795 | * Now swap is on-memory. This means this page may be |
2781 | * counted both as mem and swap....double count. | 2796 | * counted both as mem and swap....double count. |
@@ -3027,23 +3042,6 @@ void mem_cgroup_uncharge_end(void) | |||
3027 | batch->memcg = NULL; | 3042 | batch->memcg = NULL; |
3028 | } | 3043 | } |
3029 | 3044 | ||
3030 | /* | ||
3031 | * A function for resetting pc->mem_cgroup for newly allocated pages. | ||
3032 | * This function should be called if the newpage will be added to LRU | ||
3033 | * before start accounting. | ||
3034 | */ | ||
3035 | void mem_cgroup_reset_owner(struct page *newpage) | ||
3036 | { | ||
3037 | struct page_cgroup *pc; | ||
3038 | |||
3039 | if (mem_cgroup_disabled()) | ||
3040 | return; | ||
3041 | |||
3042 | pc = lookup_page_cgroup(newpage); | ||
3043 | VM_BUG_ON(PageCgroupUsed(pc)); | ||
3044 | pc->mem_cgroup = root_mem_cgroup; | ||
3045 | } | ||
3046 | |||
3047 | #ifdef CONFIG_SWAP | 3045 | #ifdef CONFIG_SWAP |
3048 | /* | 3046 | /* |
3049 | * called after __delete_from_swap_cache() and drop "page" account. | 3047 | * called after __delete_from_swap_cache() and drop "page" account. |
@@ -3248,7 +3246,7 @@ int mem_cgroup_prepare_migration(struct page *page, | |||
3248 | ctype = MEM_CGROUP_CHARGE_TYPE_CACHE; | 3246 | ctype = MEM_CGROUP_CHARGE_TYPE_CACHE; |
3249 | else | 3247 | else |
3250 | ctype = MEM_CGROUP_CHARGE_TYPE_SHMEM; | 3248 | ctype = MEM_CGROUP_CHARGE_TYPE_SHMEM; |
3251 | __mem_cgroup_commit_charge(memcg, newpage, 1, pc, ctype); | 3249 | __mem_cgroup_commit_charge(memcg, newpage, 1, pc, ctype, false); |
3252 | return ret; | 3250 | return ret; |
3253 | } | 3251 | } |
3254 | 3252 | ||
@@ -3332,7 +3330,7 @@ void mem_cgroup_replace_page_cache(struct page *oldpage, | |||
3332 | * the newpage may be on LRU(or pagevec for LRU) already. We lock | 3330 | * the newpage may be on LRU(or pagevec for LRU) already. We lock |
3333 | * LRU while we overwrite pc->mem_cgroup. | 3331 | * LRU while we overwrite pc->mem_cgroup. |
3334 | */ | 3332 | */ |
3335 | __mem_cgroup_commit_charge_lrucare(newpage, memcg, type); | 3333 | __mem_cgroup_commit_charge(memcg, newpage, 1, pc, type, true); |
3336 | } | 3334 | } |
3337 | 3335 | ||
3338 | #ifdef CONFIG_DEBUG_VM | 3336 | #ifdef CONFIG_DEBUG_VM |
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index 06b145fb64ab..47296fee23db 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c | |||
@@ -640,10 +640,11 @@ static int mbind_range(struct mm_struct *mm, unsigned long start, | |||
640 | unsigned long vmstart; | 640 | unsigned long vmstart; |
641 | unsigned long vmend; | 641 | unsigned long vmend; |
642 | 642 | ||
643 | vma = find_vma_prev(mm, start, &prev); | 643 | vma = find_vma(mm, start); |
644 | if (!vma || vma->vm_start > start) | 644 | if (!vma || vma->vm_start > start) |
645 | return -EFAULT; | 645 | return -EFAULT; |
646 | 646 | ||
647 | prev = vma->vm_prev; | ||
647 | if (start > vma->vm_start) | 648 | if (start > vma->vm_start) |
648 | prev = vma; | 649 | prev = vma; |
649 | 650 | ||
diff --git a/mm/migrate.c b/mm/migrate.c index df141f60289e..1503b6b54ecb 100644 --- a/mm/migrate.c +++ b/mm/migrate.c | |||
@@ -839,8 +839,6 @@ static int unmap_and_move(new_page_t get_new_page, unsigned long private, | |||
839 | if (!newpage) | 839 | if (!newpage) |
840 | return -ENOMEM; | 840 | return -ENOMEM; |
841 | 841 | ||
842 | mem_cgroup_reset_owner(newpage); | ||
843 | |||
844 | if (page_count(page) == 1) { | 842 | if (page_count(page) == 1) { |
845 | /* page was freed from under us. So we are done. */ | 843 | /* page was freed from under us. So we are done. */ |
846 | goto out; | 844 | goto out; |
diff --git a/mm/mlock.c b/mm/mlock.c index 4f4f53bdc65d..ef726e8aa8e9 100644 --- a/mm/mlock.c +++ b/mm/mlock.c | |||
@@ -385,10 +385,11 @@ static int do_mlock(unsigned long start, size_t len, int on) | |||
385 | return -EINVAL; | 385 | return -EINVAL; |
386 | if (end == start) | 386 | if (end == start) |
387 | return 0; | 387 | return 0; |
388 | vma = find_vma_prev(current->mm, start, &prev); | 388 | vma = find_vma(current->mm, start); |
389 | if (!vma || vma->vm_start > start) | 389 | if (!vma || vma->vm_start > start) |
390 | return -ENOMEM; | 390 | return -ENOMEM; |
391 | 391 | ||
392 | prev = vma->vm_prev; | ||
392 | if (start > vma->vm_start) | 393 | if (start > vma->vm_start) |
393 | prev = vma; | 394 | prev = vma; |
394 | 395 | ||
@@ -1266,8 +1266,9 @@ munmap_back: | |||
1266 | vma->vm_pgoff = pgoff; | 1266 | vma->vm_pgoff = pgoff; |
1267 | INIT_LIST_HEAD(&vma->anon_vma_chain); | 1267 | INIT_LIST_HEAD(&vma->anon_vma_chain); |
1268 | 1268 | ||
1269 | error = -EINVAL; /* when rejecting VM_GROWSDOWN|VM_GROWSUP */ | ||
1270 | |||
1269 | if (file) { | 1271 | if (file) { |
1270 | error = -EINVAL; | ||
1271 | if (vm_flags & (VM_GROWSDOWN|VM_GROWSUP)) | 1272 | if (vm_flags & (VM_GROWSDOWN|VM_GROWSUP)) |
1272 | goto free_vma; | 1273 | goto free_vma; |
1273 | if (vm_flags & VM_DENYWRITE) { | 1274 | if (vm_flags & VM_DENYWRITE) { |
@@ -1293,6 +1294,8 @@ munmap_back: | |||
1293 | pgoff = vma->vm_pgoff; | 1294 | pgoff = vma->vm_pgoff; |
1294 | vm_flags = vma->vm_flags; | 1295 | vm_flags = vma->vm_flags; |
1295 | } else if (vm_flags & VM_SHARED) { | 1296 | } else if (vm_flags & VM_SHARED) { |
1297 | if (unlikely(vm_flags & (VM_GROWSDOWN|VM_GROWSUP))) | ||
1298 | goto free_vma; | ||
1296 | error = shmem_zero_setup(vma); | 1299 | error = shmem_zero_setup(vma); |
1297 | if (error) | 1300 | if (error) |
1298 | goto free_vma; | 1301 | goto free_vma; |
@@ -1605,7 +1608,6 @@ EXPORT_SYMBOL(find_vma); | |||
1605 | 1608 | ||
1606 | /* | 1609 | /* |
1607 | * Same as find_vma, but also return a pointer to the previous VMA in *pprev. | 1610 | * Same as find_vma, but also return a pointer to the previous VMA in *pprev. |
1608 | * Note: pprev is set to NULL when return value is NULL. | ||
1609 | */ | 1611 | */ |
1610 | struct vm_area_struct * | 1612 | struct vm_area_struct * |
1611 | find_vma_prev(struct mm_struct *mm, unsigned long addr, | 1613 | find_vma_prev(struct mm_struct *mm, unsigned long addr, |
@@ -1614,7 +1616,16 @@ find_vma_prev(struct mm_struct *mm, unsigned long addr, | |||
1614 | struct vm_area_struct *vma; | 1616 | struct vm_area_struct *vma; |
1615 | 1617 | ||
1616 | vma = find_vma(mm, addr); | 1618 | vma = find_vma(mm, addr); |
1617 | *pprev = vma ? vma->vm_prev : NULL; | 1619 | if (vma) { |
1620 | *pprev = vma->vm_prev; | ||
1621 | } else { | ||
1622 | struct rb_node *rb_node = mm->mm_rb.rb_node; | ||
1623 | *pprev = NULL; | ||
1624 | while (rb_node) { | ||
1625 | *pprev = rb_entry(rb_node, struct vm_area_struct, vm_rb); | ||
1626 | rb_node = rb_node->rb_right; | ||
1627 | } | ||
1628 | } | ||
1618 | return vma; | 1629 | return vma; |
1619 | } | 1630 | } |
1620 | 1631 | ||
diff --git a/mm/mprotect.c b/mm/mprotect.c index 5a688a2756be..f437d054c3bf 100644 --- a/mm/mprotect.c +++ b/mm/mprotect.c | |||
@@ -262,10 +262,11 @@ SYSCALL_DEFINE3(mprotect, unsigned long, start, size_t, len, | |||
262 | 262 | ||
263 | down_write(¤t->mm->mmap_sem); | 263 | down_write(¤t->mm->mmap_sem); |
264 | 264 | ||
265 | vma = find_vma_prev(current->mm, start, &prev); | 265 | vma = find_vma(current->mm, start); |
266 | error = -ENOMEM; | 266 | error = -ENOMEM; |
267 | if (!vma) | 267 | if (!vma) |
268 | goto out; | 268 | goto out; |
269 | prev = vma->vm_prev; | ||
269 | if (unlikely(grows & PROT_GROWSDOWN)) { | 270 | if (unlikely(grows & PROT_GROWSDOWN)) { |
270 | if (vma->vm_start >= end) | 271 | if (vma->vm_start >= end) |
271 | goto out; | 272 | goto out; |
diff --git a/mm/page_cgroup.c b/mm/page_cgroup.c index de1616aa9b1e..1ccbd714059c 100644 --- a/mm/page_cgroup.c +++ b/mm/page_cgroup.c | |||
@@ -379,13 +379,15 @@ static struct swap_cgroup *lookup_swap_cgroup(swp_entry_t ent, | |||
379 | pgoff_t offset = swp_offset(ent); | 379 | pgoff_t offset = swp_offset(ent); |
380 | struct swap_cgroup_ctrl *ctrl; | 380 | struct swap_cgroup_ctrl *ctrl; |
381 | struct page *mappage; | 381 | struct page *mappage; |
382 | struct swap_cgroup *sc; | ||
382 | 383 | ||
383 | ctrl = &swap_cgroup_ctrl[swp_type(ent)]; | 384 | ctrl = &swap_cgroup_ctrl[swp_type(ent)]; |
384 | if (ctrlp) | 385 | if (ctrlp) |
385 | *ctrlp = ctrl; | 386 | *ctrlp = ctrl; |
386 | 387 | ||
387 | mappage = ctrl->map[offset / SC_PER_PAGE]; | 388 | mappage = ctrl->map[offset / SC_PER_PAGE]; |
388 | return page_address(mappage) + offset % SC_PER_PAGE; | 389 | sc = page_address(mappage); |
390 | return sc + offset % SC_PER_PAGE; | ||
389 | } | 391 | } |
390 | 392 | ||
391 | /** | 393 | /** |
diff --git a/mm/percpu-vm.c b/mm/percpu-vm.c index 12a48a88c0d8..405d331804c3 100644 --- a/mm/percpu-vm.c +++ b/mm/percpu-vm.c | |||
@@ -184,8 +184,7 @@ static void pcpu_unmap_pages(struct pcpu_chunk *chunk, | |||
184 | page_end - page_start); | 184 | page_end - page_start); |
185 | } | 185 | } |
186 | 186 | ||
187 | for (i = page_start; i < page_end; i++) | 187 | bitmap_clear(populated, page_start, page_end - page_start); |
188 | __clear_bit(i, populated); | ||
189 | } | 188 | } |
190 | 189 | ||
191 | /** | 190 | /** |
@@ -652,7 +652,7 @@ EXPORT_SYMBOL(__pagevec_release); | |||
652 | void lru_add_page_tail(struct zone* zone, | 652 | void lru_add_page_tail(struct zone* zone, |
653 | struct page *page, struct page *page_tail) | 653 | struct page *page, struct page *page_tail) |
654 | { | 654 | { |
655 | int active; | 655 | int uninitialized_var(active); |
656 | enum lru_list lru; | 656 | enum lru_list lru; |
657 | const int file = 0; | 657 | const int file = 0; |
658 | 658 | ||
@@ -672,7 +672,6 @@ void lru_add_page_tail(struct zone* zone, | |||
672 | active = 0; | 672 | active = 0; |
673 | lru = LRU_INACTIVE_ANON; | 673 | lru = LRU_INACTIVE_ANON; |
674 | } | 674 | } |
675 | update_page_reclaim_stat(zone, page_tail, file, active); | ||
676 | } else { | 675 | } else { |
677 | SetPageUnevictable(page_tail); | 676 | SetPageUnevictable(page_tail); |
678 | lru = LRU_UNEVICTABLE; | 677 | lru = LRU_UNEVICTABLE; |
@@ -693,6 +692,9 @@ void lru_add_page_tail(struct zone* zone, | |||
693 | list_head = page_tail->lru.prev; | 692 | list_head = page_tail->lru.prev; |
694 | list_move_tail(&page_tail->lru, list_head); | 693 | list_move_tail(&page_tail->lru, list_head); |
695 | } | 694 | } |
695 | |||
696 | if (!PageUnevictable(page)) | ||
697 | update_page_reclaim_stat(zone, page_tail, file, active); | ||
696 | } | 698 | } |
697 | #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ | 699 | #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ |
698 | 700 | ||
@@ -710,8 +712,8 @@ static void __pagevec_lru_add_fn(struct page *page, void *arg) | |||
710 | SetPageLRU(page); | 712 | SetPageLRU(page); |
711 | if (active) | 713 | if (active) |
712 | SetPageActive(page); | 714 | SetPageActive(page); |
713 | update_page_reclaim_stat(zone, page, file, active); | ||
714 | add_page_to_lru_list(zone, page, lru); | 715 | add_page_to_lru_list(zone, page, lru); |
716 | update_page_reclaim_stat(zone, page, file, active); | ||
715 | } | 717 | } |
716 | 718 | ||
717 | /* | 719 | /* |
diff --git a/mm/swap_state.c b/mm/swap_state.c index 470038a91873..ea6b32d61873 100644 --- a/mm/swap_state.c +++ b/mm/swap_state.c | |||
@@ -300,16 +300,6 @@ struct page *read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask, | |||
300 | new_page = alloc_page_vma(gfp_mask, vma, addr); | 300 | new_page = alloc_page_vma(gfp_mask, vma, addr); |
301 | if (!new_page) | 301 | if (!new_page) |
302 | break; /* Out of memory */ | 302 | break; /* Out of memory */ |
303 | /* | ||
304 | * The memcg-specific accounting when moving | ||
305 | * pages around the LRU lists relies on the | ||
306 | * page's owner (memcg) to be valid. Usually, | ||
307 | * pages are assigned to a new owner before | ||
308 | * being put on the LRU list, but since this | ||
309 | * is not the case here, the stale owner from | ||
310 | * a previous allocation cycle must be reset. | ||
311 | */ | ||
312 | mem_cgroup_reset_owner(new_page); | ||
313 | } | 303 | } |
314 | 304 | ||
315 | /* | 305 | /* |
diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c index 568d5bf17534..702a1ae9220b 100644 --- a/net/bridge/br_multicast.c +++ b/net/bridge/br_multicast.c | |||
@@ -446,8 +446,11 @@ static struct sk_buff *br_ip6_multicast_alloc_query(struct net_bridge *br, | |||
446 | ip6h->nexthdr = IPPROTO_HOPOPTS; | 446 | ip6h->nexthdr = IPPROTO_HOPOPTS; |
447 | ip6h->hop_limit = 1; | 447 | ip6h->hop_limit = 1; |
448 | ipv6_addr_set(&ip6h->daddr, htonl(0xff020000), 0, 0, htonl(1)); | 448 | ipv6_addr_set(&ip6h->daddr, htonl(0xff020000), 0, 0, htonl(1)); |
449 | ipv6_dev_get_saddr(dev_net(br->dev), br->dev, &ip6h->daddr, 0, | 449 | if (ipv6_dev_get_saddr(dev_net(br->dev), br->dev, &ip6h->daddr, 0, |
450 | &ip6h->saddr); | 450 | &ip6h->saddr)) { |
451 | kfree_skb(skb); | ||
452 | return NULL; | ||
453 | } | ||
451 | ipv6_eth_mc_map(&ip6h->daddr, eth->h_dest); | 454 | ipv6_eth_mc_map(&ip6h->daddr, eth->h_dest); |
452 | 455 | ||
453 | hopopt = (u8 *)(ip6h + 1); | 456 | hopopt = (u8 *)(ip6h + 1); |
diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c index 84122472656c..dec4f3817133 100644 --- a/net/bridge/br_netfilter.c +++ b/net/bridge/br_netfilter.c | |||
@@ -62,6 +62,15 @@ static int brnf_filter_pppoe_tagged __read_mostly = 0; | |||
62 | #define brnf_filter_pppoe_tagged 0 | 62 | #define brnf_filter_pppoe_tagged 0 |
63 | #endif | 63 | #endif |
64 | 64 | ||
65 | #define IS_IP(skb) \ | ||
66 | (!vlan_tx_tag_present(skb) && skb->protocol == htons(ETH_P_IP)) | ||
67 | |||
68 | #define IS_IPV6(skb) \ | ||
69 | (!vlan_tx_tag_present(skb) && skb->protocol == htons(ETH_P_IPV6)) | ||
70 | |||
71 | #define IS_ARP(skb) \ | ||
72 | (!vlan_tx_tag_present(skb) && skb->protocol == htons(ETH_P_ARP)) | ||
73 | |||
65 | static inline __be16 vlan_proto(const struct sk_buff *skb) | 74 | static inline __be16 vlan_proto(const struct sk_buff *skb) |
66 | { | 75 | { |
67 | if (vlan_tx_tag_present(skb)) | 76 | if (vlan_tx_tag_present(skb)) |
@@ -639,8 +648,7 @@ static unsigned int br_nf_pre_routing(unsigned int hook, struct sk_buff *skb, | |||
639 | return NF_DROP; | 648 | return NF_DROP; |
640 | br = p->br; | 649 | br = p->br; |
641 | 650 | ||
642 | if (skb->protocol == htons(ETH_P_IPV6) || IS_VLAN_IPV6(skb) || | 651 | if (IS_IPV6(skb) || IS_VLAN_IPV6(skb) || IS_PPPOE_IPV6(skb)) { |
643 | IS_PPPOE_IPV6(skb)) { | ||
644 | if (!brnf_call_ip6tables && !br->nf_call_ip6tables) | 652 | if (!brnf_call_ip6tables && !br->nf_call_ip6tables) |
645 | return NF_ACCEPT; | 653 | return NF_ACCEPT; |
646 | 654 | ||
@@ -651,8 +659,7 @@ static unsigned int br_nf_pre_routing(unsigned int hook, struct sk_buff *skb, | |||
651 | if (!brnf_call_iptables && !br->nf_call_iptables) | 659 | if (!brnf_call_iptables && !br->nf_call_iptables) |
652 | return NF_ACCEPT; | 660 | return NF_ACCEPT; |
653 | 661 | ||
654 | if (skb->protocol != htons(ETH_P_IP) && !IS_VLAN_IP(skb) && | 662 | if (!IS_IP(skb) && !IS_VLAN_IP(skb) && !IS_PPPOE_IP(skb)) |
655 | !IS_PPPOE_IP(skb)) | ||
656 | return NF_ACCEPT; | 663 | return NF_ACCEPT; |
657 | 664 | ||
658 | nf_bridge_pull_encap_header_rcsum(skb); | 665 | nf_bridge_pull_encap_header_rcsum(skb); |
@@ -701,7 +708,7 @@ static int br_nf_forward_finish(struct sk_buff *skb) | |||
701 | struct nf_bridge_info *nf_bridge = skb->nf_bridge; | 708 | struct nf_bridge_info *nf_bridge = skb->nf_bridge; |
702 | struct net_device *in; | 709 | struct net_device *in; |
703 | 710 | ||
704 | if (skb->protocol != htons(ETH_P_ARP) && !IS_VLAN_ARP(skb)) { | 711 | if (!IS_ARP(skb) && !IS_VLAN_ARP(skb)) { |
705 | in = nf_bridge->physindev; | 712 | in = nf_bridge->physindev; |
706 | if (nf_bridge->mask & BRNF_PKT_TYPE) { | 713 | if (nf_bridge->mask & BRNF_PKT_TYPE) { |
707 | skb->pkt_type = PACKET_OTHERHOST; | 714 | skb->pkt_type = PACKET_OTHERHOST; |
@@ -718,6 +725,7 @@ static int br_nf_forward_finish(struct sk_buff *skb) | |||
718 | return 0; | 725 | return 0; |
719 | } | 726 | } |
720 | 727 | ||
728 | |||
721 | /* This is the 'purely bridged' case. For IP, we pass the packet to | 729 | /* This is the 'purely bridged' case. For IP, we pass the packet to |
722 | * netfilter with indev and outdev set to the bridge device, | 730 | * netfilter with indev and outdev set to the bridge device, |
723 | * but we are still able to filter on the 'real' indev/outdev | 731 | * but we are still able to filter on the 'real' indev/outdev |
@@ -744,11 +752,9 @@ static unsigned int br_nf_forward_ip(unsigned int hook, struct sk_buff *skb, | |||
744 | if (!parent) | 752 | if (!parent) |
745 | return NF_DROP; | 753 | return NF_DROP; |
746 | 754 | ||
747 | if (skb->protocol == htons(ETH_P_IP) || IS_VLAN_IP(skb) || | 755 | if (IS_IP(skb) || IS_VLAN_IP(skb) || IS_PPPOE_IP(skb)) |
748 | IS_PPPOE_IP(skb)) | ||
749 | pf = PF_INET; | 756 | pf = PF_INET; |
750 | else if (skb->protocol == htons(ETH_P_IPV6) || IS_VLAN_IPV6(skb) || | 757 | else if (IS_IPV6(skb) || IS_VLAN_IPV6(skb) || IS_PPPOE_IPV6(skb)) |
751 | IS_PPPOE_IPV6(skb)) | ||
752 | pf = PF_INET6; | 758 | pf = PF_INET6; |
753 | else | 759 | else |
754 | return NF_ACCEPT; | 760 | return NF_ACCEPT; |
@@ -795,7 +801,7 @@ static unsigned int br_nf_forward_arp(unsigned int hook, struct sk_buff *skb, | |||
795 | if (!brnf_call_arptables && !br->nf_call_arptables) | 801 | if (!brnf_call_arptables && !br->nf_call_arptables) |
796 | return NF_ACCEPT; | 802 | return NF_ACCEPT; |
797 | 803 | ||
798 | if (skb->protocol != htons(ETH_P_ARP)) { | 804 | if (!IS_ARP(skb)) { |
799 | if (!IS_VLAN_ARP(skb)) | 805 | if (!IS_VLAN_ARP(skb)) |
800 | return NF_ACCEPT; | 806 | return NF_ACCEPT; |
801 | nf_bridge_pull_encap_header(skb); | 807 | nf_bridge_pull_encap_header(skb); |
@@ -853,11 +859,9 @@ static unsigned int br_nf_post_routing(unsigned int hook, struct sk_buff *skb, | |||
853 | if (!realoutdev) | 859 | if (!realoutdev) |
854 | return NF_DROP; | 860 | return NF_DROP; |
855 | 861 | ||
856 | if (skb->protocol == htons(ETH_P_IP) || IS_VLAN_IP(skb) || | 862 | if (IS_IP(skb) || IS_VLAN_IP(skb) || IS_PPPOE_IP(skb)) |
857 | IS_PPPOE_IP(skb)) | ||
858 | pf = PF_INET; | 863 | pf = PF_INET; |
859 | else if (skb->protocol == htons(ETH_P_IPV6) || IS_VLAN_IPV6(skb) || | 864 | else if (IS_IPV6(skb) || IS_VLAN_IPV6(skb) || IS_PPPOE_IPV6(skb)) |
860 | IS_PPPOE_IPV6(skb)) | ||
861 | pf = PF_INET6; | 865 | pf = PF_INET6; |
862 | else | 866 | else |
863 | return NF_ACCEPT; | 867 | return NF_ACCEPT; |
diff --git a/net/bridge/br_stp.c b/net/bridge/br_stp.c index dd147d78a588..8c836d96ba76 100644 --- a/net/bridge/br_stp.c +++ b/net/bridge/br_stp.c | |||
@@ -17,9 +17,9 @@ | |||
17 | #include "br_private_stp.h" | 17 | #include "br_private_stp.h" |
18 | 18 | ||
19 | /* since time values in bpdu are in jiffies and then scaled (1/256) | 19 | /* since time values in bpdu are in jiffies and then scaled (1/256) |
20 | * before sending, make sure that is at least one. | 20 | * before sending, make sure that is at least one STP tick. |
21 | */ | 21 | */ |
22 | #define MESSAGE_AGE_INCR ((HZ < 256) ? 1 : (HZ/256)) | 22 | #define MESSAGE_AGE_INCR ((HZ / 256) + 1) |
23 | 23 | ||
24 | static const char *const br_port_state_names[] = { | 24 | static const char *const br_port_state_names[] = { |
25 | [BR_STATE_DISABLED] = "disabled", | 25 | [BR_STATE_DISABLED] = "disabled", |
@@ -31,7 +31,7 @@ static const char *const br_port_state_names[] = { | |||
31 | 31 | ||
32 | void br_log_state(const struct net_bridge_port *p) | 32 | void br_log_state(const struct net_bridge_port *p) |
33 | { | 33 | { |
34 | br_info(p->br, "port %u(%s) entering %s state\n", | 34 | br_info(p->br, "port %u(%s) entered %s state\n", |
35 | (unsigned) p->port_no, p->dev->name, | 35 | (unsigned) p->port_no, p->dev->name, |
36 | br_port_state_names[p->state]); | 36 | br_port_state_names[p->state]); |
37 | } | 37 | } |
@@ -186,7 +186,7 @@ static void br_record_config_information(struct net_bridge_port *p, | |||
186 | p->designated_cost = bpdu->root_path_cost; | 186 | p->designated_cost = bpdu->root_path_cost; |
187 | p->designated_bridge = bpdu->bridge_id; | 187 | p->designated_bridge = bpdu->bridge_id; |
188 | p->designated_port = bpdu->port_id; | 188 | p->designated_port = bpdu->port_id; |
189 | p->designated_age = jiffies + bpdu->message_age; | 189 | p->designated_age = jiffies - bpdu->message_age; |
190 | 190 | ||
191 | mod_timer(&p->message_age_timer, jiffies | 191 | mod_timer(&p->message_age_timer, jiffies |
192 | + (p->br->max_age - bpdu->message_age)); | 192 | + (p->br->max_age - bpdu->message_age)); |
diff --git a/net/bridge/br_stp_if.c b/net/bridge/br_stp_if.c index 19308e305d85..f494496373d6 100644 --- a/net/bridge/br_stp_if.c +++ b/net/bridge/br_stp_if.c | |||
@@ -98,14 +98,13 @@ void br_stp_disable_port(struct net_bridge_port *p) | |||
98 | struct net_bridge *br = p->br; | 98 | struct net_bridge *br = p->br; |
99 | int wasroot; | 99 | int wasroot; |
100 | 100 | ||
101 | br_log_state(p); | ||
102 | |||
103 | wasroot = br_is_root_bridge(br); | 101 | wasroot = br_is_root_bridge(br); |
104 | br_become_designated_port(p); | 102 | br_become_designated_port(p); |
105 | p->state = BR_STATE_DISABLED; | 103 | p->state = BR_STATE_DISABLED; |
106 | p->topology_change_ack = 0; | 104 | p->topology_change_ack = 0; |
107 | p->config_pending = 0; | 105 | p->config_pending = 0; |
108 | 106 | ||
107 | br_log_state(p); | ||
109 | br_ifinfo_notify(RTM_NEWLINK, p); | 108 | br_ifinfo_notify(RTM_NEWLINK, p); |
110 | 109 | ||
111 | del_timer(&p->message_age_timer); | 110 | del_timer(&p->message_age_timer); |
diff --git a/net/bridge/netfilter/ebtables.c b/net/bridge/netfilter/ebtables.c index 5864cc491369..5fe2ff3b01ef 100644 --- a/net/bridge/netfilter/ebtables.c +++ b/net/bridge/netfilter/ebtables.c | |||
@@ -1335,7 +1335,12 @@ static inline int ebt_make_matchname(const struct ebt_entry_match *m, | |||
1335 | const char *base, char __user *ubase) | 1335 | const char *base, char __user *ubase) |
1336 | { | 1336 | { |
1337 | char __user *hlp = ubase + ((char *)m - base); | 1337 | char __user *hlp = ubase + ((char *)m - base); |
1338 | if (copy_to_user(hlp, m->u.match->name, EBT_FUNCTION_MAXNAMELEN)) | 1338 | char name[EBT_FUNCTION_MAXNAMELEN] = {}; |
1339 | |||
1340 | /* ebtables expects 32 bytes long names but xt_match names are 29 bytes | ||
1341 | long. Copy 29 bytes and fill remaining bytes with zeroes. */ | ||
1342 | strncpy(name, m->u.match->name, sizeof(name)); | ||
1343 | if (copy_to_user(hlp, name, EBT_FUNCTION_MAXNAMELEN)) | ||
1339 | return -EFAULT; | 1344 | return -EFAULT; |
1340 | return 0; | 1345 | return 0; |
1341 | } | 1346 | } |
@@ -1344,7 +1349,10 @@ static inline int ebt_make_watchername(const struct ebt_entry_watcher *w, | |||
1344 | const char *base, char __user *ubase) | 1349 | const char *base, char __user *ubase) |
1345 | { | 1350 | { |
1346 | char __user *hlp = ubase + ((char *)w - base); | 1351 | char __user *hlp = ubase + ((char *)w - base); |
1347 | if (copy_to_user(hlp , w->u.watcher->name, EBT_FUNCTION_MAXNAMELEN)) | 1352 | char name[EBT_FUNCTION_MAXNAMELEN] = {}; |
1353 | |||
1354 | strncpy(name, w->u.watcher->name, sizeof(name)); | ||
1355 | if (copy_to_user(hlp , name, EBT_FUNCTION_MAXNAMELEN)) | ||
1348 | return -EFAULT; | 1356 | return -EFAULT; |
1349 | return 0; | 1357 | return 0; |
1350 | } | 1358 | } |
@@ -1355,6 +1363,7 @@ ebt_make_names(struct ebt_entry *e, const char *base, char __user *ubase) | |||
1355 | int ret; | 1363 | int ret; |
1356 | char __user *hlp; | 1364 | char __user *hlp; |
1357 | const struct ebt_entry_target *t; | 1365 | const struct ebt_entry_target *t; |
1366 | char name[EBT_FUNCTION_MAXNAMELEN] = {}; | ||
1358 | 1367 | ||
1359 | if (e->bitmask == 0) | 1368 | if (e->bitmask == 0) |
1360 | return 0; | 1369 | return 0; |
@@ -1368,7 +1377,8 @@ ebt_make_names(struct ebt_entry *e, const char *base, char __user *ubase) | |||
1368 | ret = EBT_WATCHER_ITERATE(e, ebt_make_watchername, base, ubase); | 1377 | ret = EBT_WATCHER_ITERATE(e, ebt_make_watchername, base, ubase); |
1369 | if (ret != 0) | 1378 | if (ret != 0) |
1370 | return ret; | 1379 | return ret; |
1371 | if (copy_to_user(hlp, t->u.target->name, EBT_FUNCTION_MAXNAMELEN)) | 1380 | strncpy(name, t->u.target->name, sizeof(name)); |
1381 | if (copy_to_user(hlp, name, EBT_FUNCTION_MAXNAMELEN)) | ||
1372 | return -EFAULT; | 1382 | return -EFAULT; |
1373 | return 0; | 1383 | return 0; |
1374 | } | 1384 | } |
@@ -1893,10 +1903,7 @@ static int compat_mtw_from_user(struct compat_ebt_entry_mwt *mwt, | |||
1893 | 1903 | ||
1894 | switch (compat_mwt) { | 1904 | switch (compat_mwt) { |
1895 | case EBT_COMPAT_MATCH: | 1905 | case EBT_COMPAT_MATCH: |
1896 | match = try_then_request_module(xt_find_match(NFPROTO_BRIDGE, | 1906 | match = xt_request_find_match(NFPROTO_BRIDGE, name, 0); |
1897 | name, 0), "ebt_%s", name); | ||
1898 | if (match == NULL) | ||
1899 | return -ENOENT; | ||
1900 | if (IS_ERR(match)) | 1907 | if (IS_ERR(match)) |
1901 | return PTR_ERR(match); | 1908 | return PTR_ERR(match); |
1902 | 1909 | ||
@@ -1915,10 +1922,7 @@ static int compat_mtw_from_user(struct compat_ebt_entry_mwt *mwt, | |||
1915 | break; | 1922 | break; |
1916 | case EBT_COMPAT_WATCHER: /* fallthrough */ | 1923 | case EBT_COMPAT_WATCHER: /* fallthrough */ |
1917 | case EBT_COMPAT_TARGET: | 1924 | case EBT_COMPAT_TARGET: |
1918 | wt = try_then_request_module(xt_find_target(NFPROTO_BRIDGE, | 1925 | wt = xt_request_find_target(NFPROTO_BRIDGE, name, 0); |
1919 | name, 0), "ebt_%s", name); | ||
1920 | if (wt == NULL) | ||
1921 | return -ENOENT; | ||
1922 | if (IS_ERR(wt)) | 1926 | if (IS_ERR(wt)) |
1923 | return PTR_ERR(wt); | 1927 | return PTR_ERR(wt); |
1924 | off = xt_compat_target_offset(wt); | 1928 | off = xt_compat_target_offset(wt); |
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 606a6e8f3671..f965dce6f20f 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
@@ -1060,11 +1060,12 @@ static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb) | |||
1060 | rcu_read_lock(); | 1060 | rcu_read_lock(); |
1061 | cb->seq = net->dev_base_seq; | 1061 | cb->seq = net->dev_base_seq; |
1062 | 1062 | ||
1063 | nlmsg_parse(cb->nlh, sizeof(struct rtgenmsg), tb, IFLA_MAX, | 1063 | if (nlmsg_parse(cb->nlh, sizeof(struct rtgenmsg), tb, IFLA_MAX, |
1064 | ifla_policy); | 1064 | ifla_policy) >= 0) { |
1065 | 1065 | ||
1066 | if (tb[IFLA_EXT_MASK]) | 1066 | if (tb[IFLA_EXT_MASK]) |
1067 | ext_filter_mask = nla_get_u32(tb[IFLA_EXT_MASK]); | 1067 | ext_filter_mask = nla_get_u32(tb[IFLA_EXT_MASK]); |
1068 | } | ||
1068 | 1069 | ||
1069 | for (h = s_h; h < NETDEV_HASHENTRIES; h++, s_idx = 0) { | 1070 | for (h = s_h; h < NETDEV_HASHENTRIES; h++, s_idx = 0) { |
1070 | idx = 0; | 1071 | idx = 0; |
@@ -1900,10 +1901,11 @@ static u16 rtnl_calcit(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
1900 | u32 ext_filter_mask = 0; | 1901 | u32 ext_filter_mask = 0; |
1901 | u16 min_ifinfo_dump_size = 0; | 1902 | u16 min_ifinfo_dump_size = 0; |
1902 | 1903 | ||
1903 | nlmsg_parse(nlh, sizeof(struct rtgenmsg), tb, IFLA_MAX, ifla_policy); | 1904 | if (nlmsg_parse(nlh, sizeof(struct rtgenmsg), tb, IFLA_MAX, |
1904 | 1905 | ifla_policy) >= 0) { | |
1905 | if (tb[IFLA_EXT_MASK]) | 1906 | if (tb[IFLA_EXT_MASK]) |
1906 | ext_filter_mask = nla_get_u32(tb[IFLA_EXT_MASK]); | 1907 | ext_filter_mask = nla_get_u32(tb[IFLA_EXT_MASK]); |
1908 | } | ||
1907 | 1909 | ||
1908 | if (!ext_filter_mask) | 1910 | if (!ext_filter_mask) |
1909 | return NLMSG_GOODSIZE; | 1911 | return NLMSG_GOODSIZE; |
diff --git a/net/ipv4/inetpeer.c b/net/ipv4/inetpeer.c index bf4a9c4808e1..d4d61b694fab 100644 --- a/net/ipv4/inetpeer.c +++ b/net/ipv4/inetpeer.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <linux/kernel.h> | 17 | #include <linux/kernel.h> |
18 | #include <linux/mm.h> | 18 | #include <linux/mm.h> |
19 | #include <linux/net.h> | 19 | #include <linux/net.h> |
20 | #include <linux/workqueue.h> | ||
20 | #include <net/ip.h> | 21 | #include <net/ip.h> |
21 | #include <net/inetpeer.h> | 22 | #include <net/inetpeer.h> |
22 | #include <net/secure_seq.h> | 23 | #include <net/secure_seq.h> |
@@ -66,6 +67,11 @@ | |||
66 | 67 | ||
67 | static struct kmem_cache *peer_cachep __read_mostly; | 68 | static struct kmem_cache *peer_cachep __read_mostly; |
68 | 69 | ||
70 | static LIST_HEAD(gc_list); | ||
71 | static const int gc_delay = 60 * HZ; | ||
72 | static struct delayed_work gc_work; | ||
73 | static DEFINE_SPINLOCK(gc_lock); | ||
74 | |||
69 | #define node_height(x) x->avl_height | 75 | #define node_height(x) x->avl_height |
70 | 76 | ||
71 | #define peer_avl_empty ((struct inet_peer *)&peer_fake_node) | 77 | #define peer_avl_empty ((struct inet_peer *)&peer_fake_node) |
@@ -102,6 +108,50 @@ int inet_peer_threshold __read_mostly = 65536 + 128; /* start to throw entries m | |||
102 | int inet_peer_minttl __read_mostly = 120 * HZ; /* TTL under high load: 120 sec */ | 108 | int inet_peer_minttl __read_mostly = 120 * HZ; /* TTL under high load: 120 sec */ |
103 | int inet_peer_maxttl __read_mostly = 10 * 60 * HZ; /* usual time to live: 10 min */ | 109 | int inet_peer_maxttl __read_mostly = 10 * 60 * HZ; /* usual time to live: 10 min */ |
104 | 110 | ||
111 | static void inetpeer_gc_worker(struct work_struct *work) | ||
112 | { | ||
113 | struct inet_peer *p, *n; | ||
114 | LIST_HEAD(list); | ||
115 | |||
116 | spin_lock_bh(&gc_lock); | ||
117 | list_replace_init(&gc_list, &list); | ||
118 | spin_unlock_bh(&gc_lock); | ||
119 | |||
120 | if (list_empty(&list)) | ||
121 | return; | ||
122 | |||
123 | list_for_each_entry_safe(p, n, &list, gc_list) { | ||
124 | |||
125 | if(need_resched()) | ||
126 | cond_resched(); | ||
127 | |||
128 | if (p->avl_left != peer_avl_empty) { | ||
129 | list_add_tail(&p->avl_left->gc_list, &list); | ||
130 | p->avl_left = peer_avl_empty; | ||
131 | } | ||
132 | |||
133 | if (p->avl_right != peer_avl_empty) { | ||
134 | list_add_tail(&p->avl_right->gc_list, &list); | ||
135 | p->avl_right = peer_avl_empty; | ||
136 | } | ||
137 | |||
138 | n = list_entry(p->gc_list.next, struct inet_peer, gc_list); | ||
139 | |||
140 | if (!atomic_read(&p->refcnt)) { | ||
141 | list_del(&p->gc_list); | ||
142 | kmem_cache_free(peer_cachep, p); | ||
143 | } | ||
144 | } | ||
145 | |||
146 | if (list_empty(&list)) | ||
147 | return; | ||
148 | |||
149 | spin_lock_bh(&gc_lock); | ||
150 | list_splice(&list, &gc_list); | ||
151 | spin_unlock_bh(&gc_lock); | ||
152 | |||
153 | schedule_delayed_work(&gc_work, gc_delay); | ||
154 | } | ||
105 | 155 | ||
106 | /* Called from ip_output.c:ip_init */ | 156 | /* Called from ip_output.c:ip_init */ |
107 | void __init inet_initpeers(void) | 157 | void __init inet_initpeers(void) |
@@ -126,6 +176,7 @@ void __init inet_initpeers(void) | |||
126 | 0, SLAB_HWCACHE_ALIGN | SLAB_PANIC, | 176 | 0, SLAB_HWCACHE_ALIGN | SLAB_PANIC, |
127 | NULL); | 177 | NULL); |
128 | 178 | ||
179 | INIT_DELAYED_WORK_DEFERRABLE(&gc_work, inetpeer_gc_worker); | ||
129 | } | 180 | } |
130 | 181 | ||
131 | static int addr_compare(const struct inetpeer_addr *a, | 182 | static int addr_compare(const struct inetpeer_addr *a, |
@@ -447,9 +498,8 @@ relookup: | |||
447 | p->rate_last = 0; | 498 | p->rate_last = 0; |
448 | p->pmtu_expires = 0; | 499 | p->pmtu_expires = 0; |
449 | p->pmtu_orig = 0; | 500 | p->pmtu_orig = 0; |
450 | p->redirect_genid = 0; | ||
451 | memset(&p->redirect_learned, 0, sizeof(p->redirect_learned)); | 501 | memset(&p->redirect_learned, 0, sizeof(p->redirect_learned)); |
452 | 502 | INIT_LIST_HEAD(&p->gc_list); | |
453 | 503 | ||
454 | /* Link the node. */ | 504 | /* Link the node. */ |
455 | link_to_pool(p, base); | 505 | link_to_pool(p, base); |
@@ -509,3 +559,30 @@ bool inet_peer_xrlim_allow(struct inet_peer *peer, int timeout) | |||
509 | return rc; | 559 | return rc; |
510 | } | 560 | } |
511 | EXPORT_SYMBOL(inet_peer_xrlim_allow); | 561 | EXPORT_SYMBOL(inet_peer_xrlim_allow); |
562 | |||
563 | void inetpeer_invalidate_tree(int family) | ||
564 | { | ||
565 | struct inet_peer *old, *new, *prev; | ||
566 | struct inet_peer_base *base = family_to_base(family); | ||
567 | |||
568 | write_seqlock_bh(&base->lock); | ||
569 | |||
570 | old = base->root; | ||
571 | if (old == peer_avl_empty_rcu) | ||
572 | goto out; | ||
573 | |||
574 | new = peer_avl_empty_rcu; | ||
575 | |||
576 | prev = cmpxchg(&base->root, old, new); | ||
577 | if (prev == old) { | ||
578 | base->total = 0; | ||
579 | spin_lock(&gc_lock); | ||
580 | list_add_tail(&prev->gc_list, &gc_list); | ||
581 | spin_unlock(&gc_lock); | ||
582 | schedule_delayed_work(&gc_work, gc_delay); | ||
583 | } | ||
584 | |||
585 | out: | ||
586 | write_sequnlock_bh(&base->lock); | ||
587 | } | ||
588 | EXPORT_SYMBOL(inetpeer_invalidate_tree); | ||
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index bcacf54e5418..019774796174 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
@@ -132,7 +132,6 @@ static int ip_rt_mtu_expires __read_mostly = 10 * 60 * HZ; | |||
132 | static int ip_rt_min_pmtu __read_mostly = 512 + 20 + 20; | 132 | static int ip_rt_min_pmtu __read_mostly = 512 + 20 + 20; |
133 | static int ip_rt_min_advmss __read_mostly = 256; | 133 | static int ip_rt_min_advmss __read_mostly = 256; |
134 | static int rt_chain_length_max __read_mostly = 20; | 134 | static int rt_chain_length_max __read_mostly = 20; |
135 | static int redirect_genid; | ||
136 | 135 | ||
137 | static struct delayed_work expires_work; | 136 | static struct delayed_work expires_work; |
138 | static unsigned long expires_ljiffies; | 137 | static unsigned long expires_ljiffies; |
@@ -937,7 +936,7 @@ static void rt_cache_invalidate(struct net *net) | |||
937 | 936 | ||
938 | get_random_bytes(&shuffle, sizeof(shuffle)); | 937 | get_random_bytes(&shuffle, sizeof(shuffle)); |
939 | atomic_add(shuffle + 1U, &net->ipv4.rt_genid); | 938 | atomic_add(shuffle + 1U, &net->ipv4.rt_genid); |
940 | redirect_genid++; | 939 | inetpeer_invalidate_tree(AF_INET); |
941 | } | 940 | } |
942 | 941 | ||
943 | /* | 942 | /* |
@@ -1485,10 +1484,8 @@ void ip_rt_redirect(__be32 old_gw, __be32 daddr, __be32 new_gw, | |||
1485 | 1484 | ||
1486 | peer = rt->peer; | 1485 | peer = rt->peer; |
1487 | if (peer) { | 1486 | if (peer) { |
1488 | if (peer->redirect_learned.a4 != new_gw || | 1487 | if (peer->redirect_learned.a4 != new_gw) { |
1489 | peer->redirect_genid != redirect_genid) { | ||
1490 | peer->redirect_learned.a4 = new_gw; | 1488 | peer->redirect_learned.a4 = new_gw; |
1491 | peer->redirect_genid = redirect_genid; | ||
1492 | atomic_inc(&__rt_peer_genid); | 1489 | atomic_inc(&__rt_peer_genid); |
1493 | } | 1490 | } |
1494 | check_peer_redir(&rt->dst, peer); | 1491 | check_peer_redir(&rt->dst, peer); |
@@ -1793,8 +1790,6 @@ static void ipv4_validate_peer(struct rtable *rt) | |||
1793 | if (peer) { | 1790 | if (peer) { |
1794 | check_peer_pmtu(&rt->dst, peer); | 1791 | check_peer_pmtu(&rt->dst, peer); |
1795 | 1792 | ||
1796 | if (peer->redirect_genid != redirect_genid) | ||
1797 | peer->redirect_learned.a4 = 0; | ||
1798 | if (peer->redirect_learned.a4 && | 1793 | if (peer->redirect_learned.a4 && |
1799 | peer->redirect_learned.a4 != rt->rt_gateway) | 1794 | peer->redirect_learned.a4 != rt->rt_gateway) |
1800 | check_peer_redir(&rt->dst, peer); | 1795 | check_peer_redir(&rt->dst, peer); |
@@ -1958,8 +1953,7 @@ static void rt_init_metrics(struct rtable *rt, const struct flowi4 *fl4, | |||
1958 | dst_init_metrics(&rt->dst, peer->metrics, false); | 1953 | dst_init_metrics(&rt->dst, peer->metrics, false); |
1959 | 1954 | ||
1960 | check_peer_pmtu(&rt->dst, peer); | 1955 | check_peer_pmtu(&rt->dst, peer); |
1961 | if (peer->redirect_genid != redirect_genid) | 1956 | |
1962 | peer->redirect_learned.a4 = 0; | ||
1963 | if (peer->redirect_learned.a4 && | 1957 | if (peer->redirect_learned.a4 && |
1964 | peer->redirect_learned.a4 != rt->rt_gateway) { | 1958 | peer->redirect_learned.a4 != rt->rt_gateway) { |
1965 | rt->rt_gateway = peer->redirect_learned.a4; | 1959 | rt->rt_gateway = peer->redirect_learned.a4; |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 53c8ce4046b2..b5e315f13641 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -1403,8 +1403,16 @@ static int tcp_shifted_skb(struct sock *sk, struct sk_buff *skb, | |||
1403 | 1403 | ||
1404 | BUG_ON(!pcount); | 1404 | BUG_ON(!pcount); |
1405 | 1405 | ||
1406 | /* Adjust hint for FACK. Non-FACK is handled in tcp_sacktag_one(). */ | 1406 | /* Adjust counters and hints for the newly sacked sequence |
1407 | if (tcp_is_fack(tp) && (skb == tp->lost_skb_hint)) | 1407 | * range but discard the return value since prev is already |
1408 | * marked. We must tag the range first because the seq | ||
1409 | * advancement below implicitly advances | ||
1410 | * tcp_highest_sack_seq() when skb is highest_sack. | ||
1411 | */ | ||
1412 | tcp_sacktag_one(sk, state, TCP_SKB_CB(skb)->sacked, | ||
1413 | start_seq, end_seq, dup_sack, pcount); | ||
1414 | |||
1415 | if (skb == tp->lost_skb_hint) | ||
1408 | tp->lost_cnt_hint += pcount; | 1416 | tp->lost_cnt_hint += pcount; |
1409 | 1417 | ||
1410 | TCP_SKB_CB(prev)->end_seq += shifted; | 1418 | TCP_SKB_CB(prev)->end_seq += shifted; |
@@ -1430,12 +1438,6 @@ static int tcp_shifted_skb(struct sock *sk, struct sk_buff *skb, | |||
1430 | skb_shinfo(skb)->gso_type = 0; | 1438 | skb_shinfo(skb)->gso_type = 0; |
1431 | } | 1439 | } |
1432 | 1440 | ||
1433 | /* Adjust counters and hints for the newly sacked sequence range but | ||
1434 | * discard the return value since prev is already marked. | ||
1435 | */ | ||
1436 | tcp_sacktag_one(sk, state, TCP_SKB_CB(skb)->sacked, | ||
1437 | start_seq, end_seq, dup_sack, pcount); | ||
1438 | |||
1439 | /* Difference in this won't matter, both ACKed by the same cumul. ACK */ | 1441 | /* Difference in this won't matter, both ACKed by the same cumul. ACK */ |
1440 | TCP_SKB_CB(prev)->sacked |= (TCP_SKB_CB(skb)->sacked & TCPCB_EVER_RETRANS); | 1442 | TCP_SKB_CB(prev)->sacked |= (TCP_SKB_CB(skb)->sacked & TCPCB_EVER_RETRANS); |
1441 | 1443 | ||
@@ -1583,6 +1585,10 @@ static struct sk_buff *tcp_shift_skb_data(struct sock *sk, struct sk_buff *skb, | |||
1583 | } | 1585 | } |
1584 | } | 1586 | } |
1585 | 1587 | ||
1588 | /* tcp_sacktag_one() won't SACK-tag ranges below snd_una */ | ||
1589 | if (!after(TCP_SKB_CB(skb)->seq + len, tp->snd_una)) | ||
1590 | goto fallback; | ||
1591 | |||
1586 | if (!skb_shift(prev, skb, len)) | 1592 | if (!skb_shift(prev, skb, len)) |
1587 | goto fallback; | 1593 | goto fallback; |
1588 | if (!tcp_shifted_skb(sk, skb, state, pcount, len, mss, dup_sack)) | 1594 | if (!tcp_shifted_skb(sk, skb, state, pcount, len, mss, dup_sack)) |
@@ -2567,6 +2573,7 @@ static void tcp_mark_head_lost(struct sock *sk, int packets, int mark_head) | |||
2567 | 2573 | ||
2568 | if (cnt > packets) { | 2574 | if (cnt > packets) { |
2569 | if ((tcp_is_sack(tp) && !tcp_is_fack(tp)) || | 2575 | if ((tcp_is_sack(tp) && !tcp_is_fack(tp)) || |
2576 | (TCP_SKB_CB(skb)->sacked & TCPCB_SACKED_ACKED) || | ||
2570 | (oldcnt >= packets)) | 2577 | (oldcnt >= packets)) |
2571 | break; | 2578 | break; |
2572 | 2579 | ||
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index c02280a4d126..6b8ebc5da0e1 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -434,6 +434,10 @@ static struct inet6_dev * ipv6_add_dev(struct net_device *dev) | |||
434 | /* Join all-node multicast group */ | 434 | /* Join all-node multicast group */ |
435 | ipv6_dev_mc_inc(dev, &in6addr_linklocal_allnodes); | 435 | ipv6_dev_mc_inc(dev, &in6addr_linklocal_allnodes); |
436 | 436 | ||
437 | /* Join all-router multicast group if forwarding is set */ | ||
438 | if (ndev->cnf.forwarding && dev && (dev->flags & IFF_MULTICAST)) | ||
439 | ipv6_dev_mc_inc(dev, &in6addr_linklocal_allrouters); | ||
440 | |||
437 | return ndev; | 441 | return ndev; |
438 | } | 442 | } |
439 | 443 | ||
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c index 01a21c2f6ab3..8e2137bd87e2 100644 --- a/net/mac80211/iface.c +++ b/net/mac80211/iface.c | |||
@@ -1332,6 +1332,9 @@ u32 __ieee80211_recalc_idle(struct ieee80211_local *local) | |||
1332 | hw_roc = true; | 1332 | hw_roc = true; |
1333 | 1333 | ||
1334 | list_for_each_entry(sdata, &local->interfaces, list) { | 1334 | list_for_each_entry(sdata, &local->interfaces, list) { |
1335 | if (sdata->vif.type == NL80211_IFTYPE_MONITOR || | ||
1336 | sdata->vif.type == NL80211_IFTYPE_AP_VLAN) | ||
1337 | continue; | ||
1335 | if (sdata->old_idle == sdata->vif.bss_conf.idle) | 1338 | if (sdata->old_idle == sdata->vif.bss_conf.idle) |
1336 | continue; | 1339 | continue; |
1337 | if (!ieee80211_sdata_running(sdata)) | 1340 | if (!ieee80211_sdata_running(sdata)) |
diff --git a/net/mac80211/rate.c b/net/mac80211/rate.c index ad64f4d5271a..f9b8e819ca63 100644 --- a/net/mac80211/rate.c +++ b/net/mac80211/rate.c | |||
@@ -344,7 +344,7 @@ void rate_control_get_rate(struct ieee80211_sub_if_data *sdata, | |||
344 | for (i = 0; i < IEEE80211_TX_MAX_RATES; i++) { | 344 | for (i = 0; i < IEEE80211_TX_MAX_RATES; i++) { |
345 | info->control.rates[i].idx = -1; | 345 | info->control.rates[i].idx = -1; |
346 | info->control.rates[i].flags = 0; | 346 | info->control.rates[i].flags = 0; |
347 | info->control.rates[i].count = 1; | 347 | info->control.rates[i].count = 0; |
348 | } | 348 | } |
349 | 349 | ||
350 | if (sdata->local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL) | 350 | if (sdata->local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL) |
diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c index ed86a3be678e..fa4b82c8ae80 100644 --- a/net/netfilter/nf_conntrack_core.c +++ b/net/netfilter/nf_conntrack_core.c | |||
@@ -635,8 +635,12 @@ static noinline int early_drop(struct net *net, unsigned int hash) | |||
635 | 635 | ||
636 | if (del_timer(&ct->timeout)) { | 636 | if (del_timer(&ct->timeout)) { |
637 | death_by_timeout((unsigned long)ct); | 637 | death_by_timeout((unsigned long)ct); |
638 | dropped = 1; | 638 | /* Check if we indeed killed this entry. Reliable event |
639 | NF_CT_STAT_INC_ATOMIC(net, early_drop); | 639 | delivery may have inserted it into the dying list. */ |
640 | if (test_bit(IPS_DYING_BIT, &ct->status)) { | ||
641 | dropped = 1; | ||
642 | NF_CT_STAT_INC_ATOMIC(net, early_drop); | ||
643 | } | ||
640 | } | 644 | } |
641 | nf_ct_put(ct); | 645 | nf_ct_put(ct); |
642 | return dropped; | 646 | return dropped; |
diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c index 30c9d4ca0218..10687692831e 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c | |||
@@ -1041,16 +1041,13 @@ ctnetlink_parse_nat_setup(struct nf_conn *ct, | |||
1041 | if (!parse_nat_setup) { | 1041 | if (!parse_nat_setup) { |
1042 | #ifdef CONFIG_MODULES | 1042 | #ifdef CONFIG_MODULES |
1043 | rcu_read_unlock(); | 1043 | rcu_read_unlock(); |
1044 | spin_unlock_bh(&nf_conntrack_lock); | ||
1045 | nfnl_unlock(); | 1044 | nfnl_unlock(); |
1046 | if (request_module("nf-nat-ipv4") < 0) { | 1045 | if (request_module("nf-nat-ipv4") < 0) { |
1047 | nfnl_lock(); | 1046 | nfnl_lock(); |
1048 | spin_lock_bh(&nf_conntrack_lock); | ||
1049 | rcu_read_lock(); | 1047 | rcu_read_lock(); |
1050 | return -EOPNOTSUPP; | 1048 | return -EOPNOTSUPP; |
1051 | } | 1049 | } |
1052 | nfnl_lock(); | 1050 | nfnl_lock(); |
1053 | spin_lock_bh(&nf_conntrack_lock); | ||
1054 | rcu_read_lock(); | 1051 | rcu_read_lock(); |
1055 | if (nfnetlink_parse_nat_setup_hook) | 1052 | if (nfnetlink_parse_nat_setup_hook) |
1056 | return -EAGAIN; | 1053 | return -EAGAIN; |
diff --git a/net/openvswitch/actions.c b/net/openvswitch/actions.c index 2725d1bdf291..48badffaafc1 100644 --- a/net/openvswitch/actions.c +++ b/net/openvswitch/actions.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) 2007-2011 Nicira Networks. | 2 | * Copyright (c) 2007-2012 Nicira Networks. |
3 | * | 3 | * |
4 | * This program is free software; you can redistribute it and/or | 4 | * This program is free software; you can redistribute it and/or |
5 | * modify it under the terms of version 2 of the GNU General Public | 5 | * modify it under the terms of version 2 of the GNU General Public |
@@ -145,9 +145,16 @@ static void set_ip_addr(struct sk_buff *skb, struct iphdr *nh, | |||
145 | inet_proto_csum_replace4(&tcp_hdr(skb)->check, skb, | 145 | inet_proto_csum_replace4(&tcp_hdr(skb)->check, skb, |
146 | *addr, new_addr, 1); | 146 | *addr, new_addr, 1); |
147 | } else if (nh->protocol == IPPROTO_UDP) { | 147 | } else if (nh->protocol == IPPROTO_UDP) { |
148 | if (likely(transport_len >= sizeof(struct udphdr))) | 148 | if (likely(transport_len >= sizeof(struct udphdr))) { |
149 | inet_proto_csum_replace4(&udp_hdr(skb)->check, skb, | 149 | struct udphdr *uh = udp_hdr(skb); |
150 | *addr, new_addr, 1); | 150 | |
151 | if (uh->check || skb->ip_summed == CHECKSUM_PARTIAL) { | ||
152 | inet_proto_csum_replace4(&uh->check, skb, | ||
153 | *addr, new_addr, 1); | ||
154 | if (!uh->check) | ||
155 | uh->check = CSUM_MANGLED_0; | ||
156 | } | ||
157 | } | ||
151 | } | 158 | } |
152 | 159 | ||
153 | csum_replace4(&nh->check, *addr, new_addr); | 160 | csum_replace4(&nh->check, *addr, new_addr); |
@@ -197,8 +204,22 @@ static void set_tp_port(struct sk_buff *skb, __be16 *port, | |||
197 | skb->rxhash = 0; | 204 | skb->rxhash = 0; |
198 | } | 205 | } |
199 | 206 | ||
200 | static int set_udp_port(struct sk_buff *skb, | 207 | static void set_udp_port(struct sk_buff *skb, __be16 *port, __be16 new_port) |
201 | const struct ovs_key_udp *udp_port_key) | 208 | { |
209 | struct udphdr *uh = udp_hdr(skb); | ||
210 | |||
211 | if (uh->check && skb->ip_summed != CHECKSUM_PARTIAL) { | ||
212 | set_tp_port(skb, port, new_port, &uh->check); | ||
213 | |||
214 | if (!uh->check) | ||
215 | uh->check = CSUM_MANGLED_0; | ||
216 | } else { | ||
217 | *port = new_port; | ||
218 | skb->rxhash = 0; | ||
219 | } | ||
220 | } | ||
221 | |||
222 | static int set_udp(struct sk_buff *skb, const struct ovs_key_udp *udp_port_key) | ||
202 | { | 223 | { |
203 | struct udphdr *uh; | 224 | struct udphdr *uh; |
204 | int err; | 225 | int err; |
@@ -210,16 +231,15 @@ static int set_udp_port(struct sk_buff *skb, | |||
210 | 231 | ||
211 | uh = udp_hdr(skb); | 232 | uh = udp_hdr(skb); |
212 | if (udp_port_key->udp_src != uh->source) | 233 | if (udp_port_key->udp_src != uh->source) |
213 | set_tp_port(skb, &uh->source, udp_port_key->udp_src, &uh->check); | 234 | set_udp_port(skb, &uh->source, udp_port_key->udp_src); |
214 | 235 | ||
215 | if (udp_port_key->udp_dst != uh->dest) | 236 | if (udp_port_key->udp_dst != uh->dest) |
216 | set_tp_port(skb, &uh->dest, udp_port_key->udp_dst, &uh->check); | 237 | set_udp_port(skb, &uh->dest, udp_port_key->udp_dst); |
217 | 238 | ||
218 | return 0; | 239 | return 0; |
219 | } | 240 | } |
220 | 241 | ||
221 | static int set_tcp_port(struct sk_buff *skb, | 242 | static int set_tcp(struct sk_buff *skb, const struct ovs_key_tcp *tcp_port_key) |
222 | const struct ovs_key_tcp *tcp_port_key) | ||
223 | { | 243 | { |
224 | struct tcphdr *th; | 244 | struct tcphdr *th; |
225 | int err; | 245 | int err; |
@@ -328,11 +348,11 @@ static int execute_set_action(struct sk_buff *skb, | |||
328 | break; | 348 | break; |
329 | 349 | ||
330 | case OVS_KEY_ATTR_TCP: | 350 | case OVS_KEY_ATTR_TCP: |
331 | err = set_tcp_port(skb, nla_data(nested_attr)); | 351 | err = set_tcp(skb, nla_data(nested_attr)); |
332 | break; | 352 | break; |
333 | 353 | ||
334 | case OVS_KEY_ATTR_UDP: | 354 | case OVS_KEY_ATTR_UDP: |
335 | err = set_udp_port(skb, nla_data(nested_attr)); | 355 | err = set_udp(skb, nla_data(nested_attr)); |
336 | break; | 356 | break; |
337 | } | 357 | } |
338 | 358 | ||
diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c index ce64c18b8c79..2c030505b335 100644 --- a/net/openvswitch/datapath.c +++ b/net/openvswitch/datapath.c | |||
@@ -1521,6 +1521,9 @@ static struct vport *lookup_vport(struct ovs_header *ovs_header, | |||
1521 | vport = ovs_vport_locate(nla_data(a[OVS_VPORT_ATTR_NAME])); | 1521 | vport = ovs_vport_locate(nla_data(a[OVS_VPORT_ATTR_NAME])); |
1522 | if (!vport) | 1522 | if (!vport) |
1523 | return ERR_PTR(-ENODEV); | 1523 | return ERR_PTR(-ENODEV); |
1524 | if (ovs_header->dp_ifindex && | ||
1525 | ovs_header->dp_ifindex != get_dpifindex(vport->dp)) | ||
1526 | return ERR_PTR(-ENODEV); | ||
1524 | return vport; | 1527 | return vport; |
1525 | } else if (a[OVS_VPORT_ATTR_PORT_NO]) { | 1528 | } else if (a[OVS_VPORT_ATTR_PORT_NO]) { |
1526 | u32 port_no = nla_get_u32(a[OVS_VPORT_ATTR_PORT_NO]); | 1529 | u32 port_no = nla_get_u32(a[OVS_VPORT_ATTR_PORT_NO]); |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index f286bb8fda13..22c73b78ac6f 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -2068,12 +2068,16 @@ static int alc_build_controls(struct hda_codec *codec) | |||
2068 | */ | 2068 | */ |
2069 | 2069 | ||
2070 | static void alc_init_special_input_src(struct hda_codec *codec); | 2070 | static void alc_init_special_input_src(struct hda_codec *codec); |
2071 | static int alc269_fill_coef(struct hda_codec *codec); | ||
2071 | 2072 | ||
2072 | static int alc_init(struct hda_codec *codec) | 2073 | static int alc_init(struct hda_codec *codec) |
2073 | { | 2074 | { |
2074 | struct alc_spec *spec = codec->spec; | 2075 | struct alc_spec *spec = codec->spec; |
2075 | unsigned int i; | 2076 | unsigned int i; |
2076 | 2077 | ||
2078 | if (codec->vendor_id == 0x10ec0269) | ||
2079 | alc269_fill_coef(codec); | ||
2080 | |||
2077 | alc_fix_pll(codec); | 2081 | alc_fix_pll(codec); |
2078 | alc_auto_init_amp(codec, spec->init_amp); | 2082 | alc_auto_init_amp(codec, spec->init_amp); |
2079 | 2083 | ||
@@ -4367,6 +4371,7 @@ enum { | |||
4367 | ALC882_FIXUP_PB_M5210, | 4371 | ALC882_FIXUP_PB_M5210, |
4368 | ALC882_FIXUP_ACER_ASPIRE_7736, | 4372 | ALC882_FIXUP_ACER_ASPIRE_7736, |
4369 | ALC882_FIXUP_ASUS_W90V, | 4373 | ALC882_FIXUP_ASUS_W90V, |
4374 | ALC889_FIXUP_CD, | ||
4370 | ALC889_FIXUP_VAIO_TT, | 4375 | ALC889_FIXUP_VAIO_TT, |
4371 | ALC888_FIXUP_EEE1601, | 4376 | ALC888_FIXUP_EEE1601, |
4372 | ALC882_FIXUP_EAPD, | 4377 | ALC882_FIXUP_EAPD, |
@@ -4494,6 +4499,13 @@ static const struct alc_fixup alc882_fixups[] = { | |||
4494 | { } | 4499 | { } |
4495 | } | 4500 | } |
4496 | }, | 4501 | }, |
4502 | [ALC889_FIXUP_CD] = { | ||
4503 | .type = ALC_FIXUP_PINS, | ||
4504 | .v.pins = (const struct alc_pincfg[]) { | ||
4505 | { 0x1c, 0x993301f0 }, /* CD */ | ||
4506 | { } | ||
4507 | } | ||
4508 | }, | ||
4497 | [ALC889_FIXUP_VAIO_TT] = { | 4509 | [ALC889_FIXUP_VAIO_TT] = { |
4498 | .type = ALC_FIXUP_PINS, | 4510 | .type = ALC_FIXUP_PINS, |
4499 | .v.pins = (const struct alc_pincfg[]) { | 4511 | .v.pins = (const struct alc_pincfg[]) { |
@@ -4650,6 +4662,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = { | |||
4650 | 4662 | ||
4651 | SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD), | 4663 | SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD), |
4652 | SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3), | 4664 | SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3), |
4665 | SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte EP45-DS3", ALC889_FIXUP_CD), | ||
4653 | SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX), | 4666 | SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX), |
4654 | SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD), | 4667 | SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD), |
4655 | SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_FIXUP_EAPD), | 4668 | SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_FIXUP_EAPD), |
@@ -5467,8 +5480,12 @@ static const struct alc_model_fixup alc269_fixup_models[] = { | |||
5467 | 5480 | ||
5468 | static int alc269_fill_coef(struct hda_codec *codec) | 5481 | static int alc269_fill_coef(struct hda_codec *codec) |
5469 | { | 5482 | { |
5483 | struct alc_spec *spec = codec->spec; | ||
5470 | int val; | 5484 | int val; |
5471 | 5485 | ||
5486 | if (spec->codec_variant != ALC269_TYPE_ALC269VB) | ||
5487 | return 0; | ||
5488 | |||
5472 | if ((alc_get_coef0(codec) & 0x00ff) < 0x015) { | 5489 | if ((alc_get_coef0(codec) & 0x00ff) < 0x015) { |
5473 | alc_write_coef_idx(codec, 0xf, 0x960b); | 5490 | alc_write_coef_idx(codec, 0xf, 0x960b); |
5474 | alc_write_coef_idx(codec, 0xe, 0x8817); | 5491 | alc_write_coef_idx(codec, 0xe, 0x8817); |
diff --git a/sound/pci/rme9652/hdspm.c b/sound/pci/rme9652/hdspm.c index cc9f6c83d661..bc030a2088da 100644 --- a/sound/pci/rme9652/hdspm.c +++ b/sound/pci/rme9652/hdspm.c | |||
@@ -6333,6 +6333,7 @@ static int __devinit snd_hdspm_create_hwdep(struct snd_card *card, | |||
6333 | 6333 | ||
6334 | hw->ops.open = snd_hdspm_hwdep_dummy_op; | 6334 | hw->ops.open = snd_hdspm_hwdep_dummy_op; |
6335 | hw->ops.ioctl = snd_hdspm_hwdep_ioctl; | 6335 | hw->ops.ioctl = snd_hdspm_hwdep_ioctl; |
6336 | hw->ops.ioctl_compat = snd_hdspm_hwdep_ioctl; | ||
6336 | hw->ops.release = snd_hdspm_hwdep_dummy_op; | 6337 | hw->ops.release = snd_hdspm_hwdep_dummy_op; |
6337 | 6338 | ||
6338 | return 0; | 6339 | return 0; |
diff --git a/sound/soc/samsung/neo1973_wm8753.c b/sound/soc/samsung/neo1973_wm8753.c index c6012ff5bd3e..d23b19a59d83 100644 --- a/sound/soc/samsung/neo1973_wm8753.c +++ b/sound/soc/samsung/neo1973_wm8753.c | |||
@@ -367,7 +367,7 @@ static struct snd_soc_dai_link neo1973_dai[] = { | |||
367 | .platform_name = "samsung-audio", | 367 | .platform_name = "samsung-audio", |
368 | .cpu_dai_name = "s3c24xx-iis", | 368 | .cpu_dai_name = "s3c24xx-iis", |
369 | .codec_dai_name = "wm8753-hifi", | 369 | .codec_dai_name = "wm8753-hifi", |
370 | .codec_name = "wm8753-codec.0-001a", | 370 | .codec_name = "wm8753.0-001a", |
371 | .init = neo1973_wm8753_init, | 371 | .init = neo1973_wm8753_init, |
372 | .ops = &neo1973_hifi_ops, | 372 | .ops = &neo1973_hifi_ops, |
373 | }, | 373 | }, |
@@ -376,7 +376,7 @@ static struct snd_soc_dai_link neo1973_dai[] = { | |||
376 | .stream_name = "Voice", | 376 | .stream_name = "Voice", |
377 | .cpu_dai_name = "dfbmcs320-pcm", | 377 | .cpu_dai_name = "dfbmcs320-pcm", |
378 | .codec_dai_name = "wm8753-voice", | 378 | .codec_dai_name = "wm8753-voice", |
379 | .codec_name = "wm8753-codec.0-001a", | 379 | .codec_name = "wm8753.0-001a", |
380 | .ops = &neo1973_voice_ops, | 380 | .ops = &neo1973_voice_ops, |
381 | }, | 381 | }, |
382 | }; | 382 | }; |
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index 0abfb18b911f..227b6ae99785 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c | |||
@@ -204,6 +204,9 @@ static void perf_record__open(struct perf_record *rec) | |||
204 | 204 | ||
205 | if (opts->group && pos != first) | 205 | if (opts->group && pos != first) |
206 | group_fd = first->fd; | 206 | group_fd = first->fd; |
207 | fallback_missing_features: | ||
208 | if (opts->exclude_guest_missing) | ||
209 | attr->exclude_guest = attr->exclude_host = 0; | ||
207 | retry_sample_id: | 210 | retry_sample_id: |
208 | attr->sample_id_all = opts->sample_id_all_avail ? 1 : 0; | 211 | attr->sample_id_all = opts->sample_id_all_avail ? 1 : 0; |
209 | try_again: | 212 | try_again: |
@@ -217,15 +220,23 @@ try_again: | |||
217 | } else if (err == ENODEV && opts->cpu_list) { | 220 | } else if (err == ENODEV && opts->cpu_list) { |
218 | die("No such device - did you specify" | 221 | die("No such device - did you specify" |
219 | " an out-of-range profile CPU?\n"); | 222 | " an out-of-range profile CPU?\n"); |
220 | } else if (err == EINVAL && opts->sample_id_all_avail) { | 223 | } else if (err == EINVAL) { |
221 | /* | 224 | if (!opts->exclude_guest_missing && |
222 | * Old kernel, no attr->sample_id_type_all field | 225 | (attr->exclude_guest || attr->exclude_host)) { |
223 | */ | 226 | pr_debug("Old kernel, cannot exclude " |
224 | opts->sample_id_all_avail = false; | 227 | "guest or host samples.\n"); |
225 | if (!opts->sample_time && !opts->raw_samples && !time_needed) | 228 | opts->exclude_guest_missing = true; |
226 | attr->sample_type &= ~PERF_SAMPLE_TIME; | 229 | goto fallback_missing_features; |
227 | 230 | } else if (opts->sample_id_all_avail) { | |
228 | goto retry_sample_id; | 231 | /* |
232 | * Old kernel, no attr->sample_id_type_all field | ||
233 | */ | ||
234 | opts->sample_id_all_avail = false; | ||
235 | if (!opts->sample_time && !opts->raw_samples && !time_needed) | ||
236 | attr->sample_type &= ~PERF_SAMPLE_TIME; | ||
237 | |||
238 | goto retry_sample_id; | ||
239 | } | ||
229 | } | 240 | } |
230 | 241 | ||
231 | /* | 242 | /* |
@@ -503,9 +514,9 @@ static int __cmd_record(struct perf_record *rec, int argc, const char **argv) | |||
503 | return err; | 514 | return err; |
504 | } | 515 | } |
505 | 516 | ||
506 | if (!!rec->no_buildid | 517 | if (!rec->no_buildid |
507 | && !perf_header__has_feat(&session->header, HEADER_BUILD_ID)) { | 518 | && !perf_header__has_feat(&session->header, HEADER_BUILD_ID)) { |
508 | pr_err("Couldn't generating buildids. " | 519 | pr_err("Couldn't generate buildids. " |
509 | "Use --no-buildid to profile anyway.\n"); | 520 | "Use --no-buildid to profile anyway.\n"); |
510 | return -1; | 521 | return -1; |
511 | } | 522 | } |
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c index dd162aa24baa..ecff31257eb3 100644 --- a/tools/perf/builtin-top.c +++ b/tools/perf/builtin-top.c | |||
@@ -857,6 +857,9 @@ static void perf_top__start_counters(struct perf_top *top) | |||
857 | attr->mmap = 1; | 857 | attr->mmap = 1; |
858 | attr->comm = 1; | 858 | attr->comm = 1; |
859 | attr->inherit = top->inherit; | 859 | attr->inherit = top->inherit; |
860 | fallback_missing_features: | ||
861 | if (top->exclude_guest_missing) | ||
862 | attr->exclude_guest = attr->exclude_host = 0; | ||
860 | retry_sample_id: | 863 | retry_sample_id: |
861 | attr->sample_id_all = top->sample_id_all_avail ? 1 : 0; | 864 | attr->sample_id_all = top->sample_id_all_avail ? 1 : 0; |
862 | try_again: | 865 | try_again: |
@@ -868,12 +871,20 @@ try_again: | |||
868 | if (err == EPERM || err == EACCES) { | 871 | if (err == EPERM || err == EACCES) { |
869 | ui__error_paranoid(); | 872 | ui__error_paranoid(); |
870 | goto out_err; | 873 | goto out_err; |
871 | } else if (err == EINVAL && top->sample_id_all_avail) { | 874 | } else if (err == EINVAL) { |
872 | /* | 875 | if (!top->exclude_guest_missing && |
873 | * Old kernel, no attr->sample_id_type_all field | 876 | (attr->exclude_guest || attr->exclude_host)) { |
874 | */ | 877 | pr_debug("Old kernel, cannot exclude " |
875 | top->sample_id_all_avail = false; | 878 | "guest or host samples.\n"); |
876 | goto retry_sample_id; | 879 | top->exclude_guest_missing = true; |
880 | goto fallback_missing_features; | ||
881 | } else if (top->sample_id_all_avail) { | ||
882 | /* | ||
883 | * Old kernel, no attr->sample_id_type_all field | ||
884 | */ | ||
885 | top->sample_id_all_avail = false; | ||
886 | goto retry_sample_id; | ||
887 | } | ||
877 | } | 888 | } |
878 | /* | 889 | /* |
879 | * If it's cycles then fall back to hrtimer | 890 | * If it's cycles then fall back to hrtimer |
diff --git a/tools/perf/perf.h b/tools/perf/perf.h index 64f8bee31ced..16e7d20eee83 100644 --- a/tools/perf/perf.h +++ b/tools/perf/perf.h | |||
@@ -199,6 +199,7 @@ struct perf_record_opts { | |||
199 | bool sample_address; | 199 | bool sample_address; |
200 | bool sample_time; | 200 | bool sample_time; |
201 | bool sample_id_all_avail; | 201 | bool sample_id_all_avail; |
202 | bool exclude_guest_missing; | ||
202 | bool system_wide; | 203 | bool system_wide; |
203 | bool period; | 204 | bool period; |
204 | unsigned int freq; | 205 | unsigned int freq; |
diff --git a/tools/perf/util/top.h b/tools/perf/util/top.h index a248f3c2c60d..f2eab81435ae 100644 --- a/tools/perf/util/top.h +++ b/tools/perf/util/top.h | |||
@@ -34,6 +34,7 @@ struct perf_top { | |||
34 | bool inherit; | 34 | bool inherit; |
35 | bool group; | 35 | bool group; |
36 | bool sample_id_all_avail; | 36 | bool sample_id_all_avail; |
37 | bool exclude_guest_missing; | ||
37 | bool dump_symtab; | 38 | bool dump_symtab; |
38 | const char *cpu_list; | 39 | const char *cpu_list; |
39 | struct hist_entry *sym_filter_entry; | 40 | struct hist_entry *sym_filter_entry; |
diff --git a/tools/perf/util/util.c b/tools/perf/util/util.c index 813141047fc2..fb25d1329218 100644 --- a/tools/perf/util/util.c +++ b/tools/perf/util/util.c | |||
@@ -6,7 +6,7 @@ | |||
6 | * XXX We need to find a better place for these things... | 6 | * XXX We need to find a better place for these things... |
7 | */ | 7 | */ |
8 | bool perf_host = true; | 8 | bool perf_host = true; |
9 | bool perf_guest = true; | 9 | bool perf_guest = false; |
10 | 10 | ||
11 | void event_attr_init(struct perf_event_attr *attr) | 11 | void event_attr_init(struct perf_event_attr *attr) |
12 | { | 12 | { |