diff options
391 files changed, 4012 insertions, 2334 deletions
diff --git a/Documentation/device-mapper/cache.txt b/Documentation/device-mapper/cache.txt index e6b72d355151..68c0f517c60e 100644 --- a/Documentation/device-mapper/cache.txt +++ b/Documentation/device-mapper/cache.txt | |||
| @@ -124,12 +124,11 @@ the default being 204800 sectors (or 100MB). | |||
| 124 | Updating on-disk metadata | 124 | Updating on-disk metadata |
| 125 | ------------------------- | 125 | ------------------------- |
| 126 | 126 | ||
| 127 | On-disk metadata is committed every time a REQ_SYNC or REQ_FUA bio is | 127 | On-disk metadata is committed every time a FLUSH or FUA bio is written. |
| 128 | written. If no such requests are made then commits will occur every | 128 | If no such requests are made then commits will occur every second. This |
| 129 | second. This means the cache behaves like a physical disk that has a | 129 | means the cache behaves like a physical disk that has a volatile write |
| 130 | write cache (the same is true of the thin-provisioning target). If | 130 | cache. If power is lost you may lose some recent writes. The metadata |
| 131 | power is lost you may lose some recent writes. The metadata should | 131 | should always be consistent in spite of any crash. |
| 132 | always be consistent in spite of any crash. | ||
| 133 | 132 | ||
| 134 | The 'dirty' state for a cache block changes far too frequently for us | 133 | The 'dirty' state for a cache block changes far too frequently for us |
| 135 | to keep updating it on the fly. So we treat it as a hint. In normal | 134 | to keep updating it on the fly. So we treat it as a hint. In normal |
diff --git a/Documentation/device-mapper/thin-provisioning.txt b/Documentation/device-mapper/thin-provisioning.txt index 8a7a3d46e0da..05a27e9442bd 100644 --- a/Documentation/device-mapper/thin-provisioning.txt +++ b/Documentation/device-mapper/thin-provisioning.txt | |||
| @@ -116,6 +116,35 @@ Resuming a device with a new table itself triggers an event so the | |||
| 116 | userspace daemon can use this to detect a situation where a new table | 116 | userspace daemon can use this to detect a situation where a new table |
| 117 | already exceeds the threshold. | 117 | already exceeds the threshold. |
| 118 | 118 | ||
| 119 | A low water mark for the metadata device is maintained in the kernel and | ||
| 120 | will trigger a dm event if free space on the metadata device drops below | ||
| 121 | it. | ||
| 122 | |||
| 123 | Updating on-disk metadata | ||
| 124 | ------------------------- | ||
| 125 | |||
| 126 | On-disk metadata is committed every time a FLUSH or FUA bio is written. | ||
| 127 | If no such requests are made then commits will occur every second. This | ||
| 128 | means the thin-provisioning target behaves like a physical disk that has | ||
| 129 | a volatile write cache. If power is lost you may lose some recent | ||
| 130 | writes. The metadata should always be consistent in spite of any crash. | ||
| 131 | |||
| 132 | If data space is exhausted the pool will either error or queue IO | ||
| 133 | according to the configuration (see: error_if_no_space). If metadata | ||
| 134 | space is exhausted or a metadata operation fails: the pool will error IO | ||
| 135 | until the pool is taken offline and repair is performed to 1) fix any | ||
| 136 | potential inconsistencies and 2) clear the flag that imposes repair. | ||
| 137 | Once the pool's metadata device is repaired it may be resized, which | ||
| 138 | will allow the pool to return to normal operation. Note that if a pool | ||
| 139 | is flagged as needing repair, the pool's data and metadata devices | ||
| 140 | cannot be resized until repair is performed. It should also be noted | ||
| 141 | that when the pool's metadata space is exhausted the current metadata | ||
| 142 | transaction is aborted. Given that the pool will cache IO whose | ||
| 143 | completion may have already been acknowledged to upper IO layers | ||
| 144 | (e.g. filesystem) it is strongly suggested that consistency checks | ||
| 145 | (e.g. fsck) be performed on those layers when repair of the pool is | ||
| 146 | required. | ||
| 147 | |||
| 119 | Thin provisioning | 148 | Thin provisioning |
| 120 | ----------------- | 149 | ----------------- |
| 121 | 150 | ||
| @@ -258,10 +287,9 @@ ii) Status | |||
| 258 | should register for the event and then check the target's status. | 287 | should register for the event and then check the target's status. |
| 259 | 288 | ||
| 260 | held metadata root: | 289 | held metadata root: |
| 261 | The location, in sectors, of the metadata root that has been | 290 | The location, in blocks, of the metadata root that has been |
| 262 | 'held' for userspace read access. '-' indicates there is no | 291 | 'held' for userspace read access. '-' indicates there is no |
| 263 | held root. This feature is not yet implemented so '-' is | 292 | held root. |
| 264 | always returned. | ||
| 265 | 293 | ||
| 266 | discard_passdown|no_discard_passdown | 294 | discard_passdown|no_discard_passdown |
| 267 | Whether or not discards are actually being passed down to the | 295 | Whether or not discards are actually being passed down to the |
diff --git a/Documentation/devicetree/bindings/clock/renesas,cpg-mstp-clocks.txt b/Documentation/devicetree/bindings/clock/renesas,cpg-mstp-clocks.txt index a6a352c2771e..5992dceec7af 100644 --- a/Documentation/devicetree/bindings/clock/renesas,cpg-mstp-clocks.txt +++ b/Documentation/devicetree/bindings/clock/renesas,cpg-mstp-clocks.txt | |||
| @@ -21,9 +21,9 @@ Required Properties: | |||
| 21 | must appear in the same order as the output clocks. | 21 | must appear in the same order as the output clocks. |
| 22 | - #clock-cells: Must be 1 | 22 | - #clock-cells: Must be 1 |
| 23 | - clock-output-names: The name of the clocks as free-form strings | 23 | - clock-output-names: The name of the clocks as free-form strings |
| 24 | - renesas,indices: Indices of the gate clocks into the group (0 to 31) | 24 | - renesas,clock-indices: Indices of the gate clocks into the group (0 to 31) |
| 25 | 25 | ||
| 26 | The clocks, clock-output-names and renesas,indices properties contain one | 26 | The clocks, clock-output-names and renesas,clock-indices properties contain one |
| 27 | entry per gate clock. The MSTP groups are sparsely populated. Unimplemented | 27 | entry per gate clock. The MSTP groups are sparsely populated. Unimplemented |
| 28 | gate clocks must not be declared. | 28 | gate clocks must not be declared. |
| 29 | 29 | ||
diff --git a/Documentation/devicetree/bindings/dma/fsl-imx-sdma.txt b/Documentation/devicetree/bindings/dma/fsl-imx-sdma.txt index 68b83ecc3850..ee9be9961524 100644 --- a/Documentation/devicetree/bindings/dma/fsl-imx-sdma.txt +++ b/Documentation/devicetree/bindings/dma/fsl-imx-sdma.txt | |||
| @@ -1,12 +1,16 @@ | |||
| 1 | * Freescale Smart Direct Memory Access (SDMA) Controller for i.MX | 1 | * Freescale Smart Direct Memory Access (SDMA) Controller for i.MX |
| 2 | 2 | ||
| 3 | Required properties: | 3 | Required properties: |
| 4 | - compatible : Should be "fsl,imx31-sdma", "fsl,imx31-to1-sdma", | 4 | - compatible : Should be one of |
| 5 | "fsl,imx31-to2-sdma", "fsl,imx35-sdma", "fsl,imx35-to1-sdma", | 5 | "fsl,imx25-sdma" |
| 6 | "fsl,imx35-to2-sdma", "fsl,imx51-sdma", "fsl,imx53-sdma" or | 6 | "fsl,imx31-sdma", "fsl,imx31-to1-sdma", "fsl,imx31-to2-sdma" |
| 7 | "fsl,imx6q-sdma". The -to variants should be preferred since they | 7 | "fsl,imx35-sdma", "fsl,imx35-to1-sdma", "fsl,imx35-to2-sdma" |
| 8 | allow to determnine the correct ROM script addresses needed for | 8 | "fsl,imx51-sdma" |
| 9 | the driver to work without additional firmware. | 9 | "fsl,imx53-sdma" |
| 10 | "fsl,imx6q-sdma" | ||
| 11 | The -to variants should be preferred since they allow to determnine the | ||
| 12 | correct ROM script addresses needed for the driver to work without additional | ||
| 13 | firmware. | ||
| 10 | - reg : Should contain SDMA registers location and length | 14 | - reg : Should contain SDMA registers location and length |
| 11 | - interrupts : Should contain SDMA interrupt | 15 | - interrupts : Should contain SDMA interrupt |
| 12 | - #dma-cells : Must be <3>. | 16 | - #dma-cells : Must be <3>. |
diff --git a/Documentation/devicetree/bindings/net/opencores-ethoc.txt b/Documentation/devicetree/bindings/net/opencores-ethoc.txt new file mode 100644 index 000000000000..2dc127c30d9b --- /dev/null +++ b/Documentation/devicetree/bindings/net/opencores-ethoc.txt | |||
| @@ -0,0 +1,22 @@ | |||
| 1 | * OpenCores MAC 10/100 Mbps | ||
| 2 | |||
| 3 | Required properties: | ||
| 4 | - compatible: Should be "opencores,ethoc". | ||
| 5 | - reg: two memory regions (address and length), | ||
| 6 | first region is for the device registers and descriptor rings, | ||
| 7 | second is for the device packet memory. | ||
| 8 | - interrupts: interrupt for the device. | ||
| 9 | |||
| 10 | Optional properties: | ||
| 11 | - clocks: phandle to refer to the clk used as per | ||
| 12 | Documentation/devicetree/bindings/clock/clock-bindings.txt | ||
| 13 | |||
| 14 | Examples: | ||
| 15 | |||
| 16 | enet0: ethoc@fd030000 { | ||
| 17 | compatible = "opencores,ethoc"; | ||
| 18 | reg = <0xfd030000 0x4000 0xfd800000 0x4000>; | ||
| 19 | interrupts = <1>; | ||
| 20 | local-mac-address = [00 50 c2 13 6f 00]; | ||
| 21 | clocks = <&osc>; | ||
| 22 | }; | ||
diff --git a/Documentation/networking/can.txt b/Documentation/networking/can.txt index f3089d423515..0cbe6ec22d6f 100644 --- a/Documentation/networking/can.txt +++ b/Documentation/networking/can.txt | |||
| @@ -554,12 +554,6 @@ solution for a couple of reasons: | |||
| 554 | not specified in the struct can_frame and therefore it is only valid in | 554 | not specified in the struct can_frame and therefore it is only valid in |
| 555 | CANFD_MTU sized CAN FD frames. | 555 | CANFD_MTU sized CAN FD frames. |
| 556 | 556 | ||
| 557 | As long as the payload length is <=8 the received CAN frames from CAN FD | ||
| 558 | capable CAN devices can be received and read by legacy sockets too. When | ||
| 559 | user-generated CAN FD frames have a payload length <=8 these can be send | ||
| 560 | by legacy CAN network interfaces too. Sending CAN FD frames with payload | ||
| 561 | length > 8 to a legacy CAN network interface returns an -EMSGSIZE error. | ||
| 562 | |||
| 563 | Implementation hint for new CAN applications: | 557 | Implementation hint for new CAN applications: |
| 564 | 558 | ||
| 565 | To build a CAN FD aware application use struct canfd_frame as basic CAN | 559 | To build a CAN FD aware application use struct canfd_frame as basic CAN |
diff --git a/MAINTAINERS b/MAINTAINERS index df8869d49c3f..b7befe758429 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -73,7 +73,8 @@ Descriptions of section entries: | |||
| 73 | L: Mailing list that is relevant to this area | 73 | L: Mailing list that is relevant to this area |
| 74 | W: Web-page with status/info | 74 | W: Web-page with status/info |
| 75 | Q: Patchwork web based patch tracking system site | 75 | Q: Patchwork web based patch tracking system site |
| 76 | T: SCM tree type and location. Type is one of: git, hg, quilt, stgit, topgit. | 76 | T: SCM tree type and location. |
| 77 | Type is one of: git, hg, quilt, stgit, topgit | ||
| 77 | S: Status, one of the following: | 78 | S: Status, one of the following: |
| 78 | Supported: Someone is actually paid to look after this. | 79 | Supported: Someone is actually paid to look after this. |
| 79 | Maintained: Someone actually looks after it. | 80 | Maintained: Someone actually looks after it. |
| @@ -473,7 +474,7 @@ F: net/rxrpc/af_rxrpc.c | |||
| 473 | 474 | ||
| 474 | AGPGART DRIVER | 475 | AGPGART DRIVER |
| 475 | M: David Airlie <airlied@linux.ie> | 476 | M: David Airlie <airlied@linux.ie> |
| 476 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6.git | 477 | T: git git://people.freedesktop.org/~airlied/linux (part of drm maint) |
| 477 | S: Maintained | 478 | S: Maintained |
| 478 | F: drivers/char/agp/ | 479 | F: drivers/char/agp/ |
| 479 | F: include/linux/agp* | 480 | F: include/linux/agp* |
| @@ -1612,11 +1613,11 @@ S: Maintained | |||
| 1612 | F: drivers/net/wireless/atmel* | 1613 | F: drivers/net/wireless/atmel* |
| 1613 | 1614 | ||
| 1614 | ATTO EXPRESSSAS SAS/SATA RAID SCSI DRIVER | 1615 | ATTO EXPRESSSAS SAS/SATA RAID SCSI DRIVER |
| 1615 | M: Bradley Grove <linuxdrivers@attotech.com> | 1616 | M: Bradley Grove <linuxdrivers@attotech.com> |
| 1616 | L: linux-scsi@vger.kernel.org | 1617 | L: linux-scsi@vger.kernel.org |
| 1617 | W: http://www.attotech.com | 1618 | W: http://www.attotech.com |
| 1618 | S: Supported | 1619 | S: Supported |
| 1619 | F: drivers/scsi/esas2r | 1620 | F: drivers/scsi/esas2r |
| 1620 | 1621 | ||
| 1621 | AUDIT SUBSYSTEM | 1622 | AUDIT SUBSYSTEM |
| 1622 | M: Eric Paris <eparis@redhat.com> | 1623 | M: Eric Paris <eparis@redhat.com> |
| @@ -2159,7 +2160,7 @@ F: Documentation/zh_CN/ | |||
| 2159 | 2160 | ||
| 2160 | CHIPIDEA USB HIGH SPEED DUAL ROLE CONTROLLER | 2161 | CHIPIDEA USB HIGH SPEED DUAL ROLE CONTROLLER |
| 2161 | M: Peter Chen <Peter.Chen@freescale.com> | 2162 | M: Peter Chen <Peter.Chen@freescale.com> |
| 2162 | T: git://github.com/hzpeterchen/linux-usb.git | 2163 | T: git git://github.com/hzpeterchen/linux-usb.git |
| 2163 | L: linux-usb@vger.kernel.org | 2164 | L: linux-usb@vger.kernel.org |
| 2164 | S: Maintained | 2165 | S: Maintained |
| 2165 | F: drivers/usb/chipidea/ | 2166 | F: drivers/usb/chipidea/ |
| @@ -2179,9 +2180,9 @@ S: Supported | |||
| 2179 | F: drivers/net/ethernet/cisco/enic/ | 2180 | F: drivers/net/ethernet/cisco/enic/ |
| 2180 | 2181 | ||
| 2181 | CISCO VIC LOW LATENCY NIC DRIVER | 2182 | CISCO VIC LOW LATENCY NIC DRIVER |
| 2182 | M: Upinder Malhi <umalhi@cisco.com> | 2183 | M: Upinder Malhi <umalhi@cisco.com> |
| 2183 | S: Supported | 2184 | S: Supported |
| 2184 | F: drivers/infiniband/hw/usnic | 2185 | F: drivers/infiniband/hw/usnic |
| 2185 | 2186 | ||
| 2186 | CIRRUS LOGIC EP93XX ETHERNET DRIVER | 2187 | CIRRUS LOGIC EP93XX ETHERNET DRIVER |
| 2187 | M: Hartley Sweeten <hsweeten@visionengravers.com> | 2188 | M: Hartley Sweeten <hsweeten@visionengravers.com> |
| @@ -2378,20 +2379,20 @@ F: drivers/cpufreq/arm_big_little.c | |||
| 2378 | F: drivers/cpufreq/arm_big_little_dt.c | 2379 | F: drivers/cpufreq/arm_big_little_dt.c |
| 2379 | 2380 | ||
| 2380 | CPUIDLE DRIVER - ARM BIG LITTLE | 2381 | CPUIDLE DRIVER - ARM BIG LITTLE |
| 2381 | M: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> | 2382 | M: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> |
| 2382 | M: Daniel Lezcano <daniel.lezcano@linaro.org> | 2383 | M: Daniel Lezcano <daniel.lezcano@linaro.org> |
| 2383 | L: linux-pm@vger.kernel.org | 2384 | L: linux-pm@vger.kernel.org |
| 2384 | L: linux-arm-kernel@lists.infradead.org | 2385 | L: linux-arm-kernel@lists.infradead.org |
| 2385 | T: git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git | 2386 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git |
| 2386 | S: Maintained | 2387 | S: Maintained |
| 2387 | F: drivers/cpuidle/cpuidle-big_little.c | 2388 | F: drivers/cpuidle/cpuidle-big_little.c |
| 2388 | 2389 | ||
| 2389 | CPUIDLE DRIVERS | 2390 | CPUIDLE DRIVERS |
| 2390 | M: Rafael J. Wysocki <rjw@rjwysocki.net> | 2391 | M: Rafael J. Wysocki <rjw@rjwysocki.net> |
| 2391 | M: Daniel Lezcano <daniel.lezcano@linaro.org> | 2392 | M: Daniel Lezcano <daniel.lezcano@linaro.org> |
| 2392 | L: linux-pm@vger.kernel.org | 2393 | L: linux-pm@vger.kernel.org |
| 2393 | S: Maintained | 2394 | S: Maintained |
| 2394 | T: git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git | 2395 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git |
| 2395 | F: drivers/cpuidle/* | 2396 | F: drivers/cpuidle/* |
| 2396 | F: include/linux/cpuidle.h | 2397 | F: include/linux/cpuidle.h |
| 2397 | 2398 | ||
| @@ -2458,9 +2459,9 @@ S: Maintained | |||
| 2458 | F: sound/pci/cs5535audio/ | 2459 | F: sound/pci/cs5535audio/ |
| 2459 | 2460 | ||
| 2460 | CW1200 WLAN driver | 2461 | CW1200 WLAN driver |
| 2461 | M: Solomon Peachy <pizza@shaftnet.org> | 2462 | M: Solomon Peachy <pizza@shaftnet.org> |
| 2462 | S: Maintained | 2463 | S: Maintained |
| 2463 | F: drivers/net/wireless/cw1200/ | 2464 | F: drivers/net/wireless/cw1200/ |
| 2464 | 2465 | ||
| 2465 | CX18 VIDEO4LINUX DRIVER | 2466 | CX18 VIDEO4LINUX DRIVER |
| 2466 | M: Andy Walls <awalls@md.metrocast.net> | 2467 | M: Andy Walls <awalls@md.metrocast.net> |
| @@ -2848,12 +2849,22 @@ F: lib/kobj* | |||
| 2848 | DRM DRIVERS | 2849 | DRM DRIVERS |
| 2849 | M: David Airlie <airlied@linux.ie> | 2850 | M: David Airlie <airlied@linux.ie> |
| 2850 | L: dri-devel@lists.freedesktop.org | 2851 | L: dri-devel@lists.freedesktop.org |
| 2851 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6.git | 2852 | T: git git://people.freedesktop.org/~airlied/linux |
| 2852 | S: Maintained | 2853 | S: Maintained |
| 2853 | F: drivers/gpu/drm/ | 2854 | F: drivers/gpu/drm/ |
| 2854 | F: include/drm/ | 2855 | F: include/drm/ |
| 2855 | F: include/uapi/drm/ | 2856 | F: include/uapi/drm/ |
| 2856 | 2857 | ||
| 2858 | RADEON DRM DRIVERS | ||
| 2859 | M: Alex Deucher <alexander.deucher@amd.com> | ||
| 2860 | M: Christian König <christian.koenig@amd.com> | ||
| 2861 | L: dri-devel@lists.freedesktop.org | ||
| 2862 | T: git git://people.freedesktop.org/~agd5f/linux | ||
| 2863 | S: Supported | ||
| 2864 | F: drivers/gpu/drm/radeon/ | ||
| 2865 | F: include/drm/radeon* | ||
| 2866 | F: include/uapi/drm/radeon* | ||
| 2867 | |||
| 2857 | INTEL DRM DRIVERS (excluding Poulsbo, Moorestown and derivative chipsets) | 2868 | INTEL DRM DRIVERS (excluding Poulsbo, Moorestown and derivative chipsets) |
| 2858 | M: Daniel Vetter <daniel.vetter@ffwll.ch> | 2869 | M: Daniel Vetter <daniel.vetter@ffwll.ch> |
| 2859 | M: Jani Nikula <jani.nikula@linux.intel.com> | 2870 | M: Jani Nikula <jani.nikula@linux.intel.com> |
| @@ -3085,6 +3096,8 @@ F: fs/ecryptfs/ | |||
| 3085 | 3096 | ||
| 3086 | EDAC-CORE | 3097 | EDAC-CORE |
| 3087 | M: Doug Thompson <dougthompson@xmission.com> | 3098 | M: Doug Thompson <dougthompson@xmission.com> |
| 3099 | M: Borislav Petkov <bp@alien8.de> | ||
| 3100 | M: Mauro Carvalho Chehab <m.chehab@samsung.com> | ||
| 3088 | L: linux-edac@vger.kernel.org | 3101 | L: linux-edac@vger.kernel.org |
| 3089 | W: bluesmoke.sourceforge.net | 3102 | W: bluesmoke.sourceforge.net |
| 3090 | S: Supported | 3103 | S: Supported |
| @@ -4548,6 +4561,7 @@ F: Documentation/networking/ixgbevf.txt | |||
| 4548 | F: Documentation/networking/i40e.txt | 4561 | F: Documentation/networking/i40e.txt |
| 4549 | F: Documentation/networking/i40evf.txt | 4562 | F: Documentation/networking/i40evf.txt |
| 4550 | F: drivers/net/ethernet/intel/ | 4563 | F: drivers/net/ethernet/intel/ |
| 4564 | F: drivers/net/ethernet/intel/*/ | ||
| 4551 | 4565 | ||
| 4552 | INTEL-MID GPIO DRIVER | 4566 | INTEL-MID GPIO DRIVER |
| 4553 | M: David Cohen <david.a.cohen@linux.intel.com> | 4567 | M: David Cohen <david.a.cohen@linux.intel.com> |
| @@ -4904,7 +4918,7 @@ F: drivers/staging/ktap/ | |||
| 4904 | KCONFIG | 4918 | KCONFIG |
| 4905 | M: "Yann E. MORIN" <yann.morin.1998@free.fr> | 4919 | M: "Yann E. MORIN" <yann.morin.1998@free.fr> |
| 4906 | L: linux-kbuild@vger.kernel.org | 4920 | L: linux-kbuild@vger.kernel.org |
| 4907 | T: git://gitorious.org/linux-kconfig/linux-kconfig | 4921 | T: git git://gitorious.org/linux-kconfig/linux-kconfig |
| 4908 | S: Maintained | 4922 | S: Maintained |
| 4909 | F: Documentation/kbuild/kconfig-language.txt | 4923 | F: Documentation/kbuild/kconfig-language.txt |
| 4910 | F: scripts/kconfig/ | 4924 | F: scripts/kconfig/ |
| @@ -5461,11 +5475,11 @@ S: Maintained | |||
| 5461 | F: drivers/media/tuners/m88ts2022* | 5475 | F: drivers/media/tuners/m88ts2022* |
| 5462 | 5476 | ||
| 5463 | MA901 MASTERKIT USB FM RADIO DRIVER | 5477 | MA901 MASTERKIT USB FM RADIO DRIVER |
| 5464 | M: Alexey Klimov <klimov.linux@gmail.com> | 5478 | M: Alexey Klimov <klimov.linux@gmail.com> |
| 5465 | L: linux-media@vger.kernel.org | 5479 | L: linux-media@vger.kernel.org |
| 5466 | T: git git://linuxtv.org/media_tree.git | 5480 | T: git git://linuxtv.org/media_tree.git |
| 5467 | S: Maintained | 5481 | S: Maintained |
| 5468 | F: drivers/media/radio/radio-ma901.c | 5482 | F: drivers/media/radio/radio-ma901.c |
| 5469 | 5483 | ||
| 5470 | MAC80211 | 5484 | MAC80211 |
| 5471 | M: Johannes Berg <johannes@sipsolutions.net> | 5485 | M: Johannes Berg <johannes@sipsolutions.net> |
| @@ -5501,6 +5515,11 @@ W: http://www.kernel.org/doc/man-pages | |||
| 5501 | L: linux-man@vger.kernel.org | 5515 | L: linux-man@vger.kernel.org |
| 5502 | S: Maintained | 5516 | S: Maintained |
| 5503 | 5517 | ||
| 5518 | MARVELL ARMADA DRM SUPPORT | ||
| 5519 | M: Russell King <rmk+kernel@arm.linux.org.uk> | ||
| 5520 | S: Maintained | ||
| 5521 | F: drivers/gpu/drm/armada/ | ||
| 5522 | |||
| 5504 | MARVELL GIGABIT ETHERNET DRIVERS (skge/sky2) | 5523 | MARVELL GIGABIT ETHERNET DRIVERS (skge/sky2) |
| 5505 | M: Mirko Lindner <mlindner@marvell.com> | 5524 | M: Mirko Lindner <mlindner@marvell.com> |
| 5506 | M: Stephen Hemminger <stephen@networkplumber.org> | 5525 | M: Stephen Hemminger <stephen@networkplumber.org> |
| @@ -5621,7 +5640,7 @@ F: drivers/scsi/megaraid/ | |||
| 5621 | 5640 | ||
| 5622 | MELLANOX ETHERNET DRIVER (mlx4_en) | 5641 | MELLANOX ETHERNET DRIVER (mlx4_en) |
| 5623 | M: Amir Vadai <amirv@mellanox.com> | 5642 | M: Amir Vadai <amirv@mellanox.com> |
| 5624 | L: netdev@vger.kernel.org | 5643 | L: netdev@vger.kernel.org |
| 5625 | S: Supported | 5644 | S: Supported |
| 5626 | W: http://www.mellanox.com | 5645 | W: http://www.mellanox.com |
| 5627 | Q: http://patchwork.ozlabs.org/project/netdev/list/ | 5646 | Q: http://patchwork.ozlabs.org/project/netdev/list/ |
| @@ -5662,7 +5681,7 @@ F: include/linux/mtd/ | |||
| 5662 | F: include/uapi/mtd/ | 5681 | F: include/uapi/mtd/ |
| 5663 | 5682 | ||
| 5664 | MEN A21 WATCHDOG DRIVER | 5683 | MEN A21 WATCHDOG DRIVER |
| 5665 | M: Johannes Thumshirn <johannes.thumshirn@men.de> | 5684 | M: Johannes Thumshirn <johannes.thumshirn@men.de> |
| 5666 | L: linux-watchdog@vger.kernel.org | 5685 | L: linux-watchdog@vger.kernel.org |
| 5667 | S: Supported | 5686 | S: Supported |
| 5668 | F: drivers/watchdog/mena21_wdt.c | 5687 | F: drivers/watchdog/mena21_wdt.c |
| @@ -5718,20 +5737,20 @@ L: linux-rdma@vger.kernel.org | |||
| 5718 | W: http://www.mellanox.com | 5737 | W: http://www.mellanox.com |
| 5719 | Q: http://patchwork.ozlabs.org/project/netdev/list/ | 5738 | Q: http://patchwork.ozlabs.org/project/netdev/list/ |
| 5720 | Q: http://patchwork.kernel.org/project/linux-rdma/list/ | 5739 | Q: http://patchwork.kernel.org/project/linux-rdma/list/ |
| 5721 | T: git://openfabrics.org/~eli/connect-ib.git | 5740 | T: git git://openfabrics.org/~eli/connect-ib.git |
| 5722 | S: Supported | 5741 | S: Supported |
| 5723 | F: drivers/net/ethernet/mellanox/mlx5/core/ | 5742 | F: drivers/net/ethernet/mellanox/mlx5/core/ |
| 5724 | F: include/linux/mlx5/ | 5743 | F: include/linux/mlx5/ |
| 5725 | 5744 | ||
| 5726 | Mellanox MLX5 IB driver | 5745 | Mellanox MLX5 IB driver |
| 5727 | M: Eli Cohen <eli@mellanox.com> | 5746 | M: Eli Cohen <eli@mellanox.com> |
| 5728 | L: linux-rdma@vger.kernel.org | 5747 | L: linux-rdma@vger.kernel.org |
| 5729 | W: http://www.mellanox.com | 5748 | W: http://www.mellanox.com |
| 5730 | Q: http://patchwork.kernel.org/project/linux-rdma/list/ | 5749 | Q: http://patchwork.kernel.org/project/linux-rdma/list/ |
| 5731 | T: git://openfabrics.org/~eli/connect-ib.git | 5750 | T: git git://openfabrics.org/~eli/connect-ib.git |
| 5732 | S: Supported | 5751 | S: Supported |
| 5733 | F: include/linux/mlx5/ | 5752 | F: include/linux/mlx5/ |
| 5734 | F: drivers/infiniband/hw/mlx5/ | 5753 | F: drivers/infiniband/hw/mlx5/ |
| 5735 | 5754 | ||
| 5736 | MODULE SUPPORT | 5755 | MODULE SUPPORT |
| 5737 | M: Rusty Russell <rusty@rustcorp.com.au> | 5756 | M: Rusty Russell <rusty@rustcorp.com.au> |
| @@ -6156,6 +6175,12 @@ S: Supported | |||
| 6156 | F: drivers/block/nvme* | 6175 | F: drivers/block/nvme* |
| 6157 | F: include/linux/nvme.h | 6176 | F: include/linux/nvme.h |
| 6158 | 6177 | ||
| 6178 | NXP TDA998X DRM DRIVER | ||
| 6179 | M: Russell King <rmk+kernel@arm.linux.org.uk> | ||
| 6180 | S: Supported | ||
| 6181 | F: drivers/gpu/drm/i2c/tda998x_drv.c | ||
| 6182 | F: include/drm/i2c/tda998x.h | ||
| 6183 | |||
| 6159 | OMAP SUPPORT | 6184 | OMAP SUPPORT |
| 6160 | M: Tony Lindgren <tony@atomide.com> | 6185 | M: Tony Lindgren <tony@atomide.com> |
| 6161 | L: linux-omap@vger.kernel.org | 6186 | L: linux-omap@vger.kernel.org |
| @@ -8685,17 +8710,17 @@ S: Maintained | |||
| 8685 | F: drivers/media/radio/radio-raremono.c | 8710 | F: drivers/media/radio/radio-raremono.c |
| 8686 | 8711 | ||
| 8687 | THERMAL | 8712 | THERMAL |
| 8688 | M: Zhang Rui <rui.zhang@intel.com> | 8713 | M: Zhang Rui <rui.zhang@intel.com> |
| 8689 | M: Eduardo Valentin <eduardo.valentin@ti.com> | 8714 | M: Eduardo Valentin <eduardo.valentin@ti.com> |
| 8690 | L: linux-pm@vger.kernel.org | 8715 | L: linux-pm@vger.kernel.org |
| 8691 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/rzhang/linux.git | 8716 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/rzhang/linux.git |
| 8692 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/evalenti/linux-soc-thermal.git | 8717 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/evalenti/linux-soc-thermal.git |
| 8693 | Q: https://patchwork.kernel.org/project/linux-pm/list/ | 8718 | Q: https://patchwork.kernel.org/project/linux-pm/list/ |
| 8694 | S: Supported | 8719 | S: Supported |
| 8695 | F: drivers/thermal/ | 8720 | F: drivers/thermal/ |
| 8696 | F: include/linux/thermal.h | 8721 | F: include/linux/thermal.h |
| 8697 | F: include/linux/cpu_cooling.h | 8722 | F: include/linux/cpu_cooling.h |
| 8698 | F: Documentation/devicetree/bindings/thermal/ | 8723 | F: Documentation/devicetree/bindings/thermal/ |
| 8699 | 8724 | ||
| 8700 | THINGM BLINK(1) USB RGB LED DRIVER | 8725 | THINGM BLINK(1) USB RGB LED DRIVER |
| 8701 | M: Vivien Didelot <vivien.didelot@savoirfairelinux.com> | 8726 | M: Vivien Didelot <vivien.didelot@savoirfairelinux.com> |
| @@ -9797,7 +9822,7 @@ ZR36067 VIDEO FOR LINUX DRIVER | |||
| 9797 | L: mjpeg-users@lists.sourceforge.net | 9822 | L: mjpeg-users@lists.sourceforge.net |
| 9798 | L: linux-media@vger.kernel.org | 9823 | L: linux-media@vger.kernel.org |
| 9799 | W: http://mjpeg.sourceforge.net/driver-zoran/ | 9824 | W: http://mjpeg.sourceforge.net/driver-zoran/ |
| 9800 | T: Mercurial http://linuxtv.org/hg/v4l-dvb | 9825 | T: hg http://linuxtv.org/hg/v4l-dvb |
| 9801 | S: Odd Fixes | 9826 | S: Odd Fixes |
| 9802 | F: drivers/media/pci/zoran/ | 9827 | F: drivers/media/pci/zoran/ |
| 9803 | 9828 | ||
| @@ -1,7 +1,7 @@ | |||
| 1 | VERSION = 3 | 1 | VERSION = 3 |
| 2 | PATCHLEVEL = 14 | 2 | PATCHLEVEL = 14 |
| 3 | SUBLEVEL = 0 | 3 | SUBLEVEL = 0 |
| 4 | EXTRAVERSION = -rc4 | 4 | EXTRAVERSION = -rc5 |
| 5 | NAME = Shuffling Zombie Juror | 5 | NAME = Shuffling Zombie Juror |
| 6 | 6 | ||
| 7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
diff --git a/arch/arc/mm/cache_arc700.c b/arch/arc/mm/cache_arc700.c index 6b58c1de7577..400c663b21c2 100644 --- a/arch/arc/mm/cache_arc700.c +++ b/arch/arc/mm/cache_arc700.c | |||
| @@ -282,7 +282,7 @@ static inline void __cache_line_loop(unsigned long paddr, unsigned long vaddr, | |||
| 282 | #else | 282 | #else |
| 283 | /* if V-P const for loop, PTAG can be written once outside loop */ | 283 | /* if V-P const for loop, PTAG can be written once outside loop */ |
| 284 | if (full_page_op) | 284 | if (full_page_op) |
| 285 | write_aux_reg(ARC_REG_DC_PTAG, paddr); | 285 | write_aux_reg(aux_tag, paddr); |
| 286 | #endif | 286 | #endif |
| 287 | 287 | ||
| 288 | while (num_lines-- > 0) { | 288 | while (num_lines-- > 0) { |
| @@ -296,7 +296,7 @@ static inline void __cache_line_loop(unsigned long paddr, unsigned long vaddr, | |||
| 296 | write_aux_reg(aux_cmd, vaddr); | 296 | write_aux_reg(aux_cmd, vaddr); |
| 297 | vaddr += L1_CACHE_BYTES; | 297 | vaddr += L1_CACHE_BYTES; |
| 298 | #else | 298 | #else |
| 299 | write_aux_reg(aux, paddr); | 299 | write_aux_reg(aux_cmd, paddr); |
| 300 | paddr += L1_CACHE_BYTES; | 300 | paddr += L1_CACHE_BYTES; |
| 301 | #endif | 301 | #endif |
| 302 | } | 302 | } |
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index e25419817791..15949459611f 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
| @@ -1578,6 +1578,7 @@ config BL_SWITCHER_DUMMY_IF | |||
| 1578 | 1578 | ||
| 1579 | choice | 1579 | choice |
| 1580 | prompt "Memory split" | 1580 | prompt "Memory split" |
| 1581 | depends on MMU | ||
| 1581 | default VMSPLIT_3G | 1582 | default VMSPLIT_3G |
| 1582 | help | 1583 | help |
| 1583 | Select the desired split between kernel and user memory. | 1584 | Select the desired split between kernel and user memory. |
| @@ -1595,6 +1596,7 @@ endchoice | |||
| 1595 | 1596 | ||
| 1596 | config PAGE_OFFSET | 1597 | config PAGE_OFFSET |
| 1597 | hex | 1598 | hex |
| 1599 | default PHYS_OFFSET if !MMU | ||
| 1598 | default 0x40000000 if VMSPLIT_1G | 1600 | default 0x40000000 if VMSPLIT_1G |
| 1599 | default 0x80000000 if VMSPLIT_2G | 1601 | default 0x80000000 if VMSPLIT_2G |
| 1600 | default 0xC0000000 | 1602 | default 0xC0000000 |
| @@ -1903,6 +1905,7 @@ config XEN | |||
| 1903 | depends on ARM && AEABI && OF | 1905 | depends on ARM && AEABI && OF |
| 1904 | depends on CPU_V7 && !CPU_V6 | 1906 | depends on CPU_V7 && !CPU_V6 |
| 1905 | depends on !GENERIC_ATOMIC64 | 1907 | depends on !GENERIC_ATOMIC64 |
| 1908 | depends on MMU | ||
| 1906 | select ARM_PSCI | 1909 | select ARM_PSCI |
| 1907 | select SWIOTLB_XEN | 1910 | select SWIOTLB_XEN |
| 1908 | select ARCH_DMA_ADDR_T_64BIT | 1911 | select ARCH_DMA_ADDR_T_64BIT |
diff --git a/arch/arm/boot/compressed/.gitignore b/arch/arm/boot/compressed/.gitignore index 47279aa96a6a..0714e0334e33 100644 --- a/arch/arm/boot/compressed/.gitignore +++ b/arch/arm/boot/compressed/.gitignore | |||
| @@ -1,4 +1,5 @@ | |||
| 1 | ashldi3.S | 1 | ashldi3.S |
| 2 | bswapsdi2.S | ||
| 2 | font.c | 3 | font.c |
| 3 | lib1funcs.S | 4 | lib1funcs.S |
| 4 | hyp-stub.S | 5 | hyp-stub.S |
diff --git a/arch/arm/boot/dts/keystone-clocks.dtsi b/arch/arm/boot/dts/keystone-clocks.dtsi index 2363593e1050..ef58d1c24313 100644 --- a/arch/arm/boot/dts/keystone-clocks.dtsi +++ b/arch/arm/boot/dts/keystone-clocks.dtsi | |||
| @@ -612,7 +612,7 @@ clocks { | |||
| 612 | compatible = "ti,keystone,psc-clock"; | 612 | compatible = "ti,keystone,psc-clock"; |
| 613 | clocks = <&chipclk13>; | 613 | clocks = <&chipclk13>; |
| 614 | clock-output-names = "vcp-3"; | 614 | clock-output-names = "vcp-3"; |
| 615 | reg = <0x0235000a8 0xb00>, <0x02350060 0x400>; | 615 | reg = <0x023500a8 0xb00>, <0x02350060 0x400>; |
| 616 | reg-names = "control", "domain"; | 616 | reg-names = "control", "domain"; |
| 617 | domain-id = <24>; | 617 | domain-id = <24>; |
| 618 | }; | 618 | }; |
diff --git a/arch/arm/include/asm/memory.h b/arch/arm/include/asm/memory.h index 8756e4bcdba0..4afb376d9c7c 100644 --- a/arch/arm/include/asm/memory.h +++ b/arch/arm/include/asm/memory.h | |||
| @@ -30,14 +30,15 @@ | |||
| 30 | */ | 30 | */ |
| 31 | #define UL(x) _AC(x, UL) | 31 | #define UL(x) _AC(x, UL) |
| 32 | 32 | ||
| 33 | /* PAGE_OFFSET - the virtual address of the start of the kernel image */ | ||
| 34 | #define PAGE_OFFSET UL(CONFIG_PAGE_OFFSET) | ||
| 35 | |||
| 33 | #ifdef CONFIG_MMU | 36 | #ifdef CONFIG_MMU |
| 34 | 37 | ||
| 35 | /* | 38 | /* |
| 36 | * PAGE_OFFSET - the virtual address of the start of the kernel image | ||
| 37 | * TASK_SIZE - the maximum size of a user space task. | 39 | * TASK_SIZE - the maximum size of a user space task. |
| 38 | * TASK_UNMAPPED_BASE - the lower boundary of the mmap VM area | 40 | * TASK_UNMAPPED_BASE - the lower boundary of the mmap VM area |
| 39 | */ | 41 | */ |
| 40 | #define PAGE_OFFSET UL(CONFIG_PAGE_OFFSET) | ||
| 41 | #define TASK_SIZE (UL(CONFIG_PAGE_OFFSET) - UL(SZ_16M)) | 42 | #define TASK_SIZE (UL(CONFIG_PAGE_OFFSET) - UL(SZ_16M)) |
| 42 | #define TASK_UNMAPPED_BASE ALIGN(TASK_SIZE / 3, SZ_16M) | 43 | #define TASK_UNMAPPED_BASE ALIGN(TASK_SIZE / 3, SZ_16M) |
| 43 | 44 | ||
| @@ -104,10 +105,6 @@ | |||
| 104 | #define END_MEM (UL(CONFIG_DRAM_BASE) + CONFIG_DRAM_SIZE) | 105 | #define END_MEM (UL(CONFIG_DRAM_BASE) + CONFIG_DRAM_SIZE) |
| 105 | #endif | 106 | #endif |
| 106 | 107 | ||
| 107 | #ifndef PAGE_OFFSET | ||
| 108 | #define PAGE_OFFSET PLAT_PHYS_OFFSET | ||
| 109 | #endif | ||
| 110 | |||
| 111 | /* | 108 | /* |
| 112 | * The module can be at any place in ram in nommu mode. | 109 | * The module can be at any place in ram in nommu mode. |
| 113 | */ | 110 | */ |
diff --git a/arch/arm/kernel/head-common.S b/arch/arm/kernel/head-common.S index 47cd974e57ea..c96ecacb2021 100644 --- a/arch/arm/kernel/head-common.S +++ b/arch/arm/kernel/head-common.S | |||
| @@ -177,6 +177,18 @@ __lookup_processor_type_data: | |||
| 177 | .long __proc_info_end | 177 | .long __proc_info_end |
| 178 | .size __lookup_processor_type_data, . - __lookup_processor_type_data | 178 | .size __lookup_processor_type_data, . - __lookup_processor_type_data |
| 179 | 179 | ||
| 180 | __error_lpae: | ||
| 181 | #ifdef CONFIG_DEBUG_LL | ||
| 182 | adr r0, str_lpae | ||
| 183 | bl printascii | ||
| 184 | b __error | ||
| 185 | str_lpae: .asciz "\nError: Kernel with LPAE support, but CPU does not support LPAE.\n" | ||
| 186 | #else | ||
| 187 | b __error | ||
| 188 | #endif | ||
| 189 | .align | ||
| 190 | ENDPROC(__error_lpae) | ||
| 191 | |||
| 180 | __error_p: | 192 | __error_p: |
| 181 | #ifdef CONFIG_DEBUG_LL | 193 | #ifdef CONFIG_DEBUG_LL |
| 182 | adr r0, str_p1 | 194 | adr r0, str_p1 |
diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S index 914616e0bdcd..f5f381d91556 100644 --- a/arch/arm/kernel/head.S +++ b/arch/arm/kernel/head.S | |||
| @@ -102,7 +102,7 @@ ENTRY(stext) | |||
| 102 | and r3, r3, #0xf @ extract VMSA support | 102 | and r3, r3, #0xf @ extract VMSA support |
| 103 | cmp r3, #5 @ long-descriptor translation table format? | 103 | cmp r3, #5 @ long-descriptor translation table format? |
| 104 | THUMB( it lo ) @ force fixup-able long branch encoding | 104 | THUMB( it lo ) @ force fixup-able long branch encoding |
| 105 | blo __error_p @ only classic page table format | 105 | blo __error_lpae @ only classic page table format |
| 106 | #endif | 106 | #endif |
| 107 | 107 | ||
| 108 | #ifndef CONFIG_XIP_KERNEL | 108 | #ifndef CONFIG_XIP_KERNEL |
diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c index 1d8248ea5669..bd18bb8b2770 100644 --- a/arch/arm/kvm/arm.c +++ b/arch/arm/kvm/arm.c | |||
| @@ -878,7 +878,8 @@ static int hyp_init_cpu_pm_notifier(struct notifier_block *self, | |||
| 878 | unsigned long cmd, | 878 | unsigned long cmd, |
| 879 | void *v) | 879 | void *v) |
| 880 | { | 880 | { |
| 881 | if (cmd == CPU_PM_EXIT) { | 881 | if (cmd == CPU_PM_EXIT && |
| 882 | __hyp_get_vectors() == hyp_default_vectors) { | ||
| 882 | cpu_init_hyp_mode(NULL); | 883 | cpu_init_hyp_mode(NULL); |
| 883 | return NOTIFY_OK; | 884 | return NOTIFY_OK; |
| 884 | } | 885 | } |
diff --git a/arch/arm/kvm/interrupts.S b/arch/arm/kvm/interrupts.S index ddc15539bad2..0d68d4073068 100644 --- a/arch/arm/kvm/interrupts.S +++ b/arch/arm/kvm/interrupts.S | |||
| @@ -220,6 +220,10 @@ after_vfp_restore: | |||
| 220 | * in Hyp mode (see init_hyp_mode in arch/arm/kvm/arm.c). Return values are | 220 | * in Hyp mode (see init_hyp_mode in arch/arm/kvm/arm.c). Return values are |
| 221 | * passed in r0 and r1. | 221 | * passed in r0 and r1. |
| 222 | * | 222 | * |
| 223 | * A function pointer with a value of 0xffffffff has a special meaning, | ||
| 224 | * and is used to implement __hyp_get_vectors in the same way as in | ||
| 225 | * arch/arm/kernel/hyp_stub.S. | ||
| 226 | * | ||
| 223 | * The calling convention follows the standard AAPCS: | 227 | * The calling convention follows the standard AAPCS: |
| 224 | * r0 - r3: caller save | 228 | * r0 - r3: caller save |
| 225 | * r12: caller save | 229 | * r12: caller save |
| @@ -363,6 +367,11 @@ hyp_hvc: | |||
| 363 | host_switch_to_hyp: | 367 | host_switch_to_hyp: |
| 364 | pop {r0, r1, r2} | 368 | pop {r0, r1, r2} |
| 365 | 369 | ||
| 370 | /* Check for __hyp_get_vectors */ | ||
| 371 | cmp r0, #-1 | ||
| 372 | mrceq p15, 4, r0, c12, c0, 0 @ get HVBAR | ||
| 373 | beq 1f | ||
| 374 | |||
| 366 | push {lr} | 375 | push {lr} |
| 367 | mrs lr, SPSR | 376 | mrs lr, SPSR |
| 368 | push {lr} | 377 | push {lr} |
| @@ -378,7 +387,7 @@ THUMB( orr lr, #1) | |||
| 378 | pop {lr} | 387 | pop {lr} |
| 379 | msr SPSR_csxf, lr | 388 | msr SPSR_csxf, lr |
| 380 | pop {lr} | 389 | pop {lr} |
| 381 | eret | 390 | 1: eret |
| 382 | 391 | ||
| 383 | guest_trap: | 392 | guest_trap: |
| 384 | load_vcpu @ Load VCPU pointer to r0 | 393 | load_vcpu @ Load VCPU pointer to r0 |
diff --git a/arch/arm/mach-sa1100/include/mach/collie.h b/arch/arm/mach-sa1100/include/mach/collie.h index f33679d2d3ee..50e1d850ee2e 100644 --- a/arch/arm/mach-sa1100/include/mach/collie.h +++ b/arch/arm/mach-sa1100/include/mach/collie.h | |||
| @@ -13,6 +13,8 @@ | |||
| 13 | #ifndef __ASM_ARCH_COLLIE_H | 13 | #ifndef __ASM_ARCH_COLLIE_H |
| 14 | #define __ASM_ARCH_COLLIE_H | 14 | #define __ASM_ARCH_COLLIE_H |
| 15 | 15 | ||
| 16 | #include "hardware.h" /* Gives GPIO_MAX */ | ||
| 17 | |||
| 16 | extern void locomolcd_power(int on); | 18 | extern void locomolcd_power(int on); |
| 17 | 19 | ||
| 18 | #define COLLIE_SCOOP_GPIO_BASE (GPIO_MAX + 1) | 20 | #define COLLIE_SCOOP_GPIO_BASE (GPIO_MAX + 1) |
diff --git a/arch/arm/mm/dump.c b/arch/arm/mm/dump.c index 2b3a56414271..ef69152f9b52 100644 --- a/arch/arm/mm/dump.c +++ b/arch/arm/mm/dump.c | |||
| @@ -264,6 +264,9 @@ static void walk_pmd(struct pg_state *st, pud_t *pud, unsigned long start) | |||
| 264 | note_page(st, addr, 3, pmd_val(*pmd)); | 264 | note_page(st, addr, 3, pmd_val(*pmd)); |
| 265 | else | 265 | else |
| 266 | walk_pte(st, pmd, addr); | 266 | walk_pte(st, pmd, addr); |
| 267 | |||
| 268 | if (SECTION_SIZE < PMD_SIZE && pmd_large(pmd[1])) | ||
| 269 | note_page(st, addr + SECTION_SIZE, 3, pmd_val(pmd[1])); | ||
| 267 | } | 270 | } |
| 268 | } | 271 | } |
| 269 | 272 | ||
diff --git a/arch/arm64/include/asm/percpu.h b/arch/arm64/include/asm/percpu.h index 13fb0b3efc5f..453a179469a3 100644 --- a/arch/arm64/include/asm/percpu.h +++ b/arch/arm64/include/asm/percpu.h | |||
| @@ -16,6 +16,8 @@ | |||
| 16 | #ifndef __ASM_PERCPU_H | 16 | #ifndef __ASM_PERCPU_H |
| 17 | #define __ASM_PERCPU_H | 17 | #define __ASM_PERCPU_H |
| 18 | 18 | ||
| 19 | #ifdef CONFIG_SMP | ||
| 20 | |||
| 19 | static inline void set_my_cpu_offset(unsigned long off) | 21 | static inline void set_my_cpu_offset(unsigned long off) |
| 20 | { | 22 | { |
| 21 | asm volatile("msr tpidr_el1, %0" :: "r" (off) : "memory"); | 23 | asm volatile("msr tpidr_el1, %0" :: "r" (off) : "memory"); |
| @@ -36,6 +38,12 @@ static inline unsigned long __my_cpu_offset(void) | |||
| 36 | } | 38 | } |
| 37 | #define __my_cpu_offset __my_cpu_offset() | 39 | #define __my_cpu_offset __my_cpu_offset() |
| 38 | 40 | ||
| 41 | #else /* !CONFIG_SMP */ | ||
| 42 | |||
| 43 | #define set_my_cpu_offset(x) do { } while (0) | ||
| 44 | |||
| 45 | #endif /* CONFIG_SMP */ | ||
| 46 | |||
| 39 | #include <asm-generic/percpu.h> | 47 | #include <asm-generic/percpu.h> |
| 40 | 48 | ||
| 41 | #endif /* __ASM_PERCPU_H */ | 49 | #endif /* __ASM_PERCPU_H */ |
diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h index b524dcd17243..aa3917c8b623 100644 --- a/arch/arm64/include/asm/pgtable.h +++ b/arch/arm64/include/asm/pgtable.h | |||
| @@ -136,11 +136,11 @@ extern struct page *empty_zero_page; | |||
| 136 | /* | 136 | /* |
| 137 | * The following only work if pte_present(). Undefined behaviour otherwise. | 137 | * The following only work if pte_present(). Undefined behaviour otherwise. |
| 138 | */ | 138 | */ |
| 139 | #define pte_present(pte) (pte_val(pte) & (PTE_VALID | PTE_PROT_NONE)) | 139 | #define pte_present(pte) (!!(pte_val(pte) & (PTE_VALID | PTE_PROT_NONE))) |
| 140 | #define pte_dirty(pte) (pte_val(pte) & PTE_DIRTY) | 140 | #define pte_dirty(pte) (!!(pte_val(pte) & PTE_DIRTY)) |
| 141 | #define pte_young(pte) (pte_val(pte) & PTE_AF) | 141 | #define pte_young(pte) (!!(pte_val(pte) & PTE_AF)) |
| 142 | #define pte_special(pte) (pte_val(pte) & PTE_SPECIAL) | 142 | #define pte_special(pte) (!!(pte_val(pte) & PTE_SPECIAL)) |
| 143 | #define pte_write(pte) (pte_val(pte) & PTE_WRITE) | 143 | #define pte_write(pte) (!!(pte_val(pte) & PTE_WRITE)) |
| 144 | #define pte_exec(pte) (!(pte_val(pte) & PTE_UXN)) | 144 | #define pte_exec(pte) (!(pte_val(pte) & PTE_UXN)) |
| 145 | 145 | ||
| 146 | #define pte_valid_user(pte) \ | 146 | #define pte_valid_user(pte) \ |
diff --git a/arch/arm64/kernel/stacktrace.c b/arch/arm64/kernel/stacktrace.c index c3b6c63ea5fb..38f0558f0c0a 100644 --- a/arch/arm64/kernel/stacktrace.c +++ b/arch/arm64/kernel/stacktrace.c | |||
| @@ -48,7 +48,11 @@ int unwind_frame(struct stackframe *frame) | |||
| 48 | 48 | ||
| 49 | frame->sp = fp + 0x10; | 49 | frame->sp = fp + 0x10; |
| 50 | frame->fp = *(unsigned long *)(fp); | 50 | frame->fp = *(unsigned long *)(fp); |
| 51 | frame->pc = *(unsigned long *)(fp + 8); | 51 | /* |
| 52 | * -4 here because we care about the PC at time of bl, | ||
| 53 | * not where the return will go. | ||
| 54 | */ | ||
| 55 | frame->pc = *(unsigned long *)(fp + 8) - 4; | ||
| 52 | 56 | ||
| 53 | return 0; | 57 | return 0; |
| 54 | } | 58 | } |
diff --git a/arch/arm64/kvm/hyp.S b/arch/arm64/kvm/hyp.S index 3b47c36e10ff..2c56012cb2d2 100644 --- a/arch/arm64/kvm/hyp.S +++ b/arch/arm64/kvm/hyp.S | |||
| @@ -694,6 +694,24 @@ __hyp_panic_str: | |||
| 694 | 694 | ||
| 695 | .align 2 | 695 | .align 2 |
| 696 | 696 | ||
| 697 | /* | ||
| 698 | * u64 kvm_call_hyp(void *hypfn, ...); | ||
| 699 | * | ||
| 700 | * This is not really a variadic function in the classic C-way and care must | ||
| 701 | * be taken when calling this to ensure parameters are passed in registers | ||
| 702 | * only, since the stack will change between the caller and the callee. | ||
| 703 | * | ||
| 704 | * Call the function with the first argument containing a pointer to the | ||
| 705 | * function you wish to call in Hyp mode, and subsequent arguments will be | ||
| 706 | * passed as x0, x1, and x2 (a maximum of 3 arguments in addition to the | ||
| 707 | * function pointer can be passed). The function being called must be mapped | ||
| 708 | * in Hyp mode (see init_hyp_mode in arch/arm/kvm/arm.c). Return values are | ||
| 709 | * passed in r0 and r1. | ||
| 710 | * | ||
| 711 | * A function pointer with a value of 0 has a special meaning, and is | ||
| 712 | * used to implement __hyp_get_vectors in the same way as in | ||
| 713 | * arch/arm64/kernel/hyp_stub.S. | ||
| 714 | */ | ||
| 697 | ENTRY(kvm_call_hyp) | 715 | ENTRY(kvm_call_hyp) |
| 698 | hvc #0 | 716 | hvc #0 |
| 699 | ret | 717 | ret |
| @@ -737,7 +755,12 @@ el1_sync: // Guest trapped into EL2 | |||
| 737 | pop x2, x3 | 755 | pop x2, x3 |
| 738 | pop x0, x1 | 756 | pop x0, x1 |
| 739 | 757 | ||
| 740 | push lr, xzr | 758 | /* Check for __hyp_get_vectors */ |
| 759 | cbnz x0, 1f | ||
| 760 | mrs x0, vbar_el2 | ||
| 761 | b 2f | ||
| 762 | |||
| 763 | 1: push lr, xzr | ||
| 741 | 764 | ||
| 742 | /* | 765 | /* |
| 743 | * Compute the function address in EL2, and shuffle the parameters. | 766 | * Compute the function address in EL2, and shuffle the parameters. |
| @@ -750,7 +773,7 @@ el1_sync: // Guest trapped into EL2 | |||
| 750 | blr lr | 773 | blr lr |
| 751 | 774 | ||
| 752 | pop lr, xzr | 775 | pop lr, xzr |
| 753 | eret | 776 | 2: eret |
| 754 | 777 | ||
| 755 | el1_trap: | 778 | el1_trap: |
| 756 | /* | 779 | /* |
diff --git a/arch/c6x/include/asm/cache.h b/arch/c6x/include/asm/cache.h index 09c5a0f5f4d1..86648c083bb4 100644 --- a/arch/c6x/include/asm/cache.h +++ b/arch/c6x/include/asm/cache.h | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | #define _ASM_C6X_CACHE_H | 12 | #define _ASM_C6X_CACHE_H |
| 13 | 13 | ||
| 14 | #include <linux/irqflags.h> | 14 | #include <linux/irqflags.h> |
| 15 | #include <linux/init.h> | ||
| 15 | 16 | ||
| 16 | /* | 17 | /* |
| 17 | * Cache line size | 18 | * Cache line size |
diff --git a/arch/powerpc/include/asm/compat.h b/arch/powerpc/include/asm/compat.h index 84fdf6857c31..a613d2c82fd9 100644 --- a/arch/powerpc/include/asm/compat.h +++ b/arch/powerpc/include/asm/compat.h | |||
| @@ -200,10 +200,11 @@ static inline void __user *arch_compat_alloc_user_space(long len) | |||
| 200 | 200 | ||
| 201 | /* | 201 | /* |
| 202 | * We can't access below the stack pointer in the 32bit ABI and | 202 | * We can't access below the stack pointer in the 32bit ABI and |
| 203 | * can access 288 bytes in the 64bit ABI | 203 | * can access 288 bytes in the 64bit big-endian ABI, |
| 204 | * or 512 bytes with the new ELFv2 little-endian ABI. | ||
| 204 | */ | 205 | */ |
| 205 | if (!is_32bit_task()) | 206 | if (!is_32bit_task()) |
| 206 | usp -= 288; | 207 | usp -= USER_REDZONE_SIZE; |
| 207 | 208 | ||
| 208 | return (void __user *) (usp - len); | 209 | return (void __user *) (usp - len); |
| 209 | } | 210 | } |
diff --git a/arch/powerpc/include/asm/opal.h b/arch/powerpc/include/asm/opal.h index 40157e2ca691..ed82142a3251 100644 --- a/arch/powerpc/include/asm/opal.h +++ b/arch/powerpc/include/asm/opal.h | |||
| @@ -816,8 +816,8 @@ int64_t opal_pci_next_error(uint64_t phb_id, uint64_t *first_frozen_pe, | |||
| 816 | int64_t opal_pci_poll(uint64_t phb_id); | 816 | int64_t opal_pci_poll(uint64_t phb_id); |
| 817 | int64_t opal_return_cpu(void); | 817 | int64_t opal_return_cpu(void); |
| 818 | 818 | ||
| 819 | int64_t opal_xscom_read(uint32_t gcid, uint32_t pcb_addr, __be64 *val); | 819 | int64_t opal_xscom_read(uint32_t gcid, uint64_t pcb_addr, __be64 *val); |
| 820 | int64_t opal_xscom_write(uint32_t gcid, uint32_t pcb_addr, uint64_t val); | 820 | int64_t opal_xscom_write(uint32_t gcid, uint64_t pcb_addr, uint64_t val); |
| 821 | 821 | ||
| 822 | int64_t opal_lpc_write(uint32_t chip_id, enum OpalLPCAddressType addr_type, | 822 | int64_t opal_lpc_write(uint32_t chip_id, enum OpalLPCAddressType addr_type, |
| 823 | uint32_t addr, uint32_t data, uint32_t sz); | 823 | uint32_t addr, uint32_t data, uint32_t sz); |
diff --git a/arch/powerpc/include/asm/ptrace.h b/arch/powerpc/include/asm/ptrace.h index becc08e6a65c..279b80f3bb29 100644 --- a/arch/powerpc/include/asm/ptrace.h +++ b/arch/powerpc/include/asm/ptrace.h | |||
| @@ -28,11 +28,23 @@ | |||
| 28 | 28 | ||
| 29 | #ifdef __powerpc64__ | 29 | #ifdef __powerpc64__ |
| 30 | 30 | ||
| 31 | /* | ||
| 32 | * Size of redzone that userspace is allowed to use below the stack | ||
| 33 | * pointer. This is 288 in the 64-bit big-endian ELF ABI, and 512 in | ||
| 34 | * the new ELFv2 little-endian ABI, so we allow the larger amount. | ||
| 35 | * | ||
| 36 | * For kernel code we allow a 288-byte redzone, in order to conserve | ||
| 37 | * kernel stack space; gcc currently only uses 288 bytes, and will | ||
| 38 | * hopefully allow explicit control of the redzone size in future. | ||
| 39 | */ | ||
| 40 | #define USER_REDZONE_SIZE 512 | ||
| 41 | #define KERNEL_REDZONE_SIZE 288 | ||
| 42 | |||
| 31 | #define STACK_FRAME_OVERHEAD 112 /* size of minimum stack frame */ | 43 | #define STACK_FRAME_OVERHEAD 112 /* size of minimum stack frame */ |
| 32 | #define STACK_FRAME_LR_SAVE 2 /* Location of LR in stack frame */ | 44 | #define STACK_FRAME_LR_SAVE 2 /* Location of LR in stack frame */ |
| 33 | #define STACK_FRAME_REGS_MARKER ASM_CONST(0x7265677368657265) | 45 | #define STACK_FRAME_REGS_MARKER ASM_CONST(0x7265677368657265) |
| 34 | #define STACK_INT_FRAME_SIZE (sizeof(struct pt_regs) + \ | 46 | #define STACK_INT_FRAME_SIZE (sizeof(struct pt_regs) + \ |
| 35 | STACK_FRAME_OVERHEAD + 288) | 47 | STACK_FRAME_OVERHEAD + KERNEL_REDZONE_SIZE) |
| 36 | #define STACK_FRAME_MARKER 12 | 48 | #define STACK_FRAME_MARKER 12 |
| 37 | 49 | ||
| 38 | /* Size of dummy stack frame allocated when calling signal handler. */ | 50 | /* Size of dummy stack frame allocated when calling signal handler. */ |
| @@ -41,6 +53,8 @@ | |||
| 41 | 53 | ||
| 42 | #else /* __powerpc64__ */ | 54 | #else /* __powerpc64__ */ |
| 43 | 55 | ||
| 56 | #define USER_REDZONE_SIZE 0 | ||
| 57 | #define KERNEL_REDZONE_SIZE 0 | ||
| 44 | #define STACK_FRAME_OVERHEAD 16 /* size of minimum stack frame */ | 58 | #define STACK_FRAME_OVERHEAD 16 /* size of minimum stack frame */ |
| 45 | #define STACK_FRAME_LR_SAVE 1 /* Location of LR in stack frame */ | 59 | #define STACK_FRAME_LR_SAVE 1 /* Location of LR in stack frame */ |
| 46 | #define STACK_FRAME_REGS_MARKER ASM_CONST(0x72656773) | 60 | #define STACK_FRAME_REGS_MARKER ASM_CONST(0x72656773) |
diff --git a/arch/powerpc/kernel/crash_dump.c b/arch/powerpc/kernel/crash_dump.c index 11c1d069d920..7a13f378ca2c 100644 --- a/arch/powerpc/kernel/crash_dump.c +++ b/arch/powerpc/kernel/crash_dump.c | |||
| @@ -98,17 +98,19 @@ ssize_t copy_oldmem_page(unsigned long pfn, char *buf, | |||
| 98 | size_t csize, unsigned long offset, int userbuf) | 98 | size_t csize, unsigned long offset, int userbuf) |
| 99 | { | 99 | { |
| 100 | void *vaddr; | 100 | void *vaddr; |
| 101 | phys_addr_t paddr; | ||
| 101 | 102 | ||
| 102 | if (!csize) | 103 | if (!csize) |
| 103 | return 0; | 104 | return 0; |
| 104 | 105 | ||
| 105 | csize = min_t(size_t, csize, PAGE_SIZE); | 106 | csize = min_t(size_t, csize, PAGE_SIZE); |
| 107 | paddr = pfn << PAGE_SHIFT; | ||
| 106 | 108 | ||
| 107 | if ((min_low_pfn < pfn) && (pfn < max_pfn)) { | 109 | if (memblock_is_region_memory(paddr, csize)) { |
| 108 | vaddr = __va(pfn << PAGE_SHIFT); | 110 | vaddr = __va(paddr); |
| 109 | csize = copy_oldmem_vaddr(vaddr, buf, csize, offset, userbuf); | 111 | csize = copy_oldmem_vaddr(vaddr, buf, csize, offset, userbuf); |
| 110 | } else { | 112 | } else { |
| 111 | vaddr = __ioremap(pfn << PAGE_SHIFT, PAGE_SIZE, 0); | 113 | vaddr = __ioremap(paddr, PAGE_SIZE, 0); |
| 112 | csize = copy_oldmem_vaddr(vaddr, buf, csize, offset, userbuf); | 114 | csize = copy_oldmem_vaddr(vaddr, buf, csize, offset, userbuf); |
| 113 | iounmap(vaddr); | 115 | iounmap(vaddr); |
| 114 | } | 116 | } |
diff --git a/arch/powerpc/kernel/ftrace.c b/arch/powerpc/kernel/ftrace.c index 9b27b293a922..b0ded97ee4e1 100644 --- a/arch/powerpc/kernel/ftrace.c +++ b/arch/powerpc/kernel/ftrace.c | |||
| @@ -74,6 +74,7 @@ ftrace_modify_code(unsigned long ip, unsigned int old, unsigned int new) | |||
| 74 | */ | 74 | */ |
| 75 | static int test_24bit_addr(unsigned long ip, unsigned long addr) | 75 | static int test_24bit_addr(unsigned long ip, unsigned long addr) |
| 76 | { | 76 | { |
| 77 | addr = ppc_function_entry((void *)addr); | ||
| 77 | 78 | ||
| 78 | /* use the create_branch to verify that this offset can be branched */ | 79 | /* use the create_branch to verify that this offset can be branched */ |
| 79 | return create_branch((unsigned int *)ip, addr, 0); | 80 | return create_branch((unsigned int *)ip, addr, 0); |
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c index 8d4c247f1738..af064d28b365 100644 --- a/arch/powerpc/kernel/process.c +++ b/arch/powerpc/kernel/process.c | |||
| @@ -1048,6 +1048,15 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src) | |||
| 1048 | flush_altivec_to_thread(src); | 1048 | flush_altivec_to_thread(src); |
| 1049 | flush_vsx_to_thread(src); | 1049 | flush_vsx_to_thread(src); |
| 1050 | flush_spe_to_thread(src); | 1050 | flush_spe_to_thread(src); |
| 1051 | /* | ||
| 1052 | * Flush TM state out so we can copy it. __switch_to_tm() does this | ||
| 1053 | * flush but it removes the checkpointed state from the current CPU and | ||
| 1054 | * transitions the CPU out of TM mode. Hence we need to call | ||
| 1055 | * tm_recheckpoint_new_task() (on the same task) to restore the | ||
| 1056 | * checkpointed state back and the TM mode. | ||
| 1057 | */ | ||
| 1058 | __switch_to_tm(src); | ||
| 1059 | tm_recheckpoint_new_task(src); | ||
| 1051 | 1060 | ||
| 1052 | *dst = *src; | 1061 | *dst = *src; |
| 1053 | 1062 | ||
diff --git a/arch/powerpc/kernel/reloc_64.S b/arch/powerpc/kernel/reloc_64.S index 1482327cfeba..d88736fbece6 100644 --- a/arch/powerpc/kernel/reloc_64.S +++ b/arch/powerpc/kernel/reloc_64.S | |||
| @@ -81,6 +81,7 @@ _GLOBAL(relocate) | |||
| 81 | 81 | ||
| 82 | 6: blr | 82 | 6: blr |
| 83 | 83 | ||
| 84 | .balign 8 | ||
| 84 | p_dyn: .llong __dynamic_start - 0b | 85 | p_dyn: .llong __dynamic_start - 0b |
| 85 | p_rela: .llong __rela_dyn_start - 0b | 86 | p_rela: .llong __rela_dyn_start - 0b |
| 86 | p_st: .llong _stext - 0b | 87 | p_st: .llong _stext - 0b |
diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c index e35bf773df7a..8d253c29649b 100644 --- a/arch/powerpc/kernel/signal_64.c +++ b/arch/powerpc/kernel/signal_64.c | |||
| @@ -65,8 +65,8 @@ struct rt_sigframe { | |||
| 65 | struct siginfo __user *pinfo; | 65 | struct siginfo __user *pinfo; |
| 66 | void __user *puc; | 66 | void __user *puc; |
| 67 | struct siginfo info; | 67 | struct siginfo info; |
| 68 | /* 64 bit ABI allows for 288 bytes below sp before decrementing it. */ | 68 | /* New 64 bit little-endian ABI allows redzone of 512 bytes below sp */ |
| 69 | char abigap[288]; | 69 | char abigap[USER_REDZONE_SIZE]; |
| 70 | } __attribute__ ((aligned (16))); | 70 | } __attribute__ ((aligned (16))); |
| 71 | 71 | ||
| 72 | static const char fmt32[] = KERN_INFO \ | 72 | static const char fmt32[] = KERN_INFO \ |
diff --git a/arch/powerpc/platforms/powernv/eeh-ioda.c b/arch/powerpc/platforms/powernv/eeh-ioda.c index f51474336460..253fefe3d1a0 100644 --- a/arch/powerpc/platforms/powernv/eeh-ioda.c +++ b/arch/powerpc/platforms/powernv/eeh-ioda.c | |||
| @@ -114,6 +114,7 @@ DEFINE_SIMPLE_ATTRIBUTE(ioda_eeh_inbB_dbgfs_ops, ioda_eeh_inbB_dbgfs_get, | |||
| 114 | ioda_eeh_inbB_dbgfs_set, "0x%llx\n"); | 114 | ioda_eeh_inbB_dbgfs_set, "0x%llx\n"); |
| 115 | #endif /* CONFIG_DEBUG_FS */ | 115 | #endif /* CONFIG_DEBUG_FS */ |
| 116 | 116 | ||
| 117 | |||
| 117 | /** | 118 | /** |
| 118 | * ioda_eeh_post_init - Chip dependent post initialization | 119 | * ioda_eeh_post_init - Chip dependent post initialization |
| 119 | * @hose: PCI controller | 120 | * @hose: PCI controller |
| @@ -221,6 +222,22 @@ static int ioda_eeh_set_option(struct eeh_pe *pe, int option) | |||
| 221 | return ret; | 222 | return ret; |
| 222 | } | 223 | } |
| 223 | 224 | ||
| 225 | static void ioda_eeh_phb_diag(struct pci_controller *hose) | ||
| 226 | { | ||
| 227 | struct pnv_phb *phb = hose->private_data; | ||
| 228 | long rc; | ||
| 229 | |||
| 230 | rc = opal_pci_get_phb_diag_data2(phb->opal_id, phb->diag.blob, | ||
| 231 | PNV_PCI_DIAG_BUF_SIZE); | ||
| 232 | if (rc != OPAL_SUCCESS) { | ||
| 233 | pr_warning("%s: Failed to get diag-data for PHB#%x (%ld)\n", | ||
| 234 | __func__, hose->global_number, rc); | ||
| 235 | return; | ||
| 236 | } | ||
| 237 | |||
| 238 | pnv_pci_dump_phb_diag_data(hose, phb->diag.blob); | ||
| 239 | } | ||
| 240 | |||
| 224 | /** | 241 | /** |
| 225 | * ioda_eeh_get_state - Retrieve the state of PE | 242 | * ioda_eeh_get_state - Retrieve the state of PE |
| 226 | * @pe: EEH PE | 243 | * @pe: EEH PE |
| @@ -272,6 +289,9 @@ static int ioda_eeh_get_state(struct eeh_pe *pe) | |||
| 272 | result |= EEH_STATE_DMA_ACTIVE; | 289 | result |= EEH_STATE_DMA_ACTIVE; |
| 273 | result |= EEH_STATE_MMIO_ENABLED; | 290 | result |= EEH_STATE_MMIO_ENABLED; |
| 274 | result |= EEH_STATE_DMA_ENABLED; | 291 | result |= EEH_STATE_DMA_ENABLED; |
| 292 | } else if (!(pe->state & EEH_PE_ISOLATED)) { | ||
| 293 | eeh_pe_state_mark(pe, EEH_PE_ISOLATED); | ||
| 294 | ioda_eeh_phb_diag(hose); | ||
| 275 | } | 295 | } |
| 276 | 296 | ||
| 277 | return result; | 297 | return result; |
| @@ -315,6 +335,15 @@ static int ioda_eeh_get_state(struct eeh_pe *pe) | |||
| 315 | __func__, fstate, hose->global_number, pe_no); | 335 | __func__, fstate, hose->global_number, pe_no); |
| 316 | } | 336 | } |
| 317 | 337 | ||
| 338 | /* Dump PHB diag-data for frozen PE */ | ||
| 339 | if (result != EEH_STATE_NOT_SUPPORT && | ||
| 340 | (result & (EEH_STATE_MMIO_ACTIVE | EEH_STATE_DMA_ACTIVE)) != | ||
| 341 | (EEH_STATE_MMIO_ACTIVE | EEH_STATE_DMA_ACTIVE) && | ||
| 342 | !(pe->state & EEH_PE_ISOLATED)) { | ||
| 343 | eeh_pe_state_mark(pe, EEH_PE_ISOLATED); | ||
| 344 | ioda_eeh_phb_diag(hose); | ||
| 345 | } | ||
| 346 | |||
| 318 | return result; | 347 | return result; |
| 319 | } | 348 | } |
| 320 | 349 | ||
| @@ -530,42 +559,6 @@ static int ioda_eeh_reset(struct eeh_pe *pe, int option) | |||
| 530 | } | 559 | } |
| 531 | 560 | ||
| 532 | /** | 561 | /** |
| 533 | * ioda_eeh_get_log - Retrieve error log | ||
| 534 | * @pe: EEH PE | ||
| 535 | * @severity: Severity level of the log | ||
| 536 | * @drv_log: buffer to store the log | ||
| 537 | * @len: space of the log buffer | ||
| 538 | * | ||
| 539 | * The function is used to retrieve error log from P7IOC. | ||
| 540 | */ | ||
| 541 | static int ioda_eeh_get_log(struct eeh_pe *pe, int severity, | ||
| 542 | char *drv_log, unsigned long len) | ||
| 543 | { | ||
| 544 | s64 ret; | ||
| 545 | unsigned long flags; | ||
| 546 | struct pci_controller *hose = pe->phb; | ||
| 547 | struct pnv_phb *phb = hose->private_data; | ||
| 548 | |||
| 549 | spin_lock_irqsave(&phb->lock, flags); | ||
| 550 | |||
| 551 | ret = opal_pci_get_phb_diag_data2(phb->opal_id, | ||
| 552 | phb->diag.blob, PNV_PCI_DIAG_BUF_SIZE); | ||
| 553 | if (ret) { | ||
| 554 | spin_unlock_irqrestore(&phb->lock, flags); | ||
| 555 | pr_warning("%s: Can't get log for PHB#%x-PE#%x (%lld)\n", | ||
| 556 | __func__, hose->global_number, pe->addr, ret); | ||
| 557 | return -EIO; | ||
| 558 | } | ||
| 559 | |||
| 560 | /* The PHB diag-data is always indicative */ | ||
| 561 | pnv_pci_dump_phb_diag_data(hose, phb->diag.blob); | ||
| 562 | |||
| 563 | spin_unlock_irqrestore(&phb->lock, flags); | ||
| 564 | |||
| 565 | return 0; | ||
| 566 | } | ||
| 567 | |||
| 568 | /** | ||
| 569 | * ioda_eeh_configure_bridge - Configure the PCI bridges for the indicated PE | 562 | * ioda_eeh_configure_bridge - Configure the PCI bridges for the indicated PE |
| 570 | * @pe: EEH PE | 563 | * @pe: EEH PE |
| 571 | * | 564 | * |
| @@ -646,22 +639,6 @@ static void ioda_eeh_hub_diag(struct pci_controller *hose) | |||
| 646 | } | 639 | } |
| 647 | } | 640 | } |
| 648 | 641 | ||
| 649 | static void ioda_eeh_phb_diag(struct pci_controller *hose) | ||
| 650 | { | ||
| 651 | struct pnv_phb *phb = hose->private_data; | ||
| 652 | long rc; | ||
| 653 | |||
| 654 | rc = opal_pci_get_phb_diag_data2(phb->opal_id, phb->diag.blob, | ||
| 655 | PNV_PCI_DIAG_BUF_SIZE); | ||
| 656 | if (rc != OPAL_SUCCESS) { | ||
| 657 | pr_warning("%s: Failed to get diag-data for PHB#%x (%ld)\n", | ||
| 658 | __func__, hose->global_number, rc); | ||
| 659 | return; | ||
| 660 | } | ||
| 661 | |||
| 662 | pnv_pci_dump_phb_diag_data(hose, phb->diag.blob); | ||
| 663 | } | ||
| 664 | |||
| 665 | static int ioda_eeh_get_phb_pe(struct pci_controller *hose, | 642 | static int ioda_eeh_get_phb_pe(struct pci_controller *hose, |
| 666 | struct eeh_pe **pe) | 643 | struct eeh_pe **pe) |
| 667 | { | 644 | { |
| @@ -835,6 +812,20 @@ static int ioda_eeh_next_error(struct eeh_pe **pe) | |||
| 835 | } | 812 | } |
| 836 | 813 | ||
| 837 | /* | 814 | /* |
| 815 | * EEH core will try recover from fenced PHB or | ||
| 816 | * frozen PE. In the time for frozen PE, EEH core | ||
| 817 | * enable IO path for that before collecting logs, | ||
| 818 | * but it ruins the site. So we have to dump the | ||
| 819 | * log in advance here. | ||
| 820 | */ | ||
| 821 | if ((ret == EEH_NEXT_ERR_FROZEN_PE || | ||
| 822 | ret == EEH_NEXT_ERR_FENCED_PHB) && | ||
| 823 | !((*pe)->state & EEH_PE_ISOLATED)) { | ||
| 824 | eeh_pe_state_mark(*pe, EEH_PE_ISOLATED); | ||
| 825 | ioda_eeh_phb_diag(hose); | ||
| 826 | } | ||
| 827 | |||
| 828 | /* | ||
| 838 | * If we have no errors on the specific PHB or only | 829 | * If we have no errors on the specific PHB or only |
| 839 | * informative error there, we continue poking it. | 830 | * informative error there, we continue poking it. |
| 840 | * Otherwise, we need actions to be taken by upper | 831 | * Otherwise, we need actions to be taken by upper |
| @@ -852,7 +843,6 @@ struct pnv_eeh_ops ioda_eeh_ops = { | |||
| 852 | .set_option = ioda_eeh_set_option, | 843 | .set_option = ioda_eeh_set_option, |
| 853 | .get_state = ioda_eeh_get_state, | 844 | .get_state = ioda_eeh_get_state, |
| 854 | .reset = ioda_eeh_reset, | 845 | .reset = ioda_eeh_reset, |
| 855 | .get_log = ioda_eeh_get_log, | ||
| 856 | .configure_bridge = ioda_eeh_configure_bridge, | 846 | .configure_bridge = ioda_eeh_configure_bridge, |
| 857 | .next_error = ioda_eeh_next_error | 847 | .next_error = ioda_eeh_next_error |
| 858 | }; | 848 | }; |
diff --git a/arch/powerpc/platforms/powernv/opal-xscom.c b/arch/powerpc/platforms/powernv/opal-xscom.c index 4fbf276ac99e..4cd2ea6c0dbe 100644 --- a/arch/powerpc/platforms/powernv/opal-xscom.c +++ b/arch/powerpc/platforms/powernv/opal-xscom.c | |||
| @@ -71,11 +71,11 @@ static int opal_xscom_err_xlate(int64_t rc) | |||
| 71 | } | 71 | } |
| 72 | } | 72 | } |
| 73 | 73 | ||
| 74 | static u64 opal_scom_unmangle(u64 reg) | 74 | static u64 opal_scom_unmangle(u64 addr) |
| 75 | { | 75 | { |
| 76 | /* | 76 | /* |
| 77 | * XSCOM indirect addresses have the top bit set. Additionally | 77 | * XSCOM indirect addresses have the top bit set. Additionally |
| 78 | * the reset of the top 3 nibbles is always 0. | 78 | * the rest of the top 3 nibbles is always 0. |
| 79 | * | 79 | * |
| 80 | * Because the debugfs interface uses signed offsets and shifts | 80 | * Because the debugfs interface uses signed offsets and shifts |
| 81 | * the address left by 3, we basically cannot use the top 4 bits | 81 | * the address left by 3, we basically cannot use the top 4 bits |
| @@ -86,10 +86,13 @@ static u64 opal_scom_unmangle(u64 reg) | |||
| 86 | * conversion here. To leave room for further xscom address | 86 | * conversion here. To leave room for further xscom address |
| 87 | * expansion, we only clear out the top byte | 87 | * expansion, we only clear out the top byte |
| 88 | * | 88 | * |
| 89 | * For in-kernel use, we also support the real indirect bit, so | ||
| 90 | * we test for any of the top 5 bits | ||
| 91 | * | ||
| 89 | */ | 92 | */ |
| 90 | if (reg & (1ull << 59)) | 93 | if (addr & (0x1full << 59)) |
| 91 | reg = (reg & ~(0xffull << 56)) | (1ull << 63); | 94 | addr = (addr & ~(0xffull << 56)) | (1ull << 63); |
| 92 | return reg; | 95 | return addr; |
| 93 | } | 96 | } |
| 94 | 97 | ||
| 95 | static int opal_scom_read(scom_map_t map, u64 reg, u64 *value) | 98 | static int opal_scom_read(scom_map_t map, u64 reg, u64 *value) |
| @@ -98,8 +101,8 @@ static int opal_scom_read(scom_map_t map, u64 reg, u64 *value) | |||
| 98 | int64_t rc; | 101 | int64_t rc; |
| 99 | __be64 v; | 102 | __be64 v; |
| 100 | 103 | ||
| 101 | reg = opal_scom_unmangle(reg); | 104 | reg = opal_scom_unmangle(m->addr + reg); |
| 102 | rc = opal_xscom_read(m->chip, m->addr + reg, (__be64 *)__pa(&v)); | 105 | rc = opal_xscom_read(m->chip, reg, (__be64 *)__pa(&v)); |
| 103 | *value = be64_to_cpu(v); | 106 | *value = be64_to_cpu(v); |
| 104 | return opal_xscom_err_xlate(rc); | 107 | return opal_xscom_err_xlate(rc); |
| 105 | } | 108 | } |
| @@ -109,8 +112,8 @@ static int opal_scom_write(scom_map_t map, u64 reg, u64 value) | |||
| 109 | struct opal_scom_map *m = map; | 112 | struct opal_scom_map *m = map; |
| 110 | int64_t rc; | 113 | int64_t rc; |
| 111 | 114 | ||
| 112 | reg = opal_scom_unmangle(reg); | 115 | reg = opal_scom_unmangle(m->addr + reg); |
| 113 | rc = opal_xscom_write(m->chip, m->addr + reg, value); | 116 | rc = opal_xscom_write(m->chip, reg, value); |
| 114 | return opal_xscom_err_xlate(rc); | 117 | return opal_xscom_err_xlate(rc); |
| 115 | } | 118 | } |
| 116 | 119 | ||
diff --git a/arch/powerpc/platforms/powernv/pci.c b/arch/powerpc/platforms/powernv/pci.c index 95633d79ef5d..8518817dcdfd 100644 --- a/arch/powerpc/platforms/powernv/pci.c +++ b/arch/powerpc/platforms/powernv/pci.c | |||
| @@ -134,57 +134,72 @@ static void pnv_pci_dump_p7ioc_diag_data(struct pci_controller *hose, | |||
| 134 | pr_info("P7IOC PHB#%d Diag-data (Version: %d)\n\n", | 134 | pr_info("P7IOC PHB#%d Diag-data (Version: %d)\n\n", |
| 135 | hose->global_number, common->version); | 135 | hose->global_number, common->version); |
| 136 | 136 | ||
| 137 | pr_info(" brdgCtl: %08x\n", data->brdgCtl); | 137 | if (data->brdgCtl) |
| 138 | 138 | pr_info(" brdgCtl: %08x\n", | |
| 139 | pr_info(" portStatusReg: %08x\n", data->portStatusReg); | 139 | data->brdgCtl); |
| 140 | pr_info(" rootCmplxStatus: %08x\n", data->rootCmplxStatus); | 140 | if (data->portStatusReg || data->rootCmplxStatus || |
| 141 | pr_info(" busAgentStatus: %08x\n", data->busAgentStatus); | 141 | data->busAgentStatus) |
| 142 | 142 | pr_info(" UtlSts: %08x %08x %08x\n", | |
| 143 | pr_info(" deviceStatus: %08x\n", data->deviceStatus); | 143 | data->portStatusReg, data->rootCmplxStatus, |
| 144 | pr_info(" slotStatus: %08x\n", data->slotStatus); | 144 | data->busAgentStatus); |
| 145 | pr_info(" linkStatus: %08x\n", data->linkStatus); | 145 | if (data->deviceStatus || data->slotStatus || |
| 146 | pr_info(" devCmdStatus: %08x\n", data->devCmdStatus); | 146 | data->linkStatus || data->devCmdStatus || |
| 147 | pr_info(" devSecStatus: %08x\n", data->devSecStatus); | 147 | data->devSecStatus) |
| 148 | 148 | pr_info(" RootSts: %08x %08x %08x %08x %08x\n", | |
| 149 | pr_info(" rootErrorStatus: %08x\n", data->rootErrorStatus); | 149 | data->deviceStatus, data->slotStatus, |
| 150 | pr_info(" uncorrErrorStatus: %08x\n", data->uncorrErrorStatus); | 150 | data->linkStatus, data->devCmdStatus, |
| 151 | pr_info(" corrErrorStatus: %08x\n", data->corrErrorStatus); | 151 | data->devSecStatus); |
| 152 | pr_info(" tlpHdr1: %08x\n", data->tlpHdr1); | 152 | if (data->rootErrorStatus || data->uncorrErrorStatus || |
| 153 | pr_info(" tlpHdr2: %08x\n", data->tlpHdr2); | 153 | data->corrErrorStatus) |
| 154 | pr_info(" tlpHdr3: %08x\n", data->tlpHdr3); | 154 | pr_info(" RootErrSts: %08x %08x %08x\n", |
| 155 | pr_info(" tlpHdr4: %08x\n", data->tlpHdr4); | 155 | data->rootErrorStatus, data->uncorrErrorStatus, |
| 156 | pr_info(" sourceId: %08x\n", data->sourceId); | 156 | data->corrErrorStatus); |
| 157 | pr_info(" errorClass: %016llx\n", data->errorClass); | 157 | if (data->tlpHdr1 || data->tlpHdr2 || |
| 158 | pr_info(" correlator: %016llx\n", data->correlator); | 158 | data->tlpHdr3 || data->tlpHdr4) |
| 159 | pr_info(" p7iocPlssr: %016llx\n", data->p7iocPlssr); | 159 | pr_info(" RootErrLog: %08x %08x %08x %08x\n", |
| 160 | pr_info(" p7iocCsr: %016llx\n", data->p7iocCsr); | 160 | data->tlpHdr1, data->tlpHdr2, |
| 161 | pr_info(" lemFir: %016llx\n", data->lemFir); | 161 | data->tlpHdr3, data->tlpHdr4); |
| 162 | pr_info(" lemErrorMask: %016llx\n", data->lemErrorMask); | 162 | if (data->sourceId || data->errorClass || |
| 163 | pr_info(" lemWOF: %016llx\n", data->lemWOF); | 163 | data->correlator) |
| 164 | pr_info(" phbErrorStatus: %016llx\n", data->phbErrorStatus); | 164 | pr_info(" RootErrLog1: %08x %016llx %016llx\n", |
| 165 | pr_info(" phbFirstErrorStatus: %016llx\n", data->phbFirstErrorStatus); | 165 | data->sourceId, data->errorClass, |
| 166 | pr_info(" phbErrorLog0: %016llx\n", data->phbErrorLog0); | 166 | data->correlator); |
| 167 | pr_info(" phbErrorLog1: %016llx\n", data->phbErrorLog1); | 167 | if (data->p7iocPlssr || data->p7iocCsr) |
| 168 | pr_info(" mmioErrorStatus: %016llx\n", data->mmioErrorStatus); | 168 | pr_info(" PhbSts: %016llx %016llx\n", |
| 169 | pr_info(" mmioFirstErrorStatus: %016llx\n", data->mmioFirstErrorStatus); | 169 | data->p7iocPlssr, data->p7iocCsr); |
| 170 | pr_info(" mmioErrorLog0: %016llx\n", data->mmioErrorLog0); | 170 | if (data->lemFir || data->lemErrorMask || |
| 171 | pr_info(" mmioErrorLog1: %016llx\n", data->mmioErrorLog1); | 171 | data->lemWOF) |
| 172 | pr_info(" dma0ErrorStatus: %016llx\n", data->dma0ErrorStatus); | 172 | pr_info(" Lem: %016llx %016llx %016llx\n", |
| 173 | pr_info(" dma0FirstErrorStatus: %016llx\n", data->dma0FirstErrorStatus); | 173 | data->lemFir, data->lemErrorMask, |
| 174 | pr_info(" dma0ErrorLog0: %016llx\n", data->dma0ErrorLog0); | 174 | data->lemWOF); |
| 175 | pr_info(" dma0ErrorLog1: %016llx\n", data->dma0ErrorLog1); | 175 | if (data->phbErrorStatus || data->phbFirstErrorStatus || |
| 176 | pr_info(" dma1ErrorStatus: %016llx\n", data->dma1ErrorStatus); | 176 | data->phbErrorLog0 || data->phbErrorLog1) |
| 177 | pr_info(" dma1FirstErrorStatus: %016llx\n", data->dma1FirstErrorStatus); | 177 | pr_info(" PhbErr: %016llx %016llx %016llx %016llx\n", |
| 178 | pr_info(" dma1ErrorLog0: %016llx\n", data->dma1ErrorLog0); | 178 | data->phbErrorStatus, data->phbFirstErrorStatus, |
| 179 | pr_info(" dma1ErrorLog1: %016llx\n", data->dma1ErrorLog1); | 179 | data->phbErrorLog0, data->phbErrorLog1); |
| 180 | if (data->mmioErrorStatus || data->mmioFirstErrorStatus || | ||
| 181 | data->mmioErrorLog0 || data->mmioErrorLog1) | ||
| 182 | pr_info(" OutErr: %016llx %016llx %016llx %016llx\n", | ||
| 183 | data->mmioErrorStatus, data->mmioFirstErrorStatus, | ||
| 184 | data->mmioErrorLog0, data->mmioErrorLog1); | ||
| 185 | if (data->dma0ErrorStatus || data->dma0FirstErrorStatus || | ||
| 186 | data->dma0ErrorLog0 || data->dma0ErrorLog1) | ||
| 187 | pr_info(" InAErr: %016llx %016llx %016llx %016llx\n", | ||
| 188 | data->dma0ErrorStatus, data->dma0FirstErrorStatus, | ||
| 189 | data->dma0ErrorLog0, data->dma0ErrorLog1); | ||
| 190 | if (data->dma1ErrorStatus || data->dma1FirstErrorStatus || | ||
| 191 | data->dma1ErrorLog0 || data->dma1ErrorLog1) | ||
| 192 | pr_info(" InBErr: %016llx %016llx %016llx %016llx\n", | ||
| 193 | data->dma1ErrorStatus, data->dma1FirstErrorStatus, | ||
| 194 | data->dma1ErrorLog0, data->dma1ErrorLog1); | ||
| 180 | 195 | ||
| 181 | for (i = 0; i < OPAL_P7IOC_NUM_PEST_REGS; i++) { | 196 | for (i = 0; i < OPAL_P7IOC_NUM_PEST_REGS; i++) { |
| 182 | if ((data->pestA[i] >> 63) == 0 && | 197 | if ((data->pestA[i] >> 63) == 0 && |
| 183 | (data->pestB[i] >> 63) == 0) | 198 | (data->pestB[i] >> 63) == 0) |
| 184 | continue; | 199 | continue; |
| 185 | 200 | ||
| 186 | pr_info(" PE[%3d] PESTA: %016llx\n", i, data->pestA[i]); | 201 | pr_info(" PE[%3d] A/B: %016llx %016llx\n", |
| 187 | pr_info(" PESTB: %016llx\n", data->pestB[i]); | 202 | i, data->pestA[i], data->pestB[i]); |
| 188 | } | 203 | } |
| 189 | } | 204 | } |
| 190 | 205 | ||
| @@ -197,62 +212,77 @@ static void pnv_pci_dump_phb3_diag_data(struct pci_controller *hose, | |||
| 197 | data = (struct OpalIoPhb3ErrorData*)common; | 212 | data = (struct OpalIoPhb3ErrorData*)common; |
| 198 | pr_info("PHB3 PHB#%d Diag-data (Version: %d)\n\n", | 213 | pr_info("PHB3 PHB#%d Diag-data (Version: %d)\n\n", |
| 199 | hose->global_number, common->version); | 214 | hose->global_number, common->version); |
| 200 | 215 | if (data->brdgCtl) | |
| 201 | pr_info(" brdgCtl: %08x\n", data->brdgCtl); | 216 | pr_info(" brdgCtl: %08x\n", |
| 202 | 217 | data->brdgCtl); | |
| 203 | pr_info(" portStatusReg: %08x\n", data->portStatusReg); | 218 | if (data->portStatusReg || data->rootCmplxStatus || |
| 204 | pr_info(" rootCmplxStatus: %08x\n", data->rootCmplxStatus); | 219 | data->busAgentStatus) |
| 205 | pr_info(" busAgentStatus: %08x\n", data->busAgentStatus); | 220 | pr_info(" UtlSts: %08x %08x %08x\n", |
| 206 | 221 | data->portStatusReg, data->rootCmplxStatus, | |
| 207 | pr_info(" deviceStatus: %08x\n", data->deviceStatus); | 222 | data->busAgentStatus); |
| 208 | pr_info(" slotStatus: %08x\n", data->slotStatus); | 223 | if (data->deviceStatus || data->slotStatus || |
| 209 | pr_info(" linkStatus: %08x\n", data->linkStatus); | 224 | data->linkStatus || data->devCmdStatus || |
| 210 | pr_info(" devCmdStatus: %08x\n", data->devCmdStatus); | 225 | data->devSecStatus) |
| 211 | pr_info(" devSecStatus: %08x\n", data->devSecStatus); | 226 | pr_info(" RootSts: %08x %08x %08x %08x %08x\n", |
| 212 | 227 | data->deviceStatus, data->slotStatus, | |
| 213 | pr_info(" rootErrorStatus: %08x\n", data->rootErrorStatus); | 228 | data->linkStatus, data->devCmdStatus, |
| 214 | pr_info(" uncorrErrorStatus: %08x\n", data->uncorrErrorStatus); | 229 | data->devSecStatus); |
| 215 | pr_info(" corrErrorStatus: %08x\n", data->corrErrorStatus); | 230 | if (data->rootErrorStatus || data->uncorrErrorStatus || |
| 216 | pr_info(" tlpHdr1: %08x\n", data->tlpHdr1); | 231 | data->corrErrorStatus) |
| 217 | pr_info(" tlpHdr2: %08x\n", data->tlpHdr2); | 232 | pr_info(" RootErrSts: %08x %08x %08x\n", |
| 218 | pr_info(" tlpHdr3: %08x\n", data->tlpHdr3); | 233 | data->rootErrorStatus, data->uncorrErrorStatus, |
| 219 | pr_info(" tlpHdr4: %08x\n", data->tlpHdr4); | 234 | data->corrErrorStatus); |
| 220 | pr_info(" sourceId: %08x\n", data->sourceId); | 235 | if (data->tlpHdr1 || data->tlpHdr2 || |
| 221 | pr_info(" errorClass: %016llx\n", data->errorClass); | 236 | data->tlpHdr3 || data->tlpHdr4) |
| 222 | pr_info(" correlator: %016llx\n", data->correlator); | 237 | pr_info(" RootErrLog: %08x %08x %08x %08x\n", |
| 223 | 238 | data->tlpHdr1, data->tlpHdr2, | |
| 224 | pr_info(" nFir: %016llx\n", data->nFir); | 239 | data->tlpHdr3, data->tlpHdr4); |
| 225 | pr_info(" nFirMask: %016llx\n", data->nFirMask); | 240 | if (data->sourceId || data->errorClass || |
| 226 | pr_info(" nFirWOF: %016llx\n", data->nFirWOF); | 241 | data->correlator) |
| 227 | pr_info(" PhbPlssr: %016llx\n", data->phbPlssr); | 242 | pr_info(" RootErrLog1: %08x %016llx %016llx\n", |
| 228 | pr_info(" PhbCsr: %016llx\n", data->phbCsr); | 243 | data->sourceId, data->errorClass, |
| 229 | pr_info(" lemFir: %016llx\n", data->lemFir); | 244 | data->correlator); |
| 230 | pr_info(" lemErrorMask: %016llx\n", data->lemErrorMask); | 245 | if (data->nFir || data->nFirMask || |
| 231 | pr_info(" lemWOF: %016llx\n", data->lemWOF); | 246 | data->nFirWOF) |
| 232 | pr_info(" phbErrorStatus: %016llx\n", data->phbErrorStatus); | 247 | pr_info(" nFir: %016llx %016llx %016llx\n", |
| 233 | pr_info(" phbFirstErrorStatus: %016llx\n", data->phbFirstErrorStatus); | 248 | data->nFir, data->nFirMask, |
| 234 | pr_info(" phbErrorLog0: %016llx\n", data->phbErrorLog0); | 249 | data->nFirWOF); |
| 235 | pr_info(" phbErrorLog1: %016llx\n", data->phbErrorLog1); | 250 | if (data->phbPlssr || data->phbCsr) |
| 236 | pr_info(" mmioErrorStatus: %016llx\n", data->mmioErrorStatus); | 251 | pr_info(" PhbSts: %016llx %016llx\n", |
| 237 | pr_info(" mmioFirstErrorStatus: %016llx\n", data->mmioFirstErrorStatus); | 252 | data->phbPlssr, data->phbCsr); |
| 238 | pr_info(" mmioErrorLog0: %016llx\n", data->mmioErrorLog0); | 253 | if (data->lemFir || data->lemErrorMask || |
| 239 | pr_info(" mmioErrorLog1: %016llx\n", data->mmioErrorLog1); | 254 | data->lemWOF) |
| 240 | pr_info(" dma0ErrorStatus: %016llx\n", data->dma0ErrorStatus); | 255 | pr_info(" Lem: %016llx %016llx %016llx\n", |
| 241 | pr_info(" dma0FirstErrorStatus: %016llx\n", data->dma0FirstErrorStatus); | 256 | data->lemFir, data->lemErrorMask, |
| 242 | pr_info(" dma0ErrorLog0: %016llx\n", data->dma0ErrorLog0); | 257 | data->lemWOF); |
| 243 | pr_info(" dma0ErrorLog1: %016llx\n", data->dma0ErrorLog1); | 258 | if (data->phbErrorStatus || data->phbFirstErrorStatus || |
| 244 | pr_info(" dma1ErrorStatus: %016llx\n", data->dma1ErrorStatus); | 259 | data->phbErrorLog0 || data->phbErrorLog1) |
| 245 | pr_info(" dma1FirstErrorStatus: %016llx\n", data->dma1FirstErrorStatus); | 260 | pr_info(" PhbErr: %016llx %016llx %016llx %016llx\n", |
| 246 | pr_info(" dma1ErrorLog0: %016llx\n", data->dma1ErrorLog0); | 261 | data->phbErrorStatus, data->phbFirstErrorStatus, |
| 247 | pr_info(" dma1ErrorLog1: %016llx\n", data->dma1ErrorLog1); | 262 | data->phbErrorLog0, data->phbErrorLog1); |
| 263 | if (data->mmioErrorStatus || data->mmioFirstErrorStatus || | ||
| 264 | data->mmioErrorLog0 || data->mmioErrorLog1) | ||
| 265 | pr_info(" OutErr: %016llx %016llx %016llx %016llx\n", | ||
| 266 | data->mmioErrorStatus, data->mmioFirstErrorStatus, | ||
| 267 | data->mmioErrorLog0, data->mmioErrorLog1); | ||
| 268 | if (data->dma0ErrorStatus || data->dma0FirstErrorStatus || | ||
| 269 | data->dma0ErrorLog0 || data->dma0ErrorLog1) | ||
| 270 | pr_info(" InAErr: %016llx %016llx %016llx %016llx\n", | ||
| 271 | data->dma0ErrorStatus, data->dma0FirstErrorStatus, | ||
| 272 | data->dma0ErrorLog0, data->dma0ErrorLog1); | ||
| 273 | if (data->dma1ErrorStatus || data->dma1FirstErrorStatus || | ||
| 274 | data->dma1ErrorLog0 || data->dma1ErrorLog1) | ||
| 275 | pr_info(" InBErr: %016llx %016llx %016llx %016llx\n", | ||
| 276 | data->dma1ErrorStatus, data->dma1FirstErrorStatus, | ||
| 277 | data->dma1ErrorLog0, data->dma1ErrorLog1); | ||
| 248 | 278 | ||
| 249 | for (i = 0; i < OPAL_PHB3_NUM_PEST_REGS; i++) { | 279 | for (i = 0; i < OPAL_PHB3_NUM_PEST_REGS; i++) { |
| 250 | if ((data->pestA[i] >> 63) == 0 && | 280 | if ((data->pestA[i] >> 63) == 0 && |
| 251 | (data->pestB[i] >> 63) == 0) | 281 | (data->pestB[i] >> 63) == 0) |
| 252 | continue; | 282 | continue; |
| 253 | 283 | ||
| 254 | pr_info(" PE[%3d] PESTA: %016llx\n", i, data->pestA[i]); | 284 | pr_info(" PE[%3d] A/B: %016llx %016llx\n", |
| 255 | pr_info(" PESTB: %016llx\n", data->pestB[i]); | 285 | i, data->pestA[i], data->pestB[i]); |
| 256 | } | 286 | } |
| 257 | } | 287 | } |
| 258 | 288 | ||
diff --git a/arch/powerpc/platforms/pseries/hotplug-cpu.c b/arch/powerpc/platforms/pseries/hotplug-cpu.c index 82789e79e539..0ea99e3d4815 100644 --- a/arch/powerpc/platforms/pseries/hotplug-cpu.c +++ b/arch/powerpc/platforms/pseries/hotplug-cpu.c | |||
| @@ -35,12 +35,7 @@ | |||
| 35 | #include "offline_states.h" | 35 | #include "offline_states.h" |
| 36 | 36 | ||
| 37 | /* This version can't take the spinlock, because it never returns */ | 37 | /* This version can't take the spinlock, because it never returns */ |
| 38 | static struct rtas_args rtas_stop_self_args = { | 38 | static int rtas_stop_self_token = RTAS_UNKNOWN_SERVICE; |
| 39 | .token = RTAS_UNKNOWN_SERVICE, | ||
| 40 | .nargs = 0, | ||
| 41 | .nret = 1, | ||
| 42 | .rets = &rtas_stop_self_args.args[0], | ||
| 43 | }; | ||
| 44 | 39 | ||
| 45 | static DEFINE_PER_CPU(enum cpu_state_vals, preferred_offline_state) = | 40 | static DEFINE_PER_CPU(enum cpu_state_vals, preferred_offline_state) = |
| 46 | CPU_STATE_OFFLINE; | 41 | CPU_STATE_OFFLINE; |
| @@ -93,15 +88,20 @@ void set_default_offline_state(int cpu) | |||
| 93 | 88 | ||
| 94 | static void rtas_stop_self(void) | 89 | static void rtas_stop_self(void) |
| 95 | { | 90 | { |
| 96 | struct rtas_args *args = &rtas_stop_self_args; | 91 | struct rtas_args args = { |
| 92 | .token = cpu_to_be32(rtas_stop_self_token), | ||
| 93 | .nargs = 0, | ||
| 94 | .nret = 1, | ||
| 95 | .rets = &args.args[0], | ||
| 96 | }; | ||
| 97 | 97 | ||
| 98 | local_irq_disable(); | 98 | local_irq_disable(); |
| 99 | 99 | ||
| 100 | BUG_ON(args->token == RTAS_UNKNOWN_SERVICE); | 100 | BUG_ON(rtas_stop_self_token == RTAS_UNKNOWN_SERVICE); |
| 101 | 101 | ||
| 102 | printk("cpu %u (hwid %u) Ready to die...\n", | 102 | printk("cpu %u (hwid %u) Ready to die...\n", |
| 103 | smp_processor_id(), hard_smp_processor_id()); | 103 | smp_processor_id(), hard_smp_processor_id()); |
| 104 | enter_rtas(__pa(args)); | 104 | enter_rtas(__pa(&args)); |
| 105 | 105 | ||
| 106 | panic("Alas, I survived.\n"); | 106 | panic("Alas, I survived.\n"); |
| 107 | } | 107 | } |
| @@ -392,10 +392,10 @@ static int __init pseries_cpu_hotplug_init(void) | |||
| 392 | } | 392 | } |
| 393 | } | 393 | } |
| 394 | 394 | ||
| 395 | rtas_stop_self_args.token = rtas_token("stop-self"); | 395 | rtas_stop_self_token = rtas_token("stop-self"); |
| 396 | qcss_tok = rtas_token("query-cpu-stopped-state"); | 396 | qcss_tok = rtas_token("query-cpu-stopped-state"); |
| 397 | 397 | ||
| 398 | if (rtas_stop_self_args.token == RTAS_UNKNOWN_SERVICE || | 398 | if (rtas_stop_self_token == RTAS_UNKNOWN_SERVICE || |
| 399 | qcss_tok == RTAS_UNKNOWN_SERVICE) { | 399 | qcss_tok == RTAS_UNKNOWN_SERVICE) { |
| 400 | printk(KERN_INFO "CPU Hotplug not supported by firmware " | 400 | printk(KERN_INFO "CPU Hotplug not supported by firmware " |
| 401 | "- disabling.\n"); | 401 | "- disabling.\n"); |
diff --git a/arch/sh/include/cpu-sh2/cpu/cache.h b/arch/sh/include/cpu-sh2/cpu/cache.h index 673515bc4135..aa1b2b9088a7 100644 --- a/arch/sh/include/cpu-sh2/cpu/cache.h +++ b/arch/sh/include/cpu-sh2/cpu/cache.h | |||
| @@ -18,7 +18,7 @@ | |||
| 18 | #define SH_CACHE_ASSOC 8 | 18 | #define SH_CACHE_ASSOC 8 |
| 19 | 19 | ||
| 20 | #if defined(CONFIG_CPU_SUBTYPE_SH7619) | 20 | #if defined(CONFIG_CPU_SUBTYPE_SH7619) |
| 21 | #define CCR 0xffffffec | 21 | #define SH_CCR 0xffffffec |
| 22 | 22 | ||
| 23 | #define CCR_CACHE_CE 0x01 /* Cache enable */ | 23 | #define CCR_CACHE_CE 0x01 /* Cache enable */ |
| 24 | #define CCR_CACHE_WT 0x02 /* CCR[bit1=1,bit2=1] */ | 24 | #define CCR_CACHE_WT 0x02 /* CCR[bit1=1,bit2=1] */ |
diff --git a/arch/sh/include/cpu-sh2a/cpu/cache.h b/arch/sh/include/cpu-sh2a/cpu/cache.h index defb0baa5a06..b27ce92cb600 100644 --- a/arch/sh/include/cpu-sh2a/cpu/cache.h +++ b/arch/sh/include/cpu-sh2a/cpu/cache.h | |||
| @@ -17,8 +17,8 @@ | |||
| 17 | #define SH_CACHE_COMBINED 4 | 17 | #define SH_CACHE_COMBINED 4 |
| 18 | #define SH_CACHE_ASSOC 8 | 18 | #define SH_CACHE_ASSOC 8 |
| 19 | 19 | ||
| 20 | #define CCR 0xfffc1000 /* CCR1 */ | 20 | #define SH_CCR 0xfffc1000 /* CCR1 */ |
| 21 | #define CCR2 0xfffc1004 | 21 | #define SH_CCR2 0xfffc1004 |
| 22 | 22 | ||
| 23 | /* | 23 | /* |
| 24 | * Most of the SH-2A CCR1 definitions resemble the SH-4 ones. All others not | 24 | * Most of the SH-2A CCR1 definitions resemble the SH-4 ones. All others not |
diff --git a/arch/sh/include/cpu-sh3/cpu/cache.h b/arch/sh/include/cpu-sh3/cpu/cache.h index bee2d81c56bf..29700fd88c75 100644 --- a/arch/sh/include/cpu-sh3/cpu/cache.h +++ b/arch/sh/include/cpu-sh3/cpu/cache.h | |||
| @@ -17,7 +17,7 @@ | |||
| 17 | #define SH_CACHE_COMBINED 4 | 17 | #define SH_CACHE_COMBINED 4 |
| 18 | #define SH_CACHE_ASSOC 8 | 18 | #define SH_CACHE_ASSOC 8 |
| 19 | 19 | ||
| 20 | #define CCR 0xffffffec /* Address of Cache Control Register */ | 20 | #define SH_CCR 0xffffffec /* Address of Cache Control Register */ |
| 21 | 21 | ||
| 22 | #define CCR_CACHE_CE 0x01 /* Cache Enable */ | 22 | #define CCR_CACHE_CE 0x01 /* Cache Enable */ |
| 23 | #define CCR_CACHE_WT 0x02 /* Write-Through (for P0,U0,P3) (else writeback) */ | 23 | #define CCR_CACHE_WT 0x02 /* Write-Through (for P0,U0,P3) (else writeback) */ |
diff --git a/arch/sh/include/cpu-sh4/cpu/cache.h b/arch/sh/include/cpu-sh4/cpu/cache.h index 7bfb9e8b069c..92c4cd119b66 100644 --- a/arch/sh/include/cpu-sh4/cpu/cache.h +++ b/arch/sh/include/cpu-sh4/cpu/cache.h | |||
| @@ -17,7 +17,7 @@ | |||
| 17 | #define SH_CACHE_COMBINED 4 | 17 | #define SH_CACHE_COMBINED 4 |
| 18 | #define SH_CACHE_ASSOC 8 | 18 | #define SH_CACHE_ASSOC 8 |
| 19 | 19 | ||
| 20 | #define CCR 0xff00001c /* Address of Cache Control Register */ | 20 | #define SH_CCR 0xff00001c /* Address of Cache Control Register */ |
| 21 | #define CCR_CACHE_OCE 0x0001 /* Operand Cache Enable */ | 21 | #define CCR_CACHE_OCE 0x0001 /* Operand Cache Enable */ |
| 22 | #define CCR_CACHE_WT 0x0002 /* Write-Through (for P0,U0,P3) (else writeback)*/ | 22 | #define CCR_CACHE_WT 0x0002 /* Write-Through (for P0,U0,P3) (else writeback)*/ |
| 23 | #define CCR_CACHE_CB 0x0004 /* Copy-Back (for P1) (else writethrough) */ | 23 | #define CCR_CACHE_CB 0x0004 /* Copy-Back (for P1) (else writethrough) */ |
diff --git a/arch/sh/kernel/cpu/init.c b/arch/sh/kernel/cpu/init.c index ecf83cd158dc..0d7360d549c1 100644 --- a/arch/sh/kernel/cpu/init.c +++ b/arch/sh/kernel/cpu/init.c | |||
| @@ -112,7 +112,7 @@ static void cache_init(void) | |||
| 112 | unsigned long ccr, flags; | 112 | unsigned long ccr, flags; |
| 113 | 113 | ||
| 114 | jump_to_uncached(); | 114 | jump_to_uncached(); |
| 115 | ccr = __raw_readl(CCR); | 115 | ccr = __raw_readl(SH_CCR); |
| 116 | 116 | ||
| 117 | /* | 117 | /* |
| 118 | * At this point we don't know whether the cache is enabled or not - a | 118 | * At this point we don't know whether the cache is enabled or not - a |
| @@ -189,7 +189,7 @@ static void cache_init(void) | |||
| 189 | 189 | ||
| 190 | l2_cache_init(); | 190 | l2_cache_init(); |
| 191 | 191 | ||
| 192 | __raw_writel(flags, CCR); | 192 | __raw_writel(flags, SH_CCR); |
| 193 | back_to_cached(); | 193 | back_to_cached(); |
| 194 | } | 194 | } |
| 195 | #else | 195 | #else |
diff --git a/arch/sh/mm/cache-debugfs.c b/arch/sh/mm/cache-debugfs.c index 115725198038..777e50f33c00 100644 --- a/arch/sh/mm/cache-debugfs.c +++ b/arch/sh/mm/cache-debugfs.c | |||
| @@ -36,7 +36,7 @@ static int cache_seq_show(struct seq_file *file, void *iter) | |||
| 36 | */ | 36 | */ |
| 37 | jump_to_uncached(); | 37 | jump_to_uncached(); |
| 38 | 38 | ||
| 39 | ccr = __raw_readl(CCR); | 39 | ccr = __raw_readl(SH_CCR); |
| 40 | if ((ccr & CCR_CACHE_ENABLE) == 0) { | 40 | if ((ccr & CCR_CACHE_ENABLE) == 0) { |
| 41 | back_to_cached(); | 41 | back_to_cached(); |
| 42 | 42 | ||
diff --git a/arch/sh/mm/cache-sh2.c b/arch/sh/mm/cache-sh2.c index defcf719f2e8..a74259f2f981 100644 --- a/arch/sh/mm/cache-sh2.c +++ b/arch/sh/mm/cache-sh2.c | |||
| @@ -63,9 +63,9 @@ static void sh2__flush_invalidate_region(void *start, int size) | |||
| 63 | local_irq_save(flags); | 63 | local_irq_save(flags); |
| 64 | jump_to_uncached(); | 64 | jump_to_uncached(); |
| 65 | 65 | ||
| 66 | ccr = __raw_readl(CCR); | 66 | ccr = __raw_readl(SH_CCR); |
| 67 | ccr |= CCR_CACHE_INVALIDATE; | 67 | ccr |= CCR_CACHE_INVALIDATE; |
| 68 | __raw_writel(ccr, CCR); | 68 | __raw_writel(ccr, SH_CCR); |
| 69 | 69 | ||
| 70 | back_to_cached(); | 70 | back_to_cached(); |
| 71 | local_irq_restore(flags); | 71 | local_irq_restore(flags); |
diff --git a/arch/sh/mm/cache-sh2a.c b/arch/sh/mm/cache-sh2a.c index 949e2d3138a0..ee87d081259b 100644 --- a/arch/sh/mm/cache-sh2a.c +++ b/arch/sh/mm/cache-sh2a.c | |||
| @@ -134,7 +134,8 @@ static void sh2a__flush_invalidate_region(void *start, int size) | |||
| 134 | 134 | ||
| 135 | /* If there are too many pages then just blow the cache */ | 135 | /* If there are too many pages then just blow the cache */ |
| 136 | if (((end - begin) >> PAGE_SHIFT) >= MAX_OCACHE_PAGES) { | 136 | if (((end - begin) >> PAGE_SHIFT) >= MAX_OCACHE_PAGES) { |
| 137 | __raw_writel(__raw_readl(CCR) | CCR_OCACHE_INVALIDATE, CCR); | 137 | __raw_writel(__raw_readl(SH_CCR) | CCR_OCACHE_INVALIDATE, |
| 138 | SH_CCR); | ||
| 138 | } else { | 139 | } else { |
| 139 | for (v = begin; v < end; v += L1_CACHE_BYTES) | 140 | for (v = begin; v < end; v += L1_CACHE_BYTES) |
| 140 | sh2a_invalidate_line(CACHE_OC_ADDRESS_ARRAY, v); | 141 | sh2a_invalidate_line(CACHE_OC_ADDRESS_ARRAY, v); |
| @@ -167,7 +168,8 @@ static void sh2a_flush_icache_range(void *args) | |||
| 167 | /* I-Cache invalidate */ | 168 | /* I-Cache invalidate */ |
| 168 | /* If there are too many pages then just blow the cache */ | 169 | /* If there are too many pages then just blow the cache */ |
| 169 | if (((end - start) >> PAGE_SHIFT) >= MAX_ICACHE_PAGES) { | 170 | if (((end - start) >> PAGE_SHIFT) >= MAX_ICACHE_PAGES) { |
| 170 | __raw_writel(__raw_readl(CCR) | CCR_ICACHE_INVALIDATE, CCR); | 171 | __raw_writel(__raw_readl(SH_CCR) | CCR_ICACHE_INVALIDATE, |
| 172 | SH_CCR); | ||
| 171 | } else { | 173 | } else { |
| 172 | for (v = start; v < end; v += L1_CACHE_BYTES) | 174 | for (v = start; v < end; v += L1_CACHE_BYTES) |
| 173 | sh2a_invalidate_line(CACHE_IC_ADDRESS_ARRAY, v); | 175 | sh2a_invalidate_line(CACHE_IC_ADDRESS_ARRAY, v); |
diff --git a/arch/sh/mm/cache-sh4.c b/arch/sh/mm/cache-sh4.c index 0e529285b28d..51d8f7f31d1d 100644 --- a/arch/sh/mm/cache-sh4.c +++ b/arch/sh/mm/cache-sh4.c | |||
| @@ -133,9 +133,9 @@ static void flush_icache_all(void) | |||
| 133 | jump_to_uncached(); | 133 | jump_to_uncached(); |
| 134 | 134 | ||
| 135 | /* Flush I-cache */ | 135 | /* Flush I-cache */ |
| 136 | ccr = __raw_readl(CCR); | 136 | ccr = __raw_readl(SH_CCR); |
| 137 | ccr |= CCR_CACHE_ICI; | 137 | ccr |= CCR_CACHE_ICI; |
| 138 | __raw_writel(ccr, CCR); | 138 | __raw_writel(ccr, SH_CCR); |
| 139 | 139 | ||
| 140 | /* | 140 | /* |
| 141 | * back_to_cached() will take care of the barrier for us, don't add | 141 | * back_to_cached() will take care of the barrier for us, don't add |
diff --git a/arch/sh/mm/cache-shx3.c b/arch/sh/mm/cache-shx3.c index c0adbee97b5f..24c58b7dc022 100644 --- a/arch/sh/mm/cache-shx3.c +++ b/arch/sh/mm/cache-shx3.c | |||
| @@ -19,7 +19,7 @@ void __init shx3_cache_init(void) | |||
| 19 | { | 19 | { |
| 20 | unsigned int ccr; | 20 | unsigned int ccr; |
| 21 | 21 | ||
| 22 | ccr = __raw_readl(CCR); | 22 | ccr = __raw_readl(SH_CCR); |
| 23 | 23 | ||
| 24 | /* | 24 | /* |
| 25 | * If we've got cache aliases, resolve them in hardware. | 25 | * If we've got cache aliases, resolve them in hardware. |
| @@ -40,5 +40,5 @@ void __init shx3_cache_init(void) | |||
| 40 | ccr |= CCR_CACHE_IBE; | 40 | ccr |= CCR_CACHE_IBE; |
| 41 | #endif | 41 | #endif |
| 42 | 42 | ||
| 43 | writel_uncached(ccr, CCR); | 43 | writel_uncached(ccr, SH_CCR); |
| 44 | } | 44 | } |
diff --git a/arch/sh/mm/cache.c b/arch/sh/mm/cache.c index 616966a96cba..097c2cdd117f 100644 --- a/arch/sh/mm/cache.c +++ b/arch/sh/mm/cache.c | |||
| @@ -285,8 +285,8 @@ void __init cpu_cache_init(void) | |||
| 285 | { | 285 | { |
| 286 | unsigned int cache_disabled = 0; | 286 | unsigned int cache_disabled = 0; |
| 287 | 287 | ||
| 288 | #ifdef CCR | 288 | #ifdef SH_CCR |
| 289 | cache_disabled = !(__raw_readl(CCR) & CCR_CACHE_ENABLE); | 289 | cache_disabled = !(__raw_readl(SH_CCR) & CCR_CACHE_ENABLE); |
| 290 | #endif | 290 | #endif |
| 291 | 291 | ||
| 292 | compute_alias(&boot_cpu_data.icache); | 292 | compute_alias(&boot_cpu_data.icache); |
diff --git a/arch/x86/boot/compressed/aslr.c b/arch/x86/boot/compressed/aslr.c index 90a21f430117..4dbf967da50d 100644 --- a/arch/x86/boot/compressed/aslr.c +++ b/arch/x86/boot/compressed/aslr.c | |||
| @@ -111,7 +111,7 @@ struct mem_vector { | |||
| 111 | }; | 111 | }; |
| 112 | 112 | ||
| 113 | #define MEM_AVOID_MAX 5 | 113 | #define MEM_AVOID_MAX 5 |
| 114 | struct mem_vector mem_avoid[MEM_AVOID_MAX]; | 114 | static struct mem_vector mem_avoid[MEM_AVOID_MAX]; |
| 115 | 115 | ||
| 116 | static bool mem_contains(struct mem_vector *region, struct mem_vector *item) | 116 | static bool mem_contains(struct mem_vector *region, struct mem_vector *item) |
| 117 | { | 117 | { |
| @@ -180,7 +180,7 @@ static void mem_avoid_init(unsigned long input, unsigned long input_size, | |||
| 180 | } | 180 | } |
| 181 | 181 | ||
| 182 | /* Does this memory vector overlap a known avoided area? */ | 182 | /* Does this memory vector overlap a known avoided area? */ |
| 183 | bool mem_avoid_overlap(struct mem_vector *img) | 183 | static bool mem_avoid_overlap(struct mem_vector *img) |
| 184 | { | 184 | { |
| 185 | int i; | 185 | int i; |
| 186 | 186 | ||
| @@ -192,8 +192,9 @@ bool mem_avoid_overlap(struct mem_vector *img) | |||
| 192 | return false; | 192 | return false; |
| 193 | } | 193 | } |
| 194 | 194 | ||
| 195 | unsigned long slots[CONFIG_RANDOMIZE_BASE_MAX_OFFSET / CONFIG_PHYSICAL_ALIGN]; | 195 | static unsigned long slots[CONFIG_RANDOMIZE_BASE_MAX_OFFSET / |
| 196 | unsigned long slot_max = 0; | 196 | CONFIG_PHYSICAL_ALIGN]; |
| 197 | static unsigned long slot_max; | ||
| 197 | 198 | ||
| 198 | static void slots_append(unsigned long addr) | 199 | static void slots_append(unsigned long addr) |
| 199 | { | 200 | { |
diff --git a/arch/x86/include/asm/efi.h b/arch/x86/include/asm/efi.h index 3d6b9f81cc68..acd86c850414 100644 --- a/arch/x86/include/asm/efi.h +++ b/arch/x86/include/asm/efi.h | |||
| @@ -134,6 +134,7 @@ extern void efi_setup_page_tables(void); | |||
| 134 | extern void __init old_map_region(efi_memory_desc_t *md); | 134 | extern void __init old_map_region(efi_memory_desc_t *md); |
| 135 | extern void __init runtime_code_page_mkexec(void); | 135 | extern void __init runtime_code_page_mkexec(void); |
| 136 | extern void __init efi_runtime_mkexec(void); | 136 | extern void __init efi_runtime_mkexec(void); |
| 137 | extern void __init efi_apply_memmap_quirks(void); | ||
| 137 | 138 | ||
| 138 | struct efi_setup_data { | 139 | struct efi_setup_data { |
| 139 | u64 fw_vendor; | 140 | u64 fw_vendor; |
diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c index 895604f2e916..79f9f848bee4 100644 --- a/arch/x86/kernel/cpu/perf_event.c +++ b/arch/x86/kernel/cpu/perf_event.c | |||
| @@ -1192,6 +1192,9 @@ static void x86_pmu_del(struct perf_event *event, int flags) | |||
| 1192 | for (i = 0; i < cpuc->n_events; i++) { | 1192 | for (i = 0; i < cpuc->n_events; i++) { |
| 1193 | if (event == cpuc->event_list[i]) { | 1193 | if (event == cpuc->event_list[i]) { |
| 1194 | 1194 | ||
| 1195 | if (i >= cpuc->n_events - cpuc->n_added) | ||
| 1196 | --cpuc->n_added; | ||
| 1197 | |||
| 1195 | if (x86_pmu.put_event_constraints) | 1198 | if (x86_pmu.put_event_constraints) |
| 1196 | x86_pmu.put_event_constraints(cpuc, event); | 1199 | x86_pmu.put_event_constraints(cpuc, event); |
| 1197 | 1200 | ||
diff --git a/arch/x86/kernel/head_32.S b/arch/x86/kernel/head_32.S index 81ba27679f18..f36bd42d6f0c 100644 --- a/arch/x86/kernel/head_32.S +++ b/arch/x86/kernel/head_32.S | |||
| @@ -544,6 +544,10 @@ ENDPROC(early_idt_handlers) | |||
| 544 | /* This is global to keep gas from relaxing the jumps */ | 544 | /* This is global to keep gas from relaxing the jumps */ |
| 545 | ENTRY(early_idt_handler) | 545 | ENTRY(early_idt_handler) |
| 546 | cld | 546 | cld |
| 547 | |||
| 548 | cmpl $2,(%esp) # X86_TRAP_NMI | ||
| 549 | je is_nmi # Ignore NMI | ||
| 550 | |||
| 547 | cmpl $2,%ss:early_recursion_flag | 551 | cmpl $2,%ss:early_recursion_flag |
| 548 | je hlt_loop | 552 | je hlt_loop |
| 549 | incl %ss:early_recursion_flag | 553 | incl %ss:early_recursion_flag |
| @@ -594,8 +598,9 @@ ex_entry: | |||
| 594 | pop %edx | 598 | pop %edx |
| 595 | pop %ecx | 599 | pop %ecx |
| 596 | pop %eax | 600 | pop %eax |
| 597 | addl $8,%esp /* drop vector number and error code */ | ||
| 598 | decl %ss:early_recursion_flag | 601 | decl %ss:early_recursion_flag |
| 602 | is_nmi: | ||
| 603 | addl $8,%esp /* drop vector number and error code */ | ||
| 599 | iret | 604 | iret |
| 600 | ENDPROC(early_idt_handler) | 605 | ENDPROC(early_idt_handler) |
| 601 | 606 | ||
diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S index e1aabdb314c8..a468c0a65c42 100644 --- a/arch/x86/kernel/head_64.S +++ b/arch/x86/kernel/head_64.S | |||
| @@ -343,6 +343,9 @@ early_idt_handlers: | |||
| 343 | ENTRY(early_idt_handler) | 343 | ENTRY(early_idt_handler) |
| 344 | cld | 344 | cld |
| 345 | 345 | ||
| 346 | cmpl $2,(%rsp) # X86_TRAP_NMI | ||
| 347 | je is_nmi # Ignore NMI | ||
| 348 | |||
| 346 | cmpl $2,early_recursion_flag(%rip) | 349 | cmpl $2,early_recursion_flag(%rip) |
| 347 | jz 1f | 350 | jz 1f |
| 348 | incl early_recursion_flag(%rip) | 351 | incl early_recursion_flag(%rip) |
| @@ -405,8 +408,9 @@ ENTRY(early_idt_handler) | |||
| 405 | popq %rdx | 408 | popq %rdx |
| 406 | popq %rcx | 409 | popq %rcx |
| 407 | popq %rax | 410 | popq %rax |
| 408 | addq $16,%rsp # drop vector number and error code | ||
| 409 | decl early_recursion_flag(%rip) | 411 | decl early_recursion_flag(%rip) |
| 412 | is_nmi: | ||
| 413 | addq $16,%rsp # drop vector number and error code | ||
| 410 | INTERRUPT_RETURN | 414 | INTERRUPT_RETURN |
| 411 | ENDPROC(early_idt_handler) | 415 | ENDPROC(early_idt_handler) |
| 412 | 416 | ||
diff --git a/arch/x86/kernel/machine_kexec_64.c b/arch/x86/kernel/machine_kexec_64.c index 4eabc160696f..679cef0791cd 100644 --- a/arch/x86/kernel/machine_kexec_64.c +++ b/arch/x86/kernel/machine_kexec_64.c | |||
| @@ -279,5 +279,7 @@ void arch_crash_save_vmcoreinfo(void) | |||
| 279 | VMCOREINFO_SYMBOL(node_data); | 279 | VMCOREINFO_SYMBOL(node_data); |
| 280 | VMCOREINFO_LENGTH(node_data, MAX_NUMNODES); | 280 | VMCOREINFO_LENGTH(node_data, MAX_NUMNODES); |
| 281 | #endif | 281 | #endif |
| 282 | vmcoreinfo_append_str("KERNELOFFSET=%lx\n", | ||
| 283 | (unsigned long)&_text - __START_KERNEL); | ||
| 282 | } | 284 | } |
| 283 | 285 | ||
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index 06853e670354..ce72964b2f46 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
| @@ -1239,14 +1239,8 @@ void __init setup_arch(char **cmdline_p) | |||
| 1239 | register_refined_jiffies(CLOCK_TICK_RATE); | 1239 | register_refined_jiffies(CLOCK_TICK_RATE); |
| 1240 | 1240 | ||
| 1241 | #ifdef CONFIG_EFI | 1241 | #ifdef CONFIG_EFI |
| 1242 | /* Once setup is done above, unmap the EFI memory map on | 1242 | if (efi_enabled(EFI_BOOT)) |
| 1243 | * mismatched firmware/kernel archtectures since there is no | 1243 | efi_apply_memmap_quirks(); |
| 1244 | * support for runtime services. | ||
| 1245 | */ | ||
| 1246 | if (efi_enabled(EFI_BOOT) && !efi_is_native()) { | ||
| 1247 | pr_info("efi: Setup done, disabling due to 32/64-bit mismatch\n"); | ||
| 1248 | efi_unmap_memmap(); | ||
| 1249 | } | ||
| 1250 | #endif | 1244 | #endif |
| 1251 | } | 1245 | } |
| 1252 | 1246 | ||
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index e50425d0f5f7..9b531351a587 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c | |||
| @@ -2672,6 +2672,7 @@ static int __direct_map(struct kvm_vcpu *vcpu, gpa_t v, int write, | |||
| 2672 | break; | 2672 | break; |
| 2673 | } | 2673 | } |
| 2674 | 2674 | ||
| 2675 | drop_large_spte(vcpu, iterator.sptep); | ||
| 2675 | if (!is_shadow_present_pte(*iterator.sptep)) { | 2676 | if (!is_shadow_present_pte(*iterator.sptep)) { |
| 2676 | u64 base_addr = iterator.addr; | 2677 | u64 base_addr = iterator.addr; |
| 2677 | 2678 | ||
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index a06f101ef64b..392752834751 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
| @@ -6688,7 +6688,7 @@ static bool nested_vmx_exit_handled(struct kvm_vcpu *vcpu) | |||
| 6688 | else if (is_page_fault(intr_info)) | 6688 | else if (is_page_fault(intr_info)) |
| 6689 | return enable_ept; | 6689 | return enable_ept; |
| 6690 | else if (is_no_device(intr_info) && | 6690 | else if (is_no_device(intr_info) && |
| 6691 | !(nested_read_cr0(vmcs12) & X86_CR0_TS)) | 6691 | !(vmcs12->guest_cr0 & X86_CR0_TS)) |
| 6692 | return 0; | 6692 | return 0; |
| 6693 | return vmcs12->exception_bitmap & | 6693 | return vmcs12->exception_bitmap & |
| 6694 | (1u << (intr_info & INTR_INFO_VECTOR_MASK)); | 6694 | (1u << (intr_info & INTR_INFO_VECTOR_MASK)); |
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 39c28f09dfd5..2b8578432d5b 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
| @@ -6186,7 +6186,7 @@ static int complete_emulated_mmio(struct kvm_vcpu *vcpu) | |||
| 6186 | frag->len -= len; | 6186 | frag->len -= len; |
| 6187 | } | 6187 | } |
| 6188 | 6188 | ||
| 6189 | if (vcpu->mmio_cur_fragment == vcpu->mmio_nr_fragments) { | 6189 | if (vcpu->mmio_cur_fragment >= vcpu->mmio_nr_fragments) { |
| 6190 | vcpu->mmio_needed = 0; | 6190 | vcpu->mmio_needed = 0; |
| 6191 | 6191 | ||
| 6192 | /* FIXME: return into emulator if single-stepping. */ | 6192 | /* FIXME: return into emulator if single-stepping. */ |
diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c index 6dea040cc3a1..a10c8c792161 100644 --- a/arch/x86/mm/fault.c +++ b/arch/x86/mm/fault.c | |||
| @@ -1020,13 +1020,17 @@ static inline bool smap_violation(int error_code, struct pt_regs *regs) | |||
| 1020 | * This routine handles page faults. It determines the address, | 1020 | * This routine handles page faults. It determines the address, |
| 1021 | * and the problem, and then passes it off to one of the appropriate | 1021 | * and the problem, and then passes it off to one of the appropriate |
| 1022 | * routines. | 1022 | * routines. |
| 1023 | * | ||
| 1024 | * This function must have noinline because both callers | ||
| 1025 | * {,trace_}do_page_fault() have notrace on. Having this an actual function | ||
| 1026 | * guarantees there's a function trace entry. | ||
| 1023 | */ | 1027 | */ |
| 1024 | static void __kprobes | 1028 | static void __kprobes noinline |
| 1025 | __do_page_fault(struct pt_regs *regs, unsigned long error_code) | 1029 | __do_page_fault(struct pt_regs *regs, unsigned long error_code, |
| 1030 | unsigned long address) | ||
| 1026 | { | 1031 | { |
| 1027 | struct vm_area_struct *vma; | 1032 | struct vm_area_struct *vma; |
| 1028 | struct task_struct *tsk; | 1033 | struct task_struct *tsk; |
| 1029 | unsigned long address; | ||
| 1030 | struct mm_struct *mm; | 1034 | struct mm_struct *mm; |
| 1031 | int fault; | 1035 | int fault; |
| 1032 | unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; | 1036 | unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; |
| @@ -1034,9 +1038,6 @@ __do_page_fault(struct pt_regs *regs, unsigned long error_code) | |||
| 1034 | tsk = current; | 1038 | tsk = current; |
| 1035 | mm = tsk->mm; | 1039 | mm = tsk->mm; |
| 1036 | 1040 | ||
| 1037 | /* Get the faulting address: */ | ||
| 1038 | address = read_cr2(); | ||
| 1039 | |||
| 1040 | /* | 1041 | /* |
| 1041 | * Detect and handle instructions that would cause a page fault for | 1042 | * Detect and handle instructions that would cause a page fault for |
| 1042 | * both a tracked kernel page and a userspace page. | 1043 | * both a tracked kernel page and a userspace page. |
| @@ -1248,32 +1249,50 @@ good_area: | |||
| 1248 | up_read(&mm->mmap_sem); | 1249 | up_read(&mm->mmap_sem); |
| 1249 | } | 1250 | } |
| 1250 | 1251 | ||
| 1251 | dotraplinkage void __kprobes | 1252 | dotraplinkage void __kprobes notrace |
| 1252 | do_page_fault(struct pt_regs *regs, unsigned long error_code) | 1253 | do_page_fault(struct pt_regs *regs, unsigned long error_code) |
| 1253 | { | 1254 | { |
| 1255 | unsigned long address = read_cr2(); /* Get the faulting address */ | ||
| 1254 | enum ctx_state prev_state; | 1256 | enum ctx_state prev_state; |
| 1255 | 1257 | ||
| 1258 | /* | ||
| 1259 | * We must have this function tagged with __kprobes, notrace and call | ||
| 1260 | * read_cr2() before calling anything else. To avoid calling any kind | ||
| 1261 | * of tracing machinery before we've observed the CR2 value. | ||
| 1262 | * | ||
| 1263 | * exception_{enter,exit}() contain all sorts of tracepoints. | ||
| 1264 | */ | ||
| 1265 | |||
| 1256 | prev_state = exception_enter(); | 1266 | prev_state = exception_enter(); |
| 1257 | __do_page_fault(regs, error_code); | 1267 | __do_page_fault(regs, error_code, address); |
| 1258 | exception_exit(prev_state); | 1268 | exception_exit(prev_state); |
| 1259 | } | 1269 | } |
| 1260 | 1270 | ||
| 1261 | static void trace_page_fault_entries(struct pt_regs *regs, | 1271 | #ifdef CONFIG_TRACING |
| 1272 | static void trace_page_fault_entries(unsigned long address, struct pt_regs *regs, | ||
| 1262 | unsigned long error_code) | 1273 | unsigned long error_code) |
| 1263 | { | 1274 | { |
| 1264 | if (user_mode(regs)) | 1275 | if (user_mode(regs)) |
| 1265 | trace_page_fault_user(read_cr2(), regs, error_code); | 1276 | trace_page_fault_user(address, regs, error_code); |
| 1266 | else | 1277 | else |
| 1267 | trace_page_fault_kernel(read_cr2(), regs, error_code); | 1278 | trace_page_fault_kernel(address, regs, error_code); |
| 1268 | } | 1279 | } |
| 1269 | 1280 | ||
| 1270 | dotraplinkage void __kprobes | 1281 | dotraplinkage void __kprobes notrace |
| 1271 | trace_do_page_fault(struct pt_regs *regs, unsigned long error_code) | 1282 | trace_do_page_fault(struct pt_regs *regs, unsigned long error_code) |
| 1272 | { | 1283 | { |
| 1284 | /* | ||
| 1285 | * The exception_enter and tracepoint processing could | ||
| 1286 | * trigger another page faults (user space callchain | ||
| 1287 | * reading) and destroy the original cr2 value, so read | ||
| 1288 | * the faulting address now. | ||
| 1289 | */ | ||
| 1290 | unsigned long address = read_cr2(); | ||
| 1273 | enum ctx_state prev_state; | 1291 | enum ctx_state prev_state; |
| 1274 | 1292 | ||
| 1275 | prev_state = exception_enter(); | 1293 | prev_state = exception_enter(); |
| 1276 | trace_page_fault_entries(regs, error_code); | 1294 | trace_page_fault_entries(address, regs, error_code); |
| 1277 | __do_page_fault(regs, error_code); | 1295 | __do_page_fault(regs, error_code, address); |
| 1278 | exception_exit(prev_state); | 1296 | exception_exit(prev_state); |
| 1279 | } | 1297 | } |
| 1298 | #endif /* CONFIG_TRACING */ | ||
diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c index 1a201ac7cef8..b97acecf3fd9 100644 --- a/arch/x86/platform/efi/efi.c +++ b/arch/x86/platform/efi/efi.c | |||
| @@ -52,6 +52,7 @@ | |||
| 52 | #include <asm/tlbflush.h> | 52 | #include <asm/tlbflush.h> |
| 53 | #include <asm/x86_init.h> | 53 | #include <asm/x86_init.h> |
| 54 | #include <asm/rtc.h> | 54 | #include <asm/rtc.h> |
| 55 | #include <asm/uv/uv.h> | ||
| 55 | 56 | ||
| 56 | #define EFI_DEBUG | 57 | #define EFI_DEBUG |
| 57 | 58 | ||
| @@ -1210,3 +1211,22 @@ static int __init parse_efi_cmdline(char *str) | |||
| 1210 | return 0; | 1211 | return 0; |
| 1211 | } | 1212 | } |
| 1212 | early_param("efi", parse_efi_cmdline); | 1213 | early_param("efi", parse_efi_cmdline); |
| 1214 | |||
| 1215 | void __init efi_apply_memmap_quirks(void) | ||
| 1216 | { | ||
| 1217 | /* | ||
| 1218 | * Once setup is done earlier, unmap the EFI memory map on mismatched | ||
| 1219 | * firmware/kernel architectures since there is no support for runtime | ||
| 1220 | * services. | ||
| 1221 | */ | ||
| 1222 | if (!efi_is_native()) { | ||
| 1223 | pr_info("efi: Setup done, disabling due to 32/64-bit mismatch\n"); | ||
| 1224 | efi_unmap_memmap(); | ||
| 1225 | } | ||
| 1226 | |||
| 1227 | /* | ||
| 1228 | * UV doesn't support the new EFI pagetable mapping yet. | ||
| 1229 | */ | ||
| 1230 | if (is_uv_system()) | ||
| 1231 | set_bit(EFI_OLD_MEMMAP, &x86_efi_facility); | ||
| 1232 | } | ||
diff --git a/block/blk-exec.c b/block/blk-exec.c index c68613bb4c79..dbf4502b1d67 100644 --- a/block/blk-exec.c +++ b/block/blk-exec.c | |||
| @@ -65,7 +65,7 @@ void blk_execute_rq_nowait(struct request_queue *q, struct gendisk *bd_disk, | |||
| 65 | * be resued after dying flag is set | 65 | * be resued after dying flag is set |
| 66 | */ | 66 | */ |
| 67 | if (q->mq_ops) { | 67 | if (q->mq_ops) { |
| 68 | blk_mq_insert_request(q, rq, at_head, true); | 68 | blk_mq_insert_request(rq, at_head, true, false); |
| 69 | return; | 69 | return; |
| 70 | } | 70 | } |
| 71 | 71 | ||
diff --git a/block/blk-flush.c b/block/blk-flush.c index 66e2b697f5db..f598f794c3c6 100644 --- a/block/blk-flush.c +++ b/block/blk-flush.c | |||
| @@ -137,7 +137,7 @@ static void mq_flush_run(struct work_struct *work) | |||
| 137 | rq = container_of(work, struct request, mq_flush_work); | 137 | rq = container_of(work, struct request, mq_flush_work); |
| 138 | 138 | ||
| 139 | memset(&rq->csd, 0, sizeof(rq->csd)); | 139 | memset(&rq->csd, 0, sizeof(rq->csd)); |
| 140 | blk_mq_run_request(rq, true, false); | 140 | blk_mq_insert_request(rq, false, true, false); |
| 141 | } | 141 | } |
| 142 | 142 | ||
| 143 | static bool blk_flush_queue_rq(struct request *rq) | 143 | static bool blk_flush_queue_rq(struct request *rq) |
| @@ -411,7 +411,7 @@ void blk_insert_flush(struct request *rq) | |||
| 411 | if ((policy & REQ_FSEQ_DATA) && | 411 | if ((policy & REQ_FSEQ_DATA) && |
| 412 | !(policy & (REQ_FSEQ_PREFLUSH | REQ_FSEQ_POSTFLUSH))) { | 412 | !(policy & (REQ_FSEQ_PREFLUSH | REQ_FSEQ_POSTFLUSH))) { |
| 413 | if (q->mq_ops) { | 413 | if (q->mq_ops) { |
| 414 | blk_mq_run_request(rq, false, true); | 414 | blk_mq_insert_request(rq, false, false, true); |
| 415 | } else | 415 | } else |
| 416 | list_add_tail(&rq->queuelist, &q->queue_head); | 416 | list_add_tail(&rq->queuelist, &q->queue_head); |
| 417 | return; | 417 | return; |
diff --git a/block/blk-mq-cpu.c b/block/blk-mq-cpu.c index 3146befb56aa..136ef8643bba 100644 --- a/block/blk-mq-cpu.c +++ b/block/blk-mq-cpu.c | |||
| @@ -11,7 +11,7 @@ | |||
| 11 | #include "blk-mq.h" | 11 | #include "blk-mq.h" |
| 12 | 12 | ||
| 13 | static LIST_HEAD(blk_mq_cpu_notify_list); | 13 | static LIST_HEAD(blk_mq_cpu_notify_list); |
| 14 | static DEFINE_SPINLOCK(blk_mq_cpu_notify_lock); | 14 | static DEFINE_RAW_SPINLOCK(blk_mq_cpu_notify_lock); |
| 15 | 15 | ||
| 16 | static int blk_mq_main_cpu_notify(struct notifier_block *self, | 16 | static int blk_mq_main_cpu_notify(struct notifier_block *self, |
| 17 | unsigned long action, void *hcpu) | 17 | unsigned long action, void *hcpu) |
| @@ -19,12 +19,12 @@ static int blk_mq_main_cpu_notify(struct notifier_block *self, | |||
| 19 | unsigned int cpu = (unsigned long) hcpu; | 19 | unsigned int cpu = (unsigned long) hcpu; |
| 20 | struct blk_mq_cpu_notifier *notify; | 20 | struct blk_mq_cpu_notifier *notify; |
| 21 | 21 | ||
| 22 | spin_lock(&blk_mq_cpu_notify_lock); | 22 | raw_spin_lock(&blk_mq_cpu_notify_lock); |
| 23 | 23 | ||
| 24 | list_for_each_entry(notify, &blk_mq_cpu_notify_list, list) | 24 | list_for_each_entry(notify, &blk_mq_cpu_notify_list, list) |
| 25 | notify->notify(notify->data, action, cpu); | 25 | notify->notify(notify->data, action, cpu); |
| 26 | 26 | ||
| 27 | spin_unlock(&blk_mq_cpu_notify_lock); | 27 | raw_spin_unlock(&blk_mq_cpu_notify_lock); |
| 28 | return NOTIFY_OK; | 28 | return NOTIFY_OK; |
| 29 | } | 29 | } |
| 30 | 30 | ||
| @@ -32,16 +32,16 @@ void blk_mq_register_cpu_notifier(struct blk_mq_cpu_notifier *notifier) | |||
| 32 | { | 32 | { |
| 33 | BUG_ON(!notifier->notify); | 33 | BUG_ON(!notifier->notify); |
| 34 | 34 | ||
| 35 | spin_lock(&blk_mq_cpu_notify_lock); | 35 | raw_spin_lock(&blk_mq_cpu_notify_lock); |
| 36 | list_add_tail(¬ifier->list, &blk_mq_cpu_notify_list); | 36 | list_add_tail(¬ifier->list, &blk_mq_cpu_notify_list); |
| 37 | spin_unlock(&blk_mq_cpu_notify_lock); | 37 | raw_spin_unlock(&blk_mq_cpu_notify_lock); |
| 38 | } | 38 | } |
| 39 | 39 | ||
| 40 | void blk_mq_unregister_cpu_notifier(struct blk_mq_cpu_notifier *notifier) | 40 | void blk_mq_unregister_cpu_notifier(struct blk_mq_cpu_notifier *notifier) |
| 41 | { | 41 | { |
| 42 | spin_lock(&blk_mq_cpu_notify_lock); | 42 | raw_spin_lock(&blk_mq_cpu_notify_lock); |
| 43 | list_del(¬ifier->list); | 43 | list_del(¬ifier->list); |
| 44 | spin_unlock(&blk_mq_cpu_notify_lock); | 44 | raw_spin_unlock(&blk_mq_cpu_notify_lock); |
| 45 | } | 45 | } |
| 46 | 46 | ||
| 47 | void blk_mq_init_cpu_notifier(struct blk_mq_cpu_notifier *notifier, | 47 | void blk_mq_init_cpu_notifier(struct blk_mq_cpu_notifier *notifier, |
diff --git a/block/blk-mq.c b/block/blk-mq.c index 1fa9dd153fde..883f72089015 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c | |||
| @@ -73,8 +73,8 @@ static void blk_mq_hctx_mark_pending(struct blk_mq_hw_ctx *hctx, | |||
| 73 | set_bit(ctx->index_hw, hctx->ctx_map); | 73 | set_bit(ctx->index_hw, hctx->ctx_map); |
| 74 | } | 74 | } |
| 75 | 75 | ||
| 76 | static struct request *blk_mq_alloc_rq(struct blk_mq_hw_ctx *hctx, gfp_t gfp, | 76 | static struct request *__blk_mq_alloc_request(struct blk_mq_hw_ctx *hctx, |
| 77 | bool reserved) | 77 | gfp_t gfp, bool reserved) |
| 78 | { | 78 | { |
| 79 | struct request *rq; | 79 | struct request *rq; |
| 80 | unsigned int tag; | 80 | unsigned int tag; |
| @@ -193,12 +193,6 @@ static void blk_mq_rq_ctx_init(struct request_queue *q, struct blk_mq_ctx *ctx, | |||
| 193 | ctx->rq_dispatched[rw_is_sync(rw_flags)]++; | 193 | ctx->rq_dispatched[rw_is_sync(rw_flags)]++; |
| 194 | } | 194 | } |
| 195 | 195 | ||
| 196 | static struct request *__blk_mq_alloc_request(struct blk_mq_hw_ctx *hctx, | ||
| 197 | gfp_t gfp, bool reserved) | ||
| 198 | { | ||
| 199 | return blk_mq_alloc_rq(hctx, gfp, reserved); | ||
| 200 | } | ||
| 201 | |||
| 202 | static struct request *blk_mq_alloc_request_pinned(struct request_queue *q, | 196 | static struct request *blk_mq_alloc_request_pinned(struct request_queue *q, |
| 203 | int rw, gfp_t gfp, | 197 | int rw, gfp_t gfp, |
| 204 | bool reserved) | 198 | bool reserved) |
| @@ -289,38 +283,10 @@ void blk_mq_free_request(struct request *rq) | |||
| 289 | __blk_mq_free_request(hctx, ctx, rq); | 283 | __blk_mq_free_request(hctx, ctx, rq); |
| 290 | } | 284 | } |
| 291 | 285 | ||
| 292 | static void blk_mq_bio_endio(struct request *rq, struct bio *bio, int error) | 286 | bool blk_mq_end_io_partial(struct request *rq, int error, unsigned int nr_bytes) |
| 293 | { | ||
| 294 | if (error) | ||
| 295 | clear_bit(BIO_UPTODATE, &bio->bi_flags); | ||
| 296 | else if (!test_bit(BIO_UPTODATE, &bio->bi_flags)) | ||
| 297 | error = -EIO; | ||
| 298 | |||
| 299 | if (unlikely(rq->cmd_flags & REQ_QUIET)) | ||
| 300 | set_bit(BIO_QUIET, &bio->bi_flags); | ||
| 301 | |||
| 302 | /* don't actually finish bio if it's part of flush sequence */ | ||
| 303 | if (!(rq->cmd_flags & REQ_FLUSH_SEQ)) | ||
| 304 | bio_endio(bio, error); | ||
| 305 | } | ||
| 306 | |||
| 307 | void blk_mq_end_io(struct request *rq, int error) | ||
| 308 | { | 287 | { |
| 309 | struct bio *bio = rq->bio; | 288 | if (blk_update_request(rq, error, blk_rq_bytes(rq))) |
| 310 | unsigned int bytes = 0; | 289 | return true; |
| 311 | |||
| 312 | trace_block_rq_complete(rq->q, rq); | ||
| 313 | |||
| 314 | while (bio) { | ||
| 315 | struct bio *next = bio->bi_next; | ||
| 316 | |||
| 317 | bio->bi_next = NULL; | ||
| 318 | bytes += bio->bi_iter.bi_size; | ||
| 319 | blk_mq_bio_endio(rq, bio, error); | ||
| 320 | bio = next; | ||
| 321 | } | ||
| 322 | |||
| 323 | blk_account_io_completion(rq, bytes); | ||
| 324 | 290 | ||
| 325 | blk_account_io_done(rq); | 291 | blk_account_io_done(rq); |
| 326 | 292 | ||
| @@ -328,8 +294,9 @@ void blk_mq_end_io(struct request *rq, int error) | |||
| 328 | rq->end_io(rq, error); | 294 | rq->end_io(rq, error); |
| 329 | else | 295 | else |
| 330 | blk_mq_free_request(rq); | 296 | blk_mq_free_request(rq); |
| 297 | return false; | ||
| 331 | } | 298 | } |
| 332 | EXPORT_SYMBOL(blk_mq_end_io); | 299 | EXPORT_SYMBOL(blk_mq_end_io_partial); |
| 333 | 300 | ||
| 334 | static void __blk_mq_complete_request_remote(void *data) | 301 | static void __blk_mq_complete_request_remote(void *data) |
| 335 | { | 302 | { |
| @@ -730,60 +697,27 @@ static void __blk_mq_insert_request(struct blk_mq_hw_ctx *hctx, | |||
| 730 | blk_mq_add_timer(rq); | 697 | blk_mq_add_timer(rq); |
| 731 | } | 698 | } |
| 732 | 699 | ||
| 733 | void blk_mq_insert_request(struct request_queue *q, struct request *rq, | 700 | void blk_mq_insert_request(struct request *rq, bool at_head, bool run_queue, |
| 734 | bool at_head, bool run_queue) | 701 | bool async) |
| 735 | { | 702 | { |
| 703 | struct request_queue *q = rq->q; | ||
| 736 | struct blk_mq_hw_ctx *hctx; | 704 | struct blk_mq_hw_ctx *hctx; |
| 737 | struct blk_mq_ctx *ctx, *current_ctx; | 705 | struct blk_mq_ctx *ctx = rq->mq_ctx, *current_ctx; |
| 706 | |||
| 707 | current_ctx = blk_mq_get_ctx(q); | ||
| 708 | if (!cpu_online(ctx->cpu)) | ||
| 709 | rq->mq_ctx = ctx = current_ctx; | ||
| 738 | 710 | ||
| 739 | ctx = rq->mq_ctx; | ||
| 740 | hctx = q->mq_ops->map_queue(q, ctx->cpu); | 711 | hctx = q->mq_ops->map_queue(q, ctx->cpu); |
| 741 | 712 | ||
| 742 | if (rq->cmd_flags & (REQ_FLUSH | REQ_FUA)) { | 713 | if (rq->cmd_flags & (REQ_FLUSH | REQ_FUA) && |
| 714 | !(rq->cmd_flags & (REQ_FLUSH_SEQ))) { | ||
| 743 | blk_insert_flush(rq); | 715 | blk_insert_flush(rq); |
| 744 | } else { | 716 | } else { |
| 745 | current_ctx = blk_mq_get_ctx(q); | ||
| 746 | |||
| 747 | if (!cpu_online(ctx->cpu)) { | ||
| 748 | ctx = current_ctx; | ||
| 749 | hctx = q->mq_ops->map_queue(q, ctx->cpu); | ||
| 750 | rq->mq_ctx = ctx; | ||
| 751 | } | ||
| 752 | spin_lock(&ctx->lock); | 717 | spin_lock(&ctx->lock); |
| 753 | __blk_mq_insert_request(hctx, rq, at_head); | 718 | __blk_mq_insert_request(hctx, rq, at_head); |
| 754 | spin_unlock(&ctx->lock); | 719 | spin_unlock(&ctx->lock); |
| 755 | |||
| 756 | blk_mq_put_ctx(current_ctx); | ||
| 757 | } | ||
| 758 | |||
| 759 | if (run_queue) | ||
| 760 | __blk_mq_run_hw_queue(hctx); | ||
| 761 | } | ||
| 762 | EXPORT_SYMBOL(blk_mq_insert_request); | ||
| 763 | |||
| 764 | /* | ||
| 765 | * This is a special version of blk_mq_insert_request to bypass FLUSH request | ||
| 766 | * check. Should only be used internally. | ||
| 767 | */ | ||
| 768 | void blk_mq_run_request(struct request *rq, bool run_queue, bool async) | ||
| 769 | { | ||
| 770 | struct request_queue *q = rq->q; | ||
| 771 | struct blk_mq_hw_ctx *hctx; | ||
| 772 | struct blk_mq_ctx *ctx, *current_ctx; | ||
| 773 | |||
| 774 | current_ctx = blk_mq_get_ctx(q); | ||
| 775 | |||
| 776 | ctx = rq->mq_ctx; | ||
| 777 | if (!cpu_online(ctx->cpu)) { | ||
| 778 | ctx = current_ctx; | ||
| 779 | rq->mq_ctx = ctx; | ||
| 780 | } | 720 | } |
| 781 | hctx = q->mq_ops->map_queue(q, ctx->cpu); | ||
| 782 | |||
| 783 | /* ctx->cpu might be offline */ | ||
| 784 | spin_lock(&ctx->lock); | ||
| 785 | __blk_mq_insert_request(hctx, rq, false); | ||
| 786 | spin_unlock(&ctx->lock); | ||
| 787 | 721 | ||
| 788 | blk_mq_put_ctx(current_ctx); | 722 | blk_mq_put_ctx(current_ctx); |
| 789 | 723 | ||
| @@ -926,6 +860,8 @@ static void blk_mq_make_request(struct request_queue *q, struct bio *bio) | |||
| 926 | ctx = blk_mq_get_ctx(q); | 860 | ctx = blk_mq_get_ctx(q); |
| 927 | hctx = q->mq_ops->map_queue(q, ctx->cpu); | 861 | hctx = q->mq_ops->map_queue(q, ctx->cpu); |
| 928 | 862 | ||
| 863 | if (is_sync) | ||
| 864 | rw |= REQ_SYNC; | ||
| 929 | trace_block_getrq(q, bio, rw); | 865 | trace_block_getrq(q, bio, rw); |
| 930 | rq = __blk_mq_alloc_request(hctx, GFP_ATOMIC, false); | 866 | rq = __blk_mq_alloc_request(hctx, GFP_ATOMIC, false); |
| 931 | if (likely(rq)) | 867 | if (likely(rq)) |
diff --git a/block/blk-mq.h b/block/blk-mq.h index ed0035cd458e..72beba1f9d55 100644 --- a/block/blk-mq.h +++ b/block/blk-mq.h | |||
| @@ -23,7 +23,6 @@ struct blk_mq_ctx { | |||
| 23 | }; | 23 | }; |
| 24 | 24 | ||
| 25 | void __blk_mq_complete_request(struct request *rq); | 25 | void __blk_mq_complete_request(struct request *rq); |
| 26 | void blk_mq_run_request(struct request *rq, bool run_queue, bool async); | ||
| 27 | void blk_mq_run_hw_queue(struct blk_mq_hw_ctx *hctx, bool async); | 26 | void blk_mq_run_hw_queue(struct blk_mq_hw_ctx *hctx, bool async); |
| 28 | void blk_mq_init_flush(struct request_queue *q); | 27 | void blk_mq_init_flush(struct request_queue *q); |
| 29 | void blk_mq_drain_queue(struct request_queue *q); | 28 | void blk_mq_drain_queue(struct request_queue *q); |
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c index 959d41acc108..d7d32c28829b 100644 --- a/drivers/acpi/ec.c +++ b/drivers/acpi/ec.c | |||
| @@ -67,6 +67,8 @@ enum ec_command { | |||
| 67 | #define ACPI_EC_DELAY 500 /* Wait 500ms max. during EC ops */ | 67 | #define ACPI_EC_DELAY 500 /* Wait 500ms max. during EC ops */ |
| 68 | #define ACPI_EC_UDELAY_GLK 1000 /* Wait 1ms max. to get global lock */ | 68 | #define ACPI_EC_UDELAY_GLK 1000 /* Wait 1ms max. to get global lock */ |
| 69 | #define ACPI_EC_MSI_UDELAY 550 /* Wait 550us for MSI EC */ | 69 | #define ACPI_EC_MSI_UDELAY 550 /* Wait 550us for MSI EC */ |
| 70 | #define ACPI_EC_CLEAR_MAX 100 /* Maximum number of events to query | ||
| 71 | * when trying to clear the EC */ | ||
| 70 | 72 | ||
| 71 | enum { | 73 | enum { |
| 72 | EC_FLAGS_QUERY_PENDING, /* Query is pending */ | 74 | EC_FLAGS_QUERY_PENDING, /* Query is pending */ |
| @@ -116,6 +118,7 @@ EXPORT_SYMBOL(first_ec); | |||
| 116 | static int EC_FLAGS_MSI; /* Out-of-spec MSI controller */ | 118 | static int EC_FLAGS_MSI; /* Out-of-spec MSI controller */ |
| 117 | static int EC_FLAGS_VALIDATE_ECDT; /* ASUStec ECDTs need to be validated */ | 119 | static int EC_FLAGS_VALIDATE_ECDT; /* ASUStec ECDTs need to be validated */ |
| 118 | static int EC_FLAGS_SKIP_DSDT_SCAN; /* Not all BIOS survive early DSDT scan */ | 120 | static int EC_FLAGS_SKIP_DSDT_SCAN; /* Not all BIOS survive early DSDT scan */ |
| 121 | static int EC_FLAGS_CLEAR_ON_RESUME; /* Needs acpi_ec_clear() on boot/resume */ | ||
| 119 | 122 | ||
| 120 | /* -------------------------------------------------------------------------- | 123 | /* -------------------------------------------------------------------------- |
| 121 | Transaction Management | 124 | Transaction Management |
| @@ -440,6 +443,29 @@ acpi_handle ec_get_handle(void) | |||
| 440 | 443 | ||
| 441 | EXPORT_SYMBOL(ec_get_handle); | 444 | EXPORT_SYMBOL(ec_get_handle); |
| 442 | 445 | ||
| 446 | static int acpi_ec_query_unlocked(struct acpi_ec *ec, u8 *data); | ||
| 447 | |||
| 448 | /* | ||
| 449 | * Clears stale _Q events that might have accumulated in the EC. | ||
| 450 | * Run with locked ec mutex. | ||
| 451 | */ | ||
| 452 | static void acpi_ec_clear(struct acpi_ec *ec) | ||
| 453 | { | ||
| 454 | int i, status; | ||
| 455 | u8 value = 0; | ||
| 456 | |||
| 457 | for (i = 0; i < ACPI_EC_CLEAR_MAX; i++) { | ||
| 458 | status = acpi_ec_query_unlocked(ec, &value); | ||
| 459 | if (status || !value) | ||
| 460 | break; | ||
| 461 | } | ||
| 462 | |||
| 463 | if (unlikely(i == ACPI_EC_CLEAR_MAX)) | ||
| 464 | pr_warn("Warning: Maximum of %d stale EC events cleared\n", i); | ||
| 465 | else | ||
| 466 | pr_info("%d stale EC events cleared\n", i); | ||
| 467 | } | ||
| 468 | |||
| 443 | void acpi_ec_block_transactions(void) | 469 | void acpi_ec_block_transactions(void) |
| 444 | { | 470 | { |
| 445 | struct acpi_ec *ec = first_ec; | 471 | struct acpi_ec *ec = first_ec; |
| @@ -463,6 +489,10 @@ void acpi_ec_unblock_transactions(void) | |||
| 463 | mutex_lock(&ec->mutex); | 489 | mutex_lock(&ec->mutex); |
| 464 | /* Allow transactions to be carried out again */ | 490 | /* Allow transactions to be carried out again */ |
| 465 | clear_bit(EC_FLAGS_BLOCKED, &ec->flags); | 491 | clear_bit(EC_FLAGS_BLOCKED, &ec->flags); |
| 492 | |||
| 493 | if (EC_FLAGS_CLEAR_ON_RESUME) | ||
| 494 | acpi_ec_clear(ec); | ||
| 495 | |||
| 466 | mutex_unlock(&ec->mutex); | 496 | mutex_unlock(&ec->mutex); |
| 467 | } | 497 | } |
| 468 | 498 | ||
| @@ -821,6 +851,13 @@ static int acpi_ec_add(struct acpi_device *device) | |||
| 821 | 851 | ||
| 822 | /* EC is fully operational, allow queries */ | 852 | /* EC is fully operational, allow queries */ |
| 823 | clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags); | 853 | clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags); |
| 854 | |||
| 855 | /* Clear stale _Q events if hardware might require that */ | ||
| 856 | if (EC_FLAGS_CLEAR_ON_RESUME) { | ||
| 857 | mutex_lock(&ec->mutex); | ||
| 858 | acpi_ec_clear(ec); | ||
| 859 | mutex_unlock(&ec->mutex); | ||
| 860 | } | ||
| 824 | return ret; | 861 | return ret; |
| 825 | } | 862 | } |
| 826 | 863 | ||
| @@ -922,6 +959,30 @@ static int ec_enlarge_storm_threshold(const struct dmi_system_id *id) | |||
| 922 | return 0; | 959 | return 0; |
| 923 | } | 960 | } |
| 924 | 961 | ||
| 962 | /* | ||
| 963 | * On some hardware it is necessary to clear events accumulated by the EC during | ||
| 964 | * sleep. These ECs stop reporting GPEs until they are manually polled, if too | ||
| 965 | * many events are accumulated. (e.g. Samsung Series 5/9 notebooks) | ||
| 966 | * | ||
| 967 | * https://bugzilla.kernel.org/show_bug.cgi?id=44161 | ||
| 968 | * | ||
| 969 | * Ideally, the EC should also be instructed NOT to accumulate events during | ||
| 970 | * sleep (which Windows seems to do somehow), but the interface to control this | ||
| 971 | * behaviour is not known at this time. | ||
| 972 | * | ||
| 973 | * Models known to be affected are Samsung 530Uxx/535Uxx/540Uxx/550Pxx/900Xxx, | ||
| 974 | * however it is very likely that other Samsung models are affected. | ||
| 975 | * | ||
| 976 | * On systems which don't accumulate _Q events during sleep, this extra check | ||
| 977 | * should be harmless. | ||
| 978 | */ | ||
| 979 | static int ec_clear_on_resume(const struct dmi_system_id *id) | ||
| 980 | { | ||
| 981 | pr_debug("Detected system needing EC poll on resume.\n"); | ||
| 982 | EC_FLAGS_CLEAR_ON_RESUME = 1; | ||
| 983 | return 0; | ||
| 984 | } | ||
| 985 | |||
| 925 | static struct dmi_system_id ec_dmi_table[] __initdata = { | 986 | static struct dmi_system_id ec_dmi_table[] __initdata = { |
| 926 | { | 987 | { |
| 927 | ec_skip_dsdt_scan, "Compal JFL92", { | 988 | ec_skip_dsdt_scan, "Compal JFL92", { |
| @@ -965,6 +1026,9 @@ static struct dmi_system_id ec_dmi_table[] __initdata = { | |||
| 965 | ec_validate_ecdt, "ASUS hardware", { | 1026 | ec_validate_ecdt, "ASUS hardware", { |
| 966 | DMI_MATCH(DMI_SYS_VENDOR, "ASUSTek Computer Inc."), | 1027 | DMI_MATCH(DMI_SYS_VENDOR, "ASUSTek Computer Inc."), |
| 967 | DMI_MATCH(DMI_PRODUCT_NAME, "L4R"),}, NULL}, | 1028 | DMI_MATCH(DMI_PRODUCT_NAME, "L4R"),}, NULL}, |
| 1029 | { | ||
| 1030 | ec_clear_on_resume, "Samsung hardware", { | ||
| 1031 | DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD.")}, NULL}, | ||
| 968 | {}, | 1032 | {}, |
| 969 | }; | 1033 | }; |
| 970 | 1034 | ||
diff --git a/drivers/acpi/processor_throttling.c b/drivers/acpi/processor_throttling.c index 28baa05b8018..84243c32e29c 100644 --- a/drivers/acpi/processor_throttling.c +++ b/drivers/acpi/processor_throttling.c | |||
| @@ -56,6 +56,12 @@ struct throttling_tstate { | |||
| 56 | int target_state; /* target T-state */ | 56 | int target_state; /* target T-state */ |
| 57 | }; | 57 | }; |
| 58 | 58 | ||
| 59 | struct acpi_processor_throttling_arg { | ||
| 60 | struct acpi_processor *pr; | ||
| 61 | int target_state; | ||
| 62 | bool force; | ||
| 63 | }; | ||
| 64 | |||
| 59 | #define THROTTLING_PRECHANGE (1) | 65 | #define THROTTLING_PRECHANGE (1) |
| 60 | #define THROTTLING_POSTCHANGE (2) | 66 | #define THROTTLING_POSTCHANGE (2) |
| 61 | 67 | ||
| @@ -1060,16 +1066,24 @@ static int acpi_processor_set_throttling_ptc(struct acpi_processor *pr, | |||
| 1060 | return 0; | 1066 | return 0; |
| 1061 | } | 1067 | } |
| 1062 | 1068 | ||
| 1069 | static long acpi_processor_throttling_fn(void *data) | ||
| 1070 | { | ||
| 1071 | struct acpi_processor_throttling_arg *arg = data; | ||
| 1072 | struct acpi_processor *pr = arg->pr; | ||
| 1073 | |||
| 1074 | return pr->throttling.acpi_processor_set_throttling(pr, | ||
| 1075 | arg->target_state, arg->force); | ||
| 1076 | } | ||
| 1077 | |||
| 1063 | int acpi_processor_set_throttling(struct acpi_processor *pr, | 1078 | int acpi_processor_set_throttling(struct acpi_processor *pr, |
| 1064 | int state, bool force) | 1079 | int state, bool force) |
| 1065 | { | 1080 | { |
| 1066 | cpumask_var_t saved_mask; | ||
| 1067 | int ret = 0; | 1081 | int ret = 0; |
| 1068 | unsigned int i; | 1082 | unsigned int i; |
| 1069 | struct acpi_processor *match_pr; | 1083 | struct acpi_processor *match_pr; |
| 1070 | struct acpi_processor_throttling *p_throttling; | 1084 | struct acpi_processor_throttling *p_throttling; |
| 1085 | struct acpi_processor_throttling_arg arg; | ||
| 1071 | struct throttling_tstate t_state; | 1086 | struct throttling_tstate t_state; |
| 1072 | cpumask_var_t online_throttling_cpus; | ||
| 1073 | 1087 | ||
| 1074 | if (!pr) | 1088 | if (!pr) |
| 1075 | return -EINVAL; | 1089 | return -EINVAL; |
| @@ -1080,14 +1094,6 @@ int acpi_processor_set_throttling(struct acpi_processor *pr, | |||
| 1080 | if ((state < 0) || (state > (pr->throttling.state_count - 1))) | 1094 | if ((state < 0) || (state > (pr->throttling.state_count - 1))) |
| 1081 | return -EINVAL; | 1095 | return -EINVAL; |
| 1082 | 1096 | ||
| 1083 | if (!alloc_cpumask_var(&saved_mask, GFP_KERNEL)) | ||
| 1084 | return -ENOMEM; | ||
| 1085 | |||
| 1086 | if (!alloc_cpumask_var(&online_throttling_cpus, GFP_KERNEL)) { | ||
| 1087 | free_cpumask_var(saved_mask); | ||
| 1088 | return -ENOMEM; | ||
| 1089 | } | ||
| 1090 | |||
| 1091 | if (cpu_is_offline(pr->id)) { | 1097 | if (cpu_is_offline(pr->id)) { |
| 1092 | /* | 1098 | /* |
| 1093 | * the cpu pointed by pr->id is offline. Unnecessary to change | 1099 | * the cpu pointed by pr->id is offline. Unnecessary to change |
| @@ -1096,17 +1102,15 @@ int acpi_processor_set_throttling(struct acpi_processor *pr, | |||
| 1096 | return -ENODEV; | 1102 | return -ENODEV; |
| 1097 | } | 1103 | } |
| 1098 | 1104 | ||
| 1099 | cpumask_copy(saved_mask, ¤t->cpus_allowed); | ||
| 1100 | t_state.target_state = state; | 1105 | t_state.target_state = state; |
| 1101 | p_throttling = &(pr->throttling); | 1106 | p_throttling = &(pr->throttling); |
| 1102 | cpumask_and(online_throttling_cpus, cpu_online_mask, | 1107 | |
| 1103 | p_throttling->shared_cpu_map); | ||
| 1104 | /* | 1108 | /* |
| 1105 | * The throttling notifier will be called for every | 1109 | * The throttling notifier will be called for every |
| 1106 | * affected cpu in order to get one proper T-state. | 1110 | * affected cpu in order to get one proper T-state. |
| 1107 | * The notifier event is THROTTLING_PRECHANGE. | 1111 | * The notifier event is THROTTLING_PRECHANGE. |
| 1108 | */ | 1112 | */ |
| 1109 | for_each_cpu(i, online_throttling_cpus) { | 1113 | for_each_cpu_and(i, cpu_online_mask, p_throttling->shared_cpu_map) { |
| 1110 | t_state.cpu = i; | 1114 | t_state.cpu = i; |
| 1111 | acpi_processor_throttling_notifier(THROTTLING_PRECHANGE, | 1115 | acpi_processor_throttling_notifier(THROTTLING_PRECHANGE, |
| 1112 | &t_state); | 1116 | &t_state); |
| @@ -1118,21 +1122,18 @@ int acpi_processor_set_throttling(struct acpi_processor *pr, | |||
| 1118 | * it can be called only for the cpu pointed by pr. | 1122 | * it can be called only for the cpu pointed by pr. |
| 1119 | */ | 1123 | */ |
| 1120 | if (p_throttling->shared_type == DOMAIN_COORD_TYPE_SW_ANY) { | 1124 | if (p_throttling->shared_type == DOMAIN_COORD_TYPE_SW_ANY) { |
| 1121 | /* FIXME: use work_on_cpu() */ | 1125 | arg.pr = pr; |
| 1122 | if (set_cpus_allowed_ptr(current, cpumask_of(pr->id))) { | 1126 | arg.target_state = state; |
| 1123 | /* Can't migrate to the pr->id CPU. Exit */ | 1127 | arg.force = force; |
| 1124 | ret = -ENODEV; | 1128 | ret = work_on_cpu(pr->id, acpi_processor_throttling_fn, &arg); |
| 1125 | goto exit; | ||
| 1126 | } | ||
| 1127 | ret = p_throttling->acpi_processor_set_throttling(pr, | ||
| 1128 | t_state.target_state, force); | ||
| 1129 | } else { | 1129 | } else { |
| 1130 | /* | 1130 | /* |
| 1131 | * When the T-state coordination is SW_ALL or HW_ALL, | 1131 | * When the T-state coordination is SW_ALL or HW_ALL, |
| 1132 | * it is necessary to set T-state for every affected | 1132 | * it is necessary to set T-state for every affected |
| 1133 | * cpus. | 1133 | * cpus. |
| 1134 | */ | 1134 | */ |
| 1135 | for_each_cpu(i, online_throttling_cpus) { | 1135 | for_each_cpu_and(i, cpu_online_mask, |
| 1136 | p_throttling->shared_cpu_map) { | ||
| 1136 | match_pr = per_cpu(processors, i); | 1137 | match_pr = per_cpu(processors, i); |
| 1137 | /* | 1138 | /* |
| 1138 | * If the pointer is invalid, we will report the | 1139 | * If the pointer is invalid, we will report the |
| @@ -1153,13 +1154,12 @@ int acpi_processor_set_throttling(struct acpi_processor *pr, | |||
| 1153 | "on CPU %d\n", i)); | 1154 | "on CPU %d\n", i)); |
| 1154 | continue; | 1155 | continue; |
| 1155 | } | 1156 | } |
| 1156 | t_state.cpu = i; | 1157 | |
| 1157 | /* FIXME: use work_on_cpu() */ | 1158 | arg.pr = match_pr; |
| 1158 | if (set_cpus_allowed_ptr(current, cpumask_of(i))) | 1159 | arg.target_state = state; |
| 1159 | continue; | 1160 | arg.force = force; |
| 1160 | ret = match_pr->throttling. | 1161 | ret = work_on_cpu(pr->id, acpi_processor_throttling_fn, |
| 1161 | acpi_processor_set_throttling( | 1162 | &arg); |
| 1162 | match_pr, t_state.target_state, force); | ||
| 1163 | } | 1163 | } |
| 1164 | } | 1164 | } |
| 1165 | /* | 1165 | /* |
| @@ -1168,17 +1168,12 @@ int acpi_processor_set_throttling(struct acpi_processor *pr, | |||
| 1168 | * affected cpu to update the T-states. | 1168 | * affected cpu to update the T-states. |
| 1169 | * The notifier event is THROTTLING_POSTCHANGE | 1169 | * The notifier event is THROTTLING_POSTCHANGE |
| 1170 | */ | 1170 | */ |
| 1171 | for_each_cpu(i, online_throttling_cpus) { | 1171 | for_each_cpu_and(i, cpu_online_mask, p_throttling->shared_cpu_map) { |
| 1172 | t_state.cpu = i; | 1172 | t_state.cpu = i; |
| 1173 | acpi_processor_throttling_notifier(THROTTLING_POSTCHANGE, | 1173 | acpi_processor_throttling_notifier(THROTTLING_POSTCHANGE, |
| 1174 | &t_state); | 1174 | &t_state); |
| 1175 | } | 1175 | } |
| 1176 | /* restore the previous state */ | 1176 | |
| 1177 | /* FIXME: use work_on_cpu() */ | ||
| 1178 | set_cpus_allowed_ptr(current, saved_mask); | ||
| 1179 | exit: | ||
| 1180 | free_cpumask_var(online_throttling_cpus); | ||
| 1181 | free_cpumask_var(saved_mask); | ||
| 1182 | return ret; | 1177 | return ret; |
| 1183 | } | 1178 | } |
| 1184 | 1179 | ||
diff --git a/drivers/acpi/resource.c b/drivers/acpi/resource.c index b7201fc6f1e1..0bdacc5e26a3 100644 --- a/drivers/acpi/resource.c +++ b/drivers/acpi/resource.c | |||
| @@ -77,18 +77,24 @@ bool acpi_dev_resource_memory(struct acpi_resource *ares, struct resource *res) | |||
| 77 | switch (ares->type) { | 77 | switch (ares->type) { |
| 78 | case ACPI_RESOURCE_TYPE_MEMORY24: | 78 | case ACPI_RESOURCE_TYPE_MEMORY24: |
| 79 | memory24 = &ares->data.memory24; | 79 | memory24 = &ares->data.memory24; |
| 80 | if (!memory24->address_length) | ||
| 81 | return false; | ||
| 80 | acpi_dev_get_memresource(res, memory24->minimum, | 82 | acpi_dev_get_memresource(res, memory24->minimum, |
| 81 | memory24->address_length, | 83 | memory24->address_length, |
| 82 | memory24->write_protect); | 84 | memory24->write_protect); |
| 83 | break; | 85 | break; |
| 84 | case ACPI_RESOURCE_TYPE_MEMORY32: | 86 | case ACPI_RESOURCE_TYPE_MEMORY32: |
| 85 | memory32 = &ares->data.memory32; | 87 | memory32 = &ares->data.memory32; |
| 88 | if (!memory32->address_length) | ||
| 89 | return false; | ||
| 86 | acpi_dev_get_memresource(res, memory32->minimum, | 90 | acpi_dev_get_memresource(res, memory32->minimum, |
| 87 | memory32->address_length, | 91 | memory32->address_length, |
| 88 | memory32->write_protect); | 92 | memory32->write_protect); |
| 89 | break; | 93 | break; |
| 90 | case ACPI_RESOURCE_TYPE_FIXED_MEMORY32: | 94 | case ACPI_RESOURCE_TYPE_FIXED_MEMORY32: |
| 91 | fixed_memory32 = &ares->data.fixed_memory32; | 95 | fixed_memory32 = &ares->data.fixed_memory32; |
| 96 | if (!fixed_memory32->address_length) | ||
| 97 | return false; | ||
| 92 | acpi_dev_get_memresource(res, fixed_memory32->address, | 98 | acpi_dev_get_memresource(res, fixed_memory32->address, |
| 93 | fixed_memory32->address_length, | 99 | fixed_memory32->address_length, |
| 94 | fixed_memory32->write_protect); | 100 | fixed_memory32->write_protect); |
| @@ -144,12 +150,16 @@ bool acpi_dev_resource_io(struct acpi_resource *ares, struct resource *res) | |||
| 144 | switch (ares->type) { | 150 | switch (ares->type) { |
| 145 | case ACPI_RESOURCE_TYPE_IO: | 151 | case ACPI_RESOURCE_TYPE_IO: |
| 146 | io = &ares->data.io; | 152 | io = &ares->data.io; |
| 153 | if (!io->address_length) | ||
| 154 | return false; | ||
| 147 | acpi_dev_get_ioresource(res, io->minimum, | 155 | acpi_dev_get_ioresource(res, io->minimum, |
| 148 | io->address_length, | 156 | io->address_length, |
| 149 | io->io_decode); | 157 | io->io_decode); |
| 150 | break; | 158 | break; |
| 151 | case ACPI_RESOURCE_TYPE_FIXED_IO: | 159 | case ACPI_RESOURCE_TYPE_FIXED_IO: |
| 152 | fixed_io = &ares->data.fixed_io; | 160 | fixed_io = &ares->data.fixed_io; |
| 161 | if (!fixed_io->address_length) | ||
| 162 | return false; | ||
| 153 | acpi_dev_get_ioresource(res, fixed_io->address, | 163 | acpi_dev_get_ioresource(res, fixed_io->address, |
| 154 | fixed_io->address_length, | 164 | fixed_io->address_length, |
| 155 | ACPI_DECODE_10); | 165 | ACPI_DECODE_10); |
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 1a3dbd1b196e..65d3f1b5966c 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
| @@ -4175,6 +4175,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { | |||
| 4175 | 4175 | ||
| 4176 | /* Seagate Momentus SpinPoint M8 seem to have FPMDA_AA issues */ | 4176 | /* Seagate Momentus SpinPoint M8 seem to have FPMDA_AA issues */ |
| 4177 | { "ST1000LM024 HN-M101MBB", "2AR10001", ATA_HORKAGE_BROKEN_FPDMA_AA }, | 4177 | { "ST1000LM024 HN-M101MBB", "2AR10001", ATA_HORKAGE_BROKEN_FPDMA_AA }, |
| 4178 | { "ST1000LM024 HN-M101MBB", "2BA30001", ATA_HORKAGE_BROKEN_FPDMA_AA }, | ||
| 4178 | 4179 | ||
| 4179 | /* Blacklist entries taken from Silicon Image 3124/3132 | 4180 | /* Blacklist entries taken from Silicon Image 3124/3132 |
| 4180 | Windows driver .inf file - also several Linux problem reports */ | 4181 | Windows driver .inf file - also several Linux problem reports */ |
| @@ -4225,6 +4226,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { | |||
| 4225 | /* devices that don't properly handle queued TRIM commands */ | 4226 | /* devices that don't properly handle queued TRIM commands */ |
| 4226 | { "Micron_M500*", NULL, ATA_HORKAGE_NO_NCQ_TRIM, }, | 4227 | { "Micron_M500*", NULL, ATA_HORKAGE_NO_NCQ_TRIM, }, |
| 4227 | { "Crucial_CT???M500SSD1", NULL, ATA_HORKAGE_NO_NCQ_TRIM, }, | 4228 | { "Crucial_CT???M500SSD1", NULL, ATA_HORKAGE_NO_NCQ_TRIM, }, |
| 4229 | { "Crucial_CT???M500SSD3", NULL, ATA_HORKAGE_NO_NCQ_TRIM, }, | ||
| 4228 | 4230 | ||
| 4229 | /* | 4231 | /* |
| 4230 | * Some WD SATA-I drives spin up and down erratically when the link | 4232 | * Some WD SATA-I drives spin up and down erratically when the link |
diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c index 8a97ddfa6122..c30df50e4440 100644 --- a/drivers/base/firmware_class.c +++ b/drivers/base/firmware_class.c | |||
| @@ -1580,6 +1580,7 @@ static int fw_pm_notify(struct notifier_block *notify_block, | |||
| 1580 | switch (mode) { | 1580 | switch (mode) { |
| 1581 | case PM_HIBERNATION_PREPARE: | 1581 | case PM_HIBERNATION_PREPARE: |
| 1582 | case PM_SUSPEND_PREPARE: | 1582 | case PM_SUSPEND_PREPARE: |
| 1583 | case PM_RESTORE_PREPARE: | ||
| 1583 | kill_requests_without_uevent(); | 1584 | kill_requests_without_uevent(); |
| 1584 | device_cache_fw_images(); | 1585 | device_cache_fw_images(); |
| 1585 | break; | 1586 | break; |
diff --git a/drivers/block/aoe/aoecmd.c b/drivers/block/aoe/aoecmd.c index 8184451b57c0..422b7d84f686 100644 --- a/drivers/block/aoe/aoecmd.c +++ b/drivers/block/aoe/aoecmd.c | |||
| @@ -874,7 +874,7 @@ bio_pageinc(struct bio *bio) | |||
| 874 | /* Non-zero page count for non-head members of | 874 | /* Non-zero page count for non-head members of |
| 875 | * compound pages is no longer allowed by the kernel. | 875 | * compound pages is no longer allowed by the kernel. |
| 876 | */ | 876 | */ |
| 877 | page = compound_trans_head(bv.bv_page); | 877 | page = compound_head(bv.bv_page); |
| 878 | atomic_inc(&page->_count); | 878 | atomic_inc(&page->_count); |
| 879 | } | 879 | } |
| 880 | } | 880 | } |
| @@ -887,7 +887,7 @@ bio_pagedec(struct bio *bio) | |||
| 887 | struct bvec_iter iter; | 887 | struct bvec_iter iter; |
| 888 | 888 | ||
| 889 | bio_for_each_segment(bv, bio, iter) { | 889 | bio_for_each_segment(bv, bio, iter) { |
| 890 | page = compound_trans_head(bv.bv_page); | 890 | page = compound_head(bv.bv_page); |
| 891 | atomic_dec(&page->_count); | 891 | atomic_dec(&page->_count); |
| 892 | } | 892 | } |
| 893 | } | 893 | } |
diff --git a/drivers/block/mtip32xx/mtip32xx.h b/drivers/block/mtip32xx/mtip32xx.h index b52e9a6d6aad..54174cb32feb 100644 --- a/drivers/block/mtip32xx/mtip32xx.h +++ b/drivers/block/mtip32xx/mtip32xx.h | |||
| @@ -53,7 +53,7 @@ | |||
| 53 | #define MTIP_FTL_REBUILD_TIMEOUT_MS 2400000 | 53 | #define MTIP_FTL_REBUILD_TIMEOUT_MS 2400000 |
| 54 | 54 | ||
| 55 | /* unaligned IO handling */ | 55 | /* unaligned IO handling */ |
| 56 | #define MTIP_MAX_UNALIGNED_SLOTS 8 | 56 | #define MTIP_MAX_UNALIGNED_SLOTS 2 |
| 57 | 57 | ||
| 58 | /* Macro to extract the tag bit number from a tag value. */ | 58 | /* Macro to extract the tag bit number from a tag value. */ |
| 59 | #define MTIP_TAG_BIT(tag) (tag & 0x1F) | 59 | #define MTIP_TAG_BIT(tag) (tag & 0x1F) |
diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 011e55d820b1..51c557cfd92b 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c | |||
| @@ -612,6 +612,8 @@ static ssize_t disksize_store(struct device *dev, | |||
| 612 | 612 | ||
| 613 | disksize = PAGE_ALIGN(disksize); | 613 | disksize = PAGE_ALIGN(disksize); |
| 614 | meta = zram_meta_alloc(disksize); | 614 | meta = zram_meta_alloc(disksize); |
| 615 | if (!meta) | ||
| 616 | return -ENOMEM; | ||
| 615 | down_write(&zram->init_lock); | 617 | down_write(&zram->init_lock); |
| 616 | if (zram->init_done) { | 618 | if (zram->init_done) { |
| 617 | up_write(&zram->init_lock); | 619 | up_write(&zram->init_lock); |
diff --git a/drivers/clk/at91/clk-master.c b/drivers/clk/at91/clk-master.c index bd313f7816a8..c1af80bcdf20 100644 --- a/drivers/clk/at91/clk-master.c +++ b/drivers/clk/at91/clk-master.c | |||
| @@ -242,7 +242,7 @@ of_at91_clk_master_setup(struct device_node *np, struct at91_pmc *pmc, | |||
| 242 | 242 | ||
| 243 | irq = irq_of_parse_and_map(np, 0); | 243 | irq = irq_of_parse_and_map(np, 0); |
| 244 | if (!irq) | 244 | if (!irq) |
| 245 | return; | 245 | goto out_free_characteristics; |
| 246 | 246 | ||
| 247 | clk = at91_clk_register_master(pmc, irq, name, num_parents, | 247 | clk = at91_clk_register_master(pmc, irq, name, num_parents, |
| 248 | parent_names, layout, | 248 | parent_names, layout, |
diff --git a/drivers/clk/clk-nomadik.c b/drivers/clk/clk-nomadik.c index 6a934a5296bd..05e04ce0f148 100644 --- a/drivers/clk/clk-nomadik.c +++ b/drivers/clk/clk-nomadik.c | |||
| @@ -494,6 +494,9 @@ static const struct file_operations nomadik_src_clk_debugfs_ops = { | |||
| 494 | 494 | ||
| 495 | static int __init nomadik_src_clk_init_debugfs(void) | 495 | static int __init nomadik_src_clk_init_debugfs(void) |
| 496 | { | 496 | { |
| 497 | /* Vital for multiplatform */ | ||
| 498 | if (!src_base) | ||
| 499 | return -ENODEV; | ||
| 497 | src_pcksr0_boot = readl(src_base + SRC_PCKSR0); | 500 | src_pcksr0_boot = readl(src_base + SRC_PCKSR0); |
| 498 | src_pcksr1_boot = readl(src_base + SRC_PCKSR1); | 501 | src_pcksr1_boot = readl(src_base + SRC_PCKSR1); |
| 499 | debugfs_create_file("nomadik-src-clk", S_IFREG | S_IRUGO, | 502 | debugfs_create_file("nomadik-src-clk", S_IFREG | S_IRUGO, |
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index 5517944495d8..c42e608af6bb 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c | |||
| @@ -2226,24 +2226,25 @@ EXPORT_SYMBOL_GPL(devm_clk_unregister); | |||
| 2226 | */ | 2226 | */ |
| 2227 | int __clk_get(struct clk *clk) | 2227 | int __clk_get(struct clk *clk) |
| 2228 | { | 2228 | { |
| 2229 | if (clk && !try_module_get(clk->owner)) | 2229 | if (clk) { |
| 2230 | return 0; | 2230 | if (!try_module_get(clk->owner)) |
| 2231 | return 0; | ||
| 2231 | 2232 | ||
| 2232 | kref_get(&clk->ref); | 2233 | kref_get(&clk->ref); |
| 2234 | } | ||
| 2233 | return 1; | 2235 | return 1; |
| 2234 | } | 2236 | } |
| 2235 | 2237 | ||
| 2236 | void __clk_put(struct clk *clk) | 2238 | void __clk_put(struct clk *clk) |
| 2237 | { | 2239 | { |
| 2238 | if (WARN_ON_ONCE(IS_ERR(clk))) | 2240 | if (!clk || WARN_ON_ONCE(IS_ERR(clk))) |
| 2239 | return; | 2241 | return; |
| 2240 | 2242 | ||
| 2241 | clk_prepare_lock(); | 2243 | clk_prepare_lock(); |
| 2242 | kref_put(&clk->ref, __clk_release); | 2244 | kref_put(&clk->ref, __clk_release); |
| 2243 | clk_prepare_unlock(); | 2245 | clk_prepare_unlock(); |
| 2244 | 2246 | ||
| 2245 | if (clk) | 2247 | module_put(clk->owner); |
| 2246 | module_put(clk->owner); | ||
| 2247 | } | 2248 | } |
| 2248 | 2249 | ||
| 2249 | /*** clk rate change notifiers ***/ | 2250 | /*** clk rate change notifiers ***/ |
diff --git a/drivers/clk/keystone/gate.c b/drivers/clk/keystone/gate.c index 17a598398a53..86f1e362eafb 100644 --- a/drivers/clk/keystone/gate.c +++ b/drivers/clk/keystone/gate.c | |||
| @@ -179,6 +179,7 @@ static struct clk *clk_register_psc(struct device *dev, | |||
| 179 | 179 | ||
| 180 | init.name = name; | 180 | init.name = name; |
| 181 | init.ops = &clk_psc_ops; | 181 | init.ops = &clk_psc_ops; |
| 182 | init.flags = 0; | ||
| 182 | init.parent_names = (parent_name ? &parent_name : NULL); | 183 | init.parent_names = (parent_name ? &parent_name : NULL); |
| 183 | init.num_parents = (parent_name ? 1 : 0); | 184 | init.num_parents = (parent_name ? 1 : 0); |
| 184 | 185 | ||
diff --git a/drivers/clk/mvebu/armada-370.c b/drivers/clk/mvebu/armada-370.c index 81a202d12a7a..bef198a83863 100644 --- a/drivers/clk/mvebu/armada-370.c +++ b/drivers/clk/mvebu/armada-370.c | |||
| @@ -141,13 +141,6 @@ static const struct coreclk_soc_desc a370_coreclks = { | |||
| 141 | .num_ratios = ARRAY_SIZE(a370_coreclk_ratios), | 141 | .num_ratios = ARRAY_SIZE(a370_coreclk_ratios), |
| 142 | }; | 142 | }; |
| 143 | 143 | ||
| 144 | static void __init a370_coreclk_init(struct device_node *np) | ||
| 145 | { | ||
| 146 | mvebu_coreclk_setup(np, &a370_coreclks); | ||
| 147 | } | ||
| 148 | CLK_OF_DECLARE(a370_core_clk, "marvell,armada-370-core-clock", | ||
| 149 | a370_coreclk_init); | ||
| 150 | |||
| 151 | /* | 144 | /* |
| 152 | * Clock Gating Control | 145 | * Clock Gating Control |
| 153 | */ | 146 | */ |
| @@ -168,9 +161,15 @@ static const struct clk_gating_soc_desc a370_gating_desc[] __initconst = { | |||
| 168 | { } | 161 | { } |
| 169 | }; | 162 | }; |
| 170 | 163 | ||
| 171 | static void __init a370_clk_gating_init(struct device_node *np) | 164 | static void __init a370_clk_init(struct device_node *np) |
| 172 | { | 165 | { |
| 173 | mvebu_clk_gating_setup(np, a370_gating_desc); | 166 | struct device_node *cgnp = |
| 167 | of_find_compatible_node(NULL, NULL, "marvell,armada-370-gating-clock"); | ||
| 168 | |||
| 169 | mvebu_coreclk_setup(np, &a370_coreclks); | ||
| 170 | |||
| 171 | if (cgnp) | ||
| 172 | mvebu_clk_gating_setup(cgnp, a370_gating_desc); | ||
| 174 | } | 173 | } |
| 175 | CLK_OF_DECLARE(a370_clk_gating, "marvell,armada-370-gating-clock", | 174 | CLK_OF_DECLARE(a370_clk, "marvell,armada-370-core-clock", a370_clk_init); |
| 176 | a370_clk_gating_init); | 175 | |
diff --git a/drivers/clk/mvebu/armada-xp.c b/drivers/clk/mvebu/armada-xp.c index 9922c4475aa8..b3094315a3c0 100644 --- a/drivers/clk/mvebu/armada-xp.c +++ b/drivers/clk/mvebu/armada-xp.c | |||
| @@ -158,13 +158,6 @@ static const struct coreclk_soc_desc axp_coreclks = { | |||
| 158 | .num_ratios = ARRAY_SIZE(axp_coreclk_ratios), | 158 | .num_ratios = ARRAY_SIZE(axp_coreclk_ratios), |
| 159 | }; | 159 | }; |
| 160 | 160 | ||
| 161 | static void __init axp_coreclk_init(struct device_node *np) | ||
| 162 | { | ||
| 163 | mvebu_coreclk_setup(np, &axp_coreclks); | ||
| 164 | } | ||
| 165 | CLK_OF_DECLARE(axp_core_clk, "marvell,armada-xp-core-clock", | ||
| 166 | axp_coreclk_init); | ||
| 167 | |||
| 168 | /* | 161 | /* |
| 169 | * Clock Gating Control | 162 | * Clock Gating Control |
| 170 | */ | 163 | */ |
| @@ -202,9 +195,14 @@ static const struct clk_gating_soc_desc axp_gating_desc[] __initconst = { | |||
| 202 | { } | 195 | { } |
| 203 | }; | 196 | }; |
| 204 | 197 | ||
| 205 | static void __init axp_clk_gating_init(struct device_node *np) | 198 | static void __init axp_clk_init(struct device_node *np) |
| 206 | { | 199 | { |
| 207 | mvebu_clk_gating_setup(np, axp_gating_desc); | 200 | struct device_node *cgnp = |
| 201 | of_find_compatible_node(NULL, NULL, "marvell,armada-xp-gating-clock"); | ||
| 202 | |||
| 203 | mvebu_coreclk_setup(np, &axp_coreclks); | ||
| 204 | |||
| 205 | if (cgnp) | ||
| 206 | mvebu_clk_gating_setup(cgnp, axp_gating_desc); | ||
| 208 | } | 207 | } |
| 209 | CLK_OF_DECLARE(axp_clk_gating, "marvell,armada-xp-gating-clock", | 208 | CLK_OF_DECLARE(axp_clk, "marvell,armada-xp-core-clock", axp_clk_init); |
| 210 | axp_clk_gating_init); | ||
diff --git a/drivers/clk/mvebu/dove.c b/drivers/clk/mvebu/dove.c index 38aee1e3f242..b8c2424ac926 100644 --- a/drivers/clk/mvebu/dove.c +++ b/drivers/clk/mvebu/dove.c | |||
| @@ -154,12 +154,6 @@ static const struct coreclk_soc_desc dove_coreclks = { | |||
| 154 | .num_ratios = ARRAY_SIZE(dove_coreclk_ratios), | 154 | .num_ratios = ARRAY_SIZE(dove_coreclk_ratios), |
| 155 | }; | 155 | }; |
| 156 | 156 | ||
| 157 | static void __init dove_coreclk_init(struct device_node *np) | ||
| 158 | { | ||
| 159 | mvebu_coreclk_setup(np, &dove_coreclks); | ||
| 160 | } | ||
| 161 | CLK_OF_DECLARE(dove_core_clk, "marvell,dove-core-clock", dove_coreclk_init); | ||
| 162 | |||
| 163 | /* | 157 | /* |
| 164 | * Clock Gating Control | 158 | * Clock Gating Control |
| 165 | */ | 159 | */ |
| @@ -186,9 +180,14 @@ static const struct clk_gating_soc_desc dove_gating_desc[] __initconst = { | |||
| 186 | { } | 180 | { } |
| 187 | }; | 181 | }; |
| 188 | 182 | ||
| 189 | static void __init dove_clk_gating_init(struct device_node *np) | 183 | static void __init dove_clk_init(struct device_node *np) |
| 190 | { | 184 | { |
| 191 | mvebu_clk_gating_setup(np, dove_gating_desc); | 185 | struct device_node *cgnp = |
| 186 | of_find_compatible_node(NULL, NULL, "marvell,dove-gating-clock"); | ||
| 187 | |||
| 188 | mvebu_coreclk_setup(np, &dove_coreclks); | ||
| 189 | |||
| 190 | if (cgnp) | ||
| 191 | mvebu_clk_gating_setup(cgnp, dove_gating_desc); | ||
| 192 | } | 192 | } |
| 193 | CLK_OF_DECLARE(dove_clk_gating, "marvell,dove-gating-clock", | 193 | CLK_OF_DECLARE(dove_clk, "marvell,dove-core-clock", dove_clk_init); |
| 194 | dove_clk_gating_init); | ||
diff --git a/drivers/clk/mvebu/kirkwood.c b/drivers/clk/mvebu/kirkwood.c index 2636a55f29f9..ddb666a86500 100644 --- a/drivers/clk/mvebu/kirkwood.c +++ b/drivers/clk/mvebu/kirkwood.c | |||
| @@ -193,13 +193,6 @@ static const struct coreclk_soc_desc kirkwood_coreclks = { | |||
| 193 | .num_ratios = ARRAY_SIZE(kirkwood_coreclk_ratios), | 193 | .num_ratios = ARRAY_SIZE(kirkwood_coreclk_ratios), |
| 194 | }; | 194 | }; |
| 195 | 195 | ||
| 196 | static void __init kirkwood_coreclk_init(struct device_node *np) | ||
| 197 | { | ||
| 198 | mvebu_coreclk_setup(np, &kirkwood_coreclks); | ||
| 199 | } | ||
| 200 | CLK_OF_DECLARE(kirkwood_core_clk, "marvell,kirkwood-core-clock", | ||
| 201 | kirkwood_coreclk_init); | ||
| 202 | |||
| 203 | static const struct coreclk_soc_desc mv88f6180_coreclks = { | 196 | static const struct coreclk_soc_desc mv88f6180_coreclks = { |
| 204 | .get_tclk_freq = kirkwood_get_tclk_freq, | 197 | .get_tclk_freq = kirkwood_get_tclk_freq, |
| 205 | .get_cpu_freq = mv88f6180_get_cpu_freq, | 198 | .get_cpu_freq = mv88f6180_get_cpu_freq, |
| @@ -208,13 +201,6 @@ static const struct coreclk_soc_desc mv88f6180_coreclks = { | |||
| 208 | .num_ratios = ARRAY_SIZE(kirkwood_coreclk_ratios), | 201 | .num_ratios = ARRAY_SIZE(kirkwood_coreclk_ratios), |
| 209 | }; | 202 | }; |
| 210 | 203 | ||
| 211 | static void __init mv88f6180_coreclk_init(struct device_node *np) | ||
| 212 | { | ||
| 213 | mvebu_coreclk_setup(np, &mv88f6180_coreclks); | ||
| 214 | } | ||
| 215 | CLK_OF_DECLARE(mv88f6180_core_clk, "marvell,mv88f6180-core-clock", | ||
| 216 | mv88f6180_coreclk_init); | ||
| 217 | |||
| 218 | /* | 204 | /* |
| 219 | * Clock Gating Control | 205 | * Clock Gating Control |
| 220 | */ | 206 | */ |
| @@ -239,9 +225,21 @@ static const struct clk_gating_soc_desc kirkwood_gating_desc[] __initconst = { | |||
| 239 | { } | 225 | { } |
| 240 | }; | 226 | }; |
| 241 | 227 | ||
| 242 | static void __init kirkwood_clk_gating_init(struct device_node *np) | 228 | static void __init kirkwood_clk_init(struct device_node *np) |
| 243 | { | 229 | { |
| 244 | mvebu_clk_gating_setup(np, kirkwood_gating_desc); | 230 | struct device_node *cgnp = |
| 231 | of_find_compatible_node(NULL, NULL, "marvell,kirkwood-gating-clock"); | ||
| 232 | |||
| 233 | |||
| 234 | if (of_device_is_compatible(np, "marvell,mv88f6180-core-clock")) | ||
| 235 | mvebu_coreclk_setup(np, &mv88f6180_coreclks); | ||
| 236 | else | ||
| 237 | mvebu_coreclk_setup(np, &kirkwood_coreclks); | ||
| 238 | |||
| 239 | if (cgnp) | ||
| 240 | mvebu_clk_gating_setup(cgnp, kirkwood_gating_desc); | ||
| 245 | } | 241 | } |
| 246 | CLK_OF_DECLARE(kirkwood_clk_gating, "marvell,kirkwood-gating-clock", | 242 | CLK_OF_DECLARE(kirkwood_clk, "marvell,kirkwood-core-clock", |
| 247 | kirkwood_clk_gating_init); | 243 | kirkwood_clk_init); |
| 244 | CLK_OF_DECLARE(mv88f6180_clk, "marvell,mv88f6180-core-clock", | ||
| 245 | kirkwood_clk_init); | ||
diff --git a/drivers/clk/shmobile/clk-rcar-gen2.c b/drivers/clk/shmobile/clk-rcar-gen2.c index a59ec217a124..99c27b1c625b 100644 --- a/drivers/clk/shmobile/clk-rcar-gen2.c +++ b/drivers/clk/shmobile/clk-rcar-gen2.c | |||
| @@ -26,6 +26,8 @@ struct rcar_gen2_cpg { | |||
| 26 | void __iomem *reg; | 26 | void __iomem *reg; |
| 27 | }; | 27 | }; |
| 28 | 28 | ||
| 29 | #define CPG_FRQCRB 0x00000004 | ||
| 30 | #define CPG_FRQCRB_KICK BIT(31) | ||
| 29 | #define CPG_SDCKCR 0x00000074 | 31 | #define CPG_SDCKCR 0x00000074 |
| 30 | #define CPG_PLL0CR 0x000000d8 | 32 | #define CPG_PLL0CR 0x000000d8 |
| 31 | #define CPG_FRQCRC 0x000000e0 | 33 | #define CPG_FRQCRC 0x000000e0 |
| @@ -45,6 +47,7 @@ struct rcar_gen2_cpg { | |||
| 45 | struct cpg_z_clk { | 47 | struct cpg_z_clk { |
| 46 | struct clk_hw hw; | 48 | struct clk_hw hw; |
| 47 | void __iomem *reg; | 49 | void __iomem *reg; |
| 50 | void __iomem *kick_reg; | ||
| 48 | }; | 51 | }; |
| 49 | 52 | ||
| 50 | #define to_z_clk(_hw) container_of(_hw, struct cpg_z_clk, hw) | 53 | #define to_z_clk(_hw) container_of(_hw, struct cpg_z_clk, hw) |
| @@ -83,17 +86,45 @@ static int cpg_z_clk_set_rate(struct clk_hw *hw, unsigned long rate, | |||
| 83 | { | 86 | { |
| 84 | struct cpg_z_clk *zclk = to_z_clk(hw); | 87 | struct cpg_z_clk *zclk = to_z_clk(hw); |
| 85 | unsigned int mult; | 88 | unsigned int mult; |
| 86 | u32 val; | 89 | u32 val, kick; |
| 90 | unsigned int i; | ||
| 87 | 91 | ||
| 88 | mult = div_u64((u64)rate * 32, parent_rate); | 92 | mult = div_u64((u64)rate * 32, parent_rate); |
| 89 | mult = clamp(mult, 1U, 32U); | 93 | mult = clamp(mult, 1U, 32U); |
| 90 | 94 | ||
| 95 | if (clk_readl(zclk->kick_reg) & CPG_FRQCRB_KICK) | ||
| 96 | return -EBUSY; | ||
| 97 | |||
| 91 | val = clk_readl(zclk->reg); | 98 | val = clk_readl(zclk->reg); |
| 92 | val &= ~CPG_FRQCRC_ZFC_MASK; | 99 | val &= ~CPG_FRQCRC_ZFC_MASK; |
| 93 | val |= (32 - mult) << CPG_FRQCRC_ZFC_SHIFT; | 100 | val |= (32 - mult) << CPG_FRQCRC_ZFC_SHIFT; |
| 94 | clk_writel(val, zclk->reg); | 101 | clk_writel(val, zclk->reg); |
| 95 | 102 | ||
| 96 | return 0; | 103 | /* |
| 104 | * Set KICK bit in FRQCRB to update hardware setting and wait for | ||
| 105 | * clock change completion. | ||
| 106 | */ | ||
| 107 | kick = clk_readl(zclk->kick_reg); | ||
| 108 | kick |= CPG_FRQCRB_KICK; | ||
| 109 | clk_writel(kick, zclk->kick_reg); | ||
| 110 | |||
| 111 | /* | ||
| 112 | * Note: There is no HW information about the worst case latency. | ||
| 113 | * | ||
| 114 | * Using experimental measurements, it seems that no more than | ||
| 115 | * ~10 iterations are needed, independently of the CPU rate. | ||
| 116 | * Since this value might be dependant of external xtal rate, pll1 | ||
| 117 | * rate or even the other emulation clocks rate, use 1000 as a | ||
| 118 | * "super" safe value. | ||
| 119 | */ | ||
| 120 | for (i = 1000; i; i--) { | ||
| 121 | if (!(clk_readl(zclk->kick_reg) & CPG_FRQCRB_KICK)) | ||
| 122 | return 0; | ||
| 123 | |||
| 124 | cpu_relax(); | ||
| 125 | } | ||
| 126 | |||
| 127 | return -ETIMEDOUT; | ||
| 97 | } | 128 | } |
| 98 | 129 | ||
| 99 | static const struct clk_ops cpg_z_clk_ops = { | 130 | static const struct clk_ops cpg_z_clk_ops = { |
| @@ -120,6 +151,7 @@ static struct clk * __init cpg_z_clk_register(struct rcar_gen2_cpg *cpg) | |||
| 120 | init.num_parents = 1; | 151 | init.num_parents = 1; |
| 121 | 152 | ||
| 122 | zclk->reg = cpg->reg + CPG_FRQCRC; | 153 | zclk->reg = cpg->reg + CPG_FRQCRC; |
| 154 | zclk->kick_reg = cpg->reg + CPG_FRQCRB; | ||
| 123 | zclk->hw.init = &init; | 155 | zclk->hw.init = &init; |
| 124 | 156 | ||
| 125 | clk = clk_register(NULL, &zclk->hw); | 157 | clk = clk_register(NULL, &zclk->hw); |
| @@ -186,7 +218,7 @@ rcar_gen2_cpg_register_clock(struct device_node *np, struct rcar_gen2_cpg *cpg, | |||
| 186 | const char *name) | 218 | const char *name) |
| 187 | { | 219 | { |
| 188 | const struct clk_div_table *table = NULL; | 220 | const struct clk_div_table *table = NULL; |
| 189 | const char *parent_name = "main"; | 221 | const char *parent_name; |
| 190 | unsigned int shift; | 222 | unsigned int shift; |
| 191 | unsigned int mult = 1; | 223 | unsigned int mult = 1; |
| 192 | unsigned int div = 1; | 224 | unsigned int div = 1; |
| @@ -201,23 +233,31 @@ rcar_gen2_cpg_register_clock(struct device_node *np, struct rcar_gen2_cpg *cpg, | |||
| 201 | * the multiplier value. | 233 | * the multiplier value. |
| 202 | */ | 234 | */ |
| 203 | u32 value = clk_readl(cpg->reg + CPG_PLL0CR); | 235 | u32 value = clk_readl(cpg->reg + CPG_PLL0CR); |
| 236 | parent_name = "main"; | ||
| 204 | mult = ((value >> 24) & ((1 << 7) - 1)) + 1; | 237 | mult = ((value >> 24) & ((1 << 7) - 1)) + 1; |
| 205 | } else if (!strcmp(name, "pll1")) { | 238 | } else if (!strcmp(name, "pll1")) { |
| 239 | parent_name = "main"; | ||
| 206 | mult = config->pll1_mult / 2; | 240 | mult = config->pll1_mult / 2; |
| 207 | } else if (!strcmp(name, "pll3")) { | 241 | } else if (!strcmp(name, "pll3")) { |
| 242 | parent_name = "main"; | ||
| 208 | mult = config->pll3_mult; | 243 | mult = config->pll3_mult; |
| 209 | } else if (!strcmp(name, "lb")) { | 244 | } else if (!strcmp(name, "lb")) { |
| 245 | parent_name = "pll1_div2"; | ||
| 210 | div = cpg_mode & BIT(18) ? 36 : 24; | 246 | div = cpg_mode & BIT(18) ? 36 : 24; |
| 211 | } else if (!strcmp(name, "qspi")) { | 247 | } else if (!strcmp(name, "qspi")) { |
| 248 | parent_name = "pll1_div2"; | ||
| 212 | div = (cpg_mode & (BIT(3) | BIT(2) | BIT(1))) == BIT(2) | 249 | div = (cpg_mode & (BIT(3) | BIT(2) | BIT(1))) == BIT(2) |
| 213 | ? 16 : 20; | 250 | ? 8 : 10; |
| 214 | } else if (!strcmp(name, "sdh")) { | 251 | } else if (!strcmp(name, "sdh")) { |
| 252 | parent_name = "pll1_div2"; | ||
| 215 | table = cpg_sdh_div_table; | 253 | table = cpg_sdh_div_table; |
| 216 | shift = 8; | 254 | shift = 8; |
| 217 | } else if (!strcmp(name, "sd0")) { | 255 | } else if (!strcmp(name, "sd0")) { |
| 256 | parent_name = "pll1_div2"; | ||
| 218 | table = cpg_sd01_div_table; | 257 | table = cpg_sd01_div_table; |
| 219 | shift = 4; | 258 | shift = 4; |
| 220 | } else if (!strcmp(name, "sd1")) { | 259 | } else if (!strcmp(name, "sd1")) { |
| 260 | parent_name = "pll1_div2"; | ||
| 221 | table = cpg_sd01_div_table; | 261 | table = cpg_sd01_div_table; |
| 222 | shift = 0; | 262 | shift = 0; |
| 223 | } else if (!strcmp(name, "z")) { | 263 | } else if (!strcmp(name, "z")) { |
diff --git a/drivers/clk/tegra/clk-divider.c b/drivers/clk/tegra/clk-divider.c index 4d75b1f37e3a..290f9c1a3749 100644 --- a/drivers/clk/tegra/clk-divider.c +++ b/drivers/clk/tegra/clk-divider.c | |||
| @@ -59,7 +59,7 @@ static int get_div(struct tegra_clk_frac_div *divider, unsigned long rate, | |||
| 59 | return 0; | 59 | return 0; |
| 60 | 60 | ||
| 61 | if (divider_ux1 > get_max_div(divider)) | 61 | if (divider_ux1 > get_max_div(divider)) |
| 62 | return -EINVAL; | 62 | return get_max_div(divider); |
| 63 | 63 | ||
| 64 | return divider_ux1; | 64 | return divider_ux1; |
| 65 | } | 65 | } |
diff --git a/drivers/clk/tegra/clk-id.h b/drivers/clk/tegra/clk-id.h index cf0c323f2c36..c39613c519af 100644 --- a/drivers/clk/tegra/clk-id.h +++ b/drivers/clk/tegra/clk-id.h | |||
| @@ -180,9 +180,13 @@ enum clk_id { | |||
| 180 | tegra_clk_sbc6_8, | 180 | tegra_clk_sbc6_8, |
| 181 | tegra_clk_sclk, | 181 | tegra_clk_sclk, |
| 182 | tegra_clk_sdmmc1, | 182 | tegra_clk_sdmmc1, |
| 183 | tegra_clk_sdmmc1_8, | ||
| 183 | tegra_clk_sdmmc2, | 184 | tegra_clk_sdmmc2, |
| 185 | tegra_clk_sdmmc2_8, | ||
| 184 | tegra_clk_sdmmc3, | 186 | tegra_clk_sdmmc3, |
| 187 | tegra_clk_sdmmc3_8, | ||
| 185 | tegra_clk_sdmmc4, | 188 | tegra_clk_sdmmc4, |
| 189 | tegra_clk_sdmmc4_8, | ||
| 186 | tegra_clk_se, | 190 | tegra_clk_se, |
| 187 | tegra_clk_soc_therm, | 191 | tegra_clk_soc_therm, |
| 188 | tegra_clk_sor0, | 192 | tegra_clk_sor0, |
diff --git a/drivers/clk/tegra/clk-tegra-periph.c b/drivers/clk/tegra/clk-tegra-periph.c index 5c35885f4a7c..1fa5c3f33b20 100644 --- a/drivers/clk/tegra/clk-tegra-periph.c +++ b/drivers/clk/tegra/clk-tegra-periph.c | |||
| @@ -371,9 +371,7 @@ static const char *mux_pllp3_pllc_clkm[] = { | |||
| 371 | static const char *mux_pllm_pllc_pllp_plla_pllc2_c3_clkm[] = { | 371 | static const char *mux_pllm_pllc_pllp_plla_pllc2_c3_clkm[] = { |
| 372 | "pll_m", "pll_c", "pll_p", "pll_a", "pll_c2", "pll_c3", "clk_m" | 372 | "pll_m", "pll_c", "pll_p", "pll_a", "pll_c2", "pll_c3", "clk_m" |
| 373 | }; | 373 | }; |
| 374 | static u32 mux_pllm_pllc_pllp_plla_pllc2_c3_clkm_idx[] = { | 374 | #define mux_pllm_pllc_pllp_plla_pllc2_c3_clkm_idx NULL |
| 375 | [0] = 0, [1] = 1, [2] = 2, [3] = 3, [4] = 4, [5] = 6, | ||
| 376 | }; | ||
| 377 | 375 | ||
| 378 | static const char *mux_pllm_pllc2_c_c3_pllp_plla_pllc4[] = { | 376 | static const char *mux_pllm_pllc2_c_c3_pllp_plla_pllc4[] = { |
| 379 | "pll_m", "pll_c2", "pll_c", "pll_c3", "pll_p", "pll_a_out0", "pll_c4", | 377 | "pll_m", "pll_c2", "pll_c", "pll_c3", "pll_p", "pll_a_out0", "pll_c4", |
| @@ -465,6 +463,10 @@ static struct tegra_periph_init_data periph_clks[] = { | |||
| 465 | MUX("adx1", mux_plla_pllc_pllp_clkm, CLK_SOURCE_ADX1, 180, TEGRA_PERIPH_ON_APB, tegra_clk_adx1), | 463 | MUX("adx1", mux_plla_pllc_pllp_clkm, CLK_SOURCE_ADX1, 180, TEGRA_PERIPH_ON_APB, tegra_clk_adx1), |
| 466 | MUX("amx1", mux_plla_pllc_pllp_clkm, CLK_SOURCE_AMX1, 185, TEGRA_PERIPH_ON_APB, tegra_clk_amx1), | 464 | MUX("amx1", mux_plla_pllc_pllp_clkm, CLK_SOURCE_AMX1, 185, TEGRA_PERIPH_ON_APB, tegra_clk_amx1), |
| 467 | MUX("vi_sensor2", mux_pllm_pllc2_c_c3_pllp_plla, CLK_SOURCE_VI_SENSOR2, 20, TEGRA_PERIPH_NO_RESET, tegra_clk_vi_sensor2), | 465 | MUX("vi_sensor2", mux_pllm_pllc2_c_c3_pllp_plla, CLK_SOURCE_VI_SENSOR2, 20, TEGRA_PERIPH_NO_RESET, tegra_clk_vi_sensor2), |
| 466 | MUX8("sdmmc1", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_SDMMC1, 14, 0, tegra_clk_sdmmc1_8), | ||
| 467 | MUX8("sdmmc2", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_SDMMC2, 9, 0, tegra_clk_sdmmc2_8), | ||
| 468 | MUX8("sdmmc3", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_SDMMC3, 69, 0, tegra_clk_sdmmc3_8), | ||
| 469 | MUX8("sdmmc4", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_SDMMC4, 15, 0, tegra_clk_sdmmc4_8), | ||
| 468 | MUX8("sbc1", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_SBC1, 41, TEGRA_PERIPH_ON_APB, tegra_clk_sbc1_8), | 470 | MUX8("sbc1", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_SBC1, 41, TEGRA_PERIPH_ON_APB, tegra_clk_sbc1_8), |
| 469 | MUX8("sbc2", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_SBC2, 44, TEGRA_PERIPH_ON_APB, tegra_clk_sbc2_8), | 471 | MUX8("sbc2", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_SBC2, 44, TEGRA_PERIPH_ON_APB, tegra_clk_sbc2_8), |
| 470 | MUX8("sbc3", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_SBC3, 46, TEGRA_PERIPH_ON_APB, tegra_clk_sbc3_8), | 472 | MUX8("sbc3", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_SBC3, 46, TEGRA_PERIPH_ON_APB, tegra_clk_sbc3_8), |
| @@ -492,7 +494,7 @@ static struct tegra_periph_init_data periph_clks[] = { | |||
| 492 | UART("uartb", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_UARTB, 7, tegra_clk_uartb), | 494 | UART("uartb", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_UARTB, 7, tegra_clk_uartb), |
| 493 | UART("uartc", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_UARTC, 55, tegra_clk_uartc), | 495 | UART("uartc", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_UARTC, 55, tegra_clk_uartc), |
| 494 | UART("uartd", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_UARTD, 65, tegra_clk_uartd), | 496 | UART("uartd", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_UARTD, 65, tegra_clk_uartd), |
| 495 | UART("uarte", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_UARTE, 65, tegra_clk_uarte), | 497 | UART("uarte", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_UARTE, 66, tegra_clk_uarte), |
| 496 | XUSB("xusb_host_src", mux_clkm_pllp_pllc_pllre, CLK_SOURCE_XUSB_HOST_SRC, 143, TEGRA_PERIPH_ON_APB | TEGRA_PERIPH_NO_RESET, tegra_clk_xusb_host_src), | 498 | XUSB("xusb_host_src", mux_clkm_pllp_pllc_pllre, CLK_SOURCE_XUSB_HOST_SRC, 143, TEGRA_PERIPH_ON_APB | TEGRA_PERIPH_NO_RESET, tegra_clk_xusb_host_src), |
| 497 | XUSB("xusb_falcon_src", mux_clkm_pllp_pllc_pllre, CLK_SOURCE_XUSB_FALCON_SRC, 143, TEGRA_PERIPH_NO_RESET, tegra_clk_xusb_falcon_src), | 499 | XUSB("xusb_falcon_src", mux_clkm_pllp_pllc_pllre, CLK_SOURCE_XUSB_FALCON_SRC, 143, TEGRA_PERIPH_NO_RESET, tegra_clk_xusb_falcon_src), |
| 498 | XUSB("xusb_fs_src", mux_clkm_48M_pllp_480M, CLK_SOURCE_XUSB_FS_SRC, 143, TEGRA_PERIPH_NO_RESET, tegra_clk_xusb_fs_src), | 500 | XUSB("xusb_fs_src", mux_clkm_48M_pllp_480M, CLK_SOURCE_XUSB_FS_SRC, 143, TEGRA_PERIPH_NO_RESET, tegra_clk_xusb_fs_src), |
diff --git a/drivers/clk/tegra/clk-tegra-super-gen4.c b/drivers/clk/tegra/clk-tegra-super-gen4.c index 05dce4aa2c11..feb3201c85ce 100644 --- a/drivers/clk/tegra/clk-tegra-super-gen4.c +++ b/drivers/clk/tegra/clk-tegra-super-gen4.c | |||
| @@ -120,7 +120,7 @@ void __init tegra_super_clk_gen4_init(void __iomem *clk_base, | |||
| 120 | ARRAY_SIZE(cclk_lp_parents), | 120 | ARRAY_SIZE(cclk_lp_parents), |
| 121 | CLK_SET_RATE_PARENT, | 121 | CLK_SET_RATE_PARENT, |
| 122 | clk_base + CCLKLP_BURST_POLICY, | 122 | clk_base + CCLKLP_BURST_POLICY, |
| 123 | 0, 4, 8, 9, NULL); | 123 | TEGRA_DIVIDER_2, 4, 8, 9, NULL); |
| 124 | *dt_clk = clk; | 124 | *dt_clk = clk; |
| 125 | } | 125 | } |
| 126 | 126 | ||
diff --git a/drivers/clk/tegra/clk-tegra114.c b/drivers/clk/tegra/clk-tegra114.c index 90d9d25f2228..80431f0fb268 100644 --- a/drivers/clk/tegra/clk-tegra114.c +++ b/drivers/clk/tegra/clk-tegra114.c | |||
| @@ -682,12 +682,12 @@ static struct tegra_clk tegra114_clks[tegra_clk_max] __initdata = { | |||
| 682 | [tegra_clk_timer] = { .dt_id = TEGRA114_CLK_TIMER, .present = true }, | 682 | [tegra_clk_timer] = { .dt_id = TEGRA114_CLK_TIMER, .present = true }, |
| 683 | [tegra_clk_uarta] = { .dt_id = TEGRA114_CLK_UARTA, .present = true }, | 683 | [tegra_clk_uarta] = { .dt_id = TEGRA114_CLK_UARTA, .present = true }, |
| 684 | [tegra_clk_uartd] = { .dt_id = TEGRA114_CLK_UARTD, .present = true }, | 684 | [tegra_clk_uartd] = { .dt_id = TEGRA114_CLK_UARTD, .present = true }, |
| 685 | [tegra_clk_sdmmc2] = { .dt_id = TEGRA114_CLK_SDMMC2, .present = true }, | 685 | [tegra_clk_sdmmc2_8] = { .dt_id = TEGRA114_CLK_SDMMC2, .present = true }, |
| 686 | [tegra_clk_i2s1] = { .dt_id = TEGRA114_CLK_I2S1, .present = true }, | 686 | [tegra_clk_i2s1] = { .dt_id = TEGRA114_CLK_I2S1, .present = true }, |
| 687 | [tegra_clk_i2c1] = { .dt_id = TEGRA114_CLK_I2C1, .present = true }, | 687 | [tegra_clk_i2c1] = { .dt_id = TEGRA114_CLK_I2C1, .present = true }, |
| 688 | [tegra_clk_ndflash] = { .dt_id = TEGRA114_CLK_NDFLASH, .present = true }, | 688 | [tegra_clk_ndflash] = { .dt_id = TEGRA114_CLK_NDFLASH, .present = true }, |
| 689 | [tegra_clk_sdmmc1] = { .dt_id = TEGRA114_CLK_SDMMC1, .present = true }, | 689 | [tegra_clk_sdmmc1_8] = { .dt_id = TEGRA114_CLK_SDMMC1, .present = true }, |
| 690 | [tegra_clk_sdmmc4] = { .dt_id = TEGRA114_CLK_SDMMC4, .present = true }, | 690 | [tegra_clk_sdmmc4_8] = { .dt_id = TEGRA114_CLK_SDMMC4, .present = true }, |
| 691 | [tegra_clk_pwm] = { .dt_id = TEGRA114_CLK_PWM, .present = true }, | 691 | [tegra_clk_pwm] = { .dt_id = TEGRA114_CLK_PWM, .present = true }, |
| 692 | [tegra_clk_i2s0] = { .dt_id = TEGRA114_CLK_I2S0, .present = true }, | 692 | [tegra_clk_i2s0] = { .dt_id = TEGRA114_CLK_I2S0, .present = true }, |
| 693 | [tegra_clk_i2s2] = { .dt_id = TEGRA114_CLK_I2S2, .present = true }, | 693 | [tegra_clk_i2s2] = { .dt_id = TEGRA114_CLK_I2S2, .present = true }, |
| @@ -723,7 +723,7 @@ static struct tegra_clk tegra114_clks[tegra_clk_max] __initdata = { | |||
| 723 | [tegra_clk_bsev] = { .dt_id = TEGRA114_CLK_BSEV, .present = true }, | 723 | [tegra_clk_bsev] = { .dt_id = TEGRA114_CLK_BSEV, .present = true }, |
| 724 | [tegra_clk_i2c3] = { .dt_id = TEGRA114_CLK_I2C3, .present = true }, | 724 | [tegra_clk_i2c3] = { .dt_id = TEGRA114_CLK_I2C3, .present = true }, |
| 725 | [tegra_clk_sbc4_8] = { .dt_id = TEGRA114_CLK_SBC4, .present = true }, | 725 | [tegra_clk_sbc4_8] = { .dt_id = TEGRA114_CLK_SBC4, .present = true }, |
| 726 | [tegra_clk_sdmmc3] = { .dt_id = TEGRA114_CLK_SDMMC3, .present = true }, | 726 | [tegra_clk_sdmmc3_8] = { .dt_id = TEGRA114_CLK_SDMMC3, .present = true }, |
| 727 | [tegra_clk_owr] = { .dt_id = TEGRA114_CLK_OWR, .present = true }, | 727 | [tegra_clk_owr] = { .dt_id = TEGRA114_CLK_OWR, .present = true }, |
| 728 | [tegra_clk_csite] = { .dt_id = TEGRA114_CLK_CSITE, .present = true }, | 728 | [tegra_clk_csite] = { .dt_id = TEGRA114_CLK_CSITE, .present = true }, |
| 729 | [tegra_clk_la] = { .dt_id = TEGRA114_CLK_LA, .present = true }, | 729 | [tegra_clk_la] = { .dt_id = TEGRA114_CLK_LA, .present = true }, |
diff --git a/drivers/clk/tegra/clk-tegra124.c b/drivers/clk/tegra/clk-tegra124.c index aff86b5bc745..166e02f16c8a 100644 --- a/drivers/clk/tegra/clk-tegra124.c +++ b/drivers/clk/tegra/clk-tegra124.c | |||
| @@ -516,11 +516,11 @@ static struct div_nmp pllp_nmp = { | |||
| 516 | }; | 516 | }; |
| 517 | 517 | ||
| 518 | static struct tegra_clk_pll_freq_table pll_p_freq_table[] = { | 518 | static struct tegra_clk_pll_freq_table pll_p_freq_table[] = { |
| 519 | {12000000, 216000000, 432, 12, 1, 8}, | 519 | {12000000, 408000000, 408, 12, 0, 8}, |
| 520 | {13000000, 216000000, 432, 13, 1, 8}, | 520 | {13000000, 408000000, 408, 13, 0, 8}, |
| 521 | {16800000, 216000000, 360, 14, 1, 8}, | 521 | {16800000, 408000000, 340, 14, 0, 8}, |
| 522 | {19200000, 216000000, 360, 16, 1, 8}, | 522 | {19200000, 408000000, 340, 16, 0, 8}, |
| 523 | {26000000, 216000000, 432, 26, 1, 8}, | 523 | {26000000, 408000000, 408, 26, 0, 8}, |
| 524 | {0, 0, 0, 0, 0, 0}, | 524 | {0, 0, 0, 0, 0, 0}, |
| 525 | }; | 525 | }; |
| 526 | 526 | ||
| @@ -570,6 +570,15 @@ static struct tegra_clk_pll_params pll_a_params = { | |||
| 570 | .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_USE_LOCK, | 570 | .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_USE_LOCK, |
| 571 | }; | 571 | }; |
| 572 | 572 | ||
| 573 | static struct div_nmp plld_nmp = { | ||
| 574 | .divm_shift = 0, | ||
| 575 | .divm_width = 5, | ||
| 576 | .divn_shift = 8, | ||
| 577 | .divn_width = 11, | ||
| 578 | .divp_shift = 20, | ||
| 579 | .divp_width = 3, | ||
| 580 | }; | ||
| 581 | |||
| 573 | static struct tegra_clk_pll_freq_table pll_d_freq_table[] = { | 582 | static struct tegra_clk_pll_freq_table pll_d_freq_table[] = { |
| 574 | {12000000, 216000000, 864, 12, 4, 12}, | 583 | {12000000, 216000000, 864, 12, 4, 12}, |
| 575 | {13000000, 216000000, 864, 13, 4, 12}, | 584 | {13000000, 216000000, 864, 13, 4, 12}, |
| @@ -603,19 +612,18 @@ static struct tegra_clk_pll_params pll_d_params = { | |||
| 603 | .lock_mask = PLL_BASE_LOCK, | 612 | .lock_mask = PLL_BASE_LOCK, |
| 604 | .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE, | 613 | .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE, |
| 605 | .lock_delay = 1000, | 614 | .lock_delay = 1000, |
| 606 | .div_nmp = &pllp_nmp, | 615 | .div_nmp = &plld_nmp, |
| 607 | .freq_table = pll_d_freq_table, | 616 | .freq_table = pll_d_freq_table, |
| 608 | .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON | | 617 | .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON | |
| 609 | TEGRA_PLL_USE_LOCK, | 618 | TEGRA_PLL_USE_LOCK, |
| 610 | }; | 619 | }; |
| 611 | 620 | ||
| 612 | static struct tegra_clk_pll_freq_table tegra124_pll_d2_freq_table[] = { | 621 | static struct tegra_clk_pll_freq_table tegra124_pll_d2_freq_table[] = { |
| 613 | { 12000000, 148500000, 99, 1, 8}, | 622 | { 12000000, 594000000, 99, 1, 2}, |
| 614 | { 12000000, 594000000, 99, 1, 1}, | 623 | { 13000000, 594000000, 91, 1, 2}, /* actual: 591.5 MHz */ |
| 615 | { 13000000, 594000000, 91, 1, 1}, /* actual: 591.5 MHz */ | 624 | { 16800000, 594000000, 71, 1, 2}, /* actual: 596.4 MHz */ |
| 616 | { 16800000, 594000000, 71, 1, 1}, /* actual: 596.4 MHz */ | 625 | { 19200000, 594000000, 62, 1, 2}, /* actual: 595.2 MHz */ |
| 617 | { 19200000, 594000000, 62, 1, 1}, /* actual: 595.2 MHz */ | 626 | { 26000000, 594000000, 91, 2, 2}, /* actual: 591.5 MHz */ |
| 618 | { 26000000, 594000000, 91, 2, 1}, /* actual: 591.5 MHz */ | ||
| 619 | { 0, 0, 0, 0, 0, 0 }, | 627 | { 0, 0, 0, 0, 0, 0 }, |
| 620 | }; | 628 | }; |
| 621 | 629 | ||
| @@ -753,21 +761,19 @@ static struct tegra_clk tegra124_clks[tegra_clk_max] __initdata = { | |||
| 753 | [tegra_clk_rtc] = { .dt_id = TEGRA124_CLK_RTC, .present = true }, | 761 | [tegra_clk_rtc] = { .dt_id = TEGRA124_CLK_RTC, .present = true }, |
| 754 | [tegra_clk_timer] = { .dt_id = TEGRA124_CLK_TIMER, .present = true }, | 762 | [tegra_clk_timer] = { .dt_id = TEGRA124_CLK_TIMER, .present = true }, |
| 755 | [tegra_clk_uarta] = { .dt_id = TEGRA124_CLK_UARTA, .present = true }, | 763 | [tegra_clk_uarta] = { .dt_id = TEGRA124_CLK_UARTA, .present = true }, |
| 756 | [tegra_clk_sdmmc2] = { .dt_id = TEGRA124_CLK_SDMMC2, .present = true }, | 764 | [tegra_clk_sdmmc2_8] = { .dt_id = TEGRA124_CLK_SDMMC2, .present = true }, |
| 757 | [tegra_clk_i2s1] = { .dt_id = TEGRA124_CLK_I2S1, .present = true }, | 765 | [tegra_clk_i2s1] = { .dt_id = TEGRA124_CLK_I2S1, .present = true }, |
| 758 | [tegra_clk_i2c1] = { .dt_id = TEGRA124_CLK_I2C1, .present = true }, | 766 | [tegra_clk_i2c1] = { .dt_id = TEGRA124_CLK_I2C1, .present = true }, |
| 759 | [tegra_clk_ndflash] = { .dt_id = TEGRA124_CLK_NDFLASH, .present = true }, | 767 | [tegra_clk_ndflash] = { .dt_id = TEGRA124_CLK_NDFLASH, .present = true }, |
| 760 | [tegra_clk_sdmmc1] = { .dt_id = TEGRA124_CLK_SDMMC1, .present = true }, | 768 | [tegra_clk_sdmmc1_8] = { .dt_id = TEGRA124_CLK_SDMMC1, .present = true }, |
| 761 | [tegra_clk_sdmmc4] = { .dt_id = TEGRA124_CLK_SDMMC4, .present = true }, | 769 | [tegra_clk_sdmmc4_8] = { .dt_id = TEGRA124_CLK_SDMMC4, .present = true }, |
| 762 | [tegra_clk_pwm] = { .dt_id = TEGRA124_CLK_PWM, .present = true }, | 770 | [tegra_clk_pwm] = { .dt_id = TEGRA124_CLK_PWM, .present = true }, |
| 763 | [tegra_clk_i2s2] = { .dt_id = TEGRA124_CLK_I2S2, .present = true }, | 771 | [tegra_clk_i2s2] = { .dt_id = TEGRA124_CLK_I2S2, .present = true }, |
| 764 | [tegra_clk_gr2d] = { .dt_id = TEGRA124_CLK_GR_2D, .present = true }, | ||
| 765 | [tegra_clk_usbd] = { .dt_id = TEGRA124_CLK_USBD, .present = true }, | 772 | [tegra_clk_usbd] = { .dt_id = TEGRA124_CLK_USBD, .present = true }, |
| 766 | [tegra_clk_isp_8] = { .dt_id = TEGRA124_CLK_ISP, .present = true }, | 773 | [tegra_clk_isp_8] = { .dt_id = TEGRA124_CLK_ISP, .present = true }, |
| 767 | [tegra_clk_gr3d] = { .dt_id = TEGRA124_CLK_GR_3D, .present = true }, | ||
| 768 | [tegra_clk_disp2] = { .dt_id = TEGRA124_CLK_DISP2, .present = true }, | 774 | [tegra_clk_disp2] = { .dt_id = TEGRA124_CLK_DISP2, .present = true }, |
| 769 | [tegra_clk_disp1] = { .dt_id = TEGRA124_CLK_DISP1, .present = true }, | 775 | [tegra_clk_disp1] = { .dt_id = TEGRA124_CLK_DISP1, .present = true }, |
| 770 | [tegra_clk_host1x] = { .dt_id = TEGRA124_CLK_HOST1X, .present = true }, | 776 | [tegra_clk_host1x_8] = { .dt_id = TEGRA124_CLK_HOST1X, .present = true }, |
| 771 | [tegra_clk_vcp] = { .dt_id = TEGRA124_CLK_VCP, .present = true }, | 777 | [tegra_clk_vcp] = { .dt_id = TEGRA124_CLK_VCP, .present = true }, |
| 772 | [tegra_clk_i2s0] = { .dt_id = TEGRA124_CLK_I2S0, .present = true }, | 778 | [tegra_clk_i2s0] = { .dt_id = TEGRA124_CLK_I2S0, .present = true }, |
| 773 | [tegra_clk_apbdma] = { .dt_id = TEGRA124_CLK_APBDMA, .present = true }, | 779 | [tegra_clk_apbdma] = { .dt_id = TEGRA124_CLK_APBDMA, .present = true }, |
| @@ -794,7 +800,7 @@ static struct tegra_clk tegra124_clks[tegra_clk_max] __initdata = { | |||
| 794 | [tegra_clk_uartd] = { .dt_id = TEGRA124_CLK_UARTD, .present = true }, | 800 | [tegra_clk_uartd] = { .dt_id = TEGRA124_CLK_UARTD, .present = true }, |
| 795 | [tegra_clk_i2c3] = { .dt_id = TEGRA124_CLK_I2C3, .present = true }, | 801 | [tegra_clk_i2c3] = { .dt_id = TEGRA124_CLK_I2C3, .present = true }, |
| 796 | [tegra_clk_sbc4] = { .dt_id = TEGRA124_CLK_SBC4, .present = true }, | 802 | [tegra_clk_sbc4] = { .dt_id = TEGRA124_CLK_SBC4, .present = true }, |
| 797 | [tegra_clk_sdmmc3] = { .dt_id = TEGRA124_CLK_SDMMC3, .present = true }, | 803 | [tegra_clk_sdmmc3_8] = { .dt_id = TEGRA124_CLK_SDMMC3, .present = true }, |
| 798 | [tegra_clk_pcie] = { .dt_id = TEGRA124_CLK_PCIE, .present = true }, | 804 | [tegra_clk_pcie] = { .dt_id = TEGRA124_CLK_PCIE, .present = true }, |
| 799 | [tegra_clk_owr] = { .dt_id = TEGRA124_CLK_OWR, .present = true }, | 805 | [tegra_clk_owr] = { .dt_id = TEGRA124_CLK_OWR, .present = true }, |
| 800 | [tegra_clk_afi] = { .dt_id = TEGRA124_CLK_AFI, .present = true }, | 806 | [tegra_clk_afi] = { .dt_id = TEGRA124_CLK_AFI, .present = true }, |
| @@ -1286,9 +1292,9 @@ static void __init tegra124_pll_init(void __iomem *clk_base, | |||
| 1286 | clk_register_clkdev(clk, "pll_d2", NULL); | 1292 | clk_register_clkdev(clk, "pll_d2", NULL); |
| 1287 | clks[TEGRA124_CLK_PLL_D2] = clk; | 1293 | clks[TEGRA124_CLK_PLL_D2] = clk; |
| 1288 | 1294 | ||
| 1289 | /* PLLD2_OUT0 ?? */ | 1295 | /* PLLD2_OUT0 */ |
| 1290 | clk = clk_register_fixed_factor(NULL, "pll_d2_out0", "pll_d2", | 1296 | clk = clk_register_fixed_factor(NULL, "pll_d2_out0", "pll_d2", |
| 1291 | CLK_SET_RATE_PARENT, 1, 2); | 1297 | CLK_SET_RATE_PARENT, 1, 1); |
| 1292 | clk_register_clkdev(clk, "pll_d2_out0", NULL); | 1298 | clk_register_clkdev(clk, "pll_d2_out0", NULL); |
| 1293 | clks[TEGRA124_CLK_PLL_D2_OUT0] = clk; | 1299 | clks[TEGRA124_CLK_PLL_D2_OUT0] = clk; |
| 1294 | 1300 | ||
diff --git a/drivers/clk/tegra/clk-tegra20.c b/drivers/clk/tegra/clk-tegra20.c index dbace152b2fa..dace2b1b5ae6 100644 --- a/drivers/clk/tegra/clk-tegra20.c +++ b/drivers/clk/tegra/clk-tegra20.c | |||
| @@ -574,6 +574,8 @@ static struct tegra_clk tegra20_clks[tegra_clk_max] __initdata = { | |||
| 574 | [tegra_clk_tvdac] = { .dt_id = TEGRA20_CLK_TVDAC, .present = true }, | 574 | [tegra_clk_tvdac] = { .dt_id = TEGRA20_CLK_TVDAC, .present = true }, |
| 575 | [tegra_clk_vi_sensor] = { .dt_id = TEGRA20_CLK_VI_SENSOR, .present = true }, | 575 | [tegra_clk_vi_sensor] = { .dt_id = TEGRA20_CLK_VI_SENSOR, .present = true }, |
| 576 | [tegra_clk_afi] = { .dt_id = TEGRA20_CLK_AFI, .present = true }, | 576 | [tegra_clk_afi] = { .dt_id = TEGRA20_CLK_AFI, .present = true }, |
| 577 | [tegra_clk_fuse] = { .dt_id = TEGRA20_CLK_FUSE, .present = true }, | ||
| 578 | [tegra_clk_kfuse] = { .dt_id = TEGRA20_CLK_KFUSE, .present = true }, | ||
| 577 | }; | 579 | }; |
| 578 | 580 | ||
| 579 | static unsigned long tegra20_clk_measure_input_freq(void) | 581 | static unsigned long tegra20_clk_measure_input_freq(void) |
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index cb003a6b72c8..cf485d928903 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c | |||
| @@ -1109,6 +1109,21 @@ static int __cpufreq_add_dev(struct device *dev, struct subsys_interface *sif, | |||
| 1109 | goto err_set_policy_cpu; | 1109 | goto err_set_policy_cpu; |
| 1110 | } | 1110 | } |
| 1111 | 1111 | ||
| 1112 | /* related cpus should atleast have policy->cpus */ | ||
| 1113 | cpumask_or(policy->related_cpus, policy->related_cpus, policy->cpus); | ||
| 1114 | |||
| 1115 | /* | ||
| 1116 | * affected cpus must always be the one, which are online. We aren't | ||
| 1117 | * managing offline cpus here. | ||
| 1118 | */ | ||
| 1119 | cpumask_and(policy->cpus, policy->cpus, cpu_online_mask); | ||
| 1120 | |||
| 1121 | if (!frozen) { | ||
| 1122 | policy->user_policy.min = policy->min; | ||
| 1123 | policy->user_policy.max = policy->max; | ||
| 1124 | } | ||
| 1125 | |||
| 1126 | down_write(&policy->rwsem); | ||
| 1112 | write_lock_irqsave(&cpufreq_driver_lock, flags); | 1127 | write_lock_irqsave(&cpufreq_driver_lock, flags); |
| 1113 | for_each_cpu(j, policy->cpus) | 1128 | for_each_cpu(j, policy->cpus) |
| 1114 | per_cpu(cpufreq_cpu_data, j) = policy; | 1129 | per_cpu(cpufreq_cpu_data, j) = policy; |
| @@ -1162,20 +1177,6 @@ static int __cpufreq_add_dev(struct device *dev, struct subsys_interface *sif, | |||
| 1162 | } | 1177 | } |
| 1163 | } | 1178 | } |
| 1164 | 1179 | ||
| 1165 | /* related cpus should atleast have policy->cpus */ | ||
| 1166 | cpumask_or(policy->related_cpus, policy->related_cpus, policy->cpus); | ||
| 1167 | |||
| 1168 | /* | ||
| 1169 | * affected cpus must always be the one, which are online. We aren't | ||
| 1170 | * managing offline cpus here. | ||
| 1171 | */ | ||
| 1172 | cpumask_and(policy->cpus, policy->cpus, cpu_online_mask); | ||
| 1173 | |||
| 1174 | if (!frozen) { | ||
| 1175 | policy->user_policy.min = policy->min; | ||
| 1176 | policy->user_policy.max = policy->max; | ||
| 1177 | } | ||
| 1178 | |||
| 1179 | blocking_notifier_call_chain(&cpufreq_policy_notifier_list, | 1180 | blocking_notifier_call_chain(&cpufreq_policy_notifier_list, |
| 1180 | CPUFREQ_START, policy); | 1181 | CPUFREQ_START, policy); |
| 1181 | 1182 | ||
| @@ -1206,6 +1207,7 @@ static int __cpufreq_add_dev(struct device *dev, struct subsys_interface *sif, | |||
| 1206 | policy->user_policy.policy = policy->policy; | 1207 | policy->user_policy.policy = policy->policy; |
| 1207 | policy->user_policy.governor = policy->governor; | 1208 | policy->user_policy.governor = policy->governor; |
| 1208 | } | 1209 | } |
| 1210 | up_write(&policy->rwsem); | ||
| 1209 | 1211 | ||
| 1210 | kobject_uevent(&policy->kobj, KOBJ_ADD); | 1212 | kobject_uevent(&policy->kobj, KOBJ_ADD); |
| 1211 | up_read(&cpufreq_rwsem); | 1213 | up_read(&cpufreq_rwsem); |
| @@ -1546,23 +1548,16 @@ static unsigned int __cpufreq_get(unsigned int cpu) | |||
| 1546 | */ | 1548 | */ |
| 1547 | unsigned int cpufreq_get(unsigned int cpu) | 1549 | unsigned int cpufreq_get(unsigned int cpu) |
| 1548 | { | 1550 | { |
| 1549 | struct cpufreq_policy *policy = per_cpu(cpufreq_cpu_data, cpu); | 1551 | struct cpufreq_policy *policy = cpufreq_cpu_get(cpu); |
| 1550 | unsigned int ret_freq = 0; | 1552 | unsigned int ret_freq = 0; |
| 1551 | 1553 | ||
| 1552 | if (cpufreq_disabled() || !cpufreq_driver) | 1554 | if (policy) { |
| 1553 | return -ENOENT; | 1555 | down_read(&policy->rwsem); |
| 1554 | 1556 | ret_freq = __cpufreq_get(cpu); | |
| 1555 | BUG_ON(!policy); | 1557 | up_read(&policy->rwsem); |
| 1556 | |||
| 1557 | if (!down_read_trylock(&cpufreq_rwsem)) | ||
| 1558 | return 0; | ||
| 1559 | |||
| 1560 | down_read(&policy->rwsem); | ||
| 1561 | |||
| 1562 | ret_freq = __cpufreq_get(cpu); | ||
| 1563 | 1558 | ||
| 1564 | up_read(&policy->rwsem); | 1559 | cpufreq_cpu_put(policy); |
| 1565 | up_read(&cpufreq_rwsem); | 1560 | } |
| 1566 | 1561 | ||
| 1567 | return ret_freq; | 1562 | return ret_freq; |
| 1568 | } | 1563 | } |
diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c index e90816105921..2cd36b9297f3 100644 --- a/drivers/cpufreq/intel_pstate.c +++ b/drivers/cpufreq/intel_pstate.c | |||
| @@ -39,9 +39,10 @@ | |||
| 39 | #define BYT_TURBO_RATIOS 0x66c | 39 | #define BYT_TURBO_RATIOS 0x66c |
| 40 | 40 | ||
| 41 | 41 | ||
| 42 | #define FRAC_BITS 8 | 42 | #define FRAC_BITS 6 |
| 43 | #define int_tofp(X) ((int64_t)(X) << FRAC_BITS) | 43 | #define int_tofp(X) ((int64_t)(X) << FRAC_BITS) |
| 44 | #define fp_toint(X) ((X) >> FRAC_BITS) | 44 | #define fp_toint(X) ((X) >> FRAC_BITS) |
| 45 | #define FP_ROUNDUP(X) ((X) += 1 << FRAC_BITS) | ||
| 45 | 46 | ||
| 46 | static inline int32_t mul_fp(int32_t x, int32_t y) | 47 | static inline int32_t mul_fp(int32_t x, int32_t y) |
| 47 | { | 48 | { |
| @@ -556,18 +557,20 @@ static void intel_pstate_get_cpu_pstates(struct cpudata *cpu) | |||
| 556 | static inline void intel_pstate_calc_busy(struct cpudata *cpu, | 557 | static inline void intel_pstate_calc_busy(struct cpudata *cpu, |
| 557 | struct sample *sample) | 558 | struct sample *sample) |
| 558 | { | 559 | { |
| 559 | u64 core_pct; | 560 | int32_t core_pct; |
| 560 | u64 c0_pct; | 561 | int32_t c0_pct; |
| 561 | 562 | ||
| 562 | core_pct = div64_u64(sample->aperf * 100, sample->mperf); | 563 | core_pct = div_fp(int_tofp((sample->aperf)), |
| 564 | int_tofp((sample->mperf))); | ||
| 565 | core_pct = mul_fp(core_pct, int_tofp(100)); | ||
| 566 | FP_ROUNDUP(core_pct); | ||
| 567 | |||
| 568 | c0_pct = div_fp(int_tofp(sample->mperf), int_tofp(sample->tsc)); | ||
| 563 | 569 | ||
| 564 | c0_pct = div64_u64(sample->mperf * 100, sample->tsc); | ||
| 565 | sample->freq = fp_toint( | 570 | sample->freq = fp_toint( |
| 566 | mul_fp(int_tofp(cpu->pstate.max_pstate), | 571 | mul_fp(int_tofp(cpu->pstate.max_pstate * 1000), core_pct)); |
| 567 | int_tofp(core_pct * 1000))); | ||
| 568 | 572 | ||
| 569 | sample->core_pct_busy = mul_fp(int_tofp(core_pct), | 573 | sample->core_pct_busy = mul_fp(core_pct, c0_pct); |
| 570 | div_fp(int_tofp(c0_pct + 1), int_tofp(100))); | ||
| 571 | } | 574 | } |
| 572 | 575 | ||
| 573 | static inline void intel_pstate_sample(struct cpudata *cpu) | 576 | static inline void intel_pstate_sample(struct cpudata *cpu) |
| @@ -579,6 +582,10 @@ static inline void intel_pstate_sample(struct cpudata *cpu) | |||
| 579 | rdmsrl(MSR_IA32_MPERF, mperf); | 582 | rdmsrl(MSR_IA32_MPERF, mperf); |
| 580 | tsc = native_read_tsc(); | 583 | tsc = native_read_tsc(); |
| 581 | 584 | ||
| 585 | aperf = aperf >> FRAC_BITS; | ||
| 586 | mperf = mperf >> FRAC_BITS; | ||
| 587 | tsc = tsc >> FRAC_BITS; | ||
| 588 | |||
| 582 | cpu->sample_ptr = (cpu->sample_ptr + 1) % SAMPLE_COUNT; | 589 | cpu->sample_ptr = (cpu->sample_ptr + 1) % SAMPLE_COUNT; |
| 583 | cpu->samples[cpu->sample_ptr].aperf = aperf; | 590 | cpu->samples[cpu->sample_ptr].aperf = aperf; |
| 584 | cpu->samples[cpu->sample_ptr].mperf = mperf; | 591 | cpu->samples[cpu->sample_ptr].mperf = mperf; |
| @@ -610,7 +617,8 @@ static inline int32_t intel_pstate_get_scaled_busy(struct cpudata *cpu) | |||
| 610 | core_busy = cpu->samples[cpu->sample_ptr].core_pct_busy; | 617 | core_busy = cpu->samples[cpu->sample_ptr].core_pct_busy; |
| 611 | max_pstate = int_tofp(cpu->pstate.max_pstate); | 618 | max_pstate = int_tofp(cpu->pstate.max_pstate); |
| 612 | current_pstate = int_tofp(cpu->pstate.current_pstate); | 619 | current_pstate = int_tofp(cpu->pstate.current_pstate); |
| 613 | return mul_fp(core_busy, div_fp(max_pstate, current_pstate)); | 620 | core_busy = mul_fp(core_busy, div_fp(max_pstate, current_pstate)); |
| 621 | return FP_ROUNDUP(core_busy); | ||
| 614 | } | 622 | } |
| 615 | 623 | ||
| 616 | static inline void intel_pstate_adjust_busy_pstate(struct cpudata *cpu) | 624 | static inline void intel_pstate_adjust_busy_pstate(struct cpudata *cpu) |
diff --git a/drivers/dma/imx-sdma.c b/drivers/dma/imx-sdma.c index 4e7918339b12..19041cefabb1 100644 --- a/drivers/dma/imx-sdma.c +++ b/drivers/dma/imx-sdma.c | |||
| @@ -449,6 +449,7 @@ static const struct of_device_id sdma_dt_ids[] = { | |||
| 449 | { .compatible = "fsl,imx51-sdma", .data = &sdma_imx51, }, | 449 | { .compatible = "fsl,imx51-sdma", .data = &sdma_imx51, }, |
| 450 | { .compatible = "fsl,imx35-sdma", .data = &sdma_imx35, }, | 450 | { .compatible = "fsl,imx35-sdma", .data = &sdma_imx35, }, |
| 451 | { .compatible = "fsl,imx31-sdma", .data = &sdma_imx31, }, | 451 | { .compatible = "fsl,imx31-sdma", .data = &sdma_imx31, }, |
| 452 | { .compatible = "fsl,imx25-sdma", .data = &sdma_imx25, }, | ||
| 452 | { /* sentinel */ } | 453 | { /* sentinel */ } |
| 453 | }; | 454 | }; |
| 454 | MODULE_DEVICE_TABLE(of, sdma_dt_ids); | 455 | MODULE_DEVICE_TABLE(of, sdma_dt_ids); |
diff --git a/drivers/dma/ste_dma40.c b/drivers/dma/ste_dma40.c index 00a2de957b23..bf18c786ed40 100644 --- a/drivers/dma/ste_dma40.c +++ b/drivers/dma/ste_dma40.c | |||
| @@ -1641,6 +1641,7 @@ static void dma_tasklet(unsigned long data) | |||
| 1641 | struct d40_chan *d40c = (struct d40_chan *) data; | 1641 | struct d40_chan *d40c = (struct d40_chan *) data; |
| 1642 | struct d40_desc *d40d; | 1642 | struct d40_desc *d40d; |
| 1643 | unsigned long flags; | 1643 | unsigned long flags; |
| 1644 | bool callback_active; | ||
| 1644 | dma_async_tx_callback callback; | 1645 | dma_async_tx_callback callback; |
| 1645 | void *callback_param; | 1646 | void *callback_param; |
| 1646 | 1647 | ||
| @@ -1668,6 +1669,7 @@ static void dma_tasklet(unsigned long data) | |||
| 1668 | } | 1669 | } |
| 1669 | 1670 | ||
| 1670 | /* Callback to client */ | 1671 | /* Callback to client */ |
| 1672 | callback_active = !!(d40d->txd.flags & DMA_PREP_INTERRUPT); | ||
| 1671 | callback = d40d->txd.callback; | 1673 | callback = d40d->txd.callback; |
| 1672 | callback_param = d40d->txd.callback_param; | 1674 | callback_param = d40d->txd.callback_param; |
| 1673 | 1675 | ||
| @@ -1690,7 +1692,7 @@ static void dma_tasklet(unsigned long data) | |||
| 1690 | 1692 | ||
| 1691 | spin_unlock_irqrestore(&d40c->lock, flags); | 1693 | spin_unlock_irqrestore(&d40c->lock, flags); |
| 1692 | 1694 | ||
| 1693 | if (callback && (d40d->txd.flags & DMA_PREP_INTERRUPT)) | 1695 | if (callback_active && callback) |
| 1694 | callback(callback_param); | 1696 | callback(callback_param); |
| 1695 | 1697 | ||
| 1696 | return; | 1698 | return; |
diff --git a/drivers/edac/i7300_edac.c b/drivers/edac/i7300_edac.c index d63f4798f7d0..57e96a3350f0 100644 --- a/drivers/edac/i7300_edac.c +++ b/drivers/edac/i7300_edac.c | |||
| @@ -943,33 +943,35 @@ static int i7300_get_devices(struct mem_ctl_info *mci) | |||
| 943 | 943 | ||
| 944 | /* Attempt to 'get' the MCH register we want */ | 944 | /* Attempt to 'get' the MCH register we want */ |
| 945 | pdev = NULL; | 945 | pdev = NULL; |
| 946 | while (!pvt->pci_dev_16_1_fsb_addr_map || | 946 | while ((pdev = pci_get_device(PCI_VENDOR_ID_INTEL, |
| 947 | !pvt->pci_dev_16_2_fsb_err_regs) { | 947 | PCI_DEVICE_ID_INTEL_I7300_MCH_ERR, |
| 948 | pdev = pci_get_device(PCI_VENDOR_ID_INTEL, | 948 | pdev))) { |
| 949 | PCI_DEVICE_ID_INTEL_I7300_MCH_ERR, pdev); | ||
| 950 | if (!pdev) { | ||
| 951 | /* End of list, leave */ | ||
| 952 | i7300_printk(KERN_ERR, | ||
| 953 | "'system address,Process Bus' " | ||
| 954 | "device not found:" | ||
| 955 | "vendor 0x%x device 0x%x ERR funcs " | ||
| 956 | "(broken BIOS?)\n", | ||
| 957 | PCI_VENDOR_ID_INTEL, | ||
| 958 | PCI_DEVICE_ID_INTEL_I7300_MCH_ERR); | ||
| 959 | goto error; | ||
| 960 | } | ||
| 961 | |||
| 962 | /* Store device 16 funcs 1 and 2 */ | 949 | /* Store device 16 funcs 1 and 2 */ |
| 963 | switch (PCI_FUNC(pdev->devfn)) { | 950 | switch (PCI_FUNC(pdev->devfn)) { |
| 964 | case 1: | 951 | case 1: |
| 965 | pvt->pci_dev_16_1_fsb_addr_map = pdev; | 952 | if (!pvt->pci_dev_16_1_fsb_addr_map) |
| 953 | pvt->pci_dev_16_1_fsb_addr_map = | ||
| 954 | pci_dev_get(pdev); | ||
| 966 | break; | 955 | break; |
| 967 | case 2: | 956 | case 2: |
| 968 | pvt->pci_dev_16_2_fsb_err_regs = pdev; | 957 | if (!pvt->pci_dev_16_2_fsb_err_regs) |
| 958 | pvt->pci_dev_16_2_fsb_err_regs = | ||
| 959 | pci_dev_get(pdev); | ||
| 969 | break; | 960 | break; |
| 970 | } | 961 | } |
| 971 | } | 962 | } |
| 972 | 963 | ||
| 964 | if (!pvt->pci_dev_16_1_fsb_addr_map || | ||
| 965 | !pvt->pci_dev_16_2_fsb_err_regs) { | ||
| 966 | /* At least one device was not found */ | ||
| 967 | i7300_printk(KERN_ERR, | ||
| 968 | "'system address,Process Bus' device not found:" | ||
| 969 | "vendor 0x%x device 0x%x ERR funcs (broken BIOS?)\n", | ||
| 970 | PCI_VENDOR_ID_INTEL, | ||
| 971 | PCI_DEVICE_ID_INTEL_I7300_MCH_ERR); | ||
| 972 | goto error; | ||
| 973 | } | ||
| 974 | |||
| 973 | edac_dbg(1, "System Address, processor bus- PCI Bus ID: %s %x:%x\n", | 975 | edac_dbg(1, "System Address, processor bus- PCI Bus ID: %s %x:%x\n", |
| 974 | pci_name(pvt->pci_dev_16_0_fsb_ctlr), | 976 | pci_name(pvt->pci_dev_16_0_fsb_ctlr), |
| 975 | pvt->pci_dev_16_0_fsb_ctlr->vendor, | 977 | pvt->pci_dev_16_0_fsb_ctlr->vendor, |
diff --git a/drivers/edac/i7core_edac.c b/drivers/edac/i7core_edac.c index 87533ca7752e..d871275196f6 100644 --- a/drivers/edac/i7core_edac.c +++ b/drivers/edac/i7core_edac.c | |||
| @@ -1334,14 +1334,19 @@ static int i7core_get_onedevice(struct pci_dev **prev, | |||
| 1334 | * is at addr 8086:2c40, instead of 8086:2c41. So, we need | 1334 | * is at addr 8086:2c40, instead of 8086:2c41. So, we need |
| 1335 | * to probe for the alternate address in case of failure | 1335 | * to probe for the alternate address in case of failure |
| 1336 | */ | 1336 | */ |
| 1337 | if (dev_descr->dev_id == PCI_DEVICE_ID_INTEL_I7_NONCORE && !pdev) | 1337 | if (dev_descr->dev_id == PCI_DEVICE_ID_INTEL_I7_NONCORE && !pdev) { |
| 1338 | pci_dev_get(*prev); /* pci_get_device will put it */ | ||
| 1338 | pdev = pci_get_device(PCI_VENDOR_ID_INTEL, | 1339 | pdev = pci_get_device(PCI_VENDOR_ID_INTEL, |
| 1339 | PCI_DEVICE_ID_INTEL_I7_NONCORE_ALT, *prev); | 1340 | PCI_DEVICE_ID_INTEL_I7_NONCORE_ALT, *prev); |
| 1341 | } | ||
| 1340 | 1342 | ||
| 1341 | if (dev_descr->dev_id == PCI_DEVICE_ID_INTEL_LYNNFIELD_NONCORE && !pdev) | 1343 | if (dev_descr->dev_id == PCI_DEVICE_ID_INTEL_LYNNFIELD_NONCORE && |
| 1344 | !pdev) { | ||
| 1345 | pci_dev_get(*prev); /* pci_get_device will put it */ | ||
| 1342 | pdev = pci_get_device(PCI_VENDOR_ID_INTEL, | 1346 | pdev = pci_get_device(PCI_VENDOR_ID_INTEL, |
| 1343 | PCI_DEVICE_ID_INTEL_LYNNFIELD_NONCORE_ALT, | 1347 | PCI_DEVICE_ID_INTEL_LYNNFIELD_NONCORE_ALT, |
| 1344 | *prev); | 1348 | *prev); |
| 1349 | } | ||
| 1345 | 1350 | ||
| 1346 | if (!pdev) { | 1351 | if (!pdev) { |
| 1347 | if (*prev) { | 1352 | if (*prev) { |
diff --git a/drivers/extcon/extcon-arizona.c b/drivers/extcon/extcon-arizona.c index c20602f601ee..98a14f6143a7 100644 --- a/drivers/extcon/extcon-arizona.c +++ b/drivers/extcon/extcon-arizona.c | |||
| @@ -222,27 +222,19 @@ static void arizona_extcon_pulse_micbias(struct arizona_extcon_info *info) | |||
| 222 | struct snd_soc_dapm_context *dapm = arizona->dapm; | 222 | struct snd_soc_dapm_context *dapm = arizona->dapm; |
| 223 | int ret; | 223 | int ret; |
| 224 | 224 | ||
| 225 | mutex_lock(&dapm->card->dapm_mutex); | ||
| 226 | |||
| 227 | ret = snd_soc_dapm_force_enable_pin(dapm, widget); | 225 | ret = snd_soc_dapm_force_enable_pin(dapm, widget); |
| 228 | if (ret != 0) | 226 | if (ret != 0) |
| 229 | dev_warn(arizona->dev, "Failed to enable %s: %d\n", | 227 | dev_warn(arizona->dev, "Failed to enable %s: %d\n", |
| 230 | widget, ret); | 228 | widget, ret); |
| 231 | 229 | ||
| 232 | mutex_unlock(&dapm->card->dapm_mutex); | ||
| 233 | |||
| 234 | snd_soc_dapm_sync(dapm); | 230 | snd_soc_dapm_sync(dapm); |
| 235 | 231 | ||
| 236 | if (!arizona->pdata.micd_force_micbias) { | 232 | if (!arizona->pdata.micd_force_micbias) { |
| 237 | mutex_lock(&dapm->card->dapm_mutex); | ||
| 238 | |||
| 239 | ret = snd_soc_dapm_disable_pin(arizona->dapm, widget); | 233 | ret = snd_soc_dapm_disable_pin(arizona->dapm, widget); |
| 240 | if (ret != 0) | 234 | if (ret != 0) |
| 241 | dev_warn(arizona->dev, "Failed to disable %s: %d\n", | 235 | dev_warn(arizona->dev, "Failed to disable %s: %d\n", |
| 242 | widget, ret); | 236 | widget, ret); |
| 243 | 237 | ||
| 244 | mutex_unlock(&dapm->card->dapm_mutex); | ||
| 245 | |||
| 246 | snd_soc_dapm_sync(dapm); | 238 | snd_soc_dapm_sync(dapm); |
| 247 | } | 239 | } |
| 248 | } | 240 | } |
| @@ -304,16 +296,12 @@ static void arizona_stop_mic(struct arizona_extcon_info *info) | |||
| 304 | ARIZONA_MICD_ENA, 0, | 296 | ARIZONA_MICD_ENA, 0, |
| 305 | &change); | 297 | &change); |
| 306 | 298 | ||
| 307 | mutex_lock(&dapm->card->dapm_mutex); | ||
| 308 | |||
| 309 | ret = snd_soc_dapm_disable_pin(dapm, widget); | 299 | ret = snd_soc_dapm_disable_pin(dapm, widget); |
| 310 | if (ret != 0) | 300 | if (ret != 0) |
| 311 | dev_warn(arizona->dev, | 301 | dev_warn(arizona->dev, |
| 312 | "Failed to disable %s: %d\n", | 302 | "Failed to disable %s: %d\n", |
| 313 | widget, ret); | 303 | widget, ret); |
| 314 | 304 | ||
| 315 | mutex_unlock(&dapm->card->dapm_mutex); | ||
| 316 | |||
| 317 | snd_soc_dapm_sync(dapm); | 305 | snd_soc_dapm_sync(dapm); |
| 318 | 306 | ||
| 319 | if (info->micd_reva) { | 307 | if (info->micd_reva) { |
diff --git a/drivers/firewire/core-device.c b/drivers/firewire/core-device.c index de4aa409abe2..2c6d5e118ac1 100644 --- a/drivers/firewire/core-device.c +++ b/drivers/firewire/core-device.c | |||
| @@ -916,7 +916,7 @@ static int lookup_existing_device(struct device *dev, void *data) | |||
| 916 | old->config_rom_retries = 0; | 916 | old->config_rom_retries = 0; |
| 917 | fw_notice(card, "rediscovered device %s\n", dev_name(dev)); | 917 | fw_notice(card, "rediscovered device %s\n", dev_name(dev)); |
| 918 | 918 | ||
| 919 | PREPARE_DELAYED_WORK(&old->work, fw_device_update); | 919 | old->workfn = fw_device_update; |
| 920 | fw_schedule_device_work(old, 0); | 920 | fw_schedule_device_work(old, 0); |
| 921 | 921 | ||
| 922 | if (current_node == card->root_node) | 922 | if (current_node == card->root_node) |
| @@ -1075,7 +1075,7 @@ static void fw_device_init(struct work_struct *work) | |||
| 1075 | if (atomic_cmpxchg(&device->state, | 1075 | if (atomic_cmpxchg(&device->state, |
| 1076 | FW_DEVICE_INITIALIZING, | 1076 | FW_DEVICE_INITIALIZING, |
| 1077 | FW_DEVICE_RUNNING) == FW_DEVICE_GONE) { | 1077 | FW_DEVICE_RUNNING) == FW_DEVICE_GONE) { |
| 1078 | PREPARE_DELAYED_WORK(&device->work, fw_device_shutdown); | 1078 | device->workfn = fw_device_shutdown; |
| 1079 | fw_schedule_device_work(device, SHUTDOWN_DELAY); | 1079 | fw_schedule_device_work(device, SHUTDOWN_DELAY); |
| 1080 | } else { | 1080 | } else { |
| 1081 | fw_notice(card, "created device %s: GUID %08x%08x, S%d00\n", | 1081 | fw_notice(card, "created device %s: GUID %08x%08x, S%d00\n", |
| @@ -1196,13 +1196,20 @@ static void fw_device_refresh(struct work_struct *work) | |||
| 1196 | dev_name(&device->device), fw_rcode_string(ret)); | 1196 | dev_name(&device->device), fw_rcode_string(ret)); |
| 1197 | gone: | 1197 | gone: |
| 1198 | atomic_set(&device->state, FW_DEVICE_GONE); | 1198 | atomic_set(&device->state, FW_DEVICE_GONE); |
| 1199 | PREPARE_DELAYED_WORK(&device->work, fw_device_shutdown); | 1199 | device->workfn = fw_device_shutdown; |
| 1200 | fw_schedule_device_work(device, SHUTDOWN_DELAY); | 1200 | fw_schedule_device_work(device, SHUTDOWN_DELAY); |
| 1201 | out: | 1201 | out: |
| 1202 | if (node_id == card->root_node->node_id) | 1202 | if (node_id == card->root_node->node_id) |
| 1203 | fw_schedule_bm_work(card, 0); | 1203 | fw_schedule_bm_work(card, 0); |
| 1204 | } | 1204 | } |
| 1205 | 1205 | ||
| 1206 | static void fw_device_workfn(struct work_struct *work) | ||
| 1207 | { | ||
| 1208 | struct fw_device *device = container_of(to_delayed_work(work), | ||
| 1209 | struct fw_device, work); | ||
| 1210 | device->workfn(work); | ||
| 1211 | } | ||
| 1212 | |||
| 1206 | void fw_node_event(struct fw_card *card, struct fw_node *node, int event) | 1213 | void fw_node_event(struct fw_card *card, struct fw_node *node, int event) |
| 1207 | { | 1214 | { |
| 1208 | struct fw_device *device; | 1215 | struct fw_device *device; |
| @@ -1252,7 +1259,8 @@ void fw_node_event(struct fw_card *card, struct fw_node *node, int event) | |||
| 1252 | * power-up after getting plugged in. We schedule the | 1259 | * power-up after getting plugged in. We schedule the |
| 1253 | * first config rom scan half a second after bus reset. | 1260 | * first config rom scan half a second after bus reset. |
| 1254 | */ | 1261 | */ |
| 1255 | INIT_DELAYED_WORK(&device->work, fw_device_init); | 1262 | device->workfn = fw_device_init; |
| 1263 | INIT_DELAYED_WORK(&device->work, fw_device_workfn); | ||
| 1256 | fw_schedule_device_work(device, INITIAL_DELAY); | 1264 | fw_schedule_device_work(device, INITIAL_DELAY); |
| 1257 | break; | 1265 | break; |
| 1258 | 1266 | ||
| @@ -1268,7 +1276,7 @@ void fw_node_event(struct fw_card *card, struct fw_node *node, int event) | |||
| 1268 | if (atomic_cmpxchg(&device->state, | 1276 | if (atomic_cmpxchg(&device->state, |
| 1269 | FW_DEVICE_RUNNING, | 1277 | FW_DEVICE_RUNNING, |
| 1270 | FW_DEVICE_INITIALIZING) == FW_DEVICE_RUNNING) { | 1278 | FW_DEVICE_INITIALIZING) == FW_DEVICE_RUNNING) { |
| 1271 | PREPARE_DELAYED_WORK(&device->work, fw_device_refresh); | 1279 | device->workfn = fw_device_refresh; |
| 1272 | fw_schedule_device_work(device, | 1280 | fw_schedule_device_work(device, |
| 1273 | device->is_local ? 0 : INITIAL_DELAY); | 1281 | device->is_local ? 0 : INITIAL_DELAY); |
| 1274 | } | 1282 | } |
| @@ -1283,7 +1291,7 @@ void fw_node_event(struct fw_card *card, struct fw_node *node, int event) | |||
| 1283 | smp_wmb(); /* update node_id before generation */ | 1291 | smp_wmb(); /* update node_id before generation */ |
| 1284 | device->generation = card->generation; | 1292 | device->generation = card->generation; |
| 1285 | if (atomic_read(&device->state) == FW_DEVICE_RUNNING) { | 1293 | if (atomic_read(&device->state) == FW_DEVICE_RUNNING) { |
| 1286 | PREPARE_DELAYED_WORK(&device->work, fw_device_update); | 1294 | device->workfn = fw_device_update; |
| 1287 | fw_schedule_device_work(device, 0); | 1295 | fw_schedule_device_work(device, 0); |
| 1288 | } | 1296 | } |
| 1289 | break; | 1297 | break; |
| @@ -1308,7 +1316,7 @@ void fw_node_event(struct fw_card *card, struct fw_node *node, int event) | |||
| 1308 | device = node->data; | 1316 | device = node->data; |
| 1309 | if (atomic_xchg(&device->state, | 1317 | if (atomic_xchg(&device->state, |
| 1310 | FW_DEVICE_GONE) == FW_DEVICE_RUNNING) { | 1318 | FW_DEVICE_GONE) == FW_DEVICE_RUNNING) { |
| 1311 | PREPARE_DELAYED_WORK(&device->work, fw_device_shutdown); | 1319 | device->workfn = fw_device_shutdown; |
| 1312 | fw_schedule_device_work(device, | 1320 | fw_schedule_device_work(device, |
| 1313 | list_empty(&card->link) ? 0 : SHUTDOWN_DELAY); | 1321 | list_empty(&card->link) ? 0 : SHUTDOWN_DELAY); |
| 1314 | } | 1322 | } |
diff --git a/drivers/firewire/net.c b/drivers/firewire/net.c index 6b895986dc22..4af0a7bad7f2 100644 --- a/drivers/firewire/net.c +++ b/drivers/firewire/net.c | |||
| @@ -929,8 +929,6 @@ static void fwnet_write_complete(struct fw_card *card, int rcode, | |||
| 929 | if (rcode == RCODE_COMPLETE) { | 929 | if (rcode == RCODE_COMPLETE) { |
| 930 | fwnet_transmit_packet_done(ptask); | 930 | fwnet_transmit_packet_done(ptask); |
| 931 | } else { | 931 | } else { |
| 932 | fwnet_transmit_packet_failed(ptask); | ||
| 933 | |||
| 934 | if (printk_timed_ratelimit(&j, 1000) || rcode != last_rcode) { | 932 | if (printk_timed_ratelimit(&j, 1000) || rcode != last_rcode) { |
| 935 | dev_err(&ptask->dev->netdev->dev, | 933 | dev_err(&ptask->dev->netdev->dev, |
| 936 | "fwnet_write_complete failed: %x (skipped %d)\n", | 934 | "fwnet_write_complete failed: %x (skipped %d)\n", |
| @@ -938,8 +936,10 @@ static void fwnet_write_complete(struct fw_card *card, int rcode, | |||
| 938 | 936 | ||
| 939 | errors_skipped = 0; | 937 | errors_skipped = 0; |
| 940 | last_rcode = rcode; | 938 | last_rcode = rcode; |
| 941 | } else | 939 | } else { |
| 942 | errors_skipped++; | 940 | errors_skipped++; |
| 941 | } | ||
| 942 | fwnet_transmit_packet_failed(ptask); | ||
| 943 | } | 943 | } |
| 944 | } | 944 | } |
| 945 | 945 | ||
diff --git a/drivers/firewire/ohci.c b/drivers/firewire/ohci.c index 6f74d8d3f700..8db663219560 100644 --- a/drivers/firewire/ohci.c +++ b/drivers/firewire/ohci.c | |||
| @@ -290,7 +290,6 @@ static char ohci_driver_name[] = KBUILD_MODNAME; | |||
| 290 | #define QUIRK_NO_MSI 0x10 | 290 | #define QUIRK_NO_MSI 0x10 |
| 291 | #define QUIRK_TI_SLLZ059 0x20 | 291 | #define QUIRK_TI_SLLZ059 0x20 |
| 292 | #define QUIRK_IR_WAKE 0x40 | 292 | #define QUIRK_IR_WAKE 0x40 |
| 293 | #define QUIRK_PHY_LCTRL_TIMEOUT 0x80 | ||
| 294 | 293 | ||
| 295 | /* In case of multiple matches in ohci_quirks[], only the first one is used. */ | 294 | /* In case of multiple matches in ohci_quirks[], only the first one is used. */ |
| 296 | static const struct { | 295 | static const struct { |
| @@ -303,10 +302,7 @@ static const struct { | |||
| 303 | QUIRK_BE_HEADERS}, | 302 | QUIRK_BE_HEADERS}, |
| 304 | 303 | ||
| 305 | {PCI_VENDOR_ID_ATT, PCI_DEVICE_ID_AGERE_FW643, 6, | 304 | {PCI_VENDOR_ID_ATT, PCI_DEVICE_ID_AGERE_FW643, 6, |
| 306 | QUIRK_PHY_LCTRL_TIMEOUT | QUIRK_NO_MSI}, | 305 | QUIRK_NO_MSI}, |
| 307 | |||
| 308 | {PCI_VENDOR_ID_ATT, PCI_ANY_ID, PCI_ANY_ID, | ||
| 309 | QUIRK_PHY_LCTRL_TIMEOUT}, | ||
| 310 | 306 | ||
| 311 | {PCI_VENDOR_ID_CREATIVE, PCI_DEVICE_ID_CREATIVE_SB1394, PCI_ANY_ID, | 307 | {PCI_VENDOR_ID_CREATIVE, PCI_DEVICE_ID_CREATIVE_SB1394, PCI_ANY_ID, |
| 312 | QUIRK_RESET_PACKET}, | 308 | QUIRK_RESET_PACKET}, |
| @@ -353,7 +349,6 @@ MODULE_PARM_DESC(quirks, "Chip quirks (default = 0" | |||
| 353 | ", disable MSI = " __stringify(QUIRK_NO_MSI) | 349 | ", disable MSI = " __stringify(QUIRK_NO_MSI) |
| 354 | ", TI SLLZ059 erratum = " __stringify(QUIRK_TI_SLLZ059) | 350 | ", TI SLLZ059 erratum = " __stringify(QUIRK_TI_SLLZ059) |
| 355 | ", IR wake unreliable = " __stringify(QUIRK_IR_WAKE) | 351 | ", IR wake unreliable = " __stringify(QUIRK_IR_WAKE) |
| 356 | ", phy LCtrl timeout = " __stringify(QUIRK_PHY_LCTRL_TIMEOUT) | ||
| 357 | ")"); | 352 | ")"); |
| 358 | 353 | ||
| 359 | #define OHCI_PARAM_DEBUG_AT_AR 1 | 354 | #define OHCI_PARAM_DEBUG_AT_AR 1 |
| @@ -2299,9 +2294,6 @@ static int ohci_enable(struct fw_card *card, | |||
| 2299 | * TI TSB82AA2 + TSB81BA3(A) cards signal LPS enabled early but | 2294 | * TI TSB82AA2 + TSB81BA3(A) cards signal LPS enabled early but |
| 2300 | * cannot actually use the phy at that time. These need tens of | 2295 | * cannot actually use the phy at that time. These need tens of |
| 2301 | * millisecods pause between LPS write and first phy access too. | 2296 | * millisecods pause between LPS write and first phy access too. |
| 2302 | * | ||
| 2303 | * But do not wait for 50msec on Agere/LSI cards. Their phy | ||
| 2304 | * arbitration state machine may time out during such a long wait. | ||
| 2305 | */ | 2297 | */ |
| 2306 | 2298 | ||
| 2307 | reg_write(ohci, OHCI1394_HCControlSet, | 2299 | reg_write(ohci, OHCI1394_HCControlSet, |
| @@ -2309,11 +2301,8 @@ static int ohci_enable(struct fw_card *card, | |||
| 2309 | OHCI1394_HCControl_postedWriteEnable); | 2301 | OHCI1394_HCControl_postedWriteEnable); |
| 2310 | flush_writes(ohci); | 2302 | flush_writes(ohci); |
| 2311 | 2303 | ||
| 2312 | if (!(ohci->quirks & QUIRK_PHY_LCTRL_TIMEOUT)) | 2304 | for (lps = 0, i = 0; !lps && i < 3; i++) { |
| 2313 | msleep(50); | 2305 | msleep(50); |
| 2314 | |||
| 2315 | for (lps = 0, i = 0; !lps && i < 150; i++) { | ||
| 2316 | msleep(1); | ||
| 2317 | lps = reg_read(ohci, OHCI1394_HCControlSet) & | 2306 | lps = reg_read(ohci, OHCI1394_HCControlSet) & |
| 2318 | OHCI1394_HCControl_LPS; | 2307 | OHCI1394_HCControl_LPS; |
| 2319 | } | 2308 | } |
diff --git a/drivers/firewire/sbp2.c b/drivers/firewire/sbp2.c index 281029daf98c..7aef911fdc71 100644 --- a/drivers/firewire/sbp2.c +++ b/drivers/firewire/sbp2.c | |||
| @@ -146,6 +146,7 @@ struct sbp2_logical_unit { | |||
| 146 | */ | 146 | */ |
| 147 | int generation; | 147 | int generation; |
| 148 | int retries; | 148 | int retries; |
| 149 | work_func_t workfn; | ||
| 149 | struct delayed_work work; | 150 | struct delayed_work work; |
| 150 | bool has_sdev; | 151 | bool has_sdev; |
| 151 | bool blocked; | 152 | bool blocked; |
| @@ -864,7 +865,7 @@ static void sbp2_login(struct work_struct *work) | |||
| 864 | /* set appropriate retry limit(s) in BUSY_TIMEOUT register */ | 865 | /* set appropriate retry limit(s) in BUSY_TIMEOUT register */ |
| 865 | sbp2_set_busy_timeout(lu); | 866 | sbp2_set_busy_timeout(lu); |
| 866 | 867 | ||
| 867 | PREPARE_DELAYED_WORK(&lu->work, sbp2_reconnect); | 868 | lu->workfn = sbp2_reconnect; |
| 868 | sbp2_agent_reset(lu); | 869 | sbp2_agent_reset(lu); |
| 869 | 870 | ||
| 870 | /* This was a re-login. */ | 871 | /* This was a re-login. */ |
| @@ -918,7 +919,7 @@ static void sbp2_login(struct work_struct *work) | |||
| 918 | * If a bus reset happened, sbp2_update will have requeued | 919 | * If a bus reset happened, sbp2_update will have requeued |
| 919 | * lu->work already. Reset the work from reconnect to login. | 920 | * lu->work already. Reset the work from reconnect to login. |
| 920 | */ | 921 | */ |
| 921 | PREPARE_DELAYED_WORK(&lu->work, sbp2_login); | 922 | lu->workfn = sbp2_login; |
| 922 | } | 923 | } |
| 923 | 924 | ||
| 924 | static void sbp2_reconnect(struct work_struct *work) | 925 | static void sbp2_reconnect(struct work_struct *work) |
| @@ -952,7 +953,7 @@ static void sbp2_reconnect(struct work_struct *work) | |||
| 952 | lu->retries++ >= 5) { | 953 | lu->retries++ >= 5) { |
| 953 | dev_err(tgt_dev(tgt), "failed to reconnect\n"); | 954 | dev_err(tgt_dev(tgt), "failed to reconnect\n"); |
| 954 | lu->retries = 0; | 955 | lu->retries = 0; |
| 955 | PREPARE_DELAYED_WORK(&lu->work, sbp2_login); | 956 | lu->workfn = sbp2_login; |
| 956 | } | 957 | } |
| 957 | sbp2_queue_work(lu, DIV_ROUND_UP(HZ, 5)); | 958 | sbp2_queue_work(lu, DIV_ROUND_UP(HZ, 5)); |
| 958 | 959 | ||
| @@ -972,6 +973,13 @@ static void sbp2_reconnect(struct work_struct *work) | |||
| 972 | sbp2_conditionally_unblock(lu); | 973 | sbp2_conditionally_unblock(lu); |
| 973 | } | 974 | } |
| 974 | 975 | ||
| 976 | static void sbp2_lu_workfn(struct work_struct *work) | ||
| 977 | { | ||
| 978 | struct sbp2_logical_unit *lu = container_of(to_delayed_work(work), | ||
| 979 | struct sbp2_logical_unit, work); | ||
| 980 | lu->workfn(work); | ||
| 981 | } | ||
| 982 | |||
| 975 | static int sbp2_add_logical_unit(struct sbp2_target *tgt, int lun_entry) | 983 | static int sbp2_add_logical_unit(struct sbp2_target *tgt, int lun_entry) |
| 976 | { | 984 | { |
| 977 | struct sbp2_logical_unit *lu; | 985 | struct sbp2_logical_unit *lu; |
| @@ -998,7 +1006,8 @@ static int sbp2_add_logical_unit(struct sbp2_target *tgt, int lun_entry) | |||
| 998 | lu->blocked = false; | 1006 | lu->blocked = false; |
| 999 | ++tgt->dont_block; | 1007 | ++tgt->dont_block; |
| 1000 | INIT_LIST_HEAD(&lu->orb_list); | 1008 | INIT_LIST_HEAD(&lu->orb_list); |
| 1001 | INIT_DELAYED_WORK(&lu->work, sbp2_login); | 1009 | lu->workfn = sbp2_login; |
| 1010 | INIT_DELAYED_WORK(&lu->work, sbp2_lu_workfn); | ||
| 1002 | 1011 | ||
| 1003 | list_add_tail(&lu->link, &tgt->lu_list); | 1012 | list_add_tail(&lu->link, &tgt->lu_list); |
| 1004 | return 0; | 1013 | return 0; |
diff --git a/drivers/gpu/drm/armada/armada_drv.c b/drivers/gpu/drm/armada/armada_drv.c index acf3a36c9ebc..32982da82694 100644 --- a/drivers/gpu/drm/armada/armada_drv.c +++ b/drivers/gpu/drm/armada/armada_drv.c | |||
| @@ -68,15 +68,7 @@ void __armada_drm_queue_unref_work(struct drm_device *dev, | |||
| 68 | { | 68 | { |
| 69 | struct armada_private *priv = dev->dev_private; | 69 | struct armada_private *priv = dev->dev_private; |
| 70 | 70 | ||
| 71 | /* | 71 | WARN_ON(!kfifo_put(&priv->fb_unref, fb)); |
| 72 | * Yes, we really must jump through these hoops just to store a | ||
| 73 | * _pointer_ to something into the kfifo. This is utterly insane | ||
| 74 | * and idiotic, because it kfifo requires the _data_ pointed to by | ||
| 75 | * the pointer const, not the pointer itself. Not only that, but | ||
| 76 | * you have to pass a pointer _to_ the pointer you want stored. | ||
| 77 | */ | ||
| 78 | const struct drm_framebuffer *silly_api_alert = fb; | ||
| 79 | WARN_ON(!kfifo_put(&priv->fb_unref, &silly_api_alert)); | ||
| 80 | schedule_work(&priv->fb_unref_work); | 72 | schedule_work(&priv->fb_unref_work); |
| 81 | } | 73 | } |
| 82 | 74 | ||
diff --git a/drivers/gpu/drm/bochs/Kconfig b/drivers/gpu/drm/bochs/Kconfig index c8fcf12019f0..5f8b0c2b9a44 100644 --- a/drivers/gpu/drm/bochs/Kconfig +++ b/drivers/gpu/drm/bochs/Kconfig | |||
| @@ -2,6 +2,7 @@ config DRM_BOCHS | |||
| 2 | tristate "DRM Support for bochs dispi vga interface (qemu stdvga)" | 2 | tristate "DRM Support for bochs dispi vga interface (qemu stdvga)" |
| 3 | depends on DRM && PCI | 3 | depends on DRM && PCI |
| 4 | select DRM_KMS_HELPER | 4 | select DRM_KMS_HELPER |
| 5 | select DRM_KMS_FB_HELPER | ||
| 5 | select FB_SYS_FILLRECT | 6 | select FB_SYS_FILLRECT |
| 6 | select FB_SYS_COPYAREA | 7 | select FB_SYS_COPYAREA |
| 7 | select FB_SYS_IMAGEBLIT | 8 | select FB_SYS_IMAGEBLIT |
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 04f1f02c4019..ec7bb0fc71bc 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c | |||
| @@ -403,7 +403,7 @@ MODULE_DEVICE_TABLE(pci, pciidlist); | |||
| 403 | void intel_detect_pch(struct drm_device *dev) | 403 | void intel_detect_pch(struct drm_device *dev) |
| 404 | { | 404 | { |
| 405 | struct drm_i915_private *dev_priv = dev->dev_private; | 405 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 406 | struct pci_dev *pch; | 406 | struct pci_dev *pch = NULL; |
| 407 | 407 | ||
| 408 | /* In all current cases, num_pipes is equivalent to the PCH_NOP setting | 408 | /* In all current cases, num_pipes is equivalent to the PCH_NOP setting |
| 409 | * (which really amounts to a PCH but no South Display). | 409 | * (which really amounts to a PCH but no South Display). |
| @@ -424,12 +424,9 @@ void intel_detect_pch(struct drm_device *dev) | |||
| 424 | * all the ISA bridge devices and check for the first match, instead | 424 | * all the ISA bridge devices and check for the first match, instead |
| 425 | * of only checking the first one. | 425 | * of only checking the first one. |
| 426 | */ | 426 | */ |
| 427 | pch = pci_get_class(PCI_CLASS_BRIDGE_ISA << 8, NULL); | 427 | while ((pch = pci_get_class(PCI_CLASS_BRIDGE_ISA << 8, pch))) { |
| 428 | while (pch) { | ||
| 429 | struct pci_dev *curr = pch; | ||
| 430 | if (pch->vendor == PCI_VENDOR_ID_INTEL) { | 428 | if (pch->vendor == PCI_VENDOR_ID_INTEL) { |
| 431 | unsigned short id; | 429 | unsigned short id = pch->device & INTEL_PCH_DEVICE_ID_MASK; |
| 432 | id = pch->device & INTEL_PCH_DEVICE_ID_MASK; | ||
| 433 | dev_priv->pch_id = id; | 430 | dev_priv->pch_id = id; |
| 434 | 431 | ||
| 435 | if (id == INTEL_PCH_IBX_DEVICE_ID_TYPE) { | 432 | if (id == INTEL_PCH_IBX_DEVICE_ID_TYPE) { |
| @@ -461,18 +458,16 @@ void intel_detect_pch(struct drm_device *dev) | |||
| 461 | DRM_DEBUG_KMS("Found LynxPoint LP PCH\n"); | 458 | DRM_DEBUG_KMS("Found LynxPoint LP PCH\n"); |
| 462 | WARN_ON(!IS_HASWELL(dev)); | 459 | WARN_ON(!IS_HASWELL(dev)); |
| 463 | WARN_ON(!IS_ULT(dev)); | 460 | WARN_ON(!IS_ULT(dev)); |
| 464 | } else { | 461 | } else |
| 465 | goto check_next; | 462 | continue; |
| 466 | } | 463 | |
| 467 | pci_dev_put(pch); | ||
| 468 | break; | 464 | break; |
| 469 | } | 465 | } |
| 470 | check_next: | ||
| 471 | pch = pci_get_class(PCI_CLASS_BRIDGE_ISA << 8, curr); | ||
| 472 | pci_dev_put(curr); | ||
| 473 | } | 466 | } |
| 474 | if (!pch) | 467 | if (!pch) |
| 475 | DRM_DEBUG_KMS("No PCH found?\n"); | 468 | DRM_DEBUG_KMS("No PCH found.\n"); |
| 469 | |||
| 470 | pci_dev_put(pch); | ||
| 476 | } | 471 | } |
| 477 | 472 | ||
| 478 | bool i915_semaphore_is_enabled(struct drm_device *dev) | 473 | bool i915_semaphore_is_enabled(struct drm_device *dev) |
diff --git a/drivers/gpu/drm/i915/i915_gem_stolen.c b/drivers/gpu/drm/i915/i915_gem_stolen.c index 1a24e84f2315..d58b4e287e32 100644 --- a/drivers/gpu/drm/i915/i915_gem_stolen.c +++ b/drivers/gpu/drm/i915/i915_gem_stolen.c | |||
| @@ -82,9 +82,22 @@ static unsigned long i915_stolen_to_physical(struct drm_device *dev) | |||
| 82 | r = devm_request_mem_region(dev->dev, base, dev_priv->gtt.stolen_size, | 82 | r = devm_request_mem_region(dev->dev, base, dev_priv->gtt.stolen_size, |
| 83 | "Graphics Stolen Memory"); | 83 | "Graphics Stolen Memory"); |
| 84 | if (r == NULL) { | 84 | if (r == NULL) { |
| 85 | DRM_ERROR("conflict detected with stolen region: [0x%08x - 0x%08x]\n", | 85 | /* |
| 86 | base, base + (uint32_t)dev_priv->gtt.stolen_size); | 86 | * One more attempt but this time requesting region from |
| 87 | base = 0; | 87 | * base + 1, as we have seen that this resolves the region |
| 88 | * conflict with the PCI Bus. | ||
| 89 | * This is a BIOS w/a: Some BIOS wrap stolen in the root | ||
| 90 | * PCI bus, but have an off-by-one error. Hence retry the | ||
| 91 | * reservation starting from 1 instead of 0. | ||
| 92 | */ | ||
| 93 | r = devm_request_mem_region(dev->dev, base + 1, | ||
| 94 | dev_priv->gtt.stolen_size - 1, | ||
| 95 | "Graphics Stolen Memory"); | ||
| 96 | if (r == NULL) { | ||
| 97 | DRM_ERROR("conflict detected with stolen region: [0x%08x - 0x%08x]\n", | ||
| 98 | base, base + (uint32_t)dev_priv->gtt.stolen_size); | ||
| 99 | base = 0; | ||
| 100 | } | ||
| 88 | } | 101 | } |
| 89 | 102 | ||
| 90 | return base; | 103 | return base; |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 4c1672809493..9b8a7c7ea7fc 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -1092,12 +1092,12 @@ static void assert_cursor(struct drm_i915_private *dev_priv, | |||
| 1092 | struct drm_device *dev = dev_priv->dev; | 1092 | struct drm_device *dev = dev_priv->dev; |
| 1093 | bool cur_state; | 1093 | bool cur_state; |
| 1094 | 1094 | ||
| 1095 | if (IS_IVYBRIDGE(dev) || IS_HASWELL(dev)) | 1095 | if (IS_845G(dev) || IS_I865G(dev)) |
| 1096 | cur_state = I915_READ(CURCNTR_IVB(pipe)) & CURSOR_MODE; | ||
| 1097 | else if (IS_845G(dev) || IS_I865G(dev)) | ||
| 1098 | cur_state = I915_READ(_CURACNTR) & CURSOR_ENABLE; | 1096 | cur_state = I915_READ(_CURACNTR) & CURSOR_ENABLE; |
| 1099 | else | 1097 | else if (INTEL_INFO(dev)->gen <= 6 || IS_VALLEYVIEW(dev)) |
| 1100 | cur_state = I915_READ(CURCNTR(pipe)) & CURSOR_MODE; | 1098 | cur_state = I915_READ(CURCNTR(pipe)) & CURSOR_MODE; |
| 1099 | else | ||
| 1100 | cur_state = I915_READ(CURCNTR_IVB(pipe)) & CURSOR_MODE; | ||
| 1101 | 1101 | ||
| 1102 | WARN(cur_state != state, | 1102 | WARN(cur_state != state, |
| 1103 | "cursor on pipe %c assertion failure (expected %s, current %s)\n", | 1103 | "cursor on pipe %c assertion failure (expected %s, current %s)\n", |
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c index 6db0d9d17f47..ee3181ebcc92 100644 --- a/drivers/gpu/drm/i915/intel_hdmi.c +++ b/drivers/gpu/drm/i915/intel_hdmi.c | |||
| @@ -845,7 +845,7 @@ static int hdmi_portclock_limit(struct intel_hdmi *hdmi) | |||
| 845 | { | 845 | { |
| 846 | struct drm_device *dev = intel_hdmi_to_dev(hdmi); | 846 | struct drm_device *dev = intel_hdmi_to_dev(hdmi); |
| 847 | 847 | ||
| 848 | if (IS_G4X(dev)) | 848 | if (!hdmi->has_hdmi_sink || IS_G4X(dev)) |
| 849 | return 165000; | 849 | return 165000; |
| 850 | else if (IS_HASWELL(dev) || INTEL_INFO(dev)->gen >= 8) | 850 | else if (IS_HASWELL(dev) || INTEL_INFO(dev)->gen >= 8) |
| 851 | return 300000; | 851 | return 300000; |
| @@ -899,8 +899,8 @@ bool intel_hdmi_compute_config(struct intel_encoder *encoder, | |||
| 899 | * outputs. We also need to check that the higher clock still fits | 899 | * outputs. We also need to check that the higher clock still fits |
| 900 | * within limits. | 900 | * within limits. |
| 901 | */ | 901 | */ |
| 902 | if (pipe_config->pipe_bpp > 8*3 && clock_12bpc <= portclock_limit | 902 | if (pipe_config->pipe_bpp > 8*3 && intel_hdmi->has_hdmi_sink && |
| 903 | && HAS_PCH_SPLIT(dev)) { | 903 | clock_12bpc <= portclock_limit && HAS_PCH_SPLIT(dev)) { |
| 904 | DRM_DEBUG_KMS("picking bpc to 12 for HDMI output\n"); | 904 | DRM_DEBUG_KMS("picking bpc to 12 for HDMI output\n"); |
| 905 | desired_bpp = 12*3; | 905 | desired_bpp = 12*3; |
| 906 | 906 | ||
diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c index 350de359123a..079ea38f14d9 100644 --- a/drivers/gpu/drm/i915/intel_panel.c +++ b/drivers/gpu/drm/i915/intel_panel.c | |||
| @@ -698,7 +698,7 @@ static void i9xx_enable_backlight(struct intel_connector *connector) | |||
| 698 | freq /= 0xff; | 698 | freq /= 0xff; |
| 699 | 699 | ||
| 700 | ctl = freq << 17; | 700 | ctl = freq << 17; |
| 701 | if (IS_GEN2(dev) && panel->backlight.combination_mode) | 701 | if (panel->backlight.combination_mode) |
| 702 | ctl |= BLM_LEGACY_MODE; | 702 | ctl |= BLM_LEGACY_MODE; |
| 703 | if (IS_PINEVIEW(dev) && panel->backlight.active_low_pwm) | 703 | if (IS_PINEVIEW(dev) && panel->backlight.active_low_pwm) |
| 704 | ctl |= BLM_POLARITY_PNV; | 704 | ctl |= BLM_POLARITY_PNV; |
| @@ -979,7 +979,7 @@ static int i9xx_setup_backlight(struct intel_connector *connector) | |||
| 979 | 979 | ||
| 980 | ctl = I915_READ(BLC_PWM_CTL); | 980 | ctl = I915_READ(BLC_PWM_CTL); |
| 981 | 981 | ||
| 982 | if (IS_GEN2(dev)) | 982 | if (IS_GEN2(dev) || IS_I915GM(dev) || IS_I945GM(dev)) |
| 983 | panel->backlight.combination_mode = ctl & BLM_LEGACY_MODE; | 983 | panel->backlight.combination_mode = ctl & BLM_LEGACY_MODE; |
| 984 | 984 | ||
| 985 | if (IS_PINEVIEW(dev)) | 985 | if (IS_PINEVIEW(dev)) |
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index d77cc81900f9..e1fc35a72656 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c | |||
| @@ -3493,6 +3493,8 @@ static void valleyview_setup_pctx(struct drm_device *dev) | |||
| 3493 | u32 pcbr; | 3493 | u32 pcbr; |
| 3494 | int pctx_size = 24*1024; | 3494 | int pctx_size = 24*1024; |
| 3495 | 3495 | ||
| 3496 | WARN_ON(!mutex_is_locked(&dev->struct_mutex)); | ||
| 3497 | |||
| 3496 | pcbr = I915_READ(VLV_PCBR); | 3498 | pcbr = I915_READ(VLV_PCBR); |
| 3497 | if (pcbr) { | 3499 | if (pcbr) { |
| 3498 | /* BIOS set it up already, grab the pre-alloc'd space */ | 3500 | /* BIOS set it up already, grab the pre-alloc'd space */ |
| @@ -3542,8 +3544,6 @@ static void valleyview_enable_rps(struct drm_device *dev) | |||
| 3542 | I915_WRITE(GTFIFODBG, gtfifodbg); | 3544 | I915_WRITE(GTFIFODBG, gtfifodbg); |
| 3543 | } | 3545 | } |
| 3544 | 3546 | ||
| 3545 | valleyview_setup_pctx(dev); | ||
| 3546 | |||
| 3547 | /* If VLV, Forcewake all wells, else re-direct to regular path */ | 3547 | /* If VLV, Forcewake all wells, else re-direct to regular path */ |
| 3548 | gen6_gt_force_wake_get(dev_priv, FORCEWAKE_ALL); | 3548 | gen6_gt_force_wake_get(dev_priv, FORCEWAKE_ALL); |
| 3549 | 3549 | ||
| @@ -4395,6 +4395,8 @@ void intel_enable_gt_powersave(struct drm_device *dev) | |||
| 4395 | ironlake_enable_rc6(dev); | 4395 | ironlake_enable_rc6(dev); |
| 4396 | intel_init_emon(dev); | 4396 | intel_init_emon(dev); |
| 4397 | } else if (IS_GEN6(dev) || IS_GEN7(dev)) { | 4397 | } else if (IS_GEN6(dev) || IS_GEN7(dev)) { |
| 4398 | if (IS_VALLEYVIEW(dev)) | ||
| 4399 | valleyview_setup_pctx(dev); | ||
| 4398 | /* | 4400 | /* |
| 4399 | * PCU communication is slow and this doesn't need to be | 4401 | * PCU communication is slow and this doesn't need to be |
| 4400 | * done at any specific time, so do this out of our fast path | 4402 | * done at any specific time, so do this out of our fast path |
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c index 0d19f4f94d5a..daa4dd375ab1 100644 --- a/drivers/gpu/drm/radeon/atombios_crtc.c +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | |||
| @@ -1774,6 +1774,20 @@ static int radeon_atom_pick_pll(struct drm_crtc *crtc) | |||
| 1774 | return ATOM_PPLL1; | 1774 | return ATOM_PPLL1; |
| 1775 | DRM_ERROR("unable to allocate a PPLL\n"); | 1775 | DRM_ERROR("unable to allocate a PPLL\n"); |
| 1776 | return ATOM_PPLL_INVALID; | 1776 | return ATOM_PPLL_INVALID; |
| 1777 | } else if (ASIC_IS_DCE41(rdev)) { | ||
| 1778 | /* Don't share PLLs on DCE4.1 chips */ | ||
| 1779 | if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(radeon_crtc->encoder))) { | ||
| 1780 | if (rdev->clock.dp_extclk) | ||
| 1781 | /* skip PPLL programming if using ext clock */ | ||
| 1782 | return ATOM_PPLL_INVALID; | ||
| 1783 | } | ||
| 1784 | pll_in_use = radeon_get_pll_use_mask(crtc); | ||
| 1785 | if (!(pll_in_use & (1 << ATOM_PPLL1))) | ||
| 1786 | return ATOM_PPLL1; | ||
| 1787 | if (!(pll_in_use & (1 << ATOM_PPLL2))) | ||
| 1788 | return ATOM_PPLL2; | ||
| 1789 | DRM_ERROR("unable to allocate a PPLL\n"); | ||
| 1790 | return ATOM_PPLL_INVALID; | ||
| 1777 | } else if (ASIC_IS_DCE4(rdev)) { | 1791 | } else if (ASIC_IS_DCE4(rdev)) { |
| 1778 | /* in DP mode, the DP ref clock can come from PPLL, DCPLL, or ext clock, | 1792 | /* in DP mode, the DP ref clock can come from PPLL, DCPLL, or ext clock, |
| 1779 | * depending on the asic: | 1793 | * depending on the asic: |
| @@ -1801,7 +1815,7 @@ static int radeon_atom_pick_pll(struct drm_crtc *crtc) | |||
| 1801 | if (pll != ATOM_PPLL_INVALID) | 1815 | if (pll != ATOM_PPLL_INVALID) |
| 1802 | return pll; | 1816 | return pll; |
| 1803 | } | 1817 | } |
| 1804 | } else if (!ASIC_IS_DCE41(rdev)) { /* Don't share PLLs on DCE4.1 chips */ | 1818 | } else { |
| 1805 | /* use the same PPLL for all monitors with the same clock */ | 1819 | /* use the same PPLL for all monitors with the same clock */ |
| 1806 | pll = radeon_get_shared_nondp_ppll(crtc); | 1820 | pll = radeon_get_shared_nondp_ppll(crtc); |
| 1807 | if (pll != ATOM_PPLL_INVALID) | 1821 | if (pll != ATOM_PPLL_INVALID) |
diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c index 2cec2ab02f80..607dc14d195e 100644 --- a/drivers/gpu/drm/radeon/atombios_encoders.c +++ b/drivers/gpu/drm/radeon/atombios_encoders.c | |||
| @@ -1314,7 +1314,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t | |||
| 1314 | } | 1314 | } |
| 1315 | if (is_dp) | 1315 | if (is_dp) |
| 1316 | args.v5.ucLaneNum = dp_lane_count; | 1316 | args.v5.ucLaneNum = dp_lane_count; |
| 1317 | else if (radeon_encoder->pixel_clock > 165000) | 1317 | else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) |
| 1318 | args.v5.ucLaneNum = 8; | 1318 | args.v5.ucLaneNum = 8; |
| 1319 | else | 1319 | else |
| 1320 | args.v5.ucLaneNum = 4; | 1320 | args.v5.ucLaneNum = 4; |
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c index e6419ca7cd37..e22be8458d92 100644 --- a/drivers/gpu/drm/radeon/cik.c +++ b/drivers/gpu/drm/radeon/cik.c | |||
| @@ -3046,7 +3046,7 @@ static u32 cik_create_bitmask(u32 bit_width) | |||
| 3046 | } | 3046 | } |
| 3047 | 3047 | ||
| 3048 | /** | 3048 | /** |
| 3049 | * cik_select_se_sh - select which SE, SH to address | 3049 | * cik_get_rb_disabled - computes the mask of disabled RBs |
| 3050 | * | 3050 | * |
| 3051 | * @rdev: radeon_device pointer | 3051 | * @rdev: radeon_device pointer |
| 3052 | * @max_rb_num: max RBs (render backends) for the asic | 3052 | * @max_rb_num: max RBs (render backends) for the asic |
| @@ -7902,7 +7902,8 @@ int cik_resume(struct radeon_device *rdev) | |||
| 7902 | /* init golden registers */ | 7902 | /* init golden registers */ |
| 7903 | cik_init_golden_registers(rdev); | 7903 | cik_init_golden_registers(rdev); |
| 7904 | 7904 | ||
| 7905 | radeon_pm_resume(rdev); | 7905 | if (rdev->pm.pm_method == PM_METHOD_DPM) |
| 7906 | radeon_pm_resume(rdev); | ||
| 7906 | 7907 | ||
| 7907 | rdev->accel_working = true; | 7908 | rdev->accel_working = true; |
| 7908 | r = cik_startup(rdev); | 7909 | r = cik_startup(rdev); |
diff --git a/drivers/gpu/drm/radeon/dce6_afmt.c b/drivers/gpu/drm/radeon/dce6_afmt.c index 713a5d359901..94e858751994 100644 --- a/drivers/gpu/drm/radeon/dce6_afmt.c +++ b/drivers/gpu/drm/radeon/dce6_afmt.c | |||
| @@ -278,13 +278,15 @@ static int dce6_audio_chipset_supported(struct radeon_device *rdev) | |||
| 278 | return !ASIC_IS_NODCE(rdev); | 278 | return !ASIC_IS_NODCE(rdev); |
| 279 | } | 279 | } |
| 280 | 280 | ||
| 281 | static void dce6_audio_enable(struct radeon_device *rdev, | 281 | void dce6_audio_enable(struct radeon_device *rdev, |
| 282 | struct r600_audio_pin *pin, | 282 | struct r600_audio_pin *pin, |
| 283 | bool enable) | 283 | bool enable) |
| 284 | { | 284 | { |
| 285 | if (!pin) | ||
| 286 | return; | ||
| 287 | |||
| 285 | WREG32_ENDPOINT(pin->offset, AZ_F0_CODEC_PIN_CONTROL_HOTPLUG_CONTROL, | 288 | WREG32_ENDPOINT(pin->offset, AZ_F0_CODEC_PIN_CONTROL_HOTPLUG_CONTROL, |
| 286 | AUDIO_ENABLED); | 289 | enable ? AUDIO_ENABLED : 0); |
| 287 | DRM_INFO("%s audio %d support\n", enable ? "Enabling" : "Disabling", pin->id); | ||
| 288 | } | 290 | } |
| 289 | 291 | ||
| 290 | static const u32 pin_offsets[7] = | 292 | static const u32 pin_offsets[7] = |
| @@ -323,7 +325,8 @@ int dce6_audio_init(struct radeon_device *rdev) | |||
| 323 | rdev->audio.pin[i].connected = false; | 325 | rdev->audio.pin[i].connected = false; |
| 324 | rdev->audio.pin[i].offset = pin_offsets[i]; | 326 | rdev->audio.pin[i].offset = pin_offsets[i]; |
| 325 | rdev->audio.pin[i].id = i; | 327 | rdev->audio.pin[i].id = i; |
| 326 | dce6_audio_enable(rdev, &rdev->audio.pin[i], true); | 328 | /* disable audio. it will be set up later */ |
| 329 | dce6_audio_enable(rdev, &rdev->audio.pin[i], false); | ||
| 327 | } | 330 | } |
| 328 | 331 | ||
| 329 | return 0; | 332 | return 0; |
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 5623e7542d99..27b0ff16082e 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
| @@ -5299,7 +5299,8 @@ int evergreen_resume(struct radeon_device *rdev) | |||
| 5299 | /* init golden registers */ | 5299 | /* init golden registers */ |
| 5300 | evergreen_init_golden_registers(rdev); | 5300 | evergreen_init_golden_registers(rdev); |
| 5301 | 5301 | ||
| 5302 | radeon_pm_resume(rdev); | 5302 | if (rdev->pm.pm_method == PM_METHOD_DPM) |
| 5303 | radeon_pm_resume(rdev); | ||
| 5303 | 5304 | ||
| 5304 | rdev->accel_working = true; | 5305 | rdev->accel_working = true; |
| 5305 | r = evergreen_startup(rdev); | 5306 | r = evergreen_startup(rdev); |
| @@ -5475,9 +5476,9 @@ void evergreen_fini(struct radeon_device *rdev) | |||
| 5475 | radeon_wb_fini(rdev); | 5476 | radeon_wb_fini(rdev); |
| 5476 | radeon_ib_pool_fini(rdev); | 5477 | radeon_ib_pool_fini(rdev); |
| 5477 | radeon_irq_kms_fini(rdev); | 5478 | radeon_irq_kms_fini(rdev); |
| 5478 | evergreen_pcie_gart_fini(rdev); | ||
| 5479 | uvd_v1_0_fini(rdev); | 5479 | uvd_v1_0_fini(rdev); |
| 5480 | radeon_uvd_fini(rdev); | 5480 | radeon_uvd_fini(rdev); |
| 5481 | evergreen_pcie_gart_fini(rdev); | ||
| 5481 | r600_vram_scratch_fini(rdev); | 5482 | r600_vram_scratch_fini(rdev); |
| 5482 | radeon_gem_fini(rdev); | 5483 | radeon_gem_fini(rdev); |
| 5483 | radeon_fence_driver_fini(rdev); | 5484 | radeon_fence_driver_fini(rdev); |
diff --git a/drivers/gpu/drm/radeon/evergreen_hdmi.c b/drivers/gpu/drm/radeon/evergreen_hdmi.c index 0c6d5cef4cf1..05b0c95813fd 100644 --- a/drivers/gpu/drm/radeon/evergreen_hdmi.c +++ b/drivers/gpu/drm/radeon/evergreen_hdmi.c | |||
| @@ -306,6 +306,15 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode | |||
| 306 | return; | 306 | return; |
| 307 | offset = dig->afmt->offset; | 307 | offset = dig->afmt->offset; |
| 308 | 308 | ||
| 309 | /* disable audio prior to setting up hw */ | ||
| 310 | if (ASIC_IS_DCE6(rdev)) { | ||
| 311 | dig->afmt->pin = dce6_audio_get_pin(rdev); | ||
| 312 | dce6_audio_enable(rdev, dig->afmt->pin, false); | ||
| 313 | } else { | ||
| 314 | dig->afmt->pin = r600_audio_get_pin(rdev); | ||
| 315 | r600_audio_enable(rdev, dig->afmt->pin, false); | ||
| 316 | } | ||
| 317 | |||
| 309 | evergreen_audio_set_dto(encoder, mode->clock); | 318 | evergreen_audio_set_dto(encoder, mode->clock); |
| 310 | 319 | ||
| 311 | WREG32(HDMI_VBI_PACKET_CONTROL + offset, | 320 | WREG32(HDMI_VBI_PACKET_CONTROL + offset, |
| @@ -409,12 +418,16 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode | |||
| 409 | WREG32(AFMT_RAMP_CONTROL1 + offset, 0x007FFFFF); | 418 | WREG32(AFMT_RAMP_CONTROL1 + offset, 0x007FFFFF); |
| 410 | WREG32(AFMT_RAMP_CONTROL2 + offset, 0x00000001); | 419 | WREG32(AFMT_RAMP_CONTROL2 + offset, 0x00000001); |
| 411 | WREG32(AFMT_RAMP_CONTROL3 + offset, 0x00000001); | 420 | WREG32(AFMT_RAMP_CONTROL3 + offset, 0x00000001); |
| 421 | |||
| 422 | /* enable audio after to setting up hw */ | ||
| 423 | if (ASIC_IS_DCE6(rdev)) | ||
| 424 | dce6_audio_enable(rdev, dig->afmt->pin, true); | ||
| 425 | else | ||
| 426 | r600_audio_enable(rdev, dig->afmt->pin, true); | ||
| 412 | } | 427 | } |
| 413 | 428 | ||
| 414 | void evergreen_hdmi_enable(struct drm_encoder *encoder, bool enable) | 429 | void evergreen_hdmi_enable(struct drm_encoder *encoder, bool enable) |
| 415 | { | 430 | { |
| 416 | struct drm_device *dev = encoder->dev; | ||
| 417 | struct radeon_device *rdev = dev->dev_private; | ||
| 418 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 431 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
| 419 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | 432 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
| 420 | 433 | ||
| @@ -427,15 +440,6 @@ void evergreen_hdmi_enable(struct drm_encoder *encoder, bool enable) | |||
| 427 | if (!enable && !dig->afmt->enabled) | 440 | if (!enable && !dig->afmt->enabled) |
| 428 | return; | 441 | return; |
| 429 | 442 | ||
| 430 | if (enable) { | ||
| 431 | if (ASIC_IS_DCE6(rdev)) | ||
| 432 | dig->afmt->pin = dce6_audio_get_pin(rdev); | ||
| 433 | else | ||
| 434 | dig->afmt->pin = r600_audio_get_pin(rdev); | ||
| 435 | } else { | ||
| 436 | dig->afmt->pin = NULL; | ||
| 437 | } | ||
| 438 | |||
| 439 | dig->afmt->enabled = enable; | 443 | dig->afmt->enabled = enable; |
| 440 | 444 | ||
| 441 | DRM_DEBUG("%sabling HDMI interface @ 0x%04X for encoder 0x%x\n", | 445 | DRM_DEBUG("%sabling HDMI interface @ 0x%04X for encoder 0x%x\n", |
diff --git a/drivers/gpu/drm/radeon/evergreen_smc.h b/drivers/gpu/drm/radeon/evergreen_smc.h index 76ada8cfe902..3a03ba37d043 100644 --- a/drivers/gpu/drm/radeon/evergreen_smc.h +++ b/drivers/gpu/drm/radeon/evergreen_smc.h | |||
| @@ -57,7 +57,7 @@ typedef struct SMC_Evergreen_MCRegisters SMC_Evergreen_MCRegisters; | |||
| 57 | 57 | ||
| 58 | #define EVERGREEN_SMC_FIRMWARE_HEADER_LOCATION 0x100 | 58 | #define EVERGREEN_SMC_FIRMWARE_HEADER_LOCATION 0x100 |
| 59 | 59 | ||
| 60 | #define EVERGREEN_SMC_FIRMWARE_HEADER_softRegisters 0x0 | 60 | #define EVERGREEN_SMC_FIRMWARE_HEADER_softRegisters 0x8 |
| 61 | #define EVERGREEN_SMC_FIRMWARE_HEADER_stateTable 0xC | 61 | #define EVERGREEN_SMC_FIRMWARE_HEADER_stateTable 0xC |
| 62 | #define EVERGREEN_SMC_FIRMWARE_HEADER_mcRegisterTable 0x20 | 62 | #define EVERGREEN_SMC_FIRMWARE_HEADER_mcRegisterTable 0x20 |
| 63 | 63 | ||
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c index ea932ac66fc6..bf6300cfd62d 100644 --- a/drivers/gpu/drm/radeon/ni.c +++ b/drivers/gpu/drm/radeon/ni.c | |||
| @@ -2105,7 +2105,8 @@ int cayman_resume(struct radeon_device *rdev) | |||
| 2105 | /* init golden registers */ | 2105 | /* init golden registers */ |
| 2106 | ni_init_golden_registers(rdev); | 2106 | ni_init_golden_registers(rdev); |
| 2107 | 2107 | ||
| 2108 | radeon_pm_resume(rdev); | 2108 | if (rdev->pm.pm_method == PM_METHOD_DPM) |
| 2109 | radeon_pm_resume(rdev); | ||
| 2109 | 2110 | ||
| 2110 | rdev->accel_working = true; | 2111 | rdev->accel_working = true; |
| 2111 | r = cayman_startup(rdev); | 2112 | r = cayman_startup(rdev); |
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index ef024ce3f7cc..3cc78bb66042 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c | |||
| @@ -3942,8 +3942,6 @@ int r100_resume(struct radeon_device *rdev) | |||
| 3942 | /* Initialize surface registers */ | 3942 | /* Initialize surface registers */ |
| 3943 | radeon_surface_init(rdev); | 3943 | radeon_surface_init(rdev); |
| 3944 | 3944 | ||
| 3945 | radeon_pm_resume(rdev); | ||
| 3946 | |||
| 3947 | rdev->accel_working = true; | 3945 | rdev->accel_working = true; |
| 3948 | r = r100_startup(rdev); | 3946 | r = r100_startup(rdev); |
| 3949 | if (r) { | 3947 | if (r) { |
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c index 7c63ef840e86..0b658b34b33a 100644 --- a/drivers/gpu/drm/radeon/r300.c +++ b/drivers/gpu/drm/radeon/r300.c | |||
| @@ -1430,8 +1430,6 @@ int r300_resume(struct radeon_device *rdev) | |||
| 1430 | /* Initialize surface registers */ | 1430 | /* Initialize surface registers */ |
| 1431 | radeon_surface_init(rdev); | 1431 | radeon_surface_init(rdev); |
| 1432 | 1432 | ||
| 1433 | radeon_pm_resume(rdev); | ||
| 1434 | |||
| 1435 | rdev->accel_working = true; | 1433 | rdev->accel_working = true; |
| 1436 | r = r300_startup(rdev); | 1434 | r = r300_startup(rdev); |
| 1437 | if (r) { | 1435 | if (r) { |
diff --git a/drivers/gpu/drm/radeon/r420.c b/drivers/gpu/drm/radeon/r420.c index 3768aab2710b..802b19220a21 100644 --- a/drivers/gpu/drm/radeon/r420.c +++ b/drivers/gpu/drm/radeon/r420.c | |||
| @@ -325,8 +325,6 @@ int r420_resume(struct radeon_device *rdev) | |||
| 325 | /* Initialize surface registers */ | 325 | /* Initialize surface registers */ |
| 326 | radeon_surface_init(rdev); | 326 | radeon_surface_init(rdev); |
| 327 | 327 | ||
| 328 | radeon_pm_resume(rdev); | ||
| 329 | |||
| 330 | rdev->accel_working = true; | 328 | rdev->accel_working = true; |
| 331 | r = r420_startup(rdev); | 329 | r = r420_startup(rdev); |
| 332 | if (r) { | 330 | if (r) { |
diff --git a/drivers/gpu/drm/radeon/r520.c b/drivers/gpu/drm/radeon/r520.c index e209eb75024f..98d6053c36c6 100644 --- a/drivers/gpu/drm/radeon/r520.c +++ b/drivers/gpu/drm/radeon/r520.c | |||
| @@ -240,8 +240,6 @@ int r520_resume(struct radeon_device *rdev) | |||
| 240 | /* Initialize surface registers */ | 240 | /* Initialize surface registers */ |
| 241 | radeon_surface_init(rdev); | 241 | radeon_surface_init(rdev); |
| 242 | 242 | ||
| 243 | radeon_pm_resume(rdev); | ||
| 244 | |||
| 245 | rdev->accel_working = true; | 243 | rdev->accel_working = true; |
| 246 | r = r520_startup(rdev); | 244 | r = r520_startup(rdev); |
| 247 | if (r) { | 245 | if (r) { |
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index cdbc4171fe73..647ef4079217 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
| @@ -2968,7 +2968,8 @@ int r600_resume(struct radeon_device *rdev) | |||
| 2968 | /* post card */ | 2968 | /* post card */ |
| 2969 | atom_asic_init(rdev->mode_info.atom_context); | 2969 | atom_asic_init(rdev->mode_info.atom_context); |
| 2970 | 2970 | ||
| 2971 | radeon_pm_resume(rdev); | 2971 | if (rdev->pm.pm_method == PM_METHOD_DPM) |
| 2972 | radeon_pm_resume(rdev); | ||
| 2972 | 2973 | ||
| 2973 | rdev->accel_working = true; | 2974 | rdev->accel_working = true; |
| 2974 | r = r600_startup(rdev); | 2975 | r = r600_startup(rdev); |
diff --git a/drivers/gpu/drm/radeon/r600_audio.c b/drivers/gpu/drm/radeon/r600_audio.c index 47fc2b886979..bffac10c4296 100644 --- a/drivers/gpu/drm/radeon/r600_audio.c +++ b/drivers/gpu/drm/radeon/r600_audio.c | |||
| @@ -142,12 +142,15 @@ void r600_audio_update_hdmi(struct work_struct *work) | |||
| 142 | } | 142 | } |
| 143 | 143 | ||
| 144 | /* enable the audio stream */ | 144 | /* enable the audio stream */ |
| 145 | static void r600_audio_enable(struct radeon_device *rdev, | 145 | void r600_audio_enable(struct radeon_device *rdev, |
| 146 | struct r600_audio_pin *pin, | 146 | struct r600_audio_pin *pin, |
| 147 | bool enable) | 147 | bool enable) |
| 148 | { | 148 | { |
| 149 | u32 value = 0; | 149 | u32 value = 0; |
| 150 | 150 | ||
| 151 | if (!pin) | ||
| 152 | return; | ||
| 153 | |||
| 151 | if (ASIC_IS_DCE4(rdev)) { | 154 | if (ASIC_IS_DCE4(rdev)) { |
| 152 | if (enable) { | 155 | if (enable) { |
| 153 | value |= 0x81000000; /* Required to enable audio */ | 156 | value |= 0x81000000; /* Required to enable audio */ |
| @@ -158,7 +161,6 @@ static void r600_audio_enable(struct radeon_device *rdev, | |||
| 158 | WREG32_P(R600_AUDIO_ENABLE, | 161 | WREG32_P(R600_AUDIO_ENABLE, |
| 159 | enable ? 0x81000000 : 0x0, ~0x81000000); | 162 | enable ? 0x81000000 : 0x0, ~0x81000000); |
| 160 | } | 163 | } |
| 161 | DRM_INFO("%s audio %d support\n", enable ? "Enabling" : "Disabling", pin->id); | ||
| 162 | } | 164 | } |
| 163 | 165 | ||
| 164 | /* | 166 | /* |
| @@ -178,8 +180,8 @@ int r600_audio_init(struct radeon_device *rdev) | |||
| 178 | rdev->audio.pin[0].status_bits = 0; | 180 | rdev->audio.pin[0].status_bits = 0; |
| 179 | rdev->audio.pin[0].category_code = 0; | 181 | rdev->audio.pin[0].category_code = 0; |
| 180 | rdev->audio.pin[0].id = 0; | 182 | rdev->audio.pin[0].id = 0; |
| 181 | 183 | /* disable audio. it will be set up later */ | |
| 182 | r600_audio_enable(rdev, &rdev->audio.pin[0], true); | 184 | r600_audio_enable(rdev, &rdev->audio.pin[0], false); |
| 183 | 185 | ||
| 184 | return 0; | 186 | return 0; |
| 185 | } | 187 | } |
diff --git a/drivers/gpu/drm/radeon/r600_hdmi.c b/drivers/gpu/drm/radeon/r600_hdmi.c index 3016fc14f502..85a2bb28aed2 100644 --- a/drivers/gpu/drm/radeon/r600_hdmi.c +++ b/drivers/gpu/drm/radeon/r600_hdmi.c | |||
| @@ -329,9 +329,6 @@ static void dce3_2_afmt_write_speaker_allocation(struct drm_encoder *encoder) | |||
| 329 | u8 *sadb; | 329 | u8 *sadb; |
| 330 | int sad_count; | 330 | int sad_count; |
| 331 | 331 | ||
| 332 | /* XXX: setting this register causes hangs on some asics */ | ||
| 333 | return; | ||
| 334 | |||
| 335 | list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) { | 332 | list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) { |
| 336 | if (connector->encoder == encoder) { | 333 | if (connector->encoder == encoder) { |
| 337 | radeon_connector = to_radeon_connector(connector); | 334 | radeon_connector = to_radeon_connector(connector); |
| @@ -460,6 +457,10 @@ void r600_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mod | |||
| 460 | return; | 457 | return; |
| 461 | offset = dig->afmt->offset; | 458 | offset = dig->afmt->offset; |
| 462 | 459 | ||
| 460 | /* disable audio prior to setting up hw */ | ||
| 461 | dig->afmt->pin = r600_audio_get_pin(rdev); | ||
| 462 | r600_audio_enable(rdev, dig->afmt->pin, false); | ||
| 463 | |||
| 463 | r600_audio_set_dto(encoder, mode->clock); | 464 | r600_audio_set_dto(encoder, mode->clock); |
| 464 | 465 | ||
| 465 | WREG32(HDMI0_VBI_PACKET_CONTROL + offset, | 466 | WREG32(HDMI0_VBI_PACKET_CONTROL + offset, |
| @@ -531,6 +532,9 @@ void r600_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mod | |||
| 531 | WREG32(HDMI0_RAMP_CONTROL3 + offset, 0x00000001); | 532 | WREG32(HDMI0_RAMP_CONTROL3 + offset, 0x00000001); |
| 532 | 533 | ||
| 533 | r600_hdmi_audio_workaround(encoder); | 534 | r600_hdmi_audio_workaround(encoder); |
| 535 | |||
| 536 | /* enable audio after to setting up hw */ | ||
| 537 | r600_audio_enable(rdev, dig->afmt->pin, true); | ||
| 534 | } | 538 | } |
| 535 | 539 | ||
| 536 | /* | 540 | /* |
| @@ -651,11 +655,6 @@ void r600_hdmi_enable(struct drm_encoder *encoder, bool enable) | |||
| 651 | if (!enable && !dig->afmt->enabled) | 655 | if (!enable && !dig->afmt->enabled) |
| 652 | return; | 656 | return; |
| 653 | 657 | ||
| 654 | if (enable) | ||
| 655 | dig->afmt->pin = r600_audio_get_pin(rdev); | ||
| 656 | else | ||
| 657 | dig->afmt->pin = NULL; | ||
| 658 | |||
| 659 | /* Older chipsets require setting HDMI and routing manually */ | 658 | /* Older chipsets require setting HDMI and routing manually */ |
| 660 | if (!ASIC_IS_DCE3(rdev)) { | 659 | if (!ASIC_IS_DCE3(rdev)) { |
| 661 | if (enable) | 660 | if (enable) |
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 024db37b1832..e887d027b6d0 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
| @@ -2747,6 +2747,12 @@ int radeon_vm_bo_rmv(struct radeon_device *rdev, | |||
| 2747 | void r600_audio_update_hdmi(struct work_struct *work); | 2747 | void r600_audio_update_hdmi(struct work_struct *work); |
| 2748 | struct r600_audio_pin *r600_audio_get_pin(struct radeon_device *rdev); | 2748 | struct r600_audio_pin *r600_audio_get_pin(struct radeon_device *rdev); |
| 2749 | struct r600_audio_pin *dce6_audio_get_pin(struct radeon_device *rdev); | 2749 | struct r600_audio_pin *dce6_audio_get_pin(struct radeon_device *rdev); |
| 2750 | void r600_audio_enable(struct radeon_device *rdev, | ||
| 2751 | struct r600_audio_pin *pin, | ||
| 2752 | bool enable); | ||
| 2753 | void dce6_audio_enable(struct radeon_device *rdev, | ||
| 2754 | struct r600_audio_pin *pin, | ||
| 2755 | bool enable); | ||
| 2750 | 2756 | ||
| 2751 | /* | 2757 | /* |
| 2752 | * R600 vram scratch functions | 2758 | * R600 vram scratch functions |
diff --git a/drivers/gpu/drm/radeon/radeon_atpx_handler.c b/drivers/gpu/drm/radeon/radeon_atpx_handler.c index 485848f889f5..fa9a9c02751e 100644 --- a/drivers/gpu/drm/radeon/radeon_atpx_handler.c +++ b/drivers/gpu/drm/radeon/radeon_atpx_handler.c | |||
| @@ -219,7 +219,8 @@ static int radeon_atpx_verify_interface(struct radeon_atpx *atpx) | |||
| 219 | memcpy(&output, info->buffer.pointer, size); | 219 | memcpy(&output, info->buffer.pointer, size); |
| 220 | 220 | ||
| 221 | /* TODO: check version? */ | 221 | /* TODO: check version? */ |
| 222 | printk("ATPX version %u\n", output.version); | 222 | printk("ATPX version %u, functions 0x%08x\n", |
| 223 | output.version, output.function_bits); | ||
| 223 | 224 | ||
| 224 | radeon_atpx_parse_functions(&atpx->functions, output.function_bits); | 225 | radeon_atpx_parse_functions(&atpx->functions, output.function_bits); |
| 225 | 226 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index b012cbbc3ed5..044bc98fb459 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
| @@ -1521,13 +1521,16 @@ int radeon_resume_kms(struct drm_device *dev, bool resume, bool fbcon) | |||
| 1521 | if (r) | 1521 | if (r) |
| 1522 | DRM_ERROR("ib ring test failed (%d).\n", r); | 1522 | DRM_ERROR("ib ring test failed (%d).\n", r); |
| 1523 | 1523 | ||
| 1524 | if (rdev->pm.dpm_enabled) { | 1524 | if ((rdev->pm.pm_method == PM_METHOD_DPM) && rdev->pm.dpm_enabled) { |
| 1525 | /* do dpm late init */ | 1525 | /* do dpm late init */ |
| 1526 | r = radeon_pm_late_init(rdev); | 1526 | r = radeon_pm_late_init(rdev); |
| 1527 | if (r) { | 1527 | if (r) { |
| 1528 | rdev->pm.dpm_enabled = false; | 1528 | rdev->pm.dpm_enabled = false; |
| 1529 | DRM_ERROR("radeon_pm_late_init failed, disabling dpm\n"); | 1529 | DRM_ERROR("radeon_pm_late_init failed, disabling dpm\n"); |
| 1530 | } | 1530 | } |
| 1531 | } else { | ||
| 1532 | /* resume old pm late */ | ||
| 1533 | radeon_pm_resume(rdev); | ||
| 1531 | } | 1534 | } |
| 1532 | 1535 | ||
| 1533 | radeon_restore_bios_scratch_regs(rdev); | 1536 | radeon_restore_bios_scratch_regs(rdev); |
diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c index 114d1672d616..2aecd6dc2610 100644 --- a/drivers/gpu/drm/radeon/radeon_kms.c +++ b/drivers/gpu/drm/radeon/radeon_kms.c | |||
| @@ -537,6 +537,10 @@ int radeon_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv) | |||
| 537 | 537 | ||
| 538 | radeon_vm_init(rdev, &fpriv->vm); | 538 | radeon_vm_init(rdev, &fpriv->vm); |
| 539 | 539 | ||
| 540 | r = radeon_bo_reserve(rdev->ring_tmp_bo.bo, false); | ||
| 541 | if (r) | ||
| 542 | return r; | ||
| 543 | |||
| 540 | /* map the ib pool buffer read only into | 544 | /* map the ib pool buffer read only into |
| 541 | * virtual address space */ | 545 | * virtual address space */ |
| 542 | bo_va = radeon_vm_bo_add(rdev, &fpriv->vm, | 546 | bo_va = radeon_vm_bo_add(rdev, &fpriv->vm, |
| @@ -544,6 +548,8 @@ int radeon_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv) | |||
| 544 | r = radeon_vm_bo_set_addr(rdev, bo_va, RADEON_VA_IB_OFFSET, | 548 | r = radeon_vm_bo_set_addr(rdev, bo_va, RADEON_VA_IB_OFFSET, |
| 545 | RADEON_VM_PAGE_READABLE | | 549 | RADEON_VM_PAGE_READABLE | |
| 546 | RADEON_VM_PAGE_SNOOPED); | 550 | RADEON_VM_PAGE_SNOOPED); |
| 551 | |||
| 552 | radeon_bo_unreserve(rdev->ring_tmp_bo.bo); | ||
| 547 | if (r) { | 553 | if (r) { |
| 548 | radeon_vm_fini(rdev, &fpriv->vm); | 554 | radeon_vm_fini(rdev, &fpriv->vm); |
| 549 | kfree(fpriv); | 555 | kfree(fpriv); |
diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c index 77f5b0c3edb8..040a2a10ea17 100644 --- a/drivers/gpu/drm/radeon/radeon_ttm.c +++ b/drivers/gpu/drm/radeon/radeon_ttm.c | |||
| @@ -714,6 +714,9 @@ int radeon_ttm_init(struct radeon_device *rdev) | |||
| 714 | DRM_ERROR("Failed initializing VRAM heap.\n"); | 714 | DRM_ERROR("Failed initializing VRAM heap.\n"); |
| 715 | return r; | 715 | return r; |
| 716 | } | 716 | } |
| 717 | /* Change the size here instead of the init above so only lpfn is affected */ | ||
| 718 | radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size); | ||
| 719 | |||
| 717 | r = radeon_bo_create(rdev, 256 * 1024, PAGE_SIZE, true, | 720 | r = radeon_bo_create(rdev, 256 * 1024, PAGE_SIZE, true, |
| 718 | RADEON_GEM_DOMAIN_VRAM, | 721 | RADEON_GEM_DOMAIN_VRAM, |
| 719 | NULL, &rdev->stollen_vga_memory); | 722 | NULL, &rdev->stollen_vga_memory); |
| @@ -935,7 +938,7 @@ static ssize_t radeon_ttm_gtt_read(struct file *f, char __user *buf, | |||
| 935 | while (size) { | 938 | while (size) { |
| 936 | loff_t p = *pos / PAGE_SIZE; | 939 | loff_t p = *pos / PAGE_SIZE; |
| 937 | unsigned off = *pos & ~PAGE_MASK; | 940 | unsigned off = *pos & ~PAGE_MASK; |
| 938 | ssize_t cur_size = min(size, PAGE_SIZE - off); | 941 | size_t cur_size = min_t(size_t, size, PAGE_SIZE - off); |
| 939 | struct page *page; | 942 | struct page *page; |
| 940 | void *ptr; | 943 | void *ptr; |
| 941 | 944 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_uvd.c b/drivers/gpu/drm/radeon/radeon_uvd.c index 6781fee1eaad..3e6804b2b2ef 100644 --- a/drivers/gpu/drm/radeon/radeon_uvd.c +++ b/drivers/gpu/drm/radeon/radeon_uvd.c | |||
| @@ -171,6 +171,8 @@ void radeon_uvd_fini(struct radeon_device *rdev) | |||
| 171 | 171 | ||
| 172 | radeon_bo_unref(&rdev->uvd.vcpu_bo); | 172 | radeon_bo_unref(&rdev->uvd.vcpu_bo); |
| 173 | 173 | ||
| 174 | radeon_ring_fini(rdev, &rdev->ring[R600_RING_TYPE_UVD_INDEX]); | ||
| 175 | |||
| 174 | release_firmware(rdev->uvd_fw); | 176 | release_firmware(rdev->uvd_fw); |
| 175 | } | 177 | } |
| 176 | 178 | ||
diff --git a/drivers/gpu/drm/radeon/rs400.c b/drivers/gpu/drm/radeon/rs400.c index b5c2369cda2f..130d5cc50d43 100644 --- a/drivers/gpu/drm/radeon/rs400.c +++ b/drivers/gpu/drm/radeon/rs400.c | |||
| @@ -474,8 +474,6 @@ int rs400_resume(struct radeon_device *rdev) | |||
| 474 | /* Initialize surface registers */ | 474 | /* Initialize surface registers */ |
| 475 | radeon_surface_init(rdev); | 475 | radeon_surface_init(rdev); |
| 476 | 476 | ||
| 477 | radeon_pm_resume(rdev); | ||
| 478 | |||
| 479 | rdev->accel_working = true; | 477 | rdev->accel_working = true; |
| 480 | r = rs400_startup(rdev); | 478 | r = rs400_startup(rdev); |
| 481 | if (r) { | 479 | if (r) { |
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c index fdcde7693032..72d3616de08e 100644 --- a/drivers/gpu/drm/radeon/rs600.c +++ b/drivers/gpu/drm/radeon/rs600.c | |||
| @@ -1048,8 +1048,6 @@ int rs600_resume(struct radeon_device *rdev) | |||
| 1048 | /* Initialize surface registers */ | 1048 | /* Initialize surface registers */ |
| 1049 | radeon_surface_init(rdev); | 1049 | radeon_surface_init(rdev); |
| 1050 | 1050 | ||
| 1051 | radeon_pm_resume(rdev); | ||
| 1052 | |||
| 1053 | rdev->accel_working = true; | 1051 | rdev->accel_working = true; |
| 1054 | r = rs600_startup(rdev); | 1052 | r = rs600_startup(rdev); |
| 1055 | if (r) { | 1053 | if (r) { |
diff --git a/drivers/gpu/drm/radeon/rs690.c b/drivers/gpu/drm/radeon/rs690.c index 35950738bd5e..3462b64369bf 100644 --- a/drivers/gpu/drm/radeon/rs690.c +++ b/drivers/gpu/drm/radeon/rs690.c | |||
| @@ -756,8 +756,6 @@ int rs690_resume(struct radeon_device *rdev) | |||
| 756 | /* Initialize surface registers */ | 756 | /* Initialize surface registers */ |
| 757 | radeon_surface_init(rdev); | 757 | radeon_surface_init(rdev); |
| 758 | 758 | ||
| 759 | radeon_pm_resume(rdev); | ||
| 760 | |||
| 761 | rdev->accel_working = true; | 759 | rdev->accel_working = true; |
| 762 | r = rs690_startup(rdev); | 760 | r = rs690_startup(rdev); |
| 763 | if (r) { | 761 | if (r) { |
diff --git a/drivers/gpu/drm/radeon/rv515.c b/drivers/gpu/drm/radeon/rv515.c index 98e8138ff779..237dd29d9f1c 100644 --- a/drivers/gpu/drm/radeon/rv515.c +++ b/drivers/gpu/drm/radeon/rv515.c | |||
| @@ -586,8 +586,6 @@ int rv515_resume(struct radeon_device *rdev) | |||
| 586 | /* Initialize surface registers */ | 586 | /* Initialize surface registers */ |
| 587 | radeon_surface_init(rdev); | 587 | radeon_surface_init(rdev); |
| 588 | 588 | ||
| 589 | radeon_pm_resume(rdev); | ||
| 590 | |||
| 591 | rdev->accel_working = true; | 589 | rdev->accel_working = true; |
| 592 | r = rv515_startup(rdev); | 590 | r = rv515_startup(rdev); |
| 593 | if (r) { | 591 | if (r) { |
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c index 6c772e58c784..fef310773aad 100644 --- a/drivers/gpu/drm/radeon/rv770.c +++ b/drivers/gpu/drm/radeon/rv770.c | |||
| @@ -1811,7 +1811,8 @@ int rv770_resume(struct radeon_device *rdev) | |||
| 1811 | /* init golden registers */ | 1811 | /* init golden registers */ |
| 1812 | rv770_init_golden_registers(rdev); | 1812 | rv770_init_golden_registers(rdev); |
| 1813 | 1813 | ||
| 1814 | radeon_pm_resume(rdev); | 1814 | if (rdev->pm.pm_method == PM_METHOD_DPM) |
| 1815 | radeon_pm_resume(rdev); | ||
| 1815 | 1816 | ||
| 1816 | rdev->accel_working = true; | 1817 | rdev->accel_working = true; |
| 1817 | r = rv770_startup(rdev); | 1818 | r = rv770_startup(rdev); |
| @@ -1955,9 +1956,9 @@ void rv770_fini(struct radeon_device *rdev) | |||
| 1955 | radeon_wb_fini(rdev); | 1956 | radeon_wb_fini(rdev); |
| 1956 | radeon_ib_pool_fini(rdev); | 1957 | radeon_ib_pool_fini(rdev); |
| 1957 | radeon_irq_kms_fini(rdev); | 1958 | radeon_irq_kms_fini(rdev); |
| 1958 | rv770_pcie_gart_fini(rdev); | ||
| 1959 | uvd_v1_0_fini(rdev); | 1959 | uvd_v1_0_fini(rdev); |
| 1960 | radeon_uvd_fini(rdev); | 1960 | radeon_uvd_fini(rdev); |
| 1961 | rv770_pcie_gart_fini(rdev); | ||
| 1961 | r600_vram_scratch_fini(rdev); | 1962 | r600_vram_scratch_fini(rdev); |
| 1962 | radeon_gem_fini(rdev); | 1963 | radeon_gem_fini(rdev); |
| 1963 | radeon_fence_driver_fini(rdev); | 1964 | radeon_fence_driver_fini(rdev); |
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c index 83578324e5d1..9a124d0608b3 100644 --- a/drivers/gpu/drm/radeon/si.c +++ b/drivers/gpu/drm/radeon/si.c | |||
| @@ -6618,7 +6618,8 @@ int si_resume(struct radeon_device *rdev) | |||
| 6618 | /* init golden registers */ | 6618 | /* init golden registers */ |
| 6619 | si_init_golden_registers(rdev); | 6619 | si_init_golden_registers(rdev); |
| 6620 | 6620 | ||
| 6621 | radeon_pm_resume(rdev); | 6621 | if (rdev->pm.pm_method == PM_METHOD_DPM) |
| 6622 | radeon_pm_resume(rdev); | ||
| 6622 | 6623 | ||
| 6623 | rdev->accel_working = true; | 6624 | rdev->accel_working = true; |
| 6624 | r = si_startup(rdev); | 6625 | r = si_startup(rdev); |
diff --git a/drivers/gpu/drm/tegra/drm.c b/drivers/gpu/drm/tegra/drm.c index 88a529008ce0..c71594754f46 100644 --- a/drivers/gpu/drm/tegra/drm.c +++ b/drivers/gpu/drm/tegra/drm.c | |||
| @@ -104,7 +104,7 @@ static void tegra_drm_context_free(struct tegra_drm_context *context) | |||
| 104 | 104 | ||
| 105 | static void tegra_drm_lastclose(struct drm_device *drm) | 105 | static void tegra_drm_lastclose(struct drm_device *drm) |
| 106 | { | 106 | { |
| 107 | #ifdef CONFIG_TEGRA_DRM_FBDEV | 107 | #ifdef CONFIG_DRM_TEGRA_FBDEV |
| 108 | struct tegra_drm *tegra = drm->dev_private; | 108 | struct tegra_drm *tegra = drm->dev_private; |
| 109 | 109 | ||
| 110 | tegra_fbdev_restore_mode(tegra->fbdev); | 110 | tegra_fbdev_restore_mode(tegra->fbdev); |
diff --git a/drivers/gpu/drm/tegra/rgb.c b/drivers/gpu/drm/tegra/rgb.c index 338f7f6561d7..0266fb40479e 100644 --- a/drivers/gpu/drm/tegra/rgb.c +++ b/drivers/gpu/drm/tegra/rgb.c | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | struct tegra_rgb { | 15 | struct tegra_rgb { |
| 16 | struct tegra_output output; | 16 | struct tegra_output output; |
| 17 | struct tegra_dc *dc; | 17 | struct tegra_dc *dc; |
| 18 | bool enabled; | ||
| 18 | 19 | ||
| 19 | struct clk *clk_parent; | 20 | struct clk *clk_parent; |
| 20 | struct clk *clk; | 21 | struct clk *clk; |
| @@ -89,6 +90,9 @@ static int tegra_output_rgb_enable(struct tegra_output *output) | |||
| 89 | struct tegra_rgb *rgb = to_rgb(output); | 90 | struct tegra_rgb *rgb = to_rgb(output); |
| 90 | unsigned long value; | 91 | unsigned long value; |
| 91 | 92 | ||
| 93 | if (rgb->enabled) | ||
| 94 | return 0; | ||
| 95 | |||
| 92 | tegra_dc_write_regs(rgb->dc, rgb_enable, ARRAY_SIZE(rgb_enable)); | 96 | tegra_dc_write_regs(rgb->dc, rgb_enable, ARRAY_SIZE(rgb_enable)); |
| 93 | 97 | ||
| 94 | value = DE_SELECT_ACTIVE | DE_CONTROL_NORMAL; | 98 | value = DE_SELECT_ACTIVE | DE_CONTROL_NORMAL; |
| @@ -122,6 +126,8 @@ static int tegra_output_rgb_enable(struct tegra_output *output) | |||
| 122 | tegra_dc_writel(rgb->dc, GENERAL_ACT_REQ << 8, DC_CMD_STATE_CONTROL); | 126 | tegra_dc_writel(rgb->dc, GENERAL_ACT_REQ << 8, DC_CMD_STATE_CONTROL); |
| 123 | tegra_dc_writel(rgb->dc, GENERAL_ACT_REQ, DC_CMD_STATE_CONTROL); | 127 | tegra_dc_writel(rgb->dc, GENERAL_ACT_REQ, DC_CMD_STATE_CONTROL); |
| 124 | 128 | ||
| 129 | rgb->enabled = true; | ||
| 130 | |||
| 125 | return 0; | 131 | return 0; |
| 126 | } | 132 | } |
| 127 | 133 | ||
| @@ -130,6 +136,9 @@ static int tegra_output_rgb_disable(struct tegra_output *output) | |||
| 130 | struct tegra_rgb *rgb = to_rgb(output); | 136 | struct tegra_rgb *rgb = to_rgb(output); |
| 131 | unsigned long value; | 137 | unsigned long value; |
| 132 | 138 | ||
| 139 | if (!rgb->enabled) | ||
| 140 | return 0; | ||
| 141 | |||
| 133 | value = tegra_dc_readl(rgb->dc, DC_CMD_DISPLAY_POWER_CONTROL); | 142 | value = tegra_dc_readl(rgb->dc, DC_CMD_DISPLAY_POWER_CONTROL); |
| 134 | value &= ~(PW0_ENABLE | PW1_ENABLE | PW2_ENABLE | PW3_ENABLE | | 143 | value &= ~(PW0_ENABLE | PW1_ENABLE | PW2_ENABLE | PW3_ENABLE | |
| 135 | PW4_ENABLE | PM0_ENABLE | PM1_ENABLE); | 144 | PW4_ENABLE | PM0_ENABLE | PM1_ENABLE); |
| @@ -144,6 +153,8 @@ static int tegra_output_rgb_disable(struct tegra_output *output) | |||
| 144 | 153 | ||
| 145 | tegra_dc_write_regs(rgb->dc, rgb_disable, ARRAY_SIZE(rgb_disable)); | 154 | tegra_dc_write_regs(rgb->dc, rgb_disable, ARRAY_SIZE(rgb_disable)); |
| 146 | 155 | ||
| 156 | rgb->enabled = false; | ||
| 157 | |||
| 147 | return 0; | 158 | return 0; |
| 148 | } | 159 | } |
| 149 | 160 | ||
diff --git a/drivers/gpu/drm/vmwgfx/svga3d_reg.h b/drivers/gpu/drm/vmwgfx/svga3d_reg.h index bb594c11605e..f58dc7dd15c5 100644 --- a/drivers/gpu/drm/vmwgfx/svga3d_reg.h +++ b/drivers/gpu/drm/vmwgfx/svga3d_reg.h | |||
| @@ -261,12 +261,7 @@ typedef enum SVGA3dSurfaceFormat { | |||
| 261 | /* Planar video formats. */ | 261 | /* Planar video formats. */ |
| 262 | SVGA3D_YV12 = 121, | 262 | SVGA3D_YV12 = 121, |
| 263 | 263 | ||
| 264 | /* Shader constant formats. */ | 264 | SVGA3D_FORMAT_MAX = 122, |
| 265 | SVGA3D_SURFACE_SHADERCONST_FLOAT = 122, | ||
| 266 | SVGA3D_SURFACE_SHADERCONST_INT = 123, | ||
| 267 | SVGA3D_SURFACE_SHADERCONST_BOOL = 124, | ||
| 268 | |||
| 269 | SVGA3D_FORMAT_MAX = 125, | ||
| 270 | } SVGA3dSurfaceFormat; | 265 | } SVGA3dSurfaceFormat; |
| 271 | 266 | ||
| 272 | typedef uint32 SVGA3dColor; /* a, r, g, b */ | 267 | typedef uint32 SVGA3dColor; /* a, r, g, b */ |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h index 9e4be1725985..07831554dad7 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | |||
| @@ -40,7 +40,7 @@ | |||
| 40 | #include <drm/ttm/ttm_module.h> | 40 | #include <drm/ttm/ttm_module.h> |
| 41 | #include "vmwgfx_fence.h" | 41 | #include "vmwgfx_fence.h" |
| 42 | 42 | ||
| 43 | #define VMWGFX_DRIVER_DATE "20121114" | 43 | #define VMWGFX_DRIVER_DATE "20140228" |
| 44 | #define VMWGFX_DRIVER_MAJOR 2 | 44 | #define VMWGFX_DRIVER_MAJOR 2 |
| 45 | #define VMWGFX_DRIVER_MINOR 5 | 45 | #define VMWGFX_DRIVER_MINOR 5 |
| 46 | #define VMWGFX_DRIVER_PATCHLEVEL 0 | 46 | #define VMWGFX_DRIVER_PATCHLEVEL 0 |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_mob.c b/drivers/gpu/drm/vmwgfx/vmwgfx_mob.c index d4a5a19cb8c3..04a64b8cd3cd 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_mob.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_mob.c | |||
| @@ -188,18 +188,20 @@ static void vmw_takedown_otable_base(struct vmw_private *dev_priv, | |||
| 188 | 188 | ||
| 189 | bo = otable->page_table->pt_bo; | 189 | bo = otable->page_table->pt_bo; |
| 190 | cmd = vmw_fifo_reserve(dev_priv, sizeof(*cmd)); | 190 | cmd = vmw_fifo_reserve(dev_priv, sizeof(*cmd)); |
| 191 | if (unlikely(cmd == NULL)) | 191 | if (unlikely(cmd == NULL)) { |
| 192 | DRM_ERROR("Failed reserving FIFO space for OTable setup.\n"); | 192 | DRM_ERROR("Failed reserving FIFO space for OTable " |
| 193 | 193 | "takedown.\n"); | |
| 194 | memset(cmd, 0, sizeof(*cmd)); | 194 | } else { |
| 195 | cmd->header.id = SVGA_3D_CMD_SET_OTABLE_BASE; | 195 | memset(cmd, 0, sizeof(*cmd)); |
| 196 | cmd->header.size = sizeof(cmd->body); | 196 | cmd->header.id = SVGA_3D_CMD_SET_OTABLE_BASE; |
| 197 | cmd->body.type = type; | 197 | cmd->header.size = sizeof(cmd->body); |
| 198 | cmd->body.baseAddress = 0; | 198 | cmd->body.type = type; |
| 199 | cmd->body.sizeInBytes = 0; | 199 | cmd->body.baseAddress = 0; |
| 200 | cmd->body.validSizeInBytes = 0; | 200 | cmd->body.sizeInBytes = 0; |
| 201 | cmd->body.ptDepth = SVGA3D_MOBFMT_INVALID; | 201 | cmd->body.validSizeInBytes = 0; |
| 202 | vmw_fifo_commit(dev_priv, sizeof(*cmd)); | 202 | cmd->body.ptDepth = SVGA3D_MOBFMT_INVALID; |
| 203 | vmw_fifo_commit(dev_priv, sizeof(*cmd)); | ||
| 204 | } | ||
| 203 | 205 | ||
| 204 | if (bo) { | 206 | if (bo) { |
| 205 | int ret; | 207 | int ret; |
| @@ -562,11 +564,12 @@ void vmw_mob_unbind(struct vmw_private *dev_priv, | |||
| 562 | if (unlikely(cmd == NULL)) { | 564 | if (unlikely(cmd == NULL)) { |
| 563 | DRM_ERROR("Failed reserving FIFO space for Memory " | 565 | DRM_ERROR("Failed reserving FIFO space for Memory " |
| 564 | "Object unbinding.\n"); | 566 | "Object unbinding.\n"); |
| 567 | } else { | ||
| 568 | cmd->header.id = SVGA_3D_CMD_DESTROY_GB_MOB; | ||
| 569 | cmd->header.size = sizeof(cmd->body); | ||
| 570 | cmd->body.mobid = mob->id; | ||
| 571 | vmw_fifo_commit(dev_priv, sizeof(*cmd)); | ||
| 565 | } | 572 | } |
| 566 | cmd->header.id = SVGA_3D_CMD_DESTROY_GB_MOB; | ||
| 567 | cmd->header.size = sizeof(cmd->body); | ||
| 568 | cmd->body.mobid = mob->id; | ||
| 569 | vmw_fifo_commit(dev_priv, sizeof(*cmd)); | ||
| 570 | if (bo) { | 573 | if (bo) { |
| 571 | vmw_fence_single_bo(bo, NULL); | 574 | vmw_fence_single_bo(bo, NULL); |
| 572 | ttm_bo_unreserve(bo); | 575 | ttm_bo_unreserve(bo); |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c index 2aa4bc6a4d60..9757b57f8388 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c | |||
| @@ -427,8 +427,7 @@ int vmw_dmabuf_init(struct vmw_private *dev_priv, | |||
| 427 | INIT_LIST_HEAD(&vmw_bo->res_list); | 427 | INIT_LIST_HEAD(&vmw_bo->res_list); |
| 428 | 428 | ||
| 429 | ret = ttm_bo_init(bdev, &vmw_bo->base, size, | 429 | ret = ttm_bo_init(bdev, &vmw_bo->base, size, |
| 430 | (user) ? ttm_bo_type_device : | 430 | ttm_bo_type_device, placement, |
| 431 | ttm_bo_type_kernel, placement, | ||
| 432 | 0, interruptible, | 431 | 0, interruptible, |
| 433 | NULL, acc_size, NULL, bo_free); | 432 | NULL, acc_size, NULL, bo_free); |
| 434 | return ret; | 433 | return ret; |
diff --git a/drivers/gpu/host1x/job.c b/drivers/gpu/host1x/job.c index 1146e3bba6e1..112f27e51bc7 100644 --- a/drivers/gpu/host1x/job.c +++ b/drivers/gpu/host1x/job.c | |||
| @@ -538,7 +538,7 @@ int host1x_job_pin(struct host1x_job *job, struct device *dev) | |||
| 538 | 538 | ||
| 539 | g->base = job->gather_addr_phys[i]; | 539 | g->base = job->gather_addr_phys[i]; |
| 540 | 540 | ||
| 541 | for (j = 0; j < job->num_gathers; j++) | 541 | for (j = i + 1; j < job->num_gathers; j++) |
| 542 | if (job->gathers[j].bo == g->bo) | 542 | if (job->gathers[j].bo == g->bo) |
| 543 | job->gathers[j].handled = true; | 543 | job->gathers[j].handled = true; |
| 544 | 544 | ||
diff --git a/drivers/iio/gyro/Kconfig b/drivers/iio/gyro/Kconfig index 41c64a43bcab..ac2d69e34c8c 100644 --- a/drivers/iio/gyro/Kconfig +++ b/drivers/iio/gyro/Kconfig | |||
| @@ -70,7 +70,7 @@ config IIO_ST_GYRO_3AXIS | |||
| 70 | select IIO_TRIGGERED_BUFFER if (IIO_BUFFER) | 70 | select IIO_TRIGGERED_BUFFER if (IIO_BUFFER) |
| 71 | help | 71 | help |
| 72 | Say yes here to build support for STMicroelectronics gyroscopes: | 72 | Say yes here to build support for STMicroelectronics gyroscopes: |
| 73 | L3G4200D, LSM330DL, L3GD20, L3GD20H, LSM330DLC, L3G4IS, LSM330. | 73 | L3G4200D, LSM330DL, L3GD20, LSM330DLC, L3G4IS, LSM330. |
| 74 | 74 | ||
| 75 | This driver can also be built as a module. If so, these modules | 75 | This driver can also be built as a module. If so, these modules |
| 76 | will be created: | 76 | will be created: |
diff --git a/drivers/iio/gyro/st_gyro.h b/drivers/iio/gyro/st_gyro.h index f8f2bf84a5a2..c197360c450b 100644 --- a/drivers/iio/gyro/st_gyro.h +++ b/drivers/iio/gyro/st_gyro.h | |||
| @@ -19,7 +19,6 @@ | |||
| 19 | #define LSM330DL_GYRO_DEV_NAME "lsm330dl_gyro" | 19 | #define LSM330DL_GYRO_DEV_NAME "lsm330dl_gyro" |
| 20 | #define LSM330DLC_GYRO_DEV_NAME "lsm330dlc_gyro" | 20 | #define LSM330DLC_GYRO_DEV_NAME "lsm330dlc_gyro" |
| 21 | #define L3GD20_GYRO_DEV_NAME "l3gd20" | 21 | #define L3GD20_GYRO_DEV_NAME "l3gd20" |
| 22 | #define L3GD20H_GYRO_DEV_NAME "l3gd20h" | ||
| 23 | #define L3G4IS_GYRO_DEV_NAME "l3g4is_ui" | 22 | #define L3G4IS_GYRO_DEV_NAME "l3g4is_ui" |
| 24 | #define LSM330_GYRO_DEV_NAME "lsm330_gyro" | 23 | #define LSM330_GYRO_DEV_NAME "lsm330_gyro" |
| 25 | 24 | ||
diff --git a/drivers/iio/gyro/st_gyro_core.c b/drivers/iio/gyro/st_gyro_core.c index d53d91adfb55..a8e174a47bc4 100644 --- a/drivers/iio/gyro/st_gyro_core.c +++ b/drivers/iio/gyro/st_gyro_core.c | |||
| @@ -167,11 +167,10 @@ static const struct st_sensors st_gyro_sensors[] = { | |||
| 167 | .wai = ST_GYRO_2_WAI_EXP, | 167 | .wai = ST_GYRO_2_WAI_EXP, |
| 168 | .sensors_supported = { | 168 | .sensors_supported = { |
| 169 | [0] = L3GD20_GYRO_DEV_NAME, | 169 | [0] = L3GD20_GYRO_DEV_NAME, |
| 170 | [1] = L3GD20H_GYRO_DEV_NAME, | 170 | [1] = LSM330D_GYRO_DEV_NAME, |
| 171 | [2] = LSM330D_GYRO_DEV_NAME, | 171 | [2] = LSM330DLC_GYRO_DEV_NAME, |
| 172 | [3] = LSM330DLC_GYRO_DEV_NAME, | 172 | [3] = L3G4IS_GYRO_DEV_NAME, |
| 173 | [4] = L3G4IS_GYRO_DEV_NAME, | 173 | [4] = LSM330_GYRO_DEV_NAME, |
| 174 | [5] = LSM330_GYRO_DEV_NAME, | ||
| 175 | }, | 174 | }, |
| 176 | .ch = (struct iio_chan_spec *)st_gyro_16bit_channels, | 175 | .ch = (struct iio_chan_spec *)st_gyro_16bit_channels, |
| 177 | .odr = { | 176 | .odr = { |
diff --git a/drivers/iio/gyro/st_gyro_i2c.c b/drivers/iio/gyro/st_gyro_i2c.c index 16b8b8d70bf1..23c12f361b05 100644 --- a/drivers/iio/gyro/st_gyro_i2c.c +++ b/drivers/iio/gyro/st_gyro_i2c.c | |||
| @@ -55,7 +55,6 @@ static const struct i2c_device_id st_gyro_id_table[] = { | |||
| 55 | { LSM330DL_GYRO_DEV_NAME }, | 55 | { LSM330DL_GYRO_DEV_NAME }, |
| 56 | { LSM330DLC_GYRO_DEV_NAME }, | 56 | { LSM330DLC_GYRO_DEV_NAME }, |
| 57 | { L3GD20_GYRO_DEV_NAME }, | 57 | { L3GD20_GYRO_DEV_NAME }, |
| 58 | { L3GD20H_GYRO_DEV_NAME }, | ||
| 59 | { L3G4IS_GYRO_DEV_NAME }, | 58 | { L3G4IS_GYRO_DEV_NAME }, |
| 60 | { LSM330_GYRO_DEV_NAME }, | 59 | { LSM330_GYRO_DEV_NAME }, |
| 61 | {}, | 60 | {}, |
diff --git a/drivers/iio/gyro/st_gyro_spi.c b/drivers/iio/gyro/st_gyro_spi.c index 94763e25caf9..b4ad3be26687 100644 --- a/drivers/iio/gyro/st_gyro_spi.c +++ b/drivers/iio/gyro/st_gyro_spi.c | |||
| @@ -54,7 +54,6 @@ static const struct spi_device_id st_gyro_id_table[] = { | |||
| 54 | { LSM330DL_GYRO_DEV_NAME }, | 54 | { LSM330DL_GYRO_DEV_NAME }, |
| 55 | { LSM330DLC_GYRO_DEV_NAME }, | 55 | { LSM330DLC_GYRO_DEV_NAME }, |
| 56 | { L3GD20_GYRO_DEV_NAME }, | 56 | { L3GD20_GYRO_DEV_NAME }, |
| 57 | { L3GD20H_GYRO_DEV_NAME }, | ||
| 58 | { L3G4IS_GYRO_DEV_NAME }, | 57 | { L3G4IS_GYRO_DEV_NAME }, |
| 59 | { LSM330_GYRO_DEV_NAME }, | 58 | { LSM330_GYRO_DEV_NAME }, |
| 60 | {}, | 59 | {}, |
diff --git a/drivers/iio/light/cm32181.c b/drivers/iio/light/cm32181.c index f17b4e6183c6..47a6dbac2d0c 100644 --- a/drivers/iio/light/cm32181.c +++ b/drivers/iio/light/cm32181.c | |||
| @@ -103,13 +103,13 @@ static int cm32181_reg_init(struct cm32181_chip *cm32181) | |||
| 103 | /** | 103 | /** |
| 104 | * cm32181_read_als_it() - Get sensor integration time (ms) | 104 | * cm32181_read_als_it() - Get sensor integration time (ms) |
| 105 | * @cm32181: pointer of struct cm32181 | 105 | * @cm32181: pointer of struct cm32181 |
| 106 | * @val: pointer of int to load the als_it value. | 106 | * @val2: pointer of int to load the als_it value. |
| 107 | * | 107 | * |
| 108 | * Report the current integartion time by millisecond. | 108 | * Report the current integartion time by millisecond. |
| 109 | * | 109 | * |
| 110 | * Return: IIO_VAL_INT for success, otherwise -EINVAL. | 110 | * Return: IIO_VAL_INT_PLUS_MICRO for success, otherwise -EINVAL. |
| 111 | */ | 111 | */ |
| 112 | static int cm32181_read_als_it(struct cm32181_chip *cm32181, int *val) | 112 | static int cm32181_read_als_it(struct cm32181_chip *cm32181, int *val2) |
| 113 | { | 113 | { |
| 114 | u16 als_it; | 114 | u16 als_it; |
| 115 | int i; | 115 | int i; |
| @@ -119,8 +119,8 @@ static int cm32181_read_als_it(struct cm32181_chip *cm32181, int *val) | |||
| 119 | als_it >>= CM32181_CMD_ALS_IT_SHIFT; | 119 | als_it >>= CM32181_CMD_ALS_IT_SHIFT; |
| 120 | for (i = 0; i < ARRAY_SIZE(als_it_bits); i++) { | 120 | for (i = 0; i < ARRAY_SIZE(als_it_bits); i++) { |
| 121 | if (als_it == als_it_bits[i]) { | 121 | if (als_it == als_it_bits[i]) { |
| 122 | *val = als_it_value[i]; | 122 | *val2 = als_it_value[i]; |
| 123 | return IIO_VAL_INT; | 123 | return IIO_VAL_INT_PLUS_MICRO; |
| 124 | } | 124 | } |
| 125 | } | 125 | } |
| 126 | 126 | ||
| @@ -221,7 +221,7 @@ static int cm32181_read_raw(struct iio_dev *indio_dev, | |||
| 221 | *val = cm32181->calibscale; | 221 | *val = cm32181->calibscale; |
| 222 | return IIO_VAL_INT; | 222 | return IIO_VAL_INT; |
| 223 | case IIO_CHAN_INFO_INT_TIME: | 223 | case IIO_CHAN_INFO_INT_TIME: |
| 224 | ret = cm32181_read_als_it(cm32181, val); | 224 | ret = cm32181_read_als_it(cm32181, val2); |
| 225 | return ret; | 225 | return ret; |
| 226 | } | 226 | } |
| 227 | 227 | ||
| @@ -240,7 +240,7 @@ static int cm32181_write_raw(struct iio_dev *indio_dev, | |||
| 240 | cm32181->calibscale = val; | 240 | cm32181->calibscale = val; |
| 241 | return val; | 241 | return val; |
| 242 | case IIO_CHAN_INFO_INT_TIME: | 242 | case IIO_CHAN_INFO_INT_TIME: |
| 243 | ret = cm32181_write_als_it(cm32181, val); | 243 | ret = cm32181_write_als_it(cm32181, val2); |
| 244 | return ret; | 244 | return ret; |
| 245 | } | 245 | } |
| 246 | 246 | ||
| @@ -264,7 +264,7 @@ static ssize_t cm32181_get_it_available(struct device *dev, | |||
| 264 | 264 | ||
| 265 | n = ARRAY_SIZE(als_it_value); | 265 | n = ARRAY_SIZE(als_it_value); |
| 266 | for (i = 0, len = 0; i < n; i++) | 266 | for (i = 0, len = 0; i < n; i++) |
| 267 | len += sprintf(buf + len, "%d ", als_it_value[i]); | 267 | len += sprintf(buf + len, "0.%06u ", als_it_value[i]); |
| 268 | return len + sprintf(buf + len, "\n"); | 268 | return len + sprintf(buf + len, "\n"); |
| 269 | } | 269 | } |
| 270 | 270 | ||
diff --git a/drivers/iio/light/cm36651.c b/drivers/iio/light/cm36651.c index 0a142af83e25..a45e07492db3 100644 --- a/drivers/iio/light/cm36651.c +++ b/drivers/iio/light/cm36651.c | |||
| @@ -50,10 +50,10 @@ | |||
| 50 | #define CM36651_CS_CONF2_DEFAULT_BIT 0x08 | 50 | #define CM36651_CS_CONF2_DEFAULT_BIT 0x08 |
| 51 | 51 | ||
| 52 | /* CS_CONF3 channel integration time */ | 52 | /* CS_CONF3 channel integration time */ |
| 53 | #define CM36651_CS_IT1 0x00 /* Integration time 80000 usec */ | 53 | #define CM36651_CS_IT1 0x00 /* Integration time 80 msec */ |
| 54 | #define CM36651_CS_IT2 0x40 /* Integration time 160000 usec */ | 54 | #define CM36651_CS_IT2 0x40 /* Integration time 160 msec */ |
| 55 | #define CM36651_CS_IT3 0x80 /* Integration time 320000 usec */ | 55 | #define CM36651_CS_IT3 0x80 /* Integration time 320 msec */ |
| 56 | #define CM36651_CS_IT4 0xC0 /* Integration time 640000 usec */ | 56 | #define CM36651_CS_IT4 0xC0 /* Integration time 640 msec */ |
| 57 | 57 | ||
| 58 | /* PS_CONF1 command code */ | 58 | /* PS_CONF1 command code */ |
| 59 | #define CM36651_PS_ENABLE 0x00 | 59 | #define CM36651_PS_ENABLE 0x00 |
| @@ -64,10 +64,10 @@ | |||
| 64 | #define CM36651_PS_PERS4 0x0C | 64 | #define CM36651_PS_PERS4 0x0C |
| 65 | 65 | ||
| 66 | /* PS_CONF1 command code: integration time */ | 66 | /* PS_CONF1 command code: integration time */ |
| 67 | #define CM36651_PS_IT1 0x00 /* Integration time 320 usec */ | 67 | #define CM36651_PS_IT1 0x00 /* Integration time 0.32 msec */ |
| 68 | #define CM36651_PS_IT2 0x10 /* Integration time 420 usec */ | 68 | #define CM36651_PS_IT2 0x10 /* Integration time 0.42 msec */ |
| 69 | #define CM36651_PS_IT3 0x20 /* Integration time 520 usec */ | 69 | #define CM36651_PS_IT3 0x20 /* Integration time 0.52 msec */ |
| 70 | #define CM36651_PS_IT4 0x30 /* Integration time 640 usec */ | 70 | #define CM36651_PS_IT4 0x30 /* Integration time 0.64 msec */ |
| 71 | 71 | ||
| 72 | /* PS_CONF1 command code: duty ratio */ | 72 | /* PS_CONF1 command code: duty ratio */ |
| 73 | #define CM36651_PS_DR1 0x00 /* Duty ratio 1/80 */ | 73 | #define CM36651_PS_DR1 0x00 /* Duty ratio 1/80 */ |
| @@ -93,8 +93,8 @@ | |||
| 93 | #define CM36651_CLOSE_PROXIMITY 0x32 | 93 | #define CM36651_CLOSE_PROXIMITY 0x32 |
| 94 | #define CM36651_FAR_PROXIMITY 0x33 | 94 | #define CM36651_FAR_PROXIMITY 0x33 |
| 95 | 95 | ||
| 96 | #define CM36651_CS_INT_TIME_AVAIL "80000 160000 320000 640000" | 96 | #define CM36651_CS_INT_TIME_AVAIL "0.08 0.16 0.32 0.64" |
| 97 | #define CM36651_PS_INT_TIME_AVAIL "320 420 520 640" | 97 | #define CM36651_PS_INT_TIME_AVAIL "0.000320 0.000420 0.000520 0.000640" |
| 98 | 98 | ||
| 99 | enum cm36651_operation_mode { | 99 | enum cm36651_operation_mode { |
| 100 | CM36651_LIGHT_EN, | 100 | CM36651_LIGHT_EN, |
| @@ -356,30 +356,30 @@ static int cm36651_read_channel(struct cm36651_data *cm36651, | |||
| 356 | } | 356 | } |
| 357 | 357 | ||
| 358 | static int cm36651_read_int_time(struct cm36651_data *cm36651, | 358 | static int cm36651_read_int_time(struct cm36651_data *cm36651, |
| 359 | struct iio_chan_spec const *chan, int *val) | 359 | struct iio_chan_spec const *chan, int *val2) |
| 360 | { | 360 | { |
| 361 | switch (chan->type) { | 361 | switch (chan->type) { |
| 362 | case IIO_LIGHT: | 362 | case IIO_LIGHT: |
| 363 | if (cm36651->cs_int_time[chan->address] == CM36651_CS_IT1) | 363 | if (cm36651->cs_int_time[chan->address] == CM36651_CS_IT1) |
| 364 | *val = 80000; | 364 | *val2 = 80000; |
| 365 | else if (cm36651->cs_int_time[chan->address] == CM36651_CS_IT2) | 365 | else if (cm36651->cs_int_time[chan->address] == CM36651_CS_IT2) |
| 366 | *val = 160000; | 366 | *val2 = 160000; |
| 367 | else if (cm36651->cs_int_time[chan->address] == CM36651_CS_IT3) | 367 | else if (cm36651->cs_int_time[chan->address] == CM36651_CS_IT3) |
| 368 | *val = 320000; | 368 | *val2 = 320000; |
| 369 | else if (cm36651->cs_int_time[chan->address] == CM36651_CS_IT4) | 369 | else if (cm36651->cs_int_time[chan->address] == CM36651_CS_IT4) |
| 370 | *val = 640000; | 370 | *val2 = 640000; |
| 371 | else | 371 | else |
| 372 | return -EINVAL; | 372 | return -EINVAL; |
| 373 | break; | 373 | break; |
| 374 | case IIO_PROXIMITY: | 374 | case IIO_PROXIMITY: |
| 375 | if (cm36651->ps_int_time == CM36651_PS_IT1) | 375 | if (cm36651->ps_int_time == CM36651_PS_IT1) |
| 376 | *val = 320; | 376 | *val2 = 320; |
| 377 | else if (cm36651->ps_int_time == CM36651_PS_IT2) | 377 | else if (cm36651->ps_int_time == CM36651_PS_IT2) |
| 378 | *val = 420; | 378 | *val2 = 420; |
| 379 | else if (cm36651->ps_int_time == CM36651_PS_IT3) | 379 | else if (cm36651->ps_int_time == CM36651_PS_IT3) |
| 380 | *val = 520; | 380 | *val2 = 520; |
| 381 | else if (cm36651->ps_int_time == CM36651_PS_IT4) | 381 | else if (cm36651->ps_int_time == CM36651_PS_IT4) |
| 382 | *val = 640; | 382 | *val2 = 640; |
| 383 | else | 383 | else |
| 384 | return -EINVAL; | 384 | return -EINVAL; |
| 385 | break; | 385 | break; |
| @@ -387,7 +387,7 @@ static int cm36651_read_int_time(struct cm36651_data *cm36651, | |||
| 387 | return -EINVAL; | 387 | return -EINVAL; |
| 388 | } | 388 | } |
| 389 | 389 | ||
| 390 | return IIO_VAL_INT; | 390 | return IIO_VAL_INT_PLUS_MICRO; |
| 391 | } | 391 | } |
| 392 | 392 | ||
| 393 | static int cm36651_write_int_time(struct cm36651_data *cm36651, | 393 | static int cm36651_write_int_time(struct cm36651_data *cm36651, |
| @@ -459,7 +459,8 @@ static int cm36651_read_raw(struct iio_dev *indio_dev, | |||
| 459 | ret = cm36651_read_channel(cm36651, chan, val); | 459 | ret = cm36651_read_channel(cm36651, chan, val); |
| 460 | break; | 460 | break; |
| 461 | case IIO_CHAN_INFO_INT_TIME: | 461 | case IIO_CHAN_INFO_INT_TIME: |
| 462 | ret = cm36651_read_int_time(cm36651, chan, val); | 462 | *val = 0; |
| 463 | ret = cm36651_read_int_time(cm36651, chan, val2); | ||
| 463 | break; | 464 | break; |
| 464 | default: | 465 | default: |
| 465 | ret = -EINVAL; | 466 | ret = -EINVAL; |
| @@ -479,7 +480,7 @@ static int cm36651_write_raw(struct iio_dev *indio_dev, | |||
| 479 | int ret = -EINVAL; | 480 | int ret = -EINVAL; |
| 480 | 481 | ||
| 481 | if (mask == IIO_CHAN_INFO_INT_TIME) { | 482 | if (mask == IIO_CHAN_INFO_INT_TIME) { |
| 482 | ret = cm36651_write_int_time(cm36651, chan, val); | 483 | ret = cm36651_write_int_time(cm36651, chan, val2); |
| 483 | if (ret < 0) | 484 | if (ret < 0) |
| 484 | dev_err(&client->dev, "Integration time write failed\n"); | 485 | dev_err(&client->dev, "Integration time write failed\n"); |
| 485 | } | 486 | } |
diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c index e81c5547e647..f9c12e92fdd6 100644 --- a/drivers/infiniband/hw/mlx4/main.c +++ b/drivers/infiniband/hw/mlx4/main.c | |||
| @@ -53,8 +53,8 @@ | |||
| 53 | #include "user.h" | 53 | #include "user.h" |
| 54 | 54 | ||
| 55 | #define DRV_NAME MLX4_IB_DRV_NAME | 55 | #define DRV_NAME MLX4_IB_DRV_NAME |
| 56 | #define DRV_VERSION "1.0" | 56 | #define DRV_VERSION "2.2-1" |
| 57 | #define DRV_RELDATE "April 4, 2008" | 57 | #define DRV_RELDATE "Feb 2014" |
| 58 | 58 | ||
| 59 | #define MLX4_IB_FLOW_MAX_PRIO 0xFFF | 59 | #define MLX4_IB_FLOW_MAX_PRIO 0xFFF |
| 60 | #define MLX4_IB_FLOW_QPN_MASK 0xFFFFFF | 60 | #define MLX4_IB_FLOW_QPN_MASK 0xFFFFFF |
diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c index aa03e732b6a8..bf900579ac08 100644 --- a/drivers/infiniband/hw/mlx5/main.c +++ b/drivers/infiniband/hw/mlx5/main.c | |||
| @@ -46,8 +46,8 @@ | |||
| 46 | #include "mlx5_ib.h" | 46 | #include "mlx5_ib.h" |
| 47 | 47 | ||
| 48 | #define DRIVER_NAME "mlx5_ib" | 48 | #define DRIVER_NAME "mlx5_ib" |
| 49 | #define DRIVER_VERSION "1.0" | 49 | #define DRIVER_VERSION "2.2-1" |
| 50 | #define DRIVER_RELDATE "June 2013" | 50 | #define DRIVER_RELDATE "Feb 2014" |
| 51 | 51 | ||
| 52 | MODULE_AUTHOR("Eli Cohen <eli@mellanox.com>"); | 52 | MODULE_AUTHOR("Eli Cohen <eli@mellanox.com>"); |
| 53 | MODULE_DESCRIPTION("Mellanox Connect-IB HCA IB driver"); | 53 | MODULE_DESCRIPTION("Mellanox Connect-IB HCA IB driver"); |
diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c index d18d08a076e8..8ee228e9ab5a 100644 --- a/drivers/infiniband/ulp/isert/ib_isert.c +++ b/drivers/infiniband/ulp/isert/ib_isert.c | |||
| @@ -492,12 +492,11 @@ isert_connect_request(struct rdma_cm_id *cma_id, struct rdma_cm_event *event) | |||
| 492 | isert_conn->state = ISER_CONN_INIT; | 492 | isert_conn->state = ISER_CONN_INIT; |
| 493 | INIT_LIST_HEAD(&isert_conn->conn_accept_node); | 493 | INIT_LIST_HEAD(&isert_conn->conn_accept_node); |
| 494 | init_completion(&isert_conn->conn_login_comp); | 494 | init_completion(&isert_conn->conn_login_comp); |
| 495 | init_waitqueue_head(&isert_conn->conn_wait); | 495 | init_completion(&isert_conn->conn_wait); |
| 496 | init_waitqueue_head(&isert_conn->conn_wait_comp_err); | 496 | init_completion(&isert_conn->conn_wait_comp_err); |
| 497 | kref_init(&isert_conn->conn_kref); | 497 | kref_init(&isert_conn->conn_kref); |
| 498 | kref_get(&isert_conn->conn_kref); | 498 | kref_get(&isert_conn->conn_kref); |
| 499 | mutex_init(&isert_conn->conn_mutex); | 499 | mutex_init(&isert_conn->conn_mutex); |
| 500 | mutex_init(&isert_conn->conn_comp_mutex); | ||
| 501 | spin_lock_init(&isert_conn->conn_lock); | 500 | spin_lock_init(&isert_conn->conn_lock); |
| 502 | 501 | ||
| 503 | cma_id->context = isert_conn; | 502 | cma_id->context = isert_conn; |
| @@ -688,11 +687,11 @@ isert_disconnect_work(struct work_struct *work) | |||
| 688 | 687 | ||
| 689 | pr_debug("isert_disconnect_work(): >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n"); | 688 | pr_debug("isert_disconnect_work(): >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n"); |
| 690 | mutex_lock(&isert_conn->conn_mutex); | 689 | mutex_lock(&isert_conn->conn_mutex); |
| 691 | isert_conn->state = ISER_CONN_DOWN; | 690 | if (isert_conn->state == ISER_CONN_UP) |
| 691 | isert_conn->state = ISER_CONN_TERMINATING; | ||
| 692 | 692 | ||
| 693 | if (isert_conn->post_recv_buf_count == 0 && | 693 | if (isert_conn->post_recv_buf_count == 0 && |
| 694 | atomic_read(&isert_conn->post_send_buf_count) == 0) { | 694 | atomic_read(&isert_conn->post_send_buf_count) == 0) { |
| 695 | pr_debug("Calling wake_up(&isert_conn->conn_wait);\n"); | ||
| 696 | mutex_unlock(&isert_conn->conn_mutex); | 695 | mutex_unlock(&isert_conn->conn_mutex); |
| 697 | goto wake_up; | 696 | goto wake_up; |
| 698 | } | 697 | } |
| @@ -712,7 +711,7 @@ isert_disconnect_work(struct work_struct *work) | |||
| 712 | mutex_unlock(&isert_conn->conn_mutex); | 711 | mutex_unlock(&isert_conn->conn_mutex); |
| 713 | 712 | ||
| 714 | wake_up: | 713 | wake_up: |
| 715 | wake_up(&isert_conn->conn_wait); | 714 | complete(&isert_conn->conn_wait); |
| 716 | isert_put_conn(isert_conn); | 715 | isert_put_conn(isert_conn); |
| 717 | } | 716 | } |
| 718 | 717 | ||
| @@ -888,16 +887,17 @@ isert_init_send_wr(struct isert_conn *isert_conn, struct isert_cmd *isert_cmd, | |||
| 888 | * Coalesce send completion interrupts by only setting IB_SEND_SIGNALED | 887 | * Coalesce send completion interrupts by only setting IB_SEND_SIGNALED |
| 889 | * bit for every ISERT_COMP_BATCH_COUNT number of ib_post_send() calls. | 888 | * bit for every ISERT_COMP_BATCH_COUNT number of ib_post_send() calls. |
| 890 | */ | 889 | */ |
| 891 | mutex_lock(&isert_conn->conn_comp_mutex); | 890 | mutex_lock(&isert_conn->conn_mutex); |
| 892 | if (coalesce && | 891 | if (coalesce && isert_conn->state == ISER_CONN_UP && |
| 893 | ++isert_conn->conn_comp_batch < ISERT_COMP_BATCH_COUNT) { | 892 | ++isert_conn->conn_comp_batch < ISERT_COMP_BATCH_COUNT) { |
| 893 | tx_desc->llnode_active = true; | ||
| 894 | llist_add(&tx_desc->comp_llnode, &isert_conn->conn_comp_llist); | 894 | llist_add(&tx_desc->comp_llnode, &isert_conn->conn_comp_llist); |
| 895 | mutex_unlock(&isert_conn->conn_comp_mutex); | 895 | mutex_unlock(&isert_conn->conn_mutex); |
| 896 | return; | 896 | return; |
| 897 | } | 897 | } |
| 898 | isert_conn->conn_comp_batch = 0; | 898 | isert_conn->conn_comp_batch = 0; |
| 899 | tx_desc->comp_llnode_batch = llist_del_all(&isert_conn->conn_comp_llist); | 899 | tx_desc->comp_llnode_batch = llist_del_all(&isert_conn->conn_comp_llist); |
| 900 | mutex_unlock(&isert_conn->conn_comp_mutex); | 900 | mutex_unlock(&isert_conn->conn_mutex); |
| 901 | 901 | ||
| 902 | send_wr->send_flags = IB_SEND_SIGNALED; | 902 | send_wr->send_flags = IB_SEND_SIGNALED; |
| 903 | } | 903 | } |
| @@ -1464,7 +1464,7 @@ isert_put_cmd(struct isert_cmd *isert_cmd) | |||
| 1464 | case ISCSI_OP_SCSI_CMD: | 1464 | case ISCSI_OP_SCSI_CMD: |
| 1465 | spin_lock_bh(&conn->cmd_lock); | 1465 | spin_lock_bh(&conn->cmd_lock); |
| 1466 | if (!list_empty(&cmd->i_conn_node)) | 1466 | if (!list_empty(&cmd->i_conn_node)) |
| 1467 | list_del(&cmd->i_conn_node); | 1467 | list_del_init(&cmd->i_conn_node); |
| 1468 | spin_unlock_bh(&conn->cmd_lock); | 1468 | spin_unlock_bh(&conn->cmd_lock); |
| 1469 | 1469 | ||
| 1470 | if (cmd->data_direction == DMA_TO_DEVICE) | 1470 | if (cmd->data_direction == DMA_TO_DEVICE) |
| @@ -1476,7 +1476,7 @@ isert_put_cmd(struct isert_cmd *isert_cmd) | |||
| 1476 | case ISCSI_OP_SCSI_TMFUNC: | 1476 | case ISCSI_OP_SCSI_TMFUNC: |
| 1477 | spin_lock_bh(&conn->cmd_lock); | 1477 | spin_lock_bh(&conn->cmd_lock); |
| 1478 | if (!list_empty(&cmd->i_conn_node)) | 1478 | if (!list_empty(&cmd->i_conn_node)) |
| 1479 | list_del(&cmd->i_conn_node); | 1479 | list_del_init(&cmd->i_conn_node); |
| 1480 | spin_unlock_bh(&conn->cmd_lock); | 1480 | spin_unlock_bh(&conn->cmd_lock); |
| 1481 | 1481 | ||
| 1482 | transport_generic_free_cmd(&cmd->se_cmd, 0); | 1482 | transport_generic_free_cmd(&cmd->se_cmd, 0); |
| @@ -1486,7 +1486,7 @@ isert_put_cmd(struct isert_cmd *isert_cmd) | |||
| 1486 | case ISCSI_OP_TEXT: | 1486 | case ISCSI_OP_TEXT: |
| 1487 | spin_lock_bh(&conn->cmd_lock); | 1487 | spin_lock_bh(&conn->cmd_lock); |
| 1488 | if (!list_empty(&cmd->i_conn_node)) | 1488 | if (!list_empty(&cmd->i_conn_node)) |
| 1489 | list_del(&cmd->i_conn_node); | 1489 | list_del_init(&cmd->i_conn_node); |
| 1490 | spin_unlock_bh(&conn->cmd_lock); | 1490 | spin_unlock_bh(&conn->cmd_lock); |
| 1491 | 1491 | ||
| 1492 | /* | 1492 | /* |
| @@ -1549,6 +1549,7 @@ isert_completion_rdma_read(struct iser_tx_desc *tx_desc, | |||
| 1549 | iscsit_stop_dataout_timer(cmd); | 1549 | iscsit_stop_dataout_timer(cmd); |
| 1550 | device->unreg_rdma_mem(isert_cmd, isert_conn); | 1550 | device->unreg_rdma_mem(isert_cmd, isert_conn); |
| 1551 | cmd->write_data_done = wr->cur_rdma_length; | 1551 | cmd->write_data_done = wr->cur_rdma_length; |
| 1552 | wr->send_wr_num = 0; | ||
| 1552 | 1553 | ||
| 1553 | pr_debug("Cmd: %p RDMA_READ comp calling execute_cmd\n", isert_cmd); | 1554 | pr_debug("Cmd: %p RDMA_READ comp calling execute_cmd\n", isert_cmd); |
| 1554 | spin_lock_bh(&cmd->istate_lock); | 1555 | spin_lock_bh(&cmd->istate_lock); |
| @@ -1589,7 +1590,7 @@ isert_do_control_comp(struct work_struct *work) | |||
| 1589 | pr_debug("Calling iscsit_logout_post_handler >>>>>>>>>>>>>>\n"); | 1590 | pr_debug("Calling iscsit_logout_post_handler >>>>>>>>>>>>>>\n"); |
| 1590 | /* | 1591 | /* |
| 1591 | * Call atomic_dec(&isert_conn->post_send_buf_count) | 1592 | * Call atomic_dec(&isert_conn->post_send_buf_count) |
| 1592 | * from isert_free_conn() | 1593 | * from isert_wait_conn() |
| 1593 | */ | 1594 | */ |
| 1594 | isert_conn->logout_posted = true; | 1595 | isert_conn->logout_posted = true; |
| 1595 | iscsit_logout_post_handler(cmd, cmd->conn); | 1596 | iscsit_logout_post_handler(cmd, cmd->conn); |
| @@ -1613,6 +1614,7 @@ isert_response_completion(struct iser_tx_desc *tx_desc, | |||
| 1613 | struct ib_device *ib_dev) | 1614 | struct ib_device *ib_dev) |
| 1614 | { | 1615 | { |
| 1615 | struct iscsi_cmd *cmd = isert_cmd->iscsi_cmd; | 1616 | struct iscsi_cmd *cmd = isert_cmd->iscsi_cmd; |
| 1617 | struct isert_rdma_wr *wr = &isert_cmd->rdma_wr; | ||
| 1616 | 1618 | ||
| 1617 | if (cmd->i_state == ISTATE_SEND_TASKMGTRSP || | 1619 | if (cmd->i_state == ISTATE_SEND_TASKMGTRSP || |
| 1618 | cmd->i_state == ISTATE_SEND_LOGOUTRSP || | 1620 | cmd->i_state == ISTATE_SEND_LOGOUTRSP || |
| @@ -1624,7 +1626,7 @@ isert_response_completion(struct iser_tx_desc *tx_desc, | |||
| 1624 | queue_work(isert_comp_wq, &isert_cmd->comp_work); | 1626 | queue_work(isert_comp_wq, &isert_cmd->comp_work); |
| 1625 | return; | 1627 | return; |
| 1626 | } | 1628 | } |
| 1627 | atomic_dec(&isert_conn->post_send_buf_count); | 1629 | atomic_sub(wr->send_wr_num + 1, &isert_conn->post_send_buf_count); |
| 1628 | 1630 | ||
| 1629 | cmd->i_state = ISTATE_SENT_STATUS; | 1631 | cmd->i_state = ISTATE_SENT_STATUS; |
| 1630 | isert_completion_put(tx_desc, isert_cmd, ib_dev); | 1632 | isert_completion_put(tx_desc, isert_cmd, ib_dev); |
| @@ -1662,7 +1664,7 @@ __isert_send_completion(struct iser_tx_desc *tx_desc, | |||
| 1662 | case ISER_IB_RDMA_READ: | 1664 | case ISER_IB_RDMA_READ: |
| 1663 | pr_debug("isert_send_completion: Got ISER_IB_RDMA_READ:\n"); | 1665 | pr_debug("isert_send_completion: Got ISER_IB_RDMA_READ:\n"); |
| 1664 | 1666 | ||
| 1665 | atomic_dec(&isert_conn->post_send_buf_count); | 1667 | atomic_sub(wr->send_wr_num, &isert_conn->post_send_buf_count); |
| 1666 | isert_completion_rdma_read(tx_desc, isert_cmd); | 1668 | isert_completion_rdma_read(tx_desc, isert_cmd); |
| 1667 | break; | 1669 | break; |
| 1668 | default: | 1670 | default: |
| @@ -1691,31 +1693,76 @@ isert_send_completion(struct iser_tx_desc *tx_desc, | |||
| 1691 | } | 1693 | } |
| 1692 | 1694 | ||
| 1693 | static void | 1695 | static void |
| 1694 | isert_cq_comp_err(struct iser_tx_desc *tx_desc, struct isert_conn *isert_conn) | 1696 | isert_cq_drain_comp_llist(struct isert_conn *isert_conn, struct ib_device *ib_dev) |
| 1697 | { | ||
| 1698 | struct llist_node *llnode; | ||
| 1699 | struct isert_rdma_wr *wr; | ||
| 1700 | struct iser_tx_desc *t; | ||
| 1701 | |||
| 1702 | mutex_lock(&isert_conn->conn_mutex); | ||
| 1703 | llnode = llist_del_all(&isert_conn->conn_comp_llist); | ||
| 1704 | isert_conn->conn_comp_batch = 0; | ||
| 1705 | mutex_unlock(&isert_conn->conn_mutex); | ||
| 1706 | |||
| 1707 | while (llnode) { | ||
| 1708 | t = llist_entry(llnode, struct iser_tx_desc, comp_llnode); | ||
| 1709 | llnode = llist_next(llnode); | ||
| 1710 | wr = &t->isert_cmd->rdma_wr; | ||
| 1711 | |||
| 1712 | atomic_sub(wr->send_wr_num + 1, &isert_conn->post_send_buf_count); | ||
| 1713 | isert_completion_put(t, t->isert_cmd, ib_dev); | ||
| 1714 | } | ||
| 1715 | } | ||
| 1716 | |||
| 1717 | static void | ||
| 1718 | isert_cq_tx_comp_err(struct iser_tx_desc *tx_desc, struct isert_conn *isert_conn) | ||
| 1695 | { | 1719 | { |
| 1696 | struct ib_device *ib_dev = isert_conn->conn_cm_id->device; | 1720 | struct ib_device *ib_dev = isert_conn->conn_cm_id->device; |
| 1721 | struct isert_cmd *isert_cmd = tx_desc->isert_cmd; | ||
| 1722 | struct llist_node *llnode = tx_desc->comp_llnode_batch; | ||
| 1723 | struct isert_rdma_wr *wr; | ||
| 1724 | struct iser_tx_desc *t; | ||
| 1697 | 1725 | ||
| 1698 | if (tx_desc) { | 1726 | while (llnode) { |
| 1699 | struct isert_cmd *isert_cmd = tx_desc->isert_cmd; | 1727 | t = llist_entry(llnode, struct iser_tx_desc, comp_llnode); |
| 1728 | llnode = llist_next(llnode); | ||
| 1729 | wr = &t->isert_cmd->rdma_wr; | ||
| 1700 | 1730 | ||
| 1701 | if (!isert_cmd) | 1731 | atomic_sub(wr->send_wr_num + 1, &isert_conn->post_send_buf_count); |
| 1702 | isert_unmap_tx_desc(tx_desc, ib_dev); | 1732 | isert_completion_put(t, t->isert_cmd, ib_dev); |
| 1703 | else | ||
| 1704 | isert_completion_put(tx_desc, isert_cmd, ib_dev); | ||
| 1705 | } | 1733 | } |
| 1734 | tx_desc->comp_llnode_batch = NULL; | ||
| 1706 | 1735 | ||
| 1707 | if (isert_conn->post_recv_buf_count == 0 && | 1736 | if (!isert_cmd) |
| 1708 | atomic_read(&isert_conn->post_send_buf_count) == 0) { | 1737 | isert_unmap_tx_desc(tx_desc, ib_dev); |
| 1709 | pr_debug("isert_cq_comp_err >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n"); | 1738 | else |
| 1710 | pr_debug("Calling wake_up from isert_cq_comp_err\n"); | 1739 | isert_completion_put(tx_desc, isert_cmd, ib_dev); |
| 1740 | } | ||
| 1711 | 1741 | ||
| 1712 | mutex_lock(&isert_conn->conn_mutex); | 1742 | static void |
| 1713 | if (isert_conn->state != ISER_CONN_DOWN) | 1743 | isert_cq_rx_comp_err(struct isert_conn *isert_conn) |
| 1714 | isert_conn->state = ISER_CONN_TERMINATING; | 1744 | { |
| 1715 | mutex_unlock(&isert_conn->conn_mutex); | 1745 | struct ib_device *ib_dev = isert_conn->conn_cm_id->device; |
| 1746 | struct iscsi_conn *conn = isert_conn->conn; | ||
| 1716 | 1747 | ||
| 1717 | wake_up(&isert_conn->conn_wait_comp_err); | 1748 | if (isert_conn->post_recv_buf_count) |
| 1749 | return; | ||
| 1750 | |||
| 1751 | isert_cq_drain_comp_llist(isert_conn, ib_dev); | ||
| 1752 | |||
| 1753 | if (conn->sess) { | ||
| 1754 | target_sess_cmd_list_set_waiting(conn->sess->se_sess); | ||
| 1755 | target_wait_for_sess_cmds(conn->sess->se_sess); | ||
| 1718 | } | 1756 | } |
| 1757 | |||
| 1758 | while (atomic_read(&isert_conn->post_send_buf_count)) | ||
| 1759 | msleep(3000); | ||
| 1760 | |||
| 1761 | mutex_lock(&isert_conn->conn_mutex); | ||
| 1762 | isert_conn->state = ISER_CONN_DOWN; | ||
| 1763 | mutex_unlock(&isert_conn->conn_mutex); | ||
| 1764 | |||
| 1765 | complete(&isert_conn->conn_wait_comp_err); | ||
| 1719 | } | 1766 | } |
| 1720 | 1767 | ||
| 1721 | static void | 1768 | static void |
| @@ -1740,8 +1787,14 @@ isert_cq_tx_work(struct work_struct *work) | |||
| 1740 | pr_debug("TX wc.status != IB_WC_SUCCESS >>>>>>>>>>>>>>\n"); | 1787 | pr_debug("TX wc.status != IB_WC_SUCCESS >>>>>>>>>>>>>>\n"); |
| 1741 | pr_debug("TX wc.status: 0x%08x\n", wc.status); | 1788 | pr_debug("TX wc.status: 0x%08x\n", wc.status); |
| 1742 | pr_debug("TX wc.vendor_err: 0x%08x\n", wc.vendor_err); | 1789 | pr_debug("TX wc.vendor_err: 0x%08x\n", wc.vendor_err); |
| 1743 | atomic_dec(&isert_conn->post_send_buf_count); | 1790 | |
| 1744 | isert_cq_comp_err(tx_desc, isert_conn); | 1791 | if (wc.wr_id != ISER_FASTREG_LI_WRID) { |
| 1792 | if (tx_desc->llnode_active) | ||
| 1793 | continue; | ||
| 1794 | |||
| 1795 | atomic_dec(&isert_conn->post_send_buf_count); | ||
| 1796 | isert_cq_tx_comp_err(tx_desc, isert_conn); | ||
| 1797 | } | ||
| 1745 | } | 1798 | } |
| 1746 | } | 1799 | } |
| 1747 | 1800 | ||
| @@ -1784,7 +1837,7 @@ isert_cq_rx_work(struct work_struct *work) | |||
| 1784 | wc.vendor_err); | 1837 | wc.vendor_err); |
| 1785 | } | 1838 | } |
| 1786 | isert_conn->post_recv_buf_count--; | 1839 | isert_conn->post_recv_buf_count--; |
| 1787 | isert_cq_comp_err(NULL, isert_conn); | 1840 | isert_cq_rx_comp_err(isert_conn); |
| 1788 | } | 1841 | } |
| 1789 | } | 1842 | } |
| 1790 | 1843 | ||
| @@ -2202,6 +2255,7 @@ isert_fast_reg_mr(struct fast_reg_descriptor *fr_desc, | |||
| 2202 | 2255 | ||
| 2203 | if (!fr_desc->valid) { | 2256 | if (!fr_desc->valid) { |
| 2204 | memset(&inv_wr, 0, sizeof(inv_wr)); | 2257 | memset(&inv_wr, 0, sizeof(inv_wr)); |
| 2258 | inv_wr.wr_id = ISER_FASTREG_LI_WRID; | ||
| 2205 | inv_wr.opcode = IB_WR_LOCAL_INV; | 2259 | inv_wr.opcode = IB_WR_LOCAL_INV; |
| 2206 | inv_wr.ex.invalidate_rkey = fr_desc->data_mr->rkey; | 2260 | inv_wr.ex.invalidate_rkey = fr_desc->data_mr->rkey; |
| 2207 | wr = &inv_wr; | 2261 | wr = &inv_wr; |
| @@ -2212,6 +2266,7 @@ isert_fast_reg_mr(struct fast_reg_descriptor *fr_desc, | |||
| 2212 | 2266 | ||
| 2213 | /* Prepare FASTREG WR */ | 2267 | /* Prepare FASTREG WR */ |
| 2214 | memset(&fr_wr, 0, sizeof(fr_wr)); | 2268 | memset(&fr_wr, 0, sizeof(fr_wr)); |
| 2269 | fr_wr.wr_id = ISER_FASTREG_LI_WRID; | ||
| 2215 | fr_wr.opcode = IB_WR_FAST_REG_MR; | 2270 | fr_wr.opcode = IB_WR_FAST_REG_MR; |
| 2216 | fr_wr.wr.fast_reg.iova_start = | 2271 | fr_wr.wr.fast_reg.iova_start = |
| 2217 | fr_desc->data_frpl->page_list[0] + page_off; | 2272 | fr_desc->data_frpl->page_list[0] + page_off; |
| @@ -2377,12 +2432,12 @@ isert_put_datain(struct iscsi_conn *conn, struct iscsi_cmd *cmd) | |||
| 2377 | isert_init_send_wr(isert_conn, isert_cmd, | 2432 | isert_init_send_wr(isert_conn, isert_cmd, |
| 2378 | &isert_cmd->tx_desc.send_wr, true); | 2433 | &isert_cmd->tx_desc.send_wr, true); |
| 2379 | 2434 | ||
| 2380 | atomic_inc(&isert_conn->post_send_buf_count); | 2435 | atomic_add(wr->send_wr_num + 1, &isert_conn->post_send_buf_count); |
| 2381 | 2436 | ||
| 2382 | rc = ib_post_send(isert_conn->conn_qp, wr->send_wr, &wr_failed); | 2437 | rc = ib_post_send(isert_conn->conn_qp, wr->send_wr, &wr_failed); |
| 2383 | if (rc) { | 2438 | if (rc) { |
| 2384 | pr_warn("ib_post_send() failed for IB_WR_RDMA_WRITE\n"); | 2439 | pr_warn("ib_post_send() failed for IB_WR_RDMA_WRITE\n"); |
| 2385 | atomic_dec(&isert_conn->post_send_buf_count); | 2440 | atomic_sub(wr->send_wr_num + 1, &isert_conn->post_send_buf_count); |
| 2386 | } | 2441 | } |
| 2387 | pr_debug("Cmd: %p posted RDMA_WRITE + Response for iSER Data READ\n", | 2442 | pr_debug("Cmd: %p posted RDMA_WRITE + Response for iSER Data READ\n", |
| 2388 | isert_cmd); | 2443 | isert_cmd); |
| @@ -2410,12 +2465,12 @@ isert_get_dataout(struct iscsi_conn *conn, struct iscsi_cmd *cmd, bool recovery) | |||
| 2410 | return rc; | 2465 | return rc; |
| 2411 | } | 2466 | } |
| 2412 | 2467 | ||
| 2413 | atomic_inc(&isert_conn->post_send_buf_count); | 2468 | atomic_add(wr->send_wr_num, &isert_conn->post_send_buf_count); |
| 2414 | 2469 | ||
| 2415 | rc = ib_post_send(isert_conn->conn_qp, wr->send_wr, &wr_failed); | 2470 | rc = ib_post_send(isert_conn->conn_qp, wr->send_wr, &wr_failed); |
| 2416 | if (rc) { | 2471 | if (rc) { |
| 2417 | pr_warn("ib_post_send() failed for IB_WR_RDMA_READ\n"); | 2472 | pr_warn("ib_post_send() failed for IB_WR_RDMA_READ\n"); |
| 2418 | atomic_dec(&isert_conn->post_send_buf_count); | 2473 | atomic_sub(wr->send_wr_num, &isert_conn->post_send_buf_count); |
| 2419 | } | 2474 | } |
| 2420 | pr_debug("Cmd: %p posted RDMA_READ memory for ISER Data WRITE\n", | 2475 | pr_debug("Cmd: %p posted RDMA_READ memory for ISER Data WRITE\n", |
| 2421 | isert_cmd); | 2476 | isert_cmd); |
| @@ -2702,22 +2757,11 @@ isert_free_np(struct iscsi_np *np) | |||
| 2702 | kfree(isert_np); | 2757 | kfree(isert_np); |
| 2703 | } | 2758 | } |
| 2704 | 2759 | ||
| 2705 | static int isert_check_state(struct isert_conn *isert_conn, int state) | 2760 | static void isert_wait_conn(struct iscsi_conn *conn) |
| 2706 | { | ||
| 2707 | int ret; | ||
| 2708 | |||
| 2709 | mutex_lock(&isert_conn->conn_mutex); | ||
| 2710 | ret = (isert_conn->state == state); | ||
| 2711 | mutex_unlock(&isert_conn->conn_mutex); | ||
| 2712 | |||
| 2713 | return ret; | ||
| 2714 | } | ||
| 2715 | |||
| 2716 | static void isert_free_conn(struct iscsi_conn *conn) | ||
| 2717 | { | 2761 | { |
| 2718 | struct isert_conn *isert_conn = conn->context; | 2762 | struct isert_conn *isert_conn = conn->context; |
| 2719 | 2763 | ||
| 2720 | pr_debug("isert_free_conn: Starting \n"); | 2764 | pr_debug("isert_wait_conn: Starting \n"); |
| 2721 | /* | 2765 | /* |
| 2722 | * Decrement post_send_buf_count for special case when called | 2766 | * Decrement post_send_buf_count for special case when called |
| 2723 | * from isert_do_control_comp() -> iscsit_logout_post_handler() | 2767 | * from isert_do_control_comp() -> iscsit_logout_post_handler() |
| @@ -2727,38 +2771,29 @@ static void isert_free_conn(struct iscsi_conn *conn) | |||
| 2727 | atomic_dec(&isert_conn->post_send_buf_count); | 2771 | atomic_dec(&isert_conn->post_send_buf_count); |
| 2728 | 2772 | ||
| 2729 | if (isert_conn->conn_cm_id && isert_conn->state != ISER_CONN_DOWN) { | 2773 | if (isert_conn->conn_cm_id && isert_conn->state != ISER_CONN_DOWN) { |
| 2730 | pr_debug("Calling rdma_disconnect from isert_free_conn\n"); | 2774 | pr_debug("Calling rdma_disconnect from isert_wait_conn\n"); |
| 2731 | rdma_disconnect(isert_conn->conn_cm_id); | 2775 | rdma_disconnect(isert_conn->conn_cm_id); |
| 2732 | } | 2776 | } |
| 2733 | /* | 2777 | /* |
| 2734 | * Only wait for conn_wait_comp_err if the isert_conn made it | 2778 | * Only wait for conn_wait_comp_err if the isert_conn made it |
| 2735 | * into full feature phase.. | 2779 | * into full feature phase.. |
| 2736 | */ | 2780 | */ |
| 2737 | if (isert_conn->state == ISER_CONN_UP) { | ||
| 2738 | pr_debug("isert_free_conn: Before wait_event comp_err %d\n", | ||
| 2739 | isert_conn->state); | ||
| 2740 | mutex_unlock(&isert_conn->conn_mutex); | ||
| 2741 | |||
| 2742 | wait_event(isert_conn->conn_wait_comp_err, | ||
| 2743 | (isert_check_state(isert_conn, ISER_CONN_TERMINATING))); | ||
| 2744 | |||
| 2745 | wait_event(isert_conn->conn_wait, | ||
| 2746 | (isert_check_state(isert_conn, ISER_CONN_DOWN))); | ||
| 2747 | |||
| 2748 | isert_put_conn(isert_conn); | ||
| 2749 | return; | ||
| 2750 | } | ||
| 2751 | if (isert_conn->state == ISER_CONN_INIT) { | 2781 | if (isert_conn->state == ISER_CONN_INIT) { |
| 2752 | mutex_unlock(&isert_conn->conn_mutex); | 2782 | mutex_unlock(&isert_conn->conn_mutex); |
| 2753 | isert_put_conn(isert_conn); | ||
| 2754 | return; | 2783 | return; |
| 2755 | } | 2784 | } |
| 2756 | pr_debug("isert_free_conn: wait_event conn_wait %d\n", | 2785 | if (isert_conn->state == ISER_CONN_UP) |
| 2757 | isert_conn->state); | 2786 | isert_conn->state = ISER_CONN_TERMINATING; |
| 2758 | mutex_unlock(&isert_conn->conn_mutex); | 2787 | mutex_unlock(&isert_conn->conn_mutex); |
| 2759 | 2788 | ||
| 2760 | wait_event(isert_conn->conn_wait, | 2789 | wait_for_completion(&isert_conn->conn_wait_comp_err); |
| 2761 | (isert_check_state(isert_conn, ISER_CONN_DOWN))); | 2790 | |
| 2791 | wait_for_completion(&isert_conn->conn_wait); | ||
| 2792 | } | ||
| 2793 | |||
| 2794 | static void isert_free_conn(struct iscsi_conn *conn) | ||
| 2795 | { | ||
| 2796 | struct isert_conn *isert_conn = conn->context; | ||
| 2762 | 2797 | ||
| 2763 | isert_put_conn(isert_conn); | 2798 | isert_put_conn(isert_conn); |
| 2764 | } | 2799 | } |
| @@ -2771,6 +2806,7 @@ static struct iscsit_transport iser_target_transport = { | |||
| 2771 | .iscsit_setup_np = isert_setup_np, | 2806 | .iscsit_setup_np = isert_setup_np, |
| 2772 | .iscsit_accept_np = isert_accept_np, | 2807 | .iscsit_accept_np = isert_accept_np, |
| 2773 | .iscsit_free_np = isert_free_np, | 2808 | .iscsit_free_np = isert_free_np, |
| 2809 | .iscsit_wait_conn = isert_wait_conn, | ||
| 2774 | .iscsit_free_conn = isert_free_conn, | 2810 | .iscsit_free_conn = isert_free_conn, |
| 2775 | .iscsit_get_login_rx = isert_get_login_rx, | 2811 | .iscsit_get_login_rx = isert_get_login_rx, |
| 2776 | .iscsit_put_login_tx = isert_put_login_tx, | 2812 | .iscsit_put_login_tx = isert_put_login_tx, |
diff --git a/drivers/infiniband/ulp/isert/ib_isert.h b/drivers/infiniband/ulp/isert/ib_isert.h index 708a069002f3..f6ae7f5dd408 100644 --- a/drivers/infiniband/ulp/isert/ib_isert.h +++ b/drivers/infiniband/ulp/isert/ib_isert.h | |||
| @@ -6,6 +6,7 @@ | |||
| 6 | 6 | ||
| 7 | #define ISERT_RDMA_LISTEN_BACKLOG 10 | 7 | #define ISERT_RDMA_LISTEN_BACKLOG 10 |
| 8 | #define ISCSI_ISER_SG_TABLESIZE 256 | 8 | #define ISCSI_ISER_SG_TABLESIZE 256 |
| 9 | #define ISER_FASTREG_LI_WRID 0xffffffffffffffffULL | ||
| 9 | 10 | ||
| 10 | enum isert_desc_type { | 11 | enum isert_desc_type { |
| 11 | ISCSI_TX_CONTROL, | 12 | ISCSI_TX_CONTROL, |
| @@ -45,6 +46,7 @@ struct iser_tx_desc { | |||
| 45 | struct isert_cmd *isert_cmd; | 46 | struct isert_cmd *isert_cmd; |
| 46 | struct llist_node *comp_llnode_batch; | 47 | struct llist_node *comp_llnode_batch; |
| 47 | struct llist_node comp_llnode; | 48 | struct llist_node comp_llnode; |
| 49 | bool llnode_active; | ||
| 48 | struct ib_send_wr send_wr; | 50 | struct ib_send_wr send_wr; |
| 49 | } __packed; | 51 | } __packed; |
| 50 | 52 | ||
| @@ -116,8 +118,8 @@ struct isert_conn { | |||
| 116 | struct isert_device *conn_device; | 118 | struct isert_device *conn_device; |
| 117 | struct work_struct conn_logout_work; | 119 | struct work_struct conn_logout_work; |
| 118 | struct mutex conn_mutex; | 120 | struct mutex conn_mutex; |
| 119 | wait_queue_head_t conn_wait; | 121 | struct completion conn_wait; |
| 120 | wait_queue_head_t conn_wait_comp_err; | 122 | struct completion conn_wait_comp_err; |
| 121 | struct kref conn_kref; | 123 | struct kref conn_kref; |
| 122 | struct list_head conn_fr_pool; | 124 | struct list_head conn_fr_pool; |
| 123 | int conn_fr_pool_size; | 125 | int conn_fr_pool_size; |
| @@ -126,7 +128,6 @@ struct isert_conn { | |||
| 126 | #define ISERT_COMP_BATCH_COUNT 8 | 128 | #define ISERT_COMP_BATCH_COUNT 8 |
| 127 | int conn_comp_batch; | 129 | int conn_comp_batch; |
| 128 | struct llist_head conn_comp_llist; | 130 | struct llist_head conn_comp_llist; |
| 129 | struct mutex conn_comp_mutex; | ||
| 130 | }; | 131 | }; |
| 131 | 132 | ||
| 132 | #define ISERT_MAX_CQ 64 | 133 | #define ISERT_MAX_CQ 64 |
diff --git a/drivers/input/misc/arizona-haptics.c b/drivers/input/misc/arizona-haptics.c index 7a04f54ef961..ef2e281b0a43 100644 --- a/drivers/input/misc/arizona-haptics.c +++ b/drivers/input/misc/arizona-haptics.c | |||
| @@ -37,7 +37,6 @@ static void arizona_haptics_work(struct work_struct *work) | |||
| 37 | struct arizona_haptics, | 37 | struct arizona_haptics, |
| 38 | work); | 38 | work); |
| 39 | struct arizona *arizona = haptics->arizona; | 39 | struct arizona *arizona = haptics->arizona; |
| 40 | struct mutex *dapm_mutex = &arizona->dapm->card->dapm_mutex; | ||
| 41 | int ret; | 40 | int ret; |
| 42 | 41 | ||
| 43 | if (!haptics->arizona->dapm) { | 42 | if (!haptics->arizona->dapm) { |
| @@ -67,13 +66,10 @@ static void arizona_haptics_work(struct work_struct *work) | |||
| 67 | return; | 66 | return; |
| 68 | } | 67 | } |
| 69 | 68 | ||
| 70 | mutex_lock_nested(dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); | ||
| 71 | |||
| 72 | ret = snd_soc_dapm_enable_pin(arizona->dapm, "HAPTICS"); | 69 | ret = snd_soc_dapm_enable_pin(arizona->dapm, "HAPTICS"); |
| 73 | if (ret != 0) { | 70 | if (ret != 0) { |
| 74 | dev_err(arizona->dev, "Failed to start HAPTICS: %d\n", | 71 | dev_err(arizona->dev, "Failed to start HAPTICS: %d\n", |
| 75 | ret); | 72 | ret); |
| 76 | mutex_unlock(dapm_mutex); | ||
| 77 | return; | 73 | return; |
| 78 | } | 74 | } |
| 79 | 75 | ||
| @@ -81,21 +77,14 @@ static void arizona_haptics_work(struct work_struct *work) | |||
| 81 | if (ret != 0) { | 77 | if (ret != 0) { |
| 82 | dev_err(arizona->dev, "Failed to sync DAPM: %d\n", | 78 | dev_err(arizona->dev, "Failed to sync DAPM: %d\n", |
| 83 | ret); | 79 | ret); |
| 84 | mutex_unlock(dapm_mutex); | ||
| 85 | return; | 80 | return; |
| 86 | } | 81 | } |
| 87 | |||
| 88 | mutex_unlock(dapm_mutex); | ||
| 89 | |||
| 90 | } else { | 82 | } else { |
| 91 | /* This disable sequence will be a noop if already enabled */ | 83 | /* This disable sequence will be a noop if already enabled */ |
| 92 | mutex_lock_nested(dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); | ||
| 93 | |||
| 94 | ret = snd_soc_dapm_disable_pin(arizona->dapm, "HAPTICS"); | 84 | ret = snd_soc_dapm_disable_pin(arizona->dapm, "HAPTICS"); |
| 95 | if (ret != 0) { | 85 | if (ret != 0) { |
| 96 | dev_err(arizona->dev, "Failed to disable HAPTICS: %d\n", | 86 | dev_err(arizona->dev, "Failed to disable HAPTICS: %d\n", |
| 97 | ret); | 87 | ret); |
| 98 | mutex_unlock(dapm_mutex); | ||
| 99 | return; | 88 | return; |
| 100 | } | 89 | } |
| 101 | 90 | ||
| @@ -103,12 +92,9 @@ static void arizona_haptics_work(struct work_struct *work) | |||
| 103 | if (ret != 0) { | 92 | if (ret != 0) { |
| 104 | dev_err(arizona->dev, "Failed to sync DAPM: %d\n", | 93 | dev_err(arizona->dev, "Failed to sync DAPM: %d\n", |
| 105 | ret); | 94 | ret); |
| 106 | mutex_unlock(dapm_mutex); | ||
| 107 | return; | 95 | return; |
| 108 | } | 96 | } |
| 109 | 97 | ||
| 110 | mutex_unlock(dapm_mutex); | ||
| 111 | |||
| 112 | ret = regmap_update_bits(arizona->regmap, | 98 | ret = regmap_update_bits(arizona->regmap, |
| 113 | ARIZONA_HAPTICS_CONTROL_1, | 99 | ARIZONA_HAPTICS_CONTROL_1, |
| 114 | ARIZONA_HAP_CTRL_MASK, | 100 | ARIZONA_HAP_CTRL_MASK, |
| @@ -155,16 +141,11 @@ static int arizona_haptics_play(struct input_dev *input, void *data, | |||
| 155 | static void arizona_haptics_close(struct input_dev *input) | 141 | static void arizona_haptics_close(struct input_dev *input) |
| 156 | { | 142 | { |
| 157 | struct arizona_haptics *haptics = input_get_drvdata(input); | 143 | struct arizona_haptics *haptics = input_get_drvdata(input); |
| 158 | struct mutex *dapm_mutex = &haptics->arizona->dapm->card->dapm_mutex; | ||
| 159 | 144 | ||
| 160 | cancel_work_sync(&haptics->work); | 145 | cancel_work_sync(&haptics->work); |
| 161 | 146 | ||
| 162 | mutex_lock_nested(dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); | ||
| 163 | |||
| 164 | if (haptics->arizona->dapm) | 147 | if (haptics->arizona->dapm) |
| 165 | snd_soc_dapm_disable_pin(haptics->arizona->dapm, "HAPTICS"); | 148 | snd_soc_dapm_disable_pin(haptics->arizona->dapm, "HAPTICS"); |
| 166 | |||
| 167 | mutex_unlock(dapm_mutex); | ||
| 168 | } | 149 | } |
| 169 | 150 | ||
| 170 | static int arizona_haptics_probe(struct platform_device *pdev) | 151 | static int arizona_haptics_probe(struct platform_device *pdev) |
diff --git a/drivers/irqchip/irq-metag-ext.c b/drivers/irqchip/irq-metag-ext.c index 92c41ab4dbfd..2cb474ad8809 100644 --- a/drivers/irqchip/irq-metag-ext.c +++ b/drivers/irqchip/irq-metag-ext.c | |||
| @@ -515,7 +515,7 @@ static int meta_intc_set_affinity(struct irq_data *data, | |||
| 515 | * one cpu (the interrupt code doesn't support it), so we just | 515 | * one cpu (the interrupt code doesn't support it), so we just |
| 516 | * pick the first cpu we find in 'cpumask'. | 516 | * pick the first cpu we find in 'cpumask'. |
| 517 | */ | 517 | */ |
| 518 | cpu = cpumask_any(cpumask); | 518 | cpu = cpumask_any_and(cpumask, cpu_online_mask); |
| 519 | thread = cpu_2_hwthread_id[cpu]; | 519 | thread = cpu_2_hwthread_id[cpu]; |
| 520 | 520 | ||
| 521 | metag_out32(TBI_TRIG_VEC(TBID_SIGNUM_TR2(thread)), vec_addr); | 521 | metag_out32(TBI_TRIG_VEC(TBID_SIGNUM_TR2(thread)), vec_addr); |
diff --git a/drivers/irqchip/irq-metag.c b/drivers/irqchip/irq-metag.c index 8e94d7a3b20d..c16c186d97d3 100644 --- a/drivers/irqchip/irq-metag.c +++ b/drivers/irqchip/irq-metag.c | |||
| @@ -201,7 +201,7 @@ static int metag_internal_irq_set_affinity(struct irq_data *data, | |||
| 201 | * one cpu (the interrupt code doesn't support it), so we just | 201 | * one cpu (the interrupt code doesn't support it), so we just |
| 202 | * pick the first cpu we find in 'cpumask'. | 202 | * pick the first cpu we find in 'cpumask'. |
| 203 | */ | 203 | */ |
| 204 | cpu = cpumask_any(cpumask); | 204 | cpu = cpumask_any_and(cpumask, cpu_online_mask); |
| 205 | thread = cpu_2_hwthread_id[cpu]; | 205 | thread = cpu_2_hwthread_id[cpu]; |
| 206 | 206 | ||
| 207 | metag_out32(TBI_TRIG_VEC(TBID_SIGNUM_TR1(thread)), | 207 | metag_out32(TBI_TRIG_VEC(TBID_SIGNUM_TR1(thread)), |
diff --git a/drivers/md/Kconfig b/drivers/md/Kconfig index 9a06fe883766..95ad936e6048 100644 --- a/drivers/md/Kconfig +++ b/drivers/md/Kconfig | |||
| @@ -254,16 +254,6 @@ config DM_THIN_PROVISIONING | |||
| 254 | ---help--- | 254 | ---help--- |
| 255 | Provides thin provisioning and snapshots that share a data store. | 255 | Provides thin provisioning and snapshots that share a data store. |
| 256 | 256 | ||
| 257 | config DM_DEBUG_BLOCK_STACK_TRACING | ||
| 258 | boolean "Keep stack trace of persistent data block lock holders" | ||
| 259 | depends on STACKTRACE_SUPPORT && DM_PERSISTENT_DATA | ||
| 260 | select STACKTRACE | ||
| 261 | ---help--- | ||
| 262 | Enable this for messages that may help debug problems with the | ||
| 263 | block manager locking used by thin provisioning and caching. | ||
| 264 | |||
| 265 | If unsure, say N. | ||
| 266 | |||
| 267 | config DM_CACHE | 257 | config DM_CACHE |
| 268 | tristate "Cache target (EXPERIMENTAL)" | 258 | tristate "Cache target (EXPERIMENTAL)" |
| 269 | depends on BLK_DEV_DM | 259 | depends on BLK_DEV_DM |
diff --git a/drivers/md/dm-cache-policy-mq.c b/drivers/md/dm-cache-policy-mq.c index 1e018e986610..0e385e40909e 100644 --- a/drivers/md/dm-cache-policy-mq.c +++ b/drivers/md/dm-cache-policy-mq.c | |||
| @@ -872,7 +872,7 @@ static void mq_destroy(struct dm_cache_policy *p) | |||
| 872 | { | 872 | { |
| 873 | struct mq_policy *mq = to_mq_policy(p); | 873 | struct mq_policy *mq = to_mq_policy(p); |
| 874 | 874 | ||
| 875 | kfree(mq->table); | 875 | vfree(mq->table); |
| 876 | epool_exit(&mq->cache_pool); | 876 | epool_exit(&mq->cache_pool); |
| 877 | epool_exit(&mq->pre_cache_pool); | 877 | epool_exit(&mq->pre_cache_pool); |
| 878 | kfree(mq); | 878 | kfree(mq); |
| @@ -1245,7 +1245,7 @@ static struct dm_cache_policy *mq_create(dm_cblock_t cache_size, | |||
| 1245 | 1245 | ||
| 1246 | mq->nr_buckets = next_power(from_cblock(cache_size) / 2, 16); | 1246 | mq->nr_buckets = next_power(from_cblock(cache_size) / 2, 16); |
| 1247 | mq->hash_bits = ffs(mq->nr_buckets) - 1; | 1247 | mq->hash_bits = ffs(mq->nr_buckets) - 1; |
| 1248 | mq->table = kzalloc(sizeof(*mq->table) * mq->nr_buckets, GFP_KERNEL); | 1248 | mq->table = vzalloc(sizeof(*mq->table) * mq->nr_buckets); |
| 1249 | if (!mq->table) | 1249 | if (!mq->table) |
| 1250 | goto bad_alloc_table; | 1250 | goto bad_alloc_table; |
| 1251 | 1251 | ||
diff --git a/drivers/md/dm-cache-target.c b/drivers/md/dm-cache-target.c index ffd472e015ca..1af70145fab9 100644 --- a/drivers/md/dm-cache-target.c +++ b/drivers/md/dm-cache-target.c | |||
| @@ -289,6 +289,7 @@ struct per_bio_data { | |||
| 289 | bool tick:1; | 289 | bool tick:1; |
| 290 | unsigned req_nr:2; | 290 | unsigned req_nr:2; |
| 291 | struct dm_deferred_entry *all_io_entry; | 291 | struct dm_deferred_entry *all_io_entry; |
| 292 | struct dm_hook_info hook_info; | ||
| 292 | 293 | ||
| 293 | /* | 294 | /* |
| 294 | * writethrough fields. These MUST remain at the end of this | 295 | * writethrough fields. These MUST remain at the end of this |
| @@ -297,7 +298,6 @@ struct per_bio_data { | |||
| 297 | */ | 298 | */ |
| 298 | struct cache *cache; | 299 | struct cache *cache; |
| 299 | dm_cblock_t cblock; | 300 | dm_cblock_t cblock; |
| 300 | struct dm_hook_info hook_info; | ||
| 301 | struct dm_bio_details bio_details; | 301 | struct dm_bio_details bio_details; |
| 302 | }; | 302 | }; |
| 303 | 303 | ||
| @@ -671,15 +671,16 @@ static void remap_to_cache(struct cache *cache, struct bio *bio, | |||
| 671 | dm_cblock_t cblock) | 671 | dm_cblock_t cblock) |
| 672 | { | 672 | { |
| 673 | sector_t bi_sector = bio->bi_iter.bi_sector; | 673 | sector_t bi_sector = bio->bi_iter.bi_sector; |
| 674 | sector_t block = from_cblock(cblock); | ||
| 674 | 675 | ||
| 675 | bio->bi_bdev = cache->cache_dev->bdev; | 676 | bio->bi_bdev = cache->cache_dev->bdev; |
| 676 | if (!block_size_is_power_of_two(cache)) | 677 | if (!block_size_is_power_of_two(cache)) |
| 677 | bio->bi_iter.bi_sector = | 678 | bio->bi_iter.bi_sector = |
| 678 | (from_cblock(cblock) * cache->sectors_per_block) + | 679 | (block * cache->sectors_per_block) + |
| 679 | sector_div(bi_sector, cache->sectors_per_block); | 680 | sector_div(bi_sector, cache->sectors_per_block); |
| 680 | else | 681 | else |
| 681 | bio->bi_iter.bi_sector = | 682 | bio->bi_iter.bi_sector = |
| 682 | (from_cblock(cblock) << cache->sectors_per_block_shift) | | 683 | (block << cache->sectors_per_block_shift) | |
| 683 | (bi_sector & (cache->sectors_per_block - 1)); | 684 | (bi_sector & (cache->sectors_per_block - 1)); |
| 684 | } | 685 | } |
| 685 | 686 | ||
| @@ -1010,13 +1011,15 @@ static void overwrite_endio(struct bio *bio, int err) | |||
| 1010 | struct per_bio_data *pb = get_per_bio_data(bio, pb_data_size); | 1011 | struct per_bio_data *pb = get_per_bio_data(bio, pb_data_size); |
| 1011 | unsigned long flags; | 1012 | unsigned long flags; |
| 1012 | 1013 | ||
| 1014 | dm_unhook_bio(&pb->hook_info, bio); | ||
| 1015 | |||
| 1013 | if (err) | 1016 | if (err) |
| 1014 | mg->err = true; | 1017 | mg->err = true; |
| 1015 | 1018 | ||
| 1019 | mg->requeue_holder = false; | ||
| 1020 | |||
| 1016 | spin_lock_irqsave(&cache->lock, flags); | 1021 | spin_lock_irqsave(&cache->lock, flags); |
| 1017 | list_add_tail(&mg->list, &cache->completed_migrations); | 1022 | list_add_tail(&mg->list, &cache->completed_migrations); |
| 1018 | dm_unhook_bio(&pb->hook_info, bio); | ||
| 1019 | mg->requeue_holder = false; | ||
| 1020 | spin_unlock_irqrestore(&cache->lock, flags); | 1023 | spin_unlock_irqrestore(&cache->lock, flags); |
| 1021 | 1024 | ||
| 1022 | wake_worker(cache); | 1025 | wake_worker(cache); |
diff --git a/drivers/md/dm-io.c b/drivers/md/dm-io.c index b2b8a10e8427..3842ac738f98 100644 --- a/drivers/md/dm-io.c +++ b/drivers/md/dm-io.c | |||
| @@ -201,29 +201,28 @@ static void list_dp_init(struct dpages *dp, struct page_list *pl, unsigned offse | |||
| 201 | /* | 201 | /* |
| 202 | * Functions for getting the pages from a bvec. | 202 | * Functions for getting the pages from a bvec. |
| 203 | */ | 203 | */ |
| 204 | static void bio_get_page(struct dpages *dp, | 204 | static void bio_get_page(struct dpages *dp, struct page **p, |
| 205 | struct page **p, unsigned long *len, unsigned *offset) | 205 | unsigned long *len, unsigned *offset) |
| 206 | { | 206 | { |
| 207 | struct bio *bio = dp->context_ptr; | 207 | struct bio_vec *bvec = dp->context_ptr; |
| 208 | struct bio_vec bvec = bio_iovec(bio); | 208 | *p = bvec->bv_page; |
| 209 | *p = bvec.bv_page; | 209 | *len = bvec->bv_len - dp->context_u; |
| 210 | *len = bvec.bv_len; | 210 | *offset = bvec->bv_offset + dp->context_u; |
| 211 | *offset = bvec.bv_offset; | ||
| 212 | } | 211 | } |
| 213 | 212 | ||
| 214 | static void bio_next_page(struct dpages *dp) | 213 | static void bio_next_page(struct dpages *dp) |
| 215 | { | 214 | { |
| 216 | struct bio *bio = dp->context_ptr; | 215 | struct bio_vec *bvec = dp->context_ptr; |
| 217 | struct bio_vec bvec = bio_iovec(bio); | 216 | dp->context_ptr = bvec + 1; |
| 218 | 217 | dp->context_u = 0; | |
| 219 | bio_advance(bio, bvec.bv_len); | ||
| 220 | } | 218 | } |
| 221 | 219 | ||
| 222 | static void bio_dp_init(struct dpages *dp, struct bio *bio) | 220 | static void bio_dp_init(struct dpages *dp, struct bio *bio) |
| 223 | { | 221 | { |
| 224 | dp->get_page = bio_get_page; | 222 | dp->get_page = bio_get_page; |
| 225 | dp->next_page = bio_next_page; | 223 | dp->next_page = bio_next_page; |
| 226 | dp->context_ptr = bio; | 224 | dp->context_ptr = __bvec_iter_bvec(bio->bi_io_vec, bio->bi_iter); |
| 225 | dp->context_u = bio->bi_iter.bi_bvec_done; | ||
| 227 | } | 226 | } |
| 228 | 227 | ||
| 229 | /* | 228 | /* |
diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c index 6eb9dc9ef8f3..422a9fdeb53e 100644 --- a/drivers/md/dm-mpath.c +++ b/drivers/md/dm-mpath.c | |||
| @@ -1626,8 +1626,11 @@ static int multipath_ioctl(struct dm_target *ti, unsigned int cmd, | |||
| 1626 | /* | 1626 | /* |
| 1627 | * Only pass ioctls through if the device sizes match exactly. | 1627 | * Only pass ioctls through if the device sizes match exactly. |
| 1628 | */ | 1628 | */ |
| 1629 | if (!r && ti->len != i_size_read(bdev->bd_inode) >> SECTOR_SHIFT) | 1629 | if (!bdev || ti->len != i_size_read(bdev->bd_inode) >> SECTOR_SHIFT) { |
| 1630 | r = scsi_verify_blk_ioctl(NULL, cmd); | 1630 | int err = scsi_verify_blk_ioctl(NULL, cmd); |
| 1631 | if (err) | ||
| 1632 | r = err; | ||
| 1633 | } | ||
| 1631 | 1634 | ||
| 1632 | if (r == -ENOTCONN && !fatal_signal_pending(current)) | 1635 | if (r == -ENOTCONN && !fatal_signal_pending(current)) |
| 1633 | queue_work(kmultipathd, &m->process_queued_ios); | 1636 | queue_work(kmultipathd, &m->process_queued_ios); |
diff --git a/drivers/md/dm-raid1.c b/drivers/md/dm-raid1.c index f284e0bfb25f..7dfdb5c746d6 100644 --- a/drivers/md/dm-raid1.c +++ b/drivers/md/dm-raid1.c | |||
| @@ -1244,6 +1244,9 @@ static int mirror_end_io(struct dm_target *ti, struct bio *bio, int error) | |||
| 1244 | 1244 | ||
| 1245 | dm_bio_restore(bd, bio); | 1245 | dm_bio_restore(bd, bio); |
| 1246 | bio_record->details.bi_bdev = NULL; | 1246 | bio_record->details.bi_bdev = NULL; |
| 1247 | |||
| 1248 | atomic_inc(&bio->bi_remaining); | ||
| 1249 | |||
| 1247 | queue_bio(ms, bio, rw); | 1250 | queue_bio(ms, bio, rw); |
| 1248 | return DM_ENDIO_INCOMPLETE; | 1251 | return DM_ENDIO_INCOMPLETE; |
| 1249 | } | 1252 | } |
diff --git a/drivers/md/dm-snap-persistent.c b/drivers/md/dm-snap-persistent.c index afc3d017de4c..d6e88178d22c 100644 --- a/drivers/md/dm-snap-persistent.c +++ b/drivers/md/dm-snap-persistent.c | |||
| @@ -546,6 +546,9 @@ static int read_exceptions(struct pstore *ps, | |||
| 546 | r = insert_exceptions(ps, area, callback, callback_context, | 546 | r = insert_exceptions(ps, area, callback, callback_context, |
| 547 | &full); | 547 | &full); |
| 548 | 548 | ||
| 549 | if (!full) | ||
| 550 | memcpy(ps->area, area, ps->store->chunk_size << SECTOR_SHIFT); | ||
| 551 | |||
| 549 | dm_bufio_release(bp); | 552 | dm_bufio_release(bp); |
| 550 | 553 | ||
| 551 | dm_bufio_forget(client, chunk); | 554 | dm_bufio_forget(client, chunk); |
diff --git a/drivers/md/dm-thin-metadata.c b/drivers/md/dm-thin-metadata.c index 7da347665552..fb9efc829182 100644 --- a/drivers/md/dm-thin-metadata.c +++ b/drivers/md/dm-thin-metadata.c | |||
| @@ -76,7 +76,7 @@ | |||
| 76 | 76 | ||
| 77 | #define THIN_SUPERBLOCK_MAGIC 27022010 | 77 | #define THIN_SUPERBLOCK_MAGIC 27022010 |
| 78 | #define THIN_SUPERBLOCK_LOCATION 0 | 78 | #define THIN_SUPERBLOCK_LOCATION 0 |
| 79 | #define THIN_VERSION 1 | 79 | #define THIN_VERSION 2 |
| 80 | #define THIN_METADATA_CACHE_SIZE 64 | 80 | #define THIN_METADATA_CACHE_SIZE 64 |
| 81 | #define SECTOR_TO_BLOCK_SHIFT 3 | 81 | #define SECTOR_TO_BLOCK_SHIFT 3 |
| 82 | 82 | ||
| @@ -483,7 +483,7 @@ static int __write_initial_superblock(struct dm_pool_metadata *pmd) | |||
| 483 | 483 | ||
| 484 | disk_super->data_mapping_root = cpu_to_le64(pmd->root); | 484 | disk_super->data_mapping_root = cpu_to_le64(pmd->root); |
| 485 | disk_super->device_details_root = cpu_to_le64(pmd->details_root); | 485 | disk_super->device_details_root = cpu_to_le64(pmd->details_root); |
| 486 | disk_super->metadata_block_size = cpu_to_le32(THIN_METADATA_BLOCK_SIZE >> SECTOR_SHIFT); | 486 | disk_super->metadata_block_size = cpu_to_le32(THIN_METADATA_BLOCK_SIZE); |
| 487 | disk_super->metadata_nr_blocks = cpu_to_le64(bdev_size >> SECTOR_TO_BLOCK_SHIFT); | 487 | disk_super->metadata_nr_blocks = cpu_to_le64(bdev_size >> SECTOR_TO_BLOCK_SHIFT); |
| 488 | disk_super->data_block_size = cpu_to_le32(pmd->data_block_size); | 488 | disk_super->data_block_size = cpu_to_le32(pmd->data_block_size); |
| 489 | 489 | ||
| @@ -651,7 +651,7 @@ static int __create_persistent_data_objects(struct dm_pool_metadata *pmd, bool f | |||
| 651 | { | 651 | { |
| 652 | int r; | 652 | int r; |
| 653 | 653 | ||
| 654 | pmd->bm = dm_block_manager_create(pmd->bdev, THIN_METADATA_BLOCK_SIZE, | 654 | pmd->bm = dm_block_manager_create(pmd->bdev, THIN_METADATA_BLOCK_SIZE << SECTOR_SHIFT, |
| 655 | THIN_METADATA_CACHE_SIZE, | 655 | THIN_METADATA_CACHE_SIZE, |
| 656 | THIN_MAX_CONCURRENT_LOCKS); | 656 | THIN_MAX_CONCURRENT_LOCKS); |
| 657 | if (IS_ERR(pmd->bm)) { | 657 | if (IS_ERR(pmd->bm)) { |
| @@ -1489,6 +1489,23 @@ bool dm_thin_changed_this_transaction(struct dm_thin_device *td) | |||
| 1489 | return r; | 1489 | return r; |
| 1490 | } | 1490 | } |
| 1491 | 1491 | ||
| 1492 | bool dm_pool_changed_this_transaction(struct dm_pool_metadata *pmd) | ||
| 1493 | { | ||
| 1494 | bool r = false; | ||
| 1495 | struct dm_thin_device *td, *tmp; | ||
| 1496 | |||
| 1497 | down_read(&pmd->root_lock); | ||
| 1498 | list_for_each_entry_safe(td, tmp, &pmd->thin_devices, list) { | ||
| 1499 | if (td->changed) { | ||
| 1500 | r = td->changed; | ||
| 1501 | break; | ||
| 1502 | } | ||
| 1503 | } | ||
| 1504 | up_read(&pmd->root_lock); | ||
| 1505 | |||
| 1506 | return r; | ||
| 1507 | } | ||
| 1508 | |||
| 1492 | bool dm_thin_aborted_changes(struct dm_thin_device *td) | 1509 | bool dm_thin_aborted_changes(struct dm_thin_device *td) |
| 1493 | { | 1510 | { |
| 1494 | bool r; | 1511 | bool r; |
| @@ -1738,3 +1755,38 @@ int dm_pool_register_metadata_threshold(struct dm_pool_metadata *pmd, | |||
| 1738 | 1755 | ||
| 1739 | return r; | 1756 | return r; |
| 1740 | } | 1757 | } |
| 1758 | |||
| 1759 | int dm_pool_metadata_set_needs_check(struct dm_pool_metadata *pmd) | ||
| 1760 | { | ||
| 1761 | int r; | ||
| 1762 | struct dm_block *sblock; | ||
| 1763 | struct thin_disk_superblock *disk_super; | ||
| 1764 | |||
| 1765 | down_write(&pmd->root_lock); | ||
| 1766 | pmd->flags |= THIN_METADATA_NEEDS_CHECK_FLAG; | ||
| 1767 | |||
| 1768 | r = superblock_lock(pmd, &sblock); | ||
| 1769 | if (r) { | ||
| 1770 | DMERR("couldn't read superblock"); | ||
| 1771 | goto out; | ||
| 1772 | } | ||
| 1773 | |||
| 1774 | disk_super = dm_block_data(sblock); | ||
| 1775 | disk_super->flags = cpu_to_le32(pmd->flags); | ||
| 1776 | |||
| 1777 | dm_bm_unlock(sblock); | ||
| 1778 | out: | ||
| 1779 | up_write(&pmd->root_lock); | ||
| 1780 | return r; | ||
| 1781 | } | ||
| 1782 | |||
| 1783 | bool dm_pool_metadata_needs_check(struct dm_pool_metadata *pmd) | ||
| 1784 | { | ||
| 1785 | bool needs_check; | ||
| 1786 | |||
| 1787 | down_read(&pmd->root_lock); | ||
| 1788 | needs_check = pmd->flags & THIN_METADATA_NEEDS_CHECK_FLAG; | ||
| 1789 | up_read(&pmd->root_lock); | ||
| 1790 | |||
| 1791 | return needs_check; | ||
| 1792 | } | ||
diff --git a/drivers/md/dm-thin-metadata.h b/drivers/md/dm-thin-metadata.h index 9a368567632f..e3c857db195a 100644 --- a/drivers/md/dm-thin-metadata.h +++ b/drivers/md/dm-thin-metadata.h | |||
| @@ -9,16 +9,14 @@ | |||
| 9 | 9 | ||
| 10 | #include "persistent-data/dm-block-manager.h" | 10 | #include "persistent-data/dm-block-manager.h" |
| 11 | #include "persistent-data/dm-space-map.h" | 11 | #include "persistent-data/dm-space-map.h" |
| 12 | #include "persistent-data/dm-space-map-metadata.h" | ||
| 12 | 13 | ||
| 13 | #define THIN_METADATA_BLOCK_SIZE 4096 | 14 | #define THIN_METADATA_BLOCK_SIZE DM_SM_METADATA_BLOCK_SIZE |
| 14 | 15 | ||
| 15 | /* | 16 | /* |
| 16 | * The metadata device is currently limited in size. | 17 | * The metadata device is currently limited in size. |
| 17 | * | ||
| 18 | * We have one block of index, which can hold 255 index entries. Each | ||
| 19 | * index entry contains allocation info about 16k metadata blocks. | ||
| 20 | */ | 18 | */ |
| 21 | #define THIN_METADATA_MAX_SECTORS (255 * (1 << 14) * (THIN_METADATA_BLOCK_SIZE / (1 << SECTOR_SHIFT))) | 19 | #define THIN_METADATA_MAX_SECTORS DM_SM_METADATA_MAX_SECTORS |
| 22 | 20 | ||
| 23 | /* | 21 | /* |
| 24 | * A metadata device larger than 16GB triggers a warning. | 22 | * A metadata device larger than 16GB triggers a warning. |
| @@ -27,6 +25,11 @@ | |||
| 27 | 25 | ||
| 28 | /*----------------------------------------------------------------*/ | 26 | /*----------------------------------------------------------------*/ |
| 29 | 27 | ||
| 28 | /* | ||
| 29 | * Thin metadata superblock flags. | ||
| 30 | */ | ||
| 31 | #define THIN_METADATA_NEEDS_CHECK_FLAG (1 << 0) | ||
| 32 | |||
| 30 | struct dm_pool_metadata; | 33 | struct dm_pool_metadata; |
| 31 | struct dm_thin_device; | 34 | struct dm_thin_device; |
| 32 | 35 | ||
| @@ -161,6 +164,8 @@ int dm_thin_remove_block(struct dm_thin_device *td, dm_block_t block); | |||
| 161 | */ | 164 | */ |
| 162 | bool dm_thin_changed_this_transaction(struct dm_thin_device *td); | 165 | bool dm_thin_changed_this_transaction(struct dm_thin_device *td); |
| 163 | 166 | ||
| 167 | bool dm_pool_changed_this_transaction(struct dm_pool_metadata *pmd); | ||
| 168 | |||
| 164 | bool dm_thin_aborted_changes(struct dm_thin_device *td); | 169 | bool dm_thin_aborted_changes(struct dm_thin_device *td); |
| 165 | 170 | ||
| 166 | int dm_thin_get_highest_mapped_block(struct dm_thin_device *td, | 171 | int dm_thin_get_highest_mapped_block(struct dm_thin_device *td, |
| @@ -202,6 +207,12 @@ int dm_pool_register_metadata_threshold(struct dm_pool_metadata *pmd, | |||
| 202 | dm_sm_threshold_fn fn, | 207 | dm_sm_threshold_fn fn, |
| 203 | void *context); | 208 | void *context); |
| 204 | 209 | ||
| 210 | /* | ||
| 211 | * Updates the superblock immediately. | ||
| 212 | */ | ||
| 213 | int dm_pool_metadata_set_needs_check(struct dm_pool_metadata *pmd); | ||
| 214 | bool dm_pool_metadata_needs_check(struct dm_pool_metadata *pmd); | ||
| 215 | |||
| 205 | /*----------------------------------------------------------------*/ | 216 | /*----------------------------------------------------------------*/ |
| 206 | 217 | ||
| 207 | #endif | 218 | #endif |
diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c index faaf944597ab..be70d38745f7 100644 --- a/drivers/md/dm-thin.c +++ b/drivers/md/dm-thin.c | |||
| @@ -130,10 +130,11 @@ static void build_virtual_key(struct dm_thin_device *td, dm_block_t b, | |||
| 130 | struct dm_thin_new_mapping; | 130 | struct dm_thin_new_mapping; |
| 131 | 131 | ||
| 132 | /* | 132 | /* |
| 133 | * The pool runs in 3 modes. Ordered in degraded order for comparisons. | 133 | * The pool runs in 4 modes. Ordered in degraded order for comparisons. |
| 134 | */ | 134 | */ |
| 135 | enum pool_mode { | 135 | enum pool_mode { |
| 136 | PM_WRITE, /* metadata may be changed */ | 136 | PM_WRITE, /* metadata may be changed */ |
| 137 | PM_OUT_OF_DATA_SPACE, /* metadata may be changed, though data may not be allocated */ | ||
| 137 | PM_READ_ONLY, /* metadata may not be changed */ | 138 | PM_READ_ONLY, /* metadata may not be changed */ |
| 138 | PM_FAIL, /* all I/O fails */ | 139 | PM_FAIL, /* all I/O fails */ |
| 139 | }; | 140 | }; |
| @@ -198,7 +199,6 @@ struct pool { | |||
| 198 | }; | 199 | }; |
| 199 | 200 | ||
| 200 | static enum pool_mode get_pool_mode(struct pool *pool); | 201 | static enum pool_mode get_pool_mode(struct pool *pool); |
| 201 | static void out_of_data_space(struct pool *pool); | ||
| 202 | static void metadata_operation_failed(struct pool *pool, const char *op, int r); | 202 | static void metadata_operation_failed(struct pool *pool, const char *op, int r); |
| 203 | 203 | ||
| 204 | /* | 204 | /* |
| @@ -226,6 +226,7 @@ struct thin_c { | |||
| 226 | 226 | ||
| 227 | struct pool *pool; | 227 | struct pool *pool; |
| 228 | struct dm_thin_device *td; | 228 | struct dm_thin_device *td; |
| 229 | bool requeue_mode:1; | ||
| 229 | }; | 230 | }; |
| 230 | 231 | ||
| 231 | /*----------------------------------------------------------------*/ | 232 | /*----------------------------------------------------------------*/ |
| @@ -369,14 +370,18 @@ struct dm_thin_endio_hook { | |||
| 369 | struct dm_thin_new_mapping *overwrite_mapping; | 370 | struct dm_thin_new_mapping *overwrite_mapping; |
| 370 | }; | 371 | }; |
| 371 | 372 | ||
| 372 | static void __requeue_bio_list(struct thin_c *tc, struct bio_list *master) | 373 | static void requeue_bio_list(struct thin_c *tc, struct bio_list *master) |
| 373 | { | 374 | { |
| 374 | struct bio *bio; | 375 | struct bio *bio; |
| 375 | struct bio_list bios; | 376 | struct bio_list bios; |
| 377 | unsigned long flags; | ||
| 376 | 378 | ||
| 377 | bio_list_init(&bios); | 379 | bio_list_init(&bios); |
| 380 | |||
| 381 | spin_lock_irqsave(&tc->pool->lock, flags); | ||
| 378 | bio_list_merge(&bios, master); | 382 | bio_list_merge(&bios, master); |
| 379 | bio_list_init(master); | 383 | bio_list_init(master); |
| 384 | spin_unlock_irqrestore(&tc->pool->lock, flags); | ||
| 380 | 385 | ||
| 381 | while ((bio = bio_list_pop(&bios))) { | 386 | while ((bio = bio_list_pop(&bios))) { |
| 382 | struct dm_thin_endio_hook *h = dm_per_bio_data(bio, sizeof(struct dm_thin_endio_hook)); | 387 | struct dm_thin_endio_hook *h = dm_per_bio_data(bio, sizeof(struct dm_thin_endio_hook)); |
| @@ -391,12 +396,26 @@ static void __requeue_bio_list(struct thin_c *tc, struct bio_list *master) | |||
| 391 | static void requeue_io(struct thin_c *tc) | 396 | static void requeue_io(struct thin_c *tc) |
| 392 | { | 397 | { |
| 393 | struct pool *pool = tc->pool; | 398 | struct pool *pool = tc->pool; |
| 399 | |||
| 400 | requeue_bio_list(tc, &pool->deferred_bios); | ||
| 401 | requeue_bio_list(tc, &pool->retry_on_resume_list); | ||
| 402 | } | ||
| 403 | |||
| 404 | static void error_retry_list(struct pool *pool) | ||
| 405 | { | ||
| 406 | struct bio *bio; | ||
| 394 | unsigned long flags; | 407 | unsigned long flags; |
| 408 | struct bio_list bios; | ||
| 409 | |||
| 410 | bio_list_init(&bios); | ||
| 395 | 411 | ||
| 396 | spin_lock_irqsave(&pool->lock, flags); | 412 | spin_lock_irqsave(&pool->lock, flags); |
| 397 | __requeue_bio_list(tc, &pool->deferred_bios); | 413 | bio_list_merge(&bios, &pool->retry_on_resume_list); |
| 398 | __requeue_bio_list(tc, &pool->retry_on_resume_list); | 414 | bio_list_init(&pool->retry_on_resume_list); |
| 399 | spin_unlock_irqrestore(&pool->lock, flags); | 415 | spin_unlock_irqrestore(&pool->lock, flags); |
| 416 | |||
| 417 | while ((bio = bio_list_pop(&bios))) | ||
| 418 | bio_io_error(bio); | ||
| 400 | } | 419 | } |
| 401 | 420 | ||
| 402 | /* | 421 | /* |
| @@ -925,13 +944,15 @@ static void check_low_water_mark(struct pool *pool, dm_block_t free_blocks) | |||
| 925 | } | 944 | } |
| 926 | } | 945 | } |
| 927 | 946 | ||
| 947 | static void set_pool_mode(struct pool *pool, enum pool_mode new_mode); | ||
| 948 | |||
| 928 | static int alloc_data_block(struct thin_c *tc, dm_block_t *result) | 949 | static int alloc_data_block(struct thin_c *tc, dm_block_t *result) |
| 929 | { | 950 | { |
| 930 | int r; | 951 | int r; |
| 931 | dm_block_t free_blocks; | 952 | dm_block_t free_blocks; |
| 932 | struct pool *pool = tc->pool; | 953 | struct pool *pool = tc->pool; |
| 933 | 954 | ||
| 934 | if (get_pool_mode(pool) != PM_WRITE) | 955 | if (WARN_ON(get_pool_mode(pool) != PM_WRITE)) |
| 935 | return -EINVAL; | 956 | return -EINVAL; |
| 936 | 957 | ||
| 937 | r = dm_pool_get_free_block_count(pool->pmd, &free_blocks); | 958 | r = dm_pool_get_free_block_count(pool->pmd, &free_blocks); |
| @@ -958,7 +979,7 @@ static int alloc_data_block(struct thin_c *tc, dm_block_t *result) | |||
| 958 | } | 979 | } |
| 959 | 980 | ||
| 960 | if (!free_blocks) { | 981 | if (!free_blocks) { |
| 961 | out_of_data_space(pool); | 982 | set_pool_mode(pool, PM_OUT_OF_DATA_SPACE); |
| 962 | return -ENOSPC; | 983 | return -ENOSPC; |
| 963 | } | 984 | } |
| 964 | } | 985 | } |
| @@ -988,15 +1009,32 @@ static void retry_on_resume(struct bio *bio) | |||
| 988 | spin_unlock_irqrestore(&pool->lock, flags); | 1009 | spin_unlock_irqrestore(&pool->lock, flags); |
| 989 | } | 1010 | } |
| 990 | 1011 | ||
| 991 | static void handle_unserviceable_bio(struct pool *pool, struct bio *bio) | 1012 | static bool should_error_unserviceable_bio(struct pool *pool) |
| 992 | { | 1013 | { |
| 993 | /* | 1014 | enum pool_mode m = get_pool_mode(pool); |
| 994 | * When pool is read-only, no cell locking is needed because | ||
| 995 | * nothing is changing. | ||
| 996 | */ | ||
| 997 | WARN_ON_ONCE(get_pool_mode(pool) != PM_READ_ONLY); | ||
| 998 | 1015 | ||
| 999 | if (pool->pf.error_if_no_space) | 1016 | switch (m) { |
| 1017 | case PM_WRITE: | ||
| 1018 | /* Shouldn't get here */ | ||
| 1019 | DMERR_LIMIT("bio unserviceable, yet pool is in PM_WRITE mode"); | ||
| 1020 | return true; | ||
| 1021 | |||
| 1022 | case PM_OUT_OF_DATA_SPACE: | ||
| 1023 | return pool->pf.error_if_no_space; | ||
| 1024 | |||
| 1025 | case PM_READ_ONLY: | ||
| 1026 | case PM_FAIL: | ||
| 1027 | return true; | ||
| 1028 | default: | ||
| 1029 | /* Shouldn't get here */ | ||
| 1030 | DMERR_LIMIT("bio unserviceable, yet pool has an unknown mode"); | ||
| 1031 | return true; | ||
| 1032 | } | ||
| 1033 | } | ||
| 1034 | |||
| 1035 | static void handle_unserviceable_bio(struct pool *pool, struct bio *bio) | ||
| 1036 | { | ||
| 1037 | if (should_error_unserviceable_bio(pool)) | ||
| 1000 | bio_io_error(bio); | 1038 | bio_io_error(bio); |
| 1001 | else | 1039 | else |
| 1002 | retry_on_resume(bio); | 1040 | retry_on_resume(bio); |
| @@ -1007,11 +1045,20 @@ static void retry_bios_on_resume(struct pool *pool, struct dm_bio_prison_cell *c | |||
| 1007 | struct bio *bio; | 1045 | struct bio *bio; |
| 1008 | struct bio_list bios; | 1046 | struct bio_list bios; |
| 1009 | 1047 | ||
| 1048 | if (should_error_unserviceable_bio(pool)) { | ||
| 1049 | cell_error(pool, cell); | ||
| 1050 | return; | ||
| 1051 | } | ||
| 1052 | |||
| 1010 | bio_list_init(&bios); | 1053 | bio_list_init(&bios); |
| 1011 | cell_release(pool, cell, &bios); | 1054 | cell_release(pool, cell, &bios); |
| 1012 | 1055 | ||
| 1013 | while ((bio = bio_list_pop(&bios))) | 1056 | if (should_error_unserviceable_bio(pool)) |
| 1014 | handle_unserviceable_bio(pool, bio); | 1057 | while ((bio = bio_list_pop(&bios))) |
| 1058 | bio_io_error(bio); | ||
| 1059 | else | ||
| 1060 | while ((bio = bio_list_pop(&bios))) | ||
| 1061 | retry_on_resume(bio); | ||
| 1015 | } | 1062 | } |
| 1016 | 1063 | ||
| 1017 | static void process_discard(struct thin_c *tc, struct bio *bio) | 1064 | static void process_discard(struct thin_c *tc, struct bio *bio) |
| @@ -1296,6 +1343,11 @@ static void process_bio_read_only(struct thin_c *tc, struct bio *bio) | |||
| 1296 | } | 1343 | } |
| 1297 | } | 1344 | } |
| 1298 | 1345 | ||
| 1346 | static void process_bio_success(struct thin_c *tc, struct bio *bio) | ||
| 1347 | { | ||
| 1348 | bio_endio(bio, 0); | ||
| 1349 | } | ||
| 1350 | |||
| 1299 | static void process_bio_fail(struct thin_c *tc, struct bio *bio) | 1351 | static void process_bio_fail(struct thin_c *tc, struct bio *bio) |
| 1300 | { | 1352 | { |
| 1301 | bio_io_error(bio); | 1353 | bio_io_error(bio); |
| @@ -1328,6 +1380,11 @@ static void process_deferred_bios(struct pool *pool) | |||
| 1328 | struct dm_thin_endio_hook *h = dm_per_bio_data(bio, sizeof(struct dm_thin_endio_hook)); | 1380 | struct dm_thin_endio_hook *h = dm_per_bio_data(bio, sizeof(struct dm_thin_endio_hook)); |
| 1329 | struct thin_c *tc = h->tc; | 1381 | struct thin_c *tc = h->tc; |
| 1330 | 1382 | ||
| 1383 | if (tc->requeue_mode) { | ||
| 1384 | bio_endio(bio, DM_ENDIO_REQUEUE); | ||
| 1385 | continue; | ||
| 1386 | } | ||
| 1387 | |||
| 1331 | /* | 1388 | /* |
| 1332 | * If we've got no free new_mapping structs, and processing | 1389 | * If we've got no free new_mapping structs, and processing |
| 1333 | * this bio might require one, we pause until there are some | 1390 | * this bio might require one, we pause until there are some |
| @@ -1357,7 +1414,8 @@ static void process_deferred_bios(struct pool *pool) | |||
| 1357 | bio_list_init(&pool->deferred_flush_bios); | 1414 | bio_list_init(&pool->deferred_flush_bios); |
| 1358 | spin_unlock_irqrestore(&pool->lock, flags); | 1415 | spin_unlock_irqrestore(&pool->lock, flags); |
| 1359 | 1416 | ||
| 1360 | if (bio_list_empty(&bios) && !need_commit_due_to_time(pool)) | 1417 | if (bio_list_empty(&bios) && |
| 1418 | !(dm_pool_changed_this_transaction(pool->pmd) && need_commit_due_to_time(pool))) | ||
| 1361 | return; | 1419 | return; |
| 1362 | 1420 | ||
| 1363 | if (commit(pool)) { | 1421 | if (commit(pool)) { |
| @@ -1393,51 +1451,134 @@ static void do_waker(struct work_struct *ws) | |||
| 1393 | 1451 | ||
| 1394 | /*----------------------------------------------------------------*/ | 1452 | /*----------------------------------------------------------------*/ |
| 1395 | 1453 | ||
| 1454 | struct noflush_work { | ||
| 1455 | struct work_struct worker; | ||
| 1456 | struct thin_c *tc; | ||
| 1457 | |||
| 1458 | atomic_t complete; | ||
| 1459 | wait_queue_head_t wait; | ||
| 1460 | }; | ||
| 1461 | |||
| 1462 | static void complete_noflush_work(struct noflush_work *w) | ||
| 1463 | { | ||
| 1464 | atomic_set(&w->complete, 1); | ||
| 1465 | wake_up(&w->wait); | ||
| 1466 | } | ||
| 1467 | |||
| 1468 | static void do_noflush_start(struct work_struct *ws) | ||
| 1469 | { | ||
| 1470 | struct noflush_work *w = container_of(ws, struct noflush_work, worker); | ||
| 1471 | w->tc->requeue_mode = true; | ||
| 1472 | requeue_io(w->tc); | ||
| 1473 | complete_noflush_work(w); | ||
| 1474 | } | ||
| 1475 | |||
| 1476 | static void do_noflush_stop(struct work_struct *ws) | ||
| 1477 | { | ||
| 1478 | struct noflush_work *w = container_of(ws, struct noflush_work, worker); | ||
| 1479 | w->tc->requeue_mode = false; | ||
| 1480 | complete_noflush_work(w); | ||
| 1481 | } | ||
| 1482 | |||
| 1483 | static void noflush_work(struct thin_c *tc, void (*fn)(struct work_struct *)) | ||
| 1484 | { | ||
| 1485 | struct noflush_work w; | ||
| 1486 | |||
| 1487 | INIT_WORK(&w.worker, fn); | ||
| 1488 | w.tc = tc; | ||
| 1489 | atomic_set(&w.complete, 0); | ||
| 1490 | init_waitqueue_head(&w.wait); | ||
| 1491 | |||
| 1492 | queue_work(tc->pool->wq, &w.worker); | ||
| 1493 | |||
| 1494 | wait_event(w.wait, atomic_read(&w.complete)); | ||
| 1495 | } | ||
| 1496 | |||
| 1497 | /*----------------------------------------------------------------*/ | ||
| 1498 | |||
| 1396 | static enum pool_mode get_pool_mode(struct pool *pool) | 1499 | static enum pool_mode get_pool_mode(struct pool *pool) |
| 1397 | { | 1500 | { |
| 1398 | return pool->pf.mode; | 1501 | return pool->pf.mode; |
| 1399 | } | 1502 | } |
| 1400 | 1503 | ||
| 1504 | static void notify_of_pool_mode_change(struct pool *pool, const char *new_mode) | ||
| 1505 | { | ||
| 1506 | dm_table_event(pool->ti->table); | ||
| 1507 | DMINFO("%s: switching pool to %s mode", | ||
| 1508 | dm_device_name(pool->pool_md), new_mode); | ||
| 1509 | } | ||
| 1510 | |||
| 1401 | static void set_pool_mode(struct pool *pool, enum pool_mode new_mode) | 1511 | static void set_pool_mode(struct pool *pool, enum pool_mode new_mode) |
| 1402 | { | 1512 | { |
| 1403 | int r; | 1513 | struct pool_c *pt = pool->ti->private; |
| 1404 | enum pool_mode old_mode = pool->pf.mode; | 1514 | bool needs_check = dm_pool_metadata_needs_check(pool->pmd); |
| 1515 | enum pool_mode old_mode = get_pool_mode(pool); | ||
| 1516 | |||
| 1517 | /* | ||
| 1518 | * Never allow the pool to transition to PM_WRITE mode if user | ||
| 1519 | * intervention is required to verify metadata and data consistency. | ||
| 1520 | */ | ||
| 1521 | if (new_mode == PM_WRITE && needs_check) { | ||
| 1522 | DMERR("%s: unable to switch pool to write mode until repaired.", | ||
| 1523 | dm_device_name(pool->pool_md)); | ||
| 1524 | if (old_mode != new_mode) | ||
| 1525 | new_mode = old_mode; | ||
| 1526 | else | ||
| 1527 | new_mode = PM_READ_ONLY; | ||
| 1528 | } | ||
| 1529 | /* | ||
| 1530 | * If we were in PM_FAIL mode, rollback of metadata failed. We're | ||
| 1531 | * not going to recover without a thin_repair. So we never let the | ||
| 1532 | * pool move out of the old mode. | ||
| 1533 | */ | ||
| 1534 | if (old_mode == PM_FAIL) | ||
| 1535 | new_mode = old_mode; | ||
| 1405 | 1536 | ||
| 1406 | switch (new_mode) { | 1537 | switch (new_mode) { |
| 1407 | case PM_FAIL: | 1538 | case PM_FAIL: |
| 1408 | if (old_mode != new_mode) | 1539 | if (old_mode != new_mode) |
| 1409 | DMERR("%s: switching pool to failure mode", | 1540 | notify_of_pool_mode_change(pool, "failure"); |
| 1410 | dm_device_name(pool->pool_md)); | ||
| 1411 | dm_pool_metadata_read_only(pool->pmd); | 1541 | dm_pool_metadata_read_only(pool->pmd); |
| 1412 | pool->process_bio = process_bio_fail; | 1542 | pool->process_bio = process_bio_fail; |
| 1413 | pool->process_discard = process_bio_fail; | 1543 | pool->process_discard = process_bio_fail; |
| 1414 | pool->process_prepared_mapping = process_prepared_mapping_fail; | 1544 | pool->process_prepared_mapping = process_prepared_mapping_fail; |
| 1415 | pool->process_prepared_discard = process_prepared_discard_fail; | 1545 | pool->process_prepared_discard = process_prepared_discard_fail; |
| 1546 | |||
| 1547 | error_retry_list(pool); | ||
| 1416 | break; | 1548 | break; |
| 1417 | 1549 | ||
| 1418 | case PM_READ_ONLY: | 1550 | case PM_READ_ONLY: |
| 1419 | if (old_mode != new_mode) | 1551 | if (old_mode != new_mode) |
| 1420 | DMERR("%s: switching pool to read-only mode", | 1552 | notify_of_pool_mode_change(pool, "read-only"); |
| 1421 | dm_device_name(pool->pool_md)); | 1553 | dm_pool_metadata_read_only(pool->pmd); |
| 1422 | r = dm_pool_abort_metadata(pool->pmd); | 1554 | pool->process_bio = process_bio_read_only; |
| 1423 | if (r) { | 1555 | pool->process_discard = process_bio_success; |
| 1424 | DMERR("%s: aborting transaction failed", | 1556 | pool->process_prepared_mapping = process_prepared_mapping_fail; |
| 1425 | dm_device_name(pool->pool_md)); | 1557 | pool->process_prepared_discard = process_prepared_discard_passdown; |
| 1426 | new_mode = PM_FAIL; | 1558 | |
| 1427 | set_pool_mode(pool, new_mode); | 1559 | error_retry_list(pool); |
| 1428 | } else { | 1560 | break; |
| 1429 | dm_pool_metadata_read_only(pool->pmd); | 1561 | |
| 1430 | pool->process_bio = process_bio_read_only; | 1562 | case PM_OUT_OF_DATA_SPACE: |
| 1431 | pool->process_discard = process_discard; | 1563 | /* |
| 1432 | pool->process_prepared_mapping = process_prepared_mapping_fail; | 1564 | * Ideally we'd never hit this state; the low water mark |
| 1433 | pool->process_prepared_discard = process_prepared_discard_passdown; | 1565 | * would trigger userland to extend the pool before we |
| 1434 | } | 1566 | * completely run out of data space. However, many small |
| 1567 | * IOs to unprovisioned space can consume data space at an | ||
| 1568 | * alarming rate. Adjust your low water mark if you're | ||
| 1569 | * frequently seeing this mode. | ||
| 1570 | */ | ||
| 1571 | if (old_mode != new_mode) | ||
| 1572 | notify_of_pool_mode_change(pool, "out-of-data-space"); | ||
| 1573 | pool->process_bio = process_bio_read_only; | ||
| 1574 | pool->process_discard = process_discard; | ||
| 1575 | pool->process_prepared_mapping = process_prepared_mapping; | ||
| 1576 | pool->process_prepared_discard = process_prepared_discard_passdown; | ||
| 1435 | break; | 1577 | break; |
| 1436 | 1578 | ||
| 1437 | case PM_WRITE: | 1579 | case PM_WRITE: |
| 1438 | if (old_mode != new_mode) | 1580 | if (old_mode != new_mode) |
| 1439 | DMINFO("%s: switching pool to write mode", | 1581 | notify_of_pool_mode_change(pool, "write"); |
| 1440 | dm_device_name(pool->pool_md)); | ||
| 1441 | dm_pool_metadata_read_write(pool->pmd); | 1582 | dm_pool_metadata_read_write(pool->pmd); |
| 1442 | pool->process_bio = process_bio; | 1583 | pool->process_bio = process_bio; |
| 1443 | pool->process_discard = process_discard; | 1584 | pool->process_discard = process_discard; |
| @@ -1447,32 +1588,35 @@ static void set_pool_mode(struct pool *pool, enum pool_mode new_mode) | |||
| 1447 | } | 1588 | } |
| 1448 | 1589 | ||
| 1449 | pool->pf.mode = new_mode; | 1590 | pool->pf.mode = new_mode; |
| 1591 | /* | ||
| 1592 | * The pool mode may have changed, sync it so bind_control_target() | ||
| 1593 | * doesn't cause an unexpected mode transition on resume. | ||
| 1594 | */ | ||
| 1595 | pt->adjusted_pf.mode = new_mode; | ||
| 1450 | } | 1596 | } |
| 1451 | 1597 | ||
| 1452 | /* | 1598 | static void abort_transaction(struct pool *pool) |
| 1453 | * Rather than calling set_pool_mode directly, use these which describe the | ||
| 1454 | * reason for mode degradation. | ||
| 1455 | */ | ||
| 1456 | static void out_of_data_space(struct pool *pool) | ||
| 1457 | { | 1599 | { |
| 1458 | DMERR_LIMIT("%s: no free data space available.", | 1600 | const char *dev_name = dm_device_name(pool->pool_md); |
| 1459 | dm_device_name(pool->pool_md)); | 1601 | |
| 1460 | set_pool_mode(pool, PM_READ_ONLY); | 1602 | DMERR_LIMIT("%s: aborting current metadata transaction", dev_name); |
| 1603 | if (dm_pool_abort_metadata(pool->pmd)) { | ||
| 1604 | DMERR("%s: failed to abort metadata transaction", dev_name); | ||
| 1605 | set_pool_mode(pool, PM_FAIL); | ||
| 1606 | } | ||
| 1607 | |||
| 1608 | if (dm_pool_metadata_set_needs_check(pool->pmd)) { | ||
| 1609 | DMERR("%s: failed to set 'needs_check' flag in metadata", dev_name); | ||
| 1610 | set_pool_mode(pool, PM_FAIL); | ||
| 1611 | } | ||
| 1461 | } | 1612 | } |
| 1462 | 1613 | ||
| 1463 | static void metadata_operation_failed(struct pool *pool, const char *op, int r) | 1614 | static void metadata_operation_failed(struct pool *pool, const char *op, int r) |
| 1464 | { | 1615 | { |
| 1465 | dm_block_t free_blocks; | ||
| 1466 | |||
| 1467 | DMERR_LIMIT("%s: metadata operation '%s' failed: error = %d", | 1616 | DMERR_LIMIT("%s: metadata operation '%s' failed: error = %d", |
| 1468 | dm_device_name(pool->pool_md), op, r); | 1617 | dm_device_name(pool->pool_md), op, r); |
| 1469 | 1618 | ||
| 1470 | if (r == -ENOSPC && | 1619 | abort_transaction(pool); |
| 1471 | !dm_pool_get_free_metadata_block_count(pool->pmd, &free_blocks) && | ||
| 1472 | !free_blocks) | ||
| 1473 | DMERR_LIMIT("%s: no free metadata space available.", | ||
| 1474 | dm_device_name(pool->pool_md)); | ||
| 1475 | |||
| 1476 | set_pool_mode(pool, PM_READ_ONLY); | 1620 | set_pool_mode(pool, PM_READ_ONLY); |
| 1477 | } | 1621 | } |
| 1478 | 1622 | ||
| @@ -1523,6 +1667,11 @@ static int thin_bio_map(struct dm_target *ti, struct bio *bio) | |||
| 1523 | 1667 | ||
| 1524 | thin_hook_bio(tc, bio); | 1668 | thin_hook_bio(tc, bio); |
| 1525 | 1669 | ||
| 1670 | if (tc->requeue_mode) { | ||
| 1671 | bio_endio(bio, DM_ENDIO_REQUEUE); | ||
| 1672 | return DM_MAPIO_SUBMITTED; | ||
| 1673 | } | ||
| 1674 | |||
| 1526 | if (get_pool_mode(tc->pool) == PM_FAIL) { | 1675 | if (get_pool_mode(tc->pool) == PM_FAIL) { |
| 1527 | bio_io_error(bio); | 1676 | bio_io_error(bio); |
| 1528 | return DM_MAPIO_SUBMITTED; | 1677 | return DM_MAPIO_SUBMITTED; |
| @@ -1686,7 +1835,7 @@ static int bind_control_target(struct pool *pool, struct dm_target *ti) | |||
| 1686 | /* | 1835 | /* |
| 1687 | * We want to make sure that a pool in PM_FAIL mode is never upgraded. | 1836 | * We want to make sure that a pool in PM_FAIL mode is never upgraded. |
| 1688 | */ | 1837 | */ |
| 1689 | enum pool_mode old_mode = pool->pf.mode; | 1838 | enum pool_mode old_mode = get_pool_mode(pool); |
| 1690 | enum pool_mode new_mode = pt->adjusted_pf.mode; | 1839 | enum pool_mode new_mode = pt->adjusted_pf.mode; |
| 1691 | 1840 | ||
| 1692 | /* | 1841 | /* |
| @@ -1700,16 +1849,6 @@ static int bind_control_target(struct pool *pool, struct dm_target *ti) | |||
| 1700 | pool->pf = pt->adjusted_pf; | 1849 | pool->pf = pt->adjusted_pf; |
| 1701 | pool->low_water_blocks = pt->low_water_blocks; | 1850 | pool->low_water_blocks = pt->low_water_blocks; |
| 1702 | 1851 | ||
| 1703 | /* | ||
| 1704 | * If we were in PM_FAIL mode, rollback of metadata failed. We're | ||
| 1705 | * not going to recover without a thin_repair. So we never let the | ||
| 1706 | * pool move out of the old mode. On the other hand a PM_READ_ONLY | ||
| 1707 | * may have been due to a lack of metadata or data space, and may | ||
| 1708 | * now work (ie. if the underlying devices have been resized). | ||
| 1709 | */ | ||
| 1710 | if (old_mode == PM_FAIL) | ||
| 1711 | new_mode = old_mode; | ||
| 1712 | |||
| 1713 | set_pool_mode(pool, new_mode); | 1852 | set_pool_mode(pool, new_mode); |
| 1714 | 1853 | ||
| 1715 | return 0; | 1854 | return 0; |
| @@ -1999,16 +2138,27 @@ static void metadata_low_callback(void *context) | |||
| 1999 | dm_table_event(pool->ti->table); | 2138 | dm_table_event(pool->ti->table); |
| 2000 | } | 2139 | } |
| 2001 | 2140 | ||
| 2002 | static sector_t get_metadata_dev_size(struct block_device *bdev) | 2141 | static sector_t get_dev_size(struct block_device *bdev) |
| 2142 | { | ||
| 2143 | return i_size_read(bdev->bd_inode) >> SECTOR_SHIFT; | ||
| 2144 | } | ||
| 2145 | |||
| 2146 | static void warn_if_metadata_device_too_big(struct block_device *bdev) | ||
| 2003 | { | 2147 | { |
| 2004 | sector_t metadata_dev_size = i_size_read(bdev->bd_inode) >> SECTOR_SHIFT; | 2148 | sector_t metadata_dev_size = get_dev_size(bdev); |
| 2005 | char buffer[BDEVNAME_SIZE]; | 2149 | char buffer[BDEVNAME_SIZE]; |
| 2006 | 2150 | ||
| 2007 | if (metadata_dev_size > THIN_METADATA_MAX_SECTORS_WARNING) { | 2151 | if (metadata_dev_size > THIN_METADATA_MAX_SECTORS_WARNING) |
| 2008 | DMWARN("Metadata device %s is larger than %u sectors: excess space will not be used.", | 2152 | DMWARN("Metadata device %s is larger than %u sectors: excess space will not be used.", |
| 2009 | bdevname(bdev, buffer), THIN_METADATA_MAX_SECTORS); | 2153 | bdevname(bdev, buffer), THIN_METADATA_MAX_SECTORS); |
| 2010 | metadata_dev_size = THIN_METADATA_MAX_SECTORS_WARNING; | 2154 | } |
| 2011 | } | 2155 | |
| 2156 | static sector_t get_metadata_dev_size(struct block_device *bdev) | ||
| 2157 | { | ||
| 2158 | sector_t metadata_dev_size = get_dev_size(bdev); | ||
| 2159 | |||
| 2160 | if (metadata_dev_size > THIN_METADATA_MAX_SECTORS) | ||
| 2161 | metadata_dev_size = THIN_METADATA_MAX_SECTORS; | ||
| 2012 | 2162 | ||
| 2013 | return metadata_dev_size; | 2163 | return metadata_dev_size; |
| 2014 | } | 2164 | } |
| @@ -2017,7 +2167,7 @@ static dm_block_t get_metadata_dev_size_in_blocks(struct block_device *bdev) | |||
| 2017 | { | 2167 | { |
| 2018 | sector_t metadata_dev_size = get_metadata_dev_size(bdev); | 2168 | sector_t metadata_dev_size = get_metadata_dev_size(bdev); |
| 2019 | 2169 | ||
| 2020 | sector_div(metadata_dev_size, THIN_METADATA_BLOCK_SIZE >> SECTOR_SHIFT); | 2170 | sector_div(metadata_dev_size, THIN_METADATA_BLOCK_SIZE); |
| 2021 | 2171 | ||
| 2022 | return metadata_dev_size; | 2172 | return metadata_dev_size; |
| 2023 | } | 2173 | } |
| @@ -2095,12 +2245,7 @@ static int pool_ctr(struct dm_target *ti, unsigned argc, char **argv) | |||
| 2095 | ti->error = "Error opening metadata block device"; | 2245 | ti->error = "Error opening metadata block device"; |
| 2096 | goto out_unlock; | 2246 | goto out_unlock; |
| 2097 | } | 2247 | } |
| 2098 | 2248 | warn_if_metadata_device_too_big(metadata_dev->bdev); | |
| 2099 | /* | ||
| 2100 | * Run for the side-effect of possibly issuing a warning if the | ||
| 2101 | * device is too big. | ||
| 2102 | */ | ||
| 2103 | (void) get_metadata_dev_size(metadata_dev->bdev); | ||
| 2104 | 2249 | ||
| 2105 | r = dm_get_device(ti, argv[1], FMODE_READ | FMODE_WRITE, &data_dev); | 2250 | r = dm_get_device(ti, argv[1], FMODE_READ | FMODE_WRITE, &data_dev); |
| 2106 | if (r) { | 2251 | if (r) { |
| @@ -2246,6 +2391,12 @@ static int maybe_resize_data_dev(struct dm_target *ti, bool *need_commit) | |||
| 2246 | return -EINVAL; | 2391 | return -EINVAL; |
| 2247 | 2392 | ||
| 2248 | } else if (data_size > sb_data_size) { | 2393 | } else if (data_size > sb_data_size) { |
| 2394 | if (dm_pool_metadata_needs_check(pool->pmd)) { | ||
| 2395 | DMERR("%s: unable to grow the data device until repaired.", | ||
| 2396 | dm_device_name(pool->pool_md)); | ||
| 2397 | return 0; | ||
| 2398 | } | ||
| 2399 | |||
| 2249 | if (sb_data_size) | 2400 | if (sb_data_size) |
| 2250 | DMINFO("%s: growing the data device from %llu to %llu blocks", | 2401 | DMINFO("%s: growing the data device from %llu to %llu blocks", |
| 2251 | dm_device_name(pool->pool_md), | 2402 | dm_device_name(pool->pool_md), |
| @@ -2287,6 +2438,13 @@ static int maybe_resize_metadata_dev(struct dm_target *ti, bool *need_commit) | |||
| 2287 | return -EINVAL; | 2438 | return -EINVAL; |
| 2288 | 2439 | ||
| 2289 | } else if (metadata_dev_size > sb_metadata_dev_size) { | 2440 | } else if (metadata_dev_size > sb_metadata_dev_size) { |
| 2441 | if (dm_pool_metadata_needs_check(pool->pmd)) { | ||
| 2442 | DMERR("%s: unable to grow the metadata device until repaired.", | ||
| 2443 | dm_device_name(pool->pool_md)); | ||
| 2444 | return 0; | ||
| 2445 | } | ||
| 2446 | |||
| 2447 | warn_if_metadata_device_too_big(pool->md_dev); | ||
| 2290 | DMINFO("%s: growing the metadata device from %llu to %llu blocks", | 2448 | DMINFO("%s: growing the metadata device from %llu to %llu blocks", |
| 2291 | dm_device_name(pool->pool_md), | 2449 | dm_device_name(pool->pool_md), |
| 2292 | sb_metadata_dev_size, metadata_dev_size); | 2450 | sb_metadata_dev_size, metadata_dev_size); |
| @@ -2673,7 +2831,9 @@ static void pool_status(struct dm_target *ti, status_type_t type, | |||
| 2673 | else | 2831 | else |
| 2674 | DMEMIT("- "); | 2832 | DMEMIT("- "); |
| 2675 | 2833 | ||
| 2676 | if (pool->pf.mode == PM_READ_ONLY) | 2834 | if (pool->pf.mode == PM_OUT_OF_DATA_SPACE) |
| 2835 | DMEMIT("out_of_data_space "); | ||
| 2836 | else if (pool->pf.mode == PM_READ_ONLY) | ||
| 2677 | DMEMIT("ro "); | 2837 | DMEMIT("ro "); |
| 2678 | else | 2838 | else |
| 2679 | DMEMIT("rw "); | 2839 | DMEMIT("rw "); |
| @@ -2787,7 +2947,7 @@ static struct target_type pool_target = { | |||
| 2787 | .name = "thin-pool", | 2947 | .name = "thin-pool", |
| 2788 | .features = DM_TARGET_SINGLETON | DM_TARGET_ALWAYS_WRITEABLE | | 2948 | .features = DM_TARGET_SINGLETON | DM_TARGET_ALWAYS_WRITEABLE | |
| 2789 | DM_TARGET_IMMUTABLE, | 2949 | DM_TARGET_IMMUTABLE, |
| 2790 | .version = {1, 10, 0}, | 2950 | .version = {1, 11, 0}, |
| 2791 | .module = THIS_MODULE, | 2951 | .module = THIS_MODULE, |
| 2792 | .ctr = pool_ctr, | 2952 | .ctr = pool_ctr, |
| 2793 | .dtr = pool_dtr, | 2953 | .dtr = pool_dtr, |
| @@ -2894,6 +3054,7 @@ static int thin_ctr(struct dm_target *ti, unsigned argc, char **argv) | |||
| 2894 | 3054 | ||
| 2895 | if (get_pool_mode(tc->pool) == PM_FAIL) { | 3055 | if (get_pool_mode(tc->pool) == PM_FAIL) { |
| 2896 | ti->error = "Couldn't open thin device, Pool is in fail mode"; | 3056 | ti->error = "Couldn't open thin device, Pool is in fail mode"; |
| 3057 | r = -EINVAL; | ||
| 2897 | goto bad_thin_open; | 3058 | goto bad_thin_open; |
| 2898 | } | 3059 | } |
| 2899 | 3060 | ||
| @@ -2905,7 +3066,7 @@ static int thin_ctr(struct dm_target *ti, unsigned argc, char **argv) | |||
| 2905 | 3066 | ||
| 2906 | r = dm_set_target_max_io_len(ti, tc->pool->sectors_per_block); | 3067 | r = dm_set_target_max_io_len(ti, tc->pool->sectors_per_block); |
| 2907 | if (r) | 3068 | if (r) |
| 2908 | goto bad_thin_open; | 3069 | goto bad_target_max_io_len; |
| 2909 | 3070 | ||
| 2910 | ti->num_flush_bios = 1; | 3071 | ti->num_flush_bios = 1; |
| 2911 | ti->flush_supported = true; | 3072 | ti->flush_supported = true; |
| @@ -2926,6 +3087,8 @@ static int thin_ctr(struct dm_target *ti, unsigned argc, char **argv) | |||
| 2926 | 3087 | ||
| 2927 | return 0; | 3088 | return 0; |
| 2928 | 3089 | ||
| 3090 | bad_target_max_io_len: | ||
| 3091 | dm_pool_close_thin_device(tc->td); | ||
| 2929 | bad_thin_open: | 3092 | bad_thin_open: |
| 2930 | __pool_dec(tc->pool); | 3093 | __pool_dec(tc->pool); |
| 2931 | bad_pool_lookup: | 3094 | bad_pool_lookup: |
| @@ -2986,10 +3149,23 @@ static int thin_endio(struct dm_target *ti, struct bio *bio, int err) | |||
| 2986 | return 0; | 3149 | return 0; |
| 2987 | } | 3150 | } |
| 2988 | 3151 | ||
| 2989 | static void thin_postsuspend(struct dm_target *ti) | 3152 | static void thin_presuspend(struct dm_target *ti) |
| 2990 | { | 3153 | { |
| 3154 | struct thin_c *tc = ti->private; | ||
| 3155 | |||
| 2991 | if (dm_noflush_suspending(ti)) | 3156 | if (dm_noflush_suspending(ti)) |
| 2992 | requeue_io((struct thin_c *)ti->private); | 3157 | noflush_work(tc, do_noflush_start); |
| 3158 | } | ||
| 3159 | |||
| 3160 | static void thin_postsuspend(struct dm_target *ti) | ||
| 3161 | { | ||
| 3162 | struct thin_c *tc = ti->private; | ||
| 3163 | |||
| 3164 | /* | ||
| 3165 | * The dm_noflush_suspending flag has been cleared by now, so | ||
| 3166 | * unfortunately we must always run this. | ||
| 3167 | */ | ||
| 3168 | noflush_work(tc, do_noflush_stop); | ||
| 2993 | } | 3169 | } |
| 2994 | 3170 | ||
| 2995 | /* | 3171 | /* |
| @@ -3074,12 +3250,13 @@ static int thin_iterate_devices(struct dm_target *ti, | |||
| 3074 | 3250 | ||
| 3075 | static struct target_type thin_target = { | 3251 | static struct target_type thin_target = { |
| 3076 | .name = "thin", | 3252 | .name = "thin", |
| 3077 | .version = {1, 10, 0}, | 3253 | .version = {1, 11, 0}, |
| 3078 | .module = THIS_MODULE, | 3254 | .module = THIS_MODULE, |
| 3079 | .ctr = thin_ctr, | 3255 | .ctr = thin_ctr, |
| 3080 | .dtr = thin_dtr, | 3256 | .dtr = thin_dtr, |
| 3081 | .map = thin_map, | 3257 | .map = thin_map, |
| 3082 | .end_io = thin_endio, | 3258 | .end_io = thin_endio, |
| 3259 | .presuspend = thin_presuspend, | ||
| 3083 | .postsuspend = thin_postsuspend, | 3260 | .postsuspend = thin_postsuspend, |
| 3084 | .status = thin_status, | 3261 | .status = thin_status, |
| 3085 | .iterate_devices = thin_iterate_devices, | 3262 | .iterate_devices = thin_iterate_devices, |
diff --git a/drivers/md/persistent-data/Kconfig b/drivers/md/persistent-data/Kconfig index 19b268795415..0c2dec7aec20 100644 --- a/drivers/md/persistent-data/Kconfig +++ b/drivers/md/persistent-data/Kconfig | |||
| @@ -6,3 +6,13 @@ config DM_PERSISTENT_DATA | |||
| 6 | ---help--- | 6 | ---help--- |
| 7 | Library providing immutable on-disk data structure support for | 7 | Library providing immutable on-disk data structure support for |
| 8 | device-mapper targets such as the thin provisioning target. | 8 | device-mapper targets such as the thin provisioning target. |
| 9 | |||
| 10 | config DM_DEBUG_BLOCK_STACK_TRACING | ||
| 11 | boolean "Keep stack trace of persistent data block lock holders" | ||
| 12 | depends on STACKTRACE_SUPPORT && DM_PERSISTENT_DATA | ||
| 13 | select STACKTRACE | ||
| 14 | ---help--- | ||
| 15 | Enable this for messages that may help debug problems with the | ||
| 16 | block manager locking used by thin provisioning and caching. | ||
| 17 | |||
| 18 | If unsure, say N. | ||
diff --git a/drivers/md/persistent-data/dm-space-map-metadata.c b/drivers/md/persistent-data/dm-space-map-metadata.c index 536782e3bcb7..786b689bdfc7 100644 --- a/drivers/md/persistent-data/dm-space-map-metadata.c +++ b/drivers/md/persistent-data/dm-space-map-metadata.c | |||
| @@ -91,6 +91,69 @@ struct block_op { | |||
| 91 | dm_block_t block; | 91 | dm_block_t block; |
| 92 | }; | 92 | }; |
| 93 | 93 | ||
| 94 | struct bop_ring_buffer { | ||
| 95 | unsigned begin; | ||
| 96 | unsigned end; | ||
| 97 | struct block_op bops[MAX_RECURSIVE_ALLOCATIONS + 1]; | ||
| 98 | }; | ||
| 99 | |||
| 100 | static void brb_init(struct bop_ring_buffer *brb) | ||
| 101 | { | ||
| 102 | brb->begin = 0; | ||
| 103 | brb->end = 0; | ||
| 104 | } | ||
| 105 | |||
| 106 | static bool brb_empty(struct bop_ring_buffer *brb) | ||
| 107 | { | ||
| 108 | return brb->begin == brb->end; | ||
| 109 | } | ||
| 110 | |||
| 111 | static unsigned brb_next(struct bop_ring_buffer *brb, unsigned old) | ||
| 112 | { | ||
| 113 | unsigned r = old + 1; | ||
| 114 | return (r >= (sizeof(brb->bops) / sizeof(*brb->bops))) ? 0 : r; | ||
| 115 | } | ||
| 116 | |||
| 117 | static int brb_push(struct bop_ring_buffer *brb, | ||
| 118 | enum block_op_type type, dm_block_t b) | ||
| 119 | { | ||
| 120 | struct block_op *bop; | ||
| 121 | unsigned next = brb_next(brb, brb->end); | ||
| 122 | |||
| 123 | /* | ||
| 124 | * We don't allow the last bop to be filled, this way we can | ||
| 125 | * differentiate between full and empty. | ||
| 126 | */ | ||
| 127 | if (next == brb->begin) | ||
| 128 | return -ENOMEM; | ||
| 129 | |||
| 130 | bop = brb->bops + brb->end; | ||
| 131 | bop->type = type; | ||
| 132 | bop->block = b; | ||
| 133 | |||
| 134 | brb->end = next; | ||
| 135 | |||
| 136 | return 0; | ||
| 137 | } | ||
| 138 | |||
| 139 | static int brb_pop(struct bop_ring_buffer *brb, struct block_op *result) | ||
| 140 | { | ||
| 141 | struct block_op *bop; | ||
| 142 | |||
| 143 | if (brb_empty(brb)) | ||
| 144 | return -ENODATA; | ||
| 145 | |||
| 146 | bop = brb->bops + brb->begin; | ||
| 147 | result->type = bop->type; | ||
| 148 | result->block = bop->block; | ||
| 149 | |||
| 150 | brb->begin = brb_next(brb, brb->begin); | ||
| 151 | |||
| 152 | return 0; | ||
| 153 | } | ||
| 154 | |||
| 155 | /*----------------------------------------------------------------*/ | ||
| 156 | |||
| 94 | struct sm_metadata { | 157 | struct sm_metadata { |
| 95 | struct dm_space_map sm; | 158 | struct dm_space_map sm; |
| 96 | 159 | ||
| @@ -101,25 +164,20 @@ struct sm_metadata { | |||
| 101 | 164 | ||
| 102 | unsigned recursion_count; | 165 | unsigned recursion_count; |
| 103 | unsigned allocated_this_transaction; | 166 | unsigned allocated_this_transaction; |
| 104 | unsigned nr_uncommitted; | 167 | struct bop_ring_buffer uncommitted; |
| 105 | struct block_op uncommitted[MAX_RECURSIVE_ALLOCATIONS]; | ||
| 106 | 168 | ||
| 107 | struct threshold threshold; | 169 | struct threshold threshold; |
| 108 | }; | 170 | }; |
| 109 | 171 | ||
| 110 | static int add_bop(struct sm_metadata *smm, enum block_op_type type, dm_block_t b) | 172 | static int add_bop(struct sm_metadata *smm, enum block_op_type type, dm_block_t b) |
| 111 | { | 173 | { |
| 112 | struct block_op *op; | 174 | int r = brb_push(&smm->uncommitted, type, b); |
| 113 | 175 | ||
| 114 | if (smm->nr_uncommitted == MAX_RECURSIVE_ALLOCATIONS) { | 176 | if (r) { |
| 115 | DMERR("too many recursive allocations"); | 177 | DMERR("too many recursive allocations"); |
| 116 | return -ENOMEM; | 178 | return -ENOMEM; |
| 117 | } | 179 | } |
| 118 | 180 | ||
| 119 | op = smm->uncommitted + smm->nr_uncommitted++; | ||
| 120 | op->type = type; | ||
| 121 | op->block = b; | ||
| 122 | |||
| 123 | return 0; | 181 | return 0; |
| 124 | } | 182 | } |
| 125 | 183 | ||
| @@ -158,11 +216,17 @@ static int out(struct sm_metadata *smm) | |||
| 158 | return -ENOMEM; | 216 | return -ENOMEM; |
| 159 | } | 217 | } |
| 160 | 218 | ||
| 161 | if (smm->recursion_count == 1 && smm->nr_uncommitted) { | 219 | if (smm->recursion_count == 1) { |
| 162 | while (smm->nr_uncommitted && !r) { | 220 | while (!brb_empty(&smm->uncommitted)) { |
| 163 | smm->nr_uncommitted--; | 221 | struct block_op bop; |
| 164 | r = commit_bop(smm, smm->uncommitted + | 222 | |
| 165 | smm->nr_uncommitted); | 223 | r = brb_pop(&smm->uncommitted, &bop); |
| 224 | if (r) { | ||
| 225 | DMERR("bug in bop ring buffer"); | ||
| 226 | break; | ||
| 227 | } | ||
| 228 | |||
| 229 | r = commit_bop(smm, &bop); | ||
| 166 | if (r) | 230 | if (r) |
| 167 | break; | 231 | break; |
| 168 | } | 232 | } |
| @@ -217,7 +281,8 @@ static int sm_metadata_get_nr_free(struct dm_space_map *sm, dm_block_t *count) | |||
| 217 | static int sm_metadata_get_count(struct dm_space_map *sm, dm_block_t b, | 281 | static int sm_metadata_get_count(struct dm_space_map *sm, dm_block_t b, |
| 218 | uint32_t *result) | 282 | uint32_t *result) |
| 219 | { | 283 | { |
| 220 | int r, i; | 284 | int r; |
| 285 | unsigned i; | ||
| 221 | struct sm_metadata *smm = container_of(sm, struct sm_metadata, sm); | 286 | struct sm_metadata *smm = container_of(sm, struct sm_metadata, sm); |
| 222 | unsigned adjustment = 0; | 287 | unsigned adjustment = 0; |
| 223 | 288 | ||
| @@ -225,8 +290,10 @@ static int sm_metadata_get_count(struct dm_space_map *sm, dm_block_t b, | |||
| 225 | * We may have some uncommitted adjustments to add. This list | 290 | * We may have some uncommitted adjustments to add. This list |
| 226 | * should always be really short. | 291 | * should always be really short. |
| 227 | */ | 292 | */ |
| 228 | for (i = 0; i < smm->nr_uncommitted; i++) { | 293 | for (i = smm->uncommitted.begin; |
| 229 | struct block_op *op = smm->uncommitted + i; | 294 | i != smm->uncommitted.end; |
| 295 | i = brb_next(&smm->uncommitted, i)) { | ||
| 296 | struct block_op *op = smm->uncommitted.bops + i; | ||
| 230 | 297 | ||
| 231 | if (op->block != b) | 298 | if (op->block != b) |
| 232 | continue; | 299 | continue; |
| @@ -254,7 +321,8 @@ static int sm_metadata_get_count(struct dm_space_map *sm, dm_block_t b, | |||
| 254 | static int sm_metadata_count_is_more_than_one(struct dm_space_map *sm, | 321 | static int sm_metadata_count_is_more_than_one(struct dm_space_map *sm, |
| 255 | dm_block_t b, int *result) | 322 | dm_block_t b, int *result) |
| 256 | { | 323 | { |
| 257 | int r, i, adjustment = 0; | 324 | int r, adjustment = 0; |
| 325 | unsigned i; | ||
| 258 | struct sm_metadata *smm = container_of(sm, struct sm_metadata, sm); | 326 | struct sm_metadata *smm = container_of(sm, struct sm_metadata, sm); |
| 259 | uint32_t rc; | 327 | uint32_t rc; |
| 260 | 328 | ||
| @@ -262,8 +330,11 @@ static int sm_metadata_count_is_more_than_one(struct dm_space_map *sm, | |||
| 262 | * We may have some uncommitted adjustments to add. This list | 330 | * We may have some uncommitted adjustments to add. This list |
| 263 | * should always be really short. | 331 | * should always be really short. |
| 264 | */ | 332 | */ |
| 265 | for (i = 0; i < smm->nr_uncommitted; i++) { | 333 | for (i = smm->uncommitted.begin; |
| 266 | struct block_op *op = smm->uncommitted + i; | 334 | i != smm->uncommitted.end; |
| 335 | i = brb_next(&smm->uncommitted, i)) { | ||
| 336 | |||
| 337 | struct block_op *op = smm->uncommitted.bops + i; | ||
| 267 | 338 | ||
| 268 | if (op->block != b) | 339 | if (op->block != b) |
| 269 | continue; | 340 | continue; |
| @@ -671,7 +742,7 @@ int dm_sm_metadata_create(struct dm_space_map *sm, | |||
| 671 | smm->begin = superblock + 1; | 742 | smm->begin = superblock + 1; |
| 672 | smm->recursion_count = 0; | 743 | smm->recursion_count = 0; |
| 673 | smm->allocated_this_transaction = 0; | 744 | smm->allocated_this_transaction = 0; |
| 674 | smm->nr_uncommitted = 0; | 745 | brb_init(&smm->uncommitted); |
| 675 | threshold_init(&smm->threshold); | 746 | threshold_init(&smm->threshold); |
| 676 | 747 | ||
| 677 | memcpy(&smm->sm, &bootstrap_ops, sizeof(smm->sm)); | 748 | memcpy(&smm->sm, &bootstrap_ops, sizeof(smm->sm)); |
| @@ -680,6 +751,8 @@ int dm_sm_metadata_create(struct dm_space_map *sm, | |||
| 680 | if (r) | 751 | if (r) |
| 681 | return r; | 752 | return r; |
| 682 | 753 | ||
| 754 | if (nr_blocks > DM_SM_METADATA_MAX_BLOCKS) | ||
| 755 | nr_blocks = DM_SM_METADATA_MAX_BLOCKS; | ||
| 683 | r = sm_ll_extend(&smm->ll, nr_blocks); | 756 | r = sm_ll_extend(&smm->ll, nr_blocks); |
| 684 | if (r) | 757 | if (r) |
| 685 | return r; | 758 | return r; |
| @@ -713,7 +786,7 @@ int dm_sm_metadata_open(struct dm_space_map *sm, | |||
| 713 | smm->begin = 0; | 786 | smm->begin = 0; |
| 714 | smm->recursion_count = 0; | 787 | smm->recursion_count = 0; |
| 715 | smm->allocated_this_transaction = 0; | 788 | smm->allocated_this_transaction = 0; |
| 716 | smm->nr_uncommitted = 0; | 789 | brb_init(&smm->uncommitted); |
| 717 | threshold_init(&smm->threshold); | 790 | threshold_init(&smm->threshold); |
| 718 | 791 | ||
| 719 | memcpy(&smm->old_ll, &smm->ll, sizeof(smm->old_ll)); | 792 | memcpy(&smm->old_ll, &smm->ll, sizeof(smm->old_ll)); |
diff --git a/drivers/md/persistent-data/dm-space-map-metadata.h b/drivers/md/persistent-data/dm-space-map-metadata.h index 39bba0801cf2..64df923974d8 100644 --- a/drivers/md/persistent-data/dm-space-map-metadata.h +++ b/drivers/md/persistent-data/dm-space-map-metadata.h | |||
| @@ -9,6 +9,17 @@ | |||
| 9 | 9 | ||
| 10 | #include "dm-transaction-manager.h" | 10 | #include "dm-transaction-manager.h" |
| 11 | 11 | ||
| 12 | #define DM_SM_METADATA_BLOCK_SIZE (4096 >> SECTOR_SHIFT) | ||
| 13 | |||
| 14 | /* | ||
| 15 | * The metadata device is currently limited in size. | ||
| 16 | * | ||
| 17 | * We have one block of index, which can hold 255 index entries. Each | ||
| 18 | * index entry contains allocation info about ~16k metadata blocks. | ||
| 19 | */ | ||
| 20 | #define DM_SM_METADATA_MAX_BLOCKS (255 * ((1 << 14) - 64)) | ||
| 21 | #define DM_SM_METADATA_MAX_SECTORS (DM_SM_METADATA_MAX_BLOCKS * DM_SM_METADATA_BLOCK_SIZE) | ||
| 22 | |||
| 12 | /* | 23 | /* |
| 13 | * Unfortunately we have to use two-phase construction due to the cycle | 24 | * Unfortunately we have to use two-phase construction due to the cycle |
| 14 | * between the tm and sm. | 25 | * between the tm and sm. |
diff --git a/drivers/mtd/ubi/fastmap.c b/drivers/mtd/ubi/fastmap.c index ead861307b3c..c5dad652614d 100644 --- a/drivers/mtd/ubi/fastmap.c +++ b/drivers/mtd/ubi/fastmap.c | |||
| @@ -463,8 +463,8 @@ static int scan_pool(struct ubi_device *ubi, struct ubi_attach_info *ai, | |||
| 463 | } | 463 | } |
| 464 | } | 464 | } |
| 465 | if (found_orphan) { | 465 | if (found_orphan) { |
| 466 | kmem_cache_free(ai->aeb_slab_cache, tmp_aeb); | ||
| 467 | list_del(&tmp_aeb->u.list); | 466 | list_del(&tmp_aeb->u.list); |
| 467 | kmem_cache_free(ai->aeb_slab_cache, tmp_aeb); | ||
| 468 | } | 468 | } |
| 469 | 469 | ||
| 470 | new_aeb = kmem_cache_alloc(ai->aeb_slab_cache, | 470 | new_aeb = kmem_cache_alloc(ai->aeb_slab_cache, |
| @@ -846,16 +846,16 @@ fail_bad: | |||
| 846 | ret = UBI_BAD_FASTMAP; | 846 | ret = UBI_BAD_FASTMAP; |
| 847 | fail: | 847 | fail: |
| 848 | list_for_each_entry_safe(tmp_aeb, _tmp_aeb, &used, u.list) { | 848 | list_for_each_entry_safe(tmp_aeb, _tmp_aeb, &used, u.list) { |
| 849 | kmem_cache_free(ai->aeb_slab_cache, tmp_aeb); | ||
| 850 | list_del(&tmp_aeb->u.list); | 849 | list_del(&tmp_aeb->u.list); |
| 850 | kmem_cache_free(ai->aeb_slab_cache, tmp_aeb); | ||
| 851 | } | 851 | } |
| 852 | list_for_each_entry_safe(tmp_aeb, _tmp_aeb, &eba_orphans, u.list) { | 852 | list_for_each_entry_safe(tmp_aeb, _tmp_aeb, &eba_orphans, u.list) { |
| 853 | kmem_cache_free(ai->aeb_slab_cache, tmp_aeb); | ||
| 854 | list_del(&tmp_aeb->u.list); | 853 | list_del(&tmp_aeb->u.list); |
| 854 | kmem_cache_free(ai->aeb_slab_cache, tmp_aeb); | ||
| 855 | } | 855 | } |
| 856 | list_for_each_entry_safe(tmp_aeb, _tmp_aeb, &free, u.list) { | 856 | list_for_each_entry_safe(tmp_aeb, _tmp_aeb, &free, u.list) { |
| 857 | kmem_cache_free(ai->aeb_slab_cache, tmp_aeb); | ||
| 858 | list_del(&tmp_aeb->u.list); | 857 | list_del(&tmp_aeb->u.list); |
| 858 | kmem_cache_free(ai->aeb_slab_cache, tmp_aeb); | ||
| 859 | } | 859 | } |
| 860 | 860 | ||
| 861 | return ret; | 861 | return ret; |
diff --git a/drivers/net/bonding/bond_3ad.c b/drivers/net/bonding/bond_3ad.c index 6d20fbde8d43..dcde56057fe1 100644 --- a/drivers/net/bonding/bond_3ad.c +++ b/drivers/net/bonding/bond_3ad.c | |||
| @@ -181,7 +181,7 @@ static inline int __agg_has_partner(struct aggregator *agg) | |||
| 181 | */ | 181 | */ |
| 182 | static inline void __disable_port(struct port *port) | 182 | static inline void __disable_port(struct port *port) |
| 183 | { | 183 | { |
| 184 | bond_set_slave_inactive_flags(port->slave); | 184 | bond_set_slave_inactive_flags(port->slave, BOND_SLAVE_NOTIFY_LATER); |
| 185 | } | 185 | } |
| 186 | 186 | ||
| 187 | /** | 187 | /** |
| @@ -193,7 +193,7 @@ static inline void __enable_port(struct port *port) | |||
| 193 | struct slave *slave = port->slave; | 193 | struct slave *slave = port->slave; |
| 194 | 194 | ||
| 195 | if ((slave->link == BOND_LINK_UP) && IS_UP(slave->dev)) | 195 | if ((slave->link == BOND_LINK_UP) && IS_UP(slave->dev)) |
| 196 | bond_set_slave_active_flags(slave); | 196 | bond_set_slave_active_flags(slave, BOND_SLAVE_NOTIFY_LATER); |
| 197 | } | 197 | } |
| 198 | 198 | ||
| 199 | /** | 199 | /** |
| @@ -2062,6 +2062,7 @@ void bond_3ad_state_machine_handler(struct work_struct *work) | |||
| 2062 | struct list_head *iter; | 2062 | struct list_head *iter; |
| 2063 | struct slave *slave; | 2063 | struct slave *slave; |
| 2064 | struct port *port; | 2064 | struct port *port; |
| 2065 | bool should_notify_rtnl = BOND_SLAVE_NOTIFY_LATER; | ||
| 2065 | 2066 | ||
| 2066 | read_lock(&bond->lock); | 2067 | read_lock(&bond->lock); |
| 2067 | rcu_read_lock(); | 2068 | rcu_read_lock(); |
| @@ -2119,8 +2120,19 @@ void bond_3ad_state_machine_handler(struct work_struct *work) | |||
| 2119 | } | 2120 | } |
| 2120 | 2121 | ||
| 2121 | re_arm: | 2122 | re_arm: |
| 2123 | bond_for_each_slave_rcu(bond, slave, iter) { | ||
| 2124 | if (slave->should_notify) { | ||
| 2125 | should_notify_rtnl = BOND_SLAVE_NOTIFY_NOW; | ||
| 2126 | break; | ||
| 2127 | } | ||
| 2128 | } | ||
| 2122 | rcu_read_unlock(); | 2129 | rcu_read_unlock(); |
| 2123 | read_unlock(&bond->lock); | 2130 | read_unlock(&bond->lock); |
| 2131 | |||
| 2132 | if (should_notify_rtnl && rtnl_trylock()) { | ||
| 2133 | bond_slave_state_notify(bond); | ||
| 2134 | rtnl_unlock(); | ||
| 2135 | } | ||
| 2124 | queue_delayed_work(bond->wq, &bond->ad_work, ad_delta_in_ticks); | 2136 | queue_delayed_work(bond->wq, &bond->ad_work, ad_delta_in_ticks); |
| 2125 | } | 2137 | } |
| 2126 | 2138 | ||
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 1c6104d3501d..e5628fc725c3 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
| @@ -829,21 +829,25 @@ void bond_change_active_slave(struct bonding *bond, struct slave *new_active) | |||
| 829 | if (bond_is_lb(bond)) { | 829 | if (bond_is_lb(bond)) { |
| 830 | bond_alb_handle_active_change(bond, new_active); | 830 | bond_alb_handle_active_change(bond, new_active); |
| 831 | if (old_active) | 831 | if (old_active) |
| 832 | bond_set_slave_inactive_flags(old_active); | 832 | bond_set_slave_inactive_flags(old_active, |
| 833 | BOND_SLAVE_NOTIFY_NOW); | ||
| 833 | if (new_active) | 834 | if (new_active) |
| 834 | bond_set_slave_active_flags(new_active); | 835 | bond_set_slave_active_flags(new_active, |
| 836 | BOND_SLAVE_NOTIFY_NOW); | ||
| 835 | } else { | 837 | } else { |
| 836 | rcu_assign_pointer(bond->curr_active_slave, new_active); | 838 | rcu_assign_pointer(bond->curr_active_slave, new_active); |
| 837 | } | 839 | } |
| 838 | 840 | ||
| 839 | if (bond->params.mode == BOND_MODE_ACTIVEBACKUP) { | 841 | if (bond->params.mode == BOND_MODE_ACTIVEBACKUP) { |
| 840 | if (old_active) | 842 | if (old_active) |
| 841 | bond_set_slave_inactive_flags(old_active); | 843 | bond_set_slave_inactive_flags(old_active, |
| 844 | BOND_SLAVE_NOTIFY_NOW); | ||
| 842 | 845 | ||
| 843 | if (new_active) { | 846 | if (new_active) { |
| 844 | bool should_notify_peers = false; | 847 | bool should_notify_peers = false; |
| 845 | 848 | ||
| 846 | bond_set_slave_active_flags(new_active); | 849 | bond_set_slave_active_flags(new_active, |
| 850 | BOND_SLAVE_NOTIFY_NOW); | ||
| 847 | 851 | ||
| 848 | if (bond->params.fail_over_mac) | 852 | if (bond->params.fail_over_mac) |
| 849 | bond_do_fail_over_mac(bond, new_active, | 853 | bond_do_fail_over_mac(bond, new_active, |
| @@ -1193,6 +1197,11 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) | |||
| 1193 | return -EBUSY; | 1197 | return -EBUSY; |
| 1194 | } | 1198 | } |
| 1195 | 1199 | ||
| 1200 | if (bond_dev == slave_dev) { | ||
| 1201 | pr_err("%s: cannot enslave bond to itself.\n", bond_dev->name); | ||
| 1202 | return -EPERM; | ||
| 1203 | } | ||
| 1204 | |||
| 1196 | /* vlan challenged mutual exclusion */ | 1205 | /* vlan challenged mutual exclusion */ |
| 1197 | /* no need to lock since we're protected by rtnl_lock */ | 1206 | /* no need to lock since we're protected by rtnl_lock */ |
| 1198 | if (slave_dev->features & NETIF_F_VLAN_CHALLENGED) { | 1207 | if (slave_dev->features & NETIF_F_VLAN_CHALLENGED) { |
| @@ -1463,14 +1472,15 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) | |||
| 1463 | 1472 | ||
| 1464 | switch (bond->params.mode) { | 1473 | switch (bond->params.mode) { |
| 1465 | case BOND_MODE_ACTIVEBACKUP: | 1474 | case BOND_MODE_ACTIVEBACKUP: |
| 1466 | bond_set_slave_inactive_flags(new_slave); | 1475 | bond_set_slave_inactive_flags(new_slave, |
| 1476 | BOND_SLAVE_NOTIFY_NOW); | ||
| 1467 | break; | 1477 | break; |
| 1468 | case BOND_MODE_8023AD: | 1478 | case BOND_MODE_8023AD: |
| 1469 | /* in 802.3ad mode, the internal mechanism | 1479 | /* in 802.3ad mode, the internal mechanism |
| 1470 | * will activate the slaves in the selected | 1480 | * will activate the slaves in the selected |
| 1471 | * aggregator | 1481 | * aggregator |
| 1472 | */ | 1482 | */ |
| 1473 | bond_set_slave_inactive_flags(new_slave); | 1483 | bond_set_slave_inactive_flags(new_slave, BOND_SLAVE_NOTIFY_NOW); |
| 1474 | /* if this is the first slave */ | 1484 | /* if this is the first slave */ |
| 1475 | if (!prev_slave) { | 1485 | if (!prev_slave) { |
| 1476 | SLAVE_AD_INFO(new_slave).id = 1; | 1486 | SLAVE_AD_INFO(new_slave).id = 1; |
| @@ -1488,7 +1498,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) | |||
| 1488 | case BOND_MODE_TLB: | 1498 | case BOND_MODE_TLB: |
| 1489 | case BOND_MODE_ALB: | 1499 | case BOND_MODE_ALB: |
| 1490 | bond_set_active_slave(new_slave); | 1500 | bond_set_active_slave(new_slave); |
| 1491 | bond_set_slave_inactive_flags(new_slave); | 1501 | bond_set_slave_inactive_flags(new_slave, BOND_SLAVE_NOTIFY_NOW); |
| 1492 | break; | 1502 | break; |
| 1493 | default: | 1503 | default: |
| 1494 | pr_debug("This slave is always active in trunk mode\n"); | 1504 | pr_debug("This slave is always active in trunk mode\n"); |
| @@ -1654,9 +1664,6 @@ static int __bond_release_one(struct net_device *bond_dev, | |||
| 1654 | return -EINVAL; | 1664 | return -EINVAL; |
| 1655 | } | 1665 | } |
| 1656 | 1666 | ||
| 1657 | /* release the slave from its bond */ | ||
| 1658 | bond->slave_cnt--; | ||
| 1659 | |||
| 1660 | bond_sysfs_slave_del(slave); | 1667 | bond_sysfs_slave_del(slave); |
| 1661 | 1668 | ||
| 1662 | bond_upper_dev_unlink(bond_dev, slave_dev); | 1669 | bond_upper_dev_unlink(bond_dev, slave_dev); |
| @@ -1738,6 +1745,7 @@ static int __bond_release_one(struct net_device *bond_dev, | |||
| 1738 | 1745 | ||
| 1739 | unblock_netpoll_tx(); | 1746 | unblock_netpoll_tx(); |
| 1740 | synchronize_rcu(); | 1747 | synchronize_rcu(); |
| 1748 | bond->slave_cnt--; | ||
| 1741 | 1749 | ||
| 1742 | if (!bond_has_slaves(bond)) { | 1750 | if (!bond_has_slaves(bond)) { |
| 1743 | call_netdevice_notifiers(NETDEV_CHANGEADDR, bond->dev); | 1751 | call_netdevice_notifiers(NETDEV_CHANGEADDR, bond->dev); |
| @@ -2015,7 +2023,8 @@ static void bond_miimon_commit(struct bonding *bond) | |||
| 2015 | 2023 | ||
| 2016 | if (bond->params.mode == BOND_MODE_ACTIVEBACKUP || | 2024 | if (bond->params.mode == BOND_MODE_ACTIVEBACKUP || |
| 2017 | bond->params.mode == BOND_MODE_8023AD) | 2025 | bond->params.mode == BOND_MODE_8023AD) |
| 2018 | bond_set_slave_inactive_flags(slave); | 2026 | bond_set_slave_inactive_flags(slave, |
| 2027 | BOND_SLAVE_NOTIFY_NOW); | ||
| 2019 | 2028 | ||
| 2020 | pr_info("%s: link status definitely down for interface %s, disabling it\n", | 2029 | pr_info("%s: link status definitely down for interface %s, disabling it\n", |
| 2021 | bond->dev->name, slave->dev->name); | 2030 | bond->dev->name, slave->dev->name); |
| @@ -2562,7 +2571,8 @@ static void bond_ab_arp_commit(struct bonding *bond) | |||
| 2562 | slave->link = BOND_LINK_UP; | 2571 | slave->link = BOND_LINK_UP; |
| 2563 | if (bond->current_arp_slave) { | 2572 | if (bond->current_arp_slave) { |
| 2564 | bond_set_slave_inactive_flags( | 2573 | bond_set_slave_inactive_flags( |
| 2565 | bond->current_arp_slave); | 2574 | bond->current_arp_slave, |
| 2575 | BOND_SLAVE_NOTIFY_NOW); | ||
| 2566 | bond->current_arp_slave = NULL; | 2576 | bond->current_arp_slave = NULL; |
| 2567 | } | 2577 | } |
| 2568 | 2578 | ||
| @@ -2582,7 +2592,8 @@ static void bond_ab_arp_commit(struct bonding *bond) | |||
| 2582 | slave->link_failure_count++; | 2592 | slave->link_failure_count++; |
| 2583 | 2593 | ||
| 2584 | slave->link = BOND_LINK_DOWN; | 2594 | slave->link = BOND_LINK_DOWN; |
| 2585 | bond_set_slave_inactive_flags(slave); | 2595 | bond_set_slave_inactive_flags(slave, |
| 2596 | BOND_SLAVE_NOTIFY_NOW); | ||
| 2586 | 2597 | ||
| 2587 | pr_info("%s: link status definitely down for interface %s, disabling it\n", | 2598 | pr_info("%s: link status definitely down for interface %s, disabling it\n", |
| 2588 | bond->dev->name, slave->dev->name); | 2599 | bond->dev->name, slave->dev->name); |
| @@ -2615,17 +2626,17 @@ do_failover: | |||
| 2615 | 2626 | ||
| 2616 | /* | 2627 | /* |
| 2617 | * Send ARP probes for active-backup mode ARP monitor. | 2628 | * Send ARP probes for active-backup mode ARP monitor. |
| 2629 | * | ||
| 2630 | * Called with rcu_read_lock hold. | ||
| 2618 | */ | 2631 | */ |
| 2619 | static bool bond_ab_arp_probe(struct bonding *bond) | 2632 | static bool bond_ab_arp_probe(struct bonding *bond) |
| 2620 | { | 2633 | { |
| 2621 | struct slave *slave, *before = NULL, *new_slave = NULL, | 2634 | struct slave *slave, *before = NULL, *new_slave = NULL, |
| 2622 | *curr_arp_slave, *curr_active_slave; | 2635 | *curr_arp_slave = rcu_dereference(bond->current_arp_slave), |
| 2636 | *curr_active_slave = rcu_dereference(bond->curr_active_slave); | ||
| 2623 | struct list_head *iter; | 2637 | struct list_head *iter; |
| 2624 | bool found = false; | 2638 | bool found = false; |
| 2625 | 2639 | bool should_notify_rtnl = BOND_SLAVE_NOTIFY_LATER; | |
| 2626 | rcu_read_lock(); | ||
| 2627 | curr_arp_slave = rcu_dereference(bond->current_arp_slave); | ||
| 2628 | curr_active_slave = rcu_dereference(bond->curr_active_slave); | ||
| 2629 | 2640 | ||
| 2630 | if (curr_arp_slave && curr_active_slave) | 2641 | if (curr_arp_slave && curr_active_slave) |
| 2631 | pr_info("PROBE: c_arp %s && cas %s BAD\n", | 2642 | pr_info("PROBE: c_arp %s && cas %s BAD\n", |
| @@ -2634,32 +2645,23 @@ static bool bond_ab_arp_probe(struct bonding *bond) | |||
| 2634 | 2645 | ||
| 2635 | if (curr_active_slave) { | 2646 | if (curr_active_slave) { |
| 2636 | bond_arp_send_all(bond, curr_active_slave); | 2647 | bond_arp_send_all(bond, curr_active_slave); |
| 2637 | rcu_read_unlock(); | 2648 | return should_notify_rtnl; |
| 2638 | return true; | ||
| 2639 | } | 2649 | } |
| 2640 | rcu_read_unlock(); | ||
| 2641 | 2650 | ||
| 2642 | /* if we don't have a curr_active_slave, search for the next available | 2651 | /* if we don't have a curr_active_slave, search for the next available |
| 2643 | * backup slave from the current_arp_slave and make it the candidate | 2652 | * backup slave from the current_arp_slave and make it the candidate |
| 2644 | * for becoming the curr_active_slave | 2653 | * for becoming the curr_active_slave |
| 2645 | */ | 2654 | */ |
| 2646 | 2655 | ||
| 2647 | if (!rtnl_trylock()) | ||
| 2648 | return false; | ||
| 2649 | /* curr_arp_slave might have gone away */ | ||
| 2650 | curr_arp_slave = ACCESS_ONCE(bond->current_arp_slave); | ||
| 2651 | |||
| 2652 | if (!curr_arp_slave) { | 2656 | if (!curr_arp_slave) { |
| 2653 | curr_arp_slave = bond_first_slave(bond); | 2657 | curr_arp_slave = bond_first_slave_rcu(bond); |
| 2654 | if (!curr_arp_slave) { | 2658 | if (!curr_arp_slave) |
| 2655 | rtnl_unlock(); | 2659 | return should_notify_rtnl; |
| 2656 | return true; | ||
| 2657 | } | ||
| 2658 | } | 2660 | } |
| 2659 | 2661 | ||
| 2660 | bond_set_slave_inactive_flags(curr_arp_slave); | 2662 | bond_set_slave_inactive_flags(curr_arp_slave, BOND_SLAVE_NOTIFY_LATER); |
| 2661 | 2663 | ||
| 2662 | bond_for_each_slave(bond, slave, iter) { | 2664 | bond_for_each_slave_rcu(bond, slave, iter) { |
| 2663 | if (!found && !before && IS_UP(slave->dev)) | 2665 | if (!found && !before && IS_UP(slave->dev)) |
| 2664 | before = slave; | 2666 | before = slave; |
| 2665 | 2667 | ||
| @@ -2677,7 +2679,8 @@ static bool bond_ab_arp_probe(struct bonding *bond) | |||
| 2677 | if (slave->link_failure_count < UINT_MAX) | 2679 | if (slave->link_failure_count < UINT_MAX) |
| 2678 | slave->link_failure_count++; | 2680 | slave->link_failure_count++; |
| 2679 | 2681 | ||
| 2680 | bond_set_slave_inactive_flags(slave); | 2682 | bond_set_slave_inactive_flags(slave, |
| 2683 | BOND_SLAVE_NOTIFY_LATER); | ||
| 2681 | 2684 | ||
| 2682 | pr_info("%s: backup interface %s is now down.\n", | 2685 | pr_info("%s: backup interface %s is now down.\n", |
| 2683 | bond->dev->name, slave->dev->name); | 2686 | bond->dev->name, slave->dev->name); |
| @@ -2689,26 +2692,31 @@ static bool bond_ab_arp_probe(struct bonding *bond) | |||
| 2689 | if (!new_slave && before) | 2692 | if (!new_slave && before) |
| 2690 | new_slave = before; | 2693 | new_slave = before; |
| 2691 | 2694 | ||
| 2692 | if (!new_slave) { | 2695 | if (!new_slave) |
| 2693 | rtnl_unlock(); | 2696 | goto check_state; |
| 2694 | return true; | ||
| 2695 | } | ||
| 2696 | 2697 | ||
| 2697 | new_slave->link = BOND_LINK_BACK; | 2698 | new_slave->link = BOND_LINK_BACK; |
| 2698 | bond_set_slave_active_flags(new_slave); | 2699 | bond_set_slave_active_flags(new_slave, BOND_SLAVE_NOTIFY_LATER); |
| 2699 | bond_arp_send_all(bond, new_slave); | 2700 | bond_arp_send_all(bond, new_slave); |
| 2700 | new_slave->jiffies = jiffies; | 2701 | new_slave->jiffies = jiffies; |
| 2701 | rcu_assign_pointer(bond->current_arp_slave, new_slave); | 2702 | rcu_assign_pointer(bond->current_arp_slave, new_slave); |
| 2702 | rtnl_unlock(); | ||
| 2703 | 2703 | ||
| 2704 | return true; | 2704 | check_state: |
| 2705 | bond_for_each_slave_rcu(bond, slave, iter) { | ||
| 2706 | if (slave->should_notify) { | ||
| 2707 | should_notify_rtnl = BOND_SLAVE_NOTIFY_NOW; | ||
| 2708 | break; | ||
| 2709 | } | ||
| 2710 | } | ||
| 2711 | return should_notify_rtnl; | ||
| 2705 | } | 2712 | } |
| 2706 | 2713 | ||
| 2707 | static void bond_activebackup_arp_mon(struct work_struct *work) | 2714 | static void bond_activebackup_arp_mon(struct work_struct *work) |
| 2708 | { | 2715 | { |
| 2709 | struct bonding *bond = container_of(work, struct bonding, | 2716 | struct bonding *bond = container_of(work, struct bonding, |
| 2710 | arp_work.work); | 2717 | arp_work.work); |
| 2711 | bool should_notify_peers = false, should_commit = false; | 2718 | bool should_notify_peers = false; |
| 2719 | bool should_notify_rtnl = false; | ||
| 2712 | int delta_in_ticks; | 2720 | int delta_in_ticks; |
| 2713 | 2721 | ||
| 2714 | delta_in_ticks = msecs_to_jiffies(bond->params.arp_interval); | 2722 | delta_in_ticks = msecs_to_jiffies(bond->params.arp_interval); |
| @@ -2717,11 +2725,12 @@ static void bond_activebackup_arp_mon(struct work_struct *work) | |||
| 2717 | goto re_arm; | 2725 | goto re_arm; |
| 2718 | 2726 | ||
| 2719 | rcu_read_lock(); | 2727 | rcu_read_lock(); |
| 2728 | |||
| 2720 | should_notify_peers = bond_should_notify_peers(bond); | 2729 | should_notify_peers = bond_should_notify_peers(bond); |
| 2721 | should_commit = bond_ab_arp_inspect(bond); | ||
| 2722 | rcu_read_unlock(); | ||
| 2723 | 2730 | ||
| 2724 | if (should_commit) { | 2731 | if (bond_ab_arp_inspect(bond)) { |
| 2732 | rcu_read_unlock(); | ||
| 2733 | |||
| 2725 | /* Race avoidance with bond_close flush of workqueue */ | 2734 | /* Race avoidance with bond_close flush of workqueue */ |
| 2726 | if (!rtnl_trylock()) { | 2735 | if (!rtnl_trylock()) { |
| 2727 | delta_in_ticks = 1; | 2736 | delta_in_ticks = 1; |
| @@ -2730,23 +2739,28 @@ static void bond_activebackup_arp_mon(struct work_struct *work) | |||
| 2730 | } | 2739 | } |
| 2731 | 2740 | ||
| 2732 | bond_ab_arp_commit(bond); | 2741 | bond_ab_arp_commit(bond); |
| 2742 | |||
| 2733 | rtnl_unlock(); | 2743 | rtnl_unlock(); |
| 2744 | rcu_read_lock(); | ||
| 2734 | } | 2745 | } |
| 2735 | 2746 | ||
| 2736 | if (!bond_ab_arp_probe(bond)) { | 2747 | should_notify_rtnl = bond_ab_arp_probe(bond); |
| 2737 | /* rtnl locking failed, re-arm */ | 2748 | rcu_read_unlock(); |
| 2738 | delta_in_ticks = 1; | ||
| 2739 | should_notify_peers = false; | ||
| 2740 | } | ||
| 2741 | 2749 | ||
| 2742 | re_arm: | 2750 | re_arm: |
| 2743 | if (bond->params.arp_interval) | 2751 | if (bond->params.arp_interval) |
| 2744 | queue_delayed_work(bond->wq, &bond->arp_work, delta_in_ticks); | 2752 | queue_delayed_work(bond->wq, &bond->arp_work, delta_in_ticks); |
| 2745 | 2753 | ||
| 2746 | if (should_notify_peers) { | 2754 | if (should_notify_peers || should_notify_rtnl) { |
| 2747 | if (!rtnl_trylock()) | 2755 | if (!rtnl_trylock()) |
| 2748 | return; | 2756 | return; |
| 2749 | call_netdevice_notifiers(NETDEV_NOTIFY_PEERS, bond->dev); | 2757 | |
| 2758 | if (should_notify_peers) | ||
| 2759 | call_netdevice_notifiers(NETDEV_NOTIFY_PEERS, | ||
| 2760 | bond->dev); | ||
| 2761 | if (should_notify_rtnl) | ||
| 2762 | bond_slave_state_notify(bond); | ||
| 2763 | |||
| 2750 | rtnl_unlock(); | 2764 | rtnl_unlock(); |
| 2751 | } | 2765 | } |
| 2752 | } | 2766 | } |
| @@ -3046,9 +3060,11 @@ static int bond_open(struct net_device *bond_dev) | |||
| 3046 | bond_for_each_slave(bond, slave, iter) { | 3060 | bond_for_each_slave(bond, slave, iter) { |
| 3047 | if ((bond->params.mode == BOND_MODE_ACTIVEBACKUP) | 3061 | if ((bond->params.mode == BOND_MODE_ACTIVEBACKUP) |
| 3048 | && (slave != bond->curr_active_slave)) { | 3062 | && (slave != bond->curr_active_slave)) { |
| 3049 | bond_set_slave_inactive_flags(slave); | 3063 | bond_set_slave_inactive_flags(slave, |
| 3064 | BOND_SLAVE_NOTIFY_NOW); | ||
| 3050 | } else { | 3065 | } else { |
| 3051 | bond_set_slave_active_flags(slave); | 3066 | bond_set_slave_active_flags(slave, |
| 3067 | BOND_SLAVE_NOTIFY_NOW); | ||
| 3052 | } | 3068 | } |
| 3053 | } | 3069 | } |
| 3054 | read_unlock(&bond->curr_slave_lock); | 3070 | read_unlock(&bond->curr_slave_lock); |
diff --git a/drivers/net/bonding/bonding.h b/drivers/net/bonding/bonding.h index 86ccfb9f71cc..2b0fdec695f7 100644 --- a/drivers/net/bonding/bonding.h +++ b/drivers/net/bonding/bonding.h | |||
| @@ -195,7 +195,8 @@ struct slave { | |||
| 195 | s8 new_link; | 195 | s8 new_link; |
| 196 | u8 backup:1, /* indicates backup slave. Value corresponds with | 196 | u8 backup:1, /* indicates backup slave. Value corresponds with |
| 197 | BOND_STATE_ACTIVE and BOND_STATE_BACKUP */ | 197 | BOND_STATE_ACTIVE and BOND_STATE_BACKUP */ |
| 198 | inactive:1; /* indicates inactive slave */ | 198 | inactive:1, /* indicates inactive slave */ |
| 199 | should_notify:1; /* indicateds whether the state changed */ | ||
| 199 | u8 duplex; | 200 | u8 duplex; |
| 200 | u32 original_mtu; | 201 | u32 original_mtu; |
| 201 | u32 link_failure_count; | 202 | u32 link_failure_count; |
| @@ -303,6 +304,24 @@ static inline void bond_set_backup_slave(struct slave *slave) | |||
| 303 | } | 304 | } |
| 304 | } | 305 | } |
| 305 | 306 | ||
| 307 | static inline void bond_set_slave_state(struct slave *slave, | ||
| 308 | int slave_state, bool notify) | ||
| 309 | { | ||
| 310 | if (slave->backup == slave_state) | ||
| 311 | return; | ||
| 312 | |||
| 313 | slave->backup = slave_state; | ||
| 314 | if (notify) { | ||
| 315 | rtmsg_ifinfo(RTM_NEWLINK, slave->dev, 0, GFP_KERNEL); | ||
| 316 | slave->should_notify = 0; | ||
| 317 | } else { | ||
| 318 | if (slave->should_notify) | ||
| 319 | slave->should_notify = 0; | ||
| 320 | else | ||
| 321 | slave->should_notify = 1; | ||
| 322 | } | ||
| 323 | } | ||
| 324 | |||
| 306 | static inline void bond_slave_state_change(struct bonding *bond) | 325 | static inline void bond_slave_state_change(struct bonding *bond) |
| 307 | { | 326 | { |
| 308 | struct list_head *iter; | 327 | struct list_head *iter; |
| @@ -316,6 +335,19 @@ static inline void bond_slave_state_change(struct bonding *bond) | |||
| 316 | } | 335 | } |
| 317 | } | 336 | } |
| 318 | 337 | ||
| 338 | static inline void bond_slave_state_notify(struct bonding *bond) | ||
| 339 | { | ||
| 340 | struct list_head *iter; | ||
| 341 | struct slave *tmp; | ||
| 342 | |||
| 343 | bond_for_each_slave(bond, tmp, iter) { | ||
| 344 | if (tmp->should_notify) { | ||
| 345 | rtmsg_ifinfo(RTM_NEWLINK, tmp->dev, 0, GFP_KERNEL); | ||
| 346 | tmp->should_notify = 0; | ||
| 347 | } | ||
| 348 | } | ||
| 349 | } | ||
| 350 | |||
| 319 | static inline int bond_slave_state(struct slave *slave) | 351 | static inline int bond_slave_state(struct slave *slave) |
| 320 | { | 352 | { |
| 321 | return slave->backup; | 353 | return slave->backup; |
| @@ -343,6 +375,9 @@ static inline bool bond_is_active_slave(struct slave *slave) | |||
| 343 | #define BOND_ARP_VALIDATE_ALL (BOND_ARP_VALIDATE_ACTIVE | \ | 375 | #define BOND_ARP_VALIDATE_ALL (BOND_ARP_VALIDATE_ACTIVE | \ |
| 344 | BOND_ARP_VALIDATE_BACKUP) | 376 | BOND_ARP_VALIDATE_BACKUP) |
| 345 | 377 | ||
| 378 | #define BOND_SLAVE_NOTIFY_NOW true | ||
| 379 | #define BOND_SLAVE_NOTIFY_LATER false | ||
| 380 | |||
| 346 | static inline int slave_do_arp_validate(struct bonding *bond, | 381 | static inline int slave_do_arp_validate(struct bonding *bond, |
| 347 | struct slave *slave) | 382 | struct slave *slave) |
| 348 | { | 383 | { |
| @@ -394,17 +429,19 @@ static inline void bond_netpoll_send_skb(const struct slave *slave, | |||
| 394 | } | 429 | } |
| 395 | #endif | 430 | #endif |
| 396 | 431 | ||
| 397 | static inline void bond_set_slave_inactive_flags(struct slave *slave) | 432 | static inline void bond_set_slave_inactive_flags(struct slave *slave, |
| 433 | bool notify) | ||
| 398 | { | 434 | { |
| 399 | if (!bond_is_lb(slave->bond)) | 435 | if (!bond_is_lb(slave->bond)) |
| 400 | bond_set_backup_slave(slave); | 436 | bond_set_slave_state(slave, BOND_STATE_BACKUP, notify); |
| 401 | if (!slave->bond->params.all_slaves_active) | 437 | if (!slave->bond->params.all_slaves_active) |
| 402 | slave->inactive = 1; | 438 | slave->inactive = 1; |
| 403 | } | 439 | } |
| 404 | 440 | ||
| 405 | static inline void bond_set_slave_active_flags(struct slave *slave) | 441 | static inline void bond_set_slave_active_flags(struct slave *slave, |
| 442 | bool notify) | ||
| 406 | { | 443 | { |
| 407 | bond_set_active_slave(slave); | 444 | bond_set_slave_state(slave, BOND_STATE_ACTIVE, notify); |
| 408 | slave->inactive = 0; | 445 | slave->inactive = 0; |
| 409 | } | 446 | } |
| 410 | 447 | ||
diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c index 320bef2dba42..61376abdab39 100644 --- a/drivers/net/can/flexcan.c +++ b/drivers/net/can/flexcan.c | |||
| @@ -144,6 +144,8 @@ | |||
| 144 | 144 | ||
| 145 | #define FLEXCAN_MB_CODE_MASK (0xf0ffffff) | 145 | #define FLEXCAN_MB_CODE_MASK (0xf0ffffff) |
| 146 | 146 | ||
| 147 | #define FLEXCAN_TIMEOUT_US (50) | ||
| 148 | |||
| 147 | /* | 149 | /* |
| 148 | * FLEXCAN hardware feature flags | 150 | * FLEXCAN hardware feature flags |
| 149 | * | 151 | * |
| @@ -262,6 +264,22 @@ static inline void flexcan_write(u32 val, void __iomem *addr) | |||
| 262 | } | 264 | } |
| 263 | #endif | 265 | #endif |
| 264 | 266 | ||
| 267 | static inline int flexcan_transceiver_enable(const struct flexcan_priv *priv) | ||
| 268 | { | ||
| 269 | if (!priv->reg_xceiver) | ||
| 270 | return 0; | ||
| 271 | |||
| 272 | return regulator_enable(priv->reg_xceiver); | ||
| 273 | } | ||
| 274 | |||
| 275 | static inline int flexcan_transceiver_disable(const struct flexcan_priv *priv) | ||
| 276 | { | ||
| 277 | if (!priv->reg_xceiver) | ||
| 278 | return 0; | ||
| 279 | |||
| 280 | return regulator_disable(priv->reg_xceiver); | ||
| 281 | } | ||
| 282 | |||
| 265 | static inline int flexcan_has_and_handle_berr(const struct flexcan_priv *priv, | 283 | static inline int flexcan_has_and_handle_berr(const struct flexcan_priv *priv, |
| 266 | u32 reg_esr) | 284 | u32 reg_esr) |
| 267 | { | 285 | { |
| @@ -269,26 +287,95 @@ static inline int flexcan_has_and_handle_berr(const struct flexcan_priv *priv, | |||
| 269 | (reg_esr & FLEXCAN_ESR_ERR_BUS); | 287 | (reg_esr & FLEXCAN_ESR_ERR_BUS); |
| 270 | } | 288 | } |
| 271 | 289 | ||
| 272 | static inline void flexcan_chip_enable(struct flexcan_priv *priv) | 290 | static int flexcan_chip_enable(struct flexcan_priv *priv) |
| 273 | { | 291 | { |
| 274 | struct flexcan_regs __iomem *regs = priv->base; | 292 | struct flexcan_regs __iomem *regs = priv->base; |
| 293 | unsigned int timeout = FLEXCAN_TIMEOUT_US / 10; | ||
| 275 | u32 reg; | 294 | u32 reg; |
| 276 | 295 | ||
| 277 | reg = flexcan_read(®s->mcr); | 296 | reg = flexcan_read(®s->mcr); |
| 278 | reg &= ~FLEXCAN_MCR_MDIS; | 297 | reg &= ~FLEXCAN_MCR_MDIS; |
| 279 | flexcan_write(reg, ®s->mcr); | 298 | flexcan_write(reg, ®s->mcr); |
| 280 | 299 | ||
| 281 | udelay(10); | 300 | while (timeout-- && (flexcan_read(®s->mcr) & FLEXCAN_MCR_LPM_ACK)) |
| 301 | usleep_range(10, 20); | ||
| 302 | |||
| 303 | if (flexcan_read(®s->mcr) & FLEXCAN_MCR_LPM_ACK) | ||
| 304 | return -ETIMEDOUT; | ||
| 305 | |||
| 306 | return 0; | ||
| 282 | } | 307 | } |
| 283 | 308 | ||
| 284 | static inline void flexcan_chip_disable(struct flexcan_priv *priv) | 309 | static int flexcan_chip_disable(struct flexcan_priv *priv) |
| 285 | { | 310 | { |
| 286 | struct flexcan_regs __iomem *regs = priv->base; | 311 | struct flexcan_regs __iomem *regs = priv->base; |
| 312 | unsigned int timeout = FLEXCAN_TIMEOUT_US / 10; | ||
| 287 | u32 reg; | 313 | u32 reg; |
| 288 | 314 | ||
| 289 | reg = flexcan_read(®s->mcr); | 315 | reg = flexcan_read(®s->mcr); |
| 290 | reg |= FLEXCAN_MCR_MDIS; | 316 | reg |= FLEXCAN_MCR_MDIS; |
| 291 | flexcan_write(reg, ®s->mcr); | 317 | flexcan_write(reg, ®s->mcr); |
| 318 | |||
| 319 | while (timeout-- && !(flexcan_read(®s->mcr) & FLEXCAN_MCR_LPM_ACK)) | ||
| 320 | usleep_range(10, 20); | ||
| 321 | |||
| 322 | if (!(flexcan_read(®s->mcr) & FLEXCAN_MCR_LPM_ACK)) | ||
| 323 | return -ETIMEDOUT; | ||
| 324 | |||
| 325 | return 0; | ||
| 326 | } | ||
| 327 | |||
| 328 | static int flexcan_chip_freeze(struct flexcan_priv *priv) | ||
| 329 | { | ||
| 330 | struct flexcan_regs __iomem *regs = priv->base; | ||
| 331 | unsigned int timeout = 1000 * 1000 * 10 / priv->can.bittiming.bitrate; | ||
| 332 | u32 reg; | ||
| 333 | |||
| 334 | reg = flexcan_read(®s->mcr); | ||
| 335 | reg |= FLEXCAN_MCR_HALT; | ||
| 336 | flexcan_write(reg, ®s->mcr); | ||
| 337 | |||
| 338 | while (timeout-- && !(flexcan_read(®s->mcr) & FLEXCAN_MCR_FRZ_ACK)) | ||
| 339 | usleep_range(100, 200); | ||
| 340 | |||
| 341 | if (!(flexcan_read(®s->mcr) & FLEXCAN_MCR_FRZ_ACK)) | ||
| 342 | return -ETIMEDOUT; | ||
| 343 | |||
| 344 | return 0; | ||
| 345 | } | ||
| 346 | |||
| 347 | static int flexcan_chip_unfreeze(struct flexcan_priv *priv) | ||
| 348 | { | ||
| 349 | struct flexcan_regs __iomem *regs = priv->base; | ||
| 350 | unsigned int timeout = FLEXCAN_TIMEOUT_US / 10; | ||
| 351 | u32 reg; | ||
| 352 | |||
| 353 | reg = flexcan_read(®s->mcr); | ||
| 354 | reg &= ~FLEXCAN_MCR_HALT; | ||
| 355 | flexcan_write(reg, ®s->mcr); | ||
| 356 | |||
| 357 | while (timeout-- && (flexcan_read(®s->mcr) & FLEXCAN_MCR_FRZ_ACK)) | ||
| 358 | usleep_range(10, 20); | ||
| 359 | |||
| 360 | if (flexcan_read(®s->mcr) & FLEXCAN_MCR_FRZ_ACK) | ||
| 361 | return -ETIMEDOUT; | ||
| 362 | |||
| 363 | return 0; | ||
| 364 | } | ||
| 365 | |||
| 366 | static int flexcan_chip_softreset(struct flexcan_priv *priv) | ||
| 367 | { | ||
| 368 | struct flexcan_regs __iomem *regs = priv->base; | ||
| 369 | unsigned int timeout = FLEXCAN_TIMEOUT_US / 10; | ||
| 370 | |||
| 371 | flexcan_write(FLEXCAN_MCR_SOFTRST, ®s->mcr); | ||
| 372 | while (timeout-- && (flexcan_read(®s->mcr) & FLEXCAN_MCR_SOFTRST)) | ||
| 373 | usleep_range(10, 20); | ||
| 374 | |||
| 375 | if (flexcan_read(®s->mcr) & FLEXCAN_MCR_SOFTRST) | ||
| 376 | return -ETIMEDOUT; | ||
| 377 | |||
| 378 | return 0; | ||
| 292 | } | 379 | } |
| 293 | 380 | ||
| 294 | static int flexcan_get_berr_counter(const struct net_device *dev, | 381 | static int flexcan_get_berr_counter(const struct net_device *dev, |
| @@ -709,19 +796,14 @@ static int flexcan_chip_start(struct net_device *dev) | |||
| 709 | u32 reg_mcr, reg_ctrl; | 796 | u32 reg_mcr, reg_ctrl; |
| 710 | 797 | ||
| 711 | /* enable module */ | 798 | /* enable module */ |
| 712 | flexcan_chip_enable(priv); | 799 | err = flexcan_chip_enable(priv); |
| 800 | if (err) | ||
| 801 | return err; | ||
| 713 | 802 | ||
| 714 | /* soft reset */ | 803 | /* soft reset */ |
| 715 | flexcan_write(FLEXCAN_MCR_SOFTRST, ®s->mcr); | 804 | err = flexcan_chip_softreset(priv); |
| 716 | udelay(10); | 805 | if (err) |
| 717 | 806 | goto out_chip_disable; | |
| 718 | reg_mcr = flexcan_read(®s->mcr); | ||
| 719 | if (reg_mcr & FLEXCAN_MCR_SOFTRST) { | ||
| 720 | netdev_err(dev, "Failed to softreset can module (mcr=0x%08x)\n", | ||
| 721 | reg_mcr); | ||
| 722 | err = -ENODEV; | ||
| 723 | goto out; | ||
| 724 | } | ||
| 725 | 807 | ||
| 726 | flexcan_set_bittiming(dev); | 808 | flexcan_set_bittiming(dev); |
| 727 | 809 | ||
| @@ -788,16 +870,14 @@ static int flexcan_chip_start(struct net_device *dev) | |||
| 788 | if (priv->devtype_data->features & FLEXCAN_HAS_V10_FEATURES) | 870 | if (priv->devtype_data->features & FLEXCAN_HAS_V10_FEATURES) |
| 789 | flexcan_write(0x0, ®s->rxfgmask); | 871 | flexcan_write(0x0, ®s->rxfgmask); |
| 790 | 872 | ||
| 791 | if (priv->reg_xceiver) { | 873 | err = flexcan_transceiver_enable(priv); |
| 792 | err = regulator_enable(priv->reg_xceiver); | 874 | if (err) |
| 793 | if (err) | 875 | goto out_chip_disable; |
| 794 | goto out; | ||
| 795 | } | ||
| 796 | 876 | ||
| 797 | /* synchronize with the can bus */ | 877 | /* synchronize with the can bus */ |
| 798 | reg_mcr = flexcan_read(®s->mcr); | 878 | err = flexcan_chip_unfreeze(priv); |
| 799 | reg_mcr &= ~FLEXCAN_MCR_HALT; | 879 | if (err) |
| 800 | flexcan_write(reg_mcr, ®s->mcr); | 880 | goto out_transceiver_disable; |
| 801 | 881 | ||
| 802 | priv->can.state = CAN_STATE_ERROR_ACTIVE; | 882 | priv->can.state = CAN_STATE_ERROR_ACTIVE; |
| 803 | 883 | ||
| @@ -810,7 +890,9 @@ static int flexcan_chip_start(struct net_device *dev) | |||
| 810 | 890 | ||
| 811 | return 0; | 891 | return 0; |
| 812 | 892 | ||
| 813 | out: | 893 | out_transceiver_disable: |
| 894 | flexcan_transceiver_disable(priv); | ||
| 895 | out_chip_disable: | ||
| 814 | flexcan_chip_disable(priv); | 896 | flexcan_chip_disable(priv); |
| 815 | return err; | 897 | return err; |
| 816 | } | 898 | } |
| @@ -825,18 +907,17 @@ static void flexcan_chip_stop(struct net_device *dev) | |||
| 825 | { | 907 | { |
| 826 | struct flexcan_priv *priv = netdev_priv(dev); | 908 | struct flexcan_priv *priv = netdev_priv(dev); |
| 827 | struct flexcan_regs __iomem *regs = priv->base; | 909 | struct flexcan_regs __iomem *regs = priv->base; |
| 828 | u32 reg; | 910 | |
| 911 | /* freeze + disable module */ | ||
| 912 | flexcan_chip_freeze(priv); | ||
| 913 | flexcan_chip_disable(priv); | ||
| 829 | 914 | ||
| 830 | /* Disable all interrupts */ | 915 | /* Disable all interrupts */ |
| 831 | flexcan_write(0, ®s->imask1); | 916 | flexcan_write(0, ®s->imask1); |
| 917 | flexcan_write(priv->reg_ctrl_default & ~FLEXCAN_CTRL_ERR_ALL, | ||
| 918 | ®s->ctrl); | ||
| 832 | 919 | ||
| 833 | /* Disable + halt module */ | 920 | flexcan_transceiver_disable(priv); |
| 834 | reg = flexcan_read(®s->mcr); | ||
| 835 | reg |= FLEXCAN_MCR_MDIS | FLEXCAN_MCR_HALT; | ||
| 836 | flexcan_write(reg, ®s->mcr); | ||
| 837 | |||
| 838 | if (priv->reg_xceiver) | ||
| 839 | regulator_disable(priv->reg_xceiver); | ||
| 840 | priv->can.state = CAN_STATE_STOPPED; | 921 | priv->can.state = CAN_STATE_STOPPED; |
| 841 | 922 | ||
| 842 | return; | 923 | return; |
| @@ -866,7 +947,7 @@ static int flexcan_open(struct net_device *dev) | |||
| 866 | /* start chip and queuing */ | 947 | /* start chip and queuing */ |
| 867 | err = flexcan_chip_start(dev); | 948 | err = flexcan_chip_start(dev); |
| 868 | if (err) | 949 | if (err) |
| 869 | goto out_close; | 950 | goto out_free_irq; |
| 870 | 951 | ||
| 871 | can_led_event(dev, CAN_LED_EVENT_OPEN); | 952 | can_led_event(dev, CAN_LED_EVENT_OPEN); |
| 872 | 953 | ||
| @@ -875,6 +956,8 @@ static int flexcan_open(struct net_device *dev) | |||
| 875 | 956 | ||
| 876 | return 0; | 957 | return 0; |
| 877 | 958 | ||
| 959 | out_free_irq: | ||
| 960 | free_irq(dev->irq, dev); | ||
| 878 | out_close: | 961 | out_close: |
| 879 | close_candev(dev); | 962 | close_candev(dev); |
| 880 | out_disable_per: | 963 | out_disable_per: |
| @@ -945,12 +1028,16 @@ static int register_flexcandev(struct net_device *dev) | |||
| 945 | goto out_disable_ipg; | 1028 | goto out_disable_ipg; |
| 946 | 1029 | ||
| 947 | /* select "bus clock", chip must be disabled */ | 1030 | /* select "bus clock", chip must be disabled */ |
| 948 | flexcan_chip_disable(priv); | 1031 | err = flexcan_chip_disable(priv); |
| 1032 | if (err) | ||
| 1033 | goto out_disable_per; | ||
| 949 | reg = flexcan_read(®s->ctrl); | 1034 | reg = flexcan_read(®s->ctrl); |
| 950 | reg |= FLEXCAN_CTRL_CLK_SRC; | 1035 | reg |= FLEXCAN_CTRL_CLK_SRC; |
| 951 | flexcan_write(reg, ®s->ctrl); | 1036 | flexcan_write(reg, ®s->ctrl); |
| 952 | 1037 | ||
| 953 | flexcan_chip_enable(priv); | 1038 | err = flexcan_chip_enable(priv); |
| 1039 | if (err) | ||
| 1040 | goto out_chip_disable; | ||
| 954 | 1041 | ||
| 955 | /* set freeze, halt and activate FIFO, restrict register access */ | 1042 | /* set freeze, halt and activate FIFO, restrict register access */ |
| 956 | reg = flexcan_read(®s->mcr); | 1043 | reg = flexcan_read(®s->mcr); |
| @@ -967,14 +1054,15 @@ static int register_flexcandev(struct net_device *dev) | |||
| 967 | if (!(reg & FLEXCAN_MCR_FEN)) { | 1054 | if (!(reg & FLEXCAN_MCR_FEN)) { |
| 968 | netdev_err(dev, "Could not enable RX FIFO, unsupported core\n"); | 1055 | netdev_err(dev, "Could not enable RX FIFO, unsupported core\n"); |
| 969 | err = -ENODEV; | 1056 | err = -ENODEV; |
| 970 | goto out_disable_per; | 1057 | goto out_chip_disable; |
| 971 | } | 1058 | } |
| 972 | 1059 | ||
| 973 | err = register_candev(dev); | 1060 | err = register_candev(dev); |
| 974 | 1061 | ||
| 975 | out_disable_per: | ||
| 976 | /* disable core and turn off clocks */ | 1062 | /* disable core and turn off clocks */ |
| 1063 | out_chip_disable: | ||
| 977 | flexcan_chip_disable(priv); | 1064 | flexcan_chip_disable(priv); |
| 1065 | out_disable_per: | ||
| 978 | clk_disable_unprepare(priv->clk_per); | 1066 | clk_disable_unprepare(priv->clk_per); |
| 979 | out_disable_ipg: | 1067 | out_disable_ipg: |
| 980 | clk_disable_unprepare(priv->clk_ipg); | 1068 | clk_disable_unprepare(priv->clk_ipg); |
| @@ -1104,9 +1192,10 @@ static int flexcan_probe(struct platform_device *pdev) | |||
| 1104 | static int flexcan_remove(struct platform_device *pdev) | 1192 | static int flexcan_remove(struct platform_device *pdev) |
| 1105 | { | 1193 | { |
| 1106 | struct net_device *dev = platform_get_drvdata(pdev); | 1194 | struct net_device *dev = platform_get_drvdata(pdev); |
| 1195 | struct flexcan_priv *priv = netdev_priv(dev); | ||
| 1107 | 1196 | ||
| 1108 | unregister_flexcandev(dev); | 1197 | unregister_flexcandev(dev); |
| 1109 | 1198 | netif_napi_del(&priv->napi); | |
| 1110 | free_candev(dev); | 1199 | free_candev(dev); |
| 1111 | 1200 | ||
| 1112 | return 0; | 1201 | return 0; |
| @@ -1117,8 +1206,11 @@ static int flexcan_suspend(struct device *device) | |||
| 1117 | { | 1206 | { |
| 1118 | struct net_device *dev = dev_get_drvdata(device); | 1207 | struct net_device *dev = dev_get_drvdata(device); |
| 1119 | struct flexcan_priv *priv = netdev_priv(dev); | 1208 | struct flexcan_priv *priv = netdev_priv(dev); |
| 1209 | int err; | ||
| 1120 | 1210 | ||
| 1121 | flexcan_chip_disable(priv); | 1211 | err = flexcan_chip_disable(priv); |
| 1212 | if (err) | ||
| 1213 | return err; | ||
| 1122 | 1214 | ||
| 1123 | if (netif_running(dev)) { | 1215 | if (netif_running(dev)) { |
| 1124 | netif_stop_queue(dev); | 1216 | netif_stop_queue(dev); |
| @@ -1139,9 +1231,7 @@ static int flexcan_resume(struct device *device) | |||
| 1139 | netif_device_attach(dev); | 1231 | netif_device_attach(dev); |
| 1140 | netif_start_queue(dev); | 1232 | netif_start_queue(dev); |
| 1141 | } | 1233 | } |
| 1142 | flexcan_chip_enable(priv); | 1234 | return flexcan_chip_enable(priv); |
| 1143 | |||
| 1144 | return 0; | ||
| 1145 | } | 1235 | } |
| 1146 | #endif /* CONFIG_PM_SLEEP */ | 1236 | #endif /* CONFIG_PM_SLEEP */ |
| 1147 | 1237 | ||
diff --git a/drivers/net/ethernet/broadcom/b44.c b/drivers/net/ethernet/broadcom/b44.c index 1f7b5aa114fa..8a7bf7dad898 100644 --- a/drivers/net/ethernet/broadcom/b44.c +++ b/drivers/net/ethernet/broadcom/b44.c | |||
| @@ -1484,6 +1484,10 @@ static int b44_open(struct net_device *dev) | |||
| 1484 | add_timer(&bp->timer); | 1484 | add_timer(&bp->timer); |
| 1485 | 1485 | ||
| 1486 | b44_enable_ints(bp); | 1486 | b44_enable_ints(bp); |
| 1487 | |||
| 1488 | if (bp->flags & B44_FLAG_EXTERNAL_PHY) | ||
| 1489 | phy_start(bp->phydev); | ||
| 1490 | |||
| 1487 | netif_start_queue(dev); | 1491 | netif_start_queue(dev); |
| 1488 | out: | 1492 | out: |
| 1489 | return err; | 1493 | return err; |
| @@ -1646,6 +1650,9 @@ static int b44_close(struct net_device *dev) | |||
| 1646 | 1650 | ||
| 1647 | netif_stop_queue(dev); | 1651 | netif_stop_queue(dev); |
| 1648 | 1652 | ||
| 1653 | if (bp->flags & B44_FLAG_EXTERNAL_PHY) | ||
| 1654 | phy_stop(bp->phydev); | ||
| 1655 | |||
| 1649 | napi_disable(&bp->napi); | 1656 | napi_disable(&bp->napi); |
| 1650 | 1657 | ||
| 1651 | del_timer_sync(&bp->timer); | 1658 | del_timer_sync(&bp->timer); |
| @@ -2222,7 +2229,12 @@ static void b44_adjust_link(struct net_device *dev) | |||
| 2222 | } | 2229 | } |
| 2223 | 2230 | ||
| 2224 | if (status_changed) { | 2231 | if (status_changed) { |
| 2225 | b44_check_phy(bp); | 2232 | u32 val = br32(bp, B44_TX_CTRL); |
| 2233 | if (bp->flags & B44_FLAG_FULL_DUPLEX) | ||
| 2234 | val |= TX_CTRL_DUPLEX; | ||
| 2235 | else | ||
| 2236 | val &= ~TX_CTRL_DUPLEX; | ||
| 2237 | bw32(bp, B44_TX_CTRL, val); | ||
| 2226 | phy_print_status(phydev); | 2238 | phy_print_status(phydev); |
| 2227 | } | 2239 | } |
| 2228 | } | 2240 | } |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c index 66c0df78c3ff..dbcff509dc3f 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | |||
| @@ -3875,7 +3875,9 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 3875 | xmit_type); | 3875 | xmit_type); |
| 3876 | } | 3876 | } |
| 3877 | 3877 | ||
| 3878 | /* Add the macs to the parsing BD this is a vf */ | 3878 | /* Add the macs to the parsing BD if this is a vf or if |
| 3879 | * Tx Switching is enabled. | ||
| 3880 | */ | ||
| 3879 | if (IS_VF(bp)) { | 3881 | if (IS_VF(bp)) { |
| 3880 | /* override GRE parameters in BD */ | 3882 | /* override GRE parameters in BD */ |
| 3881 | bnx2x_set_fw_mac_addr(&pbd_e2->data.mac_addr.src_hi, | 3883 | bnx2x_set_fw_mac_addr(&pbd_e2->data.mac_addr.src_hi, |
| @@ -3887,6 +3889,11 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 3887 | &pbd_e2->data.mac_addr.dst_mid, | 3889 | &pbd_e2->data.mac_addr.dst_mid, |
| 3888 | &pbd_e2->data.mac_addr.dst_lo, | 3890 | &pbd_e2->data.mac_addr.dst_lo, |
| 3889 | eth->h_dest); | 3891 | eth->h_dest); |
| 3892 | } else if (bp->flags & TX_SWITCHING) { | ||
| 3893 | bnx2x_set_fw_mac_addr(&pbd_e2->data.mac_addr.dst_hi, | ||
| 3894 | &pbd_e2->data.mac_addr.dst_mid, | ||
| 3895 | &pbd_e2->data.mac_addr.dst_lo, | ||
| 3896 | eth->h_dest); | ||
| 3890 | } | 3897 | } |
| 3891 | 3898 | ||
| 3892 | SET_FLAG(pbd_e2_parsing_data, | 3899 | SET_FLAG(pbd_e2_parsing_data, |
diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c index 3167ed6593b0..3b6d0ba86c71 100644 --- a/drivers/net/ethernet/broadcom/tg3.c +++ b/drivers/net/ethernet/broadcom/tg3.c | |||
| @@ -6843,8 +6843,7 @@ static int tg3_rx(struct tg3_napi *tnapi, int budget) | |||
| 6843 | 6843 | ||
| 6844 | work_mask |= opaque_key; | 6844 | work_mask |= opaque_key; |
| 6845 | 6845 | ||
| 6846 | if ((desc->err_vlan & RXD_ERR_MASK) != 0 && | 6846 | if (desc->err_vlan & RXD_ERR_MASK) { |
| 6847 | (desc->err_vlan != RXD_ERR_ODD_NIBBLE_RCVD_MII)) { | ||
| 6848 | drop_it: | 6847 | drop_it: |
| 6849 | tg3_recycle_rx(tnapi, tpr, opaque_key, | 6848 | tg3_recycle_rx(tnapi, tpr, opaque_key, |
| 6850 | desc_idx, *post_ptr); | 6849 | desc_idx, *post_ptr); |
diff --git a/drivers/net/ethernet/broadcom/tg3.h b/drivers/net/ethernet/broadcom/tg3.h index ef472385bce4..04321e5a356e 100644 --- a/drivers/net/ethernet/broadcom/tg3.h +++ b/drivers/net/ethernet/broadcom/tg3.h | |||
| @@ -2608,7 +2608,11 @@ struct tg3_rx_buffer_desc { | |||
| 2608 | #define RXD_ERR_TOO_SMALL 0x00400000 | 2608 | #define RXD_ERR_TOO_SMALL 0x00400000 |
| 2609 | #define RXD_ERR_NO_RESOURCES 0x00800000 | 2609 | #define RXD_ERR_NO_RESOURCES 0x00800000 |
| 2610 | #define RXD_ERR_HUGE_FRAME 0x01000000 | 2610 | #define RXD_ERR_HUGE_FRAME 0x01000000 |
| 2611 | #define RXD_ERR_MASK 0xffff0000 | 2611 | |
| 2612 | #define RXD_ERR_MASK (RXD_ERR_BAD_CRC | RXD_ERR_COLLISION | \ | ||
| 2613 | RXD_ERR_LINK_LOST | RXD_ERR_PHY_DECODE | \ | ||
| 2614 | RXD_ERR_MAC_ABRT | RXD_ERR_TOO_SMALL | \ | ||
| 2615 | RXD_ERR_NO_RESOURCES | RXD_ERR_HUGE_FRAME) | ||
| 2612 | 2616 | ||
| 2613 | u32 reserved; | 2617 | u32 reserved; |
| 2614 | u32 opaque; | 2618 | u32 opaque; |
diff --git a/drivers/net/ethernet/brocade/bna/bnad.c b/drivers/net/ethernet/brocade/bna/bnad.c index cf64f3d0b60d..4ad1187e82fb 100644 --- a/drivers/net/ethernet/brocade/bna/bnad.c +++ b/drivers/net/ethernet/brocade/bna/bnad.c | |||
| @@ -707,7 +707,8 @@ bnad_cq_process(struct bnad *bnad, struct bna_ccb *ccb, int budget) | |||
| 707 | else | 707 | else |
| 708 | skb_checksum_none_assert(skb); | 708 | skb_checksum_none_assert(skb); |
| 709 | 709 | ||
| 710 | if (flags & BNA_CQ_EF_VLAN) | 710 | if ((flags & BNA_CQ_EF_VLAN) && |
| 711 | (bnad->netdev->features & NETIF_F_HW_VLAN_CTAG_RX)) | ||
| 711 | __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), ntohs(cmpl->vlan_tag)); | 712 | __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), ntohs(cmpl->vlan_tag)); |
| 712 | 713 | ||
| 713 | if (BNAD_RXBUF_IS_SK_BUFF(unmap_q->type)) | 714 | if (BNAD_RXBUF_IS_SK_BUFF(unmap_q->type)) |
| @@ -2094,7 +2095,9 @@ bnad_init_rx_config(struct bnad *bnad, struct bna_rx_config *rx_config) | |||
| 2094 | rx_config->q1_buf_size = BFI_SMALL_RXBUF_SIZE; | 2095 | rx_config->q1_buf_size = BFI_SMALL_RXBUF_SIZE; |
| 2095 | } | 2096 | } |
| 2096 | 2097 | ||
| 2097 | rx_config->vlan_strip_status = BNA_STATUS_T_ENABLED; | 2098 | rx_config->vlan_strip_status = |
| 2099 | (bnad->netdev->features & NETIF_F_HW_VLAN_CTAG_RX) ? | ||
| 2100 | BNA_STATUS_T_ENABLED : BNA_STATUS_T_DISABLED; | ||
| 2098 | } | 2101 | } |
| 2099 | 2102 | ||
| 2100 | static void | 2103 | static void |
| @@ -3245,11 +3248,6 @@ bnad_set_rx_mode(struct net_device *netdev) | |||
| 3245 | BNA_RXMODE_ALLMULTI; | 3248 | BNA_RXMODE_ALLMULTI; |
| 3246 | bna_rx_mode_set(bnad->rx_info[0].rx, new_mode, mode_mask, NULL); | 3249 | bna_rx_mode_set(bnad->rx_info[0].rx, new_mode, mode_mask, NULL); |
| 3247 | 3250 | ||
| 3248 | if (bnad->cfg_flags & BNAD_CF_PROMISC) | ||
| 3249 | bna_rx_vlan_strip_disable(bnad->rx_info[0].rx); | ||
| 3250 | else | ||
| 3251 | bna_rx_vlan_strip_enable(bnad->rx_info[0].rx); | ||
| 3252 | |||
| 3253 | spin_unlock_irqrestore(&bnad->bna_lock, flags); | 3251 | spin_unlock_irqrestore(&bnad->bna_lock, flags); |
| 3254 | } | 3252 | } |
| 3255 | 3253 | ||
| @@ -3374,6 +3372,27 @@ bnad_vlan_rx_kill_vid(struct net_device *netdev, __be16 proto, u16 vid) | |||
| 3374 | return 0; | 3372 | return 0; |
| 3375 | } | 3373 | } |
| 3376 | 3374 | ||
| 3375 | static int bnad_set_features(struct net_device *dev, netdev_features_t features) | ||
| 3376 | { | ||
| 3377 | struct bnad *bnad = netdev_priv(dev); | ||
| 3378 | netdev_features_t changed = features ^ dev->features; | ||
| 3379 | |||
| 3380 | if ((changed & NETIF_F_HW_VLAN_CTAG_RX) && netif_running(dev)) { | ||
| 3381 | unsigned long flags; | ||
| 3382 | |||
| 3383 | spin_lock_irqsave(&bnad->bna_lock, flags); | ||
| 3384 | |||
| 3385 | if (features & NETIF_F_HW_VLAN_CTAG_RX) | ||
| 3386 | bna_rx_vlan_strip_enable(bnad->rx_info[0].rx); | ||
| 3387 | else | ||
| 3388 | bna_rx_vlan_strip_disable(bnad->rx_info[0].rx); | ||
| 3389 | |||
| 3390 | spin_unlock_irqrestore(&bnad->bna_lock, flags); | ||
| 3391 | } | ||
| 3392 | |||
| 3393 | return 0; | ||
| 3394 | } | ||
| 3395 | |||
| 3377 | #ifdef CONFIG_NET_POLL_CONTROLLER | 3396 | #ifdef CONFIG_NET_POLL_CONTROLLER |
| 3378 | static void | 3397 | static void |
| 3379 | bnad_netpoll(struct net_device *netdev) | 3398 | bnad_netpoll(struct net_device *netdev) |
| @@ -3421,6 +3440,7 @@ static const struct net_device_ops bnad_netdev_ops = { | |||
| 3421 | .ndo_change_mtu = bnad_change_mtu, | 3440 | .ndo_change_mtu = bnad_change_mtu, |
| 3422 | .ndo_vlan_rx_add_vid = bnad_vlan_rx_add_vid, | 3441 | .ndo_vlan_rx_add_vid = bnad_vlan_rx_add_vid, |
| 3423 | .ndo_vlan_rx_kill_vid = bnad_vlan_rx_kill_vid, | 3442 | .ndo_vlan_rx_kill_vid = bnad_vlan_rx_kill_vid, |
| 3443 | .ndo_set_features = bnad_set_features, | ||
| 3424 | #ifdef CONFIG_NET_POLL_CONTROLLER | 3444 | #ifdef CONFIG_NET_POLL_CONTROLLER |
| 3425 | .ndo_poll_controller = bnad_netpoll | 3445 | .ndo_poll_controller = bnad_netpoll |
| 3426 | #endif | 3446 | #endif |
| @@ -3433,14 +3453,14 @@ bnad_netdev_init(struct bnad *bnad, bool using_dac) | |||
| 3433 | 3453 | ||
| 3434 | netdev->hw_features = NETIF_F_SG | NETIF_F_RXCSUM | | 3454 | netdev->hw_features = NETIF_F_SG | NETIF_F_RXCSUM | |
| 3435 | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | | 3455 | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | |
| 3436 | NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_HW_VLAN_CTAG_TX; | 3456 | NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_HW_VLAN_CTAG_TX | |
| 3457 | NETIF_F_HW_VLAN_CTAG_RX; | ||
| 3437 | 3458 | ||
| 3438 | netdev->vlan_features = NETIF_F_SG | NETIF_F_HIGHDMA | | 3459 | netdev->vlan_features = NETIF_F_SG | NETIF_F_HIGHDMA | |
| 3439 | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | | 3460 | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | |
| 3440 | NETIF_F_TSO | NETIF_F_TSO6; | 3461 | NETIF_F_TSO | NETIF_F_TSO6; |
| 3441 | 3462 | ||
| 3442 | netdev->features |= netdev->hw_features | | 3463 | netdev->features |= netdev->hw_features | NETIF_F_HW_VLAN_CTAG_FILTER; |
| 3443 | NETIF_F_HW_VLAN_CTAG_RX | NETIF_F_HW_VLAN_CTAG_FILTER; | ||
| 3444 | 3464 | ||
| 3445 | if (using_dac) | 3465 | if (using_dac) |
| 3446 | netdev->features |= NETIF_F_HIGHDMA; | 3466 | netdev->features |= NETIF_F_HIGHDMA; |
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c index 43ab35fea48d..34e2488767d9 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | |||
| @@ -6179,6 +6179,7 @@ static struct pci_driver cxgb4_driver = { | |||
| 6179 | .id_table = cxgb4_pci_tbl, | 6179 | .id_table = cxgb4_pci_tbl, |
| 6180 | .probe = init_one, | 6180 | .probe = init_one, |
| 6181 | .remove = remove_one, | 6181 | .remove = remove_one, |
| 6182 | .shutdown = remove_one, | ||
| 6182 | .err_handler = &cxgb4_eeh, | 6183 | .err_handler = &cxgb4_eeh, |
| 6183 | }; | 6184 | }; |
| 6184 | 6185 | ||
diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h index 8d09615da585..05529e273050 100644 --- a/drivers/net/ethernet/emulex/benet/be.h +++ b/drivers/net/ethernet/emulex/benet/be.h | |||
| @@ -350,11 +350,13 @@ struct be_drv_stats { | |||
| 350 | u32 roce_drops_crc; | 350 | u32 roce_drops_crc; |
| 351 | }; | 351 | }; |
| 352 | 352 | ||
| 353 | /* A vlan-id of 0xFFFF must be used to clear transparent vlan-tagging */ | ||
| 354 | #define BE_RESET_VLAN_TAG_ID 0xFFFF | ||
| 355 | |||
| 353 | struct be_vf_cfg { | 356 | struct be_vf_cfg { |
| 354 | unsigned char mac_addr[ETH_ALEN]; | 357 | unsigned char mac_addr[ETH_ALEN]; |
| 355 | int if_handle; | 358 | int if_handle; |
| 356 | int pmac_id; | 359 | int pmac_id; |
| 357 | u16 def_vid; | ||
| 358 | u16 vlan_tag; | 360 | u16 vlan_tag; |
| 359 | u32 tx_rate; | 361 | u32 tx_rate; |
| 360 | }; | 362 | }; |
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index 04ac9c6a0d39..36c80612e21a 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c | |||
| @@ -913,24 +913,14 @@ static int be_ipv6_tx_stall_chk(struct be_adapter *adapter, | |||
| 913 | return BE3_chip(adapter) && be_ipv6_exthdr_check(skb); | 913 | return BE3_chip(adapter) && be_ipv6_exthdr_check(skb); |
| 914 | } | 914 | } |
| 915 | 915 | ||
| 916 | static struct sk_buff *be_xmit_workarounds(struct be_adapter *adapter, | 916 | static struct sk_buff *be_lancer_xmit_workarounds(struct be_adapter *adapter, |
| 917 | struct sk_buff *skb, | 917 | struct sk_buff *skb, |
| 918 | bool *skip_hw_vlan) | 918 | bool *skip_hw_vlan) |
| 919 | { | 919 | { |
| 920 | struct vlan_ethhdr *veh = (struct vlan_ethhdr *)skb->data; | 920 | struct vlan_ethhdr *veh = (struct vlan_ethhdr *)skb->data; |
| 921 | unsigned int eth_hdr_len; | 921 | unsigned int eth_hdr_len; |
| 922 | struct iphdr *ip; | 922 | struct iphdr *ip; |
| 923 | 923 | ||
| 924 | /* Lancer, SH-R ASICs have a bug wherein Packets that are 32 bytes or less | ||
| 925 | * may cause a transmit stall on that port. So the work-around is to | ||
| 926 | * pad short packets (<= 32 bytes) to a 36-byte length. | ||
| 927 | */ | ||
| 928 | if (unlikely(!BEx_chip(adapter) && skb->len <= 32)) { | ||
| 929 | if (skb_padto(skb, 36)) | ||
| 930 | goto tx_drop; | ||
| 931 | skb->len = 36; | ||
| 932 | } | ||
| 933 | |||
| 934 | /* For padded packets, BE HW modifies tot_len field in IP header | 924 | /* For padded packets, BE HW modifies tot_len field in IP header |
| 935 | * incorrecly when VLAN tag is inserted by HW. | 925 | * incorrecly when VLAN tag is inserted by HW. |
| 936 | * For padded packets, Lancer computes incorrect checksum. | 926 | * For padded packets, Lancer computes incorrect checksum. |
| @@ -959,7 +949,7 @@ static struct sk_buff *be_xmit_workarounds(struct be_adapter *adapter, | |||
| 959 | vlan_tx_tag_present(skb)) { | 949 | vlan_tx_tag_present(skb)) { |
| 960 | skb = be_insert_vlan_in_pkt(adapter, skb, skip_hw_vlan); | 950 | skb = be_insert_vlan_in_pkt(adapter, skb, skip_hw_vlan); |
| 961 | if (unlikely(!skb)) | 951 | if (unlikely(!skb)) |
| 962 | goto tx_drop; | 952 | goto err; |
| 963 | } | 953 | } |
| 964 | 954 | ||
| 965 | /* HW may lockup when VLAN HW tagging is requested on | 955 | /* HW may lockup when VLAN HW tagging is requested on |
| @@ -981,15 +971,39 @@ static struct sk_buff *be_xmit_workarounds(struct be_adapter *adapter, | |||
| 981 | be_vlan_tag_tx_chk(adapter, skb)) { | 971 | be_vlan_tag_tx_chk(adapter, skb)) { |
| 982 | skb = be_insert_vlan_in_pkt(adapter, skb, skip_hw_vlan); | 972 | skb = be_insert_vlan_in_pkt(adapter, skb, skip_hw_vlan); |
| 983 | if (unlikely(!skb)) | 973 | if (unlikely(!skb)) |
| 984 | goto tx_drop; | 974 | goto err; |
| 985 | } | 975 | } |
| 986 | 976 | ||
| 987 | return skb; | 977 | return skb; |
| 988 | tx_drop: | 978 | tx_drop: |
| 989 | dev_kfree_skb_any(skb); | 979 | dev_kfree_skb_any(skb); |
| 980 | err: | ||
| 990 | return NULL; | 981 | return NULL; |
| 991 | } | 982 | } |
| 992 | 983 | ||
| 984 | static struct sk_buff *be_xmit_workarounds(struct be_adapter *adapter, | ||
| 985 | struct sk_buff *skb, | ||
| 986 | bool *skip_hw_vlan) | ||
| 987 | { | ||
| 988 | /* Lancer, SH-R ASICs have a bug wherein Packets that are 32 bytes or | ||
| 989 | * less may cause a transmit stall on that port. So the work-around is | ||
| 990 | * to pad short packets (<= 32 bytes) to a 36-byte length. | ||
| 991 | */ | ||
| 992 | if (unlikely(!BEx_chip(adapter) && skb->len <= 32)) { | ||
| 993 | if (skb_padto(skb, 36)) | ||
| 994 | return NULL; | ||
| 995 | skb->len = 36; | ||
| 996 | } | ||
| 997 | |||
| 998 | if (BEx_chip(adapter) || lancer_chip(adapter)) { | ||
| 999 | skb = be_lancer_xmit_workarounds(adapter, skb, skip_hw_vlan); | ||
| 1000 | if (!skb) | ||
| 1001 | return NULL; | ||
| 1002 | } | ||
| 1003 | |||
| 1004 | return skb; | ||
| 1005 | } | ||
| 1006 | |||
| 993 | static netdev_tx_t be_xmit(struct sk_buff *skb, struct net_device *netdev) | 1007 | static netdev_tx_t be_xmit(struct sk_buff *skb, struct net_device *netdev) |
| 994 | { | 1008 | { |
| 995 | struct be_adapter *adapter = netdev_priv(netdev); | 1009 | struct be_adapter *adapter = netdev_priv(netdev); |
| @@ -1157,6 +1171,14 @@ ret: | |||
| 1157 | return status; | 1171 | return status; |
| 1158 | } | 1172 | } |
| 1159 | 1173 | ||
| 1174 | static void be_clear_promisc(struct be_adapter *adapter) | ||
| 1175 | { | ||
| 1176 | adapter->promiscuous = false; | ||
| 1177 | adapter->flags &= ~BE_FLAGS_VLAN_PROMISC; | ||
| 1178 | |||
| 1179 | be_cmd_rx_filter(adapter, IFF_PROMISC, OFF); | ||
| 1180 | } | ||
| 1181 | |||
| 1160 | static void be_set_rx_mode(struct net_device *netdev) | 1182 | static void be_set_rx_mode(struct net_device *netdev) |
| 1161 | { | 1183 | { |
| 1162 | struct be_adapter *adapter = netdev_priv(netdev); | 1184 | struct be_adapter *adapter = netdev_priv(netdev); |
| @@ -1170,9 +1192,7 @@ static void be_set_rx_mode(struct net_device *netdev) | |||
| 1170 | 1192 | ||
| 1171 | /* BE was previously in promiscuous mode; disable it */ | 1193 | /* BE was previously in promiscuous mode; disable it */ |
| 1172 | if (adapter->promiscuous) { | 1194 | if (adapter->promiscuous) { |
| 1173 | adapter->promiscuous = false; | 1195 | be_clear_promisc(adapter); |
| 1174 | be_cmd_rx_filter(adapter, IFF_PROMISC, OFF); | ||
| 1175 | |||
| 1176 | if (adapter->vlans_added) | 1196 | if (adapter->vlans_added) |
| 1177 | be_vid_config(adapter); | 1197 | be_vid_config(adapter); |
| 1178 | } | 1198 | } |
| @@ -1287,24 +1307,20 @@ static int be_set_vf_vlan(struct net_device *netdev, | |||
| 1287 | 1307 | ||
| 1288 | if (vlan || qos) { | 1308 | if (vlan || qos) { |
| 1289 | vlan |= qos << VLAN_PRIO_SHIFT; | 1309 | vlan |= qos << VLAN_PRIO_SHIFT; |
| 1290 | if (vf_cfg->vlan_tag != vlan) { | 1310 | if (vf_cfg->vlan_tag != vlan) |
| 1291 | /* If this is new value, program it. Else skip. */ | ||
| 1292 | vf_cfg->vlan_tag = vlan; | ||
| 1293 | status = be_cmd_set_hsw_config(adapter, vlan, vf + 1, | 1311 | status = be_cmd_set_hsw_config(adapter, vlan, vf + 1, |
| 1294 | vf_cfg->if_handle, 0); | 1312 | vf_cfg->if_handle, 0); |
| 1295 | } | ||
| 1296 | } else { | 1313 | } else { |
| 1297 | /* Reset Transparent Vlan Tagging. */ | 1314 | /* Reset Transparent Vlan Tagging. */ |
| 1298 | vf_cfg->vlan_tag = 0; | 1315 | status = be_cmd_set_hsw_config(adapter, BE_RESET_VLAN_TAG_ID, |
| 1299 | vlan = vf_cfg->def_vid; | 1316 | vf + 1, vf_cfg->if_handle, 0); |
| 1300 | status = be_cmd_set_hsw_config(adapter, vlan, vf + 1, | ||
| 1301 | vf_cfg->if_handle, 0); | ||
| 1302 | } | 1317 | } |
| 1303 | 1318 | ||
| 1304 | 1319 | if (!status) | |
| 1305 | if (status) | 1320 | vf_cfg->vlan_tag = vlan; |
| 1321 | else | ||
| 1306 | dev_info(&adapter->pdev->dev, | 1322 | dev_info(&adapter->pdev->dev, |
| 1307 | "VLAN %d config on VF %d failed\n", vlan, vf); | 1323 | "VLAN %d config on VF %d failed\n", vlan, vf); |
| 1308 | return status; | 1324 | return status; |
| 1309 | } | 1325 | } |
| 1310 | 1326 | ||
| @@ -3013,11 +3029,11 @@ static int be_vf_setup_init(struct be_adapter *adapter) | |||
| 3013 | 3029 | ||
| 3014 | static int be_vf_setup(struct be_adapter *adapter) | 3030 | static int be_vf_setup(struct be_adapter *adapter) |
| 3015 | { | 3031 | { |
| 3032 | struct device *dev = &adapter->pdev->dev; | ||
| 3016 | struct be_vf_cfg *vf_cfg; | 3033 | struct be_vf_cfg *vf_cfg; |
| 3017 | u16 def_vlan, lnk_speed; | ||
| 3018 | int status, old_vfs, vf; | 3034 | int status, old_vfs, vf; |
| 3019 | struct device *dev = &adapter->pdev->dev; | ||
| 3020 | u32 privileges; | 3035 | u32 privileges; |
| 3036 | u16 lnk_speed; | ||
| 3021 | 3037 | ||
| 3022 | old_vfs = pci_num_vf(adapter->pdev); | 3038 | old_vfs = pci_num_vf(adapter->pdev); |
| 3023 | if (old_vfs) { | 3039 | if (old_vfs) { |
| @@ -3084,12 +3100,6 @@ static int be_vf_setup(struct be_adapter *adapter) | |||
| 3084 | if (!status) | 3100 | if (!status) |
| 3085 | vf_cfg->tx_rate = lnk_speed; | 3101 | vf_cfg->tx_rate = lnk_speed; |
| 3086 | 3102 | ||
| 3087 | status = be_cmd_get_hsw_config(adapter, &def_vlan, | ||
| 3088 | vf + 1, vf_cfg->if_handle, NULL); | ||
| 3089 | if (status) | ||
| 3090 | goto err; | ||
| 3091 | vf_cfg->def_vid = def_vlan; | ||
| 3092 | |||
| 3093 | if (!old_vfs) | 3103 | if (!old_vfs) |
| 3094 | be_cmd_enable_vf(adapter, vf + 1); | 3104 | be_cmd_enable_vf(adapter, vf + 1); |
| 3095 | } | 3105 | } |
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index 903362a7b584..479a7cba45c0 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c | |||
| @@ -389,12 +389,6 @@ fec_enet_start_xmit(struct sk_buff *skb, struct net_device *ndev) | |||
| 389 | netdev_err(ndev, "Tx DMA memory map failed\n"); | 389 | netdev_err(ndev, "Tx DMA memory map failed\n"); |
| 390 | return NETDEV_TX_OK; | 390 | return NETDEV_TX_OK; |
| 391 | } | 391 | } |
| 392 | /* Send it on its way. Tell FEC it's ready, interrupt when done, | ||
| 393 | * it's the last BD of the frame, and to put the CRC on the end. | ||
| 394 | */ | ||
| 395 | status |= (BD_ENET_TX_READY | BD_ENET_TX_INTR | ||
| 396 | | BD_ENET_TX_LAST | BD_ENET_TX_TC); | ||
| 397 | bdp->cbd_sc = status; | ||
| 398 | 392 | ||
| 399 | if (fep->bufdesc_ex) { | 393 | if (fep->bufdesc_ex) { |
| 400 | 394 | ||
| @@ -416,6 +410,13 @@ fec_enet_start_xmit(struct sk_buff *skb, struct net_device *ndev) | |||
| 416 | } | 410 | } |
| 417 | } | 411 | } |
| 418 | 412 | ||
| 413 | /* Send it on its way. Tell FEC it's ready, interrupt when done, | ||
| 414 | * it's the last BD of the frame, and to put the CRC on the end. | ||
| 415 | */ | ||
| 416 | status |= (BD_ENET_TX_READY | BD_ENET_TX_INTR | ||
| 417 | | BD_ENET_TX_LAST | BD_ENET_TX_TC); | ||
| 418 | bdp->cbd_sc = status; | ||
| 419 | |||
| 419 | bdp_pre = fec_enet_get_prevdesc(bdp, fep); | 420 | bdp_pre = fec_enet_get_prevdesc(bdp, fep); |
| 420 | if ((id_entry->driver_data & FEC_QUIRK_ERR006358) && | 421 | if ((id_entry->driver_data & FEC_QUIRK_ERR006358) && |
| 421 | !(bdp_pre->cbd_sc & BD_ENET_TX_READY)) { | 422 | !(bdp_pre->cbd_sc & BD_ENET_TX_READY)) { |
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4.h b/drivers/net/ethernet/mellanox/mlx4/mlx4.h index 6b65f7795215..7aec6c833973 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mlx4.h +++ b/drivers/net/ethernet/mellanox/mlx4/mlx4.h | |||
| @@ -51,8 +51,8 @@ | |||
| 51 | 51 | ||
| 52 | #define DRV_NAME "mlx4_core" | 52 | #define DRV_NAME "mlx4_core" |
| 53 | #define PFX DRV_NAME ": " | 53 | #define PFX DRV_NAME ": " |
| 54 | #define DRV_VERSION "1.1" | 54 | #define DRV_VERSION "2.2-1" |
| 55 | #define DRV_RELDATE "Dec, 2011" | 55 | #define DRV_RELDATE "Feb, 2014" |
| 56 | 56 | ||
| 57 | #define MLX4_FS_UDP_UC_EN (1 << 1) | 57 | #define MLX4_FS_UDP_UC_EN (1 << 1) |
| 58 | #define MLX4_FS_TCP_UC_EN (1 << 2) | 58 | #define MLX4_FS_TCP_UC_EN (1 << 2) |
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h index 9ca223bc90fc..b57e8c87a34e 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h +++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | |||
| @@ -57,8 +57,8 @@ | |||
| 57 | #include "en_port.h" | 57 | #include "en_port.h" |
| 58 | 58 | ||
| 59 | #define DRV_NAME "mlx4_en" | 59 | #define DRV_NAME "mlx4_en" |
| 60 | #define DRV_VERSION "2.0" | 60 | #define DRV_VERSION "2.2-1" |
| 61 | #define DRV_RELDATE "Dec 2011" | 61 | #define DRV_RELDATE "Feb 2014" |
| 62 | 62 | ||
| 63 | #define MLX4_EN_MSG_LEVEL (NETIF_MSG_LINK | NETIF_MSG_IFDOWN) | 63 | #define MLX4_EN_MSG_LEVEL (NETIF_MSG_LINK | NETIF_MSG_IFDOWN) |
| 64 | 64 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c index a064f06e0cb8..23b7e2d35a93 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c | |||
| @@ -46,8 +46,8 @@ | |||
| 46 | #include "mlx5_core.h" | 46 | #include "mlx5_core.h" |
| 47 | 47 | ||
| 48 | #define DRIVER_NAME "mlx5_core" | 48 | #define DRIVER_NAME "mlx5_core" |
| 49 | #define DRIVER_VERSION "1.0" | 49 | #define DRIVER_VERSION "2.2-1" |
| 50 | #define DRIVER_RELDATE "June 2013" | 50 | #define DRIVER_RELDATE "Feb 2014" |
| 51 | 51 | ||
| 52 | MODULE_AUTHOR("Eli Cohen <eli@mellanox.com>"); | 52 | MODULE_AUTHOR("Eli Cohen <eli@mellanox.com>"); |
| 53 | MODULE_DESCRIPTION("Mellanox ConnectX-IB HCA core library"); | 53 | MODULE_DESCRIPTION("Mellanox ConnectX-IB HCA core library"); |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c index 4146664d4d6a..27c4f131863b 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c | |||
| @@ -340,6 +340,7 @@ int qlcnic_83xx_setup_intr(struct qlcnic_adapter *adapter) | |||
| 340 | if (qlcnic_sriov_vf_check(adapter)) | 340 | if (qlcnic_sriov_vf_check(adapter)) |
| 341 | return -EINVAL; | 341 | return -EINVAL; |
| 342 | num_msix = 1; | 342 | num_msix = 1; |
| 343 | adapter->drv_sds_rings = QLCNIC_SINGLE_RING; | ||
| 343 | adapter->drv_tx_rings = QLCNIC_SINGLE_RING; | 344 | adapter->drv_tx_rings = QLCNIC_SINGLE_RING; |
| 344 | } | 345 | } |
| 345 | } | 346 | } |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.c index 77f1bce432d2..7d4f54912bad 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.c | |||
| @@ -807,7 +807,7 @@ qlcnic_dcb_get_pg_tc_cfg_tx(struct net_device *netdev, int tc, u8 *prio, | |||
| 807 | !type->tc_param_valid) | 807 | !type->tc_param_valid) |
| 808 | return; | 808 | return; |
| 809 | 809 | ||
| 810 | if (tc < 0 || (tc > QLC_DCB_MAX_TC)) | 810 | if (tc < 0 || (tc >= QLC_DCB_MAX_TC)) |
| 811 | return; | 811 | return; |
| 812 | 812 | ||
| 813 | tc_cfg = &type->tc_cfg[tc]; | 813 | tc_cfg = &type->tc_cfg[tc]; |
| @@ -843,7 +843,7 @@ static void qlcnic_dcb_get_pg_bwg_cfg_tx(struct net_device *netdev, int pgid, | |||
| 843 | !type->tc_param_valid) | 843 | !type->tc_param_valid) |
| 844 | return; | 844 | return; |
| 845 | 845 | ||
| 846 | if (pgid < 0 || pgid > QLC_DCB_MAX_PG) | 846 | if (pgid < 0 || pgid >= QLC_DCB_MAX_PG) |
| 847 | return; | 847 | return; |
| 848 | 848 | ||
| 849 | pgcfg = &type->pg_cfg[pgid]; | 849 | pgcfg = &type->pg_cfg[pgid]; |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c index ba78c7481fa3..1222865cfb73 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | |||
| @@ -816,9 +816,10 @@ static int qlcnic_82xx_setup_intr(struct qlcnic_adapter *adapter) | |||
| 816 | 816 | ||
| 817 | if (!(adapter->flags & QLCNIC_MSIX_ENABLED)) { | 817 | if (!(adapter->flags & QLCNIC_MSIX_ENABLED)) { |
| 818 | qlcnic_disable_multi_tx(adapter); | 818 | qlcnic_disable_multi_tx(adapter); |
| 819 | adapter->drv_sds_rings = QLCNIC_SINGLE_RING; | ||
| 819 | 820 | ||
| 820 | err = qlcnic_enable_msi_legacy(adapter); | 821 | err = qlcnic_enable_msi_legacy(adapter); |
| 821 | if (!err) | 822 | if (err) |
| 822 | return err; | 823 | return err; |
| 823 | } | 824 | } |
| 824 | } | 825 | } |
| @@ -3863,7 +3864,7 @@ int qlcnic_validate_rings(struct qlcnic_adapter *adapter, __u32 ring_cnt, | |||
| 3863 | strcpy(buf, "Tx"); | 3864 | strcpy(buf, "Tx"); |
| 3864 | } | 3865 | } |
| 3865 | 3866 | ||
| 3866 | if (!qlcnic_use_msi_x && !qlcnic_use_msi) { | 3867 | if (!QLCNIC_IS_MSI_FAMILY(adapter)) { |
| 3867 | netdev_err(netdev, "No RSS/TSS support in INT-x mode\n"); | 3868 | netdev_err(netdev, "No RSS/TSS support in INT-x mode\n"); |
| 3868 | return -EINVAL; | 3869 | return -EINVAL; |
| 3869 | } | 3870 | } |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c index 09acf15c3a56..e5277a632671 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c | |||
| @@ -13,8 +13,6 @@ | |||
| 13 | #define QLC_VF_MIN_TX_RATE 100 | 13 | #define QLC_VF_MIN_TX_RATE 100 |
| 14 | #define QLC_VF_MAX_TX_RATE 9999 | 14 | #define QLC_VF_MAX_TX_RATE 9999 |
| 15 | #define QLC_MAC_OPCODE_MASK 0x7 | 15 | #define QLC_MAC_OPCODE_MASK 0x7 |
| 16 | #define QLC_MAC_STAR_ADD 6 | ||
| 17 | #define QLC_MAC_STAR_DEL 7 | ||
| 18 | #define QLC_VF_FLOOD_BIT BIT_16 | 16 | #define QLC_VF_FLOOD_BIT BIT_16 |
| 19 | #define QLC_FLOOD_MODE 0x5 | 17 | #define QLC_FLOOD_MODE 0x5 |
| 20 | 18 | ||
| @@ -1206,13 +1204,6 @@ static int qlcnic_sriov_validate_cfg_macvlan(struct qlcnic_adapter *adapter, | |||
| 1206 | struct qlcnic_vport *vp = vf->vp; | 1204 | struct qlcnic_vport *vp = vf->vp; |
| 1207 | u8 op, new_op; | 1205 | u8 op, new_op; |
| 1208 | 1206 | ||
| 1209 | if (((cmd->req.arg[1] & QLC_MAC_OPCODE_MASK) == QLC_MAC_STAR_ADD) || | ||
| 1210 | ((cmd->req.arg[1] & QLC_MAC_OPCODE_MASK) == QLC_MAC_STAR_DEL)) { | ||
| 1211 | netdev_err(adapter->netdev, "MAC + any VLAN filter not allowed from VF %d\n", | ||
| 1212 | vf->pci_func); | ||
| 1213 | return -EINVAL; | ||
| 1214 | } | ||
| 1215 | |||
| 1216 | if (!(cmd->req.arg[1] & BIT_8)) | 1207 | if (!(cmd->req.arg[1] & BIT_8)) |
| 1217 | return -EINVAL; | 1208 | return -EINVAL; |
| 1218 | 1209 | ||
diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c index 91a67ae8f17b..e9779653cd4c 100644 --- a/drivers/net/ethernet/realtek/r8169.c +++ b/drivers/net/ethernet/realtek/r8169.c | |||
| @@ -7118,6 +7118,8 @@ rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 7118 | } | 7118 | } |
| 7119 | 7119 | ||
| 7120 | mutex_init(&tp->wk.mutex); | 7120 | mutex_init(&tp->wk.mutex); |
| 7121 | u64_stats_init(&tp->rx_stats.syncp); | ||
| 7122 | u64_stats_init(&tp->tx_stats.syncp); | ||
| 7121 | 7123 | ||
| 7122 | /* Get MAC address */ | 7124 | /* Get MAC address */ |
| 7123 | for (i = 0; i < ETH_ALEN; i++) | 7125 | for (i = 0; i < ETH_ALEN; i++) |
diff --git a/drivers/net/ethernet/sfc/ptp.c b/drivers/net/ethernet/sfc/ptp.c index eb75fbd11a01..d7a36829649a 100644 --- a/drivers/net/ethernet/sfc/ptp.c +++ b/drivers/net/ethernet/sfc/ptp.c | |||
| @@ -1668,6 +1668,13 @@ void efx_ptp_event(struct efx_nic *efx, efx_qword_t *ev) | |||
| 1668 | struct efx_ptp_data *ptp = efx->ptp_data; | 1668 | struct efx_ptp_data *ptp = efx->ptp_data; |
| 1669 | int code = EFX_QWORD_FIELD(*ev, MCDI_EVENT_CODE); | 1669 | int code = EFX_QWORD_FIELD(*ev, MCDI_EVENT_CODE); |
| 1670 | 1670 | ||
| 1671 | if (!ptp) { | ||
| 1672 | if (net_ratelimit()) | ||
| 1673 | netif_warn(efx, drv, efx->net_dev, | ||
| 1674 | "Received PTP event but PTP not set up\n"); | ||
| 1675 | return; | ||
| 1676 | } | ||
| 1677 | |||
| 1671 | if (!ptp->enabled) | 1678 | if (!ptp->enabled) |
| 1672 | return; | 1679 | return; |
| 1673 | 1680 | ||
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index a2e7d2c96e36..078ad0ec8593 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | |||
| @@ -1705,7 +1705,7 @@ static int stmmac_open(struct net_device *dev) | |||
| 1705 | priv->dma_rx_size = STMMAC_ALIGN(dma_rxsize); | 1705 | priv->dma_rx_size = STMMAC_ALIGN(dma_rxsize); |
| 1706 | priv->dma_buf_sz = STMMAC_ALIGN(buf_sz); | 1706 | priv->dma_buf_sz = STMMAC_ALIGN(buf_sz); |
| 1707 | 1707 | ||
| 1708 | alloc_dma_desc_resources(priv); | 1708 | ret = alloc_dma_desc_resources(priv); |
| 1709 | if (ret < 0) { | 1709 | if (ret < 0) { |
| 1710 | pr_err("%s: DMA descriptors allocation failed\n", __func__); | 1710 | pr_err("%s: DMA descriptors allocation failed\n", __func__); |
| 1711 | goto dma_desc_error; | 1711 | goto dma_desc_error; |
diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c index 651087b5c8da..ffd4d12acf6d 100644 --- a/drivers/net/ethernet/ti/cpsw.c +++ b/drivers/net/ethernet/ti/cpsw.c | |||
| @@ -1164,11 +1164,17 @@ static void cpsw_init_host_port(struct cpsw_priv *priv) | |||
| 1164 | 1164 | ||
| 1165 | static void cpsw_slave_stop(struct cpsw_slave *slave, struct cpsw_priv *priv) | 1165 | static void cpsw_slave_stop(struct cpsw_slave *slave, struct cpsw_priv *priv) |
| 1166 | { | 1166 | { |
| 1167 | u32 slave_port; | ||
| 1168 | |||
| 1169 | slave_port = cpsw_get_slave_port(priv, slave->slave_num); | ||
| 1170 | |||
| 1167 | if (!slave->phy) | 1171 | if (!slave->phy) |
| 1168 | return; | 1172 | return; |
| 1169 | phy_stop(slave->phy); | 1173 | phy_stop(slave->phy); |
| 1170 | phy_disconnect(slave->phy); | 1174 | phy_disconnect(slave->phy); |
| 1171 | slave->phy = NULL; | 1175 | slave->phy = NULL; |
| 1176 | cpsw_ale_control_set(priv->ale, slave_port, | ||
| 1177 | ALE_PORT_STATE, ALE_PORT_STATE_DISABLE); | ||
| 1172 | } | 1178 | } |
| 1173 | 1179 | ||
| 1174 | static int cpsw_ndo_open(struct net_device *ndev) | 1180 | static int cpsw_ndo_open(struct net_device *ndev) |
diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c index a5d21893670d..1831fb7cd017 100644 --- a/drivers/net/macvlan.c +++ b/drivers/net/macvlan.c | |||
| @@ -506,6 +506,9 @@ static int macvlan_change_mtu(struct net_device *dev, int new_mtu) | |||
| 506 | static struct lock_class_key macvlan_netdev_xmit_lock_key; | 506 | static struct lock_class_key macvlan_netdev_xmit_lock_key; |
| 507 | static struct lock_class_key macvlan_netdev_addr_lock_key; | 507 | static struct lock_class_key macvlan_netdev_addr_lock_key; |
| 508 | 508 | ||
| 509 | #define ALWAYS_ON_FEATURES \ | ||
| 510 | (NETIF_F_SG | NETIF_F_GEN_CSUM | NETIF_F_GSO_SOFTWARE | NETIF_F_LLTX) | ||
| 511 | |||
| 509 | #define MACVLAN_FEATURES \ | 512 | #define MACVLAN_FEATURES \ |
| 510 | (NETIF_F_SG | NETIF_F_ALL_CSUM | NETIF_F_HIGHDMA | NETIF_F_FRAGLIST | \ | 513 | (NETIF_F_SG | NETIF_F_ALL_CSUM | NETIF_F_HIGHDMA | NETIF_F_FRAGLIST | \ |
| 511 | NETIF_F_GSO | NETIF_F_TSO | NETIF_F_UFO | NETIF_F_GSO_ROBUST | \ | 514 | NETIF_F_GSO | NETIF_F_TSO | NETIF_F_UFO | NETIF_F_GSO_ROBUST | \ |
| @@ -539,7 +542,7 @@ static int macvlan_init(struct net_device *dev) | |||
| 539 | dev->state = (dev->state & ~MACVLAN_STATE_MASK) | | 542 | dev->state = (dev->state & ~MACVLAN_STATE_MASK) | |
| 540 | (lowerdev->state & MACVLAN_STATE_MASK); | 543 | (lowerdev->state & MACVLAN_STATE_MASK); |
| 541 | dev->features = lowerdev->features & MACVLAN_FEATURES; | 544 | dev->features = lowerdev->features & MACVLAN_FEATURES; |
| 542 | dev->features |= NETIF_F_LLTX; | 545 | dev->features |= ALWAYS_ON_FEATURES; |
| 543 | dev->gso_max_size = lowerdev->gso_max_size; | 546 | dev->gso_max_size = lowerdev->gso_max_size; |
| 544 | dev->iflink = lowerdev->ifindex; | 547 | dev->iflink = lowerdev->ifindex; |
| 545 | dev->hard_header_len = lowerdev->hard_header_len; | 548 | dev->hard_header_len = lowerdev->hard_header_len; |
| @@ -699,7 +702,7 @@ static netdev_features_t macvlan_fix_features(struct net_device *dev, | |||
| 699 | features = netdev_increment_features(vlan->lowerdev->features, | 702 | features = netdev_increment_features(vlan->lowerdev->features, |
| 700 | features, | 703 | features, |
| 701 | mask); | 704 | mask); |
| 702 | features |= NETIF_F_LLTX; | 705 | features |= ALWAYS_ON_FEATURES; |
| 703 | 706 | ||
| 704 | return features; | 707 | return features; |
| 705 | } | 708 | } |
diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c index 82514e72b3d8..4b970f7624c0 100644 --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c | |||
| @@ -916,6 +916,8 @@ int genphy_read_status(struct phy_device *phydev) | |||
| 916 | int err; | 916 | int err; |
| 917 | int lpa; | 917 | int lpa; |
| 918 | int lpagb = 0; | 918 | int lpagb = 0; |
| 919 | int common_adv; | ||
| 920 | int common_adv_gb = 0; | ||
| 919 | 921 | ||
| 920 | /* Update the link, but return if there was an error */ | 922 | /* Update the link, but return if there was an error */ |
| 921 | err = genphy_update_link(phydev); | 923 | err = genphy_update_link(phydev); |
| @@ -937,7 +939,7 @@ int genphy_read_status(struct phy_device *phydev) | |||
| 937 | 939 | ||
| 938 | phydev->lp_advertising = | 940 | phydev->lp_advertising = |
| 939 | mii_stat1000_to_ethtool_lpa_t(lpagb); | 941 | mii_stat1000_to_ethtool_lpa_t(lpagb); |
| 940 | lpagb &= adv << 2; | 942 | common_adv_gb = lpagb & adv << 2; |
| 941 | } | 943 | } |
| 942 | 944 | ||
| 943 | lpa = phy_read(phydev, MII_LPA); | 945 | lpa = phy_read(phydev, MII_LPA); |
| @@ -950,25 +952,25 @@ int genphy_read_status(struct phy_device *phydev) | |||
| 950 | if (adv < 0) | 952 | if (adv < 0) |
| 951 | return adv; | 953 | return adv; |
| 952 | 954 | ||
| 953 | lpa &= adv; | 955 | common_adv = lpa & adv; |
| 954 | 956 | ||
| 955 | phydev->speed = SPEED_10; | 957 | phydev->speed = SPEED_10; |
| 956 | phydev->duplex = DUPLEX_HALF; | 958 | phydev->duplex = DUPLEX_HALF; |
| 957 | phydev->pause = 0; | 959 | phydev->pause = 0; |
| 958 | phydev->asym_pause = 0; | 960 | phydev->asym_pause = 0; |
| 959 | 961 | ||
| 960 | if (lpagb & (LPA_1000FULL | LPA_1000HALF)) { | 962 | if (common_adv_gb & (LPA_1000FULL | LPA_1000HALF)) { |
| 961 | phydev->speed = SPEED_1000; | 963 | phydev->speed = SPEED_1000; |
| 962 | 964 | ||
| 963 | if (lpagb & LPA_1000FULL) | 965 | if (common_adv_gb & LPA_1000FULL) |
| 964 | phydev->duplex = DUPLEX_FULL; | 966 | phydev->duplex = DUPLEX_FULL; |
| 965 | } else if (lpa & (LPA_100FULL | LPA_100HALF)) { | 967 | } else if (common_adv & (LPA_100FULL | LPA_100HALF)) { |
| 966 | phydev->speed = SPEED_100; | 968 | phydev->speed = SPEED_100; |
| 967 | 969 | ||
| 968 | if (lpa & LPA_100FULL) | 970 | if (common_adv & LPA_100FULL) |
| 969 | phydev->duplex = DUPLEX_FULL; | 971 | phydev->duplex = DUPLEX_FULL; |
| 970 | } else | 972 | } else |
| 971 | if (lpa & LPA_10FULL) | 973 | if (common_adv & LPA_10FULL) |
| 972 | phydev->duplex = DUPLEX_FULL; | 974 | phydev->duplex = DUPLEX_FULL; |
| 973 | 975 | ||
| 974 | if (phydev->duplex == DUPLEX_FULL) { | 976 | if (phydev->duplex == DUPLEX_FULL) { |
diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 8fe9cb7d0f72..26f8635b027d 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c | |||
| @@ -1686,7 +1686,9 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr) | |||
| 1686 | TUN_USER_FEATURES | NETIF_F_HW_VLAN_CTAG_TX | | 1686 | TUN_USER_FEATURES | NETIF_F_HW_VLAN_CTAG_TX | |
| 1687 | NETIF_F_HW_VLAN_STAG_TX; | 1687 | NETIF_F_HW_VLAN_STAG_TX; |
| 1688 | dev->features = dev->hw_features; | 1688 | dev->features = dev->hw_features; |
| 1689 | dev->vlan_features = dev->features; | 1689 | dev->vlan_features = dev->features & |
| 1690 | ~(NETIF_F_HW_VLAN_CTAG_TX | | ||
| 1691 | NETIF_F_HW_VLAN_STAG_TX); | ||
| 1690 | 1692 | ||
| 1691 | INIT_LIST_HEAD(&tun->disabled); | 1693 | INIT_LIST_HEAD(&tun->disabled); |
| 1692 | err = tun_attach(tun, file, false); | 1694 | err = tun_attach(tun, file, false); |
diff --git a/drivers/net/usb/ax88179_178a.c b/drivers/net/usb/ax88179_178a.c index 955df81a4358..d2e6fdb25e28 100644 --- a/drivers/net/usb/ax88179_178a.c +++ b/drivers/net/usb/ax88179_178a.c | |||
| @@ -1395,6 +1395,19 @@ static const struct driver_info ax88178a_info = { | |||
| 1395 | .tx_fixup = ax88179_tx_fixup, | 1395 | .tx_fixup = ax88179_tx_fixup, |
| 1396 | }; | 1396 | }; |
| 1397 | 1397 | ||
| 1398 | static const struct driver_info dlink_dub1312_info = { | ||
| 1399 | .description = "D-Link DUB-1312 USB 3.0 to Gigabit Ethernet Adapter", | ||
| 1400 | .bind = ax88179_bind, | ||
| 1401 | .unbind = ax88179_unbind, | ||
| 1402 | .status = ax88179_status, | ||
| 1403 | .link_reset = ax88179_link_reset, | ||
| 1404 | .reset = ax88179_reset, | ||
| 1405 | .stop = ax88179_stop, | ||
| 1406 | .flags = FLAG_ETHER | FLAG_FRAMING_AX, | ||
| 1407 | .rx_fixup = ax88179_rx_fixup, | ||
| 1408 | .tx_fixup = ax88179_tx_fixup, | ||
| 1409 | }; | ||
| 1410 | |||
| 1398 | static const struct driver_info sitecom_info = { | 1411 | static const struct driver_info sitecom_info = { |
| 1399 | .description = "Sitecom USB 3.0 to Gigabit Adapter", | 1412 | .description = "Sitecom USB 3.0 to Gigabit Adapter", |
| 1400 | .bind = ax88179_bind, | 1413 | .bind = ax88179_bind, |
| @@ -1421,6 +1434,19 @@ static const struct driver_info samsung_info = { | |||
| 1421 | .tx_fixup = ax88179_tx_fixup, | 1434 | .tx_fixup = ax88179_tx_fixup, |
| 1422 | }; | 1435 | }; |
| 1423 | 1436 | ||
| 1437 | static const struct driver_info lenovo_info = { | ||
| 1438 | .description = "Lenovo OneLinkDock Gigabit LAN", | ||
| 1439 | .bind = ax88179_bind, | ||
| 1440 | .unbind = ax88179_unbind, | ||
| 1441 | .status = ax88179_status, | ||
| 1442 | .link_reset = ax88179_link_reset, | ||
| 1443 | .reset = ax88179_reset, | ||
| 1444 | .stop = ax88179_stop, | ||
| 1445 | .flags = FLAG_ETHER | FLAG_FRAMING_AX, | ||
| 1446 | .rx_fixup = ax88179_rx_fixup, | ||
| 1447 | .tx_fixup = ax88179_tx_fixup, | ||
| 1448 | }; | ||
| 1449 | |||
| 1424 | static const struct usb_device_id products[] = { | 1450 | static const struct usb_device_id products[] = { |
| 1425 | { | 1451 | { |
| 1426 | /* ASIX AX88179 10/100/1000 */ | 1452 | /* ASIX AX88179 10/100/1000 */ |
| @@ -1431,6 +1457,10 @@ static const struct usb_device_id products[] = { | |||
| 1431 | USB_DEVICE(0x0b95, 0x178a), | 1457 | USB_DEVICE(0x0b95, 0x178a), |
| 1432 | .driver_info = (unsigned long)&ax88178a_info, | 1458 | .driver_info = (unsigned long)&ax88178a_info, |
| 1433 | }, { | 1459 | }, { |
| 1460 | /* D-Link DUB-1312 USB 3.0 to Gigabit Ethernet Adapter */ | ||
| 1461 | USB_DEVICE(0x2001, 0x4a00), | ||
| 1462 | .driver_info = (unsigned long)&dlink_dub1312_info, | ||
| 1463 | }, { | ||
| 1434 | /* Sitecom USB 3.0 to Gigabit Adapter */ | 1464 | /* Sitecom USB 3.0 to Gigabit Adapter */ |
| 1435 | USB_DEVICE(0x0df6, 0x0072), | 1465 | USB_DEVICE(0x0df6, 0x0072), |
| 1436 | .driver_info = (unsigned long)&sitecom_info, | 1466 | .driver_info = (unsigned long)&sitecom_info, |
| @@ -1438,6 +1468,10 @@ static const struct usb_device_id products[] = { | |||
| 1438 | /* Samsung USB Ethernet Adapter */ | 1468 | /* Samsung USB Ethernet Adapter */ |
| 1439 | USB_DEVICE(0x04e8, 0xa100), | 1469 | USB_DEVICE(0x04e8, 0xa100), |
| 1440 | .driver_info = (unsigned long)&samsung_info, | 1470 | .driver_info = (unsigned long)&samsung_info, |
| 1471 | }, { | ||
| 1472 | /* Lenovo OneLinkDock Gigabit LAN */ | ||
| 1473 | USB_DEVICE(0x17ef, 0x304b), | ||
| 1474 | .driver_info = (unsigned long)&lenovo_info, | ||
| 1441 | }, | 1475 | }, |
| 1442 | { }, | 1476 | { }, |
| 1443 | }; | 1477 | }; |
diff --git a/drivers/net/veth.c b/drivers/net/veth.c index 2ec2041b62d4..5b374370f71c 100644 --- a/drivers/net/veth.c +++ b/drivers/net/veth.c | |||
| @@ -285,7 +285,8 @@ static void veth_setup(struct net_device *dev) | |||
| 285 | dev->ethtool_ops = &veth_ethtool_ops; | 285 | dev->ethtool_ops = &veth_ethtool_ops; |
| 286 | dev->features |= NETIF_F_LLTX; | 286 | dev->features |= NETIF_F_LLTX; |
| 287 | dev->features |= VETH_FEATURES; | 287 | dev->features |= VETH_FEATURES; |
| 288 | dev->vlan_features = dev->features; | 288 | dev->vlan_features = dev->features & |
| 289 | ~(NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_STAG_TX); | ||
| 289 | dev->destructor = veth_dev_free; | 290 | dev->destructor = veth_dev_free; |
| 290 | 291 | ||
| 291 | dev->hw_features = VETH_FEATURES; | 292 | dev->hw_features = VETH_FEATURES; |
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index d75f8edf4fb3..5632a99cbbd2 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c | |||
| @@ -1711,7 +1711,8 @@ static int virtnet_probe(struct virtio_device *vdev) | |||
| 1711 | /* If we can receive ANY GSO packets, we must allocate large ones. */ | 1711 | /* If we can receive ANY GSO packets, we must allocate large ones. */ |
| 1712 | if (virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO4) || | 1712 | if (virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO4) || |
| 1713 | virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO6) || | 1713 | virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO6) || |
| 1714 | virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_ECN)) | 1714 | virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_ECN) || |
| 1715 | virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_UFO)) | ||
| 1715 | vi->big_packets = true; | 1716 | vi->big_packets = true; |
| 1716 | 1717 | ||
| 1717 | if (virtio_has_feature(vdev, VIRTIO_NET_F_MRG_RXBUF)) | 1718 | if (virtio_has_feature(vdev, VIRTIO_NET_F_MRG_RXBUF)) |
diff --git a/drivers/net/wireless/ath/ath9k/ar9462_2p0_initvals.h b/drivers/net/wireless/ath/ath9k/ar9462_2p0_initvals.h index 1cc13569b17b..1b6b4d0cfa97 100644 --- a/drivers/net/wireless/ath/ath9k/ar9462_2p0_initvals.h +++ b/drivers/net/wireless/ath/ath9k/ar9462_2p0_initvals.h | |||
| @@ -57,7 +57,7 @@ static const u32 ar9462_2p0_baseband_postamble[][5] = { | |||
| 57 | {0x00009e14, 0x37b95d5e, 0x37b9605e, 0x3236605e, 0x32365a5e}, | 57 | {0x00009e14, 0x37b95d5e, 0x37b9605e, 0x3236605e, 0x32365a5e}, |
| 58 | {0x00009e18, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, | 58 | {0x00009e18, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, |
| 59 | {0x00009e1c, 0x0001cf9c, 0x0001cf9c, 0x00021f9c, 0x00021f9c}, | 59 | {0x00009e1c, 0x0001cf9c, 0x0001cf9c, 0x00021f9c, 0x00021f9c}, |
| 60 | {0x00009e20, 0x000003b5, 0x000003b5, 0x000003ce, 0x000003ce}, | 60 | {0x00009e20, 0x000003a5, 0x000003a5, 0x000003a5, 0x000003a5}, |
| 61 | {0x00009e2c, 0x0000001c, 0x0000001c, 0x00000021, 0x00000021}, | 61 | {0x00009e2c, 0x0000001c, 0x0000001c, 0x00000021, 0x00000021}, |
| 62 | {0x00009e3c, 0xcf946220, 0xcf946220, 0xcfd5c782, 0xcfd5c282}, | 62 | {0x00009e3c, 0xcf946220, 0xcf946220, 0xcfd5c782, 0xcfd5c282}, |
| 63 | {0x00009e44, 0x62321e27, 0x62321e27, 0xfe291e27, 0xfe291e27}, | 63 | {0x00009e44, 0x62321e27, 0x62321e27, 0xfe291e27, 0xfe291e27}, |
| @@ -96,7 +96,7 @@ static const u32 ar9462_2p0_baseband_postamble[][5] = { | |||
| 96 | {0x0000ae04, 0x001c0000, 0x001c0000, 0x001c0000, 0x00100000}, | 96 | {0x0000ae04, 0x001c0000, 0x001c0000, 0x001c0000, 0x00100000}, |
| 97 | {0x0000ae18, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, | 97 | {0x0000ae18, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, |
| 98 | {0x0000ae1c, 0x0000019c, 0x0000019c, 0x0000019c, 0x0000019c}, | 98 | {0x0000ae1c, 0x0000019c, 0x0000019c, 0x0000019c, 0x0000019c}, |
| 99 | {0x0000ae20, 0x000001b5, 0x000001b5, 0x000001ce, 0x000001ce}, | 99 | {0x0000ae20, 0x000001a6, 0x000001a6, 0x000001aa, 0x000001aa}, |
| 100 | {0x0000b284, 0x00000000, 0x00000000, 0x00000550, 0x00000550}, | 100 | {0x0000b284, 0x00000000, 0x00000000, 0x00000550, 0x00000550}, |
| 101 | }; | 101 | }; |
| 102 | 102 | ||
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c index 11eab9f01fd8..303ce27964c1 100644 --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c | |||
| @@ -1534,7 +1534,7 @@ EXPORT_SYMBOL(ath9k_hw_check_nav); | |||
| 1534 | bool ath9k_hw_check_alive(struct ath_hw *ah) | 1534 | bool ath9k_hw_check_alive(struct ath_hw *ah) |
| 1535 | { | 1535 | { |
| 1536 | int count = 50; | 1536 | int count = 50; |
| 1537 | u32 reg; | 1537 | u32 reg, last_val; |
| 1538 | 1538 | ||
| 1539 | if (AR_SREV_9300(ah)) | 1539 | if (AR_SREV_9300(ah)) |
| 1540 | return !ath9k_hw_detect_mac_hang(ah); | 1540 | return !ath9k_hw_detect_mac_hang(ah); |
| @@ -1542,9 +1542,13 @@ bool ath9k_hw_check_alive(struct ath_hw *ah) | |||
| 1542 | if (AR_SREV_9285_12_OR_LATER(ah)) | 1542 | if (AR_SREV_9285_12_OR_LATER(ah)) |
| 1543 | return true; | 1543 | return true; |
| 1544 | 1544 | ||
| 1545 | last_val = REG_READ(ah, AR_OBS_BUS_1); | ||
| 1545 | do { | 1546 | do { |
| 1546 | reg = REG_READ(ah, AR_OBS_BUS_1); | 1547 | reg = REG_READ(ah, AR_OBS_BUS_1); |
| 1548 | if (reg != last_val) | ||
| 1549 | return true; | ||
| 1547 | 1550 | ||
| 1551 | last_val = reg; | ||
| 1548 | if ((reg & 0x7E7FFFEF) == 0x00702400) | 1552 | if ((reg & 0x7E7FFFEF) == 0x00702400) |
| 1549 | continue; | 1553 | continue; |
| 1550 | 1554 | ||
| @@ -1556,6 +1560,8 @@ bool ath9k_hw_check_alive(struct ath_hw *ah) | |||
| 1556 | default: | 1560 | default: |
| 1557 | return true; | 1561 | return true; |
| 1558 | } | 1562 | } |
| 1563 | |||
| 1564 | udelay(1); | ||
| 1559 | } while (count-- > 0); | 1565 | } while (count-- > 0); |
| 1560 | 1566 | ||
| 1561 | return false; | 1567 | return false; |
diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c index a0ebdd000fc2..82e340d3ec60 100644 --- a/drivers/net/wireless/ath/ath9k/recv.c +++ b/drivers/net/wireless/ath/ath9k/recv.c | |||
| @@ -732,11 +732,18 @@ static struct ath_rxbuf *ath_get_next_rx_buf(struct ath_softc *sc, | |||
| 732 | return NULL; | 732 | return NULL; |
| 733 | 733 | ||
| 734 | /* | 734 | /* |
| 735 | * mark descriptor as zero-length and set the 'more' | 735 | * Re-check previous descriptor, in case it has been filled |
| 736 | * flag to ensure that both buffers get discarded | 736 | * in the mean time. |
| 737 | */ | 737 | */ |
| 738 | rs->rs_datalen = 0; | 738 | ret = ath9k_hw_rxprocdesc(ah, ds, rs); |
| 739 | rs->rs_more = true; | 739 | if (ret == -EINPROGRESS) { |
| 740 | /* | ||
| 741 | * mark descriptor as zero-length and set the 'more' | ||
| 742 | * flag to ensure that both buffers get discarded | ||
| 743 | */ | ||
| 744 | rs->rs_datalen = 0; | ||
| 745 | rs->rs_more = true; | ||
| 746 | } | ||
| 740 | } | 747 | } |
| 741 | 748 | ||
| 742 | list_del(&bf->list); | 749 | list_del(&bf->list); |
| @@ -985,32 +992,32 @@ static int ath9k_rx_skb_preprocess(struct ath_softc *sc, | |||
| 985 | struct ath_common *common = ath9k_hw_common(ah); | 992 | struct ath_common *common = ath9k_hw_common(ah); |
| 986 | struct ieee80211_hdr *hdr; | 993 | struct ieee80211_hdr *hdr; |
| 987 | bool discard_current = sc->rx.discard_next; | 994 | bool discard_current = sc->rx.discard_next; |
| 988 | int ret = 0; | ||
| 989 | 995 | ||
| 990 | /* | 996 | /* |
| 991 | * Discard corrupt descriptors which are marked in | 997 | * Discard corrupt descriptors which are marked in |
| 992 | * ath_get_next_rx_buf(). | 998 | * ath_get_next_rx_buf(). |
| 993 | */ | 999 | */ |
| 994 | sc->rx.discard_next = rx_stats->rs_more; | ||
| 995 | if (discard_current) | 1000 | if (discard_current) |
| 996 | return -EINVAL; | 1001 | goto corrupt; |
| 1002 | |||
| 1003 | sc->rx.discard_next = false; | ||
| 997 | 1004 | ||
| 998 | /* | 1005 | /* |
| 999 | * Discard zero-length packets. | 1006 | * Discard zero-length packets. |
| 1000 | */ | 1007 | */ |
| 1001 | if (!rx_stats->rs_datalen) { | 1008 | if (!rx_stats->rs_datalen) { |
| 1002 | RX_STAT_INC(rx_len_err); | 1009 | RX_STAT_INC(rx_len_err); |
| 1003 | return -EINVAL; | 1010 | goto corrupt; |
| 1004 | } | 1011 | } |
| 1005 | 1012 | ||
| 1006 | /* | 1013 | /* |
| 1007 | * rs_status follows rs_datalen so if rs_datalen is too large | 1014 | * rs_status follows rs_datalen so if rs_datalen is too large |
| 1008 | * we can take a hint that hardware corrupted it, so ignore | 1015 | * we can take a hint that hardware corrupted it, so ignore |
| 1009 | * those frames. | 1016 | * those frames. |
| 1010 | */ | 1017 | */ |
| 1011 | if (rx_stats->rs_datalen > (common->rx_bufsize - ah->caps.rx_status_len)) { | 1018 | if (rx_stats->rs_datalen > (common->rx_bufsize - ah->caps.rx_status_len)) { |
| 1012 | RX_STAT_INC(rx_len_err); | 1019 | RX_STAT_INC(rx_len_err); |
| 1013 | return -EINVAL; | 1020 | goto corrupt; |
| 1014 | } | 1021 | } |
| 1015 | 1022 | ||
| 1016 | /* Only use status info from the last fragment */ | 1023 | /* Only use status info from the last fragment */ |
| @@ -1024,10 +1031,8 @@ static int ath9k_rx_skb_preprocess(struct ath_softc *sc, | |||
| 1024 | * This is different from the other corrupt descriptor | 1031 | * This is different from the other corrupt descriptor |
| 1025 | * condition handled above. | 1032 | * condition handled above. |
| 1026 | */ | 1033 | */ |
| 1027 | if (rx_stats->rs_status & ATH9K_RXERR_CORRUPT_DESC) { | 1034 | if (rx_stats->rs_status & ATH9K_RXERR_CORRUPT_DESC) |
| 1028 | ret = -EINVAL; | 1035 | goto corrupt; |
| 1029 | goto exit; | ||
| 1030 | } | ||
| 1031 | 1036 | ||
| 1032 | hdr = (struct ieee80211_hdr *) (skb->data + ah->caps.rx_status_len); | 1037 | hdr = (struct ieee80211_hdr *) (skb->data + ah->caps.rx_status_len); |
| 1033 | 1038 | ||
| @@ -1043,18 +1048,15 @@ static int ath9k_rx_skb_preprocess(struct ath_softc *sc, | |||
| 1043 | if (ath_process_fft(sc, hdr, rx_stats, rx_status->mactime)) | 1048 | if (ath_process_fft(sc, hdr, rx_stats, rx_status->mactime)) |
| 1044 | RX_STAT_INC(rx_spectral); | 1049 | RX_STAT_INC(rx_spectral); |
| 1045 | 1050 | ||
| 1046 | ret = -EINVAL; | 1051 | return -EINVAL; |
| 1047 | goto exit; | ||
| 1048 | } | 1052 | } |
| 1049 | 1053 | ||
| 1050 | /* | 1054 | /* |
| 1051 | * everything but the rate is checked here, the rate check is done | 1055 | * everything but the rate is checked here, the rate check is done |
| 1052 | * separately to avoid doing two lookups for a rate for each frame. | 1056 | * separately to avoid doing two lookups for a rate for each frame. |
| 1053 | */ | 1057 | */ |
| 1054 | if (!ath9k_rx_accept(common, hdr, rx_status, rx_stats, decrypt_error)) { | 1058 | if (!ath9k_rx_accept(common, hdr, rx_status, rx_stats, decrypt_error)) |
| 1055 | ret = -EINVAL; | 1059 | return -EINVAL; |
| 1056 | goto exit; | ||
| 1057 | } | ||
| 1058 | 1060 | ||
| 1059 | if (ath_is_mybeacon(common, hdr)) { | 1061 | if (ath_is_mybeacon(common, hdr)) { |
| 1060 | RX_STAT_INC(rx_beacons); | 1062 | RX_STAT_INC(rx_beacons); |
| @@ -1064,15 +1066,11 @@ static int ath9k_rx_skb_preprocess(struct ath_softc *sc, | |||
| 1064 | /* | 1066 | /* |
| 1065 | * This shouldn't happen, but have a safety check anyway. | 1067 | * This shouldn't happen, but have a safety check anyway. |
| 1066 | */ | 1068 | */ |
| 1067 | if (WARN_ON(!ah->curchan)) { | 1069 | if (WARN_ON(!ah->curchan)) |
| 1068 | ret = -EINVAL; | 1070 | return -EINVAL; |
| 1069 | goto exit; | ||
| 1070 | } | ||
| 1071 | 1071 | ||
| 1072 | if (ath9k_process_rate(common, hw, rx_stats, rx_status)) { | 1072 | if (ath9k_process_rate(common, hw, rx_stats, rx_status)) |
| 1073 | ret =-EINVAL; | 1073 | return -EINVAL; |
| 1074 | goto exit; | ||
| 1075 | } | ||
| 1076 | 1074 | ||
| 1077 | ath9k_process_rssi(common, hw, rx_stats, rx_status); | 1075 | ath9k_process_rssi(common, hw, rx_stats, rx_status); |
| 1078 | 1076 | ||
| @@ -1087,9 +1085,11 @@ static int ath9k_rx_skb_preprocess(struct ath_softc *sc, | |||
| 1087 | sc->rx.num_pkts++; | 1085 | sc->rx.num_pkts++; |
| 1088 | #endif | 1086 | #endif |
| 1089 | 1087 | ||
| 1090 | exit: | 1088 | return 0; |
| 1091 | sc->rx.discard_next = false; | 1089 | |
| 1092 | return ret; | 1090 | corrupt: |
| 1091 | sc->rx.discard_next = rx_stats->rs_more; | ||
| 1092 | return -EINVAL; | ||
| 1093 | } | 1093 | } |
| 1094 | 1094 | ||
| 1095 | static void ath9k_rx_skb_postprocess(struct ath_common *common, | 1095 | static void ath9k_rx_skb_postprocess(struct ath_common *common, |
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c index 0a75e2f68c9d..f042a18c8495 100644 --- a/drivers/net/wireless/ath/ath9k/xmit.c +++ b/drivers/net/wireless/ath/ath9k/xmit.c | |||
| @@ -1444,14 +1444,16 @@ void ath_tx_aggr_sleep(struct ieee80211_sta *sta, struct ath_softc *sc, | |||
| 1444 | for (tidno = 0, tid = &an->tid[tidno]; | 1444 | for (tidno = 0, tid = &an->tid[tidno]; |
| 1445 | tidno < IEEE80211_NUM_TIDS; tidno++, tid++) { | 1445 | tidno < IEEE80211_NUM_TIDS; tidno++, tid++) { |
| 1446 | 1446 | ||
| 1447 | if (!tid->sched) | ||
| 1448 | continue; | ||
| 1449 | |||
| 1450 | ac = tid->ac; | 1447 | ac = tid->ac; |
| 1451 | txq = ac->txq; | 1448 | txq = ac->txq; |
| 1452 | 1449 | ||
| 1453 | ath_txq_lock(sc, txq); | 1450 | ath_txq_lock(sc, txq); |
| 1454 | 1451 | ||
| 1452 | if (!tid->sched) { | ||
| 1453 | ath_txq_unlock(sc, txq); | ||
| 1454 | continue; | ||
| 1455 | } | ||
| 1456 | |||
| 1455 | buffered = ath_tid_has_buffered(tid); | 1457 | buffered = ath_tid_has_buffered(tid); |
| 1456 | 1458 | ||
| 1457 | tid->sched = false; | 1459 | tid->sched = false; |
| @@ -2184,14 +2186,15 @@ int ath_tx_start(struct ieee80211_hw *hw, struct sk_buff *skb, | |||
| 2184 | txq->stopped = true; | 2186 | txq->stopped = true; |
| 2185 | } | 2187 | } |
| 2186 | 2188 | ||
| 2189 | if (txctl->an) | ||
| 2190 | tid = ath_get_skb_tid(sc, txctl->an, skb); | ||
| 2191 | |||
| 2187 | if (info->flags & IEEE80211_TX_CTL_PS_RESPONSE) { | 2192 | if (info->flags & IEEE80211_TX_CTL_PS_RESPONSE) { |
| 2188 | ath_txq_unlock(sc, txq); | 2193 | ath_txq_unlock(sc, txq); |
| 2189 | txq = sc->tx.uapsdq; | 2194 | txq = sc->tx.uapsdq; |
| 2190 | ath_txq_lock(sc, txq); | 2195 | ath_txq_lock(sc, txq); |
| 2191 | } else if (txctl->an && | 2196 | } else if (txctl->an && |
| 2192 | ieee80211_is_data_present(hdr->frame_control)) { | 2197 | ieee80211_is_data_present(hdr->frame_control)) { |
| 2193 | tid = ath_get_skb_tid(sc, txctl->an, skb); | ||
| 2194 | |||
| 2195 | WARN_ON(tid->ac->txq != txctl->txq); | 2198 | WARN_ON(tid->ac->txq != txctl->txq); |
| 2196 | 2199 | ||
| 2197 | if (info->flags & IEEE80211_TX_CTL_CLEAR_PS_FILT) | 2200 | if (info->flags & IEEE80211_TX_CTL_CLEAR_PS_FILT) |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c index 3e991897d7ca..119ee6eaf1c3 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c | |||
| @@ -457,7 +457,6 @@ struct brcmf_sdio { | |||
| 457 | 457 | ||
| 458 | u8 tx_hdrlen; /* sdio bus header length for tx packet */ | 458 | u8 tx_hdrlen; /* sdio bus header length for tx packet */ |
| 459 | bool txglom; /* host tx glomming enable flag */ | 459 | bool txglom; /* host tx glomming enable flag */ |
| 460 | struct sk_buff *txglom_sgpad; /* scatter-gather padding buffer */ | ||
| 461 | u16 head_align; /* buffer pointer alignment */ | 460 | u16 head_align; /* buffer pointer alignment */ |
| 462 | u16 sgentry_align; /* scatter-gather buffer alignment */ | 461 | u16 sgentry_align; /* scatter-gather buffer alignment */ |
| 463 | }; | 462 | }; |
| @@ -1944,9 +1943,8 @@ static int brcmf_sdio_txpkt_prep_sg(struct brcmf_sdio *bus, | |||
| 1944 | if (lastfrm && chain_pad) | 1943 | if (lastfrm && chain_pad) |
| 1945 | tail_pad += blksize - chain_pad; | 1944 | tail_pad += blksize - chain_pad; |
| 1946 | if (skb_tailroom(pkt) < tail_pad && pkt->len > blksize) { | 1945 | if (skb_tailroom(pkt) < tail_pad && pkt->len > blksize) { |
| 1947 | pkt_pad = bus->txglom_sgpad; | 1946 | pkt_pad = brcmu_pkt_buf_get_skb(tail_pad + tail_chop + |
| 1948 | if (pkt_pad == NULL) | 1947 | bus->head_align); |
| 1949 | brcmu_pkt_buf_get_skb(tail_pad + tail_chop); | ||
| 1950 | if (pkt_pad == NULL) | 1948 | if (pkt_pad == NULL) |
| 1951 | return -ENOMEM; | 1949 | return -ENOMEM; |
| 1952 | ret = brcmf_sdio_txpkt_hdalign(bus, pkt_pad); | 1950 | ret = brcmf_sdio_txpkt_hdalign(bus, pkt_pad); |
| @@ -1957,6 +1955,7 @@ static int brcmf_sdio_txpkt_prep_sg(struct brcmf_sdio *bus, | |||
| 1957 | tail_chop); | 1955 | tail_chop); |
| 1958 | *(u32 *)(pkt_pad->cb) = ALIGN_SKB_FLAG + tail_chop; | 1956 | *(u32 *)(pkt_pad->cb) = ALIGN_SKB_FLAG + tail_chop; |
| 1959 | skb_trim(pkt, pkt->len - tail_chop); | 1957 | skb_trim(pkt, pkt->len - tail_chop); |
| 1958 | skb_trim(pkt_pad, tail_pad + tail_chop); | ||
| 1960 | __skb_queue_after(pktq, pkt, pkt_pad); | 1959 | __skb_queue_after(pktq, pkt, pkt_pad); |
| 1961 | } else { | 1960 | } else { |
| 1962 | ntail = pkt->data_len + tail_pad - | 1961 | ntail = pkt->data_len + tail_pad - |
| @@ -2011,7 +2010,7 @@ brcmf_sdio_txpkt_prep(struct brcmf_sdio *bus, struct sk_buff_head *pktq, | |||
| 2011 | return ret; | 2010 | return ret; |
| 2012 | head_pad = (u16)ret; | 2011 | head_pad = (u16)ret; |
| 2013 | if (head_pad) | 2012 | if (head_pad) |
| 2014 | memset(pkt_next->data, 0, head_pad + bus->tx_hdrlen); | 2013 | memset(pkt_next->data + bus->tx_hdrlen, 0, head_pad); |
| 2015 | 2014 | ||
| 2016 | total_len += pkt_next->len; | 2015 | total_len += pkt_next->len; |
| 2017 | 2016 | ||
| @@ -3486,10 +3485,6 @@ static int brcmf_sdio_bus_preinit(struct device *dev) | |||
| 3486 | bus->txglom = false; | 3485 | bus->txglom = false; |
| 3487 | value = 1; | 3486 | value = 1; |
| 3488 | pad_size = bus->sdiodev->func[2]->cur_blksize << 1; | 3487 | pad_size = bus->sdiodev->func[2]->cur_blksize << 1; |
| 3489 | bus->txglom_sgpad = brcmu_pkt_buf_get_skb(pad_size); | ||
| 3490 | if (!bus->txglom_sgpad) | ||
| 3491 | brcmf_err("allocating txglom padding skb failed, reduced performance\n"); | ||
| 3492 | |||
| 3493 | err = brcmf_iovar_data_set(bus->sdiodev->dev, "bus:rxglom", | 3488 | err = brcmf_iovar_data_set(bus->sdiodev->dev, "bus:rxglom", |
| 3494 | &value, sizeof(u32)); | 3489 | &value, sizeof(u32)); |
| 3495 | if (err < 0) { | 3490 | if (err < 0) { |
| @@ -4053,7 +4048,6 @@ void brcmf_sdio_remove(struct brcmf_sdio *bus) | |||
| 4053 | brcmf_sdio_chip_detach(&bus->ci); | 4048 | brcmf_sdio_chip_detach(&bus->ci); |
| 4054 | } | 4049 | } |
| 4055 | 4050 | ||
| 4056 | brcmu_pkt_buf_free_skb(bus->txglom_sgpad); | ||
| 4057 | kfree(bus->rxbuf); | 4051 | kfree(bus->rxbuf); |
| 4058 | kfree(bus->hdrbuf); | 4052 | kfree(bus->hdrbuf); |
| 4059 | kfree(bus); | 4053 | kfree(bus); |
diff --git a/drivers/net/wireless/hostap/hostap_ap.c b/drivers/net/wireless/hostap/hostap_ap.c index d36e252d2ccb..596525528f50 100644 --- a/drivers/net/wireless/hostap/hostap_ap.c +++ b/drivers/net/wireless/hostap/hostap_ap.c | |||
| @@ -147,7 +147,7 @@ static void ap_free_sta(struct ap_data *ap, struct sta_info *sta) | |||
| 147 | 147 | ||
| 148 | if (!sta->ap && sta->u.sta.challenge) | 148 | if (!sta->ap && sta->u.sta.challenge) |
| 149 | kfree(sta->u.sta.challenge); | 149 | kfree(sta->u.sta.challenge); |
| 150 | del_timer(&sta->timer); | 150 | del_timer_sync(&sta->timer); |
| 151 | #endif /* PRISM2_NO_KERNEL_IEEE80211_MGMT */ | 151 | #endif /* PRISM2_NO_KERNEL_IEEE80211_MGMT */ |
| 152 | 152 | ||
| 153 | kfree(sta); | 153 | kfree(sta); |
diff --git a/drivers/net/wireless/iwlwifi/dvm/sta.c b/drivers/net/wireless/iwlwifi/dvm/sta.c index c0d070c5df5e..9cdd91cdf661 100644 --- a/drivers/net/wireless/iwlwifi/dvm/sta.c +++ b/drivers/net/wireless/iwlwifi/dvm/sta.c | |||
| @@ -590,6 +590,7 @@ void iwl_deactivate_station(struct iwl_priv *priv, const u8 sta_id, | |||
| 590 | sizeof(priv->tid_data[sta_id][tid])); | 590 | sizeof(priv->tid_data[sta_id][tid])); |
| 591 | 591 | ||
| 592 | priv->stations[sta_id].used &= ~IWL_STA_DRIVER_ACTIVE; | 592 | priv->stations[sta_id].used &= ~IWL_STA_DRIVER_ACTIVE; |
| 593 | priv->stations[sta_id].used &= ~IWL_STA_UCODE_INPROGRESS; | ||
| 593 | 594 | ||
| 594 | priv->num_stations--; | 595 | priv->num_stations--; |
| 595 | 596 | ||
diff --git a/drivers/net/wireless/iwlwifi/dvm/tx.c b/drivers/net/wireless/iwlwifi/dvm/tx.c index a6839dfcb82d..398dd096674c 100644 --- a/drivers/net/wireless/iwlwifi/dvm/tx.c +++ b/drivers/net/wireless/iwlwifi/dvm/tx.c | |||
| @@ -1291,8 +1291,6 @@ int iwlagn_rx_reply_compressed_ba(struct iwl_priv *priv, | |||
| 1291 | struct iwl_compressed_ba_resp *ba_resp = (void *)pkt->data; | 1291 | struct iwl_compressed_ba_resp *ba_resp = (void *)pkt->data; |
| 1292 | struct iwl_ht_agg *agg; | 1292 | struct iwl_ht_agg *agg; |
| 1293 | struct sk_buff_head reclaimed_skbs; | 1293 | struct sk_buff_head reclaimed_skbs; |
| 1294 | struct ieee80211_tx_info *info; | ||
| 1295 | struct ieee80211_hdr *hdr; | ||
| 1296 | struct sk_buff *skb; | 1294 | struct sk_buff *skb; |
| 1297 | int sta_id; | 1295 | int sta_id; |
| 1298 | int tid; | 1296 | int tid; |
| @@ -1379,22 +1377,28 @@ int iwlagn_rx_reply_compressed_ba(struct iwl_priv *priv, | |||
| 1379 | freed = 0; | 1377 | freed = 0; |
| 1380 | 1378 | ||
| 1381 | skb_queue_walk(&reclaimed_skbs, skb) { | 1379 | skb_queue_walk(&reclaimed_skbs, skb) { |
| 1382 | hdr = (struct ieee80211_hdr *)skb->data; | 1380 | struct ieee80211_hdr *hdr = (void *)skb->data; |
| 1381 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | ||
| 1383 | 1382 | ||
| 1384 | if (ieee80211_is_data_qos(hdr->frame_control)) | 1383 | if (ieee80211_is_data_qos(hdr->frame_control)) |
| 1385 | freed++; | 1384 | freed++; |
| 1386 | else | 1385 | else |
| 1387 | WARN_ON_ONCE(1); | 1386 | WARN_ON_ONCE(1); |
| 1388 | 1387 | ||
| 1389 | info = IEEE80211_SKB_CB(skb); | ||
| 1390 | iwl_trans_free_tx_cmd(priv->trans, info->driver_data[1]); | 1388 | iwl_trans_free_tx_cmd(priv->trans, info->driver_data[1]); |
| 1391 | 1389 | ||
| 1390 | memset(&info->status, 0, sizeof(info->status)); | ||
| 1391 | /* Packet was transmitted successfully, failures come as single | ||
| 1392 | * frames because before failing a frame the firmware transmits | ||
| 1393 | * it without aggregation at least once. | ||
| 1394 | */ | ||
| 1395 | info->flags |= IEEE80211_TX_STAT_ACK; | ||
| 1396 | |||
| 1392 | if (freed == 1) { | 1397 | if (freed == 1) { |
| 1393 | /* this is the first skb we deliver in this batch */ | 1398 | /* this is the first skb we deliver in this batch */ |
| 1394 | /* put the rate scaling data there */ | 1399 | /* put the rate scaling data there */ |
| 1395 | info = IEEE80211_SKB_CB(skb); | 1400 | info = IEEE80211_SKB_CB(skb); |
| 1396 | memset(&info->status, 0, sizeof(info->status)); | 1401 | memset(&info->status, 0, sizeof(info->status)); |
| 1397 | info->flags |= IEEE80211_TX_STAT_ACK; | ||
| 1398 | info->flags |= IEEE80211_TX_STAT_AMPDU; | 1402 | info->flags |= IEEE80211_TX_STAT_AMPDU; |
| 1399 | info->status.ampdu_ack_len = ba_resp->txed_2_done; | 1403 | info->status.ampdu_ack_len = ba_resp->txed_2_done; |
| 1400 | info->status.ampdu_len = ba_resp->txed; | 1404 | info->status.ampdu_len = ba_resp->txed; |
diff --git a/drivers/net/wireless/iwlwifi/mvm/mvm.h b/drivers/net/wireless/iwlwifi/mvm/mvm.h index e4ead86f06d6..2b0ba1fc3c82 100644 --- a/drivers/net/wireless/iwlwifi/mvm/mvm.h +++ b/drivers/net/wireless/iwlwifi/mvm/mvm.h | |||
| @@ -152,7 +152,7 @@ enum iwl_power_scheme { | |||
| 152 | IWL_POWER_SCHEME_LP | 152 | IWL_POWER_SCHEME_LP |
| 153 | }; | 153 | }; |
| 154 | 154 | ||
| 155 | #define IWL_CONN_MAX_LISTEN_INTERVAL 70 | 155 | #define IWL_CONN_MAX_LISTEN_INTERVAL 10 |
| 156 | #define IWL_UAPSD_AC_INFO (IEEE80211_WMM_IE_STA_QOSINFO_AC_VO |\ | 156 | #define IWL_UAPSD_AC_INFO (IEEE80211_WMM_IE_STA_QOSINFO_AC_VO |\ |
| 157 | IEEE80211_WMM_IE_STA_QOSINFO_AC_VI |\ | 157 | IEEE80211_WMM_IE_STA_QOSINFO_AC_VI |\ |
| 158 | IEEE80211_WMM_IE_STA_QOSINFO_AC_BK |\ | 158 | IEEE80211_WMM_IE_STA_QOSINFO_AC_BK |\ |
diff --git a/drivers/net/wireless/iwlwifi/mvm/tx.c b/drivers/net/wireless/iwlwifi/mvm/tx.c index 4df12fa9d336..76ee486039d7 100644 --- a/drivers/net/wireless/iwlwifi/mvm/tx.c +++ b/drivers/net/wireless/iwlwifi/mvm/tx.c | |||
| @@ -822,16 +822,12 @@ int iwl_mvm_rx_ba_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb, | |||
| 822 | struct iwl_mvm_ba_notif *ba_notif = (void *)pkt->data; | 822 | struct iwl_mvm_ba_notif *ba_notif = (void *)pkt->data; |
| 823 | struct sk_buff_head reclaimed_skbs; | 823 | struct sk_buff_head reclaimed_skbs; |
| 824 | struct iwl_mvm_tid_data *tid_data; | 824 | struct iwl_mvm_tid_data *tid_data; |
| 825 | struct ieee80211_tx_info *info; | ||
| 826 | struct ieee80211_sta *sta; | 825 | struct ieee80211_sta *sta; |
| 827 | struct iwl_mvm_sta *mvmsta; | 826 | struct iwl_mvm_sta *mvmsta; |
| 828 | struct ieee80211_hdr *hdr; | ||
| 829 | struct sk_buff *skb; | 827 | struct sk_buff *skb; |
| 830 | int sta_id, tid, freed; | 828 | int sta_id, tid, freed; |
| 831 | |||
| 832 | /* "flow" corresponds to Tx queue */ | 829 | /* "flow" corresponds to Tx queue */ |
| 833 | u16 scd_flow = le16_to_cpu(ba_notif->scd_flow); | 830 | u16 scd_flow = le16_to_cpu(ba_notif->scd_flow); |
| 834 | |||
| 835 | /* "ssn" is start of block-ack Tx window, corresponds to index | 831 | /* "ssn" is start of block-ack Tx window, corresponds to index |
| 836 | * (in Tx queue's circular buffer) of first TFD/frame in window */ | 832 | * (in Tx queue's circular buffer) of first TFD/frame in window */ |
| 837 | u16 ba_resp_scd_ssn = le16_to_cpu(ba_notif->scd_ssn); | 833 | u16 ba_resp_scd_ssn = le16_to_cpu(ba_notif->scd_ssn); |
| @@ -888,22 +884,26 @@ int iwl_mvm_rx_ba_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb, | |||
| 888 | freed = 0; | 884 | freed = 0; |
| 889 | 885 | ||
| 890 | skb_queue_walk(&reclaimed_skbs, skb) { | 886 | skb_queue_walk(&reclaimed_skbs, skb) { |
| 891 | hdr = (struct ieee80211_hdr *)skb->data; | 887 | struct ieee80211_hdr *hdr = (void *)skb->data; |
| 888 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | ||
| 892 | 889 | ||
| 893 | if (ieee80211_is_data_qos(hdr->frame_control)) | 890 | if (ieee80211_is_data_qos(hdr->frame_control)) |
| 894 | freed++; | 891 | freed++; |
| 895 | else | 892 | else |
| 896 | WARN_ON_ONCE(1); | 893 | WARN_ON_ONCE(1); |
| 897 | 894 | ||
| 898 | info = IEEE80211_SKB_CB(skb); | ||
| 899 | iwl_trans_free_tx_cmd(mvm->trans, info->driver_data[1]); | 895 | iwl_trans_free_tx_cmd(mvm->trans, info->driver_data[1]); |
| 900 | 896 | ||
| 897 | memset(&info->status, 0, sizeof(info->status)); | ||
| 898 | /* Packet was transmitted successfully, failures come as single | ||
| 899 | * frames because before failing a frame the firmware transmits | ||
| 900 | * it without aggregation at least once. | ||
| 901 | */ | ||
| 902 | info->flags |= IEEE80211_TX_STAT_ACK; | ||
| 903 | |||
| 901 | if (freed == 1) { | 904 | if (freed == 1) { |
| 902 | /* this is the first skb we deliver in this batch */ | 905 | /* this is the first skb we deliver in this batch */ |
| 903 | /* put the rate scaling data there */ | 906 | /* put the rate scaling data there */ |
| 904 | info = IEEE80211_SKB_CB(skb); | ||
| 905 | memset(&info->status, 0, sizeof(info->status)); | ||
| 906 | info->flags |= IEEE80211_TX_STAT_ACK; | ||
| 907 | info->flags |= IEEE80211_TX_STAT_AMPDU; | 907 | info->flags |= IEEE80211_TX_STAT_AMPDU; |
| 908 | info->status.ampdu_ack_len = ba_notif->txed_2_done; | 908 | info->status.ampdu_ack_len = ba_notif->txed_2_done; |
| 909 | info->status.ampdu_len = ba_notif->txed; | 909 | info->status.ampdu_len = ba_notif->txed; |
diff --git a/drivers/net/wireless/libertas/cfg.c b/drivers/net/wireless/libertas/cfg.c index 32f75007a825..cb6d189bc3e6 100644 --- a/drivers/net/wireless/libertas/cfg.c +++ b/drivers/net/wireless/libertas/cfg.c | |||
| @@ -621,7 +621,7 @@ static int lbs_ret_scan(struct lbs_private *priv, unsigned long dummy, | |||
| 621 | id = *pos++; | 621 | id = *pos++; |
| 622 | elen = *pos++; | 622 | elen = *pos++; |
| 623 | left -= 2; | 623 | left -= 2; |
| 624 | if (elen > left || elen == 0) { | 624 | if (elen > left) { |
| 625 | lbs_deb_scan("scan response: invalid IE fmt\n"); | 625 | lbs_deb_scan("scan response: invalid IE fmt\n"); |
| 626 | goto done; | 626 | goto done; |
| 627 | } | 627 | } |
diff --git a/drivers/net/wireless/mwifiex/pcie.c b/drivers/net/wireless/mwifiex/pcie.c index 03688aa14e8a..7fe7b53fb17a 100644 --- a/drivers/net/wireless/mwifiex/pcie.c +++ b/drivers/net/wireless/mwifiex/pcie.c | |||
| @@ -1211,6 +1211,12 @@ static int mwifiex_pcie_process_recv_data(struct mwifiex_adapter *adapter) | |||
| 1211 | rd_index = card->rxbd_rdptr & reg->rx_mask; | 1211 | rd_index = card->rxbd_rdptr & reg->rx_mask; |
| 1212 | skb_data = card->rx_buf_list[rd_index]; | 1212 | skb_data = card->rx_buf_list[rd_index]; |
| 1213 | 1213 | ||
| 1214 | /* If skb allocation was failed earlier for Rx packet, | ||
| 1215 | * rx_buf_list[rd_index] would have been left with a NULL. | ||
| 1216 | */ | ||
| 1217 | if (!skb_data) | ||
| 1218 | return -ENOMEM; | ||
| 1219 | |||
| 1214 | MWIFIEX_SKB_PACB(skb_data, &buf_pa); | 1220 | MWIFIEX_SKB_PACB(skb_data, &buf_pa); |
| 1215 | pci_unmap_single(card->dev, buf_pa, MWIFIEX_RX_DATA_BUF_SIZE, | 1221 | pci_unmap_single(card->dev, buf_pa, MWIFIEX_RX_DATA_BUF_SIZE, |
| 1216 | PCI_DMA_FROMDEVICE); | 1222 | PCI_DMA_FROMDEVICE); |
| @@ -1525,6 +1531,14 @@ static int mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter *adapter) | |||
| 1525 | if (adapter->ps_state == PS_STATE_SLEEP_CFM) { | 1531 | if (adapter->ps_state == PS_STATE_SLEEP_CFM) { |
| 1526 | mwifiex_process_sleep_confirm_resp(adapter, skb->data, | 1532 | mwifiex_process_sleep_confirm_resp(adapter, skb->data, |
| 1527 | skb->len); | 1533 | skb->len); |
| 1534 | mwifiex_pcie_enable_host_int(adapter); | ||
| 1535 | if (mwifiex_write_reg(adapter, | ||
| 1536 | PCIE_CPU_INT_EVENT, | ||
| 1537 | CPU_INTR_SLEEP_CFM_DONE)) { | ||
| 1538 | dev_warn(adapter->dev, | ||
| 1539 | "Write register failed\n"); | ||
| 1540 | return -1; | ||
| 1541 | } | ||
| 1528 | while (reg->sleep_cookie && (count++ < 10) && | 1542 | while (reg->sleep_cookie && (count++ < 10) && |
| 1529 | mwifiex_pcie_ok_to_access_hw(adapter)) | 1543 | mwifiex_pcie_ok_to_access_hw(adapter)) |
| 1530 | usleep_range(50, 60); | 1544 | usleep_range(50, 60); |
| @@ -1993,23 +2007,9 @@ static void mwifiex_interrupt_status(struct mwifiex_adapter *adapter) | |||
| 1993 | adapter->int_status |= pcie_ireg; | 2007 | adapter->int_status |= pcie_ireg; |
| 1994 | spin_unlock_irqrestore(&adapter->int_lock, flags); | 2008 | spin_unlock_irqrestore(&adapter->int_lock, flags); |
| 1995 | 2009 | ||
| 1996 | if (pcie_ireg & HOST_INTR_CMD_DONE) { | 2010 | if (!adapter->pps_uapsd_mode && |
| 1997 | if ((adapter->ps_state == PS_STATE_SLEEP_CFM) || | 2011 | adapter->ps_state == PS_STATE_SLEEP && |
| 1998 | (adapter->ps_state == PS_STATE_SLEEP)) { | 2012 | mwifiex_pcie_ok_to_access_hw(adapter)) { |
| 1999 | mwifiex_pcie_enable_host_int(adapter); | ||
| 2000 | if (mwifiex_write_reg(adapter, | ||
| 2001 | PCIE_CPU_INT_EVENT, | ||
| 2002 | CPU_INTR_SLEEP_CFM_DONE) | ||
| 2003 | ) { | ||
| 2004 | dev_warn(adapter->dev, | ||
| 2005 | "Write register failed\n"); | ||
| 2006 | return; | ||
| 2007 | |||
| 2008 | } | ||
| 2009 | } | ||
| 2010 | } else if (!adapter->pps_uapsd_mode && | ||
| 2011 | adapter->ps_state == PS_STATE_SLEEP && | ||
| 2012 | mwifiex_pcie_ok_to_access_hw(adapter)) { | ||
| 2013 | /* Potentially for PCIe we could get other | 2013 | /* Potentially for PCIe we could get other |
| 2014 | * interrupts like shared. Don't change power | 2014 | * interrupts like shared. Don't change power |
| 2015 | * state until cookie is set */ | 2015 | * state until cookie is set */ |
diff --git a/drivers/net/wireless/mwifiex/usb.c b/drivers/net/wireless/mwifiex/usb.c index e8ebbd4bc3cd..208748804a55 100644 --- a/drivers/net/wireless/mwifiex/usb.c +++ b/drivers/net/wireless/mwifiex/usb.c | |||
| @@ -22,8 +22,6 @@ | |||
| 22 | 22 | ||
| 23 | #define USB_VERSION "1.0" | 23 | #define USB_VERSION "1.0" |
| 24 | 24 | ||
| 25 | static const char usbdriver_name[] = "usb8xxx"; | ||
| 26 | |||
| 27 | static struct mwifiex_if_ops usb_ops; | 25 | static struct mwifiex_if_ops usb_ops; |
| 28 | static struct semaphore add_remove_card_sem; | 26 | static struct semaphore add_remove_card_sem; |
| 29 | static struct usb_card_rec *usb_card; | 27 | static struct usb_card_rec *usb_card; |
| @@ -527,13 +525,6 @@ static int mwifiex_usb_resume(struct usb_interface *intf) | |||
| 527 | MWIFIEX_BSS_ROLE_ANY), | 525 | MWIFIEX_BSS_ROLE_ANY), |
| 528 | MWIFIEX_ASYNC_CMD); | 526 | MWIFIEX_ASYNC_CMD); |
| 529 | 527 | ||
| 530 | #ifdef CONFIG_PM | ||
| 531 | /* Resume handler may be called due to remote wakeup, | ||
| 532 | * force to exit suspend anyway | ||
| 533 | */ | ||
| 534 | usb_disable_autosuspend(card->udev); | ||
| 535 | #endif /* CONFIG_PM */ | ||
| 536 | |||
| 537 | return 0; | 528 | return 0; |
| 538 | } | 529 | } |
| 539 | 530 | ||
| @@ -567,13 +558,12 @@ static void mwifiex_usb_disconnect(struct usb_interface *intf) | |||
| 567 | } | 558 | } |
| 568 | 559 | ||
| 569 | static struct usb_driver mwifiex_usb_driver = { | 560 | static struct usb_driver mwifiex_usb_driver = { |
| 570 | .name = usbdriver_name, | 561 | .name = "mwifiex_usb", |
| 571 | .probe = mwifiex_usb_probe, | 562 | .probe = mwifiex_usb_probe, |
| 572 | .disconnect = mwifiex_usb_disconnect, | 563 | .disconnect = mwifiex_usb_disconnect, |
| 573 | .id_table = mwifiex_usb_table, | 564 | .id_table = mwifiex_usb_table, |
| 574 | .suspend = mwifiex_usb_suspend, | 565 | .suspend = mwifiex_usb_suspend, |
| 575 | .resume = mwifiex_usb_resume, | 566 | .resume = mwifiex_usb_resume, |
| 576 | .supports_autosuspend = 1, | ||
| 577 | }; | 567 | }; |
| 578 | 568 | ||
| 579 | static int mwifiex_usb_tx_init(struct mwifiex_adapter *adapter) | 569 | static int mwifiex_usb_tx_init(struct mwifiex_adapter *adapter) |
diff --git a/drivers/net/wireless/mwifiex/wmm.c b/drivers/net/wireless/mwifiex/wmm.c index 13eaeed03898..981cf6e7c73b 100644 --- a/drivers/net/wireless/mwifiex/wmm.c +++ b/drivers/net/wireless/mwifiex/wmm.c | |||
| @@ -559,7 +559,8 @@ mwifiex_clean_txrx(struct mwifiex_private *priv) | |||
| 559 | mwifiex_wmm_delete_all_ralist(priv); | 559 | mwifiex_wmm_delete_all_ralist(priv); |
| 560 | memcpy(tos_to_tid, ac_to_tid, sizeof(tos_to_tid)); | 560 | memcpy(tos_to_tid, ac_to_tid, sizeof(tos_to_tid)); |
| 561 | 561 | ||
| 562 | if (priv->adapter->if_ops.clean_pcie_ring) | 562 | if (priv->adapter->if_ops.clean_pcie_ring && |
| 563 | !priv->adapter->surprise_removed) | ||
| 563 | priv->adapter->if_ops.clean_pcie_ring(priv->adapter); | 564 | priv->adapter->if_ops.clean_pcie_ring(priv->adapter); |
| 564 | spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock, flags); | 565 | spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock, flags); |
| 565 | } | 566 | } |
diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c index f9daa9e183f2..e30d80033cbc 100644 --- a/drivers/net/xen-netfront.c +++ b/drivers/net/xen-netfront.c | |||
| @@ -907,6 +907,7 @@ static int handle_incoming_queue(struct net_device *dev, | |||
| 907 | 907 | ||
| 908 | /* Ethernet work: Delayed to here as it peeks the header. */ | 908 | /* Ethernet work: Delayed to here as it peeks the header. */ |
| 909 | skb->protocol = eth_type_trans(skb, dev); | 909 | skb->protocol = eth_type_trans(skb, dev); |
| 910 | skb_reset_network_header(skb); | ||
| 910 | 911 | ||
| 911 | if (checksum_setup(dev, skb)) { | 912 | if (checksum_setup(dev, skb)) { |
| 912 | kfree_skb(skb); | 913 | kfree_skb(skb); |
diff --git a/drivers/pinctrl/Kconfig b/drivers/pinctrl/Kconfig index be361b7cd30f..1e4e69384baa 100644 --- a/drivers/pinctrl/Kconfig +++ b/drivers/pinctrl/Kconfig | |||
| @@ -217,7 +217,7 @@ config PINCTRL_IMX28 | |||
| 217 | select PINCTRL_MXS | 217 | select PINCTRL_MXS |
| 218 | 218 | ||
| 219 | config PINCTRL_MSM | 219 | config PINCTRL_MSM |
| 220 | tristate | 220 | bool |
| 221 | select PINMUX | 221 | select PINMUX |
| 222 | select PINCONF | 222 | select PINCONF |
| 223 | select GENERIC_PINCONF | 223 | select GENERIC_PINCONF |
diff --git a/drivers/pinctrl/pinctrl-sunxi.c b/drivers/pinctrl/pinctrl-sunxi.c index 9ccf681dad2f..f9fabe9bf47d 100644 --- a/drivers/pinctrl/pinctrl-sunxi.c +++ b/drivers/pinctrl/pinctrl-sunxi.c | |||
| @@ -14,6 +14,7 @@ | |||
| 14 | #include <linux/clk.h> | 14 | #include <linux/clk.h> |
| 15 | #include <linux/gpio.h> | 15 | #include <linux/gpio.h> |
| 16 | #include <linux/irqdomain.h> | 16 | #include <linux/irqdomain.h> |
| 17 | #include <linux/irqchip/chained_irq.h> | ||
| 17 | #include <linux/module.h> | 18 | #include <linux/module.h> |
| 18 | #include <linux/of.h> | 19 | #include <linux/of.h> |
| 19 | #include <linux/of_address.h> | 20 | #include <linux/of_address.h> |
| @@ -584,7 +585,7 @@ static int sunxi_pinctrl_irq_set_type(struct irq_data *d, | |||
| 584 | spin_lock_irqsave(&pctl->lock, flags); | 585 | spin_lock_irqsave(&pctl->lock, flags); |
| 585 | 586 | ||
| 586 | regval = readl(pctl->membase + reg); | 587 | regval = readl(pctl->membase + reg); |
| 587 | regval &= ~IRQ_CFG_IRQ_MASK; | 588 | regval &= ~(IRQ_CFG_IRQ_MASK << index); |
| 588 | writel(regval | (mode << index), pctl->membase + reg); | 589 | writel(regval | (mode << index), pctl->membase + reg); |
| 589 | 590 | ||
| 590 | spin_unlock_irqrestore(&pctl->lock, flags); | 591 | spin_unlock_irqrestore(&pctl->lock, flags); |
| @@ -665,6 +666,7 @@ static struct irq_chip sunxi_pinctrl_irq_chip = { | |||
| 665 | 666 | ||
| 666 | static void sunxi_pinctrl_irq_handler(unsigned irq, struct irq_desc *desc) | 667 | static void sunxi_pinctrl_irq_handler(unsigned irq, struct irq_desc *desc) |
| 667 | { | 668 | { |
| 669 | struct irq_chip *chip = irq_get_chip(irq); | ||
| 668 | struct sunxi_pinctrl *pctl = irq_get_handler_data(irq); | 670 | struct sunxi_pinctrl *pctl = irq_get_handler_data(irq); |
| 669 | const unsigned long reg = readl(pctl->membase + IRQ_STATUS_REG); | 671 | const unsigned long reg = readl(pctl->membase + IRQ_STATUS_REG); |
| 670 | 672 | ||
| @@ -674,10 +676,12 @@ static void sunxi_pinctrl_irq_handler(unsigned irq, struct irq_desc *desc) | |||
| 674 | if (reg) { | 676 | if (reg) { |
| 675 | int irqoffset; | 677 | int irqoffset; |
| 676 | 678 | ||
| 679 | chained_irq_enter(chip, desc); | ||
| 677 | for_each_set_bit(irqoffset, ®, SUNXI_IRQ_NUMBER) { | 680 | for_each_set_bit(irqoffset, ®, SUNXI_IRQ_NUMBER) { |
| 678 | int pin_irq = irq_find_mapping(pctl->domain, irqoffset); | 681 | int pin_irq = irq_find_mapping(pctl->domain, irqoffset); |
| 679 | generic_handle_irq(pin_irq); | 682 | generic_handle_irq(pin_irq); |
| 680 | } | 683 | } |
| 684 | chained_irq_exit(chip, desc); | ||
| 681 | } | 685 | } |
| 682 | } | 686 | } |
| 683 | 687 | ||
diff --git a/drivers/pinctrl/pinctrl-sunxi.h b/drivers/pinctrl/pinctrl-sunxi.h index 01c494f8a14f..552b0e97077a 100644 --- a/drivers/pinctrl/pinctrl-sunxi.h +++ b/drivers/pinctrl/pinctrl-sunxi.h | |||
| @@ -511,7 +511,7 @@ static inline u32 sunxi_pull_offset(u16 pin) | |||
| 511 | 511 | ||
| 512 | static inline u32 sunxi_irq_cfg_reg(u16 irq) | 512 | static inline u32 sunxi_irq_cfg_reg(u16 irq) |
| 513 | { | 513 | { |
| 514 | u8 reg = irq / IRQ_CFG_IRQ_PER_REG; | 514 | u8 reg = irq / IRQ_CFG_IRQ_PER_REG * 0x04; |
| 515 | return reg + IRQ_CFG_REG; | 515 | return reg + IRQ_CFG_REG; |
| 516 | } | 516 | } |
| 517 | 517 | ||
| @@ -523,7 +523,7 @@ static inline u32 sunxi_irq_cfg_offset(u16 irq) | |||
| 523 | 523 | ||
| 524 | static inline u32 sunxi_irq_ctrl_reg(u16 irq) | 524 | static inline u32 sunxi_irq_ctrl_reg(u16 irq) |
| 525 | { | 525 | { |
| 526 | u8 reg = irq / IRQ_CTRL_IRQ_PER_REG; | 526 | u8 reg = irq / IRQ_CTRL_IRQ_PER_REG * 0x04; |
| 527 | return reg + IRQ_CTRL_REG; | 527 | return reg + IRQ_CTRL_REG; |
| 528 | } | 528 | } |
| 529 | 529 | ||
| @@ -535,7 +535,7 @@ static inline u32 sunxi_irq_ctrl_offset(u16 irq) | |||
| 535 | 535 | ||
| 536 | static inline u32 sunxi_irq_status_reg(u16 irq) | 536 | static inline u32 sunxi_irq_status_reg(u16 irq) |
| 537 | { | 537 | { |
| 538 | u8 reg = irq / IRQ_STATUS_IRQ_PER_REG; | 538 | u8 reg = irq / IRQ_STATUS_IRQ_PER_REG * 0x04; |
| 539 | return reg + IRQ_STATUS_REG; | 539 | return reg + IRQ_STATUS_REG; |
| 540 | } | 540 | } |
| 541 | 541 | ||
diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7791.c b/drivers/pinctrl/sh-pfc/pfc-r8a7791.c index 77d103fe39d9..567d6918d50b 100644 --- a/drivers/pinctrl/sh-pfc/pfc-r8a7791.c +++ b/drivers/pinctrl/sh-pfc/pfc-r8a7791.c | |||
| @@ -89,7 +89,8 @@ enum { | |||
| 89 | 89 | ||
| 90 | /* GPSR6 */ | 90 | /* GPSR6 */ |
| 91 | FN_IP13_10, FN_IP13_11, FN_IP13_12, FN_IP13_13, FN_IP13_14, | 91 | FN_IP13_10, FN_IP13_11, FN_IP13_12, FN_IP13_13, FN_IP13_14, |
| 92 | FN_IP13_15, FN_IP13_18_16, FN_IP13_21_19, FN_IP13_22, FN_IP13_24_23, | 92 | FN_IP13_15, FN_IP13_18_16, FN_IP13_21_19, |
| 93 | FN_IP13_22, FN_IP13_24_23, FN_SD1_CLK, | ||
| 93 | FN_IP13_25, FN_IP13_26, FN_IP13_27, FN_IP13_30_28, FN_IP14_1_0, | 94 | FN_IP13_25, FN_IP13_26, FN_IP13_27, FN_IP13_30_28, FN_IP14_1_0, |
| 94 | FN_IP14_2, FN_IP14_3, FN_IP14_4, FN_IP14_5, FN_IP14_6, FN_IP14_7, | 95 | FN_IP14_2, FN_IP14_3, FN_IP14_4, FN_IP14_5, FN_IP14_6, FN_IP14_7, |
| 95 | FN_IP14_10_8, FN_IP14_13_11, FN_IP14_16_14, FN_IP14_19_17, | 96 | FN_IP14_10_8, FN_IP14_13_11, FN_IP14_16_14, FN_IP14_19_17, |
| @@ -788,6 +789,7 @@ static const u16 pinmux_data[] = { | |||
| 788 | PINMUX_DATA(USB1_PWEN_MARK, FN_USB1_PWEN), | 789 | PINMUX_DATA(USB1_PWEN_MARK, FN_USB1_PWEN), |
| 789 | PINMUX_DATA(USB1_OVC_MARK, FN_USB1_OVC), | 790 | PINMUX_DATA(USB1_OVC_MARK, FN_USB1_OVC), |
| 790 | PINMUX_DATA(DU0_DOTCLKIN_MARK, FN_DU0_DOTCLKIN), | 791 | PINMUX_DATA(DU0_DOTCLKIN_MARK, FN_DU0_DOTCLKIN), |
| 792 | PINMUX_DATA(SD1_CLK_MARK, FN_SD1_CLK), | ||
| 791 | 793 | ||
| 792 | /* IPSR0 */ | 794 | /* IPSR0 */ |
| 793 | PINMUX_IPSR_DATA(IP0_0, D0), | 795 | PINMUX_IPSR_DATA(IP0_0, D0), |
| @@ -3825,7 +3827,7 @@ static const struct pinmux_cfg_reg pinmux_config_regs[] = { | |||
| 3825 | GP_6_11_FN, FN_IP13_25, | 3827 | GP_6_11_FN, FN_IP13_25, |
| 3826 | GP_6_10_FN, FN_IP13_24_23, | 3828 | GP_6_10_FN, FN_IP13_24_23, |
| 3827 | GP_6_9_FN, FN_IP13_22, | 3829 | GP_6_9_FN, FN_IP13_22, |
| 3828 | 0, 0, | 3830 | GP_6_8_FN, FN_SD1_CLK, |
| 3829 | GP_6_7_FN, FN_IP13_21_19, | 3831 | GP_6_7_FN, FN_IP13_21_19, |
| 3830 | GP_6_6_FN, FN_IP13_18_16, | 3832 | GP_6_6_FN, FN_IP13_18_16, |
| 3831 | GP_6_5_FN, FN_IP13_15, | 3833 | GP_6_5_FN, FN_IP13_15, |
diff --git a/drivers/pinctrl/sirf/pinctrl-sirf.c b/drivers/pinctrl/sirf/pinctrl-sirf.c index a0d6152701cd..617a4916b50f 100644 --- a/drivers/pinctrl/sirf/pinctrl-sirf.c +++ b/drivers/pinctrl/sirf/pinctrl-sirf.c | |||
| @@ -598,7 +598,7 @@ static unsigned int sirfsoc_gpio_irq_startup(struct irq_data *d) | |||
| 598 | { | 598 | { |
| 599 | struct sirfsoc_gpio_bank *bank = irq_data_get_irq_chip_data(d); | 599 | struct sirfsoc_gpio_bank *bank = irq_data_get_irq_chip_data(d); |
| 600 | 600 | ||
| 601 | if (gpio_lock_as_irq(&bank->chip.gc, d->hwirq)) | 601 | if (gpio_lock_as_irq(&bank->chip.gc, d->hwirq % SIRFSOC_GPIO_BANK_SIZE)) |
| 602 | dev_err(bank->chip.gc.dev, | 602 | dev_err(bank->chip.gc.dev, |
| 603 | "unable to lock HW IRQ %lu for IRQ\n", | 603 | "unable to lock HW IRQ %lu for IRQ\n", |
| 604 | d->hwirq); | 604 | d->hwirq); |
| @@ -611,7 +611,7 @@ static void sirfsoc_gpio_irq_shutdown(struct irq_data *d) | |||
| 611 | struct sirfsoc_gpio_bank *bank = irq_data_get_irq_chip_data(d); | 611 | struct sirfsoc_gpio_bank *bank = irq_data_get_irq_chip_data(d); |
| 612 | 612 | ||
| 613 | sirfsoc_gpio_irq_mask(d); | 613 | sirfsoc_gpio_irq_mask(d); |
| 614 | gpio_unlock_as_irq(&bank->chip.gc, d->hwirq); | 614 | gpio_unlock_as_irq(&bank->chip.gc, d->hwirq % SIRFSOC_GPIO_BANK_SIZE); |
| 615 | } | 615 | } |
| 616 | 616 | ||
| 617 | static struct irq_chip sirfsoc_irq_chip = { | 617 | static struct irq_chip sirfsoc_irq_chip = { |
diff --git a/drivers/pwm/pwm-lp3943.c b/drivers/pwm/pwm-lp3943.c index 8a843a04c224..a40b9c34e9ff 100644 --- a/drivers/pwm/pwm-lp3943.c +++ b/drivers/pwm/pwm-lp3943.c | |||
| @@ -52,8 +52,10 @@ lp3943_pwm_request_map(struct lp3943_pwm *lp3943_pwm, int hwpwm) | |||
| 52 | offset = pwm_map->output[i]; | 52 | offset = pwm_map->output[i]; |
| 53 | 53 | ||
| 54 | /* Return an error if the pin is already assigned */ | 54 | /* Return an error if the pin is already assigned */ |
| 55 | if (test_and_set_bit(offset, &lp3943->pin_used)) | 55 | if (test_and_set_bit(offset, &lp3943->pin_used)) { |
| 56 | kfree(pwm_map); | ||
| 56 | return ERR_PTR(-EBUSY); | 57 | return ERR_PTR(-EBUSY); |
| 58 | } | ||
| 57 | } | 59 | } |
| 58 | 60 | ||
| 59 | return pwm_map; | 61 | return pwm_map; |
diff --git a/drivers/rapidio/devices/tsi721.h b/drivers/rapidio/devices/tsi721.h index b4b0d83f9ef6..7061ac0ad428 100644 --- a/drivers/rapidio/devices/tsi721.h +++ b/drivers/rapidio/devices/tsi721.h | |||
| @@ -678,6 +678,7 @@ struct tsi721_bdma_chan { | |||
| 678 | struct list_head free_list; | 678 | struct list_head free_list; |
| 679 | dma_cookie_t completed_cookie; | 679 | dma_cookie_t completed_cookie; |
| 680 | struct tasklet_struct tasklet; | 680 | struct tasklet_struct tasklet; |
| 681 | bool active; | ||
| 681 | }; | 682 | }; |
| 682 | 683 | ||
| 683 | #endif /* CONFIG_RAPIDIO_DMA_ENGINE */ | 684 | #endif /* CONFIG_RAPIDIO_DMA_ENGINE */ |
diff --git a/drivers/rapidio/devices/tsi721_dma.c b/drivers/rapidio/devices/tsi721_dma.c index 502663f5f7c6..91245f5dbe81 100644 --- a/drivers/rapidio/devices/tsi721_dma.c +++ b/drivers/rapidio/devices/tsi721_dma.c | |||
| @@ -206,8 +206,8 @@ void tsi721_bdma_handler(struct tsi721_bdma_chan *bdma_chan) | |||
| 206 | { | 206 | { |
| 207 | /* Disable BDMA channel interrupts */ | 207 | /* Disable BDMA channel interrupts */ |
| 208 | iowrite32(0, bdma_chan->regs + TSI721_DMAC_INTE); | 208 | iowrite32(0, bdma_chan->regs + TSI721_DMAC_INTE); |
| 209 | 209 | if (bdma_chan->active) | |
| 210 | tasklet_schedule(&bdma_chan->tasklet); | 210 | tasklet_schedule(&bdma_chan->tasklet); |
| 211 | } | 211 | } |
| 212 | 212 | ||
| 213 | #ifdef CONFIG_PCI_MSI | 213 | #ifdef CONFIG_PCI_MSI |
| @@ -562,7 +562,7 @@ static int tsi721_alloc_chan_resources(struct dma_chan *dchan) | |||
| 562 | } | 562 | } |
| 563 | #endif /* CONFIG_PCI_MSI */ | 563 | #endif /* CONFIG_PCI_MSI */ |
| 564 | 564 | ||
| 565 | tasklet_enable(&bdma_chan->tasklet); | 565 | bdma_chan->active = true; |
| 566 | tsi721_bdma_interrupt_enable(bdma_chan, 1); | 566 | tsi721_bdma_interrupt_enable(bdma_chan, 1); |
| 567 | 567 | ||
| 568 | return bdma_chan->bd_num - 1; | 568 | return bdma_chan->bd_num - 1; |
| @@ -576,9 +576,7 @@ err_out: | |||
| 576 | static void tsi721_free_chan_resources(struct dma_chan *dchan) | 576 | static void tsi721_free_chan_resources(struct dma_chan *dchan) |
| 577 | { | 577 | { |
| 578 | struct tsi721_bdma_chan *bdma_chan = to_tsi721_chan(dchan); | 578 | struct tsi721_bdma_chan *bdma_chan = to_tsi721_chan(dchan); |
| 579 | #ifdef CONFIG_PCI_MSI | ||
| 580 | struct tsi721_device *priv = to_tsi721(dchan->device); | 579 | struct tsi721_device *priv = to_tsi721(dchan->device); |
| 581 | #endif | ||
| 582 | LIST_HEAD(list); | 580 | LIST_HEAD(list); |
| 583 | 581 | ||
| 584 | dev_dbg(dchan->device->dev, "%s: Entry\n", __func__); | 582 | dev_dbg(dchan->device->dev, "%s: Entry\n", __func__); |
| @@ -589,14 +587,25 @@ static void tsi721_free_chan_resources(struct dma_chan *dchan) | |||
| 589 | BUG_ON(!list_empty(&bdma_chan->active_list)); | 587 | BUG_ON(!list_empty(&bdma_chan->active_list)); |
| 590 | BUG_ON(!list_empty(&bdma_chan->queue)); | 588 | BUG_ON(!list_empty(&bdma_chan->queue)); |
| 591 | 589 | ||
| 592 | tasklet_disable(&bdma_chan->tasklet); | 590 | tsi721_bdma_interrupt_enable(bdma_chan, 0); |
| 591 | bdma_chan->active = false; | ||
| 592 | |||
| 593 | #ifdef CONFIG_PCI_MSI | ||
| 594 | if (priv->flags & TSI721_USING_MSIX) { | ||
| 595 | synchronize_irq(priv->msix[TSI721_VECT_DMA0_DONE + | ||
| 596 | bdma_chan->id].vector); | ||
| 597 | synchronize_irq(priv->msix[TSI721_VECT_DMA0_INT + | ||
| 598 | bdma_chan->id].vector); | ||
| 599 | } else | ||
| 600 | #endif | ||
| 601 | synchronize_irq(priv->pdev->irq); | ||
| 602 | |||
| 603 | tasklet_kill(&bdma_chan->tasklet); | ||
| 593 | 604 | ||
| 594 | spin_lock_bh(&bdma_chan->lock); | 605 | spin_lock_bh(&bdma_chan->lock); |
| 595 | list_splice_init(&bdma_chan->free_list, &list); | 606 | list_splice_init(&bdma_chan->free_list, &list); |
| 596 | spin_unlock_bh(&bdma_chan->lock); | 607 | spin_unlock_bh(&bdma_chan->lock); |
| 597 | 608 | ||
| 598 | tsi721_bdma_interrupt_enable(bdma_chan, 0); | ||
| 599 | |||
| 600 | #ifdef CONFIG_PCI_MSI | 609 | #ifdef CONFIG_PCI_MSI |
| 601 | if (priv->flags & TSI721_USING_MSIX) { | 610 | if (priv->flags & TSI721_USING_MSIX) { |
| 602 | free_irq(priv->msix[TSI721_VECT_DMA0_DONE + | 611 | free_irq(priv->msix[TSI721_VECT_DMA0_DONE + |
| @@ -790,6 +799,7 @@ int tsi721_register_dma(struct tsi721_device *priv) | |||
| 790 | bdma_chan->dchan.cookie = 1; | 799 | bdma_chan->dchan.cookie = 1; |
| 791 | bdma_chan->dchan.chan_id = i; | 800 | bdma_chan->dchan.chan_id = i; |
| 792 | bdma_chan->id = i; | 801 | bdma_chan->id = i; |
| 802 | bdma_chan->active = false; | ||
| 793 | 803 | ||
| 794 | spin_lock_init(&bdma_chan->lock); | 804 | spin_lock_init(&bdma_chan->lock); |
| 795 | 805 | ||
| @@ -799,7 +809,6 @@ int tsi721_register_dma(struct tsi721_device *priv) | |||
| 799 | 809 | ||
| 800 | tasklet_init(&bdma_chan->tasklet, tsi721_dma_tasklet, | 810 | tasklet_init(&bdma_chan->tasklet, tsi721_dma_tasklet, |
| 801 | (unsigned long)bdma_chan); | 811 | (unsigned long)bdma_chan); |
| 802 | tasklet_disable(&bdma_chan->tasklet); | ||
| 803 | list_add_tail(&bdma_chan->dchan.device_node, | 812 | list_add_tail(&bdma_chan->dchan.device_node, |
| 804 | &mport->dma.channels); | 813 | &mport->dma.channels); |
| 805 | } | 814 | } |
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index d1ac4caaf1b0..afca1bc24f26 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c | |||
| @@ -953,6 +953,8 @@ static int machine_constraints_current(struct regulator_dev *rdev, | |||
| 953 | return 0; | 953 | return 0; |
| 954 | } | 954 | } |
| 955 | 955 | ||
| 956 | static int _regulator_do_enable(struct regulator_dev *rdev); | ||
| 957 | |||
| 956 | /** | 958 | /** |
| 957 | * set_machine_constraints - sets regulator constraints | 959 | * set_machine_constraints - sets regulator constraints |
| 958 | * @rdev: regulator source | 960 | * @rdev: regulator source |
| @@ -1013,10 +1015,9 @@ static int set_machine_constraints(struct regulator_dev *rdev, | |||
| 1013 | /* If the constraints say the regulator should be on at this point | 1015 | /* If the constraints say the regulator should be on at this point |
| 1014 | * and we have control then make sure it is enabled. | 1016 | * and we have control then make sure it is enabled. |
| 1015 | */ | 1017 | */ |
| 1016 | if ((rdev->constraints->always_on || rdev->constraints->boot_on) && | 1018 | if (rdev->constraints->always_on || rdev->constraints->boot_on) { |
| 1017 | ops->enable) { | 1019 | ret = _regulator_do_enable(rdev); |
| 1018 | ret = ops->enable(rdev); | 1020 | if (ret < 0 && ret != -EINVAL) { |
| 1019 | if (ret < 0) { | ||
| 1020 | rdev_err(rdev, "failed to enable\n"); | 1021 | rdev_err(rdev, "failed to enable\n"); |
| 1021 | goto out; | 1022 | goto out; |
| 1022 | } | 1023 | } |
| @@ -1907,8 +1908,6 @@ static int _regulator_do_disable(struct regulator_dev *rdev) | |||
| 1907 | 1908 | ||
| 1908 | trace_regulator_disable_complete(rdev_get_name(rdev)); | 1909 | trace_regulator_disable_complete(rdev_get_name(rdev)); |
| 1909 | 1910 | ||
| 1910 | _notifier_call_chain(rdev, REGULATOR_EVENT_DISABLE, | ||
| 1911 | NULL); | ||
| 1912 | return 0; | 1911 | return 0; |
| 1913 | } | 1912 | } |
| 1914 | 1913 | ||
| @@ -1932,6 +1931,8 @@ static int _regulator_disable(struct regulator_dev *rdev) | |||
| 1932 | rdev_err(rdev, "failed to disable\n"); | 1931 | rdev_err(rdev, "failed to disable\n"); |
| 1933 | return ret; | 1932 | return ret; |
| 1934 | } | 1933 | } |
| 1934 | _notifier_call_chain(rdev, REGULATOR_EVENT_DISABLE, | ||
| 1935 | NULL); | ||
| 1935 | } | 1936 | } |
| 1936 | 1937 | ||
| 1937 | rdev->use_count = 0; | 1938 | rdev->use_count = 0; |
| @@ -1984,20 +1985,16 @@ static int _regulator_force_disable(struct regulator_dev *rdev) | |||
| 1984 | { | 1985 | { |
| 1985 | int ret = 0; | 1986 | int ret = 0; |
| 1986 | 1987 | ||
| 1987 | /* force disable */ | 1988 | ret = _regulator_do_disable(rdev); |
| 1988 | if (rdev->desc->ops->disable) { | 1989 | if (ret < 0) { |
| 1989 | /* ah well, who wants to live forever... */ | 1990 | rdev_err(rdev, "failed to force disable\n"); |
| 1990 | ret = rdev->desc->ops->disable(rdev); | 1991 | return ret; |
| 1991 | if (ret < 0) { | ||
| 1992 | rdev_err(rdev, "failed to force disable\n"); | ||
| 1993 | return ret; | ||
| 1994 | } | ||
| 1995 | /* notify other consumers that power has been forced off */ | ||
| 1996 | _notifier_call_chain(rdev, REGULATOR_EVENT_FORCE_DISABLE | | ||
| 1997 | REGULATOR_EVENT_DISABLE, NULL); | ||
| 1998 | } | 1992 | } |
| 1999 | 1993 | ||
| 2000 | return ret; | 1994 | _notifier_call_chain(rdev, REGULATOR_EVENT_FORCE_DISABLE | |
| 1995 | REGULATOR_EVENT_DISABLE, NULL); | ||
| 1996 | |||
| 1997 | return 0; | ||
| 2001 | } | 1998 | } |
| 2002 | 1999 | ||
| 2003 | /** | 2000 | /** |
| @@ -3630,23 +3627,18 @@ int regulator_suspend_finish(void) | |||
| 3630 | 3627 | ||
| 3631 | mutex_lock(®ulator_list_mutex); | 3628 | mutex_lock(®ulator_list_mutex); |
| 3632 | list_for_each_entry(rdev, ®ulator_list, list) { | 3629 | list_for_each_entry(rdev, ®ulator_list, list) { |
| 3633 | struct regulator_ops *ops = rdev->desc->ops; | ||
| 3634 | |||
| 3635 | mutex_lock(&rdev->mutex); | 3630 | mutex_lock(&rdev->mutex); |
| 3636 | if ((rdev->use_count > 0 || rdev->constraints->always_on) && | 3631 | if (rdev->use_count > 0 || rdev->constraints->always_on) { |
| 3637 | ops->enable) { | 3632 | error = _regulator_do_enable(rdev); |
| 3638 | error = ops->enable(rdev); | ||
| 3639 | if (error) | 3633 | if (error) |
| 3640 | ret = error; | 3634 | ret = error; |
| 3641 | } else { | 3635 | } else { |
| 3642 | if (!have_full_constraints()) | 3636 | if (!have_full_constraints()) |
| 3643 | goto unlock; | 3637 | goto unlock; |
| 3644 | if (!ops->disable) | ||
| 3645 | goto unlock; | ||
| 3646 | if (!_regulator_is_enabled(rdev)) | 3638 | if (!_regulator_is_enabled(rdev)) |
| 3647 | goto unlock; | 3639 | goto unlock; |
| 3648 | 3640 | ||
| 3649 | error = ops->disable(rdev); | 3641 | error = _regulator_do_disable(rdev); |
| 3650 | if (error) | 3642 | if (error) |
| 3651 | ret = error; | 3643 | ret = error; |
| 3652 | } | 3644 | } |
| @@ -3820,7 +3812,7 @@ static int __init regulator_init_complete(void) | |||
| 3820 | ops = rdev->desc->ops; | 3812 | ops = rdev->desc->ops; |
| 3821 | c = rdev->constraints; | 3813 | c = rdev->constraints; |
| 3822 | 3814 | ||
| 3823 | if (!ops->disable || (c && c->always_on)) | 3815 | if (c && c->always_on) |
| 3824 | continue; | 3816 | continue; |
| 3825 | 3817 | ||
| 3826 | mutex_lock(&rdev->mutex); | 3818 | mutex_lock(&rdev->mutex); |
| @@ -3841,7 +3833,7 @@ static int __init regulator_init_complete(void) | |||
| 3841 | /* We log since this may kill the system if it | 3833 | /* We log since this may kill the system if it |
| 3842 | * goes wrong. */ | 3834 | * goes wrong. */ |
| 3843 | rdev_info(rdev, "disabling\n"); | 3835 | rdev_info(rdev, "disabling\n"); |
| 3844 | ret = ops->disable(rdev); | 3836 | ret = _regulator_do_disable(rdev); |
| 3845 | if (ret != 0) | 3837 | if (ret != 0) |
| 3846 | rdev_err(rdev, "couldn't disable: %d\n", ret); | 3838 | rdev_err(rdev, "couldn't disable: %d\n", ret); |
| 3847 | } else { | 3839 | } else { |
diff --git a/drivers/rtc/rtc-s3c.c b/drivers/rtc/rtc-s3c.c index 7afd373b9595..c4cde9c08f1f 100644 --- a/drivers/rtc/rtc-s3c.c +++ b/drivers/rtc/rtc-s3c.c | |||
| @@ -580,10 +580,12 @@ static int s3c_rtc_suspend(struct device *dev) | |||
| 580 | 580 | ||
| 581 | clk_enable(rtc_clk); | 581 | clk_enable(rtc_clk); |
| 582 | /* save TICNT for anyone using periodic interrupts */ | 582 | /* save TICNT for anyone using periodic interrupts */ |
| 583 | ticnt_save = readb(s3c_rtc_base + S3C2410_TICNT); | ||
| 584 | if (s3c_rtc_cpu_type == TYPE_S3C64XX) { | 583 | if (s3c_rtc_cpu_type == TYPE_S3C64XX) { |
| 585 | ticnt_en_save = readw(s3c_rtc_base + S3C2410_RTCCON); | 584 | ticnt_en_save = readw(s3c_rtc_base + S3C2410_RTCCON); |
| 586 | ticnt_en_save &= S3C64XX_RTCCON_TICEN; | 585 | ticnt_en_save &= S3C64XX_RTCCON_TICEN; |
| 586 | ticnt_save = readl(s3c_rtc_base + S3C2410_TICNT); | ||
| 587 | } else { | ||
| 588 | ticnt_save = readb(s3c_rtc_base + S3C2410_TICNT); | ||
| 587 | } | 589 | } |
| 588 | s3c_rtc_enable(pdev, 0); | 590 | s3c_rtc_enable(pdev, 0); |
| 589 | 591 | ||
| @@ -605,10 +607,15 @@ static int s3c_rtc_resume(struct device *dev) | |||
| 605 | 607 | ||
| 606 | clk_enable(rtc_clk); | 608 | clk_enable(rtc_clk); |
| 607 | s3c_rtc_enable(pdev, 1); | 609 | s3c_rtc_enable(pdev, 1); |
| 608 | writeb(ticnt_save, s3c_rtc_base + S3C2410_TICNT); | 610 | if (s3c_rtc_cpu_type == TYPE_S3C64XX) { |
| 609 | if (s3c_rtc_cpu_type == TYPE_S3C64XX && ticnt_en_save) { | 611 | writel(ticnt_save, s3c_rtc_base + S3C2410_TICNT); |
| 610 | tmp = readw(s3c_rtc_base + S3C2410_RTCCON); | 612 | if (ticnt_en_save) { |
| 611 | writew(tmp | ticnt_en_save, s3c_rtc_base + S3C2410_RTCCON); | 613 | tmp = readw(s3c_rtc_base + S3C2410_RTCCON); |
| 614 | writew(tmp | ticnt_en_save, | ||
| 615 | s3c_rtc_base + S3C2410_RTCCON); | ||
| 616 | } | ||
| 617 | } else { | ||
| 618 | writeb(ticnt_save, s3c_rtc_base + S3C2410_TICNT); | ||
| 612 | } | 619 | } |
| 613 | 620 | ||
| 614 | if (device_may_wakeup(dev) && wake_en) { | 621 | if (device_may_wakeup(dev) && wake_en) { |
diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c index c3a83df07894..795ed61a5496 100644 --- a/drivers/s390/net/qeth_core_main.c +++ b/drivers/s390/net/qeth_core_main.c | |||
| @@ -1660,7 +1660,6 @@ int qeth_qdio_clear_card(struct qeth_card *card, int use_halt) | |||
| 1660 | QDIO_FLAG_CLEANUP_USING_CLEAR); | 1660 | QDIO_FLAG_CLEANUP_USING_CLEAR); |
| 1661 | if (rc) | 1661 | if (rc) |
| 1662 | QETH_CARD_TEXT_(card, 3, "1err%d", rc); | 1662 | QETH_CARD_TEXT_(card, 3, "1err%d", rc); |
| 1663 | qdio_free(CARD_DDEV(card)); | ||
| 1664 | atomic_set(&card->qdio.state, QETH_QDIO_ALLOCATED); | 1663 | atomic_set(&card->qdio.state, QETH_QDIO_ALLOCATED); |
| 1665 | break; | 1664 | break; |
| 1666 | case QETH_QDIO_CLEANING: | 1665 | case QETH_QDIO_CLEANING: |
| @@ -2605,6 +2604,7 @@ static int qeth_mpc_initialize(struct qeth_card *card) | |||
| 2605 | return 0; | 2604 | return 0; |
| 2606 | out_qdio: | 2605 | out_qdio: |
| 2607 | qeth_qdio_clear_card(card, card->info.type != QETH_CARD_TYPE_IQD); | 2606 | qeth_qdio_clear_card(card, card->info.type != QETH_CARD_TYPE_IQD); |
| 2607 | qdio_free(CARD_DDEV(card)); | ||
| 2608 | return rc; | 2608 | return rc; |
| 2609 | } | 2609 | } |
| 2610 | 2610 | ||
| @@ -4906,9 +4906,11 @@ retry: | |||
| 4906 | if (retries < 3) | 4906 | if (retries < 3) |
| 4907 | QETH_DBF_MESSAGE(2, "%s Retrying to do IDX activates.\n", | 4907 | QETH_DBF_MESSAGE(2, "%s Retrying to do IDX activates.\n", |
| 4908 | dev_name(&card->gdev->dev)); | 4908 | dev_name(&card->gdev->dev)); |
| 4909 | rc = qeth_qdio_clear_card(card, card->info.type != QETH_CARD_TYPE_IQD); | ||
| 4909 | ccw_device_set_offline(CARD_DDEV(card)); | 4910 | ccw_device_set_offline(CARD_DDEV(card)); |
| 4910 | ccw_device_set_offline(CARD_WDEV(card)); | 4911 | ccw_device_set_offline(CARD_WDEV(card)); |
| 4911 | ccw_device_set_offline(CARD_RDEV(card)); | 4912 | ccw_device_set_offline(CARD_RDEV(card)); |
| 4913 | qdio_free(CARD_DDEV(card)); | ||
| 4912 | rc = ccw_device_set_online(CARD_RDEV(card)); | 4914 | rc = ccw_device_set_online(CARD_RDEV(card)); |
| 4913 | if (rc) | 4915 | if (rc) |
| 4914 | goto retriable; | 4916 | goto retriable; |
| @@ -4918,7 +4920,6 @@ retry: | |||
| 4918 | rc = ccw_device_set_online(CARD_DDEV(card)); | 4920 | rc = ccw_device_set_online(CARD_DDEV(card)); |
| 4919 | if (rc) | 4921 | if (rc) |
| 4920 | goto retriable; | 4922 | goto retriable; |
| 4921 | rc = qeth_qdio_clear_card(card, card->info.type != QETH_CARD_TYPE_IQD); | ||
| 4922 | retriable: | 4923 | retriable: |
| 4923 | if (rc == -ERESTARTSYS) { | 4924 | if (rc == -ERESTARTSYS) { |
| 4924 | QETH_DBF_TEXT(SETUP, 2, "break1"); | 4925 | QETH_DBF_TEXT(SETUP, 2, "break1"); |
diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c index 0710550093ce..908d82529ee9 100644 --- a/drivers/s390/net/qeth_l2_main.c +++ b/drivers/s390/net/qeth_l2_main.c | |||
| @@ -1091,6 +1091,7 @@ out_remove: | |||
| 1091 | ccw_device_set_offline(CARD_DDEV(card)); | 1091 | ccw_device_set_offline(CARD_DDEV(card)); |
| 1092 | ccw_device_set_offline(CARD_WDEV(card)); | 1092 | ccw_device_set_offline(CARD_WDEV(card)); |
| 1093 | ccw_device_set_offline(CARD_RDEV(card)); | 1093 | ccw_device_set_offline(CARD_RDEV(card)); |
| 1094 | qdio_free(CARD_DDEV(card)); | ||
| 1094 | if (recover_flag == CARD_STATE_RECOVER) | 1095 | if (recover_flag == CARD_STATE_RECOVER) |
| 1095 | card->state = CARD_STATE_RECOVER; | 1096 | card->state = CARD_STATE_RECOVER; |
| 1096 | else | 1097 | else |
| @@ -1132,6 +1133,7 @@ static int __qeth_l2_set_offline(struct ccwgroup_device *cgdev, | |||
| 1132 | rc = (rc2) ? rc2 : rc3; | 1133 | rc = (rc2) ? rc2 : rc3; |
| 1133 | if (rc) | 1134 | if (rc) |
| 1134 | QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc); | 1135 | QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc); |
| 1136 | qdio_free(CARD_DDEV(card)); | ||
| 1135 | if (recover_flag == CARD_STATE_UP) | 1137 | if (recover_flag == CARD_STATE_UP) |
| 1136 | card->state = CARD_STATE_RECOVER; | 1138 | card->state = CARD_STATE_RECOVER; |
| 1137 | /* let user_space know that device is offline */ | 1139 | /* let user_space know that device is offline */ |
| @@ -1194,6 +1196,7 @@ static void qeth_l2_shutdown(struct ccwgroup_device *gdev) | |||
| 1194 | qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM); | 1196 | qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM); |
| 1195 | qeth_qdio_clear_card(card, 0); | 1197 | qeth_qdio_clear_card(card, 0); |
| 1196 | qeth_clear_qdio_buffers(card); | 1198 | qeth_clear_qdio_buffers(card); |
| 1199 | qdio_free(CARD_DDEV(card)); | ||
| 1197 | } | 1200 | } |
| 1198 | 1201 | ||
| 1199 | static int qeth_l2_pm_suspend(struct ccwgroup_device *gdev) | 1202 | static int qeth_l2_pm_suspend(struct ccwgroup_device *gdev) |
diff --git a/drivers/s390/net/qeth_l3_main.c b/drivers/s390/net/qeth_l3_main.c index 0f430424c3b8..3524d34ff694 100644 --- a/drivers/s390/net/qeth_l3_main.c +++ b/drivers/s390/net/qeth_l3_main.c | |||
| @@ -3447,6 +3447,7 @@ out_remove: | |||
| 3447 | ccw_device_set_offline(CARD_DDEV(card)); | 3447 | ccw_device_set_offline(CARD_DDEV(card)); |
| 3448 | ccw_device_set_offline(CARD_WDEV(card)); | 3448 | ccw_device_set_offline(CARD_WDEV(card)); |
| 3449 | ccw_device_set_offline(CARD_RDEV(card)); | 3449 | ccw_device_set_offline(CARD_RDEV(card)); |
| 3450 | qdio_free(CARD_DDEV(card)); | ||
| 3450 | if (recover_flag == CARD_STATE_RECOVER) | 3451 | if (recover_flag == CARD_STATE_RECOVER) |
| 3451 | card->state = CARD_STATE_RECOVER; | 3452 | card->state = CARD_STATE_RECOVER; |
| 3452 | else | 3453 | else |
| @@ -3493,6 +3494,7 @@ static int __qeth_l3_set_offline(struct ccwgroup_device *cgdev, | |||
| 3493 | rc = (rc2) ? rc2 : rc3; | 3494 | rc = (rc2) ? rc2 : rc3; |
| 3494 | if (rc) | 3495 | if (rc) |
| 3495 | QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc); | 3496 | QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc); |
| 3497 | qdio_free(CARD_DDEV(card)); | ||
| 3496 | if (recover_flag == CARD_STATE_UP) | 3498 | if (recover_flag == CARD_STATE_UP) |
| 3497 | card->state = CARD_STATE_RECOVER; | 3499 | card->state = CARD_STATE_RECOVER; |
| 3498 | /* let user_space know that device is offline */ | 3500 | /* let user_space know that device is offline */ |
| @@ -3545,6 +3547,7 @@ static void qeth_l3_shutdown(struct ccwgroup_device *gdev) | |||
| 3545 | qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM); | 3547 | qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM); |
| 3546 | qeth_qdio_clear_card(card, 0); | 3548 | qeth_qdio_clear_card(card, 0); |
| 3547 | qeth_clear_qdio_buffers(card); | 3549 | qeth_clear_qdio_buffers(card); |
| 3550 | qdio_free(CARD_DDEV(card)); | ||
| 3548 | } | 3551 | } |
| 3549 | 3552 | ||
| 3550 | static int qeth_l3_pm_suspend(struct ccwgroup_device *gdev) | 3553 | static int qeth_l3_pm_suspend(struct ccwgroup_device *gdev) |
diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c index 2eb97d7e8d12..0cb73074c199 100644 --- a/drivers/scsi/qla2xxx/qla_target.c +++ b/drivers/scsi/qla2xxx/qla_target.c | |||
| @@ -790,17 +790,32 @@ static inline int test_tgt_sess_count(struct qla_tgt *tgt) | |||
| 790 | } | 790 | } |
| 791 | 791 | ||
| 792 | /* Called by tcm_qla2xxx configfs code */ | 792 | /* Called by tcm_qla2xxx configfs code */ |
| 793 | void qlt_stop_phase1(struct qla_tgt *tgt) | 793 | int qlt_stop_phase1(struct qla_tgt *tgt) |
| 794 | { | 794 | { |
| 795 | struct scsi_qla_host *vha = tgt->vha; | 795 | struct scsi_qla_host *vha = tgt->vha; |
| 796 | struct qla_hw_data *ha = tgt->ha; | 796 | struct qla_hw_data *ha = tgt->ha; |
| 797 | unsigned long flags; | 797 | unsigned long flags; |
| 798 | 798 | ||
| 799 | mutex_lock(&qla_tgt_mutex); | ||
| 800 | if (!vha->fc_vport) { | ||
| 801 | struct Scsi_Host *sh = vha->host; | ||
| 802 | struct fc_host_attrs *fc_host = shost_to_fc_host(sh); | ||
| 803 | bool npiv_vports; | ||
| 804 | |||
| 805 | spin_lock_irqsave(sh->host_lock, flags); | ||
| 806 | npiv_vports = (fc_host->npiv_vports_inuse); | ||
| 807 | spin_unlock_irqrestore(sh->host_lock, flags); | ||
| 808 | |||
| 809 | if (npiv_vports) { | ||
| 810 | mutex_unlock(&qla_tgt_mutex); | ||
| 811 | return -EPERM; | ||
| 812 | } | ||
| 813 | } | ||
| 799 | if (tgt->tgt_stop || tgt->tgt_stopped) { | 814 | if (tgt->tgt_stop || tgt->tgt_stopped) { |
| 800 | ql_dbg(ql_dbg_tgt_mgt, vha, 0xf04e, | 815 | ql_dbg(ql_dbg_tgt_mgt, vha, 0xf04e, |
| 801 | "Already in tgt->tgt_stop or tgt_stopped state\n"); | 816 | "Already in tgt->tgt_stop or tgt_stopped state\n"); |
| 802 | dump_stack(); | 817 | mutex_unlock(&qla_tgt_mutex); |
| 803 | return; | 818 | return -EPERM; |
| 804 | } | 819 | } |
| 805 | 820 | ||
| 806 | ql_dbg(ql_dbg_tgt, vha, 0xe003, "Stopping target for host %ld(%p)\n", | 821 | ql_dbg(ql_dbg_tgt, vha, 0xe003, "Stopping target for host %ld(%p)\n", |
| @@ -815,6 +830,7 @@ void qlt_stop_phase1(struct qla_tgt *tgt) | |||
| 815 | qlt_clear_tgt_db(tgt, true); | 830 | qlt_clear_tgt_db(tgt, true); |
| 816 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | 831 | spin_unlock_irqrestore(&ha->hardware_lock, flags); |
| 817 | mutex_unlock(&vha->vha_tgt.tgt_mutex); | 832 | mutex_unlock(&vha->vha_tgt.tgt_mutex); |
| 833 | mutex_unlock(&qla_tgt_mutex); | ||
| 818 | 834 | ||
| 819 | flush_delayed_work(&tgt->sess_del_work); | 835 | flush_delayed_work(&tgt->sess_del_work); |
| 820 | 836 | ||
| @@ -841,6 +857,7 @@ void qlt_stop_phase1(struct qla_tgt *tgt) | |||
| 841 | 857 | ||
| 842 | /* Wait for sessions to clear out (just in case) */ | 858 | /* Wait for sessions to clear out (just in case) */ |
| 843 | wait_event(tgt->waitQ, test_tgt_sess_count(tgt)); | 859 | wait_event(tgt->waitQ, test_tgt_sess_count(tgt)); |
| 860 | return 0; | ||
| 844 | } | 861 | } |
| 845 | EXPORT_SYMBOL(qlt_stop_phase1); | 862 | EXPORT_SYMBOL(qlt_stop_phase1); |
| 846 | 863 | ||
| @@ -3185,7 +3202,8 @@ restart: | |||
| 3185 | ql_dbg(ql_dbg_tgt_mgt, vha, 0xf02c, | 3202 | ql_dbg(ql_dbg_tgt_mgt, vha, 0xf02c, |
| 3186 | "SRR cmd %p (se_cmd %p, tag %d, op %x), " | 3203 | "SRR cmd %p (se_cmd %p, tag %d, op %x), " |
| 3187 | "sg_cnt=%d, offset=%d", cmd, &cmd->se_cmd, cmd->tag, | 3204 | "sg_cnt=%d, offset=%d", cmd, &cmd->se_cmd, cmd->tag, |
| 3188 | se_cmd->t_task_cdb[0], cmd->sg_cnt, cmd->offset); | 3205 | se_cmd->t_task_cdb ? se_cmd->t_task_cdb[0] : 0, |
| 3206 | cmd->sg_cnt, cmd->offset); | ||
| 3189 | 3207 | ||
| 3190 | qlt_handle_srr(vha, sctio, imm); | 3208 | qlt_handle_srr(vha, sctio, imm); |
| 3191 | 3209 | ||
| @@ -4181,6 +4199,9 @@ int qlt_add_target(struct qla_hw_data *ha, struct scsi_qla_host *base_vha) | |||
| 4181 | tgt->datasegs_per_cmd = QLA_TGT_DATASEGS_PER_CMD_24XX; | 4199 | tgt->datasegs_per_cmd = QLA_TGT_DATASEGS_PER_CMD_24XX; |
| 4182 | tgt->datasegs_per_cont = QLA_TGT_DATASEGS_PER_CONT_24XX; | 4200 | tgt->datasegs_per_cont = QLA_TGT_DATASEGS_PER_CONT_24XX; |
| 4183 | 4201 | ||
| 4202 | if (base_vha->fc_vport) | ||
| 4203 | return 0; | ||
| 4204 | |||
| 4184 | mutex_lock(&qla_tgt_mutex); | 4205 | mutex_lock(&qla_tgt_mutex); |
| 4185 | list_add_tail(&tgt->tgt_list_entry, &qla_tgt_glist); | 4206 | list_add_tail(&tgt->tgt_list_entry, &qla_tgt_glist); |
| 4186 | mutex_unlock(&qla_tgt_mutex); | 4207 | mutex_unlock(&qla_tgt_mutex); |
| @@ -4194,6 +4215,10 @@ int qlt_remove_target(struct qla_hw_data *ha, struct scsi_qla_host *vha) | |||
| 4194 | if (!vha->vha_tgt.qla_tgt) | 4215 | if (!vha->vha_tgt.qla_tgt) |
| 4195 | return 0; | 4216 | return 0; |
| 4196 | 4217 | ||
| 4218 | if (vha->fc_vport) { | ||
| 4219 | qlt_release(vha->vha_tgt.qla_tgt); | ||
| 4220 | return 0; | ||
| 4221 | } | ||
| 4197 | mutex_lock(&qla_tgt_mutex); | 4222 | mutex_lock(&qla_tgt_mutex); |
| 4198 | list_del(&vha->vha_tgt.qla_tgt->tgt_list_entry); | 4223 | list_del(&vha->vha_tgt.qla_tgt->tgt_list_entry); |
| 4199 | mutex_unlock(&qla_tgt_mutex); | 4224 | mutex_unlock(&qla_tgt_mutex); |
| @@ -4265,6 +4290,12 @@ int qlt_lport_register(void *target_lport_ptr, u64 phys_wwpn, | |||
| 4265 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | 4290 | spin_unlock_irqrestore(&ha->hardware_lock, flags); |
| 4266 | continue; | 4291 | continue; |
| 4267 | } | 4292 | } |
| 4293 | if (tgt->tgt_stop) { | ||
| 4294 | pr_debug("MODE_TARGET in shutdown on qla2xxx(%d)\n", | ||
| 4295 | host->host_no); | ||
| 4296 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | ||
| 4297 | continue; | ||
| 4298 | } | ||
| 4268 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | 4299 | spin_unlock_irqrestore(&ha->hardware_lock, flags); |
| 4269 | 4300 | ||
| 4270 | if (!scsi_host_get(host)) { | 4301 | if (!scsi_host_get(host)) { |
| @@ -4279,12 +4310,11 @@ int qlt_lport_register(void *target_lport_ptr, u64 phys_wwpn, | |||
| 4279 | scsi_host_put(host); | 4310 | scsi_host_put(host); |
| 4280 | continue; | 4311 | continue; |
| 4281 | } | 4312 | } |
| 4282 | mutex_unlock(&qla_tgt_mutex); | ||
| 4283 | |||
| 4284 | rc = (*callback)(vha, target_lport_ptr, npiv_wwpn, npiv_wwnn); | 4313 | rc = (*callback)(vha, target_lport_ptr, npiv_wwpn, npiv_wwnn); |
| 4285 | if (rc != 0) | 4314 | if (rc != 0) |
| 4286 | scsi_host_put(host); | 4315 | scsi_host_put(host); |
| 4287 | 4316 | ||
| 4317 | mutex_unlock(&qla_tgt_mutex); | ||
| 4288 | return rc; | 4318 | return rc; |
| 4289 | } | 4319 | } |
| 4290 | mutex_unlock(&qla_tgt_mutex); | 4320 | mutex_unlock(&qla_tgt_mutex); |
diff --git a/drivers/scsi/qla2xxx/qla_target.h b/drivers/scsi/qla2xxx/qla_target.h index 66e755cdde57..ce33d8c26406 100644 --- a/drivers/scsi/qla2xxx/qla_target.h +++ b/drivers/scsi/qla2xxx/qla_target.h | |||
| @@ -1001,7 +1001,7 @@ extern void qlt_modify_vp_config(struct scsi_qla_host *, | |||
| 1001 | extern void qlt_probe_one_stage1(struct scsi_qla_host *, struct qla_hw_data *); | 1001 | extern void qlt_probe_one_stage1(struct scsi_qla_host *, struct qla_hw_data *); |
| 1002 | extern int qlt_mem_alloc(struct qla_hw_data *); | 1002 | extern int qlt_mem_alloc(struct qla_hw_data *); |
| 1003 | extern void qlt_mem_free(struct qla_hw_data *); | 1003 | extern void qlt_mem_free(struct qla_hw_data *); |
| 1004 | extern void qlt_stop_phase1(struct qla_tgt *); | 1004 | extern int qlt_stop_phase1(struct qla_tgt *); |
| 1005 | extern void qlt_stop_phase2(struct qla_tgt *); | 1005 | extern void qlt_stop_phase2(struct qla_tgt *); |
| 1006 | extern irqreturn_t qla83xx_msix_atio_q(int, void *); | 1006 | extern irqreturn_t qla83xx_msix_atio_q(int, void *); |
| 1007 | extern void qlt_83xx_iospace_config(struct qla_hw_data *); | 1007 | extern void qlt_83xx_iospace_config(struct qla_hw_data *); |
diff --git a/drivers/scsi/qla2xxx/tcm_qla2xxx.c b/drivers/scsi/qla2xxx/tcm_qla2xxx.c index 75a141bbe74d..788c4fe2b0c9 100644 --- a/drivers/scsi/qla2xxx/tcm_qla2xxx.c +++ b/drivers/scsi/qla2xxx/tcm_qla2xxx.c | |||
| @@ -182,20 +182,6 @@ static int tcm_qla2xxx_npiv_parse_wwn( | |||
| 182 | return 0; | 182 | return 0; |
| 183 | } | 183 | } |
| 184 | 184 | ||
| 185 | static ssize_t tcm_qla2xxx_npiv_format_wwn(char *buf, size_t len, | ||
| 186 | u64 wwpn, u64 wwnn) | ||
| 187 | { | ||
| 188 | u8 b[8], b2[8]; | ||
| 189 | |||
| 190 | put_unaligned_be64(wwpn, b); | ||
| 191 | put_unaligned_be64(wwnn, b2); | ||
| 192 | return snprintf(buf, len, | ||
| 193 | "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x," | ||
| 194 | "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x", | ||
| 195 | b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7], | ||
| 196 | b2[0], b2[1], b2[2], b2[3], b2[4], b2[5], b2[6], b2[7]); | ||
| 197 | } | ||
| 198 | |||
| 199 | static char *tcm_qla2xxx_npiv_get_fabric_name(void) | 185 | static char *tcm_qla2xxx_npiv_get_fabric_name(void) |
| 200 | { | 186 | { |
| 201 | return "qla2xxx_npiv"; | 187 | return "qla2xxx_npiv"; |
| @@ -227,15 +213,6 @@ static char *tcm_qla2xxx_get_fabric_wwn(struct se_portal_group *se_tpg) | |||
| 227 | return lport->lport_naa_name; | 213 | return lport->lport_naa_name; |
| 228 | } | 214 | } |
| 229 | 215 | ||
| 230 | static char *tcm_qla2xxx_npiv_get_fabric_wwn(struct se_portal_group *se_tpg) | ||
| 231 | { | ||
| 232 | struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg, | ||
| 233 | struct tcm_qla2xxx_tpg, se_tpg); | ||
| 234 | struct tcm_qla2xxx_lport *lport = tpg->lport; | ||
| 235 | |||
| 236 | return &lport->lport_npiv_name[0]; | ||
| 237 | } | ||
| 238 | |||
| 239 | static u16 tcm_qla2xxx_get_tag(struct se_portal_group *se_tpg) | 216 | static u16 tcm_qla2xxx_get_tag(struct se_portal_group *se_tpg) |
| 240 | { | 217 | { |
| 241 | struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg, | 218 | struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg, |
| @@ -941,15 +918,41 @@ static ssize_t tcm_qla2xxx_tpg_show_enable( | |||
| 941 | atomic_read(&tpg->lport_tpg_enabled)); | 918 | atomic_read(&tpg->lport_tpg_enabled)); |
| 942 | } | 919 | } |
| 943 | 920 | ||
| 921 | static void tcm_qla2xxx_depend_tpg(struct work_struct *work) | ||
| 922 | { | ||
| 923 | struct tcm_qla2xxx_tpg *base_tpg = container_of(work, | ||
| 924 | struct tcm_qla2xxx_tpg, tpg_base_work); | ||
| 925 | struct se_portal_group *se_tpg = &base_tpg->se_tpg; | ||
| 926 | struct scsi_qla_host *base_vha = base_tpg->lport->qla_vha; | ||
| 927 | |||
| 928 | if (!configfs_depend_item(se_tpg->se_tpg_tfo->tf_subsys, | ||
| 929 | &se_tpg->tpg_group.cg_item)) { | ||
| 930 | atomic_set(&base_tpg->lport_tpg_enabled, 1); | ||
| 931 | qlt_enable_vha(base_vha); | ||
| 932 | } | ||
| 933 | complete(&base_tpg->tpg_base_comp); | ||
| 934 | } | ||
| 935 | |||
| 936 | static void tcm_qla2xxx_undepend_tpg(struct work_struct *work) | ||
| 937 | { | ||
| 938 | struct tcm_qla2xxx_tpg *base_tpg = container_of(work, | ||
| 939 | struct tcm_qla2xxx_tpg, tpg_base_work); | ||
| 940 | struct se_portal_group *se_tpg = &base_tpg->se_tpg; | ||
| 941 | struct scsi_qla_host *base_vha = base_tpg->lport->qla_vha; | ||
| 942 | |||
| 943 | if (!qlt_stop_phase1(base_vha->vha_tgt.qla_tgt)) { | ||
| 944 | atomic_set(&base_tpg->lport_tpg_enabled, 0); | ||
| 945 | configfs_undepend_item(se_tpg->se_tpg_tfo->tf_subsys, | ||
| 946 | &se_tpg->tpg_group.cg_item); | ||
| 947 | } | ||
| 948 | complete(&base_tpg->tpg_base_comp); | ||
| 949 | } | ||
| 950 | |||
| 944 | static ssize_t tcm_qla2xxx_tpg_store_enable( | 951 | static ssize_t tcm_qla2xxx_tpg_store_enable( |
| 945 | struct se_portal_group *se_tpg, | 952 | struct se_portal_group *se_tpg, |
| 946 | const char *page, | 953 | const char *page, |
| 947 | size_t count) | 954 | size_t count) |
| 948 | { | 955 | { |
| 949 | struct se_wwn *se_wwn = se_tpg->se_tpg_wwn; | ||
| 950 | struct tcm_qla2xxx_lport *lport = container_of(se_wwn, | ||
| 951 | struct tcm_qla2xxx_lport, lport_wwn); | ||
| 952 | struct scsi_qla_host *vha = lport->qla_vha; | ||
| 953 | struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg, | 956 | struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg, |
| 954 | struct tcm_qla2xxx_tpg, se_tpg); | 957 | struct tcm_qla2xxx_tpg, se_tpg); |
| 955 | unsigned long op; | 958 | unsigned long op; |
| @@ -964,19 +967,28 @@ static ssize_t tcm_qla2xxx_tpg_store_enable( | |||
| 964 | pr_err("Illegal value for tpg_enable: %lu\n", op); | 967 | pr_err("Illegal value for tpg_enable: %lu\n", op); |
| 965 | return -EINVAL; | 968 | return -EINVAL; |
| 966 | } | 969 | } |
| 967 | |||
| 968 | if (op) { | 970 | if (op) { |
| 969 | atomic_set(&tpg->lport_tpg_enabled, 1); | 971 | if (atomic_read(&tpg->lport_tpg_enabled)) |
| 970 | qlt_enable_vha(vha); | 972 | return -EEXIST; |
| 973 | |||
| 974 | INIT_WORK(&tpg->tpg_base_work, tcm_qla2xxx_depend_tpg); | ||
| 971 | } else { | 975 | } else { |
| 972 | if (!vha->vha_tgt.qla_tgt) { | 976 | if (!atomic_read(&tpg->lport_tpg_enabled)) |
| 973 | pr_err("struct qla_hw_data *vha->vha_tgt.qla_tgt is NULL\n"); | 977 | return count; |
| 974 | return -ENODEV; | 978 | |
| 975 | } | 979 | INIT_WORK(&tpg->tpg_base_work, tcm_qla2xxx_undepend_tpg); |
| 976 | atomic_set(&tpg->lport_tpg_enabled, 0); | ||
| 977 | qlt_stop_phase1(vha->vha_tgt.qla_tgt); | ||
| 978 | } | 980 | } |
| 981 | init_completion(&tpg->tpg_base_comp); | ||
| 982 | schedule_work(&tpg->tpg_base_work); | ||
| 983 | wait_for_completion(&tpg->tpg_base_comp); | ||
| 979 | 984 | ||
| 985 | if (op) { | ||
| 986 | if (!atomic_read(&tpg->lport_tpg_enabled)) | ||
| 987 | return -ENODEV; | ||
| 988 | } else { | ||
| 989 | if (atomic_read(&tpg->lport_tpg_enabled)) | ||
| 990 | return -EPERM; | ||
| 991 | } | ||
| 980 | return count; | 992 | return count; |
| 981 | } | 993 | } |
| 982 | 994 | ||
| @@ -1053,11 +1065,64 @@ static void tcm_qla2xxx_drop_tpg(struct se_portal_group *se_tpg) | |||
| 1053 | /* | 1065 | /* |
| 1054 | * Clear local TPG=1 pointer for non NPIV mode. | 1066 | * Clear local TPG=1 pointer for non NPIV mode. |
| 1055 | */ | 1067 | */ |
| 1056 | lport->tpg_1 = NULL; | 1068 | lport->tpg_1 = NULL; |
| 1057 | |||
| 1058 | kfree(tpg); | 1069 | kfree(tpg); |
| 1059 | } | 1070 | } |
| 1060 | 1071 | ||
| 1072 | static ssize_t tcm_qla2xxx_npiv_tpg_show_enable( | ||
| 1073 | struct se_portal_group *se_tpg, | ||
| 1074 | char *page) | ||
| 1075 | { | ||
| 1076 | return tcm_qla2xxx_tpg_show_enable(se_tpg, page); | ||
| 1077 | } | ||
| 1078 | |||
| 1079 | static ssize_t tcm_qla2xxx_npiv_tpg_store_enable( | ||
| 1080 | struct se_portal_group *se_tpg, | ||
| 1081 | const char *page, | ||
| 1082 | size_t count) | ||
| 1083 | { | ||
| 1084 | struct se_wwn *se_wwn = se_tpg->se_tpg_wwn; | ||
| 1085 | struct tcm_qla2xxx_lport *lport = container_of(se_wwn, | ||
| 1086 | struct tcm_qla2xxx_lport, lport_wwn); | ||
| 1087 | struct scsi_qla_host *vha = lport->qla_vha; | ||
| 1088 | struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg, | ||
| 1089 | struct tcm_qla2xxx_tpg, se_tpg); | ||
| 1090 | unsigned long op; | ||
| 1091 | int rc; | ||
| 1092 | |||
| 1093 | rc = kstrtoul(page, 0, &op); | ||
| 1094 | if (rc < 0) { | ||
| 1095 | pr_err("kstrtoul() returned %d\n", rc); | ||
| 1096 | return -EINVAL; | ||
| 1097 | } | ||
| 1098 | if ((op != 1) && (op != 0)) { | ||
| 1099 | pr_err("Illegal value for tpg_enable: %lu\n", op); | ||
| 1100 | return -EINVAL; | ||
| 1101 | } | ||
| 1102 | if (op) { | ||
| 1103 | if (atomic_read(&tpg->lport_tpg_enabled)) | ||
| 1104 | return -EEXIST; | ||
| 1105 | |||
| 1106 | atomic_set(&tpg->lport_tpg_enabled, 1); | ||
| 1107 | qlt_enable_vha(vha); | ||
| 1108 | } else { | ||
| 1109 | if (!atomic_read(&tpg->lport_tpg_enabled)) | ||
| 1110 | return count; | ||
| 1111 | |||
| 1112 | atomic_set(&tpg->lport_tpg_enabled, 0); | ||
| 1113 | qlt_stop_phase1(vha->vha_tgt.qla_tgt); | ||
| 1114 | } | ||
| 1115 | |||
| 1116 | return count; | ||
| 1117 | } | ||
| 1118 | |||
| 1119 | TF_TPG_BASE_ATTR(tcm_qla2xxx_npiv, enable, S_IRUGO | S_IWUSR); | ||
| 1120 | |||
| 1121 | static struct configfs_attribute *tcm_qla2xxx_npiv_tpg_attrs[] = { | ||
| 1122 | &tcm_qla2xxx_npiv_tpg_enable.attr, | ||
| 1123 | NULL, | ||
| 1124 | }; | ||
| 1125 | |||
| 1061 | static struct se_portal_group *tcm_qla2xxx_npiv_make_tpg( | 1126 | static struct se_portal_group *tcm_qla2xxx_npiv_make_tpg( |
| 1062 | struct se_wwn *wwn, | 1127 | struct se_wwn *wwn, |
| 1063 | struct config_group *group, | 1128 | struct config_group *group, |
| @@ -1650,6 +1715,9 @@ static int tcm_qla2xxx_lport_register_npiv_cb(struct scsi_qla_host *base_vha, | |||
| 1650 | struct scsi_qla_host *npiv_vha; | 1715 | struct scsi_qla_host *npiv_vha; |
| 1651 | struct tcm_qla2xxx_lport *lport = | 1716 | struct tcm_qla2xxx_lport *lport = |
| 1652 | (struct tcm_qla2xxx_lport *)target_lport_ptr; | 1717 | (struct tcm_qla2xxx_lport *)target_lport_ptr; |
| 1718 | struct tcm_qla2xxx_lport *base_lport = | ||
| 1719 | (struct tcm_qla2xxx_lport *)base_vha->vha_tgt.target_lport_ptr; | ||
| 1720 | struct tcm_qla2xxx_tpg *base_tpg; | ||
| 1653 | struct fc_vport_identifiers vport_id; | 1721 | struct fc_vport_identifiers vport_id; |
| 1654 | 1722 | ||
| 1655 | if (!qla_tgt_mode_enabled(base_vha)) { | 1723 | if (!qla_tgt_mode_enabled(base_vha)) { |
| @@ -1657,6 +1725,13 @@ static int tcm_qla2xxx_lport_register_npiv_cb(struct scsi_qla_host *base_vha, | |||
| 1657 | return -EPERM; | 1725 | return -EPERM; |
| 1658 | } | 1726 | } |
| 1659 | 1727 | ||
| 1728 | if (!base_lport || !base_lport->tpg_1 || | ||
| 1729 | !atomic_read(&base_lport->tpg_1->lport_tpg_enabled)) { | ||
| 1730 | pr_err("qla2xxx base_lport or tpg_1 not available\n"); | ||
| 1731 | return -EPERM; | ||
| 1732 | } | ||
| 1733 | base_tpg = base_lport->tpg_1; | ||
| 1734 | |||
| 1660 | memset(&vport_id, 0, sizeof(vport_id)); | 1735 | memset(&vport_id, 0, sizeof(vport_id)); |
| 1661 | vport_id.port_name = npiv_wwpn; | 1736 | vport_id.port_name = npiv_wwpn; |
| 1662 | vport_id.node_name = npiv_wwnn; | 1737 | vport_id.node_name = npiv_wwnn; |
| @@ -1675,7 +1750,6 @@ static int tcm_qla2xxx_lport_register_npiv_cb(struct scsi_qla_host *base_vha, | |||
| 1675 | npiv_vha = (struct scsi_qla_host *)vport->dd_data; | 1750 | npiv_vha = (struct scsi_qla_host *)vport->dd_data; |
| 1676 | npiv_vha->vha_tgt.target_lport_ptr = target_lport_ptr; | 1751 | npiv_vha->vha_tgt.target_lport_ptr = target_lport_ptr; |
| 1677 | lport->qla_vha = npiv_vha; | 1752 | lport->qla_vha = npiv_vha; |
| 1678 | |||
| 1679 | scsi_host_get(npiv_vha->host); | 1753 | scsi_host_get(npiv_vha->host); |
| 1680 | return 0; | 1754 | return 0; |
| 1681 | } | 1755 | } |
| @@ -1714,8 +1788,6 @@ static struct se_wwn *tcm_qla2xxx_npiv_make_lport( | |||
| 1714 | } | 1788 | } |
| 1715 | lport->lport_npiv_wwpn = npiv_wwpn; | 1789 | lport->lport_npiv_wwpn = npiv_wwpn; |
| 1716 | lport->lport_npiv_wwnn = npiv_wwnn; | 1790 | lport->lport_npiv_wwnn = npiv_wwnn; |
| 1717 | tcm_qla2xxx_npiv_format_wwn(&lport->lport_npiv_name[0], | ||
| 1718 | TCM_QLA2XXX_NAMELEN, npiv_wwpn, npiv_wwnn); | ||
| 1719 | sprintf(lport->lport_naa_name, "naa.%016llx", (unsigned long long) npiv_wwpn); | 1791 | sprintf(lport->lport_naa_name, "naa.%016llx", (unsigned long long) npiv_wwpn); |
| 1720 | 1792 | ||
| 1721 | ret = tcm_qla2xxx_init_lport(lport); | 1793 | ret = tcm_qla2xxx_init_lport(lport); |
| @@ -1824,7 +1896,7 @@ static struct target_core_fabric_ops tcm_qla2xxx_ops = { | |||
| 1824 | static struct target_core_fabric_ops tcm_qla2xxx_npiv_ops = { | 1896 | static struct target_core_fabric_ops tcm_qla2xxx_npiv_ops = { |
| 1825 | .get_fabric_name = tcm_qla2xxx_npiv_get_fabric_name, | 1897 | .get_fabric_name = tcm_qla2xxx_npiv_get_fabric_name, |
| 1826 | .get_fabric_proto_ident = tcm_qla2xxx_get_fabric_proto_ident, | 1898 | .get_fabric_proto_ident = tcm_qla2xxx_get_fabric_proto_ident, |
| 1827 | .tpg_get_wwn = tcm_qla2xxx_npiv_get_fabric_wwn, | 1899 | .tpg_get_wwn = tcm_qla2xxx_get_fabric_wwn, |
| 1828 | .tpg_get_tag = tcm_qla2xxx_get_tag, | 1900 | .tpg_get_tag = tcm_qla2xxx_get_tag, |
| 1829 | .tpg_get_default_depth = tcm_qla2xxx_get_default_depth, | 1901 | .tpg_get_default_depth = tcm_qla2xxx_get_default_depth, |
| 1830 | .tpg_get_pr_transport_id = tcm_qla2xxx_get_pr_transport_id, | 1902 | .tpg_get_pr_transport_id = tcm_qla2xxx_get_pr_transport_id, |
| @@ -1935,7 +2007,7 @@ static int tcm_qla2xxx_register_configfs(void) | |||
| 1935 | */ | 2007 | */ |
| 1936 | npiv_fabric->tf_cit_tmpl.tfc_wwn_cit.ct_attrs = tcm_qla2xxx_wwn_attrs; | 2008 | npiv_fabric->tf_cit_tmpl.tfc_wwn_cit.ct_attrs = tcm_qla2xxx_wwn_attrs; |
| 1937 | npiv_fabric->tf_cit_tmpl.tfc_tpg_base_cit.ct_attrs = | 2009 | npiv_fabric->tf_cit_tmpl.tfc_tpg_base_cit.ct_attrs = |
| 1938 | tcm_qla2xxx_tpg_attrs; | 2010 | tcm_qla2xxx_npiv_tpg_attrs; |
| 1939 | npiv_fabric->tf_cit_tmpl.tfc_tpg_attrib_cit.ct_attrs = NULL; | 2011 | npiv_fabric->tf_cit_tmpl.tfc_tpg_attrib_cit.ct_attrs = NULL; |
| 1940 | npiv_fabric->tf_cit_tmpl.tfc_tpg_param_cit.ct_attrs = NULL; | 2012 | npiv_fabric->tf_cit_tmpl.tfc_tpg_param_cit.ct_attrs = NULL; |
| 1941 | npiv_fabric->tf_cit_tmpl.tfc_tpg_np_base_cit.ct_attrs = NULL; | 2013 | npiv_fabric->tf_cit_tmpl.tfc_tpg_np_base_cit.ct_attrs = NULL; |
diff --git a/drivers/scsi/qla2xxx/tcm_qla2xxx.h b/drivers/scsi/qla2xxx/tcm_qla2xxx.h index 275d8b9a7a34..33aaac8c7d59 100644 --- a/drivers/scsi/qla2xxx/tcm_qla2xxx.h +++ b/drivers/scsi/qla2xxx/tcm_qla2xxx.h | |||
| @@ -4,8 +4,6 @@ | |||
| 4 | #define TCM_QLA2XXX_VERSION "v0.1" | 4 | #define TCM_QLA2XXX_VERSION "v0.1" |
| 5 | /* length of ASCII WWPNs including pad */ | 5 | /* length of ASCII WWPNs including pad */ |
| 6 | #define TCM_QLA2XXX_NAMELEN 32 | 6 | #define TCM_QLA2XXX_NAMELEN 32 |
| 7 | /* lenth of ASCII NPIV 'WWPN+WWNN' including pad */ | ||
| 8 | #define TCM_QLA2XXX_NPIV_NAMELEN 66 | ||
| 9 | 7 | ||
| 10 | #include "qla_target.h" | 8 | #include "qla_target.h" |
| 11 | 9 | ||
| @@ -43,6 +41,9 @@ struct tcm_qla2xxx_tpg { | |||
| 43 | struct tcm_qla2xxx_tpg_attrib tpg_attrib; | 41 | struct tcm_qla2xxx_tpg_attrib tpg_attrib; |
| 44 | /* Returned by tcm_qla2xxx_make_tpg() */ | 42 | /* Returned by tcm_qla2xxx_make_tpg() */ |
| 45 | struct se_portal_group se_tpg; | 43 | struct se_portal_group se_tpg; |
| 44 | /* Items for dealing with configfs_depend_item */ | ||
| 45 | struct completion tpg_base_comp; | ||
| 46 | struct work_struct tpg_base_work; | ||
| 46 | }; | 47 | }; |
| 47 | 48 | ||
| 48 | struct tcm_qla2xxx_fc_loopid { | 49 | struct tcm_qla2xxx_fc_loopid { |
| @@ -62,8 +63,6 @@ struct tcm_qla2xxx_lport { | |||
| 62 | char lport_name[TCM_QLA2XXX_NAMELEN]; | 63 | char lport_name[TCM_QLA2XXX_NAMELEN]; |
| 63 | /* ASCII formatted naa WWPN for VPD page 83 etc */ | 64 | /* ASCII formatted naa WWPN for VPD page 83 etc */ |
| 64 | char lport_naa_name[TCM_QLA2XXX_NAMELEN]; | 65 | char lport_naa_name[TCM_QLA2XXX_NAMELEN]; |
| 65 | /* ASCII formatted WWPN+WWNN for NPIV FC Target Lport */ | ||
| 66 | char lport_npiv_name[TCM_QLA2XXX_NPIV_NAMELEN]; | ||
| 67 | /* map for fc_port pointers in 24-bit FC Port ID space */ | 66 | /* map for fc_port pointers in 24-bit FC Port ID space */ |
| 68 | struct btree_head32 lport_fcport_map; | 67 | struct btree_head32 lport_fcport_map; |
| 69 | /* vmalloc-ed memory for fc_port pointers for 16-bit FC loop ID */ | 68 | /* vmalloc-ed memory for fc_port pointers for 16-bit FC loop ID */ |
diff --git a/drivers/spi/spi-ath79.c b/drivers/spi/spi-ath79.c index 31534b51715a..c3b2fb9b6713 100644 --- a/drivers/spi/spi-ath79.c +++ b/drivers/spi/spi-ath79.c | |||
| @@ -132,9 +132,9 @@ static int ath79_spi_setup_cs(struct spi_device *spi) | |||
| 132 | 132 | ||
| 133 | flags = GPIOF_DIR_OUT; | 133 | flags = GPIOF_DIR_OUT; |
| 134 | if (spi->mode & SPI_CS_HIGH) | 134 | if (spi->mode & SPI_CS_HIGH) |
| 135 | flags |= GPIOF_INIT_HIGH; | ||
| 136 | else | ||
| 137 | flags |= GPIOF_INIT_LOW; | 135 | flags |= GPIOF_INIT_LOW; |
| 136 | else | ||
| 137 | flags |= GPIOF_INIT_HIGH; | ||
| 138 | 138 | ||
| 139 | status = gpio_request_one(cdata->gpio, flags, | 139 | status = gpio_request_one(cdata->gpio, flags, |
| 140 | dev_name(&spi->dev)); | 140 | dev_name(&spi->dev)); |
diff --git a/drivers/spi/spi-atmel.c b/drivers/spi/spi-atmel.c index b0842f751016..5d7b07f08326 100644 --- a/drivers/spi/spi-atmel.c +++ b/drivers/spi/spi-atmel.c | |||
| @@ -1455,6 +1455,14 @@ static int atmel_spi_suspend(struct device *dev) | |||
| 1455 | { | 1455 | { |
| 1456 | struct spi_master *master = dev_get_drvdata(dev); | 1456 | struct spi_master *master = dev_get_drvdata(dev); |
| 1457 | struct atmel_spi *as = spi_master_get_devdata(master); | 1457 | struct atmel_spi *as = spi_master_get_devdata(master); |
| 1458 | int ret; | ||
| 1459 | |||
| 1460 | /* Stop the queue running */ | ||
| 1461 | ret = spi_master_suspend(master); | ||
| 1462 | if (ret) { | ||
| 1463 | dev_warn(dev, "cannot suspend master\n"); | ||
| 1464 | return ret; | ||
| 1465 | } | ||
| 1458 | 1466 | ||
| 1459 | clk_disable_unprepare(as->clk); | 1467 | clk_disable_unprepare(as->clk); |
| 1460 | return 0; | 1468 | return 0; |
| @@ -1464,9 +1472,16 @@ static int atmel_spi_resume(struct device *dev) | |||
| 1464 | { | 1472 | { |
| 1465 | struct spi_master *master = dev_get_drvdata(dev); | 1473 | struct spi_master *master = dev_get_drvdata(dev); |
| 1466 | struct atmel_spi *as = spi_master_get_devdata(master); | 1474 | struct atmel_spi *as = spi_master_get_devdata(master); |
| 1475 | int ret; | ||
| 1467 | 1476 | ||
| 1468 | clk_prepare_enable(as->clk); | 1477 | clk_prepare_enable(as->clk); |
| 1469 | return 0; | 1478 | |
| 1479 | /* Start the queue running */ | ||
| 1480 | ret = spi_master_resume(master); | ||
| 1481 | if (ret) | ||
| 1482 | dev_err(dev, "problem starting queue (%d)\n", ret); | ||
| 1483 | |||
| 1484 | return ret; | ||
| 1470 | } | 1485 | } |
| 1471 | 1486 | ||
| 1472 | static SIMPLE_DEV_PM_OPS(atmel_spi_pm_ops, atmel_spi_suspend, atmel_spi_resume); | 1487 | static SIMPLE_DEV_PM_OPS(atmel_spi_pm_ops, atmel_spi_suspend, atmel_spi_resume); |
diff --git a/drivers/spi/spi-coldfire-qspi.c b/drivers/spi/spi-coldfire-qspi.c index cabed8f9119e..28ae470397a9 100644 --- a/drivers/spi/spi-coldfire-qspi.c +++ b/drivers/spi/spi-coldfire-qspi.c | |||
| @@ -514,7 +514,8 @@ static int mcfqspi_resume(struct device *dev) | |||
| 514 | #ifdef CONFIG_PM_RUNTIME | 514 | #ifdef CONFIG_PM_RUNTIME |
| 515 | static int mcfqspi_runtime_suspend(struct device *dev) | 515 | static int mcfqspi_runtime_suspend(struct device *dev) |
| 516 | { | 516 | { |
| 517 | struct mcfqspi *mcfqspi = dev_get_drvdata(dev); | 517 | struct spi_master *master = dev_get_drvdata(dev); |
| 518 | struct mcfqspi *mcfqspi = spi_master_get_devdata(master); | ||
| 518 | 519 | ||
| 519 | clk_disable(mcfqspi->clk); | 520 | clk_disable(mcfqspi->clk); |
| 520 | 521 | ||
| @@ -523,7 +524,8 @@ static int mcfqspi_runtime_suspend(struct device *dev) | |||
| 523 | 524 | ||
| 524 | static int mcfqspi_runtime_resume(struct device *dev) | 525 | static int mcfqspi_runtime_resume(struct device *dev) |
| 525 | { | 526 | { |
| 526 | struct mcfqspi *mcfqspi = dev_get_drvdata(dev); | 527 | struct spi_master *master = dev_get_drvdata(dev); |
| 528 | struct mcfqspi *mcfqspi = spi_master_get_devdata(master); | ||
| 527 | 529 | ||
| 528 | clk_enable(mcfqspi->clk); | 530 | clk_enable(mcfqspi->clk); |
| 529 | 531 | ||
diff --git a/drivers/spi/spi-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c index ec79f726672a..a25392065d9b 100644 --- a/drivers/spi/spi-fsl-dspi.c +++ b/drivers/spi/spi-fsl-dspi.c | |||
| @@ -420,7 +420,6 @@ static int dspi_suspend(struct device *dev) | |||
| 420 | 420 | ||
| 421 | static int dspi_resume(struct device *dev) | 421 | static int dspi_resume(struct device *dev) |
| 422 | { | 422 | { |
| 423 | |||
| 424 | struct spi_master *master = dev_get_drvdata(dev); | 423 | struct spi_master *master = dev_get_drvdata(dev); |
| 425 | struct fsl_dspi *dspi = spi_master_get_devdata(master); | 424 | struct fsl_dspi *dspi = spi_master_get_devdata(master); |
| 426 | 425 | ||
| @@ -504,7 +503,7 @@ static int dspi_probe(struct platform_device *pdev) | |||
| 504 | clk_prepare_enable(dspi->clk); | 503 | clk_prepare_enable(dspi->clk); |
| 505 | 504 | ||
| 506 | init_waitqueue_head(&dspi->waitq); | 505 | init_waitqueue_head(&dspi->waitq); |
| 507 | platform_set_drvdata(pdev, dspi); | 506 | platform_set_drvdata(pdev, master); |
| 508 | 507 | ||
| 509 | ret = spi_bitbang_start(&dspi->bitbang); | 508 | ret = spi_bitbang_start(&dspi->bitbang); |
| 510 | if (ret != 0) { | 509 | if (ret != 0) { |
| @@ -525,7 +524,8 @@ out_master_put: | |||
| 525 | 524 | ||
| 526 | static int dspi_remove(struct platform_device *pdev) | 525 | static int dspi_remove(struct platform_device *pdev) |
| 527 | { | 526 | { |
| 528 | struct fsl_dspi *dspi = platform_get_drvdata(pdev); | 527 | struct spi_master *master = platform_get_drvdata(pdev); |
| 528 | struct fsl_dspi *dspi = spi_master_get_devdata(master); | ||
| 529 | 529 | ||
| 530 | /* Disconnect from the SPI framework */ | 530 | /* Disconnect from the SPI framework */ |
| 531 | spi_bitbang_stop(&dspi->bitbang); | 531 | spi_bitbang_stop(&dspi->bitbang); |
diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c index a5474ef9d2a0..47f15d97e7fa 100644 --- a/drivers/spi/spi-imx.c +++ b/drivers/spi/spi-imx.c | |||
| @@ -948,8 +948,8 @@ static int spi_imx_remove(struct platform_device *pdev) | |||
| 948 | spi_bitbang_stop(&spi_imx->bitbang); | 948 | spi_bitbang_stop(&spi_imx->bitbang); |
| 949 | 949 | ||
| 950 | writel(0, spi_imx->base + MXC_CSPICTRL); | 950 | writel(0, spi_imx->base + MXC_CSPICTRL); |
| 951 | clk_disable_unprepare(spi_imx->clk_ipg); | 951 | clk_unprepare(spi_imx->clk_ipg); |
| 952 | clk_disable_unprepare(spi_imx->clk_per); | 952 | clk_unprepare(spi_imx->clk_per); |
| 953 | spi_master_put(master); | 953 | spi_master_put(master); |
| 954 | 954 | ||
| 955 | return 0; | 955 | return 0; |
diff --git a/drivers/spi/spi-topcliff-pch.c b/drivers/spi/spi-topcliff-pch.c index 2e7f38c7a961..88eb57e858b3 100644 --- a/drivers/spi/spi-topcliff-pch.c +++ b/drivers/spi/spi-topcliff-pch.c | |||
| @@ -915,7 +915,7 @@ static void pch_spi_request_dma(struct pch_spi_data *data, int bpw) | |||
| 915 | /* Set Tx DMA */ | 915 | /* Set Tx DMA */ |
| 916 | param = &dma->param_tx; | 916 | param = &dma->param_tx; |
| 917 | param->dma_dev = &dma_dev->dev; | 917 | param->dma_dev = &dma_dev->dev; |
| 918 | param->chan_id = data->master->bus_num * 2; /* Tx = 0, 2 */ | 918 | param->chan_id = data->ch * 2; /* Tx = 0, 2 */; |
| 919 | param->tx_reg = data->io_base_addr + PCH_SPDWR; | 919 | param->tx_reg = data->io_base_addr + PCH_SPDWR; |
| 920 | param->width = width; | 920 | param->width = width; |
| 921 | chan = dma_request_channel(mask, pch_spi_filter, param); | 921 | chan = dma_request_channel(mask, pch_spi_filter, param); |
| @@ -930,7 +930,7 @@ static void pch_spi_request_dma(struct pch_spi_data *data, int bpw) | |||
| 930 | /* Set Rx DMA */ | 930 | /* Set Rx DMA */ |
| 931 | param = &dma->param_rx; | 931 | param = &dma->param_rx; |
| 932 | param->dma_dev = &dma_dev->dev; | 932 | param->dma_dev = &dma_dev->dev; |
| 933 | param->chan_id = data->master->bus_num * 2 + 1; /* Rx = Tx + 1 */ | 933 | param->chan_id = data->ch * 2 + 1; /* Rx = Tx + 1 */; |
| 934 | param->rx_reg = data->io_base_addr + PCH_SPDRR; | 934 | param->rx_reg = data->io_base_addr + PCH_SPDRR; |
| 935 | param->width = width; | 935 | param->width = width; |
| 936 | chan = dma_request_channel(mask, pch_spi_filter, param); | 936 | chan = dma_request_channel(mask, pch_spi_filter, param); |
| @@ -1452,6 +1452,11 @@ static int pch_spi_pd_probe(struct platform_device *plat_dev) | |||
| 1452 | 1452 | ||
| 1453 | pch_spi_set_master_mode(master); | 1453 | pch_spi_set_master_mode(master); |
| 1454 | 1454 | ||
| 1455 | if (use_dma) { | ||
| 1456 | dev_info(&plat_dev->dev, "Use DMA for data transfers\n"); | ||
| 1457 | pch_alloc_dma_buf(board_dat, data); | ||
| 1458 | } | ||
| 1459 | |||
| 1455 | ret = spi_register_master(master); | 1460 | ret = spi_register_master(master); |
| 1456 | if (ret != 0) { | 1461 | if (ret != 0) { |
| 1457 | dev_err(&plat_dev->dev, | 1462 | dev_err(&plat_dev->dev, |
| @@ -1459,14 +1464,10 @@ static int pch_spi_pd_probe(struct platform_device *plat_dev) | |||
| 1459 | goto err_spi_register_master; | 1464 | goto err_spi_register_master; |
| 1460 | } | 1465 | } |
| 1461 | 1466 | ||
| 1462 | if (use_dma) { | ||
| 1463 | dev_info(&plat_dev->dev, "Use DMA for data transfers\n"); | ||
| 1464 | pch_alloc_dma_buf(board_dat, data); | ||
| 1465 | } | ||
| 1466 | |||
| 1467 | return 0; | 1467 | return 0; |
| 1468 | 1468 | ||
| 1469 | err_spi_register_master: | 1469 | err_spi_register_master: |
| 1470 | pch_free_dma_buf(board_dat, data); | ||
| 1470 | free_irq(board_dat->pdev->irq, data); | 1471 | free_irq(board_dat->pdev->irq, data); |
| 1471 | err_request_irq: | 1472 | err_request_irq: |
| 1472 | pch_spi_free_resources(board_dat, data); | 1473 | pch_spi_free_resources(board_dat, data); |
diff --git a/drivers/staging/iio/adc/mxs-lradc.c b/drivers/staging/iio/adc/mxs-lradc.c index 7fc66a6a6e36..514844efac75 100644 --- a/drivers/staging/iio/adc/mxs-lradc.c +++ b/drivers/staging/iio/adc/mxs-lradc.c | |||
| @@ -757,6 +757,7 @@ static void mxs_lradc_finish_touch_event(struct mxs_lradc *lradc, bool valid) | |||
| 757 | } | 757 | } |
| 758 | 758 | ||
| 759 | /* if it is released, wait for the next touch via IRQ */ | 759 | /* if it is released, wait for the next touch via IRQ */ |
| 760 | lradc->cur_plate = LRADC_TOUCH; | ||
| 760 | mxs_lradc_reg_clear(lradc, LRADC_CTRL1_TOUCH_DETECT_IRQ, LRADC_CTRL1); | 761 | mxs_lradc_reg_clear(lradc, LRADC_CTRL1_TOUCH_DETECT_IRQ, LRADC_CTRL1); |
| 761 | mxs_lradc_reg_set(lradc, LRADC_CTRL1_TOUCH_DETECT_IRQ_EN, LRADC_CTRL1); | 762 | mxs_lradc_reg_set(lradc, LRADC_CTRL1_TOUCH_DETECT_IRQ_EN, LRADC_CTRL1); |
| 762 | } | 763 | } |
diff --git a/drivers/staging/rtl8188eu/os_dep/usb_intf.c b/drivers/staging/rtl8188eu/os_dep/usb_intf.c index a70dcef1419e..2f40ff5901d6 100644 --- a/drivers/staging/rtl8188eu/os_dep/usb_intf.c +++ b/drivers/staging/rtl8188eu/os_dep/usb_intf.c | |||
| @@ -55,6 +55,7 @@ static struct usb_device_id rtw_usb_id_tbl[] = { | |||
| 55 | /****** 8188EUS ********/ | 55 | /****** 8188EUS ********/ |
| 56 | {USB_DEVICE(0x07b8, 0x8179)}, /* Abocom - Abocom */ | 56 | {USB_DEVICE(0x07b8, 0x8179)}, /* Abocom - Abocom */ |
| 57 | {USB_DEVICE(0x2001, 0x330F)}, /* DLink DWA-125 REV D1 */ | 57 | {USB_DEVICE(0x2001, 0x330F)}, /* DLink DWA-125 REV D1 */ |
| 58 | {USB_DEVICE(0x2001, 0x3310)}, /* Dlink DWA-123 REV D1 */ | ||
| 58 | {} /* Terminating entry */ | 59 | {} /* Terminating entry */ |
| 59 | }; | 60 | }; |
| 60 | 61 | ||
diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c index 7f1a7ce4b771..b83ec378d04f 100644 --- a/drivers/target/iscsi/iscsi_target.c +++ b/drivers/target/iscsi/iscsi_target.c | |||
| @@ -785,7 +785,7 @@ static void iscsit_ack_from_expstatsn(struct iscsi_conn *conn, u32 exp_statsn) | |||
| 785 | spin_unlock_bh(&conn->cmd_lock); | 785 | spin_unlock_bh(&conn->cmd_lock); |
| 786 | 786 | ||
| 787 | list_for_each_entry_safe(cmd, cmd_p, &ack_list, i_conn_node) { | 787 | list_for_each_entry_safe(cmd, cmd_p, &ack_list, i_conn_node) { |
| 788 | list_del(&cmd->i_conn_node); | 788 | list_del_init(&cmd->i_conn_node); |
| 789 | iscsit_free_cmd(cmd, false); | 789 | iscsit_free_cmd(cmd, false); |
| 790 | } | 790 | } |
| 791 | } | 791 | } |
| @@ -3708,7 +3708,7 @@ iscsit_immediate_queue(struct iscsi_conn *conn, struct iscsi_cmd *cmd, int state | |||
| 3708 | break; | 3708 | break; |
| 3709 | case ISTATE_REMOVE: | 3709 | case ISTATE_REMOVE: |
| 3710 | spin_lock_bh(&conn->cmd_lock); | 3710 | spin_lock_bh(&conn->cmd_lock); |
| 3711 | list_del(&cmd->i_conn_node); | 3711 | list_del_init(&cmd->i_conn_node); |
| 3712 | spin_unlock_bh(&conn->cmd_lock); | 3712 | spin_unlock_bh(&conn->cmd_lock); |
| 3713 | 3713 | ||
| 3714 | iscsit_free_cmd(cmd, false); | 3714 | iscsit_free_cmd(cmd, false); |
| @@ -4151,7 +4151,7 @@ static void iscsit_release_commands_from_conn(struct iscsi_conn *conn) | |||
| 4151 | spin_lock_bh(&conn->cmd_lock); | 4151 | spin_lock_bh(&conn->cmd_lock); |
| 4152 | list_for_each_entry_safe(cmd, cmd_tmp, &conn->conn_cmd_list, i_conn_node) { | 4152 | list_for_each_entry_safe(cmd, cmd_tmp, &conn->conn_cmd_list, i_conn_node) { |
| 4153 | 4153 | ||
| 4154 | list_del(&cmd->i_conn_node); | 4154 | list_del_init(&cmd->i_conn_node); |
| 4155 | spin_unlock_bh(&conn->cmd_lock); | 4155 | spin_unlock_bh(&conn->cmd_lock); |
| 4156 | 4156 | ||
| 4157 | iscsit_increment_maxcmdsn(cmd, sess); | 4157 | iscsit_increment_maxcmdsn(cmd, sess); |
| @@ -4196,6 +4196,10 @@ int iscsit_close_connection( | |||
| 4196 | iscsit_stop_timers_for_cmds(conn); | 4196 | iscsit_stop_timers_for_cmds(conn); |
| 4197 | iscsit_stop_nopin_response_timer(conn); | 4197 | iscsit_stop_nopin_response_timer(conn); |
| 4198 | iscsit_stop_nopin_timer(conn); | 4198 | iscsit_stop_nopin_timer(conn); |
| 4199 | |||
| 4200 | if (conn->conn_transport->iscsit_wait_conn) | ||
| 4201 | conn->conn_transport->iscsit_wait_conn(conn); | ||
| 4202 | |||
| 4199 | iscsit_free_queue_reqs_for_conn(conn); | 4203 | iscsit_free_queue_reqs_for_conn(conn); |
| 4200 | 4204 | ||
| 4201 | /* | 4205 | /* |
diff --git a/drivers/target/iscsi/iscsi_target_erl2.c b/drivers/target/iscsi/iscsi_target_erl2.c index 33be1fb1df32..4ca8fd2a70db 100644 --- a/drivers/target/iscsi/iscsi_target_erl2.c +++ b/drivers/target/iscsi/iscsi_target_erl2.c | |||
| @@ -138,7 +138,7 @@ void iscsit_free_connection_recovery_entires(struct iscsi_session *sess) | |||
| 138 | list_for_each_entry_safe(cmd, cmd_tmp, | 138 | list_for_each_entry_safe(cmd, cmd_tmp, |
| 139 | &cr->conn_recovery_cmd_list, i_conn_node) { | 139 | &cr->conn_recovery_cmd_list, i_conn_node) { |
| 140 | 140 | ||
| 141 | list_del(&cmd->i_conn_node); | 141 | list_del_init(&cmd->i_conn_node); |
| 142 | cmd->conn = NULL; | 142 | cmd->conn = NULL; |
| 143 | spin_unlock(&cr->conn_recovery_cmd_lock); | 143 | spin_unlock(&cr->conn_recovery_cmd_lock); |
| 144 | iscsit_free_cmd(cmd, true); | 144 | iscsit_free_cmd(cmd, true); |
| @@ -160,7 +160,7 @@ void iscsit_free_connection_recovery_entires(struct iscsi_session *sess) | |||
| 160 | list_for_each_entry_safe(cmd, cmd_tmp, | 160 | list_for_each_entry_safe(cmd, cmd_tmp, |
| 161 | &cr->conn_recovery_cmd_list, i_conn_node) { | 161 | &cr->conn_recovery_cmd_list, i_conn_node) { |
| 162 | 162 | ||
| 163 | list_del(&cmd->i_conn_node); | 163 | list_del_init(&cmd->i_conn_node); |
| 164 | cmd->conn = NULL; | 164 | cmd->conn = NULL; |
| 165 | spin_unlock(&cr->conn_recovery_cmd_lock); | 165 | spin_unlock(&cr->conn_recovery_cmd_lock); |
| 166 | iscsit_free_cmd(cmd, true); | 166 | iscsit_free_cmd(cmd, true); |
| @@ -216,7 +216,7 @@ int iscsit_remove_cmd_from_connection_recovery( | |||
| 216 | } | 216 | } |
| 217 | cr = cmd->cr; | 217 | cr = cmd->cr; |
| 218 | 218 | ||
| 219 | list_del(&cmd->i_conn_node); | 219 | list_del_init(&cmd->i_conn_node); |
| 220 | return --cr->cmd_count; | 220 | return --cr->cmd_count; |
| 221 | } | 221 | } |
| 222 | 222 | ||
| @@ -297,7 +297,7 @@ int iscsit_discard_unacknowledged_ooo_cmdsns_for_conn(struct iscsi_conn *conn) | |||
| 297 | if (!(cmd->cmd_flags & ICF_OOO_CMDSN)) | 297 | if (!(cmd->cmd_flags & ICF_OOO_CMDSN)) |
| 298 | continue; | 298 | continue; |
| 299 | 299 | ||
| 300 | list_del(&cmd->i_conn_node); | 300 | list_del_init(&cmd->i_conn_node); |
| 301 | 301 | ||
| 302 | spin_unlock_bh(&conn->cmd_lock); | 302 | spin_unlock_bh(&conn->cmd_lock); |
| 303 | iscsit_free_cmd(cmd, true); | 303 | iscsit_free_cmd(cmd, true); |
| @@ -335,7 +335,7 @@ int iscsit_prepare_cmds_for_realligance(struct iscsi_conn *conn) | |||
| 335 | /* | 335 | /* |
| 336 | * Only perform connection recovery on ISCSI_OP_SCSI_CMD or | 336 | * Only perform connection recovery on ISCSI_OP_SCSI_CMD or |
| 337 | * ISCSI_OP_NOOP_OUT opcodes. For all other opcodes call | 337 | * ISCSI_OP_NOOP_OUT opcodes. For all other opcodes call |
| 338 | * list_del(&cmd->i_conn_node); to release the command to the | 338 | * list_del_init(&cmd->i_conn_node); to release the command to the |
| 339 | * session pool and remove it from the connection's list. | 339 | * session pool and remove it from the connection's list. |
| 340 | * | 340 | * |
| 341 | * Also stop the DataOUT timer, which will be restarted after | 341 | * Also stop the DataOUT timer, which will be restarted after |
| @@ -351,7 +351,7 @@ int iscsit_prepare_cmds_for_realligance(struct iscsi_conn *conn) | |||
| 351 | " CID: %hu\n", cmd->iscsi_opcode, | 351 | " CID: %hu\n", cmd->iscsi_opcode, |
| 352 | cmd->init_task_tag, cmd->cmd_sn, conn->cid); | 352 | cmd->init_task_tag, cmd->cmd_sn, conn->cid); |
| 353 | 353 | ||
| 354 | list_del(&cmd->i_conn_node); | 354 | list_del_init(&cmd->i_conn_node); |
| 355 | spin_unlock_bh(&conn->cmd_lock); | 355 | spin_unlock_bh(&conn->cmd_lock); |
| 356 | iscsit_free_cmd(cmd, true); | 356 | iscsit_free_cmd(cmd, true); |
| 357 | spin_lock_bh(&conn->cmd_lock); | 357 | spin_lock_bh(&conn->cmd_lock); |
| @@ -371,7 +371,7 @@ int iscsit_prepare_cmds_for_realligance(struct iscsi_conn *conn) | |||
| 371 | */ | 371 | */ |
| 372 | if (!(cmd->cmd_flags & ICF_OOO_CMDSN) && !cmd->immediate_cmd && | 372 | if (!(cmd->cmd_flags & ICF_OOO_CMDSN) && !cmd->immediate_cmd && |
| 373 | iscsi_sna_gte(cmd->cmd_sn, conn->sess->exp_cmd_sn)) { | 373 | iscsi_sna_gte(cmd->cmd_sn, conn->sess->exp_cmd_sn)) { |
| 374 | list_del(&cmd->i_conn_node); | 374 | list_del_init(&cmd->i_conn_node); |
| 375 | spin_unlock_bh(&conn->cmd_lock); | 375 | spin_unlock_bh(&conn->cmd_lock); |
| 376 | iscsit_free_cmd(cmd, true); | 376 | iscsit_free_cmd(cmd, true); |
| 377 | spin_lock_bh(&conn->cmd_lock); | 377 | spin_lock_bh(&conn->cmd_lock); |
| @@ -393,7 +393,7 @@ int iscsit_prepare_cmds_for_realligance(struct iscsi_conn *conn) | |||
| 393 | 393 | ||
| 394 | cmd->sess = conn->sess; | 394 | cmd->sess = conn->sess; |
| 395 | 395 | ||
| 396 | list_del(&cmd->i_conn_node); | 396 | list_del_init(&cmd->i_conn_node); |
| 397 | spin_unlock_bh(&conn->cmd_lock); | 397 | spin_unlock_bh(&conn->cmd_lock); |
| 398 | 398 | ||
| 399 | iscsit_free_all_datain_reqs(cmd); | 399 | iscsit_free_all_datain_reqs(cmd); |
diff --git a/drivers/target/iscsi/iscsi_target_tpg.c b/drivers/target/iscsi/iscsi_target_tpg.c index 39761837608d..44a5471de00f 100644 --- a/drivers/target/iscsi/iscsi_target_tpg.c +++ b/drivers/target/iscsi/iscsi_target_tpg.c | |||
| @@ -137,7 +137,7 @@ struct iscsi_portal_group *iscsit_get_tpg_from_np( | |||
| 137 | list_for_each_entry(tpg, &tiqn->tiqn_tpg_list, tpg_list) { | 137 | list_for_each_entry(tpg, &tiqn->tiqn_tpg_list, tpg_list) { |
| 138 | 138 | ||
| 139 | spin_lock(&tpg->tpg_state_lock); | 139 | spin_lock(&tpg->tpg_state_lock); |
| 140 | if (tpg->tpg_state == TPG_STATE_FREE) { | 140 | if (tpg->tpg_state != TPG_STATE_ACTIVE) { |
| 141 | spin_unlock(&tpg->tpg_state_lock); | 141 | spin_unlock(&tpg->tpg_state_lock); |
| 142 | continue; | 142 | continue; |
| 143 | } | 143 | } |
diff --git a/drivers/target/target_core_sbc.c b/drivers/target/target_core_sbc.c index a4489444ffbc..77e6531fb0a1 100644 --- a/drivers/target/target_core_sbc.c +++ b/drivers/target/target_core_sbc.c | |||
| @@ -1074,31 +1074,36 @@ sbc_dif_copy_prot(struct se_cmd *cmd, unsigned int sectors, bool read, | |||
| 1074 | struct scatterlist *psg; | 1074 | struct scatterlist *psg; |
| 1075 | void *paddr, *addr; | 1075 | void *paddr, *addr; |
| 1076 | unsigned int i, len, left; | 1076 | unsigned int i, len, left; |
| 1077 | unsigned int offset = 0; | 1077 | unsigned int offset = sg_off; |
| 1078 | 1078 | ||
| 1079 | left = sectors * dev->prot_length; | 1079 | left = sectors * dev->prot_length; |
| 1080 | 1080 | ||
| 1081 | for_each_sg(cmd->t_prot_sg, psg, cmd->t_prot_nents, i) { | 1081 | for_each_sg(cmd->t_prot_sg, psg, cmd->t_prot_nents, i) { |
| 1082 | 1082 | unsigned int psg_len, copied = 0; | |
| 1083 | len = min(psg->length, left); | ||
| 1084 | if (offset >= sg->length) { | ||
| 1085 | sg = sg_next(sg); | ||
| 1086 | offset = 0; | ||
| 1087 | sg_off = sg->offset; | ||
| 1088 | } | ||
| 1089 | 1083 | ||
| 1090 | paddr = kmap_atomic(sg_page(psg)) + psg->offset; | 1084 | paddr = kmap_atomic(sg_page(psg)) + psg->offset; |
| 1091 | addr = kmap_atomic(sg_page(sg)) + sg_off; | 1085 | psg_len = min(left, psg->length); |
| 1086 | while (psg_len) { | ||
| 1087 | len = min(psg_len, sg->length - offset); | ||
| 1088 | addr = kmap_atomic(sg_page(sg)) + sg->offset + offset; | ||
| 1092 | 1089 | ||
| 1093 | if (read) | 1090 | if (read) |
| 1094 | memcpy(paddr, addr, len); | 1091 | memcpy(paddr + copied, addr, len); |
| 1095 | else | 1092 | else |
| 1096 | memcpy(addr, paddr, len); | 1093 | memcpy(addr, paddr + copied, len); |
| 1097 | 1094 | ||
| 1098 | left -= len; | 1095 | left -= len; |
| 1099 | offset += len; | 1096 | offset += len; |
| 1097 | copied += len; | ||
| 1098 | psg_len -= len; | ||
| 1099 | |||
| 1100 | if (offset >= sg->length) { | ||
| 1101 | sg = sg_next(sg); | ||
| 1102 | offset = 0; | ||
| 1103 | } | ||
| 1104 | kunmap_atomic(addr); | ||
| 1105 | } | ||
| 1100 | kunmap_atomic(paddr); | 1106 | kunmap_atomic(paddr); |
| 1101 | kunmap_atomic(addr); | ||
| 1102 | } | 1107 | } |
| 1103 | } | 1108 | } |
| 1104 | 1109 | ||
| @@ -1163,7 +1168,7 @@ sbc_dif_verify_read(struct se_cmd *cmd, sector_t start, unsigned int sectors, | |||
| 1163 | { | 1168 | { |
| 1164 | struct se_device *dev = cmd->se_dev; | 1169 | struct se_device *dev = cmd->se_dev; |
| 1165 | struct se_dif_v1_tuple *sdt; | 1170 | struct se_dif_v1_tuple *sdt; |
| 1166 | struct scatterlist *dsg; | 1171 | struct scatterlist *dsg, *psg = sg; |
| 1167 | sector_t sector = start; | 1172 | sector_t sector = start; |
| 1168 | void *daddr, *paddr; | 1173 | void *daddr, *paddr; |
| 1169 | int i, j, offset = sg_off; | 1174 | int i, j, offset = sg_off; |
| @@ -1171,14 +1176,14 @@ sbc_dif_verify_read(struct se_cmd *cmd, sector_t start, unsigned int sectors, | |||
| 1171 | 1176 | ||
| 1172 | for_each_sg(cmd->t_data_sg, dsg, cmd->t_data_nents, i) { | 1177 | for_each_sg(cmd->t_data_sg, dsg, cmd->t_data_nents, i) { |
| 1173 | daddr = kmap_atomic(sg_page(dsg)) + dsg->offset; | 1178 | daddr = kmap_atomic(sg_page(dsg)) + dsg->offset; |
| 1174 | paddr = kmap_atomic(sg_page(sg)) + sg->offset; | 1179 | paddr = kmap_atomic(sg_page(psg)) + sg->offset; |
| 1175 | 1180 | ||
| 1176 | for (j = 0; j < dsg->length; j += dev->dev_attrib.block_size) { | 1181 | for (j = 0; j < dsg->length; j += dev->dev_attrib.block_size) { |
| 1177 | 1182 | ||
| 1178 | if (offset >= sg->length) { | 1183 | if (offset >= psg->length) { |
| 1179 | kunmap_atomic(paddr); | 1184 | kunmap_atomic(paddr); |
| 1180 | sg = sg_next(sg); | 1185 | psg = sg_next(psg); |
| 1181 | paddr = kmap_atomic(sg_page(sg)) + sg->offset; | 1186 | paddr = kmap_atomic(sg_page(psg)) + psg->offset; |
| 1182 | offset = 0; | 1187 | offset = 0; |
| 1183 | } | 1188 | } |
| 1184 | 1189 | ||
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c index 24b4f65d8777..2956250b7225 100644 --- a/drivers/target/target_core_transport.c +++ b/drivers/target/target_core_transport.c | |||
| @@ -1601,6 +1601,9 @@ void transport_generic_request_failure(struct se_cmd *cmd, | |||
| 1601 | case TCM_CHECK_CONDITION_ABORT_CMD: | 1601 | case TCM_CHECK_CONDITION_ABORT_CMD: |
| 1602 | case TCM_CHECK_CONDITION_UNIT_ATTENTION: | 1602 | case TCM_CHECK_CONDITION_UNIT_ATTENTION: |
| 1603 | case TCM_CHECK_CONDITION_NOT_READY: | 1603 | case TCM_CHECK_CONDITION_NOT_READY: |
| 1604 | case TCM_LOGICAL_BLOCK_GUARD_CHECK_FAILED: | ||
| 1605 | case TCM_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED: | ||
| 1606 | case TCM_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED: | ||
| 1604 | break; | 1607 | break; |
| 1605 | case TCM_OUT_OF_RESOURCES: | 1608 | case TCM_OUT_OF_RESOURCES: |
| 1606 | sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; | 1609 | sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; |
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index 471142725ffe..81cda09b47e3 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c | |||
| @@ -685,8 +685,15 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd) | |||
| 685 | struct ehci_hcd *ehci = hcd_to_ehci (hcd); | 685 | struct ehci_hcd *ehci = hcd_to_ehci (hcd); |
| 686 | u32 status, masked_status, pcd_status = 0, cmd; | 686 | u32 status, masked_status, pcd_status = 0, cmd; |
| 687 | int bh; | 687 | int bh; |
| 688 | unsigned long flags; | ||
| 688 | 689 | ||
| 689 | spin_lock (&ehci->lock); | 690 | /* |
| 691 | * For threadirqs option we use spin_lock_irqsave() variant to prevent | ||
| 692 | * deadlock with ehci hrtimer callback, because hrtimer callbacks run | ||
| 693 | * in interrupt context even when threadirqs is specified. We can go | ||
| 694 | * back to spin_lock() variant when hrtimer callbacks become threaded. | ||
| 695 | */ | ||
| 696 | spin_lock_irqsave(&ehci->lock, flags); | ||
| 690 | 697 | ||
| 691 | status = ehci_readl(ehci, &ehci->regs->status); | 698 | status = ehci_readl(ehci, &ehci->regs->status); |
| 692 | 699 | ||
| @@ -704,7 +711,7 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd) | |||
| 704 | 711 | ||
| 705 | /* Shared IRQ? */ | 712 | /* Shared IRQ? */ |
| 706 | if (!masked_status || unlikely(ehci->rh_state == EHCI_RH_HALTED)) { | 713 | if (!masked_status || unlikely(ehci->rh_state == EHCI_RH_HALTED)) { |
| 707 | spin_unlock(&ehci->lock); | 714 | spin_unlock_irqrestore(&ehci->lock, flags); |
| 708 | return IRQ_NONE; | 715 | return IRQ_NONE; |
| 709 | } | 716 | } |
| 710 | 717 | ||
| @@ -815,7 +822,7 @@ dead: | |||
| 815 | 822 | ||
| 816 | if (bh) | 823 | if (bh) |
| 817 | ehci_work (ehci); | 824 | ehci_work (ehci); |
| 818 | spin_unlock (&ehci->lock); | 825 | spin_unlock_irqrestore(&ehci->lock, flags); |
| 819 | if (pcd_status) | 826 | if (pcd_status) |
| 820 | usb_hcd_poll_rh_status(hcd); | 827 | usb_hcd_poll_rh_status(hcd); |
| 821 | return IRQ_HANDLED; | 828 | return IRQ_HANDLED; |
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index ee1f00f03c43..44ab12986805 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
| @@ -907,6 +907,8 @@ static const struct usb_device_id id_table_combined[] = { | |||
| 907 | /* Crucible Devices */ | 907 | /* Crucible Devices */ |
| 908 | { USB_DEVICE(FTDI_VID, FTDI_CT_COMET_PID) }, | 908 | { USB_DEVICE(FTDI_VID, FTDI_CT_COMET_PID) }, |
| 909 | { USB_DEVICE(FTDI_VID, FTDI_Z3X_PID) }, | 909 | { USB_DEVICE(FTDI_VID, FTDI_Z3X_PID) }, |
| 910 | /* Cressi Devices */ | ||
| 911 | { USB_DEVICE(FTDI_VID, FTDI_CRESSI_PID) }, | ||
| 910 | { } /* Terminating entry */ | 912 | { } /* Terminating entry */ |
| 911 | }; | 913 | }; |
| 912 | 914 | ||
diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h index 1e2d369df86e..e599fbfcde5f 100644 --- a/drivers/usb/serial/ftdi_sio_ids.h +++ b/drivers/usb/serial/ftdi_sio_ids.h | |||
| @@ -1320,3 +1320,9 @@ | |||
| 1320 | * Manufacturer: Smart GSM Team | 1320 | * Manufacturer: Smart GSM Team |
| 1321 | */ | 1321 | */ |
| 1322 | #define FTDI_Z3X_PID 0x0011 | 1322 | #define FTDI_Z3X_PID 0x0011 |
| 1323 | |||
| 1324 | /* | ||
| 1325 | * Product: Cressi PC Interface | ||
| 1326 | * Manufacturer: Cressi | ||
| 1327 | */ | ||
| 1328 | #define FTDI_CRESSI_PID 0x87d0 | ||
diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c index 4fb7a8f83c8a..54af4e933695 100644 --- a/drivers/vfio/vfio_iommu_type1.c +++ b/drivers/vfio/vfio_iommu_type1.c | |||
| @@ -186,12 +186,12 @@ static bool is_invalid_reserved_pfn(unsigned long pfn) | |||
| 186 | if (pfn_valid(pfn)) { | 186 | if (pfn_valid(pfn)) { |
| 187 | bool reserved; | 187 | bool reserved; |
| 188 | struct page *tail = pfn_to_page(pfn); | 188 | struct page *tail = pfn_to_page(pfn); |
| 189 | struct page *head = compound_trans_head(tail); | 189 | struct page *head = compound_head(tail); |
| 190 | reserved = !!(PageReserved(head)); | 190 | reserved = !!(PageReserved(head)); |
| 191 | if (head != tail) { | 191 | if (head != tail) { |
| 192 | /* | 192 | /* |
| 193 | * "head" is not a dangling pointer | 193 | * "head" is not a dangling pointer |
| 194 | * (compound_trans_head takes care of that) | 194 | * (compound_head takes care of that) |
| 195 | * but the hugepage may have been split | 195 | * but the hugepage may have been split |
| 196 | * from under us (and we may not hold a | 196 | * from under us (and we may not hold a |
| 197 | * reference count on the head page so it can | 197 | * reference count on the head page so it can |
diff --git a/drivers/vhost/scsi.c b/drivers/vhost/scsi.c index 0a025b8e2a12..e48d4a672580 100644 --- a/drivers/vhost/scsi.c +++ b/drivers/vhost/scsi.c | |||
| @@ -1001,6 +1001,12 @@ vhost_scsi_handle_vq(struct vhost_scsi *vs, struct vhost_virtqueue *vq) | |||
| 1001 | break; | 1001 | break; |
| 1002 | } | 1002 | } |
| 1003 | 1003 | ||
| 1004 | /* virtio-scsi spec requires byte 0 of the lun to be 1 */ | ||
| 1005 | if (unlikely(v_req.lun[0] != 1)) { | ||
| 1006 | vhost_scsi_send_bad_target(vs, vq, head, out); | ||
| 1007 | continue; | ||
| 1008 | } | ||
| 1009 | |||
| 1004 | /* Extract the tpgt */ | 1010 | /* Extract the tpgt */ |
| 1005 | target = v_req.lun[1]; | 1011 | target = v_req.lun[1]; |
| 1006 | tpg = ACCESS_ONCE(vs_tpg[target]); | 1012 | tpg = ACCESS_ONCE(vs_tpg[target]); |
diff --git a/fs/bio-integrity.c b/fs/bio-integrity.c index 0129b78a6908..4f70f383132c 100644 --- a/fs/bio-integrity.c +++ b/fs/bio-integrity.c | |||
| @@ -458,11 +458,10 @@ static int bio_integrity_verify(struct bio *bio) | |||
| 458 | struct blk_integrity_exchg bix; | 458 | struct blk_integrity_exchg bix; |
| 459 | struct bio_vec *bv; | 459 | struct bio_vec *bv; |
| 460 | sector_t sector = bio->bi_integrity->bip_iter.bi_sector; | 460 | sector_t sector = bio->bi_integrity->bip_iter.bi_sector; |
| 461 | unsigned int sectors, total, ret; | 461 | unsigned int sectors, ret = 0; |
| 462 | void *prot_buf = bio->bi_integrity->bip_buf; | 462 | void *prot_buf = bio->bi_integrity->bip_buf; |
| 463 | int i; | 463 | int i; |
| 464 | 464 | ||
| 465 | ret = total = 0; | ||
| 466 | bix.disk_name = bio->bi_bdev->bd_disk->disk_name; | 465 | bix.disk_name = bio->bi_bdev->bd_disk->disk_name; |
| 467 | bix.sector_size = bi->sector_size; | 466 | bix.sector_size = bi->sector_size; |
| 468 | 467 | ||
| @@ -484,8 +483,6 @@ static int bio_integrity_verify(struct bio *bio) | |||
| 484 | sectors = bv->bv_len / bi->sector_size; | 483 | sectors = bv->bv_len / bi->sector_size; |
| 485 | sector += sectors; | 484 | sector += sectors; |
| 486 | prot_buf += sectors * bi->tuple_size; | 485 | prot_buf += sectors * bi->tuple_size; |
| 487 | total += sectors * bi->tuple_size; | ||
| 488 | BUG_ON(total > bio->bi_integrity->bip_iter.bi_size); | ||
| 489 | 486 | ||
| 490 | kunmap_atomic(kaddr); | 487 | kunmap_atomic(kaddr); |
| 491 | } | 488 | } |
diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index e0259a163f98..d754e3cf99a8 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c | |||
| @@ -40,18 +40,13 @@ | |||
| 40 | struct wb_writeback_work { | 40 | struct wb_writeback_work { |
| 41 | long nr_pages; | 41 | long nr_pages; |
| 42 | struct super_block *sb; | 42 | struct super_block *sb; |
| 43 | /* | 43 | unsigned long *older_than_this; |
| 44 | * Write only inodes dirtied before this time. Don't forget to set | ||
| 45 | * older_than_this_is_set when you set this. | ||
| 46 | */ | ||
| 47 | unsigned long older_than_this; | ||
| 48 | enum writeback_sync_modes sync_mode; | 44 | enum writeback_sync_modes sync_mode; |
| 49 | unsigned int tagged_writepages:1; | 45 | unsigned int tagged_writepages:1; |
| 50 | unsigned int for_kupdate:1; | 46 | unsigned int for_kupdate:1; |
| 51 | unsigned int range_cyclic:1; | 47 | unsigned int range_cyclic:1; |
| 52 | unsigned int for_background:1; | 48 | unsigned int for_background:1; |
| 53 | unsigned int for_sync:1; /* sync(2) WB_SYNC_ALL writeback */ | 49 | unsigned int for_sync:1; /* sync(2) WB_SYNC_ALL writeback */ |
| 54 | unsigned int older_than_this_is_set:1; | ||
| 55 | enum wb_reason reason; /* why was writeback initiated? */ | 50 | enum wb_reason reason; /* why was writeback initiated? */ |
| 56 | 51 | ||
| 57 | struct list_head list; /* pending work list */ | 52 | struct list_head list; /* pending work list */ |
| @@ -252,10 +247,10 @@ static int move_expired_inodes(struct list_head *delaying_queue, | |||
| 252 | int do_sb_sort = 0; | 247 | int do_sb_sort = 0; |
| 253 | int moved = 0; | 248 | int moved = 0; |
| 254 | 249 | ||
| 255 | WARN_ON_ONCE(!work->older_than_this_is_set); | ||
| 256 | while (!list_empty(delaying_queue)) { | 250 | while (!list_empty(delaying_queue)) { |
| 257 | inode = wb_inode(delaying_queue->prev); | 251 | inode = wb_inode(delaying_queue->prev); |
| 258 | if (inode_dirtied_after(inode, work->older_than_this)) | 252 | if (work->older_than_this && |
| 253 | inode_dirtied_after(inode, *work->older_than_this)) | ||
| 259 | break; | 254 | break; |
| 260 | list_move(&inode->i_wb_list, &tmp); | 255 | list_move(&inode->i_wb_list, &tmp); |
| 261 | moved++; | 256 | moved++; |
| @@ -742,8 +737,6 @@ static long writeback_inodes_wb(struct bdi_writeback *wb, long nr_pages, | |||
| 742 | .sync_mode = WB_SYNC_NONE, | 737 | .sync_mode = WB_SYNC_NONE, |
| 743 | .range_cyclic = 1, | 738 | .range_cyclic = 1, |
| 744 | .reason = reason, | 739 | .reason = reason, |
| 745 | .older_than_this = jiffies, | ||
| 746 | .older_than_this_is_set = 1, | ||
| 747 | }; | 740 | }; |
| 748 | 741 | ||
| 749 | spin_lock(&wb->list_lock); | 742 | spin_lock(&wb->list_lock); |
| @@ -802,13 +795,12 @@ static long wb_writeback(struct bdi_writeback *wb, | |||
| 802 | { | 795 | { |
| 803 | unsigned long wb_start = jiffies; | 796 | unsigned long wb_start = jiffies; |
| 804 | long nr_pages = work->nr_pages; | 797 | long nr_pages = work->nr_pages; |
| 798 | unsigned long oldest_jif; | ||
| 805 | struct inode *inode; | 799 | struct inode *inode; |
| 806 | long progress; | 800 | long progress; |
| 807 | 801 | ||
| 808 | if (!work->older_than_this_is_set) { | 802 | oldest_jif = jiffies; |
| 809 | work->older_than_this = jiffies; | 803 | work->older_than_this = &oldest_jif; |
| 810 | work->older_than_this_is_set = 1; | ||
| 811 | } | ||
| 812 | 804 | ||
| 813 | spin_lock(&wb->list_lock); | 805 | spin_lock(&wb->list_lock); |
| 814 | for (;;) { | 806 | for (;;) { |
| @@ -842,10 +834,10 @@ static long wb_writeback(struct bdi_writeback *wb, | |||
| 842 | * safe. | 834 | * safe. |
| 843 | */ | 835 | */ |
| 844 | if (work->for_kupdate) { | 836 | if (work->for_kupdate) { |
| 845 | work->older_than_this = jiffies - | 837 | oldest_jif = jiffies - |
| 846 | msecs_to_jiffies(dirty_expire_interval * 10); | 838 | msecs_to_jiffies(dirty_expire_interval * 10); |
| 847 | } else if (work->for_background) | 839 | } else if (work->for_background) |
| 848 | work->older_than_this = jiffies; | 840 | oldest_jif = jiffies; |
| 849 | 841 | ||
| 850 | trace_writeback_start(wb->bdi, work); | 842 | trace_writeback_start(wb->bdi, work); |
| 851 | if (list_empty(&wb->b_io)) | 843 | if (list_empty(&wb->b_io)) |
| @@ -1357,21 +1349,18 @@ EXPORT_SYMBOL(try_to_writeback_inodes_sb); | |||
| 1357 | 1349 | ||
| 1358 | /** | 1350 | /** |
| 1359 | * sync_inodes_sb - sync sb inode pages | 1351 | * sync_inodes_sb - sync sb inode pages |
| 1360 | * @sb: the superblock | 1352 | * @sb: the superblock |
| 1361 | * @older_than_this: timestamp | ||
| 1362 | * | 1353 | * |
| 1363 | * This function writes and waits on any dirty inode belonging to this | 1354 | * This function writes and waits on any dirty inode belonging to this |
| 1364 | * superblock that has been dirtied before given timestamp. | 1355 | * super_block. |
| 1365 | */ | 1356 | */ |
| 1366 | void sync_inodes_sb(struct super_block *sb, unsigned long older_than_this) | 1357 | void sync_inodes_sb(struct super_block *sb) |
| 1367 | { | 1358 | { |
| 1368 | DECLARE_COMPLETION_ONSTACK(done); | 1359 | DECLARE_COMPLETION_ONSTACK(done); |
| 1369 | struct wb_writeback_work work = { | 1360 | struct wb_writeback_work work = { |
| 1370 | .sb = sb, | 1361 | .sb = sb, |
| 1371 | .sync_mode = WB_SYNC_ALL, | 1362 | .sync_mode = WB_SYNC_ALL, |
| 1372 | .nr_pages = LONG_MAX, | 1363 | .nr_pages = LONG_MAX, |
| 1373 | .older_than_this = older_than_this, | ||
| 1374 | .older_than_this_is_set = 1, | ||
| 1375 | .range_cyclic = 0, | 1364 | .range_cyclic = 0, |
| 1376 | .done = &done, | 1365 | .done = &done, |
| 1377 | .reason = WB_REASON_SYNC, | 1366 | .reason = WB_REASON_SYNC, |
diff --git a/fs/hfsplus/options.c b/fs/hfsplus/options.c index 968eab5bc1f5..68537e8b7a09 100644 --- a/fs/hfsplus/options.c +++ b/fs/hfsplus/options.c | |||
| @@ -75,7 +75,7 @@ int hfsplus_parse_options_remount(char *input, int *force) | |||
| 75 | int token; | 75 | int token; |
| 76 | 76 | ||
| 77 | if (!input) | 77 | if (!input) |
| 78 | return 0; | 78 | return 1; |
| 79 | 79 | ||
| 80 | while ((p = strsep(&input, ",")) != NULL) { | 80 | while ((p = strsep(&input, ",")) != NULL) { |
| 81 | if (!*p) | 81 | if (!*p) |
diff --git a/fs/kernfs/mount.c b/fs/kernfs/mount.c index 0d6ce895a9ee..0f4152defe7b 100644 --- a/fs/kernfs/mount.c +++ b/fs/kernfs/mount.c | |||
| @@ -94,6 +94,7 @@ const void *kernfs_super_ns(struct super_block *sb) | |||
| 94 | * @fs_type: file_system_type of the fs being mounted | 94 | * @fs_type: file_system_type of the fs being mounted |
| 95 | * @flags: mount flags specified for the mount | 95 | * @flags: mount flags specified for the mount |
| 96 | * @root: kernfs_root of the hierarchy being mounted | 96 | * @root: kernfs_root of the hierarchy being mounted |
| 97 | * @new_sb_created: tell the caller if we allocated a new superblock | ||
| 97 | * @ns: optional namespace tag of the mount | 98 | * @ns: optional namespace tag of the mount |
| 98 | * | 99 | * |
| 99 | * This is to be called from each kernfs user's file_system_type->mount() | 100 | * This is to be called from each kernfs user's file_system_type->mount() |
| @@ -104,7 +105,8 @@ const void *kernfs_super_ns(struct super_block *sb) | |||
| 104 | * The return value can be passed to the vfs layer verbatim. | 105 | * The return value can be passed to the vfs layer verbatim. |
| 105 | */ | 106 | */ |
| 106 | struct dentry *kernfs_mount_ns(struct file_system_type *fs_type, int flags, | 107 | struct dentry *kernfs_mount_ns(struct file_system_type *fs_type, int flags, |
| 107 | struct kernfs_root *root, const void *ns) | 108 | struct kernfs_root *root, bool *new_sb_created, |
| 109 | const void *ns) | ||
| 108 | { | 110 | { |
| 109 | struct super_block *sb; | 111 | struct super_block *sb; |
| 110 | struct kernfs_super_info *info; | 112 | struct kernfs_super_info *info; |
| @@ -122,6 +124,10 @@ struct dentry *kernfs_mount_ns(struct file_system_type *fs_type, int flags, | |||
| 122 | kfree(info); | 124 | kfree(info); |
| 123 | if (IS_ERR(sb)) | 125 | if (IS_ERR(sb)) |
| 124 | return ERR_CAST(sb); | 126 | return ERR_CAST(sb); |
| 127 | |||
| 128 | if (new_sb_created) | ||
| 129 | *new_sb_created = !sb->s_root; | ||
| 130 | |||
| 125 | if (!sb->s_root) { | 131 | if (!sb->s_root) { |
| 126 | error = kernfs_fill_super(sb); | 132 | error = kernfs_fill_super(sb); |
| 127 | if (error) { | 133 | if (error) { |
diff --git a/fs/notify/dnotify/dnotify.c b/fs/notify/dnotify/dnotify.c index 0b9ff4395e6a..abc8cbcfe90e 100644 --- a/fs/notify/dnotify/dnotify.c +++ b/fs/notify/dnotify/dnotify.c | |||
| @@ -86,7 +86,7 @@ static int dnotify_handle_event(struct fsnotify_group *group, | |||
| 86 | struct fsnotify_mark *inode_mark, | 86 | struct fsnotify_mark *inode_mark, |
| 87 | struct fsnotify_mark *vfsmount_mark, | 87 | struct fsnotify_mark *vfsmount_mark, |
| 88 | u32 mask, void *data, int data_type, | 88 | u32 mask, void *data, int data_type, |
| 89 | const unsigned char *file_name) | 89 | const unsigned char *file_name, u32 cookie) |
| 90 | { | 90 | { |
| 91 | struct dnotify_mark *dn_mark; | 91 | struct dnotify_mark *dn_mark; |
| 92 | struct dnotify_struct *dn; | 92 | struct dnotify_struct *dn; |
diff --git a/fs/notify/fanotify/fanotify.c b/fs/notify/fanotify/fanotify.c index 0e792f5e3147..dc638f786d5c 100644 --- a/fs/notify/fanotify/fanotify.c +++ b/fs/notify/fanotify/fanotify.c | |||
| @@ -147,7 +147,7 @@ static int fanotify_handle_event(struct fsnotify_group *group, | |||
| 147 | struct fsnotify_mark *inode_mark, | 147 | struct fsnotify_mark *inode_mark, |
| 148 | struct fsnotify_mark *fanotify_mark, | 148 | struct fsnotify_mark *fanotify_mark, |
| 149 | u32 mask, void *data, int data_type, | 149 | u32 mask, void *data, int data_type, |
| 150 | const unsigned char *file_name) | 150 | const unsigned char *file_name, u32 cookie) |
| 151 | { | 151 | { |
| 152 | int ret = 0; | 152 | int ret = 0; |
| 153 | struct fanotify_event_info *event; | 153 | struct fanotify_event_info *event; |
| @@ -192,10 +192,12 @@ static int fanotify_handle_event(struct fsnotify_group *group, | |||
| 192 | 192 | ||
| 193 | ret = fsnotify_add_notify_event(group, fsn_event, fanotify_merge); | 193 | ret = fsnotify_add_notify_event(group, fsn_event, fanotify_merge); |
| 194 | if (ret) { | 194 | if (ret) { |
| 195 | BUG_ON(mask & FAN_ALL_PERM_EVENTS); | 195 | /* Permission events shouldn't be merged */ |
| 196 | BUG_ON(ret == 1 && mask & FAN_ALL_PERM_EVENTS); | ||
| 196 | /* Our event wasn't used in the end. Free it. */ | 197 | /* Our event wasn't used in the end. Free it. */ |
| 197 | fsnotify_destroy_event(group, fsn_event); | 198 | fsnotify_destroy_event(group, fsn_event); |
| 198 | ret = 0; | 199 | |
| 200 | return 0; | ||
| 199 | } | 201 | } |
| 200 | 202 | ||
| 201 | #ifdef CONFIG_FANOTIFY_ACCESS_PERMISSIONS | 203 | #ifdef CONFIG_FANOTIFY_ACCESS_PERMISSIONS |
diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c index b6175fa11bf8..287a22c04149 100644 --- a/fs/notify/fanotify/fanotify_user.c +++ b/fs/notify/fanotify/fanotify_user.c | |||
| @@ -698,6 +698,7 @@ SYSCALL_DEFINE2(fanotify_init, unsigned int, flags, unsigned int, event_f_flags) | |||
| 698 | struct fsnotify_group *group; | 698 | struct fsnotify_group *group; |
| 699 | int f_flags, fd; | 699 | int f_flags, fd; |
| 700 | struct user_struct *user; | 700 | struct user_struct *user; |
| 701 | struct fanotify_event_info *oevent; | ||
| 701 | 702 | ||
| 702 | pr_debug("%s: flags=%d event_f_flags=%d\n", | 703 | pr_debug("%s: flags=%d event_f_flags=%d\n", |
| 703 | __func__, flags, event_f_flags); | 704 | __func__, flags, event_f_flags); |
| @@ -730,8 +731,20 @@ SYSCALL_DEFINE2(fanotify_init, unsigned int, flags, unsigned int, event_f_flags) | |||
| 730 | group->fanotify_data.user = user; | 731 | group->fanotify_data.user = user; |
| 731 | atomic_inc(&user->fanotify_listeners); | 732 | atomic_inc(&user->fanotify_listeners); |
| 732 | 733 | ||
| 734 | oevent = kmem_cache_alloc(fanotify_event_cachep, GFP_KERNEL); | ||
| 735 | if (unlikely(!oevent)) { | ||
| 736 | fd = -ENOMEM; | ||
| 737 | goto out_destroy_group; | ||
| 738 | } | ||
| 739 | group->overflow_event = &oevent->fse; | ||
| 740 | fsnotify_init_event(group->overflow_event, NULL, FS_Q_OVERFLOW); | ||
| 741 | oevent->tgid = get_pid(task_tgid(current)); | ||
| 742 | oevent->path.mnt = NULL; | ||
| 743 | oevent->path.dentry = NULL; | ||
| 744 | |||
| 733 | group->fanotify_data.f_flags = event_f_flags; | 745 | group->fanotify_data.f_flags = event_f_flags; |
| 734 | #ifdef CONFIG_FANOTIFY_ACCESS_PERMISSIONS | 746 | #ifdef CONFIG_FANOTIFY_ACCESS_PERMISSIONS |
| 747 | oevent->response = 0; | ||
| 735 | mutex_init(&group->fanotify_data.access_mutex); | 748 | mutex_init(&group->fanotify_data.access_mutex); |
| 736 | init_waitqueue_head(&group->fanotify_data.access_waitq); | 749 | init_waitqueue_head(&group->fanotify_data.access_waitq); |
| 737 | INIT_LIST_HEAD(&group->fanotify_data.access_list); | 750 | INIT_LIST_HEAD(&group->fanotify_data.access_list); |
diff --git a/fs/notify/fsnotify.c b/fs/notify/fsnotify.c index 1d4e1ea2f37c..9d3e9c50066a 100644 --- a/fs/notify/fsnotify.c +++ b/fs/notify/fsnotify.c | |||
| @@ -179,7 +179,7 @@ static int send_to_group(struct inode *to_tell, | |||
| 179 | 179 | ||
| 180 | return group->ops->handle_event(group, to_tell, inode_mark, | 180 | return group->ops->handle_event(group, to_tell, inode_mark, |
| 181 | vfsmount_mark, mask, data, data_is, | 181 | vfsmount_mark, mask, data, data_is, |
| 182 | file_name); | 182 | file_name, cookie); |
| 183 | } | 183 | } |
| 184 | 184 | ||
| 185 | /* | 185 | /* |
diff --git a/fs/notify/group.c b/fs/notify/group.c index ee674fe2cec7..ad1995980456 100644 --- a/fs/notify/group.c +++ b/fs/notify/group.c | |||
| @@ -55,6 +55,13 @@ void fsnotify_destroy_group(struct fsnotify_group *group) | |||
| 55 | /* clear the notification queue of all events */ | 55 | /* clear the notification queue of all events */ |
| 56 | fsnotify_flush_notify(group); | 56 | fsnotify_flush_notify(group); |
| 57 | 57 | ||
| 58 | /* | ||
| 59 | * Destroy overflow event (we cannot use fsnotify_destroy_event() as | ||
| 60 | * that deliberately ignores overflow events. | ||
| 61 | */ | ||
| 62 | if (group->overflow_event) | ||
| 63 | group->ops->free_event(group->overflow_event); | ||
| 64 | |||
| 58 | fsnotify_put_group(group); | 65 | fsnotify_put_group(group); |
| 59 | } | 66 | } |
| 60 | 67 | ||
| @@ -99,7 +106,6 @@ struct fsnotify_group *fsnotify_alloc_group(const struct fsnotify_ops *ops) | |||
| 99 | INIT_LIST_HEAD(&group->marks_list); | 106 | INIT_LIST_HEAD(&group->marks_list); |
| 100 | 107 | ||
| 101 | group->ops = ops; | 108 | group->ops = ops; |
| 102 | fsnotify_init_event(&group->overflow_event, NULL, FS_Q_OVERFLOW); | ||
| 103 | 109 | ||
| 104 | return group; | 110 | return group; |
| 105 | } | 111 | } |
diff --git a/fs/notify/inotify/inotify.h b/fs/notify/inotify/inotify.h index 485eef3f4407..ed855ef6f077 100644 --- a/fs/notify/inotify/inotify.h +++ b/fs/notify/inotify/inotify.h | |||
| @@ -27,6 +27,6 @@ extern int inotify_handle_event(struct fsnotify_group *group, | |||
| 27 | struct fsnotify_mark *inode_mark, | 27 | struct fsnotify_mark *inode_mark, |
| 28 | struct fsnotify_mark *vfsmount_mark, | 28 | struct fsnotify_mark *vfsmount_mark, |
| 29 | u32 mask, void *data, int data_type, | 29 | u32 mask, void *data, int data_type, |
| 30 | const unsigned char *file_name); | 30 | const unsigned char *file_name, u32 cookie); |
| 31 | 31 | ||
| 32 | extern const struct fsnotify_ops inotify_fsnotify_ops; | 32 | extern const struct fsnotify_ops inotify_fsnotify_ops; |
diff --git a/fs/notify/inotify/inotify_fsnotify.c b/fs/notify/inotify/inotify_fsnotify.c index d5ee56348bb8..43ab1e1a07a2 100644 --- a/fs/notify/inotify/inotify_fsnotify.c +++ b/fs/notify/inotify/inotify_fsnotify.c | |||
| @@ -67,7 +67,7 @@ int inotify_handle_event(struct fsnotify_group *group, | |||
| 67 | struct fsnotify_mark *inode_mark, | 67 | struct fsnotify_mark *inode_mark, |
| 68 | struct fsnotify_mark *vfsmount_mark, | 68 | struct fsnotify_mark *vfsmount_mark, |
| 69 | u32 mask, void *data, int data_type, | 69 | u32 mask, void *data, int data_type, |
| 70 | const unsigned char *file_name) | 70 | const unsigned char *file_name, u32 cookie) |
| 71 | { | 71 | { |
| 72 | struct inotify_inode_mark *i_mark; | 72 | struct inotify_inode_mark *i_mark; |
| 73 | struct inotify_event_info *event; | 73 | struct inotify_event_info *event; |
| @@ -103,6 +103,7 @@ int inotify_handle_event(struct fsnotify_group *group, | |||
| 103 | fsn_event = &event->fse; | 103 | fsn_event = &event->fse; |
| 104 | fsnotify_init_event(fsn_event, inode, mask); | 104 | fsnotify_init_event(fsn_event, inode, mask); |
| 105 | event->wd = i_mark->wd; | 105 | event->wd = i_mark->wd; |
| 106 | event->sync_cookie = cookie; | ||
| 106 | event->name_len = len; | 107 | event->name_len = len; |
| 107 | if (len) | 108 | if (len) |
| 108 | strcpy(event->name, file_name); | 109 | strcpy(event->name, file_name); |
diff --git a/fs/notify/inotify/inotify_user.c b/fs/notify/inotify/inotify_user.c index 497395c8274b..78a2ca3966c3 100644 --- a/fs/notify/inotify/inotify_user.c +++ b/fs/notify/inotify/inotify_user.c | |||
| @@ -495,7 +495,7 @@ void inotify_ignored_and_remove_idr(struct fsnotify_mark *fsn_mark, | |||
| 495 | 495 | ||
| 496 | /* Queue ignore event for the watch */ | 496 | /* Queue ignore event for the watch */ |
| 497 | inotify_handle_event(group, NULL, fsn_mark, NULL, FS_IN_IGNORED, | 497 | inotify_handle_event(group, NULL, fsn_mark, NULL, FS_IN_IGNORED, |
| 498 | NULL, FSNOTIFY_EVENT_NONE, NULL); | 498 | NULL, FSNOTIFY_EVENT_NONE, NULL, 0); |
| 499 | 499 | ||
| 500 | i_mark = container_of(fsn_mark, struct inotify_inode_mark, fsn_mark); | 500 | i_mark = container_of(fsn_mark, struct inotify_inode_mark, fsn_mark); |
| 501 | /* remove this mark from the idr */ | 501 | /* remove this mark from the idr */ |
| @@ -633,11 +633,23 @@ static int inotify_update_watch(struct fsnotify_group *group, struct inode *inod | |||
| 633 | static struct fsnotify_group *inotify_new_group(unsigned int max_events) | 633 | static struct fsnotify_group *inotify_new_group(unsigned int max_events) |
| 634 | { | 634 | { |
| 635 | struct fsnotify_group *group; | 635 | struct fsnotify_group *group; |
| 636 | struct inotify_event_info *oevent; | ||
| 636 | 637 | ||
| 637 | group = fsnotify_alloc_group(&inotify_fsnotify_ops); | 638 | group = fsnotify_alloc_group(&inotify_fsnotify_ops); |
| 638 | if (IS_ERR(group)) | 639 | if (IS_ERR(group)) |
| 639 | return group; | 640 | return group; |
| 640 | 641 | ||
| 642 | oevent = kmalloc(sizeof(struct inotify_event_info), GFP_KERNEL); | ||
| 643 | if (unlikely(!oevent)) { | ||
| 644 | fsnotify_destroy_group(group); | ||
| 645 | return ERR_PTR(-ENOMEM); | ||
| 646 | } | ||
| 647 | group->overflow_event = &oevent->fse; | ||
| 648 | fsnotify_init_event(group->overflow_event, NULL, FS_Q_OVERFLOW); | ||
| 649 | oevent->wd = -1; | ||
| 650 | oevent->sync_cookie = 0; | ||
| 651 | oevent->name_len = 0; | ||
| 652 | |||
| 641 | group->max_events = max_events; | 653 | group->max_events = max_events; |
| 642 | 654 | ||
| 643 | spin_lock_init(&group->inotify_data.idr_lock); | 655 | spin_lock_init(&group->inotify_data.idr_lock); |
diff --git a/fs/notify/notification.c b/fs/notify/notification.c index 18b3c4427dca..1e58402171a5 100644 --- a/fs/notify/notification.c +++ b/fs/notify/notification.c | |||
| @@ -80,7 +80,8 @@ void fsnotify_destroy_event(struct fsnotify_group *group, | |||
| 80 | /* | 80 | /* |
| 81 | * Add an event to the group notification queue. The group can later pull this | 81 | * Add an event to the group notification queue. The group can later pull this |
| 82 | * event off the queue to deal with. The function returns 0 if the event was | 82 | * event off the queue to deal with. The function returns 0 if the event was |
| 83 | * added to the queue, 1 if the event was merged with some other queued event. | 83 | * added to the queue, 1 if the event was merged with some other queued event, |
| 84 | * 2 if the queue of events has overflown. | ||
| 84 | */ | 85 | */ |
| 85 | int fsnotify_add_notify_event(struct fsnotify_group *group, | 86 | int fsnotify_add_notify_event(struct fsnotify_group *group, |
| 86 | struct fsnotify_event *event, | 87 | struct fsnotify_event *event, |
| @@ -95,10 +96,14 @@ int fsnotify_add_notify_event(struct fsnotify_group *group, | |||
| 95 | mutex_lock(&group->notification_mutex); | 96 | mutex_lock(&group->notification_mutex); |
| 96 | 97 | ||
| 97 | if (group->q_len >= group->max_events) { | 98 | if (group->q_len >= group->max_events) { |
| 99 | ret = 2; | ||
| 98 | /* Queue overflow event only if it isn't already queued */ | 100 | /* Queue overflow event only if it isn't already queued */ |
| 99 | if (list_empty(&group->overflow_event.list)) | 101 | if (!list_empty(&group->overflow_event->list)) { |
| 100 | event = &group->overflow_event; | 102 | mutex_unlock(&group->notification_mutex); |
| 101 | ret = 1; | 103 | return ret; |
| 104 | } | ||
| 105 | event = group->overflow_event; | ||
| 106 | goto queue; | ||
| 102 | } | 107 | } |
| 103 | 108 | ||
| 104 | if (!list_empty(list) && merge) { | 109 | if (!list_empty(list) && merge) { |
| @@ -109,6 +114,7 @@ int fsnotify_add_notify_event(struct fsnotify_group *group, | |||
| 109 | } | 114 | } |
| 110 | } | 115 | } |
| 111 | 116 | ||
| 117 | queue: | ||
| 112 | group->q_len++; | 118 | group->q_len++; |
| 113 | list_add_tail(&event->list, list); | 119 | list_add_tail(&event->list, list); |
| 114 | mutex_unlock(&group->notification_mutex); | 120 | mutex_unlock(&group->notification_mutex); |
| @@ -132,7 +138,11 @@ struct fsnotify_event *fsnotify_remove_notify_event(struct fsnotify_group *group | |||
| 132 | 138 | ||
| 133 | event = list_first_entry(&group->notification_list, | 139 | event = list_first_entry(&group->notification_list, |
| 134 | struct fsnotify_event, list); | 140 | struct fsnotify_event, list); |
| 135 | list_del(&event->list); | 141 | /* |
| 142 | * We need to init list head for the case of overflow event so that | ||
| 143 | * check in fsnotify_add_notify_events() works | ||
| 144 | */ | ||
| 145 | list_del_init(&event->list); | ||
| 136 | group->q_len--; | 146 | group->q_len--; |
| 137 | 147 | ||
| 138 | return event; | 148 | return event; |
diff --git a/fs/ocfs2/quota_global.c b/fs/ocfs2/quota_global.c index aaa50611ec66..d7b5108789e2 100644 --- a/fs/ocfs2/quota_global.c +++ b/fs/ocfs2/quota_global.c | |||
| @@ -717,6 +717,12 @@ static int ocfs2_release_dquot(struct dquot *dquot) | |||
| 717 | */ | 717 | */ |
| 718 | if (status < 0) | 718 | if (status < 0) |
| 719 | mlog_errno(status); | 719 | mlog_errno(status); |
| 720 | /* | ||
| 721 | * Clear dq_off so that we search for the structure in quota file next | ||
| 722 | * time we acquire it. The structure might be deleted and reallocated | ||
| 723 | * elsewhere by another node while our dquot structure is on freelist. | ||
| 724 | */ | ||
| 725 | dquot->dq_off = 0; | ||
| 720 | clear_bit(DQ_ACTIVE_B, &dquot->dq_flags); | 726 | clear_bit(DQ_ACTIVE_B, &dquot->dq_flags); |
| 721 | out_trans: | 727 | out_trans: |
| 722 | ocfs2_commit_trans(osb, handle); | 728 | ocfs2_commit_trans(osb, handle); |
| @@ -756,16 +762,17 @@ static int ocfs2_acquire_dquot(struct dquot *dquot) | |||
| 756 | status = ocfs2_lock_global_qf(info, 1); | 762 | status = ocfs2_lock_global_qf(info, 1); |
| 757 | if (status < 0) | 763 | if (status < 0) |
| 758 | goto out; | 764 | goto out; |
| 759 | if (!test_bit(DQ_READ_B, &dquot->dq_flags)) { | 765 | status = ocfs2_qinfo_lock(info, 0); |
| 760 | status = ocfs2_qinfo_lock(info, 0); | 766 | if (status < 0) |
| 761 | if (status < 0) | 767 | goto out_dq; |
| 762 | goto out_dq; | 768 | /* |
| 763 | status = qtree_read_dquot(&info->dqi_gi, dquot); | 769 | * We always want to read dquot structure from disk because we don't |
| 764 | ocfs2_qinfo_unlock(info, 0); | 770 | * know what happened with it while it was on freelist. |
| 765 | if (status < 0) | 771 | */ |
| 766 | goto out_dq; | 772 | status = qtree_read_dquot(&info->dqi_gi, dquot); |
| 767 | } | 773 | ocfs2_qinfo_unlock(info, 0); |
| 768 | set_bit(DQ_READ_B, &dquot->dq_flags); | 774 | if (status < 0) |
| 775 | goto out_dq; | ||
| 769 | 776 | ||
| 770 | OCFS2_DQUOT(dquot)->dq_use_count++; | 777 | OCFS2_DQUOT(dquot)->dq_use_count++; |
| 771 | OCFS2_DQUOT(dquot)->dq_origspace = dquot->dq_dqb.dqb_curspace; | 778 | OCFS2_DQUOT(dquot)->dq_origspace = dquot->dq_dqb.dqb_curspace; |
diff --git a/fs/ocfs2/quota_local.c b/fs/ocfs2/quota_local.c index 2e4344be3b96..2001862bf2b1 100644 --- a/fs/ocfs2/quota_local.c +++ b/fs/ocfs2/quota_local.c | |||
| @@ -1303,10 +1303,6 @@ int ocfs2_local_release_dquot(handle_t *handle, struct dquot *dquot) | |||
| 1303 | ocfs2_journal_dirty(handle, od->dq_chunk->qc_headerbh); | 1303 | ocfs2_journal_dirty(handle, od->dq_chunk->qc_headerbh); |
| 1304 | 1304 | ||
| 1305 | out: | 1305 | out: |
| 1306 | /* Clear the read bit so that next time someone uses this | ||
| 1307 | * dquot he reads fresh info from disk and allocates local | ||
| 1308 | * dquot structure */ | ||
| 1309 | clear_bit(DQ_READ_B, &dquot->dq_flags); | ||
| 1310 | return status; | 1306 | return status; |
| 1311 | } | 1307 | } |
| 1312 | 1308 | ||
diff --git a/fs/proc/page.c b/fs/proc/page.c index 02174a610315..e647c55275d9 100644 --- a/fs/proc/page.c +++ b/fs/proc/page.c | |||
| @@ -121,9 +121,8 @@ u64 stable_page_flags(struct page *page) | |||
| 121 | * just checks PG_head/PG_tail, so we need to check PageLRU/PageAnon | 121 | * just checks PG_head/PG_tail, so we need to check PageLRU/PageAnon |
| 122 | * to make sure a given page is a thp, not a non-huge compound page. | 122 | * to make sure a given page is a thp, not a non-huge compound page. |
| 123 | */ | 123 | */ |
| 124 | else if (PageTransCompound(page) && | 124 | else if (PageTransCompound(page) && (PageLRU(compound_head(page)) || |
| 125 | (PageLRU(compound_trans_head(page)) || | 125 | PageAnon(compound_head(page)))) |
| 126 | PageAnon(compound_trans_head(page)))) | ||
| 127 | u |= 1 << KPF_THP; | 126 | u |= 1 << KPF_THP; |
| 128 | 127 | ||
| 129 | /* | 128 | /* |
diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index 831d49a4111f..cfc8dcc16043 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c | |||
| @@ -581,9 +581,17 @@ int dquot_scan_active(struct super_block *sb, | |||
| 581 | dqstats_inc(DQST_LOOKUPS); | 581 | dqstats_inc(DQST_LOOKUPS); |
| 582 | dqput(old_dquot); | 582 | dqput(old_dquot); |
| 583 | old_dquot = dquot; | 583 | old_dquot = dquot; |
| 584 | ret = fn(dquot, priv); | 584 | /* |
| 585 | if (ret < 0) | 585 | * ->release_dquot() can be racing with us. Our reference |
| 586 | goto out; | 586 | * protects us from new calls to it so just wait for any |
| 587 | * outstanding call and recheck the DQ_ACTIVE_B after that. | ||
| 588 | */ | ||
| 589 | wait_on_dquot(dquot); | ||
| 590 | if (test_bit(DQ_ACTIVE_B, &dquot->dq_flags)) { | ||
| 591 | ret = fn(dquot, priv); | ||
| 592 | if (ret < 0) | ||
| 593 | goto out; | ||
| 594 | } | ||
| 587 | spin_lock(&dq_list_lock); | 595 | spin_lock(&dq_list_lock); |
| 588 | /* We are safe to continue now because our dquot could not | 596 | /* We are safe to continue now because our dquot could not |
| 589 | * be moved out of the inuse list while we hold the reference */ | 597 | * be moved out of the inuse list while we hold the reference */ |
| @@ -27,11 +27,10 @@ | |||
| 27 | * wait == 1 case since in that case write_inode() functions do | 27 | * wait == 1 case since in that case write_inode() functions do |
| 28 | * sync_dirty_buffer() and thus effectively write one block at a time. | 28 | * sync_dirty_buffer() and thus effectively write one block at a time. |
| 29 | */ | 29 | */ |
| 30 | static int __sync_filesystem(struct super_block *sb, int wait, | 30 | static int __sync_filesystem(struct super_block *sb, int wait) |
| 31 | unsigned long start) | ||
| 32 | { | 31 | { |
| 33 | if (wait) | 32 | if (wait) |
| 34 | sync_inodes_sb(sb, start); | 33 | sync_inodes_sb(sb); |
| 35 | else | 34 | else |
| 36 | writeback_inodes_sb(sb, WB_REASON_SYNC); | 35 | writeback_inodes_sb(sb, WB_REASON_SYNC); |
| 37 | 36 | ||
| @@ -48,7 +47,6 @@ static int __sync_filesystem(struct super_block *sb, int wait, | |||
| 48 | int sync_filesystem(struct super_block *sb) | 47 | int sync_filesystem(struct super_block *sb) |
| 49 | { | 48 | { |
| 50 | int ret; | 49 | int ret; |
| 51 | unsigned long start = jiffies; | ||
| 52 | 50 | ||
| 53 | /* | 51 | /* |
| 54 | * We need to be protected against the filesystem going from | 52 | * We need to be protected against the filesystem going from |
| @@ -62,17 +60,17 @@ int sync_filesystem(struct super_block *sb) | |||
| 62 | if (sb->s_flags & MS_RDONLY) | 60 | if (sb->s_flags & MS_RDONLY) |
| 63 | return 0; | 61 | return 0; |
| 64 | 62 | ||
| 65 | ret = __sync_filesystem(sb, 0, start); | 63 | ret = __sync_filesystem(sb, 0); |
| 66 | if (ret < 0) | 64 | if (ret < 0) |
| 67 | return ret; | 65 | return ret; |
| 68 | return __sync_filesystem(sb, 1, start); | 66 | return __sync_filesystem(sb, 1); |
| 69 | } | 67 | } |
| 70 | EXPORT_SYMBOL_GPL(sync_filesystem); | 68 | EXPORT_SYMBOL_GPL(sync_filesystem); |
| 71 | 69 | ||
| 72 | static void sync_inodes_one_sb(struct super_block *sb, void *arg) | 70 | static void sync_inodes_one_sb(struct super_block *sb, void *arg) |
| 73 | { | 71 | { |
| 74 | if (!(sb->s_flags & MS_RDONLY)) | 72 | if (!(sb->s_flags & MS_RDONLY)) |
| 75 | sync_inodes_sb(sb, *((unsigned long *)arg)); | 73 | sync_inodes_sb(sb); |
| 76 | } | 74 | } |
| 77 | 75 | ||
| 78 | static void sync_fs_one_sb(struct super_block *sb, void *arg) | 76 | static void sync_fs_one_sb(struct super_block *sb, void *arg) |
| @@ -104,10 +102,9 @@ static void fdatawait_one_bdev(struct block_device *bdev, void *arg) | |||
| 104 | SYSCALL_DEFINE0(sync) | 102 | SYSCALL_DEFINE0(sync) |
| 105 | { | 103 | { |
| 106 | int nowait = 0, wait = 1; | 104 | int nowait = 0, wait = 1; |
| 107 | unsigned long start = jiffies; | ||
| 108 | 105 | ||
| 109 | wakeup_flusher_threads(0, WB_REASON_SYNC); | 106 | wakeup_flusher_threads(0, WB_REASON_SYNC); |
| 110 | iterate_supers(sync_inodes_one_sb, &start); | 107 | iterate_supers(sync_inodes_one_sb, NULL); |
| 111 | iterate_supers(sync_fs_one_sb, &nowait); | 108 | iterate_supers(sync_fs_one_sb, &nowait); |
| 112 | iterate_supers(sync_fs_one_sb, &wait); | 109 | iterate_supers(sync_fs_one_sb, &wait); |
| 113 | iterate_bdevs(fdatawrite_one_bdev, NULL); | 110 | iterate_bdevs(fdatawrite_one_bdev, NULL); |
diff --git a/fs/sysfs/mount.c b/fs/sysfs/mount.c index 6211230814fd..3eaf5c6622eb 100644 --- a/fs/sysfs/mount.c +++ b/fs/sysfs/mount.c | |||
| @@ -27,6 +27,7 @@ static struct dentry *sysfs_mount(struct file_system_type *fs_type, | |||
| 27 | { | 27 | { |
| 28 | struct dentry *root; | 28 | struct dentry *root; |
| 29 | void *ns; | 29 | void *ns; |
| 30 | bool new_sb; | ||
| 30 | 31 | ||
| 31 | if (!(flags & MS_KERNMOUNT)) { | 32 | if (!(flags & MS_KERNMOUNT)) { |
| 32 | if (!capable(CAP_SYS_ADMIN) && !fs_fully_visible(fs_type)) | 33 | if (!capable(CAP_SYS_ADMIN) && !fs_fully_visible(fs_type)) |
| @@ -37,8 +38,8 @@ static struct dentry *sysfs_mount(struct file_system_type *fs_type, | |||
| 37 | } | 38 | } |
| 38 | 39 | ||
| 39 | ns = kobj_ns_grab_current(KOBJ_NS_TYPE_NET); | 40 | ns = kobj_ns_grab_current(KOBJ_NS_TYPE_NET); |
| 40 | root = kernfs_mount_ns(fs_type, flags, sysfs_root, ns); | 41 | root = kernfs_mount_ns(fs_type, flags, sysfs_root, &new_sb, ns); |
| 41 | if (IS_ERR(root)) | 42 | if (IS_ERR(root) || !new_sb) |
| 42 | kobj_ns_drop(KOBJ_NS_TYPE_NET, ns); | 43 | kobj_ns_drop(KOBJ_NS_TYPE_NET, ns); |
| 43 | return root; | 44 | return root; |
| 44 | } | 45 | } |
diff --git a/fs/udf/file.c b/fs/udf/file.c index c02a27a19c6d..1037637957c7 100644 --- a/fs/udf/file.c +++ b/fs/udf/file.c | |||
| @@ -144,6 +144,7 @@ static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov, | |||
| 144 | size_t count = iocb->ki_nbytes; | 144 | size_t count = iocb->ki_nbytes; |
| 145 | struct udf_inode_info *iinfo = UDF_I(inode); | 145 | struct udf_inode_info *iinfo = UDF_I(inode); |
| 146 | 146 | ||
| 147 | mutex_lock(&inode->i_mutex); | ||
| 147 | down_write(&iinfo->i_data_sem); | 148 | down_write(&iinfo->i_data_sem); |
| 148 | if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) { | 149 | if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) { |
| 149 | if (file->f_flags & O_APPEND) | 150 | if (file->f_flags & O_APPEND) |
| @@ -156,6 +157,7 @@ static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov, | |||
| 156 | pos + count)) { | 157 | pos + count)) { |
| 157 | err = udf_expand_file_adinicb(inode); | 158 | err = udf_expand_file_adinicb(inode); |
| 158 | if (err) { | 159 | if (err) { |
| 160 | mutex_unlock(&inode->i_mutex); | ||
| 159 | udf_debug("udf_expand_adinicb: err=%d\n", err); | 161 | udf_debug("udf_expand_adinicb: err=%d\n", err); |
| 160 | return err; | 162 | return err; |
| 161 | } | 163 | } |
| @@ -169,9 +171,17 @@ static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov, | |||
| 169 | } else | 171 | } else |
| 170 | up_write(&iinfo->i_data_sem); | 172 | up_write(&iinfo->i_data_sem); |
| 171 | 173 | ||
| 172 | retval = generic_file_aio_write(iocb, iov, nr_segs, ppos); | 174 | retval = __generic_file_aio_write(iocb, iov, nr_segs, &iocb->ki_pos); |
| 173 | if (retval > 0) | 175 | mutex_unlock(&inode->i_mutex); |
| 176 | |||
| 177 | if (retval > 0) { | ||
| 178 | ssize_t err; | ||
| 179 | |||
| 174 | mark_inode_dirty(inode); | 180 | mark_inode_dirty(inode); |
| 181 | err = generic_write_sync(file, iocb->ki_pos - retval, retval); | ||
| 182 | if (err < 0) | ||
| 183 | retval = err; | ||
| 184 | } | ||
| 175 | 185 | ||
| 176 | return retval; | 186 | return retval; |
| 177 | } | 187 | } |
diff --git a/fs/udf/inode.c b/fs/udf/inode.c index 062b7925bca0..982ce05c87ed 100644 --- a/fs/udf/inode.c +++ b/fs/udf/inode.c | |||
| @@ -265,6 +265,7 @@ int udf_expand_file_adinicb(struct inode *inode) | |||
| 265 | .nr_to_write = 1, | 265 | .nr_to_write = 1, |
| 266 | }; | 266 | }; |
| 267 | 267 | ||
| 268 | WARN_ON_ONCE(!mutex_is_locked(&inode->i_mutex)); | ||
| 268 | if (!iinfo->i_lenAlloc) { | 269 | if (!iinfo->i_lenAlloc) { |
| 269 | if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_SHORT_AD)) | 270 | if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_SHORT_AD)) |
| 270 | iinfo->i_alloc_type = ICBTAG_FLAG_AD_SHORT; | 271 | iinfo->i_alloc_type = ICBTAG_FLAG_AD_SHORT; |
diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index f317488263dd..d971f4932b5d 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c | |||
| @@ -913,7 +913,7 @@ xfs_flush_inodes( | |||
| 913 | struct super_block *sb = mp->m_super; | 913 | struct super_block *sb = mp->m_super; |
| 914 | 914 | ||
| 915 | if (down_read_trylock(&sb->s_umount)) { | 915 | if (down_read_trylock(&sb->s_umount)) { |
| 916 | sync_inodes_sb(sb, jiffies); | 916 | sync_inodes_sb(sb); |
| 917 | up_read(&sb->s_umount); | 917 | up_read(&sb->s_umount); |
| 918 | } | 918 | } |
| 919 | } | 919 | } |
diff --git a/include/dt-bindings/clock/tegra124-car.h b/include/dt-bindings/clock/tegra124-car.h index a1116a3b54ef..8c1603b10665 100644 --- a/include/dt-bindings/clock/tegra124-car.h +++ b/include/dt-bindings/clock/tegra124-car.h | |||
| @@ -36,10 +36,10 @@ | |||
| 36 | #define TEGRA124_CLK_PWM 17 | 36 | #define TEGRA124_CLK_PWM 17 |
| 37 | #define TEGRA124_CLK_I2S2 18 | 37 | #define TEGRA124_CLK_I2S2 18 |
| 38 | /* 20 (register bit affects vi and vi_sensor) */ | 38 | /* 20 (register bit affects vi and vi_sensor) */ |
| 39 | #define TEGRA124_CLK_GR_2D 21 | 39 | /* 21 */ |
| 40 | #define TEGRA124_CLK_USBD 22 | 40 | #define TEGRA124_CLK_USBD 22 |
| 41 | #define TEGRA124_CLK_ISP 23 | 41 | #define TEGRA124_CLK_ISP 23 |
| 42 | #define TEGRA124_CLK_GR_3D 24 | 42 | /* 26 */ |
| 43 | /* 25 */ | 43 | /* 25 */ |
| 44 | #define TEGRA124_CLK_DISP2 26 | 44 | #define TEGRA124_CLK_DISP2 26 |
| 45 | #define TEGRA124_CLK_DISP1 27 | 45 | #define TEGRA124_CLK_DISP1 27 |
diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h index 18ba8a627f46..2ff2e8d982be 100644 --- a/include/linux/blk-mq.h +++ b/include/linux/blk-mq.h | |||
| @@ -121,8 +121,7 @@ void blk_mq_init_commands(struct request_queue *, void (*init)(void *data, struc | |||
| 121 | 121 | ||
| 122 | void blk_mq_flush_plug_list(struct blk_plug *plug, bool from_schedule); | 122 | void blk_mq_flush_plug_list(struct blk_plug *plug, bool from_schedule); |
| 123 | 123 | ||
| 124 | void blk_mq_insert_request(struct request_queue *, struct request *, | 124 | void blk_mq_insert_request(struct request *, bool, bool, bool); |
| 125 | bool, bool); | ||
| 126 | void blk_mq_run_queues(struct request_queue *q, bool async); | 125 | void blk_mq_run_queues(struct request_queue *q, bool async); |
| 127 | void blk_mq_free_request(struct request *rq); | 126 | void blk_mq_free_request(struct request *rq); |
| 128 | bool blk_mq_can_queue(struct blk_mq_hw_ctx *); | 127 | bool blk_mq_can_queue(struct blk_mq_hw_ctx *); |
| @@ -134,7 +133,13 @@ struct blk_mq_hw_ctx *blk_mq_map_queue(struct request_queue *, const int ctx_ind | |||
| 134 | struct blk_mq_hw_ctx *blk_mq_alloc_single_hw_queue(struct blk_mq_reg *, unsigned int); | 133 | struct blk_mq_hw_ctx *blk_mq_alloc_single_hw_queue(struct blk_mq_reg *, unsigned int); |
| 135 | void blk_mq_free_single_hw_queue(struct blk_mq_hw_ctx *, unsigned int); | 134 | void blk_mq_free_single_hw_queue(struct blk_mq_hw_ctx *, unsigned int); |
| 136 | 135 | ||
| 137 | void blk_mq_end_io(struct request *rq, int error); | 136 | bool blk_mq_end_io_partial(struct request *rq, int error, |
| 137 | unsigned int nr_bytes); | ||
| 138 | static inline void blk_mq_end_io(struct request *rq, int error) | ||
| 139 | { | ||
| 140 | bool done = !blk_mq_end_io_partial(rq, error, blk_rq_bytes(rq)); | ||
| 141 | BUG_ON(!done); | ||
| 142 | } | ||
| 138 | 143 | ||
| 139 | void blk_mq_complete_request(struct request *rq); | 144 | void blk_mq_complete_request(struct request *rq); |
| 140 | 145 | ||
diff --git a/include/linux/firewire.h b/include/linux/firewire.h index 5d7782e42b8f..c3683bdf28fe 100644 --- a/include/linux/firewire.h +++ b/include/linux/firewire.h | |||
| @@ -200,6 +200,7 @@ struct fw_device { | |||
| 200 | unsigned irmc:1; | 200 | unsigned irmc:1; |
| 201 | unsigned bc_implemented:2; | 201 | unsigned bc_implemented:2; |
| 202 | 202 | ||
| 203 | work_func_t workfn; | ||
| 203 | struct delayed_work work; | 204 | struct delayed_work work; |
| 204 | struct fw_attribute_group attribute_group; | 205 | struct fw_attribute_group attribute_group; |
| 205 | }; | 206 | }; |
diff --git a/include/linux/fsnotify_backend.h b/include/linux/fsnotify_backend.h index 3d286ff49ab0..64cf3ef50696 100644 --- a/include/linux/fsnotify_backend.h +++ b/include/linux/fsnotify_backend.h | |||
| @@ -99,7 +99,7 @@ struct fsnotify_ops { | |||
| 99 | struct fsnotify_mark *inode_mark, | 99 | struct fsnotify_mark *inode_mark, |
| 100 | struct fsnotify_mark *vfsmount_mark, | 100 | struct fsnotify_mark *vfsmount_mark, |
| 101 | u32 mask, void *data, int data_type, | 101 | u32 mask, void *data, int data_type, |
| 102 | const unsigned char *file_name); | 102 | const unsigned char *file_name, u32 cookie); |
| 103 | void (*free_group_priv)(struct fsnotify_group *group); | 103 | void (*free_group_priv)(struct fsnotify_group *group); |
| 104 | void (*freeing_mark)(struct fsnotify_mark *mark, struct fsnotify_group *group); | 104 | void (*freeing_mark)(struct fsnotify_mark *mark, struct fsnotify_group *group); |
| 105 | void (*free_event)(struct fsnotify_event *event); | 105 | void (*free_event)(struct fsnotify_event *event); |
| @@ -160,7 +160,7 @@ struct fsnotify_group { | |||
| 160 | 160 | ||
| 161 | struct fasync_struct *fsn_fa; /* async notification */ | 161 | struct fasync_struct *fsn_fa; /* async notification */ |
| 162 | 162 | ||
| 163 | struct fsnotify_event overflow_event; /* Event we queue when the | 163 | struct fsnotify_event *overflow_event; /* Event we queue when the |
| 164 | * notification list is too | 164 | * notification list is too |
| 165 | * full */ | 165 | * full */ |
| 166 | 166 | ||
diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h index db512014e061..b826239bdce0 100644 --- a/include/linux/huge_mm.h +++ b/include/linux/huge_mm.h | |||
| @@ -157,46 +157,6 @@ static inline int hpage_nr_pages(struct page *page) | |||
| 157 | return HPAGE_PMD_NR; | 157 | return HPAGE_PMD_NR; |
| 158 | return 1; | 158 | return 1; |
| 159 | } | 159 | } |
| 160 | /* | ||
| 161 | * compound_trans_head() should be used instead of compound_head(), | ||
| 162 | * whenever the "page" passed as parameter could be the tail of a | ||
| 163 | * transparent hugepage that could be undergoing a | ||
| 164 | * __split_huge_page_refcount(). The page structure layout often | ||
| 165 | * changes across releases and it makes extensive use of unions. So if | ||
| 166 | * the page structure layout will change in a way that | ||
| 167 | * page->first_page gets clobbered by __split_huge_page_refcount, the | ||
| 168 | * implementation making use of smp_rmb() will be required. | ||
| 169 | * | ||
| 170 | * Currently we define compound_trans_head as compound_head, because | ||
| 171 | * page->private is in the same union with page->first_page, and | ||
| 172 | * page->private isn't clobbered. However this also means we're | ||
| 173 | * currently leaving dirt into the page->private field of anonymous | ||
| 174 | * pages resulting from a THP split, instead of setting page->private | ||
| 175 | * to zero like for every other page that has PG_private not set. But | ||
| 176 | * anonymous pages don't use page->private so this is not a problem. | ||
| 177 | */ | ||
| 178 | #if 0 | ||
| 179 | /* This will be needed if page->private will be clobbered in split_huge_page */ | ||
| 180 | static inline struct page *compound_trans_head(struct page *page) | ||
| 181 | { | ||
| 182 | if (PageTail(page)) { | ||
| 183 | struct page *head; | ||
| 184 | head = page->first_page; | ||
| 185 | smp_rmb(); | ||
| 186 | /* | ||
| 187 | * head may be a dangling pointer. | ||
| 188 | * __split_huge_page_refcount clears PageTail before | ||
| 189 | * overwriting first_page, so if PageTail is still | ||
| 190 | * there it means the head pointer isn't dangling. | ||
| 191 | */ | ||
| 192 | if (PageTail(page)) | ||
| 193 | return head; | ||
| 194 | } | ||
| 195 | return page; | ||
| 196 | } | ||
| 197 | #else | ||
| 198 | #define compound_trans_head(page) compound_head(page) | ||
| 199 | #endif | ||
| 200 | 160 | ||
| 201 | extern int do_huge_pmd_numa_page(struct mm_struct *mm, struct vm_area_struct *vma, | 161 | extern int do_huge_pmd_numa_page(struct mm_struct *mm, struct vm_area_struct *vma, |
| 202 | unsigned long addr, pmd_t pmd, pmd_t *pmdp); | 162 | unsigned long addr, pmd_t pmd, pmd_t *pmdp); |
| @@ -226,7 +186,6 @@ static inline int split_huge_page(struct page *page) | |||
| 226 | do { } while (0) | 186 | do { } while (0) |
| 227 | #define split_huge_page_pmd_mm(__mm, __address, __pmd) \ | 187 | #define split_huge_page_pmd_mm(__mm, __address, __pmd) \ |
| 228 | do { } while (0) | 188 | do { } while (0) |
| 229 | #define compound_trans_head(page) compound_head(page) | ||
| 230 | static inline int hugepage_madvise(struct vm_area_struct *vma, | 189 | static inline int hugepage_madvise(struct vm_area_struct *vma, |
| 231 | unsigned long *vm_flags, int advice) | 190 | unsigned long *vm_flags, int advice) |
| 232 | { | 191 | { |
diff --git a/include/linux/kernfs.h b/include/linux/kernfs.h index 5be9f0228a3b..d267623c28cf 100644 --- a/include/linux/kernfs.h +++ b/include/linux/kernfs.h | |||
| @@ -249,7 +249,8 @@ void kernfs_notify(struct kernfs_node *kn); | |||
| 249 | 249 | ||
| 250 | const void *kernfs_super_ns(struct super_block *sb); | 250 | const void *kernfs_super_ns(struct super_block *sb); |
| 251 | struct dentry *kernfs_mount_ns(struct file_system_type *fs_type, int flags, | 251 | struct dentry *kernfs_mount_ns(struct file_system_type *fs_type, int flags, |
| 252 | struct kernfs_root *root, const void *ns); | 252 | struct kernfs_root *root, bool *new_sb_created, |
| 253 | const void *ns); | ||
| 253 | void kernfs_kill_sb(struct super_block *sb); | 254 | void kernfs_kill_sb(struct super_block *sb); |
| 254 | 255 | ||
| 255 | void kernfs_init(void); | 256 | void kernfs_init(void); |
| @@ -317,7 +318,7 @@ static inline const void *kernfs_super_ns(struct super_block *sb) | |||
| 317 | 318 | ||
| 318 | static inline struct dentry * | 319 | static inline struct dentry * |
| 319 | kernfs_mount_ns(struct file_system_type *fs_type, int flags, | 320 | kernfs_mount_ns(struct file_system_type *fs_type, int flags, |
| 320 | struct kernfs_root *root, const void *ns) | 321 | struct kernfs_root *root, bool *new_sb_created, const void *ns) |
| 321 | { return ERR_PTR(-ENOSYS); } | 322 | { return ERR_PTR(-ENOSYS); } |
| 322 | 323 | ||
| 323 | static inline void kernfs_kill_sb(struct super_block *sb) { } | 324 | static inline void kernfs_kill_sb(struct super_block *sb) { } |
| @@ -368,9 +369,9 @@ static inline int kernfs_remove_by_name(struct kernfs_node *parent, | |||
| 368 | 369 | ||
| 369 | static inline struct dentry * | 370 | static inline struct dentry * |
| 370 | kernfs_mount(struct file_system_type *fs_type, int flags, | 371 | kernfs_mount(struct file_system_type *fs_type, int flags, |
| 371 | struct kernfs_root *root) | 372 | struct kernfs_root *root, bool *new_sb_created) |
| 372 | { | 373 | { |
| 373 | return kernfs_mount_ns(fs_type, flags, root, NULL); | 374 | return kernfs_mount_ns(fs_type, flags, root, new_sb_created, NULL); |
| 374 | } | 375 | } |
| 375 | 376 | ||
| 376 | #endif /* __LINUX_KERNFS_H */ | 377 | #endif /* __LINUX_KERNFS_H */ |
diff --git a/include/linux/mm.h b/include/linux/mm.h index f28f46eade6a..c1b7414c7bef 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
| @@ -175,7 +175,7 @@ extern unsigned int kobjsize(const void *objp); | |||
| 175 | * Special vmas that are non-mergable, non-mlock()able. | 175 | * Special vmas that are non-mergable, non-mlock()able. |
| 176 | * Note: mm/huge_memory.c VM_NO_THP depends on this definition. | 176 | * Note: mm/huge_memory.c VM_NO_THP depends on this definition. |
| 177 | */ | 177 | */ |
| 178 | #define VM_SPECIAL (VM_IO | VM_DONTEXPAND | VM_PFNMAP) | 178 | #define VM_SPECIAL (VM_IO | VM_DONTEXPAND | VM_PFNMAP | VM_MIXEDMAP) |
| 179 | 179 | ||
| 180 | /* | 180 | /* |
| 181 | * mapping from the currently active vm_flags protection bits (the | 181 | * mapping from the currently active vm_flags protection bits (the |
| @@ -399,8 +399,18 @@ static inline void compound_unlock_irqrestore(struct page *page, | |||
| 399 | 399 | ||
| 400 | static inline struct page *compound_head(struct page *page) | 400 | static inline struct page *compound_head(struct page *page) |
| 401 | { | 401 | { |
| 402 | if (unlikely(PageTail(page))) | 402 | if (unlikely(PageTail(page))) { |
| 403 | return page->first_page; | 403 | struct page *head = page->first_page; |
| 404 | |||
| 405 | /* | ||
| 406 | * page->first_page may be a dangling pointer to an old | ||
| 407 | * compound page, so recheck that it is still a tail | ||
| 408 | * page before returning. | ||
| 409 | */ | ||
| 410 | smp_rmb(); | ||
| 411 | if (likely(PageTail(page))) | ||
| 412 | return head; | ||
| 413 | } | ||
| 404 | return page; | 414 | return page; |
| 405 | } | 415 | } |
| 406 | 416 | ||
| @@ -757,7 +767,7 @@ static inline bool __cpupid_match_pid(pid_t task_pid, int cpupid) | |||
| 757 | #ifdef LAST_CPUPID_NOT_IN_PAGE_FLAGS | 767 | #ifdef LAST_CPUPID_NOT_IN_PAGE_FLAGS |
| 758 | static inline int page_cpupid_xchg_last(struct page *page, int cpupid) | 768 | static inline int page_cpupid_xchg_last(struct page *page, int cpupid) |
| 759 | { | 769 | { |
| 760 | return xchg(&page->_last_cpupid, cpupid); | 770 | return xchg(&page->_last_cpupid, cpupid & LAST_CPUPID_MASK); |
| 761 | } | 771 | } |
| 762 | 772 | ||
| 763 | static inline int page_cpupid_last(struct page *page) | 773 | static inline int page_cpupid_last(struct page *page) |
| @@ -766,7 +776,7 @@ static inline int page_cpupid_last(struct page *page) | |||
| 766 | } | 776 | } |
| 767 | static inline void page_cpupid_reset_last(struct page *page) | 777 | static inline void page_cpupid_reset_last(struct page *page) |
| 768 | { | 778 | { |
| 769 | page->_last_cpupid = -1; | 779 | page->_last_cpupid = -1 & LAST_CPUPID_MASK; |
| 770 | } | 780 | } |
| 771 | #else | 781 | #else |
| 772 | static inline int page_cpupid_last(struct page *page) | 782 | static inline int page_cpupid_last(struct page *page) |
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 3ebbbe7b6d05..5e1e6f2d98c2 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
| @@ -2725,7 +2725,7 @@ static inline void nf_reset(struct sk_buff *skb) | |||
| 2725 | 2725 | ||
| 2726 | static inline void nf_reset_trace(struct sk_buff *skb) | 2726 | static inline void nf_reset_trace(struct sk_buff *skb) |
| 2727 | { | 2727 | { |
| 2728 | #if IS_ENABLED(CONFIG_NETFILTER_XT_TARGET_TRACE) | 2728 | #if IS_ENABLED(CONFIG_NETFILTER_XT_TARGET_TRACE) || defined(CONFIG_NF_TABLES) |
| 2729 | skb->nf_trace = 0; | 2729 | skb->nf_trace = 0; |
| 2730 | #endif | 2730 | #endif |
| 2731 | } | 2731 | } |
| @@ -2742,6 +2742,9 @@ static inline void __nf_copy(struct sk_buff *dst, const struct sk_buff *src) | |||
| 2742 | dst->nf_bridge = src->nf_bridge; | 2742 | dst->nf_bridge = src->nf_bridge; |
| 2743 | nf_bridge_get(src->nf_bridge); | 2743 | nf_bridge_get(src->nf_bridge); |
| 2744 | #endif | 2744 | #endif |
| 2745 | #if IS_ENABLED(CONFIG_NETFILTER_XT_TARGET_TRACE) || defined(CONFIG_NF_TABLES) | ||
| 2746 | dst->nf_trace = src->nf_trace; | ||
| 2747 | #endif | ||
| 2745 | } | 2748 | } |
| 2746 | 2749 | ||
| 2747 | static inline void nf_copy(struct sk_buff *dst, const struct sk_buff *src) | 2750 | static inline void nf_copy(struct sk_buff *dst, const struct sk_buff *src) |
diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h index accc497f8d72..7159a0a933df 100644 --- a/include/linux/tracepoint.h +++ b/include/linux/tracepoint.h | |||
| @@ -60,6 +60,12 @@ struct tp_module { | |||
| 60 | unsigned int num_tracepoints; | 60 | unsigned int num_tracepoints; |
| 61 | struct tracepoint * const *tracepoints_ptrs; | 61 | struct tracepoint * const *tracepoints_ptrs; |
| 62 | }; | 62 | }; |
| 63 | bool trace_module_has_bad_taint(struct module *mod); | ||
| 64 | #else | ||
| 65 | static inline bool trace_module_has_bad_taint(struct module *mod) | ||
| 66 | { | ||
| 67 | return false; | ||
| 68 | } | ||
| 63 | #endif /* CONFIG_MODULES */ | 69 | #endif /* CONFIG_MODULES */ |
| 64 | 70 | ||
| 65 | struct tracepoint_iter { | 71 | struct tracepoint_iter { |
diff --git a/include/linux/writeback.h b/include/linux/writeback.h index fc0e4320aa6d..021b8a319b9e 100644 --- a/include/linux/writeback.h +++ b/include/linux/writeback.h | |||
| @@ -97,7 +97,7 @@ void writeback_inodes_sb_nr(struct super_block *, unsigned long nr, | |||
| 97 | int try_to_writeback_inodes_sb(struct super_block *, enum wb_reason reason); | 97 | int try_to_writeback_inodes_sb(struct super_block *, enum wb_reason reason); |
| 98 | int try_to_writeback_inodes_sb_nr(struct super_block *, unsigned long nr, | 98 | int try_to_writeback_inodes_sb_nr(struct super_block *, unsigned long nr, |
| 99 | enum wb_reason reason); | 99 | enum wb_reason reason); |
| 100 | void sync_inodes_sb(struct super_block *sb, unsigned long older_than_this); | 100 | void sync_inodes_sb(struct super_block *); |
| 101 | void wakeup_flusher_threads(long nr_pages, enum wb_reason reason); | 101 | void wakeup_flusher_threads(long nr_pages, enum wb_reason reason); |
| 102 | void inode_wait_for_writeback(struct inode *inode); | 102 | void inode_wait_for_writeback(struct inode *inode); |
| 103 | 103 | ||
diff --git a/include/net/ip_tunnels.h b/include/net/ip_tunnels.h index 48ed75c21260..e77c10405d51 100644 --- a/include/net/ip_tunnels.h +++ b/include/net/ip_tunnels.h | |||
| @@ -129,6 +129,7 @@ int ip_tunnel_changelink(struct net_device *dev, struct nlattr *tb[], | |||
| 129 | int ip_tunnel_newlink(struct net_device *dev, struct nlattr *tb[], | 129 | int ip_tunnel_newlink(struct net_device *dev, struct nlattr *tb[], |
| 130 | struct ip_tunnel_parm *p); | 130 | struct ip_tunnel_parm *p); |
| 131 | void ip_tunnel_setup(struct net_device *dev, int net_id); | 131 | void ip_tunnel_setup(struct net_device *dev, int net_id); |
| 132 | void ip_tunnel_dst_reset_all(struct ip_tunnel *t); | ||
| 132 | 133 | ||
| 133 | /* Extract dsfield from inner protocol */ | 134 | /* Extract dsfield from inner protocol */ |
| 134 | static inline u8 ip_tunnel_get_dsfield(const struct iphdr *iph, | 135 | static inline u8 ip_tunnel_get_dsfield(const struct iphdr *iph, |
diff --git a/include/net/tcp.h b/include/net/tcp.h index 56fc366da6d5..8c4dd63134d4 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h | |||
| @@ -1303,7 +1303,8 @@ struct tcp_fastopen_request { | |||
| 1303 | /* Fast Open cookie. Size 0 means a cookie request */ | 1303 | /* Fast Open cookie. Size 0 means a cookie request */ |
| 1304 | struct tcp_fastopen_cookie cookie; | 1304 | struct tcp_fastopen_cookie cookie; |
| 1305 | struct msghdr *data; /* data in MSG_FASTOPEN */ | 1305 | struct msghdr *data; /* data in MSG_FASTOPEN */ |
| 1306 | u16 copied; /* queued in tcp_connect() */ | 1306 | size_t size; |
| 1307 | int copied; /* queued in tcp_connect() */ | ||
| 1307 | }; | 1308 | }; |
| 1308 | void tcp_free_fastopen_req(struct tcp_sock *tp); | 1309 | void tcp_free_fastopen_req(struct tcp_sock *tp); |
| 1309 | 1310 | ||
diff --git a/include/net/xfrm.h b/include/net/xfrm.h index afa5730fb3bd..fb5654a8ca3c 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h | |||
| @@ -1648,6 +1648,11 @@ static inline int xfrm_aevent_is_on(struct net *net) | |||
| 1648 | } | 1648 | } |
| 1649 | #endif | 1649 | #endif |
| 1650 | 1650 | ||
| 1651 | static inline int aead_len(struct xfrm_algo_aead *alg) | ||
| 1652 | { | ||
| 1653 | return sizeof(*alg) + ((alg->alg_key_len + 7) / 8); | ||
| 1654 | } | ||
| 1655 | |||
| 1651 | static inline int xfrm_alg_len(const struct xfrm_algo *alg) | 1656 | static inline int xfrm_alg_len(const struct xfrm_algo *alg) |
| 1652 | { | 1657 | { |
| 1653 | return sizeof(*alg) + ((alg->alg_key_len + 7) / 8); | 1658 | return sizeof(*alg) + ((alg->alg_key_len + 7) / 8); |
| @@ -1686,6 +1691,12 @@ static inline int xfrm_replay_clone(struct xfrm_state *x, | |||
| 1686 | return 0; | 1691 | return 0; |
| 1687 | } | 1692 | } |
| 1688 | 1693 | ||
| 1694 | static inline struct xfrm_algo_aead *xfrm_algo_aead_clone(struct xfrm_algo_aead *orig) | ||
| 1695 | { | ||
| 1696 | return kmemdup(orig, aead_len(orig), GFP_KERNEL); | ||
| 1697 | } | ||
| 1698 | |||
| 1699 | |||
| 1689 | static inline struct xfrm_algo *xfrm_algo_clone(struct xfrm_algo *orig) | 1700 | static inline struct xfrm_algo *xfrm_algo_clone(struct xfrm_algo *orig) |
| 1690 | { | 1701 | { |
| 1691 | return kmemdup(orig, xfrm_alg_len(orig), GFP_KERNEL); | 1702 | return kmemdup(orig, xfrm_alg_len(orig), GFP_KERNEL); |
diff --git a/include/sound/soc-dapm.h b/include/sound/soc-dapm.h index 68d92e36facd..6e89ef6c11c1 100644 --- a/include/sound/soc-dapm.h +++ b/include/sound/soc-dapm.h | |||
| @@ -449,14 +449,22 @@ void snd_soc_dapm_debugfs_init(struct snd_soc_dapm_context *dapm, | |||
| 449 | /* dapm audio pin control and status */ | 449 | /* dapm audio pin control and status */ |
| 450 | int snd_soc_dapm_enable_pin(struct snd_soc_dapm_context *dapm, | 450 | int snd_soc_dapm_enable_pin(struct snd_soc_dapm_context *dapm, |
| 451 | const char *pin); | 451 | const char *pin); |
| 452 | int snd_soc_dapm_enable_pin_unlocked(struct snd_soc_dapm_context *dapm, | ||
| 453 | const char *pin); | ||
| 452 | int snd_soc_dapm_disable_pin(struct snd_soc_dapm_context *dapm, | 454 | int snd_soc_dapm_disable_pin(struct snd_soc_dapm_context *dapm, |
| 453 | const char *pin); | 455 | const char *pin); |
| 456 | int snd_soc_dapm_disable_pin_unlocked(struct snd_soc_dapm_context *dapm, | ||
| 457 | const char *pin); | ||
| 454 | int snd_soc_dapm_nc_pin(struct snd_soc_dapm_context *dapm, const char *pin); | 458 | int snd_soc_dapm_nc_pin(struct snd_soc_dapm_context *dapm, const char *pin); |
| 459 | int snd_soc_dapm_nc_pin_unlocked(struct snd_soc_dapm_context *dapm, | ||
| 460 | const char *pin); | ||
| 455 | int snd_soc_dapm_get_pin_status(struct snd_soc_dapm_context *dapm, | 461 | int snd_soc_dapm_get_pin_status(struct snd_soc_dapm_context *dapm, |
| 456 | const char *pin); | 462 | const char *pin); |
| 457 | int snd_soc_dapm_sync(struct snd_soc_dapm_context *dapm); | 463 | int snd_soc_dapm_sync(struct snd_soc_dapm_context *dapm); |
| 458 | int snd_soc_dapm_force_enable_pin(struct snd_soc_dapm_context *dapm, | 464 | int snd_soc_dapm_force_enable_pin(struct snd_soc_dapm_context *dapm, |
| 459 | const char *pin); | 465 | const char *pin); |
| 466 | int snd_soc_dapm_force_enable_pin_unlocked(struct snd_soc_dapm_context *dapm, | ||
| 467 | const char *pin); | ||
| 460 | int snd_soc_dapm_ignore_suspend(struct snd_soc_dapm_context *dapm, | 468 | int snd_soc_dapm_ignore_suspend(struct snd_soc_dapm_context *dapm, |
| 461 | const char *pin); | 469 | const char *pin); |
| 462 | void snd_soc_dapm_auto_nc_codec_pins(struct snd_soc_codec *codec); | 470 | void snd_soc_dapm_auto_nc_codec_pins(struct snd_soc_codec *codec); |
diff --git a/include/target/iscsi/iscsi_transport.h b/include/target/iscsi/iscsi_transport.h index ae5a17111968..4483fadfa68d 100644 --- a/include/target/iscsi/iscsi_transport.h +++ b/include/target/iscsi/iscsi_transport.h | |||
| @@ -12,6 +12,7 @@ struct iscsit_transport { | |||
| 12 | int (*iscsit_setup_np)(struct iscsi_np *, struct __kernel_sockaddr_storage *); | 12 | int (*iscsit_setup_np)(struct iscsi_np *, struct __kernel_sockaddr_storage *); |
| 13 | int (*iscsit_accept_np)(struct iscsi_np *, struct iscsi_conn *); | 13 | int (*iscsit_accept_np)(struct iscsi_np *, struct iscsi_conn *); |
| 14 | void (*iscsit_free_np)(struct iscsi_np *); | 14 | void (*iscsit_free_np)(struct iscsi_np *); |
| 15 | void (*iscsit_wait_conn)(struct iscsi_conn *); | ||
| 15 | void (*iscsit_free_conn)(struct iscsi_conn *); | 16 | void (*iscsit_free_conn)(struct iscsi_conn *); |
| 16 | int (*iscsit_get_login_rx)(struct iscsi_conn *, struct iscsi_login *); | 17 | int (*iscsit_get_login_rx)(struct iscsi_conn *, struct iscsi_login *); |
| 17 | int (*iscsit_put_login_tx)(struct iscsi_conn *, struct iscsi_login *, u32); | 18 | int (*iscsit_put_login_tx)(struct iscsi_conn *, struct iscsi_login *, u32); |
diff --git a/include/trace/events/writeback.h b/include/trace/events/writeback.h index c7bbbe794e65..464ea82e10db 100644 --- a/include/trace/events/writeback.h +++ b/include/trace/events/writeback.h | |||
| @@ -287,11 +287,11 @@ TRACE_EVENT(writeback_queue_io, | |||
| 287 | __field(int, reason) | 287 | __field(int, reason) |
| 288 | ), | 288 | ), |
| 289 | TP_fast_assign( | 289 | TP_fast_assign( |
| 290 | unsigned long older_than_this = work->older_than_this; | 290 | unsigned long *older_than_this = work->older_than_this; |
| 291 | strncpy(__entry->name, dev_name(wb->bdi->dev), 32); | 291 | strncpy(__entry->name, dev_name(wb->bdi->dev), 32); |
| 292 | __entry->older = older_than_this; | 292 | __entry->older = older_than_this ? *older_than_this : 0; |
| 293 | __entry->age = older_than_this ? | 293 | __entry->age = older_than_this ? |
| 294 | (jiffies - older_than_this) * 1000 / HZ : -1; | 294 | (jiffies - *older_than_this) * 1000 / HZ : -1; |
| 295 | __entry->moved = moved; | 295 | __entry->moved = moved; |
| 296 | __entry->reason = work->reason; | 296 | __entry->reason = work->reason; |
| 297 | ), | 297 | ), |
diff --git a/include/uapi/asm-generic/unistd.h b/include/uapi/asm-generic/unistd.h index a20a9b4d3871..dde8041f40d2 100644 --- a/include/uapi/asm-generic/unistd.h +++ b/include/uapi/asm-generic/unistd.h | |||
| @@ -692,9 +692,13 @@ __SC_COMP(__NR_process_vm_writev, sys_process_vm_writev, \ | |||
| 692 | __SYSCALL(__NR_kcmp, sys_kcmp) | 692 | __SYSCALL(__NR_kcmp, sys_kcmp) |
| 693 | #define __NR_finit_module 273 | 693 | #define __NR_finit_module 273 |
| 694 | __SYSCALL(__NR_finit_module, sys_finit_module) | 694 | __SYSCALL(__NR_finit_module, sys_finit_module) |
| 695 | #define __NR_sched_setattr 274 | ||
| 696 | __SYSCALL(__NR_sched_setattr, sys_sched_setattr) | ||
| 697 | #define __NR_sched_getattr 275 | ||
| 698 | __SYSCALL(__NR_sched_getattr, sys_sched_getattr) | ||
| 695 | 699 | ||
| 696 | #undef __NR_syscalls | 700 | #undef __NR_syscalls |
| 697 | #define __NR_syscalls 274 | 701 | #define __NR_syscalls 276 |
| 698 | 702 | ||
| 699 | /* | 703 | /* |
| 700 | * All syscalls below here should go away really, | 704 | * All syscalls below here should go away really, |
diff --git a/kernel/audit_tree.c b/kernel/audit_tree.c index 67ccf0e7cca9..135944a7b28a 100644 --- a/kernel/audit_tree.c +++ b/kernel/audit_tree.c | |||
| @@ -916,7 +916,7 @@ static int audit_tree_handle_event(struct fsnotify_group *group, | |||
| 916 | struct fsnotify_mark *inode_mark, | 916 | struct fsnotify_mark *inode_mark, |
| 917 | struct fsnotify_mark *vfsmount_mark, | 917 | struct fsnotify_mark *vfsmount_mark, |
| 918 | u32 mask, void *data, int data_type, | 918 | u32 mask, void *data, int data_type, |
| 919 | const unsigned char *file_name) | 919 | const unsigned char *file_name, u32 cookie) |
| 920 | { | 920 | { |
| 921 | return 0; | 921 | return 0; |
| 922 | } | 922 | } |
diff --git a/kernel/audit_watch.c b/kernel/audit_watch.c index 2596fac5dcb4..70b4554d2fbe 100644 --- a/kernel/audit_watch.c +++ b/kernel/audit_watch.c | |||
| @@ -471,7 +471,7 @@ static int audit_watch_handle_event(struct fsnotify_group *group, | |||
| 471 | struct fsnotify_mark *inode_mark, | 471 | struct fsnotify_mark *inode_mark, |
| 472 | struct fsnotify_mark *vfsmount_mark, | 472 | struct fsnotify_mark *vfsmount_mark, |
| 473 | u32 mask, void *data, int data_type, | 473 | u32 mask, void *data, int data_type, |
| 474 | const unsigned char *dname) | 474 | const unsigned char *dname, u32 cookie) |
| 475 | { | 475 | { |
| 476 | struct inode *inode; | 476 | struct inode *inode; |
| 477 | struct audit_parent *parent; | 477 | struct audit_parent *parent; |
diff --git a/kernel/cpuset.c b/kernel/cpuset.c index 4410ac6a55f1..e6b1b66afe52 100644 --- a/kernel/cpuset.c +++ b/kernel/cpuset.c | |||
| @@ -974,12 +974,6 @@ static int update_cpumask(struct cpuset *cs, struct cpuset *trialcs, | |||
| 974 | * Temporarilly set tasks mems_allowed to target nodes of migration, | 974 | * Temporarilly set tasks mems_allowed to target nodes of migration, |
| 975 | * so that the migration code can allocate pages on these nodes. | 975 | * so that the migration code can allocate pages on these nodes. |
| 976 | * | 976 | * |
| 977 | * Call holding cpuset_mutex, so current's cpuset won't change | ||
| 978 | * during this call, as manage_mutex holds off any cpuset_attach() | ||
| 979 | * calls. Therefore we don't need to take task_lock around the | ||
| 980 | * call to guarantee_online_mems(), as we know no one is changing | ||
| 981 | * our task's cpuset. | ||
| 982 | * | ||
| 983 | * While the mm_struct we are migrating is typically from some | 977 | * While the mm_struct we are migrating is typically from some |
| 984 | * other task, the task_struct mems_allowed that we are hacking | 978 | * other task, the task_struct mems_allowed that we are hacking |
| 985 | * is for our current task, which must allocate new pages for that | 979 | * is for our current task, which must allocate new pages for that |
| @@ -996,8 +990,10 @@ static void cpuset_migrate_mm(struct mm_struct *mm, const nodemask_t *from, | |||
| 996 | 990 | ||
| 997 | do_migrate_pages(mm, from, to, MPOL_MF_MOVE_ALL); | 991 | do_migrate_pages(mm, from, to, MPOL_MF_MOVE_ALL); |
| 998 | 992 | ||
| 993 | rcu_read_lock(); | ||
| 999 | mems_cs = effective_nodemask_cpuset(task_cs(tsk)); | 994 | mems_cs = effective_nodemask_cpuset(task_cs(tsk)); |
| 1000 | guarantee_online_mems(mems_cs, &tsk->mems_allowed); | 995 | guarantee_online_mems(mems_cs, &tsk->mems_allowed); |
| 996 | rcu_read_unlock(); | ||
| 1001 | } | 997 | } |
| 1002 | 998 | ||
| 1003 | /* | 999 | /* |
| @@ -2486,9 +2482,9 @@ int __cpuset_node_allowed_softwall(int node, gfp_t gfp_mask) | |||
| 2486 | 2482 | ||
| 2487 | task_lock(current); | 2483 | task_lock(current); |
| 2488 | cs = nearest_hardwall_ancestor(task_cs(current)); | 2484 | cs = nearest_hardwall_ancestor(task_cs(current)); |
| 2485 | allowed = node_isset(node, cs->mems_allowed); | ||
| 2489 | task_unlock(current); | 2486 | task_unlock(current); |
| 2490 | 2487 | ||
| 2491 | allowed = node_isset(node, cs->mems_allowed); | ||
| 2492 | mutex_unlock(&callback_mutex); | 2488 | mutex_unlock(&callback_mutex); |
| 2493 | return allowed; | 2489 | return allowed; |
| 2494 | } | 2490 | } |
diff --git a/kernel/events/core.c b/kernel/events/core.c index 56003c6edfd3..fa0b2d4ad83c 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
| @@ -7856,14 +7856,14 @@ static void perf_pmu_rotate_stop(struct pmu *pmu) | |||
| 7856 | static void __perf_event_exit_context(void *__info) | 7856 | static void __perf_event_exit_context(void *__info) |
| 7857 | { | 7857 | { |
| 7858 | struct perf_event_context *ctx = __info; | 7858 | struct perf_event_context *ctx = __info; |
| 7859 | struct perf_event *event, *tmp; | 7859 | struct perf_event *event; |
| 7860 | 7860 | ||
| 7861 | perf_pmu_rotate_stop(ctx->pmu); | 7861 | perf_pmu_rotate_stop(ctx->pmu); |
| 7862 | 7862 | ||
| 7863 | list_for_each_entry_safe(event, tmp, &ctx->pinned_groups, group_entry) | 7863 | rcu_read_lock(); |
| 7864 | __perf_remove_from_context(event); | 7864 | list_for_each_entry_rcu(event, &ctx->event_list, event_entry) |
| 7865 | list_for_each_entry_safe(event, tmp, &ctx->flexible_groups, group_entry) | ||
| 7866 | __perf_remove_from_context(event); | 7865 | __perf_remove_from_context(event); |
| 7866 | rcu_read_unlock(); | ||
| 7867 | } | 7867 | } |
| 7868 | 7868 | ||
| 7869 | static void perf_event_exit_cpu_context(int cpu) | 7869 | static void perf_event_exit_cpu_context(int cpu) |
| @@ -7887,11 +7887,11 @@ static void perf_event_exit_cpu(int cpu) | |||
| 7887 | { | 7887 | { |
| 7888 | struct swevent_htable *swhash = &per_cpu(swevent_htable, cpu); | 7888 | struct swevent_htable *swhash = &per_cpu(swevent_htable, cpu); |
| 7889 | 7889 | ||
| 7890 | perf_event_exit_cpu_context(cpu); | ||
| 7891 | |||
| 7890 | mutex_lock(&swhash->hlist_mutex); | 7892 | mutex_lock(&swhash->hlist_mutex); |
| 7891 | swevent_hlist_release(swhash); | 7893 | swevent_hlist_release(swhash); |
| 7892 | mutex_unlock(&swhash->hlist_mutex); | 7894 | mutex_unlock(&swhash->hlist_mutex); |
| 7893 | |||
| 7894 | perf_event_exit_cpu_context(cpu); | ||
| 7895 | } | 7895 | } |
| 7896 | #else | 7896 | #else |
| 7897 | static inline void perf_event_exit_cpu(int cpu) { } | 7897 | static inline void perf_event_exit_cpu(int cpu) { } |
diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c index cf68bb36fe58..f14033700c25 100644 --- a/kernel/irq/irqdomain.c +++ b/kernel/irq/irqdomain.c | |||
| @@ -10,6 +10,7 @@ | |||
| 10 | #include <linux/mutex.h> | 10 | #include <linux/mutex.h> |
| 11 | #include <linux/of.h> | 11 | #include <linux/of.h> |
| 12 | #include <linux/of_address.h> | 12 | #include <linux/of_address.h> |
| 13 | #include <linux/of_irq.h> | ||
| 13 | #include <linux/topology.h> | 14 | #include <linux/topology.h> |
| 14 | #include <linux/seq_file.h> | 15 | #include <linux/seq_file.h> |
| 15 | #include <linux/slab.h> | 16 | #include <linux/slab.h> |
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 481a13c43b17..d3bf660cb57f 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c | |||
| @@ -802,8 +802,7 @@ static irqreturn_t irq_thread_fn(struct irq_desc *desc, | |||
| 802 | 802 | ||
| 803 | static void wake_threads_waitq(struct irq_desc *desc) | 803 | static void wake_threads_waitq(struct irq_desc *desc) |
| 804 | { | 804 | { |
| 805 | if (atomic_dec_and_test(&desc->threads_active) && | 805 | if (atomic_dec_and_test(&desc->threads_active)) |
| 806 | waitqueue_active(&desc->wait_for_threads)) | ||
| 807 | wake_up(&desc->wait_for_threads); | 806 | wake_up(&desc->wait_for_threads); |
| 808 | } | 807 | } |
| 809 | 808 | ||
diff --git a/kernel/sched/cpudeadline.c b/kernel/sched/cpudeadline.c index 5b8838b56d1c..5b9bb42b2d47 100644 --- a/kernel/sched/cpudeadline.c +++ b/kernel/sched/cpudeadline.c | |||
| @@ -70,7 +70,7 @@ static void cpudl_heapify(struct cpudl *cp, int idx) | |||
| 70 | 70 | ||
| 71 | static void cpudl_change_key(struct cpudl *cp, int idx, u64 new_dl) | 71 | static void cpudl_change_key(struct cpudl *cp, int idx, u64 new_dl) |
| 72 | { | 72 | { |
| 73 | WARN_ON(!cpu_present(idx) || idx == IDX_INVALID); | 73 | WARN_ON(idx == IDX_INVALID || !cpu_present(idx)); |
| 74 | 74 | ||
| 75 | if (dl_time_before(new_dl, cp->elements[idx].dl)) { | 75 | if (dl_time_before(new_dl, cp->elements[idx].dl)) { |
| 76 | cp->elements[idx].dl = new_dl; | 76 | cp->elements[idx].dl = new_dl; |
| @@ -117,7 +117,7 @@ int cpudl_find(struct cpudl *cp, struct task_struct *p, | |||
| 117 | } | 117 | } |
| 118 | 118 | ||
| 119 | out: | 119 | out: |
| 120 | WARN_ON(!cpu_present(best_cpu) && best_cpu != -1); | 120 | WARN_ON(best_cpu != -1 && !cpu_present(best_cpu)); |
| 121 | 121 | ||
| 122 | return best_cpu; | 122 | return best_cpu; |
| 123 | } | 123 | } |
diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c index 15cbc17fbf84..6e79b3faa4cd 100644 --- a/kernel/sched/deadline.c +++ b/kernel/sched/deadline.c | |||
| @@ -135,7 +135,6 @@ static void update_dl_migration(struct dl_rq *dl_rq) | |||
| 135 | static void inc_dl_migration(struct sched_dl_entity *dl_se, struct dl_rq *dl_rq) | 135 | static void inc_dl_migration(struct sched_dl_entity *dl_se, struct dl_rq *dl_rq) |
| 136 | { | 136 | { |
| 137 | struct task_struct *p = dl_task_of(dl_se); | 137 | struct task_struct *p = dl_task_of(dl_se); |
| 138 | dl_rq = &rq_of_dl_rq(dl_rq)->dl; | ||
| 139 | 138 | ||
| 140 | if (p->nr_cpus_allowed > 1) | 139 | if (p->nr_cpus_allowed > 1) |
| 141 | dl_rq->dl_nr_migratory++; | 140 | dl_rq->dl_nr_migratory++; |
| @@ -146,7 +145,6 @@ static void inc_dl_migration(struct sched_dl_entity *dl_se, struct dl_rq *dl_rq) | |||
| 146 | static void dec_dl_migration(struct sched_dl_entity *dl_se, struct dl_rq *dl_rq) | 145 | static void dec_dl_migration(struct sched_dl_entity *dl_se, struct dl_rq *dl_rq) |
| 147 | { | 146 | { |
| 148 | struct task_struct *p = dl_task_of(dl_se); | 147 | struct task_struct *p = dl_task_of(dl_se); |
| 149 | dl_rq = &rq_of_dl_rq(dl_rq)->dl; | ||
| 150 | 148 | ||
| 151 | if (p->nr_cpus_allowed > 1) | 149 | if (p->nr_cpus_allowed > 1) |
| 152 | dl_rq->dl_nr_migratory--; | 150 | dl_rq->dl_nr_migratory--; |
| @@ -564,6 +562,8 @@ int dl_runtime_exceeded(struct rq *rq, struct sched_dl_entity *dl_se) | |||
| 564 | return 1; | 562 | return 1; |
| 565 | } | 563 | } |
| 566 | 564 | ||
| 565 | extern bool sched_rt_bandwidth_account(struct rt_rq *rt_rq); | ||
| 566 | |||
| 567 | /* | 567 | /* |
| 568 | * Update the current task's runtime statistics (provided it is still | 568 | * Update the current task's runtime statistics (provided it is still |
| 569 | * a -deadline task and has not been removed from the dl_rq). | 569 | * a -deadline task and has not been removed from the dl_rq). |
| @@ -627,11 +627,13 @@ static void update_curr_dl(struct rq *rq) | |||
| 627 | struct rt_rq *rt_rq = &rq->rt; | 627 | struct rt_rq *rt_rq = &rq->rt; |
| 628 | 628 | ||
| 629 | raw_spin_lock(&rt_rq->rt_runtime_lock); | 629 | raw_spin_lock(&rt_rq->rt_runtime_lock); |
| 630 | rt_rq->rt_time += delta_exec; | ||
| 631 | /* | 630 | /* |
| 632 | * We'll let actual RT tasks worry about the overflow here, we | 631 | * We'll let actual RT tasks worry about the overflow here, we |
| 633 | * have our own CBS to keep us inline -- see above. | 632 | * have our own CBS to keep us inline; only account when RT |
| 633 | * bandwidth is relevant. | ||
| 634 | */ | 634 | */ |
| 635 | if (sched_rt_bandwidth_account(rt_rq)) | ||
| 636 | rt_rq->rt_time += delta_exec; | ||
| 635 | raw_spin_unlock(&rt_rq->rt_runtime_lock); | 637 | raw_spin_unlock(&rt_rq->rt_runtime_lock); |
| 636 | } | 638 | } |
| 637 | } | 639 | } |
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 78157099b167..9b4c4f320130 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c | |||
| @@ -7001,15 +7001,15 @@ static void switched_from_fair(struct rq *rq, struct task_struct *p) | |||
| 7001 | struct cfs_rq *cfs_rq = cfs_rq_of(se); | 7001 | struct cfs_rq *cfs_rq = cfs_rq_of(se); |
| 7002 | 7002 | ||
| 7003 | /* | 7003 | /* |
| 7004 | * Ensure the task's vruntime is normalized, so that when its | 7004 | * Ensure the task's vruntime is normalized, so that when it's |
| 7005 | * switched back to the fair class the enqueue_entity(.flags=0) will | 7005 | * switched back to the fair class the enqueue_entity(.flags=0) will |
| 7006 | * do the right thing. | 7006 | * do the right thing. |
| 7007 | * | 7007 | * |
| 7008 | * If it was on_rq, then the dequeue_entity(.flags=0) will already | 7008 | * If it's on_rq, then the dequeue_entity(.flags=0) will already |
| 7009 | * have normalized the vruntime, if it was !on_rq, then only when | 7009 | * have normalized the vruntime, if it's !on_rq, then only when |
| 7010 | * the task is sleeping will it still have non-normalized vruntime. | 7010 | * the task is sleeping will it still have non-normalized vruntime. |
| 7011 | */ | 7011 | */ |
| 7012 | if (!se->on_rq && p->state != TASK_RUNNING) { | 7012 | if (!p->on_rq && p->state != TASK_RUNNING) { |
| 7013 | /* | 7013 | /* |
| 7014 | * Fix up our vruntime so that the current sleep doesn't | 7014 | * Fix up our vruntime so that the current sleep doesn't |
| 7015 | * cause 'unlimited' sleep bonus. | 7015 | * cause 'unlimited' sleep bonus. |
diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c index a2740b775b45..1999021042c7 100644 --- a/kernel/sched/rt.c +++ b/kernel/sched/rt.c | |||
| @@ -538,6 +538,14 @@ static inline struct rt_bandwidth *sched_rt_bandwidth(struct rt_rq *rt_rq) | |||
| 538 | 538 | ||
| 539 | #endif /* CONFIG_RT_GROUP_SCHED */ | 539 | #endif /* CONFIG_RT_GROUP_SCHED */ |
| 540 | 540 | ||
| 541 | bool sched_rt_bandwidth_account(struct rt_rq *rt_rq) | ||
| 542 | { | ||
| 543 | struct rt_bandwidth *rt_b = sched_rt_bandwidth(rt_rq); | ||
| 544 | |||
| 545 | return (hrtimer_active(&rt_b->rt_period_timer) || | ||
| 546 | rt_rq->rt_time < rt_b->rt_runtime); | ||
| 547 | } | ||
| 548 | |||
| 541 | #ifdef CONFIG_SMP | 549 | #ifdef CONFIG_SMP |
| 542 | /* | 550 | /* |
| 543 | * We ran out of runtime, see if we can borrow some from our neighbours. | 551 | * We ran out of runtime, see if we can borrow some from our neighbours. |
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c index e71ffd4eccb5..f3989ceb5cd5 100644 --- a/kernel/trace/trace_events.c +++ b/kernel/trace/trace_events.c | |||
| @@ -1777,6 +1777,16 @@ static void trace_module_add_events(struct module *mod) | |||
| 1777 | { | 1777 | { |
| 1778 | struct ftrace_event_call **call, **start, **end; | 1778 | struct ftrace_event_call **call, **start, **end; |
| 1779 | 1779 | ||
| 1780 | if (!mod->num_trace_events) | ||
| 1781 | return; | ||
| 1782 | |||
| 1783 | /* Don't add infrastructure for mods without tracepoints */ | ||
| 1784 | if (trace_module_has_bad_taint(mod)) { | ||
| 1785 | pr_err("%s: module has bad taint, not creating trace events\n", | ||
| 1786 | mod->name); | ||
| 1787 | return; | ||
| 1788 | } | ||
| 1789 | |||
| 1780 | start = mod->trace_events; | 1790 | start = mod->trace_events; |
| 1781 | end = mod->trace_events + mod->num_trace_events; | 1791 | end = mod->trace_events + mod->num_trace_events; |
| 1782 | 1792 | ||
diff --git a/kernel/tracepoint.c b/kernel/tracepoint.c index 29f26540e9c9..031cc5655a51 100644 --- a/kernel/tracepoint.c +++ b/kernel/tracepoint.c | |||
| @@ -631,6 +631,11 @@ void tracepoint_iter_reset(struct tracepoint_iter *iter) | |||
| 631 | EXPORT_SYMBOL_GPL(tracepoint_iter_reset); | 631 | EXPORT_SYMBOL_GPL(tracepoint_iter_reset); |
| 632 | 632 | ||
| 633 | #ifdef CONFIG_MODULES | 633 | #ifdef CONFIG_MODULES |
| 634 | bool trace_module_has_bad_taint(struct module *mod) | ||
| 635 | { | ||
| 636 | return mod->taints & ~((1 << TAINT_OOT_MODULE) | (1 << TAINT_CRAP)); | ||
| 637 | } | ||
| 638 | |||
| 634 | static int tracepoint_module_coming(struct module *mod) | 639 | static int tracepoint_module_coming(struct module *mod) |
| 635 | { | 640 | { |
| 636 | struct tp_module *tp_mod, *iter; | 641 | struct tp_module *tp_mod, *iter; |
| @@ -641,7 +646,7 @@ static int tracepoint_module_coming(struct module *mod) | |||
| 641 | * module headers (for forced load), to make sure we don't cause a crash. | 646 | * module headers (for forced load), to make sure we don't cause a crash. |
| 642 | * Staging and out-of-tree GPL modules are fine. | 647 | * Staging and out-of-tree GPL modules are fine. |
| 643 | */ | 648 | */ |
| 644 | if (mod->taints & ~((1 << TAINT_OOT_MODULE) | (1 << TAINT_CRAP))) | 649 | if (trace_module_has_bad_taint(mod)) |
| 645 | return 0; | 650 | return 0; |
| 646 | mutex_lock(&tracepoints_mutex); | 651 | mutex_lock(&tracepoints_mutex); |
| 647 | tp_mod = kmalloc(sizeof(struct tp_module), GFP_KERNEL); | 652 | tp_mod = kmalloc(sizeof(struct tp_module), GFP_KERNEL); |
diff --git a/lib/dma-debug.c b/lib/dma-debug.c index 2defd1308b04..98f2d7e91a91 100644 --- a/lib/dma-debug.c +++ b/lib/dma-debug.c | |||
| @@ -424,111 +424,134 @@ void debug_dma_dump_mappings(struct device *dev) | |||
| 424 | EXPORT_SYMBOL(debug_dma_dump_mappings); | 424 | EXPORT_SYMBOL(debug_dma_dump_mappings); |
| 425 | 425 | ||
| 426 | /* | 426 | /* |
| 427 | * For each page mapped (initial page in the case of | 427 | * For each mapping (initial cacheline in the case of |
| 428 | * dma_alloc_coherent/dma_map_{single|page}, or each page in a | 428 | * dma_alloc_coherent/dma_map_page, initial cacheline in each page of a |
| 429 | * scatterlist) insert into this tree using the pfn as the key. At | 429 | * scatterlist, or the cacheline specified in dma_map_single) insert |
| 430 | * into this tree using the cacheline as the key. At | ||
| 430 | * dma_unmap_{single|sg|page} or dma_free_coherent delete the entry. If | 431 | * dma_unmap_{single|sg|page} or dma_free_coherent delete the entry. If |
| 431 | * the pfn already exists at insertion time add a tag as a reference | 432 | * the entry already exists at insertion time add a tag as a reference |
| 432 | * count for the overlapping mappings. For now, the overlap tracking | 433 | * count for the overlapping mappings. For now, the overlap tracking |
| 433 | * just ensures that 'unmaps' balance 'maps' before marking the pfn | 434 | * just ensures that 'unmaps' balance 'maps' before marking the |
| 434 | * idle, but we should also be flagging overlaps as an API violation. | 435 | * cacheline idle, but we should also be flagging overlaps as an API |
| 436 | * violation. | ||
| 435 | * | 437 | * |
| 436 | * Memory usage is mostly constrained by the maximum number of available | 438 | * Memory usage is mostly constrained by the maximum number of available |
| 437 | * dma-debug entries in that we need a free dma_debug_entry before | 439 | * dma-debug entries in that we need a free dma_debug_entry before |
| 438 | * inserting into the tree. In the case of dma_map_{single|page} and | 440 | * inserting into the tree. In the case of dma_map_page and |
| 439 | * dma_alloc_coherent there is only one dma_debug_entry and one pfn to | 441 | * dma_alloc_coherent there is only one dma_debug_entry and one |
| 440 | * track per event. dma_map_sg(), on the other hand, | 442 | * dma_active_cacheline entry to track per event. dma_map_sg(), on the |
| 441 | * consumes a single dma_debug_entry, but inserts 'nents' entries into | 443 | * other hand, consumes a single dma_debug_entry, but inserts 'nents' |
| 442 | * the tree. | 444 | * entries into the tree. |
| 443 | * | 445 | * |
| 444 | * At any time debug_dma_assert_idle() can be called to trigger a | 446 | * At any time debug_dma_assert_idle() can be called to trigger a |
| 445 | * warning if the given page is in the active set. | 447 | * warning if any cachelines in the given page are in the active set. |
| 446 | */ | 448 | */ |
| 447 | static RADIX_TREE(dma_active_pfn, GFP_NOWAIT); | 449 | static RADIX_TREE(dma_active_cacheline, GFP_NOWAIT); |
| 448 | static DEFINE_SPINLOCK(radix_lock); | 450 | static DEFINE_SPINLOCK(radix_lock); |
| 449 | #define ACTIVE_PFN_MAX_OVERLAP ((1 << RADIX_TREE_MAX_TAGS) - 1) | 451 | #define ACTIVE_CACHELINE_MAX_OVERLAP ((1 << RADIX_TREE_MAX_TAGS) - 1) |
| 452 | #define CACHELINE_PER_PAGE_SHIFT (PAGE_SHIFT - L1_CACHE_SHIFT) | ||
| 453 | #define CACHELINES_PER_PAGE (1 << CACHELINE_PER_PAGE_SHIFT) | ||
| 450 | 454 | ||
| 451 | static int active_pfn_read_overlap(unsigned long pfn) | 455 | static phys_addr_t to_cacheline_number(struct dma_debug_entry *entry) |
| 456 | { | ||
| 457 | return (entry->pfn << CACHELINE_PER_PAGE_SHIFT) + | ||
| 458 | (entry->offset >> L1_CACHE_SHIFT); | ||
| 459 | } | ||
| 460 | |||
| 461 | static int active_cacheline_read_overlap(phys_addr_t cln) | ||
| 452 | { | 462 | { |
| 453 | int overlap = 0, i; | 463 | int overlap = 0, i; |
| 454 | 464 | ||
| 455 | for (i = RADIX_TREE_MAX_TAGS - 1; i >= 0; i--) | 465 | for (i = RADIX_TREE_MAX_TAGS - 1; i >= 0; i--) |
| 456 | if (radix_tree_tag_get(&dma_active_pfn, pfn, i)) | 466 | if (radix_tree_tag_get(&dma_active_cacheline, cln, i)) |
| 457 | overlap |= 1 << i; | 467 | overlap |= 1 << i; |
| 458 | return overlap; | 468 | return overlap; |
| 459 | } | 469 | } |
| 460 | 470 | ||
| 461 | static int active_pfn_set_overlap(unsigned long pfn, int overlap) | 471 | static int active_cacheline_set_overlap(phys_addr_t cln, int overlap) |
| 462 | { | 472 | { |
| 463 | int i; | 473 | int i; |
| 464 | 474 | ||
| 465 | if (overlap > ACTIVE_PFN_MAX_OVERLAP || overlap < 0) | 475 | if (overlap > ACTIVE_CACHELINE_MAX_OVERLAP || overlap < 0) |
| 466 | return overlap; | 476 | return overlap; |
| 467 | 477 | ||
| 468 | for (i = RADIX_TREE_MAX_TAGS - 1; i >= 0; i--) | 478 | for (i = RADIX_TREE_MAX_TAGS - 1; i >= 0; i--) |
| 469 | if (overlap & 1 << i) | 479 | if (overlap & 1 << i) |
| 470 | radix_tree_tag_set(&dma_active_pfn, pfn, i); | 480 | radix_tree_tag_set(&dma_active_cacheline, cln, i); |
| 471 | else | 481 | else |
| 472 | radix_tree_tag_clear(&dma_active_pfn, pfn, i); | 482 | radix_tree_tag_clear(&dma_active_cacheline, cln, i); |
| 473 | 483 | ||
| 474 | return overlap; | 484 | return overlap; |
| 475 | } | 485 | } |
| 476 | 486 | ||
| 477 | static void active_pfn_inc_overlap(unsigned long pfn) | 487 | static void active_cacheline_inc_overlap(phys_addr_t cln) |
| 478 | { | 488 | { |
| 479 | int overlap = active_pfn_read_overlap(pfn); | 489 | int overlap = active_cacheline_read_overlap(cln); |
| 480 | 490 | ||
| 481 | overlap = active_pfn_set_overlap(pfn, ++overlap); | 491 | overlap = active_cacheline_set_overlap(cln, ++overlap); |
| 482 | 492 | ||
| 483 | /* If we overflowed the overlap counter then we're potentially | 493 | /* If we overflowed the overlap counter then we're potentially |
| 484 | * leaking dma-mappings. Otherwise, if maps and unmaps are | 494 | * leaking dma-mappings. Otherwise, if maps and unmaps are |
| 485 | * balanced then this overflow may cause false negatives in | 495 | * balanced then this overflow may cause false negatives in |
| 486 | * debug_dma_assert_idle() as the pfn may be marked idle | 496 | * debug_dma_assert_idle() as the cacheline may be marked idle |
| 487 | * prematurely. | 497 | * prematurely. |
| 488 | */ | 498 | */ |
| 489 | WARN_ONCE(overlap > ACTIVE_PFN_MAX_OVERLAP, | 499 | WARN_ONCE(overlap > ACTIVE_CACHELINE_MAX_OVERLAP, |
| 490 | "DMA-API: exceeded %d overlapping mappings of pfn %lx\n", | 500 | "DMA-API: exceeded %d overlapping mappings of cacheline %pa\n", |
| 491 | ACTIVE_PFN_MAX_OVERLAP, pfn); | 501 | ACTIVE_CACHELINE_MAX_OVERLAP, &cln); |
| 492 | } | 502 | } |
| 493 | 503 | ||
| 494 | static int active_pfn_dec_overlap(unsigned long pfn) | 504 | static int active_cacheline_dec_overlap(phys_addr_t cln) |
| 495 | { | 505 | { |
| 496 | int overlap = active_pfn_read_overlap(pfn); | 506 | int overlap = active_cacheline_read_overlap(cln); |
| 497 | 507 | ||
| 498 | return active_pfn_set_overlap(pfn, --overlap); | 508 | return active_cacheline_set_overlap(cln, --overlap); |
| 499 | } | 509 | } |
| 500 | 510 | ||
| 501 | static int active_pfn_insert(struct dma_debug_entry *entry) | 511 | static int active_cacheline_insert(struct dma_debug_entry *entry) |
| 502 | { | 512 | { |
| 513 | phys_addr_t cln = to_cacheline_number(entry); | ||
| 503 | unsigned long flags; | 514 | unsigned long flags; |
| 504 | int rc; | 515 | int rc; |
| 505 | 516 | ||
| 517 | /* If the device is not writing memory then we don't have any | ||
| 518 | * concerns about the cpu consuming stale data. This mitigates | ||
| 519 | * legitimate usages of overlapping mappings. | ||
| 520 | */ | ||
| 521 | if (entry->direction == DMA_TO_DEVICE) | ||
| 522 | return 0; | ||
| 523 | |||
| 506 | spin_lock_irqsave(&radix_lock, flags); | 524 | spin_lock_irqsave(&radix_lock, flags); |
| 507 | rc = radix_tree_insert(&dma_active_pfn, entry->pfn, entry); | 525 | rc = radix_tree_insert(&dma_active_cacheline, cln, entry); |
| 508 | if (rc == -EEXIST) | 526 | if (rc == -EEXIST) |
| 509 | active_pfn_inc_overlap(entry->pfn); | 527 | active_cacheline_inc_overlap(cln); |
| 510 | spin_unlock_irqrestore(&radix_lock, flags); | 528 | spin_unlock_irqrestore(&radix_lock, flags); |
| 511 | 529 | ||
| 512 | return rc; | 530 | return rc; |
| 513 | } | 531 | } |
| 514 | 532 | ||
| 515 | static void active_pfn_remove(struct dma_debug_entry *entry) | 533 | static void active_cacheline_remove(struct dma_debug_entry *entry) |
| 516 | { | 534 | { |
| 535 | phys_addr_t cln = to_cacheline_number(entry); | ||
| 517 | unsigned long flags; | 536 | unsigned long flags; |
| 518 | 537 | ||
| 538 | /* ...mirror the insert case */ | ||
| 539 | if (entry->direction == DMA_TO_DEVICE) | ||
| 540 | return; | ||
| 541 | |||
| 519 | spin_lock_irqsave(&radix_lock, flags); | 542 | spin_lock_irqsave(&radix_lock, flags); |
| 520 | /* since we are counting overlaps the final put of the | 543 | /* since we are counting overlaps the final put of the |
| 521 | * entry->pfn will occur when the overlap count is 0. | 544 | * cacheline will occur when the overlap count is 0. |
| 522 | * active_pfn_dec_overlap() returns -1 in that case | 545 | * active_cacheline_dec_overlap() returns -1 in that case |
| 523 | */ | 546 | */ |
| 524 | if (active_pfn_dec_overlap(entry->pfn) < 0) | 547 | if (active_cacheline_dec_overlap(cln) < 0) |
| 525 | radix_tree_delete(&dma_active_pfn, entry->pfn); | 548 | radix_tree_delete(&dma_active_cacheline, cln); |
| 526 | spin_unlock_irqrestore(&radix_lock, flags); | 549 | spin_unlock_irqrestore(&radix_lock, flags); |
| 527 | } | 550 | } |
| 528 | 551 | ||
| 529 | /** | 552 | /** |
| 530 | * debug_dma_assert_idle() - assert that a page is not undergoing dma | 553 | * debug_dma_assert_idle() - assert that a page is not undergoing dma |
| 531 | * @page: page to lookup in the dma_active_pfn tree | 554 | * @page: page to lookup in the dma_active_cacheline tree |
| 532 | * | 555 | * |
| 533 | * Place a call to this routine in cases where the cpu touching the page | 556 | * Place a call to this routine in cases where the cpu touching the page |
| 534 | * before the dma completes (page is dma_unmapped) will lead to data | 557 | * before the dma completes (page is dma_unmapped) will lead to data |
| @@ -536,22 +559,38 @@ static void active_pfn_remove(struct dma_debug_entry *entry) | |||
| 536 | */ | 559 | */ |
| 537 | void debug_dma_assert_idle(struct page *page) | 560 | void debug_dma_assert_idle(struct page *page) |
| 538 | { | 561 | { |
| 562 | static struct dma_debug_entry *ents[CACHELINES_PER_PAGE]; | ||
| 563 | struct dma_debug_entry *entry = NULL; | ||
| 564 | void **results = (void **) &ents; | ||
| 565 | unsigned int nents, i; | ||
| 539 | unsigned long flags; | 566 | unsigned long flags; |
| 540 | struct dma_debug_entry *entry; | 567 | phys_addr_t cln; |
| 541 | 568 | ||
| 542 | if (!page) | 569 | if (!page) |
| 543 | return; | 570 | return; |
| 544 | 571 | ||
| 572 | cln = (phys_addr_t) page_to_pfn(page) << CACHELINE_PER_PAGE_SHIFT; | ||
| 545 | spin_lock_irqsave(&radix_lock, flags); | 573 | spin_lock_irqsave(&radix_lock, flags); |
| 546 | entry = radix_tree_lookup(&dma_active_pfn, page_to_pfn(page)); | 574 | nents = radix_tree_gang_lookup(&dma_active_cacheline, results, cln, |
| 575 | CACHELINES_PER_PAGE); | ||
| 576 | for (i = 0; i < nents; i++) { | ||
| 577 | phys_addr_t ent_cln = to_cacheline_number(ents[i]); | ||
| 578 | |||
| 579 | if (ent_cln == cln) { | ||
| 580 | entry = ents[i]; | ||
| 581 | break; | ||
| 582 | } else if (ent_cln >= cln + CACHELINES_PER_PAGE) | ||
| 583 | break; | ||
| 584 | } | ||
| 547 | spin_unlock_irqrestore(&radix_lock, flags); | 585 | spin_unlock_irqrestore(&radix_lock, flags); |
| 548 | 586 | ||
| 549 | if (!entry) | 587 | if (!entry) |
| 550 | return; | 588 | return; |
| 551 | 589 | ||
| 590 | cln = to_cacheline_number(entry); | ||
| 552 | err_printk(entry->dev, entry, | 591 | err_printk(entry->dev, entry, |
| 553 | "DMA-API: cpu touching an active dma mapped page " | 592 | "DMA-API: cpu touching an active dma mapped cacheline [cln=%pa]\n", |
| 554 | "[pfn=0x%lx]\n", entry->pfn); | 593 | &cln); |
| 555 | } | 594 | } |
| 556 | 595 | ||
| 557 | /* | 596 | /* |
| @@ -568,9 +607,9 @@ static void add_dma_entry(struct dma_debug_entry *entry) | |||
| 568 | hash_bucket_add(bucket, entry); | 607 | hash_bucket_add(bucket, entry); |
| 569 | put_hash_bucket(bucket, &flags); | 608 | put_hash_bucket(bucket, &flags); |
| 570 | 609 | ||
| 571 | rc = active_pfn_insert(entry); | 610 | rc = active_cacheline_insert(entry); |
| 572 | if (rc == -ENOMEM) { | 611 | if (rc == -ENOMEM) { |
| 573 | pr_err("DMA-API: pfn tracking ENOMEM, dma-debug disabled\n"); | 612 | pr_err("DMA-API: cacheline tracking ENOMEM, dma-debug disabled\n"); |
| 574 | global_disable = true; | 613 | global_disable = true; |
| 575 | } | 614 | } |
| 576 | 615 | ||
| @@ -631,7 +670,7 @@ static void dma_entry_free(struct dma_debug_entry *entry) | |||
| 631 | { | 670 | { |
| 632 | unsigned long flags; | 671 | unsigned long flags; |
| 633 | 672 | ||
| 634 | active_pfn_remove(entry); | 673 | active_cacheline_remove(entry); |
| 635 | 674 | ||
| 636 | /* | 675 | /* |
| 637 | * add to beginning of the list - this way the entries are | 676 | * add to beginning of the list - this way the entries are |
diff --git a/lib/radix-tree.c b/lib/radix-tree.c index 7811ed3b4e70..bd4a8dfdf0b8 100644 --- a/lib/radix-tree.c +++ b/lib/radix-tree.c | |||
| @@ -1253,8 +1253,10 @@ unsigned long radix_tree_locate_item(struct radix_tree_root *root, void *item) | |||
| 1253 | 1253 | ||
| 1254 | node = indirect_to_ptr(node); | 1254 | node = indirect_to_ptr(node); |
| 1255 | max_index = radix_tree_maxindex(node->height); | 1255 | max_index = radix_tree_maxindex(node->height); |
| 1256 | if (cur_index > max_index) | 1256 | if (cur_index > max_index) { |
| 1257 | rcu_read_unlock(); | ||
| 1257 | break; | 1258 | break; |
| 1259 | } | ||
| 1258 | 1260 | ||
| 1259 | cur_index = __locate(node, item, cur_index, &found_index); | 1261 | cur_index = __locate(node, item, cur_index, &found_index); |
| 1260 | rcu_read_unlock(); | 1262 | rcu_read_unlock(); |
diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 4df39b1bde91..1546655a2d78 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c | |||
| @@ -1961,7 +1961,7 @@ out: | |||
| 1961 | return ret; | 1961 | return ret; |
| 1962 | } | 1962 | } |
| 1963 | 1963 | ||
| 1964 | #define VM_NO_THP (VM_SPECIAL|VM_MIXEDMAP|VM_HUGETLB|VM_SHARED|VM_MAYSHARE) | 1964 | #define VM_NO_THP (VM_SPECIAL | VM_HUGETLB | VM_SHARED | VM_MAYSHARE) |
| 1965 | 1965 | ||
| 1966 | int hugepage_madvise(struct vm_area_struct *vma, | 1966 | int hugepage_madvise(struct vm_area_struct *vma, |
| 1967 | unsigned long *vm_flags, int advice) | 1967 | unsigned long *vm_flags, int advice) |
| @@ -444,7 +444,7 @@ static void break_cow(struct rmap_item *rmap_item) | |||
| 444 | static struct page *page_trans_compound_anon(struct page *page) | 444 | static struct page *page_trans_compound_anon(struct page *page) |
| 445 | { | 445 | { |
| 446 | if (PageTransCompound(page)) { | 446 | if (PageTransCompound(page)) { |
| 447 | struct page *head = compound_trans_head(page); | 447 | struct page *head = compound_head(page); |
| 448 | /* | 448 | /* |
| 449 | * head may actually be splitted and freed from under | 449 | * head may actually be splitted and freed from under |
| 450 | * us but it's ok here. | 450 | * us but it's ok here. |
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index ce7a8cc7b404..5b6b0039f725 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
| @@ -1127,8 +1127,8 @@ skip_node: | |||
| 1127 | * skipping css reference should be safe. | 1127 | * skipping css reference should be safe. |
| 1128 | */ | 1128 | */ |
| 1129 | if (next_css) { | 1129 | if (next_css) { |
| 1130 | if ((next_css->flags & CSS_ONLINE) && | 1130 | if ((next_css == &root->css) || |
| 1131 | (next_css == &root->css || css_tryget(next_css))) | 1131 | ((next_css->flags & CSS_ONLINE) && css_tryget(next_css))) |
| 1132 | return mem_cgroup_from_css(next_css); | 1132 | return mem_cgroup_from_css(next_css); |
| 1133 | 1133 | ||
| 1134 | prev_css = next_css; | 1134 | prev_css = next_css; |
| @@ -6595,6 +6595,7 @@ static void mem_cgroup_css_offline(struct cgroup_subsys_state *css) | |||
| 6595 | { | 6595 | { |
| 6596 | struct mem_cgroup *memcg = mem_cgroup_from_css(css); | 6596 | struct mem_cgroup *memcg = mem_cgroup_from_css(css); |
| 6597 | struct mem_cgroup_event *event, *tmp; | 6597 | struct mem_cgroup_event *event, *tmp; |
| 6598 | struct cgroup_subsys_state *iter; | ||
| 6598 | 6599 | ||
| 6599 | /* | 6600 | /* |
| 6600 | * Unregister events and notify userspace. | 6601 | * Unregister events and notify userspace. |
| @@ -6611,7 +6612,14 @@ static void mem_cgroup_css_offline(struct cgroup_subsys_state *css) | |||
| 6611 | kmem_cgroup_css_offline(memcg); | 6612 | kmem_cgroup_css_offline(memcg); |
| 6612 | 6613 | ||
| 6613 | mem_cgroup_invalidate_reclaim_iterators(memcg); | 6614 | mem_cgroup_invalidate_reclaim_iterators(memcg); |
| 6614 | mem_cgroup_reparent_charges(memcg); | 6615 | |
| 6616 | /* | ||
| 6617 | * This requires that offlining is serialized. Right now that is | ||
| 6618 | * guaranteed because css_killed_work_fn() holds the cgroup_mutex. | ||
| 6619 | */ | ||
| 6620 | css_for_each_descendant_post(iter, css) | ||
| 6621 | mem_cgroup_reparent_charges(mem_cgroup_from_css(iter)); | ||
| 6622 | |||
| 6615 | mem_cgroup_destroy_all_caches(memcg); | 6623 | mem_cgroup_destroy_all_caches(memcg); |
| 6616 | vmpressure_cleanup(&memcg->vmpressure); | 6624 | vmpressure_cleanup(&memcg->vmpressure); |
| 6617 | } | 6625 | } |
diff --git a/mm/memory-failure.c b/mm/memory-failure.c index 2f2f34a4e77d..90002ea43638 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c | |||
| @@ -1651,7 +1651,7 @@ int soft_offline_page(struct page *page, int flags) | |||
| 1651 | { | 1651 | { |
| 1652 | int ret; | 1652 | int ret; |
| 1653 | unsigned long pfn = page_to_pfn(page); | 1653 | unsigned long pfn = page_to_pfn(page); |
| 1654 | struct page *hpage = compound_trans_head(page); | 1654 | struct page *hpage = compound_head(page); |
| 1655 | 1655 | ||
| 1656 | if (PageHWPoison(page)) { | 1656 | if (PageHWPoison(page)) { |
| 1657 | pr_info("soft offline: %#lx page already poisoned\n", pfn); | 1657 | pr_info("soft offline: %#lx page already poisoned\n", pfn); |
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index e3758a09a009..3bac76ae4b30 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
| @@ -369,9 +369,11 @@ void prep_compound_page(struct page *page, unsigned long order) | |||
| 369 | __SetPageHead(page); | 369 | __SetPageHead(page); |
| 370 | for (i = 1; i < nr_pages; i++) { | 370 | for (i = 1; i < nr_pages; i++) { |
| 371 | struct page *p = page + i; | 371 | struct page *p = page + i; |
| 372 | __SetPageTail(p); | ||
| 373 | set_page_count(p, 0); | 372 | set_page_count(p, 0); |
| 374 | p->first_page = page; | 373 | p->first_page = page; |
| 374 | /* Make sure p->first_page is always valid for PageTail() */ | ||
| 375 | smp_wmb(); | ||
| 376 | __SetPageTail(p); | ||
| 375 | } | 377 | } |
| 376 | } | 378 | } |
| 377 | 379 | ||
| @@ -1236,6 +1238,15 @@ void drain_zone_pages(struct zone *zone, struct per_cpu_pages *pcp) | |||
| 1236 | } | 1238 | } |
| 1237 | local_irq_restore(flags); | 1239 | local_irq_restore(flags); |
| 1238 | } | 1240 | } |
| 1241 | static bool gfp_thisnode_allocation(gfp_t gfp_mask) | ||
| 1242 | { | ||
| 1243 | return (gfp_mask & GFP_THISNODE) == GFP_THISNODE; | ||
| 1244 | } | ||
| 1245 | #else | ||
| 1246 | static bool gfp_thisnode_allocation(gfp_t gfp_mask) | ||
| 1247 | { | ||
| 1248 | return false; | ||
| 1249 | } | ||
| 1239 | #endif | 1250 | #endif |
| 1240 | 1251 | ||
| 1241 | /* | 1252 | /* |
| @@ -1572,7 +1583,13 @@ again: | |||
| 1572 | get_pageblock_migratetype(page)); | 1583 | get_pageblock_migratetype(page)); |
| 1573 | } | 1584 | } |
| 1574 | 1585 | ||
| 1575 | __mod_zone_page_state(zone, NR_ALLOC_BATCH, -(1 << order)); | 1586 | /* |
| 1587 | * NOTE: GFP_THISNODE allocations do not partake in the kswapd | ||
| 1588 | * aging protocol, so they can't be fair. | ||
| 1589 | */ | ||
| 1590 | if (!gfp_thisnode_allocation(gfp_flags)) | ||
| 1591 | __mod_zone_page_state(zone, NR_ALLOC_BATCH, -(1 << order)); | ||
| 1592 | |||
| 1576 | __count_zone_vm_events(PGALLOC, zone, 1 << order); | 1593 | __count_zone_vm_events(PGALLOC, zone, 1 << order); |
| 1577 | zone_statistics(preferred_zone, zone, gfp_flags); | 1594 | zone_statistics(preferred_zone, zone, gfp_flags); |
| 1578 | local_irq_restore(flags); | 1595 | local_irq_restore(flags); |
| @@ -1944,8 +1961,12 @@ zonelist_scan: | |||
| 1944 | * ultimately fall back to remote zones that do not | 1961 | * ultimately fall back to remote zones that do not |
| 1945 | * partake in the fairness round-robin cycle of this | 1962 | * partake in the fairness round-robin cycle of this |
| 1946 | * zonelist. | 1963 | * zonelist. |
| 1964 | * | ||
| 1965 | * NOTE: GFP_THISNODE allocations do not partake in | ||
| 1966 | * the kswapd aging protocol, so they can't be fair. | ||
| 1947 | */ | 1967 | */ |
| 1948 | if (alloc_flags & ALLOC_WMARK_LOW) { | 1968 | if ((alloc_flags & ALLOC_WMARK_LOW) && |
| 1969 | !gfp_thisnode_allocation(gfp_mask)) { | ||
| 1949 | if (zone_page_state(zone, NR_ALLOC_BATCH) <= 0) | 1970 | if (zone_page_state(zone, NR_ALLOC_BATCH) <= 0) |
| 1950 | continue; | 1971 | continue; |
| 1951 | if (!zone_local(preferred_zone, zone)) | 1972 | if (!zone_local(preferred_zone, zone)) |
| @@ -2501,8 +2522,7 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order, | |||
| 2501 | * allowed per node queues are empty and that nodes are | 2522 | * allowed per node queues are empty and that nodes are |
| 2502 | * over allocated. | 2523 | * over allocated. |
| 2503 | */ | 2524 | */ |
| 2504 | if (IS_ENABLED(CONFIG_NUMA) && | 2525 | if (gfp_thisnode_allocation(gfp_mask)) |
| 2505 | (gfp_mask & GFP_THISNODE) == GFP_THISNODE) | ||
| 2506 | goto nopage; | 2526 | goto nopage; |
| 2507 | 2527 | ||
| 2508 | restart: | 2528 | restart: |
| @@ -98,7 +98,7 @@ static void put_compound_page(struct page *page) | |||
| 98 | } | 98 | } |
| 99 | 99 | ||
| 100 | /* __split_huge_page_refcount can run under us */ | 100 | /* __split_huge_page_refcount can run under us */ |
| 101 | page_head = compound_trans_head(page); | 101 | page_head = compound_head(page); |
| 102 | 102 | ||
| 103 | /* | 103 | /* |
| 104 | * THP can not break up slab pages so avoid taking | 104 | * THP can not break up slab pages so avoid taking |
| @@ -253,7 +253,7 @@ bool __get_page_tail(struct page *page) | |||
| 253 | */ | 253 | */ |
| 254 | unsigned long flags; | 254 | unsigned long flags; |
| 255 | bool got; | 255 | bool got; |
| 256 | struct page *page_head = compound_trans_head(page); | 256 | struct page *page_head = compound_head(page); |
| 257 | 257 | ||
| 258 | /* Ref to put_compound_page() comment. */ | 258 | /* Ref to put_compound_page() comment. */ |
| 259 | if (!__compound_tail_refcounted(page_head)) { | 259 | if (!__compound_tail_refcounted(page_head)) { |
diff --git a/net/can/raw.c b/net/can/raw.c index 8be757cca2ec..081e81fd017f 100644 --- a/net/can/raw.c +++ b/net/can/raw.c | |||
| @@ -121,13 +121,9 @@ static void raw_rcv(struct sk_buff *oskb, void *data) | |||
| 121 | if (!ro->recv_own_msgs && oskb->sk == sk) | 121 | if (!ro->recv_own_msgs && oskb->sk == sk) |
| 122 | return; | 122 | return; |
| 123 | 123 | ||
| 124 | /* do not pass frames with DLC > 8 to a legacy socket */ | 124 | /* do not pass non-CAN2.0 frames to a legacy socket */ |
| 125 | if (!ro->fd_frames) { | 125 | if (!ro->fd_frames && oskb->len != CAN_MTU) |
| 126 | struct canfd_frame *cfd = (struct canfd_frame *)oskb->data; | 126 | return; |
| 127 | |||
| 128 | if (unlikely(cfd->len > CAN_MAX_DLEN)) | ||
| 129 | return; | ||
| 130 | } | ||
| 131 | 127 | ||
| 132 | /* clone the given skb to be able to enqueue it into the rcv queue */ | 128 | /* clone the given skb to be able to enqueue it into the rcv queue */ |
| 133 | skb = skb_clone(oskb, GFP_ATOMIC); | 129 | skb = skb_clone(oskb, GFP_ATOMIC); |
| @@ -738,9 +734,7 @@ static int raw_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
| 738 | struct msghdr *msg, size_t size, int flags) | 734 | struct msghdr *msg, size_t size, int flags) |
| 739 | { | 735 | { |
| 740 | struct sock *sk = sock->sk; | 736 | struct sock *sk = sock->sk; |
| 741 | struct raw_sock *ro = raw_sk(sk); | ||
| 742 | struct sk_buff *skb; | 737 | struct sk_buff *skb; |
| 743 | int rxmtu; | ||
| 744 | int err = 0; | 738 | int err = 0; |
| 745 | int noblock; | 739 | int noblock; |
| 746 | 740 | ||
| @@ -751,20 +745,10 @@ static int raw_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
| 751 | if (!skb) | 745 | if (!skb) |
| 752 | return err; | 746 | return err; |
| 753 | 747 | ||
| 754 | /* | 748 | if (size < skb->len) |
| 755 | * when serving a legacy socket the DLC <= 8 is already checked inside | ||
| 756 | * raw_rcv(). Now check if we need to pass a canfd_frame to a legacy | ||
| 757 | * socket and cut the possible CANFD_MTU/CAN_MTU length to CAN_MTU | ||
| 758 | */ | ||
| 759 | if (!ro->fd_frames) | ||
| 760 | rxmtu = CAN_MTU; | ||
| 761 | else | ||
| 762 | rxmtu = skb->len; | ||
| 763 | |||
| 764 | if (size < rxmtu) | ||
| 765 | msg->msg_flags |= MSG_TRUNC; | 749 | msg->msg_flags |= MSG_TRUNC; |
| 766 | else | 750 | else |
| 767 | size = rxmtu; | 751 | size = skb->len; |
| 768 | 752 | ||
| 769 | err = memcpy_toiovec(msg->msg_iov, skb->data, size); | 753 | err = memcpy_toiovec(msg->msg_iov, skb->data, size); |
| 770 | if (err < 0) { | 754 | if (err < 0) { |
diff --git a/net/core/neighbour.c b/net/core/neighbour.c index b9e9e0d38672..e16129019c66 100644 --- a/net/core/neighbour.c +++ b/net/core/neighbour.c | |||
| @@ -766,9 +766,6 @@ static void neigh_periodic_work(struct work_struct *work) | |||
| 766 | nht = rcu_dereference_protected(tbl->nht, | 766 | nht = rcu_dereference_protected(tbl->nht, |
| 767 | lockdep_is_held(&tbl->lock)); | 767 | lockdep_is_held(&tbl->lock)); |
| 768 | 768 | ||
| 769 | if (atomic_read(&tbl->entries) < tbl->gc_thresh1) | ||
| 770 | goto out; | ||
| 771 | |||
| 772 | /* | 769 | /* |
| 773 | * periodically recompute ReachableTime from random function | 770 | * periodically recompute ReachableTime from random function |
| 774 | */ | 771 | */ |
| @@ -781,6 +778,9 @@ static void neigh_periodic_work(struct work_struct *work) | |||
| 781 | neigh_rand_reach_time(NEIGH_VAR(p, BASE_REACHABLE_TIME)); | 778 | neigh_rand_reach_time(NEIGH_VAR(p, BASE_REACHABLE_TIME)); |
| 782 | } | 779 | } |
| 783 | 780 | ||
| 781 | if (atomic_read(&tbl->entries) < tbl->gc_thresh1) | ||
| 782 | goto out; | ||
| 783 | |||
| 784 | for (i = 0 ; i < (1 << nht->hash_shift); i++) { | 784 | for (i = 0 ; i < (1 << nht->hash_shift); i++) { |
| 785 | np = &nht->hash_buckets[i]; | 785 | np = &nht->hash_buckets[i]; |
| 786 | 786 | ||
| @@ -3046,7 +3046,7 @@ int neigh_sysctl_register(struct net_device *dev, struct neigh_parms *p, | |||
| 3046 | if (!t) | 3046 | if (!t) |
| 3047 | goto err; | 3047 | goto err; |
| 3048 | 3048 | ||
| 3049 | for (i = 0; i < ARRAY_SIZE(t->neigh_vars); i++) { | 3049 | for (i = 0; i < NEIGH_VAR_GC_INTERVAL; i++) { |
| 3050 | t->neigh_vars[i].data += (long) p; | 3050 | t->neigh_vars[i].data += (long) p; |
| 3051 | t->neigh_vars[i].extra1 = dev; | 3051 | t->neigh_vars[i].extra1 = dev; |
| 3052 | t->neigh_vars[i].extra2 = p; | 3052 | t->neigh_vars[i].extra2 = p; |
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 5976ef0846bd..5d6236d9fdce 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
| @@ -707,9 +707,6 @@ static void __copy_skb_header(struct sk_buff *new, const struct sk_buff *old) | |||
| 707 | new->mark = old->mark; | 707 | new->mark = old->mark; |
| 708 | new->skb_iif = old->skb_iif; | 708 | new->skb_iif = old->skb_iif; |
| 709 | __nf_copy(new, old); | 709 | __nf_copy(new, old); |
| 710 | #if IS_ENABLED(CONFIG_NETFILTER_XT_TARGET_TRACE) | ||
| 711 | new->nf_trace = old->nf_trace; | ||
| 712 | #endif | ||
| 713 | #ifdef CONFIG_NET_SCHED | 710 | #ifdef CONFIG_NET_SCHED |
| 714 | new->tc_index = old->tc_index; | 711 | new->tc_index = old->tc_index; |
| 715 | #ifdef CONFIG_NET_CLS_ACT | 712 | #ifdef CONFIG_NET_CLS_ACT |
diff --git a/net/hsr/hsr_framereg.c b/net/hsr/hsr_framereg.c index 327060c6c874..7ae0d7f6dbd0 100644 --- a/net/hsr/hsr_framereg.c +++ b/net/hsr/hsr_framereg.c | |||
| @@ -297,7 +297,7 @@ static bool seq_nr_after(u16 a, u16 b) | |||
| 297 | 297 | ||
| 298 | void hsr_register_frame_in(struct node_entry *node, enum hsr_dev_idx dev_idx) | 298 | void hsr_register_frame_in(struct node_entry *node, enum hsr_dev_idx dev_idx) |
| 299 | { | 299 | { |
| 300 | if ((dev_idx < 0) || (dev_idx >= HSR_MAX_DEV)) { | 300 | if ((dev_idx < 0) || (dev_idx >= HSR_MAX_SLAVE)) { |
| 301 | WARN_ONCE(1, "%s: Invalid dev_idx (%d)\n", __func__, dev_idx); | 301 | WARN_ONCE(1, "%s: Invalid dev_idx (%d)\n", __func__, dev_idx); |
| 302 | return; | 302 | return; |
| 303 | } | 303 | } |
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index ecd2c3f245ce..19ab78aca547 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c | |||
| @@ -1296,8 +1296,11 @@ static struct sk_buff *inet_gso_segment(struct sk_buff *skb, | |||
| 1296 | 1296 | ||
| 1297 | segs = ERR_PTR(-EPROTONOSUPPORT); | 1297 | segs = ERR_PTR(-EPROTONOSUPPORT); |
| 1298 | 1298 | ||
| 1299 | /* Note : following gso_segment() might change skb->encapsulation */ | 1299 | if (skb->encapsulation && |
| 1300 | udpfrag = !skb->encapsulation && proto == IPPROTO_UDP; | 1300 | skb_shinfo(skb)->gso_type & (SKB_GSO_SIT|SKB_GSO_IPIP)) |
| 1301 | udpfrag = proto == IPPROTO_UDP && encap; | ||
| 1302 | else | ||
| 1303 | udpfrag = proto == IPPROTO_UDP && !skb->encapsulation; | ||
| 1301 | 1304 | ||
| 1302 | ops = rcu_dereference(inet_offloads[proto]); | 1305 | ops = rcu_dereference(inet_offloads[proto]); |
| 1303 | if (likely(ops && ops->callbacks.gso_segment)) | 1306 | if (likely(ops && ops->callbacks.gso_segment)) |
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index 8971780aec7c..73c6b63bba74 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
| @@ -422,9 +422,6 @@ static void ip_copy_metadata(struct sk_buff *to, struct sk_buff *from) | |||
| 422 | to->tc_index = from->tc_index; | 422 | to->tc_index = from->tc_index; |
| 423 | #endif | 423 | #endif |
| 424 | nf_copy(to, from); | 424 | nf_copy(to, from); |
| 425 | #if IS_ENABLED(CONFIG_NETFILTER_XT_TARGET_TRACE) | ||
| 426 | to->nf_trace = from->nf_trace; | ||
| 427 | #endif | ||
| 428 | #if defined(CONFIG_IP_VS) || defined(CONFIG_IP_VS_MODULE) | 425 | #if defined(CONFIG_IP_VS) || defined(CONFIG_IP_VS_MODULE) |
| 429 | to->ipvs_property = from->ipvs_property; | 426 | to->ipvs_property = from->ipvs_property; |
| 430 | #endif | 427 | #endif |
diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c index 50228be5c17b..78a89e61925d 100644 --- a/net/ipv4/ip_tunnel.c +++ b/net/ipv4/ip_tunnel.c | |||
| @@ -93,13 +93,14 @@ static void tunnel_dst_reset(struct ip_tunnel *t) | |||
| 93 | tunnel_dst_set(t, NULL); | 93 | tunnel_dst_set(t, NULL); |
| 94 | } | 94 | } |
| 95 | 95 | ||
| 96 | static void tunnel_dst_reset_all(struct ip_tunnel *t) | 96 | void ip_tunnel_dst_reset_all(struct ip_tunnel *t) |
| 97 | { | 97 | { |
| 98 | int i; | 98 | int i; |
| 99 | 99 | ||
| 100 | for_each_possible_cpu(i) | 100 | for_each_possible_cpu(i) |
| 101 | __tunnel_dst_set(per_cpu_ptr(t->dst_cache, i), NULL); | 101 | __tunnel_dst_set(per_cpu_ptr(t->dst_cache, i), NULL); |
| 102 | } | 102 | } |
| 103 | EXPORT_SYMBOL(ip_tunnel_dst_reset_all); | ||
| 103 | 104 | ||
| 104 | static struct rtable *tunnel_rtable_get(struct ip_tunnel *t, u32 cookie) | 105 | static struct rtable *tunnel_rtable_get(struct ip_tunnel *t, u32 cookie) |
| 105 | { | 106 | { |
| @@ -119,52 +120,6 @@ static struct rtable *tunnel_rtable_get(struct ip_tunnel *t, u32 cookie) | |||
| 119 | return (struct rtable *)dst; | 120 | return (struct rtable *)dst; |
| 120 | } | 121 | } |
| 121 | 122 | ||
| 122 | /* Often modified stats are per cpu, other are shared (netdev->stats) */ | ||
| 123 | struct rtnl_link_stats64 *ip_tunnel_get_stats64(struct net_device *dev, | ||
| 124 | struct rtnl_link_stats64 *tot) | ||
| 125 | { | ||
| 126 | int i; | ||
| 127 | |||
| 128 | for_each_possible_cpu(i) { | ||
| 129 | const struct pcpu_sw_netstats *tstats = | ||
| 130 | per_cpu_ptr(dev->tstats, i); | ||
| 131 | u64 rx_packets, rx_bytes, tx_packets, tx_bytes; | ||
| 132 | unsigned int start; | ||
| 133 | |||
| 134 | do { | ||
| 135 | start = u64_stats_fetch_begin_bh(&tstats->syncp); | ||
| 136 | rx_packets = tstats->rx_packets; | ||
| 137 | tx_packets = tstats->tx_packets; | ||
| 138 | rx_bytes = tstats->rx_bytes; | ||
| 139 | tx_bytes = tstats->tx_bytes; | ||
| 140 | } while (u64_stats_fetch_retry_bh(&tstats->syncp, start)); | ||
| 141 | |||
| 142 | tot->rx_packets += rx_packets; | ||
| 143 | tot->tx_packets += tx_packets; | ||
| 144 | tot->rx_bytes += rx_bytes; | ||
| 145 | tot->tx_bytes += tx_bytes; | ||
| 146 | } | ||
| 147 | |||
| 148 | tot->multicast = dev->stats.multicast; | ||
| 149 | |||
| 150 | tot->rx_crc_errors = dev->stats.rx_crc_errors; | ||
| 151 | tot->rx_fifo_errors = dev->stats.rx_fifo_errors; | ||
| 152 | tot->rx_length_errors = dev->stats.rx_length_errors; | ||
| 153 | tot->rx_frame_errors = dev->stats.rx_frame_errors; | ||
| 154 | tot->rx_errors = dev->stats.rx_errors; | ||
| 155 | |||
| 156 | tot->tx_fifo_errors = dev->stats.tx_fifo_errors; | ||
| 157 | tot->tx_carrier_errors = dev->stats.tx_carrier_errors; | ||
| 158 | tot->tx_dropped = dev->stats.tx_dropped; | ||
| 159 | tot->tx_aborted_errors = dev->stats.tx_aborted_errors; | ||
| 160 | tot->tx_errors = dev->stats.tx_errors; | ||
| 161 | |||
| 162 | tot->collisions = dev->stats.collisions; | ||
| 163 | |||
| 164 | return tot; | ||
| 165 | } | ||
| 166 | EXPORT_SYMBOL_GPL(ip_tunnel_get_stats64); | ||
| 167 | |||
| 168 | static bool ip_tunnel_key_match(const struct ip_tunnel_parm *p, | 123 | static bool ip_tunnel_key_match(const struct ip_tunnel_parm *p, |
| 169 | __be16 flags, __be32 key) | 124 | __be16 flags, __be32 key) |
| 170 | { | 125 | { |
| @@ -759,7 +714,7 @@ static void ip_tunnel_update(struct ip_tunnel_net *itn, | |||
| 759 | if (set_mtu) | 714 | if (set_mtu) |
| 760 | dev->mtu = mtu; | 715 | dev->mtu = mtu; |
| 761 | } | 716 | } |
| 762 | tunnel_dst_reset_all(t); | 717 | ip_tunnel_dst_reset_all(t); |
| 763 | netdev_state_change(dev); | 718 | netdev_state_change(dev); |
| 764 | } | 719 | } |
| 765 | 720 | ||
| @@ -1088,7 +1043,7 @@ void ip_tunnel_uninit(struct net_device *dev) | |||
| 1088 | if (itn->fb_tunnel_dev != dev) | 1043 | if (itn->fb_tunnel_dev != dev) |
| 1089 | ip_tunnel_del(netdev_priv(dev)); | 1044 | ip_tunnel_del(netdev_priv(dev)); |
| 1090 | 1045 | ||
| 1091 | tunnel_dst_reset_all(tunnel); | 1046 | ip_tunnel_dst_reset_all(tunnel); |
| 1092 | } | 1047 | } |
| 1093 | EXPORT_SYMBOL_GPL(ip_tunnel_uninit); | 1048 | EXPORT_SYMBOL_GPL(ip_tunnel_uninit); |
| 1094 | 1049 | ||
diff --git a/net/ipv4/ip_tunnel_core.c b/net/ipv4/ip_tunnel_core.c index 6156f4ef5e91..6f847dd56dbc 100644 --- a/net/ipv4/ip_tunnel_core.c +++ b/net/ipv4/ip_tunnel_core.c | |||
| @@ -108,7 +108,6 @@ int iptunnel_pull_header(struct sk_buff *skb, int hdr_len, __be16 inner_proto) | |||
| 108 | nf_reset(skb); | 108 | nf_reset(skb); |
| 109 | secpath_reset(skb); | 109 | secpath_reset(skb); |
| 110 | skb_clear_hash_if_not_l4(skb); | 110 | skb_clear_hash_if_not_l4(skb); |
| 111 | skb_dst_drop(skb); | ||
| 112 | skb->vlan_tci = 0; | 111 | skb->vlan_tci = 0; |
| 113 | skb_set_queue_mapping(skb, 0); | 112 | skb_set_queue_mapping(skb, 0); |
| 114 | skb->pkt_type = PACKET_HOST; | 113 | skb->pkt_type = PACKET_HOST; |
| @@ -148,3 +147,49 @@ error: | |||
| 148 | return ERR_PTR(err); | 147 | return ERR_PTR(err); |
| 149 | } | 148 | } |
| 150 | EXPORT_SYMBOL_GPL(iptunnel_handle_offloads); | 149 | EXPORT_SYMBOL_GPL(iptunnel_handle_offloads); |
| 150 | |||
| 151 | /* Often modified stats are per cpu, other are shared (netdev->stats) */ | ||
| 152 | struct rtnl_link_stats64 *ip_tunnel_get_stats64(struct net_device *dev, | ||
| 153 | struct rtnl_link_stats64 *tot) | ||
| 154 | { | ||
| 155 | int i; | ||
| 156 | |||
| 157 | for_each_possible_cpu(i) { | ||
| 158 | const struct pcpu_sw_netstats *tstats = | ||
| 159 | per_cpu_ptr(dev->tstats, i); | ||
| 160 | u64 rx_packets, rx_bytes, tx_packets, tx_bytes; | ||
| 161 | unsigned int start; | ||
| 162 | |||
| 163 | do { | ||
| 164 | start = u64_stats_fetch_begin_bh(&tstats->syncp); | ||
| 165 | rx_packets = tstats->rx_packets; | ||
| 166 | tx_packets = tstats->tx_packets; | ||
| 167 | rx_bytes = tstats->rx_bytes; | ||
| 168 | tx_bytes = tstats->tx_bytes; | ||
| 169 | } while (u64_stats_fetch_retry_bh(&tstats->syncp, start)); | ||
| 170 | |||
| 171 | tot->rx_packets += rx_packets; | ||
| 172 | tot->tx_packets += tx_packets; | ||
| 173 | tot->rx_bytes += rx_bytes; | ||
| 174 | tot->tx_bytes += tx_bytes; | ||
| 175 | } | ||
| 176 | |||
| 177 | tot->multicast = dev->stats.multicast; | ||
| 178 | |||
| 179 | tot->rx_crc_errors = dev->stats.rx_crc_errors; | ||
| 180 | tot->rx_fifo_errors = dev->stats.rx_fifo_errors; | ||
| 181 | tot->rx_length_errors = dev->stats.rx_length_errors; | ||
| 182 | tot->rx_frame_errors = dev->stats.rx_frame_errors; | ||
| 183 | tot->rx_errors = dev->stats.rx_errors; | ||
| 184 | |||
| 185 | tot->tx_fifo_errors = dev->stats.tx_fifo_errors; | ||
| 186 | tot->tx_carrier_errors = dev->stats.tx_carrier_errors; | ||
| 187 | tot->tx_dropped = dev->stats.tx_dropped; | ||
| 188 | tot->tx_aborted_errors = dev->stats.tx_aborted_errors; | ||
| 189 | tot->tx_errors = dev->stats.tx_errors; | ||
| 190 | |||
| 191 | tot->collisions = dev->stats.collisions; | ||
| 192 | |||
| 193 | return tot; | ||
| 194 | } | ||
| 195 | EXPORT_SYMBOL_GPL(ip_tunnel_get_stats64); | ||
diff --git a/net/ipv4/netfilter/nf_nat_snmp_basic.c b/net/ipv4/netfilter/nf_nat_snmp_basic.c index d551e31b416e..7c676671329d 100644 --- a/net/ipv4/netfilter/nf_nat_snmp_basic.c +++ b/net/ipv4/netfilter/nf_nat_snmp_basic.c | |||
| @@ -1198,8 +1198,8 @@ static int snmp_translate(struct nf_conn *ct, | |||
| 1198 | map.to = NOCT1(&ct->tuplehash[!dir].tuple.dst.u3.ip); | 1198 | map.to = NOCT1(&ct->tuplehash[!dir].tuple.dst.u3.ip); |
| 1199 | } else { | 1199 | } else { |
| 1200 | /* DNAT replies */ | 1200 | /* DNAT replies */ |
| 1201 | map.from = NOCT1(&ct->tuplehash[dir].tuple.src.u3.ip); | 1201 | map.from = NOCT1(&ct->tuplehash[!dir].tuple.src.u3.ip); |
| 1202 | map.to = NOCT1(&ct->tuplehash[!dir].tuple.dst.u3.ip); | 1202 | map.to = NOCT1(&ct->tuplehash[dir].tuple.dst.u3.ip); |
| 1203 | } | 1203 | } |
| 1204 | 1204 | ||
| 1205 | if (map.from == map.to) | 1205 | if (map.from == map.to) |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 9f3a2db9109e..97c8f5620c43 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
| @@ -1044,7 +1044,8 @@ void tcp_free_fastopen_req(struct tcp_sock *tp) | |||
| 1044 | } | 1044 | } |
| 1045 | } | 1045 | } |
| 1046 | 1046 | ||
| 1047 | static int tcp_sendmsg_fastopen(struct sock *sk, struct msghdr *msg, int *size) | 1047 | static int tcp_sendmsg_fastopen(struct sock *sk, struct msghdr *msg, |
| 1048 | int *copied, size_t size) | ||
| 1048 | { | 1049 | { |
| 1049 | struct tcp_sock *tp = tcp_sk(sk); | 1050 | struct tcp_sock *tp = tcp_sk(sk); |
| 1050 | int err, flags; | 1051 | int err, flags; |
| @@ -1059,11 +1060,12 @@ static int tcp_sendmsg_fastopen(struct sock *sk, struct msghdr *msg, int *size) | |||
| 1059 | if (unlikely(tp->fastopen_req == NULL)) | 1060 | if (unlikely(tp->fastopen_req == NULL)) |
| 1060 | return -ENOBUFS; | 1061 | return -ENOBUFS; |
| 1061 | tp->fastopen_req->data = msg; | 1062 | tp->fastopen_req->data = msg; |
| 1063 | tp->fastopen_req->size = size; | ||
| 1062 | 1064 | ||
| 1063 | flags = (msg->msg_flags & MSG_DONTWAIT) ? O_NONBLOCK : 0; | 1065 | flags = (msg->msg_flags & MSG_DONTWAIT) ? O_NONBLOCK : 0; |
| 1064 | err = __inet_stream_connect(sk->sk_socket, msg->msg_name, | 1066 | err = __inet_stream_connect(sk->sk_socket, msg->msg_name, |
| 1065 | msg->msg_namelen, flags); | 1067 | msg->msg_namelen, flags); |
| 1066 | *size = tp->fastopen_req->copied; | 1068 | *copied = tp->fastopen_req->copied; |
| 1067 | tcp_free_fastopen_req(tp); | 1069 | tcp_free_fastopen_req(tp); |
| 1068 | return err; | 1070 | return err; |
| 1069 | } | 1071 | } |
| @@ -1083,7 +1085,7 @@ int tcp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | |||
| 1083 | 1085 | ||
| 1084 | flags = msg->msg_flags; | 1086 | flags = msg->msg_flags; |
| 1085 | if (flags & MSG_FASTOPEN) { | 1087 | if (flags & MSG_FASTOPEN) { |
| 1086 | err = tcp_sendmsg_fastopen(sk, msg, &copied_syn); | 1088 | err = tcp_sendmsg_fastopen(sk, msg, &copied_syn, size); |
| 1087 | if (err == -EINPROGRESS && copied_syn > 0) | 1089 | if (err == -EINPROGRESS && copied_syn > 0) |
| 1088 | goto out; | 1090 | goto out; |
| 1089 | else if (err) | 1091 | else if (err) |
diff --git a/net/ipv4/tcp_cong.c b/net/ipv4/tcp_cong.c index ad37bf18ae4b..2388275adb9b 100644 --- a/net/ipv4/tcp_cong.c +++ b/net/ipv4/tcp_cong.c | |||
| @@ -290,8 +290,7 @@ bool tcp_is_cwnd_limited(const struct sock *sk, u32 in_flight) | |||
| 290 | left = tp->snd_cwnd - in_flight; | 290 | left = tp->snd_cwnd - in_flight; |
| 291 | if (sk_can_gso(sk) && | 291 | if (sk_can_gso(sk) && |
| 292 | left * sysctl_tcp_tso_win_divisor < tp->snd_cwnd && | 292 | left * sysctl_tcp_tso_win_divisor < tp->snd_cwnd && |
| 293 | left * tp->mss_cache < sk->sk_gso_max_size && | 293 | left < tp->xmit_size_goal_segs) |
| 294 | left < sk->sk_gso_max_segs) | ||
| 295 | return true; | 294 | return true; |
| 296 | return left <= tcp_max_tso_deferred_mss(tp); | 295 | return left <= tcp_max_tso_deferred_mss(tp); |
| 297 | } | 296 | } |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 227cba79fa6b..eeaac399420d 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
| @@ -1945,8 +1945,9 @@ void tcp_enter_loss(struct sock *sk, int how) | |||
| 1945 | if (skb == tcp_send_head(sk)) | 1945 | if (skb == tcp_send_head(sk)) |
| 1946 | break; | 1946 | break; |
| 1947 | 1947 | ||
| 1948 | if (TCP_SKB_CB(skb)->sacked & TCPCB_RETRANS) | 1948 | if (TCP_SKB_CB(skb)->sacked & TCPCB_SACKED_RETRANS) |
| 1949 | tp->undo_marker = 0; | 1949 | tp->undo_marker = 0; |
| 1950 | |||
| 1950 | TCP_SKB_CB(skb)->sacked &= (~TCPCB_TAGBITS)|TCPCB_SACKED_ACKED; | 1951 | TCP_SKB_CB(skb)->sacked &= (~TCPCB_TAGBITS)|TCPCB_SACKED_ACKED; |
| 1951 | if (!(TCP_SKB_CB(skb)->sacked&TCPCB_SACKED_ACKED) || how) { | 1952 | if (!(TCP_SKB_CB(skb)->sacked&TCPCB_SACKED_ACKED) || how) { |
| 1952 | TCP_SKB_CB(skb)->sacked &= ~TCPCB_SACKED_ACKED; | 1953 | TCP_SKB_CB(skb)->sacked &= ~TCPCB_SACKED_ACKED; |
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 3be16727f058..f0eb4e337ec8 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
| @@ -864,8 +864,8 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it, | |||
| 864 | 864 | ||
| 865 | if (unlikely(skb->fclone == SKB_FCLONE_ORIG && | 865 | if (unlikely(skb->fclone == SKB_FCLONE_ORIG && |
| 866 | fclone->fclone == SKB_FCLONE_CLONE)) | 866 | fclone->fclone == SKB_FCLONE_CLONE)) |
| 867 | NET_INC_STATS_BH(sock_net(sk), | 867 | NET_INC_STATS(sock_net(sk), |
| 868 | LINUX_MIB_TCPSPURIOUS_RTX_HOSTQUEUES); | 868 | LINUX_MIB_TCPSPURIOUS_RTX_HOSTQUEUES); |
| 869 | 869 | ||
| 870 | if (unlikely(skb_cloned(skb))) | 870 | if (unlikely(skb_cloned(skb))) |
| 871 | skb = pskb_copy(skb, gfp_mask); | 871 | skb = pskb_copy(skb, gfp_mask); |
| @@ -2337,6 +2337,7 @@ int __tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb) | |||
| 2337 | struct tcp_sock *tp = tcp_sk(sk); | 2337 | struct tcp_sock *tp = tcp_sk(sk); |
| 2338 | struct inet_connection_sock *icsk = inet_csk(sk); | 2338 | struct inet_connection_sock *icsk = inet_csk(sk); |
| 2339 | unsigned int cur_mss; | 2339 | unsigned int cur_mss; |
| 2340 | int err; | ||
| 2340 | 2341 | ||
| 2341 | /* Inconslusive MTU probe */ | 2342 | /* Inconslusive MTU probe */ |
| 2342 | if (icsk->icsk_mtup.probe_size) { | 2343 | if (icsk->icsk_mtup.probe_size) { |
| @@ -2400,11 +2401,15 @@ int __tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb) | |||
| 2400 | skb_headroom(skb) >= 0xFFFF)) { | 2401 | skb_headroom(skb) >= 0xFFFF)) { |
| 2401 | struct sk_buff *nskb = __pskb_copy(skb, MAX_TCP_HEADER, | 2402 | struct sk_buff *nskb = __pskb_copy(skb, MAX_TCP_HEADER, |
| 2402 | GFP_ATOMIC); | 2403 | GFP_ATOMIC); |
| 2403 | return nskb ? tcp_transmit_skb(sk, nskb, 0, GFP_ATOMIC) : | 2404 | err = nskb ? tcp_transmit_skb(sk, nskb, 0, GFP_ATOMIC) : |
| 2404 | -ENOBUFS; | 2405 | -ENOBUFS; |
| 2405 | } else { | 2406 | } else { |
| 2406 | return tcp_transmit_skb(sk, skb, 1, GFP_ATOMIC); | 2407 | err = tcp_transmit_skb(sk, skb, 1, GFP_ATOMIC); |
| 2407 | } | 2408 | } |
| 2409 | |||
| 2410 | if (likely(!err)) | ||
| 2411 | TCP_SKB_CB(skb)->sacked |= TCPCB_EVER_RETRANS; | ||
| 2412 | return err; | ||
| 2408 | } | 2413 | } |
| 2409 | 2414 | ||
| 2410 | int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb) | 2415 | int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb) |
| @@ -2908,7 +2913,12 @@ static int tcp_send_syn_data(struct sock *sk, struct sk_buff *syn) | |||
| 2908 | space = __tcp_mtu_to_mss(sk, inet_csk(sk)->icsk_pmtu_cookie) - | 2913 | space = __tcp_mtu_to_mss(sk, inet_csk(sk)->icsk_pmtu_cookie) - |
| 2909 | MAX_TCP_OPTION_SPACE; | 2914 | MAX_TCP_OPTION_SPACE; |
| 2910 | 2915 | ||
| 2911 | syn_data = skb_copy_expand(syn, skb_headroom(syn), space, | 2916 | space = min_t(size_t, space, fo->size); |
| 2917 | |||
| 2918 | /* limit to order-0 allocations */ | ||
| 2919 | space = min_t(size_t, space, SKB_MAX_HEAD(MAX_TCP_HEADER)); | ||
| 2920 | |||
| 2921 | syn_data = skb_copy_expand(syn, MAX_TCP_HEADER, space, | ||
| 2912 | sk->sk_allocation); | 2922 | sk->sk_allocation); |
| 2913 | if (syn_data == NULL) | 2923 | if (syn_data == NULL) |
| 2914 | goto fallback; | 2924 | goto fallback; |
diff --git a/net/ipv6/Kconfig b/net/ipv6/Kconfig index d92e5586783e..438a73aa777c 100644 --- a/net/ipv6/Kconfig +++ b/net/ipv6/Kconfig | |||
| @@ -138,6 +138,7 @@ config INET6_XFRM_MODE_ROUTEOPTIMIZATION | |||
| 138 | config IPV6_VTI | 138 | config IPV6_VTI |
| 139 | tristate "Virtual (secure) IPv6: tunneling" | 139 | tristate "Virtual (secure) IPv6: tunneling" |
| 140 | select IPV6_TUNNEL | 140 | select IPV6_TUNNEL |
| 141 | select NET_IP_TUNNEL | ||
| 141 | depends on INET6_XFRM_MODE_TUNNEL | 142 | depends on INET6_XFRM_MODE_TUNNEL |
| 142 | ---help--- | 143 | ---help--- |
| 143 | Tunneling means encapsulating data of one protocol type within | 144 | Tunneling means encapsulating data of one protocol type within |
diff --git a/net/ipv6/exthdrs_core.c b/net/ipv6/exthdrs_core.c index 140748debc4a..8af3eb57f438 100644 --- a/net/ipv6/exthdrs_core.c +++ b/net/ipv6/exthdrs_core.c | |||
| @@ -212,7 +212,7 @@ int ipv6_find_hdr(const struct sk_buff *skb, unsigned int *offset, | |||
| 212 | found = (nexthdr == target); | 212 | found = (nexthdr == target); |
| 213 | 213 | ||
| 214 | if ((!ipv6_ext_hdr(nexthdr)) || nexthdr == NEXTHDR_NONE) { | 214 | if ((!ipv6_ext_hdr(nexthdr)) || nexthdr == NEXTHDR_NONE) { |
| 215 | if (target < 0) | 215 | if (target < 0 || found) |
| 216 | break; | 216 | break; |
| 217 | return -ENOENT; | 217 | return -ENOENT; |
| 218 | } | 218 | } |
diff --git a/net/ipv6/ip6_offload.c b/net/ipv6/ip6_offload.c index 1e8683b135bb..59f95affceb0 100644 --- a/net/ipv6/ip6_offload.c +++ b/net/ipv6/ip6_offload.c | |||
| @@ -89,7 +89,7 @@ static struct sk_buff *ipv6_gso_segment(struct sk_buff *skb, | |||
| 89 | unsigned int unfrag_ip6hlen; | 89 | unsigned int unfrag_ip6hlen; |
| 90 | u8 *prevhdr; | 90 | u8 *prevhdr; |
| 91 | int offset = 0; | 91 | int offset = 0; |
| 92 | bool tunnel; | 92 | bool encap, udpfrag; |
| 93 | int nhoff; | 93 | int nhoff; |
| 94 | 94 | ||
| 95 | if (unlikely(skb_shinfo(skb)->gso_type & | 95 | if (unlikely(skb_shinfo(skb)->gso_type & |
| @@ -110,8 +110,8 @@ static struct sk_buff *ipv6_gso_segment(struct sk_buff *skb, | |||
| 110 | if (unlikely(!pskb_may_pull(skb, sizeof(*ipv6h)))) | 110 | if (unlikely(!pskb_may_pull(skb, sizeof(*ipv6h)))) |
| 111 | goto out; | 111 | goto out; |
| 112 | 112 | ||
| 113 | tunnel = SKB_GSO_CB(skb)->encap_level > 0; | 113 | encap = SKB_GSO_CB(skb)->encap_level > 0; |
| 114 | if (tunnel) | 114 | if (encap) |
| 115 | features = skb->dev->hw_enc_features & netif_skb_features(skb); | 115 | features = skb->dev->hw_enc_features & netif_skb_features(skb); |
| 116 | SKB_GSO_CB(skb)->encap_level += sizeof(*ipv6h); | 116 | SKB_GSO_CB(skb)->encap_level += sizeof(*ipv6h); |
| 117 | 117 | ||
| @@ -121,6 +121,12 @@ static struct sk_buff *ipv6_gso_segment(struct sk_buff *skb, | |||
| 121 | 121 | ||
| 122 | proto = ipv6_gso_pull_exthdrs(skb, ipv6h->nexthdr); | 122 | proto = ipv6_gso_pull_exthdrs(skb, ipv6h->nexthdr); |
| 123 | 123 | ||
| 124 | if (skb->encapsulation && | ||
| 125 | skb_shinfo(skb)->gso_type & (SKB_GSO_SIT|SKB_GSO_IPIP)) | ||
| 126 | udpfrag = proto == IPPROTO_UDP && encap; | ||
| 127 | else | ||
| 128 | udpfrag = proto == IPPROTO_UDP && !skb->encapsulation; | ||
| 129 | |||
| 124 | ops = rcu_dereference(inet6_offloads[proto]); | 130 | ops = rcu_dereference(inet6_offloads[proto]); |
| 125 | if (likely(ops && ops->callbacks.gso_segment)) { | 131 | if (likely(ops && ops->callbacks.gso_segment)) { |
| 126 | skb_reset_transport_header(skb); | 132 | skb_reset_transport_header(skb); |
| @@ -133,13 +139,9 @@ static struct sk_buff *ipv6_gso_segment(struct sk_buff *skb, | |||
| 133 | for (skb = segs; skb; skb = skb->next) { | 139 | for (skb = segs; skb; skb = skb->next) { |
| 134 | ipv6h = (struct ipv6hdr *)(skb_mac_header(skb) + nhoff); | 140 | ipv6h = (struct ipv6hdr *)(skb_mac_header(skb) + nhoff); |
| 135 | ipv6h->payload_len = htons(skb->len - nhoff - sizeof(*ipv6h)); | 141 | ipv6h->payload_len = htons(skb->len - nhoff - sizeof(*ipv6h)); |
| 136 | if (tunnel) { | ||
| 137 | skb_reset_inner_headers(skb); | ||
| 138 | skb->encapsulation = 1; | ||
| 139 | } | ||
| 140 | skb->network_header = (u8 *)ipv6h - skb->head; | 142 | skb->network_header = (u8 *)ipv6h - skb->head; |
| 141 | 143 | ||
| 142 | if (!tunnel && proto == IPPROTO_UDP) { | 144 | if (udpfrag) { |
| 143 | unfrag_ip6hlen = ip6_find_1stfragopt(skb, &prevhdr); | 145 | unfrag_ip6hlen = ip6_find_1stfragopt(skb, &prevhdr); |
| 144 | fptr = (struct frag_hdr *)((u8 *)ipv6h + unfrag_ip6hlen); | 146 | fptr = (struct frag_hdr *)((u8 *)ipv6h + unfrag_ip6hlen); |
| 145 | fptr->frag_off = htons(offset); | 147 | fptr->frag_off = htons(offset); |
| @@ -148,6 +150,8 @@ static struct sk_buff *ipv6_gso_segment(struct sk_buff *skb, | |||
| 148 | offset += (ntohs(ipv6h->payload_len) - | 150 | offset += (ntohs(ipv6h->payload_len) - |
| 149 | sizeof(struct frag_hdr)); | 151 | sizeof(struct frag_hdr)); |
| 150 | } | 152 | } |
| 153 | if (encap) | ||
| 154 | skb_reset_inner_headers(skb); | ||
| 151 | } | 155 | } |
| 152 | 156 | ||
| 153 | out: | 157 | out: |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 070a2fae2375..16f91a2e7888 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
| @@ -530,9 +530,6 @@ static void ip6_copy_metadata(struct sk_buff *to, struct sk_buff *from) | |||
| 530 | to->tc_index = from->tc_index; | 530 | to->tc_index = from->tc_index; |
| 531 | #endif | 531 | #endif |
| 532 | nf_copy(to, from); | 532 | nf_copy(to, from); |
| 533 | #if IS_ENABLED(CONFIG_NETFILTER_XT_TARGET_TRACE) | ||
| 534 | to->nf_trace = from->nf_trace; | ||
| 535 | #endif | ||
| 536 | skb_copy_secmark(to, from); | 533 | skb_copy_secmark(to, from); |
| 537 | } | 534 | } |
| 538 | 535 | ||
diff --git a/net/ipv6/ping.c b/net/ipv6/ping.c index fb9beb78f00b..587bbdcb22b4 100644 --- a/net/ipv6/ping.c +++ b/net/ipv6/ping.c | |||
| @@ -135,6 +135,7 @@ int ping_v6_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | |||
| 135 | fl6.flowi6_proto = IPPROTO_ICMPV6; | 135 | fl6.flowi6_proto = IPPROTO_ICMPV6; |
| 136 | fl6.saddr = np->saddr; | 136 | fl6.saddr = np->saddr; |
| 137 | fl6.daddr = *daddr; | 137 | fl6.daddr = *daddr; |
| 138 | fl6.flowi6_mark = sk->sk_mark; | ||
| 138 | fl6.fl6_icmp_type = user_icmph.icmp6_type; | 139 | fl6.fl6_icmp_type = user_icmph.icmp6_type; |
| 139 | fl6.fl6_icmp_code = user_icmph.icmp6_code; | 140 | fl6.fl6_icmp_code = user_icmph.icmp6_code; |
| 140 | security_sk_classify_flow(sk, flowi6_to_flowi(&fl6)); | 141 | security_sk_classify_flow(sk, flowi6_to_flowi(&fl6)); |
diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c index 3dfbcf1dcb1c..b4d74c86586c 100644 --- a/net/ipv6/sit.c +++ b/net/ipv6/sit.c | |||
| @@ -475,6 +475,7 @@ static void ipip6_tunnel_uninit(struct net_device *dev) | |||
| 475 | ipip6_tunnel_unlink(sitn, tunnel); | 475 | ipip6_tunnel_unlink(sitn, tunnel); |
| 476 | ipip6_tunnel_del_prl(tunnel, NULL); | 476 | ipip6_tunnel_del_prl(tunnel, NULL); |
| 477 | } | 477 | } |
| 478 | ip_tunnel_dst_reset_all(tunnel); | ||
| 478 | dev_put(dev); | 479 | dev_put(dev); |
| 479 | } | 480 | } |
| 480 | 481 | ||
| @@ -1082,6 +1083,7 @@ static void ipip6_tunnel_update(struct ip_tunnel *t, struct ip_tunnel_parm *p) | |||
| 1082 | t->parms.link = p->link; | 1083 | t->parms.link = p->link; |
| 1083 | ipip6_tunnel_bind_dev(t->dev); | 1084 | ipip6_tunnel_bind_dev(t->dev); |
| 1084 | } | 1085 | } |
| 1086 | ip_tunnel_dst_reset_all(t); | ||
| 1085 | netdev_state_change(t->dev); | 1087 | netdev_state_change(t->dev); |
| 1086 | } | 1088 | } |
| 1087 | 1089 | ||
| @@ -1112,6 +1114,7 @@ static int ipip6_tunnel_update_6rd(struct ip_tunnel *t, | |||
| 1112 | t->ip6rd.relay_prefix = relay_prefix; | 1114 | t->ip6rd.relay_prefix = relay_prefix; |
| 1113 | t->ip6rd.prefixlen = ip6rd->prefixlen; | 1115 | t->ip6rd.prefixlen = ip6rd->prefixlen; |
| 1114 | t->ip6rd.relay_prefixlen = ip6rd->relay_prefixlen; | 1116 | t->ip6rd.relay_prefixlen = ip6rd->relay_prefixlen; |
| 1117 | ip_tunnel_dst_reset_all(t); | ||
| 1115 | netdev_state_change(t->dev); | 1118 | netdev_state_change(t->dev); |
| 1116 | return 0; | 1119 | return 0; |
| 1117 | } | 1120 | } |
| @@ -1271,6 +1274,7 @@ ipip6_tunnel_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) | |||
| 1271 | err = ipip6_tunnel_add_prl(t, &prl, cmd == SIOCCHGPRL); | 1274 | err = ipip6_tunnel_add_prl(t, &prl, cmd == SIOCCHGPRL); |
| 1272 | break; | 1275 | break; |
| 1273 | } | 1276 | } |
| 1277 | ip_tunnel_dst_reset_all(t); | ||
| 1274 | netdev_state_change(dev); | 1278 | netdev_state_change(dev); |
| 1275 | break; | 1279 | break; |
| 1276 | 1280 | ||
| @@ -1326,6 +1330,9 @@ static const struct net_device_ops ipip6_netdev_ops = { | |||
| 1326 | 1330 | ||
| 1327 | static void ipip6_dev_free(struct net_device *dev) | 1331 | static void ipip6_dev_free(struct net_device *dev) |
| 1328 | { | 1332 | { |
| 1333 | struct ip_tunnel *tunnel = netdev_priv(dev); | ||
| 1334 | |||
| 1335 | free_percpu(tunnel->dst_cache); | ||
| 1329 | free_percpu(dev->tstats); | 1336 | free_percpu(dev->tstats); |
| 1330 | free_netdev(dev); | 1337 | free_netdev(dev); |
| 1331 | } | 1338 | } |
| @@ -1375,6 +1382,12 @@ static int ipip6_tunnel_init(struct net_device *dev) | |||
| 1375 | u64_stats_init(&ipip6_tunnel_stats->syncp); | 1382 | u64_stats_init(&ipip6_tunnel_stats->syncp); |
| 1376 | } | 1383 | } |
| 1377 | 1384 | ||
| 1385 | tunnel->dst_cache = alloc_percpu(struct ip_tunnel_dst); | ||
| 1386 | if (!tunnel->dst_cache) { | ||
| 1387 | free_percpu(dev->tstats); | ||
| 1388 | return -ENOMEM; | ||
| 1389 | } | ||
| 1390 | |||
| 1378 | return 0; | 1391 | return 0; |
| 1379 | } | 1392 | } |
| 1380 | 1393 | ||
| @@ -1405,6 +1418,12 @@ static int __net_init ipip6_fb_tunnel_init(struct net_device *dev) | |||
| 1405 | u64_stats_init(&ipip6_fb_stats->syncp); | 1418 | u64_stats_init(&ipip6_fb_stats->syncp); |
| 1406 | } | 1419 | } |
| 1407 | 1420 | ||
| 1421 | tunnel->dst_cache = alloc_percpu(struct ip_tunnel_dst); | ||
| 1422 | if (!tunnel->dst_cache) { | ||
| 1423 | free_percpu(dev->tstats); | ||
| 1424 | return -ENOMEM; | ||
| 1425 | } | ||
| 1426 | |||
| 1408 | dev_hold(dev); | 1427 | dev_hold(dev); |
| 1409 | rcu_assign_pointer(sitn->tunnels_wc[0], tunnel); | 1428 | rcu_assign_pointer(sitn->tunnels_wc[0], tunnel); |
| 1410 | return 0; | 1429 | return 0; |
diff --git a/net/ipv6/udp_offload.c b/net/ipv6/udp_offload.c index e7359f9eaa8d..b261ee8b83fc 100644 --- a/net/ipv6/udp_offload.c +++ b/net/ipv6/udp_offload.c | |||
| @@ -113,7 +113,7 @@ static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb, | |||
| 113 | fptr = (struct frag_hdr *)(skb_network_header(skb) + unfrag_ip6hlen); | 113 | fptr = (struct frag_hdr *)(skb_network_header(skb) + unfrag_ip6hlen); |
| 114 | fptr->nexthdr = nexthdr; | 114 | fptr->nexthdr = nexthdr; |
| 115 | fptr->reserved = 0; | 115 | fptr->reserved = 0; |
| 116 | ipv6_select_ident(fptr, (struct rt6_info *)skb_dst(skb)); | 116 | fptr->identification = skb_shinfo(skb)->ip6_frag_id; |
| 117 | 117 | ||
| 118 | /* Fragment the skb. ipv6 header and the remaining fields of the | 118 | /* Fragment the skb. ipv6 header and the remaining fields of the |
| 119 | * fragment header are updated in ipv6_gso_segment() | 119 | * fragment header are updated in ipv6_gso_segment() |
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index 3701930c6649..5e44e3179e02 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h | |||
| @@ -1692,14 +1692,8 @@ void ieee80211_stop_queue_by_reason(struct ieee80211_hw *hw, int queue, | |||
| 1692 | void ieee80211_propagate_queue_wake(struct ieee80211_local *local, int queue); | 1692 | void ieee80211_propagate_queue_wake(struct ieee80211_local *local, int queue); |
| 1693 | void ieee80211_add_pending_skb(struct ieee80211_local *local, | 1693 | void ieee80211_add_pending_skb(struct ieee80211_local *local, |
| 1694 | struct sk_buff *skb); | 1694 | struct sk_buff *skb); |
| 1695 | void ieee80211_add_pending_skbs_fn(struct ieee80211_local *local, | 1695 | void ieee80211_add_pending_skbs(struct ieee80211_local *local, |
| 1696 | struct sk_buff_head *skbs, | 1696 | struct sk_buff_head *skbs); |
| 1697 | void (*fn)(void *data), void *data); | ||
| 1698 | static inline void ieee80211_add_pending_skbs(struct ieee80211_local *local, | ||
| 1699 | struct sk_buff_head *skbs) | ||
| 1700 | { | ||
| 1701 | ieee80211_add_pending_skbs_fn(local, skbs, NULL, NULL); | ||
| 1702 | } | ||
| 1703 | void ieee80211_flush_queues(struct ieee80211_local *local, | 1697 | void ieee80211_flush_queues(struct ieee80211_local *local, |
| 1704 | struct ieee80211_sub_if_data *sdata); | 1698 | struct ieee80211_sub_if_data *sdata); |
| 1705 | 1699 | ||
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index fc1d82465b3c..245dce969b31 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
| @@ -222,6 +222,7 @@ ieee80211_determine_chantype(struct ieee80211_sub_if_data *sdata, | |||
| 222 | switch (vht_oper->chan_width) { | 222 | switch (vht_oper->chan_width) { |
| 223 | case IEEE80211_VHT_CHANWIDTH_USE_HT: | 223 | case IEEE80211_VHT_CHANWIDTH_USE_HT: |
| 224 | vht_chandef.width = chandef->width; | 224 | vht_chandef.width = chandef->width; |
| 225 | vht_chandef.center_freq1 = chandef->center_freq1; | ||
| 225 | break; | 226 | break; |
| 226 | case IEEE80211_VHT_CHANWIDTH_80MHZ: | 227 | case IEEE80211_VHT_CHANWIDTH_80MHZ: |
| 227 | vht_chandef.width = NL80211_CHAN_WIDTH_80; | 228 | vht_chandef.width = NL80211_CHAN_WIDTH_80; |
| @@ -271,6 +272,28 @@ ieee80211_determine_chantype(struct ieee80211_sub_if_data *sdata, | |||
| 271 | ret = 0; | 272 | ret = 0; |
| 272 | 273 | ||
| 273 | out: | 274 | out: |
| 275 | /* | ||
| 276 | * When tracking the current AP, don't do any further checks if the | ||
| 277 | * new chandef is identical to the one we're currently using for the | ||
| 278 | * connection. This keeps us from playing ping-pong with regulatory, | ||
| 279 | * without it the following can happen (for example): | ||
| 280 | * - connect to an AP with 80 MHz, world regdom allows 80 MHz | ||
| 281 | * - AP advertises regdom US | ||
| 282 | * - CRDA loads regdom US with 80 MHz prohibited (old database) | ||
| 283 | * - the code below detects an unsupported channel, downgrades, and | ||
| 284 | * we disconnect from the AP in the caller | ||
| 285 | * - disconnect causes CRDA to reload world regdomain and the game | ||
| 286 | * starts anew. | ||
| 287 | * (see https://bugzilla.kernel.org/show_bug.cgi?id=70881) | ||
| 288 | * | ||
| 289 | * It seems possible that there are still scenarios with CSA or real | ||
| 290 | * bandwidth changes where a this could happen, but those cases are | ||
| 291 | * less common and wouldn't completely prevent using the AP. | ||
| 292 | */ | ||
| 293 | if (tracking && | ||
| 294 | cfg80211_chandef_identical(chandef, &sdata->vif.bss_conf.chandef)) | ||
| 295 | return ret; | ||
| 296 | |||
| 274 | /* don't print the message below for VHT mismatch if VHT is disabled */ | 297 | /* don't print the message below for VHT mismatch if VHT is disabled */ |
| 275 | if (ret & IEEE80211_STA_DISABLE_VHT) | 298 | if (ret & IEEE80211_STA_DISABLE_VHT) |
| 276 | vht_chandef = *chandef; | 299 | vht_chandef = *chandef; |
| @@ -3753,6 +3776,7 @@ static int ieee80211_prep_connection(struct ieee80211_sub_if_data *sdata, | |||
| 3753 | chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); | 3776 | chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); |
| 3754 | if (WARN_ON(!chanctx_conf)) { | 3777 | if (WARN_ON(!chanctx_conf)) { |
| 3755 | rcu_read_unlock(); | 3778 | rcu_read_unlock(); |
| 3779 | sta_info_free(local, new_sta); | ||
| 3756 | return -EINVAL; | 3780 | return -EINVAL; |
| 3757 | } | 3781 | } |
| 3758 | rate_flags = ieee80211_chandef_rate_flags(&chanctx_conf->def); | 3782 | rate_flags = ieee80211_chandef_rate_flags(&chanctx_conf->def); |
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index c24ca0d0f469..3e57f96c9666 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c | |||
| @@ -1128,6 +1128,13 @@ static void sta_ps_end(struct sta_info *sta) | |||
| 1128 | sta->sta.addr, sta->sta.aid); | 1128 | sta->sta.addr, sta->sta.aid); |
| 1129 | 1129 | ||
| 1130 | if (test_sta_flag(sta, WLAN_STA_PS_DRIVER)) { | 1130 | if (test_sta_flag(sta, WLAN_STA_PS_DRIVER)) { |
| 1131 | /* | ||
| 1132 | * Clear the flag only if the other one is still set | ||
| 1133 | * so that the TX path won't start TX'ing new frames | ||
| 1134 | * directly ... In the case that the driver flag isn't | ||
| 1135 | * set ieee80211_sta_ps_deliver_wakeup() will clear it. | ||
| 1136 | */ | ||
| 1137 | clear_sta_flag(sta, WLAN_STA_PS_STA); | ||
| 1131 | ps_dbg(sta->sdata, "STA %pM aid %d driver-ps-blocked\n", | 1138 | ps_dbg(sta->sdata, "STA %pM aid %d driver-ps-blocked\n", |
| 1132 | sta->sta.addr, sta->sta.aid); | 1139 | sta->sta.addr, sta->sta.aid); |
| 1133 | return; | 1140 | return; |
diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c index decd30c1e290..a023b432143b 100644 --- a/net/mac80211/sta_info.c +++ b/net/mac80211/sta_info.c | |||
| @@ -91,7 +91,7 @@ static int sta_info_hash_del(struct ieee80211_local *local, | |||
| 91 | return -ENOENT; | 91 | return -ENOENT; |
| 92 | } | 92 | } |
| 93 | 93 | ||
| 94 | static void cleanup_single_sta(struct sta_info *sta) | 94 | static void __cleanup_single_sta(struct sta_info *sta) |
| 95 | { | 95 | { |
| 96 | int ac, i; | 96 | int ac, i; |
| 97 | struct tid_ampdu_tx *tid_tx; | 97 | struct tid_ampdu_tx *tid_tx; |
| @@ -99,7 +99,8 @@ static void cleanup_single_sta(struct sta_info *sta) | |||
| 99 | struct ieee80211_local *local = sdata->local; | 99 | struct ieee80211_local *local = sdata->local; |
| 100 | struct ps_data *ps; | 100 | struct ps_data *ps; |
| 101 | 101 | ||
| 102 | if (test_sta_flag(sta, WLAN_STA_PS_STA)) { | 102 | if (test_sta_flag(sta, WLAN_STA_PS_STA) || |
| 103 | test_sta_flag(sta, WLAN_STA_PS_DRIVER)) { | ||
| 103 | if (sta->sdata->vif.type == NL80211_IFTYPE_AP || | 104 | if (sta->sdata->vif.type == NL80211_IFTYPE_AP || |
| 104 | sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN) | 105 | sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN) |
| 105 | ps = &sdata->bss->ps; | 106 | ps = &sdata->bss->ps; |
| @@ -109,6 +110,7 @@ static void cleanup_single_sta(struct sta_info *sta) | |||
| 109 | return; | 110 | return; |
| 110 | 111 | ||
| 111 | clear_sta_flag(sta, WLAN_STA_PS_STA); | 112 | clear_sta_flag(sta, WLAN_STA_PS_STA); |
| 113 | clear_sta_flag(sta, WLAN_STA_PS_DRIVER); | ||
| 112 | 114 | ||
| 113 | atomic_dec(&ps->num_sta_ps); | 115 | atomic_dec(&ps->num_sta_ps); |
| 114 | sta_info_recalc_tim(sta); | 116 | sta_info_recalc_tim(sta); |
| @@ -139,7 +141,14 @@ static void cleanup_single_sta(struct sta_info *sta) | |||
| 139 | ieee80211_purge_tx_queue(&local->hw, &tid_tx->pending); | 141 | ieee80211_purge_tx_queue(&local->hw, &tid_tx->pending); |
| 140 | kfree(tid_tx); | 142 | kfree(tid_tx); |
| 141 | } | 143 | } |
| 144 | } | ||
| 142 | 145 | ||
| 146 | static void cleanup_single_sta(struct sta_info *sta) | ||
| 147 | { | ||
| 148 | struct ieee80211_sub_if_data *sdata = sta->sdata; | ||
| 149 | struct ieee80211_local *local = sdata->local; | ||
| 150 | |||
| 151 | __cleanup_single_sta(sta); | ||
| 143 | sta_info_free(local, sta); | 152 | sta_info_free(local, sta); |
| 144 | } | 153 | } |
| 145 | 154 | ||
| @@ -330,6 +339,7 @@ struct sta_info *sta_info_alloc(struct ieee80211_sub_if_data *sdata, | |||
| 330 | rcu_read_unlock(); | 339 | rcu_read_unlock(); |
| 331 | 340 | ||
| 332 | spin_lock_init(&sta->lock); | 341 | spin_lock_init(&sta->lock); |
| 342 | spin_lock_init(&sta->ps_lock); | ||
| 333 | INIT_WORK(&sta->drv_unblock_wk, sta_unblock); | 343 | INIT_WORK(&sta->drv_unblock_wk, sta_unblock); |
| 334 | INIT_WORK(&sta->ampdu_mlme.work, ieee80211_ba_session_work); | 344 | INIT_WORK(&sta->ampdu_mlme.work, ieee80211_ba_session_work); |
| 335 | mutex_init(&sta->ampdu_mlme.mtx); | 345 | mutex_init(&sta->ampdu_mlme.mtx); |
| @@ -487,21 +497,26 @@ static int sta_info_insert_finish(struct sta_info *sta) __acquires(RCU) | |||
| 487 | goto out_err; | 497 | goto out_err; |
| 488 | } | 498 | } |
| 489 | 499 | ||
| 490 | /* notify driver */ | ||
| 491 | err = sta_info_insert_drv_state(local, sdata, sta); | ||
| 492 | if (err) | ||
| 493 | goto out_err; | ||
| 494 | |||
| 495 | local->num_sta++; | 500 | local->num_sta++; |
| 496 | local->sta_generation++; | 501 | local->sta_generation++; |
| 497 | smp_mb(); | 502 | smp_mb(); |
| 498 | 503 | ||
| 504 | /* simplify things and don't accept BA sessions yet */ | ||
| 505 | set_sta_flag(sta, WLAN_STA_BLOCK_BA); | ||
| 506 | |||
| 499 | /* make the station visible */ | 507 | /* make the station visible */ |
| 500 | sta_info_hash_add(local, sta); | 508 | sta_info_hash_add(local, sta); |
| 501 | 509 | ||
| 502 | list_add_rcu(&sta->list, &local->sta_list); | 510 | list_add_rcu(&sta->list, &local->sta_list); |
| 503 | 511 | ||
| 512 | /* notify driver */ | ||
| 513 | err = sta_info_insert_drv_state(local, sdata, sta); | ||
| 514 | if (err) | ||
| 515 | goto out_remove; | ||
| 516 | |||
| 504 | set_sta_flag(sta, WLAN_STA_INSERTED); | 517 | set_sta_flag(sta, WLAN_STA_INSERTED); |
| 518 | /* accept BA sessions now */ | ||
| 519 | clear_sta_flag(sta, WLAN_STA_BLOCK_BA); | ||
| 505 | 520 | ||
| 506 | ieee80211_recalc_min_chandef(sdata); | 521 | ieee80211_recalc_min_chandef(sdata); |
| 507 | ieee80211_sta_debugfs_add(sta); | 522 | ieee80211_sta_debugfs_add(sta); |
| @@ -522,6 +537,12 @@ static int sta_info_insert_finish(struct sta_info *sta) __acquires(RCU) | |||
| 522 | mesh_accept_plinks_update(sdata); | 537 | mesh_accept_plinks_update(sdata); |
| 523 | 538 | ||
| 524 | return 0; | 539 | return 0; |
| 540 | out_remove: | ||
| 541 | sta_info_hash_del(local, sta); | ||
| 542 | list_del_rcu(&sta->list); | ||
| 543 | local->num_sta--; | ||
| 544 | synchronize_net(); | ||
| 545 | __cleanup_single_sta(sta); | ||
| 525 | out_err: | 546 | out_err: |
| 526 | mutex_unlock(&local->sta_mtx); | 547 | mutex_unlock(&local->sta_mtx); |
| 527 | rcu_read_lock(); | 548 | rcu_read_lock(); |
| @@ -1071,10 +1092,14 @@ struct ieee80211_sta *ieee80211_find_sta(struct ieee80211_vif *vif, | |||
| 1071 | } | 1092 | } |
| 1072 | EXPORT_SYMBOL(ieee80211_find_sta); | 1093 | EXPORT_SYMBOL(ieee80211_find_sta); |
| 1073 | 1094 | ||
| 1074 | static void clear_sta_ps_flags(void *_sta) | 1095 | /* powersave support code */ |
| 1096 | void ieee80211_sta_ps_deliver_wakeup(struct sta_info *sta) | ||
| 1075 | { | 1097 | { |
| 1076 | struct sta_info *sta = _sta; | ||
| 1077 | struct ieee80211_sub_if_data *sdata = sta->sdata; | 1098 | struct ieee80211_sub_if_data *sdata = sta->sdata; |
| 1099 | struct ieee80211_local *local = sdata->local; | ||
| 1100 | struct sk_buff_head pending; | ||
| 1101 | int filtered = 0, buffered = 0, ac; | ||
| 1102 | unsigned long flags; | ||
| 1078 | struct ps_data *ps; | 1103 | struct ps_data *ps; |
| 1079 | 1104 | ||
| 1080 | if (sdata->vif.type == NL80211_IFTYPE_AP || | 1105 | if (sdata->vif.type == NL80211_IFTYPE_AP || |
| @@ -1085,20 +1110,6 @@ static void clear_sta_ps_flags(void *_sta) | |||
| 1085 | else | 1110 | else |
| 1086 | return; | 1111 | return; |
| 1087 | 1112 | ||
| 1088 | clear_sta_flag(sta, WLAN_STA_PS_DRIVER); | ||
| 1089 | if (test_and_clear_sta_flag(sta, WLAN_STA_PS_STA)) | ||
| 1090 | atomic_dec(&ps->num_sta_ps); | ||
| 1091 | } | ||
| 1092 | |||
| 1093 | /* powersave support code */ | ||
| 1094 | void ieee80211_sta_ps_deliver_wakeup(struct sta_info *sta) | ||
| 1095 | { | ||
| 1096 | struct ieee80211_sub_if_data *sdata = sta->sdata; | ||
| 1097 | struct ieee80211_local *local = sdata->local; | ||
| 1098 | struct sk_buff_head pending; | ||
| 1099 | int filtered = 0, buffered = 0, ac; | ||
| 1100 | unsigned long flags; | ||
| 1101 | |||
| 1102 | clear_sta_flag(sta, WLAN_STA_SP); | 1113 | clear_sta_flag(sta, WLAN_STA_SP); |
| 1103 | 1114 | ||
| 1104 | BUILD_BUG_ON(BITS_TO_LONGS(IEEE80211_NUM_TIDS) > 1); | 1115 | BUILD_BUG_ON(BITS_TO_LONGS(IEEE80211_NUM_TIDS) > 1); |
| @@ -1109,6 +1120,8 @@ void ieee80211_sta_ps_deliver_wakeup(struct sta_info *sta) | |||
| 1109 | 1120 | ||
| 1110 | skb_queue_head_init(&pending); | 1121 | skb_queue_head_init(&pending); |
| 1111 | 1122 | ||
| 1123 | /* sync with ieee80211_tx_h_unicast_ps_buf */ | ||
| 1124 | spin_lock(&sta->ps_lock); | ||
| 1112 | /* Send all buffered frames to the station */ | 1125 | /* Send all buffered frames to the station */ |
| 1113 | for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) { | 1126 | for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) { |
| 1114 | int count = skb_queue_len(&pending), tmp; | 1127 | int count = skb_queue_len(&pending), tmp; |
| @@ -1127,7 +1140,12 @@ void ieee80211_sta_ps_deliver_wakeup(struct sta_info *sta) | |||
| 1127 | buffered += tmp - count; | 1140 | buffered += tmp - count; |
| 1128 | } | 1141 | } |
| 1129 | 1142 | ||
| 1130 | ieee80211_add_pending_skbs_fn(local, &pending, clear_sta_ps_flags, sta); | 1143 | ieee80211_add_pending_skbs(local, &pending); |
| 1144 | clear_sta_flag(sta, WLAN_STA_PS_DRIVER); | ||
| 1145 | clear_sta_flag(sta, WLAN_STA_PS_STA); | ||
| 1146 | spin_unlock(&sta->ps_lock); | ||
| 1147 | |||
| 1148 | atomic_dec(&ps->num_sta_ps); | ||
| 1131 | 1149 | ||
| 1132 | /* This station just woke up and isn't aware of our SMPS state */ | 1150 | /* This station just woke up and isn't aware of our SMPS state */ |
| 1133 | if (!ieee80211_smps_is_restrictive(sta->known_smps_mode, | 1151 | if (!ieee80211_smps_is_restrictive(sta->known_smps_mode, |
diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h index d77ff7090630..d3a6d8208f2f 100644 --- a/net/mac80211/sta_info.h +++ b/net/mac80211/sta_info.h | |||
| @@ -267,6 +267,7 @@ struct ieee80211_tx_latency_stat { | |||
| 267 | * @drv_unblock_wk: used for driver PS unblocking | 267 | * @drv_unblock_wk: used for driver PS unblocking |
| 268 | * @listen_interval: listen interval of this station, when we're acting as AP | 268 | * @listen_interval: listen interval of this station, when we're acting as AP |
| 269 | * @_flags: STA flags, see &enum ieee80211_sta_info_flags, do not use directly | 269 | * @_flags: STA flags, see &enum ieee80211_sta_info_flags, do not use directly |
| 270 | * @ps_lock: used for powersave (when mac80211 is the AP) related locking | ||
| 270 | * @ps_tx_buf: buffers (per AC) of frames to transmit to this station | 271 | * @ps_tx_buf: buffers (per AC) of frames to transmit to this station |
| 271 | * when it leaves power saving state or polls | 272 | * when it leaves power saving state or polls |
| 272 | * @tx_filtered: buffers (per AC) of frames we already tried to | 273 | * @tx_filtered: buffers (per AC) of frames we already tried to |
| @@ -356,10 +357,8 @@ struct sta_info { | |||
| 356 | /* use the accessors defined below */ | 357 | /* use the accessors defined below */ |
| 357 | unsigned long _flags; | 358 | unsigned long _flags; |
| 358 | 359 | ||
| 359 | /* | 360 | /* STA powersave lock and frame queues */ |
| 360 | * STA powersave frame queues, no more than the internal | 361 | spinlock_t ps_lock; |
| 361 | * locking required. | ||
| 362 | */ | ||
| 363 | struct sk_buff_head ps_tx_buf[IEEE80211_NUM_ACS]; | 362 | struct sk_buff_head ps_tx_buf[IEEE80211_NUM_ACS]; |
| 364 | struct sk_buff_head tx_filtered[IEEE80211_NUM_ACS]; | 363 | struct sk_buff_head tx_filtered[IEEE80211_NUM_ACS]; |
| 365 | unsigned long driver_buffered_tids; | 364 | unsigned long driver_buffered_tids; |
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index 97a02d3f7d87..4080c615636f 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c | |||
| @@ -478,6 +478,20 @@ ieee80211_tx_h_unicast_ps_buf(struct ieee80211_tx_data *tx) | |||
| 478 | sta->sta.addr, sta->sta.aid, ac); | 478 | sta->sta.addr, sta->sta.aid, ac); |
| 479 | if (tx->local->total_ps_buffered >= TOTAL_MAX_TX_BUFFER) | 479 | if (tx->local->total_ps_buffered >= TOTAL_MAX_TX_BUFFER) |
| 480 | purge_old_ps_buffers(tx->local); | 480 | purge_old_ps_buffers(tx->local); |
| 481 | |||
| 482 | /* sync with ieee80211_sta_ps_deliver_wakeup */ | ||
| 483 | spin_lock(&sta->ps_lock); | ||
| 484 | /* | ||
| 485 | * STA woke up the meantime and all the frames on ps_tx_buf have | ||
| 486 | * been queued to pending queue. No reordering can happen, go | ||
| 487 | * ahead and Tx the packet. | ||
| 488 | */ | ||
| 489 | if (!test_sta_flag(sta, WLAN_STA_PS_STA) && | ||
| 490 | !test_sta_flag(sta, WLAN_STA_PS_DRIVER)) { | ||
| 491 | spin_unlock(&sta->ps_lock); | ||
| 492 | return TX_CONTINUE; | ||
| 493 | } | ||
| 494 | |||
| 481 | if (skb_queue_len(&sta->ps_tx_buf[ac]) >= STA_MAX_TX_BUFFER) { | 495 | if (skb_queue_len(&sta->ps_tx_buf[ac]) >= STA_MAX_TX_BUFFER) { |
| 482 | struct sk_buff *old = skb_dequeue(&sta->ps_tx_buf[ac]); | 496 | struct sk_buff *old = skb_dequeue(&sta->ps_tx_buf[ac]); |
| 483 | ps_dbg(tx->sdata, | 497 | ps_dbg(tx->sdata, |
| @@ -492,6 +506,7 @@ ieee80211_tx_h_unicast_ps_buf(struct ieee80211_tx_data *tx) | |||
| 492 | info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING; | 506 | info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING; |
| 493 | info->flags &= ~IEEE80211_TX_TEMPORARY_FLAGS; | 507 | info->flags &= ~IEEE80211_TX_TEMPORARY_FLAGS; |
| 494 | skb_queue_tail(&sta->ps_tx_buf[ac], tx->skb); | 508 | skb_queue_tail(&sta->ps_tx_buf[ac], tx->skb); |
| 509 | spin_unlock(&sta->ps_lock); | ||
| 495 | 510 | ||
| 496 | if (!timer_pending(&local->sta_cleanup)) | 511 | if (!timer_pending(&local->sta_cleanup)) |
| 497 | mod_timer(&local->sta_cleanup, | 512 | mod_timer(&local->sta_cleanup, |
diff --git a/net/mac80211/util.c b/net/mac80211/util.c index 676dc0967f37..b8700d417a9c 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c | |||
| @@ -435,9 +435,8 @@ void ieee80211_add_pending_skb(struct ieee80211_local *local, | |||
| 435 | spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); | 435 | spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); |
| 436 | } | 436 | } |
| 437 | 437 | ||
| 438 | void ieee80211_add_pending_skbs_fn(struct ieee80211_local *local, | 438 | void ieee80211_add_pending_skbs(struct ieee80211_local *local, |
| 439 | struct sk_buff_head *skbs, | 439 | struct sk_buff_head *skbs) |
| 440 | void (*fn)(void *data), void *data) | ||
| 441 | { | 440 | { |
| 442 | struct ieee80211_hw *hw = &local->hw; | 441 | struct ieee80211_hw *hw = &local->hw; |
| 443 | struct sk_buff *skb; | 442 | struct sk_buff *skb; |
| @@ -461,9 +460,6 @@ void ieee80211_add_pending_skbs_fn(struct ieee80211_local *local, | |||
| 461 | __skb_queue_tail(&local->pending[queue], skb); | 460 | __skb_queue_tail(&local->pending[queue], skb); |
| 462 | } | 461 | } |
| 463 | 462 | ||
| 464 | if (fn) | ||
| 465 | fn(data); | ||
| 466 | |||
| 467 | for (i = 0; i < hw->queues; i++) | 463 | for (i = 0; i < hw->queues; i++) |
| 468 | __ieee80211_wake_queue(hw, i, | 464 | __ieee80211_wake_queue(hw, i, |
| 469 | IEEE80211_QUEUE_STOP_REASON_SKB_ADD); | 465 | IEEE80211_QUEUE_STOP_REASON_SKB_ADD); |
| @@ -1741,6 +1737,26 @@ int ieee80211_reconfig(struct ieee80211_local *local) | |||
| 1741 | IEEE80211_QUEUE_STOP_REASON_SUSPEND); | 1737 | IEEE80211_QUEUE_STOP_REASON_SUSPEND); |
| 1742 | 1738 | ||
| 1743 | /* | 1739 | /* |
| 1740 | * Reconfigure sched scan if it was interrupted by FW restart or | ||
| 1741 | * suspend. | ||
| 1742 | */ | ||
| 1743 | mutex_lock(&local->mtx); | ||
| 1744 | sched_scan_sdata = rcu_dereference_protected(local->sched_scan_sdata, | ||
| 1745 | lockdep_is_held(&local->mtx)); | ||
| 1746 | if (sched_scan_sdata && local->sched_scan_req) | ||
| 1747 | /* | ||
| 1748 | * Sched scan stopped, but we don't want to report it. Instead, | ||
| 1749 | * we're trying to reschedule. | ||
| 1750 | */ | ||
| 1751 | if (__ieee80211_request_sched_scan_start(sched_scan_sdata, | ||
| 1752 | local->sched_scan_req)) | ||
| 1753 | sched_scan_stopped = true; | ||
| 1754 | mutex_unlock(&local->mtx); | ||
| 1755 | |||
| 1756 | if (sched_scan_stopped) | ||
| 1757 | cfg80211_sched_scan_stopped(local->hw.wiphy); | ||
| 1758 | |||
| 1759 | /* | ||
| 1744 | * If this is for hw restart things are still running. | 1760 | * If this is for hw restart things are still running. |
| 1745 | * We may want to change that later, however. | 1761 | * We may want to change that later, however. |
| 1746 | */ | 1762 | */ |
| @@ -1768,26 +1784,6 @@ int ieee80211_reconfig(struct ieee80211_local *local) | |||
| 1768 | WARN_ON(1); | 1784 | WARN_ON(1); |
| 1769 | #endif | 1785 | #endif |
| 1770 | 1786 | ||
| 1771 | /* | ||
| 1772 | * Reconfigure sched scan if it was interrupted by FW restart or | ||
| 1773 | * suspend. | ||
| 1774 | */ | ||
| 1775 | mutex_lock(&local->mtx); | ||
| 1776 | sched_scan_sdata = rcu_dereference_protected(local->sched_scan_sdata, | ||
| 1777 | lockdep_is_held(&local->mtx)); | ||
| 1778 | if (sched_scan_sdata && local->sched_scan_req) | ||
| 1779 | /* | ||
| 1780 | * Sched scan stopped, but we don't want to report it. Instead, | ||
| 1781 | * we're trying to reschedule. | ||
| 1782 | */ | ||
| 1783 | if (__ieee80211_request_sched_scan_start(sched_scan_sdata, | ||
| 1784 | local->sched_scan_req)) | ||
| 1785 | sched_scan_stopped = true; | ||
| 1786 | mutex_unlock(&local->mtx); | ||
| 1787 | |||
| 1788 | if (sched_scan_stopped) | ||
| 1789 | cfg80211_sched_scan_stopped(local->hw.wiphy); | ||
| 1790 | |||
| 1791 | return 0; | 1787 | return 0; |
| 1792 | } | 1788 | } |
| 1793 | 1789 | ||
diff --git a/net/mac80211/wme.c b/net/mac80211/wme.c index 21211c60ca98..d51422c778de 100644 --- a/net/mac80211/wme.c +++ b/net/mac80211/wme.c | |||
| @@ -154,6 +154,11 @@ u16 ieee80211_select_queue(struct ieee80211_sub_if_data *sdata, | |||
| 154 | return IEEE80211_AC_BE; | 154 | return IEEE80211_AC_BE; |
| 155 | } | 155 | } |
| 156 | 156 | ||
| 157 | if (skb->protocol == sdata->control_port_protocol) { | ||
| 158 | skb->priority = 7; | ||
| 159 | return ieee80211_downgrade_queue(sdata, skb); | ||
| 160 | } | ||
| 161 | |||
| 157 | /* use the data classifier to determine what 802.1d tag the | 162 | /* use the data classifier to determine what 802.1d tag the |
| 158 | * data frame has */ | 163 | * data frame has */ |
| 159 | rcu_read_lock(); | 164 | rcu_read_lock(); |
diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c index bb322d0beb48..b9f0e0374322 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c | |||
| @@ -1310,27 +1310,22 @@ ctnetlink_change_status(struct nf_conn *ct, const struct nlattr * const cda[]) | |||
| 1310 | } | 1310 | } |
| 1311 | 1311 | ||
| 1312 | static int | 1312 | static int |
| 1313 | ctnetlink_change_nat(struct nf_conn *ct, const struct nlattr * const cda[]) | 1313 | ctnetlink_setup_nat(struct nf_conn *ct, const struct nlattr * const cda[]) |
| 1314 | { | 1314 | { |
| 1315 | #ifdef CONFIG_NF_NAT_NEEDED | 1315 | #ifdef CONFIG_NF_NAT_NEEDED |
| 1316 | int ret; | 1316 | int ret; |
| 1317 | 1317 | ||
| 1318 | if (cda[CTA_NAT_DST]) { | 1318 | ret = ctnetlink_parse_nat_setup(ct, NF_NAT_MANIP_DST, |
| 1319 | ret = ctnetlink_parse_nat_setup(ct, | 1319 | cda[CTA_NAT_DST]); |
| 1320 | NF_NAT_MANIP_DST, | 1320 | if (ret < 0) |
| 1321 | cda[CTA_NAT_DST]); | 1321 | return ret; |
| 1322 | if (ret < 0) | 1322 | |
| 1323 | return ret; | 1323 | ret = ctnetlink_parse_nat_setup(ct, NF_NAT_MANIP_SRC, |
| 1324 | } | 1324 | cda[CTA_NAT_SRC]); |
| 1325 | if (cda[CTA_NAT_SRC]) { | 1325 | return ret; |
| 1326 | ret = ctnetlink_parse_nat_setup(ct, | ||
| 1327 | NF_NAT_MANIP_SRC, | ||
| 1328 | cda[CTA_NAT_SRC]); | ||
| 1329 | if (ret < 0) | ||
| 1330 | return ret; | ||
| 1331 | } | ||
| 1332 | return 0; | ||
| 1333 | #else | 1326 | #else |
| 1327 | if (!cda[CTA_NAT_DST] && !cda[CTA_NAT_SRC]) | ||
| 1328 | return 0; | ||
| 1334 | return -EOPNOTSUPP; | 1329 | return -EOPNOTSUPP; |
| 1335 | #endif | 1330 | #endif |
| 1336 | } | 1331 | } |
| @@ -1659,11 +1654,9 @@ ctnetlink_create_conntrack(struct net *net, u16 zone, | |||
| 1659 | goto err2; | 1654 | goto err2; |
| 1660 | } | 1655 | } |
| 1661 | 1656 | ||
| 1662 | if (cda[CTA_NAT_SRC] || cda[CTA_NAT_DST]) { | 1657 | err = ctnetlink_setup_nat(ct, cda); |
| 1663 | err = ctnetlink_change_nat(ct, cda); | 1658 | if (err < 0) |
| 1664 | if (err < 0) | 1659 | goto err2; |
| 1665 | goto err2; | ||
| 1666 | } | ||
| 1667 | 1660 | ||
| 1668 | nf_ct_acct_ext_add(ct, GFP_ATOMIC); | 1661 | nf_ct_acct_ext_add(ct, GFP_ATOMIC); |
| 1669 | nf_ct_tstamp_ext_add(ct, GFP_ATOMIC); | 1662 | nf_ct_tstamp_ext_add(ct, GFP_ATOMIC); |
diff --git a/net/netfilter/nf_nat_core.c b/net/netfilter/nf_nat_core.c index d3f5cd6dd962..52ca952b802c 100644 --- a/net/netfilter/nf_nat_core.c +++ b/net/netfilter/nf_nat_core.c | |||
| @@ -432,15 +432,15 @@ nf_nat_setup_info(struct nf_conn *ct, | |||
| 432 | } | 432 | } |
| 433 | EXPORT_SYMBOL(nf_nat_setup_info); | 433 | EXPORT_SYMBOL(nf_nat_setup_info); |
| 434 | 434 | ||
| 435 | unsigned int | 435 | static unsigned int |
| 436 | nf_nat_alloc_null_binding(struct nf_conn *ct, unsigned int hooknum) | 436 | __nf_nat_alloc_null_binding(struct nf_conn *ct, enum nf_nat_manip_type manip) |
| 437 | { | 437 | { |
| 438 | /* Force range to this IP; let proto decide mapping for | 438 | /* Force range to this IP; let proto decide mapping for |
| 439 | * per-proto parts (hence not IP_NAT_RANGE_PROTO_SPECIFIED). | 439 | * per-proto parts (hence not IP_NAT_RANGE_PROTO_SPECIFIED). |
| 440 | * Use reply in case it's already been mangled (eg local packet). | 440 | * Use reply in case it's already been mangled (eg local packet). |
| 441 | */ | 441 | */ |
| 442 | union nf_inet_addr ip = | 442 | union nf_inet_addr ip = |
| 443 | (HOOK2MANIP(hooknum) == NF_NAT_MANIP_SRC ? | 443 | (manip == NF_NAT_MANIP_SRC ? |
| 444 | ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.u3 : | 444 | ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.u3 : |
| 445 | ct->tuplehash[IP_CT_DIR_REPLY].tuple.src.u3); | 445 | ct->tuplehash[IP_CT_DIR_REPLY].tuple.src.u3); |
| 446 | struct nf_nat_range range = { | 446 | struct nf_nat_range range = { |
| @@ -448,7 +448,13 @@ nf_nat_alloc_null_binding(struct nf_conn *ct, unsigned int hooknum) | |||
| 448 | .min_addr = ip, | 448 | .min_addr = ip, |
| 449 | .max_addr = ip, | 449 | .max_addr = ip, |
| 450 | }; | 450 | }; |
| 451 | return nf_nat_setup_info(ct, &range, HOOK2MANIP(hooknum)); | 451 | return nf_nat_setup_info(ct, &range, manip); |
| 452 | } | ||
| 453 | |||
| 454 | unsigned int | ||
| 455 | nf_nat_alloc_null_binding(struct nf_conn *ct, unsigned int hooknum) | ||
| 456 | { | ||
| 457 | return __nf_nat_alloc_null_binding(ct, HOOK2MANIP(hooknum)); | ||
| 452 | } | 458 | } |
| 453 | EXPORT_SYMBOL_GPL(nf_nat_alloc_null_binding); | 459 | EXPORT_SYMBOL_GPL(nf_nat_alloc_null_binding); |
| 454 | 460 | ||
| @@ -702,9 +708,9 @@ static const struct nla_policy nat_nla_policy[CTA_NAT_MAX+1] = { | |||
| 702 | 708 | ||
| 703 | static int | 709 | static int |
| 704 | nfnetlink_parse_nat(const struct nlattr *nat, | 710 | nfnetlink_parse_nat(const struct nlattr *nat, |
| 705 | const struct nf_conn *ct, struct nf_nat_range *range) | 711 | const struct nf_conn *ct, struct nf_nat_range *range, |
| 712 | const struct nf_nat_l3proto *l3proto) | ||
| 706 | { | 713 | { |
| 707 | const struct nf_nat_l3proto *l3proto; | ||
| 708 | struct nlattr *tb[CTA_NAT_MAX+1]; | 714 | struct nlattr *tb[CTA_NAT_MAX+1]; |
| 709 | int err; | 715 | int err; |
| 710 | 716 | ||
| @@ -714,38 +720,46 @@ nfnetlink_parse_nat(const struct nlattr *nat, | |||
| 714 | if (err < 0) | 720 | if (err < 0) |
| 715 | return err; | 721 | return err; |
| 716 | 722 | ||
| 717 | rcu_read_lock(); | ||
| 718 | l3proto = __nf_nat_l3proto_find(nf_ct_l3num(ct)); | ||
| 719 | if (l3proto == NULL) { | ||
| 720 | err = -EAGAIN; | ||
| 721 | goto out; | ||
| 722 | } | ||
| 723 | err = l3proto->nlattr_to_range(tb, range); | 723 | err = l3proto->nlattr_to_range(tb, range); |
| 724 | if (err < 0) | 724 | if (err < 0) |
| 725 | goto out; | 725 | return err; |
| 726 | 726 | ||
| 727 | if (!tb[CTA_NAT_PROTO]) | 727 | if (!tb[CTA_NAT_PROTO]) |
| 728 | goto out; | 728 | return 0; |
| 729 | 729 | ||
| 730 | err = nfnetlink_parse_nat_proto(tb[CTA_NAT_PROTO], ct, range); | 730 | return nfnetlink_parse_nat_proto(tb[CTA_NAT_PROTO], ct, range); |
| 731 | out: | ||
| 732 | rcu_read_unlock(); | ||
| 733 | return err; | ||
| 734 | } | 731 | } |
| 735 | 732 | ||
| 733 | /* This function is called under rcu_read_lock() */ | ||
| 736 | static int | 734 | static int |
| 737 | nfnetlink_parse_nat_setup(struct nf_conn *ct, | 735 | nfnetlink_parse_nat_setup(struct nf_conn *ct, |
| 738 | enum nf_nat_manip_type manip, | 736 | enum nf_nat_manip_type manip, |
| 739 | const struct nlattr *attr) | 737 | const struct nlattr *attr) |
| 740 | { | 738 | { |
| 741 | struct nf_nat_range range; | 739 | struct nf_nat_range range; |
| 740 | const struct nf_nat_l3proto *l3proto; | ||
| 742 | int err; | 741 | int err; |
| 743 | 742 | ||
| 744 | err = nfnetlink_parse_nat(attr, ct, &range); | 743 | /* Should not happen, restricted to creating new conntracks |
| 744 | * via ctnetlink. | ||
| 745 | */ | ||
| 746 | if (WARN_ON_ONCE(nf_nat_initialized(ct, manip))) | ||
| 747 | return -EEXIST; | ||
| 748 | |||
| 749 | /* Make sure that L3 NAT is there by when we call nf_nat_setup_info to | ||
| 750 | * attach the null binding, otherwise this may oops. | ||
| 751 | */ | ||
| 752 | l3proto = __nf_nat_l3proto_find(nf_ct_l3num(ct)); | ||
| 753 | if (l3proto == NULL) | ||
| 754 | return -EAGAIN; | ||
| 755 | |||
| 756 | /* No NAT information has been passed, allocate the null-binding */ | ||
| 757 | if (attr == NULL) | ||
| 758 | return __nf_nat_alloc_null_binding(ct, manip); | ||
| 759 | |||
| 760 | err = nfnetlink_parse_nat(attr, ct, &range, l3proto); | ||
| 745 | if (err < 0) | 761 | if (err < 0) |
| 746 | return err; | 762 | return err; |
| 747 | if (nf_nat_initialized(ct, manip)) | ||
| 748 | return -EEXIST; | ||
| 749 | 763 | ||
| 750 | return nf_nat_setup_info(ct, &range, manip); | 764 | return nf_nat_setup_info(ct, &range, manip); |
| 751 | } | 765 | } |
diff --git a/net/netfilter/nft_meta.c b/net/netfilter/nft_meta.c index e8254ad2e5a9..425cf39af890 100644 --- a/net/netfilter/nft_meta.c +++ b/net/netfilter/nft_meta.c | |||
| @@ -116,7 +116,7 @@ static void nft_meta_get_eval(const struct nft_expr *expr, | |||
| 116 | skb->sk->sk_socket->file->f_cred->fsgid); | 116 | skb->sk->sk_socket->file->f_cred->fsgid); |
| 117 | read_unlock_bh(&skb->sk->sk_callback_lock); | 117 | read_unlock_bh(&skb->sk->sk_callback_lock); |
| 118 | break; | 118 | break; |
| 119 | #ifdef CONFIG_NET_CLS_ROUTE | 119 | #ifdef CONFIG_IP_ROUTE_CLASSID |
| 120 | case NFT_META_RTCLASSID: { | 120 | case NFT_META_RTCLASSID: { |
| 121 | const struct dst_entry *dst = skb_dst(skb); | 121 | const struct dst_entry *dst = skb_dst(skb); |
| 122 | 122 | ||
| @@ -199,7 +199,7 @@ static int nft_meta_init_validate_get(uint32_t key) | |||
| 199 | case NFT_META_OIFTYPE: | 199 | case NFT_META_OIFTYPE: |
| 200 | case NFT_META_SKUID: | 200 | case NFT_META_SKUID: |
| 201 | case NFT_META_SKGID: | 201 | case NFT_META_SKGID: |
| 202 | #ifdef CONFIG_NET_CLS_ROUTE | 202 | #ifdef CONFIG_IP_ROUTE_CLASSID |
| 203 | case NFT_META_RTCLASSID: | 203 | case NFT_META_RTCLASSID: |
| 204 | #endif | 204 | #endif |
| 205 | #ifdef CONFIG_NETWORK_SECMARK | 205 | #ifdef CONFIG_NETWORK_SECMARK |
diff --git a/net/netfilter/nft_payload.c b/net/netfilter/nft_payload.c index a2aeb318678f..85daa84bfdfe 100644 --- a/net/netfilter/nft_payload.c +++ b/net/netfilter/nft_payload.c | |||
| @@ -135,7 +135,8 @@ nft_payload_select_ops(const struct nft_ctx *ctx, | |||
| 135 | if (len == 0 || len > FIELD_SIZEOF(struct nft_data, data)) | 135 | if (len == 0 || len > FIELD_SIZEOF(struct nft_data, data)) |
| 136 | return ERR_PTR(-EINVAL); | 136 | return ERR_PTR(-EINVAL); |
| 137 | 137 | ||
| 138 | if (len <= 4 && IS_ALIGNED(offset, len) && base != NFT_PAYLOAD_LL_HEADER) | 138 | if (len <= 4 && is_power_of_2(len) && IS_ALIGNED(offset, len) && |
| 139 | base != NFT_PAYLOAD_LL_HEADER) | ||
| 139 | return &nft_payload_fast_ops; | 140 | return &nft_payload_fast_ops; |
| 140 | else | 141 | else |
| 141 | return &nft_payload_ops; | 142 | return &nft_payload_ops; |
diff --git a/net/netfilter/nft_reject_inet.c b/net/netfilter/nft_reject_inet.c index 8a310f239c93..b718a52a4654 100644 --- a/net/netfilter/nft_reject_inet.c +++ b/net/netfilter/nft_reject_inet.c | |||
| @@ -21,9 +21,9 @@ static void nft_reject_inet_eval(const struct nft_expr *expr, | |||
| 21 | { | 21 | { |
| 22 | switch (pkt->ops->pf) { | 22 | switch (pkt->ops->pf) { |
| 23 | case NFPROTO_IPV4: | 23 | case NFPROTO_IPV4: |
| 24 | nft_reject_ipv4_eval(expr, data, pkt); | 24 | return nft_reject_ipv4_eval(expr, data, pkt); |
| 25 | case NFPROTO_IPV6: | 25 | case NFPROTO_IPV6: |
| 26 | nft_reject_ipv6_eval(expr, data, pkt); | 26 | return nft_reject_ipv6_eval(expr, data, pkt); |
| 27 | } | 27 | } |
| 28 | } | 28 | } |
| 29 | 29 | ||
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index fdf51353cf78..04748ab649c2 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c | |||
| @@ -1489,8 +1489,8 @@ static int netlink_connect(struct socket *sock, struct sockaddr *addr, | |||
| 1489 | if (addr->sa_family != AF_NETLINK) | 1489 | if (addr->sa_family != AF_NETLINK) |
| 1490 | return -EINVAL; | 1490 | return -EINVAL; |
| 1491 | 1491 | ||
| 1492 | /* Only superuser is allowed to send multicasts */ | 1492 | if ((nladdr->nl_groups || nladdr->nl_pid) && |
| 1493 | if (nladdr->nl_groups && !netlink_capable(sock, NL_CFG_F_NONROOT_SEND)) | 1493 | !netlink_capable(sock, NL_CFG_F_NONROOT_SEND)) |
| 1494 | return -EPERM; | 1494 | return -EPERM; |
| 1495 | 1495 | ||
| 1496 | if (!nlk->portid) | 1496 | if (!nlk->portid) |
diff --git a/net/nfc/nci/core.c b/net/nfc/nci/core.c index 46bda010bf11..56db888b1cd5 100644 --- a/net/nfc/nci/core.c +++ b/net/nfc/nci/core.c | |||
| @@ -301,7 +301,7 @@ static int nci_open_device(struct nci_dev *ndev) | |||
| 301 | rc = __nci_request(ndev, nci_reset_req, 0, | 301 | rc = __nci_request(ndev, nci_reset_req, 0, |
| 302 | msecs_to_jiffies(NCI_RESET_TIMEOUT)); | 302 | msecs_to_jiffies(NCI_RESET_TIMEOUT)); |
| 303 | 303 | ||
| 304 | if (ndev->ops->setup(ndev)) | 304 | if (ndev->ops->setup) |
| 305 | ndev->ops->setup(ndev); | 305 | ndev->ops->setup(ndev); |
| 306 | 306 | ||
| 307 | if (!rc) { | 307 | if (!rc) { |
diff --git a/net/sched/sch_tbf.c b/net/sched/sch_tbf.c index 1cb413fead89..4f505a006896 100644 --- a/net/sched/sch_tbf.c +++ b/net/sched/sch_tbf.c | |||
| @@ -334,18 +334,6 @@ static int tbf_change(struct Qdisc *sch, struct nlattr *opt) | |||
| 334 | qdisc_put_rtab(qdisc_get_rtab(&qopt->peakrate, | 334 | qdisc_put_rtab(qdisc_get_rtab(&qopt->peakrate, |
| 335 | tb[TCA_TBF_PTAB])); | 335 | tb[TCA_TBF_PTAB])); |
| 336 | 336 | ||
| 337 | if (q->qdisc != &noop_qdisc) { | ||
| 338 | err = fifo_set_limit(q->qdisc, qopt->limit); | ||
| 339 | if (err) | ||
| 340 | goto done; | ||
| 341 | } else if (qopt->limit > 0) { | ||
| 342 | child = fifo_create_dflt(sch, &bfifo_qdisc_ops, qopt->limit); | ||
| 343 | if (IS_ERR(child)) { | ||
| 344 | err = PTR_ERR(child); | ||
| 345 | goto done; | ||
| 346 | } | ||
| 347 | } | ||
| 348 | |||
| 349 | buffer = min_t(u64, PSCHED_TICKS2NS(qopt->buffer), ~0U); | 337 | buffer = min_t(u64, PSCHED_TICKS2NS(qopt->buffer), ~0U); |
| 350 | mtu = min_t(u64, PSCHED_TICKS2NS(qopt->mtu), ~0U); | 338 | mtu = min_t(u64, PSCHED_TICKS2NS(qopt->mtu), ~0U); |
| 351 | 339 | ||
| @@ -390,6 +378,18 @@ static int tbf_change(struct Qdisc *sch, struct nlattr *opt) | |||
| 390 | goto done; | 378 | goto done; |
| 391 | } | 379 | } |
| 392 | 380 | ||
| 381 | if (q->qdisc != &noop_qdisc) { | ||
| 382 | err = fifo_set_limit(q->qdisc, qopt->limit); | ||
| 383 | if (err) | ||
| 384 | goto done; | ||
| 385 | } else if (qopt->limit > 0) { | ||
| 386 | child = fifo_create_dflt(sch, &bfifo_qdisc_ops, qopt->limit); | ||
| 387 | if (IS_ERR(child)) { | ||
| 388 | err = PTR_ERR(child); | ||
| 389 | goto done; | ||
| 390 | } | ||
| 391 | } | ||
| 392 | |||
| 393 | sch_tree_lock(sch); | 393 | sch_tree_lock(sch); |
| 394 | if (child) { | 394 | if (child) { |
| 395 | qdisc_tree_decrease_qlen(q->qdisc, q->qdisc->q.qlen); | 395 | qdisc_tree_decrease_qlen(q->qdisc, q->qdisc->q.qlen); |
diff --git a/net/sctp/associola.c b/net/sctp/associola.c index f558433537b8..ee13d28d39d1 100644 --- a/net/sctp/associola.c +++ b/net/sctp/associola.c | |||
| @@ -1239,78 +1239,107 @@ void sctp_assoc_update(struct sctp_association *asoc, | |||
| 1239 | } | 1239 | } |
| 1240 | 1240 | ||
| 1241 | /* Update the retran path for sending a retransmitted packet. | 1241 | /* Update the retran path for sending a retransmitted packet. |
| 1242 | * Round-robin through the active transports, else round-robin | 1242 | * See also RFC4960, 6.4. Multi-Homed SCTP Endpoints: |
| 1243 | * through the inactive transports as this is the next best thing | 1243 | * |
| 1244 | * we can try. | 1244 | * When there is outbound data to send and the primary path |
| 1245 | * becomes inactive (e.g., due to failures), or where the | ||
| 1246 | * SCTP user explicitly requests to send data to an | ||
| 1247 | * inactive destination transport address, before reporting | ||
| 1248 | * an error to its ULP, the SCTP endpoint should try to send | ||
| 1249 | * the data to an alternate active destination transport | ||
| 1250 | * address if one exists. | ||
| 1251 | * | ||
| 1252 | * When retransmitting data that timed out, if the endpoint | ||
| 1253 | * is multihomed, it should consider each source-destination | ||
| 1254 | * address pair in its retransmission selection policy. | ||
| 1255 | * When retransmitting timed-out data, the endpoint should | ||
| 1256 | * attempt to pick the most divergent source-destination | ||
| 1257 | * pair from the original source-destination pair to which | ||
| 1258 | * the packet was transmitted. | ||
| 1259 | * | ||
| 1260 | * Note: Rules for picking the most divergent source-destination | ||
| 1261 | * pair are an implementation decision and are not specified | ||
| 1262 | * within this document. | ||
| 1263 | * | ||
| 1264 | * Our basic strategy is to round-robin transports in priorities | ||
| 1265 | * according to sctp_state_prio_map[] e.g., if no such | ||
| 1266 | * transport with state SCTP_ACTIVE exists, round-robin through | ||
| 1267 | * SCTP_UNKNOWN, etc. You get the picture. | ||
| 1245 | */ | 1268 | */ |
| 1246 | void sctp_assoc_update_retran_path(struct sctp_association *asoc) | 1269 | static const u8 sctp_trans_state_to_prio_map[] = { |
| 1270 | [SCTP_ACTIVE] = 3, /* best case */ | ||
| 1271 | [SCTP_UNKNOWN] = 2, | ||
| 1272 | [SCTP_PF] = 1, | ||
| 1273 | [SCTP_INACTIVE] = 0, /* worst case */ | ||
| 1274 | }; | ||
| 1275 | |||
| 1276 | static u8 sctp_trans_score(const struct sctp_transport *trans) | ||
| 1247 | { | 1277 | { |
| 1248 | struct sctp_transport *t, *next; | 1278 | return sctp_trans_state_to_prio_map[trans->state]; |
| 1249 | struct list_head *head = &asoc->peer.transport_addr_list; | 1279 | } |
| 1250 | struct list_head *pos; | ||
| 1251 | 1280 | ||
| 1252 | if (asoc->peer.transport_count == 1) | 1281 | static struct sctp_transport *sctp_trans_elect_best(struct sctp_transport *curr, |
| 1253 | return; | 1282 | struct sctp_transport *best) |
| 1283 | { | ||
| 1284 | if (best == NULL) | ||
| 1285 | return curr; | ||
| 1254 | 1286 | ||
| 1255 | /* Find the next transport in a round-robin fashion. */ | 1287 | return sctp_trans_score(curr) > sctp_trans_score(best) ? curr : best; |
| 1256 | t = asoc->peer.retran_path; | 1288 | } |
| 1257 | pos = &t->transports; | ||
| 1258 | next = NULL; | ||
| 1259 | 1289 | ||
| 1260 | while (1) { | 1290 | void sctp_assoc_update_retran_path(struct sctp_association *asoc) |
| 1261 | /* Skip the head. */ | 1291 | { |
| 1262 | if (pos->next == head) | 1292 | struct sctp_transport *trans = asoc->peer.retran_path; |
| 1263 | pos = head->next; | 1293 | struct sctp_transport *trans_next = NULL; |
| 1264 | else | ||
| 1265 | pos = pos->next; | ||
| 1266 | 1294 | ||
| 1267 | t = list_entry(pos, struct sctp_transport, transports); | 1295 | /* We're done as we only have the one and only path. */ |
| 1296 | if (asoc->peer.transport_count == 1) | ||
| 1297 | return; | ||
| 1298 | /* If active_path and retran_path are the same and active, | ||
| 1299 | * then this is the only active path. Use it. | ||
| 1300 | */ | ||
| 1301 | if (asoc->peer.active_path == asoc->peer.retran_path && | ||
| 1302 | asoc->peer.active_path->state == SCTP_ACTIVE) | ||
| 1303 | return; | ||
| 1268 | 1304 | ||
| 1269 | /* We have exhausted the list, but didn't find any | 1305 | /* Iterate from retran_path's successor back to retran_path. */ |
| 1270 | * other active transports. If so, use the next | 1306 | for (trans = list_next_entry(trans, transports); 1; |
| 1271 | * transport. | 1307 | trans = list_next_entry(trans, transports)) { |
| 1272 | */ | 1308 | /* Manually skip the head element. */ |
| 1273 | if (t == asoc->peer.retran_path) { | 1309 | if (&trans->transports == &asoc->peer.transport_addr_list) |
| 1274 | t = next; | 1310 | continue; |
| 1311 | if (trans->state == SCTP_UNCONFIRMED) | ||
| 1312 | continue; | ||
| 1313 | trans_next = sctp_trans_elect_best(trans, trans_next); | ||
| 1314 | /* Active is good enough for immediate return. */ | ||
| 1315 | if (trans_next->state == SCTP_ACTIVE) | ||
| 1275 | break; | 1316 | break; |
| 1276 | } | 1317 | /* We've reached the end, time to update path. */ |
| 1277 | 1318 | if (trans == asoc->peer.retran_path) | |
| 1278 | /* Try to find an active transport. */ | ||
| 1279 | |||
| 1280 | if ((t->state == SCTP_ACTIVE) || | ||
| 1281 | (t->state == SCTP_UNKNOWN)) { | ||
| 1282 | break; | 1319 | break; |
| 1283 | } else { | ||
| 1284 | /* Keep track of the next transport in case | ||
| 1285 | * we don't find any active transport. | ||
| 1286 | */ | ||
| 1287 | if (t->state != SCTP_UNCONFIRMED && !next) | ||
| 1288 | next = t; | ||
| 1289 | } | ||
| 1290 | } | 1320 | } |
| 1291 | 1321 | ||
| 1292 | if (t) | 1322 | if (trans_next != NULL) |
| 1293 | asoc->peer.retran_path = t; | 1323 | asoc->peer.retran_path = trans_next; |
| 1294 | else | ||
| 1295 | t = asoc->peer.retran_path; | ||
| 1296 | 1324 | ||
| 1297 | pr_debug("%s: association:%p addr:%pISpc\n", __func__, asoc, | 1325 | pr_debug("%s: association:%p updated new path to addr:%pISpc\n", |
| 1298 | &t->ipaddr.sa); | 1326 | __func__, asoc, &asoc->peer.retran_path->ipaddr.sa); |
| 1299 | } | 1327 | } |
| 1300 | 1328 | ||
| 1301 | /* Choose the transport for sending retransmit packet. */ | 1329 | struct sctp_transport * |
| 1302 | struct sctp_transport *sctp_assoc_choose_alter_transport( | 1330 | sctp_assoc_choose_alter_transport(struct sctp_association *asoc, |
| 1303 | struct sctp_association *asoc, struct sctp_transport *last_sent_to) | 1331 | struct sctp_transport *last_sent_to) |
| 1304 | { | 1332 | { |
| 1305 | /* If this is the first time packet is sent, use the active path, | 1333 | /* If this is the first time packet is sent, use the active path, |
| 1306 | * else use the retran path. If the last packet was sent over the | 1334 | * else use the retran path. If the last packet was sent over the |
| 1307 | * retran path, update the retran path and use it. | 1335 | * retran path, update the retran path and use it. |
| 1308 | */ | 1336 | */ |
| 1309 | if (!last_sent_to) | 1337 | if (last_sent_to == NULL) { |
| 1310 | return asoc->peer.active_path; | 1338 | return asoc->peer.active_path; |
| 1311 | else { | 1339 | } else { |
| 1312 | if (last_sent_to == asoc->peer.retran_path) | 1340 | if (last_sent_to == asoc->peer.retran_path) |
| 1313 | sctp_assoc_update_retran_path(asoc); | 1341 | sctp_assoc_update_retran_path(asoc); |
| 1342 | |||
| 1314 | return asoc->peer.retran_path; | 1343 | return asoc->peer.retran_path; |
| 1315 | } | 1344 | } |
| 1316 | } | 1345 | } |
diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c index bd859154000e..5d6883ff00c3 100644 --- a/net/sctp/sm_sideeffect.c +++ b/net/sctp/sm_sideeffect.c | |||
| @@ -495,11 +495,12 @@ static void sctp_do_8_2_transport_strike(sctp_cmd_seq_t *commands, | |||
| 495 | } | 495 | } |
| 496 | 496 | ||
| 497 | /* If the transport error count is greater than the pf_retrans | 497 | /* If the transport error count is greater than the pf_retrans |
| 498 | * threshold, and less than pathmaxrtx, then mark this transport | 498 | * threshold, and less than pathmaxrtx, and if the current state |
| 499 | * as Partially Failed, ee SCTP Quick Failover Draft, secon 5.1, | 499 | * is not SCTP_UNCONFIRMED, then mark this transport as Partially |
| 500 | * point 1 | 500 | * Failed, see SCTP Quick Failover Draft, section 5.1 |
| 501 | */ | 501 | */ |
| 502 | if ((transport->state != SCTP_PF) && | 502 | if ((transport->state != SCTP_PF) && |
| 503 | (transport->state != SCTP_UNCONFIRMED) && | ||
| 503 | (asoc->pf_retrans < transport->pathmaxrxt) && | 504 | (asoc->pf_retrans < transport->pathmaxrxt) && |
| 504 | (transport->error_count > asoc->pf_retrans)) { | 505 | (transport->error_count > asoc->pf_retrans)) { |
| 505 | 506 | ||
diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c index 591b44d3b7de..ae65b6b5973a 100644 --- a/net/sctp/sm_statefuns.c +++ b/net/sctp/sm_statefuns.c | |||
| @@ -758,6 +758,13 @@ sctp_disposition_t sctp_sf_do_5_1D_ce(struct net *net, | |||
| 758 | struct sctp_chunk auth; | 758 | struct sctp_chunk auth; |
| 759 | sctp_ierror_t ret; | 759 | sctp_ierror_t ret; |
| 760 | 760 | ||
| 761 | /* Make sure that we and the peer are AUTH capable */ | ||
| 762 | if (!net->sctp.auth_enable || !new_asoc->peer.auth_capable) { | ||
| 763 | kfree_skb(chunk->auth_chunk); | ||
| 764 | sctp_association_free(new_asoc); | ||
| 765 | return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands); | ||
| 766 | } | ||
| 767 | |||
| 761 | /* set-up our fake chunk so that we can process it */ | 768 | /* set-up our fake chunk so that we can process it */ |
| 762 | auth.skb = chunk->auth_chunk; | 769 | auth.skb = chunk->auth_chunk; |
| 763 | auth.asoc = chunk->asoc; | 770 | auth.asoc = chunk->asoc; |
diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c index a38c89969c68..574b86193b15 100644 --- a/net/tipc/bearer.c +++ b/net/tipc/bearer.c | |||
| @@ -610,8 +610,13 @@ static struct notifier_block notifier = { | |||
| 610 | 610 | ||
| 611 | int tipc_bearer_setup(void) | 611 | int tipc_bearer_setup(void) |
| 612 | { | 612 | { |
| 613 | int err; | ||
| 614 | |||
| 615 | err = register_netdevice_notifier(¬ifier); | ||
| 616 | if (err) | ||
| 617 | return err; | ||
| 613 | dev_add_pack(&tipc_packet_type); | 618 | dev_add_pack(&tipc_packet_type); |
| 614 | return register_netdevice_notifier(¬ifier); | 619 | return 0; |
| 615 | } | 620 | } |
| 616 | 621 | ||
| 617 | void tipc_bearer_cleanup(void) | 622 | void tipc_bearer_cleanup(void) |
diff --git a/net/tipc/config.c b/net/tipc/config.c index c301a9a592d8..e74eef2e7490 100644 --- a/net/tipc/config.c +++ b/net/tipc/config.c | |||
| @@ -181,7 +181,7 @@ static struct sk_buff *cfg_set_own_addr(void) | |||
| 181 | if (tipc_own_addr) | 181 | if (tipc_own_addr) |
| 182 | return tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED | 182 | return tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED |
| 183 | " (cannot change node address once assigned)"); | 183 | " (cannot change node address once assigned)"); |
| 184 | tipc_core_start_net(addr); | 184 | tipc_net_start(addr); |
| 185 | return tipc_cfg_reply_none(); | 185 | return tipc_cfg_reply_none(); |
| 186 | } | 186 | } |
| 187 | 187 | ||
diff --git a/net/tipc/core.c b/net/tipc/core.c index f9e88d8b04ca..80c20647b3d2 100644 --- a/net/tipc/core.c +++ b/net/tipc/core.c | |||
| @@ -77,37 +77,13 @@ struct sk_buff *tipc_buf_acquire(u32 size) | |||
| 77 | } | 77 | } |
| 78 | 78 | ||
| 79 | /** | 79 | /** |
| 80 | * tipc_core_stop_net - shut down TIPC networking sub-systems | ||
| 81 | */ | ||
| 82 | static void tipc_core_stop_net(void) | ||
| 83 | { | ||
| 84 | tipc_net_stop(); | ||
| 85 | tipc_bearer_cleanup(); | ||
| 86 | } | ||
| 87 | |||
| 88 | /** | ||
| 89 | * start_net - start TIPC networking sub-systems | ||
| 90 | */ | ||
| 91 | int tipc_core_start_net(unsigned long addr) | ||
| 92 | { | ||
| 93 | int res; | ||
| 94 | |||
| 95 | tipc_net_start(addr); | ||
| 96 | res = tipc_bearer_setup(); | ||
| 97 | if (res < 0) | ||
| 98 | goto err; | ||
| 99 | return res; | ||
| 100 | |||
| 101 | err: | ||
| 102 | tipc_core_stop_net(); | ||
| 103 | return res; | ||
| 104 | } | ||
| 105 | |||
| 106 | /** | ||
| 107 | * tipc_core_stop - switch TIPC from SINGLE NODE to NOT RUNNING mode | 80 | * tipc_core_stop - switch TIPC from SINGLE NODE to NOT RUNNING mode |
| 108 | */ | 81 | */ |
| 109 | static void tipc_core_stop(void) | 82 | static void tipc_core_stop(void) |
| 110 | { | 83 | { |
| 84 | tipc_handler_stop(); | ||
| 85 | tipc_net_stop(); | ||
| 86 | tipc_bearer_cleanup(); | ||
| 111 | tipc_netlink_stop(); | 87 | tipc_netlink_stop(); |
| 112 | tipc_cfg_stop(); | 88 | tipc_cfg_stop(); |
| 113 | tipc_subscr_stop(); | 89 | tipc_subscr_stop(); |
| @@ -122,30 +98,65 @@ static void tipc_core_stop(void) | |||
| 122 | */ | 98 | */ |
| 123 | static int tipc_core_start(void) | 99 | static int tipc_core_start(void) |
| 124 | { | 100 | { |
| 125 | int res; | 101 | int err; |
| 126 | 102 | ||
| 127 | get_random_bytes(&tipc_random, sizeof(tipc_random)); | 103 | get_random_bytes(&tipc_random, sizeof(tipc_random)); |
| 128 | 104 | ||
| 129 | res = tipc_handler_start(); | 105 | err = tipc_handler_start(); |
| 130 | if (!res) | 106 | if (err) |
| 131 | res = tipc_ref_table_init(tipc_max_ports, tipc_random); | 107 | goto out_handler; |
| 132 | if (!res) | 108 | |
| 133 | res = tipc_nametbl_init(); | 109 | err = tipc_ref_table_init(tipc_max_ports, tipc_random); |
| 134 | if (!res) | 110 | if (err) |
| 135 | res = tipc_netlink_start(); | 111 | goto out_reftbl; |
| 136 | if (!res) | 112 | |
| 137 | res = tipc_socket_init(); | 113 | err = tipc_nametbl_init(); |
| 138 | if (!res) | 114 | if (err) |
| 139 | res = tipc_register_sysctl(); | 115 | goto out_nametbl; |
| 140 | if (!res) | 116 | |
| 141 | res = tipc_subscr_start(); | 117 | err = tipc_netlink_start(); |
| 142 | if (!res) | 118 | if (err) |
| 143 | res = tipc_cfg_init(); | 119 | goto out_netlink; |
| 144 | if (res) { | 120 | |
| 145 | tipc_handler_stop(); | 121 | err = tipc_socket_init(); |
| 146 | tipc_core_stop(); | 122 | if (err) |
| 147 | } | 123 | goto out_socket; |
| 148 | return res; | 124 | |
| 125 | err = tipc_register_sysctl(); | ||
| 126 | if (err) | ||
| 127 | goto out_sysctl; | ||
| 128 | |||
| 129 | err = tipc_subscr_start(); | ||
| 130 | if (err) | ||
| 131 | goto out_subscr; | ||
| 132 | |||
| 133 | err = tipc_cfg_init(); | ||
| 134 | if (err) | ||
| 135 | goto out_cfg; | ||
| 136 | |||
| 137 | err = tipc_bearer_setup(); | ||
| 138 | if (err) | ||
| 139 | goto out_bearer; | ||
| 140 | |||
| 141 | return 0; | ||
| 142 | out_bearer: | ||
| 143 | tipc_cfg_stop(); | ||
| 144 | out_cfg: | ||
| 145 | tipc_subscr_stop(); | ||
| 146 | out_subscr: | ||
| 147 | tipc_unregister_sysctl(); | ||
| 148 | out_sysctl: | ||
| 149 | tipc_socket_stop(); | ||
| 150 | out_socket: | ||
| 151 | tipc_netlink_stop(); | ||
| 152 | out_netlink: | ||
| 153 | tipc_nametbl_stop(); | ||
| 154 | out_nametbl: | ||
| 155 | tipc_ref_table_stop(); | ||
| 156 | out_reftbl: | ||
| 157 | tipc_handler_stop(); | ||
| 158 | out_handler: | ||
| 159 | return err; | ||
| 149 | } | 160 | } |
| 150 | 161 | ||
| 151 | static int __init tipc_init(void) | 162 | static int __init tipc_init(void) |
| @@ -174,8 +185,6 @@ static int __init tipc_init(void) | |||
| 174 | 185 | ||
| 175 | static void __exit tipc_exit(void) | 186 | static void __exit tipc_exit(void) |
| 176 | { | 187 | { |
| 177 | tipc_handler_stop(); | ||
| 178 | tipc_core_stop_net(); | ||
| 179 | tipc_core_stop(); | 188 | tipc_core_stop(); |
| 180 | pr_info("Deactivated\n"); | 189 | pr_info("Deactivated\n"); |
| 181 | } | 190 | } |
diff --git a/net/tipc/core.h b/net/tipc/core.h index 5569d96b4da3..4dfe137587bb 100644 --- a/net/tipc/core.h +++ b/net/tipc/core.h | |||
| @@ -90,7 +90,6 @@ extern int tipc_random __read_mostly; | |||
| 90 | /* | 90 | /* |
| 91 | * Routines available to privileged subsystems | 91 | * Routines available to privileged subsystems |
| 92 | */ | 92 | */ |
| 93 | int tipc_core_start_net(unsigned long); | ||
| 94 | int tipc_handler_start(void); | 93 | int tipc_handler_start(void); |
| 95 | void tipc_handler_stop(void); | 94 | void tipc_handler_stop(void); |
| 96 | int tipc_netlink_start(void); | 95 | int tipc_netlink_start(void); |
diff --git a/net/tipc/name_table.c b/net/tipc/name_table.c index 92a1533af4e0..48302be175ce 100644 --- a/net/tipc/name_table.c +++ b/net/tipc/name_table.c | |||
| @@ -945,9 +945,6 @@ void tipc_nametbl_stop(void) | |||
| 945 | { | 945 | { |
| 946 | u32 i; | 946 | u32 i; |
| 947 | 947 | ||
| 948 | if (!table.types) | ||
| 949 | return; | ||
| 950 | |||
| 951 | /* Verify name table is empty, then release it */ | 948 | /* Verify name table is empty, then release it */ |
| 952 | write_lock_bh(&tipc_nametbl_lock); | 949 | write_lock_bh(&tipc_nametbl_lock); |
| 953 | for (i = 0; i < TIPC_NAMETBL_SIZE; i++) { | 950 | for (i = 0; i < TIPC_NAMETBL_SIZE; i++) { |
diff --git a/net/tipc/netlink.c b/net/tipc/netlink.c index 9f72a6376362..3aaf73de9e2d 100644 --- a/net/tipc/netlink.c +++ b/net/tipc/netlink.c | |||
| @@ -83,8 +83,6 @@ static struct genl_ops tipc_genl_ops[] = { | |||
| 83 | }, | 83 | }, |
| 84 | }; | 84 | }; |
| 85 | 85 | ||
| 86 | static int tipc_genl_family_registered; | ||
| 87 | |||
| 88 | int tipc_netlink_start(void) | 86 | int tipc_netlink_start(void) |
| 89 | { | 87 | { |
| 90 | int res; | 88 | int res; |
| @@ -94,16 +92,10 @@ int tipc_netlink_start(void) | |||
| 94 | pr_err("Failed to register netlink interface\n"); | 92 | pr_err("Failed to register netlink interface\n"); |
| 95 | return res; | 93 | return res; |
| 96 | } | 94 | } |
| 97 | |||
| 98 | tipc_genl_family_registered = 1; | ||
| 99 | return 0; | 95 | return 0; |
| 100 | } | 96 | } |
| 101 | 97 | ||
| 102 | void tipc_netlink_stop(void) | 98 | void tipc_netlink_stop(void) |
| 103 | { | 99 | { |
| 104 | if (!tipc_genl_family_registered) | ||
| 105 | return; | ||
| 106 | |||
| 107 | genl_unregister_family(&tipc_genl_family); | 100 | genl_unregister_family(&tipc_genl_family); |
| 108 | tipc_genl_family_registered = 0; | ||
| 109 | } | 101 | } |
diff --git a/net/tipc/ref.c b/net/tipc/ref.c index 2a2a938dc22c..de3d593e2fee 100644 --- a/net/tipc/ref.c +++ b/net/tipc/ref.c | |||
| @@ -126,9 +126,6 @@ int tipc_ref_table_init(u32 requested_size, u32 start) | |||
| 126 | */ | 126 | */ |
| 127 | void tipc_ref_table_stop(void) | 127 | void tipc_ref_table_stop(void) |
| 128 | { | 128 | { |
| 129 | if (!tipc_ref_table.entries) | ||
| 130 | return; | ||
| 131 | |||
| 132 | vfree(tipc_ref_table.entries); | 129 | vfree(tipc_ref_table.entries); |
| 133 | tipc_ref_table.entries = NULL; | 130 | tipc_ref_table.entries = NULL; |
| 134 | } | 131 | } |
diff --git a/net/tipc/server.c b/net/tipc/server.c index b635ca347a87..373979789a73 100644 --- a/net/tipc/server.c +++ b/net/tipc/server.c | |||
| @@ -573,7 +573,6 @@ int tipc_server_start(struct tipc_server *s) | |||
| 573 | kmem_cache_destroy(s->rcvbuf_cache); | 573 | kmem_cache_destroy(s->rcvbuf_cache); |
| 574 | return ret; | 574 | return ret; |
| 575 | } | 575 | } |
| 576 | s->enabled = 1; | ||
| 577 | return ret; | 576 | return ret; |
| 578 | } | 577 | } |
| 579 | 578 | ||
| @@ -583,10 +582,6 @@ void tipc_server_stop(struct tipc_server *s) | |||
| 583 | int total = 0; | 582 | int total = 0; |
| 584 | int id; | 583 | int id; |
| 585 | 584 | ||
| 586 | if (!s->enabled) | ||
| 587 | return; | ||
| 588 | |||
| 589 | s->enabled = 0; | ||
| 590 | spin_lock_bh(&s->idr_lock); | 585 | spin_lock_bh(&s->idr_lock); |
| 591 | for (id = 0; total < s->idr_in_use; id++) { | 586 | for (id = 0; total < s->idr_in_use; id++) { |
| 592 | con = idr_find(&s->conn_idr, id); | 587 | con = idr_find(&s->conn_idr, id); |
diff --git a/net/tipc/server.h b/net/tipc/server.h index 98b23f20bc0f..be817b0b547e 100644 --- a/net/tipc/server.h +++ b/net/tipc/server.h | |||
| @@ -56,7 +56,6 @@ | |||
| 56 | * @name: server name | 56 | * @name: server name |
| 57 | * @imp: message importance | 57 | * @imp: message importance |
| 58 | * @type: socket type | 58 | * @type: socket type |
| 59 | * @enabled: identify whether server is launched or not | ||
| 60 | */ | 59 | */ |
| 61 | struct tipc_server { | 60 | struct tipc_server { |
| 62 | struct idr conn_idr; | 61 | struct idr conn_idr; |
| @@ -74,7 +73,6 @@ struct tipc_server { | |||
| 74 | const char name[TIPC_SERVER_NAME_LEN]; | 73 | const char name[TIPC_SERVER_NAME_LEN]; |
| 75 | int imp; | 74 | int imp; |
| 76 | int type; | 75 | int type; |
| 77 | int enabled; | ||
| 78 | }; | 76 | }; |
| 79 | 77 | ||
| 80 | int tipc_conn_sendmsg(struct tipc_server *s, int conid, | 78 | int tipc_conn_sendmsg(struct tipc_server *s, int conid, |
diff --git a/net/tipc/socket.c b/net/tipc/socket.c index aab4948f0aff..a4cf274455aa 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c | |||
| @@ -70,8 +70,6 @@ static const struct proto_ops msg_ops; | |||
| 70 | static struct proto tipc_proto; | 70 | static struct proto tipc_proto; |
| 71 | static struct proto tipc_proto_kern; | 71 | static struct proto tipc_proto_kern; |
| 72 | 72 | ||
| 73 | static int sockets_enabled; | ||
| 74 | |||
| 75 | /* | 73 | /* |
| 76 | * Revised TIPC socket locking policy: | 74 | * Revised TIPC socket locking policy: |
| 77 | * | 75 | * |
| @@ -2027,8 +2025,6 @@ int tipc_socket_init(void) | |||
| 2027 | proto_unregister(&tipc_proto); | 2025 | proto_unregister(&tipc_proto); |
| 2028 | goto out; | 2026 | goto out; |
| 2029 | } | 2027 | } |
| 2030 | |||
| 2031 | sockets_enabled = 1; | ||
| 2032 | out: | 2028 | out: |
| 2033 | return res; | 2029 | return res; |
| 2034 | } | 2030 | } |
| @@ -2038,10 +2034,6 @@ int tipc_socket_init(void) | |||
| 2038 | */ | 2034 | */ |
| 2039 | void tipc_socket_stop(void) | 2035 | void tipc_socket_stop(void) |
| 2040 | { | 2036 | { |
| 2041 | if (!sockets_enabled) | ||
| 2042 | return; | ||
| 2043 | |||
| 2044 | sockets_enabled = 0; | ||
| 2045 | sock_unregister(tipc_family_ops.family); | 2037 | sock_unregister(tipc_family_ops.family); |
| 2046 | proto_unregister(&tipc_proto); | 2038 | proto_unregister(&tipc_proto); |
| 2047 | } | 2039 | } |
diff --git a/net/wireless/reg.c b/net/wireless/reg.c index 9b897fca7487..f0541370e68e 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c | |||
| @@ -1700,7 +1700,7 @@ static void reg_process_hint(struct regulatory_request *reg_request) | |||
| 1700 | return; | 1700 | return; |
| 1701 | case NL80211_REGDOM_SET_BY_USER: | 1701 | case NL80211_REGDOM_SET_BY_USER: |
| 1702 | treatment = reg_process_hint_user(reg_request); | 1702 | treatment = reg_process_hint_user(reg_request); |
| 1703 | if (treatment == REG_REQ_OK || | 1703 | if (treatment == REG_REQ_IGNORE || |
| 1704 | treatment == REG_REQ_ALREADY_SET) | 1704 | treatment == REG_REQ_ALREADY_SET) |
| 1705 | return; | 1705 | return; |
| 1706 | schedule_delayed_work(®_timeout, msecs_to_jiffies(3142)); | 1706 | schedule_delayed_work(®_timeout, msecs_to_jiffies(3142)); |
| @@ -2373,6 +2373,7 @@ static int reg_set_rd_country_ie(const struct ieee80211_regdomain *rd, | |||
| 2373 | int set_regdom(const struct ieee80211_regdomain *rd) | 2373 | int set_regdom(const struct ieee80211_regdomain *rd) |
| 2374 | { | 2374 | { |
| 2375 | struct regulatory_request *lr; | 2375 | struct regulatory_request *lr; |
| 2376 | bool user_reset = false; | ||
| 2376 | int r; | 2377 | int r; |
| 2377 | 2378 | ||
| 2378 | if (!reg_is_valid_request(rd->alpha2)) { | 2379 | if (!reg_is_valid_request(rd->alpha2)) { |
| @@ -2389,6 +2390,7 @@ int set_regdom(const struct ieee80211_regdomain *rd) | |||
| 2389 | break; | 2390 | break; |
| 2390 | case NL80211_REGDOM_SET_BY_USER: | 2391 | case NL80211_REGDOM_SET_BY_USER: |
| 2391 | r = reg_set_rd_user(rd, lr); | 2392 | r = reg_set_rd_user(rd, lr); |
| 2393 | user_reset = true; | ||
| 2392 | break; | 2394 | break; |
| 2393 | case NL80211_REGDOM_SET_BY_DRIVER: | 2395 | case NL80211_REGDOM_SET_BY_DRIVER: |
| 2394 | r = reg_set_rd_driver(rd, lr); | 2396 | r = reg_set_rd_driver(rd, lr); |
| @@ -2402,8 +2404,14 @@ int set_regdom(const struct ieee80211_regdomain *rd) | |||
| 2402 | } | 2404 | } |
| 2403 | 2405 | ||
| 2404 | if (r) { | 2406 | if (r) { |
| 2405 | if (r == -EALREADY) | 2407 | switch (r) { |
| 2408 | case -EALREADY: | ||
| 2406 | reg_set_request_processed(); | 2409 | reg_set_request_processed(); |
| 2410 | break; | ||
| 2411 | default: | ||
| 2412 | /* Back to world regulatory in case of errors */ | ||
| 2413 | restore_regulatory_settings(user_reset); | ||
| 2414 | } | ||
| 2407 | 2415 | ||
| 2408 | kfree(rd); | 2416 | kfree(rd); |
| 2409 | return r; | 2417 | return r; |
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index 4b98b25793c5..1d5c7bf29938 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c | |||
| @@ -1158,7 +1158,7 @@ static struct xfrm_policy *__xfrm_policy_unlink(struct xfrm_policy *pol, | |||
| 1158 | if (hlist_unhashed(&pol->bydst)) | 1158 | if (hlist_unhashed(&pol->bydst)) |
| 1159 | return NULL; | 1159 | return NULL; |
| 1160 | 1160 | ||
| 1161 | hlist_del(&pol->bydst); | 1161 | hlist_del_init(&pol->bydst); |
| 1162 | hlist_del(&pol->byidx); | 1162 | hlist_del(&pol->byidx); |
| 1163 | list_del(&pol->walk.all); | 1163 | list_del(&pol->walk.all); |
| 1164 | net->xfrm.policy_count[dir]--; | 1164 | net->xfrm.policy_count[dir]--; |
diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index a26b7aa79475..40f1b3e92e78 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c | |||
| @@ -1159,6 +1159,11 @@ static struct xfrm_state *xfrm_state_clone(struct xfrm_state *orig, int *errp) | |||
| 1159 | } | 1159 | } |
| 1160 | x->props.aalgo = orig->props.aalgo; | 1160 | x->props.aalgo = orig->props.aalgo; |
| 1161 | 1161 | ||
| 1162 | if (orig->aead) { | ||
| 1163 | x->aead = xfrm_algo_aead_clone(orig->aead); | ||
| 1164 | if (!x->aead) | ||
| 1165 | goto error; | ||
| 1166 | } | ||
| 1162 | if (orig->ealg) { | 1167 | if (orig->ealg) { |
| 1163 | x->ealg = xfrm_algo_clone(orig->ealg); | 1168 | x->ealg = xfrm_algo_clone(orig->ealg); |
| 1164 | if (!x->ealg) | 1169 | if (!x->ealg) |
| @@ -1201,6 +1206,9 @@ static struct xfrm_state *xfrm_state_clone(struct xfrm_state *orig, int *errp) | |||
| 1201 | x->props.flags = orig->props.flags; | 1206 | x->props.flags = orig->props.flags; |
| 1202 | x->props.extra_flags = orig->props.extra_flags; | 1207 | x->props.extra_flags = orig->props.extra_flags; |
| 1203 | 1208 | ||
| 1209 | x->tfcpad = orig->tfcpad; | ||
| 1210 | x->replay_maxdiff = orig->replay_maxdiff; | ||
| 1211 | x->replay_maxage = orig->replay_maxage; | ||
| 1204 | x->curlft.add_time = orig->curlft.add_time; | 1212 | x->curlft.add_time = orig->curlft.add_time; |
| 1205 | x->km.state = orig->km.state; | 1213 | x->km.state = orig->km.state; |
| 1206 | x->km.seq = orig->km.seq; | 1214 | x->km.seq = orig->km.seq; |
| @@ -1215,11 +1223,12 @@ out: | |||
| 1215 | return NULL; | 1223 | return NULL; |
| 1216 | } | 1224 | } |
| 1217 | 1225 | ||
| 1218 | /* net->xfrm.xfrm_state_lock is held */ | ||
| 1219 | struct xfrm_state *xfrm_migrate_state_find(struct xfrm_migrate *m, struct net *net) | 1226 | struct xfrm_state *xfrm_migrate_state_find(struct xfrm_migrate *m, struct net *net) |
| 1220 | { | 1227 | { |
| 1221 | unsigned int h; | 1228 | unsigned int h; |
| 1222 | struct xfrm_state *x; | 1229 | struct xfrm_state *x = NULL; |
| 1230 | |||
| 1231 | spin_lock_bh(&net->xfrm.xfrm_state_lock); | ||
| 1223 | 1232 | ||
| 1224 | if (m->reqid) { | 1233 | if (m->reqid) { |
| 1225 | h = xfrm_dst_hash(net, &m->old_daddr, &m->old_saddr, | 1234 | h = xfrm_dst_hash(net, &m->old_daddr, &m->old_saddr, |
| @@ -1236,7 +1245,7 @@ struct xfrm_state *xfrm_migrate_state_find(struct xfrm_migrate *m, struct net *n | |||
| 1236 | m->old_family)) | 1245 | m->old_family)) |
| 1237 | continue; | 1246 | continue; |
| 1238 | xfrm_state_hold(x); | 1247 | xfrm_state_hold(x); |
| 1239 | return x; | 1248 | break; |
| 1240 | } | 1249 | } |
| 1241 | } else { | 1250 | } else { |
| 1242 | h = xfrm_src_hash(net, &m->old_daddr, &m->old_saddr, | 1251 | h = xfrm_src_hash(net, &m->old_daddr, &m->old_saddr, |
| @@ -1251,11 +1260,13 @@ struct xfrm_state *xfrm_migrate_state_find(struct xfrm_migrate *m, struct net *n | |||
| 1251 | m->old_family)) | 1260 | m->old_family)) |
| 1252 | continue; | 1261 | continue; |
| 1253 | xfrm_state_hold(x); | 1262 | xfrm_state_hold(x); |
| 1254 | return x; | 1263 | break; |
| 1255 | } | 1264 | } |
| 1256 | } | 1265 | } |
| 1257 | 1266 | ||
| 1258 | return NULL; | 1267 | spin_unlock_bh(&net->xfrm.xfrm_state_lock); |
| 1268 | |||
| 1269 | return x; | ||
| 1259 | } | 1270 | } |
| 1260 | EXPORT_SYMBOL(xfrm_migrate_state_find); | 1271 | EXPORT_SYMBOL(xfrm_migrate_state_find); |
| 1261 | 1272 | ||
| @@ -1451,7 +1462,7 @@ xfrm_state_sort(struct xfrm_state **dst, struct xfrm_state **src, int n, | |||
| 1451 | { | 1462 | { |
| 1452 | int err = 0; | 1463 | int err = 0; |
| 1453 | struct xfrm_state_afinfo *afinfo = xfrm_state_get_afinfo(family); | 1464 | struct xfrm_state_afinfo *afinfo = xfrm_state_get_afinfo(family); |
| 1454 | struct net *net = xs_net(*dst); | 1465 | struct net *net = xs_net(*src); |
| 1455 | 1466 | ||
| 1456 | if (!afinfo) | 1467 | if (!afinfo) |
| 1457 | return -EAFNOSUPPORT; | 1468 | return -EAFNOSUPPORT; |
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index 1ae3ec7c18b0..c274179d60a2 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c | |||
| @@ -32,11 +32,6 @@ | |||
| 32 | #include <linux/in6.h> | 32 | #include <linux/in6.h> |
| 33 | #endif | 33 | #endif |
| 34 | 34 | ||
| 35 | static inline int aead_len(struct xfrm_algo_aead *alg) | ||
| 36 | { | ||
| 37 | return sizeof(*alg) + ((alg->alg_key_len + 7) / 8); | ||
| 38 | } | ||
| 39 | |||
| 40 | static int verify_one_alg(struct nlattr **attrs, enum xfrm_attr_type_t type) | 35 | static int verify_one_alg(struct nlattr **attrs, enum xfrm_attr_type_t type) |
| 41 | { | 36 | { |
| 42 | struct nlattr *rt = attrs[type]; | 37 | struct nlattr *rt = attrs[type]; |
diff --git a/scripts/gen_initramfs_list.sh b/scripts/gen_initramfs_list.sh index ef474098d9f1..17fa901418ae 100644 --- a/scripts/gen_initramfs_list.sh +++ b/scripts/gen_initramfs_list.sh | |||
| @@ -257,7 +257,7 @@ case "$arg" in | |||
| 257 | && compr="lzop -9 -f" | 257 | && compr="lzop -9 -f" |
| 258 | echo "$output_file" | grep -q "\.lz4$" \ | 258 | echo "$output_file" | grep -q "\.lz4$" \ |
| 259 | && [ -x "`which lz4 2> /dev/null`" ] \ | 259 | && [ -x "`which lz4 2> /dev/null`" ] \ |
| 260 | && compr="lz4 -9 -f" | 260 | && compr="lz4 -l -9 -f" |
| 261 | echo "$output_file" | grep -q "\.cpio$" && compr="cat" | 261 | echo "$output_file" | grep -q "\.cpio$" && compr="cat" |
| 262 | shift | 262 | shift |
| 263 | ;; | 263 | ;; |
diff --git a/scripts/kallsyms.c b/scripts/kallsyms.c index 10085de886fe..276e84b8a8e5 100644 --- a/scripts/kallsyms.c +++ b/scripts/kallsyms.c | |||
| @@ -330,8 +330,7 @@ static void write_src(void) | |||
| 330 | printf("\tPTR\t_text + %#llx\n", | 330 | printf("\tPTR\t_text + %#llx\n", |
| 331 | table[i].addr - _text); | 331 | table[i].addr - _text); |
| 332 | else | 332 | else |
| 333 | printf("\tPTR\t_text - %#llx\n", | 333 | printf("\tPTR\t%#llx\n", table[i].addr); |
| 334 | _text - table[i].addr); | ||
| 335 | } else { | 334 | } else { |
| 336 | printf("\tPTR\t%#llx\n", table[i].addr); | 335 | printf("\tPTR\t%#llx\n", table[i].addr); |
| 337 | } | 336 | } |
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index 40610984a1b5..99a45fdc1bbf 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c | |||
| @@ -1502,6 +1502,16 @@ static int addend_386_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r) | |||
| 1502 | #define R_ARM_JUMP24 29 | 1502 | #define R_ARM_JUMP24 29 |
| 1503 | #endif | 1503 | #endif |
| 1504 | 1504 | ||
| 1505 | #ifndef R_ARM_THM_CALL | ||
| 1506 | #define R_ARM_THM_CALL 10 | ||
| 1507 | #endif | ||
| 1508 | #ifndef R_ARM_THM_JUMP24 | ||
| 1509 | #define R_ARM_THM_JUMP24 30 | ||
| 1510 | #endif | ||
| 1511 | #ifndef R_ARM_THM_JUMP19 | ||
| 1512 | #define R_ARM_THM_JUMP19 51 | ||
| 1513 | #endif | ||
| 1514 | |||
| 1505 | static int addend_arm_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r) | 1515 | static int addend_arm_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r) |
| 1506 | { | 1516 | { |
| 1507 | unsigned int r_typ = ELF_R_TYPE(r->r_info); | 1517 | unsigned int r_typ = ELF_R_TYPE(r->r_info); |
| @@ -1515,6 +1525,9 @@ static int addend_arm_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r) | |||
| 1515 | case R_ARM_PC24: | 1525 | case R_ARM_PC24: |
| 1516 | case R_ARM_CALL: | 1526 | case R_ARM_CALL: |
| 1517 | case R_ARM_JUMP24: | 1527 | case R_ARM_JUMP24: |
| 1528 | case R_ARM_THM_CALL: | ||
| 1529 | case R_ARM_THM_JUMP24: | ||
| 1530 | case R_ARM_THM_JUMP19: | ||
| 1518 | /* From ARM ABI: ((S + A) | T) - P */ | 1531 | /* From ARM ABI: ((S + A) | T) - P */ |
| 1519 | r->r_addend = (int)(long)(elf->hdr + | 1532 | r->r_addend = (int)(long)(elf->hdr + |
| 1520 | sechdr->sh_offset + | 1533 | sechdr->sh_offset + |
diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c index df3652ad15ef..8ed0bcc01386 100644 --- a/sound/pci/hda/patch_analog.c +++ b/sound/pci/hda/patch_analog.c | |||
| @@ -1026,6 +1026,9 @@ static void ad1884_fixup_thinkpad(struct hda_codec *codec, | |||
| 1026 | spec->gen.keep_eapd_on = 1; | 1026 | spec->gen.keep_eapd_on = 1; |
| 1027 | spec->gen.vmaster_mute.hook = ad_vmaster_eapd_hook; | 1027 | spec->gen.vmaster_mute.hook = ad_vmaster_eapd_hook; |
| 1028 | spec->eapd_nid = 0x12; | 1028 | spec->eapd_nid = 0x12; |
| 1029 | /* Analog PC Beeper - allow firmware/ACPI beeps */ | ||
| 1030 | spec->beep_amp = HDA_COMPOSE_AMP_VAL(0x20, 3, 3, HDA_INPUT); | ||
| 1031 | spec->gen.beep_nid = 0; /* no digital beep */ | ||
| 1029 | } | 1032 | } |
| 1030 | } | 1033 | } |
| 1031 | 1034 | ||
| @@ -1092,6 +1095,7 @@ static int patch_ad1884(struct hda_codec *codec) | |||
| 1092 | spec = codec->spec; | 1095 | spec = codec->spec; |
| 1093 | 1096 | ||
| 1094 | spec->gen.mixer_nid = 0x20; | 1097 | spec->gen.mixer_nid = 0x20; |
| 1098 | spec->gen.mixer_merge_nid = 0x21; | ||
| 1095 | spec->gen.beep_nid = 0x10; | 1099 | spec->gen.beep_nid = 0x10; |
| 1096 | set_beep_amp(spec, 0x10, 0, HDA_OUTPUT); | 1100 | set_beep_amp(spec, 0x10, 0, HDA_OUTPUT); |
| 1097 | 1101 | ||
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 6eb903cc6237..850296a1e0ff 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -4253,6 +4253,7 @@ static const struct hda_fixup alc269_fixups[] = { | |||
| 4253 | }; | 4253 | }; |
| 4254 | 4254 | ||
| 4255 | static const struct snd_pci_quirk alc269_fixup_tbl[] = { | 4255 | static const struct snd_pci_quirk alc269_fixup_tbl[] = { |
| 4256 | SND_PCI_QUIRK(0x1025, 0x0283, "Acer TravelMate 8371", ALC269_FIXUP_INV_DMIC), | ||
| 4256 | SND_PCI_QUIRK(0x1025, 0x029b, "Acer 1810TZ", ALC269_FIXUP_INV_DMIC), | 4257 | SND_PCI_QUIRK(0x1025, 0x029b, "Acer 1810TZ", ALC269_FIXUP_INV_DMIC), |
| 4257 | SND_PCI_QUIRK(0x1025, 0x0349, "Acer AOD260", ALC269_FIXUP_INV_DMIC), | 4258 | SND_PCI_QUIRK(0x1025, 0x0349, "Acer AOD260", ALC269_FIXUP_INV_DMIC), |
| 4258 | SND_PCI_QUIRK(0x1025, 0x047c, "Acer AC700", ALC269_FIXUP_ACER_AC700), | 4259 | SND_PCI_QUIRK(0x1025, 0x047c, "Acer AC700", ALC269_FIXUP_ACER_AC700), |
| @@ -4319,6 +4320,54 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
| 4319 | SND_PCI_QUIRK(0x103c, 0x1973, "HP Pavilion", ALC269_FIXUP_HP_MUTE_LED_MIC1), | 4320 | SND_PCI_QUIRK(0x103c, 0x1973, "HP Pavilion", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
| 4320 | SND_PCI_QUIRK(0x103c, 0x1983, "HP Pavilion", ALC269_FIXUP_HP_MUTE_LED_MIC1), | 4321 | SND_PCI_QUIRK(0x103c, 0x1983, "HP Pavilion", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
| 4321 | SND_PCI_QUIRK(0x103c, 0x218b, "HP", ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED), | 4322 | SND_PCI_QUIRK(0x103c, 0x218b, "HP", ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED), |
| 4323 | /* ALC282 */ | ||
| 4324 | SND_PCI_QUIRK(0x103c, 0x220f, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4325 | SND_PCI_QUIRK(0x103c, 0x2213, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4326 | SND_PCI_QUIRK(0x103c, 0x2266, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4327 | SND_PCI_QUIRK(0x103c, 0x2267, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4328 | SND_PCI_QUIRK(0x103c, 0x2268, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4329 | SND_PCI_QUIRK(0x103c, 0x2269, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4330 | SND_PCI_QUIRK(0x103c, 0x226a, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4331 | SND_PCI_QUIRK(0x103c, 0x226b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4332 | SND_PCI_QUIRK(0x103c, 0x227a, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4333 | SND_PCI_QUIRK(0x103c, 0x227b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4334 | SND_PCI_QUIRK(0x103c, 0x229e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4335 | SND_PCI_QUIRK(0x103c, 0x22a0, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4336 | SND_PCI_QUIRK(0x103c, 0x22b2, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4337 | SND_PCI_QUIRK(0x103c, 0x22b7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4338 | SND_PCI_QUIRK(0x103c, 0x22bf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4339 | SND_PCI_QUIRK(0x103c, 0x22c0, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4340 | SND_PCI_QUIRK(0x103c, 0x22c1, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4341 | SND_PCI_QUIRK(0x103c, 0x22c2, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4342 | SND_PCI_QUIRK(0x103c, 0x22cd, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4343 | SND_PCI_QUIRK(0x103c, 0x22ce, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4344 | SND_PCI_QUIRK(0x103c, 0x22cf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4345 | SND_PCI_QUIRK(0x103c, 0x22d0, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4346 | /* ALC290 */ | ||
| 4347 | SND_PCI_QUIRK(0x103c, 0x2260, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4348 | SND_PCI_QUIRK(0x103c, 0x2261, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4349 | SND_PCI_QUIRK(0x103c, 0x2262, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4350 | SND_PCI_QUIRK(0x103c, 0x2263, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4351 | SND_PCI_QUIRK(0x103c, 0x2264, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4352 | SND_PCI_QUIRK(0x103c, 0x2265, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4353 | SND_PCI_QUIRK(0x103c, 0x227d, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4354 | SND_PCI_QUIRK(0x103c, 0x227e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4355 | SND_PCI_QUIRK(0x103c, 0x227f, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4356 | SND_PCI_QUIRK(0x103c, 0x2280, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4357 | SND_PCI_QUIRK(0x103c, 0x2281, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4358 | SND_PCI_QUIRK(0x103c, 0x2282, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4359 | SND_PCI_QUIRK(0x103c, 0x2289, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4360 | SND_PCI_QUIRK(0x103c, 0x228a, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4361 | SND_PCI_QUIRK(0x103c, 0x228b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4362 | SND_PCI_QUIRK(0x103c, 0x228c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4363 | SND_PCI_QUIRK(0x103c, 0x228d, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4364 | SND_PCI_QUIRK(0x103c, 0x228e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4365 | SND_PCI_QUIRK(0x103c, 0x22c5, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4366 | SND_PCI_QUIRK(0x103c, 0x22c6, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4367 | SND_PCI_QUIRK(0x103c, 0x22c7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4368 | SND_PCI_QUIRK(0x103c, 0x22c8, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4369 | SND_PCI_QUIRK(0x103c, 0x22c3, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4370 | SND_PCI_QUIRK(0x103c, 0x22c4, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
| 4322 | SND_PCI_QUIRK_VENDOR(0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED), | 4371 | SND_PCI_QUIRK_VENDOR(0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED), |
| 4323 | SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300), | 4372 | SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300), |
| 4324 | SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), | 4373 | SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), |
| @@ -5115,7 +5164,7 @@ static const struct snd_pci_quirk alc662_fixup_tbl[] = { | |||
| 5115 | SND_PCI_QUIRK(0x1028, 0x0625, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE), | 5164 | SND_PCI_QUIRK(0x1028, 0x0625, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE), |
| 5116 | SND_PCI_QUIRK(0x1028, 0x0626, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE), | 5165 | SND_PCI_QUIRK(0x1028, 0x0626, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE), |
| 5117 | SND_PCI_QUIRK(0x1028, 0x0628, "Dell", ALC668_FIXUP_AUTO_MUTE), | 5166 | SND_PCI_QUIRK(0x1028, 0x0628, "Dell", ALC668_FIXUP_AUTO_MUTE), |
| 5118 | SND_PCI_QUIRK(0x1028, 0x064e, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE), | 5167 | SND_PCI_QUIRK(0x1028, 0x064e, "Dell", ALC668_FIXUP_AUTO_MUTE), |
| 5119 | SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800), | 5168 | SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800), |
| 5120 | SND_PCI_QUIRK(0x1043, 0x11cd, "Asus N550", ALC662_FIXUP_BASS_1A_CHMAP), | 5169 | SND_PCI_QUIRK(0x1043, 0x11cd, "Asus N550", ALC662_FIXUP_BASS_1A_CHMAP), |
| 5121 | SND_PCI_QUIRK(0x1043, 0x1477, "ASUS N56VZ", ALC662_FIXUP_BASS_CHMAP), | 5170 | SND_PCI_QUIRK(0x1043, 0x1477, "ASUS N56VZ", ALC662_FIXUP_BASS_CHMAP), |
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index a2f11bf8155c..3bc29c9b2529 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
| @@ -98,6 +98,7 @@ enum { | |||
| 98 | STAC_92HD83XXX_HP_LED, | 98 | STAC_92HD83XXX_HP_LED, |
| 99 | STAC_92HD83XXX_HP_INV_LED, | 99 | STAC_92HD83XXX_HP_INV_LED, |
| 100 | STAC_92HD83XXX_HP_MIC_LED, | 100 | STAC_92HD83XXX_HP_MIC_LED, |
| 101 | STAC_HP_LED_GPIO10, | ||
| 101 | STAC_92HD83XXX_HEADSET_JACK, | 102 | STAC_92HD83XXX_HEADSET_JACK, |
| 102 | STAC_92HD83XXX_HP, | 103 | STAC_92HD83XXX_HP, |
| 103 | STAC_HP_ENVY_BASS, | 104 | STAC_HP_ENVY_BASS, |
| @@ -2130,6 +2131,17 @@ static void stac92hd83xxx_fixup_hp_mic_led(struct hda_codec *codec, | |||
| 2130 | } | 2131 | } |
| 2131 | } | 2132 | } |
| 2132 | 2133 | ||
| 2134 | static void stac92hd83xxx_fixup_hp_led_gpio10(struct hda_codec *codec, | ||
| 2135 | const struct hda_fixup *fix, int action) | ||
| 2136 | { | ||
| 2137 | struct sigmatel_spec *spec = codec->spec; | ||
| 2138 | |||
| 2139 | if (action == HDA_FIXUP_ACT_PRE_PROBE) { | ||
| 2140 | spec->gpio_led = 0x10; /* GPIO4 */ | ||
| 2141 | spec->default_polarity = 0; | ||
| 2142 | } | ||
| 2143 | } | ||
| 2144 | |||
| 2133 | static void stac92hd83xxx_fixup_headset_jack(struct hda_codec *codec, | 2145 | static void stac92hd83xxx_fixup_headset_jack(struct hda_codec *codec, |
| 2134 | const struct hda_fixup *fix, int action) | 2146 | const struct hda_fixup *fix, int action) |
| 2135 | { | 2147 | { |
| @@ -2624,6 +2636,12 @@ static const struct hda_fixup stac92hd83xxx_fixups[] = { | |||
| 2624 | .chained = true, | 2636 | .chained = true, |
| 2625 | .chain_id = STAC_92HD83XXX_HP, | 2637 | .chain_id = STAC_92HD83XXX_HP, |
| 2626 | }, | 2638 | }, |
| 2639 | [STAC_HP_LED_GPIO10] = { | ||
| 2640 | .type = HDA_FIXUP_FUNC, | ||
| 2641 | .v.func = stac92hd83xxx_fixup_hp_led_gpio10, | ||
| 2642 | .chained = true, | ||
| 2643 | .chain_id = STAC_92HD83XXX_HP, | ||
| 2644 | }, | ||
| 2627 | [STAC_92HD83XXX_HEADSET_JACK] = { | 2645 | [STAC_92HD83XXX_HEADSET_JACK] = { |
| 2628 | .type = HDA_FIXUP_FUNC, | 2646 | .type = HDA_FIXUP_FUNC, |
| 2629 | .v.func = stac92hd83xxx_fixup_headset_jack, | 2647 | .v.func = stac92hd83xxx_fixup_headset_jack, |
| @@ -2702,6 +2720,8 @@ static const struct snd_pci_quirk stac92hd83xxx_fixup_tbl[] = { | |||
| 2702 | "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), | 2720 | "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), |
| 2703 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1888, | 2721 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1888, |
| 2704 | "HP Envy Spectre", STAC_HP_ENVY_BASS), | 2722 | "HP Envy Spectre", STAC_HP_ENVY_BASS), |
| 2723 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1899, | ||
| 2724 | "HP Folio 13", STAC_HP_LED_GPIO10), | ||
| 2705 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x18df, | 2725 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x18df, |
| 2706 | "HP Folio", STAC_HP_BNB13_EQ), | 2726 | "HP Folio", STAC_HP_BNB13_EQ), |
| 2707 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x18F8, | 2727 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x18F8, |
diff --git a/sound/soc/codecs/ad1980.c b/sound/soc/codecs/ad1980.c index 7257a8885f42..34d965a4a040 100644 --- a/sound/soc/codecs/ad1980.c +++ b/sound/soc/codecs/ad1980.c | |||
| @@ -57,8 +57,8 @@ static const u16 ad1980_reg[] = { | |||
| 57 | static const char *ad1980_rec_sel[] = {"Mic", "CD", "NC", "AUX", "Line", | 57 | static const char *ad1980_rec_sel[] = {"Mic", "CD", "NC", "AUX", "Line", |
| 58 | "Stereo Mix", "Mono Mix", "Phone"}; | 58 | "Stereo Mix", "Mono Mix", "Phone"}; |
| 59 | 59 | ||
| 60 | static const struct soc_enum ad1980_cap_src = | 60 | static SOC_ENUM_DOUBLE_DECL(ad1980_cap_src, |
| 61 | SOC_ENUM_DOUBLE(AC97_REC_SEL, 8, 0, 7, ad1980_rec_sel); | 61 | AC97_REC_SEL, 8, 0, ad1980_rec_sel); |
| 62 | 62 | ||
| 63 | static const struct snd_kcontrol_new ad1980_snd_ac97_controls[] = { | 63 | static const struct snd_kcontrol_new ad1980_snd_ac97_controls[] = { |
| 64 | SOC_DOUBLE("Master Playback Volume", AC97_MASTER, 8, 0, 31, 1), | 64 | SOC_DOUBLE("Master Playback Volume", AC97_MASTER, 8, 0, 31, 1), |
diff --git a/sound/soc/codecs/da732x.c b/sound/soc/codecs/da732x.c index f295b6569910..f4d965ebc29e 100644 --- a/sound/soc/codecs/da732x.c +++ b/sound/soc/codecs/da732x.c | |||
| @@ -1268,11 +1268,23 @@ static struct snd_soc_dai_driver da732x_dai[] = { | |||
| 1268 | }, | 1268 | }, |
| 1269 | }; | 1269 | }; |
| 1270 | 1270 | ||
| 1271 | static bool da732x_volatile(struct device *dev, unsigned int reg) | ||
| 1272 | { | ||
| 1273 | switch (reg) { | ||
| 1274 | case DA732X_REG_HPL_DAC_OFF_CNTL: | ||
| 1275 | case DA732X_REG_HPR_DAC_OFF_CNTL: | ||
| 1276 | return true; | ||
| 1277 | default: | ||
| 1278 | return false; | ||
| 1279 | } | ||
| 1280 | } | ||
| 1281 | |||
| 1271 | static const struct regmap_config da732x_regmap = { | 1282 | static const struct regmap_config da732x_regmap = { |
| 1272 | .reg_bits = 8, | 1283 | .reg_bits = 8, |
| 1273 | .val_bits = 8, | 1284 | .val_bits = 8, |
| 1274 | 1285 | ||
| 1275 | .max_register = DA732X_MAX_REG, | 1286 | .max_register = DA732X_MAX_REG, |
| 1287 | .volatile_reg = da732x_volatile, | ||
| 1276 | .reg_defaults = da732x_reg_cache, | 1288 | .reg_defaults = da732x_reg_cache, |
| 1277 | .num_reg_defaults = ARRAY_SIZE(da732x_reg_cache), | 1289 | .num_reg_defaults = ARRAY_SIZE(da732x_reg_cache), |
| 1278 | .cache_type = REGCACHE_RBTREE, | 1290 | .cache_type = REGCACHE_RBTREE, |
diff --git a/sound/soc/codecs/isabelle.c b/sound/soc/codecs/isabelle.c index 5839048ec467..cb736ddc446d 100644 --- a/sound/soc/codecs/isabelle.c +++ b/sound/soc/codecs/isabelle.c | |||
| @@ -140,13 +140,17 @@ static const char *isabelle_rx1_texts[] = {"VRX1", "ARX1"}; | |||
| 140 | static const char *isabelle_rx2_texts[] = {"VRX2", "ARX2"}; | 140 | static const char *isabelle_rx2_texts[] = {"VRX2", "ARX2"}; |
| 141 | 141 | ||
| 142 | static const struct soc_enum isabelle_rx1_enum[] = { | 142 | static const struct soc_enum isabelle_rx1_enum[] = { |
| 143 | SOC_ENUM_SINGLE(ISABELLE_VOICE_HPF_CFG_REG, 3, 1, isabelle_rx1_texts), | 143 | SOC_ENUM_SINGLE(ISABELLE_VOICE_HPF_CFG_REG, 3, |
| 144 | SOC_ENUM_SINGLE(ISABELLE_AUDIO_HPF_CFG_REG, 5, 1, isabelle_rx1_texts), | 144 | ARRAY_SIZE(isabelle_rx1_texts), isabelle_rx1_texts), |
| 145 | SOC_ENUM_SINGLE(ISABELLE_AUDIO_HPF_CFG_REG, 5, | ||
| 146 | ARRAY_SIZE(isabelle_rx1_texts), isabelle_rx1_texts), | ||
| 145 | }; | 147 | }; |
| 146 | 148 | ||
| 147 | static const struct soc_enum isabelle_rx2_enum[] = { | 149 | static const struct soc_enum isabelle_rx2_enum[] = { |
| 148 | SOC_ENUM_SINGLE(ISABELLE_VOICE_HPF_CFG_REG, 2, 1, isabelle_rx2_texts), | 150 | SOC_ENUM_SINGLE(ISABELLE_VOICE_HPF_CFG_REG, 2, |
| 149 | SOC_ENUM_SINGLE(ISABELLE_AUDIO_HPF_CFG_REG, 4, 1, isabelle_rx2_texts), | 151 | ARRAY_SIZE(isabelle_rx2_texts), isabelle_rx2_texts), |
| 152 | SOC_ENUM_SINGLE(ISABELLE_AUDIO_HPF_CFG_REG, 4, | ||
| 153 | ARRAY_SIZE(isabelle_rx2_texts), isabelle_rx2_texts), | ||
| 150 | }; | 154 | }; |
| 151 | 155 | ||
| 152 | /* Headset DAC playback switches */ | 156 | /* Headset DAC playback switches */ |
| @@ -161,13 +165,17 @@ static const char *isabelle_atx_texts[] = {"AMIC1", "DMIC"}; | |||
| 161 | static const char *isabelle_vtx_texts[] = {"AMIC2", "DMIC"}; | 165 | static const char *isabelle_vtx_texts[] = {"AMIC2", "DMIC"}; |
| 162 | 166 | ||
| 163 | static const struct soc_enum isabelle_atx_enum[] = { | 167 | static const struct soc_enum isabelle_atx_enum[] = { |
| 164 | SOC_ENUM_SINGLE(ISABELLE_AMIC_CFG_REG, 7, 1, isabelle_atx_texts), | 168 | SOC_ENUM_SINGLE(ISABELLE_AMIC_CFG_REG, 7, |
| 165 | SOC_ENUM_SINGLE(ISABELLE_DMIC_CFG_REG, 0, 1, isabelle_atx_texts), | 169 | ARRAY_SIZE(isabelle_atx_texts), isabelle_atx_texts), |
| 170 | SOC_ENUM_SINGLE(ISABELLE_DMIC_CFG_REG, 0, | ||
| 171 | ARRAY_SIZE(isabelle_atx_texts), isabelle_atx_texts), | ||
| 166 | }; | 172 | }; |
| 167 | 173 | ||
| 168 | static const struct soc_enum isabelle_vtx_enum[] = { | 174 | static const struct soc_enum isabelle_vtx_enum[] = { |
| 169 | SOC_ENUM_SINGLE(ISABELLE_AMIC_CFG_REG, 6, 1, isabelle_vtx_texts), | 175 | SOC_ENUM_SINGLE(ISABELLE_AMIC_CFG_REG, 6, |
| 170 | SOC_ENUM_SINGLE(ISABELLE_DMIC_CFG_REG, 0, 1, isabelle_vtx_texts), | 176 | ARRAY_SIZE(isabelle_vtx_texts), isabelle_vtx_texts), |
| 177 | SOC_ENUM_SINGLE(ISABELLE_DMIC_CFG_REG, 0, | ||
| 178 | ARRAY_SIZE(isabelle_vtx_texts), isabelle_vtx_texts), | ||
| 171 | }; | 179 | }; |
| 172 | 180 | ||
| 173 | static const struct snd_kcontrol_new atx_mux_controls = | 181 | static const struct snd_kcontrol_new atx_mux_controls = |
| @@ -183,17 +191,13 @@ static const char *isabelle_amic1_texts[] = { | |||
| 183 | /* Left analog microphone selection */ | 191 | /* Left analog microphone selection */ |
| 184 | static const char *isabelle_amic2_texts[] = {"Sub Mic", "Aux/FM Right"}; | 192 | static const char *isabelle_amic2_texts[] = {"Sub Mic", "Aux/FM Right"}; |
| 185 | 193 | ||
| 186 | static const struct soc_enum isabelle_amic1_enum[] = { | 194 | static SOC_ENUM_SINGLE_DECL(isabelle_amic1_enum, |
| 187 | SOC_ENUM_SINGLE(ISABELLE_AMIC_CFG_REG, 5, | 195 | ISABELLE_AMIC_CFG_REG, 5, |
| 188 | ARRAY_SIZE(isabelle_amic1_texts), | 196 | isabelle_amic1_texts); |
| 189 | isabelle_amic1_texts), | ||
| 190 | }; | ||
| 191 | 197 | ||
| 192 | static const struct soc_enum isabelle_amic2_enum[] = { | 198 | static SOC_ENUM_SINGLE_DECL(isabelle_amic2_enum, |
| 193 | SOC_ENUM_SINGLE(ISABELLE_AMIC_CFG_REG, 4, | 199 | ISABELLE_AMIC_CFG_REG, 4, |
| 194 | ARRAY_SIZE(isabelle_amic2_texts), | 200 | isabelle_amic2_texts); |
| 195 | isabelle_amic2_texts), | ||
| 196 | }; | ||
| 197 | 201 | ||
| 198 | static const struct snd_kcontrol_new amic1_control = | 202 | static const struct snd_kcontrol_new amic1_control = |
| 199 | SOC_DAPM_ENUM("Route", isabelle_amic1_enum); | 203 | SOC_DAPM_ENUM("Route", isabelle_amic1_enum); |
| @@ -206,16 +210,20 @@ static const char *isabelle_st_audio_texts[] = {"ATX1", "ATX2"}; | |||
| 206 | static const char *isabelle_st_voice_texts[] = {"VTX1", "VTX2"}; | 210 | static const char *isabelle_st_voice_texts[] = {"VTX1", "VTX2"}; |
| 207 | 211 | ||
| 208 | static const struct soc_enum isabelle_st_audio_enum[] = { | 212 | static const struct soc_enum isabelle_st_audio_enum[] = { |
| 209 | SOC_ENUM_SINGLE(ISABELLE_ATX_STPGA1_CFG_REG, 7, 1, | 213 | SOC_ENUM_SINGLE(ISABELLE_ATX_STPGA1_CFG_REG, 7, |
| 214 | ARRAY_SIZE(isabelle_st_audio_texts), | ||
| 210 | isabelle_st_audio_texts), | 215 | isabelle_st_audio_texts), |
| 211 | SOC_ENUM_SINGLE(ISABELLE_ATX_STPGA2_CFG_REG, 7, 1, | 216 | SOC_ENUM_SINGLE(ISABELLE_ATX_STPGA2_CFG_REG, 7, |
| 217 | ARRAY_SIZE(isabelle_st_audio_texts), | ||
| 212 | isabelle_st_audio_texts), | 218 | isabelle_st_audio_texts), |
| 213 | }; | 219 | }; |
| 214 | 220 | ||
| 215 | static const struct soc_enum isabelle_st_voice_enum[] = { | 221 | static const struct soc_enum isabelle_st_voice_enum[] = { |
| 216 | SOC_ENUM_SINGLE(ISABELLE_VTX_STPGA1_CFG_REG, 7, 1, | 222 | SOC_ENUM_SINGLE(ISABELLE_VTX_STPGA1_CFG_REG, 7, |
| 223 | ARRAY_SIZE(isabelle_st_voice_texts), | ||
| 217 | isabelle_st_voice_texts), | 224 | isabelle_st_voice_texts), |
| 218 | SOC_ENUM_SINGLE(ISABELLE_VTX2_STPGA2_CFG_REG, 7, 1, | 225 | SOC_ENUM_SINGLE(ISABELLE_VTX2_STPGA2_CFG_REG, 7, |
| 226 | ARRAY_SIZE(isabelle_st_voice_texts), | ||
| 219 | isabelle_st_voice_texts), | 227 | isabelle_st_voice_texts), |
| 220 | }; | 228 | }; |
| 221 | 229 | ||
diff --git a/sound/soc/codecs/sta32x.c b/sound/soc/codecs/sta32x.c index 06edb396e733..2735361a4c3c 100644 --- a/sound/soc/codecs/sta32x.c +++ b/sound/soc/codecs/sta32x.c | |||
| @@ -187,42 +187,42 @@ static const unsigned int sta32x_limiter_drc_release_tlv[] = { | |||
| 187 | 13, 16, TLV_DB_SCALE_ITEM(-1500, 300, 0), | 187 | 13, 16, TLV_DB_SCALE_ITEM(-1500, 300, 0), |
| 188 | }; | 188 | }; |
| 189 | 189 | ||
| 190 | static const struct soc_enum sta32x_drc_ac_enum = | 190 | static SOC_ENUM_SINGLE_DECL(sta32x_drc_ac_enum, |
| 191 | SOC_ENUM_SINGLE(STA32X_CONFD, STA32X_CONFD_DRC_SHIFT, | 191 | STA32X_CONFD, STA32X_CONFD_DRC_SHIFT, |
| 192 | 2, sta32x_drc_ac); | 192 | sta32x_drc_ac); |
| 193 | static const struct soc_enum sta32x_auto_eq_enum = | 193 | static SOC_ENUM_SINGLE_DECL(sta32x_auto_eq_enum, |
| 194 | SOC_ENUM_SINGLE(STA32X_AUTO1, STA32X_AUTO1_AMEQ_SHIFT, | 194 | STA32X_AUTO1, STA32X_AUTO1_AMEQ_SHIFT, |
| 195 | 3, sta32x_auto_eq_mode); | 195 | sta32x_auto_eq_mode); |
| 196 | static const struct soc_enum sta32x_auto_gc_enum = | 196 | static SOC_ENUM_SINGLE_DECL(sta32x_auto_gc_enum, |
| 197 | SOC_ENUM_SINGLE(STA32X_AUTO1, STA32X_AUTO1_AMGC_SHIFT, | 197 | STA32X_AUTO1, STA32X_AUTO1_AMGC_SHIFT, |
| 198 | 4, sta32x_auto_gc_mode); | 198 | sta32x_auto_gc_mode); |
| 199 | static const struct soc_enum sta32x_auto_xo_enum = | 199 | static SOC_ENUM_SINGLE_DECL(sta32x_auto_xo_enum, |
| 200 | SOC_ENUM_SINGLE(STA32X_AUTO2, STA32X_AUTO2_XO_SHIFT, | 200 | STA32X_AUTO2, STA32X_AUTO2_XO_SHIFT, |
| 201 | 16, sta32x_auto_xo_mode); | 201 | sta32x_auto_xo_mode); |
| 202 | static const struct soc_enum sta32x_preset_eq_enum = | 202 | static SOC_ENUM_SINGLE_DECL(sta32x_preset_eq_enum, |
| 203 | SOC_ENUM_SINGLE(STA32X_AUTO3, STA32X_AUTO3_PEQ_SHIFT, | 203 | STA32X_AUTO3, STA32X_AUTO3_PEQ_SHIFT, |
| 204 | 32, sta32x_preset_eq_mode); | 204 | sta32x_preset_eq_mode); |
| 205 | static const struct soc_enum sta32x_limiter_ch1_enum = | 205 | static SOC_ENUM_SINGLE_DECL(sta32x_limiter_ch1_enum, |
| 206 | SOC_ENUM_SINGLE(STA32X_C1CFG, STA32X_CxCFG_LS_SHIFT, | 206 | STA32X_C1CFG, STA32X_CxCFG_LS_SHIFT, |
| 207 | 3, sta32x_limiter_select); | 207 | sta32x_limiter_select); |
| 208 | static const struct soc_enum sta32x_limiter_ch2_enum = | 208 | static SOC_ENUM_SINGLE_DECL(sta32x_limiter_ch2_enum, |
| 209 | SOC_ENUM_SINGLE(STA32X_C2CFG, STA32X_CxCFG_LS_SHIFT, | 209 | STA32X_C2CFG, STA32X_CxCFG_LS_SHIFT, |
| 210 | 3, sta32x_limiter_select); | 210 | sta32x_limiter_select); |
| 211 | static const struct soc_enum sta32x_limiter_ch3_enum = | 211 | static SOC_ENUM_SINGLE_DECL(sta32x_limiter_ch3_enum, |
| 212 | SOC_ENUM_SINGLE(STA32X_C3CFG, STA32X_CxCFG_LS_SHIFT, | 212 | STA32X_C3CFG, STA32X_CxCFG_LS_SHIFT, |
| 213 | 3, sta32x_limiter_select); | 213 | sta32x_limiter_select); |
| 214 | static const struct soc_enum sta32x_limiter1_attack_rate_enum = | 214 | static SOC_ENUM_SINGLE_DECL(sta32x_limiter1_attack_rate_enum, |
| 215 | SOC_ENUM_SINGLE(STA32X_L1AR, STA32X_LxA_SHIFT, | 215 | STA32X_L1AR, STA32X_LxA_SHIFT, |
| 216 | 16, sta32x_limiter_attack_rate); | 216 | sta32x_limiter_attack_rate); |
| 217 | static const struct soc_enum sta32x_limiter2_attack_rate_enum = | 217 | static SOC_ENUM_SINGLE_DECL(sta32x_limiter2_attack_rate_enum, |
| 218 | SOC_ENUM_SINGLE(STA32X_L2AR, STA32X_LxA_SHIFT, | 218 | STA32X_L2AR, STA32X_LxA_SHIFT, |
| 219 | 16, sta32x_limiter_attack_rate); | 219 | sta32x_limiter_attack_rate); |
| 220 | static const struct soc_enum sta32x_limiter1_release_rate_enum = | 220 | static SOC_ENUM_SINGLE_DECL(sta32x_limiter1_release_rate_enum, |
| 221 | SOC_ENUM_SINGLE(STA32X_L1AR, STA32X_LxR_SHIFT, | 221 | STA32X_L1AR, STA32X_LxR_SHIFT, |
| 222 | 16, sta32x_limiter_release_rate); | 222 | sta32x_limiter_release_rate); |
| 223 | static const struct soc_enum sta32x_limiter2_release_rate_enum = | 223 | static SOC_ENUM_SINGLE_DECL(sta32x_limiter2_release_rate_enum, |
| 224 | SOC_ENUM_SINGLE(STA32X_L2AR, STA32X_LxR_SHIFT, | 224 | STA32X_L2AR, STA32X_LxR_SHIFT, |
| 225 | 16, sta32x_limiter_release_rate); | 225 | sta32x_limiter_release_rate); |
| 226 | 226 | ||
| 227 | /* byte array controls for setting biquad, mixer, scaling coefficients; | 227 | /* byte array controls for setting biquad, mixer, scaling coefficients; |
| 228 | * for biquads all five coefficients need to be set in one go, | 228 | * for biquads all five coefficients need to be set in one go, |
| @@ -331,7 +331,7 @@ static int sta32x_sync_coef_shadow(struct snd_soc_codec *codec) | |||
| 331 | 331 | ||
| 332 | static int sta32x_cache_sync(struct snd_soc_codec *codec) | 332 | static int sta32x_cache_sync(struct snd_soc_codec *codec) |
| 333 | { | 333 | { |
| 334 | struct sta32x_priv *sta32x = codec->control_data; | 334 | struct sta32x_priv *sta32x = snd_soc_codec_get_drvdata(codec); |
| 335 | unsigned int mute; | 335 | unsigned int mute; |
| 336 | int rc; | 336 | int rc; |
| 337 | 337 | ||
| @@ -434,7 +434,7 @@ SOC_SINGLE_TLV("Treble Tone Control", STA32X_TONE, STA32X_TONE_TTC_SHIFT, 15, 0, | |||
| 434 | SOC_ENUM("Limiter1 Attack Rate (dB/ms)", sta32x_limiter1_attack_rate_enum), | 434 | SOC_ENUM("Limiter1 Attack Rate (dB/ms)", sta32x_limiter1_attack_rate_enum), |
| 435 | SOC_ENUM("Limiter2 Attack Rate (dB/ms)", sta32x_limiter2_attack_rate_enum), | 435 | SOC_ENUM("Limiter2 Attack Rate (dB/ms)", sta32x_limiter2_attack_rate_enum), |
| 436 | SOC_ENUM("Limiter1 Release Rate (dB/ms)", sta32x_limiter1_release_rate_enum), | 436 | SOC_ENUM("Limiter1 Release Rate (dB/ms)", sta32x_limiter1_release_rate_enum), |
| 437 | SOC_ENUM("Limiter2 Release Rate (dB/ms)", sta32x_limiter1_release_rate_enum), | 437 | SOC_ENUM("Limiter2 Release Rate (dB/ms)", sta32x_limiter2_release_rate_enum), |
| 438 | 438 | ||
| 439 | /* depending on mode, the attack/release thresholds have | 439 | /* depending on mode, the attack/release thresholds have |
| 440 | * two different enum definitions; provide both | 440 | * two different enum definitions; provide both |
diff --git a/sound/soc/codecs/wm8400.c b/sound/soc/codecs/wm8400.c index 48dc7d2fee36..6d684d934f4d 100644 --- a/sound/soc/codecs/wm8400.c +++ b/sound/soc/codecs/wm8400.c | |||
| @@ -117,19 +117,23 @@ static int wm8400_outpga_put_volsw_vu(struct snd_kcontrol *kcontrol, | |||
| 117 | static const char *wm8400_digital_sidetone[] = | 117 | static const char *wm8400_digital_sidetone[] = |
| 118 | {"None", "Left ADC", "Right ADC", "Reserved"}; | 118 | {"None", "Left ADC", "Right ADC", "Reserved"}; |
| 119 | 119 | ||
| 120 | static const struct soc_enum wm8400_left_digital_sidetone_enum = | 120 | static SOC_ENUM_SINGLE_DECL(wm8400_left_digital_sidetone_enum, |
| 121 | SOC_ENUM_SINGLE(WM8400_DIGITAL_SIDE_TONE, | 121 | WM8400_DIGITAL_SIDE_TONE, |
| 122 | WM8400_ADC_TO_DACL_SHIFT, 2, wm8400_digital_sidetone); | 122 | WM8400_ADC_TO_DACL_SHIFT, |
| 123 | wm8400_digital_sidetone); | ||
| 123 | 124 | ||
| 124 | static const struct soc_enum wm8400_right_digital_sidetone_enum = | 125 | static SOC_ENUM_SINGLE_DECL(wm8400_right_digital_sidetone_enum, |
| 125 | SOC_ENUM_SINGLE(WM8400_DIGITAL_SIDE_TONE, | 126 | WM8400_DIGITAL_SIDE_TONE, |
| 126 | WM8400_ADC_TO_DACR_SHIFT, 2, wm8400_digital_sidetone); | 127 | WM8400_ADC_TO_DACR_SHIFT, |
| 128 | wm8400_digital_sidetone); | ||
| 127 | 129 | ||
| 128 | static const char *wm8400_adcmode[] = | 130 | static const char *wm8400_adcmode[] = |
| 129 | {"Hi-fi mode", "Voice mode 1", "Voice mode 2", "Voice mode 3"}; | 131 | {"Hi-fi mode", "Voice mode 1", "Voice mode 2", "Voice mode 3"}; |
| 130 | 132 | ||
| 131 | static const struct soc_enum wm8400_right_adcmode_enum = | 133 | static SOC_ENUM_SINGLE_DECL(wm8400_right_adcmode_enum, |
| 132 | SOC_ENUM_SINGLE(WM8400_ADC_CTRL, WM8400_ADC_HPF_CUT_SHIFT, 3, wm8400_adcmode); | 134 | WM8400_ADC_CTRL, |
| 135 | WM8400_ADC_HPF_CUT_SHIFT, | ||
| 136 | wm8400_adcmode); | ||
| 133 | 137 | ||
| 134 | static const struct snd_kcontrol_new wm8400_snd_controls[] = { | 138 | static const struct snd_kcontrol_new wm8400_snd_controls[] = { |
| 135 | /* INMIXL */ | 139 | /* INMIXL */ |
| @@ -422,9 +426,10 @@ SOC_DAPM_SINGLE("RINPGA34 Switch", WM8400_INPUT_MIXER3, WM8400_L34MNB_SHIFT, | |||
| 422 | static const char *wm8400_ainlmux[] = | 426 | static const char *wm8400_ainlmux[] = |
| 423 | {"INMIXL Mix", "RXVOICE Mix", "DIFFINL Mix"}; | 427 | {"INMIXL Mix", "RXVOICE Mix", "DIFFINL Mix"}; |
| 424 | 428 | ||
| 425 | static const struct soc_enum wm8400_ainlmux_enum = | 429 | static SOC_ENUM_SINGLE_DECL(wm8400_ainlmux_enum, |
| 426 | SOC_ENUM_SINGLE( WM8400_INPUT_MIXER1, WM8400_AINLMODE_SHIFT, | 430 | WM8400_INPUT_MIXER1, |
| 427 | ARRAY_SIZE(wm8400_ainlmux), wm8400_ainlmux); | 431 | WM8400_AINLMODE_SHIFT, |
| 432 | wm8400_ainlmux); | ||
| 428 | 433 | ||
| 429 | static const struct snd_kcontrol_new wm8400_dapm_ainlmux_controls = | 434 | static const struct snd_kcontrol_new wm8400_dapm_ainlmux_controls = |
| 430 | SOC_DAPM_ENUM("Route", wm8400_ainlmux_enum); | 435 | SOC_DAPM_ENUM("Route", wm8400_ainlmux_enum); |
| @@ -435,9 +440,10 @@ SOC_DAPM_ENUM("Route", wm8400_ainlmux_enum); | |||
| 435 | static const char *wm8400_ainrmux[] = | 440 | static const char *wm8400_ainrmux[] = |
| 436 | {"INMIXR Mix", "RXVOICE Mix", "DIFFINR Mix"}; | 441 | {"INMIXR Mix", "RXVOICE Mix", "DIFFINR Mix"}; |
| 437 | 442 | ||
| 438 | static const struct soc_enum wm8400_ainrmux_enum = | 443 | static SOC_ENUM_SINGLE_DECL(wm8400_ainrmux_enum, |
| 439 | SOC_ENUM_SINGLE( WM8400_INPUT_MIXER1, WM8400_AINRMODE_SHIFT, | 444 | WM8400_INPUT_MIXER1, |
| 440 | ARRAY_SIZE(wm8400_ainrmux), wm8400_ainrmux); | 445 | WM8400_AINRMODE_SHIFT, |
| 446 | wm8400_ainrmux); | ||
| 441 | 447 | ||
| 442 | static const struct snd_kcontrol_new wm8400_dapm_ainrmux_controls = | 448 | static const struct snd_kcontrol_new wm8400_dapm_ainrmux_controls = |
| 443 | SOC_DAPM_ENUM("Route", wm8400_ainrmux_enum); | 449 | SOC_DAPM_ENUM("Route", wm8400_ainrmux_enum); |
diff --git a/sound/soc/codecs/wm8770.c b/sound/soc/codecs/wm8770.c index 89a18d82f303..5bce21013485 100644 --- a/sound/soc/codecs/wm8770.c +++ b/sound/soc/codecs/wm8770.c | |||
| @@ -196,8 +196,8 @@ static const char *ain_text[] = { | |||
| 196 | "AIN5", "AIN6", "AIN7", "AIN8" | 196 | "AIN5", "AIN6", "AIN7", "AIN8" |
| 197 | }; | 197 | }; |
| 198 | 198 | ||
| 199 | static const struct soc_enum ain_enum = | 199 | static SOC_ENUM_DOUBLE_DECL(ain_enum, |
| 200 | SOC_ENUM_DOUBLE(WM8770_ADCMUX, 0, 4, 8, ain_text); | 200 | WM8770_ADCMUX, 0, 4, ain_text); |
| 201 | 201 | ||
| 202 | static const struct snd_kcontrol_new ain_mux = | 202 | static const struct snd_kcontrol_new ain_mux = |
| 203 | SOC_DAPM_ENUM("Capture Mux", ain_enum); | 203 | SOC_DAPM_ENUM("Capture Mux", ain_enum); |
diff --git a/sound/soc/codecs/wm8900.c b/sound/soc/codecs/wm8900.c index e98bc7038a08..43c2201cb901 100644 --- a/sound/soc/codecs/wm8900.c +++ b/sound/soc/codecs/wm8900.c | |||
| @@ -304,53 +304,53 @@ static const DECLARE_TLV_DB_SCALE(adc_tlv, -7200, 75, 1); | |||
| 304 | 304 | ||
| 305 | static const char *mic_bias_level_txt[] = { "0.9*AVDD", "0.65*AVDD" }; | 305 | static const char *mic_bias_level_txt[] = { "0.9*AVDD", "0.65*AVDD" }; |
| 306 | 306 | ||
| 307 | static const struct soc_enum mic_bias_level = | 307 | static SOC_ENUM_SINGLE_DECL(mic_bias_level, |
| 308 | SOC_ENUM_SINGLE(WM8900_REG_INCTL, 8, 2, mic_bias_level_txt); | 308 | WM8900_REG_INCTL, 8, mic_bias_level_txt); |
| 309 | 309 | ||
| 310 | static const char *dac_mute_rate_txt[] = { "Fast", "Slow" }; | 310 | static const char *dac_mute_rate_txt[] = { "Fast", "Slow" }; |
| 311 | 311 | ||
| 312 | static const struct soc_enum dac_mute_rate = | 312 | static SOC_ENUM_SINGLE_DECL(dac_mute_rate, |
| 313 | SOC_ENUM_SINGLE(WM8900_REG_DACCTRL, 7, 2, dac_mute_rate_txt); | 313 | WM8900_REG_DACCTRL, 7, dac_mute_rate_txt); |
| 314 | 314 | ||
| 315 | static const char *dac_deemphasis_txt[] = { | 315 | static const char *dac_deemphasis_txt[] = { |
| 316 | "Disabled", "32kHz", "44.1kHz", "48kHz" | 316 | "Disabled", "32kHz", "44.1kHz", "48kHz" |
| 317 | }; | 317 | }; |
| 318 | 318 | ||
| 319 | static const struct soc_enum dac_deemphasis = | 319 | static SOC_ENUM_SINGLE_DECL(dac_deemphasis, |
| 320 | SOC_ENUM_SINGLE(WM8900_REG_DACCTRL, 4, 4, dac_deemphasis_txt); | 320 | WM8900_REG_DACCTRL, 4, dac_deemphasis_txt); |
| 321 | 321 | ||
| 322 | static const char *adc_hpf_cut_txt[] = { | 322 | static const char *adc_hpf_cut_txt[] = { |
| 323 | "Hi-fi mode", "Voice mode 1", "Voice mode 2", "Voice mode 3" | 323 | "Hi-fi mode", "Voice mode 1", "Voice mode 2", "Voice mode 3" |
| 324 | }; | 324 | }; |
| 325 | 325 | ||
| 326 | static const struct soc_enum adc_hpf_cut = | 326 | static SOC_ENUM_SINGLE_DECL(adc_hpf_cut, |
| 327 | SOC_ENUM_SINGLE(WM8900_REG_ADCCTRL, 5, 4, adc_hpf_cut_txt); | 327 | WM8900_REG_ADCCTRL, 5, adc_hpf_cut_txt); |
| 328 | 328 | ||
| 329 | static const char *lr_txt[] = { | 329 | static const char *lr_txt[] = { |
| 330 | "Left", "Right" | 330 | "Left", "Right" |
| 331 | }; | 331 | }; |
| 332 | 332 | ||
| 333 | static const struct soc_enum aifl_src = | 333 | static SOC_ENUM_SINGLE_DECL(aifl_src, |
| 334 | SOC_ENUM_SINGLE(WM8900_REG_AUDIO1, 15, 2, lr_txt); | 334 | WM8900_REG_AUDIO1, 15, lr_txt); |
| 335 | 335 | ||
| 336 | static const struct soc_enum aifr_src = | 336 | static SOC_ENUM_SINGLE_DECL(aifr_src, |
| 337 | SOC_ENUM_SINGLE(WM8900_REG_AUDIO1, 14, 2, lr_txt); | 337 | WM8900_REG_AUDIO1, 14, lr_txt); |
| 338 | 338 | ||
| 339 | static const struct soc_enum dacl_src = | 339 | static SOC_ENUM_SINGLE_DECL(dacl_src, |
| 340 | SOC_ENUM_SINGLE(WM8900_REG_AUDIO2, 15, 2, lr_txt); | 340 | WM8900_REG_AUDIO2, 15, lr_txt); |
| 341 | 341 | ||
| 342 | static const struct soc_enum dacr_src = | 342 | static SOC_ENUM_SINGLE_DECL(dacr_src, |
| 343 | SOC_ENUM_SINGLE(WM8900_REG_AUDIO2, 14, 2, lr_txt); | 343 | WM8900_REG_AUDIO2, 14, lr_txt); |
| 344 | 344 | ||
| 345 | static const char *sidetone_txt[] = { | 345 | static const char *sidetone_txt[] = { |
| 346 | "Disabled", "Left ADC", "Right ADC" | 346 | "Disabled", "Left ADC", "Right ADC" |
| 347 | }; | 347 | }; |
| 348 | 348 | ||
| 349 | static const struct soc_enum dacl_sidetone = | 349 | static SOC_ENUM_SINGLE_DECL(dacl_sidetone, |
| 350 | SOC_ENUM_SINGLE(WM8900_REG_SIDETONE, 2, 3, sidetone_txt); | 350 | WM8900_REG_SIDETONE, 2, sidetone_txt); |
| 351 | 351 | ||
| 352 | static const struct soc_enum dacr_sidetone = | 352 | static SOC_ENUM_SINGLE_DECL(dacr_sidetone, |
| 353 | SOC_ENUM_SINGLE(WM8900_REG_SIDETONE, 0, 3, sidetone_txt); | 353 | WM8900_REG_SIDETONE, 0, sidetone_txt); |
| 354 | 354 | ||
| 355 | static const struct snd_kcontrol_new wm8900_snd_controls[] = { | 355 | static const struct snd_kcontrol_new wm8900_snd_controls[] = { |
| 356 | SOC_ENUM("Mic Bias Level", mic_bias_level), | 356 | SOC_ENUM("Mic Bias Level", mic_bias_level), |
| @@ -496,8 +496,8 @@ SOC_DAPM_SINGLE("RINPUT3 Switch", WM8900_REG_INCTL, 0, 1, 0), | |||
| 496 | 496 | ||
| 497 | static const char *wm8900_lp_mux[] = { "Disabled", "Enabled" }; | 497 | static const char *wm8900_lp_mux[] = { "Disabled", "Enabled" }; |
| 498 | 498 | ||
| 499 | static const struct soc_enum wm8900_lineout2_lp_mux = | 499 | static SOC_ENUM_SINGLE_DECL(wm8900_lineout2_lp_mux, |
| 500 | SOC_ENUM_SINGLE(WM8900_REG_LOUTMIXCTL1, 1, 2, wm8900_lp_mux); | 500 | WM8900_REG_LOUTMIXCTL1, 1, wm8900_lp_mux); |
| 501 | 501 | ||
| 502 | static const struct snd_kcontrol_new wm8900_lineout2_lp = | 502 | static const struct snd_kcontrol_new wm8900_lineout2_lp = |
| 503 | SOC_DAPM_ENUM("Route", wm8900_lineout2_lp_mux); | 503 | SOC_DAPM_ENUM("Route", wm8900_lineout2_lp_mux); |
diff --git a/sound/soc/codecs/wm8958-dsp2.c b/sound/soc/codecs/wm8958-dsp2.c index b7488f190d2b..d4248e00160e 100644 --- a/sound/soc/codecs/wm8958-dsp2.c +++ b/sound/soc/codecs/wm8958-dsp2.c | |||
| @@ -153,7 +153,7 @@ static int wm8958_dsp2_fw(struct snd_soc_codec *codec, const char *name, | |||
| 153 | 153 | ||
| 154 | data32 &= 0xffffff; | 154 | data32 &= 0xffffff; |
| 155 | 155 | ||
| 156 | wm8994_bulk_write(codec->control_data, | 156 | wm8994_bulk_write(wm8994->wm8994, |
| 157 | data32 & 0xffffff, | 157 | data32 & 0xffffff, |
| 158 | block_len / 2, | 158 | block_len / 2, |
| 159 | (void *)(data + 8)); | 159 | (void *)(data + 8)); |
diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c index b9be9cbc4603..adb72063d44e 100644 --- a/sound/soc/codecs/wm8994.c +++ b/sound/soc/codecs/wm8994.c | |||
| @@ -265,21 +265,21 @@ static const char *sidetone_hpf_text[] = { | |||
| 265 | "2.7kHz", "1.35kHz", "675Hz", "370Hz", "180Hz", "90Hz", "45Hz" | 265 | "2.7kHz", "1.35kHz", "675Hz", "370Hz", "180Hz", "90Hz", "45Hz" |
| 266 | }; | 266 | }; |
| 267 | 267 | ||
| 268 | static const struct soc_enum sidetone_hpf = | 268 | static SOC_ENUM_SINGLE_DECL(sidetone_hpf, |
| 269 | SOC_ENUM_SINGLE(WM8994_SIDETONE, 7, 7, sidetone_hpf_text); | 269 | WM8994_SIDETONE, 7, sidetone_hpf_text); |
| 270 | 270 | ||
| 271 | static const char *adc_hpf_text[] = { | 271 | static const char *adc_hpf_text[] = { |
| 272 | "HiFi", "Voice 1", "Voice 2", "Voice 3" | 272 | "HiFi", "Voice 1", "Voice 2", "Voice 3" |
| 273 | }; | 273 | }; |
| 274 | 274 | ||
| 275 | static const struct soc_enum aif1adc1_hpf = | 275 | static SOC_ENUM_SINGLE_DECL(aif1adc1_hpf, |
| 276 | SOC_ENUM_SINGLE(WM8994_AIF1_ADC1_FILTERS, 13, 4, adc_hpf_text); | 276 | WM8994_AIF1_ADC1_FILTERS, 13, adc_hpf_text); |
| 277 | 277 | ||
| 278 | static const struct soc_enum aif1adc2_hpf = | 278 | static SOC_ENUM_SINGLE_DECL(aif1adc2_hpf, |
| 279 | SOC_ENUM_SINGLE(WM8994_AIF1_ADC2_FILTERS, 13, 4, adc_hpf_text); | 279 | WM8994_AIF1_ADC2_FILTERS, 13, adc_hpf_text); |
| 280 | 280 | ||
| 281 | static const struct soc_enum aif2adc_hpf = | 281 | static SOC_ENUM_SINGLE_DECL(aif2adc_hpf, |
| 282 | SOC_ENUM_SINGLE(WM8994_AIF2_ADC_FILTERS, 13, 4, adc_hpf_text); | 282 | WM8994_AIF2_ADC_FILTERS, 13, adc_hpf_text); |
| 283 | 283 | ||
| 284 | static const DECLARE_TLV_DB_SCALE(aif_tlv, 0, 600, 0); | 284 | static const DECLARE_TLV_DB_SCALE(aif_tlv, 0, 600, 0); |
| 285 | static const DECLARE_TLV_DB_SCALE(digital_tlv, -7200, 75, 1); | 285 | static const DECLARE_TLV_DB_SCALE(digital_tlv, -7200, 75, 1); |
| @@ -501,39 +501,39 @@ static const char *aif_chan_src_text[] = { | |||
| 501 | "Left", "Right" | 501 | "Left", "Right" |
| 502 | }; | 502 | }; |
| 503 | 503 | ||
| 504 | static const struct soc_enum aif1adcl_src = | 504 | static SOC_ENUM_SINGLE_DECL(aif1adcl_src, |
| 505 | SOC_ENUM_SINGLE(WM8994_AIF1_CONTROL_1, 15, 2, aif_chan_src_text); | 505 | WM8994_AIF1_CONTROL_1, 15, aif_chan_src_text); |
| 506 | 506 | ||
| 507 | static const struct soc_enum aif1adcr_src = | 507 | static SOC_ENUM_SINGLE_DECL(aif1adcr_src, |
| 508 | SOC_ENUM_SINGLE(WM8994_AIF1_CONTROL_1, 14, 2, aif_chan_src_text); | 508 | WM8994_AIF1_CONTROL_1, 14, aif_chan_src_text); |
| 509 | 509 | ||
| 510 | static const struct soc_enum aif2adcl_src = | 510 | static SOC_ENUM_SINGLE_DECL(aif2adcl_src, |
| 511 | SOC_ENUM_SINGLE(WM8994_AIF2_CONTROL_1, 15, 2, aif_chan_src_text); | 511 | WM8994_AIF2_CONTROL_1, 15, aif_chan_src_text); |
| 512 | 512 | ||
| 513 | static const struct soc_enum aif2adcr_src = | 513 | static SOC_ENUM_SINGLE_DECL(aif2adcr_src, |
| 514 | SOC_ENUM_SINGLE(WM8994_AIF2_CONTROL_1, 14, 2, aif_chan_src_text); | 514 | WM8994_AIF2_CONTROL_1, 14, aif_chan_src_text); |
| 515 | 515 | ||
| 516 | static const struct soc_enum aif1dacl_src = | 516 | static SOC_ENUM_SINGLE_DECL(aif1dacl_src, |
| 517 | SOC_ENUM_SINGLE(WM8994_AIF1_CONTROL_2, 15, 2, aif_chan_src_text); | 517 | WM8994_AIF1_CONTROL_2, 15, aif_chan_src_text); |
| 518 | 518 | ||
| 519 | static const struct soc_enum aif1dacr_src = | 519 | static SOC_ENUM_SINGLE_DECL(aif1dacr_src, |
| 520 | SOC_ENUM_SINGLE(WM8994_AIF1_CONTROL_2, 14, 2, aif_chan_src_text); | 520 | WM8994_AIF1_CONTROL_2, 14, aif_chan_src_text); |
| 521 | 521 | ||
| 522 | static const struct soc_enum aif2dacl_src = | 522 | static SOC_ENUM_SINGLE_DECL(aif2dacl_src, |
| 523 | SOC_ENUM_SINGLE(WM8994_AIF2_CONTROL_2, 15, 2, aif_chan_src_text); | 523 | WM8994_AIF2_CONTROL_2, 15, aif_chan_src_text); |
| 524 | 524 | ||
| 525 | static const struct soc_enum aif2dacr_src = | 525 | static SOC_ENUM_SINGLE_DECL(aif2dacr_src, |
| 526 | SOC_ENUM_SINGLE(WM8994_AIF2_CONTROL_2, 14, 2, aif_chan_src_text); | 526 | WM8994_AIF2_CONTROL_2, 14, aif_chan_src_text); |
| 527 | 527 | ||
| 528 | static const char *osr_text[] = { | 528 | static const char *osr_text[] = { |
| 529 | "Low Power", "High Performance", | 529 | "Low Power", "High Performance", |
| 530 | }; | 530 | }; |
| 531 | 531 | ||
| 532 | static const struct soc_enum dac_osr = | 532 | static SOC_ENUM_SINGLE_DECL(dac_osr, |
| 533 | SOC_ENUM_SINGLE(WM8994_OVERSAMPLING, 0, 2, osr_text); | 533 | WM8994_OVERSAMPLING, 0, osr_text); |
| 534 | 534 | ||
| 535 | static const struct soc_enum adc_osr = | 535 | static SOC_ENUM_SINGLE_DECL(adc_osr, |
| 536 | SOC_ENUM_SINGLE(WM8994_OVERSAMPLING, 1, 2, osr_text); | 536 | WM8994_OVERSAMPLING, 1, osr_text); |
| 537 | 537 | ||
| 538 | static const struct snd_kcontrol_new wm8994_snd_controls[] = { | 538 | static const struct snd_kcontrol_new wm8994_snd_controls[] = { |
| 539 | SOC_DOUBLE_R_TLV("AIF1ADC1 Volume", WM8994_AIF1_ADC1_LEFT_VOLUME, | 539 | SOC_DOUBLE_R_TLV("AIF1ADC1 Volume", WM8994_AIF1_ADC1_LEFT_VOLUME, |
| @@ -690,17 +690,20 @@ static const char *wm8958_ng_text[] = { | |||
| 690 | "30ms", "125ms", "250ms", "500ms", | 690 | "30ms", "125ms", "250ms", "500ms", |
| 691 | }; | 691 | }; |
| 692 | 692 | ||
| 693 | static const struct soc_enum wm8958_aif1dac1_ng_hold = | 693 | static SOC_ENUM_SINGLE_DECL(wm8958_aif1dac1_ng_hold, |
| 694 | SOC_ENUM_SINGLE(WM8958_AIF1_DAC1_NOISE_GATE, | 694 | WM8958_AIF1_DAC1_NOISE_GATE, |
| 695 | WM8958_AIF1DAC1_NG_THR_SHIFT, 4, wm8958_ng_text); | 695 | WM8958_AIF1DAC1_NG_THR_SHIFT, |
| 696 | wm8958_ng_text); | ||
| 696 | 697 | ||
| 697 | static const struct soc_enum wm8958_aif1dac2_ng_hold = | 698 | static SOC_ENUM_SINGLE_DECL(wm8958_aif1dac2_ng_hold, |
| 698 | SOC_ENUM_SINGLE(WM8958_AIF1_DAC2_NOISE_GATE, | 699 | WM8958_AIF1_DAC2_NOISE_GATE, |
| 699 | WM8958_AIF1DAC2_NG_THR_SHIFT, 4, wm8958_ng_text); | 700 | WM8958_AIF1DAC2_NG_THR_SHIFT, |
| 701 | wm8958_ng_text); | ||
| 700 | 702 | ||
| 701 | static const struct soc_enum wm8958_aif2dac_ng_hold = | 703 | static SOC_ENUM_SINGLE_DECL(wm8958_aif2dac_ng_hold, |
| 702 | SOC_ENUM_SINGLE(WM8958_AIF2_DAC_NOISE_GATE, | 704 | WM8958_AIF2_DAC_NOISE_GATE, |
| 703 | WM8958_AIF2DAC_NG_THR_SHIFT, 4, wm8958_ng_text); | 705 | WM8958_AIF2DAC_NG_THR_SHIFT, |
| 706 | wm8958_ng_text); | ||
| 704 | 707 | ||
| 705 | static const struct snd_kcontrol_new wm8958_snd_controls[] = { | 708 | static const struct snd_kcontrol_new wm8958_snd_controls[] = { |
| 706 | SOC_SINGLE_TLV("AIF3 Boost Volume", WM8958_AIF3_CONTROL_2, 10, 3, 0, aif_tlv), | 709 | SOC_SINGLE_TLV("AIF3 Boost Volume", WM8958_AIF3_CONTROL_2, 10, 3, 0, aif_tlv), |
| @@ -1341,8 +1344,8 @@ static const char *adc_mux_text[] = { | |||
| 1341 | "DMIC", | 1344 | "DMIC", |
| 1342 | }; | 1345 | }; |
| 1343 | 1346 | ||
| 1344 | static const struct soc_enum adc_enum = | 1347 | static SOC_ENUM_SINGLE_DECL(adc_enum, |
| 1345 | SOC_ENUM_SINGLE(0, 0, 2, adc_mux_text); | 1348 | 0, 0, adc_mux_text); |
| 1346 | 1349 | ||
| 1347 | static const struct snd_kcontrol_new adcl_mux = | 1350 | static const struct snd_kcontrol_new adcl_mux = |
| 1348 | SOC_DAPM_ENUM_VIRT("ADCL Mux", adc_enum); | 1351 | SOC_DAPM_ENUM_VIRT("ADCL Mux", adc_enum); |
| @@ -1478,14 +1481,14 @@ static const char *sidetone_text[] = { | |||
| 1478 | "ADC/DMIC1", "DMIC2", | 1481 | "ADC/DMIC1", "DMIC2", |
| 1479 | }; | 1482 | }; |
| 1480 | 1483 | ||
| 1481 | static const struct soc_enum sidetone1_enum = | 1484 | static SOC_ENUM_SINGLE_DECL(sidetone1_enum, |
| 1482 | SOC_ENUM_SINGLE(WM8994_SIDETONE, 0, 2, sidetone_text); | 1485 | WM8994_SIDETONE, 0, sidetone_text); |
| 1483 | 1486 | ||
| 1484 | static const struct snd_kcontrol_new sidetone1_mux = | 1487 | static const struct snd_kcontrol_new sidetone1_mux = |
| 1485 | SOC_DAPM_ENUM("Left Sidetone Mux", sidetone1_enum); | 1488 | SOC_DAPM_ENUM("Left Sidetone Mux", sidetone1_enum); |
| 1486 | 1489 | ||
| 1487 | static const struct soc_enum sidetone2_enum = | 1490 | static SOC_ENUM_SINGLE_DECL(sidetone2_enum, |
| 1488 | SOC_ENUM_SINGLE(WM8994_SIDETONE, 1, 2, sidetone_text); | 1491 | WM8994_SIDETONE, 1, sidetone_text); |
| 1489 | 1492 | ||
| 1490 | static const struct snd_kcontrol_new sidetone2_mux = | 1493 | static const struct snd_kcontrol_new sidetone2_mux = |
| 1491 | SOC_DAPM_ENUM("Right Sidetone Mux", sidetone2_enum); | 1494 | SOC_DAPM_ENUM("Right Sidetone Mux", sidetone2_enum); |
| @@ -1498,22 +1501,24 @@ static const char *loopback_text[] = { | |||
| 1498 | "None", "ADCDAT", | 1501 | "None", "ADCDAT", |
| 1499 | }; | 1502 | }; |
| 1500 | 1503 | ||
| 1501 | static const struct soc_enum aif1_loopback_enum = | 1504 | static SOC_ENUM_SINGLE_DECL(aif1_loopback_enum, |
| 1502 | SOC_ENUM_SINGLE(WM8994_AIF1_CONTROL_2, WM8994_AIF1_LOOPBACK_SHIFT, 2, | 1505 | WM8994_AIF1_CONTROL_2, |
| 1503 | loopback_text); | 1506 | WM8994_AIF1_LOOPBACK_SHIFT, |
| 1507 | loopback_text); | ||
| 1504 | 1508 | ||
| 1505 | static const struct snd_kcontrol_new aif1_loopback = | 1509 | static const struct snd_kcontrol_new aif1_loopback = |
| 1506 | SOC_DAPM_ENUM("AIF1 Loopback", aif1_loopback_enum); | 1510 | SOC_DAPM_ENUM("AIF1 Loopback", aif1_loopback_enum); |
| 1507 | 1511 | ||
| 1508 | static const struct soc_enum aif2_loopback_enum = | 1512 | static SOC_ENUM_SINGLE_DECL(aif2_loopback_enum, |
| 1509 | SOC_ENUM_SINGLE(WM8994_AIF2_CONTROL_2, WM8994_AIF2_LOOPBACK_SHIFT, 2, | 1513 | WM8994_AIF2_CONTROL_2, |
| 1510 | loopback_text); | 1514 | WM8994_AIF2_LOOPBACK_SHIFT, |
| 1515 | loopback_text); | ||
| 1511 | 1516 | ||
| 1512 | static const struct snd_kcontrol_new aif2_loopback = | 1517 | static const struct snd_kcontrol_new aif2_loopback = |
| 1513 | SOC_DAPM_ENUM("AIF2 Loopback", aif2_loopback_enum); | 1518 | SOC_DAPM_ENUM("AIF2 Loopback", aif2_loopback_enum); |
| 1514 | 1519 | ||
| 1515 | static const struct soc_enum aif1dac_enum = | 1520 | static SOC_ENUM_SINGLE_DECL(aif1dac_enum, |
| 1516 | SOC_ENUM_SINGLE(WM8994_POWER_MANAGEMENT_6, 0, 2, aif1dac_text); | 1521 | WM8994_POWER_MANAGEMENT_6, 0, aif1dac_text); |
| 1517 | 1522 | ||
| 1518 | static const struct snd_kcontrol_new aif1dac_mux = | 1523 | static const struct snd_kcontrol_new aif1dac_mux = |
| 1519 | SOC_DAPM_ENUM("AIF1DAC Mux", aif1dac_enum); | 1524 | SOC_DAPM_ENUM("AIF1DAC Mux", aif1dac_enum); |
| @@ -1522,8 +1527,8 @@ static const char *aif2dac_text[] = { | |||
| 1522 | "AIF2DACDAT", "AIF3DACDAT", | 1527 | "AIF2DACDAT", "AIF3DACDAT", |
| 1523 | }; | 1528 | }; |
| 1524 | 1529 | ||
| 1525 | static const struct soc_enum aif2dac_enum = | 1530 | static SOC_ENUM_SINGLE_DECL(aif2dac_enum, |
| 1526 | SOC_ENUM_SINGLE(WM8994_POWER_MANAGEMENT_6, 1, 2, aif2dac_text); | 1531 | WM8994_POWER_MANAGEMENT_6, 1, aif2dac_text); |
| 1527 | 1532 | ||
| 1528 | static const struct snd_kcontrol_new aif2dac_mux = | 1533 | static const struct snd_kcontrol_new aif2dac_mux = |
| 1529 | SOC_DAPM_ENUM("AIF2DAC Mux", aif2dac_enum); | 1534 | SOC_DAPM_ENUM("AIF2DAC Mux", aif2dac_enum); |
| @@ -1532,8 +1537,8 @@ static const char *aif2adc_text[] = { | |||
| 1532 | "AIF2ADCDAT", "AIF3DACDAT", | 1537 | "AIF2ADCDAT", "AIF3DACDAT", |
| 1533 | }; | 1538 | }; |
| 1534 | 1539 | ||
| 1535 | static const struct soc_enum aif2adc_enum = | 1540 | static SOC_ENUM_SINGLE_DECL(aif2adc_enum, |
| 1536 | SOC_ENUM_SINGLE(WM8994_POWER_MANAGEMENT_6, 2, 2, aif2adc_text); | 1541 | WM8994_POWER_MANAGEMENT_6, 2, aif2adc_text); |
| 1537 | 1542 | ||
| 1538 | static const struct snd_kcontrol_new aif2adc_mux = | 1543 | static const struct snd_kcontrol_new aif2adc_mux = |
| 1539 | SOC_DAPM_ENUM("AIF2ADC Mux", aif2adc_enum); | 1544 | SOC_DAPM_ENUM("AIF2ADC Mux", aif2adc_enum); |
| @@ -1542,14 +1547,14 @@ static const char *aif3adc_text[] = { | |||
| 1542 | "AIF1ADCDAT", "AIF2ADCDAT", "AIF2DACDAT", "Mono PCM", | 1547 | "AIF1ADCDAT", "AIF2ADCDAT", "AIF2DACDAT", "Mono PCM", |
| 1543 | }; | 1548 | }; |
| 1544 | 1549 | ||
| 1545 | static const struct soc_enum wm8994_aif3adc_enum = | 1550 | static SOC_ENUM_SINGLE_DECL(wm8994_aif3adc_enum, |
| 1546 | SOC_ENUM_SINGLE(WM8994_POWER_MANAGEMENT_6, 3, 3, aif3adc_text); | 1551 | WM8994_POWER_MANAGEMENT_6, 3, aif3adc_text); |
| 1547 | 1552 | ||
| 1548 | static const struct snd_kcontrol_new wm8994_aif3adc_mux = | 1553 | static const struct snd_kcontrol_new wm8994_aif3adc_mux = |
| 1549 | SOC_DAPM_ENUM("AIF3ADC Mux", wm8994_aif3adc_enum); | 1554 | SOC_DAPM_ENUM("AIF3ADC Mux", wm8994_aif3adc_enum); |
| 1550 | 1555 | ||
| 1551 | static const struct soc_enum wm8958_aif3adc_enum = | 1556 | static SOC_ENUM_SINGLE_DECL(wm8958_aif3adc_enum, |
| 1552 | SOC_ENUM_SINGLE(WM8994_POWER_MANAGEMENT_6, 3, 4, aif3adc_text); | 1557 | WM8994_POWER_MANAGEMENT_6, 3, aif3adc_text); |
| 1553 | 1558 | ||
| 1554 | static const struct snd_kcontrol_new wm8958_aif3adc_mux = | 1559 | static const struct snd_kcontrol_new wm8958_aif3adc_mux = |
| 1555 | SOC_DAPM_ENUM("AIF3ADC Mux", wm8958_aif3adc_enum); | 1560 | SOC_DAPM_ENUM("AIF3ADC Mux", wm8958_aif3adc_enum); |
| @@ -1558,8 +1563,8 @@ static const char *mono_pcm_out_text[] = { | |||
| 1558 | "None", "AIF2ADCL", "AIF2ADCR", | 1563 | "None", "AIF2ADCL", "AIF2ADCR", |
| 1559 | }; | 1564 | }; |
| 1560 | 1565 | ||
| 1561 | static const struct soc_enum mono_pcm_out_enum = | 1566 | static SOC_ENUM_SINGLE_DECL(mono_pcm_out_enum, |
| 1562 | SOC_ENUM_SINGLE(WM8994_POWER_MANAGEMENT_6, 9, 3, mono_pcm_out_text); | 1567 | WM8994_POWER_MANAGEMENT_6, 9, mono_pcm_out_text); |
| 1563 | 1568 | ||
| 1564 | static const struct snd_kcontrol_new mono_pcm_out_mux = | 1569 | static const struct snd_kcontrol_new mono_pcm_out_mux = |
| 1565 | SOC_DAPM_ENUM("Mono PCM Out Mux", mono_pcm_out_enum); | 1570 | SOC_DAPM_ENUM("Mono PCM Out Mux", mono_pcm_out_enum); |
| @@ -1569,14 +1574,14 @@ static const char *aif2dac_src_text[] = { | |||
| 1569 | }; | 1574 | }; |
| 1570 | 1575 | ||
| 1571 | /* Note that these two control shouldn't be simultaneously switched to AIF3 */ | 1576 | /* Note that these two control shouldn't be simultaneously switched to AIF3 */ |
| 1572 | static const struct soc_enum aif2dacl_src_enum = | 1577 | static SOC_ENUM_SINGLE_DECL(aif2dacl_src_enum, |
| 1573 | SOC_ENUM_SINGLE(WM8994_POWER_MANAGEMENT_6, 7, 2, aif2dac_src_text); | 1578 | WM8994_POWER_MANAGEMENT_6, 7, aif2dac_src_text); |
| 1574 | 1579 | ||
| 1575 | static const struct snd_kcontrol_new aif2dacl_src_mux = | 1580 | static const struct snd_kcontrol_new aif2dacl_src_mux = |
| 1576 | SOC_DAPM_ENUM("AIF2DACL Mux", aif2dacl_src_enum); | 1581 | SOC_DAPM_ENUM("AIF2DACL Mux", aif2dacl_src_enum); |
| 1577 | 1582 | ||
| 1578 | static const struct soc_enum aif2dacr_src_enum = | 1583 | static SOC_ENUM_SINGLE_DECL(aif2dacr_src_enum, |
| 1579 | SOC_ENUM_SINGLE(WM8994_POWER_MANAGEMENT_6, 8, 2, aif2dac_src_text); | 1584 | WM8994_POWER_MANAGEMENT_6, 8, aif2dac_src_text); |
| 1580 | 1585 | ||
| 1581 | static const struct snd_kcontrol_new aif2dacr_src_mux = | 1586 | static const struct snd_kcontrol_new aif2dacr_src_mux = |
| 1582 | SOC_DAPM_ENUM("AIF2DACR Mux", aif2dacr_src_enum); | 1587 | SOC_DAPM_ENUM("AIF2DACR Mux", aif2dacr_src_enum); |
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c index dc8ff13187f7..b9dc6acbba8c 100644 --- a/sound/soc/soc-dapm.c +++ b/sound/soc/soc-dapm.c | |||
| @@ -1218,7 +1218,7 @@ int dapm_regulator_event(struct snd_soc_dapm_widget *w, | |||
| 1218 | ret = regulator_allow_bypass(w->regulator, false); | 1218 | ret = regulator_allow_bypass(w->regulator, false); |
| 1219 | if (ret != 0) | 1219 | if (ret != 0) |
| 1220 | dev_warn(w->dapm->dev, | 1220 | dev_warn(w->dapm->dev, |
| 1221 | "ASoC: Failed to bypass %s: %d\n", | 1221 | "ASoC: Failed to unbypass %s: %d\n", |
| 1222 | w->name, ret); | 1222 | w->name, ret); |
| 1223 | } | 1223 | } |
| 1224 | 1224 | ||
| @@ -1228,7 +1228,7 @@ int dapm_regulator_event(struct snd_soc_dapm_widget *w, | |||
| 1228 | ret = regulator_allow_bypass(w->regulator, true); | 1228 | ret = regulator_allow_bypass(w->regulator, true); |
| 1229 | if (ret != 0) | 1229 | if (ret != 0) |
| 1230 | dev_warn(w->dapm->dev, | 1230 | dev_warn(w->dapm->dev, |
| 1231 | "ASoC: Failed to unbypass %s: %d\n", | 1231 | "ASoC: Failed to bypass %s: %d\n", |
| 1232 | w->name, ret); | 1232 | w->name, ret); |
| 1233 | } | 1233 | } |
| 1234 | 1234 | ||
| @@ -3210,15 +3210,11 @@ int snd_soc_dapm_put_pin_switch(struct snd_kcontrol *kcontrol, | |||
| 3210 | struct snd_soc_card *card = snd_kcontrol_chip(kcontrol); | 3210 | struct snd_soc_card *card = snd_kcontrol_chip(kcontrol); |
| 3211 | const char *pin = (const char *)kcontrol->private_value; | 3211 | const char *pin = (const char *)kcontrol->private_value; |
| 3212 | 3212 | ||
| 3213 | mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); | ||
| 3214 | |||
| 3215 | if (ucontrol->value.integer.value[0]) | 3213 | if (ucontrol->value.integer.value[0]) |
| 3216 | snd_soc_dapm_enable_pin(&card->dapm, pin); | 3214 | snd_soc_dapm_enable_pin(&card->dapm, pin); |
| 3217 | else | 3215 | else |
| 3218 | snd_soc_dapm_disable_pin(&card->dapm, pin); | 3216 | snd_soc_dapm_disable_pin(&card->dapm, pin); |
| 3219 | 3217 | ||
| 3220 | mutex_unlock(&card->dapm_mutex); | ||
| 3221 | |||
| 3222 | snd_soc_dapm_sync(&card->dapm); | 3218 | snd_soc_dapm_sync(&card->dapm); |
| 3223 | return 0; | 3219 | return 0; |
| 3224 | } | 3220 | } |
| @@ -3248,7 +3244,7 @@ snd_soc_dapm_new_control(struct snd_soc_dapm_context *dapm, | |||
| 3248 | ret = regulator_allow_bypass(w->regulator, true); | 3244 | ret = regulator_allow_bypass(w->regulator, true); |
| 3249 | if (ret != 0) | 3245 | if (ret != 0) |
| 3250 | dev_warn(w->dapm->dev, | 3246 | dev_warn(w->dapm->dev, |
| 3251 | "ASoC: Failed to unbypass %s: %d\n", | 3247 | "ASoC: Failed to bypass %s: %d\n", |
| 3252 | w->name, ret); | 3248 | w->name, ret); |
| 3253 | } | 3249 | } |
| 3254 | break; | 3250 | break; |
| @@ -3767,23 +3763,52 @@ void snd_soc_dapm_stream_event(struct snd_soc_pcm_runtime *rtd, int stream, | |||
| 3767 | } | 3763 | } |
| 3768 | 3764 | ||
| 3769 | /** | 3765 | /** |
| 3766 | * snd_soc_dapm_enable_pin_unlocked - enable pin. | ||
| 3767 | * @dapm: DAPM context | ||
| 3768 | * @pin: pin name | ||
| 3769 | * | ||
| 3770 | * Enables input/output pin and its parents or children widgets iff there is | ||
| 3771 | * a valid audio route and active audio stream. | ||
| 3772 | * | ||
| 3773 | * Requires external locking. | ||
| 3774 | * | ||
| 3775 | * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to | ||
| 3776 | * do any widget power switching. | ||
| 3777 | */ | ||
| 3778 | int snd_soc_dapm_enable_pin_unlocked(struct snd_soc_dapm_context *dapm, | ||
| 3779 | const char *pin) | ||
| 3780 | { | ||
| 3781 | return snd_soc_dapm_set_pin(dapm, pin, 1); | ||
| 3782 | } | ||
| 3783 | EXPORT_SYMBOL_GPL(snd_soc_dapm_enable_pin_unlocked); | ||
| 3784 | |||
| 3785 | /** | ||
| 3770 | * snd_soc_dapm_enable_pin - enable pin. | 3786 | * snd_soc_dapm_enable_pin - enable pin. |
| 3771 | * @dapm: DAPM context | 3787 | * @dapm: DAPM context |
| 3772 | * @pin: pin name | 3788 | * @pin: pin name |
| 3773 | * | 3789 | * |
| 3774 | * Enables input/output pin and its parents or children widgets iff there is | 3790 | * Enables input/output pin and its parents or children widgets iff there is |
| 3775 | * a valid audio route and active audio stream. | 3791 | * a valid audio route and active audio stream. |
| 3792 | * | ||
| 3776 | * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to | 3793 | * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to |
| 3777 | * do any widget power switching. | 3794 | * do any widget power switching. |
| 3778 | */ | 3795 | */ |
| 3779 | int snd_soc_dapm_enable_pin(struct snd_soc_dapm_context *dapm, const char *pin) | 3796 | int snd_soc_dapm_enable_pin(struct snd_soc_dapm_context *dapm, const char *pin) |
| 3780 | { | 3797 | { |
| 3781 | return snd_soc_dapm_set_pin(dapm, pin, 1); | 3798 | int ret; |
| 3799 | |||
| 3800 | mutex_lock_nested(&dapm->card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); | ||
| 3801 | |||
| 3802 | ret = snd_soc_dapm_set_pin(dapm, pin, 1); | ||
| 3803 | |||
| 3804 | mutex_unlock(&dapm->card->dapm_mutex); | ||
| 3805 | |||
| 3806 | return ret; | ||
| 3782 | } | 3807 | } |
| 3783 | EXPORT_SYMBOL_GPL(snd_soc_dapm_enable_pin); | 3808 | EXPORT_SYMBOL_GPL(snd_soc_dapm_enable_pin); |
| 3784 | 3809 | ||
| 3785 | /** | 3810 | /** |
| 3786 | * snd_soc_dapm_force_enable_pin - force a pin to be enabled | 3811 | * snd_soc_dapm_force_enable_pin_unlocked - force a pin to be enabled |
| 3787 | * @dapm: DAPM context | 3812 | * @dapm: DAPM context |
| 3788 | * @pin: pin name | 3813 | * @pin: pin name |
| 3789 | * | 3814 | * |
| @@ -3791,11 +3816,13 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_enable_pin); | |||
| 3791 | * intended for use with microphone bias supplies used in microphone | 3816 | * intended for use with microphone bias supplies used in microphone |
| 3792 | * jack detection. | 3817 | * jack detection. |
| 3793 | * | 3818 | * |
| 3819 | * Requires external locking. | ||
| 3820 | * | ||
| 3794 | * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to | 3821 | * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to |
| 3795 | * do any widget power switching. | 3822 | * do any widget power switching. |
| 3796 | */ | 3823 | */ |
| 3797 | int snd_soc_dapm_force_enable_pin(struct snd_soc_dapm_context *dapm, | 3824 | int snd_soc_dapm_force_enable_pin_unlocked(struct snd_soc_dapm_context *dapm, |
| 3798 | const char *pin) | 3825 | const char *pin) |
| 3799 | { | 3826 | { |
| 3800 | struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, true); | 3827 | struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, true); |
| 3801 | 3828 | ||
| @@ -3811,25 +3838,103 @@ int snd_soc_dapm_force_enable_pin(struct snd_soc_dapm_context *dapm, | |||
| 3811 | 3838 | ||
| 3812 | return 0; | 3839 | return 0; |
| 3813 | } | 3840 | } |
| 3841 | EXPORT_SYMBOL_GPL(snd_soc_dapm_force_enable_pin_unlocked); | ||
| 3842 | |||
| 3843 | /** | ||
| 3844 | * snd_soc_dapm_force_enable_pin - force a pin to be enabled | ||
| 3845 | * @dapm: DAPM context | ||
| 3846 | * @pin: pin name | ||
| 3847 | * | ||
| 3848 | * Enables input/output pin regardless of any other state. This is | ||
| 3849 | * intended for use with microphone bias supplies used in microphone | ||
| 3850 | * jack detection. | ||
| 3851 | * | ||
| 3852 | * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to | ||
| 3853 | * do any widget power switching. | ||
| 3854 | */ | ||
| 3855 | int snd_soc_dapm_force_enable_pin(struct snd_soc_dapm_context *dapm, | ||
| 3856 | const char *pin) | ||
| 3857 | { | ||
| 3858 | int ret; | ||
| 3859 | |||
| 3860 | mutex_lock_nested(&dapm->card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); | ||
| 3861 | |||
| 3862 | ret = snd_soc_dapm_force_enable_pin_unlocked(dapm, pin); | ||
| 3863 | |||
| 3864 | mutex_unlock(&dapm->card->dapm_mutex); | ||
| 3865 | |||
| 3866 | return ret; | ||
| 3867 | } | ||
| 3814 | EXPORT_SYMBOL_GPL(snd_soc_dapm_force_enable_pin); | 3868 | EXPORT_SYMBOL_GPL(snd_soc_dapm_force_enable_pin); |
| 3815 | 3869 | ||
| 3816 | /** | 3870 | /** |
| 3871 | * snd_soc_dapm_disable_pin_unlocked - disable pin. | ||
| 3872 | * @dapm: DAPM context | ||
| 3873 | * @pin: pin name | ||
| 3874 | * | ||
| 3875 | * Disables input/output pin and its parents or children widgets. | ||
| 3876 | * | ||
| 3877 | * Requires external locking. | ||
| 3878 | * | ||
| 3879 | * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to | ||
| 3880 | * do any widget power switching. | ||
| 3881 | */ | ||
| 3882 | int snd_soc_dapm_disable_pin_unlocked(struct snd_soc_dapm_context *dapm, | ||
| 3883 | const char *pin) | ||
| 3884 | { | ||
| 3885 | return snd_soc_dapm_set_pin(dapm, pin, 0); | ||
| 3886 | } | ||
| 3887 | EXPORT_SYMBOL_GPL(snd_soc_dapm_disable_pin_unlocked); | ||
| 3888 | |||
| 3889 | /** | ||
| 3817 | * snd_soc_dapm_disable_pin - disable pin. | 3890 | * snd_soc_dapm_disable_pin - disable pin. |
| 3818 | * @dapm: DAPM context | 3891 | * @dapm: DAPM context |
| 3819 | * @pin: pin name | 3892 | * @pin: pin name |
| 3820 | * | 3893 | * |
| 3821 | * Disables input/output pin and its parents or children widgets. | 3894 | * Disables input/output pin and its parents or children widgets. |
| 3895 | * | ||
| 3822 | * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to | 3896 | * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to |
| 3823 | * do any widget power switching. | 3897 | * do any widget power switching. |
| 3824 | */ | 3898 | */ |
| 3825 | int snd_soc_dapm_disable_pin(struct snd_soc_dapm_context *dapm, | 3899 | int snd_soc_dapm_disable_pin(struct snd_soc_dapm_context *dapm, |
| 3826 | const char *pin) | 3900 | const char *pin) |
| 3827 | { | 3901 | { |
| 3828 | return snd_soc_dapm_set_pin(dapm, pin, 0); | 3902 | int ret; |
| 3903 | |||
| 3904 | mutex_lock_nested(&dapm->card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); | ||
| 3905 | |||
| 3906 | ret = snd_soc_dapm_set_pin(dapm, pin, 0); | ||
| 3907 | |||
| 3908 | mutex_unlock(&dapm->card->dapm_mutex); | ||
| 3909 | |||
| 3910 | return ret; | ||
| 3829 | } | 3911 | } |
| 3830 | EXPORT_SYMBOL_GPL(snd_soc_dapm_disable_pin); | 3912 | EXPORT_SYMBOL_GPL(snd_soc_dapm_disable_pin); |
| 3831 | 3913 | ||
| 3832 | /** | 3914 | /** |
| 3915 | * snd_soc_dapm_nc_pin_unlocked - permanently disable pin. | ||
| 3916 | * @dapm: DAPM context | ||
| 3917 | * @pin: pin name | ||
| 3918 | * | ||
| 3919 | * Marks the specified pin as being not connected, disabling it along | ||
| 3920 | * any parent or child widgets. At present this is identical to | ||
| 3921 | * snd_soc_dapm_disable_pin() but in future it will be extended to do | ||
| 3922 | * additional things such as disabling controls which only affect | ||
| 3923 | * paths through the pin. | ||
| 3924 | * | ||
| 3925 | * Requires external locking. | ||
| 3926 | * | ||
| 3927 | * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to | ||
| 3928 | * do any widget power switching. | ||
| 3929 | */ | ||
| 3930 | int snd_soc_dapm_nc_pin_unlocked(struct snd_soc_dapm_context *dapm, | ||
| 3931 | const char *pin) | ||
| 3932 | { | ||
| 3933 | return snd_soc_dapm_set_pin(dapm, pin, 0); | ||
| 3934 | } | ||
| 3935 | EXPORT_SYMBOL_GPL(snd_soc_dapm_nc_pin_unlocked); | ||
| 3936 | |||
| 3937 | /** | ||
| 3833 | * snd_soc_dapm_nc_pin - permanently disable pin. | 3938 | * snd_soc_dapm_nc_pin - permanently disable pin. |
| 3834 | * @dapm: DAPM context | 3939 | * @dapm: DAPM context |
| 3835 | * @pin: pin name | 3940 | * @pin: pin name |
| @@ -3845,7 +3950,15 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_disable_pin); | |||
| 3845 | */ | 3950 | */ |
| 3846 | int snd_soc_dapm_nc_pin(struct snd_soc_dapm_context *dapm, const char *pin) | 3951 | int snd_soc_dapm_nc_pin(struct snd_soc_dapm_context *dapm, const char *pin) |
| 3847 | { | 3952 | { |
| 3848 | return snd_soc_dapm_set_pin(dapm, pin, 0); | 3953 | int ret; |
| 3954 | |||
| 3955 | mutex_lock_nested(&dapm->card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); | ||
| 3956 | |||
| 3957 | ret = snd_soc_dapm_set_pin(dapm, pin, 0); | ||
| 3958 | |||
| 3959 | mutex_unlock(&dapm->card->dapm_mutex); | ||
| 3960 | |||
| 3961 | return ret; | ||
| 3849 | } | 3962 | } |
| 3850 | EXPORT_SYMBOL_GPL(snd_soc_dapm_nc_pin); | 3963 | EXPORT_SYMBOL_GPL(snd_soc_dapm_nc_pin); |
| 3851 | 3964 | ||
diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c index 44b0ba4feab3..1bed780e21d9 100644 --- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c | |||
| @@ -883,6 +883,7 @@ static void volume_control_quirks(struct usb_mixer_elem_info *cval, | |||
| 883 | } | 883 | } |
| 884 | break; | 884 | break; |
| 885 | 885 | ||
| 886 | case USB_ID(0x046d, 0x0807): /* Logitech Webcam C500 */ | ||
| 886 | case USB_ID(0x046d, 0x0808): | 887 | case USB_ID(0x046d, 0x0808): |
| 887 | case USB_ID(0x046d, 0x0809): | 888 | case USB_ID(0x046d, 0x0809): |
| 888 | case USB_ID(0x046d, 0x081b): /* HD Webcam c310 */ | 889 | case USB_ID(0x046d, 0x081b): /* HD Webcam c310 */ |
diff --git a/tools/lib/lockdep/Makefile b/tools/lib/lockdep/Makefile index da8b7aa3d351..07b0b7542511 100644 --- a/tools/lib/lockdep/Makefile +++ b/tools/lib/lockdep/Makefile | |||
| @@ -87,8 +87,8 @@ endif # BUILD_SRC | |||
| 87 | # We process the rest of the Makefile if this is the final invocation of make | 87 | # We process the rest of the Makefile if this is the final invocation of make |
| 88 | ifeq ($(skip-makefile),) | 88 | ifeq ($(skip-makefile),) |
| 89 | 89 | ||
| 90 | srctree := $(if $(BUILD_SRC),$(BUILD_SRC),$(CURDIR)) | 90 | srctree := $(realpath $(if $(BUILD_SRC),$(BUILD_SRC),$(CURDIR))) |
| 91 | objtree := $(CURDIR) | 91 | objtree := $(realpath $(CURDIR)) |
| 92 | src := $(srctree) | 92 | src := $(srctree) |
| 93 | obj := $(objtree) | 93 | obj := $(objtree) |
| 94 | 94 | ||
| @@ -112,7 +112,7 @@ export Q VERBOSE | |||
| 112 | 112 | ||
| 113 | LIBLOCKDEP_VERSION = $(LL_VERSION).$(LL_PATCHLEVEL).$(LL_EXTRAVERSION) | 113 | LIBLOCKDEP_VERSION = $(LL_VERSION).$(LL_PATCHLEVEL).$(LL_EXTRAVERSION) |
| 114 | 114 | ||
| 115 | INCLUDES = -I. -I/usr/local/include -I./uinclude $(CONFIG_INCLUDES) | 115 | INCLUDES = -I. -I/usr/local/include -I./uinclude -I./include $(CONFIG_INCLUDES) |
| 116 | 116 | ||
| 117 | # Set compile option CFLAGS if not set elsewhere | 117 | # Set compile option CFLAGS if not set elsewhere |
| 118 | CFLAGS ?= -g -DCONFIG_LOCKDEP -DCONFIG_STACKTRACE -DCONFIG_PROVE_LOCKING -DBITS_PER_LONG=__WORDSIZE -DLIBLOCKDEP_VERSION='"$(LIBLOCKDEP_VERSION)"' -rdynamic -O0 -g | 118 | 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 f8465a811aa5..23bd69cb5ade 100644 --- a/tools/lib/lockdep/preload.c +++ b/tools/lib/lockdep/preload.c | |||
| @@ -418,7 +418,7 @@ int pthread_rwlock_unlock(pthread_rwlock_t *rwlock) | |||
| 418 | 418 | ||
| 419 | __attribute__((constructor)) static void init_preload(void) | 419 | __attribute__((constructor)) static void init_preload(void) |
| 420 | { | 420 | { |
| 421 | if (__init_state != done) | 421 | if (__init_state == done) |
| 422 | return; | 422 | return; |
| 423 | 423 | ||
| 424 | #ifndef __GLIBC__ | 424 | #ifndef __GLIBC__ |
diff --git a/tools/lib/lockdep/run_tests.sh b/tools/lib/lockdep/run_tests.sh index 5334ad9d39b7..5334ad9d39b7 100644..100755 --- a/tools/lib/lockdep/run_tests.sh +++ b/tools/lib/lockdep/run_tests.sh | |||
diff --git a/tools/lib/lockdep/uinclude/asm/hash.h b/tools/lib/lockdep/uinclude/asm/hash.h new file mode 100644 index 000000000000..d82b170bb216 --- /dev/null +++ b/tools/lib/lockdep/uinclude/asm/hash.h | |||
| @@ -0,0 +1,6 @@ | |||
| 1 | #ifndef __ASM_GENERIC_HASH_H | ||
| 2 | #define __ASM_GENERIC_HASH_H | ||
| 3 | |||
| 4 | /* Stub */ | ||
| 5 | |||
| 6 | #endif /* __ASM_GENERIC_HASH_H */ | ||
diff --git a/tools/lib/lockdep/uinclude/linux/rcu.h b/tools/lib/lockdep/uinclude/linux/rcu.h index 4c99fcb5da27..042ee8e463c9 100644 --- a/tools/lib/lockdep/uinclude/linux/rcu.h +++ b/tools/lib/lockdep/uinclude/linux/rcu.h | |||
| @@ -13,4 +13,9 @@ static inline int rcu_is_cpu_idle(void) | |||
| 13 | return 1; | 13 | return 1; |
| 14 | } | 14 | } |
| 15 | 15 | ||
| 16 | static inline bool rcu_is_watching(void) | ||
| 17 | { | ||
| 18 | return false; | ||
| 19 | } | ||
| 20 | |||
| 16 | #endif | 21 | #endif |
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index 3c53ec268fbc..02f985f3a396 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c | |||
| @@ -113,14 +113,16 @@ static int report__add_mem_hist_entry(struct perf_tool *tool, struct addr_locati | |||
| 113 | if (!he) | 113 | if (!he) |
| 114 | return -ENOMEM; | 114 | return -ENOMEM; |
| 115 | 115 | ||
| 116 | err = hist_entry__inc_addr_samples(he, evsel->idx, al->addr); | 116 | if (ui__has_annotation()) { |
| 117 | if (err) | 117 | err = hist_entry__inc_addr_samples(he, evsel->idx, al->addr); |
| 118 | goto out; | 118 | if (err) |
| 119 | goto out; | ||
| 119 | 120 | ||
| 120 | mx = he->mem_info; | 121 | mx = he->mem_info; |
| 121 | err = addr_map_symbol__inc_samples(&mx->daddr, evsel->idx); | 122 | err = addr_map_symbol__inc_samples(&mx->daddr, evsel->idx); |
| 122 | if (err) | 123 | if (err) |
| 123 | goto out; | 124 | goto out; |
| 125 | } | ||
| 124 | 126 | ||
| 125 | evsel->hists.stats.total_period += cost; | 127 | evsel->hists.stats.total_period += cost; |
| 126 | hists__inc_nr_events(&evsel->hists, PERF_RECORD_SAMPLE); | 128 | hists__inc_nr_events(&evsel->hists, PERF_RECORD_SAMPLE); |
| @@ -164,14 +166,18 @@ static int report__add_branch_hist_entry(struct perf_tool *tool, struct addr_loc | |||
| 164 | he = __hists__add_entry(&evsel->hists, al, parent, &bi[i], NULL, | 166 | he = __hists__add_entry(&evsel->hists, al, parent, &bi[i], NULL, |
| 165 | 1, 1, 0); | 167 | 1, 1, 0); |
| 166 | if (he) { | 168 | if (he) { |
| 167 | bx = he->branch_info; | 169 | if (ui__has_annotation()) { |
| 168 | err = addr_map_symbol__inc_samples(&bx->from, evsel->idx); | 170 | bx = he->branch_info; |
| 169 | if (err) | 171 | err = addr_map_symbol__inc_samples(&bx->from, |
| 170 | goto out; | 172 | evsel->idx); |
| 171 | 173 | if (err) | |
| 172 | err = addr_map_symbol__inc_samples(&bx->to, evsel->idx); | 174 | goto out; |
| 173 | if (err) | 175 | |
| 174 | goto out; | 176 | err = addr_map_symbol__inc_samples(&bx->to, |
| 177 | evsel->idx); | ||
| 178 | if (err) | ||
| 179 | goto out; | ||
| 180 | } | ||
| 175 | 181 | ||
| 176 | evsel->hists.stats.total_period += 1; | 182 | evsel->hists.stats.total_period += 1; |
| 177 | hists__inc_nr_events(&evsel->hists, PERF_RECORD_SAMPLE); | 183 | hists__inc_nr_events(&evsel->hists, PERF_RECORD_SAMPLE); |
| @@ -205,7 +211,9 @@ static int report__add_hist_entry(struct perf_tool *tool, struct perf_evsel *evs | |||
| 205 | if (err) | 211 | if (err) |
| 206 | goto out; | 212 | goto out; |
| 207 | 213 | ||
| 208 | err = hist_entry__inc_addr_samples(he, evsel->idx, al->addr); | 214 | if (ui__has_annotation()) |
| 215 | err = hist_entry__inc_addr_samples(he, evsel->idx, al->addr); | ||
| 216 | |||
| 209 | evsel->hists.stats.total_period += sample->period; | 217 | evsel->hists.stats.total_period += sample->period; |
| 210 | hists__inc_nr_events(&evsel->hists, PERF_RECORD_SAMPLE); | 218 | hists__inc_nr_events(&evsel->hists, PERF_RECORD_SAMPLE); |
| 211 | out: | 219 | out: |
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c index 76cd510d34d0..5f989a7d8bc2 100644 --- a/tools/perf/builtin-top.c +++ b/tools/perf/builtin-top.c | |||
| @@ -176,7 +176,7 @@ static void perf_top__record_precise_ip(struct perf_top *top, | |||
| 176 | { | 176 | { |
| 177 | struct annotation *notes; | 177 | struct annotation *notes; |
| 178 | struct symbol *sym; | 178 | struct symbol *sym; |
| 179 | int err; | 179 | int err = 0; |
| 180 | 180 | ||
| 181 | if (he == NULL || he->ms.sym == NULL || | 181 | if (he == NULL || he->ms.sym == NULL || |
| 182 | ((top->sym_filter_entry == NULL || | 182 | ((top->sym_filter_entry == NULL || |
| @@ -190,7 +190,9 @@ static void perf_top__record_precise_ip(struct perf_top *top, | |||
| 190 | return; | 190 | return; |
| 191 | 191 | ||
| 192 | ip = he->ms.map->map_ip(he->ms.map, ip); | 192 | ip = he->ms.map->map_ip(he->ms.map, ip); |
| 193 | err = hist_entry__inc_addr_samples(he, counter, ip); | 193 | |
| 194 | if (ui__has_annotation()) | ||
| 195 | err = hist_entry__inc_addr_samples(he, counter, ip); | ||
| 194 | 196 | ||
| 195 | pthread_mutex_unlock(¬es->lock); | 197 | pthread_mutex_unlock(¬es->lock); |
| 196 | 198 | ||
diff --git a/tools/perf/config/Makefile b/tools/perf/config/Makefile index c48d44958172..0331ea2701a3 100644 --- a/tools/perf/config/Makefile +++ b/tools/perf/config/Makefile | |||
| @@ -478,7 +478,7 @@ else | |||
| 478 | endif | 478 | endif |
| 479 | 479 | ||
| 480 | ifeq ($(feature-libbfd), 1) | 480 | ifeq ($(feature-libbfd), 1) |
| 481 | EXTLIBS += -lbfd | 481 | EXTLIBS += -lbfd -lz -liberty |
| 482 | endif | 482 | endif |
| 483 | 483 | ||
| 484 | ifdef NO_DEMANGLE | 484 | ifdef NO_DEMANGLE |
diff --git a/tools/perf/config/feature-checks/Makefile b/tools/perf/config/feature-checks/Makefile index 12e551346fa6..523b7bc10553 100644 --- a/tools/perf/config/feature-checks/Makefile +++ b/tools/perf/config/feature-checks/Makefile | |||
| @@ -121,7 +121,7 @@ test-libpython-version.bin: | |||
| 121 | $(BUILD) $(FLAGS_PYTHON_EMBED) | 121 | $(BUILD) $(FLAGS_PYTHON_EMBED) |
| 122 | 122 | ||
| 123 | test-libbfd.bin: | 123 | test-libbfd.bin: |
| 124 | $(BUILD) -DPACKAGE='"perf"' -lbfd -ldl | 124 | $(BUILD) -DPACKAGE='"perf"' -lbfd -lz -liberty -ldl |
| 125 | 125 | ||
| 126 | test-liberty.bin: | 126 | test-liberty.bin: |
| 127 | $(CC) -o $(OUTPUT)$@ test-libbfd.c -DPACKAGE='"perf"' -lbfd -ldl -liberty | 127 | $(CC) -o $(OUTPUT)$@ test-libbfd.c -DPACKAGE='"perf"' -lbfd -ldl -liberty |
diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c index 469eb679fb9d..3aa555ff9d89 100644 --- a/tools/perf/util/annotate.c +++ b/tools/perf/util/annotate.c | |||
| @@ -8,6 +8,8 @@ | |||
| 8 | */ | 8 | */ |
| 9 | 9 | ||
| 10 | #include "util.h" | 10 | #include "util.h" |
| 11 | #include "ui/ui.h" | ||
| 12 | #include "sort.h" | ||
| 11 | #include "build-id.h" | 13 | #include "build-id.h" |
| 12 | #include "color.h" | 14 | #include "color.h" |
| 13 | #include "cache.h" | 15 | #include "cache.h" |
| @@ -489,7 +491,7 @@ static int symbol__inc_addr_samples(struct symbol *sym, struct map *map, | |||
| 489 | { | 491 | { |
| 490 | struct annotation *notes; | 492 | struct annotation *notes; |
| 491 | 493 | ||
| 492 | if (sym == NULL || use_browser != 1 || !sort__has_sym) | 494 | if (sym == NULL) |
| 493 | return 0; | 495 | return 0; |
| 494 | 496 | ||
| 495 | notes = symbol__annotation(sym); | 497 | notes = symbol__annotation(sym); |
| @@ -1399,3 +1401,8 @@ int hist_entry__annotate(struct hist_entry *he, size_t privsize) | |||
| 1399 | { | 1401 | { |
| 1400 | return symbol__annotate(he->ms.sym, he->ms.map, privsize); | 1402 | return symbol__annotate(he->ms.sym, he->ms.map, privsize); |
| 1401 | } | 1403 | } |
| 1404 | |||
| 1405 | bool ui__has_annotation(void) | ||
| 1406 | { | ||
| 1407 | return use_browser == 1 && sort__has_sym; | ||
| 1408 | } | ||
diff --git a/tools/perf/util/annotate.h b/tools/perf/util/annotate.h index b2aef59d6bb2..56ad4f5287de 100644 --- a/tools/perf/util/annotate.h +++ b/tools/perf/util/annotate.h | |||
| @@ -151,6 +151,8 @@ void symbol__annotate_zero_histogram(struct symbol *sym, int evidx); | |||
| 151 | void symbol__annotate_decay_histogram(struct symbol *sym, int evidx); | 151 | void symbol__annotate_decay_histogram(struct symbol *sym, int evidx); |
| 152 | void disasm__purge(struct list_head *head); | 152 | void disasm__purge(struct list_head *head); |
| 153 | 153 | ||
| 154 | bool ui__has_annotation(void); | ||
| 155 | |||
| 154 | int symbol__tty_annotate(struct symbol *sym, struct map *map, | 156 | int symbol__tty_annotate(struct symbol *sym, struct map *map, |
| 155 | struct perf_evsel *evsel, bool print_lines, | 157 | struct perf_evsel *evsel, bool print_lines, |
| 156 | bool full_paths, int min_pcnt, int max_lines); | 158 | bool full_paths, int min_pcnt, int max_lines); |
diff --git a/tools/perf/util/include/linux/bitops.h b/tools/perf/util/include/linux/bitops.h index 45cf10a562bd..dadfa7e54287 100644 --- a/tools/perf/util/include/linux/bitops.h +++ b/tools/perf/util/include/linux/bitops.h | |||
| @@ -87,13 +87,15 @@ static __always_inline unsigned long __ffs(unsigned long word) | |||
| 87 | return num; | 87 | return num; |
| 88 | } | 88 | } |
| 89 | 89 | ||
| 90 | typedef const unsigned long __attribute__((__may_alias__)) long_alias_t; | ||
| 91 | |||
| 90 | /* | 92 | /* |
| 91 | * Find the first set bit in a memory region. | 93 | * Find the first set bit in a memory region. |
| 92 | */ | 94 | */ |
| 93 | static inline unsigned long | 95 | static inline unsigned long |
| 94 | find_first_bit(const unsigned long *addr, unsigned long size) | 96 | find_first_bit(const unsigned long *addr, unsigned long size) |
| 95 | { | 97 | { |
| 96 | const unsigned long *p = addr; | 98 | long_alias_t *p = (long_alias_t *) addr; |
| 97 | unsigned long result = 0; | 99 | unsigned long result = 0; |
| 98 | unsigned long tmp; | 100 | unsigned long tmp; |
| 99 | 101 | ||
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c index a9d758a3b371..e89afc097d8a 100644 --- a/tools/perf/util/symbol.c +++ b/tools/perf/util/symbol.c | |||
| @@ -1336,6 +1336,8 @@ int dso__load(struct dso *dso, struct map *map, symbol_filter_t filter) | |||
| 1336 | 1336 | ||
| 1337 | if (syms_ss && runtime_ss) | 1337 | if (syms_ss && runtime_ss) |
| 1338 | break; | 1338 | break; |
| 1339 | } else { | ||
| 1340 | symsrc__destroy(ss); | ||
| 1339 | } | 1341 | } |
| 1340 | 1342 | ||
| 1341 | } | 1343 | } |
