diff options
1024 files changed, 10391 insertions, 6795 deletions
| @@ -51,6 +51,7 @@ Greg Kroah-Hartman <gregkh@suse.de> | |||
| 51 | Greg Kroah-Hartman <greg@kroah.com> | 51 | Greg Kroah-Hartman <greg@kroah.com> |
| 52 | Henk Vergonet <Henk.Vergonet@gmail.com> | 52 | Henk Vergonet <Henk.Vergonet@gmail.com> |
| 53 | Henrik Kretzschmar <henne@nachtwindheim.de> | 53 | Henrik Kretzschmar <henne@nachtwindheim.de> |
| 54 | Henrik Rydberg <rydberg@bitmath.org> | ||
| 54 | Herbert Xu <herbert@gondor.apana.org.au> | 55 | Herbert Xu <herbert@gondor.apana.org.au> |
| 55 | Jacob Shin <Jacob.Shin@amd.com> | 56 | Jacob Shin <Jacob.Shin@amd.com> |
| 56 | James Bottomley <jejb@mulgrave.(none)> | 57 | James Bottomley <jejb@mulgrave.(none)> |
| @@ -72,6 +73,7 @@ Juha Yrjola <juha.yrjola@nokia.com> | |||
| 72 | Juha Yrjola <juha.yrjola@solidboot.com> | 73 | Juha Yrjola <juha.yrjola@solidboot.com> |
| 73 | Kay Sievers <kay.sievers@vrfy.org> | 74 | Kay Sievers <kay.sievers@vrfy.org> |
| 74 | Kenneth W Chen <kenneth.w.chen@intel.com> | 75 | Kenneth W Chen <kenneth.w.chen@intel.com> |
| 76 | Konstantin Khlebnikov <koct9i@gmail.com> <k.khlebnikov@samsung.com> | ||
| 75 | Koushik <raghavendra.koushik@neterion.com> | 77 | Koushik <raghavendra.koushik@neterion.com> |
| 76 | Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> | 78 | Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> |
| 77 | Leonid I Ananiev <leonid.i.ananiev@intel.com> | 79 | Leonid I Ananiev <leonid.i.ananiev@intel.com> |
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/i2c/i2c-st.txt b/Documentation/devicetree/bindings/i2c/i2c-st.txt index 437e0db3823c..4c26fda3844a 100644 --- a/Documentation/devicetree/bindings/i2c/i2c-st.txt +++ b/Documentation/devicetree/bindings/i2c/i2c-st.txt | |||
| @@ -31,7 +31,7 @@ i2c0: i2c@fed40000 { | |||
| 31 | compatible = "st,comms-ssc4-i2c"; | 31 | compatible = "st,comms-ssc4-i2c"; |
| 32 | reg = <0xfed40000 0x110>; | 32 | reg = <0xfed40000 0x110>; |
| 33 | interrupts = <GIC_SPI 187 IRQ_TYPE_LEVEL_HIGH>; | 33 | interrupts = <GIC_SPI 187 IRQ_TYPE_LEVEL_HIGH>; |
| 34 | clocks = <&CLK_S_ICN_REG_0>; | 34 | clocks = <&clk_s_a0_ls CLK_ICN_REG>; |
| 35 | clock-names = "ssc"; | 35 | clock-names = "ssc"; |
| 36 | clock-frequency = <400000>; | 36 | clock-frequency = <400000>; |
| 37 | pinctrl-names = "default"; | 37 | pinctrl-names = "default"; |
diff --git a/Documentation/devicetree/bindings/i2c/trivial-devices.txt b/Documentation/devicetree/bindings/i2c/trivial-devices.txt index 9f4e3824e71e..9f41d05be3be 100644 --- a/Documentation/devicetree/bindings/i2c/trivial-devices.txt +++ b/Documentation/devicetree/bindings/i2c/trivial-devices.txt | |||
| @@ -47,6 +47,7 @@ dallas,ds3232 Extremely Accurate I²C RTC with Integrated Crystal and SRAM | |||
| 47 | dallas,ds4510 CPU Supervisor with Nonvolatile Memory and Programmable I/O | 47 | dallas,ds4510 CPU Supervisor with Nonvolatile Memory and Programmable I/O |
| 48 | dallas,ds75 Digital Thermometer and Thermostat | 48 | dallas,ds75 Digital Thermometer and Thermostat |
| 49 | dlg,da9053 DA9053: flexible system level PMIC with multicore support | 49 | dlg,da9053 DA9053: flexible system level PMIC with multicore support |
| 50 | dlg,da9063 DA9063: system PMIC for quad-core application processors | ||
| 50 | epson,rx8025 High-Stability. I2C-Bus INTERFACE REAL TIME CLOCK MODULE | 51 | epson,rx8025 High-Stability. I2C-Bus INTERFACE REAL TIME CLOCK MODULE |
| 51 | epson,rx8581 I2C-BUS INTERFACE REAL TIME CLOCK MODULE | 52 | epson,rx8581 I2C-BUS INTERFACE REAL TIME CLOCK MODULE |
| 52 | fsl,mag3110 MAG3110: Xtrinsic High Accuracy, 3D Magnetometer | 53 | fsl,mag3110 MAG3110: Xtrinsic High Accuracy, 3D Magnetometer |
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 4df73da11adc..176d4fe4f076 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/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt index 9bffdfc648dc..85b022179104 100644 --- a/Documentation/networking/ip-sysctl.txt +++ b/Documentation/networking/ip-sysctl.txt | |||
| @@ -66,6 +66,8 @@ fwmark_reflect - BOOLEAN | |||
| 66 | route/max_size - INTEGER | 66 | route/max_size - INTEGER |
| 67 | Maximum number of routes allowed in the kernel. Increase | 67 | Maximum number of routes allowed in the kernel. Increase |
| 68 | this when using large numbers of interfaces and/or routes. | 68 | this when using large numbers of interfaces and/or routes. |
| 69 | From linux kernel 3.6 onwards, this is deprecated for ipv4 | ||
| 70 | as route cache is no longer used. | ||
| 69 | 71 | ||
| 70 | neigh/default/gc_thresh1 - INTEGER | 72 | neigh/default/gc_thresh1 - INTEGER |
| 71 | Minimum number of entries to keep. Garbage collector will not | 73 | Minimum number of entries to keep. Garbage collector will not |
diff --git a/Documentation/networking/netlink_mmap.txt b/Documentation/networking/netlink_mmap.txt index c6af4bac5aa8..54f10478e8e3 100644 --- a/Documentation/networking/netlink_mmap.txt +++ b/Documentation/networking/netlink_mmap.txt | |||
| @@ -199,16 +199,9 @@ frame header. | |||
| 199 | TX limitations | 199 | TX limitations |
| 200 | -------------- | 200 | -------------- |
| 201 | 201 | ||
| 202 | Kernel processing usually involves validation of the message received by | 202 | As of Jan 2015 the message is always copied from the ring frame to an |
| 203 | user-space, then processing its contents. The kernel must assure that | 203 | allocated buffer due to unresolved security concerns. |
| 204 | userspace is not able to modify the message contents after they have been | 204 | See commit 4682a0358639b29cf ("netlink: Always copy on mmap TX."). |
| 205 | validated. In order to do so, the message is copied from the ring frame | ||
| 206 | to an allocated buffer if either of these conditions is false: | ||
| 207 | |||
| 208 | - only a single mapping of the ring exists | ||
| 209 | - the file descriptor is not shared between processes | ||
| 210 | |||
| 211 | This means that for threaded programs, the kernel will fall back to copying. | ||
| 212 | 205 | ||
| 213 | Example | 206 | Example |
| 214 | ------- | 207 | ------- |
diff --git a/Documentation/target/tcm_mod_builder.py b/Documentation/target/tcm_mod_builder.py index 230ce71f4d75..2b47704f75cb 100755 --- a/Documentation/target/tcm_mod_builder.py +++ b/Documentation/target/tcm_mod_builder.py | |||
| @@ -389,9 +389,6 @@ def tcm_mod_build_configfs(proto_ident, fabric_mod_dir_var, fabric_mod_name): | |||
| 389 | buf += " .release_cmd = " + fabric_mod_name + "_release_cmd,\n" | 389 | buf += " .release_cmd = " + fabric_mod_name + "_release_cmd,\n" |
| 390 | buf += " .shutdown_session = " + fabric_mod_name + "_shutdown_session,\n" | 390 | buf += " .shutdown_session = " + fabric_mod_name + "_shutdown_session,\n" |
| 391 | buf += " .close_session = " + fabric_mod_name + "_close_session,\n" | 391 | buf += " .close_session = " + fabric_mod_name + "_close_session,\n" |
| 392 | buf += " .stop_session = " + fabric_mod_name + "_stop_session,\n" | ||
| 393 | buf += " .fall_back_to_erl0 = " + fabric_mod_name + "_reset_nexus,\n" | ||
| 394 | buf += " .sess_logged_in = " + fabric_mod_name + "_sess_logged_in,\n" | ||
| 395 | buf += " .sess_get_index = " + fabric_mod_name + "_sess_get_index,\n" | 392 | buf += " .sess_get_index = " + fabric_mod_name + "_sess_get_index,\n" |
| 396 | buf += " .sess_get_initiator_sid = NULL,\n" | 393 | buf += " .sess_get_initiator_sid = NULL,\n" |
| 397 | buf += " .write_pending = " + fabric_mod_name + "_write_pending,\n" | 394 | buf += " .write_pending = " + fabric_mod_name + "_write_pending,\n" |
| @@ -402,7 +399,7 @@ def tcm_mod_build_configfs(proto_ident, fabric_mod_dir_var, fabric_mod_name): | |||
| 402 | buf += " .queue_data_in = " + fabric_mod_name + "_queue_data_in,\n" | 399 | buf += " .queue_data_in = " + fabric_mod_name + "_queue_data_in,\n" |
| 403 | buf += " .queue_status = " + fabric_mod_name + "_queue_status,\n" | 400 | buf += " .queue_status = " + fabric_mod_name + "_queue_status,\n" |
| 404 | buf += " .queue_tm_rsp = " + fabric_mod_name + "_queue_tm_rsp,\n" | 401 | buf += " .queue_tm_rsp = " + fabric_mod_name + "_queue_tm_rsp,\n" |
| 405 | buf += " .is_state_remove = " + fabric_mod_name + "_is_state_remove,\n" | 402 | buf += " .aborted_task = " + fabric_mod_name + "_aborted_task,\n" |
| 406 | buf += " /*\n" | 403 | buf += " /*\n" |
| 407 | buf += " * Setup function pointers for generic logic in target_core_fabric_configfs.c\n" | 404 | buf += " * Setup function pointers for generic logic in target_core_fabric_configfs.c\n" |
| 408 | buf += " */\n" | 405 | buf += " */\n" |
| @@ -428,7 +425,7 @@ def tcm_mod_build_configfs(proto_ident, fabric_mod_dir_var, fabric_mod_name): | |||
| 428 | buf += " /*\n" | 425 | buf += " /*\n" |
| 429 | buf += " * Register the top level struct config_item_type with TCM core\n" | 426 | buf += " * Register the top level struct config_item_type with TCM core\n" |
| 430 | buf += " */\n" | 427 | buf += " */\n" |
| 431 | buf += " fabric = target_fabric_configfs_init(THIS_MODULE, \"" + fabric_mod_name[4:] + "\");\n" | 428 | buf += " fabric = target_fabric_configfs_init(THIS_MODULE, \"" + fabric_mod_name + "\");\n" |
| 432 | buf += " if (IS_ERR(fabric)) {\n" | 429 | buf += " if (IS_ERR(fabric)) {\n" |
| 433 | buf += " printk(KERN_ERR \"target_fabric_configfs_init() failed\\n\");\n" | 430 | buf += " printk(KERN_ERR \"target_fabric_configfs_init() failed\\n\");\n" |
| 434 | buf += " return PTR_ERR(fabric);\n" | 431 | buf += " return PTR_ERR(fabric);\n" |
| @@ -595,7 +592,7 @@ def tcm_mod_dump_fabric_ops(proto_ident, fabric_mod_dir_var, fabric_mod_name): | |||
| 595 | if re.search('get_fabric_name', fo): | 592 | if re.search('get_fabric_name', fo): |
| 596 | buf += "char *" + fabric_mod_name + "_get_fabric_name(void)\n" | 593 | buf += "char *" + fabric_mod_name + "_get_fabric_name(void)\n" |
| 597 | buf += "{\n" | 594 | buf += "{\n" |
| 598 | buf += " return \"" + fabric_mod_name[4:] + "\";\n" | 595 | buf += " return \"" + fabric_mod_name + "\";\n" |
| 599 | buf += "}\n\n" | 596 | buf += "}\n\n" |
| 600 | bufi += "char *" + fabric_mod_name + "_get_fabric_name(void);\n" | 597 | bufi += "char *" + fabric_mod_name + "_get_fabric_name(void);\n" |
| 601 | continue | 598 | continue |
| @@ -820,27 +817,6 @@ def tcm_mod_dump_fabric_ops(proto_ident, fabric_mod_dir_var, fabric_mod_name): | |||
| 820 | buf += "}\n\n" | 817 | buf += "}\n\n" |
| 821 | bufi += "void " + fabric_mod_name + "_close_session(struct se_session *);\n" | 818 | bufi += "void " + fabric_mod_name + "_close_session(struct se_session *);\n" |
| 822 | 819 | ||
| 823 | if re.search('stop_session\)\(', fo): | ||
| 824 | buf += "void " + fabric_mod_name + "_stop_session(struct se_session *se_sess, int sess_sleep , int conn_sleep)\n" | ||
| 825 | buf += "{\n" | ||
| 826 | buf += " return;\n" | ||
| 827 | buf += "}\n\n" | ||
| 828 | bufi += "void " + fabric_mod_name + "_stop_session(struct se_session *, int, int);\n" | ||
| 829 | |||
| 830 | if re.search('fall_back_to_erl0\)\(', fo): | ||
| 831 | buf += "void " + fabric_mod_name + "_reset_nexus(struct se_session *se_sess)\n" | ||
| 832 | buf += "{\n" | ||
| 833 | buf += " return;\n" | ||
| 834 | buf += "}\n\n" | ||
| 835 | bufi += "void " + fabric_mod_name + "_reset_nexus(struct se_session *);\n" | ||
| 836 | |||
| 837 | if re.search('sess_logged_in\)\(', fo): | ||
| 838 | buf += "int " + fabric_mod_name + "_sess_logged_in(struct se_session *se_sess)\n" | ||
| 839 | buf += "{\n" | ||
| 840 | buf += " return 0;\n" | ||
| 841 | buf += "}\n\n" | ||
| 842 | bufi += "int " + fabric_mod_name + "_sess_logged_in(struct se_session *);\n" | ||
| 843 | |||
| 844 | if re.search('sess_get_index\)\(', fo): | 820 | if re.search('sess_get_index\)\(', fo): |
| 845 | buf += "u32 " + fabric_mod_name + "_sess_get_index(struct se_session *se_sess)\n" | 821 | buf += "u32 " + fabric_mod_name + "_sess_get_index(struct se_session *se_sess)\n" |
| 846 | buf += "{\n" | 822 | buf += "{\n" |
| @@ -898,19 +874,18 @@ def tcm_mod_dump_fabric_ops(proto_ident, fabric_mod_dir_var, fabric_mod_name): | |||
| 898 | bufi += "int " + fabric_mod_name + "_queue_status(struct se_cmd *);\n" | 874 | bufi += "int " + fabric_mod_name + "_queue_status(struct se_cmd *);\n" |
| 899 | 875 | ||
| 900 | if re.search('queue_tm_rsp\)\(', fo): | 876 | if re.search('queue_tm_rsp\)\(', fo): |
| 901 | buf += "int " + fabric_mod_name + "_queue_tm_rsp(struct se_cmd *se_cmd)\n" | 877 | buf += "void " + fabric_mod_name + "_queue_tm_rsp(struct se_cmd *se_cmd)\n" |
| 902 | buf += "{\n" | 878 | buf += "{\n" |
| 903 | buf += " return 0;\n" | 879 | buf += " return;\n" |
| 904 | buf += "}\n\n" | 880 | buf += "}\n\n" |
| 905 | bufi += "int " + fabric_mod_name + "_queue_tm_rsp(struct se_cmd *);\n" | 881 | bufi += "void " + fabric_mod_name + "_queue_tm_rsp(struct se_cmd *);\n" |
| 906 | 882 | ||
| 907 | if re.search('is_state_remove\)\(', fo): | 883 | if re.search('aborted_task\)\(', fo): |
| 908 | buf += "int " + fabric_mod_name + "_is_state_remove(struct se_cmd *se_cmd)\n" | 884 | buf += "void " + fabric_mod_name + "_aborted_task(struct se_cmd *se_cmd)\n" |
| 909 | buf += "{\n" | 885 | buf += "{\n" |
| 910 | buf += " return 0;\n" | 886 | buf += " return;\n" |
| 911 | buf += "}\n\n" | 887 | buf += "}\n\n" |
| 912 | bufi += "int " + fabric_mod_name + "_is_state_remove(struct se_cmd *);\n" | 888 | bufi += "void " + fabric_mod_name + "_aborted_task(struct se_cmd *);\n" |
| 913 | |||
| 914 | 889 | ||
| 915 | ret = p.write(buf) | 890 | ret = p.write(buf) |
| 916 | if ret: | 891 | if ret: |
| @@ -1018,11 +993,11 @@ def main(modname, proto_ident): | |||
| 1018 | tcm_mod_build_kbuild(fabric_mod_dir, fabric_mod_name) | 993 | tcm_mod_build_kbuild(fabric_mod_dir, fabric_mod_name) |
| 1019 | tcm_mod_build_kconfig(fabric_mod_dir, fabric_mod_name) | 994 | tcm_mod_build_kconfig(fabric_mod_dir, fabric_mod_name) |
| 1020 | 995 | ||
| 1021 | input = raw_input("Would you like to add " + fabric_mod_name + "to drivers/target/Makefile..? [yes,no]: ") | 996 | input = raw_input("Would you like to add " + fabric_mod_name + " to drivers/target/Makefile..? [yes,no]: ") |
| 1022 | if input == "yes" or input == "y": | 997 | if input == "yes" or input == "y": |
| 1023 | tcm_mod_add_kbuild(tcm_dir, fabric_mod_name) | 998 | tcm_mod_add_kbuild(tcm_dir, fabric_mod_name) |
| 1024 | 999 | ||
| 1025 | input = raw_input("Would you like to add " + fabric_mod_name + "to drivers/target/Kconfig..? [yes,no]: ") | 1000 | input = raw_input("Would you like to add " + fabric_mod_name + " to drivers/target/Kconfig..? [yes,no]: ") |
| 1026 | if input == "yes" or input == "y": | 1001 | if input == "yes" or input == "y": |
| 1027 | tcm_mod_add_kconfig(tcm_dir, fabric_mod_name) | 1002 | tcm_mod_add_kconfig(tcm_dir, fabric_mod_name) |
| 1028 | 1003 | ||
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 ddb9ac8d32b3..d66a97dd3a12 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> |
| @@ -708,6 +708,16 @@ X: drivers/iio/*/adjd* | |||
| 708 | F: drivers/staging/iio/*/ad* | 708 | F: drivers/staging/iio/*/ad* |
| 709 | F: staging/iio/trigger/iio-trig-bfin-timer.c | 709 | F: staging/iio/trigger/iio-trig-bfin-timer.c |
| 710 | 710 | ||
| 711 | ANDROID DRIVERS | ||
| 712 | M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
| 713 | M: Arve Hjønnevåg <arve@android.com> | ||
| 714 | M: Riley Andrews <riandrews@android.com> | ||
| 715 | T: git git://git.kernel.org/pub/scm/linux/kernel/gregkh/staging.git | ||
| 716 | L: devel@driverdev.osuosl.org | ||
| 717 | S: Supported | ||
| 718 | F: drivers/android/ | ||
| 719 | F: drivers/staging/android/ | ||
| 720 | |||
| 711 | AOA (Apple Onboard Audio) ALSA DRIVER | 721 | AOA (Apple Onboard Audio) ALSA DRIVER |
| 712 | M: Johannes Berg <johannes@sipsolutions.net> | 722 | M: Johannes Berg <johannes@sipsolutions.net> |
| 713 | L: linuxppc-dev@lists.ozlabs.org | 723 | L: linuxppc-dev@lists.ozlabs.org |
| @@ -724,15 +734,15 @@ F: include/uapi/linux/apm_bios.h | |||
| 724 | F: drivers/char/apm-emulation.c | 734 | F: drivers/char/apm-emulation.c |
| 725 | 735 | ||
| 726 | APPLE BCM5974 MULTITOUCH DRIVER | 736 | APPLE BCM5974 MULTITOUCH DRIVER |
| 727 | M: Henrik Rydberg <rydberg@euromail.se> | 737 | M: Henrik Rydberg <rydberg@bitmath.org> |
| 728 | L: linux-input@vger.kernel.org | 738 | L: linux-input@vger.kernel.org |
| 729 | S: Maintained | 739 | S: Odd fixes |
| 730 | F: drivers/input/mouse/bcm5974.c | 740 | F: drivers/input/mouse/bcm5974.c |
| 731 | 741 | ||
| 732 | APPLE SMC DRIVER | 742 | APPLE SMC DRIVER |
| 733 | M: Henrik Rydberg <rydberg@euromail.se> | 743 | M: Henrik Rydberg <rydberg@bitmath.org> |
| 734 | L: lm-sensors@lm-sensors.org | 744 | L: lm-sensors@lm-sensors.org |
| 735 | S: Maintained | 745 | S: Odd fixes |
| 736 | F: drivers/hwmon/applesmc.c | 746 | F: drivers/hwmon/applesmc.c |
| 737 | 747 | ||
| 738 | APPLETALK NETWORK LAYER | 748 | APPLETALK NETWORK LAYER |
| @@ -754,13 +764,6 @@ L: linux-media@vger.kernel.org | |||
| 754 | S: Maintained | 764 | S: Maintained |
| 755 | F: drivers/media/i2c/aptina-pll.* | 765 | F: drivers/media/i2c/aptina-pll.* |
| 756 | 766 | ||
| 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 | 767 | ARC FRAMEBUFFER DRIVER |
| 765 | M: Jaya Kumar <jayalk@intworks.biz> | 768 | M: Jaya Kumar <jayalk@intworks.biz> |
| 766 | S: Maintained | 769 | S: Maintained |
| @@ -2259,6 +2262,7 @@ F: drivers/gpio/gpio-bt8xx.c | |||
| 2259 | BTRFS FILE SYSTEM | 2262 | BTRFS FILE SYSTEM |
| 2260 | M: Chris Mason <clm@fb.com> | 2263 | M: Chris Mason <clm@fb.com> |
| 2261 | M: Josef Bacik <jbacik@fb.com> | 2264 | M: Josef Bacik <jbacik@fb.com> |
| 2265 | M: David Sterba <dsterba@suse.cz> | ||
| 2262 | L: linux-btrfs@vger.kernel.org | 2266 | L: linux-btrfs@vger.kernel.org |
| 2263 | W: http://btrfs.wiki.kernel.org/ | 2267 | W: http://btrfs.wiki.kernel.org/ |
| 2264 | Q: http://patchwork.kernel.org/project/linux-btrfs/list/ | 2268 | Q: http://patchwork.kernel.org/project/linux-btrfs/list/ |
| @@ -2345,7 +2349,8 @@ CAN NETWORK LAYER | |||
| 2345 | M: Oliver Hartkopp <socketcan@hartkopp.net> | 2349 | M: Oliver Hartkopp <socketcan@hartkopp.net> |
| 2346 | L: linux-can@vger.kernel.org | 2350 | L: linux-can@vger.kernel.org |
| 2347 | W: http://gitorious.org/linux-can | 2351 | W: http://gitorious.org/linux-can |
| 2348 | T: git git://gitorious.org/linux-can/linux-can-next.git | 2352 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can.git |
| 2353 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can-next.git | ||
| 2349 | S: Maintained | 2354 | S: Maintained |
| 2350 | F: Documentation/networking/can.txt | 2355 | F: Documentation/networking/can.txt |
| 2351 | F: net/can/ | 2356 | F: net/can/ |
| @@ -2360,7 +2365,8 @@ M: Wolfgang Grandegger <wg@grandegger.com> | |||
| 2360 | M: Marc Kleine-Budde <mkl@pengutronix.de> | 2365 | M: Marc Kleine-Budde <mkl@pengutronix.de> |
| 2361 | L: linux-can@vger.kernel.org | 2366 | L: linux-can@vger.kernel.org |
| 2362 | W: http://gitorious.org/linux-can | 2367 | W: http://gitorious.org/linux-can |
| 2363 | T: git git://gitorious.org/linux-can/linux-can-next.git | 2368 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can.git |
| 2369 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can-next.git | ||
| 2364 | S: Maintained | 2370 | S: Maintained |
| 2365 | F: drivers/net/can/ | 2371 | F: drivers/net/can/ |
| 2366 | F: include/linux/can/dev.h | 2372 | F: include/linux/can/dev.h |
| @@ -3182,7 +3188,7 @@ L: dmaengine@vger.kernel.org | |||
| 3182 | Q: https://patchwork.kernel.org/project/linux-dmaengine/list/ | 3188 | Q: https://patchwork.kernel.org/project/linux-dmaengine/list/ |
| 3183 | S: Maintained | 3189 | S: Maintained |
| 3184 | F: drivers/dma/ | 3190 | F: drivers/dma/ |
| 3185 | F: include/linux/dma* | 3191 | F: include/linux/dmaengine.h |
| 3186 | F: Documentation/dmaengine/ | 3192 | F: Documentation/dmaengine/ |
| 3187 | T: git git://git.infradead.org/users/vkoul/slave-dma.git | 3193 | T: git git://git.infradead.org/users/vkoul/slave-dma.git |
| 3188 | 3194 | ||
| @@ -4748,20 +4754,20 @@ S: Supported | |||
| 4748 | F: drivers/scsi/ipr.* | 4754 | F: drivers/scsi/ipr.* |
| 4749 | 4755 | ||
| 4750 | IBM Power Virtual Ethernet Device Driver | 4756 | IBM Power Virtual Ethernet Device Driver |
| 4751 | M: Santiago Leon <santil@linux.vnet.ibm.com> | 4757 | M: Thomas Falcon <tlfalcon@linux.vnet.ibm.com> |
| 4752 | L: netdev@vger.kernel.org | 4758 | L: netdev@vger.kernel.org |
| 4753 | S: Supported | 4759 | S: Supported |
| 4754 | F: drivers/net/ethernet/ibm/ibmveth.* | 4760 | F: drivers/net/ethernet/ibm/ibmveth.* |
| 4755 | 4761 | ||
| 4756 | IBM Power Virtual SCSI Device Drivers | 4762 | IBM Power Virtual SCSI Device Drivers |
| 4757 | M: Nathan Fontenot <nfont@linux.vnet.ibm.com> | 4763 | M: Tyrel Datwyler <tyreld@linux.vnet.ibm.com> |
| 4758 | L: linux-scsi@vger.kernel.org | 4764 | L: linux-scsi@vger.kernel.org |
| 4759 | S: Supported | 4765 | S: Supported |
| 4760 | F: drivers/scsi/ibmvscsi/ibmvscsi* | 4766 | F: drivers/scsi/ibmvscsi/ibmvscsi* |
| 4761 | F: drivers/scsi/ibmvscsi/viosrp.h | 4767 | F: drivers/scsi/ibmvscsi/viosrp.h |
| 4762 | 4768 | ||
| 4763 | IBM Power Virtual FC Device Drivers | 4769 | IBM Power Virtual FC Device Drivers |
| 4764 | M: Brian King <brking@linux.vnet.ibm.com> | 4770 | M: Tyrel Datwyler <tyreld@linux.vnet.ibm.com> |
| 4765 | L: linux-scsi@vger.kernel.org | 4771 | L: linux-scsi@vger.kernel.org |
| 4766 | S: Supported | 4772 | S: Supported |
| 4767 | F: drivers/scsi/ibmvscsi/ibmvfc* | 4773 | F: drivers/scsi/ibmvscsi/ibmvfc* |
| @@ -4929,7 +4935,6 @@ F: include/uapi/linux/inotify.h | |||
| 4929 | 4935 | ||
| 4930 | INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN) DRIVERS | 4936 | INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN) DRIVERS |
| 4931 | M: Dmitry Torokhov <dmitry.torokhov@gmail.com> | 4937 | M: Dmitry Torokhov <dmitry.torokhov@gmail.com> |
| 4932 | M: Dmitry Torokhov <dtor@mail.ru> | ||
| 4933 | L: linux-input@vger.kernel.org | 4938 | L: linux-input@vger.kernel.org |
| 4934 | Q: http://patchwork.kernel.org/project/linux-input/list/ | 4939 | Q: http://patchwork.kernel.org/project/linux-input/list/ |
| 4935 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git | 4940 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git |
| @@ -4940,18 +4945,27 @@ F: include/uapi/linux/input.h | |||
| 4940 | F: include/linux/input/ | 4945 | F: include/linux/input/ |
| 4941 | 4946 | ||
| 4942 | INPUT MULTITOUCH (MT) PROTOCOL | 4947 | INPUT MULTITOUCH (MT) PROTOCOL |
| 4943 | M: Henrik Rydberg <rydberg@euromail.se> | 4948 | M: Henrik Rydberg <rydberg@bitmath.org> |
| 4944 | L: linux-input@vger.kernel.org | 4949 | L: linux-input@vger.kernel.org |
| 4945 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/rydberg/input-mt.git | 4950 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/rydberg/input-mt.git |
| 4946 | S: Maintained | 4951 | S: Odd fixes |
| 4947 | F: Documentation/input/multi-touch-protocol.txt | 4952 | F: Documentation/input/multi-touch-protocol.txt |
| 4948 | F: drivers/input/input-mt.c | 4953 | F: drivers/input/input-mt.c |
| 4949 | K: \b(ABS|SYN)_MT_ | 4954 | K: \b(ABS|SYN)_MT_ |
| 4950 | 4955 | ||
| 4956 | INTEL ASoC BDW/HSW DRIVERS | ||
| 4957 | M: Jie Yang <yang.jie@linux.intel.com> | ||
| 4958 | L: alsa-devel@alsa-project.org | ||
| 4959 | S: Supported | ||
| 4960 | F: sound/soc/intel/sst-haswell* | ||
| 4961 | F: sound/soc/intel/sst-dsp* | ||
| 4962 | F: sound/soc/intel/sst-firmware.c | ||
| 4963 | F: sound/soc/intel/broadwell.c | ||
| 4964 | F: sound/soc/intel/haswell.c | ||
| 4965 | |||
| 4951 | INTEL C600 SERIES SAS CONTROLLER DRIVER | 4966 | INTEL C600 SERIES SAS CONTROLLER DRIVER |
| 4952 | M: Intel SCU Linux support <intel-linux-scu@intel.com> | 4967 | M: Intel SCU Linux support <intel-linux-scu@intel.com> |
| 4953 | M: Artur Paszkiewicz <artur.paszkiewicz@intel.com> | 4968 | M: Artur Paszkiewicz <artur.paszkiewicz@intel.com> |
| 4954 | M: Dave Jiang <dave.jiang@intel.com> | ||
| 4955 | L: linux-scsi@vger.kernel.org | 4969 | L: linux-scsi@vger.kernel.org |
| 4956 | T: git git://git.code.sf.net/p/intel-sas/isci | 4970 | T: git git://git.code.sf.net/p/intel-sas/isci |
| 4957 | S: Supported | 4971 | S: Supported |
| @@ -5279,6 +5293,15 @@ W: www.open-iscsi.org | |||
| 5279 | Q: http://patchwork.kernel.org/project/linux-rdma/list/ | 5293 | Q: http://patchwork.kernel.org/project/linux-rdma/list/ |
| 5280 | F: drivers/infiniband/ulp/iser/ | 5294 | F: drivers/infiniband/ulp/iser/ |
| 5281 | 5295 | ||
| 5296 | ISCSI EXTENSIONS FOR RDMA (ISER) TARGET | ||
| 5297 | M: Sagi Grimberg <sagig@mellanox.com> | ||
| 5298 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending.git master | ||
| 5299 | L: linux-rdma@vger.kernel.org | ||
| 5300 | L: target-devel@vger.kernel.org | ||
| 5301 | S: Supported | ||
| 5302 | W: http://www.linux-iscsi.org | ||
| 5303 | F: drivers/infiniband/ulp/isert | ||
| 5304 | |||
| 5282 | ISDN SUBSYSTEM | 5305 | ISDN SUBSYSTEM |
| 5283 | M: Karsten Keil <isdn@linux-pingi.de> | 5306 | M: Karsten Keil <isdn@linux-pingi.de> |
| 5284 | L: isdn4linux@listserv.isdn4linux.de (subscribers-only) | 5307 | L: isdn4linux@listserv.isdn4linux.de (subscribers-only) |
| @@ -5693,6 +5716,49 @@ F: drivers/lguest/ | |||
| 5693 | F: include/linux/lguest*.h | 5716 | F: include/linux/lguest*.h |
| 5694 | F: tools/lguest/ | 5717 | F: tools/lguest/ |
| 5695 | 5718 | ||
| 5719 | LIBATA SUBSYSTEM (Serial and Parallel ATA drivers) | ||
| 5720 | M: Tejun Heo <tj@kernel.org> | ||
| 5721 | L: linux-ide@vger.kernel.org | ||
| 5722 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git | ||
| 5723 | S: Maintained | ||
| 5724 | F: drivers/ata/ | ||
| 5725 | F: include/linux/ata.h | ||
| 5726 | F: include/linux/libata.h | ||
| 5727 | |||
| 5728 | LIBATA PATA ARASAN COMPACT FLASH CONTROLLER | ||
| 5729 | M: Viresh Kumar <viresh.linux@gmail.com> | ||
| 5730 | L: linux-ide@vger.kernel.org | ||
| 5731 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git | ||
| 5732 | S: Maintained | ||
| 5733 | F: include/linux/pata_arasan_cf_data.h | ||
| 5734 | F: drivers/ata/pata_arasan_cf.c | ||
| 5735 | |||
| 5736 | LIBATA PATA DRIVERS | ||
| 5737 | M: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com> | ||
| 5738 | M: Tejun Heo <tj@kernel.org> | ||
| 5739 | L: linux-ide@vger.kernel.org | ||
| 5740 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git | ||
| 5741 | S: Maintained | ||
| 5742 | F: drivers/ata/pata_*.c | ||
| 5743 | F: drivers/ata/ata_generic.c | ||
| 5744 | |||
| 5745 | LIBATA SATA AHCI PLATFORM devices support | ||
| 5746 | M: Hans de Goede <hdegoede@redhat.com> | ||
| 5747 | M: Tejun Heo <tj@kernel.org> | ||
| 5748 | L: linux-ide@vger.kernel.org | ||
| 5749 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git | ||
| 5750 | S: Maintained | ||
| 5751 | F: drivers/ata/ahci_platform.c | ||
| 5752 | F: drivers/ata/libahci_platform.c | ||
| 5753 | F: include/linux/ahci_platform.h | ||
| 5754 | |||
| 5755 | LIBATA SATA PROMISE TX2/TX4 CONTROLLER DRIVER | ||
| 5756 | M: Mikael Pettersson <mikpelinux@gmail.com> | ||
| 5757 | L: linux-ide@vger.kernel.org | ||
| 5758 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git | ||
| 5759 | S: Maintained | ||
| 5760 | F: drivers/ata/sata_promise.* | ||
| 5761 | |||
| 5696 | LIBLOCKDEP | 5762 | LIBLOCKDEP |
| 5697 | M: Sasha Levin <sasha.levin@oracle.com> | 5763 | M: Sasha Levin <sasha.levin@oracle.com> |
| 5698 | S: Maintained | 5764 | S: Maintained |
| @@ -6977,14 +7043,12 @@ OPEN FIRMWARE AND FLATTENED DEVICE TREE | |||
| 6977 | M: Grant Likely <grant.likely@linaro.org> | 7043 | M: Grant Likely <grant.likely@linaro.org> |
| 6978 | M: Rob Herring <robh+dt@kernel.org> | 7044 | M: Rob Herring <robh+dt@kernel.org> |
| 6979 | L: devicetree@vger.kernel.org | 7045 | L: devicetree@vger.kernel.org |
| 6980 | W: http://fdt.secretlab.ca | 7046 | W: http://www.devicetree.org/ |
| 6981 | T: git git://git.secretlab.ca/git/linux-2.6.git | 7047 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/glikely/linux.git |
| 6982 | S: Maintained | 7048 | S: Maintained |
| 6983 | F: drivers/of/ | 7049 | F: drivers/of/ |
| 6984 | F: include/linux/of*.h | 7050 | F: include/linux/of*.h |
| 6985 | F: scripts/dtc/ | 7051 | F: scripts/dtc/ |
| 6986 | K: of_get_property | ||
| 6987 | K: of_match_table | ||
| 6988 | 7052 | ||
| 6989 | OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS | 7053 | OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS |
| 6990 | M: Rob Herring <robh+dt@kernel.org> | 7054 | M: Rob Herring <robh+dt@kernel.org> |
| @@ -7229,7 +7293,7 @@ S: Maintained | |||
| 7229 | F: drivers/pci/host/*layerscape* | 7293 | F: drivers/pci/host/*layerscape* |
| 7230 | 7294 | ||
| 7231 | PCI DRIVER FOR IMX6 | 7295 | PCI DRIVER FOR IMX6 |
| 7232 | M: Richard Zhu <r65037@freescale.com> | 7296 | M: Richard Zhu <Richard.Zhu@freescale.com> |
| 7233 | M: Lucas Stach <l.stach@pengutronix.de> | 7297 | M: Lucas Stach <l.stach@pengutronix.de> |
| 7234 | L: linux-pci@vger.kernel.org | 7298 | L: linux-pci@vger.kernel.org |
| 7235 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 7299 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
| @@ -7399,6 +7463,7 @@ F: drivers/crypto/picoxcell* | |||
| 7399 | PIN CONTROL SUBSYSTEM | 7463 | PIN CONTROL SUBSYSTEM |
| 7400 | M: Linus Walleij <linus.walleij@linaro.org> | 7464 | M: Linus Walleij <linus.walleij@linaro.org> |
| 7401 | L: linux-gpio@vger.kernel.org | 7465 | L: linux-gpio@vger.kernel.org |
| 7466 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl.git | ||
| 7402 | S: Maintained | 7467 | S: Maintained |
| 7403 | F: drivers/pinctrl/ | 7468 | F: drivers/pinctrl/ |
| 7404 | F: include/linux/pinctrl/ | 7469 | F: include/linux/pinctrl/ |
| @@ -7566,12 +7631,6 @@ W: http://wireless.kernel.org/en/users/Drivers/p54 | |||
| 7566 | S: Obsolete | 7631 | S: Obsolete |
| 7567 | F: drivers/net/wireless/prism54/ | 7632 | F: drivers/net/wireless/prism54/ |
| 7568 | 7633 | ||
| 7569 | PROMISE SATA TX2/TX4 CONTROLLER LIBATA DRIVER | ||
| 7570 | M: Mikael Pettersson <mikpelinux@gmail.com> | ||
| 7571 | L: linux-ide@vger.kernel.org | ||
| 7572 | S: Maintained | ||
| 7573 | F: drivers/ata/sata_promise.* | ||
| 7574 | |||
| 7575 | PS3 NETWORK SUPPORT | 7634 | PS3 NETWORK SUPPORT |
| 7576 | M: Geoff Levand <geoff@infradead.org> | 7635 | M: Geoff Levand <geoff@infradead.org> |
| 7577 | L: netdev@vger.kernel.org | 7636 | L: netdev@vger.kernel.org |
| @@ -7737,8 +7796,7 @@ F: Documentation/scsi/LICENSE.qla2xxx | |||
| 7737 | F: drivers/scsi/qla2xxx/ | 7796 | F: drivers/scsi/qla2xxx/ |
| 7738 | 7797 | ||
| 7739 | QLOGIC QLA4XXX iSCSI DRIVER | 7798 | QLOGIC QLA4XXX iSCSI DRIVER |
| 7740 | M: Vikas Chaudhary <vikas.chaudhary@qlogic.com> | 7799 | M: QLogic-Storage-Upstream@qlogic.com |
| 7741 | M: iscsi-driver@qlogic.com | ||
| 7742 | L: linux-scsi@vger.kernel.org | 7800 | L: linux-scsi@vger.kernel.org |
| 7743 | S: Supported | 7801 | S: Supported |
| 7744 | F: Documentation/scsi/LICENSE.qla4xxx | 7802 | F: Documentation/scsi/LICENSE.qla4xxx |
| @@ -8546,25 +8604,6 @@ S: Maintained | |||
| 8546 | F: drivers/misc/phantom.c | 8604 | F: drivers/misc/phantom.c |
| 8547 | F: include/uapi/linux/phantom.h | 8605 | F: include/uapi/linux/phantom.h |
| 8548 | 8606 | ||
| 8549 | SERIAL ATA (SATA) SUBSYSTEM | ||
| 8550 | M: Tejun Heo <tj@kernel.org> | ||
| 8551 | L: linux-ide@vger.kernel.org | ||
| 8552 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git | ||
| 8553 | S: Supported | ||
| 8554 | F: drivers/ata/ | ||
| 8555 | F: include/linux/ata.h | ||
| 8556 | F: include/linux/libata.h | ||
| 8557 | |||
| 8558 | SERIAL ATA AHCI PLATFORM devices support | ||
| 8559 | M: Hans de Goede <hdegoede@redhat.com> | ||
| 8560 | M: Tejun Heo <tj@kernel.org> | ||
| 8561 | L: linux-ide@vger.kernel.org | ||
| 8562 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git | ||
| 8563 | S: Supported | ||
| 8564 | F: drivers/ata/ahci_platform.c | ||
| 8565 | F: drivers/ata/libahci_platform.c | ||
| 8566 | F: include/linux/ahci_platform.h | ||
| 8567 | |||
| 8568 | SERVER ENGINES 10Gbps iSCSI - BladeEngine 2 DRIVER | 8607 | SERVER ENGINES 10Gbps iSCSI - BladeEngine 2 DRIVER |
| 8569 | M: Jayamohan Kallickal <jayamohan.kallickal@emulex.com> | 8608 | M: Jayamohan Kallickal <jayamohan.kallickal@emulex.com> |
| 8570 | L: linux-scsi@vger.kernel.org | 8609 | L: linux-scsi@vger.kernel.org |
| @@ -9212,7 +9251,6 @@ F: drivers/net/ethernet/dlink/sundance.c | |||
| 9212 | 9251 | ||
| 9213 | SUPERH | 9252 | SUPERH |
| 9214 | L: linux-sh@vger.kernel.org | 9253 | L: linux-sh@vger.kernel.org |
| 9215 | W: http://www.linux-sh.org | ||
| 9216 | Q: http://patchwork.kernel.org/project/linux-sh/list/ | 9254 | Q: http://patchwork.kernel.org/project/linux-sh/list/ |
| 9217 | S: Orphan | 9255 | S: Orphan |
| 9218 | F: Documentation/sh/ | 9256 | F: Documentation/sh/ |
| @@ -9533,7 +9571,8 @@ F: drivers/platform/x86/thinkpad_acpi.c | |||
| 9533 | TI BANDGAP AND THERMAL DRIVER | 9571 | TI BANDGAP AND THERMAL DRIVER |
| 9534 | M: Eduardo Valentin <edubezval@gmail.com> | 9572 | M: Eduardo Valentin <edubezval@gmail.com> |
| 9535 | L: linux-pm@vger.kernel.org | 9573 | L: linux-pm@vger.kernel.org |
| 9536 | S: Supported | 9574 | L: linux-omap@vger.kernel.org |
| 9575 | S: Maintained | ||
| 9537 | F: drivers/thermal/ti-soc-thermal/ | 9576 | F: drivers/thermal/ti-soc-thermal/ |
| 9538 | 9577 | ||
| 9539 | TI CLOCK DRIVER | 9578 | TI CLOCK DRIVER |
| @@ -10146,6 +10185,7 @@ USERSPACE I/O (UIO) | |||
| 10146 | M: "Hans J. Koch" <hjk@hansjkoch.de> | 10185 | M: "Hans J. Koch" <hjk@hansjkoch.de> |
| 10147 | M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 10186 | M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| 10148 | S: Maintained | 10187 | S: Maintained |
| 10188 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git | ||
| 10149 | F: Documentation/DocBook/uio-howto.tmpl | 10189 | F: Documentation/DocBook/uio-howto.tmpl |
| 10150 | F: drivers/uio/ | 10190 | F: drivers/uio/ |
| 10151 | F: include/linux/uio*.h | 10191 | F: include/linux/uio*.h |
| @@ -1,7 +1,7 @@ | |||
| 1 | VERSION = 3 | 1 | VERSION = 3 |
| 2 | PATCHLEVEL = 19 | 2 | PATCHLEVEL = 19 |
| 3 | SUBLEVEL = 0 | 3 | SUBLEVEL = 0 |
| 4 | EXTRAVERSION = -rc3 | 4 | EXTRAVERSION = -rc7 |
| 5 | NAME = Diseased Newt | 5 | NAME = Diseased Newt |
| 6 | 6 | ||
| 7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
| @@ -391,6 +391,7 @@ USERINCLUDE := \ | |||
| 391 | # Needed to be compatible with the O= option | 391 | # Needed to be compatible with the O= option |
| 392 | LINUXINCLUDE := \ | 392 | LINUXINCLUDE := \ |
| 393 | -I$(srctree)/arch/$(hdr-arch)/include \ | 393 | -I$(srctree)/arch/$(hdr-arch)/include \ |
| 394 | -Iarch/$(hdr-arch)/include/generated/uapi \ | ||
| 394 | -Iarch/$(hdr-arch)/include/generated \ | 395 | -Iarch/$(hdr-arch)/include/generated \ |
| 395 | $(if $(KBUILD_SRC), -I$(srctree)/include) \ | 396 | $(if $(KBUILD_SRC), -I$(srctree)/include) \ |
| 396 | -Iinclude \ | 397 | -Iinclude \ |
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/alpha/mm/fault.c b/arch/alpha/mm/fault.c index 98838a05ba6d..9d0ac091a52a 100644 --- a/arch/alpha/mm/fault.c +++ b/arch/alpha/mm/fault.c | |||
| @@ -156,6 +156,8 @@ retry: | |||
| 156 | if (unlikely(fault & VM_FAULT_ERROR)) { | 156 | if (unlikely(fault & VM_FAULT_ERROR)) { |
| 157 | if (fault & VM_FAULT_OOM) | 157 | if (fault & VM_FAULT_OOM) |
| 158 | goto out_of_memory; | 158 | goto out_of_memory; |
| 159 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 160 | goto bad_area; | ||
| 159 | else if (fault & VM_FAULT_SIGBUS) | 161 | else if (fault & VM_FAULT_SIGBUS) |
| 160 | goto do_sigbus; | 162 | goto do_sigbus; |
| 161 | BUG(); | 163 | BUG(); |
diff --git a/arch/arc/mm/fault.c b/arch/arc/mm/fault.c index 6f7e3a68803a..563cb27e37f5 100644 --- a/arch/arc/mm/fault.c +++ b/arch/arc/mm/fault.c | |||
| @@ -161,6 +161,8 @@ good_area: | |||
| 161 | 161 | ||
| 162 | if (fault & VM_FAULT_OOM) | 162 | if (fault & VM_FAULT_OOM) |
| 163 | goto out_of_memory; | 163 | goto out_of_memory; |
| 164 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 165 | goto bad_area; | ||
| 164 | else if (fault & VM_FAULT_SIGBUS) | 166 | else if (fault & VM_FAULT_SIGBUS) |
| 165 | goto do_sigbus; | 167 | goto do_sigbus; |
| 166 | 168 | ||
diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S index 68be9017593d..132c70e2d2f1 100644 --- a/arch/arm/boot/compressed/head.S +++ b/arch/arm/boot/compressed/head.S | |||
| @@ -263,16 +263,37 @@ restart: adr r0, LC0 | |||
| 263 | * OK... Let's do some funky business here. | 263 | * OK... Let's do some funky business here. |
| 264 | * If we do have a DTB appended to zImage, and we do have | 264 | * If we do have a DTB appended to zImage, and we do have |
| 265 | * an ATAG list around, we want the later to be translated | 265 | * an ATAG list around, we want the later to be translated |
| 266 | * and folded into the former here. To be on the safe side, | 266 | * and folded into the former here. No GOT fixup has occurred |
| 267 | * let's temporarily move the stack away into the malloc | 267 | * yet, but none of the code we're about to call uses any |
| 268 | * area. No GOT fixup has occurred yet, but none of the | 268 | * global variable. |
| 269 | * code we're about to call uses any global variable. | ||
| 270 | */ | 269 | */ |
| 271 | add sp, sp, #0x10000 | 270 | |
| 271 | /* Get the initial DTB size */ | ||
| 272 | ldr r5, [r6, #4] | ||
| 273 | #ifndef __ARMEB__ | ||
| 274 | /* convert to little endian */ | ||
| 275 | eor r1, r5, r5, ror #16 | ||
| 276 | bic r1, r1, #0x00ff0000 | ||
| 277 | mov r5, r5, ror #8 | ||
| 278 | eor r5, r5, r1, lsr #8 | ||
| 279 | #endif | ||
| 280 | /* 50% DTB growth should be good enough */ | ||
| 281 | add r5, r5, r5, lsr #1 | ||
| 282 | /* preserve 64-bit alignment */ | ||
| 283 | add r5, r5, #7 | ||
| 284 | bic r5, r5, #7 | ||
| 285 | /* clamp to 32KB min and 1MB max */ | ||
| 286 | cmp r5, #(1 << 15) | ||
| 287 | movlo r5, #(1 << 15) | ||
| 288 | cmp r5, #(1 << 20) | ||
| 289 | movhi r5, #(1 << 20) | ||
| 290 | /* temporarily relocate the stack past the DTB work space */ | ||
| 291 | add sp, sp, r5 | ||
| 292 | |||
| 272 | stmfd sp!, {r0-r3, ip, lr} | 293 | stmfd sp!, {r0-r3, ip, lr} |
| 273 | mov r0, r8 | 294 | mov r0, r8 |
| 274 | mov r1, r6 | 295 | mov r1, r6 |
| 275 | sub r2, sp, r6 | 296 | mov r2, r5 |
| 276 | bl atags_to_fdt | 297 | bl atags_to_fdt |
| 277 | 298 | ||
| 278 | /* | 299 | /* |
| @@ -285,11 +306,11 @@ restart: adr r0, LC0 | |||
| 285 | bic r0, r0, #1 | 306 | bic r0, r0, #1 |
| 286 | add r0, r0, #0x100 | 307 | add r0, r0, #0x100 |
| 287 | mov r1, r6 | 308 | mov r1, r6 |
| 288 | sub r2, sp, r6 | 309 | mov r2, r5 |
| 289 | bleq atags_to_fdt | 310 | bleq atags_to_fdt |
| 290 | 311 | ||
| 291 | ldmfd sp!, {r0-r3, ip, lr} | 312 | ldmfd sp!, {r0-r3, ip, lr} |
| 292 | sub sp, sp, #0x10000 | 313 | sub sp, sp, r5 |
| 293 | #endif | 314 | #endif |
| 294 | 315 | ||
| 295 | mov r8, r6 @ use the appended device tree | 316 | mov r8, r6 @ use the appended device tree |
| @@ -306,7 +327,7 @@ restart: adr r0, LC0 | |||
| 306 | subs r1, r5, r1 | 327 | subs r1, r5, r1 |
| 307 | addhi r9, r9, r1 | 328 | addhi r9, r9, r1 |
| 308 | 329 | ||
| 309 | /* Get the dtb's size */ | 330 | /* Get the current DTB size */ |
| 310 | ldr r5, [r6, #4] | 331 | ldr r5, [r6, #4] |
| 311 | #ifndef __ARMEB__ | 332 | #ifndef __ARMEB__ |
| 312 | /* convert r5 (dtb size) to little endian */ | 333 | /* convert r5 (dtb size) to little endian */ |
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/exynos4.dtsi b/arch/arm/boot/dts/exynos4.dtsi index b8168f1f8139..24ff27049ce0 100644 --- a/arch/arm/boot/dts/exynos4.dtsi +++ b/arch/arm/boot/dts/exynos4.dtsi | |||
| @@ -368,7 +368,7 @@ | |||
| 368 | }; | 368 | }; |
| 369 | 369 | ||
| 370 | i2s1: i2s@13960000 { | 370 | i2s1: i2s@13960000 { |
| 371 | compatible = "samsung,s5pv210-i2s"; | 371 | compatible = "samsung,s3c6410-i2s"; |
| 372 | reg = <0x13960000 0x100>; | 372 | reg = <0x13960000 0x100>; |
| 373 | clocks = <&clock CLK_I2S1>; | 373 | clocks = <&clock CLK_I2S1>; |
| 374 | clock-names = "iis"; | 374 | clock-names = "iis"; |
| @@ -378,7 +378,7 @@ | |||
| 378 | }; | 378 | }; |
| 379 | 379 | ||
| 380 | i2s2: i2s@13970000 { | 380 | i2s2: i2s@13970000 { |
| 381 | compatible = "samsung,s5pv210-i2s"; | 381 | compatible = "samsung,s3c6410-i2s"; |
| 382 | reg = <0x13970000 0x100>; | 382 | reg = <0x13970000 0x100>; |
| 383 | clocks = <&clock CLK_I2S2>; | 383 | clocks = <&clock CLK_I2S2>; |
| 384 | clock-names = "iis"; | 384 | clock-names = "iis"; |
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 1e6e5cc1c14c..c108bb451337 100644 --- a/arch/arm/boot/dts/imx6sx-sdb.dts +++ b/arch/arm/boot/dts/imx6sx-sdb.dts | |||
| @@ -159,13 +159,28 @@ | |||
| 159 | pinctrl-0 = <&pinctrl_enet1>; | 159 | pinctrl-0 = <&pinctrl_enet1>; |
| 160 | phy-supply = <®_enet_3v3>; | 160 | phy-supply = <®_enet_3v3>; |
| 161 | phy-mode = "rgmii"; | 161 | phy-mode = "rgmii"; |
| 162 | phy-handle = <ðphy1>; | ||
| 162 | status = "okay"; | 163 | status = "okay"; |
| 164 | |||
| 165 | mdio { | ||
| 166 | #address-cells = <1>; | ||
| 167 | #size-cells = <0>; | ||
| 168 | |||
| 169 | ethphy1: ethernet-phy@1 { | ||
| 170 | reg = <1>; | ||
| 171 | }; | ||
| 172 | |||
| 173 | ethphy2: ethernet-phy@2 { | ||
| 174 | reg = <2>; | ||
| 175 | }; | ||
| 176 | }; | ||
| 163 | }; | 177 | }; |
| 164 | 178 | ||
| 165 | &fec2 { | 179 | &fec2 { |
| 166 | pinctrl-names = "default"; | 180 | pinctrl-names = "default"; |
| 167 | pinctrl-0 = <&pinctrl_enet2>; | 181 | pinctrl-0 = <&pinctrl_enet2>; |
| 168 | phy-mode = "rgmii"; | 182 | phy-mode = "rgmii"; |
| 183 | phy-handle = <ðphy2>; | ||
| 169 | status = "okay"; | 184 | status = "okay"; |
| 170 | }; | 185 | }; |
| 171 | 186 | ||
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 3e067dd65d0c..6194d673e80b 100644 --- a/arch/arm/boot/dts/rk3288-evb.dtsi +++ b/arch/arm/boot/dts/rk3288-evb.dtsi | |||
| @@ -155,6 +155,15 @@ | |||
| 155 | }; | 155 | }; |
| 156 | 156 | ||
| 157 | &pinctrl { | 157 | &pinctrl { |
| 158 | pcfg_pull_none_drv_8ma: pcfg-pull-none-drv-8ma { | ||
| 159 | drive-strength = <8>; | ||
| 160 | }; | ||
| 161 | |||
| 162 | pcfg_pull_up_drv_8ma: pcfg-pull-up-drv-8ma { | ||
| 163 | bias-pull-up; | ||
| 164 | drive-strength = <8>; | ||
| 165 | }; | ||
| 166 | |||
| 158 | backlight { | 167 | backlight { |
| 159 | bl_en: bl-en { | 168 | bl_en: bl-en { |
| 160 | rockchip,pins = <7 2 RK_FUNC_GPIO &pcfg_pull_none>; | 169 | rockchip,pins = <7 2 RK_FUNC_GPIO &pcfg_pull_none>; |
| @@ -173,6 +182,27 @@ | |||
| 173 | }; | 182 | }; |
| 174 | }; | 183 | }; |
| 175 | 184 | ||
| 185 | sdmmc { | ||
| 186 | /* | ||
| 187 | * Default drive strength isn't enough to achieve even | ||
| 188 | * high-speed mode on EVB board so bump up to 8ma. | ||
| 189 | */ | ||
| 190 | sdmmc_bus4: sdmmc-bus4 { | ||
| 191 | rockchip,pins = <6 16 RK_FUNC_1 &pcfg_pull_up_drv_8ma>, | ||
| 192 | <6 17 RK_FUNC_1 &pcfg_pull_up_drv_8ma>, | ||
| 193 | <6 18 RK_FUNC_1 &pcfg_pull_up_drv_8ma>, | ||
| 194 | <6 19 RK_FUNC_1 &pcfg_pull_up_drv_8ma>; | ||
| 195 | }; | ||
| 196 | |||
| 197 | sdmmc_clk: sdmmc-clk { | ||
| 198 | rockchip,pins = <6 20 RK_FUNC_1 &pcfg_pull_none_drv_8ma>; | ||
| 199 | }; | ||
| 200 | |||
| 201 | sdmmc_cmd: sdmmc-cmd { | ||
| 202 | rockchip,pins = <6 21 RK_FUNC_1 &pcfg_pull_up_drv_8ma>; | ||
| 203 | }; | ||
| 204 | }; | ||
| 205 | |||
| 176 | usb { | 206 | usb { |
| 177 | host_vbus_drv: host-vbus-drv { | 207 | host_vbus_drv: host-vbus-drv { |
| 178 | rockchip,pins = <0 14 RK_FUNC_GPIO &pcfg_pull_none>; | 208 | 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/sun4i-a10.dtsi b/arch/arm/boot/dts/sun4i-a10.dtsi index 7b4099fcf817..d5c4669224b1 100644 --- a/arch/arm/boot/dts/sun4i-a10.dtsi +++ b/arch/arm/boot/dts/sun4i-a10.dtsi | |||
| @@ -17,14 +17,6 @@ | |||
| 17 | 17 | ||
| 18 | aliases { | 18 | aliases { |
| 19 | ethernet0 = &emac; | 19 | ethernet0 = &emac; |
| 20 | serial0 = &uart0; | ||
| 21 | serial1 = &uart1; | ||
| 22 | serial2 = &uart2; | ||
| 23 | serial3 = &uart3; | ||
| 24 | serial4 = &uart4; | ||
| 25 | serial5 = &uart5; | ||
| 26 | serial6 = &uart6; | ||
| 27 | serial7 = &uart7; | ||
| 28 | }; | 20 | }; |
| 29 | 21 | ||
| 30 | chosen { | 22 | chosen { |
| @@ -39,6 +31,14 @@ | |||
| 39 | <&ahb_gates 44>; | 31 | <&ahb_gates 44>; |
| 40 | status = "disabled"; | 32 | status = "disabled"; |
| 41 | }; | 33 | }; |
| 34 | |||
| 35 | framebuffer@1 { | ||
| 36 | compatible = "allwinner,simple-framebuffer", "simple-framebuffer"; | ||
| 37 | allwinner,pipeline = "de_fe0-de_be0-lcd0-hdmi"; | ||
| 38 | clocks = <&pll5 1>, <&ahb_gates 36>, <&ahb_gates 43>, | ||
| 39 | <&ahb_gates 44>, <&ahb_gates 46>; | ||
| 40 | status = "disabled"; | ||
| 41 | }; | ||
| 42 | }; | 42 | }; |
| 43 | 43 | ||
| 44 | cpus { | 44 | cpus { |
| @@ -438,8 +438,8 @@ | |||
| 438 | reg-names = "phy_ctrl", "pmu1", "pmu2"; | 438 | reg-names = "phy_ctrl", "pmu1", "pmu2"; |
| 439 | clocks = <&usb_clk 8>; | 439 | clocks = <&usb_clk 8>; |
| 440 | clock-names = "usb_phy"; | 440 | clock-names = "usb_phy"; |
| 441 | resets = <&usb_clk 1>, <&usb_clk 2>; | 441 | resets = <&usb_clk 0>, <&usb_clk 1>, <&usb_clk 2>; |
| 442 | reset-names = "usb1_reset", "usb2_reset"; | 442 | reset-names = "usb0_reset", "usb1_reset", "usb2_reset"; |
| 443 | status = "disabled"; | 443 | status = "disabled"; |
| 444 | }; | 444 | }; |
| 445 | 445 | ||
diff --git a/arch/arm/boot/dts/sun5i-a10s-olinuxino-micro.dts b/arch/arm/boot/dts/sun5i-a10s-olinuxino-micro.dts index fe3c559ca6a8..bfa742817690 100644 --- a/arch/arm/boot/dts/sun5i-a10s-olinuxino-micro.dts +++ b/arch/arm/boot/dts/sun5i-a10s-olinuxino-micro.dts | |||
| @@ -55,6 +55,12 @@ | |||
| 55 | model = "Olimex A10s-Olinuxino Micro"; | 55 | model = "Olimex A10s-Olinuxino Micro"; |
| 56 | compatible = "olimex,a10s-olinuxino-micro", "allwinner,sun5i-a10s"; | 56 | compatible = "olimex,a10s-olinuxino-micro", "allwinner,sun5i-a10s"; |
| 57 | 57 | ||
| 58 | aliases { | ||
| 59 | serial0 = &uart0; | ||
| 60 | serial1 = &uart2; | ||
| 61 | serial2 = &uart3; | ||
| 62 | }; | ||
| 63 | |||
| 58 | soc@01c00000 { | 64 | soc@01c00000 { |
| 59 | emac: ethernet@01c0b000 { | 65 | emac: ethernet@01c0b000 { |
| 60 | pinctrl-names = "default"; | 66 | pinctrl-names = "default"; |
diff --git a/arch/arm/boot/dts/sun5i-a10s.dtsi b/arch/arm/boot/dts/sun5i-a10s.dtsi index 1b76667f3182..2e7d8263799d 100644 --- a/arch/arm/boot/dts/sun5i-a10s.dtsi +++ b/arch/arm/boot/dts/sun5i-a10s.dtsi | |||
| @@ -18,10 +18,6 @@ | |||
| 18 | 18 | ||
| 19 | aliases { | 19 | aliases { |
| 20 | ethernet0 = &emac; | 20 | ethernet0 = &emac; |
| 21 | serial0 = &uart0; | ||
| 22 | serial1 = &uart1; | ||
| 23 | serial2 = &uart2; | ||
| 24 | serial3 = &uart3; | ||
| 25 | }; | 21 | }; |
| 26 | 22 | ||
| 27 | chosen { | 23 | chosen { |
| @@ -390,8 +386,8 @@ | |||
| 390 | reg-names = "phy_ctrl", "pmu1"; | 386 | reg-names = "phy_ctrl", "pmu1"; |
| 391 | clocks = <&usb_clk 8>; | 387 | clocks = <&usb_clk 8>; |
| 392 | clock-names = "usb_phy"; | 388 | clock-names = "usb_phy"; |
| 393 | resets = <&usb_clk 1>; | 389 | resets = <&usb_clk 0>, <&usb_clk 1>; |
| 394 | reset-names = "usb1_reset"; | 390 | reset-names = "usb0_reset", "usb1_reset"; |
| 395 | status = "disabled"; | 391 | status = "disabled"; |
| 396 | }; | 392 | }; |
| 397 | 393 | ||
diff --git a/arch/arm/boot/dts/sun5i-a13-hsg-h702.dts b/arch/arm/boot/dts/sun5i-a13-hsg-h702.dts index eeed1f236ee8..c7be3abd9fcc 100644 --- a/arch/arm/boot/dts/sun5i-a13-hsg-h702.dts +++ b/arch/arm/boot/dts/sun5i-a13-hsg-h702.dts | |||
| @@ -53,6 +53,10 @@ | |||
| 53 | model = "HSG H702"; | 53 | model = "HSG H702"; |
| 54 | compatible = "hsg,h702", "allwinner,sun5i-a13"; | 54 | compatible = "hsg,h702", "allwinner,sun5i-a13"; |
| 55 | 55 | ||
| 56 | aliases { | ||
| 57 | serial0 = &uart1; | ||
| 58 | }; | ||
| 59 | |||
| 56 | soc@01c00000 { | 60 | soc@01c00000 { |
| 57 | mmc0: mmc@01c0f000 { | 61 | mmc0: mmc@01c0f000 { |
| 58 | pinctrl-names = "default"; | 62 | pinctrl-names = "default"; |
diff --git a/arch/arm/boot/dts/sun5i-a13-olinuxino-micro.dts b/arch/arm/boot/dts/sun5i-a13-olinuxino-micro.dts index 916ee8bb826f..3decefb3c37a 100644 --- a/arch/arm/boot/dts/sun5i-a13-olinuxino-micro.dts +++ b/arch/arm/boot/dts/sun5i-a13-olinuxino-micro.dts | |||
| @@ -54,6 +54,10 @@ | |||
| 54 | model = "Olimex A13-Olinuxino Micro"; | 54 | model = "Olimex A13-Olinuxino Micro"; |
| 55 | compatible = "olimex,a13-olinuxino-micro", "allwinner,sun5i-a13"; | 55 | compatible = "olimex,a13-olinuxino-micro", "allwinner,sun5i-a13"; |
| 56 | 56 | ||
| 57 | aliases { | ||
| 58 | serial0 = &uart1; | ||
| 59 | }; | ||
| 60 | |||
| 57 | soc@01c00000 { | 61 | soc@01c00000 { |
| 58 | mmc0: mmc@01c0f000 { | 62 | mmc0: mmc@01c0f000 { |
| 59 | pinctrl-names = "default"; | 63 | pinctrl-names = "default"; |
diff --git a/arch/arm/boot/dts/sun5i-a13-olinuxino.dts b/arch/arm/boot/dts/sun5i-a13-olinuxino.dts index e31d291d14cb..b421f7fa197b 100644 --- a/arch/arm/boot/dts/sun5i-a13-olinuxino.dts +++ b/arch/arm/boot/dts/sun5i-a13-olinuxino.dts | |||
| @@ -55,6 +55,10 @@ | |||
| 55 | model = "Olimex A13-Olinuxino"; | 55 | model = "Olimex A13-Olinuxino"; |
| 56 | compatible = "olimex,a13-olinuxino", "allwinner,sun5i-a13"; | 56 | compatible = "olimex,a13-olinuxino", "allwinner,sun5i-a13"; |
| 57 | 57 | ||
| 58 | aliases { | ||
| 59 | serial0 = &uart1; | ||
| 60 | }; | ||
| 61 | |||
| 58 | soc@01c00000 { | 62 | soc@01c00000 { |
| 59 | mmc0: mmc@01c0f000 { | 63 | mmc0: mmc@01c0f000 { |
| 60 | pinctrl-names = "default"; | 64 | pinctrl-names = "default"; |
diff --git a/arch/arm/boot/dts/sun5i-a13.dtsi b/arch/arm/boot/dts/sun5i-a13.dtsi index c35217ea1f64..c556688f8b8b 100644 --- a/arch/arm/boot/dts/sun5i-a13.dtsi +++ b/arch/arm/boot/dts/sun5i-a13.dtsi | |||
| @@ -16,11 +16,6 @@ | |||
| 16 | / { | 16 | / { |
| 17 | interrupt-parent = <&intc>; | 17 | interrupt-parent = <&intc>; |
| 18 | 18 | ||
| 19 | aliases { | ||
| 20 | serial0 = &uart1; | ||
| 21 | serial1 = &uart3; | ||
| 22 | }; | ||
| 23 | |||
| 24 | cpus { | 19 | cpus { |
| 25 | #address-cells = <1>; | 20 | #address-cells = <1>; |
| 26 | #size-cells = <0>; | 21 | #size-cells = <0>; |
| @@ -349,8 +344,8 @@ | |||
| 349 | reg-names = "phy_ctrl", "pmu1"; | 344 | reg-names = "phy_ctrl", "pmu1"; |
| 350 | clocks = <&usb_clk 8>; | 345 | clocks = <&usb_clk 8>; |
| 351 | clock-names = "usb_phy"; | 346 | clock-names = "usb_phy"; |
| 352 | resets = <&usb_clk 1>; | 347 | resets = <&usb_clk 0>, <&usb_clk 1>; |
| 353 | reset-names = "usb1_reset"; | 348 | reset-names = "usb0_reset", "usb1_reset"; |
| 354 | status = "disabled"; | 349 | status = "disabled"; |
| 355 | }; | 350 | }; |
| 356 | 351 | ||
diff --git a/arch/arm/boot/dts/sun6i-a31.dtsi b/arch/arm/boot/dts/sun6i-a31.dtsi index f47156b6572b..1e7e7bcf8307 100644 --- a/arch/arm/boot/dts/sun6i-a31.dtsi +++ b/arch/arm/boot/dts/sun6i-a31.dtsi | |||
| @@ -53,12 +53,6 @@ | |||
| 53 | interrupt-parent = <&gic>; | 53 | interrupt-parent = <&gic>; |
| 54 | 54 | ||
| 55 | aliases { | 55 | aliases { |
| 56 | serial0 = &uart0; | ||
| 57 | serial1 = &uart1; | ||
| 58 | serial2 = &uart2; | ||
| 59 | serial3 = &uart3; | ||
| 60 | serial4 = &uart4; | ||
| 61 | serial5 = &uart5; | ||
| 62 | ethernet0 = &gmac; | 56 | ethernet0 = &gmac; |
| 63 | }; | 57 | }; |
| 64 | 58 | ||
diff --git a/arch/arm/boot/dts/sun7i-a20-bananapi.dts b/arch/arm/boot/dts/sun7i-a20-bananapi.dts index 1cf1214cc068..bd7b15add697 100644 --- a/arch/arm/boot/dts/sun7i-a20-bananapi.dts +++ b/arch/arm/boot/dts/sun7i-a20-bananapi.dts | |||
| @@ -55,6 +55,12 @@ | |||
| 55 | model = "LeMaker Banana Pi"; | 55 | model = "LeMaker Banana Pi"; |
| 56 | compatible = "lemaker,bananapi", "allwinner,sun7i-a20"; | 56 | compatible = "lemaker,bananapi", "allwinner,sun7i-a20"; |
| 57 | 57 | ||
| 58 | aliases { | ||
| 59 | serial0 = &uart0; | ||
| 60 | serial1 = &uart3; | ||
| 61 | serial2 = &uart7; | ||
| 62 | }; | ||
| 63 | |||
| 58 | soc@01c00000 { | 64 | soc@01c00000 { |
| 59 | spi0: spi@01c05000 { | 65 | spi0: spi@01c05000 { |
| 60 | pinctrl-names = "default"; | 66 | pinctrl-names = "default"; |
diff --git a/arch/arm/boot/dts/sun7i-a20-hummingbird.dts b/arch/arm/boot/dts/sun7i-a20-hummingbird.dts index 0e4bfa3b2b85..0bcefcbbb756 100644 --- a/arch/arm/boot/dts/sun7i-a20-hummingbird.dts +++ b/arch/arm/boot/dts/sun7i-a20-hummingbird.dts | |||
| @@ -19,6 +19,14 @@ | |||
| 19 | model = "Merrii A20 Hummingbird"; | 19 | model = "Merrii A20 Hummingbird"; |
| 20 | compatible = "merrii,a20-hummingbird", "allwinner,sun7i-a20"; | 20 | compatible = "merrii,a20-hummingbird", "allwinner,sun7i-a20"; |
| 21 | 21 | ||
| 22 | aliases { | ||
| 23 | serial0 = &uart0; | ||
| 24 | serial1 = &uart2; | ||
| 25 | serial2 = &uart3; | ||
| 26 | serial3 = &uart4; | ||
| 27 | serial4 = &uart5; | ||
| 28 | }; | ||
| 29 | |||
| 22 | soc@01c00000 { | 30 | soc@01c00000 { |
| 23 | mmc0: mmc@01c0f000 { | 31 | mmc0: mmc@01c0f000 { |
| 24 | pinctrl-names = "default"; | 32 | pinctrl-names = "default"; |
diff --git a/arch/arm/boot/dts/sun7i-a20-olinuxino-micro.dts b/arch/arm/boot/dts/sun7i-a20-olinuxino-micro.dts index 9d669cdf031d..66cc77707198 100644 --- a/arch/arm/boot/dts/sun7i-a20-olinuxino-micro.dts +++ b/arch/arm/boot/dts/sun7i-a20-olinuxino-micro.dts | |||
| @@ -20,6 +20,9 @@ | |||
| 20 | compatible = "olimex,a20-olinuxino-micro", "allwinner,sun7i-a20"; | 20 | compatible = "olimex,a20-olinuxino-micro", "allwinner,sun7i-a20"; |
| 21 | 21 | ||
| 22 | aliases { | 22 | aliases { |
| 23 | serial0 = &uart0; | ||
| 24 | serial1 = &uart6; | ||
| 25 | serial2 = &uart7; | ||
| 23 | spi0 = &spi1; | 26 | spi0 = &spi1; |
| 24 | spi1 = &spi2; | 27 | spi1 = &spi2; |
| 25 | }; | 28 | }; |
diff --git a/arch/arm/boot/dts/sun7i-a20.dtsi b/arch/arm/boot/dts/sun7i-a20.dtsi index e21ce5992d56..89749ce34a84 100644 --- a/arch/arm/boot/dts/sun7i-a20.dtsi +++ b/arch/arm/boot/dts/sun7i-a20.dtsi | |||
| @@ -54,14 +54,6 @@ | |||
| 54 | 54 | ||
| 55 | aliases { | 55 | aliases { |
| 56 | ethernet0 = &gmac; | 56 | ethernet0 = &gmac; |
| 57 | serial0 = &uart0; | ||
| 58 | serial1 = &uart1; | ||
| 59 | serial2 = &uart2; | ||
| 60 | serial3 = &uart3; | ||
| 61 | serial4 = &uart4; | ||
| 62 | serial5 = &uart5; | ||
| 63 | serial6 = &uart6; | ||
| 64 | serial7 = &uart7; | ||
| 65 | }; | 57 | }; |
| 66 | 58 | ||
| 67 | chosen { | 59 | chosen { |
diff --git a/arch/arm/boot/dts/sun8i-a23-ippo-q8h-v5.dts b/arch/arm/boot/dts/sun8i-a23-ippo-q8h-v5.dts index 7f2117ce6985..32ad80804dbb 100644 --- a/arch/arm/boot/dts/sun8i-a23-ippo-q8h-v5.dts +++ b/arch/arm/boot/dts/sun8i-a23-ippo-q8h-v5.dts | |||
| @@ -55,6 +55,10 @@ | |||
| 55 | model = "Ippo Q8H Dual Core Tablet (v5)"; | 55 | model = "Ippo Q8H Dual Core Tablet (v5)"; |
| 56 | compatible = "ippo,q8h-v5", "allwinner,sun8i-a23"; | 56 | compatible = "ippo,q8h-v5", "allwinner,sun8i-a23"; |
| 57 | 57 | ||
| 58 | aliases { | ||
| 59 | serial0 = &r_uart; | ||
| 60 | }; | ||
| 61 | |||
| 58 | chosen { | 62 | chosen { |
| 59 | bootargs = "earlyprintk console=ttyS0,115200"; | 63 | bootargs = "earlyprintk console=ttyS0,115200"; |
| 60 | }; | 64 | }; |
diff --git a/arch/arm/boot/dts/sun8i-a23.dtsi b/arch/arm/boot/dts/sun8i-a23.dtsi index 0746cd1024d7..86584fcf5e32 100644 --- a/arch/arm/boot/dts/sun8i-a23.dtsi +++ b/arch/arm/boot/dts/sun8i-a23.dtsi | |||
| @@ -52,15 +52,6 @@ | |||
| 52 | / { | 52 | / { |
| 53 | interrupt-parent = <&gic>; | 53 | interrupt-parent = <&gic>; |
| 54 | 54 | ||
| 55 | aliases { | ||
| 56 | serial0 = &uart0; | ||
| 57 | serial1 = &uart1; | ||
| 58 | serial2 = &uart2; | ||
| 59 | serial3 = &uart3; | ||
| 60 | serial4 = &uart4; | ||
| 61 | serial5 = &r_uart; | ||
| 62 | }; | ||
| 63 | |||
| 64 | cpus { | 55 | cpus { |
| 65 | #address-cells = <1>; | 56 | #address-cells = <1>; |
| 66 | #size-cells = <0>; | 57 | #size-cells = <0>; |
diff --git a/arch/arm/boot/dts/sun9i-a80-optimus.dts b/arch/arm/boot/dts/sun9i-a80-optimus.dts index 506948f582ee..11ec71072e81 100644 --- a/arch/arm/boot/dts/sun9i-a80-optimus.dts +++ b/arch/arm/boot/dts/sun9i-a80-optimus.dts | |||
| @@ -54,6 +54,11 @@ | |||
| 54 | model = "Merrii A80 Optimus Board"; | 54 | model = "Merrii A80 Optimus Board"; |
| 55 | compatible = "merrii,a80-optimus", "allwinner,sun9i-a80"; | 55 | compatible = "merrii,a80-optimus", "allwinner,sun9i-a80"; |
| 56 | 56 | ||
| 57 | aliases { | ||
| 58 | serial0 = &uart0; | ||
| 59 | serial1 = &uart4; | ||
| 60 | }; | ||
| 61 | |||
| 57 | chosen { | 62 | chosen { |
| 58 | bootargs = "earlyprintk console=ttyS0,115200"; | 63 | bootargs = "earlyprintk console=ttyS0,115200"; |
| 59 | }; | 64 | }; |
diff --git a/arch/arm/boot/dts/sun9i-a80.dtsi b/arch/arm/boot/dts/sun9i-a80.dtsi index 494714f67b57..9ef4438206a9 100644 --- a/arch/arm/boot/dts/sun9i-a80.dtsi +++ b/arch/arm/boot/dts/sun9i-a80.dtsi | |||
| @@ -52,16 +52,6 @@ | |||
| 52 | / { | 52 | / { |
| 53 | interrupt-parent = <&gic>; | 53 | interrupt-parent = <&gic>; |
| 54 | 54 | ||
| 55 | aliases { | ||
| 56 | serial0 = &uart0; | ||
| 57 | serial1 = &uart1; | ||
| 58 | serial2 = &uart2; | ||
| 59 | serial3 = &uart3; | ||
| 60 | serial4 = &uart4; | ||
| 61 | serial5 = &uart5; | ||
| 62 | serial6 = &r_uart; | ||
| 63 | }; | ||
| 64 | |||
| 65 | cpus { | 55 | cpus { |
| 66 | #address-cells = <1>; | 56 | #address-cells = <1>; |
| 67 | #size-cells = <0>; | 57 | #size-cells = <0>; |
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/boot/dts/vf610-twr.dts b/arch/arm/boot/dts/vf610-twr.dts index a0f762159cb2..f2b64b1b00fa 100644 --- a/arch/arm/boot/dts/vf610-twr.dts +++ b/arch/arm/boot/dts/vf610-twr.dts | |||
| @@ -129,13 +129,28 @@ | |||
| 129 | 129 | ||
| 130 | &fec0 { | 130 | &fec0 { |
| 131 | phy-mode = "rmii"; | 131 | phy-mode = "rmii"; |
| 132 | phy-handle = <ðphy0>; | ||
| 132 | pinctrl-names = "default"; | 133 | pinctrl-names = "default"; |
| 133 | pinctrl-0 = <&pinctrl_fec0>; | 134 | pinctrl-0 = <&pinctrl_fec0>; |
| 134 | status = "okay"; | 135 | status = "okay"; |
| 136 | |||
| 137 | mdio { | ||
| 138 | #address-cells = <1>; | ||
| 139 | #size-cells = <0>; | ||
| 140 | |||
| 141 | ethphy0: ethernet-phy@0 { | ||
| 142 | reg = <0>; | ||
| 143 | }; | ||
| 144 | |||
| 145 | ethphy1: ethernet-phy@1 { | ||
| 146 | reg = <1>; | ||
| 147 | }; | ||
| 148 | }; | ||
| 135 | }; | 149 | }; |
| 136 | 150 | ||
| 137 | &fec1 { | 151 | &fec1 { |
| 138 | phy-mode = "rmii"; | 152 | phy-mode = "rmii"; |
| 153 | phy-handle = <ðphy1>; | ||
| 139 | pinctrl-names = "default"; | 154 | pinctrl-names = "default"; |
| 140 | pinctrl-0 = <&pinctrl_fec1>; | 155 | pinctrl-0 = <&pinctrl_fec1>; |
| 141 | status = "okay"; | 156 | status = "okay"; |
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/include/asm/kvm_emulate.h b/arch/arm/include/asm/kvm_emulate.h index 66ce17655bb9..7b0152321b20 100644 --- a/arch/arm/include/asm/kvm_emulate.h +++ b/arch/arm/include/asm/kvm_emulate.h | |||
| @@ -38,6 +38,16 @@ static inline void vcpu_reset_hcr(struct kvm_vcpu *vcpu) | |||
| 38 | vcpu->arch.hcr = HCR_GUEST_MASK; | 38 | vcpu->arch.hcr = HCR_GUEST_MASK; |
| 39 | } | 39 | } |
| 40 | 40 | ||
| 41 | static inline unsigned long vcpu_get_hcr(struct kvm_vcpu *vcpu) | ||
| 42 | { | ||
| 43 | return vcpu->arch.hcr; | ||
| 44 | } | ||
| 45 | |||
| 46 | static inline void vcpu_set_hcr(struct kvm_vcpu *vcpu, unsigned long hcr) | ||
| 47 | { | ||
| 48 | vcpu->arch.hcr = hcr; | ||
| 49 | } | ||
| 50 | |||
| 41 | static inline bool vcpu_mode_is_32bit(struct kvm_vcpu *vcpu) | 51 | static inline bool vcpu_mode_is_32bit(struct kvm_vcpu *vcpu) |
| 42 | { | 52 | { |
| 43 | return 1; | 53 | return 1; |
diff --git a/arch/arm/include/asm/kvm_host.h b/arch/arm/include/asm/kvm_host.h index 254e0650e48b..04b4ea0b550a 100644 --- a/arch/arm/include/asm/kvm_host.h +++ b/arch/arm/include/asm/kvm_host.h | |||
| @@ -125,9 +125,6 @@ struct kvm_vcpu_arch { | |||
| 125 | * Anything that is not used directly from assembly code goes | 125 | * Anything that is not used directly from assembly code goes |
| 126 | * here. | 126 | * here. |
| 127 | */ | 127 | */ |
| 128 | /* dcache set/way operation pending */ | ||
| 129 | int last_pcpu; | ||
| 130 | cpumask_t require_dcache_flush; | ||
| 131 | 128 | ||
| 132 | /* Don't run the guest on this vcpu */ | 129 | /* Don't run the guest on this vcpu */ |
| 133 | bool pause; | 130 | bool pause; |
diff --git a/arch/arm/include/asm/kvm_mmu.h b/arch/arm/include/asm/kvm_mmu.h index 63e0ecc04901..1bca8f8af442 100644 --- a/arch/arm/include/asm/kvm_mmu.h +++ b/arch/arm/include/asm/kvm_mmu.h | |||
| @@ -44,6 +44,7 @@ | |||
| 44 | 44 | ||
| 45 | #ifndef __ASSEMBLY__ | 45 | #ifndef __ASSEMBLY__ |
| 46 | 46 | ||
| 47 | #include <linux/highmem.h> | ||
| 47 | #include <asm/cacheflush.h> | 48 | #include <asm/cacheflush.h> |
| 48 | #include <asm/pgalloc.h> | 49 | #include <asm/pgalloc.h> |
| 49 | 50 | ||
| @@ -161,13 +162,10 @@ static inline bool vcpu_has_cache_enabled(struct kvm_vcpu *vcpu) | |||
| 161 | return (vcpu->arch.cp15[c1_SCTLR] & 0b101) == 0b101; | 162 | return (vcpu->arch.cp15[c1_SCTLR] & 0b101) == 0b101; |
| 162 | } | 163 | } |
| 163 | 164 | ||
| 164 | static inline void coherent_cache_guest_page(struct kvm_vcpu *vcpu, hva_t hva, | 165 | static inline void __coherent_cache_guest_page(struct kvm_vcpu *vcpu, pfn_t pfn, |
| 165 | unsigned long size, | 166 | unsigned long size, |
| 166 | bool ipa_uncached) | 167 | bool ipa_uncached) |
| 167 | { | 168 | { |
| 168 | if (!vcpu_has_cache_enabled(vcpu) || ipa_uncached) | ||
| 169 | kvm_flush_dcache_to_poc((void *)hva, size); | ||
| 170 | |||
| 171 | /* | 169 | /* |
| 172 | * If we are going to insert an instruction page and the icache is | 170 | * If we are going to insert an instruction page and the icache is |
| 173 | * either VIPT or PIPT, there is a potential problem where the host | 171 | * either VIPT or PIPT, there is a potential problem where the host |
| @@ -179,18 +177,77 @@ static inline void coherent_cache_guest_page(struct kvm_vcpu *vcpu, hva_t hva, | |||
| 179 | * | 177 | * |
| 180 | * VIVT caches are tagged using both the ASID and the VMID and doesn't | 178 | * VIVT caches are tagged using both the ASID and the VMID and doesn't |
| 181 | * need any kind of flushing (DDI 0406C.b - Page B3-1392). | 179 | * need any kind of flushing (DDI 0406C.b - Page B3-1392). |
| 180 | * | ||
| 181 | * We need to do this through a kernel mapping (using the | ||
| 182 | * user-space mapping has proved to be the wrong | ||
| 183 | * solution). For that, we need to kmap one page at a time, | ||
| 184 | * and iterate over the range. | ||
| 182 | */ | 185 | */ |
| 183 | if (icache_is_pipt()) { | 186 | |
| 184 | __cpuc_coherent_user_range(hva, hva + size); | 187 | bool need_flush = !vcpu_has_cache_enabled(vcpu) || ipa_uncached; |
| 185 | } else if (!icache_is_vivt_asid_tagged()) { | 188 | |
| 189 | VM_BUG_ON(size & PAGE_MASK); | ||
| 190 | |||
| 191 | if (!need_flush && !icache_is_pipt()) | ||
| 192 | goto vipt_cache; | ||
| 193 | |||
| 194 | while (size) { | ||
| 195 | void *va = kmap_atomic_pfn(pfn); | ||
| 196 | |||
| 197 | if (need_flush) | ||
| 198 | kvm_flush_dcache_to_poc(va, PAGE_SIZE); | ||
| 199 | |||
| 200 | if (icache_is_pipt()) | ||
| 201 | __cpuc_coherent_user_range((unsigned long)va, | ||
| 202 | (unsigned long)va + PAGE_SIZE); | ||
| 203 | |||
| 204 | size -= PAGE_SIZE; | ||
| 205 | pfn++; | ||
| 206 | |||
| 207 | kunmap_atomic(va); | ||
| 208 | } | ||
| 209 | |||
| 210 | vipt_cache: | ||
| 211 | if (!icache_is_pipt() && !icache_is_vivt_asid_tagged()) { | ||
| 186 | /* any kind of VIPT cache */ | 212 | /* any kind of VIPT cache */ |
| 187 | __flush_icache_all(); | 213 | __flush_icache_all(); |
| 188 | } | 214 | } |
| 189 | } | 215 | } |
| 190 | 216 | ||
| 217 | static inline void __kvm_flush_dcache_pte(pte_t pte) | ||
| 218 | { | ||
| 219 | void *va = kmap_atomic(pte_page(pte)); | ||
| 220 | |||
| 221 | kvm_flush_dcache_to_poc(va, PAGE_SIZE); | ||
| 222 | |||
| 223 | kunmap_atomic(va); | ||
| 224 | } | ||
| 225 | |||
| 226 | static inline void __kvm_flush_dcache_pmd(pmd_t pmd) | ||
| 227 | { | ||
| 228 | unsigned long size = PMD_SIZE; | ||
| 229 | pfn_t pfn = pmd_pfn(pmd); | ||
| 230 | |||
| 231 | while (size) { | ||
| 232 | void *va = kmap_atomic_pfn(pfn); | ||
| 233 | |||
| 234 | kvm_flush_dcache_to_poc(va, PAGE_SIZE); | ||
| 235 | |||
| 236 | pfn++; | ||
| 237 | size -= PAGE_SIZE; | ||
| 238 | |||
| 239 | kunmap_atomic(va); | ||
| 240 | } | ||
| 241 | } | ||
| 242 | |||
| 243 | static inline void __kvm_flush_dcache_pud(pud_t pud) | ||
| 244 | { | ||
| 245 | } | ||
| 246 | |||
| 191 | #define kvm_virt_to_phys(x) virt_to_idmap((unsigned long)(x)) | 247 | #define kvm_virt_to_phys(x) virt_to_idmap((unsigned long)(x)) |
| 192 | 248 | ||
| 193 | void stage2_flush_vm(struct kvm *kvm); | 249 | void kvm_set_way_flush(struct kvm_vcpu *vcpu); |
| 250 | void kvm_toggle_cache(struct kvm_vcpu *vcpu, bool was_enabled); | ||
| 194 | 251 | ||
| 195 | #endif /* !__ASSEMBLY__ */ | 252 | #endif /* !__ASSEMBLY__ */ |
| 196 | 253 | ||
diff --git a/arch/arm/include/uapi/asm/unistd.h b/arch/arm/include/uapi/asm/unistd.h index 705bb7620673..0c3f5a0dafd3 100644 --- a/arch/arm/include/uapi/asm/unistd.h +++ b/arch/arm/include/uapi/asm/unistd.h | |||
| @@ -413,6 +413,7 @@ | |||
| 413 | #define __NR_getrandom (__NR_SYSCALL_BASE+384) | 413 | #define __NR_getrandom (__NR_SYSCALL_BASE+384) |
| 414 | #define __NR_memfd_create (__NR_SYSCALL_BASE+385) | 414 | #define __NR_memfd_create (__NR_SYSCALL_BASE+385) |
| 415 | #define __NR_bpf (__NR_SYSCALL_BASE+386) | 415 | #define __NR_bpf (__NR_SYSCALL_BASE+386) |
| 416 | #define __NR_execveat (__NR_SYSCALL_BASE+387) | ||
| 416 | 417 | ||
| 417 | /* | 418 | /* |
| 418 | * The following SWIs are ARM private. | 419 | * The following SWIs are ARM private. |
diff --git a/arch/arm/kernel/calls.S b/arch/arm/kernel/calls.S index e51833f8cc38..05745eb838c5 100644 --- a/arch/arm/kernel/calls.S +++ b/arch/arm/kernel/calls.S | |||
| @@ -396,6 +396,7 @@ | |||
| 396 | CALL(sys_getrandom) | 396 | CALL(sys_getrandom) |
| 397 | /* 385 */ CALL(sys_memfd_create) | 397 | /* 385 */ CALL(sys_memfd_create) |
| 398 | CALL(sys_bpf) | 398 | CALL(sys_bpf) |
| 399 | CALL(sys_execveat) | ||
| 399 | #ifndef syscalls_counted | 400 | #ifndef syscalls_counted |
| 400 | .equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls | 401 | .equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls |
| 401 | #define syscalls_counted | 402 | #define syscalls_counted |
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/entry-v7m.S b/arch/arm/kernel/entry-v7m.S index 2260f1855820..8944f4991c3c 100644 --- a/arch/arm/kernel/entry-v7m.S +++ b/arch/arm/kernel/entry-v7m.S | |||
| @@ -22,10 +22,12 @@ | |||
| 22 | 22 | ||
| 23 | __invalid_entry: | 23 | __invalid_entry: |
| 24 | v7m_exception_entry | 24 | v7m_exception_entry |
| 25 | #ifdef CONFIG_PRINTK | ||
| 25 | adr r0, strerr | 26 | adr r0, strerr |
| 26 | mrs r1, ipsr | 27 | mrs r1, ipsr |
| 27 | mov r2, lr | 28 | mov r2, lr |
| 28 | bl printk | 29 | bl printk |
| 30 | #endif | ||
| 29 | mov r0, sp | 31 | mov r0, sp |
| 30 | bl show_regs | 32 | bl show_regs |
| 31 | 1: b 1b | 33 | 1: b 1b |
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/perf_regs.c b/arch/arm/kernel/perf_regs.c index 6e4379c67cbc..592dda3f21ff 100644 --- a/arch/arm/kernel/perf_regs.c +++ b/arch/arm/kernel/perf_regs.c | |||
| @@ -28,3 +28,11 @@ u64 perf_reg_abi(struct task_struct *task) | |||
| 28 | { | 28 | { |
| 29 | return PERF_SAMPLE_REGS_ABI_32; | 29 | return PERF_SAMPLE_REGS_ABI_32; |
| 30 | } | 30 | } |
| 31 | |||
| 32 | void perf_get_regs_user(struct perf_regs *regs_user, | ||
| 33 | struct pt_regs *regs, | ||
| 34 | struct pt_regs *regs_user_copy) | ||
| 35 | { | ||
| 36 | regs_user->regs = task_pt_regs(current); | ||
| 37 | regs_user->abi = perf_reg_abi(current); | ||
| 38 | } | ||
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/kvm/arm.c b/arch/arm/kvm/arm.c index 2d6d91001062..0b0d58a905c4 100644 --- a/arch/arm/kvm/arm.c +++ b/arch/arm/kvm/arm.c | |||
| @@ -281,15 +281,6 @@ void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu) | |||
| 281 | vcpu->cpu = cpu; | 281 | vcpu->cpu = cpu; |
| 282 | vcpu->arch.host_cpu_context = this_cpu_ptr(kvm_host_cpu_state); | 282 | vcpu->arch.host_cpu_context = this_cpu_ptr(kvm_host_cpu_state); |
| 283 | 283 | ||
| 284 | /* | ||
| 285 | * Check whether this vcpu requires the cache to be flushed on | ||
| 286 | * this physical CPU. This is a consequence of doing dcache | ||
| 287 | * operations by set/way on this vcpu. We do it here to be in | ||
| 288 | * a non-preemptible section. | ||
| 289 | */ | ||
| 290 | if (cpumask_test_and_clear_cpu(cpu, &vcpu->arch.require_dcache_flush)) | ||
| 291 | flush_cache_all(); /* We'd really want v7_flush_dcache_all() */ | ||
| 292 | |||
| 293 | kvm_arm_set_running_vcpu(vcpu); | 284 | kvm_arm_set_running_vcpu(vcpu); |
| 294 | } | 285 | } |
| 295 | 286 | ||
| @@ -541,7 +532,6 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run) | |||
| 541 | ret = kvm_call_hyp(__kvm_vcpu_run, vcpu); | 532 | ret = kvm_call_hyp(__kvm_vcpu_run, vcpu); |
| 542 | 533 | ||
| 543 | vcpu->mode = OUTSIDE_GUEST_MODE; | 534 | vcpu->mode = OUTSIDE_GUEST_MODE; |
| 544 | vcpu->arch.last_pcpu = smp_processor_id(); | ||
| 545 | kvm_guest_exit(); | 535 | kvm_guest_exit(); |
| 546 | trace_kvm_exit(*vcpu_pc(vcpu)); | 536 | trace_kvm_exit(*vcpu_pc(vcpu)); |
| 547 | /* | 537 | /* |
diff --git a/arch/arm/kvm/coproc.c b/arch/arm/kvm/coproc.c index 7928dbdf2102..f3d88dc388bc 100644 --- a/arch/arm/kvm/coproc.c +++ b/arch/arm/kvm/coproc.c | |||
| @@ -189,82 +189,40 @@ static bool access_l2ectlr(struct kvm_vcpu *vcpu, | |||
| 189 | return true; | 189 | return true; |
| 190 | } | 190 | } |
| 191 | 191 | ||
| 192 | /* See note at ARM ARM B1.14.4 */ | 192 | /* |
| 193 | * See note at ARMv7 ARM B1.14.4 (TL;DR: S/W ops are not easily virtualized). | ||
| 194 | */ | ||
| 193 | static bool access_dcsw(struct kvm_vcpu *vcpu, | 195 | static bool access_dcsw(struct kvm_vcpu *vcpu, |
| 194 | const struct coproc_params *p, | 196 | const struct coproc_params *p, |
| 195 | const struct coproc_reg *r) | 197 | const struct coproc_reg *r) |
| 196 | { | 198 | { |
| 197 | unsigned long val; | ||
| 198 | int cpu; | ||
| 199 | |||
| 200 | if (!p->is_write) | 199 | if (!p->is_write) |
| 201 | return read_from_write_only(vcpu, p); | 200 | return read_from_write_only(vcpu, p); |
| 202 | 201 | ||
| 203 | cpu = get_cpu(); | 202 | kvm_set_way_flush(vcpu); |
| 204 | |||
| 205 | cpumask_setall(&vcpu->arch.require_dcache_flush); | ||
| 206 | cpumask_clear_cpu(cpu, &vcpu->arch.require_dcache_flush); | ||
| 207 | |||
| 208 | /* If we were already preempted, take the long way around */ | ||
| 209 | if (cpu != vcpu->arch.last_pcpu) { | ||
| 210 | flush_cache_all(); | ||
| 211 | goto done; | ||
| 212 | } | ||
| 213 | |||
| 214 | val = *vcpu_reg(vcpu, p->Rt1); | ||
| 215 | |||
| 216 | switch (p->CRm) { | ||
| 217 | case 6: /* Upgrade DCISW to DCCISW, as per HCR.SWIO */ | ||
| 218 | case 14: /* DCCISW */ | ||
| 219 | asm volatile("mcr p15, 0, %0, c7, c14, 2" : : "r" (val)); | ||
| 220 | break; | ||
| 221 | |||
| 222 | case 10: /* DCCSW */ | ||
| 223 | asm volatile("mcr p15, 0, %0, c7, c10, 2" : : "r" (val)); | ||
| 224 | break; | ||
| 225 | } | ||
| 226 | |||
| 227 | done: | ||
| 228 | put_cpu(); | ||
| 229 | |||
| 230 | return true; | 203 | return true; |
| 231 | } | 204 | } |
| 232 | 205 | ||
| 233 | /* | 206 | /* |
| 234 | * Generic accessor for VM registers. Only called as long as HCR_TVM | 207 | * Generic accessor for VM registers. Only called as long as HCR_TVM |
| 235 | * is set. | 208 | * is set. If the guest enables the MMU, we stop trapping the VM |
| 209 | * sys_regs and leave it in complete control of the caches. | ||
| 210 | * | ||
| 211 | * Used by the cpu-specific code. | ||
| 236 | */ | 212 | */ |
| 237 | static bool access_vm_reg(struct kvm_vcpu *vcpu, | 213 | bool access_vm_reg(struct kvm_vcpu *vcpu, |
| 238 | const struct coproc_params *p, | 214 | const struct coproc_params *p, |
| 239 | const struct coproc_reg *r) | 215 | const struct coproc_reg *r) |
| 240 | { | 216 | { |
| 217 | bool was_enabled = vcpu_has_cache_enabled(vcpu); | ||
| 218 | |||
| 241 | BUG_ON(!p->is_write); | 219 | BUG_ON(!p->is_write); |
| 242 | 220 | ||
| 243 | vcpu->arch.cp15[r->reg] = *vcpu_reg(vcpu, p->Rt1); | 221 | vcpu->arch.cp15[r->reg] = *vcpu_reg(vcpu, p->Rt1); |
| 244 | if (p->is_64bit) | 222 | if (p->is_64bit) |
| 245 | vcpu->arch.cp15[r->reg + 1] = *vcpu_reg(vcpu, p->Rt2); | 223 | vcpu->arch.cp15[r->reg + 1] = *vcpu_reg(vcpu, p->Rt2); |
| 246 | 224 | ||
| 247 | return true; | 225 | kvm_toggle_cache(vcpu, was_enabled); |
| 248 | } | ||
| 249 | |||
| 250 | /* | ||
| 251 | * SCTLR accessor. Only called as long as HCR_TVM is set. If the | ||
| 252 | * guest enables the MMU, we stop trapping the VM sys_regs and leave | ||
| 253 | * it in complete control of the caches. | ||
| 254 | * | ||
| 255 | * Used by the cpu-specific code. | ||
| 256 | */ | ||
| 257 | bool access_sctlr(struct kvm_vcpu *vcpu, | ||
| 258 | const struct coproc_params *p, | ||
| 259 | const struct coproc_reg *r) | ||
| 260 | { | ||
| 261 | access_vm_reg(vcpu, p, r); | ||
| 262 | |||
| 263 | if (vcpu_has_cache_enabled(vcpu)) { /* MMU+Caches enabled? */ | ||
| 264 | vcpu->arch.hcr &= ~HCR_TVM; | ||
| 265 | stage2_flush_vm(vcpu->kvm); | ||
| 266 | } | ||
| 267 | |||
| 268 | return true; | 226 | return true; |
| 269 | } | 227 | } |
| 270 | 228 | ||
diff --git a/arch/arm/kvm/coproc.h b/arch/arm/kvm/coproc.h index 1a44bbe39643..88d24a3a9778 100644 --- a/arch/arm/kvm/coproc.h +++ b/arch/arm/kvm/coproc.h | |||
| @@ -153,8 +153,8 @@ static inline int cmp_reg(const struct coproc_reg *i1, | |||
| 153 | #define is64 .is_64 = true | 153 | #define is64 .is_64 = true |
| 154 | #define is32 .is_64 = false | 154 | #define is32 .is_64 = false |
| 155 | 155 | ||
| 156 | bool access_sctlr(struct kvm_vcpu *vcpu, | 156 | bool access_vm_reg(struct kvm_vcpu *vcpu, |
| 157 | const struct coproc_params *p, | 157 | const struct coproc_params *p, |
| 158 | const struct coproc_reg *r); | 158 | const struct coproc_reg *r); |
| 159 | 159 | ||
| 160 | #endif /* __ARM_KVM_COPROC_LOCAL_H__ */ | 160 | #endif /* __ARM_KVM_COPROC_LOCAL_H__ */ |
diff --git a/arch/arm/kvm/coproc_a15.c b/arch/arm/kvm/coproc_a15.c index e6f4ae48bda9..a7136757d373 100644 --- a/arch/arm/kvm/coproc_a15.c +++ b/arch/arm/kvm/coproc_a15.c | |||
| @@ -34,7 +34,7 @@ | |||
| 34 | static const struct coproc_reg a15_regs[] = { | 34 | static const struct coproc_reg a15_regs[] = { |
| 35 | /* SCTLR: swapped by interrupt.S. */ | 35 | /* SCTLR: swapped by interrupt.S. */ |
| 36 | { CRn( 1), CRm( 0), Op1( 0), Op2( 0), is32, | 36 | { CRn( 1), CRm( 0), Op1( 0), Op2( 0), is32, |
| 37 | access_sctlr, reset_val, c1_SCTLR, 0x00C50078 }, | 37 | access_vm_reg, reset_val, c1_SCTLR, 0x00C50078 }, |
| 38 | }; | 38 | }; |
| 39 | 39 | ||
| 40 | static struct kvm_coproc_target_table a15_target_table = { | 40 | static struct kvm_coproc_target_table a15_target_table = { |
diff --git a/arch/arm/kvm/coproc_a7.c b/arch/arm/kvm/coproc_a7.c index 17fc7cd479d3..b19e46d1b2c0 100644 --- a/arch/arm/kvm/coproc_a7.c +++ b/arch/arm/kvm/coproc_a7.c | |||
| @@ -37,7 +37,7 @@ | |||
| 37 | static const struct coproc_reg a7_regs[] = { | 37 | static const struct coproc_reg a7_regs[] = { |
| 38 | /* SCTLR: swapped by interrupt.S. */ | 38 | /* SCTLR: swapped by interrupt.S. */ |
| 39 | { CRn( 1), CRm( 0), Op1( 0), Op2( 0), is32, | 39 | { CRn( 1), CRm( 0), Op1( 0), Op2( 0), is32, |
| 40 | access_sctlr, reset_val, c1_SCTLR, 0x00C50878 }, | 40 | access_vm_reg, reset_val, c1_SCTLR, 0x00C50878 }, |
| 41 | }; | 41 | }; |
| 42 | 42 | ||
| 43 | static struct kvm_coproc_target_table a7_target_table = { | 43 | static struct kvm_coproc_target_table a7_target_table = { |
diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c index 1dc9778a00af..136662547ca6 100644 --- a/arch/arm/kvm/mmu.c +++ b/arch/arm/kvm/mmu.c | |||
| @@ -58,6 +58,26 @@ static void kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa) | |||
| 58 | kvm_call_hyp(__kvm_tlb_flush_vmid_ipa, kvm, ipa); | 58 | kvm_call_hyp(__kvm_tlb_flush_vmid_ipa, kvm, ipa); |
| 59 | } | 59 | } |
| 60 | 60 | ||
| 61 | /* | ||
| 62 | * D-Cache management functions. They take the page table entries by | ||
| 63 | * value, as they are flushing the cache using the kernel mapping (or | ||
| 64 | * kmap on 32bit). | ||
| 65 | */ | ||
| 66 | static void kvm_flush_dcache_pte(pte_t pte) | ||
| 67 | { | ||
| 68 | __kvm_flush_dcache_pte(pte); | ||
| 69 | } | ||
| 70 | |||
| 71 | static void kvm_flush_dcache_pmd(pmd_t pmd) | ||
| 72 | { | ||
| 73 | __kvm_flush_dcache_pmd(pmd); | ||
| 74 | } | ||
| 75 | |||
| 76 | static void kvm_flush_dcache_pud(pud_t pud) | ||
| 77 | { | ||
| 78 | __kvm_flush_dcache_pud(pud); | ||
| 79 | } | ||
| 80 | |||
| 61 | static int mmu_topup_memory_cache(struct kvm_mmu_memory_cache *cache, | 81 | static int mmu_topup_memory_cache(struct kvm_mmu_memory_cache *cache, |
| 62 | int min, int max) | 82 | int min, int max) |
| 63 | { | 83 | { |
| @@ -119,6 +139,26 @@ static void clear_pmd_entry(struct kvm *kvm, pmd_t *pmd, phys_addr_t addr) | |||
| 119 | put_page(virt_to_page(pmd)); | 139 | put_page(virt_to_page(pmd)); |
| 120 | } | 140 | } |
| 121 | 141 | ||
| 142 | /* | ||
| 143 | * Unmapping vs dcache management: | ||
| 144 | * | ||
| 145 | * If a guest maps certain memory pages as uncached, all writes will | ||
| 146 | * bypass the data cache and go directly to RAM. However, the CPUs | ||
| 147 | * can still speculate reads (not writes) and fill cache lines with | ||
| 148 | * data. | ||
| 149 | * | ||
| 150 | * Those cache lines will be *clean* cache lines though, so a | ||
| 151 | * clean+invalidate operation is equivalent to an invalidate | ||
| 152 | * operation, because no cache lines are marked dirty. | ||
| 153 | * | ||
| 154 | * Those clean cache lines could be filled prior to an uncached write | ||
| 155 | * by the guest, and the cache coherent IO subsystem would therefore | ||
| 156 | * end up writing old data to disk. | ||
| 157 | * | ||
| 158 | * This is why right after unmapping a page/section and invalidating | ||
| 159 | * the corresponding TLBs, we call kvm_flush_dcache_p*() to make sure | ||
| 160 | * the IO subsystem will never hit in the cache. | ||
| 161 | */ | ||
| 122 | static void unmap_ptes(struct kvm *kvm, pmd_t *pmd, | 162 | static void unmap_ptes(struct kvm *kvm, pmd_t *pmd, |
| 123 | phys_addr_t addr, phys_addr_t end) | 163 | phys_addr_t addr, phys_addr_t end) |
| 124 | { | 164 | { |
| @@ -128,9 +168,16 @@ static void unmap_ptes(struct kvm *kvm, pmd_t *pmd, | |||
| 128 | start_pte = pte = pte_offset_kernel(pmd, addr); | 168 | start_pte = pte = pte_offset_kernel(pmd, addr); |
| 129 | do { | 169 | do { |
| 130 | if (!pte_none(*pte)) { | 170 | if (!pte_none(*pte)) { |
| 171 | pte_t old_pte = *pte; | ||
| 172 | |||
| 131 | kvm_set_pte(pte, __pte(0)); | 173 | kvm_set_pte(pte, __pte(0)); |
| 132 | put_page(virt_to_page(pte)); | ||
| 133 | kvm_tlb_flush_vmid_ipa(kvm, addr); | 174 | kvm_tlb_flush_vmid_ipa(kvm, addr); |
| 175 | |||
| 176 | /* No need to invalidate the cache for device mappings */ | ||
| 177 | if ((pte_val(old_pte) & PAGE_S2_DEVICE) != PAGE_S2_DEVICE) | ||
| 178 | kvm_flush_dcache_pte(old_pte); | ||
| 179 | |||
| 180 | put_page(virt_to_page(pte)); | ||
| 134 | } | 181 | } |
| 135 | } while (pte++, addr += PAGE_SIZE, addr != end); | 182 | } while (pte++, addr += PAGE_SIZE, addr != end); |
| 136 | 183 | ||
| @@ -149,8 +196,13 @@ static void unmap_pmds(struct kvm *kvm, pud_t *pud, | |||
| 149 | next = kvm_pmd_addr_end(addr, end); | 196 | next = kvm_pmd_addr_end(addr, end); |
| 150 | if (!pmd_none(*pmd)) { | 197 | if (!pmd_none(*pmd)) { |
| 151 | if (kvm_pmd_huge(*pmd)) { | 198 | if (kvm_pmd_huge(*pmd)) { |
| 199 | pmd_t old_pmd = *pmd; | ||
| 200 | |||
| 152 | pmd_clear(pmd); | 201 | pmd_clear(pmd); |
| 153 | kvm_tlb_flush_vmid_ipa(kvm, addr); | 202 | kvm_tlb_flush_vmid_ipa(kvm, addr); |
| 203 | |||
| 204 | kvm_flush_dcache_pmd(old_pmd); | ||
| 205 | |||
| 154 | put_page(virt_to_page(pmd)); | 206 | put_page(virt_to_page(pmd)); |
| 155 | } else { | 207 | } else { |
| 156 | unmap_ptes(kvm, pmd, addr, next); | 208 | unmap_ptes(kvm, pmd, addr, next); |
| @@ -173,8 +225,13 @@ static void unmap_puds(struct kvm *kvm, pgd_t *pgd, | |||
| 173 | next = kvm_pud_addr_end(addr, end); | 225 | next = kvm_pud_addr_end(addr, end); |
| 174 | if (!pud_none(*pud)) { | 226 | if (!pud_none(*pud)) { |
| 175 | if (pud_huge(*pud)) { | 227 | if (pud_huge(*pud)) { |
| 228 | pud_t old_pud = *pud; | ||
| 229 | |||
| 176 | pud_clear(pud); | 230 | pud_clear(pud); |
| 177 | kvm_tlb_flush_vmid_ipa(kvm, addr); | 231 | kvm_tlb_flush_vmid_ipa(kvm, addr); |
| 232 | |||
| 233 | kvm_flush_dcache_pud(old_pud); | ||
| 234 | |||
| 178 | put_page(virt_to_page(pud)); | 235 | put_page(virt_to_page(pud)); |
| 179 | } else { | 236 | } else { |
| 180 | unmap_pmds(kvm, pud, addr, next); | 237 | unmap_pmds(kvm, pud, addr, next); |
| @@ -209,10 +266,9 @@ static void stage2_flush_ptes(struct kvm *kvm, pmd_t *pmd, | |||
| 209 | 266 | ||
| 210 | pte = pte_offset_kernel(pmd, addr); | 267 | pte = pte_offset_kernel(pmd, addr); |
| 211 | do { | 268 | do { |
| 212 | if (!pte_none(*pte)) { | 269 | if (!pte_none(*pte) && |
| 213 | hva_t hva = gfn_to_hva(kvm, addr >> PAGE_SHIFT); | 270 | (pte_val(*pte) & PAGE_S2_DEVICE) != PAGE_S2_DEVICE) |
| 214 | kvm_flush_dcache_to_poc((void*)hva, PAGE_SIZE); | 271 | kvm_flush_dcache_pte(*pte); |
| 215 | } | ||
| 216 | } while (pte++, addr += PAGE_SIZE, addr != end); | 272 | } while (pte++, addr += PAGE_SIZE, addr != end); |
| 217 | } | 273 | } |
| 218 | 274 | ||
| @@ -226,12 +282,10 @@ static void stage2_flush_pmds(struct kvm *kvm, pud_t *pud, | |||
| 226 | do { | 282 | do { |
| 227 | next = kvm_pmd_addr_end(addr, end); | 283 | next = kvm_pmd_addr_end(addr, end); |
| 228 | if (!pmd_none(*pmd)) { | 284 | if (!pmd_none(*pmd)) { |
| 229 | if (kvm_pmd_huge(*pmd)) { | 285 | if (kvm_pmd_huge(*pmd)) |
| 230 | hva_t hva = gfn_to_hva(kvm, addr >> PAGE_SHIFT); | 286 | kvm_flush_dcache_pmd(*pmd); |
| 231 | kvm_flush_dcache_to_poc((void*)hva, PMD_SIZE); | 287 | else |
| 232 | } else { | ||
| 233 | stage2_flush_ptes(kvm, pmd, addr, next); | 288 | stage2_flush_ptes(kvm, pmd, addr, next); |
| 234 | } | ||
| 235 | } | 289 | } |
| 236 | } while (pmd++, addr = next, addr != end); | 290 | } while (pmd++, addr = next, addr != end); |
| 237 | } | 291 | } |
| @@ -246,12 +300,10 @@ static void stage2_flush_puds(struct kvm *kvm, pgd_t *pgd, | |||
| 246 | do { | 300 | do { |
| 247 | next = kvm_pud_addr_end(addr, end); | 301 | next = kvm_pud_addr_end(addr, end); |
| 248 | if (!pud_none(*pud)) { | 302 | if (!pud_none(*pud)) { |
| 249 | if (pud_huge(*pud)) { | 303 | if (pud_huge(*pud)) |
| 250 | hva_t hva = gfn_to_hva(kvm, addr >> PAGE_SHIFT); | 304 | kvm_flush_dcache_pud(*pud); |
| 251 | kvm_flush_dcache_to_poc((void*)hva, PUD_SIZE); | 305 | else |
| 252 | } else { | ||
| 253 | stage2_flush_pmds(kvm, pud, addr, next); | 306 | stage2_flush_pmds(kvm, pud, addr, next); |
| 254 | } | ||
| 255 | } | 307 | } |
| 256 | } while (pud++, addr = next, addr != end); | 308 | } while (pud++, addr = next, addr != end); |
| 257 | } | 309 | } |
| @@ -278,7 +330,7 @@ static void stage2_flush_memslot(struct kvm *kvm, | |||
| 278 | * Go through the stage 2 page tables and invalidate any cache lines | 330 | * Go through the stage 2 page tables and invalidate any cache lines |
| 279 | * backing memory already mapped to the VM. | 331 | * backing memory already mapped to the VM. |
| 280 | */ | 332 | */ |
| 281 | void stage2_flush_vm(struct kvm *kvm) | 333 | static void stage2_flush_vm(struct kvm *kvm) |
| 282 | { | 334 | { |
| 283 | struct kvm_memslots *slots; | 335 | struct kvm_memslots *slots; |
| 284 | struct kvm_memory_slot *memslot; | 336 | struct kvm_memory_slot *memslot; |
| @@ -905,6 +957,12 @@ static bool kvm_is_device_pfn(unsigned long pfn) | |||
| 905 | return !pfn_valid(pfn); | 957 | return !pfn_valid(pfn); |
| 906 | } | 958 | } |
| 907 | 959 | ||
| 960 | static void coherent_cache_guest_page(struct kvm_vcpu *vcpu, pfn_t pfn, | ||
| 961 | unsigned long size, bool uncached) | ||
| 962 | { | ||
| 963 | __coherent_cache_guest_page(vcpu, pfn, size, uncached); | ||
| 964 | } | ||
| 965 | |||
| 908 | static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, | 966 | static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, |
| 909 | struct kvm_memory_slot *memslot, unsigned long hva, | 967 | struct kvm_memory_slot *memslot, unsigned long hva, |
| 910 | unsigned long fault_status) | 968 | unsigned long fault_status) |
| @@ -994,8 +1052,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, | |||
| 994 | kvm_set_s2pmd_writable(&new_pmd); | 1052 | kvm_set_s2pmd_writable(&new_pmd); |
| 995 | kvm_set_pfn_dirty(pfn); | 1053 | kvm_set_pfn_dirty(pfn); |
| 996 | } | 1054 | } |
| 997 | coherent_cache_guest_page(vcpu, hva & PMD_MASK, PMD_SIZE, | 1055 | coherent_cache_guest_page(vcpu, pfn, PMD_SIZE, fault_ipa_uncached); |
| 998 | fault_ipa_uncached); | ||
| 999 | ret = stage2_set_pmd_huge(kvm, memcache, fault_ipa, &new_pmd); | 1056 | ret = stage2_set_pmd_huge(kvm, memcache, fault_ipa, &new_pmd); |
| 1000 | } else { | 1057 | } else { |
| 1001 | pte_t new_pte = pfn_pte(pfn, mem_type); | 1058 | pte_t new_pte = pfn_pte(pfn, mem_type); |
| @@ -1003,8 +1060,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, | |||
| 1003 | kvm_set_s2pte_writable(&new_pte); | 1060 | kvm_set_s2pte_writable(&new_pte); |
| 1004 | kvm_set_pfn_dirty(pfn); | 1061 | kvm_set_pfn_dirty(pfn); |
| 1005 | } | 1062 | } |
| 1006 | coherent_cache_guest_page(vcpu, hva, PAGE_SIZE, | 1063 | coherent_cache_guest_page(vcpu, pfn, PAGE_SIZE, fault_ipa_uncached); |
| 1007 | fault_ipa_uncached); | ||
| 1008 | ret = stage2_set_pte(kvm, memcache, fault_ipa, &new_pte, | 1064 | ret = stage2_set_pte(kvm, memcache, fault_ipa, &new_pte, |
| 1009 | pgprot_val(mem_type) == pgprot_val(PAGE_S2_DEVICE)); | 1065 | pgprot_val(mem_type) == pgprot_val(PAGE_S2_DEVICE)); |
| 1010 | } | 1066 | } |
| @@ -1411,3 +1467,71 @@ void kvm_arch_flush_shadow_memslot(struct kvm *kvm, | |||
| 1411 | unmap_stage2_range(kvm, gpa, size); | 1467 | unmap_stage2_range(kvm, gpa, size); |
| 1412 | spin_unlock(&kvm->mmu_lock); | 1468 | spin_unlock(&kvm->mmu_lock); |
| 1413 | } | 1469 | } |
| 1470 | |||
| 1471 | /* | ||
| 1472 | * See note at ARMv7 ARM B1.14.4 (TL;DR: S/W ops are not easily virtualized). | ||
| 1473 | * | ||
| 1474 | * Main problems: | ||
| 1475 | * - S/W ops are local to a CPU (not broadcast) | ||
| 1476 | * - We have line migration behind our back (speculation) | ||
| 1477 | * - System caches don't support S/W at all (damn!) | ||
| 1478 | * | ||
| 1479 | * In the face of the above, the best we can do is to try and convert | ||
| 1480 | * S/W ops to VA ops. Because the guest is not allowed to infer the | ||
| 1481 | * S/W to PA mapping, it can only use S/W to nuke the whole cache, | ||
| 1482 | * which is a rather good thing for us. | ||
| 1483 | * | ||
| 1484 | * Also, it is only used when turning caches on/off ("The expected | ||
| 1485 | * usage of the cache maintenance instructions that operate by set/way | ||
| 1486 | * is associated with the cache maintenance instructions associated | ||
| 1487 | * with the powerdown and powerup of caches, if this is required by | ||
| 1488 | * the implementation."). | ||
| 1489 | * | ||
| 1490 | * We use the following policy: | ||
| 1491 | * | ||
| 1492 | * - If we trap a S/W operation, we enable VM trapping to detect | ||
| 1493 | * caches being turned on/off, and do a full clean. | ||
| 1494 | * | ||
| 1495 | * - We flush the caches on both caches being turned on and off. | ||
| 1496 | * | ||
| 1497 | * - Once the caches are enabled, we stop trapping VM ops. | ||
| 1498 | */ | ||
| 1499 | void kvm_set_way_flush(struct kvm_vcpu *vcpu) | ||
| 1500 | { | ||
| 1501 | unsigned long hcr = vcpu_get_hcr(vcpu); | ||
| 1502 | |||
| 1503 | /* | ||
| 1504 | * If this is the first time we do a S/W operation | ||
| 1505 | * (i.e. HCR_TVM not set) flush the whole memory, and set the | ||
| 1506 | * VM trapping. | ||
| 1507 | * | ||
| 1508 | * Otherwise, rely on the VM trapping to wait for the MMU + | ||
| 1509 | * Caches to be turned off. At that point, we'll be able to | ||
| 1510 | * clean the caches again. | ||
| 1511 | */ | ||
| 1512 | if (!(hcr & HCR_TVM)) { | ||
| 1513 | trace_kvm_set_way_flush(*vcpu_pc(vcpu), | ||
| 1514 | vcpu_has_cache_enabled(vcpu)); | ||
| 1515 | stage2_flush_vm(vcpu->kvm); | ||
| 1516 | vcpu_set_hcr(vcpu, hcr | HCR_TVM); | ||
| 1517 | } | ||
| 1518 | } | ||
| 1519 | |||
| 1520 | void kvm_toggle_cache(struct kvm_vcpu *vcpu, bool was_enabled) | ||
| 1521 | { | ||
| 1522 | bool now_enabled = vcpu_has_cache_enabled(vcpu); | ||
| 1523 | |||
| 1524 | /* | ||
| 1525 | * If switching the MMU+caches on, need to invalidate the caches. | ||
| 1526 | * If switching it off, need to clean the caches. | ||
| 1527 | * Clean + invalidate does the trick always. | ||
| 1528 | */ | ||
| 1529 | if (now_enabled != was_enabled) | ||
| 1530 | stage2_flush_vm(vcpu->kvm); | ||
| 1531 | |||
| 1532 | /* Caches are now on, stop trapping VM ops (until a S/W op) */ | ||
| 1533 | if (now_enabled) | ||
| 1534 | vcpu_set_hcr(vcpu, vcpu_get_hcr(vcpu) & ~HCR_TVM); | ||
| 1535 | |||
| 1536 | trace_kvm_toggle_cache(*vcpu_pc(vcpu), was_enabled, now_enabled); | ||
| 1537 | } | ||
diff --git a/arch/arm/kvm/trace.h b/arch/arm/kvm/trace.h index b1d640f78623..b6a6e7102201 100644 --- a/arch/arm/kvm/trace.h +++ b/arch/arm/kvm/trace.h | |||
| @@ -223,6 +223,45 @@ TRACE_EVENT(kvm_hvc, | |||
| 223 | __entry->vcpu_pc, __entry->r0, __entry->imm) | 223 | __entry->vcpu_pc, __entry->r0, __entry->imm) |
| 224 | ); | 224 | ); |
| 225 | 225 | ||
| 226 | TRACE_EVENT(kvm_set_way_flush, | ||
| 227 | TP_PROTO(unsigned long vcpu_pc, bool cache), | ||
| 228 | TP_ARGS(vcpu_pc, cache), | ||
| 229 | |||
| 230 | TP_STRUCT__entry( | ||
| 231 | __field( unsigned long, vcpu_pc ) | ||
| 232 | __field( bool, cache ) | ||
| 233 | ), | ||
| 234 | |||
| 235 | TP_fast_assign( | ||
| 236 | __entry->vcpu_pc = vcpu_pc; | ||
| 237 | __entry->cache = cache; | ||
| 238 | ), | ||
| 239 | |||
| 240 | TP_printk("S/W flush at 0x%016lx (cache %s)", | ||
| 241 | __entry->vcpu_pc, __entry->cache ? "on" : "off") | ||
| 242 | ); | ||
| 243 | |||
| 244 | TRACE_EVENT(kvm_toggle_cache, | ||
| 245 | TP_PROTO(unsigned long vcpu_pc, bool was, bool now), | ||
| 246 | TP_ARGS(vcpu_pc, was, now), | ||
| 247 | |||
| 248 | TP_STRUCT__entry( | ||
| 249 | __field( unsigned long, vcpu_pc ) | ||
| 250 | __field( bool, was ) | ||
| 251 | __field( bool, now ) | ||
| 252 | ), | ||
| 253 | |||
| 254 | TP_fast_assign( | ||
| 255 | __entry->vcpu_pc = vcpu_pc; | ||
| 256 | __entry->was = was; | ||
| 257 | __entry->now = now; | ||
| 258 | ), | ||
| 259 | |||
| 260 | TP_printk("VM op at 0x%016lx (cache was %s, now %s)", | ||
| 261 | __entry->vcpu_pc, __entry->was ? "on" : "off", | ||
| 262 | __entry->now ? "on" : "off") | ||
| 263 | ); | ||
| 264 | |||
| 226 | #endif /* _TRACE_KVM_H */ | 265 | #endif /* _TRACE_KVM_H */ |
| 227 | 266 | ||
| 228 | #undef TRACE_INCLUDE_PATH | 267 | #undef TRACE_INCLUDE_PATH |
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..ccef8806bb58 100644 --- a/arch/arm/mach-mvebu/coherency.c +++ b/arch/arm/mach-mvebu/coherency.c | |||
| @@ -190,6 +190,13 @@ static void __init armada_375_380_coherency_init(struct device_node *np) | |||
| 190 | arch_ioremap_caller = armada_pcie_wa_ioremap_caller; | 190 | arch_ioremap_caller = armada_pcie_wa_ioremap_caller; |
| 191 | 191 | ||
| 192 | /* | 192 | /* |
| 193 | * We should switch the PL310 to I/O coherency mode only if | ||
| 194 | * I/O coherency is actually enabled. | ||
| 195 | */ | ||
| 196 | if (!coherency_available()) | ||
| 197 | return; | ||
| 198 | |||
| 199 | /* | ||
| 193 | * Add the PL310 property "arm,io-coherent". This makes sure the | 200 | * Add the PL310 property "arm,io-coherent". This makes sure the |
| 194 | * outer sync operation is not used, which allows to | 201 | * outer sync operation is not used, which allows to |
| 195 | * workaround the system erratum that causes deadlocks when | 202 | * workaround the system erratum that causes deadlocks when |
| @@ -246,9 +253,14 @@ static int coherency_type(void) | |||
| 246 | return type; | 253 | return type; |
| 247 | } | 254 | } |
| 248 | 255 | ||
| 256 | /* | ||
| 257 | * As a precaution, we currently completely disable hardware I/O | ||
| 258 | * coherency, until enough testing is done with automatic I/O | ||
| 259 | * synchronization barriers to validate that it is a proper solution. | ||
| 260 | */ | ||
| 249 | int coherency_available(void) | 261 | int coherency_available(void) |
| 250 | { | 262 | { |
| 251 | return coherency_type() != COHERENCY_FABRIC_TYPE_NONE; | 263 | return false; |
| 252 | } | 264 | } |
| 253 | 265 | ||
| 254 | int __init coherency_init(void) | 266 | 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/board-ape6evm.c b/arch/arm/mach-shmobile/board-ape6evm.c index 66f67816a844..444f22d370f0 100644 --- a/arch/arm/mach-shmobile/board-ape6evm.c +++ b/arch/arm/mach-shmobile/board-ape6evm.c | |||
| @@ -18,6 +18,8 @@ | |||
| 18 | #include <linux/gpio_keys.h> | 18 | #include <linux/gpio_keys.h> |
| 19 | #include <linux/input.h> | 19 | #include <linux/input.h> |
| 20 | #include <linux/interrupt.h> | 20 | #include <linux/interrupt.h> |
| 21 | #include <linux/irqchip.h> | ||
| 22 | #include <linux/irqchip/arm-gic.h> | ||
| 21 | #include <linux/kernel.h> | 23 | #include <linux/kernel.h> |
| 22 | #include <linux/mfd/tmio.h> | 24 | #include <linux/mfd/tmio.h> |
| 23 | #include <linux/mmc/host.h> | 25 | #include <linux/mmc/host.h> |
| @@ -273,6 +275,22 @@ static void __init ape6evm_add_standard_devices(void) | |||
| 273 | sizeof(ape6evm_leds_pdata)); | 275 | sizeof(ape6evm_leds_pdata)); |
| 274 | } | 276 | } |
| 275 | 277 | ||
| 278 | static void __init ape6evm_legacy_init_time(void) | ||
| 279 | { | ||
| 280 | /* Do not invoke DT-based timers via clocksource_of_init() */ | ||
| 281 | } | ||
| 282 | |||
| 283 | static void __init ape6evm_legacy_init_irq(void) | ||
| 284 | { | ||
| 285 | void __iomem *gic_dist_base = ioremap_nocache(0xf1001000, 0x1000); | ||
| 286 | void __iomem *gic_cpu_base = ioremap_nocache(0xf1002000, 0x1000); | ||
| 287 | |||
| 288 | gic_init(0, 29, gic_dist_base, gic_cpu_base); | ||
| 289 | |||
| 290 | /* Do not invoke DT-based interrupt code via irqchip_init() */ | ||
| 291 | } | ||
| 292 | |||
| 293 | |||
| 276 | static const char *ape6evm_boards_compat_dt[] __initdata = { | 294 | static const char *ape6evm_boards_compat_dt[] __initdata = { |
| 277 | "renesas,ape6evm", | 295 | "renesas,ape6evm", |
| 278 | NULL, | 296 | NULL, |
| @@ -280,7 +298,9 @@ static const char *ape6evm_boards_compat_dt[] __initdata = { | |||
| 280 | 298 | ||
| 281 | DT_MACHINE_START(APE6EVM_DT, "ape6evm") | 299 | DT_MACHINE_START(APE6EVM_DT, "ape6evm") |
| 282 | .init_early = shmobile_init_delay, | 300 | .init_early = shmobile_init_delay, |
| 301 | .init_irq = ape6evm_legacy_init_irq, | ||
| 283 | .init_machine = ape6evm_add_standard_devices, | 302 | .init_machine = ape6evm_add_standard_devices, |
| 284 | .init_late = shmobile_init_late, | 303 | .init_late = shmobile_init_late, |
| 285 | .dt_compat = ape6evm_boards_compat_dt, | 304 | .dt_compat = ape6evm_boards_compat_dt, |
| 305 | .init_time = ape6evm_legacy_init_time, | ||
| 286 | MACHINE_END | 306 | MACHINE_END |
diff --git a/arch/arm/mach-shmobile/board-lager.c b/arch/arm/mach-shmobile/board-lager.c index f8197eb6e566..65b128dd4072 100644 --- a/arch/arm/mach-shmobile/board-lager.c +++ b/arch/arm/mach-shmobile/board-lager.c | |||
| @@ -21,6 +21,8 @@ | |||
| 21 | #include <linux/input.h> | 21 | #include <linux/input.h> |
| 22 | #include <linux/interrupt.h> | 22 | #include <linux/interrupt.h> |
| 23 | #include <linux/irq.h> | 23 | #include <linux/irq.h> |
| 24 | #include <linux/irqchip.h> | ||
| 25 | #include <linux/irqchip/arm-gic.h> | ||
| 24 | #include <linux/kernel.h> | 26 | #include <linux/kernel.h> |
| 25 | #include <linux/leds.h> | 27 | #include <linux/leds.h> |
| 26 | #include <linux/mfd/tmio.h> | 28 | #include <linux/mfd/tmio.h> |
| @@ -811,6 +813,16 @@ static void __init lager_init(void) | |||
| 811 | lager_ksz8041_fixup); | 813 | lager_ksz8041_fixup); |
| 812 | } | 814 | } |
| 813 | 815 | ||
| 816 | static void __init lager_legacy_init_irq(void) | ||
| 817 | { | ||
| 818 | void __iomem *gic_dist_base = ioremap_nocache(0xf1001000, 0x1000); | ||
| 819 | void __iomem *gic_cpu_base = ioremap_nocache(0xf1002000, 0x1000); | ||
| 820 | |||
| 821 | gic_init(0, 29, gic_dist_base, gic_cpu_base); | ||
| 822 | |||
| 823 | /* Do not invoke DT-based interrupt code via irqchip_init() */ | ||
| 824 | } | ||
| 825 | |||
| 814 | static const char * const lager_boards_compat_dt[] __initconst = { | 826 | static const char * const lager_boards_compat_dt[] __initconst = { |
| 815 | "renesas,lager", | 827 | "renesas,lager", |
| 816 | NULL, | 828 | NULL, |
| @@ -819,6 +831,7 @@ static const char * const lager_boards_compat_dt[] __initconst = { | |||
| 819 | DT_MACHINE_START(LAGER_DT, "lager") | 831 | DT_MACHINE_START(LAGER_DT, "lager") |
| 820 | .smp = smp_ops(r8a7790_smp_ops), | 832 | .smp = smp_ops(r8a7790_smp_ops), |
| 821 | .init_early = shmobile_init_delay, | 833 | .init_early = shmobile_init_delay, |
| 834 | .init_irq = lager_legacy_init_irq, | ||
| 822 | .init_time = rcar_gen2_timer_init, | 835 | .init_time = rcar_gen2_timer_init, |
| 823 | .init_machine = lager_init, | 836 | .init_machine = lager_init, |
| 824 | .init_late = shmobile_init_late, | 837 | .init_late = shmobile_init_late, |
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-rcar-gen2.c b/arch/arm/mach-shmobile/setup-rcar-gen2.c index 3dd6edd9bd1d..cc9470dfb1ce 100644 --- a/arch/arm/mach-shmobile/setup-rcar-gen2.c +++ b/arch/arm/mach-shmobile/setup-rcar-gen2.c | |||
| @@ -133,7 +133,9 @@ void __init rcar_gen2_timer_init(void) | |||
| 133 | #ifdef CONFIG_COMMON_CLK | 133 | #ifdef CONFIG_COMMON_CLK |
| 134 | rcar_gen2_clocks_init(mode); | 134 | rcar_gen2_clocks_init(mode); |
| 135 | #endif | 135 | #endif |
| 136 | #ifdef CONFIG_ARCH_SHMOBILE_MULTI | ||
| 136 | clocksource_of_init(); | 137 | clocksource_of_init(); |
| 138 | #endif | ||
| 137 | } | 139 | } |
| 138 | 140 | ||
| 139 | struct memory_reserve_config { | 141 | struct memory_reserve_config { |
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/arm/mach-shmobile/timer.c b/arch/arm/mach-shmobile/timer.c index f1d027aa7a81..0edf2a6d2bbe 100644 --- a/arch/arm/mach-shmobile/timer.c +++ b/arch/arm/mach-shmobile/timer.c | |||
| @@ -70,6 +70,18 @@ void __init shmobile_init_delay(void) | |||
| 70 | if (!max_freq) | 70 | if (!max_freq) |
| 71 | return; | 71 | return; |
| 72 | 72 | ||
| 73 | #ifdef CONFIG_ARCH_SHMOBILE_LEGACY | ||
| 74 | /* Non-multiplatform r8a73a4 SoC cannot use arch timer due | ||
| 75 | * to GIC being initialized from C and arch timer via DT */ | ||
| 76 | if (of_machine_is_compatible("renesas,r8a73a4")) | ||
| 77 | has_arch_timer = false; | ||
| 78 | |||
| 79 | /* Non-multiplatform r8a7790 SoC cannot use arch timer due | ||
| 80 | * to GIC being initialized from C and arch timer via DT */ | ||
| 81 | if (of_machine_is_compatible("renesas,r8a7790")) | ||
| 82 | has_arch_timer = false; | ||
| 83 | #endif | ||
| 84 | |||
| 73 | if (!has_arch_timer || !IS_ENABLED(CONFIG_ARM_ARCH_TIMER)) { | 85 | if (!has_arch_timer || !IS_ENABLED(CONFIG_ARM_ARCH_TIMER)) { |
| 74 | if (is_a7_a8_a9) | 86 | if (is_a7_a8_a9) |
| 75 | shmobile_setup_delay_hz(max_freq, 1, 3); | 87 | shmobile_setup_delay_hz(max_freq, 1, 3); |
diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig index 03823e784f63..c43c71455566 100644 --- a/arch/arm/mm/Kconfig +++ b/arch/arm/mm/Kconfig | |||
| @@ -1012,6 +1012,7 @@ config ARCH_SUPPORTS_BIG_ENDIAN | |||
| 1012 | 1012 | ||
| 1013 | config ARM_KERNMEM_PERMS | 1013 | config ARM_KERNMEM_PERMS |
| 1014 | bool "Restrict kernel memory permissions" | 1014 | bool "Restrict kernel memory permissions" |
| 1015 | depends on MMU | ||
| 1015 | help | 1016 | help |
| 1016 | If this is set, kernel memory other than kernel text (and rodata) | 1017 | If this is set, kernel memory other than kernel text (and rodata) |
| 1017 | will be made non-executable. The tradeoff is that each region is | 1018 | will be made non-executable. The tradeoff is that each region is |
diff --git a/arch/arm/mm/context.c b/arch/arm/mm/context.c index 91892569710f..845769e41332 100644 --- a/arch/arm/mm/context.c +++ b/arch/arm/mm/context.c | |||
| @@ -144,21 +144,17 @@ static void flush_context(unsigned int cpu) | |||
| 144 | /* Update the list of reserved ASIDs and the ASID bitmap. */ | 144 | /* Update the list of reserved ASIDs and the ASID bitmap. */ |
| 145 | bitmap_clear(asid_map, 0, NUM_USER_ASIDS); | 145 | bitmap_clear(asid_map, 0, NUM_USER_ASIDS); |
| 146 | for_each_possible_cpu(i) { | 146 | for_each_possible_cpu(i) { |
| 147 | if (i == cpu) { | 147 | asid = atomic64_xchg(&per_cpu(active_asids, i), 0); |
| 148 | asid = 0; | 148 | /* |
| 149 | } else { | 149 | * If this CPU has already been through a |
| 150 | asid = atomic64_xchg(&per_cpu(active_asids, i), 0); | 150 | * rollover, but hasn't run another task in |
| 151 | /* | 151 | * the meantime, we must preserve its reserved |
| 152 | * If this CPU has already been through a | 152 | * ASID, as this is the only trace we have of |
| 153 | * rollover, but hasn't run another task in | 153 | * the process it is still running. |
| 154 | * the meantime, we must preserve its reserved | 154 | */ |
| 155 | * ASID, as this is the only trace we have of | 155 | if (asid == 0) |
| 156 | * the process it is still running. | 156 | asid = per_cpu(reserved_asids, i); |
| 157 | */ | 157 | __set_bit(asid & ~ASID_MASK, asid_map); |
| 158 | if (asid == 0) | ||
| 159 | asid = per_cpu(reserved_asids, i); | ||
| 160 | __set_bit(asid & ~ASID_MASK, asid_map); | ||
| 161 | } | ||
| 162 | per_cpu(reserved_asids, i) = asid; | 158 | per_cpu(reserved_asids, i) = asid; |
| 163 | } | 159 | } |
| 164 | 160 | ||
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 7864797609b3..903dba064a03 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c | |||
| @@ -1940,13 +1940,32 @@ void arm_iommu_release_mapping(struct dma_iommu_mapping *mapping) | |||
| 1940 | } | 1940 | } |
| 1941 | EXPORT_SYMBOL_GPL(arm_iommu_release_mapping); | 1941 | EXPORT_SYMBOL_GPL(arm_iommu_release_mapping); |
| 1942 | 1942 | ||
| 1943 | static int __arm_iommu_attach_device(struct device *dev, | ||
| 1944 | struct dma_iommu_mapping *mapping) | ||
| 1945 | { | ||
| 1946 | int err; | ||
| 1947 | |||
| 1948 | err = iommu_attach_device(mapping->domain, dev); | ||
| 1949 | if (err) | ||
| 1950 | return err; | ||
| 1951 | |||
| 1952 | kref_get(&mapping->kref); | ||
| 1953 | dev->archdata.mapping = mapping; | ||
| 1954 | |||
| 1955 | pr_debug("Attached IOMMU controller to %s device.\n", dev_name(dev)); | ||
| 1956 | return 0; | ||
| 1957 | } | ||
| 1958 | |||
| 1943 | /** | 1959 | /** |
| 1944 | * arm_iommu_attach_device | 1960 | * arm_iommu_attach_device |
| 1945 | * @dev: valid struct device pointer | 1961 | * @dev: valid struct device pointer |
| 1946 | * @mapping: io address space mapping structure (returned from | 1962 | * @mapping: io address space mapping structure (returned from |
| 1947 | * arm_iommu_create_mapping) | 1963 | * arm_iommu_create_mapping) |
| 1948 | * | 1964 | * |
| 1949 | * Attaches specified io address space mapping to the provided device, | 1965 | * Attaches specified io address space mapping to the provided device. |
| 1966 | * This replaces the dma operations (dma_map_ops pointer) with the | ||
| 1967 | * IOMMU aware version. | ||
| 1968 | * | ||
| 1950 | * More than one client might be attached to the same io address space | 1969 | * More than one client might be attached to the same io address space |
| 1951 | * mapping. | 1970 | * mapping. |
| 1952 | */ | 1971 | */ |
| @@ -1955,25 +1974,16 @@ int arm_iommu_attach_device(struct device *dev, | |||
| 1955 | { | 1974 | { |
| 1956 | int err; | 1975 | int err; |
| 1957 | 1976 | ||
| 1958 | err = iommu_attach_device(mapping->domain, dev); | 1977 | err = __arm_iommu_attach_device(dev, mapping); |
| 1959 | if (err) | 1978 | if (err) |
| 1960 | return err; | 1979 | return err; |
| 1961 | 1980 | ||
| 1962 | kref_get(&mapping->kref); | 1981 | set_dma_ops(dev, &iommu_ops); |
| 1963 | dev->archdata.mapping = mapping; | ||
| 1964 | |||
| 1965 | pr_debug("Attached IOMMU controller to %s device.\n", dev_name(dev)); | ||
| 1966 | return 0; | 1982 | return 0; |
| 1967 | } | 1983 | } |
| 1968 | EXPORT_SYMBOL_GPL(arm_iommu_attach_device); | 1984 | EXPORT_SYMBOL_GPL(arm_iommu_attach_device); |
| 1969 | 1985 | ||
| 1970 | /** | 1986 | static void __arm_iommu_detach_device(struct device *dev) |
| 1971 | * arm_iommu_detach_device | ||
| 1972 | * @dev: valid struct device pointer | ||
| 1973 | * | ||
| 1974 | * Detaches the provided device from a previously attached map. | ||
| 1975 | */ | ||
| 1976 | void arm_iommu_detach_device(struct device *dev) | ||
| 1977 | { | 1987 | { |
| 1978 | struct dma_iommu_mapping *mapping; | 1988 | struct dma_iommu_mapping *mapping; |
| 1979 | 1989 | ||
| @@ -1989,6 +1999,19 @@ void arm_iommu_detach_device(struct device *dev) | |||
| 1989 | 1999 | ||
| 1990 | pr_debug("Detached IOMMU controller from %s device.\n", dev_name(dev)); | 2000 | pr_debug("Detached IOMMU controller from %s device.\n", dev_name(dev)); |
| 1991 | } | 2001 | } |
| 2002 | |||
| 2003 | /** | ||
| 2004 | * arm_iommu_detach_device | ||
| 2005 | * @dev: valid struct device pointer | ||
| 2006 | * | ||
| 2007 | * Detaches the provided device from a previously attached map. | ||
| 2008 | * This voids the dma operations (dma_map_ops pointer) | ||
| 2009 | */ | ||
| 2010 | void arm_iommu_detach_device(struct device *dev) | ||
| 2011 | { | ||
| 2012 | __arm_iommu_detach_device(dev); | ||
| 2013 | set_dma_ops(dev, NULL); | ||
| 2014 | } | ||
| 1992 | EXPORT_SYMBOL_GPL(arm_iommu_detach_device); | 2015 | EXPORT_SYMBOL_GPL(arm_iommu_detach_device); |
| 1993 | 2016 | ||
| 1994 | static struct dma_map_ops *arm_get_iommu_dma_map_ops(bool coherent) | 2017 | static struct dma_map_ops *arm_get_iommu_dma_map_ops(bool coherent) |
| @@ -2011,7 +2034,7 @@ static bool arm_setup_iommu_dma_ops(struct device *dev, u64 dma_base, u64 size, | |||
| 2011 | return false; | 2034 | return false; |
| 2012 | } | 2035 | } |
| 2013 | 2036 | ||
| 2014 | if (arm_iommu_attach_device(dev, mapping)) { | 2037 | if (__arm_iommu_attach_device(dev, mapping)) { |
| 2015 | pr_warn("Failed to attached device %s to IOMMU_mapping\n", | 2038 | pr_warn("Failed to attached device %s to IOMMU_mapping\n", |
| 2016 | dev_name(dev)); | 2039 | dev_name(dev)); |
| 2017 | arm_iommu_release_mapping(mapping); | 2040 | arm_iommu_release_mapping(mapping); |
| @@ -2025,7 +2048,10 @@ static void arm_teardown_iommu_dma_ops(struct device *dev) | |||
| 2025 | { | 2048 | { |
| 2026 | struct dma_iommu_mapping *mapping = dev->archdata.mapping; | 2049 | struct dma_iommu_mapping *mapping = dev->archdata.mapping; |
| 2027 | 2050 | ||
| 2028 | arm_iommu_detach_device(dev); | 2051 | if (!mapping) |
| 2052 | return; | ||
| 2053 | |||
| 2054 | __arm_iommu_detach_device(dev); | ||
| 2029 | arm_iommu_release_mapping(mapping); | 2055 | arm_iommu_release_mapping(mapping); |
| 2030 | } | 2056 | } |
| 2031 | 2057 | ||
diff --git a/arch/arm/mm/dump.c b/arch/arm/mm/dump.c index 59424937e52b..9fe8e241335c 100644 --- a/arch/arm/mm/dump.c +++ b/arch/arm/mm/dump.c | |||
| @@ -220,9 +220,6 @@ static void note_page(struct pg_state *st, unsigned long addr, unsigned level, u | |||
| 220 | static const char units[] = "KMGTPE"; | 220 | static const char units[] = "KMGTPE"; |
| 221 | u64 prot = val & pg_level[level].mask; | 221 | u64 prot = val & pg_level[level].mask; |
| 222 | 222 | ||
| 223 | if (addr < USER_PGTABLES_CEILING) | ||
| 224 | return; | ||
| 225 | |||
| 226 | if (!st->level) { | 223 | if (!st->level) { |
| 227 | st->level = level; | 224 | st->level = level; |
| 228 | st->current_prot = prot; | 225 | st->current_prot = prot; |
| @@ -308,15 +305,13 @@ static void walk_pgd(struct seq_file *m) | |||
| 308 | pgd_t *pgd = swapper_pg_dir; | 305 | pgd_t *pgd = swapper_pg_dir; |
| 309 | struct pg_state st; | 306 | struct pg_state st; |
| 310 | unsigned long addr; | 307 | unsigned long addr; |
| 311 | unsigned i, pgdoff = USER_PGTABLES_CEILING / PGDIR_SIZE; | 308 | unsigned i; |
| 312 | 309 | ||
| 313 | memset(&st, 0, sizeof(st)); | 310 | memset(&st, 0, sizeof(st)); |
| 314 | st.seq = m; | 311 | st.seq = m; |
| 315 | st.marker = address_markers; | 312 | st.marker = address_markers; |
| 316 | 313 | ||
| 317 | pgd += pgdoff; | 314 | for (i = 0; i < PTRS_PER_PGD; i++, pgd++) { |
| 318 | |||
| 319 | for (i = pgdoff; i < PTRS_PER_PGD; i++, pgd++) { | ||
| 320 | addr = i * PGDIR_SIZE; | 315 | addr = i * PGDIR_SIZE; |
| 321 | if (!pgd_none(*pgd)) { | 316 | if (!pgd_none(*pgd)) { |
| 322 | walk_pud(&st, pgd, addr); | 317 | walk_pud(&st, pgd, addr); |
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index 98ad9c79ea0e..2495c8cb47ba 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c | |||
| @@ -658,8 +658,8 @@ static struct section_perm ro_perms[] = { | |||
| 658 | .start = (unsigned long)_stext, | 658 | .start = (unsigned long)_stext, |
| 659 | .end = (unsigned long)__init_begin, | 659 | .end = (unsigned long)__init_begin, |
| 660 | #ifdef CONFIG_ARM_LPAE | 660 | #ifdef CONFIG_ARM_LPAE |
| 661 | .mask = ~PMD_SECT_RDONLY, | 661 | .mask = ~L_PMD_SECT_RDONLY, |
| 662 | .prot = PMD_SECT_RDONLY, | 662 | .prot = L_PMD_SECT_RDONLY, |
| 663 | #else | 663 | #else |
| 664 | .mask = ~(PMD_SECT_APX | PMD_SECT_AP_WRITE), | 664 | .mask = ~(PMD_SECT_APX | PMD_SECT_AP_WRITE), |
| 665 | .prot = PMD_SECT_APX | PMD_SECT_AP_WRITE, | 665 | .prot = PMD_SECT_APX | PMD_SECT_AP_WRITE, |
diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index cda7c40999b6..4e6ef896c619 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c | |||
| @@ -1329,8 +1329,8 @@ static void __init kmap_init(void) | |||
| 1329 | static void __init map_lowmem(void) | 1329 | static void __init map_lowmem(void) |
| 1330 | { | 1330 | { |
| 1331 | struct memblock_region *reg; | 1331 | struct memblock_region *reg; |
| 1332 | unsigned long kernel_x_start = round_down(__pa(_stext), SECTION_SIZE); | 1332 | phys_addr_t kernel_x_start = round_down(__pa(_stext), SECTION_SIZE); |
| 1333 | unsigned long kernel_x_end = round_up(__pa(__init_end), SECTION_SIZE); | 1333 | phys_addr_t kernel_x_end = round_up(__pa(__init_end), SECTION_SIZE); |
| 1334 | 1334 | ||
| 1335 | /* Map all the lowmem memory banks. */ | 1335 | /* Map all the lowmem memory banks. */ |
| 1336 | for_each_memblock(memory, reg) { | 1336 | for_each_memblock(memory, reg) { |
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/arch_timer.h b/arch/arm64/include/asm/arch_timer.h index b1fa4e614718..fbe0ca31a99c 100644 --- a/arch/arm64/include/asm/arch_timer.h +++ b/arch/arm64/include/asm/arch_timer.h | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | 21 | ||
| 22 | #include <asm/barrier.h> | 22 | #include <asm/barrier.h> |
| 23 | 23 | ||
| 24 | #include <linux/bug.h> | ||
| 24 | #include <linux/init.h> | 25 | #include <linux/init.h> |
| 25 | #include <linux/types.h> | 26 | #include <linux/types.h> |
| 26 | 27 | ||
diff --git a/arch/arm64/include/asm/cpu.h b/arch/arm64/include/asm/cpu.h index ace70682499b..8e797b2fcc01 100644 --- a/arch/arm64/include/asm/cpu.h +++ b/arch/arm64/include/asm/cpu.h | |||
| @@ -39,6 +39,7 @@ struct cpuinfo_arm64 { | |||
| 39 | u64 reg_id_aa64pfr0; | 39 | u64 reg_id_aa64pfr0; |
| 40 | u64 reg_id_aa64pfr1; | 40 | u64 reg_id_aa64pfr1; |
| 41 | 41 | ||
| 42 | u32 reg_id_dfr0; | ||
| 42 | u32 reg_id_isar0; | 43 | u32 reg_id_isar0; |
| 43 | u32 reg_id_isar1; | 44 | u32 reg_id_isar1; |
| 44 | u32 reg_id_isar2; | 45 | u32 reg_id_isar2; |
| @@ -51,6 +52,10 @@ struct cpuinfo_arm64 { | |||
| 51 | u32 reg_id_mmfr3; | 52 | u32 reg_id_mmfr3; |
| 52 | u32 reg_id_pfr0; | 53 | u32 reg_id_pfr0; |
| 53 | u32 reg_id_pfr1; | 54 | u32 reg_id_pfr1; |
| 55 | |||
| 56 | u32 reg_mvfr0; | ||
| 57 | u32 reg_mvfr1; | ||
| 58 | u32 reg_mvfr2; | ||
| 54 | }; | 59 | }; |
| 55 | 60 | ||
| 56 | DECLARE_PER_CPU(struct cpuinfo_arm64, cpu_data); | 61 | DECLARE_PER_CPU(struct cpuinfo_arm64, cpu_data); |
diff --git a/arch/arm64/include/asm/kvm_emulate.h b/arch/arm64/include/asm/kvm_emulate.h index 8127e45e2637..3cb4c856b10d 100644 --- a/arch/arm64/include/asm/kvm_emulate.h +++ b/arch/arm64/include/asm/kvm_emulate.h | |||
| @@ -41,6 +41,18 @@ void kvm_inject_pabt(struct kvm_vcpu *vcpu, unsigned long addr); | |||
| 41 | static inline void vcpu_reset_hcr(struct kvm_vcpu *vcpu) | 41 | static inline void vcpu_reset_hcr(struct kvm_vcpu *vcpu) |
| 42 | { | 42 | { |
| 43 | vcpu->arch.hcr_el2 = HCR_GUEST_FLAGS; | 43 | vcpu->arch.hcr_el2 = HCR_GUEST_FLAGS; |
| 44 | if (test_bit(KVM_ARM_VCPU_EL1_32BIT, vcpu->arch.features)) | ||
| 45 | vcpu->arch.hcr_el2 &= ~HCR_RW; | ||
| 46 | } | ||
| 47 | |||
| 48 | static inline unsigned long vcpu_get_hcr(struct kvm_vcpu *vcpu) | ||
| 49 | { | ||
| 50 | return vcpu->arch.hcr_el2; | ||
| 51 | } | ||
| 52 | |||
| 53 | static inline void vcpu_set_hcr(struct kvm_vcpu *vcpu, unsigned long hcr) | ||
| 54 | { | ||
| 55 | vcpu->arch.hcr_el2 = hcr; | ||
| 44 | } | 56 | } |
| 45 | 57 | ||
| 46 | static inline unsigned long *vcpu_pc(const struct kvm_vcpu *vcpu) | 58 | static inline unsigned long *vcpu_pc(const struct kvm_vcpu *vcpu) |
diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h index 0b7dfdb931df..acd101a9014d 100644 --- a/arch/arm64/include/asm/kvm_host.h +++ b/arch/arm64/include/asm/kvm_host.h | |||
| @@ -116,9 +116,6 @@ struct kvm_vcpu_arch { | |||
| 116 | * Anything that is not used directly from assembly code goes | 116 | * Anything that is not used directly from assembly code goes |
| 117 | * here. | 117 | * here. |
| 118 | */ | 118 | */ |
| 119 | /* dcache set/way operation pending */ | ||
| 120 | int last_pcpu; | ||
| 121 | cpumask_t require_dcache_flush; | ||
| 122 | 119 | ||
| 123 | /* Don't run the guest */ | 120 | /* Don't run the guest */ |
| 124 | bool pause; | 121 | bool pause; |
diff --git a/arch/arm64/include/asm/kvm_mmu.h b/arch/arm64/include/asm/kvm_mmu.h index 14a74f136272..adcf49547301 100644 --- a/arch/arm64/include/asm/kvm_mmu.h +++ b/arch/arm64/include/asm/kvm_mmu.h | |||
| @@ -243,24 +243,46 @@ static inline bool vcpu_has_cache_enabled(struct kvm_vcpu *vcpu) | |||
| 243 | return (vcpu_sys_reg(vcpu, SCTLR_EL1) & 0b101) == 0b101; | 243 | return (vcpu_sys_reg(vcpu, SCTLR_EL1) & 0b101) == 0b101; |
| 244 | } | 244 | } |
| 245 | 245 | ||
| 246 | static inline void coherent_cache_guest_page(struct kvm_vcpu *vcpu, hva_t hva, | 246 | static inline void __coherent_cache_guest_page(struct kvm_vcpu *vcpu, pfn_t pfn, |
| 247 | unsigned long size, | 247 | unsigned long size, |
| 248 | bool ipa_uncached) | 248 | bool ipa_uncached) |
| 249 | { | 249 | { |
| 250 | void *va = page_address(pfn_to_page(pfn)); | ||
| 251 | |||
| 250 | if (!vcpu_has_cache_enabled(vcpu) || ipa_uncached) | 252 | if (!vcpu_has_cache_enabled(vcpu) || ipa_uncached) |
| 251 | kvm_flush_dcache_to_poc((void *)hva, size); | 253 | kvm_flush_dcache_to_poc(va, size); |
| 252 | 254 | ||
| 253 | if (!icache_is_aliasing()) { /* PIPT */ | 255 | if (!icache_is_aliasing()) { /* PIPT */ |
| 254 | flush_icache_range(hva, hva + size); | 256 | flush_icache_range((unsigned long)va, |
| 257 | (unsigned long)va + size); | ||
| 255 | } else if (!icache_is_aivivt()) { /* non ASID-tagged VIVT */ | 258 | } else if (!icache_is_aivivt()) { /* non ASID-tagged VIVT */ |
| 256 | /* any kind of VIPT cache */ | 259 | /* any kind of VIPT cache */ |
| 257 | __flush_icache_all(); | 260 | __flush_icache_all(); |
| 258 | } | 261 | } |
| 259 | } | 262 | } |
| 260 | 263 | ||
| 264 | static inline void __kvm_flush_dcache_pte(pte_t pte) | ||
| 265 | { | ||
| 266 | struct page *page = pte_page(pte); | ||
| 267 | kvm_flush_dcache_to_poc(page_address(page), PAGE_SIZE); | ||
| 268 | } | ||
| 269 | |||
| 270 | static inline void __kvm_flush_dcache_pmd(pmd_t pmd) | ||
| 271 | { | ||
| 272 | struct page *page = pmd_page(pmd); | ||
| 273 | kvm_flush_dcache_to_poc(page_address(page), PMD_SIZE); | ||
| 274 | } | ||
| 275 | |||
| 276 | static inline void __kvm_flush_dcache_pud(pud_t pud) | ||
| 277 | { | ||
| 278 | struct page *page = pud_page(pud); | ||
| 279 | kvm_flush_dcache_to_poc(page_address(page), PUD_SIZE); | ||
| 280 | } | ||
| 281 | |||
| 261 | #define kvm_virt_to_phys(x) __virt_to_phys((unsigned long)(x)) | 282 | #define kvm_virt_to_phys(x) __virt_to_phys((unsigned long)(x)) |
| 262 | 283 | ||
| 263 | void stage2_flush_vm(struct kvm *kvm); | 284 | void kvm_set_way_flush(struct kvm_vcpu *vcpu); |
| 285 | void kvm_toggle_cache(struct kvm_vcpu *vcpu, bool was_enabled); | ||
| 264 | 286 | ||
| 265 | #endif /* __ASSEMBLY__ */ | 287 | #endif /* __ASSEMBLY__ */ |
| 266 | #endif /* __ARM64_KVM_MMU_H__ */ | 288 | #endif /* __ARM64_KVM_MMU_H__ */ |
diff --git a/arch/arm64/include/asm/processor.h b/arch/arm64/include/asm/processor.h index 286b1bec547c..f9be30ea1cbd 100644 --- a/arch/arm64/include/asm/processor.h +++ b/arch/arm64/include/asm/processor.h | |||
| @@ -31,6 +31,7 @@ | |||
| 31 | 31 | ||
| 32 | #include <asm/fpsimd.h> | 32 | #include <asm/fpsimd.h> |
| 33 | #include <asm/hw_breakpoint.h> | 33 | #include <asm/hw_breakpoint.h> |
| 34 | #include <asm/pgtable-hwdef.h> | ||
| 34 | #include <asm/ptrace.h> | 35 | #include <asm/ptrace.h> |
| 35 | #include <asm/types.h> | 36 | #include <asm/types.h> |
| 36 | 37 | ||
| @@ -123,9 +124,6 @@ struct task_struct; | |||
| 123 | /* Free all resources held by a thread. */ | 124 | /* Free all resources held by a thread. */ |
| 124 | extern void release_thread(struct task_struct *); | 125 | extern void release_thread(struct task_struct *); |
| 125 | 126 | ||
| 126 | /* Prepare to copy thread state - unlazy all lazy status */ | ||
| 127 | #define prepare_to_copy(tsk) do { } while (0) | ||
| 128 | |||
| 129 | unsigned long get_wchan(struct task_struct *p); | 127 | unsigned long get_wchan(struct task_struct *p); |
| 130 | 128 | ||
| 131 | #define cpu_relax() barrier() | 129 | #define cpu_relax() barrier() |
diff --git a/arch/arm64/include/asm/unistd.h b/arch/arm64/include/asm/unistd.h index 49c9aefd24a5..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 386 | 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/kernel/cpuinfo.c b/arch/arm64/kernel/cpuinfo.c index 57b641747534..07d435cf2eea 100644 --- a/arch/arm64/kernel/cpuinfo.c +++ b/arch/arm64/kernel/cpuinfo.c | |||
| @@ -147,6 +147,7 @@ static void cpuinfo_sanity_check(struct cpuinfo_arm64 *cur) | |||
| 147 | * If we have AArch32, we care about 32-bit features for compat. These | 147 | * If we have AArch32, we care about 32-bit features for compat. These |
| 148 | * registers should be RES0 otherwise. | 148 | * registers should be RES0 otherwise. |
| 149 | */ | 149 | */ |
| 150 | diff |= CHECK(id_dfr0, boot, cur, cpu); | ||
| 150 | diff |= CHECK(id_isar0, boot, cur, cpu); | 151 | diff |= CHECK(id_isar0, boot, cur, cpu); |
| 151 | diff |= CHECK(id_isar1, boot, cur, cpu); | 152 | diff |= CHECK(id_isar1, boot, cur, cpu); |
| 152 | diff |= CHECK(id_isar2, boot, cur, cpu); | 153 | diff |= CHECK(id_isar2, boot, cur, cpu); |
| @@ -165,6 +166,10 @@ static void cpuinfo_sanity_check(struct cpuinfo_arm64 *cur) | |||
| 165 | diff |= CHECK(id_pfr0, boot, cur, cpu); | 166 | diff |= CHECK(id_pfr0, boot, cur, cpu); |
| 166 | diff |= CHECK(id_pfr1, boot, cur, cpu); | 167 | diff |= CHECK(id_pfr1, boot, cur, cpu); |
| 167 | 168 | ||
| 169 | diff |= CHECK(mvfr0, boot, cur, cpu); | ||
| 170 | diff |= CHECK(mvfr1, boot, cur, cpu); | ||
| 171 | diff |= CHECK(mvfr2, boot, cur, cpu); | ||
| 172 | |||
| 168 | /* | 173 | /* |
| 169 | * Mismatched CPU features are a recipe for disaster. Don't even | 174 | * Mismatched CPU features are a recipe for disaster. Don't even |
| 170 | * pretend to support them. | 175 | * pretend to support them. |
| @@ -189,6 +194,7 @@ static void __cpuinfo_store_cpu(struct cpuinfo_arm64 *info) | |||
| 189 | info->reg_id_aa64pfr0 = read_cpuid(ID_AA64PFR0_EL1); | 194 | info->reg_id_aa64pfr0 = read_cpuid(ID_AA64PFR0_EL1); |
| 190 | info->reg_id_aa64pfr1 = read_cpuid(ID_AA64PFR1_EL1); | 195 | info->reg_id_aa64pfr1 = read_cpuid(ID_AA64PFR1_EL1); |
| 191 | 196 | ||
| 197 | info->reg_id_dfr0 = read_cpuid(ID_DFR0_EL1); | ||
| 192 | info->reg_id_isar0 = read_cpuid(ID_ISAR0_EL1); | 198 | info->reg_id_isar0 = read_cpuid(ID_ISAR0_EL1); |
| 193 | info->reg_id_isar1 = read_cpuid(ID_ISAR1_EL1); | 199 | info->reg_id_isar1 = read_cpuid(ID_ISAR1_EL1); |
| 194 | info->reg_id_isar2 = read_cpuid(ID_ISAR2_EL1); | 200 | info->reg_id_isar2 = read_cpuid(ID_ISAR2_EL1); |
| @@ -202,6 +208,10 @@ static void __cpuinfo_store_cpu(struct cpuinfo_arm64 *info) | |||
| 202 | info->reg_id_pfr0 = read_cpuid(ID_PFR0_EL1); | 208 | info->reg_id_pfr0 = read_cpuid(ID_PFR0_EL1); |
| 203 | info->reg_id_pfr1 = read_cpuid(ID_PFR1_EL1); | 209 | info->reg_id_pfr1 = read_cpuid(ID_PFR1_EL1); |
| 204 | 210 | ||
| 211 | info->reg_mvfr0 = read_cpuid(MVFR0_EL1); | ||
| 212 | info->reg_mvfr1 = read_cpuid(MVFR1_EL1); | ||
| 213 | info->reg_mvfr2 = read_cpuid(MVFR2_EL1); | ||
| 214 | |||
| 205 | cpuinfo_detect_icache_policy(info); | 215 | cpuinfo_detect_icache_policy(info); |
| 206 | 216 | ||
| 207 | check_local_cpu_errata(); | 217 | check_local_cpu_errata(); |
diff --git a/arch/arm64/kernel/efi.c b/arch/arm64/kernel/efi.c index 6fac253bc783..2bb4347d0edf 100644 --- a/arch/arm64/kernel/efi.c +++ b/arch/arm64/kernel/efi.c | |||
| @@ -326,6 +326,7 @@ void __init efi_idmap_init(void) | |||
| 326 | 326 | ||
| 327 | /* boot time idmap_pg_dir is incomplete, so fill in missing parts */ | 327 | /* boot time idmap_pg_dir is incomplete, so fill in missing parts */ |
| 328 | efi_setup_idmap(); | 328 | efi_setup_idmap(); |
| 329 | early_memunmap(memmap.map, memmap.map_end - memmap.map); | ||
| 329 | } | 330 | } |
| 330 | 331 | ||
| 331 | static int __init remap_region(efi_memory_desc_t *md, void **new) | 332 | static int __init remap_region(efi_memory_desc_t *md, void **new) |
| @@ -380,7 +381,6 @@ static int __init arm64_enter_virtual_mode(void) | |||
| 380 | } | 381 | } |
| 381 | 382 | ||
| 382 | mapsize = memmap.map_end - memmap.map; | 383 | mapsize = memmap.map_end - memmap.map; |
| 383 | early_memunmap(memmap.map, mapsize); | ||
| 384 | 384 | ||
| 385 | if (efi_runtime_disabled()) { | 385 | if (efi_runtime_disabled()) { |
| 386 | pr_info("EFI runtime services will be disabled.\n"); | 386 | pr_info("EFI runtime services will be disabled.\n"); |
diff --git a/arch/arm64/kernel/module.c b/arch/arm64/kernel/module.c index fd027b101de5..9b6f71db2709 100644 --- a/arch/arm64/kernel/module.c +++ b/arch/arm64/kernel/module.c | |||
| @@ -25,6 +25,7 @@ | |||
| 25 | #include <linux/mm.h> | 25 | #include <linux/mm.h> |
| 26 | #include <linux/moduleloader.h> | 26 | #include <linux/moduleloader.h> |
| 27 | #include <linux/vmalloc.h> | 27 | #include <linux/vmalloc.h> |
| 28 | #include <asm/alternative.h> | ||
| 28 | #include <asm/insn.h> | 29 | #include <asm/insn.h> |
| 29 | #include <asm/sections.h> | 30 | #include <asm/sections.h> |
| 30 | 31 | ||
diff --git a/arch/arm64/kernel/perf_regs.c b/arch/arm64/kernel/perf_regs.c index 6762ad705587..3f62b35fb6f1 100644 --- a/arch/arm64/kernel/perf_regs.c +++ b/arch/arm64/kernel/perf_regs.c | |||
| @@ -50,3 +50,11 @@ u64 perf_reg_abi(struct task_struct *task) | |||
| 50 | else | 50 | else |
| 51 | return PERF_SAMPLE_REGS_ABI_64; | 51 | return PERF_SAMPLE_REGS_ABI_64; |
| 52 | } | 52 | } |
| 53 | |||
| 54 | void perf_get_regs_user(struct perf_regs *regs_user, | ||
| 55 | struct pt_regs *regs, | ||
| 56 | struct pt_regs *regs_user_copy) | ||
| 57 | { | ||
| 58 | regs_user->regs = task_pt_regs(current); | ||
| 59 | regs_user->abi = perf_reg_abi(current); | ||
| 60 | } | ||
diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c index b80991166754..20fe2932ad0c 100644 --- a/arch/arm64/kernel/setup.c +++ b/arch/arm64/kernel/setup.c | |||
| @@ -402,6 +402,7 @@ void __init setup_arch(char **cmdline_p) | |||
| 402 | request_standard_resources(); | 402 | request_standard_resources(); |
| 403 | 403 | ||
| 404 | efi_idmap_init(); | 404 | efi_idmap_init(); |
| 405 | early_ioremap_reset(); | ||
| 405 | 406 | ||
| 406 | unflatten_device_tree(); | 407 | unflatten_device_tree(); |
| 407 | 408 | ||
diff --git a/arch/arm64/kernel/smp_spin_table.c b/arch/arm64/kernel/smp_spin_table.c index 4f93c67e63de..14944e5b28da 100644 --- a/arch/arm64/kernel/smp_spin_table.c +++ b/arch/arm64/kernel/smp_spin_table.c | |||
| @@ -25,6 +25,7 @@ | |||
| 25 | #include <asm/cacheflush.h> | 25 | #include <asm/cacheflush.h> |
| 26 | #include <asm/cpu_ops.h> | 26 | #include <asm/cpu_ops.h> |
| 27 | #include <asm/cputype.h> | 27 | #include <asm/cputype.h> |
| 28 | #include <asm/io.h> | ||
| 28 | #include <asm/smp_plat.h> | 29 | #include <asm/smp_plat.h> |
| 29 | 30 | ||
| 30 | extern void secondary_holding_pen(void); | 31 | extern void secondary_holding_pen(void); |
diff --git a/arch/arm64/kvm/hyp.S b/arch/arm64/kvm/hyp.S index fbe909fb0a1a..c3ca89c27c6b 100644 --- a/arch/arm64/kvm/hyp.S +++ b/arch/arm64/kvm/hyp.S | |||
| @@ -1014,6 +1014,7 @@ ENTRY(__kvm_tlb_flush_vmid_ipa) | |||
| 1014 | * Instead, we invalidate Stage-2 for this IPA, and the | 1014 | * Instead, we invalidate Stage-2 for this IPA, and the |
| 1015 | * whole of Stage-1. Weep... | 1015 | * whole of Stage-1. Weep... |
| 1016 | */ | 1016 | */ |
| 1017 | lsr x1, x1, #12 | ||
| 1017 | tlbi ipas2e1is, x1 | 1018 | tlbi ipas2e1is, x1 |
| 1018 | /* | 1019 | /* |
| 1019 | * We have to ensure completion of the invalidation at Stage-2, | 1020 | * We have to ensure completion of the invalidation at Stage-2, |
diff --git a/arch/arm64/kvm/reset.c b/arch/arm64/kvm/reset.c index 70a7816535cd..0b4326578985 100644 --- a/arch/arm64/kvm/reset.c +++ b/arch/arm64/kvm/reset.c | |||
| @@ -90,7 +90,6 @@ int kvm_reset_vcpu(struct kvm_vcpu *vcpu) | |||
| 90 | if (!cpu_has_32bit_el1()) | 90 | if (!cpu_has_32bit_el1()) |
| 91 | return -EINVAL; | 91 | return -EINVAL; |
| 92 | cpu_reset = &default_regs_reset32; | 92 | cpu_reset = &default_regs_reset32; |
| 93 | vcpu->arch.hcr_el2 &= ~HCR_RW; | ||
| 94 | } else { | 93 | } else { |
| 95 | cpu_reset = &default_regs_reset; | 94 | cpu_reset = &default_regs_reset; |
| 96 | } | 95 | } |
diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c index 3d7c2df89946..f31e8bb2bc5b 100644 --- a/arch/arm64/kvm/sys_regs.c +++ b/arch/arm64/kvm/sys_regs.c | |||
| @@ -69,68 +69,31 @@ static u32 get_ccsidr(u32 csselr) | |||
| 69 | return ccsidr; | 69 | return ccsidr; |
| 70 | } | 70 | } |
| 71 | 71 | ||
| 72 | static void do_dc_cisw(u32 val) | 72 | /* |
| 73 | { | 73 | * See note at ARMv7 ARM B1.14.4 (TL;DR: S/W ops are not easily virtualized). |
| 74 | asm volatile("dc cisw, %x0" : : "r" (val)); | 74 | */ |
| 75 | dsb(ish); | ||
| 76 | } | ||
| 77 | |||
| 78 | static void do_dc_csw(u32 val) | ||
| 79 | { | ||
| 80 | asm volatile("dc csw, %x0" : : "r" (val)); | ||
| 81 | dsb(ish); | ||
| 82 | } | ||
| 83 | |||
| 84 | /* See note at ARM ARM B1.14.4 */ | ||
| 85 | static bool access_dcsw(struct kvm_vcpu *vcpu, | 75 | static bool access_dcsw(struct kvm_vcpu *vcpu, |
| 86 | const struct sys_reg_params *p, | 76 | const struct sys_reg_params *p, |
| 87 | const struct sys_reg_desc *r) | 77 | const struct sys_reg_desc *r) |
| 88 | { | 78 | { |
| 89 | unsigned long val; | ||
| 90 | int cpu; | ||
| 91 | |||
| 92 | if (!p->is_write) | 79 | if (!p->is_write) |
| 93 | return read_from_write_only(vcpu, p); | 80 | return read_from_write_only(vcpu, p); |
| 94 | 81 | ||
| 95 | cpu = get_cpu(); | 82 | kvm_set_way_flush(vcpu); |
| 96 | |||
| 97 | cpumask_setall(&vcpu->arch.require_dcache_flush); | ||
| 98 | cpumask_clear_cpu(cpu, &vcpu->arch.require_dcache_flush); | ||
| 99 | |||
| 100 | /* If we were already preempted, take the long way around */ | ||
| 101 | if (cpu != vcpu->arch.last_pcpu) { | ||
| 102 | flush_cache_all(); | ||
| 103 | goto done; | ||
| 104 | } | ||
| 105 | |||
| 106 | val = *vcpu_reg(vcpu, p->Rt); | ||
| 107 | |||
| 108 | switch (p->CRm) { | ||
| 109 | case 6: /* Upgrade DCISW to DCCISW, as per HCR.SWIO */ | ||
| 110 | case 14: /* DCCISW */ | ||
| 111 | do_dc_cisw(val); | ||
| 112 | break; | ||
| 113 | |||
| 114 | case 10: /* DCCSW */ | ||
| 115 | do_dc_csw(val); | ||
| 116 | break; | ||
| 117 | } | ||
| 118 | |||
| 119 | done: | ||
| 120 | put_cpu(); | ||
| 121 | |||
| 122 | return true; | 83 | return true; |
| 123 | } | 84 | } |
| 124 | 85 | ||
| 125 | /* | 86 | /* |
| 126 | * Generic accessor for VM registers. Only called as long as HCR_TVM | 87 | * Generic accessor for VM registers. Only called as long as HCR_TVM |
| 127 | * is set. | 88 | * is set. If the guest enables the MMU, we stop trapping the VM |
| 89 | * sys_regs and leave it in complete control of the caches. | ||
| 128 | */ | 90 | */ |
| 129 | static bool access_vm_reg(struct kvm_vcpu *vcpu, | 91 | static bool access_vm_reg(struct kvm_vcpu *vcpu, |
| 130 | const struct sys_reg_params *p, | 92 | const struct sys_reg_params *p, |
| 131 | const struct sys_reg_desc *r) | 93 | const struct sys_reg_desc *r) |
| 132 | { | 94 | { |
| 133 | unsigned long val; | 95 | unsigned long val; |
| 96 | bool was_enabled = vcpu_has_cache_enabled(vcpu); | ||
| 134 | 97 | ||
| 135 | BUG_ON(!p->is_write); | 98 | BUG_ON(!p->is_write); |
| 136 | 99 | ||
| @@ -143,25 +106,7 @@ static bool access_vm_reg(struct kvm_vcpu *vcpu, | |||
| 143 | vcpu_cp15_64_low(vcpu, r->reg) = val & 0xffffffffUL; | 106 | vcpu_cp15_64_low(vcpu, r->reg) = val & 0xffffffffUL; |
| 144 | } | 107 | } |
| 145 | 108 | ||
| 146 | return true; | 109 | kvm_toggle_cache(vcpu, was_enabled); |
| 147 | } | ||
| 148 | |||
| 149 | /* | ||
| 150 | * SCTLR_EL1 accessor. Only called as long as HCR_TVM is set. If the | ||
| 151 | * guest enables the MMU, we stop trapping the VM sys_regs and leave | ||
| 152 | * it in complete control of the caches. | ||
| 153 | */ | ||
| 154 | static bool access_sctlr(struct kvm_vcpu *vcpu, | ||
| 155 | const struct sys_reg_params *p, | ||
| 156 | const struct sys_reg_desc *r) | ||
| 157 | { | ||
| 158 | access_vm_reg(vcpu, p, r); | ||
| 159 | |||
| 160 | if (vcpu_has_cache_enabled(vcpu)) { /* MMU+Caches enabled? */ | ||
| 161 | vcpu->arch.hcr_el2 &= ~HCR_TVM; | ||
| 162 | stage2_flush_vm(vcpu->kvm); | ||
| 163 | } | ||
| 164 | |||
| 165 | return true; | 110 | return true; |
| 166 | } | 111 | } |
| 167 | 112 | ||
| @@ -377,7 +322,7 @@ static const struct sys_reg_desc sys_reg_descs[] = { | |||
| 377 | NULL, reset_mpidr, MPIDR_EL1 }, | 322 | NULL, reset_mpidr, MPIDR_EL1 }, |
| 378 | /* SCTLR_EL1 */ | 323 | /* SCTLR_EL1 */ |
| 379 | { Op0(0b11), Op1(0b000), CRn(0b0001), CRm(0b0000), Op2(0b000), | 324 | { Op0(0b11), Op1(0b000), CRn(0b0001), CRm(0b0000), Op2(0b000), |
| 380 | access_sctlr, reset_val, SCTLR_EL1, 0x00C50078 }, | 325 | access_vm_reg, reset_val, SCTLR_EL1, 0x00C50078 }, |
| 381 | /* CPACR_EL1 */ | 326 | /* CPACR_EL1 */ |
| 382 | { Op0(0b11), Op1(0b000), CRn(0b0001), CRm(0b0000), Op2(0b010), | 327 | { Op0(0b11), Op1(0b000), CRn(0b0001), CRm(0b0000), Op2(0b010), |
| 383 | NULL, reset_val, CPACR_EL1, 0 }, | 328 | NULL, reset_val, CPACR_EL1, 0 }, |
| @@ -657,7 +602,7 @@ static const struct sys_reg_desc cp14_64_regs[] = { | |||
| 657 | * register). | 602 | * register). |
| 658 | */ | 603 | */ |
| 659 | static const struct sys_reg_desc cp15_regs[] = { | 604 | static const struct sys_reg_desc cp15_regs[] = { |
| 660 | { Op1( 0), CRn( 1), CRm( 0), Op2( 0), access_sctlr, NULL, c1_SCTLR }, | 605 | { Op1( 0), CRn( 1), CRm( 0), Op2( 0), access_vm_reg, NULL, c1_SCTLR }, |
| 661 | { Op1( 0), CRn( 2), CRm( 0), Op2( 0), access_vm_reg, NULL, c2_TTBR0 }, | 606 | { Op1( 0), CRn( 2), CRm( 0), Op2( 0), access_vm_reg, NULL, c2_TTBR0 }, |
| 662 | { Op1( 0), CRn( 2), CRm( 0), Op2( 1), access_vm_reg, NULL, c2_TTBR1 }, | 607 | { Op1( 0), CRn( 2), CRm( 0), Op2( 1), access_vm_reg, NULL, c2_TTBR1 }, |
| 663 | { Op1( 0), CRn( 2), CRm( 0), Op2( 2), access_vm_reg, NULL, c2_TTBCR }, | 608 | { Op1( 0), CRn( 2), CRm( 0), Op2( 2), access_vm_reg, NULL, c2_TTBCR }, |
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/avr32/mm/fault.c b/arch/avr32/mm/fault.c index 0eca93327195..d223a8b57c1e 100644 --- a/arch/avr32/mm/fault.c +++ b/arch/avr32/mm/fault.c | |||
| @@ -142,6 +142,8 @@ good_area: | |||
| 142 | if (unlikely(fault & VM_FAULT_ERROR)) { | 142 | if (unlikely(fault & VM_FAULT_ERROR)) { |
| 143 | if (fault & VM_FAULT_OOM) | 143 | if (fault & VM_FAULT_OOM) |
| 144 | goto out_of_memory; | 144 | goto out_of_memory; |
| 145 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 146 | goto bad_area; | ||
| 145 | else if (fault & VM_FAULT_SIGBUS) | 147 | else if (fault & VM_FAULT_SIGBUS) |
| 146 | goto do_sigbus; | 148 | goto do_sigbus; |
| 147 | BUG(); | 149 | BUG(); |
diff --git a/arch/blackfin/mach-bf533/boards/stamp.c b/arch/blackfin/mach-bf533/boards/stamp.c index 6f4bac969bf7..23eada79439c 100644 --- a/arch/blackfin/mach-bf533/boards/stamp.c +++ b/arch/blackfin/mach-bf533/boards/stamp.c | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | */ | 7 | */ |
| 8 | 8 | ||
| 9 | #include <linux/device.h> | 9 | #include <linux/device.h> |
| 10 | #include <linux/delay.h> | ||
| 10 | #include <linux/platform_device.h> | 11 | #include <linux/platform_device.h> |
| 11 | #include <linux/mtd/mtd.h> | 12 | #include <linux/mtd/mtd.h> |
| 12 | #include <linux/mtd/partitions.h> | 13 | #include <linux/mtd/partitions.h> |
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/cris/mm/fault.c b/arch/cris/mm/fault.c index 1790f22e71a2..2686a7aa8ec8 100644 --- a/arch/cris/mm/fault.c +++ b/arch/cris/mm/fault.c | |||
| @@ -176,6 +176,8 @@ retry: | |||
| 176 | if (unlikely(fault & VM_FAULT_ERROR)) { | 176 | if (unlikely(fault & VM_FAULT_ERROR)) { |
| 177 | if (fault & VM_FAULT_OOM) | 177 | if (fault & VM_FAULT_OOM) |
| 178 | goto out_of_memory; | 178 | goto out_of_memory; |
| 179 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 180 | goto bad_area; | ||
| 179 | else if (fault & VM_FAULT_SIGBUS) | 181 | else if (fault & VM_FAULT_SIGBUS) |
| 180 | goto do_sigbus; | 182 | goto do_sigbus; |
| 181 | BUG(); | 183 | BUG(); |
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/frv/mm/fault.c b/arch/frv/mm/fault.c index 9a66372fc7c7..ec4917ddf678 100644 --- a/arch/frv/mm/fault.c +++ b/arch/frv/mm/fault.c | |||
| @@ -168,6 +168,8 @@ asmlinkage void do_page_fault(int datammu, unsigned long esr0, unsigned long ear | |||
| 168 | if (unlikely(fault & VM_FAULT_ERROR)) { | 168 | if (unlikely(fault & VM_FAULT_ERROR)) { |
| 169 | if (fault & VM_FAULT_OOM) | 169 | if (fault & VM_FAULT_OOM) |
| 170 | goto out_of_memory; | 170 | goto out_of_memory; |
| 171 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 172 | goto bad_area; | ||
| 171 | else if (fault & VM_FAULT_SIGBUS) | 173 | else if (fault & VM_FAULT_SIGBUS) |
| 172 | goto do_sigbus; | 174 | goto do_sigbus; |
| 173 | BUG(); | 175 | BUG(); |
diff --git a/arch/ia64/kernel/acpi.c b/arch/ia64/kernel/acpi.c index 615ef81def49..e795cb848154 100644 --- a/arch/ia64/kernel/acpi.c +++ b/arch/ia64/kernel/acpi.c | |||
| @@ -893,13 +893,13 @@ static int _acpi_map_lsapic(acpi_handle handle, int physid, int *pcpu) | |||
| 893 | } | 893 | } |
| 894 | 894 | ||
| 895 | /* wrapper to silence section mismatch warning */ | 895 | /* wrapper to silence section mismatch warning */ |
| 896 | int __ref acpi_map_lsapic(acpi_handle handle, int physid, int *pcpu) | 896 | int __ref acpi_map_cpu(acpi_handle handle, int physid, int *pcpu) |
| 897 | { | 897 | { |
| 898 | return _acpi_map_lsapic(handle, physid, pcpu); | 898 | return _acpi_map_lsapic(handle, physid, pcpu); |
| 899 | } | 899 | } |
| 900 | EXPORT_SYMBOL(acpi_map_lsapic); | 900 | EXPORT_SYMBOL(acpi_map_cpu); |
| 901 | 901 | ||
| 902 | int acpi_unmap_lsapic(int cpu) | 902 | int acpi_unmap_cpu(int cpu) |
| 903 | { | 903 | { |
| 904 | ia64_cpu_to_sapicid[cpu] = -1; | 904 | ia64_cpu_to_sapicid[cpu] = -1; |
| 905 | set_cpu_present(cpu, false); | 905 | set_cpu_present(cpu, false); |
| @@ -910,8 +910,7 @@ int acpi_unmap_lsapic(int cpu) | |||
| 910 | 910 | ||
| 911 | return (0); | 911 | return (0); |
| 912 | } | 912 | } |
| 913 | 913 | EXPORT_SYMBOL(acpi_unmap_cpu); | |
| 914 | EXPORT_SYMBOL(acpi_unmap_lsapic); | ||
| 915 | #endif /* CONFIG_ACPI_HOTPLUG_CPU */ | 914 | #endif /* CONFIG_ACPI_HOTPLUG_CPU */ |
| 916 | 915 | ||
| 917 | #ifdef CONFIG_ACPI_NUMA | 916 | #ifdef CONFIG_ACPI_NUMA |
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/mm/fault.c b/arch/ia64/mm/fault.c index 7225dad87094..ba5ba7accd0d 100644 --- a/arch/ia64/mm/fault.c +++ b/arch/ia64/mm/fault.c | |||
| @@ -172,6 +172,8 @@ retry: | |||
| 172 | */ | 172 | */ |
| 173 | if (fault & VM_FAULT_OOM) { | 173 | if (fault & VM_FAULT_OOM) { |
| 174 | goto out_of_memory; | 174 | goto out_of_memory; |
| 175 | } else if (fault & VM_FAULT_SIGSEGV) { | ||
| 176 | goto bad_area; | ||
| 175 | } else if (fault & VM_FAULT_SIGBUS) { | 177 | } else if (fault & VM_FAULT_SIGBUS) { |
| 176 | signal = SIGBUS; | 178 | signal = SIGBUS; |
| 177 | goto bad_area; | 179 | goto bad_area; |
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/m32r/mm/fault.c b/arch/m32r/mm/fault.c index e9c6a8014bd6..e3d4d4890104 100644 --- a/arch/m32r/mm/fault.c +++ b/arch/m32r/mm/fault.c | |||
| @@ -200,6 +200,8 @@ good_area: | |||
| 200 | if (unlikely(fault & VM_FAULT_ERROR)) { | 200 | if (unlikely(fault & VM_FAULT_ERROR)) { |
| 201 | if (fault & VM_FAULT_OOM) | 201 | if (fault & VM_FAULT_OOM) |
| 202 | goto out_of_memory; | 202 | goto out_of_memory; |
| 203 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 204 | goto bad_area; | ||
| 203 | else if (fault & VM_FAULT_SIGBUS) | 205 | else if (fault & VM_FAULT_SIGBUS) |
| 204 | goto do_sigbus; | 206 | goto do_sigbus; |
| 205 | BUG(); | 207 | BUG(); |
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/m68k/mm/fault.c b/arch/m68k/mm/fault.c index 2bd7487440c4..b2f04aee46ec 100644 --- a/arch/m68k/mm/fault.c +++ b/arch/m68k/mm/fault.c | |||
| @@ -145,6 +145,8 @@ good_area: | |||
| 145 | if (unlikely(fault & VM_FAULT_ERROR)) { | 145 | if (unlikely(fault & VM_FAULT_ERROR)) { |
| 146 | if (fault & VM_FAULT_OOM) | 146 | if (fault & VM_FAULT_OOM) |
| 147 | goto out_of_memory; | 147 | goto out_of_memory; |
| 148 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 149 | goto map_err; | ||
| 148 | else if (fault & VM_FAULT_SIGBUS) | 150 | else if (fault & VM_FAULT_SIGBUS) |
| 149 | goto bus_err; | 151 | goto bus_err; |
| 150 | BUG(); | 152 | BUG(); |
diff --git a/arch/metag/mm/fault.c b/arch/metag/mm/fault.c index 332680e5ebf2..2de5dc695a87 100644 --- a/arch/metag/mm/fault.c +++ b/arch/metag/mm/fault.c | |||
| @@ -141,6 +141,8 @@ good_area: | |||
| 141 | if (unlikely(fault & VM_FAULT_ERROR)) { | 141 | if (unlikely(fault & VM_FAULT_ERROR)) { |
| 142 | if (fault & VM_FAULT_OOM) | 142 | if (fault & VM_FAULT_OOM) |
| 143 | goto out_of_memory; | 143 | goto out_of_memory; |
| 144 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 145 | goto bad_area; | ||
| 144 | else if (fault & VM_FAULT_SIGBUS) | 146 | else if (fault & VM_FAULT_SIGBUS) |
| 145 | goto do_sigbus; | 147 | goto do_sigbus; |
| 146 | BUG(); | 148 | BUG(); |
diff --git a/arch/microblaze/mm/fault.c b/arch/microblaze/mm/fault.c index fa4cf52aa7a6..d46a5ebb7570 100644 --- a/arch/microblaze/mm/fault.c +++ b/arch/microblaze/mm/fault.c | |||
| @@ -224,6 +224,8 @@ good_area: | |||
| 224 | if (unlikely(fault & VM_FAULT_ERROR)) { | 224 | if (unlikely(fault & VM_FAULT_ERROR)) { |
| 225 | if (fault & VM_FAULT_OOM) | 225 | if (fault & VM_FAULT_OOM) |
| 226 | goto out_of_memory; | 226 | goto out_of_memory; |
| 227 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 228 | goto bad_area; | ||
| 227 | else if (fault & VM_FAULT_SIGBUS) | 229 | else if (fault & VM_FAULT_SIGBUS) |
| 228 | goto do_sigbus; | 230 | goto do_sigbus; |
| 229 | BUG(); | 231 | BUG(); |
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/Kconfig b/arch/mips/Kconfig index 3289969ee423..843713c05b79 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
| @@ -2656,27 +2656,21 @@ config TRAD_SIGNALS | |||
| 2656 | bool | 2656 | bool |
| 2657 | 2657 | ||
| 2658 | config MIPS32_COMPAT | 2658 | config MIPS32_COMPAT |
| 2659 | bool "Kernel support for Linux/MIPS 32-bit binary compatibility" | 2659 | bool |
| 2660 | depends on 64BIT | ||
| 2661 | help | ||
| 2662 | Select this option if you want Linux/MIPS 32-bit binary | ||
| 2663 | compatibility. Since all software available for Linux/MIPS is | ||
| 2664 | currently 32-bit you should say Y here. | ||
| 2665 | 2660 | ||
| 2666 | config COMPAT | 2661 | config COMPAT |
| 2667 | bool | 2662 | bool |
| 2668 | depends on MIPS32_COMPAT | ||
| 2669 | select ARCH_WANT_OLD_COMPAT_IPC | ||
| 2670 | default y | ||
| 2671 | 2663 | ||
| 2672 | config SYSVIPC_COMPAT | 2664 | config SYSVIPC_COMPAT |
| 2673 | bool | 2665 | bool |
| 2674 | depends on COMPAT && SYSVIPC | ||
| 2675 | default y | ||
| 2676 | 2666 | ||
| 2677 | config MIPS32_O32 | 2667 | config MIPS32_O32 |
| 2678 | bool "Kernel support for o32 binaries" | 2668 | bool "Kernel support for o32 binaries" |
| 2679 | depends on MIPS32_COMPAT | 2669 | depends on 64BIT |
| 2670 | select ARCH_WANT_OLD_COMPAT_IPC | ||
| 2671 | select COMPAT | ||
| 2672 | select MIPS32_COMPAT | ||
| 2673 | select SYSVIPC_COMPAT if SYSVIPC | ||
| 2680 | help | 2674 | help |
| 2681 | Select this option if you want to run o32 binaries. These are pure | 2675 | Select this option if you want to run o32 binaries. These are pure |
| 2682 | 32-bit binaries as used by the 32-bit Linux/MIPS port. Most of | 2676 | 32-bit binaries as used by the 32-bit Linux/MIPS port. Most of |
| @@ -2686,7 +2680,10 @@ config MIPS32_O32 | |||
| 2686 | 2680 | ||
| 2687 | config MIPS32_N32 | 2681 | config MIPS32_N32 |
| 2688 | bool "Kernel support for n32 binaries" | 2682 | bool "Kernel support for n32 binaries" |
| 2689 | depends on MIPS32_COMPAT | 2683 | depends on 64BIT |
| 2684 | select COMPAT | ||
| 2685 | select MIPS32_COMPAT | ||
| 2686 | select SYSVIPC_COMPAT if SYSVIPC | ||
| 2690 | help | 2687 | help |
| 2691 | Select this option if you want to run n32 binaries. These are | 2688 | Select this option if you want to run n32 binaries. These are |
| 2692 | 64-bit binaries using 32-bit quantities for addressing and certain | 2689 | 64-bit binaries using 32-bit quantities for addressing and certain |
diff --git a/arch/mips/boot/elf2ecoff.c b/arch/mips/boot/elf2ecoff.c index 8585078ae50e..2a4c52e27f41 100644 --- a/arch/mips/boot/elf2ecoff.c +++ b/arch/mips/boot/elf2ecoff.c | |||
| @@ -49,7 +49,8 @@ | |||
| 49 | /* | 49 | /* |
| 50 | * Some extra ELF definitions | 50 | * Some extra ELF definitions |
| 51 | */ | 51 | */ |
| 52 | #define PT_MIPS_REGINFO 0x70000000 /* Register usage information */ | 52 | #define PT_MIPS_REGINFO 0x70000000 /* Register usage information */ |
| 53 | #define PT_MIPS_ABIFLAGS 0x70000003 /* Records ABI related flags */ | ||
| 53 | 54 | ||
| 54 | /* -------------------------------------------------------------------- */ | 55 | /* -------------------------------------------------------------------- */ |
| 55 | 56 | ||
| @@ -349,39 +350,46 @@ int main(int argc, char *argv[]) | |||
| 349 | 350 | ||
| 350 | for (i = 0; i < ex.e_phnum; i++) { | 351 | for (i = 0; i < ex.e_phnum; i++) { |
| 351 | /* Section types we can ignore... */ | 352 | /* Section types we can ignore... */ |
| 352 | if (ph[i].p_type == PT_NULL || ph[i].p_type == PT_NOTE || | 353 | switch (ph[i].p_type) { |
| 353 | ph[i].p_type == PT_PHDR | 354 | case PT_NULL: |
| 354 | || ph[i].p_type == PT_MIPS_REGINFO) | 355 | case PT_NOTE: |
| 356 | case PT_PHDR: | ||
| 357 | case PT_MIPS_REGINFO: | ||
| 358 | case PT_MIPS_ABIFLAGS: | ||
| 355 | continue; | 359 | continue; |
| 356 | /* Section types we can't handle... */ | ||
| 357 | else if (ph[i].p_type != PT_LOAD) { | ||
| 358 | fprintf(stderr, | ||
| 359 | "Program header %d type %d can't be converted.\n", | ||
| 360 | ex.e_phnum, ph[i].p_type); | ||
| 361 | exit(1); | ||
| 362 | } | ||
| 363 | /* Writable (data) segment? */ | ||
| 364 | if (ph[i].p_flags & PF_W) { | ||
| 365 | struct sect ndata, nbss; | ||
| 366 | 360 | ||
| 367 | ndata.vaddr = ph[i].p_vaddr; | 361 | case PT_LOAD: |
| 368 | ndata.len = ph[i].p_filesz; | 362 | /* Writable (data) segment? */ |
| 369 | nbss.vaddr = ph[i].p_vaddr + ph[i].p_filesz; | 363 | if (ph[i].p_flags & PF_W) { |
| 370 | nbss.len = ph[i].p_memsz - ph[i].p_filesz; | 364 | struct sect ndata, nbss; |
| 365 | |||
| 366 | ndata.vaddr = ph[i].p_vaddr; | ||
| 367 | ndata.len = ph[i].p_filesz; | ||
| 368 | nbss.vaddr = ph[i].p_vaddr + ph[i].p_filesz; | ||
| 369 | nbss.len = ph[i].p_memsz - ph[i].p_filesz; | ||
| 371 | 370 | ||
| 372 | combine(&data, &ndata, 0); | 371 | combine(&data, &ndata, 0); |
| 373 | combine(&bss, &nbss, 1); | 372 | combine(&bss, &nbss, 1); |
| 374 | } else { | 373 | } else { |
| 375 | struct sect ntxt; | 374 | struct sect ntxt; |
| 376 | 375 | ||
| 377 | ntxt.vaddr = ph[i].p_vaddr; | 376 | ntxt.vaddr = ph[i].p_vaddr; |
| 378 | ntxt.len = ph[i].p_filesz; | 377 | ntxt.len = ph[i].p_filesz; |
| 379 | 378 | ||
| 380 | combine(&text, &ntxt, 0); | 379 | combine(&text, &ntxt, 0); |
| 380 | } | ||
| 381 | /* Remember the lowest segment start address. */ | ||
| 382 | if (ph[i].p_vaddr < cur_vma) | ||
| 383 | cur_vma = ph[i].p_vaddr; | ||
| 384 | break; | ||
| 385 | |||
| 386 | default: | ||
| 387 | /* Section types we can't handle... */ | ||
| 388 | fprintf(stderr, | ||
| 389 | "Program header %d type %d can't be converted.\n", | ||
| 390 | ex.e_phnum, ph[i].p_type); | ||
| 391 | exit(1); | ||
| 381 | } | 392 | } |
| 382 | /* Remember the lowest segment start address. */ | ||
| 383 | if (ph[i].p_vaddr < cur_vma) | ||
| 384 | cur_vma = ph[i].p_vaddr; | ||
| 385 | } | 393 | } |
| 386 | 394 | ||
| 387 | /* Sections must be in order to be converted... */ | 395 | /* Sections must be in order to be converted... */ |
diff --git a/arch/mips/cavium-octeon/smp.c b/arch/mips/cavium-octeon/smp.c index ecd903dd1c45..8b1eeffa12ed 100644 --- a/arch/mips/cavium-octeon/smp.c +++ b/arch/mips/cavium-octeon/smp.c | |||
| @@ -240,9 +240,7 @@ static int octeon_cpu_disable(void) | |||
| 240 | 240 | ||
| 241 | set_cpu_online(cpu, false); | 241 | set_cpu_online(cpu, false); |
| 242 | cpu_clear(cpu, cpu_callin_map); | 242 | cpu_clear(cpu, cpu_callin_map); |
| 243 | local_irq_disable(); | ||
| 244 | octeon_fixup_irqs(); | 243 | octeon_fixup_irqs(); |
| 245 | local_irq_enable(); | ||
| 246 | 244 | ||
| 247 | flush_cache_all(); | 245 | flush_cache_all(); |
| 248 | local_flush_tlb_all(); | 246 | local_flush_tlb_all(); |
diff --git a/arch/mips/configs/malta_defconfig b/arch/mips/configs/malta_defconfig index f57b96dcf7df..61a4460d67d3 100644 --- a/arch/mips/configs/malta_defconfig +++ b/arch/mips/configs/malta_defconfig | |||
| @@ -132,7 +132,6 @@ CONFIG_IP_NF_MATCH_ECN=m | |||
| 132 | CONFIG_IP_NF_MATCH_TTL=m | 132 | CONFIG_IP_NF_MATCH_TTL=m |
| 133 | CONFIG_IP_NF_FILTER=m | 133 | CONFIG_IP_NF_FILTER=m |
| 134 | CONFIG_IP_NF_TARGET_REJECT=m | 134 | CONFIG_IP_NF_TARGET_REJECT=m |
| 135 | CONFIG_IP_NF_TARGET_ULOG=m | ||
| 136 | CONFIG_IP_NF_MANGLE=m | 135 | CONFIG_IP_NF_MANGLE=m |
| 137 | CONFIG_IP_NF_TARGET_CLUSTERIP=m | 136 | CONFIG_IP_NF_TARGET_CLUSTERIP=m |
| 138 | CONFIG_IP_NF_TARGET_ECN=m | 137 | CONFIG_IP_NF_TARGET_ECN=m |
| @@ -175,7 +174,6 @@ CONFIG_BRIDGE_EBT_MARK_T=m | |||
| 175 | CONFIG_BRIDGE_EBT_REDIRECT=m | 174 | CONFIG_BRIDGE_EBT_REDIRECT=m |
| 176 | CONFIG_BRIDGE_EBT_SNAT=m | 175 | CONFIG_BRIDGE_EBT_SNAT=m |
| 177 | CONFIG_BRIDGE_EBT_LOG=m | 176 | CONFIG_BRIDGE_EBT_LOG=m |
| 178 | CONFIG_BRIDGE_EBT_ULOG=m | ||
| 179 | CONFIG_BRIDGE_EBT_NFLOG=m | 177 | CONFIG_BRIDGE_EBT_NFLOG=m |
| 180 | CONFIG_IP_SCTP=m | 178 | CONFIG_IP_SCTP=m |
| 181 | CONFIG_BRIDGE=m | 179 | CONFIG_BRIDGE=m |
| @@ -220,8 +218,6 @@ CONFIG_NET_ACT_SKBEDIT=m | |||
| 220 | CONFIG_NET_CLS_IND=y | 218 | CONFIG_NET_CLS_IND=y |
| 221 | CONFIG_CFG80211=m | 219 | CONFIG_CFG80211=m |
| 222 | CONFIG_MAC80211=m | 220 | CONFIG_MAC80211=m |
| 223 | CONFIG_MAC80211_RC_PID=y | ||
| 224 | CONFIG_MAC80211_RC_DEFAULT_PID=y | ||
| 225 | CONFIG_MAC80211_MESH=y | 221 | CONFIG_MAC80211_MESH=y |
| 226 | CONFIG_RFKILL=m | 222 | CONFIG_RFKILL=m |
| 227 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | 223 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
| @@ -248,19 +244,13 @@ CONFIG_ATA_OVER_ETH=m | |||
| 248 | CONFIG_IDE=y | 244 | CONFIG_IDE=y |
| 249 | CONFIG_BLK_DEV_IDECD=y | 245 | CONFIG_BLK_DEV_IDECD=y |
| 250 | CONFIG_IDE_GENERIC=y | 246 | CONFIG_IDE_GENERIC=y |
| 251 | CONFIG_BLK_DEV_GENERIC=y | ||
| 252 | CONFIG_BLK_DEV_PIIX=y | ||
| 253 | CONFIG_BLK_DEV_IT8213=m | ||
| 254 | CONFIG_BLK_DEV_TC86C001=m | ||
| 255 | CONFIG_RAID_ATTRS=m | 247 | CONFIG_RAID_ATTRS=m |
| 256 | CONFIG_SCSI=m | 248 | CONFIG_BLK_DEV_SD=y |
| 257 | CONFIG_BLK_DEV_SD=m | ||
| 258 | CONFIG_CHR_DEV_ST=m | 249 | CONFIG_CHR_DEV_ST=m |
| 259 | CONFIG_CHR_DEV_OSST=m | 250 | CONFIG_CHR_DEV_OSST=m |
| 260 | CONFIG_BLK_DEV_SR=m | 251 | CONFIG_BLK_DEV_SR=m |
| 261 | CONFIG_BLK_DEV_SR_VENDOR=y | 252 | CONFIG_BLK_DEV_SR_VENDOR=y |
| 262 | CONFIG_CHR_DEV_SG=m | 253 | CONFIG_CHR_DEV_SG=m |
| 263 | CONFIG_SCSI_MULTI_LUN=y | ||
| 264 | CONFIG_SCSI_CONSTANTS=y | 254 | CONFIG_SCSI_CONSTANTS=y |
| 265 | CONFIG_SCSI_LOGGING=y | 255 | CONFIG_SCSI_LOGGING=y |
| 266 | CONFIG_SCSI_SCAN_ASYNC=y | 256 | CONFIG_SCSI_SCAN_ASYNC=y |
| @@ -273,6 +263,8 @@ CONFIG_SCSI_AACRAID=m | |||
| 273 | CONFIG_SCSI_AIC7XXX=m | 263 | CONFIG_SCSI_AIC7XXX=m |
| 274 | CONFIG_AIC7XXX_RESET_DELAY_MS=15000 | 264 | CONFIG_AIC7XXX_RESET_DELAY_MS=15000 |
| 275 | # CONFIG_AIC7XXX_DEBUG_ENABLE is not set | 265 | # CONFIG_AIC7XXX_DEBUG_ENABLE is not set |
| 266 | CONFIG_ATA=y | ||
| 267 | CONFIG_ATA_PIIX=y | ||
| 276 | CONFIG_MD=y | 268 | CONFIG_MD=y |
| 277 | CONFIG_BLK_DEV_MD=m | 269 | CONFIG_BLK_DEV_MD=m |
| 278 | CONFIG_MD_LINEAR=m | 270 | CONFIG_MD_LINEAR=m |
| @@ -340,6 +332,7 @@ CONFIG_UIO=m | |||
| 340 | CONFIG_UIO_CIF=m | 332 | CONFIG_UIO_CIF=m |
| 341 | CONFIG_EXT2_FS=y | 333 | CONFIG_EXT2_FS=y |
| 342 | CONFIG_EXT3_FS=y | 334 | CONFIG_EXT3_FS=y |
| 335 | CONFIG_EXT4_FS=y | ||
| 343 | CONFIG_REISERFS_FS=m | 336 | CONFIG_REISERFS_FS=m |
| 344 | CONFIG_REISERFS_PROC_INFO=y | 337 | CONFIG_REISERFS_PROC_INFO=y |
| 345 | CONFIG_REISERFS_FS_XATTR=y | 338 | CONFIG_REISERFS_FS_XATTR=y |
| @@ -441,4 +434,3 @@ CONFIG_CRYPTO_SERPENT=m | |||
| 441 | CONFIG_CRYPTO_TEA=m | 434 | CONFIG_CRYPTO_TEA=m |
| 442 | CONFIG_CRYPTO_TWOFISH=m | 435 | CONFIG_CRYPTO_TWOFISH=m |
| 443 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | 436 | # CONFIG_CRYPTO_ANSI_CPRNG is not set |
| 444 | CONFIG_CRC16=m | ||
diff --git a/arch/mips/include/asm/fpu.h b/arch/mips/include/asm/fpu.h index 994d21939676..affebb78f5d6 100644 --- a/arch/mips/include/asm/fpu.h +++ b/arch/mips/include/asm/fpu.h | |||
| @@ -64,7 +64,7 @@ static inline int __enable_fpu(enum fpu_mode mode) | |||
| 64 | return SIGFPE; | 64 | return SIGFPE; |
| 65 | 65 | ||
| 66 | /* set FRE */ | 66 | /* set FRE */ |
| 67 | write_c0_config5(read_c0_config5() | MIPS_CONF5_FRE); | 67 | set_c0_config5(MIPS_CONF5_FRE); |
| 68 | goto fr_common; | 68 | goto fr_common; |
| 69 | 69 | ||
| 70 | case FPU_64BIT: | 70 | case FPU_64BIT: |
| @@ -74,8 +74,10 @@ static inline int __enable_fpu(enum fpu_mode mode) | |||
| 74 | #endif | 74 | #endif |
| 75 | /* fall through */ | 75 | /* fall through */ |
| 76 | case FPU_32BIT: | 76 | case FPU_32BIT: |
| 77 | /* clear FRE */ | 77 | if (cpu_has_fre) { |
| 78 | write_c0_config5(read_c0_config5() & ~MIPS_CONF5_FRE); | 78 | /* clear FRE */ |
| 79 | clear_c0_config5(MIPS_CONF5_FRE); | ||
| 80 | } | ||
| 79 | fr_common: | 81 | fr_common: |
| 80 | /* set CU1 & change FR appropriately */ | 82 | /* set CU1 & change FR appropriately */ |
| 81 | fr = (int)mode & FPU_FR_MASK; | 83 | fr = (int)mode & FPU_FR_MASK; |
| @@ -182,25 +184,32 @@ static inline int init_fpu(void) | |||
| 182 | int ret = 0; | 184 | int ret = 0; |
| 183 | 185 | ||
| 184 | if (cpu_has_fpu) { | 186 | if (cpu_has_fpu) { |
| 187 | unsigned int config5; | ||
| 188 | |||
| 185 | ret = __own_fpu(); | 189 | ret = __own_fpu(); |
| 186 | if (!ret) { | 190 | if (ret) |
| 187 | unsigned int config5 = read_c0_config5(); | 191 | return ret; |
| 188 | |||
| 189 | /* | ||
| 190 | * Ensure FRE is clear whilst running _init_fpu, since | ||
| 191 | * single precision FP instructions are used. If FRE | ||
| 192 | * was set then we'll just end up initialising all 32 | ||
| 193 | * 64b registers. | ||
| 194 | */ | ||
| 195 | write_c0_config5(config5 & ~MIPS_CONF5_FRE); | ||
| 196 | enable_fpu_hazard(); | ||
| 197 | 192 | ||
| 193 | if (!cpu_has_fre) { | ||
| 198 | _init_fpu(); | 194 | _init_fpu(); |
| 199 | 195 | ||
| 200 | /* Restore FRE */ | 196 | return 0; |
| 201 | write_c0_config5(config5); | ||
| 202 | enable_fpu_hazard(); | ||
| 203 | } | 197 | } |
| 198 | |||
| 199 | /* | ||
| 200 | * Ensure FRE is clear whilst running _init_fpu, since | ||
| 201 | * single precision FP instructions are used. If FRE | ||
| 202 | * was set then we'll just end up initialising all 32 | ||
| 203 | * 64b registers. | ||
| 204 | */ | ||
| 205 | config5 = clear_c0_config5(MIPS_CONF5_FRE); | ||
| 206 | enable_fpu_hazard(); | ||
| 207 | |||
| 208 | _init_fpu(); | ||
| 209 | |||
| 210 | /* Restore FRE */ | ||
| 211 | write_c0_config5(config5); | ||
| 212 | enable_fpu_hazard(); | ||
| 204 | } else | 213 | } else |
| 205 | fpu_emulator_init_fpu(); | 214 | fpu_emulator_init_fpu(); |
| 206 | 215 | ||
diff --git a/arch/mips/include/asm/fw/arc/hinv.h b/arch/mips/include/asm/fw/arc/hinv.h index f8d37d1df5de..9fac64a26353 100644 --- a/arch/mips/include/asm/fw/arc/hinv.h +++ b/arch/mips/include/asm/fw/arc/hinv.h | |||
| @@ -119,7 +119,7 @@ union key_u { | |||
| 119 | #define SGI_ARCS_REV 10 /* rev .10, 3/04/92 */ | 119 | #define SGI_ARCS_REV 10 /* rev .10, 3/04/92 */ |
| 120 | #endif | 120 | #endif |
| 121 | 121 | ||
| 122 | typedef struct component { | 122 | typedef struct { |
| 123 | CONFIGCLASS Class; | 123 | CONFIGCLASS Class; |
| 124 | CONFIGTYPE Type; | 124 | CONFIGTYPE Type; |
| 125 | IDENTIFIERFLAG Flags; | 125 | IDENTIFIERFLAG Flags; |
| @@ -140,7 +140,7 @@ struct cfgdata { | |||
| 140 | }; | 140 | }; |
| 141 | 141 | ||
| 142 | /* System ID */ | 142 | /* System ID */ |
| 143 | typedef struct systemid { | 143 | typedef struct { |
| 144 | CHAR VendorId[8]; | 144 | CHAR VendorId[8]; |
| 145 | CHAR ProductId[8]; | 145 | CHAR ProductId[8]; |
| 146 | } SYSTEMID; | 146 | } SYSTEMID; |
| @@ -166,7 +166,7 @@ typedef enum memorytype { | |||
| 166 | #endif /* _NT_PROM */ | 166 | #endif /* _NT_PROM */ |
| 167 | } MEMORYTYPE; | 167 | } MEMORYTYPE; |
| 168 | 168 | ||
| 169 | typedef struct memorydescriptor { | 169 | typedef struct { |
| 170 | MEMORYTYPE Type; | 170 | MEMORYTYPE Type; |
| 171 | LONG BasePage; | 171 | LONG BasePage; |
| 172 | LONG PageCount; | 172 | LONG PageCount; |
diff --git a/arch/mips/include/asm/mips-cm.h b/arch/mips/include/asm/mips-cm.h index b95a827d763e..59c0901bdd84 100644 --- a/arch/mips/include/asm/mips-cm.h +++ b/arch/mips/include/asm/mips-cm.h | |||
| @@ -89,9 +89,9 @@ static inline bool mips_cm_has_l2sync(void) | |||
| 89 | 89 | ||
| 90 | /* Macros to ease the creation of register access functions */ | 90 | /* Macros to ease the creation of register access functions */ |
| 91 | #define BUILD_CM_R_(name, off) \ | 91 | #define BUILD_CM_R_(name, off) \ |
| 92 | static inline u32 *addr_gcr_##name(void) \ | 92 | static inline u32 __iomem *addr_gcr_##name(void) \ |
| 93 | { \ | 93 | { \ |
| 94 | return (u32 *)(mips_cm_base + (off)); \ | 94 | return (u32 __iomem *)(mips_cm_base + (off)); \ |
| 95 | } \ | 95 | } \ |
| 96 | \ | 96 | \ |
| 97 | static inline u32 read_gcr_##name(void) \ | 97 | static inline u32 read_gcr_##name(void) \ |
diff --git a/arch/mips/include/asm/mipsregs.h b/arch/mips/include/asm/mipsregs.h index 5e4aef304b02..5b720d8c2745 100644 --- a/arch/mips/include/asm/mipsregs.h +++ b/arch/mips/include/asm/mipsregs.h | |||
| @@ -1386,12 +1386,27 @@ do { \ | |||
| 1386 | __res; \ | 1386 | __res; \ |
| 1387 | }) | 1387 | }) |
| 1388 | 1388 | ||
| 1389 | #define _write_32bit_cp1_register(dest, val, gas_hardfloat) \ | ||
| 1390 | do { \ | ||
| 1391 | __asm__ __volatile__( \ | ||
| 1392 | " .set push \n" \ | ||
| 1393 | " .set reorder \n" \ | ||
| 1394 | " "STR(gas_hardfloat)" \n" \ | ||
| 1395 | " ctc1 %0,"STR(dest)" \n" \ | ||
| 1396 | " .set pop \n" \ | ||
| 1397 | : : "r" (val)); \ | ||
| 1398 | } while (0) | ||
| 1399 | |||
| 1389 | #ifdef GAS_HAS_SET_HARDFLOAT | 1400 | #ifdef GAS_HAS_SET_HARDFLOAT |
| 1390 | #define read_32bit_cp1_register(source) \ | 1401 | #define read_32bit_cp1_register(source) \ |
| 1391 | _read_32bit_cp1_register(source, .set hardfloat) | 1402 | _read_32bit_cp1_register(source, .set hardfloat) |
| 1403 | #define write_32bit_cp1_register(dest, val) \ | ||
| 1404 | _write_32bit_cp1_register(dest, val, .set hardfloat) | ||
| 1392 | #else | 1405 | #else |
| 1393 | #define read_32bit_cp1_register(source) \ | 1406 | #define read_32bit_cp1_register(source) \ |
| 1394 | _read_32bit_cp1_register(source, ) | 1407 | _read_32bit_cp1_register(source, ) |
| 1408 | #define write_32bit_cp1_register(dest, val) \ | ||
| 1409 | _write_32bit_cp1_register(dest, val, ) | ||
| 1395 | #endif | 1410 | #endif |
| 1396 | 1411 | ||
| 1397 | #ifdef HAVE_AS_DSP | 1412 | #ifdef HAVE_AS_DSP |
diff --git a/arch/mips/include/asm/syscall.h b/arch/mips/include/asm/syscall.h index bb7963753730..6499d93ae68d 100644 --- a/arch/mips/include/asm/syscall.h +++ b/arch/mips/include/asm/syscall.h | |||
| @@ -29,13 +29,7 @@ | |||
| 29 | static inline long syscall_get_nr(struct task_struct *task, | 29 | static inline long syscall_get_nr(struct task_struct *task, |
| 30 | struct pt_regs *regs) | 30 | struct pt_regs *regs) |
| 31 | { | 31 | { |
| 32 | /* O32 ABI syscall() - Either 64-bit with O32 or 32-bit */ | 32 | return current_thread_info()->syscall; |
| 33 | if ((config_enabled(CONFIG_32BIT) || | ||
| 34 | test_tsk_thread_flag(task, TIF_32BIT_REGS)) && | ||
| 35 | (regs->regs[2] == __NR_syscall)) | ||
| 36 | return regs->regs[4]; | ||
| 37 | else | ||
| 38 | return regs->regs[2]; | ||
| 39 | } | 33 | } |
| 40 | 34 | ||
| 41 | static inline unsigned long mips_get_syscall_arg(unsigned long *arg, | 35 | static inline unsigned long mips_get_syscall_arg(unsigned long *arg, |
diff --git a/arch/mips/include/asm/thread_info.h b/arch/mips/include/asm/thread_info.h index 99eea59604e9..e4440f92b366 100644 --- a/arch/mips/include/asm/thread_info.h +++ b/arch/mips/include/asm/thread_info.h | |||
| @@ -36,6 +36,7 @@ struct thread_info { | |||
| 36 | */ | 36 | */ |
| 37 | struct restart_block restart_block; | 37 | struct restart_block restart_block; |
| 38 | struct pt_regs *regs; | 38 | struct pt_regs *regs; |
| 39 | long syscall; /* syscall number */ | ||
| 39 | }; | 40 | }; |
| 40 | 41 | ||
| 41 | /* | 42 | /* |
diff --git a/arch/mips/include/uapi/asm/unistd.h b/arch/mips/include/uapi/asm/unistd.h index d001bb1ad177..c03088f9f514 100644 --- a/arch/mips/include/uapi/asm/unistd.h +++ b/arch/mips/include/uapi/asm/unistd.h | |||
| @@ -376,16 +376,17 @@ | |||
| 376 | #define __NR_getrandom (__NR_Linux + 353) | 376 | #define __NR_getrandom (__NR_Linux + 353) |
| 377 | #define __NR_memfd_create (__NR_Linux + 354) | 377 | #define __NR_memfd_create (__NR_Linux + 354) |
| 378 | #define __NR_bpf (__NR_Linux + 355) | 378 | #define __NR_bpf (__NR_Linux + 355) |
| 379 | #define __NR_execveat (__NR_Linux + 356) | ||
| 379 | 380 | ||
| 380 | /* | 381 | /* |
| 381 | * Offset of the last Linux o32 flavoured syscall | 382 | * Offset of the last Linux o32 flavoured syscall |
| 382 | */ | 383 | */ |
| 383 | #define __NR_Linux_syscalls 355 | 384 | #define __NR_Linux_syscalls 356 |
| 384 | 385 | ||
| 385 | #endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */ | 386 | #endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */ |
| 386 | 387 | ||
| 387 | #define __NR_O32_Linux 4000 | 388 | #define __NR_O32_Linux 4000 |
| 388 | #define __NR_O32_Linux_syscalls 355 | 389 | #define __NR_O32_Linux_syscalls 356 |
| 389 | 390 | ||
| 390 | #if _MIPS_SIM == _MIPS_SIM_ABI64 | 391 | #if _MIPS_SIM == _MIPS_SIM_ABI64 |
| 391 | 392 | ||
| @@ -709,16 +710,17 @@ | |||
| 709 | #define __NR_getrandom (__NR_Linux + 313) | 710 | #define __NR_getrandom (__NR_Linux + 313) |
| 710 | #define __NR_memfd_create (__NR_Linux + 314) | 711 | #define __NR_memfd_create (__NR_Linux + 314) |
| 711 | #define __NR_bpf (__NR_Linux + 315) | 712 | #define __NR_bpf (__NR_Linux + 315) |
| 713 | #define __NR_execveat (__NR_Linux + 316) | ||
| 712 | 714 | ||
| 713 | /* | 715 | /* |
| 714 | * Offset of the last Linux 64-bit flavoured syscall | 716 | * Offset of the last Linux 64-bit flavoured syscall |
| 715 | */ | 717 | */ |
| 716 | #define __NR_Linux_syscalls 315 | 718 | #define __NR_Linux_syscalls 316 |
| 717 | 719 | ||
| 718 | #endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */ | 720 | #endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */ |
| 719 | 721 | ||
| 720 | #define __NR_64_Linux 5000 | 722 | #define __NR_64_Linux 5000 |
| 721 | #define __NR_64_Linux_syscalls 315 | 723 | #define __NR_64_Linux_syscalls 316 |
| 722 | 724 | ||
| 723 | #if _MIPS_SIM == _MIPS_SIM_NABI32 | 725 | #if _MIPS_SIM == _MIPS_SIM_NABI32 |
| 724 | 726 | ||
| @@ -1046,15 +1048,16 @@ | |||
| 1046 | #define __NR_getrandom (__NR_Linux + 317) | 1048 | #define __NR_getrandom (__NR_Linux + 317) |
| 1047 | #define __NR_memfd_create (__NR_Linux + 318) | 1049 | #define __NR_memfd_create (__NR_Linux + 318) |
| 1048 | #define __NR_bpf (__NR_Linux + 319) | 1050 | #define __NR_bpf (__NR_Linux + 319) |
| 1051 | #define __NR_execveat (__NR_Linux + 320) | ||
| 1049 | 1052 | ||
| 1050 | /* | 1053 | /* |
| 1051 | * Offset of the last N32 flavoured syscall | 1054 | * Offset of the last N32 flavoured syscall |
| 1052 | */ | 1055 | */ |
| 1053 | #define __NR_Linux_syscalls 319 | 1056 | #define __NR_Linux_syscalls 320 |
| 1054 | 1057 | ||
| 1055 | #endif /* _MIPS_SIM == _MIPS_SIM_NABI32 */ | 1058 | #endif /* _MIPS_SIM == _MIPS_SIM_NABI32 */ |
| 1056 | 1059 | ||
| 1057 | #define __NR_N32_Linux 6000 | 1060 | #define __NR_N32_Linux 6000 |
| 1058 | #define __NR_N32_Linux_syscalls 319 | 1061 | #define __NR_N32_Linux_syscalls 320 |
| 1059 | 1062 | ||
| 1060 | #endif /* _UAPI_ASM_UNISTD_H */ | 1063 | #endif /* _UAPI_ASM_UNISTD_H */ |
diff --git a/arch/mips/jz4740/irq.c b/arch/mips/jz4740/irq.c index 2531da1d3add..97206b3deb97 100644 --- a/arch/mips/jz4740/irq.c +++ b/arch/mips/jz4740/irq.c | |||
| @@ -30,6 +30,9 @@ | |||
| 30 | #include <asm/irq_cpu.h> | 30 | #include <asm/irq_cpu.h> |
| 31 | 31 | ||
| 32 | #include <asm/mach-jz4740/base.h> | 32 | #include <asm/mach-jz4740/base.h> |
| 33 | #include <asm/mach-jz4740/irq.h> | ||
| 34 | |||
| 35 | #include "irq.h" | ||
| 33 | 36 | ||
| 34 | static void __iomem *jz_intc_base; | 37 | static void __iomem *jz_intc_base; |
| 35 | 38 | ||
diff --git a/arch/mips/kernel/elf.c b/arch/mips/kernel/elf.c index c92b15df6893..a5b5b56485c1 100644 --- a/arch/mips/kernel/elf.c +++ b/arch/mips/kernel/elf.c | |||
| @@ -19,8 +19,8 @@ enum { | |||
| 19 | int arch_elf_pt_proc(void *_ehdr, void *_phdr, struct file *elf, | 19 | int arch_elf_pt_proc(void *_ehdr, void *_phdr, struct file *elf, |
| 20 | bool is_interp, struct arch_elf_state *state) | 20 | bool is_interp, struct arch_elf_state *state) |
| 21 | { | 21 | { |
| 22 | struct elfhdr *ehdr = _ehdr; | 22 | struct elf32_hdr *ehdr = _ehdr; |
| 23 | struct elf_phdr *phdr = _phdr; | 23 | struct elf32_phdr *phdr = _phdr; |
| 24 | struct mips_elf_abiflags_v0 abiflags; | 24 | struct mips_elf_abiflags_v0 abiflags; |
| 25 | int ret; | 25 | int ret; |
| 26 | 26 | ||
| @@ -48,7 +48,7 @@ int arch_elf_pt_proc(void *_ehdr, void *_phdr, struct file *elf, | |||
| 48 | return 0; | 48 | return 0; |
| 49 | } | 49 | } |
| 50 | 50 | ||
| 51 | static inline unsigned get_fp_abi(struct elfhdr *ehdr, int in_abi) | 51 | static inline unsigned get_fp_abi(struct elf32_hdr *ehdr, int in_abi) |
| 52 | { | 52 | { |
| 53 | /* If the ABI requirement is provided, simply return that */ | 53 | /* If the ABI requirement is provided, simply return that */ |
| 54 | if (in_abi != -1) | 54 | if (in_abi != -1) |
| @@ -65,7 +65,7 @@ static inline unsigned get_fp_abi(struct elfhdr *ehdr, int in_abi) | |||
| 65 | int arch_check_elf(void *_ehdr, bool has_interpreter, | 65 | int arch_check_elf(void *_ehdr, bool has_interpreter, |
| 66 | struct arch_elf_state *state) | 66 | struct arch_elf_state *state) |
| 67 | { | 67 | { |
| 68 | struct elfhdr *ehdr = _ehdr; | 68 | struct elf32_hdr *ehdr = _ehdr; |
| 69 | unsigned fp_abi, interp_fp_abi, abi0, abi1; | 69 | unsigned fp_abi, interp_fp_abi, abi0, abi1; |
| 70 | 70 | ||
| 71 | /* Ignore non-O32 binaries */ | 71 | /* Ignore non-O32 binaries */ |
diff --git a/arch/mips/kernel/irq_cpu.c b/arch/mips/kernel/irq_cpu.c index 590c2c980fd3..6eb7a3f515fc 100644 --- a/arch/mips/kernel/irq_cpu.c +++ b/arch/mips/kernel/irq_cpu.c | |||
| @@ -57,6 +57,8 @@ static struct irq_chip mips_cpu_irq_controller = { | |||
| 57 | .irq_mask_ack = mask_mips_irq, | 57 | .irq_mask_ack = mask_mips_irq, |
| 58 | .irq_unmask = unmask_mips_irq, | 58 | .irq_unmask = unmask_mips_irq, |
| 59 | .irq_eoi = unmask_mips_irq, | 59 | .irq_eoi = unmask_mips_irq, |
| 60 | .irq_disable = mask_mips_irq, | ||
| 61 | .irq_enable = unmask_mips_irq, | ||
| 60 | }; | 62 | }; |
| 61 | 63 | ||
| 62 | /* | 64 | /* |
| @@ -93,6 +95,8 @@ static struct irq_chip mips_mt_cpu_irq_controller = { | |||
| 93 | .irq_mask_ack = mips_mt_cpu_irq_ack, | 95 | .irq_mask_ack = mips_mt_cpu_irq_ack, |
| 94 | .irq_unmask = unmask_mips_irq, | 96 | .irq_unmask = unmask_mips_irq, |
| 95 | .irq_eoi = unmask_mips_irq, | 97 | .irq_eoi = unmask_mips_irq, |
| 98 | .irq_disable = mask_mips_irq, | ||
| 99 | .irq_enable = unmask_mips_irq, | ||
| 96 | }; | 100 | }; |
| 97 | 101 | ||
| 98 | asmlinkage void __weak plat_irq_dispatch(void) | 102 | asmlinkage void __weak plat_irq_dispatch(void) |
diff --git a/arch/mips/kernel/process.c b/arch/mips/kernel/process.c index eb76434828e8..85bff5d513e5 100644 --- a/arch/mips/kernel/process.c +++ b/arch/mips/kernel/process.c | |||
| @@ -82,6 +82,30 @@ void flush_thread(void) | |||
| 82 | { | 82 | { |
| 83 | } | 83 | } |
| 84 | 84 | ||
| 85 | int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src) | ||
| 86 | { | ||
| 87 | /* | ||
| 88 | * Save any process state which is live in hardware registers to the | ||
| 89 | * parent context prior to duplication. This prevents the new child | ||
| 90 | * state becoming stale if the parent is preempted before copy_thread() | ||
| 91 | * gets a chance to save the parent's live hardware registers to the | ||
| 92 | * child context. | ||
| 93 | */ | ||
| 94 | preempt_disable(); | ||
| 95 | |||
| 96 | if (is_msa_enabled()) | ||
| 97 | save_msa(current); | ||
| 98 | else if (is_fpu_owner()) | ||
| 99 | _save_fp(current); | ||
| 100 | |||
| 101 | save_dsp(current); | ||
| 102 | |||
| 103 | preempt_enable(); | ||
| 104 | |||
| 105 | *dst = *src; | ||
| 106 | return 0; | ||
| 107 | } | ||
| 108 | |||
| 85 | int copy_thread(unsigned long clone_flags, unsigned long usp, | 109 | int copy_thread(unsigned long clone_flags, unsigned long usp, |
| 86 | unsigned long arg, struct task_struct *p) | 110 | unsigned long arg, struct task_struct *p) |
| 87 | { | 111 | { |
| @@ -92,18 +116,6 @@ int copy_thread(unsigned long clone_flags, unsigned long usp, | |||
| 92 | 116 | ||
| 93 | childksp = (unsigned long)task_stack_page(p) + THREAD_SIZE - 32; | 117 | childksp = (unsigned long)task_stack_page(p) + THREAD_SIZE - 32; |
| 94 | 118 | ||
| 95 | preempt_disable(); | ||
| 96 | |||
| 97 | if (is_msa_enabled()) | ||
| 98 | save_msa(p); | ||
| 99 | else if (is_fpu_owner()) | ||
| 100 | save_fp(p); | ||
| 101 | |||
| 102 | if (cpu_has_dsp) | ||
| 103 | save_dsp(p); | ||
| 104 | |||
| 105 | preempt_enable(); | ||
| 106 | |||
| 107 | /* set up new TSS. */ | 119 | /* set up new TSS. */ |
| 108 | childregs = (struct pt_regs *) childksp - 1; | 120 | childregs = (struct pt_regs *) childksp - 1; |
| 109 | /* Put the stack after the struct pt_regs. */ | 121 | /* Put the stack after the struct pt_regs. */ |
diff --git a/arch/mips/kernel/ptrace.c b/arch/mips/kernel/ptrace.c index 9d1487d83293..510452812594 100644 --- a/arch/mips/kernel/ptrace.c +++ b/arch/mips/kernel/ptrace.c | |||
| @@ -770,6 +770,8 @@ asmlinkage long syscall_trace_enter(struct pt_regs *regs, long syscall) | |||
| 770 | long ret = 0; | 770 | long ret = 0; |
| 771 | user_exit(); | 771 | user_exit(); |
| 772 | 772 | ||
| 773 | current_thread_info()->syscall = syscall; | ||
| 774 | |||
| 773 | if (secure_computing() == -1) | 775 | if (secure_computing() == -1) |
| 774 | return -1; | 776 | return -1; |
| 775 | 777 | ||
diff --git a/arch/mips/kernel/scall32-o32.S b/arch/mips/kernel/scall32-o32.S index 00cad1005a16..6e8de80bb446 100644 --- a/arch/mips/kernel/scall32-o32.S +++ b/arch/mips/kernel/scall32-o32.S | |||
| @@ -181,6 +181,7 @@ illegal_syscall: | |||
| 181 | sll t1, t0, 2 | 181 | sll t1, t0, 2 |
| 182 | beqz v0, einval | 182 | beqz v0, einval |
| 183 | lw t2, sys_call_table(t1) # syscall routine | 183 | lw t2, sys_call_table(t1) # syscall routine |
| 184 | sw a0, PT_R2(sp) # call routine directly on restart | ||
| 184 | 185 | ||
| 185 | /* Some syscalls like execve get their arguments from struct pt_regs | 186 | /* Some syscalls like execve get their arguments from struct pt_regs |
| 186 | and claim zero arguments in the syscall table. Thus we have to | 187 | and claim zero arguments in the syscall table. Thus we have to |
| @@ -580,3 +581,4 @@ EXPORT(sys_call_table) | |||
| 580 | PTR sys_getrandom | 581 | PTR sys_getrandom |
| 581 | PTR sys_memfd_create | 582 | PTR sys_memfd_create |
| 582 | PTR sys_bpf /* 4355 */ | 583 | PTR sys_bpf /* 4355 */ |
| 584 | PTR sys_execveat | ||
diff --git a/arch/mips/kernel/scall64-64.S b/arch/mips/kernel/scall64-64.S index 5251565e344b..ad4d44635c76 100644 --- a/arch/mips/kernel/scall64-64.S +++ b/arch/mips/kernel/scall64-64.S | |||
| @@ -435,4 +435,5 @@ EXPORT(sys_call_table) | |||
| 435 | PTR sys_getrandom | 435 | PTR sys_getrandom |
| 436 | PTR sys_memfd_create | 436 | PTR sys_memfd_create |
| 437 | PTR sys_bpf /* 5315 */ | 437 | PTR sys_bpf /* 5315 */ |
| 438 | PTR sys_execveat | ||
| 438 | .size sys_call_table,.-sys_call_table | 439 | .size sys_call_table,.-sys_call_table |
diff --git a/arch/mips/kernel/scall64-n32.S b/arch/mips/kernel/scall64-n32.S index 77e74398b828..446cc654da56 100644 --- a/arch/mips/kernel/scall64-n32.S +++ b/arch/mips/kernel/scall64-n32.S | |||
| @@ -428,4 +428,5 @@ EXPORT(sysn32_call_table) | |||
| 428 | PTR sys_getrandom | 428 | PTR sys_getrandom |
| 429 | PTR sys_memfd_create | 429 | PTR sys_memfd_create |
| 430 | PTR sys_bpf | 430 | PTR sys_bpf |
| 431 | PTR compat_sys_execveat /* 6320 */ | ||
| 431 | .size sysn32_call_table,.-sysn32_call_table | 432 | .size sysn32_call_table,.-sysn32_call_table |
diff --git a/arch/mips/kernel/scall64-o32.S b/arch/mips/kernel/scall64-o32.S index 6f8db9f728e8..d07b210fbeff 100644 --- a/arch/mips/kernel/scall64-o32.S +++ b/arch/mips/kernel/scall64-o32.S | |||
| @@ -186,6 +186,7 @@ LEAF(sys32_syscall) | |||
| 186 | dsll t1, t0, 3 | 186 | dsll t1, t0, 3 |
| 187 | beqz v0, einval | 187 | beqz v0, einval |
| 188 | ld t2, sys32_call_table(t1) # syscall routine | 188 | ld t2, sys32_call_table(t1) # syscall routine |
| 189 | sd a0, PT_R2(sp) # call routine directly on restart | ||
| 189 | 190 | ||
| 190 | move a0, a1 # shift argument registers | 191 | move a0, a1 # shift argument registers |
| 191 | move a1, a2 | 192 | move a1, a2 |
| @@ -565,4 +566,5 @@ EXPORT(sys32_call_table) | |||
| 565 | PTR sys_getrandom | 566 | PTR sys_getrandom |
| 566 | PTR sys_memfd_create | 567 | PTR sys_memfd_create |
| 567 | PTR sys_bpf /* 4355 */ | 568 | PTR sys_bpf /* 4355 */ |
| 569 | PTR compat_sys_execveat | ||
| 568 | .size sys32_call_table,.-sys32_call_table | 570 | .size sys32_call_table,.-sys32_call_table |
diff --git a/arch/mips/kernel/smp-cmp.c b/arch/mips/kernel/smp-cmp.c index 1e0a93c5a3e7..e36a859af666 100644 --- a/arch/mips/kernel/smp-cmp.c +++ b/arch/mips/kernel/smp-cmp.c | |||
| @@ -44,8 +44,8 @@ static void cmp_init_secondary(void) | |||
| 44 | struct cpuinfo_mips *c __maybe_unused = ¤t_cpu_data; | 44 | struct cpuinfo_mips *c __maybe_unused = ¤t_cpu_data; |
| 45 | 45 | ||
| 46 | /* Assume GIC is present */ | 46 | /* Assume GIC is present */ |
| 47 | change_c0_status(ST0_IM, STATUSF_IP3 | STATUSF_IP4 | STATUSF_IP6 | | 47 | change_c0_status(ST0_IM, STATUSF_IP2 | STATUSF_IP3 | STATUSF_IP4 | |
| 48 | STATUSF_IP7); | 48 | STATUSF_IP5 | STATUSF_IP6 | STATUSF_IP7); |
| 49 | 49 | ||
| 50 | /* Enable per-cpu interrupts: platform specific */ | 50 | /* Enable per-cpu interrupts: platform specific */ |
| 51 | 51 | ||
diff --git a/arch/mips/kernel/smp-mt.c b/arch/mips/kernel/smp-mt.c index ad86951b73bd..17ea705f6c40 100644 --- a/arch/mips/kernel/smp-mt.c +++ b/arch/mips/kernel/smp-mt.c | |||
| @@ -161,7 +161,8 @@ static void vsmp_init_secondary(void) | |||
| 161 | #ifdef CONFIG_MIPS_GIC | 161 | #ifdef CONFIG_MIPS_GIC |
| 162 | /* This is Malta specific: IPI,performance and timer interrupts */ | 162 | /* This is Malta specific: IPI,performance and timer interrupts */ |
| 163 | if (gic_present) | 163 | if (gic_present) |
| 164 | change_c0_status(ST0_IM, STATUSF_IP3 | STATUSF_IP4 | | 164 | change_c0_status(ST0_IM, STATUSF_IP2 | STATUSF_IP3 | |
| 165 | STATUSF_IP4 | STATUSF_IP5 | | ||
| 165 | STATUSF_IP6 | STATUSF_IP7); | 166 | STATUSF_IP6 | STATUSF_IP7); |
| 166 | else | 167 | else |
| 167 | #endif | 168 | #endif |
diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c index c94c4e92e17d..1c0d8c50b7e1 100644 --- a/arch/mips/kernel/smp.c +++ b/arch/mips/kernel/smp.c | |||
| @@ -123,10 +123,10 @@ asmlinkage void start_secondary(void) | |||
| 123 | unsigned int cpu; | 123 | unsigned int cpu; |
| 124 | 124 | ||
| 125 | cpu_probe(); | 125 | cpu_probe(); |
| 126 | cpu_report(); | ||
| 127 | per_cpu_trap_init(false); | 126 | per_cpu_trap_init(false); |
| 128 | mips_clockevent_init(); | 127 | mips_clockevent_init(); |
| 129 | mp_ops->init_secondary(); | 128 | mp_ops->init_secondary(); |
| 129 | cpu_report(); | ||
| 130 | 130 | ||
| 131 | /* | 131 | /* |
| 132 | * XXX parity protection should be folded in here when it's converted | 132 | * XXX parity protection should be folded in here when it's converted |
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index ad3d2031c327..c3b41e24c05a 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c | |||
| @@ -1231,7 +1231,8 @@ static int enable_restore_fp_context(int msa) | |||
| 1231 | 1231 | ||
| 1232 | /* Restore the scalar FP control & status register */ | 1232 | /* Restore the scalar FP control & status register */ |
| 1233 | if (!was_fpu_owner) | 1233 | if (!was_fpu_owner) |
| 1234 | asm volatile("ctc1 %0, $31" : : "r"(current->thread.fpu.fcr31)); | 1234 | write_32bit_cp1_register(CP1_STATUS, |
| 1235 | current->thread.fpu.fcr31); | ||
| 1235 | } | 1236 | } |
| 1236 | 1237 | ||
| 1237 | out: | 1238 | out: |
diff --git a/arch/mips/mm/fault.c b/arch/mips/mm/fault.c index becc42bb1849..70ab5d664332 100644 --- a/arch/mips/mm/fault.c +++ b/arch/mips/mm/fault.c | |||
| @@ -158,6 +158,8 @@ good_area: | |||
| 158 | if (unlikely(fault & VM_FAULT_ERROR)) { | 158 | if (unlikely(fault & VM_FAULT_ERROR)) { |
| 159 | if (fault & VM_FAULT_OOM) | 159 | if (fault & VM_FAULT_OOM) |
| 160 | goto out_of_memory; | 160 | goto out_of_memory; |
| 161 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 162 | goto bad_area; | ||
| 161 | else if (fault & VM_FAULT_SIGBUS) | 163 | else if (fault & VM_FAULT_SIGBUS) |
| 162 | goto do_sigbus; | 164 | goto do_sigbus; |
| 163 | BUG(); | 165 | BUG(); |
diff --git a/arch/mips/mm/tlb-r4k.c b/arch/mips/mm/tlb-r4k.c index e90b2e899291..30639a6e9b8c 100644 --- a/arch/mips/mm/tlb-r4k.c +++ b/arch/mips/mm/tlb-r4k.c | |||
| @@ -489,6 +489,8 @@ static void r4k_tlb_configure(void) | |||
| 489 | #ifdef CONFIG_64BIT | 489 | #ifdef CONFIG_64BIT |
| 490 | pg |= PG_ELPA; | 490 | pg |= PG_ELPA; |
| 491 | #endif | 491 | #endif |
| 492 | if (cpu_has_rixiex) | ||
| 493 | pg |= PG_IEC; | ||
| 492 | write_c0_pagegrain(pg); | 494 | write_c0_pagegrain(pg); |
| 493 | } | 495 | } |
| 494 | 496 | ||
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/include/asm/cacheflush.h b/arch/mn10300/include/asm/cacheflush.h index faed90240ded..6d6df839948f 100644 --- a/arch/mn10300/include/asm/cacheflush.h +++ b/arch/mn10300/include/asm/cacheflush.h | |||
| @@ -159,13 +159,6 @@ extern void flush_icache_range(unsigned long start, unsigned long end); | |||
| 159 | #define copy_from_user_page(vma, page, vaddr, dst, src, len) \ | 159 | #define copy_from_user_page(vma, page, vaddr, dst, src, len) \ |
| 160 | memcpy(dst, src, len) | 160 | memcpy(dst, src, len) |
| 161 | 161 | ||
| 162 | /* | ||
| 163 | * Internal debugging function | ||
| 164 | */ | ||
| 165 | #ifdef CONFIG_DEBUG_PAGEALLOC | ||
| 166 | extern void kernel_map_pages(struct page *page, int numpages, int enable); | ||
| 167 | #endif | ||
| 168 | |||
| 169 | #endif /* __ASSEMBLY__ */ | 162 | #endif /* __ASSEMBLY__ */ |
| 170 | 163 | ||
| 171 | #endif /* _ASM_CACHEFLUSH_H */ | 164 | #endif /* _ASM_CACHEFLUSH_H */ |
diff --git a/arch/mn10300/mm/fault.c b/arch/mn10300/mm/fault.c index 3516cbdf1ee9..0c2cc5d39c8e 100644 --- a/arch/mn10300/mm/fault.c +++ b/arch/mn10300/mm/fault.c | |||
| @@ -262,6 +262,8 @@ good_area: | |||
| 262 | if (unlikely(fault & VM_FAULT_ERROR)) { | 262 | if (unlikely(fault & VM_FAULT_ERROR)) { |
| 263 | if (fault & VM_FAULT_OOM) | 263 | if (fault & VM_FAULT_OOM) |
| 264 | goto out_of_memory; | 264 | goto out_of_memory; |
| 265 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 266 | goto bad_area; | ||
| 265 | else if (fault & VM_FAULT_SIGBUS) | 267 | else if (fault & VM_FAULT_SIGBUS) |
| 266 | goto do_sigbus; | 268 | goto do_sigbus; |
| 267 | BUG(); | 269 | BUG(); |
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/nios2/mm/fault.c b/arch/nios2/mm/fault.c index 15a0bb5fc06d..34429d5a0ccd 100644 --- a/arch/nios2/mm/fault.c +++ b/arch/nios2/mm/fault.c | |||
| @@ -135,6 +135,8 @@ survive: | |||
| 135 | if (unlikely(fault & VM_FAULT_ERROR)) { | 135 | if (unlikely(fault & VM_FAULT_ERROR)) { |
| 136 | if (fault & VM_FAULT_OOM) | 136 | if (fault & VM_FAULT_OOM) |
| 137 | goto out_of_memory; | 137 | goto out_of_memory; |
| 138 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 139 | goto bad_area; | ||
| 138 | else if (fault & VM_FAULT_SIGBUS) | 140 | else if (fault & VM_FAULT_SIGBUS) |
| 139 | goto do_sigbus; | 141 | goto do_sigbus; |
| 140 | BUG(); | 142 | BUG(); |
diff --git a/arch/openrisc/mm/fault.c b/arch/openrisc/mm/fault.c index 0703acf7d327..230ac20ae794 100644 --- a/arch/openrisc/mm/fault.c +++ b/arch/openrisc/mm/fault.c | |||
| @@ -171,6 +171,8 @@ good_area: | |||
| 171 | if (unlikely(fault & VM_FAULT_ERROR)) { | 171 | if (unlikely(fault & VM_FAULT_ERROR)) { |
| 172 | if (fault & VM_FAULT_OOM) | 172 | if (fault & VM_FAULT_OOM) |
| 173 | goto out_of_memory; | 173 | goto out_of_memory; |
| 174 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 175 | goto bad_area; | ||
| 174 | else if (fault & VM_FAULT_SIGBUS) | 176 | else if (fault & VM_FAULT_SIGBUS) |
| 175 | goto do_sigbus; | 177 | goto do_sigbus; |
| 176 | BUG(); | 178 | BUG(); |
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/parisc/mm/fault.c b/arch/parisc/mm/fault.c index 3ca9c1131cfe..e5120e653240 100644 --- a/arch/parisc/mm/fault.c +++ b/arch/parisc/mm/fault.c | |||
| @@ -256,6 +256,8 @@ good_area: | |||
| 256 | */ | 256 | */ |
| 257 | if (fault & VM_FAULT_OOM) | 257 | if (fault & VM_FAULT_OOM) |
| 258 | goto out_of_memory; | 258 | goto out_of_memory; |
| 259 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 260 | goto bad_area; | ||
| 259 | else if (fault & VM_FAULT_SIGBUS) | 261 | else if (fault & VM_FAULT_SIGBUS) |
| 260 | goto bad_area; | 262 | goto bad_area; |
| 261 | BUG(); | 263 | BUG(); |
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/cacheflush.h b/arch/powerpc/include/asm/cacheflush.h index 5b9312220e84..30b35fff2dea 100644 --- a/arch/powerpc/include/asm/cacheflush.h +++ b/arch/powerpc/include/asm/cacheflush.h | |||
| @@ -60,13 +60,6 @@ extern void flush_dcache_phys_range(unsigned long start, unsigned long stop); | |||
| 60 | #define copy_from_user_page(vma, page, vaddr, dst, src, len) \ | 60 | #define copy_from_user_page(vma, page, vaddr, dst, src, len) \ |
| 61 | memcpy(dst, src, len) | 61 | memcpy(dst, src, len) |
| 62 | 62 | ||
| 63 | |||
| 64 | |||
| 65 | #ifdef CONFIG_DEBUG_PAGEALLOC | ||
| 66 | /* internal debugging function */ | ||
| 67 | void kernel_map_pages(struct page *page, int numpages, int enable); | ||
| 68 | #endif | ||
| 69 | |||
| 70 | #endif /* __KERNEL__ */ | 63 | #endif /* __KERNEL__ */ |
| 71 | 64 | ||
| 72 | #endif /* _ASM_POWERPC_CACHEFLUSH_H */ | 65 | #endif /* _ASM_POWERPC_CACHEFLUSH_H */ |
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/mm/copro_fault.c b/arch/powerpc/mm/copro_fault.c index 5a236f082c78..1b5305d4bdab 100644 --- a/arch/powerpc/mm/copro_fault.c +++ b/arch/powerpc/mm/copro_fault.c | |||
| @@ -76,7 +76,7 @@ int copro_handle_mm_fault(struct mm_struct *mm, unsigned long ea, | |||
| 76 | if (*flt & VM_FAULT_OOM) { | 76 | if (*flt & VM_FAULT_OOM) { |
| 77 | ret = -ENOMEM; | 77 | ret = -ENOMEM; |
| 78 | goto out_unlock; | 78 | goto out_unlock; |
| 79 | } else if (*flt & VM_FAULT_SIGBUS) { | 79 | } else if (*flt & (VM_FAULT_SIGBUS | VM_FAULT_SIGSEGV)) { |
| 80 | ret = -EFAULT; | 80 | ret = -EFAULT; |
| 81 | goto out_unlock; | 81 | goto out_unlock; |
| 82 | } | 82 | } |
diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c index eb79907f34fa..6154b0a2b063 100644 --- a/arch/powerpc/mm/fault.c +++ b/arch/powerpc/mm/fault.c | |||
| @@ -437,6 +437,8 @@ good_area: | |||
| 437 | */ | 437 | */ |
| 438 | fault = handle_mm_fault(mm, vma, address, flags); | 438 | fault = handle_mm_fault(mm, vma, address, flags); |
| 439 | if (unlikely(fault & (VM_FAULT_RETRY|VM_FAULT_ERROR))) { | 439 | if (unlikely(fault & (VM_FAULT_RETRY|VM_FAULT_ERROR))) { |
| 440 | if (fault & VM_FAULT_SIGSEGV) | ||
| 441 | goto bad_area; | ||
| 440 | rc = mm_fault_error(regs, address, fault); | 442 | rc = mm_fault_error(regs, address, fault); |
| 441 | if (rc >= MM_FAULT_RETURN) | 443 | if (rc >= MM_FAULT_RETURN) |
| 442 | goto bail; | 444 | goto bail; |
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/hypfs/hypfs_vm.c b/arch/s390/hypfs/hypfs_vm.c index 32040ace00ea..afbe07907c10 100644 --- a/arch/s390/hypfs/hypfs_vm.c +++ b/arch/s390/hypfs/hypfs_vm.c | |||
| @@ -231,7 +231,7 @@ failed: | |||
| 231 | struct dbfs_d2fc_hdr { | 231 | struct dbfs_d2fc_hdr { |
| 232 | u64 len; /* Length of d2fc buffer without header */ | 232 | u64 len; /* Length of d2fc buffer without header */ |
| 233 | u16 version; /* Version of header */ | 233 | u16 version; /* Version of header */ |
| 234 | char tod_ext[16]; /* TOD clock for d2fc */ | 234 | char tod_ext[STORE_CLOCK_EXT_SIZE]; /* TOD clock for d2fc */ |
| 235 | u64 count; /* Number of VM guests in d2fc buffer */ | 235 | u64 count; /* Number of VM guests in d2fc buffer */ |
| 236 | char reserved[30]; | 236 | char reserved[30]; |
| 237 | } __attribute__ ((packed)); | 237 | } __attribute__ ((packed)); |
diff --git a/arch/s390/include/asm/cacheflush.h b/arch/s390/include/asm/cacheflush.h index 3e20383d0921..58fae7d098cf 100644 --- a/arch/s390/include/asm/cacheflush.h +++ b/arch/s390/include/asm/cacheflush.h | |||
| @@ -4,10 +4,6 @@ | |||
| 4 | /* Caches aren't brain-dead on the s390. */ | 4 | /* Caches aren't brain-dead on the s390. */ |
| 5 | #include <asm-generic/cacheflush.h> | 5 | #include <asm-generic/cacheflush.h> |
| 6 | 6 | ||
| 7 | #ifdef CONFIG_DEBUG_PAGEALLOC | ||
| 8 | void kernel_map_pages(struct page *page, int numpages, int enable); | ||
| 9 | #endif | ||
| 10 | |||
| 11 | int set_memory_ro(unsigned long addr, int numpages); | 7 | int set_memory_ro(unsigned long addr, int numpages); |
| 12 | int set_memory_rw(unsigned long addr, int numpages); | 8 | int set_memory_rw(unsigned long addr, int numpages); |
| 13 | int set_memory_nx(unsigned long addr, int numpages); | 9 | int set_memory_nx(unsigned long addr, int numpages); |
diff --git a/arch/s390/include/asm/irqflags.h b/arch/s390/include/asm/irqflags.h index 37b9091ab8c0..16aa0c779e07 100644 --- a/arch/s390/include/asm/irqflags.h +++ b/arch/s390/include/asm/irqflags.h | |||
| @@ -36,7 +36,7 @@ static inline notrace void __arch_local_irq_ssm(unsigned long flags) | |||
| 36 | 36 | ||
| 37 | static inline notrace unsigned long arch_local_save_flags(void) | 37 | static inline notrace unsigned long arch_local_save_flags(void) |
| 38 | { | 38 | { |
| 39 | return __arch_local_irq_stosm(0x00); | 39 | return __arch_local_irq_stnsm(0xff); |
| 40 | } | 40 | } |
| 41 | 41 | ||
| 42 | static inline notrace unsigned long arch_local_irq_save(void) | 42 | static inline notrace unsigned long arch_local_irq_save(void) |
diff --git a/arch/s390/include/asm/timex.h b/arch/s390/include/asm/timex.h index 8beee1cceba4..98eb2a579223 100644 --- a/arch/s390/include/asm/timex.h +++ b/arch/s390/include/asm/timex.h | |||
| @@ -67,20 +67,22 @@ static inline void local_tick_enable(unsigned long long comp) | |||
| 67 | set_clock_comparator(S390_lowcore.clock_comparator); | 67 | set_clock_comparator(S390_lowcore.clock_comparator); |
| 68 | } | 68 | } |
| 69 | 69 | ||
| 70 | #define CLOCK_TICK_RATE 1193180 /* Underlying HZ */ | 70 | #define CLOCK_TICK_RATE 1193180 /* Underlying HZ */ |
| 71 | #define STORE_CLOCK_EXT_SIZE 16 /* stcke writes 16 bytes */ | ||
| 71 | 72 | ||
| 72 | typedef unsigned long long cycles_t; | 73 | typedef unsigned long long cycles_t; |
| 73 | 74 | ||
| 74 | static inline void get_tod_clock_ext(char clk[16]) | 75 | static inline void get_tod_clock_ext(char *clk) |
| 75 | { | 76 | { |
| 76 | typedef struct { char _[sizeof(clk)]; } addrtype; | 77 | typedef struct { char _[STORE_CLOCK_EXT_SIZE]; } addrtype; |
| 77 | 78 | ||
| 78 | asm volatile("stcke %0" : "=Q" (*(addrtype *) clk) : : "cc"); | 79 | asm volatile("stcke %0" : "=Q" (*(addrtype *) clk) : : "cc"); |
| 79 | } | 80 | } |
| 80 | 81 | ||
| 81 | static inline unsigned long long get_tod_clock(void) | 82 | static inline unsigned long long get_tod_clock(void) |
| 82 | { | 83 | { |
| 83 | unsigned char clk[16]; | 84 | unsigned char clk[STORE_CLOCK_EXT_SIZE]; |
| 85 | |||
| 84 | get_tod_clock_ext(clk); | 86 | get_tod_clock_ext(clk); |
| 85 | return *((unsigned long long *)&clk[1]); | 87 | return *((unsigned long long *)&clk[1]); |
| 86 | } | 88 | } |
diff --git a/arch/s390/include/uapi/asm/unistd.h b/arch/s390/include/uapi/asm/unistd.h index 2b446cf0cc65..67878af257a0 100644 --- a/arch/s390/include/uapi/asm/unistd.h +++ b/arch/s390/include/uapi/asm/unistd.h | |||
| @@ -289,7 +289,8 @@ | |||
| 289 | #define __NR_bpf 351 | 289 | #define __NR_bpf 351 |
| 290 | #define __NR_s390_pci_mmio_write 352 | 290 | #define __NR_s390_pci_mmio_write 352 |
| 291 | #define __NR_s390_pci_mmio_read 353 | 291 | #define __NR_s390_pci_mmio_read 353 |
| 292 | #define NR_syscalls 354 | 292 | #define __NR_execveat 354 |
| 293 | #define NR_syscalls 355 | ||
| 293 | 294 | ||
| 294 | /* | 295 | /* |
| 295 | * There are some system calls that are not present on 64 bit, some | 296 | * There are some system calls that are not present on 64 bit, some |
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/kernel/syscalls.S b/arch/s390/kernel/syscalls.S index a2987243bc76..939ec474b1dd 100644 --- a/arch/s390/kernel/syscalls.S +++ b/arch/s390/kernel/syscalls.S | |||
| @@ -362,3 +362,4 @@ SYSCALL(sys_memfd_create,sys_memfd_create,compat_sys_memfd_create) /* 350 */ | |||
| 362 | SYSCALL(sys_bpf,sys_bpf,compat_sys_bpf) | 362 | SYSCALL(sys_bpf,sys_bpf,compat_sys_bpf) |
| 363 | SYSCALL(sys_ni_syscall,sys_s390_pci_mmio_write,compat_sys_s390_pci_mmio_write) | 363 | SYSCALL(sys_ni_syscall,sys_s390_pci_mmio_write,compat_sys_s390_pci_mmio_write) |
| 364 | SYSCALL(sys_ni_syscall,sys_s390_pci_mmio_read,compat_sys_s390_pci_mmio_read) | 364 | SYSCALL(sys_ni_syscall,sys_s390_pci_mmio_read,compat_sys_s390_pci_mmio_read) |
| 365 | SYSCALL(sys_execveat,sys_execveat,compat_sys_execveat) | ||
diff --git a/arch/s390/kernel/uprobes.c b/arch/s390/kernel/uprobes.c index f6b3cd056ec2..cc7328080b60 100644 --- a/arch/s390/kernel/uprobes.c +++ b/arch/s390/kernel/uprobes.c | |||
| @@ -48,6 +48,30 @@ bool arch_uprobe_xol_was_trapped(struct task_struct *tsk) | |||
| 48 | return false; | 48 | return false; |
| 49 | } | 49 | } |
| 50 | 50 | ||
| 51 | static int check_per_event(unsigned short cause, unsigned long control, | ||
| 52 | struct pt_regs *regs) | ||
| 53 | { | ||
| 54 | if (!(regs->psw.mask & PSW_MASK_PER)) | ||
| 55 | return 0; | ||
| 56 | /* user space single step */ | ||
| 57 | if (control == 0) | ||
| 58 | return 1; | ||
| 59 | /* over indication for storage alteration */ | ||
| 60 | if ((control & 0x20200000) && (cause & 0x2000)) | ||
| 61 | return 1; | ||
| 62 | if (cause & 0x8000) { | ||
| 63 | /* all branches */ | ||
| 64 | if ((control & 0x80800000) == 0x80000000) | ||
| 65 | return 1; | ||
| 66 | /* branch into selected range */ | ||
| 67 | if (((control & 0x80800000) == 0x80800000) && | ||
| 68 | regs->psw.addr >= current->thread.per_user.start && | ||
| 69 | regs->psw.addr <= current->thread.per_user.end) | ||
| 70 | return 1; | ||
| 71 | } | ||
| 72 | return 0; | ||
| 73 | } | ||
| 74 | |||
| 51 | int arch_uprobe_post_xol(struct arch_uprobe *auprobe, struct pt_regs *regs) | 75 | int arch_uprobe_post_xol(struct arch_uprobe *auprobe, struct pt_regs *regs) |
| 52 | { | 76 | { |
| 53 | int fixup = probe_get_fixup_type(auprobe->insn); | 77 | int fixup = probe_get_fixup_type(auprobe->insn); |
| @@ -71,9 +95,13 @@ int arch_uprobe_post_xol(struct arch_uprobe *auprobe, struct pt_regs *regs) | |||
| 71 | if (regs->psw.addr - utask->xol_vaddr == ilen) | 95 | if (regs->psw.addr - utask->xol_vaddr == ilen) |
| 72 | regs->psw.addr = utask->vaddr + ilen; | 96 | regs->psw.addr = utask->vaddr + ilen; |
| 73 | } | 97 | } |
| 74 | /* If per tracing was active generate trap */ | 98 | if (check_per_event(current->thread.per_event.cause, |
| 75 | if (regs->psw.mask & PSW_MASK_PER) | 99 | current->thread.per_user.control, regs)) { |
| 76 | do_per_trap(regs); | 100 | /* fix per address */ |
| 101 | current->thread.per_event.address = utask->vaddr; | ||
| 102 | /* trigger per event */ | ||
| 103 | set_pt_regs_flag(regs, PIF_PER_TRAP); | ||
| 104 | } | ||
| 77 | return 0; | 105 | return 0; |
| 78 | } | 106 | } |
| 79 | 107 | ||
| @@ -106,6 +134,7 @@ void arch_uprobe_abort_xol(struct arch_uprobe *auprobe, struct pt_regs *regs) | |||
| 106 | clear_thread_flag(TIF_UPROBE_SINGLESTEP); | 134 | clear_thread_flag(TIF_UPROBE_SINGLESTEP); |
| 107 | regs->int_code = auprobe->saved_int_code; | 135 | regs->int_code = auprobe->saved_int_code; |
| 108 | regs->psw.addr = current->utask->vaddr; | 136 | regs->psw.addr = current->utask->vaddr; |
| 137 | current->thread.per_event.address = current->utask->vaddr; | ||
| 109 | } | 138 | } |
| 110 | 139 | ||
| 111 | unsigned long arch_uretprobe_hijack_return_addr(unsigned long trampoline, | 140 | unsigned long arch_uretprobe_hijack_return_addr(unsigned long trampoline, |
| @@ -146,17 +175,20 @@ static void adjust_psw_addr(psw_t *psw, unsigned long len) | |||
| 146 | __rc; \ | 175 | __rc; \ |
| 147 | }) | 176 | }) |
| 148 | 177 | ||
| 149 | #define emu_store_ril(ptr, input) \ | 178 | #define emu_store_ril(regs, ptr, input) \ |
| 150 | ({ \ | 179 | ({ \ |
| 151 | unsigned int mask = sizeof(*(ptr)) - 1; \ | 180 | unsigned int mask = sizeof(*(ptr)) - 1; \ |
| 181 | __typeof__(ptr) __ptr = (ptr); \ | ||
| 152 | int __rc = 0; \ | 182 | int __rc = 0; \ |
| 153 | \ | 183 | \ |
| 154 | if (!test_facility(34)) \ | 184 | if (!test_facility(34)) \ |
| 155 | __rc = EMU_ILLEGAL_OP; \ | 185 | __rc = EMU_ILLEGAL_OP; \ |
| 156 | else if ((u64 __force)ptr & mask) \ | 186 | else if ((u64 __force)__ptr & mask) \ |
| 157 | __rc = EMU_SPECIFICATION; \ | 187 | __rc = EMU_SPECIFICATION; \ |
| 158 | else if (put_user(*(input), ptr)) \ | 188 | else if (put_user(*(input), __ptr)) \ |
| 159 | __rc = EMU_ADDRESSING; \ | 189 | __rc = EMU_ADDRESSING; \ |
| 190 | if (__rc == 0) \ | ||
| 191 | sim_stor_event(regs, __ptr, mask + 1); \ | ||
| 160 | __rc; \ | 192 | __rc; \ |
| 161 | }) | 193 | }) |
| 162 | 194 | ||
| @@ -198,6 +230,25 @@ union split_register { | |||
| 198 | }; | 230 | }; |
| 199 | 231 | ||
| 200 | /* | 232 | /* |
| 233 | * If user per registers are setup to trace storage alterations and an | ||
| 234 | * emulated store took place on a fitting address a user trap is generated. | ||
| 235 | */ | ||
| 236 | static void sim_stor_event(struct pt_regs *regs, void *addr, int len) | ||
| 237 | { | ||
| 238 | if (!(regs->psw.mask & PSW_MASK_PER)) | ||
| 239 | return; | ||
| 240 | if (!(current->thread.per_user.control & PER_EVENT_STORE)) | ||
| 241 | return; | ||
| 242 | if ((void *)current->thread.per_user.start > (addr + len)) | ||
| 243 | return; | ||
| 244 | if ((void *)current->thread.per_user.end < addr) | ||
| 245 | return; | ||
| 246 | current->thread.per_event.address = regs->psw.addr; | ||
| 247 | current->thread.per_event.cause = PER_EVENT_STORE >> 16; | ||
| 248 | set_pt_regs_flag(regs, PIF_PER_TRAP); | ||
| 249 | } | ||
| 250 | |||
| 251 | /* | ||
| 201 | * pc relative instructions are emulated, since parameters may not be | 252 | * pc relative instructions are emulated, since parameters may not be |
| 202 | * accessible from the xol area due to range limitations. | 253 | * accessible from the xol area due to range limitations. |
| 203 | */ | 254 | */ |
| @@ -249,13 +300,13 @@ static void handle_insn_ril(struct arch_uprobe *auprobe, struct pt_regs *regs) | |||
| 249 | rc = emu_load_ril((u32 __user *)uptr, &rx->u64); | 300 | rc = emu_load_ril((u32 __user *)uptr, &rx->u64); |
| 250 | break; | 301 | break; |
| 251 | case 0x07: /* sthrl */ | 302 | case 0x07: /* sthrl */ |
| 252 | rc = emu_store_ril((u16 __user *)uptr, &rx->u16[3]); | 303 | rc = emu_store_ril(regs, (u16 __user *)uptr, &rx->u16[3]); |
| 253 | break; | 304 | break; |
| 254 | case 0x0b: /* stgrl */ | 305 | case 0x0b: /* stgrl */ |
| 255 | rc = emu_store_ril((u64 __user *)uptr, &rx->u64); | 306 | rc = emu_store_ril(regs, (u64 __user *)uptr, &rx->u64); |
| 256 | break; | 307 | break; |
| 257 | case 0x0f: /* strl */ | 308 | case 0x0f: /* strl */ |
| 258 | rc = emu_store_ril((u32 __user *)uptr, &rx->u32[1]); | 309 | rc = emu_store_ril(regs, (u32 __user *)uptr, &rx->u32[1]); |
| 259 | break; | 310 | break; |
| 260 | } | 311 | } |
| 261 | break; | 312 | break; |
diff --git a/arch/s390/kernel/vtime.c b/arch/s390/kernel/vtime.c index 7f0089d9a4aa..e34122e539a1 100644 --- a/arch/s390/kernel/vtime.c +++ b/arch/s390/kernel/vtime.c | |||
| @@ -128,8 +128,6 @@ void vtime_account_irq_enter(struct task_struct *tsk) | |||
| 128 | struct thread_info *ti = task_thread_info(tsk); | 128 | struct thread_info *ti = task_thread_info(tsk); |
| 129 | u64 timer, system; | 129 | u64 timer, system; |
| 130 | 130 | ||
| 131 | WARN_ON_ONCE(!irqs_disabled()); | ||
| 132 | |||
| 133 | timer = S390_lowcore.last_update_timer; | 131 | timer = S390_lowcore.last_update_timer; |
| 134 | S390_lowcore.last_update_timer = get_vtimer(); | 132 | S390_lowcore.last_update_timer = get_vtimer(); |
| 135 | S390_lowcore.system_timer += timer - S390_lowcore.last_update_timer; | 133 | S390_lowcore.system_timer += timer - S390_lowcore.last_update_timer; |
diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c index 811937bb90be..9065d5aa3932 100644 --- a/arch/s390/mm/fault.c +++ b/arch/s390/mm/fault.c | |||
| @@ -374,6 +374,12 @@ static noinline void do_fault_error(struct pt_regs *regs, int fault) | |||
| 374 | do_no_context(regs); | 374 | do_no_context(regs); |
| 375 | else | 375 | else |
| 376 | pagefault_out_of_memory(); | 376 | pagefault_out_of_memory(); |
| 377 | } else if (fault & VM_FAULT_SIGSEGV) { | ||
| 378 | /* Kernel mode? Handle exceptions or die */ | ||
| 379 | if (!user_mode(regs)) | ||
| 380 | do_no_context(regs); | ||
| 381 | else | ||
| 382 | do_sigsegv(regs, SEGV_MAPERR); | ||
| 377 | } else if (fault & VM_FAULT_SIGBUS) { | 383 | } else if (fault & VM_FAULT_SIGBUS) { |
| 378 | /* Kernel mode? Handle exceptions or die */ | 384 | /* Kernel mode? Handle exceptions or die */ |
| 379 | if (!user_mode(regs)) | 385 | if (!user_mode(regs)) |
diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c index be99357d238c..3cf8cc03fff6 100644 --- a/arch/s390/mm/pgtable.c +++ b/arch/s390/mm/pgtable.c | |||
| @@ -322,11 +322,12 @@ static int gmap_alloc_table(struct gmap *gmap, unsigned long *table, | |||
| 322 | static unsigned long __gmap_segment_gaddr(unsigned long *entry) | 322 | static unsigned long __gmap_segment_gaddr(unsigned long *entry) |
| 323 | { | 323 | { |
| 324 | struct page *page; | 324 | struct page *page; |
| 325 | unsigned long offset; | 325 | unsigned long offset, mask; |
| 326 | 326 | ||
| 327 | offset = (unsigned long) entry / sizeof(unsigned long); | 327 | offset = (unsigned long) entry / sizeof(unsigned long); |
| 328 | offset = (offset & (PTRS_PER_PMD - 1)) * PMD_SIZE; | 328 | offset = (offset & (PTRS_PER_PMD - 1)) * PMD_SIZE; |
| 329 | page = pmd_to_page((pmd_t *) entry); | 329 | mask = ~(PTRS_PER_PMD * sizeof(pmd_t) - 1); |
| 330 | page = virt_to_page((void *)((unsigned long) entry & mask)); | ||
| 330 | return page->index + offset; | 331 | return page->index + offset; |
| 331 | } | 332 | } |
| 332 | 333 | ||
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 c52ac77408ca..bbd1981cc150 100644 --- a/arch/s390/net/bpf_jit_comp.c +++ b/arch/s390/net/bpf_jit_comp.c | |||
| @@ -431,8 +431,8 @@ static int bpf_jit_insn(struct bpf_jit *jit, struct sock_filter *filter, | |||
| 431 | EMIT4_DISP(0x88500000, K); | 431 | EMIT4_DISP(0x88500000, K); |
| 432 | break; | 432 | break; |
| 433 | case BPF_ALU | BPF_NEG: /* A = -A */ | 433 | case BPF_ALU | BPF_NEG: /* A = -A */ |
| 434 | /* lnr %r5,%r5 */ | 434 | /* lcr %r5,%r5 */ |
| 435 | EMIT2(0x1155); | 435 | EMIT2(0x1355); |
| 436 | break; | 436 | break; |
| 437 | case BPF_JMP | BPF_JA: /* ip += K */ | 437 | case BPF_JMP | BPF_JA: /* ip += K */ |
| 438 | offset = addrs[i + K] + jit->start - jit->prg; | 438 | offset = addrs[i + K] + jit->start - jit->prg; |
| @@ -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) |
| @@ -502,8 +499,8 @@ branch: if (filter->jt == filter->jf) { | |||
| 502 | xbranch: /* Emit compare if the branch targets are different */ | 499 | xbranch: /* Emit compare if the branch targets are different */ |
| 503 | if (filter->jt != filter->jf) { | 500 | if (filter->jt != filter->jf) { |
| 504 | jit->seen |= SEEN_XREG; | 501 | jit->seen |= SEEN_XREG; |
| 505 | /* cr %r5,%r12 */ | 502 | /* clr %r5,%r12 */ |
| 506 | EMIT2(0x195c); | 503 | EMIT2(0x155c); |
| 507 | } | 504 | } |
| 508 | goto branch; | 505 | goto branch; |
| 509 | case BPF_JMP | BPF_JSET | BPF_X: /* ip += (A & X) ? jt : jf */ | 506 | case BPF_JMP | BPF_JSET | BPF_X: /* ip += (A & X) ? jt : jf */ |
diff --git a/arch/score/mm/fault.c b/arch/score/mm/fault.c index 52238983527d..6860beb2a280 100644 --- a/arch/score/mm/fault.c +++ b/arch/score/mm/fault.c | |||
| @@ -114,6 +114,8 @@ good_area: | |||
| 114 | if (unlikely(fault & VM_FAULT_ERROR)) { | 114 | if (unlikely(fault & VM_FAULT_ERROR)) { |
| 115 | if (fault & VM_FAULT_OOM) | 115 | if (fault & VM_FAULT_OOM) |
| 116 | goto out_of_memory; | 116 | goto out_of_memory; |
| 117 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 118 | goto bad_area; | ||
| 117 | else if (fault & VM_FAULT_SIGBUS) | 119 | else if (fault & VM_FAULT_SIGBUS) |
| 118 | goto do_sigbus; | 120 | goto do_sigbus; |
| 119 | BUG(); | 121 | BUG(); |
diff --git a/arch/sh/mm/fault.c b/arch/sh/mm/fault.c index 541dc6101508..a58fec9b55e0 100644 --- a/arch/sh/mm/fault.c +++ b/arch/sh/mm/fault.c | |||
| @@ -353,6 +353,8 @@ mm_fault_error(struct pt_regs *regs, unsigned long error_code, | |||
| 353 | } else { | 353 | } else { |
| 354 | if (fault & VM_FAULT_SIGBUS) | 354 | if (fault & VM_FAULT_SIGBUS) |
| 355 | do_sigbus(regs, error_code, address); | 355 | do_sigbus(regs, error_code, address); |
| 356 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 357 | bad_area(regs, error_code, address); | ||
| 356 | else | 358 | else |
| 357 | BUG(); | 359 | BUG(); |
| 358 | } | 360 | } |
diff --git a/arch/sparc/include/asm/cacheflush_64.h b/arch/sparc/include/asm/cacheflush_64.h index 38965379e350..68513c41e10d 100644 --- a/arch/sparc/include/asm/cacheflush_64.h +++ b/arch/sparc/include/asm/cacheflush_64.h | |||
| @@ -74,11 +74,6 @@ void flush_ptrace_access(struct vm_area_struct *, struct page *, | |||
| 74 | #define flush_cache_vmap(start, end) do { } while (0) | 74 | #define flush_cache_vmap(start, end) do { } while (0) |
| 75 | #define flush_cache_vunmap(start, end) do { } while (0) | 75 | #define flush_cache_vunmap(start, end) do { } while (0) |
| 76 | 76 | ||
| 77 | #ifdef CONFIG_DEBUG_PAGEALLOC | ||
| 78 | /* internal debugging function */ | ||
| 79 | void kernel_map_pages(struct page *page, int numpages, int enable); | ||
| 80 | #endif | ||
| 81 | |||
| 82 | #endif /* !__ASSEMBLY__ */ | 77 | #endif /* !__ASSEMBLY__ */ |
| 83 | 78 | ||
| 84 | #endif /* _SPARC64_CACHEFLUSH_H */ | 79 | #endif /* _SPARC64_CACHEFLUSH_H */ |
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/mm/fault_32.c b/arch/sparc/mm/fault_32.c index 908e8c17c902..70d817154fe8 100644 --- a/arch/sparc/mm/fault_32.c +++ b/arch/sparc/mm/fault_32.c | |||
| @@ -249,6 +249,8 @@ good_area: | |||
| 249 | if (unlikely(fault & VM_FAULT_ERROR)) { | 249 | if (unlikely(fault & VM_FAULT_ERROR)) { |
| 250 | if (fault & VM_FAULT_OOM) | 250 | if (fault & VM_FAULT_OOM) |
| 251 | goto out_of_memory; | 251 | goto out_of_memory; |
| 252 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 253 | goto bad_area; | ||
| 252 | else if (fault & VM_FAULT_SIGBUS) | 254 | else if (fault & VM_FAULT_SIGBUS) |
| 253 | goto do_sigbus; | 255 | goto do_sigbus; |
| 254 | BUG(); | 256 | BUG(); |
diff --git a/arch/sparc/mm/fault_64.c b/arch/sparc/mm/fault_64.c index 18fcd7167095..479823249429 100644 --- a/arch/sparc/mm/fault_64.c +++ b/arch/sparc/mm/fault_64.c | |||
| @@ -446,6 +446,8 @@ good_area: | |||
| 446 | if (unlikely(fault & VM_FAULT_ERROR)) { | 446 | if (unlikely(fault & VM_FAULT_ERROR)) { |
| 447 | if (fault & VM_FAULT_OOM) | 447 | if (fault & VM_FAULT_OOM) |
| 448 | goto out_of_memory; | 448 | goto out_of_memory; |
| 449 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 450 | goto bad_area; | ||
| 449 | else if (fault & VM_FAULT_SIGBUS) | 451 | else if (fault & VM_FAULT_SIGBUS) |
| 450 | goto do_sigbus; | 452 | goto do_sigbus; |
| 451 | BUG(); | 453 | BUG(); |
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/tile/mm/fault.c b/arch/tile/mm/fault.c index 565e25a98334..0f61a73534e6 100644 --- a/arch/tile/mm/fault.c +++ b/arch/tile/mm/fault.c | |||
| @@ -442,6 +442,8 @@ good_area: | |||
| 442 | if (unlikely(fault & VM_FAULT_ERROR)) { | 442 | if (unlikely(fault & VM_FAULT_ERROR)) { |
| 443 | if (fault & VM_FAULT_OOM) | 443 | if (fault & VM_FAULT_OOM) |
| 444 | goto out_of_memory; | 444 | goto out_of_memory; |
| 445 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 446 | goto bad_area; | ||
| 445 | else if (fault & VM_FAULT_SIGBUS) | 447 | else if (fault & VM_FAULT_SIGBUS) |
| 446 | goto do_sigbus; | 448 | goto do_sigbus; |
| 447 | BUG(); | 449 | BUG(); |
diff --git a/arch/um/kernel/trap.c b/arch/um/kernel/trap.c index 5678c3571e7c..209617302df8 100644 --- a/arch/um/kernel/trap.c +++ b/arch/um/kernel/trap.c | |||
| @@ -80,6 +80,8 @@ good_area: | |||
| 80 | if (unlikely(fault & VM_FAULT_ERROR)) { | 80 | if (unlikely(fault & VM_FAULT_ERROR)) { |
| 81 | if (fault & VM_FAULT_OOM) { | 81 | if (fault & VM_FAULT_OOM) { |
| 82 | goto out_of_memory; | 82 | goto out_of_memory; |
| 83 | } else if (fault & VM_FAULT_SIGSEGV) { | ||
| 84 | goto out; | ||
| 83 | } else if (fault & VM_FAULT_SIGBUS) { | 85 | } else if (fault & VM_FAULT_SIGBUS) { |
| 84 | err = -EACCES; | 86 | err = -EACCES; |
| 85 | goto out; | 87 | goto out; |
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/Makefile b/arch/x86/boot/Makefile index 5b016e2498f3..3db07f30636f 100644 --- a/arch/x86/boot/Makefile +++ b/arch/x86/boot/Makefile | |||
| @@ -51,6 +51,7 @@ targets += cpustr.h | |||
| 51 | $(obj)/cpustr.h: $(obj)/mkcpustr FORCE | 51 | $(obj)/cpustr.h: $(obj)/mkcpustr FORCE |
| 52 | $(call if_changed,cpustr) | 52 | $(call if_changed,cpustr) |
| 53 | endif | 53 | endif |
| 54 | clean-files += cpustr.h | ||
| 54 | 55 | ||
| 55 | # --------------------------------------------------------------------------- | 56 | # --------------------------------------------------------------------------- |
| 56 | 57 | ||
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/Makefile b/arch/x86/crypto/Makefile index fd0f848938cc..5a4a089e8b1f 100644 --- a/arch/x86/crypto/Makefile +++ b/arch/x86/crypto/Makefile | |||
| @@ -26,7 +26,6 @@ obj-$(CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL) += ghash-clmulni-intel.o | |||
| 26 | 26 | ||
| 27 | obj-$(CONFIG_CRYPTO_CRC32C_INTEL) += crc32c-intel.o | 27 | obj-$(CONFIG_CRYPTO_CRC32C_INTEL) += crc32c-intel.o |
| 28 | obj-$(CONFIG_CRYPTO_SHA1_SSSE3) += sha1-ssse3.o | 28 | obj-$(CONFIG_CRYPTO_SHA1_SSSE3) += sha1-ssse3.o |
| 29 | obj-$(CONFIG_CRYPTO_SHA1_MB) += sha-mb/ | ||
| 30 | obj-$(CONFIG_CRYPTO_CRC32_PCLMUL) += crc32-pclmul.o | 29 | obj-$(CONFIG_CRYPTO_CRC32_PCLMUL) += crc32-pclmul.o |
| 31 | obj-$(CONFIG_CRYPTO_SHA256_SSSE3) += sha256-ssse3.o | 30 | obj-$(CONFIG_CRYPTO_SHA256_SSSE3) += sha256-ssse3.o |
| 32 | obj-$(CONFIG_CRYPTO_SHA512_SSSE3) += sha512-ssse3.o | 31 | obj-$(CONFIG_CRYPTO_SHA512_SSSE3) += sha512-ssse3.o |
| @@ -46,6 +45,7 @@ endif | |||
| 46 | ifeq ($(avx2_supported),yes) | 45 | ifeq ($(avx2_supported),yes) |
| 47 | obj-$(CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64) += camellia-aesni-avx2.o | 46 | obj-$(CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64) += camellia-aesni-avx2.o |
| 48 | obj-$(CONFIG_CRYPTO_SERPENT_AVX2_X86_64) += serpent-avx2.o | 47 | obj-$(CONFIG_CRYPTO_SERPENT_AVX2_X86_64) += serpent-avx2.o |
| 48 | obj-$(CONFIG_CRYPTO_SHA1_MB) += sha-mb/ | ||
| 49 | endif | 49 | endif |
| 50 | 50 | ||
| 51 | aes-i586-y := aes-i586-asm_32.o aes_glue.o | 51 | aes-i586-y := aes-i586-asm_32.o aes_glue.o |
diff --git a/arch/x86/crypto/aes_ctrby8_avx-x86_64.S b/arch/x86/crypto/aes_ctrby8_avx-x86_64.S index 2df2a0298f5a..a916c4a61165 100644 --- a/arch/x86/crypto/aes_ctrby8_avx-x86_64.S +++ b/arch/x86/crypto/aes_ctrby8_avx-x86_64.S | |||
| @@ -208,7 +208,7 @@ ddq_add_8: | |||
| 208 | 208 | ||
| 209 | .if (klen == KEY_128) | 209 | .if (klen == KEY_128) |
| 210 | .if (load_keys) | 210 | .if (load_keys) |
| 211 | vmovdqa 3*16(p_keys), xkeyA | 211 | vmovdqa 3*16(p_keys), xkey4 |
| 212 | .endif | 212 | .endif |
| 213 | .else | 213 | .else |
| 214 | vmovdqa 3*16(p_keys), xkeyA | 214 | vmovdqa 3*16(p_keys), xkeyA |
| @@ -224,7 +224,7 @@ ddq_add_8: | |||
| 224 | add $(16*by), p_in | 224 | add $(16*by), p_in |
| 225 | 225 | ||
| 226 | .if (klen == KEY_128) | 226 | .if (klen == KEY_128) |
| 227 | vmovdqa 4*16(p_keys), xkey4 | 227 | vmovdqa 4*16(p_keys), xkeyB |
| 228 | .else | 228 | .else |
| 229 | .if (load_keys) | 229 | .if (load_keys) |
| 230 | vmovdqa 4*16(p_keys), xkey4 | 230 | vmovdqa 4*16(p_keys), xkey4 |
| @@ -234,7 +234,12 @@ ddq_add_8: | |||
| 234 | .set i, 0 | 234 | .set i, 0 |
| 235 | .rept by | 235 | .rept by |
| 236 | club XDATA, i | 236 | club XDATA, i |
| 237 | vaesenc xkeyA, var_xdata, var_xdata /* key 3 */ | 237 | /* key 3 */ |
| 238 | .if (klen == KEY_128) | ||
| 239 | vaesenc xkey4, var_xdata, var_xdata | ||
| 240 | .else | ||
| 241 | vaesenc xkeyA, var_xdata, var_xdata | ||
| 242 | .endif | ||
| 238 | .set i, (i +1) | 243 | .set i, (i +1) |
| 239 | .endr | 244 | .endr |
| 240 | 245 | ||
| @@ -243,13 +248,18 @@ ddq_add_8: | |||
| 243 | .set i, 0 | 248 | .set i, 0 |
| 244 | .rept by | 249 | .rept by |
| 245 | club XDATA, i | 250 | club XDATA, i |
| 246 | vaesenc xkey4, var_xdata, var_xdata /* key 4 */ | 251 | /* key 4 */ |
| 252 | .if (klen == KEY_128) | ||
| 253 | vaesenc xkeyB, var_xdata, var_xdata | ||
| 254 | .else | ||
| 255 | vaesenc xkey4, var_xdata, var_xdata | ||
| 256 | .endif | ||
| 247 | .set i, (i +1) | 257 | .set i, (i +1) |
| 248 | .endr | 258 | .endr |
| 249 | 259 | ||
| 250 | .if (klen == KEY_128) | 260 | .if (klen == KEY_128) |
| 251 | .if (load_keys) | 261 | .if (load_keys) |
| 252 | vmovdqa 6*16(p_keys), xkeyB | 262 | vmovdqa 6*16(p_keys), xkey8 |
| 253 | .endif | 263 | .endif |
| 254 | .else | 264 | .else |
| 255 | vmovdqa 6*16(p_keys), xkeyB | 265 | vmovdqa 6*16(p_keys), xkeyB |
| @@ -267,12 +277,17 @@ ddq_add_8: | |||
| 267 | .set i, 0 | 277 | .set i, 0 |
| 268 | .rept by | 278 | .rept by |
| 269 | club XDATA, i | 279 | club XDATA, i |
| 270 | vaesenc xkeyB, var_xdata, var_xdata /* key 6 */ | 280 | /* key 6 */ |
| 281 | .if (klen == KEY_128) | ||
| 282 | vaesenc xkey8, var_xdata, var_xdata | ||
| 283 | .else | ||
| 284 | vaesenc xkeyB, var_xdata, var_xdata | ||
| 285 | .endif | ||
| 271 | .set i, (i +1) | 286 | .set i, (i +1) |
| 272 | .endr | 287 | .endr |
| 273 | 288 | ||
| 274 | .if (klen == KEY_128) | 289 | .if (klen == KEY_128) |
| 275 | vmovdqa 8*16(p_keys), xkey8 | 290 | vmovdqa 8*16(p_keys), xkeyB |
| 276 | .else | 291 | .else |
| 277 | .if (load_keys) | 292 | .if (load_keys) |
| 278 | vmovdqa 8*16(p_keys), xkey8 | 293 | vmovdqa 8*16(p_keys), xkey8 |
| @@ -288,7 +303,7 @@ ddq_add_8: | |||
| 288 | 303 | ||
| 289 | .if (klen == KEY_128) | 304 | .if (klen == KEY_128) |
| 290 | .if (load_keys) | 305 | .if (load_keys) |
| 291 | vmovdqa 9*16(p_keys), xkeyA | 306 | vmovdqa 9*16(p_keys), xkey12 |
| 292 | .endif | 307 | .endif |
| 293 | .else | 308 | .else |
| 294 | vmovdqa 9*16(p_keys), xkeyA | 309 | vmovdqa 9*16(p_keys), xkeyA |
| @@ -297,7 +312,12 @@ ddq_add_8: | |||
| 297 | .set i, 0 | 312 | .set i, 0 |
| 298 | .rept by | 313 | .rept by |
| 299 | club XDATA, i | 314 | club XDATA, i |
| 300 | vaesenc xkey8, var_xdata, var_xdata /* key 8 */ | 315 | /* key 8 */ |
| 316 | .if (klen == KEY_128) | ||
| 317 | vaesenc xkeyB, var_xdata, var_xdata | ||
| 318 | .else | ||
| 319 | vaesenc xkey8, var_xdata, var_xdata | ||
| 320 | .endif | ||
| 301 | .set i, (i +1) | 321 | .set i, (i +1) |
| 302 | .endr | 322 | .endr |
| 303 | 323 | ||
| @@ -306,7 +326,12 @@ ddq_add_8: | |||
| 306 | .set i, 0 | 326 | .set i, 0 |
| 307 | .rept by | 327 | .rept by |
| 308 | club XDATA, i | 328 | club XDATA, i |
| 309 | vaesenc xkeyA, var_xdata, var_xdata /* key 9 */ | 329 | /* key 9 */ |
| 330 | .if (klen == KEY_128) | ||
| 331 | vaesenc xkey12, var_xdata, var_xdata | ||
| 332 | .else | ||
| 333 | vaesenc xkeyA, var_xdata, var_xdata | ||
| 334 | .endif | ||
| 310 | .set i, (i +1) | 335 | .set i, (i +1) |
| 311 | .endr | 336 | .endr |
| 312 | 337 | ||
| @@ -412,7 +437,6 @@ ddq_add_8: | |||
| 412 | /* main body of aes ctr load */ | 437 | /* main body of aes ctr load */ |
| 413 | 438 | ||
| 414 | .macro do_aes_ctrmain key_len | 439 | .macro do_aes_ctrmain key_len |
| 415 | |||
| 416 | cmp $16, num_bytes | 440 | cmp $16, num_bytes |
| 417 | jb .Ldo_return2\key_len | 441 | jb .Ldo_return2\key_len |
| 418 | 442 | ||
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/include/asm/vgtod.h b/arch/x86/include/asm/vgtod.h index e7e9682a33e9..f556c4843aa1 100644 --- a/arch/x86/include/asm/vgtod.h +++ b/arch/x86/include/asm/vgtod.h | |||
| @@ -80,9 +80,11 @@ static inline unsigned int __getcpu(void) | |||
| 80 | 80 | ||
| 81 | /* | 81 | /* |
| 82 | * Load per CPU data from GDT. LSL is faster than RDTSCP and | 82 | * Load per CPU data from GDT. LSL is faster than RDTSCP and |
| 83 | * works on all CPUs. | 83 | * works on all CPUs. This is volatile so that it orders |
| 84 | * correctly wrt barrier() and to keep gcc from cleverly | ||
| 85 | * hoisting it out of the calling function. | ||
| 84 | */ | 86 | */ |
| 85 | asm("lsl %1,%0" : "=r" (p) : "r" (__PER_CPU_SEG)); | 87 | asm volatile ("lsl %1,%0" : "=r" (p) : "r" (__PER_CPU_SEG)); |
| 86 | 88 | ||
| 87 | return p; | 89 | return p; |
| 88 | } | 90 | } |
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index 4433a4be8171..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 | ||
| @@ -750,13 +750,13 @@ static int _acpi_map_lsapic(acpi_handle handle, int physid, int *pcpu) | |||
| 750 | } | 750 | } |
| 751 | 751 | ||
| 752 | /* wrapper to silence section mismatch warning */ | 752 | /* wrapper to silence section mismatch warning */ |
| 753 | int __ref acpi_map_lsapic(acpi_handle handle, int physid, int *pcpu) | 753 | int __ref acpi_map_cpu(acpi_handle handle, int physid, int *pcpu) |
| 754 | { | 754 | { |
| 755 | return _acpi_map_lsapic(handle, physid, pcpu); | 755 | return _acpi_map_lsapic(handle, physid, pcpu); |
| 756 | } | 756 | } |
| 757 | EXPORT_SYMBOL(acpi_map_lsapic); | 757 | EXPORT_SYMBOL(acpi_map_cpu); |
| 758 | 758 | ||
| 759 | int acpi_unmap_lsapic(int cpu) | 759 | int acpi_unmap_cpu(int cpu) |
| 760 | { | 760 | { |
| 761 | #ifdef CONFIG_ACPI_NUMA | 761 | #ifdef CONFIG_ACPI_NUMA |
| 762 | set_apicid_to_node(per_cpu(x86_cpu_to_apicid, cpu), NUMA_NO_NODE); | 762 | set_apicid_to_node(per_cpu(x86_cpu_to_apicid, cpu), NUMA_NO_NODE); |
| @@ -768,8 +768,7 @@ int acpi_unmap_lsapic(int cpu) | |||
| 768 | 768 | ||
| 769 | return (0); | 769 | return (0); |
| 770 | } | 770 | } |
| 771 | 771 | EXPORT_SYMBOL(acpi_unmap_cpu); | |
| 772 | EXPORT_SYMBOL(acpi_unmap_lsapic); | ||
| 773 | #endif /* CONFIG_ACPI_HOTPLUG_CPU */ | 772 | #endif /* CONFIG_ACPI_HOTPLUG_CPU */ |
| 774 | 773 | ||
| 775 | int acpi_register_ioapic(acpi_handle handle, u64 phys_addr, u32 gsi_base) | 774 | int acpi_register_ioapic(acpi_handle handle, u64 phys_addr, u32 gsi_base) |
diff --git a/arch/x86/kernel/cpu/Makefile b/arch/x86/kernel/cpu/Makefile index e27b49d7c922..80091ae54c2b 100644 --- a/arch/x86/kernel/cpu/Makefile +++ b/arch/x86/kernel/cpu/Makefile | |||
| @@ -66,3 +66,4 @@ targets += capflags.c | |||
| 66 | $(obj)/capflags.c: $(cpufeature) $(src)/mkcapflags.sh FORCE | 66 | $(obj)/capflags.c: $(cpufeature) $(src)/mkcapflags.sh FORCE |
| 67 | $(call if_changed,mkcapflags) | 67 | $(call if_changed,mkcapflags) |
| 68 | endif | 68 | endif |
| 69 | clean-files += capflags.c | ||
diff --git a/arch/x86/kernel/cpu/microcode/core.c b/arch/x86/kernel/cpu/microcode/core.c index 15c29096136b..36a83617eb21 100644 --- a/arch/x86/kernel/cpu/microcode/core.c +++ b/arch/x86/kernel/cpu/microcode/core.c | |||
| @@ -552,7 +552,7 @@ static int __init microcode_init(void) | |||
| 552 | int error; | 552 | int error; |
| 553 | 553 | ||
| 554 | if (paravirt_enabled() || dis_ucode_ldr) | 554 | if (paravirt_enabled() || dis_ucode_ldr) |
| 555 | return 0; | 555 | return -EINVAL; |
| 556 | 556 | ||
| 557 | if (c->x86_vendor == X86_VENDOR_INTEL) | 557 | if (c->x86_vendor == X86_VENDOR_INTEL) |
| 558 | microcode_ops = init_intel_microcode(); | 558 | microcode_ops = init_intel_microcode(); |
diff --git a/arch/x86/kernel/cpu/mkcapflags.sh b/arch/x86/kernel/cpu/mkcapflags.sh index e2b22df964cd..36d99a337b49 100644 --- a/arch/x86/kernel/cpu/mkcapflags.sh +++ b/arch/x86/kernel/cpu/mkcapflags.sh | |||
| @@ -28,7 +28,7 @@ function dump_array() | |||
| 28 | # If the /* comment */ starts with a quote string, grab that. | 28 | # If the /* comment */ starts with a quote string, grab that. |
| 29 | VALUE="$(echo "$i" | sed -n 's@.*/\* *\("[^"]*"\).*\*/@\1@p')" | 29 | VALUE="$(echo "$i" | sed -n 's@.*/\* *\("[^"]*"\).*\*/@\1@p')" |
| 30 | [ -z "$VALUE" ] && VALUE="\"$NAME\"" | 30 | [ -z "$VALUE" ] && VALUE="\"$NAME\"" |
| 31 | [ "$VALUE" == '""' ] && continue | 31 | [ "$VALUE" = '""' ] && continue |
| 32 | 32 | ||
| 33 | # Name is uppercase, VALUE is all lowercase | 33 | # Name is uppercase, VALUE is all lowercase |
| 34 | VALUE="$(echo "$VALUE" | tr A-Z a-z)" | 34 | VALUE="$(echo "$VALUE" | tr A-Z a-z)" |
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.c b/arch/x86/kernel/cpu/perf_event_intel.c index 944bf019b74f..498b6d967138 100644 --- a/arch/x86/kernel/cpu/perf_event_intel.c +++ b/arch/x86/kernel/cpu/perf_event_intel.c | |||
| @@ -2431,6 +2431,7 @@ __init int intel_pmu_init(void) | |||
| 2431 | break; | 2431 | break; |
| 2432 | 2432 | ||
| 2433 | case 55: /* 22nm Atom "Silvermont" */ | 2433 | case 55: /* 22nm Atom "Silvermont" */ |
| 2434 | case 76: /* 14nm Atom "Airmont" */ | ||
| 2434 | case 77: /* 22nm Atom "Silvermont Avoton/Rangely" */ | 2435 | case 77: /* 22nm Atom "Silvermont Avoton/Rangely" */ |
| 2435 | memcpy(hw_cache_event_ids, slm_hw_cache_event_ids, | 2436 | memcpy(hw_cache_event_ids, slm_hw_cache_event_ids, |
| 2436 | sizeof(hw_cache_event_ids)); | 2437 | sizeof(hw_cache_event_ids)); |
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..c4bb8b8e5017 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 */ |
| @@ -135,7 +142,7 @@ static inline u64 rapl_scale(u64 v) | |||
| 135 | * or use ldexp(count, -32). | 142 | * or use ldexp(count, -32). |
| 136 | * Watts = Joules/Time delta | 143 | * Watts = Joules/Time delta |
| 137 | */ | 144 | */ |
| 138 | return v << (32 - __this_cpu_read(rapl_pmu->hw_unit)); | 145 | return v << (32 - __this_cpu_read(rapl_pmu)->hw_unit); |
| 139 | } | 146 | } |
| 140 | 147 | ||
| 141 | static u64 rapl_event_update(struct perf_event *event) | 148 | static u64 rapl_event_update(struct perf_event *event) |
| @@ -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/cpu/perf_event_intel_uncore.c b/arch/x86/kernel/cpu/perf_event_intel_uncore.c index 10b8d3eaaf15..c635b8b49e93 100644 --- a/arch/x86/kernel/cpu/perf_event_intel_uncore.c +++ b/arch/x86/kernel/cpu/perf_event_intel_uncore.c | |||
| @@ -840,7 +840,6 @@ static int uncore_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id | |||
| 840 | box->phys_id = phys_id; | 840 | box->phys_id = phys_id; |
| 841 | box->pci_dev = pdev; | 841 | box->pci_dev = pdev; |
| 842 | box->pmu = pmu; | 842 | box->pmu = pmu; |
| 843 | uncore_box_init(box); | ||
| 844 | pci_set_drvdata(pdev, box); | 843 | pci_set_drvdata(pdev, box); |
| 845 | 844 | ||
| 846 | raw_spin_lock(&uncore_box_lock); | 845 | raw_spin_lock(&uncore_box_lock); |
| @@ -1004,10 +1003,8 @@ static int uncore_cpu_starting(int cpu) | |||
| 1004 | pmu = &type->pmus[j]; | 1003 | pmu = &type->pmus[j]; |
| 1005 | box = *per_cpu_ptr(pmu->box, cpu); | 1004 | box = *per_cpu_ptr(pmu->box, cpu); |
| 1006 | /* called by uncore_cpu_init? */ | 1005 | /* called by uncore_cpu_init? */ |
| 1007 | if (box && box->phys_id >= 0) { | 1006 | if (box && box->phys_id >= 0) |
| 1008 | uncore_box_init(box); | ||
| 1009 | continue; | 1007 | continue; |
| 1010 | } | ||
| 1011 | 1008 | ||
| 1012 | for_each_online_cpu(k) { | 1009 | for_each_online_cpu(k) { |
| 1013 | exist = *per_cpu_ptr(pmu->box, k); | 1010 | exist = *per_cpu_ptr(pmu->box, k); |
| @@ -1023,10 +1020,8 @@ static int uncore_cpu_starting(int cpu) | |||
| 1023 | } | 1020 | } |
| 1024 | } | 1021 | } |
| 1025 | 1022 | ||
| 1026 | if (box) { | 1023 | if (box) |
| 1027 | box->phys_id = phys_id; | 1024 | box->phys_id = phys_id; |
| 1028 | uncore_box_init(box); | ||
| 1029 | } | ||
| 1030 | } | 1025 | } |
| 1031 | } | 1026 | } |
| 1032 | return 0; | 1027 | return 0; |
diff --git a/arch/x86/kernel/cpu/perf_event_intel_uncore.h b/arch/x86/kernel/cpu/perf_event_intel_uncore.h index 18eb78bbdd10..6c8c1e7e69d8 100644 --- a/arch/x86/kernel/cpu/perf_event_intel_uncore.h +++ b/arch/x86/kernel/cpu/perf_event_intel_uncore.h | |||
| @@ -17,7 +17,7 @@ | |||
| 17 | #define UNCORE_PCI_DEV_TYPE(data) ((data >> 8) & 0xff) | 17 | #define UNCORE_PCI_DEV_TYPE(data) ((data >> 8) & 0xff) |
| 18 | #define UNCORE_PCI_DEV_IDX(data) (data & 0xff) | 18 | #define UNCORE_PCI_DEV_IDX(data) (data & 0xff) |
| 19 | #define UNCORE_EXTRA_PCI_DEV 0xff | 19 | #define UNCORE_EXTRA_PCI_DEV 0xff |
| 20 | #define UNCORE_EXTRA_PCI_DEV_MAX 2 | 20 | #define UNCORE_EXTRA_PCI_DEV_MAX 3 |
| 21 | 21 | ||
| 22 | /* support up to 8 sockets */ | 22 | /* support up to 8 sockets */ |
| 23 | #define UNCORE_SOCKET_MAX 8 | 23 | #define UNCORE_SOCKET_MAX 8 |
| @@ -257,6 +257,14 @@ static inline int uncore_num_counters(struct intel_uncore_box *box) | |||
| 257 | return box->pmu->type->num_counters; | 257 | return box->pmu->type->num_counters; |
| 258 | } | 258 | } |
| 259 | 259 | ||
| 260 | static inline void uncore_box_init(struct intel_uncore_box *box) | ||
| 261 | { | ||
| 262 | if (!test_and_set_bit(UNCORE_BOX_FLAG_INITIATED, &box->flags)) { | ||
| 263 | if (box->pmu->type->ops->init_box) | ||
| 264 | box->pmu->type->ops->init_box(box); | ||
| 265 | } | ||
| 266 | } | ||
| 267 | |||
| 260 | static inline void uncore_disable_box(struct intel_uncore_box *box) | 268 | static inline void uncore_disable_box(struct intel_uncore_box *box) |
| 261 | { | 269 | { |
| 262 | if (box->pmu->type->ops->disable_box) | 270 | if (box->pmu->type->ops->disable_box) |
| @@ -265,6 +273,8 @@ static inline void uncore_disable_box(struct intel_uncore_box *box) | |||
| 265 | 273 | ||
| 266 | static inline void uncore_enable_box(struct intel_uncore_box *box) | 274 | static inline void uncore_enable_box(struct intel_uncore_box *box) |
| 267 | { | 275 | { |
| 276 | uncore_box_init(box); | ||
| 277 | |||
| 268 | if (box->pmu->type->ops->enable_box) | 278 | if (box->pmu->type->ops->enable_box) |
| 269 | box->pmu->type->ops->enable_box(box); | 279 | box->pmu->type->ops->enable_box(box); |
| 270 | } | 280 | } |
| @@ -287,14 +297,6 @@ static inline u64 uncore_read_counter(struct intel_uncore_box *box, | |||
| 287 | return box->pmu->type->ops->read_counter(box, event); | 297 | return box->pmu->type->ops->read_counter(box, event); |
| 288 | } | 298 | } |
| 289 | 299 | ||
| 290 | static inline void uncore_box_init(struct intel_uncore_box *box) | ||
| 291 | { | ||
| 292 | if (!test_and_set_bit(UNCORE_BOX_FLAG_INITIATED, &box->flags)) { | ||
| 293 | if (box->pmu->type->ops->init_box) | ||
| 294 | box->pmu->type->ops->init_box(box); | ||
| 295 | } | ||
| 296 | } | ||
| 297 | |||
| 298 | static inline bool uncore_box_is_fake(struct intel_uncore_box *box) | 300 | static inline bool uncore_box_is_fake(struct intel_uncore_box *box) |
| 299 | { | 301 | { |
| 300 | return (box->phys_id < 0); | 302 | return (box->phys_id < 0); |
diff --git a/arch/x86/kernel/cpu/perf_event_intel_uncore_snbep.c b/arch/x86/kernel/cpu/perf_event_intel_uncore_snbep.c index 745b158e9a65..21af6149edf2 100644 --- a/arch/x86/kernel/cpu/perf_event_intel_uncore_snbep.c +++ b/arch/x86/kernel/cpu/perf_event_intel_uncore_snbep.c | |||
| @@ -891,6 +891,7 @@ void snbep_uncore_cpu_init(void) | |||
| 891 | enum { | 891 | enum { |
| 892 | SNBEP_PCI_QPI_PORT0_FILTER, | 892 | SNBEP_PCI_QPI_PORT0_FILTER, |
| 893 | SNBEP_PCI_QPI_PORT1_FILTER, | 893 | SNBEP_PCI_QPI_PORT1_FILTER, |
| 894 | HSWEP_PCI_PCU_3, | ||
| 894 | }; | 895 | }; |
| 895 | 896 | ||
| 896 | static int snbep_qpi_hw_config(struct intel_uncore_box *box, struct perf_event *event) | 897 | static int snbep_qpi_hw_config(struct intel_uncore_box *box, struct perf_event *event) |
| @@ -2026,6 +2027,17 @@ void hswep_uncore_cpu_init(void) | |||
| 2026 | { | 2027 | { |
| 2027 | if (hswep_uncore_cbox.num_boxes > boot_cpu_data.x86_max_cores) | 2028 | if (hswep_uncore_cbox.num_boxes > boot_cpu_data.x86_max_cores) |
| 2028 | hswep_uncore_cbox.num_boxes = boot_cpu_data.x86_max_cores; | 2029 | hswep_uncore_cbox.num_boxes = boot_cpu_data.x86_max_cores; |
| 2030 | |||
| 2031 | /* Detect 6-8 core systems with only two SBOXes */ | ||
| 2032 | if (uncore_extra_pci_dev[0][HSWEP_PCI_PCU_3]) { | ||
| 2033 | u32 capid4; | ||
| 2034 | |||
| 2035 | pci_read_config_dword(uncore_extra_pci_dev[0][HSWEP_PCI_PCU_3], | ||
| 2036 | 0x94, &capid4); | ||
| 2037 | if (((capid4 >> 6) & 0x3) == 0) | ||
| 2038 | hswep_uncore_sbox.num_boxes = 2; | ||
| 2039 | } | ||
| 2040 | |||
| 2029 | uncore_msr_uncores = hswep_msr_uncores; | 2041 | uncore_msr_uncores = hswep_msr_uncores; |
| 2030 | } | 2042 | } |
| 2031 | 2043 | ||
| @@ -2287,6 +2299,11 @@ static DEFINE_PCI_DEVICE_TABLE(hswep_uncore_pci_ids) = { | |||
| 2287 | .driver_data = UNCORE_PCI_DEV_DATA(UNCORE_EXTRA_PCI_DEV, | 2299 | .driver_data = UNCORE_PCI_DEV_DATA(UNCORE_EXTRA_PCI_DEV, |
| 2288 | SNBEP_PCI_QPI_PORT1_FILTER), | 2300 | SNBEP_PCI_QPI_PORT1_FILTER), |
| 2289 | }, | 2301 | }, |
| 2302 | { /* PCU.3 (for Capability registers) */ | ||
| 2303 | PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2fc0), | ||
| 2304 | .driver_data = UNCORE_PCI_DEV_DATA(UNCORE_EXTRA_PCI_DEV, | ||
| 2305 | HSWEP_PCI_PCU_3), | ||
| 2306 | }, | ||
| 2290 | { /* end: all zeroes */ } | 2307 | { /* end: all zeroes */ } |
| 2291 | }; | 2308 | }; |
| 2292 | 2309 | ||
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/perf_regs.c b/arch/x86/kernel/perf_regs.c index e309cc5c276e..781861cc5ee8 100644 --- a/arch/x86/kernel/perf_regs.c +++ b/arch/x86/kernel/perf_regs.c | |||
| @@ -78,6 +78,14 @@ u64 perf_reg_abi(struct task_struct *task) | |||
| 78 | { | 78 | { |
| 79 | return PERF_SAMPLE_REGS_ABI_32; | 79 | return PERF_SAMPLE_REGS_ABI_32; |
| 80 | } | 80 | } |
| 81 | |||
| 82 | void perf_get_regs_user(struct perf_regs *regs_user, | ||
| 83 | struct pt_regs *regs, | ||
| 84 | struct pt_regs *regs_user_copy) | ||
| 85 | { | ||
| 86 | regs_user->regs = task_pt_regs(current); | ||
| 87 | regs_user->abi = perf_reg_abi(current); | ||
| 88 | } | ||
| 81 | #else /* CONFIG_X86_64 */ | 89 | #else /* CONFIG_X86_64 */ |
| 82 | #define REG_NOSUPPORT ((1ULL << PERF_REG_X86_DS) | \ | 90 | #define REG_NOSUPPORT ((1ULL << PERF_REG_X86_DS) | \ |
| 83 | (1ULL << PERF_REG_X86_ES) | \ | 91 | (1ULL << PERF_REG_X86_ES) | \ |
| @@ -102,4 +110,86 @@ u64 perf_reg_abi(struct task_struct *task) | |||
| 102 | else | 110 | else |
| 103 | return PERF_SAMPLE_REGS_ABI_64; | 111 | return PERF_SAMPLE_REGS_ABI_64; |
| 104 | } | 112 | } |
| 113 | |||
| 114 | void perf_get_regs_user(struct perf_regs *regs_user, | ||
| 115 | struct pt_regs *regs, | ||
| 116 | struct pt_regs *regs_user_copy) | ||
| 117 | { | ||
| 118 | struct pt_regs *user_regs = task_pt_regs(current); | ||
| 119 | |||
| 120 | /* | ||
| 121 | * If we're in an NMI that interrupted task_pt_regs setup, then | ||
| 122 | * we can't sample user regs at all. This check isn't really | ||
| 123 | * sufficient, though, as we could be in an NMI inside an interrupt | ||
| 124 | * that happened during task_pt_regs setup. | ||
| 125 | */ | ||
| 126 | if (regs->sp > (unsigned long)&user_regs->r11 && | ||
| 127 | regs->sp <= (unsigned long)(user_regs + 1)) { | ||
| 128 | regs_user->abi = PERF_SAMPLE_REGS_ABI_NONE; | ||
| 129 | regs_user->regs = NULL; | ||
| 130 | return; | ||
| 131 | } | ||
| 132 | |||
| 133 | /* | ||
| 134 | * RIP, flags, and the argument registers are usually saved. | ||
| 135 | * orig_ax is probably okay, too. | ||
| 136 | */ | ||
| 137 | regs_user_copy->ip = user_regs->ip; | ||
| 138 | regs_user_copy->cx = user_regs->cx; | ||
| 139 | regs_user_copy->dx = user_regs->dx; | ||
| 140 | regs_user_copy->si = user_regs->si; | ||
| 141 | regs_user_copy->di = user_regs->di; | ||
| 142 | regs_user_copy->r8 = user_regs->r8; | ||
| 143 | regs_user_copy->r9 = user_regs->r9; | ||
| 144 | regs_user_copy->r10 = user_regs->r10; | ||
| 145 | regs_user_copy->r11 = user_regs->r11; | ||
| 146 | regs_user_copy->orig_ax = user_regs->orig_ax; | ||
| 147 | regs_user_copy->flags = user_regs->flags; | ||
| 148 | |||
| 149 | /* | ||
| 150 | * Don't even try to report the "rest" regs. | ||
| 151 | */ | ||
| 152 | regs_user_copy->bx = -1; | ||
| 153 | regs_user_copy->bp = -1; | ||
| 154 | regs_user_copy->r12 = -1; | ||
| 155 | regs_user_copy->r13 = -1; | ||
| 156 | regs_user_copy->r14 = -1; | ||
| 157 | regs_user_copy->r15 = -1; | ||
| 158 | |||
| 159 | /* | ||
| 160 | * For this to be at all useful, we need a reasonable guess for | ||
| 161 | * sp and the ABI. Be careful: we're in NMI context, and we're | ||
| 162 | * considering current to be the current task, so we should | ||
| 163 | * be careful not to look at any other percpu variables that might | ||
| 164 | * change during context switches. | ||
| 165 | */ | ||
| 166 | if (IS_ENABLED(CONFIG_IA32_EMULATION) && | ||
| 167 | task_thread_info(current)->status & TS_COMPAT) { | ||
| 168 | /* Easy case: we're in a compat syscall. */ | ||
| 169 | regs_user->abi = PERF_SAMPLE_REGS_ABI_32; | ||
| 170 | regs_user_copy->sp = user_regs->sp; | ||
| 171 | regs_user_copy->cs = user_regs->cs; | ||
| 172 | regs_user_copy->ss = user_regs->ss; | ||
| 173 | } else if (user_regs->orig_ax != -1) { | ||
| 174 | /* | ||
| 175 | * We're probably in a 64-bit syscall. | ||
| 176 | * Warning: this code is severely racy. At least it's better | ||
| 177 | * than just blindly copying user_regs. | ||
| 178 | */ | ||
| 179 | regs_user->abi = PERF_SAMPLE_REGS_ABI_64; | ||
| 180 | regs_user_copy->sp = this_cpu_read(old_rsp); | ||
| 181 | regs_user_copy->cs = __USER_CS; | ||
| 182 | regs_user_copy->ss = __USER_DS; | ||
| 183 | regs_user_copy->cx = -1; /* usually contains garbage */ | ||
| 184 | } else { | ||
| 185 | /* We're probably in an interrupt or exception. */ | ||
| 186 | regs_user->abi = user_64bit_mode(user_regs) ? | ||
| 187 | PERF_SAMPLE_REGS_ABI_64 : PERF_SAMPLE_REGS_ABI_32; | ||
| 188 | regs_user_copy->sp = user_regs->sp; | ||
| 189 | regs_user_copy->cs = user_regs->cs; | ||
| 190 | regs_user_copy->ss = user_regs->ss; | ||
| 191 | } | ||
| 192 | |||
| 193 | regs_user->regs = regs_user_copy; | ||
| 194 | } | ||
| 105 | #endif /* CONFIG_X86_32 */ | 195 | #endif /* CONFIG_X86_32 */ |
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/kvm/lapic.c b/arch/x86/kvm/lapic.c index 4f0c0b954686..d52dcf0776ea 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c | |||
| @@ -192,6 +192,9 @@ static void recalculate_apic_map(struct kvm *kvm) | |||
| 192 | u16 cid, lid; | 192 | u16 cid, lid; |
| 193 | u32 ldr, aid; | 193 | u32 ldr, aid; |
| 194 | 194 | ||
| 195 | if (!kvm_apic_present(vcpu)) | ||
| 196 | continue; | ||
| 197 | |||
| 195 | aid = kvm_apic_id(apic); | 198 | aid = kvm_apic_id(apic); |
| 196 | ldr = kvm_apic_get_reg(apic, APIC_LDR); | 199 | ldr = kvm_apic_get_reg(apic, APIC_LDR); |
| 197 | cid = apic_cluster_id(new, ldr); | 200 | cid = apic_cluster_id(new, ldr); |
diff --git a/arch/x86/lib/insn.c b/arch/x86/lib/insn.c index 2480978b31cc..1313ae6b478b 100644 --- a/arch/x86/lib/insn.c +++ b/arch/x86/lib/insn.c | |||
| @@ -28,7 +28,7 @@ | |||
| 28 | 28 | ||
| 29 | /* Verify next sizeof(t) bytes can be on the same instruction */ | 29 | /* Verify next sizeof(t) bytes can be on the same instruction */ |
| 30 | #define validate_next(t, insn, n) \ | 30 | #define validate_next(t, insn, n) \ |
| 31 | ((insn)->next_byte + sizeof(t) + n < (insn)->end_kaddr) | 31 | ((insn)->next_byte + sizeof(t) + n <= (insn)->end_kaddr) |
| 32 | 32 | ||
| 33 | #define __get_next(t, insn) \ | 33 | #define __get_next(t, insn) \ |
| 34 | ({ t r = *(t*)insn->next_byte; insn->next_byte += sizeof(t); r; }) | 34 | ({ t r = *(t*)insn->next_byte; insn->next_byte += sizeof(t); r; }) |
diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c index 38dcec403b46..e3ff27a5b634 100644 --- a/arch/x86/mm/fault.c +++ b/arch/x86/mm/fault.c | |||
| @@ -898,6 +898,8 @@ mm_fault_error(struct pt_regs *regs, unsigned long error_code, | |||
| 898 | if (fault & (VM_FAULT_SIGBUS|VM_FAULT_HWPOISON| | 898 | if (fault & (VM_FAULT_SIGBUS|VM_FAULT_HWPOISON| |
| 899 | VM_FAULT_HWPOISON_LARGE)) | 899 | VM_FAULT_HWPOISON_LARGE)) |
| 900 | do_sigbus(regs, error_code, address, fault); | 900 | do_sigbus(regs, error_code, address, fault); |
| 901 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 902 | bad_area_nosemaphore(regs, error_code, address); | ||
| 901 | else | 903 | else |
| 902 | BUG(); | 904 | BUG(); |
| 903 | } | 905 | } |
diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c index a97ee0801475..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; |
| @@ -438,20 +438,20 @@ static unsigned long __init init_range_memory_mapping( | |||
| 438 | static unsigned long __init get_new_step_size(unsigned long step_size) | 438 | static unsigned long __init get_new_step_size(unsigned long step_size) |
| 439 | { | 439 | { |
| 440 | /* | 440 | /* |
| 441 | * Explain why we shift by 5 and why we don't have to worry about | 441 | * Initial mapped size is PMD_SIZE (2M). |
| 442 | * 'step_size << 5' overflowing: | ||
| 443 | * | ||
| 444 | * initial mapped size is PMD_SIZE (2M). | ||
| 445 | * We can not set step_size to be PUD_SIZE (1G) yet. | 442 | * We can not set step_size to be PUD_SIZE (1G) yet. |
| 446 | * In worse case, when we cross the 1G boundary, and | 443 | * In worse case, when we cross the 1G boundary, and |
| 447 | * PG_LEVEL_2M is not set, we will need 1+1+512 pages (2M + 8k) | 444 | * PG_LEVEL_2M is not set, we will need 1+1+512 pages (2M + 8k) |
| 448 | * to map 1G range with PTE. Use 5 as shift for now. | 445 | * to map 1G range with PTE. Hence we use one less than the |
| 446 | * difference of page table level shifts. | ||
| 449 | * | 447 | * |
| 450 | * Don't need to worry about overflow, on 32bit, when step_size | 448 | * Don't need to worry about overflow in the top-down case, on 32bit, |
| 451 | * is 0, round_down() returns 0 for start, and that turns it | 449 | * when step_size is 0, round_down() returns 0 for start, and that |
| 452 | * into 0x100000000ULL. | 450 | * turns it into 0x100000000ULL. |
| 451 | * In the bottom-up case, round_up(x, 0) returns 0 though too, which | ||
| 452 | * needs to be taken into consideration by the code below. | ||
| 453 | */ | 453 | */ |
| 454 | return step_size << 5; | 454 | return step_size << (PMD_SHIFT - PAGE_SHIFT - 1); |
| 455 | } | 455 | } |
| 456 | 456 | ||
| 457 | /** | 457 | /** |
| @@ -471,7 +471,6 @@ static void __init memory_map_top_down(unsigned long map_start, | |||
| 471 | unsigned long step_size; | 471 | unsigned long step_size; |
| 472 | unsigned long addr; | 472 | unsigned long addr; |
| 473 | unsigned long mapped_ram_size = 0; | 473 | unsigned long mapped_ram_size = 0; |
| 474 | unsigned long new_mapped_ram_size; | ||
| 475 | 474 | ||
| 476 | /* xen has big range in reserved near end of ram, skip it at first.*/ | 475 | /* xen has big range in reserved near end of ram, skip it at first.*/ |
| 477 | addr = memblock_find_in_range(map_start, map_end, PMD_SIZE, PMD_SIZE); | 476 | addr = memblock_find_in_range(map_start, map_end, PMD_SIZE, PMD_SIZE); |
| @@ -496,14 +495,12 @@ static void __init memory_map_top_down(unsigned long map_start, | |||
| 496 | start = map_start; | 495 | start = map_start; |
| 497 | } else | 496 | } else |
| 498 | start = map_start; | 497 | start = map_start; |
| 499 | new_mapped_ram_size = init_range_memory_mapping(start, | 498 | mapped_ram_size += init_range_memory_mapping(start, |
| 500 | last_start); | 499 | last_start); |
| 501 | last_start = start; | 500 | last_start = start; |
| 502 | min_pfn_mapped = last_start >> PAGE_SHIFT; | 501 | min_pfn_mapped = last_start >> PAGE_SHIFT; |
| 503 | /* only increase step_size after big range get mapped */ | 502 | if (mapped_ram_size >= step_size) |
| 504 | if (new_mapped_ram_size > mapped_ram_size) | ||
| 505 | step_size = get_new_step_size(step_size); | 503 | step_size = get_new_step_size(step_size); |
| 506 | mapped_ram_size += new_mapped_ram_size; | ||
| 507 | } | 504 | } |
| 508 | 505 | ||
| 509 | if (real_end < map_end) | 506 | if (real_end < map_end) |
| @@ -524,7 +521,7 @@ static void __init memory_map_top_down(unsigned long map_start, | |||
| 524 | static void __init memory_map_bottom_up(unsigned long map_start, | 521 | static void __init memory_map_bottom_up(unsigned long map_start, |
| 525 | unsigned long map_end) | 522 | unsigned long map_end) |
| 526 | { | 523 | { |
| 527 | unsigned long next, new_mapped_ram_size, start; | 524 | unsigned long next, start; |
| 528 | unsigned long mapped_ram_size = 0; | 525 | unsigned long mapped_ram_size = 0; |
| 529 | /* step_size need to be small so pgt_buf from BRK could cover it */ | 526 | /* step_size need to be small so pgt_buf from BRK could cover it */ |
| 530 | unsigned long step_size = PMD_SIZE; | 527 | unsigned long step_size = PMD_SIZE; |
| @@ -539,19 +536,19 @@ static void __init memory_map_bottom_up(unsigned long map_start, | |||
| 539 | * for page table. | 536 | * for page table. |
| 540 | */ | 537 | */ |
| 541 | while (start < map_end) { | 538 | while (start < map_end) { |
| 542 | if (map_end - start > step_size) { | 539 | if (step_size && map_end - start > step_size) { |
| 543 | next = round_up(start + 1, step_size); | 540 | next = round_up(start + 1, step_size); |
| 544 | if (next > map_end) | 541 | if (next > map_end) |
| 545 | next = map_end; | 542 | next = map_end; |
| 546 | } else | 543 | } else { |
| 547 | next = map_end; | 544 | next = map_end; |
| 545 | } | ||
| 548 | 546 | ||
| 549 | new_mapped_ram_size = init_range_memory_mapping(start, next); | 547 | mapped_ram_size += init_range_memory_mapping(start, next); |
| 550 | start = next; | 548 | start = next; |
| 551 | 549 | ||
| 552 | if (new_mapped_ram_size > mapped_ram_size) | 550 | if (mapped_ram_size >= step_size) |
| 553 | step_size = get_new_step_size(step_size); | 551 | step_size = get_new_step_size(step_size); |
| 554 | mapped_ram_size += new_mapped_ram_size; | ||
| 555 | } | 552 | } |
| 556 | } | 553 | } |
| 557 | 554 | ||
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/common.c b/arch/x86/pci/common.c index 7b20bccf3648..2fb384724ebb 100644 --- a/arch/x86/pci/common.c +++ b/arch/x86/pci/common.c | |||
| @@ -448,6 +448,22 @@ static const struct dmi_system_id pciprobe_dmi_table[] __initconst = { | |||
| 448 | DMI_MATCH(DMI_PRODUCT_NAME, "ftServer"), | 448 | DMI_MATCH(DMI_PRODUCT_NAME, "ftServer"), |
| 449 | }, | 449 | }, |
| 450 | }, | 450 | }, |
| 451 | { | ||
| 452 | .callback = set_scan_all, | ||
| 453 | .ident = "Stratus/NEC ftServer", | ||
| 454 | .matches = { | ||
| 455 | DMI_MATCH(DMI_SYS_VENDOR, "NEC"), | ||
| 456 | DMI_MATCH(DMI_PRODUCT_NAME, "Express5800/R32"), | ||
| 457 | }, | ||
| 458 | }, | ||
| 459 | { | ||
| 460 | .callback = set_scan_all, | ||
| 461 | .ident = "Stratus/NEC ftServer", | ||
| 462 | .matches = { | ||
| 463 | DMI_MATCH(DMI_SYS_VENDOR, "NEC"), | ||
| 464 | DMI_MATCH(DMI_PRODUCT_NAME, "Express5800/R31"), | ||
| 465 | }, | ||
| 466 | }, | ||
| 451 | {} | 467 | {} |
| 452 | }; | 468 | }; |
| 453 | 469 | ||
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/arch/x86/vdso/vma.c b/arch/x86/vdso/vma.c index 009495b9ab4b..1c9f750c3859 100644 --- a/arch/x86/vdso/vma.c +++ b/arch/x86/vdso/vma.c | |||
| @@ -41,12 +41,17 @@ void __init init_vdso_image(const struct vdso_image *image) | |||
| 41 | 41 | ||
| 42 | struct linux_binprm; | 42 | struct linux_binprm; |
| 43 | 43 | ||
| 44 | /* Put the vdso above the (randomized) stack with another randomized offset. | 44 | /* |
| 45 | This way there is no hole in the middle of address space. | 45 | * Put the vdso above the (randomized) stack with another randomized |
| 46 | To save memory make sure it is still in the same PTE as the stack top. | 46 | * offset. This way there is no hole in the middle of address space. |
| 47 | This doesn't give that many random bits. | 47 | * To save memory make sure it is still in the same PTE as the stack |
| 48 | 48 | * top. This doesn't give that many random bits. | |
| 49 | Only used for the 64-bit and x32 vdsos. */ | 49 | * |
| 50 | * Note that this algorithm is imperfect: the distribution of the vdso | ||
| 51 | * start address within a PMD is biased toward the end. | ||
| 52 | * | ||
| 53 | * Only used for the 64-bit and x32 vdsos. | ||
| 54 | */ | ||
| 50 | static unsigned long vdso_addr(unsigned long start, unsigned len) | 55 | static unsigned long vdso_addr(unsigned long start, unsigned len) |
| 51 | { | 56 | { |
| 52 | #ifdef CONFIG_X86_32 | 57 | #ifdef CONFIG_X86_32 |
| @@ -54,22 +59,30 @@ static unsigned long vdso_addr(unsigned long start, unsigned len) | |||
| 54 | #else | 59 | #else |
| 55 | unsigned long addr, end; | 60 | unsigned long addr, end; |
| 56 | unsigned offset; | 61 | unsigned offset; |
| 57 | end = (start + PMD_SIZE - 1) & PMD_MASK; | 62 | |
| 63 | /* | ||
| 64 | * Round up the start address. It can start out unaligned as a result | ||
| 65 | * of stack start randomization. | ||
| 66 | */ | ||
| 67 | start = PAGE_ALIGN(start); | ||
| 68 | |||
| 69 | /* Round the lowest possible end address up to a PMD boundary. */ | ||
| 70 | end = (start + len + PMD_SIZE - 1) & PMD_MASK; | ||
| 58 | if (end >= TASK_SIZE_MAX) | 71 | if (end >= TASK_SIZE_MAX) |
| 59 | end = TASK_SIZE_MAX; | 72 | end = TASK_SIZE_MAX; |
| 60 | end -= len; | 73 | end -= len; |
| 61 | /* This loses some more bits than a modulo, but is cheaper */ | 74 | |
| 62 | offset = get_random_int() & (PTRS_PER_PTE - 1); | 75 | if (end > start) { |
| 63 | addr = start + (offset << PAGE_SHIFT); | 76 | offset = get_random_int() % (((end - start) >> PAGE_SHIFT) + 1); |
| 64 | if (addr >= end) | 77 | addr = start + (offset << PAGE_SHIFT); |
| 65 | addr = end; | 78 | } else { |
| 79 | addr = start; | ||
| 80 | } | ||
| 66 | 81 | ||
| 67 | /* | 82 | /* |
| 68 | * page-align it here so that get_unmapped_area doesn't | 83 | * Forcibly align the final address in case we have a hardware |
| 69 | * align it wrongfully again to the next page. addr can come in 4K | 84 | * issue that requires alignment for performance reasons. |
| 70 | * unaligned here as a result of stack start randomization. | ||
| 71 | */ | 85 | */ |
| 72 | addr = PAGE_ALIGN(addr); | ||
| 73 | addr = align_vdso_addr(addr); | 86 | addr = align_vdso_addr(addr); |
| 74 | 87 | ||
| 75 | return addr; | 88 | return addr; |
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index 6bf3a13e3e0f..78a881b7fc41 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c | |||
| @@ -40,6 +40,7 @@ | |||
| 40 | #include <xen/interface/physdev.h> | 40 | #include <xen/interface/physdev.h> |
| 41 | #include <xen/interface/vcpu.h> | 41 | #include <xen/interface/vcpu.h> |
| 42 | #include <xen/interface/memory.h> | 42 | #include <xen/interface/memory.h> |
| 43 | #include <xen/interface/nmi.h> | ||
| 43 | #include <xen/interface/xen-mca.h> | 44 | #include <xen/interface/xen-mca.h> |
| 44 | #include <xen/features.h> | 45 | #include <xen/features.h> |
| 45 | #include <xen/page.h> | 46 | #include <xen/page.h> |
| @@ -66,6 +67,7 @@ | |||
| 66 | #include <asm/reboot.h> | 67 | #include <asm/reboot.h> |
| 67 | #include <asm/stackprotector.h> | 68 | #include <asm/stackprotector.h> |
| 68 | #include <asm/hypervisor.h> | 69 | #include <asm/hypervisor.h> |
| 70 | #include <asm/mach_traps.h> | ||
| 69 | #include <asm/mwait.h> | 71 | #include <asm/mwait.h> |
| 70 | #include <asm/pci_x86.h> | 72 | #include <asm/pci_x86.h> |
| 71 | #include <asm/pat.h> | 73 | #include <asm/pat.h> |
| @@ -1351,6 +1353,21 @@ static const struct machine_ops xen_machine_ops __initconst = { | |||
| 1351 | .emergency_restart = xen_emergency_restart, | 1353 | .emergency_restart = xen_emergency_restart, |
| 1352 | }; | 1354 | }; |
| 1353 | 1355 | ||
| 1356 | static unsigned char xen_get_nmi_reason(void) | ||
| 1357 | { | ||
| 1358 | unsigned char reason = 0; | ||
| 1359 | |||
| 1360 | /* Construct a value which looks like it came from port 0x61. */ | ||
| 1361 | if (test_bit(_XEN_NMIREASON_io_error, | ||
| 1362 | &HYPERVISOR_shared_info->arch.nmi_reason)) | ||
| 1363 | reason |= NMI_REASON_IOCHK; | ||
| 1364 | if (test_bit(_XEN_NMIREASON_pci_serr, | ||
| 1365 | &HYPERVISOR_shared_info->arch.nmi_reason)) | ||
| 1366 | reason |= NMI_REASON_SERR; | ||
| 1367 | |||
| 1368 | return reason; | ||
| 1369 | } | ||
| 1370 | |||
| 1354 | static void __init xen_boot_params_init_edd(void) | 1371 | static void __init xen_boot_params_init_edd(void) |
| 1355 | { | 1372 | { |
| 1356 | #if IS_ENABLED(CONFIG_EDD) | 1373 | #if IS_ENABLED(CONFIG_EDD) |
| @@ -1535,9 +1552,12 @@ asmlinkage __visible void __init xen_start_kernel(void) | |||
| 1535 | pv_info = xen_info; | 1552 | pv_info = xen_info; |
| 1536 | pv_init_ops = xen_init_ops; | 1553 | pv_init_ops = xen_init_ops; |
| 1537 | pv_apic_ops = xen_apic_ops; | 1554 | pv_apic_ops = xen_apic_ops; |
| 1538 | if (!xen_pvh_domain()) | 1555 | if (!xen_pvh_domain()) { |
| 1539 | pv_cpu_ops = xen_cpu_ops; | 1556 | pv_cpu_ops = xen_cpu_ops; |
| 1540 | 1557 | ||
| 1558 | x86_platform.get_nmi_reason = xen_get_nmi_reason; | ||
| 1559 | } | ||
| 1560 | |||
| 1541 | if (xen_feature(XENFEAT_auto_translated_physmap)) | 1561 | if (xen_feature(XENFEAT_auto_translated_physmap)) |
| 1542 | x86_init.resources.memory_setup = xen_auto_xlated_memory_setup; | 1562 | x86_init.resources.memory_setup = xen_auto_xlated_memory_setup; |
| 1543 | else | 1563 | else |
diff --git a/arch/x86/xen/p2m.c b/arch/x86/xen/p2m.c index edbc7a63fd73..70fb5075c901 100644 --- a/arch/x86/xen/p2m.c +++ b/arch/x86/xen/p2m.c | |||
| @@ -167,10 +167,13 @@ static void * __ref alloc_p2m_page(void) | |||
| 167 | return (void *)__get_free_page(GFP_KERNEL | __GFP_REPEAT); | 167 | return (void *)__get_free_page(GFP_KERNEL | __GFP_REPEAT); |
| 168 | } | 168 | } |
| 169 | 169 | ||
| 170 | /* Only to be called in case of a race for a page just allocated! */ | 170 | static void __ref free_p2m_page(void *p) |
| 171 | static void free_p2m_page(void *p) | ||
| 172 | { | 171 | { |
| 173 | BUG_ON(!slab_is_available()); | 172 | if (unlikely(!slab_is_available())) { |
| 173 | free_bootmem((unsigned long)p, PAGE_SIZE); | ||
| 174 | return; | ||
| 175 | } | ||
| 176 | |||
| 174 | free_page((unsigned long)p); | 177 | free_page((unsigned long)p); |
| 175 | } | 178 | } |
| 176 | 179 | ||
| @@ -375,7 +378,7 @@ static void __init xen_rebuild_p2m_list(unsigned long *p2m) | |||
| 375 | p2m_missing_pte : p2m_identity_pte; | 378 | p2m_missing_pte : p2m_identity_pte; |
| 376 | for (i = 0; i < PMDS_PER_MID_PAGE; i++) { | 379 | for (i = 0; i < PMDS_PER_MID_PAGE; i++) { |
| 377 | pmdp = populate_extra_pmd( | 380 | pmdp = populate_extra_pmd( |
| 378 | (unsigned long)(p2m + pfn + i * PTRS_PER_PTE)); | 381 | (unsigned long)(p2m + pfn) + i * PMD_SIZE); |
| 379 | set_pmd(pmdp, __pmd(__pa(ptep) | _KERNPG_TABLE)); | 382 | set_pmd(pmdp, __pmd(__pa(ptep) | _KERNPG_TABLE)); |
| 380 | } | 383 | } |
| 381 | } | 384 | } |
| @@ -436,10 +439,9 @@ EXPORT_SYMBOL_GPL(get_phys_to_machine); | |||
| 436 | * a new pmd is to replace p2m_missing_pte or p2m_identity_pte by a individual | 439 | * a new pmd is to replace p2m_missing_pte or p2m_identity_pte by a individual |
| 437 | * pmd. In case of PAE/x86-32 there are multiple pmds to allocate! | 440 | * pmd. In case of PAE/x86-32 there are multiple pmds to allocate! |
| 438 | */ | 441 | */ |
| 439 | static pte_t *alloc_p2m_pmd(unsigned long addr, pte_t *ptep, pte_t *pte_pg) | 442 | static pte_t *alloc_p2m_pmd(unsigned long addr, pte_t *pte_pg) |
| 440 | { | 443 | { |
| 441 | pte_t *ptechk; | 444 | pte_t *ptechk; |
| 442 | pte_t *pteret = ptep; | ||
| 443 | pte_t *pte_newpg[PMDS_PER_MID_PAGE]; | 445 | pte_t *pte_newpg[PMDS_PER_MID_PAGE]; |
| 444 | pmd_t *pmdp; | 446 | pmd_t *pmdp; |
| 445 | unsigned int level; | 447 | unsigned int level; |
| @@ -473,8 +475,6 @@ static pte_t *alloc_p2m_pmd(unsigned long addr, pte_t *ptep, pte_t *pte_pg) | |||
| 473 | if (ptechk == pte_pg) { | 475 | if (ptechk == pte_pg) { |
| 474 | set_pmd(pmdp, | 476 | set_pmd(pmdp, |
| 475 | __pmd(__pa(pte_newpg[i]) | _KERNPG_TABLE)); | 477 | __pmd(__pa(pte_newpg[i]) | _KERNPG_TABLE)); |
| 476 | if (vaddr == (addr & ~(PMD_SIZE - 1))) | ||
| 477 | pteret = pte_offset_kernel(pmdp, addr); | ||
| 478 | pte_newpg[i] = NULL; | 478 | pte_newpg[i] = NULL; |
| 479 | } | 479 | } |
| 480 | 480 | ||
| @@ -488,7 +488,7 @@ static pte_t *alloc_p2m_pmd(unsigned long addr, pte_t *ptep, pte_t *pte_pg) | |||
| 488 | vaddr += PMD_SIZE; | 488 | vaddr += PMD_SIZE; |
| 489 | } | 489 | } |
| 490 | 490 | ||
| 491 | return pteret; | 491 | return lookup_address(addr, &level); |
| 492 | } | 492 | } |
| 493 | 493 | ||
| 494 | /* | 494 | /* |
| @@ -517,7 +517,7 @@ static bool alloc_p2m(unsigned long pfn) | |||
| 517 | 517 | ||
| 518 | if (pte_pg == p2m_missing_pte || pte_pg == p2m_identity_pte) { | 518 | if (pte_pg == p2m_missing_pte || pte_pg == p2m_identity_pte) { |
| 519 | /* PMD level is missing, allocate a new one */ | 519 | /* PMD level is missing, allocate a new one */ |
| 520 | ptep = alloc_p2m_pmd(addr, ptep, pte_pg); | 520 | ptep = alloc_p2m_pmd(addr, pte_pg); |
| 521 | if (!ptep) | 521 | if (!ptep) |
| 522 | return false; | 522 | return false; |
| 523 | } | 523 | } |
diff --git a/arch/x86/xen/setup.c b/arch/x86/xen/setup.c index dfd77dec8e2b..865e56cea7a0 100644 --- a/arch/x86/xen/setup.c +++ b/arch/x86/xen/setup.c | |||
| @@ -140,7 +140,7 @@ static void __init xen_del_extra_mem(u64 start, u64 size) | |||
| 140 | unsigned long __ref xen_chk_extra_mem(unsigned long pfn) | 140 | unsigned long __ref xen_chk_extra_mem(unsigned long pfn) |
| 141 | { | 141 | { |
| 142 | int i; | 142 | int i; |
| 143 | unsigned long addr = PFN_PHYS(pfn); | 143 | phys_addr_t addr = PFN_PHYS(pfn); |
| 144 | 144 | ||
| 145 | for (i = 0; i < XEN_EXTRA_MEM_MAX_REGIONS; i++) { | 145 | for (i = 0; i < XEN_EXTRA_MEM_MAX_REGIONS; i++) { |
| 146 | if (addr >= xen_extra_mem[i].start && | 146 | if (addr >= xen_extra_mem[i].start && |
| @@ -160,6 +160,8 @@ void __init xen_inv_extra_mem(void) | |||
| 160 | int i; | 160 | int i; |
| 161 | 161 | ||
| 162 | for (i = 0; i < XEN_EXTRA_MEM_MAX_REGIONS; i++) { | 162 | for (i = 0; i < XEN_EXTRA_MEM_MAX_REGIONS; i++) { |
| 163 | if (!xen_extra_mem[i].size) | ||
| 164 | continue; | ||
| 163 | pfn_s = PFN_DOWN(xen_extra_mem[i].start); | 165 | pfn_s = PFN_DOWN(xen_extra_mem[i].start); |
| 164 | pfn_e = PFN_UP(xen_extra_mem[i].start + xen_extra_mem[i].size); | 166 | pfn_e = PFN_UP(xen_extra_mem[i].start + xen_extra_mem[i].size); |
| 165 | for (pfn = pfn_s; pfn < pfn_e; pfn++) | 167 | for (pfn = pfn_s; pfn < pfn_e; pfn++) |
| @@ -229,15 +231,14 @@ static int __init xen_free_mfn(unsigned long mfn) | |||
| 229 | * as a fallback if the remapping fails. | 231 | * as a fallback if the remapping fails. |
| 230 | */ | 232 | */ |
| 231 | static void __init xen_set_identity_and_release_chunk(unsigned long start_pfn, | 233 | static void __init xen_set_identity_and_release_chunk(unsigned long start_pfn, |
| 232 | unsigned long end_pfn, unsigned long nr_pages, unsigned long *identity, | 234 | unsigned long end_pfn, unsigned long nr_pages, unsigned long *released) |
| 233 | unsigned long *released) | ||
| 234 | { | 235 | { |
| 235 | unsigned long len = 0; | ||
| 236 | unsigned long pfn, end; | 236 | unsigned long pfn, end; |
| 237 | int ret; | 237 | int ret; |
| 238 | 238 | ||
| 239 | WARN_ON(start_pfn > end_pfn); | 239 | WARN_ON(start_pfn > end_pfn); |
| 240 | 240 | ||
| 241 | /* Release pages first. */ | ||
| 241 | end = min(end_pfn, nr_pages); | 242 | end = min(end_pfn, nr_pages); |
| 242 | for (pfn = start_pfn; pfn < end; pfn++) { | 243 | for (pfn = start_pfn; pfn < end; pfn++) { |
| 243 | unsigned long mfn = pfn_to_mfn(pfn); | 244 | unsigned long mfn = pfn_to_mfn(pfn); |
| @@ -250,16 +251,14 @@ static void __init xen_set_identity_and_release_chunk(unsigned long start_pfn, | |||
| 250 | WARN(ret != 1, "Failed to release pfn %lx err=%d\n", pfn, ret); | 251 | WARN(ret != 1, "Failed to release pfn %lx err=%d\n", pfn, ret); |
| 251 | 252 | ||
| 252 | if (ret == 1) { | 253 | if (ret == 1) { |
| 254 | (*released)++; | ||
| 253 | if (!__set_phys_to_machine(pfn, INVALID_P2M_ENTRY)) | 255 | if (!__set_phys_to_machine(pfn, INVALID_P2M_ENTRY)) |
| 254 | break; | 256 | break; |
| 255 | len++; | ||
| 256 | } else | 257 | } else |
| 257 | break; | 258 | break; |
| 258 | } | 259 | } |
| 259 | 260 | ||
| 260 | /* Need to release pages first */ | 261 | set_phys_range_identity(start_pfn, end_pfn); |
| 261 | *released += len; | ||
| 262 | *identity += set_phys_range_identity(start_pfn, end_pfn); | ||
| 263 | } | 262 | } |
| 264 | 263 | ||
| 265 | /* | 264 | /* |
| @@ -287,7 +286,7 @@ static void __init xen_update_mem_tables(unsigned long pfn, unsigned long mfn) | |||
| 287 | } | 286 | } |
| 288 | 287 | ||
| 289 | /* Update kernel mapping, but not for highmem. */ | 288 | /* Update kernel mapping, but not for highmem. */ |
| 290 | if ((pfn << PAGE_SHIFT) >= __pa(high_memory)) | 289 | if (pfn >= PFN_UP(__pa(high_memory - 1))) |
| 291 | return; | 290 | return; |
| 292 | 291 | ||
| 293 | if (HYPERVISOR_update_va_mapping((unsigned long)__va(pfn << PAGE_SHIFT), | 292 | if (HYPERVISOR_update_va_mapping((unsigned long)__va(pfn << PAGE_SHIFT), |
| @@ -318,7 +317,6 @@ static void __init xen_do_set_identity_and_remap_chunk( | |||
| 318 | unsigned long ident_pfn_iter, remap_pfn_iter; | 317 | unsigned long ident_pfn_iter, remap_pfn_iter; |
| 319 | unsigned long ident_end_pfn = start_pfn + size; | 318 | unsigned long ident_end_pfn = start_pfn + size; |
| 320 | unsigned long left = size; | 319 | unsigned long left = size; |
| 321 | unsigned long ident_cnt = 0; | ||
| 322 | unsigned int i, chunk; | 320 | unsigned int i, chunk; |
| 323 | 321 | ||
| 324 | WARN_ON(size == 0); | 322 | WARN_ON(size == 0); |
| @@ -347,8 +345,7 @@ static void __init xen_do_set_identity_and_remap_chunk( | |||
| 347 | xen_remap_mfn = mfn; | 345 | xen_remap_mfn = mfn; |
| 348 | 346 | ||
| 349 | /* Set identity map */ | 347 | /* Set identity map */ |
| 350 | ident_cnt += set_phys_range_identity(ident_pfn_iter, | 348 | set_phys_range_identity(ident_pfn_iter, ident_pfn_iter + chunk); |
| 351 | ident_pfn_iter + chunk); | ||
| 352 | 349 | ||
| 353 | left -= chunk; | 350 | left -= chunk; |
| 354 | } | 351 | } |
| @@ -371,7 +368,7 @@ static void __init xen_do_set_identity_and_remap_chunk( | |||
| 371 | static unsigned long __init xen_set_identity_and_remap_chunk( | 368 | static unsigned long __init xen_set_identity_and_remap_chunk( |
| 372 | const struct e820entry *list, size_t map_size, unsigned long start_pfn, | 369 | const struct e820entry *list, size_t map_size, unsigned long start_pfn, |
| 373 | unsigned long end_pfn, unsigned long nr_pages, unsigned long remap_pfn, | 370 | unsigned long end_pfn, unsigned long nr_pages, unsigned long remap_pfn, |
| 374 | unsigned long *identity, unsigned long *released) | 371 | unsigned long *released, unsigned long *remapped) |
| 375 | { | 372 | { |
| 376 | unsigned long pfn; | 373 | unsigned long pfn; |
| 377 | unsigned long i = 0; | 374 | unsigned long i = 0; |
| @@ -386,8 +383,7 @@ static unsigned long __init xen_set_identity_and_remap_chunk( | |||
| 386 | /* Do not remap pages beyond the current allocation */ | 383 | /* Do not remap pages beyond the current allocation */ |
| 387 | if (cur_pfn >= nr_pages) { | 384 | if (cur_pfn >= nr_pages) { |
| 388 | /* Identity map remaining pages */ | 385 | /* Identity map remaining pages */ |
| 389 | *identity += set_phys_range_identity(cur_pfn, | 386 | set_phys_range_identity(cur_pfn, cur_pfn + size); |
| 390 | cur_pfn + size); | ||
| 391 | break; | 387 | break; |
| 392 | } | 388 | } |
| 393 | if (cur_pfn + size > nr_pages) | 389 | if (cur_pfn + size > nr_pages) |
| @@ -398,7 +394,7 @@ static unsigned long __init xen_set_identity_and_remap_chunk( | |||
| 398 | if (!remap_range_size) { | 394 | if (!remap_range_size) { |
| 399 | pr_warning("Unable to find available pfn range, not remapping identity pages\n"); | 395 | pr_warning("Unable to find available pfn range, not remapping identity pages\n"); |
| 400 | xen_set_identity_and_release_chunk(cur_pfn, | 396 | xen_set_identity_and_release_chunk(cur_pfn, |
| 401 | cur_pfn + left, nr_pages, identity, released); | 397 | cur_pfn + left, nr_pages, released); |
| 402 | break; | 398 | break; |
| 403 | } | 399 | } |
| 404 | /* Adjust size to fit in current e820 RAM region */ | 400 | /* Adjust size to fit in current e820 RAM region */ |
| @@ -410,7 +406,7 @@ static unsigned long __init xen_set_identity_and_remap_chunk( | |||
| 410 | /* Update variables to reflect new mappings. */ | 406 | /* Update variables to reflect new mappings. */ |
| 411 | i += size; | 407 | i += size; |
| 412 | remap_pfn += size; | 408 | remap_pfn += size; |
| 413 | *identity += size; | 409 | *remapped += size; |
| 414 | } | 410 | } |
| 415 | 411 | ||
| 416 | /* | 412 | /* |
| @@ -427,13 +423,13 @@ static unsigned long __init xen_set_identity_and_remap_chunk( | |||
| 427 | 423 | ||
| 428 | static void __init xen_set_identity_and_remap( | 424 | static void __init xen_set_identity_and_remap( |
| 429 | const struct e820entry *list, size_t map_size, unsigned long nr_pages, | 425 | const struct e820entry *list, size_t map_size, unsigned long nr_pages, |
| 430 | unsigned long *released) | 426 | unsigned long *released, unsigned long *remapped) |
| 431 | { | 427 | { |
| 432 | phys_addr_t start = 0; | 428 | phys_addr_t start = 0; |
| 433 | unsigned long identity = 0; | ||
| 434 | unsigned long last_pfn = nr_pages; | 429 | unsigned long last_pfn = nr_pages; |
| 435 | const struct e820entry *entry; | 430 | const struct e820entry *entry; |
| 436 | unsigned long num_released = 0; | 431 | unsigned long num_released = 0; |
| 432 | unsigned long num_remapped = 0; | ||
| 437 | int i; | 433 | int i; |
| 438 | 434 | ||
| 439 | /* | 435 | /* |
| @@ -460,14 +456,14 @@ static void __init xen_set_identity_and_remap( | |||
| 460 | last_pfn = xen_set_identity_and_remap_chunk( | 456 | last_pfn = xen_set_identity_and_remap_chunk( |
| 461 | list, map_size, start_pfn, | 457 | list, map_size, start_pfn, |
| 462 | end_pfn, nr_pages, last_pfn, | 458 | end_pfn, nr_pages, last_pfn, |
| 463 | &identity, &num_released); | 459 | &num_released, &num_remapped); |
| 464 | start = end; | 460 | start = end; |
| 465 | } | 461 | } |
| 466 | } | 462 | } |
| 467 | 463 | ||
| 468 | *released = num_released; | 464 | *released = num_released; |
| 465 | *remapped = num_remapped; | ||
| 469 | 466 | ||
| 470 | pr_info("Set %ld page(s) to 1-1 mapping\n", identity); | ||
| 471 | pr_info("Released %ld page(s)\n", num_released); | 467 | pr_info("Released %ld page(s)\n", num_released); |
| 472 | } | 468 | } |
| 473 | 469 | ||
| @@ -586,6 +582,7 @@ char * __init xen_memory_setup(void) | |||
| 586 | struct xen_memory_map memmap; | 582 | struct xen_memory_map memmap; |
| 587 | unsigned long max_pages; | 583 | unsigned long max_pages; |
| 588 | unsigned long extra_pages = 0; | 584 | unsigned long extra_pages = 0; |
| 585 | unsigned long remapped_pages; | ||
| 589 | int i; | 586 | int i; |
| 590 | int op; | 587 | int op; |
| 591 | 588 | ||
| @@ -635,9 +632,10 @@ char * __init xen_memory_setup(void) | |||
| 635 | * underlying RAM. | 632 | * underlying RAM. |
| 636 | */ | 633 | */ |
| 637 | xen_set_identity_and_remap(map, memmap.nr_entries, max_pfn, | 634 | xen_set_identity_and_remap(map, memmap.nr_entries, max_pfn, |
| 638 | &xen_released_pages); | 635 | &xen_released_pages, &remapped_pages); |
| 639 | 636 | ||
| 640 | extra_pages += xen_released_pages; | 637 | extra_pages += xen_released_pages; |
| 638 | extra_pages += remapped_pages; | ||
| 641 | 639 | ||
| 642 | /* | 640 | /* |
| 643 | * Clamp the amount of extra memory to a EXTRA_MEM_RATIO | 641 | * Clamp the amount of extra memory to a EXTRA_MEM_RATIO |
diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c index f473d268d387..69087341d9ae 100644 --- a/arch/x86/xen/time.c +++ b/arch/x86/xen/time.c | |||
| @@ -391,7 +391,7 @@ static const struct clock_event_device *xen_clockevent = | |||
| 391 | 391 | ||
| 392 | struct xen_clock_event_device { | 392 | struct xen_clock_event_device { |
| 393 | struct clock_event_device evt; | 393 | struct clock_event_device evt; |
| 394 | char *name; | 394 | char name[16]; |
| 395 | }; | 395 | }; |
| 396 | static DEFINE_PER_CPU(struct xen_clock_event_device, xen_clock_events) = { .evt.irq = -1 }; | 396 | static DEFINE_PER_CPU(struct xen_clock_event_device, xen_clock_events) = { .evt.irq = -1 }; |
| 397 | 397 | ||
| @@ -420,46 +420,38 @@ void xen_teardown_timer(int cpu) | |||
| 420 | if (evt->irq >= 0) { | 420 | if (evt->irq >= 0) { |
| 421 | unbind_from_irqhandler(evt->irq, NULL); | 421 | unbind_from_irqhandler(evt->irq, NULL); |
| 422 | evt->irq = -1; | 422 | evt->irq = -1; |
| 423 | kfree(per_cpu(xen_clock_events, cpu).name); | ||
| 424 | per_cpu(xen_clock_events, cpu).name = NULL; | ||
| 425 | } | 423 | } |
| 426 | } | 424 | } |
| 427 | 425 | ||
| 428 | void xen_setup_timer(int cpu) | 426 | void xen_setup_timer(int cpu) |
| 429 | { | 427 | { |
| 430 | char *name; | 428 | struct xen_clock_event_device *xevt = &per_cpu(xen_clock_events, cpu); |
| 431 | struct clock_event_device *evt; | 429 | struct clock_event_device *evt = &xevt->evt; |
| 432 | int irq; | 430 | int irq; |
| 433 | 431 | ||
| 434 | evt = &per_cpu(xen_clock_events, cpu).evt; | ||
| 435 | WARN(evt->irq >= 0, "IRQ%d for CPU%d is already allocated\n", evt->irq, cpu); | 432 | WARN(evt->irq >= 0, "IRQ%d for CPU%d is already allocated\n", evt->irq, cpu); |
| 436 | if (evt->irq >= 0) | 433 | if (evt->irq >= 0) |
| 437 | xen_teardown_timer(cpu); | 434 | xen_teardown_timer(cpu); |
| 438 | 435 | ||
| 439 | printk(KERN_INFO "installing Xen timer for CPU %d\n", cpu); | 436 | printk(KERN_INFO "installing Xen timer for CPU %d\n", cpu); |
| 440 | 437 | ||
| 441 | name = kasprintf(GFP_KERNEL, "timer%d", cpu); | 438 | snprintf(xevt->name, sizeof(xevt->name), "timer%d", cpu); |
| 442 | if (!name) | ||
| 443 | name = "<timer kasprintf failed>"; | ||
| 444 | 439 | ||
| 445 | irq = bind_virq_to_irqhandler(VIRQ_TIMER, cpu, xen_timer_interrupt, | 440 | irq = bind_virq_to_irqhandler(VIRQ_TIMER, cpu, xen_timer_interrupt, |
| 446 | IRQF_PERCPU|IRQF_NOBALANCING|IRQF_TIMER| | 441 | IRQF_PERCPU|IRQF_NOBALANCING|IRQF_TIMER| |
| 447 | IRQF_FORCE_RESUME|IRQF_EARLY_RESUME, | 442 | IRQF_FORCE_RESUME|IRQF_EARLY_RESUME, |
| 448 | name, NULL); | 443 | xevt->name, NULL); |
| 449 | (void)xen_set_irq_priority(irq, XEN_IRQ_PRIORITY_MAX); | 444 | (void)xen_set_irq_priority(irq, XEN_IRQ_PRIORITY_MAX); |
| 450 | 445 | ||
| 451 | memcpy(evt, xen_clockevent, sizeof(*evt)); | 446 | memcpy(evt, xen_clockevent, sizeof(*evt)); |
| 452 | 447 | ||
| 453 | evt->cpumask = cpumask_of(cpu); | 448 | evt->cpumask = cpumask_of(cpu); |
| 454 | evt->irq = irq; | 449 | evt->irq = irq; |
| 455 | per_cpu(xen_clock_events, cpu).name = name; | ||
| 456 | } | 450 | } |
| 457 | 451 | ||
| 458 | 452 | ||
| 459 | void xen_setup_cpu_clockevents(void) | 453 | void xen_setup_cpu_clockevents(void) |
| 460 | { | 454 | { |
| 461 | BUG_ON(preemptible()); | ||
| 462 | |||
| 463 | clockevents_register_device(this_cpu_ptr(&xen_clock_events.evt)); | 455 | clockevents_register_device(this_cpu_ptr(&xen_clock_events.evt)); |
| 464 | } | 456 | } |
| 465 | 457 | ||
diff --git a/arch/xtensa/mm/fault.c b/arch/xtensa/mm/fault.c index b57c4f91f487..9e3571a6535c 100644 --- a/arch/xtensa/mm/fault.c +++ b/arch/xtensa/mm/fault.c | |||
| @@ -117,6 +117,8 @@ good_area: | |||
| 117 | if (unlikely(fault & VM_FAULT_ERROR)) { | 117 | if (unlikely(fault & VM_FAULT_ERROR)) { |
| 118 | if (fault & VM_FAULT_OOM) | 118 | if (fault & VM_FAULT_OOM) |
| 119 | goto out_of_memory; | 119 | goto out_of_memory; |
| 120 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 121 | goto bad_area; | ||
| 120 | else if (fault & VM_FAULT_SIGBUS) | 122 | else if (fault & VM_FAULT_SIGBUS) |
| 121 | goto do_sigbus; | 123 | goto do_sigbus; |
| 122 | BUG(); | 124 | BUG(); |
diff --git a/block/blk-core.c b/block/blk-core.c index 30f6153a40c2..3ad405571dcc 100644 --- a/block/blk-core.c +++ b/block/blk-core.c | |||
| @@ -473,6 +473,25 @@ void blk_queue_bypass_end(struct request_queue *q) | |||
| 473 | } | 473 | } |
| 474 | EXPORT_SYMBOL_GPL(blk_queue_bypass_end); | 474 | EXPORT_SYMBOL_GPL(blk_queue_bypass_end); |
| 475 | 475 | ||
| 476 | void blk_set_queue_dying(struct request_queue *q) | ||
| 477 | { | ||
| 478 | queue_flag_set_unlocked(QUEUE_FLAG_DYING, q); | ||
| 479 | |||
| 480 | if (q->mq_ops) | ||
| 481 | blk_mq_wake_waiters(q); | ||
| 482 | else { | ||
| 483 | struct request_list *rl; | ||
| 484 | |||
| 485 | blk_queue_for_each_rl(rl, q) { | ||
| 486 | if (rl->rq_pool) { | ||
| 487 | wake_up(&rl->wait[BLK_RW_SYNC]); | ||
| 488 | wake_up(&rl->wait[BLK_RW_ASYNC]); | ||
| 489 | } | ||
| 490 | } | ||
| 491 | } | ||
| 492 | } | ||
| 493 | EXPORT_SYMBOL_GPL(blk_set_queue_dying); | ||
| 494 | |||
| 476 | /** | 495 | /** |
| 477 | * blk_cleanup_queue - shutdown a request queue | 496 | * blk_cleanup_queue - shutdown a request queue |
| 478 | * @q: request queue to shutdown | 497 | * @q: request queue to shutdown |
| @@ -486,7 +505,7 @@ void blk_cleanup_queue(struct request_queue *q) | |||
| 486 | 505 | ||
| 487 | /* mark @q DYING, no new request or merges will be allowed afterwards */ | 506 | /* mark @q DYING, no new request or merges will be allowed afterwards */ |
| 488 | mutex_lock(&q->sysfs_lock); | 507 | mutex_lock(&q->sysfs_lock); |
| 489 | queue_flag_set_unlocked(QUEUE_FLAG_DYING, q); | 508 | blk_set_queue_dying(q); |
| 490 | spin_lock_irq(lock); | 509 | spin_lock_irq(lock); |
| 491 | 510 | ||
| 492 | /* | 511 | /* |
diff --git a/block/blk-mq-tag.c b/block/blk-mq-tag.c index 32e8dbb9ad1c..60c9d4a93fe4 100644 --- a/block/blk-mq-tag.c +++ b/block/blk-mq-tag.c | |||
| @@ -68,9 +68,9 @@ bool __blk_mq_tag_busy(struct blk_mq_hw_ctx *hctx) | |||
| 68 | } | 68 | } |
| 69 | 69 | ||
| 70 | /* | 70 | /* |
| 71 | * Wakeup all potentially sleeping on normal (non-reserved) tags | 71 | * Wakeup all potentially sleeping on tags |
| 72 | */ | 72 | */ |
| 73 | static void blk_mq_tag_wakeup_all(struct blk_mq_tags *tags) | 73 | void blk_mq_tag_wakeup_all(struct blk_mq_tags *tags, bool include_reserve) |
| 74 | { | 74 | { |
| 75 | struct blk_mq_bitmap_tags *bt; | 75 | struct blk_mq_bitmap_tags *bt; |
| 76 | int i, wake_index; | 76 | int i, wake_index; |
| @@ -85,6 +85,12 @@ static void blk_mq_tag_wakeup_all(struct blk_mq_tags *tags) | |||
| 85 | 85 | ||
| 86 | wake_index = bt_index_inc(wake_index); | 86 | wake_index = bt_index_inc(wake_index); |
| 87 | } | 87 | } |
| 88 | |||
| 89 | if (include_reserve) { | ||
| 90 | bt = &tags->breserved_tags; | ||
| 91 | if (waitqueue_active(&bt->bs[0].wait)) | ||
| 92 | wake_up(&bt->bs[0].wait); | ||
| 93 | } | ||
| 88 | } | 94 | } |
| 89 | 95 | ||
| 90 | /* | 96 | /* |
| @@ -100,7 +106,7 @@ void __blk_mq_tag_idle(struct blk_mq_hw_ctx *hctx) | |||
| 100 | 106 | ||
| 101 | atomic_dec(&tags->active_queues); | 107 | atomic_dec(&tags->active_queues); |
| 102 | 108 | ||
| 103 | blk_mq_tag_wakeup_all(tags); | 109 | blk_mq_tag_wakeup_all(tags, false); |
| 104 | } | 110 | } |
| 105 | 111 | ||
| 106 | /* | 112 | /* |
| @@ -584,7 +590,7 @@ int blk_mq_tag_update_depth(struct blk_mq_tags *tags, unsigned int tdepth) | |||
| 584 | * static and should never need resizing. | 590 | * static and should never need resizing. |
| 585 | */ | 591 | */ |
| 586 | bt_update_count(&tags->bitmap_tags, tdepth); | 592 | bt_update_count(&tags->bitmap_tags, tdepth); |
| 587 | blk_mq_tag_wakeup_all(tags); | 593 | blk_mq_tag_wakeup_all(tags, false); |
| 588 | return 0; | 594 | return 0; |
| 589 | } | 595 | } |
| 590 | 596 | ||
diff --git a/block/blk-mq-tag.h b/block/blk-mq-tag.h index 6206ed17ef76..a6fa0fc9d41a 100644 --- a/block/blk-mq-tag.h +++ b/block/blk-mq-tag.h | |||
| @@ -54,6 +54,7 @@ extern bool blk_mq_has_free_tags(struct blk_mq_tags *tags); | |||
| 54 | extern ssize_t blk_mq_tag_sysfs_show(struct blk_mq_tags *tags, char *page); | 54 | extern ssize_t blk_mq_tag_sysfs_show(struct blk_mq_tags *tags, char *page); |
| 55 | extern void blk_mq_tag_init_last_tag(struct blk_mq_tags *tags, unsigned int *last_tag); | 55 | extern void blk_mq_tag_init_last_tag(struct blk_mq_tags *tags, unsigned int *last_tag); |
| 56 | extern int blk_mq_tag_update_depth(struct blk_mq_tags *tags, unsigned int depth); | 56 | extern int blk_mq_tag_update_depth(struct blk_mq_tags *tags, unsigned int depth); |
| 57 | extern void blk_mq_tag_wakeup_all(struct blk_mq_tags *tags, bool); | ||
| 57 | 58 | ||
| 58 | enum { | 59 | enum { |
| 59 | BLK_MQ_TAG_CACHE_MIN = 1, | 60 | BLK_MQ_TAG_CACHE_MIN = 1, |
diff --git a/block/blk-mq.c b/block/blk-mq.c index da1ab5641227..2390c5541e71 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c | |||
| @@ -107,7 +107,7 @@ static void blk_mq_usage_counter_release(struct percpu_ref *ref) | |||
| 107 | wake_up_all(&q->mq_freeze_wq); | 107 | wake_up_all(&q->mq_freeze_wq); |
| 108 | } | 108 | } |
| 109 | 109 | ||
| 110 | static void blk_mq_freeze_queue_start(struct request_queue *q) | 110 | void blk_mq_freeze_queue_start(struct request_queue *q) |
| 111 | { | 111 | { |
| 112 | bool freeze; | 112 | bool freeze; |
| 113 | 113 | ||
| @@ -120,6 +120,7 @@ static void blk_mq_freeze_queue_start(struct request_queue *q) | |||
| 120 | blk_mq_run_queues(q, false); | 120 | blk_mq_run_queues(q, false); |
| 121 | } | 121 | } |
| 122 | } | 122 | } |
| 123 | EXPORT_SYMBOL_GPL(blk_mq_freeze_queue_start); | ||
| 123 | 124 | ||
| 124 | static void blk_mq_freeze_queue_wait(struct request_queue *q) | 125 | static void blk_mq_freeze_queue_wait(struct request_queue *q) |
| 125 | { | 126 | { |
| @@ -136,7 +137,7 @@ void blk_mq_freeze_queue(struct request_queue *q) | |||
| 136 | blk_mq_freeze_queue_wait(q); | 137 | blk_mq_freeze_queue_wait(q); |
| 137 | } | 138 | } |
| 138 | 139 | ||
| 139 | static void blk_mq_unfreeze_queue(struct request_queue *q) | 140 | void blk_mq_unfreeze_queue(struct request_queue *q) |
| 140 | { | 141 | { |
| 141 | bool wake; | 142 | bool wake; |
| 142 | 143 | ||
| @@ -149,6 +150,24 @@ static void blk_mq_unfreeze_queue(struct request_queue *q) | |||
| 149 | wake_up_all(&q->mq_freeze_wq); | 150 | wake_up_all(&q->mq_freeze_wq); |
| 150 | } | 151 | } |
| 151 | } | 152 | } |
| 153 | EXPORT_SYMBOL_GPL(blk_mq_unfreeze_queue); | ||
| 154 | |||
| 155 | void blk_mq_wake_waiters(struct request_queue *q) | ||
| 156 | { | ||
| 157 | struct blk_mq_hw_ctx *hctx; | ||
| 158 | unsigned int i; | ||
| 159 | |||
| 160 | queue_for_each_hw_ctx(q, hctx, i) | ||
| 161 | if (blk_mq_hw_queue_mapped(hctx)) | ||
| 162 | blk_mq_tag_wakeup_all(hctx->tags, true); | ||
| 163 | |||
| 164 | /* | ||
| 165 | * If we are called because the queue has now been marked as | ||
| 166 | * dying, we need to ensure that processes currently waiting on | ||
| 167 | * the queue are notified as well. | ||
| 168 | */ | ||
| 169 | wake_up_all(&q->mq_freeze_wq); | ||
| 170 | } | ||
| 152 | 171 | ||
| 153 | bool blk_mq_can_queue(struct blk_mq_hw_ctx *hctx) | 172 | bool blk_mq_can_queue(struct blk_mq_hw_ctx *hctx) |
| 154 | { | 173 | { |
| @@ -258,8 +277,10 @@ struct request *blk_mq_alloc_request(struct request_queue *q, int rw, gfp_t gfp, | |||
| 258 | ctx = alloc_data.ctx; | 277 | ctx = alloc_data.ctx; |
| 259 | } | 278 | } |
| 260 | blk_mq_put_ctx(ctx); | 279 | blk_mq_put_ctx(ctx); |
| 261 | if (!rq) | 280 | if (!rq) { |
| 281 | blk_mq_queue_exit(q); | ||
| 262 | return ERR_PTR(-EWOULDBLOCK); | 282 | return ERR_PTR(-EWOULDBLOCK); |
| 283 | } | ||
| 263 | return rq; | 284 | return rq; |
| 264 | } | 285 | } |
| 265 | EXPORT_SYMBOL(blk_mq_alloc_request); | 286 | EXPORT_SYMBOL(blk_mq_alloc_request); |
| @@ -383,6 +404,12 @@ void blk_mq_complete_request(struct request *rq) | |||
| 383 | } | 404 | } |
| 384 | EXPORT_SYMBOL(blk_mq_complete_request); | 405 | EXPORT_SYMBOL(blk_mq_complete_request); |
| 385 | 406 | ||
| 407 | int blk_mq_request_started(struct request *rq) | ||
| 408 | { | ||
| 409 | return test_bit(REQ_ATOM_STARTED, &rq->atomic_flags); | ||
| 410 | } | ||
| 411 | EXPORT_SYMBOL_GPL(blk_mq_request_started); | ||
| 412 | |||
| 386 | void blk_mq_start_request(struct request *rq) | 413 | void blk_mq_start_request(struct request *rq) |
| 387 | { | 414 | { |
| 388 | struct request_queue *q = rq->q; | 415 | struct request_queue *q = rq->q; |
| @@ -500,12 +527,38 @@ void blk_mq_add_to_requeue_list(struct request *rq, bool at_head) | |||
| 500 | } | 527 | } |
| 501 | EXPORT_SYMBOL(blk_mq_add_to_requeue_list); | 528 | EXPORT_SYMBOL(blk_mq_add_to_requeue_list); |
| 502 | 529 | ||
| 530 | void blk_mq_cancel_requeue_work(struct request_queue *q) | ||
| 531 | { | ||
| 532 | cancel_work_sync(&q->requeue_work); | ||
| 533 | } | ||
| 534 | EXPORT_SYMBOL_GPL(blk_mq_cancel_requeue_work); | ||
| 535 | |||
| 503 | void blk_mq_kick_requeue_list(struct request_queue *q) | 536 | void blk_mq_kick_requeue_list(struct request_queue *q) |
| 504 | { | 537 | { |
| 505 | kblockd_schedule_work(&q->requeue_work); | 538 | kblockd_schedule_work(&q->requeue_work); |
| 506 | } | 539 | } |
| 507 | EXPORT_SYMBOL(blk_mq_kick_requeue_list); | 540 | EXPORT_SYMBOL(blk_mq_kick_requeue_list); |
| 508 | 541 | ||
| 542 | void blk_mq_abort_requeue_list(struct request_queue *q) | ||
| 543 | { | ||
| 544 | unsigned long flags; | ||
| 545 | LIST_HEAD(rq_list); | ||
| 546 | |||
| 547 | spin_lock_irqsave(&q->requeue_lock, flags); | ||
| 548 | list_splice_init(&q->requeue_list, &rq_list); | ||
| 549 | spin_unlock_irqrestore(&q->requeue_lock, flags); | ||
| 550 | |||
| 551 | while (!list_empty(&rq_list)) { | ||
| 552 | struct request *rq; | ||
| 553 | |||
| 554 | rq = list_first_entry(&rq_list, struct request, queuelist); | ||
| 555 | list_del_init(&rq->queuelist); | ||
| 556 | rq->errors = -EIO; | ||
| 557 | blk_mq_end_request(rq, rq->errors); | ||
| 558 | } | ||
| 559 | } | ||
| 560 | EXPORT_SYMBOL(blk_mq_abort_requeue_list); | ||
| 561 | |||
| 509 | static inline bool is_flush_request(struct request *rq, | 562 | static inline bool is_flush_request(struct request *rq, |
| 510 | struct blk_flush_queue *fq, unsigned int tag) | 563 | struct blk_flush_queue *fq, unsigned int tag) |
| 511 | { | 564 | { |
| @@ -566,13 +619,24 @@ void blk_mq_rq_timed_out(struct request *req, bool reserved) | |||
| 566 | break; | 619 | break; |
| 567 | } | 620 | } |
| 568 | } | 621 | } |
| 569 | 622 | ||
| 570 | static void blk_mq_check_expired(struct blk_mq_hw_ctx *hctx, | 623 | static void blk_mq_check_expired(struct blk_mq_hw_ctx *hctx, |
| 571 | struct request *rq, void *priv, bool reserved) | 624 | struct request *rq, void *priv, bool reserved) |
| 572 | { | 625 | { |
| 573 | struct blk_mq_timeout_data *data = priv; | 626 | struct blk_mq_timeout_data *data = priv; |
| 574 | 627 | ||
| 575 | if (!test_bit(REQ_ATOM_STARTED, &rq->atomic_flags)) | 628 | if (!test_bit(REQ_ATOM_STARTED, &rq->atomic_flags)) { |
| 629 | /* | ||
| 630 | * If a request wasn't started before the queue was | ||
| 631 | * marked dying, kill it here or it'll go unnoticed. | ||
| 632 | */ | ||
| 633 | if (unlikely(blk_queue_dying(rq->q))) { | ||
| 634 | rq->errors = -EIO; | ||
| 635 | blk_mq_complete_request(rq); | ||
| 636 | } | ||
| 637 | return; | ||
| 638 | } | ||
| 639 | if (rq->cmd_flags & REQ_NO_TIMEOUT) | ||
| 576 | return; | 640 | return; |
| 577 | 641 | ||
| 578 | if (time_after_eq(jiffies, rq->deadline)) { | 642 | if (time_after_eq(jiffies, rq->deadline)) { |
| @@ -1577,10 +1641,8 @@ static void blk_mq_free_hw_queues(struct request_queue *q, | |||
| 1577 | struct blk_mq_hw_ctx *hctx; | 1641 | struct blk_mq_hw_ctx *hctx; |
| 1578 | unsigned int i; | 1642 | unsigned int i; |
| 1579 | 1643 | ||
| 1580 | queue_for_each_hw_ctx(q, hctx, i) { | 1644 | queue_for_each_hw_ctx(q, hctx, i) |
| 1581 | free_cpumask_var(hctx->cpumask); | 1645 | free_cpumask_var(hctx->cpumask); |
| 1582 | kfree(hctx); | ||
| 1583 | } | ||
| 1584 | } | 1646 | } |
| 1585 | 1647 | ||
| 1586 | static int blk_mq_init_hctx(struct request_queue *q, | 1648 | static int blk_mq_init_hctx(struct request_queue *q, |
| @@ -1601,7 +1663,6 @@ static int blk_mq_init_hctx(struct request_queue *q, | |||
| 1601 | hctx->queue = q; | 1663 | hctx->queue = q; |
| 1602 | hctx->queue_num = hctx_idx; | 1664 | hctx->queue_num = hctx_idx; |
| 1603 | hctx->flags = set->flags; | 1665 | hctx->flags = set->flags; |
| 1604 | hctx->cmd_size = set->cmd_size; | ||
| 1605 | 1666 | ||
| 1606 | blk_mq_init_cpu_notifier(&hctx->cpu_notifier, | 1667 | blk_mq_init_cpu_notifier(&hctx->cpu_notifier, |
| 1607 | blk_mq_hctx_notify, hctx); | 1668 | blk_mq_hctx_notify, hctx); |
| @@ -1806,6 +1867,27 @@ static void blk_mq_add_queue_tag_set(struct blk_mq_tag_set *set, | |||
| 1806 | mutex_unlock(&set->tag_list_lock); | 1867 | mutex_unlock(&set->tag_list_lock); |
| 1807 | } | 1868 | } |
| 1808 | 1869 | ||
| 1870 | /* | ||
| 1871 | * It is the actual release handler for mq, but we do it from | ||
| 1872 | * request queue's release handler for avoiding use-after-free | ||
| 1873 | * and headache because q->mq_kobj shouldn't have been introduced, | ||
| 1874 | * but we can't group ctx/kctx kobj without it. | ||
| 1875 | */ | ||
| 1876 | void blk_mq_release(struct request_queue *q) | ||
| 1877 | { | ||
| 1878 | struct blk_mq_hw_ctx *hctx; | ||
| 1879 | unsigned int i; | ||
| 1880 | |||
| 1881 | /* hctx kobj stays in hctx */ | ||
| 1882 | queue_for_each_hw_ctx(q, hctx, i) | ||
| 1883 | kfree(hctx); | ||
| 1884 | |||
| 1885 | kfree(q->queue_hw_ctx); | ||
| 1886 | |||
| 1887 | /* ctx kobj stays in queue_ctx */ | ||
| 1888 | free_percpu(q->queue_ctx); | ||
| 1889 | } | ||
| 1890 | |||
| 1809 | struct request_queue *blk_mq_init_queue(struct blk_mq_tag_set *set) | 1891 | struct request_queue *blk_mq_init_queue(struct blk_mq_tag_set *set) |
| 1810 | { | 1892 | { |
| 1811 | struct blk_mq_hw_ctx **hctxs; | 1893 | struct blk_mq_hw_ctx **hctxs; |
| @@ -1939,12 +2021,8 @@ void blk_mq_free_queue(struct request_queue *q) | |||
| 1939 | 2021 | ||
| 1940 | percpu_ref_exit(&q->mq_usage_counter); | 2022 | percpu_ref_exit(&q->mq_usage_counter); |
| 1941 | 2023 | ||
| 1942 | free_percpu(q->queue_ctx); | ||
| 1943 | kfree(q->queue_hw_ctx); | ||
| 1944 | kfree(q->mq_map); | 2024 | kfree(q->mq_map); |
| 1945 | 2025 | ||
| 1946 | q->queue_ctx = NULL; | ||
| 1947 | q->queue_hw_ctx = NULL; | ||
| 1948 | q->mq_map = NULL; | 2026 | q->mq_map = NULL; |
| 1949 | 2027 | ||
| 1950 | mutex_lock(&all_q_mutex); | 2028 | mutex_lock(&all_q_mutex); |
diff --git a/block/blk-mq.h b/block/blk-mq.h index 206230e64f79..6a48c4c0d8a2 100644 --- a/block/blk-mq.h +++ b/block/blk-mq.h | |||
| @@ -32,6 +32,7 @@ void blk_mq_free_queue(struct request_queue *q); | |||
| 32 | void blk_mq_clone_flush_request(struct request *flush_rq, | 32 | void blk_mq_clone_flush_request(struct request *flush_rq, |
| 33 | struct request *orig_rq); | 33 | struct request *orig_rq); |
| 34 | int blk_mq_update_nr_requests(struct request_queue *q, unsigned int nr); | 34 | int blk_mq_update_nr_requests(struct request_queue *q, unsigned int nr); |
| 35 | void blk_mq_wake_waiters(struct request_queue *q); | ||
| 35 | 36 | ||
| 36 | /* | 37 | /* |
| 37 | * CPU hotplug helpers | 38 | * CPU hotplug helpers |
| @@ -61,6 +62,8 @@ extern void blk_mq_sysfs_unregister(struct request_queue *q); | |||
| 61 | 62 | ||
| 62 | extern void blk_mq_rq_timed_out(struct request *req, bool reserved); | 63 | extern void blk_mq_rq_timed_out(struct request *req, bool reserved); |
| 63 | 64 | ||
| 65 | void blk_mq_release(struct request_queue *q); | ||
| 66 | |||
| 64 | /* | 67 | /* |
| 65 | * Basic implementation of sparser bitmap, allowing the user to spread | 68 | * Basic implementation of sparser bitmap, allowing the user to spread |
| 66 | * the bits over more cachelines. | 69 | * the bits over more cachelines. |
diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c index 935ea2aa0730..faaf36ade7eb 100644 --- a/block/blk-sysfs.c +++ b/block/blk-sysfs.c | |||
| @@ -517,6 +517,8 @@ static void blk_release_queue(struct kobject *kobj) | |||
| 517 | 517 | ||
| 518 | if (!q->mq_ops) | 518 | if (!q->mq_ops) |
| 519 | blk_free_flush_queue(q->fq); | 519 | blk_free_flush_queue(q->fq); |
| 520 | else | ||
| 521 | blk_mq_release(q); | ||
| 520 | 522 | ||
| 521 | blk_trace_shutdown(q); | 523 | blk_trace_shutdown(q); |
| 522 | 524 | ||
diff --git a/block/blk-timeout.c b/block/blk-timeout.c index 56c025894cdf..246dfb16c3d9 100644 --- a/block/blk-timeout.c +++ b/block/blk-timeout.c | |||
| @@ -190,6 +190,9 @@ void blk_add_timer(struct request *req) | |||
| 190 | struct request_queue *q = req->q; | 190 | struct request_queue *q = req->q; |
| 191 | unsigned long expiry; | 191 | unsigned long expiry; |
| 192 | 192 | ||
| 193 | if (req->cmd_flags & REQ_NO_TIMEOUT) | ||
| 194 | return; | ||
| 195 | |||
| 193 | /* blk-mq has its own handler, so we don't need ->rq_timed_out_fn */ | 196 | /* blk-mq has its own handler, so we don't need ->rq_timed_out_fn */ |
| 194 | if (!q->mq_ops && !q->rq_timed_out_fn) | 197 | if (!q->mq_ops && !q->rq_timed_out_fn) |
| 195 | return; | 198 | return; |
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/Kconfig b/drivers/Kconfig index 694d5a70d6ce..c70d6e45dc10 100644 --- a/drivers/Kconfig +++ b/drivers/Kconfig | |||
| @@ -134,8 +134,6 @@ source "drivers/staging/Kconfig" | |||
| 134 | 134 | ||
| 135 | source "drivers/platform/Kconfig" | 135 | source "drivers/platform/Kconfig" |
| 136 | 136 | ||
| 137 | source "drivers/soc/Kconfig" | ||
| 138 | |||
| 139 | source "drivers/clk/Kconfig" | 137 | source "drivers/clk/Kconfig" |
| 140 | 138 | ||
| 141 | source "drivers/hwspinlock/Kconfig" | 139 | source "drivers/hwspinlock/Kconfig" |
diff --git a/drivers/Makefile b/drivers/Makefile index 67d2334dc41e..527a6da8d539 100644 --- a/drivers/Makefile +++ b/drivers/Makefile | |||
| @@ -50,7 +50,10 @@ obj-$(CONFIG_RESET_CONTROLLER) += reset/ | |||
| 50 | obj-y += tty/ | 50 | obj-y += tty/ |
| 51 | obj-y += char/ | 51 | obj-y += char/ |
| 52 | 52 | ||
| 53 | # gpu/ comes after char for AGP vs DRM startup | 53 | # iommu/ comes before gpu as gpu are using iommu controllers |
| 54 | obj-$(CONFIG_IOMMU_SUPPORT) += iommu/ | ||
| 55 | |||
| 56 | # gpu/ comes after char for AGP vs DRM startup and after iommu | ||
| 54 | obj-y += gpu/ | 57 | obj-y += gpu/ |
| 55 | 58 | ||
| 56 | obj-$(CONFIG_CONNECTOR) += connector/ | 59 | obj-$(CONFIG_CONNECTOR) += connector/ |
| @@ -141,7 +144,6 @@ obj-y += clk/ | |||
| 141 | 144 | ||
| 142 | obj-$(CONFIG_MAILBOX) += mailbox/ | 145 | obj-$(CONFIG_MAILBOX) += mailbox/ |
| 143 | obj-$(CONFIG_HWSPINLOCK) += hwspinlock/ | 146 | obj-$(CONFIG_HWSPINLOCK) += hwspinlock/ |
| 144 | obj-$(CONFIG_IOMMU_SUPPORT) += iommu/ | ||
| 145 | obj-$(CONFIG_REMOTEPROC) += remoteproc/ | 147 | obj-$(CONFIG_REMOTEPROC) += remoteproc/ |
| 146 | obj-$(CONFIG_RPMSG) += rpmsg/ | 148 | obj-$(CONFIG_RPMSG) += rpmsg/ |
| 147 | 149 | ||
diff --git a/drivers/acpi/acpi_lpss.c b/drivers/acpi/acpi_lpss.c index 4f3febf8a589..e75737fd7eef 100644 --- a/drivers/acpi/acpi_lpss.c +++ b/drivers/acpi/acpi_lpss.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * ACPI support for Intel Lynxpoint LPSS. | 2 | * ACPI support for Intel Lynxpoint LPSS. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2013, 2014, Intel Corporation | 4 | * Copyright (C) 2013, Intel Corporation |
| 5 | * Authors: Mika Westerberg <mika.westerberg@linux.intel.com> | 5 | * Authors: Mika Westerberg <mika.westerberg@linux.intel.com> |
| 6 | * Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 6 | * Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| 7 | * | 7 | * |
| @@ -60,8 +60,6 @@ ACPI_MODULE_NAME("acpi_lpss"); | |||
| 60 | #define LPSS_CLK_DIVIDER BIT(2) | 60 | #define LPSS_CLK_DIVIDER BIT(2) |
| 61 | #define LPSS_LTR BIT(3) | 61 | #define LPSS_LTR BIT(3) |
| 62 | #define LPSS_SAVE_CTX BIT(4) | 62 | #define LPSS_SAVE_CTX BIT(4) |
| 63 | #define LPSS_DEV_PROXY BIT(5) | ||
| 64 | #define LPSS_PROXY_REQ BIT(6) | ||
| 65 | 63 | ||
| 66 | struct lpss_private_data; | 64 | struct lpss_private_data; |
| 67 | 65 | ||
| @@ -72,10 +70,8 @@ struct lpss_device_desc { | |||
| 72 | void (*setup)(struct lpss_private_data *pdata); | 70 | void (*setup)(struct lpss_private_data *pdata); |
| 73 | }; | 71 | }; |
| 74 | 72 | ||
| 75 | static struct device *proxy_device; | ||
| 76 | |||
| 77 | static struct lpss_device_desc lpss_dma_desc = { | 73 | static struct lpss_device_desc lpss_dma_desc = { |
| 78 | .flags = LPSS_CLK | LPSS_PROXY_REQ, | 74 | .flags = LPSS_CLK, |
| 79 | }; | 75 | }; |
| 80 | 76 | ||
| 81 | struct lpss_private_data { | 77 | struct lpss_private_data { |
| @@ -150,24 +146,22 @@ static struct lpss_device_desc byt_pwm_dev_desc = { | |||
| 150 | }; | 146 | }; |
| 151 | 147 | ||
| 152 | static struct lpss_device_desc byt_uart_dev_desc = { | 148 | static struct lpss_device_desc byt_uart_dev_desc = { |
| 153 | .flags = LPSS_CLK | LPSS_CLK_GATE | LPSS_CLK_DIVIDER | LPSS_SAVE_CTX | | 149 | .flags = LPSS_CLK | LPSS_CLK_GATE | LPSS_CLK_DIVIDER | LPSS_SAVE_CTX, |
| 154 | LPSS_DEV_PROXY, | ||
| 155 | .prv_offset = 0x800, | 150 | .prv_offset = 0x800, |
| 156 | .setup = lpss_uart_setup, | 151 | .setup = lpss_uart_setup, |
| 157 | }; | 152 | }; |
| 158 | 153 | ||
| 159 | static struct lpss_device_desc byt_spi_dev_desc = { | 154 | static struct lpss_device_desc byt_spi_dev_desc = { |
| 160 | .flags = LPSS_CLK | LPSS_CLK_GATE | LPSS_CLK_DIVIDER | LPSS_SAVE_CTX | | 155 | .flags = LPSS_CLK | LPSS_CLK_GATE | LPSS_CLK_DIVIDER | LPSS_SAVE_CTX, |
| 161 | LPSS_DEV_PROXY, | ||
| 162 | .prv_offset = 0x400, | 156 | .prv_offset = 0x400, |
| 163 | }; | 157 | }; |
| 164 | 158 | ||
| 165 | static struct lpss_device_desc byt_sdio_dev_desc = { | 159 | static struct lpss_device_desc byt_sdio_dev_desc = { |
| 166 | .flags = LPSS_CLK | LPSS_DEV_PROXY, | 160 | .flags = LPSS_CLK, |
| 167 | }; | 161 | }; |
| 168 | 162 | ||
| 169 | static struct lpss_device_desc byt_i2c_dev_desc = { | 163 | static struct lpss_device_desc byt_i2c_dev_desc = { |
| 170 | .flags = LPSS_CLK | LPSS_SAVE_CTX | LPSS_DEV_PROXY, | 164 | .flags = LPSS_CLK | LPSS_SAVE_CTX, |
| 171 | .prv_offset = 0x800, | 165 | .prv_offset = 0x800, |
| 172 | .setup = byt_i2c_setup, | 166 | .setup = byt_i2c_setup, |
| 173 | }; | 167 | }; |
| @@ -374,8 +368,6 @@ static int acpi_lpss_create_device(struct acpi_device *adev, | |||
| 374 | adev->driver_data = pdata; | 368 | adev->driver_data = pdata; |
| 375 | pdev = acpi_create_platform_device(adev); | 369 | pdev = acpi_create_platform_device(adev); |
| 376 | if (!IS_ERR_OR_NULL(pdev)) { | 370 | if (!IS_ERR_OR_NULL(pdev)) { |
| 377 | if (!proxy_device && dev_desc->flags & LPSS_DEV_PROXY) | ||
| 378 | proxy_device = &pdev->dev; | ||
| 379 | return 1; | 371 | return 1; |
| 380 | } | 372 | } |
| 381 | 373 | ||
| @@ -600,14 +592,7 @@ static int acpi_lpss_runtime_suspend(struct device *dev) | |||
| 600 | if (pdata->dev_desc->flags & LPSS_SAVE_CTX) | 592 | if (pdata->dev_desc->flags & LPSS_SAVE_CTX) |
| 601 | acpi_lpss_save_ctx(dev, pdata); | 593 | acpi_lpss_save_ctx(dev, pdata); |
| 602 | 594 | ||
| 603 | ret = acpi_dev_runtime_suspend(dev); | 595 | return acpi_dev_runtime_suspend(dev); |
| 604 | if (ret) | ||
| 605 | return ret; | ||
| 606 | |||
| 607 | if (pdata->dev_desc->flags & LPSS_PROXY_REQ && proxy_device) | ||
| 608 | return pm_runtime_put_sync_suspend(proxy_device); | ||
| 609 | |||
| 610 | return 0; | ||
| 611 | } | 596 | } |
| 612 | 597 | ||
| 613 | static int acpi_lpss_runtime_resume(struct device *dev) | 598 | static int acpi_lpss_runtime_resume(struct device *dev) |
| @@ -615,12 +600,6 @@ static int acpi_lpss_runtime_resume(struct device *dev) | |||
| 615 | struct lpss_private_data *pdata = acpi_driver_data(ACPI_COMPANION(dev)); | 600 | struct lpss_private_data *pdata = acpi_driver_data(ACPI_COMPANION(dev)); |
| 616 | int ret; | 601 | int ret; |
| 617 | 602 | ||
| 618 | if (pdata->dev_desc->flags & LPSS_PROXY_REQ && proxy_device) { | ||
| 619 | ret = pm_runtime_get_sync(proxy_device); | ||
| 620 | if (ret) | ||
| 621 | return ret; | ||
| 622 | } | ||
| 623 | |||
| 624 | ret = acpi_dev_runtime_resume(dev); | 603 | ret = acpi_dev_runtime_resume(dev); |
| 625 | if (ret) | 604 | if (ret) |
| 626 | return ret; | 605 | return ret; |
diff --git a/drivers/acpi/acpi_processor.c b/drivers/acpi/acpi_processor.c index 1fdf5e07a1c7..1020b1b53a17 100644 --- a/drivers/acpi/acpi_processor.c +++ b/drivers/acpi/acpi_processor.c | |||
| @@ -170,7 +170,7 @@ static int acpi_processor_hotadd_init(struct acpi_processor *pr) | |||
| 170 | acpi_status status; | 170 | acpi_status status; |
| 171 | int ret; | 171 | int ret; |
| 172 | 172 | ||
| 173 | if (pr->apic_id == -1) | 173 | if (pr->phys_id == -1) |
| 174 | return -ENODEV; | 174 | return -ENODEV; |
| 175 | 175 | ||
| 176 | status = acpi_evaluate_integer(pr->handle, "_STA", NULL, &sta); | 176 | status = acpi_evaluate_integer(pr->handle, "_STA", NULL, &sta); |
| @@ -180,13 +180,13 @@ static int acpi_processor_hotadd_init(struct acpi_processor *pr) | |||
| 180 | cpu_maps_update_begin(); | 180 | cpu_maps_update_begin(); |
| 181 | cpu_hotplug_begin(); | 181 | cpu_hotplug_begin(); |
| 182 | 182 | ||
| 183 | ret = acpi_map_lsapic(pr->handle, pr->apic_id, &pr->id); | 183 | ret = acpi_map_cpu(pr->handle, pr->phys_id, &pr->id); |
| 184 | if (ret) | 184 | if (ret) |
| 185 | goto out; | 185 | goto out; |
| 186 | 186 | ||
| 187 | ret = arch_register_cpu(pr->id); | 187 | ret = arch_register_cpu(pr->id); |
| 188 | if (ret) { | 188 | if (ret) { |
| 189 | acpi_unmap_lsapic(pr->id); | 189 | acpi_unmap_cpu(pr->id); |
| 190 | goto out; | 190 | goto out; |
| 191 | } | 191 | } |
| 192 | 192 | ||
| @@ -215,7 +215,7 @@ static int acpi_processor_get_info(struct acpi_device *device) | |||
| 215 | union acpi_object object = { 0 }; | 215 | union acpi_object object = { 0 }; |
| 216 | struct acpi_buffer buffer = { sizeof(union acpi_object), &object }; | 216 | struct acpi_buffer buffer = { sizeof(union acpi_object), &object }; |
| 217 | struct acpi_processor *pr = acpi_driver_data(device); | 217 | struct acpi_processor *pr = acpi_driver_data(device); |
| 218 | int apic_id, cpu_index, device_declaration = 0; | 218 | int phys_id, cpu_index, device_declaration = 0; |
| 219 | acpi_status status = AE_OK; | 219 | acpi_status status = AE_OK; |
| 220 | static int cpu0_initialized; | 220 | static int cpu0_initialized; |
| 221 | unsigned long long value; | 221 | unsigned long long value; |
| @@ -262,15 +262,18 @@ static int acpi_processor_get_info(struct acpi_device *device) | |||
| 262 | pr->acpi_id = value; | 262 | pr->acpi_id = value; |
| 263 | } | 263 | } |
| 264 | 264 | ||
| 265 | apic_id = acpi_get_apicid(pr->handle, device_declaration, pr->acpi_id); | 265 | phys_id = acpi_get_phys_id(pr->handle, device_declaration, pr->acpi_id); |
| 266 | if (apic_id < 0) | 266 | if (phys_id < 0) |
| 267 | acpi_handle_debug(pr->handle, "failed to get CPU APIC ID.\n"); | 267 | acpi_handle_debug(pr->handle, "failed to get CPU physical ID.\n"); |
| 268 | pr->apic_id = apic_id; | 268 | pr->phys_id = phys_id; |
| 269 | 269 | ||
| 270 | cpu_index = acpi_map_cpuid(pr->apic_id, pr->acpi_id); | 270 | cpu_index = acpi_map_cpuid(pr->phys_id, pr->acpi_id); |
| 271 | if (!cpu0_initialized && !acpi_has_cpu_in_madt()) { | 271 | if (!cpu0_initialized && !acpi_has_cpu_in_madt()) { |
| 272 | cpu0_initialized = 1; | 272 | cpu0_initialized = 1; |
| 273 | /* Handle UP system running SMP kernel, with no LAPIC in MADT */ | 273 | /* |
| 274 | * Handle UP system running SMP kernel, with no CPU | ||
| 275 | * entry in MADT | ||
| 276 | */ | ||
| 274 | if ((cpu_index == -1) && (num_online_cpus() == 1)) | 277 | if ((cpu_index == -1) && (num_online_cpus() == 1)) |
| 275 | cpu_index = 0; | 278 | cpu_index = 0; |
| 276 | } | 279 | } |
| @@ -458,7 +461,7 @@ static void acpi_processor_remove(struct acpi_device *device) | |||
| 458 | 461 | ||
| 459 | /* Remove the CPU. */ | 462 | /* Remove the CPU. */ |
| 460 | arch_unregister_cpu(pr->id); | 463 | arch_unregister_cpu(pr->id); |
| 461 | acpi_unmap_lsapic(pr->id); | 464 | acpi_unmap_cpu(pr->id); |
| 462 | 465 | ||
| 463 | cpu_hotplug_done(); | 466 | cpu_hotplug_done(); |
| 464 | cpu_maps_update_done(); | 467 | cpu_maps_update_done(); |
diff --git a/drivers/acpi/device_pm.c b/drivers/acpi/device_pm.c index c2daa85fc9f7..c0d44d394ca3 100644 --- a/drivers/acpi/device_pm.c +++ b/drivers/acpi/device_pm.c | |||
| @@ -257,7 +257,7 @@ int acpi_bus_init_power(struct acpi_device *device) | |||
| 257 | 257 | ||
| 258 | device->power.state = ACPI_STATE_UNKNOWN; | 258 | device->power.state = ACPI_STATE_UNKNOWN; |
| 259 | if (!acpi_device_is_present(device)) | 259 | if (!acpi_device_is_present(device)) |
| 260 | return 0; | 260 | return -ENXIO; |
| 261 | 261 | ||
| 262 | result = acpi_device_get_power(device, &state); | 262 | result = acpi_device_get_power(device, &state); |
| 263 | if (result) | 263 | if (result) |
diff --git a/drivers/acpi/int340x_thermal.c b/drivers/acpi/int340x_thermal.c index a27d31d1ba24..9dcf83682e36 100644 --- a/drivers/acpi/int340x_thermal.c +++ b/drivers/acpi/int340x_thermal.c | |||
| @@ -14,10 +14,10 @@ | |||
| 14 | 14 | ||
| 15 | #include "internal.h" | 15 | #include "internal.h" |
| 16 | 16 | ||
| 17 | #define DO_ENUMERATION 0x01 | 17 | #define INT3401_DEVICE 0X01 |
| 18 | static const struct acpi_device_id int340x_thermal_device_ids[] = { | 18 | static const struct acpi_device_id int340x_thermal_device_ids[] = { |
| 19 | {"INT3400", DO_ENUMERATION }, | 19 | {"INT3400"}, |
| 20 | {"INT3401"}, | 20 | {"INT3401", INT3401_DEVICE}, |
| 21 | {"INT3402"}, | 21 | {"INT3402"}, |
| 22 | {"INT3403"}, | 22 | {"INT3403"}, |
| 23 | {"INT3404"}, | 23 | {"INT3404"}, |
| @@ -34,7 +34,10 @@ static int int340x_thermal_handler_attach(struct acpi_device *adev, | |||
| 34 | const struct acpi_device_id *id) | 34 | const struct acpi_device_id *id) |
| 35 | { | 35 | { |
| 36 | #if defined(CONFIG_INT340X_THERMAL) || defined(CONFIG_INT340X_THERMAL_MODULE) | 36 | #if defined(CONFIG_INT340X_THERMAL) || defined(CONFIG_INT340X_THERMAL_MODULE) |
| 37 | if (id->driver_data == DO_ENUMERATION) | 37 | acpi_create_platform_device(adev); |
| 38 | #elif defined(INTEL_SOC_DTS_THERMAL) || defined(INTEL_SOC_DTS_THERMAL_MODULE) | ||
| 39 | /* Intel SoC DTS thermal driver needs INT3401 to set IRQ descriptor */ | ||
| 40 | if (id->driver_data == INT3401_DEVICE) | ||
| 38 | acpi_create_platform_device(adev); | 41 | acpi_create_platform_device(adev); |
| 39 | #endif | 42 | #endif |
| 40 | return 1; | 43 | return 1; |
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/acpi/processor_core.c b/drivers/acpi/processor_core.c index 342942f90a10..02e48394276c 100644 --- a/drivers/acpi/processor_core.c +++ b/drivers/acpi/processor_core.c | |||
| @@ -69,7 +69,7 @@ static int map_madt_entry(int type, u32 acpi_id) | |||
| 69 | unsigned long madt_end, entry; | 69 | unsigned long madt_end, entry; |
| 70 | static struct acpi_table_madt *madt; | 70 | static struct acpi_table_madt *madt; |
| 71 | static int read_madt; | 71 | static int read_madt; |
| 72 | int apic_id = -1; | 72 | int phys_id = -1; /* CPU hardware ID */ |
| 73 | 73 | ||
| 74 | if (!read_madt) { | 74 | if (!read_madt) { |
| 75 | if (ACPI_FAILURE(acpi_get_table(ACPI_SIG_MADT, 0, | 75 | if (ACPI_FAILURE(acpi_get_table(ACPI_SIG_MADT, 0, |
| @@ -79,7 +79,7 @@ static int map_madt_entry(int type, u32 acpi_id) | |||
| 79 | } | 79 | } |
| 80 | 80 | ||
| 81 | if (!madt) | 81 | if (!madt) |
| 82 | return apic_id; | 82 | return phys_id; |
| 83 | 83 | ||
| 84 | entry = (unsigned long)madt; | 84 | entry = (unsigned long)madt; |
| 85 | madt_end = entry + madt->header.length; | 85 | madt_end = entry + madt->header.length; |
| @@ -91,18 +91,18 @@ static int map_madt_entry(int type, u32 acpi_id) | |||
| 91 | struct acpi_subtable_header *header = | 91 | struct acpi_subtable_header *header = |
| 92 | (struct acpi_subtable_header *)entry; | 92 | (struct acpi_subtable_header *)entry; |
| 93 | if (header->type == ACPI_MADT_TYPE_LOCAL_APIC) { | 93 | if (header->type == ACPI_MADT_TYPE_LOCAL_APIC) { |
| 94 | if (!map_lapic_id(header, acpi_id, &apic_id)) | 94 | if (!map_lapic_id(header, acpi_id, &phys_id)) |
| 95 | break; | 95 | break; |
| 96 | } else if (header->type == ACPI_MADT_TYPE_LOCAL_X2APIC) { | 96 | } else if (header->type == ACPI_MADT_TYPE_LOCAL_X2APIC) { |
| 97 | if (!map_x2apic_id(header, type, acpi_id, &apic_id)) | 97 | if (!map_x2apic_id(header, type, acpi_id, &phys_id)) |
| 98 | break; | 98 | break; |
| 99 | } else if (header->type == ACPI_MADT_TYPE_LOCAL_SAPIC) { | 99 | } else if (header->type == ACPI_MADT_TYPE_LOCAL_SAPIC) { |
| 100 | if (!map_lsapic_id(header, type, acpi_id, &apic_id)) | 100 | if (!map_lsapic_id(header, type, acpi_id, &phys_id)) |
| 101 | break; | 101 | break; |
| 102 | } | 102 | } |
| 103 | entry += header->length; | 103 | entry += header->length; |
| 104 | } | 104 | } |
| 105 | return apic_id; | 105 | return phys_id; |
| 106 | } | 106 | } |
| 107 | 107 | ||
| 108 | static int map_mat_entry(acpi_handle handle, int type, u32 acpi_id) | 108 | static int map_mat_entry(acpi_handle handle, int type, u32 acpi_id) |
| @@ -110,7 +110,7 @@ static int map_mat_entry(acpi_handle handle, int type, u32 acpi_id) | |||
| 110 | struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; | 110 | struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; |
| 111 | union acpi_object *obj; | 111 | union acpi_object *obj; |
| 112 | struct acpi_subtable_header *header; | 112 | struct acpi_subtable_header *header; |
| 113 | int apic_id = -1; | 113 | int phys_id = -1; |
| 114 | 114 | ||
| 115 | if (ACPI_FAILURE(acpi_evaluate_object(handle, "_MAT", NULL, &buffer))) | 115 | if (ACPI_FAILURE(acpi_evaluate_object(handle, "_MAT", NULL, &buffer))) |
| 116 | goto exit; | 116 | goto exit; |
| @@ -126,38 +126,38 @@ static int map_mat_entry(acpi_handle handle, int type, u32 acpi_id) | |||
| 126 | 126 | ||
| 127 | header = (struct acpi_subtable_header *)obj->buffer.pointer; | 127 | header = (struct acpi_subtable_header *)obj->buffer.pointer; |
| 128 | if (header->type == ACPI_MADT_TYPE_LOCAL_APIC) | 128 | if (header->type == ACPI_MADT_TYPE_LOCAL_APIC) |
| 129 | map_lapic_id(header, acpi_id, &apic_id); | 129 | map_lapic_id(header, acpi_id, &phys_id); |
| 130 | else if (header->type == ACPI_MADT_TYPE_LOCAL_SAPIC) | 130 | else if (header->type == ACPI_MADT_TYPE_LOCAL_SAPIC) |
| 131 | map_lsapic_id(header, type, acpi_id, &apic_id); | 131 | map_lsapic_id(header, type, acpi_id, &phys_id); |
| 132 | else if (header->type == ACPI_MADT_TYPE_LOCAL_X2APIC) | 132 | else if (header->type == ACPI_MADT_TYPE_LOCAL_X2APIC) |
| 133 | map_x2apic_id(header, type, acpi_id, &apic_id); | 133 | map_x2apic_id(header, type, acpi_id, &phys_id); |
| 134 | 134 | ||
| 135 | exit: | 135 | exit: |
| 136 | kfree(buffer.pointer); | 136 | kfree(buffer.pointer); |
| 137 | return apic_id; | 137 | return phys_id; |
| 138 | } | 138 | } |
| 139 | 139 | ||
| 140 | int acpi_get_apicid(acpi_handle handle, int type, u32 acpi_id) | 140 | int acpi_get_phys_id(acpi_handle handle, int type, u32 acpi_id) |
| 141 | { | 141 | { |
| 142 | int apic_id; | 142 | int phys_id; |
| 143 | 143 | ||
| 144 | apic_id = map_mat_entry(handle, type, acpi_id); | 144 | phys_id = map_mat_entry(handle, type, acpi_id); |
| 145 | if (apic_id == -1) | 145 | if (phys_id == -1) |
| 146 | apic_id = map_madt_entry(type, acpi_id); | 146 | phys_id = map_madt_entry(type, acpi_id); |
| 147 | 147 | ||
| 148 | return apic_id; | 148 | return phys_id; |
| 149 | } | 149 | } |
| 150 | 150 | ||
| 151 | int acpi_map_cpuid(int apic_id, u32 acpi_id) | 151 | int acpi_map_cpuid(int phys_id, u32 acpi_id) |
| 152 | { | 152 | { |
| 153 | #ifdef CONFIG_SMP | 153 | #ifdef CONFIG_SMP |
| 154 | int i; | 154 | int i; |
| 155 | #endif | 155 | #endif |
| 156 | 156 | ||
| 157 | if (apic_id == -1) { | 157 | if (phys_id == -1) { |
| 158 | /* | 158 | /* |
| 159 | * On UP processor, there is no _MAT or MADT table. | 159 | * On UP processor, there is no _MAT or MADT table. |
| 160 | * So above apic_id is always set to -1. | 160 | * So above phys_id is always set to -1. |
| 161 | * | 161 | * |
| 162 | * BIOS may define multiple CPU handles even for UP processor. | 162 | * BIOS may define multiple CPU handles even for UP processor. |
| 163 | * For example, | 163 | * For example, |
| @@ -170,7 +170,7 @@ int acpi_map_cpuid(int apic_id, u32 acpi_id) | |||
| 170 | * Processor (CPU3, 0x03, 0x00000410, 0x06) {} | 170 | * Processor (CPU3, 0x03, 0x00000410, 0x06) {} |
| 171 | * } | 171 | * } |
| 172 | * | 172 | * |
| 173 | * Ignores apic_id and always returns 0 for the processor | 173 | * Ignores phys_id and always returns 0 for the processor |
| 174 | * handle with acpi id 0 if nr_cpu_ids is 1. | 174 | * handle with acpi id 0 if nr_cpu_ids is 1. |
| 175 | * This should be the case if SMP tables are not found. | 175 | * This should be the case if SMP tables are not found. |
| 176 | * Return -1 for other CPU's handle. | 176 | * Return -1 for other CPU's handle. |
| @@ -178,28 +178,28 @@ int acpi_map_cpuid(int apic_id, u32 acpi_id) | |||
| 178 | if (nr_cpu_ids <= 1 && acpi_id == 0) | 178 | if (nr_cpu_ids <= 1 && acpi_id == 0) |
| 179 | return acpi_id; | 179 | return acpi_id; |
| 180 | else | 180 | else |
| 181 | return apic_id; | 181 | return phys_id; |
| 182 | } | 182 | } |
| 183 | 183 | ||
| 184 | #ifdef CONFIG_SMP | 184 | #ifdef CONFIG_SMP |
| 185 | for_each_possible_cpu(i) { | 185 | for_each_possible_cpu(i) { |
| 186 | if (cpu_physical_id(i) == apic_id) | 186 | if (cpu_physical_id(i) == phys_id) |
| 187 | return i; | 187 | return i; |
| 188 | } | 188 | } |
| 189 | #else | 189 | #else |
| 190 | /* In UP kernel, only processor 0 is valid */ | 190 | /* In UP kernel, only processor 0 is valid */ |
| 191 | if (apic_id == 0) | 191 | if (phys_id == 0) |
| 192 | return apic_id; | 192 | return phys_id; |
| 193 | #endif | 193 | #endif |
| 194 | return -1; | 194 | return -1; |
| 195 | } | 195 | } |
| 196 | 196 | ||
| 197 | int acpi_get_cpuid(acpi_handle handle, int type, u32 acpi_id) | 197 | int acpi_get_cpuid(acpi_handle handle, int type, u32 acpi_id) |
| 198 | { | 198 | { |
| 199 | int apic_id; | 199 | int phys_id; |
| 200 | 200 | ||
| 201 | apic_id = acpi_get_apicid(handle, type, acpi_id); | 201 | phys_id = acpi_get_phys_id(handle, type, acpi_id); |
| 202 | 202 | ||
| 203 | return acpi_map_cpuid(apic_id, acpi_id); | 203 | return acpi_map_cpuid(phys_id, acpi_id); |
| 204 | } | 204 | } |
| 205 | EXPORT_SYMBOL_GPL(acpi_get_cpuid); | 205 | EXPORT_SYMBOL_GPL(acpi_get_cpuid); |
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index 16914cc30882..dc4d8960684a 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c | |||
| @@ -1001,7 +1001,7 @@ static void acpi_free_power_resources_lists(struct acpi_device *device) | |||
| 1001 | if (device->wakeup.flags.valid) | 1001 | if (device->wakeup.flags.valid) |
| 1002 | acpi_power_resources_list_free(&device->wakeup.resources); | 1002 | acpi_power_resources_list_free(&device->wakeup.resources); |
| 1003 | 1003 | ||
| 1004 | if (!device->flags.power_manageable) | 1004 | if (!device->power.flags.power_resources) |
| 1005 | return; | 1005 | return; |
| 1006 | 1006 | ||
| 1007 | for (i = ACPI_STATE_D0; i <= ACPI_STATE_D3_HOT; i++) { | 1007 | for (i = ACPI_STATE_D0; i <= ACPI_STATE_D3_HOT; i++) { |
| @@ -1744,10 +1744,8 @@ static void acpi_bus_get_power_flags(struct acpi_device *device) | |||
| 1744 | device->power.flags.power_resources) | 1744 | device->power.flags.power_resources) |
| 1745 | device->power.states[ACPI_STATE_D3_COLD].flags.os_accessible = 1; | 1745 | device->power.states[ACPI_STATE_D3_COLD].flags.os_accessible = 1; |
| 1746 | 1746 | ||
| 1747 | if (acpi_bus_init_power(device)) { | 1747 | if (acpi_bus_init_power(device)) |
| 1748 | acpi_free_power_resources_lists(device); | ||
| 1749 | device->flags.power_manageable = 0; | 1748 | device->flags.power_manageable = 0; |
| 1750 | } | ||
| 1751 | } | 1749 | } |
| 1752 | 1750 | ||
| 1753 | static void acpi_bus_get_flags(struct acpi_device *device) | 1751 | static void acpi_bus_get_flags(struct acpi_device *device) |
| @@ -2371,13 +2369,18 @@ static void acpi_bus_attach(struct acpi_device *device) | |||
| 2371 | /* Skip devices that are not present. */ | 2369 | /* Skip devices that are not present. */ |
| 2372 | if (!acpi_device_is_present(device)) { | 2370 | if (!acpi_device_is_present(device)) { |
| 2373 | device->flags.visited = false; | 2371 | device->flags.visited = false; |
| 2372 | device->flags.power_manageable = 0; | ||
| 2374 | return; | 2373 | return; |
| 2375 | } | 2374 | } |
| 2376 | if (device->handler) | 2375 | if (device->handler) |
| 2377 | goto ok; | 2376 | goto ok; |
| 2378 | 2377 | ||
| 2379 | if (!device->flags.initialized) { | 2378 | if (!device->flags.initialized) { |
| 2380 | acpi_bus_update_power(device, NULL); | 2379 | device->flags.power_manageable = |
| 2380 | device->power.states[ACPI_STATE_D0].flags.valid; | ||
| 2381 | if (acpi_bus_init_power(device)) | ||
| 2382 | device->flags.power_manageable = 0; | ||
| 2383 | |||
| 2381 | device->flags.initialized = true; | 2384 | device->flags.initialized = true; |
| 2382 | } | 2385 | } |
| 2383 | device->flags.visited = false; | 2386 | device->flags.visited = false; |
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index c72e79d2c5ad..032db459370f 100644 --- a/drivers/acpi/video.c +++ b/drivers/acpi/video.c | |||
| @@ -522,6 +522,16 @@ static struct dmi_system_id video_dmi_table[] __initdata = { | |||
| 522 | DMI_MATCH(DMI_PRODUCT_NAME, "370R4E/370R4V/370R5E/3570RE/370R5V"), | 522 | DMI_MATCH(DMI_PRODUCT_NAME, "370R4E/370R4V/370R5E/3570RE/370R5V"), |
| 523 | }, | 523 | }, |
| 524 | }, | 524 | }, |
| 525 | |||
| 526 | { | ||
| 527 | /* https://bugzilla.redhat.com/show_bug.cgi?id=1163574 */ | ||
| 528 | .callback = video_disable_native_backlight, | ||
| 529 | .ident = "Dell XPS15 L521X", | ||
| 530 | .matches = { | ||
| 531 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
| 532 | DMI_MATCH(DMI_PRODUCT_NAME, "XPS L521X"), | ||
| 533 | }, | ||
| 534 | }, | ||
| 525 | {} | 535 | {} |
| 526 | }; | 536 | }; |
| 527 | 537 | ||
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/null_blk.c b/drivers/block/null_blk.c index ae9f615382f6..aa2224aa7caa 100644 --- a/drivers/block/null_blk.c +++ b/drivers/block/null_blk.c | |||
| @@ -530,7 +530,7 @@ static int null_add_dev(void) | |||
| 530 | goto out_cleanup_queues; | 530 | goto out_cleanup_queues; |
| 531 | 531 | ||
| 532 | nullb->q = blk_mq_init_queue(&nullb->tag_set); | 532 | nullb->q = blk_mq_init_queue(&nullb->tag_set); |
| 533 | if (!nullb->q) { | 533 | if (IS_ERR(nullb->q)) { |
| 534 | rv = -ENOMEM; | 534 | rv = -ENOMEM; |
| 535 | goto out_cleanup_tags; | 535 | goto out_cleanup_tags; |
| 536 | } | 536 | } |
diff --git a/drivers/block/nvme-core.c b/drivers/block/nvme-core.c index b1d5d8797315..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; |
| @@ -215,6 +215,7 @@ static void nvme_set_info(struct nvme_cmd_info *cmd, void *ctx, | |||
| 215 | cmd->fn = handler; | 215 | cmd->fn = handler; |
| 216 | cmd->ctx = ctx; | 216 | cmd->ctx = ctx; |
| 217 | cmd->aborted = 0; | 217 | cmd->aborted = 0; |
| 218 | blk_mq_start_request(blk_mq_rq_from_pdu(cmd)); | ||
| 218 | } | 219 | } |
| 219 | 220 | ||
| 220 | /* Special values must be less than 0x1000 */ | 221 | /* Special values must be less than 0x1000 */ |
| @@ -431,8 +432,13 @@ static void req_completion(struct nvme_queue *nvmeq, void *ctx, | |||
| 431 | if (unlikely(status)) { | 432 | if (unlikely(status)) { |
| 432 | if (!(status & NVME_SC_DNR || blk_noretry_request(req)) | 433 | if (!(status & NVME_SC_DNR || blk_noretry_request(req)) |
| 433 | && (jiffies - req->start_time) < req->timeout) { | 434 | && (jiffies - req->start_time) < req->timeout) { |
| 435 | unsigned long flags; | ||
| 436 | |||
| 434 | blk_mq_requeue_request(req); | 437 | blk_mq_requeue_request(req); |
| 435 | blk_mq_kick_requeue_list(req->q); | 438 | spin_lock_irqsave(req->q->queue_lock, flags); |
| 439 | if (!blk_queue_stopped(req->q)) | ||
| 440 | blk_mq_kick_requeue_list(req->q); | ||
| 441 | spin_unlock_irqrestore(req->q->queue_lock, flags); | ||
| 436 | return; | 442 | return; |
| 437 | } | 443 | } |
| 438 | req->errors = nvme_error_status(status); | 444 | req->errors = nvme_error_status(status); |
| @@ -664,8 +670,6 @@ static int nvme_queue_rq(struct blk_mq_hw_ctx *hctx, | |||
| 664 | } | 670 | } |
| 665 | } | 671 | } |
| 666 | 672 | ||
| 667 | blk_mq_start_request(req); | ||
| 668 | |||
| 669 | nvme_set_info(cmd, iod, req_completion); | 673 | nvme_set_info(cmd, iod, req_completion); |
| 670 | spin_lock_irq(&nvmeq->q_lock); | 674 | spin_lock_irq(&nvmeq->q_lock); |
| 671 | if (req->cmd_flags & REQ_DISCARD) | 675 | if (req->cmd_flags & REQ_DISCARD) |
| @@ -835,6 +839,7 @@ static int nvme_submit_async_admin_req(struct nvme_dev *dev) | |||
| 835 | if (IS_ERR(req)) | 839 | if (IS_ERR(req)) |
| 836 | return PTR_ERR(req); | 840 | return PTR_ERR(req); |
| 837 | 841 | ||
| 842 | req->cmd_flags |= REQ_NO_TIMEOUT; | ||
| 838 | cmd_info = blk_mq_rq_to_pdu(req); | 843 | cmd_info = blk_mq_rq_to_pdu(req); |
| 839 | nvme_set_info(cmd_info, req, async_req_completion); | 844 | nvme_set_info(cmd_info, req, async_req_completion); |
| 840 | 845 | ||
| @@ -1016,14 +1021,19 @@ static void nvme_abort_req(struct request *req) | |||
| 1016 | struct nvme_command cmd; | 1021 | struct nvme_command cmd; |
| 1017 | 1022 | ||
| 1018 | if (!nvmeq->qid || cmd_rq->aborted) { | 1023 | if (!nvmeq->qid || cmd_rq->aborted) { |
| 1024 | unsigned long flags; | ||
| 1025 | |||
| 1026 | spin_lock_irqsave(&dev_list_lock, flags); | ||
| 1019 | if (work_busy(&dev->reset_work)) | 1027 | if (work_busy(&dev->reset_work)) |
| 1020 | return; | 1028 | goto out; |
| 1021 | list_del_init(&dev->node); | 1029 | list_del_init(&dev->node); |
| 1022 | dev_warn(&dev->pci_dev->dev, | 1030 | dev_warn(&dev->pci_dev->dev, |
| 1023 | "I/O %d QID %d timeout, reset controller\n", | 1031 | "I/O %d QID %d timeout, reset controller\n", |
| 1024 | req->tag, nvmeq->qid); | 1032 | req->tag, nvmeq->qid); |
| 1025 | dev->reset_workfn = nvme_reset_failed_dev; | 1033 | dev->reset_workfn = nvme_reset_failed_dev; |
| 1026 | queue_work(nvme_workq, &dev->reset_work); | 1034 | queue_work(nvme_workq, &dev->reset_work); |
| 1035 | out: | ||
| 1036 | spin_unlock_irqrestore(&dev_list_lock, flags); | ||
| 1027 | return; | 1037 | return; |
| 1028 | } | 1038 | } |
| 1029 | 1039 | ||
| @@ -1064,15 +1074,22 @@ static void nvme_cancel_queue_ios(struct blk_mq_hw_ctx *hctx, | |||
| 1064 | void *ctx; | 1074 | void *ctx; |
| 1065 | nvme_completion_fn fn; | 1075 | nvme_completion_fn fn; |
| 1066 | struct nvme_cmd_info *cmd; | 1076 | struct nvme_cmd_info *cmd; |
| 1067 | static struct nvme_completion cqe = { | 1077 | struct nvme_completion cqe; |
| 1068 | .status = cpu_to_le16(NVME_SC_ABORT_REQ << 1), | 1078 | |
| 1069 | }; | 1079 | if (!blk_mq_request_started(req)) |
| 1080 | return; | ||
| 1070 | 1081 | ||
| 1071 | cmd = blk_mq_rq_to_pdu(req); | 1082 | cmd = blk_mq_rq_to_pdu(req); |
| 1072 | 1083 | ||
| 1073 | if (cmd->ctx == CMD_CTX_CANCELLED) | 1084 | if (cmd->ctx == CMD_CTX_CANCELLED) |
| 1074 | return; | 1085 | return; |
| 1075 | 1086 | ||
| 1087 | if (blk_queue_dying(req->q)) | ||
| 1088 | cqe.status = cpu_to_le16((NVME_SC_ABORT_REQ | NVME_SC_DNR) << 1); | ||
| 1089 | else | ||
| 1090 | cqe.status = cpu_to_le16(NVME_SC_ABORT_REQ << 1); | ||
| 1091 | |||
| 1092 | |||
| 1076 | dev_warn(nvmeq->q_dmadev, "Cancelling I/O %d QID %d\n", | 1093 | dev_warn(nvmeq->q_dmadev, "Cancelling I/O %d QID %d\n", |
| 1077 | req->tag, nvmeq->qid); | 1094 | req->tag, nvmeq->qid); |
| 1078 | ctx = cancel_cmd_info(cmd, &fn); | 1095 | ctx = cancel_cmd_info(cmd, &fn); |
| @@ -1084,17 +1101,29 @@ static enum blk_eh_timer_return nvme_timeout(struct request *req, bool reserved) | |||
| 1084 | struct nvme_cmd_info *cmd = blk_mq_rq_to_pdu(req); | 1101 | struct nvme_cmd_info *cmd = blk_mq_rq_to_pdu(req); |
| 1085 | struct nvme_queue *nvmeq = cmd->nvmeq; | 1102 | struct nvme_queue *nvmeq = cmd->nvmeq; |
| 1086 | 1103 | ||
| 1087 | dev_warn(nvmeq->q_dmadev, "Timeout I/O %d QID %d\n", req->tag, | ||
| 1088 | nvmeq->qid); | ||
| 1089 | if (nvmeq->dev->initialized) | ||
| 1090 | nvme_abort_req(req); | ||
| 1091 | |||
| 1092 | /* | 1104 | /* |
| 1093 | * The aborted req will be completed on receiving the abort req. | 1105 | * The aborted req will be completed on receiving the abort req. |
| 1094 | * We enable the timer again. If hit twice, it'll cause a device reset, | 1106 | * We enable the timer again. If hit twice, it'll cause a device reset, |
| 1095 | * as the device then is in a faulty state. | 1107 | * as the device then is in a faulty state. |
| 1096 | */ | 1108 | */ |
| 1097 | return BLK_EH_RESET_TIMER; | 1109 | int ret = BLK_EH_RESET_TIMER; |
| 1110 | |||
| 1111 | dev_warn(nvmeq->q_dmadev, "Timeout I/O %d QID %d\n", req->tag, | ||
| 1112 | nvmeq->qid); | ||
| 1113 | |||
| 1114 | spin_lock_irq(&nvmeq->q_lock); | ||
| 1115 | if (!nvmeq->dev->initialized) { | ||
| 1116 | /* | ||
| 1117 | * Force cancelled command frees the request, which requires we | ||
| 1118 | * return BLK_EH_NOT_HANDLED. | ||
| 1119 | */ | ||
| 1120 | nvme_cancel_queue_ios(nvmeq->hctx, req, nvmeq, reserved); | ||
| 1121 | ret = BLK_EH_NOT_HANDLED; | ||
| 1122 | } else | ||
| 1123 | nvme_abort_req(req); | ||
| 1124 | spin_unlock_irq(&nvmeq->q_lock); | ||
| 1125 | |||
| 1126 | return ret; | ||
| 1098 | } | 1127 | } |
| 1099 | 1128 | ||
| 1100 | static void nvme_free_queue(struct nvme_queue *nvmeq) | 1129 | static void nvme_free_queue(struct nvme_queue *nvmeq) |
| @@ -1131,10 +1160,16 @@ static void nvme_free_queues(struct nvme_dev *dev, int lowest) | |||
| 1131 | */ | 1160 | */ |
| 1132 | static int nvme_suspend_queue(struct nvme_queue *nvmeq) | 1161 | static int nvme_suspend_queue(struct nvme_queue *nvmeq) |
| 1133 | { | 1162 | { |
| 1134 | int vector = nvmeq->dev->entry[nvmeq->cq_vector].vector; | 1163 | int vector; |
| 1135 | 1164 | ||
| 1136 | spin_lock_irq(&nvmeq->q_lock); | 1165 | spin_lock_irq(&nvmeq->q_lock); |
| 1166 | if (nvmeq->cq_vector == -1) { | ||
| 1167 | spin_unlock_irq(&nvmeq->q_lock); | ||
| 1168 | return 1; | ||
| 1169 | } | ||
| 1170 | vector = nvmeq->dev->entry[nvmeq->cq_vector].vector; | ||
| 1137 | nvmeq->dev->online_queues--; | 1171 | nvmeq->dev->online_queues--; |
| 1172 | nvmeq->cq_vector = -1; | ||
| 1138 | spin_unlock_irq(&nvmeq->q_lock); | 1173 | spin_unlock_irq(&nvmeq->q_lock); |
| 1139 | 1174 | ||
| 1140 | irq_set_affinity_hint(vector, NULL); | 1175 | irq_set_affinity_hint(vector, NULL); |
| @@ -1169,11 +1204,13 @@ static void nvme_disable_queue(struct nvme_dev *dev, int qid) | |||
| 1169 | adapter_delete_sq(dev, qid); | 1204 | adapter_delete_sq(dev, qid); |
| 1170 | adapter_delete_cq(dev, qid); | 1205 | adapter_delete_cq(dev, qid); |
| 1171 | } | 1206 | } |
| 1207 | if (!qid && dev->admin_q) | ||
| 1208 | blk_mq_freeze_queue_start(dev->admin_q); | ||
| 1172 | nvme_clear_queue(nvmeq); | 1209 | nvme_clear_queue(nvmeq); |
| 1173 | } | 1210 | } |
| 1174 | 1211 | ||
| 1175 | static struct nvme_queue *nvme_alloc_queue(struct nvme_dev *dev, int qid, | 1212 | static struct nvme_queue *nvme_alloc_queue(struct nvme_dev *dev, int qid, |
| 1176 | int depth, int vector) | 1213 | int depth) |
| 1177 | { | 1214 | { |
| 1178 | struct device *dmadev = &dev->pci_dev->dev; | 1215 | struct device *dmadev = &dev->pci_dev->dev; |
| 1179 | struct nvme_queue *nvmeq = kzalloc(sizeof(*nvmeq), GFP_KERNEL); | 1216 | struct nvme_queue *nvmeq = kzalloc(sizeof(*nvmeq), GFP_KERNEL); |
| @@ -1199,7 +1236,6 @@ static struct nvme_queue *nvme_alloc_queue(struct nvme_dev *dev, int qid, | |||
| 1199 | nvmeq->cq_phase = 1; | 1236 | nvmeq->cq_phase = 1; |
| 1200 | nvmeq->q_db = &dev->dbs[qid * 2 * dev->db_stride]; | 1237 | nvmeq->q_db = &dev->dbs[qid * 2 * dev->db_stride]; |
| 1201 | nvmeq->q_depth = depth; | 1238 | nvmeq->q_depth = depth; |
| 1202 | nvmeq->cq_vector = vector; | ||
| 1203 | nvmeq->qid = qid; | 1239 | nvmeq->qid = qid; |
| 1204 | dev->queue_count++; | 1240 | dev->queue_count++; |
| 1205 | dev->queues[qid] = nvmeq; | 1241 | dev->queues[qid] = nvmeq; |
| @@ -1244,6 +1280,7 @@ static int nvme_create_queue(struct nvme_queue *nvmeq, int qid) | |||
| 1244 | struct nvme_dev *dev = nvmeq->dev; | 1280 | struct nvme_dev *dev = nvmeq->dev; |
| 1245 | int result; | 1281 | int result; |
| 1246 | 1282 | ||
| 1283 | nvmeq->cq_vector = qid - 1; | ||
| 1247 | result = adapter_alloc_cq(dev, qid, nvmeq); | 1284 | result = adapter_alloc_cq(dev, qid, nvmeq); |
| 1248 | if (result < 0) | 1285 | if (result < 0) |
| 1249 | return result; | 1286 | return result; |
| @@ -1355,6 +1392,14 @@ static struct blk_mq_ops nvme_mq_ops = { | |||
| 1355 | .timeout = nvme_timeout, | 1392 | .timeout = nvme_timeout, |
| 1356 | }; | 1393 | }; |
| 1357 | 1394 | ||
| 1395 | static void nvme_dev_remove_admin(struct nvme_dev *dev) | ||
| 1396 | { | ||
| 1397 | if (dev->admin_q && !blk_queue_dying(dev->admin_q)) { | ||
| 1398 | blk_cleanup_queue(dev->admin_q); | ||
| 1399 | blk_mq_free_tag_set(&dev->admin_tagset); | ||
| 1400 | } | ||
| 1401 | } | ||
| 1402 | |||
| 1358 | static int nvme_alloc_admin_tags(struct nvme_dev *dev) | 1403 | static int nvme_alloc_admin_tags(struct nvme_dev *dev) |
| 1359 | { | 1404 | { |
| 1360 | if (!dev->admin_q) { | 1405 | if (!dev->admin_q) { |
| @@ -1370,21 +1415,20 @@ static int nvme_alloc_admin_tags(struct nvme_dev *dev) | |||
| 1370 | return -ENOMEM; | 1415 | return -ENOMEM; |
| 1371 | 1416 | ||
| 1372 | dev->admin_q = blk_mq_init_queue(&dev->admin_tagset); | 1417 | dev->admin_q = blk_mq_init_queue(&dev->admin_tagset); |
| 1373 | if (!dev->admin_q) { | 1418 | if (IS_ERR(dev->admin_q)) { |
| 1374 | blk_mq_free_tag_set(&dev->admin_tagset); | 1419 | blk_mq_free_tag_set(&dev->admin_tagset); |
| 1375 | return -ENOMEM; | 1420 | return -ENOMEM; |
| 1376 | } | 1421 | } |
| 1377 | } | 1422 | if (!blk_get_queue(dev->admin_q)) { |
| 1423 | nvme_dev_remove_admin(dev); | ||
| 1424 | return -ENODEV; | ||
| 1425 | } | ||
| 1426 | } else | ||
| 1427 | blk_mq_unfreeze_queue(dev->admin_q); | ||
| 1378 | 1428 | ||
| 1379 | return 0; | 1429 | return 0; |
| 1380 | } | 1430 | } |
| 1381 | 1431 | ||
| 1382 | static void nvme_free_admin_tags(struct nvme_dev *dev) | ||
| 1383 | { | ||
| 1384 | if (dev->admin_q) | ||
| 1385 | blk_mq_free_tag_set(&dev->admin_tagset); | ||
| 1386 | } | ||
| 1387 | |||
| 1388 | static int nvme_configure_admin_queue(struct nvme_dev *dev) | 1432 | static int nvme_configure_admin_queue(struct nvme_dev *dev) |
| 1389 | { | 1433 | { |
| 1390 | int result; | 1434 | int result; |
| @@ -1416,7 +1460,7 @@ static int nvme_configure_admin_queue(struct nvme_dev *dev) | |||
| 1416 | 1460 | ||
| 1417 | nvmeq = dev->queues[0]; | 1461 | nvmeq = dev->queues[0]; |
| 1418 | if (!nvmeq) { | 1462 | if (!nvmeq) { |
| 1419 | nvmeq = nvme_alloc_queue(dev, 0, NVME_AQ_DEPTH, 0); | 1463 | nvmeq = nvme_alloc_queue(dev, 0, NVME_AQ_DEPTH); |
| 1420 | if (!nvmeq) | 1464 | if (!nvmeq) |
| 1421 | return -ENOMEM; | 1465 | return -ENOMEM; |
| 1422 | } | 1466 | } |
| @@ -1439,18 +1483,13 @@ static int nvme_configure_admin_queue(struct nvme_dev *dev) | |||
| 1439 | if (result) | 1483 | if (result) |
| 1440 | goto free_nvmeq; | 1484 | goto free_nvmeq; |
| 1441 | 1485 | ||
| 1442 | result = nvme_alloc_admin_tags(dev); | 1486 | nvmeq->cq_vector = 0; |
| 1443 | if (result) | ||
| 1444 | goto free_nvmeq; | ||
| 1445 | |||
| 1446 | result = queue_request_irq(dev, nvmeq, nvmeq->irqname); | 1487 | result = queue_request_irq(dev, nvmeq, nvmeq->irqname); |
| 1447 | if (result) | 1488 | if (result) |
| 1448 | goto free_tags; | 1489 | goto free_nvmeq; |
| 1449 | 1490 | ||
| 1450 | return result; | 1491 | return result; |
| 1451 | 1492 | ||
| 1452 | free_tags: | ||
| 1453 | nvme_free_admin_tags(dev); | ||
| 1454 | free_nvmeq: | 1493 | free_nvmeq: |
| 1455 | nvme_free_queues(dev, 0); | 1494 | nvme_free_queues(dev, 0); |
| 1456 | return result; | 1495 | return result; |
| @@ -1944,7 +1983,7 @@ static void nvme_create_io_queues(struct nvme_dev *dev) | |||
| 1944 | unsigned i; | 1983 | unsigned i; |
| 1945 | 1984 | ||
| 1946 | for (i = dev->queue_count; i <= dev->max_qid; i++) | 1985 | for (i = dev->queue_count; i <= dev->max_qid; i++) |
| 1947 | if (!nvme_alloc_queue(dev, i, dev->q_depth, i - 1)) | 1986 | if (!nvme_alloc_queue(dev, i, dev->q_depth)) |
| 1948 | break; | 1987 | break; |
| 1949 | 1988 | ||
| 1950 | for (i = dev->online_queues; i <= dev->queue_count - 1; i++) | 1989 | for (i = dev->online_queues; i <= dev->queue_count - 1; i++) |
| @@ -2235,13 +2274,18 @@ static void nvme_wait_dq(struct nvme_delq_ctx *dq, struct nvme_dev *dev) | |||
| 2235 | break; | 2274 | break; |
| 2236 | if (!schedule_timeout(ADMIN_TIMEOUT) || | 2275 | if (!schedule_timeout(ADMIN_TIMEOUT) || |
| 2237 | fatal_signal_pending(current)) { | 2276 | fatal_signal_pending(current)) { |
| 2277 | /* | ||
| 2278 | * Disable the controller first since we can't trust it | ||
| 2279 | * at this point, but leave the admin queue enabled | ||
| 2280 | * until all queue deletion requests are flushed. | ||
| 2281 | * FIXME: This may take a while if there are more h/w | ||
| 2282 | * queues than admin tags. | ||
| 2283 | */ | ||
| 2238 | set_current_state(TASK_RUNNING); | 2284 | set_current_state(TASK_RUNNING); |
| 2239 | |||
| 2240 | nvme_disable_ctrl(dev, readq(&dev->bar->cap)); | 2285 | nvme_disable_ctrl(dev, readq(&dev->bar->cap)); |
| 2241 | nvme_disable_queue(dev, 0); | 2286 | nvme_clear_queue(dev->queues[0]); |
| 2242 | |||
| 2243 | send_sig(SIGKILL, dq->worker->task, 1); | ||
| 2244 | flush_kthread_worker(dq->worker); | 2287 | flush_kthread_worker(dq->worker); |
| 2288 | nvme_disable_queue(dev, 0); | ||
| 2245 | return; | 2289 | return; |
| 2246 | } | 2290 | } |
| 2247 | } | 2291 | } |
| @@ -2318,7 +2362,6 @@ static void nvme_del_queue_start(struct kthread_work *work) | |||
| 2318 | { | 2362 | { |
| 2319 | struct nvme_queue *nvmeq = container_of(work, struct nvme_queue, | 2363 | struct nvme_queue *nvmeq = container_of(work, struct nvme_queue, |
| 2320 | cmdinfo.work); | 2364 | cmdinfo.work); |
| 2321 | allow_signal(SIGKILL); | ||
| 2322 | if (nvme_delete_sq(nvmeq)) | 2365 | if (nvme_delete_sq(nvmeq)) |
| 2323 | nvme_del_queue_end(nvmeq); | 2366 | nvme_del_queue_end(nvmeq); |
| 2324 | } | 2367 | } |
| @@ -2376,6 +2419,34 @@ static void nvme_dev_list_remove(struct nvme_dev *dev) | |||
| 2376 | kthread_stop(tmp); | 2419 | kthread_stop(tmp); |
| 2377 | } | 2420 | } |
| 2378 | 2421 | ||
| 2422 | static void nvme_freeze_queues(struct nvme_dev *dev) | ||
| 2423 | { | ||
| 2424 | struct nvme_ns *ns; | ||
| 2425 | |||
| 2426 | list_for_each_entry(ns, &dev->namespaces, list) { | ||
| 2427 | blk_mq_freeze_queue_start(ns->queue); | ||
| 2428 | |||
| 2429 | spin_lock(ns->queue->queue_lock); | ||
| 2430 | queue_flag_set(QUEUE_FLAG_STOPPED, ns->queue); | ||
| 2431 | spin_unlock(ns->queue->queue_lock); | ||
| 2432 | |||
| 2433 | blk_mq_cancel_requeue_work(ns->queue); | ||
| 2434 | blk_mq_stop_hw_queues(ns->queue); | ||
| 2435 | } | ||
| 2436 | } | ||
| 2437 | |||
| 2438 | static void nvme_unfreeze_queues(struct nvme_dev *dev) | ||
| 2439 | { | ||
| 2440 | struct nvme_ns *ns; | ||
| 2441 | |||
| 2442 | list_for_each_entry(ns, &dev->namespaces, list) { | ||
| 2443 | queue_flag_clear_unlocked(QUEUE_FLAG_STOPPED, ns->queue); | ||
| 2444 | blk_mq_unfreeze_queue(ns->queue); | ||
| 2445 | blk_mq_start_stopped_hw_queues(ns->queue, true); | ||
| 2446 | blk_mq_kick_requeue_list(ns->queue); | ||
| 2447 | } | ||
| 2448 | } | ||
| 2449 | |||
| 2379 | static void nvme_dev_shutdown(struct nvme_dev *dev) | 2450 | static void nvme_dev_shutdown(struct nvme_dev *dev) |
| 2380 | { | 2451 | { |
| 2381 | int i; | 2452 | int i; |
| @@ -2384,8 +2455,10 @@ static void nvme_dev_shutdown(struct nvme_dev *dev) | |||
| 2384 | dev->initialized = 0; | 2455 | dev->initialized = 0; |
| 2385 | nvme_dev_list_remove(dev); | 2456 | nvme_dev_list_remove(dev); |
| 2386 | 2457 | ||
| 2387 | if (dev->bar) | 2458 | if (dev->bar) { |
| 2459 | nvme_freeze_queues(dev); | ||
| 2388 | csts = readl(&dev->bar->csts); | 2460 | csts = readl(&dev->bar->csts); |
| 2461 | } | ||
| 2389 | if (csts & NVME_CSTS_CFS || !(csts & NVME_CSTS_RDY)) { | 2462 | if (csts & NVME_CSTS_CFS || !(csts & NVME_CSTS_RDY)) { |
| 2390 | for (i = dev->queue_count - 1; i >= 0; i--) { | 2463 | for (i = dev->queue_count - 1; i >= 0; i--) { |
| 2391 | struct nvme_queue *nvmeq = dev->queues[i]; | 2464 | struct nvme_queue *nvmeq = dev->queues[i]; |
| @@ -2400,12 +2473,6 @@ static void nvme_dev_shutdown(struct nvme_dev *dev) | |||
| 2400 | nvme_dev_unmap(dev); | 2473 | nvme_dev_unmap(dev); |
| 2401 | } | 2474 | } |
| 2402 | 2475 | ||
| 2403 | static void nvme_dev_remove_admin(struct nvme_dev *dev) | ||
| 2404 | { | ||
| 2405 | if (dev->admin_q && !blk_queue_dying(dev->admin_q)) | ||
| 2406 | blk_cleanup_queue(dev->admin_q); | ||
| 2407 | } | ||
| 2408 | |||
| 2409 | static void nvme_dev_remove(struct nvme_dev *dev) | 2476 | static void nvme_dev_remove(struct nvme_dev *dev) |
| 2410 | { | 2477 | { |
| 2411 | struct nvme_ns *ns; | 2478 | struct nvme_ns *ns; |
| @@ -2413,8 +2480,10 @@ static void nvme_dev_remove(struct nvme_dev *dev) | |||
| 2413 | list_for_each_entry(ns, &dev->namespaces, list) { | 2480 | list_for_each_entry(ns, &dev->namespaces, list) { |
| 2414 | if (ns->disk->flags & GENHD_FL_UP) | 2481 | if (ns->disk->flags & GENHD_FL_UP) |
| 2415 | del_gendisk(ns->disk); | 2482 | del_gendisk(ns->disk); |
| 2416 | if (!blk_queue_dying(ns->queue)) | 2483 | if (!blk_queue_dying(ns->queue)) { |
| 2484 | blk_mq_abort_requeue_list(ns->queue); | ||
| 2417 | blk_cleanup_queue(ns->queue); | 2485 | blk_cleanup_queue(ns->queue); |
| 2486 | } | ||
| 2418 | } | 2487 | } |
| 2419 | } | 2488 | } |
| 2420 | 2489 | ||
| @@ -2495,6 +2564,7 @@ static void nvme_free_dev(struct kref *kref) | |||
| 2495 | nvme_free_namespaces(dev); | 2564 | nvme_free_namespaces(dev); |
| 2496 | nvme_release_instance(dev); | 2565 | nvme_release_instance(dev); |
| 2497 | blk_mq_free_tag_set(&dev->tagset); | 2566 | blk_mq_free_tag_set(&dev->tagset); |
| 2567 | blk_put_queue(dev->admin_q); | ||
| 2498 | kfree(dev->queues); | 2568 | kfree(dev->queues); |
| 2499 | kfree(dev->entry); | 2569 | kfree(dev->entry); |
| 2500 | kfree(dev); | 2570 | kfree(dev); |
| @@ -2591,15 +2661,20 @@ static int nvme_dev_start(struct nvme_dev *dev) | |||
| 2591 | } | 2661 | } |
| 2592 | 2662 | ||
| 2593 | nvme_init_queue(dev->queues[0], 0); | 2663 | nvme_init_queue(dev->queues[0], 0); |
| 2664 | result = nvme_alloc_admin_tags(dev); | ||
| 2665 | if (result) | ||
| 2666 | goto disable; | ||
| 2594 | 2667 | ||
| 2595 | result = nvme_setup_io_queues(dev); | 2668 | result = nvme_setup_io_queues(dev); |
| 2596 | if (result) | 2669 | if (result) |
| 2597 | goto disable; | 2670 | goto free_tags; |
| 2598 | 2671 | ||
| 2599 | nvme_set_irq_hints(dev); | 2672 | nvme_set_irq_hints(dev); |
| 2600 | 2673 | ||
| 2601 | return result; | 2674 | return result; |
| 2602 | 2675 | ||
| 2676 | free_tags: | ||
| 2677 | nvme_dev_remove_admin(dev); | ||
| 2603 | disable: | 2678 | disable: |
| 2604 | nvme_disable_queue(dev, 0); | 2679 | nvme_disable_queue(dev, 0); |
| 2605 | nvme_dev_list_remove(dev); | 2680 | nvme_dev_list_remove(dev); |
| @@ -2639,6 +2714,9 @@ static int nvme_dev_resume(struct nvme_dev *dev) | |||
| 2639 | dev->reset_workfn = nvme_remove_disks; | 2714 | dev->reset_workfn = nvme_remove_disks; |
| 2640 | queue_work(nvme_workq, &dev->reset_work); | 2715 | queue_work(nvme_workq, &dev->reset_work); |
| 2641 | spin_unlock(&dev_list_lock); | 2716 | spin_unlock(&dev_list_lock); |
| 2717 | } else { | ||
| 2718 | nvme_unfreeze_queues(dev); | ||
| 2719 | nvme_set_irq_hints(dev); | ||
| 2642 | } | 2720 | } |
| 2643 | dev->initialized = 1; | 2721 | dev->initialized = 1; |
| 2644 | return 0; | 2722 | return 0; |
| @@ -2776,11 +2854,10 @@ static void nvme_remove(struct pci_dev *pdev) | |||
| 2776 | pci_set_drvdata(pdev, NULL); | 2854 | pci_set_drvdata(pdev, NULL); |
| 2777 | flush_work(&dev->reset_work); | 2855 | flush_work(&dev->reset_work); |
| 2778 | misc_deregister(&dev->miscdev); | 2856 | misc_deregister(&dev->miscdev); |
| 2779 | nvme_dev_remove(dev); | ||
| 2780 | nvme_dev_shutdown(dev); | 2857 | nvme_dev_shutdown(dev); |
| 2858 | nvme_dev_remove(dev); | ||
| 2781 | nvme_dev_remove_admin(dev); | 2859 | nvme_dev_remove_admin(dev); |
| 2782 | nvme_free_queues(dev, 0); | 2860 | nvme_free_queues(dev, 0); |
| 2783 | nvme_free_admin_tags(dev); | ||
| 2784 | nvme_release_prp_pools(dev); | 2861 | nvme_release_prp_pools(dev); |
| 2785 | kref_put(&dev->kref, nvme_free_dev); | 2862 | kref_put(&dev->kref, nvme_free_dev); |
| 2786 | } | 2863 | } |
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 3ec85dfce124..8a86b62466f7 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c | |||
| @@ -2098,32 +2098,26 @@ static void rbd_dev_parent_put(struct rbd_device *rbd_dev) | |||
| 2098 | * If an image has a non-zero parent overlap, get a reference to its | 2098 | * If an image has a non-zero parent overlap, get a reference to its |
| 2099 | * parent. | 2099 | * parent. |
| 2100 | * | 2100 | * |
| 2101 | * We must get the reference before checking for the overlap to | ||
| 2102 | * coordinate properly with zeroing the parent overlap in | ||
| 2103 | * rbd_dev_v2_parent_info() when an image gets flattened. We | ||
| 2104 | * drop it again if there is no overlap. | ||
| 2105 | * | ||
| 2106 | * Returns true if the rbd device has a parent with a non-zero | 2101 | * Returns true if the rbd device has a parent with a non-zero |
| 2107 | * overlap and a reference for it was successfully taken, or | 2102 | * overlap and a reference for it was successfully taken, or |
| 2108 | * false otherwise. | 2103 | * false otherwise. |
| 2109 | */ | 2104 | */ |
| 2110 | static bool rbd_dev_parent_get(struct rbd_device *rbd_dev) | 2105 | static bool rbd_dev_parent_get(struct rbd_device *rbd_dev) |
| 2111 | { | 2106 | { |
| 2112 | int counter; | 2107 | int counter = 0; |
| 2113 | 2108 | ||
| 2114 | if (!rbd_dev->parent_spec) | 2109 | if (!rbd_dev->parent_spec) |
| 2115 | return false; | 2110 | return false; |
| 2116 | 2111 | ||
| 2117 | counter = atomic_inc_return_safe(&rbd_dev->parent_ref); | 2112 | down_read(&rbd_dev->header_rwsem); |
| 2118 | if (counter > 0 && rbd_dev->parent_overlap) | 2113 | if (rbd_dev->parent_overlap) |
| 2119 | return true; | 2114 | counter = atomic_inc_return_safe(&rbd_dev->parent_ref); |
| 2120 | 2115 | up_read(&rbd_dev->header_rwsem); | |
| 2121 | /* Image was flattened, but parent is not yet torn down */ | ||
| 2122 | 2116 | ||
| 2123 | if (counter < 0) | 2117 | if (counter < 0) |
| 2124 | rbd_warn(rbd_dev, "parent reference overflow"); | 2118 | rbd_warn(rbd_dev, "parent reference overflow"); |
| 2125 | 2119 | ||
| 2126 | return false; | 2120 | return counter > 0; |
| 2127 | } | 2121 | } |
| 2128 | 2122 | ||
| 2129 | /* | 2123 | /* |
| @@ -4239,7 +4233,6 @@ static int rbd_dev_v2_parent_info(struct rbd_device *rbd_dev) | |||
| 4239 | */ | 4233 | */ |
| 4240 | if (rbd_dev->parent_overlap) { | 4234 | if (rbd_dev->parent_overlap) { |
| 4241 | rbd_dev->parent_overlap = 0; | 4235 | rbd_dev->parent_overlap = 0; |
| 4242 | smp_mb(); | ||
| 4243 | rbd_dev_parent_put(rbd_dev); | 4236 | rbd_dev_parent_put(rbd_dev); |
| 4244 | pr_info("%s: clone image has been flattened\n", | 4237 | pr_info("%s: clone image has been flattened\n", |
| 4245 | rbd_dev->disk->disk_name); | 4238 | rbd_dev->disk->disk_name); |
| @@ -4285,7 +4278,6 @@ static int rbd_dev_v2_parent_info(struct rbd_device *rbd_dev) | |||
| 4285 | * treat it specially. | 4278 | * treat it specially. |
| 4286 | */ | 4279 | */ |
| 4287 | rbd_dev->parent_overlap = overlap; | 4280 | rbd_dev->parent_overlap = overlap; |
| 4288 | smp_mb(); | ||
| 4289 | if (!overlap) { | 4281 | if (!overlap) { |
| 4290 | 4282 | ||
| 4291 | /* A null parent_spec indicates it's the initial probe */ | 4283 | /* A null parent_spec indicates it's the initial probe */ |
| @@ -5114,10 +5106,7 @@ static void rbd_dev_unprobe(struct rbd_device *rbd_dev) | |||
| 5114 | { | 5106 | { |
| 5115 | struct rbd_image_header *header; | 5107 | struct rbd_image_header *header; |
| 5116 | 5108 | ||
| 5117 | /* Drop parent reference unless it's already been done (or none) */ | 5109 | rbd_dev_parent_put(rbd_dev); |
| 5118 | |||
| 5119 | if (rbd_dev->parent_overlap) | ||
| 5120 | rbd_dev_parent_put(rbd_dev); | ||
| 5121 | 5110 | ||
| 5122 | /* Free dynamic fields from the header, then zero it out */ | 5111 | /* Free dynamic fields from the header, then zero it out */ |
| 5123 | 5112 | ||
diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c index 7ef7c098708f..cdfbd21e3597 100644 --- a/drivers/block/virtio_blk.c +++ b/drivers/block/virtio_blk.c | |||
| @@ -638,7 +638,7 @@ static int virtblk_probe(struct virtio_device *vdev) | |||
| 638 | goto out_put_disk; | 638 | goto out_put_disk; |
| 639 | 639 | ||
| 640 | q = vblk->disk->queue = blk_mq_init_queue(&vblk->tag_set); | 640 | q = vblk->disk->queue = blk_mq_init_queue(&vblk->tag_set); |
| 641 | if (!q) { | 641 | if (IS_ERR(q)) { |
| 642 | err = -ENOMEM; | 642 | err = -ENOMEM; |
| 643 | goto out_free_tags; | 643 | goto out_free_tags; |
| 644 | } | 644 | } |
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/char/ipmi/ipmi_ssif.c b/drivers/char/ipmi/ipmi_ssif.c index fd5a5e85d7dc..982b96323f82 100644 --- a/drivers/char/ipmi/ipmi_ssif.c +++ b/drivers/char/ipmi/ipmi_ssif.c | |||
| @@ -969,7 +969,8 @@ static void sender(void *send_info, | |||
| 969 | 969 | ||
| 970 | do_gettimeofday(&t); | 970 | do_gettimeofday(&t); |
| 971 | pr_info("**Enqueue %02x %02x: %ld.%6.6ld\n", | 971 | pr_info("**Enqueue %02x %02x: %ld.%6.6ld\n", |
| 972 | msg->data[0], msg->data[1], t.tv_sec, t.tv_usec); | 972 | msg->data[0], msg->data[1], |
| 973 | (long) t.tv_sec, (long) t.tv_usec); | ||
| 973 | } | 974 | } |
| 974 | } | 975 | } |
| 975 | 976 | ||
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 ac6be7c0132d..11194b8329fe 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/gpio-dln2.c b/drivers/gpio/gpio-dln2.c index 978b51eae2ec..ce3c1558cb0a 100644 --- a/drivers/gpio/gpio-dln2.c +++ b/drivers/gpio/gpio-dln2.c | |||
| @@ -47,13 +47,6 @@ | |||
| 47 | 47 | ||
| 48 | #define DLN2_GPIO_MAX_PINS 32 | 48 | #define DLN2_GPIO_MAX_PINS 32 |
| 49 | 49 | ||
| 50 | struct dln2_irq_work { | ||
| 51 | struct work_struct work; | ||
| 52 | struct dln2_gpio *dln2; | ||
| 53 | int pin; | ||
| 54 | int type; | ||
| 55 | }; | ||
| 56 | |||
| 57 | struct dln2_gpio { | 50 | struct dln2_gpio { |
| 58 | struct platform_device *pdev; | 51 | struct platform_device *pdev; |
| 59 | struct gpio_chip gpio; | 52 | struct gpio_chip gpio; |
| @@ -64,10 +57,12 @@ struct dln2_gpio { | |||
| 64 | */ | 57 | */ |
| 65 | DECLARE_BITMAP(output_enabled, DLN2_GPIO_MAX_PINS); | 58 | DECLARE_BITMAP(output_enabled, DLN2_GPIO_MAX_PINS); |
| 66 | 59 | ||
| 67 | DECLARE_BITMAP(irqs_masked, DLN2_GPIO_MAX_PINS); | 60 | /* active IRQs - not synced to hardware */ |
| 68 | DECLARE_BITMAP(irqs_enabled, DLN2_GPIO_MAX_PINS); | 61 | DECLARE_BITMAP(unmasked_irqs, DLN2_GPIO_MAX_PINS); |
| 69 | DECLARE_BITMAP(irqs_pending, DLN2_GPIO_MAX_PINS); | 62 | /* active IRQS - synced to hardware */ |
| 70 | struct dln2_irq_work *irq_work; | 63 | DECLARE_BITMAP(enabled_irqs, DLN2_GPIO_MAX_PINS); |
| 64 | int irq_type[DLN2_GPIO_MAX_PINS]; | ||
| 65 | struct mutex irq_lock; | ||
| 71 | }; | 66 | }; |
| 72 | 67 | ||
| 73 | struct dln2_gpio_pin { | 68 | struct dln2_gpio_pin { |
| @@ -141,16 +136,16 @@ static int dln2_gpio_pin_get_out_val(struct dln2_gpio *dln2, unsigned int pin) | |||
| 141 | return !!ret; | 136 | return !!ret; |
| 142 | } | 137 | } |
| 143 | 138 | ||
| 144 | static void dln2_gpio_pin_set_out_val(struct dln2_gpio *dln2, | 139 | static int dln2_gpio_pin_set_out_val(struct dln2_gpio *dln2, |
| 145 | unsigned int pin, int value) | 140 | unsigned int pin, int value) |
| 146 | { | 141 | { |
| 147 | struct dln2_gpio_pin_val req = { | 142 | struct dln2_gpio_pin_val req = { |
| 148 | .pin = cpu_to_le16(pin), | 143 | .pin = cpu_to_le16(pin), |
| 149 | .value = value, | 144 | .value = value, |
| 150 | }; | 145 | }; |
| 151 | 146 | ||
| 152 | dln2_transfer_tx(dln2->pdev, DLN2_GPIO_PIN_SET_OUT_VAL, &req, | 147 | return dln2_transfer_tx(dln2->pdev, DLN2_GPIO_PIN_SET_OUT_VAL, &req, |
| 153 | sizeof(req)); | 148 | sizeof(req)); |
| 154 | } | 149 | } |
| 155 | 150 | ||
| 156 | #define DLN2_GPIO_DIRECTION_IN 0 | 151 | #define DLN2_GPIO_DIRECTION_IN 0 |
| @@ -267,6 +262,13 @@ static int dln2_gpio_direction_input(struct gpio_chip *chip, unsigned offset) | |||
| 267 | static int dln2_gpio_direction_output(struct gpio_chip *chip, unsigned offset, | 262 | static int dln2_gpio_direction_output(struct gpio_chip *chip, unsigned offset, |
| 268 | int value) | 263 | int value) |
| 269 | { | 264 | { |
| 265 | struct dln2_gpio *dln2 = container_of(chip, struct dln2_gpio, gpio); | ||
| 266 | int ret; | ||
| 267 | |||
| 268 | ret = dln2_gpio_pin_set_out_val(dln2, offset, value); | ||
| 269 | if (ret < 0) | ||
| 270 | return ret; | ||
| 271 | |||
| 270 | return dln2_gpio_set_direction(chip, offset, DLN2_GPIO_DIRECTION_OUT); | 272 | return dln2_gpio_set_direction(chip, offset, DLN2_GPIO_DIRECTION_OUT); |
| 271 | } | 273 | } |
| 272 | 274 | ||
| @@ -297,36 +299,13 @@ static int dln2_gpio_set_event_cfg(struct dln2_gpio *dln2, unsigned pin, | |||
| 297 | &req, sizeof(req)); | 299 | &req, sizeof(req)); |
| 298 | } | 300 | } |
| 299 | 301 | ||
| 300 | static void dln2_irq_work(struct work_struct *w) | 302 | static void dln2_irq_unmask(struct irq_data *irqd) |
| 301 | { | ||
| 302 | struct dln2_irq_work *iw = container_of(w, struct dln2_irq_work, work); | ||
| 303 | struct dln2_gpio *dln2 = iw->dln2; | ||
| 304 | u8 type = iw->type & DLN2_GPIO_EVENT_MASK; | ||
| 305 | |||
| 306 | if (test_bit(iw->pin, dln2->irqs_enabled)) | ||
| 307 | dln2_gpio_set_event_cfg(dln2, iw->pin, type, 0); | ||
| 308 | else | ||
| 309 | dln2_gpio_set_event_cfg(dln2, iw->pin, DLN2_GPIO_EVENT_NONE, 0); | ||
| 310 | } | ||
| 311 | |||
| 312 | static void dln2_irq_enable(struct irq_data *irqd) | ||
| 313 | { | ||
| 314 | struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd); | ||
| 315 | struct dln2_gpio *dln2 = container_of(gc, struct dln2_gpio, gpio); | ||
| 316 | int pin = irqd_to_hwirq(irqd); | ||
| 317 | |||
| 318 | set_bit(pin, dln2->irqs_enabled); | ||
| 319 | schedule_work(&dln2->irq_work[pin].work); | ||
| 320 | } | ||
| 321 | |||
| 322 | static void dln2_irq_disable(struct irq_data *irqd) | ||
| 323 | { | 303 | { |
| 324 | struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd); | 304 | struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd); |
| 325 | struct dln2_gpio *dln2 = container_of(gc, struct dln2_gpio, gpio); | 305 | struct dln2_gpio *dln2 = container_of(gc, struct dln2_gpio, gpio); |
| 326 | int pin = irqd_to_hwirq(irqd); | 306 | int pin = irqd_to_hwirq(irqd); |
| 327 | 307 | ||
| 328 | clear_bit(pin, dln2->irqs_enabled); | 308 | set_bit(pin, dln2->unmasked_irqs); |
| 329 | schedule_work(&dln2->irq_work[pin].work); | ||
| 330 | } | 309 | } |
| 331 | 310 | ||
| 332 | static void dln2_irq_mask(struct irq_data *irqd) | 311 | static void dln2_irq_mask(struct irq_data *irqd) |
| @@ -335,27 +314,7 @@ static void dln2_irq_mask(struct irq_data *irqd) | |||
| 335 | struct dln2_gpio *dln2 = container_of(gc, struct dln2_gpio, gpio); | 314 | struct dln2_gpio *dln2 = container_of(gc, struct dln2_gpio, gpio); |
| 336 | int pin = irqd_to_hwirq(irqd); | 315 | int pin = irqd_to_hwirq(irqd); |
| 337 | 316 | ||
| 338 | set_bit(pin, dln2->irqs_masked); | 317 | clear_bit(pin, dln2->unmasked_irqs); |
| 339 | } | ||
| 340 | |||
| 341 | static void dln2_irq_unmask(struct irq_data *irqd) | ||
| 342 | { | ||
| 343 | struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd); | ||
| 344 | struct dln2_gpio *dln2 = container_of(gc, struct dln2_gpio, gpio); | ||
| 345 | struct device *dev = dln2->gpio.dev; | ||
| 346 | int pin = irqd_to_hwirq(irqd); | ||
| 347 | |||
| 348 | if (test_and_clear_bit(pin, dln2->irqs_pending)) { | ||
| 349 | int irq; | ||
| 350 | |||
| 351 | irq = irq_find_mapping(dln2->gpio.irqdomain, pin); | ||
| 352 | if (!irq) { | ||
| 353 | dev_err(dev, "pin %d not mapped to IRQ\n", pin); | ||
| 354 | return; | ||
| 355 | } | ||
| 356 | |||
| 357 | generic_handle_irq(irq); | ||
| 358 | } | ||
| 359 | } | 318 | } |
| 360 | 319 | ||
| 361 | static int dln2_irq_set_type(struct irq_data *irqd, unsigned type) | 320 | static int dln2_irq_set_type(struct irq_data *irqd, unsigned type) |
| @@ -366,19 +325,19 @@ static int dln2_irq_set_type(struct irq_data *irqd, unsigned type) | |||
| 366 | 325 | ||
| 367 | switch (type) { | 326 | switch (type) { |
| 368 | case IRQ_TYPE_LEVEL_HIGH: | 327 | case IRQ_TYPE_LEVEL_HIGH: |
| 369 | dln2->irq_work[pin].type = DLN2_GPIO_EVENT_LVL_HIGH; | 328 | dln2->irq_type[pin] = DLN2_GPIO_EVENT_LVL_HIGH; |
| 370 | break; | 329 | break; |
| 371 | case IRQ_TYPE_LEVEL_LOW: | 330 | case IRQ_TYPE_LEVEL_LOW: |
| 372 | dln2->irq_work[pin].type = DLN2_GPIO_EVENT_LVL_LOW; | 331 | dln2->irq_type[pin] = DLN2_GPIO_EVENT_LVL_LOW; |
| 373 | break; | 332 | break; |
| 374 | case IRQ_TYPE_EDGE_BOTH: | 333 | case IRQ_TYPE_EDGE_BOTH: |
| 375 | dln2->irq_work[pin].type = DLN2_GPIO_EVENT_CHANGE; | 334 | dln2->irq_type[pin] = DLN2_GPIO_EVENT_CHANGE; |
| 376 | break; | 335 | break; |
| 377 | case IRQ_TYPE_EDGE_RISING: | 336 | case IRQ_TYPE_EDGE_RISING: |
| 378 | dln2->irq_work[pin].type = DLN2_GPIO_EVENT_CHANGE_RISING; | 337 | dln2->irq_type[pin] = DLN2_GPIO_EVENT_CHANGE_RISING; |
| 379 | break; | 338 | break; |
| 380 | case IRQ_TYPE_EDGE_FALLING: | 339 | case IRQ_TYPE_EDGE_FALLING: |
| 381 | dln2->irq_work[pin].type = DLN2_GPIO_EVENT_CHANGE_FALLING; | 340 | dln2->irq_type[pin] = DLN2_GPIO_EVENT_CHANGE_FALLING; |
| 382 | break; | 341 | break; |
| 383 | default: | 342 | default: |
| 384 | return -EINVAL; | 343 | return -EINVAL; |
| @@ -387,13 +346,50 @@ static int dln2_irq_set_type(struct irq_data *irqd, unsigned type) | |||
| 387 | return 0; | 346 | return 0; |
| 388 | } | 347 | } |
| 389 | 348 | ||
| 349 | static void dln2_irq_bus_lock(struct irq_data *irqd) | ||
| 350 | { | ||
| 351 | struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd); | ||
| 352 | struct dln2_gpio *dln2 = container_of(gc, struct dln2_gpio, gpio); | ||
| 353 | |||
| 354 | mutex_lock(&dln2->irq_lock); | ||
| 355 | } | ||
| 356 | |||
| 357 | static void dln2_irq_bus_unlock(struct irq_data *irqd) | ||
| 358 | { | ||
| 359 | struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd); | ||
| 360 | struct dln2_gpio *dln2 = container_of(gc, struct dln2_gpio, gpio); | ||
| 361 | int pin = irqd_to_hwirq(irqd); | ||
| 362 | int enabled, unmasked; | ||
| 363 | unsigned type; | ||
| 364 | int ret; | ||
| 365 | |||
| 366 | enabled = test_bit(pin, dln2->enabled_irqs); | ||
| 367 | unmasked = test_bit(pin, dln2->unmasked_irqs); | ||
| 368 | |||
| 369 | if (enabled != unmasked) { | ||
| 370 | if (unmasked) { | ||
| 371 | type = dln2->irq_type[pin] & DLN2_GPIO_EVENT_MASK; | ||
| 372 | set_bit(pin, dln2->enabled_irqs); | ||
| 373 | } else { | ||
| 374 | type = DLN2_GPIO_EVENT_NONE; | ||
| 375 | clear_bit(pin, dln2->enabled_irqs); | ||
| 376 | } | ||
| 377 | |||
| 378 | ret = dln2_gpio_set_event_cfg(dln2, pin, type, 0); | ||
| 379 | if (ret) | ||
| 380 | dev_err(dln2->gpio.dev, "failed to set event\n"); | ||
| 381 | } | ||
| 382 | |||
| 383 | mutex_unlock(&dln2->irq_lock); | ||
| 384 | } | ||
| 385 | |||
| 390 | static struct irq_chip dln2_gpio_irqchip = { | 386 | static struct irq_chip dln2_gpio_irqchip = { |
| 391 | .name = "dln2-irq", | 387 | .name = "dln2-irq", |
| 392 | .irq_enable = dln2_irq_enable, | ||
| 393 | .irq_disable = dln2_irq_disable, | ||
| 394 | .irq_mask = dln2_irq_mask, | 388 | .irq_mask = dln2_irq_mask, |
| 395 | .irq_unmask = dln2_irq_unmask, | 389 | .irq_unmask = dln2_irq_unmask, |
| 396 | .irq_set_type = dln2_irq_set_type, | 390 | .irq_set_type = dln2_irq_set_type, |
| 391 | .irq_bus_lock = dln2_irq_bus_lock, | ||
| 392 | .irq_bus_sync_unlock = dln2_irq_bus_unlock, | ||
| 397 | }; | 393 | }; |
| 398 | 394 | ||
| 399 | static void dln2_gpio_event(struct platform_device *pdev, u16 echo, | 395 | static void dln2_gpio_event(struct platform_device *pdev, u16 echo, |
| @@ -425,14 +421,7 @@ static void dln2_gpio_event(struct platform_device *pdev, u16 echo, | |||
| 425 | return; | 421 | return; |
| 426 | } | 422 | } |
| 427 | 423 | ||
| 428 | if (!test_bit(pin, dln2->irqs_enabled)) | 424 | switch (dln2->irq_type[pin]) { |
| 429 | return; | ||
| 430 | if (test_bit(pin, dln2->irqs_masked)) { | ||
| 431 | set_bit(pin, dln2->irqs_pending); | ||
| 432 | return; | ||
| 433 | } | ||
| 434 | |||
| 435 | switch (dln2->irq_work[pin].type) { | ||
| 436 | case DLN2_GPIO_EVENT_CHANGE_RISING: | 425 | case DLN2_GPIO_EVENT_CHANGE_RISING: |
| 437 | if (event->value) | 426 | if (event->value) |
| 438 | generic_handle_irq(irq); | 427 | generic_handle_irq(irq); |
| @@ -451,7 +440,7 @@ static int dln2_gpio_probe(struct platform_device *pdev) | |||
| 451 | struct dln2_gpio *dln2; | 440 | struct dln2_gpio *dln2; |
| 452 | struct device *dev = &pdev->dev; | 441 | struct device *dev = &pdev->dev; |
| 453 | int pins; | 442 | int pins; |
| 454 | int i, ret; | 443 | int ret; |
| 455 | 444 | ||
| 456 | pins = dln2_gpio_get_pin_count(pdev); | 445 | pins = dln2_gpio_get_pin_count(pdev); |
| 457 | if (pins < 0) { | 446 | if (pins < 0) { |
| @@ -467,15 +456,7 @@ static int dln2_gpio_probe(struct platform_device *pdev) | |||
| 467 | if (!dln2) | 456 | if (!dln2) |
| 468 | return -ENOMEM; | 457 | return -ENOMEM; |
| 469 | 458 | ||
| 470 | dln2->irq_work = devm_kcalloc(&pdev->dev, pins, | 459 | mutex_init(&dln2->irq_lock); |
| 471 | sizeof(struct dln2_irq_work), GFP_KERNEL); | ||
| 472 | if (!dln2->irq_work) | ||
| 473 | return -ENOMEM; | ||
| 474 | for (i = 0; i < pins; i++) { | ||
| 475 | INIT_WORK(&dln2->irq_work[i].work, dln2_irq_work); | ||
| 476 | dln2->irq_work[i].pin = i; | ||
| 477 | dln2->irq_work[i].dln2 = dln2; | ||
| 478 | } | ||
| 479 | 460 | ||
| 480 | dln2->pdev = pdev; | 461 | dln2->pdev = pdev; |
| 481 | 462 | ||
| @@ -529,11 +510,8 @@ out: | |||
| 529 | static int dln2_gpio_remove(struct platform_device *pdev) | 510 | static int dln2_gpio_remove(struct platform_device *pdev) |
| 530 | { | 511 | { |
| 531 | struct dln2_gpio *dln2 = platform_get_drvdata(pdev); | 512 | struct dln2_gpio *dln2 = platform_get_drvdata(pdev); |
| 532 | int i; | ||
| 533 | 513 | ||
| 534 | dln2_unregister_event_cb(pdev, DLN2_GPIO_CONDITION_MET_EV); | 514 | dln2_unregister_event_cb(pdev, DLN2_GPIO_CONDITION_MET_EV); |
| 535 | for (i = 0; i < dln2->gpio.ngpio; i++) | ||
| 536 | flush_work(&dln2->irq_work[i].work); | ||
| 537 | gpiochip_remove(&dln2->gpio); | 515 | gpiochip_remove(&dln2->gpio); |
| 538 | 516 | ||
| 539 | return 0; | 517 | return 0; |
diff --git a/drivers/gpio/gpio-grgpio.c b/drivers/gpio/gpio-grgpio.c index 09daaf2aeb56..3a5a71050559 100644 --- a/drivers/gpio/gpio-grgpio.c +++ b/drivers/gpio/gpio-grgpio.c | |||
| @@ -441,7 +441,8 @@ static int grgpio_probe(struct platform_device *ofdev) | |||
| 441 | err = gpiochip_add(gc); | 441 | err = gpiochip_add(gc); |
| 442 | if (err) { | 442 | if (err) { |
| 443 | dev_err(&ofdev->dev, "Could not add gpiochip\n"); | 443 | dev_err(&ofdev->dev, "Could not add gpiochip\n"); |
| 444 | irq_domain_remove(priv->domain); | 444 | if (priv->domain) |
| 445 | irq_domain_remove(priv->domain); | ||
| 445 | return err; | 446 | return err; |
| 446 | } | 447 | } |
| 447 | 448 | ||
diff --git a/drivers/gpio/gpio-mcp23s08.c b/drivers/gpio/gpio-mcp23s08.c index da9c316059bc..eea5d7e578c9 100644 --- a/drivers/gpio/gpio-mcp23s08.c +++ b/drivers/gpio/gpio-mcp23s08.c | |||
| @@ -801,9 +801,11 @@ static int mcp230xx_probe(struct i2c_client *client, | |||
| 801 | client->irq = irq_of_parse_and_map(client->dev.of_node, 0); | 801 | client->irq = irq_of_parse_and_map(client->dev.of_node, 0); |
| 802 | } else { | 802 | } else { |
| 803 | pdata = dev_get_platdata(&client->dev); | 803 | pdata = dev_get_platdata(&client->dev); |
| 804 | if (!pdata || !gpio_is_valid(pdata->base)) { | 804 | if (!pdata) { |
| 805 | dev_dbg(&client->dev, "invalid platform data\n"); | 805 | pdata = devm_kzalloc(&client->dev, |
| 806 | return -EINVAL; | 806 | sizeof(struct mcp23s08_platform_data), |
| 807 | GFP_KERNEL); | ||
| 808 | pdata->base = -1; | ||
| 807 | } | 809 | } |
| 808 | } | 810 | } |
| 809 | 811 | ||
| @@ -924,10 +926,11 @@ static int mcp23s08_probe(struct spi_device *spi) | |||
| 924 | } else { | 926 | } else { |
| 925 | type = spi_get_device_id(spi)->driver_data; | 927 | type = spi_get_device_id(spi)->driver_data; |
| 926 | pdata = dev_get_platdata(&spi->dev); | 928 | pdata = dev_get_platdata(&spi->dev); |
| 927 | if (!pdata || !gpio_is_valid(pdata->base)) { | 929 | if (!pdata) { |
| 928 | dev_dbg(&spi->dev, | 930 | pdata = devm_kzalloc(&spi->dev, |
| 929 | "invalid or missing platform data\n"); | 931 | sizeof(struct mcp23s08_platform_data), |
| 930 | return -EINVAL; | 932 | GFP_KERNEL); |
| 933 | pdata->base = -1; | ||
| 931 | } | 934 | } |
| 932 | 935 | ||
| 933 | for (addr = 0; addr < ARRAY_SIZE(pdata->chip); addr++) { | 936 | for (addr = 0; addr < ARRAY_SIZE(pdata->chip); addr++) { |
diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c index 30646cfe0efa..f476ae2eb0b3 100644 --- a/drivers/gpio/gpio-omap.c +++ b/drivers/gpio/gpio-omap.c | |||
| @@ -88,6 +88,8 @@ struct gpio_bank { | |||
| 88 | #define BANK_USED(bank) (bank->mod_usage || bank->irq_usage) | 88 | #define BANK_USED(bank) (bank->mod_usage || bank->irq_usage) |
| 89 | #define LINE_USED(line, offset) (line & (BIT(offset))) | 89 | #define LINE_USED(line, offset) (line & (BIT(offset))) |
| 90 | 90 | ||
| 91 | static void omap_gpio_unmask_irq(struct irq_data *d); | ||
| 92 | |||
| 91 | static int omap_irq_to_gpio(struct gpio_bank *bank, unsigned int gpio_irq) | 93 | static int omap_irq_to_gpio(struct gpio_bank *bank, unsigned int gpio_irq) |
| 92 | { | 94 | { |
| 93 | return bank->chip.base + gpio_irq; | 95 | return bank->chip.base + gpio_irq; |
| @@ -477,6 +479,16 @@ static int omap_gpio_is_input(struct gpio_bank *bank, int mask) | |||
| 477 | return readl_relaxed(reg) & mask; | 479 | return readl_relaxed(reg) & mask; |
| 478 | } | 480 | } |
| 479 | 481 | ||
| 482 | static void omap_gpio_init_irq(struct gpio_bank *bank, unsigned gpio, | ||
| 483 | unsigned offset) | ||
| 484 | { | ||
| 485 | if (!LINE_USED(bank->mod_usage, offset)) { | ||
| 486 | omap_enable_gpio_module(bank, offset); | ||
| 487 | omap_set_gpio_direction(bank, offset, 1); | ||
| 488 | } | ||
| 489 | bank->irq_usage |= BIT(GPIO_INDEX(bank, gpio)); | ||
| 490 | } | ||
| 491 | |||
| 480 | static int omap_gpio_irq_type(struct irq_data *d, unsigned type) | 492 | static int omap_gpio_irq_type(struct irq_data *d, unsigned type) |
| 481 | { | 493 | { |
| 482 | struct gpio_bank *bank = omap_irq_data_get_bank(d); | 494 | struct gpio_bank *bank = omap_irq_data_get_bank(d); |
| @@ -506,15 +518,11 @@ static int omap_gpio_irq_type(struct irq_data *d, unsigned type) | |||
| 506 | spin_lock_irqsave(&bank->lock, flags); | 518 | spin_lock_irqsave(&bank->lock, flags); |
| 507 | offset = GPIO_INDEX(bank, gpio); | 519 | offset = GPIO_INDEX(bank, gpio); |
| 508 | retval = omap_set_gpio_triggering(bank, offset, type); | 520 | retval = omap_set_gpio_triggering(bank, offset, type); |
| 509 | if (!LINE_USED(bank->mod_usage, offset)) { | 521 | omap_gpio_init_irq(bank, gpio, offset); |
| 510 | omap_enable_gpio_module(bank, offset); | 522 | if (!omap_gpio_is_input(bank, BIT(offset))) { |
| 511 | omap_set_gpio_direction(bank, offset, 1); | ||
| 512 | } else if (!omap_gpio_is_input(bank, BIT(offset))) { | ||
| 513 | spin_unlock_irqrestore(&bank->lock, flags); | 523 | spin_unlock_irqrestore(&bank->lock, flags); |
| 514 | return -EINVAL; | 524 | return -EINVAL; |
| 515 | } | 525 | } |
| 516 | |||
| 517 | bank->irq_usage |= BIT(GPIO_INDEX(bank, gpio)); | ||
| 518 | spin_unlock_irqrestore(&bank->lock, flags); | 526 | spin_unlock_irqrestore(&bank->lock, flags); |
| 519 | 527 | ||
| 520 | if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH)) | 528 | if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH)) |
| @@ -792,6 +800,24 @@ exit: | |||
| 792 | pm_runtime_put(bank->dev); | 800 | pm_runtime_put(bank->dev); |
| 793 | } | 801 | } |
| 794 | 802 | ||
| 803 | static unsigned int omap_gpio_irq_startup(struct irq_data *d) | ||
| 804 | { | ||
| 805 | struct gpio_bank *bank = omap_irq_data_get_bank(d); | ||
| 806 | unsigned int gpio = omap_irq_to_gpio(bank, d->hwirq); | ||
| 807 | unsigned long flags; | ||
| 808 | unsigned offset = GPIO_INDEX(bank, gpio); | ||
| 809 | |||
| 810 | if (!BANK_USED(bank)) | ||
| 811 | pm_runtime_get_sync(bank->dev); | ||
| 812 | |||
| 813 | spin_lock_irqsave(&bank->lock, flags); | ||
| 814 | omap_gpio_init_irq(bank, gpio, offset); | ||
| 815 | spin_unlock_irqrestore(&bank->lock, flags); | ||
| 816 | omap_gpio_unmask_irq(d); | ||
| 817 | |||
| 818 | return 0; | ||
| 819 | } | ||
| 820 | |||
| 795 | static void omap_gpio_irq_shutdown(struct irq_data *d) | 821 | static void omap_gpio_irq_shutdown(struct irq_data *d) |
| 796 | { | 822 | { |
| 797 | struct gpio_bank *bank = omap_irq_data_get_bank(d); | 823 | struct gpio_bank *bank = omap_irq_data_get_bank(d); |
| @@ -1181,6 +1207,7 @@ static int omap_gpio_probe(struct platform_device *pdev) | |||
| 1181 | if (!irqc) | 1207 | if (!irqc) |
| 1182 | return -ENOMEM; | 1208 | return -ENOMEM; |
| 1183 | 1209 | ||
| 1210 | irqc->irq_startup = omap_gpio_irq_startup, | ||
| 1184 | irqc->irq_shutdown = omap_gpio_irq_shutdown, | 1211 | irqc->irq_shutdown = omap_gpio_irq_shutdown, |
| 1185 | irqc->irq_ack = omap_gpio_ack_irq, | 1212 | irqc->irq_ack = omap_gpio_ack_irq, |
| 1186 | irqc->irq_mask = omap_gpio_mask_irq, | 1213 | irqc->irq_mask = omap_gpio_mask_irq, |
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..7722ed53bd65 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); |
| @@ -637,6 +648,7 @@ int gpiod_export_link(struct device *dev, const char *name, | |||
| 637 | if (tdev != NULL) { | 648 | if (tdev != NULL) { |
| 638 | status = sysfs_create_link(&dev->kobj, &tdev->kobj, | 649 | status = sysfs_create_link(&dev->kobj, &tdev->kobj, |
| 639 | name); | 650 | name); |
| 651 | put_device(tdev); | ||
| 640 | } else { | 652 | } else { |
| 641 | status = -ENODEV; | 653 | status = -ENODEV; |
| 642 | } | 654 | } |
| @@ -684,7 +696,7 @@ int gpiod_sysfs_set_active_low(struct gpio_desc *desc, int value) | |||
| 684 | } | 696 | } |
| 685 | 697 | ||
| 686 | status = sysfs_set_active_low(desc, dev, value); | 698 | status = sysfs_set_active_low(desc, dev, value); |
| 687 | 699 | put_device(dev); | |
| 688 | unlock: | 700 | unlock: |
| 689 | mutex_unlock(&sysfs_lock); | 701 | mutex_unlock(&sysfs_lock); |
| 690 | 702 | ||
| @@ -718,6 +730,7 @@ void gpiod_unexport(struct gpio_desc *desc) | |||
| 718 | dev = class_find_device(&gpio_class, NULL, desc, match_export); | 730 | dev = class_find_device(&gpio_class, NULL, desc, match_export); |
| 719 | if (dev) { | 731 | if (dev) { |
| 720 | gpio_setup_irq(desc, dev, 0); | 732 | gpio_setup_irq(desc, dev, 0); |
| 733 | clear_bit(FLAG_SYSFS_DIR, &desc->flags); | ||
| 721 | clear_bit(FLAG_EXPORT, &desc->flags); | 734 | clear_bit(FLAG_EXPORT, &desc->flags); |
| 722 | } else | 735 | } else |
| 723 | status = -ENODEV; | 736 | status = -ENODEV; |
| @@ -750,13 +763,13 @@ int gpiochip_export(struct gpio_chip *chip) | |||
| 750 | 763 | ||
| 751 | /* use chip->base for the ID; it's already known to be unique */ | 764 | /* use chip->base for the ID; it's already known to be unique */ |
| 752 | mutex_lock(&sysfs_lock); | 765 | mutex_lock(&sysfs_lock); |
| 753 | dev = device_create(&gpio_class, chip->dev, MKDEV(0, 0), chip, | 766 | dev = device_create_with_groups(&gpio_class, chip->dev, MKDEV(0, 0), |
| 754 | "gpiochip%d", chip->base); | 767 | chip, gpiochip_groups, |
| 755 | if (!IS_ERR(dev)) { | 768 | "gpiochip%d", chip->base); |
| 756 | status = sysfs_create_group(&dev->kobj, | 769 | if (IS_ERR(dev)) |
| 757 | &gpiochip_attr_group); | ||
| 758 | } else | ||
| 759 | status = PTR_ERR(dev); | 770 | status = PTR_ERR(dev); |
| 771 | else | ||
| 772 | status = 0; | ||
| 760 | chip->exported = (status == 0); | 773 | chip->exported = (status == 0); |
| 761 | mutex_unlock(&sysfs_lock); | 774 | mutex_unlock(&sysfs_lock); |
| 762 | 775 | ||
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/Makefile b/drivers/gpu/drm/Makefile index 66e40398b3d3..e620807418ea 100644 --- a/drivers/gpu/drm/Makefile +++ b/drivers/gpu/drm/Makefile | |||
| @@ -37,6 +37,7 @@ obj-$(CONFIG_DRM_MIPI_DSI) += drm_mipi_dsi.o | |||
| 37 | obj-$(CONFIG_DRM_TTM) += ttm/ | 37 | obj-$(CONFIG_DRM_TTM) += ttm/ |
| 38 | obj-$(CONFIG_DRM_TDFX) += tdfx/ | 38 | obj-$(CONFIG_DRM_TDFX) += tdfx/ |
| 39 | obj-$(CONFIG_DRM_R128) += r128/ | 39 | obj-$(CONFIG_DRM_R128) += r128/ |
| 40 | obj-$(CONFIG_HSA_AMD) += amd/amdkfd/ | ||
| 40 | obj-$(CONFIG_DRM_RADEON)+= radeon/ | 41 | obj-$(CONFIG_DRM_RADEON)+= radeon/ |
| 41 | obj-$(CONFIG_DRM_MGA) += mga/ | 42 | obj-$(CONFIG_DRM_MGA) += mga/ |
| 42 | obj-$(CONFIG_DRM_I810) += i810/ | 43 | obj-$(CONFIG_DRM_I810) += i810/ |
| @@ -67,4 +68,3 @@ obj-$(CONFIG_DRM_IMX) += imx/ | |||
| 67 | obj-y += i2c/ | 68 | obj-y += i2c/ |
| 68 | obj-y += panel/ | 69 | obj-y += panel/ |
| 69 | obj-y += bridge/ | 70 | obj-y += bridge/ |
| 70 | obj-$(CONFIG_HSA_AMD) += amd/amdkfd/ | ||
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_chardev.c b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c index 7d4974b83af7..fcfdf23e1913 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c | |||
| @@ -31,7 +31,6 @@ | |||
| 31 | #include <uapi/linux/kfd_ioctl.h> | 31 | #include <uapi/linux/kfd_ioctl.h> |
| 32 | #include <linux/time.h> | 32 | #include <linux/time.h> |
| 33 | #include <linux/mm.h> | 33 | #include <linux/mm.h> |
| 34 | #include <linux/uaccess.h> | ||
| 35 | #include <uapi/asm-generic/mman-common.h> | 34 | #include <uapi/asm-generic/mman-common.h> |
| 36 | #include <asm/processor.h> | 35 | #include <asm/processor.h> |
| 37 | #include "kfd_priv.h" | 36 | #include "kfd_priv.h" |
| @@ -127,17 +126,14 @@ static int kfd_open(struct inode *inode, struct file *filep) | |||
| 127 | return 0; | 126 | return 0; |
| 128 | } | 127 | } |
| 129 | 128 | ||
| 130 | static long kfd_ioctl_get_version(struct file *filep, struct kfd_process *p, | 129 | static int kfd_ioctl_get_version(struct file *filep, struct kfd_process *p, |
| 131 | void __user *arg) | 130 | void *data) |
| 132 | { | 131 | { |
| 133 | struct kfd_ioctl_get_version_args args; | 132 | struct kfd_ioctl_get_version_args *args = data; |
| 134 | int err = 0; | 133 | int err = 0; |
| 135 | 134 | ||
| 136 | args.major_version = KFD_IOCTL_MAJOR_VERSION; | 135 | args->major_version = KFD_IOCTL_MAJOR_VERSION; |
| 137 | args.minor_version = KFD_IOCTL_MINOR_VERSION; | 136 | args->minor_version = KFD_IOCTL_MINOR_VERSION; |
| 138 | |||
| 139 | if (copy_to_user(arg, &args, sizeof(args))) | ||
| 140 | err = -EFAULT; | ||
| 141 | 137 | ||
| 142 | return err; | 138 | return err; |
| 143 | } | 139 | } |
| @@ -221,10 +217,10 @@ static int set_queue_properties_from_user(struct queue_properties *q_properties, | |||
| 221 | return 0; | 217 | return 0; |
| 222 | } | 218 | } |
| 223 | 219 | ||
| 224 | static long kfd_ioctl_create_queue(struct file *filep, struct kfd_process *p, | 220 | static int kfd_ioctl_create_queue(struct file *filep, struct kfd_process *p, |
| 225 | void __user *arg) | 221 | void *data) |
| 226 | { | 222 | { |
| 227 | struct kfd_ioctl_create_queue_args args; | 223 | struct kfd_ioctl_create_queue_args *args = data; |
| 228 | struct kfd_dev *dev; | 224 | struct kfd_dev *dev; |
| 229 | int err = 0; | 225 | int err = 0; |
| 230 | unsigned int queue_id; | 226 | unsigned int queue_id; |
| @@ -233,16 +229,13 @@ static long kfd_ioctl_create_queue(struct file *filep, struct kfd_process *p, | |||
| 233 | 229 | ||
| 234 | memset(&q_properties, 0, sizeof(struct queue_properties)); | 230 | memset(&q_properties, 0, sizeof(struct queue_properties)); |
| 235 | 231 | ||
| 236 | if (copy_from_user(&args, arg, sizeof(args))) | ||
| 237 | return -EFAULT; | ||
| 238 | |||
| 239 | pr_debug("kfd: creating queue ioctl\n"); | 232 | pr_debug("kfd: creating queue ioctl\n"); |
| 240 | 233 | ||
| 241 | err = set_queue_properties_from_user(&q_properties, &args); | 234 | err = set_queue_properties_from_user(&q_properties, args); |
| 242 | if (err) | 235 | if (err) |
| 243 | return err; | 236 | return err; |
| 244 | 237 | ||
| 245 | dev = kfd_device_by_id(args.gpu_id); | 238 | dev = kfd_device_by_id(args->gpu_id); |
| 246 | if (dev == NULL) | 239 | if (dev == NULL) |
| 247 | return -EINVAL; | 240 | return -EINVAL; |
| 248 | 241 | ||
| @@ -250,7 +243,7 @@ static long kfd_ioctl_create_queue(struct file *filep, struct kfd_process *p, | |||
| 250 | 243 | ||
| 251 | pdd = kfd_bind_process_to_device(dev, p); | 244 | pdd = kfd_bind_process_to_device(dev, p); |
| 252 | if (IS_ERR(pdd)) { | 245 | if (IS_ERR(pdd)) { |
| 253 | err = PTR_ERR(pdd); | 246 | err = -ESRCH; |
| 254 | goto err_bind_process; | 247 | goto err_bind_process; |
| 255 | } | 248 | } |
| 256 | 249 | ||
| @@ -263,33 +256,26 @@ static long kfd_ioctl_create_queue(struct file *filep, struct kfd_process *p, | |||
| 263 | if (err != 0) | 256 | if (err != 0) |
| 264 | goto err_create_queue; | 257 | goto err_create_queue; |
| 265 | 258 | ||
| 266 | args.queue_id = queue_id; | 259 | args->queue_id = queue_id; |
| 267 | 260 | ||
| 268 | /* Return gpu_id as doorbell offset for mmap usage */ | 261 | /* Return gpu_id as doorbell offset for mmap usage */ |
| 269 | args.doorbell_offset = args.gpu_id << PAGE_SHIFT; | 262 | args->doorbell_offset = args->gpu_id << PAGE_SHIFT; |
| 270 | |||
| 271 | if (copy_to_user(arg, &args, sizeof(args))) { | ||
| 272 | err = -EFAULT; | ||
| 273 | goto err_copy_args_out; | ||
| 274 | } | ||
| 275 | 263 | ||
| 276 | mutex_unlock(&p->mutex); | 264 | mutex_unlock(&p->mutex); |
| 277 | 265 | ||
| 278 | pr_debug("kfd: queue id %d was created successfully\n", args.queue_id); | 266 | pr_debug("kfd: queue id %d was created successfully\n", args->queue_id); |
| 279 | 267 | ||
| 280 | pr_debug("ring buffer address == 0x%016llX\n", | 268 | pr_debug("ring buffer address == 0x%016llX\n", |
| 281 | args.ring_base_address); | 269 | args->ring_base_address); |
| 282 | 270 | ||
| 283 | pr_debug("read ptr address == 0x%016llX\n", | 271 | pr_debug("read ptr address == 0x%016llX\n", |
| 284 | args.read_pointer_address); | 272 | args->read_pointer_address); |
| 285 | 273 | ||
| 286 | pr_debug("write ptr address == 0x%016llX\n", | 274 | pr_debug("write ptr address == 0x%016llX\n", |
| 287 | args.write_pointer_address); | 275 | args->write_pointer_address); |
| 288 | 276 | ||
| 289 | return 0; | 277 | return 0; |
| 290 | 278 | ||
| 291 | err_copy_args_out: | ||
| 292 | pqm_destroy_queue(&p->pqm, queue_id); | ||
| 293 | err_create_queue: | 279 | err_create_queue: |
| 294 | err_bind_process: | 280 | err_bind_process: |
| 295 | mutex_unlock(&p->mutex); | 281 | mutex_unlock(&p->mutex); |
| @@ -297,99 +283,90 @@ err_bind_process: | |||
| 297 | } | 283 | } |
| 298 | 284 | ||
| 299 | static int kfd_ioctl_destroy_queue(struct file *filp, struct kfd_process *p, | 285 | static int kfd_ioctl_destroy_queue(struct file *filp, struct kfd_process *p, |
| 300 | void __user *arg) | 286 | void *data) |
| 301 | { | 287 | { |
| 302 | int retval; | 288 | int retval; |
| 303 | struct kfd_ioctl_destroy_queue_args args; | 289 | struct kfd_ioctl_destroy_queue_args *args = data; |
| 304 | |||
| 305 | if (copy_from_user(&args, arg, sizeof(args))) | ||
| 306 | return -EFAULT; | ||
| 307 | 290 | ||
| 308 | pr_debug("kfd: destroying queue id %d for PASID %d\n", | 291 | pr_debug("kfd: destroying queue id %d for PASID %d\n", |
| 309 | args.queue_id, | 292 | args->queue_id, |
| 310 | p->pasid); | 293 | p->pasid); |
| 311 | 294 | ||
| 312 | mutex_lock(&p->mutex); | 295 | mutex_lock(&p->mutex); |
| 313 | 296 | ||
| 314 | retval = pqm_destroy_queue(&p->pqm, args.queue_id); | 297 | retval = pqm_destroy_queue(&p->pqm, args->queue_id); |
| 315 | 298 | ||
| 316 | mutex_unlock(&p->mutex); | 299 | mutex_unlock(&p->mutex); |
| 317 | return retval; | 300 | return retval; |
| 318 | } | 301 | } |
| 319 | 302 | ||
| 320 | static int kfd_ioctl_update_queue(struct file *filp, struct kfd_process *p, | 303 | static int kfd_ioctl_update_queue(struct file *filp, struct kfd_process *p, |
| 321 | void __user *arg) | 304 | void *data) |
| 322 | { | 305 | { |
| 323 | int retval; | 306 | int retval; |
| 324 | struct kfd_ioctl_update_queue_args args; | 307 | struct kfd_ioctl_update_queue_args *args = data; |
| 325 | struct queue_properties properties; | 308 | struct queue_properties properties; |
| 326 | 309 | ||
| 327 | if (copy_from_user(&args, arg, sizeof(args))) | 310 | if (args->queue_percentage > KFD_MAX_QUEUE_PERCENTAGE) { |
| 328 | return -EFAULT; | ||
| 329 | |||
| 330 | if (args.queue_percentage > KFD_MAX_QUEUE_PERCENTAGE) { | ||
| 331 | pr_err("kfd: queue percentage must be between 0 to KFD_MAX_QUEUE_PERCENTAGE\n"); | 311 | pr_err("kfd: queue percentage must be between 0 to KFD_MAX_QUEUE_PERCENTAGE\n"); |
| 332 | return -EINVAL; | 312 | return -EINVAL; |
| 333 | } | 313 | } |
| 334 | 314 | ||
| 335 | if (args.queue_priority > KFD_MAX_QUEUE_PRIORITY) { | 315 | if (args->queue_priority > KFD_MAX_QUEUE_PRIORITY) { |
| 336 | pr_err("kfd: queue priority must be between 0 to KFD_MAX_QUEUE_PRIORITY\n"); | 316 | pr_err("kfd: queue priority must be between 0 to KFD_MAX_QUEUE_PRIORITY\n"); |
| 337 | return -EINVAL; | 317 | return -EINVAL; |
| 338 | } | 318 | } |
| 339 | 319 | ||
| 340 | if ((args.ring_base_address) && | 320 | if ((args->ring_base_address) && |
| 341 | (!access_ok(VERIFY_WRITE, | 321 | (!access_ok(VERIFY_WRITE, |
| 342 | (const void __user *) args.ring_base_address, | 322 | (const void __user *) args->ring_base_address, |
| 343 | sizeof(uint64_t)))) { | 323 | sizeof(uint64_t)))) { |
| 344 | pr_err("kfd: can't access ring base address\n"); | 324 | pr_err("kfd: can't access ring base address\n"); |
| 345 | return -EFAULT; | 325 | return -EFAULT; |
| 346 | } | 326 | } |
| 347 | 327 | ||
| 348 | if (!is_power_of_2(args.ring_size) && (args.ring_size != 0)) { | 328 | if (!is_power_of_2(args->ring_size) && (args->ring_size != 0)) { |
| 349 | pr_err("kfd: ring size must be a power of 2 or 0\n"); | 329 | pr_err("kfd: ring size must be a power of 2 or 0\n"); |
| 350 | return -EINVAL; | 330 | return -EINVAL; |
| 351 | } | 331 | } |
| 352 | 332 | ||
| 353 | properties.queue_address = args.ring_base_address; | 333 | properties.queue_address = args->ring_base_address; |
| 354 | properties.queue_size = args.ring_size; | 334 | properties.queue_size = args->ring_size; |
| 355 | properties.queue_percent = args.queue_percentage; | 335 | properties.queue_percent = args->queue_percentage; |
| 356 | properties.priority = args.queue_priority; | 336 | properties.priority = args->queue_priority; |
| 357 | 337 | ||
| 358 | pr_debug("kfd: updating queue id %d for PASID %d\n", | 338 | pr_debug("kfd: updating queue id %d for PASID %d\n", |
| 359 | args.queue_id, p->pasid); | 339 | args->queue_id, p->pasid); |
| 360 | 340 | ||
| 361 | mutex_lock(&p->mutex); | 341 | mutex_lock(&p->mutex); |
| 362 | 342 | ||
| 363 | retval = pqm_update_queue(&p->pqm, args.queue_id, &properties); | 343 | retval = pqm_update_queue(&p->pqm, args->queue_id, &properties); |
| 364 | 344 | ||
| 365 | mutex_unlock(&p->mutex); | 345 | mutex_unlock(&p->mutex); |
| 366 | 346 | ||
| 367 | return retval; | 347 | return retval; |
| 368 | } | 348 | } |
| 369 | 349 | ||
| 370 | static long kfd_ioctl_set_memory_policy(struct file *filep, | 350 | static int kfd_ioctl_set_memory_policy(struct file *filep, |
| 371 | struct kfd_process *p, void __user *arg) | 351 | struct kfd_process *p, void *data) |
| 372 | { | 352 | { |
| 373 | struct kfd_ioctl_set_memory_policy_args args; | 353 | struct kfd_ioctl_set_memory_policy_args *args = data; |
| 374 | struct kfd_dev *dev; | 354 | struct kfd_dev *dev; |
| 375 | int err = 0; | 355 | int err = 0; |
| 376 | struct kfd_process_device *pdd; | 356 | struct kfd_process_device *pdd; |
| 377 | enum cache_policy default_policy, alternate_policy; | 357 | enum cache_policy default_policy, alternate_policy; |
| 378 | 358 | ||
| 379 | if (copy_from_user(&args, arg, sizeof(args))) | 359 | if (args->default_policy != KFD_IOC_CACHE_POLICY_COHERENT |
| 380 | return -EFAULT; | 360 | && args->default_policy != KFD_IOC_CACHE_POLICY_NONCOHERENT) { |
| 381 | |||
| 382 | if (args.default_policy != KFD_IOC_CACHE_POLICY_COHERENT | ||
| 383 | && args.default_policy != KFD_IOC_CACHE_POLICY_NONCOHERENT) { | ||
| 384 | return -EINVAL; | 361 | return -EINVAL; |
| 385 | } | 362 | } |
| 386 | 363 | ||
| 387 | if (args.alternate_policy != KFD_IOC_CACHE_POLICY_COHERENT | 364 | if (args->alternate_policy != KFD_IOC_CACHE_POLICY_COHERENT |
| 388 | && args.alternate_policy != KFD_IOC_CACHE_POLICY_NONCOHERENT) { | 365 | && args->alternate_policy != KFD_IOC_CACHE_POLICY_NONCOHERENT) { |
| 389 | return -EINVAL; | 366 | return -EINVAL; |
| 390 | } | 367 | } |
| 391 | 368 | ||
| 392 | dev = kfd_device_by_id(args.gpu_id); | 369 | dev = kfd_device_by_id(args->gpu_id); |
| 393 | if (dev == NULL) | 370 | if (dev == NULL) |
| 394 | return -EINVAL; | 371 | return -EINVAL; |
| 395 | 372 | ||
| @@ -397,23 +374,23 @@ static long kfd_ioctl_set_memory_policy(struct file *filep, | |||
| 397 | 374 | ||
| 398 | pdd = kfd_bind_process_to_device(dev, p); | 375 | pdd = kfd_bind_process_to_device(dev, p); |
| 399 | if (IS_ERR(pdd)) { | 376 | if (IS_ERR(pdd)) { |
| 400 | err = PTR_ERR(pdd); | 377 | err = -ESRCH; |
| 401 | goto out; | 378 | goto out; |
| 402 | } | 379 | } |
| 403 | 380 | ||
| 404 | default_policy = (args.default_policy == KFD_IOC_CACHE_POLICY_COHERENT) | 381 | default_policy = (args->default_policy == KFD_IOC_CACHE_POLICY_COHERENT) |
| 405 | ? cache_policy_coherent : cache_policy_noncoherent; | 382 | ? cache_policy_coherent : cache_policy_noncoherent; |
| 406 | 383 | ||
| 407 | alternate_policy = | 384 | alternate_policy = |
| 408 | (args.alternate_policy == KFD_IOC_CACHE_POLICY_COHERENT) | 385 | (args->alternate_policy == KFD_IOC_CACHE_POLICY_COHERENT) |
| 409 | ? cache_policy_coherent : cache_policy_noncoherent; | 386 | ? cache_policy_coherent : cache_policy_noncoherent; |
| 410 | 387 | ||
| 411 | if (!dev->dqm->set_cache_memory_policy(dev->dqm, | 388 | if (!dev->dqm->set_cache_memory_policy(dev->dqm, |
| 412 | &pdd->qpd, | 389 | &pdd->qpd, |
| 413 | default_policy, | 390 | default_policy, |
| 414 | alternate_policy, | 391 | alternate_policy, |
| 415 | (void __user *)args.alternate_aperture_base, | 392 | (void __user *)args->alternate_aperture_base, |
| 416 | args.alternate_aperture_size)) | 393 | args->alternate_aperture_size)) |
| 417 | err = -EINVAL; | 394 | err = -EINVAL; |
| 418 | 395 | ||
| 419 | out: | 396 | out: |
| @@ -422,53 +399,44 @@ out: | |||
| 422 | return err; | 399 | return err; |
| 423 | } | 400 | } |
| 424 | 401 | ||
| 425 | static long kfd_ioctl_get_clock_counters(struct file *filep, | 402 | static int kfd_ioctl_get_clock_counters(struct file *filep, |
| 426 | struct kfd_process *p, void __user *arg) | 403 | struct kfd_process *p, void *data) |
| 427 | { | 404 | { |
| 428 | struct kfd_ioctl_get_clock_counters_args args; | 405 | struct kfd_ioctl_get_clock_counters_args *args = data; |
| 429 | struct kfd_dev *dev; | 406 | struct kfd_dev *dev; |
| 430 | struct timespec time; | 407 | struct timespec time; |
| 431 | 408 | ||
| 432 | if (copy_from_user(&args, arg, sizeof(args))) | 409 | dev = kfd_device_by_id(args->gpu_id); |
| 433 | return -EFAULT; | ||
| 434 | |||
| 435 | dev = kfd_device_by_id(args.gpu_id); | ||
| 436 | if (dev == NULL) | 410 | if (dev == NULL) |
| 437 | return -EINVAL; | 411 | return -EINVAL; |
| 438 | 412 | ||
| 439 | /* Reading GPU clock counter from KGD */ | 413 | /* Reading GPU clock counter from KGD */ |
| 440 | args.gpu_clock_counter = kfd2kgd->get_gpu_clock_counter(dev->kgd); | 414 | args->gpu_clock_counter = kfd2kgd->get_gpu_clock_counter(dev->kgd); |
| 441 | 415 | ||
| 442 | /* No access to rdtsc. Using raw monotonic time */ | 416 | /* No access to rdtsc. Using raw monotonic time */ |
| 443 | getrawmonotonic(&time); | 417 | getrawmonotonic(&time); |
| 444 | args.cpu_clock_counter = (uint64_t)timespec_to_ns(&time); | 418 | args->cpu_clock_counter = (uint64_t)timespec_to_ns(&time); |
| 445 | 419 | ||
| 446 | get_monotonic_boottime(&time); | 420 | get_monotonic_boottime(&time); |
| 447 | args.system_clock_counter = (uint64_t)timespec_to_ns(&time); | 421 | args->system_clock_counter = (uint64_t)timespec_to_ns(&time); |
| 448 | 422 | ||
| 449 | /* Since the counter is in nano-seconds we use 1GHz frequency */ | 423 | /* Since the counter is in nano-seconds we use 1GHz frequency */ |
| 450 | args.system_clock_freq = 1000000000; | 424 | args->system_clock_freq = 1000000000; |
| 451 | |||
| 452 | if (copy_to_user(arg, &args, sizeof(args))) | ||
| 453 | return -EFAULT; | ||
| 454 | 425 | ||
| 455 | return 0; | 426 | return 0; |
| 456 | } | 427 | } |
| 457 | 428 | ||
| 458 | 429 | ||
| 459 | static int kfd_ioctl_get_process_apertures(struct file *filp, | 430 | static int kfd_ioctl_get_process_apertures(struct file *filp, |
| 460 | struct kfd_process *p, void __user *arg) | 431 | struct kfd_process *p, void *data) |
| 461 | { | 432 | { |
| 462 | struct kfd_ioctl_get_process_apertures_args args; | 433 | struct kfd_ioctl_get_process_apertures_args *args = data; |
| 463 | struct kfd_process_device_apertures *pAperture; | 434 | struct kfd_process_device_apertures *pAperture; |
| 464 | struct kfd_process_device *pdd; | 435 | struct kfd_process_device *pdd; |
| 465 | 436 | ||
| 466 | dev_dbg(kfd_device, "get apertures for PASID %d", p->pasid); | 437 | dev_dbg(kfd_device, "get apertures for PASID %d", p->pasid); |
| 467 | 438 | ||
| 468 | if (copy_from_user(&args, arg, sizeof(args))) | 439 | args->num_of_nodes = 0; |
| 469 | return -EFAULT; | ||
| 470 | |||
| 471 | args.num_of_nodes = 0; | ||
| 472 | 440 | ||
| 473 | mutex_lock(&p->mutex); | 441 | mutex_lock(&p->mutex); |
| 474 | 442 | ||
| @@ -477,7 +445,8 @@ static int kfd_ioctl_get_process_apertures(struct file *filp, | |||
| 477 | /* Run over all pdd of the process */ | 445 | /* Run over all pdd of the process */ |
| 478 | pdd = kfd_get_first_process_device_data(p); | 446 | pdd = kfd_get_first_process_device_data(p); |
| 479 | do { | 447 | do { |
| 480 | pAperture = &args.process_apertures[args.num_of_nodes]; | 448 | pAperture = |
| 449 | &args->process_apertures[args->num_of_nodes]; | ||
| 481 | pAperture->gpu_id = pdd->dev->id; | 450 | pAperture->gpu_id = pdd->dev->id; |
| 482 | pAperture->lds_base = pdd->lds_base; | 451 | pAperture->lds_base = pdd->lds_base; |
| 483 | pAperture->lds_limit = pdd->lds_limit; | 452 | pAperture->lds_limit = pdd->lds_limit; |
| @@ -487,7 +456,7 @@ static int kfd_ioctl_get_process_apertures(struct file *filp, | |||
| 487 | pAperture->scratch_limit = pdd->scratch_limit; | 456 | pAperture->scratch_limit = pdd->scratch_limit; |
| 488 | 457 | ||
| 489 | dev_dbg(kfd_device, | 458 | dev_dbg(kfd_device, |
| 490 | "node id %u\n", args.num_of_nodes); | 459 | "node id %u\n", args->num_of_nodes); |
| 491 | dev_dbg(kfd_device, | 460 | dev_dbg(kfd_device, |
| 492 | "gpu id %u\n", pdd->dev->id); | 461 | "gpu id %u\n", pdd->dev->id); |
| 493 | dev_dbg(kfd_device, | 462 | dev_dbg(kfd_device, |
| @@ -503,80 +472,131 @@ static int kfd_ioctl_get_process_apertures(struct file *filp, | |||
| 503 | dev_dbg(kfd_device, | 472 | dev_dbg(kfd_device, |
| 504 | "scratch_limit %llX\n", pdd->scratch_limit); | 473 | "scratch_limit %llX\n", pdd->scratch_limit); |
| 505 | 474 | ||
| 506 | args.num_of_nodes++; | 475 | args->num_of_nodes++; |
| 507 | } while ((pdd = kfd_get_next_process_device_data(p, pdd)) != NULL && | 476 | } while ((pdd = kfd_get_next_process_device_data(p, pdd)) != NULL && |
| 508 | (args.num_of_nodes < NUM_OF_SUPPORTED_GPUS)); | 477 | (args->num_of_nodes < NUM_OF_SUPPORTED_GPUS)); |
| 509 | } | 478 | } |
| 510 | 479 | ||
| 511 | mutex_unlock(&p->mutex); | 480 | mutex_unlock(&p->mutex); |
| 512 | 481 | ||
| 513 | if (copy_to_user(arg, &args, sizeof(args))) | ||
| 514 | return -EFAULT; | ||
| 515 | |||
| 516 | return 0; | 482 | return 0; |
| 517 | } | 483 | } |
| 518 | 484 | ||
| 485 | #define AMDKFD_IOCTL_DEF(ioctl, _func, _flags) \ | ||
| 486 | [_IOC_NR(ioctl)] = {.cmd = ioctl, .func = _func, .flags = _flags, .cmd_drv = 0, .name = #ioctl} | ||
| 487 | |||
| 488 | /** Ioctl table */ | ||
| 489 | static const struct amdkfd_ioctl_desc amdkfd_ioctls[] = { | ||
| 490 | AMDKFD_IOCTL_DEF(AMDKFD_IOC_GET_VERSION, | ||
| 491 | kfd_ioctl_get_version, 0), | ||
| 492 | |||
| 493 | AMDKFD_IOCTL_DEF(AMDKFD_IOC_CREATE_QUEUE, | ||
| 494 | kfd_ioctl_create_queue, 0), | ||
| 495 | |||
| 496 | AMDKFD_IOCTL_DEF(AMDKFD_IOC_DESTROY_QUEUE, | ||
| 497 | kfd_ioctl_destroy_queue, 0), | ||
| 498 | |||
| 499 | AMDKFD_IOCTL_DEF(AMDKFD_IOC_SET_MEMORY_POLICY, | ||
| 500 | kfd_ioctl_set_memory_policy, 0), | ||
| 501 | |||
| 502 | AMDKFD_IOCTL_DEF(AMDKFD_IOC_GET_CLOCK_COUNTERS, | ||
| 503 | kfd_ioctl_get_clock_counters, 0), | ||
| 504 | |||
| 505 | AMDKFD_IOCTL_DEF(AMDKFD_IOC_GET_PROCESS_APERTURES, | ||
| 506 | kfd_ioctl_get_process_apertures, 0), | ||
| 507 | |||
| 508 | AMDKFD_IOCTL_DEF(AMDKFD_IOC_UPDATE_QUEUE, | ||
| 509 | kfd_ioctl_update_queue, 0), | ||
| 510 | }; | ||
| 511 | |||
| 512 | #define AMDKFD_CORE_IOCTL_COUNT ARRAY_SIZE(amdkfd_ioctls) | ||
| 513 | |||
| 519 | static long kfd_ioctl(struct file *filep, unsigned int cmd, unsigned long arg) | 514 | static long kfd_ioctl(struct file *filep, unsigned int cmd, unsigned long arg) |
| 520 | { | 515 | { |
| 521 | struct kfd_process *process; | 516 | struct kfd_process *process; |
| 522 | long err = -EINVAL; | 517 | amdkfd_ioctl_t *func; |
| 518 | const struct amdkfd_ioctl_desc *ioctl = NULL; | ||
| 519 | unsigned int nr = _IOC_NR(cmd); | ||
| 520 | char stack_kdata[128]; | ||
| 521 | char *kdata = NULL; | ||
| 522 | unsigned int usize, asize; | ||
| 523 | int retcode = -EINVAL; | ||
| 523 | 524 | ||
| 524 | dev_dbg(kfd_device, | 525 | if (nr >= AMDKFD_CORE_IOCTL_COUNT) |
| 525 | "ioctl cmd 0x%x (#%d), arg 0x%lx\n", | 526 | goto err_i1; |
| 526 | cmd, _IOC_NR(cmd), arg); | 527 | |
| 528 | if ((nr >= AMDKFD_COMMAND_START) && (nr < AMDKFD_COMMAND_END)) { | ||
| 529 | u32 amdkfd_size; | ||
| 530 | |||
| 531 | ioctl = &amdkfd_ioctls[nr]; | ||
| 532 | |||
| 533 | amdkfd_size = _IOC_SIZE(ioctl->cmd); | ||
| 534 | usize = asize = _IOC_SIZE(cmd); | ||
| 535 | if (amdkfd_size > asize) | ||
| 536 | asize = amdkfd_size; | ||
| 537 | |||
| 538 | cmd = ioctl->cmd; | ||
| 539 | } else | ||
| 540 | goto err_i1; | ||
| 541 | |||
| 542 | dev_dbg(kfd_device, "ioctl cmd 0x%x (#%d), arg 0x%lx\n", cmd, nr, arg); | ||
| 527 | 543 | ||
| 528 | process = kfd_get_process(current); | 544 | process = kfd_get_process(current); |
| 529 | if (IS_ERR(process)) | 545 | if (IS_ERR(process)) { |
| 530 | return PTR_ERR(process); | 546 | dev_dbg(kfd_device, "no process\n"); |
| 547 | goto err_i1; | ||
| 548 | } | ||
| 531 | 549 | ||
| 532 | switch (cmd) { | 550 | /* Do not trust userspace, use our own definition */ |
| 533 | case KFD_IOC_GET_VERSION: | 551 | func = ioctl->func; |
| 534 | err = kfd_ioctl_get_version(filep, process, (void __user *)arg); | 552 | |
| 535 | break; | 553 | if (unlikely(!func)) { |
| 536 | case KFD_IOC_CREATE_QUEUE: | 554 | dev_dbg(kfd_device, "no function\n"); |
| 537 | err = kfd_ioctl_create_queue(filep, process, | 555 | retcode = -EINVAL; |
| 538 | (void __user *)arg); | 556 | goto err_i1; |
| 539 | break; | ||
| 540 | |||
| 541 | case KFD_IOC_DESTROY_QUEUE: | ||
| 542 | err = kfd_ioctl_destroy_queue(filep, process, | ||
| 543 | (void __user *)arg); | ||
| 544 | break; | ||
| 545 | |||
| 546 | case KFD_IOC_SET_MEMORY_POLICY: | ||
| 547 | err = kfd_ioctl_set_memory_policy(filep, process, | ||
| 548 | (void __user *)arg); | ||
| 549 | break; | ||
| 550 | |||
| 551 | case KFD_IOC_GET_CLOCK_COUNTERS: | ||
| 552 | err = kfd_ioctl_get_clock_counters(filep, process, | ||
| 553 | (void __user *)arg); | ||
| 554 | break; | ||
| 555 | |||
| 556 | case KFD_IOC_GET_PROCESS_APERTURES: | ||
| 557 | err = kfd_ioctl_get_process_apertures(filep, process, | ||
| 558 | (void __user *)arg); | ||
| 559 | break; | ||
| 560 | |||
| 561 | case KFD_IOC_UPDATE_QUEUE: | ||
| 562 | err = kfd_ioctl_update_queue(filep, process, | ||
| 563 | (void __user *)arg); | ||
| 564 | break; | ||
| 565 | |||
| 566 | default: | ||
| 567 | dev_err(kfd_device, | ||
| 568 | "unknown ioctl cmd 0x%x, arg 0x%lx)\n", | ||
| 569 | cmd, arg); | ||
| 570 | err = -EINVAL; | ||
| 571 | break; | ||
| 572 | } | 557 | } |
| 573 | 558 | ||
| 574 | if (err < 0) | 559 | if (cmd & (IOC_IN | IOC_OUT)) { |
| 575 | dev_err(kfd_device, | 560 | if (asize <= sizeof(stack_kdata)) { |
| 576 | "ioctl error %ld for ioctl cmd 0x%x (#%d)\n", | 561 | kdata = stack_kdata; |
| 577 | err, cmd, _IOC_NR(cmd)); | 562 | } else { |
| 563 | kdata = kmalloc(asize, GFP_KERNEL); | ||
| 564 | if (!kdata) { | ||
| 565 | retcode = -ENOMEM; | ||
| 566 | goto err_i1; | ||
| 567 | } | ||
| 568 | } | ||
| 569 | if (asize > usize) | ||
| 570 | memset(kdata + usize, 0, asize - usize); | ||
| 571 | } | ||
| 578 | 572 | ||
| 579 | return err; | 573 | if (cmd & IOC_IN) { |
| 574 | if (copy_from_user(kdata, (void __user *)arg, usize) != 0) { | ||
| 575 | retcode = -EFAULT; | ||
| 576 | goto err_i1; | ||
| 577 | } | ||
| 578 | } else if (cmd & IOC_OUT) { | ||
| 579 | memset(kdata, 0, usize); | ||
| 580 | } | ||
| 581 | |||
| 582 | retcode = func(filep, process, kdata); | ||
| 583 | |||
| 584 | if (cmd & IOC_OUT) | ||
| 585 | if (copy_to_user((void __user *)arg, kdata, usize) != 0) | ||
| 586 | retcode = -EFAULT; | ||
| 587 | |||
| 588 | err_i1: | ||
| 589 | if (!ioctl) | ||
| 590 | dev_dbg(kfd_device, "invalid ioctl: pid=%d, cmd=0x%02x, nr=0x%02x\n", | ||
| 591 | task_pid_nr(current), cmd, nr); | ||
| 592 | |||
| 593 | if (kdata != stack_kdata) | ||
| 594 | kfree(kdata); | ||
| 595 | |||
| 596 | if (retcode) | ||
| 597 | dev_dbg(kfd_device, "ret = %d\n", retcode); | ||
| 598 | |||
| 599 | return retcode; | ||
| 580 | } | 600 | } |
| 581 | 601 | ||
| 582 | static int kfd_mmap(struct file *filp, struct vm_area_struct *vma) | 602 | static int kfd_mmap(struct file *filp, struct vm_area_struct *vma) |
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device.c b/drivers/gpu/drm/amd/amdkfd/kfd_device.c index 43884ebd4303..25bc47f3c1cf 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_device.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device.c | |||
| @@ -26,6 +26,7 @@ | |||
| 26 | #include <linux/slab.h> | 26 | #include <linux/slab.h> |
| 27 | #include "kfd_priv.h" | 27 | #include "kfd_priv.h" |
| 28 | #include "kfd_device_queue_manager.h" | 28 | #include "kfd_device_queue_manager.h" |
| 29 | #include "kfd_pm4_headers.h" | ||
| 29 | 30 | ||
| 30 | #define MQD_SIZE_ALIGNED 768 | 31 | #define MQD_SIZE_ALIGNED 768 |
| 31 | 32 | ||
| @@ -169,9 +170,8 @@ bool kgd2kfd_device_init(struct kfd_dev *kfd, | |||
| 169 | kfd->shared_resources = *gpu_resources; | 170 | kfd->shared_resources = *gpu_resources; |
| 170 | 171 | ||
| 171 | /* calculate max size of mqds needed for queues */ | 172 | /* calculate max size of mqds needed for queues */ |
| 172 | size = max_num_of_processes * | 173 | size = max_num_of_queues_per_device * |
| 173 | max_num_of_queues_per_process * | 174 | kfd->device_info->mqd_size_aligned; |
| 174 | kfd->device_info->mqd_size_aligned; | ||
| 175 | 175 | ||
| 176 | /* add another 512KB for all other allocations on gart */ | 176 | /* add another 512KB for all other allocations on gart */ |
| 177 | size += 512 * 1024; | 177 | size += 512 * 1024; |
| @@ -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 924e90c072e5..0fd592799d58 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c | |||
| @@ -161,6 +161,9 @@ static void deallocate_vmid(struct device_queue_manager *dqm, | |||
| 161 | { | 161 | { |
| 162 | int bit = qpd->vmid - KFD_VMID_START_OFFSET; | 162 | int bit = qpd->vmid - KFD_VMID_START_OFFSET; |
| 163 | 163 | ||
| 164 | /* Release the vmid mapping */ | ||
| 165 | set_pasid_vmid_mapping(dqm, 0, qpd->vmid); | ||
| 166 | |||
| 164 | set_bit(bit, (unsigned long *)&dqm->vmid_bitmap); | 167 | set_bit(bit, (unsigned long *)&dqm->vmid_bitmap); |
| 165 | qpd->vmid = 0; | 168 | qpd->vmid = 0; |
| 166 | q->properties.vmid = 0; | 169 | q->properties.vmid = 0; |
| @@ -180,6 +183,13 @@ static int create_queue_nocpsch(struct device_queue_manager *dqm, | |||
| 180 | 183 | ||
| 181 | mutex_lock(&dqm->lock); | 184 | mutex_lock(&dqm->lock); |
| 182 | 185 | ||
| 186 | if (dqm->total_queue_count >= max_num_of_queues_per_device) { | ||
| 187 | pr_warn("amdkfd: Can't create new usermode queue because %d queues were already created\n", | ||
| 188 | dqm->total_queue_count); | ||
| 189 | mutex_unlock(&dqm->lock); | ||
| 190 | return -EPERM; | ||
| 191 | } | ||
| 192 | |||
| 183 | if (list_empty(&qpd->queues_list)) { | 193 | if (list_empty(&qpd->queues_list)) { |
| 184 | retval = allocate_vmid(dqm, qpd, q); | 194 | retval = allocate_vmid(dqm, qpd, q); |
| 185 | if (retval != 0) { | 195 | if (retval != 0) { |
| @@ -204,6 +214,14 @@ static int create_queue_nocpsch(struct device_queue_manager *dqm, | |||
| 204 | list_add(&q->list, &qpd->queues_list); | 214 | list_add(&q->list, &qpd->queues_list); |
| 205 | dqm->queue_count++; | 215 | dqm->queue_count++; |
| 206 | 216 | ||
| 217 | /* | ||
| 218 | * Unconditionally increment this counter, regardless of the queue's | ||
| 219 | * type or whether the queue is active. | ||
| 220 | */ | ||
| 221 | dqm->total_queue_count++; | ||
| 222 | pr_debug("Total of %d queues are accountable so far\n", | ||
| 223 | dqm->total_queue_count); | ||
| 224 | |||
| 207 | mutex_unlock(&dqm->lock); | 225 | mutex_unlock(&dqm->lock); |
| 208 | return 0; | 226 | return 0; |
| 209 | } | 227 | } |
| @@ -272,6 +290,18 @@ static int create_compute_queue_nocpsch(struct device_queue_manager *dqm, | |||
| 272 | return retval; | 290 | return retval; |
| 273 | } | 291 | } |
| 274 | 292 | ||
| 293 | pr_debug("kfd: loading mqd to hqd on pipe (%d) queue (%d)\n", | ||
| 294 | q->pipe, | ||
| 295 | q->queue); | ||
| 296 | |||
| 297 | retval = mqd->load_mqd(mqd, q->mqd, q->pipe, | ||
| 298 | q->queue, (uint32_t __user *) q->properties.write_ptr); | ||
| 299 | if (retval != 0) { | ||
| 300 | deallocate_hqd(dqm, q); | ||
| 301 | mqd->uninit_mqd(mqd, q->mqd, q->mqd_mem_obj); | ||
| 302 | return retval; | ||
| 303 | } | ||
| 304 | |||
| 275 | return 0; | 305 | return 0; |
| 276 | } | 306 | } |
| 277 | 307 | ||
| @@ -311,6 +341,15 @@ static int destroy_queue_nocpsch(struct device_queue_manager *dqm, | |||
| 311 | if (list_empty(&qpd->queues_list)) | 341 | if (list_empty(&qpd->queues_list)) |
| 312 | deallocate_vmid(dqm, qpd, q); | 342 | deallocate_vmid(dqm, qpd, q); |
| 313 | dqm->queue_count--; | 343 | dqm->queue_count--; |
| 344 | |||
| 345 | /* | ||
| 346 | * Unconditionally decrement this counter, regardless of the queue's | ||
| 347 | * type | ||
| 348 | */ | ||
| 349 | dqm->total_queue_count--; | ||
| 350 | pr_debug("Total of %d queues are accountable so far\n", | ||
| 351 | dqm->total_queue_count); | ||
| 352 | |||
| 314 | out: | 353 | out: |
| 315 | mutex_unlock(&dqm->lock); | 354 | mutex_unlock(&dqm->lock); |
| 316 | return retval; | 355 | return retval; |
| @@ -320,6 +359,7 @@ static int update_queue(struct device_queue_manager *dqm, struct queue *q) | |||
| 320 | { | 359 | { |
| 321 | int retval; | 360 | int retval; |
| 322 | struct mqd_manager *mqd; | 361 | struct mqd_manager *mqd; |
| 362 | bool prev_active = false; | ||
| 323 | 363 | ||
| 324 | BUG_ON(!dqm || !q || !q->mqd); | 364 | BUG_ON(!dqm || !q || !q->mqd); |
| 325 | 365 | ||
| @@ -330,10 +370,18 @@ static int update_queue(struct device_queue_manager *dqm, struct queue *q) | |||
| 330 | return -ENOMEM; | 370 | return -ENOMEM; |
| 331 | } | 371 | } |
| 332 | 372 | ||
| 333 | retval = mqd->update_mqd(mqd, q->mqd, &q->properties); | ||
| 334 | if (q->properties.is_active == true) | 373 | if (q->properties.is_active == true) |
| 374 | prev_active = true; | ||
| 375 | |||
| 376 | /* | ||
| 377 | * | ||
| 378 | * check active state vs. the previous state | ||
| 379 | * and modify counter accordingly | ||
| 380 | */ | ||
| 381 | retval = mqd->update_mqd(mqd, q->mqd, &q->properties); | ||
| 382 | if ((q->properties.is_active == true) && (prev_active == false)) | ||
| 335 | dqm->queue_count++; | 383 | dqm->queue_count++; |
| 336 | else | 384 | else if ((q->properties.is_active == false) && (prev_active == true)) |
| 337 | dqm->queue_count--; | 385 | dqm->queue_count--; |
| 338 | 386 | ||
| 339 | if (sched_policy != KFD_SCHED_POLICY_NO_HWS) | 387 | if (sched_policy != KFD_SCHED_POLICY_NO_HWS) |
| @@ -517,10 +565,14 @@ static int init_pipelines(struct device_queue_manager *dqm, | |||
| 517 | 565 | ||
| 518 | for (i = 0; i < pipes_num; i++) { | 566 | for (i = 0; i < pipes_num; i++) { |
| 519 | inx = i + first_pipe; | 567 | inx = i + first_pipe; |
| 568 | /* | ||
| 569 | * HPD buffer on GTT is allocated by amdkfd, no need to waste | ||
| 570 | * space in GTT for pipelines we don't initialize | ||
| 571 | */ | ||
| 520 | pipe_hpd_addr = dqm->pipelines_addr + i * CIK_HPD_EOP_BYTES; | 572 | pipe_hpd_addr = dqm->pipelines_addr + i * CIK_HPD_EOP_BYTES; |
| 521 | pr_debug("kfd: pipeline address %llX\n", pipe_hpd_addr); | 573 | pr_debug("kfd: pipeline address %llX\n", pipe_hpd_addr); |
| 522 | /* = log2(bytes/4)-1 */ | 574 | /* = log2(bytes/4)-1 */ |
| 523 | kfd2kgd->init_pipeline(dqm->dev->kgd, i, | 575 | kfd2kgd->init_pipeline(dqm->dev->kgd, inx, |
| 524 | CIK_HPD_EOP_BYTES_LOG2 - 3, pipe_hpd_addr); | 576 | CIK_HPD_EOP_BYTES_LOG2 - 3, pipe_hpd_addr); |
| 525 | } | 577 | } |
| 526 | 578 | ||
| @@ -536,7 +588,7 @@ static int init_scheduler(struct device_queue_manager *dqm) | |||
| 536 | 588 | ||
| 537 | pr_debug("kfd: In %s\n", __func__); | 589 | pr_debug("kfd: In %s\n", __func__); |
| 538 | 590 | ||
| 539 | retval = init_pipelines(dqm, get_pipes_num(dqm), KFD_DQM_FIRST_PIPE); | 591 | retval = init_pipelines(dqm, get_pipes_num(dqm), get_first_pipe(dqm)); |
| 540 | if (retval != 0) | 592 | if (retval != 0) |
| 541 | return retval; | 593 | return retval; |
| 542 | 594 | ||
| @@ -728,6 +780,21 @@ static int create_kernel_queue_cpsch(struct device_queue_manager *dqm, | |||
| 728 | pr_debug("kfd: In func %s\n", __func__); | 780 | pr_debug("kfd: In func %s\n", __func__); |
| 729 | 781 | ||
| 730 | mutex_lock(&dqm->lock); | 782 | mutex_lock(&dqm->lock); |
| 783 | if (dqm->total_queue_count >= max_num_of_queues_per_device) { | ||
| 784 | pr_warn("amdkfd: Can't create new kernel queue because %d queues were already created\n", | ||
| 785 | dqm->total_queue_count); | ||
| 786 | mutex_unlock(&dqm->lock); | ||
| 787 | return -EPERM; | ||
| 788 | } | ||
| 789 | |||
| 790 | /* | ||
| 791 | * Unconditionally increment this counter, regardless of the queue's | ||
| 792 | * type or whether the queue is active. | ||
| 793 | */ | ||
| 794 | dqm->total_queue_count++; | ||
| 795 | pr_debug("Total of %d queues are accountable so far\n", | ||
| 796 | dqm->total_queue_count); | ||
| 797 | |||
| 731 | list_add(&kq->list, &qpd->priv_queue_list); | 798 | list_add(&kq->list, &qpd->priv_queue_list); |
| 732 | dqm->queue_count++; | 799 | dqm->queue_count++; |
| 733 | qpd->is_debug = true; | 800 | qpd->is_debug = true; |
| @@ -751,6 +818,13 @@ static void destroy_kernel_queue_cpsch(struct device_queue_manager *dqm, | |||
| 751 | dqm->queue_count--; | 818 | dqm->queue_count--; |
| 752 | qpd->is_debug = false; | 819 | qpd->is_debug = false; |
| 753 | execute_queues_cpsch(dqm, false); | 820 | execute_queues_cpsch(dqm, false); |
| 821 | /* | ||
| 822 | * Unconditionally decrement this counter, regardless of the queue's | ||
| 823 | * type. | ||
| 824 | */ | ||
| 825 | dqm->total_queue_count--; | ||
| 826 | pr_debug("Total of %d queues are accountable so far\n", | ||
| 827 | dqm->total_queue_count); | ||
| 754 | mutex_unlock(&dqm->lock); | 828 | mutex_unlock(&dqm->lock); |
| 755 | } | 829 | } |
| 756 | 830 | ||
| @@ -769,6 +843,13 @@ static int create_queue_cpsch(struct device_queue_manager *dqm, struct queue *q, | |||
| 769 | 843 | ||
| 770 | mutex_lock(&dqm->lock); | 844 | mutex_lock(&dqm->lock); |
| 771 | 845 | ||
| 846 | if (dqm->total_queue_count >= max_num_of_queues_per_device) { | ||
| 847 | pr_warn("amdkfd: Can't create new usermode queue because %d queues were already created\n", | ||
| 848 | dqm->total_queue_count); | ||
| 849 | retval = -EPERM; | ||
| 850 | goto out; | ||
| 851 | } | ||
| 852 | |||
| 772 | mqd = dqm->get_mqd_manager(dqm, KFD_MQD_TYPE_CIK_CP); | 853 | mqd = dqm->get_mqd_manager(dqm, KFD_MQD_TYPE_CIK_CP); |
| 773 | if (mqd == NULL) { | 854 | if (mqd == NULL) { |
| 774 | mutex_unlock(&dqm->lock); | 855 | mutex_unlock(&dqm->lock); |
| @@ -786,6 +867,15 @@ static int create_queue_cpsch(struct device_queue_manager *dqm, struct queue *q, | |||
| 786 | retval = execute_queues_cpsch(dqm, false); | 867 | retval = execute_queues_cpsch(dqm, false); |
| 787 | } | 868 | } |
| 788 | 869 | ||
| 870 | /* | ||
| 871 | * Unconditionally increment this counter, regardless of the queue's | ||
| 872 | * type or whether the queue is active. | ||
| 873 | */ | ||
| 874 | dqm->total_queue_count++; | ||
| 875 | |||
| 876 | pr_debug("Total of %d queues are accountable so far\n", | ||
| 877 | dqm->total_queue_count); | ||
| 878 | |||
| 789 | out: | 879 | out: |
| 790 | mutex_unlock(&dqm->lock); | 880 | mutex_unlock(&dqm->lock); |
| 791 | return retval; | 881 | return retval; |
| @@ -906,6 +996,14 @@ static int destroy_queue_cpsch(struct device_queue_manager *dqm, | |||
| 906 | 996 | ||
| 907 | mqd->uninit_mqd(mqd, q->mqd, q->mqd_mem_obj); | 997 | mqd->uninit_mqd(mqd, q->mqd, q->mqd_mem_obj); |
| 908 | 998 | ||
| 999 | /* | ||
| 1000 | * Unconditionally decrement this counter, regardless of the queue's | ||
| 1001 | * type | ||
| 1002 | */ | ||
| 1003 | dqm->total_queue_count--; | ||
| 1004 | pr_debug("Total of %d queues are accountable so far\n", | ||
| 1005 | dqm->total_queue_count); | ||
| 1006 | |||
| 909 | mutex_unlock(&dqm->lock); | 1007 | mutex_unlock(&dqm->lock); |
| 910 | 1008 | ||
| 911 | return 0; | 1009 | return 0; |
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h index c3f189e8ae35..52035bf0c1cb 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h | |||
| @@ -130,6 +130,7 @@ struct device_queue_manager { | |||
| 130 | struct list_head queues; | 130 | struct list_head queues; |
| 131 | unsigned int processes_count; | 131 | unsigned int processes_count; |
| 132 | unsigned int queue_count; | 132 | unsigned int queue_count; |
| 133 | unsigned int total_queue_count; | ||
| 133 | unsigned int next_pipe_to_allocate; | 134 | unsigned int next_pipe_to_allocate; |
| 134 | unsigned int *allocated_queues; | 135 | unsigned int *allocated_queues; |
| 135 | unsigned int vmid_bitmap; | 136 | unsigned int vmid_bitmap; |
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_module.c b/drivers/gpu/drm/amd/amdkfd/kfd_module.c index 95d5af138e6e..1c385c23dd0b 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_module.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_module.c | |||
| @@ -50,15 +50,10 @@ module_param(sched_policy, int, 0444); | |||
| 50 | MODULE_PARM_DESC(sched_policy, | 50 | MODULE_PARM_DESC(sched_policy, |
| 51 | "Kernel cmdline parameter that defines the amdkfd scheduling policy"); | 51 | "Kernel cmdline parameter that defines the amdkfd scheduling policy"); |
| 52 | 52 | ||
| 53 | int max_num_of_processes = KFD_MAX_NUM_OF_PROCESSES_DEFAULT; | 53 | int max_num_of_queues_per_device = KFD_MAX_NUM_OF_QUEUES_PER_DEVICE_DEFAULT; |
| 54 | module_param(max_num_of_processes, int, 0444); | 54 | module_param(max_num_of_queues_per_device, int, 0444); |
| 55 | MODULE_PARM_DESC(max_num_of_processes, | 55 | MODULE_PARM_DESC(max_num_of_queues_per_device, |
| 56 | "Kernel cmdline parameter that defines the amdkfd maximum number of supported processes"); | 56 | "Maximum number of supported queues per device (1 = Minimum, 4096 = default)"); |
| 57 | |||
| 58 | int max_num_of_queues_per_process = KFD_MAX_NUM_OF_QUEUES_PER_PROCESS_DEFAULT; | ||
| 59 | module_param(max_num_of_queues_per_process, int, 0444); | ||
| 60 | MODULE_PARM_DESC(max_num_of_queues_per_process, | ||
| 61 | "Kernel cmdline parameter that defines the amdkfd maximum number of supported queues per process"); | ||
| 62 | 57 | ||
| 63 | bool kgd2kfd_init(unsigned interface_version, | 58 | bool kgd2kfd_init(unsigned interface_version, |
| 64 | const struct kfd2kgd_calls *f2g, | 59 | const struct kfd2kgd_calls *f2g, |
| @@ -100,16 +95,10 @@ static int __init kfd_module_init(void) | |||
| 100 | } | 95 | } |
| 101 | 96 | ||
| 102 | /* Verify module parameters */ | 97 | /* Verify module parameters */ |
| 103 | if ((max_num_of_processes < 0) || | 98 | if ((max_num_of_queues_per_device < 1) || |
| 104 | (max_num_of_processes > KFD_MAX_NUM_OF_PROCESSES)) { | 99 | (max_num_of_queues_per_device > |
| 105 | pr_err("kfd: max_num_of_processes must be between 0 to KFD_MAX_NUM_OF_PROCESSES\n"); | 100 | KFD_MAX_NUM_OF_QUEUES_PER_DEVICE)) { |
| 106 | return -1; | 101 | pr_err("kfd: max_num_of_queues_per_device must be between 1 to KFD_MAX_NUM_OF_QUEUES_PER_DEVICE\n"); |
| 107 | } | ||
| 108 | |||
| 109 | if ((max_num_of_queues_per_process < 0) || | ||
| 110 | (max_num_of_queues_per_process > | ||
| 111 | KFD_MAX_NUM_OF_QUEUES_PER_PROCESS)) { | ||
| 112 | pr_err("kfd: max_num_of_queues_per_process must be between 0 to KFD_MAX_NUM_OF_QUEUES_PER_PROCESS\n"); | ||
| 113 | return -1; | 102 | return -1; |
| 114 | } | 103 | } |
| 115 | 104 | ||
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c index adc31474e786..4c3828cf45bf 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c | |||
| @@ -184,7 +184,7 @@ static bool is_occupied(struct mqd_manager *mm, void *mqd, | |||
| 184 | uint32_t queue_id) | 184 | uint32_t queue_id) |
| 185 | { | 185 | { |
| 186 | 186 | ||
| 187 | return kfd2kgd->hqd_is_occupies(mm->dev->kgd, queue_address, | 187 | return kfd2kgd->hqd_is_occupied(mm->dev->kgd, queue_address, |
| 188 | pipe_id, queue_id); | 188 | pipe_id, queue_id); |
| 189 | 189 | ||
| 190 | } | 190 | } |
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_pasid.c b/drivers/gpu/drm/amd/amdkfd/kfd_pasid.c index 71699ad97d74..6cfe7f1f18cf 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_pasid.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_pasid.c | |||
| @@ -30,9 +30,9 @@ static DEFINE_MUTEX(pasid_mutex); | |||
| 30 | 30 | ||
| 31 | int kfd_pasid_init(void) | 31 | int kfd_pasid_init(void) |
| 32 | { | 32 | { |
| 33 | pasid_limit = max_num_of_processes; | 33 | pasid_limit = KFD_MAX_NUM_OF_PROCESSES; |
| 34 | 34 | ||
| 35 | pasid_bitmap = kzalloc(BITS_TO_LONGS(pasid_limit), GFP_KERNEL); | 35 | pasid_bitmap = kcalloc(BITS_TO_LONGS(pasid_limit), sizeof(long), GFP_KERNEL); |
| 36 | if (!pasid_bitmap) | 36 | if (!pasid_bitmap) |
| 37 | return -ENOMEM; | 37 | return -ENOMEM; |
| 38 | 38 | ||
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h index f9fb81e3bb09..96dc10e8904a 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h +++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h | |||
| @@ -52,20 +52,19 @@ | |||
| 52 | #define kfd_alloc_struct(ptr_to_struct) \ | 52 | #define kfd_alloc_struct(ptr_to_struct) \ |
| 53 | ((typeof(ptr_to_struct)) kzalloc(sizeof(*ptr_to_struct), GFP_KERNEL)) | 53 | ((typeof(ptr_to_struct)) kzalloc(sizeof(*ptr_to_struct), GFP_KERNEL)) |
| 54 | 54 | ||
| 55 | /* Kernel module parameter to specify maximum number of supported processes */ | ||
| 56 | extern int max_num_of_processes; | ||
| 57 | |||
| 58 | #define KFD_MAX_NUM_OF_PROCESSES_DEFAULT 32 | ||
| 59 | #define KFD_MAX_NUM_OF_PROCESSES 512 | 55 | #define KFD_MAX_NUM_OF_PROCESSES 512 |
| 56 | #define KFD_MAX_NUM_OF_QUEUES_PER_PROCESS 1024 | ||
| 60 | 57 | ||
| 61 | /* | 58 | /* |
| 62 | * Kernel module parameter to specify maximum number of supported queues | 59 | * Kernel module parameter to specify maximum number of supported queues per |
| 63 | * per process | 60 | * device |
| 64 | */ | 61 | */ |
| 65 | extern int max_num_of_queues_per_process; | 62 | extern int max_num_of_queues_per_device; |
| 66 | 63 | ||
| 67 | #define KFD_MAX_NUM_OF_QUEUES_PER_PROCESS_DEFAULT 128 | 64 | #define KFD_MAX_NUM_OF_QUEUES_PER_DEVICE_DEFAULT 4096 |
| 68 | #define KFD_MAX_NUM_OF_QUEUES_PER_PROCESS 1024 | 65 | #define KFD_MAX_NUM_OF_QUEUES_PER_DEVICE \ |
| 66 | (KFD_MAX_NUM_OF_PROCESSES * \ | ||
| 67 | KFD_MAX_NUM_OF_QUEUES_PER_PROCESS) | ||
| 69 | 68 | ||
| 70 | #define KFD_KERNEL_QUEUE_SIZE 2048 | 69 | #define KFD_KERNEL_QUEUE_SIZE 2048 |
| 71 | 70 | ||
| @@ -135,22 +134,10 @@ struct kfd_dev { | |||
| 135 | 134 | ||
| 136 | struct kgd2kfd_shared_resources shared_resources; | 135 | struct kgd2kfd_shared_resources shared_resources; |
| 137 | 136 | ||
| 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 */ | 137 | /* QCM Device instance */ |
| 146 | struct device_queue_manager *dqm; | 138 | struct device_queue_manager *dqm; |
| 147 | 139 | ||
| 148 | bool init_complete; | 140 | 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 | }; | 141 | }; |
| 155 | 142 | ||
| 156 | /* KGD2KFD callbacks */ | 143 | /* KGD2KFD callbacks */ |
| @@ -463,6 +450,24 @@ struct kfd_process { | |||
| 463 | bool is_32bit_user_mode; | 450 | bool is_32bit_user_mode; |
| 464 | }; | 451 | }; |
| 465 | 452 | ||
| 453 | /** | ||
| 454 | * Ioctl function type. | ||
| 455 | * | ||
| 456 | * \param filep pointer to file structure. | ||
| 457 | * \param p amdkfd process pointer. | ||
| 458 | * \param data pointer to arg that was copied from user. | ||
| 459 | */ | ||
| 460 | typedef int amdkfd_ioctl_t(struct file *filep, struct kfd_process *p, | ||
| 461 | void *data); | ||
| 462 | |||
| 463 | struct amdkfd_ioctl_desc { | ||
| 464 | unsigned int cmd; | ||
| 465 | int flags; | ||
| 466 | amdkfd_ioctl_t *func; | ||
| 467 | unsigned int cmd_drv; | ||
| 468 | const char *name; | ||
| 469 | }; | ||
| 470 | |||
| 466 | void kfd_process_create_wq(void); | 471 | void kfd_process_create_wq(void); |
| 467 | void kfd_process_destroy_wq(void); | 472 | void kfd_process_destroy_wq(void); |
| 468 | struct kfd_process *kfd_create_process(const struct task_struct *); | 473 | struct kfd_process *kfd_create_process(const struct task_struct *); |
| @@ -513,10 +518,7 @@ struct kfd_dev *kfd_device_by_pci_dev(const struct pci_dev *pdev); | |||
| 513 | struct kfd_dev *kfd_topology_enum_kfd_devices(uint8_t idx); | 518 | struct kfd_dev *kfd_topology_enum_kfd_devices(uint8_t idx); |
| 514 | 519 | ||
| 515 | /* Interrupts */ | 520 | /* Interrupts */ |
| 516 | int kfd_interrupt_init(struct kfd_dev *dev); | ||
| 517 | void kfd_interrupt_exit(struct kfd_dev *dev); | ||
| 518 | void kgd2kfd_interrupt(struct kfd_dev *kfd, const void *ih_ring_entry); | 521 | void kgd2kfd_interrupt(struct kfd_dev *kfd, const void *ih_ring_entry); |
| 519 | bool enqueue_ih_ring_entry(struct kfd_dev *kfd, const void *ih_ring_entry); | ||
| 520 | 522 | ||
| 521 | /* Power Management */ | 523 | /* Power Management */ |
| 522 | void kgd2kfd_suspend(struct kfd_dev *kfd); | 524 | void kgd2kfd_suspend(struct kfd_dev *kfd); |
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c index 47526780d736..2fda1927bff7 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c | |||
| @@ -54,11 +54,11 @@ static int find_available_queue_slot(struct process_queue_manager *pqm, | |||
| 54 | pr_debug("kfd: in %s\n", __func__); | 54 | pr_debug("kfd: in %s\n", __func__); |
| 55 | 55 | ||
| 56 | found = find_first_zero_bit(pqm->queue_slot_bitmap, | 56 | found = find_first_zero_bit(pqm->queue_slot_bitmap, |
| 57 | max_num_of_queues_per_process); | 57 | KFD_MAX_NUM_OF_QUEUES_PER_PROCESS); |
| 58 | 58 | ||
| 59 | pr_debug("kfd: the new slot id %lu\n", found); | 59 | pr_debug("kfd: the new slot id %lu\n", found); |
| 60 | 60 | ||
| 61 | if (found >= max_num_of_queues_per_process) { | 61 | if (found >= KFD_MAX_NUM_OF_QUEUES_PER_PROCESS) { |
| 62 | pr_info("amdkfd: Can not open more queues for process with pasid %d\n", | 62 | pr_info("amdkfd: Can not open more queues for process with pasid %d\n", |
| 63 | pqm->process->pasid); | 63 | pqm->process->pasid); |
| 64 | return -ENOMEM; | 64 | return -ENOMEM; |
| @@ -76,7 +76,7 @@ int pqm_init(struct process_queue_manager *pqm, struct kfd_process *p) | |||
| 76 | 76 | ||
| 77 | INIT_LIST_HEAD(&pqm->queues); | 77 | INIT_LIST_HEAD(&pqm->queues); |
| 78 | pqm->queue_slot_bitmap = | 78 | pqm->queue_slot_bitmap = |
| 79 | kzalloc(DIV_ROUND_UP(max_num_of_queues_per_process, | 79 | kzalloc(DIV_ROUND_UP(KFD_MAX_NUM_OF_QUEUES_PER_PROCESS, |
| 80 | BITS_PER_BYTE), GFP_KERNEL); | 80 | BITS_PER_BYTE), GFP_KERNEL); |
| 81 | if (pqm->queue_slot_bitmap == NULL) | 81 | if (pqm->queue_slot_bitmap == NULL) |
| 82 | return -ENOMEM; | 82 | return -ENOMEM; |
| @@ -203,6 +203,7 @@ int pqm_create_queue(struct process_queue_manager *pqm, | |||
| 203 | pqn->kq = NULL; | 203 | pqn->kq = NULL; |
| 204 | retval = dev->dqm->create_queue(dev->dqm, q, &pdd->qpd, | 204 | retval = dev->dqm->create_queue(dev->dqm, q, &pdd->qpd, |
| 205 | &q->properties.vmid); | 205 | &q->properties.vmid); |
| 206 | pr_debug("DQM returned %d for create_queue\n", retval); | ||
| 206 | print_queue(q); | 207 | print_queue(q); |
| 207 | break; | 208 | break; |
| 208 | case KFD_QUEUE_TYPE_DIQ: | 209 | case KFD_QUEUE_TYPE_DIQ: |
| @@ -222,7 +223,7 @@ int pqm_create_queue(struct process_queue_manager *pqm, | |||
| 222 | } | 223 | } |
| 223 | 224 | ||
| 224 | if (retval != 0) { | 225 | if (retval != 0) { |
| 225 | pr_err("kfd: error dqm create queue\n"); | 226 | pr_debug("Error dqm create queue\n"); |
| 226 | goto err_create_queue; | 227 | goto err_create_queue; |
| 227 | } | 228 | } |
| 228 | 229 | ||
| @@ -241,7 +242,10 @@ int pqm_create_queue(struct process_queue_manager *pqm, | |||
| 241 | err_create_queue: | 242 | err_create_queue: |
| 242 | kfree(pqn); | 243 | kfree(pqn); |
| 243 | err_allocate_pqn: | 244 | err_allocate_pqn: |
| 245 | /* check if queues list is empty unregister process from device */ | ||
| 244 | clear_bit(*qid, pqm->queue_slot_bitmap); | 246 | clear_bit(*qid, pqm->queue_slot_bitmap); |
| 247 | if (list_empty(&pqm->queues)) | ||
| 248 | dev->dqm->unregister_process(dev->dqm, &pdd->qpd); | ||
| 245 | return retval; | 249 | return retval; |
| 246 | } | 250 | } |
| 247 | 251 | ||
| @@ -311,7 +315,11 @@ int pqm_update_queue(struct process_queue_manager *pqm, unsigned int qid, | |||
| 311 | BUG_ON(!pqm); | 315 | BUG_ON(!pqm); |
| 312 | 316 | ||
| 313 | pqn = get_queue_by_qid(pqm, qid); | 317 | pqn = get_queue_by_qid(pqm, qid); |
| 314 | BUG_ON(!pqn); | 318 | if (!pqn) { |
| 319 | pr_debug("amdkfd: No queue %d exists for update operation\n", | ||
| 320 | qid); | ||
| 321 | return -EFAULT; | ||
| 322 | } | ||
| 315 | 323 | ||
| 316 | pqn->q->properties.queue_address = p->queue_address; | 324 | pqn->q->properties.queue_address = p->queue_address; |
| 317 | pqn->q->properties.queue_size = p->queue_size; | 325 | pqn->q->properties.queue_size = p->queue_size; |
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c index b11792d7e70e..cca1708fd811 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c | |||
| @@ -921,7 +921,7 @@ static int kfd_build_sysfs_node_tree(void) | |||
| 921 | uint32_t i = 0; | 921 | uint32_t i = 0; |
| 922 | 922 | ||
| 923 | list_for_each_entry(dev, &topology_device_list, list) { | 923 | list_for_each_entry(dev, &topology_device_list, list) { |
| 924 | ret = kfd_build_sysfs_node_entry(dev, 0); | 924 | ret = kfd_build_sysfs_node_entry(dev, i); |
| 925 | if (ret < 0) | 925 | if (ret < 0) |
| 926 | return ret; | 926 | return ret; |
| 927 | i++; | 927 | i++; |
diff --git a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h index 47b551970a14..96a512208fad 100644 --- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h +++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h | |||
| @@ -183,7 +183,7 @@ struct kfd2kgd_calls { | |||
| 183 | int (*hqd_load)(struct kgd_dev *kgd, void *mqd, uint32_t pipe_id, | 183 | int (*hqd_load)(struct kgd_dev *kgd, void *mqd, uint32_t pipe_id, |
| 184 | uint32_t queue_id, uint32_t __user *wptr); | 184 | uint32_t queue_id, uint32_t __user *wptr); |
| 185 | 185 | ||
| 186 | bool (*hqd_is_occupies)(struct kgd_dev *kgd, uint64_t queue_address, | 186 | bool (*hqd_is_occupied)(struct kgd_dev *kgd, uint64_t queue_address, |
| 187 | uint32_t pipe_id, uint32_t queue_id); | 187 | uint32_t pipe_id, uint32_t queue_id); |
| 188 | 188 | ||
| 189 | int (*hqd_destroy)(struct kgd_dev *kgd, uint32_t reset_type, | 189 | int (*hqd_destroy)(struct kgd_dev *kgd, uint32_t reset_type, |
diff --git a/drivers/gpu/drm/cirrus/cirrus_drv.c b/drivers/gpu/drm/cirrus/cirrus_drv.c index c2a1cba1e984..b9140032962d 100644 --- a/drivers/gpu/drm/cirrus/cirrus_drv.c +++ b/drivers/gpu/drm/cirrus/cirrus_drv.c | |||
| @@ -16,9 +16,12 @@ | |||
| 16 | #include "cirrus_drv.h" | 16 | #include "cirrus_drv.h" |
| 17 | 17 | ||
| 18 | int cirrus_modeset = -1; | 18 | int cirrus_modeset = -1; |
| 19 | int cirrus_bpp = 24; | ||
| 19 | 20 | ||
| 20 | MODULE_PARM_DESC(modeset, "Disable/Enable modesetting"); | 21 | MODULE_PARM_DESC(modeset, "Disable/Enable modesetting"); |
| 21 | module_param_named(modeset, cirrus_modeset, int, 0400); | 22 | module_param_named(modeset, cirrus_modeset, int, 0400); |
| 23 | MODULE_PARM_DESC(bpp, "Max bits-per-pixel (default:24)"); | ||
| 24 | module_param_named(bpp, cirrus_bpp, int, 0400); | ||
| 22 | 25 | ||
| 23 | /* | 26 | /* |
| 24 | * This is the generic driver code. This binds the driver to the drm core, | 27 | * This is the generic driver code. This binds the driver to the drm core, |
diff --git a/drivers/gpu/drm/cirrus/cirrus_drv.h b/drivers/gpu/drm/cirrus/cirrus_drv.h index 693a4565c4ff..705061537a27 100644 --- a/drivers/gpu/drm/cirrus/cirrus_drv.h +++ b/drivers/gpu/drm/cirrus/cirrus_drv.h | |||
| @@ -262,4 +262,7 @@ static inline void cirrus_bo_unreserve(struct cirrus_bo *bo) | |||
| 262 | 262 | ||
| 263 | int cirrus_bo_push_sysram(struct cirrus_bo *bo); | 263 | int cirrus_bo_push_sysram(struct cirrus_bo *bo); |
| 264 | int cirrus_bo_pin(struct cirrus_bo *bo, u32 pl_flag, u64 *gpu_addr); | 264 | int cirrus_bo_pin(struct cirrus_bo *bo, u32 pl_flag, u64 *gpu_addr); |
| 265 | |||
| 266 | extern int cirrus_bpp; | ||
| 267 | |||
| 265 | #endif /* __CIRRUS_DRV_H__ */ | 268 | #endif /* __CIRRUS_DRV_H__ */ |
diff --git a/drivers/gpu/drm/cirrus/cirrus_main.c b/drivers/gpu/drm/cirrus/cirrus_main.c index 4c2d68e9102d..e4b976658087 100644 --- a/drivers/gpu/drm/cirrus/cirrus_main.c +++ b/drivers/gpu/drm/cirrus/cirrus_main.c | |||
| @@ -320,6 +320,8 @@ bool cirrus_check_framebuffer(struct cirrus_device *cdev, int width, int height, | |||
| 320 | const int max_pitch = 0x1FF << 3; /* (4096 - 1) & ~111b bytes */ | 320 | const int max_pitch = 0x1FF << 3; /* (4096 - 1) & ~111b bytes */ |
| 321 | const int max_size = cdev->mc.vram_size; | 321 | const int max_size = cdev->mc.vram_size; |
| 322 | 322 | ||
| 323 | if (bpp > cirrus_bpp) | ||
| 324 | return false; | ||
| 323 | if (bpp > 32) | 325 | if (bpp > 32) |
| 324 | return false; | 326 | return false; |
| 325 | 327 | ||
diff --git a/drivers/gpu/drm/cirrus/cirrus_mode.c b/drivers/gpu/drm/cirrus/cirrus_mode.c index 99d4a74ffeaf..61385f2298bf 100644 --- a/drivers/gpu/drm/cirrus/cirrus_mode.c +++ b/drivers/gpu/drm/cirrus/cirrus_mode.c | |||
| @@ -501,8 +501,13 @@ static int cirrus_vga_get_modes(struct drm_connector *connector) | |||
| 501 | int count; | 501 | int count; |
| 502 | 502 | ||
| 503 | /* Just add a static list of modes */ | 503 | /* Just add a static list of modes */ |
| 504 | count = drm_add_modes_noedid(connector, 1280, 1024); | 504 | if (cirrus_bpp <= 24) { |
| 505 | drm_set_preferred_mode(connector, 1024, 768); | 505 | count = drm_add_modes_noedid(connector, 1280, 1024); |
| 506 | drm_set_preferred_mode(connector, 1024, 768); | ||
| 507 | } else { | ||
| 508 | count = drm_add_modes_noedid(connector, 800, 600); | ||
| 509 | drm_set_preferred_mode(connector, 800, 600); | ||
| 510 | } | ||
| 506 | return count; | 511 | return count; |
| 507 | } | 512 | } |
| 508 | 513 | ||
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index 52ce26d6b4fb..dc386ebe5193 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c | |||
| @@ -145,6 +145,31 @@ int drm_fb_helper_add_one_connector(struct drm_fb_helper *fb_helper, struct drm_ | |||
| 145 | } | 145 | } |
| 146 | EXPORT_SYMBOL(drm_fb_helper_add_one_connector); | 146 | EXPORT_SYMBOL(drm_fb_helper_add_one_connector); |
| 147 | 147 | ||
| 148 | static void remove_from_modeset(struct drm_mode_set *set, | ||
| 149 | struct drm_connector *connector) | ||
| 150 | { | ||
| 151 | int i, j; | ||
| 152 | |||
| 153 | for (i = 0; i < set->num_connectors; i++) { | ||
| 154 | if (set->connectors[i] == connector) | ||
| 155 | break; | ||
| 156 | } | ||
| 157 | |||
| 158 | if (i == set->num_connectors) | ||
| 159 | return; | ||
| 160 | |||
| 161 | for (j = i + 1; j < set->num_connectors; j++) { | ||
| 162 | set->connectors[j - 1] = set->connectors[j]; | ||
| 163 | } | ||
| 164 | set->num_connectors--; | ||
| 165 | |||
| 166 | /* because i915 is pissy about this.. | ||
| 167 | * TODO maybe need to makes sure we set it back to !=NULL somewhere? | ||
| 168 | */ | ||
| 169 | if (set->num_connectors == 0) | ||
| 170 | set->fb = NULL; | ||
| 171 | } | ||
| 172 | |||
| 148 | int drm_fb_helper_remove_one_connector(struct drm_fb_helper *fb_helper, | 173 | int drm_fb_helper_remove_one_connector(struct drm_fb_helper *fb_helper, |
| 149 | struct drm_connector *connector) | 174 | struct drm_connector *connector) |
| 150 | { | 175 | { |
| @@ -167,6 +192,11 @@ int drm_fb_helper_remove_one_connector(struct drm_fb_helper *fb_helper, | |||
| 167 | } | 192 | } |
| 168 | fb_helper->connector_count--; | 193 | fb_helper->connector_count--; |
| 169 | kfree(fb_helper_connector); | 194 | kfree(fb_helper_connector); |
| 195 | |||
| 196 | /* also cleanup dangling references to the connector: */ | ||
| 197 | for (i = 0; i < fb_helper->crtc_count; i++) | ||
| 198 | remove_from_modeset(&fb_helper->crtc_info[i].mode_set, connector); | ||
| 199 | |||
| 170 | return 0; | 200 | return 0; |
| 171 | } | 201 | } |
| 172 | EXPORT_SYMBOL(drm_fb_helper_remove_one_connector); | 202 | EXPORT_SYMBOL(drm_fb_helper_remove_one_connector); |
| @@ -741,7 +771,9 @@ int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info) | |||
| 741 | int i, j, rc = 0; | 771 | int i, j, rc = 0; |
| 742 | int start; | 772 | int start; |
| 743 | 773 | ||
| 744 | drm_modeset_lock_all(dev); | 774 | if (__drm_modeset_lock_all(dev, !!oops_in_progress)) { |
| 775 | return -EBUSY; | ||
| 776 | } | ||
| 745 | if (!drm_fb_helper_is_bound(fb_helper)) { | 777 | if (!drm_fb_helper_is_bound(fb_helper)) { |
| 746 | drm_modeset_unlock_all(dev); | 778 | drm_modeset_unlock_all(dev); |
| 747 | return -EBUSY; | 779 | return -EBUSY; |
| @@ -915,7 +947,9 @@ int drm_fb_helper_pan_display(struct fb_var_screeninfo *var, | |||
| 915 | int ret = 0; | 947 | int ret = 0; |
| 916 | int i; | 948 | int i; |
| 917 | 949 | ||
| 918 | drm_modeset_lock_all(dev); | 950 | if (__drm_modeset_lock_all(dev, !!oops_in_progress)) { |
| 951 | return -EBUSY; | ||
| 952 | } | ||
| 919 | if (!drm_fb_helper_is_bound(fb_helper)) { | 953 | if (!drm_fb_helper_is_bound(fb_helper)) { |
| 920 | drm_modeset_unlock_all(dev); | 954 | drm_modeset_unlock_all(dev); |
| 921 | return -EBUSY; | 955 | 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/i2c/tda998x_drv.c b/drivers/gpu/drm/i2c/tda998x_drv.c index d4762799351d..a9041d1a8ff0 100644 --- a/drivers/gpu/drm/i2c/tda998x_drv.c +++ b/drivers/gpu/drm/i2c/tda998x_drv.c | |||
| @@ -32,6 +32,8 @@ | |||
| 32 | struct tda998x_priv { | 32 | struct tda998x_priv { |
| 33 | struct i2c_client *cec; | 33 | struct i2c_client *cec; |
| 34 | struct i2c_client *hdmi; | 34 | struct i2c_client *hdmi; |
| 35 | struct mutex mutex; | ||
| 36 | struct delayed_work dwork; | ||
| 35 | uint16_t rev; | 37 | uint16_t rev; |
| 36 | uint8_t current_page; | 38 | uint8_t current_page; |
| 37 | int dpms; | 39 | int dpms; |
| @@ -402,9 +404,10 @@ reg_read_range(struct tda998x_priv *priv, uint16_t reg, char *buf, int cnt) | |||
| 402 | uint8_t addr = REG2ADDR(reg); | 404 | uint8_t addr = REG2ADDR(reg); |
| 403 | int ret; | 405 | int ret; |
| 404 | 406 | ||
| 407 | mutex_lock(&priv->mutex); | ||
| 405 | ret = set_page(priv, reg); | 408 | ret = set_page(priv, reg); |
| 406 | if (ret < 0) | 409 | if (ret < 0) |
| 407 | return ret; | 410 | goto out; |
| 408 | 411 | ||
| 409 | ret = i2c_master_send(client, &addr, sizeof(addr)); | 412 | ret = i2c_master_send(client, &addr, sizeof(addr)); |
| 410 | if (ret < 0) | 413 | if (ret < 0) |
| @@ -414,10 +417,12 @@ reg_read_range(struct tda998x_priv *priv, uint16_t reg, char *buf, int cnt) | |||
| 414 | if (ret < 0) | 417 | if (ret < 0) |
| 415 | goto fail; | 418 | goto fail; |
| 416 | 419 | ||
| 417 | return ret; | 420 | goto out; |
| 418 | 421 | ||
| 419 | fail: | 422 | fail: |
| 420 | dev_err(&client->dev, "Error %d reading from 0x%x\n", ret, reg); | 423 | dev_err(&client->dev, "Error %d reading from 0x%x\n", ret, reg); |
| 424 | out: | ||
| 425 | mutex_unlock(&priv->mutex); | ||
| 421 | return ret; | 426 | return ret; |
| 422 | } | 427 | } |
| 423 | 428 | ||
| @@ -431,13 +436,16 @@ reg_write_range(struct tda998x_priv *priv, uint16_t reg, uint8_t *p, int cnt) | |||
| 431 | buf[0] = REG2ADDR(reg); | 436 | buf[0] = REG2ADDR(reg); |
| 432 | memcpy(&buf[1], p, cnt); | 437 | memcpy(&buf[1], p, cnt); |
| 433 | 438 | ||
| 439 | mutex_lock(&priv->mutex); | ||
| 434 | ret = set_page(priv, reg); | 440 | ret = set_page(priv, reg); |
| 435 | if (ret < 0) | 441 | if (ret < 0) |
| 436 | return; | 442 | goto out; |
| 437 | 443 | ||
| 438 | ret = i2c_master_send(client, buf, cnt + 1); | 444 | ret = i2c_master_send(client, buf, cnt + 1); |
| 439 | if (ret < 0) | 445 | if (ret < 0) |
| 440 | dev_err(&client->dev, "Error %d writing to 0x%x\n", ret, reg); | 446 | dev_err(&client->dev, "Error %d writing to 0x%x\n", ret, reg); |
| 447 | out: | ||
| 448 | mutex_unlock(&priv->mutex); | ||
| 441 | } | 449 | } |
| 442 | 450 | ||
| 443 | static int | 451 | static int |
| @@ -459,13 +467,16 @@ reg_write(struct tda998x_priv *priv, uint16_t reg, uint8_t val) | |||
| 459 | uint8_t buf[] = {REG2ADDR(reg), val}; | 467 | uint8_t buf[] = {REG2ADDR(reg), val}; |
| 460 | int ret; | 468 | int ret; |
| 461 | 469 | ||
| 470 | mutex_lock(&priv->mutex); | ||
| 462 | ret = set_page(priv, reg); | 471 | ret = set_page(priv, reg); |
| 463 | if (ret < 0) | 472 | if (ret < 0) |
| 464 | return; | 473 | goto out; |
| 465 | 474 | ||
| 466 | ret = i2c_master_send(client, buf, sizeof(buf)); | 475 | ret = i2c_master_send(client, buf, sizeof(buf)); |
| 467 | if (ret < 0) | 476 | if (ret < 0) |
| 468 | dev_err(&client->dev, "Error %d writing to 0x%x\n", ret, reg); | 477 | dev_err(&client->dev, "Error %d writing to 0x%x\n", ret, reg); |
| 478 | out: | ||
| 479 | mutex_unlock(&priv->mutex); | ||
| 469 | } | 480 | } |
| 470 | 481 | ||
| 471 | static void | 482 | static void |
| @@ -475,13 +486,16 @@ reg_write16(struct tda998x_priv *priv, uint16_t reg, uint16_t val) | |||
| 475 | uint8_t buf[] = {REG2ADDR(reg), val >> 8, val}; | 486 | uint8_t buf[] = {REG2ADDR(reg), val >> 8, val}; |
| 476 | int ret; | 487 | int ret; |
| 477 | 488 | ||
| 489 | mutex_lock(&priv->mutex); | ||
| 478 | ret = set_page(priv, reg); | 490 | ret = set_page(priv, reg); |
| 479 | if (ret < 0) | 491 | if (ret < 0) |
| 480 | return; | 492 | goto out; |
| 481 | 493 | ||
| 482 | ret = i2c_master_send(client, buf, sizeof(buf)); | 494 | ret = i2c_master_send(client, buf, sizeof(buf)); |
| 483 | if (ret < 0) | 495 | if (ret < 0) |
| 484 | dev_err(&client->dev, "Error %d writing to 0x%x\n", ret, reg); | 496 | dev_err(&client->dev, "Error %d writing to 0x%x\n", ret, reg); |
| 497 | out: | ||
| 498 | mutex_unlock(&priv->mutex); | ||
| 485 | } | 499 | } |
| 486 | 500 | ||
| 487 | static void | 501 | static void |
| @@ -536,6 +550,17 @@ tda998x_reset(struct tda998x_priv *priv) | |||
| 536 | reg_write(priv, REG_MUX_VP_VIP_OUT, 0x24); | 550 | reg_write(priv, REG_MUX_VP_VIP_OUT, 0x24); |
| 537 | } | 551 | } |
| 538 | 552 | ||
| 553 | /* handle HDMI connect/disconnect */ | ||
| 554 | static void tda998x_hpd(struct work_struct *work) | ||
| 555 | { | ||
| 556 | struct delayed_work *dwork = to_delayed_work(work); | ||
| 557 | struct tda998x_priv *priv = | ||
| 558 | container_of(dwork, struct tda998x_priv, dwork); | ||
| 559 | |||
| 560 | if (priv->encoder && priv->encoder->dev) | ||
| 561 | drm_kms_helper_hotplug_event(priv->encoder->dev); | ||
| 562 | } | ||
| 563 | |||
| 539 | /* | 564 | /* |
| 540 | * only 2 interrupts may occur: screen plug/unplug and EDID read | 565 | * only 2 interrupts may occur: screen plug/unplug and EDID read |
| 541 | */ | 566 | */ |
| @@ -559,8 +584,7 @@ static irqreturn_t tda998x_irq_thread(int irq, void *data) | |||
| 559 | priv->wq_edid_wait = 0; | 584 | priv->wq_edid_wait = 0; |
| 560 | wake_up(&priv->wq_edid); | 585 | wake_up(&priv->wq_edid); |
| 561 | } else if (cec != 0) { /* HPD change */ | 586 | } else if (cec != 0) { /* HPD change */ |
| 562 | if (priv->encoder && priv->encoder->dev) | 587 | schedule_delayed_work(&priv->dwork, HZ/10); |
| 563 | drm_helper_hpd_irq_event(priv->encoder->dev); | ||
| 564 | } | 588 | } |
| 565 | return IRQ_HANDLED; | 589 | return IRQ_HANDLED; |
| 566 | } | 590 | } |
| @@ -1170,8 +1194,10 @@ static void tda998x_destroy(struct tda998x_priv *priv) | |||
| 1170 | /* disable all IRQs and free the IRQ handler */ | 1194 | /* disable all IRQs and free the IRQ handler */ |
| 1171 | cec_write(priv, REG_CEC_RXSHPDINTENA, 0); | 1195 | cec_write(priv, REG_CEC_RXSHPDINTENA, 0); |
| 1172 | reg_clear(priv, REG_INT_FLAGS_2, INT_FLAGS_2_EDID_BLK_RD); | 1196 | reg_clear(priv, REG_INT_FLAGS_2, INT_FLAGS_2_EDID_BLK_RD); |
| 1173 | if (priv->hdmi->irq) | 1197 | if (priv->hdmi->irq) { |
| 1174 | free_irq(priv->hdmi->irq, priv); | 1198 | free_irq(priv->hdmi->irq, priv); |
| 1199 | cancel_delayed_work_sync(&priv->dwork); | ||
| 1200 | } | ||
| 1175 | 1201 | ||
| 1176 | i2c_unregister_device(priv->cec); | 1202 | i2c_unregister_device(priv->cec); |
| 1177 | } | 1203 | } |
| @@ -1255,6 +1281,7 @@ static int tda998x_create(struct i2c_client *client, struct tda998x_priv *priv) | |||
| 1255 | struct device_node *np = client->dev.of_node; | 1281 | struct device_node *np = client->dev.of_node; |
| 1256 | u32 video; | 1282 | u32 video; |
| 1257 | int rev_lo, rev_hi, ret; | 1283 | int rev_lo, rev_hi, ret; |
| 1284 | unsigned short cec_addr; | ||
| 1258 | 1285 | ||
| 1259 | priv->vip_cntrl_0 = VIP_CNTRL_0_SWAP_A(2) | VIP_CNTRL_0_SWAP_B(3); | 1286 | priv->vip_cntrl_0 = VIP_CNTRL_0_SWAP_A(2) | VIP_CNTRL_0_SWAP_B(3); |
| 1260 | priv->vip_cntrl_1 = VIP_CNTRL_1_SWAP_C(0) | VIP_CNTRL_1_SWAP_D(1); | 1287 | priv->vip_cntrl_1 = VIP_CNTRL_1_SWAP_C(0) | VIP_CNTRL_1_SWAP_D(1); |
| @@ -1262,12 +1289,16 @@ static int tda998x_create(struct i2c_client *client, struct tda998x_priv *priv) | |||
| 1262 | 1289 | ||
| 1263 | priv->current_page = 0xff; | 1290 | priv->current_page = 0xff; |
| 1264 | priv->hdmi = client; | 1291 | priv->hdmi = client; |
| 1265 | priv->cec = i2c_new_dummy(client->adapter, 0x34); | 1292 | /* CEC I2C address bound to TDA998x I2C addr by configuration pins */ |
| 1293 | cec_addr = 0x34 + (client->addr & 0x03); | ||
| 1294 | priv->cec = i2c_new_dummy(client->adapter, cec_addr); | ||
| 1266 | if (!priv->cec) | 1295 | if (!priv->cec) |
| 1267 | return -ENODEV; | 1296 | return -ENODEV; |
| 1268 | 1297 | ||
| 1269 | priv->dpms = DRM_MODE_DPMS_OFF; | 1298 | priv->dpms = DRM_MODE_DPMS_OFF; |
| 1270 | 1299 | ||
| 1300 | mutex_init(&priv->mutex); /* protect the page access */ | ||
| 1301 | |||
| 1271 | /* wake up the device: */ | 1302 | /* wake up the device: */ |
| 1272 | cec_write(priv, REG_CEC_ENAMODS, | 1303 | cec_write(priv, REG_CEC_ENAMODS, |
| 1273 | CEC_ENAMODS_EN_RXSENS | CEC_ENAMODS_EN_HDMI); | 1304 | CEC_ENAMODS_EN_RXSENS | CEC_ENAMODS_EN_HDMI); |
| @@ -1323,8 +1354,9 @@ static int tda998x_create(struct i2c_client *client, struct tda998x_priv *priv) | |||
| 1323 | if (client->irq) { | 1354 | if (client->irq) { |
| 1324 | int irqf_trigger; | 1355 | int irqf_trigger; |
| 1325 | 1356 | ||
| 1326 | /* init read EDID waitqueue */ | 1357 | /* init read EDID waitqueue and HDP work */ |
| 1327 | init_waitqueue_head(&priv->wq_edid); | 1358 | init_waitqueue_head(&priv->wq_edid); |
| 1359 | INIT_DELAYED_WORK(&priv->dwork, tda998x_hpd); | ||
| 1328 | 1360 | ||
| 1329 | /* clear pending interrupts */ | 1361 | /* clear pending interrupts */ |
| 1330 | reg_read(priv, REG_INT_FLAGS_0); | 1362 | reg_read(priv, REG_INT_FLAGS_0); |
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 574057cd1d09..7643300828c3 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c | |||
| @@ -462,19 +462,13 @@ void intel_detect_pch(struct drm_device *dev) | |||
| 462 | } else if (id == INTEL_PCH_LPT_DEVICE_ID_TYPE) { | 462 | } else if (id == INTEL_PCH_LPT_DEVICE_ID_TYPE) { |
| 463 | dev_priv->pch_type = PCH_LPT; | 463 | dev_priv->pch_type = PCH_LPT; |
| 464 | DRM_DEBUG_KMS("Found LynxPoint PCH\n"); | 464 | DRM_DEBUG_KMS("Found LynxPoint PCH\n"); |
| 465 | WARN_ON(!IS_HASWELL(dev)); | 465 | WARN_ON(!IS_HASWELL(dev) && !IS_BROADWELL(dev)); |
| 466 | WARN_ON(IS_HSW_ULT(dev)); | 466 | WARN_ON(IS_HSW_ULT(dev) || IS_BDW_ULT(dev)); |
| 467 | } else if (IS_BROADWELL(dev)) { | ||
| 468 | dev_priv->pch_type = PCH_LPT; | ||
| 469 | dev_priv->pch_id = | ||
| 470 | INTEL_PCH_LPT_LP_DEVICE_ID_TYPE; | ||
| 471 | DRM_DEBUG_KMS("This is Broadwell, assuming " | ||
| 472 | "LynxPoint LP PCH\n"); | ||
| 473 | } else if (id == INTEL_PCH_LPT_LP_DEVICE_ID_TYPE) { | 467 | } else if (id == INTEL_PCH_LPT_LP_DEVICE_ID_TYPE) { |
| 474 | dev_priv->pch_type = PCH_LPT; | 468 | dev_priv->pch_type = PCH_LPT; |
| 475 | DRM_DEBUG_KMS("Found LynxPoint LP PCH\n"); | 469 | DRM_DEBUG_KMS("Found LynxPoint LP PCH\n"); |
| 476 | WARN_ON(!IS_HASWELL(dev)); | 470 | WARN_ON(!IS_HASWELL(dev) && !IS_BROADWELL(dev)); |
| 477 | WARN_ON(!IS_HSW_ULT(dev)); | 471 | WARN_ON(!IS_HSW_ULT(dev) && !IS_BDW_ULT(dev)); |
| 478 | } else if (id == INTEL_PCH_SPT_DEVICE_ID_TYPE) { | 472 | } else if (id == INTEL_PCH_SPT_DEVICE_ID_TYPE) { |
| 479 | dev_priv->pch_type = PCH_SPT; | 473 | dev_priv->pch_type = PCH_SPT; |
| 480 | DRM_DEBUG_KMS("Found SunrisePoint PCH\n"); | 474 | DRM_DEBUG_KMS("Found SunrisePoint PCH\n"); |
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 70d0f0f06f1a..9d7a7155bf02 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
| @@ -1756,8 +1756,6 @@ struct drm_i915_private { | |||
| 1756 | */ | 1756 | */ |
| 1757 | struct workqueue_struct *dp_wq; | 1757 | struct workqueue_struct *dp_wq; |
| 1758 | 1758 | ||
| 1759 | uint32_t bios_vgacntr; | ||
| 1760 | |||
| 1761 | /* Abstract the submission mechanism (legacy ringbuffer or execlists) away */ | 1759 | /* Abstract the submission mechanism (legacy ringbuffer or execlists) away */ |
| 1762 | struct { | 1760 | struct { |
| 1763 | int (*do_execbuf)(struct drm_device *dev, struct drm_file *file, | 1761 | int (*do_execbuf)(struct drm_device *dev, struct drm_file *file, |
| @@ -2161,8 +2159,7 @@ struct drm_i915_cmd_table { | |||
| 2161 | #define IS_HSW_EARLY_SDV(dev) (IS_HASWELL(dev) && \ | 2159 | #define IS_HSW_EARLY_SDV(dev) (IS_HASWELL(dev) && \ |
| 2162 | (INTEL_DEVID(dev) & 0xFF00) == 0x0C00) | 2160 | (INTEL_DEVID(dev) & 0xFF00) == 0x0C00) |
| 2163 | #define IS_BDW_ULT(dev) (IS_BROADWELL(dev) && \ | 2161 | #define IS_BDW_ULT(dev) (IS_BROADWELL(dev) && \ |
| 2164 | ((INTEL_DEVID(dev) & 0xf) == 0x2 || \ | 2162 | ((INTEL_DEVID(dev) & 0xf) == 0x6 || \ |
| 2165 | (INTEL_DEVID(dev) & 0xf) == 0x6 || \ | ||
| 2166 | (INTEL_DEVID(dev) & 0xf) == 0xe)) | 2163 | (INTEL_DEVID(dev) & 0xf) == 0xe)) |
| 2167 | #define IS_BDW_GT3(dev) (IS_BROADWELL(dev) && \ | 2164 | #define IS_BDW_GT3(dev) (IS_BROADWELL(dev) && \ |
| 2168 | (INTEL_DEVID(dev) & 0x00F0) == 0x0020) | 2165 | (INTEL_DEVID(dev) & 0x00F0) == 0x0020) |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 52adcb680be3..5f614828d365 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -1048,6 +1048,7 @@ int | |||
| 1048 | i915_gem_pwrite_ioctl(struct drm_device *dev, void *data, | 1048 | i915_gem_pwrite_ioctl(struct drm_device *dev, void *data, |
| 1049 | struct drm_file *file) | 1049 | struct drm_file *file) |
| 1050 | { | 1050 | { |
| 1051 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 1051 | struct drm_i915_gem_pwrite *args = data; | 1052 | struct drm_i915_gem_pwrite *args = data; |
| 1052 | struct drm_i915_gem_object *obj; | 1053 | struct drm_i915_gem_object *obj; |
| 1053 | int ret; | 1054 | int ret; |
| @@ -1067,9 +1068,11 @@ i915_gem_pwrite_ioctl(struct drm_device *dev, void *data, | |||
| 1067 | return -EFAULT; | 1068 | return -EFAULT; |
| 1068 | } | 1069 | } |
| 1069 | 1070 | ||
| 1071 | intel_runtime_pm_get(dev_priv); | ||
| 1072 | |||
| 1070 | ret = i915_mutex_lock_interruptible(dev); | 1073 | ret = i915_mutex_lock_interruptible(dev); |
| 1071 | if (ret) | 1074 | if (ret) |
| 1072 | return ret; | 1075 | goto put_rpm; |
| 1073 | 1076 | ||
| 1074 | obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle)); | 1077 | obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle)); |
| 1075 | if (&obj->base == NULL) { | 1078 | if (&obj->base == NULL) { |
| @@ -1121,6 +1124,9 @@ out: | |||
| 1121 | drm_gem_object_unreference(&obj->base); | 1124 | drm_gem_object_unreference(&obj->base); |
| 1122 | unlock: | 1125 | unlock: |
| 1123 | mutex_unlock(&dev->struct_mutex); | 1126 | mutex_unlock(&dev->struct_mutex); |
| 1127 | put_rpm: | ||
| 1128 | intel_runtime_pm_put(dev_priv); | ||
| 1129 | |||
| 1124 | return ret; | 1130 | return ret; |
| 1125 | } | 1131 | } |
| 1126 | 1132 | ||
| @@ -3142,6 +3148,13 @@ static void i965_write_fence_reg(struct drm_device *dev, int reg, | |||
| 3142 | u32 size = i915_gem_obj_ggtt_size(obj); | 3148 | u32 size = i915_gem_obj_ggtt_size(obj); |
| 3143 | uint64_t val; | 3149 | uint64_t val; |
| 3144 | 3150 | ||
| 3151 | /* Adjust fence size to match tiled area */ | ||
| 3152 | if (obj->tiling_mode != I915_TILING_NONE) { | ||
| 3153 | uint32_t row_size = obj->stride * | ||
| 3154 | (obj->tiling_mode == I915_TILING_Y ? 32 : 8); | ||
| 3155 | size = (size / row_size) * row_size; | ||
| 3156 | } | ||
| 3157 | |||
| 3145 | val = (uint64_t)((i915_gem_obj_ggtt_offset(obj) + size - 4096) & | 3158 | val = (uint64_t)((i915_gem_obj_ggtt_offset(obj) + size - 4096) & |
| 3146 | 0xfffff000) << 32; | 3159 | 0xfffff000) << 32; |
| 3147 | val |= i915_gem_obj_ggtt_offset(obj) & 0xfffff000; | 3160 | val |= i915_gem_obj_ggtt_offset(obj) & 0xfffff000; |
| @@ -4878,25 +4891,18 @@ i915_gem_init_hw(struct drm_device *dev) | |||
| 4878 | for (i = 0; i < NUM_L3_SLICES(dev); i++) | 4891 | for (i = 0; i < NUM_L3_SLICES(dev); i++) |
| 4879 | i915_gem_l3_remap(&dev_priv->ring[RCS], i); | 4892 | i915_gem_l3_remap(&dev_priv->ring[RCS], i); |
| 4880 | 4893 | ||
| 4881 | /* | 4894 | ret = i915_ppgtt_init_hw(dev); |
| 4882 | * XXX: Contexts should only be initialized once. Doing a switch to the | ||
| 4883 | * default context switch however is something we'd like to do after | ||
| 4884 | * reset or thaw (the latter may not actually be necessary for HW, but | ||
| 4885 | * goes with our code better). Context switching requires rings (for | ||
| 4886 | * the do_switch), but before enabling PPGTT. So don't move this. | ||
| 4887 | */ | ||
| 4888 | ret = i915_gem_context_enable(dev_priv); | ||
| 4889 | if (ret && ret != -EIO) { | 4895 | if (ret && ret != -EIO) { |
| 4890 | DRM_ERROR("Context enable failed %d\n", ret); | 4896 | DRM_ERROR("PPGTT enable failed %d\n", ret); |
| 4891 | i915_gem_cleanup_ringbuffer(dev); | 4897 | i915_gem_cleanup_ringbuffer(dev); |
| 4892 | |||
| 4893 | return ret; | ||
| 4894 | } | 4898 | } |
| 4895 | 4899 | ||
| 4896 | ret = i915_ppgtt_init_hw(dev); | 4900 | ret = i915_gem_context_enable(dev_priv); |
| 4897 | if (ret && ret != -EIO) { | 4901 | if (ret && ret != -EIO) { |
| 4898 | DRM_ERROR("PPGTT enable failed %d\n", ret); | 4902 | DRM_ERROR("Context enable failed %d\n", ret); |
| 4899 | i915_gem_cleanup_ringbuffer(dev); | 4903 | i915_gem_cleanup_ringbuffer(dev); |
| 4904 | |||
| 4905 | return ret; | ||
| 4900 | } | 4906 | } |
| 4901 | 4907 | ||
| 4902 | return ret; | 4908 | return ret; |
| @@ -5149,7 +5155,7 @@ static bool mutex_is_locked_by(struct mutex *mutex, struct task_struct *task) | |||
| 5149 | if (!mutex_is_locked(mutex)) | 5155 | if (!mutex_is_locked(mutex)) |
| 5150 | return false; | 5156 | return false; |
| 5151 | 5157 | ||
| 5152 | #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_MUTEXES) | 5158 | #if defined(CONFIG_SMP) && !defined(CONFIG_DEBUG_MUTEXES) |
| 5153 | return mutex->owner == task; | 5159 | return mutex->owner == task; |
| 5154 | #else | 5160 | #else |
| 5155 | /* 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 996c2931c499..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)) & |
| @@ -3725,8 +3741,6 @@ static bool i8xx_handle_vblank(struct drm_device *dev, | |||
| 3725 | if ((iir & flip_pending) == 0) | 3741 | if ((iir & flip_pending) == 0) |
| 3726 | goto check_page_flip; | 3742 | goto check_page_flip; |
| 3727 | 3743 | ||
| 3728 | intel_prepare_page_flip(dev, plane); | ||
| 3729 | |||
| 3730 | /* We detect FlipDone by looking for the change in PendingFlip from '1' | 3744 | /* We detect FlipDone by looking for the change in PendingFlip from '1' |
| 3731 | * to '0' on the following vblank, i.e. IIR has the Pendingflip | 3745 | * to '0' on the following vblank, i.e. IIR has the Pendingflip |
| 3732 | * asserted following the MI_DISPLAY_FLIP, but ISR is deasserted, hence | 3746 | * asserted following the MI_DISPLAY_FLIP, but ISR is deasserted, hence |
| @@ -3736,6 +3750,7 @@ static bool i8xx_handle_vblank(struct drm_device *dev, | |||
| 3736 | if (I915_READ16(ISR) & flip_pending) | 3750 | if (I915_READ16(ISR) & flip_pending) |
| 3737 | goto check_page_flip; | 3751 | goto check_page_flip; |
| 3738 | 3752 | ||
| 3753 | intel_prepare_page_flip(dev, plane); | ||
| 3739 | intel_finish_page_flip(dev, pipe); | 3754 | intel_finish_page_flip(dev, pipe); |
| 3740 | return true; | 3755 | return true; |
| 3741 | 3756 | ||
| @@ -3907,8 +3922,6 @@ static bool i915_handle_vblank(struct drm_device *dev, | |||
| 3907 | if ((iir & flip_pending) == 0) | 3922 | if ((iir & flip_pending) == 0) |
| 3908 | goto check_page_flip; | 3923 | goto check_page_flip; |
| 3909 | 3924 | ||
| 3910 | intel_prepare_page_flip(dev, plane); | ||
| 3911 | |||
| 3912 | /* We detect FlipDone by looking for the change in PendingFlip from '1' | 3925 | /* We detect FlipDone by looking for the change in PendingFlip from '1' |
| 3913 | * to '0' on the following vblank, i.e. IIR has the Pendingflip | 3926 | * to '0' on the following vblank, i.e. IIR has the Pendingflip |
| 3914 | * asserted following the MI_DISPLAY_FLIP, but ISR is deasserted, hence | 3927 | * asserted following the MI_DISPLAY_FLIP, but ISR is deasserted, hence |
| @@ -3918,6 +3931,7 @@ static bool i915_handle_vblank(struct drm_device *dev, | |||
| 3918 | if (I915_READ(ISR) & flip_pending) | 3931 | if (I915_READ(ISR) & flip_pending) |
| 3919 | goto check_page_flip; | 3932 | goto check_page_flip; |
| 3920 | 3933 | ||
| 3934 | intel_prepare_page_flip(dev, plane); | ||
| 3921 | intel_finish_page_flip(dev, pipe); | 3935 | intel_finish_page_flip(dev, pipe); |
| 3922 | return true; | 3936 | return true; |
| 3923 | 3937 | ||
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index fb3e3d429191..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; |
| @@ -13057,11 +13057,7 @@ static void i915_disable_vga(struct drm_device *dev) | |||
| 13057 | vga_put(dev->pdev, VGA_RSRC_LEGACY_IO); | 13057 | vga_put(dev->pdev, VGA_RSRC_LEGACY_IO); |
| 13058 | udelay(300); | 13058 | udelay(300); |
| 13059 | 13059 | ||
| 13060 | /* | 13060 | I915_WRITE(vga_reg, VGA_DISP_DISABLE); |
| 13061 | * Fujitsu-Siemens Lifebook S6010 (830) has problems resuming | ||
| 13062 | * from S3 without preserving (some of?) the other bits. | ||
| 13063 | */ | ||
| 13064 | I915_WRITE(vga_reg, dev_priv->bios_vgacntr | VGA_DISP_DISABLE); | ||
| 13065 | POSTING_READ(vga_reg); | 13061 | POSTING_READ(vga_reg); |
| 13066 | } | 13062 | } |
| 13067 | 13063 | ||
| @@ -13146,8 +13142,6 @@ void intel_modeset_init(struct drm_device *dev) | |||
| 13146 | 13142 | ||
| 13147 | intel_shared_dpll_init(dev); | 13143 | intel_shared_dpll_init(dev); |
| 13148 | 13144 | ||
| 13149 | /* save the BIOS value before clobbering it */ | ||
| 13150 | dev_priv->bios_vgacntr = I915_READ(i915_vgacntrl_reg(dev)); | ||
| 13151 | /* Just disable it once at startup */ | 13145 | /* Just disable it once at startup */ |
| 13152 | i915_disable_vga(dev); | 13146 | i915_disable_vga(dev); |
| 13153 | intel_setup_outputs(dev); | 13147 | intel_setup_outputs(dev); |
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_panel.c b/drivers/gpu/drm/i915/intel_panel.c index 4d63839bd9b4..dfb783a8f2c3 100644 --- a/drivers/gpu/drm/i915/intel_panel.c +++ b/drivers/gpu/drm/i915/intel_panel.c | |||
| @@ -962,7 +962,7 @@ void intel_panel_enable_backlight(struct intel_connector *connector) | |||
| 962 | 962 | ||
| 963 | WARN_ON(panel->backlight.max == 0); | 963 | WARN_ON(panel->backlight.max == 0); |
| 964 | 964 | ||
| 965 | if (panel->backlight.level == 0) { | 965 | if (panel->backlight.level <= panel->backlight.min) { |
| 966 | panel->backlight.level = panel->backlight.max; | 966 | panel->backlight.level = panel->backlight.max; |
| 967 | if (panel->backlight.device) | 967 | if (panel->backlight.device) |
| 968 | panel->backlight.device->props.brightness = | 968 | panel->backlight.device->props.brightness = |
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/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c index f5a78d53e297..ac6da7102fbb 100644 --- a/drivers/gpu/drm/i915/intel_runtime_pm.c +++ b/drivers/gpu/drm/i915/intel_runtime_pm.c | |||
| @@ -615,29 +615,6 @@ static void chv_pipe_power_well_disable(struct drm_i915_private *dev_priv, | |||
| 615 | vlv_power_sequencer_reset(dev_priv); | 615 | vlv_power_sequencer_reset(dev_priv); |
| 616 | } | 616 | } |
| 617 | 617 | ||
| 618 | static void check_power_well_state(struct drm_i915_private *dev_priv, | ||
| 619 | struct i915_power_well *power_well) | ||
| 620 | { | ||
| 621 | bool enabled = power_well->ops->is_enabled(dev_priv, power_well); | ||
| 622 | |||
| 623 | if (power_well->always_on || !i915.disable_power_well) { | ||
| 624 | if (!enabled) | ||
| 625 | goto mismatch; | ||
| 626 | |||
| 627 | return; | ||
| 628 | } | ||
| 629 | |||
| 630 | if (enabled != (power_well->count > 0)) | ||
| 631 | goto mismatch; | ||
| 632 | |||
| 633 | return; | ||
| 634 | |||
| 635 | mismatch: | ||
| 636 | WARN(1, "state mismatch for '%s' (always_on %d hw state %d use-count %d disable_power_well %d\n", | ||
| 637 | power_well->name, power_well->always_on, enabled, | ||
| 638 | power_well->count, i915.disable_power_well); | ||
| 639 | } | ||
| 640 | |||
| 641 | /** | 618 | /** |
| 642 | * intel_display_power_get - grab a power domain reference | 619 | * intel_display_power_get - grab a power domain reference |
| 643 | * @dev_priv: i915 device instance | 620 | * @dev_priv: i915 device instance |
| @@ -669,8 +646,6 @@ void intel_display_power_get(struct drm_i915_private *dev_priv, | |||
| 669 | power_well->ops->enable(dev_priv, power_well); | 646 | power_well->ops->enable(dev_priv, power_well); |
| 670 | power_well->hw_enabled = true; | 647 | power_well->hw_enabled = true; |
| 671 | } | 648 | } |
| 672 | |||
| 673 | check_power_well_state(dev_priv, power_well); | ||
| 674 | } | 649 | } |
| 675 | 650 | ||
| 676 | power_domains->domain_use_count[domain]++; | 651 | power_domains->domain_use_count[domain]++; |
| @@ -709,8 +684,6 @@ void intel_display_power_put(struct drm_i915_private *dev_priv, | |||
| 709 | power_well->hw_enabled = false; | 684 | power_well->hw_enabled = false; |
| 710 | power_well->ops->disable(dev_priv, power_well); | 685 | power_well->ops->disable(dev_priv, power_well); |
| 711 | } | 686 | } |
| 712 | |||
| 713 | check_power_well_state(dev_priv, power_well); | ||
| 714 | } | 687 | } |
| 715 | 688 | ||
| 716 | mutex_unlock(&power_domains->lock); | 689 | mutex_unlock(&power_domains->lock); |
diff --git a/drivers/gpu/drm/nouveau/core/core/event.c b/drivers/gpu/drm/nouveau/core/core/event.c index ff2b434b3db4..760947e380c9 100644 --- a/drivers/gpu/drm/nouveau/core/core/event.c +++ b/drivers/gpu/drm/nouveau/core/core/event.c | |||
| @@ -26,7 +26,7 @@ | |||
| 26 | void | 26 | void |
| 27 | nvkm_event_put(struct nvkm_event *event, u32 types, int index) | 27 | nvkm_event_put(struct nvkm_event *event, u32 types, int index) |
| 28 | { | 28 | { |
| 29 | BUG_ON(!spin_is_locked(&event->refs_lock)); | 29 | assert_spin_locked(&event->refs_lock); |
| 30 | while (types) { | 30 | while (types) { |
| 31 | int type = __ffs(types); types &= ~(1 << type); | 31 | int type = __ffs(types); types &= ~(1 << type); |
| 32 | if (--event->refs[index * event->types_nr + type] == 0) { | 32 | if (--event->refs[index * event->types_nr + type] == 0) { |
| @@ -39,7 +39,7 @@ nvkm_event_put(struct nvkm_event *event, u32 types, int index) | |||
| 39 | void | 39 | void |
| 40 | nvkm_event_get(struct nvkm_event *event, u32 types, int index) | 40 | nvkm_event_get(struct nvkm_event *event, u32 types, int index) |
| 41 | { | 41 | { |
| 42 | BUG_ON(!spin_is_locked(&event->refs_lock)); | 42 | assert_spin_locked(&event->refs_lock); |
| 43 | while (types) { | 43 | while (types) { |
| 44 | int type = __ffs(types); types &= ~(1 << type); | 44 | int type = __ffs(types); types &= ~(1 << type); |
| 45 | if (++event->refs[index * event->types_nr + type] == 1) { | 45 | if (++event->refs[index * event->types_nr + type] == 1) { |
diff --git a/drivers/gpu/drm/nouveau/core/core/notify.c b/drivers/gpu/drm/nouveau/core/core/notify.c index d1bcde55e9d7..839a32577680 100644 --- a/drivers/gpu/drm/nouveau/core/core/notify.c +++ b/drivers/gpu/drm/nouveau/core/core/notify.c | |||
| @@ -98,7 +98,7 @@ nvkm_notify_send(struct nvkm_notify *notify, void *data, u32 size) | |||
| 98 | struct nvkm_event *event = notify->event; | 98 | struct nvkm_event *event = notify->event; |
| 99 | unsigned long flags; | 99 | unsigned long flags; |
| 100 | 100 | ||
| 101 | BUG_ON(!spin_is_locked(&event->list_lock)); | 101 | assert_spin_locked(&event->list_lock); |
| 102 | BUG_ON(size != notify->size); | 102 | BUG_ON(size != notify->size); |
| 103 | 103 | ||
| 104 | spin_lock_irqsave(&event->refs_lock, flags); | 104 | spin_lock_irqsave(&event->refs_lock, flags); |
diff --git a/drivers/gpu/drm/nouveau/core/engine/device/nve0.c b/drivers/gpu/drm/nouveau/core/engine/device/nve0.c index 674da1f095b2..732922690653 100644 --- a/drivers/gpu/drm/nouveau/core/engine/device/nve0.c +++ b/drivers/gpu/drm/nouveau/core/engine/device/nve0.c | |||
| @@ -249,6 +249,39 @@ nve0_identify(struct nouveau_device *device) | |||
| 249 | device->oclass[NVDEV_ENGINE_PPP ] = &nvc0_ppp_oclass; | 249 | device->oclass[NVDEV_ENGINE_PPP ] = &nvc0_ppp_oclass; |
| 250 | device->oclass[NVDEV_ENGINE_PERFMON] = &nvf0_perfmon_oclass; | 250 | device->oclass[NVDEV_ENGINE_PERFMON] = &nvf0_perfmon_oclass; |
| 251 | break; | 251 | break; |
| 252 | case 0x106: | ||
| 253 | device->cname = "GK208B"; | ||
| 254 | device->oclass[NVDEV_SUBDEV_VBIOS ] = &nouveau_bios_oclass; | ||
| 255 | device->oclass[NVDEV_SUBDEV_GPIO ] = nve0_gpio_oclass; | ||
| 256 | device->oclass[NVDEV_SUBDEV_I2C ] = nve0_i2c_oclass; | ||
| 257 | device->oclass[NVDEV_SUBDEV_FUSE ] = &gf100_fuse_oclass; | ||
| 258 | device->oclass[NVDEV_SUBDEV_CLOCK ] = &nve0_clock_oclass; | ||
| 259 | device->oclass[NVDEV_SUBDEV_THERM ] = &nvd0_therm_oclass; | ||
| 260 | device->oclass[NVDEV_SUBDEV_MXM ] = &nv50_mxm_oclass; | ||
| 261 | device->oclass[NVDEV_SUBDEV_DEVINIT] = nvc0_devinit_oclass; | ||
| 262 | device->oclass[NVDEV_SUBDEV_MC ] = gk20a_mc_oclass; | ||
| 263 | device->oclass[NVDEV_SUBDEV_BUS ] = nvc0_bus_oclass; | ||
| 264 | device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass; | ||
| 265 | device->oclass[NVDEV_SUBDEV_FB ] = nve0_fb_oclass; | ||
| 266 | device->oclass[NVDEV_SUBDEV_LTC ] = gk104_ltc_oclass; | ||
| 267 | device->oclass[NVDEV_SUBDEV_IBUS ] = &nve0_ibus_oclass; | ||
| 268 | device->oclass[NVDEV_SUBDEV_INSTMEM] = nv50_instmem_oclass; | ||
| 269 | device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass; | ||
| 270 | device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass; | ||
| 271 | device->oclass[NVDEV_SUBDEV_PWR ] = nv108_pwr_oclass; | ||
| 272 | device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass; | ||
| 273 | device->oclass[NVDEV_ENGINE_DMAOBJ ] = nvd0_dmaeng_oclass; | ||
| 274 | device->oclass[NVDEV_ENGINE_FIFO ] = nv108_fifo_oclass; | ||
| 275 | device->oclass[NVDEV_ENGINE_SW ] = nvc0_software_oclass; | ||
| 276 | device->oclass[NVDEV_ENGINE_GR ] = nv108_graph_oclass; | ||
| 277 | device->oclass[NVDEV_ENGINE_DISP ] = nvf0_disp_oclass; | ||
| 278 | device->oclass[NVDEV_ENGINE_COPY0 ] = &nve0_copy0_oclass; | ||
| 279 | device->oclass[NVDEV_ENGINE_COPY1 ] = &nve0_copy1_oclass; | ||
| 280 | device->oclass[NVDEV_ENGINE_COPY2 ] = &nve0_copy2_oclass; | ||
| 281 | device->oclass[NVDEV_ENGINE_BSP ] = &nve0_bsp_oclass; | ||
| 282 | device->oclass[NVDEV_ENGINE_VP ] = &nve0_vp_oclass; | ||
| 283 | device->oclass[NVDEV_ENGINE_PPP ] = &nvc0_ppp_oclass; | ||
| 284 | break; | ||
| 252 | case 0x108: | 285 | case 0x108: |
| 253 | device->cname = "GK208"; | 286 | device->cname = "GK208"; |
| 254 | device->oclass[NVDEV_SUBDEV_VBIOS ] = &nouveau_bios_oclass; | 287 | device->oclass[NVDEV_SUBDEV_VBIOS ] = &nouveau_bios_oclass; |
diff --git a/drivers/gpu/drm/nouveau/core/subdev/bios/shadowramin.c b/drivers/gpu/drm/nouveau/core/subdev/bios/shadowramin.c index 5e58bba0dd5c..a7a890fad1e5 100644 --- a/drivers/gpu/drm/nouveau/core/subdev/bios/shadowramin.c +++ b/drivers/gpu/drm/nouveau/core/subdev/bios/shadowramin.c | |||
| @@ -44,8 +44,10 @@ static void | |||
| 44 | pramin_fini(void *data) | 44 | pramin_fini(void *data) |
| 45 | { | 45 | { |
| 46 | struct priv *priv = data; | 46 | struct priv *priv = data; |
| 47 | nv_wr32(priv->bios, 0x001700, priv->bar0); | 47 | if (priv) { |
| 48 | kfree(priv); | 48 | nv_wr32(priv->bios, 0x001700, priv->bar0); |
| 49 | kfree(priv); | ||
| 50 | } | ||
| 49 | } | 51 | } |
| 50 | 52 | ||
| 51 | static void * | 53 | static void * |
diff --git a/drivers/gpu/drm/nouveau/core/subdev/fb/ramnvaa.c b/drivers/gpu/drm/nouveau/core/subdev/fb/ramnvaa.c index 00f2ca7e44a5..033a8e999497 100644 --- a/drivers/gpu/drm/nouveau/core/subdev/fb/ramnvaa.c +++ b/drivers/gpu/drm/nouveau/core/subdev/fb/ramnvaa.c | |||
| @@ -24,34 +24,71 @@ | |||
| 24 | 24 | ||
| 25 | #include "nv50.h" | 25 | #include "nv50.h" |
| 26 | 26 | ||
| 27 | struct nvaa_ram_priv { | ||
| 28 | struct nouveau_ram base; | ||
| 29 | u64 poller_base; | ||
| 30 | }; | ||
| 31 | |||
| 27 | static int | 32 | static int |
| 28 | nvaa_ram_ctor(struct nouveau_object *parent, struct nouveau_object *engine, | 33 | nvaa_ram_ctor(struct nouveau_object *parent, struct nouveau_object *engine, |
| 29 | struct nouveau_oclass *oclass, void *data, u32 datasize, | 34 | struct nouveau_oclass *oclass, void *data, u32 datasize, |
| 30 | struct nouveau_object **pobject) | 35 | struct nouveau_object **pobject) |
| 31 | { | 36 | { |
| 32 | const u32 rsvd_head = ( 256 * 1024) >> 12; /* vga memory */ | 37 | u32 rsvd_head = ( 256 * 1024); /* vga memory */ |
| 33 | const u32 rsvd_tail = (1024 * 1024) >> 12; /* vbios etc */ | 38 | u32 rsvd_tail = (1024 * 1024); /* vbios etc */ |
| 34 | struct nouveau_fb *pfb = nouveau_fb(parent); | 39 | struct nouveau_fb *pfb = nouveau_fb(parent); |
| 35 | struct nouveau_ram *ram; | 40 | struct nvaa_ram_priv *priv; |
| 36 | int ret; | 41 | int ret; |
| 37 | 42 | ||
| 38 | ret = nouveau_ram_create(parent, engine, oclass, &ram); | 43 | ret = nouveau_ram_create(parent, engine, oclass, &priv); |
| 39 | *pobject = nv_object(ram); | 44 | *pobject = nv_object(priv); |
| 40 | if (ret) | 45 | if (ret) |
| 41 | return ret; | 46 | return ret; |
| 42 | 47 | ||
| 43 | ram->size = nv_rd32(pfb, 0x10020c); | 48 | priv->base.type = NV_MEM_TYPE_STOLEN; |
| 44 | ram->size = (ram->size & 0xffffff00) | ((ram->size & 0x000000ff) << 32); | 49 | priv->base.stolen = (u64)nv_rd32(pfb, 0x100e10) << 12; |
| 50 | priv->base.size = (u64)nv_rd32(pfb, 0x100e14) << 12; | ||
| 45 | 51 | ||
| 46 | ret = nouveau_mm_init(&pfb->vram, rsvd_head, (ram->size >> 12) - | 52 | rsvd_tail += 0x1000; |
| 47 | (rsvd_head + rsvd_tail), 1); | 53 | priv->poller_base = priv->base.size - rsvd_tail; |
| 54 | |||
| 55 | ret = nouveau_mm_init(&pfb->vram, rsvd_head >> 12, | ||
| 56 | (priv->base.size - (rsvd_head + rsvd_tail)) >> 12, | ||
| 57 | 1); | ||
| 48 | if (ret) | 58 | if (ret) |
| 49 | return ret; | 59 | return ret; |
| 50 | 60 | ||
| 51 | ram->type = NV_MEM_TYPE_STOLEN; | 61 | priv->base.get = nv50_ram_get; |
| 52 | ram->stolen = (u64)nv_rd32(pfb, 0x100e10) << 12; | 62 | priv->base.put = nv50_ram_put; |
| 53 | ram->get = nv50_ram_get; | 63 | return 0; |
| 54 | ram->put = nv50_ram_put; | 64 | } |
| 65 | |||
| 66 | static int | ||
| 67 | nvaa_ram_init(struct nouveau_object *object) | ||
| 68 | { | ||
| 69 | struct nouveau_fb *pfb = nouveau_fb(object); | ||
| 70 | struct nvaa_ram_priv *priv = (void *)object; | ||
| 71 | int ret; | ||
| 72 | u64 dniso, hostnb, flush; | ||
| 73 | |||
| 74 | ret = nouveau_ram_init(&priv->base); | ||
| 75 | if (ret) | ||
| 76 | return ret; | ||
| 77 | |||
| 78 | dniso = ((priv->base.size - (priv->poller_base + 0x00)) >> 5) - 1; | ||
| 79 | hostnb = ((priv->base.size - (priv->poller_base + 0x20)) >> 5) - 1; | ||
| 80 | flush = ((priv->base.size - (priv->poller_base + 0x40)) >> 5) - 1; | ||
| 81 | |||
| 82 | /* Enable NISO poller for various clients and set their associated | ||
| 83 | * read address, only for MCP77/78 and MCP79/7A. (fd#25701) | ||
| 84 | */ | ||
| 85 | nv_wr32(pfb, 0x100c18, dniso); | ||
| 86 | nv_mask(pfb, 0x100c14, 0x00000000, 0x00000001); | ||
| 87 | nv_wr32(pfb, 0x100c1c, hostnb); | ||
| 88 | nv_mask(pfb, 0x100c14, 0x00000000, 0x00000002); | ||
| 89 | nv_wr32(pfb, 0x100c24, flush); | ||
| 90 | nv_mask(pfb, 0x100c14, 0x00000000, 0x00010000); | ||
| 91 | |||
| 55 | return 0; | 92 | return 0; |
| 56 | } | 93 | } |
| 57 | 94 | ||
| @@ -60,7 +97,7 @@ nvaa_ram_oclass = { | |||
| 60 | .ofuncs = &(struct nouveau_ofuncs) { | 97 | .ofuncs = &(struct nouveau_ofuncs) { |
| 61 | .ctor = nvaa_ram_ctor, | 98 | .ctor = nvaa_ram_ctor, |
| 62 | .dtor = _nouveau_ram_dtor, | 99 | .dtor = _nouveau_ram_dtor, |
| 63 | .init = _nouveau_ram_init, | 100 | .init = nvaa_ram_init, |
| 64 | .fini = _nouveau_ram_fini, | 101 | .fini = _nouveau_ram_fini, |
| 65 | }, | 102 | }, |
| 66 | }; | 103 | }; |
diff --git a/drivers/gpu/drm/nouveau/core/subdev/mc/nv4c.c b/drivers/gpu/drm/nouveau/core/subdev/mc/nv4c.c index a75c35ccf25c..165401c4045c 100644 --- a/drivers/gpu/drm/nouveau/core/subdev/mc/nv4c.c +++ b/drivers/gpu/drm/nouveau/core/subdev/mc/nv4c.c | |||
| @@ -24,13 +24,6 @@ | |||
| 24 | 24 | ||
| 25 | #include "nv04.h" | 25 | #include "nv04.h" |
| 26 | 26 | ||
| 27 | static void | ||
| 28 | nv4c_mc_msi_rearm(struct nouveau_mc *pmc) | ||
| 29 | { | ||
| 30 | struct nv04_mc_priv *priv = (void *)pmc; | ||
| 31 | nv_wr08(priv, 0x088050, 0xff); | ||
| 32 | } | ||
| 33 | |||
| 34 | struct nouveau_oclass * | 27 | struct nouveau_oclass * |
| 35 | nv4c_mc_oclass = &(struct nouveau_mc_oclass) { | 28 | nv4c_mc_oclass = &(struct nouveau_mc_oclass) { |
| 36 | .base.handle = NV_SUBDEV(MC, 0x4c), | 29 | .base.handle = NV_SUBDEV(MC, 0x4c), |
| @@ -41,5 +34,4 @@ nv4c_mc_oclass = &(struct nouveau_mc_oclass) { | |||
| 41 | .fini = _nouveau_mc_fini, | 34 | .fini = _nouveau_mc_fini, |
| 42 | }, | 35 | }, |
| 43 | .intr = nv04_mc_intr, | 36 | .intr = nv04_mc_intr, |
| 44 | .msi_rearm = nv4c_mc_msi_rearm, | ||
| 45 | }.base; | 37 | }.base; |
diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c index 21ec561edc99..bba2960d3dfb 100644 --- a/drivers/gpu/drm/nouveau/nouveau_bo.c +++ b/drivers/gpu/drm/nouveau/nouveau_bo.c | |||
| @@ -1572,8 +1572,10 @@ nouveau_ttm_tt_unpopulate(struct ttm_tt *ttm) | |||
| 1572 | * so use the DMA API for them. | 1572 | * so use the DMA API for them. |
| 1573 | */ | 1573 | */ |
| 1574 | if (!nv_device_is_cpu_coherent(device) && | 1574 | if (!nv_device_is_cpu_coherent(device) && |
| 1575 | ttm->caching_state == tt_uncached) | 1575 | ttm->caching_state == tt_uncached) { |
| 1576 | ttm_dma_unpopulate(ttm_dma, dev->dev); | 1576 | ttm_dma_unpopulate(ttm_dma, dev->dev); |
| 1577 | return; | ||
| 1578 | } | ||
| 1577 | 1579 | ||
| 1578 | #if __OS_HAS_AGP | 1580 | #if __OS_HAS_AGP |
| 1579 | if (drm->agp.stat == ENABLED) { | 1581 | if (drm->agp.stat == ENABLED) { |
diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c index 42c34babc2e5..bf0f9e21d714 100644 --- a/drivers/gpu/drm/nouveau/nouveau_gem.c +++ b/drivers/gpu/drm/nouveau/nouveau_gem.c | |||
| @@ -36,7 +36,14 @@ void | |||
| 36 | nouveau_gem_object_del(struct drm_gem_object *gem) | 36 | nouveau_gem_object_del(struct drm_gem_object *gem) |
| 37 | { | 37 | { |
| 38 | struct nouveau_bo *nvbo = nouveau_gem_object(gem); | 38 | struct nouveau_bo *nvbo = nouveau_gem_object(gem); |
| 39 | struct nouveau_drm *drm = nouveau_bdev(nvbo->bo.bdev); | ||
| 39 | struct ttm_buffer_object *bo = &nvbo->bo; | 40 | struct ttm_buffer_object *bo = &nvbo->bo; |
| 41 | struct device *dev = drm->dev->dev; | ||
| 42 | int ret; | ||
| 43 | |||
| 44 | ret = pm_runtime_get_sync(dev); | ||
| 45 | if (WARN_ON(ret < 0 && ret != -EACCES)) | ||
| 46 | return; | ||
| 40 | 47 | ||
| 41 | if (gem->import_attach) | 48 | if (gem->import_attach) |
| 42 | drm_prime_gem_destroy(gem, nvbo->bo.sg); | 49 | drm_prime_gem_destroy(gem, nvbo->bo.sg); |
| @@ -46,6 +53,9 @@ nouveau_gem_object_del(struct drm_gem_object *gem) | |||
| 46 | /* reset filp so nouveau_bo_del_ttm() can test for it */ | 53 | /* reset filp so nouveau_bo_del_ttm() can test for it */ |
| 47 | gem->filp = NULL; | 54 | gem->filp = NULL; |
| 48 | ttm_bo_unref(&bo); | 55 | ttm_bo_unref(&bo); |
| 56 | |||
| 57 | pm_runtime_mark_last_busy(dev); | ||
| 58 | pm_runtime_put_autosuspend(dev); | ||
| 49 | } | 59 | } |
| 50 | 60 | ||
| 51 | int | 61 | int |
| @@ -53,7 +63,9 @@ nouveau_gem_object_open(struct drm_gem_object *gem, struct drm_file *file_priv) | |||
| 53 | { | 63 | { |
| 54 | struct nouveau_cli *cli = nouveau_cli(file_priv); | 64 | struct nouveau_cli *cli = nouveau_cli(file_priv); |
| 55 | struct nouveau_bo *nvbo = nouveau_gem_object(gem); | 65 | struct nouveau_bo *nvbo = nouveau_gem_object(gem); |
| 66 | struct nouveau_drm *drm = nouveau_bdev(nvbo->bo.bdev); | ||
| 56 | struct nouveau_vma *vma; | 67 | struct nouveau_vma *vma; |
| 68 | struct device *dev = drm->dev->dev; | ||
| 57 | int ret; | 69 | int ret; |
| 58 | 70 | ||
| 59 | if (!cli->vm) | 71 | if (!cli->vm) |
| @@ -71,11 +83,16 @@ nouveau_gem_object_open(struct drm_gem_object *gem, struct drm_file *file_priv) | |||
| 71 | goto out; | 83 | goto out; |
| 72 | } | 84 | } |
| 73 | 85 | ||
| 86 | ret = pm_runtime_get_sync(dev); | ||
| 87 | if (ret < 0 && ret != -EACCES) | ||
| 88 | goto out; | ||
| 89 | |||
| 74 | ret = nouveau_bo_vma_add(nvbo, cli->vm, vma); | 90 | ret = nouveau_bo_vma_add(nvbo, cli->vm, vma); |
| 75 | if (ret) { | 91 | if (ret) |
| 76 | kfree(vma); | 92 | kfree(vma); |
| 77 | goto out; | 93 | |
| 78 | } | 94 | pm_runtime_mark_last_busy(dev); |
| 95 | pm_runtime_put_autosuspend(dev); | ||
| 79 | } else { | 96 | } else { |
| 80 | vma->refcount++; | 97 | vma->refcount++; |
| 81 | } | 98 | } |
| @@ -129,6 +146,8 @@ nouveau_gem_object_close(struct drm_gem_object *gem, struct drm_file *file_priv) | |||
| 129 | { | 146 | { |
| 130 | struct nouveau_cli *cli = nouveau_cli(file_priv); | 147 | struct nouveau_cli *cli = nouveau_cli(file_priv); |
| 131 | struct nouveau_bo *nvbo = nouveau_gem_object(gem); | 148 | struct nouveau_bo *nvbo = nouveau_gem_object(gem); |
| 149 | struct nouveau_drm *drm = nouveau_bdev(nvbo->bo.bdev); | ||
| 150 | struct device *dev = drm->dev->dev; | ||
| 132 | struct nouveau_vma *vma; | 151 | struct nouveau_vma *vma; |
| 133 | int ret; | 152 | int ret; |
| 134 | 153 | ||
| @@ -141,8 +160,14 @@ nouveau_gem_object_close(struct drm_gem_object *gem, struct drm_file *file_priv) | |||
| 141 | 160 | ||
| 142 | vma = nouveau_bo_vma_find(nvbo, cli->vm); | 161 | vma = nouveau_bo_vma_find(nvbo, cli->vm); |
| 143 | if (vma) { | 162 | if (vma) { |
| 144 | if (--vma->refcount == 0) | 163 | if (--vma->refcount == 0) { |
| 145 | nouveau_gem_object_unmap(nvbo, vma); | 164 | ret = pm_runtime_get_sync(dev); |
| 165 | if (!WARN_ON(ret < 0 && ret != -EACCES)) { | ||
| 166 | nouveau_gem_object_unmap(nvbo, vma); | ||
| 167 | pm_runtime_mark_last_busy(dev); | ||
| 168 | pm_runtime_put_autosuspend(dev); | ||
| 169 | } | ||
| 170 | } | ||
| 146 | } | 171 | } |
| 147 | ttm_bo_unreserve(&nvbo->bo); | 172 | ttm_bo_unreserve(&nvbo->bo); |
| 148 | } | 173 | } |
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c index d59ec491dbb9..ed644a4f6f57 100644 --- a/drivers/gpu/drm/radeon/atombios_crtc.c +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | |||
| @@ -1851,10 +1851,9 @@ static int radeon_atom_pick_pll(struct drm_crtc *crtc) | |||
| 1851 | return pll; | 1851 | return pll; |
| 1852 | } | 1852 | } |
| 1853 | /* otherwise, pick one of the plls */ | 1853 | /* otherwise, pick one of the plls */ |
| 1854 | if ((rdev->family == CHIP_KAVERI) || | 1854 | if ((rdev->family == CHIP_KABINI) || |
| 1855 | (rdev->family == CHIP_KABINI) || | ||
| 1856 | (rdev->family == CHIP_MULLINS)) { | 1855 | (rdev->family == CHIP_MULLINS)) { |
| 1857 | /* KB/KV/ML has PPLL1 and PPLL2 */ | 1856 | /* KB/ML has PPLL1 and PPLL2 */ |
| 1858 | pll_in_use = radeon_get_pll_use_mask(crtc); | 1857 | pll_in_use = radeon_get_pll_use_mask(crtc); |
| 1859 | if (!(pll_in_use & (1 << ATOM_PPLL2))) | 1858 | if (!(pll_in_use & (1 << ATOM_PPLL2))) |
| 1860 | return ATOM_PPLL2; | 1859 | return ATOM_PPLL2; |
| @@ -1863,7 +1862,7 @@ static int radeon_atom_pick_pll(struct drm_crtc *crtc) | |||
| 1863 | DRM_ERROR("unable to allocate a PPLL\n"); | 1862 | DRM_ERROR("unable to allocate a PPLL\n"); |
| 1864 | return ATOM_PPLL_INVALID; | 1863 | return ATOM_PPLL_INVALID; |
| 1865 | } else { | 1864 | } else { |
| 1866 | /* CI has PPLL0, PPLL1, and PPLL2 */ | 1865 | /* CI/KV has PPLL0, PPLL1, and PPLL2 */ |
| 1867 | pll_in_use = radeon_get_pll_use_mask(crtc); | 1866 | pll_in_use = radeon_get_pll_use_mask(crtc); |
| 1868 | if (!(pll_in_use & (1 << ATOM_PPLL2))) | 1867 | if (!(pll_in_use & (1 << ATOM_PPLL2))) |
| 1869 | return ATOM_PPLL2; | 1868 | return ATOM_PPLL2; |
| @@ -2155,6 +2154,7 @@ static void atombios_crtc_disable(struct drm_crtc *crtc) | |||
| 2155 | case ATOM_PPLL0: | 2154 | case ATOM_PPLL0: |
| 2156 | /* disable the ppll */ | 2155 | /* disable the ppll */ |
| 2157 | if ((rdev->family == CHIP_ARUBA) || | 2156 | if ((rdev->family == CHIP_ARUBA) || |
| 2157 | (rdev->family == CHIP_KAVERI) || | ||
| 2158 | (rdev->family == CHIP_BONAIRE) || | 2158 | (rdev->family == CHIP_BONAIRE) || |
| 2159 | (rdev->family == CHIP_HAWAII)) | 2159 | (rdev->family == CHIP_HAWAII)) |
| 2160 | atombios_crtc_program_pll(crtc, radeon_crtc->crtc_id, radeon_crtc->pll_id, | 2160 | atombios_crtc_program_pll(crtc, radeon_crtc->crtc_id, radeon_crtc->pll_id, |
diff --git a/drivers/gpu/drm/radeon/atombios_dp.c b/drivers/gpu/drm/radeon/atombios_dp.c index 11ba9d21b89b..db42a670f995 100644 --- a/drivers/gpu/drm/radeon/atombios_dp.c +++ b/drivers/gpu/drm/radeon/atombios_dp.c | |||
| @@ -492,6 +492,10 @@ int radeon_dp_mode_valid_helper(struct drm_connector *connector, | |||
| 492 | struct radeon_connector_atom_dig *dig_connector; | 492 | struct radeon_connector_atom_dig *dig_connector; |
| 493 | int dp_clock; | 493 | int dp_clock; |
| 494 | 494 | ||
| 495 | if ((mode->clock > 340000) && | ||
| 496 | (!radeon_connector_is_dp12_capable(connector))) | ||
| 497 | return MODE_CLOCK_HIGH; | ||
| 498 | |||
| 495 | if (!radeon_connector->con_priv) | 499 | if (!radeon_connector->con_priv) |
| 496 | return MODE_CLOCK_HIGH; | 500 | return MODE_CLOCK_HIGH; |
| 497 | dig_connector = radeon_connector->con_priv; | 501 | dig_connector = radeon_connector->con_priv; |
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..42cd0cffe210 100644 --- a/drivers/gpu/drm/radeon/cik_sdma.c +++ b/drivers/gpu/drm/radeon/cik_sdma.c | |||
| @@ -816,7 +816,6 @@ void cik_sdma_vm_write_pages(struct radeon_device *rdev, | |||
| 816 | for (; ndw > 0; ndw -= 2, --count, pe += 8) { | 816 | for (; ndw > 0; ndw -= 2, --count, pe += 8) { |
| 817 | if (flags & R600_PTE_SYSTEM) { | 817 | if (flags & R600_PTE_SYSTEM) { |
| 818 | value = radeon_vm_map_gart(rdev, addr); | 818 | value = radeon_vm_map_gart(rdev, addr); |
| 819 | value &= 0xFFFFFFFFFFFFF000ULL; | ||
| 820 | } else if (flags & R600_PTE_VALID) { | 819 | } else if (flags & R600_PTE_VALID) { |
| 821 | value = addr; | 820 | value = addr; |
| 822 | } else { | 821 | } else { |
| @@ -903,6 +902,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, | 902 | void cik_dma_vm_flush(struct radeon_device *rdev, struct radeon_ring *ring, |
| 904 | unsigned vm_id, uint64_t pd_addr) | 903 | unsigned vm_id, uint64_t pd_addr) |
| 905 | { | 904 | { |
| 905 | u32 extra_bits = (SDMA_POLL_REG_MEM_EXTRA_OP(0) | | ||
| 906 | SDMA_POLL_REG_MEM_EXTRA_FUNC(0)); /* always */ | ||
| 907 | |||
| 906 | radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000)); | 908 | radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000)); |
| 907 | if (vm_id < 8) { | 909 | if (vm_id < 8) { |
| 908 | radeon_ring_write(ring, (VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm_id << 2)) >> 2); | 910 | radeon_ring_write(ring, (VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm_id << 2)) >> 2); |
| @@ -943,5 +945,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)); | 945 | radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000)); |
| 944 | radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2); | 946 | radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2); |
| 945 | radeon_ring_write(ring, 1 << vm_id); | 947 | radeon_ring_write(ring, 1 << vm_id); |
| 948 | |||
| 949 | radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_POLL_REG_MEM, 0, extra_bits)); | ||
| 950 | radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2); | ||
| 951 | radeon_ring_write(ring, 0); | ||
| 952 | radeon_ring_write(ring, 0); /* reference */ | ||
| 953 | radeon_ring_write(ring, 0); /* mask */ | ||
| 954 | radeon_ring_write(ring, (0xfff << 16) | 10); /* retry count, poll interval */ | ||
| 946 | } | 955 | } |
| 947 | 956 | ||
diff --git a/drivers/gpu/drm/radeon/cikd.h b/drivers/gpu/drm/radeon/cikd.h index ba85986febea..03003f8a6de6 100644 --- a/drivers/gpu/drm/radeon/cikd.h +++ b/drivers/gpu/drm/radeon/cikd.h | |||
| @@ -2156,4 +2156,6 @@ | |||
| 2156 | #define ATC_VM_APERTURE1_HIGH_ADDR 0x330Cu | 2156 | #define ATC_VM_APERTURE1_HIGH_ADDR 0x330Cu |
| 2157 | #define ATC_VM_APERTURE1_LOW_ADDR 0x3304u | 2157 | #define ATC_VM_APERTURE1_LOW_ADDR 0x3304u |
| 2158 | 2158 | ||
| 2159 | #define IH_VMID_0_LUT 0x3D40u | ||
| 2160 | |||
| 2159 | #endif | 2161 | #endif |
diff --git a/drivers/gpu/drm/radeon/dce3_1_afmt.c b/drivers/gpu/drm/radeon/dce3_1_afmt.c index 2fe8cfc966d9..bafdf92a5732 100644 --- a/drivers/gpu/drm/radeon/dce3_1_afmt.c +++ b/drivers/gpu/drm/radeon/dce3_1_afmt.c | |||
| @@ -103,7 +103,7 @@ static void dce3_2_afmt_write_sad_regs(struct drm_encoder *encoder) | |||
| 103 | } | 103 | } |
| 104 | 104 | ||
| 105 | sad_count = drm_edid_to_sad(radeon_connector->edid, &sads); | 105 | sad_count = drm_edid_to_sad(radeon_connector->edid, &sads); |
| 106 | if (sad_count < 0) { | 106 | if (sad_count <= 0) { |
| 107 | DRM_ERROR("Couldn't read SADs: %d\n", sad_count); | 107 | DRM_ERROR("Couldn't read SADs: %d\n", sad_count); |
| 108 | return; | 108 | return; |
| 109 | } | 109 | } |
diff --git a/drivers/gpu/drm/radeon/kv_dpm.c b/drivers/gpu/drm/radeon/kv_dpm.c index 9b42001295ba..e3e9c10cfba9 100644 --- a/drivers/gpu/drm/radeon/kv_dpm.c +++ b/drivers/gpu/drm/radeon/kv_dpm.c | |||
| @@ -2745,13 +2745,11 @@ int kv_dpm_init(struct radeon_device *rdev) | |||
| 2745 | pi->enable_auto_thermal_throttling = true; | 2745 | pi->enable_auto_thermal_throttling = true; |
| 2746 | pi->disable_nb_ps3_in_battery = false; | 2746 | pi->disable_nb_ps3_in_battery = false; |
| 2747 | if (radeon_bapm == -1) { | 2747 | if (radeon_bapm == -1) { |
| 2748 | /* There are stability issues reported on with | 2748 | /* only enable bapm on KB, ML by default */ |
| 2749 | * bapm enabled on an asrock system. | 2749 | if (rdev->family == CHIP_KABINI || rdev->family == CHIP_MULLINS) |
| 2750 | */ | ||
| 2751 | if (rdev->pdev->subsystem_vendor == 0x1849) | ||
| 2752 | pi->bapm_enable = false; | ||
| 2753 | else | ||
| 2754 | pi->bapm_enable = true; | 2750 | pi->bapm_enable = true; |
| 2751 | else | ||
| 2752 | pi->bapm_enable = false; | ||
| 2755 | } else if (radeon_bapm == 0) { | 2753 | } else if (radeon_bapm == 0) { |
| 2756 | pi->bapm_enable = false; | 2754 | pi->bapm_enable = false; |
| 2757 | } else { | 2755 | } else { |
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..ce787a9f12c0 100644 --- a/drivers/gpu/drm/radeon/ni_dma.c +++ b/drivers/gpu/drm/radeon/ni_dma.c | |||
| @@ -372,7 +372,6 @@ void cayman_dma_vm_write_pages(struct radeon_device *rdev, | |||
| 372 | for (; ndw > 0; ndw -= 2, --count, pe += 8) { | 372 | for (; ndw > 0; ndw -= 2, --count, pe += 8) { |
| 373 | if (flags & R600_PTE_SYSTEM) { | 373 | if (flags & R600_PTE_SYSTEM) { |
| 374 | value = radeon_vm_map_gart(rdev, addr); | 374 | value = radeon_vm_map_gart(rdev, addr); |
| 375 | value &= 0xFFFFFFFFFFFFF000ULL; | ||
| 376 | } else if (flags & R600_PTE_VALID) { | 375 | } else if (flags & R600_PTE_VALID) { |
| 377 | value = addr; | 376 | value = addr; |
| 378 | } else { | 377 | } else { |
| @@ -463,5 +462,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)); | 462 | radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0)); |
| 464 | radeon_ring_write(ring, (0xf << 16) | (VM_INVALIDATE_REQUEST >> 2)); | 463 | radeon_ring_write(ring, (0xf << 16) | (VM_INVALIDATE_REQUEST >> 2)); |
| 465 | radeon_ring_write(ring, 1 << vm_id); | 464 | radeon_ring_write(ring, 1 << vm_id); |
| 465 | |||
| 466 | /* wait for invalidate to complete */ | ||
| 467 | radeon_ring_write(ring, DMA_SRBM_READ_PACKET); | ||
| 468 | radeon_ring_write(ring, (0xff << 20) | (VM_INVALIDATE_REQUEST >> 2)); | ||
| 469 | radeon_ring_write(ring, 0); /* mask */ | ||
| 470 | radeon_ring_write(ring, 0); /* value */ | ||
| 466 | } | 471 | } |
| 467 | 472 | ||
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/r100.c b/drivers/gpu/drm/radeon/r100.c index 74f06d540591..279801ca5110 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c | |||
| @@ -644,6 +644,7 @@ int r100_pci_gart_init(struct radeon_device *rdev) | |||
| 644 | return r; | 644 | return r; |
| 645 | rdev->gart.table_size = rdev->gart.num_gpu_pages * 4; | 645 | rdev->gart.table_size = rdev->gart.num_gpu_pages * 4; |
| 646 | rdev->asic->gart.tlb_flush = &r100_pci_gart_tlb_flush; | 646 | rdev->asic->gart.tlb_flush = &r100_pci_gart_tlb_flush; |
| 647 | rdev->asic->gart.get_page_entry = &r100_pci_gart_get_page_entry; | ||
| 647 | rdev->asic->gart.set_page = &r100_pci_gart_set_page; | 648 | rdev->asic->gart.set_page = &r100_pci_gart_set_page; |
| 648 | return radeon_gart_table_ram_alloc(rdev); | 649 | return radeon_gart_table_ram_alloc(rdev); |
| 649 | } | 650 | } |
| @@ -681,11 +682,16 @@ void r100_pci_gart_disable(struct radeon_device *rdev) | |||
| 681 | WREG32(RADEON_AIC_HI_ADDR, 0); | 682 | WREG32(RADEON_AIC_HI_ADDR, 0); |
| 682 | } | 683 | } |
| 683 | 684 | ||
| 685 | uint64_t r100_pci_gart_get_page_entry(uint64_t addr, uint32_t flags) | ||
| 686 | { | ||
| 687 | return addr; | ||
| 688 | } | ||
| 689 | |||
| 684 | void r100_pci_gart_set_page(struct radeon_device *rdev, unsigned i, | 690 | void r100_pci_gart_set_page(struct radeon_device *rdev, unsigned i, |
| 685 | uint64_t addr, uint32_t flags) | 691 | uint64_t entry) |
| 686 | { | 692 | { |
| 687 | u32 *gtt = rdev->gart.ptr; | 693 | u32 *gtt = rdev->gart.ptr; |
| 688 | gtt[i] = cpu_to_le32(lower_32_bits(addr)); | 694 | gtt[i] = cpu_to_le32(lower_32_bits(entry)); |
| 689 | } | 695 | } |
| 690 | 696 | ||
| 691 | void r100_pci_gart_fini(struct radeon_device *rdev) | 697 | void r100_pci_gart_fini(struct radeon_device *rdev) |
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c index 064ad5569cca..08d68f3e13e9 100644 --- a/drivers/gpu/drm/radeon/r300.c +++ b/drivers/gpu/drm/radeon/r300.c | |||
| @@ -73,11 +73,8 @@ void rv370_pcie_gart_tlb_flush(struct radeon_device *rdev) | |||
| 73 | #define R300_PTE_WRITEABLE (1 << 2) | 73 | #define R300_PTE_WRITEABLE (1 << 2) |
| 74 | #define R300_PTE_READABLE (1 << 3) | 74 | #define R300_PTE_READABLE (1 << 3) |
| 75 | 75 | ||
| 76 | void rv370_pcie_gart_set_page(struct radeon_device *rdev, unsigned i, | 76 | uint64_t rv370_pcie_gart_get_page_entry(uint64_t addr, uint32_t flags) |
| 77 | uint64_t addr, uint32_t flags) | ||
| 78 | { | 77 | { |
| 79 | void __iomem *ptr = rdev->gart.ptr; | ||
| 80 | |||
| 81 | addr = (lower_32_bits(addr) >> 8) | | 78 | addr = (lower_32_bits(addr) >> 8) | |
| 82 | ((upper_32_bits(addr) & 0xff) << 24); | 79 | ((upper_32_bits(addr) & 0xff) << 24); |
| 83 | if (flags & RADEON_GART_PAGE_READ) | 80 | if (flags & RADEON_GART_PAGE_READ) |
| @@ -86,10 +83,18 @@ void rv370_pcie_gart_set_page(struct radeon_device *rdev, unsigned i, | |||
| 86 | addr |= R300_PTE_WRITEABLE; | 83 | addr |= R300_PTE_WRITEABLE; |
| 87 | if (!(flags & RADEON_GART_PAGE_SNOOP)) | 84 | if (!(flags & RADEON_GART_PAGE_SNOOP)) |
| 88 | addr |= R300_PTE_UNSNOOPED; | 85 | addr |= R300_PTE_UNSNOOPED; |
| 86 | return addr; | ||
| 87 | } | ||
| 88 | |||
| 89 | void rv370_pcie_gart_set_page(struct radeon_device *rdev, unsigned i, | ||
| 90 | uint64_t entry) | ||
| 91 | { | ||
| 92 | void __iomem *ptr = rdev->gart.ptr; | ||
| 93 | |||
| 89 | /* on x86 we want this to be CPU endian, on powerpc | 94 | /* on x86 we want this to be CPU endian, on powerpc |
| 90 | * on powerpc without HW swappers, it'll get swapped on way | 95 | * on powerpc without HW swappers, it'll get swapped on way |
| 91 | * into VRAM - so no need for cpu_to_le32 on VRAM tables */ | 96 | * into VRAM - so no need for cpu_to_le32 on VRAM tables */ |
| 92 | writel(addr, ((void __iomem *)ptr) + (i * 4)); | 97 | writel(entry, ((void __iomem *)ptr) + (i * 4)); |
| 93 | } | 98 | } |
| 94 | 99 | ||
| 95 | int rv370_pcie_gart_init(struct radeon_device *rdev) | 100 | int rv370_pcie_gart_init(struct radeon_device *rdev) |
| @@ -109,6 +114,7 @@ int rv370_pcie_gart_init(struct radeon_device *rdev) | |||
| 109 | DRM_ERROR("Failed to register debugfs file for PCIE gart !\n"); | 114 | DRM_ERROR("Failed to register debugfs file for PCIE gart !\n"); |
| 110 | rdev->gart.table_size = rdev->gart.num_gpu_pages * 4; | 115 | rdev->gart.table_size = rdev->gart.num_gpu_pages * 4; |
| 111 | rdev->asic->gart.tlb_flush = &rv370_pcie_gart_tlb_flush; | 116 | rdev->asic->gart.tlb_flush = &rv370_pcie_gart_tlb_flush; |
| 117 | rdev->asic->gart.get_page_entry = &rv370_pcie_gart_get_page_entry; | ||
| 112 | rdev->asic->gart.set_page = &rv370_pcie_gart_set_page; | 118 | rdev->asic->gart.set_page = &rv370_pcie_gart_set_page; |
| 113 | return radeon_gart_table_vram_alloc(rdev); | 119 | return radeon_gart_table_vram_alloc(rdev); |
| 114 | } | 120 | } |
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 54529b837afa..3f2a8d3febca 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
| @@ -242,6 +242,7 @@ bool radeon_get_bios(struct radeon_device *rdev); | |||
| 242 | * Dummy page | 242 | * Dummy page |
| 243 | */ | 243 | */ |
| 244 | struct radeon_dummy_page { | 244 | struct radeon_dummy_page { |
| 245 | uint64_t entry; | ||
| 245 | struct page *page; | 246 | struct page *page; |
| 246 | dma_addr_t addr; | 247 | dma_addr_t addr; |
| 247 | }; | 248 | }; |
| @@ -645,7 +646,7 @@ struct radeon_gart { | |||
| 645 | unsigned num_cpu_pages; | 646 | unsigned num_cpu_pages; |
| 646 | unsigned table_size; | 647 | unsigned table_size; |
| 647 | struct page **pages; | 648 | struct page **pages; |
| 648 | dma_addr_t *pages_addr; | 649 | uint64_t *pages_entry; |
| 649 | bool ready; | 650 | bool ready; |
| 650 | }; | 651 | }; |
| 651 | 652 | ||
| @@ -1847,8 +1848,9 @@ struct radeon_asic { | |||
| 1847 | /* gart */ | 1848 | /* gart */ |
| 1848 | struct { | 1849 | struct { |
| 1849 | void (*tlb_flush)(struct radeon_device *rdev); | 1850 | void (*tlb_flush)(struct radeon_device *rdev); |
| 1851 | uint64_t (*get_page_entry)(uint64_t addr, uint32_t flags); | ||
| 1850 | void (*set_page)(struct radeon_device *rdev, unsigned i, | 1852 | void (*set_page)(struct radeon_device *rdev, unsigned i, |
| 1851 | uint64_t addr, uint32_t flags); | 1853 | uint64_t entry); |
| 1852 | } gart; | 1854 | } gart; |
| 1853 | struct { | 1855 | struct { |
| 1854 | int (*init)(struct radeon_device *rdev); | 1856 | int (*init)(struct radeon_device *rdev); |
| @@ -2852,7 +2854,8 @@ static inline void radeon_ring_write(struct radeon_ring *ring, uint32_t v) | |||
| 2852 | #define radeon_vga_set_state(rdev, state) (rdev)->asic->vga_set_state((rdev), (state)) | 2854 | #define radeon_vga_set_state(rdev, state) (rdev)->asic->vga_set_state((rdev), (state)) |
| 2853 | #define radeon_asic_reset(rdev) (rdev)->asic->asic_reset((rdev)) | 2855 | #define radeon_asic_reset(rdev) (rdev)->asic->asic_reset((rdev)) |
| 2854 | #define radeon_gart_tlb_flush(rdev) (rdev)->asic->gart.tlb_flush((rdev)) | 2856 | #define radeon_gart_tlb_flush(rdev) (rdev)->asic->gart.tlb_flush((rdev)) |
| 2855 | #define radeon_gart_set_page(rdev, i, p, f) (rdev)->asic->gart.set_page((rdev), (i), (p), (f)) | 2857 | #define radeon_gart_get_page_entry(a, f) (rdev)->asic->gart.get_page_entry((a), (f)) |
| 2858 | #define radeon_gart_set_page(rdev, i, e) (rdev)->asic->gart.set_page((rdev), (i), (e)) | ||
| 2856 | #define radeon_asic_vm_init(rdev) (rdev)->asic->vm.init((rdev)) | 2859 | #define radeon_asic_vm_init(rdev) (rdev)->asic->vm.init((rdev)) |
| 2857 | #define radeon_asic_vm_fini(rdev) (rdev)->asic->vm.fini((rdev)) | 2860 | #define radeon_asic_vm_fini(rdev) (rdev)->asic->vm.fini((rdev)) |
| 2858 | #define radeon_asic_vm_copy_pages(rdev, ib, pe, src, count) ((rdev)->asic->vm.copy_pages((rdev), (ib), (pe), (src), (count))) | 2861 | #define radeon_asic_vm_copy_pages(rdev, ib, pe, src, count) ((rdev)->asic->vm.copy_pages((rdev), (ib), (pe), (src), (count))) |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.c b/drivers/gpu/drm/radeon/radeon_asic.c index 850de57069be..ed0e10eee2dc 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.c +++ b/drivers/gpu/drm/radeon/radeon_asic.c | |||
| @@ -159,11 +159,13 @@ void radeon_agp_disable(struct radeon_device *rdev) | |||
| 159 | DRM_INFO("Forcing AGP to PCIE mode\n"); | 159 | DRM_INFO("Forcing AGP to PCIE mode\n"); |
| 160 | rdev->flags |= RADEON_IS_PCIE; | 160 | rdev->flags |= RADEON_IS_PCIE; |
| 161 | rdev->asic->gart.tlb_flush = &rv370_pcie_gart_tlb_flush; | 161 | rdev->asic->gart.tlb_flush = &rv370_pcie_gart_tlb_flush; |
| 162 | rdev->asic->gart.get_page_entry = &rv370_pcie_gart_get_page_entry; | ||
| 162 | rdev->asic->gart.set_page = &rv370_pcie_gart_set_page; | 163 | rdev->asic->gart.set_page = &rv370_pcie_gart_set_page; |
| 163 | } else { | 164 | } else { |
| 164 | DRM_INFO("Forcing AGP to PCI mode\n"); | 165 | DRM_INFO("Forcing AGP to PCI mode\n"); |
| 165 | rdev->flags |= RADEON_IS_PCI; | 166 | rdev->flags |= RADEON_IS_PCI; |
| 166 | rdev->asic->gart.tlb_flush = &r100_pci_gart_tlb_flush; | 167 | rdev->asic->gart.tlb_flush = &r100_pci_gart_tlb_flush; |
| 168 | rdev->asic->gart.get_page_entry = &r100_pci_gart_get_page_entry; | ||
| 167 | rdev->asic->gart.set_page = &r100_pci_gart_set_page; | 169 | rdev->asic->gart.set_page = &r100_pci_gart_set_page; |
| 168 | } | 170 | } |
| 169 | rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024; | 171 | rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024; |
| @@ -199,6 +201,7 @@ static struct radeon_asic r100_asic = { | |||
| 199 | .mc_wait_for_idle = &r100_mc_wait_for_idle, | 201 | .mc_wait_for_idle = &r100_mc_wait_for_idle, |
| 200 | .gart = { | 202 | .gart = { |
| 201 | .tlb_flush = &r100_pci_gart_tlb_flush, | 203 | .tlb_flush = &r100_pci_gart_tlb_flush, |
| 204 | .get_page_entry = &r100_pci_gart_get_page_entry, | ||
| 202 | .set_page = &r100_pci_gart_set_page, | 205 | .set_page = &r100_pci_gart_set_page, |
| 203 | }, | 206 | }, |
| 204 | .ring = { | 207 | .ring = { |
| @@ -265,6 +268,7 @@ static struct radeon_asic r200_asic = { | |||
| 265 | .mc_wait_for_idle = &r100_mc_wait_for_idle, | 268 | .mc_wait_for_idle = &r100_mc_wait_for_idle, |
| 266 | .gart = { | 269 | .gart = { |
| 267 | .tlb_flush = &r100_pci_gart_tlb_flush, | 270 | .tlb_flush = &r100_pci_gart_tlb_flush, |
| 271 | .get_page_entry = &r100_pci_gart_get_page_entry, | ||
| 268 | .set_page = &r100_pci_gart_set_page, | 272 | .set_page = &r100_pci_gart_set_page, |
| 269 | }, | 273 | }, |
| 270 | .ring = { | 274 | .ring = { |
| @@ -333,6 +337,20 @@ static struct radeon_asic_ring r300_gfx_ring = { | |||
| 333 | .set_wptr = &r100_gfx_set_wptr, | 337 | .set_wptr = &r100_gfx_set_wptr, |
| 334 | }; | 338 | }; |
| 335 | 339 | ||
| 340 | static struct radeon_asic_ring rv515_gfx_ring = { | ||
| 341 | .ib_execute = &r100_ring_ib_execute, | ||
| 342 | .emit_fence = &r300_fence_ring_emit, | ||
| 343 | .emit_semaphore = &r100_semaphore_ring_emit, | ||
| 344 | .cs_parse = &r300_cs_parse, | ||
| 345 | .ring_start = &rv515_ring_start, | ||
| 346 | .ring_test = &r100_ring_test, | ||
| 347 | .ib_test = &r100_ib_test, | ||
| 348 | .is_lockup = &r100_gpu_is_lockup, | ||
| 349 | .get_rptr = &r100_gfx_get_rptr, | ||
| 350 | .get_wptr = &r100_gfx_get_wptr, | ||
| 351 | .set_wptr = &r100_gfx_set_wptr, | ||
| 352 | }; | ||
| 353 | |||
| 336 | static struct radeon_asic r300_asic = { | 354 | static struct radeon_asic r300_asic = { |
| 337 | .init = &r300_init, | 355 | .init = &r300_init, |
| 338 | .fini = &r300_fini, | 356 | .fini = &r300_fini, |
| @@ -345,6 +363,7 @@ static struct radeon_asic r300_asic = { | |||
| 345 | .mc_wait_for_idle = &r300_mc_wait_for_idle, | 363 | .mc_wait_for_idle = &r300_mc_wait_for_idle, |
| 346 | .gart = { | 364 | .gart = { |
| 347 | .tlb_flush = &r100_pci_gart_tlb_flush, | 365 | .tlb_flush = &r100_pci_gart_tlb_flush, |
| 366 | .get_page_entry = &r100_pci_gart_get_page_entry, | ||
| 348 | .set_page = &r100_pci_gart_set_page, | 367 | .set_page = &r100_pci_gart_set_page, |
| 349 | }, | 368 | }, |
| 350 | .ring = { | 369 | .ring = { |
| @@ -411,6 +430,7 @@ static struct radeon_asic r300_asic_pcie = { | |||
| 411 | .mc_wait_for_idle = &r300_mc_wait_for_idle, | 430 | .mc_wait_for_idle = &r300_mc_wait_for_idle, |
| 412 | .gart = { | 431 | .gart = { |
| 413 | .tlb_flush = &rv370_pcie_gart_tlb_flush, | 432 | .tlb_flush = &rv370_pcie_gart_tlb_flush, |
| 433 | .get_page_entry = &rv370_pcie_gart_get_page_entry, | ||
| 414 | .set_page = &rv370_pcie_gart_set_page, | 434 | .set_page = &rv370_pcie_gart_set_page, |
| 415 | }, | 435 | }, |
| 416 | .ring = { | 436 | .ring = { |
| @@ -477,6 +497,7 @@ static struct radeon_asic r420_asic = { | |||
| 477 | .mc_wait_for_idle = &r300_mc_wait_for_idle, | 497 | .mc_wait_for_idle = &r300_mc_wait_for_idle, |
| 478 | .gart = { | 498 | .gart = { |
| 479 | .tlb_flush = &rv370_pcie_gart_tlb_flush, | 499 | .tlb_flush = &rv370_pcie_gart_tlb_flush, |
| 500 | .get_page_entry = &rv370_pcie_gart_get_page_entry, | ||
| 480 | .set_page = &rv370_pcie_gart_set_page, | 501 | .set_page = &rv370_pcie_gart_set_page, |
| 481 | }, | 502 | }, |
| 482 | .ring = { | 503 | .ring = { |
| @@ -543,6 +564,7 @@ static struct radeon_asic rs400_asic = { | |||
| 543 | .mc_wait_for_idle = &rs400_mc_wait_for_idle, | 564 | .mc_wait_for_idle = &rs400_mc_wait_for_idle, |
| 544 | .gart = { | 565 | .gart = { |
| 545 | .tlb_flush = &rs400_gart_tlb_flush, | 566 | .tlb_flush = &rs400_gart_tlb_flush, |
| 567 | .get_page_entry = &rs400_gart_get_page_entry, | ||
| 546 | .set_page = &rs400_gart_set_page, | 568 | .set_page = &rs400_gart_set_page, |
| 547 | }, | 569 | }, |
| 548 | .ring = { | 570 | .ring = { |
| @@ -609,6 +631,7 @@ static struct radeon_asic rs600_asic = { | |||
| 609 | .mc_wait_for_idle = &rs600_mc_wait_for_idle, | 631 | .mc_wait_for_idle = &rs600_mc_wait_for_idle, |
| 610 | .gart = { | 632 | .gart = { |
| 611 | .tlb_flush = &rs600_gart_tlb_flush, | 633 | .tlb_flush = &rs600_gart_tlb_flush, |
| 634 | .get_page_entry = &rs600_gart_get_page_entry, | ||
| 612 | .set_page = &rs600_gart_set_page, | 635 | .set_page = &rs600_gart_set_page, |
| 613 | }, | 636 | }, |
| 614 | .ring = { | 637 | .ring = { |
| @@ -677,6 +700,7 @@ static struct radeon_asic rs690_asic = { | |||
| 677 | .mc_wait_for_idle = &rs690_mc_wait_for_idle, | 700 | .mc_wait_for_idle = &rs690_mc_wait_for_idle, |
| 678 | .gart = { | 701 | .gart = { |
| 679 | .tlb_flush = &rs400_gart_tlb_flush, | 702 | .tlb_flush = &rs400_gart_tlb_flush, |
| 703 | .get_page_entry = &rs400_gart_get_page_entry, | ||
| 680 | .set_page = &rs400_gart_set_page, | 704 | .set_page = &rs400_gart_set_page, |
| 681 | }, | 705 | }, |
| 682 | .ring = { | 706 | .ring = { |
| @@ -745,10 +769,11 @@ static struct radeon_asic rv515_asic = { | |||
| 745 | .mc_wait_for_idle = &rv515_mc_wait_for_idle, | 769 | .mc_wait_for_idle = &rv515_mc_wait_for_idle, |
| 746 | .gart = { | 770 | .gart = { |
| 747 | .tlb_flush = &rv370_pcie_gart_tlb_flush, | 771 | .tlb_flush = &rv370_pcie_gart_tlb_flush, |
| 772 | .get_page_entry = &rv370_pcie_gart_get_page_entry, | ||
| 748 | .set_page = &rv370_pcie_gart_set_page, | 773 | .set_page = &rv370_pcie_gart_set_page, |
| 749 | }, | 774 | }, |
| 750 | .ring = { | 775 | .ring = { |
| 751 | [RADEON_RING_TYPE_GFX_INDEX] = &r300_gfx_ring | 776 | [RADEON_RING_TYPE_GFX_INDEX] = &rv515_gfx_ring |
| 752 | }, | 777 | }, |
| 753 | .irq = { | 778 | .irq = { |
| 754 | .set = &rs600_irq_set, | 779 | .set = &rs600_irq_set, |
| @@ -811,10 +836,11 @@ static struct radeon_asic r520_asic = { | |||
| 811 | .mc_wait_for_idle = &r520_mc_wait_for_idle, | 836 | .mc_wait_for_idle = &r520_mc_wait_for_idle, |
| 812 | .gart = { | 837 | .gart = { |
| 813 | .tlb_flush = &rv370_pcie_gart_tlb_flush, | 838 | .tlb_flush = &rv370_pcie_gart_tlb_flush, |
| 839 | .get_page_entry = &rv370_pcie_gart_get_page_entry, | ||
| 814 | .set_page = &rv370_pcie_gart_set_page, | 840 | .set_page = &rv370_pcie_gart_set_page, |
| 815 | }, | 841 | }, |
| 816 | .ring = { | 842 | .ring = { |
| 817 | [RADEON_RING_TYPE_GFX_INDEX] = &r300_gfx_ring | 843 | [RADEON_RING_TYPE_GFX_INDEX] = &rv515_gfx_ring |
| 818 | }, | 844 | }, |
| 819 | .irq = { | 845 | .irq = { |
| 820 | .set = &rs600_irq_set, | 846 | .set = &rs600_irq_set, |
| @@ -905,6 +931,7 @@ static struct radeon_asic r600_asic = { | |||
| 905 | .get_gpu_clock_counter = &r600_get_gpu_clock_counter, | 931 | .get_gpu_clock_counter = &r600_get_gpu_clock_counter, |
| 906 | .gart = { | 932 | .gart = { |
| 907 | .tlb_flush = &r600_pcie_gart_tlb_flush, | 933 | .tlb_flush = &r600_pcie_gart_tlb_flush, |
| 934 | .get_page_entry = &rs600_gart_get_page_entry, | ||
| 908 | .set_page = &rs600_gart_set_page, | 935 | .set_page = &rs600_gart_set_page, |
| 909 | }, | 936 | }, |
| 910 | .ring = { | 937 | .ring = { |
| @@ -990,6 +1017,7 @@ static struct radeon_asic rv6xx_asic = { | |||
| 990 | .get_gpu_clock_counter = &r600_get_gpu_clock_counter, | 1017 | .get_gpu_clock_counter = &r600_get_gpu_clock_counter, |
| 991 | .gart = { | 1018 | .gart = { |
| 992 | .tlb_flush = &r600_pcie_gart_tlb_flush, | 1019 | .tlb_flush = &r600_pcie_gart_tlb_flush, |
| 1020 | .get_page_entry = &rs600_gart_get_page_entry, | ||
| 993 | .set_page = &rs600_gart_set_page, | 1021 | .set_page = &rs600_gart_set_page, |
| 994 | }, | 1022 | }, |
| 995 | .ring = { | 1023 | .ring = { |
| @@ -1081,6 +1109,7 @@ static struct radeon_asic rs780_asic = { | |||
| 1081 | .get_gpu_clock_counter = &r600_get_gpu_clock_counter, | 1109 | .get_gpu_clock_counter = &r600_get_gpu_clock_counter, |
| 1082 | .gart = { | 1110 | .gart = { |
| 1083 | .tlb_flush = &r600_pcie_gart_tlb_flush, | 1111 | .tlb_flush = &r600_pcie_gart_tlb_flush, |
| 1112 | .get_page_entry = &rs600_gart_get_page_entry, | ||
| 1084 | .set_page = &rs600_gart_set_page, | 1113 | .set_page = &rs600_gart_set_page, |
| 1085 | }, | 1114 | }, |
| 1086 | .ring = { | 1115 | .ring = { |
| @@ -1185,6 +1214,7 @@ static struct radeon_asic rv770_asic = { | |||
| 1185 | .get_gpu_clock_counter = &r600_get_gpu_clock_counter, | 1214 | .get_gpu_clock_counter = &r600_get_gpu_clock_counter, |
| 1186 | .gart = { | 1215 | .gart = { |
| 1187 | .tlb_flush = &r600_pcie_gart_tlb_flush, | 1216 | .tlb_flush = &r600_pcie_gart_tlb_flush, |
| 1217 | .get_page_entry = &rs600_gart_get_page_entry, | ||
| 1188 | .set_page = &rs600_gart_set_page, | 1218 | .set_page = &rs600_gart_set_page, |
| 1189 | }, | 1219 | }, |
| 1190 | .ring = { | 1220 | .ring = { |
| @@ -1303,6 +1333,7 @@ static struct radeon_asic evergreen_asic = { | |||
| 1303 | .get_gpu_clock_counter = &r600_get_gpu_clock_counter, | 1333 | .get_gpu_clock_counter = &r600_get_gpu_clock_counter, |
| 1304 | .gart = { | 1334 | .gart = { |
| 1305 | .tlb_flush = &evergreen_pcie_gart_tlb_flush, | 1335 | .tlb_flush = &evergreen_pcie_gart_tlb_flush, |
| 1336 | .get_page_entry = &rs600_gart_get_page_entry, | ||
| 1306 | .set_page = &rs600_gart_set_page, | 1337 | .set_page = &rs600_gart_set_page, |
| 1307 | }, | 1338 | }, |
| 1308 | .ring = { | 1339 | .ring = { |
| @@ -1395,6 +1426,7 @@ static struct radeon_asic sumo_asic = { | |||
| 1395 | .get_gpu_clock_counter = &r600_get_gpu_clock_counter, | 1426 | .get_gpu_clock_counter = &r600_get_gpu_clock_counter, |
| 1396 | .gart = { | 1427 | .gart = { |
| 1397 | .tlb_flush = &evergreen_pcie_gart_tlb_flush, | 1428 | .tlb_flush = &evergreen_pcie_gart_tlb_flush, |
| 1429 | .get_page_entry = &rs600_gart_get_page_entry, | ||
| 1398 | .set_page = &rs600_gart_set_page, | 1430 | .set_page = &rs600_gart_set_page, |
| 1399 | }, | 1431 | }, |
| 1400 | .ring = { | 1432 | .ring = { |
| @@ -1486,6 +1518,7 @@ static struct radeon_asic btc_asic = { | |||
| 1486 | .get_gpu_clock_counter = &r600_get_gpu_clock_counter, | 1518 | .get_gpu_clock_counter = &r600_get_gpu_clock_counter, |
| 1487 | .gart = { | 1519 | .gart = { |
| 1488 | .tlb_flush = &evergreen_pcie_gart_tlb_flush, | 1520 | .tlb_flush = &evergreen_pcie_gart_tlb_flush, |
| 1521 | .get_page_entry = &rs600_gart_get_page_entry, | ||
| 1489 | .set_page = &rs600_gart_set_page, | 1522 | .set_page = &rs600_gart_set_page, |
| 1490 | }, | 1523 | }, |
| 1491 | .ring = { | 1524 | .ring = { |
| @@ -1621,6 +1654,7 @@ static struct radeon_asic cayman_asic = { | |||
| 1621 | .get_gpu_clock_counter = &r600_get_gpu_clock_counter, | 1654 | .get_gpu_clock_counter = &r600_get_gpu_clock_counter, |
| 1622 | .gart = { | 1655 | .gart = { |
| 1623 | .tlb_flush = &cayman_pcie_gart_tlb_flush, | 1656 | .tlb_flush = &cayman_pcie_gart_tlb_flush, |
| 1657 | .get_page_entry = &rs600_gart_get_page_entry, | ||
| 1624 | .set_page = &rs600_gart_set_page, | 1658 | .set_page = &rs600_gart_set_page, |
| 1625 | }, | 1659 | }, |
| 1626 | .vm = { | 1660 | .vm = { |
| @@ -1724,6 +1758,7 @@ static struct radeon_asic trinity_asic = { | |||
| 1724 | .get_gpu_clock_counter = &r600_get_gpu_clock_counter, | 1758 | .get_gpu_clock_counter = &r600_get_gpu_clock_counter, |
| 1725 | .gart = { | 1759 | .gart = { |
| 1726 | .tlb_flush = &cayman_pcie_gart_tlb_flush, | 1760 | .tlb_flush = &cayman_pcie_gart_tlb_flush, |
| 1761 | .get_page_entry = &rs600_gart_get_page_entry, | ||
| 1727 | .set_page = &rs600_gart_set_page, | 1762 | .set_page = &rs600_gart_set_page, |
| 1728 | }, | 1763 | }, |
| 1729 | .vm = { | 1764 | .vm = { |
| @@ -1857,6 +1892,7 @@ static struct radeon_asic si_asic = { | |||
| 1857 | .get_gpu_clock_counter = &si_get_gpu_clock_counter, | 1892 | .get_gpu_clock_counter = &si_get_gpu_clock_counter, |
| 1858 | .gart = { | 1893 | .gart = { |
| 1859 | .tlb_flush = &si_pcie_gart_tlb_flush, | 1894 | .tlb_flush = &si_pcie_gart_tlb_flush, |
| 1895 | .get_page_entry = &rs600_gart_get_page_entry, | ||
| 1860 | .set_page = &rs600_gart_set_page, | 1896 | .set_page = &rs600_gart_set_page, |
| 1861 | }, | 1897 | }, |
| 1862 | .vm = { | 1898 | .vm = { |
| @@ -2018,6 +2054,7 @@ static struct radeon_asic ci_asic = { | |||
| 2018 | .get_gpu_clock_counter = &cik_get_gpu_clock_counter, | 2054 | .get_gpu_clock_counter = &cik_get_gpu_clock_counter, |
| 2019 | .gart = { | 2055 | .gart = { |
| 2020 | .tlb_flush = &cik_pcie_gart_tlb_flush, | 2056 | .tlb_flush = &cik_pcie_gart_tlb_flush, |
| 2057 | .get_page_entry = &rs600_gart_get_page_entry, | ||
| 2021 | .set_page = &rs600_gart_set_page, | 2058 | .set_page = &rs600_gart_set_page, |
| 2022 | }, | 2059 | }, |
| 2023 | .vm = { | 2060 | .vm = { |
| @@ -2125,6 +2162,7 @@ static struct radeon_asic kv_asic = { | |||
| 2125 | .get_gpu_clock_counter = &cik_get_gpu_clock_counter, | 2162 | .get_gpu_clock_counter = &cik_get_gpu_clock_counter, |
| 2126 | .gart = { | 2163 | .gart = { |
| 2127 | .tlb_flush = &cik_pcie_gart_tlb_flush, | 2164 | .tlb_flush = &cik_pcie_gart_tlb_flush, |
| 2165 | .get_page_entry = &rs600_gart_get_page_entry, | ||
| 2128 | .set_page = &rs600_gart_set_page, | 2166 | .set_page = &rs600_gart_set_page, |
| 2129 | }, | 2167 | }, |
| 2130 | .vm = { | 2168 | .vm = { |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h index 2a45d548d5ec..8d787d115653 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.h +++ b/drivers/gpu/drm/radeon/radeon_asic.h | |||
| @@ -67,8 +67,9 @@ bool r100_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp); | |||
| 67 | int r100_asic_reset(struct radeon_device *rdev); | 67 | int r100_asic_reset(struct radeon_device *rdev); |
| 68 | u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc); | 68 | u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc); |
| 69 | void r100_pci_gart_tlb_flush(struct radeon_device *rdev); | 69 | void r100_pci_gart_tlb_flush(struct radeon_device *rdev); |
| 70 | uint64_t r100_pci_gart_get_page_entry(uint64_t addr, uint32_t flags); | ||
| 70 | void r100_pci_gart_set_page(struct radeon_device *rdev, unsigned i, | 71 | void r100_pci_gart_set_page(struct radeon_device *rdev, unsigned i, |
| 71 | uint64_t addr, uint32_t flags); | 72 | uint64_t entry); |
| 72 | void r100_ring_start(struct radeon_device *rdev, struct radeon_ring *ring); | 73 | void r100_ring_start(struct radeon_device *rdev, struct radeon_ring *ring); |
| 73 | int r100_irq_set(struct radeon_device *rdev); | 74 | int r100_irq_set(struct radeon_device *rdev); |
| 74 | int r100_irq_process(struct radeon_device *rdev); | 75 | int r100_irq_process(struct radeon_device *rdev); |
| @@ -172,8 +173,9 @@ extern void r300_fence_ring_emit(struct radeon_device *rdev, | |||
| 172 | struct radeon_fence *fence); | 173 | struct radeon_fence *fence); |
| 173 | extern int r300_cs_parse(struct radeon_cs_parser *p); | 174 | extern int r300_cs_parse(struct radeon_cs_parser *p); |
| 174 | extern void rv370_pcie_gart_tlb_flush(struct radeon_device *rdev); | 175 | extern void rv370_pcie_gart_tlb_flush(struct radeon_device *rdev); |
| 176 | extern uint64_t rv370_pcie_gart_get_page_entry(uint64_t addr, uint32_t flags); | ||
| 175 | extern void rv370_pcie_gart_set_page(struct radeon_device *rdev, unsigned i, | 177 | extern void rv370_pcie_gart_set_page(struct radeon_device *rdev, unsigned i, |
| 176 | uint64_t addr, uint32_t flags); | 178 | uint64_t entry); |
| 177 | extern void rv370_set_pcie_lanes(struct radeon_device *rdev, int lanes); | 179 | extern void rv370_set_pcie_lanes(struct radeon_device *rdev, int lanes); |
| 178 | extern int rv370_get_pcie_lanes(struct radeon_device *rdev); | 180 | extern int rv370_get_pcie_lanes(struct radeon_device *rdev); |
| 179 | extern void r300_set_reg_safe(struct radeon_device *rdev); | 181 | extern void r300_set_reg_safe(struct radeon_device *rdev); |
| @@ -208,8 +210,9 @@ extern void rs400_fini(struct radeon_device *rdev); | |||
| 208 | extern int rs400_suspend(struct radeon_device *rdev); | 210 | extern int rs400_suspend(struct radeon_device *rdev); |
| 209 | extern int rs400_resume(struct radeon_device *rdev); | 211 | extern int rs400_resume(struct radeon_device *rdev); |
| 210 | void rs400_gart_tlb_flush(struct radeon_device *rdev); | 212 | void rs400_gart_tlb_flush(struct radeon_device *rdev); |
| 213 | uint64_t rs400_gart_get_page_entry(uint64_t addr, uint32_t flags); | ||
| 211 | void rs400_gart_set_page(struct radeon_device *rdev, unsigned i, | 214 | void rs400_gart_set_page(struct radeon_device *rdev, unsigned i, |
| 212 | uint64_t addr, uint32_t flags); | 215 | uint64_t entry); |
| 213 | uint32_t rs400_mc_rreg(struct radeon_device *rdev, uint32_t reg); | 216 | uint32_t rs400_mc_rreg(struct radeon_device *rdev, uint32_t reg); |
| 214 | void rs400_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); | 217 | void rs400_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); |
| 215 | int rs400_gart_init(struct radeon_device *rdev); | 218 | int rs400_gart_init(struct radeon_device *rdev); |
| @@ -232,8 +235,9 @@ int rs600_irq_process(struct radeon_device *rdev); | |||
| 232 | void rs600_irq_disable(struct radeon_device *rdev); | 235 | void rs600_irq_disable(struct radeon_device *rdev); |
| 233 | u32 rs600_get_vblank_counter(struct radeon_device *rdev, int crtc); | 236 | u32 rs600_get_vblank_counter(struct radeon_device *rdev, int crtc); |
| 234 | void rs600_gart_tlb_flush(struct radeon_device *rdev); | 237 | void rs600_gart_tlb_flush(struct radeon_device *rdev); |
| 238 | uint64_t rs600_gart_get_page_entry(uint64_t addr, uint32_t flags); | ||
| 235 | void rs600_gart_set_page(struct radeon_device *rdev, unsigned i, | 239 | void rs600_gart_set_page(struct radeon_device *rdev, unsigned i, |
| 236 | uint64_t addr, uint32_t flags); | 240 | uint64_t entry); |
| 237 | uint32_t rs600_mc_rreg(struct radeon_device *rdev, uint32_t reg); | 241 | uint32_t rs600_mc_rreg(struct radeon_device *rdev, uint32_t reg); |
| 238 | void rs600_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); | 242 | void rs600_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); |
| 239 | void rs600_bandwidth_update(struct radeon_device *rdev); | 243 | void rs600_bandwidth_update(struct radeon_device *rdev); |
diff --git a/drivers/gpu/drm/radeon/radeon_benchmark.c b/drivers/gpu/drm/radeon/radeon_benchmark.c index 9e7f23dd14bd..87d5fb21cb61 100644 --- a/drivers/gpu/drm/radeon/radeon_benchmark.c +++ b/drivers/gpu/drm/radeon/radeon_benchmark.c | |||
| @@ -34,7 +34,8 @@ | |||
| 34 | 34 | ||
| 35 | static int radeon_benchmark_do_move(struct radeon_device *rdev, unsigned size, | 35 | static int radeon_benchmark_do_move(struct radeon_device *rdev, unsigned size, |
| 36 | uint64_t saddr, uint64_t daddr, | 36 | uint64_t saddr, uint64_t daddr, |
| 37 | int flag, int n) | 37 | int flag, int n, |
| 38 | struct reservation_object *resv) | ||
| 38 | { | 39 | { |
| 39 | unsigned long start_jiffies; | 40 | unsigned long start_jiffies; |
| 40 | unsigned long end_jiffies; | 41 | unsigned long end_jiffies; |
| @@ -47,12 +48,12 @@ static int radeon_benchmark_do_move(struct radeon_device *rdev, unsigned size, | |||
| 47 | case RADEON_BENCHMARK_COPY_DMA: | 48 | case RADEON_BENCHMARK_COPY_DMA: |
| 48 | fence = radeon_copy_dma(rdev, saddr, daddr, | 49 | fence = radeon_copy_dma(rdev, saddr, daddr, |
| 49 | size / RADEON_GPU_PAGE_SIZE, | 50 | size / RADEON_GPU_PAGE_SIZE, |
| 50 | NULL); | 51 | resv); |
| 51 | break; | 52 | break; |
| 52 | case RADEON_BENCHMARK_COPY_BLIT: | 53 | case RADEON_BENCHMARK_COPY_BLIT: |
| 53 | fence = radeon_copy_blit(rdev, saddr, daddr, | 54 | fence = radeon_copy_blit(rdev, saddr, daddr, |
| 54 | size / RADEON_GPU_PAGE_SIZE, | 55 | size / RADEON_GPU_PAGE_SIZE, |
| 55 | NULL); | 56 | resv); |
| 56 | break; | 57 | break; |
| 57 | default: | 58 | default: |
| 58 | DRM_ERROR("Unknown copy method\n"); | 59 | DRM_ERROR("Unknown copy method\n"); |
| @@ -120,7 +121,8 @@ static void radeon_benchmark_move(struct radeon_device *rdev, unsigned size, | |||
| 120 | 121 | ||
| 121 | if (rdev->asic->copy.dma) { | 122 | if (rdev->asic->copy.dma) { |
| 122 | time = radeon_benchmark_do_move(rdev, size, saddr, daddr, | 123 | time = radeon_benchmark_do_move(rdev, size, saddr, daddr, |
| 123 | RADEON_BENCHMARK_COPY_DMA, n); | 124 | RADEON_BENCHMARK_COPY_DMA, n, |
| 125 | dobj->tbo.resv); | ||
| 124 | if (time < 0) | 126 | if (time < 0) |
| 125 | goto out_cleanup; | 127 | goto out_cleanup; |
| 126 | if (time > 0) | 128 | if (time > 0) |
| @@ -130,7 +132,8 @@ static void radeon_benchmark_move(struct radeon_device *rdev, unsigned size, | |||
| 130 | 132 | ||
| 131 | if (rdev->asic->copy.blit) { | 133 | if (rdev->asic->copy.blit) { |
| 132 | time = radeon_benchmark_do_move(rdev, size, saddr, daddr, | 134 | time = radeon_benchmark_do_move(rdev, size, saddr, daddr, |
| 133 | RADEON_BENCHMARK_COPY_BLIT, n); | 135 | RADEON_BENCHMARK_COPY_BLIT, n, |
| 136 | dobj->tbo.resv); | ||
| 134 | if (time < 0) | 137 | if (time < 0) |
| 135 | goto out_cleanup; | 138 | goto out_cleanup; |
| 136 | if (time > 0) | 139 | if (time > 0) |
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index 0ec65168f331..bd7519fdd3f4 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
| @@ -774,6 +774,8 @@ int radeon_dummy_page_init(struct radeon_device *rdev) | |||
| 774 | rdev->dummy_page.page = NULL; | 774 | rdev->dummy_page.page = NULL; |
| 775 | return -ENOMEM; | 775 | return -ENOMEM; |
| 776 | } | 776 | } |
| 777 | rdev->dummy_page.entry = radeon_gart_get_page_entry(rdev->dummy_page.addr, | ||
| 778 | RADEON_GART_PAGE_DUMMY); | ||
| 777 | return 0; | 779 | return 0; |
| 778 | } | 780 | } |
| 779 | 781 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c index 102116902a07..913fafa597ad 100644 --- a/drivers/gpu/drm/radeon/radeon_display.c +++ b/drivers/gpu/drm/radeon/radeon_display.c | |||
| @@ -960,6 +960,9 @@ void radeon_compute_pll_avivo(struct radeon_pll *pll, | |||
| 960 | if (pll->flags & RADEON_PLL_USE_FRAC_FB_DIV && | 960 | if (pll->flags & RADEON_PLL_USE_FRAC_FB_DIV && |
| 961 | pll->flags & RADEON_PLL_USE_REF_DIV) | 961 | pll->flags & RADEON_PLL_USE_REF_DIV) |
| 962 | ref_div_max = pll->reference_div; | 962 | ref_div_max = pll->reference_div; |
| 963 | else if (pll->flags & RADEON_PLL_PREFER_MINM_OVER_MAXP) | ||
| 964 | /* fix for problems on RS880 */ | ||
| 965 | ref_div_max = min(pll->max_ref_div, 7u); | ||
| 963 | else | 966 | else |
| 964 | ref_div_max = pll->max_ref_div; | 967 | ref_div_max = pll->max_ref_div; |
| 965 | 968 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_gart.c b/drivers/gpu/drm/radeon/radeon_gart.c index 84146d5901aa..5450fa95a47e 100644 --- a/drivers/gpu/drm/radeon/radeon_gart.c +++ b/drivers/gpu/drm/radeon/radeon_gart.c | |||
| @@ -165,6 +165,19 @@ int radeon_gart_table_vram_pin(struct radeon_device *rdev) | |||
| 165 | radeon_bo_unpin(rdev->gart.robj); | 165 | radeon_bo_unpin(rdev->gart.robj); |
| 166 | radeon_bo_unreserve(rdev->gart.robj); | 166 | radeon_bo_unreserve(rdev->gart.robj); |
| 167 | rdev->gart.table_addr = gpu_addr; | 167 | rdev->gart.table_addr = gpu_addr; |
| 168 | |||
| 169 | if (!r) { | ||
| 170 | int i; | ||
| 171 | |||
| 172 | /* We might have dropped some GART table updates while it wasn't | ||
| 173 | * mapped, restore all entries | ||
| 174 | */ | ||
| 175 | for (i = 0; i < rdev->gart.num_gpu_pages; i++) | ||
| 176 | radeon_gart_set_page(rdev, i, rdev->gart.pages_entry[i]); | ||
| 177 | mb(); | ||
| 178 | radeon_gart_tlb_flush(rdev); | ||
| 179 | } | ||
| 180 | |||
| 168 | return r; | 181 | return r; |
| 169 | } | 182 | } |
| 170 | 183 | ||
| @@ -228,7 +241,6 @@ void radeon_gart_unbind(struct radeon_device *rdev, unsigned offset, | |||
| 228 | unsigned t; | 241 | unsigned t; |
| 229 | unsigned p; | 242 | unsigned p; |
| 230 | int i, j; | 243 | int i, j; |
| 231 | u64 page_base; | ||
| 232 | 244 | ||
| 233 | if (!rdev->gart.ready) { | 245 | if (!rdev->gart.ready) { |
| 234 | WARN(1, "trying to unbind memory from uninitialized GART !\n"); | 246 | WARN(1, "trying to unbind memory from uninitialized GART !\n"); |
| @@ -239,14 +251,12 @@ void radeon_gart_unbind(struct radeon_device *rdev, unsigned offset, | |||
| 239 | for (i = 0; i < pages; i++, p++) { | 251 | for (i = 0; i < pages; i++, p++) { |
| 240 | if (rdev->gart.pages[p]) { | 252 | if (rdev->gart.pages[p]) { |
| 241 | rdev->gart.pages[p] = NULL; | 253 | rdev->gart.pages[p] = NULL; |
| 242 | rdev->gart.pages_addr[p] = rdev->dummy_page.addr; | ||
| 243 | page_base = rdev->gart.pages_addr[p]; | ||
| 244 | for (j = 0; j < (PAGE_SIZE / RADEON_GPU_PAGE_SIZE); j++, t++) { | 254 | for (j = 0; j < (PAGE_SIZE / RADEON_GPU_PAGE_SIZE); j++, t++) { |
| 255 | rdev->gart.pages_entry[t] = rdev->dummy_page.entry; | ||
| 245 | if (rdev->gart.ptr) { | 256 | if (rdev->gart.ptr) { |
| 246 | radeon_gart_set_page(rdev, t, page_base, | 257 | radeon_gart_set_page(rdev, t, |
| 247 | RADEON_GART_PAGE_DUMMY); | 258 | rdev->dummy_page.entry); |
| 248 | } | 259 | } |
| 249 | page_base += RADEON_GPU_PAGE_SIZE; | ||
| 250 | } | 260 | } |
| 251 | } | 261 | } |
| 252 | } | 262 | } |
| @@ -274,7 +284,7 @@ int radeon_gart_bind(struct radeon_device *rdev, unsigned offset, | |||
| 274 | { | 284 | { |
| 275 | unsigned t; | 285 | unsigned t; |
| 276 | unsigned p; | 286 | unsigned p; |
| 277 | uint64_t page_base; | 287 | uint64_t page_base, page_entry; |
| 278 | int i, j; | 288 | int i, j; |
| 279 | 289 | ||
| 280 | if (!rdev->gart.ready) { | 290 | if (!rdev->gart.ready) { |
| @@ -285,14 +295,15 @@ int radeon_gart_bind(struct radeon_device *rdev, unsigned offset, | |||
| 285 | p = t / (PAGE_SIZE / RADEON_GPU_PAGE_SIZE); | 295 | p = t / (PAGE_SIZE / RADEON_GPU_PAGE_SIZE); |
| 286 | 296 | ||
| 287 | for (i = 0; i < pages; i++, p++) { | 297 | for (i = 0; i < pages; i++, p++) { |
| 288 | rdev->gart.pages_addr[p] = dma_addr[i]; | ||
| 289 | rdev->gart.pages[p] = pagelist[i]; | 298 | rdev->gart.pages[p] = pagelist[i]; |
| 290 | if (rdev->gart.ptr) { | 299 | page_base = dma_addr[i]; |
| 291 | page_base = rdev->gart.pages_addr[p]; | 300 | for (j = 0; j < (PAGE_SIZE / RADEON_GPU_PAGE_SIZE); j++, t++) { |
| 292 | for (j = 0; j < (PAGE_SIZE / RADEON_GPU_PAGE_SIZE); j++, t++) { | 301 | page_entry = radeon_gart_get_page_entry(page_base, flags); |
| 293 | radeon_gart_set_page(rdev, t, page_base, flags); | 302 | rdev->gart.pages_entry[t] = page_entry; |
| 294 | page_base += RADEON_GPU_PAGE_SIZE; | 303 | if (rdev->gart.ptr) { |
| 304 | radeon_gart_set_page(rdev, t, page_entry); | ||
| 295 | } | 305 | } |
| 306 | page_base += RADEON_GPU_PAGE_SIZE; | ||
| 296 | } | 307 | } |
| 297 | } | 308 | } |
| 298 | mb(); | 309 | mb(); |
| @@ -334,16 +345,15 @@ int radeon_gart_init(struct radeon_device *rdev) | |||
| 334 | radeon_gart_fini(rdev); | 345 | radeon_gart_fini(rdev); |
| 335 | return -ENOMEM; | 346 | return -ENOMEM; |
| 336 | } | 347 | } |
| 337 | rdev->gart.pages_addr = vzalloc(sizeof(dma_addr_t) * | 348 | rdev->gart.pages_entry = vmalloc(sizeof(uint64_t) * |
| 338 | rdev->gart.num_cpu_pages); | 349 | rdev->gart.num_gpu_pages); |
| 339 | if (rdev->gart.pages_addr == NULL) { | 350 | if (rdev->gart.pages_entry == NULL) { |
| 340 | radeon_gart_fini(rdev); | 351 | radeon_gart_fini(rdev); |
| 341 | return -ENOMEM; | 352 | return -ENOMEM; |
| 342 | } | 353 | } |
| 343 | /* set GART entry to point to the dummy page by default */ | 354 | /* set GART entry to point to the dummy page by default */ |
| 344 | for (i = 0; i < rdev->gart.num_cpu_pages; i++) { | 355 | for (i = 0; i < rdev->gart.num_gpu_pages; i++) |
| 345 | rdev->gart.pages_addr[i] = rdev->dummy_page.addr; | 356 | rdev->gart.pages_entry[i] = rdev->dummy_page.entry; |
| 346 | } | ||
| 347 | return 0; | 357 | return 0; |
| 348 | } | 358 | } |
| 349 | 359 | ||
| @@ -356,15 +366,15 @@ int radeon_gart_init(struct radeon_device *rdev) | |||
| 356 | */ | 366 | */ |
| 357 | void radeon_gart_fini(struct radeon_device *rdev) | 367 | void radeon_gart_fini(struct radeon_device *rdev) |
| 358 | { | 368 | { |
| 359 | if (rdev->gart.pages && rdev->gart.pages_addr && rdev->gart.ready) { | 369 | if (rdev->gart.ready) { |
| 360 | /* unbind pages */ | 370 | /* unbind pages */ |
| 361 | radeon_gart_unbind(rdev, 0, rdev->gart.num_cpu_pages); | 371 | radeon_gart_unbind(rdev, 0, rdev->gart.num_cpu_pages); |
| 362 | } | 372 | } |
| 363 | rdev->gart.ready = false; | 373 | rdev->gart.ready = false; |
| 364 | vfree(rdev->gart.pages); | 374 | vfree(rdev->gart.pages); |
| 365 | vfree(rdev->gart.pages_addr); | 375 | vfree(rdev->gart.pages_entry); |
| 366 | rdev->gart.pages = NULL; | 376 | rdev->gart.pages = NULL; |
| 367 | rdev->gart.pages_addr = NULL; | 377 | rdev->gart.pages_entry = NULL; |
| 368 | 378 | ||
| 369 | radeon_dummy_page_fini(rdev); | 379 | radeon_dummy_page_fini(rdev); |
| 370 | } | 380 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c index a46f73737994..ac3c1310b953 100644 --- a/drivers/gpu/drm/radeon/radeon_gem.c +++ b/drivers/gpu/drm/radeon/radeon_gem.c | |||
| @@ -146,7 +146,8 @@ int radeon_gem_object_open(struct drm_gem_object *obj, struct drm_file *file_pri | |||
| 146 | struct radeon_bo_va *bo_va; | 146 | struct radeon_bo_va *bo_va; |
| 147 | int r; | 147 | int r; |
| 148 | 148 | ||
| 149 | if (rdev->family < CHIP_CAYMAN) { | 149 | if ((rdev->family < CHIP_CAYMAN) || |
| 150 | (!rdev->accel_working)) { | ||
| 150 | return 0; | 151 | return 0; |
| 151 | } | 152 | } |
| 152 | 153 | ||
| @@ -176,7 +177,8 @@ void radeon_gem_object_close(struct drm_gem_object *obj, | |||
| 176 | struct radeon_bo_va *bo_va; | 177 | struct radeon_bo_va *bo_va; |
| 177 | int r; | 178 | int r; |
| 178 | 179 | ||
| 179 | if (rdev->family < CHIP_CAYMAN) { | 180 | if ((rdev->family < CHIP_CAYMAN) || |
| 181 | (!rdev->accel_working)) { | ||
| 180 | return; | 182 | return; |
| 181 | } | 183 | } |
| 182 | 184 | ||
| @@ -576,7 +578,7 @@ error_unreserve: | |||
| 576 | error_free: | 578 | error_free: |
| 577 | drm_free_large(vm_bos); | 579 | drm_free_large(vm_bos); |
| 578 | 580 | ||
| 579 | if (r) | 581 | if (r && r != -ERESTARTSYS) |
| 580 | DRM_ERROR("Couldn't update BO_VA (%d)\n", r); | 582 | DRM_ERROR("Couldn't update BO_VA (%d)\n", r); |
| 581 | } | 583 | } |
| 582 | 584 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_kfd.c b/drivers/gpu/drm/radeon/radeon_kfd.c index 242fd8b1b221..bef9a0953284 100644 --- a/drivers/gpu/drm/radeon/radeon_kfd.c +++ b/drivers/gpu/drm/radeon/radeon_kfd.c | |||
| @@ -72,7 +72,7 @@ static int kgd_init_pipeline(struct kgd_dev *kgd, uint32_t pipe_id, | |||
| 72 | static int kgd_hqd_load(struct kgd_dev *kgd, void *mqd, uint32_t pipe_id, | 72 | static int kgd_hqd_load(struct kgd_dev *kgd, void *mqd, uint32_t pipe_id, |
| 73 | uint32_t queue_id, uint32_t __user *wptr); | 73 | uint32_t queue_id, uint32_t __user *wptr); |
| 74 | 74 | ||
| 75 | static bool kgd_hqd_is_occupies(struct kgd_dev *kgd, uint64_t queue_address, | 75 | static bool kgd_hqd_is_occupied(struct kgd_dev *kgd, uint64_t queue_address, |
| 76 | uint32_t pipe_id, uint32_t queue_id); | 76 | uint32_t pipe_id, uint32_t queue_id); |
| 77 | 77 | ||
| 78 | static int kgd_hqd_destroy(struct kgd_dev *kgd, uint32_t reset_type, | 78 | static int kgd_hqd_destroy(struct kgd_dev *kgd, uint32_t reset_type, |
| @@ -92,7 +92,7 @@ static const struct kfd2kgd_calls kfd2kgd = { | |||
| 92 | .init_memory = kgd_init_memory, | 92 | .init_memory = kgd_init_memory, |
| 93 | .init_pipeline = kgd_init_pipeline, | 93 | .init_pipeline = kgd_init_pipeline, |
| 94 | .hqd_load = kgd_hqd_load, | 94 | .hqd_load = kgd_hqd_load, |
| 95 | .hqd_is_occupies = kgd_hqd_is_occupies, | 95 | .hqd_is_occupied = kgd_hqd_is_occupied, |
| 96 | .hqd_destroy = kgd_hqd_destroy, | 96 | .hqd_destroy = kgd_hqd_destroy, |
| 97 | .get_fw_version = get_fw_version | 97 | .get_fw_version = get_fw_version |
| 98 | }; | 98 | }; |
| @@ -101,6 +101,7 @@ static const struct kgd2kfd_calls *kgd2kfd; | |||
| 101 | 101 | ||
| 102 | bool radeon_kfd_init(void) | 102 | bool radeon_kfd_init(void) |
| 103 | { | 103 | { |
| 104 | #if defined(CONFIG_HSA_AMD_MODULE) | ||
| 104 | bool (*kgd2kfd_init_p)(unsigned, const struct kfd2kgd_calls*, | 105 | bool (*kgd2kfd_init_p)(unsigned, const struct kfd2kgd_calls*, |
| 105 | const struct kgd2kfd_calls**); | 106 | const struct kgd2kfd_calls**); |
| 106 | 107 | ||
| @@ -117,6 +118,17 @@ bool radeon_kfd_init(void) | |||
| 117 | } | 118 | } |
| 118 | 119 | ||
| 119 | return true; | 120 | return true; |
| 121 | #elif defined(CONFIG_HSA_AMD) | ||
| 122 | if (!kgd2kfd_init(KFD_INTERFACE_VERSION, &kfd2kgd, &kgd2kfd)) { | ||
| 123 | kgd2kfd = NULL; | ||
| 124 | |||
| 125 | return false; | ||
| 126 | } | ||
| 127 | |||
| 128 | return true; | ||
| 129 | #else | ||
| 130 | return false; | ||
| 131 | #endif | ||
| 120 | } | 132 | } |
| 121 | 133 | ||
| 122 | void radeon_kfd_fini(void) | 134 | void radeon_kfd_fini(void) |
| @@ -378,6 +390,10 @@ static int kgd_set_pasid_vmid_mapping(struct kgd_dev *kgd, unsigned int pasid, | |||
| 378 | cpu_relax(); | 390 | cpu_relax(); |
| 379 | write_register(kgd, ATC_VMID_PASID_MAPPING_UPDATE_STATUS, 1U << vmid); | 391 | write_register(kgd, ATC_VMID_PASID_MAPPING_UPDATE_STATUS, 1U << vmid); |
| 380 | 392 | ||
| 393 | /* Mapping vmid to pasid also for IH block */ | ||
| 394 | write_register(kgd, IH_VMID_0_LUT + vmid * sizeof(uint32_t), | ||
| 395 | pasid_mapping); | ||
| 396 | |||
| 381 | return 0; | 397 | return 0; |
| 382 | } | 398 | } |
| 383 | 399 | ||
| @@ -420,7 +436,7 @@ static int kgd_init_memory(struct kgd_dev *kgd) | |||
| 420 | static int kgd_init_pipeline(struct kgd_dev *kgd, uint32_t pipe_id, | 436 | static int kgd_init_pipeline(struct kgd_dev *kgd, uint32_t pipe_id, |
| 421 | uint32_t hpd_size, uint64_t hpd_gpu_addr) | 437 | uint32_t hpd_size, uint64_t hpd_gpu_addr) |
| 422 | { | 438 | { |
| 423 | uint32_t mec = (++pipe_id / CIK_PIPE_PER_MEC) + 1; | 439 | uint32_t mec = (pipe_id / CIK_PIPE_PER_MEC) + 1; |
| 424 | uint32_t pipe = (pipe_id % CIK_PIPE_PER_MEC); | 440 | uint32_t pipe = (pipe_id % CIK_PIPE_PER_MEC); |
| 425 | 441 | ||
| 426 | lock_srbm(kgd, mec, pipe, 0, 0); | 442 | lock_srbm(kgd, mec, pipe, 0, 0); |
| @@ -517,7 +533,7 @@ static int kgd_hqd_load(struct kgd_dev *kgd, void *mqd, uint32_t pipe_id, | |||
| 517 | return 0; | 533 | return 0; |
| 518 | } | 534 | } |
| 519 | 535 | ||
| 520 | static bool kgd_hqd_is_occupies(struct kgd_dev *kgd, uint64_t queue_address, | 536 | static bool kgd_hqd_is_occupied(struct kgd_dev *kgd, uint64_t queue_address, |
| 521 | uint32_t pipe_id, uint32_t queue_id) | 537 | uint32_t pipe_id, uint32_t queue_id) |
| 522 | { | 538 | { |
| 523 | uint32_t act; | 539 | uint32_t act; |
| @@ -556,6 +572,7 @@ static int kgd_hqd_destroy(struct kgd_dev *kgd, uint32_t reset_type, | |||
| 556 | if (timeout == 0) { | 572 | if (timeout == 0) { |
| 557 | pr_err("kfd: cp queue preemption time out (%dms)\n", | 573 | pr_err("kfd: cp queue preemption time out (%dms)\n", |
| 558 | temp); | 574 | temp); |
| 575 | release_queue(kgd); | ||
| 559 | return -ETIME; | 576 | return -ETIME; |
| 560 | } | 577 | } |
| 561 | msleep(20); | 578 | msleep(20); |
diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c index 3cf9c1fa6475..686411e4e4f6 100644 --- a/drivers/gpu/drm/radeon/radeon_kms.c +++ b/drivers/gpu/drm/radeon/radeon_kms.c | |||
| @@ -605,14 +605,14 @@ int radeon_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv) | |||
| 605 | return -ENOMEM; | 605 | return -ENOMEM; |
| 606 | } | 606 | } |
| 607 | 607 | ||
| 608 | vm = &fpriv->vm; | ||
| 609 | r = radeon_vm_init(rdev, vm); | ||
| 610 | if (r) { | ||
| 611 | kfree(fpriv); | ||
| 612 | return r; | ||
| 613 | } | ||
| 614 | |||
| 615 | if (rdev->accel_working) { | 608 | if (rdev->accel_working) { |
| 609 | vm = &fpriv->vm; | ||
| 610 | r = radeon_vm_init(rdev, vm); | ||
| 611 | if (r) { | ||
| 612 | kfree(fpriv); | ||
| 613 | return r; | ||
| 614 | } | ||
| 615 | |||
| 616 | r = radeon_bo_reserve(rdev->ring_tmp_bo.bo, false); | 616 | r = radeon_bo_reserve(rdev->ring_tmp_bo.bo, false); |
| 617 | if (r) { | 617 | if (r) { |
| 618 | radeon_vm_fini(rdev, vm); | 618 | radeon_vm_fini(rdev, vm); |
| @@ -668,9 +668,9 @@ void radeon_driver_postclose_kms(struct drm_device *dev, | |||
| 668 | radeon_vm_bo_rmv(rdev, vm->ib_bo_va); | 668 | radeon_vm_bo_rmv(rdev, vm->ib_bo_va); |
| 669 | radeon_bo_unreserve(rdev->ring_tmp_bo.bo); | 669 | radeon_bo_unreserve(rdev->ring_tmp_bo.bo); |
| 670 | } | 670 | } |
| 671 | radeon_vm_fini(rdev, vm); | ||
| 671 | } | 672 | } |
| 672 | 673 | ||
| 673 | radeon_vm_fini(rdev, vm); | ||
| 674 | kfree(fpriv); | 674 | kfree(fpriv); |
| 675 | file_priv->driver_priv = NULL; | 675 | file_priv->driver_priv = NULL; |
| 676 | } | 676 | } |
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/radeon_state.c b/drivers/gpu/drm/radeon/radeon_state.c index 535403e0c8a2..15aee723db77 100644 --- a/drivers/gpu/drm/radeon/radeon_state.c +++ b/drivers/gpu/drm/radeon/radeon_state.c | |||
| @@ -1703,7 +1703,7 @@ static int radeon_cp_dispatch_texture(struct drm_device * dev, | |||
| 1703 | u32 format; | 1703 | u32 format; |
| 1704 | u32 *buffer; | 1704 | u32 *buffer; |
| 1705 | const u8 __user *data; | 1705 | const u8 __user *data; |
| 1706 | int size, dwords, tex_width, blit_width, spitch; | 1706 | unsigned int size, dwords, tex_width, blit_width, spitch; |
| 1707 | u32 height; | 1707 | u32 height; |
| 1708 | int i; | 1708 | int i; |
| 1709 | u32 texpitch, microtile; | 1709 | u32 texpitch, microtile; |
diff --git a/drivers/gpu/drm/radeon/radeon_test.c b/drivers/gpu/drm/radeon/radeon_test.c index 07b506b41008..791818165c76 100644 --- a/drivers/gpu/drm/radeon/radeon_test.c +++ b/drivers/gpu/drm/radeon/radeon_test.c | |||
| @@ -119,11 +119,11 @@ static void radeon_do_test_moves(struct radeon_device *rdev, int flag) | |||
| 119 | if (ring == R600_RING_TYPE_DMA_INDEX) | 119 | if (ring == R600_RING_TYPE_DMA_INDEX) |
| 120 | fence = radeon_copy_dma(rdev, gtt_addr, vram_addr, | 120 | fence = radeon_copy_dma(rdev, gtt_addr, vram_addr, |
| 121 | size / RADEON_GPU_PAGE_SIZE, | 121 | size / RADEON_GPU_PAGE_SIZE, |
| 122 | NULL); | 122 | vram_obj->tbo.resv); |
| 123 | else | 123 | else |
| 124 | fence = radeon_copy_blit(rdev, gtt_addr, vram_addr, | 124 | fence = radeon_copy_blit(rdev, gtt_addr, vram_addr, |
| 125 | size / RADEON_GPU_PAGE_SIZE, | 125 | size / RADEON_GPU_PAGE_SIZE, |
| 126 | NULL); | 126 | vram_obj->tbo.resv); |
| 127 | if (IS_ERR(fence)) { | 127 | if (IS_ERR(fence)) { |
| 128 | DRM_ERROR("Failed GTT->VRAM copy %d\n", i); | 128 | DRM_ERROR("Failed GTT->VRAM copy %d\n", i); |
| 129 | r = PTR_ERR(fence); | 129 | r = PTR_ERR(fence); |
| @@ -170,11 +170,11 @@ static void radeon_do_test_moves(struct radeon_device *rdev, int flag) | |||
| 170 | if (ring == R600_RING_TYPE_DMA_INDEX) | 170 | if (ring == R600_RING_TYPE_DMA_INDEX) |
| 171 | fence = radeon_copy_dma(rdev, vram_addr, gtt_addr, | 171 | fence = radeon_copy_dma(rdev, vram_addr, gtt_addr, |
| 172 | size / RADEON_GPU_PAGE_SIZE, | 172 | size / RADEON_GPU_PAGE_SIZE, |
| 173 | NULL); | 173 | vram_obj->tbo.resv); |
| 174 | else | 174 | else |
| 175 | fence = radeon_copy_blit(rdev, vram_addr, gtt_addr, | 175 | fence = radeon_copy_blit(rdev, vram_addr, gtt_addr, |
| 176 | size / RADEON_GPU_PAGE_SIZE, | 176 | size / RADEON_GPU_PAGE_SIZE, |
| 177 | NULL); | 177 | vram_obj->tbo.resv); |
| 178 | if (IS_ERR(fence)) { | 178 | if (IS_ERR(fence)) { |
| 179 | DRM_ERROR("Failed VRAM->GTT copy %d\n", i); | 179 | DRM_ERROR("Failed VRAM->GTT copy %d\n", i); |
| 180 | r = PTR_ERR(fence); | 180 | r = PTR_ERR(fence); |
diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c index cde48c42b30a..2a5a4a9e772d 100644 --- a/drivers/gpu/drm/radeon/radeon_vm.c +++ b/drivers/gpu/drm/radeon/radeon_vm.c | |||
| @@ -587,10 +587,8 @@ uint64_t radeon_vm_map_gart(struct radeon_device *rdev, uint64_t addr) | |||
| 587 | uint64_t result; | 587 | uint64_t result; |
| 588 | 588 | ||
| 589 | /* page table offset */ | 589 | /* page table offset */ |
| 590 | result = rdev->gart.pages_addr[addr >> PAGE_SHIFT]; | 590 | result = rdev->gart.pages_entry[addr >> RADEON_GPU_PAGE_SHIFT]; |
| 591 | 591 | result &= ~RADEON_GPU_PAGE_MASK; | |
| 592 | /* in case cpu page size != gpu page size*/ | ||
| 593 | result |= addr & (~PAGE_MASK); | ||
| 594 | 592 | ||
| 595 | return result; | 593 | return result; |
| 596 | } | 594 | } |
| @@ -745,9 +743,11 @@ static void radeon_vm_frag_ptes(struct radeon_device *rdev, | |||
| 745 | */ | 743 | */ |
| 746 | 744 | ||
| 747 | /* NI is optimized for 256KB fragments, SI and newer for 64KB */ | 745 | /* NI is optimized for 256KB fragments, SI and newer for 64KB */ |
| 748 | uint64_t frag_flags = rdev->family == CHIP_CAYMAN ? | 746 | uint64_t frag_flags = ((rdev->family == CHIP_CAYMAN) || |
| 747 | (rdev->family == CHIP_ARUBA)) ? | ||
| 749 | R600_PTE_FRAG_256KB : R600_PTE_FRAG_64KB; | 748 | R600_PTE_FRAG_256KB : R600_PTE_FRAG_64KB; |
| 750 | uint64_t frag_align = rdev->family == CHIP_CAYMAN ? 0x200 : 0x80; | 749 | uint64_t frag_align = ((rdev->family == CHIP_CAYMAN) || |
| 750 | (rdev->family == CHIP_ARUBA)) ? 0x200 : 0x80; | ||
| 751 | 751 | ||
| 752 | uint64_t frag_start = ALIGN(pe_start, frag_align); | 752 | uint64_t frag_start = ALIGN(pe_start, frag_align); |
| 753 | uint64_t frag_end = pe_end & ~(frag_align - 1); | 753 | uint64_t frag_end = pe_end & ~(frag_align - 1); |
diff --git a/drivers/gpu/drm/radeon/rs400.c b/drivers/gpu/drm/radeon/rs400.c index c5799f16aa4b..34e3235f41d2 100644 --- a/drivers/gpu/drm/radeon/rs400.c +++ b/drivers/gpu/drm/radeon/rs400.c | |||
| @@ -212,11 +212,9 @@ void rs400_gart_fini(struct radeon_device *rdev) | |||
| 212 | #define RS400_PTE_WRITEABLE (1 << 2) | 212 | #define RS400_PTE_WRITEABLE (1 << 2) |
| 213 | #define RS400_PTE_READABLE (1 << 3) | 213 | #define RS400_PTE_READABLE (1 << 3) |
| 214 | 214 | ||
| 215 | void rs400_gart_set_page(struct radeon_device *rdev, unsigned i, | 215 | uint64_t rs400_gart_get_page_entry(uint64_t addr, uint32_t flags) |
| 216 | uint64_t addr, uint32_t flags) | ||
| 217 | { | 216 | { |
| 218 | uint32_t entry; | 217 | uint32_t entry; |
| 219 | u32 *gtt = rdev->gart.ptr; | ||
| 220 | 218 | ||
| 221 | entry = (lower_32_bits(addr) & PAGE_MASK) | | 219 | entry = (lower_32_bits(addr) & PAGE_MASK) | |
| 222 | ((upper_32_bits(addr) & 0xff) << 4); | 220 | ((upper_32_bits(addr) & 0xff) << 4); |
| @@ -226,8 +224,14 @@ void rs400_gart_set_page(struct radeon_device *rdev, unsigned i, | |||
| 226 | entry |= RS400_PTE_WRITEABLE; | 224 | entry |= RS400_PTE_WRITEABLE; |
| 227 | if (!(flags & RADEON_GART_PAGE_SNOOP)) | 225 | if (!(flags & RADEON_GART_PAGE_SNOOP)) |
| 228 | entry |= RS400_PTE_UNSNOOPED; | 226 | entry |= RS400_PTE_UNSNOOPED; |
| 229 | entry = cpu_to_le32(entry); | 227 | return entry; |
| 230 | gtt[i] = entry; | 228 | } |
| 229 | |||
| 230 | void rs400_gart_set_page(struct radeon_device *rdev, unsigned i, | ||
| 231 | uint64_t entry) | ||
| 232 | { | ||
| 233 | u32 *gtt = rdev->gart.ptr; | ||
| 234 | gtt[i] = cpu_to_le32(lower_32_bits(entry)); | ||
| 231 | } | 235 | } |
| 232 | 236 | ||
| 233 | int rs400_mc_wait_for_idle(struct radeon_device *rdev) | 237 | int rs400_mc_wait_for_idle(struct radeon_device *rdev) |
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c index 9acb1c3c005b..74bce91aecc1 100644 --- a/drivers/gpu/drm/radeon/rs600.c +++ b/drivers/gpu/drm/radeon/rs600.c | |||
| @@ -625,11 +625,8 @@ static void rs600_gart_fini(struct radeon_device *rdev) | |||
| 625 | radeon_gart_table_vram_free(rdev); | 625 | radeon_gart_table_vram_free(rdev); |
| 626 | } | 626 | } |
| 627 | 627 | ||
| 628 | void rs600_gart_set_page(struct radeon_device *rdev, unsigned i, | 628 | uint64_t rs600_gart_get_page_entry(uint64_t addr, uint32_t flags) |
| 629 | uint64_t addr, uint32_t flags) | ||
| 630 | { | 629 | { |
| 631 | void __iomem *ptr = (void *)rdev->gart.ptr; | ||
| 632 | |||
| 633 | addr = addr & 0xFFFFFFFFFFFFF000ULL; | 630 | addr = addr & 0xFFFFFFFFFFFFF000ULL; |
| 634 | addr |= R600_PTE_SYSTEM; | 631 | addr |= R600_PTE_SYSTEM; |
| 635 | if (flags & RADEON_GART_PAGE_VALID) | 632 | if (flags & RADEON_GART_PAGE_VALID) |
| @@ -640,7 +637,14 @@ void rs600_gart_set_page(struct radeon_device *rdev, unsigned i, | |||
| 640 | addr |= R600_PTE_WRITEABLE; | 637 | addr |= R600_PTE_WRITEABLE; |
| 641 | if (flags & RADEON_GART_PAGE_SNOOP) | 638 | if (flags & RADEON_GART_PAGE_SNOOP) |
| 642 | addr |= R600_PTE_SNOOPED; | 639 | addr |= R600_PTE_SNOOPED; |
| 643 | writeq(addr, ptr + (i * 8)); | 640 | return addr; |
| 641 | } | ||
| 642 | |||
| 643 | void rs600_gart_set_page(struct radeon_device *rdev, unsigned i, | ||
| 644 | uint64_t entry) | ||
| 645 | { | ||
| 646 | void __iomem *ptr = (void *)rdev->gart.ptr; | ||
| 647 | writeq(entry, ptr + (i * 8)); | ||
| 644 | } | 648 | } |
| 645 | 649 | ||
| 646 | int rs600_irq_set(struct radeon_device *rdev) | 650 | int rs600_irq_set(struct radeon_device *rdev) |
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..83207929fc62 100644 --- a/drivers/gpu/drm/radeon/si_dma.c +++ b/drivers/gpu/drm/radeon/si_dma.c | |||
| @@ -123,7 +123,6 @@ void si_dma_vm_write_pages(struct radeon_device *rdev, | |||
| 123 | for (; ndw > 0; ndw -= 2, --count, pe += 8) { | 123 | for (; ndw > 0; ndw -= 2, --count, pe += 8) { |
| 124 | if (flags & R600_PTE_SYSTEM) { | 124 | if (flags & R600_PTE_SYSTEM) { |
| 125 | value = radeon_vm_map_gart(rdev, addr); | 125 | value = radeon_vm_map_gart(rdev, addr); |
| 126 | value &= 0xFFFFFFFFFFFFF000ULL; | ||
| 127 | } else if (flags & R600_PTE_VALID) { | 126 | } else if (flags & R600_PTE_VALID) { |
| 128 | value = addr; | 127 | value = addr; |
| 129 | } else { | 128 | } else { |
| @@ -206,6 +205,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)); | 205 | 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)); | 206 | radeon_ring_write(ring, (0xf << 16) | (VM_INVALIDATE_REQUEST >> 2)); |
| 208 | radeon_ring_write(ring, 1 << vm_id); | 207 | radeon_ring_write(ring, 1 << vm_id); |
| 208 | |||
| 209 | /* wait for invalidate to complete */ | ||
| 210 | radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_POLL_REG_MEM, 0, 0, 0, 0)); | ||
| 211 | radeon_ring_write(ring, VM_INVALIDATE_REQUEST); | ||
| 212 | radeon_ring_write(ring, 0xff << 16); /* retry */ | ||
| 213 | radeon_ring_write(ring, 1 << vm_id); /* mask */ | ||
| 214 | radeon_ring_write(ring, 0); /* value */ | ||
| 215 | radeon_ring_write(ring, (0 << 28) | 0x20); /* func(always) | poll interval */ | ||
| 209 | } | 216 | } |
| 210 | 217 | ||
| 211 | /** | 218 | /** |
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/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c index 7b5d22110f25..6c6b655defcf 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | |||
| @@ -406,11 +406,9 @@ int vmw_3d_resource_inc(struct vmw_private *dev_priv, | |||
| 406 | if (unlikely(ret != 0)) | 406 | if (unlikely(ret != 0)) |
| 407 | --dev_priv->num_3d_resources; | 407 | --dev_priv->num_3d_resources; |
| 408 | } else if (unhide_svga) { | 408 | } else if (unhide_svga) { |
| 409 | mutex_lock(&dev_priv->hw_mutex); | ||
| 410 | vmw_write(dev_priv, SVGA_REG_ENABLE, | 409 | vmw_write(dev_priv, SVGA_REG_ENABLE, |
| 411 | vmw_read(dev_priv, SVGA_REG_ENABLE) & | 410 | vmw_read(dev_priv, SVGA_REG_ENABLE) & |
| 412 | ~SVGA_REG_ENABLE_HIDE); | 411 | ~SVGA_REG_ENABLE_HIDE); |
| 413 | mutex_unlock(&dev_priv->hw_mutex); | ||
| 414 | } | 412 | } |
| 415 | 413 | ||
| 416 | mutex_unlock(&dev_priv->release_mutex); | 414 | mutex_unlock(&dev_priv->release_mutex); |
| @@ -433,13 +431,10 @@ void vmw_3d_resource_dec(struct vmw_private *dev_priv, | |||
| 433 | mutex_lock(&dev_priv->release_mutex); | 431 | mutex_lock(&dev_priv->release_mutex); |
| 434 | if (unlikely(--dev_priv->num_3d_resources == 0)) | 432 | if (unlikely(--dev_priv->num_3d_resources == 0)) |
| 435 | vmw_release_device(dev_priv); | 433 | vmw_release_device(dev_priv); |
| 436 | else if (hide_svga) { | 434 | else if (hide_svga) |
| 437 | mutex_lock(&dev_priv->hw_mutex); | ||
| 438 | vmw_write(dev_priv, SVGA_REG_ENABLE, | 435 | vmw_write(dev_priv, SVGA_REG_ENABLE, |
| 439 | vmw_read(dev_priv, SVGA_REG_ENABLE) | | 436 | vmw_read(dev_priv, SVGA_REG_ENABLE) | |
| 440 | SVGA_REG_ENABLE_HIDE); | 437 | SVGA_REG_ENABLE_HIDE); |
| 441 | mutex_unlock(&dev_priv->hw_mutex); | ||
| 442 | } | ||
| 443 | 438 | ||
| 444 | n3d = (int32_t) dev_priv->num_3d_resources; | 439 | n3d = (int32_t) dev_priv->num_3d_resources; |
| 445 | mutex_unlock(&dev_priv->release_mutex); | 440 | mutex_unlock(&dev_priv->release_mutex); |
| @@ -600,12 +595,14 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset) | |||
| 600 | dev_priv->dev = dev; | 595 | dev_priv->dev = dev; |
| 601 | dev_priv->vmw_chipset = chipset; | 596 | dev_priv->vmw_chipset = chipset; |
| 602 | dev_priv->last_read_seqno = (uint32_t) -100; | 597 | dev_priv->last_read_seqno = (uint32_t) -100; |
| 603 | mutex_init(&dev_priv->hw_mutex); | ||
| 604 | mutex_init(&dev_priv->cmdbuf_mutex); | 598 | mutex_init(&dev_priv->cmdbuf_mutex); |
| 605 | mutex_init(&dev_priv->release_mutex); | 599 | mutex_init(&dev_priv->release_mutex); |
| 606 | mutex_init(&dev_priv->binding_mutex); | 600 | mutex_init(&dev_priv->binding_mutex); |
| 607 | rwlock_init(&dev_priv->resource_lock); | 601 | rwlock_init(&dev_priv->resource_lock); |
| 608 | ttm_lock_init(&dev_priv->reservation_sem); | 602 | ttm_lock_init(&dev_priv->reservation_sem); |
| 603 | spin_lock_init(&dev_priv->hw_lock); | ||
| 604 | spin_lock_init(&dev_priv->waiter_lock); | ||
| 605 | spin_lock_init(&dev_priv->cap_lock); | ||
| 609 | 606 | ||
| 610 | for (i = vmw_res_context; i < vmw_res_max; ++i) { | 607 | for (i = vmw_res_context; i < vmw_res_max; ++i) { |
| 611 | idr_init(&dev_priv->res_idr[i]); | 608 | idr_init(&dev_priv->res_idr[i]); |
| @@ -626,14 +623,11 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset) | |||
| 626 | 623 | ||
| 627 | dev_priv->enable_fb = enable_fbdev; | 624 | dev_priv->enable_fb = enable_fbdev; |
| 628 | 625 | ||
| 629 | mutex_lock(&dev_priv->hw_mutex); | ||
| 630 | |||
| 631 | vmw_write(dev_priv, SVGA_REG_ID, SVGA_ID_2); | 626 | vmw_write(dev_priv, SVGA_REG_ID, SVGA_ID_2); |
| 632 | svga_id = vmw_read(dev_priv, SVGA_REG_ID); | 627 | svga_id = vmw_read(dev_priv, SVGA_REG_ID); |
| 633 | if (svga_id != SVGA_ID_2) { | 628 | if (svga_id != SVGA_ID_2) { |
| 634 | ret = -ENOSYS; | 629 | ret = -ENOSYS; |
| 635 | DRM_ERROR("Unsupported SVGA ID 0x%x\n", svga_id); | 630 | DRM_ERROR("Unsupported SVGA ID 0x%x\n", svga_id); |
| 636 | mutex_unlock(&dev_priv->hw_mutex); | ||
| 637 | goto out_err0; | 631 | goto out_err0; |
| 638 | } | 632 | } |
| 639 | 633 | ||
| @@ -683,10 +677,8 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset) | |||
| 683 | dev_priv->prim_bb_mem = dev_priv->vram_size; | 677 | dev_priv->prim_bb_mem = dev_priv->vram_size; |
| 684 | 678 | ||
| 685 | ret = vmw_dma_masks(dev_priv); | 679 | ret = vmw_dma_masks(dev_priv); |
| 686 | if (unlikely(ret != 0)) { | 680 | if (unlikely(ret != 0)) |
| 687 | mutex_unlock(&dev_priv->hw_mutex); | ||
| 688 | goto out_err0; | 681 | goto out_err0; |
| 689 | } | ||
| 690 | 682 | ||
| 691 | /* | 683 | /* |
| 692 | * Limit back buffer size to VRAM size. Remove this once | 684 | * Limit back buffer size to VRAM size. Remove this once |
| @@ -695,8 +687,6 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset) | |||
| 695 | if (dev_priv->prim_bb_mem > dev_priv->vram_size) | 687 | if (dev_priv->prim_bb_mem > dev_priv->vram_size) |
| 696 | dev_priv->prim_bb_mem = dev_priv->vram_size; | 688 | dev_priv->prim_bb_mem = dev_priv->vram_size; |
| 697 | 689 | ||
| 698 | mutex_unlock(&dev_priv->hw_mutex); | ||
| 699 | |||
| 700 | vmw_print_capabilities(dev_priv->capabilities); | 690 | vmw_print_capabilities(dev_priv->capabilities); |
| 701 | 691 | ||
| 702 | if (dev_priv->capabilities & SVGA_CAP_GMR2) { | 692 | if (dev_priv->capabilities & SVGA_CAP_GMR2) { |
| @@ -1160,9 +1150,7 @@ static int vmw_master_set(struct drm_device *dev, | |||
| 1160 | if (unlikely(ret != 0)) | 1150 | if (unlikely(ret != 0)) |
| 1161 | return ret; | 1151 | return ret; |
| 1162 | vmw_kms_save_vga(dev_priv); | 1152 | vmw_kms_save_vga(dev_priv); |
| 1163 | mutex_lock(&dev_priv->hw_mutex); | ||
| 1164 | vmw_write(dev_priv, SVGA_REG_TRACES, 0); | 1153 | vmw_write(dev_priv, SVGA_REG_TRACES, 0); |
| 1165 | mutex_unlock(&dev_priv->hw_mutex); | ||
| 1166 | } | 1154 | } |
| 1167 | 1155 | ||
| 1168 | if (active) { | 1156 | if (active) { |
| @@ -1196,9 +1184,7 @@ out_no_active_lock: | |||
| 1196 | if (!dev_priv->enable_fb) { | 1184 | if (!dev_priv->enable_fb) { |
| 1197 | vmw_kms_restore_vga(dev_priv); | 1185 | vmw_kms_restore_vga(dev_priv); |
| 1198 | vmw_3d_resource_dec(dev_priv, true); | 1186 | vmw_3d_resource_dec(dev_priv, true); |
| 1199 | mutex_lock(&dev_priv->hw_mutex); | ||
| 1200 | vmw_write(dev_priv, SVGA_REG_TRACES, 1); | 1187 | vmw_write(dev_priv, SVGA_REG_TRACES, 1); |
| 1201 | mutex_unlock(&dev_priv->hw_mutex); | ||
| 1202 | } | 1188 | } |
| 1203 | return ret; | 1189 | return ret; |
| 1204 | } | 1190 | } |
| @@ -1233,9 +1219,7 @@ static void vmw_master_drop(struct drm_device *dev, | |||
| 1233 | DRM_ERROR("Unable to clean VRAM on master drop.\n"); | 1219 | DRM_ERROR("Unable to clean VRAM on master drop.\n"); |
| 1234 | vmw_kms_restore_vga(dev_priv); | 1220 | vmw_kms_restore_vga(dev_priv); |
| 1235 | vmw_3d_resource_dec(dev_priv, true); | 1221 | vmw_3d_resource_dec(dev_priv, true); |
| 1236 | mutex_lock(&dev_priv->hw_mutex); | ||
| 1237 | vmw_write(dev_priv, SVGA_REG_TRACES, 1); | 1222 | vmw_write(dev_priv, SVGA_REG_TRACES, 1); |
| 1238 | mutex_unlock(&dev_priv->hw_mutex); | ||
| 1239 | } | 1223 | } |
| 1240 | 1224 | ||
| 1241 | dev_priv->active_master = &dev_priv->fbdev_master; | 1225 | dev_priv->active_master = &dev_priv->fbdev_master; |
| @@ -1367,10 +1351,8 @@ static void vmw_pm_complete(struct device *kdev) | |||
| 1367 | struct drm_device *dev = pci_get_drvdata(pdev); | 1351 | struct drm_device *dev = pci_get_drvdata(pdev); |
| 1368 | struct vmw_private *dev_priv = vmw_priv(dev); | 1352 | struct vmw_private *dev_priv = vmw_priv(dev); |
| 1369 | 1353 | ||
| 1370 | mutex_lock(&dev_priv->hw_mutex); | ||
| 1371 | vmw_write(dev_priv, SVGA_REG_ID, SVGA_ID_2); | 1354 | vmw_write(dev_priv, SVGA_REG_ID, SVGA_ID_2); |
| 1372 | (void) vmw_read(dev_priv, SVGA_REG_ID); | 1355 | (void) vmw_read(dev_priv, SVGA_REG_ID); |
| 1373 | mutex_unlock(&dev_priv->hw_mutex); | ||
| 1374 | 1356 | ||
| 1375 | /** | 1357 | /** |
| 1376 | * Reclaim 3d reference held by fbdev and potentially | 1358 | * Reclaim 3d reference held by fbdev and potentially |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h index 4ee799b43d5d..d26a6daa9719 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | |||
| @@ -399,7 +399,8 @@ struct vmw_private { | |||
| 399 | uint32_t memory_size; | 399 | uint32_t memory_size; |
| 400 | bool has_gmr; | 400 | bool has_gmr; |
| 401 | bool has_mob; | 401 | bool has_mob; |
| 402 | struct mutex hw_mutex; | 402 | spinlock_t hw_lock; |
| 403 | spinlock_t cap_lock; | ||
| 403 | 404 | ||
| 404 | /* | 405 | /* |
| 405 | * VGA registers. | 406 | * VGA registers. |
| @@ -449,8 +450,9 @@ struct vmw_private { | |||
| 449 | atomic_t marker_seq; | 450 | atomic_t marker_seq; |
| 450 | wait_queue_head_t fence_queue; | 451 | wait_queue_head_t fence_queue; |
| 451 | wait_queue_head_t fifo_queue; | 452 | wait_queue_head_t fifo_queue; |
| 452 | int fence_queue_waiters; /* Protected by hw_mutex */ | 453 | spinlock_t waiter_lock; |
| 453 | int goal_queue_waiters; /* Protected by hw_mutex */ | 454 | int fence_queue_waiters; /* Protected by waiter_lock */ |
| 455 | int goal_queue_waiters; /* Protected by waiter_lock */ | ||
| 454 | atomic_t fifo_queue_waiters; | 456 | atomic_t fifo_queue_waiters; |
| 455 | uint32_t last_read_seqno; | 457 | uint32_t last_read_seqno; |
| 456 | spinlock_t irq_lock; | 458 | spinlock_t irq_lock; |
| @@ -553,20 +555,35 @@ static inline struct vmw_master *vmw_master(struct drm_master *master) | |||
| 553 | return (struct vmw_master *) master->driver_priv; | 555 | return (struct vmw_master *) master->driver_priv; |
| 554 | } | 556 | } |
| 555 | 557 | ||
| 558 | /* | ||
| 559 | * The locking here is fine-grained, so that it is performed once | ||
| 560 | * for every read- and write operation. This is of course costly, but we | ||
| 561 | * don't perform much register access in the timing critical paths anyway. | ||
| 562 | * Instead we have the extra benefit of being sure that we don't forget | ||
| 563 | * the hw lock around register accesses. | ||
| 564 | */ | ||
| 556 | static inline void vmw_write(struct vmw_private *dev_priv, | 565 | static inline void vmw_write(struct vmw_private *dev_priv, |
| 557 | unsigned int offset, uint32_t value) | 566 | unsigned int offset, uint32_t value) |
| 558 | { | 567 | { |
| 568 | unsigned long irq_flags; | ||
| 569 | |||
| 570 | spin_lock_irqsave(&dev_priv->hw_lock, irq_flags); | ||
| 559 | outl(offset, dev_priv->io_start + VMWGFX_INDEX_PORT); | 571 | outl(offset, dev_priv->io_start + VMWGFX_INDEX_PORT); |
| 560 | outl(value, dev_priv->io_start + VMWGFX_VALUE_PORT); | 572 | outl(value, dev_priv->io_start + VMWGFX_VALUE_PORT); |
| 573 | spin_unlock_irqrestore(&dev_priv->hw_lock, irq_flags); | ||
| 561 | } | 574 | } |
| 562 | 575 | ||
| 563 | static inline uint32_t vmw_read(struct vmw_private *dev_priv, | 576 | static inline uint32_t vmw_read(struct vmw_private *dev_priv, |
| 564 | unsigned int offset) | 577 | unsigned int offset) |
| 565 | { | 578 | { |
| 566 | uint32_t val; | 579 | unsigned long irq_flags; |
| 580 | u32 val; | ||
| 567 | 581 | ||
| 582 | spin_lock_irqsave(&dev_priv->hw_lock, irq_flags); | ||
| 568 | outl(offset, dev_priv->io_start + VMWGFX_INDEX_PORT); | 583 | outl(offset, dev_priv->io_start + VMWGFX_INDEX_PORT); |
| 569 | val = inl(dev_priv->io_start + VMWGFX_VALUE_PORT); | 584 | val = inl(dev_priv->io_start + VMWGFX_VALUE_PORT); |
| 585 | spin_unlock_irqrestore(&dev_priv->hw_lock, irq_flags); | ||
| 586 | |||
| 570 | return val; | 587 | return val; |
| 571 | } | 588 | } |
| 572 | 589 | ||
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_fence.c b/drivers/gpu/drm/vmwgfx/vmwgfx_fence.c index b7594cb758af..945f1e0dad92 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_fence.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fence.c | |||
| @@ -35,7 +35,7 @@ struct vmw_fence_manager { | |||
| 35 | struct vmw_private *dev_priv; | 35 | struct vmw_private *dev_priv; |
| 36 | spinlock_t lock; | 36 | spinlock_t lock; |
| 37 | struct list_head fence_list; | 37 | struct list_head fence_list; |
| 38 | struct work_struct work, ping_work; | 38 | struct work_struct work; |
| 39 | u32 user_fence_size; | 39 | u32 user_fence_size; |
| 40 | u32 fence_size; | 40 | u32 fence_size; |
| 41 | u32 event_fence_action_size; | 41 | u32 event_fence_action_size; |
| @@ -134,14 +134,6 @@ static const char *vmw_fence_get_timeline_name(struct fence *f) | |||
| 134 | return "svga"; | 134 | return "svga"; |
| 135 | } | 135 | } |
| 136 | 136 | ||
| 137 | static void vmw_fence_ping_func(struct work_struct *work) | ||
| 138 | { | ||
| 139 | struct vmw_fence_manager *fman = | ||
| 140 | container_of(work, struct vmw_fence_manager, ping_work); | ||
| 141 | |||
| 142 | vmw_fifo_ping_host(fman->dev_priv, SVGA_SYNC_GENERIC); | ||
| 143 | } | ||
| 144 | |||
| 145 | static bool vmw_fence_enable_signaling(struct fence *f) | 137 | static bool vmw_fence_enable_signaling(struct fence *f) |
| 146 | { | 138 | { |
| 147 | struct vmw_fence_obj *fence = | 139 | struct vmw_fence_obj *fence = |
| @@ -155,11 +147,7 @@ static bool vmw_fence_enable_signaling(struct fence *f) | |||
| 155 | if (seqno - fence->base.seqno < VMW_FENCE_WRAP) | 147 | if (seqno - fence->base.seqno < VMW_FENCE_WRAP) |
| 156 | return false; | 148 | return false; |
| 157 | 149 | ||
| 158 | if (mutex_trylock(&dev_priv->hw_mutex)) { | 150 | vmw_fifo_ping_host(dev_priv, SVGA_SYNC_GENERIC); |
| 159 | vmw_fifo_ping_host_locked(dev_priv, SVGA_SYNC_GENERIC); | ||
| 160 | mutex_unlock(&dev_priv->hw_mutex); | ||
| 161 | } else | ||
| 162 | schedule_work(&fman->ping_work); | ||
| 163 | 151 | ||
| 164 | return true; | 152 | return true; |
| 165 | } | 153 | } |
| @@ -305,7 +293,6 @@ struct vmw_fence_manager *vmw_fence_manager_init(struct vmw_private *dev_priv) | |||
| 305 | INIT_LIST_HEAD(&fman->fence_list); | 293 | INIT_LIST_HEAD(&fman->fence_list); |
| 306 | INIT_LIST_HEAD(&fman->cleanup_list); | 294 | INIT_LIST_HEAD(&fman->cleanup_list); |
| 307 | INIT_WORK(&fman->work, &vmw_fence_work_func); | 295 | INIT_WORK(&fman->work, &vmw_fence_work_func); |
| 308 | INIT_WORK(&fman->ping_work, &vmw_fence_ping_func); | ||
| 309 | fman->fifo_down = true; | 296 | fman->fifo_down = true; |
| 310 | fman->user_fence_size = ttm_round_pot(sizeof(struct vmw_user_fence)); | 297 | fman->user_fence_size = ttm_round_pot(sizeof(struct vmw_user_fence)); |
| 311 | fman->fence_size = ttm_round_pot(sizeof(struct vmw_fence_obj)); | 298 | fman->fence_size = ttm_round_pot(sizeof(struct vmw_fence_obj)); |
| @@ -323,7 +310,6 @@ void vmw_fence_manager_takedown(struct vmw_fence_manager *fman) | |||
| 323 | bool lists_empty; | 310 | bool lists_empty; |
| 324 | 311 | ||
| 325 | (void) cancel_work_sync(&fman->work); | 312 | (void) cancel_work_sync(&fman->work); |
| 326 | (void) cancel_work_sync(&fman->ping_work); | ||
| 327 | 313 | ||
| 328 | spin_lock_irqsave(&fman->lock, irq_flags); | 314 | spin_lock_irqsave(&fman->lock, irq_flags); |
| 329 | lists_empty = list_empty(&fman->fence_list) && | 315 | lists_empty = list_empty(&fman->fence_list) && |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c b/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c index 09e10aefcd8e..39f2b03888e7 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c | |||
| @@ -44,10 +44,10 @@ bool vmw_fifo_have_3d(struct vmw_private *dev_priv) | |||
| 44 | if (!dev_priv->has_mob) | 44 | if (!dev_priv->has_mob) |
| 45 | return false; | 45 | return false; |
| 46 | 46 | ||
| 47 | mutex_lock(&dev_priv->hw_mutex); | 47 | spin_lock(&dev_priv->cap_lock); |
| 48 | vmw_write(dev_priv, SVGA_REG_DEV_CAP, SVGA3D_DEVCAP_3D); | 48 | vmw_write(dev_priv, SVGA_REG_DEV_CAP, SVGA3D_DEVCAP_3D); |
| 49 | result = vmw_read(dev_priv, SVGA_REG_DEV_CAP); | 49 | result = vmw_read(dev_priv, SVGA_REG_DEV_CAP); |
| 50 | mutex_unlock(&dev_priv->hw_mutex); | 50 | spin_unlock(&dev_priv->cap_lock); |
| 51 | 51 | ||
| 52 | return (result != 0); | 52 | return (result != 0); |
| 53 | } | 53 | } |
| @@ -120,7 +120,6 @@ int vmw_fifo_init(struct vmw_private *dev_priv, struct vmw_fifo_state *fifo) | |||
| 120 | DRM_INFO("height %d\n", vmw_read(dev_priv, SVGA_REG_HEIGHT)); | 120 | DRM_INFO("height %d\n", vmw_read(dev_priv, SVGA_REG_HEIGHT)); |
| 121 | DRM_INFO("bpp %d\n", vmw_read(dev_priv, SVGA_REG_BITS_PER_PIXEL)); | 121 | DRM_INFO("bpp %d\n", vmw_read(dev_priv, SVGA_REG_BITS_PER_PIXEL)); |
| 122 | 122 | ||
| 123 | mutex_lock(&dev_priv->hw_mutex); | ||
| 124 | dev_priv->enable_state = vmw_read(dev_priv, SVGA_REG_ENABLE); | 123 | dev_priv->enable_state = vmw_read(dev_priv, SVGA_REG_ENABLE); |
| 125 | dev_priv->config_done_state = vmw_read(dev_priv, SVGA_REG_CONFIG_DONE); | 124 | dev_priv->config_done_state = vmw_read(dev_priv, SVGA_REG_CONFIG_DONE); |
| 126 | dev_priv->traces_state = vmw_read(dev_priv, SVGA_REG_TRACES); | 125 | dev_priv->traces_state = vmw_read(dev_priv, SVGA_REG_TRACES); |
| @@ -143,7 +142,6 @@ int vmw_fifo_init(struct vmw_private *dev_priv, struct vmw_fifo_state *fifo) | |||
| 143 | mb(); | 142 | mb(); |
| 144 | 143 | ||
| 145 | vmw_write(dev_priv, SVGA_REG_CONFIG_DONE, 1); | 144 | vmw_write(dev_priv, SVGA_REG_CONFIG_DONE, 1); |
| 146 | mutex_unlock(&dev_priv->hw_mutex); | ||
| 147 | 145 | ||
| 148 | max = ioread32(fifo_mem + SVGA_FIFO_MAX); | 146 | max = ioread32(fifo_mem + SVGA_FIFO_MAX); |
| 149 | min = ioread32(fifo_mem + SVGA_FIFO_MIN); | 147 | min = ioread32(fifo_mem + SVGA_FIFO_MIN); |
| @@ -160,31 +158,28 @@ int vmw_fifo_init(struct vmw_private *dev_priv, struct vmw_fifo_state *fifo) | |||
| 160 | return vmw_fifo_send_fence(dev_priv, &dummy); | 158 | return vmw_fifo_send_fence(dev_priv, &dummy); |
| 161 | } | 159 | } |
| 162 | 160 | ||
| 163 | void vmw_fifo_ping_host_locked(struct vmw_private *dev_priv, uint32_t reason) | 161 | void vmw_fifo_ping_host(struct vmw_private *dev_priv, uint32_t reason) |
| 164 | { | 162 | { |
| 165 | __le32 __iomem *fifo_mem = dev_priv->mmio_virt; | 163 | __le32 __iomem *fifo_mem = dev_priv->mmio_virt; |
| 164 | static DEFINE_SPINLOCK(ping_lock); | ||
| 165 | unsigned long irq_flags; | ||
| 166 | 166 | ||
| 167 | /* | ||
| 168 | * The ping_lock is needed because we don't have an atomic | ||
| 169 | * test-and-set of the SVGA_FIFO_BUSY register. | ||
| 170 | */ | ||
| 171 | spin_lock_irqsave(&ping_lock, irq_flags); | ||
| 167 | if (unlikely(ioread32(fifo_mem + SVGA_FIFO_BUSY) == 0)) { | 172 | if (unlikely(ioread32(fifo_mem + SVGA_FIFO_BUSY) == 0)) { |
| 168 | iowrite32(1, fifo_mem + SVGA_FIFO_BUSY); | 173 | iowrite32(1, fifo_mem + SVGA_FIFO_BUSY); |
| 169 | vmw_write(dev_priv, SVGA_REG_SYNC, reason); | 174 | vmw_write(dev_priv, SVGA_REG_SYNC, reason); |
| 170 | } | 175 | } |
| 171 | } | 176 | spin_unlock_irqrestore(&ping_lock, irq_flags); |
| 172 | |||
| 173 | void vmw_fifo_ping_host(struct vmw_private *dev_priv, uint32_t reason) | ||
| 174 | { | ||
| 175 | mutex_lock(&dev_priv->hw_mutex); | ||
| 176 | |||
| 177 | vmw_fifo_ping_host_locked(dev_priv, reason); | ||
| 178 | |||
| 179 | mutex_unlock(&dev_priv->hw_mutex); | ||
| 180 | } | 177 | } |
| 181 | 178 | ||
| 182 | void vmw_fifo_release(struct vmw_private *dev_priv, struct vmw_fifo_state *fifo) | 179 | void vmw_fifo_release(struct vmw_private *dev_priv, struct vmw_fifo_state *fifo) |
| 183 | { | 180 | { |
| 184 | __le32 __iomem *fifo_mem = dev_priv->mmio_virt; | 181 | __le32 __iomem *fifo_mem = dev_priv->mmio_virt; |
| 185 | 182 | ||
| 186 | mutex_lock(&dev_priv->hw_mutex); | ||
| 187 | |||
| 188 | vmw_write(dev_priv, SVGA_REG_SYNC, SVGA_SYNC_GENERIC); | 183 | vmw_write(dev_priv, SVGA_REG_SYNC, SVGA_SYNC_GENERIC); |
| 189 | while (vmw_read(dev_priv, SVGA_REG_BUSY) != 0) | 184 | while (vmw_read(dev_priv, SVGA_REG_BUSY) != 0) |
| 190 | ; | 185 | ; |
| @@ -198,7 +193,6 @@ void vmw_fifo_release(struct vmw_private *dev_priv, struct vmw_fifo_state *fifo) | |||
| 198 | vmw_write(dev_priv, SVGA_REG_TRACES, | 193 | vmw_write(dev_priv, SVGA_REG_TRACES, |
| 199 | dev_priv->traces_state); | 194 | dev_priv->traces_state); |
| 200 | 195 | ||
| 201 | mutex_unlock(&dev_priv->hw_mutex); | ||
| 202 | vmw_marker_queue_takedown(&fifo->marker_queue); | 196 | vmw_marker_queue_takedown(&fifo->marker_queue); |
| 203 | 197 | ||
| 204 | if (likely(fifo->static_buffer != NULL)) { | 198 | if (likely(fifo->static_buffer != NULL)) { |
| @@ -271,7 +265,7 @@ static int vmw_fifo_wait(struct vmw_private *dev_priv, | |||
| 271 | return vmw_fifo_wait_noirq(dev_priv, bytes, | 265 | return vmw_fifo_wait_noirq(dev_priv, bytes, |
| 272 | interruptible, timeout); | 266 | interruptible, timeout); |
| 273 | 267 | ||
| 274 | mutex_lock(&dev_priv->hw_mutex); | 268 | spin_lock(&dev_priv->waiter_lock); |
| 275 | if (atomic_add_return(1, &dev_priv->fifo_queue_waiters) > 0) { | 269 | if (atomic_add_return(1, &dev_priv->fifo_queue_waiters) > 0) { |
| 276 | spin_lock_irqsave(&dev_priv->irq_lock, irq_flags); | 270 | spin_lock_irqsave(&dev_priv->irq_lock, irq_flags); |
| 277 | outl(SVGA_IRQFLAG_FIFO_PROGRESS, | 271 | outl(SVGA_IRQFLAG_FIFO_PROGRESS, |
| @@ -280,7 +274,7 @@ static int vmw_fifo_wait(struct vmw_private *dev_priv, | |||
| 280 | vmw_write(dev_priv, SVGA_REG_IRQMASK, dev_priv->irq_mask); | 274 | vmw_write(dev_priv, SVGA_REG_IRQMASK, dev_priv->irq_mask); |
| 281 | spin_unlock_irqrestore(&dev_priv->irq_lock, irq_flags); | 275 | spin_unlock_irqrestore(&dev_priv->irq_lock, irq_flags); |
| 282 | } | 276 | } |
| 283 | mutex_unlock(&dev_priv->hw_mutex); | 277 | spin_unlock(&dev_priv->waiter_lock); |
| 284 | 278 | ||
| 285 | if (interruptible) | 279 | if (interruptible) |
| 286 | ret = wait_event_interruptible_timeout | 280 | ret = wait_event_interruptible_timeout |
| @@ -296,14 +290,14 @@ static int vmw_fifo_wait(struct vmw_private *dev_priv, | |||
| 296 | else if (likely(ret > 0)) | 290 | else if (likely(ret > 0)) |
| 297 | ret = 0; | 291 | ret = 0; |
| 298 | 292 | ||
| 299 | mutex_lock(&dev_priv->hw_mutex); | 293 | spin_lock(&dev_priv->waiter_lock); |
| 300 | if (atomic_dec_and_test(&dev_priv->fifo_queue_waiters)) { | 294 | if (atomic_dec_and_test(&dev_priv->fifo_queue_waiters)) { |
| 301 | spin_lock_irqsave(&dev_priv->irq_lock, irq_flags); | 295 | spin_lock_irqsave(&dev_priv->irq_lock, irq_flags); |
| 302 | dev_priv->irq_mask &= ~SVGA_IRQFLAG_FIFO_PROGRESS; | 296 | dev_priv->irq_mask &= ~SVGA_IRQFLAG_FIFO_PROGRESS; |
| 303 | vmw_write(dev_priv, SVGA_REG_IRQMASK, dev_priv->irq_mask); | 297 | vmw_write(dev_priv, SVGA_REG_IRQMASK, dev_priv->irq_mask); |
| 304 | spin_unlock_irqrestore(&dev_priv->irq_lock, irq_flags); | 298 | spin_unlock_irqrestore(&dev_priv->irq_lock, irq_flags); |
| 305 | } | 299 | } |
| 306 | mutex_unlock(&dev_priv->hw_mutex); | 300 | spin_unlock(&dev_priv->waiter_lock); |
| 307 | 301 | ||
| 308 | return ret; | 302 | return ret; |
| 309 | } | 303 | } |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c index 37881ecf5d7a..69c8ce23123c 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c | |||
| @@ -135,13 +135,13 @@ static int vmw_fill_compat_cap(struct vmw_private *dev_priv, void *bounce, | |||
| 135 | (pair_offset + max_size * sizeof(SVGA3dCapPair)) / sizeof(u32); | 135 | (pair_offset + max_size * sizeof(SVGA3dCapPair)) / sizeof(u32); |
| 136 | compat_cap->header.type = SVGA3DCAPS_RECORD_DEVCAPS; | 136 | compat_cap->header.type = SVGA3DCAPS_RECORD_DEVCAPS; |
| 137 | 137 | ||
| 138 | mutex_lock(&dev_priv->hw_mutex); | 138 | spin_lock(&dev_priv->cap_lock); |
| 139 | for (i = 0; i < max_size; ++i) { | 139 | for (i = 0; i < max_size; ++i) { |
| 140 | vmw_write(dev_priv, SVGA_REG_DEV_CAP, i); | 140 | vmw_write(dev_priv, SVGA_REG_DEV_CAP, i); |
| 141 | compat_cap->pairs[i][0] = i; | 141 | compat_cap->pairs[i][0] = i; |
| 142 | compat_cap->pairs[i][1] = vmw_read(dev_priv, SVGA_REG_DEV_CAP); | 142 | compat_cap->pairs[i][1] = vmw_read(dev_priv, SVGA_REG_DEV_CAP); |
| 143 | } | 143 | } |
| 144 | mutex_unlock(&dev_priv->hw_mutex); | 144 | spin_unlock(&dev_priv->cap_lock); |
| 145 | 145 | ||
| 146 | return 0; | 146 | return 0; |
| 147 | } | 147 | } |
| @@ -191,12 +191,12 @@ int vmw_get_cap_3d_ioctl(struct drm_device *dev, void *data, | |||
| 191 | if (num > SVGA3D_DEVCAP_MAX) | 191 | if (num > SVGA3D_DEVCAP_MAX) |
| 192 | num = SVGA3D_DEVCAP_MAX; | 192 | num = SVGA3D_DEVCAP_MAX; |
| 193 | 193 | ||
| 194 | mutex_lock(&dev_priv->hw_mutex); | 194 | spin_lock(&dev_priv->cap_lock); |
| 195 | for (i = 0; i < num; ++i) { | 195 | for (i = 0; i < num; ++i) { |
| 196 | vmw_write(dev_priv, SVGA_REG_DEV_CAP, i); | 196 | vmw_write(dev_priv, SVGA_REG_DEV_CAP, i); |
| 197 | *bounce32++ = vmw_read(dev_priv, SVGA_REG_DEV_CAP); | 197 | *bounce32++ = vmw_read(dev_priv, SVGA_REG_DEV_CAP); |
| 198 | } | 198 | } |
| 199 | mutex_unlock(&dev_priv->hw_mutex); | 199 | spin_unlock(&dev_priv->cap_lock); |
| 200 | } else if (gb_objects) { | 200 | } else if (gb_objects) { |
| 201 | ret = vmw_fill_compat_cap(dev_priv, bounce, size); | 201 | ret = vmw_fill_compat_cap(dev_priv, bounce, size); |
| 202 | if (unlikely(ret != 0)) | 202 | if (unlikely(ret != 0)) |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_irq.c b/drivers/gpu/drm/vmwgfx/vmwgfx_irq.c index 0c423766c441..9fe9827ee499 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_irq.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_irq.c | |||
| @@ -62,13 +62,8 @@ irqreturn_t vmw_irq_handler(int irq, void *arg) | |||
| 62 | 62 | ||
| 63 | static bool vmw_fifo_idle(struct vmw_private *dev_priv, uint32_t seqno) | 63 | static bool vmw_fifo_idle(struct vmw_private *dev_priv, uint32_t seqno) |
| 64 | { | 64 | { |
| 65 | uint32_t busy; | ||
| 66 | 65 | ||
| 67 | mutex_lock(&dev_priv->hw_mutex); | 66 | return (vmw_read(dev_priv, SVGA_REG_BUSY) == 0); |
| 68 | busy = vmw_read(dev_priv, SVGA_REG_BUSY); | ||
| 69 | mutex_unlock(&dev_priv->hw_mutex); | ||
| 70 | |||
| 71 | return (busy == 0); | ||
| 72 | } | 67 | } |
| 73 | 68 | ||
| 74 | void vmw_update_seqno(struct vmw_private *dev_priv, | 69 | void vmw_update_seqno(struct vmw_private *dev_priv, |
| @@ -184,7 +179,7 @@ int vmw_fallback_wait(struct vmw_private *dev_priv, | |||
| 184 | 179 | ||
| 185 | void vmw_seqno_waiter_add(struct vmw_private *dev_priv) | 180 | void vmw_seqno_waiter_add(struct vmw_private *dev_priv) |
| 186 | { | 181 | { |
| 187 | mutex_lock(&dev_priv->hw_mutex); | 182 | spin_lock(&dev_priv->waiter_lock); |
| 188 | if (dev_priv->fence_queue_waiters++ == 0) { | 183 | if (dev_priv->fence_queue_waiters++ == 0) { |
| 189 | unsigned long irq_flags; | 184 | unsigned long irq_flags; |
| 190 | 185 | ||
| @@ -195,12 +190,12 @@ void vmw_seqno_waiter_add(struct vmw_private *dev_priv) | |||
| 195 | vmw_write(dev_priv, SVGA_REG_IRQMASK, dev_priv->irq_mask); | 190 | vmw_write(dev_priv, SVGA_REG_IRQMASK, dev_priv->irq_mask); |
| 196 | spin_unlock_irqrestore(&dev_priv->irq_lock, irq_flags); | 191 | spin_unlock_irqrestore(&dev_priv->irq_lock, irq_flags); |
| 197 | } | 192 | } |
| 198 | mutex_unlock(&dev_priv->hw_mutex); | 193 | spin_unlock(&dev_priv->waiter_lock); |
| 199 | } | 194 | } |
| 200 | 195 | ||
| 201 | void vmw_seqno_waiter_remove(struct vmw_private *dev_priv) | 196 | void vmw_seqno_waiter_remove(struct vmw_private *dev_priv) |
| 202 | { | 197 | { |
| 203 | mutex_lock(&dev_priv->hw_mutex); | 198 | spin_lock(&dev_priv->waiter_lock); |
| 204 | if (--dev_priv->fence_queue_waiters == 0) { | 199 | if (--dev_priv->fence_queue_waiters == 0) { |
| 205 | unsigned long irq_flags; | 200 | unsigned long irq_flags; |
| 206 | 201 | ||
| @@ -209,13 +204,13 @@ void vmw_seqno_waiter_remove(struct vmw_private *dev_priv) | |||
| 209 | vmw_write(dev_priv, SVGA_REG_IRQMASK, dev_priv->irq_mask); | 204 | vmw_write(dev_priv, SVGA_REG_IRQMASK, dev_priv->irq_mask); |
| 210 | spin_unlock_irqrestore(&dev_priv->irq_lock, irq_flags); | 205 | spin_unlock_irqrestore(&dev_priv->irq_lock, irq_flags); |
| 211 | } | 206 | } |
| 212 | mutex_unlock(&dev_priv->hw_mutex); | 207 | spin_unlock(&dev_priv->waiter_lock); |
| 213 | } | 208 | } |
| 214 | 209 | ||
| 215 | 210 | ||
| 216 | void vmw_goal_waiter_add(struct vmw_private *dev_priv) | 211 | void vmw_goal_waiter_add(struct vmw_private *dev_priv) |
| 217 | { | 212 | { |
| 218 | mutex_lock(&dev_priv->hw_mutex); | 213 | spin_lock(&dev_priv->waiter_lock); |
| 219 | if (dev_priv->goal_queue_waiters++ == 0) { | 214 | if (dev_priv->goal_queue_waiters++ == 0) { |
| 220 | unsigned long irq_flags; | 215 | unsigned long irq_flags; |
| 221 | 216 | ||
| @@ -226,12 +221,12 @@ void vmw_goal_waiter_add(struct vmw_private *dev_priv) | |||
| 226 | vmw_write(dev_priv, SVGA_REG_IRQMASK, dev_priv->irq_mask); | 221 | vmw_write(dev_priv, SVGA_REG_IRQMASK, dev_priv->irq_mask); |
| 227 | spin_unlock_irqrestore(&dev_priv->irq_lock, irq_flags); | 222 | spin_unlock_irqrestore(&dev_priv->irq_lock, irq_flags); |
| 228 | } | 223 | } |
| 229 | mutex_unlock(&dev_priv->hw_mutex); | 224 | spin_unlock(&dev_priv->waiter_lock); |
| 230 | } | 225 | } |
| 231 | 226 | ||
| 232 | void vmw_goal_waiter_remove(struct vmw_private *dev_priv) | 227 | void vmw_goal_waiter_remove(struct vmw_private *dev_priv) |
| 233 | { | 228 | { |
| 234 | mutex_lock(&dev_priv->hw_mutex); | 229 | spin_lock(&dev_priv->waiter_lock); |
| 235 | if (--dev_priv->goal_queue_waiters == 0) { | 230 | if (--dev_priv->goal_queue_waiters == 0) { |
| 236 | unsigned long irq_flags; | 231 | unsigned long irq_flags; |
| 237 | 232 | ||
| @@ -240,7 +235,7 @@ void vmw_goal_waiter_remove(struct vmw_private *dev_priv) | |||
| 240 | vmw_write(dev_priv, SVGA_REG_IRQMASK, dev_priv->irq_mask); | 235 | vmw_write(dev_priv, SVGA_REG_IRQMASK, dev_priv->irq_mask); |
| 241 | spin_unlock_irqrestore(&dev_priv->irq_lock, irq_flags); | 236 | spin_unlock_irqrestore(&dev_priv->irq_lock, irq_flags); |
| 242 | } | 237 | } |
| 243 | mutex_unlock(&dev_priv->hw_mutex); | 238 | spin_unlock(&dev_priv->waiter_lock); |
| 244 | } | 239 | } |
| 245 | 240 | ||
| 246 | int vmw_wait_seqno(struct vmw_private *dev_priv, | 241 | int vmw_wait_seqno(struct vmw_private *dev_priv, |
| @@ -315,9 +310,7 @@ void vmw_irq_uninstall(struct drm_device *dev) | |||
| 315 | if (!(dev_priv->capabilities & SVGA_CAP_IRQMASK)) | 310 | if (!(dev_priv->capabilities & SVGA_CAP_IRQMASK)) |
| 316 | return; | 311 | return; |
| 317 | 312 | ||
| 318 | mutex_lock(&dev_priv->hw_mutex); | ||
| 319 | vmw_write(dev_priv, SVGA_REG_IRQMASK, 0); | 313 | vmw_write(dev_priv, SVGA_REG_IRQMASK, 0); |
| 320 | mutex_unlock(&dev_priv->hw_mutex); | ||
| 321 | 314 | ||
| 322 | status = inl(dev_priv->io_start + VMWGFX_IRQSTATUS_PORT); | 315 | status = inl(dev_priv->io_start + VMWGFX_IRQSTATUS_PORT); |
| 323 | outl(status, dev_priv->io_start + VMWGFX_IRQSTATUS_PORT); | 316 | outl(status, dev_priv->io_start + VMWGFX_IRQSTATUS_PORT); |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c index 3725b521d931..8725b79e7847 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | |||
| @@ -1828,9 +1828,7 @@ vmw_du_connector_detect(struct drm_connector *connector, bool force) | |||
| 1828 | struct vmw_private *dev_priv = vmw_priv(dev); | 1828 | struct vmw_private *dev_priv = vmw_priv(dev); |
| 1829 | struct vmw_display_unit *du = vmw_connector_to_du(connector); | 1829 | struct vmw_display_unit *du = vmw_connector_to_du(connector); |
| 1830 | 1830 | ||
| 1831 | mutex_lock(&dev_priv->hw_mutex); | ||
| 1832 | num_displays = vmw_read(dev_priv, SVGA_REG_NUM_DISPLAYS); | 1831 | num_displays = vmw_read(dev_priv, SVGA_REG_NUM_DISPLAYS); |
| 1833 | mutex_unlock(&dev_priv->hw_mutex); | ||
| 1834 | 1832 | ||
| 1835 | return ((vmw_connector_to_du(connector)->unit < num_displays && | 1833 | return ((vmw_connector_to_du(connector)->unit < num_displays && |
| 1836 | du->pref_active) ? | 1834 | du->pref_active) ? |
diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig index 230b6f887cd8..dfdc26970022 100644 --- a/drivers/hid/Kconfig +++ b/drivers/hid/Kconfig | |||
| @@ -27,7 +27,8 @@ if HID | |||
| 27 | 27 | ||
| 28 | config HID_BATTERY_STRENGTH | 28 | config HID_BATTERY_STRENGTH |
| 29 | bool "Battery level reporting for HID devices" | 29 | bool "Battery level reporting for HID devices" |
| 30 | depends on HID && POWER_SUPPLY && HID = POWER_SUPPLY | 30 | depends on HID |
| 31 | select POWER_SUPPLY | ||
| 31 | default n | 32 | default n |
| 32 | ---help--- | 33 | ---help--- |
| 33 | This option adds support of reporting battery strength (for HID devices | 34 | This option adds support of reporting battery strength (for HID devices |
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index c3d0ac1a0988..8b638792cb43 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c | |||
| @@ -1805,6 +1805,7 @@ static const struct hid_device_id hid_have_special_driver[] = { | |||
| 1805 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_ERGO_525V) }, | 1805 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_ERGO_525V) }, |
| 1806 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_I405X) }, | 1806 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_I405X) }, |
| 1807 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X) }, | 1807 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X) }, |
| 1808 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X_2) }, | ||
| 1808 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X) }, | 1809 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X) }, |
| 1809 | { HID_USB_DEVICE(USB_VENDOR_ID_LABTEC, USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD) }, | 1810 | { HID_USB_DEVICE(USB_VENDOR_ID_LABTEC, USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD) }, |
| 1810 | { HID_USB_DEVICE(USB_VENDOR_ID_LCPOWER, USB_DEVICE_ID_LCPOWER_LC1000 ) }, | 1811 | { HID_USB_DEVICE(USB_VENDOR_ID_LCPOWER, USB_DEVICE_ID_LCPOWER_LC1000 ) }, |
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index 7460f3402298..9243359c1821 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h | |||
| @@ -526,6 +526,7 @@ | |||
| 526 | #define USB_DEVICE_ID_KYE_GPEN_560 0x5003 | 526 | #define USB_DEVICE_ID_KYE_GPEN_560 0x5003 |
| 527 | #define USB_DEVICE_ID_KYE_EASYPEN_I405X 0x5010 | 527 | #define USB_DEVICE_ID_KYE_EASYPEN_I405X 0x5010 |
| 528 | #define USB_DEVICE_ID_KYE_MOUSEPEN_I608X 0x5011 | 528 | #define USB_DEVICE_ID_KYE_MOUSEPEN_I608X 0x5011 |
| 529 | #define USB_DEVICE_ID_KYE_MOUSEPEN_I608X_2 0x501a | ||
| 529 | #define USB_DEVICE_ID_KYE_EASYPEN_M610X 0x5013 | 530 | #define USB_DEVICE_ID_KYE_EASYPEN_M610X 0x5013 |
| 530 | 531 | ||
| 531 | #define USB_VENDOR_ID_LABTEC 0x1020 | 532 | #define USB_VENDOR_ID_LABTEC 0x1020 |
diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c index e0a0f06ac5ef..9505605b6e22 100644 --- a/drivers/hid/hid-input.c +++ b/drivers/hid/hid-input.c | |||
| @@ -312,6 +312,9 @@ static const struct hid_device_id hid_battery_quirks[] = { | |||
| 312 | USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ANSI), | 312 | USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ANSI), |
| 313 | HID_BATTERY_QUIRK_PERCENT | HID_BATTERY_QUIRK_FEATURE }, | 313 | HID_BATTERY_QUIRK_PERCENT | HID_BATTERY_QUIRK_FEATURE }, |
| 314 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, | 314 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, |
| 315 | USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ISO), | ||
| 316 | HID_BATTERY_QUIRK_PERCENT | HID_BATTERY_QUIRK_FEATURE }, | ||
| 317 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, | ||
| 315 | USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI), | 318 | USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI), |
| 316 | HID_BATTERY_QUIRK_PERCENT | HID_BATTERY_QUIRK_FEATURE }, | 319 | HID_BATTERY_QUIRK_PERCENT | HID_BATTERY_QUIRK_FEATURE }, |
| 317 | {} | 320 | {} |
diff --git a/drivers/hid/hid-kye.c b/drivers/hid/hid-kye.c index b92bf01a1ae8..158fcf577fae 100644 --- a/drivers/hid/hid-kye.c +++ b/drivers/hid/hid-kye.c | |||
| @@ -323,6 +323,7 @@ static __u8 *kye_report_fixup(struct hid_device *hdev, __u8 *rdesc, | |||
| 323 | } | 323 | } |
| 324 | break; | 324 | break; |
| 325 | case USB_DEVICE_ID_KYE_MOUSEPEN_I608X: | 325 | case USB_DEVICE_ID_KYE_MOUSEPEN_I608X: |
| 326 | case USB_DEVICE_ID_KYE_MOUSEPEN_I608X_2: | ||
| 326 | if (*rsize == MOUSEPEN_I608X_RDESC_ORIG_SIZE) { | 327 | if (*rsize == MOUSEPEN_I608X_RDESC_ORIG_SIZE) { |
| 327 | rdesc = mousepen_i608x_rdesc_fixed; | 328 | rdesc = mousepen_i608x_rdesc_fixed; |
| 328 | *rsize = sizeof(mousepen_i608x_rdesc_fixed); | 329 | *rsize = sizeof(mousepen_i608x_rdesc_fixed); |
| @@ -415,6 +416,7 @@ static int kye_probe(struct hid_device *hdev, const struct hid_device_id *id) | |||
| 415 | switch (id->product) { | 416 | switch (id->product) { |
| 416 | case USB_DEVICE_ID_KYE_EASYPEN_I405X: | 417 | case USB_DEVICE_ID_KYE_EASYPEN_I405X: |
| 417 | case USB_DEVICE_ID_KYE_MOUSEPEN_I608X: | 418 | case USB_DEVICE_ID_KYE_MOUSEPEN_I608X: |
| 419 | case USB_DEVICE_ID_KYE_MOUSEPEN_I608X_2: | ||
| 418 | case USB_DEVICE_ID_KYE_EASYPEN_M610X: | 420 | case USB_DEVICE_ID_KYE_EASYPEN_M610X: |
| 419 | ret = kye_tablet_enable(hdev); | 421 | ret = kye_tablet_enable(hdev); |
| 420 | if (ret) { | 422 | if (ret) { |
| @@ -446,6 +448,8 @@ static const struct hid_device_id kye_devices[] = { | |||
| 446 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, | 448 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, |
| 447 | USB_DEVICE_ID_KYE_MOUSEPEN_I608X) }, | 449 | USB_DEVICE_ID_KYE_MOUSEPEN_I608X) }, |
| 448 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, | 450 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, |
| 451 | USB_DEVICE_ID_KYE_MOUSEPEN_I608X_2) }, | ||
| 452 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, | ||
| 449 | USB_DEVICE_ID_KYE_EASYPEN_M610X) }, | 453 | USB_DEVICE_ID_KYE_EASYPEN_M610X) }, |
| 450 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, | 454 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, |
| 451 | USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE) }, | 455 | USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE) }, |
diff --git a/drivers/hid/hid-logitech-dj.c b/drivers/hid/hid-logitech-dj.c index c917ab61aafa..5bc6d80d5be7 100644 --- a/drivers/hid/hid-logitech-dj.c +++ b/drivers/hid/hid-logitech-dj.c | |||
| @@ -962,10 +962,24 @@ static int logi_dj_raw_event(struct hid_device *hdev, | |||
| 962 | 962 | ||
| 963 | switch (data[0]) { | 963 | switch (data[0]) { |
| 964 | case REPORT_ID_DJ_SHORT: | 964 | case REPORT_ID_DJ_SHORT: |
| 965 | if (size != DJREPORT_SHORT_LENGTH) { | ||
| 966 | dev_err(&hdev->dev, "DJ report of bad size (%d)", size); | ||
| 967 | return false; | ||
| 968 | } | ||
| 965 | return logi_dj_dj_event(hdev, report, data, size); | 969 | return logi_dj_dj_event(hdev, report, data, size); |
| 966 | case REPORT_ID_HIDPP_SHORT: | 970 | case REPORT_ID_HIDPP_SHORT: |
| 967 | /* intentional fallthrough */ | 971 | if (size != HIDPP_REPORT_SHORT_LENGTH) { |
| 972 | dev_err(&hdev->dev, | ||
| 973 | "Short HID++ report of bad size (%d)", size); | ||
| 974 | return false; | ||
| 975 | } | ||
| 976 | return logi_dj_hidpp_event(hdev, report, data, size); | ||
| 968 | case REPORT_ID_HIDPP_LONG: | 977 | case REPORT_ID_HIDPP_LONG: |
| 978 | if (size != HIDPP_REPORT_LONG_LENGTH) { | ||
| 979 | dev_err(&hdev->dev, | ||
| 980 | "Long HID++ report of bad size (%d)", size); | ||
| 981 | return false; | ||
| 982 | } | ||
| 969 | return logi_dj_hidpp_event(hdev, report, data, size); | 983 | return logi_dj_hidpp_event(hdev, report, data, size); |
| 970 | } | 984 | } |
| 971 | 985 | ||
diff --git a/drivers/hid/hid-logitech-hidpp.c b/drivers/hid/hid-logitech-hidpp.c index 2f420c0b6609..a93cefe0e522 100644 --- a/drivers/hid/hid-logitech-hidpp.c +++ b/drivers/hid/hid-logitech-hidpp.c | |||
| @@ -282,6 +282,33 @@ static inline bool hidpp_report_is_connect_event(struct hidpp_report *report) | |||
| 282 | (report->rap.sub_id == 0x41); | 282 | (report->rap.sub_id == 0x41); |
| 283 | } | 283 | } |
| 284 | 284 | ||
| 285 | /** | ||
| 286 | * hidpp_prefix_name() prefixes the current given name with "Logitech ". | ||
| 287 | */ | ||
| 288 | static void hidpp_prefix_name(char **name, int name_length) | ||
| 289 | { | ||
| 290 | #define PREFIX_LENGTH 9 /* "Logitech " */ | ||
| 291 | |||
| 292 | int new_length; | ||
| 293 | char *new_name; | ||
| 294 | |||
| 295 | if (name_length > PREFIX_LENGTH && | ||
| 296 | strncmp(*name, "Logitech ", PREFIX_LENGTH) == 0) | ||
| 297 | /* The prefix has is already in the name */ | ||
| 298 | return; | ||
| 299 | |||
| 300 | new_length = PREFIX_LENGTH + name_length; | ||
| 301 | new_name = kzalloc(new_length, GFP_KERNEL); | ||
| 302 | if (!new_name) | ||
| 303 | return; | ||
| 304 | |||
| 305 | snprintf(new_name, new_length, "Logitech %s", *name); | ||
| 306 | |||
| 307 | kfree(*name); | ||
| 308 | |||
| 309 | *name = new_name; | ||
| 310 | } | ||
| 311 | |||
| 285 | /* -------------------------------------------------------------------------- */ | 312 | /* -------------------------------------------------------------------------- */ |
| 286 | /* HIDP++ 1.0 commands */ | 313 | /* HIDP++ 1.0 commands */ |
| 287 | /* -------------------------------------------------------------------------- */ | 314 | /* -------------------------------------------------------------------------- */ |
| @@ -321,6 +348,10 @@ static char *hidpp_get_unifying_name(struct hidpp_device *hidpp_dev) | |||
| 321 | return NULL; | 348 | return NULL; |
| 322 | 349 | ||
| 323 | memcpy(name, &response.rap.params[2], len); | 350 | memcpy(name, &response.rap.params[2], len); |
| 351 | |||
| 352 | /* include the terminating '\0' */ | ||
| 353 | hidpp_prefix_name(&name, len + 1); | ||
| 354 | |||
| 324 | return name; | 355 | return name; |
| 325 | } | 356 | } |
| 326 | 357 | ||
| @@ -498,6 +529,9 @@ static char *hidpp_get_device_name(struct hidpp_device *hidpp) | |||
| 498 | index += ret; | 529 | index += ret; |
| 499 | } | 530 | } |
| 500 | 531 | ||
| 532 | /* include the terminating '\0' */ | ||
| 533 | hidpp_prefix_name(&name, __name_length + 1); | ||
| 534 | |||
| 501 | return name; | 535 | return name; |
| 502 | } | 536 | } |
| 503 | 537 | ||
| @@ -794,18 +828,25 @@ static int wtp_raw_event(struct hid_device *hdev, u8 *data, int size) | |||
| 794 | 828 | ||
| 795 | switch (data[0]) { | 829 | switch (data[0]) { |
| 796 | case 0x02: | 830 | case 0x02: |
| 831 | if (size < 2) { | ||
| 832 | hid_err(hdev, "Received HID report of bad size (%d)", | ||
| 833 | size); | ||
| 834 | return 1; | ||
| 835 | } | ||
| 797 | if (hidpp->quirks & HIDPP_QUIRK_WTP_PHYSICAL_BUTTONS) { | 836 | if (hidpp->quirks & HIDPP_QUIRK_WTP_PHYSICAL_BUTTONS) { |
| 798 | input_event(wd->input, EV_KEY, BTN_LEFT, | 837 | input_event(wd->input, EV_KEY, BTN_LEFT, |
| 799 | !!(data[1] & 0x01)); | 838 | !!(data[1] & 0x01)); |
| 800 | input_event(wd->input, EV_KEY, BTN_RIGHT, | 839 | input_event(wd->input, EV_KEY, BTN_RIGHT, |
| 801 | !!(data[1] & 0x02)); | 840 | !!(data[1] & 0x02)); |
| 802 | input_sync(wd->input); | 841 | input_sync(wd->input); |
| 842 | return 0; | ||
| 803 | } else { | 843 | } else { |
| 804 | if (size < 21) | 844 | if (size < 21) |
| 805 | return 1; | 845 | return 1; |
| 806 | return wtp_mouse_raw_xy_event(hidpp, &data[7]); | 846 | return wtp_mouse_raw_xy_event(hidpp, &data[7]); |
| 807 | } | 847 | } |
| 808 | case REPORT_ID_HIDPP_LONG: | 848 | case REPORT_ID_HIDPP_LONG: |
| 849 | /* size is already checked in hidpp_raw_event. */ | ||
| 809 | if ((report->fap.feature_index != wd->mt_feature_index) || | 850 | if ((report->fap.feature_index != wd->mt_feature_index) || |
| 810 | (report->fap.funcindex_clientid != EVENT_TOUCHPAD_RAW_XY)) | 851 | (report->fap.funcindex_clientid != EVENT_TOUCHPAD_RAW_XY)) |
| 811 | return 1; | 852 | return 1; |
diff --git a/drivers/hid/hid-roccat-pyra.c b/drivers/hid/hid-roccat-pyra.c index 1a07e07d99a0..47d7e74231e5 100644 --- a/drivers/hid/hid-roccat-pyra.c +++ b/drivers/hid/hid-roccat-pyra.c | |||
| @@ -35,6 +35,8 @@ static struct class *pyra_class; | |||
| 35 | static void profile_activated(struct pyra_device *pyra, | 35 | static void profile_activated(struct pyra_device *pyra, |
| 36 | unsigned int new_profile) | 36 | unsigned int new_profile) |
| 37 | { | 37 | { |
| 38 | if (new_profile >= ARRAY_SIZE(pyra->profile_settings)) | ||
| 39 | return; | ||
| 38 | pyra->actual_profile = new_profile; | 40 | pyra->actual_profile = new_profile; |
| 39 | pyra->actual_cpi = pyra->profile_settings[pyra->actual_profile].y_cpi; | 41 | pyra->actual_cpi = pyra->profile_settings[pyra->actual_profile].y_cpi; |
| 40 | } | 42 | } |
| @@ -257,9 +259,11 @@ static ssize_t pyra_sysfs_write_settings(struct file *fp, | |||
| 257 | if (off != 0 || count != PYRA_SIZE_SETTINGS) | 259 | if (off != 0 || count != PYRA_SIZE_SETTINGS) |
| 258 | return -EINVAL; | 260 | return -EINVAL; |
| 259 | 261 | ||
| 260 | mutex_lock(&pyra->pyra_lock); | ||
| 261 | |||
| 262 | settings = (struct pyra_settings const *)buf; | 262 | settings = (struct pyra_settings const *)buf; |
| 263 | if (settings->startup_profile >= ARRAY_SIZE(pyra->profile_settings)) | ||
| 264 | return -EINVAL; | ||
| 265 | |||
| 266 | mutex_lock(&pyra->pyra_lock); | ||
| 263 | 267 | ||
| 264 | retval = pyra_set_settings(usb_dev, settings); | 268 | retval = pyra_set_settings(usb_dev, settings); |
| 265 | if (retval) { | 269 | if (retval) { |
diff --git a/drivers/hid/i2c-hid/i2c-hid.c b/drivers/hid/i2c-hid/i2c-hid.c index d32037cbf9db..d43e967e7533 100644 --- a/drivers/hid/i2c-hid/i2c-hid.c +++ b/drivers/hid/i2c-hid/i2c-hid.c | |||
| @@ -706,12 +706,7 @@ static int i2c_hid_start(struct hid_device *hid) | |||
| 706 | 706 | ||
| 707 | static void i2c_hid_stop(struct hid_device *hid) | 707 | static void i2c_hid_stop(struct hid_device *hid) |
| 708 | { | 708 | { |
| 709 | struct i2c_client *client = hid->driver_data; | ||
| 710 | struct i2c_hid *ihid = i2c_get_clientdata(client); | ||
| 711 | |||
| 712 | hid->claimed = 0; | 709 | hid->claimed = 0; |
| 713 | |||
| 714 | i2c_hid_free_buffers(ihid); | ||
| 715 | } | 710 | } |
| 716 | 711 | ||
| 717 | static int i2c_hid_open(struct hid_device *hid) | 712 | static int i2c_hid_open(struct hid_device *hid) |
diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c index dc89be90b35e..b27b3d33ebab 100644 --- a/drivers/hid/usbhid/hid-quirks.c +++ b/drivers/hid/usbhid/hid-quirks.c | |||
| @@ -124,6 +124,7 @@ static const struct hid_blacklist { | |||
| 124 | { USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_WIRELESS, HID_QUIRK_MULTI_INPUT }, | 124 | { USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_WIRELESS, HID_QUIRK_MULTI_INPUT }, |
| 125 | { USB_VENDOR_ID_SIGMA_MICRO, USB_DEVICE_ID_SIGMA_MICRO_KEYBOARD, HID_QUIRK_NO_INIT_REPORTS }, | 125 | { USB_VENDOR_ID_SIGMA_MICRO, USB_DEVICE_ID_SIGMA_MICRO_KEYBOARD, HID_QUIRK_NO_INIT_REPORTS }, |
| 126 | { USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X, HID_QUIRK_MULTI_INPUT }, | 126 | { USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X, HID_QUIRK_MULTI_INPUT }, |
| 127 | { USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X_2, HID_QUIRK_MULTI_INPUT }, | ||
| 127 | { USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X, HID_QUIRK_MULTI_INPUT }, | 128 | { USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X, HID_QUIRK_MULTI_INPUT }, |
| 128 | { USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_DUOSENSE, HID_QUIRK_NO_INIT_REPORTS }, | 129 | { USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_DUOSENSE, HID_QUIRK_NO_INIT_REPORTS }, |
| 129 | { USB_VENDOR_ID_SEMICO, USB_DEVICE_ID_SEMICO_USB_KEYKOARD, HID_QUIRK_NO_INIT_REPORTS }, | 130 | { USB_VENDOR_ID_SEMICO, USB_DEVICE_ID_SEMICO_USB_KEYKOARD, HID_QUIRK_NO_INIT_REPORTS }, |
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/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig index 31e8308ba899..ab838d9e28b6 100644 --- a/drivers/i2c/busses/Kconfig +++ b/drivers/i2c/busses/Kconfig | |||
| @@ -881,6 +881,7 @@ config I2C_XLR | |||
| 881 | config I2C_RCAR | 881 | config I2C_RCAR |
| 882 | tristate "Renesas R-Car I2C Controller" | 882 | tristate "Renesas R-Car I2C Controller" |
| 883 | depends on ARCH_SHMOBILE || COMPILE_TEST | 883 | depends on ARCH_SHMOBILE || COMPILE_TEST |
| 884 | select I2C_SLAVE | ||
| 884 | help | 885 | help |
| 885 | If you say yes to this option, support will be included for the | 886 | If you say yes to this option, support will be included for the |
| 886 | R-Car I2C controller. | 887 | R-Car I2C controller. |
diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c index bff20a589621..958c8db4ec30 100644 --- a/drivers/i2c/busses/i2c-s3c2410.c +++ b/drivers/i2c/busses/i2c-s3c2410.c | |||
| @@ -785,14 +785,16 @@ static int s3c24xx_i2c_xfer(struct i2c_adapter *adap, | |||
| 785 | int ret; | 785 | int ret; |
| 786 | 786 | ||
| 787 | pm_runtime_get_sync(&adap->dev); | 787 | pm_runtime_get_sync(&adap->dev); |
| 788 | clk_prepare_enable(i2c->clk); | 788 | ret = clk_enable(i2c->clk); |
| 789 | if (ret) | ||
| 790 | return ret; | ||
| 789 | 791 | ||
| 790 | for (retry = 0; retry < adap->retries; retry++) { | 792 | for (retry = 0; retry < adap->retries; retry++) { |
| 791 | 793 | ||
| 792 | ret = s3c24xx_i2c_doxfer(i2c, msgs, num); | 794 | ret = s3c24xx_i2c_doxfer(i2c, msgs, num); |
| 793 | 795 | ||
| 794 | if (ret != -EAGAIN) { | 796 | if (ret != -EAGAIN) { |
| 795 | clk_disable_unprepare(i2c->clk); | 797 | clk_disable(i2c->clk); |
| 796 | pm_runtime_put(&adap->dev); | 798 | pm_runtime_put(&adap->dev); |
| 797 | return ret; | 799 | return ret; |
| 798 | } | 800 | } |
| @@ -802,7 +804,7 @@ static int s3c24xx_i2c_xfer(struct i2c_adapter *adap, | |||
| 802 | udelay(100); | 804 | udelay(100); |
| 803 | } | 805 | } |
| 804 | 806 | ||
| 805 | clk_disable_unprepare(i2c->clk); | 807 | clk_disable(i2c->clk); |
| 806 | pm_runtime_put(&adap->dev); | 808 | pm_runtime_put(&adap->dev); |
| 807 | return -EREMOTEIO; | 809 | return -EREMOTEIO; |
| 808 | } | 810 | } |
| @@ -1197,7 +1199,7 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev) | |||
| 1197 | 1199 | ||
| 1198 | clk_prepare_enable(i2c->clk); | 1200 | clk_prepare_enable(i2c->clk); |
| 1199 | ret = s3c24xx_i2c_init(i2c); | 1201 | ret = s3c24xx_i2c_init(i2c); |
| 1200 | clk_disable_unprepare(i2c->clk); | 1202 | clk_disable(i2c->clk); |
| 1201 | if (ret != 0) { | 1203 | if (ret != 0) { |
| 1202 | dev_err(&pdev->dev, "I2C controller init failed\n"); | 1204 | dev_err(&pdev->dev, "I2C controller init failed\n"); |
| 1203 | return ret; | 1205 | return ret; |
| @@ -1210,6 +1212,7 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev) | |||
| 1210 | i2c->irq = ret = platform_get_irq(pdev, 0); | 1212 | i2c->irq = ret = platform_get_irq(pdev, 0); |
| 1211 | if (ret <= 0) { | 1213 | if (ret <= 0) { |
| 1212 | dev_err(&pdev->dev, "cannot find IRQ\n"); | 1214 | dev_err(&pdev->dev, "cannot find IRQ\n"); |
| 1215 | clk_unprepare(i2c->clk); | ||
| 1213 | return ret; | 1216 | return ret; |
| 1214 | } | 1217 | } |
| 1215 | 1218 | ||
| @@ -1218,6 +1221,7 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev) | |||
| 1218 | 1221 | ||
| 1219 | if (ret != 0) { | 1222 | if (ret != 0) { |
| 1220 | dev_err(&pdev->dev, "cannot claim IRQ %d\n", i2c->irq); | 1223 | dev_err(&pdev->dev, "cannot claim IRQ %d\n", i2c->irq); |
| 1224 | clk_unprepare(i2c->clk); | ||
| 1221 | return ret; | 1225 | return ret; |
| 1222 | } | 1226 | } |
| 1223 | } | 1227 | } |
| @@ -1225,6 +1229,7 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev) | |||
| 1225 | ret = s3c24xx_i2c_register_cpufreq(i2c); | 1229 | ret = s3c24xx_i2c_register_cpufreq(i2c); |
| 1226 | if (ret < 0) { | 1230 | if (ret < 0) { |
| 1227 | dev_err(&pdev->dev, "failed to register cpufreq notifier\n"); | 1231 | dev_err(&pdev->dev, "failed to register cpufreq notifier\n"); |
| 1232 | clk_unprepare(i2c->clk); | ||
| 1228 | return ret; | 1233 | return ret; |
| 1229 | } | 1234 | } |
| 1230 | 1235 | ||
| @@ -1241,6 +1246,7 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev) | |||
| 1241 | if (ret < 0) { | 1246 | if (ret < 0) { |
| 1242 | dev_err(&pdev->dev, "failed to add bus to i2c core\n"); | 1247 | dev_err(&pdev->dev, "failed to add bus to i2c core\n"); |
| 1243 | s3c24xx_i2c_deregister_cpufreq(i2c); | 1248 | s3c24xx_i2c_deregister_cpufreq(i2c); |
| 1249 | clk_unprepare(i2c->clk); | ||
| 1244 | return ret; | 1250 | return ret; |
| 1245 | } | 1251 | } |
| 1246 | 1252 | ||
| @@ -1262,6 +1268,8 @@ static int s3c24xx_i2c_remove(struct platform_device *pdev) | |||
| 1262 | { | 1268 | { |
| 1263 | struct s3c24xx_i2c *i2c = platform_get_drvdata(pdev); | 1269 | struct s3c24xx_i2c *i2c = platform_get_drvdata(pdev); |
| 1264 | 1270 | ||
| 1271 | clk_unprepare(i2c->clk); | ||
| 1272 | |||
| 1265 | pm_runtime_disable(&i2c->adap.dev); | 1273 | pm_runtime_disable(&i2c->adap.dev); |
| 1266 | pm_runtime_disable(&pdev->dev); | 1274 | pm_runtime_disable(&pdev->dev); |
| 1267 | 1275 | ||
| @@ -1293,13 +1301,16 @@ static int s3c24xx_i2c_resume_noirq(struct device *dev) | |||
| 1293 | { | 1301 | { |
| 1294 | struct platform_device *pdev = to_platform_device(dev); | 1302 | struct platform_device *pdev = to_platform_device(dev); |
| 1295 | struct s3c24xx_i2c *i2c = platform_get_drvdata(pdev); | 1303 | struct s3c24xx_i2c *i2c = platform_get_drvdata(pdev); |
| 1304 | int ret; | ||
| 1296 | 1305 | ||
| 1297 | if (!IS_ERR(i2c->sysreg)) | 1306 | if (!IS_ERR(i2c->sysreg)) |
| 1298 | regmap_write(i2c->sysreg, EXYNOS5_SYS_I2C_CFG, i2c->sys_i2c_cfg); | 1307 | regmap_write(i2c->sysreg, EXYNOS5_SYS_I2C_CFG, i2c->sys_i2c_cfg); |
| 1299 | 1308 | ||
| 1300 | clk_prepare_enable(i2c->clk); | 1309 | ret = clk_enable(i2c->clk); |
| 1310 | if (ret) | ||
| 1311 | return ret; | ||
| 1301 | s3c24xx_i2c_init(i2c); | 1312 | s3c24xx_i2c_init(i2c); |
| 1302 | clk_disable_unprepare(i2c->clk); | 1313 | clk_disable(i2c->clk); |
| 1303 | i2c->suspended = 0; | 1314 | i2c->suspended = 0; |
| 1304 | 1315 | ||
| 1305 | return 0; | 1316 | return 0; |
diff --git a/drivers/i2c/busses/i2c-sh_mobile.c b/drivers/i2c/busses/i2c-sh_mobile.c index 440d5dbc8b5f..007818b3e174 100644 --- a/drivers/i2c/busses/i2c-sh_mobile.c +++ b/drivers/i2c/busses/i2c-sh_mobile.c | |||
| @@ -139,6 +139,7 @@ struct sh_mobile_i2c_data { | |||
| 139 | int pos; | 139 | int pos; |
| 140 | int sr; | 140 | int sr; |
| 141 | bool send_stop; | 141 | bool send_stop; |
| 142 | bool stop_after_dma; | ||
| 142 | 143 | ||
| 143 | struct resource *res; | 144 | struct resource *res; |
| 144 | struct dma_chan *dma_tx; | 145 | struct dma_chan *dma_tx; |
| @@ -407,7 +408,7 @@ static int sh_mobile_i2c_isr_tx(struct sh_mobile_i2c_data *pd) | |||
| 407 | 408 | ||
| 408 | if (pd->pos == pd->msg->len) { | 409 | if (pd->pos == pd->msg->len) { |
| 409 | /* Send stop if we haven't yet (DMA case) */ | 410 | /* Send stop if we haven't yet (DMA case) */ |
| 410 | if (pd->send_stop && (iic_rd(pd, ICCR) & ICCR_BBSY)) | 411 | if (pd->send_stop && pd->stop_after_dma) |
| 411 | i2c_op(pd, OP_TX_STOP, 0); | 412 | i2c_op(pd, OP_TX_STOP, 0); |
| 412 | return 1; | 413 | return 1; |
| 413 | } | 414 | } |
| @@ -449,6 +450,13 @@ static int sh_mobile_i2c_isr_rx(struct sh_mobile_i2c_data *pd) | |||
| 449 | real_pos = pd->pos - 2; | 450 | real_pos = pd->pos - 2; |
| 450 | 451 | ||
| 451 | if (pd->pos == pd->msg->len) { | 452 | if (pd->pos == pd->msg->len) { |
| 453 | if (pd->stop_after_dma) { | ||
| 454 | /* Simulate PIO end condition after DMA transfer */ | ||
| 455 | i2c_op(pd, OP_RX_STOP, 0); | ||
| 456 | pd->pos++; | ||
| 457 | break; | ||
| 458 | } | ||
| 459 | |||
| 452 | if (real_pos < 0) { | 460 | if (real_pos < 0) { |
| 453 | i2c_op(pd, OP_RX_STOP, 0); | 461 | i2c_op(pd, OP_RX_STOP, 0); |
| 454 | break; | 462 | break; |
| @@ -536,6 +544,7 @@ static void sh_mobile_i2c_dma_callback(void *data) | |||
| 536 | 544 | ||
| 537 | sh_mobile_i2c_dma_unmap(pd); | 545 | sh_mobile_i2c_dma_unmap(pd); |
| 538 | pd->pos = pd->msg->len; | 546 | pd->pos = pd->msg->len; |
| 547 | pd->stop_after_dma = true; | ||
| 539 | 548 | ||
| 540 | iic_set_clr(pd, ICIC, 0, ICIC_TDMAE | ICIC_RDMAE); | 549 | iic_set_clr(pd, ICIC, 0, ICIC_TDMAE | ICIC_RDMAE); |
| 541 | } | 550 | } |
| @@ -726,6 +735,7 @@ static int sh_mobile_i2c_xfer(struct i2c_adapter *adapter, | |||
| 726 | bool do_start = pd->send_stop || !i; | 735 | bool do_start = pd->send_stop || !i; |
| 727 | msg = &msgs[i]; | 736 | msg = &msgs[i]; |
| 728 | pd->send_stop = i == num - 1 || msg->flags & I2C_M_STOP; | 737 | pd->send_stop = i == num - 1 || msg->flags & I2C_M_STOP; |
| 738 | pd->stop_after_dma = false; | ||
| 729 | 739 | ||
| 730 | err = start_ch(pd, msg, do_start); | 740 | err = start_ch(pd, msg, do_start); |
| 731 | if (err) | 741 | if (err) |
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index 39d25a8cb1ad..e9eae57a2b50 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c | |||
| @@ -2972,6 +2972,7 @@ trace: | |||
| 2972 | } | 2972 | } |
| 2973 | EXPORT_SYMBOL(i2c_smbus_xfer); | 2973 | EXPORT_SYMBOL(i2c_smbus_xfer); |
| 2974 | 2974 | ||
| 2975 | #if IS_ENABLED(CONFIG_I2C_SLAVE) | ||
| 2975 | int i2c_slave_register(struct i2c_client *client, i2c_slave_cb_t slave_cb) | 2976 | int i2c_slave_register(struct i2c_client *client, i2c_slave_cb_t slave_cb) |
| 2976 | { | 2977 | { |
| 2977 | int ret; | 2978 | int ret; |
| @@ -3019,6 +3020,7 @@ int i2c_slave_unregister(struct i2c_client *client) | |||
| 3019 | return ret; | 3020 | return ret; |
| 3020 | } | 3021 | } |
| 3021 | EXPORT_SYMBOL_GPL(i2c_slave_unregister); | 3022 | EXPORT_SYMBOL_GPL(i2c_slave_unregister); |
| 3023 | #endif | ||
| 3022 | 3024 | ||
| 3023 | MODULE_AUTHOR("Simon G. Vogl <simon@tk.uni-linz.ac.at>"); | 3025 | MODULE_AUTHOR("Simon G. Vogl <simon@tk.uni-linz.ac.at>"); |
| 3024 | MODULE_DESCRIPTION("I2C-Bus main module"); | 3026 | MODULE_DESCRIPTION("I2C-Bus main module"); |
diff --git a/drivers/i2c/i2c-slave-eeprom.c b/drivers/i2c/i2c-slave-eeprom.c index 6631400b5f02..cf9b09db092f 100644 --- a/drivers/i2c/i2c-slave-eeprom.c +++ b/drivers/i2c/i2c-slave-eeprom.c | |||
| @@ -74,7 +74,7 @@ static ssize_t i2c_slave_eeprom_bin_read(struct file *filp, struct kobject *kobj | |||
| 74 | struct eeprom_data *eeprom; | 74 | struct eeprom_data *eeprom; |
| 75 | unsigned long flags; | 75 | unsigned long flags; |
| 76 | 76 | ||
| 77 | if (off + count >= attr->size) | 77 | if (off + count > attr->size) |
| 78 | return -EFBIG; | 78 | return -EFBIG; |
| 79 | 79 | ||
| 80 | eeprom = dev_get_drvdata(container_of(kobj, struct device, kobj)); | 80 | eeprom = dev_get_drvdata(container_of(kobj, struct device, kobj)); |
| @@ -92,7 +92,7 @@ static ssize_t i2c_slave_eeprom_bin_write(struct file *filp, struct kobject *kob | |||
| 92 | struct eeprom_data *eeprom; | 92 | struct eeprom_data *eeprom; |
| 93 | unsigned long flags; | 93 | unsigned long flags; |
| 94 | 94 | ||
| 95 | if (off + count >= attr->size) | 95 | if (off + count > attr->size) |
| 96 | return -EFBIG; | 96 | return -EFBIG; |
| 97 | 97 | ||
| 98 | eeprom = dev_get_drvdata(container_of(kobj, struct device, kobj)); | 98 | eeprom = dev_get_drvdata(container_of(kobj, struct device, kobj)); |
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/core/uverbs.h b/drivers/infiniband/core/uverbs.h index b716b0815644..643c08a025a5 100644 --- a/drivers/infiniband/core/uverbs.h +++ b/drivers/infiniband/core/uverbs.h | |||
| @@ -258,6 +258,5 @@ IB_UVERBS_DECLARE_CMD(close_xrcd); | |||
| 258 | 258 | ||
| 259 | IB_UVERBS_DECLARE_EX_CMD(create_flow); | 259 | IB_UVERBS_DECLARE_EX_CMD(create_flow); |
| 260 | IB_UVERBS_DECLARE_EX_CMD(destroy_flow); | 260 | IB_UVERBS_DECLARE_EX_CMD(destroy_flow); |
| 261 | IB_UVERBS_DECLARE_EX_CMD(query_device); | ||
| 262 | 261 | ||
| 263 | #endif /* UVERBS_H */ | 262 | #endif /* UVERBS_H */ |
diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c index 532d8eba8b02..b7943ff16ed3 100644 --- a/drivers/infiniband/core/uverbs_cmd.c +++ b/drivers/infiniband/core/uverbs_cmd.c | |||
| @@ -400,52 +400,6 @@ err: | |||
| 400 | return ret; | 400 | return ret; |
| 401 | } | 401 | } |
| 402 | 402 | ||
| 403 | static void copy_query_dev_fields(struct ib_uverbs_file *file, | ||
| 404 | struct ib_uverbs_query_device_resp *resp, | ||
| 405 | struct ib_device_attr *attr) | ||
| 406 | { | ||
| 407 | resp->fw_ver = attr->fw_ver; | ||
| 408 | resp->node_guid = file->device->ib_dev->node_guid; | ||
| 409 | resp->sys_image_guid = attr->sys_image_guid; | ||
| 410 | resp->max_mr_size = attr->max_mr_size; | ||
| 411 | resp->page_size_cap = attr->page_size_cap; | ||
| 412 | resp->vendor_id = attr->vendor_id; | ||
| 413 | resp->vendor_part_id = attr->vendor_part_id; | ||
| 414 | resp->hw_ver = attr->hw_ver; | ||
| 415 | resp->max_qp = attr->max_qp; | ||
| 416 | resp->max_qp_wr = attr->max_qp_wr; | ||
| 417 | resp->device_cap_flags = attr->device_cap_flags; | ||
| 418 | resp->max_sge = attr->max_sge; | ||
| 419 | resp->max_sge_rd = attr->max_sge_rd; | ||
| 420 | resp->max_cq = attr->max_cq; | ||
| 421 | resp->max_cqe = attr->max_cqe; | ||
| 422 | resp->max_mr = attr->max_mr; | ||
| 423 | resp->max_pd = attr->max_pd; | ||
| 424 | resp->max_qp_rd_atom = attr->max_qp_rd_atom; | ||
| 425 | resp->max_ee_rd_atom = attr->max_ee_rd_atom; | ||
| 426 | resp->max_res_rd_atom = attr->max_res_rd_atom; | ||
| 427 | resp->max_qp_init_rd_atom = attr->max_qp_init_rd_atom; | ||
| 428 | resp->max_ee_init_rd_atom = attr->max_ee_init_rd_atom; | ||
| 429 | resp->atomic_cap = attr->atomic_cap; | ||
| 430 | resp->max_ee = attr->max_ee; | ||
| 431 | resp->max_rdd = attr->max_rdd; | ||
| 432 | resp->max_mw = attr->max_mw; | ||
| 433 | resp->max_raw_ipv6_qp = attr->max_raw_ipv6_qp; | ||
| 434 | resp->max_raw_ethy_qp = attr->max_raw_ethy_qp; | ||
| 435 | resp->max_mcast_grp = attr->max_mcast_grp; | ||
| 436 | resp->max_mcast_qp_attach = attr->max_mcast_qp_attach; | ||
| 437 | resp->max_total_mcast_qp_attach = attr->max_total_mcast_qp_attach; | ||
| 438 | resp->max_ah = attr->max_ah; | ||
| 439 | resp->max_fmr = attr->max_fmr; | ||
| 440 | resp->max_map_per_fmr = attr->max_map_per_fmr; | ||
| 441 | resp->max_srq = attr->max_srq; | ||
| 442 | resp->max_srq_wr = attr->max_srq_wr; | ||
| 443 | resp->max_srq_sge = attr->max_srq_sge; | ||
| 444 | resp->max_pkeys = attr->max_pkeys; | ||
| 445 | resp->local_ca_ack_delay = attr->local_ca_ack_delay; | ||
| 446 | resp->phys_port_cnt = file->device->ib_dev->phys_port_cnt; | ||
| 447 | } | ||
| 448 | |||
| 449 | ssize_t ib_uverbs_query_device(struct ib_uverbs_file *file, | 403 | ssize_t ib_uverbs_query_device(struct ib_uverbs_file *file, |
| 450 | const char __user *buf, | 404 | const char __user *buf, |
| 451 | int in_len, int out_len) | 405 | int in_len, int out_len) |
| @@ -466,7 +420,47 @@ ssize_t ib_uverbs_query_device(struct ib_uverbs_file *file, | |||
| 466 | return ret; | 420 | return ret; |
| 467 | 421 | ||
| 468 | memset(&resp, 0, sizeof resp); | 422 | memset(&resp, 0, sizeof resp); |
| 469 | copy_query_dev_fields(file, &resp, &attr); | 423 | |
| 424 | resp.fw_ver = attr.fw_ver; | ||
| 425 | resp.node_guid = file->device->ib_dev->node_guid; | ||
| 426 | resp.sys_image_guid = attr.sys_image_guid; | ||
| 427 | resp.max_mr_size = attr.max_mr_size; | ||
| 428 | resp.page_size_cap = attr.page_size_cap; | ||
| 429 | resp.vendor_id = attr.vendor_id; | ||
| 430 | resp.vendor_part_id = attr.vendor_part_id; | ||
| 431 | resp.hw_ver = attr.hw_ver; | ||
| 432 | resp.max_qp = attr.max_qp; | ||
| 433 | resp.max_qp_wr = attr.max_qp_wr; | ||
| 434 | resp.device_cap_flags = attr.device_cap_flags; | ||
| 435 | resp.max_sge = attr.max_sge; | ||
| 436 | resp.max_sge_rd = attr.max_sge_rd; | ||
| 437 | resp.max_cq = attr.max_cq; | ||
| 438 | resp.max_cqe = attr.max_cqe; | ||
| 439 | resp.max_mr = attr.max_mr; | ||
| 440 | resp.max_pd = attr.max_pd; | ||
| 441 | resp.max_qp_rd_atom = attr.max_qp_rd_atom; | ||
| 442 | resp.max_ee_rd_atom = attr.max_ee_rd_atom; | ||
| 443 | resp.max_res_rd_atom = attr.max_res_rd_atom; | ||
| 444 | resp.max_qp_init_rd_atom = attr.max_qp_init_rd_atom; | ||
| 445 | resp.max_ee_init_rd_atom = attr.max_ee_init_rd_atom; | ||
| 446 | resp.atomic_cap = attr.atomic_cap; | ||
| 447 | resp.max_ee = attr.max_ee; | ||
| 448 | resp.max_rdd = attr.max_rdd; | ||
| 449 | resp.max_mw = attr.max_mw; | ||
| 450 | resp.max_raw_ipv6_qp = attr.max_raw_ipv6_qp; | ||
| 451 | resp.max_raw_ethy_qp = attr.max_raw_ethy_qp; | ||
| 452 | resp.max_mcast_grp = attr.max_mcast_grp; | ||
| 453 | resp.max_mcast_qp_attach = attr.max_mcast_qp_attach; | ||
| 454 | resp.max_total_mcast_qp_attach = attr.max_total_mcast_qp_attach; | ||
| 455 | resp.max_ah = attr.max_ah; | ||
| 456 | resp.max_fmr = attr.max_fmr; | ||
| 457 | resp.max_map_per_fmr = attr.max_map_per_fmr; | ||
| 458 | resp.max_srq = attr.max_srq; | ||
| 459 | resp.max_srq_wr = attr.max_srq_wr; | ||
| 460 | resp.max_srq_sge = attr.max_srq_sge; | ||
| 461 | resp.max_pkeys = attr.max_pkeys; | ||
| 462 | resp.local_ca_ack_delay = attr.local_ca_ack_delay; | ||
| 463 | resp.phys_port_cnt = file->device->ib_dev->phys_port_cnt; | ||
| 470 | 464 | ||
| 471 | if (copy_to_user((void __user *) (unsigned long) cmd.response, | 465 | if (copy_to_user((void __user *) (unsigned long) cmd.response, |
| 472 | &resp, sizeof resp)) | 466 | &resp, sizeof resp)) |
| @@ -3293,52 +3287,3 @@ ssize_t ib_uverbs_destroy_srq(struct ib_uverbs_file *file, | |||
| 3293 | 3287 | ||
| 3294 | return ret ? ret : in_len; | 3288 | return ret ? ret : in_len; |
| 3295 | } | 3289 | } |
| 3296 | |||
| 3297 | int ib_uverbs_ex_query_device(struct ib_uverbs_file *file, | ||
| 3298 | struct ib_udata *ucore, | ||
| 3299 | struct ib_udata *uhw) | ||
| 3300 | { | ||
| 3301 | struct ib_uverbs_ex_query_device_resp resp; | ||
| 3302 | struct ib_uverbs_ex_query_device cmd; | ||
| 3303 | struct ib_device_attr attr; | ||
| 3304 | struct ib_device *device; | ||
| 3305 | int err; | ||
| 3306 | |||
| 3307 | device = file->device->ib_dev; | ||
| 3308 | if (ucore->inlen < sizeof(cmd)) | ||
| 3309 | return -EINVAL; | ||
| 3310 | |||
| 3311 | err = ib_copy_from_udata(&cmd, ucore, sizeof(cmd)); | ||
| 3312 | if (err) | ||
| 3313 | return err; | ||
| 3314 | |||
| 3315 | if (cmd.reserved) | ||
| 3316 | return -EINVAL; | ||
| 3317 | |||
| 3318 | err = device->query_device(device, &attr); | ||
| 3319 | if (err) | ||
| 3320 | return err; | ||
| 3321 | |||
| 3322 | memset(&resp, 0, sizeof(resp)); | ||
| 3323 | copy_query_dev_fields(file, &resp.base, &attr); | ||
| 3324 | resp.comp_mask = 0; | ||
| 3325 | |||
| 3326 | #ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING | ||
| 3327 | if (cmd.comp_mask & IB_USER_VERBS_EX_QUERY_DEVICE_ODP) { | ||
| 3328 | resp.odp_caps.general_caps = attr.odp_caps.general_caps; | ||
| 3329 | resp.odp_caps.per_transport_caps.rc_odp_caps = | ||
| 3330 | attr.odp_caps.per_transport_caps.rc_odp_caps; | ||
| 3331 | resp.odp_caps.per_transport_caps.uc_odp_caps = | ||
| 3332 | attr.odp_caps.per_transport_caps.uc_odp_caps; | ||
| 3333 | resp.odp_caps.per_transport_caps.ud_odp_caps = | ||
| 3334 | attr.odp_caps.per_transport_caps.ud_odp_caps; | ||
| 3335 | resp.comp_mask |= IB_USER_VERBS_EX_QUERY_DEVICE_ODP; | ||
| 3336 | } | ||
| 3337 | #endif | ||
| 3338 | |||
| 3339 | err = ib_copy_to_udata(ucore, &resp, sizeof(resp)); | ||
| 3340 | if (err) | ||
| 3341 | return err; | ||
| 3342 | |||
| 3343 | return 0; | ||
| 3344 | } | ||
diff --git a/drivers/infiniband/core/uverbs_main.c b/drivers/infiniband/core/uverbs_main.c index e6c23b9eab33..5db1a8cc388d 100644 --- a/drivers/infiniband/core/uverbs_main.c +++ b/drivers/infiniband/core/uverbs_main.c | |||
| @@ -123,7 +123,6 @@ static int (*uverbs_ex_cmd_table[])(struct ib_uverbs_file *file, | |||
| 123 | struct ib_udata *uhw) = { | 123 | struct ib_udata *uhw) = { |
| 124 | [IB_USER_VERBS_EX_CMD_CREATE_FLOW] = ib_uverbs_ex_create_flow, | 124 | [IB_USER_VERBS_EX_CMD_CREATE_FLOW] = ib_uverbs_ex_create_flow, |
| 125 | [IB_USER_VERBS_EX_CMD_DESTROY_FLOW] = ib_uverbs_ex_destroy_flow, | 125 | [IB_USER_VERBS_EX_CMD_DESTROY_FLOW] = ib_uverbs_ex_destroy_flow, |
| 126 | [IB_USER_VERBS_EX_CMD_QUERY_DEVICE] = ib_uverbs_ex_query_device | ||
| 127 | }; | 126 | }; |
| 128 | 127 | ||
| 129 | static void ib_uverbs_add_one(struct ib_device *device); | 128 | static void ib_uverbs_add_one(struct ib_device *device); |
diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c index 57ecc5b204f3..9117b7a2d5f8 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/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c index 8a87404e9c76..03bf81211a54 100644 --- a/drivers/infiniband/hw/mlx5/main.c +++ b/drivers/infiniband/hw/mlx5/main.c | |||
| @@ -1331,8 +1331,6 @@ static void *mlx5_ib_add(struct mlx5_core_dev *mdev) | |||
| 1331 | (1ull << IB_USER_VERBS_CMD_DESTROY_SRQ) | | 1331 | (1ull << IB_USER_VERBS_CMD_DESTROY_SRQ) | |
| 1332 | (1ull << IB_USER_VERBS_CMD_CREATE_XSRQ) | | 1332 | (1ull << IB_USER_VERBS_CMD_CREATE_XSRQ) | |
| 1333 | (1ull << IB_USER_VERBS_CMD_OPEN_QP); | 1333 | (1ull << IB_USER_VERBS_CMD_OPEN_QP); |
| 1334 | dev->ib_dev.uverbs_ex_cmd_mask = | ||
| 1335 | (1ull << IB_USER_VERBS_EX_CMD_QUERY_DEVICE); | ||
| 1336 | 1334 | ||
| 1337 | dev->ib_dev.query_device = mlx5_ib_query_device; | 1335 | dev->ib_dev.query_device = mlx5_ib_query_device; |
| 1338 | dev->ib_dev.query_port = mlx5_ib_query_port; | 1336 | dev->ib_dev.query_port = mlx5_ib_query_port; |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib.h b/drivers/infiniband/ulp/ipoib/ipoib.h index 8ba80a6d3a46..d7562beb5423 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib.h +++ b/drivers/infiniband/ulp/ipoib/ipoib.h | |||
| @@ -98,15 +98,9 @@ enum { | |||
| 98 | 98 | ||
| 99 | IPOIB_MCAST_FLAG_FOUND = 0, /* used in set_multicast_list */ | 99 | IPOIB_MCAST_FLAG_FOUND = 0, /* used in set_multicast_list */ |
| 100 | IPOIB_MCAST_FLAG_SENDONLY = 1, | 100 | IPOIB_MCAST_FLAG_SENDONLY = 1, |
| 101 | /* | 101 | IPOIB_MCAST_FLAG_BUSY = 2, /* joining or already joined */ |
| 102 | * For IPOIB_MCAST_FLAG_BUSY | ||
| 103 | * When set, in flight join and mcast->mc is unreliable | ||
| 104 | * When clear and mcast->mc IS_ERR_OR_NULL, need to restart or | ||
| 105 | * haven't started yet | ||
| 106 | * When clear and mcast->mc is valid pointer, join was successful | ||
| 107 | */ | ||
| 108 | IPOIB_MCAST_FLAG_BUSY = 2, | ||
| 109 | IPOIB_MCAST_FLAG_ATTACHED = 3, | 102 | IPOIB_MCAST_FLAG_ATTACHED = 3, |
| 103 | IPOIB_MCAST_JOIN_STARTED = 4, | ||
| 110 | 104 | ||
| 111 | MAX_SEND_CQE = 16, | 105 | MAX_SEND_CQE = 16, |
| 112 | IPOIB_CM_COPYBREAK = 256, | 106 | IPOIB_CM_COPYBREAK = 256, |
| @@ -323,7 +317,6 @@ struct ipoib_dev_priv { | |||
| 323 | struct list_head multicast_list; | 317 | struct list_head multicast_list; |
| 324 | struct rb_root multicast_tree; | 318 | struct rb_root multicast_tree; |
| 325 | 319 | ||
| 326 | struct workqueue_struct *wq; | ||
| 327 | struct delayed_work mcast_task; | 320 | struct delayed_work mcast_task; |
| 328 | struct work_struct carrier_on_task; | 321 | struct work_struct carrier_on_task; |
| 329 | struct work_struct flush_light; | 322 | struct work_struct flush_light; |
| @@ -484,10 +477,10 @@ void ipoib_ib_dev_flush_heavy(struct work_struct *work); | |||
| 484 | void ipoib_pkey_event(struct work_struct *work); | 477 | void ipoib_pkey_event(struct work_struct *work); |
| 485 | void ipoib_ib_dev_cleanup(struct net_device *dev); | 478 | void ipoib_ib_dev_cleanup(struct net_device *dev); |
| 486 | 479 | ||
| 487 | int ipoib_ib_dev_open(struct net_device *dev); | 480 | int ipoib_ib_dev_open(struct net_device *dev, int flush); |
| 488 | int ipoib_ib_dev_up(struct net_device *dev); | 481 | int ipoib_ib_dev_up(struct net_device *dev); |
| 489 | int ipoib_ib_dev_down(struct net_device *dev); | 482 | int ipoib_ib_dev_down(struct net_device *dev, int flush); |
| 490 | int ipoib_ib_dev_stop(struct net_device *dev); | 483 | int ipoib_ib_dev_stop(struct net_device *dev, int flush); |
| 491 | void ipoib_pkey_dev_check_presence(struct net_device *dev); | 484 | void ipoib_pkey_dev_check_presence(struct net_device *dev); |
| 492 | 485 | ||
| 493 | int ipoib_dev_init(struct net_device *dev, struct ib_device *ca, int port); | 486 | int ipoib_dev_init(struct net_device *dev, struct ib_device *ca, int port); |
| @@ -499,7 +492,7 @@ void ipoib_mcast_send(struct net_device *dev, u8 *daddr, struct sk_buff *skb); | |||
| 499 | 492 | ||
| 500 | void ipoib_mcast_restart_task(struct work_struct *work); | 493 | void ipoib_mcast_restart_task(struct work_struct *work); |
| 501 | int ipoib_mcast_start_thread(struct net_device *dev); | 494 | int ipoib_mcast_start_thread(struct net_device *dev); |
| 502 | int ipoib_mcast_stop_thread(struct net_device *dev); | 495 | int ipoib_mcast_stop_thread(struct net_device *dev, int flush); |
| 503 | 496 | ||
| 504 | void ipoib_mcast_dev_down(struct net_device *dev); | 497 | void ipoib_mcast_dev_down(struct net_device *dev); |
| 505 | void ipoib_mcast_dev_flush(struct net_device *dev); | 498 | void ipoib_mcast_dev_flush(struct net_device *dev); |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_cm.c b/drivers/infiniband/ulp/ipoib/ipoib_cm.c index 56959adb6c7d..933efcea0d03 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_cm.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_cm.c | |||
| @@ -474,7 +474,7 @@ static int ipoib_cm_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *even | |||
| 474 | } | 474 | } |
| 475 | 475 | ||
| 476 | spin_lock_irq(&priv->lock); | 476 | spin_lock_irq(&priv->lock); |
| 477 | queue_delayed_work(priv->wq, | 477 | queue_delayed_work(ipoib_workqueue, |
| 478 | &priv->cm.stale_task, IPOIB_CM_RX_DELAY); | 478 | &priv->cm.stale_task, IPOIB_CM_RX_DELAY); |
| 479 | /* Add this entry to passive ids list head, but do not re-add it | 479 | /* Add this entry to passive ids list head, but do not re-add it |
| 480 | * if IB_EVENT_QP_LAST_WQE_REACHED has moved it to flush list. */ | 480 | * if IB_EVENT_QP_LAST_WQE_REACHED has moved it to flush list. */ |
| @@ -576,7 +576,7 @@ void ipoib_cm_handle_rx_wc(struct net_device *dev, struct ib_wc *wc) | |||
| 576 | spin_lock_irqsave(&priv->lock, flags); | 576 | spin_lock_irqsave(&priv->lock, flags); |
| 577 | list_splice_init(&priv->cm.rx_drain_list, &priv->cm.rx_reap_list); | 577 | list_splice_init(&priv->cm.rx_drain_list, &priv->cm.rx_reap_list); |
| 578 | ipoib_cm_start_rx_drain(priv); | 578 | ipoib_cm_start_rx_drain(priv); |
| 579 | queue_work(priv->wq, &priv->cm.rx_reap_task); | 579 | queue_work(ipoib_workqueue, &priv->cm.rx_reap_task); |
| 580 | spin_unlock_irqrestore(&priv->lock, flags); | 580 | spin_unlock_irqrestore(&priv->lock, flags); |
| 581 | } else | 581 | } else |
| 582 | ipoib_warn(priv, "cm recv completion event with wrid %d (> %d)\n", | 582 | ipoib_warn(priv, "cm recv completion event with wrid %d (> %d)\n", |
| @@ -603,7 +603,7 @@ void ipoib_cm_handle_rx_wc(struct net_device *dev, struct ib_wc *wc) | |||
| 603 | spin_lock_irqsave(&priv->lock, flags); | 603 | spin_lock_irqsave(&priv->lock, flags); |
| 604 | list_move(&p->list, &priv->cm.rx_reap_list); | 604 | list_move(&p->list, &priv->cm.rx_reap_list); |
| 605 | spin_unlock_irqrestore(&priv->lock, flags); | 605 | spin_unlock_irqrestore(&priv->lock, flags); |
| 606 | queue_work(priv->wq, &priv->cm.rx_reap_task); | 606 | queue_work(ipoib_workqueue, &priv->cm.rx_reap_task); |
| 607 | } | 607 | } |
| 608 | return; | 608 | return; |
| 609 | } | 609 | } |
| @@ -827,7 +827,7 @@ void ipoib_cm_handle_tx_wc(struct net_device *dev, struct ib_wc *wc) | |||
| 827 | 827 | ||
| 828 | if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &tx->flags)) { | 828 | if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &tx->flags)) { |
| 829 | list_move(&tx->list, &priv->cm.reap_list); | 829 | list_move(&tx->list, &priv->cm.reap_list); |
| 830 | queue_work(priv->wq, &priv->cm.reap_task); | 830 | queue_work(ipoib_workqueue, &priv->cm.reap_task); |
| 831 | } | 831 | } |
| 832 | 832 | ||
| 833 | clear_bit(IPOIB_FLAG_OPER_UP, &tx->flags); | 833 | clear_bit(IPOIB_FLAG_OPER_UP, &tx->flags); |
| @@ -1255,7 +1255,7 @@ static int ipoib_cm_tx_handler(struct ib_cm_id *cm_id, | |||
| 1255 | 1255 | ||
| 1256 | if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &tx->flags)) { | 1256 | if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &tx->flags)) { |
| 1257 | list_move(&tx->list, &priv->cm.reap_list); | 1257 | list_move(&tx->list, &priv->cm.reap_list); |
| 1258 | queue_work(priv->wq, &priv->cm.reap_task); | 1258 | queue_work(ipoib_workqueue, &priv->cm.reap_task); |
| 1259 | } | 1259 | } |
| 1260 | 1260 | ||
| 1261 | spin_unlock_irqrestore(&priv->lock, flags); | 1261 | spin_unlock_irqrestore(&priv->lock, flags); |
| @@ -1284,7 +1284,7 @@ struct ipoib_cm_tx *ipoib_cm_create_tx(struct net_device *dev, struct ipoib_path | |||
| 1284 | tx->dev = dev; | 1284 | tx->dev = dev; |
| 1285 | list_add(&tx->list, &priv->cm.start_list); | 1285 | list_add(&tx->list, &priv->cm.start_list); |
| 1286 | set_bit(IPOIB_FLAG_INITIALIZED, &tx->flags); | 1286 | set_bit(IPOIB_FLAG_INITIALIZED, &tx->flags); |
| 1287 | queue_work(priv->wq, &priv->cm.start_task); | 1287 | queue_work(ipoib_workqueue, &priv->cm.start_task); |
| 1288 | return tx; | 1288 | return tx; |
| 1289 | } | 1289 | } |
| 1290 | 1290 | ||
| @@ -1295,7 +1295,7 @@ void ipoib_cm_destroy_tx(struct ipoib_cm_tx *tx) | |||
| 1295 | if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &tx->flags)) { | 1295 | if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &tx->flags)) { |
| 1296 | spin_lock_irqsave(&priv->lock, flags); | 1296 | spin_lock_irqsave(&priv->lock, flags); |
| 1297 | list_move(&tx->list, &priv->cm.reap_list); | 1297 | list_move(&tx->list, &priv->cm.reap_list); |
| 1298 | queue_work(priv->wq, &priv->cm.reap_task); | 1298 | queue_work(ipoib_workqueue, &priv->cm.reap_task); |
| 1299 | ipoib_dbg(priv, "Reap connection for gid %pI6\n", | 1299 | ipoib_dbg(priv, "Reap connection for gid %pI6\n", |
| 1300 | tx->neigh->daddr + 4); | 1300 | tx->neigh->daddr + 4); |
| 1301 | tx->neigh = NULL; | 1301 | tx->neigh = NULL; |
| @@ -1417,7 +1417,7 @@ void ipoib_cm_skb_too_long(struct net_device *dev, struct sk_buff *skb, | |||
| 1417 | 1417 | ||
| 1418 | skb_queue_tail(&priv->cm.skb_queue, skb); | 1418 | skb_queue_tail(&priv->cm.skb_queue, skb); |
| 1419 | if (e) | 1419 | if (e) |
| 1420 | queue_work(priv->wq, &priv->cm.skb_task); | 1420 | queue_work(ipoib_workqueue, &priv->cm.skb_task); |
| 1421 | } | 1421 | } |
| 1422 | 1422 | ||
| 1423 | static void ipoib_cm_rx_reap(struct work_struct *work) | 1423 | static void ipoib_cm_rx_reap(struct work_struct *work) |
| @@ -1450,7 +1450,7 @@ static void ipoib_cm_stale_task(struct work_struct *work) | |||
| 1450 | } | 1450 | } |
| 1451 | 1451 | ||
| 1452 | if (!list_empty(&priv->cm.passive_ids)) | 1452 | if (!list_empty(&priv->cm.passive_ids)) |
| 1453 | queue_delayed_work(priv->wq, | 1453 | queue_delayed_work(ipoib_workqueue, |
| 1454 | &priv->cm.stale_task, IPOIB_CM_RX_DELAY); | 1454 | &priv->cm.stale_task, IPOIB_CM_RX_DELAY); |
| 1455 | spin_unlock_irq(&priv->lock); | 1455 | spin_unlock_irq(&priv->lock); |
| 1456 | } | 1456 | } |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ib.c b/drivers/infiniband/ulp/ipoib/ipoib_ib.c index fe65abb5150c..72626c348174 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_ib.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_ib.c | |||
| @@ -655,7 +655,7 @@ void ipoib_reap_ah(struct work_struct *work) | |||
| 655 | __ipoib_reap_ah(dev); | 655 | __ipoib_reap_ah(dev); |
| 656 | 656 | ||
| 657 | if (!test_bit(IPOIB_STOP_REAPER, &priv->flags)) | 657 | if (!test_bit(IPOIB_STOP_REAPER, &priv->flags)) |
| 658 | queue_delayed_work(priv->wq, &priv->ah_reap_task, | 658 | queue_delayed_work(ipoib_workqueue, &priv->ah_reap_task, |
| 659 | round_jiffies_relative(HZ)); | 659 | round_jiffies_relative(HZ)); |
| 660 | } | 660 | } |
| 661 | 661 | ||
| @@ -664,7 +664,7 @@ static void ipoib_ib_tx_timer_func(unsigned long ctx) | |||
| 664 | drain_tx_cq((struct net_device *)ctx); | 664 | drain_tx_cq((struct net_device *)ctx); |
| 665 | } | 665 | } |
| 666 | 666 | ||
| 667 | int ipoib_ib_dev_open(struct net_device *dev) | 667 | int ipoib_ib_dev_open(struct net_device *dev, int flush) |
| 668 | { | 668 | { |
| 669 | struct ipoib_dev_priv *priv = netdev_priv(dev); | 669 | struct ipoib_dev_priv *priv = netdev_priv(dev); |
| 670 | int ret; | 670 | int ret; |
| @@ -696,7 +696,7 @@ int ipoib_ib_dev_open(struct net_device *dev) | |||
| 696 | } | 696 | } |
| 697 | 697 | ||
| 698 | clear_bit(IPOIB_STOP_REAPER, &priv->flags); | 698 | clear_bit(IPOIB_STOP_REAPER, &priv->flags); |
| 699 | queue_delayed_work(priv->wq, &priv->ah_reap_task, | 699 | queue_delayed_work(ipoib_workqueue, &priv->ah_reap_task, |
| 700 | round_jiffies_relative(HZ)); | 700 | round_jiffies_relative(HZ)); |
| 701 | 701 | ||
| 702 | if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags)) | 702 | if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags)) |
| @@ -706,7 +706,7 @@ int ipoib_ib_dev_open(struct net_device *dev) | |||
| 706 | dev_stop: | 706 | dev_stop: |
| 707 | if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags)) | 707 | if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags)) |
| 708 | napi_enable(&priv->napi); | 708 | napi_enable(&priv->napi); |
| 709 | ipoib_ib_dev_stop(dev); | 709 | ipoib_ib_dev_stop(dev, flush); |
| 710 | return -1; | 710 | return -1; |
| 711 | } | 711 | } |
| 712 | 712 | ||
| @@ -738,7 +738,7 @@ int ipoib_ib_dev_up(struct net_device *dev) | |||
| 738 | return ipoib_mcast_start_thread(dev); | 738 | return ipoib_mcast_start_thread(dev); |
| 739 | } | 739 | } |
| 740 | 740 | ||
| 741 | int ipoib_ib_dev_down(struct net_device *dev) | 741 | int ipoib_ib_dev_down(struct net_device *dev, int flush) |
| 742 | { | 742 | { |
| 743 | struct ipoib_dev_priv *priv = netdev_priv(dev); | 743 | struct ipoib_dev_priv *priv = netdev_priv(dev); |
| 744 | 744 | ||
| @@ -747,7 +747,7 @@ int ipoib_ib_dev_down(struct net_device *dev) | |||
| 747 | clear_bit(IPOIB_FLAG_OPER_UP, &priv->flags); | 747 | clear_bit(IPOIB_FLAG_OPER_UP, &priv->flags); |
| 748 | netif_carrier_off(dev); | 748 | netif_carrier_off(dev); |
| 749 | 749 | ||
| 750 | ipoib_mcast_stop_thread(dev); | 750 | ipoib_mcast_stop_thread(dev, flush); |
| 751 | ipoib_mcast_dev_flush(dev); | 751 | ipoib_mcast_dev_flush(dev); |
| 752 | 752 | ||
| 753 | ipoib_flush_paths(dev); | 753 | ipoib_flush_paths(dev); |
| @@ -807,7 +807,7 @@ void ipoib_drain_cq(struct net_device *dev) | |||
| 807 | local_bh_enable(); | 807 | local_bh_enable(); |
| 808 | } | 808 | } |
| 809 | 809 | ||
| 810 | int ipoib_ib_dev_stop(struct net_device *dev) | 810 | int ipoib_ib_dev_stop(struct net_device *dev, int flush) |
| 811 | { | 811 | { |
| 812 | struct ipoib_dev_priv *priv = netdev_priv(dev); | 812 | struct ipoib_dev_priv *priv = netdev_priv(dev); |
| 813 | struct ib_qp_attr qp_attr; | 813 | struct ib_qp_attr qp_attr; |
| @@ -880,7 +880,8 @@ timeout: | |||
| 880 | /* Wait for all AHs to be reaped */ | 880 | /* Wait for all AHs to be reaped */ |
| 881 | set_bit(IPOIB_STOP_REAPER, &priv->flags); | 881 | set_bit(IPOIB_STOP_REAPER, &priv->flags); |
| 882 | cancel_delayed_work(&priv->ah_reap_task); | 882 | cancel_delayed_work(&priv->ah_reap_task); |
| 883 | flush_workqueue(priv->wq); | 883 | if (flush) |
| 884 | flush_workqueue(ipoib_workqueue); | ||
| 884 | 885 | ||
| 885 | begin = jiffies; | 886 | begin = jiffies; |
| 886 | 887 | ||
| @@ -917,7 +918,7 @@ int ipoib_ib_dev_init(struct net_device *dev, struct ib_device *ca, int port) | |||
| 917 | (unsigned long) dev); | 918 | (unsigned long) dev); |
| 918 | 919 | ||
| 919 | if (dev->flags & IFF_UP) { | 920 | if (dev->flags & IFF_UP) { |
| 920 | if (ipoib_ib_dev_open(dev)) { | 921 | if (ipoib_ib_dev_open(dev, 1)) { |
| 921 | ipoib_transport_dev_cleanup(dev); | 922 | ipoib_transport_dev_cleanup(dev); |
| 922 | return -ENODEV; | 923 | return -ENODEV; |
| 923 | } | 924 | } |
| @@ -1039,12 +1040,12 @@ static void __ipoib_ib_dev_flush(struct ipoib_dev_priv *priv, | |||
| 1039 | } | 1040 | } |
| 1040 | 1041 | ||
| 1041 | if (level >= IPOIB_FLUSH_NORMAL) | 1042 | if (level >= IPOIB_FLUSH_NORMAL) |
| 1042 | ipoib_ib_dev_down(dev); | 1043 | ipoib_ib_dev_down(dev, 0); |
| 1043 | 1044 | ||
| 1044 | if (level == IPOIB_FLUSH_HEAVY) { | 1045 | if (level == IPOIB_FLUSH_HEAVY) { |
| 1045 | if (test_bit(IPOIB_FLAG_INITIALIZED, &priv->flags)) | 1046 | if (test_bit(IPOIB_FLAG_INITIALIZED, &priv->flags)) |
| 1046 | ipoib_ib_dev_stop(dev); | 1047 | ipoib_ib_dev_stop(dev, 0); |
| 1047 | if (ipoib_ib_dev_open(dev) != 0) | 1048 | if (ipoib_ib_dev_open(dev, 0) != 0) |
| 1048 | return; | 1049 | return; |
| 1049 | if (netif_queue_stopped(dev)) | 1050 | if (netif_queue_stopped(dev)) |
| 1050 | netif_start_queue(dev); | 1051 | netif_start_queue(dev); |
| @@ -1096,7 +1097,7 @@ void ipoib_ib_dev_cleanup(struct net_device *dev) | |||
| 1096 | */ | 1097 | */ |
| 1097 | ipoib_flush_paths(dev); | 1098 | ipoib_flush_paths(dev); |
| 1098 | 1099 | ||
| 1099 | ipoib_mcast_stop_thread(dev); | 1100 | ipoib_mcast_stop_thread(dev, 1); |
| 1100 | ipoib_mcast_dev_flush(dev); | 1101 | ipoib_mcast_dev_flush(dev); |
| 1101 | 1102 | ||
| 1102 | ipoib_transport_dev_cleanup(dev); | 1103 | ipoib_transport_dev_cleanup(dev); |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c index 6bad17d4d588..58b5aa3b6f2d 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_main.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c | |||
| @@ -108,7 +108,7 @@ int ipoib_open(struct net_device *dev) | |||
| 108 | 108 | ||
| 109 | set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags); | 109 | set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags); |
| 110 | 110 | ||
| 111 | if (ipoib_ib_dev_open(dev)) { | 111 | if (ipoib_ib_dev_open(dev, 1)) { |
| 112 | if (!test_bit(IPOIB_PKEY_ASSIGNED, &priv->flags)) | 112 | if (!test_bit(IPOIB_PKEY_ASSIGNED, &priv->flags)) |
| 113 | return 0; | 113 | return 0; |
| 114 | goto err_disable; | 114 | goto err_disable; |
| @@ -139,7 +139,7 @@ int ipoib_open(struct net_device *dev) | |||
| 139 | return 0; | 139 | return 0; |
| 140 | 140 | ||
| 141 | err_stop: | 141 | err_stop: |
| 142 | ipoib_ib_dev_stop(dev); | 142 | ipoib_ib_dev_stop(dev, 1); |
| 143 | 143 | ||
| 144 | err_disable: | 144 | err_disable: |
| 145 | clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags); | 145 | clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags); |
| @@ -157,8 +157,8 @@ static int ipoib_stop(struct net_device *dev) | |||
| 157 | 157 | ||
| 158 | netif_stop_queue(dev); | 158 | netif_stop_queue(dev); |
| 159 | 159 | ||
| 160 | ipoib_ib_dev_down(dev); | 160 | ipoib_ib_dev_down(dev, 1); |
| 161 | ipoib_ib_dev_stop(dev); | 161 | ipoib_ib_dev_stop(dev, 0); |
| 162 | 162 | ||
| 163 | if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) { | 163 | if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) { |
| 164 | struct ipoib_dev_priv *cpriv; | 164 | struct ipoib_dev_priv *cpriv; |
| @@ -839,7 +839,7 @@ static void ipoib_set_mcast_list(struct net_device *dev) | |||
| 839 | return; | 839 | return; |
| 840 | } | 840 | } |
| 841 | 841 | ||
| 842 | queue_work(priv->wq, &priv->restart_task); | 842 | queue_work(ipoib_workqueue, &priv->restart_task); |
| 843 | } | 843 | } |
| 844 | 844 | ||
| 845 | static u32 ipoib_addr_hash(struct ipoib_neigh_hash *htbl, u8 *daddr) | 845 | static u32 ipoib_addr_hash(struct ipoib_neigh_hash *htbl, u8 *daddr) |
| @@ -954,7 +954,7 @@ static void ipoib_reap_neigh(struct work_struct *work) | |||
| 954 | __ipoib_reap_neigh(priv); | 954 | __ipoib_reap_neigh(priv); |
| 955 | 955 | ||
| 956 | if (!test_bit(IPOIB_STOP_NEIGH_GC, &priv->flags)) | 956 | if (!test_bit(IPOIB_STOP_NEIGH_GC, &priv->flags)) |
| 957 | queue_delayed_work(priv->wq, &priv->neigh_reap_task, | 957 | queue_delayed_work(ipoib_workqueue, &priv->neigh_reap_task, |
| 958 | arp_tbl.gc_interval); | 958 | arp_tbl.gc_interval); |
| 959 | } | 959 | } |
| 960 | 960 | ||
| @@ -1133,7 +1133,7 @@ static int ipoib_neigh_hash_init(struct ipoib_dev_priv *priv) | |||
| 1133 | 1133 | ||
| 1134 | /* start garbage collection */ | 1134 | /* start garbage collection */ |
| 1135 | clear_bit(IPOIB_STOP_NEIGH_GC, &priv->flags); | 1135 | clear_bit(IPOIB_STOP_NEIGH_GC, &priv->flags); |
| 1136 | queue_delayed_work(priv->wq, &priv->neigh_reap_task, | 1136 | queue_delayed_work(ipoib_workqueue, &priv->neigh_reap_task, |
| 1137 | arp_tbl.gc_interval); | 1137 | arp_tbl.gc_interval); |
| 1138 | 1138 | ||
| 1139 | return 0; | 1139 | return 0; |
| @@ -1262,13 +1262,15 @@ int ipoib_dev_init(struct net_device *dev, struct ib_device *ca, int port) | |||
| 1262 | { | 1262 | { |
| 1263 | struct ipoib_dev_priv *priv = netdev_priv(dev); | 1263 | struct ipoib_dev_priv *priv = netdev_priv(dev); |
| 1264 | 1264 | ||
| 1265 | if (ipoib_neigh_hash_init(priv) < 0) | ||
| 1266 | goto out; | ||
| 1265 | /* Allocate RX/TX "rings" to hold queued skbs */ | 1267 | /* Allocate RX/TX "rings" to hold queued skbs */ |
| 1266 | priv->rx_ring = kzalloc(ipoib_recvq_size * sizeof *priv->rx_ring, | 1268 | priv->rx_ring = kzalloc(ipoib_recvq_size * sizeof *priv->rx_ring, |
| 1267 | GFP_KERNEL); | 1269 | GFP_KERNEL); |
| 1268 | if (!priv->rx_ring) { | 1270 | if (!priv->rx_ring) { |
| 1269 | printk(KERN_WARNING "%s: failed to allocate RX ring (%d entries)\n", | 1271 | printk(KERN_WARNING "%s: failed to allocate RX ring (%d entries)\n", |
| 1270 | ca->name, ipoib_recvq_size); | 1272 | ca->name, ipoib_recvq_size); |
| 1271 | goto out; | 1273 | goto out_neigh_hash_cleanup; |
| 1272 | } | 1274 | } |
| 1273 | 1275 | ||
| 1274 | priv->tx_ring = vzalloc(ipoib_sendq_size * sizeof *priv->tx_ring); | 1276 | priv->tx_ring = vzalloc(ipoib_sendq_size * sizeof *priv->tx_ring); |
| @@ -1283,24 +1285,16 @@ int ipoib_dev_init(struct net_device *dev, struct ib_device *ca, int port) | |||
| 1283 | if (ipoib_ib_dev_init(dev, ca, port)) | 1285 | if (ipoib_ib_dev_init(dev, ca, port)) |
| 1284 | goto out_tx_ring_cleanup; | 1286 | goto out_tx_ring_cleanup; |
| 1285 | 1287 | ||
| 1286 | /* | ||
| 1287 | * Must be after ipoib_ib_dev_init so we can allocate a per | ||
| 1288 | * device wq there and use it here | ||
| 1289 | */ | ||
| 1290 | if (ipoib_neigh_hash_init(priv) < 0) | ||
| 1291 | goto out_dev_uninit; | ||
| 1292 | |||
| 1293 | return 0; | 1288 | return 0; |
| 1294 | 1289 | ||
| 1295 | out_dev_uninit: | ||
| 1296 | ipoib_ib_dev_cleanup(dev); | ||
| 1297 | |||
| 1298 | out_tx_ring_cleanup: | 1290 | out_tx_ring_cleanup: |
| 1299 | vfree(priv->tx_ring); | 1291 | vfree(priv->tx_ring); |
| 1300 | 1292 | ||
| 1301 | out_rx_ring_cleanup: | 1293 | out_rx_ring_cleanup: |
| 1302 | kfree(priv->rx_ring); | 1294 | kfree(priv->rx_ring); |
| 1303 | 1295 | ||
| 1296 | out_neigh_hash_cleanup: | ||
| 1297 | ipoib_neigh_hash_uninit(dev); | ||
| 1304 | out: | 1298 | out: |
| 1305 | return -ENOMEM; | 1299 | return -ENOMEM; |
| 1306 | } | 1300 | } |
| @@ -1323,12 +1317,6 @@ void ipoib_dev_cleanup(struct net_device *dev) | |||
| 1323 | } | 1317 | } |
| 1324 | unregister_netdevice_many(&head); | 1318 | unregister_netdevice_many(&head); |
| 1325 | 1319 | ||
| 1326 | /* | ||
| 1327 | * Must be before ipoib_ib_dev_cleanup or we delete an in use | ||
| 1328 | * work queue | ||
| 1329 | */ | ||
| 1330 | ipoib_neigh_hash_uninit(dev); | ||
| 1331 | |||
| 1332 | ipoib_ib_dev_cleanup(dev); | 1320 | ipoib_ib_dev_cleanup(dev); |
| 1333 | 1321 | ||
| 1334 | kfree(priv->rx_ring); | 1322 | kfree(priv->rx_ring); |
| @@ -1336,6 +1324,8 @@ void ipoib_dev_cleanup(struct net_device *dev) | |||
| 1336 | 1324 | ||
| 1337 | priv->rx_ring = NULL; | 1325 | priv->rx_ring = NULL; |
| 1338 | priv->tx_ring = NULL; | 1326 | priv->tx_ring = NULL; |
| 1327 | |||
| 1328 | ipoib_neigh_hash_uninit(dev); | ||
| 1339 | } | 1329 | } |
| 1340 | 1330 | ||
| 1341 | static const struct header_ops ipoib_header_ops = { | 1331 | static const struct header_ops ipoib_header_ops = { |
| @@ -1646,7 +1636,7 @@ register_failed: | |||
| 1646 | /* Stop GC if started before flush */ | 1636 | /* Stop GC if started before flush */ |
| 1647 | set_bit(IPOIB_STOP_NEIGH_GC, &priv->flags); | 1637 | set_bit(IPOIB_STOP_NEIGH_GC, &priv->flags); |
| 1648 | cancel_delayed_work(&priv->neigh_reap_task); | 1638 | cancel_delayed_work(&priv->neigh_reap_task); |
| 1649 | flush_workqueue(priv->wq); | 1639 | flush_workqueue(ipoib_workqueue); |
| 1650 | 1640 | ||
| 1651 | event_failed: | 1641 | event_failed: |
| 1652 | ipoib_dev_cleanup(priv->dev); | 1642 | ipoib_dev_cleanup(priv->dev); |
| @@ -1717,7 +1707,7 @@ static void ipoib_remove_one(struct ib_device *device) | |||
| 1717 | /* Stop GC */ | 1707 | /* Stop GC */ |
| 1718 | set_bit(IPOIB_STOP_NEIGH_GC, &priv->flags); | 1708 | set_bit(IPOIB_STOP_NEIGH_GC, &priv->flags); |
| 1719 | cancel_delayed_work(&priv->neigh_reap_task); | 1709 | cancel_delayed_work(&priv->neigh_reap_task); |
| 1720 | flush_workqueue(priv->wq); | 1710 | flush_workqueue(ipoib_workqueue); |
| 1721 | 1711 | ||
| 1722 | unregister_netdev(priv->dev); | 1712 | unregister_netdev(priv->dev); |
| 1723 | free_netdev(priv->dev); | 1713 | free_netdev(priv->dev); |
| @@ -1758,13 +1748,8 @@ static int __init ipoib_init_module(void) | |||
| 1758 | * unregister_netdev() and linkwatch_event take the rtnl lock, | 1748 | * unregister_netdev() and linkwatch_event take the rtnl lock, |
| 1759 | * so flush_scheduled_work() can deadlock during device | 1749 | * so flush_scheduled_work() can deadlock during device |
| 1760 | * removal. | 1750 | * removal. |
| 1761 | * | ||
| 1762 | * In addition, bringing one device up and another down at the | ||
| 1763 | * same time can deadlock a single workqueue, so we have this | ||
| 1764 | * global fallback workqueue, but we also attempt to open a | ||
| 1765 | * per device workqueue each time we bring an interface up | ||
| 1766 | */ | 1751 | */ |
| 1767 | ipoib_workqueue = create_singlethread_workqueue("ipoib_flush"); | 1752 | ipoib_workqueue = create_singlethread_workqueue("ipoib"); |
| 1768 | if (!ipoib_workqueue) { | 1753 | if (!ipoib_workqueue) { |
| 1769 | ret = -ENOMEM; | 1754 | ret = -ENOMEM; |
| 1770 | goto err_fs; | 1755 | goto err_fs; |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c index bc50dd0d0e4d..ffb83b5f7e80 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c | |||
| @@ -190,6 +190,12 @@ static int ipoib_mcast_join_finish(struct ipoib_mcast *mcast, | |||
| 190 | spin_unlock_irq(&priv->lock); | 190 | spin_unlock_irq(&priv->lock); |
| 191 | priv->tx_wr.wr.ud.remote_qkey = priv->qkey; | 191 | priv->tx_wr.wr.ud.remote_qkey = priv->qkey; |
| 192 | set_qkey = 1; | 192 | set_qkey = 1; |
| 193 | |||
| 194 | if (!ipoib_cm_admin_enabled(dev)) { | ||
| 195 | rtnl_lock(); | ||
| 196 | dev_set_mtu(dev, min(priv->mcast_mtu, priv->admin_mtu)); | ||
| 197 | rtnl_unlock(); | ||
| 198 | } | ||
| 193 | } | 199 | } |
| 194 | 200 | ||
| 195 | if (!test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) { | 201 | if (!test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) { |
| @@ -271,27 +277,16 @@ ipoib_mcast_sendonly_join_complete(int status, | |||
| 271 | struct ipoib_mcast *mcast = multicast->context; | 277 | struct ipoib_mcast *mcast = multicast->context; |
| 272 | struct net_device *dev = mcast->dev; | 278 | struct net_device *dev = mcast->dev; |
| 273 | 279 | ||
| 274 | /* | ||
| 275 | * We have to take the mutex to force mcast_sendonly_join to | ||
| 276 | * return from ib_sa_multicast_join and set mcast->mc to a | ||
| 277 | * valid value. Otherwise we were racing with ourselves in | ||
| 278 | * that we might fail here, but get a valid return from | ||
| 279 | * ib_sa_multicast_join after we had cleared mcast->mc here, | ||
| 280 | * resulting in mis-matched joins and leaves and a deadlock | ||
| 281 | */ | ||
| 282 | mutex_lock(&mcast_mutex); | ||
| 283 | |||
| 284 | /* We trap for port events ourselves. */ | 280 | /* We trap for port events ourselves. */ |
| 285 | if (status == -ENETRESET) | 281 | if (status == -ENETRESET) |
| 286 | goto out; | 282 | return 0; |
| 287 | 283 | ||
| 288 | if (!status) | 284 | if (!status) |
| 289 | status = ipoib_mcast_join_finish(mcast, &multicast->rec); | 285 | status = ipoib_mcast_join_finish(mcast, &multicast->rec); |
| 290 | 286 | ||
| 291 | if (status) { | 287 | if (status) { |
| 292 | if (mcast->logcount++ < 20) | 288 | if (mcast->logcount++ < 20) |
| 293 | ipoib_dbg_mcast(netdev_priv(dev), "sendonly multicast " | 289 | ipoib_dbg_mcast(netdev_priv(dev), "multicast join failed for %pI6, status %d\n", |
| 294 | "join failed for %pI6, status %d\n", | ||
| 295 | mcast->mcmember.mgid.raw, status); | 290 | mcast->mcmember.mgid.raw, status); |
| 296 | 291 | ||
| 297 | /* Flush out any queued packets */ | 292 | /* Flush out any queued packets */ |
| @@ -301,15 +296,11 @@ ipoib_mcast_sendonly_join_complete(int status, | |||
| 301 | dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue)); | 296 | dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue)); |
| 302 | } | 297 | } |
| 303 | netif_tx_unlock_bh(dev); | 298 | netif_tx_unlock_bh(dev); |
| 299 | |||
| 300 | /* Clear the busy flag so we try again */ | ||
| 301 | status = test_and_clear_bit(IPOIB_MCAST_FLAG_BUSY, | ||
| 302 | &mcast->flags); | ||
| 304 | } | 303 | } |
| 305 | out: | ||
| 306 | clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags); | ||
| 307 | if (status) | ||
| 308 | mcast->mc = NULL; | ||
| 309 | complete(&mcast->done); | ||
| 310 | if (status == -ENETRESET) | ||
| 311 | status = 0; | ||
| 312 | mutex_unlock(&mcast_mutex); | ||
| 313 | return status; | 304 | return status; |
| 314 | } | 305 | } |
| 315 | 306 | ||
| @@ -327,14 +318,12 @@ static int ipoib_mcast_sendonly_join(struct ipoib_mcast *mcast) | |||
| 327 | int ret = 0; | 318 | int ret = 0; |
| 328 | 319 | ||
| 329 | if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags)) { | 320 | if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags)) { |
| 330 | ipoib_dbg_mcast(priv, "device shutting down, no sendonly " | 321 | ipoib_dbg_mcast(priv, "device shutting down, no multicast joins\n"); |
| 331 | "multicast joins\n"); | ||
| 332 | return -ENODEV; | 322 | return -ENODEV; |
| 333 | } | 323 | } |
| 334 | 324 | ||
| 335 | if (test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags)) { | 325 | if (test_and_set_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags)) { |
| 336 | ipoib_dbg_mcast(priv, "multicast entry busy, skipping " | 326 | ipoib_dbg_mcast(priv, "multicast entry busy, skipping\n"); |
| 337 | "sendonly join\n"); | ||
| 338 | return -EBUSY; | 327 | return -EBUSY; |
| 339 | } | 328 | } |
| 340 | 329 | ||
| @@ -342,9 +331,6 @@ static int ipoib_mcast_sendonly_join(struct ipoib_mcast *mcast) | |||
| 342 | rec.port_gid = priv->local_gid; | 331 | rec.port_gid = priv->local_gid; |
| 343 | rec.pkey = cpu_to_be16(priv->pkey); | 332 | rec.pkey = cpu_to_be16(priv->pkey); |
| 344 | 333 | ||
| 345 | mutex_lock(&mcast_mutex); | ||
| 346 | init_completion(&mcast->done); | ||
| 347 | set_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags); | ||
| 348 | mcast->mc = ib_sa_join_multicast(&ipoib_sa_client, priv->ca, | 334 | mcast->mc = ib_sa_join_multicast(&ipoib_sa_client, priv->ca, |
| 349 | priv->port, &rec, | 335 | priv->port, &rec, |
| 350 | IB_SA_MCMEMBER_REC_MGID | | 336 | IB_SA_MCMEMBER_REC_MGID | |
| @@ -357,14 +343,12 @@ static int ipoib_mcast_sendonly_join(struct ipoib_mcast *mcast) | |||
| 357 | if (IS_ERR(mcast->mc)) { | 343 | if (IS_ERR(mcast->mc)) { |
| 358 | ret = PTR_ERR(mcast->mc); | 344 | ret = PTR_ERR(mcast->mc); |
| 359 | clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags); | 345 | clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags); |
| 360 | complete(&mcast->done); | 346 | ipoib_warn(priv, "ib_sa_join_multicast failed (ret = %d)\n", |
| 361 | ipoib_warn(priv, "ib_sa_join_multicast for sendonly join " | 347 | ret); |
| 362 | "failed (ret = %d)\n", ret); | ||
| 363 | } else { | 348 | } else { |
| 364 | ipoib_dbg_mcast(priv, "no multicast record for %pI6, starting " | 349 | ipoib_dbg_mcast(priv, "no multicast record for %pI6, starting join\n", |
| 365 | "sendonly join\n", mcast->mcmember.mgid.raw); | 350 | mcast->mcmember.mgid.raw); |
| 366 | } | 351 | } |
| 367 | mutex_unlock(&mcast_mutex); | ||
| 368 | 352 | ||
| 369 | return ret; | 353 | return ret; |
| 370 | } | 354 | } |
| @@ -375,29 +359,18 @@ void ipoib_mcast_carrier_on_task(struct work_struct *work) | |||
| 375 | carrier_on_task); | 359 | carrier_on_task); |
| 376 | struct ib_port_attr attr; | 360 | struct ib_port_attr attr; |
| 377 | 361 | ||
| 362 | /* | ||
| 363 | * Take rtnl_lock to avoid racing with ipoib_stop() and | ||
| 364 | * turning the carrier back on while a device is being | ||
| 365 | * removed. | ||
| 366 | */ | ||
| 378 | if (ib_query_port(priv->ca, priv->port, &attr) || | 367 | if (ib_query_port(priv->ca, priv->port, &attr) || |
| 379 | attr.state != IB_PORT_ACTIVE) { | 368 | attr.state != IB_PORT_ACTIVE) { |
| 380 | ipoib_dbg(priv, "Keeping carrier off until IB port is active\n"); | 369 | ipoib_dbg(priv, "Keeping carrier off until IB port is active\n"); |
| 381 | return; | 370 | return; |
| 382 | } | 371 | } |
| 383 | 372 | ||
| 384 | /* | 373 | rtnl_lock(); |
| 385 | * Take rtnl_lock to avoid racing with ipoib_stop() and | ||
| 386 | * turning the carrier back on while a device is being | ||
| 387 | * removed. However, ipoib_stop() will attempt to flush | ||
| 388 | * the workqueue while holding the rtnl lock, so loop | ||
| 389 | * on trylock until either we get the lock or we see | ||
| 390 | * FLAG_ADMIN_UP go away as that signals that we are bailing | ||
| 391 | * and can safely ignore the carrier on work. | ||
| 392 | */ | ||
| 393 | while (!rtnl_trylock()) { | ||
| 394 | if (!test_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags)) | ||
| 395 | return; | ||
| 396 | else | ||
| 397 | msleep(20); | ||
| 398 | } | ||
| 399 | if (!ipoib_cm_admin_enabled(priv->dev)) | ||
| 400 | dev_set_mtu(priv->dev, min(priv->mcast_mtu, priv->admin_mtu)); | ||
| 401 | netif_carrier_on(priv->dev); | 374 | netif_carrier_on(priv->dev); |
| 402 | rtnl_unlock(); | 375 | rtnl_unlock(); |
| 403 | } | 376 | } |
| @@ -412,63 +385,60 @@ static int ipoib_mcast_join_complete(int status, | |||
| 412 | ipoib_dbg_mcast(priv, "join completion for %pI6 (status %d)\n", | 385 | ipoib_dbg_mcast(priv, "join completion for %pI6 (status %d)\n", |
| 413 | mcast->mcmember.mgid.raw, status); | 386 | mcast->mcmember.mgid.raw, status); |
| 414 | 387 | ||
| 415 | /* | ||
| 416 | * We have to take the mutex to force mcast_join to | ||
| 417 | * return from ib_sa_multicast_join and set mcast->mc to a | ||
| 418 | * valid value. Otherwise we were racing with ourselves in | ||
| 419 | * that we might fail here, but get a valid return from | ||
| 420 | * ib_sa_multicast_join after we had cleared mcast->mc here, | ||
| 421 | * resulting in mis-matched joins and leaves and a deadlock | ||
| 422 | */ | ||
| 423 | mutex_lock(&mcast_mutex); | ||
| 424 | |||
| 425 | /* We trap for port events ourselves. */ | 388 | /* We trap for port events ourselves. */ |
| 426 | if (status == -ENETRESET) | 389 | if (status == -ENETRESET) { |
| 390 | status = 0; | ||
| 427 | goto out; | 391 | goto out; |
| 392 | } | ||
| 428 | 393 | ||
| 429 | if (!status) | 394 | if (!status) |
| 430 | status = ipoib_mcast_join_finish(mcast, &multicast->rec); | 395 | status = ipoib_mcast_join_finish(mcast, &multicast->rec); |
| 431 | 396 | ||
| 432 | if (!status) { | 397 | if (!status) { |
| 433 | mcast->backoff = 1; | 398 | mcast->backoff = 1; |
| 399 | mutex_lock(&mcast_mutex); | ||
| 434 | if (test_bit(IPOIB_MCAST_RUN, &priv->flags)) | 400 | if (test_bit(IPOIB_MCAST_RUN, &priv->flags)) |
| 435 | queue_delayed_work(priv->wq, &priv->mcast_task, 0); | 401 | queue_delayed_work(ipoib_workqueue, |
| 402 | &priv->mcast_task, 0); | ||
| 403 | mutex_unlock(&mcast_mutex); | ||
| 436 | 404 | ||
| 437 | /* | 405 | /* |
| 438 | * Defer carrier on work to priv->wq to avoid a | 406 | * Defer carrier on work to ipoib_workqueue to avoid a |
| 439 | * deadlock on rtnl_lock here. | 407 | * deadlock on rtnl_lock here. |
| 440 | */ | 408 | */ |
| 441 | if (mcast == priv->broadcast) | 409 | if (mcast == priv->broadcast) |
| 442 | queue_work(priv->wq, &priv->carrier_on_task); | 410 | queue_work(ipoib_workqueue, &priv->carrier_on_task); |
| 443 | } else { | ||
| 444 | if (mcast->logcount++ < 20) { | ||
| 445 | if (status == -ETIMEDOUT || status == -EAGAIN) { | ||
| 446 | ipoib_dbg_mcast(priv, "multicast join failed for %pI6, status %d\n", | ||
| 447 | mcast->mcmember.mgid.raw, status); | ||
| 448 | } else { | ||
| 449 | ipoib_warn(priv, "multicast join failed for %pI6, status %d\n", | ||
| 450 | mcast->mcmember.mgid.raw, status); | ||
| 451 | } | ||
| 452 | } | ||
| 453 | 411 | ||
| 454 | mcast->backoff *= 2; | 412 | status = 0; |
| 455 | if (mcast->backoff > IPOIB_MAX_BACKOFF_SECONDS) | 413 | goto out; |
| 456 | mcast->backoff = IPOIB_MAX_BACKOFF_SECONDS; | ||
| 457 | } | 414 | } |
| 458 | out: | 415 | |
| 416 | if (mcast->logcount++ < 20) { | ||
| 417 | if (status == -ETIMEDOUT || status == -EAGAIN) { | ||
| 418 | ipoib_dbg_mcast(priv, "multicast join failed for %pI6, status %d\n", | ||
| 419 | mcast->mcmember.mgid.raw, status); | ||
| 420 | } else { | ||
| 421 | ipoib_warn(priv, "multicast join failed for %pI6, status %d\n", | ||
| 422 | mcast->mcmember.mgid.raw, status); | ||
| 423 | } | ||
| 424 | } | ||
| 425 | |||
| 426 | mcast->backoff *= 2; | ||
| 427 | if (mcast->backoff > IPOIB_MAX_BACKOFF_SECONDS) | ||
| 428 | mcast->backoff = IPOIB_MAX_BACKOFF_SECONDS; | ||
| 429 | |||
| 430 | /* Clear the busy flag so we try again */ | ||
| 431 | status = test_and_clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags); | ||
| 432 | |||
| 433 | mutex_lock(&mcast_mutex); | ||
| 459 | spin_lock_irq(&priv->lock); | 434 | spin_lock_irq(&priv->lock); |
| 460 | clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags); | 435 | if (test_bit(IPOIB_MCAST_RUN, &priv->flags)) |
| 461 | if (status) | 436 | queue_delayed_work(ipoib_workqueue, &priv->mcast_task, |
| 462 | mcast->mc = NULL; | ||
| 463 | complete(&mcast->done); | ||
| 464 | if (status == -ENETRESET) | ||
| 465 | status = 0; | ||
| 466 | if (status && test_bit(IPOIB_MCAST_RUN, &priv->flags)) | ||
| 467 | queue_delayed_work(priv->wq, &priv->mcast_task, | ||
| 468 | mcast->backoff * HZ); | 437 | mcast->backoff * HZ); |
| 469 | spin_unlock_irq(&priv->lock); | 438 | spin_unlock_irq(&priv->lock); |
| 470 | mutex_unlock(&mcast_mutex); | 439 | mutex_unlock(&mcast_mutex); |
| 471 | 440 | out: | |
| 441 | complete(&mcast->done); | ||
| 472 | return status; | 442 | return status; |
| 473 | } | 443 | } |
| 474 | 444 | ||
| @@ -517,9 +487,10 @@ static void ipoib_mcast_join(struct net_device *dev, struct ipoib_mcast *mcast, | |||
| 517 | rec.hop_limit = priv->broadcast->mcmember.hop_limit; | 487 | rec.hop_limit = priv->broadcast->mcmember.hop_limit; |
| 518 | } | 488 | } |
| 519 | 489 | ||
| 520 | mutex_lock(&mcast_mutex); | ||
| 521 | init_completion(&mcast->done); | ||
| 522 | set_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags); | 490 | set_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags); |
| 491 | init_completion(&mcast->done); | ||
| 492 | set_bit(IPOIB_MCAST_JOIN_STARTED, &mcast->flags); | ||
| 493 | |||
| 523 | mcast->mc = ib_sa_join_multicast(&ipoib_sa_client, priv->ca, priv->port, | 494 | mcast->mc = ib_sa_join_multicast(&ipoib_sa_client, priv->ca, priv->port, |
| 524 | &rec, comp_mask, GFP_KERNEL, | 495 | &rec, comp_mask, GFP_KERNEL, |
| 525 | ipoib_mcast_join_complete, mcast); | 496 | ipoib_mcast_join_complete, mcast); |
| @@ -533,11 +504,13 @@ static void ipoib_mcast_join(struct net_device *dev, struct ipoib_mcast *mcast, | |||
| 533 | if (mcast->backoff > IPOIB_MAX_BACKOFF_SECONDS) | 504 | if (mcast->backoff > IPOIB_MAX_BACKOFF_SECONDS) |
| 534 | mcast->backoff = IPOIB_MAX_BACKOFF_SECONDS; | 505 | mcast->backoff = IPOIB_MAX_BACKOFF_SECONDS; |
| 535 | 506 | ||
| 507 | mutex_lock(&mcast_mutex); | ||
| 536 | if (test_bit(IPOIB_MCAST_RUN, &priv->flags)) | 508 | if (test_bit(IPOIB_MCAST_RUN, &priv->flags)) |
| 537 | queue_delayed_work(priv->wq, &priv->mcast_task, | 509 | queue_delayed_work(ipoib_workqueue, |
| 510 | &priv->mcast_task, | ||
| 538 | mcast->backoff * HZ); | 511 | mcast->backoff * HZ); |
| 512 | mutex_unlock(&mcast_mutex); | ||
| 539 | } | 513 | } |
| 540 | mutex_unlock(&mcast_mutex); | ||
| 541 | } | 514 | } |
| 542 | 515 | ||
| 543 | void ipoib_mcast_join_task(struct work_struct *work) | 516 | void ipoib_mcast_join_task(struct work_struct *work) |
| @@ -574,8 +547,8 @@ void ipoib_mcast_join_task(struct work_struct *work) | |||
| 574 | ipoib_warn(priv, "failed to allocate broadcast group\n"); | 547 | ipoib_warn(priv, "failed to allocate broadcast group\n"); |
| 575 | mutex_lock(&mcast_mutex); | 548 | mutex_lock(&mcast_mutex); |
| 576 | if (test_bit(IPOIB_MCAST_RUN, &priv->flags)) | 549 | if (test_bit(IPOIB_MCAST_RUN, &priv->flags)) |
| 577 | queue_delayed_work(priv->wq, &priv->mcast_task, | 550 | queue_delayed_work(ipoib_workqueue, |
| 578 | HZ); | 551 | &priv->mcast_task, HZ); |
| 579 | mutex_unlock(&mcast_mutex); | 552 | mutex_unlock(&mcast_mutex); |
| 580 | return; | 553 | return; |
| 581 | } | 554 | } |
| @@ -590,8 +563,7 @@ void ipoib_mcast_join_task(struct work_struct *work) | |||
| 590 | } | 563 | } |
| 591 | 564 | ||
| 592 | if (!test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) { | 565 | if (!test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) { |
| 593 | if (IS_ERR_OR_NULL(priv->broadcast->mc) && | 566 | if (!test_bit(IPOIB_MCAST_FLAG_BUSY, &priv->broadcast->flags)) |
| 594 | !test_bit(IPOIB_MCAST_FLAG_BUSY, &priv->broadcast->flags)) | ||
| 595 | ipoib_mcast_join(dev, priv->broadcast, 0); | 567 | ipoib_mcast_join(dev, priv->broadcast, 0); |
| 596 | return; | 568 | return; |
| 597 | } | 569 | } |
| @@ -599,33 +571,23 @@ void ipoib_mcast_join_task(struct work_struct *work) | |||
| 599 | while (1) { | 571 | while (1) { |
| 600 | struct ipoib_mcast *mcast = NULL; | 572 | struct ipoib_mcast *mcast = NULL; |
| 601 | 573 | ||
| 602 | /* | ||
| 603 | * Need the mutex so our flags are consistent, need the | ||
| 604 | * priv->lock so we don't race with list removals in either | ||
| 605 | * mcast_dev_flush or mcast_restart_task | ||
| 606 | */ | ||
| 607 | mutex_lock(&mcast_mutex); | ||
| 608 | spin_lock_irq(&priv->lock); | 574 | spin_lock_irq(&priv->lock); |
| 609 | list_for_each_entry(mcast, &priv->multicast_list, list) { | 575 | list_for_each_entry(mcast, &priv->multicast_list, list) { |
| 610 | if (IS_ERR_OR_NULL(mcast->mc) && | 576 | if (!test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags) |
| 611 | !test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags) && | 577 | && !test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags) |
| 612 | !test_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags)) { | 578 | && !test_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags)) { |
| 613 | /* Found the next unjoined group */ | 579 | /* Found the next unjoined group */ |
| 614 | break; | 580 | break; |
| 615 | } | 581 | } |
| 616 | } | 582 | } |
| 617 | spin_unlock_irq(&priv->lock); | 583 | spin_unlock_irq(&priv->lock); |
| 618 | mutex_unlock(&mcast_mutex); | ||
| 619 | 584 | ||
| 620 | if (&mcast->list == &priv->multicast_list) { | 585 | if (&mcast->list == &priv->multicast_list) { |
| 621 | /* All done */ | 586 | /* All done */ |
| 622 | break; | 587 | break; |
| 623 | } | 588 | } |
| 624 | 589 | ||
| 625 | if (test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) | 590 | ipoib_mcast_join(dev, mcast, 1); |
| 626 | ipoib_mcast_sendonly_join(mcast); | ||
| 627 | else | ||
| 628 | ipoib_mcast_join(dev, mcast, 1); | ||
| 629 | return; | 591 | return; |
| 630 | } | 592 | } |
| 631 | 593 | ||
| @@ -642,13 +604,13 @@ int ipoib_mcast_start_thread(struct net_device *dev) | |||
| 642 | 604 | ||
| 643 | mutex_lock(&mcast_mutex); | 605 | mutex_lock(&mcast_mutex); |
| 644 | if (!test_and_set_bit(IPOIB_MCAST_RUN, &priv->flags)) | 606 | if (!test_and_set_bit(IPOIB_MCAST_RUN, &priv->flags)) |
| 645 | queue_delayed_work(priv->wq, &priv->mcast_task, 0); | 607 | queue_delayed_work(ipoib_workqueue, &priv->mcast_task, 0); |
| 646 | mutex_unlock(&mcast_mutex); | 608 | mutex_unlock(&mcast_mutex); |
| 647 | 609 | ||
| 648 | return 0; | 610 | return 0; |
| 649 | } | 611 | } |
| 650 | 612 | ||
| 651 | int ipoib_mcast_stop_thread(struct net_device *dev) | 613 | int ipoib_mcast_stop_thread(struct net_device *dev, int flush) |
| 652 | { | 614 | { |
| 653 | struct ipoib_dev_priv *priv = netdev_priv(dev); | 615 | struct ipoib_dev_priv *priv = netdev_priv(dev); |
| 654 | 616 | ||
| @@ -659,7 +621,8 @@ int ipoib_mcast_stop_thread(struct net_device *dev) | |||
| 659 | cancel_delayed_work(&priv->mcast_task); | 621 | cancel_delayed_work(&priv->mcast_task); |
| 660 | mutex_unlock(&mcast_mutex); | 622 | mutex_unlock(&mcast_mutex); |
| 661 | 623 | ||
| 662 | flush_workqueue(priv->wq); | 624 | if (flush) |
| 625 | flush_workqueue(ipoib_workqueue); | ||
| 663 | 626 | ||
| 664 | return 0; | 627 | return 0; |
| 665 | } | 628 | } |
| @@ -670,9 +633,6 @@ static int ipoib_mcast_leave(struct net_device *dev, struct ipoib_mcast *mcast) | |||
| 670 | int ret = 0; | 633 | int ret = 0; |
| 671 | 634 | ||
| 672 | if (test_and_clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags)) | 635 | if (test_and_clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags)) |
| 673 | ipoib_warn(priv, "ipoib_mcast_leave on an in-flight join\n"); | ||
| 674 | |||
| 675 | if (!IS_ERR_OR_NULL(mcast->mc)) | ||
| 676 | ib_sa_free_multicast(mcast->mc); | 636 | ib_sa_free_multicast(mcast->mc); |
| 677 | 637 | ||
| 678 | if (test_and_clear_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags)) { | 638 | if (test_and_clear_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags)) { |
| @@ -725,8 +685,6 @@ void ipoib_mcast_send(struct net_device *dev, u8 *daddr, struct sk_buff *skb) | |||
| 725 | memcpy(mcast->mcmember.mgid.raw, mgid, sizeof (union ib_gid)); | 685 | memcpy(mcast->mcmember.mgid.raw, mgid, sizeof (union ib_gid)); |
| 726 | __ipoib_mcast_add(dev, mcast); | 686 | __ipoib_mcast_add(dev, mcast); |
| 727 | list_add_tail(&mcast->list, &priv->multicast_list); | 687 | list_add_tail(&mcast->list, &priv->multicast_list); |
| 728 | if (!test_and_set_bit(IPOIB_MCAST_RUN, &priv->flags)) | ||
| 729 | queue_delayed_work(priv->wq, &priv->mcast_task, 0); | ||
| 730 | } | 688 | } |
| 731 | 689 | ||
| 732 | if (!mcast->ah) { | 690 | if (!mcast->ah) { |
| @@ -740,6 +698,8 @@ void ipoib_mcast_send(struct net_device *dev, u8 *daddr, struct sk_buff *skb) | |||
| 740 | if (test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags)) | 698 | if (test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags)) |
| 741 | ipoib_dbg_mcast(priv, "no address vector, " | 699 | ipoib_dbg_mcast(priv, "no address vector, " |
| 742 | "but multicast join already started\n"); | 700 | "but multicast join already started\n"); |
| 701 | else if (test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) | ||
| 702 | ipoib_mcast_sendonly_join(mcast); | ||
| 743 | 703 | ||
| 744 | /* | 704 | /* |
| 745 | * If lookup completes between here and out:, don't | 705 | * If lookup completes between here and out:, don't |
| @@ -799,12 +759,9 @@ void ipoib_mcast_dev_flush(struct net_device *dev) | |||
| 799 | 759 | ||
| 800 | spin_unlock_irqrestore(&priv->lock, flags); | 760 | spin_unlock_irqrestore(&priv->lock, flags); |
| 801 | 761 | ||
| 802 | /* | 762 | /* seperate between the wait to the leave*/ |
| 803 | * make sure the in-flight joins have finished before we attempt | ||
| 804 | * to leave | ||
| 805 | */ | ||
| 806 | list_for_each_entry_safe(mcast, tmcast, &remove_list, list) | 763 | list_for_each_entry_safe(mcast, tmcast, &remove_list, list) |
| 807 | if (test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags)) | 764 | if (test_bit(IPOIB_MCAST_JOIN_STARTED, &mcast->flags)) |
| 808 | wait_for_completion(&mcast->done); | 765 | wait_for_completion(&mcast->done); |
| 809 | 766 | ||
| 810 | list_for_each_entry_safe(mcast, tmcast, &remove_list, list) { | 767 | list_for_each_entry_safe(mcast, tmcast, &remove_list, list) { |
| @@ -837,6 +794,8 @@ void ipoib_mcast_restart_task(struct work_struct *work) | |||
| 837 | 794 | ||
| 838 | ipoib_dbg_mcast(priv, "restarting multicast task\n"); | 795 | ipoib_dbg_mcast(priv, "restarting multicast task\n"); |
| 839 | 796 | ||
| 797 | ipoib_mcast_stop_thread(dev, 0); | ||
| 798 | |||
| 840 | local_irq_save(flags); | 799 | local_irq_save(flags); |
| 841 | netif_addr_lock(dev); | 800 | netif_addr_lock(dev); |
| 842 | spin_lock(&priv->lock); | 801 | spin_lock(&priv->lock); |
| @@ -921,38 +880,14 @@ void ipoib_mcast_restart_task(struct work_struct *work) | |||
| 921 | netif_addr_unlock(dev); | 880 | netif_addr_unlock(dev); |
| 922 | local_irq_restore(flags); | 881 | local_irq_restore(flags); |
| 923 | 882 | ||
| 924 | /* | 883 | /* We have to cancel outside of the spinlock */ |
| 925 | * make sure the in-flight joins have finished before we attempt | ||
| 926 | * to leave | ||
| 927 | */ | ||
| 928 | list_for_each_entry_safe(mcast, tmcast, &remove_list, list) | ||
| 929 | if (test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags)) | ||
| 930 | wait_for_completion(&mcast->done); | ||
| 931 | |||
| 932 | /* | ||
| 933 | * We have to cancel outside of the spinlock, but we have to | ||
| 934 | * take the rtnl lock or else we race with the removal of | ||
| 935 | * entries from the remove list in mcast_dev_flush as part | ||
| 936 | * of ipoib_stop(). We detect the drop of the ADMIN_UP flag | ||
| 937 | * to signal that we have hit this particular race, and we | ||
| 938 | * return since we know we don't need to do anything else | ||
| 939 | * anyway. | ||
| 940 | */ | ||
| 941 | while (!rtnl_trylock()) { | ||
| 942 | if (!test_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags)) | ||
| 943 | return; | ||
| 944 | else | ||
| 945 | msleep(20); | ||
| 946 | } | ||
| 947 | list_for_each_entry_safe(mcast, tmcast, &remove_list, list) { | 884 | list_for_each_entry_safe(mcast, tmcast, &remove_list, list) { |
| 948 | ipoib_mcast_leave(mcast->dev, mcast); | 885 | ipoib_mcast_leave(mcast->dev, mcast); |
| 949 | ipoib_mcast_free(mcast); | 886 | ipoib_mcast_free(mcast); |
| 950 | } | 887 | } |
| 951 | /* | 888 | |
| 952 | * Restart our join task if needed | 889 | if (test_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags)) |
| 953 | */ | 890 | ipoib_mcast_start_thread(dev); |
| 954 | ipoib_mcast_start_thread(dev); | ||
| 955 | rtnl_unlock(); | ||
| 956 | } | 891 | } |
| 957 | 892 | ||
| 958 | #ifdef CONFIG_INFINIBAND_IPOIB_DEBUG | 893 | #ifdef CONFIG_INFINIBAND_IPOIB_DEBUG |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_verbs.c b/drivers/infiniband/ulp/ipoib/ipoib_verbs.c index b72a753eb41d..c56d5d44c53b 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_verbs.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_verbs.c | |||
| @@ -145,20 +145,10 @@ int ipoib_transport_dev_init(struct net_device *dev, struct ib_device *ca) | |||
| 145 | int ret, size; | 145 | int ret, size; |
| 146 | int i; | 146 | int i; |
| 147 | 147 | ||
| 148 | /* | ||
| 149 | * the various IPoIB tasks assume they will never race against | ||
| 150 | * themselves, so always use a single thread workqueue | ||
| 151 | */ | ||
| 152 | priv->wq = create_singlethread_workqueue("ipoib_wq"); | ||
| 153 | if (!priv->wq) { | ||
| 154 | printk(KERN_WARNING "ipoib: failed to allocate device WQ\n"); | ||
| 155 | return -ENODEV; | ||
| 156 | } | ||
| 157 | |||
| 158 | priv->pd = ib_alloc_pd(priv->ca); | 148 | priv->pd = ib_alloc_pd(priv->ca); |
| 159 | if (IS_ERR(priv->pd)) { | 149 | if (IS_ERR(priv->pd)) { |
| 160 | printk(KERN_WARNING "%s: failed to allocate PD\n", ca->name); | 150 | printk(KERN_WARNING "%s: failed to allocate PD\n", ca->name); |
| 161 | goto out_free_wq; | 151 | return -ENODEV; |
| 162 | } | 152 | } |
| 163 | 153 | ||
| 164 | priv->mr = ib_get_dma_mr(priv->pd, IB_ACCESS_LOCAL_WRITE); | 154 | priv->mr = ib_get_dma_mr(priv->pd, IB_ACCESS_LOCAL_WRITE); |
| @@ -252,10 +242,6 @@ out_free_mr: | |||
| 252 | 242 | ||
| 253 | out_free_pd: | 243 | out_free_pd: |
| 254 | ib_dealloc_pd(priv->pd); | 244 | ib_dealloc_pd(priv->pd); |
| 255 | |||
| 256 | out_free_wq: | ||
| 257 | destroy_workqueue(priv->wq); | ||
| 258 | priv->wq = NULL; | ||
| 259 | return -ENODEV; | 245 | return -ENODEV; |
| 260 | } | 246 | } |
| 261 | 247 | ||
| @@ -284,12 +270,6 @@ void ipoib_transport_dev_cleanup(struct net_device *dev) | |||
| 284 | 270 | ||
| 285 | if (ib_dealloc_pd(priv->pd)) | 271 | if (ib_dealloc_pd(priv->pd)) |
| 286 | ipoib_warn(priv, "ib_dealloc_pd failed\n"); | 272 | ipoib_warn(priv, "ib_dealloc_pd failed\n"); |
| 287 | |||
| 288 | if (priv->wq) { | ||
| 289 | flush_workqueue(priv->wq); | ||
| 290 | destroy_workqueue(priv->wq); | ||
| 291 | priv->wq = NULL; | ||
| 292 | } | ||
| 293 | } | 273 | } |
| 294 | 274 | ||
| 295 | void ipoib_event(struct ib_event_handler *handler, | 275 | void ipoib_event(struct ib_event_handler *handler, |
diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c index f2b978026407..6e22682c8255 100644 --- a/drivers/input/mouse/elantech.c +++ b/drivers/input/mouse/elantech.c | |||
| @@ -1097,6 +1097,8 @@ static int elantech_get_resolution_v4(struct psmouse *psmouse, | |||
| 1097 | * Asus UX31 0x361f00 20, 15, 0e clickpad | 1097 | * Asus UX31 0x361f00 20, 15, 0e clickpad |
| 1098 | * Asus UX32VD 0x361f02 00, 15, 0e clickpad | 1098 | * Asus UX32VD 0x361f02 00, 15, 0e clickpad |
| 1099 | * Avatar AVIU-145A2 0x361f00 ? clickpad | 1099 | * Avatar AVIU-145A2 0x361f00 ? clickpad |
| 1100 | * Fujitsu LIFEBOOK E544 0x470f00 d0, 12, 09 2 hw buttons | ||
| 1101 | * Fujitsu LIFEBOOK E554 0x570f01 40, 14, 0c 2 hw buttons | ||
| 1100 | * Fujitsu H730 0x570f00 c0, 14, 0c 3 hw buttons (**) | 1102 | * Fujitsu H730 0x570f00 c0, 14, 0c 3 hw buttons (**) |
| 1101 | * Gigabyte U2442 0x450f01 58, 17, 0c 2 hw buttons | 1103 | * Gigabyte U2442 0x450f01 58, 17, 0c 2 hw buttons |
| 1102 | * Lenovo L430 0x350f02 b9, 15, 0c 2 hw buttons (*) | 1104 | * Lenovo L430 0x350f02 b9, 15, 0c 2 hw buttons (*) |
| @@ -1475,6 +1477,20 @@ static const struct dmi_system_id elantech_dmi_force_crc_enabled[] = { | |||
| 1475 | DMI_MATCH(DMI_PRODUCT_NAME, "CELSIUS H730"), | 1477 | DMI_MATCH(DMI_PRODUCT_NAME, "CELSIUS H730"), |
| 1476 | }, | 1478 | }, |
| 1477 | }, | 1479 | }, |
| 1480 | { | ||
| 1481 | /* Fujitsu LIFEBOOK E554 does not work with crc_enabled == 0 */ | ||
| 1482 | .matches = { | ||
| 1483 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | ||
| 1484 | DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK E554"), | ||
| 1485 | }, | ||
| 1486 | }, | ||
| 1487 | { | ||
| 1488 | /* Fujitsu LIFEBOOK E544 does not work with crc_enabled == 0 */ | ||
| 1489 | .matches = { | ||
| 1490 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | ||
| 1491 | DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK E544"), | ||
| 1492 | }, | ||
| 1493 | }, | ||
| 1478 | #endif | 1494 | #endif |
| 1479 | { } | 1495 | { } |
| 1480 | }; | 1496 | }; |
| @@ -1520,6 +1536,8 @@ static int elantech_set_properties(struct elantech_data *etd) | |||
| 1520 | case 7: | 1536 | case 7: |
| 1521 | case 8: | 1537 | case 8: |
| 1522 | case 9: | 1538 | case 9: |
| 1539 | case 10: | ||
| 1540 | case 13: | ||
| 1523 | etd->hw_version = 4; | 1541 | etd->hw_version = 4; |
| 1524 | break; | 1542 | break; |
| 1525 | default: | 1543 | default: |
diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c index f9472920d986..23e26e0768b5 100644 --- a/drivers/input/mouse/synaptics.c +++ b/drivers/input/mouse/synaptics.c | |||
| @@ -135,8 +135,9 @@ static const struct min_max_quirk min_max_pnpid_table[] = { | |||
| 135 | 1232, 5710, 1156, 4696 | 135 | 1232, 5710, 1156, 4696 |
| 136 | }, | 136 | }, |
| 137 | { | 137 | { |
| 138 | (const char * const []){"LEN0034", "LEN0036", "LEN0039", | 138 | (const char * const []){"LEN0034", "LEN0036", "LEN0037", |
| 139 | "LEN2002", "LEN2004", NULL}, | 139 | "LEN0039", "LEN2002", "LEN2004", |
| 140 | NULL}, | ||
| 140 | 1024, 5112, 2024, 4832 | 141 | 1024, 5112, 2024, 4832 |
| 141 | }, | 142 | }, |
| 142 | { | 143 | { |
| @@ -165,7 +166,7 @@ static const char * const topbuttonpad_pnp_ids[] = { | |||
| 165 | "LEN0034", /* T431s, L440, L540, T540, W540, X1 Carbon 2nd */ | 166 | "LEN0034", /* T431s, L440, L540, T540, W540, X1 Carbon 2nd */ |
| 166 | "LEN0035", /* X240 */ | 167 | "LEN0035", /* X240 */ |
| 167 | "LEN0036", /* T440 */ | 168 | "LEN0036", /* T440 */ |
| 168 | "LEN0037", | 169 | "LEN0037", /* X1 Carbon 2nd */ |
| 169 | "LEN0038", | 170 | "LEN0038", |
| 170 | "LEN0039", /* T440s */ | 171 | "LEN0039", /* T440s */ |
| 171 | "LEN0041", | 172 | "LEN0041", |
diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h index c66d1b53843e..c11556563ef0 100644 --- a/drivers/input/serio/i8042-x86ia64io.h +++ b/drivers/input/serio/i8042-x86ia64io.h | |||
| @@ -152,6 +152,14 @@ static const struct dmi_system_id __initconst i8042_dmi_noloop_table[] = { | |||
| 152 | }, | 152 | }, |
| 153 | }, | 153 | }, |
| 154 | { | 154 | { |
| 155 | /* Medion Akoya E7225 */ | ||
| 156 | .matches = { | ||
| 157 | DMI_MATCH(DMI_SYS_VENDOR, "Medion"), | ||
| 158 | DMI_MATCH(DMI_PRODUCT_NAME, "Akoya E7225"), | ||
| 159 | DMI_MATCH(DMI_PRODUCT_VERSION, "1.0"), | ||
| 160 | }, | ||
| 161 | }, | ||
| 162 | { | ||
| 155 | /* Blue FB5601 */ | 163 | /* Blue FB5601 */ |
| 156 | .matches = { | 164 | .matches = { |
| 157 | DMI_MATCH(DMI_SYS_VENDOR, "blue"), | 165 | DMI_MATCH(DMI_SYS_VENDOR, "blue"), |
| @@ -415,6 +423,13 @@ static const struct dmi_system_id __initconst i8042_dmi_nomux_table[] = { | |||
| 415 | }, | 423 | }, |
| 416 | }, | 424 | }, |
| 417 | { | 425 | { |
| 426 | /* Acer Aspire 7738 */ | ||
| 427 | .matches = { | ||
| 428 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
| 429 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 7738"), | ||
| 430 | }, | ||
| 431 | }, | ||
| 432 | { | ||
| 418 | /* Gericom Bellagio */ | 433 | /* Gericom Bellagio */ |
| 419 | .matches = { | 434 | .matches = { |
| 420 | DMI_MATCH(DMI_SYS_VENDOR, "Gericom"), | 435 | DMI_MATCH(DMI_SYS_VENDOR, "Gericom"), |
| @@ -745,6 +760,35 @@ static const struct dmi_system_id __initconst i8042_dmi_dritek_table[] = { | |||
| 745 | { } | 760 | { } |
| 746 | }; | 761 | }; |
| 747 | 762 | ||
| 763 | /* | ||
| 764 | * Some laptops need keyboard reset before probing for the trackpad to get | ||
| 765 | * it detected, initialised & finally work. | ||
| 766 | */ | ||
| 767 | static const struct dmi_system_id __initconst i8042_dmi_kbdreset_table[] = { | ||
| 768 | { | ||
| 769 | /* Gigabyte P35 v2 - Elantech touchpad */ | ||
| 770 | .matches = { | ||
| 771 | DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), | ||
| 772 | DMI_MATCH(DMI_PRODUCT_NAME, "P35V2"), | ||
| 773 | }, | ||
| 774 | }, | ||
| 775 | { | ||
| 776 | /* Aorus branded Gigabyte X3 Plus - Elantech touchpad */ | ||
| 777 | .matches = { | ||
| 778 | DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), | ||
| 779 | DMI_MATCH(DMI_PRODUCT_NAME, "X3"), | ||
| 780 | }, | ||
| 781 | }, | ||
| 782 | { | ||
| 783 | /* Gigabyte P34 - Elantech touchpad */ | ||
| 784 | .matches = { | ||
| 785 | DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), | ||
| 786 | DMI_MATCH(DMI_PRODUCT_NAME, "P34"), | ||
| 787 | }, | ||
| 788 | }, | ||
| 789 | { } | ||
| 790 | }; | ||
| 791 | |||
| 748 | #endif /* CONFIG_X86 */ | 792 | #endif /* CONFIG_X86 */ |
| 749 | 793 | ||
| 750 | #ifdef CONFIG_PNP | 794 | #ifdef CONFIG_PNP |
| @@ -1040,6 +1084,9 @@ static int __init i8042_platform_init(void) | |||
| 1040 | if (dmi_check_system(i8042_dmi_dritek_table)) | 1084 | if (dmi_check_system(i8042_dmi_dritek_table)) |
| 1041 | i8042_dritek = true; | 1085 | i8042_dritek = true; |
| 1042 | 1086 | ||
| 1087 | if (dmi_check_system(i8042_dmi_kbdreset_table)) | ||
| 1088 | i8042_kbdreset = true; | ||
| 1089 | |||
| 1043 | /* | 1090 | /* |
| 1044 | * A20 was already enabled during early kernel init. But some buggy | 1091 | * A20 was already enabled during early kernel init. But some buggy |
| 1045 | * BIOSes (in MSI Laptops) require A20 to be enabled using 8042 to | 1092 | * 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/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index 1232336b960e..40dfbc0444c0 100644 --- a/drivers/iommu/intel-iommu.c +++ b/drivers/iommu/intel-iommu.c | |||
| @@ -4029,14 +4029,6 @@ static int device_notifier(struct notifier_block *nb, | |||
| 4029 | if (action != BUS_NOTIFY_REMOVED_DEVICE) | 4029 | if (action != BUS_NOTIFY_REMOVED_DEVICE) |
| 4030 | return 0; | 4030 | return 0; |
| 4031 | 4031 | ||
| 4032 | /* | ||
| 4033 | * If the device is still attached to a device driver we can't | ||
| 4034 | * tear down the domain yet as DMA mappings may still be in use. | ||
| 4035 | * Wait for the BUS_NOTIFY_UNBOUND_DRIVER event to do that. | ||
| 4036 | */ | ||
| 4037 | if (action == BUS_NOTIFY_DEL_DEVICE && dev->driver != NULL) | ||
| 4038 | return 0; | ||
| 4039 | |||
| 4040 | domain = find_domain(dev); | 4032 | domain = find_domain(dev); |
| 4041 | if (!domain) | 4033 | if (!domain) |
| 4042 | return 0; | 4034 | return 0; |
| @@ -4428,6 +4420,10 @@ static int intel_iommu_attach_device(struct iommu_domain *domain, | |||
| 4428 | domain_remove_one_dev_info(old_domain, dev); | 4420 | domain_remove_one_dev_info(old_domain, dev); |
| 4429 | else | 4421 | else |
| 4430 | domain_remove_dev_info(old_domain); | 4422 | domain_remove_dev_info(old_domain); |
| 4423 | |||
| 4424 | if (!domain_type_is_vm_or_si(old_domain) && | ||
| 4425 | list_empty(&old_domain->devices)) | ||
| 4426 | domain_exit(old_domain); | ||
| 4431 | } | 4427 | } |
| 4432 | } | 4428 | } |
| 4433 | 4429 | ||
diff --git a/drivers/iommu/ipmmu-vmsa.c b/drivers/iommu/ipmmu-vmsa.c index 68dfb0fd5ee9..748693192c20 100644 --- a/drivers/iommu/ipmmu-vmsa.c +++ b/drivers/iommu/ipmmu-vmsa.c | |||
| @@ -558,7 +558,7 @@ static pmd_t *ipmmu_alloc_pmd(struct ipmmu_vmsa_device *mmu, pgd_t *pgd, | |||
| 558 | 558 | ||
| 559 | static u64 ipmmu_page_prot(unsigned int prot, u64 type) | 559 | static u64 ipmmu_page_prot(unsigned int prot, u64 type) |
| 560 | { | 560 | { |
| 561 | u64 pgprot = ARM_VMSA_PTE_XN | ARM_VMSA_PTE_nG | ARM_VMSA_PTE_AF | 561 | u64 pgprot = ARM_VMSA_PTE_nG | ARM_VMSA_PTE_AF |
| 562 | | ARM_VMSA_PTE_SH_IS | ARM_VMSA_PTE_AP_UNPRIV | 562 | | ARM_VMSA_PTE_SH_IS | ARM_VMSA_PTE_AP_UNPRIV |
| 563 | | ARM_VMSA_PTE_NS | type; | 563 | | ARM_VMSA_PTE_NS | type; |
| 564 | 564 | ||
| @@ -568,8 +568,8 @@ static u64 ipmmu_page_prot(unsigned int prot, u64 type) | |||
| 568 | if (prot & IOMMU_CACHE) | 568 | if (prot & IOMMU_CACHE) |
| 569 | pgprot |= IMMAIR_ATTR_IDX_WBRWA << ARM_VMSA_PTE_ATTRINDX_SHIFT; | 569 | pgprot |= IMMAIR_ATTR_IDX_WBRWA << ARM_VMSA_PTE_ATTRINDX_SHIFT; |
| 570 | 570 | ||
| 571 | if (prot & IOMMU_EXEC) | 571 | if (prot & IOMMU_NOEXEC) |
| 572 | pgprot &= ~ARM_VMSA_PTE_XN; | 572 | pgprot |= ARM_VMSA_PTE_XN; |
| 573 | else if (!(prot & (IOMMU_READ | IOMMU_WRITE))) | 573 | else if (!(prot & (IOMMU_READ | IOMMU_WRITE))) |
| 574 | /* If no access create a faulting entry to avoid TLB fills. */ | 574 | /* If no access create a faulting entry to avoid TLB fills. */ |
| 575 | pgprot &= ~ARM_VMSA_PTE_PAGE; | 575 | pgprot &= ~ARM_VMSA_PTE_PAGE; |
diff --git a/drivers/iommu/rockchip-iommu.c b/drivers/iommu/rockchip-iommu.c index b2023af384b9..6a8b1ec4a48a 100644 --- a/drivers/iommu/rockchip-iommu.c +++ b/drivers/iommu/rockchip-iommu.c | |||
| @@ -1009,7 +1009,6 @@ static struct platform_driver rk_iommu_driver = { | |||
| 1009 | .remove = rk_iommu_remove, | 1009 | .remove = rk_iommu_remove, |
| 1010 | .driver = { | 1010 | .driver = { |
| 1011 | .name = "rk_iommu", | 1011 | .name = "rk_iommu", |
| 1012 | .owner = THIS_MODULE, | ||
| 1013 | .of_match_table = of_match_ptr(rk_iommu_dt_ids), | 1012 | .of_match_table = of_match_ptr(rk_iommu_dt_ids), |
| 1014 | }, | 1013 | }, |
| 1015 | }; | 1014 | }; |
diff --git a/drivers/iommu/tegra-gart.c b/drivers/iommu/tegra-gart.c index f722a0c466cf..c48da057dbb1 100644 --- a/drivers/iommu/tegra-gart.c +++ b/drivers/iommu/tegra-gart.c | |||
| @@ -315,6 +315,7 @@ static const struct iommu_ops gart_iommu_ops = { | |||
| 315 | .attach_dev = gart_iommu_attach_dev, | 315 | .attach_dev = gart_iommu_attach_dev, |
| 316 | .detach_dev = gart_iommu_detach_dev, | 316 | .detach_dev = gart_iommu_detach_dev, |
| 317 | .map = gart_iommu_map, | 317 | .map = gart_iommu_map, |
| 318 | .map_sg = default_iommu_map_sg, | ||
| 318 | .unmap = gart_iommu_unmap, | 319 | .unmap = gart_iommu_unmap, |
| 319 | .iova_to_phys = gart_iommu_iova_to_phys, | 320 | .iova_to_phys = gart_iommu_iova_to_phys, |
| 320 | .pgsize_bitmap = GART_IOMMU_PGSIZES, | 321 | .pgsize_bitmap = GART_IOMMU_PGSIZES, |
| @@ -395,7 +396,7 @@ static int tegra_gart_probe(struct platform_device *pdev) | |||
| 395 | do_gart_setup(gart, NULL); | 396 | do_gart_setup(gart, NULL); |
| 396 | 397 | ||
| 397 | gart_handle = gart; | 398 | gart_handle = gart; |
| 398 | bus_set_iommu(&platform_bus_type, &gart_iommu_ops); | 399 | |
| 399 | return 0; | 400 | return 0; |
| 400 | } | 401 | } |
| 401 | 402 | ||
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-mips-gic.c b/drivers/irqchip/irq-mips-gic.c index 2b0468e3df6a..56b96c63dc4b 100644 --- a/drivers/irqchip/irq-mips-gic.c +++ b/drivers/irqchip/irq-mips-gic.c | |||
| @@ -37,6 +37,7 @@ static struct irq_domain *gic_irq_domain; | |||
| 37 | static int gic_shared_intrs; | 37 | static int gic_shared_intrs; |
| 38 | static int gic_vpes; | 38 | static int gic_vpes; |
| 39 | static unsigned int gic_cpu_pin; | 39 | static unsigned int gic_cpu_pin; |
| 40 | static unsigned int timer_cpu_pin; | ||
| 40 | static struct irq_chip gic_level_irq_controller, gic_edge_irq_controller; | 41 | static struct irq_chip gic_level_irq_controller, gic_edge_irq_controller; |
| 41 | 42 | ||
| 42 | static void __gic_irq_dispatch(void); | 43 | static void __gic_irq_dispatch(void); |
| @@ -616,6 +617,8 @@ static int gic_local_irq_domain_map(struct irq_domain *d, unsigned int virq, | |||
| 616 | gic_write(GIC_REG(VPE_OTHER, GIC_VPE_COMPARE_MAP), val); | 617 | gic_write(GIC_REG(VPE_OTHER, GIC_VPE_COMPARE_MAP), val); |
| 617 | break; | 618 | break; |
| 618 | case GIC_LOCAL_INT_TIMER: | 619 | case GIC_LOCAL_INT_TIMER: |
| 620 | /* CONFIG_MIPS_CMP workaround (see __gic_init) */ | ||
| 621 | val = GIC_MAP_TO_PIN_MSK | timer_cpu_pin; | ||
| 619 | gic_write(GIC_REG(VPE_OTHER, GIC_VPE_TIMER_MAP), val); | 622 | gic_write(GIC_REG(VPE_OTHER, GIC_VPE_TIMER_MAP), val); |
| 620 | break; | 623 | break; |
| 621 | case GIC_LOCAL_INT_PERFCTR: | 624 | case GIC_LOCAL_INT_PERFCTR: |
| @@ -713,12 +716,36 @@ static void __init __gic_init(unsigned long gic_base_addr, | |||
| 713 | if (cpu_has_veic) { | 716 | if (cpu_has_veic) { |
| 714 | /* Always use vector 1 in EIC mode */ | 717 | /* Always use vector 1 in EIC mode */ |
| 715 | gic_cpu_pin = 0; | 718 | gic_cpu_pin = 0; |
| 719 | timer_cpu_pin = gic_cpu_pin; | ||
| 716 | set_vi_handler(gic_cpu_pin + GIC_PIN_TO_VEC_OFFSET, | 720 | set_vi_handler(gic_cpu_pin + GIC_PIN_TO_VEC_OFFSET, |
| 717 | __gic_irq_dispatch); | 721 | __gic_irq_dispatch); |
| 718 | } else { | 722 | } else { |
| 719 | gic_cpu_pin = cpu_vec - GIC_CPU_PIN_OFFSET; | 723 | gic_cpu_pin = cpu_vec - GIC_CPU_PIN_OFFSET; |
| 720 | irq_set_chained_handler(MIPS_CPU_IRQ_BASE + cpu_vec, | 724 | irq_set_chained_handler(MIPS_CPU_IRQ_BASE + cpu_vec, |
| 721 | gic_irq_dispatch); | 725 | gic_irq_dispatch); |
| 726 | /* | ||
| 727 | * With the CMP implementation of SMP (deprecated), other CPUs | ||
| 728 | * are started by the bootloader and put into a timer based | ||
| 729 | * waiting poll loop. We must not re-route those CPU's local | ||
| 730 | * timer interrupts as the wait instruction will never finish, | ||
| 731 | * so just handle whatever CPU interrupt it is routed to by | ||
| 732 | * default. | ||
| 733 | * | ||
| 734 | * This workaround should be removed when CMP support is | ||
| 735 | * dropped. | ||
| 736 | */ | ||
| 737 | if (IS_ENABLED(CONFIG_MIPS_CMP) && | ||
| 738 | gic_local_irq_is_routable(GIC_LOCAL_INT_TIMER)) { | ||
| 739 | timer_cpu_pin = gic_read(GIC_REG(VPE_LOCAL, | ||
| 740 | GIC_VPE_TIMER_MAP)) & | ||
| 741 | GIC_MAP_MSK; | ||
| 742 | irq_set_chained_handler(MIPS_CPU_IRQ_BASE + | ||
| 743 | GIC_CPU_PIN_OFFSET + | ||
| 744 | timer_cpu_pin, | ||
| 745 | gic_irq_dispatch); | ||
| 746 | } else { | ||
| 747 | timer_cpu_pin = gic_cpu_pin; | ||
| 748 | } | ||
| 722 | } | 749 | } |
| 723 | 750 | ||
| 724 | gic_irq_domain = irq_domain_add_simple(node, GIC_NUM_LOCAL_INTRS + | 751 | gic_irq_domain = irq_domain_add_simple(node, GIC_NUM_LOCAL_INTRS + |
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/isdn/hardware/eicon/message.c b/drivers/isdn/hardware/eicon/message.c index a82e542ffc21..d7c286656a25 100644 --- a/drivers/isdn/hardware/eicon/message.c +++ b/drivers/isdn/hardware/eicon/message.c | |||
| @@ -1474,7 +1474,7 @@ static byte connect_res(dword Id, word Number, DIVA_CAPI_ADAPTER *a, | |||
| 1474 | add_ai(plci, &parms[5]); | 1474 | add_ai(plci, &parms[5]); |
| 1475 | sig_req(plci, REJECT, 0); | 1475 | sig_req(plci, REJECT, 0); |
| 1476 | } | 1476 | } |
| 1477 | else if (Reject == 1 || Reject > 9) | 1477 | else if (Reject == 1 || Reject >= 9) |
| 1478 | { | 1478 | { |
| 1479 | add_ai(plci, &parms[5]); | 1479 | add_ai(plci, &parms[5]); |
| 1480 | sig_req(plci, HANGUP, 0); | 1480 | sig_req(plci, HANGUP, 0); |
| @@ -4880,7 +4880,7 @@ static void sig_ind(PLCI *plci) | |||
| 4880 | byte SS_Ind[] = "\x05\x02\x00\x02\x00\x00"; /* Hold_Ind struct*/ | 4880 | byte SS_Ind[] = "\x05\x02\x00\x02\x00\x00"; /* Hold_Ind struct*/ |
| 4881 | byte CF_Ind[] = "\x09\x02\x00\x06\x00\x00\x00\x00\x00\x00"; | 4881 | byte CF_Ind[] = "\x09\x02\x00\x06\x00\x00\x00\x00\x00\x00"; |
| 4882 | byte Interr_Err_Ind[] = "\x0a\x02\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; | 4882 | byte Interr_Err_Ind[] = "\x0a\x02\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; |
| 4883 | byte CONF_Ind[] = "\x09\x16\x00\x06\x00\x00\0x00\0x00\0x00\0x00"; | 4883 | byte CONF_Ind[] = "\x09\x16\x00\x06\x00\x00\x00\x00\x00\x00"; |
| 4884 | byte force_mt_info = false; | 4884 | byte force_mt_info = false; |
| 4885 | byte dir; | 4885 | byte dir; |
| 4886 | dword d; | 4886 | dword d; |
diff --git a/drivers/leds/leds-netxbig.c b/drivers/leds/leds-netxbig.c index 26515c27ea8c..25e419752a7b 100644 --- a/drivers/leds/leds-netxbig.c +++ b/drivers/leds/leds-netxbig.c | |||
| @@ -330,18 +330,18 @@ create_netxbig_led(struct platform_device *pdev, | |||
| 330 | led_dat->sata = 0; | 330 | led_dat->sata = 0; |
| 331 | led_dat->cdev.brightness = LED_OFF; | 331 | led_dat->cdev.brightness = LED_OFF; |
| 332 | led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME; | 332 | led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME; |
| 333 | /* | ||
| 334 | * If available, expose the SATA activity blink capability through | ||
| 335 | * a "sata" sysfs attribute. | ||
| 336 | */ | ||
| 337 | if (led_dat->mode_val[NETXBIG_LED_SATA] != NETXBIG_LED_INVALID_MODE) | ||
| 338 | led_dat->cdev.groups = netxbig_led_groups; | ||
| 339 | led_dat->mode_addr = template->mode_addr; | 333 | led_dat->mode_addr = template->mode_addr; |
| 340 | led_dat->mode_val = template->mode_val; | 334 | led_dat->mode_val = template->mode_val; |
| 341 | led_dat->bright_addr = template->bright_addr; | 335 | led_dat->bright_addr = template->bright_addr; |
| 342 | led_dat->bright_max = (1 << pdata->gpio_ext->num_data) - 1; | 336 | led_dat->bright_max = (1 << pdata->gpio_ext->num_data) - 1; |
| 343 | led_dat->timer = pdata->timer; | 337 | led_dat->timer = pdata->timer; |
| 344 | led_dat->num_timer = pdata->num_timer; | 338 | led_dat->num_timer = pdata->num_timer; |
| 339 | /* | ||
| 340 | * If available, expose the SATA activity blink capability through | ||
| 341 | * a "sata" sysfs attribute. | ||
| 342 | */ | ||
| 343 | if (led_dat->mode_val[NETXBIG_LED_SATA] != NETXBIG_LED_INVALID_MODE) | ||
| 344 | led_dat->cdev.groups = netxbig_led_groups; | ||
| 345 | 345 | ||
| 346 | return led_classdev_register(&pdev->dev, &led_dat->cdev); | 346 | return led_classdev_register(&pdev->dev, &led_dat->cdev); |
| 347 | } | 347 | } |
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/bitmap.c b/drivers/md/bitmap.c index da3604e73e8a..1695ee5f3ffc 100644 --- a/drivers/md/bitmap.c +++ b/drivers/md/bitmap.c | |||
| @@ -72,6 +72,19 @@ __acquires(bitmap->lock) | |||
| 72 | /* this page has not been allocated yet */ | 72 | /* this page has not been allocated yet */ |
| 73 | 73 | ||
| 74 | spin_unlock_irq(&bitmap->lock); | 74 | spin_unlock_irq(&bitmap->lock); |
| 75 | /* It is possible that this is being called inside a | ||
| 76 | * prepare_to_wait/finish_wait loop from raid5c:make_request(). | ||
| 77 | * In general it is not permitted to sleep in that context as it | ||
| 78 | * can cause the loop to spin freely. | ||
| 79 | * That doesn't apply here as we can only reach this point | ||
| 80 | * once with any loop. | ||
| 81 | * When this function completes, either bp[page].map or | ||
| 82 | * bp[page].hijacked. In either case, this function will | ||
| 83 | * abort before getting to this point again. So there is | ||
| 84 | * no risk of a free-spin, and so it is safe to assert | ||
| 85 | * that sleeping here is allowed. | ||
| 86 | */ | ||
| 87 | sched_annotate_sleep(); | ||
| 75 | mappage = kzalloc(PAGE_SIZE, GFP_NOIO); | 88 | mappage = kzalloc(PAGE_SIZE, GFP_NOIO); |
| 76 | spin_lock_irq(&bitmap->lock); | 89 | spin_lock_irq(&bitmap->lock); |
| 77 | 90 | ||
diff --git a/drivers/md/dm-cache-metadata.c b/drivers/md/dm-cache-metadata.c index 9fc616c2755e..c1c010498a21 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; |
| @@ -680,9 +683,10 @@ struct dm_cache_metadata *dm_cache_metadata_open(struct block_device *bdev, | |||
| 680 | cmd = kzalloc(sizeof(*cmd), GFP_KERNEL); | 683 | cmd = kzalloc(sizeof(*cmd), GFP_KERNEL); |
| 681 | if (!cmd) { | 684 | if (!cmd) { |
| 682 | DMERR("could not allocate metadata struct"); | 685 | DMERR("could not allocate metadata struct"); |
| 683 | return NULL; | 686 | return ERR_PTR(-ENOMEM); |
| 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,96 @@ 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 (!IS_ERR(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 | |||
| 784 | if (!IS_ERR(cmd) && !same_params(cmd, data_block_size)) { | ||
| 785 | dm_cache_metadata_close(cmd); | ||
| 786 | return ERR_PTR(-EINVAL); | ||
| 787 | } | ||
| 788 | |||
| 789 | return cmd; | ||
| 790 | } | ||
| 791 | |||
| 708 | void dm_cache_metadata_close(struct dm_cache_metadata *cmd) | 792 | void dm_cache_metadata_close(struct dm_cache_metadata *cmd) |
| 709 | { | 793 | { |
| 710 | __destroy_persistent_data_objects(cmd); | 794 | if (atomic_dec_and_test(&cmd->ref_count)) { |
| 711 | kfree(cmd); | 795 | mutex_lock(&table_lock); |
| 796 | list_del(&cmd->list); | ||
| 797 | mutex_unlock(&table_lock); | ||
| 798 | |||
| 799 | __destroy_persistent_data_objects(cmd); | ||
| 800 | kfree(cmd); | ||
| 801 | } | ||
| 712 | } | 802 | } |
| 713 | 803 | ||
| 714 | /* | 804 | /* |
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-thin.c b/drivers/md/dm-thin.c index 493478989dbd..07705ee181e3 100644 --- a/drivers/md/dm-thin.c +++ b/drivers/md/dm-thin.c | |||
| @@ -3385,6 +3385,12 @@ static int pool_message(struct dm_target *ti, unsigned argc, char **argv) | |||
| 3385 | struct pool_c *pt = ti->private; | 3385 | struct pool_c *pt = ti->private; |
| 3386 | struct pool *pool = pt->pool; | 3386 | struct pool *pool = pt->pool; |
| 3387 | 3387 | ||
| 3388 | if (get_pool_mode(pool) >= PM_READ_ONLY) { | ||
| 3389 | DMERR("%s: unable to service pool target messages in READ_ONLY or FAIL mode", | ||
| 3390 | dm_device_name(pool->pool_md)); | ||
| 3391 | return -EINVAL; | ||
| 3392 | } | ||
| 3393 | |||
| 3388 | if (!strcasecmp(argv[0], "create_thin")) | 3394 | if (!strcasecmp(argv[0], "create_thin")) |
| 3389 | r = process_create_thin_mesg(argc, argv, pool); | 3395 | r = process_create_thin_mesg(argc, argv, pool); |
| 3390 | 3396 | ||
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/md/raid5.c b/drivers/md/raid5.c index c1b0d52bfcb0..b98765f6f77f 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
| @@ -3195,6 +3195,11 @@ static void handle_stripe_dirtying(struct r5conf *conf, | |||
| 3195 | (unsigned long long)sh->sector, | 3195 | (unsigned long long)sh->sector, |
| 3196 | rcw, qread, test_bit(STRIPE_DELAYED, &sh->state)); | 3196 | rcw, qread, test_bit(STRIPE_DELAYED, &sh->state)); |
| 3197 | } | 3197 | } |
| 3198 | |||
| 3199 | if (rcw > disks && rmw > disks && | ||
| 3200 | !test_bit(STRIPE_PREREAD_ACTIVE, &sh->state)) | ||
| 3201 | set_bit(STRIPE_DELAYED, &sh->state); | ||
| 3202 | |||
| 3198 | /* now if nothing is locked, and if we have enough data, | 3203 | /* now if nothing is locked, and if we have enough data, |
| 3199 | * we can start a write request | 3204 | * we can start a write request |
| 3200 | */ | 3205 | */ |
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-acpi.c b/drivers/mmc/host/sdhci-acpi.c index e3e56d35f0ee..970314e0aac8 100644 --- a/drivers/mmc/host/sdhci-acpi.c +++ b/drivers/mmc/host/sdhci-acpi.c | |||
| @@ -247,6 +247,7 @@ static const struct sdhci_acpi_uid_slot sdhci_acpi_uids[] = { | |||
| 247 | { "INT33BB" , "3" , &sdhci_acpi_slot_int_sd }, | 247 | { "INT33BB" , "3" , &sdhci_acpi_slot_int_sd }, |
| 248 | { "INT33C6" , NULL, &sdhci_acpi_slot_int_sdio }, | 248 | { "INT33C6" , NULL, &sdhci_acpi_slot_int_sdio }, |
| 249 | { "INT3436" , NULL, &sdhci_acpi_slot_int_sdio }, | 249 | { "INT3436" , NULL, &sdhci_acpi_slot_int_sdio }, |
| 250 | { "INT344D" , NULL, &sdhci_acpi_slot_int_sdio }, | ||
| 250 | { "PNP0D40" }, | 251 | { "PNP0D40" }, |
| 251 | { }, | 252 | { }, |
| 252 | }; | 253 | }; |
| @@ -257,6 +258,7 @@ static const struct acpi_device_id sdhci_acpi_ids[] = { | |||
| 257 | { "INT33BB" }, | 258 | { "INT33BB" }, |
| 258 | { "INT33C6" }, | 259 | { "INT33C6" }, |
| 259 | { "INT3436" }, | 260 | { "INT3436" }, |
| 261 | { "INT344D" }, | ||
| 260 | { "PNP0D40" }, | 262 | { "PNP0D40" }, |
| 261 | { }, | 263 | { }, |
| 262 | }; | 264 | }; |
diff --git a/drivers/mmc/host/sdhci-pci.c b/drivers/mmc/host/sdhci-pci.c index 03427755b902..4f38554ce679 100644 --- a/drivers/mmc/host/sdhci-pci.c +++ b/drivers/mmc/host/sdhci-pci.c | |||
| @@ -993,6 +993,31 @@ static const struct pci_device_id pci_ids[] = { | |||
| 993 | .subdevice = PCI_ANY_ID, | 993 | .subdevice = PCI_ANY_ID, |
| 994 | .driver_data = (kernel_ulong_t)&sdhci_intel_mrfl_mmc, | 994 | .driver_data = (kernel_ulong_t)&sdhci_intel_mrfl_mmc, |
| 995 | }, | 995 | }, |
| 996 | |||
| 997 | { | ||
| 998 | .vendor = PCI_VENDOR_ID_INTEL, | ||
| 999 | .device = PCI_DEVICE_ID_INTEL_SPT_EMMC, | ||
| 1000 | .subvendor = PCI_ANY_ID, | ||
| 1001 | .subdevice = PCI_ANY_ID, | ||
| 1002 | .driver_data = (kernel_ulong_t)&sdhci_intel_byt_emmc, | ||
| 1003 | }, | ||
| 1004 | |||
| 1005 | { | ||
| 1006 | .vendor = PCI_VENDOR_ID_INTEL, | ||
| 1007 | .device = PCI_DEVICE_ID_INTEL_SPT_SDIO, | ||
| 1008 | .subvendor = PCI_ANY_ID, | ||
| 1009 | .subdevice = PCI_ANY_ID, | ||
| 1010 | .driver_data = (kernel_ulong_t)&sdhci_intel_byt_sdio, | ||
| 1011 | }, | ||
| 1012 | |||
| 1013 | { | ||
| 1014 | .vendor = PCI_VENDOR_ID_INTEL, | ||
| 1015 | .device = PCI_DEVICE_ID_INTEL_SPT_SD, | ||
| 1016 | .subvendor = PCI_ANY_ID, | ||
| 1017 | .subdevice = PCI_ANY_ID, | ||
| 1018 | .driver_data = (kernel_ulong_t)&sdhci_intel_byt_sd, | ||
| 1019 | }, | ||
| 1020 | |||
| 996 | { | 1021 | { |
| 997 | .vendor = PCI_VENDOR_ID_O2, | 1022 | .vendor = PCI_VENDOR_ID_O2, |
| 998 | .device = PCI_DEVICE_ID_O2_8120, | 1023 | .device = PCI_DEVICE_ID_O2_8120, |
diff --git a/drivers/mmc/host/sdhci-pci.h b/drivers/mmc/host/sdhci-pci.h index d57c3d169914..1ec684d06d54 100644 --- a/drivers/mmc/host/sdhci-pci.h +++ b/drivers/mmc/host/sdhci-pci.h | |||
| @@ -21,6 +21,9 @@ | |||
| 21 | #define PCI_DEVICE_ID_INTEL_CLV_EMMC0 0x08e5 | 21 | #define PCI_DEVICE_ID_INTEL_CLV_EMMC0 0x08e5 |
| 22 | #define PCI_DEVICE_ID_INTEL_CLV_EMMC1 0x08e6 | 22 | #define PCI_DEVICE_ID_INTEL_CLV_EMMC1 0x08e6 |
| 23 | #define PCI_DEVICE_ID_INTEL_QRK_SD 0x08A7 | 23 | #define PCI_DEVICE_ID_INTEL_QRK_SD 0x08A7 |
| 24 | #define PCI_DEVICE_ID_INTEL_SPT_EMMC 0x9d2b | ||
| 25 | #define PCI_DEVICE_ID_INTEL_SPT_SDIO 0x9d2c | ||
| 26 | #define PCI_DEVICE_ID_INTEL_SPT_SD 0x9d2d | ||
| 24 | 27 | ||
| 25 | /* | 28 | /* |
| 26 | * PCI registers | 29 | * PCI registers |
diff --git a/drivers/mmc/host/sdhci-pxav3.c b/drivers/mmc/host/sdhci-pxav3.c index 45238871192d..ca3424e7ef71 100644 --- a/drivers/mmc/host/sdhci-pxav3.c +++ b/drivers/mmc/host/sdhci-pxav3.c | |||
| @@ -300,13 +300,6 @@ static int sdhci_pxav3_probe(struct platform_device *pdev) | |||
| 300 | if (IS_ERR(host)) | 300 | if (IS_ERR(host)) |
| 301 | return PTR_ERR(host); | 301 | return PTR_ERR(host); |
| 302 | 302 | ||
| 303 | if (of_device_is_compatible(np, "marvell,armada-380-sdhci")) { | ||
| 304 | ret = mv_conf_mbus_windows(pdev, mv_mbus_dram_info()); | ||
| 305 | if (ret < 0) | ||
| 306 | goto err_mbus_win; | ||
| 307 | } | ||
| 308 | |||
| 309 | |||
| 310 | pltfm_host = sdhci_priv(host); | 303 | pltfm_host = sdhci_priv(host); |
| 311 | pltfm_host->priv = pxa; | 304 | pltfm_host->priv = pxa; |
| 312 | 305 | ||
| @@ -325,6 +318,12 @@ static int sdhci_pxav3_probe(struct platform_device *pdev) | |||
| 325 | if (!IS_ERR(pxa->clk_core)) | 318 | if (!IS_ERR(pxa->clk_core)) |
| 326 | clk_prepare_enable(pxa->clk_core); | 319 | clk_prepare_enable(pxa->clk_core); |
| 327 | 320 | ||
| 321 | if (of_device_is_compatible(np, "marvell,armada-380-sdhci")) { | ||
| 322 | ret = mv_conf_mbus_windows(pdev, mv_mbus_dram_info()); | ||
| 323 | if (ret < 0) | ||
| 324 | goto err_mbus_win; | ||
| 325 | } | ||
| 326 | |||
| 328 | /* enable 1/8V DDR capable */ | 327 | /* enable 1/8V DDR capable */ |
| 329 | host->mmc->caps |= MMC_CAP_1_8V_DDR; | 328 | host->mmc->caps |= MMC_CAP_1_8V_DDR; |
| 330 | 329 | ||
| @@ -396,11 +395,11 @@ err_add_host: | |||
| 396 | pm_runtime_disable(&pdev->dev); | 395 | pm_runtime_disable(&pdev->dev); |
| 397 | err_of_parse: | 396 | err_of_parse: |
| 398 | err_cd_req: | 397 | err_cd_req: |
| 398 | err_mbus_win: | ||
| 399 | clk_disable_unprepare(pxa->clk_io); | 399 | clk_disable_unprepare(pxa->clk_io); |
| 400 | if (!IS_ERR(pxa->clk_core)) | 400 | if (!IS_ERR(pxa->clk_core)) |
| 401 | clk_disable_unprepare(pxa->clk_core); | 401 | clk_disable_unprepare(pxa->clk_core); |
| 402 | err_clk_get: | 402 | err_clk_get: |
| 403 | err_mbus_win: | ||
| 404 | sdhci_pltfm_free(pdev); | 403 | sdhci_pltfm_free(pdev); |
| 405 | return ret; | 404 | return ret; |
| 406 | } | 405 | } |
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index cbb245b58538..f1a488ee432f 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c | |||
| @@ -259,8 +259,6 @@ static void sdhci_reinit(struct sdhci_host *host) | |||
| 259 | 259 | ||
| 260 | del_timer_sync(&host->tuning_timer); | 260 | del_timer_sync(&host->tuning_timer); |
| 261 | host->flags &= ~SDHCI_NEEDS_RETUNING; | 261 | host->flags &= ~SDHCI_NEEDS_RETUNING; |
| 262 | host->mmc->max_blk_count = | ||
| 263 | (host->quirks & SDHCI_QUIRK_NO_MULTIBLOCK) ? 1 : 65535; | ||
| 264 | } | 262 | } |
| 265 | sdhci_enable_card_detection(host); | 263 | sdhci_enable_card_detection(host); |
| 266 | } | 264 | } |
| @@ -1273,6 +1271,12 @@ static void sdhci_set_power(struct sdhci_host *host, unsigned char mode, | |||
| 1273 | spin_unlock_irq(&host->lock); | 1271 | spin_unlock_irq(&host->lock); |
| 1274 | mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, vdd); | 1272 | mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, vdd); |
| 1275 | 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 | |||
| 1276 | return; | 1280 | return; |
| 1277 | } | 1281 | } |
| 1278 | 1282 | ||
| @@ -1353,6 +1357,8 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq) | |||
| 1353 | 1357 | ||
| 1354 | sdhci_runtime_pm_get(host); | 1358 | sdhci_runtime_pm_get(host); |
| 1355 | 1359 | ||
| 1360 | present = mmc_gpio_get_cd(host->mmc); | ||
| 1361 | |||
| 1356 | spin_lock_irqsave(&host->lock, flags); | 1362 | spin_lock_irqsave(&host->lock, flags); |
| 1357 | 1363 | ||
| 1358 | WARN_ON(host->mrq != NULL); | 1364 | WARN_ON(host->mrq != NULL); |
| @@ -1381,7 +1387,6 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq) | |||
| 1381 | * zero: cd-gpio is used, and card is removed | 1387 | * zero: cd-gpio is used, and card is removed |
| 1382 | * one: cd-gpio is used, and card is present | 1388 | * one: cd-gpio is used, and card is present |
| 1383 | */ | 1389 | */ |
| 1384 | present = mmc_gpio_get_cd(host->mmc); | ||
| 1385 | if (present < 0) { | 1390 | if (present < 0) { |
| 1386 | /* If polling, assume that the card is always present. */ | 1391 | /* If polling, assume that the card is always present. */ |
| 1387 | if (host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION) | 1392 | if (host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION) |
| @@ -1880,6 +1885,18 @@ static int sdhci_card_busy(struct mmc_host *mmc) | |||
| 1880 | return !(present_state & SDHCI_DATA_LVL_MASK); | 1885 | return !(present_state & SDHCI_DATA_LVL_MASK); |
| 1881 | } | 1886 | } |
| 1882 | 1887 | ||
| 1888 | static int sdhci_prepare_hs400_tuning(struct mmc_host *mmc, struct mmc_ios *ios) | ||
| 1889 | { | ||
| 1890 | struct sdhci_host *host = mmc_priv(mmc); | ||
| 1891 | unsigned long flags; | ||
| 1892 | |||
| 1893 | spin_lock_irqsave(&host->lock, flags); | ||
| 1894 | host->flags |= SDHCI_HS400_TUNING; | ||
| 1895 | spin_unlock_irqrestore(&host->lock, flags); | ||
| 1896 | |||
| 1897 | return 0; | ||
| 1898 | } | ||
| 1899 | |||
| 1883 | static int sdhci_execute_tuning(struct mmc_host *mmc, u32 opcode) | 1900 | static int sdhci_execute_tuning(struct mmc_host *mmc, u32 opcode) |
| 1884 | { | 1901 | { |
| 1885 | struct sdhci_host *host = mmc_priv(mmc); | 1902 | struct sdhci_host *host = mmc_priv(mmc); |
| @@ -1887,10 +1904,18 @@ static int sdhci_execute_tuning(struct mmc_host *mmc, u32 opcode) | |||
| 1887 | int tuning_loop_counter = MAX_TUNING_LOOP; | 1904 | int tuning_loop_counter = MAX_TUNING_LOOP; |
| 1888 | int err = 0; | 1905 | int err = 0; |
| 1889 | unsigned long flags; | 1906 | unsigned long flags; |
| 1907 | unsigned int tuning_count = 0; | ||
| 1908 | bool hs400_tuning; | ||
| 1890 | 1909 | ||
| 1891 | sdhci_runtime_pm_get(host); | 1910 | sdhci_runtime_pm_get(host); |
| 1892 | spin_lock_irqsave(&host->lock, flags); | 1911 | spin_lock_irqsave(&host->lock, flags); |
| 1893 | 1912 | ||
| 1913 | hs400_tuning = host->flags & SDHCI_HS400_TUNING; | ||
| 1914 | host->flags &= ~SDHCI_HS400_TUNING; | ||
| 1915 | |||
| 1916 | if (host->tuning_mode == SDHCI_TUNING_MODE_1) | ||
| 1917 | tuning_count = host->tuning_count; | ||
| 1918 | |||
| 1894 | /* | 1919 | /* |
| 1895 | * The Host Controller needs tuning only in case of SDR104 mode | 1920 | * The Host Controller needs tuning only in case of SDR104 mode |
| 1896 | * and for SDR50 mode when Use Tuning for SDR50 is set in the | 1921 | * and for SDR50 mode when Use Tuning for SDR50 is set in the |
| @@ -1899,8 +1924,20 @@ static int sdhci_execute_tuning(struct mmc_host *mmc, u32 opcode) | |||
| 1899 | * tuning function has to be executed. | 1924 | * tuning function has to be executed. |
| 1900 | */ | 1925 | */ |
| 1901 | switch (host->timing) { | 1926 | switch (host->timing) { |
| 1927 | /* HS400 tuning is done in HS200 mode */ | ||
| 1902 | case MMC_TIMING_MMC_HS400: | 1928 | case MMC_TIMING_MMC_HS400: |
| 1929 | err = -EINVAL; | ||
| 1930 | goto out_unlock; | ||
| 1931 | |||
| 1903 | case MMC_TIMING_MMC_HS200: | 1932 | case MMC_TIMING_MMC_HS200: |
| 1933 | /* | ||
| 1934 | * Periodic re-tuning for HS400 is not expected to be needed, so | ||
| 1935 | * disable it here. | ||
| 1936 | */ | ||
| 1937 | if (hs400_tuning) | ||
| 1938 | tuning_count = 0; | ||
| 1939 | break; | ||
| 1940 | |||
| 1904 | case MMC_TIMING_UHS_SDR104: | 1941 | case MMC_TIMING_UHS_SDR104: |
| 1905 | break; | 1942 | break; |
| 1906 | 1943 | ||
| @@ -1911,9 +1948,7 @@ static int sdhci_execute_tuning(struct mmc_host *mmc, u32 opcode) | |||
| 1911 | /* FALLTHROUGH */ | 1948 | /* FALLTHROUGH */ |
| 1912 | 1949 | ||
| 1913 | default: | 1950 | default: |
| 1914 | spin_unlock_irqrestore(&host->lock, flags); | 1951 | goto out_unlock; |
| 1915 | sdhci_runtime_pm_put(host); | ||
| 1916 | return 0; | ||
| 1917 | } | 1952 | } |
| 1918 | 1953 | ||
| 1919 | if (host->ops->platform_execute_tuning) { | 1954 | if (host->ops->platform_execute_tuning) { |
| @@ -2037,24 +2072,11 @@ static int sdhci_execute_tuning(struct mmc_host *mmc, u32 opcode) | |||
| 2037 | } | 2072 | } |
| 2038 | 2073 | ||
| 2039 | out: | 2074 | out: |
| 2040 | /* | 2075 | host->flags &= ~SDHCI_NEEDS_RETUNING; |
| 2041 | * If this is the very first time we are here, we start the retuning | 2076 | |
| 2042 | * timer. Since only during the first time, SDHCI_NEEDS_RETUNING | 2077 | if (tuning_count) { |
| 2043 | * flag won't be set, we check this condition before actually starting | ||
| 2044 | * the timer. | ||
| 2045 | */ | ||
| 2046 | if (!(host->flags & SDHCI_NEEDS_RETUNING) && host->tuning_count && | ||
| 2047 | (host->tuning_mode == SDHCI_TUNING_MODE_1)) { | ||
| 2048 | host->flags |= SDHCI_USING_RETUNING_TIMER; | 2078 | host->flags |= SDHCI_USING_RETUNING_TIMER; |
| 2049 | mod_timer(&host->tuning_timer, jiffies + | 2079 | mod_timer(&host->tuning_timer, jiffies + tuning_count * HZ); |
| 2050 | host->tuning_count * HZ); | ||
| 2051 | /* Tuning mode 1 limits the maximum data length to 4MB */ | ||
| 2052 | mmc->max_blk_count = (4 * 1024 * 1024) / mmc->max_blk_size; | ||
| 2053 | } else if (host->flags & SDHCI_USING_RETUNING_TIMER) { | ||
| 2054 | host->flags &= ~SDHCI_NEEDS_RETUNING; | ||
| 2055 | /* Reload the new initial value for timer */ | ||
| 2056 | mod_timer(&host->tuning_timer, jiffies + | ||
| 2057 | host->tuning_count * HZ); | ||
| 2058 | } | 2080 | } |
| 2059 | 2081 | ||
| 2060 | /* | 2082 | /* |
| @@ -2070,6 +2092,7 @@ out: | |||
| 2070 | 2092 | ||
| 2071 | sdhci_writel(host, host->ier, SDHCI_INT_ENABLE); | 2093 | sdhci_writel(host, host->ier, SDHCI_INT_ENABLE); |
| 2072 | sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE); | 2094 | sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE); |
| 2095 | out_unlock: | ||
| 2073 | spin_unlock_irqrestore(&host->lock, flags); | 2096 | spin_unlock_irqrestore(&host->lock, flags); |
| 2074 | sdhci_runtime_pm_put(host); | 2097 | sdhci_runtime_pm_put(host); |
| 2075 | 2098 | ||
| @@ -2110,15 +2133,18 @@ static void sdhci_card_event(struct mmc_host *mmc) | |||
| 2110 | { | 2133 | { |
| 2111 | struct sdhci_host *host = mmc_priv(mmc); | 2134 | struct sdhci_host *host = mmc_priv(mmc); |
| 2112 | unsigned long flags; | 2135 | unsigned long flags; |
| 2136 | int present; | ||
| 2113 | 2137 | ||
| 2114 | /* First check if client has provided their own card event */ | 2138 | /* First check if client has provided their own card event */ |
| 2115 | if (host->ops->card_event) | 2139 | if (host->ops->card_event) |
| 2116 | host->ops->card_event(host); | 2140 | host->ops->card_event(host); |
| 2117 | 2141 | ||
| 2142 | present = sdhci_do_get_cd(host); | ||
| 2143 | |||
| 2118 | spin_lock_irqsave(&host->lock, flags); | 2144 | spin_lock_irqsave(&host->lock, flags); |
| 2119 | 2145 | ||
| 2120 | /* Check host->mrq first in case we are runtime suspended */ | 2146 | /* Check host->mrq first in case we are runtime suspended */ |
| 2121 | if (host->mrq && !sdhci_do_get_cd(host)) { | 2147 | if (host->mrq && !present) { |
| 2122 | pr_err("%s: Card removed during transfer!\n", | 2148 | pr_err("%s: Card removed during transfer!\n", |
| 2123 | mmc_hostname(host->mmc)); | 2149 | mmc_hostname(host->mmc)); |
| 2124 | pr_err("%s: Resetting controller.\n", | 2150 | pr_err("%s: Resetting controller.\n", |
| @@ -2142,6 +2168,7 @@ static const struct mmc_host_ops sdhci_ops = { | |||
| 2142 | .hw_reset = sdhci_hw_reset, | 2168 | .hw_reset = sdhci_hw_reset, |
| 2143 | .enable_sdio_irq = sdhci_enable_sdio_irq, | 2169 | .enable_sdio_irq = sdhci_enable_sdio_irq, |
| 2144 | .start_signal_voltage_switch = sdhci_start_signal_voltage_switch, | 2170 | .start_signal_voltage_switch = sdhci_start_signal_voltage_switch, |
| 2171 | .prepare_hs400_tuning = sdhci_prepare_hs400_tuning, | ||
| 2145 | .execute_tuning = sdhci_execute_tuning, | 2172 | .execute_tuning = sdhci_execute_tuning, |
| 2146 | .card_event = sdhci_card_event, | 2173 | .card_event = sdhci_card_event, |
| 2147 | .card_busy = sdhci_card_busy, | 2174 | .card_busy = sdhci_card_busy, |
| @@ -3260,8 +3287,9 @@ int sdhci_add_host(struct sdhci_host *host) | |||
| 3260 | mmc->max_segs = SDHCI_MAX_SEGS; | 3287 | mmc->max_segs = SDHCI_MAX_SEGS; |
| 3261 | 3288 | ||
| 3262 | /* | 3289 | /* |
| 3263 | * Maximum number of sectors in one transfer. Limited by DMA boundary | 3290 | * Maximum number of sectors in one transfer. Limited by SDMA boundary |
| 3264 | * size (512KiB). | 3291 | * size (512KiB). Note some tuning modes impose a 4MiB limit, but this |
| 3292 | * is less anyway. | ||
| 3265 | */ | 3293 | */ |
| 3266 | mmc->max_req_size = 524288; | 3294 | mmc->max_req_size = 524288; |
| 3267 | 3295 | ||
diff --git a/drivers/net/caif/caif_hsi.c b/drivers/net/caif/caif_hsi.c index 5e40a8b68cbe..b3b922adc0e4 100644 --- a/drivers/net/caif/caif_hsi.c +++ b/drivers/net/caif/caif_hsi.c | |||
| @@ -1415,7 +1415,6 @@ static int caif_hsi_newlink(struct net *src_net, struct net_device *dev, | |||
| 1415 | 1415 | ||
| 1416 | cfhsi = netdev_priv(dev); | 1416 | cfhsi = netdev_priv(dev); |
| 1417 | cfhsi_netlink_parms(data, cfhsi); | 1417 | cfhsi_netlink_parms(data, cfhsi); |
| 1418 | dev_net_set(cfhsi->ndev, src_net); | ||
| 1419 | 1418 | ||
| 1420 | get_ops = symbol_get(cfhsi_get_ops); | 1419 | get_ops = symbol_get(cfhsi_get_ops); |
| 1421 | if (!get_ops) { | 1420 | if (!get_ops) { |
diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c index f94a9fa60488..c672c4dcffac 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 3ec8f6f25e5f..847c1f813261 100644 --- a/drivers/net/can/dev.c +++ b/drivers/net/can/dev.c | |||
| @@ -807,10 +807,14 @@ static int can_changelink(struct net_device *dev, | |||
| 807 | if (dev->flags & IFF_UP) | 807 | if (dev->flags & IFF_UP) |
| 808 | return -EBUSY; | 808 | return -EBUSY; |
| 809 | cm = nla_data(data[IFLA_CAN_CTRLMODE]); | 809 | cm = nla_data(data[IFLA_CAN_CTRLMODE]); |
| 810 | if (cm->flags & ~priv->ctrlmode_supported) | 810 | |
| 811 | /* check whether changed bits are allowed to be modified */ | ||
| 812 | if (cm->mask & ~priv->ctrlmode_supported) | ||
| 811 | return -EOPNOTSUPP; | 813 | return -EOPNOTSUPP; |
| 814 | |||
| 815 | /* clear bits to be modified and copy the flag values */ | ||
| 812 | priv->ctrlmode &= ~cm->mask; | 816 | priv->ctrlmode &= ~cm->mask; |
| 813 | priv->ctrlmode |= cm->flags; | 817 | priv->ctrlmode |= (cm->flags & cm->mask); |
| 814 | 818 | ||
| 815 | /* CAN_CTRLMODE_FD can only be set when driver supports FD */ | 819 | /* CAN_CTRLMODE_FD can only be set when driver supports FD */ |
| 816 | if (priv->ctrlmode & CAN_CTRLMODE_FD) | 820 | 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 d7bc462aafdc..244529881be9 100644 --- a/drivers/net/can/m_can/m_can.c +++ b/drivers/net/can/m_can/m_can.c | |||
| @@ -955,6 +955,11 @@ static struct net_device *alloc_m_can_dev(void) | |||
| 955 | priv->can.data_bittiming_const = &m_can_data_bittiming_const; | 955 | priv->can.data_bittiming_const = &m_can_data_bittiming_const; |
| 956 | priv->can.do_set_mode = m_can_set_mode; | 956 | priv->can.do_set_mode = m_can_set_mode; |
| 957 | priv->can.do_get_berr_counter = m_can_get_berr_counter; | 957 | priv->can.do_get_berr_counter = m_can_get_berr_counter; |
| 958 | |||
| 959 | /* CAN_CTRLMODE_FD_NON_ISO is fixed with M_CAN IP v3.0.1 */ | ||
| 960 | priv->can.ctrlmode = CAN_CTRLMODE_FD_NON_ISO; | ||
| 961 | |||
| 962 | /* CAN_CTRLMODE_FD_NON_ISO can not be changed with M_CAN IP v3.0.1 */ | ||
| 958 | priv->can.ctrlmode_supported = CAN_CTRLMODE_LOOPBACK | | 963 | priv->can.ctrlmode_supported = CAN_CTRLMODE_LOOPBACK | |
| 959 | CAN_CTRLMODE_LISTENONLY | | 964 | CAN_CTRLMODE_LISTENONLY | |
| 960 | CAN_CTRLMODE_BERR_REPORTING | | 965 | 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/allwinner/sun4i-emac.c b/drivers/net/ethernet/allwinner/sun4i-emac.c index 1fcd5568a352..f3470d96837a 100644 --- a/drivers/net/ethernet/allwinner/sun4i-emac.c +++ b/drivers/net/ethernet/allwinner/sun4i-emac.c | |||
| @@ -850,8 +850,10 @@ static int emac_probe(struct platform_device *pdev) | |||
| 850 | } | 850 | } |
| 851 | 851 | ||
| 852 | db->clk = devm_clk_get(&pdev->dev, NULL); | 852 | db->clk = devm_clk_get(&pdev->dev, NULL); |
| 853 | if (IS_ERR(db->clk)) | 853 | if (IS_ERR(db->clk)) { |
| 854 | ret = PTR_ERR(db->clk); | ||
| 854 | goto out; | 855 | goto out; |
| 856 | } | ||
| 855 | 857 | ||
| 856 | clk_prepare_enable(db->clk); | 858 | clk_prepare_enable(db->clk); |
| 857 | 859 | ||
diff --git a/drivers/net/ethernet/altera/altera_tse_main.c b/drivers/net/ethernet/altera/altera_tse_main.c index 3498760dc22a..760c72c6e2ac 100644 --- a/drivers/net/ethernet/altera/altera_tse_main.c +++ b/drivers/net/ethernet/altera/altera_tse_main.c | |||
| @@ -1170,10 +1170,6 @@ tx_request_irq_error: | |||
| 1170 | init_error: | 1170 | init_error: |
| 1171 | free_skbufs(dev); | 1171 | free_skbufs(dev); |
| 1172 | alloc_skbuf_error: | 1172 | alloc_skbuf_error: |
| 1173 | if (priv->phydev) { | ||
| 1174 | phy_disconnect(priv->phydev); | ||
| 1175 | priv->phydev = NULL; | ||
| 1176 | } | ||
| 1177 | phy_error: | 1173 | phy_error: |
| 1178 | return ret; | 1174 | return ret; |
| 1179 | } | 1175 | } |
| @@ -1186,12 +1182,9 @@ static int tse_shutdown(struct net_device *dev) | |||
| 1186 | int ret; | 1182 | int ret; |
| 1187 | unsigned long int flags; | 1183 | unsigned long int flags; |
| 1188 | 1184 | ||
| 1189 | /* Stop and disconnect the PHY */ | 1185 | /* Stop the PHY */ |
| 1190 | if (priv->phydev) { | 1186 | if (priv->phydev) |
| 1191 | phy_stop(priv->phydev); | 1187 | phy_stop(priv->phydev); |
| 1192 | phy_disconnect(priv->phydev); | ||
| 1193 | priv->phydev = NULL; | ||
| 1194 | } | ||
| 1195 | 1188 | ||
| 1196 | netif_stop_queue(dev); | 1189 | netif_stop_queue(dev); |
| 1197 | napi_disable(&priv->napi); | 1190 | napi_disable(&priv->napi); |
| @@ -1525,6 +1518,10 @@ err_free_netdev: | |||
| 1525 | static int altera_tse_remove(struct platform_device *pdev) | 1518 | static int altera_tse_remove(struct platform_device *pdev) |
| 1526 | { | 1519 | { |
| 1527 | struct net_device *ndev = platform_get_drvdata(pdev); | 1520 | struct net_device *ndev = platform_get_drvdata(pdev); |
| 1521 | struct altera_tse_private *priv = netdev_priv(ndev); | ||
| 1522 | |||
| 1523 | if (priv->phydev) | ||
| 1524 | phy_disconnect(priv->phydev); | ||
| 1528 | 1525 | ||
| 1529 | platform_set_drvdata(pdev, NULL); | 1526 | platform_set_drvdata(pdev, NULL); |
| 1530 | altera_tse_mdio_destroy(ndev); | 1527 | altera_tse_mdio_destroy(ndev); |
diff --git a/drivers/net/ethernet/amd/Kconfig b/drivers/net/ethernet/amd/Kconfig index 7a5e4aa5415e..77f1f6048ddd 100644 --- a/drivers/net/ethernet/amd/Kconfig +++ b/drivers/net/ethernet/amd/Kconfig | |||
| @@ -45,7 +45,7 @@ config AMD8111_ETH | |||
| 45 | 45 | ||
| 46 | config LANCE | 46 | config LANCE |
| 47 | tristate "AMD LANCE and PCnet (AT1500 and NE2100) support" | 47 | tristate "AMD LANCE and PCnet (AT1500 and NE2100) support" |
| 48 | depends on ISA && ISA_DMA_API | 48 | depends on ISA && ISA_DMA_API && !ARM |
| 49 | ---help--- | 49 | ---help--- |
| 50 | If you have a network (Ethernet) card of this type, say Y and read | 50 | If you have a network (Ethernet) card of this type, say Y and read |
| 51 | the Ethernet-HOWTO, available from | 51 | the Ethernet-HOWTO, available from |
| @@ -142,7 +142,7 @@ config PCMCIA_NMCLAN | |||
| 142 | 142 | ||
| 143 | config NI65 | 143 | config NI65 |
| 144 | tristate "NI6510 support" | 144 | tristate "NI6510 support" |
| 145 | depends on ISA && ISA_DMA_API | 145 | depends on ISA && ISA_DMA_API && !ARM |
| 146 | ---help--- | 146 | ---help--- |
| 147 | If you have a network (Ethernet) card of this type, say Y and read | 147 | If you have a network (Ethernet) card of this type, say Y and read |
| 148 | the Ethernet-HOWTO, available from | 148 | the Ethernet-HOWTO, available from |
diff --git a/drivers/net/ethernet/amd/nmclan_cs.c b/drivers/net/ethernet/amd/nmclan_cs.c index 5b22764ba88d..27245efe9f50 100644 --- a/drivers/net/ethernet/amd/nmclan_cs.c +++ b/drivers/net/ethernet/amd/nmclan_cs.c | |||
| @@ -952,6 +952,8 @@ static irqreturn_t mace_interrupt(int irq, void *dev_id) | |||
| 952 | do { | 952 | do { |
| 953 | /* WARNING: MACE_IR is a READ/CLEAR port! */ | 953 | /* WARNING: MACE_IR is a READ/CLEAR port! */ |
| 954 | status = inb(ioaddr + AM2150_MACE_BASE + MACE_IR); | 954 | status = inb(ioaddr + AM2150_MACE_BASE + MACE_IR); |
| 955 | if (!(status & ~MACE_IMR_DEFAULT) && IntrCnt == MACE_MAX_IR_ITERATIONS) | ||
| 956 | return IRQ_NONE; | ||
| 955 | 957 | ||
| 956 | pr_debug("mace_interrupt: irq 0x%X status 0x%X.\n", irq, status); | 958 | pr_debug("mace_interrupt: irq 0x%X status 0x%X.\n", irq, status); |
| 957 | 959 | ||
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 53f5f66ec2ee..4c66cd1d1e60 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-dev.c +++ b/drivers/net/ethernet/amd/xgbe/xgbe-dev.c | |||
| @@ -2079,10 +2079,10 @@ static void xgbe_config_flow_control_threshold(struct xgbe_prv_data *pdata) | |||
| 2079 | 2079 | ||
| 2080 | for (i = 0; i < pdata->rx_q_count; i++) { | 2080 | for (i = 0; i < pdata->rx_q_count; i++) { |
| 2081 | /* Activate flow control when less than 4k left in fifo */ | 2081 | /* Activate flow control when less than 4k left in fifo */ |
| 2082 | XGMAC_MTL_IOWRITE_BITS(pdata, i, MTL_Q_RQOMR, RFA, 2); | 2082 | XGMAC_MTL_IOWRITE_BITS(pdata, i, MTL_Q_RQFCR, RFA, 2); |
| 2083 | 2083 | ||
| 2084 | /* De-activate flow control when more than 6k left in fifo */ | 2084 | /* De-activate flow control when more than 6k left in fifo */ |
| 2085 | XGMAC_MTL_IOWRITE_BITS(pdata, i, MTL_Q_RQOMR, RFD, 4); | 2085 | XGMAC_MTL_IOWRITE_BITS(pdata, i, MTL_Q_RQFCR, RFD, 4); |
| 2086 | } | 2086 | } |
| 2087 | } | 2087 | } |
| 2088 | 2088 | ||
diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c index 7bb5f07dbeef..e5ffb2ccb67d 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c +++ b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c | |||
| @@ -523,6 +523,7 @@ void xgbe_get_all_hw_features(struct xgbe_prv_data *pdata) | |||
| 523 | hw_feat->sph = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, SPHEN); | 523 | hw_feat->sph = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, SPHEN); |
| 524 | hw_feat->tso = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, TSOEN); | 524 | hw_feat->tso = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, TSOEN); |
| 525 | hw_feat->dma_debug = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, DBGMEMA); | 525 | hw_feat->dma_debug = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, DBGMEMA); |
| 526 | hw_feat->rss = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, RSSEN); | ||
| 526 | hw_feat->tc_cnt = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, NUMTC); | 527 | hw_feat->tc_cnt = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, NUMTC); |
| 527 | hw_feat->hash_table_size = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, | 528 | hw_feat->hash_table_size = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, |
| 528 | HASHTBLSZ); | 529 | HASHTBLSZ); |
| @@ -552,13 +553,14 @@ void xgbe_get_all_hw_features(struct xgbe_prv_data *pdata) | |||
| 552 | break; | 553 | break; |
| 553 | } | 554 | } |
| 554 | 555 | ||
| 555 | /* The Queue and Channel counts are zero based so increment them | 556 | /* The Queue, Channel and TC counts are zero based so increment them |
| 556 | * to get the actual number | 557 | * to get the actual number |
| 557 | */ | 558 | */ |
| 558 | hw_feat->rx_q_cnt++; | 559 | hw_feat->rx_q_cnt++; |
| 559 | hw_feat->tx_q_cnt++; | 560 | hw_feat->tx_q_cnt++; |
| 560 | hw_feat->rx_ch_cnt++; | 561 | hw_feat->rx_ch_cnt++; |
| 561 | hw_feat->tx_ch_cnt++; | 562 | hw_feat->tx_ch_cnt++; |
| 563 | hw_feat->tc_cnt++; | ||
| 562 | 564 | ||
| 563 | DBGPR("<--xgbe_get_all_hw_features\n"); | 565 | DBGPR("<--xgbe_get_all_hw_features\n"); |
| 564 | } | 566 | } |
diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c index 83a50280bb70..793f3b73eeff 100644 --- a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c +++ b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c | |||
| @@ -369,6 +369,8 @@ static int xgene_enet_process_ring(struct xgene_enet_desc_ring *ring, | |||
| 369 | if (unlikely(xgene_enet_is_desc_slot_empty(raw_desc))) | 369 | if (unlikely(xgene_enet_is_desc_slot_empty(raw_desc))) |
| 370 | break; | 370 | break; |
| 371 | 371 | ||
| 372 | /* read fpqnum field after dataaddr field */ | ||
| 373 | dma_rmb(); | ||
| 372 | if (is_rx_desc(raw_desc)) | 374 | if (is_rx_desc(raw_desc)) |
| 373 | ret = xgene_enet_rx_frame(ring, raw_desc); | 375 | ret = xgene_enet_rx_frame(ring, raw_desc); |
| 374 | else | 376 | else |
diff --git a/drivers/net/ethernet/atheros/alx/main.c b/drivers/net/ethernet/atheros/alx/main.c index e398eda07298..c8af3ce3ea38 100644 --- a/drivers/net/ethernet/atheros/alx/main.c +++ b/drivers/net/ethernet/atheros/alx/main.c | |||
| @@ -184,15 +184,16 @@ static void alx_schedule_reset(struct alx_priv *alx) | |||
| 184 | schedule_work(&alx->reset_wk); | 184 | schedule_work(&alx->reset_wk); |
| 185 | } | 185 | } |
| 186 | 186 | ||
| 187 | static bool alx_clean_rx_irq(struct alx_priv *alx, int budget) | 187 | static int alx_clean_rx_irq(struct alx_priv *alx, int budget) |
| 188 | { | 188 | { |
| 189 | struct alx_rx_queue *rxq = &alx->rxq; | 189 | struct alx_rx_queue *rxq = &alx->rxq; |
| 190 | struct alx_rrd *rrd; | 190 | struct alx_rrd *rrd; |
| 191 | struct alx_buffer *rxb; | 191 | struct alx_buffer *rxb; |
| 192 | struct sk_buff *skb; | 192 | struct sk_buff *skb; |
| 193 | u16 length, rfd_cleaned = 0; | 193 | u16 length, rfd_cleaned = 0; |
| 194 | int work = 0; | ||
| 194 | 195 | ||
| 195 | while (budget > 0) { | 196 | while (work < budget) { |
| 196 | rrd = &rxq->rrd[rxq->rrd_read_idx]; | 197 | rrd = &rxq->rrd[rxq->rrd_read_idx]; |
| 197 | if (!(rrd->word3 & cpu_to_le32(1 << RRD_UPDATED_SHIFT))) | 198 | if (!(rrd->word3 & cpu_to_le32(1 << RRD_UPDATED_SHIFT))) |
| 198 | break; | 199 | break; |
| @@ -203,7 +204,7 @@ static bool alx_clean_rx_irq(struct alx_priv *alx, int budget) | |||
| 203 | ALX_GET_FIELD(le32_to_cpu(rrd->word0), | 204 | ALX_GET_FIELD(le32_to_cpu(rrd->word0), |
| 204 | RRD_NOR) != 1) { | 205 | RRD_NOR) != 1) { |
| 205 | alx_schedule_reset(alx); | 206 | alx_schedule_reset(alx); |
| 206 | return 0; | 207 | return work; |
| 207 | } | 208 | } |
| 208 | 209 | ||
| 209 | rxb = &rxq->bufs[rxq->read_idx]; | 210 | rxb = &rxq->bufs[rxq->read_idx]; |
| @@ -243,7 +244,7 @@ static bool alx_clean_rx_irq(struct alx_priv *alx, int budget) | |||
| 243 | } | 244 | } |
| 244 | 245 | ||
| 245 | napi_gro_receive(&alx->napi, skb); | 246 | napi_gro_receive(&alx->napi, skb); |
| 246 | budget--; | 247 | work++; |
| 247 | 248 | ||
| 248 | next_pkt: | 249 | next_pkt: |
| 249 | if (++rxq->read_idx == alx->rx_ringsz) | 250 | if (++rxq->read_idx == alx->rx_ringsz) |
| @@ -258,21 +259,22 @@ next_pkt: | |||
| 258 | if (rfd_cleaned) | 259 | if (rfd_cleaned) |
| 259 | alx_refill_rx_ring(alx, GFP_ATOMIC); | 260 | alx_refill_rx_ring(alx, GFP_ATOMIC); |
| 260 | 261 | ||
| 261 | return budget > 0; | 262 | return work; |
| 262 | } | 263 | } |
| 263 | 264 | ||
| 264 | static int alx_poll(struct napi_struct *napi, int budget) | 265 | static int alx_poll(struct napi_struct *napi, int budget) |
| 265 | { | 266 | { |
| 266 | struct alx_priv *alx = container_of(napi, struct alx_priv, napi); | 267 | struct alx_priv *alx = container_of(napi, struct alx_priv, napi); |
| 267 | struct alx_hw *hw = &alx->hw; | 268 | struct alx_hw *hw = &alx->hw; |
| 268 | bool complete = true; | ||
| 269 | unsigned long flags; | 269 | unsigned long flags; |
| 270 | bool tx_complete; | ||
| 271 | int work; | ||
| 270 | 272 | ||
| 271 | complete = alx_clean_tx_irq(alx) && | 273 | tx_complete = alx_clean_tx_irq(alx); |
| 272 | alx_clean_rx_irq(alx, budget); | 274 | work = alx_clean_rx_irq(alx, budget); |
| 273 | 275 | ||
| 274 | if (!complete) | 276 | if (!tx_complete || work == budget) |
| 275 | return 1; | 277 | return budget; |
| 276 | 278 | ||
| 277 | napi_complete(&alx->napi); | 279 | napi_complete(&alx->napi); |
| 278 | 280 | ||
| @@ -284,7 +286,7 @@ static int alx_poll(struct napi_struct *napi, int budget) | |||
| 284 | 286 | ||
| 285 | alx_post_write(hw); | 287 | alx_post_write(hw); |
| 286 | 288 | ||
| 287 | return 0; | 289 | return work; |
| 288 | } | 290 | } |
| 289 | 291 | ||
| 290 | static irqreturn_t alx_intr_handle(struct alx_priv *alx, u32 intr) | 292 | static irqreturn_t alx_intr_handle(struct alx_priv *alx, u32 intr) |
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 1d1147c93d59..e468ed3f210f 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/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c index 553dcd8a9df2..96bf01ba32dd 100644 --- a/drivers/net/ethernet/broadcom/tg3.c +++ b/drivers/net/ethernet/broadcom/tg3.c | |||
| @@ -7413,6 +7413,8 @@ static inline void tg3_netif_start(struct tg3 *tp) | |||
| 7413 | } | 7413 | } |
| 7414 | 7414 | ||
| 7415 | static void tg3_irq_quiesce(struct tg3 *tp) | 7415 | static void tg3_irq_quiesce(struct tg3 *tp) |
| 7416 | __releases(tp->lock) | ||
| 7417 | __acquires(tp->lock) | ||
| 7416 | { | 7418 | { |
| 7417 | int i; | 7419 | int i; |
| 7418 | 7420 | ||
| @@ -7421,8 +7423,12 @@ static void tg3_irq_quiesce(struct tg3 *tp) | |||
| 7421 | tp->irq_sync = 1; | 7423 | tp->irq_sync = 1; |
| 7422 | smp_mb(); | 7424 | smp_mb(); |
| 7423 | 7425 | ||
| 7426 | spin_unlock_bh(&tp->lock); | ||
| 7427 | |||
| 7424 | for (i = 0; i < tp->irq_cnt; i++) | 7428 | for (i = 0; i < tp->irq_cnt; i++) |
| 7425 | synchronize_irq(tp->napi[i].irq_vec); | 7429 | synchronize_irq(tp->napi[i].irq_vec); |
| 7430 | |||
| 7431 | spin_lock_bh(&tp->lock); | ||
| 7426 | } | 7432 | } |
| 7427 | 7433 | ||
| 7428 | /* Fully shutdown all tg3 driver activity elsewhere in the system. | 7434 | /* Fully shutdown all tg3 driver activity elsewhere in the system. |
| @@ -9018,6 +9024,8 @@ static void tg3_restore_clk(struct tg3 *tp) | |||
| 9018 | 9024 | ||
| 9019 | /* tp->lock is held. */ | 9025 | /* tp->lock is held. */ |
| 9020 | static int tg3_chip_reset(struct tg3 *tp) | 9026 | static int tg3_chip_reset(struct tg3 *tp) |
| 9027 | __releases(tp->lock) | ||
| 9028 | __acquires(tp->lock) | ||
| 9021 | { | 9029 | { |
| 9022 | u32 val; | 9030 | u32 val; |
| 9023 | void (*write_op)(struct tg3 *, u32, u32); | 9031 | void (*write_op)(struct tg3 *, u32, u32); |
| @@ -9073,9 +9081,13 @@ static int tg3_chip_reset(struct tg3 *tp) | |||
| 9073 | } | 9081 | } |
| 9074 | smp_mb(); | 9082 | smp_mb(); |
| 9075 | 9083 | ||
| 9084 | tg3_full_unlock(tp); | ||
| 9085 | |||
| 9076 | for (i = 0; i < tp->irq_cnt; i++) | 9086 | for (i = 0; i < tp->irq_cnt; i++) |
| 9077 | synchronize_irq(tp->napi[i].irq_vec); | 9087 | synchronize_irq(tp->napi[i].irq_vec); |
| 9078 | 9088 | ||
| 9089 | tg3_full_lock(tp, 0); | ||
| 9090 | |||
| 9079 | if (tg3_asic_rev(tp) == ASIC_REV_57780) { | 9091 | if (tg3_asic_rev(tp) == ASIC_REV_57780) { |
| 9080 | val = tr32(TG3_PCIE_LNKCTL) & ~TG3_PCIE_LNKCTL_L1_PLL_PD_EN; | 9092 | val = tr32(TG3_PCIE_LNKCTL) & ~TG3_PCIE_LNKCTL_L1_PLL_PD_EN; |
| 9081 | tw32(TG3_PCIE_LNKCTL, val | TG3_PCIE_LNKCTL_L1_PLL_PD_DIS); | 9093 | tw32(TG3_PCIE_LNKCTL, val | TG3_PCIE_LNKCTL_L1_PLL_PD_DIS); |
| @@ -10903,11 +10915,13 @@ static void tg3_timer(unsigned long __opaque) | |||
| 10903 | { | 10915 | { |
| 10904 | struct tg3 *tp = (struct tg3 *) __opaque; | 10916 | struct tg3 *tp = (struct tg3 *) __opaque; |
| 10905 | 10917 | ||
| 10906 | if (tp->irq_sync || tg3_flag(tp, RESET_TASK_PENDING)) | ||
| 10907 | goto restart_timer; | ||
| 10908 | |||
| 10909 | spin_lock(&tp->lock); | 10918 | spin_lock(&tp->lock); |
| 10910 | 10919 | ||
| 10920 | if (tp->irq_sync || tg3_flag(tp, RESET_TASK_PENDING)) { | ||
| 10921 | spin_unlock(&tp->lock); | ||
| 10922 | goto restart_timer; | ||
| 10923 | } | ||
| 10924 | |||
| 10911 | if (tg3_asic_rev(tp) == ASIC_REV_5717 || | 10925 | if (tg3_asic_rev(tp) == ASIC_REV_5717 || |
| 10912 | tg3_flag(tp, 57765_CLASS)) | 10926 | tg3_flag(tp, 57765_CLASS)) |
| 10913 | tg3_chk_missed_msi(tp); | 10927 | tg3_chk_missed_msi(tp); |
| @@ -11101,11 +11115,13 @@ static void tg3_reset_task(struct work_struct *work) | |||
| 11101 | struct tg3 *tp = container_of(work, struct tg3, reset_task); | 11115 | struct tg3 *tp = container_of(work, struct tg3, reset_task); |
| 11102 | int err; | 11116 | int err; |
| 11103 | 11117 | ||
| 11118 | rtnl_lock(); | ||
| 11104 | tg3_full_lock(tp, 0); | 11119 | tg3_full_lock(tp, 0); |
| 11105 | 11120 | ||
| 11106 | if (!netif_running(tp->dev)) { | 11121 | if (!netif_running(tp->dev)) { |
| 11107 | tg3_flag_clear(tp, RESET_TASK_PENDING); | 11122 | tg3_flag_clear(tp, RESET_TASK_PENDING); |
| 11108 | tg3_full_unlock(tp); | 11123 | tg3_full_unlock(tp); |
| 11124 | rtnl_unlock(); | ||
| 11109 | return; | 11125 | return; |
| 11110 | } | 11126 | } |
| 11111 | 11127 | ||
| @@ -11138,6 +11154,7 @@ out: | |||
| 11138 | tg3_phy_start(tp); | 11154 | tg3_phy_start(tp); |
| 11139 | 11155 | ||
| 11140 | tg3_flag_clear(tp, RESET_TASK_PENDING); | 11156 | tg3_flag_clear(tp, RESET_TASK_PENDING); |
| 11157 | rtnl_unlock(); | ||
| 11141 | } | 11158 | } |
| 11142 | 11159 | ||
| 11143 | static int tg3_request_irq(struct tg3 *tp, int irq_num) | 11160 | static int tg3_request_irq(struct tg3 *tp, int irq_num) |
diff --git a/drivers/net/ethernet/cadence/at91_ether.c b/drivers/net/ethernet/cadence/at91_ether.c index 55eb7f2af2b4..7ef55f5fa664 100644 --- a/drivers/net/ethernet/cadence/at91_ether.c +++ b/drivers/net/ethernet/cadence/at91_ether.c | |||
| @@ -340,7 +340,7 @@ static int __init at91ether_probe(struct platform_device *pdev) | |||
| 340 | res = PTR_ERR(lp->pclk); | 340 | res = PTR_ERR(lp->pclk); |
| 341 | goto err_free_dev; | 341 | goto err_free_dev; |
| 342 | } | 342 | } |
| 343 | clk_enable(lp->pclk); | 343 | clk_prepare_enable(lp->pclk); |
| 344 | 344 | ||
| 345 | lp->hclk = ERR_PTR(-ENOENT); | 345 | lp->hclk = ERR_PTR(-ENOENT); |
| 346 | lp->tx_clk = ERR_PTR(-ENOENT); | 346 | lp->tx_clk = ERR_PTR(-ENOENT); |
| @@ -406,7 +406,7 @@ static int __init at91ether_probe(struct platform_device *pdev) | |||
| 406 | err_out_unregister_netdev: | 406 | err_out_unregister_netdev: |
| 407 | unregister_netdev(dev); | 407 | unregister_netdev(dev); |
| 408 | err_disable_clock: | 408 | err_disable_clock: |
| 409 | clk_disable(lp->pclk); | 409 | clk_disable_unprepare(lp->pclk); |
| 410 | err_free_dev: | 410 | err_free_dev: |
| 411 | free_netdev(dev); | 411 | free_netdev(dev); |
| 412 | return res; | 412 | return res; |
| @@ -424,7 +424,7 @@ static int at91ether_remove(struct platform_device *pdev) | |||
| 424 | kfree(lp->mii_bus->irq); | 424 | kfree(lp->mii_bus->irq); |
| 425 | mdiobus_free(lp->mii_bus); | 425 | mdiobus_free(lp->mii_bus); |
| 426 | unregister_netdev(dev); | 426 | unregister_netdev(dev); |
| 427 | clk_disable(lp->pclk); | 427 | clk_disable_unprepare(lp->pclk); |
| 428 | free_netdev(dev); | 428 | free_netdev(dev); |
| 429 | 429 | ||
| 430 | return 0; | 430 | return 0; |
| @@ -440,7 +440,7 @@ static int at91ether_suspend(struct platform_device *pdev, pm_message_t mesg) | |||
| 440 | netif_stop_queue(net_dev); | 440 | netif_stop_queue(net_dev); |
| 441 | netif_device_detach(net_dev); | 441 | netif_device_detach(net_dev); |
| 442 | 442 | ||
| 443 | clk_disable(lp->pclk); | 443 | clk_disable_unprepare(lp->pclk); |
| 444 | } | 444 | } |
| 445 | return 0; | 445 | return 0; |
| 446 | } | 446 | } |
| @@ -451,7 +451,7 @@ static int at91ether_resume(struct platform_device *pdev) | |||
| 451 | struct macb *lp = netdev_priv(net_dev); | 451 | struct macb *lp = netdev_priv(net_dev); |
| 452 | 452 | ||
| 453 | if (netif_running(net_dev)) { | 453 | if (netif_running(net_dev)) { |
| 454 | clk_enable(lp->pclk); | 454 | clk_prepare_enable(lp->pclk); |
| 455 | 455 | ||
| 456 | netif_device_attach(net_dev); | 456 | netif_device_attach(net_dev); |
| 457 | netif_start_queue(net_dev); | 457 | netif_start_queue(net_dev); |
diff --git a/drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c b/drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c index 2215d432a059..a936ee8958c7 100644 --- a/drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c +++ b/drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c | |||
| @@ -2430,7 +2430,7 @@ static void cfg_queues(struct adapter *adapter) | |||
| 2430 | */ | 2430 | */ |
| 2431 | n10g = 0; | 2431 | n10g = 0; |
| 2432 | for_each_port(adapter, pidx) | 2432 | for_each_port(adapter, pidx) |
| 2433 | n10g += is_10g_port(&adap2pinfo(adapter, pidx)->link_cfg); | 2433 | n10g += is_x_10g_port(&adap2pinfo(adapter, pidx)->link_cfg); |
| 2434 | 2434 | ||
| 2435 | /* | 2435 | /* |
| 2436 | * We default to 1 queue per non-10G port and up to # of cores queues | 2436 | * We default to 1 queue per non-10G port and up to # of cores queues |
diff --git a/drivers/net/ethernet/chelsio/cxgb4vf/t4vf_hw.c b/drivers/net/ethernet/chelsio/cxgb4vf/t4vf_hw.c index 21dc9a20308c..60426cf890a7 100644 --- a/drivers/net/ethernet/chelsio/cxgb4vf/t4vf_hw.c +++ b/drivers/net/ethernet/chelsio/cxgb4vf/t4vf_hw.c | |||
| @@ -323,6 +323,8 @@ int t4vf_port_init(struct adapter *adapter, int pidx) | |||
| 323 | return v; | 323 | return v; |
| 324 | 324 | ||
| 325 | v = be32_to_cpu(port_rpl.u.info.lstatus_to_modtype); | 325 | v = be32_to_cpu(port_rpl.u.info.lstatus_to_modtype); |
| 326 | pi->mdio_addr = (v & FW_PORT_CMD_MDIOCAP_F) ? | ||
| 327 | FW_PORT_CMD_MDIOADDR_G(v) : -1; | ||
| 326 | pi->port_type = FW_PORT_CMD_PTYPE_G(v); | 328 | pi->port_type = FW_PORT_CMD_PTYPE_G(v); |
| 327 | pi->mod_type = FW_PORT_MOD_TYPE_NA; | 329 | pi->mod_type = FW_PORT_MOD_TYPE_NA; |
| 328 | 330 | ||
diff --git a/drivers/net/ethernet/cirrus/Kconfig b/drivers/net/ethernet/cirrus/Kconfig index 7403dff8f14a..905ac5f5d9a6 100644 --- a/drivers/net/ethernet/cirrus/Kconfig +++ b/drivers/net/ethernet/cirrus/Kconfig | |||
| @@ -32,7 +32,8 @@ config CS89x0 | |||
| 32 | will be called cs89x0. | 32 | will be called cs89x0. |
| 33 | 33 | ||
| 34 | config CS89x0_PLATFORM | 34 | config CS89x0_PLATFORM |
| 35 | bool "CS89x0 platform driver support" | 35 | bool "CS89x0 platform driver support" if HAS_IOPORT_MAP |
| 36 | default !HAS_IOPORT_MAP | ||
| 36 | depends on CS89x0 | 37 | depends on CS89x0 |
| 37 | help | 38 | help |
| 38 | Say Y to compile the cs89x0 driver as a platform driver. This | 39 | Say Y to compile the cs89x0 driver as a platform driver. This |
diff --git a/drivers/net/ethernet/cisco/enic/enic_main.c b/drivers/net/ethernet/cisco/enic/enic_main.c index 705f334ebb85..e356afa44e7d 100644 --- a/drivers/net/ethernet/cisco/enic/enic_main.c +++ b/drivers/net/ethernet/cisco/enic/enic_main.c | |||
| @@ -1335,7 +1335,7 @@ static int enic_poll_msix_rq(struct napi_struct *napi, int budget) | |||
| 1335 | int err; | 1335 | int err; |
| 1336 | 1336 | ||
| 1337 | if (!enic_poll_lock_napi(&enic->rq[rq])) | 1337 | if (!enic_poll_lock_napi(&enic->rq[rq])) |
| 1338 | return work_done; | 1338 | return budget; |
| 1339 | /* Service RQ | 1339 | /* Service RQ |
| 1340 | */ | 1340 | */ |
| 1341 | 1341 | ||
| @@ -1616,7 +1616,7 @@ static int enic_open(struct net_device *netdev) | |||
| 1616 | if (vnic_rq_desc_used(&enic->rq[i]) == 0) { | 1616 | if (vnic_rq_desc_used(&enic->rq[i]) == 0) { |
| 1617 | netdev_err(netdev, "Unable to alloc receive buffers\n"); | 1617 | netdev_err(netdev, "Unable to alloc receive buffers\n"); |
| 1618 | err = -ENOMEM; | 1618 | err = -ENOMEM; |
| 1619 | goto err_out_notify_unset; | 1619 | goto err_out_free_rq; |
| 1620 | } | 1620 | } |
| 1621 | } | 1621 | } |
| 1622 | 1622 | ||
| @@ -1649,7 +1649,9 @@ static int enic_open(struct net_device *netdev) | |||
| 1649 | 1649 | ||
| 1650 | return 0; | 1650 | return 0; |
| 1651 | 1651 | ||
| 1652 | err_out_notify_unset: | 1652 | err_out_free_rq: |
| 1653 | for (i = 0; i < enic->rq_count; i++) | ||
| 1654 | vnic_rq_clean(&enic->rq[i], enic_free_rq_buf); | ||
| 1653 | enic_dev_notify_unset(enic); | 1655 | enic_dev_notify_unset(enic); |
| 1654 | err_out_free_intr: | 1656 | err_out_free_intr: |
| 1655 | enic_free_intr(enic); | 1657 | enic_free_intr(enic); |
diff --git a/drivers/net/ethernet/dnet.c b/drivers/net/ethernet/dnet.c index a379c3e4b57f..13d00a38a5bd 100644 --- a/drivers/net/ethernet/dnet.c +++ b/drivers/net/ethernet/dnet.c | |||
| @@ -398,13 +398,8 @@ static int dnet_poll(struct napi_struct *napi, int budget) | |||
| 398 | * break out of while loop if there are no more | 398 | * break out of while loop if there are no more |
| 399 | * packets waiting | 399 | * packets waiting |
| 400 | */ | 400 | */ |
| 401 | if (!(dnet_readl(bp, RX_FIFO_WCNT) >> 16)) { | 401 | if (!(dnet_readl(bp, RX_FIFO_WCNT) >> 16)) |
| 402 | napi_complete(napi); | 402 | break; |
| 403 | int_enable = dnet_readl(bp, INTR_ENB); | ||
| 404 | int_enable |= DNET_INTR_SRC_RX_CMDFIFOAF; | ||
| 405 | dnet_writel(bp, int_enable, INTR_ENB); | ||
| 406 | return 0; | ||
| 407 | } | ||
| 408 | 403 | ||
| 409 | cmd_word = dnet_readl(bp, RX_LEN_FIFO); | 404 | cmd_word = dnet_readl(bp, RX_LEN_FIFO); |
| 410 | pkt_len = cmd_word & 0xFFFF; | 405 | pkt_len = cmd_word & 0xFFFF; |
| @@ -433,20 +428,17 @@ static int dnet_poll(struct napi_struct *napi, int budget) | |||
| 433 | "size %u.\n", dev->name, pkt_len); | 428 | "size %u.\n", dev->name, pkt_len); |
| 434 | } | 429 | } |
| 435 | 430 | ||
| 436 | budget -= npackets; | ||
| 437 | |||
| 438 | if (npackets < budget) { | 431 | if (npackets < budget) { |
| 439 | /* We processed all packets available. Tell NAPI it can | 432 | /* We processed all packets available. Tell NAPI it can |
| 440 | * stop polling then re-enable rx interrupts */ | 433 | * stop polling then re-enable rx interrupts. |
| 434 | */ | ||
| 441 | napi_complete(napi); | 435 | napi_complete(napi); |
| 442 | int_enable = dnet_readl(bp, INTR_ENB); | 436 | int_enable = dnet_readl(bp, INTR_ENB); |
| 443 | int_enable |= DNET_INTR_SRC_RX_CMDFIFOAF; | 437 | int_enable |= DNET_INTR_SRC_RX_CMDFIFOAF; |
| 444 | dnet_writel(bp, int_enable, INTR_ENB); | 438 | dnet_writel(bp, int_enable, INTR_ENB); |
| 445 | return 0; | ||
| 446 | } | 439 | } |
| 447 | 440 | ||
| 448 | /* There are still packets waiting */ | 441 | return npackets; |
| 449 | return 1; | ||
| 450 | } | 442 | } |
| 451 | 443 | ||
| 452 | static irqreturn_t dnet_interrupt(int irq, void *dev_id) | 444 | static irqreturn_t dnet_interrupt(int irq, void *dev_id) |
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index 41a0a5498da7..d48806b5cd88 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c | |||
| @@ -4383,8 +4383,9 @@ static int be_ndo_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq, | |||
| 4383 | * distinguish various types of transports (VxLAN, GRE, NVGRE ..). So, offload | 4383 | * distinguish various types of transports (VxLAN, GRE, NVGRE ..). So, offload |
| 4384 | * is expected to work across all types of IP tunnels once exported. Skyhawk | 4384 | * is expected to work across all types of IP tunnels once exported. Skyhawk |
| 4385 | * supports offloads for either VxLAN or NVGRE, exclusively. So we export VxLAN | 4385 | * supports offloads for either VxLAN or NVGRE, exclusively. So we export VxLAN |
| 4386 | * offloads in hw_enc_features only when a VxLAN port is added. Note this only | 4386 | * offloads in hw_enc_features only when a VxLAN port is added. If other (non |
| 4387 | * ensures that other tunnels work fine while VxLAN offloads are not enabled. | 4387 | * VxLAN) tunnels are configured while VxLAN offloads are enabled, offloads for |
| 4388 | * those other tunnels are unexported on the fly through ndo_features_check(). | ||
| 4388 | * | 4389 | * |
| 4389 | * Skyhawk supports VxLAN offloads only for one UDP dport. So, if the stack | 4390 | * Skyhawk supports VxLAN offloads only for one UDP dport. So, if the stack |
| 4390 | * adds more than one port, disable offloads and don't re-enable them again | 4391 | * adds more than one port, disable offloads and don't re-enable them again |
| @@ -4463,7 +4464,41 @@ static netdev_features_t be_features_check(struct sk_buff *skb, | |||
| 4463 | struct net_device *dev, | 4464 | struct net_device *dev, |
| 4464 | netdev_features_t features) | 4465 | netdev_features_t features) |
| 4465 | { | 4466 | { |
| 4466 | return vxlan_features_check(skb, features); | 4467 | struct be_adapter *adapter = netdev_priv(dev); |
| 4468 | u8 l4_hdr = 0; | ||
| 4469 | |||
| 4470 | /* The code below restricts offload features for some tunneled packets. | ||
| 4471 | * Offload features for normal (non tunnel) packets are unchanged. | ||
| 4472 | */ | ||
| 4473 | if (!skb->encapsulation || | ||
| 4474 | !(adapter->flags & BE_FLAGS_VXLAN_OFFLOADS)) | ||
| 4475 | return features; | ||
| 4476 | |||
| 4477 | /* It's an encapsulated packet and VxLAN offloads are enabled. We | ||
| 4478 | * should disable tunnel offload features if it's not a VxLAN packet, | ||
| 4479 | * as tunnel offloads have been enabled only for VxLAN. This is done to | ||
| 4480 | * allow other tunneled traffic like GRE work fine while VxLAN | ||
| 4481 | * offloads are configured in Skyhawk-R. | ||
| 4482 | */ | ||
| 4483 | switch (vlan_get_protocol(skb)) { | ||
| 4484 | case htons(ETH_P_IP): | ||
| 4485 | l4_hdr = ip_hdr(skb)->protocol; | ||
| 4486 | break; | ||
| 4487 | case htons(ETH_P_IPV6): | ||
| 4488 | l4_hdr = ipv6_hdr(skb)->nexthdr; | ||
| 4489 | break; | ||
| 4490 | default: | ||
| 4491 | return features; | ||
| 4492 | } | ||
| 4493 | |||
| 4494 | if (l4_hdr != IPPROTO_UDP || | ||
| 4495 | skb->inner_protocol_type != ENCAP_TYPE_ETHER || | ||
| 4496 | skb->inner_protocol != htons(ETH_P_TEB) || | ||
| 4497 | skb_inner_mac_header(skb) - skb_transport_header(skb) != | ||
| 4498 | sizeof(struct udphdr) + sizeof(struct vxlanhdr)) | ||
| 4499 | return features & ~(NETIF_F_ALL_CSUM | NETIF_F_GSO_MASK); | ||
| 4500 | |||
| 4501 | return features; | ||
| 4467 | } | 4502 | } |
| 4468 | #endif | 4503 | #endif |
| 4469 | 4504 | ||
diff --git a/drivers/net/ethernet/freescale/fec.h b/drivers/net/ethernet/freescale/fec.h index 469691ad4a1e..40132929daf7 100644 --- a/drivers/net/ethernet/freescale/fec.h +++ b/drivers/net/ethernet/freescale/fec.h | |||
| @@ -424,6 +424,8 @@ struct bufdesc_ex { | |||
| 424 | * (40ns * 6). | 424 | * (40ns * 6). |
| 425 | */ | 425 | */ |
| 426 | #define FEC_QUIRK_BUG_CAPTURE (1 << 10) | 426 | #define FEC_QUIRK_BUG_CAPTURE (1 << 10) |
| 427 | /* Controller has only one MDIO bus */ | ||
| 428 | #define FEC_QUIRK_SINGLE_MDIO (1 << 11) | ||
| 427 | 429 | ||
| 428 | struct fec_enet_priv_tx_q { | 430 | struct fec_enet_priv_tx_q { |
| 429 | int index; | 431 | int index; |
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index 5ebdf8dc8a31..bba87775419d 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c | |||
| @@ -91,7 +91,8 @@ static struct platform_device_id fec_devtype[] = { | |||
| 91 | .driver_data = 0, | 91 | .driver_data = 0, |
| 92 | }, { | 92 | }, { |
| 93 | .name = "imx28-fec", | 93 | .name = "imx28-fec", |
| 94 | .driver_data = FEC_QUIRK_ENET_MAC | FEC_QUIRK_SWAP_FRAME, | 94 | .driver_data = FEC_QUIRK_ENET_MAC | FEC_QUIRK_SWAP_FRAME | |
| 95 | FEC_QUIRK_SINGLE_MDIO, | ||
| 95 | }, { | 96 | }, { |
| 96 | .name = "imx6q-fec", | 97 | .name = "imx6q-fec", |
| 97 | .driver_data = FEC_QUIRK_ENET_MAC | FEC_QUIRK_HAS_GBIT | | 98 | .driver_data = FEC_QUIRK_ENET_MAC | FEC_QUIRK_HAS_GBIT | |
| @@ -1937,7 +1938,7 @@ static int fec_enet_mii_init(struct platform_device *pdev) | |||
| 1937 | int err = -ENXIO, i; | 1938 | int err = -ENXIO, i; |
| 1938 | 1939 | ||
| 1939 | /* | 1940 | /* |
| 1940 | * The dual fec interfaces are not equivalent with enet-mac. | 1941 | * The i.MX28 dual fec interfaces are not equal. |
| 1941 | * Here are the differences: | 1942 | * Here are the differences: |
| 1942 | * | 1943 | * |
| 1943 | * - fec0 supports MII & RMII modes while fec1 only supports RMII | 1944 | * - fec0 supports MII & RMII modes while fec1 only supports RMII |
| @@ -1952,7 +1953,7 @@ static int fec_enet_mii_init(struct platform_device *pdev) | |||
| 1952 | * mdio interface in board design, and need to be configured by | 1953 | * mdio interface in board design, and need to be configured by |
| 1953 | * fec0 mii_bus. | 1954 | * fec0 mii_bus. |
| 1954 | */ | 1955 | */ |
| 1955 | if ((fep->quirks & FEC_QUIRK_ENET_MAC) && fep->dev_id > 0) { | 1956 | if ((fep->quirks & FEC_QUIRK_SINGLE_MDIO) && fep->dev_id > 0) { |
| 1956 | /* fec1 uses fec0 mii_bus */ | 1957 | /* fec1 uses fec0 mii_bus */ |
| 1957 | if (mii_cnt && fec0_mii_bus) { | 1958 | if (mii_cnt && fec0_mii_bus) { |
| 1958 | fep->mii_bus = fec0_mii_bus; | 1959 | fep->mii_bus = fec0_mii_bus; |
| @@ -2015,7 +2016,7 @@ static int fec_enet_mii_init(struct platform_device *pdev) | |||
| 2015 | mii_cnt++; | 2016 | mii_cnt++; |
| 2016 | 2017 | ||
| 2017 | /* save fec0 mii_bus */ | 2018 | /* save fec0 mii_bus */ |
| 2018 | if (fep->quirks & FEC_QUIRK_ENET_MAC) | 2019 | if (fep->quirks & FEC_QUIRK_SINGLE_MDIO) |
| 2019 | fec0_mii_bus = fep->mii_bus; | 2020 | fec0_mii_bus = fep->mii_bus; |
| 2020 | 2021 | ||
| 2021 | return 0; | 2022 | return 0; |
| @@ -3129,6 +3130,7 @@ fec_probe(struct platform_device *pdev) | |||
| 3129 | pdev->id_entry = of_id->data; | 3130 | pdev->id_entry = of_id->data; |
| 3130 | fep->quirks = pdev->id_entry->driver_data; | 3131 | fep->quirks = pdev->id_entry->driver_data; |
| 3131 | 3132 | ||
| 3133 | fep->netdev = ndev; | ||
| 3132 | fep->num_rx_queues = num_rx_qs; | 3134 | fep->num_rx_queues = num_rx_qs; |
| 3133 | fep->num_tx_queues = num_tx_qs; | 3135 | fep->num_tx_queues = num_tx_qs; |
| 3134 | 3136 | ||
diff --git a/drivers/net/ethernet/freescale/gianfar_ethtool.c b/drivers/net/ethernet/freescale/gianfar_ethtool.c index 3e1a9c1a67a9..fda12fb32ec7 100644 --- a/drivers/net/ethernet/freescale/gianfar_ethtool.c +++ b/drivers/net/ethernet/freescale/gianfar_ethtool.c | |||
| @@ -1586,7 +1586,7 @@ static int gfar_write_filer_table(struct gfar_private *priv, | |||
| 1586 | return -EBUSY; | 1586 | return -EBUSY; |
| 1587 | 1587 | ||
| 1588 | /* Fill regular entries */ | 1588 | /* Fill regular entries */ |
| 1589 | for (; i < MAX_FILER_IDX - 1 && (tab->fe[i].ctrl | tab->fe[i].ctrl); | 1589 | for (; i < MAX_FILER_IDX - 1 && (tab->fe[i].ctrl | tab->fe[i].prop); |
| 1590 | i++) | 1590 | i++) |
| 1591 | gfar_write_filer(priv, i, tab->fe[i].ctrl, tab->fe[i].prop); | 1591 | gfar_write_filer(priv, i, tab->fe[i].ctrl, tab->fe[i].prop); |
| 1592 | /* Fill the rest with fall-troughs */ | 1592 | /* Fill the rest with fall-troughs */ |
diff --git a/drivers/net/ethernet/intel/Kconfig b/drivers/net/ethernet/intel/Kconfig index 5b8300a32bf5..4d61ef50b465 100644 --- a/drivers/net/ethernet/intel/Kconfig +++ b/drivers/net/ethernet/intel/Kconfig | |||
| @@ -281,6 +281,17 @@ config I40E_DCB | |||
| 281 | 281 | ||
| 282 | If unsure, say N. | 282 | If unsure, say N. |
| 283 | 283 | ||
| 284 | config I40E_FCOE | ||
| 285 | bool "Fibre Channel over Ethernet (FCoE)" | ||
| 286 | default n | ||
| 287 | depends on I40E && DCB && FCOE | ||
| 288 | ---help--- | ||
| 289 | Say Y here if you want to use Fibre Channel over Ethernet (FCoE) | ||
| 290 | in the driver. This will create new netdev for exclusive FCoE | ||
| 291 | use with XL710 FCoE offloads enabled. | ||
| 292 | |||
| 293 | If unsure, say N. | ||
| 294 | |||
| 284 | config I40EVF | 295 | config I40EVF |
| 285 | tristate "Intel(R) XL710 X710 Virtual Function Ethernet support" | 296 | tristate "Intel(R) XL710 X710 Virtual Function Ethernet support" |
| 286 | depends on PCI_MSI | 297 | depends on PCI_MSI |
diff --git a/drivers/net/ethernet/intel/e100.c b/drivers/net/ethernet/intel/e100.c index 781065eb5431..e9c3a87e5b11 100644 --- a/drivers/net/ethernet/intel/e100.c +++ b/drivers/net/ethernet/intel/e100.c | |||
| @@ -1543,7 +1543,7 @@ static int e100_phy_init(struct nic *nic) | |||
| 1543 | mdio_write(netdev, nic->mii.phy_id, MII_BMCR, bmcr); | 1543 | mdio_write(netdev, nic->mii.phy_id, MII_BMCR, bmcr); |
| 1544 | } else if ((nic->mac >= mac_82550_D102) || ((nic->flags & ich) && | 1544 | } else if ((nic->mac >= mac_82550_D102) || ((nic->flags & ich) && |
| 1545 | (mdio_read(netdev, nic->mii.phy_id, MII_TPISTATUS) & 0x8000) && | 1545 | (mdio_read(netdev, nic->mii.phy_id, MII_TPISTATUS) & 0x8000) && |
| 1546 | !(nic->eeprom[eeprom_cnfg_mdix] & eeprom_mdix_enabled))) { | 1546 | (nic->eeprom[eeprom_cnfg_mdix] & eeprom_mdix_enabled))) { |
| 1547 | /* enable/disable MDI/MDI-X auto-switching. */ | 1547 | /* enable/disable MDI/MDI-X auto-switching. */ |
| 1548 | mdio_write(netdev, nic->mii.phy_id, MII_NCONFIG, | 1548 | mdio_write(netdev, nic->mii.phy_id, MII_NCONFIG, |
| 1549 | nic->mii.force_media ? 0 : NCONFIG_AUTO_SWITCH); | 1549 | nic->mii.force_media ? 0 : NCONFIG_AUTO_SWITCH); |
diff --git a/drivers/net/ethernet/intel/i40e/Makefile b/drivers/net/ethernet/intel/i40e/Makefile index 4b94ddb29c24..c40581999121 100644 --- a/drivers/net/ethernet/intel/i40e/Makefile +++ b/drivers/net/ethernet/intel/i40e/Makefile | |||
| @@ -44,4 +44,4 @@ i40e-objs := i40e_main.o \ | |||
| 44 | i40e_virtchnl_pf.o | 44 | i40e_virtchnl_pf.o |
| 45 | 45 | ||
| 46 | i40e-$(CONFIG_I40E_DCB) += i40e_dcb.o i40e_dcb_nl.o | 46 | i40e-$(CONFIG_I40E_DCB) += i40e_dcb.o i40e_dcb_nl.o |
| 47 | i40e-$(CONFIG_FCOE:m=y) += i40e_fcoe.o | 47 | i40e-$(CONFIG_I40E_FCOE) += i40e_fcoe.o |
diff --git a/drivers/net/ethernet/intel/i40e/i40e_debugfs.c b/drivers/net/ethernet/intel/i40e/i40e_debugfs.c index 433a55886ad2..cb0de455683e 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_debugfs.c +++ b/drivers/net/ethernet/intel/i40e/i40e_debugfs.c | |||
| @@ -829,7 +829,7 @@ static void i40e_dbg_dump_desc(int cnt, int vsi_seid, int ring_id, int desc_n, | |||
| 829 | if (desc_n >= ring->count || desc_n < 0) { | 829 | if (desc_n >= ring->count || desc_n < 0) { |
| 830 | dev_info(&pf->pdev->dev, | 830 | dev_info(&pf->pdev->dev, |
| 831 | "descriptor %d not found\n", desc_n); | 831 | "descriptor %d not found\n", desc_n); |
| 832 | return; | 832 | goto out; |
| 833 | } | 833 | } |
| 834 | if (!is_rx_ring) { | 834 | if (!is_rx_ring) { |
| 835 | txd = I40E_TX_DESC(ring, desc_n); | 835 | txd = I40E_TX_DESC(ring, desc_n); |
| @@ -855,6 +855,8 @@ static void i40e_dbg_dump_desc(int cnt, int vsi_seid, int ring_id, int desc_n, | |||
| 855 | } else { | 855 | } else { |
| 856 | dev_info(&pf->pdev->dev, "dump desc rx/tx <vsi_seid> <ring_id> [<desc_n>]\n"); | 856 | dev_info(&pf->pdev->dev, "dump desc rx/tx <vsi_seid> <ring_id> [<desc_n>]\n"); |
| 857 | } | 857 | } |
| 858 | |||
| 859 | out: | ||
| 858 | kfree(ring); | 860 | kfree(ring); |
| 859 | } | 861 | } |
| 860 | 862 | ||
diff --git a/drivers/net/ethernet/intel/i40e/i40e_osdep.h b/drivers/net/ethernet/intel/i40e/i40e_osdep.h index 045b5c4b98b3..ad802dd0f67a 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_osdep.h +++ b/drivers/net/ethernet/intel/i40e/i40e_osdep.h | |||
| @@ -78,7 +78,7 @@ do { \ | |||
| 78 | } while (0) | 78 | } while (0) |
| 79 | 79 | ||
| 80 | typedef enum i40e_status_code i40e_status; | 80 | typedef enum i40e_status_code i40e_status; |
| 81 | #if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) | 81 | #ifdef CONFIG_I40E_FCOE |
| 82 | #define I40E_FCOE | 82 | #define I40E_FCOE |
| 83 | #endif /* CONFIG_FCOE or CONFIG_FCOE_MODULE */ | 83 | #endif |
| 84 | #endif /* _I40E_OSDEP_H_ */ | 84 | #endif /* _I40E_OSDEP_H_ */ |
diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c b/drivers/net/ethernet/intel/i40e/i40e_txrx.c index 04b441460bbd..cecb340898fe 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c +++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c | |||
| @@ -658,6 +658,8 @@ static inline u32 i40e_get_head(struct i40e_ring *tx_ring) | |||
| 658 | return le32_to_cpu(*(volatile __le32 *)head); | 658 | return le32_to_cpu(*(volatile __le32 *)head); |
| 659 | } | 659 | } |
| 660 | 660 | ||
| 661 | #define WB_STRIDE 0x3 | ||
| 662 | |||
| 661 | /** | 663 | /** |
| 662 | * i40e_clean_tx_irq - Reclaim resources after transmit completes | 664 | * i40e_clean_tx_irq - Reclaim resources after transmit completes |
| 663 | * @tx_ring: tx ring to clean | 665 | * @tx_ring: tx ring to clean |
| @@ -759,6 +761,18 @@ static bool i40e_clean_tx_irq(struct i40e_ring *tx_ring, int budget) | |||
| 759 | tx_ring->q_vector->tx.total_bytes += total_bytes; | 761 | tx_ring->q_vector->tx.total_bytes += total_bytes; |
| 760 | tx_ring->q_vector->tx.total_packets += total_packets; | 762 | tx_ring->q_vector->tx.total_packets += total_packets; |
| 761 | 763 | ||
| 764 | /* check to see if there are any non-cache aligned descriptors | ||
| 765 | * waiting to be written back, and kick the hardware to force | ||
| 766 | * them to be written back in case of napi polling | ||
| 767 | */ | ||
| 768 | if (budget && | ||
| 769 | !((i & WB_STRIDE) == WB_STRIDE) && | ||
| 770 | !test_bit(__I40E_DOWN, &tx_ring->vsi->state) && | ||
| 771 | (I40E_DESC_UNUSED(tx_ring) != tx_ring->count)) | ||
| 772 | tx_ring->arm_wb = true; | ||
| 773 | else | ||
| 774 | tx_ring->arm_wb = false; | ||
| 775 | |||
| 762 | if (check_for_tx_hang(tx_ring) && i40e_check_tx_hang(tx_ring)) { | 776 | if (check_for_tx_hang(tx_ring) && i40e_check_tx_hang(tx_ring)) { |
| 763 | /* schedule immediate reset if we believe we hung */ | 777 | /* schedule immediate reset if we believe we hung */ |
| 764 | dev_info(tx_ring->dev, "Detected Tx Unit Hang\n" | 778 | dev_info(tx_ring->dev, "Detected Tx Unit Hang\n" |
| @@ -777,13 +791,16 @@ static bool i40e_clean_tx_irq(struct i40e_ring *tx_ring, int budget) | |||
| 777 | netif_stop_subqueue(tx_ring->netdev, tx_ring->queue_index); | 791 | netif_stop_subqueue(tx_ring->netdev, tx_ring->queue_index); |
| 778 | 792 | ||
| 779 | dev_info(tx_ring->dev, | 793 | dev_info(tx_ring->dev, |
| 780 | "tx hang detected on queue %d, resetting adapter\n", | 794 | "tx hang detected on queue %d, reset requested\n", |
| 781 | tx_ring->queue_index); | 795 | tx_ring->queue_index); |
| 782 | 796 | ||
| 783 | tx_ring->netdev->netdev_ops->ndo_tx_timeout(tx_ring->netdev); | 797 | /* do not fire the reset immediately, wait for the stack to |
| 798 | * decide we are truly stuck, also prevents every queue from | ||
| 799 | * simultaneously requesting a reset | ||
| 800 | */ | ||
| 784 | 801 | ||
| 785 | /* the adapter is about to reset, no point in enabling stuff */ | 802 | /* the adapter is about to reset, no point in enabling polling */ |
| 786 | return true; | 803 | budget = 1; |
| 787 | } | 804 | } |
| 788 | 805 | ||
| 789 | netdev_tx_completed_queue(netdev_get_tx_queue(tx_ring->netdev, | 806 | netdev_tx_completed_queue(netdev_get_tx_queue(tx_ring->netdev, |
| @@ -806,7 +823,25 @@ static bool i40e_clean_tx_irq(struct i40e_ring *tx_ring, int budget) | |||
| 806 | } | 823 | } |
| 807 | } | 824 | } |
| 808 | 825 | ||
| 809 | return budget > 0; | 826 | return !!budget; |
| 827 | } | ||
| 828 | |||
| 829 | /** | ||
| 830 | * i40e_force_wb - Arm hardware to do a wb on noncache aligned descriptors | ||
| 831 | * @vsi: the VSI we care about | ||
| 832 | * @q_vector: the vector on which to force writeback | ||
| 833 | * | ||
| 834 | **/ | ||
| 835 | static void i40e_force_wb(struct i40e_vsi *vsi, struct i40e_q_vector *q_vector) | ||
| 836 | { | ||
| 837 | u32 val = I40E_PFINT_DYN_CTLN_INTENA_MASK | | ||
| 838 | I40E_PFINT_DYN_CTLN_SWINT_TRIG_MASK | | ||
| 839 | I40E_PFINT_DYN_CTLN_SW_ITR_INDX_ENA_MASK | ||
| 840 | /* allow 00 to be written to the index */; | ||
| 841 | |||
| 842 | wr32(&vsi->back->hw, | ||
| 843 | I40E_PFINT_DYN_CTLN(q_vector->v_idx + vsi->base_vector - 1), | ||
| 844 | val); | ||
| 810 | } | 845 | } |
| 811 | 846 | ||
| 812 | /** | 847 | /** |
| @@ -1290,9 +1325,7 @@ static inline void i40e_rx_checksum(struct i40e_vsi *vsi, | |||
| 1290 | * so the total length of IPv4 header is IHL*4 bytes | 1325 | * so the total length of IPv4 header is IHL*4 bytes |
| 1291 | * The UDP_0 bit *may* bet set if the *inner* header is UDP | 1326 | * The UDP_0 bit *may* bet set if the *inner* header is UDP |
| 1292 | */ | 1327 | */ |
| 1293 | if (ipv4_tunnel && | 1328 | if (ipv4_tunnel) { |
| 1294 | (decoded.inner_prot != I40E_RX_PTYPE_INNER_PROT_UDP) && | ||
| 1295 | !(rx_status & (1 << I40E_RX_DESC_STATUS_UDP_0_SHIFT))) { | ||
| 1296 | skb->transport_header = skb->mac_header + | 1329 | skb->transport_header = skb->mac_header + |
| 1297 | sizeof(struct ethhdr) + | 1330 | sizeof(struct ethhdr) + |
| 1298 | (ip_hdr(skb)->ihl * 4); | 1331 | (ip_hdr(skb)->ihl * 4); |
| @@ -1302,15 +1335,19 @@ static inline void i40e_rx_checksum(struct i40e_vsi *vsi, | |||
| 1302 | skb->protocol == htons(ETH_P_8021AD)) | 1335 | skb->protocol == htons(ETH_P_8021AD)) |
| 1303 | ? VLAN_HLEN : 0; | 1336 | ? VLAN_HLEN : 0; |
| 1304 | 1337 | ||
| 1305 | rx_udp_csum = udp_csum(skb); | 1338 | if ((ip_hdr(skb)->protocol == IPPROTO_UDP) && |
| 1306 | iph = ip_hdr(skb); | 1339 | (udp_hdr(skb)->check != 0)) { |
| 1307 | csum = csum_tcpudp_magic( | 1340 | rx_udp_csum = udp_csum(skb); |
| 1308 | iph->saddr, iph->daddr, | 1341 | iph = ip_hdr(skb); |
| 1309 | (skb->len - skb_transport_offset(skb)), | 1342 | csum = csum_tcpudp_magic( |
| 1310 | IPPROTO_UDP, rx_udp_csum); | 1343 | iph->saddr, iph->daddr, |
| 1344 | (skb->len - skb_transport_offset(skb)), | ||
| 1345 | IPPROTO_UDP, rx_udp_csum); | ||
| 1311 | 1346 | ||
| 1312 | if (udp_hdr(skb)->check != csum) | 1347 | if (udp_hdr(skb)->check != csum) |
| 1313 | goto checksum_fail; | 1348 | goto checksum_fail; |
| 1349 | |||
| 1350 | } /* else its GRE and so no outer UDP header */ | ||
| 1314 | } | 1351 | } |
| 1315 | 1352 | ||
| 1316 | skb->ip_summed = CHECKSUM_UNNECESSARY; | 1353 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
| @@ -1581,6 +1618,7 @@ int i40e_napi_poll(struct napi_struct *napi, int budget) | |||
| 1581 | struct i40e_vsi *vsi = q_vector->vsi; | 1618 | struct i40e_vsi *vsi = q_vector->vsi; |
| 1582 | struct i40e_ring *ring; | 1619 | struct i40e_ring *ring; |
| 1583 | bool clean_complete = true; | 1620 | bool clean_complete = true; |
| 1621 | bool arm_wb = false; | ||
| 1584 | int budget_per_ring; | 1622 | int budget_per_ring; |
| 1585 | 1623 | ||
| 1586 | if (test_bit(__I40E_DOWN, &vsi->state)) { | 1624 | if (test_bit(__I40E_DOWN, &vsi->state)) { |
| @@ -1591,8 +1629,10 @@ int i40e_napi_poll(struct napi_struct *napi, int budget) | |||
| 1591 | /* Since the actual Tx work is minimal, we can give the Tx a larger | 1629 | /* Since the actual Tx work is minimal, we can give the Tx a larger |
| 1592 | * budget and be more aggressive about cleaning up the Tx descriptors. | 1630 | * budget and be more aggressive about cleaning up the Tx descriptors. |
| 1593 | */ | 1631 | */ |
| 1594 | i40e_for_each_ring(ring, q_vector->tx) | 1632 | i40e_for_each_ring(ring, q_vector->tx) { |
| 1595 | clean_complete &= i40e_clean_tx_irq(ring, vsi->work_limit); | 1633 | clean_complete &= i40e_clean_tx_irq(ring, vsi->work_limit); |
| 1634 | arm_wb |= ring->arm_wb; | ||
| 1635 | } | ||
| 1596 | 1636 | ||
| 1597 | /* We attempt to distribute budget to each Rx queue fairly, but don't | 1637 | /* We attempt to distribute budget to each Rx queue fairly, but don't |
| 1598 | * allow the budget to go below 1 because that would exit polling early. | 1638 | * allow the budget to go below 1 because that would exit polling early. |
| @@ -1603,8 +1643,11 @@ int i40e_napi_poll(struct napi_struct *napi, int budget) | |||
| 1603 | clean_complete &= i40e_clean_rx_irq(ring, budget_per_ring); | 1643 | clean_complete &= i40e_clean_rx_irq(ring, budget_per_ring); |
| 1604 | 1644 | ||
| 1605 | /* If work not completed, return budget and polling will return */ | 1645 | /* If work not completed, return budget and polling will return */ |
| 1606 | if (!clean_complete) | 1646 | if (!clean_complete) { |
| 1647 | if (arm_wb) | ||
| 1648 | i40e_force_wb(vsi, q_vector); | ||
| 1607 | return budget; | 1649 | return budget; |
| 1650 | } | ||
| 1608 | 1651 | ||
| 1609 | /* Work is done so exit the polling mode and re-enable the interrupt */ | 1652 | /* Work is done so exit the polling mode and re-enable the interrupt */ |
| 1610 | napi_complete(napi); | 1653 | napi_complete(napi); |
| @@ -1840,17 +1883,16 @@ static int i40e_tso(struct i40e_ring *tx_ring, struct sk_buff *skb, | |||
| 1840 | if (err < 0) | 1883 | if (err < 0) |
| 1841 | return err; | 1884 | return err; |
| 1842 | 1885 | ||
| 1843 | if (protocol == htons(ETH_P_IP)) { | 1886 | iph = skb->encapsulation ? inner_ip_hdr(skb) : ip_hdr(skb); |
| 1844 | iph = skb->encapsulation ? inner_ip_hdr(skb) : ip_hdr(skb); | 1887 | ipv6h = skb->encapsulation ? inner_ipv6_hdr(skb) : ipv6_hdr(skb); |
| 1888 | |||
| 1889 | if (iph->version == 4) { | ||
| 1845 | tcph = skb->encapsulation ? inner_tcp_hdr(skb) : tcp_hdr(skb); | 1890 | tcph = skb->encapsulation ? inner_tcp_hdr(skb) : tcp_hdr(skb); |
| 1846 | iph->tot_len = 0; | 1891 | iph->tot_len = 0; |
| 1847 | iph->check = 0; | 1892 | iph->check = 0; |
| 1848 | tcph->check = ~csum_tcpudp_magic(iph->saddr, iph->daddr, | 1893 | tcph->check = ~csum_tcpudp_magic(iph->saddr, iph->daddr, |
| 1849 | 0, IPPROTO_TCP, 0); | 1894 | 0, IPPROTO_TCP, 0); |
| 1850 | } else if (skb_is_gso_v6(skb)) { | 1895 | } else if (ipv6h->version == 6) { |
| 1851 | |||
| 1852 | ipv6h = skb->encapsulation ? inner_ipv6_hdr(skb) | ||
| 1853 | : ipv6_hdr(skb); | ||
| 1854 | tcph = skb->encapsulation ? inner_tcp_hdr(skb) : tcp_hdr(skb); | 1896 | tcph = skb->encapsulation ? inner_tcp_hdr(skb) : tcp_hdr(skb); |
| 1855 | ipv6h->payload_len = 0; | 1897 | ipv6h->payload_len = 0; |
| 1856 | tcph->check = ~csum_ipv6_magic(&ipv6h->saddr, &ipv6h->daddr, | 1898 | tcph->check = ~csum_ipv6_magic(&ipv6h->saddr, &ipv6h->daddr, |
| @@ -1946,13 +1988,9 @@ static void i40e_tx_enable_csum(struct sk_buff *skb, u32 tx_flags, | |||
| 1946 | I40E_TX_CTX_EXT_IP_IPV4_NO_CSUM; | 1988 | I40E_TX_CTX_EXT_IP_IPV4_NO_CSUM; |
| 1947 | } | 1989 | } |
| 1948 | } else if (tx_flags & I40E_TX_FLAGS_IPV6) { | 1990 | } else if (tx_flags & I40E_TX_FLAGS_IPV6) { |
| 1949 | if (tx_flags & I40E_TX_FLAGS_TSO) { | 1991 | *cd_tunneling |= I40E_TX_CTX_EXT_IP_IPV6; |
| 1950 | *cd_tunneling |= I40E_TX_CTX_EXT_IP_IPV6; | 1992 | if (tx_flags & I40E_TX_FLAGS_TSO) |
| 1951 | ip_hdr(skb)->check = 0; | 1993 | ip_hdr(skb)->check = 0; |
| 1952 | } else { | ||
| 1953 | *cd_tunneling |= | ||
| 1954 | I40E_TX_CTX_EXT_IP_IPV4_NO_CSUM; | ||
| 1955 | } | ||
| 1956 | } | 1994 | } |
| 1957 | 1995 | ||
| 1958 | /* Now set the ctx descriptor fields */ | 1996 | /* Now set the ctx descriptor fields */ |
| @@ -1962,7 +2000,10 @@ static void i40e_tx_enable_csum(struct sk_buff *skb, u32 tx_flags, | |||
| 1962 | ((skb_inner_network_offset(skb) - | 2000 | ((skb_inner_network_offset(skb) - |
| 1963 | skb_transport_offset(skb)) >> 1) << | 2001 | skb_transport_offset(skb)) >> 1) << |
| 1964 | I40E_TXD_CTX_QW0_NATLEN_SHIFT; | 2002 | I40E_TXD_CTX_QW0_NATLEN_SHIFT; |
| 1965 | 2003 | if (this_ip_hdr->version == 6) { | |
| 2004 | tx_flags &= ~I40E_TX_FLAGS_IPV4; | ||
| 2005 | tx_flags |= I40E_TX_FLAGS_IPV6; | ||
| 2006 | } | ||
| 1966 | } else { | 2007 | } else { |
| 1967 | network_hdr_len = skb_network_header_len(skb); | 2008 | network_hdr_len = skb_network_header_len(skb); |
| 1968 | this_ip_hdr = ip_hdr(skb); | 2009 | this_ip_hdr = ip_hdr(skb); |
| @@ -2198,7 +2239,6 @@ static void i40e_tx_map(struct i40e_ring *tx_ring, struct sk_buff *skb, | |||
| 2198 | /* Place RS bit on last descriptor of any packet that spans across the | 2239 | /* Place RS bit on last descriptor of any packet that spans across the |
| 2199 | * 4th descriptor (WB_STRIDE aka 0x3) in a 64B cacheline. | 2240 | * 4th descriptor (WB_STRIDE aka 0x3) in a 64B cacheline. |
| 2200 | */ | 2241 | */ |
| 2201 | #define WB_STRIDE 0x3 | ||
| 2202 | if (((i & WB_STRIDE) != WB_STRIDE) && | 2242 | if (((i & WB_STRIDE) != WB_STRIDE) && |
| 2203 | (first <= &tx_ring->tx_bi[i]) && | 2243 | (first <= &tx_ring->tx_bi[i]) && |
| 2204 | (first >= &tx_ring->tx_bi[i & ~WB_STRIDE])) { | 2244 | (first >= &tx_ring->tx_bi[i & ~WB_STRIDE])) { |
diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.h b/drivers/net/ethernet/intel/i40e/i40e_txrx.h index e60d3accb2e2..18b00231d2f1 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_txrx.h +++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.h | |||
| @@ -241,6 +241,7 @@ struct i40e_ring { | |||
| 241 | unsigned long last_rx_timestamp; | 241 | unsigned long last_rx_timestamp; |
| 242 | 242 | ||
| 243 | bool ring_active; /* is ring online or not */ | 243 | bool ring_active; /* is ring online or not */ |
| 244 | bool arm_wb; /* do something to arm write back */ | ||
| 244 | 245 | ||
| 245 | /* stats structs */ | 246 | /* stats structs */ |
| 246 | struct i40e_queue_stats stats; | 247 | struct i40e_queue_stats stats; |
diff --git a/drivers/net/ethernet/intel/igb/e1000_82575.c b/drivers/net/ethernet/intel/igb/e1000_82575.c index 051ea94bdcd3..0f69ef81751a 100644 --- a/drivers/net/ethernet/intel/igb/e1000_82575.c +++ b/drivers/net/ethernet/intel/igb/e1000_82575.c | |||
| @@ -1125,7 +1125,7 @@ static s32 igb_acquire_swfw_sync_82575(struct e1000_hw *hw, u16 mask) | |||
| 1125 | u32 swmask = mask; | 1125 | u32 swmask = mask; |
| 1126 | u32 fwmask = mask << 16; | 1126 | u32 fwmask = mask << 16; |
| 1127 | s32 ret_val = 0; | 1127 | s32 ret_val = 0; |
| 1128 | s32 i = 0, timeout = 200; /* FIXME: find real value to use here */ | 1128 | s32 i = 0, timeout = 200; |
| 1129 | 1129 | ||
| 1130 | while (i < timeout) { | 1130 | while (i < timeout) { |
| 1131 | if (igb_get_hw_semaphore(hw)) { | 1131 | if (igb_get_hw_semaphore(hw)) { |
diff --git a/drivers/net/ethernet/intel/igbvf/netdev.c b/drivers/net/ethernet/intel/igbvf/netdev.c index 63c807c9b21c..edea13b0ee85 100644 --- a/drivers/net/ethernet/intel/igbvf/netdev.c +++ b/drivers/net/ethernet/intel/igbvf/netdev.c | |||
| @@ -1907,7 +1907,8 @@ static void igbvf_watchdog_task(struct work_struct *work) | |||
| 1907 | 1907 | ||
| 1908 | static int igbvf_tso(struct igbvf_adapter *adapter, | 1908 | static int igbvf_tso(struct igbvf_adapter *adapter, |
| 1909 | struct igbvf_ring *tx_ring, | 1909 | struct igbvf_ring *tx_ring, |
| 1910 | struct sk_buff *skb, u32 tx_flags, u8 *hdr_len) | 1910 | struct sk_buff *skb, u32 tx_flags, u8 *hdr_len, |
| 1911 | __be16 protocol) | ||
| 1911 | { | 1912 | { |
| 1912 | struct e1000_adv_tx_context_desc *context_desc; | 1913 | struct e1000_adv_tx_context_desc *context_desc; |
| 1913 | struct igbvf_buffer *buffer_info; | 1914 | struct igbvf_buffer *buffer_info; |
| @@ -1927,7 +1928,7 @@ static int igbvf_tso(struct igbvf_adapter *adapter, | |||
| 1927 | l4len = tcp_hdrlen(skb); | 1928 | l4len = tcp_hdrlen(skb); |
| 1928 | *hdr_len += l4len; | 1929 | *hdr_len += l4len; |
| 1929 | 1930 | ||
| 1930 | if (skb->protocol == htons(ETH_P_IP)) { | 1931 | if (protocol == htons(ETH_P_IP)) { |
| 1931 | struct iphdr *iph = ip_hdr(skb); | 1932 | struct iphdr *iph = ip_hdr(skb); |
| 1932 | iph->tot_len = 0; | 1933 | iph->tot_len = 0; |
| 1933 | iph->check = 0; | 1934 | iph->check = 0; |
| @@ -1958,7 +1959,7 @@ static int igbvf_tso(struct igbvf_adapter *adapter, | |||
| 1958 | /* ADV DTYP TUCMD MKRLOC/ISCSIHEDLEN */ | 1959 | /* ADV DTYP TUCMD MKRLOC/ISCSIHEDLEN */ |
| 1959 | tu_cmd |= (E1000_TXD_CMD_DEXT | E1000_ADVTXD_DTYP_CTXT); | 1960 | tu_cmd |= (E1000_TXD_CMD_DEXT | E1000_ADVTXD_DTYP_CTXT); |
| 1960 | 1961 | ||
| 1961 | if (skb->protocol == htons(ETH_P_IP)) | 1962 | if (protocol == htons(ETH_P_IP)) |
| 1962 | tu_cmd |= E1000_ADVTXD_TUCMD_IPV4; | 1963 | tu_cmd |= E1000_ADVTXD_TUCMD_IPV4; |
| 1963 | tu_cmd |= E1000_ADVTXD_TUCMD_L4T_TCP; | 1964 | tu_cmd |= E1000_ADVTXD_TUCMD_L4T_TCP; |
| 1964 | 1965 | ||
| @@ -1984,7 +1985,8 @@ static int igbvf_tso(struct igbvf_adapter *adapter, | |||
| 1984 | 1985 | ||
| 1985 | static inline bool igbvf_tx_csum(struct igbvf_adapter *adapter, | 1986 | static inline bool igbvf_tx_csum(struct igbvf_adapter *adapter, |
| 1986 | struct igbvf_ring *tx_ring, | 1987 | struct igbvf_ring *tx_ring, |
| 1987 | struct sk_buff *skb, u32 tx_flags) | 1988 | struct sk_buff *skb, u32 tx_flags, |
| 1989 | __be16 protocol) | ||
| 1988 | { | 1990 | { |
| 1989 | struct e1000_adv_tx_context_desc *context_desc; | 1991 | struct e1000_adv_tx_context_desc *context_desc; |
| 1990 | unsigned int i; | 1992 | unsigned int i; |
| @@ -2011,7 +2013,7 @@ static inline bool igbvf_tx_csum(struct igbvf_adapter *adapter, | |||
| 2011 | tu_cmd |= (E1000_TXD_CMD_DEXT | E1000_ADVTXD_DTYP_CTXT); | 2013 | tu_cmd |= (E1000_TXD_CMD_DEXT | E1000_ADVTXD_DTYP_CTXT); |
| 2012 | 2014 | ||
| 2013 | if (skb->ip_summed == CHECKSUM_PARTIAL) { | 2015 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
| 2014 | switch (skb->protocol) { | 2016 | switch (protocol) { |
| 2015 | case htons(ETH_P_IP): | 2017 | case htons(ETH_P_IP): |
| 2016 | tu_cmd |= E1000_ADVTXD_TUCMD_IPV4; | 2018 | tu_cmd |= E1000_ADVTXD_TUCMD_IPV4; |
| 2017 | if (ip_hdr(skb)->protocol == IPPROTO_TCP) | 2019 | if (ip_hdr(skb)->protocol == IPPROTO_TCP) |
| @@ -2211,6 +2213,7 @@ static netdev_tx_t igbvf_xmit_frame_ring_adv(struct sk_buff *skb, | |||
| 2211 | u8 hdr_len = 0; | 2213 | u8 hdr_len = 0; |
| 2212 | int count = 0; | 2214 | int count = 0; |
| 2213 | int tso = 0; | 2215 | int tso = 0; |
| 2216 | __be16 protocol = vlan_get_protocol(skb); | ||
| 2214 | 2217 | ||
| 2215 | if (test_bit(__IGBVF_DOWN, &adapter->state)) { | 2218 | if (test_bit(__IGBVF_DOWN, &adapter->state)) { |
| 2216 | dev_kfree_skb_any(skb); | 2219 | dev_kfree_skb_any(skb); |
| @@ -2239,13 +2242,13 @@ static netdev_tx_t igbvf_xmit_frame_ring_adv(struct sk_buff *skb, | |||
| 2239 | tx_flags |= (vlan_tx_tag_get(skb) << IGBVF_TX_FLAGS_VLAN_SHIFT); | 2242 | tx_flags |= (vlan_tx_tag_get(skb) << IGBVF_TX_FLAGS_VLAN_SHIFT); |
| 2240 | } | 2243 | } |
| 2241 | 2244 | ||
| 2242 | if (skb->protocol == htons(ETH_P_IP)) | 2245 | if (protocol == htons(ETH_P_IP)) |
| 2243 | tx_flags |= IGBVF_TX_FLAGS_IPV4; | 2246 | tx_flags |= IGBVF_TX_FLAGS_IPV4; |
| 2244 | 2247 | ||
| 2245 | first = tx_ring->next_to_use; | 2248 | first = tx_ring->next_to_use; |
| 2246 | 2249 | ||
| 2247 | tso = skb_is_gso(skb) ? | 2250 | tso = skb_is_gso(skb) ? |
| 2248 | igbvf_tso(adapter, tx_ring, skb, tx_flags, &hdr_len) : 0; | 2251 | igbvf_tso(adapter, tx_ring, skb, tx_flags, &hdr_len, protocol) : 0; |
| 2249 | if (unlikely(tso < 0)) { | 2252 | if (unlikely(tso < 0)) { |
| 2250 | dev_kfree_skb_any(skb); | 2253 | dev_kfree_skb_any(skb); |
| 2251 | return NETDEV_TX_OK; | 2254 | return NETDEV_TX_OK; |
| @@ -2253,7 +2256,7 @@ static netdev_tx_t igbvf_xmit_frame_ring_adv(struct sk_buff *skb, | |||
| 2253 | 2256 | ||
| 2254 | if (tso) | 2257 | if (tso) |
| 2255 | tx_flags |= IGBVF_TX_FLAGS_TSO; | 2258 | tx_flags |= IGBVF_TX_FLAGS_TSO; |
| 2256 | else if (igbvf_tx_csum(adapter, tx_ring, skb, tx_flags) && | 2259 | else if (igbvf_tx_csum(adapter, tx_ring, skb, tx_flags, protocol) && |
| 2257 | (skb->ip_summed == CHECKSUM_PARTIAL)) | 2260 | (skb->ip_summed == CHECKSUM_PARTIAL)) |
| 2258 | tx_flags |= IGBVF_TX_FLAGS_CSUM; | 2261 | tx_flags |= IGBVF_TX_FLAGS_CSUM; |
| 2259 | 2262 | ||
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index 2ed2c7de2304..67b02bde179e 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | |||
| @@ -7227,11 +7227,11 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb, | |||
| 7227 | if (!vhdr) | 7227 | if (!vhdr) |
| 7228 | goto out_drop; | 7228 | goto out_drop; |
| 7229 | 7229 | ||
| 7230 | protocol = vhdr->h_vlan_encapsulated_proto; | ||
| 7231 | tx_flags |= ntohs(vhdr->h_vlan_TCI) << | 7230 | tx_flags |= ntohs(vhdr->h_vlan_TCI) << |
| 7232 | IXGBE_TX_FLAGS_VLAN_SHIFT; | 7231 | IXGBE_TX_FLAGS_VLAN_SHIFT; |
| 7233 | tx_flags |= IXGBE_TX_FLAGS_SW_VLAN; | 7232 | tx_flags |= IXGBE_TX_FLAGS_SW_VLAN; |
| 7234 | } | 7233 | } |
| 7234 | protocol = vlan_get_protocol(skb); | ||
| 7235 | 7235 | ||
| 7236 | if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) && | 7236 | if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) && |
| 7237 | adapter->ptp_clock && | 7237 | adapter->ptp_clock && |
diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c index 62a0d8e0f17d..38c7a0be8197 100644 --- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | |||
| @@ -3099,7 +3099,7 @@ static int ixgbevf_tso(struct ixgbevf_ring *tx_ring, | |||
| 3099 | /* ADV DTYP TUCMD MKRLOC/ISCSIHEDLEN */ | 3099 | /* ADV DTYP TUCMD MKRLOC/ISCSIHEDLEN */ |
| 3100 | type_tucmd = IXGBE_ADVTXD_TUCMD_L4T_TCP; | 3100 | type_tucmd = IXGBE_ADVTXD_TUCMD_L4T_TCP; |
| 3101 | 3101 | ||
| 3102 | if (skb->protocol == htons(ETH_P_IP)) { | 3102 | if (first->protocol == htons(ETH_P_IP)) { |
| 3103 | struct iphdr *iph = ip_hdr(skb); | 3103 | struct iphdr *iph = ip_hdr(skb); |
| 3104 | iph->tot_len = 0; | 3104 | iph->tot_len = 0; |
| 3105 | iph->check = 0; | 3105 | iph->check = 0; |
| @@ -3156,7 +3156,7 @@ static void ixgbevf_tx_csum(struct ixgbevf_ring *tx_ring, | |||
| 3156 | 3156 | ||
| 3157 | if (skb->ip_summed == CHECKSUM_PARTIAL) { | 3157 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
| 3158 | u8 l4_hdr = 0; | 3158 | u8 l4_hdr = 0; |
| 3159 | switch (skb->protocol) { | 3159 | switch (first->protocol) { |
| 3160 | case htons(ETH_P_IP): | 3160 | case htons(ETH_P_IP): |
| 3161 | vlan_macip_lens |= skb_network_header_len(skb); | 3161 | vlan_macip_lens |= skb_network_header_len(skb); |
| 3162 | type_tucmd |= IXGBE_ADVTXD_TUCMD_IPV4; | 3162 | type_tucmd |= IXGBE_ADVTXD_TUCMD_IPV4; |
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 d0d6dc1b8e46..ac6a8f1eea6c 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 943cbd47d832..6e08352ec994 100644 --- a/drivers/net/ethernet/mellanox/mlx4/main.c +++ b/drivers/net/ethernet/mellanox/mlx4/main.c | |||
| @@ -1744,8 +1744,7 @@ static void choose_tunnel_offload_mode(struct mlx4_dev *dev, | |||
| 1744 | struct mlx4_dev_cap *dev_cap) | 1744 | struct mlx4_dev_cap *dev_cap) |
| 1745 | { | 1745 | { |
| 1746 | if (dev->caps.steering_mode == MLX4_STEERING_MODE_DEVICE_MANAGED && | 1746 | if (dev->caps.steering_mode == MLX4_STEERING_MODE_DEVICE_MANAGED && |
| 1747 | dev_cap->flags2 & MLX4_DEV_CAP_FLAG2_VXLAN_OFFLOADS && | 1747 | dev_cap->flags2 & MLX4_DEV_CAP_FLAG2_VXLAN_OFFLOADS) |
| 1748 | dev->caps.dmfs_high_steer_mode != MLX4_STEERING_DMFS_A0_STATIC) | ||
| 1749 | dev->caps.tunnel_offload_mode = MLX4_TUNNEL_OFFLOAD_MODE_VXLAN; | 1748 | dev->caps.tunnel_offload_mode = MLX4_TUNNEL_OFFLOAD_MODE_VXLAN; |
| 1750 | else | 1749 | else |
| 1751 | dev->caps.tunnel_offload_mode = MLX4_TUNNEL_OFFLOAD_MODE_NONE; | 1750 | dev->caps.tunnel_offload_mode = MLX4_TUNNEL_OFFLOAD_MODE_NONE; |
| @@ -1829,7 +1828,7 @@ static int mlx4_init_hca(struct mlx4_dev *dev) | |||
| 1829 | err = mlx4_dev_cap(dev, &dev_cap); | 1828 | err = mlx4_dev_cap(dev, &dev_cap); |
| 1830 | if (err) { | 1829 | if (err) { |
| 1831 | mlx4_err(dev, "QUERY_DEV_CAP command failed, aborting\n"); | 1830 | mlx4_err(dev, "QUERY_DEV_CAP command failed, aborting\n"); |
| 1832 | goto err_stop_fw; | 1831 | return err; |
| 1833 | } | 1832 | } |
| 1834 | 1833 | ||
| 1835 | choose_steering_mode(dev, &dev_cap); | 1834 | choose_steering_mode(dev, &dev_cap); |
| @@ -1860,7 +1859,7 @@ static int mlx4_init_hca(struct mlx4_dev *dev) | |||
| 1860 | &init_hca); | 1859 | &init_hca); |
| 1861 | if ((long long) icm_size < 0) { | 1860 | if ((long long) icm_size < 0) { |
| 1862 | err = icm_size; | 1861 | err = icm_size; |
| 1863 | goto err_stop_fw; | 1862 | return err; |
| 1864 | } | 1863 | } |
| 1865 | 1864 | ||
| 1866 | dev->caps.max_fmr_maps = (1 << (32 - ilog2(dev->caps.num_mpts))) - 1; | 1865 | dev->caps.max_fmr_maps = (1 << (32 - ilog2(dev->caps.num_mpts))) - 1; |
| @@ -1874,7 +1873,7 @@ static int mlx4_init_hca(struct mlx4_dev *dev) | |||
| 1874 | 1873 | ||
| 1875 | err = mlx4_init_icm(dev, &dev_cap, &init_hca, icm_size); | 1874 | err = mlx4_init_icm(dev, &dev_cap, &init_hca, icm_size); |
| 1876 | if (err) | 1875 | if (err) |
| 1877 | goto err_stop_fw; | 1876 | return err; |
| 1878 | 1877 | ||
| 1879 | err = mlx4_INIT_HCA(dev, &init_hca); | 1878 | err = mlx4_INIT_HCA(dev, &init_hca); |
| 1880 | if (err) { | 1879 | if (err) { |
| @@ -1886,7 +1885,7 @@ static int mlx4_init_hca(struct mlx4_dev *dev) | |||
| 1886 | err = mlx4_query_func(dev, &dev_cap); | 1885 | err = mlx4_query_func(dev, &dev_cap); |
| 1887 | if (err < 0) { | 1886 | if (err < 0) { |
| 1888 | mlx4_err(dev, "QUERY_FUNC command failed, aborting.\n"); | 1887 | mlx4_err(dev, "QUERY_FUNC command failed, aborting.\n"); |
| 1889 | goto err_stop_fw; | 1888 | goto err_close; |
| 1890 | } else if (err & MLX4_QUERY_FUNC_NUM_SYS_EQS) { | 1889 | } else if (err & MLX4_QUERY_FUNC_NUM_SYS_EQS) { |
| 1891 | dev->caps.num_eqs = dev_cap.max_eqs; | 1890 | dev->caps.num_eqs = dev_cap.max_eqs; |
| 1892 | dev->caps.reserved_eqs = dev_cap.reserved_eqs; | 1891 | dev->caps.reserved_eqs = dev_cap.reserved_eqs; |
| @@ -2006,11 +2005,6 @@ err_free_icm: | |||
| 2006 | if (!mlx4_is_slave(dev)) | 2005 | if (!mlx4_is_slave(dev)) |
| 2007 | mlx4_free_icms(dev); | 2006 | mlx4_free_icms(dev); |
| 2008 | 2007 | ||
| 2009 | err_stop_fw: | ||
| 2010 | if (!mlx4_is_slave(dev)) { | ||
| 2011 | mlx4_UNMAP_FA(dev); | ||
| 2012 | mlx4_free_icm(dev, priv->fw.fw_icm, 0); | ||
| 2013 | } | ||
| 2014 | return err; | 2008 | return err; |
| 2015 | } | 2009 | } |
| 2016 | 2010 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4.h b/drivers/net/ethernet/mellanox/mlx4/mlx4.h index bdd4eea2247c..210691c89b6c 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mlx4.h +++ b/drivers/net/ethernet/mellanox/mlx4/mlx4.h | |||
| @@ -235,7 +235,8 @@ do { \ | |||
| 235 | extern int mlx4_log_num_mgm_entry_size; | 235 | extern int mlx4_log_num_mgm_entry_size; |
| 236 | extern int log_mtts_per_seg; | 236 | extern int log_mtts_per_seg; |
| 237 | 237 | ||
| 238 | #define MLX4_MAX_NUM_SLAVES (MLX4_MAX_NUM_PF + MLX4_MAX_NUM_VF) | 238 | #define MLX4_MAX_NUM_SLAVES (min(MLX4_MAX_NUM_PF + MLX4_MAX_NUM_VF, \ |
| 239 | MLX4_MFUNC_MAX)) | ||
| 239 | #define ALL_SLAVES 0xff | 240 | #define ALL_SLAVES 0xff |
| 240 | 241 | ||
| 241 | struct mlx4_bitmap { | 242 | struct mlx4_bitmap { |
diff --git a/drivers/net/ethernet/mellanox/mlx4/mr.c b/drivers/net/ethernet/mellanox/mlx4/mr.c index d6f549685c0f..7094a9c70fd5 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mr.c +++ b/drivers/net/ethernet/mellanox/mlx4/mr.c | |||
| @@ -584,6 +584,7 @@ EXPORT_SYMBOL_GPL(mlx4_mr_free); | |||
| 584 | void mlx4_mr_rereg_mem_cleanup(struct mlx4_dev *dev, struct mlx4_mr *mr) | 584 | void mlx4_mr_rereg_mem_cleanup(struct mlx4_dev *dev, struct mlx4_mr *mr) |
| 585 | { | 585 | { |
| 586 | mlx4_mtt_cleanup(dev, &mr->mtt); | 586 | mlx4_mtt_cleanup(dev, &mr->mtt); |
| 587 | mr->mtt.order = -1; | ||
| 587 | } | 588 | } |
| 588 | EXPORT_SYMBOL_GPL(mlx4_mr_rereg_mem_cleanup); | 589 | EXPORT_SYMBOL_GPL(mlx4_mr_rereg_mem_cleanup); |
| 589 | 590 | ||
| @@ -593,14 +594,14 @@ int mlx4_mr_rereg_mem_write(struct mlx4_dev *dev, struct mlx4_mr *mr, | |||
| 593 | { | 594 | { |
| 594 | int err; | 595 | int err; |
| 595 | 596 | ||
| 596 | mpt_entry->start = cpu_to_be64(iova); | ||
| 597 | mpt_entry->length = cpu_to_be64(size); | ||
| 598 | mpt_entry->entity_size = cpu_to_be32(page_shift); | ||
| 599 | |||
| 600 | err = mlx4_mtt_init(dev, npages, page_shift, &mr->mtt); | 597 | err = mlx4_mtt_init(dev, npages, page_shift, &mr->mtt); |
| 601 | if (err) | 598 | if (err) |
| 602 | return err; | 599 | return err; |
| 603 | 600 | ||
| 601 | mpt_entry->start = cpu_to_be64(mr->iova); | ||
| 602 | mpt_entry->length = cpu_to_be64(mr->size); | ||
| 603 | mpt_entry->entity_size = cpu_to_be32(mr->mtt.page_shift); | ||
| 604 | |||
| 604 | mpt_entry->pd_flags &= cpu_to_be32(MLX4_MPT_PD_MASK | | 605 | mpt_entry->pd_flags &= cpu_to_be32(MLX4_MPT_PD_MASK | |
| 605 | MLX4_MPT_PD_FLAG_EN_INV); | 606 | MLX4_MPT_PD_FLAG_EN_INV); |
| 606 | mpt_entry->flags &= cpu_to_be32(MLX4_MPT_FLAG_FREE | | 607 | mpt_entry->flags &= cpu_to_be32(MLX4_MPT_FLAG_FREE | |
diff --git a/drivers/net/ethernet/myricom/myri10ge/myri10ge.c b/drivers/net/ethernet/myricom/myri10ge/myri10ge.c index af099057f0e9..71af98bb72cb 100644 --- a/drivers/net/ethernet/myricom/myri10ge/myri10ge.c +++ b/drivers/net/ethernet/myricom/myri10ge/myri10ge.c | |||
| @@ -4033,8 +4033,10 @@ static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 4033 | (void)pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)); | 4033 | (void)pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)); |
| 4034 | mgp->cmd = dma_alloc_coherent(&pdev->dev, sizeof(*mgp->cmd), | 4034 | mgp->cmd = dma_alloc_coherent(&pdev->dev, sizeof(*mgp->cmd), |
| 4035 | &mgp->cmd_bus, GFP_KERNEL); | 4035 | &mgp->cmd_bus, GFP_KERNEL); |
| 4036 | if (mgp->cmd == NULL) | 4036 | if (!mgp->cmd) { |
| 4037 | status = -ENOMEM; | ||
| 4037 | goto abort_with_enabled; | 4038 | goto abort_with_enabled; |
| 4039 | } | ||
| 4038 | 4040 | ||
| 4039 | mgp->board_span = pci_resource_len(pdev, 0); | 4041 | mgp->board_span = pci_resource_len(pdev, 0); |
| 4040 | mgp->iomem_base = pci_resource_start(pdev, 0); | 4042 | mgp->iomem_base = pci_resource_start(pdev, 0); |
diff --git a/drivers/net/ethernet/neterion/s2io.c b/drivers/net/ethernet/neterion/s2io.c index f5e4b820128b..db0c7a9aee60 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 613037584d08..c531c8ae1be4 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/qlogic/qla3xxx.c b/drivers/net/ethernet/qlogic/qla3xxx.c index c2f09af5c25b..4847713211ca 100644 --- a/drivers/net/ethernet/qlogic/qla3xxx.c +++ b/drivers/net/ethernet/qlogic/qla3xxx.c | |||
| @@ -146,10 +146,7 @@ static int ql_wait_for_drvr_lock(struct ql3_adapter *qdev) | |||
| 146 | { | 146 | { |
| 147 | int i = 0; | 147 | int i = 0; |
| 148 | 148 | ||
| 149 | while (i < 10) { | 149 | do { |
| 150 | if (i) | ||
| 151 | ssleep(1); | ||
| 152 | |||
| 153 | if (ql_sem_lock(qdev, | 150 | if (ql_sem_lock(qdev, |
| 154 | QL_DRVR_SEM_MASK, | 151 | QL_DRVR_SEM_MASK, |
| 155 | (QL_RESOURCE_BITS_BASE_CODE | (qdev->mac_index) | 152 | (QL_RESOURCE_BITS_BASE_CODE | (qdev->mac_index) |
| @@ -158,7 +155,8 @@ static int ql_wait_for_drvr_lock(struct ql3_adapter *qdev) | |||
| 158 | "driver lock acquired\n"); | 155 | "driver lock acquired\n"); |
| 159 | return 1; | 156 | return 1; |
| 160 | } | 157 | } |
| 161 | } | 158 | ssleep(1); |
| 159 | } while (++i < 10); | ||
| 162 | 160 | ||
| 163 | netdev_err(qdev->ndev, "Timed out waiting for driver lock...\n"); | 161 | netdev_err(qdev->ndev, "Timed out waiting for driver lock...\n"); |
| 164 | return 0; | 162 | return 0; |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c index 18e5de72e9b4..4e1f58cf19ce 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c | |||
| @@ -967,7 +967,12 @@ static int qlcnic_poll(struct napi_struct *napi, int budget) | |||
| 967 | tx_complete = qlcnic_process_cmd_ring(adapter, tx_ring, | 967 | tx_complete = qlcnic_process_cmd_ring(adapter, tx_ring, |
| 968 | budget); | 968 | budget); |
| 969 | work_done = qlcnic_process_rcv_ring(sds_ring, budget); | 969 | work_done = qlcnic_process_rcv_ring(sds_ring, budget); |
| 970 | if ((work_done < budget) && tx_complete) { | 970 | |
| 971 | /* Check if we need a repoll */ | ||
| 972 | if (!tx_complete) | ||
| 973 | work_done = budget; | ||
| 974 | |||
| 975 | if (work_done < budget) { | ||
| 971 | napi_complete(&sds_ring->napi); | 976 | napi_complete(&sds_ring->napi); |
| 972 | if (test_bit(__QLCNIC_DEV_UP, &adapter->state)) { | 977 | if (test_bit(__QLCNIC_DEV_UP, &adapter->state)) { |
| 973 | qlcnic_enable_sds_intr(adapter, sds_ring); | 978 | qlcnic_enable_sds_intr(adapter, sds_ring); |
| @@ -992,6 +997,9 @@ static int qlcnic_tx_poll(struct napi_struct *napi, int budget) | |||
| 992 | napi_complete(&tx_ring->napi); | 997 | napi_complete(&tx_ring->napi); |
| 993 | if (test_bit(__QLCNIC_DEV_UP, &adapter->state)) | 998 | if (test_bit(__QLCNIC_DEV_UP, &adapter->state)) |
| 994 | qlcnic_enable_tx_intr(adapter, tx_ring); | 999 | qlcnic_enable_tx_intr(adapter, tx_ring); |
| 1000 | } else { | ||
| 1001 | /* As qlcnic_process_cmd_ring() returned 0, we need a repoll*/ | ||
| 1002 | work_done = budget; | ||
| 995 | } | 1003 | } |
| 996 | 1004 | ||
| 997 | return work_done; | 1005 | return work_done; |
| @@ -1950,7 +1958,12 @@ static int qlcnic_83xx_msix_sriov_vf_poll(struct napi_struct *napi, int budget) | |||
| 1950 | 1958 | ||
| 1951 | tx_complete = qlcnic_process_cmd_ring(adapter, tx_ring, budget); | 1959 | tx_complete = qlcnic_process_cmd_ring(adapter, tx_ring, budget); |
| 1952 | work_done = qlcnic_83xx_process_rcv_ring(sds_ring, budget); | 1960 | work_done = qlcnic_83xx_process_rcv_ring(sds_ring, budget); |
| 1953 | if ((work_done < budget) && tx_complete) { | 1961 | |
| 1962 | /* Check if we need a repoll */ | ||
| 1963 | if (!tx_complete) | ||
| 1964 | work_done = budget; | ||
| 1965 | |||
| 1966 | if (work_done < budget) { | ||
| 1954 | napi_complete(&sds_ring->napi); | 1967 | napi_complete(&sds_ring->napi); |
| 1955 | qlcnic_enable_sds_intr(adapter, sds_ring); | 1968 | qlcnic_enable_sds_intr(adapter, sds_ring); |
| 1956 | } | 1969 | } |
| @@ -1973,7 +1986,12 @@ static int qlcnic_83xx_poll(struct napi_struct *napi, int budget) | |||
| 1973 | 1986 | ||
| 1974 | tx_complete = qlcnic_process_cmd_ring(adapter, tx_ring, budget); | 1987 | tx_complete = qlcnic_process_cmd_ring(adapter, tx_ring, budget); |
| 1975 | work_done = qlcnic_83xx_process_rcv_ring(sds_ring, budget); | 1988 | work_done = qlcnic_83xx_process_rcv_ring(sds_ring, budget); |
| 1976 | if ((work_done < budget) && tx_complete) { | 1989 | |
| 1990 | /* Check if we need a repoll */ | ||
| 1991 | if (!tx_complete) | ||
| 1992 | work_done = budget; | ||
| 1993 | |||
| 1994 | if (work_done < budget) { | ||
| 1977 | napi_complete(&sds_ring->napi); | 1995 | napi_complete(&sds_ring->napi); |
| 1978 | qlcnic_enable_sds_intr(adapter, sds_ring); | 1996 | qlcnic_enable_sds_intr(adapter, sds_ring); |
| 1979 | } | 1997 | } |
| @@ -1995,6 +2013,9 @@ static int qlcnic_83xx_msix_tx_poll(struct napi_struct *napi, int budget) | |||
| 1995 | napi_complete(&tx_ring->napi); | 2013 | napi_complete(&tx_ring->napi); |
| 1996 | if (test_bit(__QLCNIC_DEV_UP , &adapter->state)) | 2014 | if (test_bit(__QLCNIC_DEV_UP , &adapter->state)) |
| 1997 | qlcnic_enable_tx_intr(adapter, tx_ring); | 2015 | qlcnic_enable_tx_intr(adapter, tx_ring); |
| 2016 | } else { | ||
| 2017 | /* need a repoll */ | ||
| 2018 | work_done = budget; | ||
| 1998 | } | 2019 | } |
| 1999 | 2020 | ||
| 2000 | return work_done; | 2021 | return work_done; |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c index 9929b97cfb36..2528c3fb6b90 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | |||
| @@ -2605,6 +2605,7 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 2605 | } else { | 2605 | } else { |
| 2606 | dev_err(&pdev->dev, | 2606 | dev_err(&pdev->dev, |
| 2607 | "%s: failed. Please Reboot\n", __func__); | 2607 | "%s: failed. Please Reboot\n", __func__); |
| 2608 | err = -ENODEV; | ||
| 2608 | goto err_out_free_hw; | 2609 | goto err_out_free_hw; |
| 2609 | } | 2610 | } |
| 2610 | 2611 | ||
diff --git a/drivers/net/ethernet/qlogic/qlge/qlge_main.c b/drivers/net/ethernet/qlogic/qlge/qlge_main.c index 6c904a6cad2a..ef5aed3b1225 100644 --- a/drivers/net/ethernet/qlogic/qlge/qlge_main.c +++ b/drivers/net/ethernet/qlogic/qlge/qlge_main.c | |||
| @@ -2351,23 +2351,29 @@ static int qlge_update_hw_vlan_features(struct net_device *ndev, | |||
| 2351 | { | 2351 | { |
| 2352 | struct ql_adapter *qdev = netdev_priv(ndev); | 2352 | struct ql_adapter *qdev = netdev_priv(ndev); |
| 2353 | int status = 0; | 2353 | int status = 0; |
| 2354 | bool need_restart = netif_running(ndev); | ||
| 2354 | 2355 | ||
| 2355 | status = ql_adapter_down(qdev); | 2356 | if (need_restart) { |
| 2356 | if (status) { | 2357 | status = ql_adapter_down(qdev); |
| 2357 | netif_err(qdev, link, qdev->ndev, | 2358 | if (status) { |
| 2358 | "Failed to bring down the adapter\n"); | 2359 | netif_err(qdev, link, qdev->ndev, |
| 2359 | return status; | 2360 | "Failed to bring down the adapter\n"); |
| 2361 | return status; | ||
| 2362 | } | ||
| 2360 | } | 2363 | } |
| 2361 | 2364 | ||
| 2362 | /* update the features with resent change */ | 2365 | /* update the features with resent change */ |
| 2363 | ndev->features = features; | 2366 | ndev->features = features; |
| 2364 | 2367 | ||
| 2365 | status = ql_adapter_up(qdev); | 2368 | if (need_restart) { |
| 2366 | if (status) { | 2369 | status = ql_adapter_up(qdev); |
| 2367 | netif_err(qdev, link, qdev->ndev, | 2370 | if (status) { |
| 2368 | "Failed to bring up the adapter\n"); | 2371 | netif_err(qdev, link, qdev->ndev, |
| 2369 | return status; | 2372 | "Failed to bring up the adapter\n"); |
| 2373 | return status; | ||
| 2374 | } | ||
| 2370 | } | 2375 | } |
| 2376 | |||
| 2371 | return status; | 2377 | return status; |
| 2372 | } | 2378 | } |
| 2373 | 2379 | ||
diff --git a/drivers/net/ethernet/renesas/sh_eth.c b/drivers/net/ethernet/renesas/sh_eth.c index c29ba80ae02b..04283fe0e6a7 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; |
| @@ -473,6 +476,7 @@ static struct sh_eth_cpu_data r8a777x_data = { | |||
| 473 | .eesr_err_check = EESR_TWB | EESR_TABT | EESR_RABT | EESR_RFE | | 476 | .eesr_err_check = EESR_TWB | EESR_TABT | EESR_RABT | EESR_RFE | |
| 474 | EESR_RDE | EESR_RFRMER | EESR_TFE | EESR_TDE | | 477 | EESR_RDE | EESR_RFRMER | EESR_TFE | EESR_TDE | |
| 475 | EESR_ECI, | 478 | EESR_ECI, |
| 479 | .fdr_value = 0x00000f0f, | ||
| 476 | 480 | ||
| 477 | .apr = 1, | 481 | .apr = 1, |
| 478 | .mpr = 1, | 482 | .mpr = 1, |
| @@ -495,6 +499,9 @@ static struct sh_eth_cpu_data r8a779x_data = { | |||
| 495 | .eesr_err_check = EESR_TWB | EESR_TABT | EESR_RABT | EESR_RFE | | 499 | .eesr_err_check = EESR_TWB | EESR_TABT | EESR_RABT | EESR_RFE | |
| 496 | EESR_RDE | EESR_RFRMER | EESR_TFE | EESR_TDE | | 500 | EESR_RDE | EESR_RFRMER | EESR_TFE | EESR_TDE | |
| 497 | EESR_ECI, | 501 | EESR_ECI, |
| 502 | .fdr_value = 0x00000f0f, | ||
| 503 | |||
| 504 | .trscer_err_mask = DESC_I_RINT8, | ||
| 498 | 505 | ||
| 499 | .apr = 1, | 506 | .apr = 1, |
| 500 | .mpr = 1, | 507 | .mpr = 1, |
| @@ -856,6 +863,9 @@ static void sh_eth_set_default_cpu_data(struct sh_eth_cpu_data *cd) | |||
| 856 | 863 | ||
| 857 | if (!cd->eesr_err_check) | 864 | if (!cd->eesr_err_check) |
| 858 | cd->eesr_err_check = DEFAULT_EESR_ERR_CHECK; | 865 | cd->eesr_err_check = DEFAULT_EESR_ERR_CHECK; |
| 866 | |||
| 867 | if (!cd->trscer_err_mask) | ||
| 868 | cd->trscer_err_mask = DEFAULT_TRSCER_ERR_MASK; | ||
| 859 | } | 869 | } |
| 860 | 870 | ||
| 861 | static int sh_eth_check_reset(struct net_device *ndev) | 871 | static int sh_eth_check_reset(struct net_device *ndev) |
| @@ -1113,6 +1123,7 @@ static void sh_eth_ring_format(struct net_device *ndev) | |||
| 1113 | int rx_ringsize = sizeof(*rxdesc) * mdp->num_rx_ring; | 1123 | int rx_ringsize = sizeof(*rxdesc) * mdp->num_rx_ring; |
| 1114 | int tx_ringsize = sizeof(*txdesc) * mdp->num_tx_ring; | 1124 | int tx_ringsize = sizeof(*txdesc) * mdp->num_tx_ring; |
| 1115 | 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; | ||
| 1116 | 1127 | ||
| 1117 | mdp->cur_rx = 0; | 1128 | mdp->cur_rx = 0; |
| 1118 | mdp->cur_tx = 0; | 1129 | mdp->cur_tx = 0; |
| @@ -1126,7 +1137,6 @@ static void sh_eth_ring_format(struct net_device *ndev) | |||
| 1126 | /* skb */ | 1137 | /* skb */ |
| 1127 | mdp->rx_skbuff[i] = NULL; | 1138 | mdp->rx_skbuff[i] = NULL; |
| 1128 | skb = netdev_alloc_skb(ndev, skbuff_size); | 1139 | skb = netdev_alloc_skb(ndev, skbuff_size); |
| 1129 | mdp->rx_skbuff[i] = skb; | ||
| 1130 | if (skb == NULL) | 1140 | if (skb == NULL) |
| 1131 | break; | 1141 | break; |
| 1132 | sh_eth_set_receive_align(skb); | 1142 | sh_eth_set_receive_align(skb); |
| @@ -1135,9 +1145,15 @@ static void sh_eth_ring_format(struct net_device *ndev) | |||
| 1135 | rxdesc = &mdp->rx_ring[i]; | 1145 | rxdesc = &mdp->rx_ring[i]; |
| 1136 | /* The size of the buffer is a multiple of 16 bytes. */ | 1146 | /* The size of the buffer is a multiple of 16 bytes. */ |
| 1137 | rxdesc->buffer_length = ALIGN(mdp->rx_buf_sz, 16); | 1147 | rxdesc->buffer_length = ALIGN(mdp->rx_buf_sz, 16); |
| 1138 | dma_map_single(&ndev->dev, skb->data, rxdesc->buffer_length, | 1148 | dma_addr = dma_map_single(&ndev->dev, skb->data, |
| 1139 | DMA_FROM_DEVICE); | 1149 | rxdesc->buffer_length, |
| 1140 | 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; | ||
| 1141 | rxdesc->status = cpu_to_edmac(mdp, RD_RACT | RD_RFP); | 1157 | rxdesc->status = cpu_to_edmac(mdp, RD_RACT | RD_RFP); |
| 1142 | 1158 | ||
| 1143 | /* Rx descriptor address set */ | 1159 | /* Rx descriptor address set */ |
| @@ -1294,7 +1310,7 @@ static int sh_eth_dev_init(struct net_device *ndev, bool start) | |||
| 1294 | /* Frame recv control (enable multiple-packets per rx irq) */ | 1310 | /* Frame recv control (enable multiple-packets per rx irq) */ |
| 1295 | sh_eth_write(ndev, RMCR_RNC, RMCR); | 1311 | sh_eth_write(ndev, RMCR_RNC, RMCR); |
| 1296 | 1312 | ||
| 1297 | sh_eth_write(ndev, DESC_I_RINT8 | DESC_I_RINT5 | DESC_I_TINT2, TRSCER); | 1313 | sh_eth_write(ndev, mdp->cd->trscer_err_mask, TRSCER); |
| 1298 | 1314 | ||
| 1299 | if (mdp->cd->bculr) | 1315 | if (mdp->cd->bculr) |
| 1300 | sh_eth_write(ndev, 0x800, BCULR); /* Burst sycle set */ | 1316 | sh_eth_write(ndev, 0x800, BCULR); /* Burst sycle set */ |
| @@ -1309,8 +1325,10 @@ static int sh_eth_dev_init(struct net_device *ndev, bool start) | |||
| 1309 | RFLR); | 1325 | RFLR); |
| 1310 | 1326 | ||
| 1311 | sh_eth_write(ndev, sh_eth_read(ndev, EESR), EESR); | 1327 | sh_eth_write(ndev, sh_eth_read(ndev, EESR), EESR); |
| 1312 | if (start) | 1328 | if (start) { |
| 1329 | mdp->irq_enabled = true; | ||
| 1313 | sh_eth_write(ndev, mdp->cd->eesipr_value, EESIPR); | 1330 | sh_eth_write(ndev, mdp->cd->eesipr_value, EESIPR); |
| 1331 | } | ||
| 1314 | 1332 | ||
| 1315 | /* PAUSE Prohibition */ | 1333 | /* PAUSE Prohibition */ |
| 1316 | val = (sh_eth_read(ndev, ECMR) & ECMR_DM) | | 1334 | val = (sh_eth_read(ndev, ECMR) & ECMR_DM) | |
| @@ -1349,6 +1367,33 @@ static int sh_eth_dev_init(struct net_device *ndev, bool start) | |||
| 1349 | return ret; | 1367 | return ret; |
| 1350 | } | 1368 | } |
| 1351 | 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 | |||
| 1352 | /* free Tx skb function */ | 1397 | /* free Tx skb function */ |
| 1353 | static int sh_eth_txfree(struct net_device *ndev) | 1398 | static int sh_eth_txfree(struct net_device *ndev) |
| 1354 | { | 1399 | { |
| @@ -1393,6 +1438,7 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota) | |||
| 1393 | u16 pkt_len = 0; | 1438 | u16 pkt_len = 0; |
| 1394 | u32 desc_status; | 1439 | u32 desc_status; |
| 1395 | 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; | ||
| 1396 | 1442 | ||
| 1397 | boguscnt = min(boguscnt, *quota); | 1443 | boguscnt = min(boguscnt, *quota); |
| 1398 | limit = boguscnt; | 1444 | limit = boguscnt; |
| @@ -1440,9 +1486,9 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota) | |||
| 1440 | mdp->rx_skbuff[entry] = NULL; | 1486 | mdp->rx_skbuff[entry] = NULL; |
| 1441 | if (mdp->cd->rpadir) | 1487 | if (mdp->cd->rpadir) |
| 1442 | skb_reserve(skb, NET_IP_ALIGN); | 1488 | skb_reserve(skb, NET_IP_ALIGN); |
| 1443 | dma_sync_single_for_cpu(&ndev->dev, rxdesc->addr, | 1489 | dma_unmap_single(&ndev->dev, rxdesc->addr, |
| 1444 | ALIGN(mdp->rx_buf_sz, 16), | 1490 | ALIGN(mdp->rx_buf_sz, 16), |
| 1445 | DMA_FROM_DEVICE); | 1491 | DMA_FROM_DEVICE); |
| 1446 | skb_put(skb, pkt_len); | 1492 | skb_put(skb, pkt_len); |
| 1447 | skb->protocol = eth_type_trans(skb, ndev); | 1493 | skb->protocol = eth_type_trans(skb, ndev); |
| 1448 | netif_receive_skb(skb); | 1494 | netif_receive_skb(skb); |
| @@ -1462,15 +1508,20 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota) | |||
| 1462 | 1508 | ||
| 1463 | if (mdp->rx_skbuff[entry] == NULL) { | 1509 | if (mdp->rx_skbuff[entry] == NULL) { |
| 1464 | skb = netdev_alloc_skb(ndev, skbuff_size); | 1510 | skb = netdev_alloc_skb(ndev, skbuff_size); |
| 1465 | mdp->rx_skbuff[entry] = skb; | ||
| 1466 | if (skb == NULL) | 1511 | if (skb == NULL) |
| 1467 | break; /* Better luck next round. */ | 1512 | break; /* Better luck next round. */ |
| 1468 | sh_eth_set_receive_align(skb); | 1513 | sh_eth_set_receive_align(skb); |
| 1469 | dma_map_single(&ndev->dev, skb->data, | 1514 | dma_addr = dma_map_single(&ndev->dev, skb->data, |
| 1470 | 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; | ||
| 1471 | 1522 | ||
| 1472 | skb_checksum_none_assert(skb); | 1523 | skb_checksum_none_assert(skb); |
| 1473 | rxdesc->addr = virt_to_phys(skb->data); | 1524 | rxdesc->addr = dma_addr; |
| 1474 | } | 1525 | } |
| 1475 | if (entry >= mdp->num_rx_ring - 1) | 1526 | if (entry >= mdp->num_rx_ring - 1) |
| 1476 | rxdesc->status |= | 1527 | rxdesc->status |= |
| @@ -1566,7 +1617,6 @@ ignore_link: | |||
| 1566 | if (intr_status & EESR_RFRMER) { | 1617 | if (intr_status & EESR_RFRMER) { |
| 1567 | /* Receive Frame Overflow int */ | 1618 | /* Receive Frame Overflow int */ |
| 1568 | ndev->stats.rx_frame_errors++; | 1619 | ndev->stats.rx_frame_errors++; |
| 1569 | netif_err(mdp, rx_err, ndev, "Receive Abort\n"); | ||
| 1570 | } | 1620 | } |
| 1571 | } | 1621 | } |
| 1572 | 1622 | ||
| @@ -1585,13 +1635,11 @@ ignore_link: | |||
| 1585 | if (intr_status & EESR_RDE) { | 1635 | if (intr_status & EESR_RDE) { |
| 1586 | /* Receive Descriptor Empty int */ | 1636 | /* Receive Descriptor Empty int */ |
| 1587 | ndev->stats.rx_over_errors++; | 1637 | ndev->stats.rx_over_errors++; |
| 1588 | netif_err(mdp, rx_err, ndev, "Receive Descriptor Empty\n"); | ||
| 1589 | } | 1638 | } |
| 1590 | 1639 | ||
| 1591 | if (intr_status & EESR_RFE) { | 1640 | if (intr_status & EESR_RFE) { |
| 1592 | /* Receive FIFO Overflow int */ | 1641 | /* Receive FIFO Overflow int */ |
| 1593 | ndev->stats.rx_fifo_errors++; | 1642 | ndev->stats.rx_fifo_errors++; |
| 1594 | netif_err(mdp, rx_err, ndev, "Receive FIFO Overflow\n"); | ||
| 1595 | } | 1643 | } |
| 1596 | 1644 | ||
| 1597 | if (!mdp->cd->no_ade && (intr_status & EESR_ADE)) { | 1645 | if (!mdp->cd->no_ade && (intr_status & EESR_ADE)) { |
| @@ -1646,7 +1694,12 @@ static irqreturn_t sh_eth_interrupt(int irq, void *netdev) | |||
| 1646 | 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)) |
| 1647 | ret = IRQ_HANDLED; | 1695 | ret = IRQ_HANDLED; |
| 1648 | else | 1696 | else |
| 1649 | goto other_irq; | 1697 | goto out; |
| 1698 | |||
| 1699 | if (!likely(mdp->irq_enabled)) { | ||
| 1700 | sh_eth_write(ndev, 0, EESIPR); | ||
| 1701 | goto out; | ||
| 1702 | } | ||
| 1650 | 1703 | ||
| 1651 | if (intr_status & EESR_RX_CHECK) { | 1704 | if (intr_status & EESR_RX_CHECK) { |
| 1652 | if (napi_schedule_prep(&mdp->napi)) { | 1705 | if (napi_schedule_prep(&mdp->napi)) { |
| @@ -1677,7 +1730,7 @@ static irqreturn_t sh_eth_interrupt(int irq, void *netdev) | |||
| 1677 | sh_eth_error(ndev, intr_status); | 1730 | sh_eth_error(ndev, intr_status); |
| 1678 | } | 1731 | } |
| 1679 | 1732 | ||
| 1680 | other_irq: | 1733 | out: |
| 1681 | spin_unlock(&mdp->lock); | 1734 | spin_unlock(&mdp->lock); |
| 1682 | 1735 | ||
| 1683 | return ret; | 1736 | return ret; |
| @@ -1705,7 +1758,8 @@ static int sh_eth_poll(struct napi_struct *napi, int budget) | |||
| 1705 | napi_complete(napi); | 1758 | napi_complete(napi); |
| 1706 | 1759 | ||
| 1707 | /* Reenable Rx interrupts */ | 1760 | /* Reenable Rx interrupts */ |
| 1708 | sh_eth_write(ndev, mdp->cd->eesipr_value, EESIPR); | 1761 | if (mdp->irq_enabled) |
| 1762 | sh_eth_write(ndev, mdp->cd->eesipr_value, EESIPR); | ||
| 1709 | out: | 1763 | out: |
| 1710 | return budget - quota; | 1764 | return budget - quota; |
| 1711 | } | 1765 | } |
| @@ -1820,6 +1874,9 @@ static int sh_eth_get_settings(struct net_device *ndev, | |||
| 1820 | unsigned long flags; | 1874 | unsigned long flags; |
| 1821 | int ret; | 1875 | int ret; |
| 1822 | 1876 | ||
| 1877 | if (!mdp->phydev) | ||
| 1878 | return -ENODEV; | ||
| 1879 | |||
| 1823 | spin_lock_irqsave(&mdp->lock, flags); | 1880 | spin_lock_irqsave(&mdp->lock, flags); |
| 1824 | ret = phy_ethtool_gset(mdp->phydev, ecmd); | 1881 | ret = phy_ethtool_gset(mdp->phydev, ecmd); |
| 1825 | spin_unlock_irqrestore(&mdp->lock, flags); | 1882 | spin_unlock_irqrestore(&mdp->lock, flags); |
| @@ -1834,6 +1891,9 @@ static int sh_eth_set_settings(struct net_device *ndev, | |||
| 1834 | unsigned long flags; | 1891 | unsigned long flags; |
| 1835 | int ret; | 1892 | int ret; |
| 1836 | 1893 | ||
| 1894 | if (!mdp->phydev) | ||
| 1895 | return -ENODEV; | ||
| 1896 | |||
| 1837 | spin_lock_irqsave(&mdp->lock, flags); | 1897 | spin_lock_irqsave(&mdp->lock, flags); |
| 1838 | 1898 | ||
| 1839 | /* disable tx and rx */ | 1899 | /* disable tx and rx */ |
| @@ -1868,6 +1928,9 @@ static int sh_eth_nway_reset(struct net_device *ndev) | |||
| 1868 | unsigned long flags; | 1928 | unsigned long flags; |
| 1869 | int ret; | 1929 | int ret; |
| 1870 | 1930 | ||
| 1931 | if (!mdp->phydev) | ||
| 1932 | return -ENODEV; | ||
| 1933 | |||
| 1871 | spin_lock_irqsave(&mdp->lock, flags); | 1934 | spin_lock_irqsave(&mdp->lock, flags); |
| 1872 | ret = phy_start_aneg(mdp->phydev); | 1935 | ret = phy_start_aneg(mdp->phydev); |
| 1873 | spin_unlock_irqrestore(&mdp->lock, flags); | 1936 | spin_unlock_irqrestore(&mdp->lock, flags); |
| @@ -1952,40 +2015,50 @@ static int sh_eth_set_ringparam(struct net_device *ndev, | |||
| 1952 | return -EINVAL; | 2015 | return -EINVAL; |
| 1953 | 2016 | ||
| 1954 | if (netif_running(ndev)) { | 2017 | if (netif_running(ndev)) { |
| 2018 | netif_device_detach(ndev); | ||
| 1955 | netif_tx_disable(ndev); | 2019 | netif_tx_disable(ndev); |
| 1956 | /* Disable interrupts by clearing the interrupt mask. */ | 2020 | |
| 1957 | sh_eth_write(ndev, 0x0000, EESIPR); | 2021 | /* Serialise with the interrupt handler and NAPI, then |
| 1958 | /* Stop the chip's Tx and Rx processes. */ | 2022 | * disable interrupts. We have to clear the |
| 1959 | sh_eth_write(ndev, 0, EDTRR); | 2023 | * irq_enabled flag first to ensure that interrupts |
| 1960 | sh_eth_write(ndev, 0, EDRRR); | 2024 | * won't be re-enabled. |
| 2025 | */ | ||
| 2026 | mdp->irq_enabled = false; | ||
| 1961 | synchronize_irq(ndev->irq); | 2027 | synchronize_irq(ndev->irq); |
| 1962 | } | 2028 | napi_synchronize(&mdp->napi); |
| 2029 | sh_eth_write(ndev, 0x0000, EESIPR); | ||
| 1963 | 2030 | ||
| 1964 | /* Free all the skbuffs in the Rx queue. */ | 2031 | sh_eth_dev_exit(ndev); |
| 1965 | sh_eth_ring_free(ndev); | 2032 | |
| 1966 | /* Free DMA buffer */ | 2033 | /* Free all the skbuffs in the Rx queue. */ |
| 1967 | sh_eth_free_dma_buffer(mdp); | 2034 | sh_eth_ring_free(ndev); |
| 2035 | /* Free DMA buffer */ | ||
| 2036 | sh_eth_free_dma_buffer(mdp); | ||
| 2037 | } | ||
| 1968 | 2038 | ||
| 1969 | /* Set new parameters */ | 2039 | /* Set new parameters */ |
| 1970 | mdp->num_rx_ring = ring->rx_pending; | 2040 | mdp->num_rx_ring = ring->rx_pending; |
| 1971 | mdp->num_tx_ring = ring->tx_pending; | 2041 | mdp->num_tx_ring = ring->tx_pending; |
| 1972 | 2042 | ||
| 1973 | ret = sh_eth_ring_init(ndev); | ||
| 1974 | if (ret < 0) { | ||
| 1975 | netdev_err(ndev, "%s: sh_eth_ring_init failed.\n", __func__); | ||
| 1976 | return ret; | ||
| 1977 | } | ||
| 1978 | ret = sh_eth_dev_init(ndev, false); | ||
| 1979 | if (ret < 0) { | ||
| 1980 | netdev_err(ndev, "%s: sh_eth_dev_init failed.\n", __func__); | ||
| 1981 | return ret; | ||
| 1982 | } | ||
| 1983 | |||
| 1984 | 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; | ||
| 1985 | sh_eth_write(ndev, mdp->cd->eesipr_value, EESIPR); | 2058 | sh_eth_write(ndev, mdp->cd->eesipr_value, EESIPR); |
| 1986 | /* Setting the Rx mode will start the Rx process. */ | 2059 | /* Setting the Rx mode will start the Rx process. */ |
| 1987 | sh_eth_write(ndev, EDRRR_R, EDRRR); | 2060 | sh_eth_write(ndev, EDRRR_R, EDRRR); |
| 1988 | netif_wake_queue(ndev); | 2061 | netif_device_attach(ndev); |
| 1989 | } | 2062 | } |
| 1990 | 2063 | ||
| 1991 | return 0; | 2064 | return 0; |
| @@ -2101,6 +2174,9 @@ static int sh_eth_start_xmit(struct sk_buff *skb, struct net_device *ndev) | |||
| 2101 | } | 2174 | } |
| 2102 | spin_unlock_irqrestore(&mdp->lock, flags); | 2175 | spin_unlock_irqrestore(&mdp->lock, flags); |
| 2103 | 2176 | ||
| 2177 | if (skb_padto(skb, ETH_ZLEN)) | ||
| 2178 | return NETDEV_TX_OK; | ||
| 2179 | |||
| 2104 | entry = mdp->cur_tx % mdp->num_tx_ring; | 2180 | entry = mdp->cur_tx % mdp->num_tx_ring; |
| 2105 | mdp->tx_skbuff[entry] = skb; | 2181 | mdp->tx_skbuff[entry] = skb; |
| 2106 | txdesc = &mdp->tx_ring[entry]; | 2182 | txdesc = &mdp->tx_ring[entry]; |
| @@ -2110,10 +2186,11 @@ static int sh_eth_start_xmit(struct sk_buff *skb, struct net_device *ndev) | |||
| 2110 | skb->len + 2); | 2186 | skb->len + 2); |
| 2111 | txdesc->addr = dma_map_single(&ndev->dev, skb->data, skb->len, | 2187 | txdesc->addr = dma_map_single(&ndev->dev, skb->data, skb->len, |
| 2112 | DMA_TO_DEVICE); | 2188 | DMA_TO_DEVICE); |
| 2113 | if (skb->len < ETH_ZLEN) | 2189 | if (dma_mapping_error(&ndev->dev, txdesc->addr)) { |
| 2114 | txdesc->buffer_length = ETH_ZLEN; | 2190 | kfree_skb(skb); |
| 2115 | else | 2191 | return NETDEV_TX_OK; |
| 2116 | txdesc->buffer_length = skb->len; | 2192 | } |
| 2193 | txdesc->buffer_length = skb->len; | ||
| 2117 | 2194 | ||
| 2118 | if (entry >= mdp->num_tx_ring - 1) | 2195 | if (entry >= mdp->num_tx_ring - 1) |
| 2119 | txdesc->status |= cpu_to_edmac(mdp, TD_TACT | TD_TDLE); | 2196 | txdesc->status |= cpu_to_edmac(mdp, TD_TACT | TD_TDLE); |
| @@ -2165,24 +2242,26 @@ static int sh_eth_close(struct net_device *ndev) | |||
| 2165 | 2242 | ||
| 2166 | netif_stop_queue(ndev); | 2243 | netif_stop_queue(ndev); |
| 2167 | 2244 | ||
| 2168 | /* 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); | ||
| 2169 | sh_eth_write(ndev, 0x0000, EESIPR); | 2252 | sh_eth_write(ndev, 0x0000, EESIPR); |
| 2170 | 2253 | ||
| 2171 | /* Stop the chip's Tx and Rx processes. */ | 2254 | sh_eth_dev_exit(ndev); |
| 2172 | sh_eth_write(ndev, 0, EDTRR); | ||
| 2173 | sh_eth_write(ndev, 0, EDRRR); | ||
| 2174 | 2255 | ||
| 2175 | sh_eth_get_stats(ndev); | ||
| 2176 | /* PHY Disconnect */ | 2256 | /* PHY Disconnect */ |
| 2177 | if (mdp->phydev) { | 2257 | if (mdp->phydev) { |
| 2178 | phy_stop(mdp->phydev); | 2258 | phy_stop(mdp->phydev); |
| 2179 | phy_disconnect(mdp->phydev); | 2259 | phy_disconnect(mdp->phydev); |
| 2260 | mdp->phydev = NULL; | ||
| 2180 | } | 2261 | } |
| 2181 | 2262 | ||
| 2182 | free_irq(ndev->irq, ndev); | 2263 | free_irq(ndev->irq, ndev); |
| 2183 | 2264 | ||
| 2184 | napi_disable(&mdp->napi); | ||
| 2185 | |||
| 2186 | /* Free all the skbuffs in the Rx queue. */ | 2265 | /* Free all the skbuffs in the Rx queue. */ |
| 2187 | sh_eth_ring_free(ndev); | 2266 | sh_eth_ring_free(ndev); |
| 2188 | 2267 | ||
| @@ -2410,7 +2489,7 @@ static int sh_eth_tsu_purge_all(struct net_device *ndev) | |||
| 2410 | struct sh_eth_private *mdp = netdev_priv(ndev); | 2489 | struct sh_eth_private *mdp = netdev_priv(ndev); |
| 2411 | int i, ret; | 2490 | int i, ret; |
| 2412 | 2491 | ||
| 2413 | if (unlikely(!mdp->cd->tsu)) | 2492 | if (!mdp->cd->tsu) |
| 2414 | return 0; | 2493 | return 0; |
| 2415 | 2494 | ||
| 2416 | for (i = 0; i < SH_ETH_TSU_CAM_ENTRIES; i++) { | 2495 | for (i = 0; i < SH_ETH_TSU_CAM_ENTRIES; i++) { |
| @@ -2433,7 +2512,7 @@ static void sh_eth_tsu_purge_mcast(struct net_device *ndev) | |||
| 2433 | void *reg_offset = sh_eth_tsu_get_offset(mdp, TSU_ADRH0); | 2512 | void *reg_offset = sh_eth_tsu_get_offset(mdp, TSU_ADRH0); |
| 2434 | int i; | 2513 | int i; |
| 2435 | 2514 | ||
| 2436 | if (unlikely(!mdp->cd->tsu)) | 2515 | if (!mdp->cd->tsu) |
| 2437 | return; | 2516 | return; |
| 2438 | 2517 | ||
| 2439 | 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) { |
| @@ -2443,8 +2522,8 @@ static void sh_eth_tsu_purge_mcast(struct net_device *ndev) | |||
| 2443 | } | 2522 | } |
| 2444 | } | 2523 | } |
| 2445 | 2524 | ||
| 2446 | /* Multicast reception directions set */ | 2525 | /* Update promiscuous flag and multicast filter */ |
| 2447 | static void sh_eth_set_multicast_list(struct net_device *ndev) | 2526 | static void sh_eth_set_rx_mode(struct net_device *ndev) |
| 2448 | { | 2527 | { |
| 2449 | struct sh_eth_private *mdp = netdev_priv(ndev); | 2528 | struct sh_eth_private *mdp = netdev_priv(ndev); |
| 2450 | u32 ecmr_bits; | 2529 | u32 ecmr_bits; |
| @@ -2455,7 +2534,9 @@ static void sh_eth_set_multicast_list(struct net_device *ndev) | |||
| 2455 | /* Initial condition is MCT = 1, PRM = 0. | 2534 | /* Initial condition is MCT = 1, PRM = 0. |
| 2456 | * Depending on ndev->flags, set PRM or clear MCT | 2535 | * Depending on ndev->flags, set PRM or clear MCT |
| 2457 | */ | 2536 | */ |
| 2458 | 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; | ||
| 2459 | 2540 | ||
| 2460 | if (!(ndev->flags & IFF_MULTICAST)) { | 2541 | if (!(ndev->flags & IFF_MULTICAST)) { |
| 2461 | sh_eth_tsu_purge_mcast(ndev); | 2542 | sh_eth_tsu_purge_mcast(ndev); |
| @@ -2484,9 +2565,6 @@ static void sh_eth_set_multicast_list(struct net_device *ndev) | |||
| 2484 | } | 2565 | } |
| 2485 | } | 2566 | } |
| 2486 | } | 2567 | } |
| 2487 | } else { | ||
| 2488 | /* Normal, unicast/broadcast-only mode. */ | ||
| 2489 | ecmr_bits = (ecmr_bits & ~ECMR_PRM) | ECMR_MCT; | ||
| 2490 | } | 2568 | } |
| 2491 | 2569 | ||
| 2492 | /* update the ethernet mode */ | 2570 | /* update the ethernet mode */ |
| @@ -2694,6 +2772,7 @@ static const struct net_device_ops sh_eth_netdev_ops = { | |||
| 2694 | .ndo_stop = sh_eth_close, | 2772 | .ndo_stop = sh_eth_close, |
| 2695 | .ndo_start_xmit = sh_eth_start_xmit, | 2773 | .ndo_start_xmit = sh_eth_start_xmit, |
| 2696 | .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, | ||
| 2697 | .ndo_tx_timeout = sh_eth_tx_timeout, | 2776 | .ndo_tx_timeout = sh_eth_tx_timeout, |
| 2698 | .ndo_do_ioctl = sh_eth_do_ioctl, | 2777 | .ndo_do_ioctl = sh_eth_do_ioctl, |
| 2699 | .ndo_validate_addr = eth_validate_addr, | 2778 | .ndo_validate_addr = eth_validate_addr, |
| @@ -2706,7 +2785,7 @@ static const struct net_device_ops sh_eth_netdev_ops_tsu = { | |||
| 2706 | .ndo_stop = sh_eth_close, | 2785 | .ndo_stop = sh_eth_close, |
| 2707 | .ndo_start_xmit = sh_eth_start_xmit, | 2786 | .ndo_start_xmit = sh_eth_start_xmit, |
| 2708 | .ndo_get_stats = sh_eth_get_stats, | 2787 | .ndo_get_stats = sh_eth_get_stats, |
| 2709 | .ndo_set_rx_mode = sh_eth_set_multicast_list, | 2788 | .ndo_set_rx_mode = sh_eth_set_rx_mode, |
| 2710 | .ndo_vlan_rx_add_vid = sh_eth_vlan_rx_add_vid, | 2789 | .ndo_vlan_rx_add_vid = sh_eth_vlan_rx_add_vid, |
| 2711 | .ndo_vlan_rx_kill_vid = sh_eth_vlan_rx_kill_vid, | 2790 | .ndo_vlan_rx_kill_vid = sh_eth_vlan_rx_kill_vid, |
| 2712 | .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 22301bf9c21d..332d3c16d483 100644 --- a/drivers/net/ethernet/renesas/sh_eth.h +++ b/drivers/net/ethernet/renesas/sh_eth.h | |||
| @@ -369,6 +369,8 @@ enum DESC_I_BIT { | |||
| 369 | DESC_I_RINT1 = 0x0001, | 369 | DESC_I_RINT1 = 0x0001, |
| 370 | }; | 370 | }; |
| 371 | 371 | ||
| 372 | #define DEFAULT_TRSCER_ERR_MASK (DESC_I_RINT8 | DESC_I_RINT5 | DESC_I_TINT2) | ||
| 373 | |||
| 372 | /* RPADIR */ | 374 | /* RPADIR */ |
| 373 | enum RPADIR_BIT { | 375 | enum RPADIR_BIT { |
| 374 | RPADIR_PADS1 = 0x20000, RPADIR_PADS0 = 0x10000, | 376 | RPADIR_PADS1 = 0x20000, RPADIR_PADS0 = 0x10000, |
| @@ -470,6 +472,9 @@ struct sh_eth_cpu_data { | |||
| 470 | unsigned long tx_check; | 472 | unsigned long tx_check; |
| 471 | unsigned long eesr_err_check; | 473 | unsigned long eesr_err_check; |
| 472 | 474 | ||
| 475 | /* Error mask */ | ||
| 476 | unsigned long trscer_err_mask; | ||
| 477 | |||
| 473 | /* hardware features */ | 478 | /* hardware features */ |
| 474 | unsigned long irq_flags; /* IRQ configuration flags */ | 479 | unsigned long irq_flags; /* IRQ configuration flags */ |
| 475 | unsigned no_psr:1; /* EtherC DO NOT have PSR */ | 480 | unsigned no_psr:1; /* EtherC DO NOT have PSR */ |
| @@ -508,6 +513,7 @@ struct sh_eth_private { | |||
| 508 | u32 rx_buf_sz; /* Based on MTU+slack. */ | 513 | u32 rx_buf_sz; /* Based on MTU+slack. */ |
| 509 | int edmac_endian; | 514 | int edmac_endian; |
| 510 | struct napi_struct napi; | 515 | struct napi_struct napi; |
| 516 | bool irq_enabled; | ||
| 511 | /* MII transceiver section. */ | 517 | /* MII transceiver section. */ |
| 512 | u32 phy_id; /* PHY ID */ | 518 | u32 phy_id; /* PHY ID */ |
| 513 | 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 698494481d18..b1a271853d85 100644 --- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c +++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c | |||
| @@ -474,13 +474,19 @@ static int init_rx_ring(struct net_device *dev, u8 queue_no, | |||
| 474 | /* allocate memory for RX skbuff array */ | 474 | /* allocate memory for RX skbuff array */ |
| 475 | rx_ring->rx_skbuff_dma = kmalloc_array(rx_rsize, | 475 | rx_ring->rx_skbuff_dma = kmalloc_array(rx_rsize, |
| 476 | sizeof(dma_addr_t), GFP_KERNEL); | 476 | sizeof(dma_addr_t), GFP_KERNEL); |
| 477 | if (rx_ring->rx_skbuff_dma == NULL) | 477 | if (!rx_ring->rx_skbuff_dma) { |
| 478 | goto dmamem_err; | 478 | dma_free_coherent(priv->device, |
| 479 | rx_rsize * sizeof(struct sxgbe_rx_norm_desc), | ||
| 480 | rx_ring->dma_rx, rx_ring->dma_rx_phy); | ||
| 481 | goto error; | ||
| 482 | } | ||
| 479 | 483 | ||
| 480 | rx_ring->rx_skbuff = kmalloc_array(rx_rsize, | 484 | rx_ring->rx_skbuff = kmalloc_array(rx_rsize, |
| 481 | sizeof(struct sk_buff *), GFP_KERNEL); | 485 | sizeof(struct sk_buff *), GFP_KERNEL); |
| 482 | if (rx_ring->rx_skbuff == NULL) | 486 | if (!rx_ring->rx_skbuff) { |
| 483 | goto rxbuff_err; | 487 | kfree(rx_ring->rx_skbuff_dma); |
| 488 | goto error; | ||
| 489 | } | ||
| 484 | 490 | ||
| 485 | /* initialise the buffers */ | 491 | /* initialise the buffers */ |
| 486 | for (desc_index = 0; desc_index < rx_rsize; desc_index++) { | 492 | for (desc_index = 0; desc_index < rx_rsize; desc_index++) { |
| @@ -502,13 +508,6 @@ static int init_rx_ring(struct net_device *dev, u8 queue_no, | |||
| 502 | err_init_rx_buffers: | 508 | err_init_rx_buffers: |
| 503 | while (--desc_index >= 0) | 509 | while (--desc_index >= 0) |
| 504 | free_rx_ring(priv->device, rx_ring, desc_index); | 510 | free_rx_ring(priv->device, rx_ring, desc_index); |
| 505 | kfree(rx_ring->rx_skbuff); | ||
| 506 | rxbuff_err: | ||
| 507 | kfree(rx_ring->rx_skbuff_dma); | ||
| 508 | dmamem_err: | ||
| 509 | dma_free_coherent(priv->device, | ||
| 510 | rx_rsize * sizeof(struct sxgbe_rx_norm_desc), | ||
| 511 | rx_ring->dma_rx, rx_ring->dma_rx_phy); | ||
| 512 | error: | 511 | error: |
| 513 | return -ENOMEM; | 512 | return -ENOMEM; |
| 514 | } | 513 | } |
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 8c6b7c1651e5..cf62ff4c8c56 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | |||
| @@ -2778,6 +2778,9 @@ static int stmmac_hw_init(struct stmmac_priv *priv) | |||
| 2778 | * @addr: iobase memory address | 2778 | * @addr: iobase memory address |
| 2779 | * Description: this is the main probe function used to | 2779 | * Description: this is the main probe function used to |
| 2780 | * call the alloc_etherdev, allocate the priv structure. | 2780 | * call the alloc_etherdev, allocate the priv structure. |
| 2781 | * Return: | ||
| 2782 | * on success the new private structure is returned, otherwise the error | ||
| 2783 | * pointer. | ||
| 2781 | */ | 2784 | */ |
| 2782 | struct stmmac_priv *stmmac_dvr_probe(struct device *device, | 2785 | struct stmmac_priv *stmmac_dvr_probe(struct device *device, |
| 2783 | struct plat_stmmacenet_data *plat_dat, | 2786 | struct plat_stmmacenet_data *plat_dat, |
| @@ -2789,7 +2792,7 @@ struct stmmac_priv *stmmac_dvr_probe(struct device *device, | |||
| 2789 | 2792 | ||
| 2790 | ndev = alloc_etherdev(sizeof(struct stmmac_priv)); | 2793 | ndev = alloc_etherdev(sizeof(struct stmmac_priv)); |
| 2791 | if (!ndev) | 2794 | if (!ndev) |
| 2792 | return NULL; | 2795 | return ERR_PTR(-ENOMEM); |
| 2793 | 2796 | ||
| 2794 | SET_NETDEV_DEV(ndev, device); | 2797 | SET_NETDEV_DEV(ndev, device); |
| 2795 | 2798 | ||
diff --git a/drivers/net/ethernet/sun/sunvnet.c b/drivers/net/ethernet/sun/sunvnet.c index d2835bf7b4fb..3699b98d5b2c 100644 --- a/drivers/net/ethernet/sun/sunvnet.c +++ b/drivers/net/ethernet/sun/sunvnet.c | |||
| @@ -1119,6 +1119,7 @@ static inline struct sk_buff *vnet_skb_shape(struct sk_buff *skb, int ncookies) | |||
| 1119 | skb_shinfo(nskb)->gso_size = skb_shinfo(skb)->gso_size; | 1119 | skb_shinfo(nskb)->gso_size = skb_shinfo(skb)->gso_size; |
| 1120 | skb_shinfo(nskb)->gso_type = skb_shinfo(skb)->gso_type; | 1120 | skb_shinfo(nskb)->gso_type = skb_shinfo(skb)->gso_type; |
| 1121 | } | 1121 | } |
| 1122 | nskb->queue_mapping = skb->queue_mapping; | ||
| 1122 | dev_kfree_skb(skb); | 1123 | dev_kfree_skb(skb); |
| 1123 | skb = nskb; | 1124 | skb = nskb; |
| 1124 | } | 1125 | } |
diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c index c560f9aeb55d..a39131f494ec 100644 --- a/drivers/net/ethernet/ti/cpsw.c +++ b/drivers/net/ethernet/ti/cpsw.c | |||
| @@ -610,7 +610,7 @@ static void cpsw_set_promiscious(struct net_device *ndev, bool enable) | |||
| 610 | 610 | ||
| 611 | /* Clear all mcast from ALE */ | 611 | /* Clear all mcast from ALE */ |
| 612 | cpsw_ale_flush_multicast(ale, ALE_ALL_PORTS << | 612 | cpsw_ale_flush_multicast(ale, ALE_ALL_PORTS << |
| 613 | priv->host_port); | 613 | priv->host_port, -1); |
| 614 | 614 | ||
| 615 | /* Flood All Unicast Packets to Host port */ | 615 | /* Flood All Unicast Packets to Host port */ |
| 616 | cpsw_ale_control_set(ale, 0, ALE_P0_UNI_FLOOD, 1); | 616 | cpsw_ale_control_set(ale, 0, ALE_P0_UNI_FLOOD, 1); |
| @@ -634,6 +634,12 @@ static void cpsw_set_promiscious(struct net_device *ndev, bool enable) | |||
| 634 | static void cpsw_ndo_set_rx_mode(struct net_device *ndev) | 634 | static void cpsw_ndo_set_rx_mode(struct net_device *ndev) |
| 635 | { | 635 | { |
| 636 | struct cpsw_priv *priv = netdev_priv(ndev); | 636 | struct cpsw_priv *priv = netdev_priv(ndev); |
| 637 | int vid; | ||
| 638 | |||
| 639 | if (priv->data.dual_emac) | ||
| 640 | vid = priv->slaves[priv->emac_port].port_vlan; | ||
| 641 | else | ||
| 642 | vid = priv->data.default_vlan; | ||
| 637 | 643 | ||
| 638 | if (ndev->flags & IFF_PROMISC) { | 644 | if (ndev->flags & IFF_PROMISC) { |
| 639 | /* Enable promiscuous mode */ | 645 | /* Enable promiscuous mode */ |
| @@ -649,7 +655,8 @@ static void cpsw_ndo_set_rx_mode(struct net_device *ndev) | |||
| 649 | cpsw_ale_set_allmulti(priv->ale, priv->ndev->flags & IFF_ALLMULTI); | 655 | cpsw_ale_set_allmulti(priv->ale, priv->ndev->flags & IFF_ALLMULTI); |
| 650 | 656 | ||
| 651 | /* Clear all mcast from ALE */ | 657 | /* Clear all mcast from ALE */ |
| 652 | cpsw_ale_flush_multicast(priv->ale, ALE_ALL_PORTS << priv->host_port); | 658 | cpsw_ale_flush_multicast(priv->ale, ALE_ALL_PORTS << priv->host_port, |
| 659 | vid); | ||
| 653 | 660 | ||
| 654 | if (!netdev_mc_empty(ndev)) { | 661 | if (!netdev_mc_empty(ndev)) { |
| 655 | struct netdev_hw_addr *ha; | 662 | struct netdev_hw_addr *ha; |
| @@ -757,6 +764,14 @@ requeue: | |||
| 757 | static irqreturn_t cpsw_interrupt(int irq, void *dev_id) | 764 | static irqreturn_t cpsw_interrupt(int irq, void *dev_id) |
| 758 | { | 765 | { |
| 759 | struct cpsw_priv *priv = dev_id; | 766 | struct cpsw_priv *priv = dev_id; |
| 767 | int value = irq - priv->irqs_table[0]; | ||
| 768 | |||
| 769 | /* NOTICE: Ending IRQ here. The trick with the 'value' variable above | ||
| 770 | * is to make sure we will always write the correct value to the EOI | ||
| 771 | * register. Namely 0 for RX_THRESH Interrupt, 1 for RX Interrupt, 2 | ||
| 772 | * for TX Interrupt and 3 for MISC Interrupt. | ||
| 773 | */ | ||
| 774 | cpdma_ctlr_eoi(priv->dma, value); | ||
| 760 | 775 | ||
| 761 | cpsw_intr_disable(priv); | 776 | cpsw_intr_disable(priv); |
| 762 | if (priv->irq_enabled == true) { | 777 | if (priv->irq_enabled == true) { |
| @@ -786,8 +801,6 @@ static int cpsw_poll(struct napi_struct *napi, int budget) | |||
| 786 | int num_tx, num_rx; | 801 | int num_tx, num_rx; |
| 787 | 802 | ||
| 788 | num_tx = cpdma_chan_process(priv->txch, 128); | 803 | num_tx = cpdma_chan_process(priv->txch, 128); |
| 789 | if (num_tx) | ||
| 790 | cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_TX); | ||
| 791 | 804 | ||
| 792 | num_rx = cpdma_chan_process(priv->rxch, budget); | 805 | num_rx = cpdma_chan_process(priv->rxch, budget); |
| 793 | if (num_rx < budget) { | 806 | if (num_rx < budget) { |
| @@ -795,7 +808,6 @@ static int cpsw_poll(struct napi_struct *napi, int budget) | |||
| 795 | 808 | ||
| 796 | napi_complete(napi); | 809 | napi_complete(napi); |
| 797 | cpsw_intr_enable(priv); | 810 | cpsw_intr_enable(priv); |
| 798 | cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_RX); | ||
| 799 | prim_cpsw = cpsw_get_slave_priv(priv, 0); | 811 | prim_cpsw = cpsw_get_slave_priv(priv, 0); |
| 800 | if (prim_cpsw->irq_enabled == false) { | 812 | if (prim_cpsw->irq_enabled == false) { |
| 801 | prim_cpsw->irq_enabled = true; | 813 | prim_cpsw->irq_enabled = true; |
| @@ -1310,8 +1322,6 @@ static int cpsw_ndo_open(struct net_device *ndev) | |||
| 1310 | napi_enable(&priv->napi); | 1322 | napi_enable(&priv->napi); |
| 1311 | cpdma_ctlr_start(priv->dma); | 1323 | cpdma_ctlr_start(priv->dma); |
| 1312 | cpsw_intr_enable(priv); | 1324 | cpsw_intr_enable(priv); |
| 1313 | cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_RX); | ||
| 1314 | cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_TX); | ||
| 1315 | 1325 | ||
| 1316 | prim_cpsw = cpsw_get_slave_priv(priv, 0); | 1326 | prim_cpsw = cpsw_get_slave_priv(priv, 0); |
| 1317 | if (prim_cpsw->irq_enabled == false) { | 1327 | if (prim_cpsw->irq_enabled == false) { |
| @@ -1578,9 +1588,6 @@ static void cpsw_ndo_tx_timeout(struct net_device *ndev) | |||
| 1578 | cpdma_chan_start(priv->txch); | 1588 | cpdma_chan_start(priv->txch); |
| 1579 | cpdma_ctlr_int_ctrl(priv->dma, true); | 1589 | cpdma_ctlr_int_ctrl(priv->dma, true); |
| 1580 | cpsw_intr_enable(priv); | 1590 | cpsw_intr_enable(priv); |
| 1581 | cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_RX); | ||
| 1582 | cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_TX); | ||
| 1583 | |||
| 1584 | } | 1591 | } |
| 1585 | 1592 | ||
| 1586 | static int cpsw_ndo_set_mac_address(struct net_device *ndev, void *p) | 1593 | static int cpsw_ndo_set_mac_address(struct net_device *ndev, void *p) |
| @@ -1620,9 +1627,6 @@ static void cpsw_ndo_poll_controller(struct net_device *ndev) | |||
| 1620 | cpsw_interrupt(ndev->irq, priv); | 1627 | cpsw_interrupt(ndev->irq, priv); |
| 1621 | cpdma_ctlr_int_ctrl(priv->dma, true); | 1628 | cpdma_ctlr_int_ctrl(priv->dma, true); |
| 1622 | cpsw_intr_enable(priv); | 1629 | cpsw_intr_enable(priv); |
| 1623 | cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_RX); | ||
| 1624 | cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_TX); | ||
| 1625 | |||
| 1626 | } | 1630 | } |
| 1627 | #endif | 1631 | #endif |
| 1628 | 1632 | ||
| @@ -1630,16 +1634,24 @@ static inline int cpsw_add_vlan_ale_entry(struct cpsw_priv *priv, | |||
| 1630 | unsigned short vid) | 1634 | unsigned short vid) |
| 1631 | { | 1635 | { |
| 1632 | int ret; | 1636 | int ret; |
| 1633 | int unreg_mcast_mask; | 1637 | int unreg_mcast_mask = 0; |
| 1638 | u32 port_mask; | ||
| 1634 | 1639 | ||
| 1635 | if (priv->ndev->flags & IFF_ALLMULTI) | 1640 | if (priv->data.dual_emac) { |
| 1636 | unreg_mcast_mask = ALE_ALL_PORTS; | 1641 | port_mask = (1 << (priv->emac_port + 1)) | ALE_PORT_HOST; |
| 1637 | else | 1642 | |
| 1638 | unreg_mcast_mask = ALE_PORT_1 | ALE_PORT_2; | 1643 | if (priv->ndev->flags & IFF_ALLMULTI) |
| 1644 | unreg_mcast_mask = port_mask; | ||
| 1645 | } else { | ||
| 1646 | port_mask = ALE_ALL_PORTS; | ||
| 1639 | 1647 | ||
| 1640 | ret = cpsw_ale_add_vlan(priv->ale, vid, | 1648 | if (priv->ndev->flags & IFF_ALLMULTI) |
| 1641 | ALE_ALL_PORTS << priv->host_port, | 1649 | unreg_mcast_mask = ALE_ALL_PORTS; |
| 1642 | 0, ALE_ALL_PORTS << priv->host_port, | 1650 | else |
| 1651 | unreg_mcast_mask = ALE_PORT_1 | ALE_PORT_2; | ||
| 1652 | } | ||
| 1653 | |||
| 1654 | ret = cpsw_ale_add_vlan(priv->ale, vid, port_mask, 0, port_mask, | ||
| 1643 | unreg_mcast_mask << priv->host_port); | 1655 | unreg_mcast_mask << priv->host_port); |
| 1644 | if (ret != 0) | 1656 | if (ret != 0) |
| 1645 | return ret; | 1657 | return ret; |
| @@ -1650,8 +1662,7 @@ static inline int cpsw_add_vlan_ale_entry(struct cpsw_priv *priv, | |||
| 1650 | goto clean_vid; | 1662 | goto clean_vid; |
| 1651 | 1663 | ||
| 1652 | ret = cpsw_ale_add_mcast(priv->ale, priv->ndev->broadcast, | 1664 | ret = cpsw_ale_add_mcast(priv->ale, priv->ndev->broadcast, |
| 1653 | ALE_ALL_PORTS << priv->host_port, | 1665 | port_mask, ALE_VLAN, vid, 0); |
| 1654 | ALE_VLAN, vid, 0); | ||
| 1655 | if (ret != 0) | 1666 | if (ret != 0) |
| 1656 | goto clean_vlan_ucast; | 1667 | goto clean_vlan_ucast; |
| 1657 | return 0; | 1668 | return 0; |
| @@ -1672,6 +1683,19 @@ static int cpsw_ndo_vlan_rx_add_vid(struct net_device *ndev, | |||
| 1672 | if (vid == priv->data.default_vlan) | 1683 | if (vid == priv->data.default_vlan) |
| 1673 | return 0; | 1684 | return 0; |
| 1674 | 1685 | ||
| 1686 | if (priv->data.dual_emac) { | ||
| 1687 | /* In dual EMAC, reserved VLAN id should not be used for | ||
| 1688 | * creating VLAN interfaces as this can break the dual | ||
| 1689 | * EMAC port separation | ||
| 1690 | */ | ||
| 1691 | int i; | ||
| 1692 | |||
| 1693 | for (i = 0; i < priv->data.slaves; i++) { | ||
| 1694 | if (vid == priv->slaves[i].port_vlan) | ||
| 1695 | return -EINVAL; | ||
| 1696 | } | ||
| 1697 | } | ||
| 1698 | |||
| 1675 | dev_info(priv->dev, "Adding vlanid %d to vlan filter\n", vid); | 1699 | dev_info(priv->dev, "Adding vlanid %d to vlan filter\n", vid); |
| 1676 | return cpsw_add_vlan_ale_entry(priv, vid); | 1700 | return cpsw_add_vlan_ale_entry(priv, vid); |
| 1677 | } | 1701 | } |
| @@ -1685,6 +1709,15 @@ static int cpsw_ndo_vlan_rx_kill_vid(struct net_device *ndev, | |||
| 1685 | if (vid == priv->data.default_vlan) | 1709 | if (vid == priv->data.default_vlan) |
| 1686 | return 0; | 1710 | return 0; |
| 1687 | 1711 | ||
| 1712 | if (priv->data.dual_emac) { | ||
| 1713 | int i; | ||
| 1714 | |||
| 1715 | for (i = 0; i < priv->data.slaves; i++) { | ||
| 1716 | if (vid == priv->slaves[i].port_vlan) | ||
| 1717 | return -EINVAL; | ||
| 1718 | } | ||
| 1719 | } | ||
| 1720 | |||
| 1688 | dev_info(priv->dev, "removing vlanid %d from vlan filter\n", vid); | 1721 | dev_info(priv->dev, "removing vlanid %d from vlan filter\n", vid); |
| 1689 | ret = cpsw_ale_del_vlan(priv->ale, vid, 0); | 1722 | ret = cpsw_ale_del_vlan(priv->ale, vid, 0); |
| 1690 | if (ret != 0) | 1723 | if (ret != 0) |
diff --git a/drivers/net/ethernet/ti/cpsw_ale.c b/drivers/net/ethernet/ti/cpsw_ale.c index 097ebe7077ac..5246b3a18ff8 100644 --- a/drivers/net/ethernet/ti/cpsw_ale.c +++ b/drivers/net/ethernet/ti/cpsw_ale.c | |||
| @@ -234,7 +234,7 @@ static void cpsw_ale_flush_mcast(struct cpsw_ale *ale, u32 *ale_entry, | |||
| 234 | cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_FREE); | 234 | cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_FREE); |
| 235 | } | 235 | } |
| 236 | 236 | ||
| 237 | int cpsw_ale_flush_multicast(struct cpsw_ale *ale, int port_mask) | 237 | int cpsw_ale_flush_multicast(struct cpsw_ale *ale, int port_mask, int vid) |
| 238 | { | 238 | { |
| 239 | u32 ale_entry[ALE_ENTRY_WORDS]; | 239 | u32 ale_entry[ALE_ENTRY_WORDS]; |
| 240 | int ret, idx; | 240 | int ret, idx; |
| @@ -245,6 +245,14 @@ int cpsw_ale_flush_multicast(struct cpsw_ale *ale, int port_mask) | |||
| 245 | if (ret != ALE_TYPE_ADDR && ret != ALE_TYPE_VLAN_ADDR) | 245 | if (ret != ALE_TYPE_ADDR && ret != ALE_TYPE_VLAN_ADDR) |
| 246 | continue; | 246 | continue; |
| 247 | 247 | ||
| 248 | /* if vid passed is -1 then remove all multicast entry from | ||
| 249 | * the table irrespective of vlan id, if a valid vlan id is | ||
| 250 | * passed then remove only multicast added to that vlan id. | ||
| 251 | * if vlan id doesn't match then move on to next entry. | ||
| 252 | */ | ||
| 253 | if (vid != -1 && cpsw_ale_get_vlan_id(ale_entry) != vid) | ||
| 254 | continue; | ||
| 255 | |||
| 248 | if (cpsw_ale_get_mcast(ale_entry)) { | 256 | if (cpsw_ale_get_mcast(ale_entry)) { |
| 249 | u8 addr[6]; | 257 | u8 addr[6]; |
| 250 | 258 | ||
diff --git a/drivers/net/ethernet/ti/cpsw_ale.h b/drivers/net/ethernet/ti/cpsw_ale.h index c0d4127aa549..af1e7ecd87c6 100644 --- a/drivers/net/ethernet/ti/cpsw_ale.h +++ b/drivers/net/ethernet/ti/cpsw_ale.h | |||
| @@ -92,7 +92,7 @@ void cpsw_ale_stop(struct cpsw_ale *ale); | |||
| 92 | 92 | ||
| 93 | int cpsw_ale_set_ageout(struct cpsw_ale *ale, int ageout); | 93 | int cpsw_ale_set_ageout(struct cpsw_ale *ale, int ageout); |
| 94 | int cpsw_ale_flush(struct cpsw_ale *ale, int port_mask); | 94 | int cpsw_ale_flush(struct cpsw_ale *ale, int port_mask); |
| 95 | int cpsw_ale_flush_multicast(struct cpsw_ale *ale, int port_mask); | 95 | int cpsw_ale_flush_multicast(struct cpsw_ale *ale, int port_mask, int vid); |
| 96 | int cpsw_ale_add_ucast(struct cpsw_ale *ale, u8 *addr, int port, | 96 | int cpsw_ale_add_ucast(struct cpsw_ale *ale, u8 *addr, int port, |
| 97 | int flags, u16 vid); | 97 | int flags, u16 vid); |
| 98 | int cpsw_ale_del_ucast(struct cpsw_ale *ale, u8 *addr, int port, | 98 | int cpsw_ale_del_ucast(struct cpsw_ale *ale, u8 *addr, int port, |
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/ethernet/xilinx/ll_temac_main.c b/drivers/net/ethernet/xilinx/ll_temac_main.c index 9c2d91ea0af4..dbcbf0c5bcfa 100644 --- a/drivers/net/ethernet/xilinx/ll_temac_main.c +++ b/drivers/net/ethernet/xilinx/ll_temac_main.c | |||
| @@ -1043,6 +1043,7 @@ static int temac_of_probe(struct platform_device *op) | |||
| 1043 | lp->regs = of_iomap(op->dev.of_node, 0); | 1043 | lp->regs = of_iomap(op->dev.of_node, 0); |
| 1044 | if (!lp->regs) { | 1044 | if (!lp->regs) { |
| 1045 | dev_err(&op->dev, "could not map temac regs.\n"); | 1045 | dev_err(&op->dev, "could not map temac regs.\n"); |
| 1046 | rc = -ENOMEM; | ||
| 1046 | goto nodev; | 1047 | goto nodev; |
| 1047 | } | 1048 | } |
| 1048 | 1049 | ||
| @@ -1062,6 +1063,7 @@ static int temac_of_probe(struct platform_device *op) | |||
| 1062 | np = of_parse_phandle(op->dev.of_node, "llink-connected", 0); | 1063 | np = of_parse_phandle(op->dev.of_node, "llink-connected", 0); |
| 1063 | if (!np) { | 1064 | if (!np) { |
| 1064 | dev_err(&op->dev, "could not find DMA node\n"); | 1065 | dev_err(&op->dev, "could not find DMA node\n"); |
| 1066 | rc = -ENODEV; | ||
| 1065 | goto err_iounmap; | 1067 | goto err_iounmap; |
| 1066 | } | 1068 | } |
| 1067 | 1069 | ||
diff --git a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c index c18a0c637c44..a6d2860b712c 100644 --- a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c +++ b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c | |||
| @@ -1501,6 +1501,7 @@ static int axienet_of_probe(struct platform_device *op) | |||
| 1501 | lp->regs = of_iomap(op->dev.of_node, 0); | 1501 | lp->regs = of_iomap(op->dev.of_node, 0); |
| 1502 | if (!lp->regs) { | 1502 | if (!lp->regs) { |
| 1503 | dev_err(&op->dev, "could not map Axi Ethernet regs.\n"); | 1503 | dev_err(&op->dev, "could not map Axi Ethernet regs.\n"); |
| 1504 | ret = -ENOMEM; | ||
| 1504 | goto nodev; | 1505 | goto nodev; |
| 1505 | } | 1506 | } |
| 1506 | /* Setup checksum offload, but default to off if not specified */ | 1507 | /* Setup checksum offload, but default to off if not specified */ |
| @@ -1563,6 +1564,7 @@ static int axienet_of_probe(struct platform_device *op) | |||
| 1563 | np = of_parse_phandle(op->dev.of_node, "axistream-connected", 0); | 1564 | np = of_parse_phandle(op->dev.of_node, "axistream-connected", 0); |
| 1564 | if (!np) { | 1565 | if (!np) { |
| 1565 | dev_err(&op->dev, "could not find DMA node\n"); | 1566 | dev_err(&op->dev, "could not find DMA node\n"); |
| 1567 | ret = -ENODEV; | ||
| 1566 | goto err_iounmap; | 1568 | goto err_iounmap; |
| 1567 | } | 1569 | } |
| 1568 | lp->dma_regs = of_iomap(np, 0); | 1570 | lp->dma_regs = of_iomap(np, 0); |
diff --git a/drivers/net/ethernet/xilinx/xilinx_emaclite.c b/drivers/net/ethernet/xilinx/xilinx_emaclite.c index 24858799c204..9d4ce388510a 100644 --- a/drivers/net/ethernet/xilinx/xilinx_emaclite.c +++ b/drivers/net/ethernet/xilinx/xilinx_emaclite.c | |||
| @@ -1109,6 +1109,7 @@ static int xemaclite_of_probe(struct platform_device *ofdev) | |||
| 1109 | res = platform_get_resource(ofdev, IORESOURCE_IRQ, 0); | 1109 | res = platform_get_resource(ofdev, IORESOURCE_IRQ, 0); |
| 1110 | if (!res) { | 1110 | if (!res) { |
| 1111 | dev_err(dev, "no IRQ found\n"); | 1111 | dev_err(dev, "no IRQ found\n"); |
| 1112 | rc = -ENXIO; | ||
| 1112 | goto error; | 1113 | goto error; |
| 1113 | } | 1114 | } |
| 1114 | 1115 | ||
diff --git a/drivers/net/hyperv/netvsc.c b/drivers/net/hyperv/netvsc.c index 9f49c0129a78..7cd4eb38abfa 100644 --- a/drivers/net/hyperv/netvsc.c +++ b/drivers/net/hyperv/netvsc.c | |||
| @@ -716,7 +716,7 @@ int netvsc_send(struct hv_device *device, | |||
| 716 | u64 req_id; | 716 | u64 req_id; |
| 717 | unsigned int section_index = NETVSC_INVALID_INDEX; | 717 | unsigned int section_index = NETVSC_INVALID_INDEX; |
| 718 | u32 msg_size = 0; | 718 | u32 msg_size = 0; |
| 719 | struct sk_buff *skb; | 719 | struct sk_buff *skb = NULL; |
| 720 | u16 q_idx = packet->q_idx; | 720 | u16 q_idx = packet->q_idx; |
| 721 | 721 | ||
| 722 | 722 | ||
| @@ -743,8 +743,6 @@ int netvsc_send(struct hv_device *device, | |||
| 743 | packet); | 743 | packet); |
| 744 | skb = (struct sk_buff *) | 744 | skb = (struct sk_buff *) |
| 745 | (unsigned long)packet->send_completion_tid; | 745 | (unsigned long)packet->send_completion_tid; |
| 746 | if (skb) | ||
| 747 | dev_kfree_skb_any(skb); | ||
| 748 | packet->page_buf_cnt = 0; | 746 | packet->page_buf_cnt = 0; |
| 749 | } | 747 | } |
| 750 | } | 748 | } |
| @@ -810,6 +808,13 @@ int netvsc_send(struct hv_device *device, | |||
| 810 | packet, ret); | 808 | packet, ret); |
| 811 | } | 809 | } |
| 812 | 810 | ||
| 811 | if (ret != 0) { | ||
| 812 | if (section_index != NETVSC_INVALID_INDEX) | ||
| 813 | netvsc_free_send_slot(net_device, section_index); | ||
| 814 | } else if (skb) { | ||
| 815 | dev_kfree_skb_any(skb); | ||
| 816 | } | ||
| 817 | |||
| 813 | return ret; | 818 | return ret; |
| 814 | } | 819 | } |
| 815 | 820 | ||
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/macvtap.c b/drivers/net/macvtap.c index 7df221788cd4..919f4fccc322 100644 --- a/drivers/net/macvtap.c +++ b/drivers/net/macvtap.c | |||
| @@ -17,7 +17,6 @@ | |||
| 17 | #include <linux/fs.h> | 17 | #include <linux/fs.h> |
| 18 | #include <linux/uio.h> | 18 | #include <linux/uio.h> |
| 19 | 19 | ||
| 20 | #include <net/ipv6.h> | ||
| 21 | #include <net/net_namespace.h> | 20 | #include <net/net_namespace.h> |
| 22 | #include <net/rtnetlink.h> | 21 | #include <net/rtnetlink.h> |
| 23 | #include <net/sock.h> | 22 | #include <net/sock.h> |
| @@ -81,7 +80,7 @@ static struct cdev macvtap_cdev; | |||
| 81 | static const struct proto_ops macvtap_socket_ops; | 80 | static const struct proto_ops macvtap_socket_ops; |
| 82 | 81 | ||
| 83 | #define TUN_OFFLOADS (NETIF_F_HW_CSUM | NETIF_F_TSO_ECN | NETIF_F_TSO | \ | 82 | #define TUN_OFFLOADS (NETIF_F_HW_CSUM | NETIF_F_TSO_ECN | NETIF_F_TSO | \ |
| 84 | NETIF_F_TSO6) | 83 | NETIF_F_TSO6 | NETIF_F_UFO) |
| 85 | #define RX_OFFLOADS (NETIF_F_GRO | NETIF_F_LRO) | 84 | #define RX_OFFLOADS (NETIF_F_GRO | NETIF_F_LRO) |
| 86 | #define TAP_FEATURES (NETIF_F_GSO | NETIF_F_SG) | 85 | #define TAP_FEATURES (NETIF_F_GSO | NETIF_F_SG) |
| 87 | 86 | ||
| @@ -586,11 +585,7 @@ static int macvtap_skb_from_vnet_hdr(struct macvtap_queue *q, | |||
| 586 | gso_type = SKB_GSO_TCPV6; | 585 | gso_type = SKB_GSO_TCPV6; |
| 587 | break; | 586 | break; |
| 588 | case VIRTIO_NET_HDR_GSO_UDP: | 587 | case VIRTIO_NET_HDR_GSO_UDP: |
| 589 | pr_warn_once("macvtap: %s: using disabled UFO feature; please fix this program\n", | ||
| 590 | current->comm); | ||
| 591 | gso_type = SKB_GSO_UDP; | 588 | gso_type = SKB_GSO_UDP; |
| 592 | if (skb->protocol == htons(ETH_P_IPV6)) | ||
| 593 | ipv6_proxy_select_ident(skb); | ||
| 594 | break; | 589 | break; |
| 595 | default: | 590 | default: |
| 596 | return -EINVAL; | 591 | return -EINVAL; |
| @@ -636,6 +631,8 @@ static void macvtap_skb_to_vnet_hdr(struct macvtap_queue *q, | |||
| 636 | vnet_hdr->gso_type = VIRTIO_NET_HDR_GSO_TCPV4; | 631 | vnet_hdr->gso_type = VIRTIO_NET_HDR_GSO_TCPV4; |
| 637 | else if (sinfo->gso_type & SKB_GSO_TCPV6) | 632 | else if (sinfo->gso_type & SKB_GSO_TCPV6) |
| 638 | vnet_hdr->gso_type = VIRTIO_NET_HDR_GSO_TCPV6; | 633 | vnet_hdr->gso_type = VIRTIO_NET_HDR_GSO_TCPV6; |
| 634 | else if (sinfo->gso_type & SKB_GSO_UDP) | ||
| 635 | vnet_hdr->gso_type = VIRTIO_NET_HDR_GSO_UDP; | ||
| 639 | else | 636 | else |
| 640 | BUG(); | 637 | BUG(); |
| 641 | if (sinfo->gso_type & SKB_GSO_TCP_ECN) | 638 | if (sinfo->gso_type & SKB_GSO_TCP_ECN) |
| @@ -965,6 +962,9 @@ static int set_offload(struct macvtap_queue *q, unsigned long arg) | |||
| 965 | if (arg & TUN_F_TSO6) | 962 | if (arg & TUN_F_TSO6) |
| 966 | feature_mask |= NETIF_F_TSO6; | 963 | feature_mask |= NETIF_F_TSO6; |
| 967 | } | 964 | } |
| 965 | |||
| 966 | if (arg & TUN_F_UFO) | ||
| 967 | feature_mask |= NETIF_F_UFO; | ||
| 968 | } | 968 | } |
| 969 | 969 | ||
| 970 | /* tun/tap driver inverts the usage for TSO offloads, where | 970 | /* tun/tap driver inverts the usage for TSO offloads, where |
| @@ -975,7 +975,7 @@ static int set_offload(struct macvtap_queue *q, unsigned long arg) | |||
| 975 | * When user space turns off TSO, we turn off GSO/LRO so that | 975 | * When user space turns off TSO, we turn off GSO/LRO so that |
| 976 | * user-space will not receive TSO frames. | 976 | * user-space will not receive TSO frames. |
| 977 | */ | 977 | */ |
| 978 | if (feature_mask & (NETIF_F_TSO | NETIF_F_TSO6)) | 978 | if (feature_mask & (NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_UFO)) |
| 979 | features |= RX_OFFLOADS; | 979 | features |= RX_OFFLOADS; |
| 980 | else | 980 | else |
| 981 | features &= ~RX_OFFLOADS; | 981 | features &= ~RX_OFFLOADS; |
| @@ -1090,7 +1090,7 @@ static long macvtap_ioctl(struct file *file, unsigned int cmd, | |||
| 1090 | case TUNSETOFFLOAD: | 1090 | case TUNSETOFFLOAD: |
| 1091 | /* let the user check for future flags */ | 1091 | /* let the user check for future flags */ |
| 1092 | if (arg & ~(TUN_F_CSUM | TUN_F_TSO4 | TUN_F_TSO6 | | 1092 | if (arg & ~(TUN_F_CSUM | TUN_F_TSO4 | TUN_F_TSO6 | |
| 1093 | TUN_F_TSO_ECN)) | 1093 | TUN_F_TSO_ECN | TUN_F_UFO)) |
| 1094 | return -EINVAL; | 1094 | return -EINVAL; |
| 1095 | 1095 | ||
| 1096 | rtnl_lock(); | 1096 | rtnl_lock(); |
diff --git a/drivers/net/ppp/ppp_deflate.c b/drivers/net/ppp/ppp_deflate.c index 602c625d95d5..b5edc7f96a39 100644 --- a/drivers/net/ppp/ppp_deflate.c +++ b/drivers/net/ppp/ppp_deflate.c | |||
| @@ -246,7 +246,7 @@ static int z_compress(void *arg, unsigned char *rptr, unsigned char *obuf, | |||
| 246 | /* | 246 | /* |
| 247 | * See if we managed to reduce the size of the packet. | 247 | * See if we managed to reduce the size of the packet. |
| 248 | */ | 248 | */ |
| 249 | if (olen < isize) { | 249 | if (olen < isize && olen <= osize) { |
| 250 | state->stats.comp_bytes += olen; | 250 | state->stats.comp_bytes += olen; |
| 251 | state->stats.comp_packets++; | 251 | state->stats.comp_packets++; |
| 252 | } else { | 252 | } else { |
diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c index 93e224217e24..f7ff493f1e73 100644 --- a/drivers/net/team/team.c +++ b/drivers/net/team/team.c | |||
| @@ -629,6 +629,7 @@ static int team_change_mode(struct team *team, const char *kind) | |||
| 629 | static void team_notify_peers_work(struct work_struct *work) | 629 | static void team_notify_peers_work(struct work_struct *work) |
| 630 | { | 630 | { |
| 631 | struct team *team; | 631 | struct team *team; |
| 632 | int val; | ||
| 632 | 633 | ||
| 633 | team = container_of(work, struct team, notify_peers.dw.work); | 634 | team = container_of(work, struct team, notify_peers.dw.work); |
| 634 | 635 | ||
| @@ -636,9 +637,14 @@ static void team_notify_peers_work(struct work_struct *work) | |||
| 636 | schedule_delayed_work(&team->notify_peers.dw, 0); | 637 | schedule_delayed_work(&team->notify_peers.dw, 0); |
| 637 | return; | 638 | return; |
| 638 | } | 639 | } |
| 640 | val = atomic_dec_if_positive(&team->notify_peers.count_pending); | ||
| 641 | if (val < 0) { | ||
| 642 | rtnl_unlock(); | ||
| 643 | return; | ||
| 644 | } | ||
| 639 | call_netdevice_notifiers(NETDEV_NOTIFY_PEERS, team->dev); | 645 | call_netdevice_notifiers(NETDEV_NOTIFY_PEERS, team->dev); |
| 640 | rtnl_unlock(); | 646 | rtnl_unlock(); |
| 641 | if (!atomic_dec_and_test(&team->notify_peers.count_pending)) | 647 | if (val) |
| 642 | schedule_delayed_work(&team->notify_peers.dw, | 648 | schedule_delayed_work(&team->notify_peers.dw, |
| 643 | msecs_to_jiffies(team->notify_peers.interval)); | 649 | msecs_to_jiffies(team->notify_peers.interval)); |
| 644 | } | 650 | } |
| @@ -669,6 +675,7 @@ static void team_notify_peers_fini(struct team *team) | |||
| 669 | static void team_mcast_rejoin_work(struct work_struct *work) | 675 | static void team_mcast_rejoin_work(struct work_struct *work) |
| 670 | { | 676 | { |
| 671 | struct team *team; | 677 | struct team *team; |
| 678 | int val; | ||
| 672 | 679 | ||
| 673 | team = container_of(work, struct team, mcast_rejoin.dw.work); | 680 | team = container_of(work, struct team, mcast_rejoin.dw.work); |
| 674 | 681 | ||
| @@ -676,9 +683,14 @@ static void team_mcast_rejoin_work(struct work_struct *work) | |||
| 676 | schedule_delayed_work(&team->mcast_rejoin.dw, 0); | 683 | schedule_delayed_work(&team->mcast_rejoin.dw, 0); |
| 677 | return; | 684 | return; |
| 678 | } | 685 | } |
| 686 | val = atomic_dec_if_positive(&team->mcast_rejoin.count_pending); | ||
| 687 | if (val < 0) { | ||
| 688 | rtnl_unlock(); | ||
| 689 | return; | ||
| 690 | } | ||
| 679 | call_netdevice_notifiers(NETDEV_RESEND_IGMP, team->dev); | 691 | call_netdevice_notifiers(NETDEV_RESEND_IGMP, team->dev); |
| 680 | rtnl_unlock(); | 692 | rtnl_unlock(); |
| 681 | if (!atomic_dec_and_test(&team->mcast_rejoin.count_pending)) | 693 | if (val) |
| 682 | schedule_delayed_work(&team->mcast_rejoin.dw, | 694 | schedule_delayed_work(&team->mcast_rejoin.dw, |
| 683 | msecs_to_jiffies(team->mcast_rejoin.interval)); | 695 | msecs_to_jiffies(team->mcast_rejoin.interval)); |
| 684 | } | 696 | } |
diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 8c8dc16839a7..10f9e4021b5a 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c | |||
| @@ -65,7 +65,6 @@ | |||
| 65 | #include <linux/nsproxy.h> | 65 | #include <linux/nsproxy.h> |
| 66 | #include <linux/virtio_net.h> | 66 | #include <linux/virtio_net.h> |
| 67 | #include <linux/rcupdate.h> | 67 | #include <linux/rcupdate.h> |
| 68 | #include <net/ipv6.h> | ||
| 69 | #include <net/net_namespace.h> | 68 | #include <net/net_namespace.h> |
| 70 | #include <net/netns/generic.h> | 69 | #include <net/netns/generic.h> |
| 71 | #include <net/rtnetlink.h> | 70 | #include <net/rtnetlink.h> |
| @@ -187,7 +186,7 @@ struct tun_struct { | |||
| 187 | struct net_device *dev; | 186 | struct net_device *dev; |
| 188 | netdev_features_t set_features; | 187 | netdev_features_t set_features; |
| 189 | #define TUN_USER_FEATURES (NETIF_F_HW_CSUM|NETIF_F_TSO_ECN|NETIF_F_TSO| \ | 188 | #define TUN_USER_FEATURES (NETIF_F_HW_CSUM|NETIF_F_TSO_ECN|NETIF_F_TSO| \ |
| 190 | NETIF_F_TSO6) | 189 | NETIF_F_TSO6|NETIF_F_UFO) |
| 191 | 190 | ||
| 192 | int vnet_hdr_sz; | 191 | int vnet_hdr_sz; |
| 193 | int sndbuf; | 192 | int sndbuf; |
| @@ -1167,8 +1166,6 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile, | |||
| 1167 | break; | 1166 | break; |
| 1168 | } | 1167 | } |
| 1169 | 1168 | ||
| 1170 | skb_reset_network_header(skb); | ||
| 1171 | |||
| 1172 | if (gso.gso_type != VIRTIO_NET_HDR_GSO_NONE) { | 1169 | if (gso.gso_type != VIRTIO_NET_HDR_GSO_NONE) { |
| 1173 | pr_debug("GSO!\n"); | 1170 | pr_debug("GSO!\n"); |
| 1174 | switch (gso.gso_type & ~VIRTIO_NET_HDR_GSO_ECN) { | 1171 | switch (gso.gso_type & ~VIRTIO_NET_HDR_GSO_ECN) { |
| @@ -1179,20 +1176,8 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile, | |||
| 1179 | skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6; | 1176 | skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6; |
| 1180 | break; | 1177 | break; |
| 1181 | case VIRTIO_NET_HDR_GSO_UDP: | 1178 | case VIRTIO_NET_HDR_GSO_UDP: |
| 1182 | { | ||
| 1183 | static bool warned; | ||
| 1184 | |||
| 1185 | if (!warned) { | ||
| 1186 | warned = true; | ||
| 1187 | netdev_warn(tun->dev, | ||
| 1188 | "%s: using disabled UFO feature; please fix this program\n", | ||
| 1189 | current->comm); | ||
| 1190 | } | ||
| 1191 | skb_shinfo(skb)->gso_type = SKB_GSO_UDP; | 1179 | skb_shinfo(skb)->gso_type = SKB_GSO_UDP; |
| 1192 | if (skb->protocol == htons(ETH_P_IPV6)) | ||
| 1193 | ipv6_proxy_select_ident(skb); | ||
| 1194 | break; | 1180 | break; |
| 1195 | } | ||
| 1196 | default: | 1181 | default: |
| 1197 | tun->dev->stats.rx_frame_errors++; | 1182 | tun->dev->stats.rx_frame_errors++; |
| 1198 | kfree_skb(skb); | 1183 | kfree_skb(skb); |
| @@ -1221,6 +1206,7 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile, | |||
| 1221 | skb_shinfo(skb)->tx_flags |= SKBTX_SHARED_FRAG; | 1206 | skb_shinfo(skb)->tx_flags |= SKBTX_SHARED_FRAG; |
| 1222 | } | 1207 | } |
| 1223 | 1208 | ||
| 1209 | skb_reset_network_header(skb); | ||
| 1224 | skb_probe_transport_header(skb, 0); | 1210 | skb_probe_transport_header(skb, 0); |
| 1225 | 1211 | ||
| 1226 | rxhash = skb_get_hash(skb); | 1212 | rxhash = skb_get_hash(skb); |
| @@ -1298,6 +1284,8 @@ static ssize_t tun_put_user(struct tun_struct *tun, | |||
| 1298 | gso.gso_type = VIRTIO_NET_HDR_GSO_TCPV4; | 1284 | gso.gso_type = VIRTIO_NET_HDR_GSO_TCPV4; |
| 1299 | else if (sinfo->gso_type & SKB_GSO_TCPV6) | 1285 | else if (sinfo->gso_type & SKB_GSO_TCPV6) |
| 1300 | gso.gso_type = VIRTIO_NET_HDR_GSO_TCPV6; | 1286 | gso.gso_type = VIRTIO_NET_HDR_GSO_TCPV6; |
| 1287 | else if (sinfo->gso_type & SKB_GSO_UDP) | ||
| 1288 | gso.gso_type = VIRTIO_NET_HDR_GSO_UDP; | ||
| 1301 | else { | 1289 | else { |
| 1302 | pr_err("unexpected GSO type: " | 1290 | pr_err("unexpected GSO type: " |
| 1303 | "0x%x, gso_size %d, hdr_len %d\n", | 1291 | "0x%x, gso_size %d, hdr_len %d\n", |
| @@ -1746,6 +1734,11 @@ static int set_offload(struct tun_struct *tun, unsigned long arg) | |||
| 1746 | features |= NETIF_F_TSO6; | 1734 | features |= NETIF_F_TSO6; |
| 1747 | arg &= ~(TUN_F_TSO4|TUN_F_TSO6); | 1735 | arg &= ~(TUN_F_TSO4|TUN_F_TSO6); |
| 1748 | } | 1736 | } |
| 1737 | |||
| 1738 | if (arg & TUN_F_UFO) { | ||
| 1739 | features |= NETIF_F_UFO; | ||
| 1740 | arg &= ~TUN_F_UFO; | ||
| 1741 | } | ||
| 1749 | } | 1742 | } |
| 1750 | 1743 | ||
| 1751 | /* This gives the user a way to test for new features in future by | 1744 | /* This gives the user a way to test for new features in future by |
diff --git a/drivers/net/usb/kaweth.c b/drivers/net/usb/kaweth.c index dcb6d33141e0..1e9cdca37014 100644 --- a/drivers/net/usb/kaweth.c +++ b/drivers/net/usb/kaweth.c | |||
| @@ -1276,7 +1276,7 @@ static int usb_start_wait_urb(struct urb *urb, int timeout, int* actual_length) | |||
| 1276 | awd.done = 0; | 1276 | awd.done = 0; |
| 1277 | 1277 | ||
| 1278 | urb->context = &awd; | 1278 | urb->context = &awd; |
| 1279 | status = usb_submit_urb(urb, GFP_NOIO); | 1279 | status = usb_submit_urb(urb, GFP_ATOMIC); |
| 1280 | if (status) { | 1280 | if (status) { |
| 1281 | // something went wrong | 1281 | // something went wrong |
| 1282 | usb_free_urb(urb); | 1282 | usb_free_urb(urb); |
diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c index b8a82b86f909..602dc6668c3a 100644 --- a/drivers/net/usb/qmi_wwan.c +++ b/drivers/net/usb/qmi_wwan.c | |||
| @@ -56,6 +56,8 @@ struct qmi_wwan_state { | |||
| 56 | /* default ethernet address used by the modem */ | 56 | /* default ethernet address used by the modem */ |
| 57 | static const u8 default_modem_addr[ETH_ALEN] = {0x02, 0x50, 0xf3}; | 57 | static const u8 default_modem_addr[ETH_ALEN] = {0x02, 0x50, 0xf3}; |
| 58 | 58 | ||
| 59 | static const u8 buggy_fw_addr[ETH_ALEN] = {0x00, 0xa0, 0xc6, 0x00, 0x00, 0x00}; | ||
| 60 | |||
| 59 | /* Make up an ethernet header if the packet doesn't have one. | 61 | /* Make up an ethernet header if the packet doesn't have one. |
| 60 | * | 62 | * |
| 61 | * A firmware bug common among several devices cause them to send raw | 63 | * A firmware bug common among several devices cause them to send raw |
| @@ -332,10 +334,12 @@ next_desc: | |||
| 332 | usb_driver_release_interface(driver, info->data); | 334 | usb_driver_release_interface(driver, info->data); |
| 333 | } | 335 | } |
| 334 | 336 | ||
| 335 | /* Never use the same address on both ends of the link, even | 337 | /* Never use the same address on both ends of the link, even if the |
| 336 | * if the buggy firmware told us to. | 338 | * buggy firmware told us to. Or, if device is assigned the well-known |
| 339 | * buggy firmware MAC address, replace it with a random address, | ||
| 337 | */ | 340 | */ |
| 338 | if (ether_addr_equal(dev->net->dev_addr, default_modem_addr)) | 341 | if (ether_addr_equal(dev->net->dev_addr, default_modem_addr) || |
| 342 | ether_addr_equal(dev->net->dev_addr, buggy_fw_addr)) | ||
| 339 | eth_hw_addr_random(dev->net); | 343 | eth_hw_addr_random(dev->net); |
| 340 | 344 | ||
| 341 | /* make MAC addr easily distinguishable from an IP header */ | 345 | /* make MAC addr easily distinguishable from an IP header */ |
diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index 2d1c77e81836..bf405f134d3a 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c | |||
| @@ -833,9 +833,6 @@ static void ocp_write_word(struct r8152 *tp, u16 type, u16 index, u32 data) | |||
| 833 | index &= ~3; | 833 | index &= ~3; |
| 834 | } | 834 | } |
| 835 | 835 | ||
| 836 | generic_ocp_read(tp, index, sizeof(tmp), &tmp, type); | ||
| 837 | |||
| 838 | data |= __le32_to_cpu(tmp) & ~mask; | ||
| 839 | tmp = __cpu_to_le32(data); | 836 | tmp = __cpu_to_le32(data); |
| 840 | 837 | ||
| 841 | generic_ocp_write(tp, index, byen, sizeof(tmp), &tmp, type); | 838 | generic_ocp_write(tp, index, byen, sizeof(tmp), &tmp, type); |
| @@ -874,9 +871,6 @@ static void ocp_write_byte(struct r8152 *tp, u16 type, u16 index, u32 data) | |||
| 874 | index &= ~3; | 871 | index &= ~3; |
| 875 | } | 872 | } |
| 876 | 873 | ||
| 877 | generic_ocp_read(tp, index, sizeof(tmp), &tmp, type); | ||
| 878 | |||
| 879 | data |= __le32_to_cpu(tmp) & ~mask; | ||
| 880 | tmp = __cpu_to_le32(data); | 874 | tmp = __cpu_to_le32(data); |
| 881 | 875 | ||
| 882 | generic_ocp_write(tp, index, byen, sizeof(tmp), &tmp, type); | 876 | generic_ocp_write(tp, index, byen, sizeof(tmp), &tmp, type); |
| @@ -926,12 +920,6 @@ static void sram_write(struct r8152 *tp, u16 addr, u16 data) | |||
| 926 | ocp_reg_write(tp, OCP_SRAM_DATA, data); | 920 | ocp_reg_write(tp, OCP_SRAM_DATA, data); |
| 927 | } | 921 | } |
| 928 | 922 | ||
| 929 | static u16 sram_read(struct r8152 *tp, u16 addr) | ||
| 930 | { | ||
| 931 | ocp_reg_write(tp, OCP_SRAM_ADDR, addr); | ||
| 932 | return ocp_reg_read(tp, OCP_SRAM_DATA); | ||
| 933 | } | ||
| 934 | |||
| 935 | static int read_mii_word(struct net_device *netdev, int phy_id, int reg) | 923 | static int read_mii_word(struct net_device *netdev, int phy_id, int reg) |
| 936 | { | 924 | { |
| 937 | struct r8152 *tp = netdev_priv(netdev); | 925 | struct r8152 *tp = netdev_priv(netdev); |
| @@ -1897,6 +1885,22 @@ static void _rtl8152_set_rx_mode(struct net_device *netdev) | |||
| 1897 | netif_wake_queue(netdev); | 1885 | netif_wake_queue(netdev); |
| 1898 | } | 1886 | } |
| 1899 | 1887 | ||
| 1888 | static netdev_features_t | ||
| 1889 | rtl8152_features_check(struct sk_buff *skb, struct net_device *dev, | ||
| 1890 | netdev_features_t features) | ||
| 1891 | { | ||
| 1892 | u32 mss = skb_shinfo(skb)->gso_size; | ||
| 1893 | int max_offset = mss ? GTTCPHO_MAX : TCPHO_MAX; | ||
| 1894 | int offset = skb_transport_offset(skb); | ||
| 1895 | |||
| 1896 | if ((mss || skb->ip_summed == CHECKSUM_PARTIAL) && offset > max_offset) | ||
| 1897 | features &= ~(NETIF_F_ALL_CSUM | NETIF_F_GSO_MASK); | ||
| 1898 | else if ((skb->len + sizeof(struct tx_desc)) > agg_buf_sz) | ||
| 1899 | features &= ~NETIF_F_GSO_MASK; | ||
| 1900 | |||
| 1901 | return features; | ||
| 1902 | } | ||
| 1903 | |||
| 1900 | static netdev_tx_t rtl8152_start_xmit(struct sk_buff *skb, | 1904 | static netdev_tx_t rtl8152_start_xmit(struct sk_buff *skb, |
| 1901 | struct net_device *netdev) | 1905 | struct net_device *netdev) |
| 1902 | { | 1906 | { |
| @@ -2502,24 +2506,18 @@ static void r8153_hw_phy_cfg(struct r8152 *tp) | |||
| 2502 | data = ocp_reg_read(tp, OCP_POWER_CFG); | 2506 | data = ocp_reg_read(tp, OCP_POWER_CFG); |
| 2503 | data |= EN_10M_PLLOFF; | 2507 | data |= EN_10M_PLLOFF; |
| 2504 | ocp_reg_write(tp, OCP_POWER_CFG, data); | 2508 | ocp_reg_write(tp, OCP_POWER_CFG, data); |
| 2505 | data = sram_read(tp, SRAM_IMPEDANCE); | 2509 | sram_write(tp, SRAM_IMPEDANCE, 0x0b13); |
| 2506 | data &= ~RX_DRIVING_MASK; | ||
| 2507 | sram_write(tp, SRAM_IMPEDANCE, data); | ||
| 2508 | 2510 | ||
| 2509 | ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR); | 2511 | ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR); |
| 2510 | ocp_data |= PFM_PWM_SWITCH; | 2512 | ocp_data |= PFM_PWM_SWITCH; |
| 2511 | ocp_write_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR, ocp_data); | 2513 | ocp_write_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR, ocp_data); |
| 2512 | 2514 | ||
| 2513 | data = sram_read(tp, SRAM_LPF_CFG); | 2515 | /* Enable LPF corner auto tune */ |
| 2514 | data |= LPF_AUTO_TUNE; | 2516 | sram_write(tp, SRAM_LPF_CFG, 0xf70f); |
| 2515 | sram_write(tp, SRAM_LPF_CFG, data); | ||
| 2516 | 2517 | ||
| 2517 | data = sram_read(tp, SRAM_10M_AMP1); | 2518 | /* Adjust 10M Amplitude */ |
| 2518 | data |= GDAC_IB_UPALL; | 2519 | sram_write(tp, SRAM_10M_AMP1, 0x00af); |
| 2519 | sram_write(tp, SRAM_10M_AMP1, data); | 2520 | sram_write(tp, SRAM_10M_AMP2, 0x0208); |
| 2520 | data = sram_read(tp, SRAM_10M_AMP2); | ||
| 2521 | data |= AMP_DN; | ||
| 2522 | sram_write(tp, SRAM_10M_AMP2, data); | ||
| 2523 | 2521 | ||
| 2524 | set_bit(PHY_RESET, &tp->flags); | 2522 | set_bit(PHY_RESET, &tp->flags); |
| 2525 | } | 2523 | } |
| @@ -3706,6 +3704,7 @@ static const struct net_device_ops rtl8152_netdev_ops = { | |||
| 3706 | .ndo_set_mac_address = rtl8152_set_mac_address, | 3704 | .ndo_set_mac_address = rtl8152_set_mac_address, |
| 3707 | .ndo_change_mtu = rtl8152_change_mtu, | 3705 | .ndo_change_mtu = rtl8152_change_mtu, |
| 3708 | .ndo_validate_addr = eth_validate_addr, | 3706 | .ndo_validate_addr = eth_validate_addr, |
| 3707 | .ndo_features_check = rtl8152_features_check, | ||
| 3709 | }; | 3708 | }; |
| 3710 | 3709 | ||
| 3711 | static void r8152b_get_version(struct r8152 *tp) | 3710 | static void r8152b_get_version(struct r8152 *tp) |
diff --git a/drivers/net/usb/sr9700.c b/drivers/net/usb/sr9700.c index 99b69af14274..4a1e9c489f1f 100644 --- a/drivers/net/usb/sr9700.c +++ b/drivers/net/usb/sr9700.c | |||
| @@ -77,7 +77,7 @@ static int wait_phy_eeprom_ready(struct usbnet *dev, int phy) | |||
| 77 | int ret; | 77 | int ret; |
| 78 | 78 | ||
| 79 | udelay(1); | 79 | udelay(1); |
| 80 | ret = sr_read_reg(dev, EPCR, &tmp); | 80 | ret = sr_read_reg(dev, SR_EPCR, &tmp); |
| 81 | if (ret < 0) | 81 | if (ret < 0) |
| 82 | return ret; | 82 | return ret; |
| 83 | 83 | ||
| @@ -98,15 +98,15 @@ static int sr_share_read_word(struct usbnet *dev, int phy, u8 reg, | |||
| 98 | 98 | ||
| 99 | mutex_lock(&dev->phy_mutex); | 99 | mutex_lock(&dev->phy_mutex); |
| 100 | 100 | ||
| 101 | sr_write_reg(dev, EPAR, phy ? (reg | EPAR_PHY_ADR) : reg); | 101 | sr_write_reg(dev, SR_EPAR, phy ? (reg | EPAR_PHY_ADR) : reg); |
| 102 | sr_write_reg(dev, EPCR, phy ? (EPCR_EPOS | EPCR_ERPRR) : EPCR_ERPRR); | 102 | sr_write_reg(dev, SR_EPCR, phy ? (EPCR_EPOS | EPCR_ERPRR) : EPCR_ERPRR); |
| 103 | 103 | ||
| 104 | ret = wait_phy_eeprom_ready(dev, phy); | 104 | ret = wait_phy_eeprom_ready(dev, phy); |
| 105 | if (ret < 0) | 105 | if (ret < 0) |
| 106 | goto out_unlock; | 106 | goto out_unlock; |
| 107 | 107 | ||
| 108 | sr_write_reg(dev, EPCR, 0x0); | 108 | sr_write_reg(dev, SR_EPCR, 0x0); |
| 109 | ret = sr_read(dev, EPDR, 2, value); | 109 | ret = sr_read(dev, SR_EPDR, 2, value); |
| 110 | 110 | ||
| 111 | netdev_dbg(dev->net, "read shared %d 0x%02x returned 0x%04x, %d\n", | 111 | netdev_dbg(dev->net, "read shared %d 0x%02x returned 0x%04x, %d\n", |
| 112 | phy, reg, *value, ret); | 112 | phy, reg, *value, ret); |
| @@ -123,19 +123,19 @@ static int sr_share_write_word(struct usbnet *dev, int phy, u8 reg, | |||
| 123 | 123 | ||
| 124 | mutex_lock(&dev->phy_mutex); | 124 | mutex_lock(&dev->phy_mutex); |
| 125 | 125 | ||
| 126 | ret = sr_write(dev, EPDR, 2, &value); | 126 | ret = sr_write(dev, SR_EPDR, 2, &value); |
| 127 | if (ret < 0) | 127 | if (ret < 0) |
| 128 | goto out_unlock; | 128 | goto out_unlock; |
| 129 | 129 | ||
| 130 | sr_write_reg(dev, EPAR, phy ? (reg | EPAR_PHY_ADR) : reg); | 130 | sr_write_reg(dev, SR_EPAR, phy ? (reg | EPAR_PHY_ADR) : reg); |
| 131 | sr_write_reg(dev, EPCR, phy ? (EPCR_WEP | EPCR_EPOS | EPCR_ERPRW) : | 131 | sr_write_reg(dev, SR_EPCR, phy ? (EPCR_WEP | EPCR_EPOS | EPCR_ERPRW) : |
| 132 | (EPCR_WEP | EPCR_ERPRW)); | 132 | (EPCR_WEP | EPCR_ERPRW)); |
| 133 | 133 | ||
| 134 | ret = wait_phy_eeprom_ready(dev, phy); | 134 | ret = wait_phy_eeprom_ready(dev, phy); |
| 135 | if (ret < 0) | 135 | if (ret < 0) |
| 136 | goto out_unlock; | 136 | goto out_unlock; |
| 137 | 137 | ||
| 138 | sr_write_reg(dev, EPCR, 0x0); | 138 | sr_write_reg(dev, SR_EPCR, 0x0); |
| 139 | 139 | ||
| 140 | out_unlock: | 140 | out_unlock: |
| 141 | mutex_unlock(&dev->phy_mutex); | 141 | mutex_unlock(&dev->phy_mutex); |
| @@ -188,7 +188,7 @@ static int sr_mdio_read(struct net_device *netdev, int phy_id, int loc) | |||
| 188 | if (loc == MII_BMSR) { | 188 | if (loc == MII_BMSR) { |
| 189 | u8 value; | 189 | u8 value; |
| 190 | 190 | ||
| 191 | sr_read_reg(dev, NSR, &value); | 191 | sr_read_reg(dev, SR_NSR, &value); |
| 192 | if (value & NSR_LINKST) | 192 | if (value & NSR_LINKST) |
| 193 | rc = 1; | 193 | rc = 1; |
| 194 | } | 194 | } |
| @@ -228,7 +228,7 @@ static u32 sr9700_get_link(struct net_device *netdev) | |||
| 228 | int rc = 0; | 228 | int rc = 0; |
| 229 | 229 | ||
| 230 | /* Get the Link Status directly */ | 230 | /* Get the Link Status directly */ |
| 231 | sr_read_reg(dev, NSR, &value); | 231 | sr_read_reg(dev, SR_NSR, &value); |
| 232 | if (value & NSR_LINKST) | 232 | if (value & NSR_LINKST) |
| 233 | rc = 1; | 233 | rc = 1; |
| 234 | 234 | ||
| @@ -281,8 +281,8 @@ static void sr9700_set_multicast(struct net_device *netdev) | |||
| 281 | } | 281 | } |
| 282 | } | 282 | } |
| 283 | 283 | ||
| 284 | sr_write_async(dev, MAR, SR_MCAST_SIZE, hashes); | 284 | sr_write_async(dev, SR_MAR, SR_MCAST_SIZE, hashes); |
| 285 | sr_write_reg_async(dev, RCR, rx_ctl); | 285 | sr_write_reg_async(dev, SR_RCR, rx_ctl); |
| 286 | } | 286 | } |
| 287 | 287 | ||
| 288 | static int sr9700_set_mac_address(struct net_device *netdev, void *p) | 288 | static int sr9700_set_mac_address(struct net_device *netdev, void *p) |
| @@ -297,7 +297,7 @@ static int sr9700_set_mac_address(struct net_device *netdev, void *p) | |||
| 297 | } | 297 | } |
| 298 | 298 | ||
| 299 | memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len); | 299 | memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len); |
| 300 | sr_write_async(dev, PAR, 6, netdev->dev_addr); | 300 | sr_write_async(dev, SR_PAR, 6, netdev->dev_addr); |
| 301 | 301 | ||
| 302 | return 0; | 302 | return 0; |
| 303 | } | 303 | } |
| @@ -340,7 +340,7 @@ static int sr9700_bind(struct usbnet *dev, struct usb_interface *intf) | |||
| 340 | mii->phy_id_mask = 0x1f; | 340 | mii->phy_id_mask = 0x1f; |
| 341 | mii->reg_num_mask = 0x1f; | 341 | mii->reg_num_mask = 0x1f; |
| 342 | 342 | ||
| 343 | sr_write_reg(dev, NCR, NCR_RST); | 343 | sr_write_reg(dev, SR_NCR, NCR_RST); |
| 344 | udelay(20); | 344 | udelay(20); |
| 345 | 345 | ||
| 346 | /* read MAC | 346 | /* read MAC |
| @@ -348,17 +348,17 @@ static int sr9700_bind(struct usbnet *dev, struct usb_interface *intf) | |||
| 348 | * EEPROM automatically to PAR. In case there is no EEPROM externally, | 348 | * EEPROM automatically to PAR. In case there is no EEPROM externally, |
| 349 | * a default MAC address is stored in PAR for making chip work properly. | 349 | * a default MAC address is stored in PAR for making chip work properly. |
| 350 | */ | 350 | */ |
| 351 | if (sr_read(dev, PAR, ETH_ALEN, netdev->dev_addr) < 0) { | 351 | if (sr_read(dev, SR_PAR, ETH_ALEN, netdev->dev_addr) < 0) { |
| 352 | netdev_err(netdev, "Error reading MAC address\n"); | 352 | netdev_err(netdev, "Error reading MAC address\n"); |
| 353 | ret = -ENODEV; | 353 | ret = -ENODEV; |
| 354 | goto out; | 354 | goto out; |
| 355 | } | 355 | } |
| 356 | 356 | ||
| 357 | /* power up and reset phy */ | 357 | /* power up and reset phy */ |
| 358 | sr_write_reg(dev, PRR, PRR_PHY_RST); | 358 | sr_write_reg(dev, SR_PRR, PRR_PHY_RST); |
| 359 | /* at least 10ms, here 20ms for safe */ | 359 | /* at least 10ms, here 20ms for safe */ |
| 360 | mdelay(20); | 360 | mdelay(20); |
| 361 | sr_write_reg(dev, PRR, 0); | 361 | sr_write_reg(dev, SR_PRR, 0); |
| 362 | /* at least 1ms, here 2ms for reading right register */ | 362 | /* at least 1ms, here 2ms for reading right register */ |
| 363 | udelay(2 * 1000); | 363 | udelay(2 * 1000); |
| 364 | 364 | ||
diff --git a/drivers/net/usb/sr9700.h b/drivers/net/usb/sr9700.h index fd687c575e74..258b030277e7 100644 --- a/drivers/net/usb/sr9700.h +++ b/drivers/net/usb/sr9700.h | |||
| @@ -14,13 +14,13 @@ | |||
| 14 | /* sr9700 spec. register table on Linux platform */ | 14 | /* sr9700 spec. register table on Linux platform */ |
| 15 | 15 | ||
| 16 | /* Network Control Reg */ | 16 | /* Network Control Reg */ |
| 17 | #define NCR 0x00 | 17 | #define SR_NCR 0x00 |
| 18 | #define NCR_RST (1 << 0) | 18 | #define NCR_RST (1 << 0) |
| 19 | #define NCR_LBK (3 << 1) | 19 | #define NCR_LBK (3 << 1) |
| 20 | #define NCR_FDX (1 << 3) | 20 | #define NCR_FDX (1 << 3) |
| 21 | #define NCR_WAKEEN (1 << 6) | 21 | #define NCR_WAKEEN (1 << 6) |
| 22 | /* Network Status Reg */ | 22 | /* Network Status Reg */ |
| 23 | #define NSR 0x01 | 23 | #define SR_NSR 0x01 |
| 24 | #define NSR_RXRDY (1 << 0) | 24 | #define NSR_RXRDY (1 << 0) |
| 25 | #define NSR_RXOV (1 << 1) | 25 | #define NSR_RXOV (1 << 1) |
| 26 | #define NSR_TX1END (1 << 2) | 26 | #define NSR_TX1END (1 << 2) |
| @@ -30,7 +30,7 @@ | |||
| 30 | #define NSR_LINKST (1 << 6) | 30 | #define NSR_LINKST (1 << 6) |
| 31 | #define NSR_SPEED (1 << 7) | 31 | #define NSR_SPEED (1 << 7) |
| 32 | /* Tx Control Reg */ | 32 | /* Tx Control Reg */ |
| 33 | #define TCR 0x02 | 33 | #define SR_TCR 0x02 |
| 34 | #define TCR_CRC_DIS (1 << 1) | 34 | #define TCR_CRC_DIS (1 << 1) |
| 35 | #define TCR_PAD_DIS (1 << 2) | 35 | #define TCR_PAD_DIS (1 << 2) |
| 36 | #define TCR_LC_CARE (1 << 3) | 36 | #define TCR_LC_CARE (1 << 3) |
| @@ -38,7 +38,7 @@ | |||
| 38 | #define TCR_EXCECM (1 << 5) | 38 | #define TCR_EXCECM (1 << 5) |
| 39 | #define TCR_LF_EN (1 << 6) | 39 | #define TCR_LF_EN (1 << 6) |
| 40 | /* Tx Status Reg for Packet Index 1 */ | 40 | /* Tx Status Reg for Packet Index 1 */ |
| 41 | #define TSR1 0x03 | 41 | #define SR_TSR1 0x03 |
| 42 | #define TSR1_EC (1 << 2) | 42 | #define TSR1_EC (1 << 2) |
| 43 | #define TSR1_COL (1 << 3) | 43 | #define TSR1_COL (1 << 3) |
| 44 | #define TSR1_LC (1 << 4) | 44 | #define TSR1_LC (1 << 4) |
| @@ -46,7 +46,7 @@ | |||
| 46 | #define TSR1_LOC (1 << 6) | 46 | #define TSR1_LOC (1 << 6) |
| 47 | #define TSR1_TLF (1 << 7) | 47 | #define TSR1_TLF (1 << 7) |
| 48 | /* Tx Status Reg for Packet Index 2 */ | 48 | /* Tx Status Reg for Packet Index 2 */ |
| 49 | #define TSR2 0x04 | 49 | #define SR_TSR2 0x04 |
| 50 | #define TSR2_EC (1 << 2) | 50 | #define TSR2_EC (1 << 2) |
| 51 | #define TSR2_COL (1 << 3) | 51 | #define TSR2_COL (1 << 3) |
| 52 | #define TSR2_LC (1 << 4) | 52 | #define TSR2_LC (1 << 4) |
| @@ -54,7 +54,7 @@ | |||
| 54 | #define TSR2_LOC (1 << 6) | 54 | #define TSR2_LOC (1 << 6) |
| 55 | #define TSR2_TLF (1 << 7) | 55 | #define TSR2_TLF (1 << 7) |
| 56 | /* Rx Control Reg*/ | 56 | /* Rx Control Reg*/ |
| 57 | #define RCR 0x05 | 57 | #define SR_RCR 0x05 |
| 58 | #define RCR_RXEN (1 << 0) | 58 | #define RCR_RXEN (1 << 0) |
| 59 | #define RCR_PRMSC (1 << 1) | 59 | #define RCR_PRMSC (1 << 1) |
| 60 | #define RCR_RUNT (1 << 2) | 60 | #define RCR_RUNT (1 << 2) |
| @@ -62,87 +62,87 @@ | |||
| 62 | #define RCR_DIS_CRC (1 << 4) | 62 | #define RCR_DIS_CRC (1 << 4) |
| 63 | #define RCR_DIS_LONG (1 << 5) | 63 | #define RCR_DIS_LONG (1 << 5) |
| 64 | /* Rx Status Reg */ | 64 | /* Rx Status Reg */ |
| 65 | #define RSR 0x06 | 65 | #define SR_RSR 0x06 |
| 66 | #define RSR_AE (1 << 2) | 66 | #define RSR_AE (1 << 2) |
| 67 | #define RSR_MF (1 << 6) | 67 | #define RSR_MF (1 << 6) |
| 68 | #define RSR_RF (1 << 7) | 68 | #define RSR_RF (1 << 7) |
| 69 | /* Rx Overflow Counter Reg */ | 69 | /* Rx Overflow Counter Reg */ |
| 70 | #define ROCR 0x07 | 70 | #define SR_ROCR 0x07 |
| 71 | #define ROCR_ROC (0x7F << 0) | 71 | #define ROCR_ROC (0x7F << 0) |
| 72 | #define ROCR_RXFU (1 << 7) | 72 | #define ROCR_RXFU (1 << 7) |
| 73 | /* Back Pressure Threshold Reg */ | 73 | /* Back Pressure Threshold Reg */ |
| 74 | #define BPTR 0x08 | 74 | #define SR_BPTR 0x08 |
| 75 | #define BPTR_JPT (0x0F << 0) | 75 | #define BPTR_JPT (0x0F << 0) |
| 76 | #define BPTR_BPHW (0x0F << 4) | 76 | #define BPTR_BPHW (0x0F << 4) |
| 77 | /* Flow Control Threshold Reg */ | 77 | /* Flow Control Threshold Reg */ |
| 78 | #define FCTR 0x09 | 78 | #define SR_FCTR 0x09 |
| 79 | #define FCTR_LWOT (0x0F << 0) | 79 | #define FCTR_LWOT (0x0F << 0) |
| 80 | #define FCTR_HWOT (0x0F << 4) | 80 | #define FCTR_HWOT (0x0F << 4) |
| 81 | /* rx/tx Flow Control Reg */ | 81 | /* rx/tx Flow Control Reg */ |
| 82 | #define FCR 0x0A | 82 | #define SR_FCR 0x0A |
| 83 | #define FCR_FLCE (1 << 0) | 83 | #define FCR_FLCE (1 << 0) |
| 84 | #define FCR_BKPA (1 << 4) | 84 | #define FCR_BKPA (1 << 4) |
| 85 | #define FCR_TXPEN (1 << 5) | 85 | #define FCR_TXPEN (1 << 5) |
| 86 | #define FCR_TXPF (1 << 6) | 86 | #define FCR_TXPF (1 << 6) |
| 87 | #define FCR_TXP0 (1 << 7) | 87 | #define FCR_TXP0 (1 << 7) |
| 88 | /* Eeprom & Phy Control Reg */ | 88 | /* Eeprom & Phy Control Reg */ |
| 89 | #define EPCR 0x0B | 89 | #define SR_EPCR 0x0B |
| 90 | #define EPCR_ERRE (1 << 0) | 90 | #define EPCR_ERRE (1 << 0) |
| 91 | #define EPCR_ERPRW (1 << 1) | 91 | #define EPCR_ERPRW (1 << 1) |
| 92 | #define EPCR_ERPRR (1 << 2) | 92 | #define EPCR_ERPRR (1 << 2) |
| 93 | #define EPCR_EPOS (1 << 3) | 93 | #define EPCR_EPOS (1 << 3) |
| 94 | #define EPCR_WEP (1 << 4) | 94 | #define EPCR_WEP (1 << 4) |
| 95 | /* Eeprom & Phy Address Reg */ | 95 | /* Eeprom & Phy Address Reg */ |
| 96 | #define EPAR 0x0C | 96 | #define SR_EPAR 0x0C |
| 97 | #define EPAR_EROA (0x3F << 0) | 97 | #define EPAR_EROA (0x3F << 0) |
| 98 | #define EPAR_PHY_ADR_MASK (0x03 << 6) | 98 | #define EPAR_PHY_ADR_MASK (0x03 << 6) |
| 99 | #define EPAR_PHY_ADR (0x01 << 6) | 99 | #define EPAR_PHY_ADR (0x01 << 6) |
| 100 | /* Eeprom & Phy Data Reg */ | 100 | /* Eeprom & Phy Data Reg */ |
| 101 | #define EPDR 0x0D /* 0x0D ~ 0x0E for Data Reg Low & High */ | 101 | #define SR_EPDR 0x0D /* 0x0D ~ 0x0E for Data Reg Low & High */ |
| 102 | /* Wakeup Control Reg */ | 102 | /* Wakeup Control Reg */ |
| 103 | #define WCR 0x0F | 103 | #define SR_WCR 0x0F |
| 104 | #define WCR_MAGICST (1 << 0) | 104 | #define WCR_MAGICST (1 << 0) |
| 105 | #define WCR_LINKST (1 << 2) | 105 | #define WCR_LINKST (1 << 2) |
| 106 | #define WCR_MAGICEN (1 << 3) | 106 | #define WCR_MAGICEN (1 << 3) |
| 107 | #define WCR_LINKEN (1 << 5) | 107 | #define WCR_LINKEN (1 << 5) |
| 108 | /* Physical Address Reg */ | 108 | /* Physical Address Reg */ |
| 109 | #define PAR 0x10 /* 0x10 ~ 0x15 6 bytes for PAR */ | 109 | #define SR_PAR 0x10 /* 0x10 ~ 0x15 6 bytes for PAR */ |
| 110 | /* Multicast Address Reg */ | 110 | /* Multicast Address Reg */ |
| 111 | #define MAR 0x16 /* 0x16 ~ 0x1D 8 bytes for MAR */ | 111 | #define SR_MAR 0x16 /* 0x16 ~ 0x1D 8 bytes for MAR */ |
| 112 | /* 0x1e unused */ | 112 | /* 0x1e unused */ |
| 113 | /* Phy Reset Reg */ | 113 | /* Phy Reset Reg */ |
| 114 | #define PRR 0x1F | 114 | #define SR_PRR 0x1F |
| 115 | #define PRR_PHY_RST (1 << 0) | 115 | #define PRR_PHY_RST (1 << 0) |
| 116 | /* Tx sdram Write Pointer Address Low */ | 116 | /* Tx sdram Write Pointer Address Low */ |
| 117 | #define TWPAL 0x20 | 117 | #define SR_TWPAL 0x20 |
| 118 | /* Tx sdram Write Pointer Address High */ | 118 | /* Tx sdram Write Pointer Address High */ |
| 119 | #define TWPAH 0x21 | 119 | #define SR_TWPAH 0x21 |
| 120 | /* Tx sdram Read Pointer Address Low */ | 120 | /* Tx sdram Read Pointer Address Low */ |
| 121 | #define TRPAL 0x22 | 121 | #define SR_TRPAL 0x22 |
| 122 | /* Tx sdram Read Pointer Address High */ | 122 | /* Tx sdram Read Pointer Address High */ |
| 123 | #define TRPAH 0x23 | 123 | #define SR_TRPAH 0x23 |
| 124 | /* Rx sdram Write Pointer Address Low */ | 124 | /* Rx sdram Write Pointer Address Low */ |
| 125 | #define RWPAL 0x24 | 125 | #define SR_RWPAL 0x24 |
| 126 | /* Rx sdram Write Pointer Address High */ | 126 | /* Rx sdram Write Pointer Address High */ |
| 127 | #define RWPAH 0x25 | 127 | #define SR_RWPAH 0x25 |
| 128 | /* Rx sdram Read Pointer Address Low */ | 128 | /* Rx sdram Read Pointer Address Low */ |
| 129 | #define RRPAL 0x26 | 129 | #define SR_RRPAL 0x26 |
| 130 | /* Rx sdram Read Pointer Address High */ | 130 | /* Rx sdram Read Pointer Address High */ |
| 131 | #define RRPAH 0x27 | 131 | #define SR_RRPAH 0x27 |
| 132 | /* Vendor ID register */ | 132 | /* Vendor ID register */ |
| 133 | #define VID 0x28 /* 0x28 ~ 0x29 2 bytes for VID */ | 133 | #define SR_VID 0x28 /* 0x28 ~ 0x29 2 bytes for VID */ |
| 134 | /* Product ID register */ | 134 | /* Product ID register */ |
| 135 | #define PID 0x2A /* 0x2A ~ 0x2B 2 bytes for PID */ | 135 | #define SR_PID 0x2A /* 0x2A ~ 0x2B 2 bytes for PID */ |
| 136 | /* CHIP Revision register */ | 136 | /* CHIP Revision register */ |
| 137 | #define CHIPR 0x2C | 137 | #define SR_CHIPR 0x2C |
| 138 | /* 0x2D --> 0xEF unused */ | 138 | /* 0x2D --> 0xEF unused */ |
| 139 | /* USB Device Address */ | 139 | /* USB Device Address */ |
| 140 | #define USBDA 0xF0 | 140 | #define SR_USBDA 0xF0 |
| 141 | #define USBDA_USBFA (0x7F << 0) | 141 | #define USBDA_USBFA (0x7F << 0) |
| 142 | /* RX packet Counter Reg */ | 142 | /* RX packet Counter Reg */ |
| 143 | #define RXC 0xF1 | 143 | #define SR_RXC 0xF1 |
| 144 | /* Tx packet Counter & USB Status Reg */ | 144 | /* Tx packet Counter & USB Status Reg */ |
| 145 | #define TXC_USBS 0xF2 | 145 | #define SR_TXC_USBS 0xF2 |
| 146 | #define TXC_USBS_TXC0 (1 << 0) | 146 | #define TXC_USBS_TXC0 (1 << 0) |
| 147 | #define TXC_USBS_TXC1 (1 << 1) | 147 | #define TXC_USBS_TXC1 (1 << 1) |
| 148 | #define TXC_USBS_TXC2 (1 << 2) | 148 | #define TXC_USBS_TXC2 (1 << 2) |
| @@ -150,7 +150,7 @@ | |||
| 150 | #define TXC_USBS_SUSFLAG (1 << 6) | 150 | #define TXC_USBS_SUSFLAG (1 << 6) |
| 151 | #define TXC_USBS_RXFAULT (1 << 7) | 151 | #define TXC_USBS_RXFAULT (1 << 7) |
| 152 | /* USB Control register */ | 152 | /* USB Control register */ |
| 153 | #define USBC 0xF4 | 153 | #define SR_USBC 0xF4 |
| 154 | #define USBC_EP3NAK (1 << 4) | 154 | #define USBC_EP3NAK (1 << 4) |
| 155 | #define USBC_EP3ACK (1 << 5) | 155 | #define USBC_EP3ACK (1 << 5) |
| 156 | 156 | ||
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 5ca97713bfb3..059fdf1bf5ee 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c | |||
| @@ -490,17 +490,8 @@ static void receive_buf(struct virtnet_info *vi, struct receive_queue *rq, | |||
| 490 | skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4; | 490 | skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4; |
| 491 | break; | 491 | break; |
| 492 | case VIRTIO_NET_HDR_GSO_UDP: | 492 | case VIRTIO_NET_HDR_GSO_UDP: |
| 493 | { | ||
| 494 | static bool warned; | ||
| 495 | |||
| 496 | if (!warned) { | ||
| 497 | warned = true; | ||
| 498 | netdev_warn(dev, | ||
| 499 | "host using disabled UFO feature; please fix it\n"); | ||
| 500 | } | ||
| 501 | skb_shinfo(skb)->gso_type = SKB_GSO_UDP; | 493 | skb_shinfo(skb)->gso_type = SKB_GSO_UDP; |
| 502 | break; | 494 | break; |
| 503 | } | ||
| 504 | case VIRTIO_NET_HDR_GSO_TCPV6: | 495 | case VIRTIO_NET_HDR_GSO_TCPV6: |
| 505 | skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6; | 496 | skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6; |
| 506 | break; | 497 | break; |
| @@ -888,6 +879,8 @@ static int xmit_skb(struct send_queue *sq, struct sk_buff *skb) | |||
| 888 | hdr->hdr.gso_type = VIRTIO_NET_HDR_GSO_TCPV4; | 879 | hdr->hdr.gso_type = VIRTIO_NET_HDR_GSO_TCPV4; |
| 889 | else if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6) | 880 | else if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6) |
| 890 | hdr->hdr.gso_type = VIRTIO_NET_HDR_GSO_TCPV6; | 881 | hdr->hdr.gso_type = VIRTIO_NET_HDR_GSO_TCPV6; |
| 882 | else if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP) | ||
| 883 | hdr->hdr.gso_type = VIRTIO_NET_HDR_GSO_UDP; | ||
| 891 | else | 884 | else |
| 892 | BUG(); | 885 | BUG(); |
| 893 | if (skb_shinfo(skb)->gso_type & SKB_GSO_TCP_ECN) | 886 | if (skb_shinfo(skb)->gso_type & SKB_GSO_TCP_ECN) |
| @@ -1748,7 +1741,7 @@ static int virtnet_probe(struct virtio_device *vdev) | |||
| 1748 | dev->features |= NETIF_F_HW_CSUM|NETIF_F_SG|NETIF_F_FRAGLIST; | 1741 | dev->features |= NETIF_F_HW_CSUM|NETIF_F_SG|NETIF_F_FRAGLIST; |
| 1749 | 1742 | ||
| 1750 | if (virtio_has_feature(vdev, VIRTIO_NET_F_GSO)) { | 1743 | if (virtio_has_feature(vdev, VIRTIO_NET_F_GSO)) { |
| 1751 | dev->hw_features |= NETIF_F_TSO | 1744 | dev->hw_features |= NETIF_F_TSO | NETIF_F_UFO |
| 1752 | | NETIF_F_TSO_ECN | NETIF_F_TSO6; | 1745 | | NETIF_F_TSO_ECN | NETIF_F_TSO6; |
| 1753 | } | 1746 | } |
| 1754 | /* Individual feature bits: what can host handle? */ | 1747 | /* Individual feature bits: what can host handle? */ |
| @@ -1758,9 +1751,11 @@ static int virtnet_probe(struct virtio_device *vdev) | |||
| 1758 | dev->hw_features |= NETIF_F_TSO6; | 1751 | dev->hw_features |= NETIF_F_TSO6; |
| 1759 | if (virtio_has_feature(vdev, VIRTIO_NET_F_HOST_ECN)) | 1752 | if (virtio_has_feature(vdev, VIRTIO_NET_F_HOST_ECN)) |
| 1760 | dev->hw_features |= NETIF_F_TSO_ECN; | 1753 | dev->hw_features |= NETIF_F_TSO_ECN; |
| 1754 | if (virtio_has_feature(vdev, VIRTIO_NET_F_HOST_UFO)) | ||
| 1755 | dev->hw_features |= NETIF_F_UFO; | ||
| 1761 | 1756 | ||
| 1762 | if (gso) | 1757 | if (gso) |
| 1763 | dev->features |= dev->hw_features & NETIF_F_ALL_TSO; | 1758 | dev->features |= dev->hw_features & (NETIF_F_ALL_TSO|NETIF_F_UFO); |
| 1764 | /* (!csum && gso) case will be fixed by register_netdev() */ | 1759 | /* (!csum && gso) case will be fixed by register_netdev() */ |
| 1765 | } | 1760 | } |
| 1766 | if (virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_CSUM)) | 1761 | if (virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_CSUM)) |
| @@ -1798,7 +1793,8 @@ static int virtnet_probe(struct virtio_device *vdev) | |||
| 1798 | /* If we can receive ANY GSO packets, we must allocate large ones. */ | 1793 | /* If we can receive ANY GSO packets, we must allocate large ones. */ |
| 1799 | if (virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO4) || | 1794 | if (virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO4) || |
| 1800 | virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO6) || | 1795 | virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO6) || |
| 1801 | virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_ECN)) | 1796 | virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_ECN) || |
| 1797 | virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_UFO)) | ||
| 1802 | vi->big_packets = true; | 1798 | vi->big_packets = true; |
| 1803 | 1799 | ||
| 1804 | if (virtio_has_feature(vdev, VIRTIO_NET_F_MRG_RXBUF)) | 1800 | if (virtio_has_feature(vdev, VIRTIO_NET_F_MRG_RXBUF)) |
| @@ -1994,9 +1990,9 @@ static struct virtio_device_id id_table[] = { | |||
| 1994 | static unsigned int features[] = { | 1990 | static unsigned int features[] = { |
| 1995 | VIRTIO_NET_F_CSUM, VIRTIO_NET_F_GUEST_CSUM, | 1991 | VIRTIO_NET_F_CSUM, VIRTIO_NET_F_GUEST_CSUM, |
| 1996 | VIRTIO_NET_F_GSO, VIRTIO_NET_F_MAC, | 1992 | VIRTIO_NET_F_GSO, VIRTIO_NET_F_MAC, |
| 1997 | VIRTIO_NET_F_HOST_TSO4, VIRTIO_NET_F_HOST_TSO6, | 1993 | VIRTIO_NET_F_HOST_TSO4, VIRTIO_NET_F_HOST_UFO, VIRTIO_NET_F_HOST_TSO6, |
| 1998 | VIRTIO_NET_F_HOST_ECN, VIRTIO_NET_F_GUEST_TSO4, VIRTIO_NET_F_GUEST_TSO6, | 1994 | VIRTIO_NET_F_HOST_ECN, VIRTIO_NET_F_GUEST_TSO4, VIRTIO_NET_F_GUEST_TSO6, |
| 1999 | VIRTIO_NET_F_GUEST_ECN, | 1995 | VIRTIO_NET_F_GUEST_ECN, VIRTIO_NET_F_GUEST_UFO, |
| 2000 | VIRTIO_NET_F_MRG_RXBUF, VIRTIO_NET_F_STATUS, VIRTIO_NET_F_CTRL_VQ, | 1996 | VIRTIO_NET_F_MRG_RXBUF, VIRTIO_NET_F_STATUS, VIRTIO_NET_F_CTRL_VQ, |
| 2001 | VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN, | 1997 | VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN, |
| 2002 | VIRTIO_NET_F_GUEST_ANNOUNCE, VIRTIO_NET_F_MQ, | 1998 | VIRTIO_NET_F_GUEST_ANNOUNCE, VIRTIO_NET_F_MQ, |
diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c index 7fbd89fbe107..a8c755dcab14 100644 --- a/drivers/net/vxlan.c +++ b/drivers/net/vxlan.c | |||
| @@ -2432,10 +2432,10 @@ static void vxlan_sock_work(struct work_struct *work) | |||
| 2432 | dev_put(vxlan->dev); | 2432 | dev_put(vxlan->dev); |
| 2433 | } | 2433 | } |
| 2434 | 2434 | ||
| 2435 | static int vxlan_newlink(struct net *net, struct net_device *dev, | 2435 | static int vxlan_newlink(struct net *src_net, struct net_device *dev, |
| 2436 | struct nlattr *tb[], struct nlattr *data[]) | 2436 | struct nlattr *tb[], struct nlattr *data[]) |
| 2437 | { | 2437 | { |
| 2438 | struct vxlan_net *vn = net_generic(net, vxlan_net_id); | 2438 | struct vxlan_net *vn = net_generic(src_net, vxlan_net_id); |
| 2439 | struct vxlan_dev *vxlan = netdev_priv(dev); | 2439 | struct vxlan_dev *vxlan = netdev_priv(dev); |
| 2440 | struct vxlan_rdst *dst = &vxlan->default_dst; | 2440 | struct vxlan_rdst *dst = &vxlan->default_dst; |
| 2441 | __u32 vni; | 2441 | __u32 vni; |
| @@ -2445,7 +2445,7 @@ static int vxlan_newlink(struct net *net, struct net_device *dev, | |||
| 2445 | if (!data[IFLA_VXLAN_ID]) | 2445 | if (!data[IFLA_VXLAN_ID]) |
| 2446 | return -EINVAL; | 2446 | return -EINVAL; |
| 2447 | 2447 | ||
| 2448 | vxlan->net = dev_net(dev); | 2448 | vxlan->net = src_net; |
| 2449 | 2449 | ||
| 2450 | vni = nla_get_u32(data[IFLA_VXLAN_ID]); | 2450 | vni = nla_get_u32(data[IFLA_VXLAN_ID]); |
| 2451 | dst->remote_vni = vni; | 2451 | dst->remote_vni = vni; |
| @@ -2481,7 +2481,7 @@ static int vxlan_newlink(struct net *net, struct net_device *dev, | |||
| 2481 | if (data[IFLA_VXLAN_LINK] && | 2481 | if (data[IFLA_VXLAN_LINK] && |
| 2482 | (dst->remote_ifindex = nla_get_u32(data[IFLA_VXLAN_LINK]))) { | 2482 | (dst->remote_ifindex = nla_get_u32(data[IFLA_VXLAN_LINK]))) { |
| 2483 | struct net_device *lowerdev | 2483 | struct net_device *lowerdev |
| 2484 | = __dev_get_by_index(net, dst->remote_ifindex); | 2484 | = __dev_get_by_index(src_net, dst->remote_ifindex); |
| 2485 | 2485 | ||
| 2486 | if (!lowerdev) { | 2486 | if (!lowerdev) { |
| 2487 | pr_info("ifindex %d does not exist\n", dst->remote_ifindex); | 2487 | pr_info("ifindex %d does not exist\n", dst->remote_ifindex); |
| @@ -2557,7 +2557,7 @@ static int vxlan_newlink(struct net *net, struct net_device *dev, | |||
| 2557 | nla_get_u8(data[IFLA_VXLAN_UDP_ZERO_CSUM6_RX])) | 2557 | nla_get_u8(data[IFLA_VXLAN_UDP_ZERO_CSUM6_RX])) |
| 2558 | vxlan->flags |= VXLAN_F_UDP_ZERO_CSUM6_RX; | 2558 | vxlan->flags |= VXLAN_F_UDP_ZERO_CSUM6_RX; |
| 2559 | 2559 | ||
| 2560 | if (vxlan_find_vni(net, vni, use_ipv6 ? AF_INET6 : AF_INET, | 2560 | if (vxlan_find_vni(src_net, vni, use_ipv6 ? AF_INET6 : AF_INET, |
| 2561 | vxlan->dst_port)) { | 2561 | vxlan->dst_port)) { |
| 2562 | pr_info("duplicate VNI %u\n", vni); | 2562 | pr_info("duplicate VNI %u\n", vni); |
| 2563 | return -EEXIST; | 2563 | return -EEXIST; |
diff --git a/drivers/net/wan/Kconfig b/drivers/net/wan/Kconfig index 94e234975c61..a2fdd15f285a 100644 --- a/drivers/net/wan/Kconfig +++ b/drivers/net/wan/Kconfig | |||
| @@ -25,7 +25,7 @@ if WAN | |||
| 25 | # There is no way to detect a comtrol sv11 - force it modular for now. | 25 | # There is no way to detect a comtrol sv11 - force it modular for now. |
| 26 | config HOSTESS_SV11 | 26 | config HOSTESS_SV11 |
| 27 | tristate "Comtrol Hostess SV-11 support" | 27 | tristate "Comtrol Hostess SV-11 support" |
| 28 | depends on ISA && m && ISA_DMA_API && INET && HDLC | 28 | depends on ISA && m && ISA_DMA_API && INET && HDLC && VIRT_TO_BUS |
| 29 | help | 29 | help |
| 30 | Driver for Comtrol Hostess SV-11 network card which | 30 | Driver for Comtrol Hostess SV-11 network card which |
| 31 | operates on low speed synchronous serial links at up to | 31 | operates on low speed synchronous serial links at up to |
| @@ -37,7 +37,7 @@ config HOSTESS_SV11 | |||
| 37 | # The COSA/SRP driver has not been tested as non-modular yet. | 37 | # The COSA/SRP driver has not been tested as non-modular yet. |
| 38 | config COSA | 38 | config COSA |
| 39 | tristate "COSA/SRP sync serial boards support" | 39 | tristate "COSA/SRP sync serial boards support" |
| 40 | depends on ISA && m && ISA_DMA_API && HDLC | 40 | depends on ISA && m && ISA_DMA_API && HDLC && VIRT_TO_BUS |
| 41 | ---help--- | 41 | ---help--- |
| 42 | Driver for COSA and SRP synchronous serial boards. | 42 | Driver for COSA and SRP synchronous serial boards. |
| 43 | 43 | ||
| @@ -87,7 +87,7 @@ config LANMEDIA | |||
| 87 | # There is no way to detect a Sealevel board. Force it modular | 87 | # There is no way to detect a Sealevel board. Force it modular |
| 88 | config SEALEVEL_4021 | 88 | config SEALEVEL_4021 |
| 89 | tristate "Sealevel Systems 4021 support" | 89 | tristate "Sealevel Systems 4021 support" |
| 90 | depends on ISA && m && ISA_DMA_API && INET && HDLC | 90 | depends on ISA && m && ISA_DMA_API && INET && HDLC && VIRT_TO_BUS |
| 91 | help | 91 | help |
| 92 | This is a driver for the Sealevel Systems ACB 56 serial I/O adapter. | 92 | This is a driver for the Sealevel Systems ACB 56 serial I/O adapter. |
| 93 | 93 | ||
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/net/wireless/iwlwifi/iwl-7000.c b/drivers/net/wireless/iwlwifi/iwl-7000.c index e5be2d21868f..a5f9198d5747 100644 --- a/drivers/net/wireless/iwlwifi/iwl-7000.c +++ b/drivers/net/wireless/iwlwifi/iwl-7000.c | |||
| @@ -69,8 +69,8 @@ | |||
| 69 | #include "iwl-agn-hw.h" | 69 | #include "iwl-agn-hw.h" |
| 70 | 70 | ||
| 71 | /* Highest firmware API version supported */ | 71 | /* Highest firmware API version supported */ |
| 72 | #define IWL7260_UCODE_API_MAX 10 | 72 | #define IWL7260_UCODE_API_MAX 12 |
| 73 | #define IWL3160_UCODE_API_MAX 10 | 73 | #define IWL3160_UCODE_API_MAX 12 |
| 74 | 74 | ||
| 75 | /* Oldest version we won't warn about */ | 75 | /* Oldest version we won't warn about */ |
| 76 | #define IWL7260_UCODE_API_OK 10 | 76 | #define IWL7260_UCODE_API_OK 10 |
| @@ -105,7 +105,7 @@ | |||
| 105 | #define IWL7265_MODULE_FIRMWARE(api) IWL7265_FW_PRE __stringify(api) ".ucode" | 105 | #define IWL7265_MODULE_FIRMWARE(api) IWL7265_FW_PRE __stringify(api) ".ucode" |
| 106 | 106 | ||
| 107 | #define IWL7265D_FW_PRE "iwlwifi-7265D-" | 107 | #define IWL7265D_FW_PRE "iwlwifi-7265D-" |
| 108 | #define IWL7265D_MODULE_FIRMWARE(api) IWL7265_FW_PRE __stringify(api) ".ucode" | 108 | #define IWL7265D_MODULE_FIRMWARE(api) IWL7265D_FW_PRE __stringify(api) ".ucode" |
| 109 | 109 | ||
| 110 | #define NVM_HW_SECTION_NUM_FAMILY_7000 0 | 110 | #define NVM_HW_SECTION_NUM_FAMILY_7000 0 |
| 111 | 111 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-8000.c b/drivers/net/wireless/iwlwifi/iwl-8000.c index bf0a95cb7153..3668fc57e770 100644 --- a/drivers/net/wireless/iwlwifi/iwl-8000.c +++ b/drivers/net/wireless/iwlwifi/iwl-8000.c | |||
| @@ -69,7 +69,7 @@ | |||
| 69 | #include "iwl-agn-hw.h" | 69 | #include "iwl-agn-hw.h" |
| 70 | 70 | ||
| 71 | /* Highest firmware API version supported */ | 71 | /* Highest firmware API version supported */ |
| 72 | #define IWL8000_UCODE_API_MAX 10 | 72 | #define IWL8000_UCODE_API_MAX 12 |
| 73 | 73 | ||
| 74 | /* Oldest version we won't warn about */ | 74 | /* Oldest version we won't warn about */ |
| 75 | #define IWL8000_UCODE_API_OK 10 | 75 | #define IWL8000_UCODE_API_OK 10 |
diff --git a/drivers/net/wireless/iwlwifi/iwl-fw-file.h b/drivers/net/wireless/iwlwifi/iwl-fw-file.h index f2a047f6bb3e..660ddb1b7d8a 100644 --- a/drivers/net/wireless/iwlwifi/iwl-fw-file.h +++ b/drivers/net/wireless/iwlwifi/iwl-fw-file.h | |||
| @@ -243,6 +243,10 @@ enum iwl_ucode_tlv_flag { | |||
| 243 | * @IWL_UCODE_TLV_API_SF_NO_DUMMY_NOTIF: ucode supports disabling dummy notif. | 243 | * @IWL_UCODE_TLV_API_SF_NO_DUMMY_NOTIF: ucode supports disabling dummy notif. |
| 244 | * @IWL_UCODE_TLV_API_FRAGMENTED_SCAN: This ucode supports active dwell time | 244 | * @IWL_UCODE_TLV_API_FRAGMENTED_SCAN: This ucode supports active dwell time |
| 245 | * longer than the passive one, which is essential for fragmented scan. | 245 | * longer than the passive one, which is essential for fragmented scan. |
| 246 | * @IWL_UCODE_TLV_API_BASIC_DWELL: use only basic dwell time in scan command, | ||
| 247 | * regardless of the band or the number of the probes. FW will calculate | ||
| 248 | * the actual dwell time. | ||
| 249 | * @IWL_UCODE_TLV_API_SINGLE_SCAN_EBS: EBS is supported for single scans too. | ||
| 246 | */ | 250 | */ |
| 247 | enum iwl_ucode_tlv_api { | 251 | enum iwl_ucode_tlv_api { |
| 248 | IWL_UCODE_TLV_API_WOWLAN_CONFIG_TID = BIT(0), | 252 | IWL_UCODE_TLV_API_WOWLAN_CONFIG_TID = BIT(0), |
| @@ -253,6 +257,8 @@ enum iwl_ucode_tlv_api { | |||
| 253 | IWL_UCODE_TLV_API_LMAC_SCAN = BIT(6), | 257 | IWL_UCODE_TLV_API_LMAC_SCAN = BIT(6), |
| 254 | IWL_UCODE_TLV_API_SF_NO_DUMMY_NOTIF = BIT(7), | 258 | IWL_UCODE_TLV_API_SF_NO_DUMMY_NOTIF = BIT(7), |
| 255 | IWL_UCODE_TLV_API_FRAGMENTED_SCAN = BIT(8), | 259 | IWL_UCODE_TLV_API_FRAGMENTED_SCAN = BIT(8), |
| 260 | IWL_UCODE_TLV_API_BASIC_DWELL = BIT(13), | ||
| 261 | IWL_UCODE_TLV_API_SINGLE_SCAN_EBS = BIT(16), | ||
| 256 | }; | 262 | }; |
| 257 | 263 | ||
| 258 | /** | 264 | /** |
diff --git a/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h b/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h index 1f2acf47bfb2..cfc0e65b34a5 100644 --- a/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h +++ b/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h | |||
| @@ -653,8 +653,11 @@ enum iwl_scan_channel_flags { | |||
| 653 | }; | 653 | }; |
| 654 | 654 | ||
| 655 | /* iwl_scan_channel_opt - CHANNEL_OPTIMIZATION_API_S | 655 | /* iwl_scan_channel_opt - CHANNEL_OPTIMIZATION_API_S |
| 656 | * @flags: enum iwl_scan_channel_flgs | 656 | * @flags: enum iwl_scan_channel_flags |
| 657 | * @non_ebs_ratio: how many regular scan iteration before EBS | 657 | * @non_ebs_ratio: defines the ratio of number of scan iterations where EBS is |
| 658 | * involved. | ||
| 659 | * 1 - EBS is disabled. | ||
| 660 | * 2 - every second scan will be full scan(and so on). | ||
| 658 | */ | 661 | */ |
| 659 | struct iwl_scan_channel_opt { | 662 | struct iwl_scan_channel_opt { |
| 660 | __le16 flags; | 663 | __le16 flags; |
| @@ -672,6 +675,7 @@ struct iwl_scan_channel_opt { | |||
| 672 | * @IWL_MVM_LMAC_SCAN_FLAG_FRAGMENTED: all passive scans will be fragmented | 675 | * @IWL_MVM_LMAC_SCAN_FLAG_FRAGMENTED: all passive scans will be fragmented |
| 673 | * @IWL_MVM_LMAC_SCAN_FLAGS_RRM_ENABLED: insert WFA vendor-specific TPC report | 676 | * @IWL_MVM_LMAC_SCAN_FLAGS_RRM_ENABLED: insert WFA vendor-specific TPC report |
| 674 | * and DS parameter set IEs into probe requests. | 677 | * and DS parameter set IEs into probe requests. |
| 678 | * @IWL_MVM_LMAC_SCAN_FLAG_MATCH: Send match found notification on matches | ||
| 675 | */ | 679 | */ |
| 676 | enum iwl_mvm_lmac_scan_flags { | 680 | enum iwl_mvm_lmac_scan_flags { |
| 677 | IWL_MVM_LMAC_SCAN_FLAG_PASS_ALL = BIT(0), | 681 | IWL_MVM_LMAC_SCAN_FLAG_PASS_ALL = BIT(0), |
| @@ -681,6 +685,7 @@ enum iwl_mvm_lmac_scan_flags { | |||
| 681 | IWL_MVM_LMAC_SCAN_FLAG_MULTIPLE_SSIDS = BIT(4), | 685 | IWL_MVM_LMAC_SCAN_FLAG_MULTIPLE_SSIDS = BIT(4), |
| 682 | IWL_MVM_LMAC_SCAN_FLAG_FRAGMENTED = BIT(5), | 686 | IWL_MVM_LMAC_SCAN_FLAG_FRAGMENTED = BIT(5), |
| 683 | IWL_MVM_LMAC_SCAN_FLAGS_RRM_ENABLED = BIT(6), | 687 | IWL_MVM_LMAC_SCAN_FLAGS_RRM_ENABLED = BIT(6), |
| 688 | IWL_MVM_LMAC_SCAN_FLAG_MATCH = BIT(9), | ||
| 684 | }; | 689 | }; |
| 685 | 690 | ||
| 686 | enum iwl_scan_priority { | 691 | enum iwl_scan_priority { |
diff --git a/drivers/net/wireless/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/iwlwifi/mvm/mac80211.c index e880f9d4717b..20915587c820 100644 --- a/drivers/net/wireless/iwlwifi/mvm/mac80211.c +++ b/drivers/net/wireless/iwlwifi/mvm/mac80211.c | |||
| @@ -3343,18 +3343,16 @@ static void iwl_mvm_mac_flush(struct ieee80211_hw *hw, | |||
| 3343 | msk |= mvmsta->tfd_queue_msk; | 3343 | msk |= mvmsta->tfd_queue_msk; |
| 3344 | } | 3344 | } |
| 3345 | 3345 | ||
| 3346 | if (drop) { | 3346 | msk &= ~BIT(vif->hw_queue[IEEE80211_AC_VO]); |
| 3347 | if (iwl_mvm_flush_tx_path(mvm, msk, true)) | ||
| 3348 | IWL_ERR(mvm, "flush request fail\n"); | ||
| 3349 | mutex_unlock(&mvm->mutex); | ||
| 3350 | } else { | ||
| 3351 | mutex_unlock(&mvm->mutex); | ||
| 3352 | 3347 | ||
| 3353 | /* this can take a while, and we may need/want other operations | 3348 | if (iwl_mvm_flush_tx_path(mvm, msk, true)) |
| 3354 | * to succeed while doing this, so do it without the mutex held | 3349 | IWL_ERR(mvm, "flush request fail\n"); |
| 3355 | */ | 3350 | mutex_unlock(&mvm->mutex); |
| 3356 | iwl_trans_wait_tx_queue_empty(mvm->trans, msk); | 3351 | |
| 3357 | } | 3352 | /* this can take a while, and we may need/want other operations |
| 3353 | * to succeed while doing this, so do it without the mutex held | ||
| 3354 | */ | ||
| 3355 | iwl_trans_wait_tx_queue_empty(mvm->trans, msk); | ||
| 3358 | } | 3356 | } |
| 3359 | 3357 | ||
| 3360 | const struct ieee80211_ops iwl_mvm_hw_ops = { | 3358 | const struct ieee80211_ops iwl_mvm_hw_ops = { |
diff --git a/drivers/net/wireless/iwlwifi/mvm/scan.c b/drivers/net/wireless/iwlwifi/mvm/scan.c index e5294d01181e..844bf7c4c8de 100644 --- a/drivers/net/wireless/iwlwifi/mvm/scan.c +++ b/drivers/net/wireless/iwlwifi/mvm/scan.c | |||
| @@ -72,6 +72,8 @@ | |||
| 72 | 72 | ||
| 73 | #define IWL_PLCP_QUIET_THRESH 1 | 73 | #define IWL_PLCP_QUIET_THRESH 1 |
| 74 | #define IWL_ACTIVE_QUIET_TIME 10 | 74 | #define IWL_ACTIVE_QUIET_TIME 10 |
| 75 | #define IWL_DENSE_EBS_SCAN_RATIO 5 | ||
| 76 | #define IWL_SPARSE_EBS_SCAN_RATIO 1 | ||
| 75 | 77 | ||
| 76 | struct iwl_mvm_scan_params { | 78 | struct iwl_mvm_scan_params { |
| 77 | u32 max_out_time; | 79 | u32 max_out_time; |
| @@ -171,15 +173,21 @@ static void iwl_mvm_scan_fill_ssids(struct iwl_ssid_ie *cmd_ssid, | |||
| 171 | * already included in the probe template, so we need to set only | 173 | * already included in the probe template, so we need to set only |
| 172 | * req->n_ssids - 1 bits in addition to the first bit. | 174 | * req->n_ssids - 1 bits in addition to the first bit. |
| 173 | */ | 175 | */ |
| 174 | static u16 iwl_mvm_get_active_dwell(enum ieee80211_band band, int n_ssids) | 176 | static u16 iwl_mvm_get_active_dwell(struct iwl_mvm *mvm, |
| 177 | enum ieee80211_band band, int n_ssids) | ||
| 175 | { | 178 | { |
| 179 | if (mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_BASIC_DWELL) | ||
| 180 | return 10; | ||
| 176 | if (band == IEEE80211_BAND_2GHZ) | 181 | if (band == IEEE80211_BAND_2GHZ) |
| 177 | return 20 + 3 * (n_ssids + 1); | 182 | return 20 + 3 * (n_ssids + 1); |
| 178 | return 10 + 2 * (n_ssids + 1); | 183 | return 10 + 2 * (n_ssids + 1); |
| 179 | } | 184 | } |
| 180 | 185 | ||
| 181 | static u16 iwl_mvm_get_passive_dwell(enum ieee80211_band band) | 186 | static u16 iwl_mvm_get_passive_dwell(struct iwl_mvm *mvm, |
| 187 | enum ieee80211_band band) | ||
| 182 | { | 188 | { |
| 189 | if (mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_BASIC_DWELL) | ||
| 190 | return 110; | ||
| 183 | return band == IEEE80211_BAND_2GHZ ? 100 + 20 : 100 + 10; | 191 | return band == IEEE80211_BAND_2GHZ ? 100 + 20 : 100 + 10; |
| 184 | } | 192 | } |
| 185 | 193 | ||
| @@ -331,7 +339,8 @@ static void iwl_mvm_scan_calc_params(struct iwl_mvm *mvm, | |||
| 331 | */ | 339 | */ |
| 332 | if (vif->type == NL80211_IFTYPE_P2P_DEVICE) { | 340 | if (vif->type == NL80211_IFTYPE_P2P_DEVICE) { |
| 333 | u32 passive_dwell = | 341 | u32 passive_dwell = |
| 334 | iwl_mvm_get_passive_dwell(IEEE80211_BAND_2GHZ); | 342 | iwl_mvm_get_passive_dwell(mvm, |
| 343 | IEEE80211_BAND_2GHZ); | ||
| 335 | params->max_out_time = passive_dwell; | 344 | params->max_out_time = passive_dwell; |
| 336 | } else { | 345 | } else { |
| 337 | params->passive_fragmented = true; | 346 | params->passive_fragmented = true; |
| @@ -348,8 +357,8 @@ not_bound: | |||
| 348 | params->dwell[band].passive = frag_passive_dwell; | 357 | params->dwell[band].passive = frag_passive_dwell; |
| 349 | else | 358 | else |
| 350 | params->dwell[band].passive = | 359 | params->dwell[band].passive = |
| 351 | iwl_mvm_get_passive_dwell(band); | 360 | iwl_mvm_get_passive_dwell(mvm, band); |
| 352 | params->dwell[band].active = iwl_mvm_get_active_dwell(band, | 361 | params->dwell[band].active = iwl_mvm_get_active_dwell(mvm, band, |
| 353 | n_ssids); | 362 | n_ssids); |
| 354 | } | 363 | } |
| 355 | } | 364 | } |
| @@ -1098,6 +1107,12 @@ int iwl_mvm_scan_offload_stop(struct iwl_mvm *mvm, bool notify) | |||
| 1098 | return iwl_umac_scan_stop(mvm, IWL_UMAC_SCAN_UID_SCHED_SCAN, | 1107 | return iwl_umac_scan_stop(mvm, IWL_UMAC_SCAN_UID_SCHED_SCAN, |
| 1099 | notify); | 1108 | notify); |
| 1100 | 1109 | ||
| 1110 | if (mvm->scan_status == IWL_MVM_SCAN_NONE) | ||
| 1111 | return 0; | ||
| 1112 | |||
| 1113 | if (iwl_mvm_is_radio_killed(mvm)) | ||
| 1114 | goto out; | ||
| 1115 | |||
| 1101 | if (mvm->scan_status != IWL_MVM_SCAN_SCHED && | 1116 | if (mvm->scan_status != IWL_MVM_SCAN_SCHED && |
| 1102 | (!(mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_LMAC_SCAN) || | 1117 | (!(mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_LMAC_SCAN) || |
| 1103 | mvm->scan_status != IWL_MVM_SCAN_OS)) { | 1118 | mvm->scan_status != IWL_MVM_SCAN_OS)) { |
| @@ -1134,6 +1149,7 @@ int iwl_mvm_scan_offload_stop(struct iwl_mvm *mvm, bool notify) | |||
| 1134 | if (mvm->scan_status == IWL_MVM_SCAN_OS) | 1149 | if (mvm->scan_status == IWL_MVM_SCAN_OS) |
| 1135 | iwl_mvm_unref(mvm, IWL_MVM_REF_SCAN); | 1150 | iwl_mvm_unref(mvm, IWL_MVM_REF_SCAN); |
| 1136 | 1151 | ||
| 1152 | out: | ||
| 1137 | mvm->scan_status = IWL_MVM_SCAN_NONE; | 1153 | mvm->scan_status = IWL_MVM_SCAN_NONE; |
| 1138 | 1154 | ||
| 1139 | if (notify) { | 1155 | if (notify) { |
| @@ -1290,18 +1306,6 @@ iwl_mvm_build_generic_unified_scan_cmd(struct iwl_mvm *mvm, | |||
| 1290 | cmd->scan_prio = cpu_to_le32(IWL_SCAN_PRIORITY_HIGH); | 1306 | cmd->scan_prio = cpu_to_le32(IWL_SCAN_PRIORITY_HIGH); |
| 1291 | cmd->iter_num = cpu_to_le32(1); | 1307 | cmd->iter_num = cpu_to_le32(1); |
| 1292 | 1308 | ||
| 1293 | if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_EBS_SUPPORT && | ||
| 1294 | mvm->last_ebs_successful) { | ||
| 1295 | cmd->channel_opt[0].flags = | ||
| 1296 | cpu_to_le16(IWL_SCAN_CHANNEL_FLAG_EBS | | ||
| 1297 | IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE | | ||
| 1298 | IWL_SCAN_CHANNEL_FLAG_CACHE_ADD); | ||
| 1299 | cmd->channel_opt[1].flags = | ||
| 1300 | cpu_to_le16(IWL_SCAN_CHANNEL_FLAG_EBS | | ||
| 1301 | IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE | | ||
| 1302 | IWL_SCAN_CHANNEL_FLAG_CACHE_ADD); | ||
| 1303 | } | ||
| 1304 | |||
| 1305 | if (iwl_mvm_rrm_scan_needed(mvm)) | 1309 | if (iwl_mvm_rrm_scan_needed(mvm)) |
| 1306 | cmd->scan_flags |= | 1310 | cmd->scan_flags |= |
| 1307 | cpu_to_le32(IWL_MVM_LMAC_SCAN_FLAGS_RRM_ENABLED); | 1311 | cpu_to_le32(IWL_MVM_LMAC_SCAN_FLAGS_RRM_ENABLED); |
| @@ -1376,6 +1380,22 @@ int iwl_mvm_unified_scan_lmac(struct iwl_mvm *mvm, | |||
| 1376 | cmd->schedule[1].iterations = 0; | 1380 | cmd->schedule[1].iterations = 0; |
| 1377 | cmd->schedule[1].full_scan_mul = 0; | 1381 | cmd->schedule[1].full_scan_mul = 0; |
| 1378 | 1382 | ||
| 1383 | if (mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_SINGLE_SCAN_EBS && | ||
| 1384 | mvm->last_ebs_successful) { | ||
| 1385 | cmd->channel_opt[0].flags = | ||
| 1386 | cpu_to_le16(IWL_SCAN_CHANNEL_FLAG_EBS | | ||
| 1387 | IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE | | ||
| 1388 | IWL_SCAN_CHANNEL_FLAG_CACHE_ADD); | ||
| 1389 | cmd->channel_opt[0].non_ebs_ratio = | ||
| 1390 | cpu_to_le16(IWL_DENSE_EBS_SCAN_RATIO); | ||
| 1391 | cmd->channel_opt[1].flags = | ||
| 1392 | cpu_to_le16(IWL_SCAN_CHANNEL_FLAG_EBS | | ||
| 1393 | IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE | | ||
| 1394 | IWL_SCAN_CHANNEL_FLAG_CACHE_ADD); | ||
| 1395 | cmd->channel_opt[1].non_ebs_ratio = | ||
| 1396 | cpu_to_le16(IWL_SPARSE_EBS_SCAN_RATIO); | ||
| 1397 | } | ||
| 1398 | |||
| 1379 | for (i = 1; i <= req->req.n_ssids; i++) | 1399 | for (i = 1; i <= req->req.n_ssids; i++) |
| 1380 | ssid_bitmap |= BIT(i); | 1400 | ssid_bitmap |= BIT(i); |
| 1381 | 1401 | ||
| @@ -1448,6 +1468,8 @@ int iwl_mvm_unified_sched_scan_lmac(struct iwl_mvm *mvm, | |||
| 1448 | 1468 | ||
| 1449 | if (iwl_mvm_scan_pass_all(mvm, req)) | 1469 | if (iwl_mvm_scan_pass_all(mvm, req)) |
| 1450 | flags |= IWL_MVM_LMAC_SCAN_FLAG_PASS_ALL; | 1470 | flags |= IWL_MVM_LMAC_SCAN_FLAG_PASS_ALL; |
| 1471 | else | ||
| 1472 | flags |= IWL_MVM_LMAC_SCAN_FLAG_MATCH; | ||
| 1451 | 1473 | ||
| 1452 | if (req->n_ssids == 1 && req->ssids[0].ssid_len != 0) | 1474 | if (req->n_ssids == 1 && req->ssids[0].ssid_len != 0) |
| 1453 | flags |= IWL_MVM_LMAC_SCAN_FLAG_PRE_CONNECTION; | 1475 | flags |= IWL_MVM_LMAC_SCAN_FLAG_PRE_CONNECTION; |
| @@ -1474,6 +1496,22 @@ int iwl_mvm_unified_sched_scan_lmac(struct iwl_mvm *mvm, | |||
| 1474 | cmd->schedule[1].iterations = 0xff; | 1496 | cmd->schedule[1].iterations = 0xff; |
| 1475 | cmd->schedule[1].full_scan_mul = IWL_FULL_SCAN_MULTIPLIER; | 1497 | cmd->schedule[1].full_scan_mul = IWL_FULL_SCAN_MULTIPLIER; |
| 1476 | 1498 | ||
| 1499 | if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_EBS_SUPPORT && | ||
| 1500 | mvm->last_ebs_successful) { | ||
| 1501 | cmd->channel_opt[0].flags = | ||
| 1502 | cpu_to_le16(IWL_SCAN_CHANNEL_FLAG_EBS | | ||
| 1503 | IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE | | ||
| 1504 | IWL_SCAN_CHANNEL_FLAG_CACHE_ADD); | ||
| 1505 | cmd->channel_opt[0].non_ebs_ratio = | ||
| 1506 | cpu_to_le16(IWL_DENSE_EBS_SCAN_RATIO); | ||
| 1507 | cmd->channel_opt[1].flags = | ||
| 1508 | cpu_to_le16(IWL_SCAN_CHANNEL_FLAG_EBS | | ||
| 1509 | IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE | | ||
| 1510 | IWL_SCAN_CHANNEL_FLAG_CACHE_ADD); | ||
| 1511 | cmd->channel_opt[1].non_ebs_ratio = | ||
| 1512 | cpu_to_le16(IWL_SPARSE_EBS_SCAN_RATIO); | ||
| 1513 | } | ||
| 1514 | |||
| 1477 | iwl_mvm_lmac_scan_cfg_channels(mvm, req->channels, req->n_channels, | 1515 | iwl_mvm_lmac_scan_cfg_channels(mvm, req->channels, req->n_channels, |
| 1478 | ssid_bitmap, cmd); | 1516 | ssid_bitmap, cmd); |
| 1479 | 1517 | ||
diff --git a/drivers/net/wireless/iwlwifi/mvm/tx.c b/drivers/net/wireless/iwlwifi/mvm/tx.c index 4f15d9decc81..c59d07567d90 100644 --- a/drivers/net/wireless/iwlwifi/mvm/tx.c +++ b/drivers/net/wireless/iwlwifi/mvm/tx.c | |||
| @@ -90,8 +90,6 @@ void iwl_mvm_set_tx_cmd(struct iwl_mvm *mvm, struct sk_buff *skb, | |||
| 90 | 90 | ||
| 91 | if (ieee80211_is_probe_resp(fc)) | 91 | if (ieee80211_is_probe_resp(fc)) |
| 92 | tx_flags |= TX_CMD_FLG_TSF; | 92 | tx_flags |= TX_CMD_FLG_TSF; |
| 93 | else if (ieee80211_is_back_req(fc)) | ||
| 94 | tx_flags |= TX_CMD_FLG_ACK | TX_CMD_FLG_BAR; | ||
| 95 | 93 | ||
| 96 | if (ieee80211_has_morefrags(fc)) | 94 | if (ieee80211_has_morefrags(fc)) |
| 97 | tx_flags |= TX_CMD_FLG_MORE_FRAG; | 95 | tx_flags |= TX_CMD_FLG_MORE_FRAG; |
| @@ -100,6 +98,15 @@ void iwl_mvm_set_tx_cmd(struct iwl_mvm *mvm, struct sk_buff *skb, | |||
| 100 | u8 *qc = ieee80211_get_qos_ctl(hdr); | 98 | u8 *qc = ieee80211_get_qos_ctl(hdr); |
| 101 | tx_cmd->tid_tspec = qc[0] & 0xf; | 99 | tx_cmd->tid_tspec = qc[0] & 0xf; |
| 102 | tx_flags &= ~TX_CMD_FLG_SEQ_CTL; | 100 | tx_flags &= ~TX_CMD_FLG_SEQ_CTL; |
| 101 | } else if (ieee80211_is_back_req(fc)) { | ||
| 102 | struct ieee80211_bar *bar = (void *)skb->data; | ||
| 103 | u16 control = le16_to_cpu(bar->control); | ||
| 104 | |||
| 105 | tx_flags |= TX_CMD_FLG_ACK | TX_CMD_FLG_BAR; | ||
| 106 | tx_cmd->tid_tspec = (control & | ||
| 107 | IEEE80211_BAR_CTRL_TID_INFO_MASK) >> | ||
| 108 | IEEE80211_BAR_CTRL_TID_INFO_SHIFT; | ||
| 109 | WARN_ON_ONCE(tx_cmd->tid_tspec >= IWL_MAX_TID_COUNT); | ||
| 103 | } else { | 110 | } else { |
| 104 | tx_cmd->tid_tspec = IWL_TID_NON_QOS; | 111 | tx_cmd->tid_tspec = IWL_TID_NON_QOS; |
| 105 | if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) | 112 | if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) |
| @@ -108,8 +115,12 @@ void iwl_mvm_set_tx_cmd(struct iwl_mvm *mvm, struct sk_buff *skb, | |||
| 108 | tx_flags &= ~TX_CMD_FLG_SEQ_CTL; | 115 | tx_flags &= ~TX_CMD_FLG_SEQ_CTL; |
| 109 | } | 116 | } |
| 110 | 117 | ||
| 111 | /* tid_tspec will default to 0 = BE when QOS isn't enabled */ | 118 | /* Default to 0 (BE) when tid_spec is set to IWL_TID_NON_QOS */ |
| 112 | ac = tid_to_mac80211_ac[tx_cmd->tid_tspec]; | 119 | if (tx_cmd->tid_tspec < IWL_MAX_TID_COUNT) |
| 120 | ac = tid_to_mac80211_ac[tx_cmd->tid_tspec]; | ||
| 121 | else | ||
| 122 | ac = tid_to_mac80211_ac[0]; | ||
| 123 | |||
| 113 | tx_flags |= iwl_mvm_bt_coex_tx_prio(mvm, hdr, info, ac) << | 124 | tx_flags |= iwl_mvm_bt_coex_tx_prio(mvm, hdr, info, ac) << |
| 114 | TX_CMD_FLG_BT_PRIO_POS; | 125 | TX_CMD_FLG_BT_PRIO_POS; |
| 115 | 126 | ||
diff --git a/drivers/net/wireless/iwlwifi/mvm/utils.c b/drivers/net/wireless/iwlwifi/mvm/utils.c index e56e77ef5d2e..917431e30f74 100644 --- a/drivers/net/wireless/iwlwifi/mvm/utils.c +++ b/drivers/net/wireless/iwlwifi/mvm/utils.c | |||
| @@ -665,7 +665,7 @@ bool iwl_mvm_rx_diversity_allowed(struct iwl_mvm *mvm) | |||
| 665 | if (num_of_ant(mvm->fw->valid_rx_ant) == 1) | 665 | if (num_of_ant(mvm->fw->valid_rx_ant) == 1) |
| 666 | return false; | 666 | return false; |
| 667 | 667 | ||
| 668 | if (!mvm->cfg->rx_with_siso_diversity) | 668 | if (mvm->cfg->rx_with_siso_diversity) |
| 669 | return false; | 669 | return false; |
| 670 | 670 | ||
| 671 | ieee80211_iterate_active_interfaces_atomic( | 671 | ieee80211_iterate_active_interfaces_atomic( |
diff --git a/drivers/net/wireless/iwlwifi/pcie/drv.c b/drivers/net/wireless/iwlwifi/pcie/drv.c index 2f0c4b170344..d5aadb00dd9e 100644 --- a/drivers/net/wireless/iwlwifi/pcie/drv.c +++ b/drivers/net/wireless/iwlwifi/pcie/drv.c | |||
| @@ -527,8 +527,10 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 527 | else if (cfg == &iwl7265_n_cfg) | 527 | else if (cfg == &iwl7265_n_cfg) |
| 528 | cfg_7265d = &iwl7265d_n_cfg; | 528 | cfg_7265d = &iwl7265d_n_cfg; |
| 529 | if (cfg_7265d && | 529 | if (cfg_7265d && |
| 530 | (iwl_trans->hw_rev & CSR_HW_REV_TYPE_MSK) == CSR_HW_REV_TYPE_7265D) | 530 | (iwl_trans->hw_rev & CSR_HW_REV_TYPE_MSK) == CSR_HW_REV_TYPE_7265D) { |
| 531 | cfg = cfg_7265d; | 531 | cfg = cfg_7265d; |
| 532 | iwl_trans->cfg = cfg_7265d; | ||
| 533 | } | ||
| 532 | #endif | 534 | #endif |
| 533 | 535 | ||
| 534 | pci_set_drvdata(pdev, iwl_trans); | 536 | pci_set_drvdata(pdev, iwl_trans); |
diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c index 846a2e6e34d8..c70efb9a6e78 100644 --- a/drivers/net/wireless/rtlwifi/pci.c +++ b/drivers/net/wireless/rtlwifi/pci.c | |||
| @@ -666,7 +666,8 @@ tx_status_ok: | |||
| 666 | } | 666 | } |
| 667 | 667 | ||
| 668 | static int _rtl_pci_init_one_rxdesc(struct ieee80211_hw *hw, | 668 | static int _rtl_pci_init_one_rxdesc(struct ieee80211_hw *hw, |
| 669 | u8 *entry, int rxring_idx, int desc_idx) | 669 | struct sk_buff *new_skb, u8 *entry, |
| 670 | int rxring_idx, int desc_idx) | ||
| 670 | { | 671 | { |
| 671 | struct rtl_priv *rtlpriv = rtl_priv(hw); | 672 | struct rtl_priv *rtlpriv = rtl_priv(hw); |
| 672 | struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); | 673 | struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); |
| @@ -674,11 +675,15 @@ static int _rtl_pci_init_one_rxdesc(struct ieee80211_hw *hw, | |||
| 674 | u8 tmp_one = 1; | 675 | u8 tmp_one = 1; |
| 675 | struct sk_buff *skb; | 676 | struct sk_buff *skb; |
| 676 | 677 | ||
| 678 | if (likely(new_skb)) { | ||
| 679 | skb = new_skb; | ||
| 680 | goto remap; | ||
| 681 | } | ||
| 677 | skb = dev_alloc_skb(rtlpci->rxbuffersize); | 682 | skb = dev_alloc_skb(rtlpci->rxbuffersize); |
| 678 | if (!skb) | 683 | if (!skb) |
| 679 | return 0; | 684 | return 0; |
| 680 | rtlpci->rx_ring[rxring_idx].rx_buf[desc_idx] = skb; | ||
| 681 | 685 | ||
| 686 | remap: | ||
| 682 | /* just set skb->cb to mapping addr for pci_unmap_single use */ | 687 | /* just set skb->cb to mapping addr for pci_unmap_single use */ |
| 683 | *((dma_addr_t *)skb->cb) = | 688 | *((dma_addr_t *)skb->cb) = |
| 684 | pci_map_single(rtlpci->pdev, skb_tail_pointer(skb), | 689 | pci_map_single(rtlpci->pdev, skb_tail_pointer(skb), |
| @@ -686,6 +691,7 @@ static int _rtl_pci_init_one_rxdesc(struct ieee80211_hw *hw, | |||
| 686 | bufferaddress = *((dma_addr_t *)skb->cb); | 691 | bufferaddress = *((dma_addr_t *)skb->cb); |
| 687 | if (pci_dma_mapping_error(rtlpci->pdev, bufferaddress)) | 692 | if (pci_dma_mapping_error(rtlpci->pdev, bufferaddress)) |
| 688 | return 0; | 693 | return 0; |
| 694 | rtlpci->rx_ring[rxring_idx].rx_buf[desc_idx] = skb; | ||
| 689 | if (rtlpriv->use_new_trx_flow) { | 695 | if (rtlpriv->use_new_trx_flow) { |
| 690 | rtlpriv->cfg->ops->set_desc(hw, (u8 *)entry, false, | 696 | rtlpriv->cfg->ops->set_desc(hw, (u8 *)entry, false, |
| 691 | HW_DESC_RX_PREPARE, | 697 | HW_DESC_RX_PREPARE, |
| @@ -781,6 +787,7 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw) | |||
| 781 | /*rx pkt */ | 787 | /*rx pkt */ |
| 782 | struct sk_buff *skb = rtlpci->rx_ring[rxring_idx].rx_buf[ | 788 | struct sk_buff *skb = rtlpci->rx_ring[rxring_idx].rx_buf[ |
| 783 | rtlpci->rx_ring[rxring_idx].idx]; | 789 | rtlpci->rx_ring[rxring_idx].idx]; |
| 790 | struct sk_buff *new_skb; | ||
| 784 | 791 | ||
| 785 | if (rtlpriv->use_new_trx_flow) { | 792 | if (rtlpriv->use_new_trx_flow) { |
| 786 | rx_remained_cnt = | 793 | rx_remained_cnt = |
| @@ -807,6 +814,13 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw) | |||
| 807 | pci_unmap_single(rtlpci->pdev, *((dma_addr_t *)skb->cb), | 814 | pci_unmap_single(rtlpci->pdev, *((dma_addr_t *)skb->cb), |
| 808 | rtlpci->rxbuffersize, PCI_DMA_FROMDEVICE); | 815 | rtlpci->rxbuffersize, PCI_DMA_FROMDEVICE); |
| 809 | 816 | ||
| 817 | /* get a new skb - if fail, old one will be reused */ | ||
| 818 | new_skb = dev_alloc_skb(rtlpci->rxbuffersize); | ||
| 819 | if (unlikely(!new_skb)) { | ||
| 820 | pr_err("Allocation of new skb failed in %s\n", | ||
| 821 | __func__); | ||
| 822 | goto no_new; | ||
| 823 | } | ||
| 810 | if (rtlpriv->use_new_trx_flow) { | 824 | if (rtlpriv->use_new_trx_flow) { |
| 811 | buffer_desc = | 825 | buffer_desc = |
| 812 | &rtlpci->rx_ring[rxring_idx].buffer_desc | 826 | &rtlpci->rx_ring[rxring_idx].buffer_desc |
| @@ -911,14 +925,16 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw) | |||
| 911 | schedule_work(&rtlpriv->works.lps_change_work); | 925 | schedule_work(&rtlpriv->works.lps_change_work); |
| 912 | } | 926 | } |
| 913 | end: | 927 | end: |
| 928 | skb = new_skb; | ||
| 929 | no_new: | ||
| 914 | if (rtlpriv->use_new_trx_flow) { | 930 | if (rtlpriv->use_new_trx_flow) { |
| 915 | _rtl_pci_init_one_rxdesc(hw, (u8 *)buffer_desc, | 931 | _rtl_pci_init_one_rxdesc(hw, skb, (u8 *)buffer_desc, |
| 916 | rxring_idx, | 932 | rxring_idx, |
| 917 | rtlpci->rx_ring[rxring_idx].idx); | 933 | rtlpci->rx_ring[rxring_idx].idx); |
| 918 | } else { | 934 | } else { |
| 919 | _rtl_pci_init_one_rxdesc(hw, (u8 *)pdesc, rxring_idx, | 935 | _rtl_pci_init_one_rxdesc(hw, skb, (u8 *)pdesc, |
| 936 | rxring_idx, | ||
| 920 | rtlpci->rx_ring[rxring_idx].idx); | 937 | rtlpci->rx_ring[rxring_idx].idx); |
| 921 | |||
| 922 | if (rtlpci->rx_ring[rxring_idx].idx == | 938 | if (rtlpci->rx_ring[rxring_idx].idx == |
| 923 | rtlpci->rxringcount - 1) | 939 | rtlpci->rxringcount - 1) |
| 924 | rtlpriv->cfg->ops->set_desc(hw, (u8 *)pdesc, | 940 | rtlpriv->cfg->ops->set_desc(hw, (u8 *)pdesc, |
| @@ -1307,7 +1323,7 @@ static int _rtl_pci_init_rx_ring(struct ieee80211_hw *hw, int rxring_idx) | |||
| 1307 | rtlpci->rx_ring[rxring_idx].idx = 0; | 1323 | rtlpci->rx_ring[rxring_idx].idx = 0; |
| 1308 | for (i = 0; i < rtlpci->rxringcount; i++) { | 1324 | for (i = 0; i < rtlpci->rxringcount; i++) { |
| 1309 | entry = &rtlpci->rx_ring[rxring_idx].buffer_desc[i]; | 1325 | entry = &rtlpci->rx_ring[rxring_idx].buffer_desc[i]; |
| 1310 | if (!_rtl_pci_init_one_rxdesc(hw, (u8 *)entry, | 1326 | if (!_rtl_pci_init_one_rxdesc(hw, NULL, (u8 *)entry, |
| 1311 | rxring_idx, i)) | 1327 | rxring_idx, i)) |
| 1312 | return -ENOMEM; | 1328 | return -ENOMEM; |
| 1313 | } | 1329 | } |
| @@ -1332,7 +1348,7 @@ static int _rtl_pci_init_rx_ring(struct ieee80211_hw *hw, int rxring_idx) | |||
| 1332 | 1348 | ||
| 1333 | for (i = 0; i < rtlpci->rxringcount; i++) { | 1349 | for (i = 0; i < rtlpci->rxringcount; i++) { |
| 1334 | entry = &rtlpci->rx_ring[rxring_idx].desc[i]; | 1350 | entry = &rtlpci->rx_ring[rxring_idx].desc[i]; |
| 1335 | if (!_rtl_pci_init_one_rxdesc(hw, (u8 *)entry, | 1351 | if (!_rtl_pci_init_one_rxdesc(hw, NULL, (u8 *)entry, |
| 1336 | rxring_idx, i)) | 1352 | rxring_idx, i)) |
| 1337 | return -ENOMEM; | 1353 | return -ENOMEM; |
| 1338 | } | 1354 | } |
diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c index 9259a732e8a4..037f74f0fcf6 100644 --- a/drivers/net/xen-netback/interface.c +++ b/drivers/net/xen-netback/interface.c | |||
| @@ -578,6 +578,7 @@ int xenvif_connect(struct xenvif_queue *queue, unsigned long tx_ring_ref, | |||
| 578 | goto err_rx_unbind; | 578 | goto err_rx_unbind; |
| 579 | } | 579 | } |
| 580 | queue->task = task; | 580 | queue->task = task; |
| 581 | get_task_struct(task); | ||
| 581 | 582 | ||
| 582 | task = kthread_create(xenvif_dealloc_kthread, | 583 | task = kthread_create(xenvif_dealloc_kthread, |
| 583 | (void *)queue, "%s-dealloc", queue->name); | 584 | (void *)queue, "%s-dealloc", queue->name); |
| @@ -634,6 +635,7 @@ void xenvif_disconnect(struct xenvif *vif) | |||
| 634 | 635 | ||
| 635 | if (queue->task) { | 636 | if (queue->task) { |
| 636 | kthread_stop(queue->task); | 637 | kthread_stop(queue->task); |
| 638 | put_task_struct(queue->task); | ||
| 637 | queue->task = NULL; | 639 | queue->task = NULL; |
| 638 | } | 640 | } |
| 639 | 641 | ||
diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c index 908e65e9b821..c8ce701a7efb 100644 --- a/drivers/net/xen-netback/netback.c +++ b/drivers/net/xen-netback/netback.c | |||
| @@ -2109,8 +2109,7 @@ int xenvif_kthread_guest_rx(void *data) | |||
| 2109 | */ | 2109 | */ |
| 2110 | if (unlikely(vif->disabled && queue->id == 0)) { | 2110 | if (unlikely(vif->disabled && queue->id == 0)) { |
| 2111 | xenvif_carrier_off(vif); | 2111 | xenvif_carrier_off(vif); |
| 2112 | xenvif_rx_queue_purge(queue); | 2112 | break; |
| 2113 | continue; | ||
| 2114 | } | 2113 | } |
| 2115 | 2114 | ||
| 2116 | if (!skb_queue_empty(&queue->rx_queue)) | 2115 | if (!skb_queue_empty(&queue->rx_queue)) |
diff --git a/drivers/net/xen-netback/xenbus.c b/drivers/net/xen-netback/xenbus.c index efbaf2ae1999..794204e34fba 100644 --- a/drivers/net/xen-netback/xenbus.c +++ b/drivers/net/xen-netback/xenbus.c | |||
| @@ -737,6 +737,7 @@ static void connect(struct backend_info *be) | |||
| 737 | } | 737 | } |
| 738 | 738 | ||
| 739 | queue->remaining_credit = credit_bytes; | 739 | queue->remaining_credit = credit_bytes; |
| 740 | queue->credit_usec = credit_usec; | ||
| 740 | 741 | ||
| 741 | err = connect_rings(be, queue); | 742 | err = connect_rings(be, queue); |
| 742 | if (err) { | 743 | if (err) { |
diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c index 22bcb4e12e2a..d8c10764f130 100644 --- a/drivers/net/xen-netfront.c +++ b/drivers/net/xen-netfront.c | |||
| @@ -88,10 +88,8 @@ struct netfront_cb { | |||
| 88 | #define IRQ_NAME_SIZE (QUEUE_NAME_SIZE + 3) | 88 | #define IRQ_NAME_SIZE (QUEUE_NAME_SIZE + 3) |
| 89 | 89 | ||
| 90 | struct netfront_stats { | 90 | struct netfront_stats { |
| 91 | u64 rx_packets; | 91 | u64 packets; |
| 92 | u64 tx_packets; | 92 | u64 bytes; |
| 93 | u64 rx_bytes; | ||
| 94 | u64 tx_bytes; | ||
| 95 | struct u64_stats_sync syncp; | 93 | struct u64_stats_sync syncp; |
| 96 | }; | 94 | }; |
| 97 | 95 | ||
| @@ -160,7 +158,8 @@ struct netfront_info { | |||
| 160 | struct netfront_queue *queues; | 158 | struct netfront_queue *queues; |
| 161 | 159 | ||
| 162 | /* Statistics */ | 160 | /* Statistics */ |
| 163 | struct netfront_stats __percpu *stats; | 161 | struct netfront_stats __percpu *rx_stats; |
| 162 | struct netfront_stats __percpu *tx_stats; | ||
| 164 | 163 | ||
| 165 | atomic_t rx_gso_checksum_fixup; | 164 | atomic_t rx_gso_checksum_fixup; |
| 166 | }; | 165 | }; |
| @@ -565,7 +564,7 @@ static int xennet_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 565 | { | 564 | { |
| 566 | unsigned short id; | 565 | unsigned short id; |
| 567 | struct netfront_info *np = netdev_priv(dev); | 566 | struct netfront_info *np = netdev_priv(dev); |
| 568 | struct netfront_stats *stats = this_cpu_ptr(np->stats); | 567 | struct netfront_stats *tx_stats = this_cpu_ptr(np->tx_stats); |
| 569 | struct xen_netif_tx_request *tx; | 568 | struct xen_netif_tx_request *tx; |
| 570 | char *data = skb->data; | 569 | char *data = skb->data; |
| 571 | RING_IDX i; | 570 | RING_IDX i; |
| @@ -672,10 +671,10 @@ static int xennet_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 672 | if (notify) | 671 | if (notify) |
| 673 | notify_remote_via_irq(queue->tx_irq); | 672 | notify_remote_via_irq(queue->tx_irq); |
| 674 | 673 | ||
| 675 | u64_stats_update_begin(&stats->syncp); | 674 | u64_stats_update_begin(&tx_stats->syncp); |
| 676 | stats->tx_bytes += skb->len; | 675 | tx_stats->bytes += skb->len; |
| 677 | stats->tx_packets++; | 676 | tx_stats->packets++; |
| 678 | u64_stats_update_end(&stats->syncp); | 677 | u64_stats_update_end(&tx_stats->syncp); |
| 679 | 678 | ||
| 680 | /* Note: It is not safe to access skb after xennet_tx_buf_gc()! */ | 679 | /* Note: It is not safe to access skb after xennet_tx_buf_gc()! */ |
| 681 | xennet_tx_buf_gc(queue); | 680 | xennet_tx_buf_gc(queue); |
| @@ -931,7 +930,7 @@ static int checksum_setup(struct net_device *dev, struct sk_buff *skb) | |||
| 931 | static int handle_incoming_queue(struct netfront_queue *queue, | 930 | static int handle_incoming_queue(struct netfront_queue *queue, |
| 932 | struct sk_buff_head *rxq) | 931 | struct sk_buff_head *rxq) |
| 933 | { | 932 | { |
| 934 | struct netfront_stats *stats = this_cpu_ptr(queue->info->stats); | 933 | struct netfront_stats *rx_stats = this_cpu_ptr(queue->info->rx_stats); |
| 935 | int packets_dropped = 0; | 934 | int packets_dropped = 0; |
| 936 | struct sk_buff *skb; | 935 | struct sk_buff *skb; |
| 937 | 936 | ||
| @@ -952,10 +951,10 @@ static int handle_incoming_queue(struct netfront_queue *queue, | |||
| 952 | continue; | 951 | continue; |
| 953 | } | 952 | } |
| 954 | 953 | ||
| 955 | u64_stats_update_begin(&stats->syncp); | 954 | u64_stats_update_begin(&rx_stats->syncp); |
| 956 | stats->rx_packets++; | 955 | rx_stats->packets++; |
| 957 | stats->rx_bytes += skb->len; | 956 | rx_stats->bytes += skb->len; |
| 958 | u64_stats_update_end(&stats->syncp); | 957 | u64_stats_update_end(&rx_stats->syncp); |
| 959 | 958 | ||
| 960 | /* Pass it up. */ | 959 | /* Pass it up. */ |
| 961 | napi_gro_receive(&queue->napi, skb); | 960 | napi_gro_receive(&queue->napi, skb); |
| @@ -1079,18 +1078,22 @@ static struct rtnl_link_stats64 *xennet_get_stats64(struct net_device *dev, | |||
| 1079 | int cpu; | 1078 | int cpu; |
| 1080 | 1079 | ||
| 1081 | for_each_possible_cpu(cpu) { | 1080 | for_each_possible_cpu(cpu) { |
| 1082 | struct netfront_stats *stats = per_cpu_ptr(np->stats, cpu); | 1081 | struct netfront_stats *rx_stats = per_cpu_ptr(np->rx_stats, cpu); |
| 1082 | struct netfront_stats *tx_stats = per_cpu_ptr(np->tx_stats, cpu); | ||
| 1083 | u64 rx_packets, rx_bytes, tx_packets, tx_bytes; | 1083 | u64 rx_packets, rx_bytes, tx_packets, tx_bytes; |
| 1084 | unsigned int start; | 1084 | unsigned int start; |
| 1085 | 1085 | ||
| 1086 | do { | 1086 | do { |
| 1087 | start = u64_stats_fetch_begin_irq(&stats->syncp); | 1087 | start = u64_stats_fetch_begin_irq(&tx_stats->syncp); |
| 1088 | tx_packets = tx_stats->packets; | ||
| 1089 | tx_bytes = tx_stats->bytes; | ||
| 1090 | } while (u64_stats_fetch_retry_irq(&tx_stats->syncp, start)); | ||
| 1088 | 1091 | ||
| 1089 | rx_packets = stats->rx_packets; | 1092 | do { |
| 1090 | tx_packets = stats->tx_packets; | 1093 | start = u64_stats_fetch_begin_irq(&rx_stats->syncp); |
| 1091 | rx_bytes = stats->rx_bytes; | 1094 | rx_packets = rx_stats->packets; |
| 1092 | tx_bytes = stats->tx_bytes; | 1095 | rx_bytes = rx_stats->bytes; |
| 1093 | } while (u64_stats_fetch_retry_irq(&stats->syncp, start)); | 1096 | } while (u64_stats_fetch_retry_irq(&rx_stats->syncp, start)); |
| 1094 | 1097 | ||
| 1095 | tot->rx_packets += rx_packets; | 1098 | tot->rx_packets += rx_packets; |
| 1096 | tot->tx_packets += tx_packets; | 1099 | tot->tx_packets += tx_packets; |
| @@ -1275,6 +1278,15 @@ static const struct net_device_ops xennet_netdev_ops = { | |||
| 1275 | #endif | 1278 | #endif |
| 1276 | }; | 1279 | }; |
| 1277 | 1280 | ||
| 1281 | static void xennet_free_netdev(struct net_device *netdev) | ||
| 1282 | { | ||
| 1283 | struct netfront_info *np = netdev_priv(netdev); | ||
| 1284 | |||
| 1285 | free_percpu(np->rx_stats); | ||
| 1286 | free_percpu(np->tx_stats); | ||
| 1287 | free_netdev(netdev); | ||
| 1288 | } | ||
| 1289 | |||
| 1278 | static struct net_device *xennet_create_dev(struct xenbus_device *dev) | 1290 | static struct net_device *xennet_create_dev(struct xenbus_device *dev) |
| 1279 | { | 1291 | { |
| 1280 | int err; | 1292 | int err; |
| @@ -1295,8 +1307,11 @@ static struct net_device *xennet_create_dev(struct xenbus_device *dev) | |||
| 1295 | np->queues = NULL; | 1307 | np->queues = NULL; |
| 1296 | 1308 | ||
| 1297 | err = -ENOMEM; | 1309 | err = -ENOMEM; |
| 1298 | np->stats = netdev_alloc_pcpu_stats(struct netfront_stats); | 1310 | np->rx_stats = netdev_alloc_pcpu_stats(struct netfront_stats); |
| 1299 | if (np->stats == NULL) | 1311 | if (np->rx_stats == NULL) |
| 1312 | goto exit; | ||
| 1313 | np->tx_stats = netdev_alloc_pcpu_stats(struct netfront_stats); | ||
| 1314 | if (np->tx_stats == NULL) | ||
| 1300 | goto exit; | 1315 | goto exit; |
| 1301 | 1316 | ||
| 1302 | netdev->netdev_ops = &xennet_netdev_ops; | 1317 | netdev->netdev_ops = &xennet_netdev_ops; |
| @@ -1327,7 +1342,7 @@ static struct net_device *xennet_create_dev(struct xenbus_device *dev) | |||
| 1327 | return netdev; | 1342 | return netdev; |
| 1328 | 1343 | ||
| 1329 | exit: | 1344 | exit: |
| 1330 | free_netdev(netdev); | 1345 | xennet_free_netdev(netdev); |
| 1331 | return ERR_PTR(err); | 1346 | return ERR_PTR(err); |
| 1332 | } | 1347 | } |
| 1333 | 1348 | ||
| @@ -1369,7 +1384,7 @@ static int netfront_probe(struct xenbus_device *dev, | |||
| 1369 | return 0; | 1384 | return 0; |
| 1370 | 1385 | ||
| 1371 | fail: | 1386 | fail: |
| 1372 | free_netdev(netdev); | 1387 | xennet_free_netdev(netdev); |
| 1373 | dev_set_drvdata(&dev->dev, NULL); | 1388 | dev_set_drvdata(&dev->dev, NULL); |
| 1374 | return err; | 1389 | return err; |
| 1375 | } | 1390 | } |
| @@ -2189,9 +2204,7 @@ static int xennet_remove(struct xenbus_device *dev) | |||
| 2189 | info->queues = NULL; | 2204 | info->queues = NULL; |
| 2190 | } | 2205 | } |
| 2191 | 2206 | ||
| 2192 | free_percpu(info->stats); | 2207 | xennet_free_netdev(info->netdev); |
| 2193 | |||
| 2194 | free_netdev(info->netdev); | ||
| 2195 | 2208 | ||
| 2196 | return 0; | 2209 | return 0; |
| 2197 | } | 2210 | } |
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/host/pcie-designware.c b/drivers/pci/host/pcie-designware.c index df781cdf13c1..17ca98657a28 100644 --- a/drivers/pci/host/pcie-designware.c +++ b/drivers/pci/host/pcie-designware.c | |||
| @@ -283,6 +283,9 @@ static int dw_msi_setup_irq(struct msi_controller *chip, struct pci_dev *pdev, | |||
| 283 | struct msi_msg msg; | 283 | struct msi_msg msg; |
| 284 | struct pcie_port *pp = sys_to_pcie(pdev->bus->sysdata); | 284 | struct pcie_port *pp = sys_to_pcie(pdev->bus->sysdata); |
| 285 | 285 | ||
| 286 | if (desc->msi_attrib.is_msix) | ||
| 287 | return -EINVAL; | ||
| 288 | |||
| 286 | irq = assign_irq(1, desc, &pos); | 289 | irq = assign_irq(1, desc, &pos); |
| 287 | if (irq < 0) | 290 | if (irq < 0) |
| 288 | return irq; | 291 | return irq; |
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..903d5078b5ed 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
| @@ -324,18 +324,52 @@ static void quirk_s3_64M(struct pci_dev *dev) | |||
| 324 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_S3, PCI_DEVICE_ID_S3_868, quirk_s3_64M); | 324 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_S3, PCI_DEVICE_ID_S3_868, quirk_s3_64M); |
| 325 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_S3, PCI_DEVICE_ID_S3_968, quirk_s3_64M); | 325 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_S3, PCI_DEVICE_ID_S3_968, quirk_s3_64M); |
| 326 | 326 | ||
| 327 | static void quirk_io(struct pci_dev *dev, int pos, unsigned size, | ||
| 328 | const char *name) | ||
| 329 | { | ||
| 330 | u32 region; | ||
| 331 | struct pci_bus_region bus_region; | ||
| 332 | struct resource *res = dev->resource + pos; | ||
| 333 | |||
| 334 | pci_read_config_dword(dev, PCI_BASE_ADDRESS_0 + (pos << 2), ®ion); | ||
| 335 | |||
| 336 | if (!region) | ||
| 337 | return; | ||
| 338 | |||
| 339 | res->name = pci_name(dev); | ||
| 340 | res->flags = region & ~PCI_BASE_ADDRESS_IO_MASK; | ||
| 341 | res->flags |= | ||
| 342 | (IORESOURCE_IO | IORESOURCE_PCI_FIXED | IORESOURCE_SIZEALIGN); | ||
| 343 | region &= ~(size - 1); | ||
| 344 | |||
| 345 | /* Convert from PCI bus to resource space */ | ||
| 346 | bus_region.start = region; | ||
| 347 | bus_region.end = region + size - 1; | ||
| 348 | pcibios_bus_to_resource(dev->bus, res, &bus_region); | ||
| 349 | |||
| 350 | dev_info(&dev->dev, FW_BUG "%s quirk: reg 0x%x: %pR\n", | ||
| 351 | name, PCI_BASE_ADDRESS_0 + (pos << 2), res); | ||
| 352 | } | ||
| 353 | |||
| 327 | /* | 354 | /* |
| 328 | * Some CS5536 BIOSes (for example, the Soekris NET5501 board w/ comBIOS | 355 | * Some CS5536 BIOSes (for example, the Soekris NET5501 board w/ comBIOS |
| 329 | * ver. 1.33 20070103) don't set the correct ISA PCI region header info. | 356 | * ver. 1.33 20070103) don't set the correct ISA PCI region header info. |
| 330 | * BAR0 should be 8 bytes; instead, it may be set to something like 8k | 357 | * BAR0 should be 8 bytes; instead, it may be set to something like 8k |
| 331 | * (which conflicts w/ BAR1's memory range). | 358 | * (which conflicts w/ BAR1's memory range). |
| 359 | * | ||
| 360 | * CS553x's ISA PCI BARs may also be read-only (ref: | ||
| 361 | * https://bugzilla.kernel.org/show_bug.cgi?id=85991 - Comment #4 forward). | ||
| 332 | */ | 362 | */ |
| 333 | static void quirk_cs5536_vsa(struct pci_dev *dev) | 363 | static void quirk_cs5536_vsa(struct pci_dev *dev) |
| 334 | { | 364 | { |
| 365 | static char *name = "CS5536 ISA bridge"; | ||
| 366 | |||
| 335 | if (pci_resource_len(dev, 0) != 8) { | 367 | if (pci_resource_len(dev, 0) != 8) { |
| 336 | struct resource *res = &dev->resource[0]; | 368 | quirk_io(dev, 0, 8, name); /* SMB */ |
| 337 | res->end = res->start + 8 - 1; | 369 | quirk_io(dev, 1, 256, name); /* GPIO */ |
| 338 | dev_info(&dev->dev, "CS5536 ISA bridge bug detected (incorrect header); workaround applied\n"); | 370 | quirk_io(dev, 2, 64, name); /* MFGPT */ |
| 371 | dev_info(&dev->dev, "%s bug detected (incorrect header); workaround applied\n", | ||
| 372 | name); | ||
| 339 | } | 373 | } |
| 340 | } | 374 | } |
| 341 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_ISA, quirk_cs5536_vsa); | 375 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_ISA, quirk_cs5536_vsa); |
| @@ -3028,6 +3062,20 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_REALTEK, 0x8169, | |||
| 3028 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MELLANOX, PCI_ANY_ID, | 3062 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MELLANOX, PCI_ANY_ID, |
| 3029 | quirk_broken_intx_masking); | 3063 | quirk_broken_intx_masking); |
| 3030 | 3064 | ||
| 3065 | static void quirk_no_bus_reset(struct pci_dev *dev) | ||
| 3066 | { | ||
| 3067 | dev->dev_flags |= PCI_DEV_FLAGS_NO_BUS_RESET; | ||
| 3068 | } | ||
| 3069 | |||
| 3070 | /* | ||
| 3071 | * Atheros AR93xx chips do not behave after a bus reset. The device will | ||
| 3072 | * throw a Link Down error on AER-capable systems and regardless of AER, | ||
| 3073 | * config space of the device is never accessible again and typically | ||
| 3074 | * causes the system to hang or reset when access is attempted. | ||
| 3075 | * http://www.spinics.net/lists/linux-pci/msg34797.html | ||
| 3076 | */ | ||
| 3077 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x0030, quirk_no_bus_reset); | ||
| 3078 | |||
| 3031 | #ifdef CONFIG_ACPI | 3079 | #ifdef CONFIG_ACPI |
| 3032 | /* | 3080 | /* |
| 3033 | * Apple: Shutdown Cactus Ridge Thunderbolt controller. | 3081 | * 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-at91.c b/drivers/pinctrl/pinctrl-at91.c index dfd021e8268f..f4cd0b9b2438 100644 --- a/drivers/pinctrl/pinctrl-at91.c +++ b/drivers/pinctrl/pinctrl-at91.c | |||
| @@ -177,7 +177,7 @@ struct at91_pinctrl { | |||
| 177 | struct device *dev; | 177 | struct device *dev; |
| 178 | struct pinctrl_dev *pctl; | 178 | struct pinctrl_dev *pctl; |
| 179 | 179 | ||
| 180 | int nbanks; | 180 | int nactive_banks; |
| 181 | 181 | ||
| 182 | uint32_t *mux_mask; | 182 | uint32_t *mux_mask; |
| 183 | int nmux; | 183 | int nmux; |
| @@ -653,12 +653,18 @@ static int pin_check_config(struct at91_pinctrl *info, const char *name, | |||
| 653 | int mux; | 653 | int mux; |
| 654 | 654 | ||
| 655 | /* check if it's a valid config */ | 655 | /* check if it's a valid config */ |
| 656 | if (pin->bank >= info->nbanks) { | 656 | if (pin->bank >= gpio_banks) { |
| 657 | dev_err(info->dev, "%s: pin conf %d bank_id %d >= nbanks %d\n", | 657 | dev_err(info->dev, "%s: pin conf %d bank_id %d >= nbanks %d\n", |
| 658 | name, index, pin->bank, info->nbanks); | 658 | name, index, pin->bank, gpio_banks); |
| 659 | return -EINVAL; | 659 | return -EINVAL; |
| 660 | } | 660 | } |
| 661 | 661 | ||
| 662 | if (!gpio_chips[pin->bank]) { | ||
| 663 | dev_err(info->dev, "%s: pin conf %d bank_id %d not enabled\n", | ||
| 664 | name, index, pin->bank); | ||
| 665 | return -ENXIO; | ||
| 666 | } | ||
| 667 | |||
| 662 | if (pin->pin >= MAX_NB_GPIO_PER_BANK) { | 668 | if (pin->pin >= MAX_NB_GPIO_PER_BANK) { |
| 663 | dev_err(info->dev, "%s: pin conf %d pin_bank_id %d >= %d\n", | 669 | dev_err(info->dev, "%s: pin conf %d pin_bank_id %d >= %d\n", |
| 664 | name, index, pin->pin, MAX_NB_GPIO_PER_BANK); | 670 | name, index, pin->pin, MAX_NB_GPIO_PER_BANK); |
| @@ -981,7 +987,8 @@ static void at91_pinctrl_child_count(struct at91_pinctrl *info, | |||
| 981 | 987 | ||
| 982 | for_each_child_of_node(np, child) { | 988 | for_each_child_of_node(np, child) { |
| 983 | if (of_device_is_compatible(child, gpio_compat)) { | 989 | if (of_device_is_compatible(child, gpio_compat)) { |
| 984 | info->nbanks++; | 990 | if (of_device_is_available(child)) |
| 991 | info->nactive_banks++; | ||
| 985 | } else { | 992 | } else { |
| 986 | info->nfunctions++; | 993 | info->nfunctions++; |
| 987 | info->ngroups += of_get_child_count(child); | 994 | info->ngroups += of_get_child_count(child); |
| @@ -1003,11 +1010,11 @@ static int at91_pinctrl_mux_mask(struct at91_pinctrl *info, | |||
| 1003 | } | 1010 | } |
| 1004 | 1011 | ||
| 1005 | size /= sizeof(*list); | 1012 | size /= sizeof(*list); |
| 1006 | if (!size || size % info->nbanks) { | 1013 | if (!size || size % gpio_banks) { |
| 1007 | dev_err(info->dev, "wrong mux mask array should be by %d\n", info->nbanks); | 1014 | dev_err(info->dev, "wrong mux mask array should be by %d\n", gpio_banks); |
| 1008 | return -EINVAL; | 1015 | return -EINVAL; |
| 1009 | } | 1016 | } |
| 1010 | info->nmux = size / info->nbanks; | 1017 | info->nmux = size / gpio_banks; |
| 1011 | 1018 | ||
| 1012 | info->mux_mask = devm_kzalloc(info->dev, sizeof(u32) * size, GFP_KERNEL); | 1019 | info->mux_mask = devm_kzalloc(info->dev, sizeof(u32) * size, GFP_KERNEL); |
| 1013 | if (!info->mux_mask) { | 1020 | if (!info->mux_mask) { |
| @@ -1131,7 +1138,7 @@ static int at91_pinctrl_probe_dt(struct platform_device *pdev, | |||
| 1131 | of_match_device(at91_pinctrl_of_match, &pdev->dev)->data; | 1138 | of_match_device(at91_pinctrl_of_match, &pdev->dev)->data; |
| 1132 | at91_pinctrl_child_count(info, np); | 1139 | at91_pinctrl_child_count(info, np); |
| 1133 | 1140 | ||
| 1134 | if (info->nbanks < 1) { | 1141 | if (gpio_banks < 1) { |
| 1135 | dev_err(&pdev->dev, "you need to specify at least one gpio-controller\n"); | 1142 | dev_err(&pdev->dev, "you need to specify at least one gpio-controller\n"); |
| 1136 | return -EINVAL; | 1143 | return -EINVAL; |
| 1137 | } | 1144 | } |
| @@ -1144,7 +1151,7 @@ static int at91_pinctrl_probe_dt(struct platform_device *pdev, | |||
| 1144 | 1151 | ||
| 1145 | dev_dbg(&pdev->dev, "mux-mask\n"); | 1152 | dev_dbg(&pdev->dev, "mux-mask\n"); |
| 1146 | tmp = info->mux_mask; | 1153 | tmp = info->mux_mask; |
| 1147 | for (i = 0; i < info->nbanks; i++) { | 1154 | for (i = 0; i < gpio_banks; i++) { |
| 1148 | for (j = 0; j < info->nmux; j++, tmp++) { | 1155 | for (j = 0; j < info->nmux; j++, tmp++) { |
| 1149 | dev_dbg(&pdev->dev, "%d:%d\t0x%x\n", i, j, tmp[0]); | 1156 | dev_dbg(&pdev->dev, "%d:%d\t0x%x\n", i, j, tmp[0]); |
| 1150 | } | 1157 | } |
| @@ -1162,7 +1169,7 @@ static int at91_pinctrl_probe_dt(struct platform_device *pdev, | |||
| 1162 | if (!info->groups) | 1169 | if (!info->groups) |
| 1163 | return -ENOMEM; | 1170 | return -ENOMEM; |
| 1164 | 1171 | ||
| 1165 | dev_dbg(&pdev->dev, "nbanks = %d\n", info->nbanks); | 1172 | dev_dbg(&pdev->dev, "nbanks = %d\n", gpio_banks); |
| 1166 | dev_dbg(&pdev->dev, "nfunctions = %d\n", info->nfunctions); | 1173 | dev_dbg(&pdev->dev, "nfunctions = %d\n", info->nfunctions); |
| 1167 | dev_dbg(&pdev->dev, "ngroups = %d\n", info->ngroups); | 1174 | dev_dbg(&pdev->dev, "ngroups = %d\n", info->ngroups); |
| 1168 | 1175 | ||
| @@ -1185,7 +1192,7 @@ static int at91_pinctrl_probe(struct platform_device *pdev) | |||
| 1185 | { | 1192 | { |
| 1186 | struct at91_pinctrl *info; | 1193 | struct at91_pinctrl *info; |
| 1187 | struct pinctrl_pin_desc *pdesc; | 1194 | struct pinctrl_pin_desc *pdesc; |
| 1188 | int ret, i, j, k; | 1195 | int ret, i, j, k, ngpio_chips_enabled = 0; |
| 1189 | 1196 | ||
| 1190 | info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL); | 1197 | info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL); |
| 1191 | if (!info) | 1198 | if (!info) |
| @@ -1200,23 +1207,27 @@ static int at91_pinctrl_probe(struct platform_device *pdev) | |||
| 1200 | * to obtain references to the struct gpio_chip * for them, and we | 1207 | * to obtain references to the struct gpio_chip * for them, and we |
| 1201 | * need this to proceed. | 1208 | * need this to proceed. |
| 1202 | */ | 1209 | */ |
| 1203 | for (i = 0; i < info->nbanks; i++) { | 1210 | for (i = 0; i < gpio_banks; i++) |
| 1204 | if (!gpio_chips[i]) { | 1211 | if (gpio_chips[i]) |
| 1205 | dev_warn(&pdev->dev, "GPIO chip %d not registered yet\n", i); | 1212 | ngpio_chips_enabled++; |
| 1206 | devm_kfree(&pdev->dev, info); | 1213 | |
| 1207 | return -EPROBE_DEFER; | 1214 | if (ngpio_chips_enabled < info->nactive_banks) { |
| 1208 | } | 1215 | dev_warn(&pdev->dev, |
| 1216 | "All GPIO chips are not registered yet (%d/%d)\n", | ||
| 1217 | ngpio_chips_enabled, info->nactive_banks); | ||
| 1218 | devm_kfree(&pdev->dev, info); | ||
| 1219 | return -EPROBE_DEFER; | ||
| 1209 | } | 1220 | } |
| 1210 | 1221 | ||
| 1211 | at91_pinctrl_desc.name = dev_name(&pdev->dev); | 1222 | at91_pinctrl_desc.name = dev_name(&pdev->dev); |
| 1212 | at91_pinctrl_desc.npins = info->nbanks * MAX_NB_GPIO_PER_BANK; | 1223 | at91_pinctrl_desc.npins = gpio_banks * MAX_NB_GPIO_PER_BANK; |
| 1213 | at91_pinctrl_desc.pins = pdesc = | 1224 | at91_pinctrl_desc.pins = pdesc = |
| 1214 | devm_kzalloc(&pdev->dev, sizeof(*pdesc) * at91_pinctrl_desc.npins, GFP_KERNEL); | 1225 | devm_kzalloc(&pdev->dev, sizeof(*pdesc) * at91_pinctrl_desc.npins, GFP_KERNEL); |
| 1215 | 1226 | ||
| 1216 | if (!at91_pinctrl_desc.pins) | 1227 | if (!at91_pinctrl_desc.pins) |
| 1217 | return -ENOMEM; | 1228 | return -ENOMEM; |
| 1218 | 1229 | ||
| 1219 | for (i = 0 , k = 0; i < info->nbanks; i++) { | 1230 | for (i = 0, k = 0; i < gpio_banks; i++) { |
| 1220 | for (j = 0; j < MAX_NB_GPIO_PER_BANK; j++, k++) { | 1231 | for (j = 0; j < MAX_NB_GPIO_PER_BANK; j++, k++) { |
| 1221 | pdesc->number = k; | 1232 | pdesc->number = k; |
| 1222 | pdesc->name = kasprintf(GFP_KERNEL, "pio%c%d", i + 'A', j); | 1233 | pdesc->name = kasprintf(GFP_KERNEL, "pio%c%d", i + 'A', j); |
| @@ -1234,8 +1245,9 @@ static int at91_pinctrl_probe(struct platform_device *pdev) | |||
| 1234 | } | 1245 | } |
| 1235 | 1246 | ||
| 1236 | /* We will handle a range of GPIO pins */ | 1247 | /* We will handle a range of GPIO pins */ |
| 1237 | for (i = 0; i < info->nbanks; i++) | 1248 | for (i = 0; i < gpio_banks; i++) |
| 1238 | pinctrl_add_gpio_range(info->pctl, &gpio_chips[i]->range); | 1249 | if (gpio_chips[i]) |
| 1250 | pinctrl_add_gpio_range(info->pctl, &gpio_chips[i]->range); | ||
| 1239 | 1251 | ||
| 1240 | dev_info(&pdev->dev, "initialized AT91 pinctrl driver\n"); | 1252 | dev_info(&pdev->dev, "initialized AT91 pinctrl driver\n"); |
| 1241 | 1253 | ||
| @@ -1613,9 +1625,10 @@ static void gpio_irq_handler(unsigned irq, struct irq_desc *desc) | |||
| 1613 | static int at91_gpio_of_irq_setup(struct platform_device *pdev, | 1625 | static int at91_gpio_of_irq_setup(struct platform_device *pdev, |
| 1614 | struct at91_gpio_chip *at91_gpio) | 1626 | struct at91_gpio_chip *at91_gpio) |
| 1615 | { | 1627 | { |
| 1628 | struct gpio_chip *gpiochip_prev = NULL; | ||
| 1616 | struct at91_gpio_chip *prev = NULL; | 1629 | struct at91_gpio_chip *prev = NULL; |
| 1617 | struct irq_data *d = irq_get_irq_data(at91_gpio->pioc_virq); | 1630 | struct irq_data *d = irq_get_irq_data(at91_gpio->pioc_virq); |
| 1618 | int ret; | 1631 | int ret, i; |
| 1619 | 1632 | ||
| 1620 | at91_gpio->pioc_hwirq = irqd_to_hwirq(d); | 1633 | at91_gpio->pioc_hwirq = irqd_to_hwirq(d); |
| 1621 | 1634 | ||
| @@ -1641,24 +1654,33 @@ static int at91_gpio_of_irq_setup(struct platform_device *pdev, | |||
| 1641 | return ret; | 1654 | return ret; |
| 1642 | } | 1655 | } |
| 1643 | 1656 | ||
| 1644 | /* Setup chained handler */ | ||
| 1645 | if (at91_gpio->pioc_idx) | ||
| 1646 | prev = gpio_chips[at91_gpio->pioc_idx - 1]; | ||
| 1647 | |||
| 1648 | /* The top level handler handles one bank of GPIOs, except | 1657 | /* The top level handler handles one bank of GPIOs, except |
| 1649 | * on some SoC it can handle up to three... | 1658 | * on some SoC it can handle up to three... |
| 1650 | * We only set up the handler for the first of the list. | 1659 | * We only set up the handler for the first of the list. |
| 1651 | */ | 1660 | */ |
| 1652 | if (prev && prev->next == at91_gpio) | 1661 | gpiochip_prev = irq_get_handler_data(at91_gpio->pioc_virq); |
| 1662 | if (!gpiochip_prev) { | ||
| 1663 | /* Then register the chain on the parent IRQ */ | ||
| 1664 | gpiochip_set_chained_irqchip(&at91_gpio->chip, | ||
| 1665 | &gpio_irqchip, | ||
| 1666 | at91_gpio->pioc_virq, | ||
| 1667 | gpio_irq_handler); | ||
| 1653 | return 0; | 1668 | return 0; |
| 1669 | } | ||
| 1654 | 1670 | ||
| 1655 | /* Then register the chain on the parent IRQ */ | 1671 | prev = container_of(gpiochip_prev, struct at91_gpio_chip, chip); |
| 1656 | gpiochip_set_chained_irqchip(&at91_gpio->chip, | ||
| 1657 | &gpio_irqchip, | ||
| 1658 | at91_gpio->pioc_virq, | ||
| 1659 | gpio_irq_handler); | ||
| 1660 | 1672 | ||
| 1661 | return 0; | 1673 | /* we can only have 2 banks before */ |
| 1674 | for (i = 0; i < 2; i++) { | ||
| 1675 | if (prev->next) { | ||
| 1676 | prev = prev->next; | ||
| 1677 | } else { | ||
| 1678 | prev->next = at91_gpio; | ||
| 1679 | return 0; | ||
| 1680 | } | ||
| 1681 | } | ||
| 1682 | |||
| 1683 | return -EINVAL; | ||
| 1662 | } | 1684 | } |
| 1663 | 1685 | ||
| 1664 | /* This structure is replicated for each GPIO block allocated at probe time */ | 1686 | /* This structure is replicated for each GPIO block allocated at probe time */ |
| @@ -1675,24 +1697,6 @@ static struct gpio_chip at91_gpio_template = { | |||
| 1675 | .ngpio = MAX_NB_GPIO_PER_BANK, | 1697 | .ngpio = MAX_NB_GPIO_PER_BANK, |
| 1676 | }; | 1698 | }; |
| 1677 | 1699 | ||
| 1678 | static void at91_gpio_probe_fixup(void) | ||
| 1679 | { | ||
| 1680 | unsigned i; | ||
| 1681 | struct at91_gpio_chip *at91_gpio, *last = NULL; | ||
| 1682 | |||
| 1683 | for (i = 0; i < gpio_banks; i++) { | ||
| 1684 | at91_gpio = gpio_chips[i]; | ||
| 1685 | |||
| 1686 | /* | ||
| 1687 | * GPIO controller are grouped on some SoC: | ||
| 1688 | * PIOC, PIOD and PIOE can share the same IRQ line | ||
| 1689 | */ | ||
| 1690 | if (last && last->pioc_virq == at91_gpio->pioc_virq) | ||
| 1691 | last->next = at91_gpio; | ||
| 1692 | last = at91_gpio; | ||
| 1693 | } | ||
| 1694 | } | ||
| 1695 | |||
| 1696 | static struct of_device_id at91_gpio_of_match[] = { | 1700 | static struct of_device_id at91_gpio_of_match[] = { |
| 1697 | { .compatible = "atmel,at91sam9x5-gpio", .data = &at91sam9x5_ops, }, | 1701 | { .compatible = "atmel,at91sam9x5-gpio", .data = &at91sam9x5_ops, }, |
| 1698 | { .compatible = "atmel,at91rm9200-gpio", .data = &at91rm9200_ops }, | 1702 | { .compatible = "atmel,at91rm9200-gpio", .data = &at91rm9200_ops }, |
| @@ -1805,8 +1809,6 @@ static int at91_gpio_probe(struct platform_device *pdev) | |||
| 1805 | gpio_chips[alias_idx] = at91_chip; | 1809 | gpio_chips[alias_idx] = at91_chip; |
| 1806 | gpio_banks = max(gpio_banks, alias_idx + 1); | 1810 | gpio_banks = max(gpio_banks, alias_idx + 1); |
| 1807 | 1811 | ||
| 1808 | at91_gpio_probe_fixup(); | ||
| 1809 | |||
| 1810 | ret = at91_gpio_of_irq_setup(pdev, at91_chip); | 1812 | ret = at91_gpio_of_irq_setup(pdev, at91_chip); |
| 1811 | if (ret) | 1813 | if (ret) |
| 1812 | goto irq_setup_err; | 1814 | goto irq_setup_err; |
diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c index ba74f0aa60c7..43eacc924b7e 100644 --- a/drivers/pinctrl/pinctrl-rockchip.c +++ b/drivers/pinctrl/pinctrl-rockchip.c | |||
| @@ -89,6 +89,7 @@ struct rockchip_iomux { | |||
| 89 | * @reg_pull: optional separate register for additional pull settings | 89 | * @reg_pull: optional separate register for additional pull settings |
| 90 | * @clk: clock of the gpio bank | 90 | * @clk: clock of the gpio bank |
| 91 | * @irq: interrupt of the gpio bank | 91 | * @irq: interrupt of the gpio bank |
| 92 | * @saved_enables: Saved content of GPIO_INTEN at suspend time. | ||
| 92 | * @pin_base: first pin number | 93 | * @pin_base: first pin number |
| 93 | * @nr_pins: number of pins in this bank | 94 | * @nr_pins: number of pins in this bank |
| 94 | * @name: name of the bank | 95 | * @name: name of the bank |
| @@ -107,6 +108,7 @@ struct rockchip_pin_bank { | |||
| 107 | struct regmap *regmap_pull; | 108 | struct regmap *regmap_pull; |
| 108 | struct clk *clk; | 109 | struct clk *clk; |
| 109 | int irq; | 110 | int irq; |
| 111 | u32 saved_enables; | ||
| 110 | u32 pin_base; | 112 | u32 pin_base; |
| 111 | u8 nr_pins; | 113 | u8 nr_pins; |
| 112 | char *name; | 114 | char *name; |
| @@ -1396,10 +1398,7 @@ static void rockchip_irq_demux(unsigned int irq, struct irq_desc *desc) | |||
| 1396 | { | 1398 | { |
| 1397 | struct irq_chip *chip = irq_get_chip(irq); | 1399 | struct irq_chip *chip = irq_get_chip(irq); |
| 1398 | struct rockchip_pin_bank *bank = irq_get_handler_data(irq); | 1400 | struct rockchip_pin_bank *bank = irq_get_handler_data(irq); |
| 1399 | u32 polarity = 0, data = 0; | ||
| 1400 | u32 pend; | 1401 | u32 pend; |
| 1401 | bool edge_changed = false; | ||
| 1402 | unsigned long flags; | ||
| 1403 | 1402 | ||
| 1404 | 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); |
| 1405 | 1404 | ||
| @@ -1407,12 +1406,6 @@ static void rockchip_irq_demux(unsigned int irq, struct irq_desc *desc) | |||
| 1407 | 1406 | ||
| 1408 | pend = readl_relaxed(bank->reg_base + GPIO_INT_STATUS); | 1407 | pend = readl_relaxed(bank->reg_base + GPIO_INT_STATUS); |
| 1409 | 1408 | ||
| 1410 | if (bank->toggle_edge_mode) { | ||
| 1411 | polarity = readl_relaxed(bank->reg_base + | ||
| 1412 | GPIO_INT_POLARITY); | ||
| 1413 | data = readl_relaxed(bank->reg_base + GPIO_EXT_PORT); | ||
| 1414 | } | ||
| 1415 | |||
| 1416 | while (pend) { | 1409 | while (pend) { |
| 1417 | unsigned int virq; | 1410 | unsigned int virq; |
| 1418 | 1411 | ||
| @@ -1432,27 +1425,31 @@ static void rockchip_irq_demux(unsigned int irq, struct irq_desc *desc) | |||
| 1432 | * needs manual intervention. | 1425 | * needs manual intervention. |
| 1433 | */ | 1426 | */ |
| 1434 | if (bank->toggle_edge_mode & BIT(irq)) { | 1427 | if (bank->toggle_edge_mode & BIT(irq)) { |
| 1435 | if (data & BIT(irq)) | 1428 | u32 data, data_old, polarity; |
| 1436 | polarity &= ~BIT(irq); | 1429 | unsigned long flags; |
| 1437 | else | ||
| 1438 | polarity |= BIT(irq); | ||
| 1439 | 1430 | ||
| 1440 | edge_changed = true; | 1431 | data = readl_relaxed(bank->reg_base + GPIO_EXT_PORT); |
| 1441 | } | 1432 | do { |
| 1433 | spin_lock_irqsave(&bank->slock, flags); | ||
| 1442 | 1434 | ||
| 1443 | generic_handle_irq(virq); | 1435 | polarity = readl_relaxed(bank->reg_base + |
| 1444 | } | 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); | ||
| 1445 | 1443 | ||
| 1446 | if (bank->toggle_edge_mode && edge_changed) { | 1444 | spin_unlock_irqrestore(&bank->slock, flags); |
| 1447 | /* Interrupt params should only be set with ints disabled */ | ||
| 1448 | spin_lock_irqsave(&bank->slock, flags); | ||
| 1449 | 1445 | ||
| 1450 | data = readl_relaxed(bank->reg_base + GPIO_INTEN); | 1446 | data_old = data; |
| 1451 | writel_relaxed(0, bank->reg_base + GPIO_INTEN); | 1447 | data = readl_relaxed(bank->reg_base + |
| 1452 | writel(polarity, bank->reg_base + GPIO_INT_POLARITY); | 1448 | GPIO_EXT_PORT); |
| 1453 | writel(data, bank->reg_base + GPIO_INTEN); | 1449 | } while ((data & BIT(irq)) != (data_old & BIT(irq))); |
| 1450 | } | ||
| 1454 | 1451 | ||
| 1455 | spin_unlock_irqrestore(&bank->slock, flags); | 1452 | generic_handle_irq(virq); |
| 1456 | } | 1453 | } |
| 1457 | 1454 | ||
| 1458 | chained_irq_exit(chip, desc); | 1455 | chained_irq_exit(chip, desc); |
| @@ -1543,6 +1540,51 @@ static int rockchip_irq_set_type(struct irq_data *d, unsigned int type) | |||
| 1543 | return 0; | 1540 | return 0; |
| 1544 | } | 1541 | } |
| 1545 | 1542 | ||
| 1543 | static void rockchip_irq_suspend(struct irq_data *d) | ||
| 1544 | { | ||
| 1545 | struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); | ||
| 1546 | struct rockchip_pin_bank *bank = gc->private; | ||
| 1547 | |||
| 1548 | bank->saved_enables = irq_reg_readl(gc, GPIO_INTEN); | ||
| 1549 | irq_reg_writel(gc, gc->wake_active, GPIO_INTEN); | ||
| 1550 | } | ||
| 1551 | |||
| 1552 | static void rockchip_irq_resume(struct irq_data *d) | ||
| 1553 | { | ||
| 1554 | struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); | ||
| 1555 | struct rockchip_pin_bank *bank = gc->private; | ||
| 1556 | |||
| 1557 | irq_reg_writel(gc, bank->saved_enables, GPIO_INTEN); | ||
| 1558 | } | ||
| 1559 | |||
| 1560 | static void rockchip_irq_disable(struct irq_data *d) | ||
| 1561 | { | ||
| 1562 | struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); | ||
| 1563 | u32 val; | ||
| 1564 | |||
| 1565 | irq_gc_lock(gc); | ||
| 1566 | |||
| 1567 | val = irq_reg_readl(gc, GPIO_INTEN); | ||
| 1568 | val &= ~d->mask; | ||
| 1569 | irq_reg_writel(gc, val, GPIO_INTEN); | ||
| 1570 | |||
| 1571 | irq_gc_unlock(gc); | ||
| 1572 | } | ||
| 1573 | |||
| 1574 | static void rockchip_irq_enable(struct irq_data *d) | ||
| 1575 | { | ||
| 1576 | struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); | ||
| 1577 | u32 val; | ||
| 1578 | |||
| 1579 | irq_gc_lock(gc); | ||
| 1580 | |||
| 1581 | val = irq_reg_readl(gc, GPIO_INTEN); | ||
| 1582 | val |= d->mask; | ||
| 1583 | irq_reg_writel(gc, val, GPIO_INTEN); | ||
| 1584 | |||
| 1585 | irq_gc_unlock(gc); | ||
| 1586 | } | ||
| 1587 | |||
| 1546 | static int rockchip_interrupts_register(struct platform_device *pdev, | 1588 | static int rockchip_interrupts_register(struct platform_device *pdev, |
| 1547 | struct rockchip_pinctrl *info) | 1589 | struct rockchip_pinctrl *info) |
| 1548 | { | 1590 | { |
| @@ -1581,12 +1623,16 @@ static int rockchip_interrupts_register(struct platform_device *pdev, | |||
| 1581 | gc = irq_get_domain_generic_chip(bank->domain, 0); | 1623 | gc = irq_get_domain_generic_chip(bank->domain, 0); |
| 1582 | gc->reg_base = bank->reg_base; | 1624 | gc->reg_base = bank->reg_base; |
| 1583 | gc->private = bank; | 1625 | gc->private = bank; |
| 1584 | gc->chip_types[0].regs.mask = GPIO_INTEN; | 1626 | gc->chip_types[0].regs.mask = GPIO_INTMASK; |
| 1585 | gc->chip_types[0].regs.ack = GPIO_PORTS_EOI; | 1627 | gc->chip_types[0].regs.ack = GPIO_PORTS_EOI; |
| 1586 | gc->chip_types[0].chip.irq_ack = irq_gc_ack_set_bit; | 1628 | gc->chip_types[0].chip.irq_ack = irq_gc_ack_set_bit; |
| 1587 | gc->chip_types[0].chip.irq_mask = irq_gc_mask_clr_bit; | 1629 | gc->chip_types[0].chip.irq_mask = irq_gc_mask_set_bit; |
| 1588 | gc->chip_types[0].chip.irq_unmask = irq_gc_mask_set_bit; | 1630 | gc->chip_types[0].chip.irq_unmask = irq_gc_mask_clr_bit; |
| 1631 | gc->chip_types[0].chip.irq_enable = rockchip_irq_enable; | ||
| 1632 | gc->chip_types[0].chip.irq_disable = rockchip_irq_disable; | ||
| 1589 | gc->chip_types[0].chip.irq_set_wake = irq_gc_set_wake; | 1633 | gc->chip_types[0].chip.irq_set_wake = irq_gc_set_wake; |
| 1634 | gc->chip_types[0].chip.irq_suspend = rockchip_irq_suspend; | ||
| 1635 | gc->chip_types[0].chip.irq_resume = rockchip_irq_resume; | ||
| 1590 | gc->chip_types[0].chip.irq_set_type = rockchip_irq_set_type; | 1636 | gc->chip_types[0].chip.irq_set_type = rockchip_irq_set_type; |
| 1591 | gc->wake_enabled = IRQ_MSK(bank->nr_pins); | 1637 | gc->wake_enabled = IRQ_MSK(bank->nr_pins); |
| 1592 | 1638 | ||
diff --git a/drivers/pinctrl/pinctrl-st.c b/drivers/pinctrl/pinctrl-st.c index 7c9d51382248..9e5ec00084bb 100644 --- a/drivers/pinctrl/pinctrl-st.c +++ b/drivers/pinctrl/pinctrl-st.c | |||
| @@ -1012,8 +1012,10 @@ static void st_pinconf_dbg_show(struct pinctrl_dev *pctldev, | |||
| 1012 | struct seq_file *s, unsigned pin_id) | 1012 | struct seq_file *s, unsigned pin_id) |
| 1013 | { | 1013 | { |
| 1014 | unsigned long config; | 1014 | unsigned long config; |
| 1015 | st_pinconf_get(pctldev, pin_id, &config); | ||
| 1016 | 1015 | ||
| 1016 | mutex_unlock(&pctldev->mutex); | ||
| 1017 | st_pinconf_get(pctldev, pin_id, &config); | ||
| 1018 | mutex_lock(&pctldev->mutex); | ||
| 1017 | seq_printf(s, "[OE:%ld,PU:%ld,OD:%ld]\n" | 1019 | seq_printf(s, "[OE:%ld,PU:%ld,OD:%ld]\n" |
| 1018 | "\t\t[retime:%ld,invclk:%ld,clknotdat:%ld," | 1020 | "\t\t[retime:%ld,invclk:%ld,clknotdat:%ld," |
| 1019 | "de:%ld,rt-clk:%ld,rt-delay:%ld]", | 1021 | "de:%ld,rt-clk:%ld,rt-delay:%ld]", |
| @@ -1443,6 +1445,7 @@ static struct gpio_chip st_gpio_template = { | |||
| 1443 | 1445 | ||
| 1444 | static struct irq_chip st_gpio_irqchip = { | 1446 | static struct irq_chip st_gpio_irqchip = { |
| 1445 | .name = "GPIO", | 1447 | .name = "GPIO", |
| 1448 | .irq_disable = st_gpio_irq_mask, | ||
| 1446 | .irq_mask = st_gpio_irq_mask, | 1449 | .irq_mask = st_gpio_irq_mask, |
| 1447 | .irq_unmask = st_gpio_irq_unmask, | 1450 | .irq_unmask = st_gpio_irq_unmask, |
| 1448 | .irq_set_type = st_gpio_irq_set_type, | 1451 | .irq_set_type = st_gpio_irq_set_type, |
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/crypto/ap_bus.c b/drivers/s390/crypto/ap_bus.c index 91e97ec01418..4d41bf75c233 100644 --- a/drivers/s390/crypto/ap_bus.c +++ b/drivers/s390/crypto/ap_bus.c | |||
| @@ -1163,9 +1163,13 @@ static inline int ap_test_config_card_id(unsigned int id) | |||
| 1163 | */ | 1163 | */ |
| 1164 | static inline int ap_test_config_domain(unsigned int domain) | 1164 | static inline int ap_test_config_domain(unsigned int domain) |
| 1165 | { | 1165 | { |
| 1166 | if (!ap_configuration) | 1166 | if (!ap_configuration) /* QCI not supported */ |
| 1167 | return 1; | 1167 | if (domain < 16) |
| 1168 | return ap_test_config(ap_configuration->aqm, domain); | 1168 | return 1; /* then domains 0...15 are configured */ |
| 1169 | else | ||
| 1170 | return 0; | ||
| 1171 | else | ||
| 1172 | return ap_test_config(ap_configuration->aqm, domain); | ||
| 1169 | } | 1173 | } |
| 1170 | 1174 | ||
| 1171 | /** | 1175 | /** |
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 d02cd1a67943..ce87ae72edbd 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); |
| @@ -130,56 +127,71 @@ static struct net_device *qeth_l2_netdev_by_devno(unsigned char *read_dev_no) | |||
| 130 | return ndev; | 127 | return ndev; |
| 131 | } | 128 | } |
| 132 | 129 | ||
| 133 | static int qeth_l2_send_setgroupmac_cb(struct qeth_card *card, | 130 | static int qeth_setdel_makerc(struct qeth_card *card, int retcode) |
| 134 | struct qeth_reply *reply, | ||
| 135 | unsigned long data) | ||
| 136 | { | 131 | { |
| 137 | struct qeth_ipa_cmd *cmd; | 132 | int rc; |
| 138 | __u8 *mac; | ||
| 139 | 133 | ||
| 140 | QETH_CARD_TEXT(card, 2, "L2Sgmacb"); | 134 | if (retcode) |
| 141 | cmd = (struct qeth_ipa_cmd *) data; | 135 | QETH_CARD_TEXT_(card, 2, "err%04x", retcode); |
| 142 | mac = &cmd->data.setdelmac.mac[0]; | 136 | switch (retcode) { |
| 143 | /* MAC already registered, needed in couple/uncouple case */ | 137 | case IPA_RC_SUCCESS: |
| 144 | if (cmd->hdr.return_code == IPA_RC_L2_DUP_MAC) { | 138 | rc = 0; |
| 145 | QETH_DBF_MESSAGE(2, "Group MAC %pM already existing on %s \n", | 139 | break; |
| 146 | mac, QETH_CARD_IFNAME(card)); | 140 | case IPA_RC_L2_UNSUPPORTED_CMD: |
| 147 | cmd->hdr.return_code = 0; | 141 | rc = -ENOSYS; |
| 142 | break; | ||
| 143 | case IPA_RC_L2_ADDR_TABLE_FULL: | ||
| 144 | rc = -ENOSPC; | ||
| 145 | break; | ||
| 146 | case IPA_RC_L2_DUP_MAC: | ||
| 147 | case IPA_RC_L2_DUP_LAYER3_MAC: | ||
| 148 | rc = -EEXIST; | ||
| 149 | break; | ||
| 150 | case IPA_RC_L2_MAC_NOT_AUTH_BY_HYP: | ||
| 151 | case IPA_RC_L2_MAC_NOT_AUTH_BY_ADP: | ||
| 152 | rc = -EPERM; | ||
| 153 | break; | ||
| 154 | case IPA_RC_L2_MAC_NOT_FOUND: | ||
| 155 | rc = -ENOENT; | ||
| 156 | break; | ||
| 157 | case -ENOMEM: | ||
| 158 | rc = -ENOMEM; | ||
| 159 | break; | ||
| 160 | default: | ||
| 161 | rc = -EIO; | ||
| 162 | break; | ||
| 148 | } | 163 | } |
| 149 | if (cmd->hdr.return_code) | 164 | return rc; |
| 150 | QETH_DBF_MESSAGE(2, "Could not set group MAC %pM on %s: %x\n", | ||
| 151 | mac, QETH_CARD_IFNAME(card), cmd->hdr.return_code); | ||
| 152 | return 0; | ||
| 153 | } | 165 | } |
| 154 | 166 | ||
| 155 | static int qeth_l2_send_setgroupmac(struct qeth_card *card, __u8 *mac) | 167 | static int qeth_l2_send_setgroupmac(struct qeth_card *card, __u8 *mac) |
| 156 | { | 168 | { |
| 157 | QETH_CARD_TEXT(card, 2, "L2Sgmac"); | 169 | int rc; |
| 158 | return qeth_l2_send_setdelmac(card, mac, IPA_CMD_SETGMAC, | ||
| 159 | qeth_l2_send_setgroupmac_cb); | ||
| 160 | } | ||
| 161 | |||
| 162 | static int qeth_l2_send_delgroupmac_cb(struct qeth_card *card, | ||
| 163 | struct qeth_reply *reply, | ||
| 164 | unsigned long data) | ||
| 165 | { | ||
| 166 | struct qeth_ipa_cmd *cmd; | ||
| 167 | __u8 *mac; | ||
| 168 | 170 | ||
| 169 | QETH_CARD_TEXT(card, 2, "L2Dgmacb"); | 171 | QETH_CARD_TEXT(card, 2, "L2Sgmac"); |
| 170 | cmd = (struct qeth_ipa_cmd *) data; | 172 | rc = qeth_setdel_makerc(card, qeth_l2_send_setdelmac(card, mac, |
| 171 | mac = &cmd->data.setdelmac.mac[0]; | 173 | IPA_CMD_SETGMAC)); |
| 172 | if (cmd->hdr.return_code) | 174 | if (rc == -EEXIST) |
| 173 | QETH_DBF_MESSAGE(2, "Could not delete group MAC %pM on %s: %x\n", | 175 | QETH_DBF_MESSAGE(2, "Group MAC %pM already existing on %s\n", |
| 174 | mac, QETH_CARD_IFNAME(card), cmd->hdr.return_code); | 176 | mac, QETH_CARD_IFNAME(card)); |
| 175 | return 0; | 177 | else if (rc) |
| 178 | QETH_DBF_MESSAGE(2, "Could not set group MAC %pM on %s: %d\n", | ||
| 179 | mac, QETH_CARD_IFNAME(card), rc); | ||
| 180 | return rc; | ||
| 176 | } | 181 | } |
| 177 | 182 | ||
| 178 | static int qeth_l2_send_delgroupmac(struct qeth_card *card, __u8 *mac) | 183 | static int qeth_l2_send_delgroupmac(struct qeth_card *card, __u8 *mac) |
| 179 | { | 184 | { |
| 185 | int rc; | ||
| 186 | |||
| 180 | QETH_CARD_TEXT(card, 2, "L2Dgmac"); | 187 | QETH_CARD_TEXT(card, 2, "L2Dgmac"); |
| 181 | return qeth_l2_send_setdelmac(card, mac, IPA_CMD_DELGMAC, | 188 | rc = qeth_setdel_makerc(card, qeth_l2_send_setdelmac(card, mac, |
| 182 | qeth_l2_send_delgroupmac_cb); | 189 | IPA_CMD_DELGMAC)); |
| 190 | if (rc) | ||
| 191 | QETH_DBF_MESSAGE(2, | ||
| 192 | "Could not delete group MAC %pM on %s: %d\n", | ||
| 193 | mac, QETH_CARD_IFNAME(card), rc); | ||
| 194 | return rc; | ||
| 183 | } | 195 | } |
| 184 | 196 | ||
| 185 | static void qeth_l2_add_mc(struct qeth_card *card, __u8 *mac, int vmac) | 197 | static void qeth_l2_add_mc(struct qeth_card *card, __u8 *mac, int vmac) |
| @@ -197,10 +209,11 @@ static void qeth_l2_add_mc(struct qeth_card *card, __u8 *mac, int vmac) | |||
| 197 | mc->is_vmac = vmac; | 209 | mc->is_vmac = vmac; |
| 198 | 210 | ||
| 199 | if (vmac) { | 211 | if (vmac) { |
| 200 | rc = qeth_l2_send_setdelmac(card, mac, IPA_CMD_SETVMAC, | 212 | rc = qeth_setdel_makerc(card, |
| 201 | NULL); | 213 | qeth_l2_send_setdelmac(card, mac, IPA_CMD_SETVMAC)); |
| 202 | } else { | 214 | } else { |
| 203 | rc = qeth_l2_send_setgroupmac(card, mac); | 215 | rc = qeth_setdel_makerc(card, |
| 216 | qeth_l2_send_setgroupmac(card, mac)); | ||
| 204 | } | 217 | } |
| 205 | 218 | ||
| 206 | if (!rc) | 219 | if (!rc) |
| @@ -218,7 +231,7 @@ static void qeth_l2_del_all_mc(struct qeth_card *card, int del) | |||
| 218 | if (del) { | 231 | if (del) { |
| 219 | if (mc->is_vmac) | 232 | if (mc->is_vmac) |
| 220 | qeth_l2_send_setdelmac(card, mc->mc_addr, | 233 | qeth_l2_send_setdelmac(card, mc->mc_addr, |
| 221 | IPA_CMD_DELVMAC, NULL); | 234 | IPA_CMD_DELVMAC); |
| 222 | else | 235 | else |
| 223 | qeth_l2_send_delgroupmac(card, mc->mc_addr); | 236 | qeth_l2_send_delgroupmac(card, mc->mc_addr); |
| 224 | } | 237 | } |
| @@ -291,6 +304,8 @@ static int qeth_l2_send_setdelvlan(struct qeth_card *card, __u16 i, | |||
| 291 | 304 | ||
| 292 | QETH_CARD_TEXT_(card, 4, "L2sdv%x", ipacmd); | 305 | QETH_CARD_TEXT_(card, 4, "L2sdv%x", ipacmd); |
| 293 | iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4); | 306 | iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4); |
| 307 | if (!iob) | ||
| 308 | return -ENOMEM; | ||
| 294 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | 309 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); |
| 295 | cmd->data.setdelvlan.vlan_id = i; | 310 | cmd->data.setdelvlan.vlan_id = i; |
| 296 | return qeth_send_ipa_cmd(card, iob, | 311 | return qeth_send_ipa_cmd(card, iob, |
| @@ -313,6 +328,7 @@ static int qeth_l2_vlan_rx_add_vid(struct net_device *dev, | |||
| 313 | { | 328 | { |
| 314 | struct qeth_card *card = dev->ml_priv; | 329 | struct qeth_card *card = dev->ml_priv; |
| 315 | struct qeth_vlan_vid *id; | 330 | struct qeth_vlan_vid *id; |
| 331 | int rc; | ||
| 316 | 332 | ||
| 317 | QETH_CARD_TEXT_(card, 4, "aid:%d", vid); | 333 | QETH_CARD_TEXT_(card, 4, "aid:%d", vid); |
| 318 | if (!vid) | 334 | if (!vid) |
| @@ -328,7 +344,11 @@ static int qeth_l2_vlan_rx_add_vid(struct net_device *dev, | |||
| 328 | id = kmalloc(sizeof(struct qeth_vlan_vid), GFP_ATOMIC); | 344 | id = kmalloc(sizeof(struct qeth_vlan_vid), GFP_ATOMIC); |
| 329 | if (id) { | 345 | if (id) { |
| 330 | id->vid = vid; | 346 | id->vid = vid; |
| 331 | qeth_l2_send_setdelvlan(card, vid, IPA_CMD_SETVLAN); | 347 | rc = qeth_l2_send_setdelvlan(card, vid, IPA_CMD_SETVLAN); |
| 348 | if (rc) { | ||
| 349 | kfree(id); | ||
| 350 | return rc; | ||
| 351 | } | ||
| 332 | spin_lock_bh(&card->vlanlock); | 352 | spin_lock_bh(&card->vlanlock); |
| 333 | list_add_tail(&id->list, &card->vid_list); | 353 | list_add_tail(&id->list, &card->vid_list); |
| 334 | spin_unlock_bh(&card->vlanlock); | 354 | spin_unlock_bh(&card->vlanlock); |
| @@ -343,6 +363,7 @@ static int qeth_l2_vlan_rx_kill_vid(struct net_device *dev, | |||
| 343 | { | 363 | { |
| 344 | struct qeth_vlan_vid *id, *tmpid = NULL; | 364 | struct qeth_vlan_vid *id, *tmpid = NULL; |
| 345 | struct qeth_card *card = dev->ml_priv; | 365 | struct qeth_card *card = dev->ml_priv; |
| 366 | int rc = 0; | ||
| 346 | 367 | ||
| 347 | QETH_CARD_TEXT_(card, 4, "kid:%d", vid); | 368 | QETH_CARD_TEXT_(card, 4, "kid:%d", vid); |
| 348 | if (card->info.type == QETH_CARD_TYPE_OSM) { | 369 | if (card->info.type == QETH_CARD_TYPE_OSM) { |
| @@ -363,11 +384,11 @@ static int qeth_l2_vlan_rx_kill_vid(struct net_device *dev, | |||
| 363 | } | 384 | } |
| 364 | spin_unlock_bh(&card->vlanlock); | 385 | spin_unlock_bh(&card->vlanlock); |
| 365 | if (tmpid) { | 386 | if (tmpid) { |
| 366 | qeth_l2_send_setdelvlan(card, vid, IPA_CMD_DELVLAN); | 387 | rc = qeth_l2_send_setdelvlan(card, vid, IPA_CMD_DELVLAN); |
| 367 | kfree(tmpid); | 388 | kfree(tmpid); |
| 368 | } | 389 | } |
| 369 | qeth_l2_set_multicast_list(card->dev); | 390 | qeth_l2_set_multicast_list(card->dev); |
| 370 | return 0; | 391 | return rc; |
| 371 | } | 392 | } |
| 372 | 393 | ||
| 373 | static int qeth_l2_stop_card(struct qeth_card *card, int recovery_mode) | 394 | static int qeth_l2_stop_card(struct qeth_card *card, int recovery_mode) |
| @@ -539,91 +560,62 @@ out: | |||
| 539 | } | 560 | } |
| 540 | 561 | ||
| 541 | static int qeth_l2_send_setdelmac(struct qeth_card *card, __u8 *mac, | 562 | static int qeth_l2_send_setdelmac(struct qeth_card *card, __u8 *mac, |
| 542 | enum qeth_ipa_cmds ipacmd, | 563 | enum qeth_ipa_cmds ipacmd) |
| 543 | int (*reply_cb) (struct qeth_card *, | ||
| 544 | struct qeth_reply*, | ||
| 545 | unsigned long)) | ||
| 546 | { | 564 | { |
| 547 | struct qeth_ipa_cmd *cmd; | 565 | struct qeth_ipa_cmd *cmd; |
| 548 | struct qeth_cmd_buffer *iob; | 566 | struct qeth_cmd_buffer *iob; |
| 549 | 567 | ||
| 550 | QETH_CARD_TEXT(card, 2, "L2sdmac"); | 568 | QETH_CARD_TEXT(card, 2, "L2sdmac"); |
| 551 | iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4); | 569 | iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4); |
| 570 | if (!iob) | ||
| 571 | return -ENOMEM; | ||
| 552 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | 572 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); |
| 553 | cmd->data.setdelmac.mac_length = OSA_ADDR_LEN; | 573 | cmd->data.setdelmac.mac_length = OSA_ADDR_LEN; |
| 554 | memcpy(&cmd->data.setdelmac.mac, mac, OSA_ADDR_LEN); | 574 | memcpy(&cmd->data.setdelmac.mac, mac, OSA_ADDR_LEN); |
| 555 | return qeth_send_ipa_cmd(card, iob, reply_cb, NULL); | 575 | return qeth_send_ipa_cmd(card, iob, NULL, NULL); |
| 556 | } | 576 | } |
| 557 | 577 | ||
| 558 | static int qeth_l2_send_setmac_cb(struct qeth_card *card, | 578 | static int qeth_l2_send_setmac(struct qeth_card *card, __u8 *mac) |
| 559 | struct qeth_reply *reply, | ||
| 560 | unsigned long data) | ||
| 561 | { | 579 | { |
| 562 | struct qeth_ipa_cmd *cmd; | 580 | int rc; |
| 563 | 581 | ||
| 564 | QETH_CARD_TEXT(card, 2, "L2Smaccb"); | 582 | QETH_CARD_TEXT(card, 2, "L2Setmac"); |
| 565 | cmd = (struct qeth_ipa_cmd *) data; | 583 | rc = qeth_setdel_makerc(card, qeth_l2_send_setdelmac(card, mac, |
| 566 | if (cmd->hdr.return_code) { | 584 | IPA_CMD_SETVMAC)); |
| 567 | QETH_CARD_TEXT_(card, 2, "L2er%x", cmd->hdr.return_code); | 585 | if (rc == 0) { |
| 586 | card->info.mac_bits |= QETH_LAYER2_MAC_REGISTERED; | ||
| 587 | memcpy(card->dev->dev_addr, mac, 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 | } else { | ||
| 568 | card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED; | 592 | card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED; |
| 569 | switch (cmd->hdr.return_code) { | 593 | switch (rc) { |
| 570 | case IPA_RC_L2_DUP_MAC: | 594 | case -EEXIST: |
| 571 | case IPA_RC_L2_DUP_LAYER3_MAC: | ||
| 572 | dev_warn(&card->gdev->dev, | 595 | dev_warn(&card->gdev->dev, |
| 573 | "MAC address %pM already exists\n", | 596 | "MAC address %pM already exists\n", mac); |
| 574 | cmd->data.setdelmac.mac); | ||
| 575 | break; | 597 | break; |
| 576 | case IPA_RC_L2_MAC_NOT_AUTH_BY_HYP: | 598 | case -EPERM: |
| 577 | case IPA_RC_L2_MAC_NOT_AUTH_BY_ADP: | ||
| 578 | dev_warn(&card->gdev->dev, | 599 | dev_warn(&card->gdev->dev, |
| 579 | "MAC address %pM is not authorized\n", | 600 | "MAC address %pM is not authorized\n", mac); |
| 580 | cmd->data.setdelmac.mac); | ||
| 581 | break; | ||
| 582 | default: | ||
| 583 | break; | 601 | break; |
| 584 | } | 602 | } |
| 585 | } else { | ||
| 586 | card->info.mac_bits |= QETH_LAYER2_MAC_REGISTERED; | ||
| 587 | memcpy(card->dev->dev_addr, cmd->data.setdelmac.mac, | ||
| 588 | OSA_ADDR_LEN); | ||
| 589 | dev_info(&card->gdev->dev, | ||
| 590 | "MAC address %pM successfully registered on device %s\n", | ||
| 591 | card->dev->dev_addr, card->dev->name); | ||
| 592 | } | ||
| 593 | return 0; | ||
| 594 | } | ||
| 595 | |||
| 596 | static int qeth_l2_send_setmac(struct qeth_card *card, __u8 *mac) | ||
| 597 | { | ||
| 598 | QETH_CARD_TEXT(card, 2, "L2Setmac"); | ||
| 599 | return qeth_l2_send_setdelmac(card, mac, IPA_CMD_SETVMAC, | ||
| 600 | qeth_l2_send_setmac_cb); | ||
| 601 | } | ||
| 602 | |||
| 603 | static int qeth_l2_send_delmac_cb(struct qeth_card *card, | ||
| 604 | struct qeth_reply *reply, | ||
| 605 | unsigned long data) | ||
| 606 | { | ||
| 607 | struct qeth_ipa_cmd *cmd; | ||
| 608 | |||
| 609 | QETH_CARD_TEXT(card, 2, "L2Dmaccb"); | ||
| 610 | cmd = (struct qeth_ipa_cmd *) data; | ||
| 611 | if (cmd->hdr.return_code) { | ||
| 612 | QETH_CARD_TEXT_(card, 2, "err%d", cmd->hdr.return_code); | ||
| 613 | return 0; | ||
| 614 | } | 603 | } |
| 615 | card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED; | 604 | return rc; |
| 616 | |||
| 617 | return 0; | ||
| 618 | } | 605 | } |
| 619 | 606 | ||
| 620 | static int qeth_l2_send_delmac(struct qeth_card *card, __u8 *mac) | 607 | static int qeth_l2_send_delmac(struct qeth_card *card, __u8 *mac) |
| 621 | { | 608 | { |
| 609 | int rc; | ||
| 610 | |||
| 622 | QETH_CARD_TEXT(card, 2, "L2Delmac"); | 611 | QETH_CARD_TEXT(card, 2, "L2Delmac"); |
| 623 | if (!(card->info.mac_bits & QETH_LAYER2_MAC_REGISTERED)) | 612 | if (!(card->info.mac_bits & QETH_LAYER2_MAC_REGISTERED)) |
| 624 | return 0; | 613 | return 0; |
| 625 | return qeth_l2_send_setdelmac(card, mac, IPA_CMD_DELVMAC, | 614 | rc = qeth_setdel_makerc(card, qeth_l2_send_setdelmac(card, mac, |
| 626 | qeth_l2_send_delmac_cb); | 615 | IPA_CMD_DELVMAC)); |
| 616 | if (rc == 0) | ||
| 617 | card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED; | ||
| 618 | return rc; | ||
| 627 | } | 619 | } |
| 628 | 620 | ||
| 629 | static int qeth_l2_request_initial_mac(struct qeth_card *card) | 621 | static int qeth_l2_request_initial_mac(struct qeth_card *card) |
| @@ -651,7 +643,7 @@ static int qeth_l2_request_initial_mac(struct qeth_card *card) | |||
| 651 | if (rc) { | 643 | if (rc) { |
| 652 | QETH_DBF_MESSAGE(2, "couldn't get MAC address on " | 644 | QETH_DBF_MESSAGE(2, "couldn't get MAC address on " |
| 653 | "device %s: x%x\n", CARD_BUS_ID(card), rc); | 645 | "device %s: x%x\n", CARD_BUS_ID(card), rc); |
| 654 | QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc); | 646 | QETH_DBF_TEXT_(SETUP, 2, "1err%04x", rc); |
| 655 | return rc; | 647 | return rc; |
| 656 | } | 648 | } |
| 657 | QETH_DBF_HEX(SETUP, 2, card->dev->dev_addr, OSA_ADDR_LEN); | 649 | QETH_DBF_HEX(SETUP, 2, card->dev->dev_addr, OSA_ADDR_LEN); |
| @@ -687,7 +679,7 @@ static int qeth_l2_set_mac_address(struct net_device *dev, void *p) | |||
| 687 | return -ERESTARTSYS; | 679 | return -ERESTARTSYS; |
| 688 | } | 680 | } |
| 689 | rc = qeth_l2_send_delmac(card, &card->dev->dev_addr[0]); | 681 | rc = qeth_l2_send_delmac(card, &card->dev->dev_addr[0]); |
| 690 | if (!rc || (rc == IPA_RC_L2_MAC_NOT_FOUND)) | 682 | if (!rc || (rc == -ENOENT)) |
| 691 | rc = qeth_l2_send_setmac(card, addr->sa_data); | 683 | rc = qeth_l2_send_setmac(card, addr->sa_data); |
| 692 | return rc ? -EINVAL : 0; | 684 | return rc ? -EINVAL : 0; |
| 693 | } | 685 | } |
| @@ -996,7 +988,7 @@ static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode) | |||
| 996 | recover_flag = card->state; | 988 | recover_flag = card->state; |
| 997 | rc = qeth_core_hardsetup_card(card); | 989 | rc = qeth_core_hardsetup_card(card); |
| 998 | if (rc) { | 990 | if (rc) { |
| 999 | QETH_DBF_TEXT_(SETUP, 2, "2err%d", rc); | 991 | QETH_DBF_TEXT_(SETUP, 2, "2err%04x", rc); |
| 1000 | rc = -ENODEV; | 992 | rc = -ENODEV; |
| 1001 | goto out_remove; | 993 | goto out_remove; |
| 1002 | } | 994 | } |
| @@ -1730,6 +1722,8 @@ static void qeth_bridgeport_query_support(struct qeth_card *card) | |||
| 1730 | 1722 | ||
| 1731 | QETH_CARD_TEXT(card, 2, "brqsuppo"); | 1723 | QETH_CARD_TEXT(card, 2, "brqsuppo"); |
| 1732 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETBRIDGEPORT, 0); | 1724 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETBRIDGEPORT, 0); |
| 1725 | if (!iob) | ||
| 1726 | return; | ||
| 1733 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | 1727 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); |
| 1734 | cmd->data.sbp.hdr.cmdlength = | 1728 | cmd->data.sbp.hdr.cmdlength = |
| 1735 | sizeof(struct qeth_ipacmd_sbp_hdr) + | 1729 | sizeof(struct qeth_ipacmd_sbp_hdr) + |
| @@ -1805,6 +1799,8 @@ int qeth_bridgeport_query_ports(struct qeth_card *card, | |||
| 1805 | if (!(card->options.sbp.supported_funcs & IPA_SBP_QUERY_BRIDGE_PORTS)) | 1799 | if (!(card->options.sbp.supported_funcs & IPA_SBP_QUERY_BRIDGE_PORTS)) |
| 1806 | return -EOPNOTSUPP; | 1800 | return -EOPNOTSUPP; |
| 1807 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETBRIDGEPORT, 0); | 1801 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETBRIDGEPORT, 0); |
| 1802 | if (!iob) | ||
| 1803 | return -ENOMEM; | ||
| 1808 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | 1804 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); |
| 1809 | cmd->data.sbp.hdr.cmdlength = | 1805 | cmd->data.sbp.hdr.cmdlength = |
| 1810 | sizeof(struct qeth_ipacmd_sbp_hdr); | 1806 | sizeof(struct qeth_ipacmd_sbp_hdr); |
| @@ -1817,9 +1813,7 @@ int qeth_bridgeport_query_ports(struct qeth_card *card, | |||
| 1817 | if (rc) | 1813 | if (rc) |
| 1818 | return rc; | 1814 | return rc; |
| 1819 | rc = qeth_bridgeport_makerc(card, &cbctl, IPA_SBP_QUERY_BRIDGE_PORTS); | 1815 | rc = qeth_bridgeport_makerc(card, &cbctl, IPA_SBP_QUERY_BRIDGE_PORTS); |
| 1820 | if (rc) | 1816 | return rc; |
| 1821 | return rc; | ||
| 1822 | return 0; | ||
| 1823 | } | 1817 | } |
| 1824 | EXPORT_SYMBOL_GPL(qeth_bridgeport_query_ports); | 1818 | EXPORT_SYMBOL_GPL(qeth_bridgeport_query_ports); |
| 1825 | 1819 | ||
| @@ -1873,6 +1867,8 @@ int qeth_bridgeport_setrole(struct qeth_card *card, enum qeth_sbp_roles role) | |||
| 1873 | if (!(card->options.sbp.supported_funcs & setcmd)) | 1867 | if (!(card->options.sbp.supported_funcs & setcmd)) |
| 1874 | return -EOPNOTSUPP; | 1868 | return -EOPNOTSUPP; |
| 1875 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETBRIDGEPORT, 0); | 1869 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETBRIDGEPORT, 0); |
| 1870 | if (!iob) | ||
| 1871 | return -ENOMEM; | ||
| 1876 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | 1872 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); |
| 1877 | cmd->data.sbp.hdr.cmdlength = cmdlength; | 1873 | cmd->data.sbp.hdr.cmdlength = cmdlength; |
| 1878 | cmd->data.sbp.hdr.command_code = setcmd; | 1874 | 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 625227ad16ee..e2a0ee845399 100644 --- a/drivers/s390/net/qeth_l3_main.c +++ b/drivers/s390/net/qeth_l3_main.c | |||
| @@ -549,6 +549,8 @@ static int qeth_l3_send_setdelmc(struct qeth_card *card, | |||
| 549 | QETH_CARD_TEXT(card, 4, "setdelmc"); | 549 | QETH_CARD_TEXT(card, 4, "setdelmc"); |
| 550 | 550 | ||
| 551 | iob = qeth_get_ipacmd_buffer(card, ipacmd, addr->proto); | 551 | iob = qeth_get_ipacmd_buffer(card, ipacmd, addr->proto); |
| 552 | if (!iob) | ||
| 553 | return -ENOMEM; | ||
| 552 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | 554 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); |
| 553 | memcpy(&cmd->data.setdelipm.mac, addr->mac, OSA_ADDR_LEN); | 555 | memcpy(&cmd->data.setdelipm.mac, addr->mac, OSA_ADDR_LEN); |
| 554 | if (addr->proto == QETH_PROT_IPV6) | 556 | if (addr->proto == QETH_PROT_IPV6) |
| @@ -588,6 +590,8 @@ static int qeth_l3_send_setdelip(struct qeth_card *card, | |||
| 588 | QETH_CARD_TEXT_(card, 4, "flags%02X", flags); | 590 | QETH_CARD_TEXT_(card, 4, "flags%02X", flags); |
| 589 | 591 | ||
| 590 | iob = qeth_get_ipacmd_buffer(card, ipacmd, addr->proto); | 592 | iob = qeth_get_ipacmd_buffer(card, ipacmd, addr->proto); |
| 593 | if (!iob) | ||
| 594 | return -ENOMEM; | ||
| 591 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | 595 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); |
| 592 | if (addr->proto == QETH_PROT_IPV6) { | 596 | if (addr->proto == QETH_PROT_IPV6) { |
| 593 | memcpy(cmd->data.setdelip6.ip_addr, &addr->u.a6.addr, | 597 | memcpy(cmd->data.setdelip6.ip_addr, &addr->u.a6.addr, |
| @@ -616,6 +620,8 @@ static int qeth_l3_send_setrouting(struct qeth_card *card, | |||
| 616 | 620 | ||
| 617 | QETH_CARD_TEXT(card, 4, "setroutg"); | 621 | QETH_CARD_TEXT(card, 4, "setroutg"); |
| 618 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETRTG, prot); | 622 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETRTG, prot); |
| 623 | if (!iob) | ||
| 624 | return -ENOMEM; | ||
| 619 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | 625 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); |
| 620 | cmd->data.setrtg.type = (type); | 626 | cmd->data.setrtg.type = (type); |
| 621 | rc = qeth_send_ipa_cmd(card, iob, NULL, NULL); | 627 | rc = qeth_send_ipa_cmd(card, iob, NULL, NULL); |
| @@ -1049,12 +1055,14 @@ static struct qeth_cmd_buffer *qeth_l3_get_setassparms_cmd( | |||
| 1049 | QETH_CARD_TEXT(card, 4, "getasscm"); | 1055 | QETH_CARD_TEXT(card, 4, "getasscm"); |
| 1050 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETASSPARMS, prot); | 1056 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETASSPARMS, prot); |
| 1051 | 1057 | ||
| 1052 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | 1058 | if (iob) { |
| 1053 | cmd->data.setassparms.hdr.assist_no = ipa_func; | 1059 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); |
| 1054 | cmd->data.setassparms.hdr.length = 8 + len; | 1060 | cmd->data.setassparms.hdr.assist_no = ipa_func; |
| 1055 | cmd->data.setassparms.hdr.command_code = cmd_code; | 1061 | cmd->data.setassparms.hdr.length = 8 + len; |
| 1056 | cmd->data.setassparms.hdr.return_code = 0; | 1062 | cmd->data.setassparms.hdr.command_code = cmd_code; |
| 1057 | cmd->data.setassparms.hdr.seq_no = 0; | 1063 | cmd->data.setassparms.hdr.return_code = 0; |
| 1064 | cmd->data.setassparms.hdr.seq_no = 0; | ||
| 1065 | } | ||
| 1058 | 1066 | ||
| 1059 | return iob; | 1067 | return iob; |
| 1060 | } | 1068 | } |
| @@ -1090,6 +1098,8 @@ static int qeth_l3_send_simple_setassparms_ipv6(struct qeth_card *card, | |||
| 1090 | QETH_CARD_TEXT(card, 4, "simassp6"); | 1098 | QETH_CARD_TEXT(card, 4, "simassp6"); |
| 1091 | iob = qeth_l3_get_setassparms_cmd(card, ipa_func, cmd_code, | 1099 | iob = qeth_l3_get_setassparms_cmd(card, ipa_func, cmd_code, |
| 1092 | 0, QETH_PROT_IPV6); | 1100 | 0, QETH_PROT_IPV6); |
| 1101 | if (!iob) | ||
| 1102 | return -ENOMEM; | ||
| 1093 | rc = qeth_l3_send_setassparms(card, iob, 0, 0, | 1103 | rc = qeth_l3_send_setassparms(card, iob, 0, 0, |
| 1094 | qeth_l3_default_setassparms_cb, NULL); | 1104 | qeth_l3_default_setassparms_cb, NULL); |
| 1095 | return rc; | 1105 | return rc; |
| @@ -1108,6 +1118,8 @@ static int qeth_l3_send_simple_setassparms(struct qeth_card *card, | |||
| 1108 | length = sizeof(__u32); | 1118 | length = sizeof(__u32); |
| 1109 | iob = qeth_l3_get_setassparms_cmd(card, ipa_func, cmd_code, | 1119 | iob = qeth_l3_get_setassparms_cmd(card, ipa_func, cmd_code, |
| 1110 | length, QETH_PROT_IPV4); | 1120 | length, QETH_PROT_IPV4); |
| 1121 | if (!iob) | ||
| 1122 | return -ENOMEM; | ||
| 1111 | rc = qeth_l3_send_setassparms(card, iob, length, data, | 1123 | rc = qeth_l3_send_setassparms(card, iob, length, data, |
| 1112 | qeth_l3_default_setassparms_cb, NULL); | 1124 | qeth_l3_default_setassparms_cb, NULL); |
| 1113 | return rc; | 1125 | return rc; |
| @@ -1494,6 +1506,8 @@ static int qeth_l3_iqd_read_initial_mac(struct qeth_card *card) | |||
| 1494 | 1506 | ||
| 1495 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_CREATE_ADDR, | 1507 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_CREATE_ADDR, |
| 1496 | QETH_PROT_IPV6); | 1508 | QETH_PROT_IPV6); |
| 1509 | if (!iob) | ||
| 1510 | return -ENOMEM; | ||
| 1497 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | 1511 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); |
| 1498 | *((__u16 *) &cmd->data.create_destroy_addr.unique_id[6]) = | 1512 | *((__u16 *) &cmd->data.create_destroy_addr.unique_id[6]) = |
| 1499 | card->info.unique_id; | 1513 | card->info.unique_id; |
| @@ -1537,6 +1551,8 @@ static int qeth_l3_get_unique_id(struct qeth_card *card) | |||
| 1537 | 1551 | ||
| 1538 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_CREATE_ADDR, | 1552 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_CREATE_ADDR, |
| 1539 | QETH_PROT_IPV6); | 1553 | QETH_PROT_IPV6); |
| 1554 | if (!iob) | ||
| 1555 | return -ENOMEM; | ||
| 1540 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | 1556 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); |
| 1541 | *((__u16 *) &cmd->data.create_destroy_addr.unique_id[6]) = | 1557 | *((__u16 *) &cmd->data.create_destroy_addr.unique_id[6]) = |
| 1542 | card->info.unique_id; | 1558 | card->info.unique_id; |
| @@ -1611,6 +1627,8 @@ qeth_diags_trace(struct qeth_card *card, enum qeth_diags_trace_cmds diags_cmd) | |||
| 1611 | QETH_DBF_TEXT(SETUP, 2, "diagtrac"); | 1627 | QETH_DBF_TEXT(SETUP, 2, "diagtrac"); |
| 1612 | 1628 | ||
| 1613 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SET_DIAG_ASS, 0); | 1629 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SET_DIAG_ASS, 0); |
| 1630 | if (!iob) | ||
| 1631 | return -ENOMEM; | ||
| 1614 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | 1632 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); |
| 1615 | cmd->data.diagass.subcmd_len = 16; | 1633 | cmd->data.diagass.subcmd_len = 16; |
| 1616 | cmd->data.diagass.subcmd = QETH_DIAGS_CMD_TRACE; | 1634 | cmd->data.diagass.subcmd = QETH_DIAGS_CMD_TRACE; |
| @@ -2442,6 +2460,8 @@ static int qeth_l3_query_arp_cache_info(struct qeth_card *card, | |||
| 2442 | IPA_CMD_ASS_ARP_QUERY_INFO, | 2460 | IPA_CMD_ASS_ARP_QUERY_INFO, |
| 2443 | sizeof(struct qeth_arp_query_data) - sizeof(char), | 2461 | sizeof(struct qeth_arp_query_data) - sizeof(char), |
| 2444 | prot); | 2462 | prot); |
| 2463 | if (!iob) | ||
| 2464 | return -ENOMEM; | ||
| 2445 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | 2465 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); |
| 2446 | cmd->data.setassparms.data.query_arp.request_bits = 0x000F; | 2466 | cmd->data.setassparms.data.query_arp.request_bits = 0x000F; |
| 2447 | cmd->data.setassparms.data.query_arp.reply_bits = 0; | 2467 | cmd->data.setassparms.data.query_arp.reply_bits = 0; |
| @@ -2535,6 +2555,8 @@ static int qeth_l3_arp_add_entry(struct qeth_card *card, | |||
| 2535 | IPA_CMD_ASS_ARP_ADD_ENTRY, | 2555 | IPA_CMD_ASS_ARP_ADD_ENTRY, |
| 2536 | sizeof(struct qeth_arp_cache_entry), | 2556 | sizeof(struct qeth_arp_cache_entry), |
| 2537 | QETH_PROT_IPV4); | 2557 | QETH_PROT_IPV4); |
| 2558 | if (!iob) | ||
| 2559 | return -ENOMEM; | ||
| 2538 | rc = qeth_l3_send_setassparms(card, iob, | 2560 | rc = qeth_l3_send_setassparms(card, iob, |
| 2539 | sizeof(struct qeth_arp_cache_entry), | 2561 | sizeof(struct qeth_arp_cache_entry), |
| 2540 | (unsigned long) entry, | 2562 | (unsigned long) entry, |
| @@ -2574,6 +2596,8 @@ static int qeth_l3_arp_remove_entry(struct qeth_card *card, | |||
| 2574 | IPA_CMD_ASS_ARP_REMOVE_ENTRY, | 2596 | IPA_CMD_ASS_ARP_REMOVE_ENTRY, |
| 2575 | 12, | 2597 | 12, |
| 2576 | QETH_PROT_IPV4); | 2598 | QETH_PROT_IPV4); |
| 2599 | if (!iob) | ||
| 2600 | return -ENOMEM; | ||
| 2577 | rc = qeth_l3_send_setassparms(card, iob, | 2601 | rc = qeth_l3_send_setassparms(card, iob, |
| 2578 | 12, (unsigned long)buf, | 2602 | 12, (unsigned long)buf, |
| 2579 | qeth_l3_default_setassparms_cb, NULL); | 2603 | qeth_l3_default_setassparms_cb, NULL); |
| @@ -3262,6 +3286,8 @@ static const struct net_device_ops qeth_l3_osa_netdev_ops = { | |||
| 3262 | 3286 | ||
| 3263 | static int qeth_l3_setup_netdev(struct qeth_card *card) | 3287 | static int qeth_l3_setup_netdev(struct qeth_card *card) |
| 3264 | { | 3288 | { |
| 3289 | int rc; | ||
| 3290 | |||
| 3265 | if (card->info.type == QETH_CARD_TYPE_OSD || | 3291 | if (card->info.type == QETH_CARD_TYPE_OSD || |
| 3266 | card->info.type == QETH_CARD_TYPE_OSX) { | 3292 | card->info.type == QETH_CARD_TYPE_OSX) { |
| 3267 | if ((card->info.link_type == QETH_LINK_TYPE_LANE_TR) || | 3293 | if ((card->info.link_type == QETH_LINK_TYPE_LANE_TR) || |
| @@ -3293,7 +3319,9 @@ static int qeth_l3_setup_netdev(struct qeth_card *card) | |||
| 3293 | return -ENODEV; | 3319 | return -ENODEV; |
| 3294 | card->dev->flags |= IFF_NOARP; | 3320 | card->dev->flags |= IFF_NOARP; |
| 3295 | card->dev->netdev_ops = &qeth_l3_netdev_ops; | 3321 | card->dev->netdev_ops = &qeth_l3_netdev_ops; |
| 3296 | qeth_l3_iqd_read_initial_mac(card); | 3322 | rc = qeth_l3_iqd_read_initial_mac(card); |
| 3323 | if (rc) | ||
| 3324 | return rc; | ||
| 3297 | if (card->options.hsuid[0]) | 3325 | if (card->options.hsuid[0]) |
| 3298 | memcpy(card->dev->perm_addr, card->options.hsuid, 9); | 3326 | memcpy(card->dev->perm_addr, card->options.hsuid, 9); |
| 3299 | } else | 3327 | } else |
| @@ -3360,7 +3388,7 @@ static int __qeth_l3_set_online(struct ccwgroup_device *gdev, int recovery_mode) | |||
| 3360 | recover_flag = card->state; | 3388 | recover_flag = card->state; |
| 3361 | rc = qeth_core_hardsetup_card(card); | 3389 | rc = qeth_core_hardsetup_card(card); |
| 3362 | if (rc) { | 3390 | if (rc) { |
| 3363 | QETH_DBF_TEXT_(SETUP, 2, "2err%d", rc); | 3391 | QETH_DBF_TEXT_(SETUP, 2, "2err%04x", rc); |
| 3364 | rc = -ENODEV; | 3392 | rc = -ENODEV; |
| 3365 | goto out_remove; | 3393 | goto out_remove; |
| 3366 | } | 3394 | } |
| @@ -3401,7 +3429,7 @@ static int __qeth_l3_set_online(struct ccwgroup_device *gdev, int recovery_mode) | |||
| 3401 | contin: | 3429 | contin: |
| 3402 | rc = qeth_l3_setadapter_parms(card); | 3430 | rc = qeth_l3_setadapter_parms(card); |
| 3403 | if (rc) | 3431 | if (rc) |
| 3404 | QETH_DBF_TEXT_(SETUP, 2, "2err%d", rc); | 3432 | QETH_DBF_TEXT_(SETUP, 2, "2err%04x", rc); |
| 3405 | if (!card->options.sniffer) { | 3433 | if (!card->options.sniffer) { |
| 3406 | rc = qeth_l3_start_ipassists(card); | 3434 | rc = qeth_l3_start_ipassists(card); |
| 3407 | if (rc) { | 3435 | if (rc) { |
| @@ -3410,10 +3438,10 @@ contin: | |||
| 3410 | } | 3438 | } |
| 3411 | rc = qeth_l3_setrouting_v4(card); | 3439 | rc = qeth_l3_setrouting_v4(card); |
| 3412 | if (rc) | 3440 | if (rc) |
| 3413 | QETH_DBF_TEXT_(SETUP, 2, "4err%d", rc); | 3441 | QETH_DBF_TEXT_(SETUP, 2, "4err%04x", rc); |
| 3414 | rc = qeth_l3_setrouting_v6(card); | 3442 | rc = qeth_l3_setrouting_v6(card); |
| 3415 | if (rc) | 3443 | if (rc) |
| 3416 | QETH_DBF_TEXT_(SETUP, 2, "5err%d", rc); | 3444 | QETH_DBF_TEXT_(SETUP, 2, "5err%04x", rc); |
| 3417 | } | 3445 | } |
| 3418 | netif_tx_disable(card->dev); | 3446 | netif_tx_disable(card->dev); |
| 3419 | 3447 | ||
diff --git a/drivers/scsi/device_handler/scsi_dh.c b/drivers/scsi/device_handler/scsi_dh.c index 1dba62c5cf6a..1efebc9eedfb 100644 --- a/drivers/scsi/device_handler/scsi_dh.c +++ b/drivers/scsi/device_handler/scsi_dh.c | |||
| @@ -136,11 +136,12 @@ static void __detach_handler (struct kref *kref) | |||
| 136 | struct scsi_device_handler *scsi_dh = scsi_dh_data->scsi_dh; | 136 | struct scsi_device_handler *scsi_dh = scsi_dh_data->scsi_dh; |
| 137 | struct scsi_device *sdev = scsi_dh_data->sdev; | 137 | struct scsi_device *sdev = scsi_dh_data->sdev; |
| 138 | 138 | ||
| 139 | scsi_dh->detach(sdev); | ||
| 140 | |||
| 139 | spin_lock_irq(sdev->request_queue->queue_lock); | 141 | spin_lock_irq(sdev->request_queue->queue_lock); |
| 140 | sdev->scsi_dh_data = NULL; | 142 | sdev->scsi_dh_data = NULL; |
| 141 | spin_unlock_irq(sdev->request_queue->queue_lock); | 143 | spin_unlock_irq(sdev->request_queue->queue_lock); |
| 142 | 144 | ||
| 143 | scsi_dh->detach(sdev); | ||
| 144 | sdev_printk(KERN_NOTICE, sdev, "%s: Detached\n", scsi_dh->name); | 145 | sdev_printk(KERN_NOTICE, sdev, "%s: Detached\n", scsi_dh->name); |
| 145 | module_put(scsi_dh->module); | 146 | module_put(scsi_dh->module); |
| 146 | } | 147 | } |
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/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 12ca291c1380..cce1cbc1a927 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c | |||
| @@ -734,7 +734,9 @@ qla2xxx_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd) | |||
| 734 | * Return target busy if we've received a non-zero retry_delay_timer | 734 | * Return target busy if we've received a non-zero retry_delay_timer |
| 735 | * in a FCP_RSP. | 735 | * in a FCP_RSP. |
| 736 | */ | 736 | */ |
| 737 | if (time_after(jiffies, fcport->retry_delay_timestamp)) | 737 | if (fcport->retry_delay_timestamp == 0) { |
| 738 | /* retry delay not set */ | ||
| 739 | } else if (time_after(jiffies, fcport->retry_delay_timestamp)) | ||
| 738 | fcport->retry_delay_timestamp = 0; | 740 | fcport->retry_delay_timestamp = 0; |
| 739 | else | 741 | else |
| 740 | goto qc24_target_busy; | 742 | goto qc24_target_busy; |
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/scsi/sd.c b/drivers/scsi/sd.c index 399516925d80..05ea0d49a3a3 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c | |||
| @@ -2800,9 +2800,11 @@ static int sd_revalidate_disk(struct gendisk *disk) | |||
| 2800 | */ | 2800 | */ |
| 2801 | sd_set_flush_flag(sdkp); | 2801 | sd_set_flush_flag(sdkp); |
| 2802 | 2802 | ||
| 2803 | max_xfer = min_not_zero(queue_max_hw_sectors(sdkp->disk->queue), | 2803 | max_xfer = sdkp->max_xfer_blocks; |
| 2804 | sdkp->max_xfer_blocks); | ||
| 2805 | max_xfer <<= ilog2(sdp->sector_size) - 9; | 2804 | max_xfer <<= ilog2(sdp->sector_size) - 9; |
| 2805 | |||
| 2806 | max_xfer = min_not_zero(queue_max_hw_sectors(sdkp->disk->queue), | ||
| 2807 | max_xfer); | ||
| 2806 | blk_queue_max_hw_sectors(sdkp->disk->queue, max_xfer); | 2808 | blk_queue_max_hw_sectors(sdkp->disk->queue, max_xfer); |
| 2807 | set_capacity(disk, sdkp->capacity); | 2809 | set_capacity(disk, sdkp->capacity); |
| 2808 | sd_config_write_same(sdkp); | 2810 | sd_config_write_same(sdkp); |
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-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c index 4cda994d3f40..9b80d54d4ddb 100644 --- a/drivers/spi/spi-fsl-dspi.c +++ b/drivers/spi/spi-fsl-dspi.c | |||
| @@ -342,8 +342,7 @@ static int dspi_setup_transfer(struct spi_device *spi, struct spi_transfer *t) | |||
| 342 | /* Only alloc on first setup */ | 342 | /* Only alloc on first setup */ |
| 343 | chip = spi_get_ctldata(spi); | 343 | chip = spi_get_ctldata(spi); |
| 344 | if (chip == NULL) { | 344 | if (chip == NULL) { |
| 345 | chip = devm_kzalloc(&spi->dev, sizeof(struct chip_data), | 345 | chip = kzalloc(sizeof(struct chip_data), GFP_KERNEL); |
| 346 | GFP_KERNEL); | ||
| 347 | if (!chip) | 346 | if (!chip) |
| 348 | return -ENOMEM; | 347 | return -ENOMEM; |
| 349 | } | 348 | } |
| @@ -382,6 +381,16 @@ static int dspi_setup(struct spi_device *spi) | |||
| 382 | return dspi_setup_transfer(spi, NULL); | 381 | return dspi_setup_transfer(spi, NULL); |
| 383 | } | 382 | } |
| 384 | 383 | ||
| 384 | static void dspi_cleanup(struct spi_device *spi) | ||
| 385 | { | ||
| 386 | struct chip_data *chip = spi_get_ctldata((struct spi_device *)spi); | ||
| 387 | |||
| 388 | dev_dbg(&spi->dev, "spi_device %u.%u cleanup\n", | ||
| 389 | spi->master->bus_num, spi->chip_select); | ||
| 390 | |||
| 391 | kfree(chip); | ||
| 392 | } | ||
| 393 | |||
| 385 | static irqreturn_t dspi_interrupt(int irq, void *dev_id) | 394 | static irqreturn_t dspi_interrupt(int irq, void *dev_id) |
| 386 | { | 395 | { |
| 387 | struct fsl_dspi *dspi = (struct fsl_dspi *)dev_id; | 396 | struct fsl_dspi *dspi = (struct fsl_dspi *)dev_id; |
| @@ -467,6 +476,7 @@ static int dspi_probe(struct platform_device *pdev) | |||
| 467 | dspi->bitbang.master->setup = dspi_setup; | 476 | dspi->bitbang.master->setup = dspi_setup; |
| 468 | dspi->bitbang.master->dev.of_node = pdev->dev.of_node; | 477 | dspi->bitbang.master->dev.of_node = pdev->dev.of_node; |
| 469 | 478 | ||
| 479 | master->cleanup = dspi_cleanup; | ||
| 470 | master->mode_bits = SPI_CPOL | SPI_CPHA; | 480 | master->mode_bits = SPI_CPOL | SPI_CPHA; |
| 471 | master->bits_per_word_mask = SPI_BPW_MASK(4) | SPI_BPW_MASK(8) | | 481 | master->bits_per_word_mask = SPI_BPW_MASK(4) | SPI_BPW_MASK(8) | |
| 472 | SPI_BPW_MASK(16); | 482 | SPI_BPW_MASK(16); |
diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c index 961b97d43b43..fe1b7699fab6 100644 --- a/drivers/spi/spi-imx.c +++ b/drivers/spi/spi-imx.c | |||
| @@ -823,6 +823,10 @@ static int spi_imx_sdma_init(struct device *dev, struct spi_imx_data *spi_imx, | |||
| 823 | struct dma_slave_config slave_config = {}; | 823 | struct dma_slave_config slave_config = {}; |
| 824 | int ret; | 824 | int ret; |
| 825 | 825 | ||
| 826 | /* use pio mode for i.mx6dl chip TKT238285 */ | ||
| 827 | if (of_machine_is_compatible("fsl,imx6dl")) | ||
| 828 | return 0; | ||
| 829 | |||
| 826 | /* Prepare for TX DMA: */ | 830 | /* Prepare for TX DMA: */ |
| 827 | master->dma_tx = dma_request_slave_channel(dev, "tx"); | 831 | master->dma_tx = dma_request_slave_channel(dev, "tx"); |
| 828 | if (!master->dma_tx) { | 832 | if (!master->dma_tx) { |
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/lustre/lustre/llite/vvp_io.c b/drivers/staging/lustre/lustre/llite/vvp_io.c index 930f6010203e..65d610abe06e 100644 --- a/drivers/staging/lustre/lustre/llite/vvp_io.c +++ b/drivers/staging/lustre/lustre/llite/vvp_io.c | |||
| @@ -632,7 +632,7 @@ static int vvp_io_kernel_fault(struct vvp_fault_io *cfio) | |||
| 632 | return 0; | 632 | return 0; |
| 633 | } | 633 | } |
| 634 | 634 | ||
| 635 | if (cfio->fault.ft_flags & VM_FAULT_SIGBUS) { | 635 | if (cfio->fault.ft_flags & (VM_FAULT_SIGBUS | VM_FAULT_SIGSEGV)) { |
| 636 | CDEBUG(D_PAGE, "got addr %p - SIGBUS\n", vmf->virtual_address); | 636 | CDEBUG(D_PAGE, "got addr %p - SIGBUS\n", vmf->virtual_address); |
| 637 | return -EFAULT; | 637 | return -EFAULT; |
| 638 | } | 638 | } |
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/nvec/nvec.c b/drivers/staging/nvec/nvec.c index 093535c6217b..120b70d72d79 100644 --- a/drivers/staging/nvec/nvec.c +++ b/drivers/staging/nvec/nvec.c | |||
| @@ -85,23 +85,20 @@ static struct nvec_chip *nvec_power_handle; | |||
| 85 | static const struct mfd_cell nvec_devices[] = { | 85 | static const struct mfd_cell nvec_devices[] = { |
| 86 | { | 86 | { |
| 87 | .name = "nvec-kbd", | 87 | .name = "nvec-kbd", |
| 88 | .id = 1, | ||
| 89 | }, | 88 | }, |
| 90 | { | 89 | { |
| 91 | .name = "nvec-mouse", | 90 | .name = "nvec-mouse", |
| 92 | .id = 1, | ||
| 93 | }, | 91 | }, |
| 94 | { | 92 | { |
| 95 | .name = "nvec-power", | 93 | .name = "nvec-power", |
| 96 | .id = 1, | 94 | .id = 0, |
| 97 | }, | 95 | }, |
| 98 | { | 96 | { |
| 99 | .name = "nvec-power", | 97 | .name = "nvec-power", |
| 100 | .id = 2, | 98 | .id = 1, |
| 101 | }, | 99 | }, |
| 102 | { | 100 | { |
| 103 | .name = "nvec-paz00", | 101 | .name = "nvec-paz00", |
| 104 | .id = 1, | ||
| 105 | }, | 102 | }, |
| 106 | }; | 103 | }; |
| 107 | 104 | ||
| @@ -891,7 +888,7 @@ static int tegra_nvec_probe(struct platform_device *pdev) | |||
| 891 | nvec_msg_free(nvec, msg); | 888 | nvec_msg_free(nvec, msg); |
| 892 | } | 889 | } |
| 893 | 890 | ||
| 894 | ret = mfd_add_devices(nvec->dev, -1, nvec_devices, | 891 | ret = mfd_add_devices(nvec->dev, 0, nvec_devices, |
| 895 | ARRAY_SIZE(nvec_devices), NULL, 0, NULL); | 892 | ARRAY_SIZE(nvec_devices), NULL, 0, NULL); |
| 896 | if (ret) | 893 | if (ret) |
| 897 | dev_err(nvec->dev, "error adding subdevices\n"); | 894 | dev_err(nvec->dev, "error adding subdevices\n"); |
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/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c index 55f6774f706f..aebde3289c50 100644 --- a/drivers/target/iscsi/iscsi_target.c +++ b/drivers/target/iscsi/iscsi_target.c | |||
| @@ -2027,10 +2027,10 @@ iscsit_process_text_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, | |||
| 2027 | goto reject; | 2027 | goto reject; |
| 2028 | } | 2028 | } |
| 2029 | if (!strncmp("=All", text_ptr, 4)) { | 2029 | if (!strncmp("=All", text_ptr, 4)) { |
| 2030 | cmd->cmd_flags |= IFC_SENDTARGETS_ALL; | 2030 | cmd->cmd_flags |= ICF_SENDTARGETS_ALL; |
| 2031 | } else if (!strncmp("=iqn.", text_ptr, 5) || | 2031 | } else if (!strncmp("=iqn.", text_ptr, 5) || |
| 2032 | !strncmp("=eui.", text_ptr, 5)) { | 2032 | !strncmp("=eui.", text_ptr, 5)) { |
| 2033 | cmd->cmd_flags |= IFC_SENDTARGETS_SINGLE; | 2033 | cmd->cmd_flags |= ICF_SENDTARGETS_SINGLE; |
| 2034 | } else { | 2034 | } else { |
| 2035 | pr_err("Unable to locate valid SendTargets=%s value\n", text_ptr); | 2035 | pr_err("Unable to locate valid SendTargets=%s value\n", text_ptr); |
| 2036 | goto reject; | 2036 | goto reject; |
| @@ -3415,10 +3415,10 @@ iscsit_build_sendtargets_response(struct iscsi_cmd *cmd, | |||
| 3415 | return -ENOMEM; | 3415 | return -ENOMEM; |
| 3416 | } | 3416 | } |
| 3417 | /* | 3417 | /* |
| 3418 | * Locate pointer to iqn./eui. string for IFC_SENDTARGETS_SINGLE | 3418 | * Locate pointer to iqn./eui. string for ICF_SENDTARGETS_SINGLE |
| 3419 | * explicit case.. | 3419 | * explicit case.. |
| 3420 | */ | 3420 | */ |
| 3421 | if (cmd->cmd_flags & IFC_SENDTARGETS_SINGLE) { | 3421 | if (cmd->cmd_flags & ICF_SENDTARGETS_SINGLE) { |
| 3422 | text_ptr = strchr(text_in, '='); | 3422 | text_ptr = strchr(text_in, '='); |
| 3423 | if (!text_ptr) { | 3423 | if (!text_ptr) { |
| 3424 | pr_err("Unable to locate '=' string in text_in:" | 3424 | pr_err("Unable to locate '=' string in text_in:" |
| @@ -3434,7 +3434,7 @@ iscsit_build_sendtargets_response(struct iscsi_cmd *cmd, | |||
| 3434 | 3434 | ||
| 3435 | spin_lock(&tiqn_lock); | 3435 | spin_lock(&tiqn_lock); |
| 3436 | list_for_each_entry(tiqn, &g_tiqn_list, tiqn_list) { | 3436 | list_for_each_entry(tiqn, &g_tiqn_list, tiqn_list) { |
| 3437 | if ((cmd->cmd_flags & IFC_SENDTARGETS_SINGLE) && | 3437 | if ((cmd->cmd_flags & ICF_SENDTARGETS_SINGLE) && |
| 3438 | strcmp(tiqn->tiqn, text_ptr)) { | 3438 | strcmp(tiqn->tiqn, text_ptr)) { |
| 3439 | continue; | 3439 | continue; |
| 3440 | } | 3440 | } |
| @@ -3512,7 +3512,7 @@ eob: | |||
| 3512 | if (end_of_buf) | 3512 | if (end_of_buf) |
| 3513 | break; | 3513 | break; |
| 3514 | 3514 | ||
| 3515 | if (cmd->cmd_flags & IFC_SENDTARGETS_SINGLE) | 3515 | if (cmd->cmd_flags & ICF_SENDTARGETS_SINGLE) |
| 3516 | break; | 3516 | break; |
| 3517 | } | 3517 | } |
| 3518 | spin_unlock(&tiqn_lock); | 3518 | spin_unlock(&tiqn_lock); |
diff --git a/drivers/target/iscsi/iscsi_target_core.h b/drivers/target/iscsi/iscsi_target_core.h index 09a522bae222..cbcff38ac9b7 100644 --- a/drivers/target/iscsi/iscsi_target_core.h +++ b/drivers/target/iscsi/iscsi_target_core.h | |||
| @@ -135,8 +135,8 @@ enum cmd_flags_table { | |||
| 135 | ICF_CONTIG_MEMORY = 0x00000020, | 135 | ICF_CONTIG_MEMORY = 0x00000020, |
| 136 | ICF_ATTACHED_TO_RQUEUE = 0x00000040, | 136 | ICF_ATTACHED_TO_RQUEUE = 0x00000040, |
| 137 | ICF_OOO_CMDSN = 0x00000080, | 137 | ICF_OOO_CMDSN = 0x00000080, |
| 138 | IFC_SENDTARGETS_ALL = 0x00000100, | 138 | ICF_SENDTARGETS_ALL = 0x00000100, |
| 139 | IFC_SENDTARGETS_SINGLE = 0x00000200, | 139 | ICF_SENDTARGETS_SINGLE = 0x00000200, |
| 140 | }; | 140 | }; |
| 141 | 141 | ||
| 142 | /* struct iscsi_cmd->i_state */ | 142 | /* struct iscsi_cmd->i_state */ |
diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c index 7653cfb027a2..58f49ff69b14 100644 --- a/drivers/target/target_core_device.c +++ b/drivers/target/target_core_device.c | |||
| @@ -1103,51 +1103,6 @@ int se_dev_set_queue_depth(struct se_device *dev, u32 queue_depth) | |||
| 1103 | } | 1103 | } |
| 1104 | EXPORT_SYMBOL(se_dev_set_queue_depth); | 1104 | EXPORT_SYMBOL(se_dev_set_queue_depth); |
| 1105 | 1105 | ||
| 1106 | int se_dev_set_fabric_max_sectors(struct se_device *dev, u32 fabric_max_sectors) | ||
| 1107 | { | ||
| 1108 | int block_size = dev->dev_attrib.block_size; | ||
| 1109 | |||
| 1110 | if (dev->export_count) { | ||
| 1111 | pr_err("dev[%p]: Unable to change SE Device" | ||
| 1112 | " fabric_max_sectors while export_count is %d\n", | ||
| 1113 | dev, dev->export_count); | ||
| 1114 | return -EINVAL; | ||
| 1115 | } | ||
| 1116 | if (!fabric_max_sectors) { | ||
| 1117 | pr_err("dev[%p]: Illegal ZERO value for" | ||
| 1118 | " fabric_max_sectors\n", dev); | ||
| 1119 | return -EINVAL; | ||
| 1120 | } | ||
| 1121 | if (fabric_max_sectors < DA_STATUS_MAX_SECTORS_MIN) { | ||
| 1122 | pr_err("dev[%p]: Passed fabric_max_sectors: %u less than" | ||
| 1123 | " DA_STATUS_MAX_SECTORS_MIN: %u\n", dev, fabric_max_sectors, | ||
| 1124 | DA_STATUS_MAX_SECTORS_MIN); | ||
| 1125 | return -EINVAL; | ||
| 1126 | } | ||
| 1127 | if (fabric_max_sectors > DA_STATUS_MAX_SECTORS_MAX) { | ||
| 1128 | pr_err("dev[%p]: Passed fabric_max_sectors: %u" | ||
| 1129 | " greater than DA_STATUS_MAX_SECTORS_MAX:" | ||
| 1130 | " %u\n", dev, fabric_max_sectors, | ||
| 1131 | DA_STATUS_MAX_SECTORS_MAX); | ||
| 1132 | return -EINVAL; | ||
| 1133 | } | ||
| 1134 | /* | ||
| 1135 | * Align max_sectors down to PAGE_SIZE to follow transport_allocate_data_tasks() | ||
| 1136 | */ | ||
| 1137 | if (!block_size) { | ||
| 1138 | block_size = 512; | ||
| 1139 | pr_warn("Defaulting to 512 for zero block_size\n"); | ||
| 1140 | } | ||
| 1141 | fabric_max_sectors = se_dev_align_max_sectors(fabric_max_sectors, | ||
| 1142 | block_size); | ||
| 1143 | |||
| 1144 | dev->dev_attrib.fabric_max_sectors = fabric_max_sectors; | ||
| 1145 | pr_debug("dev[%p]: SE Device max_sectors changed to %u\n", | ||
| 1146 | dev, fabric_max_sectors); | ||
| 1147 | return 0; | ||
| 1148 | } | ||
| 1149 | EXPORT_SYMBOL(se_dev_set_fabric_max_sectors); | ||
| 1150 | |||
| 1151 | int se_dev_set_optimal_sectors(struct se_device *dev, u32 optimal_sectors) | 1106 | int se_dev_set_optimal_sectors(struct se_device *dev, u32 optimal_sectors) |
| 1152 | { | 1107 | { |
| 1153 | if (dev->export_count) { | 1108 | if (dev->export_count) { |
| @@ -1156,10 +1111,10 @@ int se_dev_set_optimal_sectors(struct se_device *dev, u32 optimal_sectors) | |||
| 1156 | dev, dev->export_count); | 1111 | dev, dev->export_count); |
| 1157 | return -EINVAL; | 1112 | return -EINVAL; |
| 1158 | } | 1113 | } |
| 1159 | if (optimal_sectors > dev->dev_attrib.fabric_max_sectors) { | 1114 | if (optimal_sectors > dev->dev_attrib.hw_max_sectors) { |
| 1160 | pr_err("dev[%p]: Passed optimal_sectors %u cannot be" | 1115 | pr_err("dev[%p]: Passed optimal_sectors %u cannot be" |
| 1161 | " greater than fabric_max_sectors: %u\n", dev, | 1116 | " greater than hw_max_sectors: %u\n", dev, |
| 1162 | optimal_sectors, dev->dev_attrib.fabric_max_sectors); | 1117 | optimal_sectors, dev->dev_attrib.hw_max_sectors); |
| 1163 | return -EINVAL; | 1118 | return -EINVAL; |
| 1164 | } | 1119 | } |
| 1165 | 1120 | ||
| @@ -1553,8 +1508,6 @@ struct se_device *target_alloc_device(struct se_hba *hba, const char *name) | |||
| 1553 | dev->dev_attrib.unmap_granularity_alignment = | 1508 | dev->dev_attrib.unmap_granularity_alignment = |
| 1554 | DA_UNMAP_GRANULARITY_ALIGNMENT_DEFAULT; | 1509 | DA_UNMAP_GRANULARITY_ALIGNMENT_DEFAULT; |
| 1555 | dev->dev_attrib.max_write_same_len = DA_MAX_WRITE_SAME_LEN; | 1510 | dev->dev_attrib.max_write_same_len = DA_MAX_WRITE_SAME_LEN; |
| 1556 | dev->dev_attrib.fabric_max_sectors = DA_FABRIC_MAX_SECTORS; | ||
| 1557 | dev->dev_attrib.optimal_sectors = DA_FABRIC_MAX_SECTORS; | ||
| 1558 | 1511 | ||
| 1559 | xcopy_lun = &dev->xcopy_lun; | 1512 | xcopy_lun = &dev->xcopy_lun; |
| 1560 | xcopy_lun->lun_se_dev = dev; | 1513 | xcopy_lun->lun_se_dev = dev; |
| @@ -1595,6 +1548,7 @@ int target_configure_device(struct se_device *dev) | |||
| 1595 | dev->dev_attrib.hw_max_sectors = | 1548 | dev->dev_attrib.hw_max_sectors = |
| 1596 | se_dev_align_max_sectors(dev->dev_attrib.hw_max_sectors, | 1549 | se_dev_align_max_sectors(dev->dev_attrib.hw_max_sectors, |
| 1597 | dev->dev_attrib.hw_block_size); | 1550 | dev->dev_attrib.hw_block_size); |
| 1551 | dev->dev_attrib.optimal_sectors = dev->dev_attrib.hw_max_sectors; | ||
| 1598 | 1552 | ||
| 1599 | dev->dev_index = scsi_get_new_index(SCSI_DEVICE_INDEX); | 1553 | dev->dev_index = scsi_get_new_index(SCSI_DEVICE_INDEX); |
| 1600 | dev->creation_time = get_jiffies_64(); | 1554 | dev->creation_time = get_jiffies_64(); |
diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c index c2aea099ea4a..d836de200a03 100644 --- a/drivers/target/target_core_file.c +++ b/drivers/target/target_core_file.c | |||
| @@ -621,7 +621,16 @@ fd_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, | |||
| 621 | struct fd_prot fd_prot; | 621 | struct fd_prot fd_prot; |
| 622 | sense_reason_t rc; | 622 | sense_reason_t rc; |
| 623 | int ret = 0; | 623 | int ret = 0; |
| 624 | 624 | /* | |
| 625 | * We are currently limited by the number of iovecs (2048) per | ||
| 626 | * single vfs_[writev,readv] call. | ||
| 627 | */ | ||
| 628 | if (cmd->data_length > FD_MAX_BYTES) { | ||
| 629 | pr_err("FILEIO: Not able to process I/O of %u bytes due to" | ||
| 630 | "FD_MAX_BYTES: %u iovec count limitiation\n", | ||
| 631 | cmd->data_length, FD_MAX_BYTES); | ||
| 632 | return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; | ||
| 633 | } | ||
| 625 | /* | 634 | /* |
| 626 | * Call vectorized fileio functions to map struct scatterlist | 635 | * Call vectorized fileio functions to map struct scatterlist |
| 627 | * physical memory addresses to struct iovec virtual memory. | 636 | * physical memory addresses to struct iovec virtual memory. |
| @@ -959,7 +968,6 @@ static struct configfs_attribute *fileio_backend_dev_attrs[] = { | |||
| 959 | &fileio_dev_attrib_hw_block_size.attr, | 968 | &fileio_dev_attrib_hw_block_size.attr, |
| 960 | &fileio_dev_attrib_block_size.attr, | 969 | &fileio_dev_attrib_block_size.attr, |
| 961 | &fileio_dev_attrib_hw_max_sectors.attr, | 970 | &fileio_dev_attrib_hw_max_sectors.attr, |
| 962 | &fileio_dev_attrib_fabric_max_sectors.attr, | ||
| 963 | &fileio_dev_attrib_optimal_sectors.attr, | 971 | &fileio_dev_attrib_optimal_sectors.attr, |
| 964 | &fileio_dev_attrib_hw_queue_depth.attr, | 972 | &fileio_dev_attrib_hw_queue_depth.attr, |
| 965 | &fileio_dev_attrib_queue_depth.attr, | 973 | &fileio_dev_attrib_queue_depth.attr, |
diff --git a/drivers/target/target_core_iblock.c b/drivers/target/target_core_iblock.c index 3efff94fbd97..78346b850968 100644 --- a/drivers/target/target_core_iblock.c +++ b/drivers/target/target_core_iblock.c | |||
| @@ -124,7 +124,7 @@ static int iblock_configure_device(struct se_device *dev) | |||
| 124 | q = bdev_get_queue(bd); | 124 | q = bdev_get_queue(bd); |
| 125 | 125 | ||
| 126 | dev->dev_attrib.hw_block_size = bdev_logical_block_size(bd); | 126 | dev->dev_attrib.hw_block_size = bdev_logical_block_size(bd); |
| 127 | dev->dev_attrib.hw_max_sectors = UINT_MAX; | 127 | dev->dev_attrib.hw_max_sectors = queue_max_hw_sectors(q); |
| 128 | dev->dev_attrib.hw_queue_depth = q->nr_requests; | 128 | dev->dev_attrib.hw_queue_depth = q->nr_requests; |
| 129 | 129 | ||
| 130 | /* | 130 | /* |
| @@ -883,7 +883,6 @@ static struct configfs_attribute *iblock_backend_dev_attrs[] = { | |||
| 883 | &iblock_dev_attrib_hw_block_size.attr, | 883 | &iblock_dev_attrib_hw_block_size.attr, |
| 884 | &iblock_dev_attrib_block_size.attr, | 884 | &iblock_dev_attrib_block_size.attr, |
| 885 | &iblock_dev_attrib_hw_max_sectors.attr, | 885 | &iblock_dev_attrib_hw_max_sectors.attr, |
| 886 | &iblock_dev_attrib_fabric_max_sectors.attr, | ||
| 887 | &iblock_dev_attrib_optimal_sectors.attr, | 886 | &iblock_dev_attrib_optimal_sectors.attr, |
| 888 | &iblock_dev_attrib_hw_queue_depth.attr, | 887 | &iblock_dev_attrib_hw_queue_depth.attr, |
| 889 | &iblock_dev_attrib_queue_depth.attr, | 888 | &iblock_dev_attrib_queue_depth.attr, |
diff --git a/drivers/target/target_core_pr.c b/drivers/target/target_core_pr.c index d56f2aaba9af..283cf786ef98 100644 --- a/drivers/target/target_core_pr.c +++ b/drivers/target/target_core_pr.c | |||
| @@ -528,6 +528,18 @@ static int core_scsi3_pr_seq_non_holder( | |||
| 528 | 528 | ||
| 529 | return 0; | 529 | return 0; |
| 530 | } | 530 | } |
| 531 | } else if (we && registered_nexus) { | ||
| 532 | /* | ||
| 533 | * Reads are allowed for Write Exclusive locks | ||
| 534 | * from all registrants. | ||
| 535 | */ | ||
| 536 | if (cmd->data_direction == DMA_FROM_DEVICE) { | ||
| 537 | pr_debug("Allowing READ CDB: 0x%02x for %s" | ||
| 538 | " reservation\n", cdb[0], | ||
| 539 | core_scsi3_pr_dump_type(pr_reg_type)); | ||
| 540 | |||
| 541 | return 0; | ||
| 542 | } | ||
| 531 | } | 543 | } |
| 532 | pr_debug("%s Conflict for %sregistered nexus %s CDB: 0x%2x" | 544 | pr_debug("%s Conflict for %sregistered nexus %s CDB: 0x%2x" |
| 533 | " for %s reservation\n", transport_dump_cmd_direction(cmd), | 545 | " for %s reservation\n", transport_dump_cmd_direction(cmd), |
diff --git a/drivers/target/target_core_rd.c b/drivers/target/target_core_rd.c index 60ebd170a561..98e83ac5661b 100644 --- a/drivers/target/target_core_rd.c +++ b/drivers/target/target_core_rd.c | |||
| @@ -657,7 +657,6 @@ static struct configfs_attribute *rd_mcp_backend_dev_attrs[] = { | |||
| 657 | &rd_mcp_dev_attrib_hw_block_size.attr, | 657 | &rd_mcp_dev_attrib_hw_block_size.attr, |
| 658 | &rd_mcp_dev_attrib_block_size.attr, | 658 | &rd_mcp_dev_attrib_block_size.attr, |
| 659 | &rd_mcp_dev_attrib_hw_max_sectors.attr, | 659 | &rd_mcp_dev_attrib_hw_max_sectors.attr, |
| 660 | &rd_mcp_dev_attrib_fabric_max_sectors.attr, | ||
| 661 | &rd_mcp_dev_attrib_optimal_sectors.attr, | 660 | &rd_mcp_dev_attrib_optimal_sectors.attr, |
| 662 | &rd_mcp_dev_attrib_hw_queue_depth.attr, | 661 | &rd_mcp_dev_attrib_hw_queue_depth.attr, |
| 663 | &rd_mcp_dev_attrib_queue_depth.attr, | 662 | &rd_mcp_dev_attrib_queue_depth.attr, |
diff --git a/drivers/target/target_core_sbc.c b/drivers/target/target_core_sbc.c index 11bea1952435..cd4bed7b2757 100644 --- a/drivers/target/target_core_sbc.c +++ b/drivers/target/target_core_sbc.c | |||
| @@ -953,21 +953,6 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops) | |||
| 953 | 953 | ||
| 954 | if (cmd->se_cmd_flags & SCF_SCSI_DATA_CDB) { | 954 | if (cmd->se_cmd_flags & SCF_SCSI_DATA_CDB) { |
| 955 | unsigned long long end_lba; | 955 | unsigned long long end_lba; |
| 956 | |||
| 957 | if (sectors > dev->dev_attrib.fabric_max_sectors) { | ||
| 958 | printk_ratelimited(KERN_ERR "SCSI OP %02xh with too" | ||
| 959 | " big sectors %u exceeds fabric_max_sectors:" | ||
| 960 | " %u\n", cdb[0], sectors, | ||
| 961 | dev->dev_attrib.fabric_max_sectors); | ||
| 962 | return TCM_INVALID_CDB_FIELD; | ||
| 963 | } | ||
| 964 | if (sectors > dev->dev_attrib.hw_max_sectors) { | ||
| 965 | printk_ratelimited(KERN_ERR "SCSI OP %02xh with too" | ||
| 966 | " big sectors %u exceeds backend hw_max_sectors:" | ||
| 967 | " %u\n", cdb[0], sectors, | ||
| 968 | dev->dev_attrib.hw_max_sectors); | ||
| 969 | return TCM_INVALID_CDB_FIELD; | ||
| 970 | } | ||
| 971 | check_lba: | 956 | check_lba: |
| 972 | end_lba = dev->transport->get_blocks(dev) + 1; | 957 | end_lba = dev->transport->get_blocks(dev) + 1; |
| 973 | if (cmd->t_task_lba + sectors > end_lba) { | 958 | if (cmd->t_task_lba + sectors > end_lba) { |
diff --git a/drivers/target/target_core_spc.c b/drivers/target/target_core_spc.c index 1307600fe726..4c71657da56a 100644 --- a/drivers/target/target_core_spc.c +++ b/drivers/target/target_core_spc.c | |||
| @@ -505,7 +505,6 @@ static sense_reason_t | |||
| 505 | spc_emulate_evpd_b0(struct se_cmd *cmd, unsigned char *buf) | 505 | spc_emulate_evpd_b0(struct se_cmd *cmd, unsigned char *buf) |
| 506 | { | 506 | { |
| 507 | struct se_device *dev = cmd->se_dev; | 507 | struct se_device *dev = cmd->se_dev; |
| 508 | u32 max_sectors; | ||
| 509 | int have_tp = 0; | 508 | int have_tp = 0; |
| 510 | int opt, min; | 509 | int opt, min; |
| 511 | 510 | ||
| @@ -539,9 +538,7 @@ spc_emulate_evpd_b0(struct se_cmd *cmd, unsigned char *buf) | |||
| 539 | /* | 538 | /* |
| 540 | * Set MAXIMUM TRANSFER LENGTH | 539 | * Set MAXIMUM TRANSFER LENGTH |
| 541 | */ | 540 | */ |
| 542 | max_sectors = min(dev->dev_attrib.fabric_max_sectors, | 541 | put_unaligned_be32(dev->dev_attrib.hw_max_sectors, &buf[8]); |
| 543 | dev->dev_attrib.hw_max_sectors); | ||
| 544 | put_unaligned_be32(max_sectors, &buf[8]); | ||
| 545 | 542 | ||
| 546 | /* | 543 | /* |
| 547 | * Set OPTIMAL TRANSFER LENGTH | 544 | * Set OPTIMAL TRANSFER LENGTH |
diff --git a/drivers/target/target_core_user.c b/drivers/target/target_core_user.c index 8bfa61c9693d..1157b559683b 100644 --- a/drivers/target/target_core_user.c +++ b/drivers/target/target_core_user.c | |||
| @@ -1118,7 +1118,6 @@ static struct configfs_attribute *tcmu_backend_dev_attrs[] = { | |||
| 1118 | &tcmu_dev_attrib_hw_block_size.attr, | 1118 | &tcmu_dev_attrib_hw_block_size.attr, |
| 1119 | &tcmu_dev_attrib_block_size.attr, | 1119 | &tcmu_dev_attrib_block_size.attr, |
| 1120 | &tcmu_dev_attrib_hw_max_sectors.attr, | 1120 | &tcmu_dev_attrib_hw_max_sectors.attr, |
| 1121 | &tcmu_dev_attrib_fabric_max_sectors.attr, | ||
| 1122 | &tcmu_dev_attrib_optimal_sectors.attr, | 1121 | &tcmu_dev_attrib_optimal_sectors.attr, |
| 1123 | &tcmu_dev_attrib_hw_queue_depth.attr, | 1122 | &tcmu_dev_attrib_hw_queue_depth.attr, |
| 1124 | &tcmu_dev_attrib_queue_depth.attr, | 1123 | &tcmu_dev_attrib_queue_depth.attr, |
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/int340x_thermal/acpi_thermal_rel.c b/drivers/thermal/int340x_thermal/acpi_thermal_rel.c index 231cabc16e16..2c2ec7666eb1 100644 --- a/drivers/thermal/int340x_thermal/acpi_thermal_rel.c +++ b/drivers/thermal/int340x_thermal/acpi_thermal_rel.c | |||
| @@ -119,15 +119,11 @@ int acpi_parse_trt(acpi_handle handle, int *trt_count, struct trt **trtp, | |||
| 119 | continue; | 119 | continue; |
| 120 | 120 | ||
| 121 | result = acpi_bus_get_device(trt->source, &adev); | 121 | result = acpi_bus_get_device(trt->source, &adev); |
| 122 | if (!result) | 122 | if (result) |
| 123 | acpi_create_platform_device(adev); | ||
| 124 | else | ||
| 125 | pr_warn("Failed to get source ACPI device\n"); | 123 | pr_warn("Failed to get source ACPI device\n"); |
| 126 | 124 | ||
| 127 | result = acpi_bus_get_device(trt->target, &adev); | 125 | result = acpi_bus_get_device(trt->target, &adev); |
| 128 | if (!result) | 126 | if (result) |
| 129 | acpi_create_platform_device(adev); | ||
| 130 | else | ||
| 131 | pr_warn("Failed to get target ACPI device\n"); | 127 | pr_warn("Failed to get target ACPI device\n"); |
| 132 | } | 128 | } |
| 133 | 129 | ||
| @@ -206,16 +202,12 @@ int acpi_parse_art(acpi_handle handle, int *art_count, struct art **artp, | |||
| 206 | 202 | ||
| 207 | if (art->source) { | 203 | if (art->source) { |
| 208 | result = acpi_bus_get_device(art->source, &adev); | 204 | result = acpi_bus_get_device(art->source, &adev); |
| 209 | if (!result) | 205 | if (result) |
| 210 | acpi_create_platform_device(adev); | ||
| 211 | else | ||
| 212 | pr_warn("Failed to get source ACPI device\n"); | 206 | pr_warn("Failed to get source ACPI device\n"); |
| 213 | } | 207 | } |
| 214 | if (art->target) { | 208 | if (art->target) { |
| 215 | result = acpi_bus_get_device(art->target, &adev); | 209 | result = acpi_bus_get_device(art->target, &adev); |
| 216 | if (!result) | 210 | if (result) |
| 217 | acpi_create_platform_device(adev); | ||
| 218 | else | ||
| 219 | pr_warn("Failed to get source ACPI device\n"); | 211 | pr_warn("Failed to get source ACPI device\n"); |
| 220 | } | 212 | } |
| 221 | } | 213 | } |
diff --git a/drivers/thermal/int340x_thermal/processor_thermal_device.c b/drivers/thermal/int340x_thermal/processor_thermal_device.c index 31bb553aac26..0fe5dbbea968 100644 --- a/drivers/thermal/int340x_thermal/processor_thermal_device.c +++ b/drivers/thermal/int340x_thermal/processor_thermal_device.c | |||
| @@ -130,6 +130,8 @@ static int proc_thermal_add(struct device *dev, | |||
| 130 | int ret; | 130 | int ret; |
| 131 | 131 | ||
| 132 | adev = ACPI_COMPANION(dev); | 132 | adev = ACPI_COMPANION(dev); |
| 133 | if (!adev) | ||
| 134 | return -ENODEV; | ||
| 133 | 135 | ||
| 134 | status = acpi_evaluate_object(adev->handle, "PPCC", NULL, &buf); | 136 | status = acpi_evaluate_object(adev->handle, "PPCC", NULL, &buf); |
| 135 | if (ACPI_FAILURE(status)) | 137 | if (ACPI_FAILURE(status)) |
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/core/otg_whitelist.h b/drivers/usb/core/otg_whitelist.h index de0c9c9d7091..a6315abe7b7c 100644 --- a/drivers/usb/core/otg_whitelist.h +++ b/drivers/usb/core/otg_whitelist.h | |||
| @@ -55,6 +55,11 @@ static int is_targeted(struct usb_device *dev) | |||
| 55 | le16_to_cpu(dev->descriptor.idProduct) == 0xbadd)) | 55 | le16_to_cpu(dev->descriptor.idProduct) == 0xbadd)) |
| 56 | return 0; | 56 | return 0; |
| 57 | 57 | ||
| 58 | /* OTG PET device is always targeted (see OTG 2.0 ECN 6.4.2) */ | ||
| 59 | if ((le16_to_cpu(dev->descriptor.idVendor) == 0x1a0a && | ||
| 60 | le16_to_cpu(dev->descriptor.idProduct) == 0x0200)) | ||
| 61 | return 1; | ||
| 62 | |||
| 58 | /* NOTE: can't use usb_match_id() since interface caches | 63 | /* NOTE: can't use usb_match_id() since interface caches |
| 59 | * aren't set up yet. this is cut/paste from that code. | 64 | * aren't set up yet. this is cut/paste from that code. |
| 60 | */ | 65 | */ |
diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c index 0ffb4ed0a945..41e510ae8c83 100644 --- a/drivers/usb/core/quirks.c +++ b/drivers/usb/core/quirks.c | |||
| @@ -179,6 +179,10 @@ static const struct usb_device_id usb_quirk_list[] = { | |||
| 179 | { USB_DEVICE(0x0b05, 0x17e0), .driver_info = | 179 | { USB_DEVICE(0x0b05, 0x17e0), .driver_info = |
| 180 | USB_QUIRK_IGNORE_REMOTE_WAKEUP }, | 180 | USB_QUIRK_IGNORE_REMOTE_WAKEUP }, |
| 181 | 181 | ||
| 182 | /* Protocol and OTG Electrical Test Device */ | ||
| 183 | { USB_DEVICE(0x1a0a, 0x0200), .driver_info = | ||
| 184 | USB_QUIRK_LINEAR_UFRAME_INTR_BINTERVAL }, | ||
| 185 | |||
| 182 | { } /* terminating entry must be last */ | 186 | { } /* terminating entry must be last */ |
| 183 | }; | 187 | }; |
| 184 | 188 | ||
diff --git a/drivers/usb/dwc2/core_intr.c b/drivers/usb/dwc2/core_intr.c index ad43c5bc1ef1..02e3e2d4ea56 100644 --- a/drivers/usb/dwc2/core_intr.c +++ b/drivers/usb/dwc2/core_intr.c | |||
| @@ -476,13 +476,13 @@ irqreturn_t dwc2_handle_common_intr(int irq, void *dev) | |||
| 476 | u32 gintsts; | 476 | u32 gintsts; |
| 477 | irqreturn_t retval = IRQ_NONE; | 477 | irqreturn_t retval = IRQ_NONE; |
| 478 | 478 | ||
| 479 | spin_lock(&hsotg->lock); | ||
| 480 | |||
| 479 | if (!dwc2_is_controller_alive(hsotg)) { | 481 | if (!dwc2_is_controller_alive(hsotg)) { |
| 480 | dev_warn(hsotg->dev, "Controller is dead\n"); | 482 | dev_warn(hsotg->dev, "Controller is dead\n"); |
| 481 | goto out; | 483 | goto out; |
| 482 | } | 484 | } |
| 483 | 485 | ||
| 484 | spin_lock(&hsotg->lock); | ||
| 485 | |||
| 486 | gintsts = dwc2_read_common_intr(hsotg); | 486 | gintsts = dwc2_read_common_intr(hsotg); |
| 487 | if (gintsts & ~GINTSTS_PRTINT) | 487 | if (gintsts & ~GINTSTS_PRTINT) |
| 488 | retval = IRQ_HANDLED; | 488 | retval = IRQ_HANDLED; |
| @@ -515,8 +515,8 @@ irqreturn_t dwc2_handle_common_intr(int irq, void *dev) | |||
| 515 | } | 515 | } |
| 516 | } | 516 | } |
| 517 | 517 | ||
| 518 | spin_unlock(&hsotg->lock); | ||
| 519 | out: | 518 | out: |
| 519 | spin_unlock(&hsotg->lock); | ||
| 520 | return retval; | 520 | return retval; |
| 521 | } | 521 | } |
| 522 | EXPORT_SYMBOL_GPL(dwc2_handle_common_intr); | 522 | EXPORT_SYMBOL_GPL(dwc2_handle_common_intr); |
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..2f9735b35338 100644 --- a/drivers/usb/phy/phy.c +++ b/drivers/usb/phy/phy.c | |||
| @@ -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_devs.h b/drivers/usb/storage/unusual_devs.h index 11c7a9676441..d684b4b8108f 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
| @@ -507,7 +507,7 @@ UNUSUAL_DEV( 0x04e6, 0x000c, 0x0100, 0x0100, | |||
| 507 | UNUSUAL_DEV( 0x04e6, 0x000f, 0x0000, 0x9999, | 507 | UNUSUAL_DEV( 0x04e6, 0x000f, 0x0000, 0x9999, |
| 508 | "SCM Microsystems", | 508 | "SCM Microsystems", |
| 509 | "eUSB SCSI Adapter (Bus Powered)", | 509 | "eUSB SCSI Adapter (Bus Powered)", |
| 510 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_euscsi_init, | 510 | USB_SC_SCSI, USB_PR_BULK, usb_stor_euscsi_init, |
| 511 | US_FL_SCM_MULT_TARG ), | 511 | US_FL_SCM_MULT_TARG ), |
| 512 | 512 | ||
| 513 | UNUSUAL_DEV( 0x04e6, 0x0101, 0x0200, 0x0200, | 513 | UNUSUAL_DEV( 0x04e6, 0x0101, 0x0200, 0x0200, |
| @@ -1995,6 +1995,13 @@ UNUSUAL_DEV( 0x152d, 0x2329, 0x0100, 0x0100, | |||
| 1995 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | 1995 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
| 1996 | US_FL_IGNORE_RESIDUE | US_FL_SANE_SENSE ), | 1996 | US_FL_IGNORE_RESIDUE | US_FL_SANE_SENSE ), |
| 1997 | 1997 | ||
| 1998 | /* Reported by Dmitry Nezhevenko <dion@dion.org.ua> */ | ||
| 1999 | UNUSUAL_DEV( 0x152d, 0x2566, 0x0114, 0x0114, | ||
| 2000 | "JMicron", | ||
| 2001 | "USB to ATA/ATAPI Bridge", | ||
| 2002 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
| 2003 | US_FL_BROKEN_FUA ), | ||
| 2004 | |||
| 1998 | /* Entrega Technologies U1-SC25 (later Xircom PortGear PGSCSI) | 2005 | /* Entrega Technologies U1-SC25 (later Xircom PortGear PGSCSI) |
| 1999 | * and Mac USB Dock USB-SCSI */ | 2006 | * and Mac USB Dock USB-SCSI */ |
| 2000 | UNUSUAL_DEV( 0x1645, 0x0007, 0x0100, 0x0133, | 2007 | UNUSUAL_DEV( 0x1645, 0x0007, 0x0100, 0x0133, |
diff --git a/drivers/usb/storage/unusual_uas.h b/drivers/usb/storage/unusual_uas.h index 18a283d6de1c..dbc00e56c7f5 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,9 +127,23 @@ 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", |
| 110 | "External HDD", | 140 | "External HDD", |
| 111 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | 141 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
| 112 | US_FL_IGNORE_UAS), | 142 | US_FL_IGNORE_UAS), |
| 143 | |||
| 144 | /* Reported-by: Richard Henderson <rth@redhat.com> */ | ||
| 145 | UNUSUAL_DEV(0x4971, 0x8017, 0x0000, 0x9999, | ||
| 146 | "SimpleTech", | ||
| 147 | "External HDD", | ||
| 148 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
| 149 | US_FL_NO_REPORT_OPCODES), | ||
diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c index 255201f22126..7cc0122a18ce 100644 --- a/drivers/vfio/pci/vfio_pci.c +++ b/drivers/vfio/pci/vfio_pci.c | |||
| @@ -840,13 +840,11 @@ static const struct vfio_device_ops vfio_pci_ops = { | |||
| 840 | 840 | ||
| 841 | static int vfio_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) | 841 | static int vfio_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) |
| 842 | { | 842 | { |
| 843 | u8 type; | ||
| 844 | struct vfio_pci_device *vdev; | 843 | struct vfio_pci_device *vdev; |
| 845 | struct iommu_group *group; | 844 | struct iommu_group *group; |
| 846 | int ret; | 845 | int ret; |
| 847 | 846 | ||
| 848 | pci_read_config_byte(pdev, PCI_HEADER_TYPE, &type); | 847 | if (pdev->hdr_type != PCI_HEADER_TYPE_NORMAL) |
| 849 | if ((type & PCI_HEADER_TYPE) != PCI_HEADER_TYPE_NORMAL) | ||
| 850 | return -EINVAL; | 848 | return -EINVAL; |
| 851 | 849 | ||
| 852 | group = iommu_group_get(&pdev->dev); | 850 | group = iommu_group_get(&pdev->dev); |
diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c index 14419a8ccbb6..9484d5652ca5 100644 --- a/drivers/vhost/net.c +++ b/drivers/vhost/net.c | |||
| @@ -538,7 +538,7 @@ static int get_rx_bufs(struct vhost_virtqueue *vq, | |||
| 538 | ++headcount; | 538 | ++headcount; |
| 539 | seg += in; | 539 | seg += in; |
| 540 | } | 540 | } |
| 541 | heads[headcount - 1].len = cpu_to_vhost32(vq, len - datalen); | 541 | heads[headcount - 1].len = cpu_to_vhost32(vq, len + datalen); |
| 542 | *iovcount = seg; | 542 | *iovcount = seg; |
| 543 | if (unlikely(log)) | 543 | if (unlikely(log)) |
| 544 | *log_num = nlogs; | 544 | *log_num = nlogs; |
| @@ -650,8 +650,10 @@ static void handle_rx(struct vhost_net *net) | |||
| 650 | break; | 650 | break; |
| 651 | } | 651 | } |
| 652 | /* TODO: Should check and handle checksum. */ | 652 | /* TODO: Should check and handle checksum. */ |
| 653 | |||
| 654 | hdr.num_buffers = cpu_to_vhost16(vq, headcount); | ||
| 653 | if (likely(mergeable) && | 655 | if (likely(mergeable) && |
| 654 | memcpy_toiovecend(nvq->hdr, (unsigned char *)&headcount, | 656 | memcpy_toiovecend(nvq->hdr, (void *)&hdr.num_buffers, |
| 655 | offsetof(typeof(hdr), num_buffers), | 657 | offsetof(typeof(hdr), num_buffers), |
| 656 | sizeof hdr.num_buffers)) { | 658 | sizeof hdr.num_buffers)) { |
| 657 | vq_err(vq, "Failed num_buffers write"); | 659 | vq_err(vq, "Failed num_buffers write"); |
diff --git a/drivers/vhost/scsi.c b/drivers/vhost/scsi.c index 01c01cb3933f..d695b1673ae5 100644 --- a/drivers/vhost/scsi.c +++ b/drivers/vhost/scsi.c | |||
| @@ -911,6 +911,23 @@ vhost_scsi_map_iov_to_prot(struct tcm_vhost_cmd *cmd, | |||
| 911 | return 0; | 911 | return 0; |
| 912 | } | 912 | } |
| 913 | 913 | ||
| 914 | static int vhost_scsi_to_tcm_attr(int attr) | ||
| 915 | { | ||
| 916 | switch (attr) { | ||
| 917 | case VIRTIO_SCSI_S_SIMPLE: | ||
| 918 | return TCM_SIMPLE_TAG; | ||
| 919 | case VIRTIO_SCSI_S_ORDERED: | ||
| 920 | return TCM_ORDERED_TAG; | ||
| 921 | case VIRTIO_SCSI_S_HEAD: | ||
| 922 | return TCM_HEAD_TAG; | ||
| 923 | case VIRTIO_SCSI_S_ACA: | ||
| 924 | return TCM_ACA_TAG; | ||
| 925 | default: | ||
| 926 | break; | ||
| 927 | } | ||
| 928 | return TCM_SIMPLE_TAG; | ||
| 929 | } | ||
| 930 | |||
| 914 | static void tcm_vhost_submission_work(struct work_struct *work) | 931 | static void tcm_vhost_submission_work(struct work_struct *work) |
| 915 | { | 932 | { |
| 916 | struct tcm_vhost_cmd *cmd = | 933 | struct tcm_vhost_cmd *cmd = |
| @@ -936,9 +953,10 @@ static void tcm_vhost_submission_work(struct work_struct *work) | |||
| 936 | rc = target_submit_cmd_map_sgls(se_cmd, tv_nexus->tvn_se_sess, | 953 | rc = target_submit_cmd_map_sgls(se_cmd, tv_nexus->tvn_se_sess, |
| 937 | cmd->tvc_cdb, &cmd->tvc_sense_buf[0], | 954 | cmd->tvc_cdb, &cmd->tvc_sense_buf[0], |
| 938 | cmd->tvc_lun, cmd->tvc_exp_data_len, | 955 | cmd->tvc_lun, cmd->tvc_exp_data_len, |
| 939 | cmd->tvc_task_attr, cmd->tvc_data_direction, | 956 | vhost_scsi_to_tcm_attr(cmd->tvc_task_attr), |
| 940 | TARGET_SCF_ACK_KREF, sg_ptr, cmd->tvc_sgl_count, | 957 | cmd->tvc_data_direction, TARGET_SCF_ACK_KREF, |
| 941 | NULL, 0, sg_prot_ptr, cmd->tvc_prot_sgl_count); | 958 | sg_ptr, cmd->tvc_sgl_count, NULL, 0, sg_prot_ptr, |
| 959 | cmd->tvc_prot_sgl_count); | ||
| 942 | if (rc < 0) { | 960 | if (rc < 0) { |
| 943 | transport_send_check_condition_and_sense(se_cmd, | 961 | transport_send_check_condition_and_sense(se_cmd, |
| 944 | TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE, 0); | 962 | TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE, 0); |
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/virtio/virtio_pci_common.c b/drivers/virtio/virtio_pci_common.c index 2ef9529809d8..9756f21b809e 100644 --- a/drivers/virtio/virtio_pci_common.c +++ b/drivers/virtio/virtio_pci_common.c | |||
| @@ -282,6 +282,7 @@ void vp_del_vqs(struct virtio_device *vdev) | |||
| 282 | 282 | ||
| 283 | vp_free_vectors(vdev); | 283 | vp_free_vectors(vdev); |
| 284 | kfree(vp_dev->vqs); | 284 | kfree(vp_dev->vqs); |
| 285 | vp_dev->vqs = NULL; | ||
| 285 | } | 286 | } |
| 286 | 287 | ||
| 287 | static int vp_try_to_find_vqs(struct virtio_device *vdev, unsigned nvqs, | 288 | static int vp_try_to_find_vqs(struct virtio_device *vdev, unsigned nvqs, |
| @@ -421,15 +422,6 @@ int vp_set_vq_affinity(struct virtqueue *vq, int cpu) | |||
| 421 | return 0; | 422 | return 0; |
| 422 | } | 423 | } |
| 423 | 424 | ||
| 424 | void virtio_pci_release_dev(struct device *_d) | ||
| 425 | { | ||
| 426 | /* | ||
| 427 | * No need for a release method as we allocate/free | ||
| 428 | * all devices together with the pci devices. | ||
| 429 | * Provide an empty one to avoid getting a warning from core. | ||
| 430 | */ | ||
| 431 | } | ||
| 432 | |||
| 433 | #ifdef CONFIG_PM_SLEEP | 425 | #ifdef CONFIG_PM_SLEEP |
| 434 | static int virtio_pci_freeze(struct device *dev) | 426 | static int virtio_pci_freeze(struct device *dev) |
| 435 | { | 427 | { |
diff --git a/drivers/virtio/virtio_pci_common.h b/drivers/virtio/virtio_pci_common.h index adddb647b21d..5a497289b7e9 100644 --- a/drivers/virtio/virtio_pci_common.h +++ b/drivers/virtio/virtio_pci_common.h | |||
| @@ -126,7 +126,6 @@ const char *vp_bus_name(struct virtio_device *vdev); | |||
| 126 | * - ignore the affinity request if we're using INTX | 126 | * - ignore the affinity request if we're using INTX |
| 127 | */ | 127 | */ |
| 128 | int vp_set_vq_affinity(struct virtqueue *vq, int cpu); | 128 | int vp_set_vq_affinity(struct virtqueue *vq, int cpu); |
| 129 | void virtio_pci_release_dev(struct device *); | ||
| 130 | 129 | ||
| 131 | int virtio_pci_legacy_probe(struct pci_dev *pci_dev, | 130 | int virtio_pci_legacy_probe(struct pci_dev *pci_dev, |
| 132 | const struct pci_device_id *id); | 131 | const struct pci_device_id *id); |
diff --git a/drivers/virtio/virtio_pci_legacy.c b/drivers/virtio/virtio_pci_legacy.c index 6c76f0f5658c..a5486e65e04b 100644 --- a/drivers/virtio/virtio_pci_legacy.c +++ b/drivers/virtio/virtio_pci_legacy.c | |||
| @@ -211,6 +211,17 @@ static const struct virtio_config_ops virtio_pci_config_ops = { | |||
| 211 | .set_vq_affinity = vp_set_vq_affinity, | 211 | .set_vq_affinity = vp_set_vq_affinity, |
| 212 | }; | 212 | }; |
| 213 | 213 | ||
| 214 | static void virtio_pci_release_dev(struct device *_d) | ||
| 215 | { | ||
| 216 | struct virtio_device *vdev = dev_to_virtio(_d); | ||
| 217 | struct virtio_pci_device *vp_dev = to_vp_device(vdev); | ||
| 218 | |||
| 219 | /* As struct device is a kobject, it's not safe to | ||
| 220 | * free the memory (including the reference counter itself) | ||
| 221 | * until it's release callback. */ | ||
| 222 | kfree(vp_dev); | ||
| 223 | } | ||
| 224 | |||
| 214 | /* the PCI probing function */ | 225 | /* the PCI probing function */ |
| 215 | int virtio_pci_legacy_probe(struct pci_dev *pci_dev, | 226 | int virtio_pci_legacy_probe(struct pci_dev *pci_dev, |
| 216 | const struct pci_device_id *id) | 227 | const struct pci_device_id *id) |
| @@ -302,5 +313,4 @@ void virtio_pci_legacy_remove(struct pci_dev *pci_dev) | |||
| 302 | pci_iounmap(pci_dev, vp_dev->ioaddr); | 313 | pci_iounmap(pci_dev, vp_dev->ioaddr); |
| 303 | pci_release_regions(pci_dev); | 314 | pci_release_regions(pci_dev); |
| 304 | pci_disable_device(pci_dev); | 315 | pci_disable_device(pci_dev); |
| 305 | kfree(vp_dev); | ||
| 306 | } | 316 | } |
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/backref.c b/fs/btrfs/backref.c index 2d3e32ebfd15..8729cf68d2fe 100644 --- a/fs/btrfs/backref.c +++ b/fs/btrfs/backref.c | |||
| @@ -1552,7 +1552,6 @@ int tree_backref_for_extent(unsigned long *ptr, struct extent_buffer *eb, | |||
| 1552 | { | 1552 | { |
| 1553 | int ret; | 1553 | int ret; |
| 1554 | int type; | 1554 | int type; |
| 1555 | struct btrfs_tree_block_info *info; | ||
| 1556 | struct btrfs_extent_inline_ref *eiref; | 1555 | struct btrfs_extent_inline_ref *eiref; |
| 1557 | 1556 | ||
| 1558 | if (*ptr == (unsigned long)-1) | 1557 | if (*ptr == (unsigned long)-1) |
| @@ -1573,9 +1572,17 @@ int tree_backref_for_extent(unsigned long *ptr, struct extent_buffer *eb, | |||
| 1573 | } | 1572 | } |
| 1574 | 1573 | ||
| 1575 | /* we can treat both ref types equally here */ | 1574 | /* we can treat both ref types equally here */ |
| 1576 | info = (struct btrfs_tree_block_info *)(ei + 1); | ||
| 1577 | *out_root = btrfs_extent_inline_ref_offset(eb, eiref); | 1575 | *out_root = btrfs_extent_inline_ref_offset(eb, eiref); |
| 1578 | *out_level = btrfs_tree_block_level(eb, info); | 1576 | |
| 1577 | if (key->type == BTRFS_EXTENT_ITEM_KEY) { | ||
| 1578 | struct btrfs_tree_block_info *info; | ||
| 1579 | |||
| 1580 | info = (struct btrfs_tree_block_info *)(ei + 1); | ||
| 1581 | *out_level = btrfs_tree_block_level(eb, info); | ||
| 1582 | } else { | ||
| 1583 | ASSERT(key->type == BTRFS_METADATA_ITEM_KEY); | ||
| 1584 | *out_level = (u8)key->offset; | ||
| 1585 | } | ||
| 1579 | 1586 | ||
| 1580 | if (ret == 1) | 1587 | if (ret == 1) |
| 1581 | *ptr = (unsigned long)-1; | 1588 | *ptr = (unsigned long)-1; |
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/delayed-inode.c b/fs/btrfs/delayed-inode.c index 054577bddaf2..de4e70fb3cbb 100644 --- a/fs/btrfs/delayed-inode.c +++ b/fs/btrfs/delayed-inode.c | |||
| @@ -1857,6 +1857,14 @@ int btrfs_delayed_delete_inode_ref(struct inode *inode) | |||
| 1857 | { | 1857 | { |
| 1858 | struct btrfs_delayed_node *delayed_node; | 1858 | struct btrfs_delayed_node *delayed_node; |
| 1859 | 1859 | ||
| 1860 | /* | ||
| 1861 | * we don't do delayed inode updates during log recovery because it | ||
| 1862 | * leads to enospc problems. This means we also can't do | ||
| 1863 | * delayed inode refs | ||
| 1864 | */ | ||
| 1865 | if (BTRFS_I(inode)->root->fs_info->log_root_recovering) | ||
| 1866 | return -EAGAIN; | ||
| 1867 | |||
| 1860 | delayed_node = btrfs_get_or_create_delayed_node(inode); | 1868 | delayed_node = btrfs_get_or_create_delayed_node(inode); |
| 1861 | if (IS_ERR(delayed_node)) | 1869 | if (IS_ERR(delayed_node)) |
| 1862 | return PTR_ERR(delayed_node); | 1870 | return PTR_ERR(delayed_node); |
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index a80b97100d90..a684086c3c81 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
| @@ -3139,9 +3139,11 @@ static int write_one_cache_group(struct btrfs_trans_handle *trans, | |||
| 3139 | struct extent_buffer *leaf; | 3139 | struct extent_buffer *leaf; |
| 3140 | 3140 | ||
| 3141 | ret = btrfs_search_slot(trans, extent_root, &cache->key, path, 0, 1); | 3141 | ret = btrfs_search_slot(trans, extent_root, &cache->key, path, 0, 1); |
| 3142 | if (ret < 0) | 3142 | if (ret) { |
| 3143 | if (ret > 0) | ||
| 3144 | ret = -ENOENT; | ||
| 3143 | goto fail; | 3145 | goto fail; |
| 3144 | BUG_ON(ret); /* Corruption */ | 3146 | } |
| 3145 | 3147 | ||
| 3146 | leaf = path->nodes[0]; | 3148 | leaf = path->nodes[0]; |
| 3147 | bi = btrfs_item_ptr_offset(leaf, path->slots[0]); | 3149 | bi = btrfs_item_ptr_offset(leaf, path->slots[0]); |
| @@ -3149,11 +3151,9 @@ static int write_one_cache_group(struct btrfs_trans_handle *trans, | |||
| 3149 | btrfs_mark_buffer_dirty(leaf); | 3151 | btrfs_mark_buffer_dirty(leaf); |
| 3150 | btrfs_release_path(path); | 3152 | btrfs_release_path(path); |
| 3151 | fail: | 3153 | fail: |
| 3152 | if (ret) { | 3154 | if (ret) |
| 3153 | btrfs_abort_transaction(trans, root, ret); | 3155 | btrfs_abort_transaction(trans, root, ret); |
| 3154 | return ret; | 3156 | return ret; |
| 3155 | } | ||
| 3156 | return 0; | ||
| 3157 | 3157 | ||
| 3158 | } | 3158 | } |
| 3159 | 3159 | ||
| @@ -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/inode.c b/fs/btrfs/inode.c index e687bb0dc73a..8bf326affb94 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
| @@ -6255,8 +6255,10 @@ static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) | |||
| 6255 | 6255 | ||
| 6256 | out_fail: | 6256 | out_fail: |
| 6257 | btrfs_end_transaction(trans, root); | 6257 | btrfs_end_transaction(trans, root); |
| 6258 | if (drop_on_err) | 6258 | if (drop_on_err) { |
| 6259 | inode_dec_link_count(inode); | ||
| 6259 | iput(inode); | 6260 | iput(inode); |
| 6261 | } | ||
| 6260 | btrfs_balance_delayed_items(root); | 6262 | btrfs_balance_delayed_items(root); |
| 6261 | btrfs_btree_balance_dirty(root); | 6263 | btrfs_btree_balance_dirty(root); |
| 6262 | return err; | 6264 | return err; |
diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index f2bb13a23f86..e427cb7ee12c 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c | |||
| @@ -2607,9 +2607,9 @@ static int scrub_extent_for_parity(struct scrub_parity *sparity, | |||
| 2607 | ret = scrub_pages_for_parity(sparity, logical, l, physical, dev, | 2607 | ret = scrub_pages_for_parity(sparity, logical, l, physical, dev, |
| 2608 | flags, gen, mirror_num, | 2608 | flags, gen, mirror_num, |
| 2609 | have_csum ? csum : NULL); | 2609 | have_csum ? csum : NULL); |
| 2610 | skip: | ||
| 2611 | if (ret) | 2610 | if (ret) |
| 2612 | return ret; | 2611 | return ret; |
| 2612 | skip: | ||
| 2613 | len -= l; | 2613 | len -= l; |
| 2614 | logical += l; | 2614 | logical += l; |
| 2615 | physical += l; | 2615 | physical += l; |
| @@ -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 | ||
| @@ -3065,6 +3065,8 @@ static noinline_for_stack int scrub_stripe(struct scrub_ctx *sctx, | |||
| 3065 | path->search_commit_root = 1; | 3065 | path->search_commit_root = 1; |
| 3066 | path->skip_locking = 1; | 3066 | path->skip_locking = 1; |
| 3067 | 3067 | ||
| 3068 | ppath->search_commit_root = 1; | ||
| 3069 | ppath->skip_locking = 1; | ||
| 3068 | /* | 3070 | /* |
| 3069 | * trigger the readahead for extent tree csum tree and wait for | 3071 | * trigger the readahead for extent tree csum tree and wait for |
| 3070 | * completion. During readahead, the scrub is officially paused | 3072 | * completion. During readahead, the scrub is officially paused |
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/btrfs/tree-log.c b/fs/btrfs/tree-log.c index 9a02da16f2be..1a9585d4380a 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c | |||
| @@ -2591,6 +2591,7 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans, | |||
| 2591 | } | 2591 | } |
| 2592 | 2592 | ||
| 2593 | if (log_root_tree->log_transid_committed >= root_log_ctx.log_transid) { | 2593 | if (log_root_tree->log_transid_committed >= root_log_ctx.log_transid) { |
| 2594 | blk_finish_plug(&plug); | ||
| 2594 | mutex_unlock(&log_root_tree->log_mutex); | 2595 | mutex_unlock(&log_root_tree->log_mutex); |
| 2595 | ret = root_log_ctx.log_ret; | 2596 | ret = root_log_ctx.log_ret; |
| 2596 | goto out; | 2597 | goto out; |
diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c index f5013d92a7e6..c81c0e004588 100644 --- a/fs/ceph/addr.c +++ b/fs/ceph/addr.c | |||
| @@ -1416,7 +1416,7 @@ void ceph_fill_inline_data(struct inode *inode, struct page *locked_page, | |||
| 1416 | } | 1416 | } |
| 1417 | } | 1417 | } |
| 1418 | 1418 | ||
| 1419 | dout("fill_inline_data %p %llx.%llx len %lu locked_page %p\n", | 1419 | dout("fill_inline_data %p %llx.%llx len %zu locked_page %p\n", |
| 1420 | inode, ceph_vinop(inode), len, locked_page); | 1420 | inode, ceph_vinop(inode), len, locked_page); |
| 1421 | 1421 | ||
| 1422 | if (len > 0) { | 1422 | if (len > 0) { |
diff --git a/fs/cifs/cifs_debug.c b/fs/cifs/cifs_debug.c index 9c56ef776407..7febcf2475c5 100644 --- a/fs/cifs/cifs_debug.c +++ b/fs/cifs/cifs_debug.c | |||
| @@ -606,9 +606,11 @@ cifs_security_flags_handle_must_flags(unsigned int *flags) | |||
| 606 | *flags = CIFSSEC_MUST_NTLMV2; | 606 | *flags = CIFSSEC_MUST_NTLMV2; |
| 607 | else if ((*flags & CIFSSEC_MUST_NTLM) == CIFSSEC_MUST_NTLM) | 607 | else if ((*flags & CIFSSEC_MUST_NTLM) == CIFSSEC_MUST_NTLM) |
| 608 | *flags = CIFSSEC_MUST_NTLM; | 608 | *flags = CIFSSEC_MUST_NTLM; |
| 609 | else if ((*flags & CIFSSEC_MUST_LANMAN) == CIFSSEC_MUST_LANMAN) | 609 | else if (CIFSSEC_MUST_LANMAN && |
| 610 | (*flags & CIFSSEC_MUST_LANMAN) == CIFSSEC_MUST_LANMAN) | ||
| 610 | *flags = CIFSSEC_MUST_LANMAN; | 611 | *flags = CIFSSEC_MUST_LANMAN; |
| 611 | else if ((*flags & CIFSSEC_MUST_PLNTXT) == CIFSSEC_MUST_PLNTXT) | 612 | else if (CIFSSEC_MUST_PLNTXT && |
| 613 | (*flags & CIFSSEC_MUST_PLNTXT) == CIFSSEC_MUST_PLNTXT) | ||
| 612 | *flags = CIFSSEC_MUST_PLNTXT; | 614 | *flags = CIFSSEC_MUST_PLNTXT; |
| 613 | 615 | ||
| 614 | *flags |= signflags; | 616 | *flags |= signflags; |
diff --git a/fs/cifs/file.c b/fs/cifs/file.c index 96b7e9b7706d..74f12877493a 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c | |||
| @@ -366,6 +366,7 @@ void cifsFileInfo_put(struct cifsFileInfo *cifs_file) | |||
| 366 | struct cifsLockInfo *li, *tmp; | 366 | struct cifsLockInfo *li, *tmp; |
| 367 | struct cifs_fid fid; | 367 | struct cifs_fid fid; |
| 368 | struct cifs_pending_open open; | 368 | struct cifs_pending_open open; |
| 369 | bool oplock_break_cancelled; | ||
| 369 | 370 | ||
| 370 | spin_lock(&cifs_file_list_lock); | 371 | spin_lock(&cifs_file_list_lock); |
| 371 | if (--cifs_file->count > 0) { | 372 | if (--cifs_file->count > 0) { |
| @@ -397,7 +398,7 @@ void cifsFileInfo_put(struct cifsFileInfo *cifs_file) | |||
| 397 | } | 398 | } |
| 398 | spin_unlock(&cifs_file_list_lock); | 399 | spin_unlock(&cifs_file_list_lock); |
| 399 | 400 | ||
| 400 | cancel_work_sync(&cifs_file->oplock_break); | 401 | oplock_break_cancelled = cancel_work_sync(&cifs_file->oplock_break); |
| 401 | 402 | ||
| 402 | if (!tcon->need_reconnect && !cifs_file->invalidHandle) { | 403 | if (!tcon->need_reconnect && !cifs_file->invalidHandle) { |
| 403 | struct TCP_Server_Info *server = tcon->ses->server; | 404 | struct TCP_Server_Info *server = tcon->ses->server; |
| @@ -409,6 +410,9 @@ void cifsFileInfo_put(struct cifsFileInfo *cifs_file) | |||
| 409 | _free_xid(xid); | 410 | _free_xid(xid); |
| 410 | } | 411 | } |
| 411 | 412 | ||
| 413 | if (oplock_break_cancelled) | ||
| 414 | cifs_done_oplock_break(cifsi); | ||
| 415 | |||
| 412 | cifs_del_pending_open(&open); | 416 | cifs_del_pending_open(&open); |
| 413 | 417 | ||
| 414 | /* | 418 | /* |
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/cifs/smbencrypt.c b/fs/cifs/smbencrypt.c index 6c1566366a66..a4232ec4f2ba 100644 --- a/fs/cifs/smbencrypt.c +++ b/fs/cifs/smbencrypt.c | |||
| @@ -221,7 +221,7 @@ E_md4hash(const unsigned char *passwd, unsigned char *p16, | |||
| 221 | } | 221 | } |
| 222 | 222 | ||
| 223 | rc = mdfour(p16, (unsigned char *) wpwd, len * sizeof(__le16)); | 223 | rc = mdfour(p16, (unsigned char *) wpwd, len * sizeof(__le16)); |
| 224 | memset(wpwd, 0, 129 * sizeof(__le16)); | 224 | memzero_explicit(wpwd, sizeof(wpwd)); |
| 225 | 225 | ||
| 226 | return rc; | 226 | return rc; |
| 227 | } | 227 | } |
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index e5d3eadf47b1..bed43081720f 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c | |||
| @@ -5166,8 +5166,8 @@ int ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, | |||
| 5166 | 5166 | ||
| 5167 | /* fallback to generic here if not in extents fmt */ | 5167 | /* fallback to generic here if not in extents fmt */ |
| 5168 | if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) | 5168 | if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) |
| 5169 | return __generic_block_fiemap(inode, fieinfo, start, len, | 5169 | return generic_block_fiemap(inode, fieinfo, start, len, |
| 5170 | ext4_get_block); | 5170 | ext4_get_block); |
| 5171 | 5171 | ||
| 5172 | if (fiemap_check_flags(fieinfo, EXT4_FIEMAP_FLAGS)) | 5172 | if (fiemap_check_flags(fieinfo, EXT4_FIEMAP_FLAGS)) |
| 5173 | return -EBADR; | 5173 | return -EBADR; |
diff --git a/fs/ext4/file.c b/fs/ext4/file.c index 513c12cf444c..8131be8c0af3 100644 --- a/fs/ext4/file.c +++ b/fs/ext4/file.c | |||
| @@ -273,19 +273,24 @@ static int ext4_file_open(struct inode * inode, struct file * filp) | |||
| 273 | * we determine this extent as a data or a hole according to whether the | 273 | * we determine this extent as a data or a hole according to whether the |
| 274 | * page cache has data or not. | 274 | * page cache has data or not. |
| 275 | */ | 275 | */ |
| 276 | static int ext4_find_unwritten_pgoff(struct inode *inode, int whence, | 276 | static int ext4_find_unwritten_pgoff(struct inode *inode, |
| 277 | loff_t endoff, loff_t *offset) | 277 | int whence, |
| 278 | struct ext4_map_blocks *map, | ||
| 279 | loff_t *offset) | ||
| 278 | { | 280 | { |
| 279 | struct pagevec pvec; | 281 | struct pagevec pvec; |
| 282 | unsigned int blkbits; | ||
| 280 | pgoff_t index; | 283 | pgoff_t index; |
| 281 | pgoff_t end; | 284 | pgoff_t end; |
| 285 | loff_t endoff; | ||
| 282 | loff_t startoff; | 286 | loff_t startoff; |
| 283 | loff_t lastoff; | 287 | loff_t lastoff; |
| 284 | int found = 0; | 288 | int found = 0; |
| 285 | 289 | ||
| 290 | blkbits = inode->i_sb->s_blocksize_bits; | ||
| 286 | startoff = *offset; | 291 | startoff = *offset; |
| 287 | lastoff = startoff; | 292 | lastoff = startoff; |
| 288 | 293 | endoff = (loff_t)(map->m_lblk + map->m_len) << blkbits; | |
| 289 | 294 | ||
| 290 | index = startoff >> PAGE_CACHE_SHIFT; | 295 | index = startoff >> PAGE_CACHE_SHIFT; |
| 291 | end = endoff >> PAGE_CACHE_SHIFT; | 296 | end = endoff >> PAGE_CACHE_SHIFT; |
| @@ -403,144 +408,147 @@ out: | |||
| 403 | static loff_t ext4_seek_data(struct file *file, loff_t offset, loff_t maxsize) | 408 | static loff_t ext4_seek_data(struct file *file, loff_t offset, loff_t maxsize) |
| 404 | { | 409 | { |
| 405 | struct inode *inode = file->f_mapping->host; | 410 | struct inode *inode = file->f_mapping->host; |
| 406 | struct fiemap_extent_info fie; | 411 | struct ext4_map_blocks map; |
| 407 | struct fiemap_extent ext[2]; | 412 | struct extent_status es; |
| 408 | loff_t next; | 413 | ext4_lblk_t start, last, end; |
| 409 | int i, ret = 0; | 414 | loff_t dataoff, isize; |
| 415 | int blkbits; | ||
| 416 | int ret = 0; | ||
| 410 | 417 | ||
| 411 | mutex_lock(&inode->i_mutex); | 418 | mutex_lock(&inode->i_mutex); |
| 412 | if (offset >= inode->i_size) { | 419 | |
| 420 | isize = i_size_read(inode); | ||
| 421 | if (offset >= isize) { | ||
| 413 | mutex_unlock(&inode->i_mutex); | 422 | mutex_unlock(&inode->i_mutex); |
| 414 | return -ENXIO; | 423 | return -ENXIO; |
| 415 | } | 424 | } |
| 416 | fie.fi_flags = 0; | 425 | |
| 417 | fie.fi_extents_max = 2; | 426 | blkbits = inode->i_sb->s_blocksize_bits; |
| 418 | fie.fi_extents_start = (struct fiemap_extent __user *) &ext; | 427 | start = offset >> blkbits; |
| 419 | while (1) { | 428 | last = start; |
| 420 | mm_segment_t old_fs = get_fs(); | 429 | end = isize >> blkbits; |
| 421 | 430 | dataoff = offset; | |
| 422 | fie.fi_extents_mapped = 0; | 431 | |
| 423 | memset(ext, 0, sizeof(*ext) * fie.fi_extents_max); | 432 | do { |
| 424 | 433 | map.m_lblk = last; | |
| 425 | set_fs(get_ds()); | 434 | map.m_len = end - last + 1; |
| 426 | ret = ext4_fiemap(inode, &fie, offset, maxsize - offset); | 435 | ret = ext4_map_blocks(NULL, inode, &map, 0); |
| 427 | set_fs(old_fs); | 436 | if (ret > 0 && !(map.m_flags & EXT4_MAP_UNWRITTEN)) { |
| 428 | if (ret) | 437 | if (last != start) |
| 438 | dataoff = (loff_t)last << blkbits; | ||
| 429 | break; | 439 | break; |
| 440 | } | ||
| 430 | 441 | ||
| 431 | /* No extents found, EOF */ | 442 | /* |
| 432 | if (!fie.fi_extents_mapped) { | 443 | * If there is a delay extent at this offset, |
| 433 | ret = -ENXIO; | 444 | * it will be as a data. |
| 445 | */ | ||
| 446 | ext4_es_find_delayed_extent_range(inode, last, last, &es); | ||
| 447 | if (es.es_len != 0 && in_range(last, es.es_lblk, es.es_len)) { | ||
| 448 | if (last != start) | ||
| 449 | dataoff = (loff_t)last << blkbits; | ||
| 434 | break; | 450 | break; |
| 435 | } | 451 | } |
| 436 | for (i = 0; i < fie.fi_extents_mapped; i++) { | ||
| 437 | next = (loff_t)(ext[i].fe_length + ext[i].fe_logical); | ||
| 438 | 452 | ||
| 439 | if (offset < (loff_t)ext[i].fe_logical) | 453 | /* |
| 440 | offset = (loff_t)ext[i].fe_logical; | 454 | * If there is a unwritten extent at this offset, |
| 441 | /* | 455 | * it will be as a data or a hole according to page |
| 442 | * If extent is not unwritten, then it contains valid | 456 | * cache that has data or not. |
| 443 | * data, mapped or delayed. | 457 | */ |
| 444 | */ | 458 | if (map.m_flags & EXT4_MAP_UNWRITTEN) { |
| 445 | if (!(ext[i].fe_flags & FIEMAP_EXTENT_UNWRITTEN)) | 459 | int unwritten; |
| 446 | goto out; | 460 | unwritten = ext4_find_unwritten_pgoff(inode, SEEK_DATA, |
| 461 | &map, &dataoff); | ||
| 462 | if (unwritten) | ||
| 463 | break; | ||
| 464 | } | ||
| 447 | 465 | ||
| 448 | /* | 466 | last++; |
| 449 | * If there is a unwritten extent at this offset, | 467 | dataoff = (loff_t)last << blkbits; |
| 450 | * it will be as a data or a hole according to page | 468 | } while (last <= end); |
| 451 | * cache that has data or not. | ||
| 452 | */ | ||
| 453 | if (ext4_find_unwritten_pgoff(inode, SEEK_DATA, | ||
| 454 | next, &offset)) | ||
| 455 | goto out; | ||
| 456 | 469 | ||
| 457 | if (ext[i].fe_flags & FIEMAP_EXTENT_LAST) { | ||
| 458 | ret = -ENXIO; | ||
| 459 | goto out; | ||
| 460 | } | ||
| 461 | offset = next; | ||
| 462 | } | ||
| 463 | } | ||
| 464 | if (offset > inode->i_size) | ||
| 465 | offset = inode->i_size; | ||
| 466 | out: | ||
| 467 | mutex_unlock(&inode->i_mutex); | 470 | mutex_unlock(&inode->i_mutex); |
| 468 | if (ret) | ||
| 469 | return ret; | ||
| 470 | 471 | ||
| 471 | return vfs_setpos(file, offset, maxsize); | 472 | if (dataoff > isize) |
| 473 | return -ENXIO; | ||
| 474 | |||
| 475 | return vfs_setpos(file, dataoff, maxsize); | ||
| 472 | } | 476 | } |
| 473 | 477 | ||
| 474 | /* | 478 | /* |
| 475 | * ext4_seek_hole() retrieves the offset for SEEK_HOLE | 479 | * ext4_seek_hole() retrieves the offset for SEEK_HOLE. |
| 476 | */ | 480 | */ |
| 477 | static loff_t ext4_seek_hole(struct file *file, loff_t offset, loff_t maxsize) | 481 | static loff_t ext4_seek_hole(struct file *file, loff_t offset, loff_t maxsize) |
| 478 | { | 482 | { |
| 479 | struct inode *inode = file->f_mapping->host; | 483 | struct inode *inode = file->f_mapping->host; |
| 480 | struct fiemap_extent_info fie; | 484 | struct ext4_map_blocks map; |
| 481 | struct fiemap_extent ext[2]; | 485 | struct extent_status es; |
| 482 | loff_t next; | 486 | ext4_lblk_t start, last, end; |
| 483 | int i, ret = 0; | 487 | loff_t holeoff, isize; |
| 488 | int blkbits; | ||
| 489 | int ret = 0; | ||
| 484 | 490 | ||
| 485 | mutex_lock(&inode->i_mutex); | 491 | mutex_lock(&inode->i_mutex); |
| 486 | if (offset >= inode->i_size) { | 492 | |
| 493 | isize = i_size_read(inode); | ||
| 494 | if (offset >= isize) { | ||
| 487 | mutex_unlock(&inode->i_mutex); | 495 | mutex_unlock(&inode->i_mutex); |
| 488 | return -ENXIO; | 496 | return -ENXIO; |
| 489 | } | 497 | } |
| 490 | 498 | ||
| 491 | fie.fi_flags = 0; | 499 | blkbits = inode->i_sb->s_blocksize_bits; |
| 492 | fie.fi_extents_max = 2; | 500 | start = offset >> blkbits; |
| 493 | fie.fi_extents_start = (struct fiemap_extent __user *)&ext; | 501 | last = start; |
| 494 | while (1) { | 502 | end = isize >> blkbits; |
| 495 | mm_segment_t old_fs = get_fs(); | 503 | holeoff = offset; |
| 496 | |||
| 497 | fie.fi_extents_mapped = 0; | ||
| 498 | memset(ext, 0, sizeof(*ext)); | ||
| 499 | 504 | ||
| 500 | set_fs(get_ds()); | 505 | do { |
| 501 | ret = ext4_fiemap(inode, &fie, offset, maxsize - offset); | 506 | map.m_lblk = last; |
| 502 | set_fs(old_fs); | 507 | map.m_len = end - last + 1; |
| 503 | if (ret) | 508 | ret = ext4_map_blocks(NULL, inode, &map, 0); |
| 504 | break; | 509 | if (ret > 0 && !(map.m_flags & EXT4_MAP_UNWRITTEN)) { |
| 510 | last += ret; | ||
| 511 | holeoff = (loff_t)last << blkbits; | ||
| 512 | continue; | ||
| 513 | } | ||
| 505 | 514 | ||
| 506 | /* No extents found */ | 515 | /* |
| 507 | if (!fie.fi_extents_mapped) | 516 | * If there is a delay extent at this offset, |
| 508 | break; | 517 | * we will skip this extent. |
| 518 | */ | ||
| 519 | ext4_es_find_delayed_extent_range(inode, last, last, &es); | ||
| 520 | if (es.es_len != 0 && in_range(last, es.es_lblk, es.es_len)) { | ||
| 521 | last = es.es_lblk + es.es_len; | ||
| 522 | holeoff = (loff_t)last << blkbits; | ||
| 523 | continue; | ||
| 524 | } | ||
| 509 | 525 | ||
| 510 | for (i = 0; i < fie.fi_extents_mapped; i++) { | 526 | /* |
| 511 | next = (loff_t)(ext[i].fe_logical + ext[i].fe_length); | 527 | * If there is a unwritten extent at this offset, |
| 512 | /* | 528 | * it will be as a data or a hole according to page |
| 513 | * If extent is not unwritten, then it contains valid | 529 | * cache that has data or not. |
| 514 | * data, mapped or delayed. | 530 | */ |
| 515 | */ | 531 | if (map.m_flags & EXT4_MAP_UNWRITTEN) { |
| 516 | if (!(ext[i].fe_flags & FIEMAP_EXTENT_UNWRITTEN)) { | 532 | int unwritten; |
| 517 | if (offset < (loff_t)ext[i].fe_logical) | 533 | unwritten = ext4_find_unwritten_pgoff(inode, SEEK_HOLE, |
| 518 | goto out; | 534 | &map, &holeoff); |
| 519 | offset = next; | 535 | if (!unwritten) { |
| 536 | last += ret; | ||
| 537 | holeoff = (loff_t)last << blkbits; | ||
| 520 | continue; | 538 | continue; |
| 521 | } | 539 | } |
| 522 | /* | ||
| 523 | * If there is a unwritten extent at this offset, | ||
| 524 | * it will be as a data or a hole according to page | ||
| 525 | * cache that has data or not. | ||
| 526 | */ | ||
| 527 | if (ext4_find_unwritten_pgoff(inode, SEEK_HOLE, | ||
| 528 | next, &offset)) | ||
| 529 | goto out; | ||
| 530 | |||
| 531 | offset = next; | ||
| 532 | if (ext[i].fe_flags & FIEMAP_EXTENT_LAST) | ||
| 533 | goto out; | ||
| 534 | } | 540 | } |
| 535 | } | 541 | |
| 536 | if (offset > inode->i_size) | 542 | /* find a hole */ |
| 537 | offset = inode->i_size; | 543 | break; |
| 538 | out: | 544 | } while (last <= end); |
| 545 | |||
| 539 | mutex_unlock(&inode->i_mutex); | 546 | mutex_unlock(&inode->i_mutex); |
| 540 | if (ret) | ||
| 541 | return ret; | ||
| 542 | 547 | ||
| 543 | return vfs_setpos(file, offset, maxsize); | 548 | if (holeoff > isize) |
| 549 | holeoff = isize; | ||
| 550 | |||
| 551 | return vfs_setpos(file, holeoff, maxsize); | ||
| 544 | } | 552 | } |
| 545 | 553 | ||
| 546 | /* | 554 | /* |
diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c index bf76f405a5f9..8a8ec6293b19 100644 --- a/fs/ext4/resize.c +++ b/fs/ext4/resize.c | |||
| @@ -24,6 +24,18 @@ int ext4_resize_begin(struct super_block *sb) | |||
| 24 | return -EPERM; | 24 | return -EPERM; |
| 25 | 25 | ||
| 26 | /* | 26 | /* |
| 27 | * If we are not using the primary superblock/GDT copy don't resize, | ||
| 28 | * because the user tools have no way of handling this. Probably a | ||
| 29 | * bad time to do it anyways. | ||
| 30 | */ | ||
| 31 | if (EXT4_SB(sb)->s_sbh->b_blocknr != | ||
| 32 | le32_to_cpu(EXT4_SB(sb)->s_es->s_first_data_block)) { | ||
| 33 | ext4_warning(sb, "won't resize using backup superblock at %llu", | ||
| 34 | (unsigned long long)EXT4_SB(sb)->s_sbh->b_blocknr); | ||
| 35 | return -EPERM; | ||
| 36 | } | ||
| 37 | |||
| 38 | /* | ||
| 27 | * We are not allowed to do online-resizing on a filesystem mounted | 39 | * We are not allowed to do online-resizing on a filesystem mounted |
| 28 | * with error, because it can destroy the filesystem easily. | 40 | * with error, because it can destroy the filesystem easily. |
| 29 | */ | 41 | */ |
| @@ -758,18 +770,6 @@ static int add_new_gdb(handle_t *handle, struct inode *inode, | |||
| 758 | "EXT4-fs: ext4_add_new_gdb: adding group block %lu\n", | 770 | "EXT4-fs: ext4_add_new_gdb: adding group block %lu\n", |
| 759 | gdb_num); | 771 | gdb_num); |
| 760 | 772 | ||
| 761 | /* | ||
| 762 | * If we are not using the primary superblock/GDT copy don't resize, | ||
| 763 | * because the user tools have no way of handling this. Probably a | ||
| 764 | * bad time to do it anyways. | ||
| 765 | */ | ||
| 766 | if (EXT4_SB(sb)->s_sbh->b_blocknr != | ||
| 767 | le32_to_cpu(EXT4_SB(sb)->s_es->s_first_data_block)) { | ||
| 768 | ext4_warning(sb, "won't resize using backup superblock at %llu", | ||
| 769 | (unsigned long long)EXT4_SB(sb)->s_sbh->b_blocknr); | ||
| 770 | return -EPERM; | ||
| 771 | } | ||
| 772 | |||
| 773 | gdb_bh = sb_bread(sb, gdblock); | 773 | gdb_bh = sb_bread(sb, gdblock); |
| 774 | if (!gdb_bh) | 774 | if (!gdb_bh) |
| 775 | return -EIO; | 775 | return -EIO; |
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 43c92b1685cb..74c5f53595fb 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
| @@ -3482,7 +3482,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
| 3482 | if (EXT4_HAS_RO_COMPAT_FEATURE(sb, | 3482 | if (EXT4_HAS_RO_COMPAT_FEATURE(sb, |
| 3483 | EXT4_FEATURE_RO_COMPAT_METADATA_CSUM) && | 3483 | EXT4_FEATURE_RO_COMPAT_METADATA_CSUM) && |
| 3484 | EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_GDT_CSUM)) | 3484 | EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_GDT_CSUM)) |
| 3485 | ext4_warning(sb, KERN_INFO "metadata_csum and uninit_bg are " | 3485 | ext4_warning(sb, "metadata_csum and uninit_bg are " |
| 3486 | "redundant flags; please run fsck."); | 3486 | "redundant flags; please run fsck."); |
| 3487 | 3487 | ||
| 3488 | /* Check for a known checksum algorithm */ | 3488 | /* Check for a known checksum algorithm */ |
diff --git a/fs/fcntl.c b/fs/fcntl.c index 99d440a4a6ba..ee85cd4e136a 100644 --- a/fs/fcntl.c +++ b/fs/fcntl.c | |||
| @@ -740,14 +740,15 @@ static int __init fcntl_init(void) | |||
| 740 | * Exceptions: O_NONBLOCK is a two bit define on parisc; O_NDELAY | 740 | * Exceptions: O_NONBLOCK is a two bit define on parisc; O_NDELAY |
| 741 | * is defined as O_NONBLOCK on some platforms and not on others. | 741 | * is defined as O_NONBLOCK on some platforms and not on others. |
| 742 | */ | 742 | */ |
| 743 | BUILD_BUG_ON(20 - 1 /* for O_RDONLY being 0 */ != HWEIGHT32( | 743 | BUILD_BUG_ON(21 - 1 /* for O_RDONLY being 0 */ != HWEIGHT32( |
| 744 | O_RDONLY | O_WRONLY | O_RDWR | | 744 | O_RDONLY | O_WRONLY | O_RDWR | |
| 745 | O_CREAT | O_EXCL | O_NOCTTY | | 745 | O_CREAT | O_EXCL | O_NOCTTY | |
| 746 | O_TRUNC | O_APPEND | /* O_NONBLOCK | */ | 746 | O_TRUNC | O_APPEND | /* O_NONBLOCK | */ |
| 747 | __O_SYNC | O_DSYNC | FASYNC | | 747 | __O_SYNC | O_DSYNC | FASYNC | |
| 748 | O_DIRECT | O_LARGEFILE | O_DIRECTORY | | 748 | O_DIRECT | O_LARGEFILE | O_DIRECTORY | |
| 749 | O_NOFOLLOW | O_NOATIME | O_CLOEXEC | | 749 | O_NOFOLLOW | O_NOATIME | O_CLOEXEC | |
| 750 | __FMODE_EXEC | O_PATH | __O_TMPFILE | 750 | __FMODE_EXEC | O_PATH | __O_TMPFILE | |
| 751 | __FMODE_NONOTIFY | ||
| 751 | )); | 752 | )); |
| 752 | 753 | ||
| 753 | fasync_cache = kmem_cache_create("fasync_cache", | 754 | fasync_cache = kmem_cache_create("fasync_cache", |
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/gfs2/quota.c b/fs/gfs2/quota.c index c8b148bbdc8b..3e193cb36996 100644 --- a/fs/gfs2/quota.c +++ b/fs/gfs2/quota.c | |||
| @@ -667,7 +667,7 @@ static void do_qc(struct gfs2_quota_data *qd, s64 change) | |||
| 667 | 667 | ||
| 668 | static int gfs2_adjust_quota(struct gfs2_inode *ip, loff_t loc, | 668 | static int gfs2_adjust_quota(struct gfs2_inode *ip, loff_t loc, |
| 669 | s64 change, struct gfs2_quota_data *qd, | 669 | s64 change, struct gfs2_quota_data *qd, |
| 670 | struct fs_disk_quota *fdq) | 670 | struct qc_dqblk *fdq) |
| 671 | { | 671 | { |
| 672 | struct inode *inode = &ip->i_inode; | 672 | struct inode *inode = &ip->i_inode; |
| 673 | struct gfs2_sbd *sdp = GFS2_SB(inode); | 673 | struct gfs2_sbd *sdp = GFS2_SB(inode); |
| @@ -697,16 +697,16 @@ static int gfs2_adjust_quota(struct gfs2_inode *ip, loff_t loc, | |||
| 697 | be64_add_cpu(&q.qu_value, change); | 697 | be64_add_cpu(&q.qu_value, change); |
| 698 | qd->qd_qb.qb_value = q.qu_value; | 698 | qd->qd_qb.qb_value = q.qu_value; |
| 699 | if (fdq) { | 699 | if (fdq) { |
| 700 | if (fdq->d_fieldmask & FS_DQ_BSOFT) { | 700 | if (fdq->d_fieldmask & QC_SPC_SOFT) { |
| 701 | q.qu_warn = cpu_to_be64(fdq->d_blk_softlimit >> sdp->sd_fsb2bb_shift); | 701 | q.qu_warn = cpu_to_be64(fdq->d_spc_softlimit >> sdp->sd_sb.sb_bsize_shift); |
| 702 | qd->qd_qb.qb_warn = q.qu_warn; | 702 | qd->qd_qb.qb_warn = q.qu_warn; |
| 703 | } | 703 | } |
| 704 | if (fdq->d_fieldmask & FS_DQ_BHARD) { | 704 | if (fdq->d_fieldmask & QC_SPC_HARD) { |
| 705 | q.qu_limit = cpu_to_be64(fdq->d_blk_hardlimit >> sdp->sd_fsb2bb_shift); | 705 | q.qu_limit = cpu_to_be64(fdq->d_spc_hardlimit >> sdp->sd_sb.sb_bsize_shift); |
| 706 | qd->qd_qb.qb_limit = q.qu_limit; | 706 | qd->qd_qb.qb_limit = q.qu_limit; |
| 707 | } | 707 | } |
| 708 | if (fdq->d_fieldmask & FS_DQ_BCOUNT) { | 708 | if (fdq->d_fieldmask & QC_SPACE) { |
| 709 | q.qu_value = cpu_to_be64(fdq->d_bcount >> sdp->sd_fsb2bb_shift); | 709 | q.qu_value = cpu_to_be64(fdq->d_space >> sdp->sd_sb.sb_bsize_shift); |
| 710 | qd->qd_qb.qb_value = q.qu_value; | 710 | qd->qd_qb.qb_value = q.qu_value; |
| 711 | } | 711 | } |
| 712 | } | 712 | } |
| @@ -1497,7 +1497,7 @@ static int gfs2_quota_get_xstate(struct super_block *sb, | |||
| 1497 | } | 1497 | } |
| 1498 | 1498 | ||
| 1499 | static int gfs2_get_dqblk(struct super_block *sb, struct kqid qid, | 1499 | static int gfs2_get_dqblk(struct super_block *sb, struct kqid qid, |
| 1500 | struct fs_disk_quota *fdq) | 1500 | struct qc_dqblk *fdq) |
| 1501 | { | 1501 | { |
| 1502 | struct gfs2_sbd *sdp = sb->s_fs_info; | 1502 | struct gfs2_sbd *sdp = sb->s_fs_info; |
| 1503 | struct gfs2_quota_lvb *qlvb; | 1503 | struct gfs2_quota_lvb *qlvb; |
| @@ -1505,7 +1505,7 @@ static int gfs2_get_dqblk(struct super_block *sb, struct kqid qid, | |||
| 1505 | struct gfs2_holder q_gh; | 1505 | struct gfs2_holder q_gh; |
| 1506 | int error; | 1506 | int error; |
| 1507 | 1507 | ||
| 1508 | memset(fdq, 0, sizeof(struct fs_disk_quota)); | 1508 | memset(fdq, 0, sizeof(*fdq)); |
| 1509 | 1509 | ||
| 1510 | if (sdp->sd_args.ar_quota == GFS2_QUOTA_OFF) | 1510 | if (sdp->sd_args.ar_quota == GFS2_QUOTA_OFF) |
| 1511 | return -ESRCH; /* Crazy XFS error code */ | 1511 | return -ESRCH; /* Crazy XFS error code */ |
| @@ -1522,12 +1522,9 @@ static int gfs2_get_dqblk(struct super_block *sb, struct kqid qid, | |||
| 1522 | goto out; | 1522 | goto out; |
| 1523 | 1523 | ||
| 1524 | qlvb = (struct gfs2_quota_lvb *)qd->qd_gl->gl_lksb.sb_lvbptr; | 1524 | qlvb = (struct gfs2_quota_lvb *)qd->qd_gl->gl_lksb.sb_lvbptr; |
| 1525 | fdq->d_version = FS_DQUOT_VERSION; | 1525 | fdq->d_spc_hardlimit = be64_to_cpu(qlvb->qb_limit) << sdp->sd_sb.sb_bsize_shift; |
| 1526 | fdq->d_flags = (qid.type == USRQUOTA) ? FS_USER_QUOTA : FS_GROUP_QUOTA; | 1526 | fdq->d_spc_softlimit = be64_to_cpu(qlvb->qb_warn) << sdp->sd_sb.sb_bsize_shift; |
| 1527 | fdq->d_id = from_kqid_munged(current_user_ns(), qid); | 1527 | fdq->d_space = be64_to_cpu(qlvb->qb_value) << sdp->sd_sb.sb_bsize_shift; |
| 1528 | fdq->d_blk_hardlimit = be64_to_cpu(qlvb->qb_limit) << sdp->sd_fsb2bb_shift; | ||
| 1529 | fdq->d_blk_softlimit = be64_to_cpu(qlvb->qb_warn) << sdp->sd_fsb2bb_shift; | ||
| 1530 | fdq->d_bcount = be64_to_cpu(qlvb->qb_value) << sdp->sd_fsb2bb_shift; | ||
| 1531 | 1528 | ||
| 1532 | gfs2_glock_dq_uninit(&q_gh); | 1529 | gfs2_glock_dq_uninit(&q_gh); |
| 1533 | out: | 1530 | out: |
| @@ -1536,10 +1533,10 @@ out: | |||
| 1536 | } | 1533 | } |
| 1537 | 1534 | ||
| 1538 | /* GFS2 only supports a subset of the XFS fields */ | 1535 | /* GFS2 only supports a subset of the XFS fields */ |
| 1539 | #define GFS2_FIELDMASK (FS_DQ_BSOFT|FS_DQ_BHARD|FS_DQ_BCOUNT) | 1536 | #define GFS2_FIELDMASK (QC_SPC_SOFT|QC_SPC_HARD|QC_SPACE) |
| 1540 | 1537 | ||
| 1541 | static int gfs2_set_dqblk(struct super_block *sb, struct kqid qid, | 1538 | static int gfs2_set_dqblk(struct super_block *sb, struct kqid qid, |
| 1542 | struct fs_disk_quota *fdq) | 1539 | struct qc_dqblk *fdq) |
| 1543 | { | 1540 | { |
| 1544 | struct gfs2_sbd *sdp = sb->s_fs_info; | 1541 | struct gfs2_sbd *sdp = sb->s_fs_info; |
| 1545 | struct gfs2_inode *ip = GFS2_I(sdp->sd_quota_inode); | 1542 | struct gfs2_inode *ip = GFS2_I(sdp->sd_quota_inode); |
| @@ -1583,17 +1580,17 @@ static int gfs2_set_dqblk(struct super_block *sb, struct kqid qid, | |||
| 1583 | goto out_i; | 1580 | goto out_i; |
| 1584 | 1581 | ||
| 1585 | /* If nothing has changed, this is a no-op */ | 1582 | /* If nothing has changed, this is a no-op */ |
| 1586 | if ((fdq->d_fieldmask & FS_DQ_BSOFT) && | 1583 | if ((fdq->d_fieldmask & QC_SPC_SOFT) && |
| 1587 | ((fdq->d_blk_softlimit >> sdp->sd_fsb2bb_shift) == be64_to_cpu(qd->qd_qb.qb_warn))) | 1584 | ((fdq->d_spc_softlimit >> sdp->sd_sb.sb_bsize_shift) == be64_to_cpu(qd->qd_qb.qb_warn))) |
| 1588 | fdq->d_fieldmask ^= FS_DQ_BSOFT; | 1585 | fdq->d_fieldmask ^= QC_SPC_SOFT; |
| 1589 | 1586 | ||
| 1590 | if ((fdq->d_fieldmask & FS_DQ_BHARD) && | 1587 | if ((fdq->d_fieldmask & QC_SPC_HARD) && |
| 1591 | ((fdq->d_blk_hardlimit >> sdp->sd_fsb2bb_shift) == be64_to_cpu(qd->qd_qb.qb_limit))) | 1588 | ((fdq->d_spc_hardlimit >> sdp->sd_sb.sb_bsize_shift) == be64_to_cpu(qd->qd_qb.qb_limit))) |
| 1592 | fdq->d_fieldmask ^= FS_DQ_BHARD; | 1589 | fdq->d_fieldmask ^= QC_SPC_HARD; |
| 1593 | 1590 | ||
| 1594 | if ((fdq->d_fieldmask & FS_DQ_BCOUNT) && | 1591 | if ((fdq->d_fieldmask & QC_SPACE) && |
| 1595 | ((fdq->d_bcount >> sdp->sd_fsb2bb_shift) == be64_to_cpu(qd->qd_qb.qb_value))) | 1592 | ((fdq->d_space >> sdp->sd_sb.sb_bsize_shift) == be64_to_cpu(qd->qd_qb.qb_value))) |
| 1596 | fdq->d_fieldmask ^= FS_DQ_BCOUNT; | 1593 | fdq->d_fieldmask ^= QC_SPACE; |
| 1597 | 1594 | ||
| 1598 | if (fdq->d_fieldmask == 0) | 1595 | if (fdq->d_fieldmask == 0) |
| 1599 | goto out_i; | 1596 | goto out_i; |
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/locks.c b/fs/locks.c index 735b8d3fa78c..59e2f905e4ff 100644 --- a/fs/locks.c +++ b/fs/locks.c | |||
| @@ -1702,7 +1702,7 @@ static int generic_delete_lease(struct file *filp) | |||
| 1702 | break; | 1702 | break; |
| 1703 | } | 1703 | } |
| 1704 | trace_generic_delete_lease(inode, fl); | 1704 | trace_generic_delete_lease(inode, fl); |
| 1705 | if (fl) | 1705 | if (fl && IS_LEASE(fl)) |
| 1706 | error = fl->fl_lmops->lm_change(before, F_UNLCK, &dispose); | 1706 | error = fl->fl_lmops->lm_change(before, F_UNLCK, &dispose); |
| 1707 | spin_unlock(&inode->i_lock); | 1707 | spin_unlock(&inode->i_lock); |
| 1708 | locks_dispose_list(&dispose); | 1708 | locks_dispose_list(&dispose); |
diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c index 10bf07280f4a..294692ff83b1 100644 --- a/fs/nfs/direct.c +++ b/fs/nfs/direct.c | |||
| @@ -212,6 +212,12 @@ static int nfs_direct_cmp_commit_data_verf(struct nfs_direct_req *dreq, | |||
| 212 | */ | 212 | */ |
| 213 | ssize_t nfs_direct_IO(int rw, struct kiocb *iocb, struct iov_iter *iter, loff_t pos) | 213 | ssize_t nfs_direct_IO(int rw, struct kiocb *iocb, struct iov_iter *iter, loff_t pos) |
| 214 | { | 214 | { |
| 215 | struct inode *inode = iocb->ki_filp->f_mapping->host; | ||
| 216 | |||
| 217 | /* we only support swap file calling nfs_direct_IO */ | ||
| 218 | if (!IS_SWAPFILE(inode)) | ||
| 219 | return 0; | ||
| 220 | |||
| 215 | #ifndef CONFIG_NFS_SWAP | 221 | #ifndef CONFIG_NFS_SWAP |
| 216 | dprintk("NFS: nfs_direct_IO (%pD) off/no(%Ld/%lu) EINVAL\n", | 222 | dprintk("NFS: nfs_direct_IO (%pD) off/no(%Ld/%lu) EINVAL\n", |
| 217 | iocb->ki_filp, (long long) pos, iter->nr_segs); | 223 | iocb->ki_filp, (long long) pos, iter->nr_segs); |
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index 4bffe637ea32..2211f6ba8736 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c | |||
| @@ -352,8 +352,9 @@ nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr, st | |||
| 352 | 352 | ||
| 353 | nfs_attr_check_mountpoint(sb, fattr); | 353 | nfs_attr_check_mountpoint(sb, fattr); |
| 354 | 354 | ||
| 355 | if (((fattr->valid & NFS_ATTR_FATTR_FILEID) == 0) && | 355 | if (nfs_attr_use_mounted_on_fileid(fattr)) |
| 356 | !nfs_attr_use_mounted_on_fileid(fattr)) | 356 | fattr->fileid = fattr->mounted_on_fileid; |
| 357 | else if ((fattr->valid & NFS_ATTR_FATTR_FILEID) == 0) | ||
| 357 | goto out_no_inode; | 358 | goto out_no_inode; |
| 358 | if ((fattr->valid & NFS_ATTR_FATTR_TYPE) == 0) | 359 | if ((fattr->valid & NFS_ATTR_FATTR_TYPE) == 0) |
| 359 | goto out_no_inode; | 360 | goto out_no_inode; |
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h index efaa31c70fbe..b6f34bfa6fe8 100644 --- a/fs/nfs/internal.h +++ b/fs/nfs/internal.h | |||
| @@ -31,8 +31,6 @@ static inline int nfs_attr_use_mounted_on_fileid(struct nfs_fattr *fattr) | |||
| 31 | (((fattr->valid & NFS_ATTR_FATTR_MOUNTPOINT) == 0) && | 31 | (((fattr->valid & NFS_ATTR_FATTR_MOUNTPOINT) == 0) && |
| 32 | ((fattr->valid & NFS_ATTR_FATTR_V4_REFERRAL) == 0))) | 32 | ((fattr->valid & NFS_ATTR_FATTR_V4_REFERRAL) == 0))) |
| 33 | return 0; | 33 | return 0; |
| 34 | |||
| 35 | fattr->fileid = fattr->mounted_on_fileid; | ||
| 36 | return 1; | 34 | return 1; |
| 37 | } | 35 | } |
| 38 | 36 | ||
diff --git a/fs/nfs/nfs4client.c b/fs/nfs/nfs4client.c index 03311259b0c4..706ad10b8186 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 | ||
| @@ -639,7 +639,7 @@ int nfs41_walk_client_list(struct nfs_client *new, | |||
| 639 | prev = pos; | 639 | prev = pos; |
| 640 | 640 | ||
| 641 | status = nfs_wait_client_init_complete(pos); | 641 | status = nfs_wait_client_init_complete(pos); |
| 642 | if (status == 0) { | 642 | if (pos->cl_cons_state == NFS_CS_SESSION_INITING) { |
| 643 | nfs4_schedule_lease_recovery(pos); | 643 | nfs4_schedule_lease_recovery(pos); |
| 644 | status = nfs4_wait_clnt_recover(pos); | 644 | status = nfs4_wait_clnt_recover(pos); |
| 645 | } | 645 | } |
| @@ -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/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index 3550a9c87616..c06a1ba80d73 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c | |||
| @@ -3897,11 +3897,11 @@ nfs4_set_delegation(struct nfs4_client *clp, struct svc_fh *fh, | |||
| 3897 | status = nfs4_setlease(dp); | 3897 | status = nfs4_setlease(dp); |
| 3898 | goto out; | 3898 | goto out; |
| 3899 | } | 3899 | } |
| 3900 | atomic_inc(&fp->fi_delegees); | ||
| 3901 | if (fp->fi_had_conflict) { | 3900 | if (fp->fi_had_conflict) { |
| 3902 | status = -EAGAIN; | 3901 | status = -EAGAIN; |
| 3903 | goto out_unlock; | 3902 | goto out_unlock; |
| 3904 | } | 3903 | } |
| 3904 | atomic_inc(&fp->fi_delegees); | ||
| 3905 | hash_delegation_locked(dp, fp); | 3905 | hash_delegation_locked(dp, fp); |
| 3906 | status = 0; | 3906 | status = 0; |
| 3907 | out_unlock: | 3907 | out_unlock: |
diff --git a/fs/nilfs2/nilfs.h b/fs/nilfs2/nilfs.h index 91093cd74f0d..385704027575 100644 --- a/fs/nilfs2/nilfs.h +++ b/fs/nilfs2/nilfs.h | |||
| @@ -141,7 +141,6 @@ enum { | |||
| 141 | * @ti_save: Backup of journal_info field of task_struct | 141 | * @ti_save: Backup of journal_info field of task_struct |
| 142 | * @ti_flags: Flags | 142 | * @ti_flags: Flags |
| 143 | * @ti_count: Nest level | 143 | * @ti_count: Nest level |
| 144 | * @ti_garbage: List of inode to be put when releasing semaphore | ||
| 145 | */ | 144 | */ |
| 146 | struct nilfs_transaction_info { | 145 | struct nilfs_transaction_info { |
| 147 | u32 ti_magic; | 146 | u32 ti_magic; |
| @@ -150,7 +149,6 @@ struct nilfs_transaction_info { | |||
| 150 | one of other filesystems has a bug. */ | 149 | one of other filesystems has a bug. */ |
| 151 | unsigned short ti_flags; | 150 | unsigned short ti_flags; |
| 152 | unsigned short ti_count; | 151 | unsigned short ti_count; |
| 153 | struct list_head ti_garbage; | ||
| 154 | }; | 152 | }; |
| 155 | 153 | ||
| 156 | /* ti_magic */ | 154 | /* ti_magic */ |
diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c index 7ef18fc656c2..469086b9f99b 100644 --- a/fs/nilfs2/segment.c +++ b/fs/nilfs2/segment.c | |||
| @@ -305,7 +305,6 @@ static void nilfs_transaction_lock(struct super_block *sb, | |||
| 305 | ti->ti_count = 0; | 305 | ti->ti_count = 0; |
| 306 | ti->ti_save = cur_ti; | 306 | ti->ti_save = cur_ti; |
| 307 | ti->ti_magic = NILFS_TI_MAGIC; | 307 | ti->ti_magic = NILFS_TI_MAGIC; |
| 308 | INIT_LIST_HEAD(&ti->ti_garbage); | ||
| 309 | current->journal_info = ti; | 308 | current->journal_info = ti; |
| 310 | 309 | ||
| 311 | for (;;) { | 310 | for (;;) { |
| @@ -332,8 +331,6 @@ static void nilfs_transaction_unlock(struct super_block *sb) | |||
| 332 | 331 | ||
| 333 | up_write(&nilfs->ns_segctor_sem); | 332 | up_write(&nilfs->ns_segctor_sem); |
| 334 | current->journal_info = ti->ti_save; | 333 | current->journal_info = ti->ti_save; |
| 335 | if (!list_empty(&ti->ti_garbage)) | ||
| 336 | nilfs_dispose_list(nilfs, &ti->ti_garbage, 0); | ||
| 337 | } | 334 | } |
| 338 | 335 | ||
| 339 | static void *nilfs_segctor_map_segsum_entry(struct nilfs_sc_info *sci, | 336 | static void *nilfs_segctor_map_segsum_entry(struct nilfs_sc_info *sci, |
| @@ -746,6 +743,15 @@ static void nilfs_dispose_list(struct the_nilfs *nilfs, | |||
| 746 | } | 743 | } |
| 747 | } | 744 | } |
| 748 | 745 | ||
| 746 | static void nilfs_iput_work_func(struct work_struct *work) | ||
| 747 | { | ||
| 748 | struct nilfs_sc_info *sci = container_of(work, struct nilfs_sc_info, | ||
| 749 | sc_iput_work); | ||
| 750 | struct the_nilfs *nilfs = sci->sc_super->s_fs_info; | ||
| 751 | |||
| 752 | nilfs_dispose_list(nilfs, &sci->sc_iput_queue, 0); | ||
| 753 | } | ||
| 754 | |||
| 749 | static int nilfs_test_metadata_dirty(struct the_nilfs *nilfs, | 755 | static int nilfs_test_metadata_dirty(struct the_nilfs *nilfs, |
| 750 | struct nilfs_root *root) | 756 | struct nilfs_root *root) |
| 751 | { | 757 | { |
| @@ -1900,8 +1906,8 @@ static int nilfs_segctor_collect_dirty_files(struct nilfs_sc_info *sci, | |||
| 1900 | static void nilfs_segctor_drop_written_files(struct nilfs_sc_info *sci, | 1906 | static void nilfs_segctor_drop_written_files(struct nilfs_sc_info *sci, |
| 1901 | struct the_nilfs *nilfs) | 1907 | struct the_nilfs *nilfs) |
| 1902 | { | 1908 | { |
| 1903 | struct nilfs_transaction_info *ti = current->journal_info; | ||
| 1904 | struct nilfs_inode_info *ii, *n; | 1909 | struct nilfs_inode_info *ii, *n; |
| 1910 | int defer_iput = false; | ||
| 1905 | 1911 | ||
| 1906 | spin_lock(&nilfs->ns_inode_lock); | 1912 | spin_lock(&nilfs->ns_inode_lock); |
| 1907 | list_for_each_entry_safe(ii, n, &sci->sc_dirty_files, i_dirty) { | 1913 | list_for_each_entry_safe(ii, n, &sci->sc_dirty_files, i_dirty) { |
| @@ -1912,9 +1918,24 @@ static void nilfs_segctor_drop_written_files(struct nilfs_sc_info *sci, | |||
| 1912 | clear_bit(NILFS_I_BUSY, &ii->i_state); | 1918 | clear_bit(NILFS_I_BUSY, &ii->i_state); |
| 1913 | brelse(ii->i_bh); | 1919 | brelse(ii->i_bh); |
| 1914 | ii->i_bh = NULL; | 1920 | ii->i_bh = NULL; |
| 1915 | list_move_tail(&ii->i_dirty, &ti->ti_garbage); | 1921 | list_del_init(&ii->i_dirty); |
| 1922 | if (!ii->vfs_inode.i_nlink) { | ||
| 1923 | /* | ||
| 1924 | * Defer calling iput() to avoid a deadlock | ||
| 1925 | * over I_SYNC flag for inodes with i_nlink == 0 | ||
| 1926 | */ | ||
| 1927 | list_add_tail(&ii->i_dirty, &sci->sc_iput_queue); | ||
| 1928 | defer_iput = true; | ||
| 1929 | } else { | ||
| 1930 | spin_unlock(&nilfs->ns_inode_lock); | ||
| 1931 | iput(&ii->vfs_inode); | ||
| 1932 | spin_lock(&nilfs->ns_inode_lock); | ||
| 1933 | } | ||
| 1916 | } | 1934 | } |
| 1917 | spin_unlock(&nilfs->ns_inode_lock); | 1935 | spin_unlock(&nilfs->ns_inode_lock); |
| 1936 | |||
| 1937 | if (defer_iput) | ||
| 1938 | schedule_work(&sci->sc_iput_work); | ||
| 1918 | } | 1939 | } |
| 1919 | 1940 | ||
| 1920 | /* | 1941 | /* |
| @@ -2583,6 +2604,8 @@ static struct nilfs_sc_info *nilfs_segctor_new(struct super_block *sb, | |||
| 2583 | INIT_LIST_HEAD(&sci->sc_segbufs); | 2604 | INIT_LIST_HEAD(&sci->sc_segbufs); |
| 2584 | INIT_LIST_HEAD(&sci->sc_write_logs); | 2605 | INIT_LIST_HEAD(&sci->sc_write_logs); |
| 2585 | INIT_LIST_HEAD(&sci->sc_gc_inodes); | 2606 | INIT_LIST_HEAD(&sci->sc_gc_inodes); |
| 2607 | INIT_LIST_HEAD(&sci->sc_iput_queue); | ||
| 2608 | INIT_WORK(&sci->sc_iput_work, nilfs_iput_work_func); | ||
| 2586 | init_timer(&sci->sc_timer); | 2609 | init_timer(&sci->sc_timer); |
| 2587 | 2610 | ||
| 2588 | sci->sc_interval = HZ * NILFS_SC_DEFAULT_TIMEOUT; | 2611 | sci->sc_interval = HZ * NILFS_SC_DEFAULT_TIMEOUT; |
| @@ -2609,6 +2632,8 @@ static void nilfs_segctor_write_out(struct nilfs_sc_info *sci) | |||
| 2609 | ret = nilfs_segctor_construct(sci, SC_LSEG_SR); | 2632 | ret = nilfs_segctor_construct(sci, SC_LSEG_SR); |
| 2610 | nilfs_transaction_unlock(sci->sc_super); | 2633 | nilfs_transaction_unlock(sci->sc_super); |
| 2611 | 2634 | ||
| 2635 | flush_work(&sci->sc_iput_work); | ||
| 2636 | |||
| 2612 | } while (ret && retrycount-- > 0); | 2637 | } while (ret && retrycount-- > 0); |
| 2613 | } | 2638 | } |
| 2614 | 2639 | ||
| @@ -2633,6 +2658,9 @@ static void nilfs_segctor_destroy(struct nilfs_sc_info *sci) | |||
| 2633 | || sci->sc_seq_request != sci->sc_seq_done); | 2658 | || sci->sc_seq_request != sci->sc_seq_done); |
| 2634 | spin_unlock(&sci->sc_state_lock); | 2659 | spin_unlock(&sci->sc_state_lock); |
| 2635 | 2660 | ||
| 2661 | if (flush_work(&sci->sc_iput_work)) | ||
| 2662 | flag = true; | ||
| 2663 | |||
| 2636 | if (flag || !nilfs_segctor_confirm(sci)) | 2664 | if (flag || !nilfs_segctor_confirm(sci)) |
| 2637 | nilfs_segctor_write_out(sci); | 2665 | nilfs_segctor_write_out(sci); |
| 2638 | 2666 | ||
| @@ -2642,6 +2670,12 @@ static void nilfs_segctor_destroy(struct nilfs_sc_info *sci) | |||
| 2642 | nilfs_dispose_list(nilfs, &sci->sc_dirty_files, 1); | 2670 | nilfs_dispose_list(nilfs, &sci->sc_dirty_files, 1); |
| 2643 | } | 2671 | } |
| 2644 | 2672 | ||
| 2673 | if (!list_empty(&sci->sc_iput_queue)) { | ||
| 2674 | nilfs_warning(sci->sc_super, __func__, | ||
| 2675 | "iput queue is not empty\n"); | ||
| 2676 | nilfs_dispose_list(nilfs, &sci->sc_iput_queue, 1); | ||
| 2677 | } | ||
| 2678 | |||
| 2645 | WARN_ON(!list_empty(&sci->sc_segbufs)); | 2679 | WARN_ON(!list_empty(&sci->sc_segbufs)); |
| 2646 | WARN_ON(!list_empty(&sci->sc_write_logs)); | 2680 | WARN_ON(!list_empty(&sci->sc_write_logs)); |
| 2647 | 2681 | ||
diff --git a/fs/nilfs2/segment.h b/fs/nilfs2/segment.h index 38a1d0013314..a48d6de1e02c 100644 --- a/fs/nilfs2/segment.h +++ b/fs/nilfs2/segment.h | |||
| @@ -26,6 +26,7 @@ | |||
| 26 | #include <linux/types.h> | 26 | #include <linux/types.h> |
| 27 | #include <linux/fs.h> | 27 | #include <linux/fs.h> |
| 28 | #include <linux/buffer_head.h> | 28 | #include <linux/buffer_head.h> |
| 29 | #include <linux/workqueue.h> | ||
| 29 | #include <linux/nilfs2_fs.h> | 30 | #include <linux/nilfs2_fs.h> |
| 30 | #include "nilfs.h" | 31 | #include "nilfs.h" |
| 31 | 32 | ||
| @@ -92,6 +93,8 @@ struct nilfs_segsum_pointer { | |||
| 92 | * @sc_nblk_inc: Block count of current generation | 93 | * @sc_nblk_inc: Block count of current generation |
| 93 | * @sc_dirty_files: List of files to be written | 94 | * @sc_dirty_files: List of files to be written |
| 94 | * @sc_gc_inodes: List of GC inodes having blocks to be written | 95 | * @sc_gc_inodes: List of GC inodes having blocks to be written |
| 96 | * @sc_iput_queue: list of inodes for which iput should be done | ||
| 97 | * @sc_iput_work: work struct to defer iput call | ||
| 95 | * @sc_freesegs: array of segment numbers to be freed | 98 | * @sc_freesegs: array of segment numbers to be freed |
| 96 | * @sc_nfreesegs: number of segments on @sc_freesegs | 99 | * @sc_nfreesegs: number of segments on @sc_freesegs |
| 97 | * @sc_dsync_inode: inode whose data pages are written for a sync operation | 100 | * @sc_dsync_inode: inode whose data pages are written for a sync operation |
| @@ -135,6 +138,8 @@ struct nilfs_sc_info { | |||
| 135 | 138 | ||
| 136 | struct list_head sc_dirty_files; | 139 | struct list_head sc_dirty_files; |
| 137 | struct list_head sc_gc_inodes; | 140 | struct list_head sc_gc_inodes; |
| 141 | struct list_head sc_iput_queue; | ||
| 142 | struct work_struct sc_iput_work; | ||
| 138 | 143 | ||
| 139 | __u64 *sc_freesegs; | 144 | __u64 *sc_freesegs; |
| 140 | size_t sc_nfreesegs; | 145 | size_t sc_nfreesegs; |
diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c index c991616acca9..bff8567aa42d 100644 --- a/fs/notify/fanotify/fanotify_user.c +++ b/fs/notify/fanotify/fanotify_user.c | |||
| @@ -259,16 +259,15 @@ static ssize_t fanotify_read(struct file *file, char __user *buf, | |||
| 259 | struct fsnotify_event *kevent; | 259 | struct fsnotify_event *kevent; |
| 260 | char __user *start; | 260 | char __user *start; |
| 261 | int ret; | 261 | int ret; |
| 262 | DEFINE_WAIT(wait); | 262 | DEFINE_WAIT_FUNC(wait, woken_wake_function); |
| 263 | 263 | ||
| 264 | start = buf; | 264 | start = buf; |
| 265 | group = file->private_data; | 265 | group = file->private_data; |
| 266 | 266 | ||
| 267 | pr_debug("%s: group=%p\n", __func__, group); | 267 | pr_debug("%s: group=%p\n", __func__, group); |
| 268 | 268 | ||
| 269 | add_wait_queue(&group->notification_waitq, &wait); | ||
| 269 | while (1) { | 270 | while (1) { |
| 270 | prepare_to_wait(&group->notification_waitq, &wait, TASK_INTERRUPTIBLE); | ||
| 271 | |||
| 272 | mutex_lock(&group->notification_mutex); | 271 | mutex_lock(&group->notification_mutex); |
| 273 | kevent = get_one_event(group, count); | 272 | kevent = get_one_event(group, count); |
| 274 | mutex_unlock(&group->notification_mutex); | 273 | mutex_unlock(&group->notification_mutex); |
| @@ -289,7 +288,8 @@ static ssize_t fanotify_read(struct file *file, char __user *buf, | |||
| 289 | 288 | ||
| 290 | if (start != buf) | 289 | if (start != buf) |
| 291 | break; | 290 | break; |
| 292 | schedule(); | 291 | |
| 292 | wait_woken(&wait, TASK_INTERRUPTIBLE, MAX_SCHEDULE_TIMEOUT); | ||
| 293 | continue; | 293 | continue; |
| 294 | } | 294 | } |
| 295 | 295 | ||
| @@ -318,8 +318,8 @@ static ssize_t fanotify_read(struct file *file, char __user *buf, | |||
| 318 | buf += ret; | 318 | buf += ret; |
| 319 | count -= ret; | 319 | count -= ret; |
| 320 | } | 320 | } |
| 321 | remove_wait_queue(&group->notification_waitq, &wait); | ||
| 321 | 322 | ||
| 322 | finish_wait(&group->notification_waitq, &wait); | ||
| 323 | if (start != buf && ret != -EFAULT) | 323 | if (start != buf && ret != -EFAULT) |
| 324 | ret = buf - start; | 324 | ret = buf - start; |
| 325 | return ret; | 325 | return ret; |
diff --git a/fs/ocfs2/dlm/dlmrecovery.c b/fs/ocfs2/dlm/dlmrecovery.c index 79b5af5e6a7b..cecd875653e4 100644 --- a/fs/ocfs2/dlm/dlmrecovery.c +++ b/fs/ocfs2/dlm/dlmrecovery.c | |||
| @@ -2023,11 +2023,8 @@ leave: | |||
| 2023 | dlm_lockres_drop_inflight_ref(dlm, res); | 2023 | dlm_lockres_drop_inflight_ref(dlm, res); |
| 2024 | spin_unlock(&res->spinlock); | 2024 | spin_unlock(&res->spinlock); |
| 2025 | 2025 | ||
| 2026 | if (ret < 0) { | 2026 | if (ret < 0) |
| 2027 | mlog_errno(ret); | 2027 | mlog_errno(ret); |
| 2028 | if (newlock) | ||
| 2029 | dlm_lock_put(newlock); | ||
| 2030 | } | ||
| 2031 | 2028 | ||
| 2032 | return ret; | 2029 | return ret; |
| 2033 | } | 2030 | } |
diff --git a/fs/ocfs2/namei.c b/fs/ocfs2/namei.c index b931e04e3388..914c121ec890 100644 --- a/fs/ocfs2/namei.c +++ b/fs/ocfs2/namei.c | |||
| @@ -94,6 +94,14 @@ static int ocfs2_create_symlink_data(struct ocfs2_super *osb, | |||
| 94 | struct inode *inode, | 94 | struct inode *inode, |
| 95 | const char *symname); | 95 | const char *symname); |
| 96 | 96 | ||
| 97 | static int ocfs2_double_lock(struct ocfs2_super *osb, | ||
| 98 | struct buffer_head **bh1, | ||
| 99 | struct inode *inode1, | ||
| 100 | struct buffer_head **bh2, | ||
| 101 | struct inode *inode2, | ||
| 102 | int rename); | ||
| 103 | |||
| 104 | static void ocfs2_double_unlock(struct inode *inode1, struct inode *inode2); | ||
| 97 | /* An orphan dir name is an 8 byte value, printed as a hex string */ | 105 | /* An orphan dir name is an 8 byte value, printed as a hex string */ |
| 98 | #define OCFS2_ORPHAN_NAMELEN ((int)(2 * sizeof(u64))) | 106 | #define OCFS2_ORPHAN_NAMELEN ((int)(2 * sizeof(u64))) |
| 99 | 107 | ||
| @@ -678,8 +686,10 @@ static int ocfs2_link(struct dentry *old_dentry, | |||
| 678 | { | 686 | { |
| 679 | handle_t *handle; | 687 | handle_t *handle; |
| 680 | struct inode *inode = old_dentry->d_inode; | 688 | struct inode *inode = old_dentry->d_inode; |
| 689 | struct inode *old_dir = old_dentry->d_parent->d_inode; | ||
| 681 | int err; | 690 | int err; |
| 682 | struct buffer_head *fe_bh = NULL; | 691 | struct buffer_head *fe_bh = NULL; |
| 692 | struct buffer_head *old_dir_bh = NULL; | ||
| 683 | struct buffer_head *parent_fe_bh = NULL; | 693 | struct buffer_head *parent_fe_bh = NULL; |
| 684 | struct ocfs2_dinode *fe = NULL; | 694 | struct ocfs2_dinode *fe = NULL; |
| 685 | struct ocfs2_super *osb = OCFS2_SB(dir->i_sb); | 695 | struct ocfs2_super *osb = OCFS2_SB(dir->i_sb); |
| @@ -696,19 +706,33 @@ static int ocfs2_link(struct dentry *old_dentry, | |||
| 696 | 706 | ||
| 697 | dquot_initialize(dir); | 707 | dquot_initialize(dir); |
| 698 | 708 | ||
| 699 | err = ocfs2_inode_lock_nested(dir, &parent_fe_bh, 1, OI_LS_PARENT); | 709 | err = ocfs2_double_lock(osb, &old_dir_bh, old_dir, |
| 710 | &parent_fe_bh, dir, 0); | ||
| 700 | if (err < 0) { | 711 | if (err < 0) { |
| 701 | if (err != -ENOENT) | 712 | if (err != -ENOENT) |
| 702 | mlog_errno(err); | 713 | mlog_errno(err); |
| 703 | return err; | 714 | return err; |
| 704 | } | 715 | } |
| 705 | 716 | ||
| 717 | /* make sure both dirs have bhs | ||
| 718 | * get an extra ref on old_dir_bh if old==new */ | ||
| 719 | if (!parent_fe_bh) { | ||
| 720 | if (old_dir_bh) { | ||
| 721 | parent_fe_bh = old_dir_bh; | ||
| 722 | get_bh(parent_fe_bh); | ||
| 723 | } else { | ||
| 724 | mlog(ML_ERROR, "%s: no old_dir_bh!\n", osb->uuid_str); | ||
| 725 | err = -EIO; | ||
| 726 | goto out; | ||
| 727 | } | ||
| 728 | } | ||
| 729 | |||
| 706 | if (!dir->i_nlink) { | 730 | if (!dir->i_nlink) { |
| 707 | err = -ENOENT; | 731 | err = -ENOENT; |
| 708 | goto out; | 732 | goto out; |
| 709 | } | 733 | } |
| 710 | 734 | ||
| 711 | err = ocfs2_lookup_ino_from_name(dir, old_dentry->d_name.name, | 735 | err = ocfs2_lookup_ino_from_name(old_dir, old_dentry->d_name.name, |
| 712 | old_dentry->d_name.len, &old_de_ino); | 736 | old_dentry->d_name.len, &old_de_ino); |
| 713 | if (err) { | 737 | if (err) { |
| 714 | err = -ENOENT; | 738 | err = -ENOENT; |
| @@ -801,10 +825,11 @@ out_unlock_inode: | |||
| 801 | ocfs2_inode_unlock(inode, 1); | 825 | ocfs2_inode_unlock(inode, 1); |
| 802 | 826 | ||
| 803 | out: | 827 | out: |
| 804 | ocfs2_inode_unlock(dir, 1); | 828 | ocfs2_double_unlock(old_dir, dir); |
| 805 | 829 | ||
| 806 | brelse(fe_bh); | 830 | brelse(fe_bh); |
| 807 | brelse(parent_fe_bh); | 831 | brelse(parent_fe_bh); |
| 832 | brelse(old_dir_bh); | ||
| 808 | 833 | ||
| 809 | ocfs2_free_dir_lookup_result(&lookup); | 834 | ocfs2_free_dir_lookup_result(&lookup); |
| 810 | 835 | ||
| @@ -1072,14 +1097,15 @@ static int ocfs2_check_if_ancestor(struct ocfs2_super *osb, | |||
| 1072 | } | 1097 | } |
| 1073 | 1098 | ||
| 1074 | /* | 1099 | /* |
| 1075 | * The only place this should be used is rename! | 1100 | * The only place this should be used is rename and link! |
| 1076 | * if they have the same id, then the 1st one is the only one locked. | 1101 | * if they have the same id, then the 1st one is the only one locked. |
| 1077 | */ | 1102 | */ |
| 1078 | static int ocfs2_double_lock(struct ocfs2_super *osb, | 1103 | static int ocfs2_double_lock(struct ocfs2_super *osb, |
| 1079 | struct buffer_head **bh1, | 1104 | struct buffer_head **bh1, |
| 1080 | struct inode *inode1, | 1105 | struct inode *inode1, |
| 1081 | struct buffer_head **bh2, | 1106 | struct buffer_head **bh2, |
| 1082 | struct inode *inode2) | 1107 | struct inode *inode2, |
| 1108 | int rename) | ||
| 1083 | { | 1109 | { |
| 1084 | int status; | 1110 | int status; |
| 1085 | int inode1_is_ancestor, inode2_is_ancestor; | 1111 | int inode1_is_ancestor, inode2_is_ancestor; |
| @@ -1127,7 +1153,7 @@ static int ocfs2_double_lock(struct ocfs2_super *osb, | |||
| 1127 | } | 1153 | } |
| 1128 | /* lock id2 */ | 1154 | /* lock id2 */ |
| 1129 | status = ocfs2_inode_lock_nested(inode2, bh2, 1, | 1155 | status = ocfs2_inode_lock_nested(inode2, bh2, 1, |
| 1130 | OI_LS_RENAME1); | 1156 | rename == 1 ? OI_LS_RENAME1 : OI_LS_PARENT); |
| 1131 | if (status < 0) { | 1157 | if (status < 0) { |
| 1132 | if (status != -ENOENT) | 1158 | if (status != -ENOENT) |
| 1133 | mlog_errno(status); | 1159 | mlog_errno(status); |
| @@ -1136,7 +1162,8 @@ static int ocfs2_double_lock(struct ocfs2_super *osb, | |||
| 1136 | } | 1162 | } |
| 1137 | 1163 | ||
| 1138 | /* lock id1 */ | 1164 | /* lock id1 */ |
| 1139 | status = ocfs2_inode_lock_nested(inode1, bh1, 1, OI_LS_RENAME2); | 1165 | status = ocfs2_inode_lock_nested(inode1, bh1, 1, |
| 1166 | rename == 1 ? OI_LS_RENAME2 : OI_LS_PARENT); | ||
| 1140 | if (status < 0) { | 1167 | if (status < 0) { |
| 1141 | /* | 1168 | /* |
| 1142 | * An error return must mean that no cluster locks | 1169 | * An error return must mean that no cluster locks |
| @@ -1252,7 +1279,7 @@ static int ocfs2_rename(struct inode *old_dir, | |||
| 1252 | 1279 | ||
| 1253 | /* if old and new are the same, this'll just do one lock. */ | 1280 | /* if old and new are the same, this'll just do one lock. */ |
| 1254 | status = ocfs2_double_lock(osb, &old_dir_bh, old_dir, | 1281 | status = ocfs2_double_lock(osb, &old_dir_bh, old_dir, |
| 1255 | &new_dir_bh, new_dir); | 1282 | &new_dir_bh, new_dir, 1); |
| 1256 | if (status < 0) { | 1283 | if (status < 0) { |
| 1257 | mlog_errno(status); | 1284 | mlog_errno(status); |
| 1258 | goto bail; | 1285 | goto bail; |
diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index 8f0acef3d184..69df5b239844 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c | |||
| @@ -2396,30 +2396,25 @@ static inline qsize_t stoqb(qsize_t space) | |||
| 2396 | } | 2396 | } |
| 2397 | 2397 | ||
| 2398 | /* Generic routine for getting common part of quota structure */ | 2398 | /* Generic routine for getting common part of quota structure */ |
| 2399 | static void do_get_dqblk(struct dquot *dquot, struct fs_disk_quota *di) | 2399 | static void do_get_dqblk(struct dquot *dquot, struct qc_dqblk *di) |
| 2400 | { | 2400 | { |
| 2401 | struct mem_dqblk *dm = &dquot->dq_dqb; | 2401 | struct mem_dqblk *dm = &dquot->dq_dqb; |
| 2402 | 2402 | ||
| 2403 | memset(di, 0, sizeof(*di)); | 2403 | memset(di, 0, sizeof(*di)); |
| 2404 | di->d_version = FS_DQUOT_VERSION; | ||
| 2405 | di->d_flags = dquot->dq_id.type == USRQUOTA ? | ||
| 2406 | FS_USER_QUOTA : FS_GROUP_QUOTA; | ||
| 2407 | di->d_id = from_kqid_munged(current_user_ns(), dquot->dq_id); | ||
| 2408 | |||
| 2409 | spin_lock(&dq_data_lock); | 2404 | spin_lock(&dq_data_lock); |
| 2410 | di->d_blk_hardlimit = stoqb(dm->dqb_bhardlimit); | 2405 | di->d_spc_hardlimit = dm->dqb_bhardlimit; |
| 2411 | di->d_blk_softlimit = stoqb(dm->dqb_bsoftlimit); | 2406 | di->d_spc_softlimit = dm->dqb_bsoftlimit; |
| 2412 | di->d_ino_hardlimit = dm->dqb_ihardlimit; | 2407 | di->d_ino_hardlimit = dm->dqb_ihardlimit; |
| 2413 | di->d_ino_softlimit = dm->dqb_isoftlimit; | 2408 | di->d_ino_softlimit = dm->dqb_isoftlimit; |
| 2414 | di->d_bcount = dm->dqb_curspace + dm->dqb_rsvspace; | 2409 | di->d_space = dm->dqb_curspace + dm->dqb_rsvspace; |
| 2415 | di->d_icount = dm->dqb_curinodes; | 2410 | di->d_ino_count = dm->dqb_curinodes; |
| 2416 | di->d_btimer = dm->dqb_btime; | 2411 | di->d_spc_timer = dm->dqb_btime; |
| 2417 | di->d_itimer = dm->dqb_itime; | 2412 | di->d_ino_timer = dm->dqb_itime; |
| 2418 | spin_unlock(&dq_data_lock); | 2413 | spin_unlock(&dq_data_lock); |
| 2419 | } | 2414 | } |
| 2420 | 2415 | ||
| 2421 | int dquot_get_dqblk(struct super_block *sb, struct kqid qid, | 2416 | int dquot_get_dqblk(struct super_block *sb, struct kqid qid, |
| 2422 | struct fs_disk_quota *di) | 2417 | struct qc_dqblk *di) |
| 2423 | { | 2418 | { |
| 2424 | struct dquot *dquot; | 2419 | struct dquot *dquot; |
| 2425 | 2420 | ||
| @@ -2433,70 +2428,70 @@ int dquot_get_dqblk(struct super_block *sb, struct kqid qid, | |||
| 2433 | } | 2428 | } |
| 2434 | EXPORT_SYMBOL(dquot_get_dqblk); | 2429 | EXPORT_SYMBOL(dquot_get_dqblk); |
| 2435 | 2430 | ||
| 2436 | #define VFS_FS_DQ_MASK \ | 2431 | #define VFS_QC_MASK \ |
| 2437 | (FS_DQ_BCOUNT | FS_DQ_BSOFT | FS_DQ_BHARD | \ | 2432 | (QC_SPACE | QC_SPC_SOFT | QC_SPC_HARD | \ |
| 2438 | FS_DQ_ICOUNT | FS_DQ_ISOFT | FS_DQ_IHARD | \ | 2433 | QC_INO_COUNT | QC_INO_SOFT | QC_INO_HARD | \ |
| 2439 | FS_DQ_BTIMER | FS_DQ_ITIMER) | 2434 | QC_SPC_TIMER | QC_INO_TIMER) |
| 2440 | 2435 | ||
| 2441 | /* Generic routine for setting common part of quota structure */ | 2436 | /* Generic routine for setting common part of quota structure */ |
| 2442 | static int do_set_dqblk(struct dquot *dquot, struct fs_disk_quota *di) | 2437 | static int do_set_dqblk(struct dquot *dquot, struct qc_dqblk *di) |
| 2443 | { | 2438 | { |
| 2444 | struct mem_dqblk *dm = &dquot->dq_dqb; | 2439 | struct mem_dqblk *dm = &dquot->dq_dqb; |
| 2445 | int check_blim = 0, check_ilim = 0; | 2440 | int check_blim = 0, check_ilim = 0; |
| 2446 | struct mem_dqinfo *dqi = &sb_dqopt(dquot->dq_sb)->info[dquot->dq_id.type]; | 2441 | struct mem_dqinfo *dqi = &sb_dqopt(dquot->dq_sb)->info[dquot->dq_id.type]; |
| 2447 | 2442 | ||
| 2448 | if (di->d_fieldmask & ~VFS_FS_DQ_MASK) | 2443 | if (di->d_fieldmask & ~VFS_QC_MASK) |
| 2449 | return -EINVAL; | 2444 | return -EINVAL; |
| 2450 | 2445 | ||
| 2451 | if (((di->d_fieldmask & FS_DQ_BSOFT) && | 2446 | if (((di->d_fieldmask & QC_SPC_SOFT) && |
| 2452 | (di->d_blk_softlimit > dqi->dqi_maxblimit)) || | 2447 | stoqb(di->d_spc_softlimit) > dqi->dqi_maxblimit) || |
| 2453 | ((di->d_fieldmask & FS_DQ_BHARD) && | 2448 | ((di->d_fieldmask & QC_SPC_HARD) && |
| 2454 | (di->d_blk_hardlimit > dqi->dqi_maxblimit)) || | 2449 | stoqb(di->d_spc_hardlimit) > dqi->dqi_maxblimit) || |
| 2455 | ((di->d_fieldmask & FS_DQ_ISOFT) && | 2450 | ((di->d_fieldmask & QC_INO_SOFT) && |
| 2456 | (di->d_ino_softlimit > dqi->dqi_maxilimit)) || | 2451 | (di->d_ino_softlimit > dqi->dqi_maxilimit)) || |
| 2457 | ((di->d_fieldmask & FS_DQ_IHARD) && | 2452 | ((di->d_fieldmask & QC_INO_HARD) && |
| 2458 | (di->d_ino_hardlimit > dqi->dqi_maxilimit))) | 2453 | (di->d_ino_hardlimit > dqi->dqi_maxilimit))) |
| 2459 | return -ERANGE; | 2454 | return -ERANGE; |
| 2460 | 2455 | ||
| 2461 | spin_lock(&dq_data_lock); | 2456 | spin_lock(&dq_data_lock); |
| 2462 | if (di->d_fieldmask & FS_DQ_BCOUNT) { | 2457 | if (di->d_fieldmask & QC_SPACE) { |
| 2463 | dm->dqb_curspace = di->d_bcount - dm->dqb_rsvspace; | 2458 | dm->dqb_curspace = di->d_space - dm->dqb_rsvspace; |
| 2464 | check_blim = 1; | 2459 | check_blim = 1; |
| 2465 | set_bit(DQ_LASTSET_B + QIF_SPACE_B, &dquot->dq_flags); | 2460 | set_bit(DQ_LASTSET_B + QIF_SPACE_B, &dquot->dq_flags); |
| 2466 | } | 2461 | } |
| 2467 | 2462 | ||
| 2468 | if (di->d_fieldmask & FS_DQ_BSOFT) | 2463 | if (di->d_fieldmask & QC_SPC_SOFT) |
| 2469 | dm->dqb_bsoftlimit = qbtos(di->d_blk_softlimit); | 2464 | dm->dqb_bsoftlimit = di->d_spc_softlimit; |
| 2470 | if (di->d_fieldmask & FS_DQ_BHARD) | 2465 | if (di->d_fieldmask & QC_SPC_HARD) |
| 2471 | dm->dqb_bhardlimit = qbtos(di->d_blk_hardlimit); | 2466 | dm->dqb_bhardlimit = di->d_spc_hardlimit; |
| 2472 | if (di->d_fieldmask & (FS_DQ_BSOFT | FS_DQ_BHARD)) { | 2467 | if (di->d_fieldmask & (QC_SPC_SOFT | QC_SPC_HARD)) { |
| 2473 | check_blim = 1; | 2468 | check_blim = 1; |
| 2474 | set_bit(DQ_LASTSET_B + QIF_BLIMITS_B, &dquot->dq_flags); | 2469 | set_bit(DQ_LASTSET_B + QIF_BLIMITS_B, &dquot->dq_flags); |
| 2475 | } | 2470 | } |
| 2476 | 2471 | ||
| 2477 | if (di->d_fieldmask & FS_DQ_ICOUNT) { | 2472 | if (di->d_fieldmask & QC_INO_COUNT) { |
| 2478 | dm->dqb_curinodes = di->d_icount; | 2473 | dm->dqb_curinodes = di->d_ino_count; |
| 2479 | check_ilim = 1; | 2474 | check_ilim = 1; |
| 2480 | set_bit(DQ_LASTSET_B + QIF_INODES_B, &dquot->dq_flags); | 2475 | set_bit(DQ_LASTSET_B + QIF_INODES_B, &dquot->dq_flags); |
| 2481 | } | 2476 | } |
| 2482 | 2477 | ||
| 2483 | if (di->d_fieldmask & FS_DQ_ISOFT) | 2478 | if (di->d_fieldmask & QC_INO_SOFT) |
| 2484 | dm->dqb_isoftlimit = di->d_ino_softlimit; | 2479 | dm->dqb_isoftlimit = di->d_ino_softlimit; |
| 2485 | if (di->d_fieldmask & FS_DQ_IHARD) | 2480 | if (di->d_fieldmask & QC_INO_HARD) |
| 2486 | dm->dqb_ihardlimit = di->d_ino_hardlimit; | 2481 | dm->dqb_ihardlimit = di->d_ino_hardlimit; |
| 2487 | if (di->d_fieldmask & (FS_DQ_ISOFT | FS_DQ_IHARD)) { | 2482 | if (di->d_fieldmask & (QC_INO_SOFT | QC_INO_HARD)) { |
| 2488 | check_ilim = 1; | 2483 | check_ilim = 1; |
| 2489 | set_bit(DQ_LASTSET_B + QIF_ILIMITS_B, &dquot->dq_flags); | 2484 | set_bit(DQ_LASTSET_B + QIF_ILIMITS_B, &dquot->dq_flags); |
| 2490 | } | 2485 | } |
| 2491 | 2486 | ||
| 2492 | if (di->d_fieldmask & FS_DQ_BTIMER) { | 2487 | if (di->d_fieldmask & QC_SPC_TIMER) { |
| 2493 | dm->dqb_btime = di->d_btimer; | 2488 | dm->dqb_btime = di->d_spc_timer; |
| 2494 | check_blim = 1; | 2489 | check_blim = 1; |
| 2495 | set_bit(DQ_LASTSET_B + QIF_BTIME_B, &dquot->dq_flags); | 2490 | set_bit(DQ_LASTSET_B + QIF_BTIME_B, &dquot->dq_flags); |
| 2496 | } | 2491 | } |
| 2497 | 2492 | ||
| 2498 | if (di->d_fieldmask & FS_DQ_ITIMER) { | 2493 | if (di->d_fieldmask & QC_INO_TIMER) { |
| 2499 | dm->dqb_itime = di->d_itimer; | 2494 | dm->dqb_itime = di->d_ino_timer; |
| 2500 | check_ilim = 1; | 2495 | check_ilim = 1; |
| 2501 | set_bit(DQ_LASTSET_B + QIF_ITIME_B, &dquot->dq_flags); | 2496 | set_bit(DQ_LASTSET_B + QIF_ITIME_B, &dquot->dq_flags); |
| 2502 | } | 2497 | } |
| @@ -2506,7 +2501,7 @@ static int do_set_dqblk(struct dquot *dquot, struct fs_disk_quota *di) | |||
| 2506 | dm->dqb_curspace < dm->dqb_bsoftlimit) { | 2501 | dm->dqb_curspace < dm->dqb_bsoftlimit) { |
| 2507 | dm->dqb_btime = 0; | 2502 | dm->dqb_btime = 0; |
| 2508 | clear_bit(DQ_BLKS_B, &dquot->dq_flags); | 2503 | clear_bit(DQ_BLKS_B, &dquot->dq_flags); |
| 2509 | } else if (!(di->d_fieldmask & FS_DQ_BTIMER)) | 2504 | } else if (!(di->d_fieldmask & QC_SPC_TIMER)) |
| 2510 | /* Set grace only if user hasn't provided his own... */ | 2505 | /* Set grace only if user hasn't provided his own... */ |
| 2511 | dm->dqb_btime = get_seconds() + dqi->dqi_bgrace; | 2506 | dm->dqb_btime = get_seconds() + dqi->dqi_bgrace; |
| 2512 | } | 2507 | } |
| @@ -2515,7 +2510,7 @@ static int do_set_dqblk(struct dquot *dquot, struct fs_disk_quota *di) | |||
| 2515 | dm->dqb_curinodes < dm->dqb_isoftlimit) { | 2510 | dm->dqb_curinodes < dm->dqb_isoftlimit) { |
| 2516 | dm->dqb_itime = 0; | 2511 | dm->dqb_itime = 0; |
| 2517 | clear_bit(DQ_INODES_B, &dquot->dq_flags); | 2512 | clear_bit(DQ_INODES_B, &dquot->dq_flags); |
| 2518 | } else if (!(di->d_fieldmask & FS_DQ_ITIMER)) | 2513 | } else if (!(di->d_fieldmask & QC_INO_TIMER)) |
| 2519 | /* Set grace only if user hasn't provided his own... */ | 2514 | /* Set grace only if user hasn't provided his own... */ |
| 2520 | dm->dqb_itime = get_seconds() + dqi->dqi_igrace; | 2515 | dm->dqb_itime = get_seconds() + dqi->dqi_igrace; |
| 2521 | } | 2516 | } |
| @@ -2531,7 +2526,7 @@ static int do_set_dqblk(struct dquot *dquot, struct fs_disk_quota *di) | |||
| 2531 | } | 2526 | } |
| 2532 | 2527 | ||
| 2533 | int dquot_set_dqblk(struct super_block *sb, struct kqid qid, | 2528 | int dquot_set_dqblk(struct super_block *sb, struct kqid qid, |
| 2534 | struct fs_disk_quota *di) | 2529 | struct qc_dqblk *di) |
| 2535 | { | 2530 | { |
| 2536 | struct dquot *dquot; | 2531 | struct dquot *dquot; |
| 2537 | int rc; | 2532 | int rc; |
diff --git a/fs/quota/quota.c b/fs/quota/quota.c index 2aa4151f99d2..6f3856328eea 100644 --- a/fs/quota/quota.c +++ b/fs/quota/quota.c | |||
| @@ -118,17 +118,27 @@ static int quota_setinfo(struct super_block *sb, int type, void __user *addr) | |||
| 118 | return sb->s_qcop->set_info(sb, type, &info); | 118 | return sb->s_qcop->set_info(sb, type, &info); |
| 119 | } | 119 | } |
| 120 | 120 | ||
| 121 | static void copy_to_if_dqblk(struct if_dqblk *dst, struct fs_disk_quota *src) | 121 | static inline qsize_t qbtos(qsize_t blocks) |
| 122 | { | ||
| 123 | return blocks << QIF_DQBLKSIZE_BITS; | ||
| 124 | } | ||
| 125 | |||
| 126 | static inline qsize_t stoqb(qsize_t space) | ||
| 127 | { | ||
| 128 | return (space + QIF_DQBLKSIZE - 1) >> QIF_DQBLKSIZE_BITS; | ||
| 129 | } | ||
| 130 | |||
| 131 | static void copy_to_if_dqblk(struct if_dqblk *dst, struct qc_dqblk *src) | ||
| 122 | { | 132 | { |
| 123 | memset(dst, 0, sizeof(*dst)); | 133 | memset(dst, 0, sizeof(*dst)); |
| 124 | dst->dqb_bhardlimit = src->d_blk_hardlimit; | 134 | dst->dqb_bhardlimit = stoqb(src->d_spc_hardlimit); |
| 125 | dst->dqb_bsoftlimit = src->d_blk_softlimit; | 135 | dst->dqb_bsoftlimit = stoqb(src->d_spc_softlimit); |
| 126 | dst->dqb_curspace = src->d_bcount; | 136 | dst->dqb_curspace = src->d_space; |
| 127 | dst->dqb_ihardlimit = src->d_ino_hardlimit; | 137 | dst->dqb_ihardlimit = src->d_ino_hardlimit; |
| 128 | dst->dqb_isoftlimit = src->d_ino_softlimit; | 138 | dst->dqb_isoftlimit = src->d_ino_softlimit; |
| 129 | dst->dqb_curinodes = src->d_icount; | 139 | dst->dqb_curinodes = src->d_ino_count; |
| 130 | dst->dqb_btime = src->d_btimer; | 140 | dst->dqb_btime = src->d_spc_timer; |
| 131 | dst->dqb_itime = src->d_itimer; | 141 | dst->dqb_itime = src->d_ino_timer; |
| 132 | dst->dqb_valid = QIF_ALL; | 142 | dst->dqb_valid = QIF_ALL; |
| 133 | } | 143 | } |
| 134 | 144 | ||
| @@ -136,7 +146,7 @@ static int quota_getquota(struct super_block *sb, int type, qid_t id, | |||
| 136 | void __user *addr) | 146 | void __user *addr) |
| 137 | { | 147 | { |
| 138 | struct kqid qid; | 148 | struct kqid qid; |
| 139 | struct fs_disk_quota fdq; | 149 | struct qc_dqblk fdq; |
| 140 | struct if_dqblk idq; | 150 | struct if_dqblk idq; |
| 141 | int ret; | 151 | int ret; |
| 142 | 152 | ||
| @@ -154,36 +164,36 @@ static int quota_getquota(struct super_block *sb, int type, qid_t id, | |||
| 154 | return 0; | 164 | return 0; |
| 155 | } | 165 | } |
| 156 | 166 | ||
| 157 | static void copy_from_if_dqblk(struct fs_disk_quota *dst, struct if_dqblk *src) | 167 | static void copy_from_if_dqblk(struct qc_dqblk *dst, struct if_dqblk *src) |
| 158 | { | 168 | { |
| 159 | dst->d_blk_hardlimit = src->dqb_bhardlimit; | 169 | dst->d_spc_hardlimit = qbtos(src->dqb_bhardlimit); |
| 160 | dst->d_blk_softlimit = src->dqb_bsoftlimit; | 170 | dst->d_spc_softlimit = qbtos(src->dqb_bsoftlimit); |
| 161 | dst->d_bcount = src->dqb_curspace; | 171 | dst->d_space = src->dqb_curspace; |
| 162 | dst->d_ino_hardlimit = src->dqb_ihardlimit; | 172 | dst->d_ino_hardlimit = src->dqb_ihardlimit; |
| 163 | dst->d_ino_softlimit = src->dqb_isoftlimit; | 173 | dst->d_ino_softlimit = src->dqb_isoftlimit; |
| 164 | dst->d_icount = src->dqb_curinodes; | 174 | dst->d_ino_count = src->dqb_curinodes; |
| 165 | dst->d_btimer = src->dqb_btime; | 175 | dst->d_spc_timer = src->dqb_btime; |
| 166 | dst->d_itimer = src->dqb_itime; | 176 | dst->d_ino_timer = src->dqb_itime; |
| 167 | 177 | ||
| 168 | dst->d_fieldmask = 0; | 178 | dst->d_fieldmask = 0; |
| 169 | if (src->dqb_valid & QIF_BLIMITS) | 179 | if (src->dqb_valid & QIF_BLIMITS) |
| 170 | dst->d_fieldmask |= FS_DQ_BSOFT | FS_DQ_BHARD; | 180 | dst->d_fieldmask |= QC_SPC_SOFT | QC_SPC_HARD; |
| 171 | if (src->dqb_valid & QIF_SPACE) | 181 | if (src->dqb_valid & QIF_SPACE) |
| 172 | dst->d_fieldmask |= FS_DQ_BCOUNT; | 182 | dst->d_fieldmask |= QC_SPACE; |
| 173 | if (src->dqb_valid & QIF_ILIMITS) | 183 | if (src->dqb_valid & QIF_ILIMITS) |
| 174 | dst->d_fieldmask |= FS_DQ_ISOFT | FS_DQ_IHARD; | 184 | dst->d_fieldmask |= QC_INO_SOFT | QC_INO_HARD; |
| 175 | if (src->dqb_valid & QIF_INODES) | 185 | if (src->dqb_valid & QIF_INODES) |
| 176 | dst->d_fieldmask |= FS_DQ_ICOUNT; | 186 | dst->d_fieldmask |= QC_INO_COUNT; |
| 177 | if (src->dqb_valid & QIF_BTIME) | 187 | if (src->dqb_valid & QIF_BTIME) |
| 178 | dst->d_fieldmask |= FS_DQ_BTIMER; | 188 | dst->d_fieldmask |= QC_SPC_TIMER; |
| 179 | if (src->dqb_valid & QIF_ITIME) | 189 | if (src->dqb_valid & QIF_ITIME) |
| 180 | dst->d_fieldmask |= FS_DQ_ITIMER; | 190 | dst->d_fieldmask |= QC_INO_TIMER; |
| 181 | } | 191 | } |
| 182 | 192 | ||
| 183 | static int quota_setquota(struct super_block *sb, int type, qid_t id, | 193 | static int quota_setquota(struct super_block *sb, int type, qid_t id, |
| 184 | void __user *addr) | 194 | void __user *addr) |
| 185 | { | 195 | { |
| 186 | struct fs_disk_quota fdq; | 196 | struct qc_dqblk fdq; |
| 187 | struct if_dqblk idq; | 197 | struct if_dqblk idq; |
| 188 | struct kqid qid; | 198 | struct kqid qid; |
| 189 | 199 | ||
| @@ -247,10 +257,78 @@ static int quota_getxstatev(struct super_block *sb, void __user *addr) | |||
| 247 | return ret; | 257 | return ret; |
| 248 | } | 258 | } |
| 249 | 259 | ||
| 260 | /* | ||
| 261 | * XFS defines BBTOB and BTOBB macros inside fs/xfs/ and we cannot move them | ||
| 262 | * out of there as xfsprogs rely on definitions being in that header file. So | ||
| 263 | * just define same functions here for quota purposes. | ||
| 264 | */ | ||
| 265 | #define XFS_BB_SHIFT 9 | ||
| 266 | |||
| 267 | static inline u64 quota_bbtob(u64 blocks) | ||
| 268 | { | ||
| 269 | return blocks << XFS_BB_SHIFT; | ||
| 270 | } | ||
| 271 | |||
| 272 | static inline u64 quota_btobb(u64 bytes) | ||
| 273 | { | ||
| 274 | return (bytes + (1 << XFS_BB_SHIFT) - 1) >> XFS_BB_SHIFT; | ||
| 275 | } | ||
| 276 | |||
| 277 | static void copy_from_xfs_dqblk(struct qc_dqblk *dst, struct fs_disk_quota *src) | ||
| 278 | { | ||
| 279 | dst->d_spc_hardlimit = quota_bbtob(src->d_blk_hardlimit); | ||
| 280 | dst->d_spc_softlimit = quota_bbtob(src->d_blk_softlimit); | ||
| 281 | dst->d_ino_hardlimit = src->d_ino_hardlimit; | ||
| 282 | dst->d_ino_softlimit = src->d_ino_softlimit; | ||
| 283 | dst->d_space = quota_bbtob(src->d_bcount); | ||
| 284 | dst->d_ino_count = src->d_icount; | ||
| 285 | dst->d_ino_timer = src->d_itimer; | ||
| 286 | dst->d_spc_timer = src->d_btimer; | ||
| 287 | dst->d_ino_warns = src->d_iwarns; | ||
| 288 | dst->d_spc_warns = src->d_bwarns; | ||
| 289 | dst->d_rt_spc_hardlimit = quota_bbtob(src->d_rtb_hardlimit); | ||
| 290 | dst->d_rt_spc_softlimit = quota_bbtob(src->d_rtb_softlimit); | ||
| 291 | dst->d_rt_space = quota_bbtob(src->d_rtbcount); | ||
| 292 | dst->d_rt_spc_timer = src->d_rtbtimer; | ||
| 293 | dst->d_rt_spc_warns = src->d_rtbwarns; | ||
| 294 | dst->d_fieldmask = 0; | ||
| 295 | if (src->d_fieldmask & FS_DQ_ISOFT) | ||
| 296 | dst->d_fieldmask |= QC_INO_SOFT; | ||
| 297 | if (src->d_fieldmask & FS_DQ_IHARD) | ||
| 298 | dst->d_fieldmask |= QC_INO_HARD; | ||
| 299 | if (src->d_fieldmask & FS_DQ_BSOFT) | ||
| 300 | dst->d_fieldmask |= QC_SPC_SOFT; | ||
| 301 | if (src->d_fieldmask & FS_DQ_BHARD) | ||
| 302 | dst->d_fieldmask |= QC_SPC_HARD; | ||
| 303 | if (src->d_fieldmask & FS_DQ_RTBSOFT) | ||
| 304 | dst->d_fieldmask |= QC_RT_SPC_SOFT; | ||
| 305 | if (src->d_fieldmask & FS_DQ_RTBHARD) | ||
| 306 | dst->d_fieldmask |= QC_RT_SPC_HARD; | ||
| 307 | if (src->d_fieldmask & FS_DQ_BTIMER) | ||
| 308 | dst->d_fieldmask |= QC_SPC_TIMER; | ||
| 309 | if (src->d_fieldmask & FS_DQ_ITIMER) | ||
| 310 | dst->d_fieldmask |= QC_INO_TIMER; | ||
| 311 | if (src->d_fieldmask & FS_DQ_RTBTIMER) | ||
| 312 | dst->d_fieldmask |= QC_RT_SPC_TIMER; | ||
| 313 | if (src->d_fieldmask & FS_DQ_BWARNS) | ||
| 314 | dst->d_fieldmask |= QC_SPC_WARNS; | ||
| 315 | if (src->d_fieldmask & FS_DQ_IWARNS) | ||
| 316 | dst->d_fieldmask |= QC_INO_WARNS; | ||
| 317 | if (src->d_fieldmask & FS_DQ_RTBWARNS) | ||
| 318 | dst->d_fieldmask |= QC_RT_SPC_WARNS; | ||
| 319 | if (src->d_fieldmask & FS_DQ_BCOUNT) | ||
| 320 | dst->d_fieldmask |= QC_SPACE; | ||
| 321 | if (src->d_fieldmask & FS_DQ_ICOUNT) | ||
| 322 | dst->d_fieldmask |= QC_INO_COUNT; | ||
| 323 | if (src->d_fieldmask & FS_DQ_RTBCOUNT) | ||
| 324 | dst->d_fieldmask |= QC_RT_SPACE; | ||
| 325 | } | ||
| 326 | |||
| 250 | static int quota_setxquota(struct super_block *sb, int type, qid_t id, | 327 | static int quota_setxquota(struct super_block *sb, int type, qid_t id, |
| 251 | void __user *addr) | 328 | void __user *addr) |
| 252 | { | 329 | { |
| 253 | struct fs_disk_quota fdq; | 330 | struct fs_disk_quota fdq; |
| 331 | struct qc_dqblk qdq; | ||
| 254 | struct kqid qid; | 332 | struct kqid qid; |
| 255 | 333 | ||
| 256 | if (copy_from_user(&fdq, addr, sizeof(fdq))) | 334 | if (copy_from_user(&fdq, addr, sizeof(fdq))) |
| @@ -260,13 +338,44 @@ static int quota_setxquota(struct super_block *sb, int type, qid_t id, | |||
| 260 | qid = make_kqid(current_user_ns(), type, id); | 338 | qid = make_kqid(current_user_ns(), type, id); |
| 261 | if (!qid_valid(qid)) | 339 | if (!qid_valid(qid)) |
| 262 | return -EINVAL; | 340 | return -EINVAL; |
| 263 | return sb->s_qcop->set_dqblk(sb, qid, &fdq); | 341 | copy_from_xfs_dqblk(&qdq, &fdq); |
| 342 | return sb->s_qcop->set_dqblk(sb, qid, &qdq); | ||
| 343 | } | ||
| 344 | |||
| 345 | static void copy_to_xfs_dqblk(struct fs_disk_quota *dst, struct qc_dqblk *src, | ||
| 346 | int type, qid_t id) | ||
| 347 | { | ||
| 348 | memset(dst, 0, sizeof(*dst)); | ||
| 349 | dst->d_version = FS_DQUOT_VERSION; | ||
| 350 | dst->d_id = id; | ||
| 351 | if (type == USRQUOTA) | ||
| 352 | dst->d_flags = FS_USER_QUOTA; | ||
| 353 | else if (type == PRJQUOTA) | ||
| 354 | dst->d_flags = FS_PROJ_QUOTA; | ||
| 355 | else | ||
| 356 | dst->d_flags = FS_GROUP_QUOTA; | ||
| 357 | dst->d_blk_hardlimit = quota_btobb(src->d_spc_hardlimit); | ||
| 358 | dst->d_blk_softlimit = quota_btobb(src->d_spc_softlimit); | ||
| 359 | dst->d_ino_hardlimit = src->d_ino_hardlimit; | ||
| 360 | dst->d_ino_softlimit = src->d_ino_softlimit; | ||
| 361 | dst->d_bcount = quota_btobb(src->d_space); | ||
| 362 | dst->d_icount = src->d_ino_count; | ||
| 363 | dst->d_itimer = src->d_ino_timer; | ||
| 364 | dst->d_btimer = src->d_spc_timer; | ||
| 365 | dst->d_iwarns = src->d_ino_warns; | ||
| 366 | dst->d_bwarns = src->d_spc_warns; | ||
| 367 | dst->d_rtb_hardlimit = quota_btobb(src->d_rt_spc_hardlimit); | ||
| 368 | dst->d_rtb_softlimit = quota_btobb(src->d_rt_spc_softlimit); | ||
| 369 | dst->d_rtbcount = quota_btobb(src->d_rt_space); | ||
| 370 | dst->d_rtbtimer = src->d_rt_spc_timer; | ||
| 371 | dst->d_rtbwarns = src->d_rt_spc_warns; | ||
| 264 | } | 372 | } |
| 265 | 373 | ||
| 266 | static int quota_getxquota(struct super_block *sb, int type, qid_t id, | 374 | static int quota_getxquota(struct super_block *sb, int type, qid_t id, |
| 267 | void __user *addr) | 375 | void __user *addr) |
| 268 | { | 376 | { |
| 269 | struct fs_disk_quota fdq; | 377 | struct fs_disk_quota fdq; |
| 378 | struct qc_dqblk qdq; | ||
| 270 | struct kqid qid; | 379 | struct kqid qid; |
| 271 | int ret; | 380 | int ret; |
| 272 | 381 | ||
| @@ -275,8 +384,11 @@ static int quota_getxquota(struct super_block *sb, int type, qid_t id, | |||
| 275 | qid = make_kqid(current_user_ns(), type, id); | 384 | qid = make_kqid(current_user_ns(), type, id); |
| 276 | if (!qid_valid(qid)) | 385 | if (!qid_valid(qid)) |
| 277 | return -EINVAL; | 386 | return -EINVAL; |
| 278 | ret = sb->s_qcop->get_dqblk(sb, qid, &fdq); | 387 | ret = sb->s_qcop->get_dqblk(sb, qid, &qdq); |
| 279 | if (!ret && copy_to_user(addr, &fdq, sizeof(fdq))) | 388 | if (ret) |
| 389 | return ret; | ||
| 390 | copy_to_xfs_dqblk(&fdq, &qdq, type, id); | ||
| 391 | if (copy_to_user(addr, &fdq, sizeof(fdq))) | ||
| 280 | return -EFAULT; | 392 | return -EFAULT; |
| 281 | return ret; | 393 | return ret; |
| 282 | } | 394 | } |
diff --git a/fs/udf/file.c b/fs/udf/file.c index bb15771b92ae..08f3555fbeac 100644 --- a/fs/udf/file.c +++ b/fs/udf/file.c | |||
| @@ -224,7 +224,7 @@ out: | |||
| 224 | static int udf_release_file(struct inode *inode, struct file *filp) | 224 | static int udf_release_file(struct inode *inode, struct file *filp) |
| 225 | { | 225 | { |
| 226 | if (filp->f_mode & FMODE_WRITE && | 226 | if (filp->f_mode & FMODE_WRITE && |
| 227 | atomic_read(&inode->i_writecount) > 1) { | 227 | atomic_read(&inode->i_writecount) == 1) { |
| 228 | /* | 228 | /* |
| 229 | * Grab i_mutex to avoid races with writes changing i_size | 229 | * Grab i_mutex to avoid races with writes changing i_size |
| 230 | * while we are running. | 230 | * while we are running. |
diff --git a/fs/xfs/xfs_qm.h b/fs/xfs/xfs_qm.h index 3a07a937e232..41f6c0b9d51c 100644 --- a/fs/xfs/xfs_qm.h +++ b/fs/xfs/xfs_qm.h | |||
| @@ -166,9 +166,9 @@ extern void xfs_qm_dqrele_all_inodes(struct xfs_mount *, uint); | |||
| 166 | /* quota ops */ | 166 | /* quota ops */ |
| 167 | extern int xfs_qm_scall_trunc_qfiles(struct xfs_mount *, uint); | 167 | extern int xfs_qm_scall_trunc_qfiles(struct xfs_mount *, uint); |
| 168 | extern int xfs_qm_scall_getquota(struct xfs_mount *, xfs_dqid_t, | 168 | extern int xfs_qm_scall_getquota(struct xfs_mount *, xfs_dqid_t, |
| 169 | uint, struct fs_disk_quota *); | 169 | uint, struct qc_dqblk *); |
| 170 | extern int xfs_qm_scall_setqlim(struct xfs_mount *, xfs_dqid_t, uint, | 170 | extern int xfs_qm_scall_setqlim(struct xfs_mount *, xfs_dqid_t, uint, |
| 171 | struct fs_disk_quota *); | 171 | struct qc_dqblk *); |
| 172 | extern int xfs_qm_scall_getqstat(struct xfs_mount *, | 172 | extern int xfs_qm_scall_getqstat(struct xfs_mount *, |
| 173 | struct fs_quota_stat *); | 173 | struct fs_quota_stat *); |
| 174 | extern int xfs_qm_scall_getqstatv(struct xfs_mount *, | 174 | extern int xfs_qm_scall_getqstatv(struct xfs_mount *, |
diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c index 74fca68e43b6..cb6168ec92c9 100644 --- a/fs/xfs/xfs_qm_syscalls.c +++ b/fs/xfs/xfs_qm_syscalls.c | |||
| @@ -39,7 +39,6 @@ STATIC int xfs_qm_log_quotaoff(xfs_mount_t *, xfs_qoff_logitem_t **, uint); | |||
| 39 | STATIC int xfs_qm_log_quotaoff_end(xfs_mount_t *, xfs_qoff_logitem_t *, | 39 | STATIC int xfs_qm_log_quotaoff_end(xfs_mount_t *, xfs_qoff_logitem_t *, |
| 40 | uint); | 40 | uint); |
| 41 | STATIC uint xfs_qm_export_flags(uint); | 41 | STATIC uint xfs_qm_export_flags(uint); |
| 42 | STATIC uint xfs_qm_export_qtype_flags(uint); | ||
| 43 | 42 | ||
| 44 | /* | 43 | /* |
| 45 | * Turn off quota accounting and/or enforcement for all udquots and/or | 44 | * Turn off quota accounting and/or enforcement for all udquots and/or |
| @@ -573,8 +572,8 @@ xfs_qm_scall_getqstatv( | |||
| 573 | return 0; | 572 | return 0; |
| 574 | } | 573 | } |
| 575 | 574 | ||
| 576 | #define XFS_DQ_MASK \ | 575 | #define XFS_QC_MASK \ |
| 577 | (FS_DQ_LIMIT_MASK | FS_DQ_TIMER_MASK | FS_DQ_WARNS_MASK) | 576 | (QC_LIMIT_MASK | QC_TIMER_MASK | QC_WARNS_MASK) |
| 578 | 577 | ||
| 579 | /* | 578 | /* |
| 580 | * Adjust quota limits, and start/stop timers accordingly. | 579 | * Adjust quota limits, and start/stop timers accordingly. |
| @@ -584,7 +583,7 @@ xfs_qm_scall_setqlim( | |||
| 584 | struct xfs_mount *mp, | 583 | struct xfs_mount *mp, |
| 585 | xfs_dqid_t id, | 584 | xfs_dqid_t id, |
| 586 | uint type, | 585 | uint type, |
| 587 | fs_disk_quota_t *newlim) | 586 | struct qc_dqblk *newlim) |
| 588 | { | 587 | { |
| 589 | struct xfs_quotainfo *q = mp->m_quotainfo; | 588 | struct xfs_quotainfo *q = mp->m_quotainfo; |
| 590 | struct xfs_disk_dquot *ddq; | 589 | struct xfs_disk_dquot *ddq; |
| @@ -593,9 +592,9 @@ xfs_qm_scall_setqlim( | |||
| 593 | int error; | 592 | int error; |
| 594 | xfs_qcnt_t hard, soft; | 593 | xfs_qcnt_t hard, soft; |
| 595 | 594 | ||
| 596 | if (newlim->d_fieldmask & ~XFS_DQ_MASK) | 595 | if (newlim->d_fieldmask & ~XFS_QC_MASK) |
| 597 | return -EINVAL; | 596 | return -EINVAL; |
| 598 | if ((newlim->d_fieldmask & XFS_DQ_MASK) == 0) | 597 | if ((newlim->d_fieldmask & XFS_QC_MASK) == 0) |
| 599 | return 0; | 598 | return 0; |
| 600 | 599 | ||
| 601 | /* | 600 | /* |
| @@ -633,11 +632,11 @@ xfs_qm_scall_setqlim( | |||
| 633 | /* | 632 | /* |
| 634 | * Make sure that hardlimits are >= soft limits before changing. | 633 | * Make sure that hardlimits are >= soft limits before changing. |
| 635 | */ | 634 | */ |
| 636 | hard = (newlim->d_fieldmask & FS_DQ_BHARD) ? | 635 | hard = (newlim->d_fieldmask & QC_SPC_HARD) ? |
| 637 | (xfs_qcnt_t) XFS_BB_TO_FSB(mp, newlim->d_blk_hardlimit) : | 636 | (xfs_qcnt_t) XFS_B_TO_FSB(mp, newlim->d_spc_hardlimit) : |
| 638 | be64_to_cpu(ddq->d_blk_hardlimit); | 637 | be64_to_cpu(ddq->d_blk_hardlimit); |
| 639 | soft = (newlim->d_fieldmask & FS_DQ_BSOFT) ? | 638 | soft = (newlim->d_fieldmask & QC_SPC_SOFT) ? |
| 640 | (xfs_qcnt_t) XFS_BB_TO_FSB(mp, newlim->d_blk_softlimit) : | 639 | (xfs_qcnt_t) XFS_B_TO_FSB(mp, newlim->d_spc_softlimit) : |
| 641 | be64_to_cpu(ddq->d_blk_softlimit); | 640 | be64_to_cpu(ddq->d_blk_softlimit); |
| 642 | if (hard == 0 || hard >= soft) { | 641 | if (hard == 0 || hard >= soft) { |
| 643 | ddq->d_blk_hardlimit = cpu_to_be64(hard); | 642 | ddq->d_blk_hardlimit = cpu_to_be64(hard); |
| @@ -650,11 +649,11 @@ xfs_qm_scall_setqlim( | |||
| 650 | } else { | 649 | } else { |
| 651 | xfs_debug(mp, "blkhard %Ld < blksoft %Ld", hard, soft); | 650 | xfs_debug(mp, "blkhard %Ld < blksoft %Ld", hard, soft); |
| 652 | } | 651 | } |
| 653 | hard = (newlim->d_fieldmask & FS_DQ_RTBHARD) ? | 652 | hard = (newlim->d_fieldmask & QC_RT_SPC_HARD) ? |
| 654 | (xfs_qcnt_t) XFS_BB_TO_FSB(mp, newlim->d_rtb_hardlimit) : | 653 | (xfs_qcnt_t) XFS_B_TO_FSB(mp, newlim->d_rt_spc_hardlimit) : |
| 655 | be64_to_cpu(ddq->d_rtb_hardlimit); | 654 | be64_to_cpu(ddq->d_rtb_hardlimit); |
| 656 | soft = (newlim->d_fieldmask & FS_DQ_RTBSOFT) ? | 655 | soft = (newlim->d_fieldmask & QC_RT_SPC_SOFT) ? |
| 657 | (xfs_qcnt_t) XFS_BB_TO_FSB(mp, newlim->d_rtb_softlimit) : | 656 | (xfs_qcnt_t) XFS_B_TO_FSB(mp, newlim->d_rt_spc_softlimit) : |
| 658 | be64_to_cpu(ddq->d_rtb_softlimit); | 657 | be64_to_cpu(ddq->d_rtb_softlimit); |
| 659 | if (hard == 0 || hard >= soft) { | 658 | if (hard == 0 || hard >= soft) { |
| 660 | ddq->d_rtb_hardlimit = cpu_to_be64(hard); | 659 | ddq->d_rtb_hardlimit = cpu_to_be64(hard); |
| @@ -667,10 +666,10 @@ xfs_qm_scall_setqlim( | |||
| 667 | xfs_debug(mp, "rtbhard %Ld < rtbsoft %Ld", hard, soft); | 666 | xfs_debug(mp, "rtbhard %Ld < rtbsoft %Ld", hard, soft); |
| 668 | } | 667 | } |
| 669 | 668 | ||
| 670 | hard = (newlim->d_fieldmask & FS_DQ_IHARD) ? | 669 | hard = (newlim->d_fieldmask & QC_INO_HARD) ? |
| 671 | (xfs_qcnt_t) newlim->d_ino_hardlimit : | 670 | (xfs_qcnt_t) newlim->d_ino_hardlimit : |
| 672 | be64_to_cpu(ddq->d_ino_hardlimit); | 671 | be64_to_cpu(ddq->d_ino_hardlimit); |
| 673 | soft = (newlim->d_fieldmask & FS_DQ_ISOFT) ? | 672 | soft = (newlim->d_fieldmask & QC_INO_SOFT) ? |
| 674 | (xfs_qcnt_t) newlim->d_ino_softlimit : | 673 | (xfs_qcnt_t) newlim->d_ino_softlimit : |
| 675 | be64_to_cpu(ddq->d_ino_softlimit); | 674 | be64_to_cpu(ddq->d_ino_softlimit); |
| 676 | if (hard == 0 || hard >= soft) { | 675 | if (hard == 0 || hard >= soft) { |
| @@ -687,12 +686,12 @@ xfs_qm_scall_setqlim( | |||
| 687 | /* | 686 | /* |
| 688 | * Update warnings counter(s) if requested | 687 | * Update warnings counter(s) if requested |
| 689 | */ | 688 | */ |
| 690 | if (newlim->d_fieldmask & FS_DQ_BWARNS) | 689 | if (newlim->d_fieldmask & QC_SPC_WARNS) |
| 691 | ddq->d_bwarns = cpu_to_be16(newlim->d_bwarns); | 690 | ddq->d_bwarns = cpu_to_be16(newlim->d_spc_warns); |
| 692 | if (newlim->d_fieldmask & FS_DQ_IWARNS) | 691 | if (newlim->d_fieldmask & QC_INO_WARNS) |
| 693 | ddq->d_iwarns = cpu_to_be16(newlim->d_iwarns); | 692 | ddq->d_iwarns = cpu_to_be16(newlim->d_ino_warns); |
| 694 | if (newlim->d_fieldmask & FS_DQ_RTBWARNS) | 693 | if (newlim->d_fieldmask & QC_RT_SPC_WARNS) |
| 695 | ddq->d_rtbwarns = cpu_to_be16(newlim->d_rtbwarns); | 694 | ddq->d_rtbwarns = cpu_to_be16(newlim->d_rt_spc_warns); |
| 696 | 695 | ||
| 697 | if (id == 0) { | 696 | if (id == 0) { |
| 698 | /* | 697 | /* |
| @@ -702,24 +701,24 @@ xfs_qm_scall_setqlim( | |||
| 702 | * soft and hard limit values (already done, above), and | 701 | * soft and hard limit values (already done, above), and |
| 703 | * for warnings. | 702 | * for warnings. |
| 704 | */ | 703 | */ |
| 705 | if (newlim->d_fieldmask & FS_DQ_BTIMER) { | 704 | if (newlim->d_fieldmask & QC_SPC_TIMER) { |
| 706 | q->qi_btimelimit = newlim->d_btimer; | 705 | q->qi_btimelimit = newlim->d_spc_timer; |
| 707 | ddq->d_btimer = cpu_to_be32(newlim->d_btimer); | 706 | ddq->d_btimer = cpu_to_be32(newlim->d_spc_timer); |
| 708 | } | 707 | } |
| 709 | if (newlim->d_fieldmask & FS_DQ_ITIMER) { | 708 | if (newlim->d_fieldmask & QC_INO_TIMER) { |
| 710 | q->qi_itimelimit = newlim->d_itimer; | 709 | q->qi_itimelimit = newlim->d_ino_timer; |
| 711 | ddq->d_itimer = cpu_to_be32(newlim->d_itimer); | 710 | ddq->d_itimer = cpu_to_be32(newlim->d_ino_timer); |
| 712 | } | 711 | } |
| 713 | if (newlim->d_fieldmask & FS_DQ_RTBTIMER) { | 712 | if (newlim->d_fieldmask & QC_RT_SPC_TIMER) { |
| 714 | q->qi_rtbtimelimit = newlim->d_rtbtimer; | 713 | q->qi_rtbtimelimit = newlim->d_rt_spc_timer; |
| 715 | ddq->d_rtbtimer = cpu_to_be32(newlim->d_rtbtimer); | 714 | ddq->d_rtbtimer = cpu_to_be32(newlim->d_rt_spc_timer); |
| 716 | } | 715 | } |
| 717 | if (newlim->d_fieldmask & FS_DQ_BWARNS) | 716 | if (newlim->d_fieldmask & QC_SPC_WARNS) |
| 718 | q->qi_bwarnlimit = newlim->d_bwarns; | 717 | q->qi_bwarnlimit = newlim->d_spc_warns; |
| 719 | if (newlim->d_fieldmask & FS_DQ_IWARNS) | 718 | if (newlim->d_fieldmask & QC_INO_WARNS) |
| 720 | q->qi_iwarnlimit = newlim->d_iwarns; | 719 | q->qi_iwarnlimit = newlim->d_ino_warns; |
| 721 | if (newlim->d_fieldmask & FS_DQ_RTBWARNS) | 720 | if (newlim->d_fieldmask & QC_RT_SPC_WARNS) |
| 722 | q->qi_rtbwarnlimit = newlim->d_rtbwarns; | 721 | q->qi_rtbwarnlimit = newlim->d_rt_spc_warns; |
| 723 | } else { | 722 | } else { |
| 724 | /* | 723 | /* |
| 725 | * If the user is now over quota, start the timelimit. | 724 | * If the user is now over quota, start the timelimit. |
| @@ -824,7 +823,7 @@ xfs_qm_scall_getquota( | |||
| 824 | struct xfs_mount *mp, | 823 | struct xfs_mount *mp, |
| 825 | xfs_dqid_t id, | 824 | xfs_dqid_t id, |
| 826 | uint type, | 825 | uint type, |
| 827 | struct fs_disk_quota *dst) | 826 | struct qc_dqblk *dst) |
| 828 | { | 827 | { |
| 829 | struct xfs_dquot *dqp; | 828 | struct xfs_dquot *dqp; |
| 830 | int error; | 829 | int error; |
| @@ -848,28 +847,25 @@ xfs_qm_scall_getquota( | |||
| 848 | } | 847 | } |
| 849 | 848 | ||
| 850 | memset(dst, 0, sizeof(*dst)); | 849 | memset(dst, 0, sizeof(*dst)); |
| 851 | dst->d_version = FS_DQUOT_VERSION; | 850 | dst->d_spc_hardlimit = |
| 852 | dst->d_flags = xfs_qm_export_qtype_flags(dqp->q_core.d_flags); | 851 | XFS_FSB_TO_B(mp, be64_to_cpu(dqp->q_core.d_blk_hardlimit)); |
| 853 | dst->d_id = be32_to_cpu(dqp->q_core.d_id); | 852 | dst->d_spc_softlimit = |
| 854 | dst->d_blk_hardlimit = | 853 | XFS_FSB_TO_B(mp, be64_to_cpu(dqp->q_core.d_blk_softlimit)); |
| 855 | XFS_FSB_TO_BB(mp, be64_to_cpu(dqp->q_core.d_blk_hardlimit)); | ||
| 856 | dst->d_blk_softlimit = | ||
| 857 | XFS_FSB_TO_BB(mp, be64_to_cpu(dqp->q_core.d_blk_softlimit)); | ||
| 858 | dst->d_ino_hardlimit = be64_to_cpu(dqp->q_core.d_ino_hardlimit); | 854 | dst->d_ino_hardlimit = be64_to_cpu(dqp->q_core.d_ino_hardlimit); |
| 859 | dst->d_ino_softlimit = be64_to_cpu(dqp->q_core.d_ino_softlimit); | 855 | dst->d_ino_softlimit = be64_to_cpu(dqp->q_core.d_ino_softlimit); |
| 860 | dst->d_bcount = XFS_FSB_TO_BB(mp, dqp->q_res_bcount); | 856 | dst->d_space = XFS_FSB_TO_B(mp, dqp->q_res_bcount); |
| 861 | dst->d_icount = dqp->q_res_icount; | 857 | dst->d_ino_count = dqp->q_res_icount; |
| 862 | dst->d_btimer = be32_to_cpu(dqp->q_core.d_btimer); | 858 | dst->d_spc_timer = be32_to_cpu(dqp->q_core.d_btimer); |
| 863 | dst->d_itimer = be32_to_cpu(dqp->q_core.d_itimer); | 859 | dst->d_ino_timer = be32_to_cpu(dqp->q_core.d_itimer); |
| 864 | dst->d_iwarns = be16_to_cpu(dqp->q_core.d_iwarns); | 860 | dst->d_ino_warns = be16_to_cpu(dqp->q_core.d_iwarns); |
| 865 | dst->d_bwarns = be16_to_cpu(dqp->q_core.d_bwarns); | 861 | dst->d_spc_warns = be16_to_cpu(dqp->q_core.d_bwarns); |
| 866 | dst->d_rtb_hardlimit = | 862 | dst->d_rt_spc_hardlimit = |
| 867 | XFS_FSB_TO_BB(mp, be64_to_cpu(dqp->q_core.d_rtb_hardlimit)); | 863 | XFS_FSB_TO_B(mp, be64_to_cpu(dqp->q_core.d_rtb_hardlimit)); |
| 868 | dst->d_rtb_softlimit = | 864 | dst->d_rt_spc_softlimit = |
| 869 | XFS_FSB_TO_BB(mp, be64_to_cpu(dqp->q_core.d_rtb_softlimit)); | 865 | XFS_FSB_TO_B(mp, be64_to_cpu(dqp->q_core.d_rtb_softlimit)); |
| 870 | dst->d_rtbcount = XFS_FSB_TO_BB(mp, dqp->q_res_rtbcount); | 866 | dst->d_rt_space = XFS_FSB_TO_B(mp, dqp->q_res_rtbcount); |
| 871 | dst->d_rtbtimer = be32_to_cpu(dqp->q_core.d_rtbtimer); | 867 | dst->d_rt_spc_timer = be32_to_cpu(dqp->q_core.d_rtbtimer); |
| 872 | dst->d_rtbwarns = be16_to_cpu(dqp->q_core.d_rtbwarns); | 868 | dst->d_rt_spc_warns = be16_to_cpu(dqp->q_core.d_rtbwarns); |
| 873 | 869 | ||
| 874 | /* | 870 | /* |
| 875 | * Internally, we don't reset all the timers when quota enforcement | 871 | * Internally, we don't reset all the timers when quota enforcement |
| @@ -882,23 +878,23 @@ xfs_qm_scall_getquota( | |||
| 882 | dqp->q_core.d_flags == XFS_DQ_GROUP) || | 878 | dqp->q_core.d_flags == XFS_DQ_GROUP) || |
| 883 | (!XFS_IS_PQUOTA_ENFORCED(mp) && | 879 | (!XFS_IS_PQUOTA_ENFORCED(mp) && |
| 884 | dqp->q_core.d_flags == XFS_DQ_PROJ)) { | 880 | dqp->q_core.d_flags == XFS_DQ_PROJ)) { |
| 885 | dst->d_btimer = 0; | 881 | dst->d_spc_timer = 0; |
| 886 | dst->d_itimer = 0; | 882 | dst->d_ino_timer = 0; |
| 887 | dst->d_rtbtimer = 0; | 883 | dst->d_rt_spc_timer = 0; |
| 888 | } | 884 | } |
| 889 | 885 | ||
| 890 | #ifdef DEBUG | 886 | #ifdef DEBUG |
| 891 | if (((XFS_IS_UQUOTA_ENFORCED(mp) && dst->d_flags == FS_USER_QUOTA) || | 887 | if (((XFS_IS_UQUOTA_ENFORCED(mp) && type == XFS_DQ_USER) || |
| 892 | (XFS_IS_GQUOTA_ENFORCED(mp) && dst->d_flags == FS_GROUP_QUOTA) || | 888 | (XFS_IS_GQUOTA_ENFORCED(mp) && type == XFS_DQ_GROUP) || |
| 893 | (XFS_IS_PQUOTA_ENFORCED(mp) && dst->d_flags == FS_PROJ_QUOTA)) && | 889 | (XFS_IS_PQUOTA_ENFORCED(mp) && type == XFS_DQ_PROJ)) && |
| 894 | dst->d_id != 0) { | 890 | id != 0) { |
| 895 | if ((dst->d_bcount > dst->d_blk_softlimit) && | 891 | if ((dst->d_space > dst->d_spc_softlimit) && |
| 896 | (dst->d_blk_softlimit > 0)) { | 892 | (dst->d_spc_softlimit > 0)) { |
| 897 | ASSERT(dst->d_btimer != 0); | 893 | ASSERT(dst->d_spc_timer != 0); |
| 898 | } | 894 | } |
| 899 | if ((dst->d_icount > dst->d_ino_softlimit) && | 895 | if ((dst->d_ino_count > dst->d_ino_softlimit) && |
| 900 | (dst->d_ino_softlimit > 0)) { | 896 | (dst->d_ino_softlimit > 0)) { |
| 901 | ASSERT(dst->d_itimer != 0); | 897 | ASSERT(dst->d_ino_timer != 0); |
| 902 | } | 898 | } |
| 903 | } | 899 | } |
| 904 | #endif | 900 | #endif |
| @@ -908,26 +904,6 @@ out_put: | |||
| 908 | } | 904 | } |
| 909 | 905 | ||
| 910 | STATIC uint | 906 | STATIC uint |
| 911 | xfs_qm_export_qtype_flags( | ||
| 912 | uint flags) | ||
| 913 | { | ||
| 914 | /* | ||
| 915 | * Can't be more than one, or none. | ||
| 916 | */ | ||
| 917 | ASSERT((flags & (FS_PROJ_QUOTA | FS_USER_QUOTA)) != | ||
| 918 | (FS_PROJ_QUOTA | FS_USER_QUOTA)); | ||
| 919 | ASSERT((flags & (FS_PROJ_QUOTA | FS_GROUP_QUOTA)) != | ||
| 920 | (FS_PROJ_QUOTA | FS_GROUP_QUOTA)); | ||
| 921 | ASSERT((flags & (FS_USER_QUOTA | FS_GROUP_QUOTA)) != | ||
| 922 | (FS_USER_QUOTA | FS_GROUP_QUOTA)); | ||
| 923 | ASSERT((flags & (FS_PROJ_QUOTA|FS_USER_QUOTA|FS_GROUP_QUOTA)) != 0); | ||
| 924 | |||
| 925 | return (flags & XFS_DQ_USER) ? | ||
| 926 | FS_USER_QUOTA : (flags & XFS_DQ_PROJ) ? | ||
| 927 | FS_PROJ_QUOTA : FS_GROUP_QUOTA; | ||
| 928 | } | ||
| 929 | |||
| 930 | STATIC uint | ||
| 931 | xfs_qm_export_flags( | 907 | xfs_qm_export_flags( |
| 932 | uint flags) | 908 | uint flags) |
| 933 | { | 909 | { |
diff --git a/fs/xfs/xfs_quotaops.c b/fs/xfs/xfs_quotaops.c index 7542bbeca6a1..801a84c1cdc3 100644 --- a/fs/xfs/xfs_quotaops.c +++ b/fs/xfs/xfs_quotaops.c | |||
| @@ -131,7 +131,7 @@ STATIC int | |||
| 131 | xfs_fs_get_dqblk( | 131 | xfs_fs_get_dqblk( |
| 132 | struct super_block *sb, | 132 | struct super_block *sb, |
| 133 | struct kqid qid, | 133 | struct kqid qid, |
| 134 | struct fs_disk_quota *fdq) | 134 | struct qc_dqblk *qdq) |
| 135 | { | 135 | { |
| 136 | struct xfs_mount *mp = XFS_M(sb); | 136 | struct xfs_mount *mp = XFS_M(sb); |
| 137 | 137 | ||
| @@ -141,14 +141,14 @@ xfs_fs_get_dqblk( | |||
| 141 | return -ESRCH; | 141 | return -ESRCH; |
| 142 | 142 | ||
| 143 | return xfs_qm_scall_getquota(mp, from_kqid(&init_user_ns, qid), | 143 | return xfs_qm_scall_getquota(mp, from_kqid(&init_user_ns, qid), |
| 144 | xfs_quota_type(qid.type), fdq); | 144 | xfs_quota_type(qid.type), qdq); |
| 145 | } | 145 | } |
| 146 | 146 | ||
| 147 | STATIC int | 147 | STATIC int |
| 148 | xfs_fs_set_dqblk( | 148 | xfs_fs_set_dqblk( |
| 149 | struct super_block *sb, | 149 | struct super_block *sb, |
| 150 | struct kqid qid, | 150 | struct kqid qid, |
| 151 | struct fs_disk_quota *fdq) | 151 | struct qc_dqblk *qdq) |
| 152 | { | 152 | { |
| 153 | struct xfs_mount *mp = XFS_M(sb); | 153 | struct xfs_mount *mp = XFS_M(sb); |
| 154 | 154 | ||
| @@ -160,7 +160,7 @@ xfs_fs_set_dqblk( | |||
| 160 | return -ESRCH; | 160 | return -ESRCH; |
| 161 | 161 | ||
| 162 | return xfs_qm_scall_setqlim(mp, from_kqid(&init_user_ns, qid), | 162 | return xfs_qm_scall_setqlim(mp, from_kqid(&init_user_ns, qid), |
| 163 | xfs_quota_type(qid.type), fdq); | 163 | xfs_quota_type(qid.type), qdq); |
| 164 | } | 164 | } |
| 165 | 165 | ||
| 166 | const struct quotactl_ops xfs_quotactl_operations = { | 166 | const struct quotactl_ops xfs_quotactl_operations = { |
diff --git a/include/acpi/processor.h b/include/acpi/processor.h index 3ca9b751f122..b95dc32a6e6b 100644 --- a/include/acpi/processor.h +++ b/include/acpi/processor.h | |||
| @@ -196,8 +196,8 @@ struct acpi_processor_flags { | |||
| 196 | struct acpi_processor { | 196 | struct acpi_processor { |
| 197 | acpi_handle handle; | 197 | acpi_handle handle; |
| 198 | u32 acpi_id; | 198 | u32 acpi_id; |
| 199 | u32 apic_id; | 199 | u32 phys_id; /* CPU hardware ID such as APIC ID for x86 */ |
| 200 | u32 id; | 200 | u32 id; /* CPU logical ID allocated by OS */ |
| 201 | u32 pblk; | 201 | u32 pblk; |
| 202 | int performance_platform_limit; | 202 | int performance_platform_limit; |
| 203 | int throttling_platform_limit; | 203 | int throttling_platform_limit; |
| @@ -310,8 +310,8 @@ static inline int acpi_processor_get_bios_limit(int cpu, unsigned int *limit) | |||
| 310 | #endif /* CONFIG_CPU_FREQ */ | 310 | #endif /* CONFIG_CPU_FREQ */ |
| 311 | 311 | ||
| 312 | /* in processor_core.c */ | 312 | /* in processor_core.c */ |
| 313 | int acpi_get_apicid(acpi_handle, int type, u32 acpi_id); | 313 | int acpi_get_phys_id(acpi_handle, int type, u32 acpi_id); |
| 314 | int acpi_map_cpuid(int apic_id, u32 acpi_id); | 314 | int acpi_map_cpuid(int phys_id, u32 acpi_id); |
| 315 | int acpi_get_cpuid(acpi_handle, int type, u32 acpi_id); | 315 | int acpi_get_cpuid(acpi_handle, int type, u32 acpi_id); |
| 316 | 316 | ||
| 317 | /* in processor_pdc.c */ | 317 | /* in processor_pdc.c */ |
diff --git a/include/asm-generic/tlb.h b/include/asm-generic/tlb.h index 08848050922e..db284bff29dc 100644 --- a/include/asm-generic/tlb.h +++ b/include/asm-generic/tlb.h | |||
| @@ -136,8 +136,12 @@ static inline void __tlb_adjust_range(struct mmu_gather *tlb, | |||
| 136 | 136 | ||
| 137 | static inline void __tlb_reset_range(struct mmu_gather *tlb) | 137 | static inline void __tlb_reset_range(struct mmu_gather *tlb) |
| 138 | { | 138 | { |
| 139 | tlb->start = TASK_SIZE; | 139 | if (tlb->fullmm) { |
| 140 | tlb->end = 0; | 140 | tlb->start = tlb->end = ~0; |
| 141 | } else { | ||
| 142 | tlb->start = TASK_SIZE; | ||
| 143 | tlb->end = 0; | ||
| 144 | } | ||
| 141 | } | 145 | } |
| 142 | 146 | ||
| 143 | /* | 147 | /* |
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/acpi.h b/include/linux/acpi.h index 856d381b1d5b..d459cd17b477 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h | |||
| @@ -147,8 +147,8 @@ void acpi_numa_arch_fixup(void); | |||
| 147 | 147 | ||
| 148 | #ifdef CONFIG_ACPI_HOTPLUG_CPU | 148 | #ifdef CONFIG_ACPI_HOTPLUG_CPU |
| 149 | /* Arch dependent functions for cpu hotplug support */ | 149 | /* Arch dependent functions for cpu hotplug support */ |
| 150 | int acpi_map_lsapic(acpi_handle handle, int physid, int *pcpu); | 150 | int acpi_map_cpu(acpi_handle handle, int physid, int *pcpu); |
| 151 | int acpi_unmap_lsapic(int cpu); | 151 | int acpi_unmap_cpu(int cpu); |
| 152 | #endif /* CONFIG_ACPI_HOTPLUG_CPU */ | 152 | #endif /* CONFIG_ACPI_HOTPLUG_CPU */ |
| 153 | 153 | ||
| 154 | int acpi_register_ioapic(acpi_handle handle, u64 phys_addr, u32 gsi_base); | 154 | int acpi_register_ioapic(acpi_handle handle, u64 phys_addr, u32 gsi_base); |
diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h index 8aded9ab2e4e..5735e7130d63 100644 --- a/include/linux/blk-mq.h +++ b/include/linux/blk-mq.h | |||
| @@ -34,7 +34,6 @@ struct blk_mq_hw_ctx { | |||
| 34 | unsigned long flags; /* BLK_MQ_F_* flags */ | 34 | unsigned long flags; /* BLK_MQ_F_* flags */ |
| 35 | 35 | ||
| 36 | struct request_queue *queue; | 36 | struct request_queue *queue; |
| 37 | unsigned int queue_num; | ||
| 38 | struct blk_flush_queue *fq; | 37 | struct blk_flush_queue *fq; |
| 39 | 38 | ||
| 40 | void *driver_data; | 39 | void *driver_data; |
| @@ -54,7 +53,7 @@ struct blk_mq_hw_ctx { | |||
| 54 | unsigned long dispatched[BLK_MQ_MAX_DISPATCH_ORDER]; | 53 | unsigned long dispatched[BLK_MQ_MAX_DISPATCH_ORDER]; |
| 55 | 54 | ||
| 56 | unsigned int numa_node; | 55 | unsigned int numa_node; |
| 57 | unsigned int cmd_size; /* per-request extra data */ | 56 | unsigned int queue_num; |
| 58 | 57 | ||
| 59 | atomic_t nr_active; | 58 | atomic_t nr_active; |
| 60 | 59 | ||
| @@ -195,13 +194,16 @@ static inline u16 blk_mq_unique_tag_to_tag(u32 unique_tag) | |||
| 195 | struct blk_mq_hw_ctx *blk_mq_map_queue(struct request_queue *, const int ctx_index); | 194 | struct blk_mq_hw_ctx *blk_mq_map_queue(struct request_queue *, const int ctx_index); |
| 196 | struct blk_mq_hw_ctx *blk_mq_alloc_single_hw_queue(struct blk_mq_tag_set *, unsigned int, int); | 195 | struct blk_mq_hw_ctx *blk_mq_alloc_single_hw_queue(struct blk_mq_tag_set *, unsigned int, int); |
| 197 | 196 | ||
| 197 | int blk_mq_request_started(struct request *rq); | ||
| 198 | void blk_mq_start_request(struct request *rq); | 198 | void blk_mq_start_request(struct request *rq); |
| 199 | void blk_mq_end_request(struct request *rq, int error); | 199 | void blk_mq_end_request(struct request *rq, int error); |
| 200 | void __blk_mq_end_request(struct request *rq, int error); | 200 | void __blk_mq_end_request(struct request *rq, int error); |
| 201 | 201 | ||
| 202 | void blk_mq_requeue_request(struct request *rq); | 202 | void blk_mq_requeue_request(struct request *rq); |
| 203 | void blk_mq_add_to_requeue_list(struct request *rq, bool at_head); | 203 | void blk_mq_add_to_requeue_list(struct request *rq, bool at_head); |
| 204 | void blk_mq_cancel_requeue_work(struct request_queue *q); | ||
| 204 | void blk_mq_kick_requeue_list(struct request_queue *q); | 205 | void blk_mq_kick_requeue_list(struct request_queue *q); |
| 206 | void blk_mq_abort_requeue_list(struct request_queue *q); | ||
| 205 | void blk_mq_complete_request(struct request *rq); | 207 | void blk_mq_complete_request(struct request *rq); |
| 206 | 208 | ||
| 207 | void blk_mq_stop_hw_queue(struct blk_mq_hw_ctx *hctx); | 209 | void blk_mq_stop_hw_queue(struct blk_mq_hw_ctx *hctx); |
| @@ -212,6 +214,8 @@ void blk_mq_start_stopped_hw_queues(struct request_queue *q, bool async); | |||
| 212 | void blk_mq_delay_queue(struct blk_mq_hw_ctx *hctx, unsigned long msecs); | 214 | void blk_mq_delay_queue(struct blk_mq_hw_ctx *hctx, unsigned long msecs); |
| 213 | void blk_mq_tag_busy_iter(struct blk_mq_hw_ctx *hctx, busy_iter_fn *fn, | 215 | void blk_mq_tag_busy_iter(struct blk_mq_hw_ctx *hctx, busy_iter_fn *fn, |
| 214 | void *priv); | 216 | void *priv); |
| 217 | void blk_mq_unfreeze_queue(struct request_queue *q); | ||
| 218 | void blk_mq_freeze_queue_start(struct request_queue *q); | ||
| 215 | 219 | ||
| 216 | /* | 220 | /* |
| 217 | * Driver command data is immediately after the request. So subtract request | 221 | * Driver command data is immediately after the request. So subtract request |
diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h index 445d59231bc4..c294e3e25e37 100644 --- a/include/linux/blk_types.h +++ b/include/linux/blk_types.h | |||
| @@ -190,6 +190,7 @@ enum rq_flag_bits { | |||
| 190 | __REQ_PM, /* runtime pm request */ | 190 | __REQ_PM, /* runtime pm request */ |
| 191 | __REQ_HASHED, /* on IO scheduler merge hash */ | 191 | __REQ_HASHED, /* on IO scheduler merge hash */ |
| 192 | __REQ_MQ_INFLIGHT, /* track inflight for MQ */ | 192 | __REQ_MQ_INFLIGHT, /* track inflight for MQ */ |
| 193 | __REQ_NO_TIMEOUT, /* requests may never expire */ | ||
| 193 | __REQ_NR_BITS, /* stops here */ | 194 | __REQ_NR_BITS, /* stops here */ |
| 194 | }; | 195 | }; |
| 195 | 196 | ||
| @@ -243,5 +244,6 @@ enum rq_flag_bits { | |||
| 243 | #define REQ_PM (1ULL << __REQ_PM) | 244 | #define REQ_PM (1ULL << __REQ_PM) |
| 244 | #define REQ_HASHED (1ULL << __REQ_HASHED) | 245 | #define REQ_HASHED (1ULL << __REQ_HASHED) |
| 245 | #define REQ_MQ_INFLIGHT (1ULL << __REQ_MQ_INFLIGHT) | 246 | #define REQ_MQ_INFLIGHT (1ULL << __REQ_MQ_INFLIGHT) |
| 247 | #define REQ_NO_TIMEOUT (1ULL << __REQ_NO_TIMEOUT) | ||
| 246 | 248 | ||
| 247 | #endif /* __LINUX_BLK_TYPES_H */ | 249 | #endif /* __LINUX_BLK_TYPES_H */ |
diff --git a/include/linux/ceph/osd_client.h b/include/linux/ceph/osd_client.h index 5d86416d35f2..61b19c46bdb3 100644 --- a/include/linux/ceph/osd_client.h +++ b/include/linux/ceph/osd_client.h | |||
| @@ -87,8 +87,8 @@ struct ceph_osd_req_op { | |||
| 87 | struct ceph_osd_data osd_data; | 87 | struct ceph_osd_data osd_data; |
| 88 | } extent; | 88 | } extent; |
| 89 | struct { | 89 | struct { |
| 90 | __le32 name_len; | 90 | u32 name_len; |
| 91 | __le32 value_len; | 91 | u32 value_len; |
| 92 | __u8 cmp_op; /* CEPH_OSD_CMPXATTR_OP_* */ | 92 | __u8 cmp_op; /* CEPH_OSD_CMPXATTR_OP_* */ |
| 93 | __u8 cmp_mode; /* CEPH_OSD_CMPXATTR_MODE_* */ | 93 | __u8 cmp_mode; /* CEPH_OSD_CMPXATTR_MODE_* */ |
| 94 | struct ceph_osd_data osd_data; | 94 | struct ceph_osd_data osd_data; |
diff --git a/include/linux/compiler.h b/include/linux/compiler.h index a1c81f80978e..33063f872ee3 100644 --- a/include/linux/compiler.h +++ b/include/linux/compiler.h | |||
| @@ -215,7 +215,7 @@ static __always_inline void __read_once_size(volatile void *p, void *res, int si | |||
| 215 | } | 215 | } |
| 216 | } | 216 | } |
| 217 | 217 | ||
| 218 | static __always_inline void __assign_once_size(volatile void *p, void *res, int size) | 218 | static __always_inline void __write_once_size(volatile void *p, void *res, int size) |
| 219 | { | 219 | { |
| 220 | switch (size) { | 220 | switch (size) { |
| 221 | case 1: *(volatile __u8 *)p = *(__u8 *)res; break; | 221 | case 1: *(volatile __u8 *)p = *(__u8 *)res; break; |
| @@ -235,15 +235,15 @@ static __always_inline void __assign_once_size(volatile void *p, void *res, int | |||
| 235 | /* | 235 | /* |
| 236 | * Prevent the compiler from merging or refetching reads or writes. The | 236 | * Prevent the compiler from merging or refetching reads or writes. The |
| 237 | * compiler is also forbidden from reordering successive instances of | 237 | * compiler is also forbidden from reordering successive instances of |
| 238 | * READ_ONCE, ASSIGN_ONCE and ACCESS_ONCE (see below), but only when the | 238 | * READ_ONCE, WRITE_ONCE and ACCESS_ONCE (see below), but only when the |
| 239 | * compiler is aware of some particular ordering. One way to make the | 239 | * compiler is aware of some particular ordering. One way to make the |
| 240 | * compiler aware of ordering is to put the two invocations of READ_ONCE, | 240 | * compiler aware of ordering is to put the two invocations of READ_ONCE, |
| 241 | * ASSIGN_ONCE or ACCESS_ONCE() in different C statements. | 241 | * WRITE_ONCE or ACCESS_ONCE() in different C statements. |
| 242 | * | 242 | * |
| 243 | * In contrast to ACCESS_ONCE these two macros will also work on aggregate | 243 | * In contrast to ACCESS_ONCE these two macros will also work on aggregate |
| 244 | * data types like structs or unions. If the size of the accessed data | 244 | * data types like structs or unions. If the size of the accessed data |
| 245 | * type exceeds the word size of the machine (e.g., 32 bits or 64 bits) | 245 | * type exceeds the word size of the machine (e.g., 32 bits or 64 bits) |
| 246 | * READ_ONCE() and ASSIGN_ONCE() will fall back to memcpy and print a | 246 | * READ_ONCE() and WRITE_ONCE() will fall back to memcpy and print a |
| 247 | * compile-time warning. | 247 | * compile-time warning. |
| 248 | * | 248 | * |
| 249 | * Their two major use cases are: (1) Mediating communication between | 249 | * Their two major use cases are: (1) Mediating communication between |
| @@ -257,8 +257,8 @@ static __always_inline void __assign_once_size(volatile void *p, void *res, int | |||
| 257 | #define READ_ONCE(x) \ | 257 | #define READ_ONCE(x) \ |
| 258 | ({ typeof(x) __val; __read_once_size(&x, &__val, sizeof(__val)); __val; }) | 258 | ({ typeof(x) __val; __read_once_size(&x, &__val, sizeof(__val)); __val; }) |
| 259 | 259 | ||
| 260 | #define ASSIGN_ONCE(val, x) \ | 260 | #define WRITE_ONCE(x, val) \ |
| 261 | ({ typeof(x) __val; __val = val; __assign_once_size(&x, &__val, sizeof(__val)); __val; }) | 261 | ({ typeof(x) __val; __val = val; __write_once_size(&x, &__val, sizeof(__val)); __val; }) |
| 262 | 262 | ||
| 263 | #endif /* __KERNEL__ */ | 263 | #endif /* __KERNEL__ */ |
| 264 | 264 | ||
diff --git a/include/linux/fs.h b/include/linux/fs.h index f90c0282c114..42efe13077b6 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
| @@ -135,7 +135,7 @@ typedef void (dio_iodone_t)(struct kiocb *iocb, loff_t offset, | |||
| 135 | #define FMODE_CAN_WRITE ((__force fmode_t)0x40000) | 135 | #define FMODE_CAN_WRITE ((__force fmode_t)0x40000) |
| 136 | 136 | ||
| 137 | /* File was opened by fanotify and shouldn't generate fanotify events */ | 137 | /* File was opened by fanotify and shouldn't generate fanotify events */ |
| 138 | #define FMODE_NONOTIFY ((__force fmode_t)0x1000000) | 138 | #define FMODE_NONOTIFY ((__force fmode_t)0x4000000) |
| 139 | 139 | ||
| 140 | /* | 140 | /* |
| 141 | * Flag for rw_copy_check_uvector and compat_rw_copy_check_uvector | 141 | * Flag for rw_copy_check_uvector and compat_rw_copy_check_uvector |
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/i2c.h b/include/linux/i2c.h index e3a1721c8354..7c7695940ddd 100644 --- a/include/linux/i2c.h +++ b/include/linux/i2c.h | |||
| @@ -228,7 +228,9 @@ struct i2c_client { | |||
| 228 | struct device dev; /* the device structure */ | 228 | struct device dev; /* the device structure */ |
| 229 | int irq; /* irq issued by device */ | 229 | int irq; /* irq issued by device */ |
| 230 | struct list_head detected; | 230 | struct list_head detected; |
| 231 | #if IS_ENABLED(CONFIG_I2C_SLAVE) | ||
| 231 | i2c_slave_cb_t slave_cb; /* callback for slave mode */ | 232 | i2c_slave_cb_t slave_cb; /* callback for slave mode */ |
| 233 | #endif | ||
| 232 | }; | 234 | }; |
| 233 | #define to_i2c_client(d) container_of(d, struct i2c_client, dev) | 235 | #define to_i2c_client(d) container_of(d, struct i2c_client, dev) |
| 234 | 236 | ||
| @@ -253,6 +255,7 @@ static inline void i2c_set_clientdata(struct i2c_client *dev, void *data) | |||
| 253 | 255 | ||
| 254 | /* I2C slave support */ | 256 | /* I2C slave support */ |
| 255 | 257 | ||
| 258 | #if IS_ENABLED(CONFIG_I2C_SLAVE) | ||
| 256 | enum i2c_slave_event { | 259 | enum i2c_slave_event { |
| 257 | I2C_SLAVE_REQ_READ_START, | 260 | I2C_SLAVE_REQ_READ_START, |
| 258 | I2C_SLAVE_REQ_READ_END, | 261 | I2C_SLAVE_REQ_READ_END, |
| @@ -269,6 +272,7 @@ static inline int i2c_slave_event(struct i2c_client *client, | |||
| 269 | { | 272 | { |
| 270 | return client->slave_cb(client, event, val); | 273 | return client->slave_cb(client, event, val); |
| 271 | } | 274 | } |
| 275 | #endif | ||
| 272 | 276 | ||
| 273 | /** | 277 | /** |
| 274 | * struct i2c_board_info - template for device creation | 278 | * struct i2c_board_info - template for device creation |
| @@ -404,8 +408,10 @@ struct i2c_algorithm { | |||
| 404 | /* To determine what the adapter supports */ | 408 | /* To determine what the adapter supports */ |
| 405 | u32 (*functionality) (struct i2c_adapter *); | 409 | u32 (*functionality) (struct i2c_adapter *); |
| 406 | 410 | ||
| 411 | #if IS_ENABLED(CONFIG_I2C_SLAVE) | ||
| 407 | int (*reg_slave)(struct i2c_client *client); | 412 | int (*reg_slave)(struct i2c_client *client); |
| 408 | int (*unreg_slave)(struct i2c_client *client); | 413 | int (*unreg_slave)(struct i2c_client *client); |
| 414 | #endif | ||
| 409 | }; | 415 | }; |
| 410 | 416 | ||
| 411 | /** | 417 | /** |
diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h index 515a35e2a48a..960e666c51e4 100644 --- a/include/linux/if_vlan.h +++ b/include/linux/if_vlan.h | |||
| @@ -472,27 +472,59 @@ static inline int vlan_get_tag(const struct sk_buff *skb, u16 *vlan_tci) | |||
| 472 | /** | 472 | /** |
| 473 | * vlan_get_protocol - get protocol EtherType. | 473 | * vlan_get_protocol - get protocol EtherType. |
| 474 | * @skb: skbuff to query | 474 | * @skb: skbuff to query |
| 475 | * @type: first vlan protocol | ||
| 476 | * @depth: buffer to store length of eth and vlan tags in bytes | ||
| 475 | * | 477 | * |
| 476 | * Returns the EtherType of the packet, regardless of whether it is | 478 | * Returns the EtherType of the packet, regardless of whether it is |
| 477 | * vlan encapsulated (normal or hardware accelerated) or not. | 479 | * vlan encapsulated (normal or hardware accelerated) or not. |
| 478 | */ | 480 | */ |
| 479 | static inline __be16 vlan_get_protocol(const struct sk_buff *skb) | 481 | static inline __be16 __vlan_get_protocol(struct sk_buff *skb, __be16 type, |
| 482 | int *depth) | ||
| 480 | { | 483 | { |
| 481 | __be16 protocol = 0; | 484 | unsigned int vlan_depth = skb->mac_len; |
| 482 | 485 | ||
| 483 | if (vlan_tx_tag_present(skb) || | 486 | /* if type is 802.1Q/AD then the header should already be |
| 484 | skb->protocol != cpu_to_be16(ETH_P_8021Q)) | 487 | * present at mac_len - VLAN_HLEN (if mac_len > 0), or at |
| 485 | protocol = skb->protocol; | 488 | * ETH_HLEN otherwise |
| 486 | else { | 489 | */ |
| 487 | __be16 proto, *protop; | 490 | if (type == htons(ETH_P_8021Q) || type == htons(ETH_P_8021AD)) { |
| 488 | protop = skb_header_pointer(skb, offsetof(struct vlan_ethhdr, | 491 | if (vlan_depth) { |
| 489 | h_vlan_encapsulated_proto), | 492 | if (WARN_ON(vlan_depth < VLAN_HLEN)) |
| 490 | sizeof(proto), &proto); | 493 | return 0; |
| 491 | if (likely(protop)) | 494 | vlan_depth -= VLAN_HLEN; |
| 492 | protocol = *protop; | 495 | } else { |
| 496 | vlan_depth = ETH_HLEN; | ||
| 497 | } | ||
| 498 | do { | ||
| 499 | struct vlan_hdr *vh; | ||
| 500 | |||
| 501 | if (unlikely(!pskb_may_pull(skb, | ||
| 502 | vlan_depth + VLAN_HLEN))) | ||
| 503 | return 0; | ||
| 504 | |||
| 505 | vh = (struct vlan_hdr *)(skb->data + vlan_depth); | ||
| 506 | type = vh->h_vlan_encapsulated_proto; | ||
| 507 | vlan_depth += VLAN_HLEN; | ||
| 508 | } while (type == htons(ETH_P_8021Q) || | ||
| 509 | type == htons(ETH_P_8021AD)); | ||
| 493 | } | 510 | } |
| 494 | 511 | ||
| 495 | return protocol; | 512 | if (depth) |
| 513 | *depth = vlan_depth; | ||
| 514 | |||
| 515 | return type; | ||
| 516 | } | ||
| 517 | |||
| 518 | /** | ||
| 519 | * vlan_get_protocol - get protocol EtherType. | ||
| 520 | * @skb: skbuff to query | ||
| 521 | * | ||
| 522 | * Returns the EtherType of the packet, regardless of whether it is | ||
| 523 | * vlan encapsulated (normal or hardware accelerated) or not. | ||
| 524 | */ | ||
| 525 | static inline __be16 vlan_get_protocol(struct sk_buff *skb) | ||
| 526 | { | ||
| 527 | return __vlan_get_protocol(skb, skb->protocol, NULL); | ||
| 496 | } | 528 | } |
| 497 | 529 | ||
| 498 | static inline void vlan_set_encap_proto(struct sk_buff *skb, | 530 | static inline void vlan_set_encap_proto(struct sk_buff *skb, |
diff --git a/include/linux/kdb.h b/include/linux/kdb.h index 290db1269c4c..75ae2e2631fc 100644 --- a/include/linux/kdb.h +++ b/include/linux/kdb.h | |||
| @@ -13,11 +13,54 @@ | |||
| 13 | * Copyright (C) 2009 Jason Wessel <jason.wessel@windriver.com> | 13 | * Copyright (C) 2009 Jason Wessel <jason.wessel@windriver.com> |
| 14 | */ | 14 | */ |
| 15 | 15 | ||
| 16 | /* Shifted versions of the command enable bits are be used if the command | ||
| 17 | * has no arguments (see kdb_check_flags). This allows commands, such as | ||
| 18 | * go, to have different permissions depending upon whether it is called | ||
| 19 | * with an argument. | ||
| 20 | */ | ||
| 21 | #define KDB_ENABLE_NO_ARGS_SHIFT 10 | ||
| 22 | |||
| 16 | typedef enum { | 23 | typedef enum { |
| 17 | KDB_REPEAT_NONE = 0, /* Do not repeat this command */ | 24 | KDB_ENABLE_ALL = (1 << 0), /* Enable everything */ |
| 18 | KDB_REPEAT_NO_ARGS, /* Repeat the command without arguments */ | 25 | KDB_ENABLE_MEM_READ = (1 << 1), |
| 19 | KDB_REPEAT_WITH_ARGS, /* Repeat the command including its arguments */ | 26 | KDB_ENABLE_MEM_WRITE = (1 << 2), |
| 20 | } kdb_repeat_t; | 27 | KDB_ENABLE_REG_READ = (1 << 3), |
| 28 | KDB_ENABLE_REG_WRITE = (1 << 4), | ||
| 29 | KDB_ENABLE_INSPECT = (1 << 5), | ||
| 30 | KDB_ENABLE_FLOW_CTRL = (1 << 6), | ||
| 31 | KDB_ENABLE_SIGNAL = (1 << 7), | ||
| 32 | KDB_ENABLE_REBOOT = (1 << 8), | ||
| 33 | /* User exposed values stop here, all remaining flags are | ||
| 34 | * exclusively used to describe a commands behaviour. | ||
| 35 | */ | ||
| 36 | |||
| 37 | KDB_ENABLE_ALWAYS_SAFE = (1 << 9), | ||
| 38 | KDB_ENABLE_MASK = (1 << KDB_ENABLE_NO_ARGS_SHIFT) - 1, | ||
| 39 | |||
| 40 | KDB_ENABLE_ALL_NO_ARGS = KDB_ENABLE_ALL << KDB_ENABLE_NO_ARGS_SHIFT, | ||
| 41 | KDB_ENABLE_MEM_READ_NO_ARGS = KDB_ENABLE_MEM_READ | ||
| 42 | << KDB_ENABLE_NO_ARGS_SHIFT, | ||
| 43 | KDB_ENABLE_MEM_WRITE_NO_ARGS = KDB_ENABLE_MEM_WRITE | ||
| 44 | << KDB_ENABLE_NO_ARGS_SHIFT, | ||
| 45 | KDB_ENABLE_REG_READ_NO_ARGS = KDB_ENABLE_REG_READ | ||
| 46 | << KDB_ENABLE_NO_ARGS_SHIFT, | ||
| 47 | KDB_ENABLE_REG_WRITE_NO_ARGS = KDB_ENABLE_REG_WRITE | ||
| 48 | << KDB_ENABLE_NO_ARGS_SHIFT, | ||
| 49 | KDB_ENABLE_INSPECT_NO_ARGS = KDB_ENABLE_INSPECT | ||
| 50 | << KDB_ENABLE_NO_ARGS_SHIFT, | ||
| 51 | KDB_ENABLE_FLOW_CTRL_NO_ARGS = KDB_ENABLE_FLOW_CTRL | ||
| 52 | << KDB_ENABLE_NO_ARGS_SHIFT, | ||
| 53 | KDB_ENABLE_SIGNAL_NO_ARGS = KDB_ENABLE_SIGNAL | ||
| 54 | << KDB_ENABLE_NO_ARGS_SHIFT, | ||
| 55 | KDB_ENABLE_REBOOT_NO_ARGS = KDB_ENABLE_REBOOT | ||
| 56 | << KDB_ENABLE_NO_ARGS_SHIFT, | ||
| 57 | KDB_ENABLE_ALWAYS_SAFE_NO_ARGS = KDB_ENABLE_ALWAYS_SAFE | ||
| 58 | << KDB_ENABLE_NO_ARGS_SHIFT, | ||
| 59 | KDB_ENABLE_MASK_NO_ARGS = KDB_ENABLE_MASK << KDB_ENABLE_NO_ARGS_SHIFT, | ||
| 60 | |||
| 61 | KDB_REPEAT_NO_ARGS = 0x40000000, /* Repeat the command w/o arguments */ | ||
| 62 | KDB_REPEAT_WITH_ARGS = 0x80000000, /* Repeat the command with args */ | ||
| 63 | } kdb_cmdflags_t; | ||
| 21 | 64 | ||
| 22 | typedef int (*kdb_func_t)(int, const char **); | 65 | typedef int (*kdb_func_t)(int, const char **); |
| 23 | 66 | ||
| @@ -62,6 +105,7 @@ extern atomic_t kdb_event; | |||
| 62 | #define KDB_BADLENGTH (-19) | 105 | #define KDB_BADLENGTH (-19) |
| 63 | #define KDB_NOBP (-20) | 106 | #define KDB_NOBP (-20) |
| 64 | #define KDB_BADADDR (-21) | 107 | #define KDB_BADADDR (-21) |
| 108 | #define KDB_NOPERM (-22) | ||
| 65 | 109 | ||
| 66 | /* | 110 | /* |
| 67 | * kdb_diemsg | 111 | * kdb_diemsg |
| @@ -146,17 +190,17 @@ static inline const char *kdb_walk_kallsyms(loff_t *pos) | |||
| 146 | 190 | ||
| 147 | /* Dynamic kdb shell command registration */ | 191 | /* Dynamic kdb shell command registration */ |
| 148 | extern int kdb_register(char *, kdb_func_t, char *, char *, short); | 192 | extern int kdb_register(char *, kdb_func_t, char *, char *, short); |
| 149 | extern int kdb_register_repeat(char *, kdb_func_t, char *, char *, | 193 | extern int kdb_register_flags(char *, kdb_func_t, char *, char *, |
| 150 | short, kdb_repeat_t); | 194 | short, kdb_cmdflags_t); |
| 151 | extern int kdb_unregister(char *); | 195 | extern int kdb_unregister(char *); |
| 152 | #else /* ! CONFIG_KGDB_KDB */ | 196 | #else /* ! CONFIG_KGDB_KDB */ |
| 153 | static inline __printf(1, 2) int kdb_printf(const char *fmt, ...) { return 0; } | 197 | static inline __printf(1, 2) int kdb_printf(const char *fmt, ...) { return 0; } |
| 154 | static inline void kdb_init(int level) {} | 198 | static inline void kdb_init(int level) {} |
| 155 | static inline int kdb_register(char *cmd, kdb_func_t func, char *usage, | 199 | static inline int kdb_register(char *cmd, kdb_func_t func, char *usage, |
| 156 | char *help, short minlen) { return 0; } | 200 | char *help, short minlen) { return 0; } |
| 157 | static inline int kdb_register_repeat(char *cmd, kdb_func_t func, char *usage, | 201 | static inline int kdb_register_flags(char *cmd, kdb_func_t func, char *usage, |
| 158 | char *help, short minlen, | 202 | char *help, short minlen, |
| 159 | kdb_repeat_t repeat) { return 0; } | 203 | kdb_cmdflags_t flags) { return 0; } |
| 160 | static inline int kdb_unregister(char *cmd) { return 0; } | 204 | static inline int kdb_unregister(char *cmd) { return 0; } |
| 161 | #endif /* CONFIG_KGDB_KDB */ | 205 | #endif /* CONFIG_KGDB_KDB */ |
| 162 | enum { | 206 | enum { |
diff --git a/include/linux/kernel.h b/include/linux/kernel.h index 5449d2f4a1ef..64ce58bee6f5 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h | |||
| @@ -176,7 +176,7 @@ extern int _cond_resched(void); | |||
| 176 | */ | 176 | */ |
| 177 | # define might_sleep() \ | 177 | # define might_sleep() \ |
| 178 | do { __might_sleep(__FILE__, __LINE__, 0); might_resched(); } while (0) | 178 | do { __might_sleep(__FILE__, __LINE__, 0); might_resched(); } while (0) |
| 179 | # define sched_annotate_sleep() __set_current_state(TASK_RUNNING) | 179 | # define sched_annotate_sleep() (current->task_state_change = 0) |
| 180 | #else | 180 | #else |
| 181 | static inline void ___might_sleep(const char *file, int line, | 181 | static inline void ___might_sleep(const char *file, int line, |
| 182 | int preempt_offset) { } | 182 | int preempt_offset) { } |
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/mlx4/device.h b/include/linux/mlx4/device.h index 25c791e295fd..5f3a9aa7225d 100644 --- a/include/linux/mlx4/device.h +++ b/include/linux/mlx4/device.h | |||
| @@ -97,7 +97,7 @@ enum { | |||
| 97 | MLX4_MAX_NUM_PF = 16, | 97 | MLX4_MAX_NUM_PF = 16, |
| 98 | MLX4_MAX_NUM_VF = 126, | 98 | MLX4_MAX_NUM_VF = 126, |
| 99 | MLX4_MAX_NUM_VF_P_PORT = 64, | 99 | MLX4_MAX_NUM_VF_P_PORT = 64, |
| 100 | MLX4_MFUNC_MAX = 80, | 100 | MLX4_MFUNC_MAX = 128, |
| 101 | MLX4_MAX_EQ_NUM = 1024, | 101 | MLX4_MAX_EQ_NUM = 1024, |
| 102 | MLX4_MFUNC_EQ_NUM = 4, | 102 | MLX4_MFUNC_EQ_NUM = 4, |
| 103 | MLX4_MFUNC_MAX_EQES = 8, | 103 | MLX4_MFUNC_MAX_EQES = 8, |
diff --git a/include/linux/mm.h b/include/linux/mm.h index f80d0194c9bc..dd5ea3016fc4 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
| @@ -1070,6 +1070,7 @@ static inline int page_mapped(struct page *page) | |||
| 1070 | #define VM_FAULT_WRITE 0x0008 /* Special case for get_user_pages */ | 1070 | #define VM_FAULT_WRITE 0x0008 /* Special case for get_user_pages */ |
| 1071 | #define VM_FAULT_HWPOISON 0x0010 /* Hit poisoned small page */ | 1071 | #define VM_FAULT_HWPOISON 0x0010 /* Hit poisoned small page */ |
| 1072 | #define VM_FAULT_HWPOISON_LARGE 0x0020 /* Hit poisoned large page. Index encoded in upper bits */ | 1072 | #define VM_FAULT_HWPOISON_LARGE 0x0020 /* Hit poisoned large page. Index encoded in upper bits */ |
| 1073 | #define VM_FAULT_SIGSEGV 0x0040 | ||
| 1073 | 1074 | ||
| 1074 | #define VM_FAULT_NOPAGE 0x0100 /* ->fault installed the pte, not return page */ | 1075 | #define VM_FAULT_NOPAGE 0x0100 /* ->fault installed the pte, not return page */ |
| 1075 | #define VM_FAULT_LOCKED 0x0200 /* ->fault locked the returned page */ | 1076 | #define VM_FAULT_LOCKED 0x0200 /* ->fault locked the returned page */ |
| @@ -1078,8 +1079,9 @@ static inline int page_mapped(struct page *page) | |||
| 1078 | 1079 | ||
| 1079 | #define VM_FAULT_HWPOISON_LARGE_MASK 0xf000 /* encodes hpage index for large hwpoison */ | 1080 | #define VM_FAULT_HWPOISON_LARGE_MASK 0xf000 /* encodes hpage index for large hwpoison */ |
| 1080 | 1081 | ||
| 1081 | #define VM_FAULT_ERROR (VM_FAULT_OOM | VM_FAULT_SIGBUS | VM_FAULT_HWPOISON | \ | 1082 | #define VM_FAULT_ERROR (VM_FAULT_OOM | VM_FAULT_SIGBUS | VM_FAULT_SIGSEGV | \ |
| 1082 | VM_FAULT_FALLBACK | VM_FAULT_HWPOISON_LARGE) | 1083 | VM_FAULT_HWPOISON | VM_FAULT_HWPOISON_LARGE | \ |
| 1084 | VM_FAULT_FALLBACK) | ||
| 1083 | 1085 | ||
| 1084 | /* Encode hstate index for a hwpoisoned large page */ | 1086 | /* Encode hstate index for a hwpoisoned large page */ |
| 1085 | #define VM_FAULT_SET_HINDEX(x) ((x) << 12) | 1087 | #define VM_FAULT_SET_HINDEX(x) ((x) << 12) |
| @@ -1952,7 +1954,7 @@ extern int expand_downwards(struct vm_area_struct *vma, | |||
| 1952 | #if VM_GROWSUP | 1954 | #if VM_GROWSUP |
| 1953 | extern int expand_upwards(struct vm_area_struct *vma, unsigned long address); | 1955 | extern int expand_upwards(struct vm_area_struct *vma, unsigned long address); |
| 1954 | #else | 1956 | #else |
| 1955 | #define expand_upwards(vma, address) do { } while (0) | 1957 | #define expand_upwards(vma, address) (0) |
| 1956 | #endif | 1958 | #endif |
| 1957 | 1959 | ||
| 1958 | /* Look up the first VMA which satisfies addr < vm_end, NULL if none. */ | 1960 | /* Look up the first VMA which satisfies addr < vm_end, NULL if none. */ |
diff --git a/include/linux/mmc/sdhci.h b/include/linux/mmc/sdhci.h index 375af80bde7d..f767a0de611f 100644 --- a/include/linux/mmc/sdhci.h +++ b/include/linux/mmc/sdhci.h | |||
| @@ -137,6 +137,7 @@ struct sdhci_host { | |||
| 137 | #define SDHCI_SDR104_NEEDS_TUNING (1<<10) /* SDR104/HS200 needs tuning */ | 137 | #define SDHCI_SDR104_NEEDS_TUNING (1<<10) /* SDR104/HS200 needs tuning */ |
| 138 | #define SDHCI_USING_RETUNING_TIMER (1<<11) /* Host is using a retuning timer for the card */ | 138 | #define SDHCI_USING_RETUNING_TIMER (1<<11) /* Host is using a retuning timer for the card */ |
| 139 | #define SDHCI_USE_64_BIT_DMA (1<<12) /* Use 64-bit DMA */ | 139 | #define SDHCI_USE_64_BIT_DMA (1<<12) /* Use 64-bit DMA */ |
| 140 | #define SDHCI_HS400_TUNING (1<<13) /* Tuning for HS400 */ | ||
| 140 | 141 | ||
| 141 | unsigned int version; /* SDHCI spec. version */ | 142 | unsigned int version; /* SDHCI spec. version */ |
| 142 | 143 | ||
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/netdevice.h b/include/linux/netdevice.h index 679e6e90aa4c..52fd8e8694cf 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
| @@ -852,11 +852,11 @@ typedef u16 (*select_queue_fallback_t)(struct net_device *dev, | |||
| 852 | * 3. Update dev->stats asynchronously and atomically, and define | 852 | * 3. Update dev->stats asynchronously and atomically, and define |
| 853 | * neither operation. | 853 | * neither operation. |
| 854 | * | 854 | * |
| 855 | * int (*ndo_vlan_rx_add_vid)(struct net_device *dev, __be16 proto, u16t vid); | 855 | * int (*ndo_vlan_rx_add_vid)(struct net_device *dev, __be16 proto, u16 vid); |
| 856 | * If device support VLAN filtering this function is called when a | 856 | * If device support VLAN filtering this function is called when a |
| 857 | * VLAN id is registered. | 857 | * VLAN id is registered. |
| 858 | * | 858 | * |
| 859 | * int (*ndo_vlan_rx_kill_vid)(struct net_device *dev, unsigned short vid); | 859 | * int (*ndo_vlan_rx_kill_vid)(struct net_device *dev, __be16 proto, u16 vid); |
| 860 | * If device support VLAN filtering this function is called when a | 860 | * If device support VLAN filtering this function is called when a |
| 861 | * VLAN id is unregistered. | 861 | * VLAN id is unregistered. |
| 862 | * | 862 | * |
| @@ -2085,7 +2085,7 @@ extern rwlock_t dev_base_lock; /* Device list lock */ | |||
| 2085 | list_for_each_entry_continue_rcu(d, &(net)->dev_base_head, dev_list) | 2085 | list_for_each_entry_continue_rcu(d, &(net)->dev_base_head, dev_list) |
| 2086 | #define for_each_netdev_in_bond_rcu(bond, slave) \ | 2086 | #define for_each_netdev_in_bond_rcu(bond, slave) \ |
| 2087 | for_each_netdev_rcu(&init_net, slave) \ | 2087 | for_each_netdev_rcu(&init_net, slave) \ |
| 2088 | if (netdev_master_upper_dev_get_rcu(slave) == bond) | 2088 | if (netdev_master_upper_dev_get_rcu(slave) == (bond)) |
| 2089 | #define net_device_entry(lh) list_entry(lh, struct net_device, dev_list) | 2089 | #define net_device_entry(lh) list_entry(lh, struct net_device, dev_list) |
| 2090 | 2090 | ||
| 2091 | static inline struct net_device *next_net_device(struct net_device *dev) | 2091 | static inline struct net_device *next_net_device(struct net_device *dev) |
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/perf_event.h b/include/linux/perf_event.h index 486e84ccb1f9..664de5a4ec46 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h | |||
| @@ -79,11 +79,6 @@ struct perf_branch_stack { | |||
| 79 | struct perf_branch_entry entries[0]; | 79 | struct perf_branch_entry entries[0]; |
| 80 | }; | 80 | }; |
| 81 | 81 | ||
| 82 | struct perf_regs { | ||
| 83 | __u64 abi; | ||
| 84 | struct pt_regs *regs; | ||
| 85 | }; | ||
| 86 | |||
| 87 | struct task_struct; | 82 | struct task_struct; |
| 88 | 83 | ||
| 89 | /* | 84 | /* |
| @@ -455,11 +450,6 @@ struct perf_event { | |||
| 455 | #endif /* CONFIG_PERF_EVENTS */ | 450 | #endif /* CONFIG_PERF_EVENTS */ |
| 456 | }; | 451 | }; |
| 457 | 452 | ||
| 458 | enum perf_event_context_type { | ||
| 459 | task_context, | ||
| 460 | cpu_context, | ||
| 461 | }; | ||
| 462 | |||
| 463 | /** | 453 | /** |
| 464 | * struct perf_event_context - event context structure | 454 | * struct perf_event_context - event context structure |
| 465 | * | 455 | * |
| @@ -467,7 +457,6 @@ enum perf_event_context_type { | |||
| 467 | */ | 457 | */ |
| 468 | struct perf_event_context { | 458 | struct perf_event_context { |
| 469 | struct pmu *pmu; | 459 | struct pmu *pmu; |
| 470 | enum perf_event_context_type type; | ||
| 471 | /* | 460 | /* |
| 472 | * Protect the states of the events in the list, | 461 | * Protect the states of the events in the list, |
| 473 | * nr_active, and the list: | 462 | * nr_active, and the list: |
| @@ -610,7 +599,14 @@ struct perf_sample_data { | |||
| 610 | u32 reserved; | 599 | u32 reserved; |
| 611 | } cpu_entry; | 600 | } cpu_entry; |
| 612 | struct perf_callchain_entry *callchain; | 601 | struct perf_callchain_entry *callchain; |
| 602 | |||
| 603 | /* | ||
| 604 | * regs_user may point to task_pt_regs or to regs_user_copy, depending | ||
| 605 | * on arch details. | ||
| 606 | */ | ||
| 613 | struct perf_regs regs_user; | 607 | struct perf_regs regs_user; |
| 608 | struct pt_regs regs_user_copy; | ||
| 609 | |||
| 614 | struct perf_regs regs_intr; | 610 | struct perf_regs regs_intr; |
| 615 | u64 stack_user_size; | 611 | u64 stack_user_size; |
| 616 | } ____cacheline_aligned; | 612 | } ____cacheline_aligned; |
diff --git a/include/linux/perf_regs.h b/include/linux/perf_regs.h index 3c73d5fe18be..a5f98d53d732 100644 --- a/include/linux/perf_regs.h +++ b/include/linux/perf_regs.h | |||
| @@ -1,11 +1,19 @@ | |||
| 1 | #ifndef _LINUX_PERF_REGS_H | 1 | #ifndef _LINUX_PERF_REGS_H |
| 2 | #define _LINUX_PERF_REGS_H | 2 | #define _LINUX_PERF_REGS_H |
| 3 | 3 | ||
| 4 | struct perf_regs { | ||
| 5 | __u64 abi; | ||
| 6 | struct pt_regs *regs; | ||
| 7 | }; | ||
| 8 | |||
| 4 | #ifdef CONFIG_HAVE_PERF_REGS | 9 | #ifdef CONFIG_HAVE_PERF_REGS |
| 5 | #include <asm/perf_regs.h> | 10 | #include <asm/perf_regs.h> |
| 6 | u64 perf_reg_value(struct pt_regs *regs, int idx); | 11 | u64 perf_reg_value(struct pt_regs *regs, int idx); |
| 7 | int perf_reg_validate(u64 mask); | 12 | int perf_reg_validate(u64 mask); |
| 8 | u64 perf_reg_abi(struct task_struct *task); | 13 | u64 perf_reg_abi(struct task_struct *task); |
| 14 | void perf_get_regs_user(struct perf_regs *regs_user, | ||
| 15 | struct pt_regs *regs, | ||
| 16 | struct pt_regs *regs_user_copy); | ||
| 9 | #else | 17 | #else |
| 10 | static inline u64 perf_reg_value(struct pt_regs *regs, int idx) | 18 | static inline u64 perf_reg_value(struct pt_regs *regs, int idx) |
| 11 | { | 19 | { |
| @@ -21,5 +29,13 @@ static inline u64 perf_reg_abi(struct task_struct *task) | |||
| 21 | { | 29 | { |
| 22 | return PERF_SAMPLE_REGS_ABI_NONE; | 30 | return PERF_SAMPLE_REGS_ABI_NONE; |
| 23 | } | 31 | } |
| 32 | |||
| 33 | static inline void perf_get_regs_user(struct perf_regs *regs_user, | ||
| 34 | struct pt_regs *regs, | ||
| 35 | struct pt_regs *regs_user_copy) | ||
| 36 | { | ||
| 37 | regs_user->regs = task_pt_regs(current); | ||
| 38 | regs_user->abi = perf_reg_abi(current); | ||
| 39 | } | ||
| 24 | #endif /* CONFIG_HAVE_PERF_REGS */ | 40 | #endif /* CONFIG_HAVE_PERF_REGS */ |
| 25 | #endif /* _LINUX_PERF_REGS_H */ | 41 | #endif /* _LINUX_PERF_REGS_H */ |
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/quota.h b/include/linux/quota.h index 50978b781a19..097d7eb2441e 100644 --- a/include/linux/quota.h +++ b/include/linux/quota.h | |||
| @@ -321,6 +321,49 @@ struct dquot_operations { | |||
| 321 | 321 | ||
| 322 | struct path; | 322 | struct path; |
| 323 | 323 | ||
| 324 | /* Structure for communicating via ->get_dqblk() & ->set_dqblk() */ | ||
| 325 | struct qc_dqblk { | ||
| 326 | int d_fieldmask; /* mask of fields to change in ->set_dqblk() */ | ||
| 327 | u64 d_spc_hardlimit; /* absolute limit on used space */ | ||
| 328 | u64 d_spc_softlimit; /* preferred limit on used space */ | ||
| 329 | u64 d_ino_hardlimit; /* maximum # allocated inodes */ | ||
| 330 | u64 d_ino_softlimit; /* preferred inode limit */ | ||
| 331 | u64 d_space; /* Space owned by the user */ | ||
| 332 | u64 d_ino_count; /* # inodes owned by the user */ | ||
| 333 | s64 d_ino_timer; /* zero if within inode limits */ | ||
| 334 | /* if not, we refuse service */ | ||
| 335 | s64 d_spc_timer; /* similar to above; for space */ | ||
| 336 | int d_ino_warns; /* # warnings issued wrt num inodes */ | ||
| 337 | int d_spc_warns; /* # warnings issued wrt used space */ | ||
| 338 | u64 d_rt_spc_hardlimit; /* absolute limit on realtime space */ | ||
| 339 | u64 d_rt_spc_softlimit; /* preferred limit on RT space */ | ||
| 340 | u64 d_rt_space; /* realtime space owned */ | ||
| 341 | s64 d_rt_spc_timer; /* similar to above; for RT space */ | ||
| 342 | int d_rt_spc_warns; /* # warnings issued wrt RT space */ | ||
| 343 | }; | ||
| 344 | |||
| 345 | /* Field specifiers for ->set_dqblk() in struct qc_dqblk */ | ||
| 346 | #define QC_INO_SOFT (1<<0) | ||
| 347 | #define QC_INO_HARD (1<<1) | ||
| 348 | #define QC_SPC_SOFT (1<<2) | ||
| 349 | #define QC_SPC_HARD (1<<3) | ||
| 350 | #define QC_RT_SPC_SOFT (1<<4) | ||
| 351 | #define QC_RT_SPC_HARD (1<<5) | ||
| 352 | #define QC_LIMIT_MASK (QC_INO_SOFT | QC_INO_HARD | QC_SPC_SOFT | QC_SPC_HARD | \ | ||
| 353 | QC_RT_SPC_SOFT | QC_RT_SPC_HARD) | ||
| 354 | #define QC_SPC_TIMER (1<<6) | ||
| 355 | #define QC_INO_TIMER (1<<7) | ||
| 356 | #define QC_RT_SPC_TIMER (1<<8) | ||
| 357 | #define QC_TIMER_MASK (QC_SPC_TIMER | QC_INO_TIMER | QC_RT_SPC_TIMER) | ||
| 358 | #define QC_SPC_WARNS (1<<9) | ||
| 359 | #define QC_INO_WARNS (1<<10) | ||
| 360 | #define QC_RT_SPC_WARNS (1<<11) | ||
| 361 | #define QC_WARNS_MASK (QC_SPC_WARNS | QC_INO_WARNS | QC_RT_SPC_WARNS) | ||
| 362 | #define QC_SPACE (1<<12) | ||
| 363 | #define QC_INO_COUNT (1<<13) | ||
| 364 | #define QC_RT_SPACE (1<<14) | ||
| 365 | #define QC_ACCT_MASK (QC_SPACE | QC_INO_COUNT | QC_RT_SPACE) | ||
| 366 | |||
| 324 | /* Operations handling requests from userspace */ | 367 | /* Operations handling requests from userspace */ |
| 325 | struct quotactl_ops { | 368 | struct quotactl_ops { |
| 326 | int (*quota_on)(struct super_block *, int, int, struct path *); | 369 | int (*quota_on)(struct super_block *, int, int, struct path *); |
| @@ -329,8 +372,8 @@ struct quotactl_ops { | |||
| 329 | int (*quota_sync)(struct super_block *, int); | 372 | int (*quota_sync)(struct super_block *, int); |
| 330 | int (*get_info)(struct super_block *, int, struct if_dqinfo *); | 373 | int (*get_info)(struct super_block *, int, struct if_dqinfo *); |
| 331 | int (*set_info)(struct super_block *, int, struct if_dqinfo *); | 374 | int (*set_info)(struct super_block *, int, struct if_dqinfo *); |
| 332 | int (*get_dqblk)(struct super_block *, struct kqid, struct fs_disk_quota *); | 375 | int (*get_dqblk)(struct super_block *, struct kqid, struct qc_dqblk *); |
| 333 | int (*set_dqblk)(struct super_block *, struct kqid, struct fs_disk_quota *); | 376 | int (*set_dqblk)(struct super_block *, struct kqid, struct qc_dqblk *); |
| 334 | int (*get_xstate)(struct super_block *, struct fs_quota_stat *); | 377 | int (*get_xstate)(struct super_block *, struct fs_quota_stat *); |
| 335 | int (*set_xstate)(struct super_block *, unsigned int, int); | 378 | int (*set_xstate)(struct super_block *, unsigned int, int); |
| 336 | int (*get_xstatev)(struct super_block *, struct fs_quota_statv *); | 379 | int (*get_xstatev)(struct super_block *, struct fs_quota_statv *); |
diff --git a/include/linux/quotaops.h b/include/linux/quotaops.h index f23538a6e411..29e3455f7d41 100644 --- a/include/linux/quotaops.h +++ b/include/linux/quotaops.h | |||
| @@ -98,9 +98,9 @@ int dquot_quota_sync(struct super_block *sb, int type); | |||
| 98 | int dquot_get_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii); | 98 | int dquot_get_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii); |
| 99 | int dquot_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii); | 99 | int dquot_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii); |
| 100 | int dquot_get_dqblk(struct super_block *sb, struct kqid id, | 100 | int dquot_get_dqblk(struct super_block *sb, struct kqid id, |
| 101 | struct fs_disk_quota *di); | 101 | struct qc_dqblk *di); |
| 102 | int dquot_set_dqblk(struct super_block *sb, struct kqid id, | 102 | int dquot_set_dqblk(struct super_block *sb, struct kqid id, |
| 103 | struct fs_disk_quota *di); | 103 | struct qc_dqblk *di); |
| 104 | 104 | ||
| 105 | int __dquot_transfer(struct inode *inode, struct dquot **transfer_to); | 105 | int __dquot_transfer(struct inode *inode, struct dquot **transfer_to); |
| 106 | int dquot_transfer(struct inode *inode, struct iattr *iattr); | 106 | int dquot_transfer(struct inode *inode, struct iattr *iattr); |
diff --git a/include/linux/rmap.h b/include/linux/rmap.h index c0c2bce6b0b7..d9d7e7e56352 100644 --- a/include/linux/rmap.h +++ b/include/linux/rmap.h | |||
| @@ -37,6 +37,16 @@ struct anon_vma { | |||
| 37 | atomic_t refcount; | 37 | atomic_t refcount; |
| 38 | 38 | ||
| 39 | /* | 39 | /* |
| 40 | * Count of child anon_vmas and VMAs which points to this anon_vma. | ||
| 41 | * | ||
| 42 | * This counter is used for making decision about reusing anon_vma | ||
| 43 | * instead of forking new one. See comments in function anon_vma_clone. | ||
| 44 | */ | ||
| 45 | unsigned degree; | ||
| 46 | |||
| 47 | struct anon_vma *parent; /* Parent of this anon_vma */ | ||
| 48 | |||
| 49 | /* | ||
| 40 | * NOTE: the LSB of the rb_root.rb_node is set by | 50 | * NOTE: the LSB of the rb_root.rb_node is set by |
| 41 | * mm_take_all_locks() _after_ taking the above lock. So the | 51 | * mm_take_all_locks() _after_ taking the above lock. So the |
| 42 | * rb_root must only be read/written after taking the above lock | 52 | * rb_root must only be read/written after taking the above lock |
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/linux/wait.h b/include/linux/wait.h index 2232ed16635a..37423e0e1379 100644 --- a/include/linux/wait.h +++ b/include/linux/wait.h | |||
| @@ -363,7 +363,6 @@ do { \ | |||
| 363 | */ | 363 | */ |
| 364 | #define wait_event_cmd(wq, condition, cmd1, cmd2) \ | 364 | #define wait_event_cmd(wq, condition, cmd1, cmd2) \ |
| 365 | do { \ | 365 | do { \ |
| 366 | might_sleep(); \ | ||
| 367 | if (condition) \ | 366 | if (condition) \ |
| 368 | break; \ | 367 | break; \ |
| 369 | __wait_event_cmd(wq, condition, cmd1, cmd2); \ | 368 | __wait_event_cmd(wq, condition, cmd1, cmd2); \ |
diff --git a/include/linux/writeback.h b/include/linux/writeback.h index a219be961c0a..00048339c23e 100644 --- a/include/linux/writeback.h +++ b/include/linux/writeback.h | |||
| @@ -177,7 +177,6 @@ int write_cache_pages(struct address_space *mapping, | |||
| 177 | struct writeback_control *wbc, writepage_t writepage, | 177 | struct writeback_control *wbc, writepage_t writepage, |
| 178 | void *data); | 178 | void *data); |
| 179 | int do_writepages(struct address_space *mapping, struct writeback_control *wbc); | 179 | int do_writepages(struct address_space *mapping, struct writeback_control *wbc); |
| 180 | void set_page_dirty_balance(struct page *page); | ||
| 181 | void writeback_set_ratelimit(void); | 180 | void writeback_set_ratelimit(void); |
| 182 | void tag_pages_for_writeback(struct address_space *mapping, | 181 | void tag_pages_for_writeback(struct address_space *mapping, |
| 183 | pgoff_t start, pgoff_t end); | 182 | pgoff_t start, pgoff_t end); |
diff --git a/include/net/flow_keys.h b/include/net/flow_keys.h index 7ee2df083542..dc8fd81412bf 100644 --- a/include/net/flow_keys.h +++ b/include/net/flow_keys.h | |||
| @@ -22,9 +22,9 @@ struct flow_keys { | |||
| 22 | __be32 ports; | 22 | __be32 ports; |
| 23 | __be16 port16[2]; | 23 | __be16 port16[2]; |
| 24 | }; | 24 | }; |
| 25 | u16 thoff; | 25 | u16 thoff; |
| 26 | u16 n_proto; | 26 | __be16 n_proto; |
| 27 | u8 ip_proto; | 27 | u8 ip_proto; |
| 28 | }; | 28 | }; |
| 29 | 29 | ||
| 30 | bool __skb_flow_dissect(const struct sk_buff *skb, struct flow_keys *flow, | 30 | bool __skb_flow_dissect(const struct sk_buff *skb, struct flow_keys *flow, |
diff --git a/include/net/genetlink.h b/include/net/genetlink.h index 84125088c309..6c92415311ca 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 0bb620702929..09cf5aebb283 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 | }; |
| @@ -180,7 +181,7 @@ static inline __u8 ip_reply_arg_flowi_flags(const struct ip_reply_arg *arg) | |||
| 180 | return (arg->flags & IP_REPLY_ARG_NOSRCCHECK) ? FLOWI_FLAG_ANYSRC : 0; | 181 | return (arg->flags & IP_REPLY_ARG_NOSRCCHECK) ? FLOWI_FLAG_ANYSRC : 0; |
| 181 | } | 182 | } |
| 182 | 183 | ||
| 183 | void ip_send_unicast_reply(struct net *net, struct sk_buff *skb, | 184 | void ip_send_unicast_reply(struct sock *sk, struct sk_buff *skb, |
| 184 | const struct ip_options *sopt, | 185 | const struct ip_options *sopt, |
| 185 | __be32 daddr, __be32 saddr, | 186 | __be32 daddr, __be32 saddr, |
| 186 | const struct ip_reply_arg *arg, | 187 | const struct ip_reply_arg *arg, |
diff --git a/include/net/ipv6.h b/include/net/ipv6.h index 4292929392b0..6e416f6d3e3c 100644 --- a/include/net/ipv6.h +++ b/include/net/ipv6.h | |||
| @@ -671,6 +671,9 @@ static inline int ipv6_addr_diff(const struct in6_addr *a1, const struct in6_add | |||
| 671 | return __ipv6_addr_diff(a1, a2, sizeof(struct in6_addr)); | 671 | return __ipv6_addr_diff(a1, a2, sizeof(struct in6_addr)); |
| 672 | } | 672 | } |
| 673 | 673 | ||
| 674 | u32 __ipv6_select_ident(u32 hashrnd, struct in6_addr *dst, | ||
| 675 | struct in6_addr *src); | ||
| 676 | void ipv6_select_ident(struct frag_hdr *fhdr, struct rt6_info *rt); | ||
| 674 | void ipv6_proxy_select_ident(struct sk_buff *skb); | 677 | void ipv6_proxy_select_ident(struct sk_buff *skb); |
| 675 | 678 | ||
| 676 | int ip6_dst_hoplimit(struct dst_entry *dst); | 679 | int ip6_dst_hoplimit(struct dst_entry *dst); |
| @@ -708,7 +711,7 @@ static inline __be32 ip6_make_flowlabel(struct net *net, struct sk_buff *skb, | |||
| 708 | __be32 flowlabel, bool autolabel) | 711 | __be32 flowlabel, bool autolabel) |
| 709 | { | 712 | { |
| 710 | if (!flowlabel && (autolabel || net->ipv6.sysctl.auto_flowlabels)) { | 713 | if (!flowlabel && (autolabel || net->ipv6.sysctl.auto_flowlabels)) { |
| 711 | __be32 hash; | 714 | u32 hash; |
| 712 | 715 | ||
| 713 | hash = skb_get_hash(skb); | 716 | hash = skb_get_hash(skb); |
| 714 | 717 | ||
| @@ -718,7 +721,7 @@ static inline __be32 ip6_make_flowlabel(struct net *net, struct sk_buff *skb, | |||
| 718 | */ | 721 | */ |
| 719 | hash ^= hash >> 12; | 722 | hash ^= hash >> 12; |
| 720 | 723 | ||
| 721 | flowlabel = hash & IPV6_FLOWLABEL_MASK; | 724 | flowlabel = (__force __be32)hash & IPV6_FLOWLABEL_MASK; |
| 722 | } | 725 | } |
| 723 | 726 | ||
| 724 | return flowlabel; | 727 | return flowlabel; |
diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 58d719ddaa60..29c7be8808d5 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h | |||
| @@ -1270,8 +1270,7 @@ struct ieee80211_vif *wdev_to_ieee80211_vif(struct wireless_dev *wdev); | |||
| 1270 | * | 1270 | * |
| 1271 | * @IEEE80211_KEY_FLAG_GENERATE_IV: This flag should be set by the | 1271 | * @IEEE80211_KEY_FLAG_GENERATE_IV: This flag should be set by the |
| 1272 | * driver to indicate that it requires IV generation for this | 1272 | * driver to indicate that it requires IV generation for this |
| 1273 | * particular key. Setting this flag does not necessarily mean that SKBs | 1273 | * particular key. |
| 1274 | * will have sufficient tailroom for ICV or MIC. | ||
| 1275 | * @IEEE80211_KEY_FLAG_GENERATE_MMIC: This flag should be set by | 1274 | * @IEEE80211_KEY_FLAG_GENERATE_MMIC: This flag should be set by |
| 1276 | * the driver for a TKIP key if it requires Michael MIC | 1275 | * the driver for a TKIP key if it requires Michael MIC |
| 1277 | * generation in software. | 1276 | * generation in software. |
| @@ -1283,9 +1282,7 @@ struct ieee80211_vif *wdev_to_ieee80211_vif(struct wireless_dev *wdev); | |||
| 1283 | * @IEEE80211_KEY_FLAG_PUT_IV_SPACE: This flag should be set by the driver | 1282 | * @IEEE80211_KEY_FLAG_PUT_IV_SPACE: This flag should be set by the driver |
| 1284 | * if space should be prepared for the IV, but the IV | 1283 | * if space should be prepared for the IV, but the IV |
| 1285 | * itself should not be generated. Do not set together with | 1284 | * itself should not be generated. Do not set together with |
| 1286 | * @IEEE80211_KEY_FLAG_GENERATE_IV on the same key. Setting this flag does | 1285 | * @IEEE80211_KEY_FLAG_GENERATE_IV on the same key. |
| 1287 | * not necessarily mean that SKBs will have sufficient tailroom for ICV or | ||
| 1288 | * MIC. | ||
| 1289 | * @IEEE80211_KEY_FLAG_RX_MGMT: This key will be used to decrypt received | 1286 | * @IEEE80211_KEY_FLAG_RX_MGMT: This key will be used to decrypt received |
| 1290 | * management frames. The flag can help drivers that have a hardware | 1287 | * management frames. The flag can help drivers that have a hardware |
| 1291 | * crypto implementation that doesn't deal with management frames | 1288 | * crypto implementation that doesn't deal with management frames |
diff --git a/include/net/netfilter/nf_tables.h b/include/net/netfilter/nf_tables.h index 3ae969e3acf0..9eaaa7884586 100644 --- a/include/net/netfilter/nf_tables.h +++ b/include/net/netfilter/nf_tables.h | |||
| @@ -530,6 +530,8 @@ enum nft_chain_type { | |||
| 530 | 530 | ||
| 531 | int nft_chain_validate_dependency(const struct nft_chain *chain, | 531 | int nft_chain_validate_dependency(const struct nft_chain *chain, |
| 532 | enum nft_chain_type type); | 532 | enum nft_chain_type type); |
| 533 | int nft_chain_validate_hooks(const struct nft_chain *chain, | ||
| 534 | unsigned int hook_flags); | ||
| 533 | 535 | ||
| 534 | struct nft_stats { | 536 | struct nft_stats { |
| 535 | u64 bytes; | 537 | u64 bytes; |
diff --git a/include/net/netns/ipv4.h b/include/net/netns/ipv4.h index 24945cefc4fd..0ffef1a38efc 100644 --- a/include/net/netns/ipv4.h +++ b/include/net/netns/ipv4.h | |||
| @@ -52,6 +52,7 @@ struct netns_ipv4 { | |||
| 52 | struct inet_peer_base *peers; | 52 | struct inet_peer_base *peers; |
| 53 | struct tcpm_hash_bucket *tcp_metrics_hash; | 53 | struct tcpm_hash_bucket *tcp_metrics_hash; |
| 54 | unsigned int tcp_metrics_hash_log; | 54 | unsigned int tcp_metrics_hash_log; |
| 55 | struct sock * __percpu *tcp_sk; | ||
| 55 | struct netns_frags frags; | 56 | struct netns_frags frags; |
| 56 | #ifdef CONFIG_NETFILTER | 57 | #ifdef CONFIG_NETFILTER |
| 57 | struct xt_table *iptable_filter; | 58 | struct xt_table *iptable_filter; |
diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h index 3d282cbb66bf..c605d305c577 100644 --- a/include/net/sch_generic.h +++ b/include/net/sch_generic.h | |||
| @@ -79,6 +79,9 @@ struct Qdisc { | |||
| 79 | struct netdev_queue *dev_queue; | 79 | struct netdev_queue *dev_queue; |
| 80 | 80 | ||
| 81 | struct gnet_stats_rate_est64 rate_est; | 81 | struct gnet_stats_rate_est64 rate_est; |
| 82 | struct gnet_stats_basic_cpu __percpu *cpu_bstats; | ||
| 83 | struct gnet_stats_queue __percpu *cpu_qstats; | ||
| 84 | |||
| 82 | struct Qdisc *next_sched; | 85 | struct Qdisc *next_sched; |
| 83 | struct sk_buff *gso_skb; | 86 | struct sk_buff *gso_skb; |
| 84 | /* | 87 | /* |
| @@ -86,15 +89,9 @@ struct Qdisc { | |||
| 86 | */ | 89 | */ |
| 87 | unsigned long state; | 90 | unsigned long state; |
| 88 | struct sk_buff_head q; | 91 | struct sk_buff_head q; |
| 89 | union { | 92 | struct gnet_stats_basic_packed bstats; |
| 90 | struct gnet_stats_basic_packed bstats; | ||
| 91 | struct gnet_stats_basic_cpu __percpu *cpu_bstats; | ||
| 92 | } __packed; | ||
| 93 | unsigned int __state; | 93 | unsigned int __state; |
| 94 | union { | 94 | struct gnet_stats_queue qstats; |
| 95 | struct gnet_stats_queue qstats; | ||
| 96 | struct gnet_stats_queue __percpu *cpu_qstats; | ||
| 97 | } __packed; | ||
| 98 | struct rcu_head rcu_head; | 95 | struct rcu_head rcu_head; |
| 99 | int padded; | 96 | int padded; |
| 100 | atomic_t refcnt; | 97 | atomic_t refcnt; |
diff --git a/include/net/tcp.h b/include/net/tcp.h index f50f29faf76f..9d9111ef43ae 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h | |||
| @@ -834,8 +834,8 @@ void tcp_get_available_congestion_control(char *buf, size_t len); | |||
| 834 | void tcp_get_allowed_congestion_control(char *buf, size_t len); | 834 | void tcp_get_allowed_congestion_control(char *buf, size_t len); |
| 835 | int tcp_set_allowed_congestion_control(char *allowed); | 835 | int tcp_set_allowed_congestion_control(char *allowed); |
| 836 | int tcp_set_congestion_control(struct sock *sk, const char *name); | 836 | int tcp_set_congestion_control(struct sock *sk, const char *name); |
| 837 | void tcp_slow_start(struct tcp_sock *tp, u32 acked); | 837 | u32 tcp_slow_start(struct tcp_sock *tp, u32 acked); |
| 838 | void tcp_cong_avoid_ai(struct tcp_sock *tp, u32 w); | 838 | void tcp_cong_avoid_ai(struct tcp_sock *tp, u32 w, u32 acked); |
| 839 | 839 | ||
| 840 | u32 tcp_reno_ssthresh(struct sock *sk); | 840 | u32 tcp_reno_ssthresh(struct sock *sk); |
| 841 | void tcp_reno_cong_avoid(struct sock *sk, u32 ack, u32 acked); | 841 | void tcp_reno_cong_avoid(struct sock *sk, u32 ack, u32 acked); |
diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h index 0d74f1de99aa..65994a19e840 100644 --- a/include/rdma/ib_verbs.h +++ b/include/rdma/ib_verbs.h | |||
| @@ -1707,10 +1707,7 @@ static inline int ib_copy_from_udata(void *dest, struct ib_udata *udata, size_t | |||
| 1707 | 1707 | ||
| 1708 | static inline int ib_copy_to_udata(struct ib_udata *udata, void *src, size_t len) | 1708 | static inline int ib_copy_to_udata(struct ib_udata *udata, void *src, size_t len) |
| 1709 | { | 1709 | { |
| 1710 | size_t copy_sz; | 1710 | return copy_to_user(udata->outbuf, src, len) ? -EFAULT : 0; |
| 1711 | |||
| 1712 | copy_sz = min_t(size_t, len, udata->outlen); | ||
| 1713 | return copy_to_user(udata->outbuf, src, copy_sz) ? -EFAULT : 0; | ||
| 1714 | } | 1711 | } |
| 1715 | 1712 | ||
| 1716 | /** | 1713 | /** |
diff --git a/include/sound/ak4113.h b/include/sound/ak4113.h index 2609048c1d44..3a34f6edc2d1 100644 --- a/include/sound/ak4113.h +++ b/include/sound/ak4113.h | |||
| @@ -286,7 +286,7 @@ struct ak4113 { | |||
| 286 | ak4113_write_t *write; | 286 | ak4113_write_t *write; |
| 287 | ak4113_read_t *read; | 287 | ak4113_read_t *read; |
| 288 | void *private_data; | 288 | void *private_data; |
| 289 | unsigned int init:1; | 289 | atomic_t wq_processing; |
| 290 | spinlock_t lock; | 290 | spinlock_t lock; |
| 291 | unsigned char regmap[AK4113_WRITABLE_REGS]; | 291 | unsigned char regmap[AK4113_WRITABLE_REGS]; |
| 292 | struct snd_kcontrol *kctls[AK4113_CONTROLS]; | 292 | struct snd_kcontrol *kctls[AK4113_CONTROLS]; |
diff --git a/include/sound/ak4114.h b/include/sound/ak4114.h index 52f02a60dba7..069299a88915 100644 --- a/include/sound/ak4114.h +++ b/include/sound/ak4114.h | |||
| @@ -168,7 +168,7 @@ struct ak4114 { | |||
| 168 | ak4114_write_t * write; | 168 | ak4114_write_t * write; |
| 169 | ak4114_read_t * read; | 169 | ak4114_read_t * read; |
| 170 | void * private_data; | 170 | void * private_data; |
| 171 | unsigned int init: 1; | 171 | atomic_t wq_processing; |
| 172 | spinlock_t lock; | 172 | spinlock_t lock; |
| 173 | unsigned char regmap[6]; | 173 | unsigned char regmap[6]; |
| 174 | unsigned char txcsb[5]; | 174 | unsigned char txcsb[5]; |
diff --git a/include/sound/soc.h b/include/sound/soc.h index b4fca9aed2a2..ac8b333acb4d 100644 --- a/include/sound/soc.h +++ b/include/sound/soc.h | |||
| @@ -498,6 +498,7 @@ int snd_soc_test_bits(struct snd_soc_codec *codec, unsigned int reg, | |||
| 498 | unsigned int mask, unsigned int value); | 498 | unsigned int mask, unsigned int value); |
| 499 | 499 | ||
| 500 | #ifdef CONFIG_SND_SOC_AC97_BUS | 500 | #ifdef CONFIG_SND_SOC_AC97_BUS |
| 501 | struct snd_ac97 *snd_soc_alloc_ac97_codec(struct snd_soc_codec *codec); | ||
| 501 | struct snd_ac97 *snd_soc_new_ac97_codec(struct snd_soc_codec *codec); | 502 | struct snd_ac97 *snd_soc_new_ac97_codec(struct snd_soc_codec *codec); |
| 502 | void snd_soc_free_ac97_codec(struct snd_ac97 *ac97); | 503 | void snd_soc_free_ac97_codec(struct snd_ac97 *ac97); |
| 503 | 504 | ||
diff --git a/include/target/target_core_backend.h b/include/target/target_core_backend.h index 430cfaf92285..db81c65b8f48 100644 --- a/include/target/target_core_backend.h +++ b/include/target/target_core_backend.h | |||
| @@ -135,7 +135,6 @@ int se_dev_set_is_nonrot(struct se_device *, int); | |||
| 135 | int se_dev_set_emulate_rest_reord(struct se_device *dev, int); | 135 | int se_dev_set_emulate_rest_reord(struct se_device *dev, int); |
| 136 | int se_dev_set_queue_depth(struct se_device *, u32); | 136 | int se_dev_set_queue_depth(struct se_device *, u32); |
| 137 | int se_dev_set_max_sectors(struct se_device *, u32); | 137 | int se_dev_set_max_sectors(struct se_device *, u32); |
| 138 | int se_dev_set_fabric_max_sectors(struct se_device *, u32); | ||
| 139 | int se_dev_set_optimal_sectors(struct se_device *, u32); | 138 | int se_dev_set_optimal_sectors(struct se_device *, u32); |
| 140 | int se_dev_set_block_size(struct se_device *, u32); | 139 | int se_dev_set_block_size(struct se_device *, u32); |
| 141 | 140 | ||
diff --git a/include/target/target_core_backend_configfs.h b/include/target/target_core_backend_configfs.h index 3247d7530107..186f7a923570 100644 --- a/include/target/target_core_backend_configfs.h +++ b/include/target/target_core_backend_configfs.h | |||
| @@ -98,8 +98,6 @@ static struct target_backend_dev_attrib_attribute _backend##_dev_attrib_##_name | |||
| 98 | TB_DEV_ATTR(_backend, block_size, S_IRUGO | S_IWUSR); \ | 98 | TB_DEV_ATTR(_backend, block_size, S_IRUGO | S_IWUSR); \ |
| 99 | DEF_TB_DEV_ATTRIB_RO(_backend, hw_max_sectors); \ | 99 | DEF_TB_DEV_ATTRIB_RO(_backend, hw_max_sectors); \ |
| 100 | TB_DEV_ATTR_RO(_backend, hw_max_sectors); \ | 100 | TB_DEV_ATTR_RO(_backend, hw_max_sectors); \ |
| 101 | DEF_TB_DEV_ATTRIB(_backend, fabric_max_sectors); \ | ||
| 102 | TB_DEV_ATTR(_backend, fabric_max_sectors, S_IRUGO | S_IWUSR); \ | ||
| 103 | DEF_TB_DEV_ATTRIB(_backend, optimal_sectors); \ | 101 | DEF_TB_DEV_ATTRIB(_backend, optimal_sectors); \ |
| 104 | TB_DEV_ATTR(_backend, optimal_sectors, S_IRUGO | S_IWUSR); \ | 102 | TB_DEV_ATTR(_backend, optimal_sectors, S_IRUGO | S_IWUSR); \ |
| 105 | DEF_TB_DEV_ATTRIB_RO(_backend, hw_queue_depth); \ | 103 | DEF_TB_DEV_ATTRIB_RO(_backend, hw_queue_depth); \ |
diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h index 397fb635766a..4a8795a87b9e 100644 --- a/include/target/target_core_base.h +++ b/include/target/target_core_base.h | |||
| @@ -77,8 +77,6 @@ | |||
| 77 | #define DA_UNMAP_GRANULARITY_ALIGNMENT_DEFAULT 0 | 77 | #define DA_UNMAP_GRANULARITY_ALIGNMENT_DEFAULT 0 |
| 78 | /* Default max_write_same_len, disabled by default */ | 78 | /* Default max_write_same_len, disabled by default */ |
| 79 | #define DA_MAX_WRITE_SAME_LEN 0 | 79 | #define DA_MAX_WRITE_SAME_LEN 0 |
| 80 | /* Default max transfer length */ | ||
| 81 | #define DA_FABRIC_MAX_SECTORS 8192 | ||
| 82 | /* Use a model alias based on the configfs backend device name */ | 80 | /* Use a model alias based on the configfs backend device name */ |
| 83 | #define DA_EMULATE_MODEL_ALIAS 0 | 81 | #define DA_EMULATE_MODEL_ALIAS 0 |
| 84 | /* Emulation for Direct Page Out */ | 82 | /* Emulation for Direct Page Out */ |
| @@ -694,7 +692,6 @@ struct se_dev_attrib { | |||
| 694 | u32 hw_block_size; | 692 | u32 hw_block_size; |
| 695 | u32 block_size; | 693 | u32 block_size; |
| 696 | u32 hw_max_sectors; | 694 | u32 hw_max_sectors; |
| 697 | u32 fabric_max_sectors; | ||
| 698 | u32 optimal_sectors; | 695 | u32 optimal_sectors; |
| 699 | u32 hw_queue_depth; | 696 | u32 hw_queue_depth; |
| 700 | u32 queue_depth; | 697 | u32 queue_depth; |
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/asm-generic/fcntl.h b/include/uapi/asm-generic/fcntl.h index 7543b3e51331..e063effe0cc1 100644 --- a/include/uapi/asm-generic/fcntl.h +++ b/include/uapi/asm-generic/fcntl.h | |||
| @@ -5,7 +5,7 @@ | |||
| 5 | 5 | ||
| 6 | /* | 6 | /* |
| 7 | * FMODE_EXEC is 0x20 | 7 | * FMODE_EXEC is 0x20 |
| 8 | * FMODE_NONOTIFY is 0x1000000 | 8 | * FMODE_NONOTIFY is 0x4000000 |
| 9 | * These cannot be used by userspace O_* until internal and external open | 9 | * These cannot be used by userspace O_* until internal and external open |
| 10 | * flags are split. | 10 | * flags are split. |
| 11 | * -Eric Paris | 11 | * -Eric Paris |
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/kfd_ioctl.h b/include/uapi/linux/kfd_ioctl.h index 7acef41fc209..af94f31e33ac 100644 --- a/include/uapi/linux/kfd_ioctl.h +++ b/include/uapi/linux/kfd_ioctl.h | |||
| @@ -128,27 +128,34 @@ struct kfd_ioctl_get_process_apertures_args { | |||
| 128 | uint32_t pad; | 128 | uint32_t pad; |
| 129 | }; | 129 | }; |
| 130 | 130 | ||
| 131 | #define KFD_IOC_MAGIC 'K' | 131 | #define AMDKFD_IOCTL_BASE 'K' |
| 132 | #define AMDKFD_IO(nr) _IO(AMDKFD_IOCTL_BASE, nr) | ||
| 133 | #define AMDKFD_IOR(nr, type) _IOR(AMDKFD_IOCTL_BASE, nr, type) | ||
| 134 | #define AMDKFD_IOW(nr, type) _IOW(AMDKFD_IOCTL_BASE, nr, type) | ||
| 135 | #define AMDKFD_IOWR(nr, type) _IOWR(AMDKFD_IOCTL_BASE, nr, type) | ||
| 132 | 136 | ||
| 133 | #define KFD_IOC_GET_VERSION \ | 137 | #define AMDKFD_IOC_GET_VERSION \ |
| 134 | _IOR(KFD_IOC_MAGIC, 1, struct kfd_ioctl_get_version_args) | 138 | AMDKFD_IOR(0x01, struct kfd_ioctl_get_version_args) |
| 135 | 139 | ||
| 136 | #define KFD_IOC_CREATE_QUEUE \ | 140 | #define AMDKFD_IOC_CREATE_QUEUE \ |
| 137 | _IOWR(KFD_IOC_MAGIC, 2, struct kfd_ioctl_create_queue_args) | 141 | AMDKFD_IOWR(0x02, struct kfd_ioctl_create_queue_args) |
| 138 | 142 | ||
| 139 | #define KFD_IOC_DESTROY_QUEUE \ | 143 | #define AMDKFD_IOC_DESTROY_QUEUE \ |
| 140 | _IOWR(KFD_IOC_MAGIC, 3, struct kfd_ioctl_destroy_queue_args) | 144 | AMDKFD_IOWR(0x03, struct kfd_ioctl_destroy_queue_args) |
| 141 | 145 | ||
| 142 | #define KFD_IOC_SET_MEMORY_POLICY \ | 146 | #define AMDKFD_IOC_SET_MEMORY_POLICY \ |
| 143 | _IOW(KFD_IOC_MAGIC, 4, struct kfd_ioctl_set_memory_policy_args) | 147 | AMDKFD_IOW(0x04, struct kfd_ioctl_set_memory_policy_args) |
| 144 | 148 | ||
| 145 | #define KFD_IOC_GET_CLOCK_COUNTERS \ | 149 | #define AMDKFD_IOC_GET_CLOCK_COUNTERS \ |
| 146 | _IOWR(KFD_IOC_MAGIC, 5, struct kfd_ioctl_get_clock_counters_args) | 150 | AMDKFD_IOWR(0x05, struct kfd_ioctl_get_clock_counters_args) |
| 147 | 151 | ||
| 148 | #define KFD_IOC_GET_PROCESS_APERTURES \ | 152 | #define AMDKFD_IOC_GET_PROCESS_APERTURES \ |
| 149 | _IOR(KFD_IOC_MAGIC, 6, struct kfd_ioctl_get_process_apertures_args) | 153 | AMDKFD_IOR(0x06, struct kfd_ioctl_get_process_apertures_args) |
| 150 | 154 | ||
| 151 | #define KFD_IOC_UPDATE_QUEUE \ | 155 | #define AMDKFD_IOC_UPDATE_QUEUE \ |
| 152 | _IOW(KFD_IOC_MAGIC, 7, struct kfd_ioctl_update_queue_args) | 156 | AMDKFD_IOW(0x07, struct kfd_ioctl_update_queue_args) |
| 157 | |||
| 158 | #define AMDKFD_COMMAND_START 0x01 | ||
| 159 | #define AMDKFD_COMMAND_END 0x08 | ||
| 153 | 160 | ||
| 154 | #endif | 161 | #endif |
diff --git a/include/uapi/linux/openvswitch.h b/include/uapi/linux/openvswitch.h index 3a6dcaa359b7..f714e8633352 100644 --- a/include/uapi/linux/openvswitch.h +++ b/include/uapi/linux/openvswitch.h | |||
| @@ -174,6 +174,10 @@ enum ovs_packet_attr { | |||
| 174 | OVS_PACKET_ATTR_USERDATA, /* OVS_ACTION_ATTR_USERSPACE arg. */ | 174 | OVS_PACKET_ATTR_USERDATA, /* OVS_ACTION_ATTR_USERSPACE arg. */ |
| 175 | OVS_PACKET_ATTR_EGRESS_TUN_KEY, /* Nested OVS_TUNNEL_KEY_ATTR_* | 175 | OVS_PACKET_ATTR_EGRESS_TUN_KEY, /* Nested OVS_TUNNEL_KEY_ATTR_* |
| 176 | attributes. */ | 176 | attributes. */ |
| 177 | OVS_PACKET_ATTR_UNUSED1, | ||
| 178 | OVS_PACKET_ATTR_UNUSED2, | ||
| 179 | OVS_PACKET_ATTR_PROBE, /* Packet operation is a feature probe, | ||
| 180 | error logging should be suppressed. */ | ||
| 177 | __OVS_PACKET_ATTR_MAX | 181 | __OVS_PACKET_ATTR_MAX |
| 178 | }; | 182 | }; |
| 179 | 183 | ||
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/include/uapi/rdma/ib_user_verbs.h b/include/uapi/rdma/ib_user_verbs.h index 4275b961bf60..867cc5084afb 100644 --- a/include/uapi/rdma/ib_user_verbs.h +++ b/include/uapi/rdma/ib_user_verbs.h | |||
| @@ -90,7 +90,6 @@ enum { | |||
| 90 | }; | 90 | }; |
| 91 | 91 | ||
| 92 | enum { | 92 | enum { |
| 93 | IB_USER_VERBS_EX_CMD_QUERY_DEVICE = IB_USER_VERBS_CMD_QUERY_DEVICE, | ||
| 94 | IB_USER_VERBS_EX_CMD_CREATE_FLOW = IB_USER_VERBS_CMD_THRESHOLD, | 93 | IB_USER_VERBS_EX_CMD_CREATE_FLOW = IB_USER_VERBS_CMD_THRESHOLD, |
| 95 | IB_USER_VERBS_EX_CMD_DESTROY_FLOW, | 94 | IB_USER_VERBS_EX_CMD_DESTROY_FLOW, |
| 96 | }; | 95 | }; |
| @@ -202,32 +201,6 @@ struct ib_uverbs_query_device_resp { | |||
| 202 | __u8 reserved[4]; | 201 | __u8 reserved[4]; |
| 203 | }; | 202 | }; |
| 204 | 203 | ||
| 205 | enum { | ||
| 206 | IB_USER_VERBS_EX_QUERY_DEVICE_ODP = 1ULL << 0, | ||
| 207 | }; | ||
| 208 | |||
| 209 | struct ib_uverbs_ex_query_device { | ||
| 210 | __u32 comp_mask; | ||
| 211 | __u32 reserved; | ||
| 212 | }; | ||
| 213 | |||
| 214 | struct ib_uverbs_odp_caps { | ||
| 215 | __u64 general_caps; | ||
| 216 | struct { | ||
| 217 | __u32 rc_odp_caps; | ||
| 218 | __u32 uc_odp_caps; | ||
| 219 | __u32 ud_odp_caps; | ||
| 220 | } per_transport_caps; | ||
| 221 | __u32 reserved; | ||
| 222 | }; | ||
| 223 | |||
| 224 | struct ib_uverbs_ex_query_device_resp { | ||
| 225 | struct ib_uverbs_query_device_resp base; | ||
| 226 | __u32 comp_mask; | ||
| 227 | __u32 reserved; | ||
| 228 | struct ib_uverbs_odp_caps odp_caps; | ||
| 229 | }; | ||
| 230 | |||
| 231 | struct ib_uverbs_query_port { | 204 | struct ib_uverbs_query_port { |
| 232 | __u64 response; | 205 | __u64 response; |
| 233 | __u8 port_num; | 206 | __u8 port_num; |
diff --git a/include/xen/interface/nmi.h b/include/xen/interface/nmi.h new file mode 100644 index 000000000000..b47d9d06fade --- /dev/null +++ b/include/xen/interface/nmi.h | |||
| @@ -0,0 +1,51 @@ | |||
| 1 | /****************************************************************************** | ||
| 2 | * nmi.h | ||
| 3 | * | ||
| 4 | * NMI callback registration and reason codes. | ||
| 5 | * | ||
| 6 | * Copyright (c) 2005, Keir Fraser <keir@xensource.com> | ||
| 7 | */ | ||
| 8 | |||
| 9 | #ifndef __XEN_PUBLIC_NMI_H__ | ||
| 10 | #define __XEN_PUBLIC_NMI_H__ | ||
| 11 | |||
| 12 | #include <xen/interface/xen.h> | ||
| 13 | |||
| 14 | /* | ||
| 15 | * NMI reason codes: | ||
| 16 | * Currently these are x86-specific, stored in arch_shared_info.nmi_reason. | ||
| 17 | */ | ||
| 18 | /* I/O-check error reported via ISA port 0x61, bit 6. */ | ||
| 19 | #define _XEN_NMIREASON_io_error 0 | ||
| 20 | #define XEN_NMIREASON_io_error (1UL << _XEN_NMIREASON_io_error) | ||
| 21 | /* PCI SERR reported via ISA port 0x61, bit 7. */ | ||
| 22 | #define _XEN_NMIREASON_pci_serr 1 | ||
| 23 | #define XEN_NMIREASON_pci_serr (1UL << _XEN_NMIREASON_pci_serr) | ||
| 24 | /* Unknown hardware-generated NMI. */ | ||
| 25 | #define _XEN_NMIREASON_unknown 2 | ||
| 26 | #define XEN_NMIREASON_unknown (1UL << _XEN_NMIREASON_unknown) | ||
| 27 | |||
| 28 | /* | ||
| 29 | * long nmi_op(unsigned int cmd, void *arg) | ||
| 30 | * NB. All ops return zero on success, else a negative error code. | ||
| 31 | */ | ||
| 32 | |||
| 33 | /* | ||
| 34 | * Register NMI callback for this (calling) VCPU. Currently this only makes | ||
| 35 | * sense for domain 0, vcpu 0. All other callers will be returned EINVAL. | ||
| 36 | * arg == pointer to xennmi_callback structure. | ||
| 37 | */ | ||
| 38 | #define XENNMI_register_callback 0 | ||
| 39 | struct xennmi_callback { | ||
| 40 | unsigned long handler_address; | ||
| 41 | unsigned long pad; | ||
| 42 | }; | ||
| 43 | DEFINE_GUEST_HANDLE_STRUCT(xennmi_callback); | ||
| 44 | |||
| 45 | /* | ||
| 46 | * Deregister NMI callback for this (calling) VCPU. | ||
| 47 | * arg == NULL. | ||
| 48 | */ | ||
| 49 | #define XENNMI_unregister_callback 1 | ||
| 50 | |||
| 51 | #endif /* __XEN_PUBLIC_NMI_H__ */ | ||
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/debug_core.c b/kernel/debug/debug_core.c index 1adf62b39b96..07ce18ca71e0 100644 --- a/kernel/debug/debug_core.c +++ b/kernel/debug/debug_core.c | |||
| @@ -27,6 +27,9 @@ | |||
| 27 | * version 2. This program is licensed "as is" without any warranty of any | 27 | * version 2. This program is licensed "as is" without any warranty of any |
| 28 | * kind, whether express or implied. | 28 | * kind, whether express or implied. |
| 29 | */ | 29 | */ |
| 30 | |||
| 31 | #define pr_fmt(fmt) "KGDB: " fmt | ||
| 32 | |||
| 30 | #include <linux/pid_namespace.h> | 33 | #include <linux/pid_namespace.h> |
| 31 | #include <linux/clocksource.h> | 34 | #include <linux/clocksource.h> |
| 32 | #include <linux/serial_core.h> | 35 | #include <linux/serial_core.h> |
| @@ -196,8 +199,8 @@ int __weak kgdb_validate_break_address(unsigned long addr) | |||
| 196 | return err; | 199 | return err; |
| 197 | err = kgdb_arch_remove_breakpoint(&tmp); | 200 | err = kgdb_arch_remove_breakpoint(&tmp); |
| 198 | if (err) | 201 | if (err) |
| 199 | printk(KERN_ERR "KGDB: Critical breakpoint error, kernel " | 202 | pr_err("Critical breakpoint error, kernel memory destroyed at: %lx\n", |
| 200 | "memory destroyed at: %lx", addr); | 203 | addr); |
| 201 | return err; | 204 | return err; |
| 202 | } | 205 | } |
| 203 | 206 | ||
| @@ -256,8 +259,8 @@ int dbg_activate_sw_breakpoints(void) | |||
| 256 | error = kgdb_arch_set_breakpoint(&kgdb_break[i]); | 259 | error = kgdb_arch_set_breakpoint(&kgdb_break[i]); |
| 257 | if (error) { | 260 | if (error) { |
| 258 | ret = error; | 261 | ret = error; |
| 259 | printk(KERN_INFO "KGDB: BP install failed: %lx", | 262 | pr_info("BP install failed: %lx\n", |
| 260 | kgdb_break[i].bpt_addr); | 263 | kgdb_break[i].bpt_addr); |
| 261 | continue; | 264 | continue; |
| 262 | } | 265 | } |
| 263 | 266 | ||
| @@ -319,8 +322,8 @@ int dbg_deactivate_sw_breakpoints(void) | |||
| 319 | continue; | 322 | continue; |
| 320 | error = kgdb_arch_remove_breakpoint(&kgdb_break[i]); | 323 | error = kgdb_arch_remove_breakpoint(&kgdb_break[i]); |
| 321 | if (error) { | 324 | if (error) { |
| 322 | printk(KERN_INFO "KGDB: BP remove failed: %lx\n", | 325 | pr_info("BP remove failed: %lx\n", |
| 323 | kgdb_break[i].bpt_addr); | 326 | kgdb_break[i].bpt_addr); |
| 324 | ret = error; | 327 | ret = error; |
| 325 | } | 328 | } |
| 326 | 329 | ||
| @@ -367,7 +370,7 @@ int dbg_remove_all_break(void) | |||
| 367 | goto setundefined; | 370 | goto setundefined; |
| 368 | error = kgdb_arch_remove_breakpoint(&kgdb_break[i]); | 371 | error = kgdb_arch_remove_breakpoint(&kgdb_break[i]); |
| 369 | if (error) | 372 | if (error) |
| 370 | printk(KERN_ERR "KGDB: breakpoint remove failed: %lx\n", | 373 | pr_err("breakpoint remove failed: %lx\n", |
| 371 | kgdb_break[i].bpt_addr); | 374 | kgdb_break[i].bpt_addr); |
| 372 | setundefined: | 375 | setundefined: |
| 373 | kgdb_break[i].state = BP_UNDEFINED; | 376 | kgdb_break[i].state = BP_UNDEFINED; |
| @@ -400,9 +403,9 @@ static int kgdb_io_ready(int print_wait) | |||
| 400 | if (print_wait) { | 403 | if (print_wait) { |
| 401 | #ifdef CONFIG_KGDB_KDB | 404 | #ifdef CONFIG_KGDB_KDB |
| 402 | if (!dbg_kdb_mode) | 405 | if (!dbg_kdb_mode) |
| 403 | printk(KERN_CRIT "KGDB: waiting... or $3#33 for KDB\n"); | 406 | pr_crit("waiting... or $3#33 for KDB\n"); |
| 404 | #else | 407 | #else |
| 405 | printk(KERN_CRIT "KGDB: Waiting for remote debugger\n"); | 408 | pr_crit("Waiting for remote debugger\n"); |
| 406 | #endif | 409 | #endif |
| 407 | } | 410 | } |
| 408 | return 1; | 411 | return 1; |
| @@ -430,8 +433,7 @@ static int kgdb_reenter_check(struct kgdb_state *ks) | |||
| 430 | exception_level = 0; | 433 | exception_level = 0; |
| 431 | kgdb_skipexception(ks->ex_vector, ks->linux_regs); | 434 | kgdb_skipexception(ks->ex_vector, ks->linux_regs); |
| 432 | dbg_activate_sw_breakpoints(); | 435 | dbg_activate_sw_breakpoints(); |
| 433 | printk(KERN_CRIT "KGDB: re-enter error: breakpoint removed %lx\n", | 436 | pr_crit("re-enter error: breakpoint removed %lx\n", addr); |
| 434 | addr); | ||
| 435 | WARN_ON_ONCE(1); | 437 | WARN_ON_ONCE(1); |
| 436 | 438 | ||
| 437 | return 1; | 439 | return 1; |
| @@ -444,7 +446,7 @@ static int kgdb_reenter_check(struct kgdb_state *ks) | |||
| 444 | panic("Recursive entry to debugger"); | 446 | panic("Recursive entry to debugger"); |
| 445 | } | 447 | } |
| 446 | 448 | ||
| 447 | printk(KERN_CRIT "KGDB: re-enter exception: ALL breakpoints killed\n"); | 449 | pr_crit("re-enter exception: ALL breakpoints killed\n"); |
| 448 | #ifdef CONFIG_KGDB_KDB | 450 | #ifdef CONFIG_KGDB_KDB |
| 449 | /* Allow kdb to debug itself one level */ | 451 | /* Allow kdb to debug itself one level */ |
| 450 | return 0; | 452 | return 0; |
| @@ -471,6 +473,7 @@ static int kgdb_cpu_enter(struct kgdb_state *ks, struct pt_regs *regs, | |||
| 471 | int cpu; | 473 | int cpu; |
| 472 | int trace_on = 0; | 474 | int trace_on = 0; |
| 473 | int online_cpus = num_online_cpus(); | 475 | int online_cpus = num_online_cpus(); |
| 476 | u64 time_left; | ||
| 474 | 477 | ||
| 475 | kgdb_info[ks->cpu].enter_kgdb++; | 478 | kgdb_info[ks->cpu].enter_kgdb++; |
| 476 | kgdb_info[ks->cpu].exception_state |= exception_state; | 479 | kgdb_info[ks->cpu].exception_state |= exception_state; |
| @@ -595,9 +598,13 @@ return_normal: | |||
| 595 | /* | 598 | /* |
| 596 | * Wait for the other CPUs to be notified and be waiting for us: | 599 | * Wait for the other CPUs to be notified and be waiting for us: |
| 597 | */ | 600 | */ |
| 598 | while (kgdb_do_roundup && (atomic_read(&masters_in_kgdb) + | 601 | time_left = loops_per_jiffy * HZ; |
| 599 | atomic_read(&slaves_in_kgdb)) != online_cpus) | 602 | while (kgdb_do_roundup && --time_left && |
| 603 | (atomic_read(&masters_in_kgdb) + atomic_read(&slaves_in_kgdb)) != | ||
| 604 | online_cpus) | ||
| 600 | cpu_relax(); | 605 | cpu_relax(); |
| 606 | if (!time_left) | ||
| 607 | pr_crit("KGDB: Timed out waiting for secondary CPUs.\n"); | ||
| 601 | 608 | ||
| 602 | /* | 609 | /* |
| 603 | * At this point the primary processor is completely | 610 | * At this point the primary processor is completely |
| @@ -795,15 +802,15 @@ static struct console kgdbcons = { | |||
| 795 | static void sysrq_handle_dbg(int key) | 802 | static void sysrq_handle_dbg(int key) |
| 796 | { | 803 | { |
| 797 | if (!dbg_io_ops) { | 804 | if (!dbg_io_ops) { |
| 798 | printk(KERN_CRIT "ERROR: No KGDB I/O module available\n"); | 805 | pr_crit("ERROR: No KGDB I/O module available\n"); |
| 799 | return; | 806 | return; |
| 800 | } | 807 | } |
| 801 | if (!kgdb_connected) { | 808 | if (!kgdb_connected) { |
| 802 | #ifdef CONFIG_KGDB_KDB | 809 | #ifdef CONFIG_KGDB_KDB |
| 803 | if (!dbg_kdb_mode) | 810 | if (!dbg_kdb_mode) |
| 804 | printk(KERN_CRIT "KGDB or $3#33 for KDB\n"); | 811 | pr_crit("KGDB or $3#33 for KDB\n"); |
| 805 | #else | 812 | #else |
| 806 | printk(KERN_CRIT "Entering KGDB\n"); | 813 | pr_crit("Entering KGDB\n"); |
| 807 | #endif | 814 | #endif |
| 808 | } | 815 | } |
| 809 | 816 | ||
| @@ -945,7 +952,7 @@ static void kgdb_initial_breakpoint(void) | |||
| 945 | { | 952 | { |
| 946 | kgdb_break_asap = 0; | 953 | kgdb_break_asap = 0; |
| 947 | 954 | ||
| 948 | printk(KERN_CRIT "kgdb: Waiting for connection from remote gdb...\n"); | 955 | pr_crit("Waiting for connection from remote gdb...\n"); |
| 949 | kgdb_breakpoint(); | 956 | kgdb_breakpoint(); |
| 950 | } | 957 | } |
| 951 | 958 | ||
| @@ -964,8 +971,7 @@ int kgdb_register_io_module(struct kgdb_io *new_dbg_io_ops) | |||
| 964 | if (dbg_io_ops) { | 971 | if (dbg_io_ops) { |
| 965 | spin_unlock(&kgdb_registration_lock); | 972 | spin_unlock(&kgdb_registration_lock); |
| 966 | 973 | ||
| 967 | printk(KERN_ERR "kgdb: Another I/O driver is already " | 974 | pr_err("Another I/O driver is already registered with KGDB\n"); |
| 968 | "registered with KGDB.\n"); | ||
| 969 | return -EBUSY; | 975 | return -EBUSY; |
| 970 | } | 976 | } |
| 971 | 977 | ||
| @@ -981,8 +987,7 @@ int kgdb_register_io_module(struct kgdb_io *new_dbg_io_ops) | |||
| 981 | 987 | ||
| 982 | spin_unlock(&kgdb_registration_lock); | 988 | spin_unlock(&kgdb_registration_lock); |
| 983 | 989 | ||
| 984 | printk(KERN_INFO "kgdb: Registered I/O driver %s.\n", | 990 | pr_info("Registered I/O driver %s\n", new_dbg_io_ops->name); |
| 985 | new_dbg_io_ops->name); | ||
| 986 | 991 | ||
| 987 | /* Arm KGDB now. */ | 992 | /* Arm KGDB now. */ |
| 988 | kgdb_register_callbacks(); | 993 | kgdb_register_callbacks(); |
| @@ -1017,8 +1022,7 @@ void kgdb_unregister_io_module(struct kgdb_io *old_dbg_io_ops) | |||
| 1017 | 1022 | ||
| 1018 | spin_unlock(&kgdb_registration_lock); | 1023 | spin_unlock(&kgdb_registration_lock); |
| 1019 | 1024 | ||
| 1020 | printk(KERN_INFO | 1025 | pr_info("Unregistered I/O driver %s, debugger disabled\n", |
| 1021 | "kgdb: Unregistered I/O driver %s, debugger disabled.\n", | ||
| 1022 | old_dbg_io_ops->name); | 1026 | old_dbg_io_ops->name); |
| 1023 | } | 1027 | } |
| 1024 | EXPORT_SYMBOL_GPL(kgdb_unregister_io_module); | 1028 | EXPORT_SYMBOL_GPL(kgdb_unregister_io_module); |
diff --git a/kernel/debug/kdb/kdb_bp.c b/kernel/debug/kdb/kdb_bp.c index b20d544f20c2..e1dbf4a2c69e 100644 --- a/kernel/debug/kdb/kdb_bp.c +++ b/kernel/debug/kdb/kdb_bp.c | |||
| @@ -531,22 +531,29 @@ void __init kdb_initbptab(void) | |||
| 531 | for (i = 0, bp = kdb_breakpoints; i < KDB_MAXBPT; i++, bp++) | 531 | for (i = 0, bp = kdb_breakpoints; i < KDB_MAXBPT; i++, bp++) |
| 532 | bp->bp_free = 1; | 532 | bp->bp_free = 1; |
| 533 | 533 | ||
| 534 | kdb_register_repeat("bp", kdb_bp, "[<vaddr>]", | 534 | kdb_register_flags("bp", kdb_bp, "[<vaddr>]", |
| 535 | "Set/Display breakpoints", 0, KDB_REPEAT_NO_ARGS); | 535 | "Set/Display breakpoints", 0, |
| 536 | kdb_register_repeat("bl", kdb_bp, "[<vaddr>]", | 536 | KDB_ENABLE_FLOW_CTRL | KDB_REPEAT_NO_ARGS); |
| 537 | "Display breakpoints", 0, KDB_REPEAT_NO_ARGS); | 537 | kdb_register_flags("bl", kdb_bp, "[<vaddr>]", |
| 538 | "Display breakpoints", 0, | ||
| 539 | KDB_ENABLE_FLOW_CTRL | KDB_REPEAT_NO_ARGS); | ||
| 538 | if (arch_kgdb_ops.flags & KGDB_HW_BREAKPOINT) | 540 | if (arch_kgdb_ops.flags & KGDB_HW_BREAKPOINT) |
| 539 | kdb_register_repeat("bph", kdb_bp, "[<vaddr>]", | 541 | kdb_register_flags("bph", kdb_bp, "[<vaddr>]", |
| 540 | "[datar [length]|dataw [length]] Set hw brk", 0, KDB_REPEAT_NO_ARGS); | 542 | "[datar [length]|dataw [length]] Set hw brk", 0, |
| 541 | kdb_register_repeat("bc", kdb_bc, "<bpnum>", | 543 | KDB_ENABLE_FLOW_CTRL | KDB_REPEAT_NO_ARGS); |
| 542 | "Clear Breakpoint", 0, KDB_REPEAT_NONE); | 544 | kdb_register_flags("bc", kdb_bc, "<bpnum>", |
| 543 | kdb_register_repeat("be", kdb_bc, "<bpnum>", | 545 | "Clear Breakpoint", 0, |
| 544 | "Enable Breakpoint", 0, KDB_REPEAT_NONE); | 546 | KDB_ENABLE_FLOW_CTRL); |
| 545 | kdb_register_repeat("bd", kdb_bc, "<bpnum>", | 547 | kdb_register_flags("be", kdb_bc, "<bpnum>", |
| 546 | "Disable Breakpoint", 0, KDB_REPEAT_NONE); | 548 | "Enable Breakpoint", 0, |
| 547 | 549 | KDB_ENABLE_FLOW_CTRL); | |
| 548 | kdb_register_repeat("ss", kdb_ss, "", | 550 | kdb_register_flags("bd", kdb_bc, "<bpnum>", |
| 549 | "Single Step", 1, KDB_REPEAT_NO_ARGS); | 551 | "Disable Breakpoint", 0, |
| 552 | KDB_ENABLE_FLOW_CTRL); | ||
| 553 | |||
| 554 | kdb_register_flags("ss", kdb_ss, "", | ||
| 555 | "Single Step", 1, | ||
| 556 | KDB_ENABLE_FLOW_CTRL | KDB_REPEAT_NO_ARGS); | ||
| 550 | /* | 557 | /* |
| 551 | * Architecture dependent initialization. | 558 | * Architecture dependent initialization. |
| 552 | */ | 559 | */ |
diff --git a/kernel/debug/kdb/kdb_debugger.c b/kernel/debug/kdb/kdb_debugger.c index 8859ca34dcfe..15e1a7af5dd0 100644 --- a/kernel/debug/kdb/kdb_debugger.c +++ b/kernel/debug/kdb/kdb_debugger.c | |||
| @@ -129,6 +129,10 @@ int kdb_stub(struct kgdb_state *ks) | |||
| 129 | ks->pass_exception = 1; | 129 | ks->pass_exception = 1; |
| 130 | KDB_FLAG_SET(CATASTROPHIC); | 130 | KDB_FLAG_SET(CATASTROPHIC); |
| 131 | } | 131 | } |
| 132 | /* set CATASTROPHIC if the system contains unresponsive processors */ | ||
| 133 | for_each_online_cpu(i) | ||
| 134 | if (!kgdb_info[i].enter_kgdb) | ||
| 135 | KDB_FLAG_SET(CATASTROPHIC); | ||
| 132 | if (KDB_STATE(SSBPT) && reason == KDB_REASON_SSTEP) { | 136 | if (KDB_STATE(SSBPT) && reason == KDB_REASON_SSTEP) { |
| 133 | KDB_STATE_CLEAR(SSBPT); | 137 | KDB_STATE_CLEAR(SSBPT); |
| 134 | KDB_STATE_CLEAR(DOING_SS); | 138 | KDB_STATE_CLEAR(DOING_SS); |
diff --git a/kernel/debug/kdb/kdb_main.c b/kernel/debug/kdb/kdb_main.c index 379650b984f8..7b40c5f07dce 100644 --- a/kernel/debug/kdb/kdb_main.c +++ b/kernel/debug/kdb/kdb_main.c | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | */ | 12 | */ |
| 13 | 13 | ||
| 14 | #include <linux/ctype.h> | 14 | #include <linux/ctype.h> |
| 15 | #include <linux/types.h> | ||
| 15 | #include <linux/string.h> | 16 | #include <linux/string.h> |
| 16 | #include <linux/kernel.h> | 17 | #include <linux/kernel.h> |
| 17 | #include <linux/kmsg_dump.h> | 18 | #include <linux/kmsg_dump.h> |
| @@ -23,6 +24,7 @@ | |||
| 23 | #include <linux/vmalloc.h> | 24 | #include <linux/vmalloc.h> |
| 24 | #include <linux/atomic.h> | 25 | #include <linux/atomic.h> |
| 25 | #include <linux/module.h> | 26 | #include <linux/module.h> |
| 27 | #include <linux/moduleparam.h> | ||
| 26 | #include <linux/mm.h> | 28 | #include <linux/mm.h> |
| 27 | #include <linux/init.h> | 29 | #include <linux/init.h> |
| 28 | #include <linux/kallsyms.h> | 30 | #include <linux/kallsyms.h> |
| @@ -42,6 +44,12 @@ | |||
| 42 | #include <linux/slab.h> | 44 | #include <linux/slab.h> |
| 43 | #include "kdb_private.h" | 45 | #include "kdb_private.h" |
| 44 | 46 | ||
| 47 | #undef MODULE_PARAM_PREFIX | ||
| 48 | #define MODULE_PARAM_PREFIX "kdb." | ||
| 49 | |||
| 50 | static int kdb_cmd_enabled = CONFIG_KDB_DEFAULT_ENABLE; | ||
| 51 | module_param_named(cmd_enable, kdb_cmd_enabled, int, 0600); | ||
| 52 | |||
| 45 | #define GREP_LEN 256 | 53 | #define GREP_LEN 256 |
| 46 | char kdb_grep_string[GREP_LEN]; | 54 | char kdb_grep_string[GREP_LEN]; |
| 47 | int kdb_grepping_flag; | 55 | int kdb_grepping_flag; |
| @@ -121,6 +129,7 @@ static kdbmsg_t kdbmsgs[] = { | |||
| 121 | KDBMSG(BADLENGTH, "Invalid length field"), | 129 | KDBMSG(BADLENGTH, "Invalid length field"), |
| 122 | KDBMSG(NOBP, "No Breakpoint exists"), | 130 | KDBMSG(NOBP, "No Breakpoint exists"), |
| 123 | KDBMSG(BADADDR, "Invalid address"), | 131 | KDBMSG(BADADDR, "Invalid address"), |
| 132 | KDBMSG(NOPERM, "Permission denied"), | ||
| 124 | }; | 133 | }; |
| 125 | #undef KDBMSG | 134 | #undef KDBMSG |
| 126 | 135 | ||
| @@ -188,6 +197,26 @@ struct task_struct *kdb_curr_task(int cpu) | |||
| 188 | } | 197 | } |
| 189 | 198 | ||
| 190 | /* | 199 | /* |
| 200 | * Check whether the flags of the current command and the permissions | ||
| 201 | * of the kdb console has allow a command to be run. | ||
| 202 | */ | ||
| 203 | static inline bool kdb_check_flags(kdb_cmdflags_t flags, int permissions, | ||
| 204 | bool no_args) | ||
| 205 | { | ||
| 206 | /* permissions comes from userspace so needs massaging slightly */ | ||
| 207 | permissions &= KDB_ENABLE_MASK; | ||
| 208 | permissions |= KDB_ENABLE_ALWAYS_SAFE; | ||
| 209 | |||
| 210 | /* some commands change group when launched with no arguments */ | ||
| 211 | if (no_args) | ||
| 212 | permissions |= permissions << KDB_ENABLE_NO_ARGS_SHIFT; | ||
| 213 | |||
| 214 | flags |= KDB_ENABLE_ALL; | ||
| 215 | |||
| 216 | return permissions & flags; | ||
| 217 | } | ||
| 218 | |||
| 219 | /* | ||
| 191 | * kdbgetenv - This function will return the character string value of | 220 | * kdbgetenv - This function will return the character string value of |
| 192 | * an environment variable. | 221 | * an environment variable. |
| 193 | * Parameters: | 222 | * Parameters: |
| @@ -476,6 +505,15 @@ int kdbgetaddrarg(int argc, const char **argv, int *nextarg, | |||
| 476 | kdb_symtab_t symtab; | 505 | kdb_symtab_t symtab; |
| 477 | 506 | ||
| 478 | /* | 507 | /* |
| 508 | * If the enable flags prohibit both arbitrary memory access | ||
| 509 | * and flow control then there are no reasonable grounds to | ||
| 510 | * provide symbol lookup. | ||
| 511 | */ | ||
| 512 | if (!kdb_check_flags(KDB_ENABLE_MEM_READ | KDB_ENABLE_FLOW_CTRL, | ||
| 513 | kdb_cmd_enabled, false)) | ||
| 514 | return KDB_NOPERM; | ||
| 515 | |||
| 516 | /* | ||
| 479 | * Process arguments which follow the following syntax: | 517 | * Process arguments which follow the following syntax: |
| 480 | * | 518 | * |
| 481 | * symbol | numeric-address [+/- numeric-offset] | 519 | * symbol | numeric-address [+/- numeric-offset] |
| @@ -641,8 +679,13 @@ static int kdb_defcmd2(const char *cmdstr, const char *argv0) | |||
| 641 | if (!s->count) | 679 | if (!s->count) |
| 642 | s->usable = 0; | 680 | s->usable = 0; |
| 643 | if (s->usable) | 681 | if (s->usable) |
| 644 | kdb_register(s->name, kdb_exec_defcmd, | 682 | /* macros are always safe because when executed each |
| 645 | s->usage, s->help, 0); | 683 | * internal command re-enters kdb_parse() and is |
| 684 | * safety checked individually. | ||
| 685 | */ | ||
| 686 | kdb_register_flags(s->name, kdb_exec_defcmd, s->usage, | ||
| 687 | s->help, 0, | ||
| 688 | KDB_ENABLE_ALWAYS_SAFE); | ||
| 646 | return 0; | 689 | return 0; |
| 647 | } | 690 | } |
| 648 | if (!s->usable) | 691 | if (!s->usable) |
| @@ -1003,25 +1046,22 @@ int kdb_parse(const char *cmdstr) | |||
| 1003 | 1046 | ||
| 1004 | if (i < kdb_max_commands) { | 1047 | if (i < kdb_max_commands) { |
| 1005 | int result; | 1048 | int result; |
| 1049 | |||
| 1050 | if (!kdb_check_flags(tp->cmd_flags, kdb_cmd_enabled, argc <= 1)) | ||
| 1051 | return KDB_NOPERM; | ||
| 1052 | |||
| 1006 | KDB_STATE_SET(CMD); | 1053 | KDB_STATE_SET(CMD); |
| 1007 | result = (*tp->cmd_func)(argc-1, (const char **)argv); | 1054 | result = (*tp->cmd_func)(argc-1, (const char **)argv); |
| 1008 | if (result && ignore_errors && result > KDB_CMD_GO) | 1055 | if (result && ignore_errors && result > KDB_CMD_GO) |
| 1009 | result = 0; | 1056 | result = 0; |
| 1010 | KDB_STATE_CLEAR(CMD); | 1057 | KDB_STATE_CLEAR(CMD); |
| 1011 | switch (tp->cmd_repeat) { | 1058 | |
| 1012 | case KDB_REPEAT_NONE: | 1059 | if (tp->cmd_flags & KDB_REPEAT_WITH_ARGS) |
| 1013 | argc = 0; | 1060 | return result; |
| 1014 | if (argv[0]) | 1061 | |
| 1015 | *(argv[0]) = '\0'; | 1062 | argc = tp->cmd_flags & KDB_REPEAT_NO_ARGS ? 1 : 0; |
| 1016 | break; | 1063 | if (argv[argc]) |
| 1017 | case KDB_REPEAT_NO_ARGS: | 1064 | *(argv[argc]) = '\0'; |
| 1018 | argc = 1; | ||
| 1019 | if (argv[1]) | ||
| 1020 | *(argv[1]) = '\0'; | ||
| 1021 | break; | ||
| 1022 | case KDB_REPEAT_WITH_ARGS: | ||
| 1023 | break; | ||
| 1024 | } | ||
| 1025 | return result; | 1065 | return result; |
| 1026 | } | 1066 | } |
| 1027 | 1067 | ||
| @@ -1921,10 +1961,14 @@ static int kdb_rm(int argc, const char **argv) | |||
| 1921 | */ | 1961 | */ |
| 1922 | static int kdb_sr(int argc, const char **argv) | 1962 | static int kdb_sr(int argc, const char **argv) |
| 1923 | { | 1963 | { |
| 1964 | bool check_mask = | ||
| 1965 | !kdb_check_flags(KDB_ENABLE_ALL, kdb_cmd_enabled, false); | ||
| 1966 | |||
| 1924 | if (argc != 1) | 1967 | if (argc != 1) |
| 1925 | return KDB_ARGCOUNT; | 1968 | return KDB_ARGCOUNT; |
| 1969 | |||
| 1926 | kdb_trap_printk++; | 1970 | kdb_trap_printk++; |
| 1927 | __handle_sysrq(*argv[1], false); | 1971 | __handle_sysrq(*argv[1], check_mask); |
| 1928 | kdb_trap_printk--; | 1972 | kdb_trap_printk--; |
| 1929 | 1973 | ||
| 1930 | return 0; | 1974 | return 0; |
| @@ -1979,7 +2023,7 @@ static int kdb_lsmod(int argc, const char **argv) | |||
| 1979 | kdb_printf("%-20s%8u 0x%p ", mod->name, | 2023 | kdb_printf("%-20s%8u 0x%p ", mod->name, |
| 1980 | mod->core_size, (void *)mod); | 2024 | mod->core_size, (void *)mod); |
| 1981 | #ifdef CONFIG_MODULE_UNLOAD | 2025 | #ifdef CONFIG_MODULE_UNLOAD |
| 1982 | kdb_printf("%4ld ", module_refcount(mod)); | 2026 | kdb_printf("%4d ", module_refcount(mod)); |
| 1983 | #endif | 2027 | #endif |
| 1984 | if (mod->state == MODULE_STATE_GOING) | 2028 | if (mod->state == MODULE_STATE_GOING) |
| 1985 | kdb_printf(" (Unloading)"); | 2029 | kdb_printf(" (Unloading)"); |
| @@ -2157,6 +2201,8 @@ static void kdb_cpu_status(void) | |||
| 2157 | for (start_cpu = -1, i = 0; i < NR_CPUS; i++) { | 2201 | for (start_cpu = -1, i = 0; i < NR_CPUS; i++) { |
| 2158 | if (!cpu_online(i)) { | 2202 | if (!cpu_online(i)) { |
| 2159 | state = 'F'; /* cpu is offline */ | 2203 | state = 'F'; /* cpu is offline */ |
| 2204 | } else if (!kgdb_info[i].enter_kgdb) { | ||
| 2205 | state = 'D'; /* cpu is online but unresponsive */ | ||
| 2160 | } else { | 2206 | } else { |
| 2161 | state = ' '; /* cpu is responding to kdb */ | 2207 | state = ' '; /* cpu is responding to kdb */ |
| 2162 | if (kdb_task_state_char(KDB_TSK(i)) == 'I') | 2208 | if (kdb_task_state_char(KDB_TSK(i)) == 'I') |
| @@ -2210,7 +2256,7 @@ static int kdb_cpu(int argc, const char **argv) | |||
| 2210 | /* | 2256 | /* |
| 2211 | * Validate cpunum | 2257 | * Validate cpunum |
| 2212 | */ | 2258 | */ |
| 2213 | if ((cpunum > NR_CPUS) || !cpu_online(cpunum)) | 2259 | if ((cpunum > NR_CPUS) || !kgdb_info[cpunum].enter_kgdb) |
| 2214 | return KDB_BADCPUNUM; | 2260 | return KDB_BADCPUNUM; |
| 2215 | 2261 | ||
| 2216 | dbg_switch_cpu = cpunum; | 2262 | dbg_switch_cpu = cpunum; |
| @@ -2375,6 +2421,8 @@ static int kdb_help(int argc, const char **argv) | |||
| 2375 | return 0; | 2421 | return 0; |
| 2376 | if (!kt->cmd_name) | 2422 | if (!kt->cmd_name) |
| 2377 | continue; | 2423 | continue; |
| 2424 | if (!kdb_check_flags(kt->cmd_flags, kdb_cmd_enabled, true)) | ||
| 2425 | continue; | ||
| 2378 | if (strlen(kt->cmd_usage) > 20) | 2426 | if (strlen(kt->cmd_usage) > 20) |
| 2379 | space = "\n "; | 2427 | space = "\n "; |
| 2380 | kdb_printf("%-15.15s %-20s%s%s\n", kt->cmd_name, | 2428 | kdb_printf("%-15.15s %-20s%s%s\n", kt->cmd_name, |
| @@ -2629,7 +2677,7 @@ static int kdb_grep_help(int argc, const char **argv) | |||
| 2629 | } | 2677 | } |
| 2630 | 2678 | ||
| 2631 | /* | 2679 | /* |
| 2632 | * kdb_register_repeat - This function is used to register a kernel | 2680 | * kdb_register_flags - This function is used to register a kernel |
| 2633 | * debugger command. | 2681 | * debugger command. |
| 2634 | * Inputs: | 2682 | * Inputs: |
| 2635 | * cmd Command name | 2683 | * cmd Command name |
| @@ -2641,12 +2689,12 @@ static int kdb_grep_help(int argc, const char **argv) | |||
| 2641 | * zero for success, one if a duplicate command. | 2689 | * zero for success, one if a duplicate command. |
| 2642 | */ | 2690 | */ |
| 2643 | #define kdb_command_extend 50 /* arbitrary */ | 2691 | #define kdb_command_extend 50 /* arbitrary */ |
| 2644 | int kdb_register_repeat(char *cmd, | 2692 | int kdb_register_flags(char *cmd, |
| 2645 | kdb_func_t func, | 2693 | kdb_func_t func, |
| 2646 | char *usage, | 2694 | char *usage, |
| 2647 | char *help, | 2695 | char *help, |
| 2648 | short minlen, | 2696 | short minlen, |
| 2649 | kdb_repeat_t repeat) | 2697 | kdb_cmdflags_t flags) |
| 2650 | { | 2698 | { |
| 2651 | int i; | 2699 | int i; |
| 2652 | kdbtab_t *kp; | 2700 | kdbtab_t *kp; |
| @@ -2694,19 +2742,18 @@ int kdb_register_repeat(char *cmd, | |||
| 2694 | kp->cmd_func = func; | 2742 | kp->cmd_func = func; |
| 2695 | kp->cmd_usage = usage; | 2743 | kp->cmd_usage = usage; |
| 2696 | kp->cmd_help = help; | 2744 | kp->cmd_help = help; |
| 2697 | kp->cmd_flags = 0; | ||
| 2698 | kp->cmd_minlen = minlen; | 2745 | kp->cmd_minlen = minlen; |
| 2699 | kp->cmd_repeat = repeat; | 2746 | kp->cmd_flags = flags; |
| 2700 | 2747 | ||
| 2701 | return 0; | 2748 | return 0; |
| 2702 | } | 2749 | } |
| 2703 | EXPORT_SYMBOL_GPL(kdb_register_repeat); | 2750 | EXPORT_SYMBOL_GPL(kdb_register_flags); |
| 2704 | 2751 | ||
| 2705 | 2752 | ||
| 2706 | /* | 2753 | /* |
| 2707 | * kdb_register - Compatibility register function for commands that do | 2754 | * kdb_register - Compatibility register function for commands that do |
| 2708 | * not need to specify a repeat state. Equivalent to | 2755 | * not need to specify a repeat state. Equivalent to |
| 2709 | * kdb_register_repeat with KDB_REPEAT_NONE. | 2756 | * kdb_register_flags with flags set to 0. |
| 2710 | * Inputs: | 2757 | * Inputs: |
| 2711 | * cmd Command name | 2758 | * cmd Command name |
| 2712 | * func Function to execute the command | 2759 | * func Function to execute the command |
| @@ -2721,8 +2768,7 @@ int kdb_register(char *cmd, | |||
| 2721 | char *help, | 2768 | char *help, |
| 2722 | short minlen) | 2769 | short minlen) |
| 2723 | { | 2770 | { |
| 2724 | return kdb_register_repeat(cmd, func, usage, help, minlen, | 2771 | return kdb_register_flags(cmd, func, usage, help, minlen, 0); |
| 2725 | KDB_REPEAT_NONE); | ||
| 2726 | } | 2772 | } |
| 2727 | EXPORT_SYMBOL_GPL(kdb_register); | 2773 | EXPORT_SYMBOL_GPL(kdb_register); |
| 2728 | 2774 | ||
| @@ -2764,80 +2810,109 @@ static void __init kdb_inittab(void) | |||
| 2764 | for_each_kdbcmd(kp, i) | 2810 | for_each_kdbcmd(kp, i) |
| 2765 | kp->cmd_name = NULL; | 2811 | kp->cmd_name = NULL; |
| 2766 | 2812 | ||
| 2767 | kdb_register_repeat("md", kdb_md, "<vaddr>", | 2813 | kdb_register_flags("md", kdb_md, "<vaddr>", |
| 2768 | "Display Memory Contents, also mdWcN, e.g. md8c1", 1, | 2814 | "Display Memory Contents, also mdWcN, e.g. md8c1", 1, |
| 2769 | KDB_REPEAT_NO_ARGS); | 2815 | KDB_ENABLE_MEM_READ | KDB_REPEAT_NO_ARGS); |
| 2770 | kdb_register_repeat("mdr", kdb_md, "<vaddr> <bytes>", | 2816 | kdb_register_flags("mdr", kdb_md, "<vaddr> <bytes>", |
| 2771 | "Display Raw Memory", 0, KDB_REPEAT_NO_ARGS); | 2817 | "Display Raw Memory", 0, |
| 2772 | kdb_register_repeat("mdp", kdb_md, "<paddr> <bytes>", | 2818 | KDB_ENABLE_MEM_READ | KDB_REPEAT_NO_ARGS); |
| 2773 | "Display Physical Memory", 0, KDB_REPEAT_NO_ARGS); | 2819 | kdb_register_flags("mdp", kdb_md, "<paddr> <bytes>", |
| 2774 | kdb_register_repeat("mds", kdb_md, "<vaddr>", | 2820 | "Display Physical Memory", 0, |
| 2775 | "Display Memory Symbolically", 0, KDB_REPEAT_NO_ARGS); | 2821 | KDB_ENABLE_MEM_READ | KDB_REPEAT_NO_ARGS); |
| 2776 | kdb_register_repeat("mm", kdb_mm, "<vaddr> <contents>", | 2822 | kdb_register_flags("mds", kdb_md, "<vaddr>", |
| 2777 | "Modify Memory Contents", 0, KDB_REPEAT_NO_ARGS); | 2823 | "Display Memory Symbolically", 0, |
| 2778 | kdb_register_repeat("go", kdb_go, "[<vaddr>]", | 2824 | KDB_ENABLE_MEM_READ | KDB_REPEAT_NO_ARGS); |
| 2779 | "Continue Execution", 1, KDB_REPEAT_NONE); | 2825 | kdb_register_flags("mm", kdb_mm, "<vaddr> <contents>", |
| 2780 | kdb_register_repeat("rd", kdb_rd, "", | 2826 | "Modify Memory Contents", 0, |
| 2781 | "Display Registers", 0, KDB_REPEAT_NONE); | 2827 | KDB_ENABLE_MEM_WRITE | KDB_REPEAT_NO_ARGS); |
| 2782 | kdb_register_repeat("rm", kdb_rm, "<reg> <contents>", | 2828 | kdb_register_flags("go", kdb_go, "[<vaddr>]", |
| 2783 | "Modify Registers", 0, KDB_REPEAT_NONE); | 2829 | "Continue Execution", 1, |
| 2784 | kdb_register_repeat("ef", kdb_ef, "<vaddr>", | 2830 | KDB_ENABLE_REG_WRITE | KDB_ENABLE_ALWAYS_SAFE_NO_ARGS); |
| 2785 | "Display exception frame", 0, KDB_REPEAT_NONE); | 2831 | kdb_register_flags("rd", kdb_rd, "", |
| 2786 | kdb_register_repeat("bt", kdb_bt, "[<vaddr>]", | 2832 | "Display Registers", 0, |
| 2787 | "Stack traceback", 1, KDB_REPEAT_NONE); | 2833 | KDB_ENABLE_REG_READ); |
| 2788 | kdb_register_repeat("btp", kdb_bt, "<pid>", | 2834 | kdb_register_flags("rm", kdb_rm, "<reg> <contents>", |
| 2789 | "Display stack for process <pid>", 0, KDB_REPEAT_NONE); | 2835 | "Modify Registers", 0, |
| 2790 | kdb_register_repeat("bta", kdb_bt, "[D|R|S|T|C|Z|E|U|I|M|A]", | 2836 | KDB_ENABLE_REG_WRITE); |
| 2791 | "Backtrace all processes matching state flag", 0, KDB_REPEAT_NONE); | 2837 | kdb_register_flags("ef", kdb_ef, "<vaddr>", |
| 2792 | kdb_register_repeat("btc", kdb_bt, "", | 2838 | "Display exception frame", 0, |
| 2793 | "Backtrace current process on each cpu", 0, KDB_REPEAT_NONE); | 2839 | KDB_ENABLE_MEM_READ); |
| 2794 | kdb_register_repeat("btt", kdb_bt, "<vaddr>", | 2840 | kdb_register_flags("bt", kdb_bt, "[<vaddr>]", |
| 2841 | "Stack traceback", 1, | ||
| 2842 | KDB_ENABLE_MEM_READ | KDB_ENABLE_INSPECT_NO_ARGS); | ||
| 2843 | kdb_register_flags("btp", kdb_bt, "<pid>", | ||
| 2844 | "Display stack for process <pid>", 0, | ||
| 2845 | KDB_ENABLE_INSPECT); | ||
| 2846 | kdb_register_flags("bta", kdb_bt, "[D|R|S|T|C|Z|E|U|I|M|A]", | ||
| 2847 | "Backtrace all processes matching state flag", 0, | ||
| 2848 | KDB_ENABLE_INSPECT); | ||
| 2849 | kdb_register_flags("btc", kdb_bt, "", | ||
| 2850 | "Backtrace current process on each cpu", 0, | ||
| 2851 | KDB_ENABLE_INSPECT); | ||
| 2852 | kdb_register_flags("btt", kdb_bt, "<vaddr>", | ||
| 2795 | "Backtrace process given its struct task address", 0, | 2853 | "Backtrace process given its struct task address", 0, |
| 2796 | KDB_REPEAT_NONE); | 2854 | KDB_ENABLE_MEM_READ | KDB_ENABLE_INSPECT_NO_ARGS); |
| 2797 | kdb_register_repeat("env", kdb_env, "", | 2855 | kdb_register_flags("env", kdb_env, "", |
| 2798 | "Show environment variables", 0, KDB_REPEAT_NONE); | 2856 | "Show environment variables", 0, |
| 2799 | kdb_register_repeat("set", kdb_set, "", | 2857 | KDB_ENABLE_ALWAYS_SAFE); |
| 2800 | "Set environment variables", 0, KDB_REPEAT_NONE); | 2858 | kdb_register_flags("set", kdb_set, "", |
| 2801 | kdb_register_repeat("help", kdb_help, "", | 2859 | "Set environment variables", 0, |
| 2802 | "Display Help Message", 1, KDB_REPEAT_NONE); | 2860 | KDB_ENABLE_ALWAYS_SAFE); |
| 2803 | kdb_register_repeat("?", kdb_help, "", | 2861 | kdb_register_flags("help", kdb_help, "", |
| 2804 | "Display Help Message", 0, KDB_REPEAT_NONE); | 2862 | "Display Help Message", 1, |
| 2805 | kdb_register_repeat("cpu", kdb_cpu, "<cpunum>", | 2863 | KDB_ENABLE_ALWAYS_SAFE); |
| 2806 | "Switch to new cpu", 0, KDB_REPEAT_NONE); | 2864 | kdb_register_flags("?", kdb_help, "", |
| 2807 | kdb_register_repeat("kgdb", kdb_kgdb, "", | 2865 | "Display Help Message", 0, |
| 2808 | "Enter kgdb mode", 0, KDB_REPEAT_NONE); | 2866 | KDB_ENABLE_ALWAYS_SAFE); |
| 2809 | kdb_register_repeat("ps", kdb_ps, "[<flags>|A]", | 2867 | kdb_register_flags("cpu", kdb_cpu, "<cpunum>", |
| 2810 | "Display active task list", 0, KDB_REPEAT_NONE); | 2868 | "Switch to new cpu", 0, |
| 2811 | kdb_register_repeat("pid", kdb_pid, "<pidnum>", | 2869 | KDB_ENABLE_ALWAYS_SAFE_NO_ARGS); |
| 2812 | "Switch to another task", 0, KDB_REPEAT_NONE); | 2870 | kdb_register_flags("kgdb", kdb_kgdb, "", |
| 2813 | kdb_register_repeat("reboot", kdb_reboot, "", | 2871 | "Enter kgdb mode", 0, 0); |
| 2814 | "Reboot the machine immediately", 0, KDB_REPEAT_NONE); | 2872 | kdb_register_flags("ps", kdb_ps, "[<flags>|A]", |
| 2873 | "Display active task list", 0, | ||
| 2874 | KDB_ENABLE_INSPECT); | ||
| 2875 | kdb_register_flags("pid", kdb_pid, "<pidnum>", | ||
| 2876 | "Switch to another task", 0, | ||
| 2877 | KDB_ENABLE_INSPECT); | ||
| 2878 | kdb_register_flags("reboot", kdb_reboot, "", | ||
| 2879 | "Reboot the machine immediately", 0, | ||
| 2880 | KDB_ENABLE_REBOOT); | ||
| 2815 | #if defined(CONFIG_MODULES) | 2881 | #if defined(CONFIG_MODULES) |
| 2816 | kdb_register_repeat("lsmod", kdb_lsmod, "", | 2882 | kdb_register_flags("lsmod", kdb_lsmod, "", |
| 2817 | "List loaded kernel modules", 0, KDB_REPEAT_NONE); | 2883 | "List loaded kernel modules", 0, |
| 2884 | KDB_ENABLE_INSPECT); | ||
| 2818 | #endif | 2885 | #endif |
| 2819 | #if defined(CONFIG_MAGIC_SYSRQ) | 2886 | #if defined(CONFIG_MAGIC_SYSRQ) |
| 2820 | kdb_register_repeat("sr", kdb_sr, "<key>", | 2887 | kdb_register_flags("sr", kdb_sr, "<key>", |
| 2821 | "Magic SysRq key", 0, KDB_REPEAT_NONE); | 2888 | "Magic SysRq key", 0, |
| 2889 | KDB_ENABLE_ALWAYS_SAFE); | ||
| 2822 | #endif | 2890 | #endif |
| 2823 | #if defined(CONFIG_PRINTK) | 2891 | #if defined(CONFIG_PRINTK) |
| 2824 | kdb_register_repeat("dmesg", kdb_dmesg, "[lines]", | 2892 | kdb_register_flags("dmesg", kdb_dmesg, "[lines]", |
| 2825 | "Display syslog buffer", 0, KDB_REPEAT_NONE); | 2893 | "Display syslog buffer", 0, |
| 2894 | KDB_ENABLE_ALWAYS_SAFE); | ||
| 2826 | #endif | 2895 | #endif |
| 2827 | if (arch_kgdb_ops.enable_nmi) { | 2896 | if (arch_kgdb_ops.enable_nmi) { |
| 2828 | kdb_register_repeat("disable_nmi", kdb_disable_nmi, "", | 2897 | kdb_register_flags("disable_nmi", kdb_disable_nmi, "", |
| 2829 | "Disable NMI entry to KDB", 0, KDB_REPEAT_NONE); | 2898 | "Disable NMI entry to KDB", 0, |
| 2830 | } | 2899 | KDB_ENABLE_ALWAYS_SAFE); |
| 2831 | kdb_register_repeat("defcmd", kdb_defcmd, "name \"usage\" \"help\"", | 2900 | } |
| 2832 | "Define a set of commands, down to endefcmd", 0, KDB_REPEAT_NONE); | 2901 | kdb_register_flags("defcmd", kdb_defcmd, "name \"usage\" \"help\"", |
| 2833 | kdb_register_repeat("kill", kdb_kill, "<-signal> <pid>", | 2902 | "Define a set of commands, down to endefcmd", 0, |
| 2834 | "Send a signal to a process", 0, KDB_REPEAT_NONE); | 2903 | KDB_ENABLE_ALWAYS_SAFE); |
| 2835 | kdb_register_repeat("summary", kdb_summary, "", | 2904 | kdb_register_flags("kill", kdb_kill, "<-signal> <pid>", |
| 2836 | "Summarize the system", 4, KDB_REPEAT_NONE); | 2905 | "Send a signal to a process", 0, |
| 2837 | kdb_register_repeat("per_cpu", kdb_per_cpu, "<sym> [<bytes>] [<cpu>]", | 2906 | KDB_ENABLE_SIGNAL); |
| 2838 | "Display per_cpu variables", 3, KDB_REPEAT_NONE); | 2907 | kdb_register_flags("summary", kdb_summary, "", |
| 2839 | kdb_register_repeat("grephelp", kdb_grep_help, "", | 2908 | "Summarize the system", 4, |
| 2840 | "Display help on | grep", 0, KDB_REPEAT_NONE); | 2909 | KDB_ENABLE_ALWAYS_SAFE); |
| 2910 | kdb_register_flags("per_cpu", kdb_per_cpu, "<sym> [<bytes>] [<cpu>]", | ||
| 2911 | "Display per_cpu variables", 3, | ||
| 2912 | KDB_ENABLE_MEM_READ); | ||
| 2913 | kdb_register_flags("grephelp", kdb_grep_help, "", | ||
| 2914 | "Display help on | grep", 0, | ||
| 2915 | KDB_ENABLE_ALWAYS_SAFE); | ||
| 2841 | } | 2916 | } |
| 2842 | 2917 | ||
| 2843 | /* Execute any commands defined in kdb_cmds. */ | 2918 | /* Execute any commands defined in kdb_cmds. */ |
diff --git a/kernel/debug/kdb/kdb_private.h b/kernel/debug/kdb/kdb_private.h index 7afd3c8c41d5..eaacd1693954 100644 --- a/kernel/debug/kdb/kdb_private.h +++ b/kernel/debug/kdb/kdb_private.h | |||
| @@ -172,10 +172,9 @@ typedef struct _kdbtab { | |||
| 172 | kdb_func_t cmd_func; /* Function to execute command */ | 172 | kdb_func_t cmd_func; /* Function to execute command */ |
| 173 | char *cmd_usage; /* Usage String for this command */ | 173 | char *cmd_usage; /* Usage String for this command */ |
| 174 | char *cmd_help; /* Help message for this command */ | 174 | char *cmd_help; /* Help message for this command */ |
| 175 | short cmd_flags; /* Parsing flags */ | ||
| 176 | short cmd_minlen; /* Minimum legal # command | 175 | short cmd_minlen; /* Minimum legal # command |
| 177 | * chars required */ | 176 | * chars required */ |
| 178 | kdb_repeat_t cmd_repeat; /* Does command auto repeat on enter? */ | 177 | kdb_cmdflags_t cmd_flags; /* Command behaviour flags */ |
| 179 | } kdbtab_t; | 178 | } kdbtab_t; |
| 180 | 179 | ||
| 181 | extern int kdb_bt(int, const char **); /* KDB display back trace */ | 180 | extern int kdb_bt(int, const char **); /* KDB display back trace */ |
diff --git a/kernel/events/core.c b/kernel/events/core.c index 4c1ee7f2bebc..19efcf13375a 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
| @@ -4461,18 +4461,14 @@ perf_output_sample_regs(struct perf_output_handle *handle, | |||
| 4461 | } | 4461 | } |
| 4462 | 4462 | ||
| 4463 | static void perf_sample_regs_user(struct perf_regs *regs_user, | 4463 | static void perf_sample_regs_user(struct perf_regs *regs_user, |
| 4464 | struct pt_regs *regs) | 4464 | struct pt_regs *regs, |
| 4465 | struct pt_regs *regs_user_copy) | ||
| 4465 | { | 4466 | { |
| 4466 | if (!user_mode(regs)) { | 4467 | if (user_mode(regs)) { |
| 4467 | if (current->mm) | 4468 | regs_user->abi = perf_reg_abi(current); |
| 4468 | regs = task_pt_regs(current); | ||
| 4469 | else | ||
| 4470 | regs = NULL; | ||
| 4471 | } | ||
| 4472 | |||
| 4473 | if (regs) { | ||
| 4474 | regs_user->abi = perf_reg_abi(current); | ||
| 4475 | regs_user->regs = regs; | 4469 | regs_user->regs = regs; |
| 4470 | } else if (current->mm) { | ||
| 4471 | perf_get_regs_user(regs_user, regs, regs_user_copy); | ||
| 4476 | } else { | 4472 | } else { |
| 4477 | regs_user->abi = PERF_SAMPLE_REGS_ABI_NONE; | 4473 | regs_user->abi = PERF_SAMPLE_REGS_ABI_NONE; |
| 4478 | regs_user->regs = NULL; | 4474 | regs_user->regs = NULL; |
| @@ -4951,7 +4947,8 @@ void perf_prepare_sample(struct perf_event_header *header, | |||
| 4951 | } | 4947 | } |
| 4952 | 4948 | ||
| 4953 | if (sample_type & (PERF_SAMPLE_REGS_USER | PERF_SAMPLE_STACK_USER)) | 4949 | if (sample_type & (PERF_SAMPLE_REGS_USER | PERF_SAMPLE_STACK_USER)) |
| 4954 | perf_sample_regs_user(&data->regs_user, regs); | 4950 | perf_sample_regs_user(&data->regs_user, regs, |
| 4951 | &data->regs_user_copy); | ||
| 4955 | 4952 | ||
| 4956 | if (sample_type & PERF_SAMPLE_REGS_USER) { | 4953 | if (sample_type & PERF_SAMPLE_REGS_USER) { |
| 4957 | /* regs dump ABI info */ | 4954 | /* regs dump ABI info */ |
| @@ -6779,7 +6776,6 @@ skip_type: | |||
| 6779 | __perf_event_init_context(&cpuctx->ctx); | 6776 | __perf_event_init_context(&cpuctx->ctx); |
| 6780 | lockdep_set_class(&cpuctx->ctx.mutex, &cpuctx_mutex); | 6777 | lockdep_set_class(&cpuctx->ctx.mutex, &cpuctx_mutex); |
| 6781 | lockdep_set_class(&cpuctx->ctx.lock, &cpuctx_lock); | 6778 | lockdep_set_class(&cpuctx->ctx.lock, &cpuctx_lock); |
| 6782 | cpuctx->ctx.type = cpu_context; | ||
| 6783 | cpuctx->ctx.pmu = pmu; | 6779 | cpuctx->ctx.pmu = pmu; |
| 6784 | 6780 | ||
| 6785 | __perf_cpu_hrtimer_init(cpuctx, cpu); | 6781 | __perf_cpu_hrtimer_init(cpuctx, cpu); |
| @@ -7423,7 +7419,19 @@ SYSCALL_DEFINE5(perf_event_open, | |||
| 7423 | * task or CPU context: | 7419 | * task or CPU context: |
| 7424 | */ | 7420 | */ |
| 7425 | if (move_group) { | 7421 | if (move_group) { |
| 7426 | if (group_leader->ctx->type != ctx->type) | 7422 | /* |
| 7423 | * Make sure we're both on the same task, or both | ||
| 7424 | * per-cpu events. | ||
| 7425 | */ | ||
| 7426 | if (group_leader->ctx->task != ctx->task) | ||
| 7427 | goto err_context; | ||
| 7428 | |||
| 7429 | /* | ||
| 7430 | * Make sure we're both events for the same CPU; | ||
| 7431 | * grouping events for different CPUs is broken; since | ||
| 7432 | * you can never concurrently schedule them anyhow. | ||
| 7433 | */ | ||
| 7434 | if (group_leader->cpu != event->cpu) | ||
| 7427 | goto err_context; | 7435 | goto err_context; |
| 7428 | } else { | 7436 | } else { |
| 7429 | if (group_leader->ctx != ctx) | 7437 | if (group_leader->ctx != ctx) |
diff --git a/kernel/exit.c b/kernel/exit.c index 1ea4369890a3..6806c55475ee 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
| @@ -1287,9 +1287,15 @@ static int wait_task_continued(struct wait_opts *wo, struct task_struct *p) | |||
| 1287 | static int wait_consider_task(struct wait_opts *wo, int ptrace, | 1287 | static int wait_consider_task(struct wait_opts *wo, int ptrace, |
| 1288 | struct task_struct *p) | 1288 | struct task_struct *p) |
| 1289 | { | 1289 | { |
| 1290 | /* | ||
| 1291 | * We can race with wait_task_zombie() from another thread. | ||
| 1292 | * Ensure that EXIT_ZOMBIE -> EXIT_DEAD/EXIT_TRACE transition | ||
| 1293 | * can't confuse the checks below. | ||
| 1294 | */ | ||
| 1295 | int exit_state = ACCESS_ONCE(p->exit_state); | ||
| 1290 | int ret; | 1296 | int ret; |
| 1291 | 1297 | ||
| 1292 | if (unlikely(p->exit_state == EXIT_DEAD)) | 1298 | if (unlikely(exit_state == EXIT_DEAD)) |
| 1293 | return 0; | 1299 | return 0; |
| 1294 | 1300 | ||
| 1295 | ret = eligible_child(wo, p); | 1301 | ret = eligible_child(wo, p); |
| @@ -1310,7 +1316,7 @@ static int wait_consider_task(struct wait_opts *wo, int ptrace, | |||
| 1310 | return 0; | 1316 | return 0; |
| 1311 | } | 1317 | } |
| 1312 | 1318 | ||
| 1313 | if (unlikely(p->exit_state == EXIT_TRACE)) { | 1319 | if (unlikely(exit_state == EXIT_TRACE)) { |
| 1314 | /* | 1320 | /* |
| 1315 | * ptrace == 0 means we are the natural parent. In this case | 1321 | * ptrace == 0 means we are the natural parent. In this case |
| 1316 | * we should clear notask_error, debugger will notify us. | 1322 | * we should clear notask_error, debugger will notify us. |
| @@ -1337,7 +1343,7 @@ static int wait_consider_task(struct wait_opts *wo, int ptrace, | |||
| 1337 | } | 1343 | } |
| 1338 | 1344 | ||
| 1339 | /* slay zombie? */ | 1345 | /* slay zombie? */ |
| 1340 | if (p->exit_state == EXIT_ZOMBIE) { | 1346 | if (exit_state == EXIT_ZOMBIE) { |
| 1341 | /* we don't reap group leaders with subthreads */ | 1347 | /* we don't reap group leaders with subthreads */ |
| 1342 | if (!delay_group_leader(p)) { | 1348 | if (!delay_group_leader(p)) { |
| 1343 | /* | 1349 | /* |
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/locking/mutex-debug.c b/kernel/locking/mutex-debug.c index 5cf6731b98e9..3ef3736002d8 100644 --- a/kernel/locking/mutex-debug.c +++ b/kernel/locking/mutex-debug.c | |||
| @@ -80,13 +80,13 @@ void debug_mutex_unlock(struct mutex *lock) | |||
| 80 | DEBUG_LOCKS_WARN_ON(lock->owner != current); | 80 | DEBUG_LOCKS_WARN_ON(lock->owner != current); |
| 81 | 81 | ||
| 82 | DEBUG_LOCKS_WARN_ON(!lock->wait_list.prev && !lock->wait_list.next); | 82 | DEBUG_LOCKS_WARN_ON(!lock->wait_list.prev && !lock->wait_list.next); |
| 83 | mutex_clear_owner(lock); | ||
| 84 | } | 83 | } |
| 85 | 84 | ||
| 86 | /* | 85 | /* |
| 87 | * __mutex_slowpath_needs_to_unlock() is explicitly 0 for debug | 86 | * __mutex_slowpath_needs_to_unlock() is explicitly 0 for debug |
| 88 | * mutexes so that we can do it here after we've verified state. | 87 | * mutexes so that we can do it here after we've verified state. |
| 89 | */ | 88 | */ |
| 89 | mutex_clear_owner(lock); | ||
| 90 | atomic_set(&lock->count, 1); | 90 | atomic_set(&lock->count, 1); |
| 91 | } | 91 | } |
| 92 | 92 | ||
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/sched/core.c b/kernel/sched/core.c index b5797b78add6..5eab11d4b747 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c | |||
| @@ -1814,6 +1814,10 @@ void __dl_clear_params(struct task_struct *p) | |||
| 1814 | dl_se->dl_period = 0; | 1814 | dl_se->dl_period = 0; |
| 1815 | dl_se->flags = 0; | 1815 | dl_se->flags = 0; |
| 1816 | dl_se->dl_bw = 0; | 1816 | dl_se->dl_bw = 0; |
| 1817 | |||
| 1818 | dl_se->dl_throttled = 0; | ||
| 1819 | dl_se->dl_new = 1; | ||
| 1820 | dl_se->dl_yielded = 0; | ||
| 1817 | } | 1821 | } |
| 1818 | 1822 | ||
| 1819 | /* | 1823 | /* |
| @@ -1839,7 +1843,7 @@ static void __sched_fork(unsigned long clone_flags, struct task_struct *p) | |||
| 1839 | #endif | 1843 | #endif |
| 1840 | 1844 | ||
| 1841 | RB_CLEAR_NODE(&p->dl.rb_node); | 1845 | RB_CLEAR_NODE(&p->dl.rb_node); |
| 1842 | hrtimer_init(&p->dl.dl_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); | 1846 | init_dl_task_timer(&p->dl); |
| 1843 | __dl_clear_params(p); | 1847 | __dl_clear_params(p); |
| 1844 | 1848 | ||
| 1845 | INIT_LIST_HEAD(&p->rt.run_list); | 1849 | INIT_LIST_HEAD(&p->rt.run_list); |
| @@ -2049,6 +2053,9 @@ static inline int dl_bw_cpus(int i) | |||
| 2049 | * allocated bandwidth to reflect the new situation. | 2053 | * allocated bandwidth to reflect the new situation. |
| 2050 | * | 2054 | * |
| 2051 | * This function is called while holding p's rq->lock. | 2055 | * This function is called while holding p's rq->lock. |
| 2056 | * | ||
| 2057 | * XXX we should delay bw change until the task's 0-lag point, see | ||
| 2058 | * __setparam_dl(). | ||
| 2052 | */ | 2059 | */ |
| 2053 | static int dl_overflow(struct task_struct *p, int policy, | 2060 | static int dl_overflow(struct task_struct *p, int policy, |
| 2054 | const struct sched_attr *attr) | 2061 | const struct sched_attr *attr) |
| @@ -3251,15 +3258,31 @@ __setparam_dl(struct task_struct *p, const struct sched_attr *attr) | |||
| 3251 | { | 3258 | { |
| 3252 | struct sched_dl_entity *dl_se = &p->dl; | 3259 | struct sched_dl_entity *dl_se = &p->dl; |
| 3253 | 3260 | ||
| 3254 | init_dl_task_timer(dl_se); | ||
| 3255 | dl_se->dl_runtime = attr->sched_runtime; | 3261 | dl_se->dl_runtime = attr->sched_runtime; |
| 3256 | dl_se->dl_deadline = attr->sched_deadline; | 3262 | dl_se->dl_deadline = attr->sched_deadline; |
| 3257 | dl_se->dl_period = attr->sched_period ?: dl_se->dl_deadline; | 3263 | dl_se->dl_period = attr->sched_period ?: dl_se->dl_deadline; |
| 3258 | dl_se->flags = attr->sched_flags; | 3264 | dl_se->flags = attr->sched_flags; |
| 3259 | dl_se->dl_bw = to_ratio(dl_se->dl_period, dl_se->dl_runtime); | 3265 | dl_se->dl_bw = to_ratio(dl_se->dl_period, dl_se->dl_runtime); |
| 3260 | dl_se->dl_throttled = 0; | 3266 | |
| 3261 | dl_se->dl_new = 1; | 3267 | /* |
| 3262 | dl_se->dl_yielded = 0; | 3268 | * Changing the parameters of a task is 'tricky' and we're not doing |
| 3269 | * the correct thing -- also see task_dead_dl() and switched_from_dl(). | ||
| 3270 | * | ||
| 3271 | * What we SHOULD do is delay the bandwidth release until the 0-lag | ||
| 3272 | * point. This would include retaining the task_struct until that time | ||
| 3273 | * and change dl_overflow() to not immediately decrement the current | ||
| 3274 | * amount. | ||
| 3275 | * | ||
| 3276 | * Instead we retain the current runtime/deadline and let the new | ||
| 3277 | * parameters take effect after the current reservation period lapses. | ||
| 3278 | * This is safe (albeit pessimistic) because the 0-lag point is always | ||
| 3279 | * before the current scheduling deadline. | ||
| 3280 | * | ||
| 3281 | * We can still have temporary overloads because we do not delay the | ||
| 3282 | * change in bandwidth until that time; so admission control is | ||
| 3283 | * not on the safe side. It does however guarantee tasks will never | ||
| 3284 | * consume more than promised. | ||
| 3285 | */ | ||
| 3263 | } | 3286 | } |
| 3264 | 3287 | ||
| 3265 | /* | 3288 | /* |
| @@ -4642,6 +4665,9 @@ int cpuset_cpumask_can_shrink(const struct cpumask *cur, | |||
| 4642 | struct dl_bw *cur_dl_b; | 4665 | struct dl_bw *cur_dl_b; |
| 4643 | unsigned long flags; | 4666 | unsigned long flags; |
| 4644 | 4667 | ||
| 4668 | if (!cpumask_weight(cur)) | ||
| 4669 | return ret; | ||
| 4670 | |||
| 4645 | rcu_read_lock_sched(); | 4671 | rcu_read_lock_sched(); |
| 4646 | cur_dl_b = dl_bw_of(cpumask_any(cur)); | 4672 | cur_dl_b = dl_bw_of(cpumask_any(cur)); |
| 4647 | trial_cpus = cpumask_weight(trial); | 4673 | trial_cpus = cpumask_weight(trial); |
| @@ -7113,9 +7139,6 @@ void __init sched_init(void) | |||
| 7113 | #ifdef CONFIG_RT_GROUP_SCHED | 7139 | #ifdef CONFIG_RT_GROUP_SCHED |
| 7114 | alloc_size += 2 * nr_cpu_ids * sizeof(void **); | 7140 | alloc_size += 2 * nr_cpu_ids * sizeof(void **); |
| 7115 | #endif | 7141 | #endif |
| 7116 | #ifdef CONFIG_CPUMASK_OFFSTACK | ||
| 7117 | alloc_size += num_possible_cpus() * cpumask_size(); | ||
| 7118 | #endif | ||
| 7119 | if (alloc_size) { | 7142 | if (alloc_size) { |
| 7120 | ptr = (unsigned long)kzalloc(alloc_size, GFP_NOWAIT); | 7143 | ptr = (unsigned long)kzalloc(alloc_size, GFP_NOWAIT); |
| 7121 | 7144 | ||
| @@ -7135,13 +7158,13 @@ void __init sched_init(void) | |||
| 7135 | ptr += nr_cpu_ids * sizeof(void **); | 7158 | ptr += nr_cpu_ids * sizeof(void **); |
| 7136 | 7159 | ||
| 7137 | #endif /* CONFIG_RT_GROUP_SCHED */ | 7160 | #endif /* CONFIG_RT_GROUP_SCHED */ |
| 7161 | } | ||
| 7138 | #ifdef CONFIG_CPUMASK_OFFSTACK | 7162 | #ifdef CONFIG_CPUMASK_OFFSTACK |
| 7139 | for_each_possible_cpu(i) { | 7163 | for_each_possible_cpu(i) { |
| 7140 | per_cpu(load_balance_mask, i) = (void *)ptr; | 7164 | per_cpu(load_balance_mask, i) = (cpumask_var_t)kzalloc_node( |
| 7141 | ptr += cpumask_size(); | 7165 | cpumask_size(), GFP_KERNEL, cpu_to_node(i)); |
| 7142 | } | ||
| 7143 | #endif /* CONFIG_CPUMASK_OFFSTACK */ | ||
| 7144 | } | 7166 | } |
| 7167 | #endif /* CONFIG_CPUMASK_OFFSTACK */ | ||
| 7145 | 7168 | ||
| 7146 | init_rt_bandwidth(&def_rt_bandwidth, | 7169 | init_rt_bandwidth(&def_rt_bandwidth, |
| 7147 | global_rt_period(), global_rt_runtime()); | 7170 | global_rt_period(), global_rt_runtime()); |
| @@ -7295,13 +7318,12 @@ void __might_sleep(const char *file, int line, int preempt_offset) | |||
| 7295 | * since we will exit with TASK_RUNNING make sure we enter with it, | 7318 | * since we will exit with TASK_RUNNING make sure we enter with it, |
| 7296 | * otherwise we will destroy state. | 7319 | * otherwise we will destroy state. |
| 7297 | */ | 7320 | */ |
| 7298 | if (WARN_ONCE(current->state != TASK_RUNNING, | 7321 | WARN_ONCE(current->state != TASK_RUNNING && current->task_state_change, |
| 7299 | "do not call blocking ops when !TASK_RUNNING; " | 7322 | "do not call blocking ops when !TASK_RUNNING; " |
| 7300 | "state=%lx set at [<%p>] %pS\n", | 7323 | "state=%lx set at [<%p>] %pS\n", |
| 7301 | current->state, | 7324 | current->state, |
| 7302 | (void *)current->task_state_change, | 7325 | (void *)current->task_state_change, |
| 7303 | (void *)current->task_state_change)) | 7326 | (void *)current->task_state_change); |
| 7304 | __set_current_state(TASK_RUNNING); | ||
| 7305 | 7327 | ||
| 7306 | ___might_sleep(file, line, preempt_offset); | 7328 | ___might_sleep(file, line, preempt_offset); |
| 7307 | } | 7329 | } |
diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c index e5db8c6feebd..726470d47f87 100644 --- a/kernel/sched/deadline.c +++ b/kernel/sched/deadline.c | |||
| @@ -570,24 +570,7 @@ void init_dl_task_timer(struct sched_dl_entity *dl_se) | |||
| 570 | static | 570 | static |
| 571 | int dl_runtime_exceeded(struct rq *rq, struct sched_dl_entity *dl_se) | 571 | int dl_runtime_exceeded(struct rq *rq, struct sched_dl_entity *dl_se) |
| 572 | { | 572 | { |
| 573 | int dmiss = dl_time_before(dl_se->deadline, rq_clock(rq)); | 573 | return (dl_se->runtime <= 0); |
| 574 | int rorun = dl_se->runtime <= 0; | ||
| 575 | |||
| 576 | if (!rorun && !dmiss) | ||
| 577 | return 0; | ||
| 578 | |||
| 579 | /* | ||
| 580 | * If we are beyond our current deadline and we are still | ||
| 581 | * executing, then we have already used some of the runtime of | ||
| 582 | * the next instance. Thus, if we do not account that, we are | ||
| 583 | * stealing bandwidth from the system at each deadline miss! | ||
| 584 | */ | ||
| 585 | if (dmiss) { | ||
| 586 | dl_se->runtime = rorun ? dl_se->runtime : 0; | ||
| 587 | dl_se->runtime -= rq_clock(rq) - dl_se->deadline; | ||
| 588 | } | ||
| 589 | |||
| 590 | return 1; | ||
| 591 | } | 574 | } |
| 592 | 575 | ||
| 593 | extern bool sched_rt_bandwidth_account(struct rt_rq *rt_rq); | 576 | extern bool sched_rt_bandwidth_account(struct rt_rq *rt_rq); |
| @@ -826,10 +809,10 @@ enqueue_dl_entity(struct sched_dl_entity *dl_se, | |||
| 826 | * parameters of the task might need updating. Otherwise, | 809 | * parameters of the task might need updating. Otherwise, |
| 827 | * we want a replenishment of its runtime. | 810 | * we want a replenishment of its runtime. |
| 828 | */ | 811 | */ |
| 829 | if (!dl_se->dl_new && flags & ENQUEUE_REPLENISH) | 812 | if (dl_se->dl_new || flags & ENQUEUE_WAKEUP) |
| 830 | replenish_dl_entity(dl_se, pi_se); | ||
| 831 | else | ||
| 832 | update_dl_entity(dl_se, pi_se); | 813 | update_dl_entity(dl_se, pi_se); |
| 814 | else if (flags & ENQUEUE_REPLENISH) | ||
| 815 | replenish_dl_entity(dl_se, pi_se); | ||
| 833 | 816 | ||
| 834 | __enqueue_dl_entity(dl_se); | 817 | __enqueue_dl_entity(dl_se); |
| 835 | } | 818 | } |
| @@ -1111,6 +1094,7 @@ static void task_dead_dl(struct task_struct *p) | |||
| 1111 | * Since we are TASK_DEAD we won't slip out of the domain! | 1094 | * Since we are TASK_DEAD we won't slip out of the domain! |
| 1112 | */ | 1095 | */ |
| 1113 | raw_spin_lock_irq(&dl_b->lock); | 1096 | raw_spin_lock_irq(&dl_b->lock); |
| 1097 | /* XXX we should retain the bw until 0-lag */ | ||
| 1114 | dl_b->total_bw -= p->dl.dl_bw; | 1098 | dl_b->total_bw -= p->dl.dl_bw; |
| 1115 | raw_spin_unlock_irq(&dl_b->lock); | 1099 | raw_spin_unlock_irq(&dl_b->lock); |
| 1116 | 1100 | ||
| @@ -1631,8 +1615,8 @@ static void cancel_dl_timer(struct rq *rq, struct task_struct *p) | |||
| 1631 | 1615 | ||
| 1632 | static void switched_from_dl(struct rq *rq, struct task_struct *p) | 1616 | static void switched_from_dl(struct rq *rq, struct task_struct *p) |
| 1633 | { | 1617 | { |
| 1618 | /* XXX we should retain the bw until 0-lag */ | ||
| 1634 | cancel_dl_timer(rq, p); | 1619 | cancel_dl_timer(rq, p); |
| 1635 | |||
| 1636 | __dl_clear_params(p); | 1620 | __dl_clear_params(p); |
| 1637 | 1621 | ||
| 1638 | /* | 1622 | /* |
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index df2cdf77f899..fe331fc391f5 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c | |||
| @@ -1730,7 +1730,7 @@ static int preferred_group_nid(struct task_struct *p, int nid) | |||
| 1730 | nodes = node_online_map; | 1730 | nodes = node_online_map; |
| 1731 | for (dist = sched_max_numa_distance; dist > LOCAL_DISTANCE; dist--) { | 1731 | for (dist = sched_max_numa_distance; dist > LOCAL_DISTANCE; dist--) { |
| 1732 | unsigned long max_faults = 0; | 1732 | unsigned long max_faults = 0; |
| 1733 | nodemask_t max_group; | 1733 | nodemask_t max_group = NODE_MASK_NONE; |
| 1734 | int a, b; | 1734 | int a, b; |
| 1735 | 1735 | ||
| 1736 | /* Are there nodes at this distance from each other? */ | 1736 | /* Are there nodes at this distance from each other? */ |
| @@ -4005,6 +4005,10 @@ void __start_cfs_bandwidth(struct cfs_bandwidth *cfs_b, bool force) | |||
| 4005 | 4005 | ||
| 4006 | static void destroy_cfs_bandwidth(struct cfs_bandwidth *cfs_b) | 4006 | static void destroy_cfs_bandwidth(struct cfs_bandwidth *cfs_b) |
| 4007 | { | 4007 | { |
| 4008 | /* init_cfs_bandwidth() was not called */ | ||
| 4009 | if (!cfs_b->throttled_cfs_rq.next) | ||
| 4010 | return; | ||
| 4011 | |||
| 4008 | hrtimer_cancel(&cfs_b->period_timer); | 4012 | hrtimer_cancel(&cfs_b->period_timer); |
| 4009 | hrtimer_cancel(&cfs_b->slack_timer); | 4013 | hrtimer_cancel(&cfs_b->slack_timer); |
| 4010 | } | 4014 | } |
| @@ -4424,7 +4428,7 @@ static long effective_load(struct task_group *tg, int cpu, long wl, long wg) | |||
| 4424 | * wl = S * s'_i; see (2) | 4428 | * wl = S * s'_i; see (2) |
| 4425 | */ | 4429 | */ |
| 4426 | if (W > 0 && w < W) | 4430 | if (W > 0 && w < W) |
| 4427 | wl = (w * tg->shares) / W; | 4431 | wl = (w * (long)tg->shares) / W; |
| 4428 | else | 4432 | else |
| 4429 | wl = tg->shares; | 4433 | wl = tg->shares; |
| 4430 | 4434 | ||
diff --git a/kernel/smpboot.c b/kernel/smpboot.c index f032fb5284e3..40190f28db35 100644 --- a/kernel/smpboot.c +++ b/kernel/smpboot.c | |||
| @@ -280,6 +280,7 @@ int smpboot_register_percpu_thread(struct smp_hotplug_thread *plug_thread) | |||
| 280 | unsigned int cpu; | 280 | unsigned int cpu; |
| 281 | int ret = 0; | 281 | int ret = 0; |
| 282 | 282 | ||
| 283 | get_online_cpus(); | ||
| 283 | mutex_lock(&smpboot_threads_lock); | 284 | mutex_lock(&smpboot_threads_lock); |
| 284 | for_each_online_cpu(cpu) { | 285 | for_each_online_cpu(cpu) { |
| 285 | ret = __smpboot_create_thread(plug_thread, cpu); | 286 | ret = __smpboot_create_thread(plug_thread, cpu); |
| @@ -292,6 +293,7 @@ int smpboot_register_percpu_thread(struct smp_hotplug_thread *plug_thread) | |||
| 292 | list_add(&plug_thread->list, &hotplug_threads); | 293 | list_add(&plug_thread->list, &hotplug_threads); |
| 293 | out: | 294 | out: |
| 294 | mutex_unlock(&smpboot_threads_lock); | 295 | mutex_unlock(&smpboot_threads_lock); |
| 296 | put_online_cpus(); | ||
| 295 | return ret; | 297 | return ret; |
| 296 | } | 298 | } |
| 297 | EXPORT_SYMBOL_GPL(smpboot_register_percpu_thread); | 299 | EXPORT_SYMBOL_GPL(smpboot_register_percpu_thread); |
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/hrtimer.c b/kernel/time/hrtimer.c index 37e50aadd471..d8c724cda37b 100644 --- a/kernel/time/hrtimer.c +++ b/kernel/time/hrtimer.c | |||
| @@ -122,7 +122,7 @@ static void hrtimer_get_softirq_time(struct hrtimer_cpu_base *base) | |||
| 122 | mono = ktime_get_update_offsets_tick(&off_real, &off_boot, &off_tai); | 122 | mono = ktime_get_update_offsets_tick(&off_real, &off_boot, &off_tai); |
| 123 | boot = ktime_add(mono, off_boot); | 123 | boot = ktime_add(mono, off_boot); |
| 124 | xtim = ktime_add(mono, off_real); | 124 | xtim = ktime_add(mono, off_real); |
| 125 | tai = ktime_add(xtim, off_tai); | 125 | tai = ktime_add(mono, off_tai); |
| 126 | 126 | ||
| 127 | base->clock_base[HRTIMER_BASE_REALTIME].softirq_time = xtim; | 127 | base->clock_base[HRTIMER_BASE_REALTIME].softirq_time = xtim; |
| 128 | base->clock_base[HRTIMER_BASE_MONOTONIC].softirq_time = mono; | 128 | base->clock_base[HRTIMER_BASE_MONOTONIC].softirq_time = mono; |
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/trace_kdb.c b/kernel/trace/trace_kdb.c index b0b1c44e923a..3ccf5c2c1320 100644 --- a/kernel/trace/trace_kdb.c +++ b/kernel/trace/trace_kdb.c | |||
| @@ -132,8 +132,8 @@ static int kdb_ftdump(int argc, const char **argv) | |||
| 132 | 132 | ||
| 133 | static __init int kdb_ftrace_register(void) | 133 | static __init int kdb_ftrace_register(void) |
| 134 | { | 134 | { |
| 135 | kdb_register_repeat("ftdump", kdb_ftdump, "[skip_#lines] [cpu]", | 135 | kdb_register_flags("ftdump", kdb_ftdump, "[skip_#lines] [cpu]", |
| 136 | "Dump ftrace log", 0, KDB_REPEAT_NONE); | 136 | "Dump ftrace log", 0, KDB_ENABLE_ALWAYS_SAFE); |
| 137 | return 0; | 137 | return 0; |
| 138 | } | 138 | } |
| 139 | 139 | ||
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/lib/Kconfig.kgdb b/lib/Kconfig.kgdb index 358eb81fa28d..c635a107a7de 100644 --- a/lib/Kconfig.kgdb +++ b/lib/Kconfig.kgdb | |||
| @@ -73,6 +73,31 @@ config KGDB_KDB | |||
| 73 | help | 73 | help |
| 74 | KDB frontend for kernel | 74 | KDB frontend for kernel |
| 75 | 75 | ||
| 76 | config KDB_DEFAULT_ENABLE | ||
| 77 | hex "KDB: Select kdb command functions to be enabled by default" | ||
| 78 | depends on KGDB_KDB | ||
| 79 | default 0x1 | ||
| 80 | help | ||
| 81 | Specifiers which kdb commands are enabled by default. This may | ||
| 82 | be set to 1 or 0 to enable all commands or disable almost all | ||
| 83 | commands. | ||
| 84 | |||
| 85 | Alternatively the following bitmask applies: | ||
| 86 | |||
| 87 | 0x0002 - allow arbitrary reads from memory and symbol lookup | ||
| 88 | 0x0004 - allow arbitrary writes to memory | ||
| 89 | 0x0008 - allow current register state to be inspected | ||
| 90 | 0x0010 - allow current register state to be modified | ||
| 91 | 0x0020 - allow passive inspection (backtrace, process list, lsmod) | ||
| 92 | 0x0040 - allow flow control management (breakpoint, single step) | ||
| 93 | 0x0080 - enable signalling of processes | ||
| 94 | 0x0100 - allow machine to be rebooted | ||
| 95 | |||
| 96 | The config option merely sets the default at boot time. Both | ||
| 97 | issuing 'echo X > /sys/module/kdb/parameters/cmd_enable' or | ||
| 98 | setting with kdb.cmd_enable=X kernel command line option will | ||
| 99 | override the default settings. | ||
| 100 | |||
| 76 | config KDB_KEYBOARD | 101 | config KDB_KEYBOARD |
| 77 | bool "KGDB_KDB: keyboard as input device" | 102 | bool "KGDB_KDB: keyboard as input device" |
| 78 | depends on VT && KGDB_KDB | 103 | depends on VT && KGDB_KDB |
diff --git a/lib/assoc_array.c b/lib/assoc_array.c index 2404d03e251a..03dd576e6773 100644 --- a/lib/assoc_array.c +++ b/lib/assoc_array.c | |||
| @@ -11,6 +11,7 @@ | |||
| 11 | * 2 of the Licence, or (at your option) any later version. | 11 | * 2 of the Licence, or (at your option) any later version. |
| 12 | */ | 12 | */ |
| 13 | //#define DEBUG | 13 | //#define DEBUG |
| 14 | #include <linux/rcupdate.h> | ||
| 14 | #include <linux/slab.h> | 15 | #include <linux/slab.h> |
| 15 | #include <linux/err.h> | 16 | #include <linux/err.h> |
| 16 | #include <linux/assoc_array_priv.h> | 17 | #include <linux/assoc_array_priv.h> |
diff --git a/lib/checksum.c b/lib/checksum.c index 129775eb6de6..8b39e86dbab5 100644 --- a/lib/checksum.c +++ b/lib/checksum.c | |||
| @@ -181,6 +181,15 @@ csum_partial_copy(const void *src, void *dst, int len, __wsum sum) | |||
| 181 | EXPORT_SYMBOL(csum_partial_copy); | 181 | EXPORT_SYMBOL(csum_partial_copy); |
| 182 | 182 | ||
| 183 | #ifndef csum_tcpudp_nofold | 183 | #ifndef csum_tcpudp_nofold |
| 184 | static inline u32 from64to32(u64 x) | ||
| 185 | { | ||
| 186 | /* add up 32-bit and 32-bit for 32+c bit */ | ||
| 187 | x = (x & 0xffffffff) + (x >> 32); | ||
| 188 | /* add up carry.. */ | ||
| 189 | x = (x & 0xffffffff) + (x >> 32); | ||
| 190 | return (u32)x; | ||
| 191 | } | ||
| 192 | |||
| 184 | __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr, | 193 | __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr, |
| 185 | unsigned short len, | 194 | unsigned short len, |
| 186 | unsigned short proto, | 195 | unsigned short proto, |
| @@ -195,8 +204,7 @@ __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr, | |||
| 195 | #else | 204 | #else |
| 196 | s += (proto + len) << 8; | 205 | s += (proto + len) << 8; |
| 197 | #endif | 206 | #endif |
| 198 | s += (s >> 32); | 207 | return (__force __wsum)from64to32(s); |
| 199 | return (__force __wsum)s; | ||
| 200 | } | 208 | } |
| 201 | EXPORT_SYMBOL(csum_tcpudp_nofold); | 209 | EXPORT_SYMBOL(csum_tcpudp_nofold); |
| 202 | #endif | 210 | #endif |
diff --git a/mm/Kconfig.debug b/mm/Kconfig.debug index 56badfc4810a..957d3da53ddd 100644 --- a/mm/Kconfig.debug +++ b/mm/Kconfig.debug | |||
| @@ -14,7 +14,6 @@ config DEBUG_PAGEALLOC | |||
| 14 | depends on !KMEMCHECK | 14 | depends on !KMEMCHECK |
| 15 | select PAGE_EXTENSION | 15 | select PAGE_EXTENSION |
| 16 | select PAGE_POISONING if !ARCH_SUPPORTS_DEBUG_PAGEALLOC | 16 | select PAGE_POISONING if !ARCH_SUPPORTS_DEBUG_PAGEALLOC |
| 17 | select PAGE_GUARD if ARCH_SUPPORTS_DEBUG_PAGEALLOC | ||
| 18 | ---help--- | 17 | ---help--- |
| 19 | Unmap pages from the kernel linear mapping after free_pages(). | 18 | Unmap pages from the kernel linear mapping after free_pages(). |
| 20 | This results in a large slowdown, but helps to find certain types | 19 | This results in a large slowdown, but helps to find certain types |
| @@ -27,13 +26,5 @@ config DEBUG_PAGEALLOC | |||
| 27 | that would result in incorrect warnings of memory corruption after | 26 | that would result in incorrect warnings of memory corruption after |
| 28 | a resume because free pages are not saved to the suspend image. | 27 | a resume because free pages are not saved to the suspend image. |
| 29 | 28 | ||
| 30 | config WANT_PAGE_DEBUG_FLAGS | ||
| 31 | bool | ||
| 32 | |||
| 33 | config PAGE_POISONING | 29 | config PAGE_POISONING |
| 34 | bool | 30 | bool |
| 35 | select WANT_PAGE_DEBUG_FLAGS | ||
| 36 | |||
| 37 | config PAGE_GUARD | ||
| 38 | bool | ||
| 39 | select WANT_PAGE_DEBUG_FLAGS | ||
| @@ -296,7 +296,7 @@ static int faultin_page(struct task_struct *tsk, struct vm_area_struct *vma, | |||
| 296 | return -ENOMEM; | 296 | return -ENOMEM; |
| 297 | if (ret & (VM_FAULT_HWPOISON | VM_FAULT_HWPOISON_LARGE)) | 297 | if (ret & (VM_FAULT_HWPOISON | VM_FAULT_HWPOISON_LARGE)) |
| 298 | return *flags & FOLL_HWPOISON ? -EHWPOISON : -EFAULT; | 298 | return *flags & FOLL_HWPOISON ? -EHWPOISON : -EFAULT; |
| 299 | if (ret & VM_FAULT_SIGBUS) | 299 | if (ret & (VM_FAULT_SIGBUS | VM_FAULT_SIGSEGV)) |
| 300 | return -EFAULT; | 300 | return -EFAULT; |
| 301 | BUG(); | 301 | BUG(); |
| 302 | } | 302 | } |
| @@ -571,7 +571,7 @@ int fixup_user_fault(struct task_struct *tsk, struct mm_struct *mm, | |||
| 571 | return -ENOMEM; | 571 | return -ENOMEM; |
| 572 | if (ret & (VM_FAULT_HWPOISON | VM_FAULT_HWPOISON_LARGE)) | 572 | if (ret & (VM_FAULT_HWPOISON | VM_FAULT_HWPOISON_LARGE)) |
| 573 | return -EHWPOISON; | 573 | return -EHWPOISON; |
| 574 | if (ret & VM_FAULT_SIGBUS) | 574 | if (ret & (VM_FAULT_SIGBUS | VM_FAULT_SIGSEGV)) |
| 575 | return -EFAULT; | 575 | return -EFAULT; |
| 576 | BUG(); | 576 | BUG(); |
| 577 | } | 577 | } |
| @@ -376,7 +376,7 @@ static int break_ksm(struct vm_area_struct *vma, unsigned long addr) | |||
| 376 | else | 376 | else |
| 377 | ret = VM_FAULT_WRITE; | 377 | ret = VM_FAULT_WRITE; |
| 378 | put_page(page); | 378 | put_page(page); |
| 379 | } while (!(ret & (VM_FAULT_WRITE | VM_FAULT_SIGBUS | VM_FAULT_OOM))); | 379 | } while (!(ret & (VM_FAULT_WRITE | VM_FAULT_SIGBUS | VM_FAULT_SIGSEGV | VM_FAULT_OOM))); |
| 380 | /* | 380 | /* |
| 381 | * We must loop because handle_mm_fault() may back out if there's | 381 | * We must loop because handle_mm_fault() may back out if there's |
| 382 | * any difficulty e.g. if pte accessed bit gets updated concurrently. | 382 | * any difficulty e.g. if pte accessed bit gets updated concurrently. |
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index ef91e856c7e4..2f6893c2f01b 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 | ||
| @@ -3043,18 +3043,6 @@ static int mem_cgroup_move_swap_account(swp_entry_t entry, | |||
| 3043 | if (swap_cgroup_cmpxchg(entry, old_id, new_id) == old_id) { | 3043 | if (swap_cgroup_cmpxchg(entry, old_id, new_id) == old_id) { |
| 3044 | mem_cgroup_swap_statistics(from, false); | 3044 | mem_cgroup_swap_statistics(from, false); |
| 3045 | mem_cgroup_swap_statistics(to, true); | 3045 | mem_cgroup_swap_statistics(to, true); |
| 3046 | /* | ||
| 3047 | * This function is only called from task migration context now. | ||
| 3048 | * It postpones page_counter and refcount handling till the end | ||
| 3049 | * of task migration(mem_cgroup_clear_mc()) for performance | ||
| 3050 | * improvement. But we cannot postpone css_get(to) because if | ||
| 3051 | * the process that has been moved to @to does swap-in, the | ||
| 3052 | * refcount of @to might be decreased to 0. | ||
| 3053 | * | ||
| 3054 | * We are in attach() phase, so the cgroup is guaranteed to be | ||
| 3055 | * alive, so we can just call css_get(). | ||
| 3056 | */ | ||
| 3057 | css_get(&to->css); | ||
| 3058 | return 0; | 3046 | return 0; |
| 3059 | } | 3047 | } |
| 3060 | return -EINVAL; | 3048 | return -EINVAL; |
| @@ -4679,6 +4667,7 @@ mem_cgroup_css_alloc(struct cgroup_subsys_state *parent_css) | |||
| 4679 | if (parent_css == NULL) { | 4667 | if (parent_css == NULL) { |
| 4680 | root_mem_cgroup = memcg; | 4668 | root_mem_cgroup = memcg; |
| 4681 | page_counter_init(&memcg->memory, NULL); | 4669 | page_counter_init(&memcg->memory, NULL); |
| 4670 | memcg->soft_limit = PAGE_COUNTER_MAX; | ||
| 4682 | page_counter_init(&memcg->memsw, NULL); | 4671 | page_counter_init(&memcg->memsw, NULL); |
| 4683 | page_counter_init(&memcg->kmem, NULL); | 4672 | page_counter_init(&memcg->kmem, NULL); |
| 4684 | } | 4673 | } |
| @@ -4724,6 +4713,7 @@ mem_cgroup_css_online(struct cgroup_subsys_state *css) | |||
| 4724 | 4713 | ||
| 4725 | if (parent->use_hierarchy) { | 4714 | if (parent->use_hierarchy) { |
| 4726 | page_counter_init(&memcg->memory, &parent->memory); | 4715 | page_counter_init(&memcg->memory, &parent->memory); |
| 4716 | memcg->soft_limit = PAGE_COUNTER_MAX; | ||
| 4727 | page_counter_init(&memcg->memsw, &parent->memsw); | 4717 | page_counter_init(&memcg->memsw, &parent->memsw); |
| 4728 | page_counter_init(&memcg->kmem, &parent->kmem); | 4718 | page_counter_init(&memcg->kmem, &parent->kmem); |
| 4729 | 4719 | ||
| @@ -4733,6 +4723,7 @@ mem_cgroup_css_online(struct cgroup_subsys_state *css) | |||
| 4733 | */ | 4723 | */ |
| 4734 | } else { | 4724 | } else { |
| 4735 | page_counter_init(&memcg->memory, NULL); | 4725 | page_counter_init(&memcg->memory, NULL); |
| 4726 | memcg->soft_limit = PAGE_COUNTER_MAX; | ||
| 4736 | page_counter_init(&memcg->memsw, NULL); | 4727 | page_counter_init(&memcg->memsw, NULL); |
| 4737 | page_counter_init(&memcg->kmem, NULL); | 4728 | page_counter_init(&memcg->kmem, NULL); |
| 4738 | /* | 4729 | /* |
| @@ -4807,7 +4798,7 @@ static void mem_cgroup_css_reset(struct cgroup_subsys_state *css) | |||
| 4807 | mem_cgroup_resize_limit(memcg, PAGE_COUNTER_MAX); | 4798 | mem_cgroup_resize_limit(memcg, PAGE_COUNTER_MAX); |
| 4808 | mem_cgroup_resize_memsw_limit(memcg, PAGE_COUNTER_MAX); | 4799 | mem_cgroup_resize_memsw_limit(memcg, PAGE_COUNTER_MAX); |
| 4809 | memcg_update_kmem_limit(memcg, PAGE_COUNTER_MAX); | 4800 | memcg_update_kmem_limit(memcg, PAGE_COUNTER_MAX); |
| 4810 | memcg->soft_limit = 0; | 4801 | memcg->soft_limit = PAGE_COUNTER_MAX; |
| 4811 | } | 4802 | } |
| 4812 | 4803 | ||
| 4813 | #ifdef CONFIG_MMU | 4804 | #ifdef CONFIG_MMU |
| @@ -5782,7 +5773,7 @@ void mem_cgroup_uncharge_list(struct list_head *page_list) | |||
| 5782 | * mem_cgroup_migrate - migrate a charge to another page | 5773 | * mem_cgroup_migrate - migrate a charge to another page |
| 5783 | * @oldpage: currently charged page | 5774 | * @oldpage: currently charged page |
| 5784 | * @newpage: page to transfer the charge to | 5775 | * @newpage: page to transfer the charge to |
| 5785 | * @lrucare: both pages might be on the LRU already | 5776 | * @lrucare: either or both pages might be on the LRU already |
| 5786 | * | 5777 | * |
| 5787 | * Migrate the charge from @oldpage to @newpage. | 5778 | * Migrate the charge from @oldpage to @newpage. |
| 5788 | * | 5779 | * |
diff --git a/mm/memory.c b/mm/memory.c index ca920d1fd314..2c3536cc6c63 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
| @@ -235,6 +235,9 @@ void tlb_gather_mmu(struct mmu_gather *tlb, struct mm_struct *mm, unsigned long | |||
| 235 | 235 | ||
| 236 | static void tlb_flush_mmu_tlbonly(struct mmu_gather *tlb) | 236 | static void tlb_flush_mmu_tlbonly(struct mmu_gather *tlb) |
| 237 | { | 237 | { |
| 238 | if (!tlb->end) | ||
| 239 | return; | ||
| 240 | |||
| 238 | tlb_flush(tlb); | 241 | tlb_flush(tlb); |
| 239 | mmu_notifier_invalidate_range(tlb->mm, tlb->start, tlb->end); | 242 | mmu_notifier_invalidate_range(tlb->mm, tlb->start, tlb->end); |
| 240 | #ifdef CONFIG_HAVE_RCU_TABLE_FREE | 243 | #ifdef CONFIG_HAVE_RCU_TABLE_FREE |
| @@ -247,7 +250,7 @@ static void tlb_flush_mmu_free(struct mmu_gather *tlb) | |||
| 247 | { | 250 | { |
| 248 | struct mmu_gather_batch *batch; | 251 | struct mmu_gather_batch *batch; |
| 249 | 252 | ||
| 250 | for (batch = &tlb->local; batch; batch = batch->next) { | 253 | for (batch = &tlb->local; batch && batch->nr; batch = batch->next) { |
| 251 | free_pages_and_swap_cache(batch->pages, batch->nr); | 254 | free_pages_and_swap_cache(batch->pages, batch->nr); |
| 252 | batch->nr = 0; | 255 | batch->nr = 0; |
| 253 | } | 256 | } |
| @@ -256,9 +259,6 @@ static void tlb_flush_mmu_free(struct mmu_gather *tlb) | |||
| 256 | 259 | ||
| 257 | void tlb_flush_mmu(struct mmu_gather *tlb) | 260 | void tlb_flush_mmu(struct mmu_gather *tlb) |
| 258 | { | 261 | { |
| 259 | if (!tlb->end) | ||
| 260 | return; | ||
| 261 | |||
| 262 | tlb_flush_mmu_tlbonly(tlb); | 262 | tlb_flush_mmu_tlbonly(tlb); |
| 263 | tlb_flush_mmu_free(tlb); | 263 | tlb_flush_mmu_free(tlb); |
| 264 | } | 264 | } |
| @@ -2137,17 +2137,24 @@ reuse: | |||
| 2137 | if (!dirty_page) | 2137 | if (!dirty_page) |
| 2138 | return ret; | 2138 | return ret; |
| 2139 | 2139 | ||
| 2140 | /* | ||
| 2141 | * Yes, Virginia, this is actually required to prevent a race | ||
| 2142 | * with clear_page_dirty_for_io() from clearing the page dirty | ||
| 2143 | * bit after it clear all dirty ptes, but before a racing | ||
| 2144 | * do_wp_page installs a dirty pte. | ||
| 2145 | * | ||
| 2146 | * do_shared_fault is protected similarly. | ||
| 2147 | */ | ||
| 2148 | if (!page_mkwrite) { | 2140 | if (!page_mkwrite) { |
| 2149 | wait_on_page_locked(dirty_page); | 2141 | struct address_space *mapping; |
| 2150 | set_page_dirty_balance(dirty_page); | 2142 | int dirtied; |
| 2143 | |||
| 2144 | lock_page(dirty_page); | ||
| 2145 | dirtied = set_page_dirty(dirty_page); | ||
| 2146 | VM_BUG_ON_PAGE(PageAnon(dirty_page), dirty_page); | ||
| 2147 | mapping = dirty_page->mapping; | ||
| 2148 | unlock_page(dirty_page); | ||
| 2149 | |||
| 2150 | if (dirtied && mapping) { | ||
| 2151 | /* | ||
| 2152 | * Some device drivers do not set page.mapping | ||
| 2153 | * but still dirty their pages | ||
| 2154 | */ | ||
| 2155 | balance_dirty_pages_ratelimited(mapping); | ||
| 2156 | } | ||
| 2157 | |||
| 2151 | /* file_update_time outside page_lock */ | 2158 | /* file_update_time outside page_lock */ |
| 2152 | if (vma->vm_file) | 2159 | if (vma->vm_file) |
| 2153 | file_update_time(vma->vm_file); | 2160 | file_update_time(vma->vm_file); |
| @@ -2593,7 +2600,7 @@ static inline int check_stack_guard_page(struct vm_area_struct *vma, unsigned lo | |||
| 2593 | if (prev && prev->vm_end == address) | 2600 | if (prev && prev->vm_end == address) |
| 2594 | return prev->vm_flags & VM_GROWSDOWN ? 0 : -ENOMEM; | 2601 | return prev->vm_flags & VM_GROWSDOWN ? 0 : -ENOMEM; |
| 2595 | 2602 | ||
| 2596 | expand_downwards(vma, address - PAGE_SIZE); | 2603 | return expand_downwards(vma, address - PAGE_SIZE); |
| 2597 | } | 2604 | } |
| 2598 | if ((vma->vm_flags & VM_GROWSUP) && address + PAGE_SIZE == vma->vm_end) { | 2605 | if ((vma->vm_flags & VM_GROWSUP) && address + PAGE_SIZE == vma->vm_end) { |
| 2599 | struct vm_area_struct *next = vma->vm_next; | 2606 | struct vm_area_struct *next = vma->vm_next; |
| @@ -2602,7 +2609,7 @@ static inline int check_stack_guard_page(struct vm_area_struct *vma, unsigned lo | |||
| 2602 | if (next && next->vm_start == address + PAGE_SIZE) | 2609 | if (next && next->vm_start == address + PAGE_SIZE) |
| 2603 | return next->vm_flags & VM_GROWSUP ? 0 : -ENOMEM; | 2610 | return next->vm_flags & VM_GROWSUP ? 0 : -ENOMEM; |
| 2604 | 2611 | ||
| 2605 | expand_upwards(vma, address + PAGE_SIZE); | 2612 | return expand_upwards(vma, address + PAGE_SIZE); |
| 2606 | } | 2613 | } |
| 2607 | return 0; | 2614 | return 0; |
| 2608 | } | 2615 | } |
| @@ -2625,7 +2632,7 @@ static int do_anonymous_page(struct mm_struct *mm, struct vm_area_struct *vma, | |||
| 2625 | 2632 | ||
| 2626 | /* Check if we need to add a guard page to the stack */ | 2633 | /* Check if we need to add a guard page to the stack */ |
| 2627 | if (check_stack_guard_page(vma, address) < 0) | 2634 | if (check_stack_guard_page(vma, address) < 0) |
| 2628 | return VM_FAULT_SIGBUS; | 2635 | return VM_FAULT_SIGSEGV; |
| 2629 | 2636 | ||
| 2630 | /* Use the zero-page for reads */ | 2637 | /* Use the zero-page for reads */ |
| 2631 | if (!(flags & FAULT_FLAG_WRITE) && !mm_forbids_zeropage(mm)) { | 2638 | if (!(flags & FAULT_FLAG_WRITE) && !mm_forbids_zeropage(mm)) { |
| @@ -778,10 +778,12 @@ again: remove_next = 1 + (end > next->vm_end); | |||
| 778 | if (exporter && exporter->anon_vma && !importer->anon_vma) { | 778 | if (exporter && exporter->anon_vma && !importer->anon_vma) { |
| 779 | int error; | 779 | int error; |
| 780 | 780 | ||
| 781 | importer->anon_vma = exporter->anon_vma; | ||
| 781 | error = anon_vma_clone(importer, exporter); | 782 | error = anon_vma_clone(importer, exporter); |
| 782 | if (error) | 783 | if (error) { |
| 784 | importer->anon_vma = NULL; | ||
| 783 | return error; | 785 | return error; |
| 784 | importer->anon_vma = exporter->anon_vma; | 786 | } |
| 785 | } | 787 | } |
| 786 | } | 788 | } |
| 787 | 789 | ||
| @@ -2099,14 +2101,17 @@ static int acct_stack_growth(struct vm_area_struct *vma, unsigned long size, uns | |||
| 2099 | { | 2101 | { |
| 2100 | struct mm_struct *mm = vma->vm_mm; | 2102 | struct mm_struct *mm = vma->vm_mm; |
| 2101 | struct rlimit *rlim = current->signal->rlim; | 2103 | struct rlimit *rlim = current->signal->rlim; |
| 2102 | unsigned long new_start; | 2104 | unsigned long new_start, actual_size; |
| 2103 | 2105 | ||
| 2104 | /* address space limit tests */ | 2106 | /* address space limit tests */ |
| 2105 | if (!may_expand_vm(mm, grow)) | 2107 | if (!may_expand_vm(mm, grow)) |
| 2106 | return -ENOMEM; | 2108 | return -ENOMEM; |
| 2107 | 2109 | ||
| 2108 | /* Stack limit test */ | 2110 | /* Stack limit test */ |
| 2109 | if (size > ACCESS_ONCE(rlim[RLIMIT_STACK].rlim_cur)) | 2111 | actual_size = size; |
| 2112 | if (size && (vma->vm_flags & (VM_GROWSUP | VM_GROWSDOWN))) | ||
| 2113 | actual_size -= PAGE_SIZE; | ||
| 2114 | if (actual_size > ACCESS_ONCE(rlim[RLIMIT_STACK].rlim_cur)) | ||
| 2110 | return -ENOMEM; | 2115 | return -ENOMEM; |
| 2111 | 2116 | ||
| 2112 | /* mlock limit tests */ | 2117 | /* mlock limit tests */ |
diff --git a/mm/nommu.c b/mm/nommu.c index b51eadf6d952..28bd8c4dff6f 100644 --- a/mm/nommu.c +++ b/mm/nommu.c | |||
| @@ -59,6 +59,7 @@ | |||
| 59 | #endif | 59 | #endif |
| 60 | 60 | ||
| 61 | void *high_memory; | 61 | void *high_memory; |
| 62 | EXPORT_SYMBOL(high_memory); | ||
| 62 | struct page *mem_map; | 63 | struct page *mem_map; |
| 63 | unsigned long max_mapnr; | 64 | unsigned long max_mapnr; |
| 64 | unsigned long highest_memmap_pfn; | 65 | unsigned long highest_memmap_pfn; |
diff --git a/mm/page-writeback.c b/mm/page-writeback.c index d5d81f5384d1..6f4335238e33 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c | |||
| @@ -1541,16 +1541,6 @@ pause: | |||
| 1541 | bdi_start_background_writeback(bdi); | 1541 | bdi_start_background_writeback(bdi); |
| 1542 | } | 1542 | } |
| 1543 | 1543 | ||
| 1544 | void set_page_dirty_balance(struct page *page) | ||
| 1545 | { | ||
| 1546 | if (set_page_dirty(page)) { | ||
| 1547 | struct address_space *mapping = page_mapping(page); | ||
| 1548 | |||
| 1549 | if (mapping) | ||
| 1550 | balance_dirty_pages_ratelimited(mapping); | ||
| 1551 | } | ||
| 1552 | } | ||
| 1553 | |||
| 1554 | static DEFINE_PER_CPU(int, bdp_ratelimits); | 1544 | static DEFINE_PER_CPU(int, bdp_ratelimits); |
| 1555 | 1545 | ||
| 1556 | /* | 1546 | /* |
| @@ -2123,32 +2113,25 @@ EXPORT_SYMBOL(account_page_dirtied); | |||
| 2123 | * page dirty in that case, but not all the buffers. This is a "bottom-up" | 2113 | * page dirty in that case, but not all the buffers. This is a "bottom-up" |
| 2124 | * dirtying, whereas __set_page_dirty_buffers() is a "top-down" dirtying. | 2114 | * dirtying, whereas __set_page_dirty_buffers() is a "top-down" dirtying. |
| 2125 | * | 2115 | * |
| 2126 | * Most callers have locked the page, which pins the address_space in memory. | 2116 | * The caller must ensure this doesn't race with truncation. Most will simply |
| 2127 | * But zap_pte_range() does not lock the page, however in that case the | 2117 | * hold the page lock, but e.g. zap_pte_range() calls with the page mapped and |
| 2128 | * mapping is pinned by the vma's ->vm_file reference. | 2118 | * the pte lock held, which also locks out truncation. |
| 2129 | * | ||
| 2130 | * We take care to handle the case where the page was truncated from the | ||
| 2131 | * mapping by re-checking page_mapping() inside tree_lock. | ||
| 2132 | */ | 2119 | */ |
| 2133 | int __set_page_dirty_nobuffers(struct page *page) | 2120 | int __set_page_dirty_nobuffers(struct page *page) |
| 2134 | { | 2121 | { |
| 2135 | if (!TestSetPageDirty(page)) { | 2122 | if (!TestSetPageDirty(page)) { |
| 2136 | struct address_space *mapping = page_mapping(page); | 2123 | struct address_space *mapping = page_mapping(page); |
| 2137 | struct address_space *mapping2; | ||
| 2138 | unsigned long flags; | 2124 | unsigned long flags; |
| 2139 | 2125 | ||
| 2140 | if (!mapping) | 2126 | if (!mapping) |
| 2141 | return 1; | 2127 | return 1; |
| 2142 | 2128 | ||
| 2143 | spin_lock_irqsave(&mapping->tree_lock, flags); | 2129 | spin_lock_irqsave(&mapping->tree_lock, flags); |
| 2144 | mapping2 = page_mapping(page); | 2130 | BUG_ON(page_mapping(page) != mapping); |
| 2145 | if (mapping2) { /* Race with truncate? */ | 2131 | WARN_ON_ONCE(!PagePrivate(page) && !PageUptodate(page)); |
| 2146 | BUG_ON(mapping2 != mapping); | 2132 | account_page_dirtied(page, mapping); |
| 2147 | WARN_ON_ONCE(!PagePrivate(page) && !PageUptodate(page)); | 2133 | radix_tree_tag_set(&mapping->page_tree, page_index(page), |
| 2148 | account_page_dirtied(page, mapping); | 2134 | PAGECACHE_TAG_DIRTY); |
| 2149 | radix_tree_tag_set(&mapping->page_tree, | ||
| 2150 | page_index(page), PAGECACHE_TAG_DIRTY); | ||
| 2151 | } | ||
| 2152 | spin_unlock_irqrestore(&mapping->tree_lock, flags); | 2135 | spin_unlock_irqrestore(&mapping->tree_lock, flags); |
| 2153 | if (mapping->host) { | 2136 | if (mapping->host) { |
| 2154 | /* !PageAnon && !swapper_space */ | 2137 | /* !PageAnon && !swapper_space */ |
| @@ -2305,12 +2288,10 @@ int clear_page_dirty_for_io(struct page *page) | |||
| 2305 | /* | 2288 | /* |
| 2306 | * We carefully synchronise fault handlers against | 2289 | * We carefully synchronise fault handlers against |
| 2307 | * installing a dirty pte and marking the page dirty | 2290 | * installing a dirty pte and marking the page dirty |
| 2308 | * at this point. We do this by having them hold the | 2291 | * at this point. We do this by having them hold the |
| 2309 | * page lock at some point after installing their | 2292 | * page lock while dirtying the page, and pages are |
| 2310 | * pte, but before marking the page dirty. | 2293 | * always locked coming in here, so we get the desired |
| 2311 | * Pages are always locked coming in here, so we get | 2294 | * exclusion. |
| 2312 | * the desired exclusion. See mm/memory.c:do_wp_page() | ||
| 2313 | * for more comments. | ||
| 2314 | */ | 2295 | */ |
| 2315 | if (TestClearPageDirty(page)) { | 2296 | if (TestClearPageDirty(page)) { |
| 2316 | dec_zone_page_state(page, NR_FILE_DIRTY); | 2297 | dec_zone_page_state(page, NR_FILE_DIRTY); |
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/pagewalk.c b/mm/pagewalk.c index ad83195521f2..b264bda46e1b 100644 --- a/mm/pagewalk.c +++ b/mm/pagewalk.c | |||
| @@ -199,7 +199,10 @@ int walk_page_range(unsigned long addr, unsigned long end, | |||
| 199 | */ | 199 | */ |
| 200 | if ((vma->vm_start <= addr) && | 200 | if ((vma->vm_start <= addr) && |
| 201 | (vma->vm_flags & VM_PFNMAP)) { | 201 | (vma->vm_flags & VM_PFNMAP)) { |
| 202 | next = vma->vm_end; | 202 | if (walk->pte_hole) |
| 203 | err = walk->pte_hole(addr, next, walk); | ||
| 204 | if (err) | ||
| 205 | break; | ||
| 203 | pgd = pgd_offset(walk->mm, next); | 206 | pgd = pgd_offset(walk->mm, next); |
| 204 | continue; | 207 | continue; |
| 205 | } | 208 | } |
| @@ -72,6 +72,8 @@ static inline struct anon_vma *anon_vma_alloc(void) | |||
| 72 | anon_vma = kmem_cache_alloc(anon_vma_cachep, GFP_KERNEL); | 72 | anon_vma = kmem_cache_alloc(anon_vma_cachep, GFP_KERNEL); |
| 73 | if (anon_vma) { | 73 | if (anon_vma) { |
| 74 | atomic_set(&anon_vma->refcount, 1); | 74 | atomic_set(&anon_vma->refcount, 1); |
| 75 | anon_vma->degree = 1; /* Reference for first vma */ | ||
| 76 | anon_vma->parent = anon_vma; | ||
| 75 | /* | 77 | /* |
| 76 | * Initialise the anon_vma root to point to itself. If called | 78 | * Initialise the anon_vma root to point to itself. If called |
| 77 | * from fork, the root will be reset to the parents anon_vma. | 79 | * from fork, the root will be reset to the parents anon_vma. |
| @@ -188,6 +190,8 @@ int anon_vma_prepare(struct vm_area_struct *vma) | |||
| 188 | if (likely(!vma->anon_vma)) { | 190 | if (likely(!vma->anon_vma)) { |
| 189 | vma->anon_vma = anon_vma; | 191 | vma->anon_vma = anon_vma; |
| 190 | anon_vma_chain_link(vma, avc, anon_vma); | 192 | anon_vma_chain_link(vma, avc, anon_vma); |
| 193 | /* vma reference or self-parent link for new root */ | ||
| 194 | anon_vma->degree++; | ||
| 191 | allocated = NULL; | 195 | allocated = NULL; |
| 192 | avc = NULL; | 196 | avc = NULL; |
| 193 | } | 197 | } |
| @@ -236,6 +240,14 @@ static inline void unlock_anon_vma_root(struct anon_vma *root) | |||
| 236 | /* | 240 | /* |
| 237 | * Attach the anon_vmas from src to dst. | 241 | * Attach the anon_vmas from src to dst. |
| 238 | * Returns 0 on success, -ENOMEM on failure. | 242 | * Returns 0 on success, -ENOMEM on failure. |
| 243 | * | ||
| 244 | * If dst->anon_vma is NULL this function tries to find and reuse existing | ||
| 245 | * anon_vma which has no vmas and only one child anon_vma. This prevents | ||
| 246 | * degradation of anon_vma hierarchy to endless linear chain in case of | ||
| 247 | * constantly forking task. On the other hand, an anon_vma with more than one | ||
| 248 | * child isn't reused even if there was no alive vma, thus rmap walker has a | ||
| 249 | * good chance of avoiding scanning the whole hierarchy when it searches where | ||
| 250 | * page is mapped. | ||
| 239 | */ | 251 | */ |
| 240 | int anon_vma_clone(struct vm_area_struct *dst, struct vm_area_struct *src) | 252 | int anon_vma_clone(struct vm_area_struct *dst, struct vm_area_struct *src) |
| 241 | { | 253 | { |
| @@ -256,7 +268,21 @@ int anon_vma_clone(struct vm_area_struct *dst, struct vm_area_struct *src) | |||
| 256 | anon_vma = pavc->anon_vma; | 268 | anon_vma = pavc->anon_vma; |
| 257 | root = lock_anon_vma_root(root, anon_vma); | 269 | root = lock_anon_vma_root(root, anon_vma); |
| 258 | anon_vma_chain_link(dst, avc, anon_vma); | 270 | anon_vma_chain_link(dst, avc, anon_vma); |
| 271 | |||
| 272 | /* | ||
| 273 | * Reuse existing anon_vma if its degree lower than two, | ||
| 274 | * that means it has no vma and only one anon_vma child. | ||
| 275 | * | ||
| 276 | * Do not chose parent anon_vma, otherwise first child | ||
| 277 | * will always reuse it. Root anon_vma is never reused: | ||
| 278 | * it has self-parent reference and at least one child. | ||
| 279 | */ | ||
| 280 | if (!dst->anon_vma && anon_vma != src->anon_vma && | ||
| 281 | anon_vma->degree < 2) | ||
| 282 | dst->anon_vma = anon_vma; | ||
| 259 | } | 283 | } |
| 284 | if (dst->anon_vma) | ||
| 285 | dst->anon_vma->degree++; | ||
| 260 | unlock_anon_vma_root(root); | 286 | unlock_anon_vma_root(root); |
| 261 | return 0; | 287 | return 0; |
| 262 | 288 | ||
| @@ -280,6 +306,9 @@ int anon_vma_fork(struct vm_area_struct *vma, struct vm_area_struct *pvma) | |||
| 280 | if (!pvma->anon_vma) | 306 | if (!pvma->anon_vma) |
| 281 | return 0; | 307 | return 0; |
| 282 | 308 | ||
| 309 | /* Drop inherited anon_vma, we'll reuse existing or allocate new. */ | ||
| 310 | vma->anon_vma = NULL; | ||
| 311 | |||
| 283 | /* | 312 | /* |
| 284 | * First, attach the new VMA to the parent VMA's anon_vmas, | 313 | * First, attach the new VMA to the parent VMA's anon_vmas, |
| 285 | * so rmap can find non-COWed pages in child processes. | 314 | * so rmap can find non-COWed pages in child processes. |
| @@ -288,6 +317,10 @@ int anon_vma_fork(struct vm_area_struct *vma, struct vm_area_struct *pvma) | |||
| 288 | if (error) | 317 | if (error) |
| 289 | return error; | 318 | return error; |
| 290 | 319 | ||
| 320 | /* An existing anon_vma has been reused, all done then. */ | ||
| 321 | if (vma->anon_vma) | ||
| 322 | return 0; | ||
| 323 | |||
| 291 | /* Then add our own anon_vma. */ | 324 | /* Then add our own anon_vma. */ |
| 292 | anon_vma = anon_vma_alloc(); | 325 | anon_vma = anon_vma_alloc(); |
| 293 | if (!anon_vma) | 326 | if (!anon_vma) |
| @@ -301,6 +334,7 @@ int anon_vma_fork(struct vm_area_struct *vma, struct vm_area_struct *pvma) | |||
| 301 | * lock any of the anon_vmas in this anon_vma tree. | 334 | * lock any of the anon_vmas in this anon_vma tree. |
| 302 | */ | 335 | */ |
| 303 | anon_vma->root = pvma->anon_vma->root; | 336 | anon_vma->root = pvma->anon_vma->root; |
| 337 | anon_vma->parent = pvma->anon_vma; | ||
| 304 | /* | 338 | /* |
| 305 | * With refcounts, an anon_vma can stay around longer than the | 339 | * With refcounts, an anon_vma can stay around longer than the |
| 306 | * process it belongs to. The root anon_vma needs to be pinned until | 340 | * process it belongs to. The root anon_vma needs to be pinned until |
| @@ -311,6 +345,7 @@ int anon_vma_fork(struct vm_area_struct *vma, struct vm_area_struct *pvma) | |||
| 311 | vma->anon_vma = anon_vma; | 345 | vma->anon_vma = anon_vma; |
| 312 | anon_vma_lock_write(anon_vma); | 346 | anon_vma_lock_write(anon_vma); |
| 313 | anon_vma_chain_link(vma, avc, anon_vma); | 347 | anon_vma_chain_link(vma, avc, anon_vma); |
| 348 | anon_vma->parent->degree++; | ||
| 314 | anon_vma_unlock_write(anon_vma); | 349 | anon_vma_unlock_write(anon_vma); |
| 315 | 350 | ||
| 316 | return 0; | 351 | return 0; |
| @@ -341,12 +376,16 @@ void unlink_anon_vmas(struct vm_area_struct *vma) | |||
| 341 | * Leave empty anon_vmas on the list - we'll need | 376 | * Leave empty anon_vmas on the list - we'll need |
| 342 | * to free them outside the lock. | 377 | * to free them outside the lock. |
| 343 | */ | 378 | */ |
| 344 | if (RB_EMPTY_ROOT(&anon_vma->rb_root)) | 379 | if (RB_EMPTY_ROOT(&anon_vma->rb_root)) { |
| 380 | anon_vma->parent->degree--; | ||
| 345 | continue; | 381 | continue; |
| 382 | } | ||
| 346 | 383 | ||
| 347 | list_del(&avc->same_vma); | 384 | list_del(&avc->same_vma); |
| 348 | anon_vma_chain_free(avc); | 385 | anon_vma_chain_free(avc); |
| 349 | } | 386 | } |
| 387 | if (vma->anon_vma) | ||
| 388 | vma->anon_vma->degree--; | ||
| 350 | unlock_anon_vma_root(root); | 389 | unlock_anon_vma_root(root); |
| 351 | 390 | ||
| 352 | /* | 391 | /* |
| @@ -357,6 +396,7 @@ void unlink_anon_vmas(struct vm_area_struct *vma) | |||
| 357 | list_for_each_entry_safe(avc, next, &vma->anon_vma_chain, same_vma) { | 396 | list_for_each_entry_safe(avc, next, &vma->anon_vma_chain, same_vma) { |
| 358 | struct anon_vma *anon_vma = avc->anon_vma; | 397 | struct anon_vma *anon_vma = avc->anon_vma; |
| 359 | 398 | ||
| 399 | BUG_ON(anon_vma->degree); | ||
| 360 | put_anon_vma(anon_vma); | 400 | put_anon_vma(anon_vma); |
| 361 | 401 | ||
| 362 | list_del(&avc->same_vma); | 402 | list_del(&avc->same_vma); |
diff --git a/mm/shmem.c b/mm/shmem.c index 73ba1df7c8ba..993e6ba689cc 100644 --- a/mm/shmem.c +++ b/mm/shmem.c | |||
| @@ -1013,7 +1013,7 @@ static int shmem_replace_page(struct page **pagep, gfp_t gfp, | |||
| 1013 | */ | 1013 | */ |
| 1014 | oldpage = newpage; | 1014 | oldpage = newpage; |
| 1015 | } else { | 1015 | } else { |
| 1016 | mem_cgroup_migrate(oldpage, newpage, false); | 1016 | mem_cgroup_migrate(oldpage, newpage, true); |
| 1017 | lru_cache_add_anon(newpage); | 1017 | lru_cache_add_anon(newpage); |
| 1018 | *pagep = newpage; | 1018 | *pagep = newpage; |
| 1019 | } | 1019 | } |
diff --git a/mm/vmscan.c b/mm/vmscan.c index bd9a72bc4a1b..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 | ||
| @@ -2921,18 +2921,20 @@ static bool prepare_kswapd_sleep(pg_data_t *pgdat, int order, long remaining, | |||
| 2921 | return false; | 2921 | return false; |
| 2922 | 2922 | ||
| 2923 | /* | 2923 | /* |
| 2924 | * There is a potential race between when kswapd checks its watermarks | 2924 | * The throttled processes are normally woken up in balance_pgdat() as |
| 2925 | * and a process gets throttled. There is also a potential race if | 2925 | * soon as pfmemalloc_watermark_ok() is true. But there is a potential |
| 2926 | * processes get throttled, kswapd wakes, a large process exits therby | 2926 | * race between when kswapd checks the watermarks and a process gets |
| 2927 | * balancing the zones that causes kswapd to miss a wakeup. If kswapd | 2927 | * throttled. There is also a potential race if processes get |
| 2928 | * is going to sleep, no process should be sleeping on pfmemalloc_wait | 2928 | * throttled, kswapd wakes, a large process exits thereby balancing the |
| 2929 | * so wake them now if necessary. If necessary, processes will wake | 2929 | * zones, which causes kswapd to exit balance_pgdat() before reaching |
| 2930 | * kswapd and get throttled again | 2930 | * the wake up checks. If kswapd is going to sleep, no process should |
| 2931 | * be sleeping on pfmemalloc_wait, so wake them now if necessary. If | ||
| 2932 | * the wake up is premature, processes will wake kswapd and get | ||
| 2933 | * throttled again. The difference from wake ups in balance_pgdat() is | ||
| 2934 | * that here we are under prepare_to_wait(). | ||
| 2931 | */ | 2935 | */ |
| 2932 | if (waitqueue_active(&pgdat->pfmemalloc_wait)) { | 2936 | if (waitqueue_active(&pgdat->pfmemalloc_wait)) |
| 2933 | wake_up(&pgdat->pfmemalloc_wait); | 2937 | wake_up_all(&pgdat->pfmemalloc_wait); |
| 2934 | return false; | ||
| 2935 | } | ||
| 2936 | 2938 | ||
| 2937 | return pgdat_balanced(pgdat, order, classzone_idx); | 2939 | return pgdat_balanced(pgdat, order, classzone_idx); |
| 2938 | } | 2940 | } |
diff --git a/net/batman-adv/multicast.c b/net/batman-adv/multicast.c index ab6bb2af1d45..b24e4bb64fb5 100644 --- a/net/batman-adv/multicast.c +++ b/net/batman-adv/multicast.c | |||
| @@ -685,11 +685,13 @@ static void batadv_mcast_tvlv_ogm_handler_v1(struct batadv_priv *bat_priv, | |||
| 685 | if (orig_initialized) | 685 | if (orig_initialized) |
| 686 | atomic_dec(&bat_priv->mcast.num_disabled); | 686 | atomic_dec(&bat_priv->mcast.num_disabled); |
| 687 | orig->capabilities |= BATADV_ORIG_CAPA_HAS_MCAST; | 687 | orig->capabilities |= BATADV_ORIG_CAPA_HAS_MCAST; |
| 688 | /* If mcast support is being switched off increase the disabled | 688 | /* If mcast support is being switched off or if this is an initial |
| 689 | * mcast node counter. | 689 | * OGM without mcast support then increase the disabled mcast |
| 690 | * node counter. | ||
| 690 | */ | 691 | */ |
| 691 | } else if (!orig_mcast_enabled && | 692 | } else if (!orig_mcast_enabled && |
| 692 | orig->capabilities & BATADV_ORIG_CAPA_HAS_MCAST) { | 693 | (orig->capabilities & BATADV_ORIG_CAPA_HAS_MCAST || |
| 694 | !orig_initialized)) { | ||
| 693 | atomic_inc(&bat_priv->mcast.num_disabled); | 695 | atomic_inc(&bat_priv->mcast.num_disabled); |
| 694 | orig->capabilities &= ~BATADV_ORIG_CAPA_HAS_MCAST; | 696 | orig->capabilities &= ~BATADV_ORIG_CAPA_HAS_MCAST; |
| 695 | } | 697 | } |
| @@ -738,7 +740,8 @@ void batadv_mcast_purge_orig(struct batadv_orig_node *orig) | |||
| 738 | { | 740 | { |
| 739 | struct batadv_priv *bat_priv = orig->bat_priv; | 741 | struct batadv_priv *bat_priv = orig->bat_priv; |
| 740 | 742 | ||
| 741 | if (!(orig->capabilities & BATADV_ORIG_CAPA_HAS_MCAST)) | 743 | if (!(orig->capabilities & BATADV_ORIG_CAPA_HAS_MCAST) && |
| 744 | orig->capa_initialized & BATADV_ORIG_CAPA_HAS_MCAST) | ||
| 742 | atomic_dec(&bat_priv->mcast.num_disabled); | 745 | atomic_dec(&bat_priv->mcast.num_disabled); |
| 743 | 746 | ||
| 744 | batadv_mcast_want_unsnoop_update(bat_priv, orig, BATADV_NO_FLAGS); | 747 | batadv_mcast_want_unsnoop_update(bat_priv, orig, BATADV_NO_FLAGS); |
diff --git a/net/batman-adv/network-coding.c b/net/batman-adv/network-coding.c index 8d04d174669e..fab47f1f3ef9 100644 --- a/net/batman-adv/network-coding.c +++ b/net/batman-adv/network-coding.c | |||
| @@ -133,7 +133,7 @@ int batadv_nc_mesh_init(struct batadv_priv *bat_priv) | |||
| 133 | if (!bat_priv->nc.decoding_hash) | 133 | if (!bat_priv->nc.decoding_hash) |
| 134 | goto err; | 134 | goto err; |
| 135 | 135 | ||
| 136 | batadv_hash_set_lock_class(bat_priv->nc.coding_hash, | 136 | batadv_hash_set_lock_class(bat_priv->nc.decoding_hash, |
| 137 | &batadv_nc_decoding_hash_lock_class_key); | 137 | &batadv_nc_decoding_hash_lock_class_key); |
| 138 | 138 | ||
| 139 | INIT_DELAYED_WORK(&bat_priv->nc.work, batadv_nc_worker); | 139 | INIT_DELAYED_WORK(&bat_priv->nc.work, batadv_nc_worker); |
diff --git a/net/batman-adv/originator.c b/net/batman-adv/originator.c index 6a484514cd3e..bea8198d0198 100644 --- a/net/batman-adv/originator.c +++ b/net/batman-adv/originator.c | |||
| @@ -570,9 +570,6 @@ static void batadv_orig_node_free_rcu(struct rcu_head *rcu) | |||
| 570 | 570 | ||
| 571 | batadv_frag_purge_orig(orig_node, NULL); | 571 | batadv_frag_purge_orig(orig_node, NULL); |
| 572 | 572 | ||
| 573 | batadv_tt_global_del_orig(orig_node->bat_priv, orig_node, -1, | ||
| 574 | "originator timed out"); | ||
| 575 | |||
| 576 | if (orig_node->bat_priv->bat_algo_ops->bat_orig_free) | 573 | if (orig_node->bat_priv->bat_algo_ops->bat_orig_free) |
| 577 | orig_node->bat_priv->bat_algo_ops->bat_orig_free(orig_node); | 574 | orig_node->bat_priv->bat_algo_ops->bat_orig_free(orig_node); |
| 578 | 575 | ||
| @@ -678,6 +675,7 @@ struct batadv_orig_node *batadv_orig_node_new(struct batadv_priv *bat_priv, | |||
| 678 | atomic_set(&orig_node->last_ttvn, 0); | 675 | atomic_set(&orig_node->last_ttvn, 0); |
| 679 | orig_node->tt_buff = NULL; | 676 | orig_node->tt_buff = NULL; |
| 680 | orig_node->tt_buff_len = 0; | 677 | orig_node->tt_buff_len = 0; |
| 678 | orig_node->last_seen = jiffies; | ||
| 681 | reset_time = jiffies - 1 - msecs_to_jiffies(BATADV_RESET_PROTECTION_MS); | 679 | reset_time = jiffies - 1 - msecs_to_jiffies(BATADV_RESET_PROTECTION_MS); |
| 682 | orig_node->bcast_seqno_reset = reset_time; | 680 | orig_node->bcast_seqno_reset = reset_time; |
| 683 | #ifdef CONFIG_BATMAN_ADV_MCAST | 681 | #ifdef CONFIG_BATMAN_ADV_MCAST |
| @@ -977,6 +975,9 @@ static void _batadv_purge_orig(struct batadv_priv *bat_priv) | |||
| 977 | if (batadv_purge_orig_node(bat_priv, orig_node)) { | 975 | if (batadv_purge_orig_node(bat_priv, orig_node)) { |
| 978 | batadv_gw_node_delete(bat_priv, orig_node); | 976 | batadv_gw_node_delete(bat_priv, orig_node); |
| 979 | hlist_del_rcu(&orig_node->hash_entry); | 977 | hlist_del_rcu(&orig_node->hash_entry); |
| 978 | batadv_tt_global_del_orig(orig_node->bat_priv, | ||
| 979 | orig_node, -1, | ||
| 980 | "originator timed out"); | ||
| 980 | batadv_orig_node_free_ref(orig_node); | 981 | batadv_orig_node_free_ref(orig_node); |
| 981 | continue; | 982 | continue; |
| 982 | } | 983 | } |
diff --git a/net/batman-adv/routing.c b/net/batman-adv/routing.c index 35f76f2f7824..6648f321864d 100644 --- a/net/batman-adv/routing.c +++ b/net/batman-adv/routing.c | |||
| @@ -443,11 +443,13 @@ batadv_find_router(struct batadv_priv *bat_priv, | |||
| 443 | 443 | ||
| 444 | router = batadv_orig_router_get(orig_node, recv_if); | 444 | router = batadv_orig_router_get(orig_node, recv_if); |
| 445 | 445 | ||
| 446 | if (!router) | ||
| 447 | return router; | ||
| 448 | |||
| 446 | /* only consider bonding for recv_if == BATADV_IF_DEFAULT (first hop) | 449 | /* only consider bonding for recv_if == BATADV_IF_DEFAULT (first hop) |
| 447 | * and if activated. | 450 | * and if activated. |
| 448 | */ | 451 | */ |
| 449 | if (recv_if == BATADV_IF_DEFAULT || !atomic_read(&bat_priv->bonding) || | 452 | if (!(recv_if == BATADV_IF_DEFAULT && atomic_read(&bat_priv->bonding))) |
| 450 | !router) | ||
| 451 | return router; | 453 | return router; |
| 452 | 454 | ||
| 453 | /* bonding: loop through the list of possible routers found | 455 | /* bonding: loop through the list of possible routers found |
diff --git a/net/bridge/br_input.c b/net/bridge/br_input.c index 1f1de715197c..e2aa7be3a847 100644 --- a/net/bridge/br_input.c +++ b/net/bridge/br_input.c | |||
| @@ -154,7 +154,8 @@ int br_handle_frame_finish(struct sk_buff *skb) | |||
| 154 | dst = NULL; | 154 | dst = NULL; |
| 155 | 155 | ||
| 156 | if (is_broadcast_ether_addr(dest)) { | 156 | if (is_broadcast_ether_addr(dest)) { |
| 157 | if (p->flags & BR_PROXYARP && | 157 | if (IS_ENABLED(CONFIG_INET) && |
| 158 | p->flags & BR_PROXYARP && | ||
| 158 | skb->protocol == htons(ETH_P_ARP)) | 159 | skb->protocol == htons(ETH_P_ARP)) |
| 159 | br_do_proxy_arp(skb, br, vid); | 160 | br_do_proxy_arp(skb, br, vid); |
| 160 | 161 | ||
diff --git a/net/bridge/netfilter/nft_reject_bridge.c b/net/bridge/netfilter/nft_reject_bridge.c index b0330aecbf97..3244aead0926 100644 --- a/net/bridge/netfilter/nft_reject_bridge.c +++ b/net/bridge/netfilter/nft_reject_bridge.c | |||
| @@ -265,22 +265,12 @@ out: | |||
| 265 | data[NFT_REG_VERDICT].verdict = NF_DROP; | 265 | data[NFT_REG_VERDICT].verdict = NF_DROP; |
| 266 | } | 266 | } |
| 267 | 267 | ||
| 268 | static int nft_reject_bridge_validate_hooks(const struct nft_chain *chain) | 268 | static int nft_reject_bridge_validate(const struct nft_ctx *ctx, |
| 269 | const struct nft_expr *expr, | ||
| 270 | const struct nft_data **data) | ||
| 269 | { | 271 | { |
| 270 | struct nft_base_chain *basechain; | 272 | return nft_chain_validate_hooks(ctx->chain, (1 << NF_BR_PRE_ROUTING) | |
| 271 | 273 | (1 << NF_BR_LOCAL_IN)); | |
| 272 | if (chain->flags & NFT_BASE_CHAIN) { | ||
| 273 | basechain = nft_base_chain(chain); | ||
| 274 | |||
| 275 | switch (basechain->ops[0].hooknum) { | ||
| 276 | case NF_BR_PRE_ROUTING: | ||
| 277 | case NF_BR_LOCAL_IN: | ||
| 278 | break; | ||
| 279 | default: | ||
| 280 | return -EOPNOTSUPP; | ||
| 281 | } | ||
| 282 | } | ||
| 283 | return 0; | ||
| 284 | } | 274 | } |
| 285 | 275 | ||
| 286 | static int nft_reject_bridge_init(const struct nft_ctx *ctx, | 276 | static int nft_reject_bridge_init(const struct nft_ctx *ctx, |
| @@ -290,7 +280,7 @@ static int nft_reject_bridge_init(const struct nft_ctx *ctx, | |||
| 290 | struct nft_reject *priv = nft_expr_priv(expr); | 280 | struct nft_reject *priv = nft_expr_priv(expr); |
| 291 | int icmp_code, err; | 281 | int icmp_code, err; |
| 292 | 282 | ||
| 293 | err = nft_reject_bridge_validate_hooks(ctx->chain); | 283 | err = nft_reject_bridge_validate(ctx, expr, NULL); |
| 294 | if (err < 0) | 284 | if (err < 0) |
| 295 | return err; | 285 | return err; |
| 296 | 286 | ||
| @@ -341,13 +331,6 @@ nla_put_failure: | |||
| 341 | return -1; | 331 | return -1; |
| 342 | } | 332 | } |
| 343 | 333 | ||
| 344 | static int nft_reject_bridge_validate(const struct nft_ctx *ctx, | ||
| 345 | const struct nft_expr *expr, | ||
| 346 | const struct nft_data **data) | ||
| 347 | { | ||
| 348 | return nft_reject_bridge_validate_hooks(ctx->chain); | ||
| 349 | } | ||
| 350 | |||
| 351 | static struct nft_expr_type nft_reject_bridge_type; | 334 | static struct nft_expr_type nft_reject_bridge_type; |
| 352 | static const struct nft_expr_ops nft_reject_bridge_ops = { | 335 | static const struct nft_expr_ops nft_reject_bridge_ops = { |
| 353 | .type = &nft_reject_bridge_type, | 336 | .type = &nft_reject_bridge_type, |
diff --git a/net/caif/chnl_net.c b/net/caif/chnl_net.c index 4589ff67bfa9..67a4a36febd1 100644 --- a/net/caif/chnl_net.c +++ b/net/caif/chnl_net.c | |||
| @@ -470,7 +470,6 @@ static int ipcaif_newlink(struct net *src_net, struct net_device *dev, | |||
| 470 | ASSERT_RTNL(); | 470 | ASSERT_RTNL(); |
| 471 | caifdev = netdev_priv(dev); | 471 | caifdev = netdev_priv(dev); |
| 472 | caif_netlink_parms(data, &caifdev->conn_req); | 472 | caif_netlink_parms(data, &caifdev->conn_req); |
| 473 | dev_net_set(caifdev->netdev, src_net); | ||
| 474 | 473 | ||
| 475 | ret = register_netdevice(dev); | 474 | ret = register_netdevice(dev); |
| 476 | if (ret) | 475 | if (ret) |
diff --git a/net/ceph/auth_x.c b/net/ceph/auth_x.c index 15845814a0f2..ba6eb17226da 100644 --- a/net/ceph/auth_x.c +++ b/net/ceph/auth_x.c | |||
| @@ -676,7 +676,7 @@ static int calcu_signature(struct ceph_x_authorizer *au, | |||
| 676 | int ret; | 676 | int ret; |
| 677 | char tmp_enc[40]; | 677 | char tmp_enc[40]; |
| 678 | __le32 tmp[5] = { | 678 | __le32 tmp[5] = { |
| 679 | 16u, msg->hdr.crc, msg->footer.front_crc, | 679 | cpu_to_le32(16), msg->hdr.crc, msg->footer.front_crc, |
| 680 | msg->footer.middle_crc, msg->footer.data_crc, | 680 | msg->footer.middle_crc, msg->footer.data_crc, |
| 681 | }; | 681 | }; |
| 682 | ret = ceph_x_encrypt(&au->session_key, &tmp, sizeof(tmp), | 682 | ret = ceph_x_encrypt(&au->session_key, &tmp, sizeof(tmp), |
diff --git a/net/ceph/mon_client.c b/net/ceph/mon_client.c index a83062ceeec9..f2148e22b148 100644 --- a/net/ceph/mon_client.c +++ b/net/ceph/mon_client.c | |||
| @@ -717,7 +717,7 @@ static int get_poolop_reply_buf(const char *src, size_t src_len, | |||
| 717 | if (src_len != sizeof(u32) + dst_len) | 717 | if (src_len != sizeof(u32) + dst_len) |
| 718 | return -EINVAL; | 718 | return -EINVAL; |
| 719 | 719 | ||
| 720 | buf_len = le32_to_cpu(*(u32 *)src); | 720 | buf_len = le32_to_cpu(*(__le32 *)src); |
| 721 | if (buf_len != dst_len) | 721 | if (buf_len != dst_len) |
| 722 | return -EINVAL; | 722 | return -EINVAL; |
| 723 | 723 | ||
diff --git a/net/core/dev.c b/net/core/dev.c index 683d493aa1bf..7fe82929f509 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -2352,7 +2352,6 @@ EXPORT_SYMBOL(skb_checksum_help); | |||
| 2352 | 2352 | ||
| 2353 | __be16 skb_network_protocol(struct sk_buff *skb, int *depth) | 2353 | __be16 skb_network_protocol(struct sk_buff *skb, int *depth) |
| 2354 | { | 2354 | { |
| 2355 | unsigned int vlan_depth = skb->mac_len; | ||
| 2356 | __be16 type = skb->protocol; | 2355 | __be16 type = skb->protocol; |
| 2357 | 2356 | ||
| 2358 | /* Tunnel gso handlers can set protocol to ethernet. */ | 2357 | /* Tunnel gso handlers can set protocol to ethernet. */ |
| @@ -2366,35 +2365,7 @@ __be16 skb_network_protocol(struct sk_buff *skb, int *depth) | |||
| 2366 | type = eth->h_proto; | 2365 | type = eth->h_proto; |
| 2367 | } | 2366 | } |
| 2368 | 2367 | ||
| 2369 | /* if skb->protocol is 802.1Q/AD then the header should already be | 2368 | return __vlan_get_protocol(skb, type, depth); |
| 2370 | * present at mac_len - VLAN_HLEN (if mac_len > 0), or at | ||
| 2371 | * ETH_HLEN otherwise | ||
| 2372 | */ | ||
| 2373 | if (type == htons(ETH_P_8021Q) || type == htons(ETH_P_8021AD)) { | ||
| 2374 | if (vlan_depth) { | ||
| 2375 | if (WARN_ON(vlan_depth < VLAN_HLEN)) | ||
| 2376 | return 0; | ||
| 2377 | vlan_depth -= VLAN_HLEN; | ||
| 2378 | } else { | ||
| 2379 | vlan_depth = ETH_HLEN; | ||
| 2380 | } | ||
| 2381 | do { | ||
| 2382 | struct vlan_hdr *vh; | ||
| 2383 | |||
| 2384 | if (unlikely(!pskb_may_pull(skb, | ||
| 2385 | vlan_depth + VLAN_HLEN))) | ||
| 2386 | return 0; | ||
| 2387 | |||
| 2388 | vh = (struct vlan_hdr *)(skb->data + vlan_depth); | ||
| 2389 | type = vh->h_vlan_encapsulated_proto; | ||
| 2390 | vlan_depth += VLAN_HLEN; | ||
| 2391 | } while (type == htons(ETH_P_8021Q) || | ||
| 2392 | type == htons(ETH_P_8021AD)); | ||
| 2393 | } | ||
| 2394 | |||
| 2395 | *depth = vlan_depth; | ||
| 2396 | |||
| 2397 | return type; | ||
| 2398 | } | 2369 | } |
| 2399 | 2370 | ||
| 2400 | /** | 2371 | /** |
| @@ -5323,7 +5294,7 @@ void netdev_upper_dev_unlink(struct net_device *dev, | |||
| 5323 | } | 5294 | } |
| 5324 | EXPORT_SYMBOL(netdev_upper_dev_unlink); | 5295 | EXPORT_SYMBOL(netdev_upper_dev_unlink); |
| 5325 | 5296 | ||
| 5326 | void netdev_adjacent_add_links(struct net_device *dev) | 5297 | static void netdev_adjacent_add_links(struct net_device *dev) |
| 5327 | { | 5298 | { |
| 5328 | struct netdev_adjacent *iter; | 5299 | struct netdev_adjacent *iter; |
| 5329 | 5300 | ||
| @@ -5348,7 +5319,7 @@ void netdev_adjacent_add_links(struct net_device *dev) | |||
| 5348 | } | 5319 | } |
| 5349 | } | 5320 | } |
| 5350 | 5321 | ||
| 5351 | void netdev_adjacent_del_links(struct net_device *dev) | 5322 | static void netdev_adjacent_del_links(struct net_device *dev) |
| 5352 | { | 5323 | { |
| 5353 | struct netdev_adjacent *iter; | 5324 | struct netdev_adjacent *iter; |
| 5354 | 5325 | ||
| @@ -6656,7 +6627,7 @@ struct netdev_queue *dev_ingress_queue_create(struct net_device *dev) | |||
| 6656 | if (!queue) | 6627 | if (!queue) |
| 6657 | return NULL; | 6628 | return NULL; |
| 6658 | netdev_init_one_queue(dev, queue, NULL); | 6629 | netdev_init_one_queue(dev, queue, NULL); |
| 6659 | queue->qdisc = &noop_qdisc; | 6630 | RCU_INIT_POINTER(queue->qdisc, &noop_qdisc); |
| 6660 | queue->qdisc_sleeping = &noop_qdisc; | 6631 | queue->qdisc_sleeping = &noop_qdisc; |
| 6661 | rcu_assign_pointer(dev->ingress_queue, queue); | 6632 | rcu_assign_pointer(dev->ingress_queue, queue); |
| 6662 | #endif | 6633 | #endif |
| @@ -7072,10 +7043,20 @@ static int dev_cpu_callback(struct notifier_block *nfb, | |||
| 7072 | oldsd->output_queue = NULL; | 7043 | oldsd->output_queue = NULL; |
| 7073 | oldsd->output_queue_tailp = &oldsd->output_queue; | 7044 | oldsd->output_queue_tailp = &oldsd->output_queue; |
| 7074 | } | 7045 | } |
| 7075 | /* Append NAPI poll list from offline CPU. */ | 7046 | /* Append NAPI poll list from offline CPU, with one exception : |
| 7076 | if (!list_empty(&oldsd->poll_list)) { | 7047 | * process_backlog() must be called by cpu owning percpu backlog. |
| 7077 | list_splice_init(&oldsd->poll_list, &sd->poll_list); | 7048 | * We properly handle process_queue & input_pkt_queue later. |
| 7078 | raise_softirq_irqoff(NET_RX_SOFTIRQ); | 7049 | */ |
| 7050 | while (!list_empty(&oldsd->poll_list)) { | ||
| 7051 | struct napi_struct *napi = list_first_entry(&oldsd->poll_list, | ||
| 7052 | struct napi_struct, | ||
| 7053 | poll_list); | ||
| 7054 | |||
| 7055 | list_del_init(&napi->poll_list); | ||
| 7056 | if (napi->poll == process_backlog) | ||
| 7057 | napi->state = 0; | ||
| 7058 | else | ||
| 7059 | ____napi_schedule(sd, napi); | ||
| 7079 | } | 7060 | } |
| 7080 | 7061 | ||
| 7081 | raise_softirq_irqoff(NET_TX_SOFTIRQ); | 7062 | raise_softirq_irqoff(NET_TX_SOFTIRQ); |
| @@ -7086,7 +7067,7 @@ static int dev_cpu_callback(struct notifier_block *nfb, | |||
| 7086 | netif_rx_internal(skb); | 7067 | netif_rx_internal(skb); |
| 7087 | input_queue_head_incr(oldsd); | 7068 | input_queue_head_incr(oldsd); |
| 7088 | } | 7069 | } |
| 7089 | while ((skb = __skb_dequeue(&oldsd->input_pkt_queue))) { | 7070 | while ((skb = skb_dequeue(&oldsd->input_pkt_queue))) { |
| 7090 | netif_rx_internal(skb); | 7071 | netif_rx_internal(skb); |
| 7091 | input_queue_head_incr(oldsd); | 7072 | input_queue_head_incr(oldsd); |
| 7092 | } | 7073 | } |
diff --git a/net/core/neighbour.c b/net/core/neighbour.c index 8e38f17288d3..8d614c93f86a 100644 --- a/net/core/neighbour.c +++ b/net/core/neighbour.c | |||
| @@ -2043,6 +2043,12 @@ static int neightbl_set(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
| 2043 | case NDTPA_BASE_REACHABLE_TIME: | 2043 | case NDTPA_BASE_REACHABLE_TIME: |
| 2044 | NEIGH_VAR_SET(p, BASE_REACHABLE_TIME, | 2044 | NEIGH_VAR_SET(p, BASE_REACHABLE_TIME, |
| 2045 | nla_get_msecs(tbp[i])); | 2045 | nla_get_msecs(tbp[i])); |
| 2046 | /* update reachable_time as well, otherwise, the change will | ||
| 2047 | * only be effective after the next time neigh_periodic_work | ||
| 2048 | * decides to recompute it (can be multiple minutes) | ||
| 2049 | */ | ||
| 2050 | p->reachable_time = | ||
| 2051 | neigh_rand_reach_time(NEIGH_VAR(p, BASE_REACHABLE_TIME)); | ||
| 2046 | break; | 2052 | break; |
| 2047 | case NDTPA_GC_STALETIME: | 2053 | case NDTPA_GC_STALETIME: |
| 2048 | NEIGH_VAR_SET(p, GC_STALETIME, | 2054 | NEIGH_VAR_SET(p, GC_STALETIME, |
| @@ -2921,6 +2927,31 @@ static int neigh_proc_dointvec_unres_qlen(struct ctl_table *ctl, int write, | |||
| 2921 | return ret; | 2927 | return ret; |
| 2922 | } | 2928 | } |
| 2923 | 2929 | ||
| 2930 | static int neigh_proc_base_reachable_time(struct ctl_table *ctl, int write, | ||
| 2931 | void __user *buffer, | ||
| 2932 | size_t *lenp, loff_t *ppos) | ||
| 2933 | { | ||
| 2934 | struct neigh_parms *p = ctl->extra2; | ||
| 2935 | int ret; | ||
| 2936 | |||
| 2937 | if (strcmp(ctl->procname, "base_reachable_time") == 0) | ||
| 2938 | ret = neigh_proc_dointvec_jiffies(ctl, write, buffer, lenp, ppos); | ||
| 2939 | else if (strcmp(ctl->procname, "base_reachable_time_ms") == 0) | ||
| 2940 | ret = neigh_proc_dointvec_ms_jiffies(ctl, write, buffer, lenp, ppos); | ||
| 2941 | else | ||
| 2942 | ret = -1; | ||
| 2943 | |||
| 2944 | if (write && ret == 0) { | ||
| 2945 | /* update reachable_time as well, otherwise, the change will | ||
| 2946 | * only be effective after the next time neigh_periodic_work | ||
| 2947 | * decides to recompute it | ||
| 2948 | */ | ||
| 2949 | p->reachable_time = | ||
| 2950 | neigh_rand_reach_time(NEIGH_VAR(p, BASE_REACHABLE_TIME)); | ||
| 2951 | } | ||
| 2952 | return ret; | ||
| 2953 | } | ||
| 2954 | |||
| 2924 | #define NEIGH_PARMS_DATA_OFFSET(index) \ | 2955 | #define NEIGH_PARMS_DATA_OFFSET(index) \ |
| 2925 | (&((struct neigh_parms *) 0)->data[index]) | 2956 | (&((struct neigh_parms *) 0)->data[index]) |
| 2926 | 2957 | ||
| @@ -3047,6 +3078,19 @@ int neigh_sysctl_register(struct net_device *dev, struct neigh_parms *p, | |||
| 3047 | t->neigh_vars[NEIGH_VAR_RETRANS_TIME_MS].proc_handler = handler; | 3078 | t->neigh_vars[NEIGH_VAR_RETRANS_TIME_MS].proc_handler = handler; |
| 3048 | /* ReachableTime (in milliseconds) */ | 3079 | /* ReachableTime (in milliseconds) */ |
| 3049 | t->neigh_vars[NEIGH_VAR_BASE_REACHABLE_TIME_MS].proc_handler = handler; | 3080 | t->neigh_vars[NEIGH_VAR_BASE_REACHABLE_TIME_MS].proc_handler = handler; |
| 3081 | } else { | ||
| 3082 | /* Those handlers will update p->reachable_time after | ||
| 3083 | * base_reachable_time(_ms) is set to ensure the new timer starts being | ||
| 3084 | * applied after the next neighbour update instead of waiting for | ||
| 3085 | * neigh_periodic_work to update its value (can be multiple minutes) | ||
| 3086 | * So any handler that replaces them should do this as well | ||
| 3087 | */ | ||
| 3088 | /* ReachableTime */ | ||
| 3089 | t->neigh_vars[NEIGH_VAR_BASE_REACHABLE_TIME].proc_handler = | ||
| 3090 | neigh_proc_base_reachable_time; | ||
| 3091 | /* ReachableTime (in milliseconds) */ | ||
| 3092 | t->neigh_vars[NEIGH_VAR_BASE_REACHABLE_TIME_MS].proc_handler = | ||
| 3093 | neigh_proc_base_reachable_time; | ||
| 3050 | } | 3094 | } |
| 3051 | 3095 | ||
| 3052 | /* Don't export sysctls to unprivileged users */ | 3096 | /* Don't export sysctls to unprivileged users */ |
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 9cf6fe9ddc0c..446cbaf81185 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
| @@ -2895,12 +2895,16 @@ static int rtnl_bridge_notify(struct net_device *dev, u16 flags) | |||
| 2895 | goto errout; | 2895 | goto errout; |
| 2896 | } | 2896 | } |
| 2897 | 2897 | ||
| 2898 | if (!skb->len) | ||
| 2899 | goto errout; | ||
| 2900 | |||
| 2898 | rtnl_notify(skb, net, 0, RTNLGRP_LINK, NULL, GFP_ATOMIC); | 2901 | rtnl_notify(skb, net, 0, RTNLGRP_LINK, NULL, GFP_ATOMIC); |
| 2899 | return 0; | 2902 | return 0; |
| 2900 | errout: | 2903 | errout: |
| 2901 | WARN_ON(err == -EMSGSIZE); | 2904 | WARN_ON(err == -EMSGSIZE); |
| 2902 | kfree_skb(skb); | 2905 | kfree_skb(skb); |
| 2903 | rtnl_set_sk_err(net, RTNLGRP_LINK, err); | 2906 | if (err) |
| 2907 | rtnl_set_sk_err(net, RTNLGRP_LINK, err); | ||
| 2904 | return err; | 2908 | return err; |
| 2905 | } | 2909 | } |
| 2906 | 2910 | ||
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_output.c b/net/ipv4/ip_output.c index b50861b22b6b..c373c0708d97 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
| @@ -1506,23 +1506,8 @@ static int ip_reply_glue_bits(void *dptr, char *to, int offset, | |||
| 1506 | /* | 1506 | /* |
| 1507 | * Generic function to send a packet as reply to another packet. | 1507 | * Generic function to send a packet as reply to another packet. |
| 1508 | * Used to send some TCP resets/acks so far. | 1508 | * Used to send some TCP resets/acks so far. |
| 1509 | * | ||
| 1510 | * Use a fake percpu inet socket to avoid false sharing and contention. | ||
| 1511 | */ | 1509 | */ |
| 1512 | static DEFINE_PER_CPU(struct inet_sock, unicast_sock) = { | 1510 | void ip_send_unicast_reply(struct sock *sk, struct sk_buff *skb, |
| 1513 | .sk = { | ||
| 1514 | .__sk_common = { | ||
| 1515 | .skc_refcnt = ATOMIC_INIT(1), | ||
| 1516 | }, | ||
| 1517 | .sk_wmem_alloc = ATOMIC_INIT(1), | ||
| 1518 | .sk_allocation = GFP_ATOMIC, | ||
| 1519 | .sk_flags = (1UL << SOCK_USE_WRITE_QUEUE), | ||
| 1520 | }, | ||
| 1521 | .pmtudisc = IP_PMTUDISC_WANT, | ||
| 1522 | .uc_ttl = -1, | ||
| 1523 | }; | ||
| 1524 | |||
| 1525 | void ip_send_unicast_reply(struct net *net, struct sk_buff *skb, | ||
| 1526 | const struct ip_options *sopt, | 1511 | const struct ip_options *sopt, |
| 1527 | __be32 daddr, __be32 saddr, | 1512 | __be32 daddr, __be32 saddr, |
| 1528 | const struct ip_reply_arg *arg, | 1513 | const struct ip_reply_arg *arg, |
| @@ -1532,9 +1517,8 @@ void ip_send_unicast_reply(struct net *net, struct sk_buff *skb, | |||
| 1532 | struct ipcm_cookie ipc; | 1517 | struct ipcm_cookie ipc; |
| 1533 | struct flowi4 fl4; | 1518 | struct flowi4 fl4; |
| 1534 | struct rtable *rt = skb_rtable(skb); | 1519 | struct rtable *rt = skb_rtable(skb); |
| 1520 | struct net *net = sock_net(sk); | ||
| 1535 | struct sk_buff *nskb; | 1521 | struct sk_buff *nskb; |
| 1536 | struct sock *sk; | ||
| 1537 | struct inet_sock *inet; | ||
| 1538 | int err; | 1522 | int err; |
| 1539 | 1523 | ||
| 1540 | if (__ip_options_echo(&replyopts.opt.opt, skb, sopt)) | 1524 | if (__ip_options_echo(&replyopts.opt.opt, skb, sopt)) |
| @@ -1565,15 +1549,11 @@ void ip_send_unicast_reply(struct net *net, struct sk_buff *skb, | |||
| 1565 | if (IS_ERR(rt)) | 1549 | if (IS_ERR(rt)) |
| 1566 | return; | 1550 | return; |
| 1567 | 1551 | ||
| 1568 | inet = &get_cpu_var(unicast_sock); | 1552 | inet_sk(sk)->tos = arg->tos; |
| 1569 | 1553 | ||
| 1570 | inet->tos = arg->tos; | ||
| 1571 | sk = &inet->sk; | ||
| 1572 | sk->sk_priority = skb->priority; | 1554 | sk->sk_priority = skb->priority; |
| 1573 | sk->sk_protocol = ip_hdr(skb)->protocol; | 1555 | sk->sk_protocol = ip_hdr(skb)->protocol; |
| 1574 | sk->sk_bound_dev_if = arg->bound_dev_if; | 1556 | sk->sk_bound_dev_if = arg->bound_dev_if; |
| 1575 | sock_net_set(sk, net); | ||
| 1576 | __skb_queue_head_init(&sk->sk_write_queue); | ||
| 1577 | sk->sk_sndbuf = sysctl_wmem_default; | 1557 | sk->sk_sndbuf = sysctl_wmem_default; |
| 1578 | err = ip_append_data(sk, &fl4, ip_reply_glue_bits, arg->iov->iov_base, | 1558 | err = ip_append_data(sk, &fl4, ip_reply_glue_bits, arg->iov->iov_base, |
| 1579 | len, 0, &ipc, &rt, MSG_DONTWAIT); | 1559 | len, 0, &ipc, &rt, MSG_DONTWAIT); |
| @@ -1589,13 +1569,10 @@ void ip_send_unicast_reply(struct net *net, struct sk_buff *skb, | |||
| 1589 | arg->csumoffset) = csum_fold(csum_add(nskb->csum, | 1569 | arg->csumoffset) = csum_fold(csum_add(nskb->csum, |
| 1590 | arg->csum)); | 1570 | arg->csum)); |
| 1591 | nskb->ip_summed = CHECKSUM_NONE; | 1571 | nskb->ip_summed = CHECKSUM_NONE; |
| 1592 | skb_orphan(nskb); | ||
| 1593 | skb_set_queue_mapping(nskb, skb_get_queue_mapping(skb)); | 1572 | skb_set_queue_mapping(nskb, skb_get_queue_mapping(skb)); |
| 1594 | ip_push_pending_frames(sk, &fl4); | 1573 | ip_push_pending_frames(sk, &fl4); |
| 1595 | } | 1574 | } |
| 1596 | out: | 1575 | out: |
| 1597 | put_cpu_var(unicast_sock); | ||
| 1598 | |||
| 1599 | ip_rt_put(rt); | 1576 | ip_rt_put(rt); |
| 1600 | } | 1577 | } |
| 1601 | 1578 | ||
diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c index 8a89c738b7a3..6b85adb05003 100644 --- a/net/ipv4/ip_sockglue.c +++ b/net/ipv4/ip_sockglue.c | |||
| @@ -461,17 +461,13 @@ int ip_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len) | |||
| 461 | 461 | ||
| 462 | memcpy(&errhdr.ee, &serr->ee, sizeof(struct sock_extended_err)); | 462 | memcpy(&errhdr.ee, &serr->ee, sizeof(struct sock_extended_err)); |
| 463 | sin = &errhdr.offender; | 463 | sin = &errhdr.offender; |
| 464 | sin->sin_family = AF_UNSPEC; | 464 | memset(sin, 0, sizeof(*sin)); |
| 465 | 465 | ||
| 466 | if (serr->ee.ee_origin == SO_EE_ORIGIN_ICMP || | 466 | if (serr->ee.ee_origin == SO_EE_ORIGIN_ICMP || |
| 467 | ipv4_pktinfo_prepare_errqueue(sk, skb, serr->ee.ee_origin)) { | 467 | ipv4_pktinfo_prepare_errqueue(sk, skb, serr->ee.ee_origin)) { |
| 468 | struct inet_sock *inet = inet_sk(sk); | ||
| 469 | |||
| 470 | sin->sin_family = AF_INET; | 468 | sin->sin_family = AF_INET; |
| 471 | sin->sin_addr.s_addr = ip_hdr(skb)->saddr; | 469 | sin->sin_addr.s_addr = ip_hdr(skb)->saddr; |
| 472 | sin->sin_port = 0; | 470 | if (inet_sk(sk)->cmsg_flags) |
| 473 | memset(&sin->sin_zero, 0, sizeof(sin->sin_zero)); | ||
| 474 | if (inet->cmsg_flags) | ||
| 475 | ip_cmsg_recv(msg, skb); | 471 | ip_cmsg_recv(msg, skb); |
| 476 | } | 472 | } |
| 477 | 473 | ||
diff --git a/net/ipv4/netfilter/nft_redir_ipv4.c b/net/ipv4/netfilter/nft_redir_ipv4.c index ff2d23d8c87a..6ecfce63201a 100644 --- a/net/ipv4/netfilter/nft_redir_ipv4.c +++ b/net/ipv4/netfilter/nft_redir_ipv4.c | |||
| @@ -27,10 +27,10 @@ static void nft_redir_ipv4_eval(const struct nft_expr *expr, | |||
| 27 | 27 | ||
| 28 | memset(&mr, 0, sizeof(mr)); | 28 | memset(&mr, 0, sizeof(mr)); |
| 29 | if (priv->sreg_proto_min) { | 29 | if (priv->sreg_proto_min) { |
| 30 | mr.range[0].min.all = (__force __be16) | 30 | mr.range[0].min.all = |
| 31 | data[priv->sreg_proto_min].data[0]; | 31 | *(__be16 *)&data[priv->sreg_proto_min].data[0]; |
| 32 | mr.range[0].max.all = (__force __be16) | 32 | mr.range[0].max.all = |
| 33 | data[priv->sreg_proto_max].data[0]; | 33 | *(__be16 *)&data[priv->sreg_proto_max].data[0]; |
| 34 | mr.range[0].flags |= NF_NAT_RANGE_PROTO_SPECIFIED; | 34 | mr.range[0].flags |= NF_NAT_RANGE_PROTO_SPECIFIED; |
| 35 | } | 35 | } |
| 36 | 36 | ||
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 6a2155b02602..52e1f2bf0ca2 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
| @@ -966,6 +966,9 @@ static void __ip_rt_update_pmtu(struct rtable *rt, struct flowi4 *fl4, u32 mtu) | |||
| 966 | if (dst->dev->mtu < mtu) | 966 | if (dst->dev->mtu < mtu) |
| 967 | return; | 967 | return; |
| 968 | 968 | ||
| 969 | if (rt->rt_pmtu && rt->rt_pmtu < mtu) | ||
| 970 | return; | ||
| 971 | |||
| 969 | if (mtu < ip_rt_min_pmtu) | 972 | if (mtu < ip_rt_min_pmtu) |
| 970 | mtu = ip_rt_min_pmtu; | 973 | mtu = ip_rt_min_pmtu; |
| 971 | 974 | ||
| @@ -1554,11 +1557,10 @@ static int __mkroute_input(struct sk_buff *skb, | |||
| 1554 | 1557 | ||
| 1555 | do_cache = res->fi && !itag; | 1558 | do_cache = res->fi && !itag; |
| 1556 | if (out_dev == in_dev && err && IN_DEV_TX_REDIRECTS(out_dev) && | 1559 | if (out_dev == in_dev && err && IN_DEV_TX_REDIRECTS(out_dev) && |
| 1560 | skb->protocol == htons(ETH_P_IP) && | ||
| 1557 | (IN_DEV_SHARED_MEDIA(out_dev) || | 1561 | (IN_DEV_SHARED_MEDIA(out_dev) || |
| 1558 | inet_addr_onlink(out_dev, saddr, FIB_RES_GW(*res)))) { | 1562 | inet_addr_onlink(out_dev, saddr, FIB_RES_GW(*res)))) |
| 1559 | flags |= RTCF_DOREDIRECT; | 1563 | IPCB(skb)->flags |= IPSKB_DOREDIRECT; |
| 1560 | do_cache = false; | ||
| 1561 | } | ||
| 1562 | 1564 | ||
| 1563 | if (skb->protocol != htons(ETH_P_IP)) { | 1565 | if (skb->protocol != htons(ETH_P_IP)) { |
| 1564 | /* Not IP (i.e. ARP). Do not create route, if it is | 1566 | /* Not IP (i.e. ARP). Do not create route, if it is |
| @@ -2303,6 +2305,8 @@ static int rt_fill_info(struct net *net, __be32 dst, __be32 src, | |||
| 2303 | r->rtm_flags = (rt->rt_flags & ~0xFFFF) | RTM_F_CLONED; | 2305 | r->rtm_flags = (rt->rt_flags & ~0xFFFF) | RTM_F_CLONED; |
| 2304 | if (rt->rt_flags & RTCF_NOTIFY) | 2306 | if (rt->rt_flags & RTCF_NOTIFY) |
| 2305 | r->rtm_flags |= RTM_F_NOTIFY; | 2307 | r->rtm_flags |= RTM_F_NOTIFY; |
| 2308 | if (IPCB(skb)->flags & IPSKB_DOREDIRECT) | ||
| 2309 | r->rtm_flags |= RTCF_DOREDIRECT; | ||
| 2306 | 2310 | ||
| 2307 | if (nla_put_be32(skb, RTA_DST, dst)) | 2311 | if (nla_put_be32(skb, RTA_DST, dst)) |
| 2308 | goto nla_put_failure; | 2312 | goto nla_put_failure; |
diff --git a/net/ipv4/tcp_bic.c b/net/ipv4/tcp_bic.c index bb395d46a389..c037644eafb7 100644 --- a/net/ipv4/tcp_bic.c +++ b/net/ipv4/tcp_bic.c | |||
| @@ -150,7 +150,7 @@ static void bictcp_cong_avoid(struct sock *sk, u32 ack, u32 acked) | |||
| 150 | tcp_slow_start(tp, acked); | 150 | tcp_slow_start(tp, acked); |
| 151 | else { | 151 | else { |
| 152 | bictcp_update(ca, tp->snd_cwnd); | 152 | bictcp_update(ca, tp->snd_cwnd); |
| 153 | tcp_cong_avoid_ai(tp, ca->cnt); | 153 | tcp_cong_avoid_ai(tp, ca->cnt, 1); |
| 154 | } | 154 | } |
| 155 | } | 155 | } |
| 156 | 156 | ||
diff --git a/net/ipv4/tcp_cong.c b/net/ipv4/tcp_cong.c index 27ead0dd16bc..8670e68e2ce6 100644 --- a/net/ipv4/tcp_cong.c +++ b/net/ipv4/tcp_cong.c | |||
| @@ -291,26 +291,32 @@ int tcp_set_congestion_control(struct sock *sk, const char *name) | |||
| 291 | * ABC caps N to 2. Slow start exits when cwnd grows over ssthresh and | 291 | * ABC caps N to 2. Slow start exits when cwnd grows over ssthresh and |
| 292 | * returns the leftover acks to adjust cwnd in congestion avoidance mode. | 292 | * returns the leftover acks to adjust cwnd in congestion avoidance mode. |
| 293 | */ | 293 | */ |
| 294 | void tcp_slow_start(struct tcp_sock *tp, u32 acked) | 294 | u32 tcp_slow_start(struct tcp_sock *tp, u32 acked) |
| 295 | { | 295 | { |
| 296 | u32 cwnd = tp->snd_cwnd + acked; | 296 | u32 cwnd = tp->snd_cwnd + acked; |
| 297 | 297 | ||
| 298 | if (cwnd > tp->snd_ssthresh) | 298 | if (cwnd > tp->snd_ssthresh) |
| 299 | cwnd = tp->snd_ssthresh + 1; | 299 | cwnd = tp->snd_ssthresh + 1; |
| 300 | acked -= cwnd - tp->snd_cwnd; | ||
| 300 | tp->snd_cwnd = min(cwnd, tp->snd_cwnd_clamp); | 301 | tp->snd_cwnd = min(cwnd, tp->snd_cwnd_clamp); |
| 302 | |||
| 303 | return acked; | ||
| 301 | } | 304 | } |
| 302 | EXPORT_SYMBOL_GPL(tcp_slow_start); | 305 | EXPORT_SYMBOL_GPL(tcp_slow_start); |
| 303 | 306 | ||
| 304 | /* In theory this is tp->snd_cwnd += 1 / tp->snd_cwnd (or alternative w) */ | 307 | /* In theory this is tp->snd_cwnd += 1 / tp->snd_cwnd (or alternative w), |
| 305 | void tcp_cong_avoid_ai(struct tcp_sock *tp, u32 w) | 308 | * for every packet that was ACKed. |
| 309 | */ | ||
| 310 | void tcp_cong_avoid_ai(struct tcp_sock *tp, u32 w, u32 acked) | ||
| 306 | { | 311 | { |
| 312 | tp->snd_cwnd_cnt += acked; | ||
| 307 | if (tp->snd_cwnd_cnt >= w) { | 313 | if (tp->snd_cwnd_cnt >= w) { |
| 308 | if (tp->snd_cwnd < tp->snd_cwnd_clamp) | 314 | u32 delta = tp->snd_cwnd_cnt / w; |
| 309 | tp->snd_cwnd++; | 315 | |
| 310 | tp->snd_cwnd_cnt = 0; | 316 | tp->snd_cwnd_cnt -= delta * w; |
| 311 | } else { | 317 | tp->snd_cwnd += delta; |
| 312 | tp->snd_cwnd_cnt++; | ||
| 313 | } | 318 | } |
| 319 | tp->snd_cwnd = min(tp->snd_cwnd, tp->snd_cwnd_clamp); | ||
| 314 | } | 320 | } |
| 315 | EXPORT_SYMBOL_GPL(tcp_cong_avoid_ai); | 321 | EXPORT_SYMBOL_GPL(tcp_cong_avoid_ai); |
| 316 | 322 | ||
| @@ -329,11 +335,13 @@ void tcp_reno_cong_avoid(struct sock *sk, u32 ack, u32 acked) | |||
| 329 | return; | 335 | return; |
| 330 | 336 | ||
| 331 | /* In "safe" area, increase. */ | 337 | /* In "safe" area, increase. */ |
| 332 | if (tp->snd_cwnd <= tp->snd_ssthresh) | 338 | if (tp->snd_cwnd <= tp->snd_ssthresh) { |
| 333 | tcp_slow_start(tp, acked); | 339 | acked = tcp_slow_start(tp, acked); |
| 340 | if (!acked) | ||
| 341 | return; | ||
| 342 | } | ||
| 334 | /* In dangerous area, increase slowly. */ | 343 | /* In dangerous area, increase slowly. */ |
| 335 | else | 344 | tcp_cong_avoid_ai(tp, tp->snd_cwnd, acked); |
| 336 | tcp_cong_avoid_ai(tp, tp->snd_cwnd); | ||
| 337 | } | 345 | } |
| 338 | EXPORT_SYMBOL_GPL(tcp_reno_cong_avoid); | 346 | EXPORT_SYMBOL_GPL(tcp_reno_cong_avoid); |
| 339 | 347 | ||
diff --git a/net/ipv4/tcp_cubic.c b/net/ipv4/tcp_cubic.c index 6b6002416a73..4b276d1ed980 100644 --- a/net/ipv4/tcp_cubic.c +++ b/net/ipv4/tcp_cubic.c | |||
| @@ -93,9 +93,7 @@ struct bictcp { | |||
| 93 | u32 epoch_start; /* beginning of an epoch */ | 93 | u32 epoch_start; /* beginning of an epoch */ |
| 94 | u32 ack_cnt; /* number of acks */ | 94 | u32 ack_cnt; /* number of acks */ |
| 95 | u32 tcp_cwnd; /* estimated tcp cwnd */ | 95 | u32 tcp_cwnd; /* estimated tcp cwnd */ |
| 96 | #define ACK_RATIO_SHIFT 4 | 96 | u16 unused; |
| 97 | #define ACK_RATIO_LIMIT (32u << ACK_RATIO_SHIFT) | ||
| 98 | u16 delayed_ack; /* estimate the ratio of Packets/ACKs << 4 */ | ||
| 99 | u8 sample_cnt; /* number of samples to decide curr_rtt */ | 97 | u8 sample_cnt; /* number of samples to decide curr_rtt */ |
| 100 | u8 found; /* the exit point is found? */ | 98 | u8 found; /* the exit point is found? */ |
| 101 | u32 round_start; /* beginning of each round */ | 99 | u32 round_start; /* beginning of each round */ |
| @@ -114,7 +112,6 @@ static inline void bictcp_reset(struct bictcp *ca) | |||
| 114 | ca->bic_K = 0; | 112 | ca->bic_K = 0; |
| 115 | ca->delay_min = 0; | 113 | ca->delay_min = 0; |
| 116 | ca->epoch_start = 0; | 114 | ca->epoch_start = 0; |
| 117 | ca->delayed_ack = 2 << ACK_RATIO_SHIFT; | ||
| 118 | ca->ack_cnt = 0; | 115 | ca->ack_cnt = 0; |
| 119 | ca->tcp_cwnd = 0; | 116 | ca->tcp_cwnd = 0; |
| 120 | ca->found = 0; | 117 | ca->found = 0; |
| @@ -205,23 +202,30 @@ static u32 cubic_root(u64 a) | |||
| 205 | /* | 202 | /* |
| 206 | * Compute congestion window to use. | 203 | * Compute congestion window to use. |
| 207 | */ | 204 | */ |
| 208 | static inline void bictcp_update(struct bictcp *ca, u32 cwnd) | 205 | static inline void bictcp_update(struct bictcp *ca, u32 cwnd, u32 acked) |
| 209 | { | 206 | { |
| 210 | u32 delta, bic_target, max_cnt; | 207 | u32 delta, bic_target, max_cnt; |
| 211 | u64 offs, t; | 208 | u64 offs, t; |
| 212 | 209 | ||
| 213 | ca->ack_cnt++; /* count the number of ACKs */ | 210 | ca->ack_cnt += acked; /* count the number of ACKed packets */ |
| 214 | 211 | ||
| 215 | if (ca->last_cwnd == cwnd && | 212 | if (ca->last_cwnd == cwnd && |
| 216 | (s32)(tcp_time_stamp - ca->last_time) <= HZ / 32) | 213 | (s32)(tcp_time_stamp - ca->last_time) <= HZ / 32) |
| 217 | return; | 214 | return; |
| 218 | 215 | ||
| 216 | /* The CUBIC function can update ca->cnt at most once per jiffy. | ||
| 217 | * On all cwnd reduction events, ca->epoch_start is set to 0, | ||
| 218 | * which will force a recalculation of ca->cnt. | ||
| 219 | */ | ||
| 220 | if (ca->epoch_start && tcp_time_stamp == ca->last_time) | ||
| 221 | goto tcp_friendliness; | ||
| 222 | |||
| 219 | ca->last_cwnd = cwnd; | 223 | ca->last_cwnd = cwnd; |
| 220 | ca->last_time = tcp_time_stamp; | 224 | ca->last_time = tcp_time_stamp; |
| 221 | 225 | ||
| 222 | if (ca->epoch_start == 0) { | 226 | if (ca->epoch_start == 0) { |
| 223 | ca->epoch_start = tcp_time_stamp; /* record beginning */ | 227 | ca->epoch_start = tcp_time_stamp; /* record beginning */ |
| 224 | ca->ack_cnt = 1; /* start counting */ | 228 | ca->ack_cnt = acked; /* start counting */ |
| 225 | ca->tcp_cwnd = cwnd; /* syn with cubic */ | 229 | ca->tcp_cwnd = cwnd; /* syn with cubic */ |
| 226 | 230 | ||
| 227 | if (ca->last_max_cwnd <= cwnd) { | 231 | if (ca->last_max_cwnd <= cwnd) { |
| @@ -283,6 +287,7 @@ static inline void bictcp_update(struct bictcp *ca, u32 cwnd) | |||
| 283 | if (ca->last_max_cwnd == 0 && ca->cnt > 20) | 287 | if (ca->last_max_cwnd == 0 && ca->cnt > 20) |
| 284 | ca->cnt = 20; /* increase cwnd 5% per RTT */ | 288 | ca->cnt = 20; /* increase cwnd 5% per RTT */ |
| 285 | 289 | ||
| 290 | tcp_friendliness: | ||
| 286 | /* TCP Friendly */ | 291 | /* TCP Friendly */ |
| 287 | if (tcp_friendliness) { | 292 | if (tcp_friendliness) { |
| 288 | u32 scale = beta_scale; | 293 | u32 scale = beta_scale; |
| @@ -301,7 +306,6 @@ static inline void bictcp_update(struct bictcp *ca, u32 cwnd) | |||
| 301 | } | 306 | } |
| 302 | } | 307 | } |
| 303 | 308 | ||
| 304 | ca->cnt = (ca->cnt << ACK_RATIO_SHIFT) / ca->delayed_ack; | ||
| 305 | if (ca->cnt == 0) /* cannot be zero */ | 309 | if (ca->cnt == 0) /* cannot be zero */ |
| 306 | ca->cnt = 1; | 310 | ca->cnt = 1; |
| 307 | } | 311 | } |
| @@ -317,11 +321,12 @@ static void bictcp_cong_avoid(struct sock *sk, u32 ack, u32 acked) | |||
| 317 | if (tp->snd_cwnd <= tp->snd_ssthresh) { | 321 | if (tp->snd_cwnd <= tp->snd_ssthresh) { |
| 318 | if (hystart && after(ack, ca->end_seq)) | 322 | if (hystart && after(ack, ca->end_seq)) |
| 319 | bictcp_hystart_reset(sk); | 323 | bictcp_hystart_reset(sk); |
| 320 | tcp_slow_start(tp, acked); | 324 | acked = tcp_slow_start(tp, acked); |
| 321 | } else { | 325 | if (!acked) |
| 322 | bictcp_update(ca, tp->snd_cwnd); | 326 | return; |
| 323 | tcp_cong_avoid_ai(tp, ca->cnt); | ||
| 324 | } | 327 | } |
| 328 | bictcp_update(ca, tp->snd_cwnd, acked); | ||
| 329 | tcp_cong_avoid_ai(tp, ca->cnt, acked); | ||
| 325 | } | 330 | } |
| 326 | 331 | ||
| 327 | static u32 bictcp_recalc_ssthresh(struct sock *sk) | 332 | static u32 bictcp_recalc_ssthresh(struct sock *sk) |
| @@ -411,20 +416,10 @@ static void hystart_update(struct sock *sk, u32 delay) | |||
| 411 | */ | 416 | */ |
| 412 | static void bictcp_acked(struct sock *sk, u32 cnt, s32 rtt_us) | 417 | static void bictcp_acked(struct sock *sk, u32 cnt, s32 rtt_us) |
| 413 | { | 418 | { |
| 414 | const struct inet_connection_sock *icsk = inet_csk(sk); | ||
| 415 | const struct tcp_sock *tp = tcp_sk(sk); | 419 | const struct tcp_sock *tp = tcp_sk(sk); |
| 416 | struct bictcp *ca = inet_csk_ca(sk); | 420 | struct bictcp *ca = inet_csk_ca(sk); |
| 417 | u32 delay; | 421 | u32 delay; |
| 418 | 422 | ||
| 419 | if (icsk->icsk_ca_state == TCP_CA_Open) { | ||
| 420 | u32 ratio = ca->delayed_ack; | ||
| 421 | |||
| 422 | ratio -= ca->delayed_ack >> ACK_RATIO_SHIFT; | ||
| 423 | ratio += cnt; | ||
| 424 | |||
| 425 | ca->delayed_ack = clamp(ratio, 1U, ACK_RATIO_LIMIT); | ||
| 426 | } | ||
| 427 | |||
| 428 | /* Some calls are for duplicates without timetamps */ | 423 | /* Some calls are for duplicates without timetamps */ |
| 429 | if (rtt_us < 0) | 424 | if (rtt_us < 0) |
| 430 | return; | 425 | return; |
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index a3f72d7fc06c..d22f54482bab 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
| @@ -683,7 +683,8 @@ static void tcp_v4_send_reset(struct sock *sk, struct sk_buff *skb) | |||
| 683 | arg.bound_dev_if = sk->sk_bound_dev_if; | 683 | arg.bound_dev_if = sk->sk_bound_dev_if; |
| 684 | 684 | ||
| 685 | arg.tos = ip_hdr(skb)->tos; | 685 | arg.tos = ip_hdr(skb)->tos; |
| 686 | ip_send_unicast_reply(net, skb, &TCP_SKB_CB(skb)->header.h4.opt, | 686 | ip_send_unicast_reply(*this_cpu_ptr(net->ipv4.tcp_sk), |
| 687 | skb, &TCP_SKB_CB(skb)->header.h4.opt, | ||
| 687 | ip_hdr(skb)->saddr, ip_hdr(skb)->daddr, | 688 | ip_hdr(skb)->saddr, ip_hdr(skb)->daddr, |
| 688 | &arg, arg.iov[0].iov_len); | 689 | &arg, arg.iov[0].iov_len); |
| 689 | 690 | ||
| @@ -767,7 +768,8 @@ static void tcp_v4_send_ack(struct sk_buff *skb, u32 seq, u32 ack, | |||
| 767 | if (oif) | 768 | if (oif) |
| 768 | arg.bound_dev_if = oif; | 769 | arg.bound_dev_if = oif; |
| 769 | arg.tos = tos; | 770 | arg.tos = tos; |
| 770 | ip_send_unicast_reply(net, skb, &TCP_SKB_CB(skb)->header.h4.opt, | 771 | ip_send_unicast_reply(*this_cpu_ptr(net->ipv4.tcp_sk), |
| 772 | skb, &TCP_SKB_CB(skb)->header.h4.opt, | ||
| 771 | ip_hdr(skb)->saddr, ip_hdr(skb)->daddr, | 773 | ip_hdr(skb)->saddr, ip_hdr(skb)->daddr, |
| 772 | &arg, arg.iov[0].iov_len); | 774 | &arg, arg.iov[0].iov_len); |
| 773 | 775 | ||
| @@ -2428,14 +2430,39 @@ struct proto tcp_prot = { | |||
| 2428 | }; | 2430 | }; |
| 2429 | EXPORT_SYMBOL(tcp_prot); | 2431 | EXPORT_SYMBOL(tcp_prot); |
| 2430 | 2432 | ||
| 2433 | static void __net_exit tcp_sk_exit(struct net *net) | ||
| 2434 | { | ||
| 2435 | int cpu; | ||
| 2436 | |||
| 2437 | for_each_possible_cpu(cpu) | ||
| 2438 | inet_ctl_sock_destroy(*per_cpu_ptr(net->ipv4.tcp_sk, cpu)); | ||
| 2439 | free_percpu(net->ipv4.tcp_sk); | ||
| 2440 | } | ||
| 2441 | |||
| 2431 | static int __net_init tcp_sk_init(struct net *net) | 2442 | static int __net_init tcp_sk_init(struct net *net) |
| 2432 | { | 2443 | { |
| 2444 | int res, cpu; | ||
| 2445 | |||
| 2446 | net->ipv4.tcp_sk = alloc_percpu(struct sock *); | ||
| 2447 | if (!net->ipv4.tcp_sk) | ||
| 2448 | return -ENOMEM; | ||
| 2449 | |||
| 2450 | for_each_possible_cpu(cpu) { | ||
| 2451 | struct sock *sk; | ||
| 2452 | |||
| 2453 | res = inet_ctl_sock_create(&sk, PF_INET, SOCK_RAW, | ||
| 2454 | IPPROTO_TCP, net); | ||
| 2455 | if (res) | ||
| 2456 | goto fail; | ||
| 2457 | *per_cpu_ptr(net->ipv4.tcp_sk, cpu) = sk; | ||
| 2458 | } | ||
| 2433 | net->ipv4.sysctl_tcp_ecn = 2; | 2459 | net->ipv4.sysctl_tcp_ecn = 2; |
| 2434 | return 0; | 2460 | return 0; |
| 2435 | } | ||
| 2436 | 2461 | ||
| 2437 | static void __net_exit tcp_sk_exit(struct net *net) | 2462 | fail: |
| 2438 | { | 2463 | tcp_sk_exit(net); |
| 2464 | |||
| 2465 | return res; | ||
| 2439 | } | 2466 | } |
| 2440 | 2467 | ||
| 2441 | static void __net_exit tcp_sk_exit_batch(struct list_head *net_exit_list) | 2468 | static void __net_exit tcp_sk_exit_batch(struct list_head *net_exit_list) |
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 7f18262e2326..65caf8b95e17 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
| @@ -2019,7 +2019,7 @@ static bool tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle, | |||
| 2019 | if (unlikely(!tcp_snd_wnd_test(tp, skb, mss_now))) | 2019 | if (unlikely(!tcp_snd_wnd_test(tp, skb, mss_now))) |
| 2020 | break; | 2020 | break; |
| 2021 | 2021 | ||
| 2022 | if (tso_segs == 1) { | 2022 | if (tso_segs == 1 || !max_segs) { |
| 2023 | if (unlikely(!tcp_nagle_test(tp, skb, mss_now, | 2023 | if (unlikely(!tcp_nagle_test(tp, skb, mss_now, |
| 2024 | (tcp_skb_is_last(sk, skb) ? | 2024 | (tcp_skb_is_last(sk, skb) ? |
| 2025 | nonagle : TCP_NAGLE_PUSH)))) | 2025 | nonagle : TCP_NAGLE_PUSH)))) |
| @@ -2032,7 +2032,7 @@ static bool tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle, | |||
| 2032 | } | 2032 | } |
| 2033 | 2033 | ||
| 2034 | limit = mss_now; | 2034 | limit = mss_now; |
| 2035 | if (tso_segs > 1 && !tcp_urg_mode(tp)) | 2035 | if (tso_segs > 1 && max_segs && !tcp_urg_mode(tp)) |
| 2036 | limit = tcp_mss_split_point(sk, skb, mss_now, | 2036 | limit = tcp_mss_split_point(sk, skb, mss_now, |
| 2037 | min_t(unsigned int, | 2037 | min_t(unsigned int, |
| 2038 | cwnd_quota, | 2038 | cwnd_quota, |
diff --git a/net/ipv4/tcp_scalable.c b/net/ipv4/tcp_scalable.c index 6824afb65d93..333bcb2415ff 100644 --- a/net/ipv4/tcp_scalable.c +++ b/net/ipv4/tcp_scalable.c | |||
| @@ -25,7 +25,8 @@ static void tcp_scalable_cong_avoid(struct sock *sk, u32 ack, u32 acked) | |||
| 25 | if (tp->snd_cwnd <= tp->snd_ssthresh) | 25 | if (tp->snd_cwnd <= tp->snd_ssthresh) |
| 26 | tcp_slow_start(tp, acked); | 26 | tcp_slow_start(tp, acked); |
| 27 | else | 27 | else |
| 28 | tcp_cong_avoid_ai(tp, min(tp->snd_cwnd, TCP_SCALABLE_AI_CNT)); | 28 | tcp_cong_avoid_ai(tp, min(tp->snd_cwnd, TCP_SCALABLE_AI_CNT), |
| 29 | 1); | ||
| 29 | } | 30 | } |
| 30 | 31 | ||
| 31 | static u32 tcp_scalable_ssthresh(struct sock *sk) | 32 | static u32 tcp_scalable_ssthresh(struct sock *sk) |
diff --git a/net/ipv4/tcp_veno.c b/net/ipv4/tcp_veno.c index a4d2d2d88dca..112151eeee45 100644 --- a/net/ipv4/tcp_veno.c +++ b/net/ipv4/tcp_veno.c | |||
| @@ -159,7 +159,7 @@ static void tcp_veno_cong_avoid(struct sock *sk, u32 ack, u32 acked) | |||
| 159 | /* In the "non-congestive state", increase cwnd | 159 | /* In the "non-congestive state", increase cwnd |
| 160 | * every rtt. | 160 | * every rtt. |
| 161 | */ | 161 | */ |
| 162 | tcp_cong_avoid_ai(tp, tp->snd_cwnd); | 162 | tcp_cong_avoid_ai(tp, tp->snd_cwnd, 1); |
| 163 | } else { | 163 | } else { |
| 164 | /* In the "congestive state", increase cwnd | 164 | /* In the "congestive state", increase cwnd |
| 165 | * every other rtt. | 165 | * every other rtt. |
diff --git a/net/ipv4/tcp_yeah.c b/net/ipv4/tcp_yeah.c index cd7273218598..17d35662930d 100644 --- a/net/ipv4/tcp_yeah.c +++ b/net/ipv4/tcp_yeah.c | |||
| @@ -92,7 +92,7 @@ static void tcp_yeah_cong_avoid(struct sock *sk, u32 ack, u32 acked) | |||
| 92 | 92 | ||
| 93 | } else { | 93 | } else { |
| 94 | /* Reno */ | 94 | /* Reno */ |
| 95 | tcp_cong_avoid_ai(tp, tp->snd_cwnd); | 95 | tcp_cong_avoid_ai(tp, tp->snd_cwnd, 1); |
| 96 | } | 96 | } |
| 97 | 97 | ||
| 98 | /* The key players are v_vegas.beg_snd_una and v_beg_snd_nxt. | 98 | /* The key players are v_vegas.beg_snd_una and v_beg_snd_nxt. |
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 b2d1838897c9..f1c6d5e98322 100644 --- a/net/ipv6/ip6_fib.c +++ b/net/ipv6/ip6_fib.c | |||
| @@ -659,6 +659,29 @@ static int fib6_commit_metrics(struct dst_entry *dst, | |||
| 659 | return 0; | 659 | return 0; |
| 660 | } | 660 | } |
| 661 | 661 | ||
| 662 | static void fib6_purge_rt(struct rt6_info *rt, struct fib6_node *fn, | ||
| 663 | struct net *net) | ||
| 664 | { | ||
| 665 | if (atomic_read(&rt->rt6i_ref) != 1) { | ||
| 666 | /* This route is used as dummy address holder in some split | ||
| 667 | * nodes. It is not leaked, but it still holds other resources, | ||
| 668 | * which must be released in time. So, scan ascendant nodes | ||
| 669 | * and replace dummy references to this route with references | ||
| 670 | * to still alive ones. | ||
| 671 | */ | ||
| 672 | while (fn) { | ||
| 673 | if (!(fn->fn_flags & RTN_RTINFO) && fn->leaf == rt) { | ||
| 674 | fn->leaf = fib6_find_prefix(net, fn); | ||
| 675 | atomic_inc(&fn->leaf->rt6i_ref); | ||
| 676 | rt6_release(rt); | ||
| 677 | } | ||
| 678 | fn = fn->parent; | ||
| 679 | } | ||
| 680 | /* No more references are possible at this point. */ | ||
| 681 | BUG_ON(atomic_read(&rt->rt6i_ref) != 1); | ||
| 682 | } | ||
| 683 | } | ||
| 684 | |||
| 662 | /* | 685 | /* |
| 663 | * Insert routing information in a node. | 686 | * Insert routing information in a node. |
| 664 | */ | 687 | */ |
| @@ -807,11 +830,12 @@ add: | |||
| 807 | rt->dst.rt6_next = iter->dst.rt6_next; | 830 | rt->dst.rt6_next = iter->dst.rt6_next; |
| 808 | atomic_inc(&rt->rt6i_ref); | 831 | atomic_inc(&rt->rt6i_ref); |
| 809 | inet6_rt_notify(RTM_NEWROUTE, rt, info); | 832 | inet6_rt_notify(RTM_NEWROUTE, rt, info); |
| 810 | rt6_release(iter); | ||
| 811 | if (!(fn->fn_flags & RTN_RTINFO)) { | 833 | if (!(fn->fn_flags & RTN_RTINFO)) { |
| 812 | info->nl_net->ipv6.rt6_stats->fib_route_nodes++; | 834 | info->nl_net->ipv6.rt6_stats->fib_route_nodes++; |
| 813 | fn->fn_flags |= RTN_RTINFO; | 835 | fn->fn_flags |= RTN_RTINFO; |
| 814 | } | 836 | } |
| 837 | fib6_purge_rt(iter, fn, info->nl_net); | ||
| 838 | rt6_release(iter); | ||
| 815 | } | 839 | } |
| 816 | 840 | ||
| 817 | return 0; | 841 | return 0; |
| @@ -1322,24 +1346,7 @@ static void fib6_del_route(struct fib6_node *fn, struct rt6_info **rtp, | |||
| 1322 | fn = fib6_repair_tree(net, fn); | 1346 | fn = fib6_repair_tree(net, fn); |
| 1323 | } | 1347 | } |
| 1324 | 1348 | ||
| 1325 | if (atomic_read(&rt->rt6i_ref) != 1) { | 1349 | fib6_purge_rt(rt, fn, net); |
| 1326 | /* This route is used as dummy address holder in some split | ||
| 1327 | * nodes. It is not leaked, but it still holds other resources, | ||
| 1328 | * which must be released in time. So, scan ascendant nodes | ||
| 1329 | * and replace dummy references to this route with references | ||
| 1330 | * to still alive ones. | ||
| 1331 | */ | ||
| 1332 | while (fn) { | ||
| 1333 | if (!(fn->fn_flags & RTN_RTINFO) && fn->leaf == rt) { | ||
| 1334 | fn->leaf = fib6_find_prefix(net, fn); | ||
| 1335 | atomic_inc(&fn->leaf->rt6i_ref); | ||
| 1336 | rt6_release(rt); | ||
| 1337 | } | ||
| 1338 | fn = fn->parent; | ||
| 1339 | } | ||
| 1340 | /* No more references are possible at this point. */ | ||
| 1341 | BUG_ON(atomic_read(&rt->rt6i_ref) != 1); | ||
| 1342 | } | ||
| 1343 | 1350 | ||
| 1344 | inet6_rt_notify(RTM_DELROUTE, rt, info); | 1351 | inet6_rt_notify(RTM_DELROUTE, rt, info); |
| 1345 | rt6_release(rt); | 1352 | rt6_release(rt); |
diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c index 13cda4c6313b..01ccc28a686f 100644 --- a/net/ipv6/ip6_gre.c +++ b/net/ipv6/ip6_gre.c | |||
| @@ -417,7 +417,7 @@ static void ip6gre_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | |||
| 417 | if (code == ICMPV6_HDR_FIELD) | 417 | if (code == ICMPV6_HDR_FIELD) |
| 418 | teli = ip6_tnl_parse_tlv_enc_lim(skb, skb->data); | 418 | teli = ip6_tnl_parse_tlv_enc_lim(skb, skb->data); |
| 419 | 419 | ||
| 420 | if (teli && teli == info - 2) { | 420 | if (teli && teli == be32_to_cpu(info) - 2) { |
| 421 | tel = (struct ipv6_tlv_tnl_enc_lim *) &skb->data[teli]; | 421 | tel = (struct ipv6_tlv_tnl_enc_lim *) &skb->data[teli]; |
| 422 | if (tel->encap_limit == 0) { | 422 | if (tel->encap_limit == 0) { |
| 423 | net_warn_ratelimited("%s: Too small encapsulation limit or routing loop in tunnel!\n", | 423 | net_warn_ratelimited("%s: Too small encapsulation limit or routing loop in tunnel!\n", |
| @@ -429,7 +429,7 @@ static void ip6gre_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | |||
| 429 | } | 429 | } |
| 430 | break; | 430 | break; |
| 431 | case ICMPV6_PKT_TOOBIG: | 431 | case ICMPV6_PKT_TOOBIG: |
| 432 | mtu = info - offset; | 432 | mtu = be32_to_cpu(info) - offset; |
| 433 | if (mtu < IPV6_MIN_MTU) | 433 | if (mtu < IPV6_MIN_MTU) |
| 434 | mtu = IPV6_MIN_MTU; | 434 | mtu = IPV6_MIN_MTU; |
| 435 | t->dev->mtu = mtu; | 435 | t->dev->mtu = mtu; |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index ce69a12ae48c..d28f2a2efb32 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
| @@ -537,20 +537,6 @@ static void ip6_copy_metadata(struct sk_buff *to, struct sk_buff *from) | |||
| 537 | skb_copy_secmark(to, from); | 537 | skb_copy_secmark(to, from); |
| 538 | } | 538 | } |
| 539 | 539 | ||
| 540 | static void ipv6_select_ident(struct frag_hdr *fhdr, struct rt6_info *rt) | ||
| 541 | { | ||
| 542 | static u32 ip6_idents_hashrnd __read_mostly; | ||
| 543 | u32 hash, id; | ||
| 544 | |||
| 545 | net_get_random_once(&ip6_idents_hashrnd, sizeof(ip6_idents_hashrnd)); | ||
| 546 | |||
| 547 | hash = __ipv6_addr_jhash(&rt->rt6i_dst.addr, ip6_idents_hashrnd); | ||
| 548 | hash = __ipv6_addr_jhash(&rt->rt6i_src.addr, hash); | ||
| 549 | |||
| 550 | id = ip_idents_reserve(hash, 1); | ||
| 551 | fhdr->identification = htonl(id); | ||
| 552 | } | ||
| 553 | |||
| 554 | int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) | 540 | int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) |
| 555 | { | 541 | { |
| 556 | struct sk_buff *frag; | 542 | struct sk_buff *frag; |
diff --git a/net/ipv6/netfilter/nft_redir_ipv6.c b/net/ipv6/netfilter/nft_redir_ipv6.c index 2433a6bfb191..11820b6b3613 100644 --- a/net/ipv6/netfilter/nft_redir_ipv6.c +++ b/net/ipv6/netfilter/nft_redir_ipv6.c | |||
| @@ -27,10 +27,10 @@ static void nft_redir_ipv6_eval(const struct nft_expr *expr, | |||
| 27 | 27 | ||
| 28 | memset(&range, 0, sizeof(range)); | 28 | memset(&range, 0, sizeof(range)); |
| 29 | if (priv->sreg_proto_min) { | 29 | if (priv->sreg_proto_min) { |
| 30 | range.min_proto.all = (__force __be16) | 30 | range.min_proto.all = |
| 31 | data[priv->sreg_proto_min].data[0]; | 31 | *(__be16 *)&data[priv->sreg_proto_min].data[0]; |
| 32 | range.max_proto.all = (__force __be16) | 32 | range.max_proto.all = |
| 33 | data[priv->sreg_proto_max].data[0]; | 33 | *(__be16 *)&data[priv->sreg_proto_max].data[0]; |
| 34 | range.flags |= NF_NAT_RANGE_PROTO_SPECIFIED; | 34 | range.flags |= NF_NAT_RANGE_PROTO_SPECIFIED; |
| 35 | } | 35 | } |
| 36 | 36 | ||
diff --git a/net/ipv6/output_core.c b/net/ipv6/output_core.c index 97f41a3e68d9..54520a0bd5e3 100644 --- a/net/ipv6/output_core.c +++ b/net/ipv6/output_core.c | |||
| @@ -9,6 +9,24 @@ | |||
| 9 | #include <net/addrconf.h> | 9 | #include <net/addrconf.h> |
| 10 | #include <net/secure_seq.h> | 10 | #include <net/secure_seq.h> |
| 11 | 11 | ||
| 12 | u32 __ipv6_select_ident(u32 hashrnd, struct in6_addr *dst, struct in6_addr *src) | ||
| 13 | { | ||
| 14 | u32 hash, id; | ||
| 15 | |||
| 16 | hash = __ipv6_addr_jhash(dst, hashrnd); | ||
| 17 | hash = __ipv6_addr_jhash(src, hash); | ||
| 18 | |||
| 19 | /* Treat id of 0 as unset and if we get 0 back from ip_idents_reserve, | ||
| 20 | * set the hight order instead thus minimizing possible future | ||
| 21 | * collisions. | ||
| 22 | */ | ||
| 23 | id = ip_idents_reserve(hash, 1); | ||
| 24 | if (unlikely(!id)) | ||
| 25 | id = 1 << 31; | ||
| 26 | |||
| 27 | return id; | ||
| 28 | } | ||
| 29 | |||
| 12 | /* This function exists only for tap drivers that must support broken | 30 | /* This function exists only for tap drivers that must support broken |
| 13 | * clients requesting UFO without specifying an IPv6 fragment ID. | 31 | * clients requesting UFO without specifying an IPv6 fragment ID. |
| 14 | * | 32 | * |
| @@ -22,7 +40,7 @@ void ipv6_proxy_select_ident(struct sk_buff *skb) | |||
| 22 | static u32 ip6_proxy_idents_hashrnd __read_mostly; | 40 | static u32 ip6_proxy_idents_hashrnd __read_mostly; |
| 23 | struct in6_addr buf[2]; | 41 | struct in6_addr buf[2]; |
| 24 | struct in6_addr *addrs; | 42 | struct in6_addr *addrs; |
| 25 | u32 hash, id; | 43 | u32 id; |
| 26 | 44 | ||
| 27 | addrs = skb_header_pointer(skb, | 45 | addrs = skb_header_pointer(skb, |
| 28 | skb_network_offset(skb) + | 46 | skb_network_offset(skb) + |
| @@ -34,14 +52,25 @@ void ipv6_proxy_select_ident(struct sk_buff *skb) | |||
| 34 | net_get_random_once(&ip6_proxy_idents_hashrnd, | 52 | net_get_random_once(&ip6_proxy_idents_hashrnd, |
| 35 | sizeof(ip6_proxy_idents_hashrnd)); | 53 | sizeof(ip6_proxy_idents_hashrnd)); |
| 36 | 54 | ||
| 37 | hash = __ipv6_addr_jhash(&addrs[1], ip6_proxy_idents_hashrnd); | 55 | id = __ipv6_select_ident(ip6_proxy_idents_hashrnd, |
| 38 | hash = __ipv6_addr_jhash(&addrs[0], hash); | 56 | &addrs[1], &addrs[0]); |
| 39 | 57 | skb_shinfo(skb)->ip6_frag_id = id; | |
| 40 | id = ip_idents_reserve(hash, 1); | ||
| 41 | skb_shinfo(skb)->ip6_frag_id = htonl(id); | ||
| 42 | } | 58 | } |
| 43 | EXPORT_SYMBOL_GPL(ipv6_proxy_select_ident); | 59 | EXPORT_SYMBOL_GPL(ipv6_proxy_select_ident); |
| 44 | 60 | ||
| 61 | void ipv6_select_ident(struct frag_hdr *fhdr, struct rt6_info *rt) | ||
| 62 | { | ||
| 63 | static u32 ip6_idents_hashrnd __read_mostly; | ||
| 64 | u32 id; | ||
| 65 | |||
| 66 | net_get_random_once(&ip6_idents_hashrnd, sizeof(ip6_idents_hashrnd)); | ||
| 67 | |||
| 68 | id = __ipv6_select_ident(ip6_idents_hashrnd, &rt->rt6i_dst.addr, | ||
| 69 | &rt->rt6i_src.addr); | ||
| 70 | fhdr->identification = htonl(id); | ||
| 71 | } | ||
| 72 | EXPORT_SYMBOL(ipv6_select_ident); | ||
| 73 | |||
| 45 | int ip6_find_1stfragopt(struct sk_buff *skb, u8 **nexthdr) | 74 | int ip6_find_1stfragopt(struct sk_buff *skb, u8 **nexthdr) |
| 46 | { | 75 | { |
| 47 | u16 offset = sizeof(struct ipv6hdr); | 76 | u16 offset = sizeof(struct ipv6hdr); |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index c91083156edb..495965358d22 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/sit.c b/net/ipv6/sit.c index 213546bd6d5d..cdbfe5af6187 100644 --- a/net/ipv6/sit.c +++ b/net/ipv6/sit.c | |||
| @@ -1506,12 +1506,12 @@ static bool ipip6_netlink_encap_parms(struct nlattr *data[], | |||
| 1506 | 1506 | ||
| 1507 | if (data[IFLA_IPTUN_ENCAP_SPORT]) { | 1507 | if (data[IFLA_IPTUN_ENCAP_SPORT]) { |
| 1508 | ret = true; | 1508 | ret = true; |
| 1509 | ipencap->sport = nla_get_u16(data[IFLA_IPTUN_ENCAP_SPORT]); | 1509 | ipencap->sport = nla_get_be16(data[IFLA_IPTUN_ENCAP_SPORT]); |
| 1510 | } | 1510 | } |
| 1511 | 1511 | ||
| 1512 | if (data[IFLA_IPTUN_ENCAP_DPORT]) { | 1512 | if (data[IFLA_IPTUN_ENCAP_DPORT]) { |
| 1513 | ret = true; | 1513 | ret = true; |
| 1514 | ipencap->dport = nla_get_u16(data[IFLA_IPTUN_ENCAP_DPORT]); | 1514 | ipencap->dport = nla_get_be16(data[IFLA_IPTUN_ENCAP_DPORT]); |
| 1515 | } | 1515 | } |
| 1516 | 1516 | ||
| 1517 | return ret; | 1517 | return ret; |
| @@ -1707,9 +1707,9 @@ static int ipip6_fill_info(struct sk_buff *skb, const struct net_device *dev) | |||
| 1707 | 1707 | ||
| 1708 | if (nla_put_u16(skb, IFLA_IPTUN_ENCAP_TYPE, | 1708 | if (nla_put_u16(skb, IFLA_IPTUN_ENCAP_TYPE, |
| 1709 | tunnel->encap.type) || | 1709 | tunnel->encap.type) || |
| 1710 | nla_put_u16(skb, IFLA_IPTUN_ENCAP_SPORT, | 1710 | nla_put_be16(skb, IFLA_IPTUN_ENCAP_SPORT, |
| 1711 | tunnel->encap.sport) || | 1711 | tunnel->encap.sport) || |
| 1712 | nla_put_u16(skb, IFLA_IPTUN_ENCAP_DPORT, | 1712 | nla_put_be16(skb, IFLA_IPTUN_ENCAP_DPORT, |
| 1713 | tunnel->encap.dport) || | 1713 | tunnel->encap.dport) || |
| 1714 | nla_put_u16(skb, IFLA_IPTUN_ENCAP_FLAGS, | 1714 | nla_put_u16(skb, IFLA_IPTUN_ENCAP_FLAGS, |
| 1715 | tunnel->encap.flags)) | 1715 | tunnel->encap.flags)) |
diff --git a/net/ipv6/udp_offload.c b/net/ipv6/udp_offload.c index b6aa8ed18257..a56276996b72 100644 --- a/net/ipv6/udp_offload.c +++ b/net/ipv6/udp_offload.c | |||
| @@ -52,6 +52,10 @@ static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb, | |||
| 52 | 52 | ||
| 53 | skb_shinfo(skb)->gso_segs = DIV_ROUND_UP(skb->len, mss); | 53 | skb_shinfo(skb)->gso_segs = DIV_ROUND_UP(skb->len, mss); |
| 54 | 54 | ||
| 55 | /* Set the IPv6 fragment id if not set yet */ | ||
| 56 | if (!skb_shinfo(skb)->ip6_frag_id) | ||
| 57 | ipv6_proxy_select_ident(skb); | ||
| 58 | |||
| 55 | segs = NULL; | 59 | segs = NULL; |
| 56 | goto out; | 60 | goto out; |
| 57 | } | 61 | } |
| @@ -108,7 +112,11 @@ static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb, | |||
| 108 | fptr = (struct frag_hdr *)(skb_network_header(skb) + unfrag_ip6hlen); | 112 | fptr = (struct frag_hdr *)(skb_network_header(skb) + unfrag_ip6hlen); |
| 109 | fptr->nexthdr = nexthdr; | 113 | fptr->nexthdr = nexthdr; |
| 110 | fptr->reserved = 0; | 114 | fptr->reserved = 0; |
| 111 | fptr->identification = skb_shinfo(skb)->ip6_frag_id; | 115 | if (skb_shinfo(skb)->ip6_frag_id) |
| 116 | fptr->identification = skb_shinfo(skb)->ip6_frag_id; | ||
| 117 | else | ||
| 118 | ipv6_select_ident(fptr, | ||
| 119 | (struct rt6_info *)skb_dst(skb)); | ||
| 112 | 120 | ||
| 113 | /* Fragment the skb. ipv6 header and the remaining fields of the | 121 | /* Fragment the skb. ipv6 header and the remaining fields of the |
| 114 | * fragment header are updated in ipv6_gso_segment() | 122 | * fragment header are updated in ipv6_gso_segment() |
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/key.c b/net/mac80211/key.c index 0bb7038121ac..bd4e46ec32bd 100644 --- a/net/mac80211/key.c +++ b/net/mac80211/key.c | |||
| @@ -140,7 +140,9 @@ static int ieee80211_key_enable_hw_accel(struct ieee80211_key *key) | |||
| 140 | if (!ret) { | 140 | if (!ret) { |
| 141 | key->flags |= KEY_FLAG_UPLOADED_TO_HARDWARE; | 141 | key->flags |= KEY_FLAG_UPLOADED_TO_HARDWARE; |
| 142 | 142 | ||
| 143 | if (!(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC)) | 143 | if (!((key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC) || |
| 144 | (key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV) || | ||
| 145 | (key->conf.flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE))) | ||
| 144 | sdata->crypto_tx_tailroom_needed_cnt--; | 146 | sdata->crypto_tx_tailroom_needed_cnt--; |
| 145 | 147 | ||
| 146 | WARN_ON((key->conf.flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE) && | 148 | WARN_ON((key->conf.flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE) && |
| @@ -188,7 +190,9 @@ static void ieee80211_key_disable_hw_accel(struct ieee80211_key *key) | |||
| 188 | sta = key->sta; | 190 | sta = key->sta; |
| 189 | sdata = key->sdata; | 191 | sdata = key->sdata; |
| 190 | 192 | ||
| 191 | if (!(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC)) | 193 | if (!((key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC) || |
| 194 | (key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV) || | ||
| 195 | (key->conf.flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE))) | ||
| 192 | increment_tailroom_need_count(sdata); | 196 | increment_tailroom_need_count(sdata); |
| 193 | 197 | ||
| 194 | ret = drv_set_key(key->local, DISABLE_KEY, sdata, | 198 | ret = drv_set_key(key->local, DISABLE_KEY, sdata, |
| @@ -884,7 +888,9 @@ void ieee80211_remove_key(struct ieee80211_key_conf *keyconf) | |||
| 884 | if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE) { | 888 | if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE) { |
| 885 | key->flags &= ~KEY_FLAG_UPLOADED_TO_HARDWARE; | 889 | key->flags &= ~KEY_FLAG_UPLOADED_TO_HARDWARE; |
| 886 | 890 | ||
| 887 | if (!(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC)) | 891 | if (!((key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC) || |
| 892 | (key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV) || | ||
| 893 | (key->conf.flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE))) | ||
| 888 | increment_tailroom_need_count(key->sdata); | 894 | increment_tailroom_need_count(key->sdata); |
| 889 | } | 895 | } |
| 890 | 896 | ||
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 2c36c4765f47..837a406a9dd6 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
| @@ -1643,7 +1643,7 @@ __ieee80211_sta_handle_tspec_ac_params(struct ieee80211_sub_if_data *sdata) | |||
| 1643 | { | 1643 | { |
| 1644 | struct ieee80211_local *local = sdata->local; | 1644 | struct ieee80211_local *local = sdata->local; |
| 1645 | struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; | 1645 | struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; |
| 1646 | bool ret; | 1646 | bool ret = false; |
| 1647 | int ac; | 1647 | int ac; |
| 1648 | 1648 | ||
| 1649 | if (local->hw.queues < IEEE80211_NUM_ACS) | 1649 | if (local->hw.queues < IEEE80211_NUM_ACS) |
diff --git a/net/mac80211/pm.c b/net/mac80211/pm.c index 4c5192e0d66c..4a95fe3cffbc 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 683b10f46505..d69ca513848e 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/netfilter/ipvs/ip_vs_core.c b/net/netfilter/ipvs/ip_vs_core.c index 990decba1fe4..b87ca32efa0b 100644 --- a/net/netfilter/ipvs/ip_vs_core.c +++ b/net/netfilter/ipvs/ip_vs_core.c | |||
| @@ -659,16 +659,24 @@ static inline int ip_vs_gather_frags(struct sk_buff *skb, u_int32_t user) | |||
| 659 | return err; | 659 | return err; |
| 660 | } | 660 | } |
| 661 | 661 | ||
| 662 | static int ip_vs_route_me_harder(int af, struct sk_buff *skb) | 662 | static int ip_vs_route_me_harder(int af, struct sk_buff *skb, |
| 663 | unsigned int hooknum) | ||
| 663 | { | 664 | { |
| 665 | if (!sysctl_snat_reroute(skb)) | ||
| 666 | return 0; | ||
| 667 | /* Reroute replies only to remote clients (FORWARD and LOCAL_OUT) */ | ||
| 668 | if (NF_INET_LOCAL_IN == hooknum) | ||
| 669 | return 0; | ||
| 664 | #ifdef CONFIG_IP_VS_IPV6 | 670 | #ifdef CONFIG_IP_VS_IPV6 |
| 665 | if (af == AF_INET6) { | 671 | if (af == AF_INET6) { |
| 666 | if (sysctl_snat_reroute(skb) && ip6_route_me_harder(skb) != 0) | 672 | struct dst_entry *dst = skb_dst(skb); |
| 673 | |||
| 674 | if (dst->dev && !(dst->dev->flags & IFF_LOOPBACK) && | ||
| 675 | ip6_route_me_harder(skb) != 0) | ||
| 667 | return 1; | 676 | return 1; |
| 668 | } else | 677 | } else |
| 669 | #endif | 678 | #endif |
| 670 | if ((sysctl_snat_reroute(skb) || | 679 | if (!(skb_rtable(skb)->rt_flags & RTCF_LOCAL) && |
| 671 | skb_rtable(skb)->rt_flags & RTCF_LOCAL) && | ||
| 672 | ip_route_me_harder(skb, RTN_LOCAL) != 0) | 680 | ip_route_me_harder(skb, RTN_LOCAL) != 0) |
| 673 | return 1; | 681 | return 1; |
| 674 | 682 | ||
| @@ -791,7 +799,8 @@ static int handle_response_icmp(int af, struct sk_buff *skb, | |||
| 791 | union nf_inet_addr *snet, | 799 | union nf_inet_addr *snet, |
| 792 | __u8 protocol, struct ip_vs_conn *cp, | 800 | __u8 protocol, struct ip_vs_conn *cp, |
| 793 | struct ip_vs_protocol *pp, | 801 | struct ip_vs_protocol *pp, |
| 794 | unsigned int offset, unsigned int ihl) | 802 | unsigned int offset, unsigned int ihl, |
| 803 | unsigned int hooknum) | ||
| 795 | { | 804 | { |
| 796 | unsigned int verdict = NF_DROP; | 805 | unsigned int verdict = NF_DROP; |
| 797 | 806 | ||
| @@ -821,7 +830,7 @@ static int handle_response_icmp(int af, struct sk_buff *skb, | |||
| 821 | #endif | 830 | #endif |
| 822 | ip_vs_nat_icmp(skb, pp, cp, 1); | 831 | ip_vs_nat_icmp(skb, pp, cp, 1); |
| 823 | 832 | ||
| 824 | if (ip_vs_route_me_harder(af, skb)) | 833 | if (ip_vs_route_me_harder(af, skb, hooknum)) |
| 825 | goto out; | 834 | goto out; |
| 826 | 835 | ||
| 827 | /* do the statistics and put it back */ | 836 | /* do the statistics and put it back */ |
| @@ -916,7 +925,7 @@ static int ip_vs_out_icmp(struct sk_buff *skb, int *related, | |||
| 916 | 925 | ||
| 917 | snet.ip = iph->saddr; | 926 | snet.ip = iph->saddr; |
| 918 | return handle_response_icmp(AF_INET, skb, &snet, cih->protocol, cp, | 927 | return handle_response_icmp(AF_INET, skb, &snet, cih->protocol, cp, |
| 919 | pp, ciph.len, ihl); | 928 | pp, ciph.len, ihl, hooknum); |
| 920 | } | 929 | } |
| 921 | 930 | ||
| 922 | #ifdef CONFIG_IP_VS_IPV6 | 931 | #ifdef CONFIG_IP_VS_IPV6 |
| @@ -981,7 +990,8 @@ static int ip_vs_out_icmp_v6(struct sk_buff *skb, int *related, | |||
| 981 | snet.in6 = ciph.saddr.in6; | 990 | snet.in6 = ciph.saddr.in6; |
| 982 | writable = ciph.len; | 991 | writable = ciph.len; |
| 983 | return handle_response_icmp(AF_INET6, skb, &snet, ciph.protocol, cp, | 992 | return handle_response_icmp(AF_INET6, skb, &snet, ciph.protocol, cp, |
| 984 | pp, writable, sizeof(struct ipv6hdr)); | 993 | pp, writable, sizeof(struct ipv6hdr), |
| 994 | hooknum); | ||
| 985 | } | 995 | } |
| 986 | #endif | 996 | #endif |
| 987 | 997 | ||
| @@ -1040,7 +1050,8 @@ static inline bool is_new_conn(const struct sk_buff *skb, | |||
| 1040 | */ | 1050 | */ |
| 1041 | static unsigned int | 1051 | static unsigned int |
| 1042 | handle_response(int af, struct sk_buff *skb, struct ip_vs_proto_data *pd, | 1052 | handle_response(int af, struct sk_buff *skb, struct ip_vs_proto_data *pd, |
| 1043 | struct ip_vs_conn *cp, struct ip_vs_iphdr *iph) | 1053 | struct ip_vs_conn *cp, struct ip_vs_iphdr *iph, |
| 1054 | unsigned int hooknum) | ||
| 1044 | { | 1055 | { |
| 1045 | struct ip_vs_protocol *pp = pd->pp; | 1056 | struct ip_vs_protocol *pp = pd->pp; |
| 1046 | 1057 | ||
| @@ -1078,7 +1089,7 @@ handle_response(int af, struct sk_buff *skb, struct ip_vs_proto_data *pd, | |||
| 1078 | * if it came from this machine itself. So re-compute | 1089 | * if it came from this machine itself. So re-compute |
| 1079 | * the routing information. | 1090 | * the routing information. |
| 1080 | */ | 1091 | */ |
| 1081 | if (ip_vs_route_me_harder(af, skb)) | 1092 | if (ip_vs_route_me_harder(af, skb, hooknum)) |
| 1082 | goto drop; | 1093 | goto drop; |
| 1083 | 1094 | ||
| 1084 | IP_VS_DBG_PKT(10, af, pp, skb, 0, "After SNAT"); | 1095 | IP_VS_DBG_PKT(10, af, pp, skb, 0, "After SNAT"); |
| @@ -1181,7 +1192,7 @@ ip_vs_out(unsigned int hooknum, struct sk_buff *skb, int af) | |||
| 1181 | cp = pp->conn_out_get(af, skb, &iph, 0); | 1192 | cp = pp->conn_out_get(af, skb, &iph, 0); |
| 1182 | 1193 | ||
| 1183 | if (likely(cp)) | 1194 | if (likely(cp)) |
| 1184 | return handle_response(af, skb, pd, cp, &iph); | 1195 | return handle_response(af, skb, pd, cp, &iph, hooknum); |
| 1185 | if (sysctl_nat_icmp_send(net) && | 1196 | if (sysctl_nat_icmp_send(net) && |
| 1186 | (pp->protocol == IPPROTO_TCP || | 1197 | (pp->protocol == IPPROTO_TCP || |
| 1187 | pp->protocol == IPPROTO_UDP || | 1198 | pp->protocol == IPPROTO_UDP || |
diff --git a/net/netfilter/ipvs/ip_vs_ftp.c b/net/netfilter/ipvs/ip_vs_ftp.c index 1d5341f3761d..5d3daae98bf0 100644 --- a/net/netfilter/ipvs/ip_vs_ftp.c +++ b/net/netfilter/ipvs/ip_vs_ftp.c | |||
| @@ -183,6 +183,8 @@ static int ip_vs_ftp_out(struct ip_vs_app *app, struct ip_vs_conn *cp, | |||
| 183 | struct nf_conn *ct; | 183 | struct nf_conn *ct; |
| 184 | struct net *net; | 184 | struct net *net; |
| 185 | 185 | ||
| 186 | *diff = 0; | ||
| 187 | |||
| 186 | #ifdef CONFIG_IP_VS_IPV6 | 188 | #ifdef CONFIG_IP_VS_IPV6 |
| 187 | /* This application helper doesn't work with IPv6 yet, | 189 | /* This application helper doesn't work with IPv6 yet, |
| 188 | * so turn this into a no-op for IPv6 packets | 190 | * so turn this into a no-op for IPv6 packets |
| @@ -191,8 +193,6 @@ static int ip_vs_ftp_out(struct ip_vs_app *app, struct ip_vs_conn *cp, | |||
| 191 | return 1; | 193 | return 1; |
| 192 | #endif | 194 | #endif |
| 193 | 195 | ||
| 194 | *diff = 0; | ||
| 195 | |||
| 196 | /* Only useful for established sessions */ | 196 | /* Only useful for established sessions */ |
| 197 | if (cp->state != IP_VS_TCP_S_ESTABLISHED) | 197 | if (cp->state != IP_VS_TCP_S_ESTABLISHED) |
| 198 | return 1; | 198 | return 1; |
| @@ -322,6 +322,9 @@ static int ip_vs_ftp_in(struct ip_vs_app *app, struct ip_vs_conn *cp, | |||
| 322 | struct ip_vs_conn *n_cp; | 322 | struct ip_vs_conn *n_cp; |
| 323 | struct net *net; | 323 | struct net *net; |
| 324 | 324 | ||
| 325 | /* no diff required for incoming packets */ | ||
| 326 | *diff = 0; | ||
| 327 | |||
| 325 | #ifdef CONFIG_IP_VS_IPV6 | 328 | #ifdef CONFIG_IP_VS_IPV6 |
| 326 | /* This application helper doesn't work with IPv6 yet, | 329 | /* This application helper doesn't work with IPv6 yet, |
| 327 | * so turn this into a no-op for IPv6 packets | 330 | * so turn this into a no-op for IPv6 packets |
| @@ -330,9 +333,6 @@ static int ip_vs_ftp_in(struct ip_vs_app *app, struct ip_vs_conn *cp, | |||
| 330 | return 1; | 333 | return 1; |
| 331 | #endif | 334 | #endif |
| 332 | 335 | ||
| 333 | /* no diff required for incoming packets */ | ||
| 334 | *diff = 0; | ||
| 335 | |||
| 336 | /* Only useful for established sessions */ | 336 | /* Only useful for established sessions */ |
| 337 | if (cp->state != IP_VS_TCP_S_ESTABLISHED) | 337 | if (cp->state != IP_VS_TCP_S_ESTABLISHED) |
| 338 | return 1; | 338 | return 1; |
diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c index a11674806707..46d1b26a468e 100644 --- a/net/netfilter/nf_conntrack_core.c +++ b/net/netfilter/nf_conntrack_core.c | |||
| @@ -611,16 +611,15 @@ __nf_conntrack_confirm(struct sk_buff *skb) | |||
| 611 | */ | 611 | */ |
| 612 | NF_CT_ASSERT(!nf_ct_is_confirmed(ct)); | 612 | NF_CT_ASSERT(!nf_ct_is_confirmed(ct)); |
| 613 | pr_debug("Confirming conntrack %p\n", ct); | 613 | pr_debug("Confirming conntrack %p\n", ct); |
| 614 | /* We have to check the DYING flag inside the lock to prevent | 614 | /* We have to check the DYING flag after unlink to prevent |
| 615 | a race against nf_ct_get_next_corpse() possibly called from | 615 | * a race against nf_ct_get_next_corpse() possibly called from |
| 616 | user context, else we insert an already 'dead' hash, blocking | 616 | * user context, else we insert an already 'dead' hash, blocking |
| 617 | further use of that particular connection -JM */ | 617 | * further use of that particular connection -JM. |
| 618 | */ | ||
| 619 | nf_ct_del_from_dying_or_unconfirmed_list(ct); | ||
| 618 | 620 | ||
| 619 | if (unlikely(nf_ct_is_dying(ct))) { | 621 | if (unlikely(nf_ct_is_dying(ct))) |
| 620 | nf_conntrack_double_unlock(hash, reply_hash); | 622 | goto out; |
| 621 | local_bh_enable(); | ||
| 622 | return NF_ACCEPT; | ||
| 623 | } | ||
| 624 | 623 | ||
| 625 | /* See if there's one in the list already, including reverse: | 624 | /* See if there's one in the list already, including reverse: |
| 626 | NAT could have grabbed it without realizing, since we're | 625 | NAT could have grabbed it without realizing, since we're |
| @@ -636,8 +635,6 @@ __nf_conntrack_confirm(struct sk_buff *skb) | |||
| 636 | zone == nf_ct_zone(nf_ct_tuplehash_to_ctrack(h))) | 635 | zone == nf_ct_zone(nf_ct_tuplehash_to_ctrack(h))) |
| 637 | goto out; | 636 | goto out; |
| 638 | 637 | ||
| 639 | nf_ct_del_from_dying_or_unconfirmed_list(ct); | ||
| 640 | |||
| 641 | /* Timer relative to confirmation time, not original | 638 | /* Timer relative to confirmation time, not original |
| 642 | setting time, otherwise we'd get timer wrap in | 639 | setting time, otherwise we'd get timer wrap in |
| 643 | weird delay cases. */ | 640 | weird delay cases. */ |
| @@ -673,6 +670,7 @@ __nf_conntrack_confirm(struct sk_buff *skb) | |||
| 673 | return NF_ACCEPT; | 670 | return NF_ACCEPT; |
| 674 | 671 | ||
| 675 | out: | 672 | out: |
| 673 | nf_ct_add_to_dying_list(ct); | ||
| 676 | nf_conntrack_double_unlock(hash, reply_hash); | 674 | nf_conntrack_double_unlock(hash, reply_hash); |
| 677 | NF_CT_STAT_INC(net, insert_failed); | 675 | NF_CT_STAT_INC(net, insert_failed); |
| 678 | local_bh_enable(); | 676 | local_bh_enable(); |
diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c index 129a8daa4abf..1ff04bcd4871 100644 --- a/net/netfilter/nf_tables_api.c +++ b/net/netfilter/nf_tables_api.c | |||
| @@ -713,16 +713,12 @@ static int nft_flush_table(struct nft_ctx *ctx) | |||
| 713 | struct nft_chain *chain, *nc; | 713 | struct nft_chain *chain, *nc; |
| 714 | struct nft_set *set, *ns; | 714 | struct nft_set *set, *ns; |
| 715 | 715 | ||
| 716 | list_for_each_entry_safe(chain, nc, &ctx->table->chains, list) { | 716 | list_for_each_entry(chain, &ctx->table->chains, list) { |
| 717 | ctx->chain = chain; | 717 | ctx->chain = chain; |
| 718 | 718 | ||
| 719 | err = nft_delrule_by_chain(ctx); | 719 | err = nft_delrule_by_chain(ctx); |
| 720 | if (err < 0) | 720 | if (err < 0) |
| 721 | goto out; | 721 | goto out; |
| 722 | |||
| 723 | err = nft_delchain(ctx); | ||
| 724 | if (err < 0) | ||
| 725 | goto out; | ||
| 726 | } | 722 | } |
| 727 | 723 | ||
| 728 | list_for_each_entry_safe(set, ns, &ctx->table->sets, list) { | 724 | list_for_each_entry_safe(set, ns, &ctx->table->sets, list) { |
| @@ -735,6 +731,14 @@ static int nft_flush_table(struct nft_ctx *ctx) | |||
| 735 | goto out; | 731 | goto out; |
| 736 | } | 732 | } |
| 737 | 733 | ||
| 734 | list_for_each_entry_safe(chain, nc, &ctx->table->chains, list) { | ||
| 735 | ctx->chain = chain; | ||
| 736 | |||
| 737 | err = nft_delchain(ctx); | ||
| 738 | if (err < 0) | ||
| 739 | goto out; | ||
| 740 | } | ||
| 741 | |||
| 738 | err = nft_deltable(ctx); | 742 | err = nft_deltable(ctx); |
| 739 | out: | 743 | out: |
| 740 | return err; | 744 | return err; |
| @@ -1130,9 +1134,11 @@ static struct nft_stats __percpu *nft_stats_alloc(const struct nlattr *attr) | |||
| 1130 | /* Restore old counters on this cpu, no problem. Per-cpu statistics | 1134 | /* Restore old counters on this cpu, no problem. Per-cpu statistics |
| 1131 | * are not exposed to userspace. | 1135 | * are not exposed to userspace. |
| 1132 | */ | 1136 | */ |
| 1137 | preempt_disable(); | ||
| 1133 | stats = this_cpu_ptr(newstats); | 1138 | stats = this_cpu_ptr(newstats); |
| 1134 | stats->bytes = be64_to_cpu(nla_get_be64(tb[NFTA_COUNTER_BYTES])); | 1139 | stats->bytes = be64_to_cpu(nla_get_be64(tb[NFTA_COUNTER_BYTES])); |
| 1135 | stats->pkts = be64_to_cpu(nla_get_be64(tb[NFTA_COUNTER_PACKETS])); | 1140 | stats->pkts = be64_to_cpu(nla_get_be64(tb[NFTA_COUNTER_PACKETS])); |
| 1141 | preempt_enable(); | ||
| 1136 | 1142 | ||
| 1137 | return newstats; | 1143 | return newstats; |
| 1138 | } | 1144 | } |
| @@ -1258,8 +1264,10 @@ static int nf_tables_newchain(struct sock *nlsk, struct sk_buff *skb, | |||
| 1258 | nft_ctx_init(&ctx, skb, nlh, afi, table, chain, nla); | 1264 | nft_ctx_init(&ctx, skb, nlh, afi, table, chain, nla); |
| 1259 | trans = nft_trans_alloc(&ctx, NFT_MSG_NEWCHAIN, | 1265 | trans = nft_trans_alloc(&ctx, NFT_MSG_NEWCHAIN, |
| 1260 | sizeof(struct nft_trans_chain)); | 1266 | sizeof(struct nft_trans_chain)); |
| 1261 | if (trans == NULL) | 1267 | if (trans == NULL) { |
| 1268 | free_percpu(stats); | ||
| 1262 | return -ENOMEM; | 1269 | return -ENOMEM; |
| 1270 | } | ||
| 1263 | 1271 | ||
| 1264 | nft_trans_chain_stats(trans) = stats; | 1272 | nft_trans_chain_stats(trans) = stats; |
| 1265 | nft_trans_chain_update(trans) = true; | 1273 | nft_trans_chain_update(trans) = true; |
| @@ -1315,8 +1323,10 @@ static int nf_tables_newchain(struct sock *nlsk, struct sk_buff *skb, | |||
| 1315 | hookfn = type->hooks[hooknum]; | 1323 | hookfn = type->hooks[hooknum]; |
| 1316 | 1324 | ||
| 1317 | basechain = kzalloc(sizeof(*basechain), GFP_KERNEL); | 1325 | basechain = kzalloc(sizeof(*basechain), GFP_KERNEL); |
| 1318 | if (basechain == NULL) | 1326 | if (basechain == NULL) { |
| 1327 | module_put(type->owner); | ||
| 1319 | return -ENOMEM; | 1328 | return -ENOMEM; |
| 1329 | } | ||
| 1320 | 1330 | ||
| 1321 | if (nla[NFTA_CHAIN_COUNTERS]) { | 1331 | if (nla[NFTA_CHAIN_COUNTERS]) { |
| 1322 | stats = nft_stats_alloc(nla[NFTA_CHAIN_COUNTERS]); | 1332 | stats = nft_stats_alloc(nla[NFTA_CHAIN_COUNTERS]); |
| @@ -3749,6 +3759,24 @@ int nft_chain_validate_dependency(const struct nft_chain *chain, | |||
| 3749 | } | 3759 | } |
| 3750 | EXPORT_SYMBOL_GPL(nft_chain_validate_dependency); | 3760 | EXPORT_SYMBOL_GPL(nft_chain_validate_dependency); |
| 3751 | 3761 | ||
| 3762 | int nft_chain_validate_hooks(const struct nft_chain *chain, | ||
| 3763 | unsigned int hook_flags) | ||
| 3764 | { | ||
| 3765 | struct nft_base_chain *basechain; | ||
| 3766 | |||
| 3767 | if (chain->flags & NFT_BASE_CHAIN) { | ||
| 3768 | basechain = nft_base_chain(chain); | ||
| 3769 | |||
| 3770 | if ((1 << basechain->ops[0].hooknum) & hook_flags) | ||
| 3771 | return 0; | ||
| 3772 | |||
| 3773 | return -EOPNOTSUPP; | ||
| 3774 | } | ||
| 3775 | |||
| 3776 | return 0; | ||
| 3777 | } | ||
| 3778 | EXPORT_SYMBOL_GPL(nft_chain_validate_hooks); | ||
| 3779 | |||
| 3752 | /* | 3780 | /* |
| 3753 | * Loop detection - walk through the ruleset beginning at the destination chain | 3781 | * Loop detection - walk through the ruleset beginning at the destination chain |
| 3754 | * of a new jump until either the source chain is reached (loop) or all | 3782 | * of a new jump until either the source chain is reached (loop) or all |
diff --git a/net/netfilter/nfnetlink.c b/net/netfilter/nfnetlink.c index cde4a6702fa3..c421d94c4652 100644 --- a/net/netfilter/nfnetlink.c +++ b/net/netfilter/nfnetlink.c | |||
| @@ -321,7 +321,8 @@ replay: | |||
| 321 | nlh = nlmsg_hdr(skb); | 321 | nlh = nlmsg_hdr(skb); |
| 322 | err = 0; | 322 | err = 0; |
| 323 | 323 | ||
| 324 | if (nlh->nlmsg_len < NLMSG_HDRLEN) { | 324 | if (nlmsg_len(nlh) < sizeof(struct nfgenmsg) || |
| 325 | skb->len < nlh->nlmsg_len) { | ||
| 325 | err = -EINVAL; | 326 | err = -EINVAL; |
| 326 | goto ack; | 327 | goto ack; |
| 327 | } | 328 | } |
| @@ -469,7 +470,7 @@ static int nfnetlink_bind(struct net *net, int group) | |||
| 469 | int type; | 470 | int type; |
| 470 | 471 | ||
| 471 | if (group <= NFNLGRP_NONE || group > NFNLGRP_MAX) | 472 | if (group <= NFNLGRP_NONE || group > NFNLGRP_MAX) |
| 472 | return -EINVAL; | 473 | return 0; |
| 473 | 474 | ||
| 474 | type = nfnl_group2type[group]; | 475 | type = nfnl_group2type[group]; |
| 475 | 476 | ||
diff --git a/net/netfilter/nft_masq.c b/net/netfilter/nft_masq.c index d1ffd5eb3a9b..9aea747b43ea 100644 --- a/net/netfilter/nft_masq.c +++ b/net/netfilter/nft_masq.c | |||
| @@ -21,6 +21,21 @@ const struct nla_policy nft_masq_policy[NFTA_MASQ_MAX + 1] = { | |||
| 21 | }; | 21 | }; |
| 22 | EXPORT_SYMBOL_GPL(nft_masq_policy); | 22 | EXPORT_SYMBOL_GPL(nft_masq_policy); |
| 23 | 23 | ||
| 24 | int nft_masq_validate(const struct nft_ctx *ctx, | ||
| 25 | const struct nft_expr *expr, | ||
| 26 | const struct nft_data **data) | ||
| 27 | { | ||
| 28 | int err; | ||
| 29 | |||
| 30 | err = nft_chain_validate_dependency(ctx->chain, NFT_CHAIN_T_NAT); | ||
| 31 | if (err < 0) | ||
| 32 | return err; | ||
| 33 | |||
| 34 | return nft_chain_validate_hooks(ctx->chain, | ||
| 35 | (1 << NF_INET_POST_ROUTING)); | ||
| 36 | } | ||
| 37 | EXPORT_SYMBOL_GPL(nft_masq_validate); | ||
| 38 | |||
| 24 | int nft_masq_init(const struct nft_ctx *ctx, | 39 | int nft_masq_init(const struct nft_ctx *ctx, |
| 25 | const struct nft_expr *expr, | 40 | const struct nft_expr *expr, |
| 26 | const struct nlattr * const tb[]) | 41 | const struct nlattr * const tb[]) |
| @@ -28,8 +43,8 @@ int nft_masq_init(const struct nft_ctx *ctx, | |||
| 28 | struct nft_masq *priv = nft_expr_priv(expr); | 43 | struct nft_masq *priv = nft_expr_priv(expr); |
| 29 | int err; | 44 | int err; |
| 30 | 45 | ||
| 31 | err = nft_chain_validate_dependency(ctx->chain, NFT_CHAIN_T_NAT); | 46 | err = nft_masq_validate(ctx, expr, NULL); |
| 32 | if (err < 0) | 47 | if (err) |
| 33 | return err; | 48 | return err; |
| 34 | 49 | ||
| 35 | if (tb[NFTA_MASQ_FLAGS] == NULL) | 50 | if (tb[NFTA_MASQ_FLAGS] == NULL) |
| @@ -60,12 +75,5 @@ nla_put_failure: | |||
| 60 | } | 75 | } |
| 61 | EXPORT_SYMBOL_GPL(nft_masq_dump); | 76 | EXPORT_SYMBOL_GPL(nft_masq_dump); |
| 62 | 77 | ||
| 63 | int nft_masq_validate(const struct nft_ctx *ctx, const struct nft_expr *expr, | ||
| 64 | const struct nft_data **data) | ||
| 65 | { | ||
| 66 | return nft_chain_validate_dependency(ctx->chain, NFT_CHAIN_T_NAT); | ||
| 67 | } | ||
| 68 | EXPORT_SYMBOL_GPL(nft_masq_validate); | ||
| 69 | |||
| 70 | MODULE_LICENSE("GPL"); | 78 | MODULE_LICENSE("GPL"); |
| 71 | MODULE_AUTHOR("Arturo Borrero Gonzalez <arturo.borrero.glez@gmail.com>"); | 79 | MODULE_AUTHOR("Arturo Borrero Gonzalez <arturo.borrero.glez@gmail.com>"); |
diff --git a/net/netfilter/nft_nat.c b/net/netfilter/nft_nat.c index afe2b0b45ec4..a0837c6c9283 100644 --- a/net/netfilter/nft_nat.c +++ b/net/netfilter/nft_nat.c | |||
| @@ -65,10 +65,10 @@ static void nft_nat_eval(const struct nft_expr *expr, | |||
| 65 | } | 65 | } |
| 66 | 66 | ||
| 67 | if (priv->sreg_proto_min) { | 67 | if (priv->sreg_proto_min) { |
| 68 | range.min_proto.all = (__force __be16) | 68 | range.min_proto.all = |
| 69 | data[priv->sreg_proto_min].data[0]; | 69 | *(__be16 *)&data[priv->sreg_proto_min].data[0]; |
| 70 | range.max_proto.all = (__force __be16) | 70 | range.max_proto.all = |
| 71 | data[priv->sreg_proto_max].data[0]; | 71 | *(__be16 *)&data[priv->sreg_proto_max].data[0]; |
| 72 | range.flags |= NF_NAT_RANGE_PROTO_SPECIFIED; | 72 | range.flags |= NF_NAT_RANGE_PROTO_SPECIFIED; |
| 73 | } | 73 | } |
| 74 | 74 | ||
| @@ -88,17 +88,40 @@ static const struct nla_policy nft_nat_policy[NFTA_NAT_MAX + 1] = { | |||
| 88 | [NFTA_NAT_FLAGS] = { .type = NLA_U32 }, | 88 | [NFTA_NAT_FLAGS] = { .type = NLA_U32 }, |
| 89 | }; | 89 | }; |
| 90 | 90 | ||
| 91 | static int nft_nat_init(const struct nft_ctx *ctx, const struct nft_expr *expr, | 91 | static int nft_nat_validate(const struct nft_ctx *ctx, |
| 92 | const struct nlattr * const tb[]) | 92 | const struct nft_expr *expr, |
| 93 | const struct nft_data **data) | ||
| 93 | { | 94 | { |
| 94 | struct nft_nat *priv = nft_expr_priv(expr); | 95 | struct nft_nat *priv = nft_expr_priv(expr); |
| 95 | u32 family; | ||
| 96 | int err; | 96 | int err; |
| 97 | 97 | ||
| 98 | err = nft_chain_validate_dependency(ctx->chain, NFT_CHAIN_T_NAT); | 98 | err = nft_chain_validate_dependency(ctx->chain, NFT_CHAIN_T_NAT); |
| 99 | if (err < 0) | 99 | if (err < 0) |
| 100 | return err; | 100 | return err; |
| 101 | 101 | ||
| 102 | switch (priv->type) { | ||
| 103 | case NFT_NAT_SNAT: | ||
| 104 | err = nft_chain_validate_hooks(ctx->chain, | ||
| 105 | (1 << NF_INET_POST_ROUTING) | | ||
| 106 | (1 << NF_INET_LOCAL_IN)); | ||
| 107 | break; | ||
| 108 | case NFT_NAT_DNAT: | ||
| 109 | err = nft_chain_validate_hooks(ctx->chain, | ||
| 110 | (1 << NF_INET_PRE_ROUTING) | | ||
| 111 | (1 << NF_INET_LOCAL_OUT)); | ||
| 112 | break; | ||
| 113 | } | ||
| 114 | |||
| 115 | return err; | ||
| 116 | } | ||
| 117 | |||
| 118 | static int nft_nat_init(const struct nft_ctx *ctx, const struct nft_expr *expr, | ||
| 119 | const struct nlattr * const tb[]) | ||
| 120 | { | ||
| 121 | struct nft_nat *priv = nft_expr_priv(expr); | ||
| 122 | u32 family; | ||
| 123 | int err; | ||
| 124 | |||
| 102 | if (tb[NFTA_NAT_TYPE] == NULL || | 125 | if (tb[NFTA_NAT_TYPE] == NULL || |
| 103 | (tb[NFTA_NAT_REG_ADDR_MIN] == NULL && | 126 | (tb[NFTA_NAT_REG_ADDR_MIN] == NULL && |
| 104 | tb[NFTA_NAT_REG_PROTO_MIN] == NULL)) | 127 | tb[NFTA_NAT_REG_PROTO_MIN] == NULL)) |
| @@ -115,6 +138,10 @@ static int nft_nat_init(const struct nft_ctx *ctx, const struct nft_expr *expr, | |||
| 115 | return -EINVAL; | 138 | return -EINVAL; |
| 116 | } | 139 | } |
| 117 | 140 | ||
| 141 | err = nft_nat_validate(ctx, expr, NULL); | ||
| 142 | if (err < 0) | ||
| 143 | return err; | ||
| 144 | |||
| 118 | if (tb[NFTA_NAT_FAMILY] == NULL) | 145 | if (tb[NFTA_NAT_FAMILY] == NULL) |
| 119 | return -EINVAL; | 146 | return -EINVAL; |
| 120 | 147 | ||
| @@ -219,13 +246,6 @@ nla_put_failure: | |||
| 219 | return -1; | 246 | return -1; |
| 220 | } | 247 | } |
| 221 | 248 | ||
| 222 | static int nft_nat_validate(const struct nft_ctx *ctx, | ||
| 223 | const struct nft_expr *expr, | ||
| 224 | const struct nft_data **data) | ||
| 225 | { | ||
| 226 | return nft_chain_validate_dependency(ctx->chain, NFT_CHAIN_T_NAT); | ||
| 227 | } | ||
| 228 | |||
| 229 | static struct nft_expr_type nft_nat_type; | 249 | static struct nft_expr_type nft_nat_type; |
| 230 | static const struct nft_expr_ops nft_nat_ops = { | 250 | static const struct nft_expr_ops nft_nat_ops = { |
| 231 | .type = &nft_nat_type, | 251 | .type = &nft_nat_type, |
diff --git a/net/netfilter/nft_redir.c b/net/netfilter/nft_redir.c index 9e8093f28311..d7e9e93a4e90 100644 --- a/net/netfilter/nft_redir.c +++ b/net/netfilter/nft_redir.c | |||
| @@ -23,6 +23,22 @@ const struct nla_policy nft_redir_policy[NFTA_REDIR_MAX + 1] = { | |||
| 23 | }; | 23 | }; |
| 24 | EXPORT_SYMBOL_GPL(nft_redir_policy); | 24 | EXPORT_SYMBOL_GPL(nft_redir_policy); |
| 25 | 25 | ||
| 26 | int nft_redir_validate(const struct nft_ctx *ctx, | ||
| 27 | const struct nft_expr *expr, | ||
| 28 | const struct nft_data **data) | ||
| 29 | { | ||
| 30 | int err; | ||
| 31 | |||
| 32 | err = nft_chain_validate_dependency(ctx->chain, NFT_CHAIN_T_NAT); | ||
| 33 | if (err < 0) | ||
| 34 | return err; | ||
| 35 | |||
| 36 | return nft_chain_validate_hooks(ctx->chain, | ||
| 37 | (1 << NF_INET_PRE_ROUTING) | | ||
| 38 | (1 << NF_INET_LOCAL_OUT)); | ||
| 39 | } | ||
| 40 | EXPORT_SYMBOL_GPL(nft_redir_validate); | ||
| 41 | |||
| 26 | int nft_redir_init(const struct nft_ctx *ctx, | 42 | int nft_redir_init(const struct nft_ctx *ctx, |
| 27 | const struct nft_expr *expr, | 43 | const struct nft_expr *expr, |
| 28 | const struct nlattr * const tb[]) | 44 | const struct nlattr * const tb[]) |
| @@ -30,7 +46,7 @@ int nft_redir_init(const struct nft_ctx *ctx, | |||
| 30 | struct nft_redir *priv = nft_expr_priv(expr); | 46 | struct nft_redir *priv = nft_expr_priv(expr); |
| 31 | int err; | 47 | int err; |
| 32 | 48 | ||
| 33 | err = nft_chain_validate_dependency(ctx->chain, NFT_CHAIN_T_NAT); | 49 | err = nft_redir_validate(ctx, expr, NULL); |
| 34 | if (err < 0) | 50 | if (err < 0) |
| 35 | return err; | 51 | return err; |
| 36 | 52 | ||
| @@ -88,12 +104,5 @@ nla_put_failure: | |||
| 88 | } | 104 | } |
| 89 | EXPORT_SYMBOL_GPL(nft_redir_dump); | 105 | EXPORT_SYMBOL_GPL(nft_redir_dump); |
| 90 | 106 | ||
| 91 | int nft_redir_validate(const struct nft_ctx *ctx, const struct nft_expr *expr, | ||
| 92 | const struct nft_data **data) | ||
| 93 | { | ||
| 94 | return nft_chain_validate_dependency(ctx->chain, NFT_CHAIN_T_NAT); | ||
| 95 | } | ||
| 96 | EXPORT_SYMBOL_GPL(nft_redir_validate); | ||
| 97 | |||
| 98 | MODULE_LICENSE("GPL"); | 107 | MODULE_LICENSE("GPL"); |
| 99 | MODULE_AUTHOR("Arturo Borrero Gonzalez <arturo.borrero.glez@gmail.com>"); | 108 | MODULE_AUTHOR("Arturo Borrero Gonzalez <arturo.borrero.glez@gmail.com>"); |
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 84ea76ca3f1f..75532efa51cd 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> |
| @@ -1095,6 +1096,8 @@ static void netlink_remove(struct sock *sk) | |||
| 1095 | __sk_del_bind_node(sk); | 1096 | __sk_del_bind_node(sk); |
| 1096 | netlink_update_listeners(sk); | 1097 | netlink_update_listeners(sk); |
| 1097 | } | 1098 | } |
| 1099 | if (sk->sk_protocol == NETLINK_GENERIC) | ||
| 1100 | atomic_inc(&genl_sk_destructing_cnt); | ||
| 1098 | netlink_table_ungrab(); | 1101 | netlink_table_ungrab(); |
| 1099 | } | 1102 | } |
| 1100 | 1103 | ||
| @@ -1211,6 +1214,20 @@ static int netlink_release(struct socket *sock) | |||
| 1211 | * will be purged. | 1214 | * will be purged. |
| 1212 | */ | 1215 | */ |
| 1213 | 1216 | ||
| 1217 | /* must not acquire netlink_table_lock in any way again before unbind | ||
| 1218 | * and notifying genetlink is done as otherwise it might deadlock | ||
| 1219 | */ | ||
| 1220 | if (nlk->netlink_unbind) { | ||
| 1221 | int i; | ||
| 1222 | |||
| 1223 | for (i = 0; i < nlk->ngroups; i++) | ||
| 1224 | if (test_bit(i, nlk->groups)) | ||
| 1225 | nlk->netlink_unbind(sock_net(sk), i + 1); | ||
| 1226 | } | ||
| 1227 | if (sk->sk_protocol == NETLINK_GENERIC && | ||
| 1228 | atomic_dec_return(&genl_sk_destructing_cnt) == 0) | ||
| 1229 | wake_up(&genl_sk_destructing_waitq); | ||
| 1230 | |||
| 1214 | sock->sk = NULL; | 1231 | sock->sk = NULL; |
| 1215 | wake_up_interruptible_all(&nlk->wait); | 1232 | wake_up_interruptible_all(&nlk->wait); |
| 1216 | 1233 | ||
| @@ -1246,13 +1263,6 @@ static int netlink_release(struct socket *sock) | |||
| 1246 | netlink_table_ungrab(); | 1263 | netlink_table_ungrab(); |
| 1247 | } | 1264 | } |
| 1248 | 1265 | ||
| 1249 | if (nlk->netlink_unbind) { | ||
| 1250 | int i; | ||
| 1251 | |||
| 1252 | for (i = 0; i < nlk->ngroups; i++) | ||
| 1253 | if (test_bit(i, nlk->groups)) | ||
| 1254 | nlk->netlink_unbind(sock_net(sk), i + 1); | ||
| 1255 | } | ||
| 1256 | kfree(nlk->groups); | 1266 | kfree(nlk->groups); |
| 1257 | nlk->groups = NULL; | 1267 | nlk->groups = NULL; |
| 1258 | 1268 | ||
| @@ -1428,7 +1438,7 @@ static void netlink_undo_bind(int group, long unsigned int groups, | |||
| 1428 | 1438 | ||
| 1429 | for (undo = 0; undo < group; undo++) | 1439 | for (undo = 0; undo < group; undo++) |
| 1430 | if (test_bit(undo, &groups)) | 1440 | if (test_bit(undo, &groups)) |
| 1431 | nlk->netlink_unbind(sock_net(sk), undo); | 1441 | nlk->netlink_unbind(sock_net(sk), undo + 1); |
| 1432 | } | 1442 | } |
| 1433 | 1443 | ||
| 1434 | static int netlink_bind(struct socket *sock, struct sockaddr *addr, | 1444 | static int netlink_bind(struct socket *sock, struct sockaddr *addr, |
| @@ -1466,7 +1476,7 @@ static int netlink_bind(struct socket *sock, struct sockaddr *addr, | |||
| 1466 | for (group = 0; group < nlk->ngroups; group++) { | 1476 | for (group = 0; group < nlk->ngroups; group++) { |
| 1467 | if (!test_bit(group, &groups)) | 1477 | if (!test_bit(group, &groups)) |
| 1468 | continue; | 1478 | continue; |
| 1469 | err = nlk->netlink_bind(net, group); | 1479 | err = nlk->netlink_bind(net, group + 1); |
| 1470 | if (!err) | 1480 | if (!err) |
| 1471 | continue; | 1481 | continue; |
| 1472 | netlink_undo_bind(group, groups, sk); | 1482 | netlink_undo_bind(group, groups, sk); |
diff --git a/net/netlink/af_netlink.h b/net/netlink/af_netlink.h index f123a88496f8..f1c31b39aa3e 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 2e11061ef885..ee57459fc258 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); |
| @@ -985,7 +991,7 @@ static struct genl_multicast_group genl_ctrl_groups[] = { | |||
| 985 | 991 | ||
| 986 | static int genl_bind(struct net *net, int group) | 992 | static int genl_bind(struct net *net, int group) |
| 987 | { | 993 | { |
| 988 | int i, err = 0; | 994 | int i, err = -ENOENT; |
| 989 | 995 | ||
| 990 | down_read(&cb_lock); | 996 | down_read(&cb_lock); |
| 991 | for (i = 0; i < GENL_FAM_TAB_SIZE; i++) { | 997 | for (i = 0; i < GENL_FAM_TAB_SIZE; i++) { |
| @@ -1014,7 +1020,6 @@ static int genl_bind(struct net *net, int group) | |||
| 1014 | static void genl_unbind(struct net *net, int group) | 1020 | static void genl_unbind(struct net *net, int group) |
| 1015 | { | 1021 | { |
| 1016 | int i; | 1022 | int i; |
| 1017 | bool found = false; | ||
| 1018 | 1023 | ||
| 1019 | down_read(&cb_lock); | 1024 | down_read(&cb_lock); |
| 1020 | for (i = 0; i < GENL_FAM_TAB_SIZE; i++) { | 1025 | for (i = 0; i < GENL_FAM_TAB_SIZE; i++) { |
| @@ -1027,14 +1032,11 @@ static void genl_unbind(struct net *net, int group) | |||
| 1027 | 1032 | ||
| 1028 | if (f->mcast_unbind) | 1033 | if (f->mcast_unbind) |
| 1029 | f->mcast_unbind(net, fam_grp); | 1034 | f->mcast_unbind(net, fam_grp); |
| 1030 | found = true; | ||
| 1031 | break; | 1035 | break; |
| 1032 | } | 1036 | } |
| 1033 | } | 1037 | } |
| 1034 | } | 1038 | } |
| 1035 | up_read(&cb_lock); | 1039 | up_read(&cb_lock); |
| 1036 | |||
| 1037 | WARN_ON(!found); | ||
| 1038 | } | 1040 | } |
| 1039 | 1041 | ||
| 1040 | static int __net_init genl_pernet_init(struct net *net) | 1042 | static int __net_init genl_pernet_init(struct net *net) |
diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c index 4e9a5f035cbc..b07349e82d78 100644 --- a/net/openvswitch/datapath.c +++ b/net/openvswitch/datapath.c | |||
| @@ -524,7 +524,7 @@ static int ovs_packet_cmd_execute(struct sk_buff *skb, struct genl_info *info) | |||
| 524 | struct vport *input_vport; | 524 | struct vport *input_vport; |
| 525 | int len; | 525 | int len; |
| 526 | int err; | 526 | int err; |
| 527 | bool log = !a[OVS_FLOW_ATTR_PROBE]; | 527 | bool log = !a[OVS_PACKET_ATTR_PROBE]; |
| 528 | 528 | ||
| 529 | err = -EINVAL; | 529 | err = -EINVAL; |
| 530 | if (!a[OVS_PACKET_ATTR_PACKET] || !a[OVS_PACKET_ATTR_KEY] || | 530 | if (!a[OVS_PACKET_ATTR_PACKET] || !a[OVS_PACKET_ATTR_KEY] || |
| @@ -610,6 +610,7 @@ static const struct nla_policy packet_policy[OVS_PACKET_ATTR_MAX + 1] = { | |||
| 610 | [OVS_PACKET_ATTR_PACKET] = { .len = ETH_HLEN }, | 610 | [OVS_PACKET_ATTR_PACKET] = { .len = ETH_HLEN }, |
| 611 | [OVS_PACKET_ATTR_KEY] = { .type = NLA_NESTED }, | 611 | [OVS_PACKET_ATTR_KEY] = { .type = NLA_NESTED }, |
| 612 | [OVS_PACKET_ATTR_ACTIONS] = { .type = NLA_NESTED }, | 612 | [OVS_PACKET_ATTR_ACTIONS] = { .type = NLA_NESTED }, |
| 613 | [OVS_PACKET_ATTR_PROBE] = { .type = NLA_FLAG }, | ||
| 613 | }; | 614 | }; |
| 614 | 615 | ||
| 615 | static const struct genl_ops dp_packet_genl_ops[] = { | 616 | static const struct genl_ops dp_packet_genl_ops[] = { |
diff --git a/net/openvswitch/flow.c b/net/openvswitch/flow.c index 70bef2ab7f2b..da2fae0873a5 100644 --- a/net/openvswitch/flow.c +++ b/net/openvswitch/flow.c | |||
| @@ -70,6 +70,7 @@ void ovs_flow_stats_update(struct sw_flow *flow, __be16 tcp_flags, | |||
| 70 | { | 70 | { |
| 71 | struct flow_stats *stats; | 71 | struct flow_stats *stats; |
| 72 | int node = numa_node_id(); | 72 | int node = numa_node_id(); |
| 73 | int len = skb->len + (vlan_tx_tag_present(skb) ? VLAN_HLEN : 0); | ||
| 73 | 74 | ||
| 74 | stats = rcu_dereference(flow->stats[node]); | 75 | stats = rcu_dereference(flow->stats[node]); |
| 75 | 76 | ||
| @@ -105,7 +106,7 @@ void ovs_flow_stats_update(struct sw_flow *flow, __be16 tcp_flags, | |||
| 105 | if (likely(new_stats)) { | 106 | if (likely(new_stats)) { |
| 106 | new_stats->used = jiffies; | 107 | new_stats->used = jiffies; |
| 107 | new_stats->packet_count = 1; | 108 | new_stats->packet_count = 1; |
| 108 | new_stats->byte_count = skb->len; | 109 | new_stats->byte_count = len; |
| 109 | new_stats->tcp_flags = tcp_flags; | 110 | new_stats->tcp_flags = tcp_flags; |
| 110 | spin_lock_init(&new_stats->lock); | 111 | spin_lock_init(&new_stats->lock); |
| 111 | 112 | ||
| @@ -120,7 +121,7 @@ void ovs_flow_stats_update(struct sw_flow *flow, __be16 tcp_flags, | |||
| 120 | 121 | ||
| 121 | stats->used = jiffies; | 122 | stats->used = jiffies; |
| 122 | stats->packet_count++; | 123 | stats->packet_count++; |
| 123 | stats->byte_count += skb->len; | 124 | stats->byte_count += len; |
| 124 | stats->tcp_flags |= tcp_flags; | 125 | stats->tcp_flags |= tcp_flags; |
| 125 | unlock: | 126 | unlock: |
| 126 | spin_unlock(&stats->lock); | 127 | spin_unlock(&stats->lock); |
diff --git a/net/openvswitch/vport.c b/net/openvswitch/vport.c index 53f3ebbfceab..2034c6d9cb5a 100644 --- a/net/openvswitch/vport.c +++ b/net/openvswitch/vport.c | |||
| @@ -480,7 +480,7 @@ void ovs_vport_receive(struct vport *vport, struct sk_buff *skb, | |||
| 480 | stats = this_cpu_ptr(vport->percpu_stats); | 480 | stats = this_cpu_ptr(vport->percpu_stats); |
| 481 | u64_stats_update_begin(&stats->syncp); | 481 | u64_stats_update_begin(&stats->syncp); |
| 482 | stats->rx_packets++; | 482 | stats->rx_packets++; |
| 483 | stats->rx_bytes += skb->len; | 483 | stats->rx_bytes += skb->len + (vlan_tx_tag_present(skb) ? VLAN_HLEN : 0); |
| 484 | u64_stats_update_end(&stats->syncp); | 484 | u64_stats_update_end(&stats->syncp); |
| 485 | 485 | ||
| 486 | OVS_CB(skb)->input_vport = vport; | 486 | OVS_CB(skb)->input_vport = vport; |
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 6880f34a529a..9cfe2e1dd8b5 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c | |||
| @@ -2517,7 +2517,7 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len) | |||
| 2517 | err = -EINVAL; | 2517 | err = -EINVAL; |
| 2518 | if (sock->type == SOCK_DGRAM) { | 2518 | if (sock->type == SOCK_DGRAM) { |
| 2519 | offset = dev_hard_header(skb, dev, ntohs(proto), addr, NULL, len); | 2519 | offset = dev_hard_header(skb, dev, ntohs(proto), addr, NULL, len); |
| 2520 | if (unlikely(offset) < 0) | 2520 | if (unlikely(offset < 0)) |
| 2521 | goto out_free; | 2521 | goto out_free; |
| 2522 | } else { | 2522 | } else { |
| 2523 | if (ll_header_truncated(dev, len)) | 2523 | if (ll_header_truncated(dev, len)) |
diff --git a/net/rds/sysctl.c b/net/rds/sysctl.c index c3b0cd43eb56..c173f69e1479 100644 --- a/net/rds/sysctl.c +++ b/net/rds/sysctl.c | |||
| @@ -71,14 +71,14 @@ static struct ctl_table rds_sysctl_rds_table[] = { | |||
| 71 | { | 71 | { |
| 72 | .procname = "max_unacked_packets", | 72 | .procname = "max_unacked_packets", |
| 73 | .data = &rds_sysctl_max_unacked_packets, | 73 | .data = &rds_sysctl_max_unacked_packets, |
| 74 | .maxlen = sizeof(unsigned long), | 74 | .maxlen = sizeof(int), |
| 75 | .mode = 0644, | 75 | .mode = 0644, |
| 76 | .proc_handler = proc_dointvec, | 76 | .proc_handler = proc_dointvec, |
| 77 | }, | 77 | }, |
| 78 | { | 78 | { |
| 79 | .procname = "max_unacked_bytes", | 79 | .procname = "max_unacked_bytes", |
| 80 | .data = &rds_sysctl_max_unacked_bytes, | 80 | .data = &rds_sysctl_max_unacked_bytes, |
| 81 | .maxlen = sizeof(unsigned long), | 81 | .maxlen = sizeof(int), |
| 82 | .mode = 0644, | 82 | .mode = 0644, |
| 83 | .proc_handler = proc_dointvec, | 83 | .proc_handler = proc_dointvec, |
| 84 | }, | 84 | }, |
diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c index aad6a679fb13..baef987fe2c0 100644 --- a/net/sched/cls_api.c +++ b/net/sched/cls_api.c | |||
| @@ -556,8 +556,9 @@ void tcf_exts_change(struct tcf_proto *tp, struct tcf_exts *dst, | |||
| 556 | } | 556 | } |
| 557 | EXPORT_SYMBOL(tcf_exts_change); | 557 | EXPORT_SYMBOL(tcf_exts_change); |
| 558 | 558 | ||
| 559 | #define tcf_exts_first_act(ext) \ | 559 | #define tcf_exts_first_act(ext) \ |
| 560 | list_first_entry(&(exts)->actions, struct tc_action, list) | 560 | list_first_entry_or_null(&(exts)->actions, \ |
| 561 | struct tc_action, list) | ||
| 561 | 562 | ||
| 562 | int tcf_exts_dump(struct sk_buff *skb, struct tcf_exts *exts) | 563 | int tcf_exts_dump(struct sk_buff *skb, struct tcf_exts *exts) |
| 563 | { | 564 | { |
| @@ -603,7 +604,7 @@ int tcf_exts_dump_stats(struct sk_buff *skb, struct tcf_exts *exts) | |||
| 603 | { | 604 | { |
| 604 | #ifdef CONFIG_NET_CLS_ACT | 605 | #ifdef CONFIG_NET_CLS_ACT |
| 605 | struct tc_action *a = tcf_exts_first_act(exts); | 606 | struct tc_action *a = tcf_exts_first_act(exts); |
| 606 | if (tcf_action_copy_stats(skb, a, 1) < 0) | 607 | if (a != NULL && tcf_action_copy_stats(skb, a, 1) < 0) |
| 607 | return -1; | 608 | return -1; |
| 608 | #endif | 609 | #endif |
| 609 | return 0; | 610 | return 0; |
diff --git a/net/sched/cls_bpf.c b/net/sched/cls_bpf.c index 84c8219c3e1c..f59adf8a4cd7 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_len * sizeof(*bpf_ops); | 182 | bpf_size = bpf_len * 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/sched/sch_fq.c b/net/sched/sch_fq.c index 9b05924cc386..333cd94ba381 100644 --- a/net/sched/sch_fq.c +++ b/net/sched/sch_fq.c | |||
| @@ -670,8 +670,14 @@ static int fq_change(struct Qdisc *sch, struct nlattr *opt) | |||
| 670 | if (tb[TCA_FQ_FLOW_PLIMIT]) | 670 | if (tb[TCA_FQ_FLOW_PLIMIT]) |
| 671 | q->flow_plimit = nla_get_u32(tb[TCA_FQ_FLOW_PLIMIT]); | 671 | q->flow_plimit = nla_get_u32(tb[TCA_FQ_FLOW_PLIMIT]); |
| 672 | 672 | ||
| 673 | if (tb[TCA_FQ_QUANTUM]) | 673 | if (tb[TCA_FQ_QUANTUM]) { |
| 674 | q->quantum = nla_get_u32(tb[TCA_FQ_QUANTUM]); | 674 | u32 quantum = nla_get_u32(tb[TCA_FQ_QUANTUM]); |
| 675 | |||
| 676 | if (quantum > 0) | ||
| 677 | q->quantum = quantum; | ||
| 678 | else | ||
| 679 | err = -EINVAL; | ||
| 680 | } | ||
| 675 | 681 | ||
| 676 | if (tb[TCA_FQ_INITIAL_QUANTUM]) | 682 | if (tb[TCA_FQ_INITIAL_QUANTUM]) |
| 677 | q->initial_quantum = nla_get_u32(tb[TCA_FQ_INITIAL_QUANTUM]); | 683 | q->initial_quantum = nla_get_u32(tb[TCA_FQ_INITIAL_QUANTUM]); |
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/sm_make_chunk.c b/net/sctp/sm_make_chunk.c index e49e231cef52..06320c8c1c86 100644 --- a/net/sctp/sm_make_chunk.c +++ b/net/sctp/sm_make_chunk.c | |||
| @@ -2608,7 +2608,7 @@ do_addr_param: | |||
| 2608 | 2608 | ||
| 2609 | addr_param = param.v + sizeof(sctp_addip_param_t); | 2609 | addr_param = param.v + sizeof(sctp_addip_param_t); |
| 2610 | 2610 | ||
| 2611 | af = sctp_get_af_specific(param_type2af(param.p->type)); | 2611 | af = sctp_get_af_specific(param_type2af(addr_param->p.type)); |
| 2612 | if (af == NULL) | 2612 | if (af == NULL) |
| 2613 | break; | 2613 | break; |
| 2614 | 2614 | ||
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 a2c33a4dc7ba..418795caa897 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/sunrpc/xdr.c b/net/sunrpc/xdr.c index 1cb61242e55e..4439ac4c1b53 100644 --- a/net/sunrpc/xdr.c +++ b/net/sunrpc/xdr.c | |||
| @@ -606,7 +606,7 @@ void xdr_truncate_encode(struct xdr_stream *xdr, size_t len) | |||
| 606 | struct kvec *head = buf->head; | 606 | struct kvec *head = buf->head; |
| 607 | struct kvec *tail = buf->tail; | 607 | struct kvec *tail = buf->tail; |
| 608 | int fraglen; | 608 | int fraglen; |
| 609 | int new, old; | 609 | int new; |
| 610 | 610 | ||
| 611 | if (len > buf->len) { | 611 | if (len > buf->len) { |
| 612 | WARN_ON_ONCE(1); | 612 | WARN_ON_ONCE(1); |
| @@ -629,8 +629,8 @@ void xdr_truncate_encode(struct xdr_stream *xdr, size_t len) | |||
| 629 | buf->len -= fraglen; | 629 | buf->len -= fraglen; |
| 630 | 630 | ||
| 631 | new = buf->page_base + buf->page_len; | 631 | new = buf->page_base + buf->page_len; |
| 632 | old = new + fraglen; | 632 | |
| 633 | xdr->page_ptr -= (old >> PAGE_SHIFT) - (new >> PAGE_SHIFT); | 633 | xdr->page_ptr = buf->pages + (new >> PAGE_SHIFT); |
| 634 | 634 | ||
| 635 | if (buf->page_len) { | 635 | if (buf->page_len) { |
| 636 | xdr->p = page_address(*xdr->page_ptr); | 636 | xdr->p = page_address(*xdr->page_ptr); |
diff --git a/net/tipc/bcast.c b/net/tipc/bcast.c index 96ceefeb9daf..a9e174fc0f91 100644 --- a/net/tipc/bcast.c +++ b/net/tipc/bcast.c | |||
| @@ -220,10 +220,11 @@ static void bclink_retransmit_pkt(u32 after, u32 to) | |||
| 220 | struct sk_buff *skb; | 220 | struct sk_buff *skb; |
| 221 | 221 | ||
| 222 | skb_queue_walk(&bcl->outqueue, skb) { | 222 | skb_queue_walk(&bcl->outqueue, skb) { |
| 223 | if (more(buf_seqno(skb), after)) | 223 | if (more(buf_seqno(skb), after)) { |
| 224 | tipc_link_retransmit(bcl, skb, mod(to - after)); | ||
| 224 | break; | 225 | break; |
| 226 | } | ||
| 225 | } | 227 | } |
| 226 | tipc_link_retransmit(bcl, skb, mod(to - after)); | ||
| 227 | } | 228 | } |
| 228 | 229 | ||
| 229 | /** | 230 | /** |
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 7ca4b5133123..8887c6e5fca8 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
| @@ -2854,6 +2854,9 @@ static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info) | |||
| 2854 | if (!rdev->ops->get_key) | 2854 | if (!rdev->ops->get_key) |
| 2855 | return -EOPNOTSUPP; | 2855 | return -EOPNOTSUPP; |
| 2856 | 2856 | ||
| 2857 | if (!pairwise && mac_addr && !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) | ||
| 2858 | return -ENOENT; | ||
| 2859 | |||
| 2857 | msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); | 2860 | msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); |
| 2858 | if (!msg) | 2861 | if (!msg) |
| 2859 | return -ENOMEM; | 2862 | return -ENOMEM; |
| @@ -2873,10 +2876,6 @@ static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info) | |||
| 2873 | nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr)) | 2876 | nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr)) |
| 2874 | goto nla_put_failure; | 2877 | goto nla_put_failure; |
| 2875 | 2878 | ||
| 2876 | if (pairwise && mac_addr && | ||
| 2877 | !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) | ||
| 2878 | return -ENOENT; | ||
| 2879 | |||
| 2880 | err = rdev_get_key(rdev, dev, key_idx, pairwise, mac_addr, &cookie, | 2879 | err = rdev_get_key(rdev, dev, key_idx, pairwise, mac_addr, &cookie, |
| 2881 | get_key_callback); | 2880 | get_key_callback); |
| 2882 | 2881 | ||
| @@ -3047,7 +3046,7 @@ static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info) | |||
| 3047 | wdev_lock(dev->ieee80211_ptr); | 3046 | wdev_lock(dev->ieee80211_ptr); |
| 3048 | err = nl80211_key_allowed(dev->ieee80211_ptr); | 3047 | err = nl80211_key_allowed(dev->ieee80211_ptr); |
| 3049 | 3048 | ||
| 3050 | if (key.type == NL80211_KEYTYPE_PAIRWISE && mac_addr && | 3049 | if (key.type == NL80211_KEYTYPE_GROUP && mac_addr && |
| 3051 | !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) | 3050 | !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) |
| 3052 | err = -ENOENT; | 3051 | err = -ENOENT; |
| 3053 | 3052 | ||
diff --git a/net/wireless/reg.c b/net/wireless/reg.c index 7b8309840d4e..d39d1cbc86b1 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c | |||
| @@ -1530,45 +1530,40 @@ static void reg_call_notifier(struct wiphy *wiphy, | |||
| 1530 | 1530 | ||
| 1531 | static bool reg_wdev_chan_valid(struct wiphy *wiphy, struct wireless_dev *wdev) | 1531 | static bool reg_wdev_chan_valid(struct wiphy *wiphy, struct wireless_dev *wdev) |
| 1532 | { | 1532 | { |
| 1533 | struct ieee80211_channel *ch; | ||
| 1534 | struct cfg80211_chan_def chandef; | 1533 | struct cfg80211_chan_def chandef; |
| 1535 | struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); | 1534 | struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); |
| 1536 | bool ret = true; | 1535 | enum nl80211_iftype iftype; |
| 1537 | 1536 | ||
| 1538 | wdev_lock(wdev); | 1537 | wdev_lock(wdev); |
| 1538 | iftype = wdev->iftype; | ||
| 1539 | 1539 | ||
| 1540 | /* make sure the interface is active */ | ||
| 1540 | if (!wdev->netdev || !netif_running(wdev->netdev)) | 1541 | if (!wdev->netdev || !netif_running(wdev->netdev)) |
| 1541 | goto out; | 1542 | goto wdev_inactive_unlock; |
| 1542 | 1543 | ||
| 1543 | switch (wdev->iftype) { | 1544 | switch (iftype) { |
| 1544 | case NL80211_IFTYPE_AP: | 1545 | case NL80211_IFTYPE_AP: |
| 1545 | case NL80211_IFTYPE_P2P_GO: | 1546 | case NL80211_IFTYPE_P2P_GO: |
| 1546 | if (!wdev->beacon_interval) | 1547 | if (!wdev->beacon_interval) |
| 1547 | goto out; | 1548 | goto wdev_inactive_unlock; |
| 1548 | 1549 | chandef = wdev->chandef; | |
| 1549 | ret = cfg80211_reg_can_beacon(wiphy, | ||
| 1550 | &wdev->chandef, wdev->iftype); | ||
| 1551 | break; | 1550 | break; |
| 1552 | case NL80211_IFTYPE_ADHOC: | 1551 | case NL80211_IFTYPE_ADHOC: |
| 1553 | if (!wdev->ssid_len) | 1552 | if (!wdev->ssid_len) |
| 1554 | goto out; | 1553 | goto wdev_inactive_unlock; |
| 1555 | 1554 | chandef = wdev->chandef; | |
| 1556 | ret = cfg80211_reg_can_beacon(wiphy, | ||
| 1557 | &wdev->chandef, wdev->iftype); | ||
| 1558 | break; | 1555 | break; |
| 1559 | case NL80211_IFTYPE_STATION: | 1556 | case NL80211_IFTYPE_STATION: |
| 1560 | case NL80211_IFTYPE_P2P_CLIENT: | 1557 | case NL80211_IFTYPE_P2P_CLIENT: |
| 1561 | if (!wdev->current_bss || | 1558 | if (!wdev->current_bss || |
| 1562 | !wdev->current_bss->pub.channel) | 1559 | !wdev->current_bss->pub.channel) |
| 1563 | goto out; | 1560 | goto wdev_inactive_unlock; |
| 1564 | 1561 | ||
| 1565 | ch = wdev->current_bss->pub.channel; | 1562 | if (!rdev->ops->get_channel || |
| 1566 | if (rdev->ops->get_channel && | 1563 | rdev_get_channel(rdev, wdev, &chandef)) |
| 1567 | !rdev_get_channel(rdev, wdev, &chandef)) | 1564 | cfg80211_chandef_create(&chandef, |
| 1568 | ret = cfg80211_chandef_usable(wiphy, &chandef, | 1565 | wdev->current_bss->pub.channel, |
| 1569 | IEEE80211_CHAN_DISABLED); | 1566 | NL80211_CHAN_NO_HT); |
| 1570 | else | ||
| 1571 | ret = !(ch->flags & IEEE80211_CHAN_DISABLED); | ||
| 1572 | break; | 1567 | break; |
| 1573 | case NL80211_IFTYPE_MONITOR: | 1568 | case NL80211_IFTYPE_MONITOR: |
| 1574 | case NL80211_IFTYPE_AP_VLAN: | 1569 | case NL80211_IFTYPE_AP_VLAN: |
| @@ -1581,9 +1576,26 @@ static bool reg_wdev_chan_valid(struct wiphy *wiphy, struct wireless_dev *wdev) | |||
| 1581 | break; | 1576 | break; |
| 1582 | } | 1577 | } |
| 1583 | 1578 | ||
| 1584 | out: | ||
| 1585 | wdev_unlock(wdev); | 1579 | wdev_unlock(wdev); |
| 1586 | return ret; | 1580 | |
| 1581 | switch (iftype) { | ||
| 1582 | case NL80211_IFTYPE_AP: | ||
| 1583 | case NL80211_IFTYPE_P2P_GO: | ||
| 1584 | case NL80211_IFTYPE_ADHOC: | ||
| 1585 | return cfg80211_reg_can_beacon(wiphy, &chandef, iftype); | ||
| 1586 | case NL80211_IFTYPE_STATION: | ||
| 1587 | case NL80211_IFTYPE_P2P_CLIENT: | ||
| 1588 | return cfg80211_chandef_usable(wiphy, &chandef, | ||
| 1589 | IEEE80211_CHAN_DISABLED); | ||
| 1590 | default: | ||
| 1591 | break; | ||
| 1592 | } | ||
| 1593 | |||
| 1594 | return true; | ||
| 1595 | |||
| 1596 | wdev_inactive_unlock: | ||
| 1597 | wdev_unlock(wdev); | ||
| 1598 | return true; | ||
| 1587 | } | 1599 | } |
| 1588 | 1600 | ||
| 1589 | static void reg_leave_invalid_chans(struct wiphy *wiphy) | 1601 | static void reg_leave_invalid_chans(struct wiphy *wiphy) |
diff --git a/net/wireless/util.c b/net/wireless/util.c index d0ac795445b7..5488c3662f7d 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/Makefile.clean b/scripts/Makefile.clean index 1bca180db8ad..627f8cbbedb8 100644 --- a/scripts/Makefile.clean +++ b/scripts/Makefile.clean | |||
| @@ -42,19 +42,19 @@ __clean-files := $(extra-y) $(extra-m) $(extra-) \ | |||
| 42 | 42 | ||
| 43 | __clean-files := $(filter-out $(no-clean-files), $(__clean-files)) | 43 | __clean-files := $(filter-out $(no-clean-files), $(__clean-files)) |
| 44 | 44 | ||
| 45 | # as clean-files is given relative to the current directory, this adds | 45 | # clean-files is given relative to the current directory, unless it |
| 46 | # a $(obj) prefix, except for absolute paths | 46 | # starts with $(objtree)/ (which means "./", so do not add "./" unless |
| 47 | # you want to delete a file from the toplevel object directory). | ||
| 47 | 48 | ||
| 48 | __clean-files := $(wildcard \ | 49 | __clean-files := $(wildcard \ |
| 49 | $(addprefix $(obj)/, $(filter-out /%, $(__clean-files))) \ | 50 | $(addprefix $(obj)/, $(filter-out $(objtree)/%, $(__clean-files))) \ |
| 50 | $(filter /%, $(__clean-files))) | 51 | $(filter $(objtree)/%, $(__clean-files))) |
| 51 | 52 | ||
| 52 | # as clean-dirs is given relative to the current directory, this adds | 53 | # same as clean-files |
| 53 | # a $(obj) prefix, except for absolute paths | ||
| 54 | 54 | ||
| 55 | __clean-dirs := $(wildcard \ | 55 | __clean-dirs := $(wildcard \ |
| 56 | $(addprefix $(obj)/, $(filter-out /%, $(clean-dirs))) \ | 56 | $(addprefix $(obj)/, $(filter-out $(objtree)/%, $(clean-dirs))) \ |
| 57 | $(filter /%, $(clean-dirs))) | 57 | $(filter $(objtree)/%, $(clean-dirs))) |
| 58 | 58 | ||
| 59 | # ========================================================================== | 59 | # ========================================================================== |
| 60 | 60 | ||
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/security/keys/gc.c b/security/keys/gc.c index 9609a7f0faea..c7952375ac53 100644 --- a/security/keys/gc.c +++ b/security/keys/gc.c | |||
| @@ -148,12 +148,12 @@ static noinline void key_gc_unused_keys(struct list_head *keys) | |||
| 148 | if (test_bit(KEY_FLAG_INSTANTIATED, &key->flags)) | 148 | if (test_bit(KEY_FLAG_INSTANTIATED, &key->flags)) |
| 149 | atomic_dec(&key->user->nikeys); | 149 | atomic_dec(&key->user->nikeys); |
| 150 | 150 | ||
| 151 | key_user_put(key->user); | ||
| 152 | |||
| 153 | /* now throw away the key memory */ | 151 | /* now throw away the key memory */ |
| 154 | if (key->type->destroy) | 152 | if (key->type->destroy) |
| 155 | key->type->destroy(key); | 153 | key->type->destroy(key); |
| 156 | 154 | ||
| 155 | key_user_put(key->user); | ||
| 156 | |||
| 157 | kfree(key->description); | 157 | kfree(key->description); |
| 158 | 158 | ||
| 159 | #ifdef KEY_DEBUGGING | 159 | #ifdef KEY_DEBUGGING |
diff --git a/sound/core/seq/seq_dummy.c b/sound/core/seq/seq_dummy.c index ec667f158f19..5d905d90d504 100644 --- a/sound/core/seq/seq_dummy.c +++ b/sound/core/seq/seq_dummy.c | |||
| @@ -82,36 +82,6 @@ struct snd_seq_dummy_port { | |||
| 82 | static int my_client = -1; | 82 | static int my_client = -1; |
| 83 | 83 | ||
| 84 | /* | 84 | /* |
| 85 | * unuse callback - send ALL_SOUNDS_OFF and RESET_CONTROLLERS events | ||
| 86 | * to subscribers. | ||
| 87 | * Note: this callback is called only after all subscribers are removed. | ||
| 88 | */ | ||
| 89 | static int | ||
| 90 | dummy_unuse(void *private_data, struct snd_seq_port_subscribe *info) | ||
| 91 | { | ||
| 92 | struct snd_seq_dummy_port *p; | ||
| 93 | int i; | ||
| 94 | struct snd_seq_event ev; | ||
| 95 | |||
| 96 | p = private_data; | ||
| 97 | memset(&ev, 0, sizeof(ev)); | ||
| 98 | if (p->duplex) | ||
| 99 | ev.source.port = p->connect; | ||
| 100 | else | ||
| 101 | ev.source.port = p->port; | ||
| 102 | ev.dest.client = SNDRV_SEQ_ADDRESS_SUBSCRIBERS; | ||
| 103 | ev.type = SNDRV_SEQ_EVENT_CONTROLLER; | ||
| 104 | for (i = 0; i < 16; i++) { | ||
| 105 | ev.data.control.channel = i; | ||
| 106 | ev.data.control.param = MIDI_CTL_ALL_SOUNDS_OFF; | ||
| 107 | snd_seq_kernel_client_dispatch(p->client, &ev, 0, 0); | ||
| 108 | ev.data.control.param = MIDI_CTL_RESET_CONTROLLERS; | ||
| 109 | snd_seq_kernel_client_dispatch(p->client, &ev, 0, 0); | ||
| 110 | } | ||
| 111 | return 0; | ||
| 112 | } | ||
| 113 | |||
| 114 | /* | ||
| 115 | * event input callback - just redirect events to subscribers | 85 | * event input callback - just redirect events to subscribers |
| 116 | */ | 86 | */ |
| 117 | static int | 87 | static int |
| @@ -175,7 +145,6 @@ create_port(int idx, int type) | |||
| 175 | | SNDRV_SEQ_PORT_TYPE_PORT; | 145 | | SNDRV_SEQ_PORT_TYPE_PORT; |
| 176 | memset(&pcb, 0, sizeof(pcb)); | 146 | memset(&pcb, 0, sizeof(pcb)); |
| 177 | pcb.owner = THIS_MODULE; | 147 | pcb.owner = THIS_MODULE; |
| 178 | pcb.unuse = dummy_unuse; | ||
| 179 | pcb.event_input = dummy_input; | 148 | pcb.event_input = dummy_input; |
| 180 | pcb.private_free = dummy_free; | 149 | pcb.private_free = dummy_free; |
| 181 | pcb.private_data = rec; | 150 | pcb.private_data = rec; |
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/firewire/fireworks/fireworks_transaction.c b/sound/firewire/fireworks/fireworks_transaction.c index 255dabc6fc33..2a85e4209f0b 100644 --- a/sound/firewire/fireworks/fireworks_transaction.c +++ b/sound/firewire/fireworks/fireworks_transaction.c | |||
| @@ -124,7 +124,7 @@ copy_resp_to_buf(struct snd_efw *efw, void *data, size_t length, int *rcode) | |||
| 124 | spin_lock_irq(&efw->lock); | 124 | spin_lock_irq(&efw->lock); |
| 125 | 125 | ||
| 126 | t = (struct snd_efw_transaction *)data; | 126 | t = (struct snd_efw_transaction *)data; |
| 127 | length = min_t(size_t, t->length * sizeof(t->length), length); | 127 | length = min_t(size_t, be32_to_cpu(t->length) * sizeof(u32), length); |
| 128 | 128 | ||
| 129 | if (efw->push_ptr < efw->pull_ptr) | 129 | if (efw->push_ptr < efw->pull_ptr) |
| 130 | capacity = (unsigned int)(efw->pull_ptr - efw->push_ptr); | 130 | capacity = (unsigned int)(efw->pull_ptr - efw->push_ptr); |
diff --git a/sound/i2c/other/ak4113.c b/sound/i2c/other/ak4113.c index 1a3a6fa27158..c6bba99a90b2 100644 --- a/sound/i2c/other/ak4113.c +++ b/sound/i2c/other/ak4113.c | |||
| @@ -56,8 +56,7 @@ static inline unsigned char reg_read(struct ak4113 *ak4113, unsigned char reg) | |||
| 56 | 56 | ||
| 57 | static void snd_ak4113_free(struct ak4113 *chip) | 57 | static void snd_ak4113_free(struct ak4113 *chip) |
| 58 | { | 58 | { |
| 59 | chip->init = 1; /* don't schedule new work */ | 59 | atomic_inc(&chip->wq_processing); /* don't schedule new work */ |
| 60 | mb(); | ||
| 61 | cancel_delayed_work_sync(&chip->work); | 60 | cancel_delayed_work_sync(&chip->work); |
| 62 | kfree(chip); | 61 | kfree(chip); |
| 63 | } | 62 | } |
| @@ -89,6 +88,7 @@ int snd_ak4113_create(struct snd_card *card, ak4113_read_t *read, | |||
| 89 | chip->write = write; | 88 | chip->write = write; |
| 90 | chip->private_data = private_data; | 89 | chip->private_data = private_data; |
| 91 | INIT_DELAYED_WORK(&chip->work, ak4113_stats); | 90 | INIT_DELAYED_WORK(&chip->work, ak4113_stats); |
| 91 | atomic_set(&chip->wq_processing, 0); | ||
| 92 | 92 | ||
| 93 | for (reg = 0; reg < AK4113_WRITABLE_REGS ; reg++) | 93 | for (reg = 0; reg < AK4113_WRITABLE_REGS ; reg++) |
| 94 | chip->regmap[reg] = pgm[reg]; | 94 | chip->regmap[reg] = pgm[reg]; |
| @@ -139,13 +139,11 @@ static void ak4113_init_regs(struct ak4113 *chip) | |||
| 139 | 139 | ||
| 140 | void snd_ak4113_reinit(struct ak4113 *chip) | 140 | void snd_ak4113_reinit(struct ak4113 *chip) |
| 141 | { | 141 | { |
| 142 | chip->init = 1; | 142 | if (atomic_inc_return(&chip->wq_processing) == 1) |
| 143 | mb(); | 143 | cancel_delayed_work_sync(&chip->work); |
| 144 | flush_delayed_work(&chip->work); | ||
| 145 | ak4113_init_regs(chip); | 144 | ak4113_init_regs(chip); |
| 146 | /* bring up statistics / event queing */ | 145 | /* bring up statistics / event queing */ |
| 147 | chip->init = 0; | 146 | if (atomic_dec_and_test(&chip->wq_processing)) |
| 148 | if (chip->kctls[0]) | ||
| 149 | schedule_delayed_work(&chip->work, HZ / 10); | 147 | schedule_delayed_work(&chip->work, HZ / 10); |
| 150 | } | 148 | } |
| 151 | EXPORT_SYMBOL_GPL(snd_ak4113_reinit); | 149 | EXPORT_SYMBOL_GPL(snd_ak4113_reinit); |
| @@ -632,8 +630,9 @@ static void ak4113_stats(struct work_struct *work) | |||
| 632 | { | 630 | { |
| 633 | struct ak4113 *chip = container_of(work, struct ak4113, work.work); | 631 | struct ak4113 *chip = container_of(work, struct ak4113, work.work); |
| 634 | 632 | ||
| 635 | if (!chip->init) | 633 | if (atomic_inc_return(&chip->wq_processing) == 1) |
| 636 | snd_ak4113_check_rate_and_errors(chip, chip->check_flags); | 634 | snd_ak4113_check_rate_and_errors(chip, chip->check_flags); |
| 637 | 635 | ||
| 638 | schedule_delayed_work(&chip->work, HZ / 10); | 636 | if (atomic_dec_and_test(&chip->wq_processing)) |
| 637 | schedule_delayed_work(&chip->work, HZ / 10); | ||
| 639 | } | 638 | } |
diff --git a/sound/i2c/other/ak4114.c b/sound/i2c/other/ak4114.c index c7f56339415d..b70e6eccbd03 100644 --- a/sound/i2c/other/ak4114.c +++ b/sound/i2c/other/ak4114.c | |||
| @@ -66,8 +66,7 @@ static void reg_dump(struct ak4114 *ak4114) | |||
| 66 | 66 | ||
| 67 | static void snd_ak4114_free(struct ak4114 *chip) | 67 | static void snd_ak4114_free(struct ak4114 *chip) |
| 68 | { | 68 | { |
| 69 | chip->init = 1; /* don't schedule new work */ | 69 | atomic_inc(&chip->wq_processing); /* don't schedule new work */ |
| 70 | mb(); | ||
| 71 | cancel_delayed_work_sync(&chip->work); | 70 | cancel_delayed_work_sync(&chip->work); |
| 72 | kfree(chip); | 71 | kfree(chip); |
| 73 | } | 72 | } |
| @@ -100,6 +99,7 @@ int snd_ak4114_create(struct snd_card *card, | |||
| 100 | chip->write = write; | 99 | chip->write = write; |
| 101 | chip->private_data = private_data; | 100 | chip->private_data = private_data; |
| 102 | INIT_DELAYED_WORK(&chip->work, ak4114_stats); | 101 | INIT_DELAYED_WORK(&chip->work, ak4114_stats); |
| 102 | atomic_set(&chip->wq_processing, 0); | ||
| 103 | 103 | ||
| 104 | for (reg = 0; reg < 6; reg++) | 104 | for (reg = 0; reg < 6; reg++) |
| 105 | chip->regmap[reg] = pgm[reg]; | 105 | chip->regmap[reg] = pgm[reg]; |
| @@ -152,13 +152,11 @@ static void ak4114_init_regs(struct ak4114 *chip) | |||
| 152 | 152 | ||
| 153 | void snd_ak4114_reinit(struct ak4114 *chip) | 153 | void snd_ak4114_reinit(struct ak4114 *chip) |
| 154 | { | 154 | { |
| 155 | chip->init = 1; | 155 | if (atomic_inc_return(&chip->wq_processing) == 1) |
| 156 | mb(); | 156 | cancel_delayed_work_sync(&chip->work); |
| 157 | flush_delayed_work(&chip->work); | ||
| 158 | ak4114_init_regs(chip); | 157 | ak4114_init_regs(chip); |
| 159 | /* bring up statistics / event queing */ | 158 | /* bring up statistics / event queing */ |
| 160 | chip->init = 0; | 159 | if (atomic_dec_and_test(&chip->wq_processing)) |
| 161 | if (chip->kctls[0]) | ||
| 162 | schedule_delayed_work(&chip->work, HZ / 10); | 160 | schedule_delayed_work(&chip->work, HZ / 10); |
| 163 | } | 161 | } |
| 164 | 162 | ||
| @@ -612,10 +610,10 @@ static void ak4114_stats(struct work_struct *work) | |||
| 612 | { | 610 | { |
| 613 | struct ak4114 *chip = container_of(work, struct ak4114, work.work); | 611 | struct ak4114 *chip = container_of(work, struct ak4114, work.work); |
| 614 | 612 | ||
| 615 | if (!chip->init) | 613 | if (atomic_inc_return(&chip->wq_processing) == 1) |
| 616 | snd_ak4114_check_rate_and_errors(chip, chip->check_flags); | 614 | snd_ak4114_check_rate_and_errors(chip, chip->check_flags); |
| 617 | 615 | if (atomic_dec_and_test(&chip->wq_processing)) | |
| 618 | schedule_delayed_work(&chip->work, HZ / 10); | 616 | schedule_delayed_work(&chip->work, HZ / 10); |
| 619 | } | 617 | } |
| 620 | 618 | ||
| 621 | EXPORT_SYMBOL(snd_ak4114_create); | 619 | EXPORT_SYMBOL(snd_ak4114_create); |
diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c index 5f13d2d18079..b422e406a9cb 100644 --- a/sound/pci/hda/patch_hdmi.c +++ b/sound/pci/hda/patch_hdmi.c | |||
| @@ -3353,6 +3353,7 @@ static const struct hda_codec_preset snd_hda_preset_hdmi[] = { | |||
| 3353 | { .id = 0x10de0067, .name = "MCP67 HDMI", .patch = patch_nvhdmi_2ch }, | 3353 | { .id = 0x10de0067, .name = "MCP67 HDMI", .patch = patch_nvhdmi_2ch }, |
| 3354 | { .id = 0x10de0070, .name = "GPU 70 HDMI/DP", .patch = patch_nvhdmi }, | 3354 | { .id = 0x10de0070, .name = "GPU 70 HDMI/DP", .patch = patch_nvhdmi }, |
| 3355 | { .id = 0x10de0071, .name = "GPU 71 HDMI/DP", .patch = patch_nvhdmi }, | 3355 | { .id = 0x10de0071, .name = "GPU 71 HDMI/DP", .patch = patch_nvhdmi }, |
| 3356 | { .id = 0x10de0072, .name = "GPU 72 HDMI/DP", .patch = patch_nvhdmi }, | ||
| 3356 | { .id = 0x10de8001, .name = "MCP73 HDMI", .patch = patch_nvhdmi_2ch }, | 3357 | { .id = 0x10de8001, .name = "MCP73 HDMI", .patch = patch_nvhdmi_2ch }, |
| 3357 | { .id = 0x11069f80, .name = "VX900 HDMI/DP", .patch = patch_via_hdmi }, | 3358 | { .id = 0x11069f80, .name = "VX900 HDMI/DP", .patch = patch_via_hdmi }, |
| 3358 | { .id = 0x11069f81, .name = "VX900 HDMI/DP", .patch = patch_via_hdmi }, | 3359 | { .id = 0x11069f81, .name = "VX900 HDMI/DP", .patch = patch_via_hdmi }, |
| @@ -3413,6 +3414,7 @@ MODULE_ALIAS("snd-hda-codec-id:10de0060"); | |||
| 3413 | MODULE_ALIAS("snd-hda-codec-id:10de0067"); | 3414 | MODULE_ALIAS("snd-hda-codec-id:10de0067"); |
| 3414 | MODULE_ALIAS("snd-hda-codec-id:10de0070"); | 3415 | MODULE_ALIAS("snd-hda-codec-id:10de0070"); |
| 3415 | MODULE_ALIAS("snd-hda-codec-id:10de0071"); | 3416 | MODULE_ALIAS("snd-hda-codec-id:10de0071"); |
| 3417 | MODULE_ALIAS("snd-hda-codec-id:10de0072"); | ||
| 3416 | MODULE_ALIAS("snd-hda-codec-id:10de8001"); | 3418 | MODULE_ALIAS("snd-hda-codec-id:10de8001"); |
| 3417 | MODULE_ALIAS("snd-hda-codec-id:11069f80"); | 3419 | MODULE_ALIAS("snd-hda-codec-id:11069f80"); |
| 3418 | MODULE_ALIAS("snd-hda-codec-id:11069f81"); | 3420 | MODULE_ALIAS("snd-hda-codec-id:11069f81"); |
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 4f6413e01c13..605d14003d25 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
| @@ -568,9 +568,9 @@ static void stac_store_hints(struct hda_codec *codec) | |||
| 568 | spec->gpio_mask; | 568 | spec->gpio_mask; |
| 569 | } | 569 | } |
| 570 | if (get_int_hint(codec, "gpio_dir", &spec->gpio_dir)) | 570 | if (get_int_hint(codec, "gpio_dir", &spec->gpio_dir)) |
| 571 | spec->gpio_mask &= spec->gpio_mask; | ||
| 572 | if (get_int_hint(codec, "gpio_data", &spec->gpio_data)) | ||
| 573 | spec->gpio_dir &= spec->gpio_mask; | 571 | spec->gpio_dir &= spec->gpio_mask; |
| 572 | if (get_int_hint(codec, "gpio_data", &spec->gpio_data)) | ||
| 573 | spec->gpio_data &= spec->gpio_mask; | ||
| 574 | if (get_int_hint(codec, "eapd_mask", &spec->eapd_mask)) | 574 | if (get_int_hint(codec, "eapd_mask", &spec->eapd_mask)) |
| 575 | spec->eapd_mask &= spec->gpio_mask; | 575 | spec->eapd_mask &= spec->gpio_mask; |
| 576 | if (get_int_hint(codec, "gpio_mute", &spec->gpio_mute)) | 576 | if (get_int_hint(codec, "gpio_mute", &spec->gpio_mute)) |
diff --git a/sound/soc/adi/axi-i2s.c b/sound/soc/adi/axi-i2s.c index 7752860f7230..4c23381727a1 100644 --- a/sound/soc/adi/axi-i2s.c +++ b/sound/soc/adi/axi-i2s.c | |||
| @@ -240,6 +240,8 @@ static int axi_i2s_probe(struct platform_device *pdev) | |||
| 240 | if (ret) | 240 | if (ret) |
| 241 | goto err_clk_disable; | 241 | goto err_clk_disable; |
| 242 | 242 | ||
| 243 | return 0; | ||
| 244 | |||
| 243 | err_clk_disable: | 245 | err_clk_disable: |
| 244 | clk_disable_unprepare(i2s->clk); | 246 | clk_disable_unprepare(i2s->clk); |
| 245 | return ret; | 247 | return ret; |
diff --git a/sound/soc/atmel/atmel_ssc_dai.c b/sound/soc/atmel/atmel_ssc_dai.c index 99ff35e2a25d..35e44e463cfe 100644 --- a/sound/soc/atmel/atmel_ssc_dai.c +++ b/sound/soc/atmel/atmel_ssc_dai.c | |||
| @@ -348,7 +348,6 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream, | |||
| 348 | struct atmel_pcm_dma_params *dma_params; | 348 | struct atmel_pcm_dma_params *dma_params; |
| 349 | int dir, channels, bits; | 349 | int dir, channels, bits; |
| 350 | u32 tfmr, rfmr, tcmr, rcmr; | 350 | u32 tfmr, rfmr, tcmr, rcmr; |
| 351 | int start_event; | ||
| 352 | int ret; | 351 | int ret; |
| 353 | int fslen, fslen_ext; | 352 | int fslen, fslen_ext; |
| 354 | 353 | ||
| @@ -457,19 +456,10 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream, | |||
| 457 | * The SSC transmit clock is obtained from the BCLK signal on | 456 | * The SSC transmit clock is obtained from the BCLK signal on |
| 458 | * on the TK line, and the SSC receive clock is | 457 | * on the TK line, and the SSC receive clock is |
| 459 | * generated from the transmit clock. | 458 | * generated from the transmit clock. |
| 460 | * | ||
| 461 | * For single channel data, one sample is transferred | ||
| 462 | * on the falling edge of the LRC clock. | ||
| 463 | * For two channel data, one sample is | ||
| 464 | * transferred on both edges of the LRC clock. | ||
| 465 | */ | 459 | */ |
| 466 | start_event = ((channels == 1) | ||
| 467 | ? SSC_START_FALLING_RF | ||
| 468 | : SSC_START_EDGE_RF); | ||
| 469 | |||
| 470 | rcmr = SSC_BF(RCMR_PERIOD, 0) | 460 | rcmr = SSC_BF(RCMR_PERIOD, 0) |
| 471 | | SSC_BF(RCMR_STTDLY, START_DELAY) | 461 | | SSC_BF(RCMR_STTDLY, START_DELAY) |
| 472 | | SSC_BF(RCMR_START, start_event) | 462 | | SSC_BF(RCMR_START, SSC_START_FALLING_RF) |
| 473 | | SSC_BF(RCMR_CKI, SSC_CKI_RISING) | 463 | | SSC_BF(RCMR_CKI, SSC_CKI_RISING) |
| 474 | | SSC_BF(RCMR_CKO, SSC_CKO_NONE) | 464 | | SSC_BF(RCMR_CKO, SSC_CKO_NONE) |
| 475 | | SSC_BF(RCMR_CKS, ssc->clk_from_rk_pin ? | 465 | | SSC_BF(RCMR_CKS, ssc->clk_from_rk_pin ? |
| @@ -478,14 +468,14 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream, | |||
| 478 | rfmr = SSC_BF(RFMR_FSEDGE, SSC_FSEDGE_POSITIVE) | 468 | rfmr = SSC_BF(RFMR_FSEDGE, SSC_FSEDGE_POSITIVE) |
| 479 | | SSC_BF(RFMR_FSOS, SSC_FSOS_NONE) | 469 | | SSC_BF(RFMR_FSOS, SSC_FSOS_NONE) |
| 480 | | SSC_BF(RFMR_FSLEN, 0) | 470 | | SSC_BF(RFMR_FSLEN, 0) |
| 481 | | SSC_BF(RFMR_DATNB, 0) | 471 | | SSC_BF(RFMR_DATNB, (channels - 1)) |
| 482 | | SSC_BIT(RFMR_MSBF) | 472 | | SSC_BIT(RFMR_MSBF) |
| 483 | | SSC_BF(RFMR_LOOP, 0) | 473 | | SSC_BF(RFMR_LOOP, 0) |
| 484 | | SSC_BF(RFMR_DATLEN, (bits - 1)); | 474 | | SSC_BF(RFMR_DATLEN, (bits - 1)); |
| 485 | 475 | ||
| 486 | tcmr = SSC_BF(TCMR_PERIOD, 0) | 476 | tcmr = SSC_BF(TCMR_PERIOD, 0) |
| 487 | | SSC_BF(TCMR_STTDLY, START_DELAY) | 477 | | SSC_BF(TCMR_STTDLY, START_DELAY) |
| 488 | | SSC_BF(TCMR_START, start_event) | 478 | | SSC_BF(TCMR_START, SSC_START_FALLING_RF) |
| 489 | | SSC_BF(TCMR_CKI, SSC_CKI_FALLING) | 479 | | SSC_BF(TCMR_CKI, SSC_CKI_FALLING) |
| 490 | | SSC_BF(TCMR_CKO, SSC_CKO_NONE) | 480 | | SSC_BF(TCMR_CKO, SSC_CKO_NONE) |
| 491 | | SSC_BF(TCMR_CKS, ssc->clk_from_rk_pin ? | 481 | | SSC_BF(TCMR_CKS, ssc->clk_from_rk_pin ? |
| @@ -495,7 +485,7 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream, | |||
| 495 | | SSC_BF(TFMR_FSDEN, 0) | 485 | | SSC_BF(TFMR_FSDEN, 0) |
| 496 | | SSC_BF(TFMR_FSOS, SSC_FSOS_NONE) | 486 | | SSC_BF(TFMR_FSOS, SSC_FSOS_NONE) |
| 497 | | SSC_BF(TFMR_FSLEN, 0) | 487 | | SSC_BF(TFMR_FSLEN, 0) |
| 498 | | SSC_BF(TFMR_DATNB, 0) | 488 | | SSC_BF(TFMR_DATNB, (channels - 1)) |
| 499 | | SSC_BIT(TFMR_MSBF) | 489 | | SSC_BIT(TFMR_MSBF) |
| 500 | | SSC_BF(TFMR_DATDEF, 0) | 490 | | SSC_BF(TFMR_DATDEF, 0) |
| 501 | | SSC_BF(TFMR_DATLEN, (bits - 1)); | 491 | | SSC_BF(TFMR_DATLEN, (bits - 1)); |
| @@ -512,7 +502,7 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream, | |||
| 512 | rcmr = SSC_BF(RCMR_PERIOD, ssc_p->rcmr_period) | 502 | rcmr = SSC_BF(RCMR_PERIOD, ssc_p->rcmr_period) |
| 513 | | SSC_BF(RCMR_STTDLY, 1) | 503 | | SSC_BF(RCMR_STTDLY, 1) |
| 514 | | SSC_BF(RCMR_START, SSC_START_RISING_RF) | 504 | | SSC_BF(RCMR_START, SSC_START_RISING_RF) |
| 515 | | SSC_BF(RCMR_CKI, SSC_CKI_RISING) | 505 | | SSC_BF(RCMR_CKI, SSC_CKI_FALLING) |
| 516 | | SSC_BF(RCMR_CKO, SSC_CKO_NONE) | 506 | | SSC_BF(RCMR_CKO, SSC_CKO_NONE) |
| 517 | | SSC_BF(RCMR_CKS, SSC_CKS_DIV); | 507 | | SSC_BF(RCMR_CKS, SSC_CKS_DIV); |
| 518 | 508 | ||
| @@ -527,7 +517,7 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream, | |||
| 527 | tcmr = SSC_BF(TCMR_PERIOD, ssc_p->tcmr_period) | 517 | tcmr = SSC_BF(TCMR_PERIOD, ssc_p->tcmr_period) |
| 528 | | SSC_BF(TCMR_STTDLY, 1) | 518 | | SSC_BF(TCMR_STTDLY, 1) |
| 529 | | SSC_BF(TCMR_START, SSC_START_RISING_RF) | 519 | | SSC_BF(TCMR_START, SSC_START_RISING_RF) |
| 530 | | SSC_BF(TCMR_CKI, SSC_CKI_RISING) | 520 | | SSC_BF(TCMR_CKI, SSC_CKI_FALLING) |
| 531 | | SSC_BF(TCMR_CKO, SSC_CKO_CONTINUOUS) | 521 | | SSC_BF(TCMR_CKO, SSC_CKO_CONTINUOUS) |
| 532 | | SSC_BF(TCMR_CKS, SSC_CKS_DIV); | 522 | | SSC_BF(TCMR_CKS, SSC_CKS_DIV); |
| 533 | 523 | ||
| @@ -556,7 +546,7 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream, | |||
| 556 | rcmr = SSC_BF(RCMR_PERIOD, 0) | 546 | rcmr = SSC_BF(RCMR_PERIOD, 0) |
| 557 | | SSC_BF(RCMR_STTDLY, START_DELAY) | 547 | | SSC_BF(RCMR_STTDLY, START_DELAY) |
| 558 | | SSC_BF(RCMR_START, SSC_START_RISING_RF) | 548 | | SSC_BF(RCMR_START, SSC_START_RISING_RF) |
| 559 | | SSC_BF(RCMR_CKI, SSC_CKI_RISING) | 549 | | SSC_BF(RCMR_CKI, SSC_CKI_FALLING) |
| 560 | | SSC_BF(RCMR_CKO, SSC_CKO_NONE) | 550 | | SSC_BF(RCMR_CKO, SSC_CKO_NONE) |
| 561 | | SSC_BF(RCMR_CKS, ssc->clk_from_rk_pin ? | 551 | | SSC_BF(RCMR_CKS, ssc->clk_from_rk_pin ? |
| 562 | SSC_CKS_PIN : SSC_CKS_CLOCK); | 552 | SSC_CKS_PIN : SSC_CKS_CLOCK); |
diff --git a/sound/soc/codecs/pcm512x.c b/sound/soc/codecs/pcm512x.c index e5f2fb884bf3..30c673cdc12e 100644 --- a/sound/soc/codecs/pcm512x.c +++ b/sound/soc/codecs/pcm512x.c | |||
| @@ -188,8 +188,8 @@ static const DECLARE_TLV_DB_SCALE(boost_tlv, 0, 80, 0); | |||
| 188 | static const char * const pcm512x_dsp_program_texts[] = { | 188 | static const char * const pcm512x_dsp_program_texts[] = { |
| 189 | "FIR interpolation with de-emphasis", | 189 | "FIR interpolation with de-emphasis", |
| 190 | "Low latency IIR with de-emphasis", | 190 | "Low latency IIR with de-emphasis", |
| 191 | "Fixed process flow", | ||
| 192 | "High attenuation with de-emphasis", | 191 | "High attenuation with de-emphasis", |
| 192 | "Fixed process flow", | ||
| 193 | "Ringing-less low latency FIR", | 193 | "Ringing-less low latency FIR", |
| 194 | }; | 194 | }; |
| 195 | 195 | ||
diff --git a/sound/soc/codecs/rt286.c b/sound/soc/codecs/rt286.c index 2cd4fe463102..1d1c7f8a9af2 100644 --- a/sound/soc/codecs/rt286.c +++ b/sound/soc/codecs/rt286.c | |||
| @@ -861,10 +861,8 @@ static int rt286_hw_params(struct snd_pcm_substream *substream, | |||
| 861 | RT286_I2S_CTRL1, 0x0018, d_len_code << 3); | 861 | RT286_I2S_CTRL1, 0x0018, d_len_code << 3); |
| 862 | dev_dbg(codec->dev, "format val = 0x%x\n", val); | 862 | dev_dbg(codec->dev, "format val = 0x%x\n", val); |
| 863 | 863 | ||
| 864 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) | 864 | snd_soc_update_bits(codec, RT286_DAC_FORMAT, 0x407f, val); |
| 865 | snd_soc_update_bits(codec, RT286_DAC_FORMAT, 0x407f, val); | 865 | snd_soc_update_bits(codec, RT286_ADC_FORMAT, 0x407f, val); |
| 866 | else | ||
| 867 | snd_soc_update_bits(codec, RT286_ADC_FORMAT, 0x407f, val); | ||
| 868 | 866 | ||
| 869 | return 0; | 867 | return 0; |
| 870 | } | 868 | } |
diff --git a/sound/soc/codecs/rt5640.c b/sound/soc/codecs/rt5640.c index c3f2decd643c..1ff726c29249 100644 --- a/sound/soc/codecs/rt5640.c +++ b/sound/soc/codecs/rt5640.c | |||
| @@ -2124,6 +2124,7 @@ MODULE_DEVICE_TABLE(of, rt5640_of_match); | |||
| 2124 | static struct acpi_device_id rt5640_acpi_match[] = { | 2124 | static struct acpi_device_id rt5640_acpi_match[] = { |
| 2125 | { "INT33CA", 0 }, | 2125 | { "INT33CA", 0 }, |
| 2126 | { "10EC5640", 0 }, | 2126 | { "10EC5640", 0 }, |
| 2127 | { "10EC5642", 0 }, | ||
| 2127 | { }, | 2128 | { }, |
| 2128 | }; | 2129 | }; |
| 2129 | MODULE_DEVICE_TABLE(acpi, rt5640_acpi_match); | 2130 | MODULE_DEVICE_TABLE(acpi, rt5640_acpi_match); |
diff --git a/sound/soc/codecs/rt5677.c b/sound/soc/codecs/rt5677.c index c0fbe1881439..918ada9738b0 100644 --- a/sound/soc/codecs/rt5677.c +++ b/sound/soc/codecs/rt5677.c | |||
| @@ -2083,10 +2083,14 @@ static int rt5677_set_pll1_event(struct snd_soc_dapm_widget *w, | |||
| 2083 | struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec); | 2083 | struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec); |
| 2084 | 2084 | ||
| 2085 | switch (event) { | 2085 | switch (event) { |
| 2086 | case SND_SOC_DAPM_POST_PMU: | 2086 | case SND_SOC_DAPM_PRE_PMU: |
| 2087 | regmap_update_bits(rt5677->regmap, RT5677_PLL1_CTRL2, 0x2, 0x2); | 2087 | regmap_update_bits(rt5677->regmap, RT5677_PLL1_CTRL2, 0x2, 0x2); |
| 2088 | break; | ||
| 2089 | |||
| 2090 | case SND_SOC_DAPM_POST_PMU: | ||
| 2088 | regmap_update_bits(rt5677->regmap, RT5677_PLL1_CTRL2, 0x2, 0x0); | 2091 | regmap_update_bits(rt5677->regmap, RT5677_PLL1_CTRL2, 0x2, 0x0); |
| 2089 | break; | 2092 | break; |
| 2093 | |||
| 2090 | default: | 2094 | default: |
| 2091 | return 0; | 2095 | return 0; |
| 2092 | } | 2096 | } |
| @@ -2101,10 +2105,14 @@ static int rt5677_set_pll2_event(struct snd_soc_dapm_widget *w, | |||
| 2101 | struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec); | 2105 | struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec); |
| 2102 | 2106 | ||
| 2103 | switch (event) { | 2107 | switch (event) { |
| 2104 | case SND_SOC_DAPM_POST_PMU: | 2108 | case SND_SOC_DAPM_PRE_PMU: |
| 2105 | regmap_update_bits(rt5677->regmap, RT5677_PLL2_CTRL2, 0x2, 0x2); | 2109 | regmap_update_bits(rt5677->regmap, RT5677_PLL2_CTRL2, 0x2, 0x2); |
| 2110 | break; | ||
| 2111 | |||
| 2112 | case SND_SOC_DAPM_POST_PMU: | ||
| 2106 | regmap_update_bits(rt5677->regmap, RT5677_PLL2_CTRL2, 0x2, 0x0); | 2113 | regmap_update_bits(rt5677->regmap, RT5677_PLL2_CTRL2, 0x2, 0x0); |
| 2107 | break; | 2114 | break; |
| 2115 | |||
| 2108 | default: | 2116 | default: |
| 2109 | return 0; | 2117 | return 0; |
| 2110 | } | 2118 | } |
| @@ -2212,9 +2220,11 @@ static int rt5677_vref_event(struct snd_soc_dapm_widget *w, | |||
| 2212 | 2220 | ||
| 2213 | static const struct snd_soc_dapm_widget rt5677_dapm_widgets[] = { | 2221 | static const struct snd_soc_dapm_widget rt5677_dapm_widgets[] = { |
| 2214 | SND_SOC_DAPM_SUPPLY("PLL1", RT5677_PWR_ANLG2, RT5677_PWR_PLL1_BIT, | 2222 | SND_SOC_DAPM_SUPPLY("PLL1", RT5677_PWR_ANLG2, RT5677_PWR_PLL1_BIT, |
| 2215 | 0, rt5677_set_pll1_event, SND_SOC_DAPM_POST_PMU), | 2223 | 0, rt5677_set_pll1_event, SND_SOC_DAPM_PRE_PMU | |
| 2224 | SND_SOC_DAPM_POST_PMU), | ||
| 2216 | SND_SOC_DAPM_SUPPLY("PLL2", RT5677_PWR_ANLG2, RT5677_PWR_PLL2_BIT, | 2225 | SND_SOC_DAPM_SUPPLY("PLL2", RT5677_PWR_ANLG2, RT5677_PWR_PLL2_BIT, |
| 2217 | 0, rt5677_set_pll2_event, SND_SOC_DAPM_POST_PMU), | 2226 | 0, rt5677_set_pll2_event, SND_SOC_DAPM_PRE_PMU | |
| 2227 | SND_SOC_DAPM_POST_PMU), | ||
| 2218 | 2228 | ||
| 2219 | /* Input Side */ | 2229 | /* Input Side */ |
| 2220 | /* micbias */ | 2230 | /* micbias */ |
diff --git a/sound/soc/codecs/sgtl5000.c b/sound/soc/codecs/sgtl5000.c index 29cf7ce610f4..aa98be32bb60 100644 --- a/sound/soc/codecs/sgtl5000.c +++ b/sound/soc/codecs/sgtl5000.c | |||
| @@ -483,21 +483,21 @@ static int sgtl5000_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) | |||
| 483 | /* setting i2s data format */ | 483 | /* setting i2s data format */ |
| 484 | switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { | 484 | switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { |
| 485 | case SND_SOC_DAIFMT_DSP_A: | 485 | case SND_SOC_DAIFMT_DSP_A: |
| 486 | i2sctl |= SGTL5000_I2S_MODE_PCM; | 486 | i2sctl |= SGTL5000_I2S_MODE_PCM << SGTL5000_I2S_MODE_SHIFT; |
| 487 | break; | 487 | break; |
| 488 | case SND_SOC_DAIFMT_DSP_B: | 488 | case SND_SOC_DAIFMT_DSP_B: |
| 489 | i2sctl |= SGTL5000_I2S_MODE_PCM; | 489 | i2sctl |= SGTL5000_I2S_MODE_PCM << SGTL5000_I2S_MODE_SHIFT; |
| 490 | i2sctl |= SGTL5000_I2S_LRALIGN; | 490 | i2sctl |= SGTL5000_I2S_LRALIGN; |
| 491 | break; | 491 | break; |
| 492 | case SND_SOC_DAIFMT_I2S: | 492 | case SND_SOC_DAIFMT_I2S: |
| 493 | i2sctl |= SGTL5000_I2S_MODE_I2S_LJ; | 493 | i2sctl |= SGTL5000_I2S_MODE_I2S_LJ << SGTL5000_I2S_MODE_SHIFT; |
| 494 | break; | 494 | break; |
| 495 | case SND_SOC_DAIFMT_RIGHT_J: | 495 | case SND_SOC_DAIFMT_RIGHT_J: |
| 496 | i2sctl |= SGTL5000_I2S_MODE_RJ; | 496 | i2sctl |= SGTL5000_I2S_MODE_RJ << SGTL5000_I2S_MODE_SHIFT; |
| 497 | i2sctl |= SGTL5000_I2S_LRPOL; | 497 | i2sctl |= SGTL5000_I2S_LRPOL; |
| 498 | break; | 498 | break; |
| 499 | case SND_SOC_DAIFMT_LEFT_J: | 499 | case SND_SOC_DAIFMT_LEFT_J: |
| 500 | i2sctl |= SGTL5000_I2S_MODE_I2S_LJ; | 500 | i2sctl |= SGTL5000_I2S_MODE_I2S_LJ << SGTL5000_I2S_MODE_SHIFT; |
| 501 | i2sctl |= SGTL5000_I2S_LRALIGN; | 501 | i2sctl |= SGTL5000_I2S_LRALIGN; |
| 502 | break; | 502 | break; |
| 503 | default: | 503 | default: |
| @@ -1462,6 +1462,9 @@ static int sgtl5000_i2c_probe(struct i2c_client *client, | |||
| 1462 | if (ret) | 1462 | if (ret) |
| 1463 | return ret; | 1463 | return ret; |
| 1464 | 1464 | ||
| 1465 | /* Need 8 clocks before I2C accesses */ | ||
| 1466 | udelay(1); | ||
| 1467 | |||
| 1465 | /* read chip information */ | 1468 | /* read chip information */ |
| 1466 | ret = regmap_read(sgtl5000->regmap, SGTL5000_CHIP_ID, ®); | 1469 | ret = regmap_read(sgtl5000->regmap, SGTL5000_CHIP_ID, ®); |
| 1467 | if (ret) | 1470 | if (ret) |
diff --git a/sound/soc/codecs/tlv320aic3x.c b/sound/soc/codecs/tlv320aic3x.c index b7ebce054b4e..dd222b10ce13 100644 --- a/sound/soc/codecs/tlv320aic3x.c +++ b/sound/soc/codecs/tlv320aic3x.c | |||
| @@ -1046,7 +1046,7 @@ static int aic3x_prepare(struct snd_pcm_substream *substream, | |||
| 1046 | delay += aic3x->tdm_delay; | 1046 | delay += aic3x->tdm_delay; |
| 1047 | 1047 | ||
| 1048 | /* Configure data delay */ | 1048 | /* Configure data delay */ |
| 1049 | snd_soc_write(codec, AIC3X_ASD_INTF_CTRLC, aic3x->tdm_delay); | 1049 | snd_soc_write(codec, AIC3X_ASD_INTF_CTRLC, delay); |
| 1050 | 1050 | ||
| 1051 | return 0; | 1051 | return 0; |
| 1052 | } | 1052 | } |
diff --git a/sound/soc/codecs/ts3a227e.c b/sound/soc/codecs/ts3a227e.c index 1d1205702d23..9f2dced046de 100644 --- a/sound/soc/codecs/ts3a227e.c +++ b/sound/soc/codecs/ts3a227e.c | |||
| @@ -254,6 +254,7 @@ static int ts3a227e_i2c_probe(struct i2c_client *i2c, | |||
| 254 | struct ts3a227e *ts3a227e; | 254 | struct ts3a227e *ts3a227e; |
| 255 | struct device *dev = &i2c->dev; | 255 | struct device *dev = &i2c->dev; |
| 256 | int ret; | 256 | int ret; |
| 257 | unsigned int acc_reg; | ||
| 257 | 258 | ||
| 258 | ts3a227e = devm_kzalloc(&i2c->dev, sizeof(*ts3a227e), GFP_KERNEL); | 259 | ts3a227e = devm_kzalloc(&i2c->dev, sizeof(*ts3a227e), GFP_KERNEL); |
| 259 | if (ts3a227e == NULL) | 260 | if (ts3a227e == NULL) |
| @@ -283,6 +284,11 @@ static int ts3a227e_i2c_probe(struct i2c_client *i2c, | |||
| 283 | INTB_DISABLE | ADC_COMPLETE_INT_DISABLE, | 284 | INTB_DISABLE | ADC_COMPLETE_INT_DISABLE, |
| 284 | ADC_COMPLETE_INT_DISABLE); | 285 | ADC_COMPLETE_INT_DISABLE); |
| 285 | 286 | ||
| 287 | /* Read jack status because chip might not trigger interrupt at boot. */ | ||
| 288 | regmap_read(ts3a227e->regmap, TS3A227E_REG_ACCESSORY_STATUS, &acc_reg); | ||
| 289 | ts3a227e_new_jack_state(ts3a227e, acc_reg); | ||
| 290 | ts3a227e_jack_report(ts3a227e); | ||
| 291 | |||
| 286 | return 0; | 292 | return 0; |
| 287 | } | 293 | } |
| 288 | 294 | ||
diff --git a/sound/soc/codecs/wm8731.c b/sound/soc/codecs/wm8731.c index b9211b42f6e9..b115ed815db9 100644 --- a/sound/soc/codecs/wm8731.c +++ b/sound/soc/codecs/wm8731.c | |||
| @@ -717,6 +717,8 @@ static int wm8731_i2c_probe(struct i2c_client *i2c, | |||
| 717 | if (wm8731 == NULL) | 717 | if (wm8731 == NULL) |
| 718 | return -ENOMEM; | 718 | return -ENOMEM; |
| 719 | 719 | ||
| 720 | mutex_init(&wm8731->lock); | ||
| 721 | |||
| 720 | wm8731->regmap = devm_regmap_init_i2c(i2c, &wm8731_regmap); | 722 | wm8731->regmap = devm_regmap_init_i2c(i2c, &wm8731_regmap); |
| 721 | if (IS_ERR(wm8731->regmap)) { | 723 | if (IS_ERR(wm8731->regmap)) { |
| 722 | ret = PTR_ERR(wm8731->regmap); | 724 | ret = PTR_ERR(wm8731->regmap); |
diff --git a/sound/soc/codecs/wm8904.c b/sound/soc/codecs/wm8904.c index 4d2d2b1380d5..75b87c5c0f04 100644 --- a/sound/soc/codecs/wm8904.c +++ b/sound/soc/codecs/wm8904.c | |||
| @@ -1076,10 +1076,13 @@ static const struct snd_soc_dapm_route adc_intercon[] = { | |||
| 1076 | { "Right Capture PGA", NULL, "Right Capture Mux" }, | 1076 | { "Right Capture PGA", NULL, "Right Capture Mux" }, |
| 1077 | { "Right Capture PGA", NULL, "Right Capture Inverting Mux" }, | 1077 | { "Right Capture PGA", NULL, "Right Capture Inverting Mux" }, |
| 1078 | 1078 | ||
| 1079 | { "AIFOUTL", "Left", "ADCL" }, | 1079 | { "AIFOUTL Mux", "Left", "ADCL" }, |
| 1080 | { "AIFOUTL", "Right", "ADCR" }, | 1080 | { "AIFOUTL Mux", "Right", "ADCR" }, |
| 1081 | { "AIFOUTR", "Left", "ADCL" }, | 1081 | { "AIFOUTR Mux", "Left", "ADCL" }, |
| 1082 | { "AIFOUTR", "Right", "ADCR" }, | 1082 | { "AIFOUTR Mux", "Right", "ADCR" }, |
| 1083 | |||
| 1084 | { "AIFOUTL", NULL, "AIFOUTL Mux" }, | ||
| 1085 | { "AIFOUTR", NULL, "AIFOUTR Mux" }, | ||
| 1083 | 1086 | ||
| 1084 | { "ADCL", NULL, "CLK_DSP" }, | 1087 | { "ADCL", NULL, "CLK_DSP" }, |
| 1085 | { "ADCL", NULL, "Left Capture PGA" }, | 1088 | { "ADCL", NULL, "Left Capture PGA" }, |
| @@ -1089,12 +1092,16 @@ static const struct snd_soc_dapm_route adc_intercon[] = { | |||
| 1089 | }; | 1092 | }; |
| 1090 | 1093 | ||
| 1091 | static const struct snd_soc_dapm_route dac_intercon[] = { | 1094 | static const struct snd_soc_dapm_route dac_intercon[] = { |
| 1092 | { "DACL", "Right", "AIFINR" }, | 1095 | { "DACL Mux", "Left", "AIFINL" }, |
| 1093 | { "DACL", "Left", "AIFINL" }, | 1096 | { "DACL Mux", "Right", "AIFINR" }, |
| 1097 | |||
| 1098 | { "DACR Mux", "Left", "AIFINL" }, | ||
| 1099 | { "DACR Mux", "Right", "AIFINR" }, | ||
| 1100 | |||
| 1101 | { "DACL", NULL, "DACL Mux" }, | ||
| 1094 | { "DACL", NULL, "CLK_DSP" }, | 1102 | { "DACL", NULL, "CLK_DSP" }, |
| 1095 | 1103 | ||
| 1096 | { "DACR", "Right", "AIFINR" }, | 1104 | { "DACR", NULL, "DACR Mux" }, |
| 1097 | { "DACR", "Left", "AIFINL" }, | ||
| 1098 | { "DACR", NULL, "CLK_DSP" }, | 1105 | { "DACR", NULL, "CLK_DSP" }, |
| 1099 | 1106 | ||
| 1100 | { "Charge pump", NULL, "SYSCLK" }, | 1107 | { "Charge pump", NULL, "SYSCLK" }, |
diff --git a/sound/soc/codecs/wm8960.c b/sound/soc/codecs/wm8960.c index 031a1ae71d94..a96eb497a379 100644 --- a/sound/soc/codecs/wm8960.c +++ b/sound/soc/codecs/wm8960.c | |||
| @@ -556,7 +556,7 @@ static struct { | |||
| 556 | { 22050, 2 }, | 556 | { 22050, 2 }, |
| 557 | { 24000, 2 }, | 557 | { 24000, 2 }, |
| 558 | { 16000, 3 }, | 558 | { 16000, 3 }, |
| 559 | { 11250, 4 }, | 559 | { 11025, 4 }, |
| 560 | { 12000, 4 }, | 560 | { 12000, 4 }, |
| 561 | { 8000, 5 }, | 561 | { 8000, 5 }, |
| 562 | }; | 562 | }; |
diff --git a/sound/soc/codecs/wm9705.c b/sound/soc/codecs/wm9705.c index 3eddb18fefd1..5cc457ef8894 100644 --- a/sound/soc/codecs/wm9705.c +++ b/sound/soc/codecs/wm9705.c | |||
| @@ -344,23 +344,27 @@ static int wm9705_soc_probe(struct snd_soc_codec *codec) | |||
| 344 | struct snd_ac97 *ac97; | 344 | struct snd_ac97 *ac97; |
| 345 | int ret = 0; | 345 | int ret = 0; |
| 346 | 346 | ||
| 347 | ac97 = snd_soc_new_ac97_codec(codec); | 347 | ac97 = snd_soc_alloc_ac97_codec(codec); |
| 348 | if (IS_ERR(ac97)) { | 348 | if (IS_ERR(ac97)) { |
| 349 | ret = PTR_ERR(ac97); | 349 | ret = PTR_ERR(ac97); |
| 350 | dev_err(codec->dev, "Failed to register AC97 codec\n"); | 350 | dev_err(codec->dev, "Failed to register AC97 codec\n"); |
| 351 | return ret; | 351 | return ret; |
| 352 | } | 352 | } |
| 353 | 353 | ||
| 354 | snd_soc_codec_set_drvdata(codec, ac97); | ||
| 355 | |||
| 356 | ret = wm9705_reset(codec); | 354 | ret = wm9705_reset(codec); |
| 357 | if (ret) | 355 | if (ret) |
| 358 | goto reset_err; | 356 | goto err_put_device; |
| 357 | |||
| 358 | ret = device_add(&ac97->dev); | ||
| 359 | if (ret) | ||
| 360 | goto err_put_device; | ||
| 361 | |||
| 362 | snd_soc_codec_set_drvdata(codec, ac97); | ||
| 359 | 363 | ||
| 360 | return 0; | 364 | return 0; |
| 361 | 365 | ||
| 362 | reset_err: | 366 | err_put_device: |
| 363 | snd_soc_free_ac97_codec(ac97); | 367 | put_device(&ac97->dev); |
| 364 | return ret; | 368 | return ret; |
| 365 | } | 369 | } |
| 366 | 370 | ||
diff --git a/sound/soc/codecs/wm9712.c b/sound/soc/codecs/wm9712.c index e04643d2bb24..9517571e820d 100644 --- a/sound/soc/codecs/wm9712.c +++ b/sound/soc/codecs/wm9712.c | |||
| @@ -666,7 +666,7 @@ static int wm9712_soc_probe(struct snd_soc_codec *codec) | |||
| 666 | struct wm9712_priv *wm9712 = snd_soc_codec_get_drvdata(codec); | 666 | struct wm9712_priv *wm9712 = snd_soc_codec_get_drvdata(codec); |
| 667 | int ret = 0; | 667 | int ret = 0; |
| 668 | 668 | ||
| 669 | wm9712->ac97 = snd_soc_new_ac97_codec(codec); | 669 | wm9712->ac97 = snd_soc_alloc_ac97_codec(codec); |
| 670 | if (IS_ERR(wm9712->ac97)) { | 670 | if (IS_ERR(wm9712->ac97)) { |
| 671 | ret = PTR_ERR(wm9712->ac97); | 671 | ret = PTR_ERR(wm9712->ac97); |
| 672 | dev_err(codec->dev, "Failed to register AC97 codec: %d\n", ret); | 672 | dev_err(codec->dev, "Failed to register AC97 codec: %d\n", ret); |
| @@ -675,15 +675,19 @@ static int wm9712_soc_probe(struct snd_soc_codec *codec) | |||
| 675 | 675 | ||
| 676 | ret = wm9712_reset(codec, 0); | 676 | ret = wm9712_reset(codec, 0); |
| 677 | if (ret < 0) | 677 | if (ret < 0) |
| 678 | goto reset_err; | 678 | goto err_put_device; |
| 679 | |||
| 680 | ret = device_add(&wm9712->ac97->dev); | ||
| 681 | if (ret) | ||
| 682 | goto err_put_device; | ||
| 679 | 683 | ||
| 680 | /* set alc mux to none */ | 684 | /* set alc mux to none */ |
| 681 | ac97_write(codec, AC97_VIDEO, ac97_read(codec, AC97_VIDEO) | 0x3000); | 685 | ac97_write(codec, AC97_VIDEO, ac97_read(codec, AC97_VIDEO) | 0x3000); |
| 682 | 686 | ||
| 683 | return 0; | 687 | return 0; |
| 684 | 688 | ||
| 685 | reset_err: | 689 | err_put_device: |
| 686 | snd_soc_free_ac97_codec(wm9712->ac97); | 690 | put_device(&wm9712->ac97->dev); |
| 687 | return ret; | 691 | return ret; |
| 688 | } | 692 | } |
| 689 | 693 | ||
diff --git a/sound/soc/codecs/wm9713.c b/sound/soc/codecs/wm9713.c index 71b9d5b0734d..6ab1122a3872 100644 --- a/sound/soc/codecs/wm9713.c +++ b/sound/soc/codecs/wm9713.c | |||
| @@ -1225,7 +1225,7 @@ static int wm9713_soc_probe(struct snd_soc_codec *codec) | |||
| 1225 | struct wm9713_priv *wm9713 = snd_soc_codec_get_drvdata(codec); | 1225 | struct wm9713_priv *wm9713 = snd_soc_codec_get_drvdata(codec); |
| 1226 | int ret = 0, reg; | 1226 | int ret = 0, reg; |
| 1227 | 1227 | ||
| 1228 | wm9713->ac97 = snd_soc_new_ac97_codec(codec); | 1228 | wm9713->ac97 = snd_soc_alloc_ac97_codec(codec); |
| 1229 | if (IS_ERR(wm9713->ac97)) | 1229 | if (IS_ERR(wm9713->ac97)) |
| 1230 | return PTR_ERR(wm9713->ac97); | 1230 | return PTR_ERR(wm9713->ac97); |
| 1231 | 1231 | ||
| @@ -1234,7 +1234,11 @@ static int wm9713_soc_probe(struct snd_soc_codec *codec) | |||
| 1234 | wm9713_reset(codec, 0); | 1234 | wm9713_reset(codec, 0); |
| 1235 | ret = wm9713_reset(codec, 1); | 1235 | ret = wm9713_reset(codec, 1); |
| 1236 | if (ret < 0) | 1236 | if (ret < 0) |
| 1237 | goto reset_err; | 1237 | goto err_put_device; |
| 1238 | |||
| 1239 | ret = device_add(&wm9713->ac97->dev); | ||
| 1240 | if (ret) | ||
| 1241 | goto err_put_device; | ||
| 1238 | 1242 | ||
| 1239 | /* unmute the adc - move to kcontrol */ | 1243 | /* unmute the adc - move to kcontrol */ |
| 1240 | reg = ac97_read(codec, AC97_CD) & 0x7fff; | 1244 | reg = ac97_read(codec, AC97_CD) & 0x7fff; |
| @@ -1242,8 +1246,8 @@ static int wm9713_soc_probe(struct snd_soc_codec *codec) | |||
| 1242 | 1246 | ||
| 1243 | return 0; | 1247 | return 0; |
| 1244 | 1248 | ||
| 1245 | reset_err: | 1249 | err_put_device: |
| 1246 | snd_soc_free_ac97_codec(wm9713->ac97); | 1250 | put_device(&wm9713->ac97->dev); |
| 1247 | return ret; | 1251 | return ret; |
| 1248 | } | 1252 | } |
| 1249 | 1253 | ||
diff --git a/sound/soc/fsl/fsl_esai.h b/sound/soc/fsl/fsl_esai.h index 91a550f4a10d..5e793bbb6b02 100644 --- a/sound/soc/fsl/fsl_esai.h +++ b/sound/soc/fsl/fsl_esai.h | |||
| @@ -302,7 +302,7 @@ | |||
| 302 | #define ESAI_xCCR_xFP_MASK (((1 << ESAI_xCCR_xFP_WIDTH) - 1) << ESAI_xCCR_xFP_SHIFT) | 302 | #define ESAI_xCCR_xFP_MASK (((1 << ESAI_xCCR_xFP_WIDTH) - 1) << ESAI_xCCR_xFP_SHIFT) |
| 303 | #define ESAI_xCCR_xFP(v) ((((v) - 1) << ESAI_xCCR_xFP_SHIFT) & ESAI_xCCR_xFP_MASK) | 303 | #define ESAI_xCCR_xFP(v) ((((v) - 1) << ESAI_xCCR_xFP_SHIFT) & ESAI_xCCR_xFP_MASK) |
| 304 | #define ESAI_xCCR_xDC_SHIFT 9 | 304 | #define ESAI_xCCR_xDC_SHIFT 9 |
| 305 | #define ESAI_xCCR_xDC_WIDTH 4 | 305 | #define ESAI_xCCR_xDC_WIDTH 5 |
| 306 | #define ESAI_xCCR_xDC_MASK (((1 << ESAI_xCCR_xDC_WIDTH) - 1) << ESAI_xCCR_xDC_SHIFT) | 306 | #define ESAI_xCCR_xDC_MASK (((1 << ESAI_xCCR_xDC_WIDTH) - 1) << ESAI_xCCR_xDC_SHIFT) |
| 307 | #define ESAI_xCCR_xDC(v) ((((v) - 1) << ESAI_xCCR_xDC_SHIFT) & ESAI_xCCR_xDC_MASK) | 307 | #define ESAI_xCCR_xDC(v) ((((v) - 1) << ESAI_xCCR_xDC_SHIFT) & ESAI_xCCR_xDC_MASK) |
| 308 | #define ESAI_xCCR_xPSR_SHIFT 8 | 308 | #define ESAI_xCCR_xPSR_SHIFT 8 |
diff --git a/sound/soc/fsl/fsl_ssi.c b/sound/soc/fsl/fsl_ssi.c index a65f17d57ffb..059496ed9ad7 100644 --- a/sound/soc/fsl/fsl_ssi.c +++ b/sound/soc/fsl/fsl_ssi.c | |||
| @@ -1362,9 +1362,9 @@ static int fsl_ssi_probe(struct platform_device *pdev) | |||
| 1362 | } | 1362 | } |
| 1363 | 1363 | ||
| 1364 | ssi_private->irq = platform_get_irq(pdev, 0); | 1364 | ssi_private->irq = platform_get_irq(pdev, 0); |
| 1365 | if (!ssi_private->irq) { | 1365 | if (ssi_private->irq < 0) { |
| 1366 | dev_err(&pdev->dev, "no irq for node %s\n", np->full_name); | 1366 | dev_err(&pdev->dev, "no irq for node %s\n", np->full_name); |
| 1367 | return -ENXIO; | 1367 | return ssi_private->irq; |
| 1368 | } | 1368 | } |
| 1369 | 1369 | ||
| 1370 | /* Are the RX and the TX clocks locked? */ | 1370 | /* Are the RX and the TX clocks locked? */ |
diff --git a/sound/soc/fsl/imx-wm8962.c b/sound/soc/fsl/imx-wm8962.c index 4caacb05a623..cd146d4fa805 100644 --- a/sound/soc/fsl/imx-wm8962.c +++ b/sound/soc/fsl/imx-wm8962.c | |||
| @@ -257,6 +257,7 @@ static int imx_wm8962_probe(struct platform_device *pdev) | |||
| 257 | if (ret) | 257 | if (ret) |
| 258 | goto clk_fail; | 258 | goto clk_fail; |
| 259 | data->card.num_links = 1; | 259 | data->card.num_links = 1; |
| 260 | data->card.owner = THIS_MODULE; | ||
| 260 | data->card.dai_link = &data->dai; | 261 | data->card.dai_link = &data->dai; |
| 261 | data->card.dapm_widgets = imx_wm8962_dapm_widgets; | 262 | data->card.dapm_widgets = imx_wm8962_dapm_widgets; |
| 262 | data->card.num_dapm_widgets = ARRAY_SIZE(imx_wm8962_dapm_widgets); | 263 | data->card.num_dapm_widgets = ARRAY_SIZE(imx_wm8962_dapm_widgets); |
diff --git a/sound/soc/generic/simple-card.c b/sound/soc/generic/simple-card.c index fb9240fdc9b7..7fe3009b1c43 100644 --- a/sound/soc/generic/simple-card.c +++ b/sound/soc/generic/simple-card.c | |||
| @@ -452,9 +452,8 @@ static int asoc_simple_card_parse_of(struct device_node *node, | |||
| 452 | } | 452 | } |
| 453 | 453 | ||
| 454 | /* Decrease the reference count of the device nodes */ | 454 | /* Decrease the reference count of the device nodes */ |
| 455 | static int asoc_simple_card_unref(struct platform_device *pdev) | 455 | static int asoc_simple_card_unref(struct snd_soc_card *card) |
| 456 | { | 456 | { |
| 457 | struct snd_soc_card *card = platform_get_drvdata(pdev); | ||
| 458 | struct snd_soc_dai_link *dai_link; | 457 | struct snd_soc_dai_link *dai_link; |
| 459 | int num_links; | 458 | int num_links; |
| 460 | 459 | ||
| @@ -556,7 +555,7 @@ static int asoc_simple_card_probe(struct platform_device *pdev) | |||
| 556 | return ret; | 555 | return ret; |
| 557 | 556 | ||
| 558 | err: | 557 | err: |
| 559 | asoc_simple_card_unref(pdev); | 558 | asoc_simple_card_unref(&priv->snd_card); |
| 560 | return ret; | 559 | return ret; |
| 561 | } | 560 | } |
| 562 | 561 | ||
| @@ -572,7 +571,7 @@ static int asoc_simple_card_remove(struct platform_device *pdev) | |||
| 572 | snd_soc_jack_free_gpios(&simple_card_mic_jack, 1, | 571 | snd_soc_jack_free_gpios(&simple_card_mic_jack, 1, |
| 573 | &simple_card_mic_jack_gpio); | 572 | &simple_card_mic_jack_gpio); |
| 574 | 573 | ||
| 575 | return asoc_simple_card_unref(pdev); | 574 | return asoc_simple_card_unref(card); |
| 576 | } | 575 | } |
| 577 | 576 | ||
| 578 | static const struct of_device_id asoc_simple_of_match[] = { | 577 | static const struct of_device_id asoc_simple_of_match[] = { |
diff --git a/sound/soc/intel/sst-firmware.c b/sound/soc/intel/sst-firmware.c index ef2e8b5766a1..b3f9489794a6 100644 --- a/sound/soc/intel/sst-firmware.c +++ b/sound/soc/intel/sst-firmware.c | |||
| @@ -706,6 +706,7 @@ static int block_alloc_fixed(struct sst_dsp *dsp, struct sst_block_allocator *ba | |||
| 706 | struct list_head *block_list) | 706 | struct list_head *block_list) |
| 707 | { | 707 | { |
| 708 | struct sst_mem_block *block, *tmp; | 708 | struct sst_mem_block *block, *tmp; |
| 709 | struct sst_block_allocator ba_tmp = *ba; | ||
| 709 | u32 end = ba->offset + ba->size, block_end; | 710 | u32 end = ba->offset + ba->size, block_end; |
| 710 | int err; | 711 | int err; |
| 711 | 712 | ||
| @@ -730,9 +731,9 @@ static int block_alloc_fixed(struct sst_dsp *dsp, struct sst_block_allocator *ba | |||
| 730 | if (ba->offset >= block->offset && ba->offset < block_end) { | 731 | if (ba->offset >= block->offset && ba->offset < block_end) { |
| 731 | 732 | ||
| 732 | /* align ba to block boundary */ | 733 | /* align ba to block boundary */ |
| 733 | ba->size -= block_end - ba->offset; | 734 | ba_tmp.size -= block_end - ba->offset; |
| 734 | ba->offset = block_end; | 735 | ba_tmp.offset = block_end; |
| 735 | err = block_alloc_contiguous(dsp, ba, block_list); | 736 | err = block_alloc_contiguous(dsp, &ba_tmp, block_list); |
| 736 | if (err < 0) | 737 | if (err < 0) |
| 737 | return -ENOMEM; | 738 | return -ENOMEM; |
| 738 | 739 | ||
| @@ -767,10 +768,10 @@ static int block_alloc_fixed(struct sst_dsp *dsp, struct sst_block_allocator *ba | |||
| 767 | list_move(&block->list, &dsp->used_block_list); | 768 | list_move(&block->list, &dsp->used_block_list); |
| 768 | list_add(&block->module_list, block_list); | 769 | list_add(&block->module_list, block_list); |
| 769 | /* align ba to block boundary */ | 770 | /* align ba to block boundary */ |
| 770 | ba->size -= block_end - ba->offset; | 771 | ba_tmp.size -= block_end - ba->offset; |
| 771 | ba->offset = block_end; | 772 | ba_tmp.offset = block_end; |
| 772 | 773 | ||
| 773 | err = block_alloc_contiguous(dsp, ba, block_list); | 774 | err = block_alloc_contiguous(dsp, &ba_tmp, block_list); |
| 774 | if (err < 0) | 775 | if (err < 0) |
| 775 | return -ENOMEM; | 776 | return -ENOMEM; |
| 776 | 777 | ||
diff --git a/sound/soc/intel/sst-haswell-ipc.c b/sound/soc/intel/sst-haswell-ipc.c index 3f8c48231364..8156cc1accb7 100644 --- a/sound/soc/intel/sst-haswell-ipc.c +++ b/sound/soc/intel/sst-haswell-ipc.c | |||
| @@ -651,11 +651,11 @@ static void hsw_notification_work(struct work_struct *work) | |||
| 651 | } | 651 | } |
| 652 | 652 | ||
| 653 | /* tell DSP that notification has been handled */ | 653 | /* tell DSP that notification has been handled */ |
| 654 | sst_dsp_shim_update_bits_unlocked(hsw->dsp, SST_IPCD, | 654 | sst_dsp_shim_update_bits(hsw->dsp, SST_IPCD, |
| 655 | SST_IPCD_BUSY | SST_IPCD_DONE, SST_IPCD_DONE); | 655 | SST_IPCD_BUSY | SST_IPCD_DONE, SST_IPCD_DONE); |
| 656 | 656 | ||
| 657 | /* unmask busy interrupt */ | 657 | /* unmask busy interrupt */ |
| 658 | sst_dsp_shim_update_bits_unlocked(hsw->dsp, SST_IMRX, SST_IMRX_BUSY, 0); | 658 | sst_dsp_shim_update_bits(hsw->dsp, SST_IMRX, SST_IMRX_BUSY, 0); |
| 659 | } | 659 | } |
| 660 | 660 | ||
| 661 | static struct ipc_message *reply_find_msg(struct sst_hsw *hsw, u32 header) | 661 | static struct ipc_message *reply_find_msg(struct sst_hsw *hsw, u32 header) |
| @@ -1228,6 +1228,11 @@ int sst_hsw_stream_free(struct sst_hsw *hsw, struct sst_hsw_stream *stream) | |||
| 1228 | struct sst_dsp *sst = hsw->dsp; | 1228 | struct sst_dsp *sst = hsw->dsp; |
| 1229 | unsigned long flags; | 1229 | unsigned long flags; |
| 1230 | 1230 | ||
| 1231 | if (!stream) { | ||
| 1232 | dev_warn(hsw->dev, "warning: stream is NULL, no stream to free, ignore it.\n"); | ||
| 1233 | return 0; | ||
| 1234 | } | ||
| 1235 | |||
| 1231 | /* dont free DSP streams that are not commited */ | 1236 | /* dont free DSP streams that are not commited */ |
| 1232 | if (!stream->commited) | 1237 | if (!stream->commited) |
| 1233 | goto out; | 1238 | goto out; |
| @@ -1415,6 +1420,16 @@ int sst_hsw_stream_commit(struct sst_hsw *hsw, struct sst_hsw_stream *stream) | |||
| 1415 | u32 header; | 1420 | u32 header; |
| 1416 | int ret; | 1421 | int ret; |
| 1417 | 1422 | ||
| 1423 | if (!stream) { | ||
| 1424 | dev_warn(hsw->dev, "warning: stream is NULL, no stream to commit, ignore it.\n"); | ||
| 1425 | return 0; | ||
| 1426 | } | ||
| 1427 | |||
| 1428 | if (stream->commited) { | ||
| 1429 | dev_warn(hsw->dev, "warning: stream is already committed, ignore it.\n"); | ||
| 1430 | return 0; | ||
| 1431 | } | ||
| 1432 | |||
| 1418 | trace_ipc_request("stream alloc", stream->host_id); | 1433 | trace_ipc_request("stream alloc", stream->host_id); |
| 1419 | 1434 | ||
| 1420 | header = IPC_GLB_TYPE(IPC_GLB_ALLOCATE_STREAM); | 1435 | header = IPC_GLB_TYPE(IPC_GLB_ALLOCATE_STREAM); |
| @@ -1519,6 +1534,11 @@ int sst_hsw_stream_pause(struct sst_hsw *hsw, struct sst_hsw_stream *stream, | |||
| 1519 | { | 1534 | { |
| 1520 | int ret; | 1535 | int ret; |
| 1521 | 1536 | ||
| 1537 | if (!stream) { | ||
| 1538 | dev_warn(hsw->dev, "warning: stream is NULL, no stream to pause, ignore it.\n"); | ||
| 1539 | return 0; | ||
| 1540 | } | ||
| 1541 | |||
| 1522 | trace_ipc_request("stream pause", stream->reply.stream_hw_id); | 1542 | trace_ipc_request("stream pause", stream->reply.stream_hw_id); |
| 1523 | 1543 | ||
| 1524 | ret = sst_hsw_stream_operations(hsw, IPC_STR_PAUSE, | 1544 | ret = sst_hsw_stream_operations(hsw, IPC_STR_PAUSE, |
| @@ -1535,6 +1555,11 @@ int sst_hsw_stream_resume(struct sst_hsw *hsw, struct sst_hsw_stream *stream, | |||
| 1535 | { | 1555 | { |
| 1536 | int ret; | 1556 | int ret; |
| 1537 | 1557 | ||
| 1558 | if (!stream) { | ||
| 1559 | dev_warn(hsw->dev, "warning: stream is NULL, no stream to resume, ignore it.\n"); | ||
| 1560 | return 0; | ||
| 1561 | } | ||
| 1562 | |||
| 1538 | trace_ipc_request("stream resume", stream->reply.stream_hw_id); | 1563 | trace_ipc_request("stream resume", stream->reply.stream_hw_id); |
| 1539 | 1564 | ||
| 1540 | ret = sst_hsw_stream_operations(hsw, IPC_STR_RESUME, | 1565 | ret = sst_hsw_stream_operations(hsw, IPC_STR_RESUME, |
| @@ -1550,6 +1575,11 @@ int sst_hsw_stream_reset(struct sst_hsw *hsw, struct sst_hsw_stream *stream) | |||
| 1550 | { | 1575 | { |
| 1551 | int ret, tries = 10; | 1576 | int ret, tries = 10; |
| 1552 | 1577 | ||
| 1578 | if (!stream) { | ||
| 1579 | dev_warn(hsw->dev, "warning: stream is NULL, no stream to reset, ignore it.\n"); | ||
| 1580 | return 0; | ||
| 1581 | } | ||
| 1582 | |||
| 1553 | /* dont reset streams that are not commited */ | 1583 | /* dont reset streams that are not commited */ |
| 1554 | if (!stream->commited) | 1584 | if (!stream->commited) |
| 1555 | return 0; | 1585 | return 0; |
diff --git a/sound/soc/intel/sst/sst_acpi.c b/sound/soc/intel/sst/sst_acpi.c index 2ac72eb5e75d..b3360139c41a 100644 --- a/sound/soc/intel/sst/sst_acpi.c +++ b/sound/soc/intel/sst/sst_acpi.c | |||
| @@ -350,7 +350,7 @@ static struct sst_machines sst_acpi_bytcr[] = { | |||
| 350 | 350 | ||
| 351 | /* Cherryview-based platforms: CherryTrail and Braswell */ | 351 | /* Cherryview-based platforms: CherryTrail and Braswell */ |
| 352 | static struct sst_machines sst_acpi_chv[] = { | 352 | static struct sst_machines sst_acpi_chv[] = { |
| 353 | {"10EC5670", "cht-bsw", "cht-bsw-rt5672", NULL, "fw_sst_22a8.bin", | 353 | {"10EC5670", "cht-bsw", "cht-bsw-rt5672", NULL, "intel/fw_sst_22a8.bin", |
| 354 | &chv_platform_data }, | 354 | &chv_platform_data }, |
| 355 | {}, | 355 | {}, |
| 356 | }; | 356 | }; |
diff --git a/sound/soc/omap/omap-mcbsp.c b/sound/soc/omap/omap-mcbsp.c index 8b79cafab1e2..c7eb9dd67f60 100644 --- a/sound/soc/omap/omap-mcbsp.c +++ b/sound/soc/omap/omap-mcbsp.c | |||
| @@ -434,7 +434,7 @@ static int omap_mcbsp_dai_set_dai_fmt(struct snd_soc_dai *cpu_dai, | |||
| 434 | case SND_SOC_DAIFMT_CBM_CFS: | 434 | case SND_SOC_DAIFMT_CBM_CFS: |
| 435 | /* McBSP slave. FS clock as output */ | 435 | /* McBSP slave. FS clock as output */ |
| 436 | regs->srgr2 |= FSGM; | 436 | regs->srgr2 |= FSGM; |
| 437 | regs->pcr0 |= FSXM; | 437 | regs->pcr0 |= FSXM | FSRM; |
| 438 | break; | 438 | break; |
| 439 | case SND_SOC_DAIFMT_CBM_CFM: | 439 | case SND_SOC_DAIFMT_CBM_CFM: |
| 440 | /* McBSP slave */ | 440 | /* McBSP slave */ |
diff --git a/sound/soc/rockchip/rockchip_i2s.c b/sound/soc/rockchip/rockchip_i2s.c index 13d8507333b8..dcc26eda0539 100644 --- a/sound/soc/rockchip/rockchip_i2s.c +++ b/sound/soc/rockchip/rockchip_i2s.c | |||
| @@ -335,6 +335,7 @@ static struct snd_soc_dai_driver rockchip_i2s_dai = { | |||
| 335 | SNDRV_PCM_FMTBIT_S24_LE), | 335 | SNDRV_PCM_FMTBIT_S24_LE), |
| 336 | }, | 336 | }, |
| 337 | .ops = &rockchip_i2s_dai_ops, | 337 | .ops = &rockchip_i2s_dai_ops, |
| 338 | .symmetric_rates = 1, | ||
| 338 | }; | 339 | }; |
| 339 | 340 | ||
| 340 | static const struct snd_soc_component_driver rockchip_i2s_component = { | 341 | static const struct snd_soc_component_driver rockchip_i2s_component = { |
diff --git a/sound/soc/soc-ac97.c b/sound/soc/soc-ac97.c index 2e10e9a38376..08d7259bbaab 100644 --- a/sound/soc/soc-ac97.c +++ b/sound/soc/soc-ac97.c | |||
| @@ -48,15 +48,18 @@ static void soc_ac97_device_release(struct device *dev) | |||
| 48 | } | 48 | } |
| 49 | 49 | ||
| 50 | /** | 50 | /** |
| 51 | * snd_soc_new_ac97_codec - initailise AC97 device | 51 | * snd_soc_alloc_ac97_codec() - Allocate new a AC'97 device |
| 52 | * @codec: audio codec | 52 | * @codec: The CODEC for which to create the AC'97 device |
| 53 | * | 53 | * |
| 54 | * Initialises AC97 codec resources for use by ad-hoc devices only. | 54 | * Allocated a new snd_ac97 device and intializes it, but does not yet register |
| 55 | * it. The caller is responsible to either call device_add(&ac97->dev) to | ||
| 56 | * register the device, or to call put_device(&ac97->dev) to free the device. | ||
| 57 | * | ||
| 58 | * Returns: A snd_ac97 device or a PTR_ERR in case of an error. | ||
| 55 | */ | 59 | */ |
| 56 | struct snd_ac97 *snd_soc_new_ac97_codec(struct snd_soc_codec *codec) | 60 | struct snd_ac97 *snd_soc_alloc_ac97_codec(struct snd_soc_codec *codec) |
| 57 | { | 61 | { |
| 58 | struct snd_ac97 *ac97; | 62 | struct snd_ac97 *ac97; |
| 59 | int ret; | ||
| 60 | 63 | ||
| 61 | ac97 = kzalloc(sizeof(struct snd_ac97), GFP_KERNEL); | 64 | ac97 = kzalloc(sizeof(struct snd_ac97), GFP_KERNEL); |
| 62 | if (ac97 == NULL) | 65 | if (ac97 == NULL) |
| @@ -73,7 +76,28 @@ struct snd_ac97 *snd_soc_new_ac97_codec(struct snd_soc_codec *codec) | |||
| 73 | codec->component.card->snd_card->number, 0, | 76 | codec->component.card->snd_card->number, 0, |
| 74 | codec->component.name); | 77 | codec->component.name); |
| 75 | 78 | ||
| 76 | ret = device_register(&ac97->dev); | 79 | device_initialize(&ac97->dev); |
| 80 | |||
| 81 | return ac97; | ||
| 82 | } | ||
| 83 | EXPORT_SYMBOL(snd_soc_alloc_ac97_codec); | ||
| 84 | |||
| 85 | /** | ||
| 86 | * snd_soc_new_ac97_codec - initailise AC97 device | ||
| 87 | * @codec: audio codec | ||
| 88 | * | ||
| 89 | * Initialises AC97 codec resources for use by ad-hoc devices only. | ||
| 90 | */ | ||
| 91 | struct snd_ac97 *snd_soc_new_ac97_codec(struct snd_soc_codec *codec) | ||
| 92 | { | ||
| 93 | struct snd_ac97 *ac97; | ||
| 94 | int ret; | ||
| 95 | |||
| 96 | ac97 = snd_soc_alloc_ac97_codec(codec); | ||
| 97 | if (IS_ERR(ac97)) | ||
| 98 | return ac97; | ||
| 99 | |||
| 100 | ret = device_add(&ac97->dev); | ||
| 77 | if (ret) { | 101 | if (ret) { |
| 78 | put_device(&ac97->dev); | 102 | put_device(&ac97->dev); |
| 79 | return ERR_PTR(ret); | 103 | return ERR_PTR(ret); |
diff --git a/sound/soc/soc-compress.c b/sound/soc/soc-compress.c index 590a82f01d0b..025c38fbe3c0 100644 --- a/sound/soc/soc-compress.c +++ b/sound/soc/soc-compress.c | |||
| @@ -659,7 +659,8 @@ int soc_new_compress(struct snd_soc_pcm_runtime *rtd, int num) | |||
| 659 | rtd->dai_link->stream_name); | 659 | rtd->dai_link->stream_name); |
| 660 | 660 | ||
| 661 | ret = snd_pcm_new_internal(rtd->card->snd_card, new_name, num, | 661 | ret = snd_pcm_new_internal(rtd->card->snd_card, new_name, num, |
| 662 | 1, 0, &be_pcm); | 662 | rtd->dai_link->dpcm_playback, |
| 663 | rtd->dai_link->dpcm_capture, &be_pcm); | ||
| 663 | if (ret < 0) { | 664 | if (ret < 0) { |
| 664 | dev_err(rtd->card->dev, "ASoC: can't create compressed for %s\n", | 665 | dev_err(rtd->card->dev, "ASoC: can't create compressed for %s\n", |
| 665 | rtd->dai_link->name); | 666 | rtd->dai_link->name); |
| @@ -668,8 +669,10 @@ int soc_new_compress(struct snd_soc_pcm_runtime *rtd, int num) | |||
| 668 | 669 | ||
| 669 | rtd->pcm = be_pcm; | 670 | rtd->pcm = be_pcm; |
| 670 | rtd->fe_compr = 1; | 671 | rtd->fe_compr = 1; |
| 671 | be_pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream->private_data = rtd; | 672 | if (rtd->dai_link->dpcm_playback) |
| 672 | be_pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream->private_data = rtd; | 673 | be_pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream->private_data = rtd; |
| 674 | else if (rtd->dai_link->dpcm_capture) | ||
| 675 | be_pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream->private_data = rtd; | ||
| 673 | memcpy(compr->ops, &soc_compr_dyn_ops, sizeof(soc_compr_dyn_ops)); | 676 | memcpy(compr->ops, &soc_compr_dyn_ops, sizeof(soc_compr_dyn_ops)); |
| 674 | } else | 677 | } else |
| 675 | memcpy(compr->ops, &soc_compr_ops, sizeof(soc_compr_ops)); | 678 | memcpy(compr->ops, &soc_compr_ops, sizeof(soc_compr_ops)); |
diff --git a/sound/usb/caiaq/audio.c b/sound/usb/caiaq/audio.c index 272844746135..327f8642ca80 100644 --- a/sound/usb/caiaq/audio.c +++ b/sound/usb/caiaq/audio.c | |||
| @@ -816,7 +816,7 @@ int snd_usb_caiaq_audio_init(struct snd_usb_caiaqdev *cdev) | |||
| 816 | return -EINVAL; | 816 | return -EINVAL; |
| 817 | } | 817 | } |
| 818 | 818 | ||
| 819 | if (cdev->n_streams < 2) { | 819 | if (cdev->n_streams < 1) { |
| 820 | dev_err(dev, "bogus number of streams: %d\n", cdev->n_streams); | 820 | dev_err(dev, "bogus number of streams: %d\n", cdev->n_streams); |
| 821 | return -EINVAL; | 821 | return -EINVAL; |
| 822 | } | 822 | } |
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/lib/lockdep/.gitignore b/tools/lib/lockdep/.gitignore new file mode 100644 index 000000000000..cc0e7a9f99e3 --- /dev/null +++ b/tools/lib/lockdep/.gitignore | |||
| @@ -0,0 +1 @@ | |||
| liblockdep.so.* | |||
diff --git a/tools/lib/lockdep/Makefile b/tools/lib/lockdep/Makefile index 52f9279c6c13..4b866c54f624 100644 --- a/tools/lib/lockdep/Makefile +++ b/tools/lib/lockdep/Makefile | |||
| @@ -104,7 +104,7 @@ N = | |||
| 104 | 104 | ||
| 105 | export Q VERBOSE | 105 | export Q VERBOSE |
| 106 | 106 | ||
| 107 | INCLUDES = -I. -I/usr/local/include -I./uinclude -I./include -I../../include $(CONFIG_INCLUDES) | 107 | INCLUDES = -I. -I./uinclude -I./include -I../../include $(CONFIG_INCLUDES) |
| 108 | 108 | ||
| 109 | # Set compile option CFLAGS if not set elsewhere | 109 | # Set compile option CFLAGS if not set elsewhere |
| 110 | CFLAGS ?= -g -DCONFIG_LOCKDEP -DCONFIG_STACKTRACE -DCONFIG_PROVE_LOCKING -DBITS_PER_LONG=__WORDSIZE -DLIBLOCKDEP_VERSION='"$(LIBLOCKDEP_VERSION)"' -rdynamic -O0 -g | 110 | CFLAGS ?= -g -DCONFIG_LOCKDEP -DCONFIG_STACKTRACE -DCONFIG_PROVE_LOCKING -DBITS_PER_LONG=__WORDSIZE -DLIBLOCKDEP_VERSION='"$(LIBLOCKDEP_VERSION)"' -rdynamic -O0 -g |
diff --git a/tools/lib/lockdep/preload.c b/tools/lib/lockdep/preload.c index 6f803609e498..0b0112c80f22 100644 --- a/tools/lib/lockdep/preload.c +++ b/tools/lib/lockdep/preload.c | |||
| @@ -317,7 +317,7 @@ int pthread_mutex_destroy(pthread_mutex_t *mutex) | |||
| 317 | * | 317 | * |
| 318 | * TODO: Hook into free() and add that check there as well. | 318 | * TODO: Hook into free() and add that check there as well. |
| 319 | */ | 319 | */ |
| 320 | debug_check_no_locks_freed(mutex, mutex + sizeof(*mutex)); | 320 | debug_check_no_locks_freed(mutex, sizeof(*mutex)); |
| 321 | __del_lock(__get_lock(mutex)); | 321 | __del_lock(__get_lock(mutex)); |
| 322 | return ll_pthread_mutex_destroy(mutex); | 322 | return ll_pthread_mutex_destroy(mutex); |
| 323 | } | 323 | } |
| @@ -341,7 +341,7 @@ int pthread_rwlock_destroy(pthread_rwlock_t *rwlock) | |||
| 341 | { | 341 | { |
| 342 | try_init_preload(); | 342 | try_init_preload(); |
| 343 | 343 | ||
| 344 | debug_check_no_locks_freed(rwlock, rwlock + sizeof(*rwlock)); | 344 | debug_check_no_locks_freed(rwlock, sizeof(*rwlock)); |
| 345 | __del_lock(__get_lock(rwlock)); | 345 | __del_lock(__get_lock(rwlock)); |
| 346 | return ll_pthread_rwlock_destroy(rwlock); | 346 | return ll_pthread_rwlock_destroy(rwlock); |
| 347 | } | 347 | } |
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-annotate.c b/tools/perf/builtin-annotate.c index e7417fe97a97..747f86103599 100644 --- a/tools/perf/builtin-annotate.c +++ b/tools/perf/builtin-annotate.c | |||
| @@ -232,7 +232,7 @@ static int __cmd_annotate(struct perf_annotate *ann) | |||
| 232 | if (nr_samples > 0) { | 232 | if (nr_samples > 0) { |
| 233 | total_nr_samples += nr_samples; | 233 | total_nr_samples += nr_samples; |
| 234 | hists__collapse_resort(hists, NULL); | 234 | hists__collapse_resort(hists, NULL); |
| 235 | hists__output_resort(hists); | 235 | hists__output_resort(hists, NULL); |
| 236 | 236 | ||
| 237 | if (symbol_conf.event_group && | 237 | if (symbol_conf.event_group && |
| 238 | !perf_evsel__is_group_leader(pos)) | 238 | !perf_evsel__is_group_leader(pos)) |
diff --git a/tools/perf/builtin-diff.c b/tools/perf/builtin-diff.c index 1ce425d101a9..1fd96c13f199 100644 --- a/tools/perf/builtin-diff.c +++ b/tools/perf/builtin-diff.c | |||
| @@ -545,6 +545,42 @@ hist_entry__cmp_compute(struct hist_entry *left, struct hist_entry *right, | |||
| 545 | return __hist_entry__cmp_compute(p_left, p_right, c); | 545 | return __hist_entry__cmp_compute(p_left, p_right, c); |
| 546 | } | 546 | } |
| 547 | 547 | ||
| 548 | static int64_t | ||
| 549 | hist_entry__cmp_nop(struct hist_entry *left __maybe_unused, | ||
| 550 | struct hist_entry *right __maybe_unused) | ||
| 551 | { | ||
| 552 | return 0; | ||
| 553 | } | ||
| 554 | |||
| 555 | static int64_t | ||
| 556 | hist_entry__cmp_baseline(struct hist_entry *left, struct hist_entry *right) | ||
| 557 | { | ||
| 558 | if (sort_compute) | ||
| 559 | return 0; | ||
| 560 | |||
| 561 | if (left->stat.period == right->stat.period) | ||
| 562 | return 0; | ||
| 563 | return left->stat.period > right->stat.period ? 1 : -1; | ||
| 564 | } | ||
| 565 | |||
| 566 | static int64_t | ||
| 567 | hist_entry__cmp_delta(struct hist_entry *left, struct hist_entry *right) | ||
| 568 | { | ||
| 569 | return hist_entry__cmp_compute(right, left, COMPUTE_DELTA); | ||
| 570 | } | ||
| 571 | |||
| 572 | static int64_t | ||
| 573 | hist_entry__cmp_ratio(struct hist_entry *left, struct hist_entry *right) | ||
| 574 | { | ||
| 575 | return hist_entry__cmp_compute(right, left, COMPUTE_RATIO); | ||
| 576 | } | ||
| 577 | |||
| 578 | static int64_t | ||
| 579 | hist_entry__cmp_wdiff(struct hist_entry *left, struct hist_entry *right) | ||
| 580 | { | ||
| 581 | return hist_entry__cmp_compute(right, left, COMPUTE_WEIGHTED_DIFF); | ||
| 582 | } | ||
| 583 | |||
| 548 | static void insert_hist_entry_by_compute(struct rb_root *root, | 584 | static void insert_hist_entry_by_compute(struct rb_root *root, |
| 549 | struct hist_entry *he, | 585 | struct hist_entry *he, |
| 550 | int c) | 586 | int c) |
| @@ -605,7 +641,7 @@ static void hists__process(struct hists *hists) | |||
| 605 | hists__precompute(hists); | 641 | hists__precompute(hists); |
| 606 | hists__compute_resort(hists); | 642 | hists__compute_resort(hists); |
| 607 | } else { | 643 | } else { |
| 608 | hists__output_resort(hists); | 644 | hists__output_resort(hists, NULL); |
| 609 | } | 645 | } |
| 610 | 646 | ||
| 611 | hists__fprintf(hists, true, 0, 0, 0, stdout); | 647 | hists__fprintf(hists, true, 0, 0, 0, stdout); |
| @@ -1038,27 +1074,35 @@ static void data__hpp_register(struct data__file *d, int idx) | |||
| 1038 | fmt->header = hpp__header; | 1074 | fmt->header = hpp__header; |
| 1039 | fmt->width = hpp__width; | 1075 | fmt->width = hpp__width; |
| 1040 | fmt->entry = hpp__entry_global; | 1076 | fmt->entry = hpp__entry_global; |
| 1077 | fmt->cmp = hist_entry__cmp_nop; | ||
| 1078 | fmt->collapse = hist_entry__cmp_nop; | ||
| 1041 | 1079 | ||
| 1042 | /* TODO more colors */ | 1080 | /* TODO more colors */ |
| 1043 | switch (idx) { | 1081 | switch (idx) { |
| 1044 | case PERF_HPP_DIFF__BASELINE: | 1082 | case PERF_HPP_DIFF__BASELINE: |
| 1045 | fmt->color = hpp__color_baseline; | 1083 | fmt->color = hpp__color_baseline; |
| 1084 | fmt->sort = hist_entry__cmp_baseline; | ||
| 1046 | break; | 1085 | break; |
| 1047 | case PERF_HPP_DIFF__DELTA: | 1086 | case PERF_HPP_DIFF__DELTA: |
| 1048 | fmt->color = hpp__color_delta; | 1087 | fmt->color = hpp__color_delta; |
| 1088 | fmt->sort = hist_entry__cmp_delta; | ||
| 1049 | break; | 1089 | break; |
| 1050 | case PERF_HPP_DIFF__RATIO: | 1090 | case PERF_HPP_DIFF__RATIO: |
| 1051 | fmt->color = hpp__color_ratio; | 1091 | fmt->color = hpp__color_ratio; |
| 1092 | fmt->sort = hist_entry__cmp_ratio; | ||
| 1052 | break; | 1093 | break; |
| 1053 | case PERF_HPP_DIFF__WEIGHTED_DIFF: | 1094 | case PERF_HPP_DIFF__WEIGHTED_DIFF: |
| 1054 | fmt->color = hpp__color_wdiff; | 1095 | fmt->color = hpp__color_wdiff; |
| 1096 | fmt->sort = hist_entry__cmp_wdiff; | ||
| 1055 | break; | 1097 | break; |
| 1056 | default: | 1098 | default: |
| 1099 | fmt->sort = hist_entry__cmp_nop; | ||
| 1057 | break; | 1100 | break; |
| 1058 | } | 1101 | } |
| 1059 | 1102 | ||
| 1060 | init_header(d, dfmt); | 1103 | init_header(d, dfmt); |
| 1061 | perf_hpp__column_register(fmt); | 1104 | perf_hpp__column_register(fmt); |
| 1105 | perf_hpp__register_sort_field(fmt); | ||
| 1062 | } | 1106 | } |
| 1063 | 1107 | ||
| 1064 | static void ui_init(void) | 1108 | static void ui_init(void) |
diff --git a/tools/perf/builtin-list.c b/tools/perf/builtin-list.c index 011195e38f21..198f3c3aff95 100644 --- a/tools/perf/builtin-list.c +++ b/tools/perf/builtin-list.c | |||
| @@ -19,7 +19,9 @@ | |||
| 19 | int cmd_list(int argc, const char **argv, const char *prefix __maybe_unused) | 19 | int cmd_list(int argc, const char **argv, const char *prefix __maybe_unused) |
| 20 | { | 20 | { |
| 21 | int i; | 21 | int i; |
| 22 | const struct option list_options[] = { | 22 | bool raw_dump = false; |
| 23 | struct option list_options[] = { | ||
| 24 | OPT_BOOLEAN(0, "raw-dump", &raw_dump, "Dump raw events"), | ||
| 23 | OPT_END() | 25 | OPT_END() |
| 24 | }; | 26 | }; |
| 25 | const char * const list_usage[] = { | 27 | const char * const list_usage[] = { |
| @@ -27,11 +29,18 @@ int cmd_list(int argc, const char **argv, const char *prefix __maybe_unused) | |||
| 27 | NULL | 29 | NULL |
| 28 | }; | 30 | }; |
| 29 | 31 | ||
| 32 | set_option_flag(list_options, 0, "raw-dump", PARSE_OPT_HIDDEN); | ||
| 33 | |||
| 30 | argc = parse_options(argc, argv, list_options, list_usage, | 34 | argc = parse_options(argc, argv, list_options, list_usage, |
| 31 | PARSE_OPT_STOP_AT_NON_OPTION); | 35 | PARSE_OPT_STOP_AT_NON_OPTION); |
| 32 | 36 | ||
| 33 | setup_pager(); | 37 | setup_pager(); |
| 34 | 38 | ||
| 39 | if (raw_dump) { | ||
| 40 | print_events(NULL, true); | ||
| 41 | return 0; | ||
| 42 | } | ||
| 43 | |||
| 35 | if (argc == 0) { | 44 | if (argc == 0) { |
| 36 | print_events(NULL, false); | 45 | print_events(NULL, false); |
| 37 | return 0; | 46 | return 0; |
| @@ -53,8 +62,6 @@ int cmd_list(int argc, const char **argv, const char *prefix __maybe_unused) | |||
| 53 | print_hwcache_events(NULL, false); | 62 | print_hwcache_events(NULL, false); |
| 54 | else if (strcmp(argv[i], "pmu") == 0) | 63 | else if (strcmp(argv[i], "pmu") == 0) |
| 55 | print_pmu_events(NULL, false); | 64 | print_pmu_events(NULL, false); |
| 56 | else if (strcmp(argv[i], "--raw-dump") == 0) | ||
| 57 | print_events(NULL, true); | ||
| 58 | else { | 65 | else { |
| 59 | char *sep = strchr(argv[i], ':'), *s; | 66 | char *sep = strchr(argv[i], ':'), *s; |
| 60 | int sep_idx; | 67 | int sep_idx; |
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index 39367609c707..072ae8ad67fc 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c | |||
| @@ -457,6 +457,19 @@ static void report__collapse_hists(struct report *rep) | |||
| 457 | ui_progress__finish(); | 457 | ui_progress__finish(); |
| 458 | } | 458 | } |
| 459 | 459 | ||
| 460 | static void report__output_resort(struct report *rep) | ||
| 461 | { | ||
| 462 | struct ui_progress prog; | ||
| 463 | struct perf_evsel *pos; | ||
| 464 | |||
| 465 | ui_progress__init(&prog, rep->nr_entries, "Sorting events for output..."); | ||
| 466 | |||
| 467 | evlist__for_each(rep->session->evlist, pos) | ||
| 468 | hists__output_resort(evsel__hists(pos), &prog); | ||
| 469 | |||
| 470 | ui_progress__finish(); | ||
| 471 | } | ||
| 472 | |||
| 460 | static int __cmd_report(struct report *rep) | 473 | static int __cmd_report(struct report *rep) |
| 461 | { | 474 | { |
| 462 | int ret; | 475 | int ret; |
| @@ -505,13 +518,20 @@ static int __cmd_report(struct report *rep) | |||
| 505 | if (session_done()) | 518 | if (session_done()) |
| 506 | return 0; | 519 | return 0; |
| 507 | 520 | ||
| 521 | /* | ||
| 522 | * recalculate number of entries after collapsing since it | ||
| 523 | * might be changed during the collapse phase. | ||
| 524 | */ | ||
| 525 | rep->nr_entries = 0; | ||
| 526 | evlist__for_each(session->evlist, pos) | ||
| 527 | rep->nr_entries += evsel__hists(pos)->nr_entries; | ||
| 528 | |||
| 508 | if (rep->nr_entries == 0) { | 529 | if (rep->nr_entries == 0) { |
| 509 | ui__error("The %s file has no samples!\n", file->path); | 530 | ui__error("The %s file has no samples!\n", file->path); |
| 510 | return 0; | 531 | return 0; |
| 511 | } | 532 | } |
| 512 | 533 | ||
| 513 | evlist__for_each(session->evlist, pos) | 534 | report__output_resort(rep); |
| 514 | hists__output_resort(evsel__hists(pos)); | ||
| 515 | 535 | ||
| 516 | return report__browse_hists(rep); | 536 | return report__browse_hists(rep); |
| 517 | } | 537 | } |
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c index 0aa7747ff139..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; |
| @@ -285,7 +284,7 @@ static void perf_top__print_sym_table(struct perf_top *top) | |||
| 285 | } | 284 | } |
| 286 | 285 | ||
| 287 | hists__collapse_resort(hists, NULL); | 286 | hists__collapse_resort(hists, NULL); |
| 288 | hists__output_resort(hists); | 287 | hists__output_resort(hists, NULL); |
| 289 | 288 | ||
| 290 | hists__output_recalc_col_len(hists, top->print_entries - printed); | 289 | hists__output_recalc_col_len(hists, top->print_entries - printed); |
| 291 | putchar('\n'); | 290 | putchar('\n'); |
| @@ -554,7 +553,7 @@ static void perf_top__sort_new_samples(void *arg) | |||
| 554 | } | 553 | } |
| 555 | 554 | ||
| 556 | hists__collapse_resort(hists, NULL); | 555 | hists__collapse_resort(hists, NULL); |
| 557 | hists__output_resort(hists); | 556 | hists__output_resort(hists, NULL); |
| 558 | } | 557 | } |
| 559 | 558 | ||
| 560 | static void *display_thread_tui(void *arg) | 559 | static void *display_thread_tui(void *arg) |
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/scripts/perl/Perf-Trace-Util/Context.c b/tools/perf/scripts/perl/Perf-Trace-Util/Context.c index 790ceba6ad3f..28431d1bbcf5 100644 --- a/tools/perf/scripts/perl/Perf-Trace-Util/Context.c +++ b/tools/perf/scripts/perl/Perf-Trace-Util/Context.c | |||
| @@ -5,7 +5,10 @@ | |||
| 5 | * ANY CHANGES MADE HERE WILL BE LOST! | 5 | * ANY CHANGES MADE HERE WILL BE LOST! |
| 6 | * | 6 | * |
| 7 | */ | 7 | */ |
| 8 | 8 | #include <stdbool.h> | |
| 9 | #ifndef HAS_BOOL | ||
| 10 | # define HAS_BOOL 1 | ||
| 11 | #endif | ||
| 9 | #line 1 "Context.xs" | 12 | #line 1 "Context.xs" |
| 10 | /* | 13 | /* |
| 11 | * Context.xs. XS interfaces for perf script. | 14 | * Context.xs. XS interfaces for perf script. |
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/tests/hists_cumulate.c b/tools/perf/tests/hists_cumulate.c index 614d5c4978ab..8d110dec393e 100644 --- a/tools/perf/tests/hists_cumulate.c +++ b/tools/perf/tests/hists_cumulate.c | |||
| @@ -187,7 +187,7 @@ static int do_test(struct hists *hists, struct result *expected, size_t nr_expec | |||
| 187 | * function since TEST_ASSERT_VAL() returns in case of failure. | 187 | * function since TEST_ASSERT_VAL() returns in case of failure. |
| 188 | */ | 188 | */ |
| 189 | hists__collapse_resort(hists, NULL); | 189 | hists__collapse_resort(hists, NULL); |
| 190 | hists__output_resort(hists); | 190 | hists__output_resort(hists, NULL); |
| 191 | 191 | ||
| 192 | if (verbose > 2) { | 192 | if (verbose > 2) { |
| 193 | pr_info("use callchain: %d, cumulate callchain: %d\n", | 193 | pr_info("use callchain: %d, cumulate callchain: %d\n", |
| @@ -454,12 +454,12 @@ static int test3(struct perf_evsel *evsel, struct machine *machine) | |||
| 454 | * 30.00% 10.00% perf perf [.] cmd_record | 454 | * 30.00% 10.00% perf perf [.] cmd_record |
| 455 | * 20.00% 0.00% bash libc [.] malloc | 455 | * 20.00% 0.00% bash libc [.] malloc |
| 456 | * 10.00% 10.00% bash [kernel] [k] page_fault | 456 | * 10.00% 10.00% bash [kernel] [k] page_fault |
| 457 | * 10.00% 10.00% perf [kernel] [k] schedule | 457 | * 10.00% 10.00% bash bash [.] xmalloc |
| 458 | * 10.00% 0.00% perf [kernel] [k] sys_perf_event_open | ||
| 459 | * 10.00% 10.00% perf [kernel] [k] page_fault | 458 | * 10.00% 10.00% perf [kernel] [k] page_fault |
| 460 | * 10.00% 10.00% perf libc [.] free | ||
| 461 | * 10.00% 10.00% perf libc [.] malloc | 459 | * 10.00% 10.00% perf libc [.] malloc |
| 462 | * 10.00% 10.00% bash bash [.] xmalloc | 460 | * 10.00% 10.00% perf [kernel] [k] schedule |
| 461 | * 10.00% 10.00% perf libc [.] free | ||
| 462 | * 10.00% 0.00% perf [kernel] [k] sys_perf_event_open | ||
| 463 | */ | 463 | */ |
| 464 | struct result expected[] = { | 464 | struct result expected[] = { |
| 465 | { 7000, 2000, "perf", "perf", "main" }, | 465 | { 7000, 2000, "perf", "perf", "main" }, |
| @@ -468,12 +468,12 @@ static int test3(struct perf_evsel *evsel, struct machine *machine) | |||
| 468 | { 3000, 1000, "perf", "perf", "cmd_record" }, | 468 | { 3000, 1000, "perf", "perf", "cmd_record" }, |
| 469 | { 2000, 0, "bash", "libc", "malloc" }, | 469 | { 2000, 0, "bash", "libc", "malloc" }, |
| 470 | { 1000, 1000, "bash", "[kernel]", "page_fault" }, | 470 | { 1000, 1000, "bash", "[kernel]", "page_fault" }, |
| 471 | { 1000, 1000, "perf", "[kernel]", "schedule" }, | 471 | { 1000, 1000, "bash", "bash", "xmalloc" }, |
| 472 | { 1000, 0, "perf", "[kernel]", "sys_perf_event_open" }, | ||
| 473 | { 1000, 1000, "perf", "[kernel]", "page_fault" }, | 472 | { 1000, 1000, "perf", "[kernel]", "page_fault" }, |
| 473 | { 1000, 1000, "perf", "[kernel]", "schedule" }, | ||
| 474 | { 1000, 1000, "perf", "libc", "free" }, | 474 | { 1000, 1000, "perf", "libc", "free" }, |
| 475 | { 1000, 1000, "perf", "libc", "malloc" }, | 475 | { 1000, 1000, "perf", "libc", "malloc" }, |
| 476 | { 1000, 1000, "bash", "bash", "xmalloc" }, | 476 | { 1000, 0, "perf", "[kernel]", "sys_perf_event_open" }, |
| 477 | }; | 477 | }; |
| 478 | 478 | ||
| 479 | symbol_conf.use_callchain = false; | 479 | symbol_conf.use_callchain = false; |
| @@ -537,10 +537,13 @@ static int test4(struct perf_evsel *evsel, struct machine *machine) | |||
| 537 | * malloc | 537 | * malloc |
| 538 | * main | 538 | * main |
| 539 | * | 539 | * |
| 540 | * 10.00% 10.00% perf [kernel] [k] schedule | 540 | * 10.00% 10.00% bash bash [.] xmalloc |
| 541 | * | | 541 | * | |
| 542 | * --- schedule | 542 | * --- xmalloc |
| 543 | * run_command | 543 | * malloc |
| 544 | * xmalloc <--- NOTE: there's a cycle | ||
| 545 | * malloc | ||
| 546 | * xmalloc | ||
| 544 | * main | 547 | * main |
| 545 | * | 548 | * |
| 546 | * 10.00% 0.00% perf [kernel] [k] sys_perf_event_open | 549 | * 10.00% 0.00% perf [kernel] [k] sys_perf_event_open |
| @@ -556,6 +559,12 @@ static int test4(struct perf_evsel *evsel, struct machine *machine) | |||
| 556 | * run_command | 559 | * run_command |
| 557 | * main | 560 | * main |
| 558 | * | 561 | * |
| 562 | * 10.00% 10.00% perf [kernel] [k] schedule | ||
| 563 | * | | ||
| 564 | * --- schedule | ||
| 565 | * run_command | ||
| 566 | * main | ||
| 567 | * | ||
| 559 | * 10.00% 10.00% perf libc [.] free | 568 | * 10.00% 10.00% perf libc [.] free |
| 560 | * | | 569 | * | |
| 561 | * --- free | 570 | * --- free |
| @@ -570,15 +579,6 @@ static int test4(struct perf_evsel *evsel, struct machine *machine) | |||
| 570 | * run_command | 579 | * run_command |
| 571 | * main | 580 | * main |
| 572 | * | 581 | * |
| 573 | * 10.00% 10.00% bash bash [.] xmalloc | ||
| 574 | * | | ||
| 575 | * --- xmalloc | ||
| 576 | * malloc | ||
| 577 | * xmalloc <--- NOTE: there's a cycle | ||
| 578 | * malloc | ||
| 579 | * xmalloc | ||
| 580 | * main | ||
| 581 | * | ||
| 582 | */ | 582 | */ |
| 583 | struct result expected[] = { | 583 | struct result expected[] = { |
| 584 | { 7000, 2000, "perf", "perf", "main" }, | 584 | { 7000, 2000, "perf", "perf", "main" }, |
| @@ -587,12 +587,12 @@ static int test4(struct perf_evsel *evsel, struct machine *machine) | |||
| 587 | { 3000, 1000, "perf", "perf", "cmd_record" }, | 587 | { 3000, 1000, "perf", "perf", "cmd_record" }, |
| 588 | { 2000, 0, "bash", "libc", "malloc" }, | 588 | { 2000, 0, "bash", "libc", "malloc" }, |
| 589 | { 1000, 1000, "bash", "[kernel]", "page_fault" }, | 589 | { 1000, 1000, "bash", "[kernel]", "page_fault" }, |
| 590 | { 1000, 1000, "perf", "[kernel]", "schedule" }, | 590 | { 1000, 1000, "bash", "bash", "xmalloc" }, |
| 591 | { 1000, 0, "perf", "[kernel]", "sys_perf_event_open" }, | 591 | { 1000, 0, "perf", "[kernel]", "sys_perf_event_open" }, |
| 592 | { 1000, 1000, "perf", "[kernel]", "page_fault" }, | 592 | { 1000, 1000, "perf", "[kernel]", "page_fault" }, |
| 593 | { 1000, 1000, "perf", "[kernel]", "schedule" }, | ||
| 593 | { 1000, 1000, "perf", "libc", "free" }, | 594 | { 1000, 1000, "perf", "libc", "free" }, |
| 594 | { 1000, 1000, "perf", "libc", "malloc" }, | 595 | { 1000, 1000, "perf", "libc", "malloc" }, |
| 595 | { 1000, 1000, "bash", "bash", "xmalloc" }, | ||
| 596 | }; | 596 | }; |
| 597 | struct callchain_result expected_callchain[] = { | 597 | struct callchain_result expected_callchain[] = { |
| 598 | { | 598 | { |
| @@ -622,9 +622,12 @@ static int test4(struct perf_evsel *evsel, struct machine *machine) | |||
| 622 | { "bash", "main" }, }, | 622 | { "bash", "main" }, }, |
| 623 | }, | 623 | }, |
| 624 | { | 624 | { |
| 625 | 3, { { "[kernel]", "schedule" }, | 625 | 6, { { "bash", "xmalloc" }, |
| 626 | { "perf", "run_command" }, | 626 | { "libc", "malloc" }, |
| 627 | { "perf", "main" }, }, | 627 | { "bash", "xmalloc" }, |
| 628 | { "libc", "malloc" }, | ||
| 629 | { "bash", "xmalloc" }, | ||
| 630 | { "bash", "main" }, }, | ||
| 628 | }, | 631 | }, |
| 629 | { | 632 | { |
| 630 | 3, { { "[kernel]", "sys_perf_event_open" }, | 633 | 3, { { "[kernel]", "sys_perf_event_open" }, |
| @@ -638,6 +641,11 @@ static int test4(struct perf_evsel *evsel, struct machine *machine) | |||
| 638 | { "perf", "main" }, }, | 641 | { "perf", "main" }, }, |
| 639 | }, | 642 | }, |
| 640 | { | 643 | { |
| 644 | 3, { { "[kernel]", "schedule" }, | ||
| 645 | { "perf", "run_command" }, | ||
| 646 | { "perf", "main" }, }, | ||
| 647 | }, | ||
| 648 | { | ||
| 641 | 4, { { "libc", "free" }, | 649 | 4, { { "libc", "free" }, |
| 642 | { "perf", "cmd_record" }, | 650 | { "perf", "cmd_record" }, |
| 643 | { "perf", "run_command" }, | 651 | { "perf", "run_command" }, |
| @@ -649,14 +657,6 @@ static int test4(struct perf_evsel *evsel, struct machine *machine) | |||
| 649 | { "perf", "run_command" }, | 657 | { "perf", "run_command" }, |
| 650 | { "perf", "main" }, }, | 658 | { "perf", "main" }, }, |
| 651 | }, | 659 | }, |
| 652 | { | ||
| 653 | 6, { { "bash", "xmalloc" }, | ||
| 654 | { "libc", "malloc" }, | ||
| 655 | { "bash", "xmalloc" }, | ||
| 656 | { "libc", "malloc" }, | ||
| 657 | { "bash", "xmalloc" }, | ||
| 658 | { "bash", "main" }, }, | ||
| 659 | }, | ||
| 660 | }; | 660 | }; |
| 661 | 661 | ||
| 662 | symbol_conf.use_callchain = true; | 662 | symbol_conf.use_callchain = true; |
diff --git a/tools/perf/tests/hists_filter.c b/tools/perf/tests/hists_filter.c index 74f257a81265..59e53db7914c 100644 --- a/tools/perf/tests/hists_filter.c +++ b/tools/perf/tests/hists_filter.c | |||
| @@ -138,7 +138,7 @@ int test__hists_filter(void) | |||
| 138 | struct hists *hists = evsel__hists(evsel); | 138 | struct hists *hists = evsel__hists(evsel); |
| 139 | 139 | ||
| 140 | hists__collapse_resort(hists, NULL); | 140 | hists__collapse_resort(hists, NULL); |
| 141 | hists__output_resort(hists); | 141 | hists__output_resort(hists, NULL); |
| 142 | 142 | ||
| 143 | if (verbose > 2) { | 143 | if (verbose > 2) { |
| 144 | pr_info("Normal histogram\n"); | 144 | pr_info("Normal histogram\n"); |
diff --git a/tools/perf/tests/hists_output.c b/tools/perf/tests/hists_output.c index a748f2be1222..f5547610da02 100644 --- a/tools/perf/tests/hists_output.c +++ b/tools/perf/tests/hists_output.c | |||
| @@ -152,7 +152,7 @@ static int test1(struct perf_evsel *evsel, struct machine *machine) | |||
| 152 | goto out; | 152 | goto out; |
| 153 | 153 | ||
| 154 | hists__collapse_resort(hists, NULL); | 154 | hists__collapse_resort(hists, NULL); |
| 155 | hists__output_resort(hists); | 155 | hists__output_resort(hists, NULL); |
| 156 | 156 | ||
| 157 | if (verbose > 2) { | 157 | if (verbose > 2) { |
| 158 | pr_info("[fields = %s, sort = %s]\n", field_order, sort_order); | 158 | pr_info("[fields = %s, sort = %s]\n", field_order, sort_order); |
| @@ -252,7 +252,7 @@ static int test2(struct perf_evsel *evsel, struct machine *machine) | |||
| 252 | goto out; | 252 | goto out; |
| 253 | 253 | ||
| 254 | hists__collapse_resort(hists, NULL); | 254 | hists__collapse_resort(hists, NULL); |
| 255 | hists__output_resort(hists); | 255 | hists__output_resort(hists, NULL); |
| 256 | 256 | ||
| 257 | if (verbose > 2) { | 257 | if (verbose > 2) { |
| 258 | pr_info("[fields = %s, sort = %s]\n", field_order, sort_order); | 258 | pr_info("[fields = %s, sort = %s]\n", field_order, sort_order); |
| @@ -306,7 +306,7 @@ static int test3(struct perf_evsel *evsel, struct machine *machine) | |||
| 306 | goto out; | 306 | goto out; |
| 307 | 307 | ||
| 308 | hists__collapse_resort(hists, NULL); | 308 | hists__collapse_resort(hists, NULL); |
| 309 | hists__output_resort(hists); | 309 | hists__output_resort(hists, NULL); |
| 310 | 310 | ||
| 311 | if (verbose > 2) { | 311 | if (verbose > 2) { |
| 312 | pr_info("[fields = %s, sort = %s]\n", field_order, sort_order); | 312 | pr_info("[fields = %s, sort = %s]\n", field_order, sort_order); |
| @@ -384,7 +384,7 @@ static int test4(struct perf_evsel *evsel, struct machine *machine) | |||
| 384 | goto out; | 384 | goto out; |
| 385 | 385 | ||
| 386 | hists__collapse_resort(hists, NULL); | 386 | hists__collapse_resort(hists, NULL); |
| 387 | hists__output_resort(hists); | 387 | hists__output_resort(hists, NULL); |
| 388 | 388 | ||
| 389 | if (verbose > 2) { | 389 | if (verbose > 2) { |
| 390 | pr_info("[fields = %s, sort = %s]\n", field_order, sort_order); | 390 | pr_info("[fields = %s, sort = %s]\n", field_order, sort_order); |
| @@ -487,7 +487,7 @@ static int test5(struct perf_evsel *evsel, struct machine *machine) | |||
| 487 | goto out; | 487 | goto out; |
| 488 | 488 | ||
| 489 | hists__collapse_resort(hists, NULL); | 489 | hists__collapse_resort(hists, NULL); |
| 490 | hists__output_resort(hists); | 490 | hists__output_resort(hists, NULL); |
| 491 | 491 | ||
| 492 | if (verbose > 2) { | 492 | if (verbose > 2) { |
| 493 | pr_info("[fields = %s, sort = %s]\n", field_order, sort_order); | 493 | pr_info("[fields = %s, sort = %s]\n", field_order, sort_order); |
diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c index e6bb04b5b09b..788506eef567 100644 --- a/tools/perf/ui/browsers/hists.c +++ b/tools/perf/ui/browsers/hists.c | |||
| @@ -550,7 +550,7 @@ static int hist_browser__show_callchain(struct hist_browser *browser, | |||
| 550 | bool need_percent; | 550 | bool need_percent; |
| 551 | 551 | ||
| 552 | node = rb_first(root); | 552 | node = rb_first(root); |
| 553 | need_percent = !!rb_next(node); | 553 | need_percent = node && rb_next(node); |
| 554 | 554 | ||
| 555 | while (node) { | 555 | while (node) { |
| 556 | struct callchain_node *child = rb_entry(node, struct callchain_node, rb_node); | 556 | struct callchain_node *child = rb_entry(node, struct callchain_node, rb_node); |
diff --git a/tools/perf/ui/hist.c b/tools/perf/ui/hist.c index dc0d095f318c..482adae3cc44 100644 --- a/tools/perf/ui/hist.c +++ b/tools/perf/ui/hist.c | |||
| @@ -204,6 +204,9 @@ static int __hpp__sort_acc(struct hist_entry *a, struct hist_entry *b, | |||
| 204 | if (ret) | 204 | if (ret) |
| 205 | return ret; | 205 | return ret; |
| 206 | 206 | ||
| 207 | if (a->thread != b->thread || !symbol_conf.use_callchain) | ||
| 208 | return 0; | ||
| 209 | |||
| 207 | ret = b->callchain->max_depth - a->callchain->max_depth; | 210 | ret = b->callchain->max_depth - a->callchain->max_depth; |
| 208 | } | 211 | } |
| 209 | return ret; | 212 | return ret; |
diff --git a/tools/perf/ui/tui/setup.c b/tools/perf/ui/tui/setup.c index 2f612562978c..3c38f25b1695 100644 --- a/tools/perf/ui/tui/setup.c +++ b/tools/perf/ui/tui/setup.c | |||
| @@ -1,5 +1,8 @@ | |||
| 1 | #include <signal.h> | 1 | #include <signal.h> |
| 2 | #include <stdbool.h> | 2 | #include <stdbool.h> |
| 3 | #ifdef HAVE_BACKTRACE_SUPPORT | ||
| 4 | #include <execinfo.h> | ||
| 5 | #endif | ||
| 3 | 6 | ||
| 4 | #include "../../util/cache.h" | 7 | #include "../../util/cache.h" |
| 5 | #include "../../util/debug.h" | 8 | #include "../../util/debug.h" |
| @@ -88,6 +91,25 @@ int ui__getch(int delay_secs) | |||
| 88 | return SLkp_getkey(); | 91 | return SLkp_getkey(); |
| 89 | } | 92 | } |
| 90 | 93 | ||
| 94 | #ifdef HAVE_BACKTRACE_SUPPORT | ||
| 95 | static void ui__signal_backtrace(int sig) | ||
| 96 | { | ||
| 97 | void *stackdump[32]; | ||
| 98 | size_t size; | ||
| 99 | |||
| 100 | ui__exit(false); | ||
| 101 | psignal(sig, "perf"); | ||
| 102 | |||
| 103 | printf("-------- backtrace --------\n"); | ||
| 104 | size = backtrace(stackdump, ARRAY_SIZE(stackdump)); | ||
| 105 | backtrace_symbols_fd(stackdump, size, STDOUT_FILENO); | ||
| 106 | |||
| 107 | exit(0); | ||
| 108 | } | ||
| 109 | #else | ||
| 110 | # define ui__signal_backtrace ui__signal | ||
| 111 | #endif | ||
| 112 | |||
| 91 | static void ui__signal(int sig) | 113 | static void ui__signal(int sig) |
| 92 | { | 114 | { |
| 93 | ui__exit(false); | 115 | ui__exit(false); |
| @@ -122,8 +144,8 @@ int ui__init(void) | |||
| 122 | ui_browser__init(); | 144 | ui_browser__init(); |
| 123 | tui_progress__init(); | 145 | tui_progress__init(); |
| 124 | 146 | ||
| 125 | signal(SIGSEGV, ui__signal); | 147 | signal(SIGSEGV, ui__signal_backtrace); |
| 126 | signal(SIGFPE, ui__signal); | 148 | signal(SIGFPE, ui__signal_backtrace); |
| 127 | signal(SIGINT, ui__signal); | 149 | signal(SIGINT, ui__signal); |
| 128 | signal(SIGQUIT, ui__signal); | 150 | signal(SIGQUIT, ui__signal); |
| 129 | signal(SIGTERM, ui__signal); | 151 | signal(SIGTERM, ui__signal); |
diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c index 79999ceaf2be..01bc4e23a2cf 100644 --- a/tools/perf/util/annotate.c +++ b/tools/perf/util/annotate.c | |||
| @@ -177,14 +177,17 @@ static int lock__parse(struct ins_operands *ops) | |||
| 177 | goto out_free_ops; | 177 | goto out_free_ops; |
| 178 | 178 | ||
| 179 | ops->locked.ins = ins__find(name); | 179 | ops->locked.ins = ins__find(name); |
| 180 | free(name); | ||
| 181 | |||
| 180 | if (ops->locked.ins == NULL) | 182 | if (ops->locked.ins == NULL) |
| 181 | goto out_free_ops; | 183 | goto out_free_ops; |
| 182 | 184 | ||
| 183 | if (!ops->locked.ins->ops) | 185 | if (!ops->locked.ins->ops) |
| 184 | return 0; | 186 | return 0; |
| 185 | 187 | ||
| 186 | if (ops->locked.ins->ops->parse) | 188 | if (ops->locked.ins->ops->parse && |
| 187 | ops->locked.ins->ops->parse(ops->locked.ops); | 189 | ops->locked.ins->ops->parse(ops->locked.ops) < 0) |
| 190 | goto out_free_ops; | ||
| 188 | 191 | ||
| 189 | return 0; | 192 | return 0; |
| 190 | 193 | ||
| @@ -208,6 +211,13 @@ static int lock__scnprintf(struct ins *ins, char *bf, size_t size, | |||
| 208 | 211 | ||
| 209 | static void lock__delete(struct ins_operands *ops) | 212 | static void lock__delete(struct ins_operands *ops) |
| 210 | { | 213 | { |
| 214 | struct ins *ins = ops->locked.ins; | ||
| 215 | |||
| 216 | if (ins && ins->ops->free) | ||
| 217 | ins->ops->free(ops->locked.ops); | ||
| 218 | else | ||
| 219 | ins__delete(ops->locked.ops); | ||
| 220 | |||
| 211 | zfree(&ops->locked.ops); | 221 | zfree(&ops->locked.ops); |
| 212 | zfree(&ops->target.raw); | 222 | zfree(&ops->target.raw); |
| 213 | zfree(&ops->target.name); | 223 | zfree(&ops->target.name); |
| @@ -531,8 +541,8 @@ static void disasm_line__init_ins(struct disasm_line *dl) | |||
| 531 | if (!dl->ins->ops) | 541 | if (!dl->ins->ops) |
| 532 | return; | 542 | return; |
| 533 | 543 | ||
| 534 | if (dl->ins->ops->parse) | 544 | if (dl->ins->ops->parse && dl->ins->ops->parse(&dl->ops) < 0) |
| 535 | dl->ins->ops->parse(&dl->ops); | 545 | dl->ins = NULL; |
| 536 | } | 546 | } |
| 537 | 547 | ||
| 538 | static int disasm_line__parse(char *line, char **namep, char **rawp) | 548 | static int disasm_line__parse(char *line, char **namep, char **rawp) |
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/callchain.c b/tools/perf/util/callchain.c index 64b377e591e4..14e7a123d43b 100644 --- a/tools/perf/util/callchain.c +++ b/tools/perf/util/callchain.c | |||
| @@ -841,3 +841,33 @@ char *callchain_list__sym_name(struct callchain_list *cl, | |||
| 841 | 841 | ||
| 842 | return bf; | 842 | return bf; |
| 843 | } | 843 | } |
| 844 | |||
| 845 | static void free_callchain_node(struct callchain_node *node) | ||
| 846 | { | ||
| 847 | struct callchain_list *list, *tmp; | ||
| 848 | struct callchain_node *child; | ||
| 849 | struct rb_node *n; | ||
| 850 | |||
| 851 | list_for_each_entry_safe(list, tmp, &node->val, list) { | ||
| 852 | list_del(&list->list); | ||
| 853 | free(list); | ||
| 854 | } | ||
| 855 | |||
| 856 | n = rb_first(&node->rb_root_in); | ||
| 857 | while (n) { | ||
| 858 | child = container_of(n, struct callchain_node, rb_node_in); | ||
| 859 | n = rb_next(n); | ||
| 860 | rb_erase(&child->rb_node_in, &node->rb_root_in); | ||
| 861 | |||
| 862 | free_callchain_node(child); | ||
| 863 | free(child); | ||
| 864 | } | ||
| 865 | } | ||
| 866 | |||
| 867 | void free_callchain(struct callchain_root *root) | ||
| 868 | { | ||
| 869 | if (!symbol_conf.use_callchain) | ||
| 870 | return; | ||
| 871 | |||
| 872 | free_callchain_node(&root->node); | ||
| 873 | } | ||
diff --git a/tools/perf/util/callchain.h b/tools/perf/util/callchain.h index dbc08cf5f970..c0ec1acc38e4 100644 --- a/tools/perf/util/callchain.h +++ b/tools/perf/util/callchain.h | |||
| @@ -198,4 +198,6 @@ static inline int arch_skip_callchain_idx(struct thread *thread __maybe_unused, | |||
| 198 | char *callchain_list__sym_name(struct callchain_list *cl, | 198 | char *callchain_list__sym_name(struct callchain_list *cl, |
| 199 | char *bf, size_t bfsize, bool show_dso); | 199 | char *bf, size_t bfsize, bool show_dso); |
| 200 | 200 | ||
| 201 | void free_callchain(struct callchain_root *root); | ||
| 202 | |||
| 201 | #endif /* __PERF_CALLCHAIN_H */ | 203 | #endif /* __PERF_CALLCHAIN_H */ |
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index cbab1fb77b1d..2e507b5025a3 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c | |||
| @@ -1445,7 +1445,7 @@ int perf_evlist__strerror_tp(struct perf_evlist *evlist __maybe_unused, | |||
| 1445 | case ENOENT: | 1445 | case ENOENT: |
| 1446 | scnprintf(buf, size, "%s", | 1446 | scnprintf(buf, size, "%s", |
| 1447 | "Error:\tUnable to find debugfs\n" | 1447 | "Error:\tUnable to find debugfs\n" |
| 1448 | "Hint:\tWas your kernel was compiled with debugfs support?\n" | 1448 | "Hint:\tWas your kernel compiled with debugfs support?\n" |
| 1449 | "Hint:\tIs the debugfs filesystem mounted?\n" | 1449 | "Hint:\tIs the debugfs filesystem mounted?\n" |
| 1450 | "Hint:\tTry 'sudo mount -t debugfs nodev /sys/kernel/debug'"); | 1450 | "Hint:\tTry 'sudo mount -t debugfs nodev /sys/kernel/debug'"); |
| 1451 | break; | 1451 | break; |
diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c index 6e88b9e395df..182395546ddc 100644 --- a/tools/perf/util/hist.c +++ b/tools/perf/util/hist.c | |||
| @@ -6,6 +6,7 @@ | |||
| 6 | #include "evlist.h" | 6 | #include "evlist.h" |
| 7 | #include "evsel.h" | 7 | #include "evsel.h" |
| 8 | #include "annotate.h" | 8 | #include "annotate.h" |
| 9 | #include "ui/progress.h" | ||
| 9 | #include <math.h> | 10 | #include <math.h> |
| 10 | 11 | ||
| 11 | static bool hists__filter_entry_by_dso(struct hists *hists, | 12 | static bool hists__filter_entry_by_dso(struct hists *hists, |
| @@ -303,7 +304,7 @@ static struct hist_entry *hist_entry__new(struct hist_entry *template, | |||
| 303 | size_t callchain_size = 0; | 304 | size_t callchain_size = 0; |
| 304 | struct hist_entry *he; | 305 | struct hist_entry *he; |
| 305 | 306 | ||
| 306 | if (symbol_conf.use_callchain || symbol_conf.cumulate_callchain) | 307 | if (symbol_conf.use_callchain) |
| 307 | callchain_size = sizeof(struct callchain_root); | 308 | callchain_size = sizeof(struct callchain_root); |
| 308 | 309 | ||
| 309 | he = zalloc(sizeof(*he) + callchain_size); | 310 | he = zalloc(sizeof(*he) + callchain_size); |
| @@ -736,7 +737,7 @@ iter_add_single_cumulative_entry(struct hist_entry_iter *iter, | |||
| 736 | iter->he = he; | 737 | iter->he = he; |
| 737 | he_cache[iter->curr++] = he; | 738 | he_cache[iter->curr++] = he; |
| 738 | 739 | ||
| 739 | callchain_append(he->callchain, &callchain_cursor, sample->period); | 740 | hist_entry__append_callchain(he, sample); |
| 740 | 741 | ||
| 741 | /* | 742 | /* |
| 742 | * We need to re-initialize the cursor since callchain_append() | 743 | * We need to re-initialize the cursor since callchain_append() |
| @@ -809,7 +810,8 @@ iter_add_next_cumulative_entry(struct hist_entry_iter *iter, | |||
| 809 | iter->he = he; | 810 | iter->he = he; |
| 810 | he_cache[iter->curr++] = he; | 811 | he_cache[iter->curr++] = he; |
| 811 | 812 | ||
| 812 | callchain_append(he->callchain, &cursor, sample->period); | 813 | if (symbol_conf.use_callchain) |
| 814 | callchain_append(he->callchain, &cursor, sample->period); | ||
| 813 | return 0; | 815 | return 0; |
| 814 | } | 816 | } |
| 815 | 817 | ||
| @@ -945,6 +947,7 @@ void hist_entry__free(struct hist_entry *he) | |||
| 945 | zfree(&he->mem_info); | 947 | zfree(&he->mem_info); |
| 946 | zfree(&he->stat_acc); | 948 | zfree(&he->stat_acc); |
| 947 | free_srcline(he->srcline); | 949 | free_srcline(he->srcline); |
| 950 | free_callchain(he->callchain); | ||
| 948 | free(he); | 951 | free(he); |
| 949 | } | 952 | } |
| 950 | 953 | ||
| @@ -987,6 +990,7 @@ static bool hists__collapse_insert_entry(struct hists *hists __maybe_unused, | |||
| 987 | else | 990 | else |
| 988 | p = &(*p)->rb_right; | 991 | p = &(*p)->rb_right; |
| 989 | } | 992 | } |
| 993 | hists->nr_entries++; | ||
| 990 | 994 | ||
| 991 | rb_link_node(&he->rb_node_in, parent, p); | 995 | rb_link_node(&he->rb_node_in, parent, p); |
| 992 | rb_insert_color(&he->rb_node_in, root); | 996 | rb_insert_color(&he->rb_node_in, root); |
| @@ -1024,7 +1028,10 @@ void hists__collapse_resort(struct hists *hists, struct ui_progress *prog) | |||
| 1024 | if (!sort__need_collapse) | 1028 | if (!sort__need_collapse) |
| 1025 | return; | 1029 | return; |
| 1026 | 1030 | ||
| 1031 | hists->nr_entries = 0; | ||
| 1032 | |||
| 1027 | root = hists__get_rotate_entries_in(hists); | 1033 | root = hists__get_rotate_entries_in(hists); |
| 1034 | |||
| 1028 | next = rb_first(root); | 1035 | next = rb_first(root); |
| 1029 | 1036 | ||
| 1030 | while (next) { | 1037 | while (next) { |
| @@ -1119,7 +1126,7 @@ static void __hists__insert_output_entry(struct rb_root *entries, | |||
| 1119 | rb_insert_color(&he->rb_node, entries); | 1126 | rb_insert_color(&he->rb_node, entries); |
| 1120 | } | 1127 | } |
| 1121 | 1128 | ||
| 1122 | void hists__output_resort(struct hists *hists) | 1129 | void hists__output_resort(struct hists *hists, struct ui_progress *prog) |
| 1123 | { | 1130 | { |
| 1124 | struct rb_root *root; | 1131 | struct rb_root *root; |
| 1125 | struct rb_node *next; | 1132 | struct rb_node *next; |
| @@ -1148,6 +1155,9 @@ void hists__output_resort(struct hists *hists) | |||
| 1148 | 1155 | ||
| 1149 | if (!n->filtered) | 1156 | if (!n->filtered) |
| 1150 | hists__calc_col_len(hists, n); | 1157 | hists__calc_col_len(hists, n); |
| 1158 | |||
| 1159 | if (prog) | ||
| 1160 | ui_progress__update(prog, 1); | ||
| 1151 | } | 1161 | } |
| 1152 | } | 1162 | } |
| 1153 | 1163 | ||
diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h index d0ef9a19a744..46bd50344f85 100644 --- a/tools/perf/util/hist.h +++ b/tools/perf/util/hist.h | |||
| @@ -121,7 +121,7 @@ int hist_entry__sort_snprintf(struct hist_entry *he, char *bf, size_t size, | |||
| 121 | struct hists *hists); | 121 | struct hists *hists); |
| 122 | void hist_entry__free(struct hist_entry *); | 122 | void hist_entry__free(struct hist_entry *); |
| 123 | 123 | ||
| 124 | void hists__output_resort(struct hists *hists); | 124 | void hists__output_resort(struct hists *hists, struct ui_progress *prog); |
| 125 | void hists__collapse_resort(struct hists *hists, struct ui_progress *prog); | 125 | void hists__collapse_resort(struct hists *hists, struct ui_progress *prog); |
| 126 | 126 | ||
| 127 | void hists__decay_entries(struct hists *hists, bool zap_user, bool zap_kernel); | 127 | void hists__decay_entries(struct hists *hists, bool zap_user, bool zap_kernel); |
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/map.h b/tools/perf/util/map.h index 6951a9d42339..0e42438b1e59 100644 --- a/tools/perf/util/map.h +++ b/tools/perf/util/map.h | |||
| @@ -116,6 +116,22 @@ struct thread; | |||
| 116 | #define map__for_each_symbol(map, pos, n) \ | 116 | #define map__for_each_symbol(map, pos, n) \ |
| 117 | dso__for_each_symbol(map->dso, pos, n, map->type) | 117 | dso__for_each_symbol(map->dso, pos, n, map->type) |
| 118 | 118 | ||
| 119 | /* map__for_each_symbol_with_name - iterate over the symbols in the given map | ||
| 120 | * that have the given name | ||
| 121 | * | ||
| 122 | * @map: the 'struct map *' in which symbols itereated | ||
| 123 | * @sym_name: the symbol name | ||
| 124 | * @pos: the 'struct symbol *' to use as a loop cursor | ||
| 125 | * @filter: to use when loading the DSO | ||
| 126 | */ | ||
| 127 | #define __map__for_each_symbol_by_name(map, sym_name, pos, filter) \ | ||
| 128 | for (pos = map__find_symbol_by_name(map, sym_name, filter); \ | ||
| 129 | pos && strcmp(pos->name, sym_name) == 0; \ | ||
| 130 | pos = symbol__next_by_name(pos)) | ||
| 131 | |||
| 132 | #define map__for_each_symbol_by_name(map, sym_name, pos) \ | ||
| 133 | __map__for_each_symbol_by_name(map, sym_name, (pos), NULL) | ||
| 134 | |||
| 119 | typedef int (*symbol_filter_t)(struct map *map, struct symbol *sym); | 135 | typedef int (*symbol_filter_t)(struct map *map, struct symbol *sym); |
| 120 | 136 | ||
| 121 | void map__init(struct map *map, enum map_type type, | 137 | void map__init(struct map *map, enum map_type type, |
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c index 28eb1417cb2a..919937eb0be2 100644 --- a/tools/perf/util/probe-event.c +++ b/tools/perf/util/probe-event.c | |||
| @@ -446,7 +446,7 @@ static int post_process_probe_trace_events(struct probe_trace_event *tevs, | |||
| 446 | } | 446 | } |
| 447 | 447 | ||
| 448 | for (i = 0; i < ntevs; i++) { | 448 | for (i = 0; i < ntevs; i++) { |
| 449 | if (tevs[i].point.address) { | 449 | if (tevs[i].point.address && !tevs[i].point.retprobe) { |
| 450 | tmp = strdup(reloc_sym->name); | 450 | tmp = strdup(reloc_sym->name); |
| 451 | if (!tmp) | 451 | if (!tmp) |
| 452 | return -ENOMEM; | 452 | return -ENOMEM; |
| @@ -495,9 +495,11 @@ static int try_to_find_probe_trace_events(struct perf_probe_event *pev, | |||
| 495 | } | 495 | } |
| 496 | 496 | ||
| 497 | if (ntevs == 0) { /* No error but failed to find probe point. */ | 497 | if (ntevs == 0) { /* No error but failed to find probe point. */ |
| 498 | pr_warning("Probe point '%s' not found.\n", | 498 | pr_warning("Probe point '%s' not found in debuginfo.\n", |
| 499 | synthesize_perf_probe_point(&pev->point)); | 499 | synthesize_perf_probe_point(&pev->point)); |
| 500 | return -ENOENT; | 500 | if (need_dwarf) |
| 501 | return -ENOENT; | ||
| 502 | return 0; | ||
| 501 | } | 503 | } |
| 502 | /* Error path : ntevs < 0 */ | 504 | /* Error path : ntevs < 0 */ |
| 503 | pr_debug("An error occurred in debuginfo analysis (%d).\n", ntevs); | 505 | pr_debug("An error occurred in debuginfo analysis (%d).\n", ntevs); |
| @@ -2050,9 +2052,11 @@ static int write_probe_trace_event(int fd, struct probe_trace_event *tev) | |||
| 2050 | pr_debug("Writing event: %s\n", buf); | 2052 | pr_debug("Writing event: %s\n", buf); |
| 2051 | if (!probe_event_dry_run) { | 2053 | if (!probe_event_dry_run) { |
| 2052 | ret = write(fd, buf, strlen(buf)); | 2054 | ret = write(fd, buf, strlen(buf)); |
| 2053 | if (ret <= 0) | 2055 | if (ret <= 0) { |
| 2056 | ret = -errno; | ||
| 2054 | pr_warning("Failed to write event: %s\n", | 2057 | pr_warning("Failed to write event: %s\n", |
| 2055 | strerror_r(errno, sbuf, sizeof(sbuf))); | 2058 | strerror_r(errno, sbuf, sizeof(sbuf))); |
| 2059 | } | ||
| 2056 | } | 2060 | } |
| 2057 | free(buf); | 2061 | free(buf); |
| 2058 | return ret; | 2062 | return ret; |
| @@ -2189,18 +2193,17 @@ static int __add_probe_trace_events(struct perf_probe_event *pev, | |||
| 2189 | return ret; | 2193 | return ret; |
| 2190 | } | 2194 | } |
| 2191 | 2195 | ||
| 2192 | static char *looking_function_name; | 2196 | static int find_probe_functions(struct map *map, char *name) |
| 2193 | static int num_matched_functions; | ||
| 2194 | |||
| 2195 | static int probe_function_filter(struct map *map __maybe_unused, | ||
| 2196 | struct symbol *sym) | ||
| 2197 | { | 2197 | { |
| 2198 | if ((sym->binding == STB_GLOBAL || sym->binding == STB_LOCAL) && | 2198 | int found = 0; |
| 2199 | strcmp(looking_function_name, sym->name) == 0) { | 2199 | struct symbol *sym; |
| 2200 | num_matched_functions++; | 2200 | |
| 2201 | return 0; | 2201 | map__for_each_symbol_by_name(map, name, sym) { |
| 2202 | if (sym->binding == STB_GLOBAL || sym->binding == STB_LOCAL) | ||
| 2203 | found++; | ||
| 2202 | } | 2204 | } |
| 2203 | return 1; | 2205 | |
| 2206 | return found; | ||
| 2204 | } | 2207 | } |
| 2205 | 2208 | ||
| 2206 | #define strdup_or_goto(str, label) \ | 2209 | #define strdup_or_goto(str, label) \ |
| @@ -2218,10 +2221,10 @@ static int find_probe_trace_events_from_map(struct perf_probe_event *pev, | |||
| 2218 | struct kmap *kmap = NULL; | 2221 | struct kmap *kmap = NULL; |
| 2219 | struct ref_reloc_sym *reloc_sym = NULL; | 2222 | struct ref_reloc_sym *reloc_sym = NULL; |
| 2220 | struct symbol *sym; | 2223 | struct symbol *sym; |
| 2221 | struct rb_node *nd; | ||
| 2222 | struct probe_trace_event *tev; | 2224 | struct probe_trace_event *tev; |
| 2223 | struct perf_probe_point *pp = &pev->point; | 2225 | struct perf_probe_point *pp = &pev->point; |
| 2224 | struct probe_trace_point *tp; | 2226 | struct probe_trace_point *tp; |
| 2227 | int num_matched_functions; | ||
| 2225 | int ret, i; | 2228 | int ret, i; |
| 2226 | 2229 | ||
| 2227 | /* Init maps of given executable or kernel */ | 2230 | /* Init maps of given executable or kernel */ |
| @@ -2238,10 +2241,8 @@ static int find_probe_trace_events_from_map(struct perf_probe_event *pev, | |||
| 2238 | * Load matched symbols: Since the different local symbols may have | 2241 | * Load matched symbols: Since the different local symbols may have |
| 2239 | * same name but different addresses, this lists all the symbols. | 2242 | * same name but different addresses, this lists all the symbols. |
| 2240 | */ | 2243 | */ |
| 2241 | num_matched_functions = 0; | 2244 | num_matched_functions = find_probe_functions(map, pp->function); |
| 2242 | looking_function_name = pp->function; | 2245 | if (num_matched_functions == 0) { |
| 2243 | ret = map__load(map, probe_function_filter); | ||
| 2244 | if (ret || num_matched_functions == 0) { | ||
| 2245 | pr_err("Failed to find symbol %s in %s\n", pp->function, | 2246 | pr_err("Failed to find symbol %s in %s\n", pp->function, |
| 2246 | target ? : "kernel"); | 2247 | target ? : "kernel"); |
| 2247 | ret = -ENOENT; | 2248 | ret = -ENOENT; |
| @@ -2253,7 +2254,7 @@ static int find_probe_trace_events_from_map(struct perf_probe_event *pev, | |||
| 2253 | goto out; | 2254 | goto out; |
| 2254 | } | 2255 | } |
| 2255 | 2256 | ||
| 2256 | if (!pev->uprobes) { | 2257 | if (!pev->uprobes && !pp->retprobe) { |
| 2257 | kmap = map__kmap(map); | 2258 | kmap = map__kmap(map); |
| 2258 | reloc_sym = kmap->ref_reloc_sym; | 2259 | reloc_sym = kmap->ref_reloc_sym; |
| 2259 | if (!reloc_sym) { | 2260 | if (!reloc_sym) { |
| @@ -2271,7 +2272,8 @@ static int find_probe_trace_events_from_map(struct perf_probe_event *pev, | |||
| 2271 | } | 2272 | } |
| 2272 | 2273 | ||
| 2273 | ret = 0; | 2274 | ret = 0; |
| 2274 | map__for_each_symbol(map, sym, nd) { | 2275 | |
| 2276 | map__for_each_symbol_by_name(map, pp->function, sym) { | ||
| 2275 | tev = (*tevs) + ret; | 2277 | tev = (*tevs) + ret; |
| 2276 | tp = &tev->point; | 2278 | tp = &tev->point; |
| 2277 | if (ret == num_matched_functions) { | 2279 | if (ret == num_matched_functions) { |
diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c index c7918f83b300..b5247d777f0e 100644 --- a/tools/perf/util/probe-finder.c +++ b/tools/perf/util/probe-finder.c | |||
| @@ -989,8 +989,24 @@ static int debuginfo__find_probes(struct debuginfo *dbg, | |||
| 989 | int ret = 0; | 989 | int ret = 0; |
| 990 | 990 | ||
| 991 | #if _ELFUTILS_PREREQ(0, 142) | 991 | #if _ELFUTILS_PREREQ(0, 142) |
| 992 | Elf *elf; | ||
| 993 | GElf_Ehdr ehdr; | ||
| 994 | GElf_Shdr shdr; | ||
| 995 | |||
| 992 | /* Get the call frame information from this dwarf */ | 996 | /* Get the call frame information from this dwarf */ |
| 993 | pf->cfi = dwarf_getcfi_elf(dwarf_getelf(dbg->dbg)); | 997 | elf = dwarf_getelf(dbg->dbg); |
| 998 | if (elf == NULL) | ||
| 999 | return -EINVAL; | ||
| 1000 | |||
| 1001 | if (gelf_getehdr(elf, &ehdr) == NULL) | ||
| 1002 | return -EINVAL; | ||
| 1003 | |||
| 1004 | if (elf_section_by_name(elf, &ehdr, &shdr, ".eh_frame", NULL) && | ||
| 1005 | shdr.sh_type == SHT_PROGBITS) { | ||
| 1006 | pf->cfi = dwarf_getcfi_elf(elf); | ||
| 1007 | } else { | ||
| 1008 | pf->cfi = dwarf_getcfi(dbg->dbg); | ||
| 1009 | } | ||
| 994 | #endif | 1010 | #endif |
| 995 | 1011 | ||
| 996 | off = 0; | 1012 | off = 0; |
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/symbol.c b/tools/perf/util/symbol.c index c24c5b83156c..a194702a0a2f 100644 --- a/tools/perf/util/symbol.c +++ b/tools/perf/util/symbol.c | |||
| @@ -396,6 +396,7 @@ static struct symbol *symbols__find_by_name(struct rb_root *symbols, | |||
| 396 | const char *name) | 396 | const char *name) |
| 397 | { | 397 | { |
| 398 | struct rb_node *n; | 398 | struct rb_node *n; |
| 399 | struct symbol_name_rb_node *s; | ||
| 399 | 400 | ||
| 400 | if (symbols == NULL) | 401 | if (symbols == NULL) |
| 401 | return NULL; | 402 | return NULL; |
| @@ -403,7 +404,6 @@ static struct symbol *symbols__find_by_name(struct rb_root *symbols, | |||
| 403 | n = symbols->rb_node; | 404 | n = symbols->rb_node; |
| 404 | 405 | ||
| 405 | while (n) { | 406 | while (n) { |
| 406 | struct symbol_name_rb_node *s; | ||
| 407 | int cmp; | 407 | int cmp; |
| 408 | 408 | ||
| 409 | s = rb_entry(n, struct symbol_name_rb_node, rb_node); | 409 | s = rb_entry(n, struct symbol_name_rb_node, rb_node); |
| @@ -414,10 +414,24 @@ static struct symbol *symbols__find_by_name(struct rb_root *symbols, | |||
| 414 | else if (cmp > 0) | 414 | else if (cmp > 0) |
| 415 | n = n->rb_right; | 415 | n = n->rb_right; |
| 416 | else | 416 | else |
| 417 | return &s->sym; | 417 | break; |
| 418 | } | 418 | } |
| 419 | 419 | ||
| 420 | return NULL; | 420 | if (n == NULL) |
| 421 | return NULL; | ||
| 422 | |||
| 423 | /* return first symbol that has same name (if any) */ | ||
| 424 | for (n = rb_prev(n); n; n = rb_prev(n)) { | ||
| 425 | struct symbol_name_rb_node *tmp; | ||
| 426 | |||
| 427 | tmp = rb_entry(n, struct symbol_name_rb_node, rb_node); | ||
| 428 | if (strcmp(tmp->sym.name, s->sym.name)) | ||
| 429 | break; | ||
| 430 | |||
| 431 | s = tmp; | ||
| 432 | } | ||
| 433 | |||
| 434 | return &s->sym; | ||
| 421 | } | 435 | } |
| 422 | 436 | ||
| 423 | struct symbol *dso__find_symbol(struct dso *dso, | 437 | struct symbol *dso__find_symbol(struct dso *dso, |
| @@ -436,6 +450,17 @@ struct symbol *dso__next_symbol(struct symbol *sym) | |||
| 436 | return symbols__next(sym); | 450 | return symbols__next(sym); |
| 437 | } | 451 | } |
| 438 | 452 | ||
| 453 | struct symbol *symbol__next_by_name(struct symbol *sym) | ||
| 454 | { | ||
| 455 | struct symbol_name_rb_node *s = container_of(sym, struct symbol_name_rb_node, sym); | ||
| 456 | struct rb_node *n = rb_next(&s->rb_node); | ||
| 457 | |||
| 458 | return n ? &rb_entry(n, struct symbol_name_rb_node, rb_node)->sym : NULL; | ||
| 459 | } | ||
| 460 | |||
| 461 | /* | ||
| 462 | * Teturns first symbol that matched with @name. | ||
| 463 | */ | ||
| 439 | struct symbol *dso__find_symbol_by_name(struct dso *dso, enum map_type type, | 464 | struct symbol *dso__find_symbol_by_name(struct dso *dso, enum map_type type, |
| 440 | const char *name) | 465 | const char *name) |
| 441 | { | 466 | { |
diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h index 9d602e9c6f59..1650dcb3a67b 100644 --- a/tools/perf/util/symbol.h +++ b/tools/perf/util/symbol.h | |||
| @@ -231,6 +231,7 @@ struct symbol *dso__find_symbol(struct dso *dso, enum map_type type, | |||
| 231 | u64 addr); | 231 | u64 addr); |
| 232 | struct symbol *dso__find_symbol_by_name(struct dso *dso, enum map_type type, | 232 | struct symbol *dso__find_symbol_by_name(struct dso *dso, enum map_type type, |
| 233 | const char *name); | 233 | const char *name); |
| 234 | struct symbol *symbol__next_by_name(struct symbol *sym); | ||
| 234 | 235 | ||
| 235 | struct symbol *dso__first_symbol(struct dso *dso, enum map_type type); | 236 | struct symbol *dso__first_symbol(struct dso *dso, enum map_type type); |
| 236 | struct symbol *dso__next_symbol(struct symbol *sym); | 237 | struct symbol *dso__next_symbol(struct symbol *sym); |
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); |
diff --git a/tools/testing/selftests/exec/execveat.c b/tools/testing/selftests/exec/execveat.c index d273624c93a6..e238c9559caf 100644 --- a/tools/testing/selftests/exec/execveat.c +++ b/tools/testing/selftests/exec/execveat.c | |||
| @@ -62,7 +62,7 @@ static int _check_execveat_fail(int fd, const char *path, int flags, | |||
| 62 | } | 62 | } |
| 63 | 63 | ||
| 64 | static int check_execveat_invoked_rc(int fd, const char *path, int flags, | 64 | static int check_execveat_invoked_rc(int fd, const char *path, int flags, |
| 65 | int expected_rc) | 65 | int expected_rc, int expected_rc2) |
| 66 | { | 66 | { |
| 67 | int status; | 67 | int status; |
| 68 | int rc; | 68 | int rc; |
| @@ -98,9 +98,10 @@ static int check_execveat_invoked_rc(int fd, const char *path, int flags, | |||
| 98 | child, status); | 98 | child, status); |
| 99 | return 1; | 99 | return 1; |
| 100 | } | 100 | } |
| 101 | if (WEXITSTATUS(status) != expected_rc) { | 101 | if ((WEXITSTATUS(status) != expected_rc) && |
| 102 | printf("[FAIL] (child %d exited with %d not %d)\n", | 102 | (WEXITSTATUS(status) != expected_rc2)) { |
| 103 | child, WEXITSTATUS(status), expected_rc); | 103 | printf("[FAIL] (child %d exited with %d not %d nor %d)\n", |
| 104 | child, WEXITSTATUS(status), expected_rc, expected_rc2); | ||
| 104 | return 1; | 105 | return 1; |
| 105 | } | 106 | } |
| 106 | printf("[OK]\n"); | 107 | printf("[OK]\n"); |
| @@ -109,7 +110,7 @@ static int check_execveat_invoked_rc(int fd, const char *path, int flags, | |||
| 109 | 110 | ||
| 110 | static int check_execveat(int fd, const char *path, int flags) | 111 | static int check_execveat(int fd, const char *path, int flags) |
| 111 | { | 112 | { |
| 112 | return check_execveat_invoked_rc(fd, path, flags, 99); | 113 | return check_execveat_invoked_rc(fd, path, flags, 99, 99); |
| 113 | } | 114 | } |
| 114 | 115 | ||
| 115 | static char *concat(const char *left, const char *right) | 116 | static char *concat(const char *left, const char *right) |
| @@ -192,9 +193,15 @@ static int check_execveat_pathmax(int dot_dfd, const char *src, int is_script) | |||
| 192 | * Execute as a long pathname relative to ".". If this is a script, | 193 | * Execute as a long pathname relative to ".". If this is a script, |
| 193 | * the interpreter will launch but fail to open the script because its | 194 | * the interpreter will launch but fail to open the script because its |
| 194 | * name ("/dev/fd/5/xxx....") is bigger than PATH_MAX. | 195 | * name ("/dev/fd/5/xxx....") is bigger than PATH_MAX. |
| 196 | * | ||
| 197 | * The failure code is usually 127 (POSIX: "If a command is not found, | ||
| 198 | * the exit status shall be 127."), but some systems give 126 (POSIX: | ||
| 199 | * "If the command name is found, but it is not an executable utility, | ||
| 200 | * the exit status shall be 126."), so allow either. | ||
| 195 | */ | 201 | */ |
| 196 | if (is_script) | 202 | if (is_script) |
| 197 | fail += check_execveat_invoked_rc(dot_dfd, longpath, 0, 127); | 203 | fail += check_execveat_invoked_rc(dot_dfd, longpath, 0, |
| 204 | 127, 126); | ||
| 198 | else | 205 | else |
| 199 | fail += check_execveat(dot_dfd, longpath, 0); | 206 | fail += check_execveat(dot_dfd, longpath, 0); |
| 200 | 207 | ||
diff --git a/tools/testing/selftests/mqueue/mq_perf_tests.c b/tools/testing/selftests/mqueue/mq_perf_tests.c index 94dae65eea41..8519e9ee97e3 100644 --- a/tools/testing/selftests/mqueue/mq_perf_tests.c +++ b/tools/testing/selftests/mqueue/mq_perf_tests.c | |||
| @@ -536,10 +536,9 @@ int main(int argc, char *argv[]) | |||
| 536 | { | 536 | { |
| 537 | struct mq_attr attr; | 537 | struct mq_attr attr; |
| 538 | char *option, *next_option; | 538 | char *option, *next_option; |
| 539 | int i, cpu; | 539 | int i, cpu, rc; |
| 540 | struct sigaction sa; | 540 | struct sigaction sa; |
| 541 | poptContext popt_context; | 541 | poptContext popt_context; |
| 542 | char rc; | ||
| 543 | void *retval; | 542 | void *retval; |
| 544 | 543 | ||
| 545 | main_thread = pthread_self(); | 544 | main_thread = pthread_self(); |
diff --git a/tools/testing/selftests/vm/Makefile b/tools/testing/selftests/vm/Makefile index 4c4b1f631ecf..077828c889f1 100644 --- a/tools/testing/selftests/vm/Makefile +++ b/tools/testing/selftests/vm/Makefile | |||
| @@ -7,7 +7,7 @@ BINARIES += transhuge-stress | |||
| 7 | 7 | ||
| 8 | all: $(BINARIES) | 8 | all: $(BINARIES) |
| 9 | %: %.c | 9 | %: %.c |
| 10 | $(CC) $(CFLAGS) -o $@ $^ | 10 | $(CC) $(CFLAGS) -o $@ $^ -lrt |
| 11 | 11 | ||
| 12 | run_tests: all | 12 | run_tests: all |
| 13 | @/bin/sh ./run_vmtests || (echo "vmtests: [FAIL]"; exit 1) | 13 | @/bin/sh ./run_vmtests || (echo "vmtests: [FAIL]"; exit 1) |
