diff options
author | David S. Miller <davem@davemloft.net> | 2015-01-27 19:59:56 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-01-27 19:59:56 -0500 |
commit | 95f873f2fff96c592c5d863e2a39825bd8bf0500 (patch) | |
tree | 0d2dd664964ba2c701aefea5b4d1e85b481045e1 | |
parent | 8ea65f4a2dfaaf494ef42a16cbf2fea39b07450f (diff) | |
parent | 59343cd7c4809cf7598789e1cd14563780ae4239 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts:
arch/arm/boot/dts/imx6sx-sdb.dts
net/sched/cls_bpf.c
Two simple sets of overlapping changes.
Signed-off-by: David S. Miller <davem@davemloft.net>
457 files changed, 4418 insertions, 3193 deletions
diff --git a/Documentation/ABI/testing/sysfs-class-mei b/Documentation/ABI/testing/sysfs-class-mei index 0ec8b8178c41..80d9888a8ece 100644 --- a/Documentation/ABI/testing/sysfs-class-mei +++ b/Documentation/ABI/testing/sysfs-class-mei | |||
@@ -14,3 +14,18 @@ Description: | |||
14 | The /sys/class/mei/meiN directory is created for | 14 | The /sys/class/mei/meiN directory is created for |
15 | each probed mei device | 15 | each probed mei device |
16 | 16 | ||
17 | What: /sys/class/mei/meiN/fw_status | ||
18 | Date: Nov 2014 | ||
19 | KernelVersion: 3.19 | ||
20 | Contact: Tomas Winkler <tomas.winkler@intel.com> | ||
21 | Description: Display fw status registers content | ||
22 | |||
23 | The ME FW writes its status information into fw status | ||
24 | registers for BIOS and OS to monitor fw health. | ||
25 | |||
26 | The register contains running state, power management | ||
27 | state, error codes, and others. The way the registers | ||
28 | are decoded depends on PCH or SoC generation. | ||
29 | Also number of registers varies between 1 and 6 | ||
30 | depending on generation. | ||
31 | |||
diff --git a/Documentation/ABI/testing/sysfs-platform-dell-laptop b/Documentation/ABI/testing/sysfs-platform-dell-laptop deleted file mode 100644 index 7969443ef0ef..000000000000 --- a/Documentation/ABI/testing/sysfs-platform-dell-laptop +++ /dev/null | |||
@@ -1,60 +0,0 @@ | |||
1 | What: /sys/class/leds/dell::kbd_backlight/als_setting | ||
2 | Date: December 2014 | ||
3 | KernelVersion: 3.19 | ||
4 | Contact: Gabriele Mazzotta <gabriele.mzt@gmail.com>, | ||
5 | Pali Rohár <pali.rohar@gmail.com> | ||
6 | Description: | ||
7 | This file allows to control the automatic keyboard | ||
8 | illumination mode on some systems that have an ambient | ||
9 | light sensor. Write 1 to this file to enable the auto | ||
10 | mode, 0 to disable it. | ||
11 | |||
12 | What: /sys/class/leds/dell::kbd_backlight/start_triggers | ||
13 | Date: December 2014 | ||
14 | KernelVersion: 3.19 | ||
15 | Contact: Gabriele Mazzotta <gabriele.mzt@gmail.com>, | ||
16 | Pali Rohár <pali.rohar@gmail.com> | ||
17 | Description: | ||
18 | This file allows to control the input triggers that | ||
19 | turn on the keyboard backlight illumination that is | ||
20 | disabled because of inactivity. | ||
21 | Read the file to see the triggers available. The ones | ||
22 | enabled are preceded by '+', those disabled by '-'. | ||
23 | |||
24 | To enable a trigger, write its name preceded by '+' to | ||
25 | this file. To disable a trigger, write its name preceded | ||
26 | by '-' instead. | ||
27 | |||
28 | For example, to enable the keyboard as trigger run: | ||
29 | echo +keyboard > /sys/class/leds/dell::kbd_backlight/start_triggers | ||
30 | To disable it: | ||
31 | echo -keyboard > /sys/class/leds/dell::kbd_backlight/start_triggers | ||
32 | |||
33 | Note that not all the available triggers can be configured. | ||
34 | |||
35 | What: /sys/class/leds/dell::kbd_backlight/stop_timeout | ||
36 | Date: December 2014 | ||
37 | KernelVersion: 3.19 | ||
38 | Contact: Gabriele Mazzotta <gabriele.mzt@gmail.com>, | ||
39 | Pali Rohár <pali.rohar@gmail.com> | ||
40 | Description: | ||
41 | This file allows to specify the interval after which the | ||
42 | keyboard illumination is disabled because of inactivity. | ||
43 | The timeouts are expressed in seconds, minutes, hours and | ||
44 | days, for which the symbols are 's', 'm', 'h' and 'd' | ||
45 | respectively. | ||
46 | |||
47 | To configure the timeout, write to this file a value along | ||
48 | with any the above units. If no unit is specified, the value | ||
49 | is assumed to be expressed in seconds. | ||
50 | |||
51 | For example, to set the timeout to 10 minutes run: | ||
52 | echo 10m > /sys/class/leds/dell::kbd_backlight/stop_timeout | ||
53 | |||
54 | Note that when this file is read, the returned value might be | ||
55 | expressed in a different unit than the one used when the timeout | ||
56 | was set. | ||
57 | |||
58 | Also note that only some timeouts are supported and that | ||
59 | some systems might fall back to a specific timeout in case | ||
60 | an invalid timeout is written to this file. | ||
diff --git a/Documentation/devicetree/bindings/arm/arm-boards b/Documentation/devicetree/bindings/arm/arm-boards index 556c8665fdbf..b78564b2b201 100644 --- a/Documentation/devicetree/bindings/arm/arm-boards +++ b/Documentation/devicetree/bindings/arm/arm-boards | |||
@@ -23,7 +23,7 @@ Required nodes: | |||
23 | range of 0x200 bytes. | 23 | range of 0x200 bytes. |
24 | 24 | ||
25 | - syscon: the root node of the Integrator platforms must have a | 25 | - syscon: the root node of the Integrator platforms must have a |
26 | system controller node pointong to the control registers, | 26 | system controller node pointing to the control registers, |
27 | with the compatible string | 27 | with the compatible string |
28 | "arm,integrator-ap-syscon" | 28 | "arm,integrator-ap-syscon" |
29 | "arm,integrator-cp-syscon" | 29 | "arm,integrator-cp-syscon" |
diff --git a/Documentation/devicetree/bindings/arm/fw-cfg.txt b/Documentation/devicetree/bindings/arm/fw-cfg.txt new file mode 100644 index 000000000000..953fb640d9c4 --- /dev/null +++ b/Documentation/devicetree/bindings/arm/fw-cfg.txt | |||
@@ -0,0 +1,72 @@ | |||
1 | * QEMU Firmware Configuration bindings for ARM | ||
2 | |||
3 | QEMU's arm-softmmu and aarch64-softmmu emulation / virtualization targets | ||
4 | provide the following Firmware Configuration interface on the "virt" machine | ||
5 | type: | ||
6 | |||
7 | - A write-only, 16-bit wide selector (or control) register, | ||
8 | - a read-write, 64-bit wide data register. | ||
9 | |||
10 | QEMU exposes the control and data register to ARM guests as memory mapped | ||
11 | registers; their location is communicated to the guest's UEFI firmware in the | ||
12 | DTB that QEMU places at the bottom of the guest's DRAM. | ||
13 | |||
14 | The guest writes a selector value (a key) to the selector register, and then | ||
15 | can read the corresponding data (produced by QEMU) via the data register. If | ||
16 | the selected entry is writable, the guest can rewrite it through the data | ||
17 | register. | ||
18 | |||
19 | The selector register takes keys in big endian byte order. | ||
20 | |||
21 | The data register allows accesses with 8, 16, 32 and 64-bit width (only at | ||
22 | offset 0 of the register). Accesses larger than a byte are interpreted as | ||
23 | arrays, bundled together only for better performance. The bytes constituting | ||
24 | such a word, in increasing address order, correspond to the bytes that would | ||
25 | have been transferred by byte-wide accesses in chronological order. | ||
26 | |||
27 | The interface allows guest firmware to download various parameters and blobs | ||
28 | that affect how the firmware works and what tables it installs for the guest | ||
29 | OS. For example, boot order of devices, ACPI tables, SMBIOS tables, kernel and | ||
30 | initrd images for direct kernel booting, virtual machine UUID, SMP information, | ||
31 | virtual NUMA topology, and so on. | ||
32 | |||
33 | The authoritative registry of the valid selector values and their meanings is | ||
34 | the QEMU source code; the structure of the data blobs corresponding to the | ||
35 | individual key values is also defined in the QEMU source code. | ||
36 | |||
37 | The presence of the registers can be verified by selecting the "signature" blob | ||
38 | with key 0x0000, and reading four bytes from the data register. The returned | ||
39 | signature is "QEMU". | ||
40 | |||
41 | The outermost protocol (involving the write / read sequences of the control and | ||
42 | data registers) is expected to be versioned, and/or described by feature bits. | ||
43 | The interface revision / feature bitmap can be retrieved with key 0x0001. The | ||
44 | blob to be read from the data register has size 4, and it is to be interpreted | ||
45 | as a uint32_t value in little endian byte order. The current value | ||
46 | (corresponding to the above outer protocol) is zero. | ||
47 | |||
48 | The guest kernel is not expected to use these registers (although it is | ||
49 | certainly allowed to); the device tree bindings are documented here because | ||
50 | this is where device tree bindings reside in general. | ||
51 | |||
52 | Required properties: | ||
53 | |||
54 | - compatible: "qemu,fw-cfg-mmio". | ||
55 | |||
56 | - reg: the MMIO region used by the device. | ||
57 | * Bytes 0x0 to 0x7 cover the data register. | ||
58 | * Bytes 0x8 to 0x9 cover the selector register. | ||
59 | * Further registers may be appended to the region in case of future interface | ||
60 | revisions / feature bits. | ||
61 | |||
62 | Example: | ||
63 | |||
64 | / { | ||
65 | #size-cells = <0x2>; | ||
66 | #address-cells = <0x2>; | ||
67 | |||
68 | fw-cfg@9020000 { | ||
69 | compatible = "qemu,fw-cfg-mmio"; | ||
70 | reg = <0x0 0x9020000 0x0 0xa>; | ||
71 | }; | ||
72 | }; | ||
diff --git a/Documentation/devicetree/bindings/graph.txt b/Documentation/devicetree/bindings/graph.txt index 1a69c078adf2..fcb1c6a4787b 100644 --- a/Documentation/devicetree/bindings/graph.txt +++ b/Documentation/devicetree/bindings/graph.txt | |||
@@ -19,7 +19,7 @@ type of the connections, they just map their existence. Specific properties | |||
19 | may be described by specialized bindings depending on the type of connection. | 19 | may be described by specialized bindings depending on the type of connection. |
20 | 20 | ||
21 | To see how this binding applies to video pipelines, for example, see | 21 | To see how this binding applies to video pipelines, for example, see |
22 | Documentation/device-tree/bindings/media/video-interfaces.txt. | 22 | Documentation/devicetree/bindings/media/video-interfaces.txt. |
23 | Here the ports describe data interfaces, and the links between them are | 23 | Here the ports describe data interfaces, and the links between them are |
24 | the connecting data buses. A single port with multiple connections can | 24 | the connecting data buses. A single port with multiple connections can |
25 | correspond to multiple devices being connected to the same physical bus. | 25 | correspond to multiple devices being connected to the same physical bus. |
diff --git a/Documentation/devicetree/bindings/net/davinci_emac.txt b/Documentation/devicetree/bindings/net/davinci_emac.txt index 032808843f90..24c5cdaba8d2 100644 --- a/Documentation/devicetree/bindings/net/davinci_emac.txt +++ b/Documentation/devicetree/bindings/net/davinci_emac.txt | |||
@@ -4,7 +4,8 @@ This file provides information, what the device node | |||
4 | for the davinci_emac interface contains. | 4 | for the davinci_emac interface contains. |
5 | 5 | ||
6 | Required properties: | 6 | Required properties: |
7 | - compatible: "ti,davinci-dm6467-emac" or "ti,am3517-emac" | 7 | - compatible: "ti,davinci-dm6467-emac", "ti,am3517-emac" or |
8 | "ti,dm816-emac" | ||
8 | - reg: Offset and length of the register set for the device | 9 | - reg: Offset and length of the register set for the device |
9 | - ti,davinci-ctrl-reg-offset: offset to control register | 10 | - ti,davinci-ctrl-reg-offset: offset to control register |
10 | - ti,davinci-ctrl-mod-reg-offset: offset to control module register | 11 | - ti,davinci-ctrl-mod-reg-offset: offset to control module register |
diff --git a/Documentation/devicetree/bindings/vendor-prefixes.txt b/Documentation/devicetree/bindings/vendor-prefixes.txt index b1df0ad1306c..d443279c95dc 100644 --- a/Documentation/devicetree/bindings/vendor-prefixes.txt +++ b/Documentation/devicetree/bindings/vendor-prefixes.txt | |||
@@ -9,7 +9,6 @@ ad Avionic Design GmbH | |||
9 | adapteva Adapteva, Inc. | 9 | adapteva Adapteva, Inc. |
10 | adi Analog Devices, Inc. | 10 | adi Analog Devices, Inc. |
11 | aeroflexgaisler Aeroflex Gaisler AB | 11 | aeroflexgaisler Aeroflex Gaisler AB |
12 | ak Asahi Kasei Corp. | ||
13 | allwinner Allwinner Technology Co., Ltd. | 12 | allwinner Allwinner Technology Co., Ltd. |
14 | altr Altera Corp. | 13 | altr Altera Corp. |
15 | amcc Applied Micro Circuits Corporation (APM, formally AMCC) | 14 | amcc Applied Micro Circuits Corporation (APM, formally AMCC) |
@@ -20,6 +19,7 @@ amstaos AMS-Taos Inc. | |||
20 | apm Applied Micro Circuits Corporation (APM) | 19 | apm Applied Micro Circuits Corporation (APM) |
21 | arm ARM Ltd. | 20 | arm ARM Ltd. |
22 | armadeus ARMadeus Systems SARL | 21 | armadeus ARMadeus Systems SARL |
22 | asahi-kasei Asahi Kasei Corp. | ||
23 | atmel Atmel Corporation | 23 | atmel Atmel Corporation |
24 | auo AU Optronics Corporation | 24 | auo AU Optronics Corporation |
25 | avago Avago Technologies | 25 | avago Avago Technologies |
@@ -127,6 +127,7 @@ pixcir PIXCIR MICROELECTRONICS Co., Ltd | |||
127 | powervr PowerVR (deprecated, use img) | 127 | powervr PowerVR (deprecated, use img) |
128 | qca Qualcomm Atheros, Inc. | 128 | qca Qualcomm Atheros, Inc. |
129 | qcom Qualcomm Technologies, Inc | 129 | qcom Qualcomm Technologies, Inc |
130 | qemu QEMU, a generic and open source machine emulator and virtualizer | ||
130 | qnap QNAP Systems, Inc. | 131 | qnap QNAP Systems, Inc. |
131 | radxa Radxa | 132 | radxa Radxa |
132 | raidsonic RaidSonic Technology GmbH | 133 | raidsonic RaidSonic Technology GmbH |
@@ -168,6 +169,7 @@ usi Universal Scientific Industrial Co., Ltd. | |||
168 | v3 V3 Semiconductor | 169 | v3 V3 Semiconductor |
169 | variscite Variscite Ltd. | 170 | variscite Variscite Ltd. |
170 | via VIA Technologies, Inc. | 171 | via VIA Technologies, Inc. |
172 | virtio Virtual I/O Device Specification, developed by the OASIS consortium | ||
171 | voipac Voipac Technologies s.r.o. | 173 | voipac Voipac Technologies s.r.o. |
172 | winbond Winbond Electronics corp. | 174 | winbond Winbond Electronics corp. |
173 | wlf Wolfson Microelectronics | 175 | wlf Wolfson Microelectronics |
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index cdb815e833b5..2089c051f23f 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
@@ -1277,6 +1277,7 @@ bytes respectively. Such letter suffixes can also be entirely omitted. | |||
1277 | i8042.notimeout [HW] Ignore timeout condition signalled by controller | 1277 | i8042.notimeout [HW] Ignore timeout condition signalled by controller |
1278 | i8042.reset [HW] Reset the controller during init and cleanup | 1278 | i8042.reset [HW] Reset the controller during init and cleanup |
1279 | i8042.unlock [HW] Unlock (ignore) the keylock | 1279 | i8042.unlock [HW] Unlock (ignore) the keylock |
1280 | i8042.kbdreset [HW] Reset device connected to KBD port | ||
1280 | 1281 | ||
1281 | i810= [HW,DRM] | 1282 | i810= [HW,DRM] |
1282 | 1283 | ||
diff --git a/Documentation/thermal/cpu-cooling-api.txt b/Documentation/thermal/cpu-cooling-api.txt index fca24c931ec8..753e47cc2e20 100644 --- a/Documentation/thermal/cpu-cooling-api.txt +++ b/Documentation/thermal/cpu-cooling-api.txt | |||
@@ -3,7 +3,7 @@ CPU cooling APIs How To | |||
3 | 3 | ||
4 | Written by Amit Daniel Kachhap <amit.kachhap@linaro.org> | 4 | Written by Amit Daniel Kachhap <amit.kachhap@linaro.org> |
5 | 5 | ||
6 | Updated: 12 May 2012 | 6 | Updated: 6 Jan 2015 |
7 | 7 | ||
8 | Copyright (c) 2012 Samsung Electronics Co., Ltd(http://www.samsung.com) | 8 | Copyright (c) 2012 Samsung Electronics Co., Ltd(http://www.samsung.com) |
9 | 9 | ||
@@ -25,7 +25,18 @@ the user. The registration APIs returns the cooling device pointer. | |||
25 | 25 | ||
26 | clip_cpus: cpumask of cpus where the frequency constraints will happen. | 26 | clip_cpus: cpumask of cpus where the frequency constraints will happen. |
27 | 27 | ||
28 | 1.1.2 void cpufreq_cooling_unregister(struct thermal_cooling_device *cdev) | 28 | 1.1.2 struct thermal_cooling_device *of_cpufreq_cooling_register( |
29 | struct device_node *np, const struct cpumask *clip_cpus) | ||
30 | |||
31 | This interface function registers the cpufreq cooling device with | ||
32 | the name "thermal-cpufreq-%x" linking it with a device tree node, in | ||
33 | order to bind it via the thermal DT code. This api can support multiple | ||
34 | instances of cpufreq cooling devices. | ||
35 | |||
36 | np: pointer to the cooling device device tree node | ||
37 | clip_cpus: cpumask of cpus where the frequency constraints will happen. | ||
38 | |||
39 | 1.1.3 void cpufreq_cooling_unregister(struct thermal_cooling_device *cdev) | ||
29 | 40 | ||
30 | This interface function unregisters the "thermal-cpufreq-%x" cooling device. | 41 | This interface function unregisters the "thermal-cpufreq-%x" cooling device. |
31 | 42 | ||
diff --git a/MAINTAINERS b/MAINTAINERS index aca34098415d..3c3bf861d78d 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -696,7 +696,7 @@ L: alsa-devel@alsa-project.org (moderated for non-subscribers) | |||
696 | W: http://blackfin.uclinux.org/ | 696 | W: http://blackfin.uclinux.org/ |
697 | S: Supported | 697 | S: Supported |
698 | F: sound/soc/blackfin/* | 698 | F: sound/soc/blackfin/* |
699 | 699 | ||
700 | ANALOG DEVICES INC IIO DRIVERS | 700 | ANALOG DEVICES INC IIO DRIVERS |
701 | M: Lars-Peter Clausen <lars@metafoo.de> | 701 | M: Lars-Peter Clausen <lars@metafoo.de> |
702 | M: Michael Hennerich <Michael.Hennerich@analog.com> | 702 | M: Michael Hennerich <Michael.Hennerich@analog.com> |
@@ -754,13 +754,6 @@ L: linux-media@vger.kernel.org | |||
754 | S: Maintained | 754 | S: Maintained |
755 | F: drivers/media/i2c/aptina-pll.* | 755 | F: drivers/media/i2c/aptina-pll.* |
756 | 756 | ||
757 | ARASAN COMPACT FLASH PATA CONTROLLER | ||
758 | M: Viresh Kumar <viresh.linux@gmail.com> | ||
759 | L: linux-ide@vger.kernel.org | ||
760 | S: Maintained | ||
761 | F: include/linux/pata_arasan_cf_data.h | ||
762 | F: drivers/ata/pata_arasan_cf.c | ||
763 | |||
764 | ARC FRAMEBUFFER DRIVER | 757 | ARC FRAMEBUFFER DRIVER |
765 | M: Jaya Kumar <jayalk@intworks.biz> | 758 | M: Jaya Kumar <jayalk@intworks.biz> |
766 | S: Maintained | 759 | S: Maintained |
@@ -2345,7 +2338,8 @@ CAN NETWORK LAYER | |||
2345 | M: Oliver Hartkopp <socketcan@hartkopp.net> | 2338 | M: Oliver Hartkopp <socketcan@hartkopp.net> |
2346 | L: linux-can@vger.kernel.org | 2339 | L: linux-can@vger.kernel.org |
2347 | W: http://gitorious.org/linux-can | 2340 | W: http://gitorious.org/linux-can |
2348 | T: git git://gitorious.org/linux-can/linux-can-next.git | 2341 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can.git |
2342 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can-next.git | ||
2349 | S: Maintained | 2343 | S: Maintained |
2350 | F: Documentation/networking/can.txt | 2344 | F: Documentation/networking/can.txt |
2351 | F: net/can/ | 2345 | F: net/can/ |
@@ -2360,7 +2354,8 @@ M: Wolfgang Grandegger <wg@grandegger.com> | |||
2360 | M: Marc Kleine-Budde <mkl@pengutronix.de> | 2354 | M: Marc Kleine-Budde <mkl@pengutronix.de> |
2361 | L: linux-can@vger.kernel.org | 2355 | L: linux-can@vger.kernel.org |
2362 | W: http://gitorious.org/linux-can | 2356 | W: http://gitorious.org/linux-can |
2363 | T: git git://gitorious.org/linux-can/linux-can-next.git | 2357 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can.git |
2358 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can-next.git | ||
2364 | S: Maintained | 2359 | S: Maintained |
2365 | F: drivers/net/can/ | 2360 | F: drivers/net/can/ |
2366 | F: include/linux/can/dev.h | 2361 | F: include/linux/can/dev.h |
@@ -3182,7 +3177,7 @@ L: dmaengine@vger.kernel.org | |||
3182 | Q: https://patchwork.kernel.org/project/linux-dmaengine/list/ | 3177 | Q: https://patchwork.kernel.org/project/linux-dmaengine/list/ |
3183 | S: Maintained | 3178 | S: Maintained |
3184 | F: drivers/dma/ | 3179 | F: drivers/dma/ |
3185 | F: include/linux/dma* | 3180 | F: include/linux/dmaengine.h |
3186 | F: Documentation/dmaengine/ | 3181 | F: Documentation/dmaengine/ |
3187 | T: git git://git.infradead.org/users/vkoul/slave-dma.git | 3182 | T: git git://git.infradead.org/users/vkoul/slave-dma.git |
3188 | 3183 | ||
@@ -4754,14 +4749,14 @@ S: Supported | |||
4754 | F: drivers/net/ethernet/ibm/ibmveth.* | 4749 | F: drivers/net/ethernet/ibm/ibmveth.* |
4755 | 4750 | ||
4756 | IBM Power Virtual SCSI Device Drivers | 4751 | IBM Power Virtual SCSI Device Drivers |
4757 | M: Nathan Fontenot <nfont@linux.vnet.ibm.com> | 4752 | M: Tyrel Datwyler <tyreld@linux.vnet.ibm.com> |
4758 | L: linux-scsi@vger.kernel.org | 4753 | L: linux-scsi@vger.kernel.org |
4759 | S: Supported | 4754 | S: Supported |
4760 | F: drivers/scsi/ibmvscsi/ibmvscsi* | 4755 | F: drivers/scsi/ibmvscsi/ibmvscsi* |
4761 | F: drivers/scsi/ibmvscsi/viosrp.h | 4756 | F: drivers/scsi/ibmvscsi/viosrp.h |
4762 | 4757 | ||
4763 | IBM Power Virtual FC Device Drivers | 4758 | IBM Power Virtual FC Device Drivers |
4764 | M: Brian King <brking@linux.vnet.ibm.com> | 4759 | M: Tyrel Datwyler <tyreld@linux.vnet.ibm.com> |
4765 | L: linux-scsi@vger.kernel.org | 4760 | L: linux-scsi@vger.kernel.org |
4766 | S: Supported | 4761 | S: Supported |
4767 | F: drivers/scsi/ibmvscsi/ibmvfc* | 4762 | F: drivers/scsi/ibmvscsi/ibmvfc* |
@@ -4929,7 +4924,6 @@ F: include/uapi/linux/inotify.h | |||
4929 | 4924 | ||
4930 | INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN) DRIVERS | 4925 | INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN) DRIVERS |
4931 | M: Dmitry Torokhov <dmitry.torokhov@gmail.com> | 4926 | M: Dmitry Torokhov <dmitry.torokhov@gmail.com> |
4932 | M: Dmitry Torokhov <dtor@mail.ru> | ||
4933 | L: linux-input@vger.kernel.org | 4927 | L: linux-input@vger.kernel.org |
4934 | Q: http://patchwork.kernel.org/project/linux-input/list/ | 4928 | Q: http://patchwork.kernel.org/project/linux-input/list/ |
4935 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git | 4929 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git |
@@ -4951,7 +4945,6 @@ K: \b(ABS|SYN)_MT_ | |||
4951 | INTEL C600 SERIES SAS CONTROLLER DRIVER | 4945 | INTEL C600 SERIES SAS CONTROLLER DRIVER |
4952 | M: Intel SCU Linux support <intel-linux-scu@intel.com> | 4946 | M: Intel SCU Linux support <intel-linux-scu@intel.com> |
4953 | M: Artur Paszkiewicz <artur.paszkiewicz@intel.com> | 4947 | M: Artur Paszkiewicz <artur.paszkiewicz@intel.com> |
4954 | M: Dave Jiang <dave.jiang@intel.com> | ||
4955 | L: linux-scsi@vger.kernel.org | 4948 | L: linux-scsi@vger.kernel.org |
4956 | T: git git://git.code.sf.net/p/intel-sas/isci | 4949 | T: git git://git.code.sf.net/p/intel-sas/isci |
4957 | S: Supported | 4950 | S: Supported |
@@ -5702,6 +5695,49 @@ F: drivers/lguest/ | |||
5702 | F: include/linux/lguest*.h | 5695 | F: include/linux/lguest*.h |
5703 | F: tools/lguest/ | 5696 | F: tools/lguest/ |
5704 | 5697 | ||
5698 | LIBATA SUBSYSTEM (Serial and Parallel ATA drivers) | ||
5699 | M: Tejun Heo <tj@kernel.org> | ||
5700 | L: linux-ide@vger.kernel.org | ||
5701 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git | ||
5702 | S: Maintained | ||
5703 | F: drivers/ata/ | ||
5704 | F: include/linux/ata.h | ||
5705 | F: include/linux/libata.h | ||
5706 | |||
5707 | LIBATA PATA ARASAN COMPACT FLASH CONTROLLER | ||
5708 | M: Viresh Kumar <viresh.linux@gmail.com> | ||
5709 | L: linux-ide@vger.kernel.org | ||
5710 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git | ||
5711 | S: Maintained | ||
5712 | F: include/linux/pata_arasan_cf_data.h | ||
5713 | F: drivers/ata/pata_arasan_cf.c | ||
5714 | |||
5715 | LIBATA PATA DRIVERS | ||
5716 | M: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com> | ||
5717 | M: Tejun Heo <tj@kernel.org> | ||
5718 | L: linux-ide@vger.kernel.org | ||
5719 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git | ||
5720 | S: Maintained | ||
5721 | F: drivers/ata/pata_*.c | ||
5722 | F: drivers/ata/ata_generic.c | ||
5723 | |||
5724 | LIBATA SATA AHCI PLATFORM devices support | ||
5725 | M: Hans de Goede <hdegoede@redhat.com> | ||
5726 | M: Tejun Heo <tj@kernel.org> | ||
5727 | L: linux-ide@vger.kernel.org | ||
5728 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git | ||
5729 | S: Maintained | ||
5730 | F: drivers/ata/ahci_platform.c | ||
5731 | F: drivers/ata/libahci_platform.c | ||
5732 | F: include/linux/ahci_platform.h | ||
5733 | |||
5734 | LIBATA SATA PROMISE TX2/TX4 CONTROLLER DRIVER | ||
5735 | M: Mikael Pettersson <mikpelinux@gmail.com> | ||
5736 | L: linux-ide@vger.kernel.org | ||
5737 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git | ||
5738 | S: Maintained | ||
5739 | F: drivers/ata/sata_promise.* | ||
5740 | |||
5705 | LIBLOCKDEP | 5741 | LIBLOCKDEP |
5706 | M: Sasha Levin <sasha.levin@oracle.com> | 5742 | M: Sasha Levin <sasha.levin@oracle.com> |
5707 | S: Maintained | 5743 | S: Maintained |
@@ -6987,14 +7023,12 @@ OPEN FIRMWARE AND FLATTENED DEVICE TREE | |||
6987 | M: Grant Likely <grant.likely@linaro.org> | 7023 | M: Grant Likely <grant.likely@linaro.org> |
6988 | M: Rob Herring <robh+dt@kernel.org> | 7024 | M: Rob Herring <robh+dt@kernel.org> |
6989 | L: devicetree@vger.kernel.org | 7025 | L: devicetree@vger.kernel.org |
6990 | W: http://fdt.secretlab.ca | 7026 | W: http://www.devicetree.org/ |
6991 | T: git git://git.secretlab.ca/git/linux-2.6.git | 7027 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/glikely/linux.git |
6992 | S: Maintained | 7028 | S: Maintained |
6993 | F: drivers/of/ | 7029 | F: drivers/of/ |
6994 | F: include/linux/of*.h | 7030 | F: include/linux/of*.h |
6995 | F: scripts/dtc/ | 7031 | F: scripts/dtc/ |
6996 | K: of_get_property | ||
6997 | K: of_match_table | ||
6998 | 7032 | ||
6999 | OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS | 7033 | OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS |
7000 | M: Rob Herring <robh+dt@kernel.org> | 7034 | M: Rob Herring <robh+dt@kernel.org> |
@@ -7240,7 +7274,7 @@ S: Maintained | |||
7240 | F: drivers/pci/host/*layerscape* | 7274 | F: drivers/pci/host/*layerscape* |
7241 | 7275 | ||
7242 | PCI DRIVER FOR IMX6 | 7276 | PCI DRIVER FOR IMX6 |
7243 | M: Richard Zhu <r65037@freescale.com> | 7277 | M: Richard Zhu <Richard.Zhu@freescale.com> |
7244 | M: Lucas Stach <l.stach@pengutronix.de> | 7278 | M: Lucas Stach <l.stach@pengutronix.de> |
7245 | L: linux-pci@vger.kernel.org | 7279 | L: linux-pci@vger.kernel.org |
7246 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 7280 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
@@ -7410,6 +7444,7 @@ F: drivers/crypto/picoxcell* | |||
7410 | PIN CONTROL SUBSYSTEM | 7444 | PIN CONTROL SUBSYSTEM |
7411 | M: Linus Walleij <linus.walleij@linaro.org> | 7445 | M: Linus Walleij <linus.walleij@linaro.org> |
7412 | L: linux-gpio@vger.kernel.org | 7446 | L: linux-gpio@vger.kernel.org |
7447 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl.git | ||
7413 | S: Maintained | 7448 | S: Maintained |
7414 | F: drivers/pinctrl/ | 7449 | F: drivers/pinctrl/ |
7415 | F: include/linux/pinctrl/ | 7450 | F: include/linux/pinctrl/ |
@@ -7577,12 +7612,6 @@ W: http://wireless.kernel.org/en/users/Drivers/p54 | |||
7577 | S: Obsolete | 7612 | S: Obsolete |
7578 | F: drivers/net/wireless/prism54/ | 7613 | F: drivers/net/wireless/prism54/ |
7579 | 7614 | ||
7580 | PROMISE SATA TX2/TX4 CONTROLLER LIBATA DRIVER | ||
7581 | M: Mikael Pettersson <mikpelinux@gmail.com> | ||
7582 | L: linux-ide@vger.kernel.org | ||
7583 | S: Maintained | ||
7584 | F: drivers/ata/sata_promise.* | ||
7585 | |||
7586 | PS3 NETWORK SUPPORT | 7615 | PS3 NETWORK SUPPORT |
7587 | M: Geoff Levand <geoff@infradead.org> | 7616 | M: Geoff Levand <geoff@infradead.org> |
7588 | L: netdev@vger.kernel.org | 7617 | L: netdev@vger.kernel.org |
@@ -7748,8 +7777,7 @@ F: Documentation/scsi/LICENSE.qla2xxx | |||
7748 | F: drivers/scsi/qla2xxx/ | 7777 | F: drivers/scsi/qla2xxx/ |
7749 | 7778 | ||
7750 | QLOGIC QLA4XXX iSCSI DRIVER | 7779 | QLOGIC QLA4XXX iSCSI DRIVER |
7751 | M: Vikas Chaudhary <vikas.chaudhary@qlogic.com> | 7780 | M: QLogic-Storage-Upstream@qlogic.com |
7752 | M: iscsi-driver@qlogic.com | ||
7753 | L: linux-scsi@vger.kernel.org | 7781 | L: linux-scsi@vger.kernel.org |
7754 | S: Supported | 7782 | S: Supported |
7755 | F: Documentation/scsi/LICENSE.qla4xxx | 7783 | F: Documentation/scsi/LICENSE.qla4xxx |
@@ -8564,25 +8592,6 @@ S: Maintained | |||
8564 | F: drivers/misc/phantom.c | 8592 | F: drivers/misc/phantom.c |
8565 | F: include/uapi/linux/phantom.h | 8593 | F: include/uapi/linux/phantom.h |
8566 | 8594 | ||
8567 | SERIAL ATA (SATA) SUBSYSTEM | ||
8568 | M: Tejun Heo <tj@kernel.org> | ||
8569 | L: linux-ide@vger.kernel.org | ||
8570 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git | ||
8571 | S: Supported | ||
8572 | F: drivers/ata/ | ||
8573 | F: include/linux/ata.h | ||
8574 | F: include/linux/libata.h | ||
8575 | |||
8576 | SERIAL ATA AHCI PLATFORM devices support | ||
8577 | M: Hans de Goede <hdegoede@redhat.com> | ||
8578 | M: Tejun Heo <tj@kernel.org> | ||
8579 | L: linux-ide@vger.kernel.org | ||
8580 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git | ||
8581 | S: Supported | ||
8582 | F: drivers/ata/ahci_platform.c | ||
8583 | F: drivers/ata/libahci_platform.c | ||
8584 | F: include/linux/ahci_platform.h | ||
8585 | |||
8586 | SERVER ENGINES 10Gbps iSCSI - BladeEngine 2 DRIVER | 8595 | SERVER ENGINES 10Gbps iSCSI - BladeEngine 2 DRIVER |
8587 | M: Jayamohan Kallickal <jayamohan.kallickal@emulex.com> | 8596 | M: Jayamohan Kallickal <jayamohan.kallickal@emulex.com> |
8588 | L: linux-scsi@vger.kernel.org | 8597 | L: linux-scsi@vger.kernel.org |
@@ -9551,7 +9560,8 @@ F: drivers/platform/x86/thinkpad_acpi.c | |||
9551 | TI BANDGAP AND THERMAL DRIVER | 9560 | TI BANDGAP AND THERMAL DRIVER |
9552 | M: Eduardo Valentin <edubezval@gmail.com> | 9561 | M: Eduardo Valentin <edubezval@gmail.com> |
9553 | L: linux-pm@vger.kernel.org | 9562 | L: linux-pm@vger.kernel.org |
9554 | S: Supported | 9563 | L: linux-omap@vger.kernel.org |
9564 | S: Maintained | ||
9555 | F: drivers/thermal/ti-soc-thermal/ | 9565 | F: drivers/thermal/ti-soc-thermal/ |
9556 | 9566 | ||
9557 | TI CLOCK DRIVER | 9567 | TI CLOCK DRIVER |
@@ -1,7 +1,7 @@ | |||
1 | VERSION = 3 | 1 | VERSION = 3 |
2 | PATCHLEVEL = 19 | 2 | PATCHLEVEL = 19 |
3 | SUBLEVEL = 0 | 3 | SUBLEVEL = 0 |
4 | EXTRAVERSION = -rc4 | 4 | EXTRAVERSION = -rc6 |
5 | NAME = Diseased Newt | 5 | NAME = Diseased Newt |
6 | 6 | ||
7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
diff --git a/arch/alpha/kernel/pci.c b/arch/alpha/kernel/pci.c index 076c35cd6cde..98a1525fa164 100644 --- a/arch/alpha/kernel/pci.c +++ b/arch/alpha/kernel/pci.c | |||
@@ -285,8 +285,12 @@ pcibios_claim_one_bus(struct pci_bus *b) | |||
285 | if (r->parent || !r->start || !r->flags) | 285 | if (r->parent || !r->start || !r->flags) |
286 | continue; | 286 | continue; |
287 | if (pci_has_flag(PCI_PROBE_ONLY) || | 287 | if (pci_has_flag(PCI_PROBE_ONLY) || |
288 | (r->flags & IORESOURCE_PCI_FIXED)) | 288 | (r->flags & IORESOURCE_PCI_FIXED)) { |
289 | pci_claim_resource(dev, i); | 289 | if (pci_claim_resource(dev, i) == 0) |
290 | continue; | ||
291 | |||
292 | pci_claim_bridge_resource(dev, i); | ||
293 | } | ||
290 | } | 294 | } |
291 | } | 295 | } |
292 | 296 | ||
diff --git a/arch/arm/boot/dts/at91sam9263.dtsi b/arch/arm/boot/dts/at91sam9263.dtsi index 1467750e3377..e8c6c600a5b6 100644 --- a/arch/arm/boot/dts/at91sam9263.dtsi +++ b/arch/arm/boot/dts/at91sam9263.dtsi | |||
@@ -953,6 +953,8 @@ | |||
953 | interrupts = <26 IRQ_TYPE_LEVEL_HIGH 3>; | 953 | interrupts = <26 IRQ_TYPE_LEVEL_HIGH 3>; |
954 | pinctrl-names = "default"; | 954 | pinctrl-names = "default"; |
955 | pinctrl-0 = <&pinctrl_fb>; | 955 | pinctrl-0 = <&pinctrl_fb>; |
956 | clocks = <&lcd_clk>, <&lcd_clk>; | ||
957 | clock-names = "lcdc_clk", "hclk"; | ||
956 | status = "disabled"; | 958 | status = "disabled"; |
957 | }; | 959 | }; |
958 | 960 | ||
diff --git a/arch/arm/boot/dts/berlin2q-marvell-dmp.dts b/arch/arm/boot/dts/berlin2q-marvell-dmp.dts index 28e7e2060c33..a98ac1bd8f65 100644 --- a/arch/arm/boot/dts/berlin2q-marvell-dmp.dts +++ b/arch/arm/boot/dts/berlin2q-marvell-dmp.dts | |||
@@ -65,6 +65,8 @@ | |||
65 | }; | 65 | }; |
66 | 66 | ||
67 | &sdhci2 { | 67 | &sdhci2 { |
68 | broken-cd; | ||
69 | bus-width = <8>; | ||
68 | non-removable; | 70 | non-removable; |
69 | status = "okay"; | 71 | status = "okay"; |
70 | }; | 72 | }; |
diff --git a/arch/arm/boot/dts/berlin2q.dtsi b/arch/arm/boot/dts/berlin2q.dtsi index 35253c947a7c..e2f61f27944e 100644 --- a/arch/arm/boot/dts/berlin2q.dtsi +++ b/arch/arm/boot/dts/berlin2q.dtsi | |||
@@ -83,7 +83,8 @@ | |||
83 | compatible = "mrvl,pxav3-mmc"; | 83 | compatible = "mrvl,pxav3-mmc"; |
84 | reg = <0xab1000 0x200>; | 84 | reg = <0xab1000 0x200>; |
85 | interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>; | 85 | interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>; |
86 | clocks = <&chip CLKID_SDIO1XIN>; | 86 | clocks = <&chip CLKID_NFC_ECC>, <&chip CLKID_NFC>; |
87 | clock-names = "io", "core"; | ||
87 | status = "disabled"; | 88 | status = "disabled"; |
88 | }; | 89 | }; |
89 | 90 | ||
@@ -348,36 +349,6 @@ | |||
348 | interrupt-parent = <&gic>; | 349 | interrupt-parent = <&gic>; |
349 | interrupts = <GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>; | 350 | interrupts = <GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>; |
350 | }; | 351 | }; |
351 | |||
352 | gpio4: gpio@5000 { | ||
353 | compatible = "snps,dw-apb-gpio"; | ||
354 | reg = <0x5000 0x400>; | ||
355 | #address-cells = <1>; | ||
356 | #size-cells = <0>; | ||
357 | |||
358 | porte: gpio-port@4 { | ||
359 | compatible = "snps,dw-apb-gpio-port"; | ||
360 | gpio-controller; | ||
361 | #gpio-cells = <2>; | ||
362 | snps,nr-gpios = <32>; | ||
363 | reg = <0>; | ||
364 | }; | ||
365 | }; | ||
366 | |||
367 | gpio5: gpio@c000 { | ||
368 | compatible = "snps,dw-apb-gpio"; | ||
369 | reg = <0xc000 0x400>; | ||
370 | #address-cells = <1>; | ||
371 | #size-cells = <0>; | ||
372 | |||
373 | portf: gpio-port@5 { | ||
374 | compatible = "snps,dw-apb-gpio-port"; | ||
375 | gpio-controller; | ||
376 | #gpio-cells = <2>; | ||
377 | snps,nr-gpios = <32>; | ||
378 | reg = <0>; | ||
379 | }; | ||
380 | }; | ||
381 | }; | 352 | }; |
382 | 353 | ||
383 | chip: chip-control@ea0000 { | 354 | chip: chip-control@ea0000 { |
@@ -466,6 +437,21 @@ | |||
466 | ranges = <0 0xfc0000 0x10000>; | 437 | ranges = <0 0xfc0000 0x10000>; |
467 | interrupt-parent = <&sic>; | 438 | interrupt-parent = <&sic>; |
468 | 439 | ||
440 | sm_gpio1: gpio@5000 { | ||
441 | compatible = "snps,dw-apb-gpio"; | ||
442 | reg = <0x5000 0x400>; | ||
443 | #address-cells = <1>; | ||
444 | #size-cells = <0>; | ||
445 | |||
446 | portf: gpio-port@5 { | ||
447 | compatible = "snps,dw-apb-gpio-port"; | ||
448 | gpio-controller; | ||
449 | #gpio-cells = <2>; | ||
450 | snps,nr-gpios = <32>; | ||
451 | reg = <0>; | ||
452 | }; | ||
453 | }; | ||
454 | |||
469 | i2c2: i2c@7000 { | 455 | i2c2: i2c@7000 { |
470 | compatible = "snps,designware-i2c"; | 456 | compatible = "snps,designware-i2c"; |
471 | #address-cells = <1>; | 457 | #address-cells = <1>; |
@@ -516,6 +502,21 @@ | |||
516 | status = "disabled"; | 502 | status = "disabled"; |
517 | }; | 503 | }; |
518 | 504 | ||
505 | sm_gpio0: gpio@c000 { | ||
506 | compatible = "snps,dw-apb-gpio"; | ||
507 | reg = <0xc000 0x400>; | ||
508 | #address-cells = <1>; | ||
509 | #size-cells = <0>; | ||
510 | |||
511 | porte: gpio-port@4 { | ||
512 | compatible = "snps,dw-apb-gpio-port"; | ||
513 | gpio-controller; | ||
514 | #gpio-cells = <2>; | ||
515 | snps,nr-gpios = <32>; | ||
516 | reg = <0>; | ||
517 | }; | ||
518 | }; | ||
519 | |||
519 | sysctrl: pin-controller@d000 { | 520 | sysctrl: pin-controller@d000 { |
520 | compatible = "marvell,berlin2q-system-ctrl"; | 521 | compatible = "marvell,berlin2q-system-ctrl"; |
521 | reg = <0xd000 0x100>; | 522 | reg = <0xd000 0x100>; |
diff --git a/arch/arm/boot/dts/dra7-evm.dts b/arch/arm/boot/dts/dra7-evm.dts index 10b725c7bfc0..ad4118f7e1a6 100644 --- a/arch/arm/boot/dts/dra7-evm.dts +++ b/arch/arm/boot/dts/dra7-evm.dts | |||
@@ -499,23 +499,23 @@ | |||
499 | }; | 499 | }; |
500 | partition@5 { | 500 | partition@5 { |
501 | label = "QSPI.u-boot-spl-os"; | 501 | label = "QSPI.u-boot-spl-os"; |
502 | reg = <0x00140000 0x00010000>; | 502 | reg = <0x00140000 0x00080000>; |
503 | }; | 503 | }; |
504 | partition@6 { | 504 | partition@6 { |
505 | label = "QSPI.u-boot-env"; | 505 | label = "QSPI.u-boot-env"; |
506 | reg = <0x00150000 0x00010000>; | 506 | reg = <0x001c0000 0x00010000>; |
507 | }; | 507 | }; |
508 | partition@7 { | 508 | partition@7 { |
509 | label = "QSPI.u-boot-env.backup1"; | 509 | label = "QSPI.u-boot-env.backup1"; |
510 | reg = <0x00160000 0x0010000>; | 510 | reg = <0x001d0000 0x0010000>; |
511 | }; | 511 | }; |
512 | partition@8 { | 512 | partition@8 { |
513 | label = "QSPI.kernel"; | 513 | label = "QSPI.kernel"; |
514 | reg = <0x00170000 0x0800000>; | 514 | reg = <0x001e0000 0x0800000>; |
515 | }; | 515 | }; |
516 | partition@9 { | 516 | partition@9 { |
517 | label = "QSPI.file-system"; | 517 | label = "QSPI.file-system"; |
518 | reg = <0x00970000 0x01690000>; | 518 | reg = <0x009e0000 0x01620000>; |
519 | }; | 519 | }; |
520 | }; | 520 | }; |
521 | }; | 521 | }; |
diff --git a/arch/arm/boot/dts/dra7.dtsi b/arch/arm/boot/dts/dra7.dtsi index 22771bc1643a..63f8b007bdc5 100644 --- a/arch/arm/boot/dts/dra7.dtsi +++ b/arch/arm/boot/dts/dra7.dtsi | |||
@@ -1257,6 +1257,8 @@ | |||
1257 | tx-fifo-resize; | 1257 | tx-fifo-resize; |
1258 | maximum-speed = "super-speed"; | 1258 | maximum-speed = "super-speed"; |
1259 | dr_mode = "otg"; | 1259 | dr_mode = "otg"; |
1260 | snps,dis_u3_susphy_quirk; | ||
1261 | snps,dis_u2_susphy_quirk; | ||
1260 | }; | 1262 | }; |
1261 | }; | 1263 | }; |
1262 | 1264 | ||
@@ -1278,6 +1280,8 @@ | |||
1278 | tx-fifo-resize; | 1280 | tx-fifo-resize; |
1279 | maximum-speed = "high-speed"; | 1281 | maximum-speed = "high-speed"; |
1280 | dr_mode = "otg"; | 1282 | dr_mode = "otg"; |
1283 | snps,dis_u3_susphy_quirk; | ||
1284 | snps,dis_u2_susphy_quirk; | ||
1281 | }; | 1285 | }; |
1282 | }; | 1286 | }; |
1283 | 1287 | ||
@@ -1299,6 +1303,8 @@ | |||
1299 | tx-fifo-resize; | 1303 | tx-fifo-resize; |
1300 | maximum-speed = "high-speed"; | 1304 | maximum-speed = "high-speed"; |
1301 | dr_mode = "otg"; | 1305 | dr_mode = "otg"; |
1306 | snps,dis_u3_susphy_quirk; | ||
1307 | snps,dis_u2_susphy_quirk; | ||
1302 | }; | 1308 | }; |
1303 | }; | 1309 | }; |
1304 | 1310 | ||
diff --git a/arch/arm/boot/dts/exynos5250.dtsi b/arch/arm/boot/dts/exynos5250.dtsi index 0a229fcd7acf..d75c89d7666a 100644 --- a/arch/arm/boot/dts/exynos5250.dtsi +++ b/arch/arm/boot/dts/exynos5250.dtsi | |||
@@ -736,7 +736,7 @@ | |||
736 | 736 | ||
737 | dp_phy: video-phy@10040720 { | 737 | dp_phy: video-phy@10040720 { |
738 | compatible = "samsung,exynos5250-dp-video-phy"; | 738 | compatible = "samsung,exynos5250-dp-video-phy"; |
739 | reg = <0x10040720 4>; | 739 | samsung,pmu-syscon = <&pmu_system_controller>; |
740 | #phy-cells = <0>; | 740 | #phy-cells = <0>; |
741 | }; | 741 | }; |
742 | 742 | ||
diff --git a/arch/arm/boot/dts/exynos5420-arndale-octa.dts b/arch/arm/boot/dts/exynos5420-arndale-octa.dts index aa7a7d727a7e..db2c1c4cd900 100644 --- a/arch/arm/boot/dts/exynos5420-arndale-octa.dts +++ b/arch/arm/boot/dts/exynos5420-arndale-octa.dts | |||
@@ -372,3 +372,7 @@ | |||
372 | &usbdrd_dwc3_1 { | 372 | &usbdrd_dwc3_1 { |
373 | dr_mode = "host"; | 373 | dr_mode = "host"; |
374 | }; | 374 | }; |
375 | |||
376 | &cci { | ||
377 | status = "disabled"; | ||
378 | }; | ||
diff --git a/arch/arm/boot/dts/exynos5420.dtsi b/arch/arm/boot/dts/exynos5420.dtsi index 517e50f6760b..6d38f8bfd0e6 100644 --- a/arch/arm/boot/dts/exynos5420.dtsi +++ b/arch/arm/boot/dts/exynos5420.dtsi | |||
@@ -120,7 +120,7 @@ | |||
120 | }; | 120 | }; |
121 | }; | 121 | }; |
122 | 122 | ||
123 | cci@10d20000 { | 123 | cci: cci@10d20000 { |
124 | compatible = "arm,cci-400"; | 124 | compatible = "arm,cci-400"; |
125 | #address-cells = <1>; | 125 | #address-cells = <1>; |
126 | #size-cells = <1>; | 126 | #size-cells = <1>; |
@@ -503,8 +503,8 @@ | |||
503 | }; | 503 | }; |
504 | 504 | ||
505 | dp_phy: video-phy@10040728 { | 505 | dp_phy: video-phy@10040728 { |
506 | compatible = "samsung,exynos5250-dp-video-phy"; | 506 | compatible = "samsung,exynos5420-dp-video-phy"; |
507 | reg = <0x10040728 4>; | 507 | samsung,pmu-syscon = <&pmu_system_controller>; |
508 | #phy-cells = <0>; | 508 | #phy-cells = <0>; |
509 | }; | 509 | }; |
510 | 510 | ||
diff --git a/arch/arm/boot/dts/imx25.dtsi b/arch/arm/boot/dts/imx25.dtsi index 58d3c3cf2923..e4d3aecc4ed2 100644 --- a/arch/arm/boot/dts/imx25.dtsi +++ b/arch/arm/boot/dts/imx25.dtsi | |||
@@ -162,7 +162,7 @@ | |||
162 | #size-cells = <0>; | 162 | #size-cells = <0>; |
163 | compatible = "fsl,imx25-cspi", "fsl,imx35-cspi"; | 163 | compatible = "fsl,imx25-cspi", "fsl,imx35-cspi"; |
164 | reg = <0x43fa4000 0x4000>; | 164 | reg = <0x43fa4000 0x4000>; |
165 | clocks = <&clks 62>, <&clks 62>; | 165 | clocks = <&clks 78>, <&clks 78>; |
166 | clock-names = "ipg", "per"; | 166 | clock-names = "ipg", "per"; |
167 | interrupts = <14>; | 167 | interrupts = <14>; |
168 | status = "disabled"; | 168 | status = "disabled"; |
@@ -369,7 +369,7 @@ | |||
369 | compatible = "fsl,imx25-pwm", "fsl,imx27-pwm"; | 369 | compatible = "fsl,imx25-pwm", "fsl,imx27-pwm"; |
370 | #pwm-cells = <2>; | 370 | #pwm-cells = <2>; |
371 | reg = <0x53fa0000 0x4000>; | 371 | reg = <0x53fa0000 0x4000>; |
372 | clocks = <&clks 106>, <&clks 36>; | 372 | clocks = <&clks 106>, <&clks 52>; |
373 | clock-names = "ipg", "per"; | 373 | clock-names = "ipg", "per"; |
374 | interrupts = <36>; | 374 | interrupts = <36>; |
375 | }; | 375 | }; |
@@ -388,7 +388,7 @@ | |||
388 | compatible = "fsl,imx25-pwm", "fsl,imx27-pwm"; | 388 | compatible = "fsl,imx25-pwm", "fsl,imx27-pwm"; |
389 | #pwm-cells = <2>; | 389 | #pwm-cells = <2>; |
390 | reg = <0x53fa8000 0x4000>; | 390 | reg = <0x53fa8000 0x4000>; |
391 | clocks = <&clks 107>, <&clks 36>; | 391 | clocks = <&clks 107>, <&clks 52>; |
392 | clock-names = "ipg", "per"; | 392 | clock-names = "ipg", "per"; |
393 | interrupts = <41>; | 393 | interrupts = <41>; |
394 | }; | 394 | }; |
@@ -429,7 +429,7 @@ | |||
429 | pwm4: pwm@53fc8000 { | 429 | pwm4: pwm@53fc8000 { |
430 | compatible = "fsl,imx25-pwm", "fsl,imx27-pwm"; | 430 | compatible = "fsl,imx25-pwm", "fsl,imx27-pwm"; |
431 | reg = <0x53fc8000 0x4000>; | 431 | reg = <0x53fc8000 0x4000>; |
432 | clocks = <&clks 108>, <&clks 36>; | 432 | clocks = <&clks 108>, <&clks 52>; |
433 | clock-names = "ipg", "per"; | 433 | clock-names = "ipg", "per"; |
434 | interrupts = <42>; | 434 | interrupts = <42>; |
435 | }; | 435 | }; |
@@ -476,7 +476,7 @@ | |||
476 | compatible = "fsl,imx25-pwm", "fsl,imx27-pwm"; | 476 | compatible = "fsl,imx25-pwm", "fsl,imx27-pwm"; |
477 | #pwm-cells = <2>; | 477 | #pwm-cells = <2>; |
478 | reg = <0x53fe0000 0x4000>; | 478 | reg = <0x53fe0000 0x4000>; |
479 | clocks = <&clks 105>, <&clks 36>; | 479 | clocks = <&clks 105>, <&clks 52>; |
480 | clock-names = "ipg", "per"; | 480 | clock-names = "ipg", "per"; |
481 | interrupts = <26>; | 481 | interrupts = <26>; |
482 | }; | 482 | }; |
diff --git a/arch/arm/boot/dts/imx51-babbage.dts b/arch/arm/boot/dts/imx51-babbage.dts index 56569cecaa78..649befeb2cf9 100644 --- a/arch/arm/boot/dts/imx51-babbage.dts +++ b/arch/arm/boot/dts/imx51-babbage.dts | |||
@@ -127,24 +127,12 @@ | |||
127 | #address-cells = <1>; | 127 | #address-cells = <1>; |
128 | #size-cells = <0>; | 128 | #size-cells = <0>; |
129 | 129 | ||
130 | reg_usbh1_vbus: regulator@0 { | 130 | reg_hub_reset: regulator@0 { |
131 | compatible = "regulator-fixed"; | ||
132 | pinctrl-names = "default"; | ||
133 | pinctrl-0 = <&pinctrl_usbh1reg>; | ||
134 | reg = <0>; | ||
135 | regulator-name = "usbh1_vbus"; | ||
136 | regulator-min-microvolt = <5000000>; | ||
137 | regulator-max-microvolt = <5000000>; | ||
138 | gpio = <&gpio2 5 GPIO_ACTIVE_HIGH>; | ||
139 | enable-active-high; | ||
140 | }; | ||
141 | |||
142 | reg_usbotg_vbus: regulator@1 { | ||
143 | compatible = "regulator-fixed"; | 131 | compatible = "regulator-fixed"; |
144 | pinctrl-names = "default"; | 132 | pinctrl-names = "default"; |
145 | pinctrl-0 = <&pinctrl_usbotgreg>; | 133 | pinctrl-0 = <&pinctrl_usbotgreg>; |
146 | reg = <1>; | 134 | reg = <0>; |
147 | regulator-name = "usbotg_vbus"; | 135 | regulator-name = "hub_reset"; |
148 | regulator-min-microvolt = <5000000>; | 136 | regulator-min-microvolt = <5000000>; |
149 | regulator-max-microvolt = <5000000>; | 137 | regulator-max-microvolt = <5000000>; |
150 | gpio = <&gpio1 7 GPIO_ACTIVE_HIGH>; | 138 | gpio = <&gpio1 7 GPIO_ACTIVE_HIGH>; |
@@ -176,6 +164,7 @@ | |||
176 | reg = <0>; | 164 | reg = <0>; |
177 | clocks = <&clks IMX5_CLK_DUMMY>; | 165 | clocks = <&clks IMX5_CLK_DUMMY>; |
178 | clock-names = "main_clk"; | 166 | clock-names = "main_clk"; |
167 | reset-gpios = <&gpio2 5 GPIO_ACTIVE_LOW>; | ||
179 | }; | 168 | }; |
180 | }; | 169 | }; |
181 | }; | 170 | }; |
@@ -419,7 +408,7 @@ | |||
419 | &usbh1 { | 408 | &usbh1 { |
420 | pinctrl-names = "default"; | 409 | pinctrl-names = "default"; |
421 | pinctrl-0 = <&pinctrl_usbh1>; | 410 | pinctrl-0 = <&pinctrl_usbh1>; |
422 | vbus-supply = <®_usbh1_vbus>; | 411 | vbus-supply = <®_hub_reset>; |
423 | fsl,usbphy = <&usbh1phy>; | 412 | fsl,usbphy = <&usbh1phy>; |
424 | phy_type = "ulpi"; | 413 | phy_type = "ulpi"; |
425 | status = "okay"; | 414 | status = "okay"; |
@@ -429,7 +418,6 @@ | |||
429 | dr_mode = "otg"; | 418 | dr_mode = "otg"; |
430 | disable-over-current; | 419 | disable-over-current; |
431 | phy_type = "utmi_wide"; | 420 | phy_type = "utmi_wide"; |
432 | vbus-supply = <®_usbotg_vbus>; | ||
433 | status = "okay"; | 421 | status = "okay"; |
434 | }; | 422 | }; |
435 | 423 | ||
diff --git a/arch/arm/boot/dts/imx6qdl.dtsi b/arch/arm/boot/dts/imx6qdl.dtsi index 4fc03b7f1cee..2109d0763c1b 100644 --- a/arch/arm/boot/dts/imx6qdl.dtsi +++ b/arch/arm/boot/dts/imx6qdl.dtsi | |||
@@ -335,8 +335,8 @@ | |||
335 | vpu: vpu@02040000 { | 335 | vpu: vpu@02040000 { |
336 | compatible = "cnm,coda960"; | 336 | compatible = "cnm,coda960"; |
337 | reg = <0x02040000 0x3c000>; | 337 | reg = <0x02040000 0x3c000>; |
338 | interrupts = <0 3 IRQ_TYPE_LEVEL_HIGH>, | 338 | interrupts = <0 12 IRQ_TYPE_LEVEL_HIGH>, |
339 | <0 12 IRQ_TYPE_LEVEL_HIGH>; | 339 | <0 3 IRQ_TYPE_LEVEL_HIGH>; |
340 | interrupt-names = "bit", "jpeg"; | 340 | interrupt-names = "bit", "jpeg"; |
341 | clocks = <&clks IMX6QDL_CLK_VPU_AXI>, | 341 | clocks = <&clks IMX6QDL_CLK_VPU_AXI>, |
342 | <&clks IMX6QDL_CLK_MMDC_CH0_AXI>, | 342 | <&clks IMX6QDL_CLK_MMDC_CH0_AXI>, |
diff --git a/arch/arm/boot/dts/imx6sx-sdb.dts b/arch/arm/boot/dts/imx6sx-sdb.dts index 9db123fd1cc8..c108bb451337 100644 --- a/arch/arm/boot/dts/imx6sx-sdb.dts +++ b/arch/arm/boot/dts/imx6sx-sdb.dts | |||
@@ -166,11 +166,11 @@ | |||
166 | #address-cells = <1>; | 166 | #address-cells = <1>; |
167 | #size-cells = <0>; | 167 | #size-cells = <0>; |
168 | 168 | ||
169 | ethphy1: ethernet-phy@0 { | 169 | ethphy1: ethernet-phy@1 { |
170 | reg = <1>; | 170 | reg = <1>; |
171 | }; | 171 | }; |
172 | 172 | ||
173 | ethphy2: ethernet-phy@1 { | 173 | ethphy2: ethernet-phy@2 { |
174 | reg = <2>; | 174 | reg = <2>; |
175 | }; | 175 | }; |
176 | }; | 176 | }; |
diff --git a/arch/arm/boot/dts/ls1021a.dtsi b/arch/arm/boot/dts/ls1021a.dtsi index 657da14cb4b5..c70bb27ac65a 100644 --- a/arch/arm/boot/dts/ls1021a.dtsi +++ b/arch/arm/boot/dts/ls1021a.dtsi | |||
@@ -142,6 +142,7 @@ | |||
142 | scfg: scfg@1570000 { | 142 | scfg: scfg@1570000 { |
143 | compatible = "fsl,ls1021a-scfg", "syscon"; | 143 | compatible = "fsl,ls1021a-scfg", "syscon"; |
144 | reg = <0x0 0x1570000 0x0 0x10000>; | 144 | reg = <0x0 0x1570000 0x0 0x10000>; |
145 | big-endian; | ||
145 | }; | 146 | }; |
146 | 147 | ||
147 | clockgen: clocking@1ee1000 { | 148 | clockgen: clocking@1ee1000 { |
diff --git a/arch/arm/boot/dts/omap3-n900.dts b/arch/arm/boot/dts/omap3-n900.dts index 53f3ca064140..b550c41b46f1 100644 --- a/arch/arm/boot/dts/omap3-n900.dts +++ b/arch/arm/boot/dts/omap3-n900.dts | |||
@@ -700,11 +700,9 @@ | |||
700 | }; | 700 | }; |
701 | }; | 701 | }; |
702 | 702 | ||
703 | /* Ethernet is on some early development boards and qemu */ | ||
703 | ethernet@gpmc { | 704 | ethernet@gpmc { |
704 | compatible = "smsc,lan91c94"; | 705 | compatible = "smsc,lan91c94"; |
705 | |||
706 | status = "disabled"; | ||
707 | |||
708 | interrupt-parent = <&gpio2>; | 706 | interrupt-parent = <&gpio2>; |
709 | interrupts = <22 IRQ_TYPE_LEVEL_HIGH>; /* gpio54 */ | 707 | interrupts = <22 IRQ_TYPE_LEVEL_HIGH>; /* gpio54 */ |
710 | reg = <1 0x300 0xf>; /* 16 byte IO range at offset 0x300 */ | 708 | reg = <1 0x300 0xf>; /* 16 byte IO range at offset 0x300 */ |
diff --git a/arch/arm/boot/dts/rk3288-evb.dtsi b/arch/arm/boot/dts/rk3288-evb.dtsi index 98f51140a8c6..1c08eb0ecdb9 100644 --- a/arch/arm/boot/dts/rk3288-evb.dtsi +++ b/arch/arm/boot/dts/rk3288-evb.dtsi | |||
@@ -168,6 +168,15 @@ | |||
168 | }; | 168 | }; |
169 | 169 | ||
170 | &pinctrl { | 170 | &pinctrl { |
171 | pcfg_pull_none_drv_8ma: pcfg-pull-none-drv-8ma { | ||
172 | drive-strength = <8>; | ||
173 | }; | ||
174 | |||
175 | pcfg_pull_up_drv_8ma: pcfg-pull-up-drv-8ma { | ||
176 | bias-pull-up; | ||
177 | drive-strength = <8>; | ||
178 | }; | ||
179 | |||
171 | backlight { | 180 | backlight { |
172 | bl_en: bl-en { | 181 | bl_en: bl-en { |
173 | rockchip,pins = <7 2 RK_FUNC_GPIO &pcfg_pull_none>; | 182 | rockchip,pins = <7 2 RK_FUNC_GPIO &pcfg_pull_none>; |
@@ -186,6 +195,27 @@ | |||
186 | }; | 195 | }; |
187 | }; | 196 | }; |
188 | 197 | ||
198 | sdmmc { | ||
199 | /* | ||
200 | * Default drive strength isn't enough to achieve even | ||
201 | * high-speed mode on EVB board so bump up to 8ma. | ||
202 | */ | ||
203 | sdmmc_bus4: sdmmc-bus4 { | ||
204 | rockchip,pins = <6 16 RK_FUNC_1 &pcfg_pull_up_drv_8ma>, | ||
205 | <6 17 RK_FUNC_1 &pcfg_pull_up_drv_8ma>, | ||
206 | <6 18 RK_FUNC_1 &pcfg_pull_up_drv_8ma>, | ||
207 | <6 19 RK_FUNC_1 &pcfg_pull_up_drv_8ma>; | ||
208 | }; | ||
209 | |||
210 | sdmmc_clk: sdmmc-clk { | ||
211 | rockchip,pins = <6 20 RK_FUNC_1 &pcfg_pull_none_drv_8ma>; | ||
212 | }; | ||
213 | |||
214 | sdmmc_cmd: sdmmc-cmd { | ||
215 | rockchip,pins = <6 21 RK_FUNC_1 &pcfg_pull_up_drv_8ma>; | ||
216 | }; | ||
217 | }; | ||
218 | |||
189 | usb { | 219 | usb { |
190 | host_vbus_drv: host-vbus-drv { | 220 | host_vbus_drv: host-vbus-drv { |
191 | rockchip,pins = <0 14 RK_FUNC_GPIO &pcfg_pull_none>; | 221 | rockchip,pins = <0 14 RK_FUNC_GPIO &pcfg_pull_none>; |
diff --git a/arch/arm/boot/dts/sama5d3xmb.dtsi b/arch/arm/boot/dts/sama5d3xmb.dtsi index 49c10d33df30..77e03655aca3 100644 --- a/arch/arm/boot/dts/sama5d3xmb.dtsi +++ b/arch/arm/boot/dts/sama5d3xmb.dtsi | |||
@@ -176,7 +176,7 @@ | |||
176 | "Headphone Jack", "HPOUTR", | 176 | "Headphone Jack", "HPOUTR", |
177 | "IN2L", "Line In Jack", | 177 | "IN2L", "Line In Jack", |
178 | "IN2R", "Line In Jack", | 178 | "IN2R", "Line In Jack", |
179 | "MICBIAS", "IN1L", | 179 | "Mic", "MICBIAS", |
180 | "IN1L", "Mic"; | 180 | "IN1L", "Mic"; |
181 | 181 | ||
182 | atmel,ssc-controller = <&ssc0>; | 182 | atmel,ssc-controller = <&ssc0>; |
diff --git a/arch/arm/boot/dts/sama5d4.dtsi b/arch/arm/boot/dts/sama5d4.dtsi index 1b0f30c2c4a5..b94995d1889f 100644 --- a/arch/arm/boot/dts/sama5d4.dtsi +++ b/arch/arm/boot/dts/sama5d4.dtsi | |||
@@ -1008,7 +1008,7 @@ | |||
1008 | 1008 | ||
1009 | pit: timer@fc068630 { | 1009 | pit: timer@fc068630 { |
1010 | compatible = "atmel,at91sam9260-pit"; | 1010 | compatible = "atmel,at91sam9260-pit"; |
1011 | reg = <0xfc068630 0xf>; | 1011 | reg = <0xfc068630 0x10>; |
1012 | interrupts = <3 IRQ_TYPE_LEVEL_HIGH 5>; | 1012 | interrupts = <3 IRQ_TYPE_LEVEL_HIGH 5>; |
1013 | clocks = <&h32ck>; | 1013 | clocks = <&h32ck>; |
1014 | }; | 1014 | }; |
diff --git a/arch/arm/boot/dts/ste-nomadik-nhk15.dts b/arch/arm/boot/dts/ste-nomadik-nhk15.dts index a8c00ee7522a..3d0b8755caee 100644 --- a/arch/arm/boot/dts/ste-nomadik-nhk15.dts +++ b/arch/arm/boot/dts/ste-nomadik-nhk15.dts | |||
@@ -25,11 +25,11 @@ | |||
25 | stmpe2401_1 { | 25 | stmpe2401_1 { |
26 | stmpe2401_1_nhk_mode: stmpe2401_1_nhk { | 26 | stmpe2401_1_nhk_mode: stmpe2401_1_nhk { |
27 | nhk_cfg1 { | 27 | nhk_cfg1 { |
28 | ste,pins = "GPIO76_B20"; // IRQ line | 28 | pins = "GPIO76_B20"; // IRQ line |
29 | ste,input = <0>; | 29 | ste,input = <0>; |
30 | }; | 30 | }; |
31 | nhk_cfg2 { | 31 | nhk_cfg2 { |
32 | ste,pins = "GPIO77_B8"; // reset line | 32 | pins = "GPIO77_B8"; // reset line |
33 | ste,output = <1>; | 33 | ste,output = <1>; |
34 | }; | 34 | }; |
35 | }; | 35 | }; |
@@ -37,11 +37,11 @@ | |||
37 | stmpe2401_2 { | 37 | stmpe2401_2 { |
38 | stmpe2401_2_nhk_mode: stmpe2401_2_nhk { | 38 | stmpe2401_2_nhk_mode: stmpe2401_2_nhk { |
39 | nhk_cfg1 { | 39 | nhk_cfg1 { |
40 | ste,pins = "GPIO78_A8"; // IRQ line | 40 | pins = "GPIO78_A8"; // IRQ line |
41 | ste,input = <0>; | 41 | ste,input = <0>; |
42 | }; | 42 | }; |
43 | nhk_cfg2 { | 43 | nhk_cfg2 { |
44 | ste,pins = "GPIO79_C9"; // reset line | 44 | pins = "GPIO79_C9"; // reset line |
45 | ste,output = <1>; | 45 | ste,output = <1>; |
46 | }; | 46 | }; |
47 | }; | 47 | }; |
diff --git a/arch/arm/boot/dts/tegra20-seaboard.dts b/arch/arm/boot/dts/tegra20-seaboard.dts index ea282c7c0ca5..e2fed2712249 100644 --- a/arch/arm/boot/dts/tegra20-seaboard.dts +++ b/arch/arm/boot/dts/tegra20-seaboard.dts | |||
@@ -406,7 +406,7 @@ | |||
406 | clock-frequency = <400000>; | 406 | clock-frequency = <400000>; |
407 | 407 | ||
408 | magnetometer@c { | 408 | magnetometer@c { |
409 | compatible = "ak,ak8975"; | 409 | compatible = "asahi-kasei,ak8975"; |
410 | reg = <0xc>; | 410 | reg = <0xc>; |
411 | interrupt-parent = <&gpio>; | 411 | interrupt-parent = <&gpio>; |
412 | interrupts = <TEGRA_GPIO(N, 5) IRQ_TYPE_LEVEL_HIGH>; | 412 | interrupts = <TEGRA_GPIO(N, 5) IRQ_TYPE_LEVEL_HIGH>; |
diff --git a/arch/arm/configs/exynos_defconfig b/arch/arm/configs/exynos_defconfig index 5ef14de00a29..3d0c5d65c741 100644 --- a/arch/arm/configs/exynos_defconfig +++ b/arch/arm/configs/exynos_defconfig | |||
@@ -84,7 +84,8 @@ CONFIG_DEBUG_GPIO=y | |||
84 | CONFIG_POWER_SUPPLY=y | 84 | CONFIG_POWER_SUPPLY=y |
85 | CONFIG_BATTERY_SBS=y | 85 | CONFIG_BATTERY_SBS=y |
86 | CONFIG_CHARGER_TPS65090=y | 86 | CONFIG_CHARGER_TPS65090=y |
87 | # CONFIG_HWMON is not set | 87 | CONFIG_HWMON=y |
88 | CONFIG_SENSORS_LM90=y | ||
88 | CONFIG_THERMAL=y | 89 | CONFIG_THERMAL=y |
89 | CONFIG_EXYNOS_THERMAL=y | 90 | CONFIG_EXYNOS_THERMAL=y |
90 | CONFIG_EXYNOS_THERMAL_CORE=y | 91 | CONFIG_EXYNOS_THERMAL_CORE=y |
@@ -109,11 +110,26 @@ CONFIG_REGULATOR_S2MPA01=y | |||
109 | CONFIG_REGULATOR_S2MPS11=y | 110 | CONFIG_REGULATOR_S2MPS11=y |
110 | CONFIG_REGULATOR_S5M8767=y | 111 | CONFIG_REGULATOR_S5M8767=y |
111 | CONFIG_REGULATOR_TPS65090=y | 112 | CONFIG_REGULATOR_TPS65090=y |
113 | CONFIG_DRM=y | ||
114 | CONFIG_DRM_BRIDGE=y | ||
115 | CONFIG_DRM_PTN3460=y | ||
116 | CONFIG_DRM_PS8622=y | ||
117 | CONFIG_DRM_EXYNOS=y | ||
118 | CONFIG_DRM_EXYNOS_FIMD=y | ||
119 | CONFIG_DRM_EXYNOS_DP=y | ||
120 | CONFIG_DRM_PANEL=y | ||
121 | CONFIG_DRM_PANEL_SIMPLE=y | ||
112 | CONFIG_FB=y | 122 | CONFIG_FB=y |
113 | CONFIG_FB_MODE_HELPERS=y | 123 | CONFIG_FB_MODE_HELPERS=y |
114 | CONFIG_FB_SIMPLE=y | 124 | CONFIG_FB_SIMPLE=y |
115 | CONFIG_EXYNOS_VIDEO=y | 125 | CONFIG_EXYNOS_VIDEO=y |
116 | CONFIG_EXYNOS_MIPI_DSI=y | 126 | CONFIG_EXYNOS_MIPI_DSI=y |
127 | CONFIG_BACKLIGHT_LCD_SUPPORT=y | ||
128 | CONFIG_LCD_CLASS_DEVICE=y | ||
129 | CONFIG_LCD_PLATFORM=y | ||
130 | CONFIG_BACKLIGHT_CLASS_DEVICE=y | ||
131 | CONFIG_BACKLIGHT_GENERIC=y | ||
132 | CONFIG_BACKLIGHT_PWM=y | ||
117 | CONFIG_FRAMEBUFFER_CONSOLE=y | 133 | CONFIG_FRAMEBUFFER_CONSOLE=y |
118 | CONFIG_FONTS=y | 134 | CONFIG_FONTS=y |
119 | CONFIG_FONT_7x14=y | 135 | CONFIG_FONT_7x14=y |
diff --git a/arch/arm/configs/omap2plus_defconfig b/arch/arm/configs/omap2plus_defconfig index c2c3a852af9f..667d9d52aa01 100644 --- a/arch/arm/configs/omap2plus_defconfig +++ b/arch/arm/configs/omap2plus_defconfig | |||
@@ -68,7 +68,7 @@ CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y | |||
68 | CONFIG_CPU_FREQ_GOV_POWERSAVE=y | 68 | CONFIG_CPU_FREQ_GOV_POWERSAVE=y |
69 | CONFIG_CPU_FREQ_GOV_USERSPACE=y | 69 | CONFIG_CPU_FREQ_GOV_USERSPACE=y |
70 | CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y | 70 | CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y |
71 | CONFIG_GENERIC_CPUFREQ_CPU0=y | 71 | CONFIG_CPUFREQ_DT=y |
72 | # CONFIG_ARM_OMAP2PLUS_CPUFREQ is not set | 72 | # CONFIG_ARM_OMAP2PLUS_CPUFREQ is not set |
73 | CONFIG_CPU_IDLE=y | 73 | CONFIG_CPU_IDLE=y |
74 | CONFIG_BINFMT_MISC=y | 74 | CONFIG_BINFMT_MISC=y |
diff --git a/arch/arm/kernel/entry-header.S b/arch/arm/kernel/entry-header.S index 4176df721bf0..1a0045abead7 100644 --- a/arch/arm/kernel/entry-header.S +++ b/arch/arm/kernel/entry-header.S | |||
@@ -253,21 +253,22 @@ | |||
253 | .endm | 253 | .endm |
254 | 254 | ||
255 | .macro restore_user_regs, fast = 0, offset = 0 | 255 | .macro restore_user_regs, fast = 0, offset = 0 |
256 | ldr r1, [sp, #\offset + S_PSR] @ get calling cpsr | 256 | mov r2, sp |
257 | ldr lr, [sp, #\offset + S_PC]! @ get pc | 257 | ldr r1, [r2, #\offset + S_PSR] @ get calling cpsr |
258 | ldr lr, [r2, #\offset + S_PC]! @ get pc | ||
258 | msr spsr_cxsf, r1 @ save in spsr_svc | 259 | msr spsr_cxsf, r1 @ save in spsr_svc |
259 | #if defined(CONFIG_CPU_V6) || defined(CONFIG_CPU_32v6K) | 260 | #if defined(CONFIG_CPU_V6) || defined(CONFIG_CPU_32v6K) |
260 | @ We must avoid clrex due to Cortex-A15 erratum #830321 | 261 | @ We must avoid clrex due to Cortex-A15 erratum #830321 |
261 | strex r1, r2, [sp] @ clear the exclusive monitor | 262 | strex r1, r2, [r2] @ clear the exclusive monitor |
262 | #endif | 263 | #endif |
263 | .if \fast | 264 | .if \fast |
264 | ldmdb sp, {r1 - lr}^ @ get calling r1 - lr | 265 | ldmdb r2, {r1 - lr}^ @ get calling r1 - lr |
265 | .else | 266 | .else |
266 | ldmdb sp, {r0 - lr}^ @ get calling r0 - lr | 267 | ldmdb r2, {r0 - lr}^ @ get calling r0 - lr |
267 | .endif | 268 | .endif |
268 | mov r0, r0 @ ARMv5T and earlier require a nop | 269 | mov r0, r0 @ ARMv5T and earlier require a nop |
269 | @ after ldm {}^ | 270 | @ after ldm {}^ |
270 | add sp, sp, #S_FRAME_SIZE - S_PC | 271 | add sp, sp, #\offset + S_FRAME_SIZE |
271 | movs pc, lr @ return & move spsr_svc into cpsr | 272 | movs pc, lr @ return & move spsr_svc into cpsr |
272 | .endm | 273 | .endm |
273 | 274 | ||
diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c index f7c65adaa428..557e128e4df0 100644 --- a/arch/arm/kernel/perf_event.c +++ b/arch/arm/kernel/perf_event.c | |||
@@ -116,8 +116,14 @@ int armpmu_event_set_period(struct perf_event *event) | |||
116 | ret = 1; | 116 | ret = 1; |
117 | } | 117 | } |
118 | 118 | ||
119 | if (left > (s64)armpmu->max_period) | 119 | /* |
120 | left = armpmu->max_period; | 120 | * Limit the maximum period to prevent the counter value |
121 | * from overtaking the one we are about to program. In | ||
122 | * effect we are reducing max_period to account for | ||
123 | * interrupt latency (and we are being very conservative). | ||
124 | */ | ||
125 | if (left > (armpmu->max_period >> 1)) | ||
126 | left = armpmu->max_period >> 1; | ||
121 | 127 | ||
122 | local64_set(&hwc->prev_count, (u64)-left); | 128 | local64_set(&hwc->prev_count, (u64)-left); |
123 | 129 | ||
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 715ae19bc7c8..e55408e96559 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c | |||
@@ -657,10 +657,13 @@ int __init arm_add_memory(u64 start, u64 size) | |||
657 | 657 | ||
658 | /* | 658 | /* |
659 | * Ensure that start/size are aligned to a page boundary. | 659 | * Ensure that start/size are aligned to a page boundary. |
660 | * Size is appropriately rounded down, start is rounded up. | 660 | * Size is rounded down, start is rounded up. |
661 | */ | 661 | */ |
662 | size -= start & ~PAGE_MASK; | ||
663 | aligned_start = PAGE_ALIGN(start); | 662 | aligned_start = PAGE_ALIGN(start); |
663 | if (aligned_start > start + size) | ||
664 | size = 0; | ||
665 | else | ||
666 | size -= aligned_start - start; | ||
664 | 667 | ||
665 | #ifndef CONFIG_ARCH_PHYS_ADDR_T_64BIT | 668 | #ifndef CONFIG_ARCH_PHYS_ADDR_T_64BIT |
666 | if (aligned_start > ULONG_MAX) { | 669 | if (aligned_start > ULONG_MAX) { |
diff --git a/arch/arm/mach-at91/board-dt-sama5.c b/arch/arm/mach-at91/board-dt-sama5.c index 8fb9ef5333f1..97f7367d32b8 100644 --- a/arch/arm/mach-at91/board-dt-sama5.c +++ b/arch/arm/mach-at91/board-dt-sama5.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <linux/of_platform.h> | 17 | #include <linux/of_platform.h> |
18 | #include <linux/phy.h> | 18 | #include <linux/phy.h> |
19 | #include <linux/clk-provider.h> | 19 | #include <linux/clk-provider.h> |
20 | #include <linux/phy.h> | ||
20 | 21 | ||
21 | #include <asm/setup.h> | 22 | #include <asm/setup.h> |
22 | #include <asm/irq.h> | 23 | #include <asm/irq.h> |
@@ -26,8 +27,25 @@ | |||
26 | 27 | ||
27 | #include "generic.h" | 28 | #include "generic.h" |
28 | 29 | ||
30 | static int ksz8081_phy_fixup(struct phy_device *phy) | ||
31 | { | ||
32 | int value; | ||
33 | |||
34 | value = phy_read(phy, 0x16); | ||
35 | value &= ~0x20; | ||
36 | phy_write(phy, 0x16, value); | ||
37 | |||
38 | return 0; | ||
39 | } | ||
40 | |||
29 | static void __init sama5_dt_device_init(void) | 41 | static void __init sama5_dt_device_init(void) |
30 | { | 42 | { |
43 | if (of_machine_is_compatible("atmel,sama5d4ek") && | ||
44 | IS_ENABLED(CONFIG_PHYLIB)) { | ||
45 | phy_register_fixup_for_id("fc028000.etherne:00", | ||
46 | ksz8081_phy_fixup); | ||
47 | } | ||
48 | |||
31 | of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); | 49 | of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); |
32 | } | 50 | } |
33 | 51 | ||
diff --git a/arch/arm/mach-imx/clk-imx6q.c b/arch/arm/mach-imx/clk-imx6q.c index 5951660d1bd2..2daef619d053 100644 --- a/arch/arm/mach-imx/clk-imx6q.c +++ b/arch/arm/mach-imx/clk-imx6q.c | |||
@@ -144,7 +144,7 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node) | |||
144 | post_div_table[1].div = 1; | 144 | post_div_table[1].div = 1; |
145 | post_div_table[2].div = 1; | 145 | post_div_table[2].div = 1; |
146 | video_div_table[1].div = 1; | 146 | video_div_table[1].div = 1; |
147 | video_div_table[2].div = 1; | 147 | video_div_table[3].div = 1; |
148 | } | 148 | } |
149 | 149 | ||
150 | clk[IMX6QDL_PLL1_BYPASS_SRC] = imx_clk_mux("pll1_bypass_src", base + 0x00, 14, 2, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels)); | 150 | clk[IMX6QDL_PLL1_BYPASS_SRC] = imx_clk_mux("pll1_bypass_src", base + 0x00, 14, 2, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels)); |
diff --git a/arch/arm/mach-imx/clk-imx6sx.c b/arch/arm/mach-imx/clk-imx6sx.c index 17354a11356f..5a3e5a159e70 100644 --- a/arch/arm/mach-imx/clk-imx6sx.c +++ b/arch/arm/mach-imx/clk-imx6sx.c | |||
@@ -558,6 +558,9 @@ static void __init imx6sx_clocks_init(struct device_node *ccm_node) | |||
558 | clk_set_parent(clks[IMX6SX_CLK_GPU_CORE_SEL], clks[IMX6SX_CLK_PLL3_PFD0]); | 558 | clk_set_parent(clks[IMX6SX_CLK_GPU_CORE_SEL], clks[IMX6SX_CLK_PLL3_PFD0]); |
559 | clk_set_parent(clks[IMX6SX_CLK_GPU_AXI_SEL], clks[IMX6SX_CLK_PLL3_PFD0]); | 559 | clk_set_parent(clks[IMX6SX_CLK_GPU_AXI_SEL], clks[IMX6SX_CLK_PLL3_PFD0]); |
560 | 560 | ||
561 | clk_set_parent(clks[IMX6SX_CLK_QSPI1_SEL], clks[IMX6SX_CLK_PLL2_BUS]); | ||
562 | clk_set_parent(clks[IMX6SX_CLK_QSPI2_SEL], clks[IMX6SX_CLK_PLL2_BUS]); | ||
563 | |||
561 | /* Set initial power mode */ | 564 | /* Set initial power mode */ |
562 | imx6q_set_lpm(WAIT_CLOCKED); | 565 | imx6q_set_lpm(WAIT_CLOCKED); |
563 | } | 566 | } |
diff --git a/arch/arm/mach-mvebu/coherency.c b/arch/arm/mach-mvebu/coherency.c index 3585cb394e9b..caa21e9b8cd9 100644 --- a/arch/arm/mach-mvebu/coherency.c +++ b/arch/arm/mach-mvebu/coherency.c | |||
@@ -246,9 +246,14 @@ static int coherency_type(void) | |||
246 | return type; | 246 | return type; |
247 | } | 247 | } |
248 | 248 | ||
249 | /* | ||
250 | * As a precaution, we currently completely disable hardware I/O | ||
251 | * coherency, until enough testing is done with automatic I/O | ||
252 | * synchronization barriers to validate that it is a proper solution. | ||
253 | */ | ||
249 | int coherency_available(void) | 254 | int coherency_available(void) |
250 | { | 255 | { |
251 | return coherency_type() != COHERENCY_FABRIC_TYPE_NONE; | 256 | return false; |
252 | } | 257 | } |
253 | 258 | ||
254 | int __init coherency_init(void) | 259 | int __init coherency_init(void) |
diff --git a/arch/arm/mach-omap2/board-generic.c b/arch/arm/mach-omap2/board-generic.c index 608079a1aba6..b61c049f92d6 100644 --- a/arch/arm/mach-omap2/board-generic.c +++ b/arch/arm/mach-omap2/board-generic.c | |||
@@ -77,6 +77,24 @@ MACHINE_END | |||
77 | #endif | 77 | #endif |
78 | 78 | ||
79 | #ifdef CONFIG_ARCH_OMAP3 | 79 | #ifdef CONFIG_ARCH_OMAP3 |
80 | /* Some boards need board name for legacy userspace in /proc/cpuinfo */ | ||
81 | static const char *const n900_boards_compat[] __initconst = { | ||
82 | "nokia,omap3-n900", | ||
83 | NULL, | ||
84 | }; | ||
85 | |||
86 | DT_MACHINE_START(OMAP3_N900_DT, "Nokia RX-51 board") | ||
87 | .reserve = omap_reserve, | ||
88 | .map_io = omap3_map_io, | ||
89 | .init_early = omap3430_init_early, | ||
90 | .init_machine = omap_generic_init, | ||
91 | .init_late = omap3_init_late, | ||
92 | .init_time = omap3_sync32k_timer_init, | ||
93 | .dt_compat = n900_boards_compat, | ||
94 | .restart = omap3xxx_restart, | ||
95 | MACHINE_END | ||
96 | |||
97 | /* Generic omap3 boards, most boards can use these */ | ||
80 | static const char *const omap3_boards_compat[] __initconst = { | 98 | static const char *const omap3_boards_compat[] __initconst = { |
81 | "ti,omap3430", | 99 | "ti,omap3430", |
82 | "ti,omap3", | 100 | "ti,omap3", |
diff --git a/arch/arm/mach-omap2/common.h b/arch/arm/mach-omap2/common.h index 377eea849e7b..64e44d6d07c0 100644 --- a/arch/arm/mach-omap2/common.h +++ b/arch/arm/mach-omap2/common.h | |||
@@ -211,6 +211,7 @@ extern struct device *omap2_get_iva_device(void); | |||
211 | extern struct device *omap2_get_l3_device(void); | 211 | extern struct device *omap2_get_l3_device(void); |
212 | extern struct device *omap4_get_dsp_device(void); | 212 | extern struct device *omap4_get_dsp_device(void); |
213 | 213 | ||
214 | unsigned int omap4_xlate_irq(unsigned int hwirq); | ||
214 | void omap_gic_of_init(void); | 215 | void omap_gic_of_init(void); |
215 | 216 | ||
216 | #ifdef CONFIG_CACHE_L2X0 | 217 | #ifdef CONFIG_CACHE_L2X0 |
@@ -249,6 +250,7 @@ extern void omap4_cpu_die(unsigned int cpu); | |||
249 | extern struct smp_operations omap4_smp_ops; | 250 | extern struct smp_operations omap4_smp_ops; |
250 | 251 | ||
251 | extern void omap5_secondary_startup(void); | 252 | extern void omap5_secondary_startup(void); |
253 | extern void omap5_secondary_hyp_startup(void); | ||
252 | #endif | 254 | #endif |
253 | 255 | ||
254 | #if defined(CONFIG_SMP) && defined(CONFIG_PM) | 256 | #if defined(CONFIG_SMP) && defined(CONFIG_PM) |
diff --git a/arch/arm/mach-omap2/control.h b/arch/arm/mach-omap2/control.h index a3c013345c45..a80ac2d70bb1 100644 --- a/arch/arm/mach-omap2/control.h +++ b/arch/arm/mach-omap2/control.h | |||
@@ -286,6 +286,10 @@ | |||
286 | #define OMAP5XXX_CONTROL_STATUS 0x134 | 286 | #define OMAP5XXX_CONTROL_STATUS 0x134 |
287 | #define OMAP5_DEVICETYPE_MASK (0x7 << 6) | 287 | #define OMAP5_DEVICETYPE_MASK (0x7 << 6) |
288 | 288 | ||
289 | /* DRA7XX CONTROL CORE BOOTSTRAP */ | ||
290 | #define DRA7_CTRL_CORE_BOOTSTRAP 0x6c4 | ||
291 | #define DRA7_SPEEDSELECT_MASK (0x3 << 8) | ||
292 | |||
289 | /* | 293 | /* |
290 | * REVISIT: This list of registers is not comprehensive - there are more | 294 | * REVISIT: This list of registers is not comprehensive - there are more |
291 | * that should be added. | 295 | * that should be added. |
diff --git a/arch/arm/mach-omap2/omap-headsmp.S b/arch/arm/mach-omap2/omap-headsmp.S index 4993d4bfe9b2..6d1dffca6c7b 100644 --- a/arch/arm/mach-omap2/omap-headsmp.S +++ b/arch/arm/mach-omap2/omap-headsmp.S | |||
@@ -22,6 +22,7 @@ | |||
22 | 22 | ||
23 | /* Physical address needed since MMU not enabled yet on secondary core */ | 23 | /* Physical address needed since MMU not enabled yet on secondary core */ |
24 | #define AUX_CORE_BOOT0_PA 0x48281800 | 24 | #define AUX_CORE_BOOT0_PA 0x48281800 |
25 | #define API_HYP_ENTRY 0x102 | ||
25 | 26 | ||
26 | /* | 27 | /* |
27 | * OMAP5 specific entry point for secondary CPU to jump from ROM | 28 | * OMAP5 specific entry point for secondary CPU to jump from ROM |
@@ -41,6 +42,26 @@ wait: ldr r2, =AUX_CORE_BOOT0_PA @ read from AuxCoreBoot0 | |||
41 | b secondary_startup | 42 | b secondary_startup |
42 | ENDPROC(omap5_secondary_startup) | 43 | ENDPROC(omap5_secondary_startup) |
43 | /* | 44 | /* |
45 | * Same as omap5_secondary_startup except we call into the ROM to | ||
46 | * enable HYP mode first. This is called instead of | ||
47 | * omap5_secondary_startup if the primary CPU was put into HYP mode by | ||
48 | * the boot loader. | ||
49 | */ | ||
50 | ENTRY(omap5_secondary_hyp_startup) | ||
51 | wait_2: ldr r2, =AUX_CORE_BOOT0_PA @ read from AuxCoreBoot0 | ||
52 | ldr r0, [r2] | ||
53 | mov r0, r0, lsr #5 | ||
54 | mrc p15, 0, r4, c0, c0, 5 | ||
55 | and r4, r4, #0x0f | ||
56 | cmp r0, r4 | ||
57 | bne wait_2 | ||
58 | ldr r12, =API_HYP_ENTRY | ||
59 | adr r0, hyp_boot | ||
60 | smc #0 | ||
61 | hyp_boot: | ||
62 | b secondary_startup | ||
63 | ENDPROC(omap5_secondary_hyp_startup) | ||
64 | /* | ||
44 | * OMAP4 specific entry point for secondary CPU to jump from ROM | 65 | * OMAP4 specific entry point for secondary CPU to jump from ROM |
45 | * code. This routine also provides a holding flag into which | 66 | * code. This routine also provides a holding flag into which |
46 | * secondary core is held until we're ready for it to initialise. | 67 | * secondary core is held until we're ready for it to initialise. |
diff --git a/arch/arm/mach-omap2/omap-smp.c b/arch/arm/mach-omap2/omap-smp.c index 256e84ef0f67..5305ec7341ec 100644 --- a/arch/arm/mach-omap2/omap-smp.c +++ b/arch/arm/mach-omap2/omap-smp.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <linux/irqchip/arm-gic.h> | 22 | #include <linux/irqchip/arm-gic.h> |
23 | 23 | ||
24 | #include <asm/smp_scu.h> | 24 | #include <asm/smp_scu.h> |
25 | #include <asm/virt.h> | ||
25 | 26 | ||
26 | #include "omap-secure.h" | 27 | #include "omap-secure.h" |
27 | #include "omap-wakeupgen.h" | 28 | #include "omap-wakeupgen.h" |
@@ -227,8 +228,16 @@ static void __init omap4_smp_prepare_cpus(unsigned int max_cpus) | |||
227 | if (omap_secure_apis_support()) | 228 | if (omap_secure_apis_support()) |
228 | omap_auxcoreboot_addr(virt_to_phys(startup_addr)); | 229 | omap_auxcoreboot_addr(virt_to_phys(startup_addr)); |
229 | else | 230 | else |
230 | writel_relaxed(virt_to_phys(omap5_secondary_startup), | 231 | /* |
231 | base + OMAP_AUX_CORE_BOOT_1); | 232 | * If the boot CPU is in HYP mode then start secondary |
233 | * CPU in HYP mode as well. | ||
234 | */ | ||
235 | if ((__boot_cpu_mode & MODE_MASK) == HYP_MODE) | ||
236 | writel_relaxed(virt_to_phys(omap5_secondary_hyp_startup), | ||
237 | base + OMAP_AUX_CORE_BOOT_1); | ||
238 | else | ||
239 | writel_relaxed(virt_to_phys(omap5_secondary_startup), | ||
240 | base + OMAP_AUX_CORE_BOOT_1); | ||
232 | 241 | ||
233 | } | 242 | } |
234 | 243 | ||
diff --git a/arch/arm/mach-omap2/omap4-common.c b/arch/arm/mach-omap2/omap4-common.c index b7cb44abe49b..cc30e49a4cc2 100644 --- a/arch/arm/mach-omap2/omap4-common.c +++ b/arch/arm/mach-omap2/omap4-common.c | |||
@@ -256,6 +256,38 @@ static int __init omap4_sar_ram_init(void) | |||
256 | } | 256 | } |
257 | omap_early_initcall(omap4_sar_ram_init); | 257 | omap_early_initcall(omap4_sar_ram_init); |
258 | 258 | ||
259 | static struct of_device_id gic_match[] = { | ||
260 | { .compatible = "arm,cortex-a9-gic", }, | ||
261 | { .compatible = "arm,cortex-a15-gic", }, | ||
262 | { }, | ||
263 | }; | ||
264 | |||
265 | static struct device_node *gic_node; | ||
266 | |||
267 | unsigned int omap4_xlate_irq(unsigned int hwirq) | ||
268 | { | ||
269 | struct of_phandle_args irq_data; | ||
270 | unsigned int irq; | ||
271 | |||
272 | if (!gic_node) | ||
273 | gic_node = of_find_matching_node(NULL, gic_match); | ||
274 | |||
275 | if (WARN_ON(!gic_node)) | ||
276 | return hwirq; | ||
277 | |||
278 | irq_data.np = gic_node; | ||
279 | irq_data.args_count = 3; | ||
280 | irq_data.args[0] = 0; | ||
281 | irq_data.args[1] = hwirq - OMAP44XX_IRQ_GIC_START; | ||
282 | irq_data.args[2] = IRQ_TYPE_LEVEL_HIGH; | ||
283 | |||
284 | irq = irq_create_of_mapping(&irq_data); | ||
285 | if (WARN_ON(!irq)) | ||
286 | irq = hwirq; | ||
287 | |||
288 | return irq; | ||
289 | } | ||
290 | |||
259 | void __init omap_gic_of_init(void) | 291 | void __init omap_gic_of_init(void) |
260 | { | 292 | { |
261 | struct device_node *np; | 293 | struct device_node *np; |
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index cbb908dc5cf0..9025ffffd2dc 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c | |||
@@ -3534,9 +3534,15 @@ int omap_hwmod_fill_resources(struct omap_hwmod *oh, struct resource *res) | |||
3534 | 3534 | ||
3535 | mpu_irqs_cnt = _count_mpu_irqs(oh); | 3535 | mpu_irqs_cnt = _count_mpu_irqs(oh); |
3536 | for (i = 0; i < mpu_irqs_cnt; i++) { | 3536 | for (i = 0; i < mpu_irqs_cnt; i++) { |
3537 | unsigned int irq; | ||
3538 | |||
3539 | if (oh->xlate_irq) | ||
3540 | irq = oh->xlate_irq((oh->mpu_irqs + i)->irq); | ||
3541 | else | ||
3542 | irq = (oh->mpu_irqs + i)->irq; | ||
3537 | (res + r)->name = (oh->mpu_irqs + i)->name; | 3543 | (res + r)->name = (oh->mpu_irqs + i)->name; |
3538 | (res + r)->start = (oh->mpu_irqs + i)->irq; | 3544 | (res + r)->start = irq; |
3539 | (res + r)->end = (oh->mpu_irqs + i)->irq; | 3545 | (res + r)->end = irq; |
3540 | (res + r)->flags = IORESOURCE_IRQ; | 3546 | (res + r)->flags = IORESOURCE_IRQ; |
3541 | r++; | 3547 | r++; |
3542 | } | 3548 | } |
diff --git a/arch/arm/mach-omap2/omap_hwmod.h b/arch/arm/mach-omap2/omap_hwmod.h index 35ca6efbec31..5b42fafcaf55 100644 --- a/arch/arm/mach-omap2/omap_hwmod.h +++ b/arch/arm/mach-omap2/omap_hwmod.h | |||
@@ -676,6 +676,7 @@ struct omap_hwmod { | |||
676 | spinlock_t _lock; | 676 | spinlock_t _lock; |
677 | struct list_head node; | 677 | struct list_head node; |
678 | struct omap_hwmod_ocp_if *_mpu_port; | 678 | struct omap_hwmod_ocp_if *_mpu_port; |
679 | unsigned int (*xlate_irq)(unsigned int); | ||
679 | u16 flags; | 680 | u16 flags; |
680 | u8 mpu_rt_idx; | 681 | u8 mpu_rt_idx; |
681 | u8 response_lat; | 682 | u8 response_lat; |
diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c index c314b3c31117..f5e68a782025 100644 --- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c | |||
@@ -479,6 +479,7 @@ static struct omap_hwmod omap44xx_dma_system_hwmod = { | |||
479 | .class = &omap44xx_dma_hwmod_class, | 479 | .class = &omap44xx_dma_hwmod_class, |
480 | .clkdm_name = "l3_dma_clkdm", | 480 | .clkdm_name = "l3_dma_clkdm", |
481 | .mpu_irqs = omap44xx_dma_system_irqs, | 481 | .mpu_irqs = omap44xx_dma_system_irqs, |
482 | .xlate_irq = omap4_xlate_irq, | ||
482 | .main_clk = "l3_div_ck", | 483 | .main_clk = "l3_div_ck", |
483 | .prcm = { | 484 | .prcm = { |
484 | .omap4 = { | 485 | .omap4 = { |
@@ -640,6 +641,7 @@ static struct omap_hwmod omap44xx_dss_dispc_hwmod = { | |||
640 | .class = &omap44xx_dispc_hwmod_class, | 641 | .class = &omap44xx_dispc_hwmod_class, |
641 | .clkdm_name = "l3_dss_clkdm", | 642 | .clkdm_name = "l3_dss_clkdm", |
642 | .mpu_irqs = omap44xx_dss_dispc_irqs, | 643 | .mpu_irqs = omap44xx_dss_dispc_irqs, |
644 | .xlate_irq = omap4_xlate_irq, | ||
643 | .sdma_reqs = omap44xx_dss_dispc_sdma_reqs, | 645 | .sdma_reqs = omap44xx_dss_dispc_sdma_reqs, |
644 | .main_clk = "dss_dss_clk", | 646 | .main_clk = "dss_dss_clk", |
645 | .prcm = { | 647 | .prcm = { |
@@ -693,6 +695,7 @@ static struct omap_hwmod omap44xx_dss_dsi1_hwmod = { | |||
693 | .class = &omap44xx_dsi_hwmod_class, | 695 | .class = &omap44xx_dsi_hwmod_class, |
694 | .clkdm_name = "l3_dss_clkdm", | 696 | .clkdm_name = "l3_dss_clkdm", |
695 | .mpu_irqs = omap44xx_dss_dsi1_irqs, | 697 | .mpu_irqs = omap44xx_dss_dsi1_irqs, |
698 | .xlate_irq = omap4_xlate_irq, | ||
696 | .sdma_reqs = omap44xx_dss_dsi1_sdma_reqs, | 699 | .sdma_reqs = omap44xx_dss_dsi1_sdma_reqs, |
697 | .main_clk = "dss_dss_clk", | 700 | .main_clk = "dss_dss_clk", |
698 | .prcm = { | 701 | .prcm = { |
@@ -726,6 +729,7 @@ static struct omap_hwmod omap44xx_dss_dsi2_hwmod = { | |||
726 | .class = &omap44xx_dsi_hwmod_class, | 729 | .class = &omap44xx_dsi_hwmod_class, |
727 | .clkdm_name = "l3_dss_clkdm", | 730 | .clkdm_name = "l3_dss_clkdm", |
728 | .mpu_irqs = omap44xx_dss_dsi2_irqs, | 731 | .mpu_irqs = omap44xx_dss_dsi2_irqs, |
732 | .xlate_irq = omap4_xlate_irq, | ||
729 | .sdma_reqs = omap44xx_dss_dsi2_sdma_reqs, | 733 | .sdma_reqs = omap44xx_dss_dsi2_sdma_reqs, |
730 | .main_clk = "dss_dss_clk", | 734 | .main_clk = "dss_dss_clk", |
731 | .prcm = { | 735 | .prcm = { |
@@ -784,6 +788,7 @@ static struct omap_hwmod omap44xx_dss_hdmi_hwmod = { | |||
784 | */ | 788 | */ |
785 | .flags = HWMOD_SWSUP_SIDLE, | 789 | .flags = HWMOD_SWSUP_SIDLE, |
786 | .mpu_irqs = omap44xx_dss_hdmi_irqs, | 790 | .mpu_irqs = omap44xx_dss_hdmi_irqs, |
791 | .xlate_irq = omap4_xlate_irq, | ||
787 | .sdma_reqs = omap44xx_dss_hdmi_sdma_reqs, | 792 | .sdma_reqs = omap44xx_dss_hdmi_sdma_reqs, |
788 | .main_clk = "dss_48mhz_clk", | 793 | .main_clk = "dss_48mhz_clk", |
789 | .prcm = { | 794 | .prcm = { |
diff --git a/arch/arm/mach-omap2/omap_hwmod_54xx_data.c b/arch/arm/mach-omap2/omap_hwmod_54xx_data.c index 3e9523084b2a..7c3fac035e93 100644 --- a/arch/arm/mach-omap2/omap_hwmod_54xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_54xx_data.c | |||
@@ -288,6 +288,7 @@ static struct omap_hwmod omap54xx_dma_system_hwmod = { | |||
288 | .class = &omap54xx_dma_hwmod_class, | 288 | .class = &omap54xx_dma_hwmod_class, |
289 | .clkdm_name = "dma_clkdm", | 289 | .clkdm_name = "dma_clkdm", |
290 | .mpu_irqs = omap54xx_dma_system_irqs, | 290 | .mpu_irqs = omap54xx_dma_system_irqs, |
291 | .xlate_irq = omap4_xlate_irq, | ||
291 | .main_clk = "l3_iclk_div", | 292 | .main_clk = "l3_iclk_div", |
292 | .prcm = { | 293 | .prcm = { |
293 | .omap4 = { | 294 | .omap4 = { |
diff --git a/arch/arm/mach-omap2/prcm-common.h b/arch/arm/mach-omap2/prcm-common.h index a8e4b582c527..6163d66102a3 100644 --- a/arch/arm/mach-omap2/prcm-common.h +++ b/arch/arm/mach-omap2/prcm-common.h | |||
@@ -498,6 +498,7 @@ struct omap_prcm_irq_setup { | |||
498 | u8 nr_irqs; | 498 | u8 nr_irqs; |
499 | const struct omap_prcm_irq *irqs; | 499 | const struct omap_prcm_irq *irqs; |
500 | int irq; | 500 | int irq; |
501 | unsigned int (*xlate_irq)(unsigned int); | ||
501 | void (*read_pending_irqs)(unsigned long *events); | 502 | void (*read_pending_irqs)(unsigned long *events); |
502 | void (*ocp_barrier)(void); | 503 | void (*ocp_barrier)(void); |
503 | void (*save_and_clear_irqen)(u32 *saved_mask); | 504 | void (*save_and_clear_irqen)(u32 *saved_mask); |
diff --git a/arch/arm/mach-omap2/prm44xx.c b/arch/arm/mach-omap2/prm44xx.c index cc170fb81ff7..408c64efb807 100644 --- a/arch/arm/mach-omap2/prm44xx.c +++ b/arch/arm/mach-omap2/prm44xx.c | |||
@@ -49,6 +49,7 @@ static struct omap_prcm_irq_setup omap4_prcm_irq_setup = { | |||
49 | .irqs = omap4_prcm_irqs, | 49 | .irqs = omap4_prcm_irqs, |
50 | .nr_irqs = ARRAY_SIZE(omap4_prcm_irqs), | 50 | .nr_irqs = ARRAY_SIZE(omap4_prcm_irqs), |
51 | .irq = 11 + OMAP44XX_IRQ_GIC_START, | 51 | .irq = 11 + OMAP44XX_IRQ_GIC_START, |
52 | .xlate_irq = omap4_xlate_irq, | ||
52 | .read_pending_irqs = &omap44xx_prm_read_pending_irqs, | 53 | .read_pending_irqs = &omap44xx_prm_read_pending_irqs, |
53 | .ocp_barrier = &omap44xx_prm_ocp_barrier, | 54 | .ocp_barrier = &omap44xx_prm_ocp_barrier, |
54 | .save_and_clear_irqen = &omap44xx_prm_save_and_clear_irqen, | 55 | .save_and_clear_irqen = &omap44xx_prm_save_and_clear_irqen, |
@@ -751,8 +752,10 @@ static int omap44xx_prm_late_init(void) | |||
751 | } | 752 | } |
752 | 753 | ||
753 | /* Once OMAP4 DT is filled as well */ | 754 | /* Once OMAP4 DT is filled as well */ |
754 | if (irq_num >= 0) | 755 | if (irq_num >= 0) { |
755 | omap4_prcm_irq_setup.irq = irq_num; | 756 | omap4_prcm_irq_setup.irq = irq_num; |
757 | omap4_prcm_irq_setup.xlate_irq = NULL; | ||
758 | } | ||
756 | } | 759 | } |
757 | 760 | ||
758 | omap44xx_prm_enable_io_wakeup(); | 761 | omap44xx_prm_enable_io_wakeup(); |
diff --git a/arch/arm/mach-omap2/prm_common.c b/arch/arm/mach-omap2/prm_common.c index 779940cb6e56..dea2833ca627 100644 --- a/arch/arm/mach-omap2/prm_common.c +++ b/arch/arm/mach-omap2/prm_common.c | |||
@@ -187,6 +187,7 @@ int omap_prcm_event_to_irq(const char *name) | |||
187 | */ | 187 | */ |
188 | void omap_prcm_irq_cleanup(void) | 188 | void omap_prcm_irq_cleanup(void) |
189 | { | 189 | { |
190 | unsigned int irq; | ||
190 | int i; | 191 | int i; |
191 | 192 | ||
192 | if (!prcm_irq_setup) { | 193 | if (!prcm_irq_setup) { |
@@ -211,7 +212,11 @@ void omap_prcm_irq_cleanup(void) | |||
211 | kfree(prcm_irq_setup->priority_mask); | 212 | kfree(prcm_irq_setup->priority_mask); |
212 | prcm_irq_setup->priority_mask = NULL; | 213 | prcm_irq_setup->priority_mask = NULL; |
213 | 214 | ||
214 | irq_set_chained_handler(prcm_irq_setup->irq, NULL); | 215 | if (prcm_irq_setup->xlate_irq) |
216 | irq = prcm_irq_setup->xlate_irq(prcm_irq_setup->irq); | ||
217 | else | ||
218 | irq = prcm_irq_setup->irq; | ||
219 | irq_set_chained_handler(irq, NULL); | ||
215 | 220 | ||
216 | if (prcm_irq_setup->base_irq > 0) | 221 | if (prcm_irq_setup->base_irq > 0) |
217 | irq_free_descs(prcm_irq_setup->base_irq, | 222 | irq_free_descs(prcm_irq_setup->base_irq, |
@@ -259,6 +264,7 @@ int omap_prcm_register_chain_handler(struct omap_prcm_irq_setup *irq_setup) | |||
259 | int offset, i; | 264 | int offset, i; |
260 | struct irq_chip_generic *gc; | 265 | struct irq_chip_generic *gc; |
261 | struct irq_chip_type *ct; | 266 | struct irq_chip_type *ct; |
267 | unsigned int irq; | ||
262 | 268 | ||
263 | if (!irq_setup) | 269 | if (!irq_setup) |
264 | return -EINVAL; | 270 | return -EINVAL; |
@@ -298,7 +304,11 @@ int omap_prcm_register_chain_handler(struct omap_prcm_irq_setup *irq_setup) | |||
298 | 1 << (offset & 0x1f); | 304 | 1 << (offset & 0x1f); |
299 | } | 305 | } |
300 | 306 | ||
301 | irq_set_chained_handler(irq_setup->irq, omap_prcm_irq_handler); | 307 | if (irq_setup->xlate_irq) |
308 | irq = irq_setup->xlate_irq(irq_setup->irq); | ||
309 | else | ||
310 | irq = irq_setup->irq; | ||
311 | irq_set_chained_handler(irq, omap_prcm_irq_handler); | ||
302 | 312 | ||
303 | irq_setup->base_irq = irq_alloc_descs(-1, 0, irq_setup->nr_regs * 32, | 313 | irq_setup->base_irq = irq_alloc_descs(-1, 0, irq_setup->nr_regs * 32, |
304 | 0); | 314 | 0); |
diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c index 4f61148ec168..7d45c84c69ba 100644 --- a/arch/arm/mach-omap2/timer.c +++ b/arch/arm/mach-omap2/timer.c | |||
@@ -54,6 +54,7 @@ | |||
54 | 54 | ||
55 | #include "soc.h" | 55 | #include "soc.h" |
56 | #include "common.h" | 56 | #include "common.h" |
57 | #include "control.h" | ||
57 | #include "powerdomain.h" | 58 | #include "powerdomain.h" |
58 | #include "omap-secure.h" | 59 | #include "omap-secure.h" |
59 | 60 | ||
@@ -496,7 +497,8 @@ static void __init realtime_counter_init(void) | |||
496 | void __iomem *base; | 497 | void __iomem *base; |
497 | static struct clk *sys_clk; | 498 | static struct clk *sys_clk; |
498 | unsigned long rate; | 499 | unsigned long rate; |
499 | unsigned int reg, num, den; | 500 | unsigned int reg; |
501 | unsigned long long num, den; | ||
500 | 502 | ||
501 | base = ioremap(REALTIME_COUNTER_BASE, SZ_32); | 503 | base = ioremap(REALTIME_COUNTER_BASE, SZ_32); |
502 | if (!base) { | 504 | if (!base) { |
@@ -511,13 +513,42 @@ static void __init realtime_counter_init(void) | |||
511 | } | 513 | } |
512 | 514 | ||
513 | rate = clk_get_rate(sys_clk); | 515 | rate = clk_get_rate(sys_clk); |
516 | |||
517 | if (soc_is_dra7xx()) { | ||
518 | /* | ||
519 | * Errata i856 says the 32.768KHz crystal does not start at | ||
520 | * power on, so the CPU falls back to an emulated 32KHz clock | ||
521 | * based on sysclk / 610 instead. This causes the master counter | ||
522 | * frequency to not be 6.144MHz but at sysclk / 610 * 375 / 2 | ||
523 | * (OR sysclk * 75 / 244) | ||
524 | * | ||
525 | * This affects at least the DRA7/AM572x 1.0, 1.1 revisions. | ||
526 | * Of course any board built without a populated 32.768KHz | ||
527 | * crystal would also need this fix even if the CPU is fixed | ||
528 | * later. | ||
529 | * | ||
530 | * Either case can be detected by using the two speedselect bits | ||
531 | * If they are not 0, then the 32.768KHz clock driving the | ||
532 | * coarse counter that corrects the fine counter every time it | ||
533 | * ticks is actually rate/610 rather than 32.768KHz and we | ||
534 | * should compensate to avoid the 570ppm (at 20MHz, much worse | ||
535 | * at other rates) too fast system time. | ||
536 | */ | ||
537 | reg = omap_ctrl_readl(DRA7_CTRL_CORE_BOOTSTRAP); | ||
538 | if (reg & DRA7_SPEEDSELECT_MASK) { | ||
539 | num = 75; | ||
540 | den = 244; | ||
541 | goto sysclk1_based; | ||
542 | } | ||
543 | } | ||
544 | |||
514 | /* Numerator/denumerator values refer TRM Realtime Counter section */ | 545 | /* Numerator/denumerator values refer TRM Realtime Counter section */ |
515 | switch (rate) { | 546 | switch (rate) { |
516 | case 1200000: | 547 | case 12000000: |
517 | num = 64; | 548 | num = 64; |
518 | den = 125; | 549 | den = 125; |
519 | break; | 550 | break; |
520 | case 1300000: | 551 | case 13000000: |
521 | num = 768; | 552 | num = 768; |
522 | den = 1625; | 553 | den = 1625; |
523 | break; | 554 | break; |
@@ -529,11 +560,11 @@ static void __init realtime_counter_init(void) | |||
529 | num = 192; | 560 | num = 192; |
530 | den = 625; | 561 | den = 625; |
531 | break; | 562 | break; |
532 | case 2600000: | 563 | case 26000000: |
533 | num = 384; | 564 | num = 384; |
534 | den = 1625; | 565 | den = 1625; |
535 | break; | 566 | break; |
536 | case 2700000: | 567 | case 27000000: |
537 | num = 256; | 568 | num = 256; |
538 | den = 1125; | 569 | den = 1125; |
539 | break; | 570 | break; |
@@ -545,6 +576,7 @@ static void __init realtime_counter_init(void) | |||
545 | break; | 576 | break; |
546 | } | 577 | } |
547 | 578 | ||
579 | sysclk1_based: | ||
548 | /* Program numerator and denumerator registers */ | 580 | /* Program numerator and denumerator registers */ |
549 | reg = readl_relaxed(base + INCREMENTER_NUMERATOR_OFFSET) & | 581 | reg = readl_relaxed(base + INCREMENTER_NUMERATOR_OFFSET) & |
550 | NUMERATOR_DENUMERATOR_MASK; | 582 | NUMERATOR_DENUMERATOR_MASK; |
@@ -556,7 +588,7 @@ static void __init realtime_counter_init(void) | |||
556 | reg |= den; | 588 | reg |= den; |
557 | writel_relaxed(reg, base + INCREMENTER_DENUMERATOR_RELOAD_OFFSET); | 589 | writel_relaxed(reg, base + INCREMENTER_DENUMERATOR_RELOAD_OFFSET); |
558 | 590 | ||
559 | arch_timer_freq = (rate / den) * num; | 591 | arch_timer_freq = DIV_ROUND_UP_ULL(rate * num, den); |
560 | set_cntfreq(); | 592 | set_cntfreq(); |
561 | 593 | ||
562 | iounmap(base); | 594 | iounmap(base); |
diff --git a/arch/arm/mach-omap2/twl-common.c b/arch/arm/mach-omap2/twl-common.c index 4457e731f7a4..292eca0e78ed 100644 --- a/arch/arm/mach-omap2/twl-common.c +++ b/arch/arm/mach-omap2/twl-common.c | |||
@@ -66,19 +66,24 @@ void __init omap_pmic_init(int bus, u32 clkrate, | |||
66 | omap_register_i2c_bus(bus, clkrate, &pmic_i2c_board_info, 1); | 66 | omap_register_i2c_bus(bus, clkrate, &pmic_i2c_board_info, 1); |
67 | } | 67 | } |
68 | 68 | ||
69 | #ifdef CONFIG_ARCH_OMAP4 | ||
69 | void __init omap4_pmic_init(const char *pmic_type, | 70 | void __init omap4_pmic_init(const char *pmic_type, |
70 | struct twl4030_platform_data *pmic_data, | 71 | struct twl4030_platform_data *pmic_data, |
71 | struct i2c_board_info *devices, int nr_devices) | 72 | struct i2c_board_info *devices, int nr_devices) |
72 | { | 73 | { |
73 | /* PMIC part*/ | 74 | /* PMIC part*/ |
75 | unsigned int irq; | ||
76 | |||
74 | omap_mux_init_signal("sys_nirq1", OMAP_PIN_INPUT_PULLUP | OMAP_PIN_OFF_WAKEUPENABLE); | 77 | omap_mux_init_signal("sys_nirq1", OMAP_PIN_INPUT_PULLUP | OMAP_PIN_OFF_WAKEUPENABLE); |
75 | omap_mux_init_signal("fref_clk0_out.sys_drm_msecure", OMAP_PIN_OUTPUT); | 78 | omap_mux_init_signal("fref_clk0_out.sys_drm_msecure", OMAP_PIN_OUTPUT); |
76 | omap_pmic_init(1, 400, pmic_type, 7 + OMAP44XX_IRQ_GIC_START, pmic_data); | 79 | irq = omap4_xlate_irq(7 + OMAP44XX_IRQ_GIC_START); |
80 | omap_pmic_init(1, 400, pmic_type, irq, pmic_data); | ||
77 | 81 | ||
78 | /* Register additional devices on i2c1 bus if needed */ | 82 | /* Register additional devices on i2c1 bus if needed */ |
79 | if (devices) | 83 | if (devices) |
80 | i2c_register_board_info(1, devices, nr_devices); | 84 | i2c_register_board_info(1, devices, nr_devices); |
81 | } | 85 | } |
86 | #endif | ||
82 | 87 | ||
83 | void __init omap_pmic_late_init(void) | 88 | void __init omap_pmic_late_init(void) |
84 | { | 89 | { |
diff --git a/arch/arm/mach-rockchip/rockchip.c b/arch/arm/mach-rockchip/rockchip.c index d226b71d21d5..a611f4852582 100644 --- a/arch/arm/mach-rockchip/rockchip.c +++ b/arch/arm/mach-rockchip/rockchip.c | |||
@@ -19,11 +19,37 @@ | |||
19 | #include <linux/init.h> | 19 | #include <linux/init.h> |
20 | #include <linux/of_platform.h> | 20 | #include <linux/of_platform.h> |
21 | #include <linux/irqchip.h> | 21 | #include <linux/irqchip.h> |
22 | #include <linux/clk-provider.h> | ||
23 | #include <linux/clocksource.h> | ||
24 | #include <linux/mfd/syscon.h> | ||
25 | #include <linux/regmap.h> | ||
22 | #include <asm/mach/arch.h> | 26 | #include <asm/mach/arch.h> |
23 | #include <asm/mach/map.h> | 27 | #include <asm/mach/map.h> |
24 | #include <asm/hardware/cache-l2x0.h> | 28 | #include <asm/hardware/cache-l2x0.h> |
25 | #include "core.h" | 29 | #include "core.h" |
26 | 30 | ||
31 | #define RK3288_GRF_SOC_CON0 0x244 | ||
32 | |||
33 | static void __init rockchip_timer_init(void) | ||
34 | { | ||
35 | if (of_machine_is_compatible("rockchip,rk3288")) { | ||
36 | struct regmap *grf; | ||
37 | |||
38 | /* | ||
39 | * Disable auto jtag/sdmmc switching that causes issues | ||
40 | * with the mmc controllers making them unreliable | ||
41 | */ | ||
42 | grf = syscon_regmap_lookup_by_compatible("rockchip,rk3288-grf"); | ||
43 | if (!IS_ERR(grf)) | ||
44 | regmap_write(grf, RK3288_GRF_SOC_CON0, 0x10000000); | ||
45 | else | ||
46 | pr_err("rockchip: could not get grf syscon\n"); | ||
47 | } | ||
48 | |||
49 | of_clk_init(NULL); | ||
50 | clocksource_of_init(); | ||
51 | } | ||
52 | |||
27 | static void __init rockchip_dt_init(void) | 53 | static void __init rockchip_dt_init(void) |
28 | { | 54 | { |
29 | of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); | 55 | of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); |
@@ -42,6 +68,7 @@ static const char * const rockchip_board_dt_compat[] = { | |||
42 | DT_MACHINE_START(ROCKCHIP_DT, "Rockchip Cortex-A9 (Device Tree)") | 68 | DT_MACHINE_START(ROCKCHIP_DT, "Rockchip Cortex-A9 (Device Tree)") |
43 | .l2c_aux_val = 0, | 69 | .l2c_aux_val = 0, |
44 | .l2c_aux_mask = ~0, | 70 | .l2c_aux_mask = ~0, |
71 | .init_time = rockchip_timer_init, | ||
45 | .dt_compat = rockchip_board_dt_compat, | 72 | .dt_compat = rockchip_board_dt_compat, |
46 | .init_machine = rockchip_dt_init, | 73 | .init_machine = rockchip_dt_init, |
47 | MACHINE_END | 74 | MACHINE_END |
diff --git a/arch/arm/mach-shmobile/setup-r8a7740.c b/arch/arm/mach-shmobile/setup-r8a7740.c index 79ad93dfdae4..d191cf419731 100644 --- a/arch/arm/mach-shmobile/setup-r8a7740.c +++ b/arch/arm/mach-shmobile/setup-r8a7740.c | |||
@@ -800,7 +800,14 @@ void __init r8a7740_init_irq_of(void) | |||
800 | void __iomem *intc_msk_base = ioremap_nocache(0xe6900040, 0x10); | 800 | void __iomem *intc_msk_base = ioremap_nocache(0xe6900040, 0x10); |
801 | void __iomem *pfc_inta_ctrl = ioremap_nocache(0xe605807c, 0x4); | 801 | void __iomem *pfc_inta_ctrl = ioremap_nocache(0xe605807c, 0x4); |
802 | 802 | ||
803 | #ifdef CONFIG_ARCH_SHMOBILE_LEGACY | ||
804 | void __iomem *gic_dist_base = ioremap_nocache(0xc2800000, 0x1000); | ||
805 | void __iomem *gic_cpu_base = ioremap_nocache(0xc2000000, 0x1000); | ||
806 | |||
807 | gic_init(0, 29, gic_dist_base, gic_cpu_base); | ||
808 | #else | ||
803 | irqchip_init(); | 809 | irqchip_init(); |
810 | #endif | ||
804 | 811 | ||
805 | /* route signals to GIC */ | 812 | /* route signals to GIC */ |
806 | iowrite32(0x0, pfc_inta_ctrl); | 813 | iowrite32(0x0, pfc_inta_ctrl); |
diff --git a/arch/arm/mach-shmobile/setup-r8a7778.c b/arch/arm/mach-shmobile/setup-r8a7778.c index 170bd146ba17..cef8895a9b82 100644 --- a/arch/arm/mach-shmobile/setup-r8a7778.c +++ b/arch/arm/mach-shmobile/setup-r8a7778.c | |||
@@ -576,11 +576,18 @@ void __init r8a7778_init_irq_extpin(int irlm) | |||
576 | void __init r8a7778_init_irq_dt(void) | 576 | void __init r8a7778_init_irq_dt(void) |
577 | { | 577 | { |
578 | void __iomem *base = ioremap_nocache(0xfe700000, 0x00100000); | 578 | void __iomem *base = ioremap_nocache(0xfe700000, 0x00100000); |
579 | #ifdef CONFIG_ARCH_SHMOBILE_LEGACY | ||
580 | void __iomem *gic_dist_base = ioremap_nocache(0xfe438000, 0x1000); | ||
581 | void __iomem *gic_cpu_base = ioremap_nocache(0xfe430000, 0x1000); | ||
582 | #endif | ||
579 | 583 | ||
580 | BUG_ON(!base); | 584 | BUG_ON(!base); |
581 | 585 | ||
586 | #ifdef CONFIG_ARCH_SHMOBILE_LEGACY | ||
587 | gic_init(0, 29, gic_dist_base, gic_cpu_base); | ||
588 | #else | ||
582 | irqchip_init(); | 589 | irqchip_init(); |
583 | 590 | #endif | |
584 | /* route all interrupts to ARM */ | 591 | /* route all interrupts to ARM */ |
585 | __raw_writel(0x73ffffff, base + INT2NTSR0); | 592 | __raw_writel(0x73ffffff, base + INT2NTSR0); |
586 | __raw_writel(0xffffffff, base + INT2NTSR1); | 593 | __raw_writel(0xffffffff, base + INT2NTSR1); |
diff --git a/arch/arm/mach-shmobile/setup-r8a7779.c b/arch/arm/mach-shmobile/setup-r8a7779.c index 6156d172cf31..27dceaf9e688 100644 --- a/arch/arm/mach-shmobile/setup-r8a7779.c +++ b/arch/arm/mach-shmobile/setup-r8a7779.c | |||
@@ -720,10 +720,17 @@ static int r8a7779_set_wake(struct irq_data *data, unsigned int on) | |||
720 | 720 | ||
721 | void __init r8a7779_init_irq_dt(void) | 721 | void __init r8a7779_init_irq_dt(void) |
722 | { | 722 | { |
723 | #ifdef CONFIG_ARCH_SHMOBILE_LEGACY | ||
724 | void __iomem *gic_dist_base = ioremap_nocache(0xf0001000, 0x1000); | ||
725 | void __iomem *gic_cpu_base = ioremap_nocache(0xf0000100, 0x1000); | ||
726 | #endif | ||
723 | gic_arch_extn.irq_set_wake = r8a7779_set_wake; | 727 | gic_arch_extn.irq_set_wake = r8a7779_set_wake; |
724 | 728 | ||
729 | #ifdef CONFIG_ARCH_SHMOBILE_LEGACY | ||
730 | gic_init(0, 29, gic_dist_base, gic_cpu_base); | ||
731 | #else | ||
725 | irqchip_init(); | 732 | irqchip_init(); |
726 | 733 | #endif | |
727 | /* route all interrupts to ARM */ | 734 | /* route all interrupts to ARM */ |
728 | __raw_writel(0xffffffff, INT2NTSR0); | 735 | __raw_writel(0xffffffff, INT2NTSR0); |
729 | __raw_writel(0x3fffffff, INT2NTSR1); | 736 | __raw_writel(0x3fffffff, INT2NTSR1); |
diff --git a/arch/arm/mach-shmobile/setup-sh73a0.c b/arch/arm/mach-shmobile/setup-sh73a0.c index 93ebe3430bfe..fb5e1bb34be8 100644 --- a/arch/arm/mach-shmobile/setup-sh73a0.c +++ b/arch/arm/mach-shmobile/setup-sh73a0.c | |||
@@ -595,6 +595,7 @@ static struct platform_device ipmmu_device = { | |||
595 | 595 | ||
596 | static struct renesas_intc_irqpin_config irqpin0_platform_data = { | 596 | static struct renesas_intc_irqpin_config irqpin0_platform_data = { |
597 | .irq_base = irq_pin(0), /* IRQ0 -> IRQ7 */ | 597 | .irq_base = irq_pin(0), /* IRQ0 -> IRQ7 */ |
598 | .control_parent = true, | ||
598 | }; | 599 | }; |
599 | 600 | ||
600 | static struct resource irqpin0_resources[] = { | 601 | static struct resource irqpin0_resources[] = { |
@@ -656,6 +657,7 @@ static struct platform_device irqpin1_device = { | |||
656 | 657 | ||
657 | static struct renesas_intc_irqpin_config irqpin2_platform_data = { | 658 | static struct renesas_intc_irqpin_config irqpin2_platform_data = { |
658 | .irq_base = irq_pin(16), /* IRQ16 -> IRQ23 */ | 659 | .irq_base = irq_pin(16), /* IRQ16 -> IRQ23 */ |
660 | .control_parent = true, | ||
659 | }; | 661 | }; |
660 | 662 | ||
661 | static struct resource irqpin2_resources[] = { | 663 | static struct resource irqpin2_resources[] = { |
@@ -686,6 +688,7 @@ static struct platform_device irqpin2_device = { | |||
686 | 688 | ||
687 | static struct renesas_intc_irqpin_config irqpin3_platform_data = { | 689 | static struct renesas_intc_irqpin_config irqpin3_platform_data = { |
688 | .irq_base = irq_pin(24), /* IRQ24 -> IRQ31 */ | 690 | .irq_base = irq_pin(24), /* IRQ24 -> IRQ31 */ |
691 | .control_parent = true, | ||
689 | }; | 692 | }; |
690 | 693 | ||
691 | static struct resource irqpin3_resources[] = { | 694 | static struct resource irqpin3_resources[] = { |
diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile index 1c43cec971b5..066688863920 100644 --- a/arch/arm64/Makefile +++ b/arch/arm64/Makefile | |||
@@ -85,6 +85,7 @@ vdso_install: | |||
85 | # We use MRPROPER_FILES and CLEAN_FILES now | 85 | # We use MRPROPER_FILES and CLEAN_FILES now |
86 | archclean: | 86 | archclean: |
87 | $(Q)$(MAKE) $(clean)=$(boot) | 87 | $(Q)$(MAKE) $(clean)=$(boot) |
88 | $(Q)$(MAKE) $(clean)=$(boot)/dts | ||
88 | 89 | ||
89 | define archhelp | 90 | define archhelp |
90 | echo '* Image.gz - Compressed kernel image (arch/$(ARCH)/boot/Image.gz)' | 91 | echo '* Image.gz - Compressed kernel image (arch/$(ARCH)/boot/Image.gz)' |
diff --git a/arch/arm64/boot/dts/Makefile b/arch/arm64/boot/dts/Makefile index 3b8d427c3985..c62b0f4d9ef6 100644 --- a/arch/arm64/boot/dts/Makefile +++ b/arch/arm64/boot/dts/Makefile | |||
@@ -3,6 +3,4 @@ dts-dirs += apm | |||
3 | dts-dirs += arm | 3 | dts-dirs += arm |
4 | dts-dirs += cavium | 4 | dts-dirs += cavium |
5 | 5 | ||
6 | always := $(dtb-y) | ||
7 | subdir-y := $(dts-dirs) | 6 | subdir-y := $(dts-dirs) |
8 | clean-files := *.dtb | ||
diff --git a/arch/arm64/boot/dts/arm/juno.dts b/arch/arm64/boot/dts/arm/juno.dts index cb3073e4e7a8..d429129ecb3d 100644 --- a/arch/arm64/boot/dts/arm/juno.dts +++ b/arch/arm64/boot/dts/arm/juno.dts | |||
@@ -22,7 +22,7 @@ | |||
22 | }; | 22 | }; |
23 | 23 | ||
24 | chosen { | 24 | chosen { |
25 | stdout-path = &soc_uart0; | 25 | stdout-path = "serial0:115200n8"; |
26 | }; | 26 | }; |
27 | 27 | ||
28 | psci { | 28 | psci { |
diff --git a/arch/arm64/include/asm/unistd.h b/arch/arm64/include/asm/unistd.h index b780c6c76eec..23e9432ac112 100644 --- a/arch/arm64/include/asm/unistd.h +++ b/arch/arm64/include/asm/unistd.h | |||
@@ -44,7 +44,7 @@ | |||
44 | #define __ARM_NR_compat_cacheflush (__ARM_NR_COMPAT_BASE+2) | 44 | #define __ARM_NR_compat_cacheflush (__ARM_NR_COMPAT_BASE+2) |
45 | #define __ARM_NR_compat_set_tls (__ARM_NR_COMPAT_BASE+5) | 45 | #define __ARM_NR_compat_set_tls (__ARM_NR_COMPAT_BASE+5) |
46 | 46 | ||
47 | #define __NR_compat_syscalls 387 | 47 | #define __NR_compat_syscalls 388 |
48 | #endif | 48 | #endif |
49 | 49 | ||
50 | #define __ARCH_WANT_SYS_CLONE | 50 | #define __ARCH_WANT_SYS_CLONE |
diff --git a/arch/arm64/include/asm/unistd32.h b/arch/arm64/include/asm/unistd32.h index 8893cebcea5b..27224426e0bf 100644 --- a/arch/arm64/include/asm/unistd32.h +++ b/arch/arm64/include/asm/unistd32.h | |||
@@ -795,3 +795,5 @@ __SYSCALL(__NR_getrandom, sys_getrandom) | |||
795 | __SYSCALL(__NR_memfd_create, sys_memfd_create) | 795 | __SYSCALL(__NR_memfd_create, sys_memfd_create) |
796 | #define __NR_bpf 386 | 796 | #define __NR_bpf 386 |
797 | __SYSCALL(__NR_bpf, sys_bpf) | 797 | __SYSCALL(__NR_bpf, sys_bpf) |
798 | #define __NR_execveat 387 | ||
799 | __SYSCALL(__NR_execveat, compat_sys_execveat) | ||
diff --git a/arch/arm64/mm/dump.c b/arch/arm64/mm/dump.c index cf33f33333cc..d54dc9ac4b70 100644 --- a/arch/arm64/mm/dump.c +++ b/arch/arm64/mm/dump.c | |||
@@ -15,6 +15,7 @@ | |||
15 | */ | 15 | */ |
16 | #include <linux/debugfs.h> | 16 | #include <linux/debugfs.h> |
17 | #include <linux/fs.h> | 17 | #include <linux/fs.h> |
18 | #include <linux/io.h> | ||
18 | #include <linux/mm.h> | 19 | #include <linux/mm.h> |
19 | #include <linux/sched.h> | 20 | #include <linux/sched.h> |
20 | #include <linux/seq_file.h> | 21 | #include <linux/seq_file.h> |
diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c index bac492c12fcc..c95464a33f36 100644 --- a/arch/arm64/mm/init.c +++ b/arch/arm64/mm/init.c | |||
@@ -335,14 +335,8 @@ static int keep_initrd; | |||
335 | 335 | ||
336 | void free_initrd_mem(unsigned long start, unsigned long end) | 336 | void free_initrd_mem(unsigned long start, unsigned long end) |
337 | { | 337 | { |
338 | if (!keep_initrd) { | 338 | if (!keep_initrd) |
339 | if (start == initrd_start) | ||
340 | start = round_down(start, PAGE_SIZE); | ||
341 | if (end == initrd_end) | ||
342 | end = round_up(end, PAGE_SIZE); | ||
343 | |||
344 | free_reserved_area((void *)start, (void *)end, 0, "initrd"); | 339 | free_reserved_area((void *)start, (void *)end, 0, "initrd"); |
345 | } | ||
346 | } | 340 | } |
347 | 341 | ||
348 | static int __init keepinitrd_setup(char *__unused) | 342 | static int __init keepinitrd_setup(char *__unused) |
diff --git a/arch/avr32/kernel/module.c b/arch/avr32/kernel/module.c index 2c9412908024..164efa009e5b 100644 --- a/arch/avr32/kernel/module.c +++ b/arch/avr32/kernel/module.c | |||
@@ -19,12 +19,10 @@ | |||
19 | #include <linux/moduleloader.h> | 19 | #include <linux/moduleloader.h> |
20 | #include <linux/vmalloc.h> | 20 | #include <linux/vmalloc.h> |
21 | 21 | ||
22 | void module_free(struct module *mod, void *module_region) | 22 | void module_arch_freeing_init(struct module *mod) |
23 | { | 23 | { |
24 | vfree(mod->arch.syminfo); | 24 | vfree(mod->arch.syminfo); |
25 | mod->arch.syminfo = NULL; | 25 | mod->arch.syminfo = NULL; |
26 | |||
27 | vfree(module_region); | ||
28 | } | 26 | } |
29 | 27 | ||
30 | static inline int check_rela(Elf32_Rela *rela, struct module *module, | 28 | static inline int check_rela(Elf32_Rela *rela, struct module *module, |
@@ -291,12 +289,3 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab, | |||
291 | 289 | ||
292 | return ret; | 290 | return ret; |
293 | } | 291 | } |
294 | |||
295 | int module_finalize(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs, | ||
296 | struct module *module) | ||
297 | { | ||
298 | vfree(module->arch.syminfo); | ||
299 | module->arch.syminfo = NULL; | ||
300 | |||
301 | return 0; | ||
302 | } | ||
diff --git a/arch/cris/arch-v32/drivers/sync_serial.c b/arch/cris/arch-v32/drivers/sync_serial.c index 08a313fc2241..f772068d9e79 100644 --- a/arch/cris/arch-v32/drivers/sync_serial.c +++ b/arch/cris/arch-v32/drivers/sync_serial.c | |||
@@ -604,7 +604,7 @@ static ssize_t __sync_serial_read(struct file *file, | |||
604 | struct timespec *ts) | 604 | struct timespec *ts) |
605 | { | 605 | { |
606 | unsigned long flags; | 606 | unsigned long flags; |
607 | int dev = MINOR(file->f_dentry->d_inode->i_rdev); | 607 | int dev = MINOR(file_inode(file)->i_rdev); |
608 | int avail; | 608 | int avail; |
609 | struct sync_port *port; | 609 | struct sync_port *port; |
610 | unsigned char *start; | 610 | unsigned char *start; |
diff --git a/arch/cris/kernel/module.c b/arch/cris/kernel/module.c index 51123f985eb5..af04cb6b6dc9 100644 --- a/arch/cris/kernel/module.c +++ b/arch/cris/kernel/module.c | |||
@@ -36,7 +36,7 @@ void *module_alloc(unsigned long size) | |||
36 | } | 36 | } |
37 | 37 | ||
38 | /* Free memory returned from module_alloc */ | 38 | /* Free memory returned from module_alloc */ |
39 | void module_free(struct module *mod, void *module_region) | 39 | void module_memfree(void *module_region) |
40 | { | 40 | { |
41 | kfree(module_region); | 41 | kfree(module_region); |
42 | } | 42 | } |
diff --git a/arch/frv/mb93090-mb00/pci-frv.c b/arch/frv/mb93090-mb00/pci-frv.c index 67b1d1685759..0635bd6c2af3 100644 --- a/arch/frv/mb93090-mb00/pci-frv.c +++ b/arch/frv/mb93090-mb00/pci-frv.c | |||
@@ -94,7 +94,7 @@ static void __init pcibios_allocate_bus_resources(struct list_head *bus_list) | |||
94 | r = &dev->resource[idx]; | 94 | r = &dev->resource[idx]; |
95 | if (!r->start) | 95 | if (!r->start) |
96 | continue; | 96 | continue; |
97 | pci_claim_resource(dev, idx); | 97 | pci_claim_bridge_resource(dev, idx); |
98 | } | 98 | } |
99 | } | 99 | } |
100 | pcibios_allocate_bus_resources(&bus->children); | 100 | pcibios_allocate_bus_resources(&bus->children); |
diff --git a/arch/ia64/kernel/module.c b/arch/ia64/kernel/module.c index 24603be24c14..29754aae5177 100644 --- a/arch/ia64/kernel/module.c +++ b/arch/ia64/kernel/module.c | |||
@@ -305,14 +305,12 @@ plt_target (struct plt_entry *plt) | |||
305 | #endif /* !USE_BRL */ | 305 | #endif /* !USE_BRL */ |
306 | 306 | ||
307 | void | 307 | void |
308 | module_free (struct module *mod, void *module_region) | 308 | module_arch_freeing_init (struct module *mod) |
309 | { | 309 | { |
310 | if (mod && mod->arch.init_unw_table && | 310 | if (mod->arch.init_unw_table) { |
311 | module_region == mod->module_init) { | ||
312 | unw_remove_unwind_table(mod->arch.init_unw_table); | 311 | unw_remove_unwind_table(mod->arch.init_unw_table); |
313 | mod->arch.init_unw_table = NULL; | 312 | mod->arch.init_unw_table = NULL; |
314 | } | 313 | } |
315 | vfree(module_region); | ||
316 | } | 314 | } |
317 | 315 | ||
318 | /* Have we already seen one of these relocations? */ | 316 | /* Have we already seen one of these relocations? */ |
diff --git a/arch/ia64/pci/pci.c b/arch/ia64/pci/pci.c index 291a582777cf..900cc93e5409 100644 --- a/arch/ia64/pci/pci.c +++ b/arch/ia64/pci/pci.c | |||
@@ -487,45 +487,39 @@ int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge) | |||
487 | return 0; | 487 | return 0; |
488 | } | 488 | } |
489 | 489 | ||
490 | static int is_valid_resource(struct pci_dev *dev, int idx) | 490 | void pcibios_fixup_device_resources(struct pci_dev *dev) |
491 | { | 491 | { |
492 | unsigned int i, type_mask = IORESOURCE_IO | IORESOURCE_MEM; | 492 | int idx; |
493 | struct resource *devr = &dev->resource[idx], *busr; | ||
494 | 493 | ||
495 | if (!dev->bus) | 494 | if (!dev->bus) |
496 | return 0; | 495 | return; |
497 | |||
498 | pci_bus_for_each_resource(dev->bus, busr, i) { | ||
499 | if (!busr || ((busr->flags ^ devr->flags) & type_mask)) | ||
500 | continue; | ||
501 | if ((devr->start) && (devr->start >= busr->start) && | ||
502 | (devr->end <= busr->end)) | ||
503 | return 1; | ||
504 | } | ||
505 | return 0; | ||
506 | } | ||
507 | 496 | ||
508 | static void pcibios_fixup_resources(struct pci_dev *dev, int start, int limit) | 497 | for (idx = 0; idx < PCI_BRIDGE_RESOURCES; idx++) { |
509 | { | 498 | struct resource *r = &dev->resource[idx]; |
510 | int i; | ||
511 | 499 | ||
512 | for (i = start; i < limit; i++) { | 500 | if (!r->flags || r->parent || !r->start) |
513 | if (!dev->resource[i].flags) | ||
514 | continue; | 501 | continue; |
515 | if ((is_valid_resource(dev, i))) | ||
516 | pci_claim_resource(dev, i); | ||
517 | } | ||
518 | } | ||
519 | 502 | ||
520 | void pcibios_fixup_device_resources(struct pci_dev *dev) | 503 | pci_claim_resource(dev, idx); |
521 | { | 504 | } |
522 | pcibios_fixup_resources(dev, 0, PCI_BRIDGE_RESOURCES); | ||
523 | } | 505 | } |
524 | EXPORT_SYMBOL_GPL(pcibios_fixup_device_resources); | 506 | EXPORT_SYMBOL_GPL(pcibios_fixup_device_resources); |
525 | 507 | ||
526 | static void pcibios_fixup_bridge_resources(struct pci_dev *dev) | 508 | static void pcibios_fixup_bridge_resources(struct pci_dev *dev) |
527 | { | 509 | { |
528 | pcibios_fixup_resources(dev, PCI_BRIDGE_RESOURCES, PCI_NUM_RESOURCES); | 510 | int idx; |
511 | |||
512 | if (!dev->bus) | ||
513 | return; | ||
514 | |||
515 | for (idx = PCI_BRIDGE_RESOURCES; idx < PCI_NUM_RESOURCES; idx++) { | ||
516 | struct resource *r = &dev->resource[idx]; | ||
517 | |||
518 | if (!r->flags || r->parent || !r->start) | ||
519 | continue; | ||
520 | |||
521 | pci_claim_bridge_resource(dev, idx); | ||
522 | } | ||
529 | } | 523 | } |
530 | 524 | ||
531 | /* | 525 | /* |
diff --git a/arch/m68k/include/asm/unistd.h b/arch/m68k/include/asm/unistd.h index 75e75d7b1702..244e0dbe45db 100644 --- a/arch/m68k/include/asm/unistd.h +++ b/arch/m68k/include/asm/unistd.h | |||
@@ -4,7 +4,7 @@ | |||
4 | #include <uapi/asm/unistd.h> | 4 | #include <uapi/asm/unistd.h> |
5 | 5 | ||
6 | 6 | ||
7 | #define NR_syscalls 355 | 7 | #define NR_syscalls 356 |
8 | 8 | ||
9 | #define __ARCH_WANT_OLD_READDIR | 9 | #define __ARCH_WANT_OLD_READDIR |
10 | #define __ARCH_WANT_OLD_STAT | 10 | #define __ARCH_WANT_OLD_STAT |
diff --git a/arch/m68k/include/uapi/asm/unistd.h b/arch/m68k/include/uapi/asm/unistd.h index 2c1bec9a14b6..61fb6cb9d2ae 100644 --- a/arch/m68k/include/uapi/asm/unistd.h +++ b/arch/m68k/include/uapi/asm/unistd.h | |||
@@ -360,5 +360,6 @@ | |||
360 | #define __NR_getrandom 352 | 360 | #define __NR_getrandom 352 |
361 | #define __NR_memfd_create 353 | 361 | #define __NR_memfd_create 353 |
362 | #define __NR_bpf 354 | 362 | #define __NR_bpf 354 |
363 | #define __NR_execveat 355 | ||
363 | 364 | ||
364 | #endif /* _UAPI_ASM_M68K_UNISTD_H_ */ | 365 | #endif /* _UAPI_ASM_M68K_UNISTD_H_ */ |
diff --git a/arch/m68k/kernel/syscalltable.S b/arch/m68k/kernel/syscalltable.S index 2ca219e184cd..a0ec4303f2c8 100644 --- a/arch/m68k/kernel/syscalltable.S +++ b/arch/m68k/kernel/syscalltable.S | |||
@@ -375,4 +375,5 @@ ENTRY(sys_call_table) | |||
375 | .long sys_getrandom | 375 | .long sys_getrandom |
376 | .long sys_memfd_create | 376 | .long sys_memfd_create |
377 | .long sys_bpf | 377 | .long sys_bpf |
378 | .long sys_execveat /* 355 */ | ||
378 | 379 | ||
diff --git a/arch/microblaze/pci/pci-common.c b/arch/microblaze/pci/pci-common.c index b30e41c0c033..48528fb81eff 100644 --- a/arch/microblaze/pci/pci-common.c +++ b/arch/microblaze/pci/pci-common.c | |||
@@ -1026,6 +1026,8 @@ static void pcibios_allocate_bus_resources(struct pci_bus *bus) | |||
1026 | pr, (pr && pr->name) ? pr->name : "nil"); | 1026 | pr, (pr && pr->name) ? pr->name : "nil"); |
1027 | 1027 | ||
1028 | if (pr && !(pr->flags & IORESOURCE_UNSET)) { | 1028 | if (pr && !(pr->flags & IORESOURCE_UNSET)) { |
1029 | struct pci_dev *dev = bus->self; | ||
1030 | |||
1029 | if (request_resource(pr, res) == 0) | 1031 | if (request_resource(pr, res) == 0) |
1030 | continue; | 1032 | continue; |
1031 | /* | 1033 | /* |
@@ -1035,6 +1037,12 @@ static void pcibios_allocate_bus_resources(struct pci_bus *bus) | |||
1035 | */ | 1037 | */ |
1036 | if (reparent_resources(pr, res) == 0) | 1038 | if (reparent_resources(pr, res) == 0) |
1037 | continue; | 1039 | continue; |
1040 | |||
1041 | if (dev && i < PCI_BRIDGE_RESOURCE_NUM && | ||
1042 | pci_claim_bridge_resource(dev, | ||
1043 | i + PCI_BRIDGE_RESOURCES) == 0) | ||
1044 | continue; | ||
1045 | |||
1038 | } | 1046 | } |
1039 | pr_warn("PCI: Cannot allocate resource region "); | 1047 | pr_warn("PCI: Cannot allocate resource region "); |
1040 | pr_cont("%d of PCI bridge %d, will remap\n", i, bus->number); | 1048 | pr_cont("%d of PCI bridge %d, will remap\n", i, bus->number); |
@@ -1227,7 +1235,10 @@ void pcibios_claim_one_bus(struct pci_bus *bus) | |||
1227 | (unsigned long long)r->end, | 1235 | (unsigned long long)r->end, |
1228 | (unsigned int)r->flags); | 1236 | (unsigned int)r->flags); |
1229 | 1237 | ||
1230 | pci_claim_resource(dev, i); | 1238 | if (pci_claim_resource(dev, i) == 0) |
1239 | continue; | ||
1240 | |||
1241 | pci_claim_bridge_resource(dev, i); | ||
1231 | } | 1242 | } |
1232 | } | 1243 | } |
1233 | 1244 | ||
diff --git a/arch/mips/net/bpf_jit.c b/arch/mips/net/bpf_jit.c index 9fd6834a2172..5d6139390bf8 100644 --- a/arch/mips/net/bpf_jit.c +++ b/arch/mips/net/bpf_jit.c | |||
@@ -1388,7 +1388,7 @@ out: | |||
1388 | void bpf_jit_free(struct bpf_prog *fp) | 1388 | void bpf_jit_free(struct bpf_prog *fp) |
1389 | { | 1389 | { |
1390 | if (fp->jited) | 1390 | if (fp->jited) |
1391 | module_free(NULL, fp->bpf_func); | 1391 | module_memfree(fp->bpf_func); |
1392 | 1392 | ||
1393 | bpf_prog_unlock_free(fp); | 1393 | bpf_prog_unlock_free(fp); |
1394 | } | 1394 | } |
diff --git a/arch/mn10300/unit-asb2305/pci-asb2305.c b/arch/mn10300/unit-asb2305/pci-asb2305.c index febb9cd83177..b5b036f64275 100644 --- a/arch/mn10300/unit-asb2305/pci-asb2305.c +++ b/arch/mn10300/unit-asb2305/pci-asb2305.c | |||
@@ -106,7 +106,7 @@ static void __init pcibios_allocate_bus_resources(struct list_head *bus_list) | |||
106 | if (!r->flags) | 106 | if (!r->flags) |
107 | continue; | 107 | continue; |
108 | if (!r->start || | 108 | if (!r->start || |
109 | pci_claim_resource(dev, idx) < 0) { | 109 | pci_claim_bridge_resource(dev, idx) < 0) { |
110 | printk(KERN_ERR "PCI:" | 110 | printk(KERN_ERR "PCI:" |
111 | " Cannot allocate resource" | 111 | " Cannot allocate resource" |
112 | " region %d of bridge %s\n", | 112 | " region %d of bridge %s\n", |
diff --git a/arch/mn10300/unit-asb2305/pci.c b/arch/mn10300/unit-asb2305/pci.c index 6b4339f8c9c2..471ff398090c 100644 --- a/arch/mn10300/unit-asb2305/pci.c +++ b/arch/mn10300/unit-asb2305/pci.c | |||
@@ -281,42 +281,37 @@ static int __init pci_check_direct(void) | |||
281 | return -ENODEV; | 281 | return -ENODEV; |
282 | } | 282 | } |
283 | 283 | ||
284 | static int is_valid_resource(struct pci_dev *dev, int idx) | 284 | static void pcibios_fixup_device_resources(struct pci_dev *dev) |
285 | { | 285 | { |
286 | unsigned int i, type_mask = IORESOURCE_IO | IORESOURCE_MEM; | 286 | int idx; |
287 | struct resource *devr = &dev->resource[idx], *busr; | ||
288 | |||
289 | if (dev->bus) { | ||
290 | pci_bus_for_each_resource(dev->bus, busr, i) { | ||
291 | if (!busr || (busr->flags ^ devr->flags) & type_mask) | ||
292 | continue; | ||
293 | |||
294 | if (devr->start && | ||
295 | devr->start >= busr->start && | ||
296 | devr->end <= busr->end) | ||
297 | return 1; | ||
298 | } | ||
299 | } | ||
300 | 287 | ||
301 | return 0; | 288 | if (!dev->bus) |
289 | return; | ||
290 | |||
291 | for (idx = 0; idx < PCI_BRIDGE_RESOURCES; idx++) { | ||
292 | struct resource *r = &dev->resource[idx]; | ||
293 | |||
294 | if (!r->flags || r->parent || !r->start) | ||
295 | continue; | ||
296 | |||
297 | pci_claim_resource(dev, idx); | ||
298 | } | ||
302 | } | 299 | } |
303 | 300 | ||
304 | static void pcibios_fixup_device_resources(struct pci_dev *dev) | 301 | static void pcibios_fixup_bridge_resources(struct pci_dev *dev) |
305 | { | 302 | { |
306 | int limit, i; | 303 | int idx; |
307 | 304 | ||
308 | if (dev->bus->number != 0) | 305 | if (!dev->bus) |
309 | return; | 306 | return; |
310 | 307 | ||
311 | limit = (dev->hdr_type == PCI_HEADER_TYPE_NORMAL) ? | 308 | for (idx = PCI_BRIDGE_RESOURCES; idx < PCI_NUM_RESOURCES; idx++) { |
312 | PCI_BRIDGE_RESOURCES : PCI_NUM_RESOURCES; | 309 | struct resource *r = &dev->resource[idx]; |
313 | 310 | ||
314 | for (i = 0; i < limit; i++) { | 311 | if (!r->flags || r->parent || !r->start) |
315 | if (!dev->resource[i].flags) | ||
316 | continue; | 312 | continue; |
317 | 313 | ||
318 | if (is_valid_resource(dev, i)) | 314 | pci_claim_bridge_resource(dev, idx); |
319 | pci_claim_resource(dev, i); | ||
320 | } | 315 | } |
321 | } | 316 | } |
322 | 317 | ||
@@ -330,7 +325,7 @@ void pcibios_fixup_bus(struct pci_bus *bus) | |||
330 | 325 | ||
331 | if (bus->self) { | 326 | if (bus->self) { |
332 | pci_read_bridge_bases(bus); | 327 | pci_read_bridge_bases(bus); |
333 | pcibios_fixup_device_resources(bus->self); | 328 | pcibios_fixup_bridge_resources(bus->self); |
334 | } | 329 | } |
335 | 330 | ||
336 | list_for_each_entry(dev, &bus->devices, bus_list) | 331 | list_for_each_entry(dev, &bus->devices, bus_list) |
diff --git a/arch/nios2/kernel/module.c b/arch/nios2/kernel/module.c index cc924a38f22a..e2e3f13f98d5 100644 --- a/arch/nios2/kernel/module.c +++ b/arch/nios2/kernel/module.c | |||
@@ -36,7 +36,7 @@ void *module_alloc(unsigned long size) | |||
36 | } | 36 | } |
37 | 37 | ||
38 | /* Free memory returned from module_alloc */ | 38 | /* Free memory returned from module_alloc */ |
39 | void module_free(struct module *mod, void *module_region) | 39 | void module_memfree(void *module_region) |
40 | { | 40 | { |
41 | kfree(module_region); | 41 | kfree(module_region); |
42 | } | 42 | } |
diff --git a/arch/nios2/kernel/signal.c b/arch/nios2/kernel/signal.c index f9d27883a714..2d0ea25be171 100644 --- a/arch/nios2/kernel/signal.c +++ b/arch/nios2/kernel/signal.c | |||
@@ -200,7 +200,7 @@ static int setup_rt_frame(struct ksignal *ksig, sigset_t *set, | |||
200 | 200 | ||
201 | /* Set up to return from userspace; jump to fixed address sigreturn | 201 | /* Set up to return from userspace; jump to fixed address sigreturn |
202 | trampoline on kuser page. */ | 202 | trampoline on kuser page. */ |
203 | regs->ra = (unsigned long) (0x1040); | 203 | regs->ra = (unsigned long) (0x1044); |
204 | 204 | ||
205 | /* Set up registers for signal handler */ | 205 | /* Set up registers for signal handler */ |
206 | regs->sp = (unsigned long) frame; | 206 | regs->sp = (unsigned long) frame; |
diff --git a/arch/parisc/kernel/module.c b/arch/parisc/kernel/module.c index 50dfafc3f2c1..5822e8e200e6 100644 --- a/arch/parisc/kernel/module.c +++ b/arch/parisc/kernel/module.c | |||
@@ -298,14 +298,10 @@ static inline unsigned long count_stubs(const Elf_Rela *rela, unsigned long n) | |||
298 | } | 298 | } |
299 | #endif | 299 | #endif |
300 | 300 | ||
301 | 301 | void module_arch_freeing_init(struct module *mod) | |
302 | /* Free memory returned from module_alloc */ | ||
303 | void module_free(struct module *mod, void *module_region) | ||
304 | { | 302 | { |
305 | kfree(mod->arch.section); | 303 | kfree(mod->arch.section); |
306 | mod->arch.section = NULL; | 304 | mod->arch.section = NULL; |
307 | |||
308 | vfree(module_region); | ||
309 | } | 305 | } |
310 | 306 | ||
311 | /* Additional bytes needed in front of individual sections */ | 307 | /* Additional bytes needed in front of individual sections */ |
diff --git a/arch/powerpc/crypto/sha1.c b/arch/powerpc/crypto/sha1.c index d3feba5a275f..c154cebc1041 100644 --- a/arch/powerpc/crypto/sha1.c +++ b/arch/powerpc/crypto/sha1.c | |||
@@ -154,4 +154,5 @@ module_exit(sha1_powerpc_mod_fini); | |||
154 | MODULE_LICENSE("GPL"); | 154 | MODULE_LICENSE("GPL"); |
155 | MODULE_DESCRIPTION("SHA1 Secure Hash Algorithm"); | 155 | MODULE_DESCRIPTION("SHA1 Secure Hash Algorithm"); |
156 | 156 | ||
157 | MODULE_ALIAS_CRYPTO("sha1"); | ||
157 | MODULE_ALIAS_CRYPTO("sha1-powerpc"); | 158 | MODULE_ALIAS_CRYPTO("sha1-powerpc"); |
diff --git a/arch/powerpc/include/asm/thread_info.h b/arch/powerpc/include/asm/thread_info.h index ebc4f165690a..0be6c681cab1 100644 --- a/arch/powerpc/include/asm/thread_info.h +++ b/arch/powerpc/include/asm/thread_info.h | |||
@@ -23,9 +23,9 @@ | |||
23 | #define THREAD_SIZE (1 << THREAD_SHIFT) | 23 | #define THREAD_SIZE (1 << THREAD_SHIFT) |
24 | 24 | ||
25 | #ifdef CONFIG_PPC64 | 25 | #ifdef CONFIG_PPC64 |
26 | #define CURRENT_THREAD_INFO(dest, sp) clrrdi dest, sp, THREAD_SHIFT | 26 | #define CURRENT_THREAD_INFO(dest, sp) stringify_in_c(clrrdi dest, sp, THREAD_SHIFT) |
27 | #else | 27 | #else |
28 | #define CURRENT_THREAD_INFO(dest, sp) rlwinm dest, sp, 0, 0, 31-THREAD_SHIFT | 28 | #define CURRENT_THREAD_INFO(dest, sp) stringify_in_c(rlwinm dest, sp, 0, 0, 31-THREAD_SHIFT) |
29 | #endif | 29 | #endif |
30 | 30 | ||
31 | #ifndef __ASSEMBLY__ | 31 | #ifndef __ASSEMBLY__ |
@@ -71,12 +71,13 @@ struct thread_info { | |||
71 | #define THREAD_SIZE_ORDER (THREAD_SHIFT - PAGE_SHIFT) | 71 | #define THREAD_SIZE_ORDER (THREAD_SHIFT - PAGE_SHIFT) |
72 | 72 | ||
73 | /* how to get the thread information struct from C */ | 73 | /* how to get the thread information struct from C */ |
74 | register unsigned long __current_r1 asm("r1"); | ||
75 | static inline struct thread_info *current_thread_info(void) | 74 | static inline struct thread_info *current_thread_info(void) |
76 | { | 75 | { |
77 | /* gcc4, at least, is smart enough to turn this into a single | 76 | unsigned long val; |
78 | * rlwinm for ppc32 and clrrdi for ppc64 */ | 77 | |
79 | return (struct thread_info *)(__current_r1 & ~(THREAD_SIZE-1)); | 78 | asm (CURRENT_THREAD_INFO(%0,1) : "=r" (val)); |
79 | |||
80 | return (struct thread_info *)val; | ||
80 | } | 81 | } |
81 | 82 | ||
82 | #endif /* __ASSEMBLY__ */ | 83 | #endif /* __ASSEMBLY__ */ |
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index 37d512d35943..2a525c938158 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c | |||
@@ -1184,6 +1184,8 @@ static void pcibios_allocate_bus_resources(struct pci_bus *bus) | |||
1184 | pr, (pr && pr->name) ? pr->name : "nil"); | 1184 | pr, (pr && pr->name) ? pr->name : "nil"); |
1185 | 1185 | ||
1186 | if (pr && !(pr->flags & IORESOURCE_UNSET)) { | 1186 | if (pr && !(pr->flags & IORESOURCE_UNSET)) { |
1187 | struct pci_dev *dev = bus->self; | ||
1188 | |||
1187 | if (request_resource(pr, res) == 0) | 1189 | if (request_resource(pr, res) == 0) |
1188 | continue; | 1190 | continue; |
1189 | /* | 1191 | /* |
@@ -1193,6 +1195,11 @@ static void pcibios_allocate_bus_resources(struct pci_bus *bus) | |||
1193 | */ | 1195 | */ |
1194 | if (reparent_resources(pr, res) == 0) | 1196 | if (reparent_resources(pr, res) == 0) |
1195 | continue; | 1197 | continue; |
1198 | |||
1199 | if (dev && i < PCI_BRIDGE_RESOURCE_NUM && | ||
1200 | pci_claim_bridge_resource(dev, | ||
1201 | i + PCI_BRIDGE_RESOURCES) == 0) | ||
1202 | continue; | ||
1196 | } | 1203 | } |
1197 | pr_warning("PCI: Cannot allocate resource region " | 1204 | pr_warning("PCI: Cannot allocate resource region " |
1198 | "%d of PCI bridge %d, will remap\n", i, bus->number); | 1205 | "%d of PCI bridge %d, will remap\n", i, bus->number); |
@@ -1401,7 +1408,10 @@ void pcibios_claim_one_bus(struct pci_bus *bus) | |||
1401 | (unsigned long long)r->end, | 1408 | (unsigned long long)r->end, |
1402 | (unsigned int)r->flags); | 1409 | (unsigned int)r->flags); |
1403 | 1410 | ||
1404 | pci_claim_resource(dev, i); | 1411 | if (pci_claim_resource(dev, i) == 0) |
1412 | continue; | ||
1413 | |||
1414 | pci_claim_bridge_resource(dev, i); | ||
1405 | } | 1415 | } |
1406 | } | 1416 | } |
1407 | 1417 | ||
diff --git a/arch/powerpc/net/bpf_jit_comp.c b/arch/powerpc/net/bpf_jit_comp.c index 1ca125b9c226..d1916b577f2c 100644 --- a/arch/powerpc/net/bpf_jit_comp.c +++ b/arch/powerpc/net/bpf_jit_comp.c | |||
@@ -699,7 +699,7 @@ out: | |||
699 | void bpf_jit_free(struct bpf_prog *fp) | 699 | void bpf_jit_free(struct bpf_prog *fp) |
700 | { | 700 | { |
701 | if (fp->jited) | 701 | if (fp->jited) |
702 | module_free(NULL, fp->bpf_func); | 702 | module_memfree(fp->bpf_func); |
703 | 703 | ||
704 | bpf_prog_unlock_free(fp); | 704 | bpf_prog_unlock_free(fp); |
705 | } | 705 | } |
diff --git a/arch/powerpc/platforms/powernv/opal-wrappers.S b/arch/powerpc/platforms/powernv/opal-wrappers.S index 54eca8b3b288..0509bca5e830 100644 --- a/arch/powerpc/platforms/powernv/opal-wrappers.S +++ b/arch/powerpc/platforms/powernv/opal-wrappers.S | |||
@@ -40,7 +40,6 @@ BEGIN_FTR_SECTION; \ | |||
40 | b 1f; \ | 40 | b 1f; \ |
41 | END_FTR_SECTION(0, 1); \ | 41 | END_FTR_SECTION(0, 1); \ |
42 | ld r12,opal_tracepoint_refcount@toc(r2); \ | 42 | ld r12,opal_tracepoint_refcount@toc(r2); \ |
43 | std r12,32(r1); \ | ||
44 | cmpdi r12,0; \ | 43 | cmpdi r12,0; \ |
45 | bne- LABEL; \ | 44 | bne- LABEL; \ |
46 | 1: | 45 | 1: |
diff --git a/arch/powerpc/platforms/powernv/setup.c b/arch/powerpc/platforms/powernv/setup.c index b700a329c31d..d2de7d5d7574 100644 --- a/arch/powerpc/platforms/powernv/setup.c +++ b/arch/powerpc/platforms/powernv/setup.c | |||
@@ -304,7 +304,7 @@ int pnv_save_sprs_for_winkle(void) | |||
304 | * all cpus at boot. Get these reg values of current cpu and use the | 304 | * all cpus at boot. Get these reg values of current cpu and use the |
305 | * same accross all cpus. | 305 | * same accross all cpus. |
306 | */ | 306 | */ |
307 | uint64_t lpcr_val = mfspr(SPRN_LPCR); | 307 | uint64_t lpcr_val = mfspr(SPRN_LPCR) & ~(u64)LPCR_PECE1; |
308 | uint64_t hid0_val = mfspr(SPRN_HID0); | 308 | uint64_t hid0_val = mfspr(SPRN_HID0); |
309 | uint64_t hid1_val = mfspr(SPRN_HID1); | 309 | uint64_t hid1_val = mfspr(SPRN_HID1); |
310 | uint64_t hid4_val = mfspr(SPRN_HID4); | 310 | uint64_t hid4_val = mfspr(SPRN_HID4); |
diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c index 5b150f0c5df9..13c6e200b24e 100644 --- a/arch/powerpc/xmon/xmon.c +++ b/arch/powerpc/xmon/xmon.c | |||
@@ -337,6 +337,7 @@ static inline void disable_surveillance(void) | |||
337 | args.token = rtas_token("set-indicator"); | 337 | args.token = rtas_token("set-indicator"); |
338 | if (args.token == RTAS_UNKNOWN_SERVICE) | 338 | if (args.token == RTAS_UNKNOWN_SERVICE) |
339 | return; | 339 | return; |
340 | args.token = cpu_to_be32(args.token); | ||
340 | args.nargs = cpu_to_be32(3); | 341 | args.nargs = cpu_to_be32(3); |
341 | args.nret = cpu_to_be32(1); | 342 | args.nret = cpu_to_be32(1); |
342 | args.rets = &args.args[3]; | 343 | args.rets = &args.args[3]; |
diff --git a/arch/s390/kernel/module.c b/arch/s390/kernel/module.c index b89b59158b95..409d152585be 100644 --- a/arch/s390/kernel/module.c +++ b/arch/s390/kernel/module.c | |||
@@ -55,14 +55,10 @@ void *module_alloc(unsigned long size) | |||
55 | } | 55 | } |
56 | #endif | 56 | #endif |
57 | 57 | ||
58 | /* Free memory returned from module_alloc */ | 58 | void module_arch_freeing_init(struct module *mod) |
59 | void module_free(struct module *mod, void *module_region) | ||
60 | { | 59 | { |
61 | if (mod) { | 60 | vfree(mod->arch.syminfo); |
62 | vfree(mod->arch.syminfo); | 61 | mod->arch.syminfo = NULL; |
63 | mod->arch.syminfo = NULL; | ||
64 | } | ||
65 | vfree(module_region); | ||
66 | } | 62 | } |
67 | 63 | ||
68 | static void check_rela(Elf_Rela *rela, struct module *me) | 64 | static void check_rela(Elf_Rela *rela, struct module *me) |
diff --git a/arch/s390/net/bpf_jit.S b/arch/s390/net/bpf_jit.S index 7e45d13816c1..ba44c9f55346 100644 --- a/arch/s390/net/bpf_jit.S +++ b/arch/s390/net/bpf_jit.S | |||
@@ -22,8 +22,8 @@ | |||
22 | * skb_copy_bits takes 4 parameters: | 22 | * skb_copy_bits takes 4 parameters: |
23 | * %r2 = skb pointer | 23 | * %r2 = skb pointer |
24 | * %r3 = offset into skb data | 24 | * %r3 = offset into skb data |
25 | * %r4 = length to copy | 25 | * %r4 = pointer to temp buffer |
26 | * %r5 = pointer to temp buffer | 26 | * %r5 = length to copy |
27 | */ | 27 | */ |
28 | #define SKBDATA %r8 | 28 | #define SKBDATA %r8 |
29 | 29 | ||
@@ -44,8 +44,9 @@ ENTRY(sk_load_word) | |||
44 | 44 | ||
45 | sk_load_word_slow: | 45 | sk_load_word_slow: |
46 | lgr %r9,%r2 # save %r2 | 46 | lgr %r9,%r2 # save %r2 |
47 | lhi %r4,4 # 4 bytes | 47 | lgr %r3,%r1 # offset |
48 | la %r5,160(%r15) # pointer to temp buffer | 48 | la %r4,160(%r15) # pointer to temp buffer |
49 | lghi %r5,4 # 4 bytes | ||
49 | brasl %r14,skb_copy_bits # get data from skb | 50 | brasl %r14,skb_copy_bits # get data from skb |
50 | l %r5,160(%r15) # load result from temp buffer | 51 | l %r5,160(%r15) # load result from temp buffer |
51 | ltgr %r2,%r2 # set cc to (%r2 != 0) | 52 | ltgr %r2,%r2 # set cc to (%r2 != 0) |
@@ -69,8 +70,9 @@ ENTRY(sk_load_half) | |||
69 | 70 | ||
70 | sk_load_half_slow: | 71 | sk_load_half_slow: |
71 | lgr %r9,%r2 # save %r2 | 72 | lgr %r9,%r2 # save %r2 |
72 | lhi %r4,2 # 2 bytes | 73 | lgr %r3,%r1 # offset |
73 | la %r5,162(%r15) # pointer to temp buffer | 74 | la %r4,162(%r15) # pointer to temp buffer |
75 | lghi %r5,2 # 2 bytes | ||
74 | brasl %r14,skb_copy_bits # get data from skb | 76 | brasl %r14,skb_copy_bits # get data from skb |
75 | xc 160(2,%r15),160(%r15) | 77 | xc 160(2,%r15),160(%r15) |
76 | l %r5,160(%r15) # load result from temp buffer | 78 | l %r5,160(%r15) # load result from temp buffer |
@@ -95,8 +97,9 @@ ENTRY(sk_load_byte) | |||
95 | 97 | ||
96 | sk_load_byte_slow: | 98 | sk_load_byte_slow: |
97 | lgr %r9,%r2 # save %r2 | 99 | lgr %r9,%r2 # save %r2 |
98 | lhi %r4,1 # 1 bytes | 100 | lgr %r3,%r1 # offset |
99 | la %r5,163(%r15) # pointer to temp buffer | 101 | la %r4,163(%r15) # pointer to temp buffer |
102 | lghi %r5,1 # 1 byte | ||
100 | brasl %r14,skb_copy_bits # get data from skb | 103 | brasl %r14,skb_copy_bits # get data from skb |
101 | xc 160(3,%r15),160(%r15) | 104 | xc 160(3,%r15),160(%r15) |
102 | l %r5,160(%r15) # load result from temp buffer | 105 | l %r5,160(%r15) # load result from temp buffer |
@@ -104,11 +107,11 @@ sk_load_byte_slow: | |||
104 | lgr %r2,%r9 # restore %r2 | 107 | lgr %r2,%r9 # restore %r2 |
105 | br %r8 | 108 | br %r8 |
106 | 109 | ||
107 | /* A = (*(u8 *)(skb->data+K) & 0xf) << 2 */ | 110 | /* X = (*(u8 *)(skb->data+K) & 0xf) << 2 */ |
108 | ENTRY(sk_load_byte_msh) | 111 | ENTRY(sk_load_byte_msh) |
109 | llgfr %r1,%r3 # extend offset | 112 | llgfr %r1,%r3 # extend offset |
110 | clr %r11,%r3 # hlen < offset ? | 113 | clr %r11,%r3 # hlen < offset ? |
111 | jle sk_load_byte_slow | 114 | jle sk_load_byte_msh_slow |
112 | lhi %r12,0 | 115 | lhi %r12,0 |
113 | ic %r12,0(%r1,%r10) # get byte from skb | 116 | ic %r12,0(%r1,%r10) # get byte from skb |
114 | nill %r12,0x0f | 117 | nill %r12,0x0f |
@@ -118,8 +121,9 @@ ENTRY(sk_load_byte_msh) | |||
118 | 121 | ||
119 | sk_load_byte_msh_slow: | 122 | sk_load_byte_msh_slow: |
120 | lgr %r9,%r2 # save %r2 | 123 | lgr %r9,%r2 # save %r2 |
121 | lhi %r4,2 # 2 bytes | 124 | lgr %r3,%r1 # offset |
122 | la %r5,162(%r15) # pointer to temp buffer | 125 | la %r4,163(%r15) # pointer to temp buffer |
126 | lghi %r5,1 # 1 byte | ||
123 | brasl %r14,skb_copy_bits # get data from skb | 127 | brasl %r14,skb_copy_bits # get data from skb |
124 | xc 160(3,%r15),160(%r15) | 128 | xc 160(3,%r15),160(%r15) |
125 | l %r12,160(%r15) # load result from temp buffer | 129 | l %r12,160(%r15) # load result from temp buffer |
diff --git a/arch/s390/net/bpf_jit_comp.c b/arch/s390/net/bpf_jit_comp.c index 524496d47ef5..bbd1981cc150 100644 --- a/arch/s390/net/bpf_jit_comp.c +++ b/arch/s390/net/bpf_jit_comp.c | |||
@@ -448,15 +448,12 @@ static int bpf_jit_insn(struct bpf_jit *jit, struct sock_filter *filter, | |||
448 | mask = 0x800000; /* je */ | 448 | mask = 0x800000; /* je */ |
449 | kbranch: /* Emit compare if the branch targets are different */ | 449 | kbranch: /* Emit compare if the branch targets are different */ |
450 | if (filter->jt != filter->jf) { | 450 | if (filter->jt != filter->jf) { |
451 | if (K <= 16383) | 451 | if (test_facility(21)) |
452 | /* chi %r5,<K> */ | ||
453 | EMIT4_IMM(0xa75e0000, K); | ||
454 | else if (test_facility(21)) | ||
455 | /* clfi %r5,<K> */ | 452 | /* clfi %r5,<K> */ |
456 | EMIT6_IMM(0xc25f0000, K); | 453 | EMIT6_IMM(0xc25f0000, K); |
457 | else | 454 | else |
458 | /* c %r5,<d(K)>(%r13) */ | 455 | /* cl %r5,<d(K)>(%r13) */ |
459 | EMIT4_DISP(0x5950d000, EMIT_CONST(K)); | 456 | EMIT4_DISP(0x5550d000, EMIT_CONST(K)); |
460 | } | 457 | } |
461 | branch: if (filter->jt == filter->jf) { | 458 | branch: if (filter->jt == filter->jf) { |
462 | if (filter->jt == 0) | 459 | if (filter->jt == 0) |
diff --git a/arch/sparc/kernel/pci.c b/arch/sparc/kernel/pci.c index b36365f49478..9ce5afe167ff 100644 --- a/arch/sparc/kernel/pci.c +++ b/arch/sparc/kernel/pci.c | |||
@@ -639,7 +639,10 @@ static void pci_claim_bus_resources(struct pci_bus *bus) | |||
639 | (unsigned long long)r->end, | 639 | (unsigned long long)r->end, |
640 | (unsigned int)r->flags); | 640 | (unsigned int)r->flags); |
641 | 641 | ||
642 | pci_claim_resource(dev, i); | 642 | if (pci_claim_resource(dev, i) == 0) |
643 | continue; | ||
644 | |||
645 | pci_claim_bridge_resource(dev, i); | ||
643 | } | 646 | } |
644 | } | 647 | } |
645 | 648 | ||
diff --git a/arch/sparc/net/bpf_jit_comp.c b/arch/sparc/net/bpf_jit_comp.c index f33e7c7a3bf7..7931eeeb649a 100644 --- a/arch/sparc/net/bpf_jit_comp.c +++ b/arch/sparc/net/bpf_jit_comp.c | |||
@@ -776,7 +776,7 @@ cond_branch: f_offset = addrs[i + filter[i].jf]; | |||
776 | if (unlikely(proglen + ilen > oldproglen)) { | 776 | if (unlikely(proglen + ilen > oldproglen)) { |
777 | pr_err("bpb_jit_compile fatal error\n"); | 777 | pr_err("bpb_jit_compile fatal error\n"); |
778 | kfree(addrs); | 778 | kfree(addrs); |
779 | module_free(NULL, image); | 779 | module_memfree(image); |
780 | return; | 780 | return; |
781 | } | 781 | } |
782 | memcpy(image + proglen, temp, ilen); | 782 | memcpy(image + proglen, temp, ilen); |
@@ -822,7 +822,7 @@ out: | |||
822 | void bpf_jit_free(struct bpf_prog *fp) | 822 | void bpf_jit_free(struct bpf_prog *fp) |
823 | { | 823 | { |
824 | if (fp->jited) | 824 | if (fp->jited) |
825 | module_free(NULL, fp->bpf_func); | 825 | module_memfree(fp->bpf_func); |
826 | 826 | ||
827 | bpf_prog_unlock_free(fp); | 827 | bpf_prog_unlock_free(fp); |
828 | } | 828 | } |
diff --git a/arch/tile/kernel/module.c b/arch/tile/kernel/module.c index 96447c9160a0..2305084c9b93 100644 --- a/arch/tile/kernel/module.c +++ b/arch/tile/kernel/module.c | |||
@@ -74,7 +74,7 @@ error: | |||
74 | 74 | ||
75 | 75 | ||
76 | /* Free memory returned from module_alloc */ | 76 | /* Free memory returned from module_alloc */ |
77 | void module_free(struct module *mod, void *module_region) | 77 | void module_memfree(void *module_region) |
78 | { | 78 | { |
79 | vfree(module_region); | 79 | vfree(module_region); |
80 | 80 | ||
@@ -83,7 +83,7 @@ void module_free(struct module *mod, void *module_region) | |||
83 | 0, 0, 0, NULL, NULL, 0); | 83 | 0, 0, 0, NULL, NULL, 0); |
84 | 84 | ||
85 | /* | 85 | /* |
86 | * FIXME: If module_region == mod->module_init, trim exception | 86 | * FIXME: Add module_arch_freeing_init to trim exception |
87 | * table entries. | 87 | * table entries. |
88 | */ | 88 | */ |
89 | } | 89 | } |
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index ba397bde7948..0dc9d0144a27 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
@@ -857,7 +857,7 @@ source "kernel/Kconfig.preempt" | |||
857 | 857 | ||
858 | config X86_UP_APIC | 858 | config X86_UP_APIC |
859 | bool "Local APIC support on uniprocessors" | 859 | bool "Local APIC support on uniprocessors" |
860 | depends on X86_32 && !SMP && !X86_32_NON_STANDARD && !PCI_MSI | 860 | depends on X86_32 && !SMP && !X86_32_NON_STANDARD |
861 | ---help--- | 861 | ---help--- |
862 | A local APIC (Advanced Programmable Interrupt Controller) is an | 862 | A local APIC (Advanced Programmable Interrupt Controller) is an |
863 | integrated interrupt controller in the CPU. If you have a single-CPU | 863 | integrated interrupt controller in the CPU. If you have a single-CPU |
@@ -868,6 +868,10 @@ config X86_UP_APIC | |||
868 | performance counters), and the NMI watchdog which detects hard | 868 | performance counters), and the NMI watchdog which detects hard |
869 | lockups. | 869 | lockups. |
870 | 870 | ||
871 | config X86_UP_APIC_MSI | ||
872 | def_bool y | ||
873 | select X86_UP_APIC if X86_32 && !SMP && !X86_32_NON_STANDARD && PCI_MSI | ||
874 | |||
871 | config X86_UP_IOAPIC | 875 | config X86_UP_IOAPIC |
872 | bool "IO-APIC support on uniprocessors" | 876 | bool "IO-APIC support on uniprocessors" |
873 | depends on X86_UP_APIC | 877 | depends on X86_UP_APIC |
diff --git a/arch/x86/boot/compressed/Makefile b/arch/x86/boot/compressed/Makefile index d999398928bc..ad754b4411f7 100644 --- a/arch/x86/boot/compressed/Makefile +++ b/arch/x86/boot/compressed/Makefile | |||
@@ -90,7 +90,7 @@ suffix-$(CONFIG_KERNEL_LZO) := lzo | |||
90 | suffix-$(CONFIG_KERNEL_LZ4) := lz4 | 90 | suffix-$(CONFIG_KERNEL_LZ4) := lz4 |
91 | 91 | ||
92 | RUN_SIZE = $(shell $(OBJDUMP) -h vmlinux | \ | 92 | RUN_SIZE = $(shell $(OBJDUMP) -h vmlinux | \ |
93 | perl $(srctree)/arch/x86/tools/calc_run_size.pl) | 93 | $(CONFIG_SHELL) $(srctree)/arch/x86/tools/calc_run_size.sh) |
94 | quiet_cmd_mkpiggy = MKPIGGY $@ | 94 | quiet_cmd_mkpiggy = MKPIGGY $@ |
95 | cmd_mkpiggy = $(obj)/mkpiggy $< $(RUN_SIZE) > $@ || ( rm -f $@ ; false ) | 95 | cmd_mkpiggy = $(obj)/mkpiggy $< $(RUN_SIZE) > $@ || ( rm -f $@ ; false ) |
96 | 96 | ||
diff --git a/arch/x86/boot/compressed/misc.c b/arch/x86/boot/compressed/misc.c index dcc1c536cc21..a950864a64da 100644 --- a/arch/x86/boot/compressed/misc.c +++ b/arch/x86/boot/compressed/misc.c | |||
@@ -373,6 +373,8 @@ asmlinkage __visible void *decompress_kernel(void *rmode, memptr heap, | |||
373 | unsigned long output_len, | 373 | unsigned long output_len, |
374 | unsigned long run_size) | 374 | unsigned long run_size) |
375 | { | 375 | { |
376 | unsigned char *output_orig = output; | ||
377 | |||
376 | real_mode = rmode; | 378 | real_mode = rmode; |
377 | 379 | ||
378 | sanitize_boot_params(real_mode); | 380 | sanitize_boot_params(real_mode); |
@@ -421,7 +423,12 @@ asmlinkage __visible void *decompress_kernel(void *rmode, memptr heap, | |||
421 | debug_putstr("\nDecompressing Linux... "); | 423 | debug_putstr("\nDecompressing Linux... "); |
422 | decompress(input_data, input_len, NULL, NULL, output, NULL, error); | 424 | decompress(input_data, input_len, NULL, NULL, output, NULL, error); |
423 | parse_elf(output); | 425 | parse_elf(output); |
424 | handle_relocations(output, output_len); | 426 | /* |
427 | * 32-bit always performs relocations. 64-bit relocations are only | ||
428 | * needed if kASLR has chosen a different load address. | ||
429 | */ | ||
430 | if (!IS_ENABLED(CONFIG_X86_64) || output != output_orig) | ||
431 | handle_relocations(output, output_len); | ||
425 | debug_putstr("done.\nBooting the kernel.\n"); | 432 | debug_putstr("done.\nBooting the kernel.\n"); |
426 | return output; | 433 | return output; |
427 | } | 434 | } |
diff --git a/arch/x86/crypto/sha-mb/sha1_mb.c b/arch/x86/crypto/sha-mb/sha1_mb.c index a225a5ca1037..fd9f6b035b16 100644 --- a/arch/x86/crypto/sha-mb/sha1_mb.c +++ b/arch/x86/crypto/sha-mb/sha1_mb.c | |||
@@ -931,4 +931,4 @@ module_exit(sha1_mb_mod_fini); | |||
931 | MODULE_LICENSE("GPL"); | 931 | MODULE_LICENSE("GPL"); |
932 | MODULE_DESCRIPTION("SHA1 Secure Hash Algorithm, multi buffer accelerated"); | 932 | MODULE_DESCRIPTION("SHA1 Secure Hash Algorithm, multi buffer accelerated"); |
933 | 933 | ||
934 | MODULE_ALIAS("sha1"); | 934 | MODULE_ALIAS_CRYPTO("sha1"); |
diff --git a/arch/x86/include/asm/acpi.h b/arch/x86/include/asm/acpi.h index 0ab4f9fd2687..3a45668f6dc3 100644 --- a/arch/x86/include/asm/acpi.h +++ b/arch/x86/include/asm/acpi.h | |||
@@ -50,6 +50,7 @@ void acpi_pic_sci_set_trigger(unsigned int, u16); | |||
50 | 50 | ||
51 | extern int (*__acpi_register_gsi)(struct device *dev, u32 gsi, | 51 | extern int (*__acpi_register_gsi)(struct device *dev, u32 gsi, |
52 | int trigger, int polarity); | 52 | int trigger, int polarity); |
53 | extern void (*__acpi_unregister_gsi)(u32 gsi); | ||
53 | 54 | ||
54 | static inline void disable_acpi(void) | 55 | static inline void disable_acpi(void) |
55 | { | 56 | { |
diff --git a/arch/x86/include/asm/desc.h b/arch/x86/include/asm/desc.h index 50d033a8947d..a94b82e8f156 100644 --- a/arch/x86/include/asm/desc.h +++ b/arch/x86/include/asm/desc.h | |||
@@ -251,7 +251,8 @@ static inline void native_load_tls(struct thread_struct *t, unsigned int cpu) | |||
251 | gdt[GDT_ENTRY_TLS_MIN + i] = t->tls_array[i]; | 251 | gdt[GDT_ENTRY_TLS_MIN + i] = t->tls_array[i]; |
252 | } | 252 | } |
253 | 253 | ||
254 | #define _LDT_empty(info) \ | 254 | /* This intentionally ignores lm, since 32-bit apps don't have that field. */ |
255 | #define LDT_empty(info) \ | ||
255 | ((info)->base_addr == 0 && \ | 256 | ((info)->base_addr == 0 && \ |
256 | (info)->limit == 0 && \ | 257 | (info)->limit == 0 && \ |
257 | (info)->contents == 0 && \ | 258 | (info)->contents == 0 && \ |
@@ -261,11 +262,18 @@ static inline void native_load_tls(struct thread_struct *t, unsigned int cpu) | |||
261 | (info)->seg_not_present == 1 && \ | 262 | (info)->seg_not_present == 1 && \ |
262 | (info)->useable == 0) | 263 | (info)->useable == 0) |
263 | 264 | ||
264 | #ifdef CONFIG_X86_64 | 265 | /* Lots of programs expect an all-zero user_desc to mean "no segment at all". */ |
265 | #define LDT_empty(info) (_LDT_empty(info) && ((info)->lm == 0)) | 266 | static inline bool LDT_zero(const struct user_desc *info) |
266 | #else | 267 | { |
267 | #define LDT_empty(info) (_LDT_empty(info)) | 268 | return (info->base_addr == 0 && |
268 | #endif | 269 | info->limit == 0 && |
270 | info->contents == 0 && | ||
271 | info->read_exec_only == 0 && | ||
272 | info->seg_32bit == 0 && | ||
273 | info->limit_in_pages == 0 && | ||
274 | info->seg_not_present == 0 && | ||
275 | info->useable == 0); | ||
276 | } | ||
269 | 277 | ||
270 | static inline void clear_LDT(void) | 278 | static inline void clear_LDT(void) |
271 | { | 279 | { |
diff --git a/arch/x86/include/asm/mmu_context.h b/arch/x86/include/asm/mmu_context.h index 40269a2bf6f9..4b75d591eb5e 100644 --- a/arch/x86/include/asm/mmu_context.h +++ b/arch/x86/include/asm/mmu_context.h | |||
@@ -130,7 +130,25 @@ static inline void arch_bprm_mm_init(struct mm_struct *mm, | |||
130 | static inline void arch_unmap(struct mm_struct *mm, struct vm_area_struct *vma, | 130 | static inline void arch_unmap(struct mm_struct *mm, struct vm_area_struct *vma, |
131 | unsigned long start, unsigned long end) | 131 | unsigned long start, unsigned long end) |
132 | { | 132 | { |
133 | mpx_notify_unmap(mm, vma, start, end); | 133 | /* |
134 | * mpx_notify_unmap() goes and reads a rarely-hot | ||
135 | * cacheline in the mm_struct. That can be expensive | ||
136 | * enough to be seen in profiles. | ||
137 | * | ||
138 | * The mpx_notify_unmap() call and its contents have been | ||
139 | * observed to affect munmap() performance on hardware | ||
140 | * where MPX is not present. | ||
141 | * | ||
142 | * The unlikely() optimizes for the fast case: no MPX | ||
143 | * in the CPU, or no MPX use in the process. Even if | ||
144 | * we get this wrong (in the unlikely event that MPX | ||
145 | * is widely enabled on some system) the overhead of | ||
146 | * MPX itself (reading bounds tables) is expected to | ||
147 | * overwhelm the overhead of getting this unlikely() | ||
148 | * consistently wrong. | ||
149 | */ | ||
150 | if (unlikely(cpu_feature_enabled(X86_FEATURE_MPX))) | ||
151 | mpx_notify_unmap(mm, vma, start, end); | ||
134 | } | 152 | } |
135 | 153 | ||
136 | #endif /* _ASM_X86_MMU_CONTEXT_H */ | 154 | #endif /* _ASM_X86_MMU_CONTEXT_H */ |
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index d1626364a28a..b9e30daa0881 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c | |||
@@ -611,20 +611,20 @@ void __init acpi_pic_sci_set_trigger(unsigned int irq, u16 trigger) | |||
611 | 611 | ||
612 | int acpi_gsi_to_irq(u32 gsi, unsigned int *irqp) | 612 | int acpi_gsi_to_irq(u32 gsi, unsigned int *irqp) |
613 | { | 613 | { |
614 | int irq; | 614 | int rc, irq, trigger, polarity; |
615 | 615 | ||
616 | if (acpi_irq_model == ACPI_IRQ_MODEL_PIC) { | 616 | rc = acpi_get_override_irq(gsi, &trigger, &polarity); |
617 | *irqp = gsi; | 617 | if (rc == 0) { |
618 | } else { | 618 | trigger = trigger ? ACPI_LEVEL_SENSITIVE : ACPI_EDGE_SENSITIVE; |
619 | mutex_lock(&acpi_ioapic_lock); | 619 | polarity = polarity ? ACPI_ACTIVE_LOW : ACPI_ACTIVE_HIGH; |
620 | irq = mp_map_gsi_to_irq(gsi, | 620 | irq = acpi_register_gsi(NULL, gsi, trigger, polarity); |
621 | IOAPIC_MAP_ALLOC | IOAPIC_MAP_CHECK); | 621 | if (irq >= 0) { |
622 | mutex_unlock(&acpi_ioapic_lock); | 622 | *irqp = irq; |
623 | if (irq < 0) | 623 | return 0; |
624 | return -1; | 624 | } |
625 | *irqp = irq; | ||
626 | } | 625 | } |
627 | return 0; | 626 | |
627 | return -1; | ||
628 | } | 628 | } |
629 | EXPORT_SYMBOL_GPL(acpi_gsi_to_irq); | 629 | EXPORT_SYMBOL_GPL(acpi_gsi_to_irq); |
630 | 630 | ||
diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c index a450373e8e91..939155ffdece 100644 --- a/arch/x86/kernel/cpu/mshyperv.c +++ b/arch/x86/kernel/cpu/mshyperv.c | |||
@@ -107,6 +107,7 @@ static struct clocksource hyperv_cs = { | |||
107 | .rating = 400, /* use this when running on Hyperv*/ | 107 | .rating = 400, /* use this when running on Hyperv*/ |
108 | .read = read_hv_clock, | 108 | .read = read_hv_clock, |
109 | .mask = CLOCKSOURCE_MASK(64), | 109 | .mask = CLOCKSOURCE_MASK(64), |
110 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, | ||
110 | }; | 111 | }; |
111 | 112 | ||
112 | static void __init ms_hyperv_init_platform(void) | 113 | static void __init ms_hyperv_init_platform(void) |
diff --git a/arch/x86/kernel/cpu/perf_event_intel_ds.c b/arch/x86/kernel/cpu/perf_event_intel_ds.c index 3c895d480cd7..073983398364 100644 --- a/arch/x86/kernel/cpu/perf_event_intel_ds.c +++ b/arch/x86/kernel/cpu/perf_event_intel_ds.c | |||
@@ -568,8 +568,8 @@ struct event_constraint intel_atom_pebs_event_constraints[] = { | |||
568 | }; | 568 | }; |
569 | 569 | ||
570 | struct event_constraint intel_slm_pebs_event_constraints[] = { | 570 | struct event_constraint intel_slm_pebs_event_constraints[] = { |
571 | /* UOPS_RETIRED.ALL, inv=1, cmask=16 (cycles:p). */ | 571 | /* INST_RETIRED.ANY_P, inv=1, cmask=16 (cycles:p). */ |
572 | INTEL_FLAGS_EVENT_CONSTRAINT(0x108001c2, 0xf), | 572 | INTEL_FLAGS_EVENT_CONSTRAINT(0x108000c0, 0x1), |
573 | /* Allow all events as PEBS with no flags */ | 573 | /* Allow all events as PEBS with no flags */ |
574 | INTEL_ALL_EVENT_CONSTRAINT(0, 0x1), | 574 | INTEL_ALL_EVENT_CONSTRAINT(0, 0x1), |
575 | EVENT_CONSTRAINT_END | 575 | EVENT_CONSTRAINT_END |
diff --git a/arch/x86/kernel/cpu/perf_event_intel_rapl.c b/arch/x86/kernel/cpu/perf_event_intel_rapl.c index 673f930c700f..6e434f8e5fc8 100644 --- a/arch/x86/kernel/cpu/perf_event_intel_rapl.c +++ b/arch/x86/kernel/cpu/perf_event_intel_rapl.c | |||
@@ -103,6 +103,13 @@ static struct kobj_attribute format_attr_##_var = \ | |||
103 | 103 | ||
104 | #define RAPL_CNTR_WIDTH 32 /* 32-bit rapl counters */ | 104 | #define RAPL_CNTR_WIDTH 32 /* 32-bit rapl counters */ |
105 | 105 | ||
106 | #define RAPL_EVENT_ATTR_STR(_name, v, str) \ | ||
107 | static struct perf_pmu_events_attr event_attr_##v = { \ | ||
108 | .attr = __ATTR(_name, 0444, rapl_sysfs_show, NULL), \ | ||
109 | .id = 0, \ | ||
110 | .event_str = str, \ | ||
111 | }; | ||
112 | |||
106 | struct rapl_pmu { | 113 | struct rapl_pmu { |
107 | spinlock_t lock; | 114 | spinlock_t lock; |
108 | int hw_unit; /* 1/2^hw_unit Joule */ | 115 | int hw_unit; /* 1/2^hw_unit Joule */ |
@@ -379,23 +386,36 @@ static struct attribute_group rapl_pmu_attr_group = { | |||
379 | .attrs = rapl_pmu_attrs, | 386 | .attrs = rapl_pmu_attrs, |
380 | }; | 387 | }; |
381 | 388 | ||
382 | EVENT_ATTR_STR(energy-cores, rapl_cores, "event=0x01"); | 389 | static ssize_t rapl_sysfs_show(struct device *dev, |
383 | EVENT_ATTR_STR(energy-pkg , rapl_pkg, "event=0x02"); | 390 | struct device_attribute *attr, |
384 | EVENT_ATTR_STR(energy-ram , rapl_ram, "event=0x03"); | 391 | char *page) |
385 | EVENT_ATTR_STR(energy-gpu , rapl_gpu, "event=0x04"); | 392 | { |
393 | struct perf_pmu_events_attr *pmu_attr = \ | ||
394 | container_of(attr, struct perf_pmu_events_attr, attr); | ||
395 | |||
396 | if (pmu_attr->event_str) | ||
397 | return sprintf(page, "%s", pmu_attr->event_str); | ||
398 | |||
399 | return 0; | ||
400 | } | ||
401 | |||
402 | RAPL_EVENT_ATTR_STR(energy-cores, rapl_cores, "event=0x01"); | ||
403 | RAPL_EVENT_ATTR_STR(energy-pkg , rapl_pkg, "event=0x02"); | ||
404 | RAPL_EVENT_ATTR_STR(energy-ram , rapl_ram, "event=0x03"); | ||
405 | RAPL_EVENT_ATTR_STR(energy-gpu , rapl_gpu, "event=0x04"); | ||
386 | 406 | ||
387 | EVENT_ATTR_STR(energy-cores.unit, rapl_cores_unit, "Joules"); | 407 | RAPL_EVENT_ATTR_STR(energy-cores.unit, rapl_cores_unit, "Joules"); |
388 | EVENT_ATTR_STR(energy-pkg.unit , rapl_pkg_unit, "Joules"); | 408 | RAPL_EVENT_ATTR_STR(energy-pkg.unit , rapl_pkg_unit, "Joules"); |
389 | EVENT_ATTR_STR(energy-ram.unit , rapl_ram_unit, "Joules"); | 409 | RAPL_EVENT_ATTR_STR(energy-ram.unit , rapl_ram_unit, "Joules"); |
390 | EVENT_ATTR_STR(energy-gpu.unit , rapl_gpu_unit, "Joules"); | 410 | RAPL_EVENT_ATTR_STR(energy-gpu.unit , rapl_gpu_unit, "Joules"); |
391 | 411 | ||
392 | /* | 412 | /* |
393 | * we compute in 0.23 nJ increments regardless of MSR | 413 | * we compute in 0.23 nJ increments regardless of MSR |
394 | */ | 414 | */ |
395 | EVENT_ATTR_STR(energy-cores.scale, rapl_cores_scale, "2.3283064365386962890625e-10"); | 415 | RAPL_EVENT_ATTR_STR(energy-cores.scale, rapl_cores_scale, "2.3283064365386962890625e-10"); |
396 | EVENT_ATTR_STR(energy-pkg.scale, rapl_pkg_scale, "2.3283064365386962890625e-10"); | 416 | RAPL_EVENT_ATTR_STR(energy-pkg.scale, rapl_pkg_scale, "2.3283064365386962890625e-10"); |
397 | EVENT_ATTR_STR(energy-ram.scale, rapl_ram_scale, "2.3283064365386962890625e-10"); | 417 | RAPL_EVENT_ATTR_STR(energy-ram.scale, rapl_ram_scale, "2.3283064365386962890625e-10"); |
398 | EVENT_ATTR_STR(energy-gpu.scale, rapl_gpu_scale, "2.3283064365386962890625e-10"); | 418 | RAPL_EVENT_ATTR_STR(energy-gpu.scale, rapl_gpu_scale, "2.3283064365386962890625e-10"); |
399 | 419 | ||
400 | static struct attribute *rapl_events_srv_attr[] = { | 420 | static struct attribute *rapl_events_srv_attr[] = { |
401 | EVENT_PTR(rapl_cores), | 421 | EVENT_PTR(rapl_cores), |
diff --git a/arch/x86/kernel/ftrace.c b/arch/x86/kernel/ftrace.c index 2142376dc8c6..8b7b0a51e742 100644 --- a/arch/x86/kernel/ftrace.c +++ b/arch/x86/kernel/ftrace.c | |||
@@ -674,7 +674,7 @@ static inline void *alloc_tramp(unsigned long size) | |||
674 | } | 674 | } |
675 | static inline void tramp_free(void *tramp) | 675 | static inline void tramp_free(void *tramp) |
676 | { | 676 | { |
677 | module_free(NULL, tramp); | 677 | module_memfree(tramp); |
678 | } | 678 | } |
679 | #else | 679 | #else |
680 | /* Trampolines can only be created if modules are supported */ | 680 | /* Trampolines can only be created if modules are supported */ |
diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c index 6307a0f0cf17..705ef8d48e2d 100644 --- a/arch/x86/kernel/irq.c +++ b/arch/x86/kernel/irq.c | |||
@@ -127,7 +127,7 @@ int arch_show_interrupts(struct seq_file *p, int prec) | |||
127 | seq_puts(p, " Machine check polls\n"); | 127 | seq_puts(p, " Machine check polls\n"); |
128 | #endif | 128 | #endif |
129 | #if IS_ENABLED(CONFIG_HYPERV) || defined(CONFIG_XEN) | 129 | #if IS_ENABLED(CONFIG_HYPERV) || defined(CONFIG_XEN) |
130 | seq_printf(p, "%*s: ", prec, "THR"); | 130 | seq_printf(p, "%*s: ", prec, "HYP"); |
131 | for_each_online_cpu(j) | 131 | for_each_online_cpu(j) |
132 | seq_printf(p, "%10u ", irq_stats(j)->irq_hv_callback_count); | 132 | seq_printf(p, "%10u ", irq_stats(j)->irq_hv_callback_count); |
133 | seq_puts(p, " Hypervisor callback interrupts\n"); | 133 | seq_puts(p, " Hypervisor callback interrupts\n"); |
diff --git a/arch/x86/kernel/kprobes/core.c b/arch/x86/kernel/kprobes/core.c index f7e3cd50ece0..98f654d466e5 100644 --- a/arch/x86/kernel/kprobes/core.c +++ b/arch/x86/kernel/kprobes/core.c | |||
@@ -1020,6 +1020,15 @@ int setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs) | |||
1020 | regs->flags &= ~X86_EFLAGS_IF; | 1020 | regs->flags &= ~X86_EFLAGS_IF; |
1021 | trace_hardirqs_off(); | 1021 | trace_hardirqs_off(); |
1022 | regs->ip = (unsigned long)(jp->entry); | 1022 | regs->ip = (unsigned long)(jp->entry); |
1023 | |||
1024 | /* | ||
1025 | * jprobes use jprobe_return() which skips the normal return | ||
1026 | * path of the function, and this messes up the accounting of the | ||
1027 | * function graph tracer to get messed up. | ||
1028 | * | ||
1029 | * Pause function graph tracing while performing the jprobe function. | ||
1030 | */ | ||
1031 | pause_graph_tracing(); | ||
1023 | return 1; | 1032 | return 1; |
1024 | } | 1033 | } |
1025 | NOKPROBE_SYMBOL(setjmp_pre_handler); | 1034 | NOKPROBE_SYMBOL(setjmp_pre_handler); |
@@ -1048,24 +1057,25 @@ int longjmp_break_handler(struct kprobe *p, struct pt_regs *regs) | |||
1048 | struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); | 1057 | struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); |
1049 | u8 *addr = (u8 *) (regs->ip - 1); | 1058 | u8 *addr = (u8 *) (regs->ip - 1); |
1050 | struct jprobe *jp = container_of(p, struct jprobe, kp); | 1059 | struct jprobe *jp = container_of(p, struct jprobe, kp); |
1060 | void *saved_sp = kcb->jprobe_saved_sp; | ||
1051 | 1061 | ||
1052 | if ((addr > (u8 *) jprobe_return) && | 1062 | if ((addr > (u8 *) jprobe_return) && |
1053 | (addr < (u8 *) jprobe_return_end)) { | 1063 | (addr < (u8 *) jprobe_return_end)) { |
1054 | if (stack_addr(regs) != kcb->jprobe_saved_sp) { | 1064 | if (stack_addr(regs) != saved_sp) { |
1055 | struct pt_regs *saved_regs = &kcb->jprobe_saved_regs; | 1065 | struct pt_regs *saved_regs = &kcb->jprobe_saved_regs; |
1056 | printk(KERN_ERR | 1066 | printk(KERN_ERR |
1057 | "current sp %p does not match saved sp %p\n", | 1067 | "current sp %p does not match saved sp %p\n", |
1058 | stack_addr(regs), kcb->jprobe_saved_sp); | 1068 | stack_addr(regs), saved_sp); |
1059 | printk(KERN_ERR "Saved registers for jprobe %p\n", jp); | 1069 | printk(KERN_ERR "Saved registers for jprobe %p\n", jp); |
1060 | show_regs(saved_regs); | 1070 | show_regs(saved_regs); |
1061 | printk(KERN_ERR "Current registers\n"); | 1071 | printk(KERN_ERR "Current registers\n"); |
1062 | show_regs(regs); | 1072 | show_regs(regs); |
1063 | BUG(); | 1073 | BUG(); |
1064 | } | 1074 | } |
1075 | /* It's OK to start function graph tracing again */ | ||
1076 | unpause_graph_tracing(); | ||
1065 | *regs = kcb->jprobe_saved_regs; | 1077 | *regs = kcb->jprobe_saved_regs; |
1066 | memcpy((kprobe_opcode_t *)(kcb->jprobe_saved_sp), | 1078 | memcpy(saved_sp, kcb->jprobes_stack, MIN_STACK_SIZE(saved_sp)); |
1067 | kcb->jprobes_stack, | ||
1068 | MIN_STACK_SIZE(kcb->jprobe_saved_sp)); | ||
1069 | preempt_enable_no_resched(); | 1079 | preempt_enable_no_resched(); |
1070 | return 1; | 1080 | return 1; |
1071 | } | 1081 | } |
diff --git a/arch/x86/kernel/tls.c b/arch/x86/kernel/tls.c index 4e942f31b1a7..7fc5e843f247 100644 --- a/arch/x86/kernel/tls.c +++ b/arch/x86/kernel/tls.c | |||
@@ -29,7 +29,28 @@ static int get_free_idx(void) | |||
29 | 29 | ||
30 | static bool tls_desc_okay(const struct user_desc *info) | 30 | static bool tls_desc_okay(const struct user_desc *info) |
31 | { | 31 | { |
32 | if (LDT_empty(info)) | 32 | /* |
33 | * For historical reasons (i.e. no one ever documented how any | ||
34 | * of the segmentation APIs work), user programs can and do | ||
35 | * assume that a struct user_desc that's all zeros except for | ||
36 | * entry_number means "no segment at all". This never actually | ||
37 | * worked. In fact, up to Linux 3.19, a struct user_desc like | ||
38 | * this would create a 16-bit read-write segment with base and | ||
39 | * limit both equal to zero. | ||
40 | * | ||
41 | * That was close enough to "no segment at all" until we | ||
42 | * hardened this function to disallow 16-bit TLS segments. Fix | ||
43 | * it up by interpreting these zeroed segments the way that they | ||
44 | * were almost certainly intended to be interpreted. | ||
45 | * | ||
46 | * The correct way to ask for "no segment at all" is to specify | ||
47 | * a user_desc that satisfies LDT_empty. To keep everything | ||
48 | * working, we accept both. | ||
49 | * | ||
50 | * Note that there's a similar kludge in modify_ldt -- look at | ||
51 | * the distinction between modes 1 and 0x11. | ||
52 | */ | ||
53 | if (LDT_empty(info) || LDT_zero(info)) | ||
33 | return true; | 54 | return true; |
34 | 55 | ||
35 | /* | 56 | /* |
@@ -71,7 +92,7 @@ static void set_tls_desc(struct task_struct *p, int idx, | |||
71 | cpu = get_cpu(); | 92 | cpu = get_cpu(); |
72 | 93 | ||
73 | while (n-- > 0) { | 94 | while (n-- > 0) { |
74 | if (LDT_empty(info)) | 95 | if (LDT_empty(info) || LDT_zero(info)) |
75 | desc->a = desc->b = 0; | 96 | desc->a = desc->b = 0; |
76 | else | 97 | else |
77 | fill_ldt(desc, info); | 98 | fill_ldt(desc, info); |
diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index b7e50bba3bbb..505449700e0c 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c | |||
@@ -617,7 +617,7 @@ static unsigned long quick_pit_calibrate(void) | |||
617 | goto success; | 617 | goto success; |
618 | } | 618 | } |
619 | } | 619 | } |
620 | pr_err("Fast TSC calibration failed\n"); | 620 | pr_info("Fast TSC calibration failed\n"); |
621 | return 0; | 621 | return 0; |
622 | 622 | ||
623 | success: | 623 | success: |
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index 169b09d76ddd..de12c1d379f1 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c | |||
@@ -2348,7 +2348,7 @@ static int em_sysenter(struct x86_emulate_ctxt *ctxt) | |||
2348 | * Not recognized on AMD in compat mode (but is recognized in legacy | 2348 | * Not recognized on AMD in compat mode (but is recognized in legacy |
2349 | * mode). | 2349 | * mode). |
2350 | */ | 2350 | */ |
2351 | if ((ctxt->mode == X86EMUL_MODE_PROT32) && (efer & EFER_LMA) | 2351 | if ((ctxt->mode != X86EMUL_MODE_PROT64) && (efer & EFER_LMA) |
2352 | && !vendor_intel(ctxt)) | 2352 | && !vendor_intel(ctxt)) |
2353 | return emulate_ud(ctxt); | 2353 | return emulate_ud(ctxt); |
2354 | 2354 | ||
@@ -2359,25 +2359,13 @@ static int em_sysenter(struct x86_emulate_ctxt *ctxt) | |||
2359 | setup_syscalls_segments(ctxt, &cs, &ss); | 2359 | setup_syscalls_segments(ctxt, &cs, &ss); |
2360 | 2360 | ||
2361 | ops->get_msr(ctxt, MSR_IA32_SYSENTER_CS, &msr_data); | 2361 | ops->get_msr(ctxt, MSR_IA32_SYSENTER_CS, &msr_data); |
2362 | switch (ctxt->mode) { | 2362 | if ((msr_data & 0xfffc) == 0x0) |
2363 | case X86EMUL_MODE_PROT32: | 2363 | return emulate_gp(ctxt, 0); |
2364 | if ((msr_data & 0xfffc) == 0x0) | ||
2365 | return emulate_gp(ctxt, 0); | ||
2366 | break; | ||
2367 | case X86EMUL_MODE_PROT64: | ||
2368 | if (msr_data == 0x0) | ||
2369 | return emulate_gp(ctxt, 0); | ||
2370 | break; | ||
2371 | default: | ||
2372 | break; | ||
2373 | } | ||
2374 | 2364 | ||
2375 | ctxt->eflags &= ~(EFLG_VM | EFLG_IF); | 2365 | ctxt->eflags &= ~(EFLG_VM | EFLG_IF); |
2376 | cs_sel = (u16)msr_data; | 2366 | cs_sel = (u16)msr_data & ~SELECTOR_RPL_MASK; |
2377 | cs_sel &= ~SELECTOR_RPL_MASK; | ||
2378 | ss_sel = cs_sel + 8; | 2367 | ss_sel = cs_sel + 8; |
2379 | ss_sel &= ~SELECTOR_RPL_MASK; | 2368 | if (efer & EFER_LMA) { |
2380 | if (ctxt->mode == X86EMUL_MODE_PROT64 || (efer & EFER_LMA)) { | ||
2381 | cs.d = 0; | 2369 | cs.d = 0; |
2382 | cs.l = 1; | 2370 | cs.l = 1; |
2383 | } | 2371 | } |
@@ -2386,10 +2374,11 @@ static int em_sysenter(struct x86_emulate_ctxt *ctxt) | |||
2386 | ops->set_segment(ctxt, ss_sel, &ss, 0, VCPU_SREG_SS); | 2374 | ops->set_segment(ctxt, ss_sel, &ss, 0, VCPU_SREG_SS); |
2387 | 2375 | ||
2388 | ops->get_msr(ctxt, MSR_IA32_SYSENTER_EIP, &msr_data); | 2376 | ops->get_msr(ctxt, MSR_IA32_SYSENTER_EIP, &msr_data); |
2389 | ctxt->_eip = msr_data; | 2377 | ctxt->_eip = (efer & EFER_LMA) ? msr_data : (u32)msr_data; |
2390 | 2378 | ||
2391 | ops->get_msr(ctxt, MSR_IA32_SYSENTER_ESP, &msr_data); | 2379 | ops->get_msr(ctxt, MSR_IA32_SYSENTER_ESP, &msr_data); |
2392 | *reg_write(ctxt, VCPU_REGS_RSP) = msr_data; | 2380 | *reg_write(ctxt, VCPU_REGS_RSP) = (efer & EFER_LMA) ? msr_data : |
2381 | (u32)msr_data; | ||
2393 | 2382 | ||
2394 | return X86EMUL_CONTINUE; | 2383 | return X86EMUL_CONTINUE; |
2395 | } | 2384 | } |
@@ -3791,8 +3780,8 @@ static const struct opcode group5[] = { | |||
3791 | }; | 3780 | }; |
3792 | 3781 | ||
3793 | static const struct opcode group6[] = { | 3782 | static const struct opcode group6[] = { |
3794 | DI(Prot, sldt), | 3783 | DI(Prot | DstMem, sldt), |
3795 | DI(Prot, str), | 3784 | DI(Prot | DstMem, str), |
3796 | II(Prot | Priv | SrcMem16, em_lldt, lldt), | 3785 | II(Prot | Priv | SrcMem16, em_lldt, lldt), |
3797 | II(Prot | Priv | SrcMem16, em_ltr, ltr), | 3786 | II(Prot | Priv | SrcMem16, em_ltr, ltr), |
3798 | N, N, N, N, | 3787 | N, N, N, N, |
diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c index 08a7d313538a..079c3b6a3ff1 100644 --- a/arch/x86/mm/init.c +++ b/arch/x86/mm/init.c | |||
@@ -43,7 +43,7 @@ uint16_t __cachemode2pte_tbl[_PAGE_CACHE_MODE_NUM] = { | |||
43 | [_PAGE_CACHE_MODE_WT] = _PAGE_PCD, | 43 | [_PAGE_CACHE_MODE_WT] = _PAGE_PCD, |
44 | [_PAGE_CACHE_MODE_WP] = _PAGE_PCD, | 44 | [_PAGE_CACHE_MODE_WP] = _PAGE_PCD, |
45 | }; | 45 | }; |
46 | EXPORT_SYMBOL_GPL(__cachemode2pte_tbl); | 46 | EXPORT_SYMBOL(__cachemode2pte_tbl); |
47 | uint8_t __pte2cachemode_tbl[8] = { | 47 | uint8_t __pte2cachemode_tbl[8] = { |
48 | [__pte2cm_idx(0)] = _PAGE_CACHE_MODE_WB, | 48 | [__pte2cm_idx(0)] = _PAGE_CACHE_MODE_WB, |
49 | [__pte2cm_idx(_PAGE_PWT)] = _PAGE_CACHE_MODE_WC, | 49 | [__pte2cm_idx(_PAGE_PWT)] = _PAGE_CACHE_MODE_WC, |
@@ -54,7 +54,7 @@ uint8_t __pte2cachemode_tbl[8] = { | |||
54 | [__pte2cm_idx(_PAGE_PCD | _PAGE_PAT)] = _PAGE_CACHE_MODE_UC_MINUS, | 54 | [__pte2cm_idx(_PAGE_PCD | _PAGE_PAT)] = _PAGE_CACHE_MODE_UC_MINUS, |
55 | [__pte2cm_idx(_PAGE_PWT | _PAGE_PCD | _PAGE_PAT)] = _PAGE_CACHE_MODE_UC, | 55 | [__pte2cm_idx(_PAGE_PWT | _PAGE_PCD | _PAGE_PAT)] = _PAGE_CACHE_MODE_UC, |
56 | }; | 56 | }; |
57 | EXPORT_SYMBOL_GPL(__pte2cachemode_tbl); | 57 | EXPORT_SYMBOL(__pte2cachemode_tbl); |
58 | 58 | ||
59 | static unsigned long __initdata pgt_buf_start; | 59 | static unsigned long __initdata pgt_buf_start; |
60 | static unsigned long __initdata pgt_buf_end; | 60 | static unsigned long __initdata pgt_buf_end; |
diff --git a/arch/x86/mm/mpx.c b/arch/x86/mm/mpx.c index 67ebf5751222..c439ec478216 100644 --- a/arch/x86/mm/mpx.c +++ b/arch/x86/mm/mpx.c | |||
@@ -349,6 +349,12 @@ static __user void *task_get_bounds_dir(struct task_struct *tsk) | |||
349 | return MPX_INVALID_BOUNDS_DIR; | 349 | return MPX_INVALID_BOUNDS_DIR; |
350 | 350 | ||
351 | /* | 351 | /* |
352 | * 32-bit binaries on 64-bit kernels are currently | ||
353 | * unsupported. | ||
354 | */ | ||
355 | if (IS_ENABLED(CONFIG_X86_64) && test_thread_flag(TIF_IA32)) | ||
356 | return MPX_INVALID_BOUNDS_DIR; | ||
357 | /* | ||
352 | * The bounds directory pointer is stored in a register | 358 | * The bounds directory pointer is stored in a register |
353 | * only accessible if we first do an xsave. | 359 | * only accessible if we first do an xsave. |
354 | */ | 360 | */ |
diff --git a/arch/x86/mm/pat.c b/arch/x86/mm/pat.c index edf299c8ff6c..7ac68698406c 100644 --- a/arch/x86/mm/pat.c +++ b/arch/x86/mm/pat.c | |||
@@ -234,8 +234,13 @@ void pat_init(void) | |||
234 | PAT(4, WB) | PAT(5, WC) | PAT(6, UC_MINUS) | PAT(7, UC); | 234 | PAT(4, WB) | PAT(5, WC) | PAT(6, UC_MINUS) | PAT(7, UC); |
235 | 235 | ||
236 | /* Boot CPU check */ | 236 | /* Boot CPU check */ |
237 | if (!boot_pat_state) | 237 | if (!boot_pat_state) { |
238 | rdmsrl(MSR_IA32_CR_PAT, boot_pat_state); | 238 | rdmsrl(MSR_IA32_CR_PAT, boot_pat_state); |
239 | if (!boot_pat_state) { | ||
240 | pat_disable("PAT read returns always zero, disabled."); | ||
241 | return; | ||
242 | } | ||
243 | } | ||
239 | 244 | ||
240 | wrmsrl(MSR_IA32_CR_PAT, pat); | 245 | wrmsrl(MSR_IA32_CR_PAT, pat); |
241 | 246 | ||
diff --git a/arch/x86/pci/i386.c b/arch/x86/pci/i386.c index 9b18ef315a55..349c0d32cc0b 100644 --- a/arch/x86/pci/i386.c +++ b/arch/x86/pci/i386.c | |||
@@ -216,7 +216,7 @@ static void pcibios_allocate_bridge_resources(struct pci_dev *dev) | |||
216 | continue; | 216 | continue; |
217 | if (r->parent) /* Already allocated */ | 217 | if (r->parent) /* Already allocated */ |
218 | continue; | 218 | continue; |
219 | if (!r->start || pci_claim_resource(dev, idx) < 0) { | 219 | if (!r->start || pci_claim_bridge_resource(dev, idx) < 0) { |
220 | /* | 220 | /* |
221 | * Something is wrong with the region. | 221 | * Something is wrong with the region. |
222 | * Invalidate the resource to prevent | 222 | * Invalidate the resource to prevent |
diff --git a/arch/x86/pci/xen.c b/arch/x86/pci/xen.c index c489ef2c1a39..9098d880c476 100644 --- a/arch/x86/pci/xen.c +++ b/arch/x86/pci/xen.c | |||
@@ -458,6 +458,7 @@ int __init pci_xen_hvm_init(void) | |||
458 | * just how GSIs get registered. | 458 | * just how GSIs get registered. |
459 | */ | 459 | */ |
460 | __acpi_register_gsi = acpi_register_gsi_xen_hvm; | 460 | __acpi_register_gsi = acpi_register_gsi_xen_hvm; |
461 | __acpi_unregister_gsi = NULL; | ||
461 | #endif | 462 | #endif |
462 | 463 | ||
463 | #ifdef CONFIG_PCI_MSI | 464 | #ifdef CONFIG_PCI_MSI |
@@ -471,52 +472,6 @@ int __init pci_xen_hvm_init(void) | |||
471 | } | 472 | } |
472 | 473 | ||
473 | #ifdef CONFIG_XEN_DOM0 | 474 | #ifdef CONFIG_XEN_DOM0 |
474 | static __init void xen_setup_acpi_sci(void) | ||
475 | { | ||
476 | int rc; | ||
477 | int trigger, polarity; | ||
478 | int gsi = acpi_sci_override_gsi; | ||
479 | int irq = -1; | ||
480 | int gsi_override = -1; | ||
481 | |||
482 | if (!gsi) | ||
483 | return; | ||
484 | |||
485 | rc = acpi_get_override_irq(gsi, &trigger, &polarity); | ||
486 | if (rc) { | ||
487 | printk(KERN_WARNING "xen: acpi_get_override_irq failed for acpi" | ||
488 | " sci, rc=%d\n", rc); | ||
489 | return; | ||
490 | } | ||
491 | trigger = trigger ? ACPI_LEVEL_SENSITIVE : ACPI_EDGE_SENSITIVE; | ||
492 | polarity = polarity ? ACPI_ACTIVE_LOW : ACPI_ACTIVE_HIGH; | ||
493 | |||
494 | printk(KERN_INFO "xen: sci override: global_irq=%d trigger=%d " | ||
495 | "polarity=%d\n", gsi, trigger, polarity); | ||
496 | |||
497 | /* Before we bind the GSI to a Linux IRQ, check whether | ||
498 | * we need to override it with bus_irq (IRQ) value. Usually for | ||
499 | * IRQs below IRQ_LEGACY_IRQ this holds IRQ == GSI, as so: | ||
500 | * ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 low level) | ||
501 | * but there are oddballs where the IRQ != GSI: | ||
502 | * ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 20 low level) | ||
503 | * which ends up being: gsi_to_irq[9] == 20 | ||
504 | * (which is what acpi_gsi_to_irq ends up calling when starting the | ||
505 | * the ACPI interpreter and keels over since IRQ 9 has not been | ||
506 | * setup as we had setup IRQ 20 for it). | ||
507 | */ | ||
508 | if (acpi_gsi_to_irq(gsi, &irq) == 0) { | ||
509 | /* Use the provided value if it's valid. */ | ||
510 | if (irq >= 0) | ||
511 | gsi_override = irq; | ||
512 | } | ||
513 | |||
514 | gsi = xen_register_gsi(gsi, gsi_override, trigger, polarity); | ||
515 | printk(KERN_INFO "xen: acpi sci %d\n", gsi); | ||
516 | |||
517 | return; | ||
518 | } | ||
519 | |||
520 | int __init pci_xen_initial_domain(void) | 475 | int __init pci_xen_initial_domain(void) |
521 | { | 476 | { |
522 | int irq; | 477 | int irq; |
@@ -527,8 +482,8 @@ int __init pci_xen_initial_domain(void) | |||
527 | x86_msi.restore_msi_irqs = xen_initdom_restore_msi_irqs; | 482 | x86_msi.restore_msi_irqs = xen_initdom_restore_msi_irqs; |
528 | pci_msi_ignore_mask = 1; | 483 | pci_msi_ignore_mask = 1; |
529 | #endif | 484 | #endif |
530 | xen_setup_acpi_sci(); | ||
531 | __acpi_register_gsi = acpi_register_gsi_xen; | 485 | __acpi_register_gsi = acpi_register_gsi_xen; |
486 | __acpi_unregister_gsi = NULL; | ||
532 | /* Pre-allocate legacy irqs */ | 487 | /* Pre-allocate legacy irqs */ |
533 | for (irq = 0; irq < nr_legacy_irqs(); irq++) { | 488 | for (irq = 0; irq < nr_legacy_irqs(); irq++) { |
534 | int trigger, polarity; | 489 | int trigger, polarity; |
diff --git a/arch/x86/tools/calc_run_size.pl b/arch/x86/tools/calc_run_size.pl deleted file mode 100644 index 23210baade2d..000000000000 --- a/arch/x86/tools/calc_run_size.pl +++ /dev/null | |||
@@ -1,39 +0,0 @@ | |||
1 | #!/usr/bin/perl | ||
2 | # | ||
3 | # Calculate the amount of space needed to run the kernel, including room for | ||
4 | # the .bss and .brk sections. | ||
5 | # | ||
6 | # Usage: | ||
7 | # objdump -h a.out | perl calc_run_size.pl | ||
8 | use strict; | ||
9 | |||
10 | my $mem_size = 0; | ||
11 | my $file_offset = 0; | ||
12 | |||
13 | my $sections=" *[0-9]+ \.(?:bss|brk) +"; | ||
14 | while (<>) { | ||
15 | if (/^$sections([0-9a-f]+) +(?:[0-9a-f]+ +){2}([0-9a-f]+)/) { | ||
16 | my $size = hex($1); | ||
17 | my $offset = hex($2); | ||
18 | $mem_size += $size; | ||
19 | if ($file_offset == 0) { | ||
20 | $file_offset = $offset; | ||
21 | } elsif ($file_offset != $offset) { | ||
22 | # BFD linker shows the same file offset in ELF. | ||
23 | # Gold linker shows them as consecutive. | ||
24 | next if ($file_offset + $mem_size == $offset + $size); | ||
25 | |||
26 | printf STDERR "file_offset: 0x%lx\n", $file_offset; | ||
27 | printf STDERR "mem_size: 0x%lx\n", $mem_size; | ||
28 | printf STDERR "offset: 0x%lx\n", $offset; | ||
29 | printf STDERR "size: 0x%lx\n", $size; | ||
30 | |||
31 | die ".bss and .brk are non-contiguous\n"; | ||
32 | } | ||
33 | } | ||
34 | } | ||
35 | |||
36 | if ($file_offset == 0) { | ||
37 | die "Never found .bss or .brk file offset\n"; | ||
38 | } | ||
39 | printf("%d\n", $mem_size + $file_offset); | ||
diff --git a/arch/x86/tools/calc_run_size.sh b/arch/x86/tools/calc_run_size.sh new file mode 100644 index 000000000000..1a4c17bb3910 --- /dev/null +++ b/arch/x86/tools/calc_run_size.sh | |||
@@ -0,0 +1,42 @@ | |||
1 | #!/bin/sh | ||
2 | # | ||
3 | # Calculate the amount of space needed to run the kernel, including room for | ||
4 | # the .bss and .brk sections. | ||
5 | # | ||
6 | # Usage: | ||
7 | # objdump -h a.out | sh calc_run_size.sh | ||
8 | |||
9 | NUM='\([0-9a-fA-F]*[ \t]*\)' | ||
10 | OUT=$(sed -n 's/^[ \t0-9]*.b[sr][sk][ \t]*'"$NUM$NUM$NUM$NUM"'.*/\1\4/p') | ||
11 | if [ -z "$OUT" ] ; then | ||
12 | echo "Never found .bss or .brk file offset" >&2 | ||
13 | exit 1 | ||
14 | fi | ||
15 | |||
16 | OUT=$(echo ${OUT# }) | ||
17 | sizeA=$(printf "%d" 0x${OUT%% *}) | ||
18 | OUT=${OUT#* } | ||
19 | offsetA=$(printf "%d" 0x${OUT%% *}) | ||
20 | OUT=${OUT#* } | ||
21 | sizeB=$(printf "%d" 0x${OUT%% *}) | ||
22 | OUT=${OUT#* } | ||
23 | offsetB=$(printf "%d" 0x${OUT%% *}) | ||
24 | |||
25 | run_size=$(( $offsetA + $sizeA + $sizeB )) | ||
26 | |||
27 | # BFD linker shows the same file offset in ELF. | ||
28 | if [ "$offsetA" -ne "$offsetB" ] ; then | ||
29 | # Gold linker shows them as consecutive. | ||
30 | endB=$(( $offsetB + $sizeB )) | ||
31 | if [ "$endB" != "$run_size" ] ; then | ||
32 | printf "sizeA: 0x%x\n" $sizeA >&2 | ||
33 | printf "offsetA: 0x%x\n" $offsetA >&2 | ||
34 | printf "sizeB: 0x%x\n" $sizeB >&2 | ||
35 | printf "offsetB: 0x%x\n" $offsetB >&2 | ||
36 | echo ".bss and .brk are non-contiguous" >&2 | ||
37 | exit 1 | ||
38 | fi | ||
39 | fi | ||
40 | |||
41 | printf "%d\n" $run_size | ||
42 | exit 0 | ||
diff --git a/block/blk-mq-sysfs.c b/block/blk-mq-sysfs.c index 1630a20d5dcf..6774a0e69867 100644 --- a/block/blk-mq-sysfs.c +++ b/block/blk-mq-sysfs.c | |||
@@ -15,6 +15,26 @@ | |||
15 | 15 | ||
16 | static void blk_mq_sysfs_release(struct kobject *kobj) | 16 | static void blk_mq_sysfs_release(struct kobject *kobj) |
17 | { | 17 | { |
18 | struct request_queue *q; | ||
19 | |||
20 | q = container_of(kobj, struct request_queue, mq_kobj); | ||
21 | free_percpu(q->queue_ctx); | ||
22 | } | ||
23 | |||
24 | static void blk_mq_ctx_release(struct kobject *kobj) | ||
25 | { | ||
26 | struct blk_mq_ctx *ctx; | ||
27 | |||
28 | ctx = container_of(kobj, struct blk_mq_ctx, kobj); | ||
29 | kobject_put(&ctx->queue->mq_kobj); | ||
30 | } | ||
31 | |||
32 | static void blk_mq_hctx_release(struct kobject *kobj) | ||
33 | { | ||
34 | struct blk_mq_hw_ctx *hctx; | ||
35 | |||
36 | hctx = container_of(kobj, struct blk_mq_hw_ctx, kobj); | ||
37 | kfree(hctx); | ||
18 | } | 38 | } |
19 | 39 | ||
20 | struct blk_mq_ctx_sysfs_entry { | 40 | struct blk_mq_ctx_sysfs_entry { |
@@ -318,13 +338,13 @@ static struct kobj_type blk_mq_ktype = { | |||
318 | static struct kobj_type blk_mq_ctx_ktype = { | 338 | static struct kobj_type blk_mq_ctx_ktype = { |
319 | .sysfs_ops = &blk_mq_sysfs_ops, | 339 | .sysfs_ops = &blk_mq_sysfs_ops, |
320 | .default_attrs = default_ctx_attrs, | 340 | .default_attrs = default_ctx_attrs, |
321 | .release = blk_mq_sysfs_release, | 341 | .release = blk_mq_ctx_release, |
322 | }; | 342 | }; |
323 | 343 | ||
324 | static struct kobj_type blk_mq_hw_ktype = { | 344 | static struct kobj_type blk_mq_hw_ktype = { |
325 | .sysfs_ops = &blk_mq_hw_sysfs_ops, | 345 | .sysfs_ops = &blk_mq_hw_sysfs_ops, |
326 | .default_attrs = default_hw_ctx_attrs, | 346 | .default_attrs = default_hw_ctx_attrs, |
327 | .release = blk_mq_sysfs_release, | 347 | .release = blk_mq_hctx_release, |
328 | }; | 348 | }; |
329 | 349 | ||
330 | static void blk_mq_unregister_hctx(struct blk_mq_hw_ctx *hctx) | 350 | static void blk_mq_unregister_hctx(struct blk_mq_hw_ctx *hctx) |
@@ -355,6 +375,7 @@ static int blk_mq_register_hctx(struct blk_mq_hw_ctx *hctx) | |||
355 | return ret; | 375 | return ret; |
356 | 376 | ||
357 | hctx_for_each_ctx(hctx, ctx, i) { | 377 | hctx_for_each_ctx(hctx, ctx, i) { |
378 | kobject_get(&q->mq_kobj); | ||
358 | ret = kobject_add(&ctx->kobj, &hctx->kobj, "cpu%u", ctx->cpu); | 379 | ret = kobject_add(&ctx->kobj, &hctx->kobj, "cpu%u", ctx->cpu); |
359 | if (ret) | 380 | if (ret) |
360 | break; | 381 | break; |
diff --git a/block/blk-mq.c b/block/blk-mq.c index 2f95747c287e..9ee3b87c4498 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c | |||
@@ -1641,10 +1641,8 @@ static void blk_mq_free_hw_queues(struct request_queue *q, | |||
1641 | struct blk_mq_hw_ctx *hctx; | 1641 | struct blk_mq_hw_ctx *hctx; |
1642 | unsigned int i; | 1642 | unsigned int i; |
1643 | 1643 | ||
1644 | queue_for_each_hw_ctx(q, hctx, i) { | 1644 | queue_for_each_hw_ctx(q, hctx, i) |
1645 | free_cpumask_var(hctx->cpumask); | 1645 | free_cpumask_var(hctx->cpumask); |
1646 | kfree(hctx); | ||
1647 | } | ||
1648 | } | 1646 | } |
1649 | 1647 | ||
1650 | static int blk_mq_init_hctx(struct request_queue *q, | 1648 | static int blk_mq_init_hctx(struct request_queue *q, |
@@ -2002,11 +2000,9 @@ void blk_mq_free_queue(struct request_queue *q) | |||
2002 | 2000 | ||
2003 | percpu_ref_exit(&q->mq_usage_counter); | 2001 | percpu_ref_exit(&q->mq_usage_counter); |
2004 | 2002 | ||
2005 | free_percpu(q->queue_ctx); | ||
2006 | kfree(q->queue_hw_ctx); | 2003 | kfree(q->queue_hw_ctx); |
2007 | kfree(q->mq_map); | 2004 | kfree(q->mq_map); |
2008 | 2005 | ||
2009 | q->queue_ctx = NULL; | ||
2010 | q->queue_hw_ctx = NULL; | 2006 | q->queue_hw_ctx = NULL; |
2011 | q->mq_map = NULL; | 2007 | q->mq_map = NULL; |
2012 | 2008 | ||
diff --git a/crypto/aes_generic.c b/crypto/aes_generic.c index 9b3c54c1cbe8..3dd101144a58 100644 --- a/crypto/aes_generic.c +++ b/crypto/aes_generic.c | |||
@@ -1475,3 +1475,4 @@ module_exit(aes_fini); | |||
1475 | MODULE_DESCRIPTION("Rijndael (AES) Cipher Algorithm"); | 1475 | MODULE_DESCRIPTION("Rijndael (AES) Cipher Algorithm"); |
1476 | MODULE_LICENSE("Dual BSD/GPL"); | 1476 | MODULE_LICENSE("Dual BSD/GPL"); |
1477 | MODULE_ALIAS_CRYPTO("aes"); | 1477 | MODULE_ALIAS_CRYPTO("aes"); |
1478 | MODULE_ALIAS_CRYPTO("aes-generic"); | ||
diff --git a/crypto/ansi_cprng.c b/crypto/ansi_cprng.c index b4485a108389..6f5bebc9bf01 100644 --- a/crypto/ansi_cprng.c +++ b/crypto/ansi_cprng.c | |||
@@ -477,3 +477,4 @@ MODULE_PARM_DESC(dbg, "Boolean to enable debugging (0/1 == off/on)"); | |||
477 | module_init(prng_mod_init); | 477 | module_init(prng_mod_init); |
478 | module_exit(prng_mod_fini); | 478 | module_exit(prng_mod_fini); |
479 | MODULE_ALIAS_CRYPTO("stdrng"); | 479 | MODULE_ALIAS_CRYPTO("stdrng"); |
480 | MODULE_ALIAS_CRYPTO("ansi_cprng"); | ||
diff --git a/crypto/blowfish_generic.c b/crypto/blowfish_generic.c index 7bd71f02d0dd..87b392a77a93 100644 --- a/crypto/blowfish_generic.c +++ b/crypto/blowfish_generic.c | |||
@@ -139,3 +139,4 @@ module_exit(blowfish_mod_fini); | |||
139 | MODULE_LICENSE("GPL"); | 139 | MODULE_LICENSE("GPL"); |
140 | MODULE_DESCRIPTION("Blowfish Cipher Algorithm"); | 140 | MODULE_DESCRIPTION("Blowfish Cipher Algorithm"); |
141 | MODULE_ALIAS_CRYPTO("blowfish"); | 141 | MODULE_ALIAS_CRYPTO("blowfish"); |
142 | MODULE_ALIAS_CRYPTO("blowfish-generic"); | ||
diff --git a/crypto/camellia_generic.c b/crypto/camellia_generic.c index 1b74c5a3e891..a02286bf319e 100644 --- a/crypto/camellia_generic.c +++ b/crypto/camellia_generic.c | |||
@@ -1099,3 +1099,4 @@ module_exit(camellia_fini); | |||
1099 | MODULE_DESCRIPTION("Camellia Cipher Algorithm"); | 1099 | MODULE_DESCRIPTION("Camellia Cipher Algorithm"); |
1100 | MODULE_LICENSE("GPL"); | 1100 | MODULE_LICENSE("GPL"); |
1101 | MODULE_ALIAS_CRYPTO("camellia"); | 1101 | MODULE_ALIAS_CRYPTO("camellia"); |
1102 | MODULE_ALIAS_CRYPTO("camellia-generic"); | ||
diff --git a/crypto/cast5_generic.c b/crypto/cast5_generic.c index 84c86db67ec7..df5c72629383 100644 --- a/crypto/cast5_generic.c +++ b/crypto/cast5_generic.c | |||
@@ -550,3 +550,4 @@ module_exit(cast5_mod_fini); | |||
550 | MODULE_LICENSE("GPL"); | 550 | MODULE_LICENSE("GPL"); |
551 | MODULE_DESCRIPTION("Cast5 Cipher Algorithm"); | 551 | MODULE_DESCRIPTION("Cast5 Cipher Algorithm"); |
552 | MODULE_ALIAS_CRYPTO("cast5"); | 552 | MODULE_ALIAS_CRYPTO("cast5"); |
553 | MODULE_ALIAS_CRYPTO("cast5-generic"); | ||
diff --git a/crypto/cast6_generic.c b/crypto/cast6_generic.c index f408f0bd8de2..058c8d755d03 100644 --- a/crypto/cast6_generic.c +++ b/crypto/cast6_generic.c | |||
@@ -292,3 +292,4 @@ module_exit(cast6_mod_fini); | |||
292 | MODULE_LICENSE("GPL"); | 292 | MODULE_LICENSE("GPL"); |
293 | MODULE_DESCRIPTION("Cast6 Cipher Algorithm"); | 293 | MODULE_DESCRIPTION("Cast6 Cipher Algorithm"); |
294 | MODULE_ALIAS_CRYPTO("cast6"); | 294 | MODULE_ALIAS_CRYPTO("cast6"); |
295 | MODULE_ALIAS_CRYPTO("cast6-generic"); | ||
diff --git a/crypto/crc32c_generic.c b/crypto/crc32c_generic.c index 2a062025749d..06f1b60f02b2 100644 --- a/crypto/crc32c_generic.c +++ b/crypto/crc32c_generic.c | |||
@@ -171,4 +171,5 @@ MODULE_AUTHOR("Clay Haapala <chaapala@cisco.com>"); | |||
171 | MODULE_DESCRIPTION("CRC32c (Castagnoli) calculations wrapper for lib/crc32c"); | 171 | MODULE_DESCRIPTION("CRC32c (Castagnoli) calculations wrapper for lib/crc32c"); |
172 | MODULE_LICENSE("GPL"); | 172 | MODULE_LICENSE("GPL"); |
173 | MODULE_ALIAS_CRYPTO("crc32c"); | 173 | MODULE_ALIAS_CRYPTO("crc32c"); |
174 | MODULE_ALIAS_CRYPTO("crc32c-generic"); | ||
174 | MODULE_SOFTDEP("pre: crc32c"); | 175 | MODULE_SOFTDEP("pre: crc32c"); |
diff --git a/crypto/crct10dif_generic.c b/crypto/crct10dif_generic.c index 08bb4f504520..c1229614c7e3 100644 --- a/crypto/crct10dif_generic.c +++ b/crypto/crct10dif_generic.c | |||
@@ -125,3 +125,4 @@ MODULE_AUTHOR("Tim Chen <tim.c.chen@linux.intel.com>"); | |||
125 | MODULE_DESCRIPTION("T10 DIF CRC calculation."); | 125 | MODULE_DESCRIPTION("T10 DIF CRC calculation."); |
126 | MODULE_LICENSE("GPL"); | 126 | MODULE_LICENSE("GPL"); |
127 | MODULE_ALIAS_CRYPTO("crct10dif"); | 127 | MODULE_ALIAS_CRYPTO("crct10dif"); |
128 | MODULE_ALIAS_CRYPTO("crct10dif-generic"); | ||
diff --git a/crypto/des_generic.c b/crypto/des_generic.c index 42912948776b..a71720544d11 100644 --- a/crypto/des_generic.c +++ b/crypto/des_generic.c | |||
@@ -983,8 +983,6 @@ static struct crypto_alg des_algs[2] = { { | |||
983 | .cia_decrypt = des3_ede_decrypt } } | 983 | .cia_decrypt = des3_ede_decrypt } } |
984 | } }; | 984 | } }; |
985 | 985 | ||
986 | MODULE_ALIAS_CRYPTO("des3_ede"); | ||
987 | |||
988 | static int __init des_generic_mod_init(void) | 986 | static int __init des_generic_mod_init(void) |
989 | { | 987 | { |
990 | return crypto_register_algs(des_algs, ARRAY_SIZE(des_algs)); | 988 | return crypto_register_algs(des_algs, ARRAY_SIZE(des_algs)); |
@@ -1001,4 +999,7 @@ module_exit(des_generic_mod_fini); | |||
1001 | MODULE_LICENSE("GPL"); | 999 | MODULE_LICENSE("GPL"); |
1002 | MODULE_DESCRIPTION("DES & Triple DES EDE Cipher Algorithms"); | 1000 | MODULE_DESCRIPTION("DES & Triple DES EDE Cipher Algorithms"); |
1003 | MODULE_AUTHOR("Dag Arne Osvik <da@osvik.no>"); | 1001 | MODULE_AUTHOR("Dag Arne Osvik <da@osvik.no>"); |
1004 | MODULE_ALIAS("des"); | 1002 | MODULE_ALIAS_CRYPTO("des"); |
1003 | MODULE_ALIAS_CRYPTO("des-generic"); | ||
1004 | MODULE_ALIAS_CRYPTO("des3_ede"); | ||
1005 | MODULE_ALIAS_CRYPTO("des3_ede-generic"); | ||
diff --git a/crypto/ghash-generic.c b/crypto/ghash-generic.c index 4e97fae9666f..bac70995e064 100644 --- a/crypto/ghash-generic.c +++ b/crypto/ghash-generic.c | |||
@@ -173,3 +173,4 @@ module_exit(ghash_mod_exit); | |||
173 | MODULE_LICENSE("GPL"); | 173 | MODULE_LICENSE("GPL"); |
174 | MODULE_DESCRIPTION("GHASH Message Digest Algorithm"); | 174 | MODULE_DESCRIPTION("GHASH Message Digest Algorithm"); |
175 | MODULE_ALIAS_CRYPTO("ghash"); | 175 | MODULE_ALIAS_CRYPTO("ghash"); |
176 | MODULE_ALIAS_CRYPTO("ghash-generic"); | ||
diff --git a/crypto/krng.c b/crypto/krng.c index 67c88b331210..0224841b6579 100644 --- a/crypto/krng.c +++ b/crypto/krng.c | |||
@@ -63,3 +63,4 @@ module_exit(krng_mod_fini); | |||
63 | MODULE_LICENSE("GPL"); | 63 | MODULE_LICENSE("GPL"); |
64 | MODULE_DESCRIPTION("Kernel Random Number Generator"); | 64 | MODULE_DESCRIPTION("Kernel Random Number Generator"); |
65 | MODULE_ALIAS_CRYPTO("stdrng"); | 65 | MODULE_ALIAS_CRYPTO("stdrng"); |
66 | MODULE_ALIAS_CRYPTO("krng"); | ||
diff --git a/crypto/salsa20_generic.c b/crypto/salsa20_generic.c index 3d0f9df30ac9..f550b5d94630 100644 --- a/crypto/salsa20_generic.c +++ b/crypto/salsa20_generic.c | |||
@@ -249,3 +249,4 @@ module_exit(salsa20_generic_mod_fini); | |||
249 | MODULE_LICENSE("GPL"); | 249 | MODULE_LICENSE("GPL"); |
250 | MODULE_DESCRIPTION ("Salsa20 stream cipher algorithm"); | 250 | MODULE_DESCRIPTION ("Salsa20 stream cipher algorithm"); |
251 | MODULE_ALIAS_CRYPTO("salsa20"); | 251 | MODULE_ALIAS_CRYPTO("salsa20"); |
252 | MODULE_ALIAS_CRYPTO("salsa20-generic"); | ||
diff --git a/crypto/serpent_generic.c b/crypto/serpent_generic.c index a53b5e2af335..94970a794975 100644 --- a/crypto/serpent_generic.c +++ b/crypto/serpent_generic.c | |||
@@ -667,3 +667,4 @@ MODULE_DESCRIPTION("Serpent and tnepres (kerneli compatible serpent reversed) Ci | |||
667 | MODULE_AUTHOR("Dag Arne Osvik <osvik@ii.uib.no>"); | 667 | MODULE_AUTHOR("Dag Arne Osvik <osvik@ii.uib.no>"); |
668 | MODULE_ALIAS_CRYPTO("tnepres"); | 668 | MODULE_ALIAS_CRYPTO("tnepres"); |
669 | MODULE_ALIAS_CRYPTO("serpent"); | 669 | MODULE_ALIAS_CRYPTO("serpent"); |
670 | MODULE_ALIAS_CRYPTO("serpent-generic"); | ||
diff --git a/crypto/sha1_generic.c b/crypto/sha1_generic.c index 039e58cfa155..a3e50c37eb6f 100644 --- a/crypto/sha1_generic.c +++ b/crypto/sha1_generic.c | |||
@@ -154,3 +154,4 @@ MODULE_LICENSE("GPL"); | |||
154 | MODULE_DESCRIPTION("SHA1 Secure Hash Algorithm"); | 154 | MODULE_DESCRIPTION("SHA1 Secure Hash Algorithm"); |
155 | 155 | ||
156 | MODULE_ALIAS_CRYPTO("sha1"); | 156 | MODULE_ALIAS_CRYPTO("sha1"); |
157 | MODULE_ALIAS_CRYPTO("sha1-generic"); | ||
diff --git a/crypto/sha256_generic.c b/crypto/sha256_generic.c index 5eb21b120033..b001ff5c2efc 100644 --- a/crypto/sha256_generic.c +++ b/crypto/sha256_generic.c | |||
@@ -385,4 +385,6 @@ MODULE_LICENSE("GPL"); | |||
385 | MODULE_DESCRIPTION("SHA-224 and SHA-256 Secure Hash Algorithm"); | 385 | MODULE_DESCRIPTION("SHA-224 and SHA-256 Secure Hash Algorithm"); |
386 | 386 | ||
387 | MODULE_ALIAS_CRYPTO("sha224"); | 387 | MODULE_ALIAS_CRYPTO("sha224"); |
388 | MODULE_ALIAS_CRYPTO("sha224-generic"); | ||
388 | MODULE_ALIAS_CRYPTO("sha256"); | 389 | MODULE_ALIAS_CRYPTO("sha256"); |
390 | MODULE_ALIAS_CRYPTO("sha256-generic"); | ||
diff --git a/crypto/sha512_generic.c b/crypto/sha512_generic.c index 8d0b19ed4f4b..1c3c3767e079 100644 --- a/crypto/sha512_generic.c +++ b/crypto/sha512_generic.c | |||
@@ -289,4 +289,6 @@ MODULE_LICENSE("GPL"); | |||
289 | MODULE_DESCRIPTION("SHA-512 and SHA-384 Secure Hash Algorithms"); | 289 | MODULE_DESCRIPTION("SHA-512 and SHA-384 Secure Hash Algorithms"); |
290 | 290 | ||
291 | MODULE_ALIAS_CRYPTO("sha384"); | 291 | MODULE_ALIAS_CRYPTO("sha384"); |
292 | MODULE_ALIAS_CRYPTO("sha384-generic"); | ||
292 | MODULE_ALIAS_CRYPTO("sha512"); | 293 | MODULE_ALIAS_CRYPTO("sha512"); |
294 | MODULE_ALIAS_CRYPTO("sha512-generic"); | ||
diff --git a/crypto/tea.c b/crypto/tea.c index 495be2d0077d..b70b441c7d1e 100644 --- a/crypto/tea.c +++ b/crypto/tea.c | |||
@@ -270,6 +270,7 @@ static void __exit tea_mod_fini(void) | |||
270 | crypto_unregister_algs(tea_algs, ARRAY_SIZE(tea_algs)); | 270 | crypto_unregister_algs(tea_algs, ARRAY_SIZE(tea_algs)); |
271 | } | 271 | } |
272 | 272 | ||
273 | MODULE_ALIAS_CRYPTO("tea"); | ||
273 | MODULE_ALIAS_CRYPTO("xtea"); | 274 | MODULE_ALIAS_CRYPTO("xtea"); |
274 | MODULE_ALIAS_CRYPTO("xeta"); | 275 | MODULE_ALIAS_CRYPTO("xeta"); |
275 | 276 | ||
diff --git a/crypto/tgr192.c b/crypto/tgr192.c index 6e5651c66cf8..321bc6ff2a9d 100644 --- a/crypto/tgr192.c +++ b/crypto/tgr192.c | |||
@@ -676,6 +676,7 @@ static void __exit tgr192_mod_fini(void) | |||
676 | crypto_unregister_shashes(tgr_algs, ARRAY_SIZE(tgr_algs)); | 676 | crypto_unregister_shashes(tgr_algs, ARRAY_SIZE(tgr_algs)); |
677 | } | 677 | } |
678 | 678 | ||
679 | MODULE_ALIAS_CRYPTO("tgr192"); | ||
679 | MODULE_ALIAS_CRYPTO("tgr160"); | 680 | MODULE_ALIAS_CRYPTO("tgr160"); |
680 | MODULE_ALIAS_CRYPTO("tgr128"); | 681 | MODULE_ALIAS_CRYPTO("tgr128"); |
681 | 682 | ||
diff --git a/crypto/twofish_generic.c b/crypto/twofish_generic.c index 523ad8c4e359..ebf7a3efb572 100644 --- a/crypto/twofish_generic.c +++ b/crypto/twofish_generic.c | |||
@@ -212,3 +212,4 @@ module_exit(twofish_mod_fini); | |||
212 | MODULE_LICENSE("GPL"); | 212 | MODULE_LICENSE("GPL"); |
213 | MODULE_DESCRIPTION ("Twofish Cipher Algorithm"); | 213 | MODULE_DESCRIPTION ("Twofish Cipher Algorithm"); |
214 | MODULE_ALIAS_CRYPTO("twofish"); | 214 | MODULE_ALIAS_CRYPTO("twofish"); |
215 | MODULE_ALIAS_CRYPTO("twofish-generic"); | ||
diff --git a/crypto/wp512.c b/crypto/wp512.c index 0de42eb3d040..7ee5a043a988 100644 --- a/crypto/wp512.c +++ b/crypto/wp512.c | |||
@@ -1167,6 +1167,7 @@ static void __exit wp512_mod_fini(void) | |||
1167 | crypto_unregister_shashes(wp_algs, ARRAY_SIZE(wp_algs)); | 1167 | crypto_unregister_shashes(wp_algs, ARRAY_SIZE(wp_algs)); |
1168 | } | 1168 | } |
1169 | 1169 | ||
1170 | MODULE_ALIAS_CRYPTO("wp512"); | ||
1170 | MODULE_ALIAS_CRYPTO("wp384"); | 1171 | MODULE_ALIAS_CRYPTO("wp384"); |
1171 | MODULE_ALIAS_CRYPTO("wp256"); | 1172 | MODULE_ALIAS_CRYPTO("wp256"); |
1172 | 1173 | ||
diff --git a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c index 5277a0ee5704..b1def411c0b8 100644 --- a/drivers/acpi/pci_irq.c +++ b/drivers/acpi/pci_irq.c | |||
@@ -512,7 +512,6 @@ void acpi_pci_irq_disable(struct pci_dev *dev) | |||
512 | dev_dbg(&dev->dev, "PCI INT %c disabled\n", pin_name(pin)); | 512 | dev_dbg(&dev->dev, "PCI INT %c disabled\n", pin_name(pin)); |
513 | if (gsi >= 0) { | 513 | if (gsi >= 0) { |
514 | acpi_unregister_gsi(gsi); | 514 | acpi_unregister_gsi(gsi); |
515 | dev->irq = 0; | ||
516 | dev->irq_managed = 0; | 515 | dev->irq_managed = 0; |
517 | } | 516 | } |
518 | } | 517 | } |
diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig index a3a13605a9c4..5f601553b9b0 100644 --- a/drivers/ata/Kconfig +++ b/drivers/ata/Kconfig | |||
@@ -835,6 +835,7 @@ config PATA_AT32 | |||
835 | config PATA_AT91 | 835 | config PATA_AT91 |
836 | tristate "PATA support for AT91SAM9260" | 836 | tristate "PATA support for AT91SAM9260" |
837 | depends on ARM && SOC_AT91SAM9 | 837 | depends on ARM && SOC_AT91SAM9 |
838 | depends on !ARCH_MULTIPLATFORM | ||
838 | help | 839 | help |
839 | This option enables support for IDE devices on the Atmel AT91SAM9260 SoC. | 840 | This option enables support for IDE devices on the Atmel AT91SAM9260 SoC. |
840 | 841 | ||
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 49f1e6890587..33bb06e006c9 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
@@ -325,7 +325,6 @@ static const struct pci_device_id ahci_pci_tbl[] = { | |||
325 | { PCI_VDEVICE(INTEL, 0x9d05), board_ahci }, /* Sunrise Point-LP RAID */ | 325 | { PCI_VDEVICE(INTEL, 0x9d05), board_ahci }, /* Sunrise Point-LP RAID */ |
326 | { PCI_VDEVICE(INTEL, 0x9d07), board_ahci }, /* Sunrise Point-LP RAID */ | 326 | { PCI_VDEVICE(INTEL, 0x9d07), board_ahci }, /* Sunrise Point-LP RAID */ |
327 | { PCI_VDEVICE(INTEL, 0xa103), board_ahci }, /* Sunrise Point-H AHCI */ | 327 | { PCI_VDEVICE(INTEL, 0xa103), board_ahci }, /* Sunrise Point-H AHCI */ |
328 | { PCI_VDEVICE(INTEL, 0xa103), board_ahci }, /* Sunrise Point-H RAID */ | ||
329 | { PCI_VDEVICE(INTEL, 0xa105), board_ahci }, /* Sunrise Point-H RAID */ | 328 | { PCI_VDEVICE(INTEL, 0xa105), board_ahci }, /* Sunrise Point-H RAID */ |
330 | { PCI_VDEVICE(INTEL, 0xa107), board_ahci }, /* Sunrise Point-H RAID */ | 329 | { PCI_VDEVICE(INTEL, 0xa107), board_ahci }, /* Sunrise Point-H RAID */ |
331 | { PCI_VDEVICE(INTEL, 0xa10f), board_ahci }, /* Sunrise Point-H RAID */ | 330 | { PCI_VDEVICE(INTEL, 0xa10f), board_ahci }, /* Sunrise Point-H RAID */ |
diff --git a/drivers/ata/ahci_xgene.c b/drivers/ata/ahci_xgene.c index feeb8f1e2fe8..cbcd20810355 100644 --- a/drivers/ata/ahci_xgene.c +++ b/drivers/ata/ahci_xgene.c | |||
@@ -125,10 +125,11 @@ static int xgene_ahci_restart_engine(struct ata_port *ap) | |||
125 | * xgene_ahci_qc_issue - Issue commands to the device | 125 | * xgene_ahci_qc_issue - Issue commands to the device |
126 | * @qc: Command to issue | 126 | * @qc: Command to issue |
127 | * | 127 | * |
128 | * Due to Hardware errata for IDENTIFY DEVICE command, the controller cannot | 128 | * Due to Hardware errata for IDENTIFY DEVICE command and PACKET |
129 | * clear the BSY bit after receiving the PIO setup FIS. This results in the dma | 129 | * command of ATAPI protocol set, the controller cannot clear the BSY bit |
130 | * state machine goes into the CMFatalErrorUpdate state and locks up. By | 130 | * after receiving the PIO setup FIS. This results in the DMA state machine |
131 | * restarting the dma engine, it removes the controller out of lock up state. | 131 | * going into the CMFatalErrorUpdate state and locks up. By restarting the |
132 | * DMA engine, it removes the controller out of lock up state. | ||
132 | */ | 133 | */ |
133 | static unsigned int xgene_ahci_qc_issue(struct ata_queued_cmd *qc) | 134 | static unsigned int xgene_ahci_qc_issue(struct ata_queued_cmd *qc) |
134 | { | 135 | { |
@@ -137,7 +138,8 @@ static unsigned int xgene_ahci_qc_issue(struct ata_queued_cmd *qc) | |||
137 | struct xgene_ahci_context *ctx = hpriv->plat_data; | 138 | struct xgene_ahci_context *ctx = hpriv->plat_data; |
138 | int rc = 0; | 139 | int rc = 0; |
139 | 140 | ||
140 | if (unlikely(ctx->last_cmd[ap->port_no] == ATA_CMD_ID_ATA)) | 141 | if (unlikely((ctx->last_cmd[ap->port_no] == ATA_CMD_ID_ATA) || |
142 | (ctx->last_cmd[ap->port_no] == ATA_CMD_PACKET))) | ||
141 | xgene_ahci_restart_engine(ap); | 143 | xgene_ahci_restart_engine(ap); |
142 | 144 | ||
143 | rc = ahci_qc_issue(qc); | 145 | rc = ahci_qc_issue(qc); |
@@ -188,7 +190,7 @@ static unsigned int xgene_ahci_read_id(struct ata_device *dev, | |||
188 | * | 190 | * |
189 | * Clear reserved bit 8 (DEVSLP bit) as we don't support DEVSLP | 191 | * Clear reserved bit 8 (DEVSLP bit) as we don't support DEVSLP |
190 | */ | 192 | */ |
191 | id[ATA_ID_FEATURE_SUPP] &= ~(1 << 8); | 193 | id[ATA_ID_FEATURE_SUPP] &= cpu_to_le16(~(1 << 8)); |
192 | 194 | ||
193 | return 0; | 195 | return 0; |
194 | } | 196 | } |
diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c index 97683e45ab04..61a9c07e0dff 100644 --- a/drivers/ata/libahci.c +++ b/drivers/ata/libahci.c | |||
@@ -2003,7 +2003,7 @@ static void ahci_set_aggressive_devslp(struct ata_port *ap, bool sleep) | |||
2003 | 2003 | ||
2004 | devslp = readl(port_mmio + PORT_DEVSLP); | 2004 | devslp = readl(port_mmio + PORT_DEVSLP); |
2005 | if (!(devslp & PORT_DEVSLP_DSP)) { | 2005 | if (!(devslp & PORT_DEVSLP_DSP)) { |
2006 | dev_err(ap->host->dev, "port does not support device sleep\n"); | 2006 | dev_info(ap->host->dev, "port does not support device sleep\n"); |
2007 | return; | 2007 | return; |
2008 | } | 2008 | } |
2009 | 2009 | ||
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 5c84fb5c3372..d1a05f9bb91f 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
@@ -4233,10 +4233,33 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { | |||
4233 | { "PIONEER DVD-RW DVR-216D", NULL, ATA_HORKAGE_NOSETXFER }, | 4233 | { "PIONEER DVD-RW DVR-216D", NULL, ATA_HORKAGE_NOSETXFER }, |
4234 | 4234 | ||
4235 | /* devices that don't properly handle queued TRIM commands */ | 4235 | /* devices that don't properly handle queued TRIM commands */ |
4236 | { "Micron_M500*", NULL, ATA_HORKAGE_NO_NCQ_TRIM, }, | 4236 | { "Micron_M[56]*", NULL, ATA_HORKAGE_NO_NCQ_TRIM | |
4237 | { "Crucial_CT???M500SSD*", NULL, ATA_HORKAGE_NO_NCQ_TRIM, }, | 4237 | ATA_HORKAGE_ZERO_AFTER_TRIM, }, |
4238 | { "Micron_M550*", NULL, ATA_HORKAGE_NO_NCQ_TRIM, }, | 4238 | { "Crucial_CT*SSD*", NULL, ATA_HORKAGE_NO_NCQ_TRIM, }, |
4239 | { "Crucial_CT*M550SSD*", NULL, ATA_HORKAGE_NO_NCQ_TRIM, }, | 4239 | |
4240 | /* | ||
4241 | * As defined, the DRAT (Deterministic Read After Trim) and RZAT | ||
4242 | * (Return Zero After Trim) flags in the ATA Command Set are | ||
4243 | * unreliable in the sense that they only define what happens if | ||
4244 | * the device successfully executed the DSM TRIM command. TRIM | ||
4245 | * is only advisory, however, and the device is free to silently | ||
4246 | * ignore all or parts of the request. | ||
4247 | * | ||
4248 | * Whitelist drives that are known to reliably return zeroes | ||
4249 | * after TRIM. | ||
4250 | */ | ||
4251 | |||
4252 | /* | ||
4253 | * The intel 510 drive has buggy DRAT/RZAT. Explicitly exclude | ||
4254 | * that model before whitelisting all other intel SSDs. | ||
4255 | */ | ||
4256 | { "INTEL*SSDSC2MH*", NULL, 0, }, | ||
4257 | |||
4258 | { "INTEL*SSD*", NULL, ATA_HORKAGE_ZERO_AFTER_TRIM, }, | ||
4259 | { "SSD*INTEL*", NULL, ATA_HORKAGE_ZERO_AFTER_TRIM, }, | ||
4260 | { "Samsung*SSD*", NULL, ATA_HORKAGE_ZERO_AFTER_TRIM, }, | ||
4261 | { "SAMSUNG*SSD*", NULL, ATA_HORKAGE_ZERO_AFTER_TRIM, }, | ||
4262 | { "ST[1248][0248]0[FH]*", NULL, ATA_HORKAGE_ZERO_AFTER_TRIM, }, | ||
4240 | 4263 | ||
4241 | /* | 4264 | /* |
4242 | * Some WD SATA-I drives spin up and down erratically when the link | 4265 | * Some WD SATA-I drives spin up and down erratically when the link |
@@ -4748,7 +4771,10 @@ static struct ata_queued_cmd *ata_qc_new(struct ata_port *ap) | |||
4748 | return NULL; | 4771 | return NULL; |
4749 | 4772 | ||
4750 | for (i = 0, tag = ap->last_tag + 1; i < max_queue; i++, tag++) { | 4773 | for (i = 0, tag = ap->last_tag + 1; i < max_queue; i++, tag++) { |
4751 | tag = tag < max_queue ? tag : 0; | 4774 | if (ap->flags & ATA_FLAG_LOWTAG) |
4775 | tag = i; | ||
4776 | else | ||
4777 | tag = tag < max_queue ? tag : 0; | ||
4752 | 4778 | ||
4753 | /* the last tag is reserved for internal command. */ | 4779 | /* the last tag is reserved for internal command. */ |
4754 | if (tag == ATA_TAG_INTERNAL) | 4780 | if (tag == ATA_TAG_INTERNAL) |
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index 3dbec8954c86..8d00c2638bed 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c | |||
@@ -2389,6 +2389,7 @@ const char *ata_get_cmd_descript(u8 command) | |||
2389 | 2389 | ||
2390 | return NULL; | 2390 | return NULL; |
2391 | } | 2391 | } |
2392 | EXPORT_SYMBOL_GPL(ata_get_cmd_descript); | ||
2392 | 2393 | ||
2393 | /** | 2394 | /** |
2394 | * ata_eh_link_report - report error handling to user | 2395 | * ata_eh_link_report - report error handling to user |
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index e364e86e84d7..6abd17a85b13 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c | |||
@@ -2532,13 +2532,15 @@ static unsigned int ata_scsiop_read_cap(struct ata_scsi_args *args, u8 *rbuf) | |||
2532 | rbuf[15] = lowest_aligned; | 2532 | rbuf[15] = lowest_aligned; |
2533 | 2533 | ||
2534 | if (ata_id_has_trim(args->id)) { | 2534 | if (ata_id_has_trim(args->id)) { |
2535 | rbuf[14] |= 0x80; /* TPE */ | 2535 | rbuf[14] |= 0x80; /* LBPME */ |
2536 | 2536 | ||
2537 | if (ata_id_has_zero_after_trim(args->id)) | 2537 | if (ata_id_has_zero_after_trim(args->id) && |
2538 | rbuf[14] |= 0x40; /* TPRZ */ | 2538 | dev->horkage & ATA_HORKAGE_ZERO_AFTER_TRIM) { |
2539 | ata_dev_info(dev, "Enabling discard_zeroes_data\n"); | ||
2540 | rbuf[14] |= 0x40; /* LBPRZ */ | ||
2541 | } | ||
2539 | } | 2542 | } |
2540 | } | 2543 | } |
2541 | |||
2542 | return 0; | 2544 | return 0; |
2543 | } | 2545 | } |
2544 | 2546 | ||
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c index db90aa35cb71..2e86e3b85266 100644 --- a/drivers/ata/libata-sff.c +++ b/drivers/ata/libata-sff.c | |||
@@ -1333,7 +1333,19 @@ void ata_sff_flush_pio_task(struct ata_port *ap) | |||
1333 | DPRINTK("ENTER\n"); | 1333 | DPRINTK("ENTER\n"); |
1334 | 1334 | ||
1335 | cancel_delayed_work_sync(&ap->sff_pio_task); | 1335 | cancel_delayed_work_sync(&ap->sff_pio_task); |
1336 | |||
1337 | /* | ||
1338 | * We wanna reset the HSM state to IDLE. If we do so without | ||
1339 | * grabbing the port lock, critical sections protected by it which | ||
1340 | * expect the HSM state to stay stable may get surprised. For | ||
1341 | * example, we may set IDLE in between the time | ||
1342 | * __ata_sff_port_intr() checks for HSM_ST_IDLE and before it calls | ||
1343 | * ata_sff_hsm_move() causing ata_sff_hsm_move() to BUG(). | ||
1344 | */ | ||
1345 | spin_lock_irq(ap->lock); | ||
1336 | ap->hsm_task_state = HSM_ST_IDLE; | 1346 | ap->hsm_task_state = HSM_ST_IDLE; |
1347 | spin_unlock_irq(ap->lock); | ||
1348 | |||
1337 | ap->sff_pio_task_link = NULL; | 1349 | ap->sff_pio_task_link = NULL; |
1338 | 1350 | ||
1339 | if (ata_msg_ctl(ap)) | 1351 | if (ata_msg_ctl(ap)) |
diff --git a/drivers/ata/sata_dwc_460ex.c b/drivers/ata/sata_dwc_460ex.c index c7ddef89e7b0..8e8248179d20 100644 --- a/drivers/ata/sata_dwc_460ex.c +++ b/drivers/ata/sata_dwc_460ex.c | |||
@@ -797,7 +797,7 @@ static int dma_dwc_init(struct sata_dwc_device *hsdev, int irq) | |||
797 | if (err) { | 797 | if (err) { |
798 | dev_err(host_pvt.dwc_dev, "%s: dma_request_interrupts returns" | 798 | dev_err(host_pvt.dwc_dev, "%s: dma_request_interrupts returns" |
799 | " %d\n", __func__, err); | 799 | " %d\n", __func__, err); |
800 | goto error_out; | 800 | return err; |
801 | } | 801 | } |
802 | 802 | ||
803 | /* Enabe DMA */ | 803 | /* Enabe DMA */ |
@@ -808,11 +808,6 @@ static int dma_dwc_init(struct sata_dwc_device *hsdev, int irq) | |||
808 | sata_dma_regs); | 808 | sata_dma_regs); |
809 | 809 | ||
810 | return 0; | 810 | return 0; |
811 | |||
812 | error_out: | ||
813 | dma_dwc_exit(hsdev); | ||
814 | |||
815 | return err; | ||
816 | } | 811 | } |
817 | 812 | ||
818 | static int sata_dwc_scr_read(struct ata_link *link, unsigned int scr, u32 *val) | 813 | static int sata_dwc_scr_read(struct ata_link *link, unsigned int scr, u32 *val) |
@@ -1662,7 +1657,7 @@ static int sata_dwc_probe(struct platform_device *ofdev) | |||
1662 | char *ver = (char *)&versionr; | 1657 | char *ver = (char *)&versionr; |
1663 | u8 *base = NULL; | 1658 | u8 *base = NULL; |
1664 | int err = 0; | 1659 | int err = 0; |
1665 | int irq, rc; | 1660 | int irq; |
1666 | struct ata_host *host; | 1661 | struct ata_host *host; |
1667 | struct ata_port_info pi = sata_dwc_port_info[0]; | 1662 | struct ata_port_info pi = sata_dwc_port_info[0]; |
1668 | const struct ata_port_info *ppi[] = { &pi, NULL }; | 1663 | const struct ata_port_info *ppi[] = { &pi, NULL }; |
@@ -1725,7 +1720,7 @@ static int sata_dwc_probe(struct platform_device *ofdev) | |||
1725 | if (irq == NO_IRQ) { | 1720 | if (irq == NO_IRQ) { |
1726 | dev_err(&ofdev->dev, "no SATA DMA irq\n"); | 1721 | dev_err(&ofdev->dev, "no SATA DMA irq\n"); |
1727 | err = -ENODEV; | 1722 | err = -ENODEV; |
1728 | goto error_out; | 1723 | goto error_iomap; |
1729 | } | 1724 | } |
1730 | 1725 | ||
1731 | /* Get physical SATA DMA register base address */ | 1726 | /* Get physical SATA DMA register base address */ |
@@ -1734,14 +1729,16 @@ static int sata_dwc_probe(struct platform_device *ofdev) | |||
1734 | dev_err(&ofdev->dev, "ioremap failed for AHBDMA register" | 1729 | dev_err(&ofdev->dev, "ioremap failed for AHBDMA register" |
1735 | " address\n"); | 1730 | " address\n"); |
1736 | err = -ENODEV; | 1731 | err = -ENODEV; |
1737 | goto error_out; | 1732 | goto error_iomap; |
1738 | } | 1733 | } |
1739 | 1734 | ||
1740 | /* Save dev for later use in dev_xxx() routines */ | 1735 | /* Save dev for later use in dev_xxx() routines */ |
1741 | host_pvt.dwc_dev = &ofdev->dev; | 1736 | host_pvt.dwc_dev = &ofdev->dev; |
1742 | 1737 | ||
1743 | /* Initialize AHB DMAC */ | 1738 | /* Initialize AHB DMAC */ |
1744 | dma_dwc_init(hsdev, irq); | 1739 | err = dma_dwc_init(hsdev, irq); |
1740 | if (err) | ||
1741 | goto error_dma_iomap; | ||
1745 | 1742 | ||
1746 | /* Enable SATA Interrupts */ | 1743 | /* Enable SATA Interrupts */ |
1747 | sata_dwc_enable_interrupts(hsdev); | 1744 | sata_dwc_enable_interrupts(hsdev); |
@@ -1759,9 +1756,8 @@ static int sata_dwc_probe(struct platform_device *ofdev) | |||
1759 | * device discovery process, invoking our port_start() handler & | 1756 | * device discovery process, invoking our port_start() handler & |
1760 | * error_handler() to execute a dummy Softreset EH session | 1757 | * error_handler() to execute a dummy Softreset EH session |
1761 | */ | 1758 | */ |
1762 | rc = ata_host_activate(host, irq, sata_dwc_isr, 0, &sata_dwc_sht); | 1759 | err = ata_host_activate(host, irq, sata_dwc_isr, 0, &sata_dwc_sht); |
1763 | 1760 | if (err) | |
1764 | if (rc != 0) | ||
1765 | dev_err(&ofdev->dev, "failed to activate host"); | 1761 | dev_err(&ofdev->dev, "failed to activate host"); |
1766 | 1762 | ||
1767 | dev_set_drvdata(&ofdev->dev, host); | 1763 | dev_set_drvdata(&ofdev->dev, host); |
@@ -1770,7 +1766,8 @@ static int sata_dwc_probe(struct platform_device *ofdev) | |||
1770 | error_out: | 1766 | error_out: |
1771 | /* Free SATA DMA resources */ | 1767 | /* Free SATA DMA resources */ |
1772 | dma_dwc_exit(hsdev); | 1768 | dma_dwc_exit(hsdev); |
1773 | 1769 | error_dma_iomap: | |
1770 | iounmap((void __iomem *)host_pvt.sata_dma_regs); | ||
1774 | error_iomap: | 1771 | error_iomap: |
1775 | iounmap(base); | 1772 | iounmap(base); |
1776 | error_kmalloc: | 1773 | error_kmalloc: |
@@ -1791,6 +1788,7 @@ static int sata_dwc_remove(struct platform_device *ofdev) | |||
1791 | /* Free SATA DMA resources */ | 1788 | /* Free SATA DMA resources */ |
1792 | dma_dwc_exit(hsdev); | 1789 | dma_dwc_exit(hsdev); |
1793 | 1790 | ||
1791 | iounmap((void __iomem *)host_pvt.sata_dma_regs); | ||
1794 | iounmap(hsdev->reg_base); | 1792 | iounmap(hsdev->reg_base); |
1795 | kfree(hsdev); | 1793 | kfree(hsdev); |
1796 | kfree(host); | 1794 | kfree(host); |
diff --git a/drivers/ata/sata_sil24.c b/drivers/ata/sata_sil24.c index d81b20ddb527..ea655949023f 100644 --- a/drivers/ata/sata_sil24.c +++ b/drivers/ata/sata_sil24.c | |||
@@ -246,7 +246,7 @@ enum { | |||
246 | /* host flags */ | 246 | /* host flags */ |
247 | SIL24_COMMON_FLAGS = ATA_FLAG_SATA | ATA_FLAG_PIO_DMA | | 247 | SIL24_COMMON_FLAGS = ATA_FLAG_SATA | ATA_FLAG_PIO_DMA | |
248 | ATA_FLAG_NCQ | ATA_FLAG_ACPI_SATA | | 248 | ATA_FLAG_NCQ | ATA_FLAG_ACPI_SATA | |
249 | ATA_FLAG_AN | ATA_FLAG_PMP, | 249 | ATA_FLAG_AN | ATA_FLAG_PMP | ATA_FLAG_LOWTAG, |
250 | SIL24_FLAG_PCIX_IRQ_WOC = (1 << 24), /* IRQ loss errata on PCI-X */ | 250 | SIL24_FLAG_PCIX_IRQ_WOC = (1 << 24), /* IRQ loss errata on PCI-X */ |
251 | 251 | ||
252 | IRQ_STAT_4PORTS = 0xf, | 252 | IRQ_STAT_4PORTS = 0xf, |
diff --git a/drivers/block/nvme-core.c b/drivers/block/nvme-core.c index cb529e9a82dd..d826bf3e62c8 100644 --- a/drivers/block/nvme-core.c +++ b/drivers/block/nvme-core.c | |||
@@ -106,7 +106,7 @@ struct nvme_queue { | |||
106 | dma_addr_t cq_dma_addr; | 106 | dma_addr_t cq_dma_addr; |
107 | u32 __iomem *q_db; | 107 | u32 __iomem *q_db; |
108 | u16 q_depth; | 108 | u16 q_depth; |
109 | u16 cq_vector; | 109 | s16 cq_vector; |
110 | u16 sq_head; | 110 | u16 sq_head; |
111 | u16 sq_tail; | 111 | u16 sq_tail; |
112 | u16 cq_head; | 112 | u16 cq_head; |
diff --git a/drivers/bus/arm-cci.c b/drivers/bus/arm-cci.c index 860da40b78ef..0ce5e2d65a06 100644 --- a/drivers/bus/arm-cci.c +++ b/drivers/bus/arm-cci.c | |||
@@ -1312,6 +1312,9 @@ static int cci_probe(void) | |||
1312 | if (!np) | 1312 | if (!np) |
1313 | return -ENODEV; | 1313 | return -ENODEV; |
1314 | 1314 | ||
1315 | if (!of_device_is_available(np)) | ||
1316 | return -ENODEV; | ||
1317 | |||
1315 | cci_config = of_match_node(arm_cci_matches, np)->data; | 1318 | cci_config = of_match_node(arm_cci_matches, np)->data; |
1316 | if (!cci_config) | 1319 | if (!cci_config) |
1317 | return -ENODEV; | 1320 | return -ENODEV; |
diff --git a/drivers/bus/mvebu-mbus.c b/drivers/bus/mvebu-mbus.c index eb7682dc123b..81bf297f1034 100644 --- a/drivers/bus/mvebu-mbus.c +++ b/drivers/bus/mvebu-mbus.c | |||
@@ -210,12 +210,25 @@ static void mvebu_mbus_disable_window(struct mvebu_mbus_state *mbus, | |||
210 | } | 210 | } |
211 | 211 | ||
212 | /* Checks whether the given window number is available */ | 212 | /* Checks whether the given window number is available */ |
213 | |||
214 | /* On Armada XP, 375 and 38x the MBus window 13 has the remap | ||
215 | * capability, like windows 0 to 7. However, the mvebu-mbus driver | ||
216 | * isn't currently taking into account this special case, which means | ||
217 | * that when window 13 is actually used, the remap registers are left | ||
218 | * to 0, making the device using this MBus window unavailable. The | ||
219 | * quick fix for stable is to not use window 13. A follow up patch | ||
220 | * will correctly handle this window. | ||
221 | */ | ||
213 | static int mvebu_mbus_window_is_free(struct mvebu_mbus_state *mbus, | 222 | static int mvebu_mbus_window_is_free(struct mvebu_mbus_state *mbus, |
214 | const int win) | 223 | const int win) |
215 | { | 224 | { |
216 | void __iomem *addr = mbus->mbuswins_base + | 225 | void __iomem *addr = mbus->mbuswins_base + |
217 | mbus->soc->win_cfg_offset(win); | 226 | mbus->soc->win_cfg_offset(win); |
218 | u32 ctrl = readl(addr + WIN_CTRL_OFF); | 227 | u32 ctrl = readl(addr + WIN_CTRL_OFF); |
228 | |||
229 | if (win == 13) | ||
230 | return false; | ||
231 | |||
219 | return !(ctrl & WIN_CTRL_ENABLE); | 232 | return !(ctrl & WIN_CTRL_ENABLE); |
220 | } | 233 | } |
221 | 234 | ||
diff --git a/drivers/clk/at91/clk-slow.c b/drivers/clk/at91/clk-slow.c index 32f7c1b36204..2f13bd5246b5 100644 --- a/drivers/clk/at91/clk-slow.c +++ b/drivers/clk/at91/clk-slow.c | |||
@@ -70,6 +70,7 @@ struct clk_sam9x5_slow { | |||
70 | 70 | ||
71 | #define to_clk_sam9x5_slow(hw) container_of(hw, struct clk_sam9x5_slow, hw) | 71 | #define to_clk_sam9x5_slow(hw) container_of(hw, struct clk_sam9x5_slow, hw) |
72 | 72 | ||
73 | static struct clk *slow_clk; | ||
73 | 74 | ||
74 | static int clk_slow_osc_prepare(struct clk_hw *hw) | 75 | static int clk_slow_osc_prepare(struct clk_hw *hw) |
75 | { | 76 | { |
@@ -357,6 +358,8 @@ at91_clk_register_sam9x5_slow(void __iomem *sckcr, | |||
357 | clk = clk_register(NULL, &slowck->hw); | 358 | clk = clk_register(NULL, &slowck->hw); |
358 | if (IS_ERR(clk)) | 359 | if (IS_ERR(clk)) |
359 | kfree(slowck); | 360 | kfree(slowck); |
361 | else | ||
362 | slow_clk = clk; | ||
360 | 363 | ||
361 | return clk; | 364 | return clk; |
362 | } | 365 | } |
@@ -433,6 +436,8 @@ at91_clk_register_sam9260_slow(struct at91_pmc *pmc, | |||
433 | clk = clk_register(NULL, &slowck->hw); | 436 | clk = clk_register(NULL, &slowck->hw); |
434 | if (IS_ERR(clk)) | 437 | if (IS_ERR(clk)) |
435 | kfree(slowck); | 438 | kfree(slowck); |
439 | else | ||
440 | slow_clk = clk; | ||
436 | 441 | ||
437 | return clk; | 442 | return clk; |
438 | } | 443 | } |
@@ -465,3 +470,25 @@ void __init of_at91sam9260_clk_slow_setup(struct device_node *np, | |||
465 | 470 | ||
466 | of_clk_add_provider(np, of_clk_src_simple_get, clk); | 471 | of_clk_add_provider(np, of_clk_src_simple_get, clk); |
467 | } | 472 | } |
473 | |||
474 | /* | ||
475 | * FIXME: All slow clk users are not properly claiming it (get + prepare + | ||
476 | * enable) before using it. | ||
477 | * If all users properly claiming this clock decide that they don't need it | ||
478 | * anymore (or are removed), it is disabled while faulty users are still | ||
479 | * requiring it, and the system hangs. | ||
480 | * Prevent this clock from being disabled until all users are properly | ||
481 | * requesting it. | ||
482 | * Once this is done we should remove this function and the slow_clk variable. | ||
483 | */ | ||
484 | static int __init of_at91_clk_slow_retain(void) | ||
485 | { | ||
486 | if (!slow_clk) | ||
487 | return 0; | ||
488 | |||
489 | __clk_get(slow_clk); | ||
490 | clk_prepare_enable(slow_clk); | ||
491 | |||
492 | return 0; | ||
493 | } | ||
494 | arch_initcall(of_at91_clk_slow_retain); | ||
diff --git a/drivers/clk/berlin/bg2q.c b/drivers/clk/berlin/bg2q.c index 21784e4eb3f0..440ef81ab15c 100644 --- a/drivers/clk/berlin/bg2q.c +++ b/drivers/clk/berlin/bg2q.c | |||
@@ -285,7 +285,6 @@ static const struct berlin2_gate_data bg2q_gates[] __initconst = { | |||
285 | { "pbridge", "perif", 15, CLK_IGNORE_UNUSED }, | 285 | { "pbridge", "perif", 15, CLK_IGNORE_UNUSED }, |
286 | { "sdio", "perif", 16, CLK_IGNORE_UNUSED }, | 286 | { "sdio", "perif", 16, CLK_IGNORE_UNUSED }, |
287 | { "nfc", "perif", 18 }, | 287 | { "nfc", "perif", 18 }, |
288 | { "smemc", "perif", 19 }, | ||
289 | { "pcie", "perif", 22 }, | 288 | { "pcie", "perif", 22 }, |
290 | }; | 289 | }; |
291 | 290 | ||
diff --git a/drivers/clk/clk-ppc-corenet.c b/drivers/clk/clk-ppc-corenet.c index b6e6c85507a5..0a47d6f49cd6 100644 --- a/drivers/clk/clk-ppc-corenet.c +++ b/drivers/clk/clk-ppc-corenet.c | |||
@@ -291,7 +291,7 @@ static const struct of_device_id ppc_clk_ids[] __initconst = { | |||
291 | {} | 291 | {} |
292 | }; | 292 | }; |
293 | 293 | ||
294 | static struct platform_driver ppc_corenet_clk_driver __initdata = { | 294 | static struct platform_driver ppc_corenet_clk_driver = { |
295 | .driver = { | 295 | .driver = { |
296 | .name = "ppc_corenet_clock", | 296 | .name = "ppc_corenet_clock", |
297 | .of_match_table = ppc_clk_ids, | 297 | .of_match_table = ppc_clk_ids, |
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index f4963b7d4e17..d48ac71c6c8b 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c | |||
@@ -1366,7 +1366,7 @@ static struct clk *clk_calc_new_rates(struct clk *clk, unsigned long rate) | |||
1366 | new_rate = clk->ops->determine_rate(clk->hw, rate, | 1366 | new_rate = clk->ops->determine_rate(clk->hw, rate, |
1367 | &best_parent_rate, | 1367 | &best_parent_rate, |
1368 | &parent_hw); | 1368 | &parent_hw); |
1369 | parent = parent_hw->clk; | 1369 | parent = parent_hw ? parent_hw->clk : NULL; |
1370 | } else if (clk->ops->round_rate) { | 1370 | } else if (clk->ops->round_rate) { |
1371 | new_rate = clk->ops->round_rate(clk->hw, rate, | 1371 | new_rate = clk->ops->round_rate(clk->hw, rate, |
1372 | &best_parent_rate); | 1372 | &best_parent_rate); |
diff --git a/drivers/clk/rockchip/clk-cpu.c b/drivers/clk/rockchip/clk-cpu.c index 75c8c45ef728..8539c4fd34cc 100644 --- a/drivers/clk/rockchip/clk-cpu.c +++ b/drivers/clk/rockchip/clk-cpu.c | |||
@@ -124,10 +124,11 @@ static int rockchip_cpuclk_pre_rate_change(struct rockchip_cpuclk *cpuclk, | |||
124 | { | 124 | { |
125 | const struct rockchip_cpuclk_reg_data *reg_data = cpuclk->reg_data; | 125 | const struct rockchip_cpuclk_reg_data *reg_data = cpuclk->reg_data; |
126 | unsigned long alt_prate, alt_div; | 126 | unsigned long alt_prate, alt_div; |
127 | unsigned long flags; | ||
127 | 128 | ||
128 | alt_prate = clk_get_rate(cpuclk->alt_parent); | 129 | alt_prate = clk_get_rate(cpuclk->alt_parent); |
129 | 130 | ||
130 | spin_lock(cpuclk->lock); | 131 | spin_lock_irqsave(cpuclk->lock, flags); |
131 | 132 | ||
132 | /* | 133 | /* |
133 | * If the old parent clock speed is less than the clock speed | 134 | * If the old parent clock speed is less than the clock speed |
@@ -164,7 +165,7 @@ static int rockchip_cpuclk_pre_rate_change(struct rockchip_cpuclk *cpuclk, | |||
164 | cpuclk->reg_base + reg_data->core_reg); | 165 | cpuclk->reg_base + reg_data->core_reg); |
165 | } | 166 | } |
166 | 167 | ||
167 | spin_unlock(cpuclk->lock); | 168 | spin_unlock_irqrestore(cpuclk->lock, flags); |
168 | return 0; | 169 | return 0; |
169 | } | 170 | } |
170 | 171 | ||
@@ -173,6 +174,7 @@ static int rockchip_cpuclk_post_rate_change(struct rockchip_cpuclk *cpuclk, | |||
173 | { | 174 | { |
174 | const struct rockchip_cpuclk_reg_data *reg_data = cpuclk->reg_data; | 175 | const struct rockchip_cpuclk_reg_data *reg_data = cpuclk->reg_data; |
175 | const struct rockchip_cpuclk_rate_table *rate; | 176 | const struct rockchip_cpuclk_rate_table *rate; |
177 | unsigned long flags; | ||
176 | 178 | ||
177 | rate = rockchip_get_cpuclk_settings(cpuclk, ndata->new_rate); | 179 | rate = rockchip_get_cpuclk_settings(cpuclk, ndata->new_rate); |
178 | if (!rate) { | 180 | if (!rate) { |
@@ -181,7 +183,7 @@ static int rockchip_cpuclk_post_rate_change(struct rockchip_cpuclk *cpuclk, | |||
181 | return -EINVAL; | 183 | return -EINVAL; |
182 | } | 184 | } |
183 | 185 | ||
184 | spin_lock(cpuclk->lock); | 186 | spin_lock_irqsave(cpuclk->lock, flags); |
185 | 187 | ||
186 | if (ndata->old_rate < ndata->new_rate) | 188 | if (ndata->old_rate < ndata->new_rate) |
187 | rockchip_cpuclk_set_dividers(cpuclk, rate); | 189 | rockchip_cpuclk_set_dividers(cpuclk, rate); |
@@ -201,7 +203,7 @@ static int rockchip_cpuclk_post_rate_change(struct rockchip_cpuclk *cpuclk, | |||
201 | if (ndata->old_rate > ndata->new_rate) | 203 | if (ndata->old_rate > ndata->new_rate) |
202 | rockchip_cpuclk_set_dividers(cpuclk, rate); | 204 | rockchip_cpuclk_set_dividers(cpuclk, rate); |
203 | 205 | ||
204 | spin_unlock(cpuclk->lock); | 206 | spin_unlock_irqrestore(cpuclk->lock, flags); |
205 | return 0; | 207 | return 0; |
206 | } | 208 | } |
207 | 209 | ||
diff --git a/drivers/clk/rockchip/clk-rk3188.c b/drivers/clk/rockchip/clk-rk3188.c index c54078960847..7eb684c50d42 100644 --- a/drivers/clk/rockchip/clk-rk3188.c +++ b/drivers/clk/rockchip/clk-rk3188.c | |||
@@ -210,6 +210,17 @@ PNAME(mux_sclk_hsadc_p) = { "hsadc_src", "hsadc_frac", "ext_hsadc" }; | |||
210 | PNAME(mux_mac_p) = { "gpll", "dpll" }; | 210 | PNAME(mux_mac_p) = { "gpll", "dpll" }; |
211 | PNAME(mux_sclk_macref_p) = { "mac_src", "ext_rmii" }; | 211 | PNAME(mux_sclk_macref_p) = { "mac_src", "ext_rmii" }; |
212 | 212 | ||
213 | static struct rockchip_pll_clock rk3066_pll_clks[] __initdata = { | ||
214 | [apll] = PLL(pll_rk3066, PLL_APLL, "apll", mux_pll_p, 0, RK2928_PLL_CON(0), | ||
215 | RK2928_MODE_CON, 0, 5, 0, rk3188_pll_rates), | ||
216 | [dpll] = PLL(pll_rk3066, PLL_DPLL, "dpll", mux_pll_p, 0, RK2928_PLL_CON(4), | ||
217 | RK2928_MODE_CON, 4, 4, 0, NULL), | ||
218 | [cpll] = PLL(pll_rk3066, PLL_CPLL, "cpll", mux_pll_p, 0, RK2928_PLL_CON(8), | ||
219 | RK2928_MODE_CON, 8, 6, ROCKCHIP_PLL_SYNC_RATE, rk3188_pll_rates), | ||
220 | [gpll] = PLL(pll_rk3066, PLL_GPLL, "gpll", mux_pll_p, 0, RK2928_PLL_CON(12), | ||
221 | RK2928_MODE_CON, 12, 7, ROCKCHIP_PLL_SYNC_RATE, rk3188_pll_rates), | ||
222 | }; | ||
223 | |||
213 | static struct rockchip_pll_clock rk3188_pll_clks[] __initdata = { | 224 | static struct rockchip_pll_clock rk3188_pll_clks[] __initdata = { |
214 | [apll] = PLL(pll_rk3066, PLL_APLL, "apll", mux_pll_p, 0, RK2928_PLL_CON(0), | 225 | [apll] = PLL(pll_rk3066, PLL_APLL, "apll", mux_pll_p, 0, RK2928_PLL_CON(0), |
215 | RK2928_MODE_CON, 0, 6, 0, rk3188_pll_rates), | 226 | RK2928_MODE_CON, 0, 6, 0, rk3188_pll_rates), |
@@ -427,11 +438,11 @@ static struct rockchip_clk_branch common_clk_branches[] __initdata = { | |||
427 | /* hclk_peri gates */ | 438 | /* hclk_peri gates */ |
428 | GATE(0, "hclk_peri_axi_matrix", "hclk_peri", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(4), 0, GFLAGS), | 439 | GATE(0, "hclk_peri_axi_matrix", "hclk_peri", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(4), 0, GFLAGS), |
429 | GATE(0, "hclk_peri_ahb_arbi", "hclk_peri", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(4), 6, GFLAGS), | 440 | GATE(0, "hclk_peri_ahb_arbi", "hclk_peri", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(4), 6, GFLAGS), |
430 | GATE(0, "hclk_emem_peri", "hclk_peri", 0, RK2928_CLKGATE_CON(4), 7, GFLAGS), | 441 | GATE(0, "hclk_emem_peri", "hclk_peri", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(4), 7, GFLAGS), |
431 | GATE(HCLK_EMAC, "hclk_emac", "hclk_peri", 0, RK2928_CLKGATE_CON(7), 0, GFLAGS), | 442 | GATE(HCLK_EMAC, "hclk_emac", "hclk_peri", 0, RK2928_CLKGATE_CON(7), 0, GFLAGS), |
432 | GATE(HCLK_NANDC0, "hclk_nandc0", "hclk_peri", 0, RK2928_CLKGATE_CON(5), 9, GFLAGS), | 443 | GATE(HCLK_NANDC0, "hclk_nandc0", "hclk_peri", 0, RK2928_CLKGATE_CON(5), 9, GFLAGS), |
433 | GATE(0, "hclk_usb_peri", "hclk_peri", 0, RK2928_CLKGATE_CON(4), 5, GFLAGS), | 444 | GATE(0, "hclk_usb_peri", "hclk_peri", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(4), 5, GFLAGS), |
434 | GATE(HCLK_OTG0, "hclk_usbotg0", "hclk_peri", 0, RK2928_CLKGATE_CON(5), 13, GFLAGS), | 445 | GATE(HCLK_OTG0, "hclk_usbotg0", "hclk_peri", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(5), 13, GFLAGS), |
435 | GATE(HCLK_HSADC, "hclk_hsadc", "hclk_peri", 0, RK2928_CLKGATE_CON(7), 5, GFLAGS), | 446 | GATE(HCLK_HSADC, "hclk_hsadc", "hclk_peri", 0, RK2928_CLKGATE_CON(7), 5, GFLAGS), |
436 | GATE(HCLK_PIDF, "hclk_pidfilter", "hclk_peri", 0, RK2928_CLKGATE_CON(7), 6, GFLAGS), | 447 | GATE(HCLK_PIDF, "hclk_pidfilter", "hclk_peri", 0, RK2928_CLKGATE_CON(7), 6, GFLAGS), |
437 | GATE(HCLK_SDMMC, "hclk_sdmmc", "hclk_peri", 0, RK2928_CLKGATE_CON(5), 10, GFLAGS), | 448 | GATE(HCLK_SDMMC, "hclk_sdmmc", "hclk_peri", 0, RK2928_CLKGATE_CON(5), 10, GFLAGS), |
@@ -592,7 +603,8 @@ static struct rockchip_clk_branch rk3066a_clk_branches[] __initdata = { | |||
592 | GATE(0, "hclk_cif1", "hclk_cpu", 0, RK2928_CLKGATE_CON(6), 6, GFLAGS), | 603 | GATE(0, "hclk_cif1", "hclk_cpu", 0, RK2928_CLKGATE_CON(6), 6, GFLAGS), |
593 | GATE(0, "hclk_hdmi", "hclk_cpu", 0, RK2928_CLKGATE_CON(4), 14, GFLAGS), | 604 | GATE(0, "hclk_hdmi", "hclk_cpu", 0, RK2928_CLKGATE_CON(4), 14, GFLAGS), |
594 | 605 | ||
595 | GATE(HCLK_OTG1, "hclk_usbotg1", "hclk_peri", 0, RK2928_CLKGATE_CON(5), 14, GFLAGS), | 606 | GATE(HCLK_OTG1, "hclk_usbotg1", "hclk_peri", CLK_IGNORE_UNUSED, |
607 | RK2928_CLKGATE_CON(5), 14, GFLAGS), | ||
596 | 608 | ||
597 | GATE(0, "aclk_cif1", "aclk_vio1", 0, RK2928_CLKGATE_CON(6), 7, GFLAGS), | 609 | GATE(0, "aclk_cif1", "aclk_vio1", 0, RK2928_CLKGATE_CON(6), 7, GFLAGS), |
598 | 610 | ||
@@ -680,7 +692,8 @@ static struct rockchip_clk_branch rk3188_clk_branches[] __initdata = { | |||
680 | GATE(0, "hclk_imem0", "hclk_cpu", 0, RK2928_CLKGATE_CON(4), 14, GFLAGS), | 692 | GATE(0, "hclk_imem0", "hclk_cpu", 0, RK2928_CLKGATE_CON(4), 14, GFLAGS), |
681 | GATE(0, "hclk_imem1", "hclk_cpu", 0, RK2928_CLKGATE_CON(4), 15, GFLAGS), | 693 | GATE(0, "hclk_imem1", "hclk_cpu", 0, RK2928_CLKGATE_CON(4), 15, GFLAGS), |
682 | 694 | ||
683 | GATE(HCLK_OTG1, "hclk_usbotg1", "hclk_peri", 0, RK2928_CLKGATE_CON(7), 3, GFLAGS), | 695 | GATE(HCLK_OTG1, "hclk_usbotg1", "hclk_peri", CLK_IGNORE_UNUSED, |
696 | RK2928_CLKGATE_CON(7), 3, GFLAGS), | ||
684 | GATE(HCLK_HSIC, "hclk_hsic", "hclk_peri", 0, RK2928_CLKGATE_CON(7), 4, GFLAGS), | 697 | GATE(HCLK_HSIC, "hclk_hsic", "hclk_peri", 0, RK2928_CLKGATE_CON(7), 4, GFLAGS), |
685 | 698 | ||
686 | GATE(PCLK_TIMER3, "pclk_timer3", "pclk_cpu", 0, RK2928_CLKGATE_CON(7), 9, GFLAGS), | 699 | GATE(PCLK_TIMER3, "pclk_timer3", "pclk_cpu", 0, RK2928_CLKGATE_CON(7), 9, GFLAGS), |
@@ -735,8 +748,8 @@ static void __init rk3188_common_clk_init(struct device_node *np) | |||
735 | static void __init rk3066a_clk_init(struct device_node *np) | 748 | static void __init rk3066a_clk_init(struct device_node *np) |
736 | { | 749 | { |
737 | rk3188_common_clk_init(np); | 750 | rk3188_common_clk_init(np); |
738 | rockchip_clk_register_plls(rk3188_pll_clks, | 751 | rockchip_clk_register_plls(rk3066_pll_clks, |
739 | ARRAY_SIZE(rk3188_pll_clks), | 752 | ARRAY_SIZE(rk3066_pll_clks), |
740 | RK3066_GRF_SOC_STATUS); | 753 | RK3066_GRF_SOC_STATUS); |
741 | rockchip_clk_register_branches(rk3066a_clk_branches, | 754 | rockchip_clk_register_branches(rk3066a_clk_branches, |
742 | ARRAY_SIZE(rk3066a_clk_branches)); | 755 | ARRAY_SIZE(rk3066a_clk_branches)); |
diff --git a/drivers/clk/rockchip/clk-rk3288.c b/drivers/clk/rockchip/clk-rk3288.c index 40d267f5dea3..cbcddcc02475 100644 --- a/drivers/clk/rockchip/clk-rk3288.c +++ b/drivers/clk/rockchip/clk-rk3288.c | |||
@@ -145,20 +145,20 @@ struct rockchip_pll_rate_table rk3288_pll_rates[] = { | |||
145 | } | 145 | } |
146 | 146 | ||
147 | static struct rockchip_cpuclk_rate_table rk3288_cpuclk_rates[] __initdata = { | 147 | static struct rockchip_cpuclk_rate_table rk3288_cpuclk_rates[] __initdata = { |
148 | RK3288_CPUCLK_RATE(1800000000, 2, 4, 2, 4, 4), | 148 | RK3288_CPUCLK_RATE(1800000000, 1, 3, 1, 3, 3), |
149 | RK3288_CPUCLK_RATE(1704000000, 2, 4, 2, 4, 4), | 149 | RK3288_CPUCLK_RATE(1704000000, 1, 3, 1, 3, 3), |
150 | RK3288_CPUCLK_RATE(1608000000, 2, 4, 2, 4, 4), | 150 | RK3288_CPUCLK_RATE(1608000000, 1, 3, 1, 3, 3), |
151 | RK3288_CPUCLK_RATE(1512000000, 2, 4, 2, 4, 4), | 151 | RK3288_CPUCLK_RATE(1512000000, 1, 3, 1, 3, 3), |
152 | RK3288_CPUCLK_RATE(1416000000, 2, 4, 2, 4, 4), | 152 | RK3288_CPUCLK_RATE(1416000000, 1, 3, 1, 3, 3), |
153 | RK3288_CPUCLK_RATE(1200000000, 2, 4, 2, 4, 4), | 153 | RK3288_CPUCLK_RATE(1200000000, 1, 3, 1, 3, 3), |
154 | RK3288_CPUCLK_RATE(1008000000, 2, 4, 2, 4, 4), | 154 | RK3288_CPUCLK_RATE(1008000000, 1, 3, 1, 3, 3), |
155 | RK3288_CPUCLK_RATE( 816000000, 2, 4, 2, 4, 4), | 155 | RK3288_CPUCLK_RATE( 816000000, 1, 3, 1, 3, 3), |
156 | RK3288_CPUCLK_RATE( 696000000, 2, 4, 2, 4, 4), | 156 | RK3288_CPUCLK_RATE( 696000000, 1, 3, 1, 3, 3), |
157 | RK3288_CPUCLK_RATE( 600000000, 2, 4, 2, 4, 4), | 157 | RK3288_CPUCLK_RATE( 600000000, 1, 3, 1, 3, 3), |
158 | RK3288_CPUCLK_RATE( 408000000, 2, 4, 2, 4, 4), | 158 | RK3288_CPUCLK_RATE( 408000000, 1, 3, 1, 3, 3), |
159 | RK3288_CPUCLK_RATE( 312000000, 2, 4, 2, 4, 4), | 159 | RK3288_CPUCLK_RATE( 312000000, 1, 3, 1, 3, 3), |
160 | RK3288_CPUCLK_RATE( 216000000, 2, 4, 2, 4, 4), | 160 | RK3288_CPUCLK_RATE( 216000000, 1, 3, 1, 3, 3), |
161 | RK3288_CPUCLK_RATE( 126000000, 2, 4, 2, 4, 4), | 161 | RK3288_CPUCLK_RATE( 126000000, 1, 3, 1, 3, 3), |
162 | }; | 162 | }; |
163 | 163 | ||
164 | static const struct rockchip_cpuclk_reg_data rk3288_cpuclk_data = { | 164 | static const struct rockchip_cpuclk_reg_data rk3288_cpuclk_data = { |
diff --git a/drivers/clocksource/bcm_kona_timer.c b/drivers/clocksource/bcm_kona_timer.c index 0595dc6c453e..f1e33d08dd83 100644 --- a/drivers/clocksource/bcm_kona_timer.c +++ b/drivers/clocksource/bcm_kona_timer.c | |||
@@ -68,9 +68,8 @@ static void kona_timer_disable_and_clear(void __iomem *base) | |||
68 | } | 68 | } |
69 | 69 | ||
70 | static void | 70 | static void |
71 | kona_timer_get_counter(void *timer_base, uint32_t *msw, uint32_t *lsw) | 71 | kona_timer_get_counter(void __iomem *timer_base, uint32_t *msw, uint32_t *lsw) |
72 | { | 72 | { |
73 | void __iomem *base = IOMEM(timer_base); | ||
74 | int loop_limit = 4; | 73 | int loop_limit = 4; |
75 | 74 | ||
76 | /* | 75 | /* |
@@ -86,9 +85,9 @@ kona_timer_get_counter(void *timer_base, uint32_t *msw, uint32_t *lsw) | |||
86 | */ | 85 | */ |
87 | 86 | ||
88 | while (--loop_limit) { | 87 | while (--loop_limit) { |
89 | *msw = readl(base + KONA_GPTIMER_STCHI_OFFSET); | 88 | *msw = readl(timer_base + KONA_GPTIMER_STCHI_OFFSET); |
90 | *lsw = readl(base + KONA_GPTIMER_STCLO_OFFSET); | 89 | *lsw = readl(timer_base + KONA_GPTIMER_STCLO_OFFSET); |
91 | if (*msw == readl(base + KONA_GPTIMER_STCHI_OFFSET)) | 90 | if (*msw == readl(timer_base + KONA_GPTIMER_STCHI_OFFSET)) |
92 | break; | 91 | break; |
93 | } | 92 | } |
94 | if (!loop_limit) { | 93 | if (!loop_limit) { |
diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c index 9403061a2acc..83564c9cfdbe 100644 --- a/drivers/clocksource/exynos_mct.c +++ b/drivers/clocksource/exynos_mct.c | |||
@@ -97,8 +97,8 @@ static void exynos4_mct_write(unsigned int value, unsigned long offset) | |||
97 | writel_relaxed(value, reg_base + offset); | 97 | writel_relaxed(value, reg_base + offset); |
98 | 98 | ||
99 | if (likely(offset >= EXYNOS4_MCT_L_BASE(0))) { | 99 | if (likely(offset >= EXYNOS4_MCT_L_BASE(0))) { |
100 | stat_addr = (offset & ~EXYNOS4_MCT_L_MASK) + MCT_L_WSTAT_OFFSET; | 100 | stat_addr = (offset & EXYNOS4_MCT_L_MASK) + MCT_L_WSTAT_OFFSET; |
101 | switch (offset & EXYNOS4_MCT_L_MASK) { | 101 | switch (offset & ~EXYNOS4_MCT_L_MASK) { |
102 | case MCT_L_TCON_OFFSET: | 102 | case MCT_L_TCON_OFFSET: |
103 | mask = 1 << 3; /* L_TCON write status */ | 103 | mask = 1 << 3; /* L_TCON write status */ |
104 | break; | 104 | break; |
diff --git a/drivers/clocksource/sh_tmu.c b/drivers/clocksource/sh_tmu.c index 0f665b8f2461..f150ca82bfaf 100644 --- a/drivers/clocksource/sh_tmu.c +++ b/drivers/clocksource/sh_tmu.c | |||
@@ -428,7 +428,7 @@ static void sh_tmu_register_clockevent(struct sh_tmu_channel *ch, | |||
428 | ced->features = CLOCK_EVT_FEAT_PERIODIC; | 428 | ced->features = CLOCK_EVT_FEAT_PERIODIC; |
429 | ced->features |= CLOCK_EVT_FEAT_ONESHOT; | 429 | ced->features |= CLOCK_EVT_FEAT_ONESHOT; |
430 | ced->rating = 200; | 430 | ced->rating = 200; |
431 | ced->cpumask = cpumask_of(0); | 431 | ced->cpumask = cpu_possible_mask; |
432 | ced->set_next_event = sh_tmu_clock_event_next; | 432 | ced->set_next_event = sh_tmu_clock_event_next; |
433 | ced->set_mode = sh_tmu_clock_event_mode; | 433 | ced->set_mode = sh_tmu_clock_event_mode; |
434 | ced->suspend = sh_tmu_clock_event_suspend; | 434 | ced->suspend = sh_tmu_clock_event_suspend; |
diff --git a/drivers/dma/dw/core.c b/drivers/dma/dw/core.c index 380478562b7d..5c062548957c 100644 --- a/drivers/dma/dw/core.c +++ b/drivers/dma/dw/core.c | |||
@@ -1505,7 +1505,6 @@ int dw_dma_probe(struct dw_dma_chip *chip, struct dw_dma_platform_data *pdata) | |||
1505 | dw->regs = chip->regs; | 1505 | dw->regs = chip->regs; |
1506 | chip->dw = dw; | 1506 | chip->dw = dw; |
1507 | 1507 | ||
1508 | pm_runtime_enable(chip->dev); | ||
1509 | pm_runtime_get_sync(chip->dev); | 1508 | pm_runtime_get_sync(chip->dev); |
1510 | 1509 | ||
1511 | dw_params = dma_read_byaddr(chip->regs, DW_PARAMS); | 1510 | dw_params = dma_read_byaddr(chip->regs, DW_PARAMS); |
@@ -1703,7 +1702,6 @@ int dw_dma_remove(struct dw_dma_chip *chip) | |||
1703 | } | 1702 | } |
1704 | 1703 | ||
1705 | pm_runtime_put_sync_suspend(chip->dev); | 1704 | pm_runtime_put_sync_suspend(chip->dev); |
1706 | pm_runtime_disable(chip->dev); | ||
1707 | return 0; | 1705 | return 0; |
1708 | } | 1706 | } |
1709 | EXPORT_SYMBOL_GPL(dw_dma_remove); | 1707 | EXPORT_SYMBOL_GPL(dw_dma_remove); |
diff --git a/drivers/dma/dw/platform.c b/drivers/dma/dw/platform.c index a630161473a4..32ea1aca7a0e 100644 --- a/drivers/dma/dw/platform.c +++ b/drivers/dma/dw/platform.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/module.h> | 15 | #include <linux/module.h> |
16 | #include <linux/device.h> | 16 | #include <linux/device.h> |
17 | #include <linux/clk.h> | 17 | #include <linux/clk.h> |
18 | #include <linux/pm_runtime.h> | ||
18 | #include <linux/platform_device.h> | 19 | #include <linux/platform_device.h> |
19 | #include <linux/dmaengine.h> | 20 | #include <linux/dmaengine.h> |
20 | #include <linux/dma-mapping.h> | 21 | #include <linux/dma-mapping.h> |
@@ -185,6 +186,8 @@ static int dw_probe(struct platform_device *pdev) | |||
185 | if (err) | 186 | if (err) |
186 | return err; | 187 | return err; |
187 | 188 | ||
189 | pm_runtime_enable(&pdev->dev); | ||
190 | |||
188 | err = dw_dma_probe(chip, pdata); | 191 | err = dw_dma_probe(chip, pdata); |
189 | if (err) | 192 | if (err) |
190 | goto err_dw_dma_probe; | 193 | goto err_dw_dma_probe; |
@@ -205,6 +208,7 @@ static int dw_probe(struct platform_device *pdev) | |||
205 | return 0; | 208 | return 0; |
206 | 209 | ||
207 | err_dw_dma_probe: | 210 | err_dw_dma_probe: |
211 | pm_runtime_disable(&pdev->dev); | ||
208 | clk_disable_unprepare(chip->clk); | 212 | clk_disable_unprepare(chip->clk); |
209 | return err; | 213 | return err; |
210 | } | 214 | } |
@@ -217,6 +221,7 @@ static int dw_remove(struct platform_device *pdev) | |||
217 | of_dma_controller_free(pdev->dev.of_node); | 221 | of_dma_controller_free(pdev->dev.of_node); |
218 | 222 | ||
219 | dw_dma_remove(chip); | 223 | dw_dma_remove(chip); |
224 | pm_runtime_disable(&pdev->dev); | ||
220 | clk_disable_unprepare(chip->clk); | 225 | clk_disable_unprepare(chip->clk); |
221 | 226 | ||
222 | return 0; | 227 | return 0; |
diff --git a/drivers/gpio/gpio-crystalcove.c b/drivers/gpio/gpio-crystalcove.c index 55d4803d71b0..3d9e08f7e823 100644 --- a/drivers/gpio/gpio-crystalcove.c +++ b/drivers/gpio/gpio-crystalcove.c | |||
@@ -272,7 +272,7 @@ static irqreturn_t crystalcove_gpio_irq_handler(int irq, void *data) | |||
272 | for (gpio = 0; gpio < CRYSTALCOVE_GPIO_NUM; gpio++) { | 272 | for (gpio = 0; gpio < CRYSTALCOVE_GPIO_NUM; gpio++) { |
273 | if (pending & BIT(gpio)) { | 273 | if (pending & BIT(gpio)) { |
274 | virq = irq_find_mapping(cg->chip.irqdomain, gpio); | 274 | virq = irq_find_mapping(cg->chip.irqdomain, gpio); |
275 | generic_handle_irq(virq); | 275 | handle_nested_irq(virq); |
276 | } | 276 | } |
277 | } | 277 | } |
278 | 278 | ||
diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c index 604dbe60bdee..08261f2b3a82 100644 --- a/drivers/gpio/gpiolib-of.c +++ b/drivers/gpio/gpiolib-of.c | |||
@@ -45,8 +45,14 @@ static int of_gpiochip_find_and_xlate(struct gpio_chip *gc, void *data) | |||
45 | return false; | 45 | return false; |
46 | 46 | ||
47 | ret = gc->of_xlate(gc, &gg_data->gpiospec, gg_data->flags); | 47 | ret = gc->of_xlate(gc, &gg_data->gpiospec, gg_data->flags); |
48 | if (ret < 0) | 48 | if (ret < 0) { |
49 | return false; | 49 | /* We've found the gpio chip, but the translation failed. |
50 | * Return true to stop looking and return the translation | ||
51 | * error via out_gpio | ||
52 | */ | ||
53 | gg_data->out_gpio = ERR_PTR(ret); | ||
54 | return true; | ||
55 | } | ||
50 | 56 | ||
51 | gg_data->out_gpio = gpiochip_get_desc(gc, ret); | 57 | gg_data->out_gpio = gpiochip_get_desc(gc, ret); |
52 | return true; | 58 | return true; |
diff --git a/drivers/gpio/gpiolib-sysfs.c b/drivers/gpio/gpiolib-sysfs.c index 2ac1800b58bb..f62aa115d79a 100644 --- a/drivers/gpio/gpiolib-sysfs.c +++ b/drivers/gpio/gpiolib-sysfs.c | |||
@@ -128,7 +128,7 @@ static ssize_t gpio_value_store(struct device *dev, | |||
128 | return status; | 128 | return status; |
129 | } | 129 | } |
130 | 130 | ||
131 | static const DEVICE_ATTR(value, 0644, | 131 | static DEVICE_ATTR(value, 0644, |
132 | gpio_value_show, gpio_value_store); | 132 | gpio_value_show, gpio_value_store); |
133 | 133 | ||
134 | static irqreturn_t gpio_sysfs_irq(int irq, void *priv) | 134 | static irqreturn_t gpio_sysfs_irq(int irq, void *priv) |
@@ -353,17 +353,46 @@ static ssize_t gpio_active_low_store(struct device *dev, | |||
353 | return status ? : size; | 353 | return status ? : size; |
354 | } | 354 | } |
355 | 355 | ||
356 | static const DEVICE_ATTR(active_low, 0644, | 356 | static DEVICE_ATTR(active_low, 0644, |
357 | gpio_active_low_show, gpio_active_low_store); | 357 | gpio_active_low_show, gpio_active_low_store); |
358 | 358 | ||
359 | static const struct attribute *gpio_attrs[] = { | 359 | static umode_t gpio_is_visible(struct kobject *kobj, struct attribute *attr, |
360 | int n) | ||
361 | { | ||
362 | struct device *dev = container_of(kobj, struct device, kobj); | ||
363 | struct gpio_desc *desc = dev_get_drvdata(dev); | ||
364 | umode_t mode = attr->mode; | ||
365 | bool show_direction = test_bit(FLAG_SYSFS_DIR, &desc->flags); | ||
366 | |||
367 | if (attr == &dev_attr_direction.attr) { | ||
368 | if (!show_direction) | ||
369 | mode = 0; | ||
370 | } else if (attr == &dev_attr_edge.attr) { | ||
371 | if (gpiod_to_irq(desc) < 0) | ||
372 | mode = 0; | ||
373 | if (!show_direction && test_bit(FLAG_IS_OUT, &desc->flags)) | ||
374 | mode = 0; | ||
375 | } | ||
376 | |||
377 | return mode; | ||
378 | } | ||
379 | |||
380 | static struct attribute *gpio_attrs[] = { | ||
381 | &dev_attr_direction.attr, | ||
382 | &dev_attr_edge.attr, | ||
360 | &dev_attr_value.attr, | 383 | &dev_attr_value.attr, |
361 | &dev_attr_active_low.attr, | 384 | &dev_attr_active_low.attr, |
362 | NULL, | 385 | NULL, |
363 | }; | 386 | }; |
364 | 387 | ||
365 | static const struct attribute_group gpio_attr_group = { | 388 | static const struct attribute_group gpio_group = { |
366 | .attrs = (struct attribute **) gpio_attrs, | 389 | .attrs = gpio_attrs, |
390 | .is_visible = gpio_is_visible, | ||
391 | }; | ||
392 | |||
393 | static const struct attribute_group *gpio_groups[] = { | ||
394 | &gpio_group, | ||
395 | NULL | ||
367 | }; | 396 | }; |
368 | 397 | ||
369 | /* | 398 | /* |
@@ -400,16 +429,13 @@ static ssize_t chip_ngpio_show(struct device *dev, | |||
400 | } | 429 | } |
401 | static DEVICE_ATTR(ngpio, 0444, chip_ngpio_show, NULL); | 430 | static DEVICE_ATTR(ngpio, 0444, chip_ngpio_show, NULL); |
402 | 431 | ||
403 | static const struct attribute *gpiochip_attrs[] = { | 432 | static struct attribute *gpiochip_attrs[] = { |
404 | &dev_attr_base.attr, | 433 | &dev_attr_base.attr, |
405 | &dev_attr_label.attr, | 434 | &dev_attr_label.attr, |
406 | &dev_attr_ngpio.attr, | 435 | &dev_attr_ngpio.attr, |
407 | NULL, | 436 | NULL, |
408 | }; | 437 | }; |
409 | 438 | ATTRIBUTE_GROUPS(gpiochip); | |
410 | static const struct attribute_group gpiochip_attr_group = { | ||
411 | .attrs = (struct attribute **) gpiochip_attrs, | ||
412 | }; | ||
413 | 439 | ||
414 | /* | 440 | /* |
415 | * /sys/class/gpio/export ... write-only | 441 | * /sys/class/gpio/export ... write-only |
@@ -556,45 +582,30 @@ int gpiod_export(struct gpio_desc *desc, bool direction_may_change) | |||
556 | goto fail_unlock; | 582 | goto fail_unlock; |
557 | } | 583 | } |
558 | 584 | ||
559 | if (!desc->chip->direction_input || !desc->chip->direction_output) | 585 | if (desc->chip->direction_input && desc->chip->direction_output && |
560 | direction_may_change = false; | 586 | direction_may_change) { |
587 | set_bit(FLAG_SYSFS_DIR, &desc->flags); | ||
588 | } | ||
589 | |||
561 | spin_unlock_irqrestore(&gpio_lock, flags); | 590 | spin_unlock_irqrestore(&gpio_lock, flags); |
562 | 591 | ||
563 | offset = gpio_chip_hwgpio(desc); | 592 | offset = gpio_chip_hwgpio(desc); |
564 | if (desc->chip->names && desc->chip->names[offset]) | 593 | if (desc->chip->names && desc->chip->names[offset]) |
565 | ioname = desc->chip->names[offset]; | 594 | ioname = desc->chip->names[offset]; |
566 | 595 | ||
567 | dev = device_create(&gpio_class, desc->chip->dev, MKDEV(0, 0), | 596 | dev = device_create_with_groups(&gpio_class, desc->chip->dev, |
568 | desc, ioname ? ioname : "gpio%u", | 597 | MKDEV(0, 0), desc, gpio_groups, |
569 | desc_to_gpio(desc)); | 598 | ioname ? ioname : "gpio%u", |
599 | desc_to_gpio(desc)); | ||
570 | if (IS_ERR(dev)) { | 600 | if (IS_ERR(dev)) { |
571 | status = PTR_ERR(dev); | 601 | status = PTR_ERR(dev); |
572 | goto fail_unlock; | 602 | goto fail_unlock; |
573 | } | 603 | } |
574 | 604 | ||
575 | status = sysfs_create_group(&dev->kobj, &gpio_attr_group); | ||
576 | if (status) | ||
577 | goto fail_unregister_device; | ||
578 | |||
579 | if (direction_may_change) { | ||
580 | status = device_create_file(dev, &dev_attr_direction); | ||
581 | if (status) | ||
582 | goto fail_unregister_device; | ||
583 | } | ||
584 | |||
585 | if (gpiod_to_irq(desc) >= 0 && (direction_may_change || | ||
586 | !test_bit(FLAG_IS_OUT, &desc->flags))) { | ||
587 | status = device_create_file(dev, &dev_attr_edge); | ||
588 | if (status) | ||
589 | goto fail_unregister_device; | ||
590 | } | ||
591 | |||
592 | set_bit(FLAG_EXPORT, &desc->flags); | 605 | set_bit(FLAG_EXPORT, &desc->flags); |
593 | mutex_unlock(&sysfs_lock); | 606 | mutex_unlock(&sysfs_lock); |
594 | return 0; | 607 | return 0; |
595 | 608 | ||
596 | fail_unregister_device: | ||
597 | device_unregister(dev); | ||
598 | fail_unlock: | 609 | fail_unlock: |
599 | mutex_unlock(&sysfs_lock); | 610 | mutex_unlock(&sysfs_lock); |
600 | gpiod_dbg(desc, "%s: status %d\n", __func__, status); | 611 | gpiod_dbg(desc, "%s: status %d\n", __func__, status); |
@@ -718,6 +729,7 @@ void gpiod_unexport(struct gpio_desc *desc) | |||
718 | dev = class_find_device(&gpio_class, NULL, desc, match_export); | 729 | dev = class_find_device(&gpio_class, NULL, desc, match_export); |
719 | if (dev) { | 730 | if (dev) { |
720 | gpio_setup_irq(desc, dev, 0); | 731 | gpio_setup_irq(desc, dev, 0); |
732 | clear_bit(FLAG_SYSFS_DIR, &desc->flags); | ||
721 | clear_bit(FLAG_EXPORT, &desc->flags); | 733 | clear_bit(FLAG_EXPORT, &desc->flags); |
722 | } else | 734 | } else |
723 | status = -ENODEV; | 735 | status = -ENODEV; |
@@ -750,13 +762,13 @@ int gpiochip_export(struct gpio_chip *chip) | |||
750 | 762 | ||
751 | /* use chip->base for the ID; it's already known to be unique */ | 763 | /* use chip->base for the ID; it's already known to be unique */ |
752 | mutex_lock(&sysfs_lock); | 764 | mutex_lock(&sysfs_lock); |
753 | dev = device_create(&gpio_class, chip->dev, MKDEV(0, 0), chip, | 765 | dev = device_create_with_groups(&gpio_class, chip->dev, MKDEV(0, 0), |
754 | "gpiochip%d", chip->base); | 766 | chip, gpiochip_groups, |
755 | if (!IS_ERR(dev)) { | 767 | "gpiochip%d", chip->base); |
756 | status = sysfs_create_group(&dev->kobj, | 768 | if (IS_ERR(dev)) |
757 | &gpiochip_attr_group); | ||
758 | } else | ||
759 | status = PTR_ERR(dev); | 769 | status = PTR_ERR(dev); |
770 | else | ||
771 | status = 0; | ||
760 | chip->exported = (status == 0); | 772 | chip->exported = (status == 0); |
761 | mutex_unlock(&sysfs_lock); | 773 | mutex_unlock(&sysfs_lock); |
762 | 774 | ||
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 487afe6f22fc..568aa2b6bdb0 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c | |||
@@ -248,29 +248,30 @@ int gpiochip_add(struct gpio_chip *chip) | |||
248 | base = gpiochip_find_base(chip->ngpio); | 248 | base = gpiochip_find_base(chip->ngpio); |
249 | if (base < 0) { | 249 | if (base < 0) { |
250 | status = base; | 250 | status = base; |
251 | goto unlock; | 251 | spin_unlock_irqrestore(&gpio_lock, flags); |
252 | goto err_free_descs; | ||
252 | } | 253 | } |
253 | chip->base = base; | 254 | chip->base = base; |
254 | } | 255 | } |
255 | 256 | ||
256 | status = gpiochip_add_to_list(chip); | 257 | status = gpiochip_add_to_list(chip); |
258 | if (status) { | ||
259 | spin_unlock_irqrestore(&gpio_lock, flags); | ||
260 | goto err_free_descs; | ||
261 | } | ||
257 | 262 | ||
258 | if (status == 0) { | 263 | for (id = 0; id < chip->ngpio; id++) { |
259 | for (id = 0; id < chip->ngpio; id++) { | 264 | struct gpio_desc *desc = &descs[id]; |
260 | struct gpio_desc *desc = &descs[id]; | 265 | |
261 | desc->chip = chip; | 266 | desc->chip = chip; |
262 | 267 | ||
263 | /* REVISIT: most hardware initializes GPIOs as | 268 | /* REVISIT: most hardware initializes GPIOs as inputs (often |
264 | * inputs (often with pullups enabled) so power | 269 | * with pullups enabled) so power usage is minimized. Linux |
265 | * usage is minimized. Linux code should set the | 270 | * code should set the gpio direction first thing; but until |
266 | * gpio direction first thing; but until it does, | 271 | * it does, and in case chip->get_direction is not set, we may |
267 | * and in case chip->get_direction is not set, | 272 | * expose the wrong direction in sysfs. |
268 | * we may expose the wrong direction in sysfs. | 273 | */ |
269 | */ | 274 | desc->flags = !chip->direction_input ? (1 << FLAG_IS_OUT) : 0; |
270 | desc->flags = !chip->direction_input | ||
271 | ? (1 << FLAG_IS_OUT) | ||
272 | : 0; | ||
273 | } | ||
274 | } | 275 | } |
275 | 276 | ||
276 | chip->desc = descs; | 277 | chip->desc = descs; |
@@ -284,12 +285,9 @@ int gpiochip_add(struct gpio_chip *chip) | |||
284 | of_gpiochip_add(chip); | 285 | of_gpiochip_add(chip); |
285 | acpi_gpiochip_add(chip); | 286 | acpi_gpiochip_add(chip); |
286 | 287 | ||
287 | if (status) | ||
288 | goto fail; | ||
289 | |||
290 | status = gpiochip_export(chip); | 288 | status = gpiochip_export(chip); |
291 | if (status) | 289 | if (status) |
292 | goto fail; | 290 | goto err_remove_chip; |
293 | 291 | ||
294 | pr_debug("%s: registered GPIOs %d to %d on device: %s\n", __func__, | 292 | pr_debug("%s: registered GPIOs %d to %d on device: %s\n", __func__, |
295 | chip->base, chip->base + chip->ngpio - 1, | 293 | chip->base, chip->base + chip->ngpio - 1, |
@@ -297,11 +295,15 @@ int gpiochip_add(struct gpio_chip *chip) | |||
297 | 295 | ||
298 | return 0; | 296 | return 0; |
299 | 297 | ||
300 | unlock: | 298 | err_remove_chip: |
299 | acpi_gpiochip_remove(chip); | ||
300 | of_gpiochip_remove(chip); | ||
301 | spin_lock_irqsave(&gpio_lock, flags); | ||
302 | list_del(&chip->list); | ||
301 | spin_unlock_irqrestore(&gpio_lock, flags); | 303 | spin_unlock_irqrestore(&gpio_lock, flags); |
302 | fail: | ||
303 | kfree(descs); | ||
304 | chip->desc = NULL; | 304 | chip->desc = NULL; |
305 | err_free_descs: | ||
306 | kfree(descs); | ||
305 | 307 | ||
306 | /* failures here can mean systems won't boot... */ | 308 | /* failures here can mean systems won't boot... */ |
307 | pr_err("%s: GPIOs %d..%d (%s) failed to register\n", __func__, | 309 | pr_err("%s: GPIOs %d..%d (%s) failed to register\n", __func__, |
@@ -325,14 +327,15 @@ void gpiochip_remove(struct gpio_chip *chip) | |||
325 | unsigned long flags; | 327 | unsigned long flags; |
326 | unsigned id; | 328 | unsigned id; |
327 | 329 | ||
328 | acpi_gpiochip_remove(chip); | 330 | gpiochip_unexport(chip); |
329 | |||
330 | spin_lock_irqsave(&gpio_lock, flags); | ||
331 | 331 | ||
332 | gpiochip_irqchip_remove(chip); | 332 | gpiochip_irqchip_remove(chip); |
333 | |||
334 | acpi_gpiochip_remove(chip); | ||
333 | gpiochip_remove_pin_ranges(chip); | 335 | gpiochip_remove_pin_ranges(chip); |
334 | of_gpiochip_remove(chip); | 336 | of_gpiochip_remove(chip); |
335 | 337 | ||
338 | spin_lock_irqsave(&gpio_lock, flags); | ||
336 | for (id = 0; id < chip->ngpio; id++) { | 339 | for (id = 0; id < chip->ngpio; id++) { |
337 | if (test_bit(FLAG_REQUESTED, &chip->desc[id].flags)) | 340 | if (test_bit(FLAG_REQUESTED, &chip->desc[id].flags)) |
338 | dev_crit(chip->dev, "REMOVING GPIOCHIP WITH GPIOS STILL REQUESTED\n"); | 341 | dev_crit(chip->dev, "REMOVING GPIOCHIP WITH GPIOS STILL REQUESTED\n"); |
@@ -342,7 +345,6 @@ void gpiochip_remove(struct gpio_chip *chip) | |||
342 | 345 | ||
343 | list_del(&chip->list); | 346 | list_del(&chip->list); |
344 | spin_unlock_irqrestore(&gpio_lock, flags); | 347 | spin_unlock_irqrestore(&gpio_lock, flags); |
345 | gpiochip_unexport(chip); | ||
346 | 348 | ||
347 | kfree(chip->desc); | 349 | kfree(chip->desc); |
348 | chip->desc = NULL; | 350 | chip->desc = NULL; |
diff --git a/drivers/gpio/gpiolib.h b/drivers/gpio/gpiolib.h index e3a52113a541..550a5eafbd38 100644 --- a/drivers/gpio/gpiolib.h +++ b/drivers/gpio/gpiolib.h | |||
@@ -77,6 +77,7 @@ struct gpio_desc { | |||
77 | #define FLAG_OPEN_DRAIN 7 /* Gpio is open drain type */ | 77 | #define FLAG_OPEN_DRAIN 7 /* Gpio is open drain type */ |
78 | #define FLAG_OPEN_SOURCE 8 /* Gpio is open source type */ | 78 | #define FLAG_OPEN_SOURCE 8 /* Gpio is open source type */ |
79 | #define FLAG_USED_AS_IRQ 9 /* GPIO is connected to an IRQ */ | 79 | #define FLAG_USED_AS_IRQ 9 /* GPIO is connected to an IRQ */ |
80 | #define FLAG_SYSFS_DIR 10 /* show sysfs direction attribute */ | ||
80 | 81 | ||
81 | #define ID_SHIFT 16 /* add new flags before this one */ | 82 | #define ID_SHIFT 16 /* add new flags before this one */ |
82 | 83 | ||
diff --git a/drivers/gpu/drm/amd/amdkfd/Makefile b/drivers/gpu/drm/amd/amdkfd/Makefile index be6246de5091..307a309110e6 100644 --- a/drivers/gpu/drm/amd/amdkfd/Makefile +++ b/drivers/gpu/drm/amd/amdkfd/Makefile | |||
@@ -8,7 +8,6 @@ amdkfd-y := kfd_module.o kfd_device.o kfd_chardev.o kfd_topology.o \ | |||
8 | kfd_pasid.o kfd_doorbell.o kfd_flat_memory.o \ | 8 | kfd_pasid.o kfd_doorbell.o kfd_flat_memory.o \ |
9 | kfd_process.o kfd_queue.o kfd_mqd_manager.o \ | 9 | kfd_process.o kfd_queue.o kfd_mqd_manager.o \ |
10 | kfd_kernel_queue.o kfd_packet_manager.o \ | 10 | kfd_kernel_queue.o kfd_packet_manager.o \ |
11 | kfd_process_queue_manager.o kfd_device_queue_manager.o \ | 11 | kfd_process_queue_manager.o kfd_device_queue_manager.o |
12 | kfd_interrupt.o | ||
13 | 12 | ||
14 | obj-$(CONFIG_HSA_AMD) += amdkfd.o | 13 | obj-$(CONFIG_HSA_AMD) += amdkfd.o |
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device.c b/drivers/gpu/drm/amd/amdkfd/kfd_device.c index 43884ebd4303..633532a2e7ec 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_device.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device.c | |||
@@ -192,13 +192,6 @@ bool kgd2kfd_device_init(struct kfd_dev *kfd, | |||
192 | goto kfd_topology_add_device_error; | 192 | goto kfd_topology_add_device_error; |
193 | } | 193 | } |
194 | 194 | ||
195 | if (kfd_interrupt_init(kfd)) { | ||
196 | dev_err(kfd_device, | ||
197 | "Error initializing interrupts for device (%x:%x)\n", | ||
198 | kfd->pdev->vendor, kfd->pdev->device); | ||
199 | goto kfd_interrupt_error; | ||
200 | } | ||
201 | |||
202 | if (!device_iommu_pasid_init(kfd)) { | 195 | if (!device_iommu_pasid_init(kfd)) { |
203 | dev_err(kfd_device, | 196 | dev_err(kfd_device, |
204 | "Error initializing iommuv2 for device (%x:%x)\n", | 197 | "Error initializing iommuv2 for device (%x:%x)\n", |
@@ -237,8 +230,6 @@ dqm_start_error: | |||
237 | device_queue_manager_error: | 230 | device_queue_manager_error: |
238 | amd_iommu_free_device(kfd->pdev); | 231 | amd_iommu_free_device(kfd->pdev); |
239 | device_iommu_pasid_error: | 232 | device_iommu_pasid_error: |
240 | kfd_interrupt_exit(kfd); | ||
241 | kfd_interrupt_error: | ||
242 | kfd_topology_remove_device(kfd); | 233 | kfd_topology_remove_device(kfd); |
243 | kfd_topology_add_device_error: | 234 | kfd_topology_add_device_error: |
244 | kfd2kgd->fini_sa_manager(kfd->kgd); | 235 | kfd2kgd->fini_sa_manager(kfd->kgd); |
@@ -254,7 +245,6 @@ void kgd2kfd_device_exit(struct kfd_dev *kfd) | |||
254 | if (kfd->init_complete) { | 245 | if (kfd->init_complete) { |
255 | device_queue_manager_uninit(kfd->dqm); | 246 | device_queue_manager_uninit(kfd->dqm); |
256 | amd_iommu_free_device(kfd->pdev); | 247 | amd_iommu_free_device(kfd->pdev); |
257 | kfd_interrupt_exit(kfd); | ||
258 | kfd_topology_remove_device(kfd); | 248 | kfd_topology_remove_device(kfd); |
259 | } | 249 | } |
260 | 250 | ||
@@ -296,13 +286,5 @@ int kgd2kfd_resume(struct kfd_dev *kfd) | |||
296 | /* This is called directly from KGD at ISR. */ | 286 | /* This is called directly from KGD at ISR. */ |
297 | void kgd2kfd_interrupt(struct kfd_dev *kfd, const void *ih_ring_entry) | 287 | void kgd2kfd_interrupt(struct kfd_dev *kfd, const void *ih_ring_entry) |
298 | { | 288 | { |
299 | if (kfd->init_complete) { | 289 | /* Process interrupts / schedule work as necessary */ |
300 | spin_lock(&kfd->interrupt_lock); | ||
301 | |||
302 | if (kfd->interrupts_active | ||
303 | && enqueue_ih_ring_entry(kfd, ih_ring_entry)) | ||
304 | schedule_work(&kfd->interrupt_work); | ||
305 | |||
306 | spin_unlock(&kfd->interrupt_lock); | ||
307 | } | ||
308 | } | 290 | } |
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c index 9c8961d22360..30c8fda9622e 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c | |||
@@ -280,7 +280,7 @@ static int create_compute_queue_nocpsch(struct device_queue_manager *dqm, | |||
280 | q->queue); | 280 | q->queue); |
281 | 281 | ||
282 | retval = mqd->load_mqd(mqd, q->mqd, q->pipe, | 282 | retval = mqd->load_mqd(mqd, q->mqd, q->pipe, |
283 | q->queue, q->properties.write_ptr); | 283 | q->queue, (uint32_t __user *) q->properties.write_ptr); |
284 | if (retval != 0) { | 284 | if (retval != 0) { |
285 | deallocate_hqd(dqm, q); | 285 | deallocate_hqd(dqm, q); |
286 | mqd->uninit_mqd(mqd, q->mqd, q->mqd_mem_obj); | 286 | mqd->uninit_mqd(mqd, q->mqd, q->mqd_mem_obj); |
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_interrupt.c b/drivers/gpu/drm/amd/amdkfd/kfd_interrupt.c deleted file mode 100644 index 5b999095a1f7..000000000000 --- a/drivers/gpu/drm/amd/amdkfd/kfd_interrupt.c +++ /dev/null | |||
@@ -1,176 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright 2014 Advanced Micro Devices, Inc. | ||
3 | * | ||
4 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
5 | * copy of this software and associated documentation files (the "Software"), | ||
6 | * to deal in the Software without restriction, including without limitation | ||
7 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
8 | * and/or sell copies of the Software, and to permit persons to whom the | ||
9 | * Software is furnished to do so, subject to the following conditions: | ||
10 | * | ||
11 | * The above copyright notice and this permission notice shall be included in | ||
12 | * all copies or substantial portions of the Software. | ||
13 | * | ||
14 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
15 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
16 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
17 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
18 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
19 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
20 | * OTHER DEALINGS IN THE SOFTWARE. | ||
21 | */ | ||
22 | |||
23 | /* | ||
24 | * KFD Interrupts. | ||
25 | * | ||
26 | * AMD GPUs deliver interrupts by pushing an interrupt description onto the | ||
27 | * interrupt ring and then sending an interrupt. KGD receives the interrupt | ||
28 | * in ISR and sends us a pointer to each new entry on the interrupt ring. | ||
29 | * | ||
30 | * We generally can't process interrupt-signaled events from ISR, so we call | ||
31 | * out to each interrupt client module (currently only the scheduler) to ask if | ||
32 | * each interrupt is interesting. If they return true, then it requires further | ||
33 | * processing so we copy it to an internal interrupt ring and call each | ||
34 | * interrupt client again from a work-queue. | ||
35 | * | ||
36 | * There's no acknowledgment for the interrupts we use. The hardware simply | ||
37 | * queues a new interrupt each time without waiting. | ||
38 | * | ||
39 | * The fixed-size internal queue means that it's possible for us to lose | ||
40 | * interrupts because we have no back-pressure to the hardware. | ||
41 | */ | ||
42 | |||
43 | #include <linux/slab.h> | ||
44 | #include <linux/device.h> | ||
45 | #include "kfd_priv.h" | ||
46 | |||
47 | #define KFD_INTERRUPT_RING_SIZE 256 | ||
48 | |||
49 | static void interrupt_wq(struct work_struct *); | ||
50 | |||
51 | int kfd_interrupt_init(struct kfd_dev *kfd) | ||
52 | { | ||
53 | void *interrupt_ring = kmalloc_array(KFD_INTERRUPT_RING_SIZE, | ||
54 | kfd->device_info->ih_ring_entry_size, | ||
55 | GFP_KERNEL); | ||
56 | if (!interrupt_ring) | ||
57 | return -ENOMEM; | ||
58 | |||
59 | kfd->interrupt_ring = interrupt_ring; | ||
60 | kfd->interrupt_ring_size = | ||
61 | KFD_INTERRUPT_RING_SIZE * kfd->device_info->ih_ring_entry_size; | ||
62 | atomic_set(&kfd->interrupt_ring_wptr, 0); | ||
63 | atomic_set(&kfd->interrupt_ring_rptr, 0); | ||
64 | |||
65 | spin_lock_init(&kfd->interrupt_lock); | ||
66 | |||
67 | INIT_WORK(&kfd->interrupt_work, interrupt_wq); | ||
68 | |||
69 | kfd->interrupts_active = true; | ||
70 | |||
71 | /* | ||
72 | * After this function returns, the interrupt will be enabled. This | ||
73 | * barrier ensures that the interrupt running on a different processor | ||
74 | * sees all the above writes. | ||
75 | */ | ||
76 | smp_wmb(); | ||
77 | |||
78 | return 0; | ||
79 | } | ||
80 | |||
81 | void kfd_interrupt_exit(struct kfd_dev *kfd) | ||
82 | { | ||
83 | /* | ||
84 | * Stop the interrupt handler from writing to the ring and scheduling | ||
85 | * workqueue items. The spinlock ensures that any interrupt running | ||
86 | * after we have unlocked sees interrupts_active = false. | ||
87 | */ | ||
88 | unsigned long flags; | ||
89 | |||
90 | spin_lock_irqsave(&kfd->interrupt_lock, flags); | ||
91 | kfd->interrupts_active = false; | ||
92 | spin_unlock_irqrestore(&kfd->interrupt_lock, flags); | ||
93 | |||
94 | /* | ||
95 | * Flush_scheduled_work ensures that there are no outstanding | ||
96 | * work-queue items that will access interrupt_ring. New work items | ||
97 | * can't be created because we stopped interrupt handling above. | ||
98 | */ | ||
99 | flush_scheduled_work(); | ||
100 | |||
101 | kfree(kfd->interrupt_ring); | ||
102 | } | ||
103 | |||
104 | /* | ||
105 | * This assumes that it can't be called concurrently with itself | ||
106 | * but only with dequeue_ih_ring_entry. | ||
107 | */ | ||
108 | bool enqueue_ih_ring_entry(struct kfd_dev *kfd, const void *ih_ring_entry) | ||
109 | { | ||
110 | unsigned int rptr = atomic_read(&kfd->interrupt_ring_rptr); | ||
111 | unsigned int wptr = atomic_read(&kfd->interrupt_ring_wptr); | ||
112 | |||
113 | if ((rptr - wptr) % kfd->interrupt_ring_size == | ||
114 | kfd->device_info->ih_ring_entry_size) { | ||
115 | /* This is very bad, the system is likely to hang. */ | ||
116 | dev_err_ratelimited(kfd_chardev(), | ||
117 | "Interrupt ring overflow, dropping interrupt.\n"); | ||
118 | return false; | ||
119 | } | ||
120 | |||
121 | memcpy(kfd->interrupt_ring + wptr, ih_ring_entry, | ||
122 | kfd->device_info->ih_ring_entry_size); | ||
123 | |||
124 | wptr = (wptr + kfd->device_info->ih_ring_entry_size) % | ||
125 | kfd->interrupt_ring_size; | ||
126 | smp_wmb(); /* Ensure memcpy'd data is visible before wptr update. */ | ||
127 | atomic_set(&kfd->interrupt_ring_wptr, wptr); | ||
128 | |||
129 | return true; | ||
130 | } | ||
131 | |||
132 | /* | ||
133 | * This assumes that it can't be called concurrently with itself | ||
134 | * but only with enqueue_ih_ring_entry. | ||
135 | */ | ||
136 | static bool dequeue_ih_ring_entry(struct kfd_dev *kfd, void *ih_ring_entry) | ||
137 | { | ||
138 | /* | ||
139 | * Assume that wait queues have an implicit barrier, i.e. anything that | ||
140 | * happened in the ISR before it queued work is visible. | ||
141 | */ | ||
142 | |||
143 | unsigned int wptr = atomic_read(&kfd->interrupt_ring_wptr); | ||
144 | unsigned int rptr = atomic_read(&kfd->interrupt_ring_rptr); | ||
145 | |||
146 | if (rptr == wptr) | ||
147 | return false; | ||
148 | |||
149 | memcpy(ih_ring_entry, kfd->interrupt_ring + rptr, | ||
150 | kfd->device_info->ih_ring_entry_size); | ||
151 | |||
152 | rptr = (rptr + kfd->device_info->ih_ring_entry_size) % | ||
153 | kfd->interrupt_ring_size; | ||
154 | |||
155 | /* | ||
156 | * Ensure the rptr write update is not visible until | ||
157 | * memcpy has finished reading. | ||
158 | */ | ||
159 | smp_mb(); | ||
160 | atomic_set(&kfd->interrupt_ring_rptr, rptr); | ||
161 | |||
162 | return true; | ||
163 | } | ||
164 | |||
165 | static void interrupt_wq(struct work_struct *work) | ||
166 | { | ||
167 | struct kfd_dev *dev = container_of(work, struct kfd_dev, | ||
168 | interrupt_work); | ||
169 | |||
170 | uint32_t ih_ring_entry[DIV_ROUND_UP( | ||
171 | dev->device_info->ih_ring_entry_size, | ||
172 | sizeof(uint32_t))]; | ||
173 | |||
174 | while (dequeue_ih_ring_entry(dev, ih_ring_entry)) | ||
175 | ; | ||
176 | } | ||
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h index a5edb29507e3..b3dc13c83169 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h +++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h | |||
@@ -135,22 +135,10 @@ struct kfd_dev { | |||
135 | 135 | ||
136 | struct kgd2kfd_shared_resources shared_resources; | 136 | struct kgd2kfd_shared_resources shared_resources; |
137 | 137 | ||
138 | void *interrupt_ring; | ||
139 | size_t interrupt_ring_size; | ||
140 | atomic_t interrupt_ring_rptr; | ||
141 | atomic_t interrupt_ring_wptr; | ||
142 | struct work_struct interrupt_work; | ||
143 | spinlock_t interrupt_lock; | ||
144 | |||
145 | /* QCM Device instance */ | 138 | /* QCM Device instance */ |
146 | struct device_queue_manager *dqm; | 139 | struct device_queue_manager *dqm; |
147 | 140 | ||
148 | bool init_complete; | 141 | bool init_complete; |
149 | /* | ||
150 | * Interrupts of interest to KFD are copied | ||
151 | * from the HW ring into a SW ring. | ||
152 | */ | ||
153 | bool interrupts_active; | ||
154 | }; | 142 | }; |
155 | 143 | ||
156 | /* KGD2KFD callbacks */ | 144 | /* KGD2KFD callbacks */ |
@@ -531,10 +519,7 @@ struct kfd_dev *kfd_device_by_pci_dev(const struct pci_dev *pdev); | |||
531 | struct kfd_dev *kfd_topology_enum_kfd_devices(uint8_t idx); | 519 | struct kfd_dev *kfd_topology_enum_kfd_devices(uint8_t idx); |
532 | 520 | ||
533 | /* Interrupts */ | 521 | /* Interrupts */ |
534 | int kfd_interrupt_init(struct kfd_dev *dev); | ||
535 | void kfd_interrupt_exit(struct kfd_dev *dev); | ||
536 | void kgd2kfd_interrupt(struct kfd_dev *kfd, const void *ih_ring_entry); | 522 | void kgd2kfd_interrupt(struct kfd_dev *kfd, const void *ih_ring_entry); |
537 | bool enqueue_ih_ring_entry(struct kfd_dev *kfd, const void *ih_ring_entry); | ||
538 | 523 | ||
539 | /* Power Management */ | 524 | /* Power Management */ |
540 | void kgd2kfd_suspend(struct kfd_dev *kfd); | 525 | void kgd2kfd_suspend(struct kfd_dev *kfd); |
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index 52ce26d6b4fb..cf775a4449c1 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c | |||
@@ -741,7 +741,9 @@ int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info) | |||
741 | int i, j, rc = 0; | 741 | int i, j, rc = 0; |
742 | int start; | 742 | int start; |
743 | 743 | ||
744 | drm_modeset_lock_all(dev); | 744 | if (__drm_modeset_lock_all(dev, !!oops_in_progress)) { |
745 | return -EBUSY; | ||
746 | } | ||
745 | if (!drm_fb_helper_is_bound(fb_helper)) { | 747 | if (!drm_fb_helper_is_bound(fb_helper)) { |
746 | drm_modeset_unlock_all(dev); | 748 | drm_modeset_unlock_all(dev); |
747 | return -EBUSY; | 749 | return -EBUSY; |
@@ -915,7 +917,9 @@ int drm_fb_helper_pan_display(struct fb_var_screeninfo *var, | |||
915 | int ret = 0; | 917 | int ret = 0; |
916 | int i; | 918 | int i; |
917 | 919 | ||
918 | drm_modeset_lock_all(dev); | 920 | if (__drm_modeset_lock_all(dev, !!oops_in_progress)) { |
921 | return -EBUSY; | ||
922 | } | ||
919 | if (!drm_fb_helper_is_bound(fb_helper)) { | 923 | if (!drm_fb_helper_is_bound(fb_helper)) { |
920 | drm_modeset_unlock_all(dev); | 924 | drm_modeset_unlock_all(dev); |
921 | return -EBUSY; | 925 | return -EBUSY; |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c index 121470a83d1a..1bcbe07cecfc 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_drv.c +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c | |||
@@ -645,18 +645,6 @@ static int exynos_drm_init(void) | |||
645 | if (!is_exynos) | 645 | if (!is_exynos) |
646 | return -ENODEV; | 646 | return -ENODEV; |
647 | 647 | ||
648 | /* | ||
649 | * Register device object only in case of Exynos SoC. | ||
650 | * | ||
651 | * Below codes resolves temporarily infinite loop issue incurred | ||
652 | * by Exynos drm driver when using multi-platform kernel. | ||
653 | * So these codes will be replaced with more generic way later. | ||
654 | */ | ||
655 | if (!of_machine_is_compatible("samsung,exynos3") && | ||
656 | !of_machine_is_compatible("samsung,exynos4") && | ||
657 | !of_machine_is_compatible("samsung,exynos5")) | ||
658 | return -ENODEV; | ||
659 | |||
660 | exynos_drm_pdev = platform_device_register_simple("exynos-drm", -1, | 648 | exynos_drm_pdev = platform_device_register_simple("exynos-drm", -1, |
661 | NULL, 0); | 649 | NULL, 0); |
662 | if (IS_ERR(exynos_drm_pdev)) | 650 | if (IS_ERR(exynos_drm_pdev)) |
diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.c index 5765a161abdd..98051e8e855a 100644 --- a/drivers/gpu/drm/exynos/exynos_hdmi.c +++ b/drivers/gpu/drm/exynos/exynos_hdmi.c | |||
@@ -1669,7 +1669,6 @@ static void hdmi_mode_apply(struct hdmi_context *hdata) | |||
1669 | 1669 | ||
1670 | static void hdmiphy_conf_reset(struct hdmi_context *hdata) | 1670 | static void hdmiphy_conf_reset(struct hdmi_context *hdata) |
1671 | { | 1671 | { |
1672 | u8 buffer[2]; | ||
1673 | u32 reg; | 1672 | u32 reg; |
1674 | 1673 | ||
1675 | clk_disable_unprepare(hdata->res.sclk_hdmi); | 1674 | clk_disable_unprepare(hdata->res.sclk_hdmi); |
@@ -1677,11 +1676,8 @@ static void hdmiphy_conf_reset(struct hdmi_context *hdata) | |||
1677 | clk_prepare_enable(hdata->res.sclk_hdmi); | 1676 | clk_prepare_enable(hdata->res.sclk_hdmi); |
1678 | 1677 | ||
1679 | /* operation mode */ | 1678 | /* operation mode */ |
1680 | buffer[0] = 0x1f; | 1679 | hdmiphy_reg_writeb(hdata, HDMIPHY_MODE_SET_DONE, |
1681 | buffer[1] = 0x00; | 1680 | HDMI_PHY_ENABLE_MODE_SET); |
1682 | |||
1683 | if (hdata->hdmiphy_port) | ||
1684 | i2c_master_send(hdata->hdmiphy_port, buffer, 2); | ||
1685 | 1681 | ||
1686 | if (hdata->type == HDMI_TYPE13) | 1682 | if (hdata->type == HDMI_TYPE13) |
1687 | reg = HDMI_V13_PHY_RSTOUT; | 1683 | reg = HDMI_V13_PHY_RSTOUT; |
diff --git a/drivers/gpu/drm/exynos/exynos_mixer.c b/drivers/gpu/drm/exynos/exynos_mixer.c index 820b76234ef4..064ed6597def 100644 --- a/drivers/gpu/drm/exynos/exynos_mixer.c +++ b/drivers/gpu/drm/exynos/exynos_mixer.c | |||
@@ -1026,6 +1026,7 @@ static void mixer_win_disable(struct exynos_drm_manager *mgr, int zpos) | |||
1026 | static void mixer_wait_for_vblank(struct exynos_drm_manager *mgr) | 1026 | static void mixer_wait_for_vblank(struct exynos_drm_manager *mgr) |
1027 | { | 1027 | { |
1028 | struct mixer_context *mixer_ctx = mgr_to_mixer(mgr); | 1028 | struct mixer_context *mixer_ctx = mgr_to_mixer(mgr); |
1029 | int err; | ||
1029 | 1030 | ||
1030 | mutex_lock(&mixer_ctx->mixer_mutex); | 1031 | mutex_lock(&mixer_ctx->mixer_mutex); |
1031 | if (!mixer_ctx->powered) { | 1032 | if (!mixer_ctx->powered) { |
@@ -1034,7 +1035,11 @@ static void mixer_wait_for_vblank(struct exynos_drm_manager *mgr) | |||
1034 | } | 1035 | } |
1035 | mutex_unlock(&mixer_ctx->mixer_mutex); | 1036 | mutex_unlock(&mixer_ctx->mixer_mutex); |
1036 | 1037 | ||
1037 | drm_vblank_get(mgr->crtc->dev, mixer_ctx->pipe); | 1038 | err = drm_vblank_get(mgr->crtc->dev, mixer_ctx->pipe); |
1039 | if (err < 0) { | ||
1040 | DRM_DEBUG_KMS("failed to acquire vblank counter\n"); | ||
1041 | return; | ||
1042 | } | ||
1038 | 1043 | ||
1039 | atomic_set(&mixer_ctx->wait_vsync_event, 1); | 1044 | atomic_set(&mixer_ctx->wait_vsync_event, 1); |
1040 | 1045 | ||
@@ -1262,8 +1267,6 @@ static int mixer_bind(struct device *dev, struct device *manager, void *data) | |||
1262 | return ret; | 1267 | return ret; |
1263 | } | 1268 | } |
1264 | 1269 | ||
1265 | pm_runtime_enable(dev); | ||
1266 | |||
1267 | return 0; | 1270 | return 0; |
1268 | } | 1271 | } |
1269 | 1272 | ||
@@ -1272,8 +1275,6 @@ static void mixer_unbind(struct device *dev, struct device *master, void *data) | |||
1272 | struct mixer_context *ctx = dev_get_drvdata(dev); | 1275 | struct mixer_context *ctx = dev_get_drvdata(dev); |
1273 | 1276 | ||
1274 | mixer_mgr_remove(&ctx->manager); | 1277 | mixer_mgr_remove(&ctx->manager); |
1275 | |||
1276 | pm_runtime_disable(dev); | ||
1277 | } | 1278 | } |
1278 | 1279 | ||
1279 | static const struct component_ops mixer_component_ops = { | 1280 | static const struct component_ops mixer_component_ops = { |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index c11603b4cf1d..76354d3ba925 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
@@ -5155,7 +5155,7 @@ static bool mutex_is_locked_by(struct mutex *mutex, struct task_struct *task) | |||
5155 | if (!mutex_is_locked(mutex)) | 5155 | if (!mutex_is_locked(mutex)) |
5156 | return false; | 5156 | return false; |
5157 | 5157 | ||
5158 | #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_MUTEXES) | 5158 | #if defined(CONFIG_SMP) && !defined(CONFIG_DEBUG_MUTEXES) |
5159 | return mutex->owner == task; | 5159 | return mutex->owner == task; |
5160 | #else | 5160 | #else |
5161 | /* Since UP may be pre-empted, we cannot assume that we own the lock */ | 5161 | /* Since UP may be pre-empted, we cannot assume that we own the lock */ |
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index d0d3dfbe6d2a..b051a238baf9 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
@@ -292,6 +292,23 @@ void gen6_enable_rps_interrupts(struct drm_device *dev) | |||
292 | spin_unlock_irq(&dev_priv->irq_lock); | 292 | spin_unlock_irq(&dev_priv->irq_lock); |
293 | } | 293 | } |
294 | 294 | ||
295 | u32 gen6_sanitize_rps_pm_mask(struct drm_i915_private *dev_priv, u32 mask) | ||
296 | { | ||
297 | /* | ||
298 | * SNB,IVB can while VLV,CHV may hard hang on looping batchbuffer | ||
299 | * if GEN6_PM_UP_EI_EXPIRED is masked. | ||
300 | * | ||
301 | * TODO: verify if this can be reproduced on VLV,CHV. | ||
302 | */ | ||
303 | if (INTEL_INFO(dev_priv)->gen <= 7 && !IS_HASWELL(dev_priv)) | ||
304 | mask &= ~GEN6_PM_RP_UP_EI_EXPIRED; | ||
305 | |||
306 | if (INTEL_INFO(dev_priv)->gen >= 8) | ||
307 | mask &= ~GEN8_PMINTR_REDIRECT_TO_NON_DISP; | ||
308 | |||
309 | return mask; | ||
310 | } | ||
311 | |||
295 | void gen6_disable_rps_interrupts(struct drm_device *dev) | 312 | void gen6_disable_rps_interrupts(struct drm_device *dev) |
296 | { | 313 | { |
297 | struct drm_i915_private *dev_priv = dev->dev_private; | 314 | struct drm_i915_private *dev_priv = dev->dev_private; |
@@ -304,8 +321,7 @@ void gen6_disable_rps_interrupts(struct drm_device *dev) | |||
304 | 321 | ||
305 | spin_lock_irq(&dev_priv->irq_lock); | 322 | spin_lock_irq(&dev_priv->irq_lock); |
306 | 323 | ||
307 | I915_WRITE(GEN6_PMINTRMSK, INTEL_INFO(dev_priv)->gen >= 8 ? | 324 | I915_WRITE(GEN6_PMINTRMSK, gen6_sanitize_rps_pm_mask(dev_priv, ~0)); |
308 | ~GEN8_PMINTR_REDIRECT_TO_NON_DISP : ~0); | ||
309 | 325 | ||
310 | __gen6_disable_pm_irq(dev_priv, dev_priv->pm_rps_events); | 326 | __gen6_disable_pm_irq(dev_priv, dev_priv->pm_rps_events); |
311 | I915_WRITE(gen6_pm_ier(dev_priv), I915_READ(gen6_pm_ier(dev_priv)) & | 327 | I915_WRITE(gen6_pm_ier(dev_priv), I915_READ(gen6_pm_ier(dev_priv)) & |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index e2af1383b179..e7a16f119a29 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -9815,7 +9815,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, | |||
9815 | if (obj->tiling_mode != work->old_fb_obj->tiling_mode) | 9815 | if (obj->tiling_mode != work->old_fb_obj->tiling_mode) |
9816 | /* vlv: DISPLAY_FLIP fails to change tiling */ | 9816 | /* vlv: DISPLAY_FLIP fails to change tiling */ |
9817 | ring = NULL; | 9817 | ring = NULL; |
9818 | } else if (IS_IVYBRIDGE(dev)) { | 9818 | } else if (IS_IVYBRIDGE(dev) || IS_HASWELL(dev)) { |
9819 | ring = &dev_priv->ring[BCS]; | 9819 | ring = &dev_priv->ring[BCS]; |
9820 | } else if (INTEL_INFO(dev)->gen >= 7) { | 9820 | } else if (INTEL_INFO(dev)->gen >= 7) { |
9821 | ring = obj->ring; | 9821 | ring = obj->ring; |
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 25fdbb16d4e0..3b40a17b8852 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h | |||
@@ -794,6 +794,7 @@ void gen6_disable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask); | |||
794 | void gen6_reset_rps_interrupts(struct drm_device *dev); | 794 | void gen6_reset_rps_interrupts(struct drm_device *dev); |
795 | void gen6_enable_rps_interrupts(struct drm_device *dev); | 795 | void gen6_enable_rps_interrupts(struct drm_device *dev); |
796 | void gen6_disable_rps_interrupts(struct drm_device *dev); | 796 | void gen6_disable_rps_interrupts(struct drm_device *dev); |
797 | u32 gen6_sanitize_rps_pm_mask(struct drm_i915_private *dev_priv, u32 mask); | ||
797 | void intel_runtime_pm_disable_interrupts(struct drm_i915_private *dev_priv); | 798 | void intel_runtime_pm_disable_interrupts(struct drm_i915_private *dev_priv); |
798 | void intel_runtime_pm_enable_interrupts(struct drm_i915_private *dev_priv); | 799 | void intel_runtime_pm_enable_interrupts(struct drm_i915_private *dev_priv); |
799 | static inline bool intel_irqs_enabled(struct drm_i915_private *dev_priv) | 800 | static inline bool intel_irqs_enabled(struct drm_i915_private *dev_priv) |
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index 964b28e3c630..bf814a64582a 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c | |||
@@ -4363,16 +4363,7 @@ static u32 gen6_rps_pm_mask(struct drm_i915_private *dev_priv, u8 val) | |||
4363 | mask |= dev_priv->pm_rps_events & (GEN6_PM_RP_DOWN_EI_EXPIRED | GEN6_PM_RP_UP_EI_EXPIRED); | 4363 | mask |= dev_priv->pm_rps_events & (GEN6_PM_RP_DOWN_EI_EXPIRED | GEN6_PM_RP_UP_EI_EXPIRED); |
4364 | mask &= dev_priv->pm_rps_events; | 4364 | mask &= dev_priv->pm_rps_events; |
4365 | 4365 | ||
4366 | /* IVB and SNB hard hangs on looping batchbuffer | 4366 | return gen6_sanitize_rps_pm_mask(dev_priv, ~mask); |
4367 | * if GEN6_PM_UP_EI_EXPIRED is masked. | ||
4368 | */ | ||
4369 | if (INTEL_INFO(dev_priv->dev)->gen <= 7 && !IS_HASWELL(dev_priv->dev)) | ||
4370 | mask |= GEN6_PM_RP_UP_EI_EXPIRED; | ||
4371 | |||
4372 | if (IS_GEN8(dev_priv->dev)) | ||
4373 | mask |= GEN8_PMINTR_REDIRECT_TO_NON_DISP; | ||
4374 | |||
4375 | return ~mask; | ||
4376 | } | 4367 | } |
4377 | 4368 | ||
4378 | /* gen6_set_rps is called to update the frequency request, but should also be | 4369 | /* gen6_set_rps is called to update the frequency request, but should also be |
@@ -4441,7 +4432,8 @@ static void vlv_set_rps_idle(struct drm_i915_private *dev_priv) | |||
4441 | return; | 4432 | return; |
4442 | 4433 | ||
4443 | /* Mask turbo interrupt so that they will not come in between */ | 4434 | /* Mask turbo interrupt so that they will not come in between */ |
4444 | I915_WRITE(GEN6_PMINTRMSK, 0xffffffff); | 4435 | I915_WRITE(GEN6_PMINTRMSK, |
4436 | gen6_sanitize_rps_pm_mask(dev_priv, ~0)); | ||
4445 | 4437 | ||
4446 | vlv_force_gfx_clock(dev_priv, true); | 4438 | vlv_force_gfx_clock(dev_priv, true); |
4447 | 4439 | ||
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c index 6dcde3798b45..64fdae558d36 100644 --- a/drivers/gpu/drm/radeon/cik.c +++ b/drivers/gpu/drm/radeon/cik.c | |||
@@ -6033,6 +6033,17 @@ void cik_vm_flush(struct radeon_device *rdev, struct radeon_ring *ring, | |||
6033 | radeon_ring_write(ring, 0); | 6033 | radeon_ring_write(ring, 0); |
6034 | radeon_ring_write(ring, 1 << vm_id); | 6034 | radeon_ring_write(ring, 1 << vm_id); |
6035 | 6035 | ||
6036 | /* wait for the invalidate to complete */ | ||
6037 | radeon_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5)); | ||
6038 | radeon_ring_write(ring, (WAIT_REG_MEM_OPERATION(0) | /* wait */ | ||
6039 | WAIT_REG_MEM_FUNCTION(0) | /* always */ | ||
6040 | WAIT_REG_MEM_ENGINE(0))); /* me */ | ||
6041 | radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2); | ||
6042 | radeon_ring_write(ring, 0); | ||
6043 | radeon_ring_write(ring, 0); /* ref */ | ||
6044 | radeon_ring_write(ring, 0); /* mask */ | ||
6045 | radeon_ring_write(ring, 0x20); /* poll interval */ | ||
6046 | |||
6036 | /* compute doesn't have PFP */ | 6047 | /* compute doesn't have PFP */ |
6037 | if (usepfp) { | 6048 | if (usepfp) { |
6038 | /* sync PFP to ME, otherwise we might get invalid PFP reads */ | 6049 | /* sync PFP to ME, otherwise we might get invalid PFP reads */ |
diff --git a/drivers/gpu/drm/radeon/cik_sdma.c b/drivers/gpu/drm/radeon/cik_sdma.c index dde5c7e29eb2..a0133c74f4cf 100644 --- a/drivers/gpu/drm/radeon/cik_sdma.c +++ b/drivers/gpu/drm/radeon/cik_sdma.c | |||
@@ -903,6 +903,9 @@ void cik_sdma_vm_pad_ib(struct radeon_ib *ib) | |||
903 | void cik_dma_vm_flush(struct radeon_device *rdev, struct radeon_ring *ring, | 903 | void cik_dma_vm_flush(struct radeon_device *rdev, struct radeon_ring *ring, |
904 | unsigned vm_id, uint64_t pd_addr) | 904 | unsigned vm_id, uint64_t pd_addr) |
905 | { | 905 | { |
906 | u32 extra_bits = (SDMA_POLL_REG_MEM_EXTRA_OP(0) | | ||
907 | SDMA_POLL_REG_MEM_EXTRA_FUNC(0)); /* always */ | ||
908 | |||
906 | radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000)); | 909 | radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000)); |
907 | if (vm_id < 8) { | 910 | if (vm_id < 8) { |
908 | radeon_ring_write(ring, (VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm_id << 2)) >> 2); | 911 | radeon_ring_write(ring, (VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm_id << 2)) >> 2); |
@@ -943,5 +946,12 @@ void cik_dma_vm_flush(struct radeon_device *rdev, struct radeon_ring *ring, | |||
943 | radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000)); | 946 | radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000)); |
944 | radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2); | 947 | radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2); |
945 | radeon_ring_write(ring, 1 << vm_id); | 948 | radeon_ring_write(ring, 1 << vm_id); |
949 | |||
950 | radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_POLL_REG_MEM, 0, extra_bits)); | ||
951 | radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2); | ||
952 | radeon_ring_write(ring, 0); | ||
953 | radeon_ring_write(ring, 0); /* reference */ | ||
954 | radeon_ring_write(ring, 0); /* mask */ | ||
955 | radeon_ring_write(ring, (0xfff << 16) | 10); /* retry count, poll interval */ | ||
946 | } | 956 | } |
947 | 957 | ||
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c index 360de9f1f491..aea48c89b241 100644 --- a/drivers/gpu/drm/radeon/ni.c +++ b/drivers/gpu/drm/radeon/ni.c | |||
@@ -2516,6 +2516,16 @@ void cayman_vm_flush(struct radeon_device *rdev, struct radeon_ring *ring, | |||
2516 | radeon_ring_write(ring, PACKET0(VM_INVALIDATE_REQUEST, 0)); | 2516 | radeon_ring_write(ring, PACKET0(VM_INVALIDATE_REQUEST, 0)); |
2517 | radeon_ring_write(ring, 1 << vm_id); | 2517 | radeon_ring_write(ring, 1 << vm_id); |
2518 | 2518 | ||
2519 | /* wait for the invalidate to complete */ | ||
2520 | radeon_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5)); | ||
2521 | radeon_ring_write(ring, (WAIT_REG_MEM_FUNCTION(0) | /* always */ | ||
2522 | WAIT_REG_MEM_ENGINE(0))); /* me */ | ||
2523 | radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2); | ||
2524 | radeon_ring_write(ring, 0); | ||
2525 | radeon_ring_write(ring, 0); /* ref */ | ||
2526 | radeon_ring_write(ring, 0); /* mask */ | ||
2527 | radeon_ring_write(ring, 0x20); /* poll interval */ | ||
2528 | |||
2519 | /* sync PFP to ME, otherwise we might get invalid PFP reads */ | 2529 | /* sync PFP to ME, otherwise we might get invalid PFP reads */ |
2520 | radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0)); | 2530 | radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0)); |
2521 | radeon_ring_write(ring, 0x0); | 2531 | radeon_ring_write(ring, 0x0); |
diff --git a/drivers/gpu/drm/radeon/ni_dma.c b/drivers/gpu/drm/radeon/ni_dma.c index 50f88611ff60..4be2bb7cbef3 100644 --- a/drivers/gpu/drm/radeon/ni_dma.c +++ b/drivers/gpu/drm/radeon/ni_dma.c | |||
@@ -463,5 +463,11 @@ void cayman_dma_vm_flush(struct radeon_device *rdev, struct radeon_ring *ring, | |||
463 | radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0)); | 463 | radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0)); |
464 | radeon_ring_write(ring, (0xf << 16) | (VM_INVALIDATE_REQUEST >> 2)); | 464 | radeon_ring_write(ring, (0xf << 16) | (VM_INVALIDATE_REQUEST >> 2)); |
465 | radeon_ring_write(ring, 1 << vm_id); | 465 | radeon_ring_write(ring, 1 << vm_id); |
466 | |||
467 | /* wait for invalidate to complete */ | ||
468 | radeon_ring_write(ring, DMA_SRBM_READ_PACKET); | ||
469 | radeon_ring_write(ring, (0xff << 20) | (VM_INVALIDATE_REQUEST >> 2)); | ||
470 | radeon_ring_write(ring, 0); /* mask */ | ||
471 | radeon_ring_write(ring, 0); /* value */ | ||
466 | } | 472 | } |
467 | 473 | ||
diff --git a/drivers/gpu/drm/radeon/nid.h b/drivers/gpu/drm/radeon/nid.h index 2e12e4d69253..ad7125486894 100644 --- a/drivers/gpu/drm/radeon/nid.h +++ b/drivers/gpu/drm/radeon/nid.h | |||
@@ -1133,6 +1133,23 @@ | |||
1133 | #define PACKET3_MEM_SEMAPHORE 0x39 | 1133 | #define PACKET3_MEM_SEMAPHORE 0x39 |
1134 | #define PACKET3_MPEG_INDEX 0x3A | 1134 | #define PACKET3_MPEG_INDEX 0x3A |
1135 | #define PACKET3_WAIT_REG_MEM 0x3C | 1135 | #define PACKET3_WAIT_REG_MEM 0x3C |
1136 | #define WAIT_REG_MEM_FUNCTION(x) ((x) << 0) | ||
1137 | /* 0 - always | ||
1138 | * 1 - < | ||
1139 | * 2 - <= | ||
1140 | * 3 - == | ||
1141 | * 4 - != | ||
1142 | * 5 - >= | ||
1143 | * 6 - > | ||
1144 | */ | ||
1145 | #define WAIT_REG_MEM_MEM_SPACE(x) ((x) << 4) | ||
1146 | /* 0 - reg | ||
1147 | * 1 - mem | ||
1148 | */ | ||
1149 | #define WAIT_REG_MEM_ENGINE(x) ((x) << 8) | ||
1150 | /* 0 - me | ||
1151 | * 1 - pfp | ||
1152 | */ | ||
1136 | #define PACKET3_MEM_WRITE 0x3D | 1153 | #define PACKET3_MEM_WRITE 0x3D |
1137 | #define PACKET3_PFP_SYNC_ME 0x42 | 1154 | #define PACKET3_PFP_SYNC_ME 0x42 |
1138 | #define PACKET3_SURFACE_SYNC 0x43 | 1155 | #define PACKET3_SURFACE_SYNC 0x43 |
@@ -1272,6 +1289,13 @@ | |||
1272 | (1 << 21) | \ | 1289 | (1 << 21) | \ |
1273 | (((n) & 0xFFFFF) << 0)) | 1290 | (((n) & 0xFFFFF) << 0)) |
1274 | 1291 | ||
1292 | #define DMA_SRBM_POLL_PACKET ((9 << 28) | \ | ||
1293 | (1 << 27) | \ | ||
1294 | (1 << 26)) | ||
1295 | |||
1296 | #define DMA_SRBM_READ_PACKET ((9 << 28) | \ | ||
1297 | (1 << 27)) | ||
1298 | |||
1275 | /* async DMA Packet types */ | 1299 | /* async DMA Packet types */ |
1276 | #define DMA_PACKET_WRITE 0x2 | 1300 | #define DMA_PACKET_WRITE 0x2 |
1277 | #define DMA_PACKET_COPY 0x3 | 1301 | #define DMA_PACKET_COPY 0x3 |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.c b/drivers/gpu/drm/radeon/radeon_asic.c index 850de57069be..121aff6a3b41 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.c +++ b/drivers/gpu/drm/radeon/radeon_asic.c | |||
@@ -333,6 +333,20 @@ static struct radeon_asic_ring r300_gfx_ring = { | |||
333 | .set_wptr = &r100_gfx_set_wptr, | 333 | .set_wptr = &r100_gfx_set_wptr, |
334 | }; | 334 | }; |
335 | 335 | ||
336 | static struct radeon_asic_ring rv515_gfx_ring = { | ||
337 | .ib_execute = &r100_ring_ib_execute, | ||
338 | .emit_fence = &r300_fence_ring_emit, | ||
339 | .emit_semaphore = &r100_semaphore_ring_emit, | ||
340 | .cs_parse = &r300_cs_parse, | ||
341 | .ring_start = &rv515_ring_start, | ||
342 | .ring_test = &r100_ring_test, | ||
343 | .ib_test = &r100_ib_test, | ||
344 | .is_lockup = &r100_gpu_is_lockup, | ||
345 | .get_rptr = &r100_gfx_get_rptr, | ||
346 | .get_wptr = &r100_gfx_get_wptr, | ||
347 | .set_wptr = &r100_gfx_set_wptr, | ||
348 | }; | ||
349 | |||
336 | static struct radeon_asic r300_asic = { | 350 | static struct radeon_asic r300_asic = { |
337 | .init = &r300_init, | 351 | .init = &r300_init, |
338 | .fini = &r300_fini, | 352 | .fini = &r300_fini, |
@@ -748,7 +762,7 @@ static struct radeon_asic rv515_asic = { | |||
748 | .set_page = &rv370_pcie_gart_set_page, | 762 | .set_page = &rv370_pcie_gart_set_page, |
749 | }, | 763 | }, |
750 | .ring = { | 764 | .ring = { |
751 | [RADEON_RING_TYPE_GFX_INDEX] = &r300_gfx_ring | 765 | [RADEON_RING_TYPE_GFX_INDEX] = &rv515_gfx_ring |
752 | }, | 766 | }, |
753 | .irq = { | 767 | .irq = { |
754 | .set = &rs600_irq_set, | 768 | .set = &rs600_irq_set, |
@@ -814,7 +828,7 @@ static struct radeon_asic r520_asic = { | |||
814 | .set_page = &rv370_pcie_gart_set_page, | 828 | .set_page = &rv370_pcie_gart_set_page, |
815 | }, | 829 | }, |
816 | .ring = { | 830 | .ring = { |
817 | [RADEON_RING_TYPE_GFX_INDEX] = &r300_gfx_ring | 831 | [RADEON_RING_TYPE_GFX_INDEX] = &rv515_gfx_ring |
818 | }, | 832 | }, |
819 | .irq = { | 833 | .irq = { |
820 | .set = &rs600_irq_set, | 834 | .set = &rs600_irq_set, |
diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c index a46f73737994..d0b4f7d1140d 100644 --- a/drivers/gpu/drm/radeon/radeon_gem.c +++ b/drivers/gpu/drm/radeon/radeon_gem.c | |||
@@ -576,7 +576,7 @@ error_unreserve: | |||
576 | error_free: | 576 | error_free: |
577 | drm_free_large(vm_bos); | 577 | drm_free_large(vm_bos); |
578 | 578 | ||
579 | if (r) | 579 | if (r && r != -ERESTARTSYS) |
580 | DRM_ERROR("Couldn't update BO_VA (%d)\n", r); | 580 | DRM_ERROR("Couldn't update BO_VA (%d)\n", r); |
581 | } | 581 | } |
582 | 582 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c index 32522cc940a1..f7da8fe96a66 100644 --- a/drivers/gpu/drm/radeon/radeon_pm.c +++ b/drivers/gpu/drm/radeon/radeon_pm.c | |||
@@ -1287,8 +1287,39 @@ dpm_failed: | |||
1287 | return ret; | 1287 | return ret; |
1288 | } | 1288 | } |
1289 | 1289 | ||
1290 | struct radeon_dpm_quirk { | ||
1291 | u32 chip_vendor; | ||
1292 | u32 chip_device; | ||
1293 | u32 subsys_vendor; | ||
1294 | u32 subsys_device; | ||
1295 | }; | ||
1296 | |||
1297 | /* cards with dpm stability problems */ | ||
1298 | static struct radeon_dpm_quirk radeon_dpm_quirk_list[] = { | ||
1299 | /* TURKS - https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1386534 */ | ||
1300 | { PCI_VENDOR_ID_ATI, 0x6759, 0x1682, 0x3195 }, | ||
1301 | /* TURKS - https://bugzilla.kernel.org/show_bug.cgi?id=83731 */ | ||
1302 | { PCI_VENDOR_ID_ATI, 0x6840, 0x1179, 0xfb81 }, | ||
1303 | { 0, 0, 0, 0 }, | ||
1304 | }; | ||
1305 | |||
1290 | int radeon_pm_init(struct radeon_device *rdev) | 1306 | int radeon_pm_init(struct radeon_device *rdev) |
1291 | { | 1307 | { |
1308 | struct radeon_dpm_quirk *p = radeon_dpm_quirk_list; | ||
1309 | bool disable_dpm = false; | ||
1310 | |||
1311 | /* Apply dpm quirks */ | ||
1312 | while (p && p->chip_device != 0) { | ||
1313 | if (rdev->pdev->vendor == p->chip_vendor && | ||
1314 | rdev->pdev->device == p->chip_device && | ||
1315 | rdev->pdev->subsystem_vendor == p->subsys_vendor && | ||
1316 | rdev->pdev->subsystem_device == p->subsys_device) { | ||
1317 | disable_dpm = true; | ||
1318 | break; | ||
1319 | } | ||
1320 | ++p; | ||
1321 | } | ||
1322 | |||
1292 | /* enable dpm on rv6xx+ */ | 1323 | /* enable dpm on rv6xx+ */ |
1293 | switch (rdev->family) { | 1324 | switch (rdev->family) { |
1294 | case CHIP_RV610: | 1325 | case CHIP_RV610: |
@@ -1344,6 +1375,8 @@ int radeon_pm_init(struct radeon_device *rdev) | |||
1344 | (!(rdev->flags & RADEON_IS_IGP)) && | 1375 | (!(rdev->flags & RADEON_IS_IGP)) && |
1345 | (!rdev->smc_fw)) | 1376 | (!rdev->smc_fw)) |
1346 | rdev->pm.pm_method = PM_METHOD_PROFILE; | 1377 | rdev->pm.pm_method = PM_METHOD_PROFILE; |
1378 | else if (disable_dpm && (radeon_dpm == -1)) | ||
1379 | rdev->pm.pm_method = PM_METHOD_PROFILE; | ||
1347 | else if (radeon_dpm == 0) | 1380 | else if (radeon_dpm == 0) |
1348 | rdev->pm.pm_method = PM_METHOD_PROFILE; | 1381 | rdev->pm.pm_method = PM_METHOD_PROFILE; |
1349 | else | 1382 | else |
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c index 60df444bd075..5d89b874a1a2 100644 --- a/drivers/gpu/drm/radeon/si.c +++ b/drivers/gpu/drm/radeon/si.c | |||
@@ -5057,6 +5057,16 @@ void si_vm_flush(struct radeon_device *rdev, struct radeon_ring *ring, | |||
5057 | radeon_ring_write(ring, 0); | 5057 | radeon_ring_write(ring, 0); |
5058 | radeon_ring_write(ring, 1 << vm_id); | 5058 | radeon_ring_write(ring, 1 << vm_id); |
5059 | 5059 | ||
5060 | /* wait for the invalidate to complete */ | ||
5061 | radeon_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5)); | ||
5062 | radeon_ring_write(ring, (WAIT_REG_MEM_FUNCTION(0) | /* always */ | ||
5063 | WAIT_REG_MEM_ENGINE(0))); /* me */ | ||
5064 | radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2); | ||
5065 | radeon_ring_write(ring, 0); | ||
5066 | radeon_ring_write(ring, 0); /* ref */ | ||
5067 | radeon_ring_write(ring, 0); /* mask */ | ||
5068 | radeon_ring_write(ring, 0x20); /* poll interval */ | ||
5069 | |||
5060 | /* sync PFP to ME, otherwise we might get invalid PFP reads */ | 5070 | /* sync PFP to ME, otherwise we might get invalid PFP reads */ |
5061 | radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0)); | 5071 | radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0)); |
5062 | radeon_ring_write(ring, 0x0); | 5072 | radeon_ring_write(ring, 0x0); |
diff --git a/drivers/gpu/drm/radeon/si_dma.c b/drivers/gpu/drm/radeon/si_dma.c index f5cc777e1c5f..aa7b872b2c43 100644 --- a/drivers/gpu/drm/radeon/si_dma.c +++ b/drivers/gpu/drm/radeon/si_dma.c | |||
@@ -206,6 +206,14 @@ void si_dma_vm_flush(struct radeon_device *rdev, struct radeon_ring *ring, | |||
206 | radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0, 0)); | 206 | radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0, 0)); |
207 | radeon_ring_write(ring, (0xf << 16) | (VM_INVALIDATE_REQUEST >> 2)); | 207 | radeon_ring_write(ring, (0xf << 16) | (VM_INVALIDATE_REQUEST >> 2)); |
208 | radeon_ring_write(ring, 1 << vm_id); | 208 | radeon_ring_write(ring, 1 << vm_id); |
209 | |||
210 | /* wait for invalidate to complete */ | ||
211 | radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_POLL_REG_MEM, 0, 0, 0, 0)); | ||
212 | radeon_ring_write(ring, VM_INVALIDATE_REQUEST); | ||
213 | radeon_ring_write(ring, 0xff << 16); /* retry */ | ||
214 | radeon_ring_write(ring, 1 << vm_id); /* mask */ | ||
215 | radeon_ring_write(ring, 0); /* value */ | ||
216 | radeon_ring_write(ring, (0 << 28) | 0x20); /* func(always) | poll interval */ | ||
209 | } | 217 | } |
210 | 218 | ||
211 | /** | 219 | /** |
diff --git a/drivers/gpu/drm/radeon/si_dpm.c b/drivers/gpu/drm/radeon/si_dpm.c index 32e354b8b0ab..eff8a6444956 100644 --- a/drivers/gpu/drm/radeon/si_dpm.c +++ b/drivers/gpu/drm/radeon/si_dpm.c | |||
@@ -2908,6 +2908,22 @@ static int si_init_smc_spll_table(struct radeon_device *rdev) | |||
2908 | return ret; | 2908 | return ret; |
2909 | } | 2909 | } |
2910 | 2910 | ||
2911 | struct si_dpm_quirk { | ||
2912 | u32 chip_vendor; | ||
2913 | u32 chip_device; | ||
2914 | u32 subsys_vendor; | ||
2915 | u32 subsys_device; | ||
2916 | u32 max_sclk; | ||
2917 | u32 max_mclk; | ||
2918 | }; | ||
2919 | |||
2920 | /* cards with dpm stability problems */ | ||
2921 | static struct si_dpm_quirk si_dpm_quirk_list[] = { | ||
2922 | /* PITCAIRN - https://bugs.freedesktop.org/show_bug.cgi?id=76490 */ | ||
2923 | { PCI_VENDOR_ID_ATI, 0x6810, 0x1462, 0x3036, 0, 120000 }, | ||
2924 | { 0, 0, 0, 0 }, | ||
2925 | }; | ||
2926 | |||
2911 | static void si_apply_state_adjust_rules(struct radeon_device *rdev, | 2927 | static void si_apply_state_adjust_rules(struct radeon_device *rdev, |
2912 | struct radeon_ps *rps) | 2928 | struct radeon_ps *rps) |
2913 | { | 2929 | { |
@@ -2918,7 +2934,22 @@ static void si_apply_state_adjust_rules(struct radeon_device *rdev, | |||
2918 | u32 mclk, sclk; | 2934 | u32 mclk, sclk; |
2919 | u16 vddc, vddci; | 2935 | u16 vddc, vddci; |
2920 | u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc; | 2936 | u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc; |
2937 | u32 max_sclk = 0, max_mclk = 0; | ||
2921 | int i; | 2938 | int i; |
2939 | struct si_dpm_quirk *p = si_dpm_quirk_list; | ||
2940 | |||
2941 | /* Apply dpm quirks */ | ||
2942 | while (p && p->chip_device != 0) { | ||
2943 | if (rdev->pdev->vendor == p->chip_vendor && | ||
2944 | rdev->pdev->device == p->chip_device && | ||
2945 | rdev->pdev->subsystem_vendor == p->subsys_vendor && | ||
2946 | rdev->pdev->subsystem_device == p->subsys_device) { | ||
2947 | max_sclk = p->max_sclk; | ||
2948 | max_mclk = p->max_mclk; | ||
2949 | break; | ||
2950 | } | ||
2951 | ++p; | ||
2952 | } | ||
2922 | 2953 | ||
2923 | if ((rdev->pm.dpm.new_active_crtc_count > 1) || | 2954 | if ((rdev->pm.dpm.new_active_crtc_count > 1) || |
2924 | ni_dpm_vblank_too_short(rdev)) | 2955 | ni_dpm_vblank_too_short(rdev)) |
@@ -2972,6 +3003,14 @@ static void si_apply_state_adjust_rules(struct radeon_device *rdev, | |||
2972 | if (ps->performance_levels[i].mclk > max_mclk_vddc) | 3003 | if (ps->performance_levels[i].mclk > max_mclk_vddc) |
2973 | ps->performance_levels[i].mclk = max_mclk_vddc; | 3004 | ps->performance_levels[i].mclk = max_mclk_vddc; |
2974 | } | 3005 | } |
3006 | if (max_mclk) { | ||
3007 | if (ps->performance_levels[i].mclk > max_mclk) | ||
3008 | ps->performance_levels[i].mclk = max_mclk; | ||
3009 | } | ||
3010 | if (max_sclk) { | ||
3011 | if (ps->performance_levels[i].sclk > max_sclk) | ||
3012 | ps->performance_levels[i].sclk = max_sclk; | ||
3013 | } | ||
2975 | } | 3014 | } |
2976 | 3015 | ||
2977 | /* XXX validate the min clocks required for display */ | 3016 | /* XXX validate the min clocks required for display */ |
diff --git a/drivers/gpu/drm/radeon/sid.h b/drivers/gpu/drm/radeon/sid.h index 4069be89e585..84999242c747 100644 --- a/drivers/gpu/drm/radeon/sid.h +++ b/drivers/gpu/drm/radeon/sid.h | |||
@@ -1632,6 +1632,23 @@ | |||
1632 | #define PACKET3_MPEG_INDEX 0x3A | 1632 | #define PACKET3_MPEG_INDEX 0x3A |
1633 | #define PACKET3_COPY_DW 0x3B | 1633 | #define PACKET3_COPY_DW 0x3B |
1634 | #define PACKET3_WAIT_REG_MEM 0x3C | 1634 | #define PACKET3_WAIT_REG_MEM 0x3C |
1635 | #define WAIT_REG_MEM_FUNCTION(x) ((x) << 0) | ||
1636 | /* 0 - always | ||
1637 | * 1 - < | ||
1638 | * 2 - <= | ||
1639 | * 3 - == | ||
1640 | * 4 - != | ||
1641 | * 5 - >= | ||
1642 | * 6 - > | ||
1643 | */ | ||
1644 | #define WAIT_REG_MEM_MEM_SPACE(x) ((x) << 4) | ||
1645 | /* 0 - reg | ||
1646 | * 1 - mem | ||
1647 | */ | ||
1648 | #define WAIT_REG_MEM_ENGINE(x) ((x) << 8) | ||
1649 | /* 0 - me | ||
1650 | * 1 - pfp | ||
1651 | */ | ||
1635 | #define PACKET3_MEM_WRITE 0x3D | 1652 | #define PACKET3_MEM_WRITE 0x3D |
1636 | #define PACKET3_COPY_DATA 0x40 | 1653 | #define PACKET3_COPY_DATA 0x40 |
1637 | #define PACKET3_CP_DMA 0x41 | 1654 | #define PACKET3_CP_DMA 0x41 |
@@ -1835,6 +1852,7 @@ | |||
1835 | #define DMA_PACKET_TRAP 0x7 | 1852 | #define DMA_PACKET_TRAP 0x7 |
1836 | #define DMA_PACKET_SRBM_WRITE 0x9 | 1853 | #define DMA_PACKET_SRBM_WRITE 0x9 |
1837 | #define DMA_PACKET_CONSTANT_FILL 0xd | 1854 | #define DMA_PACKET_CONSTANT_FILL 0xd |
1855 | #define DMA_PACKET_POLL_REG_MEM 0xe | ||
1838 | #define DMA_PACKET_NOP 0xf | 1856 | #define DMA_PACKET_NOP 0xf |
1839 | 1857 | ||
1840 | #define VCE_STATUS 0x20004 | 1858 | #define VCE_STATUS 0x20004 |
diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig index 6529c09c46f0..a7de26d1ac80 100644 --- a/drivers/hwmon/Kconfig +++ b/drivers/hwmon/Kconfig | |||
@@ -574,6 +574,16 @@ config SENSORS_IIO_HWMON | |||
574 | for those channels specified in the map. This map can be provided | 574 | for those channels specified in the map. This map can be provided |
575 | either via platform data or the device tree bindings. | 575 | either via platform data or the device tree bindings. |
576 | 576 | ||
577 | config SENSORS_I5500 | ||
578 | tristate "Intel 5500/5520/X58 temperature sensor" | ||
579 | depends on X86 && PCI | ||
580 | help | ||
581 | If you say yes here you get support for the temperature | ||
582 | sensor inside the Intel 5500, 5520 and X58 chipsets. | ||
583 | |||
584 | This driver can also be built as a module. If so, the module | ||
585 | will be called i5500_temp. | ||
586 | |||
577 | config SENSORS_CORETEMP | 587 | config SENSORS_CORETEMP |
578 | tristate "Intel Core/Core2/Atom temperature sensor" | 588 | tristate "Intel Core/Core2/Atom temperature sensor" |
579 | depends on X86 | 589 | depends on X86 |
diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile index 67280643bcf0..6c941472e707 100644 --- a/drivers/hwmon/Makefile +++ b/drivers/hwmon/Makefile | |||
@@ -68,6 +68,7 @@ obj-$(CONFIG_SENSORS_GPIO_FAN) += gpio-fan.o | |||
68 | obj-$(CONFIG_SENSORS_HIH6130) += hih6130.o | 68 | obj-$(CONFIG_SENSORS_HIH6130) += hih6130.o |
69 | obj-$(CONFIG_SENSORS_HTU21) += htu21.o | 69 | obj-$(CONFIG_SENSORS_HTU21) += htu21.o |
70 | obj-$(CONFIG_SENSORS_ULTRA45) += ultra45_env.o | 70 | obj-$(CONFIG_SENSORS_ULTRA45) += ultra45_env.o |
71 | obj-$(CONFIG_SENSORS_I5500) += i5500_temp.o | ||
71 | obj-$(CONFIG_SENSORS_I5K_AMB) += i5k_amb.o | 72 | obj-$(CONFIG_SENSORS_I5K_AMB) += i5k_amb.o |
72 | obj-$(CONFIG_SENSORS_IBMAEM) += ibmaem.o | 73 | obj-$(CONFIG_SENSORS_IBMAEM) += ibmaem.o |
73 | obj-$(CONFIG_SENSORS_IBMPEX) += ibmpex.o | 74 | obj-$(CONFIG_SENSORS_IBMPEX) += ibmpex.o |
diff --git a/drivers/hwmon/i5500_temp.c b/drivers/hwmon/i5500_temp.c new file mode 100644 index 000000000000..3e3ccbf18b4e --- /dev/null +++ b/drivers/hwmon/i5500_temp.c | |||
@@ -0,0 +1,149 @@ | |||
1 | /* | ||
2 | * i5500_temp - Driver for Intel 5500/5520/X58 chipset thermal sensor | ||
3 | * | ||
4 | * Copyright (C) 2012, 2014 Jean Delvare <jdelvare@suse.de> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | */ | ||
16 | |||
17 | #include <linux/module.h> | ||
18 | #include <linux/init.h> | ||
19 | #include <linux/slab.h> | ||
20 | #include <linux/jiffies.h> | ||
21 | #include <linux/device.h> | ||
22 | #include <linux/pci.h> | ||
23 | #include <linux/hwmon.h> | ||
24 | #include <linux/hwmon-sysfs.h> | ||
25 | #include <linux/err.h> | ||
26 | #include <linux/mutex.h> | ||
27 | |||
28 | /* Register definitions from datasheet */ | ||
29 | #define REG_TSTHRCATA 0xE2 | ||
30 | #define REG_TSCTRL 0xE8 | ||
31 | #define REG_TSTHRRPEX 0xEB | ||
32 | #define REG_TSTHRLO 0xEC | ||
33 | #define REG_TSTHRHI 0xEE | ||
34 | #define REG_CTHINT 0xF0 | ||
35 | #define REG_TSFSC 0xF3 | ||
36 | #define REG_CTSTS 0xF4 | ||
37 | #define REG_TSTHRRQPI 0xF5 | ||
38 | #define REG_CTCTRL 0xF7 | ||
39 | #define REG_TSTIMER 0xF8 | ||
40 | |||
41 | /* | ||
42 | * Sysfs stuff | ||
43 | */ | ||
44 | |||
45 | /* Sensor resolution : 0.5 degree C */ | ||
46 | static ssize_t show_temp(struct device *dev, | ||
47 | struct device_attribute *devattr, char *buf) | ||
48 | { | ||
49 | struct pci_dev *pdev = to_pci_dev(dev->parent); | ||
50 | long temp; | ||
51 | u16 tsthrhi; | ||
52 | s8 tsfsc; | ||
53 | |||
54 | pci_read_config_word(pdev, REG_TSTHRHI, &tsthrhi); | ||
55 | pci_read_config_byte(pdev, REG_TSFSC, &tsfsc); | ||
56 | temp = ((long)tsthrhi - tsfsc) * 500; | ||
57 | |||
58 | return sprintf(buf, "%ld\n", temp); | ||
59 | } | ||
60 | |||
61 | static ssize_t show_thresh(struct device *dev, | ||
62 | struct device_attribute *devattr, char *buf) | ||
63 | { | ||
64 | struct pci_dev *pdev = to_pci_dev(dev->parent); | ||
65 | int reg = to_sensor_dev_attr(devattr)->index; | ||
66 | long temp; | ||
67 | u16 tsthr; | ||
68 | |||
69 | pci_read_config_word(pdev, reg, &tsthr); | ||
70 | temp = tsthr * 500; | ||
71 | |||
72 | return sprintf(buf, "%ld\n", temp); | ||
73 | } | ||
74 | |||
75 | static ssize_t show_alarm(struct device *dev, | ||
76 | struct device_attribute *devattr, char *buf) | ||
77 | { | ||
78 | struct pci_dev *pdev = to_pci_dev(dev->parent); | ||
79 | int nr = to_sensor_dev_attr(devattr)->index; | ||
80 | u8 ctsts; | ||
81 | |||
82 | pci_read_config_byte(pdev, REG_CTSTS, &ctsts); | ||
83 | return sprintf(buf, "%u\n", (unsigned int)ctsts & (1 << nr)); | ||
84 | } | ||
85 | |||
86 | static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL); | ||
87 | static SENSOR_DEVICE_ATTR(temp1_crit, S_IRUGO, show_thresh, NULL, 0xE2); | ||
88 | static SENSOR_DEVICE_ATTR(temp1_max_hyst, S_IRUGO, show_thresh, NULL, 0xEC); | ||
89 | static SENSOR_DEVICE_ATTR(temp1_max, S_IRUGO, show_thresh, NULL, 0xEE); | ||
90 | static SENSOR_DEVICE_ATTR(temp1_crit_alarm, S_IRUGO, show_alarm, NULL, 0); | ||
91 | static SENSOR_DEVICE_ATTR(temp1_max_alarm, S_IRUGO, show_alarm, NULL, 1); | ||
92 | |||
93 | static struct attribute *i5500_temp_attrs[] = { | ||
94 | &dev_attr_temp1_input.attr, | ||
95 | &sensor_dev_attr_temp1_crit.dev_attr.attr, | ||
96 | &sensor_dev_attr_temp1_max_hyst.dev_attr.attr, | ||
97 | &sensor_dev_attr_temp1_max.dev_attr.attr, | ||
98 | &sensor_dev_attr_temp1_crit_alarm.dev_attr.attr, | ||
99 | &sensor_dev_attr_temp1_max_alarm.dev_attr.attr, | ||
100 | NULL | ||
101 | }; | ||
102 | |||
103 | ATTRIBUTE_GROUPS(i5500_temp); | ||
104 | |||
105 | static const struct pci_device_id i5500_temp_ids[] = { | ||
106 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x3438) }, | ||
107 | { 0 }, | ||
108 | }; | ||
109 | |||
110 | MODULE_DEVICE_TABLE(pci, i5500_temp_ids); | ||
111 | |||
112 | static int i5500_temp_probe(struct pci_dev *pdev, | ||
113 | const struct pci_device_id *id) | ||
114 | { | ||
115 | int err; | ||
116 | struct device *hwmon_dev; | ||
117 | u32 tstimer; | ||
118 | s8 tsfsc; | ||
119 | |||
120 | err = pci_enable_device(pdev); | ||
121 | if (err) { | ||
122 | dev_err(&pdev->dev, "Failed to enable device\n"); | ||
123 | return err; | ||
124 | } | ||
125 | |||
126 | pci_read_config_byte(pdev, REG_TSFSC, &tsfsc); | ||
127 | pci_read_config_dword(pdev, REG_TSTIMER, &tstimer); | ||
128 | if (tsfsc == 0x7F && tstimer == 0x07D30D40) { | ||
129 | dev_notice(&pdev->dev, "Sensor seems to be disabled\n"); | ||
130 | return -ENODEV; | ||
131 | } | ||
132 | |||
133 | hwmon_dev = devm_hwmon_device_register_with_groups(&pdev->dev, | ||
134 | "intel5500", NULL, | ||
135 | i5500_temp_groups); | ||
136 | return PTR_ERR_OR_ZERO(hwmon_dev); | ||
137 | } | ||
138 | |||
139 | static struct pci_driver i5500_temp_driver = { | ||
140 | .name = "i5500_temp", | ||
141 | .id_table = i5500_temp_ids, | ||
142 | .probe = i5500_temp_probe, | ||
143 | }; | ||
144 | |||
145 | module_pci_driver(i5500_temp_driver); | ||
146 | |||
147 | MODULE_AUTHOR("Jean Delvare <jdelvare@suse.de>"); | ||
148 | MODULE_DESCRIPTION("Intel 5500/5520/X58 chipset thermal sensor driver"); | ||
149 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/iio/adc/ad799x.c b/drivers/iio/adc/ad799x.c index e37412da15f5..b99de00e57b8 100644 --- a/drivers/iio/adc/ad799x.c +++ b/drivers/iio/adc/ad799x.c | |||
@@ -143,9 +143,15 @@ static int ad799x_write_config(struct ad799x_state *st, u16 val) | |||
143 | case ad7998: | 143 | case ad7998: |
144 | return i2c_smbus_write_word_swapped(st->client, AD7998_CONF_REG, | 144 | return i2c_smbus_write_word_swapped(st->client, AD7998_CONF_REG, |
145 | val); | 145 | val); |
146 | default: | 146 | case ad7992: |
147 | case ad7993: | ||
148 | case ad7994: | ||
147 | return i2c_smbus_write_byte_data(st->client, AD7998_CONF_REG, | 149 | return i2c_smbus_write_byte_data(st->client, AD7998_CONF_REG, |
148 | val); | 150 | val); |
151 | default: | ||
152 | /* Will be written when doing a conversion */ | ||
153 | st->config = val; | ||
154 | return 0; | ||
149 | } | 155 | } |
150 | } | 156 | } |
151 | 157 | ||
@@ -155,8 +161,13 @@ static int ad799x_read_config(struct ad799x_state *st) | |||
155 | case ad7997: | 161 | case ad7997: |
156 | case ad7998: | 162 | case ad7998: |
157 | return i2c_smbus_read_word_swapped(st->client, AD7998_CONF_REG); | 163 | return i2c_smbus_read_word_swapped(st->client, AD7998_CONF_REG); |
158 | default: | 164 | case ad7992: |
165 | case ad7993: | ||
166 | case ad7994: | ||
159 | return i2c_smbus_read_byte_data(st->client, AD7998_CONF_REG); | 167 | return i2c_smbus_read_byte_data(st->client, AD7998_CONF_REG); |
168 | default: | ||
169 | /* No readback support */ | ||
170 | return st->config; | ||
160 | } | 171 | } |
161 | } | 172 | } |
162 | 173 | ||
diff --git a/drivers/iio/inkern.c b/drivers/iio/inkern.c index 866fe904cba2..90c8cb727cc7 100644 --- a/drivers/iio/inkern.c +++ b/drivers/iio/inkern.c | |||
@@ -449,6 +449,9 @@ static int iio_channel_read(struct iio_channel *chan, int *val, int *val2, | |||
449 | if (val2 == NULL) | 449 | if (val2 == NULL) |
450 | val2 = &unused; | 450 | val2 = &unused; |
451 | 451 | ||
452 | if(!iio_channel_has_info(chan->channel, info)) | ||
453 | return -EINVAL; | ||
454 | |||
452 | if (chan->indio_dev->info->read_raw_multi) { | 455 | if (chan->indio_dev->info->read_raw_multi) { |
453 | ret = chan->indio_dev->info->read_raw_multi(chan->indio_dev, | 456 | ret = chan->indio_dev->info->read_raw_multi(chan->indio_dev, |
454 | chan->channel, INDIO_MAX_RAW_ELEMENTS, | 457 | chan->channel, INDIO_MAX_RAW_ELEMENTS, |
diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c index b4fa6f658800..9db258f7c804 100644 --- a/drivers/infiniband/hw/mlx4/main.c +++ b/drivers/infiniband/hw/mlx4/main.c | |||
@@ -1114,7 +1114,8 @@ static int mlx4_ib_tunnel_steer_add(struct ib_qp *qp, struct ib_flow_attr *flow_ | |||
1114 | struct mlx4_dev *dev = to_mdev(qp->device)->dev; | 1114 | struct mlx4_dev *dev = to_mdev(qp->device)->dev; |
1115 | int err = 0; | 1115 | int err = 0; |
1116 | 1116 | ||
1117 | if (dev->caps.tunnel_offload_mode != MLX4_TUNNEL_OFFLOAD_MODE_VXLAN) | 1117 | if (dev->caps.tunnel_offload_mode != MLX4_TUNNEL_OFFLOAD_MODE_VXLAN || |
1118 | dev->caps.dmfs_high_steer_mode == MLX4_STEERING_DMFS_A0_STATIC) | ||
1118 | return 0; /* do nothing */ | 1119 | return 0; /* do nothing */ |
1119 | 1120 | ||
1120 | ib_flow = flow_attr + 1; | 1121 | ib_flow = flow_attr + 1; |
diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c index f2b978026407..77ecf6d32237 100644 --- a/drivers/input/mouse/elantech.c +++ b/drivers/input/mouse/elantech.c | |||
@@ -1520,6 +1520,8 @@ static int elantech_set_properties(struct elantech_data *etd) | |||
1520 | case 7: | 1520 | case 7: |
1521 | case 8: | 1521 | case 8: |
1522 | case 9: | 1522 | case 9: |
1523 | case 10: | ||
1524 | case 13: | ||
1523 | etd->hw_version = 4; | 1525 | etd->hw_version = 4; |
1524 | break; | 1526 | break; |
1525 | default: | 1527 | default: |
diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h index c66d1b53843e..764857b4e268 100644 --- a/drivers/input/serio/i8042-x86ia64io.h +++ b/drivers/input/serio/i8042-x86ia64io.h | |||
@@ -415,6 +415,13 @@ static const struct dmi_system_id __initconst i8042_dmi_nomux_table[] = { | |||
415 | }, | 415 | }, |
416 | }, | 416 | }, |
417 | { | 417 | { |
418 | /* Acer Aspire 7738 */ | ||
419 | .matches = { | ||
420 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
421 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 7738"), | ||
422 | }, | ||
423 | }, | ||
424 | { | ||
418 | /* Gericom Bellagio */ | 425 | /* Gericom Bellagio */ |
419 | .matches = { | 426 | .matches = { |
420 | DMI_MATCH(DMI_SYS_VENDOR, "Gericom"), | 427 | DMI_MATCH(DMI_SYS_VENDOR, "Gericom"), |
@@ -745,6 +752,35 @@ static const struct dmi_system_id __initconst i8042_dmi_dritek_table[] = { | |||
745 | { } | 752 | { } |
746 | }; | 753 | }; |
747 | 754 | ||
755 | /* | ||
756 | * Some laptops need keyboard reset before probing for the trackpad to get | ||
757 | * it detected, initialised & finally work. | ||
758 | */ | ||
759 | static const struct dmi_system_id __initconst i8042_dmi_kbdreset_table[] = { | ||
760 | { | ||
761 | /* Gigabyte P35 v2 - Elantech touchpad */ | ||
762 | .matches = { | ||
763 | DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), | ||
764 | DMI_MATCH(DMI_PRODUCT_NAME, "P35V2"), | ||
765 | }, | ||
766 | }, | ||
767 | { | ||
768 | /* Aorus branded Gigabyte X3 Plus - Elantech touchpad */ | ||
769 | .matches = { | ||
770 | DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), | ||
771 | DMI_MATCH(DMI_PRODUCT_NAME, "X3"), | ||
772 | }, | ||
773 | }, | ||
774 | { | ||
775 | /* Gigabyte P34 - Elantech touchpad */ | ||
776 | .matches = { | ||
777 | DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), | ||
778 | DMI_MATCH(DMI_PRODUCT_NAME, "P34"), | ||
779 | }, | ||
780 | }, | ||
781 | { } | ||
782 | }; | ||
783 | |||
748 | #endif /* CONFIG_X86 */ | 784 | #endif /* CONFIG_X86 */ |
749 | 785 | ||
750 | #ifdef CONFIG_PNP | 786 | #ifdef CONFIG_PNP |
@@ -1040,6 +1076,9 @@ static int __init i8042_platform_init(void) | |||
1040 | if (dmi_check_system(i8042_dmi_dritek_table)) | 1076 | if (dmi_check_system(i8042_dmi_dritek_table)) |
1041 | i8042_dritek = true; | 1077 | i8042_dritek = true; |
1042 | 1078 | ||
1079 | if (dmi_check_system(i8042_dmi_kbdreset_table)) | ||
1080 | i8042_kbdreset = true; | ||
1081 | |||
1043 | /* | 1082 | /* |
1044 | * A20 was already enabled during early kernel init. But some buggy | 1083 | * A20 was already enabled during early kernel init. But some buggy |
1045 | * BIOSes (in MSI Laptops) require A20 to be enabled using 8042 to | 1084 | * BIOSes (in MSI Laptops) require A20 to be enabled using 8042 to |
diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c index 924e4bf357fb..986a71c614b0 100644 --- a/drivers/input/serio/i8042.c +++ b/drivers/input/serio/i8042.c | |||
@@ -67,6 +67,10 @@ static bool i8042_notimeout; | |||
67 | module_param_named(notimeout, i8042_notimeout, bool, 0); | 67 | module_param_named(notimeout, i8042_notimeout, bool, 0); |
68 | MODULE_PARM_DESC(notimeout, "Ignore timeouts signalled by i8042"); | 68 | MODULE_PARM_DESC(notimeout, "Ignore timeouts signalled by i8042"); |
69 | 69 | ||
70 | static bool i8042_kbdreset; | ||
71 | module_param_named(kbdreset, i8042_kbdreset, bool, 0); | ||
72 | MODULE_PARM_DESC(kbdreset, "Reset device connected to KBD port"); | ||
73 | |||
70 | #ifdef CONFIG_X86 | 74 | #ifdef CONFIG_X86 |
71 | static bool i8042_dritek; | 75 | static bool i8042_dritek; |
72 | module_param_named(dritek, i8042_dritek, bool, 0); | 76 | module_param_named(dritek, i8042_dritek, bool, 0); |
@@ -790,6 +794,16 @@ static int __init i8042_check_aux(void) | |||
790 | return -1; | 794 | return -1; |
791 | 795 | ||
792 | /* | 796 | /* |
797 | * Reset keyboard (needed on some laptops to successfully detect | ||
798 | * touchpad, e.g., some Gigabyte laptop models with Elantech | ||
799 | * touchpads). | ||
800 | */ | ||
801 | if (i8042_kbdreset) { | ||
802 | pr_warn("Attempting to reset device connected to KBD port\n"); | ||
803 | i8042_kbd_write(NULL, (unsigned char) 0xff); | ||
804 | } | ||
805 | |||
806 | /* | ||
793 | * Test AUX IRQ delivery to make sure BIOS did not grab the IRQ and | 807 | * Test AUX IRQ delivery to make sure BIOS did not grab the IRQ and |
794 | * used it for a PCI card or somethig else. | 808 | * used it for a PCI card or somethig else. |
795 | */ | 809 | */ |
diff --git a/drivers/irqchip/irq-atmel-aic-common.c b/drivers/irqchip/irq-atmel-aic-common.c index d111ac779c40..63cd031b2c28 100644 --- a/drivers/irqchip/irq-atmel-aic-common.c +++ b/drivers/irqchip/irq-atmel-aic-common.c | |||
@@ -28,7 +28,7 @@ | |||
28 | #define AT91_AIC_IRQ_MIN_PRIORITY 0 | 28 | #define AT91_AIC_IRQ_MIN_PRIORITY 0 |
29 | #define AT91_AIC_IRQ_MAX_PRIORITY 7 | 29 | #define AT91_AIC_IRQ_MAX_PRIORITY 7 |
30 | 30 | ||
31 | #define AT91_AIC_SRCTYPE GENMASK(7, 6) | 31 | #define AT91_AIC_SRCTYPE GENMASK(6, 5) |
32 | #define AT91_AIC_SRCTYPE_LOW (0 << 5) | 32 | #define AT91_AIC_SRCTYPE_LOW (0 << 5) |
33 | #define AT91_AIC_SRCTYPE_FALLING (1 << 5) | 33 | #define AT91_AIC_SRCTYPE_FALLING (1 << 5) |
34 | #define AT91_AIC_SRCTYPE_HIGH (2 << 5) | 34 | #define AT91_AIC_SRCTYPE_HIGH (2 << 5) |
@@ -74,7 +74,7 @@ int aic_common_set_type(struct irq_data *d, unsigned type, unsigned *val) | |||
74 | return -EINVAL; | 74 | return -EINVAL; |
75 | } | 75 | } |
76 | 76 | ||
77 | *val &= AT91_AIC_SRCTYPE; | 77 | *val &= ~AT91_AIC_SRCTYPE; |
78 | *val |= aic_type; | 78 | *val |= aic_type; |
79 | 79 | ||
80 | return 0; | 80 | return 0; |
diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c index 86e4684adeb1..d8996bdf0f61 100644 --- a/drivers/irqchip/irq-gic-v3-its.c +++ b/drivers/irqchip/irq-gic-v3-its.c | |||
@@ -1053,7 +1053,7 @@ static struct its_device *its_create_device(struct its_node *its, u32 dev_id, | |||
1053 | * of two entries. No, the architecture doesn't let you | 1053 | * of two entries. No, the architecture doesn't let you |
1054 | * express an ITT with a single entry. | 1054 | * express an ITT with a single entry. |
1055 | */ | 1055 | */ |
1056 | nr_ites = max(2, roundup_pow_of_two(nvecs)); | 1056 | nr_ites = max(2UL, roundup_pow_of_two(nvecs)); |
1057 | sz = nr_ites * its->ite_size; | 1057 | sz = nr_ites * its->ite_size; |
1058 | sz = max(sz, ITS_ITT_ALIGN) + ITS_ITT_ALIGN - 1; | 1058 | sz = max(sz, ITS_ITT_ALIGN) + ITS_ITT_ALIGN - 1; |
1059 | itt = kmalloc(sz, GFP_KERNEL); | 1059 | itt = kmalloc(sz, GFP_KERNEL); |
diff --git a/drivers/irqchip/irq-hip04.c b/drivers/irqchip/irq-hip04.c index 29b8f21b74d0..6bc2deb73d53 100644 --- a/drivers/irqchip/irq-hip04.c +++ b/drivers/irqchip/irq-hip04.c | |||
@@ -381,7 +381,7 @@ hip04_of_init(struct device_node *node, struct device_node *parent) | |||
381 | * It will be refined as each CPU probes its ID. | 381 | * It will be refined as each CPU probes its ID. |
382 | */ | 382 | */ |
383 | for (i = 0; i < NR_HIP04_CPU_IF; i++) | 383 | for (i = 0; i < NR_HIP04_CPU_IF; i++) |
384 | hip04_cpu_map[i] = 0xff; | 384 | hip04_cpu_map[i] = 0xffff; |
385 | 385 | ||
386 | /* | 386 | /* |
387 | * Find out how many interrupts are supported. | 387 | * Find out how many interrupts are supported. |
diff --git a/drivers/irqchip/irq-mtk-sysirq.c b/drivers/irqchip/irq-mtk-sysirq.c index 7e342df6a62f..0b0d2c00a2df 100644 --- a/drivers/irqchip/irq-mtk-sysirq.c +++ b/drivers/irqchip/irq-mtk-sysirq.c | |||
@@ -137,9 +137,9 @@ static int __init mtk_sysirq_of_init(struct device_node *node, | |||
137 | return -ENOMEM; | 137 | return -ENOMEM; |
138 | 138 | ||
139 | chip_data->intpol_base = of_io_request_and_map(node, 0, "intpol"); | 139 | chip_data->intpol_base = of_io_request_and_map(node, 0, "intpol"); |
140 | if (!chip_data->intpol_base) { | 140 | if (IS_ERR(chip_data->intpol_base)) { |
141 | pr_err("mtk_sysirq: unable to map sysirq register\n"); | 141 | pr_err("mtk_sysirq: unable to map sysirq register\n"); |
142 | ret = -ENOMEM; | 142 | ret = PTR_ERR(chip_data->intpol_base); |
143 | goto out_free; | 143 | goto out_free; |
144 | } | 144 | } |
145 | 145 | ||
diff --git a/drivers/irqchip/irq-omap-intc.c b/drivers/irqchip/irq-omap-intc.c index 28718d3e8281..c03f140acbae 100644 --- a/drivers/irqchip/irq-omap-intc.c +++ b/drivers/irqchip/irq-omap-intc.c | |||
@@ -263,7 +263,7 @@ static int __init omap_init_irq_of(struct device_node *node) | |||
263 | return ret; | 263 | return ret; |
264 | } | 264 | } |
265 | 265 | ||
266 | static int __init omap_init_irq_legacy(u32 base) | 266 | static int __init omap_init_irq_legacy(u32 base, struct device_node *node) |
267 | { | 267 | { |
268 | int j, irq_base; | 268 | int j, irq_base; |
269 | 269 | ||
@@ -277,7 +277,7 @@ static int __init omap_init_irq_legacy(u32 base) | |||
277 | irq_base = 0; | 277 | irq_base = 0; |
278 | } | 278 | } |
279 | 279 | ||
280 | domain = irq_domain_add_legacy(NULL, omap_nr_irqs, irq_base, 0, | 280 | domain = irq_domain_add_legacy(node, omap_nr_irqs, irq_base, 0, |
281 | &irq_domain_simple_ops, NULL); | 281 | &irq_domain_simple_ops, NULL); |
282 | 282 | ||
283 | omap_irq_soft_reset(); | 283 | omap_irq_soft_reset(); |
@@ -301,10 +301,26 @@ static int __init omap_init_irq(u32 base, struct device_node *node) | |||
301 | { | 301 | { |
302 | int ret; | 302 | int ret; |
303 | 303 | ||
304 | if (node) | 304 | /* |
305 | * FIXME legacy OMAP DMA driver sitting under arch/arm/plat-omap/dma.c | ||
306 | * depends is still not ready for linear IRQ domains; because of that | ||
307 | * we need to temporarily "blacklist" OMAP2 and OMAP3 devices from using | ||
308 | * linear IRQ Domain until that driver is finally fixed. | ||
309 | */ | ||
310 | if (of_device_is_compatible(node, "ti,omap2-intc") || | ||
311 | of_device_is_compatible(node, "ti,omap3-intc")) { | ||
312 | struct resource res; | ||
313 | |||
314 | if (of_address_to_resource(node, 0, &res)) | ||
315 | return -ENOMEM; | ||
316 | |||
317 | base = res.start; | ||
318 | ret = omap_init_irq_legacy(base, node); | ||
319 | } else if (node) { | ||
305 | ret = omap_init_irq_of(node); | 320 | ret = omap_init_irq_of(node); |
306 | else | 321 | } else { |
307 | ret = omap_init_irq_legacy(base); | 322 | ret = omap_init_irq_legacy(base, NULL); |
323 | } | ||
308 | 324 | ||
309 | if (ret == 0) | 325 | if (ret == 0) |
310 | omap_irq_enable_protection(); | 326 | omap_irq_enable_protection(); |
diff --git a/drivers/mcb/mcb-internal.h b/drivers/mcb/mcb-internal.h index f956ef26c0ce..fb7493dcfb79 100644 --- a/drivers/mcb/mcb-internal.h +++ b/drivers/mcb/mcb-internal.h | |||
@@ -7,6 +7,7 @@ | |||
7 | #define PCI_DEVICE_ID_MEN_CHAMELEON 0x4d45 | 7 | #define PCI_DEVICE_ID_MEN_CHAMELEON 0x4d45 |
8 | #define CHAMELEON_FILENAME_LEN 12 | 8 | #define CHAMELEON_FILENAME_LEN 12 |
9 | #define CHAMELEONV2_MAGIC 0xabce | 9 | #define CHAMELEONV2_MAGIC 0xabce |
10 | #define CHAM_HEADER_SIZE 0x200 | ||
10 | 11 | ||
11 | enum chameleon_descriptor_type { | 12 | enum chameleon_descriptor_type { |
12 | CHAMELEON_DTYPE_GENERAL = 0x0, | 13 | CHAMELEON_DTYPE_GENERAL = 0x0, |
diff --git a/drivers/mcb/mcb-pci.c b/drivers/mcb/mcb-pci.c index b59181965643..5e1bd5db02c8 100644 --- a/drivers/mcb/mcb-pci.c +++ b/drivers/mcb/mcb-pci.c | |||
@@ -17,6 +17,7 @@ | |||
17 | 17 | ||
18 | struct priv { | 18 | struct priv { |
19 | struct mcb_bus *bus; | 19 | struct mcb_bus *bus; |
20 | phys_addr_t mapbase; | ||
20 | void __iomem *base; | 21 | void __iomem *base; |
21 | }; | 22 | }; |
22 | 23 | ||
@@ -31,8 +32,8 @@ static int mcb_pci_get_irq(struct mcb_device *mdev) | |||
31 | 32 | ||
32 | static int mcb_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) | 33 | static int mcb_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) |
33 | { | 34 | { |
35 | struct resource *res; | ||
34 | struct priv *priv; | 36 | struct priv *priv; |
35 | phys_addr_t mapbase; | ||
36 | int ret; | 37 | int ret; |
37 | int num_cells; | 38 | int num_cells; |
38 | unsigned long flags; | 39 | unsigned long flags; |
@@ -47,19 +48,21 @@ static int mcb_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
47 | return -ENODEV; | 48 | return -ENODEV; |
48 | } | 49 | } |
49 | 50 | ||
50 | mapbase = pci_resource_start(pdev, 0); | 51 | priv->mapbase = pci_resource_start(pdev, 0); |
51 | if (!mapbase) { | 52 | if (!priv->mapbase) { |
52 | dev_err(&pdev->dev, "No PCI resource\n"); | 53 | dev_err(&pdev->dev, "No PCI resource\n"); |
53 | goto err_start; | 54 | goto err_start; |
54 | } | 55 | } |
55 | 56 | ||
56 | ret = pci_request_region(pdev, 0, KBUILD_MODNAME); | 57 | res = request_mem_region(priv->mapbase, CHAM_HEADER_SIZE, |
57 | if (ret) { | 58 | KBUILD_MODNAME); |
58 | dev_err(&pdev->dev, "Failed to request PCI BARs\n"); | 59 | if (IS_ERR(res)) { |
60 | dev_err(&pdev->dev, "Failed to request PCI memory\n"); | ||
61 | ret = PTR_ERR(res); | ||
59 | goto err_start; | 62 | goto err_start; |
60 | } | 63 | } |
61 | 64 | ||
62 | priv->base = pci_iomap(pdev, 0, 0); | 65 | priv->base = ioremap(priv->mapbase, CHAM_HEADER_SIZE); |
63 | if (!priv->base) { | 66 | if (!priv->base) { |
64 | dev_err(&pdev->dev, "Cannot ioremap\n"); | 67 | dev_err(&pdev->dev, "Cannot ioremap\n"); |
65 | ret = -ENOMEM; | 68 | ret = -ENOMEM; |
@@ -84,7 +87,7 @@ static int mcb_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
84 | 87 | ||
85 | priv->bus->get_irq = mcb_pci_get_irq; | 88 | priv->bus->get_irq = mcb_pci_get_irq; |
86 | 89 | ||
87 | ret = chameleon_parse_cells(priv->bus, mapbase, priv->base); | 90 | ret = chameleon_parse_cells(priv->bus, priv->mapbase, priv->base); |
88 | if (ret < 0) | 91 | if (ret < 0) |
89 | goto err_drvdata; | 92 | goto err_drvdata; |
90 | num_cells = ret; | 93 | num_cells = ret; |
@@ -93,8 +96,10 @@ static int mcb_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
93 | 96 | ||
94 | mcb_bus_add_devices(priv->bus); | 97 | mcb_bus_add_devices(priv->bus); |
95 | 98 | ||
99 | return 0; | ||
100 | |||
96 | err_drvdata: | 101 | err_drvdata: |
97 | pci_iounmap(pdev, priv->base); | 102 | iounmap(priv->base); |
98 | err_ioremap: | 103 | err_ioremap: |
99 | pci_release_region(pdev, 0); | 104 | pci_release_region(pdev, 0); |
100 | err_start: | 105 | err_start: |
@@ -107,6 +112,10 @@ static void mcb_pci_remove(struct pci_dev *pdev) | |||
107 | struct priv *priv = pci_get_drvdata(pdev); | 112 | struct priv *priv = pci_get_drvdata(pdev); |
108 | 113 | ||
109 | mcb_release_bus(priv->bus); | 114 | mcb_release_bus(priv->bus); |
115 | |||
116 | iounmap(priv->base); | ||
117 | release_region(priv->mapbase, CHAM_HEADER_SIZE); | ||
118 | pci_disable_device(pdev); | ||
110 | } | 119 | } |
111 | 120 | ||
112 | static const struct pci_device_id mcb_pci_tbl[] = { | 121 | static const struct pci_device_id mcb_pci_tbl[] = { |
diff --git a/drivers/md/dm-cache-metadata.c b/drivers/md/dm-cache-metadata.c index 9fc616c2755e..21b156242e42 100644 --- a/drivers/md/dm-cache-metadata.c +++ b/drivers/md/dm-cache-metadata.c | |||
@@ -94,6 +94,9 @@ struct cache_disk_superblock { | |||
94 | } __packed; | 94 | } __packed; |
95 | 95 | ||
96 | struct dm_cache_metadata { | 96 | struct dm_cache_metadata { |
97 | atomic_t ref_count; | ||
98 | struct list_head list; | ||
99 | |||
97 | struct block_device *bdev; | 100 | struct block_device *bdev; |
98 | struct dm_block_manager *bm; | 101 | struct dm_block_manager *bm; |
99 | struct dm_space_map *metadata_sm; | 102 | struct dm_space_map *metadata_sm; |
@@ -669,10 +672,10 @@ static void unpack_value(__le64 value_le, dm_oblock_t *block, unsigned *flags) | |||
669 | 672 | ||
670 | /*----------------------------------------------------------------*/ | 673 | /*----------------------------------------------------------------*/ |
671 | 674 | ||
672 | struct dm_cache_metadata *dm_cache_metadata_open(struct block_device *bdev, | 675 | static struct dm_cache_metadata *metadata_open(struct block_device *bdev, |
673 | sector_t data_block_size, | 676 | sector_t data_block_size, |
674 | bool may_format_device, | 677 | bool may_format_device, |
675 | size_t policy_hint_size) | 678 | size_t policy_hint_size) |
676 | { | 679 | { |
677 | int r; | 680 | int r; |
678 | struct dm_cache_metadata *cmd; | 681 | struct dm_cache_metadata *cmd; |
@@ -683,6 +686,7 @@ struct dm_cache_metadata *dm_cache_metadata_open(struct block_device *bdev, | |||
683 | return NULL; | 686 | return NULL; |
684 | } | 687 | } |
685 | 688 | ||
689 | atomic_set(&cmd->ref_count, 1); | ||
686 | init_rwsem(&cmd->root_lock); | 690 | init_rwsem(&cmd->root_lock); |
687 | cmd->bdev = bdev; | 691 | cmd->bdev = bdev; |
688 | cmd->data_block_size = data_block_size; | 692 | cmd->data_block_size = data_block_size; |
@@ -705,10 +709,95 @@ struct dm_cache_metadata *dm_cache_metadata_open(struct block_device *bdev, | |||
705 | return cmd; | 709 | return cmd; |
706 | } | 710 | } |
707 | 711 | ||
712 | /* | ||
713 | * We keep a little list of ref counted metadata objects to prevent two | ||
714 | * different target instances creating separate bufio instances. This is | ||
715 | * an issue if a table is reloaded before the suspend. | ||
716 | */ | ||
717 | static DEFINE_MUTEX(table_lock); | ||
718 | static LIST_HEAD(table); | ||
719 | |||
720 | static struct dm_cache_metadata *lookup(struct block_device *bdev) | ||
721 | { | ||
722 | struct dm_cache_metadata *cmd; | ||
723 | |||
724 | list_for_each_entry(cmd, &table, list) | ||
725 | if (cmd->bdev == bdev) { | ||
726 | atomic_inc(&cmd->ref_count); | ||
727 | return cmd; | ||
728 | } | ||
729 | |||
730 | return NULL; | ||
731 | } | ||
732 | |||
733 | static struct dm_cache_metadata *lookup_or_open(struct block_device *bdev, | ||
734 | sector_t data_block_size, | ||
735 | bool may_format_device, | ||
736 | size_t policy_hint_size) | ||
737 | { | ||
738 | struct dm_cache_metadata *cmd, *cmd2; | ||
739 | |||
740 | mutex_lock(&table_lock); | ||
741 | cmd = lookup(bdev); | ||
742 | mutex_unlock(&table_lock); | ||
743 | |||
744 | if (cmd) | ||
745 | return cmd; | ||
746 | |||
747 | cmd = metadata_open(bdev, data_block_size, may_format_device, policy_hint_size); | ||
748 | if (cmd) { | ||
749 | mutex_lock(&table_lock); | ||
750 | cmd2 = lookup(bdev); | ||
751 | if (cmd2) { | ||
752 | mutex_unlock(&table_lock); | ||
753 | __destroy_persistent_data_objects(cmd); | ||
754 | kfree(cmd); | ||
755 | return cmd2; | ||
756 | } | ||
757 | list_add(&cmd->list, &table); | ||
758 | mutex_unlock(&table_lock); | ||
759 | } | ||
760 | |||
761 | return cmd; | ||
762 | } | ||
763 | |||
764 | static bool same_params(struct dm_cache_metadata *cmd, sector_t data_block_size) | ||
765 | { | ||
766 | if (cmd->data_block_size != data_block_size) { | ||
767 | DMERR("data_block_size (%llu) different from that in metadata (%llu)\n", | ||
768 | (unsigned long long) data_block_size, | ||
769 | (unsigned long long) cmd->data_block_size); | ||
770 | return false; | ||
771 | } | ||
772 | |||
773 | return true; | ||
774 | } | ||
775 | |||
776 | struct dm_cache_metadata *dm_cache_metadata_open(struct block_device *bdev, | ||
777 | sector_t data_block_size, | ||
778 | bool may_format_device, | ||
779 | size_t policy_hint_size) | ||
780 | { | ||
781 | struct dm_cache_metadata *cmd = lookup_or_open(bdev, data_block_size, | ||
782 | may_format_device, policy_hint_size); | ||
783 | if (cmd && !same_params(cmd, data_block_size)) { | ||
784 | dm_cache_metadata_close(cmd); | ||
785 | return NULL; | ||
786 | } | ||
787 | |||
788 | return cmd; | ||
789 | } | ||
790 | |||
708 | void dm_cache_metadata_close(struct dm_cache_metadata *cmd) | 791 | void dm_cache_metadata_close(struct dm_cache_metadata *cmd) |
709 | { | 792 | { |
710 | __destroy_persistent_data_objects(cmd); | 793 | if (atomic_dec_and_test(&cmd->ref_count)) { |
711 | kfree(cmd); | 794 | mutex_lock(&table_lock); |
795 | list_del(&cmd->list); | ||
796 | mutex_unlock(&table_lock); | ||
797 | |||
798 | __destroy_persistent_data_objects(cmd); | ||
799 | kfree(cmd); | ||
800 | } | ||
712 | } | 801 | } |
713 | 802 | ||
714 | /* | 803 | /* |
diff --git a/drivers/md/dm-cache-target.c b/drivers/md/dm-cache-target.c index 1e96d7889f51..e1650539cc2f 100644 --- a/drivers/md/dm-cache-target.c +++ b/drivers/md/dm-cache-target.c | |||
@@ -221,7 +221,13 @@ struct cache { | |||
221 | struct list_head need_commit_migrations; | 221 | struct list_head need_commit_migrations; |
222 | sector_t migration_threshold; | 222 | sector_t migration_threshold; |
223 | wait_queue_head_t migration_wait; | 223 | wait_queue_head_t migration_wait; |
224 | atomic_t nr_migrations; | 224 | atomic_t nr_allocated_migrations; |
225 | |||
226 | /* | ||
227 | * The number of in flight migrations that are performing | ||
228 | * background io. eg, promotion, writeback. | ||
229 | */ | ||
230 | atomic_t nr_io_migrations; | ||
225 | 231 | ||
226 | wait_queue_head_t quiescing_wait; | 232 | wait_queue_head_t quiescing_wait; |
227 | atomic_t quiescing; | 233 | atomic_t quiescing; |
@@ -258,7 +264,6 @@ struct cache { | |||
258 | struct dm_deferred_set *all_io_ds; | 264 | struct dm_deferred_set *all_io_ds; |
259 | 265 | ||
260 | mempool_t *migration_pool; | 266 | mempool_t *migration_pool; |
261 | struct dm_cache_migration *next_migration; | ||
262 | 267 | ||
263 | struct dm_cache_policy *policy; | 268 | struct dm_cache_policy *policy; |
264 | unsigned policy_nr_args; | 269 | unsigned policy_nr_args; |
@@ -350,10 +355,31 @@ static void free_prison_cell(struct cache *cache, struct dm_bio_prison_cell *cel | |||
350 | dm_bio_prison_free_cell(cache->prison, cell); | 355 | dm_bio_prison_free_cell(cache->prison, cell); |
351 | } | 356 | } |
352 | 357 | ||
358 | static struct dm_cache_migration *alloc_migration(struct cache *cache) | ||
359 | { | ||
360 | struct dm_cache_migration *mg; | ||
361 | |||
362 | mg = mempool_alloc(cache->migration_pool, GFP_NOWAIT); | ||
363 | if (mg) { | ||
364 | mg->cache = cache; | ||
365 | atomic_inc(&mg->cache->nr_allocated_migrations); | ||
366 | } | ||
367 | |||
368 | return mg; | ||
369 | } | ||
370 | |||
371 | static void free_migration(struct dm_cache_migration *mg) | ||
372 | { | ||
373 | if (atomic_dec_and_test(&mg->cache->nr_allocated_migrations)) | ||
374 | wake_up(&mg->cache->migration_wait); | ||
375 | |||
376 | mempool_free(mg, mg->cache->migration_pool); | ||
377 | } | ||
378 | |||
353 | static int prealloc_data_structs(struct cache *cache, struct prealloc *p) | 379 | static int prealloc_data_structs(struct cache *cache, struct prealloc *p) |
354 | { | 380 | { |
355 | if (!p->mg) { | 381 | if (!p->mg) { |
356 | p->mg = mempool_alloc(cache->migration_pool, GFP_NOWAIT); | 382 | p->mg = alloc_migration(cache); |
357 | if (!p->mg) | 383 | if (!p->mg) |
358 | return -ENOMEM; | 384 | return -ENOMEM; |
359 | } | 385 | } |
@@ -382,7 +408,7 @@ static void prealloc_free_structs(struct cache *cache, struct prealloc *p) | |||
382 | free_prison_cell(cache, p->cell1); | 408 | free_prison_cell(cache, p->cell1); |
383 | 409 | ||
384 | if (p->mg) | 410 | if (p->mg) |
385 | mempool_free(p->mg, cache->migration_pool); | 411 | free_migration(p->mg); |
386 | } | 412 | } |
387 | 413 | ||
388 | static struct dm_cache_migration *prealloc_get_migration(struct prealloc *p) | 414 | static struct dm_cache_migration *prealloc_get_migration(struct prealloc *p) |
@@ -854,24 +880,14 @@ static void remap_to_origin_then_cache(struct cache *cache, struct bio *bio, | |||
854 | * Migration covers moving data from the origin device to the cache, or | 880 | * Migration covers moving data from the origin device to the cache, or |
855 | * vice versa. | 881 | * vice versa. |
856 | *--------------------------------------------------------------*/ | 882 | *--------------------------------------------------------------*/ |
857 | static void free_migration(struct dm_cache_migration *mg) | 883 | static void inc_io_migrations(struct cache *cache) |
858 | { | ||
859 | mempool_free(mg, mg->cache->migration_pool); | ||
860 | } | ||
861 | |||
862 | static void inc_nr_migrations(struct cache *cache) | ||
863 | { | 884 | { |
864 | atomic_inc(&cache->nr_migrations); | 885 | atomic_inc(&cache->nr_io_migrations); |
865 | } | 886 | } |
866 | 887 | ||
867 | static void dec_nr_migrations(struct cache *cache) | 888 | static void dec_io_migrations(struct cache *cache) |
868 | { | 889 | { |
869 | atomic_dec(&cache->nr_migrations); | 890 | atomic_dec(&cache->nr_io_migrations); |
870 | |||
871 | /* | ||
872 | * Wake the worker in case we're suspending the target. | ||
873 | */ | ||
874 | wake_up(&cache->migration_wait); | ||
875 | } | 891 | } |
876 | 892 | ||
877 | static void __cell_defer(struct cache *cache, struct dm_bio_prison_cell *cell, | 893 | static void __cell_defer(struct cache *cache, struct dm_bio_prison_cell *cell, |
@@ -894,11 +910,10 @@ static void cell_defer(struct cache *cache, struct dm_bio_prison_cell *cell, | |||
894 | wake_worker(cache); | 910 | wake_worker(cache); |
895 | } | 911 | } |
896 | 912 | ||
897 | static void cleanup_migration(struct dm_cache_migration *mg) | 913 | static void free_io_migration(struct dm_cache_migration *mg) |
898 | { | 914 | { |
899 | struct cache *cache = mg->cache; | 915 | dec_io_migrations(mg->cache); |
900 | free_migration(mg); | 916 | free_migration(mg); |
901 | dec_nr_migrations(cache); | ||
902 | } | 917 | } |
903 | 918 | ||
904 | static void migration_failure(struct dm_cache_migration *mg) | 919 | static void migration_failure(struct dm_cache_migration *mg) |
@@ -923,7 +938,7 @@ static void migration_failure(struct dm_cache_migration *mg) | |||
923 | cell_defer(cache, mg->new_ocell, true); | 938 | cell_defer(cache, mg->new_ocell, true); |
924 | } | 939 | } |
925 | 940 | ||
926 | cleanup_migration(mg); | 941 | free_io_migration(mg); |
927 | } | 942 | } |
928 | 943 | ||
929 | static void migration_success_pre_commit(struct dm_cache_migration *mg) | 944 | static void migration_success_pre_commit(struct dm_cache_migration *mg) |
@@ -934,7 +949,7 @@ static void migration_success_pre_commit(struct dm_cache_migration *mg) | |||
934 | if (mg->writeback) { | 949 | if (mg->writeback) { |
935 | clear_dirty(cache, mg->old_oblock, mg->cblock); | 950 | clear_dirty(cache, mg->old_oblock, mg->cblock); |
936 | cell_defer(cache, mg->old_ocell, false); | 951 | cell_defer(cache, mg->old_ocell, false); |
937 | cleanup_migration(mg); | 952 | free_io_migration(mg); |
938 | return; | 953 | return; |
939 | 954 | ||
940 | } else if (mg->demote) { | 955 | } else if (mg->demote) { |
@@ -944,14 +959,14 @@ static void migration_success_pre_commit(struct dm_cache_migration *mg) | |||
944 | mg->old_oblock); | 959 | mg->old_oblock); |
945 | if (mg->promote) | 960 | if (mg->promote) |
946 | cell_defer(cache, mg->new_ocell, true); | 961 | cell_defer(cache, mg->new_ocell, true); |
947 | cleanup_migration(mg); | 962 | free_io_migration(mg); |
948 | return; | 963 | return; |
949 | } | 964 | } |
950 | } else { | 965 | } else { |
951 | if (dm_cache_insert_mapping(cache->cmd, mg->cblock, mg->new_oblock)) { | 966 | if (dm_cache_insert_mapping(cache->cmd, mg->cblock, mg->new_oblock)) { |
952 | DMWARN_LIMIT("promotion failed; couldn't update on disk metadata"); | 967 | DMWARN_LIMIT("promotion failed; couldn't update on disk metadata"); |
953 | policy_remove_mapping(cache->policy, mg->new_oblock); | 968 | policy_remove_mapping(cache->policy, mg->new_oblock); |
954 | cleanup_migration(mg); | 969 | free_io_migration(mg); |
955 | return; | 970 | return; |
956 | } | 971 | } |
957 | } | 972 | } |
@@ -984,7 +999,7 @@ static void migration_success_post_commit(struct dm_cache_migration *mg) | |||
984 | } else { | 999 | } else { |
985 | if (mg->invalidate) | 1000 | if (mg->invalidate) |
986 | policy_remove_mapping(cache->policy, mg->old_oblock); | 1001 | policy_remove_mapping(cache->policy, mg->old_oblock); |
987 | cleanup_migration(mg); | 1002 | free_io_migration(mg); |
988 | } | 1003 | } |
989 | 1004 | ||
990 | } else { | 1005 | } else { |
@@ -999,7 +1014,7 @@ static void migration_success_post_commit(struct dm_cache_migration *mg) | |||
999 | bio_endio(mg->new_ocell->holder, 0); | 1014 | bio_endio(mg->new_ocell->holder, 0); |
1000 | cell_defer(cache, mg->new_ocell, false); | 1015 | cell_defer(cache, mg->new_ocell, false); |
1001 | } | 1016 | } |
1002 | cleanup_migration(mg); | 1017 | free_io_migration(mg); |
1003 | } | 1018 | } |
1004 | } | 1019 | } |
1005 | 1020 | ||
@@ -1251,7 +1266,7 @@ static void promote(struct cache *cache, struct prealloc *structs, | |||
1251 | mg->new_ocell = cell; | 1266 | mg->new_ocell = cell; |
1252 | mg->start_jiffies = jiffies; | 1267 | mg->start_jiffies = jiffies; |
1253 | 1268 | ||
1254 | inc_nr_migrations(cache); | 1269 | inc_io_migrations(cache); |
1255 | quiesce_migration(mg); | 1270 | quiesce_migration(mg); |
1256 | } | 1271 | } |
1257 | 1272 | ||
@@ -1275,7 +1290,7 @@ static void writeback(struct cache *cache, struct prealloc *structs, | |||
1275 | mg->new_ocell = NULL; | 1290 | mg->new_ocell = NULL; |
1276 | mg->start_jiffies = jiffies; | 1291 | mg->start_jiffies = jiffies; |
1277 | 1292 | ||
1278 | inc_nr_migrations(cache); | 1293 | inc_io_migrations(cache); |
1279 | quiesce_migration(mg); | 1294 | quiesce_migration(mg); |
1280 | } | 1295 | } |
1281 | 1296 | ||
@@ -1302,7 +1317,7 @@ static void demote_then_promote(struct cache *cache, struct prealloc *structs, | |||
1302 | mg->new_ocell = new_ocell; | 1317 | mg->new_ocell = new_ocell; |
1303 | mg->start_jiffies = jiffies; | 1318 | mg->start_jiffies = jiffies; |
1304 | 1319 | ||
1305 | inc_nr_migrations(cache); | 1320 | inc_io_migrations(cache); |
1306 | quiesce_migration(mg); | 1321 | quiesce_migration(mg); |
1307 | } | 1322 | } |
1308 | 1323 | ||
@@ -1330,7 +1345,7 @@ static void invalidate(struct cache *cache, struct prealloc *structs, | |||
1330 | mg->new_ocell = NULL; | 1345 | mg->new_ocell = NULL; |
1331 | mg->start_jiffies = jiffies; | 1346 | mg->start_jiffies = jiffies; |
1332 | 1347 | ||
1333 | inc_nr_migrations(cache); | 1348 | inc_io_migrations(cache); |
1334 | quiesce_migration(mg); | 1349 | quiesce_migration(mg); |
1335 | } | 1350 | } |
1336 | 1351 | ||
@@ -1412,7 +1427,7 @@ static void process_discard_bio(struct cache *cache, struct prealloc *structs, | |||
1412 | 1427 | ||
1413 | static bool spare_migration_bandwidth(struct cache *cache) | 1428 | static bool spare_migration_bandwidth(struct cache *cache) |
1414 | { | 1429 | { |
1415 | sector_t current_volume = (atomic_read(&cache->nr_migrations) + 1) * | 1430 | sector_t current_volume = (atomic_read(&cache->nr_io_migrations) + 1) * |
1416 | cache->sectors_per_block; | 1431 | cache->sectors_per_block; |
1417 | return current_volume < cache->migration_threshold; | 1432 | return current_volume < cache->migration_threshold; |
1418 | } | 1433 | } |
@@ -1764,7 +1779,7 @@ static void stop_quiescing(struct cache *cache) | |||
1764 | 1779 | ||
1765 | static void wait_for_migrations(struct cache *cache) | 1780 | static void wait_for_migrations(struct cache *cache) |
1766 | { | 1781 | { |
1767 | wait_event(cache->migration_wait, !atomic_read(&cache->nr_migrations)); | 1782 | wait_event(cache->migration_wait, !atomic_read(&cache->nr_allocated_migrations)); |
1768 | } | 1783 | } |
1769 | 1784 | ||
1770 | static void stop_worker(struct cache *cache) | 1785 | static void stop_worker(struct cache *cache) |
@@ -1876,9 +1891,6 @@ static void destroy(struct cache *cache) | |||
1876 | { | 1891 | { |
1877 | unsigned i; | 1892 | unsigned i; |
1878 | 1893 | ||
1879 | if (cache->next_migration) | ||
1880 | mempool_free(cache->next_migration, cache->migration_pool); | ||
1881 | |||
1882 | if (cache->migration_pool) | 1894 | if (cache->migration_pool) |
1883 | mempool_destroy(cache->migration_pool); | 1895 | mempool_destroy(cache->migration_pool); |
1884 | 1896 | ||
@@ -2424,7 +2436,8 @@ static int cache_create(struct cache_args *ca, struct cache **result) | |||
2424 | INIT_LIST_HEAD(&cache->quiesced_migrations); | 2436 | INIT_LIST_HEAD(&cache->quiesced_migrations); |
2425 | INIT_LIST_HEAD(&cache->completed_migrations); | 2437 | INIT_LIST_HEAD(&cache->completed_migrations); |
2426 | INIT_LIST_HEAD(&cache->need_commit_migrations); | 2438 | INIT_LIST_HEAD(&cache->need_commit_migrations); |
2427 | atomic_set(&cache->nr_migrations, 0); | 2439 | atomic_set(&cache->nr_allocated_migrations, 0); |
2440 | atomic_set(&cache->nr_io_migrations, 0); | ||
2428 | init_waitqueue_head(&cache->migration_wait); | 2441 | init_waitqueue_head(&cache->migration_wait); |
2429 | 2442 | ||
2430 | init_waitqueue_head(&cache->quiescing_wait); | 2443 | init_waitqueue_head(&cache->quiescing_wait); |
@@ -2487,8 +2500,6 @@ static int cache_create(struct cache_args *ca, struct cache **result) | |||
2487 | goto bad; | 2500 | goto bad; |
2488 | } | 2501 | } |
2489 | 2502 | ||
2490 | cache->next_migration = NULL; | ||
2491 | |||
2492 | cache->need_tick_bio = true; | 2503 | cache->need_tick_bio = true; |
2493 | cache->sized = false; | 2504 | cache->sized = false; |
2494 | cache->invalidate = false; | 2505 | cache->invalidate = false; |
diff --git a/drivers/md/dm.c b/drivers/md/dm.c index b98cd9d84435..2caf5b374649 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c | |||
@@ -206,6 +206,9 @@ struct mapped_device { | |||
206 | /* zero-length flush that will be cloned and submitted to targets */ | 206 | /* zero-length flush that will be cloned and submitted to targets */ |
207 | struct bio flush_bio; | 207 | struct bio flush_bio; |
208 | 208 | ||
209 | /* the number of internal suspends */ | ||
210 | unsigned internal_suspend_count; | ||
211 | |||
209 | struct dm_stats stats; | 212 | struct dm_stats stats; |
210 | }; | 213 | }; |
211 | 214 | ||
@@ -2928,7 +2931,7 @@ static void __dm_internal_suspend(struct mapped_device *md, unsigned suspend_fla | |||
2928 | { | 2931 | { |
2929 | struct dm_table *map = NULL; | 2932 | struct dm_table *map = NULL; |
2930 | 2933 | ||
2931 | if (dm_suspended_internally_md(md)) | 2934 | if (md->internal_suspend_count++) |
2932 | return; /* nested internal suspend */ | 2935 | return; /* nested internal suspend */ |
2933 | 2936 | ||
2934 | if (dm_suspended_md(md)) { | 2937 | if (dm_suspended_md(md)) { |
@@ -2953,7 +2956,9 @@ static void __dm_internal_suspend(struct mapped_device *md, unsigned suspend_fla | |||
2953 | 2956 | ||
2954 | static void __dm_internal_resume(struct mapped_device *md) | 2957 | static void __dm_internal_resume(struct mapped_device *md) |
2955 | { | 2958 | { |
2956 | if (!dm_suspended_internally_md(md)) | 2959 | BUG_ON(!md->internal_suspend_count); |
2960 | |||
2961 | if (--md->internal_suspend_count) | ||
2957 | return; /* resume from nested internal suspend */ | 2962 | return; /* resume from nested internal suspend */ |
2958 | 2963 | ||
2959 | if (dm_suspended_md(md)) | 2964 | if (dm_suspended_md(md)) |
diff --git a/drivers/media/pci/cx23885/cx23885-cards.c b/drivers/media/pci/cx23885/cx23885-cards.c index db99ca2613ba..06931f6fa26c 100644 --- a/drivers/media/pci/cx23885/cx23885-cards.c +++ b/drivers/media/pci/cx23885/cx23885-cards.c | |||
@@ -614,7 +614,7 @@ struct cx23885_board cx23885_boards[] = { | |||
614 | .portb = CX23885_MPEG_DVB, | 614 | .portb = CX23885_MPEG_DVB, |
615 | }, | 615 | }, |
616 | [CX23885_BOARD_HAUPPAUGE_HVR4400] = { | 616 | [CX23885_BOARD_HAUPPAUGE_HVR4400] = { |
617 | .name = "Hauppauge WinTV-HVR4400", | 617 | .name = "Hauppauge WinTV-HVR4400/HVR5500", |
618 | .porta = CX23885_ANALOG_VIDEO, | 618 | .porta = CX23885_ANALOG_VIDEO, |
619 | .portb = CX23885_MPEG_DVB, | 619 | .portb = CX23885_MPEG_DVB, |
620 | .portc = CX23885_MPEG_DVB, | 620 | .portc = CX23885_MPEG_DVB, |
@@ -622,6 +622,10 @@ struct cx23885_board cx23885_boards[] = { | |||
622 | .tuner_addr = 0x60, /* 0xc0 >> 1 */ | 622 | .tuner_addr = 0x60, /* 0xc0 >> 1 */ |
623 | .tuner_bus = 1, | 623 | .tuner_bus = 1, |
624 | }, | 624 | }, |
625 | [CX23885_BOARD_HAUPPAUGE_STARBURST] = { | ||
626 | .name = "Hauppauge WinTV Starburst", | ||
627 | .portb = CX23885_MPEG_DVB, | ||
628 | }, | ||
625 | [CX23885_BOARD_AVERMEDIA_HC81R] = { | 629 | [CX23885_BOARD_AVERMEDIA_HC81R] = { |
626 | .name = "AVerTV Hybrid Express Slim HC81R", | 630 | .name = "AVerTV Hybrid Express Slim HC81R", |
627 | .tuner_type = TUNER_XC2028, | 631 | .tuner_type = TUNER_XC2028, |
@@ -936,19 +940,19 @@ struct cx23885_subid cx23885_subids[] = { | |||
936 | }, { | 940 | }, { |
937 | .subvendor = 0x0070, | 941 | .subvendor = 0x0070, |
938 | .subdevice = 0xc108, | 942 | .subdevice = 0xc108, |
939 | .card = CX23885_BOARD_HAUPPAUGE_HVR4400, | 943 | .card = CX23885_BOARD_HAUPPAUGE_HVR4400, /* Hauppauge WinTV HVR-4400 (Model 121xxx, Hybrid DVB-T/S2, IR) */ |
940 | }, { | 944 | }, { |
941 | .subvendor = 0x0070, | 945 | .subvendor = 0x0070, |
942 | .subdevice = 0xc138, | 946 | .subdevice = 0xc138, |
943 | .card = CX23885_BOARD_HAUPPAUGE_HVR4400, | 947 | .card = CX23885_BOARD_HAUPPAUGE_HVR4400, /* Hauppauge WinTV HVR-5500 (Model 121xxx, Hybrid DVB-T/C/S2, IR) */ |
944 | }, { | 948 | }, { |
945 | .subvendor = 0x0070, | 949 | .subvendor = 0x0070, |
946 | .subdevice = 0xc12a, | 950 | .subdevice = 0xc12a, |
947 | .card = CX23885_BOARD_HAUPPAUGE_HVR4400, | 951 | .card = CX23885_BOARD_HAUPPAUGE_STARBURST, /* Hauppauge WinTV Starburst (Model 121x00, DVB-S2, IR) */ |
948 | }, { | 952 | }, { |
949 | .subvendor = 0x0070, | 953 | .subvendor = 0x0070, |
950 | .subdevice = 0xc1f8, | 954 | .subdevice = 0xc1f8, |
951 | .card = CX23885_BOARD_HAUPPAUGE_HVR4400, | 955 | .card = CX23885_BOARD_HAUPPAUGE_HVR4400, /* Hauppauge WinTV HVR-5500 (Model 121xxx, Hybrid DVB-T/C/S2, IR) */ |
952 | }, { | 956 | }, { |
953 | .subvendor = 0x1461, | 957 | .subvendor = 0x1461, |
954 | .subdevice = 0xd939, | 958 | .subdevice = 0xd939, |
@@ -1545,8 +1549,9 @@ void cx23885_gpio_setup(struct cx23885_dev *dev) | |||
1545 | cx_write(GPIO_ISM, 0x00000000);/* INTERRUPTS active low*/ | 1549 | cx_write(GPIO_ISM, 0x00000000);/* INTERRUPTS active low*/ |
1546 | break; | 1550 | break; |
1547 | case CX23885_BOARD_HAUPPAUGE_HVR4400: | 1551 | case CX23885_BOARD_HAUPPAUGE_HVR4400: |
1552 | case CX23885_BOARD_HAUPPAUGE_STARBURST: | ||
1548 | /* GPIO-8 tda10071 demod reset */ | 1553 | /* GPIO-8 tda10071 demod reset */ |
1549 | /* GPIO-9 si2165 demod reset */ | 1554 | /* GPIO-9 si2165 demod reset (only HVR4400/HVR5500)*/ |
1550 | 1555 | ||
1551 | /* Put the parts into reset and back */ | 1556 | /* Put the parts into reset and back */ |
1552 | cx23885_gpio_enable(dev, GPIO_8 | GPIO_9, 1); | 1557 | cx23885_gpio_enable(dev, GPIO_8 | GPIO_9, 1); |
@@ -1872,6 +1877,7 @@ void cx23885_card_setup(struct cx23885_dev *dev) | |||
1872 | case CX23885_BOARD_HAUPPAUGE_HVR1850: | 1877 | case CX23885_BOARD_HAUPPAUGE_HVR1850: |
1873 | case CX23885_BOARD_HAUPPAUGE_HVR1290: | 1878 | case CX23885_BOARD_HAUPPAUGE_HVR1290: |
1874 | case CX23885_BOARD_HAUPPAUGE_HVR4400: | 1879 | case CX23885_BOARD_HAUPPAUGE_HVR4400: |
1880 | case CX23885_BOARD_HAUPPAUGE_STARBURST: | ||
1875 | case CX23885_BOARD_HAUPPAUGE_IMPACTVCBE: | 1881 | case CX23885_BOARD_HAUPPAUGE_IMPACTVCBE: |
1876 | if (dev->i2c_bus[0].i2c_rc == 0) | 1882 | if (dev->i2c_bus[0].i2c_rc == 0) |
1877 | hauppauge_eeprom(dev, eeprom+0xc0); | 1883 | hauppauge_eeprom(dev, eeprom+0xc0); |
@@ -1980,6 +1986,11 @@ void cx23885_card_setup(struct cx23885_dev *dev) | |||
1980 | ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */ | 1986 | ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */ |
1981 | ts2->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO; | 1987 | ts2->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO; |
1982 | break; | 1988 | break; |
1989 | case CX23885_BOARD_HAUPPAUGE_STARBURST: | ||
1990 | ts1->gen_ctrl_val = 0xc; /* Serial bus + punctured clock */ | ||
1991 | ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */ | ||
1992 | ts1->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO; | ||
1993 | break; | ||
1983 | case CX23885_BOARD_DVBSKY_T9580: | 1994 | case CX23885_BOARD_DVBSKY_T9580: |
1984 | case CX23885_BOARD_DVBSKY_T982: | 1995 | case CX23885_BOARD_DVBSKY_T982: |
1985 | ts1->gen_ctrl_val = 0x5; /* Parallel */ | 1996 | ts1->gen_ctrl_val = 0x5; /* Parallel */ |
diff --git a/drivers/media/pci/cx23885/cx23885-core.c b/drivers/media/pci/cx23885/cx23885-core.c index 1d9d0f86ca8c..1ad49946d7fa 100644 --- a/drivers/media/pci/cx23885/cx23885-core.c +++ b/drivers/media/pci/cx23885/cx23885-core.c | |||
@@ -2049,11 +2049,11 @@ static void cx23885_finidev(struct pci_dev *pci_dev) | |||
2049 | 2049 | ||
2050 | cx23885_shutdown(dev); | 2050 | cx23885_shutdown(dev); |
2051 | 2051 | ||
2052 | pci_disable_device(pci_dev); | ||
2053 | |||
2054 | /* unregister stuff */ | 2052 | /* unregister stuff */ |
2055 | free_irq(pci_dev->irq, dev); | 2053 | free_irq(pci_dev->irq, dev); |
2056 | 2054 | ||
2055 | pci_disable_device(pci_dev); | ||
2056 | |||
2057 | cx23885_dev_unregister(dev); | 2057 | cx23885_dev_unregister(dev); |
2058 | vb2_dma_sg_cleanup_ctx(dev->alloc_ctx); | 2058 | vb2_dma_sg_cleanup_ctx(dev->alloc_ctx); |
2059 | v4l2_ctrl_handler_free(&dev->ctrl_handler); | 2059 | v4l2_ctrl_handler_free(&dev->ctrl_handler); |
diff --git a/drivers/media/pci/cx23885/cx23885-dvb.c b/drivers/media/pci/cx23885/cx23885-dvb.c index c47d18270cfc..a9c450d4b54e 100644 --- a/drivers/media/pci/cx23885/cx23885-dvb.c +++ b/drivers/media/pci/cx23885/cx23885-dvb.c | |||
@@ -1710,6 +1710,17 @@ static int dvb_register(struct cx23885_tsport *port) | |||
1710 | break; | 1710 | break; |
1711 | } | 1711 | } |
1712 | break; | 1712 | break; |
1713 | case CX23885_BOARD_HAUPPAUGE_STARBURST: | ||
1714 | i2c_bus = &dev->i2c_bus[0]; | ||
1715 | fe0->dvb.frontend = dvb_attach(tda10071_attach, | ||
1716 | &hauppauge_tda10071_config, | ||
1717 | &i2c_bus->i2c_adap); | ||
1718 | if (fe0->dvb.frontend != NULL) { | ||
1719 | dvb_attach(a8293_attach, fe0->dvb.frontend, | ||
1720 | &i2c_bus->i2c_adap, | ||
1721 | &hauppauge_a8293_config); | ||
1722 | } | ||
1723 | break; | ||
1713 | case CX23885_BOARD_DVBSKY_T9580: | 1724 | case CX23885_BOARD_DVBSKY_T9580: |
1714 | case CX23885_BOARD_DVBSKY_S950: | 1725 | case CX23885_BOARD_DVBSKY_S950: |
1715 | i2c_bus = &dev->i2c_bus[0]; | 1726 | i2c_bus = &dev->i2c_bus[0]; |
diff --git a/drivers/media/pci/cx23885/cx23885.h b/drivers/media/pci/cx23885/cx23885.h index f55cd12da0fd..36f2f96c40e4 100644 --- a/drivers/media/pci/cx23885/cx23885.h +++ b/drivers/media/pci/cx23885/cx23885.h | |||
@@ -99,6 +99,7 @@ | |||
99 | #define CX23885_BOARD_DVBSKY_S950 49 | 99 | #define CX23885_BOARD_DVBSKY_S950 49 |
100 | #define CX23885_BOARD_DVBSKY_S952 50 | 100 | #define CX23885_BOARD_DVBSKY_S952 50 |
101 | #define CX23885_BOARD_DVBSKY_T982 51 | 101 | #define CX23885_BOARD_DVBSKY_T982 51 |
102 | #define CX23885_BOARD_HAUPPAUGE_STARBURST 52 | ||
102 | 103 | ||
103 | #define GPIO_0 0x00000001 | 104 | #define GPIO_0 0x00000001 |
104 | #define GPIO_1 0x00000002 | 105 | #define GPIO_1 0x00000002 |
diff --git a/drivers/media/platform/omap3isp/ispvideo.c b/drivers/media/platform/omap3isp/ispvideo.c index b463fe172d16..3fe9047ef466 100644 --- a/drivers/media/platform/omap3isp/ispvideo.c +++ b/drivers/media/platform/omap3isp/ispvideo.c | |||
@@ -602,10 +602,13 @@ isp_video_querycap(struct file *file, void *fh, struct v4l2_capability *cap) | |||
602 | strlcpy(cap->card, video->video.name, sizeof(cap->card)); | 602 | strlcpy(cap->card, video->video.name, sizeof(cap->card)); |
603 | strlcpy(cap->bus_info, "media", sizeof(cap->bus_info)); | 603 | strlcpy(cap->bus_info, "media", sizeof(cap->bus_info)); |
604 | 604 | ||
605 | cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_VIDEO_OUTPUT | ||
606 | | V4L2_CAP_STREAMING | V4L2_CAP_DEVICE_CAPS; | ||
607 | |||
605 | if (video->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) | 608 | if (video->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) |
606 | cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; | 609 | cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; |
607 | else | 610 | else |
608 | cap->capabilities = V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_STREAMING; | 611 | cap->device_caps = V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_STREAMING; |
609 | 612 | ||
610 | return 0; | 613 | return 0; |
611 | } | 614 | } |
diff --git a/drivers/media/platform/soc_camera/atmel-isi.c b/drivers/media/platform/soc_camera/atmel-isi.c index 8efe40337608..6d885239b16a 100644 --- a/drivers/media/platform/soc_camera/atmel-isi.c +++ b/drivers/media/platform/soc_camera/atmel-isi.c | |||
@@ -760,8 +760,9 @@ static int isi_camera_querycap(struct soc_camera_host *ici, | |||
760 | { | 760 | { |
761 | strcpy(cap->driver, "atmel-isi"); | 761 | strcpy(cap->driver, "atmel-isi"); |
762 | strcpy(cap->card, "Atmel Image Sensor Interface"); | 762 | strcpy(cap->card, "Atmel Image Sensor Interface"); |
763 | cap->capabilities = (V4L2_CAP_VIDEO_CAPTURE | | 763 | cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; |
764 | V4L2_CAP_STREAMING); | 764 | cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS; |
765 | |||
765 | return 0; | 766 | return 0; |
766 | } | 767 | } |
767 | 768 | ||
diff --git a/drivers/media/platform/soc_camera/mx2_camera.c b/drivers/media/platform/soc_camera/mx2_camera.c index ce72bd26a6ac..192377f55840 100644 --- a/drivers/media/platform/soc_camera/mx2_camera.c +++ b/drivers/media/platform/soc_camera/mx2_camera.c | |||
@@ -1256,7 +1256,8 @@ static int mx2_camera_querycap(struct soc_camera_host *ici, | |||
1256 | { | 1256 | { |
1257 | /* cap->name is set by the friendly caller:-> */ | 1257 | /* cap->name is set by the friendly caller:-> */ |
1258 | strlcpy(cap->card, MX2_CAM_DRIVER_DESCRIPTION, sizeof(cap->card)); | 1258 | strlcpy(cap->card, MX2_CAM_DRIVER_DESCRIPTION, sizeof(cap->card)); |
1259 | cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; | 1259 | cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; |
1260 | cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS; | ||
1260 | 1261 | ||
1261 | return 0; | 1262 | return 0; |
1262 | } | 1263 | } |
diff --git a/drivers/media/platform/soc_camera/mx3_camera.c b/drivers/media/platform/soc_camera/mx3_camera.c index a60c3bb0e4cc..0b3299dee05d 100644 --- a/drivers/media/platform/soc_camera/mx3_camera.c +++ b/drivers/media/platform/soc_camera/mx3_camera.c | |||
@@ -967,7 +967,8 @@ static int mx3_camera_querycap(struct soc_camera_host *ici, | |||
967 | { | 967 | { |
968 | /* cap->name is set by the firendly caller:-> */ | 968 | /* cap->name is set by the firendly caller:-> */ |
969 | strlcpy(cap->card, "i.MX3x Camera", sizeof(cap->card)); | 969 | strlcpy(cap->card, "i.MX3x Camera", sizeof(cap->card)); |
970 | cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; | 970 | cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; |
971 | cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS; | ||
971 | 972 | ||
972 | return 0; | 973 | return 0; |
973 | } | 974 | } |
diff --git a/drivers/media/platform/soc_camera/omap1_camera.c b/drivers/media/platform/soc_camera/omap1_camera.c index e6b93281f246..16f65ecb70a3 100644 --- a/drivers/media/platform/soc_camera/omap1_camera.c +++ b/drivers/media/platform/soc_camera/omap1_camera.c | |||
@@ -1427,7 +1427,8 @@ static int omap1_cam_querycap(struct soc_camera_host *ici, | |||
1427 | { | 1427 | { |
1428 | /* cap->name is set by the friendly caller:-> */ | 1428 | /* cap->name is set by the friendly caller:-> */ |
1429 | strlcpy(cap->card, "OMAP1 Camera", sizeof(cap->card)); | 1429 | strlcpy(cap->card, "OMAP1 Camera", sizeof(cap->card)); |
1430 | cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; | 1430 | cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; |
1431 | cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS; | ||
1431 | 1432 | ||
1432 | return 0; | 1433 | return 0; |
1433 | } | 1434 | } |
diff --git a/drivers/media/platform/soc_camera/pxa_camera.c b/drivers/media/platform/soc_camera/pxa_camera.c index 951226af0eba..8d6e343fec0f 100644 --- a/drivers/media/platform/soc_camera/pxa_camera.c +++ b/drivers/media/platform/soc_camera/pxa_camera.c | |||
@@ -1576,7 +1576,8 @@ static int pxa_camera_querycap(struct soc_camera_host *ici, | |||
1576 | { | 1576 | { |
1577 | /* cap->name is set by the firendly caller:-> */ | 1577 | /* cap->name is set by the firendly caller:-> */ |
1578 | strlcpy(cap->card, pxa_cam_driver_description, sizeof(cap->card)); | 1578 | strlcpy(cap->card, pxa_cam_driver_description, sizeof(cap->card)); |
1579 | cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; | 1579 | cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; |
1580 | cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS; | ||
1580 | 1581 | ||
1581 | return 0; | 1582 | return 0; |
1582 | } | 1583 | } |
diff --git a/drivers/media/platform/soc_camera/rcar_vin.c b/drivers/media/platform/soc_camera/rcar_vin.c index 0c1f55648106..9f1473c0a0cf 100644 --- a/drivers/media/platform/soc_camera/rcar_vin.c +++ b/drivers/media/platform/soc_camera/rcar_vin.c | |||
@@ -1799,7 +1799,9 @@ static int rcar_vin_querycap(struct soc_camera_host *ici, | |||
1799 | struct v4l2_capability *cap) | 1799 | struct v4l2_capability *cap) |
1800 | { | 1800 | { |
1801 | strlcpy(cap->card, "R_Car_VIN", sizeof(cap->card)); | 1801 | strlcpy(cap->card, "R_Car_VIN", sizeof(cap->card)); |
1802 | cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; | 1802 | cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; |
1803 | cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS; | ||
1804 | |||
1803 | return 0; | 1805 | return 0; |
1804 | } | 1806 | } |
1805 | 1807 | ||
diff --git a/drivers/media/platform/soc_camera/sh_mobile_ceu_camera.c b/drivers/media/platform/soc_camera/sh_mobile_ceu_camera.c index 8b27b3eb2b25..71787702d4a2 100644 --- a/drivers/media/platform/soc_camera/sh_mobile_ceu_camera.c +++ b/drivers/media/platform/soc_camera/sh_mobile_ceu_camera.c | |||
@@ -1652,7 +1652,9 @@ static int sh_mobile_ceu_querycap(struct soc_camera_host *ici, | |||
1652 | struct v4l2_capability *cap) | 1652 | struct v4l2_capability *cap) |
1653 | { | 1653 | { |
1654 | strlcpy(cap->card, "SuperH_Mobile_CEU", sizeof(cap->card)); | 1654 | strlcpy(cap->card, "SuperH_Mobile_CEU", sizeof(cap->card)); |
1655 | cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; | 1655 | cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; |
1656 | cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS; | ||
1657 | |||
1656 | return 0; | 1658 | return 0; |
1657 | } | 1659 | } |
1658 | 1660 | ||
diff --git a/drivers/media/usb/dvb-usb/cxusb.c b/drivers/media/usb/dvb-usb/cxusb.c index 0f345b1f9014..f327c49d7e09 100644 --- a/drivers/media/usb/dvb-usb/cxusb.c +++ b/drivers/media/usb/dvb-usb/cxusb.c | |||
@@ -2232,7 +2232,7 @@ static struct dvb_usb_device_properties cxusb_mygica_t230_properties = { | |||
2232 | { | 2232 | { |
2233 | "Mygica T230 DVB-T/T2/C", | 2233 | "Mygica T230 DVB-T/T2/C", |
2234 | { NULL }, | 2234 | { NULL }, |
2235 | { &cxusb_table[22], NULL }, | 2235 | { &cxusb_table[20], NULL }, |
2236 | }, | 2236 | }, |
2237 | } | 2237 | } |
2238 | }; | 2238 | }; |
diff --git a/drivers/media/usb/pvrusb2/pvrusb2-v4l2.c b/drivers/media/usb/pvrusb2/pvrusb2-v4l2.c index 1b158f1167ed..536210b39428 100644 --- a/drivers/media/usb/pvrusb2/pvrusb2-v4l2.c +++ b/drivers/media/usb/pvrusb2/pvrusb2-v4l2.c | |||
@@ -89,16 +89,6 @@ static int vbi_nr[PVR_NUM] = {[0 ... PVR_NUM-1] = -1}; | |||
89 | module_param_array(vbi_nr, int, NULL, 0444); | 89 | module_param_array(vbi_nr, int, NULL, 0444); |
90 | MODULE_PARM_DESC(vbi_nr, "Offset for device's vbi dev minor"); | 90 | MODULE_PARM_DESC(vbi_nr, "Offset for device's vbi dev minor"); |
91 | 91 | ||
92 | static struct v4l2_capability pvr_capability ={ | ||
93 | .driver = "pvrusb2", | ||
94 | .card = "Hauppauge WinTV pvr-usb2", | ||
95 | .bus_info = "usb", | ||
96 | .version = LINUX_VERSION_CODE, | ||
97 | .capabilities = (V4L2_CAP_VIDEO_CAPTURE | | ||
98 | V4L2_CAP_TUNER | V4L2_CAP_AUDIO | V4L2_CAP_RADIO | | ||
99 | V4L2_CAP_READWRITE), | ||
100 | }; | ||
101 | |||
102 | static struct v4l2_fmtdesc pvr_fmtdesc [] = { | 92 | static struct v4l2_fmtdesc pvr_fmtdesc [] = { |
103 | { | 93 | { |
104 | .index = 0, | 94 | .index = 0, |
@@ -160,10 +150,22 @@ static int pvr2_querycap(struct file *file, void *priv, struct v4l2_capability * | |||
160 | struct pvr2_v4l2_fh *fh = file->private_data; | 150 | struct pvr2_v4l2_fh *fh = file->private_data; |
161 | struct pvr2_hdw *hdw = fh->channel.mc_head->hdw; | 151 | struct pvr2_hdw *hdw = fh->channel.mc_head->hdw; |
162 | 152 | ||
163 | memcpy(cap, &pvr_capability, sizeof(struct v4l2_capability)); | 153 | strlcpy(cap->driver, "pvrusb2", sizeof(cap->driver)); |
164 | strlcpy(cap->bus_info, pvr2_hdw_get_bus_info(hdw), | 154 | strlcpy(cap->bus_info, pvr2_hdw_get_bus_info(hdw), |
165 | sizeof(cap->bus_info)); | 155 | sizeof(cap->bus_info)); |
166 | strlcpy(cap->card, pvr2_hdw_get_desc(hdw), sizeof(cap->card)); | 156 | strlcpy(cap->card, pvr2_hdw_get_desc(hdw), sizeof(cap->card)); |
157 | cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_TUNER | | ||
158 | V4L2_CAP_AUDIO | V4L2_CAP_RADIO | | ||
159 | V4L2_CAP_READWRITE | V4L2_CAP_DEVICE_CAPS; | ||
160 | switch (fh->pdi->devbase.vfl_type) { | ||
161 | case VFL_TYPE_GRABBER: | ||
162 | cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_AUDIO; | ||
163 | break; | ||
164 | case VFL_TYPE_RADIO: | ||
165 | cap->device_caps = V4L2_CAP_RADIO; | ||
166 | break; | ||
167 | } | ||
168 | cap->device_caps |= V4L2_CAP_TUNER | V4L2_CAP_READWRITE; | ||
167 | return 0; | 169 | return 0; |
168 | } | 170 | } |
169 | 171 | ||
diff --git a/drivers/media/v4l2-core/videobuf2-core.c b/drivers/media/v4l2-core/videobuf2-core.c index d09a8916e940..bc08a829bc13 100644 --- a/drivers/media/v4l2-core/videobuf2-core.c +++ b/drivers/media/v4l2-core/videobuf2-core.c | |||
@@ -3146,27 +3146,26 @@ static int vb2_thread(void *data) | |||
3146 | prequeue--; | 3146 | prequeue--; |
3147 | } else { | 3147 | } else { |
3148 | call_void_qop(q, wait_finish, q); | 3148 | call_void_qop(q, wait_finish, q); |
3149 | ret = vb2_internal_dqbuf(q, &fileio->b, 0); | 3149 | if (!threadio->stop) |
3150 | ret = vb2_internal_dqbuf(q, &fileio->b, 0); | ||
3150 | call_void_qop(q, wait_prepare, q); | 3151 | call_void_qop(q, wait_prepare, q); |
3151 | dprintk(5, "file io: vb2_dqbuf result: %d\n", ret); | 3152 | dprintk(5, "file io: vb2_dqbuf result: %d\n", ret); |
3152 | } | 3153 | } |
3153 | if (threadio->stop) | 3154 | if (ret || threadio->stop) |
3154 | break; | ||
3155 | if (ret) | ||
3156 | break; | 3155 | break; |
3157 | try_to_freeze(); | 3156 | try_to_freeze(); |
3158 | 3157 | ||
3159 | vb = q->bufs[fileio->b.index]; | 3158 | vb = q->bufs[fileio->b.index]; |
3160 | if (!(fileio->b.flags & V4L2_BUF_FLAG_ERROR)) | 3159 | if (!(fileio->b.flags & V4L2_BUF_FLAG_ERROR)) |
3161 | ret = threadio->fnc(vb, threadio->priv); | 3160 | if (threadio->fnc(vb, threadio->priv)) |
3162 | if (ret) | 3161 | break; |
3163 | break; | ||
3164 | call_void_qop(q, wait_finish, q); | 3162 | call_void_qop(q, wait_finish, q); |
3165 | if (set_timestamp) | 3163 | if (set_timestamp) |
3166 | v4l2_get_timestamp(&fileio->b.timestamp); | 3164 | v4l2_get_timestamp(&fileio->b.timestamp); |
3167 | ret = vb2_internal_qbuf(q, &fileio->b); | 3165 | if (!threadio->stop) |
3166 | ret = vb2_internal_qbuf(q, &fileio->b); | ||
3168 | call_void_qop(q, wait_prepare, q); | 3167 | call_void_qop(q, wait_prepare, q); |
3169 | if (ret) | 3168 | if (ret || threadio->stop) |
3170 | break; | 3169 | break; |
3171 | } | 3170 | } |
3172 | 3171 | ||
@@ -3235,11 +3234,11 @@ int vb2_thread_stop(struct vb2_queue *q) | |||
3235 | threadio->stop = true; | 3234 | threadio->stop = true; |
3236 | vb2_internal_streamoff(q, q->type); | 3235 | vb2_internal_streamoff(q, q->type); |
3237 | call_void_qop(q, wait_prepare, q); | 3236 | call_void_qop(q, wait_prepare, q); |
3237 | err = kthread_stop(threadio->thread); | ||
3238 | q->fileio = NULL; | 3238 | q->fileio = NULL; |
3239 | fileio->req.count = 0; | 3239 | fileio->req.count = 0; |
3240 | vb2_reqbufs(q, &fileio->req); | 3240 | vb2_reqbufs(q, &fileio->req); |
3241 | kfree(fileio); | 3241 | kfree(fileio); |
3242 | err = kthread_stop(threadio->thread); | ||
3243 | threadio->thread = NULL; | 3242 | threadio->thread = NULL; |
3244 | kfree(threadio); | 3243 | kfree(threadio); |
3245 | q->fileio = NULL; | 3244 | q->fileio = NULL; |
diff --git a/drivers/mfd/da9052-core.c b/drivers/mfd/da9052-core.c index 52a0c2f6264f..ae498b53ee40 100644 --- a/drivers/mfd/da9052-core.c +++ b/drivers/mfd/da9052-core.c | |||
@@ -554,7 +554,8 @@ int da9052_device_init(struct da9052 *da9052, u8 chip_id) | |||
554 | return ret; | 554 | return ret; |
555 | } | 555 | } |
556 | 556 | ||
557 | ret = mfd_add_devices(da9052->dev, -1, da9052_subdev_info, | 557 | ret = mfd_add_devices(da9052->dev, PLATFORM_DEVID_AUTO, |
558 | da9052_subdev_info, | ||
558 | ARRAY_SIZE(da9052_subdev_info), NULL, 0, NULL); | 559 | ARRAY_SIZE(da9052_subdev_info), NULL, 0, NULL); |
559 | if (ret) { | 560 | if (ret) { |
560 | dev_err(da9052->dev, "mfd_add_devices failed: %d\n", ret); | 561 | dev_err(da9052->dev, "mfd_add_devices failed: %d\n", ret); |
diff --git a/drivers/mfd/rtsx_usb.c b/drivers/mfd/rtsx_usb.c index dbdd0faeb6ce..210d1f85679e 100644 --- a/drivers/mfd/rtsx_usb.c +++ b/drivers/mfd/rtsx_usb.c | |||
@@ -681,21 +681,9 @@ static void rtsx_usb_disconnect(struct usb_interface *intf) | |||
681 | #ifdef CONFIG_PM | 681 | #ifdef CONFIG_PM |
682 | static int rtsx_usb_suspend(struct usb_interface *intf, pm_message_t message) | 682 | static int rtsx_usb_suspend(struct usb_interface *intf, pm_message_t message) |
683 | { | 683 | { |
684 | struct rtsx_ucr *ucr = | ||
685 | (struct rtsx_ucr *)usb_get_intfdata(intf); | ||
686 | |||
687 | dev_dbg(&intf->dev, "%s called with pm message 0x%04x\n", | 684 | dev_dbg(&intf->dev, "%s called with pm message 0x%04x\n", |
688 | __func__, message.event); | 685 | __func__, message.event); |
689 | 686 | ||
690 | /* | ||
691 | * Call to make sure LED is off during suspend to save more power. | ||
692 | * It is NOT a permanent state and could be turned on anytime later. | ||
693 | * Thus no need to call turn_on when resunming. | ||
694 | */ | ||
695 | mutex_lock(&ucr->dev_mutex); | ||
696 | rtsx_usb_turn_off_led(ucr); | ||
697 | mutex_unlock(&ucr->dev_mutex); | ||
698 | |||
699 | return 0; | 687 | return 0; |
700 | } | 688 | } |
701 | 689 | ||
diff --git a/drivers/mfd/tps65218.c b/drivers/mfd/tps65218.c index 0d256cb002eb..d6b764349f9d 100644 --- a/drivers/mfd/tps65218.c +++ b/drivers/mfd/tps65218.c | |||
@@ -125,10 +125,21 @@ int tps65218_clear_bits(struct tps65218 *tps, unsigned int reg, | |||
125 | } | 125 | } |
126 | EXPORT_SYMBOL_GPL(tps65218_clear_bits); | 126 | EXPORT_SYMBOL_GPL(tps65218_clear_bits); |
127 | 127 | ||
128 | static const struct regmap_range tps65218_yes_ranges[] = { | ||
129 | regmap_reg_range(TPS65218_REG_INT1, TPS65218_REG_INT2), | ||
130 | regmap_reg_range(TPS65218_REG_STATUS, TPS65218_REG_STATUS), | ||
131 | }; | ||
132 | |||
133 | static const struct regmap_access_table tps65218_volatile_table = { | ||
134 | .yes_ranges = tps65218_yes_ranges, | ||
135 | .n_yes_ranges = ARRAY_SIZE(tps65218_yes_ranges), | ||
136 | }; | ||
137 | |||
128 | static struct regmap_config tps65218_regmap_config = { | 138 | static struct regmap_config tps65218_regmap_config = { |
129 | .reg_bits = 8, | 139 | .reg_bits = 8, |
130 | .val_bits = 8, | 140 | .val_bits = 8, |
131 | .cache_type = REGCACHE_RBTREE, | 141 | .cache_type = REGCACHE_RBTREE, |
142 | .volatile_table = &tps65218_volatile_table, | ||
132 | }; | 143 | }; |
133 | 144 | ||
134 | static const struct regmap_irq tps65218_irqs[] = { | 145 | static const struct regmap_irq tps65218_irqs[] = { |
@@ -193,6 +204,7 @@ static struct regmap_irq_chip tps65218_irq_chip = { | |||
193 | 204 | ||
194 | .num_regs = 2, | 205 | .num_regs = 2, |
195 | .mask_base = TPS65218_REG_INT_MASK1, | 206 | .mask_base = TPS65218_REG_INT_MASK1, |
207 | .status_base = TPS65218_REG_INT1, | ||
196 | }; | 208 | }; |
197 | 209 | ||
198 | static const struct of_device_id of_tps65218_match_table[] = { | 210 | static const struct of_device_id of_tps65218_match_table[] = { |
diff --git a/drivers/misc/cxl/context.c b/drivers/misc/cxl/context.c index 51fd6b524371..d1b55fe62817 100644 --- a/drivers/misc/cxl/context.c +++ b/drivers/misc/cxl/context.c | |||
@@ -100,6 +100,46 @@ int cxl_context_init(struct cxl_context *ctx, struct cxl_afu *afu, bool master, | |||
100 | return 0; | 100 | return 0; |
101 | } | 101 | } |
102 | 102 | ||
103 | static int cxl_mmap_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | ||
104 | { | ||
105 | struct cxl_context *ctx = vma->vm_file->private_data; | ||
106 | unsigned long address = (unsigned long)vmf->virtual_address; | ||
107 | u64 area, offset; | ||
108 | |||
109 | offset = vmf->pgoff << PAGE_SHIFT; | ||
110 | |||
111 | pr_devel("%s: pe: %i address: 0x%lx offset: 0x%llx\n", | ||
112 | __func__, ctx->pe, address, offset); | ||
113 | |||
114 | if (ctx->afu->current_mode == CXL_MODE_DEDICATED) { | ||
115 | area = ctx->afu->psn_phys; | ||
116 | if (offset > ctx->afu->adapter->ps_size) | ||
117 | return VM_FAULT_SIGBUS; | ||
118 | } else { | ||
119 | area = ctx->psn_phys; | ||
120 | if (offset > ctx->psn_size) | ||
121 | return VM_FAULT_SIGBUS; | ||
122 | } | ||
123 | |||
124 | mutex_lock(&ctx->status_mutex); | ||
125 | |||
126 | if (ctx->status != STARTED) { | ||
127 | mutex_unlock(&ctx->status_mutex); | ||
128 | pr_devel("%s: Context not started, failing problem state access\n", __func__); | ||
129 | return VM_FAULT_SIGBUS; | ||
130 | } | ||
131 | |||
132 | vm_insert_pfn(vma, address, (area + offset) >> PAGE_SHIFT); | ||
133 | |||
134 | mutex_unlock(&ctx->status_mutex); | ||
135 | |||
136 | return VM_FAULT_NOPAGE; | ||
137 | } | ||
138 | |||
139 | static const struct vm_operations_struct cxl_mmap_vmops = { | ||
140 | .fault = cxl_mmap_fault, | ||
141 | }; | ||
142 | |||
103 | /* | 143 | /* |
104 | * Map a per-context mmio space into the given vma. | 144 | * Map a per-context mmio space into the given vma. |
105 | */ | 145 | */ |
@@ -108,26 +148,25 @@ int cxl_context_iomap(struct cxl_context *ctx, struct vm_area_struct *vma) | |||
108 | u64 len = vma->vm_end - vma->vm_start; | 148 | u64 len = vma->vm_end - vma->vm_start; |
109 | len = min(len, ctx->psn_size); | 149 | len = min(len, ctx->psn_size); |
110 | 150 | ||
111 | if (ctx->afu->current_mode == CXL_MODE_DEDICATED) { | 151 | if (ctx->afu->current_mode != CXL_MODE_DEDICATED) { |
112 | vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); | 152 | /* make sure there is a valid per process space for this AFU */ |
113 | return vm_iomap_memory(vma, ctx->afu->psn_phys, ctx->afu->adapter->ps_size); | 153 | if ((ctx->master && !ctx->afu->psa) || (!ctx->afu->pp_psa)) { |
114 | } | 154 | pr_devel("AFU doesn't support mmio space\n"); |
155 | return -EINVAL; | ||
156 | } | ||
115 | 157 | ||
116 | /* make sure there is a valid per process space for this AFU */ | 158 | /* Can't mmap until the AFU is enabled */ |
117 | if ((ctx->master && !ctx->afu->psa) || (!ctx->afu->pp_psa)) { | 159 | if (!ctx->afu->enabled) |
118 | pr_devel("AFU doesn't support mmio space\n"); | 160 | return -EBUSY; |
119 | return -EINVAL; | ||
120 | } | 161 | } |
121 | 162 | ||
122 | /* Can't mmap until the AFU is enabled */ | ||
123 | if (!ctx->afu->enabled) | ||
124 | return -EBUSY; | ||
125 | |||
126 | pr_devel("%s: mmio physical: %llx pe: %i master:%i\n", __func__, | 163 | pr_devel("%s: mmio physical: %llx pe: %i master:%i\n", __func__, |
127 | ctx->psn_phys, ctx->pe , ctx->master); | 164 | ctx->psn_phys, ctx->pe , ctx->master); |
128 | 165 | ||
166 | vma->vm_flags |= VM_IO | VM_PFNMAP; | ||
129 | vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); | 167 | vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); |
130 | return vm_iomap_memory(vma, ctx->psn_phys, len); | 168 | vma->vm_ops = &cxl_mmap_vmops; |
169 | return 0; | ||
131 | } | 170 | } |
132 | 171 | ||
133 | /* | 172 | /* |
@@ -150,12 +189,6 @@ static void __detach_context(struct cxl_context *ctx) | |||
150 | afu_release_irqs(ctx); | 189 | afu_release_irqs(ctx); |
151 | flush_work(&ctx->fault_work); /* Only needed for dedicated process */ | 190 | flush_work(&ctx->fault_work); /* Only needed for dedicated process */ |
152 | wake_up_all(&ctx->wq); | 191 | wake_up_all(&ctx->wq); |
153 | |||
154 | /* Release Problem State Area mapping */ | ||
155 | mutex_lock(&ctx->mapping_lock); | ||
156 | if (ctx->mapping) | ||
157 | unmap_mapping_range(ctx->mapping, 0, 0, 1); | ||
158 | mutex_unlock(&ctx->mapping_lock); | ||
159 | } | 192 | } |
160 | 193 | ||
161 | /* | 194 | /* |
@@ -184,6 +217,17 @@ void cxl_context_detach_all(struct cxl_afu *afu) | |||
184 | * created and torn down after the IDR removed | 217 | * created and torn down after the IDR removed |
185 | */ | 218 | */ |
186 | __detach_context(ctx); | 219 | __detach_context(ctx); |
220 | |||
221 | /* | ||
222 | * We are force detaching - remove any active PSA mappings so | ||
223 | * userspace cannot interfere with the card if it comes back. | ||
224 | * Easiest way to exercise this is to unbind and rebind the | ||
225 | * driver via sysfs while it is in use. | ||
226 | */ | ||
227 | mutex_lock(&ctx->mapping_lock); | ||
228 | if (ctx->mapping) | ||
229 | unmap_mapping_range(ctx->mapping, 0, 0, 1); | ||
230 | mutex_unlock(&ctx->mapping_lock); | ||
187 | } | 231 | } |
188 | mutex_unlock(&afu->contexts_lock); | 232 | mutex_unlock(&afu->contexts_lock); |
189 | } | 233 | } |
diff --git a/drivers/misc/cxl/file.c b/drivers/misc/cxl/file.c index e9f2f10dbb37..b15d8113877c 100644 --- a/drivers/misc/cxl/file.c +++ b/drivers/misc/cxl/file.c | |||
@@ -140,18 +140,20 @@ static long afu_ioctl_start_work(struct cxl_context *ctx, | |||
140 | 140 | ||
141 | pr_devel("%s: pe: %i\n", __func__, ctx->pe); | 141 | pr_devel("%s: pe: %i\n", __func__, ctx->pe); |
142 | 142 | ||
143 | mutex_lock(&ctx->status_mutex); | 143 | /* Do this outside the status_mutex to avoid a circular dependency with |
144 | if (ctx->status != OPENED) { | 144 | * the locking in cxl_mmap_fault() */ |
145 | rc = -EIO; | ||
146 | goto out; | ||
147 | } | ||
148 | |||
149 | if (copy_from_user(&work, uwork, | 145 | if (copy_from_user(&work, uwork, |
150 | sizeof(struct cxl_ioctl_start_work))) { | 146 | sizeof(struct cxl_ioctl_start_work))) { |
151 | rc = -EFAULT; | 147 | rc = -EFAULT; |
152 | goto out; | 148 | goto out; |
153 | } | 149 | } |
154 | 150 | ||
151 | mutex_lock(&ctx->status_mutex); | ||
152 | if (ctx->status != OPENED) { | ||
153 | rc = -EIO; | ||
154 | goto out; | ||
155 | } | ||
156 | |||
155 | /* | 157 | /* |
156 | * if any of the reserved fields are set or any of the unused | 158 | * if any of the reserved fields are set or any of the unused |
157 | * flags are set it's invalid | 159 | * flags are set it's invalid |
diff --git a/drivers/misc/mei/hw-me.c b/drivers/misc/mei/hw-me.c index ff2755062b44..06ff0a2ec960 100644 --- a/drivers/misc/mei/hw-me.c +++ b/drivers/misc/mei/hw-me.c | |||
@@ -234,6 +234,18 @@ static int mei_me_hw_reset(struct mei_device *dev, bool intr_enable) | |||
234 | struct mei_me_hw *hw = to_me_hw(dev); | 234 | struct mei_me_hw *hw = to_me_hw(dev); |
235 | u32 hcsr = mei_hcsr_read(hw); | 235 | u32 hcsr = mei_hcsr_read(hw); |
236 | 236 | ||
237 | /* H_RST may be found lit before reset is started, | ||
238 | * for example if preceding reset flow hasn't completed. | ||
239 | * In that case asserting H_RST will be ignored, therefore | ||
240 | * we need to clean H_RST bit to start a successful reset sequence. | ||
241 | */ | ||
242 | if ((hcsr & H_RST) == H_RST) { | ||
243 | dev_warn(dev->dev, "H_RST is set = 0x%08X", hcsr); | ||
244 | hcsr &= ~H_RST; | ||
245 | mei_me_reg_write(hw, H_CSR, hcsr); | ||
246 | hcsr = mei_hcsr_read(hw); | ||
247 | } | ||
248 | |||
237 | hcsr |= H_RST | H_IG | H_IS; | 249 | hcsr |= H_RST | H_IG | H_IS; |
238 | 250 | ||
239 | if (intr_enable) | 251 | if (intr_enable) |
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index 1453cd127921..f1a488ee432f 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c | |||
@@ -1271,6 +1271,12 @@ static void sdhci_set_power(struct sdhci_host *host, unsigned char mode, | |||
1271 | spin_unlock_irq(&host->lock); | 1271 | spin_unlock_irq(&host->lock); |
1272 | mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, vdd); | 1272 | mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, vdd); |
1273 | spin_lock_irq(&host->lock); | 1273 | spin_lock_irq(&host->lock); |
1274 | |||
1275 | if (mode != MMC_POWER_OFF) | ||
1276 | sdhci_writeb(host, SDHCI_POWER_ON, SDHCI_POWER_CONTROL); | ||
1277 | else | ||
1278 | sdhci_writeb(host, 0, SDHCI_POWER_CONTROL); | ||
1279 | |||
1274 | return; | 1280 | return; |
1275 | } | 1281 | } |
1276 | 1282 | ||
diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c index 70f77e96d409..041525d2595c 100644 --- a/drivers/net/can/c_can/c_can.c +++ b/drivers/net/can/c_can/c_can.c | |||
@@ -615,6 +615,9 @@ static void c_can_stop(struct net_device *dev) | |||
615 | 615 | ||
616 | c_can_irq_control(priv, false); | 616 | c_can_irq_control(priv, false); |
617 | 617 | ||
618 | /* put ctrl to init on stop to end ongoing transmission */ | ||
619 | priv->write_reg(priv, C_CAN_CTRL_REG, CONTROL_INIT); | ||
620 | |||
618 | /* deactivate pins */ | 621 | /* deactivate pins */ |
619 | pinctrl_pm_select_sleep_state(dev->dev.parent); | 622 | pinctrl_pm_select_sleep_state(dev->dev.parent); |
620 | priv->can.state = CAN_STATE_STOPPED; | 623 | priv->can.state = CAN_STATE_STOPPED; |
diff --git a/drivers/net/can/c_can/c_can_platform.c b/drivers/net/can/c_can/c_can_platform.c index f363972cd77d..e36d10520e24 100644 --- a/drivers/net/can/c_can/c_can_platform.c +++ b/drivers/net/can/c_can/c_can_platform.c | |||
@@ -103,27 +103,34 @@ static void c_can_hw_raminit_syscon(const struct c_can_priv *priv, bool enable) | |||
103 | mask = 1 << raminit->bits.start | 1 << raminit->bits.done; | 103 | mask = 1 << raminit->bits.start | 1 << raminit->bits.done; |
104 | regmap_read(raminit->syscon, raminit->reg, &ctrl); | 104 | regmap_read(raminit->syscon, raminit->reg, &ctrl); |
105 | 105 | ||
106 | /* We clear the done and start bit first. The start bit is | 106 | /* We clear the start bit first. The start bit is |
107 | * looking at the 0 -> transition, but is not self clearing; | 107 | * looking at the 0 -> transition, but is not self clearing; |
108 | * And we clear the init done bit as well. | ||
109 | * NOTE: DONE must be written with 1 to clear it. | 108 | * NOTE: DONE must be written with 1 to clear it. |
109 | * We can't clear the DONE bit here using regmap_update_bits() | ||
110 | * as it will bypass the write if initial condition is START:0 DONE:1 | ||
111 | * e.g. on DRA7 which needs START pulse. | ||
110 | */ | 112 | */ |
111 | ctrl &= ~(1 << raminit->bits.start); | 113 | ctrl &= ~mask; /* START = 0, DONE = 0 */ |
112 | ctrl |= 1 << raminit->bits.done; | 114 | regmap_update_bits(raminit->syscon, raminit->reg, mask, ctrl); |
113 | regmap_write(raminit->syscon, raminit->reg, ctrl); | ||
114 | 115 | ||
115 | ctrl &= ~(1 << raminit->bits.done); | 116 | /* check if START bit is 0. Ignore DONE bit for now |
116 | c_can_hw_raminit_wait_syscon(priv, mask, ctrl); | 117 | * as it can be either 0 or 1. |
118 | */ | ||
119 | c_can_hw_raminit_wait_syscon(priv, 1 << raminit->bits.start, ctrl); | ||
117 | 120 | ||
118 | if (enable) { | 121 | if (enable) { |
119 | /* Set start bit and wait for the done bit. */ | 122 | /* Clear DONE bit & set START bit. */ |
120 | ctrl |= 1 << raminit->bits.start; | 123 | ctrl |= 1 << raminit->bits.start; |
121 | regmap_write(raminit->syscon, raminit->reg, ctrl); | 124 | /* DONE must be written with 1 to clear it */ |
122 | 125 | ctrl |= 1 << raminit->bits.done; | |
126 | regmap_update_bits(raminit->syscon, raminit->reg, mask, ctrl); | ||
127 | /* prevent further clearing of DONE bit */ | ||
128 | ctrl &= ~(1 << raminit->bits.done); | ||
123 | /* clear START bit if start pulse is needed */ | 129 | /* clear START bit if start pulse is needed */ |
124 | if (raminit->needs_pulse) { | 130 | if (raminit->needs_pulse) { |
125 | ctrl &= ~(1 << raminit->bits.start); | 131 | ctrl &= ~(1 << raminit->bits.start); |
126 | regmap_write(raminit->syscon, raminit->reg, ctrl); | 132 | regmap_update_bits(raminit->syscon, raminit->reg, |
133 | mask, ctrl); | ||
127 | } | 134 | } |
128 | 135 | ||
129 | ctrl |= 1 << raminit->bits.done; | 136 | ctrl |= 1 << raminit->bits.done; |
diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c index 6ac02c8d747e..3c82e02e3dae 100644 --- a/drivers/net/can/dev.c +++ b/drivers/net/can/dev.c | |||
@@ -808,10 +808,14 @@ static int can_changelink(struct net_device *dev, | |||
808 | if (dev->flags & IFF_UP) | 808 | if (dev->flags & IFF_UP) |
809 | return -EBUSY; | 809 | return -EBUSY; |
810 | cm = nla_data(data[IFLA_CAN_CTRLMODE]); | 810 | cm = nla_data(data[IFLA_CAN_CTRLMODE]); |
811 | if (cm->flags & ~priv->ctrlmode_supported) | 811 | |
812 | /* check whether changed bits are allowed to be modified */ | ||
813 | if (cm->mask & ~priv->ctrlmode_supported) | ||
812 | return -EOPNOTSUPP; | 814 | return -EOPNOTSUPP; |
815 | |||
816 | /* clear bits to be modified and copy the flag values */ | ||
813 | priv->ctrlmode &= ~cm->mask; | 817 | priv->ctrlmode &= ~cm->mask; |
814 | priv->ctrlmode |= cm->flags; | 818 | priv->ctrlmode |= (cm->flags & cm->mask); |
815 | 819 | ||
816 | /* CAN_CTRLMODE_FD can only be set when driver supports FD */ | 820 | /* CAN_CTRLMODE_FD can only be set when driver supports FD */ |
817 | if (priv->ctrlmode & CAN_CTRLMODE_FD) | 821 | if (priv->ctrlmode & CAN_CTRLMODE_FD) |
diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c index b2ecb6c5e94b..2e04b3aeeb37 100644 --- a/drivers/net/can/m_can/m_can.c +++ b/drivers/net/can/m_can/m_can.c | |||
@@ -956,6 +956,11 @@ static struct net_device *alloc_m_can_dev(void) | |||
956 | priv->can.data_bittiming_const = &m_can_data_bittiming_const; | 956 | priv->can.data_bittiming_const = &m_can_data_bittiming_const; |
957 | priv->can.do_set_mode = m_can_set_mode; | 957 | priv->can.do_set_mode = m_can_set_mode; |
958 | priv->can.do_get_berr_counter = m_can_get_berr_counter; | 958 | priv->can.do_get_berr_counter = m_can_get_berr_counter; |
959 | |||
960 | /* CAN_CTRLMODE_FD_NON_ISO is fixed with M_CAN IP v3.0.1 */ | ||
961 | priv->can.ctrlmode = CAN_CTRLMODE_FD_NON_ISO; | ||
962 | |||
963 | /* CAN_CTRLMODE_FD_NON_ISO can not be changed with M_CAN IP v3.0.1 */ | ||
959 | priv->can.ctrlmode_supported = CAN_CTRLMODE_LOOPBACK | | 964 | priv->can.ctrlmode_supported = CAN_CTRLMODE_LOOPBACK | |
960 | CAN_CTRLMODE_LISTENONLY | | 965 | CAN_CTRLMODE_LISTENONLY | |
961 | CAN_CTRLMODE_BERR_REPORTING | | 966 | CAN_CTRLMODE_BERR_REPORTING | |
diff --git a/drivers/net/can/usb/kvaser_usb.c b/drivers/net/can/usb/kvaser_usb.c index 541fb7a05625..7af379ca861b 100644 --- a/drivers/net/can/usb/kvaser_usb.c +++ b/drivers/net/can/usb/kvaser_usb.c | |||
@@ -520,10 +520,10 @@ static void kvaser_usb_tx_acknowledge(const struct kvaser_usb *dev, | |||
520 | skb = alloc_can_err_skb(priv->netdev, &cf); | 520 | skb = alloc_can_err_skb(priv->netdev, &cf); |
521 | if (skb) { | 521 | if (skb) { |
522 | cf->can_id |= CAN_ERR_RESTARTED; | 522 | cf->can_id |= CAN_ERR_RESTARTED; |
523 | netif_rx(skb); | ||
524 | 523 | ||
525 | stats->rx_packets++; | 524 | stats->rx_packets++; |
526 | stats->rx_bytes += cf->can_dlc; | 525 | stats->rx_bytes += cf->can_dlc; |
526 | netif_rx(skb); | ||
527 | } else { | 527 | } else { |
528 | netdev_err(priv->netdev, | 528 | netdev_err(priv->netdev, |
529 | "No memory left for err_skb\n"); | 529 | "No memory left for err_skb\n"); |
@@ -587,7 +587,7 @@ static int kvaser_usb_simple_msg_async(struct kvaser_usb_net_priv *priv, | |||
587 | usb_sndbulkpipe(dev->udev, | 587 | usb_sndbulkpipe(dev->udev, |
588 | dev->bulk_out->bEndpointAddress), | 588 | dev->bulk_out->bEndpointAddress), |
589 | buf, msg->len, | 589 | buf, msg->len, |
590 | kvaser_usb_simple_msg_callback, priv); | 590 | kvaser_usb_simple_msg_callback, netdev); |
591 | usb_anchor_urb(urb, &priv->tx_submitted); | 591 | usb_anchor_urb(urb, &priv->tx_submitted); |
592 | 592 | ||
593 | err = usb_submit_urb(urb, GFP_ATOMIC); | 593 | err = usb_submit_urb(urb, GFP_ATOMIC); |
@@ -662,11 +662,6 @@ static void kvaser_usb_rx_error(const struct kvaser_usb *dev, | |||
662 | priv = dev->nets[channel]; | 662 | priv = dev->nets[channel]; |
663 | stats = &priv->netdev->stats; | 663 | stats = &priv->netdev->stats; |
664 | 664 | ||
665 | if (status & M16C_STATE_BUS_RESET) { | ||
666 | kvaser_usb_unlink_tx_urbs(priv); | ||
667 | return; | ||
668 | } | ||
669 | |||
670 | skb = alloc_can_err_skb(priv->netdev, &cf); | 665 | skb = alloc_can_err_skb(priv->netdev, &cf); |
671 | if (!skb) { | 666 | if (!skb) { |
672 | stats->rx_dropped++; | 667 | stats->rx_dropped++; |
@@ -677,7 +672,7 @@ static void kvaser_usb_rx_error(const struct kvaser_usb *dev, | |||
677 | 672 | ||
678 | netdev_dbg(priv->netdev, "Error status: 0x%02x\n", status); | 673 | netdev_dbg(priv->netdev, "Error status: 0x%02x\n", status); |
679 | 674 | ||
680 | if (status & M16C_STATE_BUS_OFF) { | 675 | if (status & (M16C_STATE_BUS_OFF | M16C_STATE_BUS_RESET)) { |
681 | cf->can_id |= CAN_ERR_BUSOFF; | 676 | cf->can_id |= CAN_ERR_BUSOFF; |
682 | 677 | ||
683 | priv->can.can_stats.bus_off++; | 678 | priv->can.can_stats.bus_off++; |
@@ -703,9 +698,7 @@ static void kvaser_usb_rx_error(const struct kvaser_usb *dev, | |||
703 | } | 698 | } |
704 | 699 | ||
705 | new_state = CAN_STATE_ERROR_PASSIVE; | 700 | new_state = CAN_STATE_ERROR_PASSIVE; |
706 | } | 701 | } else if (status & M16C_STATE_BUS_ERROR) { |
707 | |||
708 | if (status == M16C_STATE_BUS_ERROR) { | ||
709 | if ((priv->can.state < CAN_STATE_ERROR_WARNING) && | 702 | if ((priv->can.state < CAN_STATE_ERROR_WARNING) && |
710 | ((txerr >= 96) || (rxerr >= 96))) { | 703 | ((txerr >= 96) || (rxerr >= 96))) { |
711 | cf->can_id |= CAN_ERR_CRTL; | 704 | cf->can_id |= CAN_ERR_CRTL; |
@@ -715,7 +708,8 @@ static void kvaser_usb_rx_error(const struct kvaser_usb *dev, | |||
715 | 708 | ||
716 | priv->can.can_stats.error_warning++; | 709 | priv->can.can_stats.error_warning++; |
717 | new_state = CAN_STATE_ERROR_WARNING; | 710 | new_state = CAN_STATE_ERROR_WARNING; |
718 | } else if (priv->can.state > CAN_STATE_ERROR_ACTIVE) { | 711 | } else if ((priv->can.state > CAN_STATE_ERROR_ACTIVE) && |
712 | ((txerr < 96) && (rxerr < 96))) { | ||
719 | cf->can_id |= CAN_ERR_PROT; | 713 | cf->can_id |= CAN_ERR_PROT; |
720 | cf->data[2] = CAN_ERR_PROT_ACTIVE; | 714 | cf->data[2] = CAN_ERR_PROT_ACTIVE; |
721 | 715 | ||
@@ -770,10 +764,9 @@ static void kvaser_usb_rx_error(const struct kvaser_usb *dev, | |||
770 | 764 | ||
771 | priv->can.state = new_state; | 765 | priv->can.state = new_state; |
772 | 766 | ||
773 | netif_rx(skb); | ||
774 | |||
775 | stats->rx_packets++; | 767 | stats->rx_packets++; |
776 | stats->rx_bytes += cf->can_dlc; | 768 | stats->rx_bytes += cf->can_dlc; |
769 | netif_rx(skb); | ||
777 | } | 770 | } |
778 | 771 | ||
779 | static void kvaser_usb_rx_can_err(const struct kvaser_usb_net_priv *priv, | 772 | static void kvaser_usb_rx_can_err(const struct kvaser_usb_net_priv *priv, |
@@ -805,10 +798,9 @@ static void kvaser_usb_rx_can_err(const struct kvaser_usb_net_priv *priv, | |||
805 | stats->rx_over_errors++; | 798 | stats->rx_over_errors++; |
806 | stats->rx_errors++; | 799 | stats->rx_errors++; |
807 | 800 | ||
808 | netif_rx(skb); | ||
809 | |||
810 | stats->rx_packets++; | 801 | stats->rx_packets++; |
811 | stats->rx_bytes += cf->can_dlc; | 802 | stats->rx_bytes += cf->can_dlc; |
803 | netif_rx(skb); | ||
812 | } | 804 | } |
813 | } | 805 | } |
814 | 806 | ||
@@ -887,10 +879,9 @@ static void kvaser_usb_rx_can_msg(const struct kvaser_usb *dev, | |||
887 | cf->can_dlc); | 879 | cf->can_dlc); |
888 | } | 880 | } |
889 | 881 | ||
890 | netif_rx(skb); | ||
891 | |||
892 | stats->rx_packets++; | 882 | stats->rx_packets++; |
893 | stats->rx_bytes += cf->can_dlc; | 883 | stats->rx_bytes += cf->can_dlc; |
884 | netif_rx(skb); | ||
894 | } | 885 | } |
895 | 886 | ||
896 | static void kvaser_usb_start_chip_reply(const struct kvaser_usb *dev, | 887 | static void kvaser_usb_start_chip_reply(const struct kvaser_usb *dev, |
@@ -1246,6 +1237,9 @@ static int kvaser_usb_close(struct net_device *netdev) | |||
1246 | if (err) | 1237 | if (err) |
1247 | netdev_warn(netdev, "Cannot stop device, error %d\n", err); | 1238 | netdev_warn(netdev, "Cannot stop device, error %d\n", err); |
1248 | 1239 | ||
1240 | /* reset tx contexts */ | ||
1241 | kvaser_usb_unlink_tx_urbs(priv); | ||
1242 | |||
1249 | priv->can.state = CAN_STATE_STOPPED; | 1243 | priv->can.state = CAN_STATE_STOPPED; |
1250 | close_candev(priv->netdev); | 1244 | close_candev(priv->netdev); |
1251 | 1245 | ||
@@ -1294,12 +1288,14 @@ static netdev_tx_t kvaser_usb_start_xmit(struct sk_buff *skb, | |||
1294 | if (!urb) { | 1288 | if (!urb) { |
1295 | netdev_err(netdev, "No memory left for URBs\n"); | 1289 | netdev_err(netdev, "No memory left for URBs\n"); |
1296 | stats->tx_dropped++; | 1290 | stats->tx_dropped++; |
1297 | goto nourbmem; | 1291 | dev_kfree_skb(skb); |
1292 | return NETDEV_TX_OK; | ||
1298 | } | 1293 | } |
1299 | 1294 | ||
1300 | buf = kmalloc(sizeof(struct kvaser_msg), GFP_ATOMIC); | 1295 | buf = kmalloc(sizeof(struct kvaser_msg), GFP_ATOMIC); |
1301 | if (!buf) { | 1296 | if (!buf) { |
1302 | stats->tx_dropped++; | 1297 | stats->tx_dropped++; |
1298 | dev_kfree_skb(skb); | ||
1303 | goto nobufmem; | 1299 | goto nobufmem; |
1304 | } | 1300 | } |
1305 | 1301 | ||
@@ -1334,6 +1330,7 @@ static netdev_tx_t kvaser_usb_start_xmit(struct sk_buff *skb, | |||
1334 | } | 1330 | } |
1335 | } | 1331 | } |
1336 | 1332 | ||
1333 | /* This should never happen; it implies a flow control bug */ | ||
1337 | if (!context) { | 1334 | if (!context) { |
1338 | netdev_warn(netdev, "cannot find free context\n"); | 1335 | netdev_warn(netdev, "cannot find free context\n"); |
1339 | ret = NETDEV_TX_BUSY; | 1336 | ret = NETDEV_TX_BUSY; |
@@ -1364,9 +1361,6 @@ static netdev_tx_t kvaser_usb_start_xmit(struct sk_buff *skb, | |||
1364 | if (unlikely(err)) { | 1361 | if (unlikely(err)) { |
1365 | can_free_echo_skb(netdev, context->echo_index); | 1362 | can_free_echo_skb(netdev, context->echo_index); |
1366 | 1363 | ||
1367 | skb = NULL; /* set to NULL to avoid double free in | ||
1368 | * dev_kfree_skb(skb) */ | ||
1369 | |||
1370 | atomic_dec(&priv->active_tx_urbs); | 1364 | atomic_dec(&priv->active_tx_urbs); |
1371 | usb_unanchor_urb(urb); | 1365 | usb_unanchor_urb(urb); |
1372 | 1366 | ||
@@ -1388,8 +1382,6 @@ releasebuf: | |||
1388 | kfree(buf); | 1382 | kfree(buf); |
1389 | nobufmem: | 1383 | nobufmem: |
1390 | usb_free_urb(urb); | 1384 | usb_free_urb(urb); |
1391 | nourbmem: | ||
1392 | dev_kfree_skb(skb); | ||
1393 | return ret; | 1385 | return ret; |
1394 | } | 1386 | } |
1395 | 1387 | ||
@@ -1502,6 +1494,10 @@ static int kvaser_usb_init_one(struct usb_interface *intf, | |||
1502 | struct kvaser_usb_net_priv *priv; | 1494 | struct kvaser_usb_net_priv *priv; |
1503 | int i, err; | 1495 | int i, err; |
1504 | 1496 | ||
1497 | err = kvaser_usb_send_simple_msg(dev, CMD_RESET_CHIP, channel); | ||
1498 | if (err) | ||
1499 | return err; | ||
1500 | |||
1505 | netdev = alloc_candev(sizeof(*priv), MAX_TX_URBS); | 1501 | netdev = alloc_candev(sizeof(*priv), MAX_TX_URBS); |
1506 | if (!netdev) { | 1502 | if (!netdev) { |
1507 | dev_err(&intf->dev, "Cannot alloc candev\n"); | 1503 | dev_err(&intf->dev, "Cannot alloc candev\n"); |
@@ -1588,7 +1584,7 @@ static int kvaser_usb_probe(struct usb_interface *intf, | |||
1588 | { | 1584 | { |
1589 | struct kvaser_usb *dev; | 1585 | struct kvaser_usb *dev; |
1590 | int err = -ENOMEM; | 1586 | int err = -ENOMEM; |
1591 | int i; | 1587 | int i, retry = 3; |
1592 | 1588 | ||
1593 | dev = devm_kzalloc(&intf->dev, sizeof(*dev), GFP_KERNEL); | 1589 | dev = devm_kzalloc(&intf->dev, sizeof(*dev), GFP_KERNEL); |
1594 | if (!dev) | 1590 | if (!dev) |
@@ -1606,10 +1602,15 @@ static int kvaser_usb_probe(struct usb_interface *intf, | |||
1606 | 1602 | ||
1607 | usb_set_intfdata(intf, dev); | 1603 | usb_set_intfdata(intf, dev); |
1608 | 1604 | ||
1609 | for (i = 0; i < MAX_NET_DEVICES; i++) | 1605 | /* On some x86 laptops, plugging a Kvaser device again after |
1610 | kvaser_usb_send_simple_msg(dev, CMD_RESET_CHIP, i); | 1606 | * an unplug makes the firmware always ignore the very first |
1607 | * command. For such a case, provide some room for retries | ||
1608 | * instead of completely exiting the driver. | ||
1609 | */ | ||
1610 | do { | ||
1611 | err = kvaser_usb_get_software_info(dev); | ||
1612 | } while (--retry && err == -ETIMEDOUT); | ||
1611 | 1613 | ||
1612 | err = kvaser_usb_get_software_info(dev); | ||
1613 | if (err) { | 1614 | if (err) { |
1614 | dev_err(&intf->dev, | 1615 | dev_err(&intf->dev, |
1615 | "Cannot get software infos, error %d\n", err); | 1616 | "Cannot get software infos, error %d\n", err); |
diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-common.h b/drivers/net/ethernet/amd/xgbe/xgbe-common.h index 75b08c63d39f..29a09271b64a 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-common.h +++ b/drivers/net/ethernet/amd/xgbe/xgbe-common.h | |||
@@ -767,16 +767,17 @@ | |||
767 | #define MTL_Q_RQOMR 0x40 | 767 | #define MTL_Q_RQOMR 0x40 |
768 | #define MTL_Q_RQMPOCR 0x44 | 768 | #define MTL_Q_RQMPOCR 0x44 |
769 | #define MTL_Q_RQDR 0x4c | 769 | #define MTL_Q_RQDR 0x4c |
770 | #define MTL_Q_RQFCR 0x50 | ||
770 | #define MTL_Q_IER 0x70 | 771 | #define MTL_Q_IER 0x70 |
771 | #define MTL_Q_ISR 0x74 | 772 | #define MTL_Q_ISR 0x74 |
772 | 773 | ||
773 | /* MTL queue register entry bit positions and sizes */ | 774 | /* MTL queue register entry bit positions and sizes */ |
775 | #define MTL_Q_RQFCR_RFA_INDEX 1 | ||
776 | #define MTL_Q_RQFCR_RFA_WIDTH 6 | ||
777 | #define MTL_Q_RQFCR_RFD_INDEX 17 | ||
778 | #define MTL_Q_RQFCR_RFD_WIDTH 6 | ||
774 | #define MTL_Q_RQOMR_EHFC_INDEX 7 | 779 | #define MTL_Q_RQOMR_EHFC_INDEX 7 |
775 | #define MTL_Q_RQOMR_EHFC_WIDTH 1 | 780 | #define MTL_Q_RQOMR_EHFC_WIDTH 1 |
776 | #define MTL_Q_RQOMR_RFA_INDEX 8 | ||
777 | #define MTL_Q_RQOMR_RFA_WIDTH 3 | ||
778 | #define MTL_Q_RQOMR_RFD_INDEX 13 | ||
779 | #define MTL_Q_RQOMR_RFD_WIDTH 3 | ||
780 | #define MTL_Q_RQOMR_RQS_INDEX 16 | 781 | #define MTL_Q_RQOMR_RQS_INDEX 16 |
781 | #define MTL_Q_RQOMR_RQS_WIDTH 9 | 782 | #define MTL_Q_RQOMR_RQS_WIDTH 9 |
782 | #define MTL_Q_RQOMR_RSF_INDEX 5 | 783 | #define MTL_Q_RQOMR_RSF_INDEX 5 |
diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-dev.c b/drivers/net/ethernet/amd/xgbe/xgbe-dev.c index da593c42d183..400757b49872 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-dev.c +++ b/drivers/net/ethernet/amd/xgbe/xgbe-dev.c | |||
@@ -2107,10 +2107,10 @@ static void xgbe_config_flow_control_threshold(struct xgbe_prv_data *pdata) | |||
2107 | 2107 | ||
2108 | for (i = 0; i < pdata->rx_q_count; i++) { | 2108 | for (i = 0; i < pdata->rx_q_count; i++) { |
2109 | /* Activate flow control when less than 4k left in fifo */ | 2109 | /* Activate flow control when less than 4k left in fifo */ |
2110 | XGMAC_MTL_IOWRITE_BITS(pdata, i, MTL_Q_RQOMR, RFA, 2); | 2110 | XGMAC_MTL_IOWRITE_BITS(pdata, i, MTL_Q_RQFCR, RFA, 2); |
2111 | 2111 | ||
2112 | /* De-activate flow control when more than 6k left in fifo */ | 2112 | /* De-activate flow control when more than 6k left in fifo */ |
2113 | XGMAC_MTL_IOWRITE_BITS(pdata, i, MTL_Q_RQOMR, RFD, 4); | 2113 | XGMAC_MTL_IOWRITE_BITS(pdata, i, MTL_Q_RQFCR, RFD, 4); |
2114 | } | 2114 | } |
2115 | } | 2115 | } |
2116 | 2116 | ||
diff --git a/drivers/net/ethernet/broadcom/bgmac.c b/drivers/net/ethernet/broadcom/bgmac.c index 05c6af6c418f..3007d95fbb9f 100644 --- a/drivers/net/ethernet/broadcom/bgmac.c +++ b/drivers/net/ethernet/broadcom/bgmac.c | |||
@@ -1167,10 +1167,10 @@ static int bgmac_poll(struct napi_struct *napi, int weight) | |||
1167 | bgmac->int_status = 0; | 1167 | bgmac->int_status = 0; |
1168 | } | 1168 | } |
1169 | 1169 | ||
1170 | if (handled < weight) | 1170 | if (handled < weight) { |
1171 | napi_complete(napi); | 1171 | napi_complete(napi); |
1172 | 1172 | bgmac_chip_intrs_on(bgmac); | |
1173 | bgmac_chip_intrs_on(bgmac); | 1173 | } |
1174 | 1174 | ||
1175 | return handled; | 1175 | return handled; |
1176 | } | 1176 | } |
@@ -1515,6 +1515,8 @@ static int bgmac_probe(struct bcma_device *core) | |||
1515 | if (core->bus->sprom.boardflags_lo & BGMAC_BFL_ENETADM) | 1515 | if (core->bus->sprom.boardflags_lo & BGMAC_BFL_ENETADM) |
1516 | bgmac_warn(bgmac, "Support for ADMtek ethernet switch not implemented\n"); | 1516 | bgmac_warn(bgmac, "Support for ADMtek ethernet switch not implemented\n"); |
1517 | 1517 | ||
1518 | netif_napi_add(net_dev, &bgmac->napi, bgmac_poll, BGMAC_WEIGHT); | ||
1519 | |||
1518 | err = bgmac_mii_register(bgmac); | 1520 | err = bgmac_mii_register(bgmac); |
1519 | if (err) { | 1521 | if (err) { |
1520 | bgmac_err(bgmac, "Cannot register MDIO\n"); | 1522 | bgmac_err(bgmac, "Cannot register MDIO\n"); |
@@ -1529,8 +1531,6 @@ static int bgmac_probe(struct bcma_device *core) | |||
1529 | 1531 | ||
1530 | netif_carrier_off(net_dev); | 1532 | netif_carrier_off(net_dev); |
1531 | 1533 | ||
1532 | netif_napi_add(net_dev, &bgmac->napi, bgmac_poll, BGMAC_WEIGHT); | ||
1533 | |||
1534 | return 0; | 1534 | return 0; |
1535 | 1535 | ||
1536 | err_mii_unregister: | 1536 | err_mii_unregister: |
@@ -1549,9 +1549,9 @@ static void bgmac_remove(struct bcma_device *core) | |||
1549 | { | 1549 | { |
1550 | struct bgmac *bgmac = bcma_get_drvdata(core); | 1550 | struct bgmac *bgmac = bcma_get_drvdata(core); |
1551 | 1551 | ||
1552 | netif_napi_del(&bgmac->napi); | ||
1553 | unregister_netdev(bgmac->net_dev); | 1552 | unregister_netdev(bgmac->net_dev); |
1554 | bgmac_mii_unregister(bgmac); | 1553 | bgmac_mii_unregister(bgmac); |
1554 | netif_napi_del(&bgmac->napi); | ||
1555 | bgmac_dma_free(bgmac); | 1555 | bgmac_dma_free(bgmac); |
1556 | bcma_set_drvdata(core, NULL); | 1556 | bcma_set_drvdata(core, NULL); |
1557 | free_netdev(bgmac->net_dev); | 1557 | free_netdev(bgmac->net_dev); |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c index b51a18a09d4d..0a9faa134a9a 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | |||
@@ -3175,7 +3175,7 @@ static int bnx2x_poll(struct napi_struct *napi, int budget) | |||
3175 | } | 3175 | } |
3176 | #endif | 3176 | #endif |
3177 | if (!bnx2x_fp_lock_napi(fp)) | 3177 | if (!bnx2x_fp_lock_napi(fp)) |
3178 | return work_done; | 3178 | return budget; |
3179 | 3179 | ||
3180 | for_each_cos_in_tx_queue(fp, cos) | 3180 | for_each_cos_in_tx_queue(fp, cos) |
3181 | if (bnx2x_tx_queue_has_work(fp->txdata_ptr[cos])) | 3181 | if (bnx2x_tx_queue_has_work(fp->txdata_ptr[cos])) |
diff --git a/drivers/net/ethernet/cisco/enic/enic_main.c b/drivers/net/ethernet/cisco/enic/enic_main.c index 0535f6fbdc71..ee44c827164d 100644 --- a/drivers/net/ethernet/cisco/enic/enic_main.c +++ b/drivers/net/ethernet/cisco/enic/enic_main.c | |||
@@ -1372,7 +1372,7 @@ static int enic_poll_msix_rq(struct napi_struct *napi, int budget) | |||
1372 | int err; | 1372 | int err; |
1373 | 1373 | ||
1374 | if (!enic_poll_lock_napi(&enic->rq[rq])) | 1374 | if (!enic_poll_lock_napi(&enic->rq[rq])) |
1375 | return work_done; | 1375 | return budget; |
1376 | /* Service RQ | 1376 | /* Service RQ |
1377 | */ | 1377 | */ |
1378 | 1378 | ||
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index 6c10fece1245..598c5070c629 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c | |||
@@ -4406,8 +4406,9 @@ static int be_ndo_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq, | |||
4406 | * distinguish various types of transports (VxLAN, GRE, NVGRE ..). So, offload | 4406 | * distinguish various types of transports (VxLAN, GRE, NVGRE ..). So, offload |
4407 | * is expected to work across all types of IP tunnels once exported. Skyhawk | 4407 | * is expected to work across all types of IP tunnels once exported. Skyhawk |
4408 | * supports offloads for either VxLAN or NVGRE, exclusively. So we export VxLAN | 4408 | * supports offloads for either VxLAN or NVGRE, exclusively. So we export VxLAN |
4409 | * offloads in hw_enc_features only when a VxLAN port is added. Note this only | 4409 | * offloads in hw_enc_features only when a VxLAN port is added. If other (non |
4410 | * ensures that other tunnels work fine while VxLAN offloads are not enabled. | 4410 | * VxLAN) tunnels are configured while VxLAN offloads are enabled, offloads for |
4411 | * those other tunnels are unexported on the fly through ndo_features_check(). | ||
4411 | * | 4412 | * |
4412 | * Skyhawk supports VxLAN offloads only for one UDP dport. So, if the stack | 4413 | * Skyhawk supports VxLAN offloads only for one UDP dport. So, if the stack |
4413 | * adds more than one port, disable offloads and don't re-enable them again | 4414 | * adds more than one port, disable offloads and don't re-enable them again |
@@ -4486,7 +4487,41 @@ static netdev_features_t be_features_check(struct sk_buff *skb, | |||
4486 | struct net_device *dev, | 4487 | struct net_device *dev, |
4487 | netdev_features_t features) | 4488 | netdev_features_t features) |
4488 | { | 4489 | { |
4489 | return vxlan_features_check(skb, features); | 4490 | struct be_adapter *adapter = netdev_priv(dev); |
4491 | u8 l4_hdr = 0; | ||
4492 | |||
4493 | /* The code below restricts offload features for some tunneled packets. | ||
4494 | * Offload features for normal (non tunnel) packets are unchanged. | ||
4495 | */ | ||
4496 | if (!skb->encapsulation || | ||
4497 | !(adapter->flags & BE_FLAGS_VXLAN_OFFLOADS)) | ||
4498 | return features; | ||
4499 | |||
4500 | /* It's an encapsulated packet and VxLAN offloads are enabled. We | ||
4501 | * should disable tunnel offload features if it's not a VxLAN packet, | ||
4502 | * as tunnel offloads have been enabled only for VxLAN. This is done to | ||
4503 | * allow other tunneled traffic like GRE work fine while VxLAN | ||
4504 | * offloads are configured in Skyhawk-R. | ||
4505 | */ | ||
4506 | switch (vlan_get_protocol(skb)) { | ||
4507 | case htons(ETH_P_IP): | ||
4508 | l4_hdr = ip_hdr(skb)->protocol; | ||
4509 | break; | ||
4510 | case htons(ETH_P_IPV6): | ||
4511 | l4_hdr = ipv6_hdr(skb)->nexthdr; | ||
4512 | break; | ||
4513 | default: | ||
4514 | return features; | ||
4515 | } | ||
4516 | |||
4517 | if (l4_hdr != IPPROTO_UDP || | ||
4518 | skb->inner_protocol_type != ENCAP_TYPE_ETHER || | ||
4519 | skb->inner_protocol != htons(ETH_P_TEB) || | ||
4520 | skb_inner_mac_header(skb) - skb_transport_header(skb) != | ||
4521 | sizeof(struct udphdr) + sizeof(struct vxlanhdr)) | ||
4522 | return features & ~(NETIF_F_ALL_CSUM | NETIF_F_GSO_MASK); | ||
4523 | |||
4524 | return features; | ||
4490 | } | 4525 | } |
4491 | #endif | 4526 | #endif |
4492 | 4527 | ||
diff --git a/drivers/net/ethernet/marvell/mv643xx_eth.c b/drivers/net/ethernet/marvell/mv643xx_eth.c index a62fc38f045e..1c75829eb166 100644 --- a/drivers/net/ethernet/marvell/mv643xx_eth.c +++ b/drivers/net/ethernet/marvell/mv643xx_eth.c | |||
@@ -192,6 +192,10 @@ static char mv643xx_eth_driver_version[] = "1.4"; | |||
192 | #define IS_TSO_HEADER(txq, addr) \ | 192 | #define IS_TSO_HEADER(txq, addr) \ |
193 | ((addr >= txq->tso_hdrs_dma) && \ | 193 | ((addr >= txq->tso_hdrs_dma) && \ |
194 | (addr < txq->tso_hdrs_dma + txq->tx_ring_size * TSO_HEADER_SIZE)) | 194 | (addr < txq->tso_hdrs_dma + txq->tx_ring_size * TSO_HEADER_SIZE)) |
195 | |||
196 | #define DESC_DMA_MAP_SINGLE 0 | ||
197 | #define DESC_DMA_MAP_PAGE 1 | ||
198 | |||
195 | /* | 199 | /* |
196 | * RX/TX descriptors. | 200 | * RX/TX descriptors. |
197 | */ | 201 | */ |
@@ -362,6 +366,7 @@ struct tx_queue { | |||
362 | dma_addr_t tso_hdrs_dma; | 366 | dma_addr_t tso_hdrs_dma; |
363 | 367 | ||
364 | struct tx_desc *tx_desc_area; | 368 | struct tx_desc *tx_desc_area; |
369 | char *tx_desc_mapping; /* array to track the type of the dma mapping */ | ||
365 | dma_addr_t tx_desc_dma; | 370 | dma_addr_t tx_desc_dma; |
366 | int tx_desc_area_size; | 371 | int tx_desc_area_size; |
367 | 372 | ||
@@ -750,6 +755,7 @@ txq_put_data_tso(struct net_device *dev, struct tx_queue *txq, | |||
750 | if (txq->tx_curr_desc == txq->tx_ring_size) | 755 | if (txq->tx_curr_desc == txq->tx_ring_size) |
751 | txq->tx_curr_desc = 0; | 756 | txq->tx_curr_desc = 0; |
752 | desc = &txq->tx_desc_area[tx_index]; | 757 | desc = &txq->tx_desc_area[tx_index]; |
758 | txq->tx_desc_mapping[tx_index] = DESC_DMA_MAP_SINGLE; | ||
753 | 759 | ||
754 | desc->l4i_chk = 0; | 760 | desc->l4i_chk = 0; |
755 | desc->byte_cnt = length; | 761 | desc->byte_cnt = length; |
@@ -879,14 +885,13 @@ static void txq_submit_frag_skb(struct tx_queue *txq, struct sk_buff *skb) | |||
879 | skb_frag_t *this_frag; | 885 | skb_frag_t *this_frag; |
880 | int tx_index; | 886 | int tx_index; |
881 | struct tx_desc *desc; | 887 | struct tx_desc *desc; |
882 | void *addr; | ||
883 | 888 | ||
884 | this_frag = &skb_shinfo(skb)->frags[frag]; | 889 | this_frag = &skb_shinfo(skb)->frags[frag]; |
885 | addr = page_address(this_frag->page.p) + this_frag->page_offset; | ||
886 | tx_index = txq->tx_curr_desc++; | 890 | tx_index = txq->tx_curr_desc++; |
887 | if (txq->tx_curr_desc == txq->tx_ring_size) | 891 | if (txq->tx_curr_desc == txq->tx_ring_size) |
888 | txq->tx_curr_desc = 0; | 892 | txq->tx_curr_desc = 0; |
889 | desc = &txq->tx_desc_area[tx_index]; | 893 | desc = &txq->tx_desc_area[tx_index]; |
894 | txq->tx_desc_mapping[tx_index] = DESC_DMA_MAP_PAGE; | ||
890 | 895 | ||
891 | /* | 896 | /* |
892 | * The last fragment will generate an interrupt | 897 | * The last fragment will generate an interrupt |
@@ -902,8 +907,9 @@ static void txq_submit_frag_skb(struct tx_queue *txq, struct sk_buff *skb) | |||
902 | 907 | ||
903 | desc->l4i_chk = 0; | 908 | desc->l4i_chk = 0; |
904 | desc->byte_cnt = skb_frag_size(this_frag); | 909 | desc->byte_cnt = skb_frag_size(this_frag); |
905 | desc->buf_ptr = dma_map_single(mp->dev->dev.parent, addr, | 910 | desc->buf_ptr = skb_frag_dma_map(mp->dev->dev.parent, |
906 | desc->byte_cnt, DMA_TO_DEVICE); | 911 | this_frag, 0, desc->byte_cnt, |
912 | DMA_TO_DEVICE); | ||
907 | } | 913 | } |
908 | } | 914 | } |
909 | 915 | ||
@@ -936,6 +942,7 @@ static int txq_submit_skb(struct tx_queue *txq, struct sk_buff *skb, | |||
936 | if (txq->tx_curr_desc == txq->tx_ring_size) | 942 | if (txq->tx_curr_desc == txq->tx_ring_size) |
937 | txq->tx_curr_desc = 0; | 943 | txq->tx_curr_desc = 0; |
938 | desc = &txq->tx_desc_area[tx_index]; | 944 | desc = &txq->tx_desc_area[tx_index]; |
945 | txq->tx_desc_mapping[tx_index] = DESC_DMA_MAP_SINGLE; | ||
939 | 946 | ||
940 | if (nr_frags) { | 947 | if (nr_frags) { |
941 | txq_submit_frag_skb(txq, skb); | 948 | txq_submit_frag_skb(txq, skb); |
@@ -1047,9 +1054,12 @@ static int txq_reclaim(struct tx_queue *txq, int budget, int force) | |||
1047 | int tx_index; | 1054 | int tx_index; |
1048 | struct tx_desc *desc; | 1055 | struct tx_desc *desc; |
1049 | u32 cmd_sts; | 1056 | u32 cmd_sts; |
1057 | char desc_dma_map; | ||
1050 | 1058 | ||
1051 | tx_index = txq->tx_used_desc; | 1059 | tx_index = txq->tx_used_desc; |
1052 | desc = &txq->tx_desc_area[tx_index]; | 1060 | desc = &txq->tx_desc_area[tx_index]; |
1061 | desc_dma_map = txq->tx_desc_mapping[tx_index]; | ||
1062 | |||
1053 | cmd_sts = desc->cmd_sts; | 1063 | cmd_sts = desc->cmd_sts; |
1054 | 1064 | ||
1055 | if (cmd_sts & BUFFER_OWNED_BY_DMA) { | 1065 | if (cmd_sts & BUFFER_OWNED_BY_DMA) { |
@@ -1065,9 +1075,19 @@ static int txq_reclaim(struct tx_queue *txq, int budget, int force) | |||
1065 | reclaimed++; | 1075 | reclaimed++; |
1066 | txq->tx_desc_count--; | 1076 | txq->tx_desc_count--; |
1067 | 1077 | ||
1068 | if (!IS_TSO_HEADER(txq, desc->buf_ptr)) | 1078 | if (!IS_TSO_HEADER(txq, desc->buf_ptr)) { |
1069 | dma_unmap_single(mp->dev->dev.parent, desc->buf_ptr, | 1079 | |
1070 | desc->byte_cnt, DMA_TO_DEVICE); | 1080 | if (desc_dma_map == DESC_DMA_MAP_PAGE) |
1081 | dma_unmap_page(mp->dev->dev.parent, | ||
1082 | desc->buf_ptr, | ||
1083 | desc->byte_cnt, | ||
1084 | DMA_TO_DEVICE); | ||
1085 | else | ||
1086 | dma_unmap_single(mp->dev->dev.parent, | ||
1087 | desc->buf_ptr, | ||
1088 | desc->byte_cnt, | ||
1089 | DMA_TO_DEVICE); | ||
1090 | } | ||
1071 | 1091 | ||
1072 | if (cmd_sts & TX_ENABLE_INTERRUPT) { | 1092 | if (cmd_sts & TX_ENABLE_INTERRUPT) { |
1073 | struct sk_buff *skb = __skb_dequeue(&txq->tx_skb); | 1093 | struct sk_buff *skb = __skb_dequeue(&txq->tx_skb); |
@@ -1996,6 +2016,7 @@ static int txq_init(struct mv643xx_eth_private *mp, int index) | |||
1996 | struct tx_queue *txq = mp->txq + index; | 2016 | struct tx_queue *txq = mp->txq + index; |
1997 | struct tx_desc *tx_desc; | 2017 | struct tx_desc *tx_desc; |
1998 | int size; | 2018 | int size; |
2019 | int ret; | ||
1999 | int i; | 2020 | int i; |
2000 | 2021 | ||
2001 | txq->index = index; | 2022 | txq->index = index; |
@@ -2048,18 +2069,34 @@ static int txq_init(struct mv643xx_eth_private *mp, int index) | |||
2048 | nexti * sizeof(struct tx_desc); | 2069 | nexti * sizeof(struct tx_desc); |
2049 | } | 2070 | } |
2050 | 2071 | ||
2072 | txq->tx_desc_mapping = kcalloc(txq->tx_ring_size, sizeof(char), | ||
2073 | GFP_KERNEL); | ||
2074 | if (!txq->tx_desc_mapping) { | ||
2075 | ret = -ENOMEM; | ||
2076 | goto err_free_desc_area; | ||
2077 | } | ||
2078 | |||
2051 | /* Allocate DMA buffers for TSO MAC/IP/TCP headers */ | 2079 | /* Allocate DMA buffers for TSO MAC/IP/TCP headers */ |
2052 | txq->tso_hdrs = dma_alloc_coherent(mp->dev->dev.parent, | 2080 | txq->tso_hdrs = dma_alloc_coherent(mp->dev->dev.parent, |
2053 | txq->tx_ring_size * TSO_HEADER_SIZE, | 2081 | txq->tx_ring_size * TSO_HEADER_SIZE, |
2054 | &txq->tso_hdrs_dma, GFP_KERNEL); | 2082 | &txq->tso_hdrs_dma, GFP_KERNEL); |
2055 | if (txq->tso_hdrs == NULL) { | 2083 | if (txq->tso_hdrs == NULL) { |
2056 | dma_free_coherent(mp->dev->dev.parent, txq->tx_desc_area_size, | 2084 | ret = -ENOMEM; |
2057 | txq->tx_desc_area, txq->tx_desc_dma); | 2085 | goto err_free_desc_mapping; |
2058 | return -ENOMEM; | ||
2059 | } | 2086 | } |
2060 | skb_queue_head_init(&txq->tx_skb); | 2087 | skb_queue_head_init(&txq->tx_skb); |
2061 | 2088 | ||
2062 | return 0; | 2089 | return 0; |
2090 | |||
2091 | err_free_desc_mapping: | ||
2092 | kfree(txq->tx_desc_mapping); | ||
2093 | err_free_desc_area: | ||
2094 | if (index == 0 && size <= mp->tx_desc_sram_size) | ||
2095 | iounmap(txq->tx_desc_area); | ||
2096 | else | ||
2097 | dma_free_coherent(mp->dev->dev.parent, txq->tx_desc_area_size, | ||
2098 | txq->tx_desc_area, txq->tx_desc_dma); | ||
2099 | return ret; | ||
2063 | } | 2100 | } |
2064 | 2101 | ||
2065 | static void txq_deinit(struct tx_queue *txq) | 2102 | static void txq_deinit(struct tx_queue *txq) |
@@ -2077,6 +2114,8 @@ static void txq_deinit(struct tx_queue *txq) | |||
2077 | else | 2114 | else |
2078 | dma_free_coherent(mp->dev->dev.parent, txq->tx_desc_area_size, | 2115 | dma_free_coherent(mp->dev->dev.parent, txq->tx_desc_area_size, |
2079 | txq->tx_desc_area, txq->tx_desc_dma); | 2116 | txq->tx_desc_area, txq->tx_desc_dma); |
2117 | kfree(txq->tx_desc_mapping); | ||
2118 | |||
2080 | if (txq->tso_hdrs) | 2119 | if (txq->tso_hdrs) |
2081 | dma_free_coherent(mp->dev->dev.parent, | 2120 | dma_free_coherent(mp->dev->dev.parent, |
2082 | txq->tx_ring_size * TSO_HEADER_SIZE, | 2121 | txq->tx_ring_size * TSO_HEADER_SIZE, |
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c index 43a3f9822f74..e075ff1f4e80 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c | |||
@@ -475,7 +475,8 @@ static int mlx4_en_tunnel_steer_add(struct mlx4_en_priv *priv, unsigned char *ad | |||
475 | { | 475 | { |
476 | int err; | 476 | int err; |
477 | 477 | ||
478 | if (priv->mdev->dev->caps.tunnel_offload_mode != MLX4_TUNNEL_OFFLOAD_MODE_VXLAN) | 478 | if (priv->mdev->dev->caps.tunnel_offload_mode != MLX4_TUNNEL_OFFLOAD_MODE_VXLAN || |
479 | priv->mdev->dev->caps.dmfs_high_steer_mode == MLX4_STEERING_DMFS_A0_STATIC) | ||
479 | return 0; /* do nothing */ | 480 | return 0; /* do nothing */ |
480 | 481 | ||
481 | err = mlx4_tunnel_steer_add(priv->mdev->dev, addr, priv->port, qpn, | 482 | err = mlx4_tunnel_steer_add(priv->mdev->dev, addr, priv->port, qpn, |
diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c index 9c7ef0bffb52..ff2fffeab4c7 100644 --- a/drivers/net/ethernet/mellanox/mlx4/main.c +++ b/drivers/net/ethernet/mellanox/mlx4/main.c | |||
@@ -1806,8 +1806,7 @@ static void choose_tunnel_offload_mode(struct mlx4_dev *dev, | |||
1806 | struct mlx4_dev_cap *dev_cap) | 1806 | struct mlx4_dev_cap *dev_cap) |
1807 | { | 1807 | { |
1808 | if (dev->caps.steering_mode == MLX4_STEERING_MODE_DEVICE_MANAGED && | 1808 | if (dev->caps.steering_mode == MLX4_STEERING_MODE_DEVICE_MANAGED && |
1809 | dev_cap->flags2 & MLX4_DEV_CAP_FLAG2_VXLAN_OFFLOADS && | 1809 | dev_cap->flags2 & MLX4_DEV_CAP_FLAG2_VXLAN_OFFLOADS) |
1810 | dev->caps.dmfs_high_steer_mode != MLX4_STEERING_DMFS_A0_STATIC) | ||
1811 | dev->caps.tunnel_offload_mode = MLX4_TUNNEL_OFFLOAD_MODE_VXLAN; | 1810 | dev->caps.tunnel_offload_mode = MLX4_TUNNEL_OFFLOAD_MODE_VXLAN; |
1812 | else | 1811 | else |
1813 | dev->caps.tunnel_offload_mode = MLX4_TUNNEL_OFFLOAD_MODE_NONE; | 1812 | dev->caps.tunnel_offload_mode = MLX4_TUNNEL_OFFLOAD_MODE_NONE; |
diff --git a/drivers/net/ethernet/neterion/s2io.c b/drivers/net/ethernet/neterion/s2io.c index 0529cad75b10..a4cdf2f8041a 100644 --- a/drivers/net/ethernet/neterion/s2io.c +++ b/drivers/net/ethernet/neterion/s2io.c | |||
@@ -6987,7 +6987,9 @@ static int s2io_add_isr(struct s2io_nic *sp) | |||
6987 | if (sp->s2io_entries[i].in_use == MSIX_FLG) { | 6987 | if (sp->s2io_entries[i].in_use == MSIX_FLG) { |
6988 | if (sp->s2io_entries[i].type == | 6988 | if (sp->s2io_entries[i].type == |
6989 | MSIX_RING_TYPE) { | 6989 | MSIX_RING_TYPE) { |
6990 | sprintf(sp->desc[i], "%s:MSI-X-%d-RX", | 6990 | snprintf(sp->desc[i], |
6991 | sizeof(sp->desc[i]), | ||
6992 | "%s:MSI-X-%d-RX", | ||
6991 | dev->name, i); | 6993 | dev->name, i); |
6992 | err = request_irq(sp->entries[i].vector, | 6994 | err = request_irq(sp->entries[i].vector, |
6993 | s2io_msix_ring_handle, | 6995 | s2io_msix_ring_handle, |
@@ -6996,7 +6998,9 @@ static int s2io_add_isr(struct s2io_nic *sp) | |||
6996 | sp->s2io_entries[i].arg); | 6998 | sp->s2io_entries[i].arg); |
6997 | } else if (sp->s2io_entries[i].type == | 6999 | } else if (sp->s2io_entries[i].type == |
6998 | MSIX_ALARM_TYPE) { | 7000 | MSIX_ALARM_TYPE) { |
6999 | sprintf(sp->desc[i], "%s:MSI-X-%d-TX", | 7001 | snprintf(sp->desc[i], |
7002 | sizeof(sp->desc[i]), | ||
7003 | "%s:MSI-X-%d-TX", | ||
7000 | dev->name, i); | 7004 | dev->name, i); |
7001 | err = request_irq(sp->entries[i].vector, | 7005 | err = request_irq(sp->entries[i].vector, |
7002 | s2io_msix_fifo_handle, | 7006 | s2io_msix_fifo_handle, |
@@ -8154,7 +8158,8 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre) | |||
8154 | "%s: UDP Fragmentation Offload(UFO) enabled\n", | 8158 | "%s: UDP Fragmentation Offload(UFO) enabled\n", |
8155 | dev->name); | 8159 | dev->name); |
8156 | /* Initialize device name */ | 8160 | /* Initialize device name */ |
8157 | sprintf(sp->name, "%s Neterion %s", dev->name, sp->product_name); | 8161 | snprintf(sp->name, sizeof(sp->name), "%s Neterion %s", dev->name, |
8162 | sp->product_name); | ||
8158 | 8163 | ||
8159 | if (vlan_tag_strip) | 8164 | if (vlan_tag_strip) |
8160 | sp->vlan_strip_flag = 1; | 8165 | sp->vlan_strip_flag = 1; |
diff --git a/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c b/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c index a47fe67fdf58..afb8efb25781 100644 --- a/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c +++ b/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c | |||
@@ -2388,7 +2388,10 @@ static int netxen_nic_poll(struct napi_struct *napi, int budget) | |||
2388 | 2388 | ||
2389 | work_done = netxen_process_rcv_ring(sds_ring, budget); | 2389 | work_done = netxen_process_rcv_ring(sds_ring, budget); |
2390 | 2390 | ||
2391 | if ((work_done < budget) && tx_complete) { | 2391 | if (!tx_complete) |
2392 | work_done = budget; | ||
2393 | |||
2394 | if (work_done < budget) { | ||
2392 | napi_complete(&sds_ring->napi); | 2395 | napi_complete(&sds_ring->napi); |
2393 | if (test_bit(__NX_DEV_UP, &adapter->state)) | 2396 | if (test_bit(__NX_DEV_UP, &adapter->state)) |
2394 | netxen_nic_enable_int(sds_ring); | 2397 | netxen_nic_enable_int(sds_ring); |
diff --git a/drivers/net/ethernet/renesas/sh_eth.c b/drivers/net/ethernet/renesas/sh_eth.c index fe0277a35507..4da8bd263997 100644 --- a/drivers/net/ethernet/renesas/sh_eth.c +++ b/drivers/net/ethernet/renesas/sh_eth.c | |||
@@ -396,6 +396,9 @@ static const u16 sh_eth_offset_fast_sh3_sh2[SH_ETH_MAX_REGISTER_OFFSET] = { | |||
396 | [TSU_ADRL31] = 0x01fc, | 396 | [TSU_ADRL31] = 0x01fc, |
397 | }; | 397 | }; |
398 | 398 | ||
399 | static void sh_eth_rcv_snd_disable(struct net_device *ndev); | ||
400 | static struct net_device_stats *sh_eth_get_stats(struct net_device *ndev); | ||
401 | |||
399 | static bool sh_eth_is_gether(struct sh_eth_private *mdp) | 402 | static bool sh_eth_is_gether(struct sh_eth_private *mdp) |
400 | { | 403 | { |
401 | return mdp->reg_offset == sh_eth_offset_gigabit; | 404 | return mdp->reg_offset == sh_eth_offset_gigabit; |
@@ -498,6 +501,8 @@ static struct sh_eth_cpu_data r8a779x_data = { | |||
498 | EESR_ECI, | 501 | EESR_ECI, |
499 | .fdr_value = 0x00000f0f, | 502 | .fdr_value = 0x00000f0f, |
500 | 503 | ||
504 | .trscer_err_mask = DESC_I_RINT8, | ||
505 | |||
501 | .apr = 1, | 506 | .apr = 1, |
502 | .mpr = 1, | 507 | .mpr = 1, |
503 | .tpauser = 1, | 508 | .tpauser = 1, |
@@ -538,8 +543,6 @@ static struct sh_eth_cpu_data sh7724_data = { | |||
538 | EESR_RDE | EESR_RFRMER | EESR_TFE | EESR_TDE | | 543 | EESR_RDE | EESR_RFRMER | EESR_TFE | EESR_TDE | |
539 | EESR_ECI, | 544 | EESR_ECI, |
540 | 545 | ||
541 | .trscer_err_mask = DESC_I_RINT8, | ||
542 | |||
543 | .apr = 1, | 546 | .apr = 1, |
544 | .mpr = 1, | 547 | .mpr = 1, |
545 | .tpauser = 1, | 548 | .tpauser = 1, |
@@ -1120,6 +1123,7 @@ static void sh_eth_ring_format(struct net_device *ndev) | |||
1120 | int rx_ringsize = sizeof(*rxdesc) * mdp->num_rx_ring; | 1123 | int rx_ringsize = sizeof(*rxdesc) * mdp->num_rx_ring; |
1121 | int tx_ringsize = sizeof(*txdesc) * mdp->num_tx_ring; | 1124 | int tx_ringsize = sizeof(*txdesc) * mdp->num_tx_ring; |
1122 | int skbuff_size = mdp->rx_buf_sz + SH_ETH_RX_ALIGN - 1; | 1125 | int skbuff_size = mdp->rx_buf_sz + SH_ETH_RX_ALIGN - 1; |
1126 | dma_addr_t dma_addr; | ||
1123 | 1127 | ||
1124 | mdp->cur_rx = 0; | 1128 | mdp->cur_rx = 0; |
1125 | mdp->cur_tx = 0; | 1129 | mdp->cur_tx = 0; |
@@ -1133,7 +1137,6 @@ static void sh_eth_ring_format(struct net_device *ndev) | |||
1133 | /* skb */ | 1137 | /* skb */ |
1134 | mdp->rx_skbuff[i] = NULL; | 1138 | mdp->rx_skbuff[i] = NULL; |
1135 | skb = netdev_alloc_skb(ndev, skbuff_size); | 1139 | skb = netdev_alloc_skb(ndev, skbuff_size); |
1136 | mdp->rx_skbuff[i] = skb; | ||
1137 | if (skb == NULL) | 1140 | if (skb == NULL) |
1138 | break; | 1141 | break; |
1139 | sh_eth_set_receive_align(skb); | 1142 | sh_eth_set_receive_align(skb); |
@@ -1142,9 +1145,15 @@ static void sh_eth_ring_format(struct net_device *ndev) | |||
1142 | rxdesc = &mdp->rx_ring[i]; | 1145 | rxdesc = &mdp->rx_ring[i]; |
1143 | /* The size of the buffer is a multiple of 16 bytes. */ | 1146 | /* The size of the buffer is a multiple of 16 bytes. */ |
1144 | rxdesc->buffer_length = ALIGN(mdp->rx_buf_sz, 16); | 1147 | rxdesc->buffer_length = ALIGN(mdp->rx_buf_sz, 16); |
1145 | dma_map_single(&ndev->dev, skb->data, rxdesc->buffer_length, | 1148 | dma_addr = dma_map_single(&ndev->dev, skb->data, |
1146 | DMA_FROM_DEVICE); | 1149 | rxdesc->buffer_length, |
1147 | rxdesc->addr = virt_to_phys(skb->data); | 1150 | DMA_FROM_DEVICE); |
1151 | if (dma_mapping_error(&ndev->dev, dma_addr)) { | ||
1152 | kfree_skb(skb); | ||
1153 | break; | ||
1154 | } | ||
1155 | mdp->rx_skbuff[i] = skb; | ||
1156 | rxdesc->addr = dma_addr; | ||
1148 | rxdesc->status = cpu_to_edmac(mdp, RD_RACT | RD_RFP); | 1157 | rxdesc->status = cpu_to_edmac(mdp, RD_RACT | RD_RFP); |
1149 | 1158 | ||
1150 | /* Rx descriptor address set */ | 1159 | /* Rx descriptor address set */ |
@@ -1316,8 +1325,10 @@ static int sh_eth_dev_init(struct net_device *ndev, bool start) | |||
1316 | RFLR); | 1325 | RFLR); |
1317 | 1326 | ||
1318 | sh_eth_write(ndev, sh_eth_read(ndev, EESR), EESR); | 1327 | sh_eth_write(ndev, sh_eth_read(ndev, EESR), EESR); |
1319 | if (start) | 1328 | if (start) { |
1329 | mdp->irq_enabled = true; | ||
1320 | sh_eth_write(ndev, mdp->cd->eesipr_value, EESIPR); | 1330 | sh_eth_write(ndev, mdp->cd->eesipr_value, EESIPR); |
1331 | } | ||
1321 | 1332 | ||
1322 | /* PAUSE Prohibition */ | 1333 | /* PAUSE Prohibition */ |
1323 | val = (sh_eth_read(ndev, ECMR) & ECMR_DM) | | 1334 | val = (sh_eth_read(ndev, ECMR) & ECMR_DM) | |
@@ -1356,6 +1367,33 @@ static int sh_eth_dev_init(struct net_device *ndev, bool start) | |||
1356 | return ret; | 1367 | return ret; |
1357 | } | 1368 | } |
1358 | 1369 | ||
1370 | static void sh_eth_dev_exit(struct net_device *ndev) | ||
1371 | { | ||
1372 | struct sh_eth_private *mdp = netdev_priv(ndev); | ||
1373 | int i; | ||
1374 | |||
1375 | /* Deactivate all TX descriptors, so DMA should stop at next | ||
1376 | * packet boundary if it's currently running | ||
1377 | */ | ||
1378 | for (i = 0; i < mdp->num_tx_ring; i++) | ||
1379 | mdp->tx_ring[i].status &= ~cpu_to_edmac(mdp, TD_TACT); | ||
1380 | |||
1381 | /* Disable TX FIFO egress to MAC */ | ||
1382 | sh_eth_rcv_snd_disable(ndev); | ||
1383 | |||
1384 | /* Stop RX DMA at next packet boundary */ | ||
1385 | sh_eth_write(ndev, 0, EDRRR); | ||
1386 | |||
1387 | /* Aside from TX DMA, we can't tell when the hardware is | ||
1388 | * really stopped, so we need to reset to make sure. | ||
1389 | * Before doing that, wait for long enough to *probably* | ||
1390 | * finish transmitting the last packet and poll stats. | ||
1391 | */ | ||
1392 | msleep(2); /* max frame time at 10 Mbps < 1250 us */ | ||
1393 | sh_eth_get_stats(ndev); | ||
1394 | sh_eth_reset(ndev); | ||
1395 | } | ||
1396 | |||
1359 | /* free Tx skb function */ | 1397 | /* free Tx skb function */ |
1360 | static int sh_eth_txfree(struct net_device *ndev) | 1398 | static int sh_eth_txfree(struct net_device *ndev) |
1361 | { | 1399 | { |
@@ -1400,6 +1438,7 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota) | |||
1400 | u16 pkt_len = 0; | 1438 | u16 pkt_len = 0; |
1401 | u32 desc_status; | 1439 | u32 desc_status; |
1402 | int skbuff_size = mdp->rx_buf_sz + SH_ETH_RX_ALIGN - 1; | 1440 | int skbuff_size = mdp->rx_buf_sz + SH_ETH_RX_ALIGN - 1; |
1441 | dma_addr_t dma_addr; | ||
1403 | 1442 | ||
1404 | boguscnt = min(boguscnt, *quota); | 1443 | boguscnt = min(boguscnt, *quota); |
1405 | limit = boguscnt; | 1444 | limit = boguscnt; |
@@ -1447,9 +1486,9 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota) | |||
1447 | mdp->rx_skbuff[entry] = NULL; | 1486 | mdp->rx_skbuff[entry] = NULL; |
1448 | if (mdp->cd->rpadir) | 1487 | if (mdp->cd->rpadir) |
1449 | skb_reserve(skb, NET_IP_ALIGN); | 1488 | skb_reserve(skb, NET_IP_ALIGN); |
1450 | dma_sync_single_for_cpu(&ndev->dev, rxdesc->addr, | 1489 | dma_unmap_single(&ndev->dev, rxdesc->addr, |
1451 | ALIGN(mdp->rx_buf_sz, 16), | 1490 | ALIGN(mdp->rx_buf_sz, 16), |
1452 | DMA_FROM_DEVICE); | 1491 | DMA_FROM_DEVICE); |
1453 | skb_put(skb, pkt_len); | 1492 | skb_put(skb, pkt_len); |
1454 | skb->protocol = eth_type_trans(skb, ndev); | 1493 | skb->protocol = eth_type_trans(skb, ndev); |
1455 | netif_receive_skb(skb); | 1494 | netif_receive_skb(skb); |
@@ -1469,15 +1508,20 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota) | |||
1469 | 1508 | ||
1470 | if (mdp->rx_skbuff[entry] == NULL) { | 1509 | if (mdp->rx_skbuff[entry] == NULL) { |
1471 | skb = netdev_alloc_skb(ndev, skbuff_size); | 1510 | skb = netdev_alloc_skb(ndev, skbuff_size); |
1472 | mdp->rx_skbuff[entry] = skb; | ||
1473 | if (skb == NULL) | 1511 | if (skb == NULL) |
1474 | break; /* Better luck next round. */ | 1512 | break; /* Better luck next round. */ |
1475 | sh_eth_set_receive_align(skb); | 1513 | sh_eth_set_receive_align(skb); |
1476 | dma_map_single(&ndev->dev, skb->data, | 1514 | dma_addr = dma_map_single(&ndev->dev, skb->data, |
1477 | rxdesc->buffer_length, DMA_FROM_DEVICE); | 1515 | rxdesc->buffer_length, |
1516 | DMA_FROM_DEVICE); | ||
1517 | if (dma_mapping_error(&ndev->dev, dma_addr)) { | ||
1518 | kfree_skb(skb); | ||
1519 | break; | ||
1520 | } | ||
1521 | mdp->rx_skbuff[entry] = skb; | ||
1478 | 1522 | ||
1479 | skb_checksum_none_assert(skb); | 1523 | skb_checksum_none_assert(skb); |
1480 | rxdesc->addr = virt_to_phys(skb->data); | 1524 | rxdesc->addr = dma_addr; |
1481 | } | 1525 | } |
1482 | if (entry >= mdp->num_rx_ring - 1) | 1526 | if (entry >= mdp->num_rx_ring - 1) |
1483 | rxdesc->status |= | 1527 | rxdesc->status |= |
@@ -1573,7 +1617,6 @@ ignore_link: | |||
1573 | if (intr_status & EESR_RFRMER) { | 1617 | if (intr_status & EESR_RFRMER) { |
1574 | /* Receive Frame Overflow int */ | 1618 | /* Receive Frame Overflow int */ |
1575 | ndev->stats.rx_frame_errors++; | 1619 | ndev->stats.rx_frame_errors++; |
1576 | netif_err(mdp, rx_err, ndev, "Receive Abort\n"); | ||
1577 | } | 1620 | } |
1578 | } | 1621 | } |
1579 | 1622 | ||
@@ -1592,13 +1635,11 @@ ignore_link: | |||
1592 | if (intr_status & EESR_RDE) { | 1635 | if (intr_status & EESR_RDE) { |
1593 | /* Receive Descriptor Empty int */ | 1636 | /* Receive Descriptor Empty int */ |
1594 | ndev->stats.rx_over_errors++; | 1637 | ndev->stats.rx_over_errors++; |
1595 | netif_err(mdp, rx_err, ndev, "Receive Descriptor Empty\n"); | ||
1596 | } | 1638 | } |
1597 | 1639 | ||
1598 | if (intr_status & EESR_RFE) { | 1640 | if (intr_status & EESR_RFE) { |
1599 | /* Receive FIFO Overflow int */ | 1641 | /* Receive FIFO Overflow int */ |
1600 | ndev->stats.rx_fifo_errors++; | 1642 | ndev->stats.rx_fifo_errors++; |
1601 | netif_err(mdp, rx_err, ndev, "Receive FIFO Overflow\n"); | ||
1602 | } | 1643 | } |
1603 | 1644 | ||
1604 | if (!mdp->cd->no_ade && (intr_status & EESR_ADE)) { | 1645 | if (!mdp->cd->no_ade && (intr_status & EESR_ADE)) { |
@@ -1653,7 +1694,12 @@ static irqreturn_t sh_eth_interrupt(int irq, void *netdev) | |||
1653 | if (intr_status & (EESR_RX_CHECK | cd->tx_check | cd->eesr_err_check)) | 1694 | if (intr_status & (EESR_RX_CHECK | cd->tx_check | cd->eesr_err_check)) |
1654 | ret = IRQ_HANDLED; | 1695 | ret = IRQ_HANDLED; |
1655 | else | 1696 | else |
1656 | goto other_irq; | 1697 | goto out; |
1698 | |||
1699 | if (!likely(mdp->irq_enabled)) { | ||
1700 | sh_eth_write(ndev, 0, EESIPR); | ||
1701 | goto out; | ||
1702 | } | ||
1657 | 1703 | ||
1658 | if (intr_status & EESR_RX_CHECK) { | 1704 | if (intr_status & EESR_RX_CHECK) { |
1659 | if (napi_schedule_prep(&mdp->napi)) { | 1705 | if (napi_schedule_prep(&mdp->napi)) { |
@@ -1684,7 +1730,7 @@ static irqreturn_t sh_eth_interrupt(int irq, void *netdev) | |||
1684 | sh_eth_error(ndev, intr_status); | 1730 | sh_eth_error(ndev, intr_status); |
1685 | } | 1731 | } |
1686 | 1732 | ||
1687 | other_irq: | 1733 | out: |
1688 | spin_unlock(&mdp->lock); | 1734 | spin_unlock(&mdp->lock); |
1689 | 1735 | ||
1690 | return ret; | 1736 | return ret; |
@@ -1712,7 +1758,8 @@ static int sh_eth_poll(struct napi_struct *napi, int budget) | |||
1712 | napi_complete(napi); | 1758 | napi_complete(napi); |
1713 | 1759 | ||
1714 | /* Reenable Rx interrupts */ | 1760 | /* Reenable Rx interrupts */ |
1715 | sh_eth_write(ndev, mdp->cd->eesipr_value, EESIPR); | 1761 | if (mdp->irq_enabled) |
1762 | sh_eth_write(ndev, mdp->cd->eesipr_value, EESIPR); | ||
1716 | out: | 1763 | out: |
1717 | return budget - quota; | 1764 | return budget - quota; |
1718 | } | 1765 | } |
@@ -1827,6 +1874,9 @@ static int sh_eth_get_settings(struct net_device *ndev, | |||
1827 | unsigned long flags; | 1874 | unsigned long flags; |
1828 | int ret; | 1875 | int ret; |
1829 | 1876 | ||
1877 | if (!mdp->phydev) | ||
1878 | return -ENODEV; | ||
1879 | |||
1830 | spin_lock_irqsave(&mdp->lock, flags); | 1880 | spin_lock_irqsave(&mdp->lock, flags); |
1831 | ret = phy_ethtool_gset(mdp->phydev, ecmd); | 1881 | ret = phy_ethtool_gset(mdp->phydev, ecmd); |
1832 | spin_unlock_irqrestore(&mdp->lock, flags); | 1882 | spin_unlock_irqrestore(&mdp->lock, flags); |
@@ -1841,6 +1891,9 @@ static int sh_eth_set_settings(struct net_device *ndev, | |||
1841 | unsigned long flags; | 1891 | unsigned long flags; |
1842 | int ret; | 1892 | int ret; |
1843 | 1893 | ||
1894 | if (!mdp->phydev) | ||
1895 | return -ENODEV; | ||
1896 | |||
1844 | spin_lock_irqsave(&mdp->lock, flags); | 1897 | spin_lock_irqsave(&mdp->lock, flags); |
1845 | 1898 | ||
1846 | /* disable tx and rx */ | 1899 | /* disable tx and rx */ |
@@ -1875,6 +1928,9 @@ static int sh_eth_nway_reset(struct net_device *ndev) | |||
1875 | unsigned long flags; | 1928 | unsigned long flags; |
1876 | int ret; | 1929 | int ret; |
1877 | 1930 | ||
1931 | if (!mdp->phydev) | ||
1932 | return -ENODEV; | ||
1933 | |||
1878 | spin_lock_irqsave(&mdp->lock, flags); | 1934 | spin_lock_irqsave(&mdp->lock, flags); |
1879 | ret = phy_start_aneg(mdp->phydev); | 1935 | ret = phy_start_aneg(mdp->phydev); |
1880 | spin_unlock_irqrestore(&mdp->lock, flags); | 1936 | spin_unlock_irqrestore(&mdp->lock, flags); |
@@ -1959,40 +2015,50 @@ static int sh_eth_set_ringparam(struct net_device *ndev, | |||
1959 | return -EINVAL; | 2015 | return -EINVAL; |
1960 | 2016 | ||
1961 | if (netif_running(ndev)) { | 2017 | if (netif_running(ndev)) { |
2018 | netif_device_detach(ndev); | ||
1962 | netif_tx_disable(ndev); | 2019 | netif_tx_disable(ndev); |
1963 | /* Disable interrupts by clearing the interrupt mask. */ | 2020 | |
1964 | sh_eth_write(ndev, 0x0000, EESIPR); | 2021 | /* Serialise with the interrupt handler and NAPI, then |
1965 | /* Stop the chip's Tx and Rx processes. */ | 2022 | * disable interrupts. We have to clear the |
1966 | sh_eth_write(ndev, 0, EDTRR); | 2023 | * irq_enabled flag first to ensure that interrupts |
1967 | sh_eth_write(ndev, 0, EDRRR); | 2024 | * won't be re-enabled. |
2025 | */ | ||
2026 | mdp->irq_enabled = false; | ||
1968 | synchronize_irq(ndev->irq); | 2027 | synchronize_irq(ndev->irq); |
1969 | } | 2028 | napi_synchronize(&mdp->napi); |
2029 | sh_eth_write(ndev, 0x0000, EESIPR); | ||
1970 | 2030 | ||
1971 | /* Free all the skbuffs in the Rx queue. */ | 2031 | sh_eth_dev_exit(ndev); |
1972 | sh_eth_ring_free(ndev); | 2032 | |
1973 | /* Free DMA buffer */ | 2033 | /* Free all the skbuffs in the Rx queue. */ |
1974 | sh_eth_free_dma_buffer(mdp); | 2034 | sh_eth_ring_free(ndev); |
2035 | /* Free DMA buffer */ | ||
2036 | sh_eth_free_dma_buffer(mdp); | ||
2037 | } | ||
1975 | 2038 | ||
1976 | /* Set new parameters */ | 2039 | /* Set new parameters */ |
1977 | mdp->num_rx_ring = ring->rx_pending; | 2040 | mdp->num_rx_ring = ring->rx_pending; |
1978 | mdp->num_tx_ring = ring->tx_pending; | 2041 | mdp->num_tx_ring = ring->tx_pending; |
1979 | 2042 | ||
1980 | ret = sh_eth_ring_init(ndev); | ||
1981 | if (ret < 0) { | ||
1982 | netdev_err(ndev, "%s: sh_eth_ring_init failed.\n", __func__); | ||
1983 | return ret; | ||
1984 | } | ||
1985 | ret = sh_eth_dev_init(ndev, false); | ||
1986 | if (ret < 0) { | ||
1987 | netdev_err(ndev, "%s: sh_eth_dev_init failed.\n", __func__); | ||
1988 | return ret; | ||
1989 | } | ||
1990 | |||
1991 | if (netif_running(ndev)) { | 2043 | if (netif_running(ndev)) { |
2044 | ret = sh_eth_ring_init(ndev); | ||
2045 | if (ret < 0) { | ||
2046 | netdev_err(ndev, "%s: sh_eth_ring_init failed.\n", | ||
2047 | __func__); | ||
2048 | return ret; | ||
2049 | } | ||
2050 | ret = sh_eth_dev_init(ndev, false); | ||
2051 | if (ret < 0) { | ||
2052 | netdev_err(ndev, "%s: sh_eth_dev_init failed.\n", | ||
2053 | __func__); | ||
2054 | return ret; | ||
2055 | } | ||
2056 | |||
2057 | mdp->irq_enabled = true; | ||
1992 | sh_eth_write(ndev, mdp->cd->eesipr_value, EESIPR); | 2058 | sh_eth_write(ndev, mdp->cd->eesipr_value, EESIPR); |
1993 | /* Setting the Rx mode will start the Rx process. */ | 2059 | /* Setting the Rx mode will start the Rx process. */ |
1994 | sh_eth_write(ndev, EDRRR_R, EDRRR); | 2060 | sh_eth_write(ndev, EDRRR_R, EDRRR); |
1995 | netif_wake_queue(ndev); | 2061 | netif_device_attach(ndev); |
1996 | } | 2062 | } |
1997 | 2063 | ||
1998 | return 0; | 2064 | return 0; |
@@ -2108,6 +2174,9 @@ static int sh_eth_start_xmit(struct sk_buff *skb, struct net_device *ndev) | |||
2108 | } | 2174 | } |
2109 | spin_unlock_irqrestore(&mdp->lock, flags); | 2175 | spin_unlock_irqrestore(&mdp->lock, flags); |
2110 | 2176 | ||
2177 | if (skb_padto(skb, ETH_ZLEN)) | ||
2178 | return NETDEV_TX_OK; | ||
2179 | |||
2111 | entry = mdp->cur_tx % mdp->num_tx_ring; | 2180 | entry = mdp->cur_tx % mdp->num_tx_ring; |
2112 | mdp->tx_skbuff[entry] = skb; | 2181 | mdp->tx_skbuff[entry] = skb; |
2113 | txdesc = &mdp->tx_ring[entry]; | 2182 | txdesc = &mdp->tx_ring[entry]; |
@@ -2117,10 +2186,11 @@ static int sh_eth_start_xmit(struct sk_buff *skb, struct net_device *ndev) | |||
2117 | skb->len + 2); | 2186 | skb->len + 2); |
2118 | txdesc->addr = dma_map_single(&ndev->dev, skb->data, skb->len, | 2187 | txdesc->addr = dma_map_single(&ndev->dev, skb->data, skb->len, |
2119 | DMA_TO_DEVICE); | 2188 | DMA_TO_DEVICE); |
2120 | if (skb->len < ETH_ZLEN) | 2189 | if (dma_mapping_error(&ndev->dev, txdesc->addr)) { |
2121 | txdesc->buffer_length = ETH_ZLEN; | 2190 | kfree_skb(skb); |
2122 | else | 2191 | return NETDEV_TX_OK; |
2123 | txdesc->buffer_length = skb->len; | 2192 | } |
2193 | txdesc->buffer_length = skb->len; | ||
2124 | 2194 | ||
2125 | if (entry >= mdp->num_tx_ring - 1) | 2195 | if (entry >= mdp->num_tx_ring - 1) |
2126 | txdesc->status |= cpu_to_edmac(mdp, TD_TACT | TD_TDLE); | 2196 | txdesc->status |= cpu_to_edmac(mdp, TD_TACT | TD_TDLE); |
@@ -2172,24 +2242,26 @@ static int sh_eth_close(struct net_device *ndev) | |||
2172 | 2242 | ||
2173 | netif_stop_queue(ndev); | 2243 | netif_stop_queue(ndev); |
2174 | 2244 | ||
2175 | /* Disable interrupts by clearing the interrupt mask. */ | 2245 | /* Serialise with the interrupt handler and NAPI, then disable |
2246 | * interrupts. We have to clear the irq_enabled flag first to | ||
2247 | * ensure that interrupts won't be re-enabled. | ||
2248 | */ | ||
2249 | mdp->irq_enabled = false; | ||
2250 | synchronize_irq(ndev->irq); | ||
2251 | napi_disable(&mdp->napi); | ||
2176 | sh_eth_write(ndev, 0x0000, EESIPR); | 2252 | sh_eth_write(ndev, 0x0000, EESIPR); |
2177 | 2253 | ||
2178 | /* Stop the chip's Tx and Rx processes. */ | 2254 | sh_eth_dev_exit(ndev); |
2179 | sh_eth_write(ndev, 0, EDTRR); | ||
2180 | sh_eth_write(ndev, 0, EDRRR); | ||
2181 | 2255 | ||
2182 | sh_eth_get_stats(ndev); | ||
2183 | /* PHY Disconnect */ | 2256 | /* PHY Disconnect */ |
2184 | if (mdp->phydev) { | 2257 | if (mdp->phydev) { |
2185 | phy_stop(mdp->phydev); | 2258 | phy_stop(mdp->phydev); |
2186 | phy_disconnect(mdp->phydev); | 2259 | phy_disconnect(mdp->phydev); |
2260 | mdp->phydev = NULL; | ||
2187 | } | 2261 | } |
2188 | 2262 | ||
2189 | free_irq(ndev->irq, ndev); | 2263 | free_irq(ndev->irq, ndev); |
2190 | 2264 | ||
2191 | napi_disable(&mdp->napi); | ||
2192 | |||
2193 | /* Free all the skbuffs in the Rx queue. */ | 2265 | /* Free all the skbuffs in the Rx queue. */ |
2194 | sh_eth_ring_free(ndev); | 2266 | sh_eth_ring_free(ndev); |
2195 | 2267 | ||
@@ -2417,7 +2489,7 @@ static int sh_eth_tsu_purge_all(struct net_device *ndev) | |||
2417 | struct sh_eth_private *mdp = netdev_priv(ndev); | 2489 | struct sh_eth_private *mdp = netdev_priv(ndev); |
2418 | int i, ret; | 2490 | int i, ret; |
2419 | 2491 | ||
2420 | if (unlikely(!mdp->cd->tsu)) | 2492 | if (!mdp->cd->tsu) |
2421 | return 0; | 2493 | return 0; |
2422 | 2494 | ||
2423 | for (i = 0; i < SH_ETH_TSU_CAM_ENTRIES; i++) { | 2495 | for (i = 0; i < SH_ETH_TSU_CAM_ENTRIES; i++) { |
@@ -2440,7 +2512,7 @@ static void sh_eth_tsu_purge_mcast(struct net_device *ndev) | |||
2440 | void *reg_offset = sh_eth_tsu_get_offset(mdp, TSU_ADRH0); | 2512 | void *reg_offset = sh_eth_tsu_get_offset(mdp, TSU_ADRH0); |
2441 | int i; | 2513 | int i; |
2442 | 2514 | ||
2443 | if (unlikely(!mdp->cd->tsu)) | 2515 | if (!mdp->cd->tsu) |
2444 | return; | 2516 | return; |
2445 | 2517 | ||
2446 | for (i = 0; i < SH_ETH_TSU_CAM_ENTRIES; i++, reg_offset += 8) { | 2518 | for (i = 0; i < SH_ETH_TSU_CAM_ENTRIES; i++, reg_offset += 8) { |
@@ -2450,8 +2522,8 @@ static void sh_eth_tsu_purge_mcast(struct net_device *ndev) | |||
2450 | } | 2522 | } |
2451 | } | 2523 | } |
2452 | 2524 | ||
2453 | /* Multicast reception directions set */ | 2525 | /* Update promiscuous flag and multicast filter */ |
2454 | static void sh_eth_set_multicast_list(struct net_device *ndev) | 2526 | static void sh_eth_set_rx_mode(struct net_device *ndev) |
2455 | { | 2527 | { |
2456 | struct sh_eth_private *mdp = netdev_priv(ndev); | 2528 | struct sh_eth_private *mdp = netdev_priv(ndev); |
2457 | u32 ecmr_bits; | 2529 | u32 ecmr_bits; |
@@ -2462,7 +2534,9 @@ static void sh_eth_set_multicast_list(struct net_device *ndev) | |||
2462 | /* Initial condition is MCT = 1, PRM = 0. | 2534 | /* Initial condition is MCT = 1, PRM = 0. |
2463 | * Depending on ndev->flags, set PRM or clear MCT | 2535 | * Depending on ndev->flags, set PRM or clear MCT |
2464 | */ | 2536 | */ |
2465 | ecmr_bits = (sh_eth_read(ndev, ECMR) & ~ECMR_PRM) | ECMR_MCT; | 2537 | ecmr_bits = sh_eth_read(ndev, ECMR) & ~ECMR_PRM; |
2538 | if (mdp->cd->tsu) | ||
2539 | ecmr_bits |= ECMR_MCT; | ||
2466 | 2540 | ||
2467 | if (!(ndev->flags & IFF_MULTICAST)) { | 2541 | if (!(ndev->flags & IFF_MULTICAST)) { |
2468 | sh_eth_tsu_purge_mcast(ndev); | 2542 | sh_eth_tsu_purge_mcast(ndev); |
@@ -2491,9 +2565,6 @@ static void sh_eth_set_multicast_list(struct net_device *ndev) | |||
2491 | } | 2565 | } |
2492 | } | 2566 | } |
2493 | } | 2567 | } |
2494 | } else { | ||
2495 | /* Normal, unicast/broadcast-only mode. */ | ||
2496 | ecmr_bits = (ecmr_bits & ~ECMR_PRM) | ECMR_MCT; | ||
2497 | } | 2568 | } |
2498 | 2569 | ||
2499 | /* update the ethernet mode */ | 2570 | /* update the ethernet mode */ |
@@ -2701,6 +2772,7 @@ static const struct net_device_ops sh_eth_netdev_ops = { | |||
2701 | .ndo_stop = sh_eth_close, | 2772 | .ndo_stop = sh_eth_close, |
2702 | .ndo_start_xmit = sh_eth_start_xmit, | 2773 | .ndo_start_xmit = sh_eth_start_xmit, |
2703 | .ndo_get_stats = sh_eth_get_stats, | 2774 | .ndo_get_stats = sh_eth_get_stats, |
2775 | .ndo_set_rx_mode = sh_eth_set_rx_mode, | ||
2704 | .ndo_tx_timeout = sh_eth_tx_timeout, | 2776 | .ndo_tx_timeout = sh_eth_tx_timeout, |
2705 | .ndo_do_ioctl = sh_eth_do_ioctl, | 2777 | .ndo_do_ioctl = sh_eth_do_ioctl, |
2706 | .ndo_validate_addr = eth_validate_addr, | 2778 | .ndo_validate_addr = eth_validate_addr, |
@@ -2713,7 +2785,7 @@ static const struct net_device_ops sh_eth_netdev_ops_tsu = { | |||
2713 | .ndo_stop = sh_eth_close, | 2785 | .ndo_stop = sh_eth_close, |
2714 | .ndo_start_xmit = sh_eth_start_xmit, | 2786 | .ndo_start_xmit = sh_eth_start_xmit, |
2715 | .ndo_get_stats = sh_eth_get_stats, | 2787 | .ndo_get_stats = sh_eth_get_stats, |
2716 | .ndo_set_rx_mode = sh_eth_set_multicast_list, | 2788 | .ndo_set_rx_mode = sh_eth_set_rx_mode, |
2717 | .ndo_vlan_rx_add_vid = sh_eth_vlan_rx_add_vid, | 2789 | .ndo_vlan_rx_add_vid = sh_eth_vlan_rx_add_vid, |
2718 | .ndo_vlan_rx_kill_vid = sh_eth_vlan_rx_kill_vid, | 2790 | .ndo_vlan_rx_kill_vid = sh_eth_vlan_rx_kill_vid, |
2719 | .ndo_tx_timeout = sh_eth_tx_timeout, | 2791 | .ndo_tx_timeout = sh_eth_tx_timeout, |
diff --git a/drivers/net/ethernet/renesas/sh_eth.h b/drivers/net/ethernet/renesas/sh_eth.h index 7bfaf1c81ea2..259d03f353e1 100644 --- a/drivers/net/ethernet/renesas/sh_eth.h +++ b/drivers/net/ethernet/renesas/sh_eth.h | |||
@@ -513,6 +513,7 @@ struct sh_eth_private { | |||
513 | u32 rx_buf_sz; /* Based on MTU+slack. */ | 513 | u32 rx_buf_sz; /* Based on MTU+slack. */ |
514 | int edmac_endian; | 514 | int edmac_endian; |
515 | struct napi_struct napi; | 515 | struct napi_struct napi; |
516 | bool irq_enabled; | ||
516 | /* MII transceiver section. */ | 517 | /* MII transceiver section. */ |
517 | u32 phy_id; /* PHY ID */ | 518 | u32 phy_id; /* PHY ID */ |
518 | struct mii_bus *mii_bus; /* MDIO bus control */ | 519 | struct mii_bus *mii_bus; /* MDIO bus control */ |
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c index 23545e1e605a..11288d4fc85f 100644 --- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c +++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c | |||
@@ -473,13 +473,19 @@ static int init_rx_ring(struct net_device *dev, u8 queue_no, | |||
473 | /* allocate memory for RX skbuff array */ | 473 | /* allocate memory for RX skbuff array */ |
474 | rx_ring->rx_skbuff_dma = kmalloc_array(rx_rsize, | 474 | rx_ring->rx_skbuff_dma = kmalloc_array(rx_rsize, |
475 | sizeof(dma_addr_t), GFP_KERNEL); | 475 | sizeof(dma_addr_t), GFP_KERNEL); |
476 | if (rx_ring->rx_skbuff_dma == NULL) | 476 | if (!rx_ring->rx_skbuff_dma) { |
477 | goto dmamem_err; | 477 | dma_free_coherent(priv->device, |
478 | rx_rsize * sizeof(struct sxgbe_rx_norm_desc), | ||
479 | rx_ring->dma_rx, rx_ring->dma_rx_phy); | ||
480 | goto error; | ||
481 | } | ||
478 | 482 | ||
479 | rx_ring->rx_skbuff = kmalloc_array(rx_rsize, | 483 | rx_ring->rx_skbuff = kmalloc_array(rx_rsize, |
480 | sizeof(struct sk_buff *), GFP_KERNEL); | 484 | sizeof(struct sk_buff *), GFP_KERNEL); |
481 | if (rx_ring->rx_skbuff == NULL) | 485 | if (!rx_ring->rx_skbuff) { |
482 | goto rxbuff_err; | 486 | kfree(rx_ring->rx_skbuff_dma); |
487 | goto error; | ||
488 | } | ||
483 | 489 | ||
484 | /* initialise the buffers */ | 490 | /* initialise the buffers */ |
485 | for (desc_index = 0; desc_index < rx_rsize; desc_index++) { | 491 | for (desc_index = 0; desc_index < rx_rsize; desc_index++) { |
@@ -501,13 +507,6 @@ static int init_rx_ring(struct net_device *dev, u8 queue_no, | |||
501 | err_init_rx_buffers: | 507 | err_init_rx_buffers: |
502 | while (--desc_index >= 0) | 508 | while (--desc_index >= 0) |
503 | free_rx_ring(priv->device, rx_ring, desc_index); | 509 | free_rx_ring(priv->device, rx_ring, desc_index); |
504 | kfree(rx_ring->rx_skbuff); | ||
505 | rxbuff_err: | ||
506 | kfree(rx_ring->rx_skbuff_dma); | ||
507 | dmamem_err: | ||
508 | dma_free_coherent(priv->device, | ||
509 | rx_rsize * sizeof(struct sxgbe_rx_norm_desc), | ||
510 | rx_ring->dma_rx, rx_ring->dma_rx_phy); | ||
511 | error: | 510 | error: |
512 | return -ENOMEM; | 511 | return -ENOMEM; |
513 | } | 512 | } |
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c b/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c index 866560ea9e18..b02eed12bfc5 100644 --- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c +++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c | |||
@@ -108,10 +108,6 @@ static int sxgbe_platform_probe(struct platform_device *pdev) | |||
108 | } | 108 | } |
109 | } | 109 | } |
110 | 110 | ||
111 | /* Get MAC address if available (DT) */ | ||
112 | if (mac) | ||
113 | ether_addr_copy(priv->dev->dev_addr, mac); | ||
114 | |||
115 | priv = sxgbe_drv_probe(&(pdev->dev), plat_dat, addr); | 111 | priv = sxgbe_drv_probe(&(pdev->dev), plat_dat, addr); |
116 | if (!priv) { | 112 | if (!priv) { |
117 | pr_err("%s: main driver probe failed\n", __func__); | 113 | pr_err("%s: main driver probe failed\n", __func__); |
@@ -125,6 +121,10 @@ static int sxgbe_platform_probe(struct platform_device *pdev) | |||
125 | goto err_drv_remove; | 121 | goto err_drv_remove; |
126 | } | 122 | } |
127 | 123 | ||
124 | /* Get MAC address if available (DT) */ | ||
125 | if (mac) | ||
126 | ether_addr_copy(priv->dev->dev_addr, mac); | ||
127 | |||
128 | /* Get the TX/RX IRQ numbers */ | 128 | /* Get the TX/RX IRQ numbers */ |
129 | for (i = 0, chan = 1; i < SXGBE_TX_QUEUES; i++) { | 129 | for (i = 0, chan = 1; i < SXGBE_TX_QUEUES; i++) { |
130 | priv->txq[i]->irq_no = irq_of_parse_and_map(node, chan++); | 130 | priv->txq[i]->irq_no = irq_of_parse_and_map(node, chan++); |
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index 5ef493aa5387..9c11c4d0f3fd 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | |||
@@ -2795,6 +2795,9 @@ static int stmmac_hw_init(struct stmmac_priv *priv) | |||
2795 | * @addr: iobase memory address | 2795 | * @addr: iobase memory address |
2796 | * Description: this is the main probe function used to | 2796 | * Description: this is the main probe function used to |
2797 | * call the alloc_etherdev, allocate the priv structure. | 2797 | * call the alloc_etherdev, allocate the priv structure. |
2798 | * Return: | ||
2799 | * on success the new private structure is returned, otherwise the error | ||
2800 | * pointer. | ||
2798 | */ | 2801 | */ |
2799 | struct stmmac_priv *stmmac_dvr_probe(struct device *device, | 2802 | struct stmmac_priv *stmmac_dvr_probe(struct device *device, |
2800 | struct plat_stmmacenet_data *plat_dat, | 2803 | struct plat_stmmacenet_data *plat_dat, |
@@ -2806,7 +2809,7 @@ struct stmmac_priv *stmmac_dvr_probe(struct device *device, | |||
2806 | 2809 | ||
2807 | ndev = alloc_etherdev(sizeof(struct stmmac_priv)); | 2810 | ndev = alloc_etherdev(sizeof(struct stmmac_priv)); |
2808 | if (!ndev) | 2811 | if (!ndev) |
2809 | return NULL; | 2812 | return ERR_PTR(-ENOMEM); |
2810 | 2813 | ||
2811 | SET_NETDEV_DEV(ndev, device); | 2814 | SET_NETDEV_DEV(ndev, device); |
2812 | 2815 | ||
diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c index a1ba3a0c28da..2b9d404f8586 100644 --- a/drivers/net/ethernet/ti/cpsw.c +++ b/drivers/net/ethernet/ti/cpsw.c | |||
@@ -1643,16 +1643,24 @@ static inline int cpsw_add_vlan_ale_entry(struct cpsw_priv *priv, | |||
1643 | unsigned short vid) | 1643 | unsigned short vid) |
1644 | { | 1644 | { |
1645 | int ret; | 1645 | int ret; |
1646 | int unreg_mcast_mask; | 1646 | int unreg_mcast_mask = 0; |
1647 | u32 port_mask; | ||
1647 | 1648 | ||
1648 | if (priv->ndev->flags & IFF_ALLMULTI) | 1649 | if (priv->data.dual_emac) { |
1649 | unreg_mcast_mask = ALE_ALL_PORTS; | 1650 | port_mask = (1 << (priv->emac_port + 1)) | ALE_PORT_HOST; |
1650 | else | ||
1651 | unreg_mcast_mask = ALE_PORT_1 | ALE_PORT_2; | ||
1652 | 1651 | ||
1653 | ret = cpsw_ale_add_vlan(priv->ale, vid, | 1652 | if (priv->ndev->flags & IFF_ALLMULTI) |
1654 | ALE_ALL_PORTS << priv->host_port, | 1653 | unreg_mcast_mask = port_mask; |
1655 | 0, ALE_ALL_PORTS << priv->host_port, | 1654 | } else { |
1655 | port_mask = ALE_ALL_PORTS; | ||
1656 | |||
1657 | if (priv->ndev->flags & IFF_ALLMULTI) | ||
1658 | unreg_mcast_mask = ALE_ALL_PORTS; | ||
1659 | else | ||
1660 | unreg_mcast_mask = ALE_PORT_1 | ALE_PORT_2; | ||
1661 | } | ||
1662 | |||
1663 | ret = cpsw_ale_add_vlan(priv->ale, vid, port_mask, 0, port_mask, | ||
1656 | unreg_mcast_mask << priv->host_port); | 1664 | unreg_mcast_mask << priv->host_port); |
1657 | if (ret != 0) | 1665 | if (ret != 0) |
1658 | return ret; | 1666 | return ret; |
@@ -1663,8 +1671,7 @@ static inline int cpsw_add_vlan_ale_entry(struct cpsw_priv *priv, | |||
1663 | goto clean_vid; | 1671 | goto clean_vid; |
1664 | 1672 | ||
1665 | ret = cpsw_ale_add_mcast(priv->ale, priv->ndev->broadcast, | 1673 | ret = cpsw_ale_add_mcast(priv->ale, priv->ndev->broadcast, |
1666 | ALE_ALL_PORTS << priv->host_port, | 1674 | port_mask, ALE_VLAN, vid, 0); |
1667 | ALE_VLAN, vid, 0); | ||
1668 | if (ret != 0) | 1675 | if (ret != 0) |
1669 | goto clean_vlan_ucast; | 1676 | goto clean_vlan_ucast; |
1670 | return 0; | 1677 | return 0; |
@@ -1685,6 +1692,19 @@ static int cpsw_ndo_vlan_rx_add_vid(struct net_device *ndev, | |||
1685 | if (vid == priv->data.default_vlan) | 1692 | if (vid == priv->data.default_vlan) |
1686 | return 0; | 1693 | return 0; |
1687 | 1694 | ||
1695 | if (priv->data.dual_emac) { | ||
1696 | /* In dual EMAC, reserved VLAN id should not be used for | ||
1697 | * creating VLAN interfaces as this can break the dual | ||
1698 | * EMAC port separation | ||
1699 | */ | ||
1700 | int i; | ||
1701 | |||
1702 | for (i = 0; i < priv->data.slaves; i++) { | ||
1703 | if (vid == priv->slaves[i].port_vlan) | ||
1704 | return -EINVAL; | ||
1705 | } | ||
1706 | } | ||
1707 | |||
1688 | dev_info(priv->dev, "Adding vlanid %d to vlan filter\n", vid); | 1708 | dev_info(priv->dev, "Adding vlanid %d to vlan filter\n", vid); |
1689 | return cpsw_add_vlan_ale_entry(priv, vid); | 1709 | return cpsw_add_vlan_ale_entry(priv, vid); |
1690 | } | 1710 | } |
@@ -1698,6 +1718,15 @@ static int cpsw_ndo_vlan_rx_kill_vid(struct net_device *ndev, | |||
1698 | if (vid == priv->data.default_vlan) | 1718 | if (vid == priv->data.default_vlan) |
1699 | return 0; | 1719 | return 0; |
1700 | 1720 | ||
1721 | if (priv->data.dual_emac) { | ||
1722 | int i; | ||
1723 | |||
1724 | for (i = 0; i < priv->data.slaves; i++) { | ||
1725 | if (vid == priv->slaves[i].port_vlan) | ||
1726 | return -EINVAL; | ||
1727 | } | ||
1728 | } | ||
1729 | |||
1701 | dev_info(priv->dev, "removing vlanid %d from vlan filter\n", vid); | 1730 | dev_info(priv->dev, "removing vlanid %d from vlan filter\n", vid); |
1702 | ret = cpsw_ale_del_vlan(priv->ale, vid, 0); | 1731 | ret = cpsw_ale_del_vlan(priv->ale, vid, 0); |
1703 | if (ret != 0) | 1732 | if (ret != 0) |
diff --git a/drivers/net/ethernet/ti/davinci_emac.c b/drivers/net/ethernet/ti/davinci_emac.c index ea712512c7d1..5fae4354722c 100644 --- a/drivers/net/ethernet/ti/davinci_emac.c +++ b/drivers/net/ethernet/ti/davinci_emac.c | |||
@@ -62,6 +62,7 @@ | |||
62 | #include <linux/of.h> | 62 | #include <linux/of.h> |
63 | #include <linux/of_address.h> | 63 | #include <linux/of_address.h> |
64 | #include <linux/of_device.h> | 64 | #include <linux/of_device.h> |
65 | #include <linux/of_mdio.h> | ||
65 | #include <linux/of_irq.h> | 66 | #include <linux/of_irq.h> |
66 | #include <linux/of_net.h> | 67 | #include <linux/of_net.h> |
67 | 68 | ||
@@ -343,9 +344,7 @@ struct emac_priv { | |||
343 | u32 multicast_hash_cnt[EMAC_NUM_MULTICAST_BITS]; | 344 | u32 multicast_hash_cnt[EMAC_NUM_MULTICAST_BITS]; |
344 | u32 rx_addr_type; | 345 | u32 rx_addr_type; |
345 | const char *phy_id; | 346 | const char *phy_id; |
346 | #ifdef CONFIG_OF | ||
347 | struct device_node *phy_node; | 347 | struct device_node *phy_node; |
348 | #endif | ||
349 | struct phy_device *phydev; | 348 | struct phy_device *phydev; |
350 | spinlock_t lock; | 349 | spinlock_t lock; |
351 | /*platform specific members*/ | 350 | /*platform specific members*/ |
@@ -922,6 +921,16 @@ static void emac_int_disable(struct emac_priv *priv) | |||
922 | if (priv->int_disable) | 921 | if (priv->int_disable) |
923 | priv->int_disable(); | 922 | priv->int_disable(); |
924 | 923 | ||
924 | /* NOTE: Rx Threshold and Misc interrupts are not enabled */ | ||
925 | |||
926 | /* ack rxen only then a new pulse will be generated */ | ||
927 | emac_write(EMAC_DM646X_MACEOIVECTOR, | ||
928 | EMAC_DM646X_MAC_EOI_C0_RXEN); | ||
929 | |||
930 | /* ack txen- only then a new pulse will be generated */ | ||
931 | emac_write(EMAC_DM646X_MACEOIVECTOR, | ||
932 | EMAC_DM646X_MAC_EOI_C0_TXEN); | ||
933 | |||
925 | local_irq_restore(flags); | 934 | local_irq_restore(flags); |
926 | 935 | ||
927 | } else { | 936 | } else { |
@@ -951,15 +960,6 @@ static void emac_int_enable(struct emac_priv *priv) | |||
951 | * register */ | 960 | * register */ |
952 | 961 | ||
953 | /* NOTE: Rx Threshold and Misc interrupts are not enabled */ | 962 | /* NOTE: Rx Threshold and Misc interrupts are not enabled */ |
954 | |||
955 | /* ack rxen only then a new pulse will be generated */ | ||
956 | emac_write(EMAC_DM646X_MACEOIVECTOR, | ||
957 | EMAC_DM646X_MAC_EOI_C0_RXEN); | ||
958 | |||
959 | /* ack txen- only then a new pulse will be generated */ | ||
960 | emac_write(EMAC_DM646X_MACEOIVECTOR, | ||
961 | EMAC_DM646X_MAC_EOI_C0_TXEN); | ||
962 | |||
963 | } else { | 963 | } else { |
964 | /* Set DM644x control registers for interrupt control */ | 964 | /* Set DM644x control registers for interrupt control */ |
965 | emac_ctrl_write(EMAC_CTRL_EWCTL, 0x1); | 965 | emac_ctrl_write(EMAC_CTRL_EWCTL, 0x1); |
@@ -1537,7 +1537,13 @@ static int emac_dev_open(struct net_device *ndev) | |||
1537 | int i = 0; | 1537 | int i = 0; |
1538 | struct emac_priv *priv = netdev_priv(ndev); | 1538 | struct emac_priv *priv = netdev_priv(ndev); |
1539 | 1539 | ||
1540 | pm_runtime_get(&priv->pdev->dev); | 1540 | ret = pm_runtime_get_sync(&priv->pdev->dev); |
1541 | if (ret < 0) { | ||
1542 | pm_runtime_put_noidle(&priv->pdev->dev); | ||
1543 | dev_err(&priv->pdev->dev, "%s: failed to get_sync(%d)\n", | ||
1544 | __func__, ret); | ||
1545 | return ret; | ||
1546 | } | ||
1541 | 1547 | ||
1542 | netif_carrier_off(ndev); | 1548 | netif_carrier_off(ndev); |
1543 | for (cnt = 0; cnt < ETH_ALEN; cnt++) | 1549 | for (cnt = 0; cnt < ETH_ALEN; cnt++) |
@@ -1596,8 +1602,20 @@ static int emac_dev_open(struct net_device *ndev) | |||
1596 | cpdma_ctlr_start(priv->dma); | 1602 | cpdma_ctlr_start(priv->dma); |
1597 | 1603 | ||
1598 | priv->phydev = NULL; | 1604 | priv->phydev = NULL; |
1605 | |||
1606 | if (priv->phy_node) { | ||
1607 | priv->phydev = of_phy_connect(ndev, priv->phy_node, | ||
1608 | &emac_adjust_link, 0, 0); | ||
1609 | if (!priv->phydev) { | ||
1610 | dev_err(emac_dev, "could not connect to phy %s\n", | ||
1611 | priv->phy_node->full_name); | ||
1612 | ret = -ENODEV; | ||
1613 | goto err; | ||
1614 | } | ||
1615 | } | ||
1616 | |||
1599 | /* use the first phy on the bus if pdata did not give us a phy id */ | 1617 | /* use the first phy on the bus if pdata did not give us a phy id */ |
1600 | if (!priv->phy_id) { | 1618 | if (!priv->phydev && !priv->phy_id) { |
1601 | struct device *phy; | 1619 | struct device *phy; |
1602 | 1620 | ||
1603 | phy = bus_find_device(&mdio_bus_type, NULL, NULL, | 1621 | phy = bus_find_device(&mdio_bus_type, NULL, NULL, |
@@ -1606,7 +1624,7 @@ static int emac_dev_open(struct net_device *ndev) | |||
1606 | priv->phy_id = dev_name(phy); | 1624 | priv->phy_id = dev_name(phy); |
1607 | } | 1625 | } |
1608 | 1626 | ||
1609 | if (priv->phy_id && *priv->phy_id) { | 1627 | if (!priv->phydev && priv->phy_id && *priv->phy_id) { |
1610 | priv->phydev = phy_connect(ndev, priv->phy_id, | 1628 | priv->phydev = phy_connect(ndev, priv->phy_id, |
1611 | &emac_adjust_link, | 1629 | &emac_adjust_link, |
1612 | PHY_INTERFACE_MODE_MII); | 1630 | PHY_INTERFACE_MODE_MII); |
@@ -1627,7 +1645,9 @@ static int emac_dev_open(struct net_device *ndev) | |||
1627 | "(mii_bus:phy_addr=%s, id=%x)\n", | 1645 | "(mii_bus:phy_addr=%s, id=%x)\n", |
1628 | priv->phydev->drv->name, dev_name(&priv->phydev->dev), | 1646 | priv->phydev->drv->name, dev_name(&priv->phydev->dev), |
1629 | priv->phydev->phy_id); | 1647 | priv->phydev->phy_id); |
1630 | } else { | 1648 | } |
1649 | |||
1650 | if (!priv->phydev) { | ||
1631 | /* No PHY , fix the link, speed and duplex settings */ | 1651 | /* No PHY , fix the link, speed and duplex settings */ |
1632 | dev_notice(emac_dev, "no phy, defaulting to 100/full\n"); | 1652 | dev_notice(emac_dev, "no phy, defaulting to 100/full\n"); |
1633 | priv->link = 1; | 1653 | priv->link = 1; |
@@ -1724,6 +1744,15 @@ static struct net_device_stats *emac_dev_getnetstats(struct net_device *ndev) | |||
1724 | struct emac_priv *priv = netdev_priv(ndev); | 1744 | struct emac_priv *priv = netdev_priv(ndev); |
1725 | u32 mac_control; | 1745 | u32 mac_control; |
1726 | u32 stats_clear_mask; | 1746 | u32 stats_clear_mask; |
1747 | int err; | ||
1748 | |||
1749 | err = pm_runtime_get_sync(&priv->pdev->dev); | ||
1750 | if (err < 0) { | ||
1751 | pm_runtime_put_noidle(&priv->pdev->dev); | ||
1752 | dev_err(&priv->pdev->dev, "%s: failed to get_sync(%d)\n", | ||
1753 | __func__, err); | ||
1754 | return &ndev->stats; | ||
1755 | } | ||
1727 | 1756 | ||
1728 | /* update emac hardware stats and reset the registers*/ | 1757 | /* update emac hardware stats and reset the registers*/ |
1729 | 1758 | ||
@@ -1766,6 +1795,8 @@ static struct net_device_stats *emac_dev_getnetstats(struct net_device *ndev) | |||
1766 | ndev->stats.tx_fifo_errors += emac_read(EMAC_TXUNDERRUN); | 1795 | ndev->stats.tx_fifo_errors += emac_read(EMAC_TXUNDERRUN); |
1767 | emac_write(EMAC_TXUNDERRUN, stats_clear_mask); | 1796 | emac_write(EMAC_TXUNDERRUN, stats_clear_mask); |
1768 | 1797 | ||
1798 | pm_runtime_put(&priv->pdev->dev); | ||
1799 | |||
1769 | return &ndev->stats; | 1800 | return &ndev->stats; |
1770 | } | 1801 | } |
1771 | 1802 | ||
@@ -1859,7 +1890,7 @@ davinci_emac_of_get_pdata(struct platform_device *pdev, struct emac_priv *priv) | |||
1859 | static int davinci_emac_probe(struct platform_device *pdev) | 1890 | static int davinci_emac_probe(struct platform_device *pdev) |
1860 | { | 1891 | { |
1861 | int rc = 0; | 1892 | int rc = 0; |
1862 | struct resource *res; | 1893 | struct resource *res, *res_ctrl; |
1863 | struct net_device *ndev; | 1894 | struct net_device *ndev; |
1864 | struct emac_priv *priv; | 1895 | struct emac_priv *priv; |
1865 | unsigned long hw_ram_addr; | 1896 | unsigned long hw_ram_addr; |
@@ -1876,6 +1907,7 @@ static int davinci_emac_probe(struct platform_device *pdev) | |||
1876 | return -EBUSY; | 1907 | return -EBUSY; |
1877 | } | 1908 | } |
1878 | emac_bus_frequency = clk_get_rate(emac_clk); | 1909 | emac_bus_frequency = clk_get_rate(emac_clk); |
1910 | devm_clk_put(&pdev->dev, emac_clk); | ||
1879 | 1911 | ||
1880 | /* TODO: Probe PHY here if possible */ | 1912 | /* TODO: Probe PHY here if possible */ |
1881 | 1913 | ||
@@ -1917,11 +1949,20 @@ static int davinci_emac_probe(struct platform_device *pdev) | |||
1917 | rc = PTR_ERR(priv->remap_addr); | 1949 | rc = PTR_ERR(priv->remap_addr); |
1918 | goto no_pdata; | 1950 | goto no_pdata; |
1919 | } | 1951 | } |
1952 | |||
1953 | res_ctrl = platform_get_resource(pdev, IORESOURCE_MEM, 1); | ||
1954 | if (res_ctrl) { | ||
1955 | priv->ctrl_base = | ||
1956 | devm_ioremap_resource(&pdev->dev, res_ctrl); | ||
1957 | if (IS_ERR(priv->ctrl_base)) | ||
1958 | goto no_pdata; | ||
1959 | } else { | ||
1960 | priv->ctrl_base = priv->remap_addr + pdata->ctrl_mod_reg_offset; | ||
1961 | } | ||
1962 | |||
1920 | priv->emac_base = priv->remap_addr + pdata->ctrl_reg_offset; | 1963 | priv->emac_base = priv->remap_addr + pdata->ctrl_reg_offset; |
1921 | ndev->base_addr = (unsigned long)priv->remap_addr; | 1964 | ndev->base_addr = (unsigned long)priv->remap_addr; |
1922 | 1965 | ||
1923 | priv->ctrl_base = priv->remap_addr + pdata->ctrl_mod_reg_offset; | ||
1924 | |||
1925 | hw_ram_addr = pdata->hw_ram_addr; | 1966 | hw_ram_addr = pdata->hw_ram_addr; |
1926 | if (!hw_ram_addr) | 1967 | if (!hw_ram_addr) |
1927 | hw_ram_addr = (u32 __force)res->start + pdata->ctrl_ram_offset; | 1968 | hw_ram_addr = (u32 __force)res->start + pdata->ctrl_ram_offset; |
@@ -1980,12 +2021,22 @@ static int davinci_emac_probe(struct platform_device *pdev) | |||
1980 | ndev->ethtool_ops = ðtool_ops; | 2021 | ndev->ethtool_ops = ðtool_ops; |
1981 | netif_napi_add(ndev, &priv->napi, emac_poll, EMAC_POLL_WEIGHT); | 2022 | netif_napi_add(ndev, &priv->napi, emac_poll, EMAC_POLL_WEIGHT); |
1982 | 2023 | ||
2024 | pm_runtime_enable(&pdev->dev); | ||
2025 | rc = pm_runtime_get_sync(&pdev->dev); | ||
2026 | if (rc < 0) { | ||
2027 | pm_runtime_put_noidle(&pdev->dev); | ||
2028 | dev_err(&pdev->dev, "%s: failed to get_sync(%d)\n", | ||
2029 | __func__, rc); | ||
2030 | goto no_cpdma_chan; | ||
2031 | } | ||
2032 | |||
1983 | /* register the network device */ | 2033 | /* register the network device */ |
1984 | SET_NETDEV_DEV(ndev, &pdev->dev); | 2034 | SET_NETDEV_DEV(ndev, &pdev->dev); |
1985 | rc = register_netdev(ndev); | 2035 | rc = register_netdev(ndev); |
1986 | if (rc) { | 2036 | if (rc) { |
1987 | dev_err(&pdev->dev, "error in register_netdev\n"); | 2037 | dev_err(&pdev->dev, "error in register_netdev\n"); |
1988 | rc = -ENODEV; | 2038 | rc = -ENODEV; |
2039 | pm_runtime_put(&pdev->dev); | ||
1989 | goto no_cpdma_chan; | 2040 | goto no_cpdma_chan; |
1990 | } | 2041 | } |
1991 | 2042 | ||
@@ -1995,9 +2046,7 @@ static int davinci_emac_probe(struct platform_device *pdev) | |||
1995 | "(regs: %p, irq: %d)\n", | 2046 | "(regs: %p, irq: %d)\n", |
1996 | (void *)priv->emac_base_phys, ndev->irq); | 2047 | (void *)priv->emac_base_phys, ndev->irq); |
1997 | } | 2048 | } |
1998 | 2049 | pm_runtime_put(&pdev->dev); | |
1999 | pm_runtime_enable(&pdev->dev); | ||
2000 | pm_runtime_resume(&pdev->dev); | ||
2001 | 2050 | ||
2002 | return 0; | 2051 | return 0; |
2003 | 2052 | ||
@@ -2071,9 +2120,14 @@ static const struct emac_platform_data am3517_emac_data = { | |||
2071 | .hw_ram_addr = 0x01e20000, | 2120 | .hw_ram_addr = 0x01e20000, |
2072 | }; | 2121 | }; |
2073 | 2122 | ||
2123 | static const struct emac_platform_data dm816_emac_data = { | ||
2124 | .version = EMAC_VERSION_2, | ||
2125 | }; | ||
2126 | |||
2074 | static const struct of_device_id davinci_emac_of_match[] = { | 2127 | static const struct of_device_id davinci_emac_of_match[] = { |
2075 | {.compatible = "ti,davinci-dm6467-emac", }, | 2128 | {.compatible = "ti,davinci-dm6467-emac", }, |
2076 | {.compatible = "ti,am3517-emac", .data = &am3517_emac_data, }, | 2129 | {.compatible = "ti,am3517-emac", .data = &am3517_emac_data, }, |
2130 | {.compatible = "ti,dm816-emac", .data = &dm816_emac_data, }, | ||
2077 | {}, | 2131 | {}, |
2078 | }; | 2132 | }; |
2079 | MODULE_DEVICE_TABLE(of, davinci_emac_of_match); | 2133 | MODULE_DEVICE_TABLE(of, davinci_emac_of_match); |
diff --git a/drivers/net/ipvlan/ipvlan_core.c b/drivers/net/ipvlan/ipvlan_core.c index a14d87783245..2e195289ddf4 100644 --- a/drivers/net/ipvlan/ipvlan_core.c +++ b/drivers/net/ipvlan/ipvlan_core.c | |||
@@ -377,9 +377,11 @@ static int ipvlan_process_v6_outbound(struct sk_buff *skb) | |||
377 | }; | 377 | }; |
378 | 378 | ||
379 | dst = ip6_route_output(dev_net(dev), NULL, &fl6); | 379 | dst = ip6_route_output(dev_net(dev), NULL, &fl6); |
380 | if (IS_ERR(dst)) | 380 | if (dst->error) { |
381 | ret = dst->error; | ||
382 | dst_release(dst); | ||
381 | goto err; | 383 | goto err; |
382 | 384 | } | |
383 | skb_dst_drop(skb); | 385 | skb_dst_drop(skb); |
384 | skb_dst_set(skb, dst); | 386 | skb_dst_set(skb, dst); |
385 | err = ip6_local_out(skb); | 387 | err = ip6_local_out(skb); |
diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index 2e2244221cbe..b74a272243ae 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c | |||
@@ -834,9 +834,6 @@ static void ocp_write_word(struct r8152 *tp, u16 type, u16 index, u32 data) | |||
834 | index &= ~3; | 834 | index &= ~3; |
835 | } | 835 | } |
836 | 836 | ||
837 | generic_ocp_read(tp, index, sizeof(tmp), &tmp, type); | ||
838 | |||
839 | data |= __le32_to_cpu(tmp) & ~mask; | ||
840 | tmp = __cpu_to_le32(data); | 837 | tmp = __cpu_to_le32(data); |
841 | 838 | ||
842 | generic_ocp_write(tp, index, byen, sizeof(tmp), &tmp, type); | 839 | generic_ocp_write(tp, index, byen, sizeof(tmp), &tmp, type); |
@@ -875,9 +872,6 @@ static void ocp_write_byte(struct r8152 *tp, u16 type, u16 index, u32 data) | |||
875 | index &= ~3; | 872 | index &= ~3; |
876 | } | 873 | } |
877 | 874 | ||
878 | generic_ocp_read(tp, index, sizeof(tmp), &tmp, type); | ||
879 | |||
880 | data |= __le32_to_cpu(tmp) & ~mask; | ||
881 | tmp = __cpu_to_le32(data); | 875 | tmp = __cpu_to_le32(data); |
882 | 876 | ||
883 | generic_ocp_write(tp, index, byen, sizeof(tmp), &tmp, type); | 877 | generic_ocp_write(tp, index, byen, sizeof(tmp), &tmp, type); |
@@ -927,12 +921,6 @@ static void sram_write(struct r8152 *tp, u16 addr, u16 data) | |||
927 | ocp_reg_write(tp, OCP_SRAM_DATA, data); | 921 | ocp_reg_write(tp, OCP_SRAM_DATA, data); |
928 | } | 922 | } |
929 | 923 | ||
930 | static u16 sram_read(struct r8152 *tp, u16 addr) | ||
931 | { | ||
932 | ocp_reg_write(tp, OCP_SRAM_ADDR, addr); | ||
933 | return ocp_reg_read(tp, OCP_SRAM_DATA); | ||
934 | } | ||
935 | |||
936 | static int read_mii_word(struct net_device *netdev, int phy_id, int reg) | 924 | static int read_mii_word(struct net_device *netdev, int phy_id, int reg) |
937 | { | 925 | { |
938 | struct r8152 *tp = netdev_priv(netdev); | 926 | struct r8152 *tp = netdev_priv(netdev); |
@@ -2573,24 +2561,18 @@ static void r8153_hw_phy_cfg(struct r8152 *tp) | |||
2573 | data = ocp_reg_read(tp, OCP_POWER_CFG); | 2561 | data = ocp_reg_read(tp, OCP_POWER_CFG); |
2574 | data |= EN_10M_PLLOFF; | 2562 | data |= EN_10M_PLLOFF; |
2575 | ocp_reg_write(tp, OCP_POWER_CFG, data); | 2563 | ocp_reg_write(tp, OCP_POWER_CFG, data); |
2576 | data = sram_read(tp, SRAM_IMPEDANCE); | 2564 | sram_write(tp, SRAM_IMPEDANCE, 0x0b13); |
2577 | data &= ~RX_DRIVING_MASK; | ||
2578 | sram_write(tp, SRAM_IMPEDANCE, data); | ||
2579 | 2565 | ||
2580 | ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR); | 2566 | ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR); |
2581 | ocp_data |= PFM_PWM_SWITCH; | 2567 | ocp_data |= PFM_PWM_SWITCH; |
2582 | ocp_write_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR, ocp_data); | 2568 | ocp_write_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR, ocp_data); |
2583 | 2569 | ||
2584 | data = sram_read(tp, SRAM_LPF_CFG); | 2570 | /* Enable LPF corner auto tune */ |
2585 | data |= LPF_AUTO_TUNE; | 2571 | sram_write(tp, SRAM_LPF_CFG, 0xf70f); |
2586 | sram_write(tp, SRAM_LPF_CFG, data); | ||
2587 | 2572 | ||
2588 | data = sram_read(tp, SRAM_10M_AMP1); | 2573 | /* Adjust 10M Amplitude */ |
2589 | data |= GDAC_IB_UPALL; | 2574 | sram_write(tp, SRAM_10M_AMP1, 0x00af); |
2590 | sram_write(tp, SRAM_10M_AMP1, data); | 2575 | sram_write(tp, SRAM_10M_AMP2, 0x0208); |
2591 | data = sram_read(tp, SRAM_10M_AMP2); | ||
2592 | data |= AMP_DN; | ||
2593 | sram_write(tp, SRAM_10M_AMP2, data); | ||
2594 | 2576 | ||
2595 | set_bit(PHY_RESET, &tp->flags); | 2577 | set_bit(PHY_RESET, &tp->flags); |
2596 | } | 2578 | } |
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c index 9a72640237cb..62b0bf4fdf6b 100644 --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c | |||
@@ -285,6 +285,7 @@ static int ath_reset_internal(struct ath_softc *sc, struct ath9k_channel *hchan) | |||
285 | 285 | ||
286 | __ath_cancel_work(sc); | 286 | __ath_cancel_work(sc); |
287 | 287 | ||
288 | disable_irq(sc->irq); | ||
288 | tasklet_disable(&sc->intr_tq); | 289 | tasklet_disable(&sc->intr_tq); |
289 | tasklet_disable(&sc->bcon_tasklet); | 290 | tasklet_disable(&sc->bcon_tasklet); |
290 | spin_lock_bh(&sc->sc_pcu_lock); | 291 | spin_lock_bh(&sc->sc_pcu_lock); |
@@ -331,6 +332,7 @@ static int ath_reset_internal(struct ath_softc *sc, struct ath9k_channel *hchan) | |||
331 | r = -EIO; | 332 | r = -EIO; |
332 | 333 | ||
333 | out: | 334 | out: |
335 | enable_irq(sc->irq); | ||
334 | spin_unlock_bh(&sc->sc_pcu_lock); | 336 | spin_unlock_bh(&sc->sc_pcu_lock); |
335 | tasklet_enable(&sc->bcon_tasklet); | 337 | tasklet_enable(&sc->bcon_tasklet); |
336 | tasklet_enable(&sc->intr_tq); | 338 | tasklet_enable(&sc->intr_tq); |
@@ -512,9 +514,6 @@ irqreturn_t ath_isr(int irq, void *dev) | |||
512 | if (!ah || test_bit(ATH_OP_INVALID, &common->op_flags)) | 514 | if (!ah || test_bit(ATH_OP_INVALID, &common->op_flags)) |
513 | return IRQ_NONE; | 515 | return IRQ_NONE; |
514 | 516 | ||
515 | if (!AR_SREV_9100(ah) && test_bit(ATH_OP_HW_RESET, &common->op_flags)) | ||
516 | return IRQ_NONE; | ||
517 | |||
518 | /* shared irq, not for us */ | 517 | /* shared irq, not for us */ |
519 | if (!ath9k_hw_intrpend(ah)) | 518 | if (!ath9k_hw_intrpend(ah)) |
520 | return IRQ_NONE; | 519 | return IRQ_NONE; |
@@ -529,7 +528,7 @@ irqreturn_t ath_isr(int irq, void *dev) | |||
529 | ath9k_debug_sync_cause(sc, sync_cause); | 528 | ath9k_debug_sync_cause(sc, sync_cause); |
530 | status &= ah->imask; /* discard unasked-for bits */ | 529 | status &= ah->imask; /* discard unasked-for bits */ |
531 | 530 | ||
532 | if (AR_SREV_9100(ah) && test_bit(ATH_OP_HW_RESET, &common->op_flags)) | 531 | if (test_bit(ATH_OP_HW_RESET, &common->op_flags)) |
533 | return IRQ_HANDLED; | 532 | return IRQ_HANDLED; |
534 | 533 | ||
535 | /* | 534 | /* |
diff --git a/drivers/of/overlay.c b/drivers/of/overlay.c index ea63fbd228ed..352b4f28f82c 100644 --- a/drivers/of/overlay.c +++ b/drivers/of/overlay.c | |||
@@ -114,17 +114,6 @@ static int of_overlay_apply_single_device_node(struct of_overlay *ov, | |||
114 | ret = of_overlay_apply_one(ov, tchild, child); | 114 | ret = of_overlay_apply_one(ov, tchild, child); |
115 | if (ret) | 115 | if (ret) |
116 | return ret; | 116 | return ret; |
117 | |||
118 | /* The properties are already copied, now do the child nodes */ | ||
119 | for_each_child_of_node(child, grandchild) { | ||
120 | ret = of_overlay_apply_single_device_node(ov, tchild, grandchild); | ||
121 | if (ret) { | ||
122 | pr_err("%s: Failed to apply single node @%s/%s\n", | ||
123 | __func__, tchild->full_name, | ||
124 | grandchild->name); | ||
125 | return ret; | ||
126 | } | ||
127 | } | ||
128 | } | 117 | } |
129 | 118 | ||
130 | return ret; | 119 | return ret; |
diff --git a/drivers/of/platform.c b/drivers/of/platform.c index 5b33c6a21807..b0d50d70a8a1 100644 --- a/drivers/of/platform.c +++ b/drivers/of/platform.c | |||
@@ -188,7 +188,7 @@ static void of_dma_configure(struct device *dev) | |||
188 | size = dev->coherent_dma_mask; | 188 | size = dev->coherent_dma_mask; |
189 | } else { | 189 | } else { |
190 | offset = PFN_DOWN(paddr - dma_addr); | 190 | offset = PFN_DOWN(paddr - dma_addr); |
191 | dev_dbg(dev, "dma_pfn_offset(%#08lx)\n", dev->dma_pfn_offset); | 191 | dev_dbg(dev, "dma_pfn_offset(%#08lx)\n", offset); |
192 | } | 192 | } |
193 | dev->dma_pfn_offset = offset; | 193 | dev->dma_pfn_offset = offset; |
194 | 194 | ||
@@ -566,6 +566,10 @@ static int of_platform_notify(struct notifier_block *nb, | |||
566 | if (!of_node_check_flag(rd->dn->parent, OF_POPULATED_BUS)) | 566 | if (!of_node_check_flag(rd->dn->parent, OF_POPULATED_BUS)) |
567 | return NOTIFY_OK; /* not for us */ | 567 | return NOTIFY_OK; /* not for us */ |
568 | 568 | ||
569 | /* already populated? (driver using of_populate manually) */ | ||
570 | if (of_node_check_flag(rd->dn, OF_POPULATED)) | ||
571 | return NOTIFY_OK; | ||
572 | |||
569 | /* pdev_parent may be NULL when no bus platform device */ | 573 | /* pdev_parent may be NULL when no bus platform device */ |
570 | pdev_parent = of_find_device_by_node(rd->dn->parent); | 574 | pdev_parent = of_find_device_by_node(rd->dn->parent); |
571 | pdev = of_platform_device_create(rd->dn, NULL, | 575 | pdev = of_platform_device_create(rd->dn, NULL, |
@@ -581,6 +585,11 @@ static int of_platform_notify(struct notifier_block *nb, | |||
581 | break; | 585 | break; |
582 | 586 | ||
583 | case OF_RECONFIG_CHANGE_REMOVE: | 587 | case OF_RECONFIG_CHANGE_REMOVE: |
588 | |||
589 | /* already depopulated? */ | ||
590 | if (!of_node_check_flag(rd->dn, OF_POPULATED)) | ||
591 | return NOTIFY_OK; | ||
592 | |||
584 | /* find our device by node */ | 593 | /* find our device by node */ |
585 | pdev = of_find_device_by_node(rd->dn); | 594 | pdev = of_find_device_by_node(rd->dn); |
586 | if (pdev == NULL) | 595 | if (pdev == NULL) |
diff --git a/drivers/of/unittest-data/tests-overlay.dtsi b/drivers/of/unittest-data/tests-overlay.dtsi index 75976da22b2e..a2b687d5f324 100644 --- a/drivers/of/unittest-data/tests-overlay.dtsi +++ b/drivers/of/unittest-data/tests-overlay.dtsi | |||
@@ -176,5 +176,60 @@ | |||
176 | }; | 176 | }; |
177 | }; | 177 | }; |
178 | 178 | ||
179 | overlay10 { | ||
180 | fragment@0 { | ||
181 | target-path = "/testcase-data/overlay-node/test-bus"; | ||
182 | __overlay__ { | ||
183 | |||
184 | /* suppress DTC warning */ | ||
185 | #address-cells = <1>; | ||
186 | #size-cells = <0>; | ||
187 | |||
188 | test-selftest10 { | ||
189 | compatible = "selftest"; | ||
190 | status = "okay"; | ||
191 | reg = <10>; | ||
192 | |||
193 | #address-cells = <1>; | ||
194 | #size-cells = <0>; | ||
195 | |||
196 | test-selftest101 { | ||
197 | compatible = "selftest"; | ||
198 | status = "okay"; | ||
199 | reg = <1>; | ||
200 | }; | ||
201 | |||
202 | }; | ||
203 | }; | ||
204 | }; | ||
205 | }; | ||
206 | |||
207 | overlay11 { | ||
208 | fragment@0 { | ||
209 | target-path = "/testcase-data/overlay-node/test-bus"; | ||
210 | __overlay__ { | ||
211 | |||
212 | /* suppress DTC warning */ | ||
213 | #address-cells = <1>; | ||
214 | #size-cells = <0>; | ||
215 | |||
216 | test-selftest11 { | ||
217 | compatible = "selftest"; | ||
218 | status = "okay"; | ||
219 | reg = <11>; | ||
220 | |||
221 | #address-cells = <1>; | ||
222 | #size-cells = <0>; | ||
223 | |||
224 | test-selftest111 { | ||
225 | compatible = "selftest"; | ||
226 | status = "okay"; | ||
227 | reg = <1>; | ||
228 | }; | ||
229 | |||
230 | }; | ||
231 | }; | ||
232 | }; | ||
233 | }; | ||
179 | }; | 234 | }; |
180 | }; | 235 | }; |
diff --git a/drivers/of/unittest.c b/drivers/of/unittest.c index 844838e11ef1..41a4a138f53b 100644 --- a/drivers/of/unittest.c +++ b/drivers/of/unittest.c | |||
@@ -978,6 +978,9 @@ static int selftest_probe(struct platform_device *pdev) | |||
978 | } | 978 | } |
979 | 979 | ||
980 | dev_dbg(dev, "%s for node @%s\n", __func__, np->full_name); | 980 | dev_dbg(dev, "%s for node @%s\n", __func__, np->full_name); |
981 | |||
982 | of_platform_populate(np, NULL, NULL, &pdev->dev); | ||
983 | |||
981 | return 0; | 984 | return 0; |
982 | } | 985 | } |
983 | 986 | ||
@@ -1385,6 +1388,39 @@ static void of_selftest_overlay_8(void) | |||
1385 | selftest(1, "overlay test %d passed\n", 8); | 1388 | selftest(1, "overlay test %d passed\n", 8); |
1386 | } | 1389 | } |
1387 | 1390 | ||
1391 | /* test insertion of a bus with parent devices */ | ||
1392 | static void of_selftest_overlay_10(void) | ||
1393 | { | ||
1394 | int ret; | ||
1395 | char *child_path; | ||
1396 | |||
1397 | /* device should disable */ | ||
1398 | ret = of_selftest_apply_overlay_check(10, 10, 0, 1); | ||
1399 | if (selftest(ret == 0, "overlay test %d failed; overlay application\n", 10)) | ||
1400 | return; | ||
1401 | |||
1402 | child_path = kasprintf(GFP_KERNEL, "%s/test-selftest101", | ||
1403 | selftest_path(10)); | ||
1404 | if (selftest(child_path, "overlay test %d failed; kasprintf\n", 10)) | ||
1405 | return; | ||
1406 | |||
1407 | ret = of_path_platform_device_exists(child_path); | ||
1408 | kfree(child_path); | ||
1409 | if (selftest(ret, "overlay test %d failed; no child device\n", 10)) | ||
1410 | return; | ||
1411 | } | ||
1412 | |||
1413 | /* test insertion of a bus with parent devices (and revert) */ | ||
1414 | static void of_selftest_overlay_11(void) | ||
1415 | { | ||
1416 | int ret; | ||
1417 | |||
1418 | /* device should disable */ | ||
1419 | ret = of_selftest_apply_revert_overlay_check(11, 11, 0, 1); | ||
1420 | if (selftest(ret == 0, "overlay test %d failed; overlay application\n", 11)) | ||
1421 | return; | ||
1422 | } | ||
1423 | |||
1388 | static void __init of_selftest_overlay(void) | 1424 | static void __init of_selftest_overlay(void) |
1389 | { | 1425 | { |
1390 | struct device_node *bus_np = NULL; | 1426 | struct device_node *bus_np = NULL; |
@@ -1433,6 +1469,9 @@ static void __init of_selftest_overlay(void) | |||
1433 | of_selftest_overlay_6(); | 1469 | of_selftest_overlay_6(); |
1434 | of_selftest_overlay_8(); | 1470 | of_selftest_overlay_8(); |
1435 | 1471 | ||
1472 | of_selftest_overlay_10(); | ||
1473 | of_selftest_overlay_11(); | ||
1474 | |||
1436 | out: | 1475 | out: |
1437 | of_node_put(bus_np); | 1476 | of_node_put(bus_np); |
1438 | } | 1477 | } |
diff --git a/drivers/parisc/lba_pci.c b/drivers/parisc/lba_pci.c index 37e71ff6408d..dceb9ddfd99a 100644 --- a/drivers/parisc/lba_pci.c +++ b/drivers/parisc/lba_pci.c | |||
@@ -694,9 +694,8 @@ lba_fixup_bus(struct pci_bus *bus) | |||
694 | int i; | 694 | int i; |
695 | /* PCI-PCI Bridge */ | 695 | /* PCI-PCI Bridge */ |
696 | pci_read_bridge_bases(bus); | 696 | pci_read_bridge_bases(bus); |
697 | for (i = PCI_BRIDGE_RESOURCES; i < PCI_NUM_RESOURCES; i++) { | 697 | for (i = PCI_BRIDGE_RESOURCES; i < PCI_NUM_RESOURCES; i++) |
698 | pci_claim_resource(bus->self, i); | 698 | pci_claim_bridge_resource(bus->self, i); |
699 | } | ||
700 | } else { | 699 | } else { |
701 | /* Host-PCI Bridge */ | 700 | /* Host-PCI Bridge */ |
702 | int err; | 701 | int err; |
diff --git a/drivers/pci/bus.c b/drivers/pci/bus.c index 73aef51a28f0..8fb16188cd82 100644 --- a/drivers/pci/bus.c +++ b/drivers/pci/bus.c | |||
@@ -228,6 +228,49 @@ int pci_bus_alloc_resource(struct pci_bus *bus, struct resource *res, | |||
228 | } | 228 | } |
229 | EXPORT_SYMBOL(pci_bus_alloc_resource); | 229 | EXPORT_SYMBOL(pci_bus_alloc_resource); |
230 | 230 | ||
231 | /* | ||
232 | * The @idx resource of @dev should be a PCI-PCI bridge window. If this | ||
233 | * resource fits inside a window of an upstream bridge, do nothing. If it | ||
234 | * overlaps an upstream window but extends outside it, clip the resource so | ||
235 | * it fits completely inside. | ||
236 | */ | ||
237 | bool pci_bus_clip_resource(struct pci_dev *dev, int idx) | ||
238 | { | ||
239 | struct pci_bus *bus = dev->bus; | ||
240 | struct resource *res = &dev->resource[idx]; | ||
241 | struct resource orig_res = *res; | ||
242 | struct resource *r; | ||
243 | int i; | ||
244 | |||
245 | pci_bus_for_each_resource(bus, r, i) { | ||
246 | resource_size_t start, end; | ||
247 | |||
248 | if (!r) | ||
249 | continue; | ||
250 | |||
251 | if (resource_type(res) != resource_type(r)) | ||
252 | continue; | ||
253 | |||
254 | start = max(r->start, res->start); | ||
255 | end = min(r->end, res->end); | ||
256 | |||
257 | if (start > end) | ||
258 | continue; /* no overlap */ | ||
259 | |||
260 | if (res->start == start && res->end == end) | ||
261 | return false; /* no change */ | ||
262 | |||
263 | res->start = start; | ||
264 | res->end = end; | ||
265 | dev_printk(KERN_DEBUG, &dev->dev, "%pR clipped to %pR\n", | ||
266 | &orig_res, res); | ||
267 | |||
268 | return true; | ||
269 | } | ||
270 | |||
271 | return false; | ||
272 | } | ||
273 | |||
231 | void __weak pcibios_resource_survey_bus(struct pci_bus *bus) { } | 274 | void __weak pcibios_resource_survey_bus(struct pci_bus *bus) { } |
232 | 275 | ||
233 | /** | 276 | /** |
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index cab05f31223f..e9d4fd861ba1 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
@@ -3271,7 +3271,8 @@ static int pci_parent_bus_reset(struct pci_dev *dev, int probe) | |||
3271 | { | 3271 | { |
3272 | struct pci_dev *pdev; | 3272 | struct pci_dev *pdev; |
3273 | 3273 | ||
3274 | if (pci_is_root_bus(dev->bus) || dev->subordinate || !dev->bus->self) | 3274 | if (pci_is_root_bus(dev->bus) || dev->subordinate || |
3275 | !dev->bus->self || dev->dev_flags & PCI_DEV_FLAGS_NO_BUS_RESET) | ||
3275 | return -ENOTTY; | 3276 | return -ENOTTY; |
3276 | 3277 | ||
3277 | list_for_each_entry(pdev, &dev->bus->devices, bus_list) | 3278 | list_for_each_entry(pdev, &dev->bus->devices, bus_list) |
@@ -3305,7 +3306,8 @@ static int pci_dev_reset_slot_function(struct pci_dev *dev, int probe) | |||
3305 | { | 3306 | { |
3306 | struct pci_dev *pdev; | 3307 | struct pci_dev *pdev; |
3307 | 3308 | ||
3308 | if (dev->subordinate || !dev->slot) | 3309 | if (dev->subordinate || !dev->slot || |
3310 | dev->dev_flags & PCI_DEV_FLAGS_NO_BUS_RESET) | ||
3309 | return -ENOTTY; | 3311 | return -ENOTTY; |
3310 | 3312 | ||
3311 | list_for_each_entry(pdev, &dev->bus->devices, bus_list) | 3313 | list_for_each_entry(pdev, &dev->bus->devices, bus_list) |
@@ -3557,6 +3559,20 @@ int pci_try_reset_function(struct pci_dev *dev) | |||
3557 | } | 3559 | } |
3558 | EXPORT_SYMBOL_GPL(pci_try_reset_function); | 3560 | EXPORT_SYMBOL_GPL(pci_try_reset_function); |
3559 | 3561 | ||
3562 | /* Do any devices on or below this bus prevent a bus reset? */ | ||
3563 | static bool pci_bus_resetable(struct pci_bus *bus) | ||
3564 | { | ||
3565 | struct pci_dev *dev; | ||
3566 | |||
3567 | list_for_each_entry(dev, &bus->devices, bus_list) { | ||
3568 | if (dev->dev_flags & PCI_DEV_FLAGS_NO_BUS_RESET || | ||
3569 | (dev->subordinate && !pci_bus_resetable(dev->subordinate))) | ||
3570 | return false; | ||
3571 | } | ||
3572 | |||
3573 | return true; | ||
3574 | } | ||
3575 | |||
3560 | /* Lock devices from the top of the tree down */ | 3576 | /* Lock devices from the top of the tree down */ |
3561 | static void pci_bus_lock(struct pci_bus *bus) | 3577 | static void pci_bus_lock(struct pci_bus *bus) |
3562 | { | 3578 | { |
@@ -3607,6 +3623,22 @@ unlock: | |||
3607 | return 0; | 3623 | return 0; |
3608 | } | 3624 | } |
3609 | 3625 | ||
3626 | /* Do any devices on or below this slot prevent a bus reset? */ | ||
3627 | static bool pci_slot_resetable(struct pci_slot *slot) | ||
3628 | { | ||
3629 | struct pci_dev *dev; | ||
3630 | |||
3631 | list_for_each_entry(dev, &slot->bus->devices, bus_list) { | ||
3632 | if (!dev->slot || dev->slot != slot) | ||
3633 | continue; | ||
3634 | if (dev->dev_flags & PCI_DEV_FLAGS_NO_BUS_RESET || | ||
3635 | (dev->subordinate && !pci_bus_resetable(dev->subordinate))) | ||
3636 | return false; | ||
3637 | } | ||
3638 | |||
3639 | return true; | ||
3640 | } | ||
3641 | |||
3610 | /* Lock devices from the top of the tree down */ | 3642 | /* Lock devices from the top of the tree down */ |
3611 | static void pci_slot_lock(struct pci_slot *slot) | 3643 | static void pci_slot_lock(struct pci_slot *slot) |
3612 | { | 3644 | { |
@@ -3728,7 +3760,7 @@ static int pci_slot_reset(struct pci_slot *slot, int probe) | |||
3728 | { | 3760 | { |
3729 | int rc; | 3761 | int rc; |
3730 | 3762 | ||
3731 | if (!slot) | 3763 | if (!slot || !pci_slot_resetable(slot)) |
3732 | return -ENOTTY; | 3764 | return -ENOTTY; |
3733 | 3765 | ||
3734 | if (!probe) | 3766 | if (!probe) |
@@ -3820,7 +3852,7 @@ EXPORT_SYMBOL_GPL(pci_try_reset_slot); | |||
3820 | 3852 | ||
3821 | static int pci_bus_reset(struct pci_bus *bus, int probe) | 3853 | static int pci_bus_reset(struct pci_bus *bus, int probe) |
3822 | { | 3854 | { |
3823 | if (!bus->self) | 3855 | if (!bus->self || !pci_bus_resetable(bus)) |
3824 | return -ENOTTY; | 3856 | return -ENOTTY; |
3825 | 3857 | ||
3826 | if (probe) | 3858 | if (probe) |
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index 8aff29a804ff..d54632a1db43 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h | |||
@@ -208,6 +208,7 @@ void __pci_bus_size_bridges(struct pci_bus *bus, | |||
208 | void __pci_bus_assign_resources(const struct pci_bus *bus, | 208 | void __pci_bus_assign_resources(const struct pci_bus *bus, |
209 | struct list_head *realloc_head, | 209 | struct list_head *realloc_head, |
210 | struct list_head *fail_head); | 210 | struct list_head *fail_head); |
211 | bool pci_bus_clip_resource(struct pci_dev *dev, int idx); | ||
211 | 212 | ||
212 | /** | 213 | /** |
213 | * pci_ari_enabled - query ARI forwarding status | 214 | * pci_ari_enabled - query ARI forwarding status |
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index ed6f89b6efe5..e52356aa09b8 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
@@ -3028,6 +3028,20 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_REALTEK, 0x8169, | |||
3028 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MELLANOX, PCI_ANY_ID, | 3028 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MELLANOX, PCI_ANY_ID, |
3029 | quirk_broken_intx_masking); | 3029 | quirk_broken_intx_masking); |
3030 | 3030 | ||
3031 | static void quirk_no_bus_reset(struct pci_dev *dev) | ||
3032 | { | ||
3033 | dev->dev_flags |= PCI_DEV_FLAGS_NO_BUS_RESET; | ||
3034 | } | ||
3035 | |||
3036 | /* | ||
3037 | * Atheros AR93xx chips do not behave after a bus reset. The device will | ||
3038 | * throw a Link Down error on AER-capable systems and regardless of AER, | ||
3039 | * config space of the device is never accessible again and typically | ||
3040 | * causes the system to hang or reset when access is attempted. | ||
3041 | * http://www.spinics.net/lists/linux-pci/msg34797.html | ||
3042 | */ | ||
3043 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x0030, quirk_no_bus_reset); | ||
3044 | |||
3031 | #ifdef CONFIG_ACPI | 3045 | #ifdef CONFIG_ACPI |
3032 | /* | 3046 | /* |
3033 | * Apple: Shutdown Cactus Ridge Thunderbolt controller. | 3047 | * Apple: Shutdown Cactus Ridge Thunderbolt controller. |
diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c index 0482235eee92..e3e17f3c0f0f 100644 --- a/drivers/pci/setup-bus.c +++ b/drivers/pci/setup-bus.c | |||
@@ -530,9 +530,8 @@ EXPORT_SYMBOL(pci_setup_cardbus); | |||
530 | config space writes, so it's quite possible that an I/O window of | 530 | config space writes, so it's quite possible that an I/O window of |
531 | the bridge will have some undesirable address (e.g. 0) after the | 531 | the bridge will have some undesirable address (e.g. 0) after the |
532 | first write. Ditto 64-bit prefetchable MMIO. */ | 532 | first write. Ditto 64-bit prefetchable MMIO. */ |
533 | static void pci_setup_bridge_io(struct pci_bus *bus) | 533 | static void pci_setup_bridge_io(struct pci_dev *bridge) |
534 | { | 534 | { |
535 | struct pci_dev *bridge = bus->self; | ||
536 | struct resource *res; | 535 | struct resource *res; |
537 | struct pci_bus_region region; | 536 | struct pci_bus_region region; |
538 | unsigned long io_mask; | 537 | unsigned long io_mask; |
@@ -545,7 +544,7 @@ static void pci_setup_bridge_io(struct pci_bus *bus) | |||
545 | io_mask = PCI_IO_1K_RANGE_MASK; | 544 | io_mask = PCI_IO_1K_RANGE_MASK; |
546 | 545 | ||
547 | /* Set up the top and bottom of the PCI I/O segment for this bus. */ | 546 | /* Set up the top and bottom of the PCI I/O segment for this bus. */ |
548 | res = bus->resource[0]; | 547 | res = &bridge->resource[PCI_BRIDGE_RESOURCES + 0]; |
549 | pcibios_resource_to_bus(bridge->bus, ®ion, res); | 548 | pcibios_resource_to_bus(bridge->bus, ®ion, res); |
550 | if (res->flags & IORESOURCE_IO) { | 549 | if (res->flags & IORESOURCE_IO) { |
551 | pci_read_config_word(bridge, PCI_IO_BASE, &l); | 550 | pci_read_config_word(bridge, PCI_IO_BASE, &l); |
@@ -568,15 +567,14 @@ static void pci_setup_bridge_io(struct pci_bus *bus) | |||
568 | pci_write_config_dword(bridge, PCI_IO_BASE_UPPER16, io_upper16); | 567 | pci_write_config_dword(bridge, PCI_IO_BASE_UPPER16, io_upper16); |
569 | } | 568 | } |
570 | 569 | ||
571 | static void pci_setup_bridge_mmio(struct pci_bus *bus) | 570 | static void pci_setup_bridge_mmio(struct pci_dev *bridge) |
572 | { | 571 | { |
573 | struct pci_dev *bridge = bus->self; | ||
574 | struct resource *res; | 572 | struct resource *res; |
575 | struct pci_bus_region region; | 573 | struct pci_bus_region region; |
576 | u32 l; | 574 | u32 l; |
577 | 575 | ||
578 | /* Set up the top and bottom of the PCI Memory segment for this bus. */ | 576 | /* Set up the top and bottom of the PCI Memory segment for this bus. */ |
579 | res = bus->resource[1]; | 577 | res = &bridge->resource[PCI_BRIDGE_RESOURCES + 1]; |
580 | pcibios_resource_to_bus(bridge->bus, ®ion, res); | 578 | pcibios_resource_to_bus(bridge->bus, ®ion, res); |
581 | if (res->flags & IORESOURCE_MEM) { | 579 | if (res->flags & IORESOURCE_MEM) { |
582 | l = (region.start >> 16) & 0xfff0; | 580 | l = (region.start >> 16) & 0xfff0; |
@@ -588,9 +586,8 @@ static void pci_setup_bridge_mmio(struct pci_bus *bus) | |||
588 | pci_write_config_dword(bridge, PCI_MEMORY_BASE, l); | 586 | pci_write_config_dword(bridge, PCI_MEMORY_BASE, l); |
589 | } | 587 | } |
590 | 588 | ||
591 | static void pci_setup_bridge_mmio_pref(struct pci_bus *bus) | 589 | static void pci_setup_bridge_mmio_pref(struct pci_dev *bridge) |
592 | { | 590 | { |
593 | struct pci_dev *bridge = bus->self; | ||
594 | struct resource *res; | 591 | struct resource *res; |
595 | struct pci_bus_region region; | 592 | struct pci_bus_region region; |
596 | u32 l, bu, lu; | 593 | u32 l, bu, lu; |
@@ -602,7 +599,7 @@ static void pci_setup_bridge_mmio_pref(struct pci_bus *bus) | |||
602 | 599 | ||
603 | /* Set up PREF base/limit. */ | 600 | /* Set up PREF base/limit. */ |
604 | bu = lu = 0; | 601 | bu = lu = 0; |
605 | res = bus->resource[2]; | 602 | res = &bridge->resource[PCI_BRIDGE_RESOURCES + 2]; |
606 | pcibios_resource_to_bus(bridge->bus, ®ion, res); | 603 | pcibios_resource_to_bus(bridge->bus, ®ion, res); |
607 | if (res->flags & IORESOURCE_PREFETCH) { | 604 | if (res->flags & IORESOURCE_PREFETCH) { |
608 | l = (region.start >> 16) & 0xfff0; | 605 | l = (region.start >> 16) & 0xfff0; |
@@ -630,13 +627,13 @@ static void __pci_setup_bridge(struct pci_bus *bus, unsigned long type) | |||
630 | &bus->busn_res); | 627 | &bus->busn_res); |
631 | 628 | ||
632 | if (type & IORESOURCE_IO) | 629 | if (type & IORESOURCE_IO) |
633 | pci_setup_bridge_io(bus); | 630 | pci_setup_bridge_io(bridge); |
634 | 631 | ||
635 | if (type & IORESOURCE_MEM) | 632 | if (type & IORESOURCE_MEM) |
636 | pci_setup_bridge_mmio(bus); | 633 | pci_setup_bridge_mmio(bridge); |
637 | 634 | ||
638 | if (type & IORESOURCE_PREFETCH) | 635 | if (type & IORESOURCE_PREFETCH) |
639 | pci_setup_bridge_mmio_pref(bus); | 636 | pci_setup_bridge_mmio_pref(bridge); |
640 | 637 | ||
641 | pci_write_config_word(bridge, PCI_BRIDGE_CONTROL, bus->bridge_ctl); | 638 | pci_write_config_word(bridge, PCI_BRIDGE_CONTROL, bus->bridge_ctl); |
642 | } | 639 | } |
@@ -649,6 +646,41 @@ void pci_setup_bridge(struct pci_bus *bus) | |||
649 | __pci_setup_bridge(bus, type); | 646 | __pci_setup_bridge(bus, type); |
650 | } | 647 | } |
651 | 648 | ||
649 | |||
650 | int pci_claim_bridge_resource(struct pci_dev *bridge, int i) | ||
651 | { | ||
652 | if (i < PCI_BRIDGE_RESOURCES || i > PCI_BRIDGE_RESOURCE_END) | ||
653 | return 0; | ||
654 | |||
655 | if (pci_claim_resource(bridge, i) == 0) | ||
656 | return 0; /* claimed the window */ | ||
657 | |||
658 | if ((bridge->class >> 8) != PCI_CLASS_BRIDGE_PCI) | ||
659 | return 0; | ||
660 | |||
661 | if (!pci_bus_clip_resource(bridge, i)) | ||
662 | return -EINVAL; /* clipping didn't change anything */ | ||
663 | |||
664 | switch (i - PCI_BRIDGE_RESOURCES) { | ||
665 | case 0: | ||
666 | pci_setup_bridge_io(bridge); | ||
667 | break; | ||
668 | case 1: | ||
669 | pci_setup_bridge_mmio(bridge); | ||
670 | break; | ||
671 | case 2: | ||
672 | pci_setup_bridge_mmio_pref(bridge); | ||
673 | break; | ||
674 | default: | ||
675 | return -EINVAL; | ||
676 | } | ||
677 | |||
678 | if (pci_claim_resource(bridge, i) == 0) | ||
679 | return 0; /* claimed a smaller window */ | ||
680 | |||
681 | return -EINVAL; | ||
682 | } | ||
683 | |||
652 | /* Check whether the bridge supports optional I/O and | 684 | /* Check whether the bridge supports optional I/O and |
653 | prefetchable memory ranges. If not, the respective | 685 | prefetchable memory ranges. If not, the respective |
654 | base/limit registers must be read-only and read as 0. */ | 686 | base/limit registers must be read-only and read as 0. */ |
diff --git a/drivers/phy/phy-miphy28lp.c b/drivers/phy/phy-miphy28lp.c index e34da13885e8..27fa62ce6136 100644 --- a/drivers/phy/phy-miphy28lp.c +++ b/drivers/phy/phy-miphy28lp.c | |||
@@ -1050,7 +1050,8 @@ static int miphy28lp_init(struct phy *phy) | |||
1050 | ret = miphy28lp_init_usb3(miphy_phy); | 1050 | ret = miphy28lp_init_usb3(miphy_phy); |
1051 | break; | 1051 | break; |
1052 | default: | 1052 | default: |
1053 | return -EINVAL; | 1053 | ret = -EINVAL; |
1054 | break; | ||
1054 | } | 1055 | } |
1055 | 1056 | ||
1056 | mutex_unlock(&miphy_dev->miphy_mutex); | 1057 | mutex_unlock(&miphy_dev->miphy_mutex); |
diff --git a/drivers/phy/phy-omap-control.c b/drivers/phy/phy-omap-control.c index c96e8183a8ff..efe724f97e02 100644 --- a/drivers/phy/phy-omap-control.c +++ b/drivers/phy/phy-omap-control.c | |||
@@ -29,10 +29,9 @@ | |||
29 | /** | 29 | /** |
30 | * omap_control_pcie_pcs - set the PCS delay count | 30 | * omap_control_pcie_pcs - set the PCS delay count |
31 | * @dev: the control module device | 31 | * @dev: the control module device |
32 | * @id: index of the pcie PHY (should be 1 or 2) | ||
33 | * @delay: 8 bit delay value | 32 | * @delay: 8 bit delay value |
34 | */ | 33 | */ |
35 | void omap_control_pcie_pcs(struct device *dev, u8 id, u8 delay) | 34 | void omap_control_pcie_pcs(struct device *dev, u8 delay) |
36 | { | 35 | { |
37 | u32 val; | 36 | u32 val; |
38 | struct omap_control_phy *control_phy; | 37 | struct omap_control_phy *control_phy; |
@@ -55,8 +54,8 @@ void omap_control_pcie_pcs(struct device *dev, u8 id, u8 delay) | |||
55 | 54 | ||
56 | val = readl(control_phy->pcie_pcs); | 55 | val = readl(control_phy->pcie_pcs); |
57 | val &= ~(OMAP_CTRL_PCIE_PCS_MASK << | 56 | val &= ~(OMAP_CTRL_PCIE_PCS_MASK << |
58 | (id * OMAP_CTRL_PCIE_PCS_DELAY_COUNT_SHIFT)); | 57 | OMAP_CTRL_PCIE_PCS_DELAY_COUNT_SHIFT); |
59 | val |= delay << (id * OMAP_CTRL_PCIE_PCS_DELAY_COUNT_SHIFT); | 58 | val |= (delay << OMAP_CTRL_PCIE_PCS_DELAY_COUNT_SHIFT); |
60 | writel(val, control_phy->pcie_pcs); | 59 | writel(val, control_phy->pcie_pcs); |
61 | } | 60 | } |
62 | EXPORT_SYMBOL_GPL(omap_control_pcie_pcs); | 61 | EXPORT_SYMBOL_GPL(omap_control_pcie_pcs); |
diff --git a/drivers/phy/phy-sun4i-usb.c b/drivers/phy/phy-sun4i-usb.c index fb02a67c9181..a2b08f3ccb03 100644 --- a/drivers/phy/phy-sun4i-usb.c +++ b/drivers/phy/phy-sun4i-usb.c | |||
@@ -244,7 +244,8 @@ static int sun4i_usb_phy_probe(struct platform_device *pdev) | |||
244 | else | 244 | else |
245 | data->num_phys = 3; | 245 | data->num_phys = 3; |
246 | 246 | ||
247 | if (of_device_is_compatible(np, "allwinner,sun4i-a10-usb-phy")) | 247 | if (of_device_is_compatible(np, "allwinner,sun4i-a10-usb-phy") || |
248 | of_device_is_compatible(np, "allwinner,sun6i-a31-usb-phy")) | ||
248 | data->disc_thresh = 3; | 249 | data->disc_thresh = 3; |
249 | else | 250 | else |
250 | data->disc_thresh = 2; | 251 | data->disc_thresh = 2; |
diff --git a/drivers/phy/phy-ti-pipe3.c b/drivers/phy/phy-ti-pipe3.c index 1387b4d4afe3..465de2c800f2 100644 --- a/drivers/phy/phy-ti-pipe3.c +++ b/drivers/phy/phy-ti-pipe3.c | |||
@@ -82,7 +82,6 @@ struct ti_pipe3 { | |||
82 | struct clk *refclk; | 82 | struct clk *refclk; |
83 | struct clk *div_clk; | 83 | struct clk *div_clk; |
84 | struct pipe3_dpll_map *dpll_map; | 84 | struct pipe3_dpll_map *dpll_map; |
85 | u8 id; | ||
86 | }; | 85 | }; |
87 | 86 | ||
88 | static struct pipe3_dpll_map dpll_map_usb[] = { | 87 | static struct pipe3_dpll_map dpll_map_usb[] = { |
@@ -217,8 +216,13 @@ static int ti_pipe3_init(struct phy *x) | |||
217 | u32 val; | 216 | u32 val; |
218 | int ret = 0; | 217 | int ret = 0; |
219 | 218 | ||
219 | /* | ||
220 | * Set pcie_pcs register to 0x96 for proper functioning of phy | ||
221 | * as recommended in AM572x TRM SPRUHZ6, section 18.5.2.2, table | ||
222 | * 18-1804. | ||
223 | */ | ||
220 | if (of_device_is_compatible(phy->dev->of_node, "ti,phy-pipe3-pcie")) { | 224 | if (of_device_is_compatible(phy->dev->of_node, "ti,phy-pipe3-pcie")) { |
221 | omap_control_pcie_pcs(phy->control_dev, phy->id, 0xF1); | 225 | omap_control_pcie_pcs(phy->control_dev, 0x96); |
222 | return 0; | 226 | return 0; |
223 | } | 227 | } |
224 | 228 | ||
@@ -347,8 +351,6 @@ static int ti_pipe3_probe(struct platform_device *pdev) | |||
347 | } | 351 | } |
348 | 352 | ||
349 | if (of_device_is_compatible(node, "ti,phy-pipe3-pcie")) { | 353 | if (of_device_is_compatible(node, "ti,phy-pipe3-pcie")) { |
350 | if (of_property_read_u8(node, "id", &phy->id) < 0) | ||
351 | phy->id = 1; | ||
352 | 354 | ||
353 | clk = devm_clk_get(phy->dev, "dpll_ref"); | 355 | clk = devm_clk_get(phy->dev, "dpll_ref"); |
354 | if (IS_ERR(clk)) { | 356 | if (IS_ERR(clk)) { |
diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c index e4f65510c87e..89dca77ca038 100644 --- a/drivers/pinctrl/core.c +++ b/drivers/pinctrl/core.c | |||
@@ -1801,14 +1801,15 @@ void pinctrl_unregister(struct pinctrl_dev *pctldev) | |||
1801 | if (pctldev == NULL) | 1801 | if (pctldev == NULL) |
1802 | return; | 1802 | return; |
1803 | 1803 | ||
1804 | mutex_lock(&pinctrldev_list_mutex); | ||
1805 | mutex_lock(&pctldev->mutex); | 1804 | mutex_lock(&pctldev->mutex); |
1806 | |||
1807 | pinctrl_remove_device_debugfs(pctldev); | 1805 | pinctrl_remove_device_debugfs(pctldev); |
1806 | mutex_unlock(&pctldev->mutex); | ||
1808 | 1807 | ||
1809 | if (!IS_ERR(pctldev->p)) | 1808 | if (!IS_ERR(pctldev->p)) |
1810 | pinctrl_put(pctldev->p); | 1809 | pinctrl_put(pctldev->p); |
1811 | 1810 | ||
1811 | mutex_lock(&pinctrldev_list_mutex); | ||
1812 | mutex_lock(&pctldev->mutex); | ||
1812 | /* TODO: check that no pinmuxes are still active? */ | 1813 | /* TODO: check that no pinmuxes are still active? */ |
1813 | list_del(&pctldev->node); | 1814 | list_del(&pctldev->node); |
1814 | /* Destroy descriptor tree */ | 1815 | /* Destroy descriptor tree */ |
diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c index 3c22dbebc80f..43eacc924b7e 100644 --- a/drivers/pinctrl/pinctrl-rockchip.c +++ b/drivers/pinctrl/pinctrl-rockchip.c | |||
@@ -1398,10 +1398,7 @@ static void rockchip_irq_demux(unsigned int irq, struct irq_desc *desc) | |||
1398 | { | 1398 | { |
1399 | struct irq_chip *chip = irq_get_chip(irq); | 1399 | struct irq_chip *chip = irq_get_chip(irq); |
1400 | struct rockchip_pin_bank *bank = irq_get_handler_data(irq); | 1400 | struct rockchip_pin_bank *bank = irq_get_handler_data(irq); |
1401 | u32 polarity = 0, data = 0; | ||
1402 | u32 pend; | 1401 | u32 pend; |
1403 | bool edge_changed = false; | ||
1404 | unsigned long flags; | ||
1405 | 1402 | ||
1406 | dev_dbg(bank->drvdata->dev, "got irq for bank %s\n", bank->name); | 1403 | dev_dbg(bank->drvdata->dev, "got irq for bank %s\n", bank->name); |
1407 | 1404 | ||
@@ -1409,12 +1406,6 @@ static void rockchip_irq_demux(unsigned int irq, struct irq_desc *desc) | |||
1409 | 1406 | ||
1410 | pend = readl_relaxed(bank->reg_base + GPIO_INT_STATUS); | 1407 | pend = readl_relaxed(bank->reg_base + GPIO_INT_STATUS); |
1411 | 1408 | ||
1412 | if (bank->toggle_edge_mode) { | ||
1413 | polarity = readl_relaxed(bank->reg_base + | ||
1414 | GPIO_INT_POLARITY); | ||
1415 | data = readl_relaxed(bank->reg_base + GPIO_EXT_PORT); | ||
1416 | } | ||
1417 | |||
1418 | while (pend) { | 1409 | while (pend) { |
1419 | unsigned int virq; | 1410 | unsigned int virq; |
1420 | 1411 | ||
@@ -1434,27 +1425,31 @@ static void rockchip_irq_demux(unsigned int irq, struct irq_desc *desc) | |||
1434 | * needs manual intervention. | 1425 | * needs manual intervention. |
1435 | */ | 1426 | */ |
1436 | if (bank->toggle_edge_mode & BIT(irq)) { | 1427 | if (bank->toggle_edge_mode & BIT(irq)) { |
1437 | if (data & BIT(irq)) | 1428 | u32 data, data_old, polarity; |
1438 | polarity &= ~BIT(irq); | 1429 | unsigned long flags; |
1439 | else | ||
1440 | polarity |= BIT(irq); | ||
1441 | 1430 | ||
1442 | edge_changed = true; | 1431 | data = readl_relaxed(bank->reg_base + GPIO_EXT_PORT); |
1443 | } | 1432 | do { |
1433 | spin_lock_irqsave(&bank->slock, flags); | ||
1444 | 1434 | ||
1445 | generic_handle_irq(virq); | 1435 | polarity = readl_relaxed(bank->reg_base + |
1446 | } | 1436 | GPIO_INT_POLARITY); |
1437 | if (data & BIT(irq)) | ||
1438 | polarity &= ~BIT(irq); | ||
1439 | else | ||
1440 | polarity |= BIT(irq); | ||
1441 | writel(polarity, | ||
1442 | bank->reg_base + GPIO_INT_POLARITY); | ||
1447 | 1443 | ||
1448 | if (bank->toggle_edge_mode && edge_changed) { | 1444 | spin_unlock_irqrestore(&bank->slock, flags); |
1449 | /* Interrupt params should only be set with ints disabled */ | ||
1450 | spin_lock_irqsave(&bank->slock, flags); | ||
1451 | 1445 | ||
1452 | data = readl_relaxed(bank->reg_base + GPIO_INTEN); | 1446 | data_old = data; |
1453 | writel_relaxed(0, bank->reg_base + GPIO_INTEN); | 1447 | data = readl_relaxed(bank->reg_base + |
1454 | writel(polarity, bank->reg_base + GPIO_INT_POLARITY); | 1448 | GPIO_EXT_PORT); |
1455 | writel(data, bank->reg_base + GPIO_INTEN); | 1449 | } while ((data & BIT(irq)) != (data_old & BIT(irq))); |
1450 | } | ||
1456 | 1451 | ||
1457 | spin_unlock_irqrestore(&bank->slock, flags); | 1452 | generic_handle_irq(virq); |
1458 | } | 1453 | } |
1459 | 1454 | ||
1460 | chained_irq_exit(chip, desc); | 1455 | chained_irq_exit(chip, desc); |
diff --git a/drivers/pinctrl/pinctrl-xway.c b/drivers/pinctrl/pinctrl-xway.c index c5cef59f5965..779950c62e53 100644 --- a/drivers/pinctrl/pinctrl-xway.c +++ b/drivers/pinctrl/pinctrl-xway.c | |||
@@ -798,10 +798,8 @@ static int pinmux_xway_probe(struct platform_device *pdev) | |||
798 | 798 | ||
799 | /* load the gpio chip */ | 799 | /* load the gpio chip */ |
800 | xway_chip.dev = &pdev->dev; | 800 | xway_chip.dev = &pdev->dev; |
801 | of_gpiochip_add(&xway_chip); | ||
802 | ret = gpiochip_add(&xway_chip); | 801 | ret = gpiochip_add(&xway_chip); |
803 | if (ret) { | 802 | if (ret) { |
804 | of_gpiochip_remove(&xway_chip); | ||
805 | dev_err(&pdev->dev, "Failed to register gpio chip\n"); | 803 | dev_err(&pdev->dev, "Failed to register gpio chip\n"); |
806 | return ret; | 804 | return ret; |
807 | } | 805 | } |
diff --git a/drivers/pinctrl/qcom/pinctrl-msm.c b/drivers/pinctrl/qcom/pinctrl-msm.c index e730935fa457..ed7017df065d 100644 --- a/drivers/pinctrl/qcom/pinctrl-msm.c +++ b/drivers/pinctrl/qcom/pinctrl-msm.c | |||
@@ -865,10 +865,10 @@ static int msm_ps_hold_restart(struct notifier_block *nb, unsigned long action, | |||
865 | 865 | ||
866 | static void msm_pinctrl_setup_pm_reset(struct msm_pinctrl *pctrl) | 866 | static void msm_pinctrl_setup_pm_reset(struct msm_pinctrl *pctrl) |
867 | { | 867 | { |
868 | int i = 0; | 868 | int i; |
869 | const struct msm_function *func = pctrl->soc->functions; | 869 | const struct msm_function *func = pctrl->soc->functions; |
870 | 870 | ||
871 | for (; i <= pctrl->soc->nfunctions; i++) | 871 | for (i = 0; i < pctrl->soc->nfunctions; i++) |
872 | if (!strcmp(func[i].name, "ps_hold")) { | 872 | if (!strcmp(func[i].name, "ps_hold")) { |
873 | pctrl->restart_nb.notifier_call = msm_ps_hold_restart; | 873 | pctrl->restart_nb.notifier_call = msm_ps_hold_restart; |
874 | pctrl->restart_nb.priority = 128; | 874 | pctrl->restart_nb.priority = 128; |
diff --git a/drivers/platform/x86/dell-laptop.c b/drivers/platform/x86/dell-laptop.c index 9411eae39a4e..3d21efe11d7b 100644 --- a/drivers/platform/x86/dell-laptop.c +++ b/drivers/platform/x86/dell-laptop.c | |||
@@ -2,11 +2,9 @@ | |||
2 | * Driver for Dell laptop extras | 2 | * Driver for Dell laptop extras |
3 | * | 3 | * |
4 | * Copyright (c) Red Hat <mjg@redhat.com> | 4 | * Copyright (c) Red Hat <mjg@redhat.com> |
5 | * Copyright (c) 2014 Gabriele Mazzotta <gabriele.mzt@gmail.com> | ||
6 | * Copyright (c) 2014 Pali Rohár <pali.rohar@gmail.com> | ||
7 | * | 5 | * |
8 | * Based on documentation in the libsmbios package: | 6 | * Based on documentation in the libsmbios package, Copyright (C) 2005 Dell |
9 | * Copyright (C) 2005-2014 Dell Inc. | 7 | * Inc. |
10 | * | 8 | * |
11 | * This program is free software; you can redistribute it and/or modify | 9 | * This program is free software; you can redistribute it and/or modify |
12 | * it under the terms of the GNU General Public License version 2 as | 10 | * it under the terms of the GNU General Public License version 2 as |
@@ -34,13 +32,6 @@ | |||
34 | #include "../../firmware/dcdbas.h" | 32 | #include "../../firmware/dcdbas.h" |
35 | 33 | ||
36 | #define BRIGHTNESS_TOKEN 0x7d | 34 | #define BRIGHTNESS_TOKEN 0x7d |
37 | #define KBD_LED_OFF_TOKEN 0x01E1 | ||
38 | #define KBD_LED_ON_TOKEN 0x01E2 | ||
39 | #define KBD_LED_AUTO_TOKEN 0x01E3 | ||
40 | #define KBD_LED_AUTO_25_TOKEN 0x02EA | ||
41 | #define KBD_LED_AUTO_50_TOKEN 0x02EB | ||
42 | #define KBD_LED_AUTO_75_TOKEN 0x02EC | ||
43 | #define KBD_LED_AUTO_100_TOKEN 0x02F6 | ||
44 | 35 | ||
45 | /* This structure will be modified by the firmware when we enter | 36 | /* This structure will be modified by the firmware when we enter |
46 | * system management mode, hence the volatiles */ | 37 | * system management mode, hence the volatiles */ |
@@ -71,13 +62,6 @@ struct calling_interface_structure { | |||
71 | 62 | ||
72 | struct quirk_entry { | 63 | struct quirk_entry { |
73 | u8 touchpad_led; | 64 | u8 touchpad_led; |
74 | |||
75 | int needs_kbd_timeouts; | ||
76 | /* | ||
77 | * Ordered list of timeouts expressed in seconds. | ||
78 | * The list must end with -1 | ||
79 | */ | ||
80 | int kbd_timeouts[]; | ||
81 | }; | 65 | }; |
82 | 66 | ||
83 | static struct quirk_entry *quirks; | 67 | static struct quirk_entry *quirks; |
@@ -92,15 +76,6 @@ static int __init dmi_matched(const struct dmi_system_id *dmi) | |||
92 | return 1; | 76 | return 1; |
93 | } | 77 | } |
94 | 78 | ||
95 | /* | ||
96 | * These values come from Windows utility provided by Dell. If any other value | ||
97 | * is used then BIOS silently set timeout to 0 without any error message. | ||
98 | */ | ||
99 | static struct quirk_entry quirk_dell_xps13_9333 = { | ||
100 | .needs_kbd_timeouts = 1, | ||
101 | .kbd_timeouts = { 0, 5, 15, 60, 5 * 60, 15 * 60, -1 }, | ||
102 | }; | ||
103 | |||
104 | static int da_command_address; | 79 | static int da_command_address; |
105 | static int da_command_code; | 80 | static int da_command_code; |
106 | static int da_num_tokens; | 81 | static int da_num_tokens; |
@@ -292,15 +267,6 @@ static const struct dmi_system_id dell_quirks[] __initconst = { | |||
292 | }, | 267 | }, |
293 | .driver_data = &quirk_dell_vostro_v130, | 268 | .driver_data = &quirk_dell_vostro_v130, |
294 | }, | 269 | }, |
295 | { | ||
296 | .callback = dmi_matched, | ||
297 | .ident = "Dell XPS13 9333", | ||
298 | .matches = { | ||
299 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
300 | DMI_MATCH(DMI_PRODUCT_NAME, "XPS13 9333"), | ||
301 | }, | ||
302 | .driver_data = &quirk_dell_xps13_9333, | ||
303 | }, | ||
304 | { } | 270 | { } |
305 | }; | 271 | }; |
306 | 272 | ||
@@ -365,29 +331,17 @@ static void __init find_tokens(const struct dmi_header *dm, void *dummy) | |||
365 | } | 331 | } |
366 | } | 332 | } |
367 | 333 | ||
368 | static int find_token_id(int tokenid) | 334 | static int find_token_location(int tokenid) |
369 | { | 335 | { |
370 | int i; | 336 | int i; |
371 | |||
372 | for (i = 0; i < da_num_tokens; i++) { | 337 | for (i = 0; i < da_num_tokens; i++) { |
373 | if (da_tokens[i].tokenID == tokenid) | 338 | if (da_tokens[i].tokenID == tokenid) |
374 | return i; | 339 | return da_tokens[i].location; |
375 | } | 340 | } |
376 | 341 | ||
377 | return -1; | 342 | return -1; |
378 | } | 343 | } |
379 | 344 | ||
380 | static int find_token_location(int tokenid) | ||
381 | { | ||
382 | int id; | ||
383 | |||
384 | id = find_token_id(tokenid); | ||
385 | if (id == -1) | ||
386 | return -1; | ||
387 | |||
388 | return da_tokens[id].location; | ||
389 | } | ||
390 | |||
391 | static struct calling_interface_buffer * | 345 | static struct calling_interface_buffer * |
392 | dell_send_request(struct calling_interface_buffer *buffer, int class, | 346 | dell_send_request(struct calling_interface_buffer *buffer, int class, |
393 | int select) | 347 | int select) |
@@ -408,20 +362,6 @@ dell_send_request(struct calling_interface_buffer *buffer, int class, | |||
408 | return buffer; | 362 | return buffer; |
409 | } | 363 | } |
410 | 364 | ||
411 | static inline int dell_smi_error(int value) | ||
412 | { | ||
413 | switch (value) { | ||
414 | case 0: /* Completed successfully */ | ||
415 | return 0; | ||
416 | case -1: /* Completed with error */ | ||
417 | return -EIO; | ||
418 | case -2: /* Function not supported */ | ||
419 | return -ENXIO; | ||
420 | default: /* Unknown error */ | ||
421 | return -EINVAL; | ||
422 | } | ||
423 | } | ||
424 | |||
425 | /* Derived from information in DellWirelessCtl.cpp: | 365 | /* Derived from information in DellWirelessCtl.cpp: |
426 | Class 17, select 11 is radio control. It returns an array of 32-bit values. | 366 | Class 17, select 11 is radio control. It returns an array of 32-bit values. |
427 | 367 | ||
@@ -776,7 +716,7 @@ static int dell_send_intensity(struct backlight_device *bd) | |||
776 | else | 716 | else |
777 | dell_send_request(buffer, 1, 1); | 717 | dell_send_request(buffer, 1, 1); |
778 | 718 | ||
779 | out: | 719 | out: |
780 | release_buffer(); | 720 | release_buffer(); |
781 | return ret; | 721 | return ret; |
782 | } | 722 | } |
@@ -800,7 +740,7 @@ static int dell_get_intensity(struct backlight_device *bd) | |||
800 | 740 | ||
801 | ret = buffer->output[1]; | 741 | ret = buffer->output[1]; |
802 | 742 | ||
803 | out: | 743 | out: |
804 | release_buffer(); | 744 | release_buffer(); |
805 | return ret; | 745 | return ret; |
806 | } | 746 | } |
@@ -849,984 +789,6 @@ static void touchpad_led_exit(void) | |||
849 | led_classdev_unregister(&touchpad_led); | 789 | led_classdev_unregister(&touchpad_led); |
850 | } | 790 | } |
851 | 791 | ||
852 | /* | ||
853 | * Derived from information in smbios-keyboard-ctl: | ||
854 | * | ||
855 | * cbClass 4 | ||
856 | * cbSelect 11 | ||
857 | * Keyboard illumination | ||
858 | * cbArg1 determines the function to be performed | ||
859 | * | ||
860 | * cbArg1 0x0 = Get Feature Information | ||
861 | * cbRES1 Standard return codes (0, -1, -2) | ||
862 | * cbRES2, word0 Bitmap of user-selectable modes | ||
863 | * bit 0 Always off (All systems) | ||
864 | * bit 1 Always on (Travis ATG, Siberia) | ||
865 | * bit 2 Auto: ALS-based On; ALS-based Off (Travis ATG) | ||
866 | * bit 3 Auto: ALS- and input-activity-based On; input-activity based Off | ||
867 | * bit 4 Auto: Input-activity-based On; input-activity based Off | ||
868 | * bit 5 Auto: Input-activity-based On (illumination level 25%); input-activity based Off | ||
869 | * bit 6 Auto: Input-activity-based On (illumination level 50%); input-activity based Off | ||
870 | * bit 7 Auto: Input-activity-based On (illumination level 75%); input-activity based Off | ||
871 | * bit 8 Auto: Input-activity-based On (illumination level 100%); input-activity based Off | ||
872 | * bits 9-15 Reserved for future use | ||
873 | * cbRES2, byte2 Reserved for future use | ||
874 | * cbRES2, byte3 Keyboard illumination type | ||
875 | * 0 Reserved | ||
876 | * 1 Tasklight | ||
877 | * 2 Backlight | ||
878 | * 3-255 Reserved for future use | ||
879 | * cbRES3, byte0 Supported auto keyboard illumination trigger bitmap. | ||
880 | * bit 0 Any keystroke | ||
881 | * bit 1 Touchpad activity | ||
882 | * bit 2 Pointing stick | ||
883 | * bit 3 Any mouse | ||
884 | * bits 4-7 Reserved for future use | ||
885 | * cbRES3, byte1 Supported timeout unit bitmap | ||
886 | * bit 0 Seconds | ||
887 | * bit 1 Minutes | ||
888 | * bit 2 Hours | ||
889 | * bit 3 Days | ||
890 | * bits 4-7 Reserved for future use | ||
891 | * cbRES3, byte2 Number of keyboard light brightness levels | ||
892 | * cbRES4, byte0 Maximum acceptable seconds value (0 if seconds not supported). | ||
893 | * cbRES4, byte1 Maximum acceptable minutes value (0 if minutes not supported). | ||
894 | * cbRES4, byte2 Maximum acceptable hours value (0 if hours not supported). | ||
895 | * cbRES4, byte3 Maximum acceptable days value (0 if days not supported) | ||
896 | * | ||
897 | * cbArg1 0x1 = Get Current State | ||
898 | * cbRES1 Standard return codes (0, -1, -2) | ||
899 | * cbRES2, word0 Bitmap of current mode state | ||
900 | * bit 0 Always off (All systems) | ||
901 | * bit 1 Always on (Travis ATG, Siberia) | ||
902 | * bit 2 Auto: ALS-based On; ALS-based Off (Travis ATG) | ||
903 | * bit 3 Auto: ALS- and input-activity-based On; input-activity based Off | ||
904 | * bit 4 Auto: Input-activity-based On; input-activity based Off | ||
905 | * bit 5 Auto: Input-activity-based On (illumination level 25%); input-activity based Off | ||
906 | * bit 6 Auto: Input-activity-based On (illumination level 50%); input-activity based Off | ||
907 | * bit 7 Auto: Input-activity-based On (illumination level 75%); input-activity based Off | ||
908 | * bit 8 Auto: Input-activity-based On (illumination level 100%); input-activity based Off | ||
909 | * bits 9-15 Reserved for future use | ||
910 | * Note: Only One bit can be set | ||
911 | * cbRES2, byte2 Currently active auto keyboard illumination triggers. | ||
912 | * bit 0 Any keystroke | ||
913 | * bit 1 Touchpad activity | ||
914 | * bit 2 Pointing stick | ||
915 | * bit 3 Any mouse | ||
916 | * bits 4-7 Reserved for future use | ||
917 | * cbRES2, byte3 Current Timeout | ||
918 | * bits 7:6 Timeout units indicator: | ||
919 | * 00b Seconds | ||
920 | * 01b Minutes | ||
921 | * 10b Hours | ||
922 | * 11b Days | ||
923 | * bits 5:0 Timeout value (0-63) in sec/min/hr/day | ||
924 | * NOTE: A value of 0 means always on (no timeout) if any bits of RES3 byte | ||
925 | * are set upon return from the [Get feature information] call. | ||
926 | * cbRES3, byte0 Current setting of ALS value that turns the light on or off. | ||
927 | * cbRES3, byte1 Current ALS reading | ||
928 | * cbRES3, byte2 Current keyboard light level. | ||
929 | * | ||
930 | * cbArg1 0x2 = Set New State | ||
931 | * cbRES1 Standard return codes (0, -1, -2) | ||
932 | * cbArg2, word0 Bitmap of current mode state | ||
933 | * bit 0 Always off (All systems) | ||
934 | * bit 1 Always on (Travis ATG, Siberia) | ||
935 | * bit 2 Auto: ALS-based On; ALS-based Off (Travis ATG) | ||
936 | * bit 3 Auto: ALS- and input-activity-based On; input-activity based Off | ||
937 | * bit 4 Auto: Input-activity-based On; input-activity based Off | ||
938 | * bit 5 Auto: Input-activity-based On (illumination level 25%); input-activity based Off | ||
939 | * bit 6 Auto: Input-activity-based On (illumination level 50%); input-activity based Off | ||
940 | * bit 7 Auto: Input-activity-based On (illumination level 75%); input-activity based Off | ||
941 | * bit 8 Auto: Input-activity-based On (illumination level 100%); input-activity based Off | ||
942 | * bits 9-15 Reserved for future use | ||
943 | * Note: Only One bit can be set | ||
944 | * cbArg2, byte2 Desired auto keyboard illumination triggers. Must remain inactive to allow | ||
945 | * keyboard to turn off automatically. | ||
946 | * bit 0 Any keystroke | ||
947 | * bit 1 Touchpad activity | ||
948 | * bit 2 Pointing stick | ||
949 | * bit 3 Any mouse | ||
950 | * bits 4-7 Reserved for future use | ||
951 | * cbArg2, byte3 Desired Timeout | ||
952 | * bits 7:6 Timeout units indicator: | ||
953 | * 00b Seconds | ||
954 | * 01b Minutes | ||
955 | * 10b Hours | ||
956 | * 11b Days | ||
957 | * bits 5:0 Timeout value (0-63) in sec/min/hr/day | ||
958 | * cbArg3, byte0 Desired setting of ALS value that turns the light on or off. | ||
959 | * cbArg3, byte2 Desired keyboard light level. | ||
960 | */ | ||
961 | |||
962 | |||
963 | enum kbd_timeout_unit { | ||
964 | KBD_TIMEOUT_SECONDS = 0, | ||
965 | KBD_TIMEOUT_MINUTES, | ||
966 | KBD_TIMEOUT_HOURS, | ||
967 | KBD_TIMEOUT_DAYS, | ||
968 | }; | ||
969 | |||
970 | enum kbd_mode_bit { | ||
971 | KBD_MODE_BIT_OFF = 0, | ||
972 | KBD_MODE_BIT_ON, | ||
973 | KBD_MODE_BIT_ALS, | ||
974 | KBD_MODE_BIT_TRIGGER_ALS, | ||
975 | KBD_MODE_BIT_TRIGGER, | ||
976 | KBD_MODE_BIT_TRIGGER_25, | ||
977 | KBD_MODE_BIT_TRIGGER_50, | ||
978 | KBD_MODE_BIT_TRIGGER_75, | ||
979 | KBD_MODE_BIT_TRIGGER_100, | ||
980 | }; | ||
981 | |||
982 | #define kbd_is_als_mode_bit(bit) \ | ||
983 | ((bit) == KBD_MODE_BIT_ALS || (bit) == KBD_MODE_BIT_TRIGGER_ALS) | ||
984 | #define kbd_is_trigger_mode_bit(bit) \ | ||
985 | ((bit) >= KBD_MODE_BIT_TRIGGER_ALS && (bit) <= KBD_MODE_BIT_TRIGGER_100) | ||
986 | #define kbd_is_level_mode_bit(bit) \ | ||
987 | ((bit) >= KBD_MODE_BIT_TRIGGER_25 && (bit) <= KBD_MODE_BIT_TRIGGER_100) | ||
988 | |||
989 | struct kbd_info { | ||
990 | u16 modes; | ||
991 | u8 type; | ||
992 | u8 triggers; | ||
993 | u8 levels; | ||
994 | u8 seconds; | ||
995 | u8 minutes; | ||
996 | u8 hours; | ||
997 | u8 days; | ||
998 | }; | ||
999 | |||
1000 | struct kbd_state { | ||
1001 | u8 mode_bit; | ||
1002 | u8 triggers; | ||
1003 | u8 timeout_value; | ||
1004 | u8 timeout_unit; | ||
1005 | u8 als_setting; | ||
1006 | u8 als_value; | ||
1007 | u8 level; | ||
1008 | }; | ||
1009 | |||
1010 | static const int kbd_tokens[] = { | ||
1011 | KBD_LED_OFF_TOKEN, | ||
1012 | KBD_LED_AUTO_25_TOKEN, | ||
1013 | KBD_LED_AUTO_50_TOKEN, | ||
1014 | KBD_LED_AUTO_75_TOKEN, | ||
1015 | KBD_LED_AUTO_100_TOKEN, | ||
1016 | KBD_LED_ON_TOKEN, | ||
1017 | }; | ||
1018 | |||
1019 | static u16 kbd_token_bits; | ||
1020 | |||
1021 | static struct kbd_info kbd_info; | ||
1022 | static bool kbd_als_supported; | ||
1023 | static bool kbd_triggers_supported; | ||
1024 | |||
1025 | static u8 kbd_mode_levels[16]; | ||
1026 | static int kbd_mode_levels_count; | ||
1027 | |||
1028 | static u8 kbd_previous_level; | ||
1029 | static u8 kbd_previous_mode_bit; | ||
1030 | |||
1031 | static bool kbd_led_present; | ||
1032 | |||
1033 | /* | ||
1034 | * NOTE: there are three ways to set the keyboard backlight level. | ||
1035 | * First, via kbd_state.mode_bit (assigning KBD_MODE_BIT_TRIGGER_* value). | ||
1036 | * Second, via kbd_state.level (assigning numerical value <= kbd_info.levels). | ||
1037 | * Third, via SMBIOS tokens (KBD_LED_* in kbd_tokens) | ||
1038 | * | ||
1039 | * There are laptops which support only one of these methods. If we want to | ||
1040 | * support as many machines as possible we need to implement all three methods. | ||
1041 | * The first two methods use the kbd_state structure. The third uses SMBIOS | ||
1042 | * tokens. If kbd_info.levels == 0, the machine does not support setting the | ||
1043 | * keyboard backlight level via kbd_state.level. | ||
1044 | */ | ||
1045 | |||
1046 | static int kbd_get_info(struct kbd_info *info) | ||
1047 | { | ||
1048 | u8 units; | ||
1049 | int ret; | ||
1050 | |||
1051 | get_buffer(); | ||
1052 | |||
1053 | buffer->input[0] = 0x0; | ||
1054 | dell_send_request(buffer, 4, 11); | ||
1055 | ret = buffer->output[0]; | ||
1056 | |||
1057 | if (ret) { | ||
1058 | ret = dell_smi_error(ret); | ||
1059 | goto out; | ||
1060 | } | ||
1061 | |||
1062 | info->modes = buffer->output[1] & 0xFFFF; | ||
1063 | info->type = (buffer->output[1] >> 24) & 0xFF; | ||
1064 | info->triggers = buffer->output[2] & 0xFF; | ||
1065 | units = (buffer->output[2] >> 8) & 0xFF; | ||
1066 | info->levels = (buffer->output[2] >> 16) & 0xFF; | ||
1067 | |||
1068 | if (units & BIT(0)) | ||
1069 | info->seconds = (buffer->output[3] >> 0) & 0xFF; | ||
1070 | if (units & BIT(1)) | ||
1071 | info->minutes = (buffer->output[3] >> 8) & 0xFF; | ||
1072 | if (units & BIT(2)) | ||
1073 | info->hours = (buffer->output[3] >> 16) & 0xFF; | ||
1074 | if (units & BIT(3)) | ||
1075 | info->days = (buffer->output[3] >> 24) & 0xFF; | ||
1076 | |||
1077 | out: | ||
1078 | release_buffer(); | ||
1079 | return ret; | ||
1080 | } | ||
1081 | |||
1082 | static unsigned int kbd_get_max_level(void) | ||
1083 | { | ||
1084 | if (kbd_info.levels != 0) | ||
1085 | return kbd_info.levels; | ||
1086 | if (kbd_mode_levels_count > 0) | ||
1087 | return kbd_mode_levels_count - 1; | ||
1088 | return 0; | ||
1089 | } | ||
1090 | |||
1091 | static int kbd_get_level(struct kbd_state *state) | ||
1092 | { | ||
1093 | int i; | ||
1094 | |||
1095 | if (kbd_info.levels != 0) | ||
1096 | return state->level; | ||
1097 | |||
1098 | if (kbd_mode_levels_count > 0) { | ||
1099 | for (i = 0; i < kbd_mode_levels_count; ++i) | ||
1100 | if (kbd_mode_levels[i] == state->mode_bit) | ||
1101 | return i; | ||
1102 | return 0; | ||
1103 | } | ||
1104 | |||
1105 | return -EINVAL; | ||
1106 | } | ||
1107 | |||
1108 | static int kbd_set_level(struct kbd_state *state, u8 level) | ||
1109 | { | ||
1110 | if (kbd_info.levels != 0) { | ||
1111 | if (level != 0) | ||
1112 | kbd_previous_level = level; | ||
1113 | if (state->level == level) | ||
1114 | return 0; | ||
1115 | state->level = level; | ||
1116 | if (level != 0 && state->mode_bit == KBD_MODE_BIT_OFF) | ||
1117 | state->mode_bit = kbd_previous_mode_bit; | ||
1118 | else if (level == 0 && state->mode_bit != KBD_MODE_BIT_OFF) { | ||
1119 | kbd_previous_mode_bit = state->mode_bit; | ||
1120 | state->mode_bit = KBD_MODE_BIT_OFF; | ||
1121 | } | ||
1122 | return 0; | ||
1123 | } | ||
1124 | |||
1125 | if (kbd_mode_levels_count > 0 && level < kbd_mode_levels_count) { | ||
1126 | if (level != 0) | ||
1127 | kbd_previous_level = level; | ||
1128 | state->mode_bit = kbd_mode_levels[level]; | ||
1129 | return 0; | ||
1130 | } | ||
1131 | |||
1132 | return -EINVAL; | ||
1133 | } | ||
1134 | |||
1135 | static int kbd_get_state(struct kbd_state *state) | ||
1136 | { | ||
1137 | int ret; | ||
1138 | |||
1139 | get_buffer(); | ||
1140 | |||
1141 | buffer->input[0] = 0x1; | ||
1142 | dell_send_request(buffer, 4, 11); | ||
1143 | ret = buffer->output[0]; | ||
1144 | |||
1145 | if (ret) { | ||
1146 | ret = dell_smi_error(ret); | ||
1147 | goto out; | ||
1148 | } | ||
1149 | |||
1150 | state->mode_bit = ffs(buffer->output[1] & 0xFFFF); | ||
1151 | if (state->mode_bit != 0) | ||
1152 | state->mode_bit--; | ||
1153 | |||
1154 | state->triggers = (buffer->output[1] >> 16) & 0xFF; | ||
1155 | state->timeout_value = (buffer->output[1] >> 24) & 0x3F; | ||
1156 | state->timeout_unit = (buffer->output[1] >> 30) & 0x3; | ||
1157 | state->als_setting = buffer->output[2] & 0xFF; | ||
1158 | state->als_value = (buffer->output[2] >> 8) & 0xFF; | ||
1159 | state->level = (buffer->output[2] >> 16) & 0xFF; | ||
1160 | |||
1161 | out: | ||
1162 | release_buffer(); | ||
1163 | return ret; | ||
1164 | } | ||
1165 | |||
1166 | static int kbd_set_state(struct kbd_state *state) | ||
1167 | { | ||
1168 | int ret; | ||
1169 | |||
1170 | get_buffer(); | ||
1171 | buffer->input[0] = 0x2; | ||
1172 | buffer->input[1] = BIT(state->mode_bit) & 0xFFFF; | ||
1173 | buffer->input[1] |= (state->triggers & 0xFF) << 16; | ||
1174 | buffer->input[1] |= (state->timeout_value & 0x3F) << 24; | ||
1175 | buffer->input[1] |= (state->timeout_unit & 0x3) << 30; | ||
1176 | buffer->input[2] = state->als_setting & 0xFF; | ||
1177 | buffer->input[2] |= (state->level & 0xFF) << 16; | ||
1178 | dell_send_request(buffer, 4, 11); | ||
1179 | ret = buffer->output[0]; | ||
1180 | release_buffer(); | ||
1181 | |||
1182 | return dell_smi_error(ret); | ||
1183 | } | ||
1184 | |||
1185 | static int kbd_set_state_safe(struct kbd_state *state, struct kbd_state *old) | ||
1186 | { | ||
1187 | int ret; | ||
1188 | |||
1189 | ret = kbd_set_state(state); | ||
1190 | if (ret == 0) | ||
1191 | return 0; | ||
1192 | |||
1193 | /* | ||
1194 | * When setting the new state fails,try to restore the previous one. | ||
1195 | * This is needed on some machines where BIOS sets a default state when | ||
1196 | * setting a new state fails. This default state could be all off. | ||
1197 | */ | ||
1198 | |||
1199 | if (kbd_set_state(old)) | ||
1200 | pr_err("Setting old previous keyboard state failed\n"); | ||
1201 | |||
1202 | return ret; | ||
1203 | } | ||
1204 | |||
1205 | static int kbd_set_token_bit(u8 bit) | ||
1206 | { | ||
1207 | int id; | ||
1208 | int ret; | ||
1209 | |||
1210 | if (bit >= ARRAY_SIZE(kbd_tokens)) | ||
1211 | return -EINVAL; | ||
1212 | |||
1213 | id = find_token_id(kbd_tokens[bit]); | ||
1214 | if (id == -1) | ||
1215 | return -EINVAL; | ||
1216 | |||
1217 | get_buffer(); | ||
1218 | buffer->input[0] = da_tokens[id].location; | ||
1219 | buffer->input[1] = da_tokens[id].value; | ||
1220 | dell_send_request(buffer, 1, 0); | ||
1221 | ret = buffer->output[0]; | ||
1222 | release_buffer(); | ||
1223 | |||
1224 | return dell_smi_error(ret); | ||
1225 | } | ||
1226 | |||
1227 | static int kbd_get_token_bit(u8 bit) | ||
1228 | { | ||
1229 | int id; | ||
1230 | int ret; | ||
1231 | int val; | ||
1232 | |||
1233 | if (bit >= ARRAY_SIZE(kbd_tokens)) | ||
1234 | return -EINVAL; | ||
1235 | |||
1236 | id = find_token_id(kbd_tokens[bit]); | ||
1237 | if (id == -1) | ||
1238 | return -EINVAL; | ||
1239 | |||
1240 | get_buffer(); | ||
1241 | buffer->input[0] = da_tokens[id].location; | ||
1242 | dell_send_request(buffer, 0, 0); | ||
1243 | ret = buffer->output[0]; | ||
1244 | val = buffer->output[1]; | ||
1245 | release_buffer(); | ||
1246 | |||
1247 | if (ret) | ||
1248 | return dell_smi_error(ret); | ||
1249 | |||
1250 | return (val == da_tokens[id].value); | ||
1251 | } | ||
1252 | |||
1253 | static int kbd_get_first_active_token_bit(void) | ||
1254 | { | ||
1255 | int i; | ||
1256 | int ret; | ||
1257 | |||
1258 | for (i = 0; i < ARRAY_SIZE(kbd_tokens); ++i) { | ||
1259 | ret = kbd_get_token_bit(i); | ||
1260 | if (ret == 1) | ||
1261 | return i; | ||
1262 | } | ||
1263 | |||
1264 | return ret; | ||
1265 | } | ||
1266 | |||
1267 | static int kbd_get_valid_token_counts(void) | ||
1268 | { | ||
1269 | return hweight16(kbd_token_bits); | ||
1270 | } | ||
1271 | |||
1272 | static inline int kbd_init_info(void) | ||
1273 | { | ||
1274 | struct kbd_state state; | ||
1275 | int ret; | ||
1276 | int i; | ||
1277 | |||
1278 | ret = kbd_get_info(&kbd_info); | ||
1279 | if (ret) | ||
1280 | return ret; | ||
1281 | |||
1282 | kbd_get_state(&state); | ||
1283 | |||
1284 | /* NOTE: timeout value is stored in 6 bits so max value is 63 */ | ||
1285 | if (kbd_info.seconds > 63) | ||
1286 | kbd_info.seconds = 63; | ||
1287 | if (kbd_info.minutes > 63) | ||
1288 | kbd_info.minutes = 63; | ||
1289 | if (kbd_info.hours > 63) | ||
1290 | kbd_info.hours = 63; | ||
1291 | if (kbd_info.days > 63) | ||
1292 | kbd_info.days = 63; | ||
1293 | |||
1294 | /* NOTE: On tested machines ON mode did not work and caused | ||
1295 | * problems (turned backlight off) so do not use it | ||
1296 | */ | ||
1297 | kbd_info.modes &= ~BIT(KBD_MODE_BIT_ON); | ||
1298 | |||
1299 | kbd_previous_level = kbd_get_level(&state); | ||
1300 | kbd_previous_mode_bit = state.mode_bit; | ||
1301 | |||
1302 | if (kbd_previous_level == 0 && kbd_get_max_level() != 0) | ||
1303 | kbd_previous_level = 1; | ||
1304 | |||
1305 | if (kbd_previous_mode_bit == KBD_MODE_BIT_OFF) { | ||
1306 | kbd_previous_mode_bit = | ||
1307 | ffs(kbd_info.modes & ~BIT(KBD_MODE_BIT_OFF)); | ||
1308 | if (kbd_previous_mode_bit != 0) | ||
1309 | kbd_previous_mode_bit--; | ||
1310 | } | ||
1311 | |||
1312 | if (kbd_info.modes & (BIT(KBD_MODE_BIT_ALS) | | ||
1313 | BIT(KBD_MODE_BIT_TRIGGER_ALS))) | ||
1314 | kbd_als_supported = true; | ||
1315 | |||
1316 | if (kbd_info.modes & ( | ||
1317 | BIT(KBD_MODE_BIT_TRIGGER_ALS) | BIT(KBD_MODE_BIT_TRIGGER) | | ||
1318 | BIT(KBD_MODE_BIT_TRIGGER_25) | BIT(KBD_MODE_BIT_TRIGGER_50) | | ||
1319 | BIT(KBD_MODE_BIT_TRIGGER_75) | BIT(KBD_MODE_BIT_TRIGGER_100) | ||
1320 | )) | ||
1321 | kbd_triggers_supported = true; | ||
1322 | |||
1323 | /* kbd_mode_levels[0] is reserved, see below */ | ||
1324 | for (i = 0; i < 16; ++i) | ||
1325 | if (kbd_is_level_mode_bit(i) && (BIT(i) & kbd_info.modes)) | ||
1326 | kbd_mode_levels[1 + kbd_mode_levels_count++] = i; | ||
1327 | |||
1328 | /* | ||
1329 | * Find the first supported mode and assign to kbd_mode_levels[0]. | ||
1330 | * This should be 0 (off), but we cannot depend on the BIOS to | ||
1331 | * support 0. | ||
1332 | */ | ||
1333 | if (kbd_mode_levels_count > 0) { | ||
1334 | for (i = 0; i < 16; ++i) { | ||
1335 | if (BIT(i) & kbd_info.modes) { | ||
1336 | kbd_mode_levels[0] = i; | ||
1337 | break; | ||
1338 | } | ||
1339 | } | ||
1340 | kbd_mode_levels_count++; | ||
1341 | } | ||
1342 | |||
1343 | return 0; | ||
1344 | |||
1345 | } | ||
1346 | |||
1347 | static inline void kbd_init_tokens(void) | ||
1348 | { | ||
1349 | int i; | ||
1350 | |||
1351 | for (i = 0; i < ARRAY_SIZE(kbd_tokens); ++i) | ||
1352 | if (find_token_id(kbd_tokens[i]) != -1) | ||
1353 | kbd_token_bits |= BIT(i); | ||
1354 | } | ||
1355 | |||
1356 | static void kbd_init(void) | ||
1357 | { | ||
1358 | int ret; | ||
1359 | |||
1360 | ret = kbd_init_info(); | ||
1361 | kbd_init_tokens(); | ||
1362 | |||
1363 | if (kbd_token_bits != 0 || ret == 0) | ||
1364 | kbd_led_present = true; | ||
1365 | } | ||
1366 | |||
1367 | static ssize_t kbd_led_timeout_store(struct device *dev, | ||
1368 | struct device_attribute *attr, | ||
1369 | const char *buf, size_t count) | ||
1370 | { | ||
1371 | struct kbd_state new_state; | ||
1372 | struct kbd_state state; | ||
1373 | bool convert; | ||
1374 | int value; | ||
1375 | int ret; | ||
1376 | char ch; | ||
1377 | u8 unit; | ||
1378 | int i; | ||
1379 | |||
1380 | ret = sscanf(buf, "%d %c", &value, &ch); | ||
1381 | if (ret < 1) | ||
1382 | return -EINVAL; | ||
1383 | else if (ret == 1) | ||
1384 | ch = 's'; | ||
1385 | |||
1386 | if (value < 0) | ||
1387 | return -EINVAL; | ||
1388 | |||
1389 | convert = false; | ||
1390 | |||
1391 | switch (ch) { | ||
1392 | case 's': | ||
1393 | if (value > kbd_info.seconds) | ||
1394 | convert = true; | ||
1395 | unit = KBD_TIMEOUT_SECONDS; | ||
1396 | break; | ||
1397 | case 'm': | ||
1398 | if (value > kbd_info.minutes) | ||
1399 | convert = true; | ||
1400 | unit = KBD_TIMEOUT_MINUTES; | ||
1401 | break; | ||
1402 | case 'h': | ||
1403 | if (value > kbd_info.hours) | ||
1404 | convert = true; | ||
1405 | unit = KBD_TIMEOUT_HOURS; | ||
1406 | break; | ||
1407 | case 'd': | ||
1408 | if (value > kbd_info.days) | ||
1409 | convert = true; | ||
1410 | unit = KBD_TIMEOUT_DAYS; | ||
1411 | break; | ||
1412 | default: | ||
1413 | return -EINVAL; | ||
1414 | } | ||
1415 | |||
1416 | if (quirks && quirks->needs_kbd_timeouts) | ||
1417 | convert = true; | ||
1418 | |||
1419 | if (convert) { | ||
1420 | /* Convert value from current units to seconds */ | ||
1421 | switch (unit) { | ||
1422 | case KBD_TIMEOUT_DAYS: | ||
1423 | value *= 24; | ||
1424 | case KBD_TIMEOUT_HOURS: | ||
1425 | value *= 60; | ||
1426 | case KBD_TIMEOUT_MINUTES: | ||
1427 | value *= 60; | ||
1428 | unit = KBD_TIMEOUT_SECONDS; | ||
1429 | } | ||
1430 | |||
1431 | if (quirks && quirks->needs_kbd_timeouts) { | ||
1432 | for (i = 0; quirks->kbd_timeouts[i] != -1; i++) { | ||
1433 | if (value <= quirks->kbd_timeouts[i]) { | ||
1434 | value = quirks->kbd_timeouts[i]; | ||
1435 | break; | ||
1436 | } | ||
1437 | } | ||
1438 | } | ||
1439 | |||
1440 | if (value <= kbd_info.seconds && kbd_info.seconds) { | ||
1441 | unit = KBD_TIMEOUT_SECONDS; | ||
1442 | } else if (value / 60 <= kbd_info.minutes && kbd_info.minutes) { | ||
1443 | value /= 60; | ||
1444 | unit = KBD_TIMEOUT_MINUTES; | ||
1445 | } else if (value / (60 * 60) <= kbd_info.hours && kbd_info.hours) { | ||
1446 | value /= (60 * 60); | ||
1447 | unit = KBD_TIMEOUT_HOURS; | ||
1448 | } else if (value / (60 * 60 * 24) <= kbd_info.days && kbd_info.days) { | ||
1449 | value /= (60 * 60 * 24); | ||
1450 | unit = KBD_TIMEOUT_DAYS; | ||
1451 | } else { | ||
1452 | return -EINVAL; | ||
1453 | } | ||
1454 | } | ||
1455 | |||
1456 | ret = kbd_get_state(&state); | ||
1457 | if (ret) | ||
1458 | return ret; | ||
1459 | |||
1460 | new_state = state; | ||
1461 | new_state.timeout_value = value; | ||
1462 | new_state.timeout_unit = unit; | ||
1463 | |||
1464 | ret = kbd_set_state_safe(&new_state, &state); | ||
1465 | if (ret) | ||
1466 | return ret; | ||
1467 | |||
1468 | return count; | ||
1469 | } | ||
1470 | |||
1471 | static ssize_t kbd_led_timeout_show(struct device *dev, | ||
1472 | struct device_attribute *attr, char *buf) | ||
1473 | { | ||
1474 | struct kbd_state state; | ||
1475 | int ret; | ||
1476 | int len; | ||
1477 | |||
1478 | ret = kbd_get_state(&state); | ||
1479 | if (ret) | ||
1480 | return ret; | ||
1481 | |||
1482 | len = sprintf(buf, "%d", state.timeout_value); | ||
1483 | |||
1484 | switch (state.timeout_unit) { | ||
1485 | case KBD_TIMEOUT_SECONDS: | ||
1486 | return len + sprintf(buf+len, "s\n"); | ||
1487 | case KBD_TIMEOUT_MINUTES: | ||
1488 | return len + sprintf(buf+len, "m\n"); | ||
1489 | case KBD_TIMEOUT_HOURS: | ||
1490 | return len + sprintf(buf+len, "h\n"); | ||
1491 | case KBD_TIMEOUT_DAYS: | ||
1492 | return len + sprintf(buf+len, "d\n"); | ||
1493 | default: | ||
1494 | return -EINVAL; | ||
1495 | } | ||
1496 | |||
1497 | return len; | ||
1498 | } | ||
1499 | |||
1500 | static DEVICE_ATTR(stop_timeout, S_IRUGO | S_IWUSR, | ||
1501 | kbd_led_timeout_show, kbd_led_timeout_store); | ||
1502 | |||
1503 | static const char * const kbd_led_triggers[] = { | ||
1504 | "keyboard", | ||
1505 | "touchpad", | ||
1506 | /*"trackstick"*/ NULL, /* NOTE: trackstick is just alias for touchpad */ | ||
1507 | "mouse", | ||
1508 | }; | ||
1509 | |||
1510 | static ssize_t kbd_led_triggers_store(struct device *dev, | ||
1511 | struct device_attribute *attr, | ||
1512 | const char *buf, size_t count) | ||
1513 | { | ||
1514 | struct kbd_state new_state; | ||
1515 | struct kbd_state state; | ||
1516 | bool triggers_enabled = false; | ||
1517 | bool als_enabled = false; | ||
1518 | bool disable_als = false; | ||
1519 | bool enable_als = false; | ||
1520 | int trigger_bit = -1; | ||
1521 | char trigger[21]; | ||
1522 | int i, ret; | ||
1523 | |||
1524 | ret = sscanf(buf, "%20s", trigger); | ||
1525 | if (ret != 1) | ||
1526 | return -EINVAL; | ||
1527 | |||
1528 | if (trigger[0] != '+' && trigger[0] != '-') | ||
1529 | return -EINVAL; | ||
1530 | |||
1531 | ret = kbd_get_state(&state); | ||
1532 | if (ret) | ||
1533 | return ret; | ||
1534 | |||
1535 | if (kbd_als_supported) | ||
1536 | als_enabled = kbd_is_als_mode_bit(state.mode_bit); | ||
1537 | |||
1538 | if (kbd_triggers_supported) | ||
1539 | triggers_enabled = kbd_is_trigger_mode_bit(state.mode_bit); | ||
1540 | |||
1541 | if (kbd_als_supported) { | ||
1542 | if (strcmp(trigger, "+als") == 0) { | ||
1543 | if (als_enabled) | ||
1544 | return count; | ||
1545 | enable_als = true; | ||
1546 | } else if (strcmp(trigger, "-als") == 0) { | ||
1547 | if (!als_enabled) | ||
1548 | return count; | ||
1549 | disable_als = true; | ||
1550 | } | ||
1551 | } | ||
1552 | |||
1553 | if (enable_als || disable_als) { | ||
1554 | new_state = state; | ||
1555 | if (enable_als) { | ||
1556 | if (triggers_enabled) | ||
1557 | new_state.mode_bit = KBD_MODE_BIT_TRIGGER_ALS; | ||
1558 | else | ||
1559 | new_state.mode_bit = KBD_MODE_BIT_ALS; | ||
1560 | } else { | ||
1561 | if (triggers_enabled) { | ||
1562 | new_state.mode_bit = KBD_MODE_BIT_TRIGGER; | ||
1563 | kbd_set_level(&new_state, kbd_previous_level); | ||
1564 | } else { | ||
1565 | new_state.mode_bit = KBD_MODE_BIT_ON; | ||
1566 | } | ||
1567 | } | ||
1568 | if (!(kbd_info.modes & BIT(new_state.mode_bit))) | ||
1569 | return -EINVAL; | ||
1570 | ret = kbd_set_state_safe(&new_state, &state); | ||
1571 | if (ret) | ||
1572 | return ret; | ||
1573 | kbd_previous_mode_bit = new_state.mode_bit; | ||
1574 | return count; | ||
1575 | } | ||
1576 | |||
1577 | if (kbd_triggers_supported) { | ||
1578 | for (i = 0; i < ARRAY_SIZE(kbd_led_triggers); ++i) { | ||
1579 | if (!(kbd_info.triggers & BIT(i))) | ||
1580 | continue; | ||
1581 | if (!kbd_led_triggers[i]) | ||
1582 | continue; | ||
1583 | if (strcmp(trigger+1, kbd_led_triggers[i]) != 0) | ||
1584 | continue; | ||
1585 | if (trigger[0] == '+' && | ||
1586 | triggers_enabled && (state.triggers & BIT(i))) | ||
1587 | return count; | ||
1588 | if (trigger[0] == '-' && | ||
1589 | (!triggers_enabled || !(state.triggers & BIT(i)))) | ||
1590 | return count; | ||
1591 | trigger_bit = i; | ||
1592 | break; | ||
1593 | } | ||
1594 | } | ||
1595 | |||
1596 | if (trigger_bit != -1) { | ||
1597 | new_state = state; | ||
1598 | if (trigger[0] == '+') | ||
1599 | new_state.triggers |= BIT(trigger_bit); | ||
1600 | else { | ||
1601 | new_state.triggers &= ~BIT(trigger_bit); | ||
1602 | /* NOTE: trackstick bit (2) must be disabled when | ||
1603 | * disabling touchpad bit (1), otherwise touchpad | ||
1604 | * bit (1) will not be disabled */ | ||
1605 | if (trigger_bit == 1) | ||
1606 | new_state.triggers &= ~BIT(2); | ||
1607 | } | ||
1608 | if ((kbd_info.triggers & new_state.triggers) != | ||
1609 | new_state.triggers) | ||
1610 | return -EINVAL; | ||
1611 | if (new_state.triggers && !triggers_enabled) { | ||
1612 | if (als_enabled) | ||
1613 | new_state.mode_bit = KBD_MODE_BIT_TRIGGER_ALS; | ||
1614 | else { | ||
1615 | new_state.mode_bit = KBD_MODE_BIT_TRIGGER; | ||
1616 | kbd_set_level(&new_state, kbd_previous_level); | ||
1617 | } | ||
1618 | } else if (new_state.triggers == 0) { | ||
1619 | if (als_enabled) | ||
1620 | new_state.mode_bit = KBD_MODE_BIT_ALS; | ||
1621 | else | ||
1622 | kbd_set_level(&new_state, 0); | ||
1623 | } | ||
1624 | if (!(kbd_info.modes & BIT(new_state.mode_bit))) | ||
1625 | return -EINVAL; | ||
1626 | ret = kbd_set_state_safe(&new_state, &state); | ||
1627 | if (ret) | ||
1628 | return ret; | ||
1629 | if (new_state.mode_bit != KBD_MODE_BIT_OFF) | ||
1630 | kbd_previous_mode_bit = new_state.mode_bit; | ||
1631 | return count; | ||
1632 | } | ||
1633 | |||
1634 | return -EINVAL; | ||
1635 | } | ||
1636 | |||
1637 | static ssize_t kbd_led_triggers_show(struct device *dev, | ||
1638 | struct device_attribute *attr, char *buf) | ||
1639 | { | ||
1640 | struct kbd_state state; | ||
1641 | bool triggers_enabled; | ||
1642 | int level, i, ret; | ||
1643 | int len = 0; | ||
1644 | |||
1645 | ret = kbd_get_state(&state); | ||
1646 | if (ret) | ||
1647 | return ret; | ||
1648 | |||
1649 | len = 0; | ||
1650 | |||
1651 | if (kbd_triggers_supported) { | ||
1652 | triggers_enabled = kbd_is_trigger_mode_bit(state.mode_bit); | ||
1653 | level = kbd_get_level(&state); | ||
1654 | for (i = 0; i < ARRAY_SIZE(kbd_led_triggers); ++i) { | ||
1655 | if (!(kbd_info.triggers & BIT(i))) | ||
1656 | continue; | ||
1657 | if (!kbd_led_triggers[i]) | ||
1658 | continue; | ||
1659 | if ((triggers_enabled || level <= 0) && | ||
1660 | (state.triggers & BIT(i))) | ||
1661 | buf[len++] = '+'; | ||
1662 | else | ||
1663 | buf[len++] = '-'; | ||
1664 | len += sprintf(buf+len, "%s ", kbd_led_triggers[i]); | ||
1665 | } | ||
1666 | } | ||
1667 | |||
1668 | if (kbd_als_supported) { | ||
1669 | if (kbd_is_als_mode_bit(state.mode_bit)) | ||
1670 | len += sprintf(buf+len, "+als "); | ||
1671 | else | ||
1672 | len += sprintf(buf+len, "-als "); | ||
1673 | } | ||
1674 | |||
1675 | if (len) | ||
1676 | buf[len - 1] = '\n'; | ||
1677 | |||
1678 | return len; | ||
1679 | } | ||
1680 | |||
1681 | static DEVICE_ATTR(start_triggers, S_IRUGO | S_IWUSR, | ||
1682 | kbd_led_triggers_show, kbd_led_triggers_store); | ||
1683 | |||
1684 | static ssize_t kbd_led_als_store(struct device *dev, | ||
1685 | struct device_attribute *attr, | ||
1686 | const char *buf, size_t count) | ||
1687 | { | ||
1688 | struct kbd_state state; | ||
1689 | struct kbd_state new_state; | ||
1690 | u8 setting; | ||
1691 | int ret; | ||
1692 | |||
1693 | ret = kstrtou8(buf, 10, &setting); | ||
1694 | if (ret) | ||
1695 | return ret; | ||
1696 | |||
1697 | ret = kbd_get_state(&state); | ||
1698 | if (ret) | ||
1699 | return ret; | ||
1700 | |||
1701 | new_state = state; | ||
1702 | new_state.als_setting = setting; | ||
1703 | |||
1704 | ret = kbd_set_state_safe(&new_state, &state); | ||
1705 | if (ret) | ||
1706 | return ret; | ||
1707 | |||
1708 | return count; | ||
1709 | } | ||
1710 | |||
1711 | static ssize_t kbd_led_als_show(struct device *dev, | ||
1712 | struct device_attribute *attr, char *buf) | ||
1713 | { | ||
1714 | struct kbd_state state; | ||
1715 | int ret; | ||
1716 | |||
1717 | ret = kbd_get_state(&state); | ||
1718 | if (ret) | ||
1719 | return ret; | ||
1720 | |||
1721 | return sprintf(buf, "%d\n", state.als_setting); | ||
1722 | } | ||
1723 | |||
1724 | static DEVICE_ATTR(als_setting, S_IRUGO | S_IWUSR, | ||
1725 | kbd_led_als_show, kbd_led_als_store); | ||
1726 | |||
1727 | static struct attribute *kbd_led_attrs[] = { | ||
1728 | &dev_attr_stop_timeout.attr, | ||
1729 | &dev_attr_start_triggers.attr, | ||
1730 | &dev_attr_als_setting.attr, | ||
1731 | NULL, | ||
1732 | }; | ||
1733 | ATTRIBUTE_GROUPS(kbd_led); | ||
1734 | |||
1735 | static enum led_brightness kbd_led_level_get(struct led_classdev *led_cdev) | ||
1736 | { | ||
1737 | int ret; | ||
1738 | u16 num; | ||
1739 | struct kbd_state state; | ||
1740 | |||
1741 | if (kbd_get_max_level()) { | ||
1742 | ret = kbd_get_state(&state); | ||
1743 | if (ret) | ||
1744 | return 0; | ||
1745 | ret = kbd_get_level(&state); | ||
1746 | if (ret < 0) | ||
1747 | return 0; | ||
1748 | return ret; | ||
1749 | } | ||
1750 | |||
1751 | if (kbd_get_valid_token_counts()) { | ||
1752 | ret = kbd_get_first_active_token_bit(); | ||
1753 | if (ret < 0) | ||
1754 | return 0; | ||
1755 | for (num = kbd_token_bits; num != 0 && ret > 0; --ret) | ||
1756 | num &= num - 1; /* clear the first bit set */ | ||
1757 | if (num == 0) | ||
1758 | return 0; | ||
1759 | return ffs(num) - 1; | ||
1760 | } | ||
1761 | |||
1762 | pr_warn("Keyboard brightness level control not supported\n"); | ||
1763 | return 0; | ||
1764 | } | ||
1765 | |||
1766 | static void kbd_led_level_set(struct led_classdev *led_cdev, | ||
1767 | enum led_brightness value) | ||
1768 | { | ||
1769 | struct kbd_state state; | ||
1770 | struct kbd_state new_state; | ||
1771 | u16 num; | ||
1772 | |||
1773 | if (kbd_get_max_level()) { | ||
1774 | if (kbd_get_state(&state)) | ||
1775 | return; | ||
1776 | new_state = state; | ||
1777 | if (kbd_set_level(&new_state, value)) | ||
1778 | return; | ||
1779 | kbd_set_state_safe(&new_state, &state); | ||
1780 | return; | ||
1781 | } | ||
1782 | |||
1783 | if (kbd_get_valid_token_counts()) { | ||
1784 | for (num = kbd_token_bits; num != 0 && value > 0; --value) | ||
1785 | num &= num - 1; /* clear the first bit set */ | ||
1786 | if (num == 0) | ||
1787 | return; | ||
1788 | kbd_set_token_bit(ffs(num) - 1); | ||
1789 | return; | ||
1790 | } | ||
1791 | |||
1792 | pr_warn("Keyboard brightness level control not supported\n"); | ||
1793 | } | ||
1794 | |||
1795 | static struct led_classdev kbd_led = { | ||
1796 | .name = "dell::kbd_backlight", | ||
1797 | .brightness_set = kbd_led_level_set, | ||
1798 | .brightness_get = kbd_led_level_get, | ||
1799 | .groups = kbd_led_groups, | ||
1800 | }; | ||
1801 | |||
1802 | static int __init kbd_led_init(struct device *dev) | ||
1803 | { | ||
1804 | kbd_init(); | ||
1805 | if (!kbd_led_present) | ||
1806 | return -ENODEV; | ||
1807 | kbd_led.max_brightness = kbd_get_max_level(); | ||
1808 | if (!kbd_led.max_brightness) { | ||
1809 | kbd_led.max_brightness = kbd_get_valid_token_counts(); | ||
1810 | if (kbd_led.max_brightness) | ||
1811 | kbd_led.max_brightness--; | ||
1812 | } | ||
1813 | return led_classdev_register(dev, &kbd_led); | ||
1814 | } | ||
1815 | |||
1816 | static void brightness_set_exit(struct led_classdev *led_cdev, | ||
1817 | enum led_brightness value) | ||
1818 | { | ||
1819 | /* Don't change backlight level on exit */ | ||
1820 | }; | ||
1821 | |||
1822 | static void kbd_led_exit(void) | ||
1823 | { | ||
1824 | if (!kbd_led_present) | ||
1825 | return; | ||
1826 | kbd_led.brightness_set = brightness_set_exit; | ||
1827 | led_classdev_unregister(&kbd_led); | ||
1828 | } | ||
1829 | |||
1830 | static int __init dell_init(void) | 792 | static int __init dell_init(void) |
1831 | { | 793 | { |
1832 | int max_intensity = 0; | 794 | int max_intensity = 0; |
@@ -1879,8 +841,6 @@ static int __init dell_init(void) | |||
1879 | if (quirks && quirks->touchpad_led) | 841 | if (quirks && quirks->touchpad_led) |
1880 | touchpad_led_init(&platform_device->dev); | 842 | touchpad_led_init(&platform_device->dev); |
1881 | 843 | ||
1882 | kbd_led_init(&platform_device->dev); | ||
1883 | |||
1884 | dell_laptop_dir = debugfs_create_dir("dell_laptop", NULL); | 844 | dell_laptop_dir = debugfs_create_dir("dell_laptop", NULL); |
1885 | if (dell_laptop_dir != NULL) | 845 | if (dell_laptop_dir != NULL) |
1886 | debugfs_create_file("rfkill", 0444, dell_laptop_dir, NULL, | 846 | debugfs_create_file("rfkill", 0444, dell_laptop_dir, NULL, |
@@ -1948,7 +908,6 @@ static void __exit dell_exit(void) | |||
1948 | debugfs_remove_recursive(dell_laptop_dir); | 908 | debugfs_remove_recursive(dell_laptop_dir); |
1949 | if (quirks && quirks->touchpad_led) | 909 | if (quirks && quirks->touchpad_led) |
1950 | touchpad_led_exit(); | 910 | touchpad_led_exit(); |
1951 | kbd_led_exit(); | ||
1952 | i8042_remove_filter(dell_laptop_i8042_filter); | 911 | i8042_remove_filter(dell_laptop_i8042_filter); |
1953 | cancel_delayed_work_sync(&dell_rfkill_work); | 912 | cancel_delayed_work_sync(&dell_rfkill_work); |
1954 | backlight_device_unregister(dell_backlight_device); | 913 | backlight_device_unregister(dell_backlight_device); |
@@ -1965,7 +924,5 @@ module_init(dell_init); | |||
1965 | module_exit(dell_exit); | 924 | module_exit(dell_exit); |
1966 | 925 | ||
1967 | MODULE_AUTHOR("Matthew Garrett <mjg@redhat.com>"); | 926 | MODULE_AUTHOR("Matthew Garrett <mjg@redhat.com>"); |
1968 | MODULE_AUTHOR("Gabriele Mazzotta <gabriele.mzt@gmail.com>"); | ||
1969 | MODULE_AUTHOR("Pali Rohár <pali.rohar@gmail.com>"); | ||
1970 | MODULE_DESCRIPTION("Dell laptop driver"); | 927 | MODULE_DESCRIPTION("Dell laptop driver"); |
1971 | MODULE_LICENSE("GPL"); | 928 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index e225711bb8bc..9c48fb32f660 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c | |||
@@ -1488,7 +1488,7 @@ struct regulator *regulator_get_optional(struct device *dev, const char *id) | |||
1488 | } | 1488 | } |
1489 | EXPORT_SYMBOL_GPL(regulator_get_optional); | 1489 | EXPORT_SYMBOL_GPL(regulator_get_optional); |
1490 | 1490 | ||
1491 | /* Locks held by regulator_put() */ | 1491 | /* regulator_list_mutex lock held by regulator_put() */ |
1492 | static void _regulator_put(struct regulator *regulator) | 1492 | static void _regulator_put(struct regulator *regulator) |
1493 | { | 1493 | { |
1494 | struct regulator_dev *rdev; | 1494 | struct regulator_dev *rdev; |
@@ -1503,12 +1503,14 @@ static void _regulator_put(struct regulator *regulator) | |||
1503 | /* remove any sysfs entries */ | 1503 | /* remove any sysfs entries */ |
1504 | if (regulator->dev) | 1504 | if (regulator->dev) |
1505 | sysfs_remove_link(&rdev->dev.kobj, regulator->supply_name); | 1505 | sysfs_remove_link(&rdev->dev.kobj, regulator->supply_name); |
1506 | mutex_lock(&rdev->mutex); | ||
1506 | kfree(regulator->supply_name); | 1507 | kfree(regulator->supply_name); |
1507 | list_del(®ulator->list); | 1508 | list_del(®ulator->list); |
1508 | kfree(regulator); | 1509 | kfree(regulator); |
1509 | 1510 | ||
1510 | rdev->open_count--; | 1511 | rdev->open_count--; |
1511 | rdev->exclusive = 0; | 1512 | rdev->exclusive = 0; |
1513 | mutex_unlock(&rdev->mutex); | ||
1512 | 1514 | ||
1513 | module_put(rdev->owner); | 1515 | module_put(rdev->owner); |
1514 | } | 1516 | } |
diff --git a/drivers/regulator/s2mps11.c b/drivers/regulator/s2mps11.c index 2809ae0d6bcd..ff828117798f 100644 --- a/drivers/regulator/s2mps11.c +++ b/drivers/regulator/s2mps11.c | |||
@@ -405,6 +405,40 @@ static struct regulator_ops s2mps14_reg_ops; | |||
405 | .enable_mask = S2MPS14_ENABLE_MASK \ | 405 | .enable_mask = S2MPS14_ENABLE_MASK \ |
406 | } | 406 | } |
407 | 407 | ||
408 | #define regulator_desc_s2mps13_buck7(num, min, step, min_sel) { \ | ||
409 | .name = "BUCK"#num, \ | ||
410 | .id = S2MPS13_BUCK##num, \ | ||
411 | .ops = &s2mps14_reg_ops, \ | ||
412 | .type = REGULATOR_VOLTAGE, \ | ||
413 | .owner = THIS_MODULE, \ | ||
414 | .min_uV = min, \ | ||
415 | .uV_step = step, \ | ||
416 | .linear_min_sel = min_sel, \ | ||
417 | .n_voltages = S2MPS14_BUCK_N_VOLTAGES, \ | ||
418 | .ramp_delay = S2MPS13_BUCK_RAMP_DELAY, \ | ||
419 | .vsel_reg = S2MPS13_REG_B1OUT + (num) * 2 - 1, \ | ||
420 | .vsel_mask = S2MPS14_BUCK_VSEL_MASK, \ | ||
421 | .enable_reg = S2MPS13_REG_B1CTRL + (num - 1) * 2, \ | ||
422 | .enable_mask = S2MPS14_ENABLE_MASK \ | ||
423 | } | ||
424 | |||
425 | #define regulator_desc_s2mps13_buck8_10(num, min, step, min_sel) { \ | ||
426 | .name = "BUCK"#num, \ | ||
427 | .id = S2MPS13_BUCK##num, \ | ||
428 | .ops = &s2mps14_reg_ops, \ | ||
429 | .type = REGULATOR_VOLTAGE, \ | ||
430 | .owner = THIS_MODULE, \ | ||
431 | .min_uV = min, \ | ||
432 | .uV_step = step, \ | ||
433 | .linear_min_sel = min_sel, \ | ||
434 | .n_voltages = S2MPS14_BUCK_N_VOLTAGES, \ | ||
435 | .ramp_delay = S2MPS13_BUCK_RAMP_DELAY, \ | ||
436 | .vsel_reg = S2MPS13_REG_B1OUT + (num) * 2 - 1, \ | ||
437 | .vsel_mask = S2MPS14_BUCK_VSEL_MASK, \ | ||
438 | .enable_reg = S2MPS13_REG_B1CTRL + (num) * 2 - 1, \ | ||
439 | .enable_mask = S2MPS14_ENABLE_MASK \ | ||
440 | } | ||
441 | |||
408 | static const struct regulator_desc s2mps13_regulators[] = { | 442 | static const struct regulator_desc s2mps13_regulators[] = { |
409 | regulator_desc_s2mps13_ldo(1, MIN_800_MV, STEP_12_5_MV, 0x00), | 443 | regulator_desc_s2mps13_ldo(1, MIN_800_MV, STEP_12_5_MV, 0x00), |
410 | regulator_desc_s2mps13_ldo(2, MIN_1400_MV, STEP_50_MV, 0x0C), | 444 | regulator_desc_s2mps13_ldo(2, MIN_1400_MV, STEP_50_MV, 0x0C), |
@@ -452,10 +486,10 @@ static const struct regulator_desc s2mps13_regulators[] = { | |||
452 | regulator_desc_s2mps13_buck(4, MIN_500_MV, STEP_6_25_MV, 0x10), | 486 | regulator_desc_s2mps13_buck(4, MIN_500_MV, STEP_6_25_MV, 0x10), |
453 | regulator_desc_s2mps13_buck(5, MIN_500_MV, STEP_6_25_MV, 0x10), | 487 | regulator_desc_s2mps13_buck(5, MIN_500_MV, STEP_6_25_MV, 0x10), |
454 | regulator_desc_s2mps13_buck(6, MIN_500_MV, STEP_6_25_MV, 0x10), | 488 | regulator_desc_s2mps13_buck(6, MIN_500_MV, STEP_6_25_MV, 0x10), |
455 | regulator_desc_s2mps13_buck(7, MIN_500_MV, STEP_6_25_MV, 0x10), | 489 | regulator_desc_s2mps13_buck7(7, MIN_500_MV, STEP_6_25_MV, 0x10), |
456 | regulator_desc_s2mps13_buck(8, MIN_1000_MV, STEP_12_5_MV, 0x20), | 490 | regulator_desc_s2mps13_buck8_10(8, MIN_1000_MV, STEP_12_5_MV, 0x20), |
457 | regulator_desc_s2mps13_buck(9, MIN_1000_MV, STEP_12_5_MV, 0x20), | 491 | regulator_desc_s2mps13_buck8_10(9, MIN_1000_MV, STEP_12_5_MV, 0x20), |
458 | regulator_desc_s2mps13_buck(10, MIN_500_MV, STEP_6_25_MV, 0x10), | 492 | regulator_desc_s2mps13_buck8_10(10, MIN_500_MV, STEP_6_25_MV, 0x10), |
459 | }; | 493 | }; |
460 | 494 | ||
461 | static int s2mps14_regulator_enable(struct regulator_dev *rdev) | 495 | static int s2mps14_regulator_enable(struct regulator_dev *rdev) |
diff --git a/drivers/reset/reset-sunxi.c b/drivers/reset/reset-sunxi.c index eebc52cb6984..3d95c87160b3 100644 --- a/drivers/reset/reset-sunxi.c +++ b/drivers/reset/reset-sunxi.c | |||
@@ -102,6 +102,8 @@ static int sunxi_reset_init(struct device_node *np) | |||
102 | goto err_alloc; | 102 | goto err_alloc; |
103 | } | 103 | } |
104 | 104 | ||
105 | spin_lock_init(&data->lock); | ||
106 | |||
105 | data->rcdev.owner = THIS_MODULE; | 107 | data->rcdev.owner = THIS_MODULE; |
106 | data->rcdev.nr_resets = size * 32; | 108 | data->rcdev.nr_resets = size * 32; |
107 | data->rcdev.ops = &sunxi_reset_ops; | 109 | data->rcdev.ops = &sunxi_reset_ops; |
@@ -157,6 +159,8 @@ static int sunxi_reset_probe(struct platform_device *pdev) | |||
157 | if (IS_ERR(data->membase)) | 159 | if (IS_ERR(data->membase)) |
158 | return PTR_ERR(data->membase); | 160 | return PTR_ERR(data->membase); |
159 | 161 | ||
162 | spin_lock_init(&data->lock); | ||
163 | |||
160 | data->rcdev.owner = THIS_MODULE; | 164 | data->rcdev.owner = THIS_MODULE; |
161 | data->rcdev.nr_resets = resource_size(res) * 32; | 165 | data->rcdev.nr_resets = resource_size(res) * 32; |
162 | data->rcdev.ops = &sunxi_reset_ops; | 166 | data->rcdev.ops = &sunxi_reset_ops; |
diff --git a/drivers/rtc/rtc-s5m.c b/drivers/rtc/rtc-s5m.c index b5e7c4670205..89ac1d5083c6 100644 --- a/drivers/rtc/rtc-s5m.c +++ b/drivers/rtc/rtc-s5m.c | |||
@@ -832,6 +832,7 @@ static SIMPLE_DEV_PM_OPS(s5m_rtc_pm_ops, s5m_rtc_suspend, s5m_rtc_resume); | |||
832 | static const struct platform_device_id s5m_rtc_id[] = { | 832 | static const struct platform_device_id s5m_rtc_id[] = { |
833 | { "s5m-rtc", S5M8767X }, | 833 | { "s5m-rtc", S5M8767X }, |
834 | { "s2mps14-rtc", S2MPS14X }, | 834 | { "s2mps14-rtc", S2MPS14X }, |
835 | { }, | ||
835 | }; | 836 | }; |
836 | 837 | ||
837 | static struct platform_driver s5m_rtc_driver = { | 838 | static struct platform_driver s5m_rtc_driver = { |
diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c index f407e3763432..642c77c76b84 100644 --- a/drivers/s390/net/qeth_core_main.c +++ b/drivers/s390/net/qeth_core_main.c | |||
@@ -1784,6 +1784,8 @@ static int qeth_idx_activate_get_answer(struct qeth_channel *channel, | |||
1784 | QETH_DBF_TEXT(SETUP, 2, "idxanswr"); | 1784 | QETH_DBF_TEXT(SETUP, 2, "idxanswr"); |
1785 | card = CARD_FROM_CDEV(channel->ccwdev); | 1785 | card = CARD_FROM_CDEV(channel->ccwdev); |
1786 | iob = qeth_get_buffer(channel); | 1786 | iob = qeth_get_buffer(channel); |
1787 | if (!iob) | ||
1788 | return -ENOMEM; | ||
1787 | iob->callback = idx_reply_cb; | 1789 | iob->callback = idx_reply_cb; |
1788 | memcpy(&channel->ccw, READ_CCW, sizeof(struct ccw1)); | 1790 | memcpy(&channel->ccw, READ_CCW, sizeof(struct ccw1)); |
1789 | channel->ccw.count = QETH_BUFSIZE; | 1791 | channel->ccw.count = QETH_BUFSIZE; |
@@ -1834,6 +1836,8 @@ static int qeth_idx_activate_channel(struct qeth_channel *channel, | |||
1834 | QETH_DBF_TEXT(SETUP, 2, "idxactch"); | 1836 | QETH_DBF_TEXT(SETUP, 2, "idxactch"); |
1835 | 1837 | ||
1836 | iob = qeth_get_buffer(channel); | 1838 | iob = qeth_get_buffer(channel); |
1839 | if (!iob) | ||
1840 | return -ENOMEM; | ||
1837 | iob->callback = idx_reply_cb; | 1841 | iob->callback = idx_reply_cb; |
1838 | memcpy(&channel->ccw, WRITE_CCW, sizeof(struct ccw1)); | 1842 | memcpy(&channel->ccw, WRITE_CCW, sizeof(struct ccw1)); |
1839 | channel->ccw.count = IDX_ACTIVATE_SIZE; | 1843 | channel->ccw.count = IDX_ACTIVATE_SIZE; |
@@ -2021,10 +2025,36 @@ void qeth_prepare_control_data(struct qeth_card *card, int len, | |||
2021 | } | 2025 | } |
2022 | EXPORT_SYMBOL_GPL(qeth_prepare_control_data); | 2026 | EXPORT_SYMBOL_GPL(qeth_prepare_control_data); |
2023 | 2027 | ||
2028 | /** | ||
2029 | * qeth_send_control_data() - send control command to the card | ||
2030 | * @card: qeth_card structure pointer | ||
2031 | * @len: size of the command buffer | ||
2032 | * @iob: qeth_cmd_buffer pointer | ||
2033 | * @reply_cb: callback function pointer | ||
2034 | * @cb_card: pointer to the qeth_card structure | ||
2035 | * @cb_reply: pointer to the qeth_reply structure | ||
2036 | * @cb_cmd: pointer to the original iob for non-IPA | ||
2037 | * commands, or to the qeth_ipa_cmd structure | ||
2038 | * for the IPA commands. | ||
2039 | * @reply_param: private pointer passed to the callback | ||
2040 | * | ||
2041 | * Returns the value of the `return_code' field of the response | ||
2042 | * block returned from the hardware, or other error indication. | ||
2043 | * Value of zero indicates successful execution of the command. | ||
2044 | * | ||
2045 | * Callback function gets called one or more times, with cb_cmd | ||
2046 | * pointing to the response returned by the hardware. Callback | ||
2047 | * function must return non-zero if more reply blocks are expected, | ||
2048 | * and zero if the last or only reply block is received. Callback | ||
2049 | * function can get the value of the reply_param pointer from the | ||
2050 | * field 'param' of the structure qeth_reply. | ||
2051 | */ | ||
2052 | |||
2024 | int qeth_send_control_data(struct qeth_card *card, int len, | 2053 | int qeth_send_control_data(struct qeth_card *card, int len, |
2025 | struct qeth_cmd_buffer *iob, | 2054 | struct qeth_cmd_buffer *iob, |
2026 | int (*reply_cb)(struct qeth_card *, struct qeth_reply *, | 2055 | int (*reply_cb)(struct qeth_card *cb_card, |
2027 | unsigned long), | 2056 | struct qeth_reply *cb_reply, |
2057 | unsigned long cb_cmd), | ||
2028 | void *reply_param) | 2058 | void *reply_param) |
2029 | { | 2059 | { |
2030 | int rc; | 2060 | int rc; |
@@ -2914,9 +2944,16 @@ struct qeth_cmd_buffer *qeth_get_ipacmd_buffer(struct qeth_card *card, | |||
2914 | struct qeth_cmd_buffer *iob; | 2944 | struct qeth_cmd_buffer *iob; |
2915 | struct qeth_ipa_cmd *cmd; | 2945 | struct qeth_ipa_cmd *cmd; |
2916 | 2946 | ||
2917 | iob = qeth_wait_for_buffer(&card->write); | 2947 | iob = qeth_get_buffer(&card->write); |
2918 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | 2948 | if (iob) { |
2919 | qeth_fill_ipacmd_header(card, cmd, ipacmd, prot); | 2949 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); |
2950 | qeth_fill_ipacmd_header(card, cmd, ipacmd, prot); | ||
2951 | } else { | ||
2952 | dev_warn(&card->gdev->dev, | ||
2953 | "The qeth driver ran out of channel command buffers\n"); | ||
2954 | QETH_DBF_MESSAGE(1, "%s The qeth driver ran out of channel command buffers", | ||
2955 | dev_name(&card->gdev->dev)); | ||
2956 | } | ||
2920 | 2957 | ||
2921 | return iob; | 2958 | return iob; |
2922 | } | 2959 | } |
@@ -2932,6 +2969,12 @@ void qeth_prepare_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob, | |||
2932 | } | 2969 | } |
2933 | EXPORT_SYMBOL_GPL(qeth_prepare_ipa_cmd); | 2970 | EXPORT_SYMBOL_GPL(qeth_prepare_ipa_cmd); |
2934 | 2971 | ||
2972 | /** | ||
2973 | * qeth_send_ipa_cmd() - send an IPA command | ||
2974 | * | ||
2975 | * See qeth_send_control_data() for explanation of the arguments. | ||
2976 | */ | ||
2977 | |||
2935 | int qeth_send_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob, | 2978 | int qeth_send_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob, |
2936 | int (*reply_cb)(struct qeth_card *, struct qeth_reply*, | 2979 | int (*reply_cb)(struct qeth_card *, struct qeth_reply*, |
2937 | unsigned long), | 2980 | unsigned long), |
@@ -2968,6 +3011,8 @@ int qeth_send_startlan(struct qeth_card *card) | |||
2968 | QETH_DBF_TEXT(SETUP, 2, "strtlan"); | 3011 | QETH_DBF_TEXT(SETUP, 2, "strtlan"); |
2969 | 3012 | ||
2970 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_STARTLAN, 0); | 3013 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_STARTLAN, 0); |
3014 | if (!iob) | ||
3015 | return -ENOMEM; | ||
2971 | rc = qeth_send_ipa_cmd(card, iob, NULL, NULL); | 3016 | rc = qeth_send_ipa_cmd(card, iob, NULL, NULL); |
2972 | return rc; | 3017 | return rc; |
2973 | } | 3018 | } |
@@ -3013,11 +3058,13 @@ static struct qeth_cmd_buffer *qeth_get_adapter_cmd(struct qeth_card *card, | |||
3013 | 3058 | ||
3014 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETADAPTERPARMS, | 3059 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETADAPTERPARMS, |
3015 | QETH_PROT_IPV4); | 3060 | QETH_PROT_IPV4); |
3016 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | 3061 | if (iob) { |
3017 | cmd->data.setadapterparms.hdr.cmdlength = cmdlen; | 3062 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); |
3018 | cmd->data.setadapterparms.hdr.command_code = command; | 3063 | cmd->data.setadapterparms.hdr.cmdlength = cmdlen; |
3019 | cmd->data.setadapterparms.hdr.used_total = 1; | 3064 | cmd->data.setadapterparms.hdr.command_code = command; |
3020 | cmd->data.setadapterparms.hdr.seq_no = 1; | 3065 | cmd->data.setadapterparms.hdr.used_total = 1; |
3066 | cmd->data.setadapterparms.hdr.seq_no = 1; | ||
3067 | } | ||
3021 | 3068 | ||
3022 | return iob; | 3069 | return iob; |
3023 | } | 3070 | } |
@@ -3030,6 +3077,8 @@ int qeth_query_setadapterparms(struct qeth_card *card) | |||
3030 | QETH_CARD_TEXT(card, 3, "queryadp"); | 3077 | QETH_CARD_TEXT(card, 3, "queryadp"); |
3031 | iob = qeth_get_adapter_cmd(card, IPA_SETADP_QUERY_COMMANDS_SUPPORTED, | 3078 | iob = qeth_get_adapter_cmd(card, IPA_SETADP_QUERY_COMMANDS_SUPPORTED, |
3032 | sizeof(struct qeth_ipacmd_setadpparms)); | 3079 | sizeof(struct qeth_ipacmd_setadpparms)); |
3080 | if (!iob) | ||
3081 | return -ENOMEM; | ||
3033 | rc = qeth_send_ipa_cmd(card, iob, qeth_query_setadapterparms_cb, NULL); | 3082 | rc = qeth_send_ipa_cmd(card, iob, qeth_query_setadapterparms_cb, NULL); |
3034 | return rc; | 3083 | return rc; |
3035 | } | 3084 | } |
@@ -3080,6 +3129,8 @@ int qeth_query_ipassists(struct qeth_card *card, enum qeth_prot_versions prot) | |||
3080 | 3129 | ||
3081 | QETH_DBF_TEXT_(SETUP, 2, "qipassi%i", prot); | 3130 | QETH_DBF_TEXT_(SETUP, 2, "qipassi%i", prot); |
3082 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_QIPASSIST, prot); | 3131 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_QIPASSIST, prot); |
3132 | if (!iob) | ||
3133 | return -ENOMEM; | ||
3083 | rc = qeth_send_ipa_cmd(card, iob, qeth_query_ipassists_cb, NULL); | 3134 | rc = qeth_send_ipa_cmd(card, iob, qeth_query_ipassists_cb, NULL); |
3084 | return rc; | 3135 | return rc; |
3085 | } | 3136 | } |
@@ -3119,6 +3170,8 @@ int qeth_query_switch_attributes(struct qeth_card *card, | |||
3119 | return -ENOMEDIUM; | 3170 | return -ENOMEDIUM; |
3120 | iob = qeth_get_adapter_cmd(card, IPA_SETADP_QUERY_SWITCH_ATTRIBUTES, | 3171 | iob = qeth_get_adapter_cmd(card, IPA_SETADP_QUERY_SWITCH_ATTRIBUTES, |
3121 | sizeof(struct qeth_ipacmd_setadpparms_hdr)); | 3172 | sizeof(struct qeth_ipacmd_setadpparms_hdr)); |
3173 | if (!iob) | ||
3174 | return -ENOMEM; | ||
3122 | return qeth_send_ipa_cmd(card, iob, | 3175 | return qeth_send_ipa_cmd(card, iob, |
3123 | qeth_query_switch_attributes_cb, sw_info); | 3176 | qeth_query_switch_attributes_cb, sw_info); |
3124 | } | 3177 | } |
@@ -3146,6 +3199,8 @@ static int qeth_query_setdiagass(struct qeth_card *card) | |||
3146 | 3199 | ||
3147 | QETH_DBF_TEXT(SETUP, 2, "qdiagass"); | 3200 | QETH_DBF_TEXT(SETUP, 2, "qdiagass"); |
3148 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SET_DIAG_ASS, 0); | 3201 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SET_DIAG_ASS, 0); |
3202 | if (!iob) | ||
3203 | return -ENOMEM; | ||
3149 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | 3204 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); |
3150 | cmd->data.diagass.subcmd_len = 16; | 3205 | cmd->data.diagass.subcmd_len = 16; |
3151 | cmd->data.diagass.subcmd = QETH_DIAGS_CMD_QUERY; | 3206 | cmd->data.diagass.subcmd = QETH_DIAGS_CMD_QUERY; |
@@ -3197,6 +3252,8 @@ int qeth_hw_trap(struct qeth_card *card, enum qeth_diags_trap_action action) | |||
3197 | 3252 | ||
3198 | QETH_DBF_TEXT(SETUP, 2, "diagtrap"); | 3253 | QETH_DBF_TEXT(SETUP, 2, "diagtrap"); |
3199 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SET_DIAG_ASS, 0); | 3254 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SET_DIAG_ASS, 0); |
3255 | if (!iob) | ||
3256 | return -ENOMEM; | ||
3200 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | 3257 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); |
3201 | cmd->data.diagass.subcmd_len = 80; | 3258 | cmd->data.diagass.subcmd_len = 80; |
3202 | cmd->data.diagass.subcmd = QETH_DIAGS_CMD_TRAP; | 3259 | cmd->data.diagass.subcmd = QETH_DIAGS_CMD_TRAP; |
@@ -4162,6 +4219,8 @@ void qeth_setadp_promisc_mode(struct qeth_card *card) | |||
4162 | 4219 | ||
4163 | iob = qeth_get_adapter_cmd(card, IPA_SETADP_SET_PROMISC_MODE, | 4220 | iob = qeth_get_adapter_cmd(card, IPA_SETADP_SET_PROMISC_MODE, |
4164 | sizeof(struct qeth_ipacmd_setadpparms)); | 4221 | sizeof(struct qeth_ipacmd_setadpparms)); |
4222 | if (!iob) | ||
4223 | return; | ||
4165 | cmd = (struct qeth_ipa_cmd *)(iob->data + IPA_PDU_HEADER_SIZE); | 4224 | cmd = (struct qeth_ipa_cmd *)(iob->data + IPA_PDU_HEADER_SIZE); |
4166 | cmd->data.setadapterparms.data.mode = mode; | 4225 | cmd->data.setadapterparms.data.mode = mode; |
4167 | qeth_send_ipa_cmd(card, iob, qeth_setadp_promisc_mode_cb, NULL); | 4226 | qeth_send_ipa_cmd(card, iob, qeth_setadp_promisc_mode_cb, NULL); |
@@ -4232,6 +4291,8 @@ int qeth_setadpparms_change_macaddr(struct qeth_card *card) | |||
4232 | 4291 | ||
4233 | iob = qeth_get_adapter_cmd(card, IPA_SETADP_ALTER_MAC_ADDRESS, | 4292 | iob = qeth_get_adapter_cmd(card, IPA_SETADP_ALTER_MAC_ADDRESS, |
4234 | sizeof(struct qeth_ipacmd_setadpparms)); | 4293 | sizeof(struct qeth_ipacmd_setadpparms)); |
4294 | if (!iob) | ||
4295 | return -ENOMEM; | ||
4235 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | 4296 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); |
4236 | cmd->data.setadapterparms.data.change_addr.cmd = CHANGE_ADDR_READ_MAC; | 4297 | cmd->data.setadapterparms.data.change_addr.cmd = CHANGE_ADDR_READ_MAC; |
4237 | cmd->data.setadapterparms.data.change_addr.addr_size = OSA_ADDR_LEN; | 4298 | cmd->data.setadapterparms.data.change_addr.addr_size = OSA_ADDR_LEN; |
@@ -4345,6 +4406,8 @@ static int qeth_setadpparms_set_access_ctrl(struct qeth_card *card, | |||
4345 | iob = qeth_get_adapter_cmd(card, IPA_SETADP_SET_ACCESS_CONTROL, | 4406 | iob = qeth_get_adapter_cmd(card, IPA_SETADP_SET_ACCESS_CONTROL, |
4346 | sizeof(struct qeth_ipacmd_setadpparms_hdr) + | 4407 | sizeof(struct qeth_ipacmd_setadpparms_hdr) + |
4347 | sizeof(struct qeth_set_access_ctrl)); | 4408 | sizeof(struct qeth_set_access_ctrl)); |
4409 | if (!iob) | ||
4410 | return -ENOMEM; | ||
4348 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | 4411 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); |
4349 | access_ctrl_req = &cmd->data.setadapterparms.data.set_access_ctrl; | 4412 | access_ctrl_req = &cmd->data.setadapterparms.data.set_access_ctrl; |
4350 | access_ctrl_req->subcmd_code = isolation; | 4413 | access_ctrl_req->subcmd_code = isolation; |
@@ -4588,6 +4651,10 @@ int qeth_snmp_command(struct qeth_card *card, char __user *udata) | |||
4588 | 4651 | ||
4589 | iob = qeth_get_adapter_cmd(card, IPA_SETADP_SET_SNMP_CONTROL, | 4652 | iob = qeth_get_adapter_cmd(card, IPA_SETADP_SET_SNMP_CONTROL, |
4590 | QETH_SNMP_SETADP_CMDLENGTH + req_len); | 4653 | QETH_SNMP_SETADP_CMDLENGTH + req_len); |
4654 | if (!iob) { | ||
4655 | rc = -ENOMEM; | ||
4656 | goto out; | ||
4657 | } | ||
4591 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | 4658 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); |
4592 | memcpy(&cmd->data.setadapterparms.data.snmp, &ureq->cmd, req_len); | 4659 | memcpy(&cmd->data.setadapterparms.data.snmp, &ureq->cmd, req_len); |
4593 | rc = qeth_send_ipa_snmp_cmd(card, iob, QETH_SETADP_BASE_LEN + req_len, | 4660 | rc = qeth_send_ipa_snmp_cmd(card, iob, QETH_SETADP_BASE_LEN + req_len, |
@@ -4599,7 +4666,7 @@ int qeth_snmp_command(struct qeth_card *card, char __user *udata) | |||
4599 | if (copy_to_user(udata, qinfo.udata, qinfo.udata_len)) | 4666 | if (copy_to_user(udata, qinfo.udata, qinfo.udata_len)) |
4600 | rc = -EFAULT; | 4667 | rc = -EFAULT; |
4601 | } | 4668 | } |
4602 | 4669 | out: | |
4603 | kfree(ureq); | 4670 | kfree(ureq); |
4604 | kfree(qinfo.udata); | 4671 | kfree(qinfo.udata); |
4605 | return rc; | 4672 | return rc; |
@@ -4670,6 +4737,10 @@ int qeth_query_oat_command(struct qeth_card *card, char __user *udata) | |||
4670 | iob = qeth_get_adapter_cmd(card, IPA_SETADP_QUERY_OAT, | 4737 | iob = qeth_get_adapter_cmd(card, IPA_SETADP_QUERY_OAT, |
4671 | sizeof(struct qeth_ipacmd_setadpparms_hdr) + | 4738 | sizeof(struct qeth_ipacmd_setadpparms_hdr) + |
4672 | sizeof(struct qeth_query_oat)); | 4739 | sizeof(struct qeth_query_oat)); |
4740 | if (!iob) { | ||
4741 | rc = -ENOMEM; | ||
4742 | goto out_free; | ||
4743 | } | ||
4673 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | 4744 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); |
4674 | oat_req = &cmd->data.setadapterparms.data.query_oat; | 4745 | oat_req = &cmd->data.setadapterparms.data.query_oat; |
4675 | oat_req->subcmd_code = oat_data.command; | 4746 | oat_req->subcmd_code = oat_data.command; |
@@ -4735,6 +4806,8 @@ static int qeth_query_card_info(struct qeth_card *card, | |||
4735 | return -EOPNOTSUPP; | 4806 | return -EOPNOTSUPP; |
4736 | iob = qeth_get_adapter_cmd(card, IPA_SETADP_QUERY_CARD_INFO, | 4807 | iob = qeth_get_adapter_cmd(card, IPA_SETADP_QUERY_CARD_INFO, |
4737 | sizeof(struct qeth_ipacmd_setadpparms_hdr)); | 4808 | sizeof(struct qeth_ipacmd_setadpparms_hdr)); |
4809 | if (!iob) | ||
4810 | return -ENOMEM; | ||
4738 | return qeth_send_ipa_cmd(card, iob, qeth_query_card_info_cb, | 4811 | return qeth_send_ipa_cmd(card, iob, qeth_query_card_info_cb, |
4739 | (void *)carrier_info); | 4812 | (void *)carrier_info); |
4740 | } | 4813 | } |
@@ -5060,11 +5133,23 @@ retriable: | |||
5060 | card->options.adp.supported_funcs = 0; | 5133 | card->options.adp.supported_funcs = 0; |
5061 | card->options.sbp.supported_funcs = 0; | 5134 | card->options.sbp.supported_funcs = 0; |
5062 | card->info.diagass_support = 0; | 5135 | card->info.diagass_support = 0; |
5063 | qeth_query_ipassists(card, QETH_PROT_IPV4); | 5136 | rc = qeth_query_ipassists(card, QETH_PROT_IPV4); |
5064 | if (qeth_is_supported(card, IPA_SETADAPTERPARMS)) | 5137 | if (rc == -ENOMEM) |
5065 | qeth_query_setadapterparms(card); | 5138 | goto out; |
5066 | if (qeth_adp_supported(card, IPA_SETADP_SET_DIAG_ASSIST)) | 5139 | if (qeth_is_supported(card, IPA_SETADAPTERPARMS)) { |
5067 | qeth_query_setdiagass(card); | 5140 | rc = qeth_query_setadapterparms(card); |
5141 | if (rc < 0) { | ||
5142 | QETH_DBF_TEXT_(SETUP, 2, "6err%d", rc); | ||
5143 | goto out; | ||
5144 | } | ||
5145 | } | ||
5146 | if (qeth_adp_supported(card, IPA_SETADP_SET_DIAG_ASSIST)) { | ||
5147 | rc = qeth_query_setdiagass(card); | ||
5148 | if (rc < 0) { | ||
5149 | QETH_DBF_TEXT_(SETUP, 2, "7err%d", rc); | ||
5150 | goto out; | ||
5151 | } | ||
5152 | } | ||
5068 | return 0; | 5153 | return 0; |
5069 | out: | 5154 | out: |
5070 | dev_warn(&card->gdev->dev, "The qeth device driver failed to recover " | 5155 | dev_warn(&card->gdev->dev, "The qeth device driver failed to recover " |
diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c index f5f409d85295..0ea0869120cf 100644 --- a/drivers/s390/net/qeth_l2_main.c +++ b/drivers/s390/net/qeth_l2_main.c | |||
@@ -27,10 +27,7 @@ static int qeth_l2_set_offline(struct ccwgroup_device *); | |||
27 | static int qeth_l2_stop(struct net_device *); | 27 | static int qeth_l2_stop(struct net_device *); |
28 | static int qeth_l2_send_delmac(struct qeth_card *, __u8 *); | 28 | static int qeth_l2_send_delmac(struct qeth_card *, __u8 *); |
29 | static int qeth_l2_send_setdelmac(struct qeth_card *, __u8 *, | 29 | static int qeth_l2_send_setdelmac(struct qeth_card *, __u8 *, |
30 | enum qeth_ipa_cmds, | 30 | enum qeth_ipa_cmds); |
31 | int (*reply_cb) (struct qeth_card *, | ||
32 | struct qeth_reply*, | ||
33 | unsigned long)); | ||
34 | static void qeth_l2_set_multicast_list(struct net_device *); | 31 | static void qeth_l2_set_multicast_list(struct net_device *); |
35 | static int qeth_l2_recover(void *); | 32 | static int qeth_l2_recover(void *); |
36 | static void qeth_bridgeport_query_support(struct qeth_card *card); | 33 | static void qeth_bridgeport_query_support(struct qeth_card *card); |
@@ -129,56 +126,71 @@ static struct net_device *qeth_l2_netdev_by_devno(unsigned char *read_dev_no) | |||
129 | return ndev; | 126 | return ndev; |
130 | } | 127 | } |
131 | 128 | ||
132 | static int qeth_l2_send_setgroupmac_cb(struct qeth_card *card, | 129 | static int qeth_setdel_makerc(struct qeth_card *card, int retcode) |
133 | struct qeth_reply *reply, | ||
134 | unsigned long data) | ||
135 | { | 130 | { |
136 | struct qeth_ipa_cmd *cmd; | 131 | int rc; |
137 | __u8 *mac; | ||
138 | 132 | ||
139 | QETH_CARD_TEXT(card, 2, "L2Sgmacb"); | 133 | if (retcode) |
140 | cmd = (struct qeth_ipa_cmd *) data; | 134 | QETH_CARD_TEXT_(card, 2, "err%04x", retcode); |
141 | mac = &cmd->data.setdelmac.mac[0]; | 135 | switch (retcode) { |
142 | /* MAC already registered, needed in couple/uncouple case */ | 136 | case IPA_RC_SUCCESS: |
143 | if (cmd->hdr.return_code == IPA_RC_L2_DUP_MAC) { | 137 | rc = 0; |
144 | QETH_DBF_MESSAGE(2, "Group MAC %pM already existing on %s \n", | 138 | break; |
145 | mac, QETH_CARD_IFNAME(card)); | 139 | case IPA_RC_L2_UNSUPPORTED_CMD: |
146 | cmd->hdr.return_code = 0; | 140 | rc = -ENOSYS; |
141 | break; | ||
142 | case IPA_RC_L2_ADDR_TABLE_FULL: | ||
143 | rc = -ENOSPC; | ||
144 | break; | ||
145 | case IPA_RC_L2_DUP_MAC: | ||
146 | case IPA_RC_L2_DUP_LAYER3_MAC: | ||
147 | rc = -EEXIST; | ||
148 | break; | ||
149 | case IPA_RC_L2_MAC_NOT_AUTH_BY_HYP: | ||
150 | case IPA_RC_L2_MAC_NOT_AUTH_BY_ADP: | ||
151 | rc = -EPERM; | ||
152 | break; | ||
153 | case IPA_RC_L2_MAC_NOT_FOUND: | ||
154 | rc = -ENOENT; | ||
155 | break; | ||
156 | case -ENOMEM: | ||
157 | rc = -ENOMEM; | ||
158 | break; | ||
159 | default: | ||
160 | rc = -EIO; | ||
161 | break; | ||
147 | } | 162 | } |
148 | if (cmd->hdr.return_code) | 163 | return rc; |
149 | QETH_DBF_MESSAGE(2, "Could not set group MAC %pM on %s: %x\n", | ||
150 | mac, QETH_CARD_IFNAME(card), cmd->hdr.return_code); | ||
151 | return 0; | ||
152 | } | 164 | } |
153 | 165 | ||
154 | static int qeth_l2_send_setgroupmac(struct qeth_card *card, __u8 *mac) | 166 | static int qeth_l2_send_setgroupmac(struct qeth_card *card, __u8 *mac) |
155 | { | 167 | { |
156 | QETH_CARD_TEXT(card, 2, "L2Sgmac"); | 168 | int rc; |
157 | return qeth_l2_send_setdelmac(card, mac, IPA_CMD_SETGMAC, | ||
158 | qeth_l2_send_setgroupmac_cb); | ||
159 | } | ||
160 | |||
161 | static int qeth_l2_send_delgroupmac_cb(struct qeth_card *card, | ||
162 | struct qeth_reply *reply, | ||
163 | unsigned long data) | ||
164 | { | ||
165 | struct qeth_ipa_cmd *cmd; | ||
166 | __u8 *mac; | ||
167 | 169 | ||
168 | QETH_CARD_TEXT(card, 2, "L2Dgmacb"); | 170 | QETH_CARD_TEXT(card, 2, "L2Sgmac"); |
169 | cmd = (struct qeth_ipa_cmd *) data; | 171 | rc = qeth_setdel_makerc(card, qeth_l2_send_setdelmac(card, mac, |
170 | mac = &cmd->data.setdelmac.mac[0]; | 172 | IPA_CMD_SETGMAC)); |
171 | if (cmd->hdr.return_code) | 173 | if (rc == -EEXIST) |
172 | QETH_DBF_MESSAGE(2, "Could not delete group MAC %pM on %s: %x\n", | 174 | QETH_DBF_MESSAGE(2, "Group MAC %pM already existing on %s\n", |
173 | mac, QETH_CARD_IFNAME(card), cmd->hdr.return_code); | 175 | mac, QETH_CARD_IFNAME(card)); |
174 | return 0; | 176 | else if (rc) |
177 | QETH_DBF_MESSAGE(2, "Could not set group MAC %pM on %s: %d\n", | ||
178 | mac, QETH_CARD_IFNAME(card), rc); | ||
179 | return rc; | ||
175 | } | 180 | } |
176 | 181 | ||
177 | static int qeth_l2_send_delgroupmac(struct qeth_card *card, __u8 *mac) | 182 | static int qeth_l2_send_delgroupmac(struct qeth_card *card, __u8 *mac) |
178 | { | 183 | { |
184 | int rc; | ||
185 | |||
179 | QETH_CARD_TEXT(card, 2, "L2Dgmac"); | 186 | QETH_CARD_TEXT(card, 2, "L2Dgmac"); |
180 | return qeth_l2_send_setdelmac(card, mac, IPA_CMD_DELGMAC, | 187 | rc = qeth_setdel_makerc(card, qeth_l2_send_setdelmac(card, mac, |
181 | qeth_l2_send_delgroupmac_cb); | 188 | IPA_CMD_DELGMAC)); |
189 | if (rc) | ||
190 | QETH_DBF_MESSAGE(2, | ||
191 | "Could not delete group MAC %pM on %s: %d\n", | ||
192 | mac, QETH_CARD_IFNAME(card), rc); | ||
193 | return rc; | ||
182 | } | 194 | } |
183 | 195 | ||
184 | static void qeth_l2_add_mc(struct qeth_card *card, __u8 *mac, int vmac) | 196 | static void qeth_l2_add_mc(struct qeth_card *card, __u8 *mac, int vmac) |
@@ -196,10 +208,11 @@ static void qeth_l2_add_mc(struct qeth_card *card, __u8 *mac, int vmac) | |||
196 | mc->is_vmac = vmac; | 208 | mc->is_vmac = vmac; |
197 | 209 | ||
198 | if (vmac) { | 210 | if (vmac) { |
199 | rc = qeth_l2_send_setdelmac(card, mac, IPA_CMD_SETVMAC, | 211 | rc = qeth_setdel_makerc(card, |
200 | NULL); | 212 | qeth_l2_send_setdelmac(card, mac, IPA_CMD_SETVMAC)); |
201 | } else { | 213 | } else { |
202 | rc = qeth_l2_send_setgroupmac(card, mac); | 214 | rc = qeth_setdel_makerc(card, |
215 | qeth_l2_send_setgroupmac(card, mac)); | ||
203 | } | 216 | } |
204 | 217 | ||
205 | if (!rc) | 218 | if (!rc) |
@@ -217,7 +230,7 @@ static void qeth_l2_del_all_mc(struct qeth_card *card, int del) | |||
217 | if (del) { | 230 | if (del) { |
218 | if (mc->is_vmac) | 231 | if (mc->is_vmac) |
219 | qeth_l2_send_setdelmac(card, mc->mc_addr, | 232 | qeth_l2_send_setdelmac(card, mc->mc_addr, |
220 | IPA_CMD_DELVMAC, NULL); | 233 | IPA_CMD_DELVMAC); |
221 | else | 234 | else |
222 | qeth_l2_send_delgroupmac(card, mc->mc_addr); | 235 | qeth_l2_send_delgroupmac(card, mc->mc_addr); |
223 | } | 236 | } |
@@ -290,6 +303,8 @@ static int qeth_l2_send_setdelvlan(struct qeth_card *card, __u16 i, | |||
290 | 303 | ||
291 | QETH_CARD_TEXT_(card, 4, "L2sdv%x", ipacmd); | 304 | QETH_CARD_TEXT_(card, 4, "L2sdv%x", ipacmd); |
292 | iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4); | 305 | iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4); |
306 | if (!iob) | ||
307 | return -ENOMEM; | ||
293 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | 308 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); |
294 | cmd->data.setdelvlan.vlan_id = i; | 309 | cmd->data.setdelvlan.vlan_id = i; |
295 | return qeth_send_ipa_cmd(card, iob, | 310 | return qeth_send_ipa_cmd(card, iob, |
@@ -312,6 +327,7 @@ static int qeth_l2_vlan_rx_add_vid(struct net_device *dev, | |||
312 | { | 327 | { |
313 | struct qeth_card *card = dev->ml_priv; | 328 | struct qeth_card *card = dev->ml_priv; |
314 | struct qeth_vlan_vid *id; | 329 | struct qeth_vlan_vid *id; |
330 | int rc; | ||
315 | 331 | ||
316 | QETH_CARD_TEXT_(card, 4, "aid:%d", vid); | 332 | QETH_CARD_TEXT_(card, 4, "aid:%d", vid); |
317 | if (!vid) | 333 | if (!vid) |
@@ -327,7 +343,11 @@ static int qeth_l2_vlan_rx_add_vid(struct net_device *dev, | |||
327 | id = kmalloc(sizeof(struct qeth_vlan_vid), GFP_ATOMIC); | 343 | id = kmalloc(sizeof(struct qeth_vlan_vid), GFP_ATOMIC); |
328 | if (id) { | 344 | if (id) { |
329 | id->vid = vid; | 345 | id->vid = vid; |
330 | qeth_l2_send_setdelvlan(card, vid, IPA_CMD_SETVLAN); | 346 | rc = qeth_l2_send_setdelvlan(card, vid, IPA_CMD_SETVLAN); |
347 | if (rc) { | ||
348 | kfree(id); | ||
349 | return rc; | ||
350 | } | ||
331 | spin_lock_bh(&card->vlanlock); | 351 | spin_lock_bh(&card->vlanlock); |
332 | list_add_tail(&id->list, &card->vid_list); | 352 | list_add_tail(&id->list, &card->vid_list); |
333 | spin_unlock_bh(&card->vlanlock); | 353 | spin_unlock_bh(&card->vlanlock); |
@@ -342,6 +362,7 @@ static int qeth_l2_vlan_rx_kill_vid(struct net_device *dev, | |||
342 | { | 362 | { |
343 | struct qeth_vlan_vid *id, *tmpid = NULL; | 363 | struct qeth_vlan_vid *id, *tmpid = NULL; |
344 | struct qeth_card *card = dev->ml_priv; | 364 | struct qeth_card *card = dev->ml_priv; |
365 | int rc = 0; | ||
345 | 366 | ||
346 | QETH_CARD_TEXT_(card, 4, "kid:%d", vid); | 367 | QETH_CARD_TEXT_(card, 4, "kid:%d", vid); |
347 | if (card->info.type == QETH_CARD_TYPE_OSM) { | 368 | if (card->info.type == QETH_CARD_TYPE_OSM) { |
@@ -362,11 +383,11 @@ static int qeth_l2_vlan_rx_kill_vid(struct net_device *dev, | |||
362 | } | 383 | } |
363 | spin_unlock_bh(&card->vlanlock); | 384 | spin_unlock_bh(&card->vlanlock); |
364 | if (tmpid) { | 385 | if (tmpid) { |
365 | qeth_l2_send_setdelvlan(card, vid, IPA_CMD_DELVLAN); | 386 | rc = qeth_l2_send_setdelvlan(card, vid, IPA_CMD_DELVLAN); |
366 | kfree(tmpid); | 387 | kfree(tmpid); |
367 | } | 388 | } |
368 | qeth_l2_set_multicast_list(card->dev); | 389 | qeth_l2_set_multicast_list(card->dev); |
369 | return 0; | 390 | return rc; |
370 | } | 391 | } |
371 | 392 | ||
372 | static int qeth_l2_stop_card(struct qeth_card *card, int recovery_mode) | 393 | static int qeth_l2_stop_card(struct qeth_card *card, int recovery_mode) |
@@ -538,91 +559,62 @@ out: | |||
538 | } | 559 | } |
539 | 560 | ||
540 | static int qeth_l2_send_setdelmac(struct qeth_card *card, __u8 *mac, | 561 | static int qeth_l2_send_setdelmac(struct qeth_card *card, __u8 *mac, |
541 | enum qeth_ipa_cmds ipacmd, | 562 | enum qeth_ipa_cmds ipacmd) |
542 | int (*reply_cb) (struct qeth_card *, | ||
543 | struct qeth_reply*, | ||
544 | unsigned long)) | ||
545 | { | 563 | { |
546 | struct qeth_ipa_cmd *cmd; | 564 | struct qeth_ipa_cmd *cmd; |
547 | struct qeth_cmd_buffer *iob; | 565 | struct qeth_cmd_buffer *iob; |
548 | 566 | ||
549 | QETH_CARD_TEXT(card, 2, "L2sdmac"); | 567 | QETH_CARD_TEXT(card, 2, "L2sdmac"); |
550 | iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4); | 568 | iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4); |
569 | if (!iob) | ||
570 | return -ENOMEM; | ||
551 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | 571 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); |
552 | cmd->data.setdelmac.mac_length = OSA_ADDR_LEN; | 572 | cmd->data.setdelmac.mac_length = OSA_ADDR_LEN; |
553 | memcpy(&cmd->data.setdelmac.mac, mac, OSA_ADDR_LEN); | 573 | memcpy(&cmd->data.setdelmac.mac, mac, OSA_ADDR_LEN); |
554 | return qeth_send_ipa_cmd(card, iob, reply_cb, NULL); | 574 | return qeth_send_ipa_cmd(card, iob, NULL, NULL); |
555 | } | 575 | } |
556 | 576 | ||
557 | static int qeth_l2_send_setmac_cb(struct qeth_card *card, | 577 | static int qeth_l2_send_setmac(struct qeth_card *card, __u8 *mac) |
558 | struct qeth_reply *reply, | ||
559 | unsigned long data) | ||
560 | { | 578 | { |
561 | struct qeth_ipa_cmd *cmd; | 579 | int rc; |
562 | 580 | ||
563 | QETH_CARD_TEXT(card, 2, "L2Smaccb"); | 581 | QETH_CARD_TEXT(card, 2, "L2Setmac"); |
564 | cmd = (struct qeth_ipa_cmd *) data; | 582 | rc = qeth_setdel_makerc(card, qeth_l2_send_setdelmac(card, mac, |
565 | if (cmd->hdr.return_code) { | 583 | IPA_CMD_SETVMAC)); |
566 | QETH_CARD_TEXT_(card, 2, "L2er%x", cmd->hdr.return_code); | 584 | if (rc == 0) { |
585 | card->info.mac_bits |= QETH_LAYER2_MAC_REGISTERED; | ||
586 | memcpy(card->dev->dev_addr, mac, OSA_ADDR_LEN); | ||
587 | dev_info(&card->gdev->dev, | ||
588 | "MAC address %pM successfully registered on device %s\n", | ||
589 | card->dev->dev_addr, card->dev->name); | ||
590 | } else { | ||
567 | card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED; | 591 | card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED; |
568 | switch (cmd->hdr.return_code) { | 592 | switch (rc) { |
569 | case IPA_RC_L2_DUP_MAC: | 593 | case -EEXIST: |
570 | case IPA_RC_L2_DUP_LAYER3_MAC: | ||
571 | dev_warn(&card->gdev->dev, | 594 | dev_warn(&card->gdev->dev, |
572 | "MAC address %pM already exists\n", | 595 | "MAC address %pM already exists\n", mac); |
573 | cmd->data.setdelmac.mac); | ||
574 | break; | 596 | break; |
575 | case IPA_RC_L2_MAC_NOT_AUTH_BY_HYP: | 597 | case -EPERM: |
576 | case IPA_RC_L2_MAC_NOT_AUTH_BY_ADP: | ||
577 | dev_warn(&card->gdev->dev, | 598 | dev_warn(&card->gdev->dev, |
578 | "MAC address %pM is not authorized\n", | 599 | "MAC address %pM is not authorized\n", mac); |
579 | cmd->data.setdelmac.mac); | ||
580 | break; | ||
581 | default: | ||
582 | break; | 600 | break; |
583 | } | 601 | } |
584 | } else { | ||
585 | card->info.mac_bits |= QETH_LAYER2_MAC_REGISTERED; | ||
586 | memcpy(card->dev->dev_addr, cmd->data.setdelmac.mac, | ||
587 | OSA_ADDR_LEN); | ||
588 | dev_info(&card->gdev->dev, | ||
589 | "MAC address %pM successfully registered on device %s\n", | ||
590 | card->dev->dev_addr, card->dev->name); | ||
591 | } | ||
592 | return 0; | ||
593 | } | ||
594 | |||
595 | static int qeth_l2_send_setmac(struct qeth_card *card, __u8 *mac) | ||
596 | { | ||
597 | QETH_CARD_TEXT(card, 2, "L2Setmac"); | ||
598 | return qeth_l2_send_setdelmac(card, mac, IPA_CMD_SETVMAC, | ||
599 | qeth_l2_send_setmac_cb); | ||
600 | } | ||
601 | |||
602 | static int qeth_l2_send_delmac_cb(struct qeth_card *card, | ||
603 | struct qeth_reply *reply, | ||
604 | unsigned long data) | ||
605 | { | ||
606 | struct qeth_ipa_cmd *cmd; | ||
607 | |||
608 | QETH_CARD_TEXT(card, 2, "L2Dmaccb"); | ||
609 | cmd = (struct qeth_ipa_cmd *) data; | ||
610 | if (cmd->hdr.return_code) { | ||
611 | QETH_CARD_TEXT_(card, 2, "err%d", cmd->hdr.return_code); | ||
612 | return 0; | ||
613 | } | 602 | } |
614 | card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED; | 603 | return rc; |
615 | |||
616 | return 0; | ||
617 | } | 604 | } |
618 | 605 | ||
619 | static int qeth_l2_send_delmac(struct qeth_card *card, __u8 *mac) | 606 | static int qeth_l2_send_delmac(struct qeth_card *card, __u8 *mac) |
620 | { | 607 | { |
608 | int rc; | ||
609 | |||
621 | QETH_CARD_TEXT(card, 2, "L2Delmac"); | 610 | QETH_CARD_TEXT(card, 2, "L2Delmac"); |
622 | if (!(card->info.mac_bits & QETH_LAYER2_MAC_REGISTERED)) | 611 | if (!(card->info.mac_bits & QETH_LAYER2_MAC_REGISTERED)) |
623 | return 0; | 612 | return 0; |
624 | return qeth_l2_send_setdelmac(card, mac, IPA_CMD_DELVMAC, | 613 | rc = qeth_setdel_makerc(card, qeth_l2_send_setdelmac(card, mac, |
625 | qeth_l2_send_delmac_cb); | 614 | IPA_CMD_DELVMAC)); |
615 | if (rc == 0) | ||
616 | card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED; | ||
617 | return rc; | ||
626 | } | 618 | } |
627 | 619 | ||
628 | static int qeth_l2_request_initial_mac(struct qeth_card *card) | 620 | static int qeth_l2_request_initial_mac(struct qeth_card *card) |
@@ -650,7 +642,7 @@ static int qeth_l2_request_initial_mac(struct qeth_card *card) | |||
650 | if (rc) { | 642 | if (rc) { |
651 | QETH_DBF_MESSAGE(2, "couldn't get MAC address on " | 643 | QETH_DBF_MESSAGE(2, "couldn't get MAC address on " |
652 | "device %s: x%x\n", CARD_BUS_ID(card), rc); | 644 | "device %s: x%x\n", CARD_BUS_ID(card), rc); |
653 | QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc); | 645 | QETH_DBF_TEXT_(SETUP, 2, "1err%04x", rc); |
654 | return rc; | 646 | return rc; |
655 | } | 647 | } |
656 | QETH_DBF_HEX(SETUP, 2, card->dev->dev_addr, OSA_ADDR_LEN); | 648 | QETH_DBF_HEX(SETUP, 2, card->dev->dev_addr, OSA_ADDR_LEN); |
@@ -686,7 +678,7 @@ static int qeth_l2_set_mac_address(struct net_device *dev, void *p) | |||
686 | return -ERESTARTSYS; | 678 | return -ERESTARTSYS; |
687 | } | 679 | } |
688 | rc = qeth_l2_send_delmac(card, &card->dev->dev_addr[0]); | 680 | rc = qeth_l2_send_delmac(card, &card->dev->dev_addr[0]); |
689 | if (!rc || (rc == IPA_RC_L2_MAC_NOT_FOUND)) | 681 | if (!rc || (rc == -ENOENT)) |
690 | rc = qeth_l2_send_setmac(card, addr->sa_data); | 682 | rc = qeth_l2_send_setmac(card, addr->sa_data); |
691 | return rc ? -EINVAL : 0; | 683 | return rc ? -EINVAL : 0; |
692 | } | 684 | } |
@@ -995,7 +987,7 @@ static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode) | |||
995 | recover_flag = card->state; | 987 | recover_flag = card->state; |
996 | rc = qeth_core_hardsetup_card(card); | 988 | rc = qeth_core_hardsetup_card(card); |
997 | if (rc) { | 989 | if (rc) { |
998 | QETH_DBF_TEXT_(SETUP, 2, "2err%d", rc); | 990 | QETH_DBF_TEXT_(SETUP, 2, "2err%04x", rc); |
999 | rc = -ENODEV; | 991 | rc = -ENODEV; |
1000 | goto out_remove; | 992 | goto out_remove; |
1001 | } | 993 | } |
@@ -1728,6 +1720,8 @@ static void qeth_bridgeport_query_support(struct qeth_card *card) | |||
1728 | 1720 | ||
1729 | QETH_CARD_TEXT(card, 2, "brqsuppo"); | 1721 | QETH_CARD_TEXT(card, 2, "brqsuppo"); |
1730 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETBRIDGEPORT, 0); | 1722 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETBRIDGEPORT, 0); |
1723 | if (!iob) | ||
1724 | return; | ||
1731 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | 1725 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); |
1732 | cmd->data.sbp.hdr.cmdlength = | 1726 | cmd->data.sbp.hdr.cmdlength = |
1733 | sizeof(struct qeth_ipacmd_sbp_hdr) + | 1727 | sizeof(struct qeth_ipacmd_sbp_hdr) + |
@@ -1803,6 +1797,8 @@ int qeth_bridgeport_query_ports(struct qeth_card *card, | |||
1803 | if (!(card->options.sbp.supported_funcs & IPA_SBP_QUERY_BRIDGE_PORTS)) | 1797 | if (!(card->options.sbp.supported_funcs & IPA_SBP_QUERY_BRIDGE_PORTS)) |
1804 | return -EOPNOTSUPP; | 1798 | return -EOPNOTSUPP; |
1805 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETBRIDGEPORT, 0); | 1799 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETBRIDGEPORT, 0); |
1800 | if (!iob) | ||
1801 | return -ENOMEM; | ||
1806 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | 1802 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); |
1807 | cmd->data.sbp.hdr.cmdlength = | 1803 | cmd->data.sbp.hdr.cmdlength = |
1808 | sizeof(struct qeth_ipacmd_sbp_hdr); | 1804 | sizeof(struct qeth_ipacmd_sbp_hdr); |
@@ -1815,9 +1811,7 @@ int qeth_bridgeport_query_ports(struct qeth_card *card, | |||
1815 | if (rc) | 1811 | if (rc) |
1816 | return rc; | 1812 | return rc; |
1817 | rc = qeth_bridgeport_makerc(card, &cbctl, IPA_SBP_QUERY_BRIDGE_PORTS); | 1813 | rc = qeth_bridgeport_makerc(card, &cbctl, IPA_SBP_QUERY_BRIDGE_PORTS); |
1818 | if (rc) | 1814 | return rc; |
1819 | return rc; | ||
1820 | return 0; | ||
1821 | } | 1815 | } |
1822 | EXPORT_SYMBOL_GPL(qeth_bridgeport_query_ports); | 1816 | EXPORT_SYMBOL_GPL(qeth_bridgeport_query_ports); |
1823 | 1817 | ||
@@ -1871,6 +1865,8 @@ int qeth_bridgeport_setrole(struct qeth_card *card, enum qeth_sbp_roles role) | |||
1871 | if (!(card->options.sbp.supported_funcs & setcmd)) | 1865 | if (!(card->options.sbp.supported_funcs & setcmd)) |
1872 | return -EOPNOTSUPP; | 1866 | return -EOPNOTSUPP; |
1873 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETBRIDGEPORT, 0); | 1867 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETBRIDGEPORT, 0); |
1868 | if (!iob) | ||
1869 | return -ENOMEM; | ||
1874 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | 1870 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); |
1875 | cmd->data.sbp.hdr.cmdlength = cmdlength; | 1871 | cmd->data.sbp.hdr.cmdlength = cmdlength; |
1876 | cmd->data.sbp.hdr.command_code = setcmd; | 1872 | cmd->data.sbp.hdr.command_code = setcmd; |
diff --git a/drivers/s390/net/qeth_l3_main.c b/drivers/s390/net/qeth_l3_main.c index 1432b10e95ad..04e42c649134 100644 --- a/drivers/s390/net/qeth_l3_main.c +++ b/drivers/s390/net/qeth_l3_main.c | |||
@@ -547,6 +547,8 @@ static int qeth_l3_send_setdelmc(struct qeth_card *card, | |||
547 | QETH_CARD_TEXT(card, 4, "setdelmc"); | 547 | QETH_CARD_TEXT(card, 4, "setdelmc"); |
548 | 548 | ||
549 | iob = qeth_get_ipacmd_buffer(card, ipacmd, addr->proto); | 549 | iob = qeth_get_ipacmd_buffer(card, ipacmd, addr->proto); |
550 | if (!iob) | ||
551 | return -ENOMEM; | ||
550 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | 552 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); |
551 | memcpy(&cmd->data.setdelipm.mac, addr->mac, OSA_ADDR_LEN); | 553 | memcpy(&cmd->data.setdelipm.mac, addr->mac, OSA_ADDR_LEN); |
552 | if (addr->proto == QETH_PROT_IPV6) | 554 | if (addr->proto == QETH_PROT_IPV6) |
@@ -586,6 +588,8 @@ static int qeth_l3_send_setdelip(struct qeth_card *card, | |||
586 | QETH_CARD_TEXT_(card, 4, "flags%02X", flags); | 588 | QETH_CARD_TEXT_(card, 4, "flags%02X", flags); |
587 | 589 | ||
588 | iob = qeth_get_ipacmd_buffer(card, ipacmd, addr->proto); | 590 | iob = qeth_get_ipacmd_buffer(card, ipacmd, addr->proto); |
591 | if (!iob) | ||
592 | return -ENOMEM; | ||
589 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | 593 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); |
590 | if (addr->proto == QETH_PROT_IPV6) { | 594 | if (addr->proto == QETH_PROT_IPV6) { |
591 | memcpy(cmd->data.setdelip6.ip_addr, &addr->u.a6.addr, | 595 | memcpy(cmd->data.setdelip6.ip_addr, &addr->u.a6.addr, |
@@ -614,6 +618,8 @@ static int qeth_l3_send_setrouting(struct qeth_card *card, | |||
614 | 618 | ||
615 | QETH_CARD_TEXT(card, 4, "setroutg"); | 619 | QETH_CARD_TEXT(card, 4, "setroutg"); |
616 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETRTG, prot); | 620 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETRTG, prot); |
621 | if (!iob) | ||
622 | return -ENOMEM; | ||
617 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | 623 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); |
618 | cmd->data.setrtg.type = (type); | 624 | cmd->data.setrtg.type = (type); |
619 | rc = qeth_send_ipa_cmd(card, iob, NULL, NULL); | 625 | rc = qeth_send_ipa_cmd(card, iob, NULL, NULL); |
@@ -1047,12 +1053,14 @@ static struct qeth_cmd_buffer *qeth_l3_get_setassparms_cmd( | |||
1047 | QETH_CARD_TEXT(card, 4, "getasscm"); | 1053 | QETH_CARD_TEXT(card, 4, "getasscm"); |
1048 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETASSPARMS, prot); | 1054 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETASSPARMS, prot); |
1049 | 1055 | ||
1050 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | 1056 | if (iob) { |
1051 | cmd->data.setassparms.hdr.assist_no = ipa_func; | 1057 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); |
1052 | cmd->data.setassparms.hdr.length = 8 + len; | 1058 | cmd->data.setassparms.hdr.assist_no = ipa_func; |
1053 | cmd->data.setassparms.hdr.command_code = cmd_code; | 1059 | cmd->data.setassparms.hdr.length = 8 + len; |
1054 | cmd->data.setassparms.hdr.return_code = 0; | 1060 | cmd->data.setassparms.hdr.command_code = cmd_code; |
1055 | cmd->data.setassparms.hdr.seq_no = 0; | 1061 | cmd->data.setassparms.hdr.return_code = 0; |
1062 | cmd->data.setassparms.hdr.seq_no = 0; | ||
1063 | } | ||
1056 | 1064 | ||
1057 | return iob; | 1065 | return iob; |
1058 | } | 1066 | } |
@@ -1088,6 +1096,8 @@ static int qeth_l3_send_simple_setassparms_ipv6(struct qeth_card *card, | |||
1088 | QETH_CARD_TEXT(card, 4, "simassp6"); | 1096 | QETH_CARD_TEXT(card, 4, "simassp6"); |
1089 | iob = qeth_l3_get_setassparms_cmd(card, ipa_func, cmd_code, | 1097 | iob = qeth_l3_get_setassparms_cmd(card, ipa_func, cmd_code, |
1090 | 0, QETH_PROT_IPV6); | 1098 | 0, QETH_PROT_IPV6); |
1099 | if (!iob) | ||
1100 | return -ENOMEM; | ||
1091 | rc = qeth_l3_send_setassparms(card, iob, 0, 0, | 1101 | rc = qeth_l3_send_setassparms(card, iob, 0, 0, |
1092 | qeth_l3_default_setassparms_cb, NULL); | 1102 | qeth_l3_default_setassparms_cb, NULL); |
1093 | return rc; | 1103 | return rc; |
@@ -1106,6 +1116,8 @@ static int qeth_l3_send_simple_setassparms(struct qeth_card *card, | |||
1106 | length = sizeof(__u32); | 1116 | length = sizeof(__u32); |
1107 | iob = qeth_l3_get_setassparms_cmd(card, ipa_func, cmd_code, | 1117 | iob = qeth_l3_get_setassparms_cmd(card, ipa_func, cmd_code, |
1108 | length, QETH_PROT_IPV4); | 1118 | length, QETH_PROT_IPV4); |
1119 | if (!iob) | ||
1120 | return -ENOMEM; | ||
1109 | rc = qeth_l3_send_setassparms(card, iob, length, data, | 1121 | rc = qeth_l3_send_setassparms(card, iob, length, data, |
1110 | qeth_l3_default_setassparms_cb, NULL); | 1122 | qeth_l3_default_setassparms_cb, NULL); |
1111 | return rc; | 1123 | return rc; |
@@ -1492,6 +1504,8 @@ static int qeth_l3_iqd_read_initial_mac(struct qeth_card *card) | |||
1492 | 1504 | ||
1493 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_CREATE_ADDR, | 1505 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_CREATE_ADDR, |
1494 | QETH_PROT_IPV6); | 1506 | QETH_PROT_IPV6); |
1507 | if (!iob) | ||
1508 | return -ENOMEM; | ||
1495 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | 1509 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); |
1496 | *((__u16 *) &cmd->data.create_destroy_addr.unique_id[6]) = | 1510 | *((__u16 *) &cmd->data.create_destroy_addr.unique_id[6]) = |
1497 | card->info.unique_id; | 1511 | card->info.unique_id; |
@@ -1535,6 +1549,8 @@ static int qeth_l3_get_unique_id(struct qeth_card *card) | |||
1535 | 1549 | ||
1536 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_CREATE_ADDR, | 1550 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_CREATE_ADDR, |
1537 | QETH_PROT_IPV6); | 1551 | QETH_PROT_IPV6); |
1552 | if (!iob) | ||
1553 | return -ENOMEM; | ||
1538 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | 1554 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); |
1539 | *((__u16 *) &cmd->data.create_destroy_addr.unique_id[6]) = | 1555 | *((__u16 *) &cmd->data.create_destroy_addr.unique_id[6]) = |
1540 | card->info.unique_id; | 1556 | card->info.unique_id; |
@@ -1609,6 +1625,8 @@ qeth_diags_trace(struct qeth_card *card, enum qeth_diags_trace_cmds diags_cmd) | |||
1609 | QETH_DBF_TEXT(SETUP, 2, "diagtrac"); | 1625 | QETH_DBF_TEXT(SETUP, 2, "diagtrac"); |
1610 | 1626 | ||
1611 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SET_DIAG_ASS, 0); | 1627 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SET_DIAG_ASS, 0); |
1628 | if (!iob) | ||
1629 | return -ENOMEM; | ||
1612 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | 1630 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); |
1613 | cmd->data.diagass.subcmd_len = 16; | 1631 | cmd->data.diagass.subcmd_len = 16; |
1614 | cmd->data.diagass.subcmd = QETH_DIAGS_CMD_TRACE; | 1632 | cmd->data.diagass.subcmd = QETH_DIAGS_CMD_TRACE; |
@@ -2440,6 +2458,8 @@ static int qeth_l3_query_arp_cache_info(struct qeth_card *card, | |||
2440 | IPA_CMD_ASS_ARP_QUERY_INFO, | 2458 | IPA_CMD_ASS_ARP_QUERY_INFO, |
2441 | sizeof(struct qeth_arp_query_data) - sizeof(char), | 2459 | sizeof(struct qeth_arp_query_data) - sizeof(char), |
2442 | prot); | 2460 | prot); |
2461 | if (!iob) | ||
2462 | return -ENOMEM; | ||
2443 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | 2463 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); |
2444 | cmd->data.setassparms.data.query_arp.request_bits = 0x000F; | 2464 | cmd->data.setassparms.data.query_arp.request_bits = 0x000F; |
2445 | cmd->data.setassparms.data.query_arp.reply_bits = 0; | 2465 | cmd->data.setassparms.data.query_arp.reply_bits = 0; |
@@ -2533,6 +2553,8 @@ static int qeth_l3_arp_add_entry(struct qeth_card *card, | |||
2533 | IPA_CMD_ASS_ARP_ADD_ENTRY, | 2553 | IPA_CMD_ASS_ARP_ADD_ENTRY, |
2534 | sizeof(struct qeth_arp_cache_entry), | 2554 | sizeof(struct qeth_arp_cache_entry), |
2535 | QETH_PROT_IPV4); | 2555 | QETH_PROT_IPV4); |
2556 | if (!iob) | ||
2557 | return -ENOMEM; | ||
2536 | rc = qeth_l3_send_setassparms(card, iob, | 2558 | rc = qeth_l3_send_setassparms(card, iob, |
2537 | sizeof(struct qeth_arp_cache_entry), | 2559 | sizeof(struct qeth_arp_cache_entry), |
2538 | (unsigned long) entry, | 2560 | (unsigned long) entry, |
@@ -2572,6 +2594,8 @@ static int qeth_l3_arp_remove_entry(struct qeth_card *card, | |||
2572 | IPA_CMD_ASS_ARP_REMOVE_ENTRY, | 2594 | IPA_CMD_ASS_ARP_REMOVE_ENTRY, |
2573 | 12, | 2595 | 12, |
2574 | QETH_PROT_IPV4); | 2596 | QETH_PROT_IPV4); |
2597 | if (!iob) | ||
2598 | return -ENOMEM; | ||
2575 | rc = qeth_l3_send_setassparms(card, iob, | 2599 | rc = qeth_l3_send_setassparms(card, iob, |
2576 | 12, (unsigned long)buf, | 2600 | 12, (unsigned long)buf, |
2577 | qeth_l3_default_setassparms_cb, NULL); | 2601 | qeth_l3_default_setassparms_cb, NULL); |
@@ -3259,6 +3283,8 @@ static const struct net_device_ops qeth_l3_osa_netdev_ops = { | |||
3259 | 3283 | ||
3260 | static int qeth_l3_setup_netdev(struct qeth_card *card) | 3284 | static int qeth_l3_setup_netdev(struct qeth_card *card) |
3261 | { | 3285 | { |
3286 | int rc; | ||
3287 | |||
3262 | if (card->info.type == QETH_CARD_TYPE_OSD || | 3288 | if (card->info.type == QETH_CARD_TYPE_OSD || |
3263 | card->info.type == QETH_CARD_TYPE_OSX) { | 3289 | card->info.type == QETH_CARD_TYPE_OSX) { |
3264 | if ((card->info.link_type == QETH_LINK_TYPE_LANE_TR) || | 3290 | if ((card->info.link_type == QETH_LINK_TYPE_LANE_TR) || |
@@ -3290,7 +3316,9 @@ static int qeth_l3_setup_netdev(struct qeth_card *card) | |||
3290 | return -ENODEV; | 3316 | return -ENODEV; |
3291 | card->dev->flags |= IFF_NOARP; | 3317 | card->dev->flags |= IFF_NOARP; |
3292 | card->dev->netdev_ops = &qeth_l3_netdev_ops; | 3318 | card->dev->netdev_ops = &qeth_l3_netdev_ops; |
3293 | qeth_l3_iqd_read_initial_mac(card); | 3319 | rc = qeth_l3_iqd_read_initial_mac(card); |
3320 | if (rc) | ||
3321 | return rc; | ||
3294 | if (card->options.hsuid[0]) | 3322 | if (card->options.hsuid[0]) |
3295 | memcpy(card->dev->perm_addr, card->options.hsuid, 9); | 3323 | memcpy(card->dev->perm_addr, card->options.hsuid, 9); |
3296 | } else | 3324 | } else |
@@ -3357,7 +3385,7 @@ static int __qeth_l3_set_online(struct ccwgroup_device *gdev, int recovery_mode) | |||
3357 | recover_flag = card->state; | 3385 | recover_flag = card->state; |
3358 | rc = qeth_core_hardsetup_card(card); | 3386 | rc = qeth_core_hardsetup_card(card); |
3359 | if (rc) { | 3387 | if (rc) { |
3360 | QETH_DBF_TEXT_(SETUP, 2, "2err%d", rc); | 3388 | QETH_DBF_TEXT_(SETUP, 2, "2err%04x", rc); |
3361 | rc = -ENODEV; | 3389 | rc = -ENODEV; |
3362 | goto out_remove; | 3390 | goto out_remove; |
3363 | } | 3391 | } |
@@ -3398,7 +3426,7 @@ static int __qeth_l3_set_online(struct ccwgroup_device *gdev, int recovery_mode) | |||
3398 | contin: | 3426 | contin: |
3399 | rc = qeth_l3_setadapter_parms(card); | 3427 | rc = qeth_l3_setadapter_parms(card); |
3400 | if (rc) | 3428 | if (rc) |
3401 | QETH_DBF_TEXT_(SETUP, 2, "2err%d", rc); | 3429 | QETH_DBF_TEXT_(SETUP, 2, "2err%04x", rc); |
3402 | if (!card->options.sniffer) { | 3430 | if (!card->options.sniffer) { |
3403 | rc = qeth_l3_start_ipassists(card); | 3431 | rc = qeth_l3_start_ipassists(card); |
3404 | if (rc) { | 3432 | if (rc) { |
@@ -3407,10 +3435,10 @@ contin: | |||
3407 | } | 3435 | } |
3408 | rc = qeth_l3_setrouting_v4(card); | 3436 | rc = qeth_l3_setrouting_v4(card); |
3409 | if (rc) | 3437 | if (rc) |
3410 | QETH_DBF_TEXT_(SETUP, 2, "4err%d", rc); | 3438 | QETH_DBF_TEXT_(SETUP, 2, "4err%04x", rc); |
3411 | rc = qeth_l3_setrouting_v6(card); | 3439 | rc = qeth_l3_setrouting_v6(card); |
3412 | if (rc) | 3440 | if (rc) |
3413 | QETH_DBF_TEXT_(SETUP, 2, "5err%d", rc); | 3441 | QETH_DBF_TEXT_(SETUP, 2, "5err%04x", rc); |
3414 | } | 3442 | } |
3415 | netif_tx_disable(card->dev); | 3443 | netif_tx_disable(card->dev); |
3416 | 3444 | ||
diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c index df4e27cd996a..9219953ee949 100644 --- a/drivers/scsi/ipr.c +++ b/drivers/scsi/ipr.c | |||
@@ -683,6 +683,7 @@ static void ipr_init_ipr_cmnd(struct ipr_cmnd *ipr_cmd, | |||
683 | ipr_reinit_ipr_cmnd(ipr_cmd); | 683 | ipr_reinit_ipr_cmnd(ipr_cmd); |
684 | ipr_cmd->u.scratch = 0; | 684 | ipr_cmd->u.scratch = 0; |
685 | ipr_cmd->sibling = NULL; | 685 | ipr_cmd->sibling = NULL; |
686 | ipr_cmd->eh_comp = NULL; | ||
686 | ipr_cmd->fast_done = fast_done; | 687 | ipr_cmd->fast_done = fast_done; |
687 | init_timer(&ipr_cmd->timer); | 688 | init_timer(&ipr_cmd->timer); |
688 | } | 689 | } |
@@ -848,6 +849,8 @@ static void ipr_scsi_eh_done(struct ipr_cmnd *ipr_cmd) | |||
848 | 849 | ||
849 | scsi_dma_unmap(ipr_cmd->scsi_cmd); | 850 | scsi_dma_unmap(ipr_cmd->scsi_cmd); |
850 | scsi_cmd->scsi_done(scsi_cmd); | 851 | scsi_cmd->scsi_done(scsi_cmd); |
852 | if (ipr_cmd->eh_comp) | ||
853 | complete(ipr_cmd->eh_comp); | ||
851 | list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q); | 854 | list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q); |
852 | } | 855 | } |
853 | 856 | ||
@@ -4811,6 +4814,84 @@ static int ipr_slave_alloc(struct scsi_device *sdev) | |||
4811 | return rc; | 4814 | return rc; |
4812 | } | 4815 | } |
4813 | 4816 | ||
4817 | /** | ||
4818 | * ipr_match_lun - Match function for specified LUN | ||
4819 | * @ipr_cmd: ipr command struct | ||
4820 | * @device: device to match (sdev) | ||
4821 | * | ||
4822 | * Returns: | ||
4823 | * 1 if command matches sdev / 0 if command does not match sdev | ||
4824 | **/ | ||
4825 | static int ipr_match_lun(struct ipr_cmnd *ipr_cmd, void *device) | ||
4826 | { | ||
4827 | if (ipr_cmd->scsi_cmd && ipr_cmd->scsi_cmd->device == device) | ||
4828 | return 1; | ||
4829 | return 0; | ||
4830 | } | ||
4831 | |||
4832 | /** | ||
4833 | * ipr_wait_for_ops - Wait for matching commands to complete | ||
4834 | * @ipr_cmd: ipr command struct | ||
4835 | * @device: device to match (sdev) | ||
4836 | * @match: match function to use | ||
4837 | * | ||
4838 | * Returns: | ||
4839 | * SUCCESS / FAILED | ||
4840 | **/ | ||
4841 | static int ipr_wait_for_ops(struct ipr_ioa_cfg *ioa_cfg, void *device, | ||
4842 | int (*match)(struct ipr_cmnd *, void *)) | ||
4843 | { | ||
4844 | struct ipr_cmnd *ipr_cmd; | ||
4845 | int wait; | ||
4846 | unsigned long flags; | ||
4847 | struct ipr_hrr_queue *hrrq; | ||
4848 | signed long timeout = IPR_ABORT_TASK_TIMEOUT; | ||
4849 | DECLARE_COMPLETION_ONSTACK(comp); | ||
4850 | |||
4851 | ENTER; | ||
4852 | do { | ||
4853 | wait = 0; | ||
4854 | |||
4855 | for_each_hrrq(hrrq, ioa_cfg) { | ||
4856 | spin_lock_irqsave(hrrq->lock, flags); | ||
4857 | list_for_each_entry(ipr_cmd, &hrrq->hrrq_pending_q, queue) { | ||
4858 | if (match(ipr_cmd, device)) { | ||
4859 | ipr_cmd->eh_comp = ∁ | ||
4860 | wait++; | ||
4861 | } | ||
4862 | } | ||
4863 | spin_unlock_irqrestore(hrrq->lock, flags); | ||
4864 | } | ||
4865 | |||
4866 | if (wait) { | ||
4867 | timeout = wait_for_completion_timeout(&comp, timeout); | ||
4868 | |||
4869 | if (!timeout) { | ||
4870 | wait = 0; | ||
4871 | |||
4872 | for_each_hrrq(hrrq, ioa_cfg) { | ||
4873 | spin_lock_irqsave(hrrq->lock, flags); | ||
4874 | list_for_each_entry(ipr_cmd, &hrrq->hrrq_pending_q, queue) { | ||
4875 | if (match(ipr_cmd, device)) { | ||
4876 | ipr_cmd->eh_comp = NULL; | ||
4877 | wait++; | ||
4878 | } | ||
4879 | } | ||
4880 | spin_unlock_irqrestore(hrrq->lock, flags); | ||
4881 | } | ||
4882 | |||
4883 | if (wait) | ||
4884 | dev_err(&ioa_cfg->pdev->dev, "Timed out waiting for aborted commands\n"); | ||
4885 | LEAVE; | ||
4886 | return wait ? FAILED : SUCCESS; | ||
4887 | } | ||
4888 | } | ||
4889 | } while (wait); | ||
4890 | |||
4891 | LEAVE; | ||
4892 | return SUCCESS; | ||
4893 | } | ||
4894 | |||
4814 | static int ipr_eh_host_reset(struct scsi_cmnd *cmd) | 4895 | static int ipr_eh_host_reset(struct scsi_cmnd *cmd) |
4815 | { | 4896 | { |
4816 | struct ipr_ioa_cfg *ioa_cfg; | 4897 | struct ipr_ioa_cfg *ioa_cfg; |
@@ -5030,11 +5111,17 @@ static int __ipr_eh_dev_reset(struct scsi_cmnd *scsi_cmd) | |||
5030 | static int ipr_eh_dev_reset(struct scsi_cmnd *cmd) | 5111 | static int ipr_eh_dev_reset(struct scsi_cmnd *cmd) |
5031 | { | 5112 | { |
5032 | int rc; | 5113 | int rc; |
5114 | struct ipr_ioa_cfg *ioa_cfg; | ||
5115 | |||
5116 | ioa_cfg = (struct ipr_ioa_cfg *) cmd->device->host->hostdata; | ||
5033 | 5117 | ||
5034 | spin_lock_irq(cmd->device->host->host_lock); | 5118 | spin_lock_irq(cmd->device->host->host_lock); |
5035 | rc = __ipr_eh_dev_reset(cmd); | 5119 | rc = __ipr_eh_dev_reset(cmd); |
5036 | spin_unlock_irq(cmd->device->host->host_lock); | 5120 | spin_unlock_irq(cmd->device->host->host_lock); |
5037 | 5121 | ||
5122 | if (rc == SUCCESS) | ||
5123 | rc = ipr_wait_for_ops(ioa_cfg, cmd->device, ipr_match_lun); | ||
5124 | |||
5038 | return rc; | 5125 | return rc; |
5039 | } | 5126 | } |
5040 | 5127 | ||
@@ -5234,13 +5321,18 @@ static int ipr_eh_abort(struct scsi_cmnd *scsi_cmd) | |||
5234 | { | 5321 | { |
5235 | unsigned long flags; | 5322 | unsigned long flags; |
5236 | int rc; | 5323 | int rc; |
5324 | struct ipr_ioa_cfg *ioa_cfg; | ||
5237 | 5325 | ||
5238 | ENTER; | 5326 | ENTER; |
5239 | 5327 | ||
5328 | ioa_cfg = (struct ipr_ioa_cfg *) scsi_cmd->device->host->hostdata; | ||
5329 | |||
5240 | spin_lock_irqsave(scsi_cmd->device->host->host_lock, flags); | 5330 | spin_lock_irqsave(scsi_cmd->device->host->host_lock, flags); |
5241 | rc = ipr_cancel_op(scsi_cmd); | 5331 | rc = ipr_cancel_op(scsi_cmd); |
5242 | spin_unlock_irqrestore(scsi_cmd->device->host->host_lock, flags); | 5332 | spin_unlock_irqrestore(scsi_cmd->device->host->host_lock, flags); |
5243 | 5333 | ||
5334 | if (rc == SUCCESS) | ||
5335 | rc = ipr_wait_for_ops(ioa_cfg, scsi_cmd->device, ipr_match_lun); | ||
5244 | LEAVE; | 5336 | LEAVE; |
5245 | return rc; | 5337 | return rc; |
5246 | } | 5338 | } |
diff --git a/drivers/scsi/ipr.h b/drivers/scsi/ipr.h index b4f3eec51bc9..ec03b42fa2b9 100644 --- a/drivers/scsi/ipr.h +++ b/drivers/scsi/ipr.h | |||
@@ -1606,6 +1606,7 @@ struct ipr_cmnd { | |||
1606 | struct scsi_device *sdev; | 1606 | struct scsi_device *sdev; |
1607 | } u; | 1607 | } u; |
1608 | 1608 | ||
1609 | struct completion *eh_comp; | ||
1609 | struct ipr_hrr_queue *hrrq; | 1610 | struct ipr_hrr_queue *hrrq; |
1610 | struct ipr_ioa_cfg *ioa_cfg; | 1611 | struct ipr_ioa_cfg *ioa_cfg; |
1611 | }; | 1612 | }; |
diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c index e02885451425..9b3829931f40 100644 --- a/drivers/scsi/scsi.c +++ b/drivers/scsi/scsi.c | |||
@@ -986,9 +986,9 @@ int scsi_device_get(struct scsi_device *sdev) | |||
986 | return -ENXIO; | 986 | return -ENXIO; |
987 | if (!get_device(&sdev->sdev_gendev)) | 987 | if (!get_device(&sdev->sdev_gendev)) |
988 | return -ENXIO; | 988 | return -ENXIO; |
989 | /* We can fail this if we're doing SCSI operations | 989 | /* We can fail try_module_get if we're doing SCSI operations |
990 | * from module exit (like cache flush) */ | 990 | * from module exit (like cache flush) */ |
991 | try_module_get(sdev->host->hostt->module); | 991 | __module_get(sdev->host->hostt->module); |
992 | 992 | ||
993 | return 0; | 993 | return 0; |
994 | } | 994 | } |
@@ -1004,14 +1004,7 @@ EXPORT_SYMBOL(scsi_device_get); | |||
1004 | */ | 1004 | */ |
1005 | void scsi_device_put(struct scsi_device *sdev) | 1005 | void scsi_device_put(struct scsi_device *sdev) |
1006 | { | 1006 | { |
1007 | #ifdef CONFIG_MODULE_UNLOAD | 1007 | module_put(sdev->host->hostt->module); |
1008 | struct module *module = sdev->host->hostt->module; | ||
1009 | |||
1010 | /* The module refcount will be zero if scsi_device_get() | ||
1011 | * was called from a module removal routine */ | ||
1012 | if (module && module_refcount(module) != 0) | ||
1013 | module_put(module); | ||
1014 | #endif | ||
1015 | put_device(&sdev->sdev_gendev); | 1008 | put_device(&sdev->sdev_gendev); |
1016 | } | 1009 | } |
1017 | EXPORT_SYMBOL(scsi_device_put); | 1010 | EXPORT_SYMBOL(scsi_device_put); |
diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c index 7b8b51bc29b4..4aca1b0378c2 100644 --- a/drivers/scsi/scsi_debug.c +++ b/drivers/scsi/scsi_debug.c | |||
@@ -1623,7 +1623,7 @@ resp_rsup_opcodes(struct scsi_cmnd *scp, struct sdebug_dev_info *devip) | |||
1623 | req_opcode = cmd[3]; | 1623 | req_opcode = cmd[3]; |
1624 | req_sa = get_unaligned_be16(cmd + 4); | 1624 | req_sa = get_unaligned_be16(cmd + 4); |
1625 | alloc_len = get_unaligned_be32(cmd + 6); | 1625 | alloc_len = get_unaligned_be32(cmd + 6); |
1626 | if (alloc_len < 4 && alloc_len > 0xffff) { | 1626 | if (alloc_len < 4 || alloc_len > 0xffff) { |
1627 | mk_sense_invalid_fld(scp, SDEB_IN_CDB, 6, -1); | 1627 | mk_sense_invalid_fld(scp, SDEB_IN_CDB, 6, -1); |
1628 | return check_condition_result; | 1628 | return check_condition_result; |
1629 | } | 1629 | } |
@@ -1631,7 +1631,7 @@ resp_rsup_opcodes(struct scsi_cmnd *scp, struct sdebug_dev_info *devip) | |||
1631 | a_len = 8192; | 1631 | a_len = 8192; |
1632 | else | 1632 | else |
1633 | a_len = alloc_len; | 1633 | a_len = alloc_len; |
1634 | arr = kzalloc((a_len < 256) ? 320 : a_len + 64, GFP_KERNEL); | 1634 | arr = kzalloc((a_len < 256) ? 320 : a_len + 64, GFP_ATOMIC); |
1635 | if (NULL == arr) { | 1635 | if (NULL == arr) { |
1636 | mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC, | 1636 | mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC, |
1637 | INSUFF_RES_ASCQ); | 1637 | INSUFF_RES_ASCQ); |
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 9ea95dd3e260..17bb541f7cc2 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c | |||
@@ -591,7 +591,6 @@ static void scsi_free_sgtable(struct scsi_data_buffer *sdb, bool mq) | |||
591 | static int scsi_alloc_sgtable(struct scsi_data_buffer *sdb, int nents, bool mq) | 591 | static int scsi_alloc_sgtable(struct scsi_data_buffer *sdb, int nents, bool mq) |
592 | { | 592 | { |
593 | struct scatterlist *first_chunk = NULL; | 593 | struct scatterlist *first_chunk = NULL; |
594 | gfp_t gfp_mask = mq ? GFP_NOIO : GFP_ATOMIC; | ||
595 | int ret; | 594 | int ret; |
596 | 595 | ||
597 | BUG_ON(!nents); | 596 | BUG_ON(!nents); |
@@ -606,7 +605,7 @@ static int scsi_alloc_sgtable(struct scsi_data_buffer *sdb, int nents, bool mq) | |||
606 | } | 605 | } |
607 | 606 | ||
608 | ret = __sg_alloc_table(&sdb->table, nents, SCSI_MAX_SG_SEGMENTS, | 607 | ret = __sg_alloc_table(&sdb->table, nents, SCSI_MAX_SG_SEGMENTS, |
609 | first_chunk, gfp_mask, scsi_sg_alloc); | 608 | first_chunk, GFP_ATOMIC, scsi_sg_alloc); |
610 | if (unlikely(ret)) | 609 | if (unlikely(ret)) |
611 | scsi_free_sgtable(sdb, mq); | 610 | scsi_free_sgtable(sdb, mq); |
612 | return ret; | 611 | return ret; |
@@ -1144,7 +1143,17 @@ int scsi_init_io(struct scsi_cmnd *cmd) | |||
1144 | struct scsi_data_buffer *prot_sdb = cmd->prot_sdb; | 1143 | struct scsi_data_buffer *prot_sdb = cmd->prot_sdb; |
1145 | int ivecs, count; | 1144 | int ivecs, count; |
1146 | 1145 | ||
1147 | BUG_ON(prot_sdb == NULL); | 1146 | if (prot_sdb == NULL) { |
1147 | /* | ||
1148 | * This can happen if someone (e.g. multipath) | ||
1149 | * queues a command to a device on an adapter | ||
1150 | * that does not support DIX. | ||
1151 | */ | ||
1152 | WARN_ON_ONCE(1); | ||
1153 | error = BLKPREP_KILL; | ||
1154 | goto err_exit; | ||
1155 | } | ||
1156 | |||
1148 | ivecs = blk_rq_count_integrity_sg(rq->q, rq->bio); | 1157 | ivecs = blk_rq_count_integrity_sg(rq->q, rq->bio); |
1149 | 1158 | ||
1150 | if (scsi_alloc_sgtable(prot_sdb, ivecs, is_mq)) { | 1159 | if (scsi_alloc_sgtable(prot_sdb, ivecs, is_mq)) { |
diff --git a/drivers/spi/spi-dw-mid.c b/drivers/spi/spi-dw-mid.c index 7281316a5ecb..a67d37c7e3c0 100644 --- a/drivers/spi/spi-dw-mid.c +++ b/drivers/spi/spi-dw-mid.c | |||
@@ -271,7 +271,6 @@ int dw_spi_mid_init(struct dw_spi *dws) | |||
271 | iounmap(clk_reg); | 271 | iounmap(clk_reg); |
272 | 272 | ||
273 | dws->num_cs = 16; | 273 | dws->num_cs = 16; |
274 | dws->fifo_len = 40; /* FIFO has 40 words buffer */ | ||
275 | 274 | ||
276 | #ifdef CONFIG_SPI_DW_MID_DMA | 275 | #ifdef CONFIG_SPI_DW_MID_DMA |
277 | dws->dma_priv = kzalloc(sizeof(struct mid_dma), GFP_KERNEL); | 276 | dws->dma_priv = kzalloc(sizeof(struct mid_dma), GFP_KERNEL); |
diff --git a/drivers/spi/spi-dw.c b/drivers/spi/spi-dw.c index d0d5542efc06..8edcd1b84562 100644 --- a/drivers/spi/spi-dw.c +++ b/drivers/spi/spi-dw.c | |||
@@ -621,13 +621,13 @@ static void spi_hw_init(struct dw_spi *dws) | |||
621 | if (!dws->fifo_len) { | 621 | if (!dws->fifo_len) { |
622 | u32 fifo; | 622 | u32 fifo; |
623 | 623 | ||
624 | for (fifo = 2; fifo <= 257; fifo++) { | 624 | for (fifo = 2; fifo <= 256; fifo++) { |
625 | dw_writew(dws, DW_SPI_TXFLTR, fifo); | 625 | dw_writew(dws, DW_SPI_TXFLTR, fifo); |
626 | if (fifo != dw_readw(dws, DW_SPI_TXFLTR)) | 626 | if (fifo != dw_readw(dws, DW_SPI_TXFLTR)) |
627 | break; | 627 | break; |
628 | } | 628 | } |
629 | 629 | ||
630 | dws->fifo_len = (fifo == 257) ? 0 : fifo; | 630 | dws->fifo_len = (fifo == 2) ? 0 : fifo - 1; |
631 | dw_writew(dws, DW_SPI_TXFLTR, 0); | 631 | dw_writew(dws, DW_SPI_TXFLTR, 0); |
632 | } | 632 | } |
633 | } | 633 | } |
@@ -673,7 +673,7 @@ int dw_spi_add_host(struct device *dev, struct dw_spi *dws) | |||
673 | if (dws->dma_ops && dws->dma_ops->dma_init) { | 673 | if (dws->dma_ops && dws->dma_ops->dma_init) { |
674 | ret = dws->dma_ops->dma_init(dws); | 674 | ret = dws->dma_ops->dma_init(dws); |
675 | if (ret) { | 675 | if (ret) { |
676 | dev_warn(&master->dev, "DMA init failed\n"); | 676 | dev_warn(dev, "DMA init failed\n"); |
677 | dws->dma_inited = 0; | 677 | dws->dma_inited = 0; |
678 | } | 678 | } |
679 | } | 679 | } |
diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c index 05c623cfb078..23822e7df6c1 100644 --- a/drivers/spi/spi-pxa2xx.c +++ b/drivers/spi/spi-pxa2xx.c | |||
@@ -546,8 +546,8 @@ static void giveback(struct driver_data *drv_data) | |||
546 | cs_deassert(drv_data); | 546 | cs_deassert(drv_data); |
547 | } | 547 | } |
548 | 548 | ||
549 | spi_finalize_current_message(drv_data->master); | ||
550 | drv_data->cur_chip = NULL; | 549 | drv_data->cur_chip = NULL; |
550 | spi_finalize_current_message(drv_data->master); | ||
551 | } | 551 | } |
552 | 552 | ||
553 | static void reset_sccr1(struct driver_data *drv_data) | 553 | static void reset_sccr1(struct driver_data *drv_data) |
diff --git a/drivers/spi/spi-sh-msiof.c b/drivers/spi/spi-sh-msiof.c index 96a5fc0878d8..3ab7a21445fc 100644 --- a/drivers/spi/spi-sh-msiof.c +++ b/drivers/spi/spi-sh-msiof.c | |||
@@ -82,7 +82,7 @@ struct sh_msiof_spi_priv { | |||
82 | #define MDR1_SYNCMD_LR 0x30000000 /* L/R mode */ | 82 | #define MDR1_SYNCMD_LR 0x30000000 /* L/R mode */ |
83 | #define MDR1_SYNCAC_SHIFT 25 /* Sync Polarity (1 = Active-low) */ | 83 | #define MDR1_SYNCAC_SHIFT 25 /* Sync Polarity (1 = Active-low) */ |
84 | #define MDR1_BITLSB_SHIFT 24 /* MSB/LSB First (1 = LSB first) */ | 84 | #define MDR1_BITLSB_SHIFT 24 /* MSB/LSB First (1 = LSB first) */ |
85 | #define MDR1_FLD_MASK 0x000000c0 /* Frame Sync Signal Interval (0-3) */ | 85 | #define MDR1_FLD_MASK 0x0000000c /* Frame Sync Signal Interval (0-3) */ |
86 | #define MDR1_FLD_SHIFT 2 | 86 | #define MDR1_FLD_SHIFT 2 |
87 | #define MDR1_XXSTP 0x00000001 /* Transmission/Reception Stop on FIFO */ | 87 | #define MDR1_XXSTP 0x00000001 /* Transmission/Reception Stop on FIFO */ |
88 | /* TMDR1 */ | 88 | /* TMDR1 */ |
diff --git a/drivers/staging/media/tlg2300/Kconfig b/drivers/staging/media/tlg2300/Kconfig index 81784c6f7b88..77d8753f6ba4 100644 --- a/drivers/staging/media/tlg2300/Kconfig +++ b/drivers/staging/media/tlg2300/Kconfig | |||
@@ -1,6 +1,7 @@ | |||
1 | config VIDEO_TLG2300 | 1 | config VIDEO_TLG2300 |
2 | tristate "Telegent TLG2300 USB video capture support (Deprecated)" | 2 | tristate "Telegent TLG2300 USB video capture support (Deprecated)" |
3 | depends on VIDEO_DEV && I2C && SND && DVB_CORE | 3 | depends on VIDEO_DEV && I2C && SND && DVB_CORE |
4 | depends on MEDIA_USB_SUPPORT | ||
4 | select VIDEO_TUNER | 5 | select VIDEO_TUNER |
5 | select VIDEO_TVEEPROM | 6 | select VIDEO_TVEEPROM |
6 | depends on RC_CORE | 7 | depends on RC_CORE |
diff --git a/drivers/staging/vt6655/baseband.c b/drivers/staging/vt6655/baseband.c index 86c72ba0a0cd..f8c5fc371c4c 100644 --- a/drivers/staging/vt6655/baseband.c +++ b/drivers/staging/vt6655/baseband.c | |||
@@ -2177,7 +2177,7 @@ bool BBbVT3253Init(struct vnt_private *priv) | |||
2177 | /* Init ANT B select,RX Config CR10 = 0x28->0x2A, 0x2A->0x28(VC1/VC2 define, make the ANT_A, ANT_B inverted) */ | 2177 | /* Init ANT B select,RX Config CR10 = 0x28->0x2A, 0x2A->0x28(VC1/VC2 define, make the ANT_A, ANT_B inverted) */ |
2178 | /*bResult &= BBbWriteEmbedded(dwIoBase,0x0a,0x28);*/ | 2178 | /*bResult &= BBbWriteEmbedded(dwIoBase,0x0a,0x28);*/ |
2179 | /* Select VC1/VC2, CR215 = 0x02->0x06 */ | 2179 | /* Select VC1/VC2, CR215 = 0x02->0x06 */ |
2180 | bResult &= BBbWriteEmbedded(dwIoBase, 0xd7, 0x06); | 2180 | bResult &= BBbWriteEmbedded(priv, 0xd7, 0x06); |
2181 | /* }} */ | 2181 | /* }} */ |
2182 | 2182 | ||
2183 | for (ii = 0; ii < CB_VT3253B0_AGC; ii++) | 2183 | for (ii = 0; ii < CB_VT3253B0_AGC; ii++) |
diff --git a/drivers/staging/vt6655/channel.c b/drivers/staging/vt6655/channel.c index c8f739dd346e..70f870541f92 100644 --- a/drivers/staging/vt6655/channel.c +++ b/drivers/staging/vt6655/channel.c | |||
@@ -182,6 +182,14 @@ bool set_channel(void *pDeviceHandler, unsigned int uConnectionChannel) | |||
182 | if (pDevice->byCurrentCh == uConnectionChannel) | 182 | if (pDevice->byCurrentCh == uConnectionChannel) |
183 | return bResult; | 183 | return bResult; |
184 | 184 | ||
185 | /* Set VGA to max sensitivity */ | ||
186 | if (pDevice->bUpdateBBVGA && | ||
187 | pDevice->byBBVGACurrent != pDevice->abyBBVGA[0]) { | ||
188 | pDevice->byBBVGACurrent = pDevice->abyBBVGA[0]; | ||
189 | |||
190 | BBvSetVGAGainOffset(pDevice, pDevice->byBBVGACurrent); | ||
191 | } | ||
192 | |||
185 | /* clear NAV */ | 193 | /* clear NAV */ |
186 | MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MACCR, MACCR_CLRNAV); | 194 | MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MACCR, MACCR_CLRNAV); |
187 | 195 | ||
diff --git a/drivers/staging/vt6655/device_main.c b/drivers/staging/vt6655/device_main.c index 83e4162c0094..cd1a277d853b 100644 --- a/drivers/staging/vt6655/device_main.c +++ b/drivers/staging/vt6655/device_main.c | |||
@@ -1232,7 +1232,7 @@ static int vnt_tx_packet(struct vnt_private *priv, struct sk_buff *skb) | |||
1232 | 1232 | ||
1233 | head_td = priv->apCurrTD[dma_idx]; | 1233 | head_td = priv->apCurrTD[dma_idx]; |
1234 | 1234 | ||
1235 | head_td->m_td1TD1.byTCR = (TCR_EDP|TCR_STP); | 1235 | head_td->m_td1TD1.byTCR = 0; |
1236 | 1236 | ||
1237 | head_td->pTDInfo->skb = skb; | 1237 | head_td->pTDInfo->skb = skb; |
1238 | 1238 | ||
@@ -1257,6 +1257,11 @@ static int vnt_tx_packet(struct vnt_private *priv, struct sk_buff *skb) | |||
1257 | 1257 | ||
1258 | priv->bPWBitOn = false; | 1258 | priv->bPWBitOn = false; |
1259 | 1259 | ||
1260 | /* Set TSR1 & ReqCount in TxDescHead */ | ||
1261 | head_td->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP | EDMSDU); | ||
1262 | head_td->m_td1TD1.wReqCount = | ||
1263 | cpu_to_le16((u16)head_td->pTDInfo->dwReqCount); | ||
1264 | |||
1260 | head_td->pTDInfo->byFlags = TD_FLAGS_NETIF_SKB; | 1265 | head_td->pTDInfo->byFlags = TD_FLAGS_NETIF_SKB; |
1261 | 1266 | ||
1262 | if (dma_idx == TYPE_AC0DMA) | 1267 | if (dma_idx == TYPE_AC0DMA) |
@@ -1500,9 +1505,11 @@ static void vnt_bss_info_changed(struct ieee80211_hw *hw, | |||
1500 | if (conf->enable_beacon) { | 1505 | if (conf->enable_beacon) { |
1501 | vnt_beacon_enable(priv, vif, conf); | 1506 | vnt_beacon_enable(priv, vif, conf); |
1502 | 1507 | ||
1503 | MACvRegBitsOn(priv, MAC_REG_TCR, TCR_AUTOBCNTX); | 1508 | MACvRegBitsOn(priv->PortOffset, MAC_REG_TCR, |
1509 | TCR_AUTOBCNTX); | ||
1504 | } else { | 1510 | } else { |
1505 | MACvRegBitsOff(priv, MAC_REG_TCR, TCR_AUTOBCNTX); | 1511 | MACvRegBitsOff(priv->PortOffset, MAC_REG_TCR, |
1512 | TCR_AUTOBCNTX); | ||
1506 | } | 1513 | } |
1507 | } | 1514 | } |
1508 | 1515 | ||
diff --git a/drivers/staging/vt6655/rxtx.c b/drivers/staging/vt6655/rxtx.c index 61c39dd7ad01..b5b0155961f2 100644 --- a/drivers/staging/vt6655/rxtx.c +++ b/drivers/staging/vt6655/rxtx.c | |||
@@ -1204,13 +1204,10 @@ s_cbFillTxBufHead(struct vnt_private *pDevice, unsigned char byPktType, | |||
1204 | 1204 | ||
1205 | ptdCurr = (PSTxDesc)pHeadTD; | 1205 | ptdCurr = (PSTxDesc)pHeadTD; |
1206 | 1206 | ||
1207 | ptdCurr->pTDInfo->dwReqCount = cbReqCount - uPadding; | 1207 | ptdCurr->pTDInfo->dwReqCount = cbReqCount; |
1208 | ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength; | 1208 | ptdCurr->pTDInfo->dwHeaderLength = cbHeaderLength; |
1209 | ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma; | 1209 | ptdCurr->pTDInfo->skb_dma = ptdCurr->pTDInfo->buf_dma; |
1210 | ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma); | 1210 | ptdCurr->buff_addr = cpu_to_le32(ptdCurr->pTDInfo->skb_dma); |
1211 | /* Set TSR1 & ReqCount in TxDescHead */ | ||
1212 | ptdCurr->m_td1TD1.byTCR |= (TCR_STP | TCR_EDP | EDMSDU); | ||
1213 | ptdCurr->m_td1TD1.wReqCount = cpu_to_le16((unsigned short)(cbReqCount)); | ||
1214 | 1211 | ||
1215 | return cbHeaderLength; | 1212 | return cbHeaderLength; |
1216 | } | 1213 | } |
diff --git a/drivers/thermal/imx_thermal.c b/drivers/thermal/imx_thermal.c index c1188ac053c9..2ccbc0788353 100644 --- a/drivers/thermal/imx_thermal.c +++ b/drivers/thermal/imx_thermal.c | |||
@@ -608,6 +608,7 @@ static int imx_thermal_suspend(struct device *dev) | |||
608 | regmap_write(map, TEMPSENSE0 + REG_CLR, TEMPSENSE0_MEASURE_TEMP); | 608 | regmap_write(map, TEMPSENSE0 + REG_CLR, TEMPSENSE0_MEASURE_TEMP); |
609 | regmap_write(map, TEMPSENSE0 + REG_SET, TEMPSENSE0_POWER_DOWN); | 609 | regmap_write(map, TEMPSENSE0 + REG_SET, TEMPSENSE0_POWER_DOWN); |
610 | data->mode = THERMAL_DEVICE_DISABLED; | 610 | data->mode = THERMAL_DEVICE_DISABLED; |
611 | clk_disable_unprepare(data->thermal_clk); | ||
611 | 612 | ||
612 | return 0; | 613 | return 0; |
613 | } | 614 | } |
@@ -617,6 +618,7 @@ static int imx_thermal_resume(struct device *dev) | |||
617 | struct imx_thermal_data *data = dev_get_drvdata(dev); | 618 | struct imx_thermal_data *data = dev_get_drvdata(dev); |
618 | struct regmap *map = data->tempmon; | 619 | struct regmap *map = data->tempmon; |
619 | 620 | ||
621 | clk_prepare_enable(data->thermal_clk); | ||
620 | /* Enabled thermal sensor after resume */ | 622 | /* Enabled thermal sensor after resume */ |
621 | regmap_write(map, TEMPSENSE0 + REG_CLR, TEMPSENSE0_POWER_DOWN); | 623 | regmap_write(map, TEMPSENSE0 + REG_CLR, TEMPSENSE0_POWER_DOWN); |
622 | regmap_write(map, TEMPSENSE0 + REG_SET, TEMPSENSE0_MEASURE_TEMP); | 624 | regmap_write(map, TEMPSENSE0 + REG_SET, TEMPSENSE0_MEASURE_TEMP); |
diff --git a/drivers/thermal/of-thermal.c b/drivers/thermal/of-thermal.c index e145b66df444..d717f3dab6f1 100644 --- a/drivers/thermal/of-thermal.c +++ b/drivers/thermal/of-thermal.c | |||
@@ -149,7 +149,7 @@ EXPORT_SYMBOL_GPL(of_thermal_is_trip_valid); | |||
149 | * | 149 | * |
150 | * Return: pointer to trip points table, NULL otherwise | 150 | * Return: pointer to trip points table, NULL otherwise |
151 | */ | 151 | */ |
152 | const struct thermal_trip * const | 152 | const struct thermal_trip * |
153 | of_thermal_get_trip_points(struct thermal_zone_device *tz) | 153 | of_thermal_get_trip_points(struct thermal_zone_device *tz) |
154 | { | 154 | { |
155 | struct __thermal_zone *data = tz->devdata; | 155 | struct __thermal_zone *data = tz->devdata; |
diff --git a/drivers/thermal/rcar_thermal.c b/drivers/thermal/rcar_thermal.c index 8803e693fe68..2580a4872f90 100644 --- a/drivers/thermal/rcar_thermal.c +++ b/drivers/thermal/rcar_thermal.c | |||
@@ -63,7 +63,7 @@ struct rcar_thermal_priv { | |||
63 | struct mutex lock; | 63 | struct mutex lock; |
64 | struct list_head list; | 64 | struct list_head list; |
65 | int id; | 65 | int id; |
66 | int ctemp; | 66 | u32 ctemp; |
67 | }; | 67 | }; |
68 | 68 | ||
69 | #define rcar_thermal_for_each_priv(pos, common) \ | 69 | #define rcar_thermal_for_each_priv(pos, common) \ |
@@ -145,7 +145,7 @@ static int rcar_thermal_update_temp(struct rcar_thermal_priv *priv) | |||
145 | { | 145 | { |
146 | struct device *dev = rcar_priv_to_dev(priv); | 146 | struct device *dev = rcar_priv_to_dev(priv); |
147 | int i; | 147 | int i; |
148 | int ctemp, old, new; | 148 | u32 ctemp, old, new; |
149 | int ret = -EINVAL; | 149 | int ret = -EINVAL; |
150 | 150 | ||
151 | mutex_lock(&priv->lock); | 151 | mutex_lock(&priv->lock); |
@@ -372,6 +372,7 @@ static int rcar_thermal_probe(struct platform_device *pdev) | |||
372 | int i; | 372 | int i; |
373 | int ret = -ENODEV; | 373 | int ret = -ENODEV; |
374 | int idle = IDLE_INTERVAL; | 374 | int idle = IDLE_INTERVAL; |
375 | u32 enr_bits = 0; | ||
375 | 376 | ||
376 | common = devm_kzalloc(dev, sizeof(*common), GFP_KERNEL); | 377 | common = devm_kzalloc(dev, sizeof(*common), GFP_KERNEL); |
377 | if (!common) | 378 | if (!common) |
@@ -390,7 +391,7 @@ static int rcar_thermal_probe(struct platform_device *pdev) | |||
390 | 391 | ||
391 | /* | 392 | /* |
392 | * platform has IRQ support. | 393 | * platform has IRQ support. |
393 | * Then, drier use common register | 394 | * Then, driver uses common registers |
394 | */ | 395 | */ |
395 | 396 | ||
396 | ret = devm_request_irq(dev, irq->start, rcar_thermal_irq, 0, | 397 | ret = devm_request_irq(dev, irq->start, rcar_thermal_irq, 0, |
@@ -408,9 +409,6 @@ static int rcar_thermal_probe(struct platform_device *pdev) | |||
408 | if (IS_ERR(common->base)) | 409 | if (IS_ERR(common->base)) |
409 | return PTR_ERR(common->base); | 410 | return PTR_ERR(common->base); |
410 | 411 | ||
411 | /* enable temperature comparation */ | ||
412 | rcar_thermal_common_write(common, ENR, 0x00030303); | ||
413 | |||
414 | idle = 0; /* polling delay is not needed */ | 412 | idle = 0; /* polling delay is not needed */ |
415 | } | 413 | } |
416 | 414 | ||
@@ -452,8 +450,15 @@ static int rcar_thermal_probe(struct platform_device *pdev) | |||
452 | rcar_thermal_irq_enable(priv); | 450 | rcar_thermal_irq_enable(priv); |
453 | 451 | ||
454 | list_move_tail(&priv->list, &common->head); | 452 | list_move_tail(&priv->list, &common->head); |
453 | |||
454 | /* update ENR bits */ | ||
455 | enr_bits |= 3 << (i * 8); | ||
455 | } | 456 | } |
456 | 457 | ||
458 | /* enable temperature comparation */ | ||
459 | if (irq) | ||
460 | rcar_thermal_common_write(common, ENR, enr_bits); | ||
461 | |||
457 | platform_set_drvdata(pdev, common); | 462 | platform_set_drvdata(pdev, common); |
458 | 463 | ||
459 | dev_info(dev, "%d sensor probed\n", i); | 464 | dev_info(dev, "%d sensor probed\n", i); |
diff --git a/drivers/thermal/thermal_core.h b/drivers/thermal/thermal_core.h index 9083e7520623..0531c752fbbb 100644 --- a/drivers/thermal/thermal_core.h +++ b/drivers/thermal/thermal_core.h | |||
@@ -91,7 +91,7 @@ int of_parse_thermal_zones(void); | |||
91 | void of_thermal_destroy_zones(void); | 91 | void of_thermal_destroy_zones(void); |
92 | int of_thermal_get_ntrips(struct thermal_zone_device *); | 92 | int of_thermal_get_ntrips(struct thermal_zone_device *); |
93 | bool of_thermal_is_trip_valid(struct thermal_zone_device *, int); | 93 | bool of_thermal_is_trip_valid(struct thermal_zone_device *, int); |
94 | const struct thermal_trip * const | 94 | const struct thermal_trip * |
95 | of_thermal_get_trip_points(struct thermal_zone_device *); | 95 | of_thermal_get_trip_points(struct thermal_zone_device *); |
96 | #else | 96 | #else |
97 | static inline int of_parse_thermal_zones(void) { return 0; } | 97 | static inline int of_parse_thermal_zones(void) { return 0; } |
@@ -105,7 +105,7 @@ static inline bool of_thermal_is_trip_valid(struct thermal_zone_device *tz, | |||
105 | { | 105 | { |
106 | return 0; | 106 | return 0; |
107 | } | 107 | } |
108 | static inline const struct thermal_trip * const | 108 | static inline const struct thermal_trip * |
109 | of_thermal_get_trip_points(struct thermal_zone_device *tz) | 109 | of_thermal_get_trip_points(struct thermal_zone_device *tz) |
110 | { | 110 | { |
111 | return NULL; | 111 | return NULL; |
diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c index d2b496750d59..4ddfa60c9222 100644 --- a/drivers/tty/n_tty.c +++ b/drivers/tty/n_tty.c | |||
@@ -2399,17 +2399,12 @@ static unsigned int n_tty_poll(struct tty_struct *tty, struct file *file, | |||
2399 | 2399 | ||
2400 | poll_wait(file, &tty->read_wait, wait); | 2400 | poll_wait(file, &tty->read_wait, wait); |
2401 | poll_wait(file, &tty->write_wait, wait); | 2401 | poll_wait(file, &tty->write_wait, wait); |
2402 | if (test_bit(TTY_OTHER_CLOSED, &tty->flags)) | ||
2403 | mask |= POLLHUP; | ||
2404 | if (input_available_p(tty, 1)) | 2402 | if (input_available_p(tty, 1)) |
2405 | mask |= POLLIN | POLLRDNORM; | 2403 | mask |= POLLIN | POLLRDNORM; |
2406 | else if (mask & POLLHUP) { | ||
2407 | tty_flush_to_ldisc(tty); | ||
2408 | if (input_available_p(tty, 1)) | ||
2409 | mask |= POLLIN | POLLRDNORM; | ||
2410 | } | ||
2411 | if (tty->packet && tty->link->ctrl_status) | 2404 | if (tty->packet && tty->link->ctrl_status) |
2412 | mask |= POLLPRI | POLLIN | POLLRDNORM; | 2405 | mask |= POLLPRI | POLLIN | POLLRDNORM; |
2406 | if (test_bit(TTY_OTHER_CLOSED, &tty->flags)) | ||
2407 | mask |= POLLHUP; | ||
2413 | if (tty_hung_up_p(file)) | 2408 | if (tty_hung_up_p(file)) |
2414 | mask |= POLLHUP; | 2409 | mask |= POLLHUP; |
2415 | if (!(mask & (POLLHUP | POLLIN | POLLRDNORM))) { | 2410 | if (!(mask & (POLLHUP | POLLIN | POLLRDNORM))) { |
diff --git a/drivers/tty/serial/8250/8250_pci.c b/drivers/tty/serial/8250/8250_pci.c index 31feeb2d0a66..d1f8dc6aabcb 100644 --- a/drivers/tty/serial/8250/8250_pci.c +++ b/drivers/tty/serial/8250/8250_pci.c | |||
@@ -1815,7 +1815,7 @@ pci_wch_ch353_setup(struct serial_private *priv, | |||
1815 | } | 1815 | } |
1816 | 1816 | ||
1817 | static int | 1817 | static int |
1818 | pci_wch_ch382_setup(struct serial_private *priv, | 1818 | pci_wch_ch38x_setup(struct serial_private *priv, |
1819 | const struct pciserial_board *board, | 1819 | const struct pciserial_board *board, |
1820 | struct uart_8250_port *port, int idx) | 1820 | struct uart_8250_port *port, int idx) |
1821 | { | 1821 | { |
@@ -1880,6 +1880,7 @@ pci_wch_ch382_setup(struct serial_private *priv, | |||
1880 | 1880 | ||
1881 | #define PCIE_VENDOR_ID_WCH 0x1c00 | 1881 | #define PCIE_VENDOR_ID_WCH 0x1c00 |
1882 | #define PCIE_DEVICE_ID_WCH_CH382_2S1P 0x3250 | 1882 | #define PCIE_DEVICE_ID_WCH_CH382_2S1P 0x3250 |
1883 | #define PCIE_DEVICE_ID_WCH_CH384_4S 0x3470 | ||
1883 | 1884 | ||
1884 | /* Unknown vendors/cards - this should not be in linux/pci_ids.h */ | 1885 | /* Unknown vendors/cards - this should not be in linux/pci_ids.h */ |
1885 | #define PCI_SUBDEVICE_ID_UNKNOWN_0x1584 0x1584 | 1886 | #define PCI_SUBDEVICE_ID_UNKNOWN_0x1584 0x1584 |
@@ -2571,13 +2572,21 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = { | |||
2571 | .subdevice = PCI_ANY_ID, | 2572 | .subdevice = PCI_ANY_ID, |
2572 | .setup = pci_wch_ch353_setup, | 2573 | .setup = pci_wch_ch353_setup, |
2573 | }, | 2574 | }, |
2574 | /* WCH CH382 2S1P card (16750 clone) */ | 2575 | /* WCH CH382 2S1P card (16850 clone) */ |
2575 | { | 2576 | { |
2576 | .vendor = PCIE_VENDOR_ID_WCH, | 2577 | .vendor = PCIE_VENDOR_ID_WCH, |
2577 | .device = PCIE_DEVICE_ID_WCH_CH382_2S1P, | 2578 | .device = PCIE_DEVICE_ID_WCH_CH382_2S1P, |
2578 | .subvendor = PCI_ANY_ID, | 2579 | .subvendor = PCI_ANY_ID, |
2579 | .subdevice = PCI_ANY_ID, | 2580 | .subdevice = PCI_ANY_ID, |
2580 | .setup = pci_wch_ch382_setup, | 2581 | .setup = pci_wch_ch38x_setup, |
2582 | }, | ||
2583 | /* WCH CH384 4S card (16850 clone) */ | ||
2584 | { | ||
2585 | .vendor = PCIE_VENDOR_ID_WCH, | ||
2586 | .device = PCIE_DEVICE_ID_WCH_CH384_4S, | ||
2587 | .subvendor = PCI_ANY_ID, | ||
2588 | .subdevice = PCI_ANY_ID, | ||
2589 | .setup = pci_wch_ch38x_setup, | ||
2581 | }, | 2590 | }, |
2582 | /* | 2591 | /* |
2583 | * ASIX devices with FIFO bug | 2592 | * ASIX devices with FIFO bug |
@@ -2876,6 +2885,7 @@ enum pci_board_num_t { | |||
2876 | pbn_fintek_4, | 2885 | pbn_fintek_4, |
2877 | pbn_fintek_8, | 2886 | pbn_fintek_8, |
2878 | pbn_fintek_12, | 2887 | pbn_fintek_12, |
2888 | pbn_wch384_4, | ||
2879 | }; | 2889 | }; |
2880 | 2890 | ||
2881 | /* | 2891 | /* |
@@ -3675,6 +3685,14 @@ static struct pciserial_board pci_boards[] = { | |||
3675 | .base_baud = 115200, | 3685 | .base_baud = 115200, |
3676 | .first_offset = 0x40, | 3686 | .first_offset = 0x40, |
3677 | }, | 3687 | }, |
3688 | |||
3689 | [pbn_wch384_4] = { | ||
3690 | .flags = FL_BASE0, | ||
3691 | .num_ports = 4, | ||
3692 | .base_baud = 115200, | ||
3693 | .uart_offset = 8, | ||
3694 | .first_offset = 0xC0, | ||
3695 | }, | ||
3678 | }; | 3696 | }; |
3679 | 3697 | ||
3680 | static const struct pci_device_id blacklist[] = { | 3698 | static const struct pci_device_id blacklist[] = { |
@@ -3687,6 +3705,7 @@ static const struct pci_device_id blacklist[] = { | |||
3687 | { PCI_DEVICE(0x4348, 0x7053), }, /* WCH CH353 2S1P */ | 3705 | { PCI_DEVICE(0x4348, 0x7053), }, /* WCH CH353 2S1P */ |
3688 | { PCI_DEVICE(0x4348, 0x5053), }, /* WCH CH353 1S1P */ | 3706 | { PCI_DEVICE(0x4348, 0x5053), }, /* WCH CH353 1S1P */ |
3689 | { PCI_DEVICE(0x1c00, 0x3250), }, /* WCH CH382 2S1P */ | 3707 | { PCI_DEVICE(0x1c00, 0x3250), }, /* WCH CH382 2S1P */ |
3708 | { PCI_DEVICE(0x1c00, 0x3470), }, /* WCH CH384 4S */ | ||
3690 | }; | 3709 | }; |
3691 | 3710 | ||
3692 | /* | 3711 | /* |
@@ -5400,6 +5419,10 @@ static struct pci_device_id serial_pci_tbl[] = { | |||
5400 | PCI_ANY_ID, PCI_ANY_ID, | 5419 | PCI_ANY_ID, PCI_ANY_ID, |
5401 | 0, 0, pbn_b0_bt_2_115200 }, | 5420 | 0, 0, pbn_b0_bt_2_115200 }, |
5402 | 5421 | ||
5422 | { PCIE_VENDOR_ID_WCH, PCIE_DEVICE_ID_WCH_CH384_4S, | ||
5423 | PCI_ANY_ID, PCI_ANY_ID, | ||
5424 | 0, 0, pbn_wch384_4 }, | ||
5425 | |||
5403 | /* | 5426 | /* |
5404 | * Commtech, Inc. Fastcom adapters | 5427 | * Commtech, Inc. Fastcom adapters |
5405 | */ | 5428 | */ |
diff --git a/drivers/tty/serial/samsung.c b/drivers/tty/serial/samsung.c index 19273e31d224..107e80722575 100644 --- a/drivers/tty/serial/samsung.c +++ b/drivers/tty/serial/samsung.c | |||
@@ -1757,32 +1757,43 @@ static struct s3c24xx_serial_drv_data s5pv210_serial_drv_data = { | |||
1757 | #endif | 1757 | #endif |
1758 | 1758 | ||
1759 | #if defined(CONFIG_ARCH_EXYNOS) | 1759 | #if defined(CONFIG_ARCH_EXYNOS) |
1760 | #define EXYNOS_COMMON_SERIAL_DRV_DATA \ | ||
1761 | .info = &(struct s3c24xx_uart_info) { \ | ||
1762 | .name = "Samsung Exynos UART", \ | ||
1763 | .type = PORT_S3C6400, \ | ||
1764 | .has_divslot = 1, \ | ||
1765 | .rx_fifomask = S5PV210_UFSTAT_RXMASK, \ | ||
1766 | .rx_fifoshift = S5PV210_UFSTAT_RXSHIFT, \ | ||
1767 | .rx_fifofull = S5PV210_UFSTAT_RXFULL, \ | ||
1768 | .tx_fifofull = S5PV210_UFSTAT_TXFULL, \ | ||
1769 | .tx_fifomask = S5PV210_UFSTAT_TXMASK, \ | ||
1770 | .tx_fifoshift = S5PV210_UFSTAT_TXSHIFT, \ | ||
1771 | .def_clk_sel = S3C2410_UCON_CLKSEL0, \ | ||
1772 | .num_clks = 1, \ | ||
1773 | .clksel_mask = 0, \ | ||
1774 | .clksel_shift = 0, \ | ||
1775 | }, \ | ||
1776 | .def_cfg = &(struct s3c2410_uartcfg) { \ | ||
1777 | .ucon = S5PV210_UCON_DEFAULT, \ | ||
1778 | .ufcon = S5PV210_UFCON_DEFAULT, \ | ||
1779 | .has_fracval = 1, \ | ||
1780 | } \ | ||
1781 | |||
1760 | static struct s3c24xx_serial_drv_data exynos4210_serial_drv_data = { | 1782 | static struct s3c24xx_serial_drv_data exynos4210_serial_drv_data = { |
1761 | .info = &(struct s3c24xx_uart_info) { | 1783 | EXYNOS_COMMON_SERIAL_DRV_DATA, |
1762 | .name = "Samsung Exynos4 UART", | ||
1763 | .type = PORT_S3C6400, | ||
1764 | .has_divslot = 1, | ||
1765 | .rx_fifomask = S5PV210_UFSTAT_RXMASK, | ||
1766 | .rx_fifoshift = S5PV210_UFSTAT_RXSHIFT, | ||
1767 | .rx_fifofull = S5PV210_UFSTAT_RXFULL, | ||
1768 | .tx_fifofull = S5PV210_UFSTAT_TXFULL, | ||
1769 | .tx_fifomask = S5PV210_UFSTAT_TXMASK, | ||
1770 | .tx_fifoshift = S5PV210_UFSTAT_TXSHIFT, | ||
1771 | .def_clk_sel = S3C2410_UCON_CLKSEL0, | ||
1772 | .num_clks = 1, | ||
1773 | .clksel_mask = 0, | ||
1774 | .clksel_shift = 0, | ||
1775 | }, | ||
1776 | .def_cfg = &(struct s3c2410_uartcfg) { | ||
1777 | .ucon = S5PV210_UCON_DEFAULT, | ||
1778 | .ufcon = S5PV210_UFCON_DEFAULT, | ||
1779 | .has_fracval = 1, | ||
1780 | }, | ||
1781 | .fifosize = { 256, 64, 16, 16 }, | 1784 | .fifosize = { 256, 64, 16, 16 }, |
1782 | }; | 1785 | }; |
1786 | |||
1787 | static struct s3c24xx_serial_drv_data exynos5433_serial_drv_data = { | ||
1788 | EXYNOS_COMMON_SERIAL_DRV_DATA, | ||
1789 | .fifosize = { 64, 256, 16, 256 }, | ||
1790 | }; | ||
1791 | |||
1783 | #define EXYNOS4210_SERIAL_DRV_DATA ((kernel_ulong_t)&exynos4210_serial_drv_data) | 1792 | #define EXYNOS4210_SERIAL_DRV_DATA ((kernel_ulong_t)&exynos4210_serial_drv_data) |
1793 | #define EXYNOS5433_SERIAL_DRV_DATA ((kernel_ulong_t)&exynos5433_serial_drv_data) | ||
1784 | #else | 1794 | #else |
1785 | #define EXYNOS4210_SERIAL_DRV_DATA (kernel_ulong_t)NULL | 1795 | #define EXYNOS4210_SERIAL_DRV_DATA (kernel_ulong_t)NULL |
1796 | #define EXYNOS5433_SERIAL_DRV_DATA (kernel_ulong_t)NULL | ||
1786 | #endif | 1797 | #endif |
1787 | 1798 | ||
1788 | static struct platform_device_id s3c24xx_serial_driver_ids[] = { | 1799 | static struct platform_device_id s3c24xx_serial_driver_ids[] = { |
@@ -1804,6 +1815,9 @@ static struct platform_device_id s3c24xx_serial_driver_ids[] = { | |||
1804 | }, { | 1815 | }, { |
1805 | .name = "exynos4210-uart", | 1816 | .name = "exynos4210-uart", |
1806 | .driver_data = EXYNOS4210_SERIAL_DRV_DATA, | 1817 | .driver_data = EXYNOS4210_SERIAL_DRV_DATA, |
1818 | }, { | ||
1819 | .name = "exynos5433-uart", | ||
1820 | .driver_data = EXYNOS5433_SERIAL_DRV_DATA, | ||
1807 | }, | 1821 | }, |
1808 | { }, | 1822 | { }, |
1809 | }; | 1823 | }; |
@@ -1823,6 +1837,8 @@ static const struct of_device_id s3c24xx_uart_dt_match[] = { | |||
1823 | .data = (void *)S5PV210_SERIAL_DRV_DATA }, | 1837 | .data = (void *)S5PV210_SERIAL_DRV_DATA }, |
1824 | { .compatible = "samsung,exynos4210-uart", | 1838 | { .compatible = "samsung,exynos4210-uart", |
1825 | .data = (void *)EXYNOS4210_SERIAL_DRV_DATA }, | 1839 | .data = (void *)EXYNOS4210_SERIAL_DRV_DATA }, |
1840 | { .compatible = "samsung,exynos5433-uart", | ||
1841 | .data = (void *)EXYNOS5433_SERIAL_DRV_DATA }, | ||
1826 | {}, | 1842 | {}, |
1827 | }; | 1843 | }; |
1828 | MODULE_DEVICE_TABLE(of, s3c24xx_uart_dt_match); | 1844 | MODULE_DEVICE_TABLE(of, s3c24xx_uart_dt_match); |
diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c index 57ca61b14670..984605bb5bf1 100644 --- a/drivers/tty/serial/serial_core.c +++ b/drivers/tty/serial/serial_core.c | |||
@@ -2164,7 +2164,9 @@ uart_report_port(struct uart_driver *drv, struct uart_port *port) | |||
2164 | break; | 2164 | break; |
2165 | } | 2165 | } |
2166 | 2166 | ||
2167 | dev_info(port->dev, "%s%d at %s (irq = %d, base_baud = %d) is a %s\n", | 2167 | printk(KERN_INFO "%s%s%s%d at %s (irq = %d, base_baud = %d) is a %s\n", |
2168 | port->dev ? dev_name(port->dev) : "", | ||
2169 | port->dev ? ": " : "", | ||
2168 | drv->dev_name, | 2170 | drv->dev_name, |
2169 | drv->tty_driver->name_base + port->line, | 2171 | drv->tty_driver->name_base + port->line, |
2170 | address, port->irq, port->uartclk / 16, uart_type(port)); | 2172 | address, port->irq, port->uartclk / 16, uart_type(port)); |
diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c index 4f35b43e2475..51f066aa375e 100644 --- a/drivers/tty/tty_io.c +++ b/drivers/tty/tty_io.c | |||
@@ -1464,6 +1464,9 @@ static int tty_reopen(struct tty_struct *tty) | |||
1464 | driver->subtype == PTY_TYPE_MASTER) | 1464 | driver->subtype == PTY_TYPE_MASTER) |
1465 | return -EIO; | 1465 | return -EIO; |
1466 | 1466 | ||
1467 | if (test_bit(TTY_EXCLUSIVE, &tty->flags) && !capable(CAP_SYS_ADMIN)) | ||
1468 | return -EBUSY; | ||
1469 | |||
1467 | tty->count++; | 1470 | tty->count++; |
1468 | 1471 | ||
1469 | WARN_ON(!tty->ldisc); | 1472 | WARN_ON(!tty->ldisc); |
@@ -2106,10 +2109,6 @@ retry_open: | |||
2106 | retval = -ENODEV; | 2109 | retval = -ENODEV; |
2107 | filp->f_flags = saved_flags; | 2110 | filp->f_flags = saved_flags; |
2108 | 2111 | ||
2109 | if (!retval && test_bit(TTY_EXCLUSIVE, &tty->flags) && | ||
2110 | !capable(CAP_SYS_ADMIN)) | ||
2111 | retval = -EBUSY; | ||
2112 | |||
2113 | if (retval) { | 2112 | if (retval) { |
2114 | #ifdef TTY_DEBUG_HANGUP | 2113 | #ifdef TTY_DEBUG_HANGUP |
2115 | printk(KERN_DEBUG "%s: error %d in opening %s...\n", __func__, | 2114 | printk(KERN_DEBUG "%s: error %d in opening %s...\n", __func__, |
diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c index 5b9825a4538a..a57dc8866fc5 100644 --- a/drivers/usb/chipidea/core.c +++ b/drivers/usb/chipidea/core.c | |||
@@ -669,7 +669,6 @@ static int ci_hdrc_probe(struct platform_device *pdev) | |||
669 | if (!ci) | 669 | if (!ci) |
670 | return -ENOMEM; | 670 | return -ENOMEM; |
671 | 671 | ||
672 | platform_set_drvdata(pdev, ci); | ||
673 | ci->dev = dev; | 672 | ci->dev = dev; |
674 | ci->platdata = dev_get_platdata(dev); | 673 | ci->platdata = dev_get_platdata(dev); |
675 | ci->imx28_write_fix = !!(ci->platdata->flags & | 674 | ci->imx28_write_fix = !!(ci->platdata->flags & |
@@ -783,6 +782,7 @@ static int ci_hdrc_probe(struct platform_device *pdev) | |||
783 | } | 782 | } |
784 | } | 783 | } |
785 | 784 | ||
785 | platform_set_drvdata(pdev, ci); | ||
786 | ret = devm_request_irq(dev, ci->irq, ci_irq, IRQF_SHARED, | 786 | ret = devm_request_irq(dev, ci->irq, ci_irq, IRQF_SHARED, |
787 | ci->platdata->name, ci); | 787 | ci->platdata->name, ci); |
788 | if (ret) | 788 | if (ret) |
diff --git a/drivers/usb/chipidea/host.c b/drivers/usb/chipidea/host.c index c1694cff1eaf..48731d0bab35 100644 --- a/drivers/usb/chipidea/host.c +++ b/drivers/usb/chipidea/host.c | |||
@@ -91,6 +91,7 @@ static int host_start(struct ci_hdrc *ci) | |||
91 | if (!hcd) | 91 | if (!hcd) |
92 | return -ENOMEM; | 92 | return -ENOMEM; |
93 | 93 | ||
94 | dev_set_drvdata(ci->dev, ci); | ||
94 | hcd->rsrc_start = ci->hw_bank.phys; | 95 | hcd->rsrc_start = ci->hw_bank.phys; |
95 | hcd->rsrc_len = ci->hw_bank.size; | 96 | hcd->rsrc_len = ci->hw_bank.size; |
96 | hcd->regs = ci->hw_bank.abs; | 97 | hcd->regs = ci->hw_bank.abs; |
diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c index 200168ec2d75..79242008085b 100644 --- a/drivers/usb/dwc2/gadget.c +++ b/drivers/usb/dwc2/gadget.c | |||
@@ -2567,7 +2567,7 @@ error: | |||
2567 | * s3c_hsotg_ep_disable - disable given endpoint | 2567 | * s3c_hsotg_ep_disable - disable given endpoint |
2568 | * @ep: The endpoint to disable. | 2568 | * @ep: The endpoint to disable. |
2569 | */ | 2569 | */ |
2570 | static int s3c_hsotg_ep_disable(struct usb_ep *ep) | 2570 | static int s3c_hsotg_ep_disable_force(struct usb_ep *ep, bool force) |
2571 | { | 2571 | { |
2572 | struct s3c_hsotg_ep *hs_ep = our_ep(ep); | 2572 | struct s3c_hsotg_ep *hs_ep = our_ep(ep); |
2573 | struct dwc2_hsotg *hsotg = hs_ep->parent; | 2573 | struct dwc2_hsotg *hsotg = hs_ep->parent; |
@@ -2588,7 +2588,7 @@ static int s3c_hsotg_ep_disable(struct usb_ep *ep) | |||
2588 | 2588 | ||
2589 | spin_lock_irqsave(&hsotg->lock, flags); | 2589 | spin_lock_irqsave(&hsotg->lock, flags); |
2590 | /* terminate all requests with shutdown */ | 2590 | /* terminate all requests with shutdown */ |
2591 | kill_all_requests(hsotg, hs_ep, -ESHUTDOWN, false); | 2591 | kill_all_requests(hsotg, hs_ep, -ESHUTDOWN, force); |
2592 | 2592 | ||
2593 | hsotg->fifo_map &= ~(1<<hs_ep->fifo_index); | 2593 | hsotg->fifo_map &= ~(1<<hs_ep->fifo_index); |
2594 | hs_ep->fifo_index = 0; | 2594 | hs_ep->fifo_index = 0; |
@@ -2609,6 +2609,10 @@ static int s3c_hsotg_ep_disable(struct usb_ep *ep) | |||
2609 | return 0; | 2609 | return 0; |
2610 | } | 2610 | } |
2611 | 2611 | ||
2612 | static int s3c_hsotg_ep_disable(struct usb_ep *ep) | ||
2613 | { | ||
2614 | return s3c_hsotg_ep_disable_force(ep, false); | ||
2615 | } | ||
2612 | /** | 2616 | /** |
2613 | * on_list - check request is on the given endpoint | 2617 | * on_list - check request is on the given endpoint |
2614 | * @ep: The endpoint to check. | 2618 | * @ep: The endpoint to check. |
@@ -2924,7 +2928,7 @@ static int s3c_hsotg_udc_stop(struct usb_gadget *gadget) | |||
2924 | 2928 | ||
2925 | /* all endpoints should be shutdown */ | 2929 | /* all endpoints should be shutdown */ |
2926 | for (ep = 1; ep < hsotg->num_of_eps; ep++) | 2930 | for (ep = 1; ep < hsotg->num_of_eps; ep++) |
2927 | s3c_hsotg_ep_disable(&hsotg->eps[ep].ep); | 2931 | s3c_hsotg_ep_disable_force(&hsotg->eps[ep].ep, true); |
2928 | 2932 | ||
2929 | spin_lock_irqsave(&hsotg->lock, flags); | 2933 | spin_lock_irqsave(&hsotg->lock, flags); |
2930 | 2934 | ||
diff --git a/drivers/usb/dwc3/dwc3-pci.c b/drivers/usb/dwc3/dwc3-pci.c index 7c4faf738747..b642a2f998f9 100644 --- a/drivers/usb/dwc3/dwc3-pci.c +++ b/drivers/usb/dwc3/dwc3-pci.c | |||
@@ -33,6 +33,8 @@ | |||
33 | #define PCI_DEVICE_ID_INTEL_BYT 0x0f37 | 33 | #define PCI_DEVICE_ID_INTEL_BYT 0x0f37 |
34 | #define PCI_DEVICE_ID_INTEL_MRFLD 0x119e | 34 | #define PCI_DEVICE_ID_INTEL_MRFLD 0x119e |
35 | #define PCI_DEVICE_ID_INTEL_BSW 0x22B7 | 35 | #define PCI_DEVICE_ID_INTEL_BSW 0x22B7 |
36 | #define PCI_DEVICE_ID_INTEL_SPTLP 0x9d30 | ||
37 | #define PCI_DEVICE_ID_INTEL_SPTH 0xa130 | ||
36 | 38 | ||
37 | struct dwc3_pci { | 39 | struct dwc3_pci { |
38 | struct device *dev; | 40 | struct device *dev; |
@@ -219,6 +221,8 @@ static const struct pci_device_id dwc3_pci_id_table[] = { | |||
219 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BSW), }, | 221 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BSW), }, |
220 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BYT), }, | 222 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BYT), }, |
221 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_MRFLD), }, | 223 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_MRFLD), }, |
224 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_SPTLP), }, | ||
225 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_SPTH), }, | ||
222 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_NL_USB), }, | 226 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_NL_USB), }, |
223 | { } /* Terminating Entry */ | 227 | { } /* Terminating Entry */ |
224 | }; | 228 | }; |
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index f03b136ecfce..8f65ab3a3b92 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c | |||
@@ -882,8 +882,7 @@ static void dwc3_prepare_trbs(struct dwc3_ep *dep, bool starting) | |||
882 | 882 | ||
883 | if (i == (request->num_mapped_sgs - 1) || | 883 | if (i == (request->num_mapped_sgs - 1) || |
884 | sg_is_last(s)) { | 884 | sg_is_last(s)) { |
885 | if (list_is_last(&req->list, | 885 | if (list_empty(&dep->request_list)) |
886 | &dep->request_list)) | ||
887 | last_one = true; | 886 | last_one = true; |
888 | chain = false; | 887 | chain = false; |
889 | } | 888 | } |
@@ -901,6 +900,9 @@ static void dwc3_prepare_trbs(struct dwc3_ep *dep, bool starting) | |||
901 | if (last_one) | 900 | if (last_one) |
902 | break; | 901 | break; |
903 | } | 902 | } |
903 | |||
904 | if (last_one) | ||
905 | break; | ||
904 | } else { | 906 | } else { |
905 | dma = req->request.dma; | 907 | dma = req->request.dma; |
906 | length = req->request.length; | 908 | length = req->request.length; |
diff --git a/drivers/usb/gadget/function/f_hid.c b/drivers/usb/gadget/function/f_hid.c index 6e04e302dc3a..a1bc3e3a0b09 100644 --- a/drivers/usb/gadget/function/f_hid.c +++ b/drivers/usb/gadget/function/f_hid.c | |||
@@ -399,8 +399,9 @@ static int hidg_setup(struct usb_function *f, | |||
399 | value = __le16_to_cpu(ctrl->wValue); | 399 | value = __le16_to_cpu(ctrl->wValue); |
400 | length = __le16_to_cpu(ctrl->wLength); | 400 | length = __le16_to_cpu(ctrl->wLength); |
401 | 401 | ||
402 | VDBG(cdev, "hid_setup crtl_request : bRequestType:0x%x bRequest:0x%x " | 402 | VDBG(cdev, |
403 | "Value:0x%x\n", ctrl->bRequestType, ctrl->bRequest, value); | 403 | "%s crtl_request : bRequestType:0x%x bRequest:0x%x Value:0x%x\n", |
404 | __func__, ctrl->bRequestType, ctrl->bRequest, value); | ||
404 | 405 | ||
405 | switch ((ctrl->bRequestType << 8) | ctrl->bRequest) { | 406 | switch ((ctrl->bRequestType << 8) | ctrl->bRequest) { |
406 | case ((USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8 | 407 | case ((USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8 |
diff --git a/drivers/usb/gadget/function/f_midi.c b/drivers/usb/gadget/function/f_midi.c index a90440300735..259b656c0b3e 100644 --- a/drivers/usb/gadget/function/f_midi.c +++ b/drivers/usb/gadget/function/f_midi.c | |||
@@ -520,7 +520,7 @@ static void f_midi_transmit(struct f_midi *midi, struct usb_request *req) | |||
520 | req = midi_alloc_ep_req(ep, midi->buflen); | 520 | req = midi_alloc_ep_req(ep, midi->buflen); |
521 | 521 | ||
522 | if (!req) { | 522 | if (!req) { |
523 | ERROR(midi, "gmidi_transmit: alloc_ep_request failed\n"); | 523 | ERROR(midi, "%s: alloc_ep_request failed\n", __func__); |
524 | return; | 524 | return; |
525 | } | 525 | } |
526 | req->length = 0; | 526 | req->length = 0; |
diff --git a/drivers/usb/gadget/function/f_uac1.c b/drivers/usb/gadget/function/f_uac1.c index f7b203293205..e9715845f82e 100644 --- a/drivers/usb/gadget/function/f_uac1.c +++ b/drivers/usb/gadget/function/f_uac1.c | |||
@@ -897,7 +897,6 @@ static void f_audio_free_inst(struct usb_function_instance *f) | |||
897 | struct f_uac1_opts *opts; | 897 | struct f_uac1_opts *opts; |
898 | 898 | ||
899 | opts = container_of(f, struct f_uac1_opts, func_inst); | 899 | opts = container_of(f, struct f_uac1_opts, func_inst); |
900 | gaudio_cleanup(opts->card); | ||
901 | if (opts->fn_play_alloc) | 900 | if (opts->fn_play_alloc) |
902 | kfree(opts->fn_play); | 901 | kfree(opts->fn_play); |
903 | if (opts->fn_cap_alloc) | 902 | if (opts->fn_cap_alloc) |
@@ -935,6 +934,7 @@ static void f_audio_free(struct usb_function *f) | |||
935 | struct f_audio *audio = func_to_audio(f); | 934 | struct f_audio *audio = func_to_audio(f); |
936 | struct f_uac1_opts *opts; | 935 | struct f_uac1_opts *opts; |
937 | 936 | ||
937 | gaudio_cleanup(&audio->card); | ||
938 | opts = container_of(f->fi, struct f_uac1_opts, func_inst); | 938 | opts = container_of(f->fi, struct f_uac1_opts, func_inst); |
939 | kfree(audio); | 939 | kfree(audio); |
940 | mutex_lock(&opts->lock); | 940 | mutex_lock(&opts->lock); |
diff --git a/drivers/usb/gadget/legacy/inode.c b/drivers/usb/gadget/legacy/inode.c index c744e4975d74..db49ec4c748e 100644 --- a/drivers/usb/gadget/legacy/inode.c +++ b/drivers/usb/gadget/legacy/inode.c | |||
@@ -441,6 +441,7 @@ ep_write (struct file *fd, const char __user *buf, size_t len, loff_t *ptr) | |||
441 | kbuf = memdup_user(buf, len); | 441 | kbuf = memdup_user(buf, len); |
442 | if (IS_ERR(kbuf)) { | 442 | if (IS_ERR(kbuf)) { |
443 | value = PTR_ERR(kbuf); | 443 | value = PTR_ERR(kbuf); |
444 | kbuf = NULL; | ||
444 | goto free1; | 445 | goto free1; |
445 | } | 446 | } |
446 | 447 | ||
@@ -449,6 +450,7 @@ ep_write (struct file *fd, const char __user *buf, size_t len, loff_t *ptr) | |||
449 | data->name, len, (int) value); | 450 | data->name, len, (int) value); |
450 | free1: | 451 | free1: |
451 | mutex_unlock(&data->lock); | 452 | mutex_unlock(&data->lock); |
453 | kfree (kbuf); | ||
452 | return value; | 454 | return value; |
453 | } | 455 | } |
454 | 456 | ||
diff --git a/drivers/usb/gadget/udc/atmel_usba_udc.c b/drivers/usb/gadget/udc/atmel_usba_udc.c index ce882371786b..9f93bed42052 100644 --- a/drivers/usb/gadget/udc/atmel_usba_udc.c +++ b/drivers/usb/gadget/udc/atmel_usba_udc.c | |||
@@ -716,10 +716,10 @@ static int queue_dma(struct usba_udc *udc, struct usba_ep *ep, | |||
716 | req->using_dma = 1; | 716 | req->using_dma = 1; |
717 | req->ctrl = USBA_BF(DMA_BUF_LEN, req->req.length) | 717 | req->ctrl = USBA_BF(DMA_BUF_LEN, req->req.length) |
718 | | USBA_DMA_CH_EN | USBA_DMA_END_BUF_IE | 718 | | USBA_DMA_CH_EN | USBA_DMA_END_BUF_IE |
719 | | USBA_DMA_END_TR_EN | USBA_DMA_END_TR_IE; | 719 | | USBA_DMA_END_BUF_EN; |
720 | 720 | ||
721 | if (ep->is_in) | 721 | if (!ep->is_in) |
722 | req->ctrl |= USBA_DMA_END_BUF_EN; | 722 | req->ctrl |= USBA_DMA_END_TR_EN | USBA_DMA_END_TR_IE; |
723 | 723 | ||
724 | /* | 724 | /* |
725 | * Add this request to the queue and submit for DMA if | 725 | * Add this request to the queue and submit for DMA if |
@@ -828,7 +828,7 @@ static int usba_ep_dequeue(struct usb_ep *_ep, struct usb_request *_req) | |||
828 | { | 828 | { |
829 | struct usba_ep *ep = to_usba_ep(_ep); | 829 | struct usba_ep *ep = to_usba_ep(_ep); |
830 | struct usba_udc *udc = ep->udc; | 830 | struct usba_udc *udc = ep->udc; |
831 | struct usba_request *req = to_usba_req(_req); | 831 | struct usba_request *req; |
832 | unsigned long flags; | 832 | unsigned long flags; |
833 | u32 status; | 833 | u32 status; |
834 | 834 | ||
@@ -837,6 +837,16 @@ static int usba_ep_dequeue(struct usb_ep *_ep, struct usb_request *_req) | |||
837 | 837 | ||
838 | spin_lock_irqsave(&udc->lock, flags); | 838 | spin_lock_irqsave(&udc->lock, flags); |
839 | 839 | ||
840 | list_for_each_entry(req, &ep->queue, queue) { | ||
841 | if (&req->req == _req) | ||
842 | break; | ||
843 | } | ||
844 | |||
845 | if (&req->req != _req) { | ||
846 | spin_unlock_irqrestore(&udc->lock, flags); | ||
847 | return -EINVAL; | ||
848 | } | ||
849 | |||
840 | if (req->using_dma) { | 850 | if (req->using_dma) { |
841 | /* | 851 | /* |
842 | * If this request is currently being transferred, | 852 | * If this request is currently being transferred, |
@@ -1563,7 +1573,6 @@ static void usba_ep_irq(struct usba_udc *udc, struct usba_ep *ep) | |||
1563 | if ((epstatus & epctrl) & USBA_RX_BK_RDY) { | 1573 | if ((epstatus & epctrl) & USBA_RX_BK_RDY) { |
1564 | DBG(DBG_BUS, "%s: RX data ready\n", ep->ep.name); | 1574 | DBG(DBG_BUS, "%s: RX data ready\n", ep->ep.name); |
1565 | receive_data(ep); | 1575 | receive_data(ep); |
1566 | usba_ep_writel(ep, CLR_STA, USBA_RX_BK_RDY); | ||
1567 | } | 1576 | } |
1568 | } | 1577 | } |
1569 | 1578 | ||
diff --git a/drivers/usb/gadget/udc/bdc/bdc_ep.c b/drivers/usb/gadget/udc/bdc/bdc_ep.c index ff67ceac77c4..d4fe8d769bd6 100644 --- a/drivers/usb/gadget/udc/bdc/bdc_ep.c +++ b/drivers/usb/gadget/udc/bdc/bdc_ep.c | |||
@@ -718,10 +718,11 @@ static int ep_queue(struct bdc_ep *ep, struct bdc_req *req) | |||
718 | struct bdc *bdc; | 718 | struct bdc *bdc; |
719 | int ret = 0; | 719 | int ret = 0; |
720 | 720 | ||
721 | bdc = ep->bdc; | ||
722 | if (!req || !ep || !ep->usb_ep.desc) | 721 | if (!req || !ep || !ep->usb_ep.desc) |
723 | return -EINVAL; | 722 | return -EINVAL; |
724 | 723 | ||
724 | bdc = ep->bdc; | ||
725 | |||
725 | req->usb_req.actual = 0; | 726 | req->usb_req.actual = 0; |
726 | req->usb_req.status = -EINPROGRESS; | 727 | req->usb_req.status = -EINPROGRESS; |
727 | req->epnum = ep->ep_num; | 728 | req->epnum = ep->ep_num; |
diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c index e113fd73aeae..f9a332775c47 100644 --- a/drivers/usb/host/ehci-sched.c +++ b/drivers/usb/host/ehci-sched.c | |||
@@ -1581,6 +1581,10 @@ iso_stream_schedule ( | |||
1581 | else | 1581 | else |
1582 | next = (now + 2 + 7) & ~0x07; /* full frame cache */ | 1582 | next = (now + 2 + 7) & ~0x07; /* full frame cache */ |
1583 | 1583 | ||
1584 | /* If needed, initialize last_iso_frame so that this URB will be seen */ | ||
1585 | if (ehci->isoc_count == 0) | ||
1586 | ehci->last_iso_frame = now >> 3; | ||
1587 | |||
1584 | /* | 1588 | /* |
1585 | * Use ehci->last_iso_frame as the base. There can't be any | 1589 | * Use ehci->last_iso_frame as the base. There can't be any |
1586 | * TDs scheduled for earlier than that. | 1590 | * TDs scheduled for earlier than that. |
@@ -1600,11 +1604,11 @@ iso_stream_schedule ( | |||
1600 | */ | 1604 | */ |
1601 | now2 = (now - base) & (mod - 1); | 1605 | now2 = (now - base) & (mod - 1); |
1602 | 1606 | ||
1603 | /* Is the schedule already full? */ | 1607 | /* Is the schedule about to wrap around? */ |
1604 | if (unlikely(!empty && start < period)) { | 1608 | if (unlikely(!empty && start < period)) { |
1605 | ehci_dbg(ehci, "iso sched full %p (%u-%u < %u mod %u)\n", | 1609 | ehci_dbg(ehci, "request %p would overflow (%u-%u < %u mod %u)\n", |
1606 | urb, stream->next_uframe, base, period, mod); | 1610 | urb, stream->next_uframe, base, period, mod); |
1607 | status = -ENOSPC; | 1611 | status = -EFBIG; |
1608 | goto fail; | 1612 | goto fail; |
1609 | } | 1613 | } |
1610 | 1614 | ||
@@ -1671,10 +1675,6 @@ iso_stream_schedule ( | |||
1671 | urb->start_frame = start & (mod - 1); | 1675 | urb->start_frame = start & (mod - 1); |
1672 | if (!stream->highspeed) | 1676 | if (!stream->highspeed) |
1673 | urb->start_frame >>= 3; | 1677 | urb->start_frame >>= 3; |
1674 | |||
1675 | /* Make sure scan_isoc() sees these */ | ||
1676 | if (ehci->isoc_count == 0) | ||
1677 | ehci->last_iso_frame = now >> 3; | ||
1678 | return status; | 1678 | return status; |
1679 | 1679 | ||
1680 | fail: | 1680 | fail: |
diff --git a/drivers/usb/host/ehci-tegra.c b/drivers/usb/host/ehci-tegra.c index 19a9af1b4d74..ff9af29b4e9f 100644 --- a/drivers/usb/host/ehci-tegra.c +++ b/drivers/usb/host/ehci-tegra.c | |||
@@ -451,7 +451,7 @@ static int tegra_ehci_probe(struct platform_device *pdev) | |||
451 | 451 | ||
452 | u_phy = devm_usb_get_phy_by_phandle(&pdev->dev, "nvidia,phy", 0); | 452 | u_phy = devm_usb_get_phy_by_phandle(&pdev->dev, "nvidia,phy", 0); |
453 | if (IS_ERR(u_phy)) { | 453 | if (IS_ERR(u_phy)) { |
454 | err = PTR_ERR(u_phy); | 454 | err = -EPROBE_DEFER; |
455 | goto cleanup_clk_en; | 455 | goto cleanup_clk_en; |
456 | } | 456 | } |
457 | hcd->usb_phy = u_phy; | 457 | hcd->usb_phy = u_phy; |
diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c index dd483c13565b..ce636466edb7 100644 --- a/drivers/usb/host/pci-quirks.c +++ b/drivers/usb/host/pci-quirks.c | |||
@@ -567,7 +567,8 @@ static void quirk_usb_handoff_ohci(struct pci_dev *pdev) | |||
567 | { | 567 | { |
568 | void __iomem *base; | 568 | void __iomem *base; |
569 | u32 control; | 569 | u32 control; |
570 | u32 fminterval; | 570 | u32 fminterval = 0; |
571 | bool no_fminterval = false; | ||
571 | int cnt; | 572 | int cnt; |
572 | 573 | ||
573 | if (!mmio_resource_enabled(pdev, 0)) | 574 | if (!mmio_resource_enabled(pdev, 0)) |
@@ -577,6 +578,13 @@ static void quirk_usb_handoff_ohci(struct pci_dev *pdev) | |||
577 | if (base == NULL) | 578 | if (base == NULL) |
578 | return; | 579 | return; |
579 | 580 | ||
581 | /* | ||
582 | * ULi M5237 OHCI controller locks the whole system when accessing | ||
583 | * the OHCI_FMINTERVAL offset. | ||
584 | */ | ||
585 | if (pdev->vendor == PCI_VENDOR_ID_AL && pdev->device == 0x5237) | ||
586 | no_fminterval = true; | ||
587 | |||
580 | control = readl(base + OHCI_CONTROL); | 588 | control = readl(base + OHCI_CONTROL); |
581 | 589 | ||
582 | /* On PA-RISC, PDC can leave IR set incorrectly; ignore it there. */ | 590 | /* On PA-RISC, PDC can leave IR set incorrectly; ignore it there. */ |
@@ -615,7 +623,9 @@ static void quirk_usb_handoff_ohci(struct pci_dev *pdev) | |||
615 | } | 623 | } |
616 | 624 | ||
617 | /* software reset of the controller, preserving HcFmInterval */ | 625 | /* software reset of the controller, preserving HcFmInterval */ |
618 | fminterval = readl(base + OHCI_FMINTERVAL); | 626 | if (!no_fminterval) |
627 | fminterval = readl(base + OHCI_FMINTERVAL); | ||
628 | |||
619 | writel(OHCI_HCR, base + OHCI_CMDSTATUS); | 629 | writel(OHCI_HCR, base + OHCI_CMDSTATUS); |
620 | 630 | ||
621 | /* reset requires max 10 us delay */ | 631 | /* reset requires max 10 us delay */ |
@@ -624,7 +634,9 @@ static void quirk_usb_handoff_ohci(struct pci_dev *pdev) | |||
624 | break; | 634 | break; |
625 | udelay(1); | 635 | udelay(1); |
626 | } | 636 | } |
627 | writel(fminterval, base + OHCI_FMINTERVAL); | 637 | |
638 | if (!no_fminterval) | ||
639 | writel(fminterval, base + OHCI_FMINTERVAL); | ||
628 | 640 | ||
629 | /* Now the controller is safely in SUSPEND and nothing can wake it up */ | 641 | /* Now the controller is safely in SUSPEND and nothing can wake it up */ |
630 | iounmap(base); | 642 | iounmap(base); |
diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c index 142b601f9563..7f76c8a12f89 100644 --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c | |||
@@ -82,6 +82,8 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) | |||
82 | "must be suspended extra slowly", | 82 | "must be suspended extra slowly", |
83 | pdev->revision); | 83 | pdev->revision); |
84 | } | 84 | } |
85 | if (pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_PDK) | ||
86 | xhci->quirks |= XHCI_BROKEN_STREAMS; | ||
85 | /* Fresco Logic confirms: all revisions of this chip do not | 87 | /* Fresco Logic confirms: all revisions of this chip do not |
86 | * support MSI, even though some of them claim to in their PCI | 88 | * support MSI, even though some of them claim to in their PCI |
87 | * capabilities. | 89 | * capabilities. |
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index 01fcbb5eb06e..c50d8d202618 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c | |||
@@ -3803,6 +3803,15 @@ static int xhci_setup_device(struct usb_hcd *hcd, struct usb_device *udev, | |||
3803 | return -EINVAL; | 3803 | return -EINVAL; |
3804 | } | 3804 | } |
3805 | 3805 | ||
3806 | if (setup == SETUP_CONTEXT_ONLY) { | ||
3807 | slot_ctx = xhci_get_slot_ctx(xhci, virt_dev->out_ctx); | ||
3808 | if (GET_SLOT_STATE(le32_to_cpu(slot_ctx->dev_state)) == | ||
3809 | SLOT_STATE_DEFAULT) { | ||
3810 | xhci_dbg(xhci, "Slot already in default state\n"); | ||
3811 | return 0; | ||
3812 | } | ||
3813 | } | ||
3814 | |||
3806 | command = xhci_alloc_command(xhci, false, false, GFP_KERNEL); | 3815 | command = xhci_alloc_command(xhci, false, false, GFP_KERNEL); |
3807 | if (!command) | 3816 | if (!command) |
3808 | return -ENOMEM; | 3817 | return -ENOMEM; |
diff --git a/drivers/usb/musb/Kconfig b/drivers/usb/musb/Kconfig index 9d68372dd9aa..b005010240e5 100644 --- a/drivers/usb/musb/Kconfig +++ b/drivers/usb/musb/Kconfig | |||
@@ -72,6 +72,8 @@ config USB_MUSB_DA8XX | |||
72 | 72 | ||
73 | config USB_MUSB_TUSB6010 | 73 | config USB_MUSB_TUSB6010 |
74 | tristate "TUSB6010" | 74 | tristate "TUSB6010" |
75 | depends on ARCH_OMAP2PLUS || COMPILE_TEST | ||
76 | depends on NOP_USB_XCEIV = USB_MUSB_HDRC # both built-in or both modules | ||
75 | 77 | ||
76 | config USB_MUSB_OMAP2PLUS | 78 | config USB_MUSB_OMAP2PLUS |
77 | tristate "OMAP2430 and onwards" | 79 | tristate "OMAP2430 and onwards" |
@@ -85,6 +87,7 @@ config USB_MUSB_AM35X | |||
85 | config USB_MUSB_DSPS | 87 | config USB_MUSB_DSPS |
86 | tristate "TI DSPS platforms" | 88 | tristate "TI DSPS platforms" |
87 | select USB_MUSB_AM335X_CHILD | 89 | select USB_MUSB_AM335X_CHILD |
90 | depends on ARCH_OMAP2PLUS || COMPILE_TEST | ||
88 | depends on OF_IRQ | 91 | depends on OF_IRQ |
89 | 92 | ||
90 | config USB_MUSB_BLACKFIN | 93 | config USB_MUSB_BLACKFIN |
@@ -93,6 +96,7 @@ config USB_MUSB_BLACKFIN | |||
93 | 96 | ||
94 | config USB_MUSB_UX500 | 97 | config USB_MUSB_UX500 |
95 | tristate "Ux500 platforms" | 98 | tristate "Ux500 platforms" |
99 | depends on ARCH_U8500 || COMPILE_TEST | ||
96 | 100 | ||
97 | config USB_MUSB_JZ4740 | 101 | config USB_MUSB_JZ4740 |
98 | tristate "JZ4740" | 102 | tristate "JZ4740" |
diff --git a/drivers/usb/musb/blackfin.c b/drivers/usb/musb/blackfin.c index a441a2de8619..178250145613 100644 --- a/drivers/usb/musb/blackfin.c +++ b/drivers/usb/musb/blackfin.c | |||
@@ -63,7 +63,7 @@ static void bfin_writew(void __iomem *addr, unsigned offset, u16 data) | |||
63 | bfin_write16(addr + offset, data); | 63 | bfin_write16(addr + offset, data); |
64 | } | 64 | } |
65 | 65 | ||
66 | static void binf_writel(void __iomem *addr, unsigned offset, u32 data) | 66 | static void bfin_writel(void __iomem *addr, unsigned offset, u32 data) |
67 | { | 67 | { |
68 | bfin_write16(addr + offset, (u16)data); | 68 | bfin_write16(addr + offset, (u16)data); |
69 | } | 69 | } |
diff --git a/drivers/usb/musb/musb_cppi41.c b/drivers/usb/musb/musb_cppi41.c index f64fd964dc6d..c39a16ad7832 100644 --- a/drivers/usb/musb/musb_cppi41.c +++ b/drivers/usb/musb/musb_cppi41.c | |||
@@ -628,9 +628,9 @@ static int cppi41_dma_controller_start(struct cppi41_dma_controller *controller) | |||
628 | ret = of_property_read_string_index(np, "dma-names", i, &str); | 628 | ret = of_property_read_string_index(np, "dma-names", i, &str); |
629 | if (ret) | 629 | if (ret) |
630 | goto err; | 630 | goto err; |
631 | if (!strncmp(str, "tx", 2)) | 631 | if (strstarts(str, "tx")) |
632 | is_tx = 1; | 632 | is_tx = 1; |
633 | else if (!strncmp(str, "rx", 2)) | 633 | else if (strstarts(str, "rx")) |
634 | is_tx = 0; | 634 | is_tx = 0; |
635 | else { | 635 | else { |
636 | dev_err(dev, "Wrong dmatype %s\n", str); | 636 | dev_err(dev, "Wrong dmatype %s\n", str); |
diff --git a/drivers/usb/musb/musb_debugfs.c b/drivers/usb/musb/musb_debugfs.c index ad3701a97389..48131aa8472c 100644 --- a/drivers/usb/musb/musb_debugfs.c +++ b/drivers/usb/musb/musb_debugfs.c | |||
@@ -59,20 +59,12 @@ static const struct musb_register_map musb_regmap[] = { | |||
59 | { "RxMaxPp", MUSB_RXMAXP, 16 }, | 59 | { "RxMaxPp", MUSB_RXMAXP, 16 }, |
60 | { "RxCSR", MUSB_RXCSR, 16 }, | 60 | { "RxCSR", MUSB_RXCSR, 16 }, |
61 | { "RxCount", MUSB_RXCOUNT, 16 }, | 61 | { "RxCount", MUSB_RXCOUNT, 16 }, |
62 | { "ConfigData", MUSB_CONFIGDATA,8 }, | ||
63 | { "IntrRxE", MUSB_INTRRXE, 16 }, | 62 | { "IntrRxE", MUSB_INTRRXE, 16 }, |
64 | { "IntrTxE", MUSB_INTRTXE, 16 }, | 63 | { "IntrTxE", MUSB_INTRTXE, 16 }, |
65 | { "IntrUsbE", MUSB_INTRUSBE, 8 }, | 64 | { "IntrUsbE", MUSB_INTRUSBE, 8 }, |
66 | { "DevCtl", MUSB_DEVCTL, 8 }, | 65 | { "DevCtl", MUSB_DEVCTL, 8 }, |
67 | { "BabbleCtl", MUSB_BABBLE_CTL,8 }, | ||
68 | { "TxFIFOsz", MUSB_TXFIFOSZ, 8 }, | ||
69 | { "RxFIFOsz", MUSB_RXFIFOSZ, 8 }, | ||
70 | { "TxFIFOadd", MUSB_TXFIFOADD, 16 }, | ||
71 | { "RxFIFOadd", MUSB_RXFIFOADD, 16 }, | ||
72 | { "VControl", 0x68, 32 }, | 66 | { "VControl", 0x68, 32 }, |
73 | { "HWVers", 0x69, 16 }, | 67 | { "HWVers", 0x69, 16 }, |
74 | { "EPInfo", MUSB_EPINFO, 8 }, | ||
75 | { "RAMInfo", MUSB_RAMINFO, 8 }, | ||
76 | { "LinkInfo", MUSB_LINKINFO, 8 }, | 68 | { "LinkInfo", MUSB_LINKINFO, 8 }, |
77 | { "VPLen", MUSB_VPLEN, 8 }, | 69 | { "VPLen", MUSB_VPLEN, 8 }, |
78 | { "HS_EOF1", MUSB_HS_EOF1, 8 }, | 70 | { "HS_EOF1", MUSB_HS_EOF1, 8 }, |
@@ -103,6 +95,16 @@ static const struct musb_register_map musb_regmap[] = { | |||
103 | { "DMA_CNTLch7", 0x274, 16 }, | 95 | { "DMA_CNTLch7", 0x274, 16 }, |
104 | { "DMA_ADDRch7", 0x278, 32 }, | 96 | { "DMA_ADDRch7", 0x278, 32 }, |
105 | { "DMA_COUNTch7", 0x27C, 32 }, | 97 | { "DMA_COUNTch7", 0x27C, 32 }, |
98 | #ifndef CONFIG_BLACKFIN | ||
99 | { "ConfigData", MUSB_CONFIGDATA,8 }, | ||
100 | { "BabbleCtl", MUSB_BABBLE_CTL,8 }, | ||
101 | { "TxFIFOsz", MUSB_TXFIFOSZ, 8 }, | ||
102 | { "RxFIFOsz", MUSB_RXFIFOSZ, 8 }, | ||
103 | { "TxFIFOadd", MUSB_TXFIFOADD, 16 }, | ||
104 | { "RxFIFOadd", MUSB_RXFIFOADD, 16 }, | ||
105 | { "EPInfo", MUSB_EPINFO, 8 }, | ||
106 | { "RAMInfo", MUSB_RAMINFO, 8 }, | ||
107 | #endif | ||
106 | { } /* Terminating Entry */ | 108 | { } /* Terminating Entry */ |
107 | }; | 109 | }; |
108 | 110 | ||
@@ -197,30 +199,30 @@ static ssize_t musb_test_mode_write(struct file *file, | |||
197 | if (copy_from_user(&buf, ubuf, min_t(size_t, sizeof(buf) - 1, count))) | 199 | if (copy_from_user(&buf, ubuf, min_t(size_t, sizeof(buf) - 1, count))) |
198 | return -EFAULT; | 200 | return -EFAULT; |
199 | 201 | ||
200 | if (!strncmp(buf, "force host", 9)) | 202 | if (strstarts(buf, "force host")) |
201 | test = MUSB_TEST_FORCE_HOST; | 203 | test = MUSB_TEST_FORCE_HOST; |
202 | 204 | ||
203 | if (!strncmp(buf, "fifo access", 11)) | 205 | if (strstarts(buf, "fifo access")) |
204 | test = MUSB_TEST_FIFO_ACCESS; | 206 | test = MUSB_TEST_FIFO_ACCESS; |
205 | 207 | ||
206 | if (!strncmp(buf, "force full-speed", 15)) | 208 | if (strstarts(buf, "force full-speed")) |
207 | test = MUSB_TEST_FORCE_FS; | 209 | test = MUSB_TEST_FORCE_FS; |
208 | 210 | ||
209 | if (!strncmp(buf, "force high-speed", 15)) | 211 | if (strstarts(buf, "force high-speed")) |
210 | test = MUSB_TEST_FORCE_HS; | 212 | test = MUSB_TEST_FORCE_HS; |
211 | 213 | ||
212 | if (!strncmp(buf, "test packet", 10)) { | 214 | if (strstarts(buf, "test packet")) { |
213 | test = MUSB_TEST_PACKET; | 215 | test = MUSB_TEST_PACKET; |
214 | musb_load_testpacket(musb); | 216 | musb_load_testpacket(musb); |
215 | } | 217 | } |
216 | 218 | ||
217 | if (!strncmp(buf, "test K", 6)) | 219 | if (strstarts(buf, "test K")) |
218 | test = MUSB_TEST_K; | 220 | test = MUSB_TEST_K; |
219 | 221 | ||
220 | if (!strncmp(buf, "test J", 6)) | 222 | if (strstarts(buf, "test J")) |
221 | test = MUSB_TEST_J; | 223 | test = MUSB_TEST_J; |
222 | 224 | ||
223 | if (!strncmp(buf, "test SE0 NAK", 12)) | 225 | if (strstarts(buf, "test SE0 NAK")) |
224 | test = MUSB_TEST_SE0_NAK; | 226 | test = MUSB_TEST_SE0_NAK; |
225 | 227 | ||
226 | musb_writeb(musb->mregs, MUSB_TESTMODE, test); | 228 | musb_writeb(musb->mregs, MUSB_TESTMODE, test); |
diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c index 23d474d3d7f4..883a9adfdfff 100644 --- a/drivers/usb/musb/musb_host.c +++ b/drivers/usb/musb/musb_host.c | |||
@@ -2663,7 +2663,6 @@ void musb_host_cleanup(struct musb *musb) | |||
2663 | if (musb->port_mode == MUSB_PORT_MODE_GADGET) | 2663 | if (musb->port_mode == MUSB_PORT_MODE_GADGET) |
2664 | return; | 2664 | return; |
2665 | usb_remove_hcd(musb->hcd); | 2665 | usb_remove_hcd(musb->hcd); |
2666 | musb->hcd = NULL; | ||
2667 | } | 2666 | } |
2668 | 2667 | ||
2669 | void musb_host_free(struct musb *musb) | 2668 | void musb_host_free(struct musb *musb) |
diff --git a/drivers/usb/phy/phy-mv-usb.c b/drivers/usb/phy/phy-mv-usb.c index 699e38c73d82..697a741a0cb1 100644 --- a/drivers/usb/phy/phy-mv-usb.c +++ b/drivers/usb/phy/phy-mv-usb.c | |||
@@ -338,7 +338,6 @@ static void mv_otg_update_inputs(struct mv_otg *mvotg) | |||
338 | static void mv_otg_update_state(struct mv_otg *mvotg) | 338 | static void mv_otg_update_state(struct mv_otg *mvotg) |
339 | { | 339 | { |
340 | struct mv_otg_ctrl *otg_ctrl = &mvotg->otg_ctrl; | 340 | struct mv_otg_ctrl *otg_ctrl = &mvotg->otg_ctrl; |
341 | struct usb_phy *phy = &mvotg->phy; | ||
342 | int old_state = mvotg->phy.otg->state; | 341 | int old_state = mvotg->phy.otg->state; |
343 | 342 | ||
344 | switch (old_state) { | 343 | switch (old_state) { |
@@ -858,10 +857,10 @@ static int mv_otg_suspend(struct platform_device *pdev, pm_message_t state) | |||
858 | { | 857 | { |
859 | struct mv_otg *mvotg = platform_get_drvdata(pdev); | 858 | struct mv_otg *mvotg = platform_get_drvdata(pdev); |
860 | 859 | ||
861 | if (mvotg->phy.state != OTG_STATE_B_IDLE) { | 860 | if (mvotg->phy.otg->state != OTG_STATE_B_IDLE) { |
862 | dev_info(&pdev->dev, | 861 | dev_info(&pdev->dev, |
863 | "OTG state is not B_IDLE, it is %d!\n", | 862 | "OTG state is not B_IDLE, it is %d!\n", |
864 | mvotg->phy.state); | 863 | mvotg->phy.otg->state); |
865 | return -EAGAIN; | 864 | return -EAGAIN; |
866 | } | 865 | } |
867 | 866 | ||
diff --git a/drivers/usb/phy/phy.c b/drivers/usb/phy/phy.c index b4066a001ba0..ccfdfb24b240 100644 --- a/drivers/usb/phy/phy.c +++ b/drivers/usb/phy/phy.c | |||
@@ -34,7 +34,7 @@ static struct usb_phy *__usb_find_phy(struct list_head *list, | |||
34 | return phy; | 34 | return phy; |
35 | } | 35 | } |
36 | 36 | ||
37 | return ERR_PTR(-ENODEV); | 37 | return ERR_PTR(-EPROBE_DEFER); |
38 | } | 38 | } |
39 | 39 | ||
40 | static struct usb_phy *__usb_find_phy_dev(struct device *dev, | 40 | static struct usb_phy *__usb_find_phy_dev(struct device *dev, |
@@ -59,6 +59,9 @@ static struct usb_phy *__of_usb_find_phy(struct device_node *node) | |||
59 | { | 59 | { |
60 | struct usb_phy *phy; | 60 | struct usb_phy *phy; |
61 | 61 | ||
62 | if (!of_device_is_available(node)) | ||
63 | return ERR_PTR(-ENODEV); | ||
64 | |||
62 | list_for_each_entry(phy, &phy_list, head) { | 65 | list_for_each_entry(phy, &phy_list, head) { |
63 | if (node != phy->dev->of_node) | 66 | if (node != phy->dev->of_node) |
64 | continue; | 67 | continue; |
@@ -66,7 +69,7 @@ static struct usb_phy *__of_usb_find_phy(struct device_node *node) | |||
66 | return phy; | 69 | return phy; |
67 | } | 70 | } |
68 | 71 | ||
69 | return ERR_PTR(-ENODEV); | 72 | return ERR_PTR(-EPROBE_DEFER); |
70 | } | 73 | } |
71 | 74 | ||
72 | static void devm_usb_phy_release(struct device *dev, void *res) | 75 | static void devm_usb_phy_release(struct device *dev, void *res) |
@@ -190,10 +193,13 @@ struct usb_phy *devm_usb_get_phy_by_phandle(struct device *dev, | |||
190 | spin_lock_irqsave(&phy_lock, flags); | 193 | spin_lock_irqsave(&phy_lock, flags); |
191 | 194 | ||
192 | phy = __of_usb_find_phy(node); | 195 | phy = __of_usb_find_phy(node); |
193 | if (IS_ERR(phy) || !try_module_get(phy->dev->driver->owner)) { | 196 | if (IS_ERR(phy)) { |
194 | if (!IS_ERR(phy)) | 197 | devres_free(ptr); |
195 | phy = ERR_PTR(-EPROBE_DEFER); | 198 | goto err1; |
199 | } | ||
196 | 200 | ||
201 | if (!try_module_get(phy->dev->driver->owner)) { | ||
202 | phy = ERR_PTR(-ENODEV); | ||
197 | devres_free(ptr); | 203 | devres_free(ptr); |
198 | goto err1; | 204 | goto err1; |
199 | } | 205 | } |
diff --git a/drivers/usb/serial/console.c b/drivers/usb/serial/console.c index 8d7fc48b1f30..29fa1c3d0089 100644 --- a/drivers/usb/serial/console.c +++ b/drivers/usb/serial/console.c | |||
@@ -46,6 +46,8 @@ static struct console usbcons; | |||
46 | * ------------------------------------------------------------ | 46 | * ------------------------------------------------------------ |
47 | */ | 47 | */ |
48 | 48 | ||
49 | static const struct tty_operations usb_console_fake_tty_ops = { | ||
50 | }; | ||
49 | 51 | ||
50 | /* | 52 | /* |
51 | * The parsing of the command line works exactly like the | 53 | * The parsing of the command line works exactly like the |
@@ -137,13 +139,17 @@ static int usb_console_setup(struct console *co, char *options) | |||
137 | goto reset_open_count; | 139 | goto reset_open_count; |
138 | } | 140 | } |
139 | kref_init(&tty->kref); | 141 | kref_init(&tty->kref); |
140 | tty_port_tty_set(&port->port, tty); | ||
141 | tty->driver = usb_serial_tty_driver; | 142 | tty->driver = usb_serial_tty_driver; |
142 | tty->index = co->index; | 143 | tty->index = co->index; |
144 | init_ldsem(&tty->ldisc_sem); | ||
145 | INIT_LIST_HEAD(&tty->tty_files); | ||
146 | kref_get(&tty->driver->kref); | ||
147 | tty->ops = &usb_console_fake_tty_ops; | ||
143 | if (tty_init_termios(tty)) { | 148 | if (tty_init_termios(tty)) { |
144 | retval = -ENOMEM; | 149 | retval = -ENOMEM; |
145 | goto free_tty; | 150 | goto put_tty; |
146 | } | 151 | } |
152 | tty_port_tty_set(&port->port, tty); | ||
147 | } | 153 | } |
148 | 154 | ||
149 | /* only call the device specific open if this | 155 | /* only call the device specific open if this |
@@ -161,7 +167,7 @@ static int usb_console_setup(struct console *co, char *options) | |||
161 | serial->type->set_termios(tty, port, &dummy); | 167 | serial->type->set_termios(tty, port, &dummy); |
162 | 168 | ||
163 | tty_port_tty_set(&port->port, NULL); | 169 | tty_port_tty_set(&port->port, NULL); |
164 | kfree(tty); | 170 | tty_kref_put(tty); |
165 | } | 171 | } |
166 | set_bit(ASYNCB_INITIALIZED, &port->port.flags); | 172 | set_bit(ASYNCB_INITIALIZED, &port->port.flags); |
167 | } | 173 | } |
@@ -177,8 +183,8 @@ static int usb_console_setup(struct console *co, char *options) | |||
177 | 183 | ||
178 | fail: | 184 | fail: |
179 | tty_port_tty_set(&port->port, NULL); | 185 | tty_port_tty_set(&port->port, NULL); |
180 | free_tty: | 186 | put_tty: |
181 | kfree(tty); | 187 | tty_kref_put(tty); |
182 | reset_open_count: | 188 | reset_open_count: |
183 | port->port.count = 0; | 189 | port->port.count = 0; |
184 | usb_autopm_put_interface(serial->interface); | 190 | usb_autopm_put_interface(serial->interface); |
diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c index 6c4eb3cf5efd..f4c56fc1a9f6 100644 --- a/drivers/usb/serial/cp210x.c +++ b/drivers/usb/serial/cp210x.c | |||
@@ -120,10 +120,12 @@ static const struct usb_device_id id_table[] = { | |||
120 | { USB_DEVICE(0x10C4, 0x85F8) }, /* Virtenio Preon32 */ | 120 | { USB_DEVICE(0x10C4, 0x85F8) }, /* Virtenio Preon32 */ |
121 | { USB_DEVICE(0x10C4, 0x8664) }, /* AC-Services CAN-IF */ | 121 | { USB_DEVICE(0x10C4, 0x8664) }, /* AC-Services CAN-IF */ |
122 | { USB_DEVICE(0x10C4, 0x8665) }, /* AC-Services OBD-IF */ | 122 | { USB_DEVICE(0x10C4, 0x8665) }, /* AC-Services OBD-IF */ |
123 | { USB_DEVICE(0x10C4, 0x8875) }, /* CEL MeshConnect USB Stick */ | 123 | { USB_DEVICE(0x10C4, 0x8856) }, /* CEL EM357 ZigBee USB Stick - LR */ |
124 | { USB_DEVICE(0x10C4, 0x8857) }, /* CEL EM357 ZigBee USB Stick */ | ||
124 | { USB_DEVICE(0x10C4, 0x88A4) }, /* MMB Networks ZigBee USB Device */ | 125 | { USB_DEVICE(0x10C4, 0x88A4) }, /* MMB Networks ZigBee USB Device */ |
125 | { USB_DEVICE(0x10C4, 0x88A5) }, /* Planet Innovation Ingeni ZigBee USB Device */ | 126 | { USB_DEVICE(0x10C4, 0x88A5) }, /* Planet Innovation Ingeni ZigBee USB Device */ |
126 | { USB_DEVICE(0x10C4, 0x8946) }, /* Ketra N1 Wireless Interface */ | 127 | { USB_DEVICE(0x10C4, 0x8946) }, /* Ketra N1 Wireless Interface */ |
128 | { USB_DEVICE(0x10C4, 0x8977) }, /* CEL MeshWorks DevKit Device */ | ||
127 | { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */ | 129 | { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */ |
128 | { USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */ | 130 | { USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */ |
129 | { USB_DEVICE(0x10C4, 0xEA70) }, /* Silicon Labs factory default */ | 131 | { USB_DEVICE(0x10C4, 0xEA70) }, /* Silicon Labs factory default */ |
diff --git a/drivers/usb/serial/generic.c b/drivers/usb/serial/generic.c index 1bd192290b08..ccf1df7c4b80 100644 --- a/drivers/usb/serial/generic.c +++ b/drivers/usb/serial/generic.c | |||
@@ -286,7 +286,7 @@ static int usb_serial_generic_submit_read_urb(struct usb_serial_port *port, | |||
286 | 286 | ||
287 | res = usb_submit_urb(port->read_urbs[index], mem_flags); | 287 | res = usb_submit_urb(port->read_urbs[index], mem_flags); |
288 | if (res) { | 288 | if (res) { |
289 | if (res != -EPERM) { | 289 | if (res != -EPERM && res != -ENODEV) { |
290 | dev_err(&port->dev, | 290 | dev_err(&port->dev, |
291 | "%s - usb_submit_urb failed: %d\n", | 291 | "%s - usb_submit_urb failed: %d\n", |
292 | __func__, res); | 292 | __func__, res); |
@@ -373,7 +373,7 @@ void usb_serial_generic_read_bulk_callback(struct urb *urb) | |||
373 | __func__, urb->status); | 373 | __func__, urb->status); |
374 | return; | 374 | return; |
375 | default: | 375 | default: |
376 | dev_err(&port->dev, "%s - nonzero urb status: %d\n", | 376 | dev_dbg(&port->dev, "%s - nonzero urb status: %d\n", |
377 | __func__, urb->status); | 377 | __func__, urb->status); |
378 | goto resubmit; | 378 | goto resubmit; |
379 | } | 379 | } |
diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c index 077c714f1285..e07b15ed5814 100644 --- a/drivers/usb/serial/keyspan.c +++ b/drivers/usb/serial/keyspan.c | |||
@@ -410,6 +410,8 @@ static void usa26_instat_callback(struct urb *urb) | |||
410 | } | 410 | } |
411 | port = serial->port[msg->port]; | 411 | port = serial->port[msg->port]; |
412 | p_priv = usb_get_serial_port_data(port); | 412 | p_priv = usb_get_serial_port_data(port); |
413 | if (!p_priv) | ||
414 | goto resubmit; | ||
413 | 415 | ||
414 | /* Update handshaking pin state information */ | 416 | /* Update handshaking pin state information */ |
415 | old_dcd_state = p_priv->dcd_state; | 417 | old_dcd_state = p_priv->dcd_state; |
@@ -420,7 +422,7 @@ static void usa26_instat_callback(struct urb *urb) | |||
420 | 422 | ||
421 | if (old_dcd_state != p_priv->dcd_state) | 423 | if (old_dcd_state != p_priv->dcd_state) |
422 | tty_port_tty_hangup(&port->port, true); | 424 | tty_port_tty_hangup(&port->port, true); |
423 | 425 | resubmit: | |
424 | /* Resubmit urb so we continue receiving */ | 426 | /* Resubmit urb so we continue receiving */ |
425 | err = usb_submit_urb(urb, GFP_ATOMIC); | 427 | err = usb_submit_urb(urb, GFP_ATOMIC); |
426 | if (err != 0) | 428 | if (err != 0) |
@@ -527,6 +529,8 @@ static void usa28_instat_callback(struct urb *urb) | |||
527 | } | 529 | } |
528 | port = serial->port[msg->port]; | 530 | port = serial->port[msg->port]; |
529 | p_priv = usb_get_serial_port_data(port); | 531 | p_priv = usb_get_serial_port_data(port); |
532 | if (!p_priv) | ||
533 | goto resubmit; | ||
530 | 534 | ||
531 | /* Update handshaking pin state information */ | 535 | /* Update handshaking pin state information */ |
532 | old_dcd_state = p_priv->dcd_state; | 536 | old_dcd_state = p_priv->dcd_state; |
@@ -537,7 +541,7 @@ static void usa28_instat_callback(struct urb *urb) | |||
537 | 541 | ||
538 | if (old_dcd_state != p_priv->dcd_state && old_dcd_state) | 542 | if (old_dcd_state != p_priv->dcd_state && old_dcd_state) |
539 | tty_port_tty_hangup(&port->port, true); | 543 | tty_port_tty_hangup(&port->port, true); |
540 | 544 | resubmit: | |
541 | /* Resubmit urb so we continue receiving */ | 545 | /* Resubmit urb so we continue receiving */ |
542 | err = usb_submit_urb(urb, GFP_ATOMIC); | 546 | err = usb_submit_urb(urb, GFP_ATOMIC); |
543 | if (err != 0) | 547 | if (err != 0) |
@@ -607,6 +611,8 @@ static void usa49_instat_callback(struct urb *urb) | |||
607 | } | 611 | } |
608 | port = serial->port[msg->portNumber]; | 612 | port = serial->port[msg->portNumber]; |
609 | p_priv = usb_get_serial_port_data(port); | 613 | p_priv = usb_get_serial_port_data(port); |
614 | if (!p_priv) | ||
615 | goto resubmit; | ||
610 | 616 | ||
611 | /* Update handshaking pin state information */ | 617 | /* Update handshaking pin state information */ |
612 | old_dcd_state = p_priv->dcd_state; | 618 | old_dcd_state = p_priv->dcd_state; |
@@ -617,7 +623,7 @@ static void usa49_instat_callback(struct urb *urb) | |||
617 | 623 | ||
618 | if (old_dcd_state != p_priv->dcd_state && old_dcd_state) | 624 | if (old_dcd_state != p_priv->dcd_state && old_dcd_state) |
619 | tty_port_tty_hangup(&port->port, true); | 625 | tty_port_tty_hangup(&port->port, true); |
620 | 626 | resubmit: | |
621 | /* Resubmit urb so we continue receiving */ | 627 | /* Resubmit urb so we continue receiving */ |
622 | err = usb_submit_urb(urb, GFP_ATOMIC); | 628 | err = usb_submit_urb(urb, GFP_ATOMIC); |
623 | if (err != 0) | 629 | if (err != 0) |
@@ -855,6 +861,8 @@ static void usa90_instat_callback(struct urb *urb) | |||
855 | 861 | ||
856 | port = serial->port[0]; | 862 | port = serial->port[0]; |
857 | p_priv = usb_get_serial_port_data(port); | 863 | p_priv = usb_get_serial_port_data(port); |
864 | if (!p_priv) | ||
865 | goto resubmit; | ||
858 | 866 | ||
859 | /* Update handshaking pin state information */ | 867 | /* Update handshaking pin state information */ |
860 | old_dcd_state = p_priv->dcd_state; | 868 | old_dcd_state = p_priv->dcd_state; |
@@ -865,7 +873,7 @@ static void usa90_instat_callback(struct urb *urb) | |||
865 | 873 | ||
866 | if (old_dcd_state != p_priv->dcd_state && old_dcd_state) | 874 | if (old_dcd_state != p_priv->dcd_state && old_dcd_state) |
867 | tty_port_tty_hangup(&port->port, true); | 875 | tty_port_tty_hangup(&port->port, true); |
868 | 876 | resubmit: | |
869 | /* Resubmit urb so we continue receiving */ | 877 | /* Resubmit urb so we continue receiving */ |
870 | err = usb_submit_urb(urb, GFP_ATOMIC); | 878 | err = usb_submit_urb(urb, GFP_ATOMIC); |
871 | if (err != 0) | 879 | if (err != 0) |
@@ -926,6 +934,8 @@ static void usa67_instat_callback(struct urb *urb) | |||
926 | 934 | ||
927 | port = serial->port[msg->port]; | 935 | port = serial->port[msg->port]; |
928 | p_priv = usb_get_serial_port_data(port); | 936 | p_priv = usb_get_serial_port_data(port); |
937 | if (!p_priv) | ||
938 | goto resubmit; | ||
929 | 939 | ||
930 | /* Update handshaking pin state information */ | 940 | /* Update handshaking pin state information */ |
931 | old_dcd_state = p_priv->dcd_state; | 941 | old_dcd_state = p_priv->dcd_state; |
@@ -934,7 +944,7 @@ static void usa67_instat_callback(struct urb *urb) | |||
934 | 944 | ||
935 | if (old_dcd_state != p_priv->dcd_state && old_dcd_state) | 945 | if (old_dcd_state != p_priv->dcd_state && old_dcd_state) |
936 | tty_port_tty_hangup(&port->port, true); | 946 | tty_port_tty_hangup(&port->port, true); |
937 | 947 | resubmit: | |
938 | /* Resubmit urb so we continue receiving */ | 948 | /* Resubmit urb so we continue receiving */ |
939 | err = usb_submit_urb(urb, GFP_ATOMIC); | 949 | err = usb_submit_urb(urb, GFP_ATOMIC); |
940 | if (err != 0) | 950 | if (err != 0) |
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 7a4c21b4f676..efdcee15b520 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
@@ -234,6 +234,8 @@ static void option_instat_callback(struct urb *urb); | |||
234 | 234 | ||
235 | #define QUALCOMM_VENDOR_ID 0x05C6 | 235 | #define QUALCOMM_VENDOR_ID 0x05C6 |
236 | 236 | ||
237 | #define SIERRA_VENDOR_ID 0x1199 | ||
238 | |||
237 | #define CMOTECH_VENDOR_ID 0x16d8 | 239 | #define CMOTECH_VENDOR_ID 0x16d8 |
238 | #define CMOTECH_PRODUCT_6001 0x6001 | 240 | #define CMOTECH_PRODUCT_6001 0x6001 |
239 | #define CMOTECH_PRODUCT_CMU_300 0x6002 | 241 | #define CMOTECH_PRODUCT_CMU_300 0x6002 |
@@ -512,7 +514,7 @@ enum option_blacklist_reason { | |||
512 | OPTION_BLACKLIST_RESERVED_IF = 2 | 514 | OPTION_BLACKLIST_RESERVED_IF = 2 |
513 | }; | 515 | }; |
514 | 516 | ||
515 | #define MAX_BL_NUM 8 | 517 | #define MAX_BL_NUM 11 |
516 | struct option_blacklist_info { | 518 | struct option_blacklist_info { |
517 | /* bitfield of interface numbers for OPTION_BLACKLIST_SENDSETUP */ | 519 | /* bitfield of interface numbers for OPTION_BLACKLIST_SENDSETUP */ |
518 | const unsigned long sendsetup; | 520 | const unsigned long sendsetup; |
@@ -601,6 +603,11 @@ static const struct option_blacklist_info telit_le920_blacklist = { | |||
601 | .reserved = BIT(1) | BIT(5), | 603 | .reserved = BIT(1) | BIT(5), |
602 | }; | 604 | }; |
603 | 605 | ||
606 | static const struct option_blacklist_info sierra_mc73xx_blacklist = { | ||
607 | .sendsetup = BIT(0) | BIT(2), | ||
608 | .reserved = BIT(8) | BIT(10) | BIT(11), | ||
609 | }; | ||
610 | |||
604 | static const struct usb_device_id option_ids[] = { | 611 | static const struct usb_device_id option_ids[] = { |
605 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) }, | 612 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) }, |
606 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) }, | 613 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) }, |
@@ -1098,6 +1105,8 @@ static const struct usb_device_id option_ids[] = { | |||
1098 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ | 1105 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ |
1099 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x0023)}, /* ONYX 3G device */ | 1106 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x0023)}, /* ONYX 3G device */ |
1100 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000)}, /* SIMCom SIM5218 */ | 1107 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000)}, /* SIMCom SIM5218 */ |
1108 | { USB_DEVICE_INTERFACE_CLASS(SIERRA_VENDOR_ID, 0x68c0, 0xff), | ||
1109 | .driver_info = (kernel_ulong_t)&sierra_mc73xx_blacklist }, /* MC73xx */ | ||
1101 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) }, | 1110 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) }, |
1102 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CMU_300) }, | 1111 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CMU_300) }, |
1103 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6003), | 1112 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6003), |
diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c index cb3e14780a7e..9c63897b3a56 100644 --- a/drivers/usb/serial/qcserial.c +++ b/drivers/usb/serial/qcserial.c | |||
@@ -142,7 +142,6 @@ static const struct usb_device_id id_table[] = { | |||
142 | {DEVICE_SWI(0x0f3d, 0x68a2)}, /* Sierra Wireless MC7700 */ | 142 | {DEVICE_SWI(0x0f3d, 0x68a2)}, /* Sierra Wireless MC7700 */ |
143 | {DEVICE_SWI(0x114f, 0x68a2)}, /* Sierra Wireless MC7750 */ | 143 | {DEVICE_SWI(0x114f, 0x68a2)}, /* Sierra Wireless MC7750 */ |
144 | {DEVICE_SWI(0x1199, 0x68a2)}, /* Sierra Wireless MC7710 */ | 144 | {DEVICE_SWI(0x1199, 0x68a2)}, /* Sierra Wireless MC7710 */ |
145 | {DEVICE_SWI(0x1199, 0x68c0)}, /* Sierra Wireless MC73xx */ | ||
146 | {DEVICE_SWI(0x1199, 0x901c)}, /* Sierra Wireless EM7700 */ | 145 | {DEVICE_SWI(0x1199, 0x901c)}, /* Sierra Wireless EM7700 */ |
147 | {DEVICE_SWI(0x1199, 0x901f)}, /* Sierra Wireless EM7355 */ | 146 | {DEVICE_SWI(0x1199, 0x901f)}, /* Sierra Wireless EM7355 */ |
148 | {DEVICE_SWI(0x1199, 0x9040)}, /* Sierra Wireless Modem */ | 147 | {DEVICE_SWI(0x1199, 0x9040)}, /* Sierra Wireless Modem */ |
diff --git a/drivers/usb/storage/uas-detect.h b/drivers/usb/storage/uas-detect.h index 8a6f371ed6e7..9893d696fc97 100644 --- a/drivers/usb/storage/uas-detect.h +++ b/drivers/usb/storage/uas-detect.h | |||
@@ -69,16 +69,39 @@ static int uas_use_uas_driver(struct usb_interface *intf, | |||
69 | return 0; | 69 | return 0; |
70 | 70 | ||
71 | /* | 71 | /* |
72 | * ASM1051 and older ASM1053 devices have the same usb-id, and UAS is | 72 | * ASMedia has a number of usb3 to sata bridge chips, at the time of |
73 | * broken on the ASM1051, use the number of streams to differentiate. | 73 | * this writing the following versions exist: |
74 | * New ASM1053-s also support 32 streams, but have a different prod-id. | 74 | * ASM1051 - no uas support version |
75 | * ASM1051 - with broken (*) uas support | ||
76 | * ASM1053 - with working uas support | ||
77 | * ASM1153 - with working uas support | ||
78 | * | ||
79 | * Devices with these chips re-use a number of device-ids over the | ||
80 | * entire line, so the device-id is useless to determine if we're | ||
81 | * dealing with an ASM1051 (which we want to avoid). | ||
82 | * | ||
83 | * The ASM1153 can be identified by config.MaxPower == 0, | ||
84 | * where as the ASM105x models have config.MaxPower == 36. | ||
85 | * | ||
86 | * Differentiating between the ASM1053 and ASM1051 is trickier, when | ||
87 | * connected over USB-3 we can look at the number of streams supported, | ||
88 | * ASM1051 supports 32 streams, where as early ASM1053 versions support | ||
89 | * 16 streams, newer ASM1053-s also support 32 streams, but have a | ||
90 | * different prod-id. | ||
91 | * | ||
92 | * (*) ASM1051 chips do work with UAS with some disks (with the | ||
93 | * US_FL_NO_REPORT_OPCODES quirk), but are broken with other disks | ||
75 | */ | 94 | */ |
76 | if (le16_to_cpu(udev->descriptor.idVendor) == 0x174c && | 95 | if (le16_to_cpu(udev->descriptor.idVendor) == 0x174c && |
77 | le16_to_cpu(udev->descriptor.idProduct) == 0x55aa) { | 96 | (le16_to_cpu(udev->descriptor.idProduct) == 0x5106 || |
78 | if (udev->speed < USB_SPEED_SUPER) { | 97 | le16_to_cpu(udev->descriptor.idProduct) == 0x55aa)) { |
98 | if (udev->actconfig->desc.bMaxPower == 0) { | ||
99 | /* ASM1153, do nothing */ | ||
100 | } else if (udev->speed < USB_SPEED_SUPER) { | ||
79 | /* No streams info, assume ASM1051 */ | 101 | /* No streams info, assume ASM1051 */ |
80 | flags |= US_FL_IGNORE_UAS; | 102 | flags |= US_FL_IGNORE_UAS; |
81 | } else if (usb_ss_max_streams(&eps[1]->ss_ep_comp) == 32) { | 103 | } else if (usb_ss_max_streams(&eps[1]->ss_ep_comp) == 32) { |
104 | /* Possibly an ASM1051, disable uas */ | ||
82 | flags |= US_FL_IGNORE_UAS; | 105 | flags |= US_FL_IGNORE_UAS; |
83 | } | 106 | } |
84 | } | 107 | } |
diff --git a/drivers/usb/storage/unusual_uas.h b/drivers/usb/storage/unusual_uas.h index 18a283d6de1c..6df4357d9ee3 100644 --- a/drivers/usb/storage/unusual_uas.h +++ b/drivers/usb/storage/unusual_uas.h | |||
@@ -40,6 +40,16 @@ | |||
40 | * and don't forget to CC: the USB development list <linux-usb@vger.kernel.org> | 40 | * and don't forget to CC: the USB development list <linux-usb@vger.kernel.org> |
41 | */ | 41 | */ |
42 | 42 | ||
43 | /* | ||
44 | * Apricorn USB3 dongle sometimes returns "USBSUSBSUSBS" in response to SCSI | ||
45 | * commands in UAS mode. Observed with the 1.28 firmware; are there others? | ||
46 | */ | ||
47 | UNUSUAL_DEV(0x0984, 0x0301, 0x0128, 0x0128, | ||
48 | "Apricorn", | ||
49 | "", | ||
50 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
51 | US_FL_IGNORE_UAS), | ||
52 | |||
43 | /* https://bugzilla.kernel.org/show_bug.cgi?id=79511 */ | 53 | /* https://bugzilla.kernel.org/show_bug.cgi?id=79511 */ |
44 | UNUSUAL_DEV(0x0bc2, 0x2312, 0x0000, 0x9999, | 54 | UNUSUAL_DEV(0x0bc2, 0x2312, 0x0000, 0x9999, |
45 | "Seagate", | 55 | "Seagate", |
@@ -68,6 +78,20 @@ UNUSUAL_DEV(0x0bc2, 0xa003, 0x0000, 0x9999, | |||
68 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | 78 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
69 | US_FL_NO_ATA_1X), | 79 | US_FL_NO_ATA_1X), |
70 | 80 | ||
81 | /* Reported-by: Marcin ZajÄ…czkowski <mszpak@wp.pl> */ | ||
82 | UNUSUAL_DEV(0x0bc2, 0xa013, 0x0000, 0x9999, | ||
83 | "Seagate", | ||
84 | "Backup Plus", | ||
85 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
86 | US_FL_NO_ATA_1X), | ||
87 | |||
88 | /* Reported-by: Hans de Goede <hdegoede@redhat.com> */ | ||
89 | UNUSUAL_DEV(0x0bc2, 0xa0a4, 0x0000, 0x9999, | ||
90 | "Seagate", | ||
91 | "Backup Plus Desk", | ||
92 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
93 | US_FL_NO_ATA_1X), | ||
94 | |||
71 | /* https://bbs.archlinux.org/viewtopic.php?id=183190 */ | 95 | /* https://bbs.archlinux.org/viewtopic.php?id=183190 */ |
72 | UNUSUAL_DEV(0x0bc2, 0xab20, 0x0000, 0x9999, | 96 | UNUSUAL_DEV(0x0bc2, 0xab20, 0x0000, 0x9999, |
73 | "Seagate", | 97 | "Seagate", |
@@ -82,6 +106,13 @@ UNUSUAL_DEV(0x0bc2, 0xab21, 0x0000, 0x9999, | |||
82 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | 106 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
83 | US_FL_NO_ATA_1X), | 107 | US_FL_NO_ATA_1X), |
84 | 108 | ||
109 | /* Reported-by: G. Richard Bellamy <rbellamy@pteradigm.com> */ | ||
110 | UNUSUAL_DEV(0x0bc2, 0xab2a, 0x0000, 0x9999, | ||
111 | "Seagate", | ||
112 | "BUP Fast HDD", | ||
113 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
114 | US_FL_NO_ATA_1X), | ||
115 | |||
85 | /* Reported-by: Claudio Bizzarri <claudio.bizzarri@gmail.com> */ | 116 | /* Reported-by: Claudio Bizzarri <claudio.bizzarri@gmail.com> */ |
86 | UNUSUAL_DEV(0x152d, 0x0567, 0x0000, 0x9999, | 117 | UNUSUAL_DEV(0x152d, 0x0567, 0x0000, 0x9999, |
87 | "JMicron", | 118 | "JMicron", |
@@ -89,14 +120,6 @@ UNUSUAL_DEV(0x152d, 0x0567, 0x0000, 0x9999, | |||
89 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | 120 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
90 | US_FL_NO_REPORT_OPCODES), | 121 | US_FL_NO_REPORT_OPCODES), |
91 | 122 | ||
92 | /* Most ASM1051 based devices have issues with uas, blacklist them all */ | ||
93 | /* Reported-by: Hans de Goede <hdegoede@redhat.com> */ | ||
94 | UNUSUAL_DEV(0x174c, 0x5106, 0x0000, 0x9999, | ||
95 | "ASMedia", | ||
96 | "ASM1051", | ||
97 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
98 | US_FL_IGNORE_UAS), | ||
99 | |||
100 | /* Reported-by: Hans de Goede <hdegoede@redhat.com> */ | 123 | /* Reported-by: Hans de Goede <hdegoede@redhat.com> */ |
101 | UNUSUAL_DEV(0x2109, 0x0711, 0x0000, 0x9999, | 124 | UNUSUAL_DEV(0x2109, 0x0711, 0x0000, 0x9999, |
102 | "VIA", | 125 | "VIA", |
@@ -104,6 +127,13 @@ UNUSUAL_DEV(0x2109, 0x0711, 0x0000, 0x9999, | |||
104 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | 127 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
105 | US_FL_NO_ATA_1X), | 128 | US_FL_NO_ATA_1X), |
106 | 129 | ||
130 | /* Reported-by: Takeo Nakayama <javhera@gmx.com> */ | ||
131 | UNUSUAL_DEV(0x357d, 0x7788, 0x0000, 0x9999, | ||
132 | "JMicron", | ||
133 | "JMS566", | ||
134 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
135 | US_FL_NO_REPORT_OPCODES), | ||
136 | |||
107 | /* Reported-by: Hans de Goede <hdegoede@redhat.com> */ | 137 | /* Reported-by: Hans de Goede <hdegoede@redhat.com> */ |
108 | UNUSUAL_DEV(0x4971, 0x1012, 0x0000, 0x9999, | 138 | UNUSUAL_DEV(0x4971, 0x1012, 0x0000, 0x9999, |
109 | "Hitachi", | 139 | "Hitachi", |
diff --git a/drivers/video/fbdev/broadsheetfb.c b/drivers/video/fbdev/broadsheetfb.c index 1c29bd19e3d5..0e5fde1d3ffb 100644 --- a/drivers/video/fbdev/broadsheetfb.c +++ b/drivers/video/fbdev/broadsheetfb.c | |||
@@ -636,7 +636,7 @@ static int broadsheet_spiflash_rewrite_sector(struct broadsheetfb_par *par, | |||
636 | err = broadsheet_spiflash_read_range(par, start_sector_addr, | 636 | err = broadsheet_spiflash_read_range(par, start_sector_addr, |
637 | data_start_addr, sector_buffer); | 637 | data_start_addr, sector_buffer); |
638 | if (err) | 638 | if (err) |
639 | return err; | 639 | goto out; |
640 | } | 640 | } |
641 | 641 | ||
642 | /* now we copy our data into the right place in the sector buffer */ | 642 | /* now we copy our data into the right place in the sector buffer */ |
@@ -657,7 +657,7 @@ static int broadsheet_spiflash_rewrite_sector(struct broadsheetfb_par *par, | |||
657 | err = broadsheet_spiflash_read_range(par, tail_start_addr, | 657 | err = broadsheet_spiflash_read_range(par, tail_start_addr, |
658 | tail_len, sector_buffer + tail_start_addr); | 658 | tail_len, sector_buffer + tail_start_addr); |
659 | if (err) | 659 | if (err) |
660 | return err; | 660 | goto out; |
661 | } | 661 | } |
662 | 662 | ||
663 | /* if we got here we have the full sector that we want to rewrite. */ | 663 | /* if we got here we have the full sector that we want to rewrite. */ |
@@ -665,11 +665,13 @@ static int broadsheet_spiflash_rewrite_sector(struct broadsheetfb_par *par, | |||
665 | /* first erase the sector */ | 665 | /* first erase the sector */ |
666 | err = broadsheet_spiflash_erase_sector(par, start_sector_addr); | 666 | err = broadsheet_spiflash_erase_sector(par, start_sector_addr); |
667 | if (err) | 667 | if (err) |
668 | return err; | 668 | goto out; |
669 | 669 | ||
670 | /* now write it */ | 670 | /* now write it */ |
671 | err = broadsheet_spiflash_write_sector(par, start_sector_addr, | 671 | err = broadsheet_spiflash_write_sector(par, start_sector_addr, |
672 | sector_buffer, sector_size); | 672 | sector_buffer, sector_size); |
673 | out: | ||
674 | kfree(sector_buffer); | ||
673 | return err; | 675 | return err; |
674 | } | 676 | } |
675 | 677 | ||
diff --git a/drivers/video/fbdev/simplefb.c b/drivers/video/fbdev/simplefb.c index 92cac803dee3..1085c0432158 100644 --- a/drivers/video/fbdev/simplefb.c +++ b/drivers/video/fbdev/simplefb.c | |||
@@ -402,7 +402,7 @@ static int __init simplefb_init(void) | |||
402 | if (ret) | 402 | if (ret) |
403 | return ret; | 403 | return ret; |
404 | 404 | ||
405 | if (IS_ENABLED(CONFIG_OF) && of_chosen) { | 405 | if (IS_ENABLED(CONFIG_OF_ADDRESS) && of_chosen) { |
406 | for_each_child_of_node(of_chosen, np) { | 406 | for_each_child_of_node(of_chosen, np) { |
407 | if (of_device_is_compatible(np, "simple-framebuffer")) | 407 | if (of_device_is_compatible(np, "simple-framebuffer")) |
408 | of_platform_device_create(np, NULL, NULL); | 408 | of_platform_device_create(np, NULL, NULL); |
diff --git a/drivers/watchdog/cadence_wdt.c b/drivers/watchdog/cadence_wdt.c index 5927c0a98a74..bcfd2a22208f 100644 --- a/drivers/watchdog/cadence_wdt.c +++ b/drivers/watchdog/cadence_wdt.c | |||
@@ -503,7 +503,6 @@ static struct platform_driver cdns_wdt_driver = { | |||
503 | .shutdown = cdns_wdt_shutdown, | 503 | .shutdown = cdns_wdt_shutdown, |
504 | .driver = { | 504 | .driver = { |
505 | .name = "cdns-wdt", | 505 | .name = "cdns-wdt", |
506 | .owner = THIS_MODULE, | ||
507 | .of_match_table = cdns_wdt_of_match, | 506 | .of_match_table = cdns_wdt_of_match, |
508 | .pm = &cdns_wdt_pm_ops, | 507 | .pm = &cdns_wdt_pm_ops, |
509 | }, | 508 | }, |
diff --git a/drivers/watchdog/imx2_wdt.c b/drivers/watchdog/imx2_wdt.c index d6add516a7a7..5142bbabe027 100644 --- a/drivers/watchdog/imx2_wdt.c +++ b/drivers/watchdog/imx2_wdt.c | |||
@@ -52,6 +52,8 @@ | |||
52 | #define IMX2_WDT_WRSR 0x04 /* Reset Status Register */ | 52 | #define IMX2_WDT_WRSR 0x04 /* Reset Status Register */ |
53 | #define IMX2_WDT_WRSR_TOUT (1 << 1) /* -> Reset due to Timeout */ | 53 | #define IMX2_WDT_WRSR_TOUT (1 << 1) /* -> Reset due to Timeout */ |
54 | 54 | ||
55 | #define IMX2_WDT_WMCR 0x08 /* Misc Register */ | ||
56 | |||
55 | #define IMX2_WDT_MAX_TIME 128 | 57 | #define IMX2_WDT_MAX_TIME 128 |
56 | #define IMX2_WDT_DEFAULT_TIME 60 /* in seconds */ | 58 | #define IMX2_WDT_DEFAULT_TIME 60 /* in seconds */ |
57 | 59 | ||
@@ -274,6 +276,13 @@ static int __init imx2_wdt_probe(struct platform_device *pdev) | |||
274 | 276 | ||
275 | imx2_wdt_ping_if_active(wdog); | 277 | imx2_wdt_ping_if_active(wdog); |
276 | 278 | ||
279 | /* | ||
280 | * Disable the watchdog power down counter at boot. Otherwise the power | ||
281 | * down counter will pull down the #WDOG interrupt line for one clock | ||
282 | * cycle. | ||
283 | */ | ||
284 | regmap_write(wdev->regmap, IMX2_WDT_WMCR, 0); | ||
285 | |||
277 | ret = watchdog_register_device(wdog); | 286 | ret = watchdog_register_device(wdog); |
278 | if (ret) { | 287 | if (ret) { |
279 | dev_err(&pdev->dev, "cannot register watchdog device\n"); | 288 | dev_err(&pdev->dev, "cannot register watchdog device\n"); |
@@ -327,18 +336,21 @@ static void imx2_wdt_shutdown(struct platform_device *pdev) | |||
327 | } | 336 | } |
328 | 337 | ||
329 | #ifdef CONFIG_PM_SLEEP | 338 | #ifdef CONFIG_PM_SLEEP |
330 | /* Disable watchdog if it is active during suspend */ | 339 | /* Disable watchdog if it is active or non-active but still running */ |
331 | static int imx2_wdt_suspend(struct device *dev) | 340 | static int imx2_wdt_suspend(struct device *dev) |
332 | { | 341 | { |
333 | struct watchdog_device *wdog = dev_get_drvdata(dev); | 342 | struct watchdog_device *wdog = dev_get_drvdata(dev); |
334 | struct imx2_wdt_device *wdev = watchdog_get_drvdata(wdog); | 343 | struct imx2_wdt_device *wdev = watchdog_get_drvdata(wdog); |
335 | 344 | ||
336 | imx2_wdt_set_timeout(wdog, IMX2_WDT_MAX_TIME); | 345 | /* The watchdog IP block is running */ |
337 | imx2_wdt_ping(wdog); | 346 | if (imx2_wdt_is_running(wdev)) { |
347 | imx2_wdt_set_timeout(wdog, IMX2_WDT_MAX_TIME); | ||
348 | imx2_wdt_ping(wdog); | ||
338 | 349 | ||
339 | /* Watchdog has been stopped but IP block is still running */ | 350 | /* The watchdog is not active */ |
340 | if (!watchdog_active(wdog) && imx2_wdt_is_running(wdev)) | 351 | if (!watchdog_active(wdog)) |
341 | del_timer_sync(&wdev->timer); | 352 | del_timer_sync(&wdev->timer); |
353 | } | ||
342 | 354 | ||
343 | clk_disable_unprepare(wdev->clk); | 355 | clk_disable_unprepare(wdev->clk); |
344 | 356 | ||
@@ -354,15 +366,25 @@ static int imx2_wdt_resume(struct device *dev) | |||
354 | clk_prepare_enable(wdev->clk); | 366 | clk_prepare_enable(wdev->clk); |
355 | 367 | ||
356 | if (watchdog_active(wdog) && !imx2_wdt_is_running(wdev)) { | 368 | if (watchdog_active(wdog) && !imx2_wdt_is_running(wdev)) { |
357 | /* Resumes from deep sleep we need restart | 369 | /* |
358 | * the watchdog again. | 370 | * If the watchdog is still active and resumes |
371 | * from deep sleep state, need to restart the | ||
372 | * watchdog again. | ||
359 | */ | 373 | */ |
360 | imx2_wdt_setup(wdog); | 374 | imx2_wdt_setup(wdog); |
361 | imx2_wdt_set_timeout(wdog, wdog->timeout); | 375 | imx2_wdt_set_timeout(wdog, wdog->timeout); |
362 | imx2_wdt_ping(wdog); | 376 | imx2_wdt_ping(wdog); |
363 | } else if (imx2_wdt_is_running(wdev)) { | 377 | } else if (imx2_wdt_is_running(wdev)) { |
378 | /* Resuming from non-deep sleep state. */ | ||
379 | imx2_wdt_set_timeout(wdog, wdog->timeout); | ||
364 | imx2_wdt_ping(wdog); | 380 | imx2_wdt_ping(wdog); |
365 | mod_timer(&wdev->timer, jiffies + wdog->timeout * HZ / 2); | 381 | /* |
382 | * But the watchdog is not active, then start | ||
383 | * the timer again. | ||
384 | */ | ||
385 | if (!watchdog_active(wdog)) | ||
386 | mod_timer(&wdev->timer, | ||
387 | jiffies + wdog->timeout * HZ / 2); | ||
366 | } | 388 | } |
367 | 389 | ||
368 | return 0; | 390 | return 0; |
diff --git a/drivers/watchdog/meson_wdt.c b/drivers/watchdog/meson_wdt.c index ef6a298e8c45..1f4155ee3404 100644 --- a/drivers/watchdog/meson_wdt.c +++ b/drivers/watchdog/meson_wdt.c | |||
@@ -215,7 +215,6 @@ static struct platform_driver meson_wdt_driver = { | |||
215 | .remove = meson_wdt_remove, | 215 | .remove = meson_wdt_remove, |
216 | .shutdown = meson_wdt_shutdown, | 216 | .shutdown = meson_wdt_shutdown, |
217 | .driver = { | 217 | .driver = { |
218 | .owner = THIS_MODULE, | ||
219 | .name = DRV_NAME, | 218 | .name = DRV_NAME, |
220 | .of_match_table = meson_wdt_dt_ids, | 219 | .of_match_table = meson_wdt_dt_ids, |
221 | }, | 220 | }, |
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index 7e607416755a..0b180708bf79 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h | |||
@@ -1171,6 +1171,7 @@ struct btrfs_space_info { | |||
1171 | struct percpu_counter total_bytes_pinned; | 1171 | struct percpu_counter total_bytes_pinned; |
1172 | 1172 | ||
1173 | struct list_head list; | 1173 | struct list_head list; |
1174 | /* Protected by the spinlock 'lock'. */ | ||
1174 | struct list_head ro_bgs; | 1175 | struct list_head ro_bgs; |
1175 | 1176 | ||
1176 | struct rw_semaphore groups_sem; | 1177 | struct rw_semaphore groups_sem; |
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 15116585e714..a684086c3c81 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -9422,7 +9422,6 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans, | |||
9422 | * are still on the list after taking the semaphore | 9422 | * are still on the list after taking the semaphore |
9423 | */ | 9423 | */ |
9424 | list_del_init(&block_group->list); | 9424 | list_del_init(&block_group->list); |
9425 | list_del_init(&block_group->ro_list); | ||
9426 | if (list_empty(&block_group->space_info->block_groups[index])) { | 9425 | if (list_empty(&block_group->space_info->block_groups[index])) { |
9427 | kobj = block_group->space_info->block_group_kobjs[index]; | 9426 | kobj = block_group->space_info->block_group_kobjs[index]; |
9428 | block_group->space_info->block_group_kobjs[index] = NULL; | 9427 | block_group->space_info->block_group_kobjs[index] = NULL; |
@@ -9464,6 +9463,7 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans, | |||
9464 | btrfs_remove_free_space_cache(block_group); | 9463 | btrfs_remove_free_space_cache(block_group); |
9465 | 9464 | ||
9466 | spin_lock(&block_group->space_info->lock); | 9465 | spin_lock(&block_group->space_info->lock); |
9466 | list_del_init(&block_group->ro_list); | ||
9467 | block_group->space_info->total_bytes -= block_group->key.offset; | 9467 | block_group->space_info->total_bytes -= block_group->key.offset; |
9468 | block_group->space_info->bytes_readonly -= block_group->key.offset; | 9468 | block_group->space_info->bytes_readonly -= block_group->key.offset; |
9469 | block_group->space_info->disk_total -= block_group->key.offset * factor; | 9469 | block_group->space_info->disk_total -= block_group->key.offset * factor; |
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 4ebabd237153..790dbae3343c 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c | |||
@@ -2190,7 +2190,7 @@ void btrfs_free_io_failure_record(struct inode *inode, u64 start, u64 end) | |||
2190 | 2190 | ||
2191 | next = next_state(state); | 2191 | next = next_state(state); |
2192 | 2192 | ||
2193 | failrec = (struct io_failure_record *)state->private; | 2193 | failrec = (struct io_failure_record *)(unsigned long)state->private; |
2194 | free_extent_state(state); | 2194 | free_extent_state(state); |
2195 | kfree(failrec); | 2195 | kfree(failrec); |
2196 | 2196 | ||
diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index 9e1569ffbf6e..2f0fbc374e87 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c | |||
@@ -3053,7 +3053,7 @@ static noinline_for_stack int scrub_stripe(struct scrub_ctx *sctx, | |||
3053 | 3053 | ||
3054 | ppath = btrfs_alloc_path(); | 3054 | ppath = btrfs_alloc_path(); |
3055 | if (!ppath) { | 3055 | if (!ppath) { |
3056 | btrfs_free_path(ppath); | 3056 | btrfs_free_path(path); |
3057 | return -ENOMEM; | 3057 | return -ENOMEM; |
3058 | } | 3058 | } |
3059 | 3059 | ||
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 60f7cbe815e9..6f49b2872a64 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c | |||
@@ -1000,10 +1000,20 @@ int btrfs_sync_fs(struct super_block *sb, int wait) | |||
1000 | */ | 1000 | */ |
1001 | if (fs_info->pending_changes == 0) | 1001 | if (fs_info->pending_changes == 0) |
1002 | return 0; | 1002 | return 0; |
1003 | /* | ||
1004 | * A non-blocking test if the fs is frozen. We must not | ||
1005 | * start a new transaction here otherwise a deadlock | ||
1006 | * happens. The pending operations are delayed to the | ||
1007 | * next commit after thawing. | ||
1008 | */ | ||
1009 | if (__sb_start_write(sb, SB_FREEZE_WRITE, false)) | ||
1010 | __sb_end_write(sb, SB_FREEZE_WRITE); | ||
1011 | else | ||
1012 | return 0; | ||
1003 | trans = btrfs_start_transaction(root, 0); | 1013 | trans = btrfs_start_transaction(root, 0); |
1004 | } else { | ||
1005 | return PTR_ERR(trans); | ||
1006 | } | 1014 | } |
1015 | if (IS_ERR(trans)) | ||
1016 | return PTR_ERR(trans); | ||
1007 | } | 1017 | } |
1008 | return btrfs_commit_transaction(trans, root); | 1018 | return btrfs_commit_transaction(trans, root); |
1009 | } | 1019 | } |
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index a605d4e2f2bc..e88b59d13439 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c | |||
@@ -2118,7 +2118,7 @@ void btrfs_apply_pending_changes(struct btrfs_fs_info *fs_info) | |||
2118 | unsigned long prev; | 2118 | unsigned long prev; |
2119 | unsigned long bit; | 2119 | unsigned long bit; |
2120 | 2120 | ||
2121 | prev = cmpxchg(&fs_info->pending_changes, 0, 0); | 2121 | prev = xchg(&fs_info->pending_changes, 0); |
2122 | if (!prev) | 2122 | if (!prev) |
2123 | return; | 2123 | return; |
2124 | 2124 | ||
diff --git a/fs/cifs/ioctl.c b/fs/cifs/ioctl.c index 45cb59bcc791..8b7898b7670f 100644 --- a/fs/cifs/ioctl.c +++ b/fs/cifs/ioctl.c | |||
@@ -86,21 +86,16 @@ static long cifs_ioctl_clone(unsigned int xid, struct file *dst_file, | |||
86 | } | 86 | } |
87 | 87 | ||
88 | src_inode = file_inode(src_file.file); | 88 | src_inode = file_inode(src_file.file); |
89 | rc = -EINVAL; | ||
90 | if (S_ISDIR(src_inode->i_mode)) | ||
91 | goto out_fput; | ||
89 | 92 | ||
90 | /* | 93 | /* |
91 | * Note: cifs case is easier than btrfs since server responsible for | 94 | * Note: cifs case is easier than btrfs since server responsible for |
92 | * checks for proper open modes and file type and if it wants | 95 | * checks for proper open modes and file type and if it wants |
93 | * server could even support copy of range where source = target | 96 | * server could even support copy of range where source = target |
94 | */ | 97 | */ |
95 | 98 | lock_two_nondirectories(target_inode, src_inode); | |
96 | /* so we do not deadlock racing two ioctls on same files */ | ||
97 | if (target_inode < src_inode) { | ||
98 | mutex_lock_nested(&target_inode->i_mutex, I_MUTEX_PARENT); | ||
99 | mutex_lock_nested(&src_inode->i_mutex, I_MUTEX_CHILD); | ||
100 | } else { | ||
101 | mutex_lock_nested(&src_inode->i_mutex, I_MUTEX_PARENT); | ||
102 | mutex_lock_nested(&target_inode->i_mutex, I_MUTEX_CHILD); | ||
103 | } | ||
104 | 99 | ||
105 | /* determine range to clone */ | 100 | /* determine range to clone */ |
106 | rc = -EINVAL; | 101 | rc = -EINVAL; |
@@ -124,13 +119,7 @@ static long cifs_ioctl_clone(unsigned int xid, struct file *dst_file, | |||
124 | out_unlock: | 119 | out_unlock: |
125 | /* although unlocking in the reverse order from locking is not | 120 | /* although unlocking in the reverse order from locking is not |
126 | strictly necessary here it is a little cleaner to be consistent */ | 121 | strictly necessary here it is a little cleaner to be consistent */ |
127 | if (target_inode < src_inode) { | 122 | unlock_two_nondirectories(src_inode, target_inode); |
128 | mutex_unlock(&src_inode->i_mutex); | ||
129 | mutex_unlock(&target_inode->i_mutex); | ||
130 | } else { | ||
131 | mutex_unlock(&target_inode->i_mutex); | ||
132 | mutex_unlock(&src_inode->i_mutex); | ||
133 | } | ||
134 | out_fput: | 123 | out_fput: |
135 | fdput(src_file); | 124 | fdput(src_file); |
136 | out_drop_write: | 125 | out_drop_write: |
diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c index ba1107977f2e..ed19a7d622fa 100644 --- a/fs/fuse/dev.c +++ b/fs/fuse/dev.c | |||
@@ -131,6 +131,13 @@ static void fuse_req_init_context(struct fuse_req *req) | |||
131 | req->in.h.pid = current->pid; | 131 | req->in.h.pid = current->pid; |
132 | } | 132 | } |
133 | 133 | ||
134 | void fuse_set_initialized(struct fuse_conn *fc) | ||
135 | { | ||
136 | /* Make sure stores before this are seen on another CPU */ | ||
137 | smp_wmb(); | ||
138 | fc->initialized = 1; | ||
139 | } | ||
140 | |||
134 | static bool fuse_block_alloc(struct fuse_conn *fc, bool for_background) | 141 | static bool fuse_block_alloc(struct fuse_conn *fc, bool for_background) |
135 | { | 142 | { |
136 | return !fc->initialized || (for_background && fc->blocked); | 143 | return !fc->initialized || (for_background && fc->blocked); |
@@ -155,6 +162,8 @@ static struct fuse_req *__fuse_get_req(struct fuse_conn *fc, unsigned npages, | |||
155 | if (intr) | 162 | if (intr) |
156 | goto out; | 163 | goto out; |
157 | } | 164 | } |
165 | /* Matches smp_wmb() in fuse_set_initialized() */ | ||
166 | smp_rmb(); | ||
158 | 167 | ||
159 | err = -ENOTCONN; | 168 | err = -ENOTCONN; |
160 | if (!fc->connected) | 169 | if (!fc->connected) |
@@ -253,6 +262,8 @@ struct fuse_req *fuse_get_req_nofail_nopages(struct fuse_conn *fc, | |||
253 | 262 | ||
254 | atomic_inc(&fc->num_waiting); | 263 | atomic_inc(&fc->num_waiting); |
255 | wait_event(fc->blocked_waitq, fc->initialized); | 264 | wait_event(fc->blocked_waitq, fc->initialized); |
265 | /* Matches smp_wmb() in fuse_set_initialized() */ | ||
266 | smp_rmb(); | ||
256 | req = fuse_request_alloc(0); | 267 | req = fuse_request_alloc(0); |
257 | if (!req) | 268 | if (!req) |
258 | req = get_reserved_req(fc, file); | 269 | req = get_reserved_req(fc, file); |
@@ -511,6 +522,39 @@ void fuse_request_send(struct fuse_conn *fc, struct fuse_req *req) | |||
511 | } | 522 | } |
512 | EXPORT_SYMBOL_GPL(fuse_request_send); | 523 | EXPORT_SYMBOL_GPL(fuse_request_send); |
513 | 524 | ||
525 | static void fuse_adjust_compat(struct fuse_conn *fc, struct fuse_args *args) | ||
526 | { | ||
527 | if (fc->minor < 4 && args->in.h.opcode == FUSE_STATFS) | ||
528 | args->out.args[0].size = FUSE_COMPAT_STATFS_SIZE; | ||
529 | |||
530 | if (fc->minor < 9) { | ||
531 | switch (args->in.h.opcode) { | ||
532 | case FUSE_LOOKUP: | ||
533 | case FUSE_CREATE: | ||
534 | case FUSE_MKNOD: | ||
535 | case FUSE_MKDIR: | ||
536 | case FUSE_SYMLINK: | ||
537 | case FUSE_LINK: | ||
538 | args->out.args[0].size = FUSE_COMPAT_ENTRY_OUT_SIZE; | ||
539 | break; | ||
540 | case FUSE_GETATTR: | ||
541 | case FUSE_SETATTR: | ||
542 | args->out.args[0].size = FUSE_COMPAT_ATTR_OUT_SIZE; | ||
543 | break; | ||
544 | } | ||
545 | } | ||
546 | if (fc->minor < 12) { | ||
547 | switch (args->in.h.opcode) { | ||
548 | case FUSE_CREATE: | ||
549 | args->in.args[0].size = sizeof(struct fuse_open_in); | ||
550 | break; | ||
551 | case FUSE_MKNOD: | ||
552 | args->in.args[0].size = FUSE_COMPAT_MKNOD_IN_SIZE; | ||
553 | break; | ||
554 | } | ||
555 | } | ||
556 | } | ||
557 | |||
514 | ssize_t fuse_simple_request(struct fuse_conn *fc, struct fuse_args *args) | 558 | ssize_t fuse_simple_request(struct fuse_conn *fc, struct fuse_args *args) |
515 | { | 559 | { |
516 | struct fuse_req *req; | 560 | struct fuse_req *req; |
@@ -520,6 +564,9 @@ ssize_t fuse_simple_request(struct fuse_conn *fc, struct fuse_args *args) | |||
520 | if (IS_ERR(req)) | 564 | if (IS_ERR(req)) |
521 | return PTR_ERR(req); | 565 | return PTR_ERR(req); |
522 | 566 | ||
567 | /* Needs to be done after fuse_get_req() so that fc->minor is valid */ | ||
568 | fuse_adjust_compat(fc, args); | ||
569 | |||
523 | req->in.h.opcode = args->in.h.opcode; | 570 | req->in.h.opcode = args->in.h.opcode; |
524 | req->in.h.nodeid = args->in.h.nodeid; | 571 | req->in.h.nodeid = args->in.h.nodeid; |
525 | req->in.numargs = args->in.numargs; | 572 | req->in.numargs = args->in.numargs; |
@@ -2127,7 +2174,7 @@ void fuse_abort_conn(struct fuse_conn *fc) | |||
2127 | if (fc->connected) { | 2174 | if (fc->connected) { |
2128 | fc->connected = 0; | 2175 | fc->connected = 0; |
2129 | fc->blocked = 0; | 2176 | fc->blocked = 0; |
2130 | fc->initialized = 1; | 2177 | fuse_set_initialized(fc); |
2131 | end_io_requests(fc); | 2178 | end_io_requests(fc); |
2132 | end_queued_requests(fc); | 2179 | end_queued_requests(fc); |
2133 | end_polls(fc); | 2180 | end_polls(fc); |
@@ -2146,7 +2193,7 @@ int fuse_dev_release(struct inode *inode, struct file *file) | |||
2146 | spin_lock(&fc->lock); | 2193 | spin_lock(&fc->lock); |
2147 | fc->connected = 0; | 2194 | fc->connected = 0; |
2148 | fc->blocked = 0; | 2195 | fc->blocked = 0; |
2149 | fc->initialized = 1; | 2196 | fuse_set_initialized(fc); |
2150 | end_queued_requests(fc); | 2197 | end_queued_requests(fc); |
2151 | end_polls(fc); | 2198 | end_polls(fc); |
2152 | wake_up_all(&fc->blocked_waitq); | 2199 | wake_up_all(&fc->blocked_waitq); |
diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index 252b8a5de8b5..08e7b1a9d5d0 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c | |||
@@ -156,10 +156,7 @@ static void fuse_lookup_init(struct fuse_conn *fc, struct fuse_args *args, | |||
156 | args->in.args[0].size = name->len + 1; | 156 | args->in.args[0].size = name->len + 1; |
157 | args->in.args[0].value = name->name; | 157 | args->in.args[0].value = name->name; |
158 | args->out.numargs = 1; | 158 | args->out.numargs = 1; |
159 | if (fc->minor < 9) | 159 | args->out.args[0].size = sizeof(struct fuse_entry_out); |
160 | args->out.args[0].size = FUSE_COMPAT_ENTRY_OUT_SIZE; | ||
161 | else | ||
162 | args->out.args[0].size = sizeof(struct fuse_entry_out); | ||
163 | args->out.args[0].value = outarg; | 160 | args->out.args[0].value = outarg; |
164 | } | 161 | } |
165 | 162 | ||
@@ -422,16 +419,12 @@ static int fuse_create_open(struct inode *dir, struct dentry *entry, | |||
422 | args.in.h.opcode = FUSE_CREATE; | 419 | args.in.h.opcode = FUSE_CREATE; |
423 | args.in.h.nodeid = get_node_id(dir); | 420 | args.in.h.nodeid = get_node_id(dir); |
424 | args.in.numargs = 2; | 421 | args.in.numargs = 2; |
425 | args.in.args[0].size = fc->minor < 12 ? sizeof(struct fuse_open_in) : | 422 | args.in.args[0].size = sizeof(inarg); |
426 | sizeof(inarg); | ||
427 | args.in.args[0].value = &inarg; | 423 | args.in.args[0].value = &inarg; |
428 | args.in.args[1].size = entry->d_name.len + 1; | 424 | args.in.args[1].size = entry->d_name.len + 1; |
429 | args.in.args[1].value = entry->d_name.name; | 425 | args.in.args[1].value = entry->d_name.name; |
430 | args.out.numargs = 2; | 426 | args.out.numargs = 2; |
431 | if (fc->minor < 9) | 427 | args.out.args[0].size = sizeof(outentry); |
432 | args.out.args[0].size = FUSE_COMPAT_ENTRY_OUT_SIZE; | ||
433 | else | ||
434 | args.out.args[0].size = sizeof(outentry); | ||
435 | args.out.args[0].value = &outentry; | 428 | args.out.args[0].value = &outentry; |
436 | args.out.args[1].size = sizeof(outopen); | 429 | args.out.args[1].size = sizeof(outopen); |
437 | args.out.args[1].value = &outopen; | 430 | args.out.args[1].value = &outopen; |
@@ -539,10 +532,7 @@ static int create_new_entry(struct fuse_conn *fc, struct fuse_args *args, | |||
539 | memset(&outarg, 0, sizeof(outarg)); | 532 | memset(&outarg, 0, sizeof(outarg)); |
540 | args->in.h.nodeid = get_node_id(dir); | 533 | args->in.h.nodeid = get_node_id(dir); |
541 | args->out.numargs = 1; | 534 | args->out.numargs = 1; |
542 | if (fc->minor < 9) | 535 | args->out.args[0].size = sizeof(outarg); |
543 | args->out.args[0].size = FUSE_COMPAT_ENTRY_OUT_SIZE; | ||
544 | else | ||
545 | args->out.args[0].size = sizeof(outarg); | ||
546 | args->out.args[0].value = &outarg; | 536 | args->out.args[0].value = &outarg; |
547 | err = fuse_simple_request(fc, args); | 537 | err = fuse_simple_request(fc, args); |
548 | if (err) | 538 | if (err) |
@@ -592,8 +582,7 @@ static int fuse_mknod(struct inode *dir, struct dentry *entry, umode_t mode, | |||
592 | inarg.umask = current_umask(); | 582 | inarg.umask = current_umask(); |
593 | args.in.h.opcode = FUSE_MKNOD; | 583 | args.in.h.opcode = FUSE_MKNOD; |
594 | args.in.numargs = 2; | 584 | args.in.numargs = 2; |
595 | args.in.args[0].size = fc->minor < 12 ? FUSE_COMPAT_MKNOD_IN_SIZE : | 585 | args.in.args[0].size = sizeof(inarg); |
596 | sizeof(inarg); | ||
597 | args.in.args[0].value = &inarg; | 586 | args.in.args[0].value = &inarg; |
598 | args.in.args[1].size = entry->d_name.len + 1; | 587 | args.in.args[1].size = entry->d_name.len + 1; |
599 | args.in.args[1].value = entry->d_name.name; | 588 | args.in.args[1].value = entry->d_name.name; |
@@ -899,10 +888,7 @@ static int fuse_do_getattr(struct inode *inode, struct kstat *stat, | |||
899 | args.in.args[0].size = sizeof(inarg); | 888 | args.in.args[0].size = sizeof(inarg); |
900 | args.in.args[0].value = &inarg; | 889 | args.in.args[0].value = &inarg; |
901 | args.out.numargs = 1; | 890 | args.out.numargs = 1; |
902 | if (fc->minor < 9) | 891 | args.out.args[0].size = sizeof(outarg); |
903 | args.out.args[0].size = FUSE_COMPAT_ATTR_OUT_SIZE; | ||
904 | else | ||
905 | args.out.args[0].size = sizeof(outarg); | ||
906 | args.out.args[0].value = &outarg; | 892 | args.out.args[0].value = &outarg; |
907 | err = fuse_simple_request(fc, &args); | 893 | err = fuse_simple_request(fc, &args); |
908 | if (!err) { | 894 | if (!err) { |
@@ -1574,10 +1560,7 @@ static void fuse_setattr_fill(struct fuse_conn *fc, struct fuse_args *args, | |||
1574 | args->in.args[0].size = sizeof(*inarg_p); | 1560 | args->in.args[0].size = sizeof(*inarg_p); |
1575 | args->in.args[0].value = inarg_p; | 1561 | args->in.args[0].value = inarg_p; |
1576 | args->out.numargs = 1; | 1562 | args->out.numargs = 1; |
1577 | if (fc->minor < 9) | 1563 | args->out.args[0].size = sizeof(*outarg_p); |
1578 | args->out.args[0].size = FUSE_COMPAT_ATTR_OUT_SIZE; | ||
1579 | else | ||
1580 | args->out.args[0].size = sizeof(*outarg_p); | ||
1581 | args->out.args[0].value = outarg_p; | 1564 | args->out.args[0].value = outarg_p; |
1582 | } | 1565 | } |
1583 | 1566 | ||
diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h index e0fc6725d1d0..1cdfb07c1376 100644 --- a/fs/fuse/fuse_i.h +++ b/fs/fuse/fuse_i.h | |||
@@ -906,4 +906,6 @@ int fuse_write_inode(struct inode *inode, struct writeback_control *wbc); | |||
906 | int fuse_do_setattr(struct inode *inode, struct iattr *attr, | 906 | int fuse_do_setattr(struct inode *inode, struct iattr *attr, |
907 | struct file *file); | 907 | struct file *file); |
908 | 908 | ||
909 | void fuse_set_initialized(struct fuse_conn *fc); | ||
910 | |||
909 | #endif /* _FS_FUSE_I_H */ | 911 | #endif /* _FS_FUSE_I_H */ |
diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c index 6749109f255d..f38256e4476e 100644 --- a/fs/fuse/inode.c +++ b/fs/fuse/inode.c | |||
@@ -424,8 +424,7 @@ static int fuse_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
424 | args.in.h.opcode = FUSE_STATFS; | 424 | args.in.h.opcode = FUSE_STATFS; |
425 | args.in.h.nodeid = get_node_id(dentry->d_inode); | 425 | args.in.h.nodeid = get_node_id(dentry->d_inode); |
426 | args.out.numargs = 1; | 426 | args.out.numargs = 1; |
427 | args.out.args[0].size = | 427 | args.out.args[0].size = sizeof(outarg); |
428 | fc->minor < 4 ? FUSE_COMPAT_STATFS_SIZE : sizeof(outarg); | ||
429 | args.out.args[0].value = &outarg; | 428 | args.out.args[0].value = &outarg; |
430 | err = fuse_simple_request(fc, &args); | 429 | err = fuse_simple_request(fc, &args); |
431 | if (!err) | 430 | if (!err) |
@@ -898,7 +897,7 @@ static void process_init_reply(struct fuse_conn *fc, struct fuse_req *req) | |||
898 | fc->max_write = max_t(unsigned, 4096, fc->max_write); | 897 | fc->max_write = max_t(unsigned, 4096, fc->max_write); |
899 | fc->conn_init = 1; | 898 | fc->conn_init = 1; |
900 | } | 899 | } |
901 | fc->initialized = 1; | 900 | fuse_set_initialized(fc); |
902 | wake_up_all(&fc->blocked_waitq); | 901 | wake_up_all(&fc->blocked_waitq); |
903 | } | 902 | } |
904 | 903 | ||
diff --git a/fs/kernfs/dir.c b/fs/kernfs/dir.c index 37989f02a226..2d881b381d2b 100644 --- a/fs/kernfs/dir.c +++ b/fs/kernfs/dir.c | |||
@@ -201,10 +201,14 @@ static unsigned int kernfs_name_hash(const char *name, const void *ns) | |||
201 | static int kernfs_name_compare(unsigned int hash, const char *name, | 201 | static int kernfs_name_compare(unsigned int hash, const char *name, |
202 | const void *ns, const struct kernfs_node *kn) | 202 | const void *ns, const struct kernfs_node *kn) |
203 | { | 203 | { |
204 | if (hash != kn->hash) | 204 | if (hash < kn->hash) |
205 | return hash - kn->hash; | 205 | return -1; |
206 | if (ns != kn->ns) | 206 | if (hash > kn->hash) |
207 | return ns - kn->ns; | 207 | return 1; |
208 | if (ns < kn->ns) | ||
209 | return -1; | ||
210 | if (ns > kn->ns) | ||
211 | return 1; | ||
208 | return strcmp(name, kn->name); | 212 | return strcmp(name, kn->name); |
209 | } | 213 | } |
210 | 214 | ||
diff --git a/fs/lockd/svc.c b/fs/lockd/svc.c index e94c887da2d7..55505cbe11af 100644 --- a/fs/lockd/svc.c +++ b/fs/lockd/svc.c | |||
@@ -138,10 +138,6 @@ lockd(void *vrqstp) | |||
138 | 138 | ||
139 | dprintk("NFS locking service started (ver " LOCKD_VERSION ").\n"); | 139 | dprintk("NFS locking service started (ver " LOCKD_VERSION ").\n"); |
140 | 140 | ||
141 | if (!nlm_timeout) | ||
142 | nlm_timeout = LOCKD_DFLT_TIMEO; | ||
143 | nlmsvc_timeout = nlm_timeout * HZ; | ||
144 | |||
145 | /* | 141 | /* |
146 | * The main request loop. We don't terminate until the last | 142 | * The main request loop. We don't terminate until the last |
147 | * NFS mount or NFS daemon has gone away. | 143 | * NFS mount or NFS daemon has gone away. |
@@ -350,6 +346,10 @@ static struct svc_serv *lockd_create_svc(void) | |||
350 | printk(KERN_WARNING | 346 | printk(KERN_WARNING |
351 | "lockd_up: no pid, %d users??\n", nlmsvc_users); | 347 | "lockd_up: no pid, %d users??\n", nlmsvc_users); |
352 | 348 | ||
349 | if (!nlm_timeout) | ||
350 | nlm_timeout = LOCKD_DFLT_TIMEO; | ||
351 | nlmsvc_timeout = nlm_timeout * HZ; | ||
352 | |||
353 | serv = svc_create(&nlmsvc_program, LOCKD_BUFSIZE, svc_rpcb_cleanup); | 353 | serv = svc_create(&nlmsvc_program, LOCKD_BUFSIZE, svc_rpcb_cleanup); |
354 | if (!serv) { | 354 | if (!serv) { |
355 | printk(KERN_WARNING "lockd_up: create service failed\n"); | 355 | printk(KERN_WARNING "lockd_up: create service failed\n"); |
diff --git a/fs/nfs/nfs4client.c b/fs/nfs/nfs4client.c index 03311259b0c4..953daa44a282 100644 --- a/fs/nfs/nfs4client.c +++ b/fs/nfs/nfs4client.c | |||
@@ -228,6 +228,7 @@ static void nfs4_shutdown_client(struct nfs_client *clp) | |||
228 | kfree(clp->cl_serverowner); | 228 | kfree(clp->cl_serverowner); |
229 | kfree(clp->cl_serverscope); | 229 | kfree(clp->cl_serverscope); |
230 | kfree(clp->cl_implid); | 230 | kfree(clp->cl_implid); |
231 | kfree(clp->cl_owner_id); | ||
231 | } | 232 | } |
232 | 233 | ||
233 | void nfs4_free_client(struct nfs_client *clp) | 234 | void nfs4_free_client(struct nfs_client *clp) |
@@ -452,6 +453,14 @@ static void nfs4_swap_callback_idents(struct nfs_client *keep, | |||
452 | spin_unlock(&nn->nfs_client_lock); | 453 | spin_unlock(&nn->nfs_client_lock); |
453 | } | 454 | } |
454 | 455 | ||
456 | static bool nfs4_match_client_owner_id(const struct nfs_client *clp1, | ||
457 | const struct nfs_client *clp2) | ||
458 | { | ||
459 | if (clp1->cl_owner_id == NULL || clp2->cl_owner_id == NULL) | ||
460 | return true; | ||
461 | return strcmp(clp1->cl_owner_id, clp2->cl_owner_id) == 0; | ||
462 | } | ||
463 | |||
455 | /** | 464 | /** |
456 | * nfs40_walk_client_list - Find server that recognizes a client ID | 465 | * nfs40_walk_client_list - Find server that recognizes a client ID |
457 | * | 466 | * |
@@ -483,9 +492,6 @@ int nfs40_walk_client_list(struct nfs_client *new, | |||
483 | if (pos->rpc_ops != new->rpc_ops) | 492 | if (pos->rpc_ops != new->rpc_ops) |
484 | continue; | 493 | continue; |
485 | 494 | ||
486 | if (pos->cl_proto != new->cl_proto) | ||
487 | continue; | ||
488 | |||
489 | if (pos->cl_minorversion != new->cl_minorversion) | 495 | if (pos->cl_minorversion != new->cl_minorversion) |
490 | continue; | 496 | continue; |
491 | 497 | ||
@@ -510,6 +516,9 @@ int nfs40_walk_client_list(struct nfs_client *new, | |||
510 | if (pos->cl_clientid != new->cl_clientid) | 516 | if (pos->cl_clientid != new->cl_clientid) |
511 | continue; | 517 | continue; |
512 | 518 | ||
519 | if (!nfs4_match_client_owner_id(pos, new)) | ||
520 | continue; | ||
521 | |||
513 | atomic_inc(&pos->cl_count); | 522 | atomic_inc(&pos->cl_count); |
514 | spin_unlock(&nn->nfs_client_lock); | 523 | spin_unlock(&nn->nfs_client_lock); |
515 | 524 | ||
@@ -566,20 +575,14 @@ static bool nfs4_match_clientids(struct nfs_client *a, struct nfs_client *b) | |||
566 | } | 575 | } |
567 | 576 | ||
568 | /* | 577 | /* |
569 | * Returns true if the server owners match | 578 | * Returns true if the server major ids match |
570 | */ | 579 | */ |
571 | static bool | 580 | static bool |
572 | nfs4_match_serverowners(struct nfs_client *a, struct nfs_client *b) | 581 | nfs4_check_clientid_trunking(struct nfs_client *a, struct nfs_client *b) |
573 | { | 582 | { |
574 | struct nfs41_server_owner *o1 = a->cl_serverowner; | 583 | struct nfs41_server_owner *o1 = a->cl_serverowner; |
575 | struct nfs41_server_owner *o2 = b->cl_serverowner; | 584 | struct nfs41_server_owner *o2 = b->cl_serverowner; |
576 | 585 | ||
577 | if (o1->minor_id != o2->minor_id) { | ||
578 | dprintk("NFS: --> %s server owner minor IDs do not match\n", | ||
579 | __func__); | ||
580 | return false; | ||
581 | } | ||
582 | |||
583 | if (o1->major_id_sz != o2->major_id_sz) | 586 | if (o1->major_id_sz != o2->major_id_sz) |
584 | goto out_major_mismatch; | 587 | goto out_major_mismatch; |
585 | if (memcmp(o1->major_id, o2->major_id, o1->major_id_sz) != 0) | 588 | if (memcmp(o1->major_id, o2->major_id, o1->major_id_sz) != 0) |
@@ -621,9 +624,6 @@ int nfs41_walk_client_list(struct nfs_client *new, | |||
621 | if (pos->rpc_ops != new->rpc_ops) | 624 | if (pos->rpc_ops != new->rpc_ops) |
622 | continue; | 625 | continue; |
623 | 626 | ||
624 | if (pos->cl_proto != new->cl_proto) | ||
625 | continue; | ||
626 | |||
627 | if (pos->cl_minorversion != new->cl_minorversion) | 627 | if (pos->cl_minorversion != new->cl_minorversion) |
628 | continue; | 628 | continue; |
629 | 629 | ||
@@ -654,7 +654,19 @@ int nfs41_walk_client_list(struct nfs_client *new, | |||
654 | if (!nfs4_match_clientids(pos, new)) | 654 | if (!nfs4_match_clientids(pos, new)) |
655 | continue; | 655 | continue; |
656 | 656 | ||
657 | if (!nfs4_match_serverowners(pos, new)) | 657 | /* |
658 | * Note that session trunking is just a special subcase of | ||
659 | * client id trunking. In either case, we want to fall back | ||
660 | * to using the existing nfs_client. | ||
661 | */ | ||
662 | if (!nfs4_check_clientid_trunking(pos, new)) | ||
663 | continue; | ||
664 | |||
665 | /* Unlike NFSv4.0, we know that NFSv4.1 always uses the | ||
666 | * uniform string, however someone might switch the | ||
667 | * uniquifier string on us. | ||
668 | */ | ||
669 | if (!nfs4_match_client_owner_id(pos, new)) | ||
658 | continue; | 670 | continue; |
659 | 671 | ||
660 | atomic_inc(&pos->cl_count); | 672 | atomic_inc(&pos->cl_count); |
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index e7f8d5ff2581..c347705b0161 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
@@ -1117,8 +1117,6 @@ static int can_open_delegated(struct nfs_delegation *delegation, fmode_t fmode) | |||
1117 | return 0; | 1117 | return 0; |
1118 | if ((delegation->type & fmode) != fmode) | 1118 | if ((delegation->type & fmode) != fmode) |
1119 | return 0; | 1119 | return 0; |
1120 | if (test_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags)) | ||
1121 | return 0; | ||
1122 | if (test_bit(NFS_DELEGATION_RETURNING, &delegation->flags)) | 1120 | if (test_bit(NFS_DELEGATION_RETURNING, &delegation->flags)) |
1123 | return 0; | 1121 | return 0; |
1124 | nfs_mark_delegation_referenced(delegation); | 1122 | nfs_mark_delegation_referenced(delegation); |
@@ -4917,11 +4915,14 @@ static void nfs4_init_boot_verifier(const struct nfs_client *clp, | |||
4917 | } | 4915 | } |
4918 | 4916 | ||
4919 | static unsigned int | 4917 | static unsigned int |
4920 | nfs4_init_nonuniform_client_string(const struct nfs_client *clp, | 4918 | nfs4_init_nonuniform_client_string(struct nfs_client *clp, |
4921 | char *buf, size_t len) | 4919 | char *buf, size_t len) |
4922 | { | 4920 | { |
4923 | unsigned int result; | 4921 | unsigned int result; |
4924 | 4922 | ||
4923 | if (clp->cl_owner_id != NULL) | ||
4924 | return strlcpy(buf, clp->cl_owner_id, len); | ||
4925 | |||
4925 | rcu_read_lock(); | 4926 | rcu_read_lock(); |
4926 | result = scnprintf(buf, len, "Linux NFSv4.0 %s/%s %s", | 4927 | result = scnprintf(buf, len, "Linux NFSv4.0 %s/%s %s", |
4927 | clp->cl_ipaddr, | 4928 | clp->cl_ipaddr, |
@@ -4930,24 +4931,32 @@ nfs4_init_nonuniform_client_string(const struct nfs_client *clp, | |||
4930 | rpc_peeraddr2str(clp->cl_rpcclient, | 4931 | rpc_peeraddr2str(clp->cl_rpcclient, |
4931 | RPC_DISPLAY_PROTO)); | 4932 | RPC_DISPLAY_PROTO)); |
4932 | rcu_read_unlock(); | 4933 | rcu_read_unlock(); |
4934 | clp->cl_owner_id = kstrdup(buf, GFP_KERNEL); | ||
4933 | return result; | 4935 | return result; |
4934 | } | 4936 | } |
4935 | 4937 | ||
4936 | static unsigned int | 4938 | static unsigned int |
4937 | nfs4_init_uniform_client_string(const struct nfs_client *clp, | 4939 | nfs4_init_uniform_client_string(struct nfs_client *clp, |
4938 | char *buf, size_t len) | 4940 | char *buf, size_t len) |
4939 | { | 4941 | { |
4940 | const char *nodename = clp->cl_rpcclient->cl_nodename; | 4942 | const char *nodename = clp->cl_rpcclient->cl_nodename; |
4943 | unsigned int result; | ||
4944 | |||
4945 | if (clp->cl_owner_id != NULL) | ||
4946 | return strlcpy(buf, clp->cl_owner_id, len); | ||
4941 | 4947 | ||
4942 | if (nfs4_client_id_uniquifier[0] != '\0') | 4948 | if (nfs4_client_id_uniquifier[0] != '\0') |
4943 | return scnprintf(buf, len, "Linux NFSv%u.%u %s/%s", | 4949 | result = scnprintf(buf, len, "Linux NFSv%u.%u %s/%s", |
4944 | clp->rpc_ops->version, | 4950 | clp->rpc_ops->version, |
4945 | clp->cl_minorversion, | 4951 | clp->cl_minorversion, |
4946 | nfs4_client_id_uniquifier, | 4952 | nfs4_client_id_uniquifier, |
4947 | nodename); | 4953 | nodename); |
4948 | return scnprintf(buf, len, "Linux NFSv%u.%u %s", | 4954 | else |
4955 | result = scnprintf(buf, len, "Linux NFSv%u.%u %s", | ||
4949 | clp->rpc_ops->version, clp->cl_minorversion, | 4956 | clp->rpc_ops->version, clp->cl_minorversion, |
4950 | nodename); | 4957 | nodename); |
4958 | clp->cl_owner_id = kstrdup(buf, GFP_KERNEL); | ||
4959 | return result; | ||
4951 | } | 4960 | } |
4952 | 4961 | ||
4953 | /* | 4962 | /* |
diff --git a/include/dt-bindings/interrupt-controller/arm-gic.h b/include/dt-bindings/interrupt-controller/arm-gic.h index 1ea1b702fec2..d4110d5caa3e 100644 --- a/include/dt-bindings/interrupt-controller/arm-gic.h +++ b/include/dt-bindings/interrupt-controller/arm-gic.h | |||
@@ -7,14 +7,14 @@ | |||
7 | 7 | ||
8 | #include <dt-bindings/interrupt-controller/irq.h> | 8 | #include <dt-bindings/interrupt-controller/irq.h> |
9 | 9 | ||
10 | /* interrupt specific cell 0 */ | 10 | /* interrupt specifier cell 0 */ |
11 | 11 | ||
12 | #define GIC_SPI 0 | 12 | #define GIC_SPI 0 |
13 | #define GIC_PPI 1 | 13 | #define GIC_PPI 1 |
14 | 14 | ||
15 | /* | 15 | /* |
16 | * Interrupt specifier cell 2. | 16 | * Interrupt specifier cell 2. |
17 | * The flaggs in irq.h are valid, plus those below. | 17 | * The flags in irq.h are valid, plus those below. |
18 | */ | 18 | */ |
19 | #define GIC_CPU_MASK_RAW(x) ((x) << 8) | 19 | #define GIC_CPU_MASK_RAW(x) ((x) << 8) |
20 | #define GIC_CPU_MASK_SIMPLE(num) GIC_CPU_MASK_RAW((1 << (num)) - 1) | 20 | #define GIC_CPU_MASK_SIMPLE(num) GIC_CPU_MASK_RAW((1 << (num)) - 1) |
diff --git a/include/linux/genetlink.h b/include/linux/genetlink.h index 55b685719d52..09460d6d6682 100644 --- a/include/linux/genetlink.h +++ b/include/linux/genetlink.h | |||
@@ -11,6 +11,10 @@ extern void genl_unlock(void); | |||
11 | extern int lockdep_genl_is_held(void); | 11 | extern int lockdep_genl_is_held(void); |
12 | #endif | 12 | #endif |
13 | 13 | ||
14 | /* for synchronisation between af_netlink and genetlink */ | ||
15 | extern atomic_t genl_sk_destructing_cnt; | ||
16 | extern wait_queue_head_t genl_sk_destructing_waitq; | ||
17 | |||
14 | /** | 18 | /** |
15 | * rcu_dereference_genl - rcu_dereference with debug checking | 19 | * rcu_dereference_genl - rcu_dereference with debug checking |
16 | * @p: The pointer to read, prior to dereferencing | 20 | * @p: The pointer to read, prior to dereferencing |
diff --git a/include/linux/libata.h b/include/linux/libata.h index 2d182413b1db..91f705de2c0b 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
@@ -231,6 +231,7 @@ enum { | |||
231 | ATA_FLAG_SW_ACTIVITY = (1 << 22), /* driver supports sw activity | 231 | ATA_FLAG_SW_ACTIVITY = (1 << 22), /* driver supports sw activity |
232 | * led */ | 232 | * led */ |
233 | ATA_FLAG_NO_DIPM = (1 << 23), /* host not happy with DIPM */ | 233 | ATA_FLAG_NO_DIPM = (1 << 23), /* host not happy with DIPM */ |
234 | ATA_FLAG_LOWTAG = (1 << 24), /* host wants lowest available tag */ | ||
234 | 235 | ||
235 | /* bits 24:31 of ap->flags are reserved for LLD specific flags */ | 236 | /* bits 24:31 of ap->flags are reserved for LLD specific flags */ |
236 | 237 | ||
@@ -422,6 +423,7 @@ enum { | |||
422 | ATA_HORKAGE_NO_NCQ_TRIM = (1 << 19), /* don't use queued TRIM */ | 423 | ATA_HORKAGE_NO_NCQ_TRIM = (1 << 19), /* don't use queued TRIM */ |
423 | ATA_HORKAGE_NOLPM = (1 << 20), /* don't use LPM */ | 424 | ATA_HORKAGE_NOLPM = (1 << 20), /* don't use LPM */ |
424 | ATA_HORKAGE_WD_BROKEN_LPM = (1 << 21), /* some WDs have broken LPM */ | 425 | ATA_HORKAGE_WD_BROKEN_LPM = (1 << 21), /* some WDs have broken LPM */ |
426 | ATA_HORKAGE_ZERO_AFTER_TRIM = (1 << 22),/* guarantees zero after trim */ | ||
425 | 427 | ||
426 | /* DMA mask for user DMA control: User visible values; DO NOT | 428 | /* DMA mask for user DMA control: User visible values; DO NOT |
427 | renumber */ | 429 | renumber */ |
diff --git a/include/linux/mfd/samsung/s2mps13.h b/include/linux/mfd/samsung/s2mps13.h index ce5dda8958fe..b1fd675fa36f 100644 --- a/include/linux/mfd/samsung/s2mps13.h +++ b/include/linux/mfd/samsung/s2mps13.h | |||
@@ -59,6 +59,7 @@ enum s2mps13_reg { | |||
59 | S2MPS13_REG_B6CTRL, | 59 | S2MPS13_REG_B6CTRL, |
60 | S2MPS13_REG_B6OUT, | 60 | S2MPS13_REG_B6OUT, |
61 | S2MPS13_REG_B7CTRL, | 61 | S2MPS13_REG_B7CTRL, |
62 | S2MPS13_REG_B7SW, | ||
62 | S2MPS13_REG_B7OUT, | 63 | S2MPS13_REG_B7OUT, |
63 | S2MPS13_REG_B8CTRL, | 64 | S2MPS13_REG_B8CTRL, |
64 | S2MPS13_REG_B8OUT, | 65 | S2MPS13_REG_B8OUT, |
@@ -102,6 +103,7 @@ enum s2mps13_reg { | |||
102 | S2MPS13_REG_L26CTRL, | 103 | S2MPS13_REG_L26CTRL, |
103 | S2MPS13_REG_L27CTRL, | 104 | S2MPS13_REG_L27CTRL, |
104 | S2MPS13_REG_L28CTRL, | 105 | S2MPS13_REG_L28CTRL, |
106 | S2MPS13_REG_L29CTRL, | ||
105 | S2MPS13_REG_L30CTRL, | 107 | S2MPS13_REG_L30CTRL, |
106 | S2MPS13_REG_L31CTRL, | 108 | S2MPS13_REG_L31CTRL, |
107 | S2MPS13_REG_L32CTRL, | 109 | S2MPS13_REG_L32CTRL, |
diff --git a/include/linux/module.h b/include/linux/module.h index ebfb0e153c6a..b653d7c0a05a 100644 --- a/include/linux/module.h +++ b/include/linux/module.h | |||
@@ -444,7 +444,7 @@ extern void __module_put_and_exit(struct module *mod, long code) | |||
444 | #define module_put_and_exit(code) __module_put_and_exit(THIS_MODULE, code) | 444 | #define module_put_and_exit(code) __module_put_and_exit(THIS_MODULE, code) |
445 | 445 | ||
446 | #ifdef CONFIG_MODULE_UNLOAD | 446 | #ifdef CONFIG_MODULE_UNLOAD |
447 | unsigned long module_refcount(struct module *mod); | 447 | int module_refcount(struct module *mod); |
448 | void __symbol_put(const char *symbol); | 448 | void __symbol_put(const char *symbol); |
449 | #define symbol_put(x) __symbol_put(VMLINUX_SYMBOL_STR(x)) | 449 | #define symbol_put(x) __symbol_put(VMLINUX_SYMBOL_STR(x)) |
450 | void symbol_put_addr(void *addr); | 450 | void symbol_put_addr(void *addr); |
diff --git a/include/linux/moduleloader.h b/include/linux/moduleloader.h index 7eeb9bbfb816..f7556261fe3c 100644 --- a/include/linux/moduleloader.h +++ b/include/linux/moduleloader.h | |||
@@ -26,7 +26,7 @@ unsigned int arch_mod_section_prepend(struct module *mod, unsigned int section); | |||
26 | void *module_alloc(unsigned long size); | 26 | void *module_alloc(unsigned long size); |
27 | 27 | ||
28 | /* Free memory returned from module_alloc. */ | 28 | /* Free memory returned from module_alloc. */ |
29 | void module_free(struct module *mod, void *module_region); | 29 | void module_memfree(void *module_region); |
30 | 30 | ||
31 | /* | 31 | /* |
32 | * Apply the given relocation to the (simplified) ELF. Return -error | 32 | * Apply the given relocation to the (simplified) ELF. Return -error |
@@ -82,4 +82,6 @@ int module_finalize(const Elf_Ehdr *hdr, | |||
82 | /* Any cleanup needed when module leaves. */ | 82 | /* Any cleanup needed when module leaves. */ |
83 | void module_arch_cleanup(struct module *mod); | 83 | void module_arch_cleanup(struct module *mod); |
84 | 84 | ||
85 | /* Any cleanup before freeing mod->module_init */ | ||
86 | void module_arch_freeing_init(struct module *mod); | ||
85 | #endif | 87 | #endif |
diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h index 1e37fbb78f7a..ddea982355f3 100644 --- a/include/linux/nfs_fs_sb.h +++ b/include/linux/nfs_fs_sb.h | |||
@@ -74,6 +74,9 @@ struct nfs_client { | |||
74 | /* idmapper */ | 74 | /* idmapper */ |
75 | struct idmap * cl_idmap; | 75 | struct idmap * cl_idmap; |
76 | 76 | ||
77 | /* Client owner identifier */ | ||
78 | const char * cl_owner_id; | ||
79 | |||
77 | /* Our own IP address, as a null-terminated string. | 80 | /* Our own IP address, as a null-terminated string. |
78 | * This is used to generate the mv0 callback address. | 81 | * This is used to generate the mv0 callback address. |
79 | */ | 82 | */ |
diff --git a/include/linux/oom.h b/include/linux/oom.h index 853698c721f7..76200984d1e2 100644 --- a/include/linux/oom.h +++ b/include/linux/oom.h | |||
@@ -85,11 +85,6 @@ static inline void oom_killer_enable(void) | |||
85 | oom_killer_disabled = false; | 85 | oom_killer_disabled = false; |
86 | } | 86 | } |
87 | 87 | ||
88 | static inline bool oom_gfp_allowed(gfp_t gfp_mask) | ||
89 | { | ||
90 | return (gfp_mask & __GFP_FS) && !(gfp_mask & __GFP_NORETRY); | ||
91 | } | ||
92 | |||
93 | extern struct task_struct *find_lock_task_mm(struct task_struct *p); | 88 | extern struct task_struct *find_lock_task_mm(struct task_struct *p); |
94 | 89 | ||
95 | static inline bool task_will_free_mem(struct task_struct *task) | 90 | static inline bool task_will_free_mem(struct task_struct *task) |
diff --git a/include/linux/pci.h b/include/linux/pci.h index 360a966a97a5..9603094ed59b 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h | |||
@@ -175,6 +175,8 @@ enum pci_dev_flags { | |||
175 | PCI_DEV_FLAGS_DMA_ALIAS_DEVFN = (__force pci_dev_flags_t) (1 << 4), | 175 | PCI_DEV_FLAGS_DMA_ALIAS_DEVFN = (__force pci_dev_flags_t) (1 << 4), |
176 | /* Use a PCIe-to-PCI bridge alias even if !pci_is_pcie */ | 176 | /* Use a PCIe-to-PCI bridge alias even if !pci_is_pcie */ |
177 | PCI_DEV_FLAG_PCIE_BRIDGE_ALIAS = (__force pci_dev_flags_t) (1 << 5), | 177 | PCI_DEV_FLAG_PCIE_BRIDGE_ALIAS = (__force pci_dev_flags_t) (1 << 5), |
178 | /* Do not use bus resets for device */ | ||
179 | PCI_DEV_FLAGS_NO_BUS_RESET = (__force pci_dev_flags_t) (1 << 6), | ||
178 | }; | 180 | }; |
179 | 181 | ||
180 | enum pci_irq_reroute_variant { | 182 | enum pci_irq_reroute_variant { |
@@ -1065,6 +1067,7 @@ resource_size_t pcibios_retrieve_fw_addr(struct pci_dev *dev, int idx); | |||
1065 | void pci_bus_assign_resources(const struct pci_bus *bus); | 1067 | void pci_bus_assign_resources(const struct pci_bus *bus); |
1066 | void pci_bus_size_bridges(struct pci_bus *bus); | 1068 | void pci_bus_size_bridges(struct pci_bus *bus); |
1067 | int pci_claim_resource(struct pci_dev *, int); | 1069 | int pci_claim_resource(struct pci_dev *, int); |
1070 | int pci_claim_bridge_resource(struct pci_dev *bridge, int i); | ||
1068 | void pci_assign_unassigned_resources(void); | 1071 | void pci_assign_unassigned_resources(void); |
1069 | void pci_assign_unassigned_bridge_resources(struct pci_dev *bridge); | 1072 | void pci_assign_unassigned_bridge_resources(struct pci_dev *bridge); |
1070 | void pci_assign_unassigned_bus_resources(struct pci_bus *bus); | 1073 | void pci_assign_unassigned_bus_resources(struct pci_bus *bus); |
diff --git a/include/linux/phy/omap_control_phy.h b/include/linux/phy/omap_control_phy.h index e9e6cfbfbb58..eb7d4a135a9e 100644 --- a/include/linux/phy/omap_control_phy.h +++ b/include/linux/phy/omap_control_phy.h | |||
@@ -66,7 +66,7 @@ enum omap_control_usb_mode { | |||
66 | #define OMAP_CTRL_PIPE3_PHY_TX_RX_POWEROFF 0x0 | 66 | #define OMAP_CTRL_PIPE3_PHY_TX_RX_POWEROFF 0x0 |
67 | 67 | ||
68 | #define OMAP_CTRL_PCIE_PCS_MASK 0xff | 68 | #define OMAP_CTRL_PCIE_PCS_MASK 0xff |
69 | #define OMAP_CTRL_PCIE_PCS_DELAY_COUNT_SHIFT 0x8 | 69 | #define OMAP_CTRL_PCIE_PCS_DELAY_COUNT_SHIFT 16 |
70 | 70 | ||
71 | #define OMAP_CTRL_USB2_PHY_PD BIT(28) | 71 | #define OMAP_CTRL_USB2_PHY_PD BIT(28) |
72 | 72 | ||
@@ -79,7 +79,7 @@ enum omap_control_usb_mode { | |||
79 | void omap_control_phy_power(struct device *dev, int on); | 79 | void omap_control_phy_power(struct device *dev, int on); |
80 | void omap_control_usb_set_mode(struct device *dev, | 80 | void omap_control_usb_set_mode(struct device *dev, |
81 | enum omap_control_usb_mode mode); | 81 | enum omap_control_usb_mode mode); |
82 | void omap_control_pcie_pcs(struct device *dev, u8 id, u8 delay); | 82 | void omap_control_pcie_pcs(struct device *dev, u8 delay); |
83 | #else | 83 | #else |
84 | 84 | ||
85 | static inline void omap_control_phy_power(struct device *dev, int on) | 85 | static inline void omap_control_phy_power(struct device *dev, int on) |
@@ -91,7 +91,7 @@ static inline void omap_control_usb_set_mode(struct device *dev, | |||
91 | { | 91 | { |
92 | } | 92 | } |
93 | 93 | ||
94 | static inline void omap_control_pcie_pcs(struct device *dev, u8 id, u8 delay) | 94 | static inline void omap_control_pcie_pcs(struct device *dev, u8 delay) |
95 | { | 95 | { |
96 | } | 96 | } |
97 | #endif | 97 | #endif |
diff --git a/include/linux/printk.h b/include/linux/printk.h index c8f170324e64..4d5bf5726578 100644 --- a/include/linux/printk.h +++ b/include/linux/printk.h | |||
@@ -10,9 +10,6 @@ | |||
10 | extern const char linux_banner[]; | 10 | extern const char linux_banner[]; |
11 | extern const char linux_proc_banner[]; | 11 | extern const char linux_proc_banner[]; |
12 | 12 | ||
13 | extern char *log_buf_addr_get(void); | ||
14 | extern u32 log_buf_len_get(void); | ||
15 | |||
16 | static inline int printk_get_level(const char *buffer) | 13 | static inline int printk_get_level(const char *buffer) |
17 | { | 14 | { |
18 | if (buffer[0] == KERN_SOH_ASCII && buffer[1]) { | 15 | if (buffer[0] == KERN_SOH_ASCII && buffer[1]) { |
@@ -163,6 +160,8 @@ extern int kptr_restrict; | |||
163 | 160 | ||
164 | extern void wake_up_klogd(void); | 161 | extern void wake_up_klogd(void); |
165 | 162 | ||
163 | char *log_buf_addr_get(void); | ||
164 | u32 log_buf_len_get(void); | ||
166 | void log_buf_kexec_setup(void); | 165 | void log_buf_kexec_setup(void); |
167 | void __init setup_log_buf(int early); | 166 | void __init setup_log_buf(int early); |
168 | void dump_stack_set_arch_desc(const char *fmt, ...); | 167 | void dump_stack_set_arch_desc(const char *fmt, ...); |
@@ -198,6 +197,16 @@ static inline void wake_up_klogd(void) | |||
198 | { | 197 | { |
199 | } | 198 | } |
200 | 199 | ||
200 | static inline char *log_buf_addr_get(void) | ||
201 | { | ||
202 | return NULL; | ||
203 | } | ||
204 | |||
205 | static inline u32 log_buf_len_get(void) | ||
206 | { | ||
207 | return 0; | ||
208 | } | ||
209 | |||
201 | static inline void log_buf_kexec_setup(void) | 210 | static inline void log_buf_kexec_setup(void) |
202 | { | 211 | { |
203 | } | 212 | } |
diff --git a/include/linux/time.h b/include/linux/time.h index 203c2ad40d71..beebe3a02d43 100644 --- a/include/linux/time.h +++ b/include/linux/time.h | |||
@@ -110,6 +110,19 @@ static inline bool timespec_valid_strict(const struct timespec *ts) | |||
110 | return true; | 110 | return true; |
111 | } | 111 | } |
112 | 112 | ||
113 | static inline bool timeval_valid(const struct timeval *tv) | ||
114 | { | ||
115 | /* Dates before 1970 are bogus */ | ||
116 | if (tv->tv_sec < 0) | ||
117 | return false; | ||
118 | |||
119 | /* Can't have more microseconds then a second */ | ||
120 | if (tv->tv_usec < 0 || tv->tv_usec >= USEC_PER_SEC) | ||
121 | return false; | ||
122 | |||
123 | return true; | ||
124 | } | ||
125 | |||
113 | extern struct timespec timespec_trunc(struct timespec t, unsigned gran); | 126 | extern struct timespec timespec_trunc(struct timespec t, unsigned gran); |
114 | 127 | ||
115 | #define CURRENT_TIME (current_kernel_time()) | 128 | #define CURRENT_TIME (current_kernel_time()) |
diff --git a/include/net/genetlink.h b/include/net/genetlink.h index d5a9a8b5af37..0574abd3db86 100644 --- a/include/net/genetlink.h +++ b/include/net/genetlink.h | |||
@@ -27,13 +27,18 @@ struct genl_info; | |||
27 | * @maxattr: maximum number of attributes supported | 27 | * @maxattr: maximum number of attributes supported |
28 | * @netnsok: set to true if the family can handle network | 28 | * @netnsok: set to true if the family can handle network |
29 | * namespaces and should be presented in all of them | 29 | * namespaces and should be presented in all of them |
30 | * @parallel_ops: operations can be called in parallel and aren't | ||
31 | * synchronized by the core genetlink code | ||
30 | * @pre_doit: called before an operation's doit callback, it may | 32 | * @pre_doit: called before an operation's doit callback, it may |
31 | * do additional, common, filtering and return an error | 33 | * do additional, common, filtering and return an error |
32 | * @post_doit: called after an operation's doit callback, it may | 34 | * @post_doit: called after an operation's doit callback, it may |
33 | * undo operations done by pre_doit, for example release locks | 35 | * undo operations done by pre_doit, for example release locks |
34 | * @mcast_bind: a socket bound to the given multicast group (which | 36 | * @mcast_bind: a socket bound to the given multicast group (which |
35 | * is given as the offset into the groups array) | 37 | * is given as the offset into the groups array) |
36 | * @mcast_unbind: a socket was unbound from the given multicast group | 38 | * @mcast_unbind: a socket was unbound from the given multicast group. |
39 | * Note that unbind() will not be called symmetrically if the | ||
40 | * generic netlink family is removed while there are still open | ||
41 | * sockets. | ||
37 | * @attrbuf: buffer to store parsed attributes | 42 | * @attrbuf: buffer to store parsed attributes |
38 | * @family_list: family list | 43 | * @family_list: family list |
39 | * @mcgrps: multicast groups used by this family (private) | 44 | * @mcgrps: multicast groups used by this family (private) |
diff --git a/include/net/ip.h b/include/net/ip.h index 0e5a0bae187f..14211eaff17f 100644 --- a/include/net/ip.h +++ b/include/net/ip.h | |||
@@ -39,11 +39,12 @@ struct inet_skb_parm { | |||
39 | struct ip_options opt; /* Compiled IP options */ | 39 | struct ip_options opt; /* Compiled IP options */ |
40 | unsigned char flags; | 40 | unsigned char flags; |
41 | 41 | ||
42 | #define IPSKB_FORWARDED 1 | 42 | #define IPSKB_FORWARDED BIT(0) |
43 | #define IPSKB_XFRM_TUNNEL_SIZE 2 | 43 | #define IPSKB_XFRM_TUNNEL_SIZE BIT(1) |
44 | #define IPSKB_XFRM_TRANSFORMED 4 | 44 | #define IPSKB_XFRM_TRANSFORMED BIT(2) |
45 | #define IPSKB_FRAG_COMPLETE 8 | 45 | #define IPSKB_FRAG_COMPLETE BIT(3) |
46 | #define IPSKB_REROUTED 16 | 46 | #define IPSKB_REROUTED BIT(4) |
47 | #define IPSKB_DOREDIRECT BIT(5) | ||
47 | 48 | ||
48 | u16 frag_max_size; | 49 | u16 frag_max_size; |
49 | }; | 50 | }; |
diff --git a/include/trace/events/kvm.h b/include/trace/events/kvm.h index 6edf1f2028cd..86b399c66c3d 100644 --- a/include/trace/events/kvm.h +++ b/include/trace/events/kvm.h | |||
@@ -146,6 +146,14 @@ TRACE_EVENT(kvm_msi_set_irq, | |||
146 | 146 | ||
147 | #if defined(CONFIG_HAVE_KVM_IRQFD) | 147 | #if defined(CONFIG_HAVE_KVM_IRQFD) |
148 | 148 | ||
149 | #ifdef kvm_irqchips | ||
150 | #define kvm_ack_irq_string "irqchip %s pin %u" | ||
151 | #define kvm_ack_irq_parm __print_symbolic(__entry->irqchip, kvm_irqchips), __entry->pin | ||
152 | #else | ||
153 | #define kvm_ack_irq_string "irqchip %d pin %u" | ||
154 | #define kvm_ack_irq_parm __entry->irqchip, __entry->pin | ||
155 | #endif | ||
156 | |||
149 | TRACE_EVENT(kvm_ack_irq, | 157 | TRACE_EVENT(kvm_ack_irq, |
150 | TP_PROTO(unsigned int irqchip, unsigned int pin), | 158 | TP_PROTO(unsigned int irqchip, unsigned int pin), |
151 | TP_ARGS(irqchip, pin), | 159 | TP_ARGS(irqchip, pin), |
@@ -160,13 +168,7 @@ TRACE_EVENT(kvm_ack_irq, | |||
160 | __entry->pin = pin; | 168 | __entry->pin = pin; |
161 | ), | 169 | ), |
162 | 170 | ||
163 | #ifdef kvm_irqchips | 171 | TP_printk(kvm_ack_irq_string, kvm_ack_irq_parm) |
164 | TP_printk("irqchip %s pin %u", | ||
165 | __print_symbolic(__entry->irqchip, kvm_irqchips), | ||
166 | __entry->pin) | ||
167 | #else | ||
168 | TP_printk("irqchip %d pin %u", __entry->irqchip, __entry->pin) | ||
169 | #endif | ||
170 | ); | 172 | ); |
171 | 173 | ||
172 | #endif /* defined(CONFIG_HAVE_KVM_IRQFD) */ | 174 | #endif /* defined(CONFIG_HAVE_KVM_IRQFD) */ |
diff --git a/include/uapi/linux/can/netlink.h b/include/uapi/linux/can/netlink.h index 3e4323a3918d..94ffe0c83ce7 100644 --- a/include/uapi/linux/can/netlink.h +++ b/include/uapi/linux/can/netlink.h | |||
@@ -98,6 +98,7 @@ struct can_ctrlmode { | |||
98 | #define CAN_CTRLMODE_BERR_REPORTING 0x10 /* Bus-error reporting */ | 98 | #define CAN_CTRLMODE_BERR_REPORTING 0x10 /* Bus-error reporting */ |
99 | #define CAN_CTRLMODE_FD 0x20 /* CAN FD mode */ | 99 | #define CAN_CTRLMODE_FD 0x20 /* CAN FD mode */ |
100 | #define CAN_CTRLMODE_PRESUME_ACK 0x40 /* Ignore missing CAN ACKs */ | 100 | #define CAN_CTRLMODE_PRESUME_ACK 0x40 /* Ignore missing CAN ACKs */ |
101 | #define CAN_CTRLMODE_FD_NON_ISO 0x80 /* CAN FD in non-ISO mode */ | ||
101 | 102 | ||
102 | /* | 103 | /* |
103 | * CAN device statistics | 104 | * CAN device statistics |
diff --git a/include/uapi/linux/uinput.h b/include/uapi/linux/uinput.h index baeab83deb64..013c9d8db372 100644 --- a/include/uapi/linux/uinput.h +++ b/include/uapi/linux/uinput.h | |||
@@ -82,7 +82,7 @@ struct uinput_ff_erase { | |||
82 | * The complete sysfs path is then /sys/devices/virtual/input/--NAME-- | 82 | * The complete sysfs path is then /sys/devices/virtual/input/--NAME-- |
83 | * Usually, it is in the form "inputN" | 83 | * Usually, it is in the form "inputN" |
84 | */ | 84 | */ |
85 | #define UI_GET_SYSNAME(len) _IOC(_IOC_READ, UINPUT_IOCTL_BASE, 300, len) | 85 | #define UI_GET_SYSNAME(len) _IOC(_IOC_READ, UINPUT_IOCTL_BASE, 44, len) |
86 | 86 | ||
87 | /** | 87 | /** |
88 | * UI_GET_VERSION - Return version of uinput protocol | 88 | * UI_GET_VERSION - Return version of uinput protocol |
@@ -91,7 +91,7 @@ struct uinput_ff_erase { | |||
91 | * the integer pointed to by the ioctl argument. The protocol version | 91 | * the integer pointed to by the ioctl argument. The protocol version |
92 | * is hard-coded in the kernel and is independent of the uinput device. | 92 | * is hard-coded in the kernel and is independent of the uinput device. |
93 | */ | 93 | */ |
94 | #define UI_GET_VERSION _IOR(UINPUT_IOCTL_BASE, 301, unsigned int) | 94 | #define UI_GET_VERSION _IOR(UINPUT_IOCTL_BASE, 45, unsigned int) |
95 | 95 | ||
96 | /* | 96 | /* |
97 | * To write a force-feedback-capable driver, the upload_effect | 97 | * To write a force-feedback-capable driver, the upload_effect |
diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c index d6594e457a25..a64e7a207d2b 100644 --- a/kernel/bpf/core.c +++ b/kernel/bpf/core.c | |||
@@ -163,7 +163,7 @@ bpf_jit_binary_alloc(unsigned int proglen, u8 **image_ptr, | |||
163 | 163 | ||
164 | void bpf_jit_binary_free(struct bpf_binary_header *hdr) | 164 | void bpf_jit_binary_free(struct bpf_binary_header *hdr) |
165 | { | 165 | { |
166 | module_free(NULL, hdr); | 166 | module_memfree(hdr); |
167 | } | 167 | } |
168 | #endif /* CONFIG_BPF_JIT */ | 168 | #endif /* CONFIG_BPF_JIT */ |
169 | 169 | ||
diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index 088ac0b1b106..536edc2be307 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c | |||
@@ -150,7 +150,7 @@ static int map_lookup_elem(union bpf_attr *attr) | |||
150 | int ufd = attr->map_fd; | 150 | int ufd = attr->map_fd; |
151 | struct fd f = fdget(ufd); | 151 | struct fd f = fdget(ufd); |
152 | struct bpf_map *map; | 152 | struct bpf_map *map; |
153 | void *key, *value; | 153 | void *key, *value, *ptr; |
154 | int err; | 154 | int err; |
155 | 155 | ||
156 | if (CHECK_ATTR(BPF_MAP_LOOKUP_ELEM)) | 156 | if (CHECK_ATTR(BPF_MAP_LOOKUP_ELEM)) |
@@ -169,20 +169,29 @@ static int map_lookup_elem(union bpf_attr *attr) | |||
169 | if (copy_from_user(key, ukey, map->key_size) != 0) | 169 | if (copy_from_user(key, ukey, map->key_size) != 0) |
170 | goto free_key; | 170 | goto free_key; |
171 | 171 | ||
172 | err = -ENOENT; | 172 | err = -ENOMEM; |
173 | rcu_read_lock(); | 173 | value = kmalloc(map->value_size, GFP_USER); |
174 | value = map->ops->map_lookup_elem(map, key); | ||
175 | if (!value) | 174 | if (!value) |
176 | goto err_unlock; | 175 | goto free_key; |
176 | |||
177 | rcu_read_lock(); | ||
178 | ptr = map->ops->map_lookup_elem(map, key); | ||
179 | if (ptr) | ||
180 | memcpy(value, ptr, map->value_size); | ||
181 | rcu_read_unlock(); | ||
182 | |||
183 | err = -ENOENT; | ||
184 | if (!ptr) | ||
185 | goto free_value; | ||
177 | 186 | ||
178 | err = -EFAULT; | 187 | err = -EFAULT; |
179 | if (copy_to_user(uvalue, value, map->value_size) != 0) | 188 | if (copy_to_user(uvalue, value, map->value_size) != 0) |
180 | goto err_unlock; | 189 | goto free_value; |
181 | 190 | ||
182 | err = 0; | 191 | err = 0; |
183 | 192 | ||
184 | err_unlock: | 193 | free_value: |
185 | rcu_read_unlock(); | 194 | kfree(value); |
186 | free_key: | 195 | free_key: |
187 | kfree(key); | 196 | kfree(key); |
188 | err_put: | 197 | err_put: |
diff --git a/kernel/cgroup.c b/kernel/cgroup.c index bb263d0caab3..04cfe8ace520 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c | |||
@@ -1909,7 +1909,7 @@ static void cgroup_kill_sb(struct super_block *sb) | |||
1909 | * | 1909 | * |
1910 | * And don't kill the default root. | 1910 | * And don't kill the default root. |
1911 | */ | 1911 | */ |
1912 | if (css_has_online_children(&root->cgrp.self) || | 1912 | if (!list_empty(&root->cgrp.self.children) || |
1913 | root == &cgrp_dfl_root) | 1913 | root == &cgrp_dfl_root) |
1914 | cgroup_put(&root->cgrp); | 1914 | cgroup_put(&root->cgrp); |
1915 | else | 1915 | else |
diff --git a/kernel/debug/kdb/kdb_main.c b/kernel/debug/kdb/kdb_main.c index f191bddf64b8..7b40c5f07dce 100644 --- a/kernel/debug/kdb/kdb_main.c +++ b/kernel/debug/kdb/kdb_main.c | |||
@@ -2023,7 +2023,7 @@ static int kdb_lsmod(int argc, const char **argv) | |||
2023 | kdb_printf("%-20s%8u 0x%p ", mod->name, | 2023 | kdb_printf("%-20s%8u 0x%p ", mod->name, |
2024 | mod->core_size, (void *)mod); | 2024 | mod->core_size, (void *)mod); |
2025 | #ifdef CONFIG_MODULE_UNLOAD | 2025 | #ifdef CONFIG_MODULE_UNLOAD |
2026 | kdb_printf("%4ld ", module_refcount(mod)); | 2026 | kdb_printf("%4d ", module_refcount(mod)); |
2027 | #endif | 2027 | #endif |
2028 | if (mod->state == MODULE_STATE_GOING) | 2028 | if (mod->state == MODULE_STATE_GOING) |
2029 | kdb_printf(" (Unloading)"); | 2029 | kdb_printf(" (Unloading)"); |
diff --git a/kernel/kprobes.c b/kernel/kprobes.c index 06f58309fed2..ee619929cf90 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c | |||
@@ -127,7 +127,7 @@ static void *alloc_insn_page(void) | |||
127 | 127 | ||
128 | static void free_insn_page(void *page) | 128 | static void free_insn_page(void *page) |
129 | { | 129 | { |
130 | module_free(NULL, page); | 130 | module_memfree(page); |
131 | } | 131 | } |
132 | 132 | ||
133 | struct kprobe_insn_cache kprobe_insn_slots = { | 133 | struct kprobe_insn_cache kprobe_insn_slots = { |
diff --git a/kernel/module.c b/kernel/module.c index 3965511ae133..d856e96a3cce 100644 --- a/kernel/module.c +++ b/kernel/module.c | |||
@@ -772,9 +772,18 @@ static int try_stop_module(struct module *mod, int flags, int *forced) | |||
772 | return 0; | 772 | return 0; |
773 | } | 773 | } |
774 | 774 | ||
775 | unsigned long module_refcount(struct module *mod) | 775 | /** |
776 | * module_refcount - return the refcount or -1 if unloading | ||
777 | * | ||
778 | * @mod: the module we're checking | ||
779 | * | ||
780 | * Returns: | ||
781 | * -1 if the module is in the process of unloading | ||
782 | * otherwise the number of references in the kernel to the module | ||
783 | */ | ||
784 | int module_refcount(struct module *mod) | ||
776 | { | 785 | { |
777 | return (unsigned long)atomic_read(&mod->refcnt) - MODULE_REF_BASE; | 786 | return atomic_read(&mod->refcnt) - MODULE_REF_BASE; |
778 | } | 787 | } |
779 | EXPORT_SYMBOL(module_refcount); | 788 | EXPORT_SYMBOL(module_refcount); |
780 | 789 | ||
@@ -856,7 +865,7 @@ static inline void print_unload_info(struct seq_file *m, struct module *mod) | |||
856 | struct module_use *use; | 865 | struct module_use *use; |
857 | int printed_something = 0; | 866 | int printed_something = 0; |
858 | 867 | ||
859 | seq_printf(m, " %lu ", module_refcount(mod)); | 868 | seq_printf(m, " %i ", module_refcount(mod)); |
860 | 869 | ||
861 | /* | 870 | /* |
862 | * Always include a trailing , so userspace can differentiate | 871 | * Always include a trailing , so userspace can differentiate |
@@ -908,7 +917,7 @@ EXPORT_SYMBOL_GPL(symbol_put_addr); | |||
908 | static ssize_t show_refcnt(struct module_attribute *mattr, | 917 | static ssize_t show_refcnt(struct module_attribute *mattr, |
909 | struct module_kobject *mk, char *buffer) | 918 | struct module_kobject *mk, char *buffer) |
910 | { | 919 | { |
911 | return sprintf(buffer, "%lu\n", module_refcount(mk->mod)); | 920 | return sprintf(buffer, "%i\n", module_refcount(mk->mod)); |
912 | } | 921 | } |
913 | 922 | ||
914 | static struct module_attribute modinfo_refcnt = | 923 | static struct module_attribute modinfo_refcnt = |
@@ -1795,7 +1804,7 @@ static void unset_module_core_ro_nx(struct module *mod) { } | |||
1795 | static void unset_module_init_ro_nx(struct module *mod) { } | 1804 | static void unset_module_init_ro_nx(struct module *mod) { } |
1796 | #endif | 1805 | #endif |
1797 | 1806 | ||
1798 | void __weak module_free(struct module *mod, void *module_region) | 1807 | void __weak module_memfree(void *module_region) |
1799 | { | 1808 | { |
1800 | vfree(module_region); | 1809 | vfree(module_region); |
1801 | } | 1810 | } |
@@ -1804,6 +1813,10 @@ void __weak module_arch_cleanup(struct module *mod) | |||
1804 | { | 1813 | { |
1805 | } | 1814 | } |
1806 | 1815 | ||
1816 | void __weak module_arch_freeing_init(struct module *mod) | ||
1817 | { | ||
1818 | } | ||
1819 | |||
1807 | /* Free a module, remove from lists, etc. */ | 1820 | /* Free a module, remove from lists, etc. */ |
1808 | static void free_module(struct module *mod) | 1821 | static void free_module(struct module *mod) |
1809 | { | 1822 | { |
@@ -1841,7 +1854,8 @@ static void free_module(struct module *mod) | |||
1841 | 1854 | ||
1842 | /* This may be NULL, but that's OK */ | 1855 | /* This may be NULL, but that's OK */ |
1843 | unset_module_init_ro_nx(mod); | 1856 | unset_module_init_ro_nx(mod); |
1844 | module_free(mod, mod->module_init); | 1857 | module_arch_freeing_init(mod); |
1858 | module_memfree(mod->module_init); | ||
1845 | kfree(mod->args); | 1859 | kfree(mod->args); |
1846 | percpu_modfree(mod); | 1860 | percpu_modfree(mod); |
1847 | 1861 | ||
@@ -1850,7 +1864,7 @@ static void free_module(struct module *mod) | |||
1850 | 1864 | ||
1851 | /* Finally, free the core (containing the module structure) */ | 1865 | /* Finally, free the core (containing the module structure) */ |
1852 | unset_module_core_ro_nx(mod); | 1866 | unset_module_core_ro_nx(mod); |
1853 | module_free(mod, mod->module_core); | 1867 | module_memfree(mod->module_core); |
1854 | 1868 | ||
1855 | #ifdef CONFIG_MPU | 1869 | #ifdef CONFIG_MPU |
1856 | update_protections(current->mm); | 1870 | update_protections(current->mm); |
@@ -2785,7 +2799,7 @@ static int move_module(struct module *mod, struct load_info *info) | |||
2785 | */ | 2799 | */ |
2786 | kmemleak_ignore(ptr); | 2800 | kmemleak_ignore(ptr); |
2787 | if (!ptr) { | 2801 | if (!ptr) { |
2788 | module_free(mod, mod->module_core); | 2802 | module_memfree(mod->module_core); |
2789 | return -ENOMEM; | 2803 | return -ENOMEM; |
2790 | } | 2804 | } |
2791 | memset(ptr, 0, mod->init_size); | 2805 | memset(ptr, 0, mod->init_size); |
@@ -2930,8 +2944,9 @@ static struct module *layout_and_allocate(struct load_info *info, int flags) | |||
2930 | static void module_deallocate(struct module *mod, struct load_info *info) | 2944 | static void module_deallocate(struct module *mod, struct load_info *info) |
2931 | { | 2945 | { |
2932 | percpu_modfree(mod); | 2946 | percpu_modfree(mod); |
2933 | module_free(mod, mod->module_init); | 2947 | module_arch_freeing_init(mod); |
2934 | module_free(mod, mod->module_core); | 2948 | module_memfree(mod->module_init); |
2949 | module_memfree(mod->module_core); | ||
2935 | } | 2950 | } |
2936 | 2951 | ||
2937 | int __weak module_finalize(const Elf_Ehdr *hdr, | 2952 | int __weak module_finalize(const Elf_Ehdr *hdr, |
@@ -2983,10 +2998,31 @@ static void do_mod_ctors(struct module *mod) | |||
2983 | #endif | 2998 | #endif |
2984 | } | 2999 | } |
2985 | 3000 | ||
3001 | /* For freeing module_init on success, in case kallsyms traversing */ | ||
3002 | struct mod_initfree { | ||
3003 | struct rcu_head rcu; | ||
3004 | void *module_init; | ||
3005 | }; | ||
3006 | |||
3007 | static void do_free_init(struct rcu_head *head) | ||
3008 | { | ||
3009 | struct mod_initfree *m = container_of(head, struct mod_initfree, rcu); | ||
3010 | module_memfree(m->module_init); | ||
3011 | kfree(m); | ||
3012 | } | ||
3013 | |||
2986 | /* This is where the real work happens */ | 3014 | /* This is where the real work happens */ |
2987 | static int do_init_module(struct module *mod) | 3015 | static int do_init_module(struct module *mod) |
2988 | { | 3016 | { |
2989 | int ret = 0; | 3017 | int ret = 0; |
3018 | struct mod_initfree *freeinit; | ||
3019 | |||
3020 | freeinit = kmalloc(sizeof(*freeinit), GFP_KERNEL); | ||
3021 | if (!freeinit) { | ||
3022 | ret = -ENOMEM; | ||
3023 | goto fail; | ||
3024 | } | ||
3025 | freeinit->module_init = mod->module_init; | ||
2990 | 3026 | ||
2991 | /* | 3027 | /* |
2992 | * We want to find out whether @mod uses async during init. Clear | 3028 | * We want to find out whether @mod uses async during init. Clear |
@@ -2999,18 +3035,7 @@ static int do_init_module(struct module *mod) | |||
2999 | if (mod->init != NULL) | 3035 | if (mod->init != NULL) |
3000 | ret = do_one_initcall(mod->init); | 3036 | ret = do_one_initcall(mod->init); |
3001 | if (ret < 0) { | 3037 | if (ret < 0) { |
3002 | /* | 3038 | goto fail_free_freeinit; |
3003 | * Init routine failed: abort. Try to protect us from | ||
3004 | * buggy refcounters. | ||
3005 | */ | ||
3006 | mod->state = MODULE_STATE_GOING; | ||
3007 | synchronize_sched(); | ||
3008 | module_put(mod); | ||
3009 | blocking_notifier_call_chain(&module_notify_list, | ||
3010 | MODULE_STATE_GOING, mod); | ||
3011 | free_module(mod); | ||
3012 | wake_up_all(&module_wq); | ||
3013 | return ret; | ||
3014 | } | 3039 | } |
3015 | if (ret > 0) { | 3040 | if (ret > 0) { |
3016 | pr_warn("%s: '%s'->init suspiciously returned %d, it should " | 3041 | pr_warn("%s: '%s'->init suspiciously returned %d, it should " |
@@ -3055,15 +3080,35 @@ static int do_init_module(struct module *mod) | |||
3055 | mod->strtab = mod->core_strtab; | 3080 | mod->strtab = mod->core_strtab; |
3056 | #endif | 3081 | #endif |
3057 | unset_module_init_ro_nx(mod); | 3082 | unset_module_init_ro_nx(mod); |
3058 | module_free(mod, mod->module_init); | 3083 | module_arch_freeing_init(mod); |
3059 | mod->module_init = NULL; | 3084 | mod->module_init = NULL; |
3060 | mod->init_size = 0; | 3085 | mod->init_size = 0; |
3061 | mod->init_ro_size = 0; | 3086 | mod->init_ro_size = 0; |
3062 | mod->init_text_size = 0; | 3087 | mod->init_text_size = 0; |
3088 | /* | ||
3089 | * We want to free module_init, but be aware that kallsyms may be | ||
3090 | * walking this with preempt disabled. In all the failure paths, | ||
3091 | * we call synchronize_rcu/synchronize_sched, but we don't want | ||
3092 | * to slow down the success path, so use actual RCU here. | ||
3093 | */ | ||
3094 | call_rcu(&freeinit->rcu, do_free_init); | ||
3063 | mutex_unlock(&module_mutex); | 3095 | mutex_unlock(&module_mutex); |
3064 | wake_up_all(&module_wq); | 3096 | wake_up_all(&module_wq); |
3065 | 3097 | ||
3066 | return 0; | 3098 | return 0; |
3099 | |||
3100 | fail_free_freeinit: | ||
3101 | kfree(freeinit); | ||
3102 | fail: | ||
3103 | /* Try to protect us from buggy refcounters. */ | ||
3104 | mod->state = MODULE_STATE_GOING; | ||
3105 | synchronize_sched(); | ||
3106 | module_put(mod); | ||
3107 | blocking_notifier_call_chain(&module_notify_list, | ||
3108 | MODULE_STATE_GOING, mod); | ||
3109 | free_module(mod); | ||
3110 | wake_up_all(&module_wq); | ||
3111 | return ret; | ||
3067 | } | 3112 | } |
3068 | 3113 | ||
3069 | static int may_init_module(void) | 3114 | static int may_init_module(void) |
diff --git a/kernel/params.c b/kernel/params.c index 0af9b2c4e56c..728e05b167de 100644 --- a/kernel/params.c +++ b/kernel/params.c | |||
@@ -642,12 +642,15 @@ static __modinit int add_sysfs_param(struct module_kobject *mk, | |||
642 | mk->mp->grp.attrs = new_attrs; | 642 | mk->mp->grp.attrs = new_attrs; |
643 | 643 | ||
644 | /* Tack new one on the end. */ | 644 | /* Tack new one on the end. */ |
645 | memset(&mk->mp->attrs[mk->mp->num], 0, sizeof(mk->mp->attrs[0])); | ||
645 | sysfs_attr_init(&mk->mp->attrs[mk->mp->num].mattr.attr); | 646 | sysfs_attr_init(&mk->mp->attrs[mk->mp->num].mattr.attr); |
646 | mk->mp->attrs[mk->mp->num].param = kp; | 647 | mk->mp->attrs[mk->mp->num].param = kp; |
647 | mk->mp->attrs[mk->mp->num].mattr.show = param_attr_show; | 648 | mk->mp->attrs[mk->mp->num].mattr.show = param_attr_show; |
648 | /* Do not allow runtime DAC changes to make param writable. */ | 649 | /* Do not allow runtime DAC changes to make param writable. */ |
649 | if ((kp->perm & (S_IWUSR | S_IWGRP | S_IWOTH)) != 0) | 650 | if ((kp->perm & (S_IWUSR | S_IWGRP | S_IWOTH)) != 0) |
650 | mk->mp->attrs[mk->mp->num].mattr.store = param_attr_store; | 651 | mk->mp->attrs[mk->mp->num].mattr.store = param_attr_store; |
652 | else | ||
653 | mk->mp->attrs[mk->mp->num].mattr.store = NULL; | ||
651 | mk->mp->attrs[mk->mp->num].mattr.attr.name = (char *)name; | 654 | mk->mp->attrs[mk->mp->num].mattr.attr.name = (char *)name; |
652 | mk->mp->attrs[mk->mp->num].mattr.attr.mode = kp->perm; | 655 | mk->mp->attrs[mk->mp->num].mattr.attr.mode = kp->perm; |
653 | mk->mp->num++; | 656 | mk->mp->num++; |
diff --git a/kernel/range.c b/kernel/range.c index 322ea8e93e4b..82cfc285b046 100644 --- a/kernel/range.c +++ b/kernel/range.c | |||
@@ -113,12 +113,12 @@ static int cmp_range(const void *x1, const void *x2) | |||
113 | { | 113 | { |
114 | const struct range *r1 = x1; | 114 | const struct range *r1 = x1; |
115 | const struct range *r2 = x2; | 115 | const struct range *r2 = x2; |
116 | s64 start1, start2; | ||
117 | 116 | ||
118 | start1 = r1->start; | 117 | if (r1->start < r2->start) |
119 | start2 = r2->start; | 118 | return -1; |
120 | 119 | if (r1->start > r2->start) | |
121 | return start1 - start2; | 120 | return 1; |
121 | return 0; | ||
122 | } | 122 | } |
123 | 123 | ||
124 | int clean_sort_range(struct range *range, int az) | 124 | int clean_sort_range(struct range *range, int az) |
diff --git a/kernel/sys.c b/kernel/sys.c index a8c9f5a7dda6..ea9c88109894 100644 --- a/kernel/sys.c +++ b/kernel/sys.c | |||
@@ -2210,9 +2210,13 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3, | |||
2210 | up_write(&me->mm->mmap_sem); | 2210 | up_write(&me->mm->mmap_sem); |
2211 | break; | 2211 | break; |
2212 | case PR_MPX_ENABLE_MANAGEMENT: | 2212 | case PR_MPX_ENABLE_MANAGEMENT: |
2213 | if (arg2 || arg3 || arg4 || arg5) | ||
2214 | return -EINVAL; | ||
2213 | error = MPX_ENABLE_MANAGEMENT(me); | 2215 | error = MPX_ENABLE_MANAGEMENT(me); |
2214 | break; | 2216 | break; |
2215 | case PR_MPX_DISABLE_MANAGEMENT: | 2217 | case PR_MPX_DISABLE_MANAGEMENT: |
2218 | if (arg2 || arg3 || arg4 || arg5) | ||
2219 | return -EINVAL; | ||
2216 | error = MPX_DISABLE_MANAGEMENT(me); | 2220 | error = MPX_DISABLE_MANAGEMENT(me); |
2217 | break; | 2221 | break; |
2218 | default: | 2222 | default: |
diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c index 87a346fd6d61..28bf91c60a0b 100644 --- a/kernel/time/ntp.c +++ b/kernel/time/ntp.c | |||
@@ -633,6 +633,13 @@ int ntp_validate_timex(struct timex *txc) | |||
633 | if ((txc->modes & ADJ_SETOFFSET) && (!capable(CAP_SYS_TIME))) | 633 | if ((txc->modes & ADJ_SETOFFSET) && (!capable(CAP_SYS_TIME))) |
634 | return -EPERM; | 634 | return -EPERM; |
635 | 635 | ||
636 | if (txc->modes & ADJ_FREQUENCY) { | ||
637 | if (LONG_MIN / PPM_SCALE > txc->freq) | ||
638 | return -EINVAL; | ||
639 | if (LONG_MAX / PPM_SCALE < txc->freq) | ||
640 | return -EINVAL; | ||
641 | } | ||
642 | |||
636 | return 0; | 643 | return 0; |
637 | } | 644 | } |
638 | 645 | ||
diff --git a/kernel/time/time.c b/kernel/time/time.c index 6390517e77d4..2c85b7724af4 100644 --- a/kernel/time/time.c +++ b/kernel/time/time.c | |||
@@ -196,6 +196,10 @@ SYSCALL_DEFINE2(settimeofday, struct timeval __user *, tv, | |||
196 | if (tv) { | 196 | if (tv) { |
197 | if (copy_from_user(&user_tv, tv, sizeof(*tv))) | 197 | if (copy_from_user(&user_tv, tv, sizeof(*tv))) |
198 | return -EFAULT; | 198 | return -EFAULT; |
199 | |||
200 | if (!timeval_valid(&user_tv)) | ||
201 | return -EINVAL; | ||
202 | |||
199 | new_ts.tv_sec = user_tv.tv_sec; | 203 | new_ts.tv_sec = user_tv.tv_sec; |
200 | new_ts.tv_nsec = user_tv.tv_usec * NSEC_PER_USEC; | 204 | new_ts.tv_nsec = user_tv.tv_usec * NSEC_PER_USEC; |
201 | } | 205 | } |
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 929a733d302e..224e768bdc73 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c | |||
@@ -2497,12 +2497,14 @@ static void ftrace_run_update_code(int command) | |||
2497 | } | 2497 | } |
2498 | 2498 | ||
2499 | static void ftrace_run_modify_code(struct ftrace_ops *ops, int command, | 2499 | static void ftrace_run_modify_code(struct ftrace_ops *ops, int command, |
2500 | struct ftrace_hash *old_hash) | 2500 | struct ftrace_ops_hash *old_hash) |
2501 | { | 2501 | { |
2502 | ops->flags |= FTRACE_OPS_FL_MODIFYING; | 2502 | ops->flags |= FTRACE_OPS_FL_MODIFYING; |
2503 | ops->old_hash.filter_hash = old_hash; | 2503 | ops->old_hash.filter_hash = old_hash->filter_hash; |
2504 | ops->old_hash.notrace_hash = old_hash->notrace_hash; | ||
2504 | ftrace_run_update_code(command); | 2505 | ftrace_run_update_code(command); |
2505 | ops->old_hash.filter_hash = NULL; | 2506 | ops->old_hash.filter_hash = NULL; |
2507 | ops->old_hash.notrace_hash = NULL; | ||
2506 | ops->flags &= ~FTRACE_OPS_FL_MODIFYING; | 2508 | ops->flags &= ~FTRACE_OPS_FL_MODIFYING; |
2507 | } | 2509 | } |
2508 | 2510 | ||
@@ -3579,7 +3581,7 @@ static struct ftrace_ops trace_probe_ops __read_mostly = | |||
3579 | 3581 | ||
3580 | static int ftrace_probe_registered; | 3582 | static int ftrace_probe_registered; |
3581 | 3583 | ||
3582 | static void __enable_ftrace_function_probe(struct ftrace_hash *old_hash) | 3584 | static void __enable_ftrace_function_probe(struct ftrace_ops_hash *old_hash) |
3583 | { | 3585 | { |
3584 | int ret; | 3586 | int ret; |
3585 | int i; | 3587 | int i; |
@@ -3637,6 +3639,7 @@ int | |||
3637 | register_ftrace_function_probe(char *glob, struct ftrace_probe_ops *ops, | 3639 | register_ftrace_function_probe(char *glob, struct ftrace_probe_ops *ops, |
3638 | void *data) | 3640 | void *data) |
3639 | { | 3641 | { |
3642 | struct ftrace_ops_hash old_hash_ops; | ||
3640 | struct ftrace_func_probe *entry; | 3643 | struct ftrace_func_probe *entry; |
3641 | struct ftrace_hash **orig_hash = &trace_probe_ops.func_hash->filter_hash; | 3644 | struct ftrace_hash **orig_hash = &trace_probe_ops.func_hash->filter_hash; |
3642 | struct ftrace_hash *old_hash = *orig_hash; | 3645 | struct ftrace_hash *old_hash = *orig_hash; |
@@ -3658,6 +3661,10 @@ register_ftrace_function_probe(char *glob, struct ftrace_probe_ops *ops, | |||
3658 | 3661 | ||
3659 | mutex_lock(&trace_probe_ops.func_hash->regex_lock); | 3662 | mutex_lock(&trace_probe_ops.func_hash->regex_lock); |
3660 | 3663 | ||
3664 | old_hash_ops.filter_hash = old_hash; | ||
3665 | /* Probes only have filters */ | ||
3666 | old_hash_ops.notrace_hash = NULL; | ||
3667 | |||
3661 | hash = alloc_and_copy_ftrace_hash(FTRACE_HASH_DEFAULT_BITS, old_hash); | 3668 | hash = alloc_and_copy_ftrace_hash(FTRACE_HASH_DEFAULT_BITS, old_hash); |
3662 | if (!hash) { | 3669 | if (!hash) { |
3663 | count = -ENOMEM; | 3670 | count = -ENOMEM; |
@@ -3718,7 +3725,7 @@ register_ftrace_function_probe(char *glob, struct ftrace_probe_ops *ops, | |||
3718 | 3725 | ||
3719 | ret = ftrace_hash_move(&trace_probe_ops, 1, orig_hash, hash); | 3726 | ret = ftrace_hash_move(&trace_probe_ops, 1, orig_hash, hash); |
3720 | 3727 | ||
3721 | __enable_ftrace_function_probe(old_hash); | 3728 | __enable_ftrace_function_probe(&old_hash_ops); |
3722 | 3729 | ||
3723 | if (!ret) | 3730 | if (!ret) |
3724 | free_ftrace_hash_rcu(old_hash); | 3731 | free_ftrace_hash_rcu(old_hash); |
@@ -4006,10 +4013,34 @@ ftrace_match_addr(struct ftrace_hash *hash, unsigned long ip, int remove) | |||
4006 | } | 4013 | } |
4007 | 4014 | ||
4008 | static void ftrace_ops_update_code(struct ftrace_ops *ops, | 4015 | static void ftrace_ops_update_code(struct ftrace_ops *ops, |
4009 | struct ftrace_hash *old_hash) | 4016 | struct ftrace_ops_hash *old_hash) |
4010 | { | 4017 | { |
4011 | if (ops->flags & FTRACE_OPS_FL_ENABLED && ftrace_enabled) | 4018 | struct ftrace_ops *op; |
4019 | |||
4020 | if (!ftrace_enabled) | ||
4021 | return; | ||
4022 | |||
4023 | if (ops->flags & FTRACE_OPS_FL_ENABLED) { | ||
4012 | ftrace_run_modify_code(ops, FTRACE_UPDATE_CALLS, old_hash); | 4024 | ftrace_run_modify_code(ops, FTRACE_UPDATE_CALLS, old_hash); |
4025 | return; | ||
4026 | } | ||
4027 | |||
4028 | /* | ||
4029 | * If this is the shared global_ops filter, then we need to | ||
4030 | * check if there is another ops that shares it, is enabled. | ||
4031 | * If so, we still need to run the modify code. | ||
4032 | */ | ||
4033 | if (ops->func_hash != &global_ops.local_hash) | ||
4034 | return; | ||
4035 | |||
4036 | do_for_each_ftrace_op(op, ftrace_ops_list) { | ||
4037 | if (op->func_hash == &global_ops.local_hash && | ||
4038 | op->flags & FTRACE_OPS_FL_ENABLED) { | ||
4039 | ftrace_run_modify_code(op, FTRACE_UPDATE_CALLS, old_hash); | ||
4040 | /* Only need to do this once */ | ||
4041 | return; | ||
4042 | } | ||
4043 | } while_for_each_ftrace_op(op); | ||
4013 | } | 4044 | } |
4014 | 4045 | ||
4015 | static int | 4046 | static int |
@@ -4017,6 +4048,7 @@ ftrace_set_hash(struct ftrace_ops *ops, unsigned char *buf, int len, | |||
4017 | unsigned long ip, int remove, int reset, int enable) | 4048 | unsigned long ip, int remove, int reset, int enable) |
4018 | { | 4049 | { |
4019 | struct ftrace_hash **orig_hash; | 4050 | struct ftrace_hash **orig_hash; |
4051 | struct ftrace_ops_hash old_hash_ops; | ||
4020 | struct ftrace_hash *old_hash; | 4052 | struct ftrace_hash *old_hash; |
4021 | struct ftrace_hash *hash; | 4053 | struct ftrace_hash *hash; |
4022 | int ret; | 4054 | int ret; |
@@ -4053,9 +4085,11 @@ ftrace_set_hash(struct ftrace_ops *ops, unsigned char *buf, int len, | |||
4053 | 4085 | ||
4054 | mutex_lock(&ftrace_lock); | 4086 | mutex_lock(&ftrace_lock); |
4055 | old_hash = *orig_hash; | 4087 | old_hash = *orig_hash; |
4088 | old_hash_ops.filter_hash = ops->func_hash->filter_hash; | ||
4089 | old_hash_ops.notrace_hash = ops->func_hash->notrace_hash; | ||
4056 | ret = ftrace_hash_move(ops, enable, orig_hash, hash); | 4090 | ret = ftrace_hash_move(ops, enable, orig_hash, hash); |
4057 | if (!ret) { | 4091 | if (!ret) { |
4058 | ftrace_ops_update_code(ops, old_hash); | 4092 | ftrace_ops_update_code(ops, &old_hash_ops); |
4059 | free_ftrace_hash_rcu(old_hash); | 4093 | free_ftrace_hash_rcu(old_hash); |
4060 | } | 4094 | } |
4061 | mutex_unlock(&ftrace_lock); | 4095 | mutex_unlock(&ftrace_lock); |
@@ -4267,6 +4301,7 @@ static void __init set_ftrace_early_filters(void) | |||
4267 | int ftrace_regex_release(struct inode *inode, struct file *file) | 4301 | int ftrace_regex_release(struct inode *inode, struct file *file) |
4268 | { | 4302 | { |
4269 | struct seq_file *m = (struct seq_file *)file->private_data; | 4303 | struct seq_file *m = (struct seq_file *)file->private_data; |
4304 | struct ftrace_ops_hash old_hash_ops; | ||
4270 | struct ftrace_iterator *iter; | 4305 | struct ftrace_iterator *iter; |
4271 | struct ftrace_hash **orig_hash; | 4306 | struct ftrace_hash **orig_hash; |
4272 | struct ftrace_hash *old_hash; | 4307 | struct ftrace_hash *old_hash; |
@@ -4300,10 +4335,12 @@ int ftrace_regex_release(struct inode *inode, struct file *file) | |||
4300 | 4335 | ||
4301 | mutex_lock(&ftrace_lock); | 4336 | mutex_lock(&ftrace_lock); |
4302 | old_hash = *orig_hash; | 4337 | old_hash = *orig_hash; |
4338 | old_hash_ops.filter_hash = iter->ops->func_hash->filter_hash; | ||
4339 | old_hash_ops.notrace_hash = iter->ops->func_hash->notrace_hash; | ||
4303 | ret = ftrace_hash_move(iter->ops, filter_hash, | 4340 | ret = ftrace_hash_move(iter->ops, filter_hash, |
4304 | orig_hash, iter->hash); | 4341 | orig_hash, iter->hash); |
4305 | if (!ret) { | 4342 | if (!ret) { |
4306 | ftrace_ops_update_code(iter->ops, old_hash); | 4343 | ftrace_ops_update_code(iter->ops, &old_hash_ops); |
4307 | free_ftrace_hash_rcu(old_hash); | 4344 | free_ftrace_hash_rcu(old_hash); |
4308 | } | 4345 | } |
4309 | mutex_unlock(&ftrace_lock); | 4346 | mutex_unlock(&ftrace_lock); |
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 2e767972e99c..4a9079b9f082 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
@@ -6918,7 +6918,6 @@ void __init trace_init(void) | |||
6918 | tracepoint_printk = 0; | 6918 | tracepoint_printk = 0; |
6919 | } | 6919 | } |
6920 | tracer_alloc_buffers(); | 6920 | tracer_alloc_buffers(); |
6921 | init_ftrace_syscalls(); | ||
6922 | trace_event_init(); | 6921 | trace_event_init(); |
6923 | } | 6922 | } |
6924 | 6923 | ||
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c index 366a78a3e61e..b03a0ea77b99 100644 --- a/kernel/trace/trace_events.c +++ b/kernel/trace/trace_events.c | |||
@@ -2429,12 +2429,39 @@ static __init int event_trace_memsetup(void) | |||
2429 | return 0; | 2429 | return 0; |
2430 | } | 2430 | } |
2431 | 2431 | ||
2432 | static __init void | ||
2433 | early_enable_events(struct trace_array *tr, bool disable_first) | ||
2434 | { | ||
2435 | char *buf = bootup_event_buf; | ||
2436 | char *token; | ||
2437 | int ret; | ||
2438 | |||
2439 | while (true) { | ||
2440 | token = strsep(&buf, ","); | ||
2441 | |||
2442 | if (!token) | ||
2443 | break; | ||
2444 | if (!*token) | ||
2445 | continue; | ||
2446 | |||
2447 | /* Restarting syscalls requires that we stop them first */ | ||
2448 | if (disable_first) | ||
2449 | ftrace_set_clr_event(tr, token, 0); | ||
2450 | |||
2451 | ret = ftrace_set_clr_event(tr, token, 1); | ||
2452 | if (ret) | ||
2453 | pr_warn("Failed to enable trace event: %s\n", token); | ||
2454 | |||
2455 | /* Put back the comma to allow this to be called again */ | ||
2456 | if (buf) | ||
2457 | *(buf - 1) = ','; | ||
2458 | } | ||
2459 | } | ||
2460 | |||
2432 | static __init int event_trace_enable(void) | 2461 | static __init int event_trace_enable(void) |
2433 | { | 2462 | { |
2434 | struct trace_array *tr = top_trace_array(); | 2463 | struct trace_array *tr = top_trace_array(); |
2435 | struct ftrace_event_call **iter, *call; | 2464 | struct ftrace_event_call **iter, *call; |
2436 | char *buf = bootup_event_buf; | ||
2437 | char *token; | ||
2438 | int ret; | 2465 | int ret; |
2439 | 2466 | ||
2440 | if (!tr) | 2467 | if (!tr) |
@@ -2456,18 +2483,7 @@ static __init int event_trace_enable(void) | |||
2456 | */ | 2483 | */ |
2457 | __trace_early_add_events(tr); | 2484 | __trace_early_add_events(tr); |
2458 | 2485 | ||
2459 | while (true) { | 2486 | early_enable_events(tr, false); |
2460 | token = strsep(&buf, ","); | ||
2461 | |||
2462 | if (!token) | ||
2463 | break; | ||
2464 | if (!*token) | ||
2465 | continue; | ||
2466 | |||
2467 | ret = ftrace_set_clr_event(tr, token, 1); | ||
2468 | if (ret) | ||
2469 | pr_warn("Failed to enable trace event: %s\n", token); | ||
2470 | } | ||
2471 | 2487 | ||
2472 | trace_printk_start_comm(); | 2488 | trace_printk_start_comm(); |
2473 | 2489 | ||
@@ -2478,6 +2494,31 @@ static __init int event_trace_enable(void) | |||
2478 | return 0; | 2494 | return 0; |
2479 | } | 2495 | } |
2480 | 2496 | ||
2497 | /* | ||
2498 | * event_trace_enable() is called from trace_event_init() first to | ||
2499 | * initialize events and perhaps start any events that are on the | ||
2500 | * command line. Unfortunately, there are some events that will not | ||
2501 | * start this early, like the system call tracepoints that need | ||
2502 | * to set the TIF_SYSCALL_TRACEPOINT flag of pid 1. But event_trace_enable() | ||
2503 | * is called before pid 1 starts, and this flag is never set, making | ||
2504 | * the syscall tracepoint never get reached, but the event is enabled | ||
2505 | * regardless (and not doing anything). | ||
2506 | */ | ||
2507 | static __init int event_trace_enable_again(void) | ||
2508 | { | ||
2509 | struct trace_array *tr; | ||
2510 | |||
2511 | tr = top_trace_array(); | ||
2512 | if (!tr) | ||
2513 | return -ENODEV; | ||
2514 | |||
2515 | early_enable_events(tr, true); | ||
2516 | |||
2517 | return 0; | ||
2518 | } | ||
2519 | |||
2520 | early_initcall(event_trace_enable_again); | ||
2521 | |||
2481 | static __init int event_trace_init(void) | 2522 | static __init int event_trace_init(void) |
2482 | { | 2523 | { |
2483 | struct trace_array *tr; | 2524 | struct trace_array *tr; |
diff --git a/kernel/workqueue.c b/kernel/workqueue.c index 6202b08f1933..beeeac9e0e3e 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c | |||
@@ -1841,17 +1841,11 @@ static void pool_mayday_timeout(unsigned long __pool) | |||
1841 | * spin_lock_irq(pool->lock) which may be released and regrabbed | 1841 | * spin_lock_irq(pool->lock) which may be released and regrabbed |
1842 | * multiple times. Does GFP_KERNEL allocations. Called only from | 1842 | * multiple times. Does GFP_KERNEL allocations. Called only from |
1843 | * manager. | 1843 | * manager. |
1844 | * | ||
1845 | * Return: | ||
1846 | * %false if no action was taken and pool->lock stayed locked, %true | ||
1847 | * otherwise. | ||
1848 | */ | 1844 | */ |
1849 | static bool maybe_create_worker(struct worker_pool *pool) | 1845 | static void maybe_create_worker(struct worker_pool *pool) |
1850 | __releases(&pool->lock) | 1846 | __releases(&pool->lock) |
1851 | __acquires(&pool->lock) | 1847 | __acquires(&pool->lock) |
1852 | { | 1848 | { |
1853 | if (!need_to_create_worker(pool)) | ||
1854 | return false; | ||
1855 | restart: | 1849 | restart: |
1856 | spin_unlock_irq(&pool->lock); | 1850 | spin_unlock_irq(&pool->lock); |
1857 | 1851 | ||
@@ -1877,7 +1871,6 @@ restart: | |||
1877 | */ | 1871 | */ |
1878 | if (need_to_create_worker(pool)) | 1872 | if (need_to_create_worker(pool)) |
1879 | goto restart; | 1873 | goto restart; |
1880 | return true; | ||
1881 | } | 1874 | } |
1882 | 1875 | ||
1883 | /** | 1876 | /** |
@@ -1897,16 +1890,14 @@ restart: | |||
1897 | * multiple times. Does GFP_KERNEL allocations. | 1890 | * multiple times. Does GFP_KERNEL allocations. |
1898 | * | 1891 | * |
1899 | * Return: | 1892 | * Return: |
1900 | * %false if the pool don't need management and the caller can safely start | 1893 | * %false if the pool doesn't need management and the caller can safely |
1901 | * processing works, %true indicates that the function released pool->lock | 1894 | * start processing works, %true if management function was performed and |
1902 | * and reacquired it to perform some management function and that the | 1895 | * the conditions that the caller verified before calling the function may |
1903 | * conditions that the caller verified while holding the lock before | 1896 | * no longer be true. |
1904 | * calling the function might no longer be true. | ||
1905 | */ | 1897 | */ |
1906 | static bool manage_workers(struct worker *worker) | 1898 | static bool manage_workers(struct worker *worker) |
1907 | { | 1899 | { |
1908 | struct worker_pool *pool = worker->pool; | 1900 | struct worker_pool *pool = worker->pool; |
1909 | bool ret = false; | ||
1910 | 1901 | ||
1911 | /* | 1902 | /* |
1912 | * Anyone who successfully grabs manager_arb wins the arbitration | 1903 | * Anyone who successfully grabs manager_arb wins the arbitration |
@@ -1919,12 +1910,12 @@ static bool manage_workers(struct worker *worker) | |||
1919 | * actual management, the pool may stall indefinitely. | 1910 | * actual management, the pool may stall indefinitely. |
1920 | */ | 1911 | */ |
1921 | if (!mutex_trylock(&pool->manager_arb)) | 1912 | if (!mutex_trylock(&pool->manager_arb)) |
1922 | return ret; | 1913 | return false; |
1923 | 1914 | ||
1924 | ret |= maybe_create_worker(pool); | 1915 | maybe_create_worker(pool); |
1925 | 1916 | ||
1926 | mutex_unlock(&pool->manager_arb); | 1917 | mutex_unlock(&pool->manager_arb); |
1927 | return ret; | 1918 | return true; |
1928 | } | 1919 | } |
1929 | 1920 | ||
1930 | /** | 1921 | /** |
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 851924fa5170..683b4782019b 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -1477,9 +1477,9 @@ void mem_cgroup_print_oom_info(struct mem_cgroup *memcg, struct task_struct *p) | |||
1477 | 1477 | ||
1478 | pr_info("Task in "); | 1478 | pr_info("Task in "); |
1479 | pr_cont_cgroup_path(task_cgroup(p, memory_cgrp_id)); | 1479 | pr_cont_cgroup_path(task_cgroup(p, memory_cgrp_id)); |
1480 | pr_info(" killed as a result of limit of "); | 1480 | pr_cont(" killed as a result of limit of "); |
1481 | pr_cont_cgroup_path(memcg->css.cgroup); | 1481 | pr_cont_cgroup_path(memcg->css.cgroup); |
1482 | pr_info("\n"); | 1482 | pr_cont("\n"); |
1483 | 1483 | ||
1484 | rcu_read_unlock(); | 1484 | rcu_read_unlock(); |
1485 | 1485 | ||
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 7633c503a116..8e20f9c2fa5a 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -2332,12 +2332,21 @@ static inline struct page * | |||
2332 | __alloc_pages_may_oom(gfp_t gfp_mask, unsigned int order, | 2332 | __alloc_pages_may_oom(gfp_t gfp_mask, unsigned int order, |
2333 | struct zonelist *zonelist, enum zone_type high_zoneidx, | 2333 | struct zonelist *zonelist, enum zone_type high_zoneidx, |
2334 | nodemask_t *nodemask, struct zone *preferred_zone, | 2334 | nodemask_t *nodemask, struct zone *preferred_zone, |
2335 | int classzone_idx, int migratetype) | 2335 | int classzone_idx, int migratetype, unsigned long *did_some_progress) |
2336 | { | 2336 | { |
2337 | struct page *page; | 2337 | struct page *page; |
2338 | 2338 | ||
2339 | /* Acquire the per-zone oom lock for each zone */ | 2339 | *did_some_progress = 0; |
2340 | |||
2341 | if (oom_killer_disabled) | ||
2342 | return NULL; | ||
2343 | |||
2344 | /* | ||
2345 | * Acquire the per-zone oom lock for each zone. If that | ||
2346 | * fails, somebody else is making progress for us. | ||
2347 | */ | ||
2340 | if (!oom_zonelist_trylock(zonelist, gfp_mask)) { | 2348 | if (!oom_zonelist_trylock(zonelist, gfp_mask)) { |
2349 | *did_some_progress = 1; | ||
2341 | schedule_timeout_uninterruptible(1); | 2350 | schedule_timeout_uninterruptible(1); |
2342 | return NULL; | 2351 | return NULL; |
2343 | } | 2352 | } |
@@ -2363,12 +2372,18 @@ __alloc_pages_may_oom(gfp_t gfp_mask, unsigned int order, | |||
2363 | goto out; | 2372 | goto out; |
2364 | 2373 | ||
2365 | if (!(gfp_mask & __GFP_NOFAIL)) { | 2374 | if (!(gfp_mask & __GFP_NOFAIL)) { |
2375 | /* Coredumps can quickly deplete all memory reserves */ | ||
2376 | if (current->flags & PF_DUMPCORE) | ||
2377 | goto out; | ||
2366 | /* The OOM killer will not help higher order allocs */ | 2378 | /* The OOM killer will not help higher order allocs */ |
2367 | if (order > PAGE_ALLOC_COSTLY_ORDER) | 2379 | if (order > PAGE_ALLOC_COSTLY_ORDER) |
2368 | goto out; | 2380 | goto out; |
2369 | /* The OOM killer does not needlessly kill tasks for lowmem */ | 2381 | /* The OOM killer does not needlessly kill tasks for lowmem */ |
2370 | if (high_zoneidx < ZONE_NORMAL) | 2382 | if (high_zoneidx < ZONE_NORMAL) |
2371 | goto out; | 2383 | goto out; |
2384 | /* The OOM killer does not compensate for light reclaim */ | ||
2385 | if (!(gfp_mask & __GFP_FS)) | ||
2386 | goto out; | ||
2372 | /* | 2387 | /* |
2373 | * GFP_THISNODE contains __GFP_NORETRY and we never hit this. | 2388 | * GFP_THISNODE contains __GFP_NORETRY and we never hit this. |
2374 | * Sanity check for bare calls of __GFP_THISNODE, not real OOM. | 2389 | * Sanity check for bare calls of __GFP_THISNODE, not real OOM. |
@@ -2381,7 +2396,7 @@ __alloc_pages_may_oom(gfp_t gfp_mask, unsigned int order, | |||
2381 | } | 2396 | } |
2382 | /* Exhausted what can be done so it's blamo time */ | 2397 | /* Exhausted what can be done so it's blamo time */ |
2383 | out_of_memory(zonelist, gfp_mask, order, nodemask, false); | 2398 | out_of_memory(zonelist, gfp_mask, order, nodemask, false); |
2384 | 2399 | *did_some_progress = 1; | |
2385 | out: | 2400 | out: |
2386 | oom_zonelist_unlock(zonelist, gfp_mask); | 2401 | oom_zonelist_unlock(zonelist, gfp_mask); |
2387 | return page; | 2402 | return page; |
@@ -2658,7 +2673,7 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order, | |||
2658 | (gfp_mask & GFP_THISNODE) == GFP_THISNODE) | 2673 | (gfp_mask & GFP_THISNODE) == GFP_THISNODE) |
2659 | goto nopage; | 2674 | goto nopage; |
2660 | 2675 | ||
2661 | restart: | 2676 | retry: |
2662 | if (!(gfp_mask & __GFP_NO_KSWAPD)) | 2677 | if (!(gfp_mask & __GFP_NO_KSWAPD)) |
2663 | wake_all_kswapds(order, zonelist, high_zoneidx, | 2678 | wake_all_kswapds(order, zonelist, high_zoneidx, |
2664 | preferred_zone, nodemask); | 2679 | preferred_zone, nodemask); |
@@ -2681,7 +2696,6 @@ restart: | |||
2681 | classzone_idx = zonelist_zone_idx(preferred_zoneref); | 2696 | classzone_idx = zonelist_zone_idx(preferred_zoneref); |
2682 | } | 2697 | } |
2683 | 2698 | ||
2684 | rebalance: | ||
2685 | /* This is the last chance, in general, before the goto nopage. */ | 2699 | /* This is the last chance, in general, before the goto nopage. */ |
2686 | page = get_page_from_freelist(gfp_mask, nodemask, order, zonelist, | 2700 | page = get_page_from_freelist(gfp_mask, nodemask, order, zonelist, |
2687 | high_zoneidx, alloc_flags & ~ALLOC_NO_WATERMARKS, | 2701 | high_zoneidx, alloc_flags & ~ALLOC_NO_WATERMARKS, |
@@ -2788,54 +2802,28 @@ rebalance: | |||
2788 | if (page) | 2802 | if (page) |
2789 | goto got_pg; | 2803 | goto got_pg; |
2790 | 2804 | ||
2791 | /* | ||
2792 | * If we failed to make any progress reclaiming, then we are | ||
2793 | * running out of options and have to consider going OOM | ||
2794 | */ | ||
2795 | if (!did_some_progress) { | ||
2796 | if (oom_gfp_allowed(gfp_mask)) { | ||
2797 | if (oom_killer_disabled) | ||
2798 | goto nopage; | ||
2799 | /* Coredumps can quickly deplete all memory reserves */ | ||
2800 | if ((current->flags & PF_DUMPCORE) && | ||
2801 | !(gfp_mask & __GFP_NOFAIL)) | ||
2802 | goto nopage; | ||
2803 | page = __alloc_pages_may_oom(gfp_mask, order, | ||
2804 | zonelist, high_zoneidx, | ||
2805 | nodemask, preferred_zone, | ||
2806 | classzone_idx, migratetype); | ||
2807 | if (page) | ||
2808 | goto got_pg; | ||
2809 | |||
2810 | if (!(gfp_mask & __GFP_NOFAIL)) { | ||
2811 | /* | ||
2812 | * The oom killer is not called for high-order | ||
2813 | * allocations that may fail, so if no progress | ||
2814 | * is being made, there are no other options and | ||
2815 | * retrying is unlikely to help. | ||
2816 | */ | ||
2817 | if (order > PAGE_ALLOC_COSTLY_ORDER) | ||
2818 | goto nopage; | ||
2819 | /* | ||
2820 | * The oom killer is not called for lowmem | ||
2821 | * allocations to prevent needlessly killing | ||
2822 | * innocent tasks. | ||
2823 | */ | ||
2824 | if (high_zoneidx < ZONE_NORMAL) | ||
2825 | goto nopage; | ||
2826 | } | ||
2827 | |||
2828 | goto restart; | ||
2829 | } | ||
2830 | } | ||
2831 | |||
2832 | /* Check if we should retry the allocation */ | 2805 | /* Check if we should retry the allocation */ |
2833 | pages_reclaimed += did_some_progress; | 2806 | pages_reclaimed += did_some_progress; |
2834 | if (should_alloc_retry(gfp_mask, order, did_some_progress, | 2807 | if (should_alloc_retry(gfp_mask, order, did_some_progress, |
2835 | pages_reclaimed)) { | 2808 | pages_reclaimed)) { |
2809 | /* | ||
2810 | * If we fail to make progress by freeing individual | ||
2811 | * pages, but the allocation wants us to keep going, | ||
2812 | * start OOM killing tasks. | ||
2813 | */ | ||
2814 | if (!did_some_progress) { | ||
2815 | page = __alloc_pages_may_oom(gfp_mask, order, zonelist, | ||
2816 | high_zoneidx, nodemask, | ||
2817 | preferred_zone, classzone_idx, | ||
2818 | migratetype,&did_some_progress); | ||
2819 | if (page) | ||
2820 | goto got_pg; | ||
2821 | if (!did_some_progress) | ||
2822 | goto nopage; | ||
2823 | } | ||
2836 | /* Wait for some write requests to complete then retry */ | 2824 | /* Wait for some write requests to complete then retry */ |
2837 | wait_iff_congested(preferred_zone, BLK_RW_ASYNC, HZ/50); | 2825 | wait_iff_congested(preferred_zone, BLK_RW_ASYNC, HZ/50); |
2838 | goto rebalance; | 2826 | goto retry; |
2839 | } else { | 2827 | } else { |
2840 | /* | 2828 | /* |
2841 | * High-order allocations do not necessarily loop after | 2829 | * High-order allocations do not necessarily loop after |
diff --git a/mm/vmscan.c b/mm/vmscan.c index ab2505c3ef54..dcd90c891d8e 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -2656,7 +2656,7 @@ static bool throttle_direct_reclaim(gfp_t gfp_mask, struct zonelist *zonelist, | |||
2656 | * should make reasonable progress. | 2656 | * should make reasonable progress. |
2657 | */ | 2657 | */ |
2658 | for_each_zone_zonelist_nodemask(zone, z, zonelist, | 2658 | for_each_zone_zonelist_nodemask(zone, z, zonelist, |
2659 | gfp_mask, nodemask) { | 2659 | gfp_zone(gfp_mask), nodemask) { |
2660 | if (zone_idx(zone) > ZONE_NORMAL) | 2660 | if (zone_idx(zone) > ZONE_NORMAL) |
2661 | continue; | 2661 | continue; |
2662 | 2662 | ||
diff --git a/net/core/dev.c b/net/core/dev.c index 1e325adc4367..7f028d441e98 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -7075,10 +7075,20 @@ static int dev_cpu_callback(struct notifier_block *nfb, | |||
7075 | oldsd->output_queue = NULL; | 7075 | oldsd->output_queue = NULL; |
7076 | oldsd->output_queue_tailp = &oldsd->output_queue; | 7076 | oldsd->output_queue_tailp = &oldsd->output_queue; |
7077 | } | 7077 | } |
7078 | /* Append NAPI poll list from offline CPU. */ | 7078 | /* Append NAPI poll list from offline CPU, with one exception : |
7079 | if (!list_empty(&oldsd->poll_list)) { | 7079 | * process_backlog() must be called by cpu owning percpu backlog. |
7080 | list_splice_init(&oldsd->poll_list, &sd->poll_list); | 7080 | * We properly handle process_queue & input_pkt_queue later. |
7081 | raise_softirq_irqoff(NET_RX_SOFTIRQ); | 7081 | */ |
7082 | while (!list_empty(&oldsd->poll_list)) { | ||
7083 | struct napi_struct *napi = list_first_entry(&oldsd->poll_list, | ||
7084 | struct napi_struct, | ||
7085 | poll_list); | ||
7086 | |||
7087 | list_del_init(&napi->poll_list); | ||
7088 | if (napi->poll == process_backlog) | ||
7089 | napi->state = 0; | ||
7090 | else | ||
7091 | ____napi_schedule(sd, napi); | ||
7082 | } | 7092 | } |
7083 | 7093 | ||
7084 | raise_softirq_irqoff(NET_TX_SOFTIRQ); | 7094 | raise_softirq_irqoff(NET_TX_SOFTIRQ); |
@@ -7089,7 +7099,7 @@ static int dev_cpu_callback(struct notifier_block *nfb, | |||
7089 | netif_rx_internal(skb); | 7099 | netif_rx_internal(skb); |
7090 | input_queue_head_incr(oldsd); | 7100 | input_queue_head_incr(oldsd); |
7091 | } | 7101 | } |
7092 | while ((skb = __skb_dequeue(&oldsd->input_pkt_queue))) { | 7102 | while ((skb = skb_dequeue(&oldsd->input_pkt_queue))) { |
7093 | netif_rx_internal(skb); | 7103 | netif_rx_internal(skb); |
7094 | input_queue_head_incr(oldsd); | 7104 | input_queue_head_incr(oldsd); |
7095 | } | 7105 | } |
diff --git a/net/dsa/slave.c b/net/dsa/slave.c index 515569ffde8a..589aafd01fc5 100644 --- a/net/dsa/slave.c +++ b/net/dsa/slave.c | |||
@@ -46,6 +46,7 @@ void dsa_slave_mii_bus_init(struct dsa_switch *ds) | |||
46 | snprintf(ds->slave_mii_bus->id, MII_BUS_ID_SIZE, "dsa-%d:%.2x", | 46 | snprintf(ds->slave_mii_bus->id, MII_BUS_ID_SIZE, "dsa-%d:%.2x", |
47 | ds->index, ds->pd->sw_addr); | 47 | ds->index, ds->pd->sw_addr); |
48 | ds->slave_mii_bus->parent = ds->master_dev; | 48 | ds->slave_mii_bus->parent = ds->master_dev; |
49 | ds->slave_mii_bus->phy_mask = ~ds->phys_mii_mask; | ||
49 | } | 50 | } |
50 | 51 | ||
51 | 52 | ||
diff --git a/net/ipv4/ip_forward.c b/net/ipv4/ip_forward.c index 3a83ce5efa80..787b3c294ce6 100644 --- a/net/ipv4/ip_forward.c +++ b/net/ipv4/ip_forward.c | |||
@@ -129,7 +129,8 @@ int ip_forward(struct sk_buff *skb) | |||
129 | * We now generate an ICMP HOST REDIRECT giving the route | 129 | * We now generate an ICMP HOST REDIRECT giving the route |
130 | * we calculated. | 130 | * we calculated. |
131 | */ | 131 | */ |
132 | if (rt->rt_flags&RTCF_DOREDIRECT && !opt->srr && !skb_sec_path(skb)) | 132 | if (IPCB(skb)->flags & IPSKB_DOREDIRECT && !opt->srr && |
133 | !skb_sec_path(skb)) | ||
133 | ip_rt_send_redirect(skb); | 134 | ip_rt_send_redirect(skb); |
134 | 135 | ||
135 | skb->priority = rt_tos2priority(iph->tos); | 136 | skb->priority = rt_tos2priority(iph->tos); |
diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c index a317797b3cd0..db5e0f81ce0a 100644 --- a/net/ipv4/ip_sockglue.c +++ b/net/ipv4/ip_sockglue.c | |||
@@ -494,17 +494,13 @@ int ip_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len) | |||
494 | 494 | ||
495 | memcpy(&errhdr.ee, &serr->ee, sizeof(struct sock_extended_err)); | 495 | memcpy(&errhdr.ee, &serr->ee, sizeof(struct sock_extended_err)); |
496 | sin = &errhdr.offender; | 496 | sin = &errhdr.offender; |
497 | sin->sin_family = AF_UNSPEC; | 497 | memset(sin, 0, sizeof(*sin)); |
498 | 498 | ||
499 | if (serr->ee.ee_origin == SO_EE_ORIGIN_ICMP || | 499 | if (serr->ee.ee_origin == SO_EE_ORIGIN_ICMP || |
500 | ipv4_pktinfo_prepare_errqueue(sk, skb, serr->ee.ee_origin)) { | 500 | ipv4_pktinfo_prepare_errqueue(sk, skb, serr->ee.ee_origin)) { |
501 | struct inet_sock *inet = inet_sk(sk); | ||
502 | |||
503 | sin->sin_family = AF_INET; | 501 | sin->sin_family = AF_INET; |
504 | sin->sin_addr.s_addr = ip_hdr(skb)->saddr; | 502 | sin->sin_addr.s_addr = ip_hdr(skb)->saddr; |
505 | sin->sin_port = 0; | 503 | if (inet_sk(sk)->cmsg_flags) |
506 | memset(&sin->sin_zero, 0, sizeof(sin->sin_zero)); | ||
507 | if (inet->cmsg_flags) | ||
508 | ip_cmsg_recv(msg, skb); | 504 | ip_cmsg_recv(msg, skb); |
509 | } | 505 | } |
510 | 506 | ||
diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c index c0d82f78d364..2a3720fb5a5f 100644 --- a/net/ipv4/ping.c +++ b/net/ipv4/ping.c | |||
@@ -966,8 +966,11 @@ bool ping_rcv(struct sk_buff *skb) | |||
966 | 966 | ||
967 | sk = ping_lookup(net, skb, ntohs(icmph->un.echo.id)); | 967 | sk = ping_lookup(net, skb, ntohs(icmph->un.echo.id)); |
968 | if (sk != NULL) { | 968 | if (sk != NULL) { |
969 | struct sk_buff *skb2 = skb_clone(skb, GFP_ATOMIC); | ||
970 | |||
969 | pr_debug("rcv on socket %p\n", sk); | 971 | pr_debug("rcv on socket %p\n", sk); |
970 | ping_queue_rcv_skb(sk, skb_get(skb)); | 972 | if (skb2) |
973 | ping_queue_rcv_skb(sk, skb2); | ||
971 | sock_put(sk); | 974 | sock_put(sk); |
972 | return true; | 975 | return true; |
973 | } | 976 | } |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 2000110c75f0..0c63b2abd873 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
@@ -1567,11 +1567,10 @@ static int __mkroute_input(struct sk_buff *skb, | |||
1567 | 1567 | ||
1568 | do_cache = res->fi && !itag; | 1568 | do_cache = res->fi && !itag; |
1569 | if (out_dev == in_dev && err && IN_DEV_TX_REDIRECTS(out_dev) && | 1569 | if (out_dev == in_dev && err && IN_DEV_TX_REDIRECTS(out_dev) && |
1570 | skb->protocol == htons(ETH_P_IP) && | ||
1570 | (IN_DEV_SHARED_MEDIA(out_dev) || | 1571 | (IN_DEV_SHARED_MEDIA(out_dev) || |
1571 | inet_addr_onlink(out_dev, saddr, FIB_RES_GW(*res)))) { | 1572 | inet_addr_onlink(out_dev, saddr, FIB_RES_GW(*res)))) |
1572 | flags |= RTCF_DOREDIRECT; | 1573 | IPCB(skb)->flags |= IPSKB_DOREDIRECT; |
1573 | do_cache = false; | ||
1574 | } | ||
1575 | 1574 | ||
1576 | if (skb->protocol != htons(ETH_P_IP)) { | 1575 | if (skb->protocol != htons(ETH_P_IP)) { |
1577 | /* Not IP (i.e. ARP). Do not create route, if it is | 1576 | /* Not IP (i.e. ARP). Do not create route, if it is |
@@ -2316,6 +2315,8 @@ static int rt_fill_info(struct net *net, __be32 dst, __be32 src, | |||
2316 | r->rtm_flags = (rt->rt_flags & ~0xFFFF) | RTM_F_CLONED; | 2315 | r->rtm_flags = (rt->rt_flags & ~0xFFFF) | RTM_F_CLONED; |
2317 | if (rt->rt_flags & RTCF_NOTIFY) | 2316 | if (rt->rt_flags & RTCF_NOTIFY) |
2318 | r->rtm_flags |= RTM_F_NOTIFY; | 2317 | r->rtm_flags |= RTM_F_NOTIFY; |
2318 | if (IPCB(skb)->flags & IPSKB_DOREDIRECT) | ||
2319 | r->rtm_flags |= RTCF_DOREDIRECT; | ||
2319 | 2320 | ||
2320 | if (nla_put_be32(skb, RTA_DST, dst)) | 2321 | if (nla_put_be32(skb, RTA_DST, dst)) |
2321 | goto nla_put_failure; | 2322 | goto nla_put_failure; |
diff --git a/net/ipv4/udp_diag.c b/net/ipv4/udp_diag.c index 7927db0a9279..4a000f1dd757 100644 --- a/net/ipv4/udp_diag.c +++ b/net/ipv4/udp_diag.c | |||
@@ -99,11 +99,13 @@ static void udp_dump(struct udp_table *table, struct sk_buff *skb, struct netlin | |||
99 | s_slot = cb->args[0]; | 99 | s_slot = cb->args[0]; |
100 | num = s_num = cb->args[1]; | 100 | num = s_num = cb->args[1]; |
101 | 101 | ||
102 | for (slot = s_slot; slot <= table->mask; num = s_num = 0, slot++) { | 102 | for (slot = s_slot; slot <= table->mask; s_num = 0, slot++) { |
103 | struct sock *sk; | 103 | struct sock *sk; |
104 | struct hlist_nulls_node *node; | 104 | struct hlist_nulls_node *node; |
105 | struct udp_hslot *hslot = &table->hash[slot]; | 105 | struct udp_hslot *hslot = &table->hash[slot]; |
106 | 106 | ||
107 | num = 0; | ||
108 | |||
107 | if (hlist_nulls_empty(&hslot->head)) | 109 | if (hlist_nulls_empty(&hslot->head)) |
108 | continue; | 110 | continue; |
109 | 111 | ||
diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c index 100c589a2a6c..49f5e73db122 100644 --- a/net/ipv6/datagram.c +++ b/net/ipv6/datagram.c | |||
@@ -393,11 +393,10 @@ int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len) | |||
393 | 393 | ||
394 | memcpy(&errhdr.ee, &serr->ee, sizeof(struct sock_extended_err)); | 394 | memcpy(&errhdr.ee, &serr->ee, sizeof(struct sock_extended_err)); |
395 | sin = &errhdr.offender; | 395 | sin = &errhdr.offender; |
396 | sin->sin6_family = AF_UNSPEC; | 396 | memset(sin, 0, sizeof(*sin)); |
397 | |||
397 | if (serr->ee.ee_origin != SO_EE_ORIGIN_LOCAL) { | 398 | if (serr->ee.ee_origin != SO_EE_ORIGIN_LOCAL) { |
398 | sin->sin6_family = AF_INET6; | 399 | sin->sin6_family = AF_INET6; |
399 | sin->sin6_flowinfo = 0; | ||
400 | sin->sin6_port = 0; | ||
401 | if (np->rxopt.all) { | 400 | if (np->rxopt.all) { |
402 | if (serr->ee.ee_origin != SO_EE_ORIGIN_ICMP && | 401 | if (serr->ee.ee_origin != SO_EE_ORIGIN_ICMP && |
403 | serr->ee.ee_origin != SO_EE_ORIGIN_ICMP6) | 402 | serr->ee.ee_origin != SO_EE_ORIGIN_ICMP6) |
@@ -412,12 +411,9 @@ int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len) | |||
412 | ipv6_iface_scope_id(&sin->sin6_addr, | 411 | ipv6_iface_scope_id(&sin->sin6_addr, |
413 | IP6CB(skb)->iif); | 412 | IP6CB(skb)->iif); |
414 | } else { | 413 | } else { |
415 | struct inet_sock *inet = inet_sk(sk); | ||
416 | |||
417 | ipv6_addr_set_v4mapped(ip_hdr(skb)->saddr, | 414 | ipv6_addr_set_v4mapped(ip_hdr(skb)->saddr, |
418 | &sin->sin6_addr); | 415 | &sin->sin6_addr); |
419 | sin->sin6_scope_id = 0; | 416 | if (inet_sk(sk)->cmsg_flags) |
420 | if (inet->cmsg_flags) | ||
421 | ip_cmsg_recv(msg, skb); | 417 | ip_cmsg_recv(msg, skb); |
422 | } | 418 | } |
423 | } | 419 | } |
diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c index 53775ee7d376..263ef4143bff 100644 --- a/net/ipv6/ip6_fib.c +++ b/net/ipv6/ip6_fib.c | |||
@@ -661,6 +661,29 @@ static int fib6_commit_metrics(struct dst_entry *dst, struct mx6_config *mxc) | |||
661 | return 0; | 661 | return 0; |
662 | } | 662 | } |
663 | 663 | ||
664 | static void fib6_purge_rt(struct rt6_info *rt, struct fib6_node *fn, | ||
665 | struct net *net) | ||
666 | { | ||
667 | if (atomic_read(&rt->rt6i_ref) != 1) { | ||
668 | /* This route is used as dummy address holder in some split | ||
669 | * nodes. It is not leaked, but it still holds other resources, | ||
670 | * which must be released in time. So, scan ascendant nodes | ||
671 | * and replace dummy references to this route with references | ||
672 | * to still alive ones. | ||
673 | */ | ||
674 | while (fn) { | ||
675 | if (!(fn->fn_flags & RTN_RTINFO) && fn->leaf == rt) { | ||
676 | fn->leaf = fib6_find_prefix(net, fn); | ||
677 | atomic_inc(&fn->leaf->rt6i_ref); | ||
678 | rt6_release(rt); | ||
679 | } | ||
680 | fn = fn->parent; | ||
681 | } | ||
682 | /* No more references are possible at this point. */ | ||
683 | BUG_ON(atomic_read(&rt->rt6i_ref) != 1); | ||
684 | } | ||
685 | } | ||
686 | |||
664 | /* | 687 | /* |
665 | * Insert routing information in a node. | 688 | * Insert routing information in a node. |
666 | */ | 689 | */ |
@@ -808,11 +831,12 @@ add: | |||
808 | rt->dst.rt6_next = iter->dst.rt6_next; | 831 | rt->dst.rt6_next = iter->dst.rt6_next; |
809 | atomic_inc(&rt->rt6i_ref); | 832 | atomic_inc(&rt->rt6i_ref); |
810 | inet6_rt_notify(RTM_NEWROUTE, rt, info); | 833 | inet6_rt_notify(RTM_NEWROUTE, rt, info); |
811 | rt6_release(iter); | ||
812 | if (!(fn->fn_flags & RTN_RTINFO)) { | 834 | if (!(fn->fn_flags & RTN_RTINFO)) { |
813 | info->nl_net->ipv6.rt6_stats->fib_route_nodes++; | 835 | info->nl_net->ipv6.rt6_stats->fib_route_nodes++; |
814 | fn->fn_flags |= RTN_RTINFO; | 836 | fn->fn_flags |= RTN_RTINFO; |
815 | } | 837 | } |
838 | fib6_purge_rt(iter, fn, info->nl_net); | ||
839 | rt6_release(iter); | ||
816 | } | 840 | } |
817 | 841 | ||
818 | return 0; | 842 | return 0; |
@@ -1323,24 +1347,7 @@ static void fib6_del_route(struct fib6_node *fn, struct rt6_info **rtp, | |||
1323 | fn = fib6_repair_tree(net, fn); | 1347 | fn = fib6_repair_tree(net, fn); |
1324 | } | 1348 | } |
1325 | 1349 | ||
1326 | if (atomic_read(&rt->rt6i_ref) != 1) { | 1350 | fib6_purge_rt(rt, fn, net); |
1327 | /* This route is used as dummy address holder in some split | ||
1328 | * nodes. It is not leaked, but it still holds other resources, | ||
1329 | * which must be released in time. So, scan ascendant nodes | ||
1330 | * and replace dummy references to this route with references | ||
1331 | * to still alive ones. | ||
1332 | */ | ||
1333 | while (fn) { | ||
1334 | if (!(fn->fn_flags & RTN_RTINFO) && fn->leaf == rt) { | ||
1335 | fn->leaf = fib6_find_prefix(net, fn); | ||
1336 | atomic_inc(&fn->leaf->rt6i_ref); | ||
1337 | rt6_release(rt); | ||
1338 | } | ||
1339 | fn = fn->parent; | ||
1340 | } | ||
1341 | /* No more references are possible at this point. */ | ||
1342 | BUG_ON(atomic_read(&rt->rt6i_ref) != 1); | ||
1343 | } | ||
1344 | 1351 | ||
1345 | inet6_rt_notify(RTM_DELROUTE, rt, info); | 1352 | inet6_rt_notify(RTM_DELROUTE, rt, info); |
1346 | rt6_release(rt); | 1353 | rt6_release(rt); |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index c60f15775c53..7622951e5fbb 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
@@ -1160,12 +1160,9 @@ static void ip6_rt_update_pmtu(struct dst_entry *dst, struct sock *sk, | |||
1160 | struct net *net = dev_net(dst->dev); | 1160 | struct net *net = dev_net(dst->dev); |
1161 | 1161 | ||
1162 | rt6->rt6i_flags |= RTF_MODIFIED; | 1162 | rt6->rt6i_flags |= RTF_MODIFIED; |
1163 | if (mtu < IPV6_MIN_MTU) { | 1163 | if (mtu < IPV6_MIN_MTU) |
1164 | u32 features = dst_metric(dst, RTAX_FEATURES); | ||
1165 | mtu = IPV6_MIN_MTU; | 1164 | mtu = IPV6_MIN_MTU; |
1166 | features |= RTAX_FEATURE_ALLFRAG; | 1165 | |
1167 | dst_metric_set(dst, RTAX_FEATURES, features); | ||
1168 | } | ||
1169 | dst_metric_set(dst, RTAX_MTU, mtu); | 1166 | dst_metric_set(dst, RTAX_MTU, mtu); |
1170 | rt6_update_expires(rt6, net->ipv6.sysctl.ip6_rt_mtu_expires); | 1167 | rt6_update_expires(rt6, net->ipv6.sysctl.ip6_rt_mtu_expires); |
1171 | } | 1168 | } |
@@ -1245,12 +1242,16 @@ restart: | |||
1245 | rt = net->ipv6.ip6_null_entry; | 1242 | rt = net->ipv6.ip6_null_entry; |
1246 | else if (rt->dst.error) { | 1243 | else if (rt->dst.error) { |
1247 | rt = net->ipv6.ip6_null_entry; | 1244 | rt = net->ipv6.ip6_null_entry; |
1248 | } else if (rt == net->ipv6.ip6_null_entry) { | 1245 | goto out; |
1246 | } | ||
1247 | |||
1248 | if (rt == net->ipv6.ip6_null_entry) { | ||
1249 | fn = fib6_backtrack(fn, &fl6->saddr); | 1249 | fn = fib6_backtrack(fn, &fl6->saddr); |
1250 | if (fn) | 1250 | if (fn) |
1251 | goto restart; | 1251 | goto restart; |
1252 | } | 1252 | } |
1253 | 1253 | ||
1254 | out: | ||
1254 | dst_hold(&rt->dst); | 1255 | dst_hold(&rt->dst); |
1255 | 1256 | ||
1256 | read_unlock_bh(&table->tb6_lock); | 1257 | read_unlock_bh(&table->tb6_lock); |
diff --git a/net/ipv6/xfrm6_policy.c b/net/ipv6/xfrm6_policy.c index 5f983644373a..48bf5a06847b 100644 --- a/net/ipv6/xfrm6_policy.c +++ b/net/ipv6/xfrm6_policy.c | |||
@@ -130,12 +130,18 @@ _decode_session6(struct sk_buff *skb, struct flowi *fl, int reverse) | |||
130 | { | 130 | { |
131 | struct flowi6 *fl6 = &fl->u.ip6; | 131 | struct flowi6 *fl6 = &fl->u.ip6; |
132 | int onlyproto = 0; | 132 | int onlyproto = 0; |
133 | u16 offset = skb_network_header_len(skb); | ||
134 | const struct ipv6hdr *hdr = ipv6_hdr(skb); | 133 | const struct ipv6hdr *hdr = ipv6_hdr(skb); |
134 | u16 offset = sizeof(*hdr); | ||
135 | struct ipv6_opt_hdr *exthdr; | 135 | struct ipv6_opt_hdr *exthdr; |
136 | const unsigned char *nh = skb_network_header(skb); | 136 | const unsigned char *nh = skb_network_header(skb); |
137 | u8 nexthdr = nh[IP6CB(skb)->nhoff]; | 137 | u16 nhoff = IP6CB(skb)->nhoff; |
138 | int oif = 0; | 138 | int oif = 0; |
139 | u8 nexthdr; | ||
140 | |||
141 | if (!nhoff) | ||
142 | nhoff = offsetof(struct ipv6hdr, nexthdr); | ||
143 | |||
144 | nexthdr = nh[nhoff]; | ||
139 | 145 | ||
140 | if (skb_dst(skb)) | 146 | if (skb_dst(skb)) |
141 | oif = skb_dst(skb)->dev->ifindex; | 147 | oif = skb_dst(skb)->dev->ifindex; |
diff --git a/net/llc/sysctl_net_llc.c b/net/llc/sysctl_net_llc.c index 612a5ddaf93b..799bafc2af39 100644 --- a/net/llc/sysctl_net_llc.c +++ b/net/llc/sysctl_net_llc.c | |||
@@ -18,28 +18,28 @@ static struct ctl_table llc2_timeout_table[] = { | |||
18 | { | 18 | { |
19 | .procname = "ack", | 19 | .procname = "ack", |
20 | .data = &sysctl_llc2_ack_timeout, | 20 | .data = &sysctl_llc2_ack_timeout, |
21 | .maxlen = sizeof(long), | 21 | .maxlen = sizeof(sysctl_llc2_ack_timeout), |
22 | .mode = 0644, | 22 | .mode = 0644, |
23 | .proc_handler = proc_dointvec_jiffies, | 23 | .proc_handler = proc_dointvec_jiffies, |
24 | }, | 24 | }, |
25 | { | 25 | { |
26 | .procname = "busy", | 26 | .procname = "busy", |
27 | .data = &sysctl_llc2_busy_timeout, | 27 | .data = &sysctl_llc2_busy_timeout, |
28 | .maxlen = sizeof(long), | 28 | .maxlen = sizeof(sysctl_llc2_busy_timeout), |
29 | .mode = 0644, | 29 | .mode = 0644, |
30 | .proc_handler = proc_dointvec_jiffies, | 30 | .proc_handler = proc_dointvec_jiffies, |
31 | }, | 31 | }, |
32 | { | 32 | { |
33 | .procname = "p", | 33 | .procname = "p", |
34 | .data = &sysctl_llc2_p_timeout, | 34 | .data = &sysctl_llc2_p_timeout, |
35 | .maxlen = sizeof(long), | 35 | .maxlen = sizeof(sysctl_llc2_p_timeout), |
36 | .mode = 0644, | 36 | .mode = 0644, |
37 | .proc_handler = proc_dointvec_jiffies, | 37 | .proc_handler = proc_dointvec_jiffies, |
38 | }, | 38 | }, |
39 | { | 39 | { |
40 | .procname = "rej", | 40 | .procname = "rej", |
41 | .data = &sysctl_llc2_rej_timeout, | 41 | .data = &sysctl_llc2_rej_timeout, |
42 | .maxlen = sizeof(long), | 42 | .maxlen = sizeof(sysctl_llc2_rej_timeout), |
43 | .mode = 0644, | 43 | .mode = 0644, |
44 | .proc_handler = proc_dointvec_jiffies, | 44 | .proc_handler = proc_dointvec_jiffies, |
45 | }, | 45 | }, |
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 1875181ebd94..c1460e635c7f 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
@@ -1651,7 +1651,7 @@ __ieee80211_sta_handle_tspec_ac_params(struct ieee80211_sub_if_data *sdata) | |||
1651 | { | 1651 | { |
1652 | struct ieee80211_local *local = sdata->local; | 1652 | struct ieee80211_local *local = sdata->local; |
1653 | struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; | 1653 | struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; |
1654 | bool ret; | 1654 | bool ret = false; |
1655 | int ac; | 1655 | int ac; |
1656 | 1656 | ||
1657 | if (local->hw.queues < IEEE80211_NUM_ACS) | 1657 | if (local->hw.queues < IEEE80211_NUM_ACS) |
diff --git a/net/mac80211/pm.c b/net/mac80211/pm.c index 8c8c67819072..ca405b6b686d 100644 --- a/net/mac80211/pm.c +++ b/net/mac80211/pm.c | |||
@@ -86,20 +86,6 @@ int __ieee80211_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan) | |||
86 | } | 86 | } |
87 | } | 87 | } |
88 | 88 | ||
89 | /* tear down aggregation sessions and remove STAs */ | ||
90 | mutex_lock(&local->sta_mtx); | ||
91 | list_for_each_entry(sta, &local->sta_list, list) { | ||
92 | if (sta->uploaded) { | ||
93 | enum ieee80211_sta_state state; | ||
94 | |||
95 | state = sta->sta_state; | ||
96 | for (; state > IEEE80211_STA_NOTEXIST; state--) | ||
97 | WARN_ON(drv_sta_state(local, sta->sdata, sta, | ||
98 | state, state - 1)); | ||
99 | } | ||
100 | } | ||
101 | mutex_unlock(&local->sta_mtx); | ||
102 | |||
103 | /* remove all interfaces that were created in the driver */ | 89 | /* remove all interfaces that were created in the driver */ |
104 | list_for_each_entry(sdata, &local->interfaces, list) { | 90 | list_for_each_entry(sdata, &local->interfaces, list) { |
105 | if (!ieee80211_sdata_running(sdata)) | 91 | if (!ieee80211_sdata_running(sdata)) |
@@ -111,6 +97,21 @@ int __ieee80211_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan) | |||
111 | case NL80211_IFTYPE_STATION: | 97 | case NL80211_IFTYPE_STATION: |
112 | ieee80211_mgd_quiesce(sdata); | 98 | ieee80211_mgd_quiesce(sdata); |
113 | break; | 99 | break; |
100 | case NL80211_IFTYPE_WDS: | ||
101 | /* tear down aggregation sessions and remove STAs */ | ||
102 | mutex_lock(&local->sta_mtx); | ||
103 | sta = sdata->u.wds.sta; | ||
104 | if (sta && sta->uploaded) { | ||
105 | enum ieee80211_sta_state state; | ||
106 | |||
107 | state = sta->sta_state; | ||
108 | for (; state > IEEE80211_STA_NOTEXIST; state--) | ||
109 | WARN_ON(drv_sta_state(local, sta->sdata, | ||
110 | sta, state, | ||
111 | state - 1)); | ||
112 | } | ||
113 | mutex_unlock(&local->sta_mtx); | ||
114 | break; | ||
114 | default: | 115 | default: |
115 | break; | 116 | break; |
116 | } | 117 | } |
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 3d79d498e7f6..9491e8689a9d 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c | |||
@@ -272,7 +272,7 @@ ieee80211_add_rx_radiotap_header(struct ieee80211_local *local, | |||
272 | else if (rate && rate->flags & IEEE80211_RATE_ERP_G) | 272 | else if (rate && rate->flags & IEEE80211_RATE_ERP_G) |
273 | channel_flags |= IEEE80211_CHAN_OFDM | IEEE80211_CHAN_2GHZ; | 273 | channel_flags |= IEEE80211_CHAN_OFDM | IEEE80211_CHAN_2GHZ; |
274 | else if (rate) | 274 | else if (rate) |
275 | channel_flags |= IEEE80211_CHAN_OFDM | IEEE80211_CHAN_2GHZ; | 275 | channel_flags |= IEEE80211_CHAN_CCK | IEEE80211_CHAN_2GHZ; |
276 | else | 276 | else |
277 | channel_flags |= IEEE80211_CHAN_2GHZ; | 277 | channel_flags |= IEEE80211_CHAN_2GHZ; |
278 | put_unaligned_le16(channel_flags, pos); | 278 | put_unaligned_le16(channel_flags, pos); |
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index d77b3467b1d4..2197af00673a 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c | |||
@@ -61,6 +61,7 @@ | |||
61 | #include <linux/rhashtable.h> | 61 | #include <linux/rhashtable.h> |
62 | #include <asm/cacheflush.h> | 62 | #include <asm/cacheflush.h> |
63 | #include <linux/hash.h> | 63 | #include <linux/hash.h> |
64 | #include <linux/genetlink.h> | ||
64 | 65 | ||
65 | #include <net/net_namespace.h> | 66 | #include <net/net_namespace.h> |
66 | #include <net/sock.h> | 67 | #include <net/sock.h> |
@@ -1091,6 +1092,8 @@ static void netlink_remove(struct sock *sk) | |||
1091 | __sk_del_bind_node(sk); | 1092 | __sk_del_bind_node(sk); |
1092 | netlink_update_listeners(sk); | 1093 | netlink_update_listeners(sk); |
1093 | } | 1094 | } |
1095 | if (sk->sk_protocol == NETLINK_GENERIC) | ||
1096 | atomic_inc(&genl_sk_destructing_cnt); | ||
1094 | netlink_table_ungrab(); | 1097 | netlink_table_ungrab(); |
1095 | } | 1098 | } |
1096 | 1099 | ||
@@ -1214,6 +1217,20 @@ static int netlink_release(struct socket *sock) | |||
1214 | * will be purged. | 1217 | * will be purged. |
1215 | */ | 1218 | */ |
1216 | 1219 | ||
1220 | /* must not acquire netlink_table_lock in any way again before unbind | ||
1221 | * and notifying genetlink is done as otherwise it might deadlock | ||
1222 | */ | ||
1223 | if (nlk->netlink_unbind) { | ||
1224 | int i; | ||
1225 | |||
1226 | for (i = 0; i < nlk->ngroups; i++) | ||
1227 | if (test_bit(i, nlk->groups)) | ||
1228 | nlk->netlink_unbind(sock_net(sk), i + 1); | ||
1229 | } | ||
1230 | if (sk->sk_protocol == NETLINK_GENERIC && | ||
1231 | atomic_dec_return(&genl_sk_destructing_cnt) == 0) | ||
1232 | wake_up(&genl_sk_destructing_waitq); | ||
1233 | |||
1217 | sock->sk = NULL; | 1234 | sock->sk = NULL; |
1218 | wake_up_interruptible_all(&nlk->wait); | 1235 | wake_up_interruptible_all(&nlk->wait); |
1219 | 1236 | ||
@@ -1249,13 +1266,6 @@ static int netlink_release(struct socket *sock) | |||
1249 | netlink_table_ungrab(); | 1266 | netlink_table_ungrab(); |
1250 | } | 1267 | } |
1251 | 1268 | ||
1252 | if (nlk->netlink_unbind) { | ||
1253 | int i; | ||
1254 | |||
1255 | for (i = 0; i < nlk->ngroups; i++) | ||
1256 | if (test_bit(i, nlk->groups)) | ||
1257 | nlk->netlink_unbind(sock_net(sk), i + 1); | ||
1258 | } | ||
1259 | kfree(nlk->groups); | 1269 | kfree(nlk->groups); |
1260 | nlk->groups = NULL; | 1270 | nlk->groups = NULL; |
1261 | 1271 | ||
diff --git a/net/netlink/af_netlink.h b/net/netlink/af_netlink.h index 7518375782f5..89008405d6b4 100644 --- a/net/netlink/af_netlink.h +++ b/net/netlink/af_netlink.h | |||
@@ -2,6 +2,7 @@ | |||
2 | #define _AF_NETLINK_H | 2 | #define _AF_NETLINK_H |
3 | 3 | ||
4 | #include <linux/rhashtable.h> | 4 | #include <linux/rhashtable.h> |
5 | #include <linux/atomic.h> | ||
5 | #include <net/sock.h> | 6 | #include <net/sock.h> |
6 | 7 | ||
7 | #define NLGRPSZ(x) (ALIGN(x, sizeof(unsigned long) * 8) / 8) | 8 | #define NLGRPSZ(x) (ALIGN(x, sizeof(unsigned long) * 8) / 8) |
diff --git a/net/netlink/genetlink.c b/net/netlink/genetlink.c index f52a7d5734cd..2ed5f964772e 100644 --- a/net/netlink/genetlink.c +++ b/net/netlink/genetlink.c | |||
@@ -23,6 +23,9 @@ | |||
23 | static DEFINE_MUTEX(genl_mutex); /* serialization of message processing */ | 23 | static DEFINE_MUTEX(genl_mutex); /* serialization of message processing */ |
24 | static DECLARE_RWSEM(cb_lock); | 24 | static DECLARE_RWSEM(cb_lock); |
25 | 25 | ||
26 | atomic_t genl_sk_destructing_cnt = ATOMIC_INIT(0); | ||
27 | DECLARE_WAIT_QUEUE_HEAD(genl_sk_destructing_waitq); | ||
28 | |||
26 | void genl_lock(void) | 29 | void genl_lock(void) |
27 | { | 30 | { |
28 | mutex_lock(&genl_mutex); | 31 | mutex_lock(&genl_mutex); |
@@ -435,15 +438,18 @@ int genl_unregister_family(struct genl_family *family) | |||
435 | 438 | ||
436 | genl_lock_all(); | 439 | genl_lock_all(); |
437 | 440 | ||
438 | genl_unregister_mc_groups(family); | ||
439 | |||
440 | list_for_each_entry(rc, genl_family_chain(family->id), family_list) { | 441 | list_for_each_entry(rc, genl_family_chain(family->id), family_list) { |
441 | if (family->id != rc->id || strcmp(rc->name, family->name)) | 442 | if (family->id != rc->id || strcmp(rc->name, family->name)) |
442 | continue; | 443 | continue; |
443 | 444 | ||
445 | genl_unregister_mc_groups(family); | ||
446 | |||
444 | list_del(&rc->family_list); | 447 | list_del(&rc->family_list); |
445 | family->n_ops = 0; | 448 | family->n_ops = 0; |
446 | genl_unlock_all(); | 449 | up_write(&cb_lock); |
450 | wait_event(genl_sk_destructing_waitq, | ||
451 | atomic_read(&genl_sk_destructing_cnt) == 0); | ||
452 | genl_unlock(); | ||
447 | 453 | ||
448 | kfree(family->attrbuf); | 454 | kfree(family->attrbuf); |
449 | genl_ctrl_event(CTRL_CMD_DELFAMILY, family, NULL, 0); | 455 | genl_ctrl_event(CTRL_CMD_DELFAMILY, family, NULL, 0); |
@@ -987,7 +993,7 @@ static struct genl_multicast_group genl_ctrl_groups[] = { | |||
987 | 993 | ||
988 | static int genl_bind(struct net *net, int group) | 994 | static int genl_bind(struct net *net, int group) |
989 | { | 995 | { |
990 | int i, err = 0; | 996 | int i, err = -ENOENT; |
991 | 997 | ||
992 | down_read(&cb_lock); | 998 | down_read(&cb_lock); |
993 | for (i = 0; i < GENL_FAM_TAB_SIZE; i++) { | 999 | for (i = 0; i < GENL_FAM_TAB_SIZE; i++) { |
@@ -1016,7 +1022,6 @@ static int genl_bind(struct net *net, int group) | |||
1016 | static void genl_unbind(struct net *net, int group) | 1022 | static void genl_unbind(struct net *net, int group) |
1017 | { | 1023 | { |
1018 | int i; | 1024 | int i; |
1019 | bool found = false; | ||
1020 | 1025 | ||
1021 | down_read(&cb_lock); | 1026 | down_read(&cb_lock); |
1022 | for (i = 0; i < GENL_FAM_TAB_SIZE; i++) { | 1027 | for (i = 0; i < GENL_FAM_TAB_SIZE; i++) { |
@@ -1029,14 +1034,11 @@ static void genl_unbind(struct net *net, int group) | |||
1029 | 1034 | ||
1030 | if (f->mcast_unbind) | 1035 | if (f->mcast_unbind) |
1031 | f->mcast_unbind(net, fam_grp); | 1036 | f->mcast_unbind(net, fam_grp); |
1032 | found = true; | ||
1033 | break; | 1037 | break; |
1034 | } | 1038 | } |
1035 | } | 1039 | } |
1036 | } | 1040 | } |
1037 | up_read(&cb_lock); | 1041 | up_read(&cb_lock); |
1038 | |||
1039 | WARN_ON(!found); | ||
1040 | } | 1042 | } |
1041 | 1043 | ||
1042 | static int __net_init genl_pernet_init(struct net *net) | 1044 | static int __net_init genl_pernet_init(struct net *net) |
diff --git a/net/sched/cls_bpf.c b/net/sched/cls_bpf.c index 1029923f9e86..5f3ee9e4b5bf 100644 --- a/net/sched/cls_bpf.c +++ b/net/sched/cls_bpf.c | |||
@@ -180,6 +180,11 @@ static int cls_bpf_modify_existing(struct net *net, struct tcf_proto *tp, | |||
180 | } | 180 | } |
181 | 181 | ||
182 | bpf_size = bpf_num_ops * sizeof(*bpf_ops); | 182 | bpf_size = bpf_num_ops * sizeof(*bpf_ops); |
183 | if (bpf_size != nla_len(tb[TCA_BPF_OPS])) { | ||
184 | ret = -EINVAL; | ||
185 | goto errout; | ||
186 | } | ||
187 | |||
183 | bpf_ops = kzalloc(bpf_size, GFP_KERNEL); | 188 | bpf_ops = kzalloc(bpf_size, GFP_KERNEL); |
184 | if (bpf_ops == NULL) { | 189 | if (bpf_ops == NULL) { |
185 | ret = -ENOMEM; | 190 | ret = -ENOMEM; |
@@ -215,15 +220,21 @@ static u32 cls_bpf_grab_new_handle(struct tcf_proto *tp, | |||
215 | struct cls_bpf_head *head) | 220 | struct cls_bpf_head *head) |
216 | { | 221 | { |
217 | unsigned int i = 0x80000000; | 222 | unsigned int i = 0x80000000; |
223 | u32 handle; | ||
218 | 224 | ||
219 | do { | 225 | do { |
220 | if (++head->hgen == 0x7FFFFFFF) | 226 | if (++head->hgen == 0x7FFFFFFF) |
221 | head->hgen = 1; | 227 | head->hgen = 1; |
222 | } while (--i > 0 && cls_bpf_get(tp, head->hgen)); | 228 | } while (--i > 0 && cls_bpf_get(tp, head->hgen)); |
223 | if (i == 0) | 229 | |
230 | if (unlikely(i == 0)) { | ||
224 | pr_err("Insufficient number of handles\n"); | 231 | pr_err("Insufficient number of handles\n"); |
232 | handle = 0; | ||
233 | } else { | ||
234 | handle = head->hgen; | ||
235 | } | ||
225 | 236 | ||
226 | return i; | 237 | return handle; |
227 | } | 238 | } |
228 | 239 | ||
229 | static int cls_bpf_change(struct net *net, struct sk_buff *in_skb, | 240 | static int cls_bpf_change(struct net *net, struct sk_buff *in_skb, |
diff --git a/net/sctp/associola.c b/net/sctp/associola.c index f791edd64d6c..26d06dbcc1c8 100644 --- a/net/sctp/associola.c +++ b/net/sctp/associola.c | |||
@@ -1182,7 +1182,6 @@ void sctp_assoc_update(struct sctp_association *asoc, | |||
1182 | asoc->peer.peer_hmacs = new->peer.peer_hmacs; | 1182 | asoc->peer.peer_hmacs = new->peer.peer_hmacs; |
1183 | new->peer.peer_hmacs = NULL; | 1183 | new->peer.peer_hmacs = NULL; |
1184 | 1184 | ||
1185 | sctp_auth_key_put(asoc->asoc_shared_key); | ||
1186 | sctp_auth_asoc_init_active_key(asoc, GFP_ATOMIC); | 1185 | sctp_auth_asoc_init_active_key(asoc, GFP_ATOMIC); |
1187 | } | 1186 | } |
1188 | 1187 | ||
diff --git a/net/sctp/socket.c b/net/sctp/socket.c index 2625eccb77d5..aafe94bf292e 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c | |||
@@ -1603,7 +1603,7 @@ static int sctp_sendmsg(struct kiocb *iocb, struct sock *sk, | |||
1603 | sctp_assoc_t associd = 0; | 1603 | sctp_assoc_t associd = 0; |
1604 | sctp_cmsgs_t cmsgs = { NULL }; | 1604 | sctp_cmsgs_t cmsgs = { NULL }; |
1605 | sctp_scope_t scope; | 1605 | sctp_scope_t scope; |
1606 | bool fill_sinfo_ttl = false; | 1606 | bool fill_sinfo_ttl = false, wait_connect = false; |
1607 | struct sctp_datamsg *datamsg; | 1607 | struct sctp_datamsg *datamsg; |
1608 | int msg_flags = msg->msg_flags; | 1608 | int msg_flags = msg->msg_flags; |
1609 | __u16 sinfo_flags = 0; | 1609 | __u16 sinfo_flags = 0; |
@@ -1943,6 +1943,7 @@ static int sctp_sendmsg(struct kiocb *iocb, struct sock *sk, | |||
1943 | if (err < 0) | 1943 | if (err < 0) |
1944 | goto out_free; | 1944 | goto out_free; |
1945 | 1945 | ||
1946 | wait_connect = true; | ||
1946 | pr_debug("%s: we associated primitively\n", __func__); | 1947 | pr_debug("%s: we associated primitively\n", __func__); |
1947 | } | 1948 | } |
1948 | 1949 | ||
@@ -1980,6 +1981,11 @@ static int sctp_sendmsg(struct kiocb *iocb, struct sock *sk, | |||
1980 | sctp_datamsg_put(datamsg); | 1981 | sctp_datamsg_put(datamsg); |
1981 | err = msg_len; | 1982 | err = msg_len; |
1982 | 1983 | ||
1984 | if (unlikely(wait_connect)) { | ||
1985 | timeo = sock_sndtimeo(sk, msg_flags & MSG_DONTWAIT); | ||
1986 | sctp_wait_for_connect(asoc, &timeo); | ||
1987 | } | ||
1988 | |||
1983 | /* If we are already past ASSOCIATE, the lower | 1989 | /* If we are already past ASSOCIATE, the lower |
1984 | * layers are responsible for association cleanup. | 1990 | * layers are responsible for association cleanup. |
1985 | */ | 1991 | */ |
diff --git a/net/socket.c b/net/socket.c index 9fcf15b61009..3acd35f144d6 100644 --- a/net/socket.c +++ b/net/socket.c | |||
@@ -869,9 +869,6 @@ static ssize_t sock_splice_read(struct file *file, loff_t *ppos, | |||
869 | static struct sock_iocb *alloc_sock_iocb(struct kiocb *iocb, | 869 | static struct sock_iocb *alloc_sock_iocb(struct kiocb *iocb, |
870 | struct sock_iocb *siocb) | 870 | struct sock_iocb *siocb) |
871 | { | 871 | { |
872 | if (!is_sync_kiocb(iocb)) | ||
873 | BUG(); | ||
874 | |||
875 | siocb->kiocb = iocb; | 872 | siocb->kiocb = iocb; |
876 | iocb->private = siocb; | 873 | iocb->private = siocb; |
877 | return siocb; | 874 | return siocb; |
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 4fc812f2b583..7d60f4bf95d2 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -2871,6 +2871,9 @@ static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info) | |||
2871 | if (!rdev->ops->get_key) | 2871 | if (!rdev->ops->get_key) |
2872 | return -EOPNOTSUPP; | 2872 | return -EOPNOTSUPP; |
2873 | 2873 | ||
2874 | if (!pairwise && mac_addr && !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) | ||
2875 | return -ENOENT; | ||
2876 | |||
2874 | msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); | 2877 | msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); |
2875 | if (!msg) | 2878 | if (!msg) |
2876 | return -ENOMEM; | 2879 | return -ENOMEM; |
@@ -2890,10 +2893,6 @@ static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info) | |||
2890 | nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr)) | 2893 | nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr)) |
2891 | goto nla_put_failure; | 2894 | goto nla_put_failure; |
2892 | 2895 | ||
2893 | if (pairwise && mac_addr && | ||
2894 | !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) | ||
2895 | return -ENOENT; | ||
2896 | |||
2897 | err = rdev_get_key(rdev, dev, key_idx, pairwise, mac_addr, &cookie, | 2896 | err = rdev_get_key(rdev, dev, key_idx, pairwise, mac_addr, &cookie, |
2898 | get_key_callback); | 2897 | get_key_callback); |
2899 | 2898 | ||
@@ -3064,7 +3063,7 @@ static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info) | |||
3064 | wdev_lock(dev->ieee80211_ptr); | 3063 | wdev_lock(dev->ieee80211_ptr); |
3065 | err = nl80211_key_allowed(dev->ieee80211_ptr); | 3064 | err = nl80211_key_allowed(dev->ieee80211_ptr); |
3066 | 3065 | ||
3067 | if (key.type == NL80211_KEYTYPE_PAIRWISE && mac_addr && | 3066 | if (key.type == NL80211_KEYTYPE_GROUP && mac_addr && |
3068 | !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) | 3067 | !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) |
3069 | err = -ENOENT; | 3068 | err = -ENOENT; |
3070 | 3069 | ||
diff --git a/net/wireless/reg.c b/net/wireless/reg.c index 886cc7cb5566..b586d0dcb09e 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c | |||
@@ -1533,45 +1533,40 @@ static void reg_call_notifier(struct wiphy *wiphy, | |||
1533 | 1533 | ||
1534 | static bool reg_wdev_chan_valid(struct wiphy *wiphy, struct wireless_dev *wdev) | 1534 | static bool reg_wdev_chan_valid(struct wiphy *wiphy, struct wireless_dev *wdev) |
1535 | { | 1535 | { |
1536 | struct ieee80211_channel *ch; | ||
1537 | struct cfg80211_chan_def chandef; | 1536 | struct cfg80211_chan_def chandef; |
1538 | struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); | 1537 | struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); |
1539 | bool ret = true; | 1538 | enum nl80211_iftype iftype; |
1540 | 1539 | ||
1541 | wdev_lock(wdev); | 1540 | wdev_lock(wdev); |
1541 | iftype = wdev->iftype; | ||
1542 | 1542 | ||
1543 | /* make sure the interface is active */ | ||
1543 | if (!wdev->netdev || !netif_running(wdev->netdev)) | 1544 | if (!wdev->netdev || !netif_running(wdev->netdev)) |
1544 | goto out; | 1545 | goto wdev_inactive_unlock; |
1545 | 1546 | ||
1546 | switch (wdev->iftype) { | 1547 | switch (iftype) { |
1547 | case NL80211_IFTYPE_AP: | 1548 | case NL80211_IFTYPE_AP: |
1548 | case NL80211_IFTYPE_P2P_GO: | 1549 | case NL80211_IFTYPE_P2P_GO: |
1549 | if (!wdev->beacon_interval) | 1550 | if (!wdev->beacon_interval) |
1550 | goto out; | 1551 | goto wdev_inactive_unlock; |
1551 | 1552 | chandef = wdev->chandef; | |
1552 | ret = cfg80211_reg_can_beacon(wiphy, | ||
1553 | &wdev->chandef, wdev->iftype); | ||
1554 | break; | 1553 | break; |
1555 | case NL80211_IFTYPE_ADHOC: | 1554 | case NL80211_IFTYPE_ADHOC: |
1556 | if (!wdev->ssid_len) | 1555 | if (!wdev->ssid_len) |
1557 | goto out; | 1556 | goto wdev_inactive_unlock; |
1558 | 1557 | chandef = wdev->chandef; | |
1559 | ret = cfg80211_reg_can_beacon(wiphy, | ||
1560 | &wdev->chandef, wdev->iftype); | ||
1561 | break; | 1558 | break; |
1562 | case NL80211_IFTYPE_STATION: | 1559 | case NL80211_IFTYPE_STATION: |
1563 | case NL80211_IFTYPE_P2P_CLIENT: | 1560 | case NL80211_IFTYPE_P2P_CLIENT: |
1564 | if (!wdev->current_bss || | 1561 | if (!wdev->current_bss || |
1565 | !wdev->current_bss->pub.channel) | 1562 | !wdev->current_bss->pub.channel) |
1566 | goto out; | 1563 | goto wdev_inactive_unlock; |
1567 | 1564 | ||
1568 | ch = wdev->current_bss->pub.channel; | 1565 | if (!rdev->ops->get_channel || |
1569 | if (rdev->ops->get_channel && | 1566 | rdev_get_channel(rdev, wdev, &chandef)) |
1570 | !rdev_get_channel(rdev, wdev, &chandef)) | 1567 | cfg80211_chandef_create(&chandef, |
1571 | ret = cfg80211_chandef_usable(wiphy, &chandef, | 1568 | wdev->current_bss->pub.channel, |
1572 | IEEE80211_CHAN_DISABLED); | 1569 | NL80211_CHAN_NO_HT); |
1573 | else | ||
1574 | ret = !(ch->flags & IEEE80211_CHAN_DISABLED); | ||
1575 | break; | 1570 | break; |
1576 | case NL80211_IFTYPE_MONITOR: | 1571 | case NL80211_IFTYPE_MONITOR: |
1577 | case NL80211_IFTYPE_AP_VLAN: | 1572 | case NL80211_IFTYPE_AP_VLAN: |
@@ -1584,9 +1579,26 @@ static bool reg_wdev_chan_valid(struct wiphy *wiphy, struct wireless_dev *wdev) | |||
1584 | break; | 1579 | break; |
1585 | } | 1580 | } |
1586 | 1581 | ||
1587 | out: | ||
1588 | wdev_unlock(wdev); | 1582 | wdev_unlock(wdev); |
1589 | return ret; | 1583 | |
1584 | switch (iftype) { | ||
1585 | case NL80211_IFTYPE_AP: | ||
1586 | case NL80211_IFTYPE_P2P_GO: | ||
1587 | case NL80211_IFTYPE_ADHOC: | ||
1588 | return cfg80211_reg_can_beacon(wiphy, &chandef, iftype); | ||
1589 | case NL80211_IFTYPE_STATION: | ||
1590 | case NL80211_IFTYPE_P2P_CLIENT: | ||
1591 | return cfg80211_chandef_usable(wiphy, &chandef, | ||
1592 | IEEE80211_CHAN_DISABLED); | ||
1593 | default: | ||
1594 | break; | ||
1595 | } | ||
1596 | |||
1597 | return true; | ||
1598 | |||
1599 | wdev_inactive_unlock: | ||
1600 | wdev_unlock(wdev); | ||
1601 | return true; | ||
1590 | } | 1602 | } |
1591 | 1603 | ||
1592 | static void reg_leave_invalid_chans(struct wiphy *wiphy) | 1604 | static void reg_leave_invalid_chans(struct wiphy *wiphy) |
diff --git a/net/wireless/util.c b/net/wireless/util.c index 97c744eeac4f..0d1966d54aaa 100644 --- a/net/wireless/util.c +++ b/net/wireless/util.c | |||
@@ -308,6 +308,12 @@ unsigned int __attribute_const__ ieee80211_hdrlen(__le16 fc) | |||
308 | goto out; | 308 | goto out; |
309 | } | 309 | } |
310 | 310 | ||
311 | if (ieee80211_is_mgmt(fc)) { | ||
312 | if (ieee80211_has_order(fc)) | ||
313 | hdrlen += IEEE80211_HT_CTL_LEN; | ||
314 | goto out; | ||
315 | } | ||
316 | |||
311 | if (ieee80211_is_ctl(fc)) { | 317 | if (ieee80211_is_ctl(fc)) { |
312 | /* | 318 | /* |
313 | * ACK and CTS are 10 bytes, all others 16. To see how | 319 | * ACK and CTS are 10 bytes, all others 16. To see how |
diff --git a/samples/bpf/test_maps.c b/samples/bpf/test_maps.c index e286b42307f3..6299ee95cd11 100644 --- a/samples/bpf/test_maps.c +++ b/samples/bpf/test_maps.c | |||
@@ -69,9 +69,9 @@ static void test_hashmap_sanity(int i, void *data) | |||
69 | 69 | ||
70 | /* iterate over two elements */ | 70 | /* iterate over two elements */ |
71 | assert(bpf_get_next_key(map_fd, &key, &next_key) == 0 && | 71 | assert(bpf_get_next_key(map_fd, &key, &next_key) == 0 && |
72 | next_key == 2); | 72 | (next_key == 1 || next_key == 2)); |
73 | assert(bpf_get_next_key(map_fd, &next_key, &next_key) == 0 && | 73 | assert(bpf_get_next_key(map_fd, &next_key, &next_key) == 0 && |
74 | next_key == 1); | 74 | (next_key == 1 || next_key == 2)); |
75 | assert(bpf_get_next_key(map_fd, &next_key, &next_key) == -1 && | 75 | assert(bpf_get_next_key(map_fd, &next_key, &next_key) == -1 && |
76 | errno == ENOENT); | 76 | errno == ENOENT); |
77 | 77 | ||
diff --git a/scripts/recordmcount.pl b/scripts/recordmcount.pl index 56ea99a12ab7..537c38ca2e1c 100755 --- a/scripts/recordmcount.pl +++ b/scripts/recordmcount.pl | |||
@@ -255,7 +255,6 @@ if ($arch eq "x86_64") { | |||
255 | # force flags for this arch | 255 | # force flags for this arch |
256 | $ld .= " -m shlelf_linux"; | 256 | $ld .= " -m shlelf_linux"; |
257 | $objcopy .= " -O elf32-sh-linux"; | 257 | $objcopy .= " -O elf32-sh-linux"; |
258 | $cc .= " -m32"; | ||
259 | 258 | ||
260 | } elsif ($arch eq "powerpc") { | 259 | } elsif ($arch eq "powerpc") { |
261 | $local_regex = "^[0-9a-fA-F]+\\s+t\\s+(\\.?\\S+)"; | 260 | $local_regex = "^[0-9a-fA-F]+\\s+t\\s+(\\.?\\S+)"; |
diff --git a/sound/firewire/amdtp.c b/sound/firewire/amdtp.c index 3badc70124ab..0d580186ef1a 100644 --- a/sound/firewire/amdtp.c +++ b/sound/firewire/amdtp.c | |||
@@ -21,7 +21,19 @@ | |||
21 | #define CYCLES_PER_SECOND 8000 | 21 | #define CYCLES_PER_SECOND 8000 |
22 | #define TICKS_PER_SECOND (TICKS_PER_CYCLE * CYCLES_PER_SECOND) | 22 | #define TICKS_PER_SECOND (TICKS_PER_CYCLE * CYCLES_PER_SECOND) |
23 | 23 | ||
24 | #define TRANSFER_DELAY_TICKS 0x2e00 /* 479.17 µs */ | 24 | /* |
25 | * Nominally 3125 bytes/second, but the MIDI port's clock might be | ||
26 | * 1% too slow, and the bus clock 100 ppm too fast. | ||
27 | */ | ||
28 | #define MIDI_BYTES_PER_SECOND 3093 | ||
29 | |||
30 | /* | ||
31 | * Several devices look only at the first eight data blocks. | ||
32 | * In any case, this is more than enough for the MIDI data rate. | ||
33 | */ | ||
34 | #define MAX_MIDI_RX_BLOCKS 8 | ||
35 | |||
36 | #define TRANSFER_DELAY_TICKS 0x2e00 /* 479.17 µs */ | ||
25 | 37 | ||
26 | /* isochronous header parameters */ | 38 | /* isochronous header parameters */ |
27 | #define ISO_DATA_LENGTH_SHIFT 16 | 39 | #define ISO_DATA_LENGTH_SHIFT 16 |
@@ -78,8 +90,6 @@ int amdtp_stream_init(struct amdtp_stream *s, struct fw_unit *unit, | |||
78 | s->callbacked = false; | 90 | s->callbacked = false; |
79 | s->sync_slave = NULL; | 91 | s->sync_slave = NULL; |
80 | 92 | ||
81 | s->rx_blocks_for_midi = UINT_MAX; | ||
82 | |||
83 | return 0; | 93 | return 0; |
84 | } | 94 | } |
85 | EXPORT_SYMBOL(amdtp_stream_init); | 95 | EXPORT_SYMBOL(amdtp_stream_init); |
@@ -222,6 +232,14 @@ sfc_found: | |||
222 | for (i = 0; i < pcm_channels; i++) | 232 | for (i = 0; i < pcm_channels; i++) |
223 | s->pcm_positions[i] = i; | 233 | s->pcm_positions[i] = i; |
224 | s->midi_position = s->pcm_channels; | 234 | s->midi_position = s->pcm_channels; |
235 | |||
236 | /* | ||
237 | * We do not know the actual MIDI FIFO size of most devices. Just | ||
238 | * assume two bytes, i.e., one byte can be received over the bus while | ||
239 | * the previous one is transmitted over MIDI. | ||
240 | * (The value here is adjusted for midi_ratelimit_per_packet().) | ||
241 | */ | ||
242 | s->midi_fifo_limit = rate - MIDI_BYTES_PER_SECOND * s->syt_interval + 1; | ||
225 | } | 243 | } |
226 | EXPORT_SYMBOL(amdtp_stream_set_parameters); | 244 | EXPORT_SYMBOL(amdtp_stream_set_parameters); |
227 | 245 | ||
@@ -463,6 +481,36 @@ static void amdtp_fill_pcm_silence(struct amdtp_stream *s, | |||
463 | } | 481 | } |
464 | } | 482 | } |
465 | 483 | ||
484 | /* | ||
485 | * To avoid sending MIDI bytes at too high a rate, assume that the receiving | ||
486 | * device has a FIFO, and track how much it is filled. This values increases | ||
487 | * by one whenever we send one byte in a packet, but the FIFO empties at | ||
488 | * a constant rate independent of our packet rate. One packet has syt_interval | ||
489 | * samples, so the number of bytes that empty out of the FIFO, per packet(!), | ||
490 | * is MIDI_BYTES_PER_SECOND * syt_interval / sample_rate. To avoid storing | ||
491 | * fractional values, the values in midi_fifo_used[] are measured in bytes | ||
492 | * multiplied by the sample rate. | ||
493 | */ | ||
494 | static bool midi_ratelimit_per_packet(struct amdtp_stream *s, unsigned int port) | ||
495 | { | ||
496 | int used; | ||
497 | |||
498 | used = s->midi_fifo_used[port]; | ||
499 | if (used == 0) /* common shortcut */ | ||
500 | return true; | ||
501 | |||
502 | used -= MIDI_BYTES_PER_SECOND * s->syt_interval; | ||
503 | used = max(used, 0); | ||
504 | s->midi_fifo_used[port] = used; | ||
505 | |||
506 | return used < s->midi_fifo_limit; | ||
507 | } | ||
508 | |||
509 | static void midi_rate_use_one_byte(struct amdtp_stream *s, unsigned int port) | ||
510 | { | ||
511 | s->midi_fifo_used[port] += amdtp_rate_table[s->sfc]; | ||
512 | } | ||
513 | |||
466 | static void amdtp_fill_midi(struct amdtp_stream *s, | 514 | static void amdtp_fill_midi(struct amdtp_stream *s, |
467 | __be32 *buffer, unsigned int frames) | 515 | __be32 *buffer, unsigned int frames) |
468 | { | 516 | { |
@@ -470,16 +518,21 @@ static void amdtp_fill_midi(struct amdtp_stream *s, | |||
470 | u8 *b; | 518 | u8 *b; |
471 | 519 | ||
472 | for (f = 0; f < frames; f++) { | 520 | for (f = 0; f < frames; f++) { |
473 | buffer[s->midi_position] = 0; | ||
474 | b = (u8 *)&buffer[s->midi_position]; | 521 | b = (u8 *)&buffer[s->midi_position]; |
475 | 522 | ||
476 | port = (s->data_block_counter + f) % 8; | 523 | port = (s->data_block_counter + f) % 8; |
477 | if ((f >= s->rx_blocks_for_midi) || | 524 | if (f < MAX_MIDI_RX_BLOCKS && |
478 | (s->midi[port] == NULL) || | 525 | midi_ratelimit_per_packet(s, port) && |
479 | (snd_rawmidi_transmit(s->midi[port], b + 1, 1) <= 0)) | 526 | s->midi[port] != NULL && |
480 | b[0] = 0x80; | 527 | snd_rawmidi_transmit(s->midi[port], &b[1], 1) == 1) { |
481 | else | 528 | midi_rate_use_one_byte(s, port); |
482 | b[0] = 0x81; | 529 | b[0] = 0x81; |
530 | } else { | ||
531 | b[0] = 0x80; | ||
532 | b[1] = 0; | ||
533 | } | ||
534 | b[2] = 0; | ||
535 | b[3] = 0; | ||
483 | 536 | ||
484 | buffer += s->data_block_quadlets; | 537 | buffer += s->data_block_quadlets; |
485 | } | 538 | } |
diff --git a/sound/firewire/amdtp.h b/sound/firewire/amdtp.h index e6e8926275b0..8a03a91e728b 100644 --- a/sound/firewire/amdtp.h +++ b/sound/firewire/amdtp.h | |||
@@ -148,13 +148,12 @@ struct amdtp_stream { | |||
148 | bool double_pcm_frames; | 148 | bool double_pcm_frames; |
149 | 149 | ||
150 | struct snd_rawmidi_substream *midi[AMDTP_MAX_CHANNELS_FOR_MIDI * 8]; | 150 | struct snd_rawmidi_substream *midi[AMDTP_MAX_CHANNELS_FOR_MIDI * 8]; |
151 | int midi_fifo_limit; | ||
152 | int midi_fifo_used[AMDTP_MAX_CHANNELS_FOR_MIDI * 8]; | ||
151 | 153 | ||
152 | /* quirk: fixed interval of dbc between previos/current packets. */ | 154 | /* quirk: fixed interval of dbc between previos/current packets. */ |
153 | unsigned int tx_dbc_interval; | 155 | unsigned int tx_dbc_interval; |
154 | 156 | ||
155 | /* quirk: the first count of data blocks in an rx packet for MIDI */ | ||
156 | unsigned int rx_blocks_for_midi; | ||
157 | |||
158 | bool callbacked; | 157 | bool callbacked; |
159 | wait_queue_head_t callback_wait; | 158 | wait_queue_head_t callback_wait; |
160 | struct amdtp_stream *sync_slave; | 159 | struct amdtp_stream *sync_slave; |
diff --git a/sound/firewire/bebob/bebob_stream.c b/sound/firewire/bebob/bebob_stream.c index 1aab0a32870c..0ebcabfdc7ce 100644 --- a/sound/firewire/bebob/bebob_stream.c +++ b/sound/firewire/bebob/bebob_stream.c | |||
@@ -484,13 +484,6 @@ int snd_bebob_stream_init_duplex(struct snd_bebob *bebob) | |||
484 | amdtp_stream_destroy(&bebob->rx_stream); | 484 | amdtp_stream_destroy(&bebob->rx_stream); |
485 | destroy_both_connections(bebob); | 485 | destroy_both_connections(bebob); |
486 | } | 486 | } |
487 | /* | ||
488 | * The firmware for these devices ignore MIDI messages in more than | ||
489 | * first 8 data blocks of an received AMDTP packet. | ||
490 | */ | ||
491 | if (bebob->spec == &maudio_fw410_spec || | ||
492 | bebob->spec == &maudio_special_spec) | ||
493 | bebob->rx_stream.rx_blocks_for_midi = 8; | ||
494 | end: | 487 | end: |
495 | return err; | 488 | return err; |
496 | } | 489 | } |
diff --git a/sound/firewire/fireworks/fireworks_stream.c b/sound/firewire/fireworks/fireworks_stream.c index b985fc5ebdc6..4f440e163667 100644 --- a/sound/firewire/fireworks/fireworks_stream.c +++ b/sound/firewire/fireworks/fireworks_stream.c | |||
@@ -179,11 +179,6 @@ int snd_efw_stream_init_duplex(struct snd_efw *efw) | |||
179 | destroy_stream(efw, &efw->tx_stream); | 179 | destroy_stream(efw, &efw->tx_stream); |
180 | goto end; | 180 | goto end; |
181 | } | 181 | } |
182 | /* | ||
183 | * Fireworks ignores MIDI messages in more than first 8 data | ||
184 | * blocks of an received AMDTP packet. | ||
185 | */ | ||
186 | efw->rx_stream.rx_blocks_for_midi = 8; | ||
187 | 182 | ||
188 | /* set IEC61883 compliant mode (actually not fully compliant...) */ | 183 | /* set IEC61883 compliant mode (actually not fully compliant...) */ |
189 | err = snd_efw_command_set_tx_mode(efw, SND_EFW_TRANSPORT_MODE_IEC61883); | 184 | err = snd_efw_command_set_tx_mode(efw, SND_EFW_TRANSPORT_MODE_IEC61883); |
diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c index 41650d5b93b7..3e2ef61c627b 100644 --- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c | |||
@@ -913,6 +913,7 @@ static void volume_control_quirks(struct usb_mixer_elem_info *cval, | |||
913 | case USB_ID(0x046d, 0x0807): /* Logitech Webcam C500 */ | 913 | case USB_ID(0x046d, 0x0807): /* Logitech Webcam C500 */ |
914 | case USB_ID(0x046d, 0x0808): | 914 | case USB_ID(0x046d, 0x0808): |
915 | case USB_ID(0x046d, 0x0809): | 915 | case USB_ID(0x046d, 0x0809): |
916 | case USB_ID(0x046d, 0x0819): /* Logitech Webcam C210 */ | ||
916 | case USB_ID(0x046d, 0x081b): /* HD Webcam c310 */ | 917 | case USB_ID(0x046d, 0x081b): /* HD Webcam c310 */ |
917 | case USB_ID(0x046d, 0x081d): /* HD Webcam c510 */ | 918 | case USB_ID(0x046d, 0x081d): /* HD Webcam c510 */ |
918 | case USB_ID(0x046d, 0x0825): /* HD Webcam c270 */ | 919 | case USB_ID(0x046d, 0x0825): /* HD Webcam c270 */ |
diff --git a/tools/include/asm-generic/bitops.h b/tools/include/asm-generic/bitops.h index 6eedba1f7732..653d1bad77de 100644 --- a/tools/include/asm-generic/bitops.h +++ b/tools/include/asm-generic/bitops.h | |||
@@ -22,6 +22,8 @@ | |||
22 | #error only <linux/bitops.h> can be included directly | 22 | #error only <linux/bitops.h> can be included directly |
23 | #endif | 23 | #endif |
24 | 24 | ||
25 | #include <asm-generic/bitops/hweight.h> | ||
26 | |||
25 | #include <asm-generic/bitops/atomic.h> | 27 | #include <asm-generic/bitops/atomic.h> |
26 | 28 | ||
27 | #endif /* __TOOLS_ASM_GENERIC_BITOPS_H */ | 29 | #endif /* __TOOLS_ASM_GENERIC_BITOPS_H */ |
diff --git a/tools/include/asm-generic/bitops/arch_hweight.h b/tools/include/asm-generic/bitops/arch_hweight.h new file mode 100644 index 000000000000..318bb2b202b0 --- /dev/null +++ b/tools/include/asm-generic/bitops/arch_hweight.h | |||
@@ -0,0 +1 @@ | |||
#include "../../../../include/asm-generic/bitops/arch_hweight.h" | |||
diff --git a/tools/include/asm-generic/bitops/const_hweight.h b/tools/include/asm-generic/bitops/const_hweight.h new file mode 100644 index 000000000000..0afd644aff83 --- /dev/null +++ b/tools/include/asm-generic/bitops/const_hweight.h | |||
@@ -0,0 +1 @@ | |||
#include "../../../../include/asm-generic/bitops/const_hweight.h" | |||
diff --git a/tools/include/asm-generic/bitops/hweight.h b/tools/include/asm-generic/bitops/hweight.h new file mode 100644 index 000000000000..290120c01a8e --- /dev/null +++ b/tools/include/asm-generic/bitops/hweight.h | |||
@@ -0,0 +1,7 @@ | |||
1 | #ifndef _TOOLS_LINUX_ASM_GENERIC_BITOPS_HWEIGHT_H_ | ||
2 | #define _TOOLS_LINUX_ASM_GENERIC_BITOPS_HWEIGHT_H_ | ||
3 | |||
4 | #include <asm-generic/bitops/arch_hweight.h> | ||
5 | #include <asm-generic/bitops/const_hweight.h> | ||
6 | |||
7 | #endif /* _TOOLS_LINUX_ASM_GENERIC_BITOPS_HWEIGHT_H_ */ | ||
diff --git a/tools/include/linux/bitops.h b/tools/include/linux/bitops.h index 26005a15e7e2..5ad9ee1dd7f6 100644 --- a/tools/include/linux/bitops.h +++ b/tools/include/linux/bitops.h | |||
@@ -1,9 +1,9 @@ | |||
1 | #ifndef _TOOLS_LINUX_BITOPS_H_ | 1 | #ifndef _TOOLS_LINUX_BITOPS_H_ |
2 | #define _TOOLS_LINUX_BITOPS_H_ | 2 | #define _TOOLS_LINUX_BITOPS_H_ |
3 | 3 | ||
4 | #include <asm/types.h> | ||
4 | #include <linux/kernel.h> | 5 | #include <linux/kernel.h> |
5 | #include <linux/compiler.h> | 6 | #include <linux/compiler.h> |
6 | #include <asm/hweight.h> | ||
7 | 7 | ||
8 | #ifndef __WORDSIZE | 8 | #ifndef __WORDSIZE |
9 | #define __WORDSIZE (__SIZEOF_LONG__ * 8) | 9 | #define __WORDSIZE (__SIZEOF_LONG__ * 8) |
@@ -19,6 +19,11 @@ | |||
19 | #define BITS_TO_U32(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(u32)) | 19 | #define BITS_TO_U32(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(u32)) |
20 | #define BITS_TO_BYTES(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE) | 20 | #define BITS_TO_BYTES(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE) |
21 | 21 | ||
22 | extern unsigned int __sw_hweight8(unsigned int w); | ||
23 | extern unsigned int __sw_hweight16(unsigned int w); | ||
24 | extern unsigned int __sw_hweight32(unsigned int w); | ||
25 | extern unsigned long __sw_hweight64(__u64 w); | ||
26 | |||
22 | /* | 27 | /* |
23 | * Include this here because some architectures need generic_ffs/fls in | 28 | * Include this here because some architectures need generic_ffs/fls in |
24 | * scope | 29 | * scope |
diff --git a/tools/lib/api/fs/debugfs.c b/tools/lib/api/fs/debugfs.c index a74fba6d7743..86ea2d7b8845 100644 --- a/tools/lib/api/fs/debugfs.c +++ b/tools/lib/api/fs/debugfs.c | |||
@@ -67,7 +67,7 @@ int debugfs_valid_mountpoint(const char *debugfs) | |||
67 | 67 | ||
68 | if (statfs(debugfs, &st_fs) < 0) | 68 | if (statfs(debugfs, &st_fs) < 0) |
69 | return -ENOENT; | 69 | return -ENOENT; |
70 | else if (st_fs.f_type != (long) DEBUGFS_MAGIC) | 70 | else if ((long)st_fs.f_type != (long)DEBUGFS_MAGIC) |
71 | return -ENOENT; | 71 | return -ENOENT; |
72 | 72 | ||
73 | return 0; | 73 | return 0; |
diff --git a/tools/lib/api/fs/fs.c b/tools/lib/api/fs/fs.c index 65d9be3f9887..128ef6332a6b 100644 --- a/tools/lib/api/fs/fs.c +++ b/tools/lib/api/fs/fs.c | |||
@@ -79,7 +79,7 @@ static int fs__valid_mount(const char *fs, long magic) | |||
79 | 79 | ||
80 | if (statfs(fs, &st_fs) < 0) | 80 | if (statfs(fs, &st_fs) < 0) |
81 | return -ENOENT; | 81 | return -ENOENT; |
82 | else if (st_fs.f_type != magic) | 82 | else if ((long)st_fs.f_type != magic) |
83 | return -ENOENT; | 83 | return -ENOENT; |
84 | 84 | ||
85 | return 0; | 85 | return 0; |
diff --git a/tools/perf/MANIFEST b/tools/perf/MANIFEST index 83e2887f91a3..fbbfdc39271d 100644 --- a/tools/perf/MANIFEST +++ b/tools/perf/MANIFEST | |||
@@ -6,12 +6,15 @@ tools/lib/symbol/kallsyms.c | |||
6 | tools/lib/symbol/kallsyms.h | 6 | tools/lib/symbol/kallsyms.h |
7 | tools/lib/util/find_next_bit.c | 7 | tools/lib/util/find_next_bit.c |
8 | tools/include/asm/bug.h | 8 | tools/include/asm/bug.h |
9 | tools/include/asm-generic/bitops/arch_hweight.h | ||
9 | tools/include/asm-generic/bitops/atomic.h | 10 | tools/include/asm-generic/bitops/atomic.h |
11 | tools/include/asm-generic/bitops/const_hweight.h | ||
10 | tools/include/asm-generic/bitops/__ffs.h | 12 | tools/include/asm-generic/bitops/__ffs.h |
11 | tools/include/asm-generic/bitops/__fls.h | 13 | tools/include/asm-generic/bitops/__fls.h |
12 | tools/include/asm-generic/bitops/find.h | 14 | tools/include/asm-generic/bitops/find.h |
13 | tools/include/asm-generic/bitops/fls64.h | 15 | tools/include/asm-generic/bitops/fls64.h |
14 | tools/include/asm-generic/bitops/fls.h | 16 | tools/include/asm-generic/bitops/fls.h |
17 | tools/include/asm-generic/bitops/hweight.h | ||
15 | tools/include/asm-generic/bitops.h | 18 | tools/include/asm-generic/bitops.h |
16 | tools/include/linux/bitops.h | 19 | tools/include/linux/bitops.h |
17 | tools/include/linux/compiler.h | 20 | tools/include/linux/compiler.h |
@@ -19,6 +22,8 @@ tools/include/linux/export.h | |||
19 | tools/include/linux/hash.h | 22 | tools/include/linux/hash.h |
20 | tools/include/linux/log2.h | 23 | tools/include/linux/log2.h |
21 | tools/include/linux/types.h | 24 | tools/include/linux/types.h |
25 | include/asm-generic/bitops/arch_hweight.h | ||
26 | include/asm-generic/bitops/const_hweight.h | ||
22 | include/asm-generic/bitops/fls64.h | 27 | include/asm-generic/bitops/fls64.h |
23 | include/asm-generic/bitops/__fls.h | 28 | include/asm-generic/bitops/__fls.h |
24 | include/asm-generic/bitops/fls.h | 29 | include/asm-generic/bitops/fls.h |
@@ -29,6 +34,7 @@ include/linux/list.h | |||
29 | include/linux/hash.h | 34 | include/linux/hash.h |
30 | include/linux/stringify.h | 35 | include/linux/stringify.h |
31 | lib/find_next_bit.c | 36 | lib/find_next_bit.c |
37 | lib/hweight.c | ||
32 | lib/rbtree.c | 38 | lib/rbtree.c |
33 | include/linux/swab.h | 39 | include/linux/swab.h |
34 | arch/*/include/asm/unistd*.h | 40 | arch/*/include/asm/unistd*.h |
diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf index 67a03a825b3c..aa6a50447c32 100644 --- a/tools/perf/Makefile.perf +++ b/tools/perf/Makefile.perf | |||
@@ -232,12 +232,15 @@ LIB_H += ../include/linux/hash.h | |||
232 | LIB_H += ../../include/linux/stringify.h | 232 | LIB_H += ../../include/linux/stringify.h |
233 | LIB_H += util/include/linux/bitmap.h | 233 | LIB_H += util/include/linux/bitmap.h |
234 | LIB_H += ../include/linux/bitops.h | 234 | LIB_H += ../include/linux/bitops.h |
235 | LIB_H += ../include/asm-generic/bitops/arch_hweight.h | ||
235 | LIB_H += ../include/asm-generic/bitops/atomic.h | 236 | LIB_H += ../include/asm-generic/bitops/atomic.h |
237 | LIB_H += ../include/asm-generic/bitops/const_hweight.h | ||
236 | LIB_H += ../include/asm-generic/bitops/find.h | 238 | LIB_H += ../include/asm-generic/bitops/find.h |
237 | LIB_H += ../include/asm-generic/bitops/fls64.h | 239 | LIB_H += ../include/asm-generic/bitops/fls64.h |
238 | LIB_H += ../include/asm-generic/bitops/fls.h | 240 | LIB_H += ../include/asm-generic/bitops/fls.h |
239 | LIB_H += ../include/asm-generic/bitops/__ffs.h | 241 | LIB_H += ../include/asm-generic/bitops/__ffs.h |
240 | LIB_H += ../include/asm-generic/bitops/__fls.h | 242 | LIB_H += ../include/asm-generic/bitops/__fls.h |
243 | LIB_H += ../include/asm-generic/bitops/hweight.h | ||
241 | LIB_H += ../include/asm-generic/bitops.h | 244 | LIB_H += ../include/asm-generic/bitops.h |
242 | LIB_H += ../include/linux/compiler.h | 245 | LIB_H += ../include/linux/compiler.h |
243 | LIB_H += ../include/linux/log2.h | 246 | LIB_H += ../include/linux/log2.h |
@@ -255,7 +258,6 @@ LIB_H += util/include/linux/linkage.h | |||
255 | LIB_H += util/include/asm/asm-offsets.h | 258 | LIB_H += util/include/asm/asm-offsets.h |
256 | LIB_H += ../include/asm/bug.h | 259 | LIB_H += ../include/asm/bug.h |
257 | LIB_H += util/include/asm/byteorder.h | 260 | LIB_H += util/include/asm/byteorder.h |
258 | LIB_H += util/include/asm/hweight.h | ||
259 | LIB_H += util/include/asm/swab.h | 261 | LIB_H += util/include/asm/swab.h |
260 | LIB_H += util/include/asm/system.h | 262 | LIB_H += util/include/asm/system.h |
261 | LIB_H += util/include/asm/uaccess.h | 263 | LIB_H += util/include/asm/uaccess.h |
@@ -462,10 +464,12 @@ BUILTIN_OBJS += $(OUTPUT)builtin-bench.o | |||
462 | # Benchmark modules | 464 | # Benchmark modules |
463 | BUILTIN_OBJS += $(OUTPUT)bench/sched-messaging.o | 465 | BUILTIN_OBJS += $(OUTPUT)bench/sched-messaging.o |
464 | BUILTIN_OBJS += $(OUTPUT)bench/sched-pipe.o | 466 | BUILTIN_OBJS += $(OUTPUT)bench/sched-pipe.o |
465 | ifeq ($(RAW_ARCH),x86_64) | 467 | ifeq ($(ARCH), x86) |
468 | ifeq ($(IS_64_BIT), 1) | ||
466 | BUILTIN_OBJS += $(OUTPUT)bench/mem-memcpy-x86-64-asm.o | 469 | BUILTIN_OBJS += $(OUTPUT)bench/mem-memcpy-x86-64-asm.o |
467 | BUILTIN_OBJS += $(OUTPUT)bench/mem-memset-x86-64-asm.o | 470 | BUILTIN_OBJS += $(OUTPUT)bench/mem-memset-x86-64-asm.o |
468 | endif | 471 | endif |
472 | endif | ||
469 | BUILTIN_OBJS += $(OUTPUT)bench/mem-memcpy.o | 473 | BUILTIN_OBJS += $(OUTPUT)bench/mem-memcpy.o |
470 | BUILTIN_OBJS += $(OUTPUT)bench/futex-hash.o | 474 | BUILTIN_OBJS += $(OUTPUT)bench/futex-hash.o |
471 | BUILTIN_OBJS += $(OUTPUT)bench/futex-wake.o | 475 | BUILTIN_OBJS += $(OUTPUT)bench/futex-wake.o |
@@ -743,6 +747,9 @@ $(OUTPUT)util/kallsyms.o: ../lib/symbol/kallsyms.c $(OUTPUT)PERF-CFLAGS | |||
743 | $(OUTPUT)util/rbtree.o: ../../lib/rbtree.c $(OUTPUT)PERF-CFLAGS | 747 | $(OUTPUT)util/rbtree.o: ../../lib/rbtree.c $(OUTPUT)PERF-CFLAGS |
744 | $(QUIET_CC)$(CC) -o $@ -c $(CFLAGS) -Wno-unused-parameter -DETC_PERFCONFIG='"$(ETC_PERFCONFIG_SQ)"' $< | 748 | $(QUIET_CC)$(CC) -o $@ -c $(CFLAGS) -Wno-unused-parameter -DETC_PERFCONFIG='"$(ETC_PERFCONFIG_SQ)"' $< |
745 | 749 | ||
750 | $(OUTPUT)util/hweight.o: ../../lib/hweight.c $(OUTPUT)PERF-CFLAGS | ||
751 | $(QUIET_CC)$(CC) -o $@ -c $(CFLAGS) -Wno-unused-parameter -DETC_PERFCONFIG='"$(ETC_PERFCONFIG_SQ)"' $< | ||
752 | |||
746 | $(OUTPUT)util/find_next_bit.o: ../lib/util/find_next_bit.c $(OUTPUT)PERF-CFLAGS | 753 | $(OUTPUT)util/find_next_bit.o: ../lib/util/find_next_bit.c $(OUTPUT)PERF-CFLAGS |
747 | $(QUIET_CC)$(CC) -o $@ -c $(CFLAGS) -Wno-unused-parameter -DETC_PERFCONFIG='"$(ETC_PERFCONFIG_SQ)"' $< | 754 | $(QUIET_CC)$(CC) -o $@ -c $(CFLAGS) -Wno-unused-parameter -DETC_PERFCONFIG='"$(ETC_PERFCONFIG_SQ)"' $< |
748 | 755 | ||
diff --git a/tools/perf/arch/powerpc/util/skip-callchain-idx.c b/tools/perf/arch/powerpc/util/skip-callchain-idx.c index 3bb50eac5542..0c370f81e002 100644 --- a/tools/perf/arch/powerpc/util/skip-callchain-idx.c +++ b/tools/perf/arch/powerpc/util/skip-callchain-idx.c | |||
@@ -103,7 +103,7 @@ static Dwarf_Frame *get_eh_frame(Dwfl_Module *mod, Dwarf_Addr pc) | |||
103 | return NULL; | 103 | return NULL; |
104 | } | 104 | } |
105 | 105 | ||
106 | result = dwarf_cfi_addrframe(cfi, pc, &frame); | 106 | result = dwarf_cfi_addrframe(cfi, pc-bias, &frame); |
107 | if (result) { | 107 | if (result) { |
108 | pr_debug("%s(): %s\n", __func__, dwfl_errmsg(-1)); | 108 | pr_debug("%s(): %s\n", __func__, dwfl_errmsg(-1)); |
109 | return NULL; | 109 | return NULL; |
@@ -128,7 +128,7 @@ static Dwarf_Frame *get_dwarf_frame(Dwfl_Module *mod, Dwarf_Addr pc) | |||
128 | return NULL; | 128 | return NULL; |
129 | } | 129 | } |
130 | 130 | ||
131 | result = dwarf_cfi_addrframe(cfi, pc, &frame); | 131 | result = dwarf_cfi_addrframe(cfi, pc-bias, &frame); |
132 | if (result) { | 132 | if (result) { |
133 | pr_debug("%s(): %s\n", __func__, dwfl_errmsg(-1)); | 133 | pr_debug("%s(): %s\n", __func__, dwfl_errmsg(-1)); |
134 | return NULL; | 134 | return NULL; |
@@ -145,7 +145,7 @@ static Dwarf_Frame *get_dwarf_frame(Dwfl_Module *mod, Dwarf_Addr pc) | |||
145 | * yet used) | 145 | * yet used) |
146 | * -1 in case of errors | 146 | * -1 in case of errors |
147 | */ | 147 | */ |
148 | static int check_return_addr(struct dso *dso, Dwarf_Addr pc) | 148 | static int check_return_addr(struct dso *dso, u64 map_start, Dwarf_Addr pc) |
149 | { | 149 | { |
150 | int rc = -1; | 150 | int rc = -1; |
151 | Dwfl *dwfl; | 151 | Dwfl *dwfl; |
@@ -155,6 +155,7 @@ static int check_return_addr(struct dso *dso, Dwarf_Addr pc) | |||
155 | Dwarf_Addr start = pc; | 155 | Dwarf_Addr start = pc; |
156 | Dwarf_Addr end = pc; | 156 | Dwarf_Addr end = pc; |
157 | bool signalp; | 157 | bool signalp; |
158 | const char *exec_file = dso->long_name; | ||
158 | 159 | ||
159 | dwfl = dso->dwfl; | 160 | dwfl = dso->dwfl; |
160 | 161 | ||
@@ -165,8 +166,10 @@ static int check_return_addr(struct dso *dso, Dwarf_Addr pc) | |||
165 | return -1; | 166 | return -1; |
166 | } | 167 | } |
167 | 168 | ||
168 | if (dwfl_report_offline(dwfl, "", dso->long_name, -1) == NULL) { | 169 | mod = dwfl_report_elf(dwfl, exec_file, exec_file, -1, |
169 | pr_debug("dwfl_report_offline() failed %s\n", | 170 | map_start, false); |
171 | if (!mod) { | ||
172 | pr_debug("dwfl_report_elf() failed %s\n", | ||
170 | dwarf_errmsg(-1)); | 173 | dwarf_errmsg(-1)); |
171 | /* | 174 | /* |
172 | * We normally cache the DWARF debug info and never | 175 | * We normally cache the DWARF debug info and never |
@@ -256,10 +259,10 @@ int arch_skip_callchain_idx(struct thread *thread, struct ip_callchain *chain) | |||
256 | return skip_slot; | 259 | return skip_slot; |
257 | } | 260 | } |
258 | 261 | ||
259 | rc = check_return_addr(dso, ip); | 262 | rc = check_return_addr(dso, al.map->start, ip); |
260 | 263 | ||
261 | pr_debug("DSO %s, nr %" PRIx64 ", ip 0x%" PRIx64 "rc %d\n", | 264 | pr_debug("[DSO %s, sym %s, ip 0x%" PRIx64 "] rc %d\n", |
262 | dso->long_name, chain->nr, ip, rc); | 265 | dso->long_name, al.sym->name, ip, rc); |
263 | 266 | ||
264 | if (rc == 0) { | 267 | if (rc == 0) { |
265 | /* | 268 | /* |
diff --git a/tools/perf/bench/sched-pipe.c b/tools/perf/bench/sched-pipe.c index 07a8d7646a15..005cc283790c 100644 --- a/tools/perf/bench/sched-pipe.c +++ b/tools/perf/bench/sched-pipe.c | |||
@@ -19,12 +19,12 @@ | |||
19 | #include <stdlib.h> | 19 | #include <stdlib.h> |
20 | #include <signal.h> | 20 | #include <signal.h> |
21 | #include <sys/wait.h> | 21 | #include <sys/wait.h> |
22 | #include <linux/unistd.h> | ||
23 | #include <string.h> | 22 | #include <string.h> |
24 | #include <errno.h> | 23 | #include <errno.h> |
25 | #include <assert.h> | 24 | #include <assert.h> |
26 | #include <sys/time.h> | 25 | #include <sys/time.h> |
27 | #include <sys/types.h> | 26 | #include <sys/types.h> |
27 | #include <sys/syscall.h> | ||
28 | 28 | ||
29 | #include <pthread.h> | 29 | #include <pthread.h> |
30 | 30 | ||
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c index 961cea183a83..616f0fcb4701 100644 --- a/tools/perf/builtin-top.c +++ b/tools/perf/builtin-top.c | |||
@@ -66,7 +66,6 @@ | |||
66 | #include <sys/utsname.h> | 66 | #include <sys/utsname.h> |
67 | #include <sys/mman.h> | 67 | #include <sys/mman.h> |
68 | 68 | ||
69 | #include <linux/unistd.h> | ||
70 | #include <linux/types.h> | 69 | #include <linux/types.h> |
71 | 70 | ||
72 | static volatile int done; | 71 | static volatile int done; |
diff --git a/tools/perf/config/Makefile b/tools/perf/config/Makefile index 5d4b039fe1ed..648e31ff4021 100644 --- a/tools/perf/config/Makefile +++ b/tools/perf/config/Makefile | |||
@@ -20,7 +20,7 @@ NO_PERF_REGS := 1 | |||
20 | 20 | ||
21 | # Additional ARCH settings for x86 | 21 | # Additional ARCH settings for x86 |
22 | ifeq ($(ARCH),x86) | 22 | ifeq ($(ARCH),x86) |
23 | ifeq (${IS_X86_64}, 1) | 23 | ifeq (${IS_64_BIT}, 1) |
24 | CFLAGS += -DHAVE_ARCH_X86_64_SUPPORT | 24 | CFLAGS += -DHAVE_ARCH_X86_64_SUPPORT |
25 | ARCH_INCLUDE = ../../arch/x86/lib/memcpy_64.S ../../arch/x86/lib/memset_64.S | 25 | ARCH_INCLUDE = ../../arch/x86/lib/memcpy_64.S ../../arch/x86/lib/memset_64.S |
26 | LIBUNWIND_LIBS = -lunwind -lunwind-x86_64 | 26 | LIBUNWIND_LIBS = -lunwind -lunwind-x86_64 |
diff --git a/tools/perf/config/Makefile.arch b/tools/perf/config/Makefile.arch index 851cd0172a76..ff95a68741d1 100644 --- a/tools/perf/config/Makefile.arch +++ b/tools/perf/config/Makefile.arch | |||
@@ -1,7 +1,7 @@ | |||
1 | 1 | ||
2 | uname_M := $(shell uname -m 2>/dev/null || echo not) | 2 | uname_M := $(shell uname -m 2>/dev/null || echo not) |
3 | 3 | ||
4 | ARCH ?= $(shell echo $(uname_M) | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \ | 4 | RAW_ARCH := $(shell echo $(uname_M) | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \ |
5 | -e s/arm.*/arm/ -e s/sa110/arm/ \ | 5 | -e s/arm.*/arm/ -e s/sa110/arm/ \ |
6 | -e s/s390x/s390/ -e s/parisc64/parisc/ \ | 6 | -e s/s390x/s390/ -e s/parisc64/parisc/ \ |
7 | -e s/ppc.*/powerpc/ -e s/mips.*/mips/ \ | 7 | -e s/ppc.*/powerpc/ -e s/mips.*/mips/ \ |
@@ -9,23 +9,23 @@ ARCH ?= $(shell echo $(uname_M) | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \ | |||
9 | -e s/tile.*/tile/ ) | 9 | -e s/tile.*/tile/ ) |
10 | 10 | ||
11 | # Additional ARCH settings for x86 | 11 | # Additional ARCH settings for x86 |
12 | ifeq ($(ARCH),i386) | 12 | ifeq ($(RAW_ARCH),i386) |
13 | override ARCH := x86 | 13 | ARCH ?= x86 |
14 | endif | 14 | endif |
15 | 15 | ||
16 | ifeq ($(ARCH),x86_64) | 16 | ifeq ($(RAW_ARCH),x86_64) |
17 | override ARCH := x86 | 17 | ARCH ?= x86 |
18 | IS_X86_64 := 0 | 18 | |
19 | ifeq (, $(findstring m32,$(CFLAGS))) | 19 | ifneq (, $(findstring m32,$(CFLAGS))) |
20 | IS_X86_64 := $(shell echo __x86_64__ | ${CC} -E -x c - | tail -n 1) | 20 | RAW_ARCH := x86_32 |
21 | RAW_ARCH := x86_64 | ||
22 | endif | 21 | endif |
23 | endif | 22 | endif |
24 | 23 | ||
25 | ifeq (${IS_X86_64}, 1) | 24 | ARCH ?= $(RAW_ARCH) |
25 | |||
26 | LP64 := $(shell echo __LP64__ | ${CC} ${CFLAGS} -E -x c - | tail -n 1) | ||
27 | ifeq ($(LP64), 1) | ||
26 | IS_64_BIT := 1 | 28 | IS_64_BIT := 1 |
27 | else ifeq ($(ARCH),x86) | ||
28 | IS_64_BIT := 0 | ||
29 | else | 29 | else |
30 | IS_64_BIT := $(shell echo __LP64__ | ${CC} ${CFLAGS} -E -x c - | tail -n 1) | 30 | IS_64_BIT := 0 |
31 | endif | 31 | endif |
diff --git a/tools/perf/perf-sys.h b/tools/perf/perf-sys.h index a3b13d7dc1d4..6ef68165c9db 100644 --- a/tools/perf/perf-sys.h +++ b/tools/perf/perf-sys.h | |||
@@ -6,7 +6,6 @@ | |||
6 | #include <sys/syscall.h> | 6 | #include <sys/syscall.h> |
7 | #include <linux/types.h> | 7 | #include <linux/types.h> |
8 | #include <linux/perf_event.h> | 8 | #include <linux/perf_event.h> |
9 | #include <asm/unistd.h> | ||
10 | 9 | ||
11 | #if defined(__i386__) | 10 | #if defined(__i386__) |
12 | #define mb() asm volatile("lock; addl $0,0(%%esp)" ::: "memory") | 11 | #define mb() asm volatile("lock; addl $0,0(%%esp)" ::: "memory") |
diff --git a/tools/perf/tests/dwarf-unwind.c b/tools/perf/tests/dwarf-unwind.c index ab28cca2cb97..0bf06bec68c7 100644 --- a/tools/perf/tests/dwarf-unwind.c +++ b/tools/perf/tests/dwarf-unwind.c | |||
@@ -11,6 +11,9 @@ | |||
11 | #include "thread.h" | 11 | #include "thread.h" |
12 | #include "callchain.h" | 12 | #include "callchain.h" |
13 | 13 | ||
14 | /* For bsearch. We try to unwind functions in shared object. */ | ||
15 | #include <stdlib.h> | ||
16 | |||
14 | static int mmap_handler(struct perf_tool *tool __maybe_unused, | 17 | static int mmap_handler(struct perf_tool *tool __maybe_unused, |
15 | union perf_event *event, | 18 | union perf_event *event, |
16 | struct perf_sample *sample __maybe_unused, | 19 | struct perf_sample *sample __maybe_unused, |
@@ -28,7 +31,7 @@ static int init_live_machine(struct machine *machine) | |||
28 | mmap_handler, machine, true); | 31 | mmap_handler, machine, true); |
29 | } | 32 | } |
30 | 33 | ||
31 | #define MAX_STACK 6 | 34 | #define MAX_STACK 8 |
32 | 35 | ||
33 | static int unwind_entry(struct unwind_entry *entry, void *arg) | 36 | static int unwind_entry(struct unwind_entry *entry, void *arg) |
34 | { | 37 | { |
@@ -37,6 +40,8 @@ static int unwind_entry(struct unwind_entry *entry, void *arg) | |||
37 | static const char *funcs[MAX_STACK] = { | 40 | static const char *funcs[MAX_STACK] = { |
38 | "test__arch_unwind_sample", | 41 | "test__arch_unwind_sample", |
39 | "unwind_thread", | 42 | "unwind_thread", |
43 | "compare", | ||
44 | "bsearch", | ||
40 | "krava_3", | 45 | "krava_3", |
41 | "krava_2", | 46 | "krava_2", |
42 | "krava_1", | 47 | "krava_1", |
@@ -88,10 +93,37 @@ static int unwind_thread(struct thread *thread) | |||
88 | return err; | 93 | return err; |
89 | } | 94 | } |
90 | 95 | ||
96 | static int global_unwind_retval = -INT_MAX; | ||
97 | |||
98 | __attribute__ ((noinline)) | ||
99 | static int compare(void *p1, void *p2) | ||
100 | { | ||
101 | /* Any possible value should be 'thread' */ | ||
102 | struct thread *thread = *(struct thread **)p1; | ||
103 | |||
104 | if (global_unwind_retval == -INT_MAX) | ||
105 | global_unwind_retval = unwind_thread(thread); | ||
106 | |||
107 | return p1 - p2; | ||
108 | } | ||
109 | |||
91 | __attribute__ ((noinline)) | 110 | __attribute__ ((noinline)) |
92 | static int krava_3(struct thread *thread) | 111 | static int krava_3(struct thread *thread) |
93 | { | 112 | { |
94 | return unwind_thread(thread); | 113 | struct thread *array[2] = {thread, thread}; |
114 | void *fp = &bsearch; | ||
115 | /* | ||
116 | * make _bsearch a volatile function pointer to | ||
117 | * prevent potential optimization, which may expand | ||
118 | * bsearch and call compare directly from this function, | ||
119 | * instead of libc shared object. | ||
120 | */ | ||
121 | void *(*volatile _bsearch)(void *, void *, size_t, | ||
122 | size_t, int (*)(void *, void *)); | ||
123 | |||
124 | _bsearch = fp; | ||
125 | _bsearch(array, &thread, 2, sizeof(struct thread **), compare); | ||
126 | return global_unwind_retval; | ||
95 | } | 127 | } |
96 | 128 | ||
97 | __attribute__ ((noinline)) | 129 | __attribute__ ((noinline)) |
diff --git a/tools/perf/util/annotate.h b/tools/perf/util/annotate.h index 0784a9420528..cadbdc90a5cb 100644 --- a/tools/perf/util/annotate.h +++ b/tools/perf/util/annotate.h | |||
@@ -116,11 +116,6 @@ struct annotation { | |||
116 | struct annotated_source *src; | 116 | struct annotated_source *src; |
117 | }; | 117 | }; |
118 | 118 | ||
119 | struct sannotation { | ||
120 | struct annotation annotation; | ||
121 | struct symbol symbol; | ||
122 | }; | ||
123 | |||
124 | static inline struct sym_hist *annotation__histogram(struct annotation *notes, int idx) | 119 | static inline struct sym_hist *annotation__histogram(struct annotation *notes, int idx) |
125 | { | 120 | { |
126 | return (((void *)¬es->src->histograms) + | 121 | return (((void *)¬es->src->histograms) + |
@@ -129,8 +124,7 @@ static inline struct sym_hist *annotation__histogram(struct annotation *notes, i | |||
129 | 124 | ||
130 | static inline struct annotation *symbol__annotation(struct symbol *sym) | 125 | static inline struct annotation *symbol__annotation(struct symbol *sym) |
131 | { | 126 | { |
132 | struct sannotation *a = container_of(sym, struct sannotation, symbol); | 127 | return (void *)sym - symbol_conf.priv_size; |
133 | return &a->annotation; | ||
134 | } | 128 | } |
135 | 129 | ||
136 | int addr_map_symbol__inc_samples(struct addr_map_symbol *ams, int evidx); | 130 | int addr_map_symbol__inc_samples(struct addr_map_symbol *ams, int evidx); |
diff --git a/tools/perf/util/cache.h b/tools/perf/util/cache.h index 5cf9e1b5989d..d04d770d90f6 100644 --- a/tools/perf/util/cache.h +++ b/tools/perf/util/cache.h | |||
@@ -71,7 +71,9 @@ extern char *perf_path(const char *fmt, ...) __attribute__((format (printf, 1, 2 | |||
71 | extern char *perf_pathdup(const char *fmt, ...) | 71 | extern char *perf_pathdup(const char *fmt, ...) |
72 | __attribute__((format (printf, 1, 2))); | 72 | __attribute__((format (printf, 1, 2))); |
73 | 73 | ||
74 | #ifndef __UCLIBC__ | ||
74 | /* Matches the libc/libbsd function attribute so we declare this unconditionally: */ | 75 | /* Matches the libc/libbsd function attribute so we declare this unconditionally: */ |
75 | extern size_t strlcpy(char *dest, const char *src, size_t size); | 76 | extern size_t strlcpy(char *dest, const char *src, size_t size); |
77 | #endif | ||
76 | 78 | ||
77 | #endif /* __PERF_CACHE_H */ | 79 | #endif /* __PERF_CACHE_H */ |
diff --git a/tools/perf/util/hweight.c b/tools/perf/util/hweight.c deleted file mode 100644 index 5c1d0d099f0d..000000000000 --- a/tools/perf/util/hweight.c +++ /dev/null | |||
@@ -1,31 +0,0 @@ | |||
1 | #include <linux/bitops.h> | ||
2 | |||
3 | /** | ||
4 | * hweightN - returns the hamming weight of a N-bit word | ||
5 | * @x: the word to weigh | ||
6 | * | ||
7 | * The Hamming Weight of a number is the total number of bits set in it. | ||
8 | */ | ||
9 | |||
10 | unsigned int hweight32(unsigned int w) | ||
11 | { | ||
12 | unsigned int res = w - ((w >> 1) & 0x55555555); | ||
13 | res = (res & 0x33333333) + ((res >> 2) & 0x33333333); | ||
14 | res = (res + (res >> 4)) & 0x0F0F0F0F; | ||
15 | res = res + (res >> 8); | ||
16 | return (res + (res >> 16)) & 0x000000FF; | ||
17 | } | ||
18 | |||
19 | unsigned long hweight64(__u64 w) | ||
20 | { | ||
21 | #if BITS_PER_LONG == 32 | ||
22 | return hweight32((unsigned int)(w >> 32)) + hweight32((unsigned int)w); | ||
23 | #elif BITS_PER_LONG == 64 | ||
24 | __u64 res = w - ((w >> 1) & 0x5555555555555555ul); | ||
25 | res = (res & 0x3333333333333333ul) + ((res >> 2) & 0x3333333333333333ul); | ||
26 | res = (res + (res >> 4)) & 0x0F0F0F0F0F0F0F0Ful; | ||
27 | res = res + (res >> 8); | ||
28 | res = res + (res >> 16); | ||
29 | return (res + (res >> 32)) & 0x00000000000000FFul; | ||
30 | #endif | ||
31 | } | ||
diff --git a/tools/perf/util/include/asm/hweight.h b/tools/perf/util/include/asm/hweight.h deleted file mode 100644 index 36cf26d434a5..000000000000 --- a/tools/perf/util/include/asm/hweight.h +++ /dev/null | |||
@@ -1,8 +0,0 @@ | |||
1 | #ifndef PERF_HWEIGHT_H | ||
2 | #define PERF_HWEIGHT_H | ||
3 | |||
4 | #include <linux/types.h> | ||
5 | unsigned int hweight32(unsigned int w); | ||
6 | unsigned long hweight64(__u64 w); | ||
7 | |||
8 | #endif /* PERF_HWEIGHT_H */ | ||
diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c index 94de3e48b490..1bca3a9f2b16 100644 --- a/tools/perf/util/machine.c +++ b/tools/perf/util/machine.c | |||
@@ -389,7 +389,6 @@ static struct thread *__machine__findnew_thread(struct machine *machine, | |||
389 | if (th != NULL) { | 389 | if (th != NULL) { |
390 | rb_link_node(&th->rb_node, parent, p); | 390 | rb_link_node(&th->rb_node, parent, p); |
391 | rb_insert_color(&th->rb_node, &machine->threads); | 391 | rb_insert_color(&th->rb_node, &machine->threads); |
392 | machine->last_match = th; | ||
393 | 392 | ||
394 | /* | 393 | /* |
395 | * We have to initialize map_groups separately | 394 | * We have to initialize map_groups separately |
@@ -400,9 +399,12 @@ static struct thread *__machine__findnew_thread(struct machine *machine, | |||
400 | * leader and that would screwed the rb tree. | 399 | * leader and that would screwed the rb tree. |
401 | */ | 400 | */ |
402 | if (thread__init_map_groups(th, machine)) { | 401 | if (thread__init_map_groups(th, machine)) { |
402 | rb_erase(&th->rb_node, &machine->threads); | ||
403 | thread__delete(th); | 403 | thread__delete(th); |
404 | return NULL; | 404 | return NULL; |
405 | } | 405 | } |
406 | |||
407 | machine->last_match = th; | ||
406 | } | 408 | } |
407 | 409 | ||
408 | return th; | 410 | return th; |
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c index 7f9b8632e433..94a717bf007d 100644 --- a/tools/perf/util/probe-event.c +++ b/tools/perf/util/probe-event.c | |||
@@ -2052,9 +2052,11 @@ static int write_probe_trace_event(int fd, struct probe_trace_event *tev) | |||
2052 | pr_debug("Writing event: %s\n", buf); | 2052 | pr_debug("Writing event: %s\n", buf); |
2053 | if (!probe_event_dry_run) { | 2053 | if (!probe_event_dry_run) { |
2054 | ret = write(fd, buf, strlen(buf)); | 2054 | ret = write(fd, buf, strlen(buf)); |
2055 | if (ret <= 0) | 2055 | if (ret <= 0) { |
2056 | ret = -errno; | ||
2056 | pr_warning("Failed to write event: %s\n", | 2057 | pr_warning("Failed to write event: %s\n", |
2057 | strerror_r(errno, sbuf, sizeof(sbuf))); | 2058 | strerror_r(errno, sbuf, sizeof(sbuf))); |
2059 | } | ||
2058 | } | 2060 | } |
2059 | free(buf); | 2061 | free(buf); |
2060 | return ret; | 2062 | return ret; |
diff --git a/tools/perf/util/python-ext-sources b/tools/perf/util/python-ext-sources index 16a475a7d492..6c6a6953fa93 100644 --- a/tools/perf/util/python-ext-sources +++ b/tools/perf/util/python-ext-sources | |||
@@ -10,7 +10,7 @@ util/ctype.c | |||
10 | util/evlist.c | 10 | util/evlist.c |
11 | util/evsel.c | 11 | util/evsel.c |
12 | util/cpumap.c | 12 | util/cpumap.c |
13 | util/hweight.c | 13 | ../../lib/hweight.c |
14 | util/thread_map.c | 14 | util/thread_map.c |
15 | util/util.c | 15 | util/util.c |
16 | util/xyarray.c | 16 | util/xyarray.c |
diff --git a/tools/perf/util/unwind-libunwind.c b/tools/perf/util/unwind-libunwind.c index 371219a6daf1..6edf535f65c2 100644 --- a/tools/perf/util/unwind-libunwind.c +++ b/tools/perf/util/unwind-libunwind.c | |||
@@ -185,6 +185,28 @@ static u64 elf_section_offset(int fd, const char *name) | |||
185 | return offset; | 185 | return offset; |
186 | } | 186 | } |
187 | 187 | ||
188 | #ifndef NO_LIBUNWIND_DEBUG_FRAME | ||
189 | static int elf_is_exec(int fd, const char *name) | ||
190 | { | ||
191 | Elf *elf; | ||
192 | GElf_Ehdr ehdr; | ||
193 | int retval = 0; | ||
194 | |||
195 | elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL); | ||
196 | if (elf == NULL) | ||
197 | return 0; | ||
198 | if (gelf_getehdr(elf, &ehdr) == NULL) | ||
199 | goto out; | ||
200 | |||
201 | retval = (ehdr.e_type == ET_EXEC); | ||
202 | |||
203 | out: | ||
204 | elf_end(elf); | ||
205 | pr_debug("unwind: elf_is_exec(%s): %d\n", name, retval); | ||
206 | return retval; | ||
207 | } | ||
208 | #endif | ||
209 | |||
188 | struct table_entry { | 210 | struct table_entry { |
189 | u32 start_ip_offset; | 211 | u32 start_ip_offset; |
190 | u32 fde_offset; | 212 | u32 fde_offset; |
@@ -322,8 +344,12 @@ find_proc_info(unw_addr_space_t as, unw_word_t ip, unw_proc_info_t *pi, | |||
322 | #ifndef NO_LIBUNWIND_DEBUG_FRAME | 344 | #ifndef NO_LIBUNWIND_DEBUG_FRAME |
323 | /* Check the .debug_frame section for unwinding info */ | 345 | /* Check the .debug_frame section for unwinding info */ |
324 | if (!read_unwind_spec_debug_frame(map->dso, ui->machine, &segbase)) { | 346 | if (!read_unwind_spec_debug_frame(map->dso, ui->machine, &segbase)) { |
347 | int fd = dso__data_fd(map->dso, ui->machine); | ||
348 | int is_exec = elf_is_exec(fd, map->dso->name); | ||
349 | unw_word_t base = is_exec ? 0 : map->start; | ||
350 | |||
325 | memset(&di, 0, sizeof(di)); | 351 | memset(&di, 0, sizeof(di)); |
326 | if (dwarf_find_debug_frame(0, &di, ip, 0, map->dso->name, | 352 | if (dwarf_find_debug_frame(0, &di, ip, base, map->dso->name, |
327 | map->start, map->end)) | 353 | map->start, map->end)) |
328 | return dwarf_search_unwind_table(as, ip, &di, pi, | 354 | return dwarf_search_unwind_table(as, ip, &di, pi, |
329 | need_unwind_info, arg); | 355 | need_unwind_info, arg); |