diff options
544 files changed, 4296 insertions, 3013 deletions
| @@ -116,6 +116,7 @@ Shiraz Hashim <shiraz.linux.kernel@gmail.com> <shiraz.hashim@st.com> | |||
| 116 | Simon Kelley <simon@thekelleys.org.uk> | 116 | Simon Kelley <simon@thekelleys.org.uk> |
| 117 | Stéphane Witzmann <stephane.witzmann@ubpmes.univ-bpclermont.fr> | 117 | Stéphane Witzmann <stephane.witzmann@ubpmes.univ-bpclermont.fr> |
| 118 | Stephen Hemminger <shemminger@osdl.org> | 118 | Stephen Hemminger <shemminger@osdl.org> |
| 119 | Sudeep Holla <sudeep.holla@arm.com> Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com> | ||
| 119 | Sumit Semwal <sumit.semwal@ti.com> | 120 | Sumit Semwal <sumit.semwal@ti.com> |
| 120 | Tejun Heo <htejun@gmail.com> | 121 | Tejun Heo <htejun@gmail.com> |
| 121 | Thomas Graf <tgraf@suug.ch> | 122 | Thomas Graf <tgraf@suug.ch> |
| @@ -125,7 +126,9 @@ Uwe Kleine-König <ukleinek@informatik.uni-freiburg.de> | |||
| 125 | Uwe Kleine-König <ukl@pengutronix.de> | 126 | Uwe Kleine-König <ukl@pengutronix.de> |
| 126 | Uwe Kleine-König <Uwe.Kleine-Koenig@digi.com> | 127 | Uwe Kleine-König <Uwe.Kleine-Koenig@digi.com> |
| 127 | Valdis Kletnieks <Valdis.Kletnieks@vt.edu> | 128 | Valdis Kletnieks <Valdis.Kletnieks@vt.edu> |
| 128 | Viresh Kumar <viresh.linux@gmail.com> <viresh.kumar@st.com> | 129 | Viresh Kumar <vireshk@kernel.org> <viresh.kumar@st.com> |
| 130 | Viresh Kumar <vireshk@kernel.org> <viresh.linux@gmail.com> | ||
| 131 | Viresh Kumar <vireshk@kernel.org> <viresh.kumar2@arm.com> | ||
| 129 | Takashi YOSHII <takashi.yoshii.zj@renesas.com> | 132 | Takashi YOSHII <takashi.yoshii.zj@renesas.com> |
| 130 | Yusuke Goda <goda.yusuke@renesas.com> | 133 | Yusuke Goda <goda.yusuke@renesas.com> |
| 131 | Gustavo Padovan <gustavo@las.ic.unicamp.br> | 134 | Gustavo Padovan <gustavo@las.ic.unicamp.br> |
diff --git a/Documentation/ABI/testing/sysfs-bus-iio b/Documentation/ABI/testing/sysfs-bus-iio index bbed111c31b4..70c9b1ac66db 100644 --- a/Documentation/ABI/testing/sysfs-bus-iio +++ b/Documentation/ABI/testing/sysfs-bus-iio | |||
| @@ -1234,10 +1234,8 @@ Description: | |||
| 1234 | object is near the sensor, usually be observing | 1234 | object is near the sensor, usually be observing |
| 1235 | reflectivity of infrared or ultrasound emitted. | 1235 | reflectivity of infrared or ultrasound emitted. |
| 1236 | Often these sensors are unit less and as such conversion | 1236 | Often these sensors are unit less and as such conversion |
| 1237 | to SI units is not possible. Where it is, the units should | 1237 | to SI units is not possible. Higher proximity measurements |
| 1238 | be meters. If such a conversion is not possible, the reported | 1238 | indicate closer objects, and vice versa. |
| 1239 | values should behave in the same way as a distance, i.e. lower | ||
| 1240 | values indicate something is closer to the sensor. | ||
| 1241 | 1239 | ||
| 1242 | What: /sys/.../iio:deviceX/in_illuminance_input | 1240 | What: /sys/.../iio:deviceX/in_illuminance_input |
| 1243 | What: /sys/.../iio:deviceX/in_illuminance_raw | 1241 | What: /sys/.../iio:deviceX/in_illuminance_raw |
diff --git a/Documentation/DocBook/drm.tmpl b/Documentation/DocBook/drm.tmpl index c0312cbd023d..2fb9a5457522 100644 --- a/Documentation/DocBook/drm.tmpl +++ b/Documentation/DocBook/drm.tmpl | |||
| @@ -3383,7 +3383,7 @@ void intel_crt_init(struct drm_device *dev) | |||
| 3383 | <td valign="top" >TBD</td> | 3383 | <td valign="top" >TBD</td> |
| 3384 | </tr> | 3384 | </tr> |
| 3385 | <tr> | 3385 | <tr> |
| 3386 | <td rowspan="2" valign="top" >omap</td> | 3386 | <td valign="top" >omap</td> |
| 3387 | <td valign="top" >Generic</td> | 3387 | <td valign="top" >Generic</td> |
| 3388 | <td valign="top" >“zorder”</td> | 3388 | <td valign="top" >“zorder”</td> |
| 3389 | <td valign="top" >RANGE</td> | 3389 | <td valign="top" >RANGE</td> |
diff --git a/Documentation/arm/SPEAr/overview.txt b/Documentation/arm/SPEAr/overview.txt index 65610bf52ebf..1b049be6c84f 100644 --- a/Documentation/arm/SPEAr/overview.txt +++ b/Documentation/arm/SPEAr/overview.txt | |||
| @@ -60,4 +60,4 @@ Introduction | |||
| 60 | Document Author | 60 | Document Author |
| 61 | --------------- | 61 | --------------- |
| 62 | 62 | ||
| 63 | Viresh Kumar <viresh.linux@gmail.com>, (c) 2010-2012 ST Microelectronics | 63 | Viresh Kumar <vireshk@kernel.org>, (c) 2010-2012 ST Microelectronics |
diff --git a/Documentation/device-mapper/cache.txt b/Documentation/device-mapper/cache.txt index 82960cffbad3..785eab87aa71 100644 --- a/Documentation/device-mapper/cache.txt +++ b/Documentation/device-mapper/cache.txt | |||
| @@ -258,6 +258,12 @@ cache metadata mode : ro if read-only, rw if read-write | |||
| 258 | no further I/O will be permitted and the status will just | 258 | no further I/O will be permitted and the status will just |
| 259 | contain the string 'Fail'. The userspace recovery tools | 259 | contain the string 'Fail'. The userspace recovery tools |
| 260 | should then be used. | 260 | should then be used. |
| 261 | needs_check : 'needs_check' if set, '-' if not set | ||
| 262 | A metadata operation has failed, resulting in the needs_check | ||
| 263 | flag being set in the metadata's superblock. The metadata | ||
| 264 | device must be deactivated and checked/repaired before the | ||
| 265 | cache can be made fully operational again. '-' indicates | ||
| 266 | needs_check is not set. | ||
| 261 | 267 | ||
| 262 | Messages | 268 | Messages |
| 263 | -------- | 269 | -------- |
diff --git a/Documentation/device-mapper/thin-provisioning.txt b/Documentation/device-mapper/thin-provisioning.txt index 4f67578b2954..1699a55b7b70 100644 --- a/Documentation/device-mapper/thin-provisioning.txt +++ b/Documentation/device-mapper/thin-provisioning.txt | |||
| @@ -296,7 +296,7 @@ ii) Status | |||
| 296 | underlying device. When this is enabled when loading the table, | 296 | underlying device. When this is enabled when loading the table, |
| 297 | it can get disabled if the underlying device doesn't support it. | 297 | it can get disabled if the underlying device doesn't support it. |
| 298 | 298 | ||
| 299 | ro|rw | 299 | ro|rw|out_of_data_space |
| 300 | If the pool encounters certain types of device failures it will | 300 | If the pool encounters certain types of device failures it will |
| 301 | drop into a read-only metadata mode in which no changes to | 301 | drop into a read-only metadata mode in which no changes to |
| 302 | the pool metadata (like allocating new blocks) are permitted. | 302 | the pool metadata (like allocating new blocks) are permitted. |
| @@ -314,6 +314,13 @@ ii) Status | |||
| 314 | module parameter can be used to change this timeout -- it | 314 | module parameter can be used to change this timeout -- it |
| 315 | defaults to 60 seconds but may be disabled using a value of 0. | 315 | defaults to 60 seconds but may be disabled using a value of 0. |
| 316 | 316 | ||
| 317 | needs_check | ||
| 318 | A metadata operation has failed, resulting in the needs_check | ||
| 319 | flag being set in the metadata's superblock. The metadata | ||
| 320 | device must be deactivated and checked/repaired before the | ||
| 321 | thin-pool can be made fully operational again. '-' indicates | ||
| 322 | needs_check is not set. | ||
| 323 | |||
| 317 | iii) Messages | 324 | iii) Messages |
| 318 | 325 | ||
| 319 | create_thin <dev id> | 326 | create_thin <dev id> |
diff --git a/Documentation/devicetree/bindings/drm/imx/fsl-imx-drm.txt b/Documentation/devicetree/bindings/drm/imx/fsl-imx-drm.txt index e75f0e549fff..971c3eedb1c7 100644 --- a/Documentation/devicetree/bindings/drm/imx/fsl-imx-drm.txt +++ b/Documentation/devicetree/bindings/drm/imx/fsl-imx-drm.txt | |||
| @@ -65,8 +65,10 @@ Optional properties: | |||
| 65 | - edid: verbatim EDID data block describing attached display. | 65 | - edid: verbatim EDID data block describing attached display. |
| 66 | - ddc: phandle describing the i2c bus handling the display data | 66 | - ddc: phandle describing the i2c bus handling the display data |
| 67 | channel | 67 | channel |
| 68 | - port: A port node with endpoint definitions as defined in | 68 | - port@[0-1]: Port nodes with endpoint definitions as defined in |
| 69 | Documentation/devicetree/bindings/media/video-interfaces.txt. | 69 | Documentation/devicetree/bindings/media/video-interfaces.txt. |
| 70 | Port 0 is the input port connected to the IPU display interface, | ||
| 71 | port 1 is the output port connected to a panel. | ||
| 70 | 72 | ||
| 71 | example: | 73 | example: |
| 72 | 74 | ||
| @@ -75,9 +77,29 @@ display@di0 { | |||
| 75 | edid = [edid-data]; | 77 | edid = [edid-data]; |
| 76 | interface-pix-fmt = "rgb24"; | 78 | interface-pix-fmt = "rgb24"; |
| 77 | 79 | ||
| 78 | port { | 80 | port@0 { |
| 81 | reg = <0>; | ||
| 82 | |||
| 79 | display_in: endpoint { | 83 | display_in: endpoint { |
| 80 | remote-endpoint = <&ipu_di0_disp0>; | 84 | remote-endpoint = <&ipu_di0_disp0>; |
| 81 | }; | 85 | }; |
| 82 | }; | 86 | }; |
| 87 | |||
| 88 | port@1 { | ||
| 89 | reg = <1>; | ||
| 90 | |||
| 91 | display_out: endpoint { | ||
| 92 | remote-endpoint = <&panel_in>; | ||
| 93 | }; | ||
| 94 | }; | ||
| 95 | }; | ||
| 96 | |||
| 97 | panel { | ||
| 98 | ... | ||
| 99 | |||
| 100 | port { | ||
| 101 | panel_in: endpoint { | ||
| 102 | remote-endpoint = <&display_out>; | ||
| 103 | }; | ||
| 104 | }; | ||
| 83 | }; | 105 | }; |
diff --git a/Documentation/devicetree/bindings/sound/mt8173-max98090.txt b/Documentation/devicetree/bindings/sound/mt8173-max98090.txt index 829bd26d17f8..519e97c8f1b8 100644 --- a/Documentation/devicetree/bindings/sound/mt8173-max98090.txt +++ b/Documentation/devicetree/bindings/sound/mt8173-max98090.txt | |||
| @@ -3,11 +3,13 @@ MT8173 with MAX98090 CODEC | |||
| 3 | Required properties: | 3 | Required properties: |
| 4 | - compatible : "mediatek,mt8173-max98090" | 4 | - compatible : "mediatek,mt8173-max98090" |
| 5 | - mediatek,audio-codec: the phandle of the MAX98090 audio codec | 5 | - mediatek,audio-codec: the phandle of the MAX98090 audio codec |
| 6 | - mediatek,platform: the phandle of MT8173 ASoC platform | ||
| 6 | 7 | ||
| 7 | Example: | 8 | Example: |
| 8 | 9 | ||
| 9 | sound { | 10 | sound { |
| 10 | compatible = "mediatek,mt8173-max98090"; | 11 | compatible = "mediatek,mt8173-max98090"; |
| 11 | mediatek,audio-codec = <&max98090>; | 12 | mediatek,audio-codec = <&max98090>; |
| 13 | mediatek,platform = <&afe>; | ||
| 12 | }; | 14 | }; |
| 13 | 15 | ||
diff --git a/Documentation/devicetree/bindings/sound/mt8173-rt5650-rt5676.txt b/Documentation/devicetree/bindings/sound/mt8173-rt5650-rt5676.txt index 61e98c976bd4..f205ce9e31dd 100644 --- a/Documentation/devicetree/bindings/sound/mt8173-rt5650-rt5676.txt +++ b/Documentation/devicetree/bindings/sound/mt8173-rt5650-rt5676.txt | |||
| @@ -3,11 +3,13 @@ MT8173 with RT5650 RT5676 CODECS | |||
| 3 | Required properties: | 3 | Required properties: |
| 4 | - compatible : "mediatek,mt8173-rt5650-rt5676" | 4 | - compatible : "mediatek,mt8173-rt5650-rt5676" |
| 5 | - mediatek,audio-codec: the phandles of rt5650 and rt5676 codecs | 5 | - mediatek,audio-codec: the phandles of rt5650 and rt5676 codecs |
| 6 | - mediatek,platform: the phandle of MT8173 ASoC platform | ||
| 6 | 7 | ||
| 7 | Example: | 8 | Example: |
| 8 | 9 | ||
| 9 | sound { | 10 | sound { |
| 10 | compatible = "mediatek,mt8173-rt5650-rt5676"; | 11 | compatible = "mediatek,mt8173-rt5650-rt5676"; |
| 11 | mediatek,audio-codec = <&rt5650 &rt5676>; | 12 | mediatek,audio-codec = <&rt5650 &rt5676>; |
| 13 | mediatek,platform = <&afe>; | ||
| 12 | }; | 14 | }; |
| 13 | 15 | ||
diff --git a/Documentation/kbuild/makefiles.txt b/Documentation/kbuild/makefiles.txt index e63b446d973c..13f888a02a3d 100644 --- a/Documentation/kbuild/makefiles.txt +++ b/Documentation/kbuild/makefiles.txt | |||
| @@ -952,6 +952,14 @@ When kbuild executes, the following steps are followed (roughly): | |||
| 952 | $(KBUILD_ARFLAGS) set by the top level Makefile to "D" (deterministic | 952 | $(KBUILD_ARFLAGS) set by the top level Makefile to "D" (deterministic |
| 953 | mode) if this option is supported by $(AR). | 953 | mode) if this option is supported by $(AR). |
| 954 | 954 | ||
| 955 | ARCH_CPPFLAGS, ARCH_AFLAGS, ARCH_CFLAGS Overrides the kbuild defaults | ||
| 956 | |||
| 957 | These variables are appended to the KBUILD_CPPFLAGS, | ||
| 958 | KBUILD_AFLAGS, and KBUILD_CFLAGS, respectively, after the | ||
| 959 | top-level Makefile has set any other flags. This provides a | ||
| 960 | means for an architecture to override the defaults. | ||
| 961 | |||
| 962 | |||
| 955 | --- 6.2 Add prerequisites to archheaders: | 963 | --- 6.2 Add prerequisites to archheaders: |
| 956 | 964 | ||
| 957 | The archheaders: rule is used to generate header files that | 965 | The archheaders: rule is used to generate header files that |
diff --git a/MAINTAINERS b/MAINTAINERS index fd6078443083..a2264167791a 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -361,11 +361,11 @@ S: Supported | |||
| 361 | F: drivers/input/touchscreen/ad7879.c | 361 | F: drivers/input/touchscreen/ad7879.c |
| 362 | 362 | ||
| 363 | ADDRESS SPACE LAYOUT RANDOMIZATION (ASLR) | 363 | ADDRESS SPACE LAYOUT RANDOMIZATION (ASLR) |
| 364 | M: Jiri Kosina <jkosina@suse.cz> | 364 | M: Jiri Kosina <jkosina@suse.com> |
| 365 | S: Maintained | 365 | S: Maintained |
| 366 | 366 | ||
| 367 | ADM1025 HARDWARE MONITOR DRIVER | 367 | ADM1025 HARDWARE MONITOR DRIVER |
| 368 | M: Jean Delvare <jdelvare@suse.de> | 368 | M: Jean Delvare <jdelvare@suse.com> |
| 369 | L: lm-sensors@lm-sensors.org | 369 | L: lm-sensors@lm-sensors.org |
| 370 | S: Maintained | 370 | S: Maintained |
| 371 | F: Documentation/hwmon/adm1025 | 371 | F: Documentation/hwmon/adm1025 |
| @@ -430,7 +430,7 @@ S: Maintained | |||
| 430 | F: drivers/macintosh/therm_adt746x.c | 430 | F: drivers/macintosh/therm_adt746x.c |
| 431 | 431 | ||
| 432 | ADT7475 HARDWARE MONITOR DRIVER | 432 | ADT7475 HARDWARE MONITOR DRIVER |
| 433 | M: Jean Delvare <jdelvare@suse.de> | 433 | M: Jean Delvare <jdelvare@suse.com> |
| 434 | L: lm-sensors@lm-sensors.org | 434 | L: lm-sensors@lm-sensors.org |
| 435 | S: Maintained | 435 | S: Maintained |
| 436 | F: Documentation/hwmon/adt7475 | 436 | F: Documentation/hwmon/adt7475 |
| @@ -445,7 +445,7 @@ F: drivers/input/misc/adxl34x.c | |||
| 445 | 445 | ||
| 446 | ADVANSYS SCSI DRIVER | 446 | ADVANSYS SCSI DRIVER |
| 447 | M: Matthew Wilcox <matthew@wil.cx> | 447 | M: Matthew Wilcox <matthew@wil.cx> |
| 448 | M: Hannes Reinecke <hare@suse.de> | 448 | M: Hannes Reinecke <hare@suse.com> |
| 449 | L: linux-scsi@vger.kernel.org | 449 | L: linux-scsi@vger.kernel.org |
| 450 | S: Maintained | 450 | S: Maintained |
| 451 | F: Documentation/scsi/advansys.txt | 451 | F: Documentation/scsi/advansys.txt |
| @@ -506,7 +506,7 @@ F: drivers/scsi/aha152x* | |||
| 506 | F: drivers/scsi/pcmcia/aha152x* | 506 | F: drivers/scsi/pcmcia/aha152x* |
| 507 | 507 | ||
| 508 | AIC7XXX / AIC79XX SCSI DRIVER | 508 | AIC7XXX / AIC79XX SCSI DRIVER |
| 509 | M: Hannes Reinecke <hare@suse.de> | 509 | M: Hannes Reinecke <hare@suse.com> |
| 510 | L: linux-scsi@vger.kernel.org | 510 | L: linux-scsi@vger.kernel.org |
| 511 | S: Maintained | 511 | S: Maintained |
| 512 | F: drivers/scsi/aic7xxx/ | 512 | F: drivers/scsi/aic7xxx/ |
| @@ -746,7 +746,7 @@ S: Maintained | |||
| 746 | F: sound/aoa/ | 746 | F: sound/aoa/ |
| 747 | 747 | ||
| 748 | APM DRIVER | 748 | APM DRIVER |
| 749 | M: Jiri Kosina <jkosina@suse.cz> | 749 | M: Jiri Kosina <jkosina@suse.com> |
| 750 | S: Odd fixes | 750 | S: Odd fixes |
| 751 | F: arch/x86/kernel/apm_32.c | 751 | F: arch/x86/kernel/apm_32.c |
| 752 | F: include/linux/apm_bios.h | 752 | F: include/linux/apm_bios.h |
| @@ -1001,6 +1001,7 @@ ARM/CONEXANT DIGICOLOR MACHINE SUPPORT | |||
| 1001 | M: Baruch Siach <baruch@tkos.co.il> | 1001 | M: Baruch Siach <baruch@tkos.co.il> |
| 1002 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 1002 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
| 1003 | S: Maintained | 1003 | S: Maintained |
| 1004 | F: arch/arm/boot/dts/cx92755* | ||
| 1004 | N: digicolor | 1005 | N: digicolor |
| 1005 | 1006 | ||
| 1006 | ARM/EBSA110 MACHINE SUPPORT | 1007 | ARM/EBSA110 MACHINE SUPPORT |
| @@ -1324,7 +1325,7 @@ F: arch/arm/mach-pxa/include/mach/palmtc.h | |||
| 1324 | F: arch/arm/mach-pxa/palmtc.c | 1325 | F: arch/arm/mach-pxa/palmtc.c |
| 1325 | 1326 | ||
| 1326 | ARM/PALM TREO SUPPORT | 1327 | ARM/PALM TREO SUPPORT |
| 1327 | M: Tomas Cech <sleep_walker@suse.cz> | 1328 | M: Tomas Cech <sleep_walker@suse.com> |
| 1328 | L: linux-arm-kernel@lists.infradead.org | 1329 | L: linux-arm-kernel@lists.infradead.org |
| 1329 | W: http://hackndev.com | 1330 | W: http://hackndev.com |
| 1330 | S: Maintained | 1331 | S: Maintained |
| @@ -2405,7 +2406,7 @@ F: drivers/gpio/gpio-bt8xx.c | |||
| 2405 | BTRFS FILE SYSTEM | 2406 | BTRFS FILE SYSTEM |
| 2406 | M: Chris Mason <clm@fb.com> | 2407 | M: Chris Mason <clm@fb.com> |
| 2407 | M: Josef Bacik <jbacik@fb.com> | 2408 | M: Josef Bacik <jbacik@fb.com> |
| 2408 | M: David Sterba <dsterba@suse.cz> | 2409 | M: David Sterba <dsterba@suse.com> |
| 2409 | L: linux-btrfs@vger.kernel.org | 2410 | L: linux-btrfs@vger.kernel.org |
| 2410 | W: http://btrfs.wiki.kernel.org/ | 2411 | W: http://btrfs.wiki.kernel.org/ |
| 2411 | Q: http://patchwork.kernel.org/project/linux-btrfs/list/ | 2412 | Q: http://patchwork.kernel.org/project/linux-btrfs/list/ |
| @@ -2748,7 +2749,7 @@ COCCINELLE/Semantic Patches (SmPL) | |||
| 2748 | M: Julia Lawall <Julia.Lawall@lip6.fr> | 2749 | M: Julia Lawall <Julia.Lawall@lip6.fr> |
| 2749 | M: Gilles Muller <Gilles.Muller@lip6.fr> | 2750 | M: Gilles Muller <Gilles.Muller@lip6.fr> |
| 2750 | M: Nicolas Palix <nicolas.palix@imag.fr> | 2751 | M: Nicolas Palix <nicolas.palix@imag.fr> |
| 2751 | M: Michal Marek <mmarek@suse.cz> | 2752 | M: Michal Marek <mmarek@suse.com> |
| 2752 | L: cocci@systeme.lip6.fr (moderated for non-subscribers) | 2753 | L: cocci@systeme.lip6.fr (moderated for non-subscribers) |
| 2753 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild.git misc | 2754 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild.git misc |
| 2754 | W: http://coccinelle.lip6.fr/ | 2755 | W: http://coccinelle.lip6.fr/ |
| @@ -2864,7 +2865,7 @@ F: kernel/cpuset.c | |||
| 2864 | 2865 | ||
| 2865 | CONTROL GROUP - MEMORY RESOURCE CONTROLLER (MEMCG) | 2866 | CONTROL GROUP - MEMORY RESOURCE CONTROLLER (MEMCG) |
| 2866 | M: Johannes Weiner <hannes@cmpxchg.org> | 2867 | M: Johannes Weiner <hannes@cmpxchg.org> |
| 2867 | M: Michal Hocko <mhocko@suse.cz> | 2868 | M: Michal Hocko <mhocko@kernel.org> |
| 2868 | L: cgroups@vger.kernel.org | 2869 | L: cgroups@vger.kernel.org |
| 2869 | L: linux-mm@kvack.org | 2870 | L: linux-mm@kvack.org |
| 2870 | S: Maintained | 2871 | S: Maintained |
| @@ -2945,7 +2946,7 @@ F: arch/x86/kernel/cpuid.c | |||
| 2945 | F: arch/x86/kernel/msr.c | 2946 | F: arch/x86/kernel/msr.c |
| 2946 | 2947 | ||
| 2947 | CPU POWER MONITORING SUBSYSTEM | 2948 | CPU POWER MONITORING SUBSYSTEM |
| 2948 | M: Thomas Renninger <trenn@suse.de> | 2949 | M: Thomas Renninger <trenn@suse.com> |
| 2949 | L: linux-pm@vger.kernel.org | 2950 | L: linux-pm@vger.kernel.org |
| 2950 | S: Maintained | 2951 | S: Maintained |
| 2951 | F: tools/power/cpupower/ | 2952 | F: tools/power/cpupower/ |
| @@ -3175,7 +3176,7 @@ F: Documentation/networking/dmfe.txt | |||
| 3175 | F: drivers/net/ethernet/dec/tulip/dmfe.c | 3176 | F: drivers/net/ethernet/dec/tulip/dmfe.c |
| 3176 | 3177 | ||
| 3177 | DC390/AM53C974 SCSI driver | 3178 | DC390/AM53C974 SCSI driver |
| 3178 | M: Hannes Reinecke <hare@suse.de> | 3179 | M: Hannes Reinecke <hare@suse.com> |
| 3179 | L: linux-scsi@vger.kernel.org | 3180 | L: linux-scsi@vger.kernel.org |
| 3180 | S: Maintained | 3181 | S: Maintained |
| 3181 | F: drivers/scsi/am53c974.c | 3182 | F: drivers/scsi/am53c974.c |
| @@ -3379,7 +3380,7 @@ W: http://www.win.tue.nl/~aeb/partitions/partition_types-1.html | |||
| 3379 | S: Maintained | 3380 | S: Maintained |
| 3380 | 3381 | ||
| 3381 | DISKQUOTA | 3382 | DISKQUOTA |
| 3382 | M: Jan Kara <jack@suse.cz> | 3383 | M: Jan Kara <jack@suse.com> |
| 3383 | S: Maintained | 3384 | S: Maintained |
| 3384 | F: Documentation/filesystems/quota.txt | 3385 | F: Documentation/filesystems/quota.txt |
| 3385 | F: fs/quota/ | 3386 | F: fs/quota/ |
| @@ -3435,7 +3436,7 @@ F: Documentation/hwmon/dme1737 | |||
| 3435 | F: drivers/hwmon/dme1737.c | 3436 | F: drivers/hwmon/dme1737.c |
| 3436 | 3437 | ||
| 3437 | DMI/SMBIOS SUPPORT | 3438 | DMI/SMBIOS SUPPORT |
| 3438 | M: Jean Delvare <jdelvare@suse.de> | 3439 | M: Jean Delvare <jdelvare@suse.com> |
| 3439 | S: Maintained | 3440 | S: Maintained |
| 3440 | T: quilt http://jdelvare.nerim.net/devel/linux/jdelvare-dmi/ | 3441 | T: quilt http://jdelvare.nerim.net/devel/linux/jdelvare-dmi/ |
| 3441 | F: Documentation/ABI/testing/sysfs-firmware-dmi-tables | 3442 | F: Documentation/ABI/testing/sysfs-firmware-dmi-tables |
| @@ -4051,7 +4052,7 @@ F: drivers/of/of_mdio.c | |||
| 4051 | F: drivers/of/of_net.c | 4052 | F: drivers/of/of_net.c |
| 4052 | 4053 | ||
| 4053 | EXT2 FILE SYSTEM | 4054 | EXT2 FILE SYSTEM |
| 4054 | M: Jan Kara <jack@suse.cz> | 4055 | M: Jan Kara <jack@suse.com> |
| 4055 | L: linux-ext4@vger.kernel.org | 4056 | L: linux-ext4@vger.kernel.org |
| 4056 | S: Maintained | 4057 | S: Maintained |
| 4057 | F: Documentation/filesystems/ext2.txt | 4058 | F: Documentation/filesystems/ext2.txt |
| @@ -4059,7 +4060,7 @@ F: fs/ext2/ | |||
| 4059 | F: include/linux/ext2* | 4060 | F: include/linux/ext2* |
| 4060 | 4061 | ||
| 4061 | EXT3 FILE SYSTEM | 4062 | EXT3 FILE SYSTEM |
| 4062 | M: Jan Kara <jack@suse.cz> | 4063 | M: Jan Kara <jack@suse.com> |
| 4063 | M: Andrew Morton <akpm@linux-foundation.org> | 4064 | M: Andrew Morton <akpm@linux-foundation.org> |
| 4064 | M: Andreas Dilger <adilger.kernel@dilger.ca> | 4065 | M: Andreas Dilger <adilger.kernel@dilger.ca> |
| 4065 | L: linux-ext4@vger.kernel.org | 4066 | L: linux-ext4@vger.kernel.org |
| @@ -4109,7 +4110,7 @@ F: drivers/video/fbdev/exynos/exynos_mipi* | |||
| 4109 | F: include/video/exynos_mipi* | 4110 | F: include/video/exynos_mipi* |
| 4110 | 4111 | ||
| 4111 | F71805F HARDWARE MONITORING DRIVER | 4112 | F71805F HARDWARE MONITORING DRIVER |
| 4112 | M: Jean Delvare <jdelvare@suse.de> | 4113 | M: Jean Delvare <jdelvare@suse.com> |
| 4113 | L: lm-sensors@lm-sensors.org | 4114 | L: lm-sensors@lm-sensors.org |
| 4114 | S: Maintained | 4115 | S: Maintained |
| 4115 | F: Documentation/hwmon/f71805f | 4116 | F: Documentation/hwmon/f71805f |
| @@ -4244,7 +4245,7 @@ S: Maintained | |||
| 4244 | F: drivers/block/rsxx/ | 4245 | F: drivers/block/rsxx/ |
| 4245 | 4246 | ||
| 4246 | FLOPPY DRIVER | 4247 | FLOPPY DRIVER |
| 4247 | M: Jiri Kosina <jkosina@suse.cz> | 4248 | M: Jiri Kosina <jkosina@suse.com> |
| 4248 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/floppy.git | 4249 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/floppy.git |
| 4249 | S: Odd fixes | 4250 | S: Odd fixes |
| 4250 | F: drivers/block/floppy.c | 4251 | F: drivers/block/floppy.c |
| @@ -4665,7 +4666,7 @@ F: drivers/media/usb/stk1160/ | |||
| 4665 | 4666 | ||
| 4666 | H8/300 ARCHITECTURE | 4667 | H8/300 ARCHITECTURE |
| 4667 | M: Yoshinori Sato <ysato@users.sourceforge.jp> | 4668 | M: Yoshinori Sato <ysato@users.sourceforge.jp> |
| 4668 | L: uclinux-h8-devel@lists.sourceforge.jp | 4669 | L: uclinux-h8-devel@lists.sourceforge.jp (moderated for non-subscribers) |
| 4669 | W: http://uclinux-h8.sourceforge.jp | 4670 | W: http://uclinux-h8.sourceforge.jp |
| 4670 | T: git git://git.sourceforge.jp/gitroot/uclinux-h8/linux.git | 4671 | T: git git://git.sourceforge.jp/gitroot/uclinux-h8/linux.git |
| 4671 | S: Maintained | 4672 | S: Maintained |
| @@ -4712,7 +4713,7 @@ S: Maintained | |||
| 4712 | F: drivers/media/usb/hackrf/ | 4713 | F: drivers/media/usb/hackrf/ |
| 4713 | 4714 | ||
| 4714 | HARDWARE MONITORING | 4715 | HARDWARE MONITORING |
| 4715 | M: Jean Delvare <jdelvare@suse.de> | 4716 | M: Jean Delvare <jdelvare@suse.com> |
| 4716 | M: Guenter Roeck <linux@roeck-us.net> | 4717 | M: Guenter Roeck <linux@roeck-us.net> |
| 4717 | L: lm-sensors@lm-sensors.org | 4718 | L: lm-sensors@lm-sensors.org |
| 4718 | W: http://www.lm-sensors.org/ | 4719 | W: http://www.lm-sensors.org/ |
| @@ -4815,7 +4816,7 @@ F: include/linux/pm.h | |||
| 4815 | F: arch/*/include/asm/suspend*.h | 4816 | F: arch/*/include/asm/suspend*.h |
| 4816 | 4817 | ||
| 4817 | HID CORE LAYER | 4818 | HID CORE LAYER |
| 4818 | M: Jiri Kosina <jkosina@suse.cz> | 4819 | M: Jiri Kosina <jkosina@suse.com> |
| 4819 | L: linux-input@vger.kernel.org | 4820 | L: linux-input@vger.kernel.org |
| 4820 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid.git | 4821 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid.git |
| 4821 | S: Maintained | 4822 | S: Maintained |
| @@ -4824,7 +4825,7 @@ F: include/linux/hid* | |||
| 4824 | F: include/uapi/linux/hid* | 4825 | F: include/uapi/linux/hid* |
| 4825 | 4826 | ||
| 4826 | HID SENSOR HUB DRIVERS | 4827 | HID SENSOR HUB DRIVERS |
| 4827 | M: Jiri Kosina <jkosina@suse.cz> | 4828 | M: Jiri Kosina <jkosina@suse.com> |
| 4828 | M: Jonathan Cameron <jic23@kernel.org> | 4829 | M: Jonathan Cameron <jic23@kernel.org> |
| 4829 | M: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> | 4830 | M: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> |
| 4830 | L: linux-input@vger.kernel.org | 4831 | L: linux-input@vger.kernel.org |
| @@ -4958,7 +4959,7 @@ F: include/linux/hyperv.h | |||
| 4958 | F: tools/hv/ | 4959 | F: tools/hv/ |
| 4959 | 4960 | ||
| 4960 | I2C OVER PARALLEL PORT | 4961 | I2C OVER PARALLEL PORT |
| 4961 | M: Jean Delvare <jdelvare@suse.de> | 4962 | M: Jean Delvare <jdelvare@suse.com> |
| 4962 | L: linux-i2c@vger.kernel.org | 4963 | L: linux-i2c@vger.kernel.org |
| 4963 | S: Maintained | 4964 | S: Maintained |
| 4964 | F: Documentation/i2c/busses/i2c-parport | 4965 | F: Documentation/i2c/busses/i2c-parport |
| @@ -4967,7 +4968,7 @@ F: drivers/i2c/busses/i2c-parport.c | |||
| 4967 | F: drivers/i2c/busses/i2c-parport-light.c | 4968 | F: drivers/i2c/busses/i2c-parport-light.c |
| 4968 | 4969 | ||
| 4969 | I2C/SMBUS CONTROLLER DRIVERS FOR PC | 4970 | I2C/SMBUS CONTROLLER DRIVERS FOR PC |
| 4970 | M: Jean Delvare <jdelvare@suse.de> | 4971 | M: Jean Delvare <jdelvare@suse.com> |
| 4971 | L: linux-i2c@vger.kernel.org | 4972 | L: linux-i2c@vger.kernel.org |
| 4972 | S: Maintained | 4973 | S: Maintained |
| 4973 | F: Documentation/i2c/busses/i2c-ali1535 | 4974 | F: Documentation/i2c/busses/i2c-ali1535 |
| @@ -5008,7 +5009,7 @@ F: drivers/i2c/busses/i2c-ismt.c | |||
| 5008 | F: Documentation/i2c/busses/i2c-ismt | 5009 | F: Documentation/i2c/busses/i2c-ismt |
| 5009 | 5010 | ||
| 5010 | I2C/SMBUS STUB DRIVER | 5011 | I2C/SMBUS STUB DRIVER |
| 5011 | M: Jean Delvare <jdelvare@suse.de> | 5012 | M: Jean Delvare <jdelvare@suse.com> |
| 5012 | L: linux-i2c@vger.kernel.org | 5013 | L: linux-i2c@vger.kernel.org |
| 5013 | S: Maintained | 5014 | S: Maintained |
| 5014 | F: drivers/i2c/i2c-stub.c | 5015 | F: drivers/i2c/i2c-stub.c |
| @@ -5035,7 +5036,7 @@ L: linux-acpi@vger.kernel.org | |||
| 5035 | S: Maintained | 5036 | S: Maintained |
| 5036 | 5037 | ||
| 5037 | I2C-TAOS-EVM DRIVER | 5038 | I2C-TAOS-EVM DRIVER |
| 5038 | M: Jean Delvare <jdelvare@suse.de> | 5039 | M: Jean Delvare <jdelvare@suse.com> |
| 5039 | L: linux-i2c@vger.kernel.org | 5040 | L: linux-i2c@vger.kernel.org |
| 5040 | S: Maintained | 5041 | S: Maintained |
| 5041 | F: Documentation/i2c/busses/i2c-taos-evm | 5042 | F: Documentation/i2c/busses/i2c-taos-evm |
| @@ -5564,8 +5565,8 @@ F: include/uapi/linux/ip_vs.h | |||
| 5564 | F: net/netfilter/ipvs/ | 5565 | F: net/netfilter/ipvs/ |
| 5565 | 5566 | ||
| 5566 | IPWIRELESS DRIVER | 5567 | IPWIRELESS DRIVER |
| 5567 | M: Jiri Kosina <jkosina@suse.cz> | 5568 | M: Jiri Kosina <jkosina@suse.com> |
| 5568 | M: David Sterba <dsterba@suse.cz> | 5569 | M: David Sterba <dsterba@suse.com> |
| 5569 | S: Odd Fixes | 5570 | S: Odd Fixes |
| 5570 | F: drivers/tty/ipwireless/ | 5571 | F: drivers/tty/ipwireless/ |
| 5571 | 5572 | ||
| @@ -5685,7 +5686,7 @@ S: Maintained | |||
| 5685 | F: drivers/isdn/hardware/eicon/ | 5686 | F: drivers/isdn/hardware/eicon/ |
| 5686 | 5687 | ||
| 5687 | IT87 HARDWARE MONITORING DRIVER | 5688 | IT87 HARDWARE MONITORING DRIVER |
| 5688 | M: Jean Delvare <jdelvare@suse.de> | 5689 | M: Jean Delvare <jdelvare@suse.com> |
| 5689 | L: lm-sensors@lm-sensors.org | 5690 | L: lm-sensors@lm-sensors.org |
| 5690 | S: Maintained | 5691 | S: Maintained |
| 5691 | F: Documentation/hwmon/it87 | 5692 | F: Documentation/hwmon/it87 |
| @@ -5752,7 +5753,7 @@ F: include/uapi/linux/jffs2.h | |||
| 5752 | 5753 | ||
| 5753 | JOURNALLING LAYER FOR BLOCK DEVICES (JBD) | 5754 | JOURNALLING LAYER FOR BLOCK DEVICES (JBD) |
| 5754 | M: Andrew Morton <akpm@linux-foundation.org> | 5755 | M: Andrew Morton <akpm@linux-foundation.org> |
| 5755 | M: Jan Kara <jack@suse.cz> | 5756 | M: Jan Kara <jack@suse.com> |
| 5756 | L: linux-ext4@vger.kernel.org | 5757 | L: linux-ext4@vger.kernel.org |
| 5757 | S: Maintained | 5758 | S: Maintained |
| 5758 | F: fs/jbd/ | 5759 | F: fs/jbd/ |
| @@ -5816,7 +5817,7 @@ S: Maintained | |||
| 5816 | F: fs/autofs4/ | 5817 | F: fs/autofs4/ |
| 5817 | 5818 | ||
| 5818 | KERNEL BUILD + files below scripts/ (unless maintained elsewhere) | 5819 | KERNEL BUILD + files below scripts/ (unless maintained elsewhere) |
| 5819 | M: Michal Marek <mmarek@suse.cz> | 5820 | M: Michal Marek <mmarek@suse.com> |
| 5820 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild.git for-next | 5821 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild.git for-next |
| 5821 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild.git rc-fixes | 5822 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild.git rc-fixes |
| 5822 | L: linux-kbuild@vger.kernel.org | 5823 | L: linux-kbuild@vger.kernel.org |
| @@ -5880,7 +5881,7 @@ F: arch/x86/include/asm/svm.h | |||
| 5880 | F: arch/x86/kvm/svm.c | 5881 | F: arch/x86/kvm/svm.c |
| 5881 | 5882 | ||
| 5882 | KERNEL VIRTUAL MACHINE (KVM) FOR POWERPC | 5883 | KERNEL VIRTUAL MACHINE (KVM) FOR POWERPC |
| 5883 | M: Alexander Graf <agraf@suse.de> | 5884 | M: Alexander Graf <agraf@suse.com> |
| 5884 | L: kvm-ppc@vger.kernel.org | 5885 | L: kvm-ppc@vger.kernel.org |
| 5885 | W: http://kvm.qumranet.com | 5886 | W: http://kvm.qumranet.com |
| 5886 | T: git git://github.com/agraf/linux-2.6.git | 5887 | T: git git://github.com/agraf/linux-2.6.git |
| @@ -6037,7 +6038,7 @@ F: drivers/leds/ | |||
| 6037 | F: include/linux/leds.h | 6038 | F: include/linux/leds.h |
| 6038 | 6039 | ||
| 6039 | LEGACY EEPROM DRIVER | 6040 | LEGACY EEPROM DRIVER |
| 6040 | M: Jean Delvare <jdelvare@suse.de> | 6041 | M: Jean Delvare <jdelvare@suse.com> |
| 6041 | S: Maintained | 6042 | S: Maintained |
| 6042 | F: Documentation/misc-devices/eeprom | 6043 | F: Documentation/misc-devices/eeprom |
| 6043 | F: drivers/misc/eeprom/eeprom.c | 6044 | F: drivers/misc/eeprom/eeprom.c |
| @@ -6090,7 +6091,7 @@ F: include/linux/ata.h | |||
| 6090 | F: include/linux/libata.h | 6091 | F: include/linux/libata.h |
| 6091 | 6092 | ||
| 6092 | LIBATA PATA ARASAN COMPACT FLASH CONTROLLER | 6093 | LIBATA PATA ARASAN COMPACT FLASH CONTROLLER |
| 6093 | M: Viresh Kumar <viresh.linux@gmail.com> | 6094 | M: Viresh Kumar <vireshk@kernel.org> |
| 6094 | L: linux-ide@vger.kernel.org | 6095 | L: linux-ide@vger.kernel.org |
| 6095 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git | 6096 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git |
| 6096 | S: Maintained | 6097 | S: Maintained |
| @@ -6251,8 +6252,8 @@ F: drivers/platform/x86/hp_accel.c | |||
| 6251 | LIVE PATCHING | 6252 | LIVE PATCHING |
| 6252 | M: Josh Poimboeuf <jpoimboe@redhat.com> | 6253 | M: Josh Poimboeuf <jpoimboe@redhat.com> |
| 6253 | M: Seth Jennings <sjenning@redhat.com> | 6254 | M: Seth Jennings <sjenning@redhat.com> |
| 6254 | M: Jiri Kosina <jkosina@suse.cz> | 6255 | M: Jiri Kosina <jkosina@suse.com> |
| 6255 | M: Vojtech Pavlik <vojtech@suse.cz> | 6256 | M: Vojtech Pavlik <vojtech@suse.com> |
| 6256 | S: Maintained | 6257 | S: Maintained |
| 6257 | F: kernel/livepatch/ | 6258 | F: kernel/livepatch/ |
| 6258 | F: include/linux/livepatch.h | 6259 | F: include/linux/livepatch.h |
| @@ -6278,21 +6279,21 @@ S: Maintained | |||
| 6278 | F: drivers/hwmon/lm73.c | 6279 | F: drivers/hwmon/lm73.c |
| 6279 | 6280 | ||
| 6280 | LM78 HARDWARE MONITOR DRIVER | 6281 | LM78 HARDWARE MONITOR DRIVER |
| 6281 | M: Jean Delvare <jdelvare@suse.de> | 6282 | M: Jean Delvare <jdelvare@suse.com> |
| 6282 | L: lm-sensors@lm-sensors.org | 6283 | L: lm-sensors@lm-sensors.org |
| 6283 | S: Maintained | 6284 | S: Maintained |
| 6284 | F: Documentation/hwmon/lm78 | 6285 | F: Documentation/hwmon/lm78 |
| 6285 | F: drivers/hwmon/lm78.c | 6286 | F: drivers/hwmon/lm78.c |
| 6286 | 6287 | ||
| 6287 | LM83 HARDWARE MONITOR DRIVER | 6288 | LM83 HARDWARE MONITOR DRIVER |
| 6288 | M: Jean Delvare <jdelvare@suse.de> | 6289 | M: Jean Delvare <jdelvare@suse.com> |
| 6289 | L: lm-sensors@lm-sensors.org | 6290 | L: lm-sensors@lm-sensors.org |
| 6290 | S: Maintained | 6291 | S: Maintained |
| 6291 | F: Documentation/hwmon/lm83 | 6292 | F: Documentation/hwmon/lm83 |
| 6292 | F: drivers/hwmon/lm83.c | 6293 | F: drivers/hwmon/lm83.c |
| 6293 | 6294 | ||
| 6294 | LM90 HARDWARE MONITOR DRIVER | 6295 | LM90 HARDWARE MONITOR DRIVER |
| 6295 | M: Jean Delvare <jdelvare@suse.de> | 6296 | M: Jean Delvare <jdelvare@suse.com> |
| 6296 | L: lm-sensors@lm-sensors.org | 6297 | L: lm-sensors@lm-sensors.org |
| 6297 | S: Maintained | 6298 | S: Maintained |
| 6298 | F: Documentation/hwmon/lm90 | 6299 | F: Documentation/hwmon/lm90 |
| @@ -7019,6 +7020,7 @@ F: include/uapi/linux/netfilter/ | |||
| 7019 | F: net/*/netfilter.c | 7020 | F: net/*/netfilter.c |
| 7020 | F: net/*/netfilter/ | 7021 | F: net/*/netfilter/ |
| 7021 | F: net/netfilter/ | 7022 | F: net/netfilter/ |
| 7023 | F: net/bridge/br_netfilter*.c | ||
| 7022 | 7024 | ||
| 7023 | NETLABEL | 7025 | NETLABEL |
| 7024 | M: Paul Moore <paul@paul-moore.com> | 7026 | M: Paul Moore <paul@paul-moore.com> |
| @@ -7718,7 +7720,7 @@ S: Maintained | |||
| 7718 | F: drivers/char/pc8736x_gpio.c | 7720 | F: drivers/char/pc8736x_gpio.c |
| 7719 | 7721 | ||
| 7720 | PC87427 HARDWARE MONITORING DRIVER | 7722 | PC87427 HARDWARE MONITORING DRIVER |
| 7721 | M: Jean Delvare <jdelvare@suse.de> | 7723 | M: Jean Delvare <jdelvare@suse.com> |
| 7722 | L: lm-sensors@lm-sensors.org | 7724 | L: lm-sensors@lm-sensors.org |
| 7723 | S: Maintained | 7725 | S: Maintained |
| 7724 | F: Documentation/hwmon/pc87427 | 7726 | F: Documentation/hwmon/pc87427 |
| @@ -7995,7 +7997,7 @@ S: Maintained | |||
| 7995 | F: drivers/pinctrl/samsung/ | 7997 | F: drivers/pinctrl/samsung/ |
| 7996 | 7998 | ||
| 7997 | PIN CONTROLLER - ST SPEAR | 7999 | PIN CONTROLLER - ST SPEAR |
| 7998 | M: Viresh Kumar <viresh.linux@gmail.com> | 8000 | M: Viresh Kumar <vireshk@kernel.org> |
| 7999 | L: spear-devel@list.st.com | 8001 | L: spear-devel@list.st.com |
| 8000 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 8002 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
| 8001 | W: http://www.st.com/spear | 8003 | W: http://www.st.com/spear |
| @@ -8003,7 +8005,7 @@ S: Maintained | |||
| 8003 | F: drivers/pinctrl/spear/ | 8005 | F: drivers/pinctrl/spear/ |
| 8004 | 8006 | ||
| 8005 | PKTCDVD DRIVER | 8007 | PKTCDVD DRIVER |
| 8006 | M: Jiri Kosina <jkosina@suse.cz> | 8008 | M: Jiri Kosina <jkosina@suse.com> |
| 8007 | S: Maintained | 8009 | S: Maintained |
| 8008 | F: drivers/block/pktcdvd.c | 8010 | F: drivers/block/pktcdvd.c |
| 8009 | F: include/linux/pktcdvd.h | 8011 | F: include/linux/pktcdvd.h |
| @@ -8894,7 +8896,7 @@ S: Maintained | |||
| 8894 | F: drivers/tty/serial/ | 8896 | F: drivers/tty/serial/ |
| 8895 | 8897 | ||
| 8896 | SYNOPSYS DESIGNWARE DMAC DRIVER | 8898 | SYNOPSYS DESIGNWARE DMAC DRIVER |
| 8897 | M: Viresh Kumar <viresh.linux@gmail.com> | 8899 | M: Viresh Kumar <vireshk@kernel.org> |
| 8898 | M: Andy Shevchenko <andriy.shevchenko@linux.intel.com> | 8900 | M: Andy Shevchenko <andriy.shevchenko@linux.intel.com> |
| 8899 | S: Maintained | 8901 | S: Maintained |
| 8900 | F: include/linux/dma/dw.h | 8902 | F: include/linux/dma/dw.h |
| @@ -9061,7 +9063,7 @@ S: Maintained | |||
| 9061 | F: drivers/mmc/host/sdhci-s3c* | 9063 | F: drivers/mmc/host/sdhci-s3c* |
| 9062 | 9064 | ||
| 9063 | SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) ST SPEAR DRIVER | 9065 | SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) ST SPEAR DRIVER |
| 9064 | M: Viresh Kumar <viresh.linux@gmail.com> | 9066 | M: Viresh Kumar <vireshk@kernel.org> |
| 9065 | L: spear-devel@list.st.com | 9067 | L: spear-devel@list.st.com |
| 9066 | L: linux-mmc@vger.kernel.org | 9068 | L: linux-mmc@vger.kernel.org |
| 9067 | S: Maintained | 9069 | S: Maintained |
| @@ -9423,7 +9425,7 @@ F: Documentation/hwmon/sch5627 | |||
| 9423 | F: drivers/hwmon/sch5627.c | 9425 | F: drivers/hwmon/sch5627.c |
| 9424 | 9426 | ||
| 9425 | SMSC47B397 HARDWARE MONITOR DRIVER | 9427 | SMSC47B397 HARDWARE MONITOR DRIVER |
| 9426 | M: Jean Delvare <jdelvare@suse.de> | 9428 | M: Jean Delvare <jdelvare@suse.com> |
| 9427 | L: lm-sensors@lm-sensors.org | 9429 | L: lm-sensors@lm-sensors.org |
| 9428 | S: Maintained | 9430 | S: Maintained |
| 9429 | F: Documentation/hwmon/smsc47b397 | 9431 | F: Documentation/hwmon/smsc47b397 |
| @@ -9472,7 +9474,7 @@ S: Supported | |||
| 9472 | F: drivers/media/pci/solo6x10/ | 9474 | F: drivers/media/pci/solo6x10/ |
| 9473 | 9475 | ||
| 9474 | SOFTWARE RAID (Multiple Disks) SUPPORT | 9476 | SOFTWARE RAID (Multiple Disks) SUPPORT |
| 9475 | M: Neil Brown <neilb@suse.de> | 9477 | M: Neil Brown <neilb@suse.com> |
| 9476 | L: linux-raid@vger.kernel.org | 9478 | L: linux-raid@vger.kernel.org |
| 9477 | S: Supported | 9479 | S: Supported |
| 9478 | F: drivers/md/ | 9480 | F: drivers/md/ |
| @@ -9515,7 +9517,7 @@ F: drivers/memstick/core/ms_block.* | |||
| 9515 | 9517 | ||
| 9516 | SOUND | 9518 | SOUND |
| 9517 | M: Jaroslav Kysela <perex@perex.cz> | 9519 | M: Jaroslav Kysela <perex@perex.cz> |
| 9518 | M: Takashi Iwai <tiwai@suse.de> | 9520 | M: Takashi Iwai <tiwai@suse.com> |
| 9519 | L: alsa-devel@alsa-project.org (moderated for non-subscribers) | 9521 | L: alsa-devel@alsa-project.org (moderated for non-subscribers) |
| 9520 | W: http://www.alsa-project.org/ | 9522 | W: http://www.alsa-project.org/ |
| 9521 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git | 9523 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git |
| @@ -9599,7 +9601,7 @@ S: Maintained | |||
| 9599 | F: include/linux/compiler.h | 9601 | F: include/linux/compiler.h |
| 9600 | 9602 | ||
| 9601 | SPEAR PLATFORM SUPPORT | 9603 | SPEAR PLATFORM SUPPORT |
| 9602 | M: Viresh Kumar <viresh.linux@gmail.com> | 9604 | M: Viresh Kumar <vireshk@kernel.org> |
| 9603 | M: Shiraz Hashim <shiraz.linux.kernel@gmail.com> | 9605 | M: Shiraz Hashim <shiraz.linux.kernel@gmail.com> |
| 9604 | L: spear-devel@list.st.com | 9606 | L: spear-devel@list.st.com |
| 9605 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 9607 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
| @@ -9608,7 +9610,7 @@ S: Maintained | |||
| 9608 | F: arch/arm/mach-spear/ | 9610 | F: arch/arm/mach-spear/ |
| 9609 | 9611 | ||
| 9610 | SPEAR CLOCK FRAMEWORK SUPPORT | 9612 | SPEAR CLOCK FRAMEWORK SUPPORT |
| 9611 | M: Viresh Kumar <viresh.linux@gmail.com> | 9613 | M: Viresh Kumar <vireshk@kernel.org> |
| 9612 | L: spear-devel@list.st.com | 9614 | L: spear-devel@list.st.com |
| 9613 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 9615 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
| 9614 | W: http://www.st.com/spear | 9616 | W: http://www.st.com/spear |
| @@ -10398,7 +10400,7 @@ K: ^Subject:.*(?i)trivial | |||
| 10398 | 10400 | ||
| 10399 | TTY LAYER | 10401 | TTY LAYER |
| 10400 | M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 10402 | M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| 10401 | M: Jiri Slaby <jslaby@suse.cz> | 10403 | M: Jiri Slaby <jslaby@suse.com> |
| 10402 | S: Supported | 10404 | S: Supported |
| 10403 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty.git | 10405 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty.git |
| 10404 | F: Documentation/serial/ | 10406 | F: Documentation/serial/ |
| @@ -10472,7 +10474,7 @@ F: arch/m68k/*/*_no.* | |||
| 10472 | F: arch/m68k/include/asm/*_no.* | 10474 | F: arch/m68k/include/asm/*_no.* |
| 10473 | 10475 | ||
| 10474 | UDF FILESYSTEM | 10476 | UDF FILESYSTEM |
| 10475 | M: Jan Kara <jack@suse.cz> | 10477 | M: Jan Kara <jack@suse.com> |
| 10476 | S: Maintained | 10478 | S: Maintained |
| 10477 | F: Documentation/filesystems/udf.txt | 10479 | F: Documentation/filesystems/udf.txt |
| 10478 | F: fs/udf/ | 10480 | F: fs/udf/ |
| @@ -10615,7 +10617,7 @@ F: drivers/usb/gadget/ | |||
| 10615 | F: include/linux/usb/gadget* | 10617 | F: include/linux/usb/gadget* |
| 10616 | 10618 | ||
| 10617 | USB HID/HIDBP DRIVERS (USB KEYBOARDS, MICE, REMOTE CONTROLS, ...) | 10619 | USB HID/HIDBP DRIVERS (USB KEYBOARDS, MICE, REMOTE CONTROLS, ...) |
| 10618 | M: Jiri Kosina <jkosina@suse.cz> | 10620 | M: Jiri Kosina <jkosina@suse.com> |
| 10619 | L: linux-usb@vger.kernel.org | 10621 | L: linux-usb@vger.kernel.org |
| 10620 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid.git | 10622 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid.git |
| 10621 | S: Maintained | 10623 | S: Maintained |
| @@ -10740,7 +10742,7 @@ S: Maintained | |||
| 10740 | F: drivers/usb/host/uhci* | 10742 | F: drivers/usb/host/uhci* |
| 10741 | 10743 | ||
| 10742 | USB "USBNET" DRIVER FRAMEWORK | 10744 | USB "USBNET" DRIVER FRAMEWORK |
| 10743 | M: Oliver Neukum <oneukum@suse.de> | 10745 | M: Oliver Neukum <oneukum@suse.com> |
| 10744 | L: netdev@vger.kernel.org | 10746 | L: netdev@vger.kernel.org |
| 10745 | W: http://www.linux-usb.org/usbnet | 10747 | W: http://www.linux-usb.org/usbnet |
| 10746 | S: Maintained | 10748 | S: Maintained |
| @@ -11067,7 +11069,7 @@ F: Documentation/hwmon/w83793 | |||
| 11067 | F: drivers/hwmon/w83793.c | 11069 | F: drivers/hwmon/w83793.c |
| 11068 | 11070 | ||
| 11069 | W83795 HARDWARE MONITORING DRIVER | 11071 | W83795 HARDWARE MONITORING DRIVER |
| 11070 | M: Jean Delvare <jdelvare@suse.de> | 11072 | M: Jean Delvare <jdelvare@suse.com> |
| 11071 | L: lm-sensors@lm-sensors.org | 11073 | L: lm-sensors@lm-sensors.org |
| 11072 | S: Maintained | 11074 | S: Maintained |
| 11073 | F: drivers/hwmon/w83795.c | 11075 | F: drivers/hwmon/w83795.c |
| @@ -1,7 +1,7 @@ | |||
| 1 | VERSION = 4 | 1 | VERSION = 4 |
| 2 | PATCHLEVEL = 2 | 2 | PATCHLEVEL = 2 |
| 3 | SUBLEVEL = 0 | 3 | SUBLEVEL = 0 |
| 4 | EXTRAVERSION = -rc2 | 4 | EXTRAVERSION = -rc3 |
| 5 | NAME = Hurr durr I'ma sheep | 5 | NAME = Hurr durr I'ma sheep |
| 6 | 6 | ||
| 7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
| @@ -780,10 +780,11 @@ endif | |||
| 780 | include scripts/Makefile.kasan | 780 | include scripts/Makefile.kasan |
| 781 | include scripts/Makefile.extrawarn | 781 | include scripts/Makefile.extrawarn |
| 782 | 782 | ||
| 783 | # Add user supplied CPPFLAGS, AFLAGS and CFLAGS as the last assignments | 783 | # Add any arch overrides and user supplied CPPFLAGS, AFLAGS and CFLAGS as the |
| 784 | KBUILD_CPPFLAGS += $(KCPPFLAGS) | 784 | # last assignments |
| 785 | KBUILD_AFLAGS += $(KAFLAGS) | 785 | KBUILD_CPPFLAGS += $(ARCH_CPPFLAGS) $(KCPPFLAGS) |
| 786 | KBUILD_CFLAGS += $(KCFLAGS) | 786 | KBUILD_AFLAGS += $(ARCH_AFLAGS) $(KAFLAGS) |
| 787 | KBUILD_CFLAGS += $(ARCH_CFLAGS) $(KCFLAGS) | ||
| 787 | 788 | ||
| 788 | # Use --build-id when available. | 789 | # Use --build-id when available. |
| 789 | LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,\ | 790 | LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,\ |
diff --git a/arch/Kconfig b/arch/Kconfig index bec6666a3cc4..8a8ea7110de8 100644 --- a/arch/Kconfig +++ b/arch/Kconfig | |||
| @@ -221,6 +221,10 @@ config ARCH_TASK_STRUCT_ALLOCATOR | |||
| 221 | config ARCH_THREAD_INFO_ALLOCATOR | 221 | config ARCH_THREAD_INFO_ALLOCATOR |
| 222 | bool | 222 | bool |
| 223 | 223 | ||
| 224 | # Select if arch wants to size task_struct dynamically via arch_task_struct_size: | ||
| 225 | config ARCH_WANTS_DYNAMIC_TASK_STRUCT | ||
| 226 | bool | ||
| 227 | |||
| 224 | config HAVE_REGS_AND_STACK_ACCESS_API | 228 | config HAVE_REGS_AND_STACK_ACCESS_API |
| 225 | bool | 229 | bool |
| 226 | help | 230 | help |
diff --git a/arch/alpha/include/asm/Kbuild b/arch/alpha/include/asm/Kbuild index cde23cd03609..ffd9cf5ec8c4 100644 --- a/arch/alpha/include/asm/Kbuild +++ b/arch/alpha/include/asm/Kbuild | |||
| @@ -5,6 +5,7 @@ generic-y += cputime.h | |||
| 5 | generic-y += exec.h | 5 | generic-y += exec.h |
| 6 | generic-y += irq_work.h | 6 | generic-y += irq_work.h |
| 7 | generic-y += mcs_spinlock.h | 7 | generic-y += mcs_spinlock.h |
| 8 | generic-y += mm-arch-hooks.h | ||
| 8 | generic-y += preempt.h | 9 | generic-y += preempt.h |
| 9 | generic-y += sections.h | 10 | generic-y += sections.h |
| 10 | generic-y += trace_clock.h | 11 | generic-y += trace_clock.h |
diff --git a/arch/alpha/include/asm/mm-arch-hooks.h b/arch/alpha/include/asm/mm-arch-hooks.h deleted file mode 100644 index b07fd862fec3..000000000000 --- a/arch/alpha/include/asm/mm-arch-hooks.h +++ /dev/null | |||
| @@ -1,15 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Architecture specific mm hooks | ||
| 3 | * | ||
| 4 | * Copyright (C) 2015, IBM Corporation | ||
| 5 | * Author: Laurent Dufour <ldufour@linux.vnet.ibm.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef _ASM_ALPHA_MM_ARCH_HOOKS_H | ||
| 13 | #define _ASM_ALPHA_MM_ARCH_HOOKS_H | ||
| 14 | |||
| 15 | #endif /* _ASM_ALPHA_MM_ARCH_HOOKS_H */ | ||
diff --git a/arch/arc/Kconfig b/arch/arc/Kconfig index e7cee0a5c56d..91cf4055acab 100644 --- a/arch/arc/Kconfig +++ b/arch/arc/Kconfig | |||
| @@ -115,6 +115,7 @@ if ISA_ARCOMPACT | |||
| 115 | 115 | ||
| 116 | config ARC_CPU_750D | 116 | config ARC_CPU_750D |
| 117 | bool "ARC750D" | 117 | bool "ARC750D" |
| 118 | select ARC_CANT_LLSC | ||
| 118 | help | 119 | help |
| 119 | Support for ARC750 core | 120 | Support for ARC750 core |
| 120 | 121 | ||
| @@ -362,7 +363,7 @@ config ARC_CANT_LLSC | |||
| 362 | config ARC_HAS_LLSC | 363 | config ARC_HAS_LLSC |
| 363 | bool "Insn: LLOCK/SCOND (efficient atomic ops)" | 364 | bool "Insn: LLOCK/SCOND (efficient atomic ops)" |
| 364 | default y | 365 | default y |
| 365 | depends on !ARC_CPU_750D && !ARC_CANT_LLSC | 366 | depends on !ARC_CANT_LLSC |
| 366 | 367 | ||
| 367 | config ARC_HAS_SWAPE | 368 | config ARC_HAS_SWAPE |
| 368 | bool "Insn: SWAPE (endian-swap)" | 369 | bool "Insn: SWAPE (endian-swap)" |
diff --git a/arch/arc/Makefile b/arch/arc/Makefile index 6107062c0111..46d87310220d 100644 --- a/arch/arc/Makefile +++ b/arch/arc/Makefile | |||
| @@ -49,7 +49,8 @@ endif | |||
| 49 | 49 | ||
| 50 | ifndef CONFIG_CC_OPTIMIZE_FOR_SIZE | 50 | ifndef CONFIG_CC_OPTIMIZE_FOR_SIZE |
| 51 | # Generic build system uses -O2, we want -O3 | 51 | # Generic build system uses -O2, we want -O3 |
| 52 | cflags-y += -O3 | 52 | # Note: No need to add to cflags-y as that happens anyways |
| 53 | ARCH_CFLAGS += -O3 | ||
| 53 | endif | 54 | endif |
| 54 | 55 | ||
| 55 | # small data is default for elf32 tool-chain. If not usable, disable it | 56 | # small data is default for elf32 tool-chain. If not usable, disable it |
diff --git a/arch/arc/boot/dts/axc003.dtsi b/arch/arc/boot/dts/axc003.dtsi index 15c8d6226c9d..1cd5e82f5dc2 100644 --- a/arch/arc/boot/dts/axc003.dtsi +++ b/arch/arc/boot/dts/axc003.dtsi | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | 12 | ||
| 13 | / { | 13 | / { |
| 14 | compatible = "snps,arc"; | 14 | compatible = "snps,arc"; |
| 15 | clock-frequency = <75000000>; | 15 | clock-frequency = <90000000>; |
| 16 | #address-cells = <1>; | 16 | #address-cells = <1>; |
| 17 | #size-cells = <1>; | 17 | #size-cells = <1>; |
| 18 | 18 | ||
diff --git a/arch/arc/boot/dts/axc003_idu.dtsi b/arch/arc/boot/dts/axc003_idu.dtsi index 199d42820eca..2f0b33257db2 100644 --- a/arch/arc/boot/dts/axc003_idu.dtsi +++ b/arch/arc/boot/dts/axc003_idu.dtsi | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | 12 | ||
| 13 | / { | 13 | / { |
| 14 | compatible = "snps,arc"; | 14 | compatible = "snps,arc"; |
| 15 | clock-frequency = <75000000>; | 15 | clock-frequency = <90000000>; |
| 16 | #address-cells = <1>; | 16 | #address-cells = <1>; |
| 17 | #size-cells = <1>; | 17 | #size-cells = <1>; |
| 18 | 18 | ||
diff --git a/arch/arc/include/asm/Kbuild b/arch/arc/include/asm/Kbuild index 1a80cc91a03b..7611b10a2d23 100644 --- a/arch/arc/include/asm/Kbuild +++ b/arch/arc/include/asm/Kbuild | |||
| @@ -22,6 +22,7 @@ generic-y += kvm_para.h | |||
| 22 | generic-y += local.h | 22 | generic-y += local.h |
| 23 | generic-y += local64.h | 23 | generic-y += local64.h |
| 24 | generic-y += mcs_spinlock.h | 24 | generic-y += mcs_spinlock.h |
| 25 | generic-y += mm-arch-hooks.h | ||
| 25 | generic-y += mman.h | 26 | generic-y += mman.h |
| 26 | generic-y += msgbuf.h | 27 | generic-y += msgbuf.h |
| 27 | generic-y += param.h | 28 | generic-y += param.h |
diff --git a/arch/arc/include/asm/bitops.h b/arch/arc/include/asm/bitops.h index 99fe118d3730..57c1f33844d4 100644 --- a/arch/arc/include/asm/bitops.h +++ b/arch/arc/include/asm/bitops.h | |||
| @@ -50,8 +50,7 @@ static inline void op##_bit(unsigned long nr, volatile unsigned long *m)\ | |||
| 50 | * done for const @nr, but no code is generated due to gcc \ | 50 | * done for const @nr, but no code is generated due to gcc \ |
| 51 | * const prop. \ | 51 | * const prop. \ |
| 52 | */ \ | 52 | */ \ |
| 53 | if (__builtin_constant_p(nr)) \ | 53 | nr &= 0x1f; \ |
| 54 | nr &= 0x1f; \ | ||
| 55 | \ | 54 | \ |
| 56 | __asm__ __volatile__( \ | 55 | __asm__ __volatile__( \ |
| 57 | "1: llock %0, [%1] \n" \ | 56 | "1: llock %0, [%1] \n" \ |
| @@ -82,8 +81,7 @@ static inline int test_and_##op##_bit(unsigned long nr, volatile unsigned long * | |||
| 82 | \ | 81 | \ |
| 83 | m += nr >> 5; \ | 82 | m += nr >> 5; \ |
| 84 | \ | 83 | \ |
| 85 | if (__builtin_constant_p(nr)) \ | 84 | nr &= 0x1f; \ |
| 86 | nr &= 0x1f; \ | ||
| 87 | \ | 85 | \ |
| 88 | /* \ | 86 | /* \ |
| 89 | * Explicit full memory barrier needed before/after as \ | 87 | * Explicit full memory barrier needed before/after as \ |
| @@ -129,16 +127,13 @@ static inline void op##_bit(unsigned long nr, volatile unsigned long *m)\ | |||
| 129 | unsigned long temp, flags; \ | 127 | unsigned long temp, flags; \ |
| 130 | m += nr >> 5; \ | 128 | m += nr >> 5; \ |
| 131 | \ | 129 | \ |
| 132 | if (__builtin_constant_p(nr)) \ | ||
| 133 | nr &= 0x1f; \ | ||
| 134 | \ | ||
| 135 | /* \ | 130 | /* \ |
| 136 | * spin lock/unlock provide the needed smp_mb() before/after \ | 131 | * spin lock/unlock provide the needed smp_mb() before/after \ |
| 137 | */ \ | 132 | */ \ |
| 138 | bitops_lock(flags); \ | 133 | bitops_lock(flags); \ |
| 139 | \ | 134 | \ |
| 140 | temp = *m; \ | 135 | temp = *m; \ |
| 141 | *m = temp c_op (1UL << nr); \ | 136 | *m = temp c_op (1UL << (nr & 0x1f)); \ |
| 142 | \ | 137 | \ |
| 143 | bitops_unlock(flags); \ | 138 | bitops_unlock(flags); \ |
| 144 | } | 139 | } |
| @@ -149,17 +144,14 @@ static inline int test_and_##op##_bit(unsigned long nr, volatile unsigned long * | |||
| 149 | unsigned long old, flags; \ | 144 | unsigned long old, flags; \ |
| 150 | m += nr >> 5; \ | 145 | m += nr >> 5; \ |
| 151 | \ | 146 | \ |
| 152 | if (__builtin_constant_p(nr)) \ | ||
| 153 | nr &= 0x1f; \ | ||
| 154 | \ | ||
| 155 | bitops_lock(flags); \ | 147 | bitops_lock(flags); \ |
| 156 | \ | 148 | \ |
| 157 | old = *m; \ | 149 | old = *m; \ |
| 158 | *m = old c_op (1 << nr); \ | 150 | *m = old c_op (1UL << (nr & 0x1f)); \ |
| 159 | \ | 151 | \ |
| 160 | bitops_unlock(flags); \ | 152 | bitops_unlock(flags); \ |
| 161 | \ | 153 | \ |
| 162 | return (old & (1 << nr)) != 0; \ | 154 | return (old & (1UL << (nr & 0x1f))) != 0; \ |
| 163 | } | 155 | } |
| 164 | 156 | ||
| 165 | #endif /* CONFIG_ARC_HAS_LLSC */ | 157 | #endif /* CONFIG_ARC_HAS_LLSC */ |
| @@ -174,11 +166,8 @@ static inline void __##op##_bit(unsigned long nr, volatile unsigned long *m) \ | |||
| 174 | unsigned long temp; \ | 166 | unsigned long temp; \ |
| 175 | m += nr >> 5; \ | 167 | m += nr >> 5; \ |
| 176 | \ | 168 | \ |
| 177 | if (__builtin_constant_p(nr)) \ | ||
| 178 | nr &= 0x1f; \ | ||
| 179 | \ | ||
| 180 | temp = *m; \ | 169 | temp = *m; \ |
| 181 | *m = temp c_op (1UL << nr); \ | 170 | *m = temp c_op (1UL << (nr & 0x1f)); \ |
| 182 | } | 171 | } |
| 183 | 172 | ||
| 184 | #define __TEST_N_BIT_OP(op, c_op, asm_op) \ | 173 | #define __TEST_N_BIT_OP(op, c_op, asm_op) \ |
| @@ -187,13 +176,10 @@ static inline int __test_and_##op##_bit(unsigned long nr, volatile unsigned long | |||
| 187 | unsigned long old; \ | 176 | unsigned long old; \ |
| 188 | m += nr >> 5; \ | 177 | m += nr >> 5; \ |
| 189 | \ | 178 | \ |
| 190 | if (__builtin_constant_p(nr)) \ | ||
| 191 | nr &= 0x1f; \ | ||
| 192 | \ | ||
| 193 | old = *m; \ | 179 | old = *m; \ |
| 194 | *m = old c_op (1 << nr); \ | 180 | *m = old c_op (1UL << (nr & 0x1f)); \ |
| 195 | \ | 181 | \ |
| 196 | return (old & (1 << nr)) != 0; \ | 182 | return (old & (1UL << (nr & 0x1f))) != 0; \ |
| 197 | } | 183 | } |
| 198 | 184 | ||
| 199 | #define BIT_OPS(op, c_op, asm_op) \ | 185 | #define BIT_OPS(op, c_op, asm_op) \ |
| @@ -224,10 +210,7 @@ test_bit(unsigned int nr, const volatile unsigned long *addr) | |||
| 224 | 210 | ||
| 225 | addr += nr >> 5; | 211 | addr += nr >> 5; |
| 226 | 212 | ||
| 227 | if (__builtin_constant_p(nr)) | 213 | mask = 1UL << (nr & 0x1f); |
| 228 | nr &= 0x1f; | ||
| 229 | |||
| 230 | mask = 1 << nr; | ||
| 231 | 214 | ||
| 232 | return ((mask & *addr) != 0); | 215 | return ((mask & *addr) != 0); |
| 233 | } | 216 | } |
diff --git a/arch/arc/include/asm/futex.h b/arch/arc/include/asm/futex.h index 05b5aaf5b0f9..70cfe16b742d 100644 --- a/arch/arc/include/asm/futex.h +++ b/arch/arc/include/asm/futex.h | |||
| @@ -16,12 +16,40 @@ | |||
| 16 | #include <linux/uaccess.h> | 16 | #include <linux/uaccess.h> |
| 17 | #include <asm/errno.h> | 17 | #include <asm/errno.h> |
| 18 | 18 | ||
| 19 | #ifdef CONFIG_ARC_HAS_LLSC | ||
| 20 | |||
| 21 | #define __futex_atomic_op(insn, ret, oldval, uaddr, oparg)\ | ||
| 22 | \ | ||
| 23 | __asm__ __volatile__( \ | ||
| 24 | "1: llock %1, [%2] \n" \ | ||
| 25 | insn "\n" \ | ||
| 26 | "2: scond %0, [%2] \n" \ | ||
| 27 | " bnz 1b \n" \ | ||
| 28 | " mov %0, 0 \n" \ | ||
| 29 | "3: \n" \ | ||
| 30 | " .section .fixup,\"ax\" \n" \ | ||
| 31 | " .align 4 \n" \ | ||
| 32 | "4: mov %0, %4 \n" \ | ||
| 33 | " b 3b \n" \ | ||
| 34 | " .previous \n" \ | ||
| 35 | " .section __ex_table,\"a\" \n" \ | ||
| 36 | " .align 4 \n" \ | ||
| 37 | " .word 1b, 4b \n" \ | ||
| 38 | " .word 2b, 4b \n" \ | ||
| 39 | " .previous \n" \ | ||
| 40 | \ | ||
| 41 | : "=&r" (ret), "=&r" (oldval) \ | ||
| 42 | : "r" (uaddr), "r" (oparg), "ir" (-EFAULT) \ | ||
| 43 | : "cc", "memory") | ||
| 44 | |||
| 45 | #else /* !CONFIG_ARC_HAS_LLSC */ | ||
| 46 | |||
| 19 | #define __futex_atomic_op(insn, ret, oldval, uaddr, oparg)\ | 47 | #define __futex_atomic_op(insn, ret, oldval, uaddr, oparg)\ |
| 20 | \ | 48 | \ |
| 21 | __asm__ __volatile__( \ | 49 | __asm__ __volatile__( \ |
| 22 | "1: ld %1, [%2] \n" \ | 50 | "1: ld %1, [%2] \n" \ |
| 23 | insn "\n" \ | 51 | insn "\n" \ |
| 24 | "2: st %0, [%2] \n" \ | 52 | "2: st %0, [%2] \n" \ |
| 25 | " mov %0, 0 \n" \ | 53 | " mov %0, 0 \n" \ |
| 26 | "3: \n" \ | 54 | "3: \n" \ |
| 27 | " .section .fixup,\"ax\" \n" \ | 55 | " .section .fixup,\"ax\" \n" \ |
| @@ -39,6 +67,8 @@ | |||
| 39 | : "r" (uaddr), "r" (oparg), "ir" (-EFAULT) \ | 67 | : "r" (uaddr), "r" (oparg), "ir" (-EFAULT) \ |
| 40 | : "cc", "memory") | 68 | : "cc", "memory") |
| 41 | 69 | ||
| 70 | #endif | ||
| 71 | |||
| 42 | static inline int futex_atomic_op_inuser(int encoded_op, u32 __user *uaddr) | 72 | static inline int futex_atomic_op_inuser(int encoded_op, u32 __user *uaddr) |
| 43 | { | 73 | { |
| 44 | int op = (encoded_op >> 28) & 7; | 74 | int op = (encoded_op >> 28) & 7; |
| @@ -123,11 +153,17 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, u32 oldval, | |||
| 123 | 153 | ||
| 124 | pagefault_disable(); | 154 | pagefault_disable(); |
| 125 | 155 | ||
| 126 | /* TBD : can use llock/scond */ | ||
| 127 | __asm__ __volatile__( | 156 | __asm__ __volatile__( |
| 128 | "1: ld %0, [%3] \n" | 157 | #ifdef CONFIG_ARC_HAS_LLSC |
| 129 | " brne %0, %1, 3f \n" | 158 | "1: llock %0, [%3] \n" |
| 130 | "2: st %2, [%3] \n" | 159 | " brne %0, %1, 3f \n" |
| 160 | "2: scond %2, [%3] \n" | ||
| 161 | " bnz 1b \n" | ||
| 162 | #else | ||
| 163 | "1: ld %0, [%3] \n" | ||
| 164 | " brne %0, %1, 3f \n" | ||
| 165 | "2: st %2, [%3] \n" | ||
| 166 | #endif | ||
| 131 | "3: \n" | 167 | "3: \n" |
| 132 | " .section .fixup,\"ax\" \n" | 168 | " .section .fixup,\"ax\" \n" |
| 133 | "4: mov %0, %4 \n" | 169 | "4: mov %0, %4 \n" |
diff --git a/arch/arc/include/asm/mm-arch-hooks.h b/arch/arc/include/asm/mm-arch-hooks.h deleted file mode 100644 index c37541c5f8ba..000000000000 --- a/arch/arc/include/asm/mm-arch-hooks.h +++ /dev/null | |||
| @@ -1,15 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Architecture specific mm hooks | ||
| 3 | * | ||
| 4 | * Copyright (C) 2015, IBM Corporation | ||
| 5 | * Author: Laurent Dufour <ldufour@linux.vnet.ibm.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef _ASM_ARC_MM_ARCH_HOOKS_H | ||
| 13 | #define _ASM_ARC_MM_ARCH_HOOKS_H | ||
| 14 | |||
| 15 | #endif /* _ASM_ARC_MM_ARCH_HOOKS_H */ | ||
diff --git a/arch/arc/include/asm/ptrace.h b/arch/arc/include/asm/ptrace.h index 91755972b9a2..91694ec1ce95 100644 --- a/arch/arc/include/asm/ptrace.h +++ b/arch/arc/include/asm/ptrace.h | |||
| @@ -106,7 +106,7 @@ struct callee_regs { | |||
| 106 | long r25, r24, r23, r22, r21, r20, r19, r18, r17, r16, r15, r14, r13; | 106 | long r25, r24, r23, r22, r21, r20, r19, r18, r17, r16, r15, r14, r13; |
| 107 | }; | 107 | }; |
| 108 | 108 | ||
| 109 | #define instruction_pointer(regs) ((regs)->ret) | 109 | #define instruction_pointer(regs) (unsigned long)((regs)->ret) |
| 110 | #define profile_pc(regs) instruction_pointer(regs) | 110 | #define profile_pc(regs) instruction_pointer(regs) |
| 111 | 111 | ||
| 112 | /* return 1 if user mode or 0 if kernel mode */ | 112 | /* return 1 if user mode or 0 if kernel mode */ |
diff --git a/arch/arc/kernel/intc-arcv2.c b/arch/arc/kernel/intc-arcv2.c index 6208c630abed..26c156827479 100644 --- a/arch/arc/kernel/intc-arcv2.c +++ b/arch/arc/kernel/intc-arcv2.c | |||
| @@ -12,7 +12,6 @@ | |||
| 12 | #include <linux/of.h> | 12 | #include <linux/of.h> |
| 13 | #include <linux/irqdomain.h> | 13 | #include <linux/irqdomain.h> |
| 14 | #include <linux/irqchip.h> | 14 | #include <linux/irqchip.h> |
| 15 | #include "../../drivers/irqchip/irqchip.h" | ||
| 16 | #include <asm/irq.h> | 15 | #include <asm/irq.h> |
| 17 | 16 | ||
| 18 | /* | 17 | /* |
diff --git a/arch/arc/kernel/intc-compact.c b/arch/arc/kernel/intc-compact.c index fcdddb631766..039fac30b5c1 100644 --- a/arch/arc/kernel/intc-compact.c +++ b/arch/arc/kernel/intc-compact.c | |||
| @@ -12,7 +12,6 @@ | |||
| 12 | #include <linux/of.h> | 12 | #include <linux/of.h> |
| 13 | #include <linux/irqdomain.h> | 13 | #include <linux/irqdomain.h> |
| 14 | #include <linux/irqchip.h> | 14 | #include <linux/irqchip.h> |
| 15 | #include "../../drivers/irqchip/irqchip.h" | ||
| 16 | #include <asm/irq.h> | 15 | #include <asm/irq.h> |
| 17 | 16 | ||
| 18 | /* | 17 | /* |
diff --git a/arch/arc/kernel/mcip.c b/arch/arc/kernel/mcip.c index 30284e8de6ff..2fb86589054d 100644 --- a/arch/arc/kernel/mcip.c +++ b/arch/arc/kernel/mcip.c | |||
| @@ -175,7 +175,6 @@ void mcip_init_early_smp(void) | |||
| 175 | #include <linux/irqchip.h> | 175 | #include <linux/irqchip.h> |
| 176 | #include <linux/of.h> | 176 | #include <linux/of.h> |
| 177 | #include <linux/of_irq.h> | 177 | #include <linux/of_irq.h> |
| 178 | #include "../../drivers/irqchip/irqchip.h" | ||
| 179 | 178 | ||
| 180 | /* | 179 | /* |
| 181 | * Set the DEST for @cmn_irq to @cpu_mask (1 bit per core) | 180 | * Set the DEST for @cmn_irq to @cpu_mask (1 bit per core) |
| @@ -218,11 +217,28 @@ static void idu_irq_unmask(struct irq_data *data) | |||
| 218 | raw_spin_unlock_irqrestore(&mcip_lock, flags); | 217 | raw_spin_unlock_irqrestore(&mcip_lock, flags); |
| 219 | } | 218 | } |
| 220 | 219 | ||
| 220 | #ifdef CONFIG_SMP | ||
| 221 | static int | 221 | static int |
| 222 | idu_irq_set_affinity(struct irq_data *d, const struct cpumask *cpumask, bool f) | 222 | idu_irq_set_affinity(struct irq_data *data, const struct cpumask *cpumask, |
| 223 | bool force) | ||
| 223 | { | 224 | { |
| 225 | unsigned long flags; | ||
| 226 | cpumask_t online; | ||
| 227 | |||
| 228 | /* errout if no online cpu per @cpumask */ | ||
| 229 | if (!cpumask_and(&online, cpumask, cpu_online_mask)) | ||
| 230 | return -EINVAL; | ||
| 231 | |||
| 232 | raw_spin_lock_irqsave(&mcip_lock, flags); | ||
| 233 | |||
| 234 | idu_set_dest(data->hwirq, cpumask_bits(&online)[0]); | ||
| 235 | idu_set_mode(data->hwirq, IDU_M_TRIG_LEVEL, IDU_M_DISTRI_RR); | ||
| 236 | |||
| 237 | raw_spin_unlock_irqrestore(&mcip_lock, flags); | ||
| 238 | |||
| 224 | return IRQ_SET_MASK_OK; | 239 | return IRQ_SET_MASK_OK; |
| 225 | } | 240 | } |
| 241 | #endif | ||
| 226 | 242 | ||
| 227 | static struct irq_chip idu_irq_chip = { | 243 | static struct irq_chip idu_irq_chip = { |
| 228 | .name = "MCIP IDU Intc", | 244 | .name = "MCIP IDU Intc", |
| @@ -330,8 +346,7 @@ idu_of_init(struct device_node *intc, struct device_node *parent) | |||
| 330 | if (!i) | 346 | if (!i) |
| 331 | idu_first_irq = irq; | 347 | idu_first_irq = irq; |
| 332 | 348 | ||
| 333 | irq_set_handler_data(irq, domain); | 349 | irq_set_chained_handler_and_data(irq, idu_cascade_isr, domain); |
| 334 | irq_set_chained_handler(irq, idu_cascade_isr); | ||
| 335 | } | 350 | } |
| 336 | 351 | ||
| 337 | __mcip_cmd(CMD_IDU_ENABLE, 0); | 352 | __mcip_cmd(CMD_IDU_ENABLE, 0); |
diff --git a/arch/arc/kernel/setup.c b/arch/arc/kernel/setup.c index a3d186211ed3..18cc01591c96 100644 --- a/arch/arc/kernel/setup.c +++ b/arch/arc/kernel/setup.c | |||
| @@ -142,17 +142,22 @@ static void read_arc_build_cfg_regs(void) | |||
| 142 | } | 142 | } |
| 143 | 143 | ||
| 144 | static const struct cpuinfo_data arc_cpu_tbl[] = { | 144 | static const struct cpuinfo_data arc_cpu_tbl[] = { |
| 145 | #ifdef CONFIG_ISA_ARCOMPACT | ||
| 145 | { {0x20, "ARC 600" }, 0x2F}, | 146 | { {0x20, "ARC 600" }, 0x2F}, |
| 146 | { {0x30, "ARC 700" }, 0x33}, | 147 | { {0x30, "ARC 700" }, 0x33}, |
| 147 | { {0x34, "ARC 700 R4.10"}, 0x34}, | 148 | { {0x34, "ARC 700 R4.10"}, 0x34}, |
| 148 | { {0x35, "ARC 700 R4.11"}, 0x35}, | 149 | { {0x35, "ARC 700 R4.11"}, 0x35}, |
| 149 | { {0x50, "ARC HS38" }, 0x51}, | 150 | #else |
| 151 | { {0x50, "ARC HS38 R2.0"}, 0x51}, | ||
| 152 | { {0x52, "ARC HS38 R2.1"}, 0x52}, | ||
| 153 | #endif | ||
| 150 | { {0x00, NULL } } | 154 | { {0x00, NULL } } |
| 151 | }; | 155 | }; |
| 152 | 156 | ||
| 153 | #define IS_AVAIL1(v, str) ((v) ? str : "") | 157 | #define IS_AVAIL1(v, s) ((v) ? s : "") |
| 154 | #define IS_USED(cfg) (IS_ENABLED(cfg) ? "" : "(not used) ") | 158 | #define IS_USED_RUN(v) ((v) ? "" : "(not used) ") |
| 155 | #define IS_AVAIL2(v, str, cfg) IS_AVAIL1(v, str), IS_AVAIL1(v, IS_USED(cfg)) | 159 | #define IS_USED_CFG(cfg) IS_USED_RUN(IS_ENABLED(cfg)) |
| 160 | #define IS_AVAIL2(v, s, cfg) IS_AVAIL1(v, s), IS_AVAIL1(v, IS_USED_CFG(cfg)) | ||
| 156 | 161 | ||
| 157 | static char *arc_cpu_mumbojumbo(int cpu_id, char *buf, int len) | 162 | static char *arc_cpu_mumbojumbo(int cpu_id, char *buf, int len) |
| 158 | { | 163 | { |
| @@ -226,7 +231,7 @@ static char *arc_cpu_mumbojumbo(int cpu_id, char *buf, int len) | |||
| 226 | n += scnprintf(buf + n, len - n, "mpy[opt %d] ", opt); | 231 | n += scnprintf(buf + n, len - n, "mpy[opt %d] ", opt); |
| 227 | } | 232 | } |
| 228 | n += scnprintf(buf + n, len - n, "%s", | 233 | n += scnprintf(buf + n, len - n, "%s", |
| 229 | IS_USED(CONFIG_ARC_HAS_HW_MPY)); | 234 | IS_USED_CFG(CONFIG_ARC_HAS_HW_MPY)); |
| 230 | } | 235 | } |
| 231 | 236 | ||
| 232 | n += scnprintf(buf + n, len - n, "%s%s%s%s%s%s%s%s\n", | 237 | n += scnprintf(buf + n, len - n, "%s%s%s%s%s%s%s%s\n", |
diff --git a/arch/arc/kernel/troubleshoot.c b/arch/arc/kernel/troubleshoot.c index 807f7d61d7a7..a6f91e88ce36 100644 --- a/arch/arc/kernel/troubleshoot.c +++ b/arch/arc/kernel/troubleshoot.c | |||
| @@ -58,7 +58,6 @@ static void show_callee_regs(struct callee_regs *cregs) | |||
| 58 | 58 | ||
| 59 | static void print_task_path_n_nm(struct task_struct *tsk, char *buf) | 59 | static void print_task_path_n_nm(struct task_struct *tsk, char *buf) |
| 60 | { | 60 | { |
| 61 | struct path path; | ||
| 62 | char *path_nm = NULL; | 61 | char *path_nm = NULL; |
| 63 | struct mm_struct *mm; | 62 | struct mm_struct *mm; |
| 64 | struct file *exe_file; | 63 | struct file *exe_file; |
diff --git a/arch/arc/mm/cache.c b/arch/arc/mm/cache.c index b29d62ed4f7e..1cd6695b6ab5 100644 --- a/arch/arc/mm/cache.c +++ b/arch/arc/mm/cache.c | |||
| @@ -468,10 +468,18 @@ static void __ic_line_inv_vaddr(unsigned long paddr, unsigned long vaddr, | |||
| 468 | noinline void slc_op(unsigned long paddr, unsigned long sz, const int op) | 468 | noinline void slc_op(unsigned long paddr, unsigned long sz, const int op) |
| 469 | { | 469 | { |
| 470 | #ifdef CONFIG_ISA_ARCV2 | 470 | #ifdef CONFIG_ISA_ARCV2 |
| 471 | /* | ||
| 472 | * SLC is shared between all cores and concurrent aux operations from | ||
| 473 | * multiple cores need to be serialized using a spinlock | ||
| 474 | * A concurrent operation can be silently ignored and/or the old/new | ||
| 475 | * operation can remain incomplete forever (lockup in SLC_CTRL_BUSY loop | ||
| 476 | * below) | ||
| 477 | */ | ||
| 478 | static DEFINE_SPINLOCK(lock); | ||
| 471 | unsigned long flags; | 479 | unsigned long flags; |
| 472 | unsigned int ctrl; | 480 | unsigned int ctrl; |
| 473 | 481 | ||
| 474 | local_irq_save(flags); | 482 | spin_lock_irqsave(&lock, flags); |
| 475 | 483 | ||
| 476 | /* | 484 | /* |
| 477 | * The Region Flush operation is specified by CTRL.RGN_OP[11..9] | 485 | * The Region Flush operation is specified by CTRL.RGN_OP[11..9] |
| @@ -504,7 +512,7 @@ noinline void slc_op(unsigned long paddr, unsigned long sz, const int op) | |||
| 504 | 512 | ||
| 505 | while (read_aux_reg(ARC_REG_SLC_CTRL) & SLC_CTRL_BUSY); | 513 | while (read_aux_reg(ARC_REG_SLC_CTRL) & SLC_CTRL_BUSY); |
| 506 | 514 | ||
| 507 | local_irq_restore(flags); | 515 | spin_unlock_irqrestore(&lock, flags); |
| 508 | #endif | 516 | #endif |
| 509 | } | 517 | } |
| 510 | 518 | ||
diff --git a/arch/arc/mm/dma.c b/arch/arc/mm/dma.c index 74a637a1cfc4..57706a9c6948 100644 --- a/arch/arc/mm/dma.c +++ b/arch/arc/mm/dma.c | |||
| @@ -60,8 +60,8 @@ void *dma_alloc_coherent(struct device *dev, size_t size, | |||
| 60 | 60 | ||
| 61 | /* This is kernel Virtual address (0x7000_0000 based) */ | 61 | /* This is kernel Virtual address (0x7000_0000 based) */ |
| 62 | kvaddr = ioremap_nocache((unsigned long)paddr, size); | 62 | kvaddr = ioremap_nocache((unsigned long)paddr, size); |
| 63 | if (kvaddr != NULL) | 63 | if (kvaddr == NULL) |
| 64 | memset(kvaddr, 0, size); | 64 | return NULL; |
| 65 | 65 | ||
| 66 | /* This is bus address, platform dependent */ | 66 | /* This is bus address, platform dependent */ |
| 67 | *dma_handle = (dma_addr_t)paddr; | 67 | *dma_handle = (dma_addr_t)paddr; |
diff --git a/arch/arm/boot/dts/am335x-pepper.dts b/arch/arm/boot/dts/am335x-pepper.dts index 0d35ab64641c..7106114c7464 100644 --- a/arch/arm/boot/dts/am335x-pepper.dts +++ b/arch/arm/boot/dts/am335x-pepper.dts | |||
| @@ -74,6 +74,7 @@ | |||
| 74 | audio_codec: tlv320aic3106@1b { | 74 | audio_codec: tlv320aic3106@1b { |
| 75 | compatible = "ti,tlv320aic3106"; | 75 | compatible = "ti,tlv320aic3106"; |
| 76 | reg = <0x1b>; | 76 | reg = <0x1b>; |
| 77 | ai3x-micbias-vg = <0x2>; | ||
| 77 | }; | 78 | }; |
| 78 | 79 | ||
| 79 | accel: lis331dlh@1d { | 80 | accel: lis331dlh@1d { |
| @@ -153,7 +154,7 @@ | |||
| 153 | ti,audio-routing = | 154 | ti,audio-routing = |
| 154 | "Headphone Jack", "HPLOUT", | 155 | "Headphone Jack", "HPLOUT", |
| 155 | "Headphone Jack", "HPROUT", | 156 | "Headphone Jack", "HPROUT", |
| 156 | "LINE1L", "Line In"; | 157 | "MIC3L", "Mic3L Switch"; |
| 157 | }; | 158 | }; |
| 158 | 159 | ||
| 159 | &mcasp0 { | 160 | &mcasp0 { |
| @@ -438,41 +439,50 @@ | |||
| 438 | regulators { | 439 | regulators { |
| 439 | dcdc1_reg: regulator@0 { | 440 | dcdc1_reg: regulator@0 { |
| 440 | /* VDD_1V8 system supply */ | 441 | /* VDD_1V8 system supply */ |
| 442 | regulator-always-on; | ||
| 441 | }; | 443 | }; |
| 442 | 444 | ||
| 443 | dcdc2_reg: regulator@1 { | 445 | dcdc2_reg: regulator@1 { |
| 444 | /* VDD_CORE voltage limits 0.95V - 1.26V with +/-4% tolerance */ | 446 | /* VDD_CORE voltage limits 0.95V - 1.26V with +/-4% tolerance */ |
| 445 | regulator-name = "vdd_core"; | 447 | regulator-name = "vdd_core"; |
| 446 | regulator-min-microvolt = <925000>; | 448 | regulator-min-microvolt = <925000>; |
| 447 | regulator-max-microvolt = <1325000>; | 449 | regulator-max-microvolt = <1150000>; |
| 448 | regulator-boot-on; | 450 | regulator-boot-on; |
| 451 | regulator-always-on; | ||
| 449 | }; | 452 | }; |
| 450 | 453 | ||
| 451 | dcdc3_reg: regulator@2 { | 454 | dcdc3_reg: regulator@2 { |
| 452 | /* VDD_MPU voltage limits 0.95V - 1.1V with +/-4% tolerance */ | 455 | /* VDD_MPU voltage limits 0.95V - 1.1V with +/-4% tolerance */ |
| 453 | regulator-name = "vdd_mpu"; | 456 | regulator-name = "vdd_mpu"; |
| 454 | regulator-min-microvolt = <925000>; | 457 | regulator-min-microvolt = <925000>; |
| 455 | regulator-max-microvolt = <1150000>; | 458 | regulator-max-microvolt = <1325000>; |
| 456 | regulator-boot-on; | 459 | regulator-boot-on; |
| 460 | regulator-always-on; | ||
| 457 | }; | 461 | }; |
| 458 | 462 | ||
| 459 | ldo1_reg: regulator@3 { | 463 | ldo1_reg: regulator@3 { |
| 460 | /* VRTC 1.8V always-on supply */ | 464 | /* VRTC 1.8V always-on supply */ |
| 465 | regulator-name = "vrtc,vdds"; | ||
| 461 | regulator-always-on; | 466 | regulator-always-on; |
| 462 | }; | 467 | }; |
| 463 | 468 | ||
| 464 | ldo2_reg: regulator@4 { | 469 | ldo2_reg: regulator@4 { |
| 465 | /* 3.3V rail */ | 470 | /* 3.3V rail */ |
| 471 | regulator-name = "vdd_3v3aux"; | ||
| 472 | regulator-always-on; | ||
| 466 | }; | 473 | }; |
| 467 | 474 | ||
| 468 | ldo3_reg: regulator@5 { | 475 | ldo3_reg: regulator@5 { |
| 469 | /* VDD_3V3A 3.3V rail */ | 476 | /* VDD_3V3A 3.3V rail */ |
| 477 | regulator-name = "vdd_3v3a"; | ||
| 470 | regulator-min-microvolt = <3300000>; | 478 | regulator-min-microvolt = <3300000>; |
| 471 | regulator-max-microvolt = <3300000>; | 479 | regulator-max-microvolt = <3300000>; |
| 472 | }; | 480 | }; |
| 473 | 481 | ||
| 474 | ldo4_reg: regulator@6 { | 482 | ldo4_reg: regulator@6 { |
| 475 | /* VDD_3V3B 3.3V rail */ | 483 | /* VDD_3V3B 3.3V rail */ |
| 484 | regulator-name = "vdd_3v3b"; | ||
| 485 | regulator-always-on; | ||
| 476 | }; | 486 | }; |
| 477 | }; | 487 | }; |
| 478 | }; | 488 | }; |
diff --git a/arch/arm/boot/dts/cros-ec-keyboard.dtsi b/arch/arm/boot/dts/cros-ec-keyboard.dtsi index 9c7fb0acae79..4e42f30cb318 100644 --- a/arch/arm/boot/dts/cros-ec-keyboard.dtsi +++ b/arch/arm/boot/dts/cros-ec-keyboard.dtsi | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | MATRIX_KEY(0x00, 0x02, KEY_F1) | 22 | MATRIX_KEY(0x00, 0x02, KEY_F1) |
| 23 | MATRIX_KEY(0x00, 0x03, KEY_B) | 23 | MATRIX_KEY(0x00, 0x03, KEY_B) |
| 24 | MATRIX_KEY(0x00, 0x04, KEY_F10) | 24 | MATRIX_KEY(0x00, 0x04, KEY_F10) |
| 25 | MATRIX_KEY(0x00, 0x05, KEY_RO) | ||
| 25 | MATRIX_KEY(0x00, 0x06, KEY_N) | 26 | MATRIX_KEY(0x00, 0x06, KEY_N) |
| 26 | MATRIX_KEY(0x00, 0x08, KEY_EQUAL) | 27 | MATRIX_KEY(0x00, 0x08, KEY_EQUAL) |
| 27 | MATRIX_KEY(0x00, 0x0a, KEY_RIGHTALT) | 28 | MATRIX_KEY(0x00, 0x0a, KEY_RIGHTALT) |
| @@ -34,6 +35,7 @@ | |||
| 34 | MATRIX_KEY(0x01, 0x08, KEY_APOSTROPHE) | 35 | MATRIX_KEY(0x01, 0x08, KEY_APOSTROPHE) |
| 35 | MATRIX_KEY(0x01, 0x09, KEY_F9) | 36 | MATRIX_KEY(0x01, 0x09, KEY_F9) |
| 36 | MATRIX_KEY(0x01, 0x0b, KEY_BACKSPACE) | 37 | MATRIX_KEY(0x01, 0x0b, KEY_BACKSPACE) |
| 38 | MATRIX_KEY(0x01, 0x0c, KEY_HENKAN) | ||
| 37 | 39 | ||
| 38 | MATRIX_KEY(0x02, 0x00, KEY_LEFTCTRL) | 40 | MATRIX_KEY(0x02, 0x00, KEY_LEFTCTRL) |
| 39 | MATRIX_KEY(0x02, 0x01, KEY_TAB) | 41 | MATRIX_KEY(0x02, 0x01, KEY_TAB) |
| @@ -45,6 +47,7 @@ | |||
| 45 | MATRIX_KEY(0x02, 0x07, KEY_102ND) | 47 | MATRIX_KEY(0x02, 0x07, KEY_102ND) |
| 46 | MATRIX_KEY(0x02, 0x08, KEY_LEFTBRACE) | 48 | MATRIX_KEY(0x02, 0x08, KEY_LEFTBRACE) |
| 47 | MATRIX_KEY(0x02, 0x09, KEY_F8) | 49 | MATRIX_KEY(0x02, 0x09, KEY_F8) |
| 50 | MATRIX_KEY(0x02, 0x0a, KEY_YEN) | ||
| 48 | 51 | ||
| 49 | MATRIX_KEY(0x03, 0x01, KEY_GRAVE) | 52 | MATRIX_KEY(0x03, 0x01, KEY_GRAVE) |
| 50 | MATRIX_KEY(0x03, 0x02, KEY_F2) | 53 | MATRIX_KEY(0x03, 0x02, KEY_F2) |
| @@ -53,6 +56,7 @@ | |||
| 53 | MATRIX_KEY(0x03, 0x06, KEY_6) | 56 | MATRIX_KEY(0x03, 0x06, KEY_6) |
| 54 | MATRIX_KEY(0x03, 0x08, KEY_MINUS) | 57 | MATRIX_KEY(0x03, 0x08, KEY_MINUS) |
| 55 | MATRIX_KEY(0x03, 0x0b, KEY_BACKSLASH) | 58 | MATRIX_KEY(0x03, 0x0b, KEY_BACKSLASH) |
| 59 | MATRIX_KEY(0x03, 0x0c, KEY_MUHENKAN) | ||
| 56 | 60 | ||
| 57 | MATRIX_KEY(0x04, 0x00, KEY_RIGHTCTRL) | 61 | MATRIX_KEY(0x04, 0x00, KEY_RIGHTCTRL) |
| 58 | MATRIX_KEY(0x04, 0x01, KEY_A) | 62 | MATRIX_KEY(0x04, 0x01, KEY_A) |
diff --git a/arch/arm/boot/dts/dra7-evm.dts b/arch/arm/boot/dts/dra7-evm.dts index aa465904f6cc..096f68be99e2 100644 --- a/arch/arm/boot/dts/dra7-evm.dts +++ b/arch/arm/boot/dts/dra7-evm.dts | |||
| @@ -686,7 +686,8 @@ | |||
| 686 | 686 | ||
| 687 | &dcan1 { | 687 | &dcan1 { |
| 688 | status = "ok"; | 688 | status = "ok"; |
| 689 | pinctrl-names = "default", "sleep"; | 689 | pinctrl-names = "default", "sleep", "active"; |
| 690 | pinctrl-0 = <&dcan1_pins_default>; | 690 | pinctrl-0 = <&dcan1_pins_sleep>; |
| 691 | pinctrl-1 = <&dcan1_pins_sleep>; | 691 | pinctrl-1 = <&dcan1_pins_sleep>; |
| 692 | pinctrl-2 = <&dcan1_pins_default>; | ||
| 692 | }; | 693 | }; |
diff --git a/arch/arm/boot/dts/dra72-evm.dts b/arch/arm/boot/dts/dra72-evm.dts index 4e1b60581782..803738414086 100644 --- a/arch/arm/boot/dts/dra72-evm.dts +++ b/arch/arm/boot/dts/dra72-evm.dts | |||
| @@ -587,9 +587,10 @@ | |||
| 587 | 587 | ||
| 588 | &dcan1 { | 588 | &dcan1 { |
| 589 | status = "ok"; | 589 | status = "ok"; |
| 590 | pinctrl-names = "default", "sleep"; | 590 | pinctrl-names = "default", "sleep", "active"; |
| 591 | pinctrl-0 = <&dcan1_pins_default>; | 591 | pinctrl-0 = <&dcan1_pins_sleep>; |
| 592 | pinctrl-1 = <&dcan1_pins_sleep>; | 592 | pinctrl-1 = <&dcan1_pins_sleep>; |
| 593 | pinctrl-2 = <&dcan1_pins_default>; | ||
| 593 | }; | 594 | }; |
| 594 | 595 | ||
| 595 | &qspi { | 596 | &qspi { |
diff --git a/arch/arm/boot/dts/imx23.dtsi b/arch/arm/boot/dts/imx23.dtsi index c892d58e8dad..b995333ea22b 100644 --- a/arch/arm/boot/dts/imx23.dtsi +++ b/arch/arm/boot/dts/imx23.dtsi | |||
| @@ -468,6 +468,7 @@ | |||
| 468 | interrupts = <36 37 38 39 40 41 42 43 44>; | 468 | interrupts = <36 37 38 39 40 41 42 43 44>; |
| 469 | status = "disabled"; | 469 | status = "disabled"; |
| 470 | clocks = <&clks 26>; | 470 | clocks = <&clks 26>; |
| 471 | #io-channel-cells = <1>; | ||
| 471 | }; | 472 | }; |
| 472 | 473 | ||
| 473 | spdif@80054000 { | 474 | spdif@80054000 { |
diff --git a/arch/arm/boot/dts/imx27.dtsi b/arch/arm/boot/dts/imx27.dtsi index bc215e4b75fd..b69be5c499cf 100644 --- a/arch/arm/boot/dts/imx27.dtsi +++ b/arch/arm/boot/dts/imx27.dtsi | |||
| @@ -108,7 +108,7 @@ | |||
| 108 | }; | 108 | }; |
| 109 | 109 | ||
| 110 | gpt1: timer@10003000 { | 110 | gpt1: timer@10003000 { |
| 111 | compatible = "fsl,imx27-gpt", "fsl,imx1-gpt"; | 111 | compatible = "fsl,imx27-gpt", "fsl,imx21-gpt"; |
| 112 | reg = <0x10003000 0x1000>; | 112 | reg = <0x10003000 0x1000>; |
| 113 | interrupts = <26>; | 113 | interrupts = <26>; |
| 114 | clocks = <&clks IMX27_CLK_GPT1_IPG_GATE>, | 114 | clocks = <&clks IMX27_CLK_GPT1_IPG_GATE>, |
| @@ -117,7 +117,7 @@ | |||
| 117 | }; | 117 | }; |
| 118 | 118 | ||
| 119 | gpt2: timer@10004000 { | 119 | gpt2: timer@10004000 { |
| 120 | compatible = "fsl,imx27-gpt", "fsl,imx1-gpt"; | 120 | compatible = "fsl,imx27-gpt", "fsl,imx21-gpt"; |
| 121 | reg = <0x10004000 0x1000>; | 121 | reg = <0x10004000 0x1000>; |
| 122 | interrupts = <25>; | 122 | interrupts = <25>; |
| 123 | clocks = <&clks IMX27_CLK_GPT2_IPG_GATE>, | 123 | clocks = <&clks IMX27_CLK_GPT2_IPG_GATE>, |
| @@ -126,7 +126,7 @@ | |||
| 126 | }; | 126 | }; |
| 127 | 127 | ||
| 128 | gpt3: timer@10005000 { | 128 | gpt3: timer@10005000 { |
| 129 | compatible = "fsl,imx27-gpt", "fsl,imx1-gpt"; | 129 | compatible = "fsl,imx27-gpt", "fsl,imx21-gpt"; |
| 130 | reg = <0x10005000 0x1000>; | 130 | reg = <0x10005000 0x1000>; |
| 131 | interrupts = <24>; | 131 | interrupts = <24>; |
| 132 | clocks = <&clks IMX27_CLK_GPT3_IPG_GATE>, | 132 | clocks = <&clks IMX27_CLK_GPT3_IPG_GATE>, |
| @@ -376,7 +376,7 @@ | |||
| 376 | }; | 376 | }; |
| 377 | 377 | ||
| 378 | gpt4: timer@10019000 { | 378 | gpt4: timer@10019000 { |
| 379 | compatible = "fsl,imx27-gpt", "fsl,imx1-gpt"; | 379 | compatible = "fsl,imx27-gpt", "fsl,imx21-gpt"; |
| 380 | reg = <0x10019000 0x1000>; | 380 | reg = <0x10019000 0x1000>; |
| 381 | interrupts = <4>; | 381 | interrupts = <4>; |
| 382 | clocks = <&clks IMX27_CLK_GPT4_IPG_GATE>, | 382 | clocks = <&clks IMX27_CLK_GPT4_IPG_GATE>, |
| @@ -385,7 +385,7 @@ | |||
| 385 | }; | 385 | }; |
| 386 | 386 | ||
| 387 | gpt5: timer@1001a000 { | 387 | gpt5: timer@1001a000 { |
| 388 | compatible = "fsl,imx27-gpt", "fsl,imx1-gpt"; | 388 | compatible = "fsl,imx27-gpt", "fsl,imx21-gpt"; |
| 389 | reg = <0x1001a000 0x1000>; | 389 | reg = <0x1001a000 0x1000>; |
| 390 | interrupts = <3>; | 390 | interrupts = <3>; |
| 391 | clocks = <&clks IMX27_CLK_GPT5_IPG_GATE>, | 391 | clocks = <&clks IMX27_CLK_GPT5_IPG_GATE>, |
| @@ -436,7 +436,7 @@ | |||
| 436 | }; | 436 | }; |
| 437 | 437 | ||
| 438 | gpt6: timer@1001f000 { | 438 | gpt6: timer@1001f000 { |
| 439 | compatible = "fsl,imx27-gpt", "fsl,imx1-gpt"; | 439 | compatible = "fsl,imx27-gpt", "fsl,imx21-gpt"; |
| 440 | reg = <0x1001f000 0x1000>; | 440 | reg = <0x1001f000 0x1000>; |
| 441 | interrupts = <2>; | 441 | interrupts = <2>; |
| 442 | clocks = <&clks IMX27_CLK_GPT6_IPG_GATE>, | 442 | clocks = <&clks IMX27_CLK_GPT6_IPG_GATE>, |
diff --git a/arch/arm/boot/dts/imx53-qsb-common.dtsi b/arch/arm/boot/dts/imx53-qsb-common.dtsi index 181ae5ebf23f..ab4ba39f2ed9 100644 --- a/arch/arm/boot/dts/imx53-qsb-common.dtsi +++ b/arch/arm/boot/dts/imx53-qsb-common.dtsi | |||
| @@ -295,9 +295,10 @@ | |||
| 295 | &tve { | 295 | &tve { |
| 296 | pinctrl-names = "default"; | 296 | pinctrl-names = "default"; |
| 297 | pinctrl-0 = <&pinctrl_vga_sync>; | 297 | pinctrl-0 = <&pinctrl_vga_sync>; |
| 298 | ddc-i2c-bus = <&i2c2>; | ||
| 298 | fsl,tve-mode = "vga"; | 299 | fsl,tve-mode = "vga"; |
| 299 | fsl,hsync-pin = <4>; | 300 | fsl,hsync-pin = <7>; /* IPU DI1 PIN7 via EIM_OE */ |
| 300 | fsl,vsync-pin = <6>; | 301 | fsl,vsync-pin = <8>; /* IPU DI1 PIN8 via EIM_RW */ |
| 301 | status = "okay"; | 302 | status = "okay"; |
| 302 | }; | 303 | }; |
| 303 | 304 | ||
diff --git a/arch/arm/boot/dts/k2e.dtsi b/arch/arm/boot/dts/k2e.dtsi index 50e555eab50d..1b6494fbdb91 100644 --- a/arch/arm/boot/dts/k2e.dtsi +++ b/arch/arm/boot/dts/k2e.dtsi | |||
| @@ -86,7 +86,7 @@ | |||
| 86 | gpio,syscon-dev = <&devctrl 0x240>; | 86 | gpio,syscon-dev = <&devctrl 0x240>; |
| 87 | }; | 87 | }; |
| 88 | 88 | ||
| 89 | pcie@21020000 { | 89 | pcie1: pcie@21020000 { |
| 90 | compatible = "ti,keystone-pcie","snps,dw-pcie"; | 90 | compatible = "ti,keystone-pcie","snps,dw-pcie"; |
| 91 | clocks = <&clkpcie1>; | 91 | clocks = <&clkpcie1>; |
| 92 | clock-names = "pcie"; | 92 | clock-names = "pcie"; |
| @@ -96,6 +96,7 @@ | |||
| 96 | ranges = <0x81000000 0 0 0x23260000 0x4000 0x4000 | 96 | ranges = <0x81000000 0 0 0x23260000 0x4000 0x4000 |
| 97 | 0x82000000 0 0x60000000 0x60000000 0 0x10000000>; | 97 | 0x82000000 0 0x60000000 0x60000000 0 0x10000000>; |
| 98 | 98 | ||
| 99 | status = "disabled"; | ||
| 99 | device_type = "pci"; | 100 | device_type = "pci"; |
| 100 | num-lanes = <2>; | 101 | num-lanes = <2>; |
| 101 | 102 | ||
diff --git a/arch/arm/boot/dts/keystone.dtsi b/arch/arm/boot/dts/keystone.dtsi index c06542b2c954..e7a6f6deabb6 100644 --- a/arch/arm/boot/dts/keystone.dtsi +++ b/arch/arm/boot/dts/keystone.dtsi | |||
| @@ -286,7 +286,7 @@ | |||
| 286 | ti,syscon-dev = <&devctrl 0x2a0>; | 286 | ti,syscon-dev = <&devctrl 0x2a0>; |
| 287 | }; | 287 | }; |
| 288 | 288 | ||
| 289 | pcie@21800000 { | 289 | pcie0: pcie@21800000 { |
| 290 | compatible = "ti,keystone-pcie", "snps,dw-pcie"; | 290 | compatible = "ti,keystone-pcie", "snps,dw-pcie"; |
| 291 | clocks = <&clkpcie>; | 291 | clocks = <&clkpcie>; |
| 292 | clock-names = "pcie"; | 292 | clock-names = "pcie"; |
| @@ -296,6 +296,7 @@ | |||
| 296 | ranges = <0x81000000 0 0 0x23250000 0 0x4000 | 296 | ranges = <0x81000000 0 0 0x23250000 0 0x4000 |
| 297 | 0x82000000 0 0x50000000 0x50000000 0 0x10000000>; | 297 | 0x82000000 0 0x50000000 0x50000000 0 0x10000000>; |
| 298 | 298 | ||
| 299 | status = "disabled"; | ||
| 299 | device_type = "pci"; | 300 | device_type = "pci"; |
| 300 | num-lanes = <2>; | 301 | num-lanes = <2>; |
| 301 | 302 | ||
diff --git a/arch/arm/boot/dts/omap3-overo-common-lcd35.dtsi b/arch/arm/boot/dts/omap3-overo-common-lcd35.dtsi index 233c69e50ae3..df8908adb0cb 100644 --- a/arch/arm/boot/dts/omap3-overo-common-lcd35.dtsi +++ b/arch/arm/boot/dts/omap3-overo-common-lcd35.dtsi | |||
| @@ -120,7 +120,7 @@ | |||
| 120 | 120 | ||
| 121 | lcd0: display@0 { | 121 | lcd0: display@0 { |
| 122 | compatible = "lgphilips,lb035q02"; | 122 | compatible = "lgphilips,lb035q02"; |
| 123 | label = "lcd"; | 123 | label = "lcd35"; |
| 124 | 124 | ||
| 125 | reg = <1>; /* CS1 */ | 125 | reg = <1>; /* CS1 */ |
| 126 | spi-max-frequency = <10000000>; | 126 | spi-max-frequency = <10000000>; |
diff --git a/arch/arm/boot/dts/omap3-overo-common-lcd43.dtsi b/arch/arm/boot/dts/omap3-overo-common-lcd43.dtsi index f5395b7da912..048fd216970a 100644 --- a/arch/arm/boot/dts/omap3-overo-common-lcd43.dtsi +++ b/arch/arm/boot/dts/omap3-overo-common-lcd43.dtsi | |||
| @@ -98,7 +98,7 @@ | |||
| 98 | 98 | ||
| 99 | lcd0: display@0 { | 99 | lcd0: display@0 { |
| 100 | compatible = "samsung,lte430wq-f0c", "panel-dpi"; | 100 | compatible = "samsung,lte430wq-f0c", "panel-dpi"; |
| 101 | label = "lcd"; | 101 | label = "lcd43"; |
| 102 | 102 | ||
| 103 | pinctrl-names = "default"; | 103 | pinctrl-names = "default"; |
| 104 | pinctrl-0 = <<e430_pins>; | 104 | pinctrl-0 = <<e430_pins>; |
diff --git a/arch/arm/boot/dts/omap4.dtsi b/arch/arm/boot/dts/omap4.dtsi index f884d6adb71e..7d31c6ff246f 100644 --- a/arch/arm/boot/dts/omap4.dtsi +++ b/arch/arm/boot/dts/omap4.dtsi | |||
| @@ -551,6 +551,7 @@ | |||
| 551 | reg = <0x4a066000 0x100>; | 551 | reg = <0x4a066000 0x100>; |
| 552 | interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>; | 552 | interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>; |
| 553 | ti,hwmods = "mmu_dsp"; | 553 | ti,hwmods = "mmu_dsp"; |
| 554 | #iommu-cells = <0>; | ||
| 554 | }; | 555 | }; |
| 555 | 556 | ||
| 556 | mmu_ipu: mmu@55082000 { | 557 | mmu_ipu: mmu@55082000 { |
| @@ -558,6 +559,7 @@ | |||
| 558 | reg = <0x55082000 0x100>; | 559 | reg = <0x55082000 0x100>; |
| 559 | interrupts = <GIC_SPI 100 IRQ_TYPE_LEVEL_HIGH>; | 560 | interrupts = <GIC_SPI 100 IRQ_TYPE_LEVEL_HIGH>; |
| 560 | ti,hwmods = "mmu_ipu"; | 561 | ti,hwmods = "mmu_ipu"; |
| 562 | #iommu-cells = <0>; | ||
| 561 | ti,iommu-bus-err-back; | 563 | ti,iommu-bus-err-back; |
| 562 | }; | 564 | }; |
| 563 | 565 | ||
diff --git a/arch/arm/boot/dts/omap5.dtsi b/arch/arm/boot/dts/omap5.dtsi index 7d24ae0306b5..c8fd648a7108 100644 --- a/arch/arm/boot/dts/omap5.dtsi +++ b/arch/arm/boot/dts/omap5.dtsi | |||
| @@ -612,6 +612,7 @@ | |||
| 612 | reg = <0x4a066000 0x100>; | 612 | reg = <0x4a066000 0x100>; |
| 613 | interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>; | 613 | interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>; |
| 614 | ti,hwmods = "mmu_dsp"; | 614 | ti,hwmods = "mmu_dsp"; |
| 615 | #iommu-cells = <0>; | ||
| 615 | }; | 616 | }; |
| 616 | 617 | ||
| 617 | mmu_ipu: mmu@55082000 { | 618 | mmu_ipu: mmu@55082000 { |
| @@ -619,6 +620,7 @@ | |||
| 619 | reg = <0x55082000 0x100>; | 620 | reg = <0x55082000 0x100>; |
| 620 | interrupts = <GIC_SPI 100 IRQ_TYPE_LEVEL_HIGH>; | 621 | interrupts = <GIC_SPI 100 IRQ_TYPE_LEVEL_HIGH>; |
| 621 | ti,hwmods = "mmu_ipu"; | 622 | ti,hwmods = "mmu_ipu"; |
| 623 | #iommu-cells = <0>; | ||
| 622 | ti,iommu-bus-err-back; | 624 | ti,iommu-bus-err-back; |
| 623 | }; | 625 | }; |
| 624 | 626 | ||
diff --git a/arch/arm/boot/dts/socfpga_cyclone5_sockit.dts b/arch/arm/boot/dts/socfpga_cyclone5_sockit.dts index 71468a7eb28f..5e17fd147728 100644 --- a/arch/arm/boot/dts/socfpga_cyclone5_sockit.dts +++ b/arch/arm/boot/dts/socfpga_cyclone5_sockit.dts | |||
| @@ -60,27 +60,27 @@ | |||
| 60 | rxc-skew-ps = <2000>; | 60 | rxc-skew-ps = <2000>; |
| 61 | }; | 61 | }; |
| 62 | 62 | ||
| 63 | &mmc0 { | ||
| 64 | vmmc-supply = <®ulator_3_3v>; | ||
| 65 | vqmmc-supply = <®ulator_3_3v>; | ||
| 66 | }; | ||
| 67 | |||
| 68 | &usb1 { | ||
| 69 | status = "okay"; | ||
| 70 | }; | ||
| 71 | |||
| 72 | &gpio2 { | 63 | &gpio2 { |
| 73 | status = "okay"; | 64 | status = "okay"; |
| 74 | }; | 65 | }; |
| 75 | 66 | ||
| 76 | &i2c1{ | 67 | &i2c1 { |
| 77 | status = "okay"; | 68 | status = "okay"; |
| 78 | 69 | ||
| 79 | accel1: accel1@53{ | 70 | accel1: accelerometer@53 { |
| 80 | compatible = "adxl34x"; | 71 | compatible = "adi,adxl345"; |
| 81 | reg = <0x53>; | 72 | reg = <0x53>; |
| 82 | 73 | ||
| 83 | interrupt-parent = < &portc >; | 74 | interrupt-parent = <&portc>; |
| 84 | interrupts = <3 2>; | 75 | interrupts = <3 2>; |
| 85 | }; | 76 | }; |
| 86 | }; | 77 | }; |
| 78 | |||
| 79 | &mmc0 { | ||
| 80 | vmmc-supply = <®ulator_3_3v>; | ||
| 81 | vqmmc-supply = <®ulator_3_3v>; | ||
| 82 | }; | ||
| 83 | |||
| 84 | &usb1 { | ||
| 85 | status = "okay"; | ||
| 86 | }; | ||
diff --git a/arch/arm/boot/dts/spear1310-evb.dts b/arch/arm/boot/dts/spear1310-evb.dts index d42c84b1df8d..e48857249ce7 100644 --- a/arch/arm/boot/dts/spear1310-evb.dts +++ b/arch/arm/boot/dts/spear1310-evb.dts | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * DTS file for SPEAr1310 Evaluation Baord | 2 | * DTS file for SPEAr1310 Evaluation Baord |
| 3 | * | 3 | * |
| 4 | * Copyright 2012 Viresh Kumar <viresh.linux@gmail.com> | 4 | * Copyright 2012 Viresh Kumar <vireshk@kernel.org> |
| 5 | * | 5 | * |
| 6 | * The code contained herein is licensed under the GNU General Public | 6 | * The code contained herein is licensed under the GNU General Public |
| 7 | * License. You may obtain a copy of the GNU General Public License | 7 | * License. You may obtain a copy of the GNU General Public License |
diff --git a/arch/arm/boot/dts/spear1310.dtsi b/arch/arm/boot/dts/spear1310.dtsi index 9d342920695a..54bc6d3cf290 100644 --- a/arch/arm/boot/dts/spear1310.dtsi +++ b/arch/arm/boot/dts/spear1310.dtsi | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * DTS file for all SPEAr1310 SoCs | 2 | * DTS file for all SPEAr1310 SoCs |
| 3 | * | 3 | * |
| 4 | * Copyright 2012 Viresh Kumar <viresh.linux@gmail.com> | 4 | * Copyright 2012 Viresh Kumar <vireshk@kernel.org> |
| 5 | * | 5 | * |
| 6 | * The code contained herein is licensed under the GNU General Public | 6 | * The code contained herein is licensed under the GNU General Public |
| 7 | * License. You may obtain a copy of the GNU General Public License | 7 | * License. You may obtain a copy of the GNU General Public License |
diff --git a/arch/arm/boot/dts/spear1340-evb.dts b/arch/arm/boot/dts/spear1340-evb.dts index b23e05ed1d60..c611f5606dfe 100644 --- a/arch/arm/boot/dts/spear1340-evb.dts +++ b/arch/arm/boot/dts/spear1340-evb.dts | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * DTS file for SPEAr1340 Evaluation Baord | 2 | * DTS file for SPEAr1340 Evaluation Baord |
| 3 | * | 3 | * |
| 4 | * Copyright 2012 Viresh Kumar <viresh.linux@gmail.com> | 4 | * Copyright 2012 Viresh Kumar <vireshk@kernel.org> |
| 5 | * | 5 | * |
| 6 | * The code contained herein is licensed under the GNU General Public | 6 | * The code contained herein is licensed under the GNU General Public |
| 7 | * License. You may obtain a copy of the GNU General Public License | 7 | * License. You may obtain a copy of the GNU General Public License |
diff --git a/arch/arm/boot/dts/spear1340.dtsi b/arch/arm/boot/dts/spear1340.dtsi index 13e1aa33daa2..df2232d767ed 100644 --- a/arch/arm/boot/dts/spear1340.dtsi +++ b/arch/arm/boot/dts/spear1340.dtsi | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * DTS file for all SPEAr1340 SoCs | 2 | * DTS file for all SPEAr1340 SoCs |
| 3 | * | 3 | * |
| 4 | * Copyright 2012 Viresh Kumar <viresh.linux@gmail.com> | 4 | * Copyright 2012 Viresh Kumar <vireshk@kernel.org> |
| 5 | * | 5 | * |
| 6 | * The code contained herein is licensed under the GNU General Public | 6 | * The code contained herein is licensed under the GNU General Public |
| 7 | * License. You may obtain a copy of the GNU General Public License | 7 | * License. You may obtain a copy of the GNU General Public License |
diff --git a/arch/arm/boot/dts/spear13xx.dtsi b/arch/arm/boot/dts/spear13xx.dtsi index 40accc87e3a2..14594ce8c18a 100644 --- a/arch/arm/boot/dts/spear13xx.dtsi +++ b/arch/arm/boot/dts/spear13xx.dtsi | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * DTS file for all SPEAr13xx SoCs | 2 | * DTS file for all SPEAr13xx SoCs |
| 3 | * | 3 | * |
| 4 | * Copyright 2012 Viresh Kumar <viresh.linux@gmail.com> | 4 | * Copyright 2012 Viresh Kumar <vireshk@kernel.org> |
| 5 | * | 5 | * |
| 6 | * The code contained herein is licensed under the GNU General Public | 6 | * The code contained herein is licensed under the GNU General Public |
| 7 | * License. You may obtain a copy of the GNU General Public License | 7 | * License. You may obtain a copy of the GNU General Public License |
diff --git a/arch/arm/boot/dts/spear300-evb.dts b/arch/arm/boot/dts/spear300-evb.dts index 5de1431653e4..e859e8288bcd 100644 --- a/arch/arm/boot/dts/spear300-evb.dts +++ b/arch/arm/boot/dts/spear300-evb.dts | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * DTS file for SPEAr300 Evaluation Baord | 2 | * DTS file for SPEAr300 Evaluation Baord |
| 3 | * | 3 | * |
| 4 | * Copyright 2012 Viresh Kumar <viresh.linux@gmail.com> | 4 | * Copyright 2012 Viresh Kumar <vireshk@kernel.org> |
| 5 | * | 5 | * |
| 6 | * The code contained herein is licensed under the GNU General Public | 6 | * The code contained herein is licensed under the GNU General Public |
| 7 | * License. You may obtain a copy of the GNU General Public License | 7 | * License. You may obtain a copy of the GNU General Public License |
diff --git a/arch/arm/boot/dts/spear300.dtsi b/arch/arm/boot/dts/spear300.dtsi index f79b3dfaabe6..f4e92e599729 100644 --- a/arch/arm/boot/dts/spear300.dtsi +++ b/arch/arm/boot/dts/spear300.dtsi | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * DTS file for SPEAr300 SoC | 2 | * DTS file for SPEAr300 SoC |
| 3 | * | 3 | * |
| 4 | * Copyright 2012 Viresh Kumar <viresh.linux@gmail.com> | 4 | * Copyright 2012 Viresh Kumar <vireshk@kernel.org> |
| 5 | * | 5 | * |
| 6 | * The code contained herein is licensed under the GNU General Public | 6 | * The code contained herein is licensed under the GNU General Public |
| 7 | * License. You may obtain a copy of the GNU General Public License | 7 | * License. You may obtain a copy of the GNU General Public License |
diff --git a/arch/arm/boot/dts/spear310-evb.dts b/arch/arm/boot/dts/spear310-evb.dts index b09632963d15..070f2c1b7851 100644 --- a/arch/arm/boot/dts/spear310-evb.dts +++ b/arch/arm/boot/dts/spear310-evb.dts | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * DTS file for SPEAr310 Evaluation Baord | 2 | * DTS file for SPEAr310 Evaluation Baord |
| 3 | * | 3 | * |
| 4 | * Copyright 2012 Viresh Kumar <viresh.linux@gmail.com> | 4 | * Copyright 2012 Viresh Kumar <vireshk@kernel.org> |
| 5 | * | 5 | * |
| 6 | * The code contained herein is licensed under the GNU General Public | 6 | * The code contained herein is licensed under the GNU General Public |
| 7 | * License. You may obtain a copy of the GNU General Public License | 7 | * License. You may obtain a copy of the GNU General Public License |
diff --git a/arch/arm/boot/dts/spear310.dtsi b/arch/arm/boot/dts/spear310.dtsi index 95372080eea6..da210b454753 100644 --- a/arch/arm/boot/dts/spear310.dtsi +++ b/arch/arm/boot/dts/spear310.dtsi | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * DTS file for SPEAr310 SoC | 2 | * DTS file for SPEAr310 SoC |
| 3 | * | 3 | * |
| 4 | * Copyright 2012 Viresh Kumar <viresh.linux@gmail.com> | 4 | * Copyright 2012 Viresh Kumar <vireshk@kernel.org> |
| 5 | * | 5 | * |
| 6 | * The code contained herein is licensed under the GNU General Public | 6 | * The code contained herein is licensed under the GNU General Public |
| 7 | * License. You may obtain a copy of the GNU General Public License | 7 | * License. You may obtain a copy of the GNU General Public License |
diff --git a/arch/arm/boot/dts/spear320-evb.dts b/arch/arm/boot/dts/spear320-evb.dts index fdedbb514102..1b1034477923 100644 --- a/arch/arm/boot/dts/spear320-evb.dts +++ b/arch/arm/boot/dts/spear320-evb.dts | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * DTS file for SPEAr320 Evaluation Baord | 2 | * DTS file for SPEAr320 Evaluation Baord |
| 3 | * | 3 | * |
| 4 | * Copyright 2012 Viresh Kumar <viresh.linux@gmail.com> | 4 | * Copyright 2012 Viresh Kumar <vireshk@kernel.org> |
| 5 | * | 5 | * |
| 6 | * The code contained herein is licensed under the GNU General Public | 6 | * The code contained herein is licensed under the GNU General Public |
| 7 | * License. You may obtain a copy of the GNU General Public License | 7 | * License. You may obtain a copy of the GNU General Public License |
diff --git a/arch/arm/boot/dts/spear320.dtsi b/arch/arm/boot/dts/spear320.dtsi index ffea342aeec9..22be6e5edaac 100644 --- a/arch/arm/boot/dts/spear320.dtsi +++ b/arch/arm/boot/dts/spear320.dtsi | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * DTS file for SPEAr320 SoC | 2 | * DTS file for SPEAr320 SoC |
| 3 | * | 3 | * |
| 4 | * Copyright 2012 Viresh Kumar <viresh.linux@gmail.com> | 4 | * Copyright 2012 Viresh Kumar <vireshk@kernel.org> |
| 5 | * | 5 | * |
| 6 | * The code contained herein is licensed under the GNU General Public | 6 | * The code contained herein is licensed under the GNU General Public |
| 7 | * License. You may obtain a copy of the GNU General Public License | 7 | * License. You may obtain a copy of the GNU General Public License |
diff --git a/arch/arm/boot/dts/spear3xx.dtsi b/arch/arm/boot/dts/spear3xx.dtsi index f0e3fcf8e323..118135d75899 100644 --- a/arch/arm/boot/dts/spear3xx.dtsi +++ b/arch/arm/boot/dts/spear3xx.dtsi | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * DTS file for all SPEAr3xx SoCs | 2 | * DTS file for all SPEAr3xx SoCs |
| 3 | * | 3 | * |
| 4 | * Copyright 2012 Viresh Kumar <viresh.linux@gmail.com> | 4 | * Copyright 2012 Viresh Kumar <vireshk@kernel.org> |
| 5 | * | 5 | * |
| 6 | * The code contained herein is licensed under the GNU General Public | 6 | * The code contained herein is licensed under the GNU General Public |
| 7 | * License. You may obtain a copy of the GNU General Public License | 7 | * License. You may obtain a copy of the GNU General Public License |
diff --git a/arch/arm/boot/dts/ste-ccu8540.dts b/arch/arm/boot/dts/ste-ccu8540.dts index 32dd55e5f4e6..6eaaf638e52e 100644 --- a/arch/arm/boot/dts/ste-ccu8540.dts +++ b/arch/arm/boot/dts/ste-ccu8540.dts | |||
| @@ -17,6 +17,13 @@ | |||
| 17 | model = "ST-Ericsson U8540 platform with Device Tree"; | 17 | model = "ST-Ericsson U8540 platform with Device Tree"; |
| 18 | compatible = "st-ericsson,ccu8540", "st-ericsson,u8540"; | 18 | compatible = "st-ericsson,ccu8540", "st-ericsson,u8540"; |
| 19 | 19 | ||
| 20 | /* This stablilizes the serial port enumeration */ | ||
| 21 | aliases { | ||
| 22 | serial0 = &ux500_serial0; | ||
| 23 | serial1 = &ux500_serial1; | ||
| 24 | serial2 = &ux500_serial2; | ||
| 25 | }; | ||
| 26 | |||
| 20 | memory@0 { | 27 | memory@0 { |
| 21 | device_type = "memory"; | 28 | device_type = "memory"; |
| 22 | reg = <0x20000000 0x1f000000>, <0xc0000000 0x3f000000>; | 29 | reg = <0x20000000 0x1f000000>, <0xc0000000 0x3f000000>; |
diff --git a/arch/arm/boot/dts/ste-ccu9540.dts b/arch/arm/boot/dts/ste-ccu9540.dts index 651c56d400a4..c8b815819cfe 100644 --- a/arch/arm/boot/dts/ste-ccu9540.dts +++ b/arch/arm/boot/dts/ste-ccu9540.dts | |||
| @@ -16,6 +16,13 @@ | |||
| 16 | model = "ST-Ericsson CCU9540 platform with Device Tree"; | 16 | model = "ST-Ericsson CCU9540 platform with Device Tree"; |
| 17 | compatible = "st-ericsson,ccu9540", "st-ericsson,u9540"; | 17 | compatible = "st-ericsson,ccu9540", "st-ericsson,u9540"; |
| 18 | 18 | ||
| 19 | /* This stablilizes the serial port enumeration */ | ||
| 20 | aliases { | ||
| 21 | serial0 = &ux500_serial0; | ||
| 22 | serial1 = &ux500_serial1; | ||
| 23 | serial2 = &ux500_serial2; | ||
| 24 | }; | ||
| 25 | |||
| 19 | memory { | 26 | memory { |
| 20 | reg = <0x00000000 0x20000000>; | 27 | reg = <0x00000000 0x20000000>; |
| 21 | }; | 28 | }; |
diff --git a/arch/arm/boot/dts/ste-dbx5x0.dtsi b/arch/arm/boot/dts/ste-dbx5x0.dtsi index 853684ad7773..a75f3289e653 100644 --- a/arch/arm/boot/dts/ste-dbx5x0.dtsi +++ b/arch/arm/boot/dts/ste-dbx5x0.dtsi | |||
| @@ -971,7 +971,7 @@ | |||
| 971 | power-domains = <&pm_domains DOMAIN_VAPE>; | 971 | power-domains = <&pm_domains DOMAIN_VAPE>; |
| 972 | }; | 972 | }; |
| 973 | 973 | ||
| 974 | uart@80120000 { | 974 | ux500_serial0: uart@80120000 { |
| 975 | compatible = "arm,pl011", "arm,primecell"; | 975 | compatible = "arm,pl011", "arm,primecell"; |
| 976 | reg = <0x80120000 0x1000>; | 976 | reg = <0x80120000 0x1000>; |
| 977 | interrupts = <0 11 IRQ_TYPE_LEVEL_HIGH>; | 977 | interrupts = <0 11 IRQ_TYPE_LEVEL_HIGH>; |
| @@ -986,7 +986,7 @@ | |||
| 986 | status = "disabled"; | 986 | status = "disabled"; |
| 987 | }; | 987 | }; |
| 988 | 988 | ||
| 989 | uart@80121000 { | 989 | ux500_serial1: uart@80121000 { |
| 990 | compatible = "arm,pl011", "arm,primecell"; | 990 | compatible = "arm,pl011", "arm,primecell"; |
| 991 | reg = <0x80121000 0x1000>; | 991 | reg = <0x80121000 0x1000>; |
| 992 | interrupts = <0 19 IRQ_TYPE_LEVEL_HIGH>; | 992 | interrupts = <0 19 IRQ_TYPE_LEVEL_HIGH>; |
| @@ -1001,7 +1001,7 @@ | |||
| 1001 | status = "disabled"; | 1001 | status = "disabled"; |
| 1002 | }; | 1002 | }; |
| 1003 | 1003 | ||
| 1004 | uart@80007000 { | 1004 | ux500_serial2: uart@80007000 { |
| 1005 | compatible = "arm,pl011", "arm,primecell"; | 1005 | compatible = "arm,pl011", "arm,primecell"; |
| 1006 | reg = <0x80007000 0x1000>; | 1006 | reg = <0x80007000 0x1000>; |
| 1007 | interrupts = <0 26 IRQ_TYPE_LEVEL_HIGH>; | 1007 | interrupts = <0 26 IRQ_TYPE_LEVEL_HIGH>; |
diff --git a/arch/arm/boot/dts/ste-href.dtsi b/arch/arm/boot/dts/ste-href.dtsi index 744c1e3a744d..6d8ce154347e 100644 --- a/arch/arm/boot/dts/ste-href.dtsi +++ b/arch/arm/boot/dts/ste-href.dtsi | |||
| @@ -32,11 +32,11 @@ | |||
| 32 | status = "okay"; | 32 | status = "okay"; |
| 33 | }; | 33 | }; |
| 34 | 34 | ||
| 35 | /* This UART is unused and thus left disabled */ | ||
| 35 | uart@80121000 { | 36 | uart@80121000 { |
| 36 | pinctrl-names = "default", "sleep"; | 37 | pinctrl-names = "default", "sleep"; |
| 37 | pinctrl-0 = <&uart1_default_mode>; | 38 | pinctrl-0 = <&uart1_default_mode>; |
| 38 | pinctrl-1 = <&uart1_sleep_mode>; | 39 | pinctrl-1 = <&uart1_sleep_mode>; |
| 39 | status = "okay"; | ||
| 40 | }; | 40 | }; |
| 41 | 41 | ||
| 42 | uart@80007000 { | 42 | uart@80007000 { |
diff --git a/arch/arm/boot/dts/ste-hrefprev60-stuib.dts b/arch/arm/boot/dts/ste-hrefprev60-stuib.dts index 2b1cb5b584b6..18e9795a94f9 100644 --- a/arch/arm/boot/dts/ste-hrefprev60-stuib.dts +++ b/arch/arm/boot/dts/ste-hrefprev60-stuib.dts | |||
| @@ -17,6 +17,13 @@ | |||
| 17 | model = "ST-Ericsson HREF (pre-v60) and ST UIB"; | 17 | model = "ST-Ericsson HREF (pre-v60) and ST UIB"; |
| 18 | compatible = "st-ericsson,mop500", "st-ericsson,u8500"; | 18 | compatible = "st-ericsson,mop500", "st-ericsson,u8500"; |
| 19 | 19 | ||
| 20 | /* This stablilizes the serial port enumeration */ | ||
| 21 | aliases { | ||
| 22 | serial0 = &ux500_serial0; | ||
| 23 | serial1 = &ux500_serial1; | ||
| 24 | serial2 = &ux500_serial2; | ||
| 25 | }; | ||
| 26 | |||
| 20 | soc { | 27 | soc { |
| 21 | /* Reset line for the BU21013 touchscreen */ | 28 | /* Reset line for the BU21013 touchscreen */ |
| 22 | i2c@80110000 { | 29 | i2c@80110000 { |
diff --git a/arch/arm/boot/dts/ste-hrefprev60-tvk.dts b/arch/arm/boot/dts/ste-hrefprev60-tvk.dts index 59523f866812..24739914e689 100644 --- a/arch/arm/boot/dts/ste-hrefprev60-tvk.dts +++ b/arch/arm/boot/dts/ste-hrefprev60-tvk.dts | |||
| @@ -16,4 +16,11 @@ | |||
| 16 | / { | 16 | / { |
| 17 | model = "ST-Ericsson HREF (pre-v60) and TVK1281618 UIB"; | 17 | model = "ST-Ericsson HREF (pre-v60) and TVK1281618 UIB"; |
| 18 | compatible = "st-ericsson,mop500", "st-ericsson,u8500"; | 18 | compatible = "st-ericsson,mop500", "st-ericsson,u8500"; |
| 19 | |||
| 20 | /* This stablilizes the serial port enumeration */ | ||
| 21 | aliases { | ||
| 22 | serial0 = &ux500_serial0; | ||
| 23 | serial1 = &ux500_serial1; | ||
| 24 | serial2 = &ux500_serial2; | ||
| 25 | }; | ||
| 19 | }; | 26 | }; |
diff --git a/arch/arm/boot/dts/ste-hrefprev60.dtsi b/arch/arm/boot/dts/ste-hrefprev60.dtsi index 7f3975b58d16..b0278f4c486c 100644 --- a/arch/arm/boot/dts/ste-hrefprev60.dtsi +++ b/arch/arm/boot/dts/ste-hrefprev60.dtsi | |||
| @@ -23,6 +23,11 @@ | |||
| 23 | }; | 23 | }; |
| 24 | 24 | ||
| 25 | soc { | 25 | soc { |
| 26 | /* Enable UART1 on this board */ | ||
| 27 | uart@80121000 { | ||
| 28 | status = "okay"; | ||
| 29 | }; | ||
| 30 | |||
| 26 | i2c@80004000 { | 31 | i2c@80004000 { |
| 27 | tps61052@33 { | 32 | tps61052@33 { |
| 28 | compatible = "tps61052"; | 33 | compatible = "tps61052"; |
diff --git a/arch/arm/boot/dts/ste-hrefv60plus-stuib.dts b/arch/arm/boot/dts/ste-hrefv60plus-stuib.dts index 8c6a2de56cf1..c2e1ba019a2f 100644 --- a/arch/arm/boot/dts/ste-hrefv60plus-stuib.dts +++ b/arch/arm/boot/dts/ste-hrefv60plus-stuib.dts | |||
| @@ -19,6 +19,13 @@ | |||
| 19 | model = "ST-Ericsson HREF (v60+) and ST UIB"; | 19 | model = "ST-Ericsson HREF (v60+) and ST UIB"; |
| 20 | compatible = "st-ericsson,hrefv60+", "st-ericsson,u8500"; | 20 | compatible = "st-ericsson,hrefv60+", "st-ericsson,u8500"; |
| 21 | 21 | ||
| 22 | /* This stablilizes the serial port enumeration */ | ||
| 23 | aliases { | ||
| 24 | serial0 = &ux500_serial0; | ||
| 25 | serial1 = &ux500_serial1; | ||
| 26 | serial2 = &ux500_serial2; | ||
| 27 | }; | ||
| 28 | |||
| 22 | soc { | 29 | soc { |
| 23 | /* Reset line for the BU21013 touchscreen */ | 30 | /* Reset line for the BU21013 touchscreen */ |
| 24 | i2c@80110000 { | 31 | i2c@80110000 { |
diff --git a/arch/arm/boot/dts/ste-hrefv60plus-tvk.dts b/arch/arm/boot/dts/ste-hrefv60plus-tvk.dts index d53cccdce776..ebd8547e98f1 100644 --- a/arch/arm/boot/dts/ste-hrefv60plus-tvk.dts +++ b/arch/arm/boot/dts/ste-hrefv60plus-tvk.dts | |||
| @@ -18,4 +18,11 @@ | |||
| 18 | / { | 18 | / { |
| 19 | model = "ST-Ericsson HREF (v60+) and TVK1281618 UIB"; | 19 | model = "ST-Ericsson HREF (v60+) and TVK1281618 UIB"; |
| 20 | compatible = "st-ericsson,hrefv60+", "st-ericsson,u8500"; | 20 | compatible = "st-ericsson,hrefv60+", "st-ericsson,u8500"; |
| 21 | |||
| 22 | /* This stablilizes the serial port enumeration */ | ||
| 23 | aliases { | ||
| 24 | serial0 = &ux500_serial0; | ||
| 25 | serial1 = &ux500_serial1; | ||
| 26 | serial2 = &ux500_serial2; | ||
| 27 | }; | ||
| 21 | }; | 28 | }; |
diff --git a/arch/arm/boot/dts/ste-hrefv60plus.dtsi b/arch/arm/boot/dts/ste-hrefv60plus.dtsi index a4bc9e77d640..810cda743b6d 100644 --- a/arch/arm/boot/dts/ste-hrefv60plus.dtsi +++ b/arch/arm/boot/dts/ste-hrefv60plus.dtsi | |||
| @@ -43,15 +43,26 @@ | |||
| 43 | <&vaudio_hf_hrefv60_mode>, | 43 | <&vaudio_hf_hrefv60_mode>, |
| 44 | <&gbf_hrefv60_mode>, | 44 | <&gbf_hrefv60_mode>, |
| 45 | <&hdtv_hrefv60_mode>, | 45 | <&hdtv_hrefv60_mode>, |
| 46 | <&touch_hrefv60_mode>; | 46 | <&touch_hrefv60_mode>, |
| 47 | <&gpios_hrefv60_mode>; | ||
| 47 | 48 | ||
| 48 | sdi0 { | 49 | sdi0 { |
| 49 | /* SD card detect GPIO pin, extend default state */ | ||
| 50 | sdi0_default_mode: sdi0_default { | 50 | sdi0_default_mode: sdi0_default { |
| 51 | /* SD card detect GPIO pin, extend default state */ | ||
| 51 | default_hrefv60_cfg1 { | 52 | default_hrefv60_cfg1 { |
| 52 | pins = "GPIO95_E8"; | 53 | pins = "GPIO95_E8"; |
| 53 | ste,config = <&gpio_in_pu>; | 54 | ste,config = <&gpio_in_pu>; |
| 54 | }; | 55 | }; |
| 56 | /* VMMCI level-shifter enable */ | ||
| 57 | default_hrefv60_cfg2 { | ||
| 58 | pins = "GPIO169_D22"; | ||
| 59 | ste,config = <&gpio_out_lo>; | ||
| 60 | }; | ||
| 61 | /* VMMCI level-shifter voltage select */ | ||
| 62 | default_hrefv60_cfg3 { | ||
| 63 | pins = "GPIO5_AG6"; | ||
| 64 | ste,config = <&gpio_out_hi>; | ||
| 65 | }; | ||
| 55 | }; | 66 | }; |
| 56 | }; | 67 | }; |
| 57 | ipgpio { | 68 | ipgpio { |
| @@ -213,6 +224,16 @@ | |||
| 213 | }; | 224 | }; |
| 214 | }; | 225 | }; |
| 215 | }; | 226 | }; |
| 227 | gpios { | ||
| 228 | /* Dangling GPIO pins */ | ||
| 229 | gpios_hrefv60_mode: gpios_hrefv60 { | ||
| 230 | default_cfg1 { | ||
| 231 | /* Normally UART1 RXD, now dangling */ | ||
| 232 | pins = "GPIO4_AH6"; | ||
| 233 | ste,config = <&in_pu>; | ||
| 234 | }; | ||
| 235 | }; | ||
| 236 | }; | ||
| 216 | }; | 237 | }; |
| 217 | }; | 238 | }; |
| 218 | }; | 239 | }; |
diff --git a/arch/arm/boot/dts/ste-snowball.dts b/arch/arm/boot/dts/ste-snowball.dts index 9edadc37719f..32a5ccb14e7e 100644 --- a/arch/arm/boot/dts/ste-snowball.dts +++ b/arch/arm/boot/dts/ste-snowball.dts | |||
| @@ -18,6 +18,13 @@ | |||
| 18 | model = "Calao Systems Snowball platform with device tree"; | 18 | model = "Calao Systems Snowball platform with device tree"; |
| 19 | compatible = "calaosystems,snowball-a9500", "st-ericsson,u9500"; | 19 | compatible = "calaosystems,snowball-a9500", "st-ericsson,u9500"; |
| 20 | 20 | ||
| 21 | /* This stablilizes the serial port enumeration */ | ||
| 22 | aliases { | ||
| 23 | serial0 = &ux500_serial0; | ||
| 24 | serial1 = &ux500_serial1; | ||
| 25 | serial2 = &ux500_serial2; | ||
| 26 | }; | ||
| 27 | |||
| 21 | memory { | 28 | memory { |
| 22 | reg = <0x00000000 0x20000000>; | 29 | reg = <0x00000000 0x20000000>; |
| 23 | }; | 30 | }; |
| @@ -223,11 +230,11 @@ | |||
| 223 | status = "okay"; | 230 | status = "okay"; |
| 224 | }; | 231 | }; |
| 225 | 232 | ||
| 233 | /* This UART is unused and thus left disabled */ | ||
| 226 | uart@80121000 { | 234 | uart@80121000 { |
| 227 | pinctrl-names = "default", "sleep"; | 235 | pinctrl-names = "default", "sleep"; |
| 228 | pinctrl-0 = <&uart1_default_mode>; | 236 | pinctrl-0 = <&uart1_default_mode>; |
| 229 | pinctrl-1 = <&uart1_sleep_mode>; | 237 | pinctrl-1 = <&uart1_sleep_mode>; |
| 230 | status = "okay"; | ||
| 231 | }; | 238 | }; |
| 232 | 239 | ||
| 233 | uart@80007000 { | 240 | uart@80007000 { |
| @@ -452,7 +459,21 @@ | |||
| 452 | pins = "GPIO21_AB3"; /* DAT31DIR */ | 459 | pins = "GPIO21_AB3"; /* DAT31DIR */ |
| 453 | ste,config = <&out_hi>; | 460 | ste,config = <&out_hi>; |
| 454 | }; | 461 | }; |
| 455 | 462 | /* SD card detect GPIO pin, extend default state */ | |
| 463 | snowball_cfg2 { | ||
| 464 | pins = "GPIO218_AH11"; | ||
| 465 | ste,config = <&gpio_in_pu>; | ||
| 466 | }; | ||
| 467 | /* VMMCI level-shifter enable */ | ||
| 468 | snowball_cfg3 { | ||
| 469 | pins = "GPIO217_AH12"; | ||
| 470 | ste,config = <&gpio_out_lo>; | ||
| 471 | }; | ||
| 472 | /* VMMCI level-shifter voltage select */ | ||
| 473 | snowball_cfg4 { | ||
| 474 | pins = "GPIO228_AJ6"; | ||
| 475 | ste,config = <&gpio_out_hi>; | ||
| 476 | }; | ||
| 456 | }; | 477 | }; |
| 457 | }; | 478 | }; |
| 458 | ssp0 { | 479 | ssp0 { |
diff --git a/arch/arm/include/asm/Kbuild b/arch/arm/include/asm/Kbuild index 83c50193626c..30b3bc1666d2 100644 --- a/arch/arm/include/asm/Kbuild +++ b/arch/arm/include/asm/Kbuild | |||
| @@ -13,6 +13,7 @@ generic-y += kdebug.h | |||
| 13 | generic-y += local.h | 13 | generic-y += local.h |
| 14 | generic-y += local64.h | 14 | generic-y += local64.h |
| 15 | generic-y += mcs_spinlock.h | 15 | generic-y += mcs_spinlock.h |
| 16 | generic-y += mm-arch-hooks.h | ||
| 16 | generic-y += msgbuf.h | 17 | generic-y += msgbuf.h |
| 17 | generic-y += param.h | 18 | generic-y += param.h |
| 18 | generic-y += parport.h | 19 | generic-y += parport.h |
diff --git a/arch/arm/include/asm/memory.h b/arch/arm/include/asm/memory.h index 6f225acc07c5..b7f6fb462ea0 100644 --- a/arch/arm/include/asm/memory.h +++ b/arch/arm/include/asm/memory.h | |||
| @@ -286,7 +286,7 @@ extern phys_addr_t (*arch_virt_to_idmap)(unsigned long x); | |||
| 286 | */ | 286 | */ |
| 287 | static inline phys_addr_t __virt_to_idmap(unsigned long x) | 287 | static inline phys_addr_t __virt_to_idmap(unsigned long x) |
| 288 | { | 288 | { |
| 289 | if (arch_virt_to_idmap) | 289 | if (IS_ENABLED(CONFIG_MMU) && arch_virt_to_idmap) |
| 290 | return arch_virt_to_idmap(x); | 290 | return arch_virt_to_idmap(x); |
| 291 | else | 291 | else |
| 292 | return __virt_to_phys(x); | 292 | return __virt_to_phys(x); |
diff --git a/arch/arm/include/asm/mm-arch-hooks.h b/arch/arm/include/asm/mm-arch-hooks.h deleted file mode 100644 index 7056660c7cc4..000000000000 --- a/arch/arm/include/asm/mm-arch-hooks.h +++ /dev/null | |||
| @@ -1,15 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Architecture specific mm hooks | ||
| 3 | * | ||
| 4 | * Copyright (C) 2015, IBM Corporation | ||
| 5 | * Author: Laurent Dufour <ldufour@linux.vnet.ibm.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef _ASM_ARM_MM_ARCH_HOOKS_H | ||
| 13 | #define _ASM_ARM_MM_ARCH_HOOKS_H | ||
| 14 | |||
| 15 | #endif /* _ASM_ARM_MM_ARCH_HOOKS_H */ | ||
diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c index 357f57ea83f4..54272e0be713 100644 --- a/arch/arm/kernel/perf_event.c +++ b/arch/arm/kernel/perf_event.c | |||
| @@ -818,12 +818,13 @@ static int of_pmu_irq_cfg(struct arm_pmu *pmu) | |||
| 818 | if (arch_find_n_match_cpu_physical_id(dn, cpu, NULL)) | 818 | if (arch_find_n_match_cpu_physical_id(dn, cpu, NULL)) |
| 819 | break; | 819 | break; |
| 820 | 820 | ||
| 821 | of_node_put(dn); | ||
| 822 | if (cpu >= nr_cpu_ids) { | 821 | if (cpu >= nr_cpu_ids) { |
| 823 | pr_warn("Failed to find logical CPU for %s\n", | 822 | pr_warn("Failed to find logical CPU for %s\n", |
| 824 | dn->name); | 823 | dn->name); |
| 824 | of_node_put(dn); | ||
| 825 | break; | 825 | break; |
| 826 | } | 826 | } |
| 827 | of_node_put(dn); | ||
| 827 | 828 | ||
| 828 | irqs[i] = cpu; | 829 | irqs[i] = cpu; |
| 829 | cpumask_set_cpu(cpu, &pmu->supported_cpus); | 830 | cpumask_set_cpu(cpu, &pmu->supported_cpus); |
diff --git a/arch/arm/kernel/reboot.c b/arch/arm/kernel/reboot.c index 1a4d232796be..38269358fd25 100644 --- a/arch/arm/kernel/reboot.c +++ b/arch/arm/kernel/reboot.c | |||
| @@ -50,7 +50,7 @@ static void __soft_restart(void *addr) | |||
| 50 | flush_cache_all(); | 50 | flush_cache_all(); |
| 51 | 51 | ||
| 52 | /* Switch to the identity mapping. */ | 52 | /* Switch to the identity mapping. */ |
| 53 | phys_reset = (phys_reset_t)(unsigned long)virt_to_phys(cpu_reset); | 53 | phys_reset = (phys_reset_t)(unsigned long)virt_to_idmap(cpu_reset); |
| 54 | phys_reset((unsigned long)addr); | 54 | phys_reset((unsigned long)addr); |
| 55 | 55 | ||
| 56 | /* Should never get here. */ | 56 | /* Should never get here. */ |
diff --git a/arch/arm/mach-imx/gpc.c b/arch/arm/mach-imx/gpc.c index 80bad29d609a..8c4467fad837 100644 --- a/arch/arm/mach-imx/gpc.c +++ b/arch/arm/mach-imx/gpc.c | |||
| @@ -291,8 +291,6 @@ void __init imx_gpc_check_dt(void) | |||
| 291 | } | 291 | } |
| 292 | } | 292 | } |
| 293 | 293 | ||
| 294 | #ifdef CONFIG_PM_GENERIC_DOMAINS | ||
| 295 | |||
| 296 | static void _imx6q_pm_pu_power_off(struct generic_pm_domain *genpd) | 294 | static void _imx6q_pm_pu_power_off(struct generic_pm_domain *genpd) |
| 297 | { | 295 | { |
| 298 | int iso, iso2sw; | 296 | int iso, iso2sw; |
| @@ -399,7 +397,6 @@ static struct genpd_onecell_data imx_gpc_onecell_data = { | |||
| 399 | static int imx_gpc_genpd_init(struct device *dev, struct regulator *pu_reg) | 397 | static int imx_gpc_genpd_init(struct device *dev, struct regulator *pu_reg) |
| 400 | { | 398 | { |
| 401 | struct clk *clk; | 399 | struct clk *clk; |
| 402 | bool is_off; | ||
| 403 | int i; | 400 | int i; |
| 404 | 401 | ||
| 405 | imx6q_pu_domain.reg = pu_reg; | 402 | imx6q_pu_domain.reg = pu_reg; |
| @@ -416,18 +413,13 @@ static int imx_gpc_genpd_init(struct device *dev, struct regulator *pu_reg) | |||
| 416 | } | 413 | } |
| 417 | imx6q_pu_domain.num_clks = i; | 414 | imx6q_pu_domain.num_clks = i; |
| 418 | 415 | ||
| 419 | is_off = IS_ENABLED(CONFIG_PM); | 416 | /* Enable power always in case bootloader disabled it. */ |
| 420 | if (is_off) { | 417 | imx6q_pm_pu_power_on(&imx6q_pu_domain.base); |
| 421 | _imx6q_pm_pu_power_off(&imx6q_pu_domain.base); | 418 | |
| 422 | } else { | 419 | if (!IS_ENABLED(CONFIG_PM_GENERIC_DOMAINS)) |
| 423 | /* | 420 | return 0; |
| 424 | * Enable power if compiled without CONFIG_PM in case the | ||
| 425 | * bootloader disabled it. | ||
| 426 | */ | ||
| 427 | imx6q_pm_pu_power_on(&imx6q_pu_domain.base); | ||
| 428 | } | ||
| 429 | 421 | ||
| 430 | pm_genpd_init(&imx6q_pu_domain.base, NULL, is_off); | 422 | pm_genpd_init(&imx6q_pu_domain.base, NULL, false); |
| 431 | return of_genpd_add_provider_onecell(dev->of_node, | 423 | return of_genpd_add_provider_onecell(dev->of_node, |
| 432 | &imx_gpc_onecell_data); | 424 | &imx_gpc_onecell_data); |
| 433 | 425 | ||
| @@ -437,13 +429,6 @@ clk_err: | |||
| 437 | return -EINVAL; | 429 | return -EINVAL; |
| 438 | } | 430 | } |
| 439 | 431 | ||
| 440 | #else | ||
| 441 | static inline int imx_gpc_genpd_init(struct device *dev, struct regulator *reg) | ||
| 442 | { | ||
| 443 | return 0; | ||
| 444 | } | ||
| 445 | #endif /* CONFIG_PM_GENERIC_DOMAINS */ | ||
| 446 | |||
| 447 | static int imx_gpc_probe(struct platform_device *pdev) | 432 | static int imx_gpc_probe(struct platform_device *pdev) |
| 448 | { | 433 | { |
| 449 | struct regulator *pu_reg; | 434 | struct regulator *pu_reg; |
diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig index ecc04ff13e95..4a023e8d1bdb 100644 --- a/arch/arm/mach-omap2/Kconfig +++ b/arch/arm/mach-omap2/Kconfig | |||
| @@ -60,6 +60,7 @@ config SOC_AM43XX | |||
| 60 | select ARM_GIC | 60 | select ARM_GIC |
| 61 | select MACH_OMAP_GENERIC | 61 | select MACH_OMAP_GENERIC |
| 62 | select MIGHT_HAVE_CACHE_L2X0 | 62 | select MIGHT_HAVE_CACHE_L2X0 |
| 63 | select HAVE_ARM_SCU | ||
| 63 | 64 | ||
| 64 | config SOC_DRA7XX | 65 | config SOC_DRA7XX |
| 65 | bool "TI DRA7XX" | 66 | bool "TI DRA7XX" |
diff --git a/arch/arm/mach-pxa/capc7117.c b/arch/arm/mach-pxa/capc7117.c index c092730749b9..bf366b39fa61 100644 --- a/arch/arm/mach-pxa/capc7117.c +++ b/arch/arm/mach-pxa/capc7117.c | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | #include <linux/ata_platform.h> | 24 | #include <linux/ata_platform.h> |
| 25 | #include <linux/serial_8250.h> | 25 | #include <linux/serial_8250.h> |
| 26 | #include <linux/gpio.h> | 26 | #include <linux/gpio.h> |
| 27 | #include <linux/regulator/machine.h> | ||
| 27 | 28 | ||
| 28 | #include <asm/mach-types.h> | 29 | #include <asm/mach-types.h> |
| 29 | #include <asm/mach/arch.h> | 30 | #include <asm/mach/arch.h> |
| @@ -144,6 +145,8 @@ static void __init capc7117_init(void) | |||
| 144 | 145 | ||
| 145 | capc7117_uarts_init(); | 146 | capc7117_uarts_init(); |
| 146 | capc7117_ide_init(); | 147 | capc7117_ide_init(); |
| 148 | |||
| 149 | regulator_has_full_constraints(); | ||
| 147 | } | 150 | } |
| 148 | 151 | ||
| 149 | MACHINE_START(CAPC7117, | 152 | MACHINE_START(CAPC7117, |
diff --git a/arch/arm/mach-pxa/cm-x2xx.c b/arch/arm/mach-pxa/cm-x2xx.c index bb99f59a36d8..a17a91eb8e9a 100644 --- a/arch/arm/mach-pxa/cm-x2xx.c +++ b/arch/arm/mach-pxa/cm-x2xx.c | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | #include <linux/syscore_ops.h> | 13 | #include <linux/syscore_ops.h> |
| 14 | #include <linux/irq.h> | 14 | #include <linux/irq.h> |
| 15 | #include <linux/gpio.h> | 15 | #include <linux/gpio.h> |
| 16 | #include <linux/regulator/machine.h> | ||
| 16 | 17 | ||
| 17 | #include <linux/dm9000.h> | 18 | #include <linux/dm9000.h> |
| 18 | #include <linux/leds.h> | 19 | #include <linux/leds.h> |
| @@ -466,6 +467,8 @@ static void __init cmx2xx_init(void) | |||
| 466 | cmx2xx_init_ac97(); | 467 | cmx2xx_init_ac97(); |
| 467 | cmx2xx_init_touchscreen(); | 468 | cmx2xx_init_touchscreen(); |
| 468 | cmx2xx_init_leds(); | 469 | cmx2xx_init_leds(); |
| 470 | |||
| 471 | regulator_has_full_constraints(); | ||
| 469 | } | 472 | } |
| 470 | 473 | ||
| 471 | static void __init cmx2xx_init_irq(void) | 474 | static void __init cmx2xx_init_irq(void) |
diff --git a/arch/arm/mach-pxa/cm-x300.c b/arch/arm/mach-pxa/cm-x300.c index 4d3588d26c2a..5851f4c254c1 100644 --- a/arch/arm/mach-pxa/cm-x300.c +++ b/arch/arm/mach-pxa/cm-x300.c | |||
| @@ -835,6 +835,8 @@ static void __init cm_x300_init(void) | |||
| 835 | cm_x300_init_ac97(); | 835 | cm_x300_init_ac97(); |
| 836 | cm_x300_init_wi2wi(); | 836 | cm_x300_init_wi2wi(); |
| 837 | cm_x300_init_bl(); | 837 | cm_x300_init_bl(); |
| 838 | |||
| 839 | regulator_has_full_constraints(); | ||
| 838 | } | 840 | } |
| 839 | 841 | ||
| 840 | static void __init cm_x300_fixup(struct tag *tags, char **cmdline) | 842 | static void __init cm_x300_fixup(struct tag *tags, char **cmdline) |
diff --git a/arch/arm/mach-pxa/colibri-pxa270.c b/arch/arm/mach-pxa/colibri-pxa270.c index 5f9d9303b346..3503826333c7 100644 --- a/arch/arm/mach-pxa/colibri-pxa270.c +++ b/arch/arm/mach-pxa/colibri-pxa270.c | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | #include <linux/mtd/partitions.h> | 18 | #include <linux/mtd/partitions.h> |
| 19 | #include <linux/mtd/physmap.h> | 19 | #include <linux/mtd/physmap.h> |
| 20 | #include <linux/platform_device.h> | 20 | #include <linux/platform_device.h> |
| 21 | #include <linux/regulator/machine.h> | ||
| 21 | #include <linux/ucb1400.h> | 22 | #include <linux/ucb1400.h> |
| 22 | 23 | ||
| 23 | #include <asm/mach/arch.h> | 24 | #include <asm/mach/arch.h> |
| @@ -294,6 +295,8 @@ static void __init colibri_pxa270_init(void) | |||
| 294 | printk(KERN_ERR "Illegal colibri_pxa270_baseboard type %d\n", | 295 | printk(KERN_ERR "Illegal colibri_pxa270_baseboard type %d\n", |
| 295 | colibri_pxa270_baseboard); | 296 | colibri_pxa270_baseboard); |
| 296 | } | 297 | } |
| 298 | |||
| 299 | regulator_has_full_constraints(); | ||
| 297 | } | 300 | } |
| 298 | 301 | ||
| 299 | /* The "Income s.r.o. SH-Dmaster PXA270 SBC" board can be booted either | 302 | /* The "Income s.r.o. SH-Dmaster PXA270 SBC" board can be booted either |
diff --git a/arch/arm/mach-pxa/em-x270.c b/arch/arm/mach-pxa/em-x270.c index 51531ecffca8..9d7072b04045 100644 --- a/arch/arm/mach-pxa/em-x270.c +++ b/arch/arm/mach-pxa/em-x270.c | |||
| @@ -1306,6 +1306,8 @@ static void __init em_x270_init(void) | |||
| 1306 | em_x270_init_i2c(); | 1306 | em_x270_init_i2c(); |
| 1307 | em_x270_init_camera(); | 1307 | em_x270_init_camera(); |
| 1308 | em_x270_userspace_consumers_init(); | 1308 | em_x270_userspace_consumers_init(); |
| 1309 | |||
| 1310 | regulator_has_full_constraints(); | ||
| 1309 | } | 1311 | } |
| 1310 | 1312 | ||
| 1311 | MACHINE_START(EM_X270, "Compulab EM-X270") | 1313 | MACHINE_START(EM_X270, "Compulab EM-X270") |
diff --git a/arch/arm/mach-pxa/icontrol.c b/arch/arm/mach-pxa/icontrol.c index c98511c5abd1..9b0eb0252af6 100644 --- a/arch/arm/mach-pxa/icontrol.c +++ b/arch/arm/mach-pxa/icontrol.c | |||
| @@ -26,6 +26,7 @@ | |||
| 26 | #include <linux/spi/spi.h> | 26 | #include <linux/spi/spi.h> |
| 27 | #include <linux/spi/pxa2xx_spi.h> | 27 | #include <linux/spi/pxa2xx_spi.h> |
| 28 | #include <linux/can/platform/mcp251x.h> | 28 | #include <linux/can/platform/mcp251x.h> |
| 29 | #include <linux/regulator/machine.h> | ||
| 29 | 30 | ||
| 30 | #include "generic.h" | 31 | #include "generic.h" |
| 31 | 32 | ||
| @@ -185,6 +186,8 @@ static void __init icontrol_init(void) | |||
| 185 | mxm_8x10_mmc_init(); | 186 | mxm_8x10_mmc_init(); |
| 186 | 187 | ||
| 187 | icontrol_can_init(); | 188 | icontrol_can_init(); |
| 189 | |||
| 190 | regulator_has_full_constraints(); | ||
| 188 | } | 191 | } |
| 189 | 192 | ||
| 190 | MACHINE_START(ICONTROL, "iControl/SafeTcam boards using Embedian MXM-8x10 CoM") | 193 | MACHINE_START(ICONTROL, "iControl/SafeTcam boards using Embedian MXM-8x10 CoM") |
diff --git a/arch/arm/mach-pxa/trizeps4.c b/arch/arm/mach-pxa/trizeps4.c index 872dcb20e757..066e3a250ee0 100644 --- a/arch/arm/mach-pxa/trizeps4.c +++ b/arch/arm/mach-pxa/trizeps4.c | |||
| @@ -26,6 +26,7 @@ | |||
| 26 | #include <linux/dm9000.h> | 26 | #include <linux/dm9000.h> |
| 27 | #include <linux/mtd/physmap.h> | 27 | #include <linux/mtd/physmap.h> |
| 28 | #include <linux/mtd/partitions.h> | 28 | #include <linux/mtd/partitions.h> |
| 29 | #include <linux/regulator/machine.h> | ||
| 29 | #include <linux/i2c/pxa-i2c.h> | 30 | #include <linux/i2c/pxa-i2c.h> |
| 30 | 31 | ||
| 31 | #include <asm/types.h> | 32 | #include <asm/types.h> |
| @@ -534,6 +535,8 @@ static void __init trizeps4_init(void) | |||
| 534 | 535 | ||
| 535 | BCR_writew(trizeps_conxs_bcr); | 536 | BCR_writew(trizeps_conxs_bcr); |
| 536 | board_backlight_power(1); | 537 | board_backlight_power(1); |
| 538 | |||
| 539 | regulator_has_full_constraints(); | ||
| 537 | } | 540 | } |
| 538 | 541 | ||
| 539 | static void __init trizeps4_map_io(void) | 542 | static void __init trizeps4_map_io(void) |
diff --git a/arch/arm/mach-pxa/vpac270.c b/arch/arm/mach-pxa/vpac270.c index aa89488f961e..54122a983ae3 100644 --- a/arch/arm/mach-pxa/vpac270.c +++ b/arch/arm/mach-pxa/vpac270.c | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | #include <linux/dm9000.h> | 24 | #include <linux/dm9000.h> |
| 25 | #include <linux/ucb1400.h> | 25 | #include <linux/ucb1400.h> |
| 26 | #include <linux/ata_platform.h> | 26 | #include <linux/ata_platform.h> |
| 27 | #include <linux/regulator/machine.h> | ||
| 27 | #include <linux/regulator/max1586.h> | 28 | #include <linux/regulator/max1586.h> |
| 28 | #include <linux/i2c/pxa-i2c.h> | 29 | #include <linux/i2c/pxa-i2c.h> |
| 29 | 30 | ||
| @@ -711,6 +712,8 @@ static void __init vpac270_init(void) | |||
| 711 | vpac270_ts_init(); | 712 | vpac270_ts_init(); |
| 712 | vpac270_rtc_init(); | 713 | vpac270_rtc_init(); |
| 713 | vpac270_ide_init(); | 714 | vpac270_ide_init(); |
| 715 | |||
| 716 | regulator_has_full_constraints(); | ||
| 714 | } | 717 | } |
| 715 | 718 | ||
| 716 | MACHINE_START(VPAC270, "Voipac PXA270") | 719 | MACHINE_START(VPAC270, "Voipac PXA270") |
diff --git a/arch/arm/mach-pxa/zeus.c b/arch/arm/mach-pxa/zeus.c index ac2ae5c71ab4..6158566fa0f7 100644 --- a/arch/arm/mach-pxa/zeus.c +++ b/arch/arm/mach-pxa/zeus.c | |||
| @@ -868,6 +868,8 @@ static void __init zeus_init(void) | |||
| 868 | i2c_register_board_info(0, ARRAY_AND_SIZE(zeus_i2c_devices)); | 868 | i2c_register_board_info(0, ARRAY_AND_SIZE(zeus_i2c_devices)); |
| 869 | pxa2xx_set_spi_info(3, &pxa2xx_spi_ssp3_master_info); | 869 | pxa2xx_set_spi_info(3, &pxa2xx_spi_ssp3_master_info); |
| 870 | spi_register_board_info(zeus_spi_board_info, ARRAY_SIZE(zeus_spi_board_info)); | 870 | spi_register_board_info(zeus_spi_board_info, ARRAY_SIZE(zeus_spi_board_info)); |
| 871 | |||
| 872 | regulator_has_full_constraints(); | ||
| 871 | } | 873 | } |
| 872 | 874 | ||
| 873 | static struct map_desc zeus_io_desc[] __initdata = { | 875 | static struct map_desc zeus_io_desc[] __initdata = { |
diff --git a/arch/arm/mach-spear/generic.h b/arch/arm/mach-spear/generic.h index a99d90a4d09c..06640914d9a0 100644 --- a/arch/arm/mach-spear/generic.h +++ b/arch/arm/mach-spear/generic.h | |||
| @@ -3,7 +3,7 @@ | |||
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2009-2012 ST Microelectronics | 4 | * Copyright (C) 2009-2012 ST Microelectronics |
| 5 | * Rajeev Kumar <rajeev-dlh.kumar@st.com> | 5 | * Rajeev Kumar <rajeev-dlh.kumar@st.com> |
| 6 | * Viresh Kumar <viresh.linux@gmail.com> | 6 | * Viresh Kumar <vireshk@kernel.org> |
| 7 | * | 7 | * |
| 8 | * This file is licensed under the terms of the GNU General Public | 8 | * This file is licensed under the terms of the GNU General Public |
| 9 | * License version 2. This program is licensed "as is" without any | 9 | * License version 2. This program is licensed "as is" without any |
diff --git a/arch/arm/mach-spear/include/mach/irqs.h b/arch/arm/mach-spear/include/mach/irqs.h index 92da0a8c6bce..7058720c5278 100644 --- a/arch/arm/mach-spear/include/mach/irqs.h +++ b/arch/arm/mach-spear/include/mach/irqs.h | |||
| @@ -3,7 +3,7 @@ | |||
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2009-2012 ST Microelectronics | 4 | * Copyright (C) 2009-2012 ST Microelectronics |
| 5 | * Rajeev Kumar <rajeev-dlh.kumar@st.com> | 5 | * Rajeev Kumar <rajeev-dlh.kumar@st.com> |
| 6 | * Viresh Kumar <viresh.linux@gmail.com> | 6 | * Viresh Kumar <vireshk@kernel.org> |
| 7 | * | 7 | * |
| 8 | * This file is licensed under the terms of the GNU General Public | 8 | * This file is licensed under the terms of the GNU General Public |
| 9 | * License version 2. This program is licensed "as is" without any | 9 | * License version 2. This program is licensed "as is" without any |
diff --git a/arch/arm/mach-spear/include/mach/misc_regs.h b/arch/arm/mach-spear/include/mach/misc_regs.h index 935639ce59ba..cfaf7c665b58 100644 --- a/arch/arm/mach-spear/include/mach/misc_regs.h +++ b/arch/arm/mach-spear/include/mach/misc_regs.h | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * Miscellaneous registers definitions for SPEAr3xx machine family | 4 | * Miscellaneous registers definitions for SPEAr3xx machine family |
| 5 | * | 5 | * |
| 6 | * Copyright (C) 2009 ST Microelectronics | 6 | * Copyright (C) 2009 ST Microelectronics |
| 7 | * Viresh Kumar <viresh.linux@gmail.com> | 7 | * Viresh Kumar <vireshk@kernel.org> |
| 8 | * | 8 | * |
| 9 | * This file is licensed under the terms of the GNU General Public | 9 | * This file is licensed under the terms of the GNU General Public |
| 10 | * License version 2. This program is licensed "as is" without any | 10 | * License version 2. This program is licensed "as is" without any |
diff --git a/arch/arm/mach-spear/include/mach/spear.h b/arch/arm/mach-spear/include/mach/spear.h index f2d6a0176575..5ed841ccf8a3 100644 --- a/arch/arm/mach-spear/include/mach/spear.h +++ b/arch/arm/mach-spear/include/mach/spear.h | |||
| @@ -3,7 +3,7 @@ | |||
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2009,2012 ST Microelectronics | 4 | * Copyright (C) 2009,2012 ST Microelectronics |
| 5 | * Rajeev Kumar<rajeev-dlh.kumar@st.com> | 5 | * Rajeev Kumar<rajeev-dlh.kumar@st.com> |
| 6 | * Viresh Kumar <viresh.linux@gmail.com> | 6 | * Viresh Kumar <vireshk@kernel.org> |
| 7 | * | 7 | * |
| 8 | * This file is licensed under the terms of the GNU General Public | 8 | * This file is licensed under the terms of the GNU General Public |
| 9 | * License version 2. This program is licensed "as is" without any | 9 | * License version 2. This program is licensed "as is" without any |
diff --git a/arch/arm/mach-spear/include/mach/uncompress.h b/arch/arm/mach-spear/include/mach/uncompress.h index 51b2dc93e4da..8439b9c12edb 100644 --- a/arch/arm/mach-spear/include/mach/uncompress.h +++ b/arch/arm/mach-spear/include/mach/uncompress.h | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * Serial port stubs for kernel decompress status messages | 4 | * Serial port stubs for kernel decompress status messages |
| 5 | * | 5 | * |
| 6 | * Copyright (C) 2009 ST Microelectronics | 6 | * Copyright (C) 2009 ST Microelectronics |
| 7 | * Viresh Kumar <viresh.linux@gmail.com> | 7 | * Viresh Kumar <vireshk@kernel.org> |
| 8 | * | 8 | * |
| 9 | * This file is licensed under the terms of the GNU General Public | 9 | * This file is licensed under the terms of the GNU General Public |
| 10 | * License version 2. This program is licensed "as is" without any | 10 | * License version 2. This program is licensed "as is" without any |
diff --git a/arch/arm/mach-spear/pl080.c b/arch/arm/mach-spear/pl080.c index cfa1199d0f4a..b4529f3e0ee9 100644 --- a/arch/arm/mach-spear/pl080.c +++ b/arch/arm/mach-spear/pl080.c | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * DMAC pl080 definitions for SPEAr platform | 4 | * DMAC pl080 definitions for SPEAr platform |
| 5 | * | 5 | * |
| 6 | * Copyright (C) 2012 ST Microelectronics | 6 | * Copyright (C) 2012 ST Microelectronics |
| 7 | * Viresh Kumar <viresh.linux@gmail.com> | 7 | * Viresh Kumar <vireshk@kernel.org> |
| 8 | * | 8 | * |
| 9 | * This file is licensed under the terms of the GNU General Public | 9 | * This file is licensed under the terms of the GNU General Public |
| 10 | * License version 2. This program is licensed "as is" without any | 10 | * License version 2. This program is licensed "as is" without any |
diff --git a/arch/arm/mach-spear/pl080.h b/arch/arm/mach-spear/pl080.h index eb6590ded40d..608dec6725ae 100644 --- a/arch/arm/mach-spear/pl080.h +++ b/arch/arm/mach-spear/pl080.h | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * DMAC pl080 definitions for SPEAr platform | 4 | * DMAC pl080 definitions for SPEAr platform |
| 5 | * | 5 | * |
| 6 | * Copyright (C) 2012 ST Microelectronics | 6 | * Copyright (C) 2012 ST Microelectronics |
| 7 | * Viresh Kumar <viresh.linux@gmail.com> | 7 | * Viresh Kumar <vireshk@kernel.org> |
| 8 | * | 8 | * |
| 9 | * This file is licensed under the terms of the GNU General Public | 9 | * This file is licensed under the terms of the GNU General Public |
| 10 | * License version 2. This program is licensed "as is" without any | 10 | * License version 2. This program is licensed "as is" without any |
diff --git a/arch/arm/mach-spear/restart.c b/arch/arm/mach-spear/restart.c index ce5e098c4888..b4342155a783 100644 --- a/arch/arm/mach-spear/restart.c +++ b/arch/arm/mach-spear/restart.c | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * SPEAr platform specific restart functions | 4 | * SPEAr platform specific restart functions |
| 5 | * | 5 | * |
| 6 | * Copyright (C) 2009 ST Microelectronics | 6 | * Copyright (C) 2009 ST Microelectronics |
| 7 | * Viresh Kumar <viresh.linux@gmail.com> | 7 | * Viresh Kumar <vireshk@kernel.org> |
| 8 | * | 8 | * |
| 9 | * This file is licensed under the terms of the GNU General Public | 9 | * This file is licensed under the terms of the GNU General Public |
| 10 | * License version 2. This program is licensed "as is" without any | 10 | * License version 2. This program is licensed "as is" without any |
diff --git a/arch/arm/mach-spear/spear1310.c b/arch/arm/mach-spear/spear1310.c index d9ce4d8000f0..cd5d375d91f0 100644 --- a/arch/arm/mach-spear/spear1310.c +++ b/arch/arm/mach-spear/spear1310.c | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * SPEAr1310 machine source file | 4 | * SPEAr1310 machine source file |
| 5 | * | 5 | * |
| 6 | * Copyright (C) 2012 ST Microelectronics | 6 | * Copyright (C) 2012 ST Microelectronics |
| 7 | * Viresh Kumar <viresh.linux@gmail.com> | 7 | * Viresh Kumar <vireshk@kernel.org> |
| 8 | * | 8 | * |
| 9 | * This file is licensed under the terms of the GNU General Public | 9 | * This file is licensed under the terms of the GNU General Public |
| 10 | * License version 2. This program is licensed "as is" without any | 10 | * License version 2. This program is licensed "as is" without any |
diff --git a/arch/arm/mach-spear/spear1340.c b/arch/arm/mach-spear/spear1340.c index 3f3c0f124bd3..94594d5a446c 100644 --- a/arch/arm/mach-spear/spear1340.c +++ b/arch/arm/mach-spear/spear1340.c | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * SPEAr1340 machine source file | 4 | * SPEAr1340 machine source file |
| 5 | * | 5 | * |
| 6 | * Copyright (C) 2012 ST Microelectronics | 6 | * Copyright (C) 2012 ST Microelectronics |
| 7 | * Viresh Kumar <viresh.linux@gmail.com> | 7 | * Viresh Kumar <vireshk@kernel.org> |
| 8 | * | 8 | * |
| 9 | * This file is licensed under the terms of the GNU General Public | 9 | * This file is licensed under the terms of the GNU General Public |
| 10 | * License version 2. This program is licensed "as is" without any | 10 | * License version 2. This program is licensed "as is" without any |
diff --git a/arch/arm/mach-spear/spear13xx.c b/arch/arm/mach-spear/spear13xx.c index 2e463a93468d..b7afce6795f4 100644 --- a/arch/arm/mach-spear/spear13xx.c +++ b/arch/arm/mach-spear/spear13xx.c | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * SPEAr13XX machines common source file | 4 | * SPEAr13XX machines common source file |
| 5 | * | 5 | * |
| 6 | * Copyright (C) 2012 ST Microelectronics | 6 | * Copyright (C) 2012 ST Microelectronics |
| 7 | * Viresh Kumar <viresh.linux@gmail.com> | 7 | * Viresh Kumar <vireshk@kernel.org> |
| 8 | * | 8 | * |
| 9 | * This file is licensed under the terms of the GNU General Public | 9 | * This file is licensed under the terms of the GNU General Public |
| 10 | * License version 2. This program is licensed "as is" without any | 10 | * License version 2. This program is licensed "as is" without any |
diff --git a/arch/arm/mach-spear/spear300.c b/arch/arm/mach-spear/spear300.c index b52e48f342f4..5b32edda2276 100644 --- a/arch/arm/mach-spear/spear300.c +++ b/arch/arm/mach-spear/spear300.c | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * SPEAr300 machine source file | 4 | * SPEAr300 machine source file |
| 5 | * | 5 | * |
| 6 | * Copyright (C) 2009-2012 ST Microelectronics | 6 | * Copyright (C) 2009-2012 ST Microelectronics |
| 7 | * Viresh Kumar <viresh.linux@gmail.com> | 7 | * Viresh Kumar <vireshk@kernel.org> |
| 8 | * | 8 | * |
| 9 | * This file is licensed under the terms of the GNU General Public | 9 | * This file is licensed under the terms of the GNU General Public |
| 10 | * License version 2. This program is licensed "as is" without any | 10 | * License version 2. This program is licensed "as is" without any |
diff --git a/arch/arm/mach-spear/spear310.c b/arch/arm/mach-spear/spear310.c index ed2029db391f..86a44ac7ff67 100644 --- a/arch/arm/mach-spear/spear310.c +++ b/arch/arm/mach-spear/spear310.c | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * SPEAr310 machine source file | 4 | * SPEAr310 machine source file |
| 5 | * | 5 | * |
| 6 | * Copyright (C) 2009-2012 ST Microelectronics | 6 | * Copyright (C) 2009-2012 ST Microelectronics |
| 7 | * Viresh Kumar <viresh.linux@gmail.com> | 7 | * Viresh Kumar <vireshk@kernel.org> |
| 8 | * | 8 | * |
| 9 | * This file is licensed under the terms of the GNU General Public | 9 | * This file is licensed under the terms of the GNU General Public |
| 10 | * License version 2. This program is licensed "as is" without any | 10 | * License version 2. This program is licensed "as is" without any |
diff --git a/arch/arm/mach-spear/spear320.c b/arch/arm/mach-spear/spear320.c index bf634b32a930..d45d751926c5 100644 --- a/arch/arm/mach-spear/spear320.c +++ b/arch/arm/mach-spear/spear320.c | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * SPEAr320 machine source file | 4 | * SPEAr320 machine source file |
| 5 | * | 5 | * |
| 6 | * Copyright (C) 2009-2012 ST Microelectronics | 6 | * Copyright (C) 2009-2012 ST Microelectronics |
| 7 | * Viresh Kumar <viresh.linux@gmail.com> | 7 | * Viresh Kumar <vireshk@kernel.org> |
| 8 | * | 8 | * |
| 9 | * This file is licensed under the terms of the GNU General Public | 9 | * This file is licensed under the terms of the GNU General Public |
| 10 | * License version 2. This program is licensed "as is" without any | 10 | * License version 2. This program is licensed "as is" without any |
diff --git a/arch/arm/mach-spear/spear3xx.c b/arch/arm/mach-spear/spear3xx.c index bf3b1fd8cb23..23394ac76cf2 100644 --- a/arch/arm/mach-spear/spear3xx.c +++ b/arch/arm/mach-spear/spear3xx.c | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * SPEAr3XX machines common source file | 4 | * SPEAr3XX machines common source file |
| 5 | * | 5 | * |
| 6 | * Copyright (C) 2009-2012 ST Microelectronics | 6 | * Copyright (C) 2009-2012 ST Microelectronics |
| 7 | * Viresh Kumar <viresh.linux@gmail.com> | 7 | * Viresh Kumar <vireshk@kernel.org> |
| 8 | * | 8 | * |
| 9 | * This file is licensed under the terms of the GNU General Public | 9 | * This file is licensed under the terms of the GNU General Public |
| 10 | * License version 2. This program is licensed "as is" without any | 10 | * License version 2. This program is licensed "as is" without any |
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 1ced8a0f7a52..cba12f34ff77 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c | |||
| @@ -1971,7 +1971,7 @@ static int extend_iommu_mapping(struct dma_iommu_mapping *mapping) | |||
| 1971 | { | 1971 | { |
| 1972 | int next_bitmap; | 1972 | int next_bitmap; |
| 1973 | 1973 | ||
| 1974 | if (mapping->nr_bitmaps > mapping->extensions) | 1974 | if (mapping->nr_bitmaps >= mapping->extensions) |
| 1975 | return -EINVAL; | 1975 | return -EINVAL; |
| 1976 | 1976 | ||
| 1977 | next_bitmap = mapping->nr_bitmaps; | 1977 | next_bitmap = mapping->nr_bitmaps; |
diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S index 0716bbe19872..de2b246fed38 100644 --- a/arch/arm/mm/proc-v7.S +++ b/arch/arm/mm/proc-v7.S | |||
| @@ -274,7 +274,10 @@ __v7_ca15mp_setup: | |||
| 274 | __v7_b15mp_setup: | 274 | __v7_b15mp_setup: |
| 275 | __v7_ca17mp_setup: | 275 | __v7_ca17mp_setup: |
| 276 | mov r10, #0 | 276 | mov r10, #0 |
| 277 | 1: | 277 | 1: adr r12, __v7_setup_stack @ the local stack |
| 278 | stmia r12, {r0-r5, lr} @ v7_invalidate_l1 touches r0-r6 | ||
| 279 | bl v7_invalidate_l1 | ||
| 280 | ldmia r12, {r0-r5, lr} | ||
| 278 | #ifdef CONFIG_SMP | 281 | #ifdef CONFIG_SMP |
| 279 | ALT_SMP(mrc p15, 0, r0, c1, c0, 1) | 282 | ALT_SMP(mrc p15, 0, r0, c1, c0, 1) |
| 280 | ALT_UP(mov r0, #(1 << 6)) @ fake it for UP | 283 | ALT_UP(mov r0, #(1 << 6)) @ fake it for UP |
| @@ -283,7 +286,7 @@ __v7_ca17mp_setup: | |||
| 283 | orreq r0, r0, r10 @ Enable CPU-specific SMP bits | 286 | orreq r0, r0, r10 @ Enable CPU-specific SMP bits |
| 284 | mcreq p15, 0, r0, c1, c0, 1 | 287 | mcreq p15, 0, r0, c1, c0, 1 |
| 285 | #endif | 288 | #endif |
| 286 | b __v7_setup | 289 | b __v7_setup_cont |
| 287 | 290 | ||
| 288 | /* | 291 | /* |
| 289 | * Errata: | 292 | * Errata: |
| @@ -413,10 +416,11 @@ __v7_pj4b_setup: | |||
| 413 | 416 | ||
| 414 | __v7_setup: | 417 | __v7_setup: |
| 415 | adr r12, __v7_setup_stack @ the local stack | 418 | adr r12, __v7_setup_stack @ the local stack |
| 416 | stmia r12, {r0-r5, r7, r9, r11, lr} | 419 | stmia r12, {r0-r5, lr} @ v7_invalidate_l1 touches r0-r6 |
| 417 | bl v7_invalidate_l1 | 420 | bl v7_invalidate_l1 |
| 418 | ldmia r12, {r0-r5, r7, r9, r11, lr} | 421 | ldmia r12, {r0-r5, lr} |
| 419 | 422 | ||
| 423 | __v7_setup_cont: | ||
| 420 | and r0, r9, #0xff000000 @ ARM? | 424 | and r0, r9, #0xff000000 @ ARM? |
| 421 | teq r0, #0x41000000 | 425 | teq r0, #0x41000000 |
| 422 | bne __errata_finish | 426 | bne __errata_finish |
| @@ -480,7 +484,7 @@ ENDPROC(__v7_setup) | |||
| 480 | 484 | ||
| 481 | .align 2 | 485 | .align 2 |
| 482 | __v7_setup_stack: | 486 | __v7_setup_stack: |
| 483 | .space 4 * 11 @ 11 registers | 487 | .space 4 * 7 @ 12 registers |
| 484 | 488 | ||
| 485 | __INITDATA | 489 | __INITDATA |
| 486 | 490 | ||
diff --git a/arch/arm64/include/asm/Kbuild b/arch/arm64/include/asm/Kbuild index b112a39834d0..70fd9ffb58cf 100644 --- a/arch/arm64/include/asm/Kbuild +++ b/arch/arm64/include/asm/Kbuild | |||
| @@ -25,6 +25,7 @@ generic-y += kvm_para.h | |||
| 25 | generic-y += local.h | 25 | generic-y += local.h |
| 26 | generic-y += local64.h | 26 | generic-y += local64.h |
| 27 | generic-y += mcs_spinlock.h | 27 | generic-y += mcs_spinlock.h |
| 28 | generic-y += mm-arch-hooks.h | ||
| 28 | generic-y += mman.h | 29 | generic-y += mman.h |
| 29 | generic-y += msgbuf.h | 30 | generic-y += msgbuf.h |
| 30 | generic-y += msi.h | 31 | generic-y += msi.h |
diff --git a/arch/arm64/include/asm/mm-arch-hooks.h b/arch/arm64/include/asm/mm-arch-hooks.h deleted file mode 100644 index 562b655f5ba9..000000000000 --- a/arch/arm64/include/asm/mm-arch-hooks.h +++ /dev/null | |||
| @@ -1,15 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Architecture specific mm hooks | ||
| 3 | * | ||
| 4 | * Copyright (C) 2015, IBM Corporation | ||
| 5 | * Author: Laurent Dufour <ldufour@linux.vnet.ibm.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef _ASM_ARM64_MM_ARCH_HOOKS_H | ||
| 13 | #define _ASM_ARM64_MM_ARCH_HOOKS_H | ||
| 14 | |||
| 15 | #endif /* _ASM_ARM64_MM_ARCH_HOOKS_H */ | ||
diff --git a/arch/avr32/include/asm/Kbuild b/arch/avr32/include/asm/Kbuild index 1d66afdfac07..f61f2dd67464 100644 --- a/arch/avr32/include/asm/Kbuild +++ b/arch/avr32/include/asm/Kbuild | |||
| @@ -12,6 +12,7 @@ generic-y += irq_work.h | |||
| 12 | generic-y += local.h | 12 | generic-y += local.h |
| 13 | generic-y += local64.h | 13 | generic-y += local64.h |
| 14 | generic-y += mcs_spinlock.h | 14 | generic-y += mcs_spinlock.h |
| 15 | generic-y += mm-arch-hooks.h | ||
| 15 | generic-y += param.h | 16 | generic-y += param.h |
| 16 | generic-y += percpu.h | 17 | generic-y += percpu.h |
| 17 | generic-y += preempt.h | 18 | generic-y += preempt.h |
diff --git a/arch/avr32/include/asm/mm-arch-hooks.h b/arch/avr32/include/asm/mm-arch-hooks.h deleted file mode 100644 index 145452ffbdad..000000000000 --- a/arch/avr32/include/asm/mm-arch-hooks.h +++ /dev/null | |||
| @@ -1,15 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Architecture specific mm hooks | ||
| 3 | * | ||
| 4 | * Copyright (C) 2015, IBM Corporation | ||
| 5 | * Author: Laurent Dufour <ldufour@linux.vnet.ibm.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef _ASM_AVR32_MM_ARCH_HOOKS_H | ||
| 13 | #define _ASM_AVR32_MM_ARCH_HOOKS_H | ||
| 14 | |||
| 15 | #endif /* _ASM_AVR32_MM_ARCH_HOOKS_H */ | ||
diff --git a/arch/blackfin/include/asm/Kbuild b/arch/blackfin/include/asm/Kbuild index 07051a63415d..61cd1e786a14 100644 --- a/arch/blackfin/include/asm/Kbuild +++ b/arch/blackfin/include/asm/Kbuild | |||
| @@ -21,6 +21,7 @@ generic-y += kvm_para.h | |||
| 21 | generic-y += local.h | 21 | generic-y += local.h |
| 22 | generic-y += local64.h | 22 | generic-y += local64.h |
| 23 | generic-y += mcs_spinlock.h | 23 | generic-y += mcs_spinlock.h |
| 24 | generic-y += mm-arch-hooks.h | ||
| 24 | generic-y += mman.h | 25 | generic-y += mman.h |
| 25 | generic-y += msgbuf.h | 26 | generic-y += msgbuf.h |
| 26 | generic-y += mutex.h | 27 | generic-y += mutex.h |
diff --git a/arch/blackfin/include/asm/mm-arch-hooks.h b/arch/blackfin/include/asm/mm-arch-hooks.h deleted file mode 100644 index 1c5211ec338f..000000000000 --- a/arch/blackfin/include/asm/mm-arch-hooks.h +++ /dev/null | |||
| @@ -1,15 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Architecture specific mm hooks | ||
| 3 | * | ||
| 4 | * Copyright (C) 2015, IBM Corporation | ||
| 5 | * Author: Laurent Dufour <ldufour@linux.vnet.ibm.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef _ASM_BLACKFIN_MM_ARCH_HOOKS_H | ||
| 13 | #define _ASM_BLACKFIN_MM_ARCH_HOOKS_H | ||
| 14 | |||
| 15 | #endif /* _ASM_BLACKFIN_MM_ARCH_HOOKS_H */ | ||
diff --git a/arch/c6x/include/asm/Kbuild b/arch/c6x/include/asm/Kbuild index 7aeb32272975..f17c4dc6050c 100644 --- a/arch/c6x/include/asm/Kbuild +++ b/arch/c6x/include/asm/Kbuild | |||
| @@ -26,6 +26,7 @@ generic-y += kdebug.h | |||
| 26 | generic-y += kmap_types.h | 26 | generic-y += kmap_types.h |
| 27 | generic-y += local.h | 27 | generic-y += local.h |
| 28 | generic-y += mcs_spinlock.h | 28 | generic-y += mcs_spinlock.h |
| 29 | generic-y += mm-arch-hooks.h | ||
| 29 | generic-y += mman.h | 30 | generic-y += mman.h |
| 30 | generic-y += mmu.h | 31 | generic-y += mmu.h |
| 31 | generic-y += mmu_context.h | 32 | generic-y += mmu_context.h |
diff --git a/arch/c6x/include/asm/mm-arch-hooks.h b/arch/c6x/include/asm/mm-arch-hooks.h deleted file mode 100644 index bb3c4a6ce8e9..000000000000 --- a/arch/c6x/include/asm/mm-arch-hooks.h +++ /dev/null | |||
| @@ -1,15 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Architecture specific mm hooks | ||
| 3 | * | ||
| 4 | * Copyright (C) 2015, IBM Corporation | ||
| 5 | * Author: Laurent Dufour <ldufour@linux.vnet.ibm.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef _ASM_C6X_MM_ARCH_HOOKS_H | ||
| 13 | #define _ASM_C6X_MM_ARCH_HOOKS_H | ||
| 14 | |||
| 15 | #endif /* _ASM_C6X_MM_ARCH_HOOKS_H */ | ||
diff --git a/arch/cris/include/asm/Kbuild b/arch/cris/include/asm/Kbuild index d294f6aaff1d..ad2244f35bca 100644 --- a/arch/cris/include/asm/Kbuild +++ b/arch/cris/include/asm/Kbuild | |||
| @@ -18,6 +18,7 @@ generic-y += linkage.h | |||
| 18 | generic-y += local.h | 18 | generic-y += local.h |
| 19 | generic-y += local64.h | 19 | generic-y += local64.h |
| 20 | generic-y += mcs_spinlock.h | 20 | generic-y += mcs_spinlock.h |
| 21 | generic-y += mm-arch-hooks.h | ||
| 21 | generic-y += module.h | 22 | generic-y += module.h |
| 22 | generic-y += percpu.h | 23 | generic-y += percpu.h |
| 23 | generic-y += preempt.h | 24 | generic-y += preempt.h |
diff --git a/arch/cris/include/asm/mm-arch-hooks.h b/arch/cris/include/asm/mm-arch-hooks.h deleted file mode 100644 index 314f774db2b0..000000000000 --- a/arch/cris/include/asm/mm-arch-hooks.h +++ /dev/null | |||
| @@ -1,15 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Architecture specific mm hooks | ||
| 3 | * | ||
| 4 | * Copyright (C) 2015, IBM Corporation | ||
| 5 | * Author: Laurent Dufour <ldufour@linux.vnet.ibm.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef _ASM_CRIS_MM_ARCH_HOOKS_H | ||
| 13 | #define _ASM_CRIS_MM_ARCH_HOOKS_H | ||
| 14 | |||
| 15 | #endif /* _ASM_CRIS_MM_ARCH_HOOKS_H */ | ||
diff --git a/arch/frv/include/asm/Kbuild b/arch/frv/include/asm/Kbuild index 30edce31e5c2..8e47b832cc76 100644 --- a/arch/frv/include/asm/Kbuild +++ b/arch/frv/include/asm/Kbuild | |||
| @@ -4,5 +4,6 @@ generic-y += cputime.h | |||
| 4 | generic-y += exec.h | 4 | generic-y += exec.h |
| 5 | generic-y += irq_work.h | 5 | generic-y += irq_work.h |
| 6 | generic-y += mcs_spinlock.h | 6 | generic-y += mcs_spinlock.h |
| 7 | generic-y += mm-arch-hooks.h | ||
| 7 | generic-y += preempt.h | 8 | generic-y += preempt.h |
| 8 | generic-y += trace_clock.h | 9 | generic-y += trace_clock.h |
diff --git a/arch/frv/include/asm/mm-arch-hooks.h b/arch/frv/include/asm/mm-arch-hooks.h deleted file mode 100644 index 51d13a870404..000000000000 --- a/arch/frv/include/asm/mm-arch-hooks.h +++ /dev/null | |||
| @@ -1,15 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Architecture specific mm hooks | ||
| 3 | * | ||
| 4 | * Copyright (C) 2015, IBM Corporation | ||
| 5 | * Author: Laurent Dufour <ldufour@linux.vnet.ibm.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef _ASM_FRV_MM_ARCH_HOOKS_H | ||
| 13 | #define _ASM_FRV_MM_ARCH_HOOKS_H | ||
| 14 | |||
| 15 | #endif /* _ASM_FRV_MM_ARCH_HOOKS_H */ | ||
diff --git a/arch/h8300/include/asm/Kbuild b/arch/h8300/include/asm/Kbuild index 00379d64f707..70e6ae1e7006 100644 --- a/arch/h8300/include/asm/Kbuild +++ b/arch/h8300/include/asm/Kbuild | |||
| @@ -33,6 +33,7 @@ generic-y += linkage.h | |||
| 33 | generic-y += local.h | 33 | generic-y += local.h |
| 34 | generic-y += local64.h | 34 | generic-y += local64.h |
| 35 | generic-y += mcs_spinlock.h | 35 | generic-y += mcs_spinlock.h |
| 36 | generic-y += mm-arch-hooks.h | ||
| 36 | generic-y += mman.h | 37 | generic-y += mman.h |
| 37 | generic-y += mmu.h | 38 | generic-y += mmu.h |
| 38 | generic-y += mmu_context.h | 39 | generic-y += mmu_context.h |
diff --git a/arch/hexagon/include/asm/Kbuild b/arch/hexagon/include/asm/Kbuild index 5ade4a163558..daee37bd0999 100644 --- a/arch/hexagon/include/asm/Kbuild +++ b/arch/hexagon/include/asm/Kbuild | |||
| @@ -28,6 +28,7 @@ generic-y += kmap_types.h | |||
| 28 | generic-y += local.h | 28 | generic-y += local.h |
| 29 | generic-y += local64.h | 29 | generic-y += local64.h |
| 30 | generic-y += mcs_spinlock.h | 30 | generic-y += mcs_spinlock.h |
| 31 | generic-y += mm-arch-hooks.h | ||
| 31 | generic-y += mman.h | 32 | generic-y += mman.h |
| 32 | generic-y += msgbuf.h | 33 | generic-y += msgbuf.h |
| 33 | generic-y += pci.h | 34 | generic-y += pci.h |
diff --git a/arch/hexagon/include/asm/mm-arch-hooks.h b/arch/hexagon/include/asm/mm-arch-hooks.h deleted file mode 100644 index 05e8b939e416..000000000000 --- a/arch/hexagon/include/asm/mm-arch-hooks.h +++ /dev/null | |||
| @@ -1,15 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Architecture specific mm hooks | ||
| 3 | * | ||
| 4 | * Copyright (C) 2015, IBM Corporation | ||
| 5 | * Author: Laurent Dufour <ldufour@linux.vnet.ibm.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef _ASM_HEXAGON_MM_ARCH_HOOKS_H | ||
| 13 | #define _ASM_HEXAGON_MM_ARCH_HOOKS_H | ||
| 14 | |||
| 15 | #endif /* _ASM_HEXAGON_MM_ARCH_HOOKS_H */ | ||
diff --git a/arch/ia64/include/asm/Kbuild b/arch/ia64/include/asm/Kbuild index ccff13d33fa2..9de3ba12f6b9 100644 --- a/arch/ia64/include/asm/Kbuild +++ b/arch/ia64/include/asm/Kbuild | |||
| @@ -4,6 +4,7 @@ generic-y += exec.h | |||
| 4 | generic-y += irq_work.h | 4 | generic-y += irq_work.h |
| 5 | generic-y += kvm_para.h | 5 | generic-y += kvm_para.h |
| 6 | generic-y += mcs_spinlock.h | 6 | generic-y += mcs_spinlock.h |
| 7 | generic-y += mm-arch-hooks.h | ||
| 7 | generic-y += preempt.h | 8 | generic-y += preempt.h |
| 8 | generic-y += trace_clock.h | 9 | generic-y += trace_clock.h |
| 9 | generic-y += vtime.h | 10 | generic-y += vtime.h |
diff --git a/arch/ia64/include/asm/mm-arch-hooks.h b/arch/ia64/include/asm/mm-arch-hooks.h deleted file mode 100644 index ab4b5c698322..000000000000 --- a/arch/ia64/include/asm/mm-arch-hooks.h +++ /dev/null | |||
| @@ -1,15 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Architecture specific mm hooks | ||
| 3 | * | ||
| 4 | * Copyright (C) 2015, IBM Corporation | ||
| 5 | * Author: Laurent Dufour <ldufour@linux.vnet.ibm.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef _ASM_IA64_MM_ARCH_HOOKS_H | ||
| 13 | #define _ASM_IA64_MM_ARCH_HOOKS_H | ||
| 14 | |||
| 15 | #endif /* _ASM_IA64_MM_ARCH_HOOKS_H */ | ||
diff --git a/arch/m32r/include/asm/Kbuild b/arch/m32r/include/asm/Kbuild index ba1cdc018731..e0eb704ca1fa 100644 --- a/arch/m32r/include/asm/Kbuild +++ b/arch/m32r/include/asm/Kbuild | |||
| @@ -4,6 +4,7 @@ generic-y += cputime.h | |||
| 4 | generic-y += exec.h | 4 | generic-y += exec.h |
| 5 | generic-y += irq_work.h | 5 | generic-y += irq_work.h |
| 6 | generic-y += mcs_spinlock.h | 6 | generic-y += mcs_spinlock.h |
| 7 | generic-y += mm-arch-hooks.h | ||
| 7 | generic-y += module.h | 8 | generic-y += module.h |
| 8 | generic-y += preempt.h | 9 | generic-y += preempt.h |
| 9 | generic-y += sections.h | 10 | generic-y += sections.h |
diff --git a/arch/m32r/include/asm/mm-arch-hooks.h b/arch/m32r/include/asm/mm-arch-hooks.h deleted file mode 100644 index 6d60b4750f41..000000000000 --- a/arch/m32r/include/asm/mm-arch-hooks.h +++ /dev/null | |||
| @@ -1,15 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Architecture specific mm hooks | ||
| 3 | * | ||
| 4 | * Copyright (C) 2015, IBM Corporation | ||
| 5 | * Author: Laurent Dufour <ldufour@linux.vnet.ibm.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef _ASM_M32R_MM_ARCH_HOOKS_H | ||
| 13 | #define _ASM_M32R_MM_ARCH_HOOKS_H | ||
| 14 | |||
| 15 | #endif /* _ASM_M32R_MM_ARCH_HOOKS_H */ | ||
diff --git a/arch/m68k/Kconfig.cpu b/arch/m68k/Kconfig.cpu index 33013dfcd3e1..c496d48a8c8d 100644 --- a/arch/m68k/Kconfig.cpu +++ b/arch/m68k/Kconfig.cpu | |||
| @@ -125,6 +125,13 @@ endif # M68KCLASSIC | |||
| 125 | 125 | ||
| 126 | if COLDFIRE | 126 | if COLDFIRE |
| 127 | 127 | ||
| 128 | choice | ||
| 129 | prompt "ColdFire SoC type" | ||
| 130 | default M520x | ||
| 131 | help | ||
| 132 | Select the type of ColdFire System-on-Chip (SoC) that you want | ||
| 133 | to build for. | ||
| 134 | |||
| 128 | config M5206 | 135 | config M5206 |
| 129 | bool "MCF5206" | 136 | bool "MCF5206" |
| 130 | depends on !MMU | 137 | depends on !MMU |
| @@ -174,9 +181,6 @@ config M525x | |||
| 174 | help | 181 | help |
| 175 | Freescale (Motorola) Coldfire 5251/5253 processor support. | 182 | Freescale (Motorola) Coldfire 5251/5253 processor support. |
| 176 | 183 | ||
| 177 | config M527x | ||
| 178 | bool | ||
| 179 | |||
| 180 | config M5271 | 184 | config M5271 |
| 181 | bool "MCF5271" | 185 | bool "MCF5271" |
| 182 | depends on !MMU | 186 | depends on !MMU |
| @@ -223,9 +227,6 @@ config M5307 | |||
| 223 | help | 227 | help |
| 224 | Motorola ColdFire 5307 processor support. | 228 | Motorola ColdFire 5307 processor support. |
| 225 | 229 | ||
| 226 | config M53xx | ||
| 227 | bool | ||
| 228 | |||
| 229 | config M532x | 230 | config M532x |
| 230 | bool "MCF532x" | 231 | bool "MCF532x" |
| 231 | depends on !MMU | 232 | depends on !MMU |
| @@ -251,9 +252,6 @@ config M5407 | |||
| 251 | help | 252 | help |
| 252 | Motorola ColdFire 5407 processor support. | 253 | Motorola ColdFire 5407 processor support. |
| 253 | 254 | ||
| 254 | config M54xx | ||
| 255 | bool | ||
| 256 | |||
| 257 | config M547x | 255 | config M547x |
| 258 | bool "MCF547x" | 256 | bool "MCF547x" |
| 259 | select M54xx | 257 | select M54xx |
| @@ -280,6 +278,17 @@ config M5441x | |||
| 280 | help | 278 | help |
| 281 | Freescale Coldfire 54410/54415/54416/54417/54418 processor support. | 279 | Freescale Coldfire 54410/54415/54416/54417/54418 processor support. |
| 282 | 280 | ||
| 281 | endchoice | ||
| 282 | |||
| 283 | config M527x | ||
| 284 | bool | ||
| 285 | |||
| 286 | config M53xx | ||
| 287 | bool | ||
| 288 | |||
| 289 | config M54xx | ||
| 290 | bool | ||
| 291 | |||
| 283 | endif # COLDFIRE | 292 | endif # COLDFIRE |
| 284 | 293 | ||
| 285 | 294 | ||
| @@ -416,22 +425,18 @@ config HAVE_MBAR | |||
| 416 | config HAVE_IPSBAR | 425 | config HAVE_IPSBAR |
| 417 | bool | 426 | bool |
| 418 | 427 | ||
| 419 | config CLOCK_SET | ||
| 420 | bool "Enable setting the CPU clock frequency" | ||
| 421 | depends on COLDFIRE | ||
| 422 | default n | ||
| 423 | help | ||
| 424 | On some CPU's you do not need to know what the core CPU clock | ||
| 425 | frequency is. On these you can disable clock setting. On some | ||
| 426 | traditional 68K parts, and on all ColdFire parts you need to set | ||
| 427 | the appropriate CPU clock frequency. On these devices many of the | ||
| 428 | onboard peripherals derive their timing from the master CPU clock | ||
| 429 | frequency. | ||
| 430 | |||
| 431 | config CLOCK_FREQ | 428 | config CLOCK_FREQ |
| 432 | int "Set the core clock frequency" | 429 | int "Set the core clock frequency" |
| 430 | default "25000000" if M5206 | ||
| 431 | default "54000000" if M5206e | ||
| 432 | default "166666666" if M520x | ||
| 433 | default "140000000" if M5249 | ||
| 434 | default "150000000" if M527x || M523x | ||
| 435 | default "90000000" if M5307 | ||
| 436 | default "50000000" if M5407 | ||
| 437 | default "266000000" if M54xx | ||
| 433 | default "66666666" | 438 | default "66666666" |
| 434 | depends on CLOCK_SET | 439 | depends on COLDFIRE |
| 435 | help | 440 | help |
| 436 | Define the CPU clock frequency in use. This is the core clock | 441 | Define the CPU clock frequency in use. This is the core clock |
| 437 | frequency, it may or may not be the same as the external clock | 442 | frequency, it may or may not be the same as the external clock |
diff --git a/arch/m68k/configs/m5208evb_defconfig b/arch/m68k/configs/m5208evb_defconfig index e7292f460af4..4c7b7938d53a 100644 --- a/arch/m68k/configs/m5208evb_defconfig +++ b/arch/m68k/configs/m5208evb_defconfig | |||
| @@ -1,10 +1,6 @@ | |||
| 1 | # CONFIG_MMU is not set | ||
| 2 | CONFIG_EXPERIMENTAL=y | ||
| 3 | CONFIG_LOG_BUF_SHIFT=14 | 1 | CONFIG_LOG_BUF_SHIFT=14 |
| 4 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
| 5 | CONFIG_EXPERT=y | 2 | CONFIG_EXPERT=y |
| 6 | # CONFIG_KALLSYMS is not set | 3 | # CONFIG_KALLSYMS is not set |
| 7 | # CONFIG_HOTPLUG is not set | ||
| 8 | # CONFIG_FUTEX is not set | 4 | # CONFIG_FUTEX is not set |
| 9 | # CONFIG_EPOLL is not set | 5 | # CONFIG_EPOLL is not set |
| 10 | # CONFIG_SIGNALFD is not set | 6 | # CONFIG_SIGNALFD is not set |
| @@ -16,17 +12,12 @@ CONFIG_EXPERT=y | |||
| 16 | # CONFIG_BLK_DEV_BSG is not set | 12 | # CONFIG_BLK_DEV_BSG is not set |
| 17 | # CONFIG_IOSCHED_DEADLINE is not set | 13 | # CONFIG_IOSCHED_DEADLINE is not set |
| 18 | # CONFIG_IOSCHED_CFQ is not set | 14 | # CONFIG_IOSCHED_CFQ is not set |
| 19 | CONFIG_M520x=y | 15 | # CONFIG_MMU is not set |
| 20 | CONFIG_CLOCK_SET=y | ||
| 21 | CONFIG_CLOCK_FREQ=166666666 | ||
| 22 | CONFIG_CLOCK_DIV=2 | ||
| 23 | CONFIG_M5208EVB=y | ||
| 24 | # CONFIG_4KSTACKS is not set | 16 | # CONFIG_4KSTACKS is not set |
| 25 | CONFIG_RAMBASE=0x40000000 | 17 | CONFIG_RAMBASE=0x40000000 |
| 26 | CONFIG_RAMSIZE=0x2000000 | 18 | CONFIG_RAMSIZE=0x2000000 |
| 27 | CONFIG_VECTORBASE=0x40000000 | 19 | CONFIG_VECTORBASE=0x40000000 |
| 28 | CONFIG_KERNELBASE=0x40020000 | 20 | CONFIG_KERNELBASE=0x40020000 |
| 29 | CONFIG_RAM16BIT=y | ||
| 30 | CONFIG_BINFMT_FLAT=y | 21 | CONFIG_BINFMT_FLAT=y |
| 31 | CONFIG_NET=y | 22 | CONFIG_NET=y |
| 32 | CONFIG_PACKET=y | 23 | CONFIG_PACKET=y |
| @@ -40,24 +31,19 @@ CONFIG_INET=y | |||
| 40 | # CONFIG_IPV6 is not set | 31 | # CONFIG_IPV6 is not set |
| 41 | # CONFIG_FW_LOADER is not set | 32 | # CONFIG_FW_LOADER is not set |
| 42 | CONFIG_MTD=y | 33 | CONFIG_MTD=y |
| 43 | CONFIG_MTD_CHAR=y | ||
| 44 | CONFIG_MTD_BLOCK=y | 34 | CONFIG_MTD_BLOCK=y |
| 45 | CONFIG_MTD_RAM=y | 35 | CONFIG_MTD_RAM=y |
| 46 | CONFIG_MTD_UCLINUX=y | 36 | CONFIG_MTD_UCLINUX=y |
| 47 | CONFIG_BLK_DEV_RAM=y | 37 | CONFIG_BLK_DEV_RAM=y |
| 48 | # CONFIG_MISC_DEVICES is not set | ||
| 49 | CONFIG_NETDEVICES=y | 38 | CONFIG_NETDEVICES=y |
| 50 | CONFIG_NET_ETHERNET=y | ||
| 51 | CONFIG_FEC=y | 39 | CONFIG_FEC=y |
| 52 | # CONFIG_NETDEV_1000 is not set | ||
| 53 | # CONFIG_NETDEV_10000 is not set | ||
| 54 | # CONFIG_INPUT is not set | 40 | # CONFIG_INPUT is not set |
| 55 | # CONFIG_SERIO is not set | 41 | # CONFIG_SERIO is not set |
| 56 | # CONFIG_VT is not set | 42 | # CONFIG_VT is not set |
| 43 | # CONFIG_UNIX98_PTYS is not set | ||
| 57 | CONFIG_SERIAL_MCF=y | 44 | CONFIG_SERIAL_MCF=y |
| 58 | CONFIG_SERIAL_MCF_BAUDRATE=115200 | 45 | CONFIG_SERIAL_MCF_BAUDRATE=115200 |
| 59 | CONFIG_SERIAL_MCF_CONSOLE=y | 46 | CONFIG_SERIAL_MCF_CONSOLE=y |
| 60 | # CONFIG_UNIX98_PTYS is not set | ||
| 61 | # CONFIG_HW_RANDOM is not set | 47 | # CONFIG_HW_RANDOM is not set |
| 62 | # CONFIG_HWMON is not set | 48 | # CONFIG_HWMON is not set |
| 63 | # CONFIG_USB_SUPPORT is not set | 49 | # CONFIG_USB_SUPPORT is not set |
| @@ -68,8 +54,6 @@ CONFIG_EXT2_FS=y | |||
| 68 | CONFIG_ROMFS_FS=y | 54 | CONFIG_ROMFS_FS=y |
| 69 | CONFIG_ROMFS_BACKED_BY_MTD=y | 55 | CONFIG_ROMFS_BACKED_BY_MTD=y |
| 70 | # CONFIG_NETWORK_FILESYSTEMS is not set | 56 | # CONFIG_NETWORK_FILESYSTEMS is not set |
| 71 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | ||
| 72 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
| 73 | CONFIG_FULLDEBUG=y | ||
| 74 | CONFIG_BOOTPARAM=y | 57 | CONFIG_BOOTPARAM=y |
| 75 | CONFIG_BOOTPARAM_STRING="root=/dev/mtdblock0" | 58 | CONFIG_BOOTPARAM_STRING="root=/dev/mtdblock0" |
| 59 | CONFIG_FULLDEBUG=y | ||
diff --git a/arch/m68k/configs/m5249evb_defconfig b/arch/m68k/configs/m5249evb_defconfig index 0cd4b39f325b..a782f368650f 100644 --- a/arch/m68k/configs/m5249evb_defconfig +++ b/arch/m68k/configs/m5249evb_defconfig | |||
| @@ -1,10 +1,6 @@ | |||
| 1 | # CONFIG_MMU is not set | ||
| 2 | CONFIG_EXPERIMENTAL=y | ||
| 3 | CONFIG_LOG_BUF_SHIFT=14 | 1 | CONFIG_LOG_BUF_SHIFT=14 |
| 4 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
| 5 | CONFIG_EXPERT=y | 2 | CONFIG_EXPERT=y |
| 6 | # CONFIG_KALLSYMS is not set | 3 | # CONFIG_KALLSYMS is not set |
| 7 | # CONFIG_HOTPLUG is not set | ||
| 8 | # CONFIG_FUTEX is not set | 4 | # CONFIG_FUTEX is not set |
| 9 | # CONFIG_EPOLL is not set | 5 | # CONFIG_EPOLL is not set |
| 10 | # CONFIG_SIGNALFD is not set | 6 | # CONFIG_SIGNALFD is not set |
| @@ -16,10 +12,8 @@ CONFIG_EXPERT=y | |||
| 16 | # CONFIG_BLK_DEV_BSG is not set | 12 | # CONFIG_BLK_DEV_BSG is not set |
| 17 | # CONFIG_IOSCHED_DEADLINE is not set | 13 | # CONFIG_IOSCHED_DEADLINE is not set |
| 18 | # CONFIG_IOSCHED_CFQ is not set | 14 | # CONFIG_IOSCHED_CFQ is not set |
| 15 | # CONFIG_MMU is not set | ||
| 19 | CONFIG_M5249=y | 16 | CONFIG_M5249=y |
| 20 | CONFIG_CLOCK_SET=y | ||
| 21 | CONFIG_CLOCK_FREQ=140000000 | ||
| 22 | CONFIG_CLOCK_DIV=2 | ||
| 23 | CONFIG_M5249C3=y | 17 | CONFIG_M5249C3=y |
| 24 | CONFIG_RAMBASE=0x00000000 | 18 | CONFIG_RAMBASE=0x00000000 |
| 25 | CONFIG_RAMSIZE=0x00800000 | 19 | CONFIG_RAMSIZE=0x00800000 |
| @@ -38,23 +32,18 @@ CONFIG_INET=y | |||
| 38 | # CONFIG_IPV6 is not set | 32 | # CONFIG_IPV6 is not set |
| 39 | # CONFIG_FW_LOADER is not set | 33 | # CONFIG_FW_LOADER is not set |
| 40 | CONFIG_MTD=y | 34 | CONFIG_MTD=y |
| 41 | CONFIG_MTD_CHAR=y | ||
| 42 | CONFIG_MTD_BLOCK=y | 35 | CONFIG_MTD_BLOCK=y |
| 43 | CONFIG_MTD_RAM=y | 36 | CONFIG_MTD_RAM=y |
| 44 | CONFIG_MTD_UCLINUX=y | 37 | CONFIG_MTD_UCLINUX=y |
| 45 | CONFIG_BLK_DEV_RAM=y | 38 | CONFIG_BLK_DEV_RAM=y |
| 46 | # CONFIG_MISC_DEVICES is not set | ||
| 47 | CONFIG_NETDEVICES=y | 39 | CONFIG_NETDEVICES=y |
| 48 | CONFIG_NET_ETHERNET=y | ||
| 49 | # CONFIG_NETDEV_1000 is not set | ||
| 50 | # CONFIG_NETDEV_10000 is not set | ||
| 51 | CONFIG_PPP=y | 40 | CONFIG_PPP=y |
| 52 | # CONFIG_INPUT is not set | 41 | # CONFIG_INPUT is not set |
| 53 | # CONFIG_SERIO is not set | 42 | # CONFIG_SERIO is not set |
| 54 | # CONFIG_VT is not set | 43 | # CONFIG_VT is not set |
| 44 | # CONFIG_UNIX98_PTYS is not set | ||
| 55 | CONFIG_SERIAL_MCF=y | 45 | CONFIG_SERIAL_MCF=y |
| 56 | CONFIG_SERIAL_MCF_CONSOLE=y | 46 | CONFIG_SERIAL_MCF_CONSOLE=y |
| 57 | # CONFIG_UNIX98_PTYS is not set | ||
| 58 | # CONFIG_HWMON is not set | 47 | # CONFIG_HWMON is not set |
| 59 | # CONFIG_USB_SUPPORT is not set | 48 | # CONFIG_USB_SUPPORT is not set |
| 60 | CONFIG_EXT2_FS=y | 49 | CONFIG_EXT2_FS=y |
| @@ -62,7 +51,5 @@ CONFIG_EXT2_FS=y | |||
| 62 | CONFIG_ROMFS_FS=y | 51 | CONFIG_ROMFS_FS=y |
| 63 | CONFIG_ROMFS_BACKED_BY_MTD=y | 52 | CONFIG_ROMFS_BACKED_BY_MTD=y |
| 64 | # CONFIG_NETWORK_FILESYSTEMS is not set | 53 | # CONFIG_NETWORK_FILESYSTEMS is not set |
| 65 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | ||
| 66 | CONFIG_BOOTPARAM=y | 54 | CONFIG_BOOTPARAM=y |
| 67 | CONFIG_BOOTPARAM_STRING="root=/dev/mtdblock0" | 55 | CONFIG_BOOTPARAM_STRING="root=/dev/mtdblock0" |
| 68 | # CONFIG_CRC32 is not set | ||
diff --git a/arch/m68k/configs/m5272c3_defconfig b/arch/m68k/configs/m5272c3_defconfig index a60cb3509135..6f5fb92f5cbf 100644 --- a/arch/m68k/configs/m5272c3_defconfig +++ b/arch/m68k/configs/m5272c3_defconfig | |||
| @@ -1,10 +1,6 @@ | |||
| 1 | # CONFIG_MMU is not set | ||
| 2 | CONFIG_EXPERIMENTAL=y | ||
| 3 | CONFIG_LOG_BUF_SHIFT=14 | 1 | CONFIG_LOG_BUF_SHIFT=14 |
| 4 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
| 5 | CONFIG_EXPERT=y | 2 | CONFIG_EXPERT=y |
| 6 | # CONFIG_KALLSYMS is not set | 3 | # CONFIG_KALLSYMS is not set |
| 7 | # CONFIG_HOTPLUG is not set | ||
| 8 | # CONFIG_FUTEX is not set | 4 | # CONFIG_FUTEX is not set |
| 9 | # CONFIG_EPOLL is not set | 5 | # CONFIG_EPOLL is not set |
| 10 | # CONFIG_SIGNALFD is not set | 6 | # CONFIG_SIGNALFD is not set |
| @@ -16,8 +12,8 @@ CONFIG_EXPERT=y | |||
| 16 | # CONFIG_BLK_DEV_BSG is not set | 12 | # CONFIG_BLK_DEV_BSG is not set |
| 17 | # CONFIG_IOSCHED_DEADLINE is not set | 13 | # CONFIG_IOSCHED_DEADLINE is not set |
| 18 | # CONFIG_IOSCHED_CFQ is not set | 14 | # CONFIG_IOSCHED_CFQ is not set |
| 15 | # CONFIG_MMU is not set | ||
| 19 | CONFIG_M5272=y | 16 | CONFIG_M5272=y |
| 20 | CONFIG_CLOCK_SET=y | ||
| 21 | CONFIG_M5272C3=y | 17 | CONFIG_M5272C3=y |
| 22 | CONFIG_RAMBASE=0x00000000 | 18 | CONFIG_RAMBASE=0x00000000 |
| 23 | CONFIG_RAMSIZE=0x00800000 | 19 | CONFIG_RAMSIZE=0x00800000 |
| @@ -36,23 +32,18 @@ CONFIG_INET=y | |||
| 36 | # CONFIG_IPV6 is not set | 32 | # CONFIG_IPV6 is not set |
| 37 | # CONFIG_FW_LOADER is not set | 33 | # CONFIG_FW_LOADER is not set |
| 38 | CONFIG_MTD=y | 34 | CONFIG_MTD=y |
| 39 | CONFIG_MTD_CHAR=y | ||
| 40 | CONFIG_MTD_BLOCK=y | 35 | CONFIG_MTD_BLOCK=y |
| 41 | CONFIG_MTD_RAM=y | 36 | CONFIG_MTD_RAM=y |
| 42 | CONFIG_MTD_UCLINUX=y | 37 | CONFIG_MTD_UCLINUX=y |
| 43 | CONFIG_BLK_DEV_RAM=y | 38 | CONFIG_BLK_DEV_RAM=y |
| 44 | # CONFIG_MISC_DEVICES is not set | ||
| 45 | CONFIG_NETDEVICES=y | 39 | CONFIG_NETDEVICES=y |
| 46 | CONFIG_NET_ETHERNET=y | ||
| 47 | CONFIG_FEC=y | 40 | CONFIG_FEC=y |
| 48 | # CONFIG_NETDEV_1000 is not set | ||
| 49 | # CONFIG_NETDEV_10000 is not set | ||
| 50 | # CONFIG_INPUT is not set | 41 | # CONFIG_INPUT is not set |
| 51 | # CONFIG_SERIO is not set | 42 | # CONFIG_SERIO is not set |
| 52 | # CONFIG_VT is not set | 43 | # CONFIG_VT is not set |
| 44 | # CONFIG_UNIX98_PTYS is not set | ||
| 53 | CONFIG_SERIAL_MCF=y | 45 | CONFIG_SERIAL_MCF=y |
| 54 | CONFIG_SERIAL_MCF_CONSOLE=y | 46 | CONFIG_SERIAL_MCF_CONSOLE=y |
| 55 | # CONFIG_UNIX98_PTYS is not set | ||
| 56 | # CONFIG_HWMON is not set | 47 | # CONFIG_HWMON is not set |
| 57 | # CONFIG_USB_SUPPORT is not set | 48 | # CONFIG_USB_SUPPORT is not set |
| 58 | CONFIG_EXT2_FS=y | 49 | CONFIG_EXT2_FS=y |
| @@ -61,6 +52,5 @@ CONFIG_EXT2_FS=y | |||
| 61 | CONFIG_ROMFS_FS=y | 52 | CONFIG_ROMFS_FS=y |
| 62 | CONFIG_ROMFS_BACKED_BY_MTD=y | 53 | CONFIG_ROMFS_BACKED_BY_MTD=y |
| 63 | # CONFIG_NETWORK_FILESYSTEMS is not set | 54 | # CONFIG_NETWORK_FILESYSTEMS is not set |
| 64 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | ||
| 65 | CONFIG_BOOTPARAM=y | 55 | CONFIG_BOOTPARAM=y |
| 66 | CONFIG_BOOTPARAM_STRING="root=/dev/mtdblock0" | 56 | CONFIG_BOOTPARAM_STRING="root=/dev/mtdblock0" |
diff --git a/arch/m68k/configs/m5275evb_defconfig b/arch/m68k/configs/m5275evb_defconfig index e6502ab7cb2f..b5d7cd1ce856 100644 --- a/arch/m68k/configs/m5275evb_defconfig +++ b/arch/m68k/configs/m5275evb_defconfig | |||
| @@ -1,10 +1,6 @@ | |||
| 1 | # CONFIG_MMU is not set | ||
| 2 | CONFIG_EXPERIMENTAL=y | ||
| 3 | CONFIG_LOG_BUF_SHIFT=14 | 1 | CONFIG_LOG_BUF_SHIFT=14 |
| 4 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
| 5 | CONFIG_EXPERT=y | 2 | CONFIG_EXPERT=y |
| 6 | # CONFIG_KALLSYMS is not set | 3 | # CONFIG_KALLSYMS is not set |
| 7 | # CONFIG_HOTPLUG is not set | ||
| 8 | # CONFIG_FUTEX is not set | 4 | # CONFIG_FUTEX is not set |
| 9 | # CONFIG_EPOLL is not set | 5 | # CONFIG_EPOLL is not set |
| 10 | # CONFIG_SIGNALFD is not set | 6 | # CONFIG_SIGNALFD is not set |
| @@ -16,11 +12,8 @@ CONFIG_EXPERT=y | |||
| 16 | # CONFIG_BLK_DEV_BSG is not set | 12 | # CONFIG_BLK_DEV_BSG is not set |
| 17 | # CONFIG_IOSCHED_DEADLINE is not set | 13 | # CONFIG_IOSCHED_DEADLINE is not set |
| 18 | # CONFIG_IOSCHED_CFQ is not set | 14 | # CONFIG_IOSCHED_CFQ is not set |
| 15 | # CONFIG_MMU is not set | ||
| 19 | CONFIG_M5275=y | 16 | CONFIG_M5275=y |
| 20 | CONFIG_CLOCK_SET=y | ||
| 21 | CONFIG_CLOCK_FREQ=150000000 | ||
| 22 | CONFIG_CLOCK_DIV=2 | ||
| 23 | CONFIG_M5275EVB=y | ||
| 24 | # CONFIG_4KSTACKS is not set | 17 | # CONFIG_4KSTACKS is not set |
| 25 | CONFIG_RAMBASE=0x00000000 | 18 | CONFIG_RAMBASE=0x00000000 |
| 26 | CONFIG_RAMSIZE=0x00000000 | 19 | CONFIG_RAMSIZE=0x00000000 |
| @@ -39,24 +32,19 @@ CONFIG_INET=y | |||
| 39 | # CONFIG_IPV6 is not set | 32 | # CONFIG_IPV6 is not set |
| 40 | # CONFIG_FW_LOADER is not set | 33 | # CONFIG_FW_LOADER is not set |
| 41 | CONFIG_MTD=y | 34 | CONFIG_MTD=y |
| 42 | CONFIG_MTD_CHAR=y | ||
| 43 | CONFIG_MTD_BLOCK=y | 35 | CONFIG_MTD_BLOCK=y |
| 44 | CONFIG_MTD_RAM=y | 36 | CONFIG_MTD_RAM=y |
| 45 | CONFIG_MTD_UCLINUX=y | 37 | CONFIG_MTD_UCLINUX=y |
| 46 | CONFIG_BLK_DEV_RAM=y | 38 | CONFIG_BLK_DEV_RAM=y |
| 47 | # CONFIG_MISC_DEVICES is not set | ||
| 48 | CONFIG_NETDEVICES=y | 39 | CONFIG_NETDEVICES=y |
| 49 | CONFIG_NET_ETHERNET=y | ||
| 50 | CONFIG_FEC=y | 40 | CONFIG_FEC=y |
| 51 | # CONFIG_NETDEV_1000 is not set | ||
| 52 | # CONFIG_NETDEV_10000 is not set | ||
| 53 | CONFIG_PPP=y | 41 | CONFIG_PPP=y |
| 54 | # CONFIG_INPUT is not set | 42 | # CONFIG_INPUT is not set |
| 55 | # CONFIG_SERIO is not set | 43 | # CONFIG_SERIO is not set |
| 56 | # CONFIG_VT is not set | 44 | # CONFIG_VT is not set |
| 45 | # CONFIG_UNIX98_PTYS is not set | ||
| 57 | CONFIG_SERIAL_MCF=y | 46 | CONFIG_SERIAL_MCF=y |
| 58 | CONFIG_SERIAL_MCF_CONSOLE=y | 47 | CONFIG_SERIAL_MCF_CONSOLE=y |
| 59 | # CONFIG_UNIX98_PTYS is not set | ||
| 60 | # CONFIG_HWMON is not set | 48 | # CONFIG_HWMON is not set |
| 61 | # CONFIG_USB_SUPPORT is not set | 49 | # CONFIG_USB_SUPPORT is not set |
| 62 | CONFIG_EXT2_FS=y | 50 | CONFIG_EXT2_FS=y |
| @@ -65,8 +53,5 @@ CONFIG_EXT2_FS=y | |||
| 65 | CONFIG_ROMFS_FS=y | 53 | CONFIG_ROMFS_FS=y |
| 66 | CONFIG_ROMFS_BACKED_BY_MTD=y | 54 | CONFIG_ROMFS_BACKED_BY_MTD=y |
| 67 | # CONFIG_NETWORK_FILESYSTEMS is not set | 55 | # CONFIG_NETWORK_FILESYSTEMS is not set |
| 68 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | ||
| 69 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
| 70 | CONFIG_BOOTPARAM=y | 56 | CONFIG_BOOTPARAM=y |
| 71 | CONFIG_BOOTPARAM_STRING="root=/dev/mtdblock0" | 57 | CONFIG_BOOTPARAM_STRING="root=/dev/mtdblock0" |
| 72 | # CONFIG_CRC32 is not set | ||
diff --git a/arch/m68k/configs/m5307c3_defconfig b/arch/m68k/configs/m5307c3_defconfig index 023812abd2e6..1b4c09461c40 100644 --- a/arch/m68k/configs/m5307c3_defconfig +++ b/arch/m68k/configs/m5307c3_defconfig | |||
| @@ -1,10 +1,6 @@ | |||
| 1 | # CONFIG_MMU is not set | ||
| 2 | CONFIG_EXPERIMENTAL=y | ||
| 3 | CONFIG_LOG_BUF_SHIFT=14 | 1 | CONFIG_LOG_BUF_SHIFT=14 |
| 4 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
| 5 | CONFIG_EXPERT=y | 2 | CONFIG_EXPERT=y |
| 6 | # CONFIG_KALLSYMS is not set | 3 | # CONFIG_KALLSYMS is not set |
| 7 | # CONFIG_HOTPLUG is not set | ||
| 8 | # CONFIG_FUTEX is not set | 4 | # CONFIG_FUTEX is not set |
| 9 | # CONFIG_EPOLL is not set | 5 | # CONFIG_EPOLL is not set |
| 10 | # CONFIG_SIGNALFD is not set | 6 | # CONFIG_SIGNALFD is not set |
| @@ -16,10 +12,8 @@ CONFIG_EXPERT=y | |||
| 16 | # CONFIG_BLK_DEV_BSG is not set | 12 | # CONFIG_BLK_DEV_BSG is not set |
| 17 | # CONFIG_IOSCHED_DEADLINE is not set | 13 | # CONFIG_IOSCHED_DEADLINE is not set |
| 18 | # CONFIG_IOSCHED_CFQ is not set | 14 | # CONFIG_IOSCHED_CFQ is not set |
| 15 | # CONFIG_MMU is not set | ||
| 19 | CONFIG_M5307=y | 16 | CONFIG_M5307=y |
| 20 | CONFIG_CLOCK_SET=y | ||
| 21 | CONFIG_CLOCK_FREQ=90000000 | ||
| 22 | CONFIG_CLOCK_DIV=2 | ||
| 23 | CONFIG_M5307C3=y | 17 | CONFIG_M5307C3=y |
| 24 | CONFIG_RAMBASE=0x00000000 | 18 | CONFIG_RAMBASE=0x00000000 |
| 25 | CONFIG_RAMSIZE=0x00800000 | 19 | CONFIG_RAMSIZE=0x00800000 |
| @@ -38,16 +32,11 @@ CONFIG_INET=y | |||
| 38 | # CONFIG_IPV6 is not set | 32 | # CONFIG_IPV6 is not set |
| 39 | # CONFIG_FW_LOADER is not set | 33 | # CONFIG_FW_LOADER is not set |
| 40 | CONFIG_MTD=y | 34 | CONFIG_MTD=y |
| 41 | CONFIG_MTD_CHAR=y | ||
| 42 | CONFIG_MTD_BLOCK=y | 35 | CONFIG_MTD_BLOCK=y |
| 43 | CONFIG_MTD_RAM=y | 36 | CONFIG_MTD_RAM=y |
| 44 | CONFIG_MTD_UCLINUX=y | 37 | CONFIG_MTD_UCLINUX=y |
| 45 | CONFIG_BLK_DEV_RAM=y | 38 | CONFIG_BLK_DEV_RAM=y |
| 46 | # CONFIG_MISC_DEVICES is not set | ||
| 47 | CONFIG_NETDEVICES=y | 39 | CONFIG_NETDEVICES=y |
| 48 | CONFIG_NET_ETHERNET=y | ||
| 49 | # CONFIG_NETDEV_1000 is not set | ||
| 50 | # CONFIG_NETDEV_10000 is not set | ||
| 51 | CONFIG_PPP=y | 40 | CONFIG_PPP=y |
| 52 | CONFIG_SLIP=y | 41 | CONFIG_SLIP=y |
| 53 | CONFIG_SLIP_COMPRESSED=y | 42 | CONFIG_SLIP_COMPRESSED=y |
| @@ -56,21 +45,17 @@ CONFIG_SLIP_COMPRESSED=y | |||
| 56 | # CONFIG_INPUT_MOUSE is not set | 45 | # CONFIG_INPUT_MOUSE is not set |
| 57 | # CONFIG_SERIO is not set | 46 | # CONFIG_SERIO is not set |
| 58 | # CONFIG_VT is not set | 47 | # CONFIG_VT is not set |
| 48 | # CONFIG_LEGACY_PTYS is not set | ||
| 59 | CONFIG_SERIAL_MCF=y | 49 | CONFIG_SERIAL_MCF=y |
| 60 | CONFIG_SERIAL_MCF_CONSOLE=y | 50 | CONFIG_SERIAL_MCF_CONSOLE=y |
| 61 | # CONFIG_LEGACY_PTYS is not set | ||
| 62 | # CONFIG_HW_RANDOM is not set | 51 | # CONFIG_HW_RANDOM is not set |
| 63 | # CONFIG_HWMON is not set | 52 | # CONFIG_HWMON is not set |
| 64 | # CONFIG_HID_SUPPORT is not set | ||
| 65 | # CONFIG_USB_SUPPORT is not set | 53 | # CONFIG_USB_SUPPORT is not set |
| 66 | CONFIG_EXT2_FS=y | 54 | CONFIG_EXT2_FS=y |
| 67 | # CONFIG_DNOTIFY is not set | 55 | # CONFIG_DNOTIFY is not set |
| 68 | CONFIG_ROMFS_FS=y | 56 | CONFIG_ROMFS_FS=y |
| 69 | CONFIG_ROMFS_BACKED_BY_MTD=y | 57 | CONFIG_ROMFS_BACKED_BY_MTD=y |
| 70 | # CONFIG_NETWORK_FILESYSTEMS is not set | 58 | # CONFIG_NETWORK_FILESYSTEMS is not set |
| 71 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | ||
| 72 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
| 73 | CONFIG_FULLDEBUG=y | ||
| 74 | CONFIG_BOOTPARAM=y | 59 | CONFIG_BOOTPARAM=y |
| 75 | CONFIG_BOOTPARAM_STRING="root=/dev/mtdblock0" | 60 | CONFIG_BOOTPARAM_STRING="root=/dev/mtdblock0" |
| 76 | # CONFIG_CRC32 is not set | 61 | CONFIG_FULLDEBUG=y |
diff --git a/arch/m68k/configs/m5407c3_defconfig b/arch/m68k/configs/m5407c3_defconfig index 557b39f3be90..275ad543d4bc 100644 --- a/arch/m68k/configs/m5407c3_defconfig +++ b/arch/m68k/configs/m5407c3_defconfig | |||
| @@ -1,10 +1,6 @@ | |||
| 1 | # CONFIG_MMU is not set | ||
| 2 | CONFIG_EXPERIMENTAL=y | ||
| 3 | CONFIG_LOG_BUF_SHIFT=14 | 1 | CONFIG_LOG_BUF_SHIFT=14 |
| 4 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
| 5 | CONFIG_EXPERT=y | 2 | CONFIG_EXPERT=y |
| 6 | # CONFIG_KALLSYMS is not set | 3 | # CONFIG_KALLSYMS is not set |
| 7 | # CONFIG_HOTPLUG is not set | ||
| 8 | # CONFIG_FUTEX is not set | 4 | # CONFIG_FUTEX is not set |
| 9 | # CONFIG_EPOLL is not set | 5 | # CONFIG_EPOLL is not set |
| 10 | # CONFIG_SIGNALFD is not set | 6 | # CONFIG_SIGNALFD is not set |
| @@ -17,9 +13,8 @@ CONFIG_MODULE_UNLOAD=y | |||
| 17 | # CONFIG_BLK_DEV_BSG is not set | 13 | # CONFIG_BLK_DEV_BSG is not set |
| 18 | # CONFIG_IOSCHED_DEADLINE is not set | 14 | # CONFIG_IOSCHED_DEADLINE is not set |
| 19 | # CONFIG_IOSCHED_CFQ is not set | 15 | # CONFIG_IOSCHED_CFQ is not set |
| 16 | # CONFIG_MMU is not set | ||
| 20 | CONFIG_M5407=y | 17 | CONFIG_M5407=y |
| 21 | CONFIG_CLOCK_SET=y | ||
| 22 | CONFIG_CLOCK_FREQ=50000000 | ||
| 23 | CONFIG_M5407C3=y | 18 | CONFIG_M5407C3=y |
| 24 | CONFIG_RAMBASE=0x00000000 | 19 | CONFIG_RAMBASE=0x00000000 |
| 25 | CONFIG_RAMSIZE=0x00000000 | 20 | CONFIG_RAMSIZE=0x00000000 |
| @@ -38,22 +33,17 @@ CONFIG_INET=y | |||
| 38 | # CONFIG_IPV6 is not set | 33 | # CONFIG_IPV6 is not set |
| 39 | # CONFIG_FW_LOADER is not set | 34 | # CONFIG_FW_LOADER is not set |
| 40 | CONFIG_MTD=y | 35 | CONFIG_MTD=y |
| 41 | CONFIG_MTD_CHAR=y | ||
| 42 | CONFIG_MTD_BLOCK=y | 36 | CONFIG_MTD_BLOCK=y |
| 43 | CONFIG_MTD_RAM=y | 37 | CONFIG_MTD_RAM=y |
| 44 | CONFIG_MTD_UCLINUX=y | 38 | CONFIG_MTD_UCLINUX=y |
| 45 | CONFIG_BLK_DEV_RAM=y | 39 | CONFIG_BLK_DEV_RAM=y |
| 46 | # CONFIG_MISC_DEVICES is not set | ||
| 47 | CONFIG_NETDEVICES=y | 40 | CONFIG_NETDEVICES=y |
| 48 | CONFIG_NET_ETHERNET=y | ||
| 49 | # CONFIG_NETDEV_1000 is not set | ||
| 50 | # CONFIG_NETDEV_10000 is not set | ||
| 51 | CONFIG_PPP=y | 41 | CONFIG_PPP=y |
| 52 | # CONFIG_INPUT is not set | 42 | # CONFIG_INPUT is not set |
| 53 | # CONFIG_VT is not set | 43 | # CONFIG_VT is not set |
| 44 | # CONFIG_UNIX98_PTYS is not set | ||
| 54 | CONFIG_SERIAL_MCF=y | 45 | CONFIG_SERIAL_MCF=y |
| 55 | CONFIG_SERIAL_MCF_CONSOLE=y | 46 | CONFIG_SERIAL_MCF_CONSOLE=y |
| 56 | # CONFIG_UNIX98_PTYS is not set | ||
| 57 | # CONFIG_HW_RANDOM is not set | 47 | # CONFIG_HW_RANDOM is not set |
| 58 | # CONFIG_HWMON is not set | 48 | # CONFIG_HWMON is not set |
| 59 | # CONFIG_USB_SUPPORT is not set | 49 | # CONFIG_USB_SUPPORT is not set |
| @@ -63,8 +53,5 @@ CONFIG_EXT2_FS=y | |||
| 63 | CONFIG_ROMFS_FS=y | 53 | CONFIG_ROMFS_FS=y |
| 64 | CONFIG_ROMFS_BACKED_BY_MTD=y | 54 | CONFIG_ROMFS_BACKED_BY_MTD=y |
| 65 | # CONFIG_NETWORK_FILESYSTEMS is not set | 55 | # CONFIG_NETWORK_FILESYSTEMS is not set |
| 66 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | ||
| 67 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
| 68 | CONFIG_BOOTPARAM=y | 56 | CONFIG_BOOTPARAM=y |
| 69 | CONFIG_BOOTPARAM_STRING="root=/dev/mtdblock0" | 57 | CONFIG_BOOTPARAM_STRING="root=/dev/mtdblock0" |
| 70 | # CONFIG_CRC32 is not set | ||
diff --git a/arch/m68k/configs/m5475evb_defconfig b/arch/m68k/configs/m5475evb_defconfig index c5018a68819b..4f4ccd13c11b 100644 --- a/arch/m68k/configs/m5475evb_defconfig +++ b/arch/m68k/configs/m5475evb_defconfig | |||
| @@ -1,11 +1,7 @@ | |||
| 1 | CONFIG_EXPERIMENTAL=y | ||
| 2 | # CONFIG_SWAP is not set | 1 | # CONFIG_SWAP is not set |
| 3 | CONFIG_LOG_BUF_SHIFT=14 | 2 | CONFIG_LOG_BUF_SHIFT=14 |
| 4 | CONFIG_SYSFS_DEPRECATED=y | ||
| 5 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 6 | CONFIG_SYSCTL_SYSCALL=y | 3 | CONFIG_SYSCTL_SYSCALL=y |
| 7 | # CONFIG_KALLSYMS is not set | 4 | # CONFIG_KALLSYMS is not set |
| 8 | # CONFIG_HOTPLUG is not set | ||
| 9 | # CONFIG_FUTEX is not set | 5 | # CONFIG_FUTEX is not set |
| 10 | # CONFIG_EPOLL is not set | 6 | # CONFIG_EPOLL is not set |
| 11 | # CONFIG_SIGNALFD is not set | 7 | # CONFIG_SIGNALFD is not set |
| @@ -20,19 +16,16 @@ CONFIG_MODULES=y | |||
| 20 | # CONFIG_IOSCHED_DEADLINE is not set | 16 | # CONFIG_IOSCHED_DEADLINE is not set |
| 21 | # CONFIG_IOSCHED_CFQ is not set | 17 | # CONFIG_IOSCHED_CFQ is not set |
| 22 | CONFIG_COLDFIRE=y | 18 | CONFIG_COLDFIRE=y |
| 23 | CONFIG_M547x=y | ||
| 24 | CONFIG_CLOCK_SET=y | ||
| 25 | CONFIG_CLOCK_FREQ=266000000 | ||
| 26 | # CONFIG_4KSTACKS is not set | 19 | # CONFIG_4KSTACKS is not set |
| 27 | CONFIG_RAMBASE=0x0 | 20 | CONFIG_RAMBASE=0x0 |
| 28 | CONFIG_RAMSIZE=0x2000000 | 21 | CONFIG_RAMSIZE=0x2000000 |
| 29 | CONFIG_VECTORBASE=0x0 | 22 | CONFIG_VECTORBASE=0x0 |
| 30 | CONFIG_MBAR=0xff000000 | 23 | CONFIG_MBAR=0xff000000 |
| 31 | CONFIG_KERNELBASE=0x20000 | 24 | CONFIG_KERNELBASE=0x20000 |
| 25 | CONFIG_PCI=y | ||
| 32 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set | 26 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set |
| 33 | # CONFIG_FW_LOADER is not set | 27 | # CONFIG_FW_LOADER is not set |
| 34 | CONFIG_MTD=y | 28 | CONFIG_MTD=y |
| 35 | CONFIG_MTD_CHAR=y | ||
| 36 | CONFIG_MTD_BLOCK=y | 29 | CONFIG_MTD_BLOCK=y |
| 37 | CONFIG_MTD_CFI=y | 30 | CONFIG_MTD_CFI=y |
| 38 | CONFIG_MTD_JEDECPROBE=y | 31 | CONFIG_MTD_JEDECPROBE=y |
diff --git a/arch/m68k/include/asm/Kbuild b/arch/m68k/include/asm/Kbuild index 1555bc189c7d..eb85bd9c6180 100644 --- a/arch/m68k/include/asm/Kbuild +++ b/arch/m68k/include/asm/Kbuild | |||
| @@ -18,6 +18,7 @@ generic-y += kvm_para.h | |||
| 18 | generic-y += local.h | 18 | generic-y += local.h |
| 19 | generic-y += local64.h | 19 | generic-y += local64.h |
| 20 | generic-y += mcs_spinlock.h | 20 | generic-y += mcs_spinlock.h |
| 21 | generic-y += mm-arch-hooks.h | ||
| 21 | generic-y += mman.h | 22 | generic-y += mman.h |
| 22 | generic-y += mutex.h | 23 | generic-y += mutex.h |
| 23 | generic-y += percpu.h | 24 | generic-y += percpu.h |
diff --git a/arch/m68k/include/asm/coldfire.h b/arch/m68k/include/asm/coldfire.h index c94557b91448..50aa4dac9ca2 100644 --- a/arch/m68k/include/asm/coldfire.h +++ b/arch/m68k/include/asm/coldfire.h | |||
| @@ -19,7 +19,7 @@ | |||
| 19 | * in any case new boards come along from time to time that have yet | 19 | * in any case new boards come along from time to time that have yet |
| 20 | * another different clocking frequency. | 20 | * another different clocking frequency. |
| 21 | */ | 21 | */ |
| 22 | #ifdef CONFIG_CLOCK_SET | 22 | #ifdef CONFIG_CLOCK_FREQ |
| 23 | #define MCF_CLK CONFIG_CLOCK_FREQ | 23 | #define MCF_CLK CONFIG_CLOCK_FREQ |
| 24 | #else | 24 | #else |
| 25 | #error "Don't know what your ColdFire CPU clock frequency is??" | 25 | #error "Don't know what your ColdFire CPU clock frequency is??" |
diff --git a/arch/m68k/include/asm/io_mm.h b/arch/m68k/include/asm/io_mm.h index 618c85d3c786..f55cad529400 100644 --- a/arch/m68k/include/asm/io_mm.h +++ b/arch/m68k/include/asm/io_mm.h | |||
| @@ -413,7 +413,8 @@ static inline void isa_delay(void) | |||
| 413 | #define writew(val, addr) out_le16((addr), (val)) | 413 | #define writew(val, addr) out_le16((addr), (val)) |
| 414 | #endif /* CONFIG_ATARI_ROM_ISA */ | 414 | #endif /* CONFIG_ATARI_ROM_ISA */ |
| 415 | 415 | ||
| 416 | #if !defined(CONFIG_ISA) && !defined(CONFIG_ATARI_ROM_ISA) | 416 | #if !defined(CONFIG_ISA) && !defined(CONFIG_ATARI_ROM_ISA) && \ |
| 417 | !(defined(CONFIG_PCI) && defined(CONFIG_COLDFIRE)) | ||
| 417 | /* | 418 | /* |
| 418 | * We need to define dummy functions for GENERIC_IOMAP support. | 419 | * We need to define dummy functions for GENERIC_IOMAP support. |
| 419 | */ | 420 | */ |
diff --git a/arch/m68k/include/asm/mm-arch-hooks.h b/arch/m68k/include/asm/mm-arch-hooks.h deleted file mode 100644 index 7e8709bc90ae..000000000000 --- a/arch/m68k/include/asm/mm-arch-hooks.h +++ /dev/null | |||
| @@ -1,15 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Architecture specific mm hooks | ||
| 3 | * | ||
| 4 | * Copyright (C) 2015, IBM Corporation | ||
| 5 | * Author: Laurent Dufour <ldufour@linux.vnet.ibm.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef _ASM_M68K_MM_ARCH_HOOKS_H | ||
| 13 | #define _ASM_M68K_MM_ARCH_HOOKS_H | ||
| 14 | |||
| 15 | #endif /* _ASM_M68K_MM_ARCH_HOOKS_H */ | ||
diff --git a/arch/metag/include/asm/Kbuild b/arch/metag/include/asm/Kbuild index 199320f3c345..df31353fd200 100644 --- a/arch/metag/include/asm/Kbuild +++ b/arch/metag/include/asm/Kbuild | |||
| @@ -25,6 +25,7 @@ generic-y += kvm_para.h | |||
| 25 | generic-y += local.h | 25 | generic-y += local.h |
| 26 | generic-y += local64.h | 26 | generic-y += local64.h |
| 27 | generic-y += mcs_spinlock.h | 27 | generic-y += mcs_spinlock.h |
| 28 | generic-y += mm-arch-hooks.h | ||
| 28 | generic-y += msgbuf.h | 29 | generic-y += msgbuf.h |
| 29 | generic-y += mutex.h | 30 | generic-y += mutex.h |
| 30 | generic-y += param.h | 31 | generic-y += param.h |
diff --git a/arch/metag/include/asm/mm-arch-hooks.h b/arch/metag/include/asm/mm-arch-hooks.h deleted file mode 100644 index b0072b2eb0de..000000000000 --- a/arch/metag/include/asm/mm-arch-hooks.h +++ /dev/null | |||
| @@ -1,15 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Architecture specific mm hooks | ||
| 3 | * | ||
| 4 | * Copyright (C) 2015, IBM Corporation | ||
| 5 | * Author: Laurent Dufour <ldufour@linux.vnet.ibm.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef _ASM_METAG_MM_ARCH_HOOKS_H | ||
| 13 | #define _ASM_METAG_MM_ARCH_HOOKS_H | ||
| 14 | |||
| 15 | #endif /* _ASM_METAG_MM_ARCH_HOOKS_H */ | ||
diff --git a/arch/microblaze/include/asm/Kbuild b/arch/microblaze/include/asm/Kbuild index 9989ddb169ca..2f222f355c4b 100644 --- a/arch/microblaze/include/asm/Kbuild +++ b/arch/microblaze/include/asm/Kbuild | |||
| @@ -6,6 +6,7 @@ generic-y += device.h | |||
| 6 | generic-y += exec.h | 6 | generic-y += exec.h |
| 7 | generic-y += irq_work.h | 7 | generic-y += irq_work.h |
| 8 | generic-y += mcs_spinlock.h | 8 | generic-y += mcs_spinlock.h |
| 9 | generic-y += mm-arch-hooks.h | ||
| 9 | generic-y += preempt.h | 10 | generic-y += preempt.h |
| 10 | generic-y += syscalls.h | 11 | generic-y += syscalls.h |
| 11 | generic-y += trace_clock.h | 12 | generic-y += trace_clock.h |
diff --git a/arch/microblaze/include/asm/mm-arch-hooks.h b/arch/microblaze/include/asm/mm-arch-hooks.h deleted file mode 100644 index 5c4065911bda..000000000000 --- a/arch/microblaze/include/asm/mm-arch-hooks.h +++ /dev/null | |||
| @@ -1,15 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Architecture specific mm hooks | ||
| 3 | * | ||
| 4 | * Copyright (C) 2015, IBM Corporation | ||
| 5 | * Author: Laurent Dufour <ldufour@linux.vnet.ibm.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef _ASM_MICROBLAZE_MM_ARCH_HOOKS_H | ||
| 13 | #define _ASM_MICROBLAZE_MM_ARCH_HOOKS_H | ||
| 14 | |||
| 15 | #endif /* _ASM_MICROBLAZE_MM_ARCH_HOOKS_H */ | ||
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index aab7e46cadd5..cee5f93e5712 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
| @@ -1427,6 +1427,7 @@ config CPU_MIPS64_R6 | |||
| 1427 | select CPU_SUPPORTS_HIGHMEM | 1427 | select CPU_SUPPORTS_HIGHMEM |
| 1428 | select CPU_SUPPORTS_MSA | 1428 | select CPU_SUPPORTS_MSA |
| 1429 | select GENERIC_CSUM | 1429 | select GENERIC_CSUM |
| 1430 | select MIPS_O32_FP64_SUPPORT if MIPS32_O32 | ||
| 1430 | help | 1431 | help |
| 1431 | Choose this option to build a kernel for release 6 or later of the | 1432 | Choose this option to build a kernel for release 6 or later of the |
| 1432 | MIPS64 architecture. New MIPS processors, starting with the Warrior | 1433 | MIPS64 architecture. New MIPS processors, starting with the Warrior |
| @@ -2262,11 +2263,6 @@ config MIPS_CM | |||
| 2262 | config MIPS_CPC | 2263 | config MIPS_CPC |
| 2263 | bool | 2264 | bool |
| 2264 | 2265 | ||
| 2265 | config SB1_PASS_1_WORKAROUNDS | ||
| 2266 | bool | ||
| 2267 | depends on CPU_SB1_PASS_1 | ||
| 2268 | default y | ||
| 2269 | |||
| 2270 | config SB1_PASS_2_WORKAROUNDS | 2266 | config SB1_PASS_2_WORKAROUNDS |
| 2271 | bool | 2267 | bool |
| 2272 | depends on CPU_SB1 && (CPU_SB1_PASS_2_2 || CPU_SB1_PASS_2) | 2268 | depends on CPU_SB1 && (CPU_SB1_PASS_2_2 || CPU_SB1_PASS_2) |
diff --git a/arch/mips/Makefile b/arch/mips/Makefile index ae2dd59050f7..252e347958f3 100644 --- a/arch/mips/Makefile +++ b/arch/mips/Makefile | |||
| @@ -181,13 +181,6 @@ cflags-$(CONFIG_CPU_R4000_WORKAROUNDS) += $(call cc-option,-mfix-r4000,) | |||
| 181 | cflags-$(CONFIG_CPU_R4400_WORKAROUNDS) += $(call cc-option,-mfix-r4400,) | 181 | cflags-$(CONFIG_CPU_R4400_WORKAROUNDS) += $(call cc-option,-mfix-r4400,) |
| 182 | cflags-$(CONFIG_CPU_DADDI_WORKAROUNDS) += $(call cc-option,-mno-daddi,) | 182 | cflags-$(CONFIG_CPU_DADDI_WORKAROUNDS) += $(call cc-option,-mno-daddi,) |
| 183 | 183 | ||
| 184 | ifdef CONFIG_CPU_SB1 | ||
| 185 | ifdef CONFIG_SB1_PASS_1_WORKAROUNDS | ||
| 186 | KBUILD_AFLAGS_MODULE += -msb1-pass1-workarounds | ||
| 187 | KBUILD_CFLAGS_MODULE += -msb1-pass1-workarounds | ||
| 188 | endif | ||
| 189 | endif | ||
| 190 | |||
| 191 | # For smartmips configurations, there are hundreds of warnings due to ISA overrides | 184 | # For smartmips configurations, there are hundreds of warnings due to ISA overrides |
| 192 | # in assembly and header files. smartmips is only supported for MIPS32r1 onwards | 185 | # in assembly and header files. smartmips is only supported for MIPS32r1 onwards |
| 193 | # and there is no support for 64-bit. Various '.set mips2' or '.set mips3' or | 186 | # and there is no support for 64-bit. Various '.set mips2' or '.set mips3' or |
diff --git a/arch/mips/include/asm/Kbuild b/arch/mips/include/asm/Kbuild index 7fe5c61a3cb8..1f8546081d20 100644 --- a/arch/mips/include/asm/Kbuild +++ b/arch/mips/include/asm/Kbuild | |||
| @@ -7,6 +7,7 @@ generic-y += emergency-restart.h | |||
| 7 | generic-y += irq_work.h | 7 | generic-y += irq_work.h |
| 8 | generic-y += local64.h | 8 | generic-y += local64.h |
| 9 | generic-y += mcs_spinlock.h | 9 | generic-y += mcs_spinlock.h |
| 10 | generic-y += mm-arch-hooks.h | ||
| 10 | generic-y += mutex.h | 11 | generic-y += mutex.h |
| 11 | generic-y += parport.h | 12 | generic-y += parport.h |
| 12 | generic-y += percpu.h | 13 | generic-y += percpu.h |
diff --git a/arch/mips/include/asm/fpu.h b/arch/mips/include/asm/fpu.h index 084780b355aa..1b0625189835 100644 --- a/arch/mips/include/asm/fpu.h +++ b/arch/mips/include/asm/fpu.h | |||
| @@ -74,7 +74,7 @@ static inline int __enable_fpu(enum fpu_mode mode) | |||
| 74 | goto fr_common; | 74 | goto fr_common; |
| 75 | 75 | ||
| 76 | case FPU_64BIT: | 76 | case FPU_64BIT: |
| 77 | #if !(defined(CONFIG_CPU_MIPS32_R2) || defined(CONFIG_CPU_MIPS32_R6) \ | 77 | #if !(defined(CONFIG_CPU_MIPSR2) || defined(CONFIG_CPU_MIPSR6) \ |
| 78 | || defined(CONFIG_64BIT)) | 78 | || defined(CONFIG_64BIT)) |
| 79 | /* we only have a 32-bit FPU */ | 79 | /* we only have a 32-bit FPU */ |
| 80 | return SIGFPE; | 80 | return SIGFPE; |
diff --git a/arch/mips/include/asm/mach-sibyte/war.h b/arch/mips/include/asm/mach-sibyte/war.h index 0a227d426b9c..520f8fc2c806 100644 --- a/arch/mips/include/asm/mach-sibyte/war.h +++ b/arch/mips/include/asm/mach-sibyte/war.h | |||
| @@ -13,8 +13,7 @@ | |||
| 13 | #define R4600_V2_HIT_CACHEOP_WAR 0 | 13 | #define R4600_V2_HIT_CACHEOP_WAR 0 |
| 14 | #define R5432_CP0_INTERRUPT_WAR 0 | 14 | #define R5432_CP0_INTERRUPT_WAR 0 |
| 15 | 15 | ||
| 16 | #if defined(CONFIG_SB1_PASS_1_WORKAROUNDS) || \ | 16 | #if defined(CONFIG_SB1_PASS_2_WORKAROUNDS) |
| 17 | defined(CONFIG_SB1_PASS_2_WORKAROUNDS) | ||
| 18 | 17 | ||
| 19 | #ifndef __ASSEMBLY__ | 18 | #ifndef __ASSEMBLY__ |
| 20 | extern int sb1250_m3_workaround_needed(void); | 19 | extern int sb1250_m3_workaround_needed(void); |
diff --git a/arch/mips/include/asm/mm-arch-hooks.h b/arch/mips/include/asm/mm-arch-hooks.h deleted file mode 100644 index b5609fe8e475..000000000000 --- a/arch/mips/include/asm/mm-arch-hooks.h +++ /dev/null | |||
| @@ -1,15 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Architecture specific mm hooks | ||
| 3 | * | ||
| 4 | * Copyright (C) 2015, IBM Corporation | ||
| 5 | * Author: Laurent Dufour <ldufour@linux.vnet.ibm.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef _ASM_MIPS_MM_ARCH_HOOKS_H | ||
| 13 | #define _ASM_MIPS_MM_ARCH_HOOKS_H | ||
| 14 | |||
| 15 | #endif /* _ASM_MIPS_MM_ARCH_HOOKS_H */ | ||
diff --git a/arch/mips/include/uapi/asm/sigcontext.h b/arch/mips/include/uapi/asm/sigcontext.h index 6c9906f59c6e..9081d88ae44f 100644 --- a/arch/mips/include/uapi/asm/sigcontext.h +++ b/arch/mips/include/uapi/asm/sigcontext.h | |||
| @@ -16,7 +16,7 @@ | |||
| 16 | 16 | ||
| 17 | /* | 17 | /* |
| 18 | * Keep this struct definition in sync with the sigcontext fragment | 18 | * Keep this struct definition in sync with the sigcontext fragment |
| 19 | * in arch/mips/tools/offset.c | 19 | * in arch/mips/kernel/asm-offsets.c |
| 20 | */ | 20 | */ |
| 21 | struct sigcontext { | 21 | struct sigcontext { |
| 22 | unsigned int sc_regmask; /* Unused */ | 22 | unsigned int sc_regmask; /* Unused */ |
| @@ -46,7 +46,7 @@ struct sigcontext { | |||
| 46 | #include <linux/posix_types.h> | 46 | #include <linux/posix_types.h> |
| 47 | /* | 47 | /* |
| 48 | * Keep this struct definition in sync with the sigcontext fragment | 48 | * Keep this struct definition in sync with the sigcontext fragment |
| 49 | * in arch/mips/tools/offset.c | 49 | * in arch/mips/kernel/asm-offsets.c |
| 50 | * | 50 | * |
| 51 | * Warning: this structure illdefined with sc_badvaddr being just an unsigned | 51 | * Warning: this structure illdefined with sc_badvaddr being just an unsigned |
| 52 | * int so it was changed to unsigned long in 2.6.0-test1. This may break | 52 | * int so it was changed to unsigned long in 2.6.0-test1. This may break |
diff --git a/arch/mips/kernel/asm-offsets.c b/arch/mips/kernel/asm-offsets.c index beabe19ff8e5..072fab13645d 100644 --- a/arch/mips/kernel/asm-offsets.c +++ b/arch/mips/kernel/asm-offsets.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * offset.c: Calculate pt_regs and task_struct offsets. | 2 | * asm-offsets.c: Calculate pt_regs and task_struct offsets. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 1996 David S. Miller | 4 | * Copyright (C) 1996 David S. Miller |
| 5 | * Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003 Ralf Baechle | 5 | * Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003 Ralf Baechle |
diff --git a/arch/mips/sibyte/Kconfig b/arch/mips/sibyte/Kconfig index a8bb972fd9fd..cb9a095f5c5e 100644 --- a/arch/mips/sibyte/Kconfig +++ b/arch/mips/sibyte/Kconfig | |||
| @@ -81,11 +81,6 @@ choice | |||
| 81 | prompt "SiByte SOC Stepping" | 81 | prompt "SiByte SOC Stepping" |
| 82 | depends on SIBYTE_SB1xxx_SOC | 82 | depends on SIBYTE_SB1xxx_SOC |
| 83 | 83 | ||
| 84 | config CPU_SB1_PASS_1 | ||
| 85 | bool "1250 Pass1" | ||
| 86 | depends on SIBYTE_SB1250 | ||
| 87 | select CPU_HAS_PREFETCH | ||
| 88 | |||
| 89 | config CPU_SB1_PASS_2_1250 | 84 | config CPU_SB1_PASS_2_1250 |
| 90 | bool "1250 An" | 85 | bool "1250 An" |
| 91 | depends on SIBYTE_SB1250 | 86 | depends on SIBYTE_SB1250 |
diff --git a/arch/mips/sibyte/common/bus_watcher.c b/arch/mips/sibyte/common/bus_watcher.c index 5581844c9194..41a1d2242211 100644 --- a/arch/mips/sibyte/common/bus_watcher.c +++ b/arch/mips/sibyte/common/bus_watcher.c | |||
| @@ -81,10 +81,7 @@ void check_bus_watcher(void) | |||
| 81 | { | 81 | { |
| 82 | u32 status, l2_err, memio_err; | 82 | u32 status, l2_err, memio_err; |
| 83 | 83 | ||
| 84 | #ifdef CONFIG_SB1_PASS_1_WORKAROUNDS | 84 | #if defined(CONFIG_SIBYTE_BCM112X) || defined(CONFIG_SIBYTE_SB1250) |
| 85 | /* Destructive read, clears register and interrupt */ | ||
| 86 | status = csr_in32(IOADDR(A_SCD_BUS_ERR_STATUS)); | ||
| 87 | #elif defined(CONFIG_SIBYTE_BCM112X) || defined(CONFIG_SIBYTE_SB1250) | ||
| 88 | /* Use non-destructive register */ | 85 | /* Use non-destructive register */ |
| 89 | status = csr_in32(IOADDR(A_SCD_BUS_ERR_STATUS_DEBUG)); | 86 | status = csr_in32(IOADDR(A_SCD_BUS_ERR_STATUS_DEBUG)); |
| 90 | #elif defined(CONFIG_SIBYTE_BCM1x55) || defined(CONFIG_SIBYTE_BCM1x80) | 87 | #elif defined(CONFIG_SIBYTE_BCM1x55) || defined(CONFIG_SIBYTE_BCM1x80) |
diff --git a/arch/mips/sibyte/sb1250/setup.c b/arch/mips/sibyte/sb1250/setup.c index 3c02b2a77ae9..9d3c24efdf4a 100644 --- a/arch/mips/sibyte/sb1250/setup.c +++ b/arch/mips/sibyte/sb1250/setup.c | |||
| @@ -202,12 +202,10 @@ void __init sb1250_setup(void) | |||
| 202 | 202 | ||
| 203 | switch (war_pass) { | 203 | switch (war_pass) { |
| 204 | case K_SYS_REVISION_BCM1250_PASS1: | 204 | case K_SYS_REVISION_BCM1250_PASS1: |
| 205 | #ifndef CONFIG_SB1_PASS_1_WORKAROUNDS | ||
| 206 | printk("@@@@ This is a BCM1250 A0-A2 (Pass 1) board, " | 205 | printk("@@@@ This is a BCM1250 A0-A2 (Pass 1) board, " |
| 207 | "and the kernel doesn't have the proper " | 206 | "and the kernel doesn't have the proper " |
| 208 | "workarounds compiled in. @@@@\n"); | 207 | "workarounds compiled in. @@@@\n"); |
| 209 | bad_config = 1; | 208 | bad_config = 1; |
| 210 | #endif | ||
| 211 | break; | 209 | break; |
| 212 | case K_SYS_REVISION_BCM1250_PASS2: | 210 | case K_SYS_REVISION_BCM1250_PASS2: |
| 213 | /* Pass 2 - easiest as default for now - so many numbers */ | 211 | /* Pass 2 - easiest as default for now - so many numbers */ |
diff --git a/arch/mn10300/include/asm/Kbuild b/arch/mn10300/include/asm/Kbuild index de30b0c88796..6edb9ee6128e 100644 --- a/arch/mn10300/include/asm/Kbuild +++ b/arch/mn10300/include/asm/Kbuild | |||
| @@ -5,6 +5,7 @@ generic-y += cputime.h | |||
| 5 | generic-y += exec.h | 5 | generic-y += exec.h |
| 6 | generic-y += irq_work.h | 6 | generic-y += irq_work.h |
| 7 | generic-y += mcs_spinlock.h | 7 | generic-y += mcs_spinlock.h |
| 8 | generic-y += mm-arch-hooks.h | ||
| 8 | generic-y += preempt.h | 9 | generic-y += preempt.h |
| 9 | generic-y += sections.h | 10 | generic-y += sections.h |
| 10 | generic-y += trace_clock.h | 11 | generic-y += trace_clock.h |
diff --git a/arch/mn10300/include/asm/mm-arch-hooks.h b/arch/mn10300/include/asm/mm-arch-hooks.h deleted file mode 100644 index e2029a652f4c..000000000000 --- a/arch/mn10300/include/asm/mm-arch-hooks.h +++ /dev/null | |||
| @@ -1,15 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Architecture specific mm hooks | ||
| 3 | * | ||
| 4 | * Copyright (C) 2015, IBM Corporation | ||
| 5 | * Author: Laurent Dufour <ldufour@linux.vnet.ibm.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef _ASM_MN10300_MM_ARCH_HOOKS_H | ||
| 13 | #define _ASM_MN10300_MM_ARCH_HOOKS_H | ||
| 14 | |||
| 15 | #endif /* _ASM_MN10300_MM_ARCH_HOOKS_H */ | ||
diff --git a/arch/nios2/include/asm/Kbuild b/arch/nios2/include/asm/Kbuild index 434639d510b3..914864eb5a25 100644 --- a/arch/nios2/include/asm/Kbuild +++ b/arch/nios2/include/asm/Kbuild | |||
| @@ -30,6 +30,7 @@ generic-y += kmap_types.h | |||
| 30 | generic-y += kvm_para.h | 30 | generic-y += kvm_para.h |
| 31 | generic-y += local.h | 31 | generic-y += local.h |
| 32 | generic-y += mcs_spinlock.h | 32 | generic-y += mcs_spinlock.h |
| 33 | generic-y += mm-arch-hooks.h | ||
| 33 | generic-y += mman.h | 34 | generic-y += mman.h |
| 34 | generic-y += module.h | 35 | generic-y += module.h |
| 35 | generic-y += msgbuf.h | 36 | generic-y += msgbuf.h |
diff --git a/arch/nios2/include/asm/mm-arch-hooks.h b/arch/nios2/include/asm/mm-arch-hooks.h deleted file mode 100644 index d7290dc68558..000000000000 --- a/arch/nios2/include/asm/mm-arch-hooks.h +++ /dev/null | |||
| @@ -1,15 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Architecture specific mm hooks | ||
| 3 | * | ||
| 4 | * Copyright (C) 2015, IBM Corporation | ||
| 5 | * Author: Laurent Dufour <ldufour@linux.vnet.ibm.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef _ASM_NIOS2_MM_ARCH_HOOKS_H | ||
| 13 | #define _ASM_NIOS2_MM_ARCH_HOOKS_H | ||
| 14 | |||
| 15 | #endif /* _ASM_NIOS2_MM_ARCH_HOOKS_H */ | ||
diff --git a/arch/openrisc/Kconfig b/arch/openrisc/Kconfig index e5a693b16da2..443f44de1020 100644 --- a/arch/openrisc/Kconfig +++ b/arch/openrisc/Kconfig | |||
| @@ -17,6 +17,7 @@ config OPENRISC | |||
| 17 | select GENERIC_IRQ_SHOW | 17 | select GENERIC_IRQ_SHOW |
| 18 | select GENERIC_IOMAP | 18 | select GENERIC_IOMAP |
| 19 | select GENERIC_CPU_DEVICES | 19 | select GENERIC_CPU_DEVICES |
| 20 | select HAVE_UID16 | ||
| 20 | select GENERIC_ATOMIC64 | 21 | select GENERIC_ATOMIC64 |
| 21 | select GENERIC_CLOCKEVENTS | 22 | select GENERIC_CLOCKEVENTS |
| 22 | select GENERIC_STRNCPY_FROM_USER | 23 | select GENERIC_STRNCPY_FROM_USER |
| @@ -31,9 +32,6 @@ config MMU | |||
| 31 | config HAVE_DMA_ATTRS | 32 | config HAVE_DMA_ATTRS |
| 32 | def_bool y | 33 | def_bool y |
| 33 | 34 | ||
| 34 | config UID16 | ||
| 35 | def_bool y | ||
| 36 | |||
| 37 | config RWSEM_GENERIC_SPINLOCK | 35 | config RWSEM_GENERIC_SPINLOCK |
| 38 | def_bool y | 36 | def_bool y |
| 39 | 37 | ||
diff --git a/arch/openrisc/include/asm/Kbuild b/arch/openrisc/include/asm/Kbuild index 2a2e39b8109a..2832f031fb11 100644 --- a/arch/openrisc/include/asm/Kbuild +++ b/arch/openrisc/include/asm/Kbuild | |||
| @@ -36,6 +36,7 @@ generic-y += kmap_types.h | |||
| 36 | generic-y += kvm_para.h | 36 | generic-y += kvm_para.h |
| 37 | generic-y += local.h | 37 | generic-y += local.h |
| 38 | generic-y += mcs_spinlock.h | 38 | generic-y += mcs_spinlock.h |
| 39 | generic-y += mm-arch-hooks.h | ||
| 39 | generic-y += mman.h | 40 | generic-y += mman.h |
| 40 | generic-y += module.h | 41 | generic-y += module.h |
| 41 | generic-y += msgbuf.h | 42 | generic-y += msgbuf.h |
diff --git a/arch/openrisc/include/asm/mm-arch-hooks.h b/arch/openrisc/include/asm/mm-arch-hooks.h deleted file mode 100644 index 6d33cb555fe1..000000000000 --- a/arch/openrisc/include/asm/mm-arch-hooks.h +++ /dev/null | |||
| @@ -1,15 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Architecture specific mm hooks | ||
| 3 | * | ||
| 4 | * Copyright (C) 2015, IBM Corporation | ||
| 5 | * Author: Laurent Dufour <ldufour@linux.vnet.ibm.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef _ASM_OPENRISC_MM_ARCH_HOOKS_H | ||
| 13 | #define _ASM_OPENRISC_MM_ARCH_HOOKS_H | ||
| 14 | |||
| 15 | #endif /* _ASM_OPENRISC_MM_ARCH_HOOKS_H */ | ||
diff --git a/arch/parisc/include/asm/Kbuild b/arch/parisc/include/asm/Kbuild index 12b341d04f88..f9b3a81aefcd 100644 --- a/arch/parisc/include/asm/Kbuild +++ b/arch/parisc/include/asm/Kbuild | |||
| @@ -15,6 +15,7 @@ generic-y += kvm_para.h | |||
| 15 | generic-y += local.h | 15 | generic-y += local.h |
| 16 | generic-y += local64.h | 16 | generic-y += local64.h |
| 17 | generic-y += mcs_spinlock.h | 17 | generic-y += mcs_spinlock.h |
| 18 | generic-y += mm-arch-hooks.h | ||
| 18 | generic-y += mutex.h | 19 | generic-y += mutex.h |
| 19 | generic-y += param.h | 20 | generic-y += param.h |
| 20 | generic-y += percpu.h | 21 | generic-y += percpu.h |
diff --git a/arch/parisc/include/asm/mm-arch-hooks.h b/arch/parisc/include/asm/mm-arch-hooks.h deleted file mode 100644 index 654ec63b0ee9..000000000000 --- a/arch/parisc/include/asm/mm-arch-hooks.h +++ /dev/null | |||
| @@ -1,15 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Architecture specific mm hooks | ||
| 3 | * | ||
| 4 | * Copyright (C) 2015, IBM Corporation | ||
| 5 | * Author: Laurent Dufour <ldufour@linux.vnet.ibm.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef _ASM_PARISC_MM_ARCH_HOOKS_H | ||
| 13 | #define _ASM_PARISC_MM_ARCH_HOOKS_H | ||
| 14 | |||
| 15 | #endif /* _ASM_PARISC_MM_ARCH_HOOKS_H */ | ||
diff --git a/arch/parisc/include/asm/pgalloc.h b/arch/parisc/include/asm/pgalloc.h index 3a08eae3318f..3edbb9fc91b4 100644 --- a/arch/parisc/include/asm/pgalloc.h +++ b/arch/parisc/include/asm/pgalloc.h | |||
| @@ -72,7 +72,7 @@ static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address) | |||
| 72 | 72 | ||
| 73 | static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd) | 73 | static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd) |
| 74 | { | 74 | { |
| 75 | if(pmd_flag(*pmd) & PxD_FLAG_ATTACHED) | 75 | if (pmd_flag(*pmd) & PxD_FLAG_ATTACHED) { |
| 76 | /* | 76 | /* |
| 77 | * This is the permanent pmd attached to the pgd; | 77 | * This is the permanent pmd attached to the pgd; |
| 78 | * cannot free it. | 78 | * cannot free it. |
| @@ -81,6 +81,7 @@ static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd) | |||
| 81 | */ | 81 | */ |
| 82 | mm_inc_nr_pmds(mm); | 82 | mm_inc_nr_pmds(mm); |
| 83 | return; | 83 | return; |
| 84 | } | ||
| 84 | free_pages((unsigned long)pmd, PMD_ORDER); | 85 | free_pages((unsigned long)pmd, PMD_ORDER); |
| 85 | } | 86 | } |
| 86 | 87 | ||
diff --git a/arch/s390/include/asm/Kbuild b/arch/s390/include/asm/Kbuild index dc5385ebb071..5ad26dd94d77 100644 --- a/arch/s390/include/asm/Kbuild +++ b/arch/s390/include/asm/Kbuild | |||
| @@ -3,5 +3,6 @@ | |||
| 3 | generic-y += clkdev.h | 3 | generic-y += clkdev.h |
| 4 | generic-y += irq_work.h | 4 | generic-y += irq_work.h |
| 5 | generic-y += mcs_spinlock.h | 5 | generic-y += mcs_spinlock.h |
| 6 | generic-y += mm-arch-hooks.h | ||
| 6 | generic-y += preempt.h | 7 | generic-y += preempt.h |
| 7 | generic-y += trace_clock.h | 8 | generic-y += trace_clock.h |
diff --git a/arch/s390/include/asm/ctl_reg.h b/arch/s390/include/asm/ctl_reg.h index cfad7fca01d6..d7697ab802f6 100644 --- a/arch/s390/include/asm/ctl_reg.h +++ b/arch/s390/include/asm/ctl_reg.h | |||
| @@ -57,7 +57,10 @@ union ctlreg0 { | |||
| 57 | unsigned long lap : 1; /* Low-address-protection control */ | 57 | unsigned long lap : 1; /* Low-address-protection control */ |
| 58 | unsigned long : 4; | 58 | unsigned long : 4; |
| 59 | unsigned long edat : 1; /* Enhanced-DAT-enablement control */ | 59 | unsigned long edat : 1; /* Enhanced-DAT-enablement control */ |
| 60 | unsigned long : 23; | 60 | unsigned long : 4; |
| 61 | unsigned long afp : 1; /* AFP-register control */ | ||
| 62 | unsigned long vx : 1; /* Vector enablement control */ | ||
| 63 | unsigned long : 17; | ||
| 61 | }; | 64 | }; |
| 62 | }; | 65 | }; |
| 63 | 66 | ||
diff --git a/arch/s390/include/asm/hugetlb.h b/arch/s390/include/asm/hugetlb.h index 0130d0379edd..d9be7c0c1291 100644 --- a/arch/s390/include/asm/hugetlb.h +++ b/arch/s390/include/asm/hugetlb.h | |||
| @@ -14,6 +14,7 @@ | |||
| 14 | 14 | ||
| 15 | #define is_hugepage_only_range(mm, addr, len) 0 | 15 | #define is_hugepage_only_range(mm, addr, len) 0 |
| 16 | #define hugetlb_free_pgd_range free_pgd_range | 16 | #define hugetlb_free_pgd_range free_pgd_range |
| 17 | #define hugepages_supported() (MACHINE_HAS_HPAGE) | ||
| 17 | 18 | ||
| 18 | void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, | 19 | void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, |
| 19 | pte_t *ptep, pte_t pte); | 20 | pte_t *ptep, pte_t pte); |
diff --git a/arch/s390/include/asm/mm-arch-hooks.h b/arch/s390/include/asm/mm-arch-hooks.h deleted file mode 100644 index 07680b2f3c59..000000000000 --- a/arch/s390/include/asm/mm-arch-hooks.h +++ /dev/null | |||
| @@ -1,15 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Architecture specific mm hooks | ||
| 3 | * | ||
| 4 | * Copyright (C) 2015, IBM Corporation | ||
| 5 | * Author: Laurent Dufour <ldufour@linux.vnet.ibm.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef _ASM_S390_MM_ARCH_HOOKS_H | ||
| 13 | #define _ASM_S390_MM_ARCH_HOOKS_H | ||
| 14 | |||
| 15 | #endif /* _ASM_S390_MM_ARCH_HOOKS_H */ | ||
diff --git a/arch/s390/include/asm/page.h b/arch/s390/include/asm/page.h index dd345238d9a7..53eacbd4f09b 100644 --- a/arch/s390/include/asm/page.h +++ b/arch/s390/include/asm/page.h | |||
| @@ -17,10 +17,7 @@ | |||
| 17 | #define PAGE_DEFAULT_ACC 0 | 17 | #define PAGE_DEFAULT_ACC 0 |
| 18 | #define PAGE_DEFAULT_KEY (PAGE_DEFAULT_ACC << 4) | 18 | #define PAGE_DEFAULT_KEY (PAGE_DEFAULT_ACC << 4) |
| 19 | 19 | ||
| 20 | #include <asm/setup.h> | 20 | #define HPAGE_SHIFT 20 |
| 21 | #ifndef __ASSEMBLY__ | ||
| 22 | |||
| 23 | extern int HPAGE_SHIFT; | ||
| 24 | #define HPAGE_SIZE (1UL << HPAGE_SHIFT) | 21 | #define HPAGE_SIZE (1UL << HPAGE_SHIFT) |
| 25 | #define HPAGE_MASK (~(HPAGE_SIZE - 1)) | 22 | #define HPAGE_MASK (~(HPAGE_SIZE - 1)) |
| 26 | #define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT) | 23 | #define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT) |
| @@ -30,6 +27,9 @@ extern int HPAGE_SHIFT; | |||
| 30 | #define ARCH_HAS_PREPARE_HUGEPAGE | 27 | #define ARCH_HAS_PREPARE_HUGEPAGE |
| 31 | #define ARCH_HAS_HUGEPAGE_CLEAR_FLUSH | 28 | #define ARCH_HAS_HUGEPAGE_CLEAR_FLUSH |
| 32 | 29 | ||
| 30 | #include <asm/setup.h> | ||
| 31 | #ifndef __ASSEMBLY__ | ||
| 32 | |||
| 33 | static inline void storage_key_init_range(unsigned long start, unsigned long end) | 33 | static inline void storage_key_init_range(unsigned long start, unsigned long end) |
| 34 | { | 34 | { |
| 35 | #if PAGE_DEFAULT_KEY | 35 | #if PAGE_DEFAULT_KEY |
diff --git a/arch/s390/include/asm/perf_event.h b/arch/s390/include/asm/perf_event.h index 4cb19fe76dd9..f897ec73dc8c 100644 --- a/arch/s390/include/asm/perf_event.h +++ b/arch/s390/include/asm/perf_event.h | |||
| @@ -87,7 +87,15 @@ struct sf_raw_sample { | |||
| 87 | } __packed; | 87 | } __packed; |
| 88 | 88 | ||
| 89 | /* Perf hardware reserve and release functions */ | 89 | /* Perf hardware reserve and release functions */ |
| 90 | #ifdef CONFIG_PERF_EVENTS | ||
| 90 | int perf_reserve_sampling(void); | 91 | int perf_reserve_sampling(void); |
| 91 | void perf_release_sampling(void); | 92 | void perf_release_sampling(void); |
| 93 | #else /* CONFIG_PERF_EVENTS */ | ||
| 94 | static inline int perf_reserve_sampling(void) | ||
| 95 | { | ||
| 96 | return 0; | ||
| 97 | } | ||
| 98 | static inline void perf_release_sampling(void) {} | ||
| 99 | #endif /* CONFIG_PERF_EVENTS */ | ||
| 92 | 100 | ||
| 93 | #endif /* _ASM_S390_PERF_EVENT_H */ | 101 | #endif /* _ASM_S390_PERF_EVENT_H */ |
diff --git a/arch/s390/kernel/nmi.c b/arch/s390/kernel/nmi.c index 505c17c0ae1a..56b550893593 100644 --- a/arch/s390/kernel/nmi.c +++ b/arch/s390/kernel/nmi.c | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | #include <asm/nmi.h> | 21 | #include <asm/nmi.h> |
| 22 | #include <asm/crw.h> | 22 | #include <asm/crw.h> |
| 23 | #include <asm/switch_to.h> | 23 | #include <asm/switch_to.h> |
| 24 | #include <asm/ctl_reg.h> | ||
| 24 | 25 | ||
| 25 | struct mcck_struct { | 26 | struct mcck_struct { |
| 26 | int kill_task; | 27 | int kill_task; |
| @@ -129,26 +130,30 @@ static int notrace s390_revalidate_registers(struct mci *mci) | |||
| 129 | } else | 130 | } else |
| 130 | asm volatile("lfpc 0(%0)" : : "a" (fpt_creg_save_area)); | 131 | asm volatile("lfpc 0(%0)" : : "a" (fpt_creg_save_area)); |
| 131 | 132 | ||
| 132 | asm volatile( | 133 | if (!MACHINE_HAS_VX) { |
| 133 | " ld 0,0(%0)\n" | 134 | /* Revalidate floating point registers */ |
| 134 | " ld 1,8(%0)\n" | 135 | asm volatile( |
| 135 | " ld 2,16(%0)\n" | 136 | " ld 0,0(%0)\n" |
| 136 | " ld 3,24(%0)\n" | 137 | " ld 1,8(%0)\n" |
| 137 | " ld 4,32(%0)\n" | 138 | " ld 2,16(%0)\n" |
| 138 | " ld 5,40(%0)\n" | 139 | " ld 3,24(%0)\n" |
| 139 | " ld 6,48(%0)\n" | 140 | " ld 4,32(%0)\n" |
| 140 | " ld 7,56(%0)\n" | 141 | " ld 5,40(%0)\n" |
| 141 | " ld 8,64(%0)\n" | 142 | " ld 6,48(%0)\n" |
| 142 | " ld 9,72(%0)\n" | 143 | " ld 7,56(%0)\n" |
| 143 | " ld 10,80(%0)\n" | 144 | " ld 8,64(%0)\n" |
| 144 | " ld 11,88(%0)\n" | 145 | " ld 9,72(%0)\n" |
| 145 | " ld 12,96(%0)\n" | 146 | " ld 10,80(%0)\n" |
| 146 | " ld 13,104(%0)\n" | 147 | " ld 11,88(%0)\n" |
| 147 | " ld 14,112(%0)\n" | 148 | " ld 12,96(%0)\n" |
| 148 | " ld 15,120(%0)\n" | 149 | " ld 13,104(%0)\n" |
| 149 | : : "a" (fpt_save_area)); | 150 | " ld 14,112(%0)\n" |
| 150 | /* Revalidate vector registers */ | 151 | " ld 15,120(%0)\n" |
| 151 | if (MACHINE_HAS_VX && current->thread.vxrs) { | 152 | : : "a" (fpt_save_area)); |
| 153 | } else { | ||
| 154 | /* Revalidate vector registers */ | ||
| 155 | union ctlreg0 cr0; | ||
| 156 | |||
| 152 | if (!mci->vr) { | 157 | if (!mci->vr) { |
| 153 | /* | 158 | /* |
| 154 | * Vector registers can't be restored and therefore | 159 | * Vector registers can't be restored and therefore |
| @@ -156,8 +161,12 @@ static int notrace s390_revalidate_registers(struct mci *mci) | |||
| 156 | */ | 161 | */ |
| 157 | kill_task = 1; | 162 | kill_task = 1; |
| 158 | } | 163 | } |
| 164 | cr0.val = S390_lowcore.cregs_save_area[0]; | ||
| 165 | cr0.afp = cr0.vx = 1; | ||
| 166 | __ctl_load(cr0.val, 0, 0); | ||
| 159 | restore_vx_regs((__vector128 *) | 167 | restore_vx_regs((__vector128 *) |
| 160 | S390_lowcore.vector_save_area_addr); | 168 | &S390_lowcore.vector_save_area); |
| 169 | __ctl_load(S390_lowcore.cregs_save_area[0], 0, 0); | ||
| 161 | } | 170 | } |
| 162 | /* Revalidate access registers */ | 171 | /* Revalidate access registers */ |
| 163 | asm volatile( | 172 | asm volatile( |
diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c index dc5edc29b73a..8f587d871b9f 100644 --- a/arch/s390/kernel/process.c +++ b/arch/s390/kernel/process.c | |||
| @@ -163,7 +163,7 @@ int copy_thread(unsigned long clone_flags, unsigned long new_stackp, | |||
| 163 | asmlinkage void execve_tail(void) | 163 | asmlinkage void execve_tail(void) |
| 164 | { | 164 | { |
| 165 | current->thread.fp_regs.fpc = 0; | 165 | current->thread.fp_regs.fpc = 0; |
| 166 | asm volatile("sfpc %0,%0" : : "d" (0)); | 166 | asm volatile("sfpc %0" : : "d" (0)); |
| 167 | } | 167 | } |
| 168 | 168 | ||
| 169 | /* | 169 | /* |
diff --git a/arch/s390/kernel/sclp.S b/arch/s390/kernel/sclp.S index 43c3169ea49c..ada0c07fe1a8 100644 --- a/arch/s390/kernel/sclp.S +++ b/arch/s390/kernel/sclp.S | |||
| @@ -270,6 +270,8 @@ ENTRY(_sclp_print_early) | |||
| 270 | jno .Lesa2 | 270 | jno .Lesa2 |
| 271 | ahi %r15,-80 | 271 | ahi %r15,-80 |
| 272 | stmh %r6,%r15,96(%r15) # store upper register halves | 272 | stmh %r6,%r15,96(%r15) # store upper register halves |
| 273 | basr %r13,0 | ||
| 274 | lmh %r0,%r15,.Lzeroes-.(%r13) # clear upper register halves | ||
| 273 | .Lesa2: | 275 | .Lesa2: |
| 274 | lr %r10,%r2 # save string pointer | 276 | lr %r10,%r2 # save string pointer |
| 275 | lhi %r2,0 | 277 | lhi %r2,0 |
| @@ -291,6 +293,8 @@ ENTRY(_sclp_print_early) | |||
| 291 | .Lesa3: | 293 | .Lesa3: |
| 292 | lm %r6,%r15,120(%r15) # restore registers | 294 | lm %r6,%r15,120(%r15) # restore registers |
| 293 | br %r14 | 295 | br %r14 |
| 296 | .Lzeroes: | ||
| 297 | .fill 64,4,0 | ||
| 294 | 298 | ||
| 295 | .LwritedataS4: | 299 | .LwritedataS4: |
| 296 | .long 0x00760005 # SCLP command for write data | 300 | .long 0x00760005 # SCLP command for write data |
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c index f7f027caaaaa..ca070d260af2 100644 --- a/arch/s390/kernel/setup.c +++ b/arch/s390/kernel/setup.c | |||
| @@ -885,8 +885,6 @@ void __init setup_arch(char **cmdline_p) | |||
| 885 | */ | 885 | */ |
| 886 | setup_hwcaps(); | 886 | setup_hwcaps(); |
| 887 | 887 | ||
| 888 | HPAGE_SHIFT = MACHINE_HAS_HPAGE ? 20 : 0; | ||
| 889 | |||
| 890 | /* | 888 | /* |
| 891 | * Create kernel page tables and switch to virtual addressing. | 889 | * Create kernel page tables and switch to virtual addressing. |
| 892 | */ | 890 | */ |
diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c index 33082d0d101b..b33f66110ca9 100644 --- a/arch/s390/mm/pgtable.c +++ b/arch/s390/mm/pgtable.c | |||
| @@ -31,8 +31,6 @@ | |||
| 31 | #define ALLOC_ORDER 2 | 31 | #define ALLOC_ORDER 2 |
| 32 | #define FRAG_MASK 0x03 | 32 | #define FRAG_MASK 0x03 |
| 33 | 33 | ||
| 34 | int HPAGE_SHIFT; | ||
| 35 | |||
| 36 | unsigned long *crst_table_alloc(struct mm_struct *mm) | 34 | unsigned long *crst_table_alloc(struct mm_struct *mm) |
| 37 | { | 35 | { |
| 38 | struct page *page = alloc_pages(GFP_KERNEL, ALLOC_ORDER); | 36 | struct page *page = alloc_pages(GFP_KERNEL, ALLOC_ORDER); |
diff --git a/arch/s390/oprofile/init.c b/arch/s390/oprofile/init.c index bc927a09a172..9cfa2ffaa9d6 100644 --- a/arch/s390/oprofile/init.c +++ b/arch/s390/oprofile/init.c | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | #include <linux/fs.h> | 16 | #include <linux/fs.h> |
| 17 | #include <linux/module.h> | 17 | #include <linux/module.h> |
| 18 | #include <asm/processor.h> | 18 | #include <asm/processor.h> |
| 19 | #include <asm/perf_event.h> | ||
| 19 | 20 | ||
| 20 | #include "../../../drivers/oprofile/oprof.h" | 21 | #include "../../../drivers/oprofile/oprof.h" |
| 21 | 22 | ||
diff --git a/arch/score/include/asm/Kbuild b/arch/score/include/asm/Kbuild index 138fb3db45ba..92ffe397b893 100644 --- a/arch/score/include/asm/Kbuild +++ b/arch/score/include/asm/Kbuild | |||
| @@ -7,6 +7,7 @@ generic-y += clkdev.h | |||
| 7 | generic-y += cputime.h | 7 | generic-y += cputime.h |
| 8 | generic-y += irq_work.h | 8 | generic-y += irq_work.h |
| 9 | generic-y += mcs_spinlock.h | 9 | generic-y += mcs_spinlock.h |
| 10 | generic-y += mm-arch-hooks.h | ||
| 10 | generic-y += preempt.h | 11 | generic-y += preempt.h |
| 11 | generic-y += sections.h | 12 | generic-y += sections.h |
| 12 | generic-y += trace_clock.h | 13 | generic-y += trace_clock.h |
diff --git a/arch/score/include/asm/mm-arch-hooks.h b/arch/score/include/asm/mm-arch-hooks.h deleted file mode 100644 index 5e38689f189a..000000000000 --- a/arch/score/include/asm/mm-arch-hooks.h +++ /dev/null | |||
| @@ -1,15 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Architecture specific mm hooks | ||
| 3 | * | ||
| 4 | * Copyright (C) 2015, IBM Corporation | ||
| 5 | * Author: Laurent Dufour <ldufour@linux.vnet.ibm.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef _ASM_SCORE_MM_ARCH_HOOKS_H | ||
| 13 | #define _ASM_SCORE_MM_ARCH_HOOKS_H | ||
| 14 | |||
| 15 | #endif /* _ASM_SCORE_MM_ARCH_HOOKS_H */ | ||
diff --git a/arch/sh/include/asm/Kbuild b/arch/sh/include/asm/Kbuild index 9ac4626e7284..aac452b26aa8 100644 --- a/arch/sh/include/asm/Kbuild +++ b/arch/sh/include/asm/Kbuild | |||
| @@ -16,6 +16,7 @@ generic-y += kvm_para.h | |||
| 16 | generic-y += local.h | 16 | generic-y += local.h |
| 17 | generic-y += local64.h | 17 | generic-y += local64.h |
| 18 | generic-y += mcs_spinlock.h | 18 | generic-y += mcs_spinlock.h |
| 19 | generic-y += mm-arch-hooks.h | ||
| 19 | generic-y += mman.h | 20 | generic-y += mman.h |
| 20 | generic-y += msgbuf.h | 21 | generic-y += msgbuf.h |
| 21 | generic-y += param.h | 22 | generic-y += param.h |
diff --git a/arch/sh/include/asm/mm-arch-hooks.h b/arch/sh/include/asm/mm-arch-hooks.h deleted file mode 100644 index 18087298b728..000000000000 --- a/arch/sh/include/asm/mm-arch-hooks.h +++ /dev/null | |||
| @@ -1,15 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Architecture specific mm hooks | ||
| 3 | * | ||
| 4 | * Copyright (C) 2015, IBM Corporation | ||
| 5 | * Author: Laurent Dufour <ldufour@linux.vnet.ibm.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef _ASM_SH_MM_ARCH_HOOKS_H | ||
| 13 | #define _ASM_SH_MM_ARCH_HOOKS_H | ||
| 14 | |||
| 15 | #endif /* _ASM_SH_MM_ARCH_HOOKS_H */ | ||
diff --git a/arch/sparc/include/asm/Kbuild b/arch/sparc/include/asm/Kbuild index 2b2a69dcc467..e928618838bc 100644 --- a/arch/sparc/include/asm/Kbuild +++ b/arch/sparc/include/asm/Kbuild | |||
| @@ -12,6 +12,7 @@ generic-y += linkage.h | |||
| 12 | generic-y += local.h | 12 | generic-y += local.h |
| 13 | generic-y += local64.h | 13 | generic-y += local64.h |
| 14 | generic-y += mcs_spinlock.h | 14 | generic-y += mcs_spinlock.h |
| 15 | generic-y += mm-arch-hooks.h | ||
| 15 | generic-y += module.h | 16 | generic-y += module.h |
| 16 | generic-y += mutex.h | 17 | generic-y += mutex.h |
| 17 | generic-y += preempt.h | 18 | generic-y += preempt.h |
diff --git a/arch/sparc/include/asm/mm-arch-hooks.h b/arch/sparc/include/asm/mm-arch-hooks.h deleted file mode 100644 index b89ba44c16f1..000000000000 --- a/arch/sparc/include/asm/mm-arch-hooks.h +++ /dev/null | |||
| @@ -1,15 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Architecture specific mm hooks | ||
| 3 | * | ||
| 4 | * Copyright (C) 2015, IBM Corporation | ||
| 5 | * Author: Laurent Dufour <ldufour@linux.vnet.ibm.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef _ASM_SPARC_MM_ARCH_HOOKS_H | ||
| 13 | #define _ASM_SPARC_MM_ARCH_HOOKS_H | ||
| 14 | |||
| 15 | #endif /* _ASM_SPARC_MM_ARCH_HOOKS_H */ | ||
diff --git a/arch/tile/include/asm/Kbuild b/arch/tile/include/asm/Kbuild index d53654488c2c..d8a843163471 100644 --- a/arch/tile/include/asm/Kbuild +++ b/arch/tile/include/asm/Kbuild | |||
| @@ -19,6 +19,7 @@ generic-y += irq_regs.h | |||
| 19 | generic-y += local.h | 19 | generic-y += local.h |
| 20 | generic-y += local64.h | 20 | generic-y += local64.h |
| 21 | generic-y += mcs_spinlock.h | 21 | generic-y += mcs_spinlock.h |
| 22 | generic-y += mm-arch-hooks.h | ||
| 22 | generic-y += msgbuf.h | 23 | generic-y += msgbuf.h |
| 23 | generic-y += mutex.h | 24 | generic-y += mutex.h |
| 24 | generic-y += param.h | 25 | generic-y += param.h |
diff --git a/arch/tile/include/asm/mm-arch-hooks.h b/arch/tile/include/asm/mm-arch-hooks.h deleted file mode 100644 index d1709ea774f7..000000000000 --- a/arch/tile/include/asm/mm-arch-hooks.h +++ /dev/null | |||
| @@ -1,15 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Architecture specific mm hooks | ||
| 3 | * | ||
| 4 | * Copyright (C) 2015, IBM Corporation | ||
| 5 | * Author: Laurent Dufour <ldufour@linux.vnet.ibm.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef _ASM_TILE_MM_ARCH_HOOKS_H | ||
| 13 | #define _ASM_TILE_MM_ARCH_HOOKS_H | ||
| 14 | |||
| 15 | #endif /* _ASM_TILE_MM_ARCH_HOOKS_H */ | ||
diff --git a/arch/um/include/asm/Kbuild b/arch/um/include/asm/Kbuild index 3d63ff6f583f..149ec55f9c46 100644 --- a/arch/um/include/asm/Kbuild +++ b/arch/um/include/asm/Kbuild | |||
| @@ -16,6 +16,7 @@ generic-y += irq_regs.h | |||
| 16 | generic-y += irq_work.h | 16 | generic-y += irq_work.h |
| 17 | generic-y += kdebug.h | 17 | generic-y += kdebug.h |
| 18 | generic-y += mcs_spinlock.h | 18 | generic-y += mcs_spinlock.h |
| 19 | generic-y += mm-arch-hooks.h | ||
| 19 | generic-y += mutex.h | 20 | generic-y += mutex.h |
| 20 | generic-y += param.h | 21 | generic-y += param.h |
| 21 | generic-y += pci.h | 22 | generic-y += pci.h |
diff --git a/arch/um/include/asm/mm-arch-hooks.h b/arch/um/include/asm/mm-arch-hooks.h deleted file mode 100644 index a7c8b0dfdd4e..000000000000 --- a/arch/um/include/asm/mm-arch-hooks.h +++ /dev/null | |||
| @@ -1,15 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Architecture specific mm hooks | ||
| 3 | * | ||
| 4 | * Copyright (C) 2015, IBM Corporation | ||
| 5 | * Author: Laurent Dufour <ldufour@linux.vnet.ibm.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef _ASM_UM_MM_ARCH_HOOKS_H | ||
| 13 | #define _ASM_UM_MM_ARCH_HOOKS_H | ||
| 14 | |||
| 15 | #endif /* _ASM_UM_MM_ARCH_HOOKS_H */ | ||
diff --git a/arch/unicore32/include/asm/Kbuild b/arch/unicore32/include/asm/Kbuild index d12b377b5a8b..1fc7a286dc6f 100644 --- a/arch/unicore32/include/asm/Kbuild +++ b/arch/unicore32/include/asm/Kbuild | |||
| @@ -26,6 +26,7 @@ generic-y += kdebug.h | |||
| 26 | generic-y += kmap_types.h | 26 | generic-y += kmap_types.h |
| 27 | generic-y += local.h | 27 | generic-y += local.h |
| 28 | generic-y += mcs_spinlock.h | 28 | generic-y += mcs_spinlock.h |
| 29 | generic-y += mm-arch-hooks.h | ||
| 29 | generic-y += mman.h | 30 | generic-y += mman.h |
| 30 | generic-y += module.h | 31 | generic-y += module.h |
| 31 | generic-y += msgbuf.h | 32 | generic-y += msgbuf.h |
diff --git a/arch/unicore32/include/asm/mm-arch-hooks.h b/arch/unicore32/include/asm/mm-arch-hooks.h deleted file mode 100644 index 4d79a850c509..000000000000 --- a/arch/unicore32/include/asm/mm-arch-hooks.h +++ /dev/null | |||
| @@ -1,15 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Architecture specific mm hooks | ||
| 3 | * | ||
| 4 | * Copyright (C) 2015, IBM Corporation | ||
| 5 | * Author: Laurent Dufour <ldufour@linux.vnet.ibm.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef _ASM_UNICORE32_MM_ARCH_HOOKS_H | ||
| 13 | #define _ASM_UNICORE32_MM_ARCH_HOOKS_H | ||
| 14 | |||
| 15 | #endif /* _ASM_UNICORE32_MM_ARCH_HOOKS_H */ | ||
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 3dbb7e7909ca..b3a1a5d77d92 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
| @@ -41,6 +41,7 @@ config X86 | |||
| 41 | select ARCH_USE_CMPXCHG_LOCKREF if X86_64 | 41 | select ARCH_USE_CMPXCHG_LOCKREF if X86_64 |
| 42 | select ARCH_USE_QUEUED_RWLOCKS | 42 | select ARCH_USE_QUEUED_RWLOCKS |
| 43 | select ARCH_USE_QUEUED_SPINLOCKS | 43 | select ARCH_USE_QUEUED_SPINLOCKS |
| 44 | select ARCH_WANTS_DYNAMIC_TASK_STRUCT | ||
| 44 | select ARCH_WANT_FRAME_POINTERS | 45 | select ARCH_WANT_FRAME_POINTERS |
| 45 | select ARCH_WANT_IPC_PARSE_VERSION if X86_32 | 46 | select ARCH_WANT_IPC_PARSE_VERSION if X86_32 |
| 46 | select ARCH_WANT_OPTIONAL_GPIOLIB | 47 | select ARCH_WANT_OPTIONAL_GPIOLIB |
diff --git a/arch/x86/Kconfig.debug b/arch/x86/Kconfig.debug index a15893d17c55..d8c0d3266173 100644 --- a/arch/x86/Kconfig.debug +++ b/arch/x86/Kconfig.debug | |||
| @@ -297,6 +297,18 @@ config OPTIMIZE_INLINING | |||
| 297 | 297 | ||
| 298 | If unsure, say N. | 298 | If unsure, say N. |
| 299 | 299 | ||
| 300 | config DEBUG_ENTRY | ||
| 301 | bool "Debug low-level entry code" | ||
| 302 | depends on DEBUG_KERNEL | ||
| 303 | ---help--- | ||
| 304 | This option enables sanity checks in x86's low-level entry code. | ||
| 305 | Some of these sanity checks may slow down kernel entries and | ||
| 306 | exits or otherwise impact performance. | ||
| 307 | |||
| 308 | This is currently used to help test NMI code. | ||
| 309 | |||
| 310 | If unsure, say N. | ||
| 311 | |||
| 300 | config DEBUG_NMI_SELFTEST | 312 | config DEBUG_NMI_SELFTEST |
| 301 | bool "NMI Selftest" | 313 | bool "NMI Selftest" |
| 302 | depends on DEBUG_KERNEL && X86_LOCAL_APIC | 314 | depends on DEBUG_KERNEL && X86_LOCAL_APIC |
diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S index 3bb2c4302df1..8cb3e438f21e 100644 --- a/arch/x86/entry/entry_64.S +++ b/arch/x86/entry/entry_64.S | |||
| @@ -1237,11 +1237,12 @@ ENTRY(nmi) | |||
| 1237 | * If the variable is not set and the stack is not the NMI | 1237 | * If the variable is not set and the stack is not the NMI |
| 1238 | * stack then: | 1238 | * stack then: |
| 1239 | * o Set the special variable on the stack | 1239 | * o Set the special variable on the stack |
| 1240 | * o Copy the interrupt frame into a "saved" location on the stack | 1240 | * o Copy the interrupt frame into an "outermost" location on the |
| 1241 | * o Copy the interrupt frame into a "copy" location on the stack | 1241 | * stack |
| 1242 | * o Copy the interrupt frame into an "iret" location on the stack | ||
| 1242 | * o Continue processing the NMI | 1243 | * o Continue processing the NMI |
| 1243 | * If the variable is set or the previous stack is the NMI stack: | 1244 | * If the variable is set or the previous stack is the NMI stack: |
| 1244 | * o Modify the "copy" location to jump to the repeate_nmi | 1245 | * o Modify the "iret" location to jump to the repeat_nmi |
| 1245 | * o return back to the first NMI | 1246 | * o return back to the first NMI |
| 1246 | * | 1247 | * |
| 1247 | * Now on exit of the first NMI, we first clear the stack variable | 1248 | * Now on exit of the first NMI, we first clear the stack variable |
| @@ -1250,31 +1251,151 @@ ENTRY(nmi) | |||
| 1250 | * a nested NMI that updated the copy interrupt stack frame, a | 1251 | * a nested NMI that updated the copy interrupt stack frame, a |
| 1251 | * jump will be made to the repeat_nmi code that will handle the second | 1252 | * jump will be made to the repeat_nmi code that will handle the second |
| 1252 | * NMI. | 1253 | * NMI. |
| 1254 | * | ||
| 1255 | * However, espfix prevents us from directly returning to userspace | ||
| 1256 | * with a single IRET instruction. Similarly, IRET to user mode | ||
| 1257 | * can fault. We therefore handle NMIs from user space like | ||
| 1258 | * other IST entries. | ||
| 1253 | */ | 1259 | */ |
| 1254 | 1260 | ||
| 1255 | /* Use %rdx as our temp variable throughout */ | 1261 | /* Use %rdx as our temp variable throughout */ |
| 1256 | pushq %rdx | 1262 | pushq %rdx |
| 1257 | 1263 | ||
| 1264 | testb $3, CS-RIP+8(%rsp) | ||
| 1265 | jz .Lnmi_from_kernel | ||
| 1266 | |||
| 1267 | /* | ||
| 1268 | * NMI from user mode. We need to run on the thread stack, but we | ||
| 1269 | * can't go through the normal entry paths: NMIs are masked, and | ||
| 1270 | * we don't want to enable interrupts, because then we'll end | ||
| 1271 | * up in an awkward situation in which IRQs are on but NMIs | ||
| 1272 | * are off. | ||
| 1273 | */ | ||
| 1274 | |||
| 1275 | SWAPGS | ||
| 1276 | cld | ||
| 1277 | movq %rsp, %rdx | ||
| 1278 | movq PER_CPU_VAR(cpu_current_top_of_stack), %rsp | ||
| 1279 | pushq 5*8(%rdx) /* pt_regs->ss */ | ||
| 1280 | pushq 4*8(%rdx) /* pt_regs->rsp */ | ||
| 1281 | pushq 3*8(%rdx) /* pt_regs->flags */ | ||
| 1282 | pushq 2*8(%rdx) /* pt_regs->cs */ | ||
| 1283 | pushq 1*8(%rdx) /* pt_regs->rip */ | ||
| 1284 | pushq $-1 /* pt_regs->orig_ax */ | ||
| 1285 | pushq %rdi /* pt_regs->di */ | ||
| 1286 | pushq %rsi /* pt_regs->si */ | ||
| 1287 | pushq (%rdx) /* pt_regs->dx */ | ||
| 1288 | pushq %rcx /* pt_regs->cx */ | ||
| 1289 | pushq %rax /* pt_regs->ax */ | ||
| 1290 | pushq %r8 /* pt_regs->r8 */ | ||
| 1291 | pushq %r9 /* pt_regs->r9 */ | ||
| 1292 | pushq %r10 /* pt_regs->r10 */ | ||
| 1293 | pushq %r11 /* pt_regs->r11 */ | ||
| 1294 | pushq %rbx /* pt_regs->rbx */ | ||
| 1295 | pushq %rbp /* pt_regs->rbp */ | ||
| 1296 | pushq %r12 /* pt_regs->r12 */ | ||
| 1297 | pushq %r13 /* pt_regs->r13 */ | ||
| 1298 | pushq %r14 /* pt_regs->r14 */ | ||
| 1299 | pushq %r15 /* pt_regs->r15 */ | ||
| 1300 | |||
| 1301 | /* | ||
| 1302 | * At this point we no longer need to worry about stack damage | ||
| 1303 | * due to nesting -- we're on the normal thread stack and we're | ||
| 1304 | * done with the NMI stack. | ||
| 1305 | */ | ||
| 1306 | |||
| 1307 | movq %rsp, %rdi | ||
| 1308 | movq $-1, %rsi | ||
| 1309 | call do_nmi | ||
| 1310 | |||
| 1311 | /* | ||
| 1312 | * Return back to user mode. We must *not* do the normal exit | ||
| 1313 | * work, because we don't want to enable interrupts. Fortunately, | ||
| 1314 | * do_nmi doesn't modify pt_regs. | ||
| 1315 | */ | ||
| 1316 | SWAPGS | ||
| 1317 | jmp restore_c_regs_and_iret | ||
| 1318 | |||
| 1319 | .Lnmi_from_kernel: | ||
| 1320 | /* | ||
| 1321 | * Here's what our stack frame will look like: | ||
| 1322 | * +---------------------------------------------------------+ | ||
| 1323 | * | original SS | | ||
| 1324 | * | original Return RSP | | ||
| 1325 | * | original RFLAGS | | ||
| 1326 | * | original CS | | ||
| 1327 | * | original RIP | | ||
| 1328 | * +---------------------------------------------------------+ | ||
| 1329 | * | temp storage for rdx | | ||
| 1330 | * +---------------------------------------------------------+ | ||
| 1331 | * | "NMI executing" variable | | ||
| 1332 | * +---------------------------------------------------------+ | ||
| 1333 | * | iret SS } Copied from "outermost" frame | | ||
| 1334 | * | iret Return RSP } on each loop iteration; overwritten | | ||
| 1335 | * | iret RFLAGS } by a nested NMI to force another | | ||
| 1336 | * | iret CS } iteration if needed. | | ||
| 1337 | * | iret RIP } | | ||
| 1338 | * +---------------------------------------------------------+ | ||
| 1339 | * | outermost SS } initialized in first_nmi; | | ||
| 1340 | * | outermost Return RSP } will not be changed before | | ||
| 1341 | * | outermost RFLAGS } NMI processing is done. | | ||
| 1342 | * | outermost CS } Copied to "iret" frame on each | | ||
| 1343 | * | outermost RIP } iteration. | | ||
| 1344 | * +---------------------------------------------------------+ | ||
| 1345 | * | pt_regs | | ||
| 1346 | * +---------------------------------------------------------+ | ||
| 1347 | * | ||
| 1348 | * The "original" frame is used by hardware. Before re-enabling | ||
| 1349 | * NMIs, we need to be done with it, and we need to leave enough | ||
| 1350 | * space for the asm code here. | ||
| 1351 | * | ||
| 1352 | * We return by executing IRET while RSP points to the "iret" frame. | ||
| 1353 | * That will either return for real or it will loop back into NMI | ||
| 1354 | * processing. | ||
| 1355 | * | ||
| 1356 | * The "outermost" frame is copied to the "iret" frame on each | ||
| 1357 | * iteration of the loop, so each iteration starts with the "iret" | ||
| 1358 | * frame pointing to the final return target. | ||
| 1359 | */ | ||
| 1360 | |||
| 1258 | /* | 1361 | /* |
| 1259 | * If %cs was not the kernel segment, then the NMI triggered in user | 1362 | * Determine whether we're a nested NMI. |
| 1260 | * space, which means it is definitely not nested. | 1363 | * |
| 1364 | * If we interrupted kernel code between repeat_nmi and | ||
| 1365 | * end_repeat_nmi, then we are a nested NMI. We must not | ||
| 1366 | * modify the "iret" frame because it's being written by | ||
| 1367 | * the outer NMI. That's okay; the outer NMI handler is | ||
| 1368 | * about to about to call do_nmi anyway, so we can just | ||
| 1369 | * resume the outer NMI. | ||
| 1261 | */ | 1370 | */ |
| 1262 | cmpl $__KERNEL_CS, 16(%rsp) | 1371 | |
| 1263 | jne first_nmi | 1372 | movq $repeat_nmi, %rdx |
| 1373 | cmpq 8(%rsp), %rdx | ||
| 1374 | ja 1f | ||
| 1375 | movq $end_repeat_nmi, %rdx | ||
| 1376 | cmpq 8(%rsp), %rdx | ||
| 1377 | ja nested_nmi_out | ||
| 1378 | 1: | ||
| 1264 | 1379 | ||
| 1265 | /* | 1380 | /* |
| 1266 | * Check the special variable on the stack to see if NMIs are | 1381 | * Now check "NMI executing". If it's set, then we're nested. |
| 1267 | * executing. | 1382 | * This will not detect if we interrupted an outer NMI just |
| 1383 | * before IRET. | ||
| 1268 | */ | 1384 | */ |
| 1269 | cmpl $1, -8(%rsp) | 1385 | cmpl $1, -8(%rsp) |
| 1270 | je nested_nmi | 1386 | je nested_nmi |
| 1271 | 1387 | ||
| 1272 | /* | 1388 | /* |
| 1273 | * Now test if the previous stack was an NMI stack. | 1389 | * Now test if the previous stack was an NMI stack. This covers |
| 1274 | * We need the double check. We check the NMI stack to satisfy the | 1390 | * the case where we interrupt an outer NMI after it clears |
| 1275 | * race when the first NMI clears the variable before returning. | 1391 | * "NMI executing" but before IRET. We need to be careful, though: |
| 1276 | * We check the variable because the first NMI could be in a | 1392 | * there is one case in which RSP could point to the NMI stack |
| 1277 | * breakpoint routine using a breakpoint stack. | 1393 | * despite there being no NMI active: naughty userspace controls |
| 1394 | * RSP at the very beginning of the SYSCALL targets. We can | ||
| 1395 | * pull a fast one on naughty userspace, though: we program | ||
| 1396 | * SYSCALL to mask DF, so userspace cannot cause DF to be set | ||
| 1397 | * if it controls the kernel's RSP. We set DF before we clear | ||
| 1398 | * "NMI executing". | ||
| 1278 | */ | 1399 | */ |
| 1279 | lea 6*8(%rsp), %rdx | 1400 | lea 6*8(%rsp), %rdx |
| 1280 | /* Compare the NMI stack (rdx) with the stack we came from (4*8(%rsp)) */ | 1401 | /* Compare the NMI stack (rdx) with the stack we came from (4*8(%rsp)) */ |
| @@ -1286,25 +1407,20 @@ ENTRY(nmi) | |||
| 1286 | cmpq %rdx, 4*8(%rsp) | 1407 | cmpq %rdx, 4*8(%rsp) |
| 1287 | /* If it is below the NMI stack, it is a normal NMI */ | 1408 | /* If it is below the NMI stack, it is a normal NMI */ |
| 1288 | jb first_nmi | 1409 | jb first_nmi |
| 1289 | /* Ah, it is within the NMI stack, treat it as nested */ | 1410 | |
| 1411 | /* Ah, it is within the NMI stack. */ | ||
| 1412 | |||
| 1413 | testb $(X86_EFLAGS_DF >> 8), (3*8 + 1)(%rsp) | ||
| 1414 | jz first_nmi /* RSP was user controlled. */ | ||
| 1415 | |||
| 1416 | /* This is a nested NMI. */ | ||
| 1290 | 1417 | ||
| 1291 | nested_nmi: | 1418 | nested_nmi: |
| 1292 | /* | 1419 | /* |
| 1293 | * Do nothing if we interrupted the fixup in repeat_nmi. | 1420 | * Modify the "iret" frame to point to repeat_nmi, forcing another |
| 1294 | * It's about to repeat the NMI handler, so we are fine | 1421 | * iteration of NMI handling. |
| 1295 | * with ignoring this one. | ||
| 1296 | */ | 1422 | */ |
| 1297 | movq $repeat_nmi, %rdx | 1423 | subq $8, %rsp |
| 1298 | cmpq 8(%rsp), %rdx | ||
| 1299 | ja 1f | ||
| 1300 | movq $end_repeat_nmi, %rdx | ||
| 1301 | cmpq 8(%rsp), %rdx | ||
| 1302 | ja nested_nmi_out | ||
| 1303 | |||
| 1304 | 1: | ||
| 1305 | /* Set up the interrupted NMIs stack to jump to repeat_nmi */ | ||
| 1306 | leaq -1*8(%rsp), %rdx | ||
| 1307 | movq %rdx, %rsp | ||
| 1308 | leaq -10*8(%rsp), %rdx | 1424 | leaq -10*8(%rsp), %rdx |
| 1309 | pushq $__KERNEL_DS | 1425 | pushq $__KERNEL_DS |
| 1310 | pushq %rdx | 1426 | pushq %rdx |
| @@ -1318,61 +1434,42 @@ nested_nmi: | |||
| 1318 | nested_nmi_out: | 1434 | nested_nmi_out: |
| 1319 | popq %rdx | 1435 | popq %rdx |
| 1320 | 1436 | ||
| 1321 | /* No need to check faults here */ | 1437 | /* We are returning to kernel mode, so this cannot result in a fault. */ |
| 1322 | INTERRUPT_RETURN | 1438 | INTERRUPT_RETURN |
| 1323 | 1439 | ||
| 1324 | first_nmi: | 1440 | first_nmi: |
| 1325 | /* | 1441 | /* Restore rdx. */ |
| 1326 | * Because nested NMIs will use the pushed location that we | ||
| 1327 | * stored in rdx, we must keep that space available. | ||
| 1328 | * Here's what our stack frame will look like: | ||
| 1329 | * +-------------------------+ | ||
| 1330 | * | original SS | | ||
| 1331 | * | original Return RSP | | ||
| 1332 | * | original RFLAGS | | ||
| 1333 | * | original CS | | ||
| 1334 | * | original RIP | | ||
| 1335 | * +-------------------------+ | ||
| 1336 | * | temp storage for rdx | | ||
| 1337 | * +-------------------------+ | ||
| 1338 | * | NMI executing variable | | ||
| 1339 | * +-------------------------+ | ||
| 1340 | * | copied SS | | ||
| 1341 | * | copied Return RSP | | ||
| 1342 | * | copied RFLAGS | | ||
| 1343 | * | copied CS | | ||
| 1344 | * | copied RIP | | ||
| 1345 | * +-------------------------+ | ||
| 1346 | * | Saved SS | | ||
| 1347 | * | Saved Return RSP | | ||
| 1348 | * | Saved RFLAGS | | ||
| 1349 | * | Saved CS | | ||
| 1350 | * | Saved RIP | | ||
| 1351 | * +-------------------------+ | ||
| 1352 | * | pt_regs | | ||
| 1353 | * +-------------------------+ | ||
| 1354 | * | ||
| 1355 | * The saved stack frame is used to fix up the copied stack frame | ||
| 1356 | * that a nested NMI may change to make the interrupted NMI iret jump | ||
| 1357 | * to the repeat_nmi. The original stack frame and the temp storage | ||
| 1358 | * is also used by nested NMIs and can not be trusted on exit. | ||
| 1359 | */ | ||
| 1360 | /* Do not pop rdx, nested NMIs will corrupt that part of the stack */ | ||
| 1361 | movq (%rsp), %rdx | 1442 | movq (%rsp), %rdx |
| 1362 | 1443 | ||
| 1363 | /* Set the NMI executing variable on the stack. */ | 1444 | /* Make room for "NMI executing". */ |
| 1364 | pushq $1 | 1445 | pushq $0 |
| 1365 | 1446 | ||
| 1366 | /* Leave room for the "copied" frame */ | 1447 | /* Leave room for the "iret" frame */ |
| 1367 | subq $(5*8), %rsp | 1448 | subq $(5*8), %rsp |
| 1368 | 1449 | ||
| 1369 | /* Copy the stack frame to the Saved frame */ | 1450 | /* Copy the "original" frame to the "outermost" frame */ |
| 1370 | .rept 5 | 1451 | .rept 5 |
| 1371 | pushq 11*8(%rsp) | 1452 | pushq 11*8(%rsp) |
| 1372 | .endr | 1453 | .endr |
| 1373 | 1454 | ||
| 1374 | /* Everything up to here is safe from nested NMIs */ | 1455 | /* Everything up to here is safe from nested NMIs */ |
| 1375 | 1456 | ||
| 1457 | #ifdef CONFIG_DEBUG_ENTRY | ||
| 1458 | /* | ||
| 1459 | * For ease of testing, unmask NMIs right away. Disabled by | ||
| 1460 | * default because IRET is very expensive. | ||
| 1461 | */ | ||
| 1462 | pushq $0 /* SS */ | ||
| 1463 | pushq %rsp /* RSP (minus 8 because of the previous push) */ | ||
| 1464 | addq $8, (%rsp) /* Fix up RSP */ | ||
| 1465 | pushfq /* RFLAGS */ | ||
| 1466 | pushq $__KERNEL_CS /* CS */ | ||
| 1467 | pushq $1f /* RIP */ | ||
| 1468 | INTERRUPT_RETURN /* continues at repeat_nmi below */ | ||
| 1469 | 1: | ||
| 1470 | #endif | ||
| 1471 | |||
| 1472 | repeat_nmi: | ||
| 1376 | /* | 1473 | /* |
| 1377 | * If there was a nested NMI, the first NMI's iret will return | 1474 | * If there was a nested NMI, the first NMI's iret will return |
| 1378 | * here. But NMIs are still enabled and we can take another | 1475 | * here. But NMIs are still enabled and we can take another |
| @@ -1381,16 +1478,20 @@ first_nmi: | |||
| 1381 | * it will just return, as we are about to repeat an NMI anyway. | 1478 | * it will just return, as we are about to repeat an NMI anyway. |
| 1382 | * This makes it safe to copy to the stack frame that a nested | 1479 | * This makes it safe to copy to the stack frame that a nested |
| 1383 | * NMI will update. | 1480 | * NMI will update. |
| 1481 | * | ||
| 1482 | * RSP is pointing to "outermost RIP". gsbase is unknown, but, if | ||
| 1483 | * we're repeating an NMI, gsbase has the same value that it had on | ||
| 1484 | * the first iteration. paranoid_entry will load the kernel | ||
| 1485 | * gsbase if needed before we call do_nmi. "NMI executing" | ||
| 1486 | * is zero. | ||
| 1384 | */ | 1487 | */ |
| 1385 | repeat_nmi: | 1488 | movq $1, 10*8(%rsp) /* Set "NMI executing". */ |
| 1489 | |||
| 1386 | /* | 1490 | /* |
| 1387 | * Update the stack variable to say we are still in NMI (the update | 1491 | * Copy the "outermost" frame to the "iret" frame. NMIs that nest |
| 1388 | * is benign for the non-repeat case, where 1 was pushed just above | 1492 | * here must not modify the "iret" frame while we're writing to |
| 1389 | * to this very stack slot). | 1493 | * it or it will end up containing garbage. |
| 1390 | */ | 1494 | */ |
| 1391 | movq $1, 10*8(%rsp) | ||
| 1392 | |||
| 1393 | /* Make another copy, this one may be modified by nested NMIs */ | ||
| 1394 | addq $(10*8), %rsp | 1495 | addq $(10*8), %rsp |
| 1395 | .rept 5 | 1496 | .rept 5 |
| 1396 | pushq -6*8(%rsp) | 1497 | pushq -6*8(%rsp) |
| @@ -1399,9 +1500,9 @@ repeat_nmi: | |||
| 1399 | end_repeat_nmi: | 1500 | end_repeat_nmi: |
| 1400 | 1501 | ||
| 1401 | /* | 1502 | /* |
| 1402 | * Everything below this point can be preempted by a nested | 1503 | * Everything below this point can be preempted by a nested NMI. |
| 1403 | * NMI if the first NMI took an exception and reset our iret stack | 1504 | * If this happens, then the inner NMI will change the "iret" |
| 1404 | * so that we repeat another NMI. | 1505 | * frame to point back to repeat_nmi. |
| 1405 | */ | 1506 | */ |
| 1406 | pushq $-1 /* ORIG_RAX: no syscall to restart */ | 1507 | pushq $-1 /* ORIG_RAX: no syscall to restart */ |
| 1407 | ALLOC_PT_GPREGS_ON_STACK | 1508 | ALLOC_PT_GPREGS_ON_STACK |
| @@ -1415,28 +1516,11 @@ end_repeat_nmi: | |||
| 1415 | */ | 1516 | */ |
| 1416 | call paranoid_entry | 1517 | call paranoid_entry |
| 1417 | 1518 | ||
| 1418 | /* | ||
| 1419 | * Save off the CR2 register. If we take a page fault in the NMI then | ||
| 1420 | * it could corrupt the CR2 value. If the NMI preempts a page fault | ||
| 1421 | * handler before it was able to read the CR2 register, and then the | ||
| 1422 | * NMI itself takes a page fault, the page fault that was preempted | ||
| 1423 | * will read the information from the NMI page fault and not the | ||
| 1424 | * origin fault. Save it off and restore it if it changes. | ||
| 1425 | * Use the r12 callee-saved register. | ||
| 1426 | */ | ||
| 1427 | movq %cr2, %r12 | ||
| 1428 | |||
| 1429 | /* paranoidentry do_nmi, 0; without TRACE_IRQS_OFF */ | 1519 | /* paranoidentry do_nmi, 0; without TRACE_IRQS_OFF */ |
| 1430 | movq %rsp, %rdi | 1520 | movq %rsp, %rdi |
| 1431 | movq $-1, %rsi | 1521 | movq $-1, %rsi |
| 1432 | call do_nmi | 1522 | call do_nmi |
| 1433 | 1523 | ||
| 1434 | /* Did the NMI take a page fault? Restore cr2 if it did */ | ||
| 1435 | movq %cr2, %rcx | ||
| 1436 | cmpq %rcx, %r12 | ||
| 1437 | je 1f | ||
| 1438 | movq %r12, %cr2 | ||
| 1439 | 1: | ||
| 1440 | testl %ebx, %ebx /* swapgs needed? */ | 1524 | testl %ebx, %ebx /* swapgs needed? */ |
| 1441 | jnz nmi_restore | 1525 | jnz nmi_restore |
| 1442 | nmi_swapgs: | 1526 | nmi_swapgs: |
| @@ -1444,11 +1528,26 @@ nmi_swapgs: | |||
| 1444 | nmi_restore: | 1528 | nmi_restore: |
| 1445 | RESTORE_EXTRA_REGS | 1529 | RESTORE_EXTRA_REGS |
| 1446 | RESTORE_C_REGS | 1530 | RESTORE_C_REGS |
| 1447 | /* Pop the extra iret frame at once */ | 1531 | |
| 1532 | /* Point RSP at the "iret" frame. */ | ||
| 1448 | REMOVE_PT_GPREGS_FROM_STACK 6*8 | 1533 | REMOVE_PT_GPREGS_FROM_STACK 6*8 |
| 1449 | 1534 | ||
| 1450 | /* Clear the NMI executing stack variable */ | 1535 | /* |
| 1451 | movq $0, 5*8(%rsp) | 1536 | * Clear "NMI executing". Set DF first so that we can easily |
| 1537 | * distinguish the remaining code between here and IRET from | ||
| 1538 | * the SYSCALL entry and exit paths. On a native kernel, we | ||
| 1539 | * could just inspect RIP, but, on paravirt kernels, | ||
| 1540 | * INTERRUPT_RETURN can translate into a jump into a | ||
| 1541 | * hypercall page. | ||
| 1542 | */ | ||
| 1543 | std | ||
| 1544 | movq $0, 5*8(%rsp) /* clear "NMI executing" */ | ||
| 1545 | |||
| 1546 | /* | ||
| 1547 | * INTERRUPT_RETURN reads the "iret" frame and exits the NMI | ||
| 1548 | * stack in a single instruction. We are returning to kernel | ||
| 1549 | * mode, so this cannot result in a fault. | ||
| 1550 | */ | ||
| 1452 | INTERRUPT_RETURN | 1551 | INTERRUPT_RETURN |
| 1453 | END(nmi) | 1552 | END(nmi) |
| 1454 | 1553 | ||
diff --git a/arch/x86/include/asm/Kbuild b/arch/x86/include/asm/Kbuild index 4dd1f2d770af..aeac434c9feb 100644 --- a/arch/x86/include/asm/Kbuild +++ b/arch/x86/include/asm/Kbuild | |||
| @@ -9,3 +9,4 @@ generic-y += cputime.h | |||
| 9 | generic-y += dma-contiguous.h | 9 | generic-y += dma-contiguous.h |
| 10 | generic-y += early_ioremap.h | 10 | generic-y += early_ioremap.h |
| 11 | generic-y += mcs_spinlock.h | 11 | generic-y += mcs_spinlock.h |
| 12 | generic-y += mm-arch-hooks.h | ||
diff --git a/arch/x86/include/asm/fpu/types.h b/arch/x86/include/asm/fpu/types.h index 0637826292de..c49c5173158e 100644 --- a/arch/x86/include/asm/fpu/types.h +++ b/arch/x86/include/asm/fpu/types.h | |||
| @@ -189,6 +189,7 @@ union fpregs_state { | |||
| 189 | struct fxregs_state fxsave; | 189 | struct fxregs_state fxsave; |
| 190 | struct swregs_state soft; | 190 | struct swregs_state soft; |
| 191 | struct xregs_state xsave; | 191 | struct xregs_state xsave; |
| 192 | u8 __padding[PAGE_SIZE]; | ||
| 192 | }; | 193 | }; |
| 193 | 194 | ||
| 194 | /* | 195 | /* |
| @@ -198,40 +199,6 @@ union fpregs_state { | |||
| 198 | */ | 199 | */ |
| 199 | struct fpu { | 200 | struct fpu { |
| 200 | /* | 201 | /* |
| 201 | * @state: | ||
| 202 | * | ||
| 203 | * In-memory copy of all FPU registers that we save/restore | ||
| 204 | * over context switches. If the task is using the FPU then | ||
| 205 | * the registers in the FPU are more recent than this state | ||
| 206 | * copy. If the task context-switches away then they get | ||
| 207 | * saved here and represent the FPU state. | ||
| 208 | * | ||
| 209 | * After context switches there may be a (short) time period | ||
| 210 | * during which the in-FPU hardware registers are unchanged | ||
| 211 | * and still perfectly match this state, if the tasks | ||
| 212 | * scheduled afterwards are not using the FPU. | ||
| 213 | * | ||
| 214 | * This is the 'lazy restore' window of optimization, which | ||
| 215 | * we track though 'fpu_fpregs_owner_ctx' and 'fpu->last_cpu'. | ||
| 216 | * | ||
| 217 | * We detect whether a subsequent task uses the FPU via setting | ||
| 218 | * CR0::TS to 1, which causes any FPU use to raise a #NM fault. | ||
| 219 | * | ||
| 220 | * During this window, if the task gets scheduled again, we | ||
| 221 | * might be able to skip having to do a restore from this | ||
| 222 | * memory buffer to the hardware registers - at the cost of | ||
| 223 | * incurring the overhead of #NM fault traps. | ||
| 224 | * | ||
| 225 | * Note that on modern CPUs that support the XSAVEOPT (or other | ||
| 226 | * optimized XSAVE instructions), we don't use #NM traps anymore, | ||
| 227 | * as the hardware can track whether FPU registers need saving | ||
| 228 | * or not. On such CPUs we activate the non-lazy ('eagerfpu') | ||
| 229 | * logic, which unconditionally saves/restores all FPU state | ||
| 230 | * across context switches. (if FPU state exists.) | ||
| 231 | */ | ||
| 232 | union fpregs_state state; | ||
| 233 | |||
| 234 | /* | ||
| 235 | * @last_cpu: | 202 | * @last_cpu: |
| 236 | * | 203 | * |
| 237 | * Records the last CPU on which this context was loaded into | 204 | * Records the last CPU on which this context was loaded into |
| @@ -288,6 +255,43 @@ struct fpu { | |||
| 288 | * deal with bursty apps that only use the FPU for a short time: | 255 | * deal with bursty apps that only use the FPU for a short time: |
| 289 | */ | 256 | */ |
| 290 | unsigned char counter; | 257 | unsigned char counter; |
| 258 | /* | ||
| 259 | * @state: | ||
| 260 | * | ||
| 261 | * In-memory copy of all FPU registers that we save/restore | ||
| 262 | * over context switches. If the task is using the FPU then | ||
| 263 | * the registers in the FPU are more recent than this state | ||
| 264 | * copy. If the task context-switches away then they get | ||
| 265 | * saved here and represent the FPU state. | ||
| 266 | * | ||
| 267 | * After context switches there may be a (short) time period | ||
| 268 | * during which the in-FPU hardware registers are unchanged | ||
| 269 | * and still perfectly match this state, if the tasks | ||
| 270 | * scheduled afterwards are not using the FPU. | ||
| 271 | * | ||
| 272 | * This is the 'lazy restore' window of optimization, which | ||
| 273 | * we track though 'fpu_fpregs_owner_ctx' and 'fpu->last_cpu'. | ||
| 274 | * | ||
| 275 | * We detect whether a subsequent task uses the FPU via setting | ||
| 276 | * CR0::TS to 1, which causes any FPU use to raise a #NM fault. | ||
| 277 | * | ||
| 278 | * During this window, if the task gets scheduled again, we | ||
| 279 | * might be able to skip having to do a restore from this | ||
| 280 | * memory buffer to the hardware registers - at the cost of | ||
| 281 | * incurring the overhead of #NM fault traps. | ||
| 282 | * | ||
| 283 | * Note that on modern CPUs that support the XSAVEOPT (or other | ||
| 284 | * optimized XSAVE instructions), we don't use #NM traps anymore, | ||
| 285 | * as the hardware can track whether FPU registers need saving | ||
| 286 | * or not. On such CPUs we activate the non-lazy ('eagerfpu') | ||
| 287 | * logic, which unconditionally saves/restores all FPU state | ||
| 288 | * across context switches. (if FPU state exists.) | ||
| 289 | */ | ||
| 290 | union fpregs_state state; | ||
| 291 | /* | ||
| 292 | * WARNING: 'state' is dynamically-sized. Do not put | ||
| 293 | * anything after it here. | ||
| 294 | */ | ||
| 291 | }; | 295 | }; |
| 292 | 296 | ||
| 293 | #endif /* _ASM_X86_FPU_H */ | 297 | #endif /* _ASM_X86_FPU_H */ |
diff --git a/arch/x86/include/asm/intel_pmc_ipc.h b/arch/x86/include/asm/intel_pmc_ipc.h index 200ec2e7821d..cd0310e186f4 100644 --- a/arch/x86/include/asm/intel_pmc_ipc.h +++ b/arch/x86/include/asm/intel_pmc_ipc.h | |||
| @@ -25,36 +25,9 @@ | |||
| 25 | 25 | ||
| 26 | #if IS_ENABLED(CONFIG_INTEL_PMC_IPC) | 26 | #if IS_ENABLED(CONFIG_INTEL_PMC_IPC) |
| 27 | 27 | ||
| 28 | /* | ||
| 29 | * intel_pmc_ipc_simple_command | ||
| 30 | * @cmd: command | ||
| 31 | * @sub: sub type | ||
| 32 | */ | ||
| 33 | int intel_pmc_ipc_simple_command(int cmd, int sub); | 28 | int intel_pmc_ipc_simple_command(int cmd, int sub); |
| 34 | |||
| 35 | /* | ||
| 36 | * intel_pmc_ipc_raw_cmd | ||
| 37 | * @cmd: command | ||
| 38 | * @sub: sub type | ||
| 39 | * @in: input data | ||
| 40 | * @inlen: input length in bytes | ||
| 41 | * @out: output data | ||
| 42 | * @outlen: output length in dwords | ||
| 43 | * @sptr: data writing to SPTR register | ||
| 44 | * @dptr: data writing to DPTR register | ||
| 45 | */ | ||
| 46 | int intel_pmc_ipc_raw_cmd(u32 cmd, u32 sub, u8 *in, u32 inlen, | 29 | int intel_pmc_ipc_raw_cmd(u32 cmd, u32 sub, u8 *in, u32 inlen, |
| 47 | u32 *out, u32 outlen, u32 dptr, u32 sptr); | 30 | u32 *out, u32 outlen, u32 dptr, u32 sptr); |
| 48 | |||
| 49 | /* | ||
| 50 | * intel_pmc_ipc_command | ||
| 51 | * @cmd: command | ||
| 52 | * @sub: sub type | ||
| 53 | * @in: input data | ||
| 54 | * @inlen: input length in bytes | ||
| 55 | * @out: output data | ||
| 56 | * @outlen: output length in dwords | ||
| 57 | */ | ||
| 58 | int intel_pmc_ipc_command(u32 cmd, u32 sub, u8 *in, u32 inlen, | 31 | int intel_pmc_ipc_command(u32 cmd, u32 sub, u8 *in, u32 inlen, |
| 59 | u32 *out, u32 outlen); | 32 | u32 *out, u32 outlen); |
| 60 | 33 | ||
diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 2a7f5d782c33..49ec9038ec14 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h | |||
| @@ -604,6 +604,8 @@ struct kvm_arch { | |||
| 604 | bool iommu_noncoherent; | 604 | bool iommu_noncoherent; |
| 605 | #define __KVM_HAVE_ARCH_NONCOHERENT_DMA | 605 | #define __KVM_HAVE_ARCH_NONCOHERENT_DMA |
| 606 | atomic_t noncoherent_dma_count; | 606 | atomic_t noncoherent_dma_count; |
| 607 | #define __KVM_HAVE_ARCH_ASSIGNED_DEVICE | ||
| 608 | atomic_t assigned_device_count; | ||
| 607 | struct kvm_pic *vpic; | 609 | struct kvm_pic *vpic; |
| 608 | struct kvm_ioapic *vioapic; | 610 | struct kvm_ioapic *vioapic; |
| 609 | struct kvm_pit *vpit; | 611 | struct kvm_pit *vpit; |
diff --git a/arch/x86/include/asm/mm-arch-hooks.h b/arch/x86/include/asm/mm-arch-hooks.h deleted file mode 100644 index 4e881a342236..000000000000 --- a/arch/x86/include/asm/mm-arch-hooks.h +++ /dev/null | |||
| @@ -1,15 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Architecture specific mm hooks | ||
| 3 | * | ||
| 4 | * Copyright (C) 2015, IBM Corporation | ||
| 5 | * Author: Laurent Dufour <ldufour@linux.vnet.ibm.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef _ASM_X86_MM_ARCH_HOOKS_H | ||
| 13 | #define _ASM_X86_MM_ARCH_HOOKS_H | ||
| 14 | |||
| 15 | #endif /* _ASM_X86_MM_ARCH_HOOKS_H */ | ||
diff --git a/arch/x86/include/asm/mmu_context.h b/arch/x86/include/asm/mmu_context.h index 5e8daee7c5c9..804a3a6030ca 100644 --- a/arch/x86/include/asm/mmu_context.h +++ b/arch/x86/include/asm/mmu_context.h | |||
| @@ -23,7 +23,7 @@ extern struct static_key rdpmc_always_available; | |||
| 23 | 23 | ||
| 24 | static inline void load_mm_cr4(struct mm_struct *mm) | 24 | static inline void load_mm_cr4(struct mm_struct *mm) |
| 25 | { | 25 | { |
| 26 | if (static_key_true(&rdpmc_always_available) || | 26 | if (static_key_false(&rdpmc_always_available) || |
| 27 | atomic_read(&mm->context.perf_rdpmc_allowed)) | 27 | atomic_read(&mm->context.perf_rdpmc_allowed)) |
| 28 | cr4_set_bits(X86_CR4_PCE); | 28 | cr4_set_bits(X86_CR4_PCE); |
| 29 | else | 29 | else |
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h index 43e6519df0d5..944f1785ed0d 100644 --- a/arch/x86/include/asm/processor.h +++ b/arch/x86/include/asm/processor.h | |||
| @@ -390,9 +390,6 @@ struct thread_struct { | |||
| 390 | #endif | 390 | #endif |
| 391 | unsigned long gs; | 391 | unsigned long gs; |
| 392 | 392 | ||
| 393 | /* Floating point and extended processor state */ | ||
| 394 | struct fpu fpu; | ||
| 395 | |||
| 396 | /* Save middle states of ptrace breakpoints */ | 393 | /* Save middle states of ptrace breakpoints */ |
| 397 | struct perf_event *ptrace_bps[HBP_NUM]; | 394 | struct perf_event *ptrace_bps[HBP_NUM]; |
| 398 | /* Debug status used for traps, single steps, etc... */ | 395 | /* Debug status used for traps, single steps, etc... */ |
| @@ -418,6 +415,13 @@ struct thread_struct { | |||
| 418 | unsigned long iopl; | 415 | unsigned long iopl; |
| 419 | /* Max allowed port in the bitmap, in bytes: */ | 416 | /* Max allowed port in the bitmap, in bytes: */ |
| 420 | unsigned io_bitmap_max; | 417 | unsigned io_bitmap_max; |
| 418 | |||
| 419 | /* Floating point and extended processor state */ | ||
| 420 | struct fpu fpu; | ||
| 421 | /* | ||
| 422 | * WARNING: 'fpu' is dynamically-sized. It *MUST* be at | ||
| 423 | * the end. | ||
| 424 | */ | ||
| 421 | }; | 425 | }; |
| 422 | 426 | ||
| 423 | /* | 427 | /* |
diff --git a/arch/x86/include/uapi/asm/hyperv.h b/arch/x86/include/uapi/asm/hyperv.h index 8fba544e9cc4..f36d56bd7632 100644 --- a/arch/x86/include/uapi/asm/hyperv.h +++ b/arch/x86/include/uapi/asm/hyperv.h | |||
| @@ -108,6 +108,8 @@ | |||
| 108 | #define HV_X64_HYPERCALL_PARAMS_XMM_AVAILABLE (1 << 4) | 108 | #define HV_X64_HYPERCALL_PARAMS_XMM_AVAILABLE (1 << 4) |
| 109 | /* Support for a virtual guest idle state is available */ | 109 | /* Support for a virtual guest idle state is available */ |
| 110 | #define HV_X64_GUEST_IDLE_STATE_AVAILABLE (1 << 5) | 110 | #define HV_X64_GUEST_IDLE_STATE_AVAILABLE (1 << 5) |
| 111 | /* Guest crash data handler available */ | ||
| 112 | #define HV_X64_GUEST_CRASH_MSR_AVAILABLE (1 << 10) | ||
| 111 | 113 | ||
| 112 | /* | 114 | /* |
| 113 | * Implementation recommendations. Indicates which behaviors the hypervisor | 115 | * Implementation recommendations. Indicates which behaviors the hypervisor |
diff --git a/arch/x86/kernel/fpu/init.c b/arch/x86/kernel/fpu/init.c index 32826791e675..0b39173dd971 100644 --- a/arch/x86/kernel/fpu/init.c +++ b/arch/x86/kernel/fpu/init.c | |||
| @@ -4,6 +4,8 @@ | |||
| 4 | #include <asm/fpu/internal.h> | 4 | #include <asm/fpu/internal.h> |
| 5 | #include <asm/tlbflush.h> | 5 | #include <asm/tlbflush.h> |
| 6 | 6 | ||
| 7 | #include <linux/sched.h> | ||
| 8 | |||
| 7 | /* | 9 | /* |
| 8 | * Initialize the TS bit in CR0 according to the style of context-switches | 10 | * Initialize the TS bit in CR0 according to the style of context-switches |
| 9 | * we are using: | 11 | * we are using: |
| @@ -136,6 +138,43 @@ static void __init fpu__init_system_generic(void) | |||
| 136 | unsigned int xstate_size; | 138 | unsigned int xstate_size; |
| 137 | EXPORT_SYMBOL_GPL(xstate_size); | 139 | EXPORT_SYMBOL_GPL(xstate_size); |
| 138 | 140 | ||
| 141 | /* Enforce that 'MEMBER' is the last field of 'TYPE': */ | ||
| 142 | #define CHECK_MEMBER_AT_END_OF(TYPE, MEMBER) \ | ||
| 143 | BUILD_BUG_ON(sizeof(TYPE) != offsetofend(TYPE, MEMBER)) | ||
| 144 | |||
| 145 | /* | ||
| 146 | * We append the 'struct fpu' to the task_struct: | ||
| 147 | */ | ||
| 148 | static void __init fpu__init_task_struct_size(void) | ||
| 149 | { | ||
| 150 | int task_size = sizeof(struct task_struct); | ||
| 151 | |||
| 152 | /* | ||
| 153 | * Subtract off the static size of the register state. | ||
| 154 | * It potentially has a bunch of padding. | ||
| 155 | */ | ||
| 156 | task_size -= sizeof(((struct task_struct *)0)->thread.fpu.state); | ||
| 157 | |||
| 158 | /* | ||
| 159 | * Add back the dynamically-calculated register state | ||
| 160 | * size. | ||
| 161 | */ | ||
| 162 | task_size += xstate_size; | ||
| 163 | |||
| 164 | /* | ||
| 165 | * We dynamically size 'struct fpu', so we require that | ||
| 166 | * it be at the end of 'thread_struct' and that | ||
| 167 | * 'thread_struct' be at the end of 'task_struct'. If | ||
| 168 | * you hit a compile error here, check the structure to | ||
| 169 | * see if something got added to the end. | ||
| 170 | */ | ||
| 171 | CHECK_MEMBER_AT_END_OF(struct fpu, state); | ||
| 172 | CHECK_MEMBER_AT_END_OF(struct thread_struct, fpu); | ||
| 173 | CHECK_MEMBER_AT_END_OF(struct task_struct, thread); | ||
| 174 | |||
| 175 | arch_task_struct_size = task_size; | ||
| 176 | } | ||
| 177 | |||
| 139 | /* | 178 | /* |
| 140 | * Set up the xstate_size based on the legacy FPU context size. | 179 | * Set up the xstate_size based on the legacy FPU context size. |
| 141 | * | 180 | * |
| @@ -287,6 +326,7 @@ void __init fpu__init_system(struct cpuinfo_x86 *c) | |||
| 287 | fpu__init_system_generic(); | 326 | fpu__init_system_generic(); |
| 288 | fpu__init_system_xstate_size_legacy(); | 327 | fpu__init_system_xstate_size_legacy(); |
| 289 | fpu__init_system_xstate(); | 328 | fpu__init_system_xstate(); |
| 329 | fpu__init_task_struct_size(); | ||
| 290 | 330 | ||
| 291 | fpu__init_system_ctx_switch(); | 331 | fpu__init_system_ctx_switch(); |
| 292 | } | 332 | } |
diff --git a/arch/x86/kernel/nmi.c b/arch/x86/kernel/nmi.c index c3e985d1751c..d05bd2e2ee91 100644 --- a/arch/x86/kernel/nmi.c +++ b/arch/x86/kernel/nmi.c | |||
| @@ -408,15 +408,15 @@ static void default_do_nmi(struct pt_regs *regs) | |||
| 408 | NOKPROBE_SYMBOL(default_do_nmi); | 408 | NOKPROBE_SYMBOL(default_do_nmi); |
| 409 | 409 | ||
| 410 | /* | 410 | /* |
| 411 | * NMIs can hit breakpoints which will cause it to lose its | 411 | * NMIs can page fault or hit breakpoints which will cause it to lose |
| 412 | * NMI context with the CPU when the breakpoint does an iret. | 412 | * its NMI context with the CPU when the breakpoint or page fault does an IRET. |
| 413 | */ | 413 | * |
| 414 | #ifdef CONFIG_X86_32 | 414 | * As a result, NMIs can nest if NMIs get unmasked due an IRET during |
| 415 | /* | 415 | * NMI processing. On x86_64, the asm glue protects us from nested NMIs |
| 416 | * For i386, NMIs use the same stack as the kernel, and we can | 416 | * if the outer NMI came from kernel mode, but we can still nest if the |
| 417 | * add a workaround to the iret problem in C (preventing nested | 417 | * outer NMI came from user mode. |
| 418 | * NMIs if an NMI takes a trap). Simply have 3 states the NMI | 418 | * |
| 419 | * can be in: | 419 | * To handle these nested NMIs, we have three states: |
| 420 | * | 420 | * |
| 421 | * 1) not running | 421 | * 1) not running |
| 422 | * 2) executing | 422 | * 2) executing |
| @@ -430,15 +430,14 @@ NOKPROBE_SYMBOL(default_do_nmi); | |||
| 430 | * (Note, the latch is binary, thus multiple NMIs triggering, | 430 | * (Note, the latch is binary, thus multiple NMIs triggering, |
| 431 | * when one is running, are ignored. Only one NMI is restarted.) | 431 | * when one is running, are ignored. Only one NMI is restarted.) |
| 432 | * | 432 | * |
| 433 | * If an NMI hits a breakpoint that executes an iret, another | 433 | * If an NMI executes an iret, another NMI can preempt it. We do not |
| 434 | * NMI can preempt it. We do not want to allow this new NMI | 434 | * want to allow this new NMI to run, but we want to execute it when the |
| 435 | * to run, but we want to execute it when the first one finishes. | 435 | * first one finishes. We set the state to "latched", and the exit of |
| 436 | * We set the state to "latched", and the exit of the first NMI will | 436 | * the first NMI will perform a dec_return, if the result is zero |
| 437 | * perform a dec_return, if the result is zero (NOT_RUNNING), then | 437 | * (NOT_RUNNING), then it will simply exit the NMI handler. If not, the |
| 438 | * it will simply exit the NMI handler. If not, the dec_return | 438 | * dec_return would have set the state to NMI_EXECUTING (what we want it |
| 439 | * would have set the state to NMI_EXECUTING (what we want it to | 439 | * to be when we are running). In this case, we simply jump back to |
| 440 | * be when we are running). In this case, we simply jump back | 440 | * rerun the NMI handler again, and restart the 'latched' NMI. |
| 441 | * to rerun the NMI handler again, and restart the 'latched' NMI. | ||
| 442 | * | 441 | * |
| 443 | * No trap (breakpoint or page fault) should be hit before nmi_restart, | 442 | * No trap (breakpoint or page fault) should be hit before nmi_restart, |
| 444 | * thus there is no race between the first check of state for NOT_RUNNING | 443 | * thus there is no race between the first check of state for NOT_RUNNING |
| @@ -461,49 +460,36 @@ enum nmi_states { | |||
| 461 | static DEFINE_PER_CPU(enum nmi_states, nmi_state); | 460 | static DEFINE_PER_CPU(enum nmi_states, nmi_state); |
| 462 | static DEFINE_PER_CPU(unsigned long, nmi_cr2); | 461 | static DEFINE_PER_CPU(unsigned long, nmi_cr2); |
| 463 | 462 | ||
| 464 | #define nmi_nesting_preprocess(regs) \ | 463 | #ifdef CONFIG_X86_64 |
| 465 | do { \ | ||
| 466 | if (this_cpu_read(nmi_state) != NMI_NOT_RUNNING) { \ | ||
| 467 | this_cpu_write(nmi_state, NMI_LATCHED); \ | ||
| 468 | return; \ | ||
| 469 | } \ | ||
| 470 | this_cpu_write(nmi_state, NMI_EXECUTING); \ | ||
| 471 | this_cpu_write(nmi_cr2, read_cr2()); \ | ||
| 472 | } while (0); \ | ||
| 473 | nmi_restart: | ||
| 474 | |||
| 475 | #define nmi_nesting_postprocess() \ | ||
| 476 | do { \ | ||
| 477 | if (unlikely(this_cpu_read(nmi_cr2) != read_cr2())) \ | ||
| 478 | write_cr2(this_cpu_read(nmi_cr2)); \ | ||
| 479 | if (this_cpu_dec_return(nmi_state)) \ | ||
| 480 | goto nmi_restart; \ | ||
| 481 | } while (0) | ||
| 482 | #else /* x86_64 */ | ||
| 483 | /* | 464 | /* |
| 484 | * In x86_64 things are a bit more difficult. This has the same problem | 465 | * In x86_64, we need to handle breakpoint -> NMI -> breakpoint. Without |
| 485 | * where an NMI hitting a breakpoint that calls iret will remove the | 466 | * some care, the inner breakpoint will clobber the outer breakpoint's |
| 486 | * NMI context, allowing a nested NMI to enter. What makes this more | 467 | * stack. |
| 487 | * difficult is that both NMIs and breakpoints have their own stack. | ||
| 488 | * When a new NMI or breakpoint is executed, the stack is set to a fixed | ||
| 489 | * point. If an NMI is nested, it will have its stack set at that same | ||
| 490 | * fixed address that the first NMI had, and will start corrupting the | ||
| 491 | * stack. This is handled in entry_64.S, but the same problem exists with | ||
| 492 | * the breakpoint stack. | ||
| 493 | * | 468 | * |
| 494 | * If a breakpoint is being processed, and the debug stack is being used, | 469 | * If a breakpoint is being processed, and the debug stack is being |
| 495 | * if an NMI comes in and also hits a breakpoint, the stack pointer | 470 | * used, if an NMI comes in and also hits a breakpoint, the stack |
| 496 | * will be set to the same fixed address as the breakpoint that was | 471 | * pointer will be set to the same fixed address as the breakpoint that |
| 497 | * interrupted, causing that stack to be corrupted. To handle this case, | 472 | * was interrupted, causing that stack to be corrupted. To handle this |
| 498 | * check if the stack that was interrupted is the debug stack, and if | 473 | * case, check if the stack that was interrupted is the debug stack, and |
| 499 | * so, change the IDT so that new breakpoints will use the current stack | 474 | * if so, change the IDT so that new breakpoints will use the current |
| 500 | * and not switch to the fixed address. On return of the NMI, switch back | 475 | * stack and not switch to the fixed address. On return of the NMI, |
| 501 | * to the original IDT. | 476 | * switch back to the original IDT. |
| 502 | */ | 477 | */ |
| 503 | static DEFINE_PER_CPU(int, update_debug_stack); | 478 | static DEFINE_PER_CPU(int, update_debug_stack); |
| 479 | #endif | ||
| 504 | 480 | ||
| 505 | static inline void nmi_nesting_preprocess(struct pt_regs *regs) | 481 | dotraplinkage notrace void |
| 482 | do_nmi(struct pt_regs *regs, long error_code) | ||
| 506 | { | 483 | { |
| 484 | if (this_cpu_read(nmi_state) != NMI_NOT_RUNNING) { | ||
| 485 | this_cpu_write(nmi_state, NMI_LATCHED); | ||
| 486 | return; | ||
| 487 | } | ||
| 488 | this_cpu_write(nmi_state, NMI_EXECUTING); | ||
| 489 | this_cpu_write(nmi_cr2, read_cr2()); | ||
| 490 | nmi_restart: | ||
| 491 | |||
| 492 | #ifdef CONFIG_X86_64 | ||
| 507 | /* | 493 | /* |
| 508 | * If we interrupted a breakpoint, it is possible that | 494 | * If we interrupted a breakpoint, it is possible that |
| 509 | * the nmi handler will have breakpoints too. We need to | 495 | * the nmi handler will have breakpoints too. We need to |
| @@ -514,22 +500,8 @@ static inline void nmi_nesting_preprocess(struct pt_regs *regs) | |||
| 514 | debug_stack_set_zero(); | 500 | debug_stack_set_zero(); |
| 515 | this_cpu_write(update_debug_stack, 1); | 501 | this_cpu_write(update_debug_stack, 1); |
| 516 | } | 502 | } |
| 517 | } | ||
| 518 | |||
| 519 | static inline void nmi_nesting_postprocess(void) | ||
| 520 | { | ||
| 521 | if (unlikely(this_cpu_read(update_debug_stack))) { | ||
| 522 | debug_stack_reset(); | ||
| 523 | this_cpu_write(update_debug_stack, 0); | ||
| 524 | } | ||
| 525 | } | ||
| 526 | #endif | 503 | #endif |
| 527 | 504 | ||
| 528 | dotraplinkage notrace void | ||
| 529 | do_nmi(struct pt_regs *regs, long error_code) | ||
| 530 | { | ||
| 531 | nmi_nesting_preprocess(regs); | ||
| 532 | |||
| 533 | nmi_enter(); | 505 | nmi_enter(); |
| 534 | 506 | ||
| 535 | inc_irq_stat(__nmi_count); | 507 | inc_irq_stat(__nmi_count); |
| @@ -539,8 +511,17 @@ do_nmi(struct pt_regs *regs, long error_code) | |||
| 539 | 511 | ||
| 540 | nmi_exit(); | 512 | nmi_exit(); |
| 541 | 513 | ||
| 542 | /* On i386, may loop back to preprocess */ | 514 | #ifdef CONFIG_X86_64 |
| 543 | nmi_nesting_postprocess(); | 515 | if (unlikely(this_cpu_read(update_debug_stack))) { |
| 516 | debug_stack_reset(); | ||
| 517 | this_cpu_write(update_debug_stack, 0); | ||
| 518 | } | ||
| 519 | #endif | ||
| 520 | |||
| 521 | if (unlikely(this_cpu_read(nmi_cr2) != read_cr2())) | ||
| 522 | write_cr2(this_cpu_read(nmi_cr2)); | ||
| 523 | if (this_cpu_dec_return(nmi_state)) | ||
| 524 | goto nmi_restart; | ||
| 544 | } | 525 | } |
| 545 | NOKPROBE_SYMBOL(do_nmi); | 526 | NOKPROBE_SYMBOL(do_nmi); |
| 546 | 527 | ||
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index 9cad694ed7c4..397688beed4b 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c | |||
| @@ -81,7 +81,7 @@ EXPORT_SYMBOL_GPL(idle_notifier_unregister); | |||
| 81 | */ | 81 | */ |
| 82 | int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src) | 82 | int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src) |
| 83 | { | 83 | { |
| 84 | *dst = *src; | 84 | memcpy(dst, src, arch_task_struct_size); |
| 85 | 85 | ||
| 86 | return fpu__copy(&dst->thread.fpu, &src->thread.fpu); | 86 | return fpu__copy(&dst->thread.fpu, &src->thread.fpu); |
| 87 | } | 87 | } |
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index d3010aa79daf..b1f3ed9c7a9e 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c | |||
| @@ -992,8 +992,17 @@ int native_cpu_up(unsigned int cpu, struct task_struct *tidle) | |||
| 992 | 992 | ||
| 993 | common_cpu_up(cpu, tidle); | 993 | common_cpu_up(cpu, tidle); |
| 994 | 994 | ||
| 995 | /* | ||
| 996 | * We have to walk the irq descriptors to setup the vector | ||
| 997 | * space for the cpu which comes online. Prevent irq | ||
| 998 | * alloc/free across the bringup. | ||
| 999 | */ | ||
| 1000 | irq_lock_sparse(); | ||
| 1001 | |||
| 995 | err = do_boot_cpu(apicid, cpu, tidle); | 1002 | err = do_boot_cpu(apicid, cpu, tidle); |
| 1003 | |||
| 996 | if (err) { | 1004 | if (err) { |
| 1005 | irq_unlock_sparse(); | ||
| 997 | pr_err("do_boot_cpu failed(%d) to wakeup CPU#%u\n", err, cpu); | 1006 | pr_err("do_boot_cpu failed(%d) to wakeup CPU#%u\n", err, cpu); |
| 998 | return -EIO; | 1007 | return -EIO; |
| 999 | } | 1008 | } |
| @@ -1011,6 +1020,8 @@ int native_cpu_up(unsigned int cpu, struct task_struct *tidle) | |||
| 1011 | touch_nmi_watchdog(); | 1020 | touch_nmi_watchdog(); |
| 1012 | } | 1021 | } |
| 1013 | 1022 | ||
| 1023 | irq_unlock_sparse(); | ||
| 1024 | |||
| 1014 | return 0; | 1025 | return 0; |
| 1015 | } | 1026 | } |
| 1016 | 1027 | ||
diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c index 64dd46793099..2fbea2544f24 100644 --- a/arch/x86/kvm/cpuid.c +++ b/arch/x86/kvm/cpuid.c | |||
| @@ -98,6 +98,8 @@ int kvm_update_cpuid(struct kvm_vcpu *vcpu) | |||
| 98 | best->ebx = xstate_required_size(vcpu->arch.xcr0, true); | 98 | best->ebx = xstate_required_size(vcpu->arch.xcr0, true); |
| 99 | 99 | ||
| 100 | vcpu->arch.eager_fpu = use_eager_fpu() || guest_cpuid_has_mpx(vcpu); | 100 | vcpu->arch.eager_fpu = use_eager_fpu() || guest_cpuid_has_mpx(vcpu); |
| 101 | if (vcpu->arch.eager_fpu) | ||
| 102 | kvm_x86_ops->fpu_activate(vcpu); | ||
| 101 | 103 | ||
| 102 | /* | 104 | /* |
| 103 | * The existing code assumes virtual address is 48-bit in the canonical | 105 | * The existing code assumes virtual address is 48-bit in the canonical |
diff --git a/arch/x86/kvm/iommu.c b/arch/x86/kvm/iommu.c index 7dbced309ddb..5c520ebf6343 100644 --- a/arch/x86/kvm/iommu.c +++ b/arch/x86/kvm/iommu.c | |||
| @@ -200,6 +200,7 @@ int kvm_assign_device(struct kvm *kvm, struct pci_dev *pdev) | |||
| 200 | goto out_unmap; | 200 | goto out_unmap; |
| 201 | } | 201 | } |
| 202 | 202 | ||
| 203 | kvm_arch_start_assignment(kvm); | ||
| 203 | pci_set_dev_assigned(pdev); | 204 | pci_set_dev_assigned(pdev); |
| 204 | 205 | ||
| 205 | dev_info(&pdev->dev, "kvm assign device\n"); | 206 | dev_info(&pdev->dev, "kvm assign device\n"); |
| @@ -224,6 +225,7 @@ int kvm_deassign_device(struct kvm *kvm, struct pci_dev *pdev) | |||
| 224 | iommu_detach_device(domain, &pdev->dev); | 225 | iommu_detach_device(domain, &pdev->dev); |
| 225 | 226 | ||
| 226 | pci_clear_dev_assigned(pdev); | 227 | pci_clear_dev_assigned(pdev); |
| 228 | kvm_arch_end_assignment(kvm); | ||
| 227 | 229 | ||
| 228 | dev_info(&pdev->dev, "kvm deassign device\n"); | 230 | dev_info(&pdev->dev, "kvm deassign device\n"); |
| 229 | 231 | ||
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index f807496b62c2..44171462bd2a 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c | |||
| @@ -2479,6 +2479,14 @@ static int mmu_need_write_protect(struct kvm_vcpu *vcpu, gfn_t gfn, | |||
| 2479 | return 0; | 2479 | return 0; |
| 2480 | } | 2480 | } |
| 2481 | 2481 | ||
| 2482 | static bool kvm_is_mmio_pfn(pfn_t pfn) | ||
| 2483 | { | ||
| 2484 | if (pfn_valid(pfn)) | ||
| 2485 | return !is_zero_pfn(pfn) && PageReserved(pfn_to_page(pfn)); | ||
| 2486 | |||
| 2487 | return true; | ||
| 2488 | } | ||
| 2489 | |||
| 2482 | static int set_spte(struct kvm_vcpu *vcpu, u64 *sptep, | 2490 | static int set_spte(struct kvm_vcpu *vcpu, u64 *sptep, |
| 2483 | unsigned pte_access, int level, | 2491 | unsigned pte_access, int level, |
| 2484 | gfn_t gfn, pfn_t pfn, bool speculative, | 2492 | gfn_t gfn, pfn_t pfn, bool speculative, |
| @@ -2506,7 +2514,7 @@ static int set_spte(struct kvm_vcpu *vcpu, u64 *sptep, | |||
| 2506 | spte |= PT_PAGE_SIZE_MASK; | 2514 | spte |= PT_PAGE_SIZE_MASK; |
| 2507 | if (tdp_enabled) | 2515 | if (tdp_enabled) |
| 2508 | spte |= kvm_x86_ops->get_mt_mask(vcpu, gfn, | 2516 | spte |= kvm_x86_ops->get_mt_mask(vcpu, gfn, |
| 2509 | kvm_is_reserved_pfn(pfn)); | 2517 | kvm_is_mmio_pfn(pfn)); |
| 2510 | 2518 | ||
| 2511 | if (host_writable) | 2519 | if (host_writable) |
| 2512 | spte |= SPTE_HOST_WRITEABLE; | 2520 | spte |= SPTE_HOST_WRITEABLE; |
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index 602b974a60a6..bbc678a66b18 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c | |||
| @@ -865,6 +865,64 @@ static void svm_disable_lbrv(struct vcpu_svm *svm) | |||
| 865 | set_msr_interception(msrpm, MSR_IA32_LASTINTTOIP, 0, 0); | 865 | set_msr_interception(msrpm, MSR_IA32_LASTINTTOIP, 0, 0); |
| 866 | } | 866 | } |
| 867 | 867 | ||
| 868 | #define MTRR_TYPE_UC_MINUS 7 | ||
| 869 | #define MTRR2PROTVAL_INVALID 0xff | ||
| 870 | |||
| 871 | static u8 mtrr2protval[8]; | ||
| 872 | |||
| 873 | static u8 fallback_mtrr_type(int mtrr) | ||
| 874 | { | ||
| 875 | /* | ||
| 876 | * WT and WP aren't always available in the host PAT. Treat | ||
| 877 | * them as UC and UC- respectively. Everything else should be | ||
| 878 | * there. | ||
| 879 | */ | ||
| 880 | switch (mtrr) | ||
| 881 | { | ||
| 882 | case MTRR_TYPE_WRTHROUGH: | ||
| 883 | return MTRR_TYPE_UNCACHABLE; | ||
| 884 | case MTRR_TYPE_WRPROT: | ||
| 885 | return MTRR_TYPE_UC_MINUS; | ||
| 886 | default: | ||
| 887 | BUG(); | ||
| 888 | } | ||
| 889 | } | ||
| 890 | |||
| 891 | static void build_mtrr2protval(void) | ||
| 892 | { | ||
| 893 | int i; | ||
| 894 | u64 pat; | ||
| 895 | |||
| 896 | for (i = 0; i < 8; i++) | ||
| 897 | mtrr2protval[i] = MTRR2PROTVAL_INVALID; | ||
| 898 | |||
| 899 | /* Ignore the invalid MTRR types. */ | ||
| 900 | mtrr2protval[2] = 0; | ||
| 901 | mtrr2protval[3] = 0; | ||
| 902 | |||
| 903 | /* | ||
| 904 | * Use host PAT value to figure out the mapping from guest MTRR | ||
| 905 | * values to nested page table PAT/PCD/PWT values. We do not | ||
| 906 | * want to change the host PAT value every time we enter the | ||
| 907 | * guest. | ||
| 908 | */ | ||
| 909 | rdmsrl(MSR_IA32_CR_PAT, pat); | ||
| 910 | for (i = 0; i < 8; i++) { | ||
| 911 | u8 mtrr = pat >> (8 * i); | ||
| 912 | |||
| 913 | if (mtrr2protval[mtrr] == MTRR2PROTVAL_INVALID) | ||
| 914 | mtrr2protval[mtrr] = __cm_idx2pte(i); | ||
| 915 | } | ||
| 916 | |||
| 917 | for (i = 0; i < 8; i++) { | ||
| 918 | if (mtrr2protval[i] == MTRR2PROTVAL_INVALID) { | ||
| 919 | u8 fallback = fallback_mtrr_type(i); | ||
| 920 | mtrr2protval[i] = mtrr2protval[fallback]; | ||
| 921 | BUG_ON(mtrr2protval[i] == MTRR2PROTVAL_INVALID); | ||
| 922 | } | ||
| 923 | } | ||
| 924 | } | ||
| 925 | |||
| 868 | static __init int svm_hardware_setup(void) | 926 | static __init int svm_hardware_setup(void) |
| 869 | { | 927 | { |
| 870 | int cpu; | 928 | int cpu; |
| @@ -931,6 +989,7 @@ static __init int svm_hardware_setup(void) | |||
| 931 | } else | 989 | } else |
| 932 | kvm_disable_tdp(); | 990 | kvm_disable_tdp(); |
| 933 | 991 | ||
| 992 | build_mtrr2protval(); | ||
| 934 | return 0; | 993 | return 0; |
| 935 | 994 | ||
| 936 | err: | 995 | err: |
| @@ -1085,6 +1144,39 @@ static u64 svm_compute_tsc_offset(struct kvm_vcpu *vcpu, u64 target_tsc) | |||
| 1085 | return target_tsc - tsc; | 1144 | return target_tsc - tsc; |
| 1086 | } | 1145 | } |
| 1087 | 1146 | ||
| 1147 | static void svm_set_guest_pat(struct vcpu_svm *svm, u64 *g_pat) | ||
| 1148 | { | ||
| 1149 | struct kvm_vcpu *vcpu = &svm->vcpu; | ||
| 1150 | |||
| 1151 | /* Unlike Intel, AMD takes the guest's CR0.CD into account. | ||
| 1152 | * | ||
| 1153 | * AMD does not have IPAT. To emulate it for the case of guests | ||
| 1154 | * with no assigned devices, just set everything to WB. If guests | ||
| 1155 | * have assigned devices, however, we cannot force WB for RAM | ||
| 1156 | * pages only, so use the guest PAT directly. | ||
| 1157 | */ | ||
| 1158 | if (!kvm_arch_has_assigned_device(vcpu->kvm)) | ||
| 1159 | *g_pat = 0x0606060606060606; | ||
| 1160 | else | ||
| 1161 | *g_pat = vcpu->arch.pat; | ||
| 1162 | } | ||
| 1163 | |||
| 1164 | static u64 svm_get_mt_mask(struct kvm_vcpu *vcpu, gfn_t gfn, bool is_mmio) | ||
| 1165 | { | ||
| 1166 | u8 mtrr; | ||
| 1167 | |||
| 1168 | /* | ||
| 1169 | * 1. MMIO: trust guest MTRR, so same as item 3. | ||
| 1170 | * 2. No passthrough: always map as WB, and force guest PAT to WB as well | ||
| 1171 | * 3. Passthrough: can't guarantee the result, try to trust guest. | ||
| 1172 | */ | ||
| 1173 | if (!is_mmio && !kvm_arch_has_assigned_device(vcpu->kvm)) | ||
| 1174 | return 0; | ||
| 1175 | |||
| 1176 | mtrr = kvm_mtrr_get_guest_memory_type(vcpu, gfn); | ||
| 1177 | return mtrr2protval[mtrr]; | ||
| 1178 | } | ||
| 1179 | |||
| 1088 | static void init_vmcb(struct vcpu_svm *svm, bool init_event) | 1180 | static void init_vmcb(struct vcpu_svm *svm, bool init_event) |
| 1089 | { | 1181 | { |
| 1090 | struct vmcb_control_area *control = &svm->vmcb->control; | 1182 | struct vmcb_control_area *control = &svm->vmcb->control; |
| @@ -1180,6 +1272,7 @@ static void init_vmcb(struct vcpu_svm *svm, bool init_event) | |||
| 1180 | clr_cr_intercept(svm, INTERCEPT_CR3_READ); | 1272 | clr_cr_intercept(svm, INTERCEPT_CR3_READ); |
| 1181 | clr_cr_intercept(svm, INTERCEPT_CR3_WRITE); | 1273 | clr_cr_intercept(svm, INTERCEPT_CR3_WRITE); |
| 1182 | save->g_pat = svm->vcpu.arch.pat; | 1274 | save->g_pat = svm->vcpu.arch.pat; |
| 1275 | svm_set_guest_pat(svm, &save->g_pat); | ||
| 1183 | save->cr3 = 0; | 1276 | save->cr3 = 0; |
| 1184 | save->cr4 = 0; | 1277 | save->cr4 = 0; |
| 1185 | } | 1278 | } |
| @@ -3254,6 +3347,16 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr) | |||
| 3254 | case MSR_VM_IGNNE: | 3347 | case MSR_VM_IGNNE: |
| 3255 | vcpu_unimpl(vcpu, "unimplemented wrmsr: 0x%x data 0x%llx\n", ecx, data); | 3348 | vcpu_unimpl(vcpu, "unimplemented wrmsr: 0x%x data 0x%llx\n", ecx, data); |
| 3256 | break; | 3349 | break; |
| 3350 | case MSR_IA32_CR_PAT: | ||
| 3351 | if (npt_enabled) { | ||
| 3352 | if (!kvm_mtrr_valid(vcpu, MSR_IA32_CR_PAT, data)) | ||
| 3353 | return 1; | ||
| 3354 | vcpu->arch.pat = data; | ||
| 3355 | svm_set_guest_pat(svm, &svm->vmcb->save.g_pat); | ||
| 3356 | mark_dirty(svm->vmcb, VMCB_NPT); | ||
| 3357 | break; | ||
| 3358 | } | ||
| 3359 | /* fall through */ | ||
| 3257 | default: | 3360 | default: |
| 3258 | return kvm_set_msr_common(vcpu, msr); | 3361 | return kvm_set_msr_common(vcpu, msr); |
| 3259 | } | 3362 | } |
| @@ -4088,11 +4191,6 @@ static bool svm_has_high_real_mode_segbase(void) | |||
| 4088 | return true; | 4191 | return true; |
| 4089 | } | 4192 | } |
| 4090 | 4193 | ||
| 4091 | static u64 svm_get_mt_mask(struct kvm_vcpu *vcpu, gfn_t gfn, bool is_mmio) | ||
| 4092 | { | ||
| 4093 | return 0; | ||
| 4094 | } | ||
| 4095 | |||
| 4096 | static void svm_cpuid_update(struct kvm_vcpu *vcpu) | 4194 | static void svm_cpuid_update(struct kvm_vcpu *vcpu) |
| 4097 | { | 4195 | { |
| 4098 | } | 4196 | } |
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index e856dd566f4c..5b4e9384717a 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
| @@ -8632,22 +8632,17 @@ static u64 vmx_get_mt_mask(struct kvm_vcpu *vcpu, gfn_t gfn, bool is_mmio) | |||
| 8632 | u64 ipat = 0; | 8632 | u64 ipat = 0; |
| 8633 | 8633 | ||
| 8634 | /* For VT-d and EPT combination | 8634 | /* For VT-d and EPT combination |
| 8635 | * 1. MMIO: always map as UC | 8635 | * 1. MMIO: guest may want to apply WC, trust it. |
| 8636 | * 2. EPT with VT-d: | 8636 | * 2. EPT with VT-d: |
| 8637 | * a. VT-d without snooping control feature: can't guarantee the | 8637 | * a. VT-d without snooping control feature: can't guarantee the |
| 8638 | * result, try to trust guest. | 8638 | * result, try to trust guest. So the same as item 1. |
| 8639 | * b. VT-d with snooping control feature: snooping control feature of | 8639 | * b. VT-d with snooping control feature: snooping control feature of |
| 8640 | * VT-d engine can guarantee the cache correctness. Just set it | 8640 | * VT-d engine can guarantee the cache correctness. Just set it |
| 8641 | * to WB to keep consistent with host. So the same as item 3. | 8641 | * to WB to keep consistent with host. So the same as item 3. |
| 8642 | * 3. EPT without VT-d: always map as WB and set IPAT=1 to keep | 8642 | * 3. EPT without VT-d: always map as WB and set IPAT=1 to keep |
| 8643 | * consistent with host MTRR | 8643 | * consistent with host MTRR |
| 8644 | */ | 8644 | */ |
| 8645 | if (is_mmio) { | 8645 | if (!is_mmio && !kvm_arch_has_noncoherent_dma(vcpu->kvm)) { |
| 8646 | cache = MTRR_TYPE_UNCACHABLE; | ||
| 8647 | goto exit; | ||
| 8648 | } | ||
| 8649 | |||
| 8650 | if (!kvm_arch_has_noncoherent_dma(vcpu->kvm)) { | ||
| 8651 | ipat = VMX_EPT_IPAT_BIT; | 8646 | ipat = VMX_EPT_IPAT_BIT; |
| 8652 | cache = MTRR_TYPE_WRBACK; | 8647 | cache = MTRR_TYPE_WRBACK; |
| 8653 | goto exit; | 8648 | goto exit; |
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index bbaf44e8f0d3..5ef2560075bf 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
| @@ -3157,8 +3157,7 @@ static void load_xsave(struct kvm_vcpu *vcpu, u8 *src) | |||
| 3157 | cpuid_count(XSTATE_CPUID, index, | 3157 | cpuid_count(XSTATE_CPUID, index, |
| 3158 | &size, &offset, &ecx, &edx); | 3158 | &size, &offset, &ecx, &edx); |
| 3159 | memcpy(dest, src + offset, size); | 3159 | memcpy(dest, src + offset, size); |
| 3160 | } else | 3160 | } |
| 3161 | WARN_ON_ONCE(1); | ||
| 3162 | 3161 | ||
| 3163 | valid -= feature; | 3162 | valid -= feature; |
| 3164 | } | 3163 | } |
| @@ -7315,11 +7314,6 @@ struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm, | |||
| 7315 | 7314 | ||
| 7316 | vcpu = kvm_x86_ops->vcpu_create(kvm, id); | 7315 | vcpu = kvm_x86_ops->vcpu_create(kvm, id); |
| 7317 | 7316 | ||
| 7318 | /* | ||
| 7319 | * Activate fpu unconditionally in case the guest needs eager FPU. It will be | ||
| 7320 | * deactivated soon if it doesn't. | ||
| 7321 | */ | ||
| 7322 | kvm_x86_ops->fpu_activate(vcpu); | ||
| 7323 | return vcpu; | 7317 | return vcpu; |
| 7324 | } | 7318 | } |
| 7325 | 7319 | ||
| @@ -8218,6 +8212,24 @@ bool kvm_arch_can_inject_async_page_present(struct kvm_vcpu *vcpu) | |||
| 8218 | kvm_x86_ops->interrupt_allowed(vcpu); | 8212 | kvm_x86_ops->interrupt_allowed(vcpu); |
| 8219 | } | 8213 | } |
| 8220 | 8214 | ||
| 8215 | void kvm_arch_start_assignment(struct kvm *kvm) | ||
| 8216 | { | ||
| 8217 | atomic_inc(&kvm->arch.assigned_device_count); | ||
| 8218 | } | ||
| 8219 | EXPORT_SYMBOL_GPL(kvm_arch_start_assignment); | ||
| 8220 | |||
| 8221 | void kvm_arch_end_assignment(struct kvm *kvm) | ||
| 8222 | { | ||
| 8223 | atomic_dec(&kvm->arch.assigned_device_count); | ||
| 8224 | } | ||
| 8225 | EXPORT_SYMBOL_GPL(kvm_arch_end_assignment); | ||
| 8226 | |||
| 8227 | bool kvm_arch_has_assigned_device(struct kvm *kvm) | ||
| 8228 | { | ||
| 8229 | return atomic_read(&kvm->arch.assigned_device_count); | ||
| 8230 | } | ||
| 8231 | EXPORT_SYMBOL_GPL(kvm_arch_has_assigned_device); | ||
| 8232 | |||
| 8221 | void kvm_arch_register_noncoherent_dma(struct kvm *kvm) | 8233 | void kvm_arch_register_noncoherent_dma(struct kvm *kvm) |
| 8222 | { | 8234 | { |
| 8223 | atomic_inc(&kvm->arch.noncoherent_dma_count); | 8235 | atomic_inc(&kvm->arch.noncoherent_dma_count); |
diff --git a/arch/xtensa/include/asm/Kbuild b/arch/xtensa/include/asm/Kbuild index 14d15bf1a95b..5b478accd5fc 100644 --- a/arch/xtensa/include/asm/Kbuild +++ b/arch/xtensa/include/asm/Kbuild | |||
| @@ -19,6 +19,7 @@ generic-y += linkage.h | |||
| 19 | generic-y += local.h | 19 | generic-y += local.h |
| 20 | generic-y += local64.h | 20 | generic-y += local64.h |
| 21 | generic-y += mcs_spinlock.h | 21 | generic-y += mcs_spinlock.h |
| 22 | generic-y += mm-arch-hooks.h | ||
| 22 | generic-y += percpu.h | 23 | generic-y += percpu.h |
| 23 | generic-y += preempt.h | 24 | generic-y += preempt.h |
| 24 | generic-y += resource.h | 25 | generic-y += resource.h |
diff --git a/arch/xtensa/include/asm/mm-arch-hooks.h b/arch/xtensa/include/asm/mm-arch-hooks.h deleted file mode 100644 index d2e5cfd3dd02..000000000000 --- a/arch/xtensa/include/asm/mm-arch-hooks.h +++ /dev/null | |||
| @@ -1,15 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Architecture specific mm hooks | ||
| 3 | * | ||
| 4 | * Copyright (C) 2015, IBM Corporation | ||
| 5 | * Author: Laurent Dufour <ldufour@linux.vnet.ibm.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef _ASM_XTENSA_MM_ARCH_HOOKS_H | ||
| 13 | #define _ASM_XTENSA_MM_ARCH_HOOKS_H | ||
| 14 | |||
| 15 | #endif /* _ASM_XTENSA_MM_ARCH_HOOKS_H */ | ||
diff --git a/block/bio-integrity.c b/block/bio-integrity.c index 0436c21db7f2..719b7152aed1 100644 --- a/block/bio-integrity.c +++ b/block/bio-integrity.c | |||
| @@ -51,7 +51,7 @@ struct bio_integrity_payload *bio_integrity_alloc(struct bio *bio, | |||
| 51 | unsigned long idx = BIO_POOL_NONE; | 51 | unsigned long idx = BIO_POOL_NONE; |
| 52 | unsigned inline_vecs; | 52 | unsigned inline_vecs; |
| 53 | 53 | ||
| 54 | if (!bs) { | 54 | if (!bs || !bs->bio_integrity_pool) { |
| 55 | bip = kmalloc(sizeof(struct bio_integrity_payload) + | 55 | bip = kmalloc(sizeof(struct bio_integrity_payload) + |
| 56 | sizeof(struct bio_vec) * nr_vecs, gfp_mask); | 56 | sizeof(struct bio_vec) * nr_vecs, gfp_mask); |
| 57 | inline_vecs = nr_vecs; | 57 | inline_vecs = nr_vecs; |
| @@ -104,7 +104,7 @@ void bio_integrity_free(struct bio *bio) | |||
| 104 | kfree(page_address(bip->bip_vec->bv_page) + | 104 | kfree(page_address(bip->bip_vec->bv_page) + |
| 105 | bip->bip_vec->bv_offset); | 105 | bip->bip_vec->bv_offset); |
| 106 | 106 | ||
| 107 | if (bs) { | 107 | if (bs && bs->bio_integrity_pool) { |
| 108 | if (bip->bip_slab != BIO_POOL_NONE) | 108 | if (bip->bip_slab != BIO_POOL_NONE) |
| 109 | bvec_free(bs->bvec_integrity_pool, bip->bip_vec, | 109 | bvec_free(bs->bvec_integrity_pool, bip->bip_vec, |
| 110 | bip->bip_slab); | 110 | bip->bip_slab); |
diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c index 9f97da52d006..9da02c021ebe 100644 --- a/block/blk-cgroup.c +++ b/block/blk-cgroup.c | |||
| @@ -29,6 +29,14 @@ | |||
| 29 | 29 | ||
| 30 | #define MAX_KEY_LEN 100 | 30 | #define MAX_KEY_LEN 100 |
| 31 | 31 | ||
| 32 | /* | ||
| 33 | * blkcg_pol_mutex protects blkcg_policy[] and policy [de]activation. | ||
| 34 | * blkcg_pol_register_mutex nests outside of it and synchronizes entire | ||
| 35 | * policy [un]register operations including cgroup file additions / | ||
| 36 | * removals. Putting cgroup file registration outside blkcg_pol_mutex | ||
| 37 | * allows grabbing it from cgroup callbacks. | ||
| 38 | */ | ||
| 39 | static DEFINE_MUTEX(blkcg_pol_register_mutex); | ||
| 32 | static DEFINE_MUTEX(blkcg_pol_mutex); | 40 | static DEFINE_MUTEX(blkcg_pol_mutex); |
| 33 | 41 | ||
| 34 | struct blkcg blkcg_root; | 42 | struct blkcg blkcg_root; |
| @@ -38,6 +46,8 @@ struct cgroup_subsys_state * const blkcg_root_css = &blkcg_root.css; | |||
| 38 | 46 | ||
| 39 | static struct blkcg_policy *blkcg_policy[BLKCG_MAX_POLS]; | 47 | static struct blkcg_policy *blkcg_policy[BLKCG_MAX_POLS]; |
| 40 | 48 | ||
| 49 | static LIST_HEAD(all_blkcgs); /* protected by blkcg_pol_mutex */ | ||
| 50 | |||
| 41 | static bool blkcg_policy_enabled(struct request_queue *q, | 51 | static bool blkcg_policy_enabled(struct request_queue *q, |
| 42 | const struct blkcg_policy *pol) | 52 | const struct blkcg_policy *pol) |
| 43 | { | 53 | { |
| @@ -453,20 +463,7 @@ static int blkcg_reset_stats(struct cgroup_subsys_state *css, | |||
| 453 | struct blkcg_gq *blkg; | 463 | struct blkcg_gq *blkg; |
| 454 | int i; | 464 | int i; |
| 455 | 465 | ||
| 456 | /* | 466 | mutex_lock(&blkcg_pol_mutex); |
| 457 | * XXX: We invoke cgroup_add/rm_cftypes() under blkcg_pol_mutex | ||
| 458 | * which ends up putting cgroup's internal cgroup_tree_mutex under | ||
| 459 | * it; however, cgroup_tree_mutex is nested above cgroup file | ||
| 460 | * active protection and grabbing blkcg_pol_mutex from a cgroup | ||
| 461 | * file operation creates a possible circular dependency. cgroup | ||
| 462 | * internal locking is planned to go through further simplification | ||
| 463 | * and this issue should go away soon. For now, let's trylock | ||
| 464 | * blkcg_pol_mutex and restart the write on failure. | ||
| 465 | * | ||
| 466 | * http://lkml.kernel.org/g/5363C04B.4010400@oracle.com | ||
| 467 | */ | ||
| 468 | if (!mutex_trylock(&blkcg_pol_mutex)) | ||
| 469 | return restart_syscall(); | ||
| 470 | spin_lock_irq(&blkcg->lock); | 467 | spin_lock_irq(&blkcg->lock); |
| 471 | 468 | ||
| 472 | /* | 469 | /* |
| @@ -822,8 +819,17 @@ static void blkcg_css_free(struct cgroup_subsys_state *css) | |||
| 822 | { | 819 | { |
| 823 | struct blkcg *blkcg = css_to_blkcg(css); | 820 | struct blkcg *blkcg = css_to_blkcg(css); |
| 824 | 821 | ||
| 825 | if (blkcg != &blkcg_root) | 822 | mutex_lock(&blkcg_pol_mutex); |
| 823 | list_del(&blkcg->all_blkcgs_node); | ||
| 824 | mutex_unlock(&blkcg_pol_mutex); | ||
| 825 | |||
| 826 | if (blkcg != &blkcg_root) { | ||
| 827 | int i; | ||
| 828 | |||
| 829 | for (i = 0; i < BLKCG_MAX_POLS; i++) | ||
| 830 | kfree(blkcg->pd[i]); | ||
| 826 | kfree(blkcg); | 831 | kfree(blkcg); |
| 832 | } | ||
| 827 | } | 833 | } |
| 828 | 834 | ||
| 829 | static struct cgroup_subsys_state * | 835 | static struct cgroup_subsys_state * |
| @@ -833,6 +839,8 @@ blkcg_css_alloc(struct cgroup_subsys_state *parent_css) | |||
| 833 | struct cgroup_subsys_state *ret; | 839 | struct cgroup_subsys_state *ret; |
| 834 | int i; | 840 | int i; |
| 835 | 841 | ||
| 842 | mutex_lock(&blkcg_pol_mutex); | ||
| 843 | |||
| 836 | if (!parent_css) { | 844 | if (!parent_css) { |
| 837 | blkcg = &blkcg_root; | 845 | blkcg = &blkcg_root; |
| 838 | goto done; | 846 | goto done; |
| @@ -875,14 +883,17 @@ done: | |||
| 875 | #ifdef CONFIG_CGROUP_WRITEBACK | 883 | #ifdef CONFIG_CGROUP_WRITEBACK |
| 876 | INIT_LIST_HEAD(&blkcg->cgwb_list); | 884 | INIT_LIST_HEAD(&blkcg->cgwb_list); |
| 877 | #endif | 885 | #endif |
| 886 | list_add_tail(&blkcg->all_blkcgs_node, &all_blkcgs); | ||
| 887 | |||
| 888 | mutex_unlock(&blkcg_pol_mutex); | ||
| 878 | return &blkcg->css; | 889 | return &blkcg->css; |
| 879 | 890 | ||
| 880 | free_pd_blkcg: | 891 | free_pd_blkcg: |
| 881 | for (i--; i >= 0; i--) | 892 | for (i--; i >= 0; i--) |
| 882 | kfree(blkcg->pd[i]); | 893 | kfree(blkcg->pd[i]); |
| 883 | |||
| 884 | free_blkcg: | 894 | free_blkcg: |
| 885 | kfree(blkcg); | 895 | kfree(blkcg); |
| 896 | mutex_unlock(&blkcg_pol_mutex); | ||
| 886 | return ret; | 897 | return ret; |
| 887 | } | 898 | } |
| 888 | 899 | ||
| @@ -1037,10 +1048,8 @@ int blkcg_activate_policy(struct request_queue *q, | |||
| 1037 | const struct blkcg_policy *pol) | 1048 | const struct blkcg_policy *pol) |
| 1038 | { | 1049 | { |
| 1039 | LIST_HEAD(pds); | 1050 | LIST_HEAD(pds); |
| 1040 | LIST_HEAD(cpds); | ||
| 1041 | struct blkcg_gq *blkg; | 1051 | struct blkcg_gq *blkg; |
| 1042 | struct blkg_policy_data *pd, *nd; | 1052 | struct blkg_policy_data *pd, *nd; |
| 1043 | struct blkcg_policy_data *cpd, *cnd; | ||
| 1044 | int cnt = 0, ret; | 1053 | int cnt = 0, ret; |
| 1045 | 1054 | ||
| 1046 | if (blkcg_policy_enabled(q, pol)) | 1055 | if (blkcg_policy_enabled(q, pol)) |
| @@ -1053,10 +1062,7 @@ int blkcg_activate_policy(struct request_queue *q, | |||
| 1053 | cnt++; | 1062 | cnt++; |
| 1054 | spin_unlock_irq(q->queue_lock); | 1063 | spin_unlock_irq(q->queue_lock); |
| 1055 | 1064 | ||
| 1056 | /* | 1065 | /* allocate per-blkg policy data for all existing blkgs */ |
| 1057 | * Allocate per-blkg and per-blkcg policy data | ||
| 1058 | * for all existing blkgs. | ||
| 1059 | */ | ||
| 1060 | while (cnt--) { | 1066 | while (cnt--) { |
| 1061 | pd = kzalloc_node(pol->pd_size, GFP_KERNEL, q->node); | 1067 | pd = kzalloc_node(pol->pd_size, GFP_KERNEL, q->node); |
| 1062 | if (!pd) { | 1068 | if (!pd) { |
| @@ -1064,15 +1070,6 @@ int blkcg_activate_policy(struct request_queue *q, | |||
| 1064 | goto out_free; | 1070 | goto out_free; |
| 1065 | } | 1071 | } |
| 1066 | list_add_tail(&pd->alloc_node, &pds); | 1072 | list_add_tail(&pd->alloc_node, &pds); |
| 1067 | |||
| 1068 | if (!pol->cpd_size) | ||
| 1069 | continue; | ||
| 1070 | cpd = kzalloc_node(pol->cpd_size, GFP_KERNEL, q->node); | ||
| 1071 | if (!cpd) { | ||
| 1072 | ret = -ENOMEM; | ||
| 1073 | goto out_free; | ||
| 1074 | } | ||
| 1075 | list_add_tail(&cpd->alloc_node, &cpds); | ||
| 1076 | } | 1073 | } |
| 1077 | 1074 | ||
| 1078 | /* | 1075 | /* |
| @@ -1082,32 +1079,17 @@ int blkcg_activate_policy(struct request_queue *q, | |||
| 1082 | spin_lock_irq(q->queue_lock); | 1079 | spin_lock_irq(q->queue_lock); |
| 1083 | 1080 | ||
| 1084 | list_for_each_entry(blkg, &q->blkg_list, q_node) { | 1081 | list_for_each_entry(blkg, &q->blkg_list, q_node) { |
| 1085 | if (WARN_ON(list_empty(&pds)) || | 1082 | if (WARN_ON(list_empty(&pds))) { |
| 1086 | WARN_ON(pol->cpd_size && list_empty(&cpds))) { | ||
| 1087 | /* umm... this shouldn't happen, just abort */ | 1083 | /* umm... this shouldn't happen, just abort */ |
| 1088 | ret = -ENOMEM; | 1084 | ret = -ENOMEM; |
| 1089 | goto out_unlock; | 1085 | goto out_unlock; |
| 1090 | } | 1086 | } |
| 1091 | cpd = list_first_entry(&cpds, struct blkcg_policy_data, | ||
| 1092 | alloc_node); | ||
| 1093 | list_del_init(&cpd->alloc_node); | ||
| 1094 | pd = list_first_entry(&pds, struct blkg_policy_data, alloc_node); | 1087 | pd = list_first_entry(&pds, struct blkg_policy_data, alloc_node); |
| 1095 | list_del_init(&pd->alloc_node); | 1088 | list_del_init(&pd->alloc_node); |
| 1096 | 1089 | ||
| 1097 | /* grab blkcg lock too while installing @pd on @blkg */ | 1090 | /* grab blkcg lock too while installing @pd on @blkg */ |
| 1098 | spin_lock(&blkg->blkcg->lock); | 1091 | spin_lock(&blkg->blkcg->lock); |
| 1099 | 1092 | ||
| 1100 | if (!pol->cpd_size) | ||
| 1101 | goto no_cpd; | ||
| 1102 | if (!blkg->blkcg->pd[pol->plid]) { | ||
| 1103 | /* Per-policy per-blkcg data */ | ||
| 1104 | blkg->blkcg->pd[pol->plid] = cpd; | ||
| 1105 | cpd->plid = pol->plid; | ||
| 1106 | pol->cpd_init_fn(blkg->blkcg); | ||
| 1107 | } else { /* must free it as it has already been extracted */ | ||
| 1108 | kfree(cpd); | ||
| 1109 | } | ||
| 1110 | no_cpd: | ||
| 1111 | blkg->pd[pol->plid] = pd; | 1093 | blkg->pd[pol->plid] = pd; |
| 1112 | pd->blkg = blkg; | 1094 | pd->blkg = blkg; |
| 1113 | pd->plid = pol->plid; | 1095 | pd->plid = pol->plid; |
| @@ -1124,8 +1106,6 @@ out_free: | |||
| 1124 | blk_queue_bypass_end(q); | 1106 | blk_queue_bypass_end(q); |
| 1125 | list_for_each_entry_safe(pd, nd, &pds, alloc_node) | 1107 | list_for_each_entry_safe(pd, nd, &pds, alloc_node) |
| 1126 | kfree(pd); | 1108 | kfree(pd); |
| 1127 | list_for_each_entry_safe(cpd, cnd, &cpds, alloc_node) | ||
| 1128 | kfree(cpd); | ||
| 1129 | return ret; | 1109 | return ret; |
| 1130 | } | 1110 | } |
| 1131 | EXPORT_SYMBOL_GPL(blkcg_activate_policy); | 1111 | EXPORT_SYMBOL_GPL(blkcg_activate_policy); |
| @@ -1162,8 +1142,6 @@ void blkcg_deactivate_policy(struct request_queue *q, | |||
| 1162 | 1142 | ||
| 1163 | kfree(blkg->pd[pol->plid]); | 1143 | kfree(blkg->pd[pol->plid]); |
| 1164 | blkg->pd[pol->plid] = NULL; | 1144 | blkg->pd[pol->plid] = NULL; |
| 1165 | kfree(blkg->blkcg->pd[pol->plid]); | ||
| 1166 | blkg->blkcg->pd[pol->plid] = NULL; | ||
| 1167 | 1145 | ||
| 1168 | spin_unlock(&blkg->blkcg->lock); | 1146 | spin_unlock(&blkg->blkcg->lock); |
| 1169 | } | 1147 | } |
| @@ -1182,11 +1160,13 @@ EXPORT_SYMBOL_GPL(blkcg_deactivate_policy); | |||
| 1182 | */ | 1160 | */ |
| 1183 | int blkcg_policy_register(struct blkcg_policy *pol) | 1161 | int blkcg_policy_register(struct blkcg_policy *pol) |
| 1184 | { | 1162 | { |
| 1163 | struct blkcg *blkcg; | ||
| 1185 | int i, ret; | 1164 | int i, ret; |
| 1186 | 1165 | ||
| 1187 | if (WARN_ON(pol->pd_size < sizeof(struct blkg_policy_data))) | 1166 | if (WARN_ON(pol->pd_size < sizeof(struct blkg_policy_data))) |
| 1188 | return -EINVAL; | 1167 | return -EINVAL; |
| 1189 | 1168 | ||
| 1169 | mutex_lock(&blkcg_pol_register_mutex); | ||
| 1190 | mutex_lock(&blkcg_pol_mutex); | 1170 | mutex_lock(&blkcg_pol_mutex); |
| 1191 | 1171 | ||
| 1192 | /* find an empty slot */ | 1172 | /* find an empty slot */ |
| @@ -1195,19 +1175,49 @@ int blkcg_policy_register(struct blkcg_policy *pol) | |||
| 1195 | if (!blkcg_policy[i]) | 1175 | if (!blkcg_policy[i]) |
| 1196 | break; | 1176 | break; |
| 1197 | if (i >= BLKCG_MAX_POLS) | 1177 | if (i >= BLKCG_MAX_POLS) |
| 1198 | goto out_unlock; | 1178 | goto err_unlock; |
| 1199 | 1179 | ||
| 1200 | /* register and update blkgs */ | 1180 | /* register @pol */ |
| 1201 | pol->plid = i; | 1181 | pol->plid = i; |
| 1202 | blkcg_policy[i] = pol; | 1182 | blkcg_policy[pol->plid] = pol; |
| 1183 | |||
| 1184 | /* allocate and install cpd's */ | ||
| 1185 | if (pol->cpd_size) { | ||
| 1186 | list_for_each_entry(blkcg, &all_blkcgs, all_blkcgs_node) { | ||
| 1187 | struct blkcg_policy_data *cpd; | ||
| 1188 | |||
| 1189 | cpd = kzalloc(pol->cpd_size, GFP_KERNEL); | ||
| 1190 | if (!cpd) { | ||
| 1191 | mutex_unlock(&blkcg_pol_mutex); | ||
| 1192 | goto err_free_cpds; | ||
| 1193 | } | ||
| 1194 | |||
| 1195 | blkcg->pd[pol->plid] = cpd; | ||
| 1196 | cpd->plid = pol->plid; | ||
| 1197 | pol->cpd_init_fn(blkcg); | ||
| 1198 | } | ||
| 1199 | } | ||
| 1200 | |||
| 1201 | mutex_unlock(&blkcg_pol_mutex); | ||
| 1203 | 1202 | ||
| 1204 | /* everything is in place, add intf files for the new policy */ | 1203 | /* everything is in place, add intf files for the new policy */ |
| 1205 | if (pol->cftypes) | 1204 | if (pol->cftypes) |
| 1206 | WARN_ON(cgroup_add_legacy_cftypes(&blkio_cgrp_subsys, | 1205 | WARN_ON(cgroup_add_legacy_cftypes(&blkio_cgrp_subsys, |
| 1207 | pol->cftypes)); | 1206 | pol->cftypes)); |
| 1208 | ret = 0; | 1207 | mutex_unlock(&blkcg_pol_register_mutex); |
| 1209 | out_unlock: | 1208 | return 0; |
| 1209 | |||
| 1210 | err_free_cpds: | ||
| 1211 | if (pol->cpd_size) { | ||
| 1212 | list_for_each_entry(blkcg, &all_blkcgs, all_blkcgs_node) { | ||
| 1213 | kfree(blkcg->pd[pol->plid]); | ||
| 1214 | blkcg->pd[pol->plid] = NULL; | ||
| 1215 | } | ||
| 1216 | } | ||
| 1217 | blkcg_policy[pol->plid] = NULL; | ||
| 1218 | err_unlock: | ||
| 1210 | mutex_unlock(&blkcg_pol_mutex); | 1219 | mutex_unlock(&blkcg_pol_mutex); |
| 1220 | mutex_unlock(&blkcg_pol_register_mutex); | ||
| 1211 | return ret; | 1221 | return ret; |
| 1212 | } | 1222 | } |
| 1213 | EXPORT_SYMBOL_GPL(blkcg_policy_register); | 1223 | EXPORT_SYMBOL_GPL(blkcg_policy_register); |
| @@ -1220,7 +1230,9 @@ EXPORT_SYMBOL_GPL(blkcg_policy_register); | |||
| 1220 | */ | 1230 | */ |
| 1221 | void blkcg_policy_unregister(struct blkcg_policy *pol) | 1231 | void blkcg_policy_unregister(struct blkcg_policy *pol) |
| 1222 | { | 1232 | { |
| 1223 | mutex_lock(&blkcg_pol_mutex); | 1233 | struct blkcg *blkcg; |
| 1234 | |||
| 1235 | mutex_lock(&blkcg_pol_register_mutex); | ||
| 1224 | 1236 | ||
| 1225 | if (WARN_ON(blkcg_policy[pol->plid] != pol)) | 1237 | if (WARN_ON(blkcg_policy[pol->plid] != pol)) |
| 1226 | goto out_unlock; | 1238 | goto out_unlock; |
| @@ -1229,9 +1241,19 @@ void blkcg_policy_unregister(struct blkcg_policy *pol) | |||
| 1229 | if (pol->cftypes) | 1241 | if (pol->cftypes) |
| 1230 | cgroup_rm_cftypes(pol->cftypes); | 1242 | cgroup_rm_cftypes(pol->cftypes); |
| 1231 | 1243 | ||
| 1232 | /* unregister and update blkgs */ | 1244 | /* remove cpds and unregister */ |
| 1245 | mutex_lock(&blkcg_pol_mutex); | ||
| 1246 | |||
| 1247 | if (pol->cpd_size) { | ||
| 1248 | list_for_each_entry(blkcg, &all_blkcgs, all_blkcgs_node) { | ||
| 1249 | kfree(blkcg->pd[pol->plid]); | ||
| 1250 | blkcg->pd[pol->plid] = NULL; | ||
| 1251 | } | ||
| 1252 | } | ||
| 1233 | blkcg_policy[pol->plid] = NULL; | 1253 | blkcg_policy[pol->plid] = NULL; |
| 1234 | out_unlock: | 1254 | |
| 1235 | mutex_unlock(&blkcg_pol_mutex); | 1255 | mutex_unlock(&blkcg_pol_mutex); |
| 1256 | out_unlock: | ||
| 1257 | mutex_unlock(&blkcg_pol_register_mutex); | ||
| 1236 | } | 1258 | } |
| 1237 | EXPORT_SYMBOL_GPL(blkcg_policy_unregister); | 1259 | EXPORT_SYMBOL_GPL(blkcg_policy_unregister); |
diff --git a/block/blk-core.c b/block/blk-core.c index 82819e68f58b..627ed0c593fb 100644 --- a/block/blk-core.c +++ b/block/blk-core.c | |||
| @@ -3370,7 +3370,7 @@ EXPORT_SYMBOL(blk_post_runtime_resume); | |||
| 3370 | int __init blk_dev_init(void) | 3370 | int __init blk_dev_init(void) |
| 3371 | { | 3371 | { |
| 3372 | BUILD_BUG_ON(__REQ_NR_BITS > 8 * | 3372 | BUILD_BUG_ON(__REQ_NR_BITS > 8 * |
| 3373 | sizeof(((struct request *)0)->cmd_flags)); | 3373 | FIELD_SIZEOF(struct request, cmd_flags)); |
| 3374 | 3374 | ||
| 3375 | /* used for unplugging and affects IO latency/throughput - HIGHPRI */ | 3375 | /* used for unplugging and affects IO latency/throughput - HIGHPRI */ |
| 3376 | kblockd_workqueue = alloc_workqueue("kblockd", | 3376 | kblockd_workqueue = alloc_workqueue("kblockd", |
diff --git a/block/blk-mq.c b/block/blk-mq.c index f53779692c77..7d842db59699 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c | |||
| @@ -1998,7 +1998,7 @@ struct request_queue *blk_mq_init_allocated_queue(struct blk_mq_tag_set *set, | |||
| 1998 | goto err_hctxs; | 1998 | goto err_hctxs; |
| 1999 | 1999 | ||
| 2000 | setup_timer(&q->timeout, blk_mq_rq_timer, (unsigned long) q); | 2000 | setup_timer(&q->timeout, blk_mq_rq_timer, (unsigned long) q); |
| 2001 | blk_queue_rq_timeout(q, set->timeout ? set->timeout : 30000); | 2001 | blk_queue_rq_timeout(q, set->timeout ? set->timeout : 30 * HZ); |
| 2002 | 2002 | ||
| 2003 | q->nr_queues = nr_cpu_ids; | 2003 | q->nr_queues = nr_cpu_ids; |
| 2004 | q->nr_hw_queues = set->nr_hw_queues; | 2004 | q->nr_hw_queues = set->nr_hw_queues; |
diff --git a/drivers/acpi/resource.c b/drivers/acpi/resource.c index 8244f013f210..f1c966e05078 100644 --- a/drivers/acpi/resource.c +++ b/drivers/acpi/resource.c | |||
| @@ -193,6 +193,7 @@ static bool acpi_decode_space(struct resource_win *win, | |||
| 193 | u8 iodec = attr->granularity == 0xfff ? ACPI_DECODE_10 : ACPI_DECODE_16; | 193 | u8 iodec = attr->granularity == 0xfff ? ACPI_DECODE_10 : ACPI_DECODE_16; |
| 194 | bool wp = addr->info.mem.write_protect; | 194 | bool wp = addr->info.mem.write_protect; |
| 195 | u64 len = attr->address_length; | 195 | u64 len = attr->address_length; |
| 196 | u64 start, end, offset = 0; | ||
| 196 | struct resource *res = &win->res; | 197 | struct resource *res = &win->res; |
| 197 | 198 | ||
| 198 | /* | 199 | /* |
| @@ -204,9 +205,6 @@ static bool acpi_decode_space(struct resource_win *win, | |||
| 204 | pr_debug("ACPI: Invalid address space min_addr_fix %d, max_addr_fix %d, len %llx\n", | 205 | pr_debug("ACPI: Invalid address space min_addr_fix %d, max_addr_fix %d, len %llx\n", |
| 205 | addr->min_address_fixed, addr->max_address_fixed, len); | 206 | addr->min_address_fixed, addr->max_address_fixed, len); |
| 206 | 207 | ||
| 207 | res->start = attr->minimum; | ||
| 208 | res->end = attr->maximum; | ||
| 209 | |||
| 210 | /* | 208 | /* |
| 211 | * For bridges that translate addresses across the bridge, | 209 | * For bridges that translate addresses across the bridge, |
| 212 | * translation_offset is the offset that must be added to the | 210 | * translation_offset is the offset that must be added to the |
| @@ -214,12 +212,22 @@ static bool acpi_decode_space(struct resource_win *win, | |||
| 214 | * primary side. Non-bridge devices must list 0 for all Address | 212 | * primary side. Non-bridge devices must list 0 for all Address |
| 215 | * Translation offset bits. | 213 | * Translation offset bits. |
| 216 | */ | 214 | */ |
| 217 | if (addr->producer_consumer == ACPI_PRODUCER) { | 215 | if (addr->producer_consumer == ACPI_PRODUCER) |
| 218 | res->start += attr->translation_offset; | 216 | offset = attr->translation_offset; |
| 219 | res->end += attr->translation_offset; | 217 | else if (attr->translation_offset) |
| 220 | } else if (attr->translation_offset) { | ||
| 221 | pr_debug("ACPI: translation_offset(%lld) is invalid for non-bridge device.\n", | 218 | pr_debug("ACPI: translation_offset(%lld) is invalid for non-bridge device.\n", |
| 222 | attr->translation_offset); | 219 | attr->translation_offset); |
| 220 | start = attr->minimum + offset; | ||
| 221 | end = attr->maximum + offset; | ||
| 222 | |||
| 223 | win->offset = offset; | ||
| 224 | res->start = start; | ||
| 225 | res->end = end; | ||
| 226 | if (sizeof(resource_size_t) < sizeof(u64) && | ||
| 227 | (offset != win->offset || start != res->start || end != res->end)) { | ||
| 228 | pr_warn("acpi resource window ([%#llx-%#llx] ignored, not CPU addressable)\n", | ||
| 229 | attr->minimum, attr->maximum); | ||
| 230 | return false; | ||
| 223 | } | 231 | } |
| 224 | 232 | ||
| 225 | switch (addr->resource_type) { | 233 | switch (addr->resource_type) { |
| @@ -236,8 +244,6 @@ static bool acpi_decode_space(struct resource_win *win, | |||
| 236 | return false; | 244 | return false; |
| 237 | } | 245 | } |
| 238 | 246 | ||
| 239 | win->offset = attr->translation_offset; | ||
| 240 | |||
| 241 | if (addr->producer_consumer == ACPI_PRODUCER) | 247 | if (addr->producer_consumer == ACPI_PRODUCER) |
| 242 | res->flags |= IORESOURCE_WINDOW; | 248 | res->flags |= IORESOURCE_WINDOW; |
| 243 | 249 | ||
diff --git a/drivers/ata/pata_arasan_cf.c b/drivers/ata/pata_arasan_cf.c index a9b0c820f2eb..5d9ee99c2148 100644 --- a/drivers/ata/pata_arasan_cf.c +++ b/drivers/ata/pata_arasan_cf.c | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * Arasan Compact Flash host controller source file | 4 | * Arasan Compact Flash host controller source file |
| 5 | * | 5 | * |
| 6 | * Copyright (C) 2011 ST Microelectronics | 6 | * Copyright (C) 2011 ST Microelectronics |
| 7 | * Viresh Kumar <viresh.linux@gmail.com> | 7 | * Viresh Kumar <vireshk@kernel.org> |
| 8 | * | 8 | * |
| 9 | * This file is licensed under the terms of the GNU General Public | 9 | * This file is licensed under the terms of the GNU General Public |
| 10 | * License version 2. This program is licensed "as is" without any | 10 | * License version 2. This program is licensed "as is" without any |
| @@ -968,7 +968,7 @@ static struct platform_driver arasan_cf_driver = { | |||
| 968 | 968 | ||
| 969 | module_platform_driver(arasan_cf_driver); | 969 | module_platform_driver(arasan_cf_driver); |
| 970 | 970 | ||
| 971 | MODULE_AUTHOR("Viresh Kumar <viresh.linux@gmail.com>"); | 971 | MODULE_AUTHOR("Viresh Kumar <vireshk@kernel.org>"); |
| 972 | MODULE_DESCRIPTION("Arasan ATA Compact Flash driver"); | 972 | MODULE_DESCRIPTION("Arasan ATA Compact Flash driver"); |
| 973 | MODULE_LICENSE("GPL"); | 973 | MODULE_LICENSE("GPL"); |
| 974 | MODULE_ALIAS("platform:" DRIVER_NAME); | 974 | MODULE_ALIAS("platform:" DRIVER_NAME); |
diff --git a/drivers/block/nvme-core.c b/drivers/block/nvme-core.c index d1d6141920d3..7920c2741b47 100644 --- a/drivers/block/nvme-core.c +++ b/drivers/block/nvme-core.c | |||
| @@ -2108,8 +2108,17 @@ static void nvme_alloc_ns(struct nvme_dev *dev, unsigned nsid) | |||
| 2108 | goto out_free_disk; | 2108 | goto out_free_disk; |
| 2109 | 2109 | ||
| 2110 | add_disk(ns->disk); | 2110 | add_disk(ns->disk); |
| 2111 | if (ns->ms) | 2111 | if (ns->ms) { |
| 2112 | revalidate_disk(ns->disk); | 2112 | struct block_device *bd = bdget_disk(ns->disk, 0); |
| 2113 | if (!bd) | ||
| 2114 | return; | ||
| 2115 | if (blkdev_get(bd, FMODE_READ, NULL)) { | ||
| 2116 | bdput(bd); | ||
| 2117 | return; | ||
| 2118 | } | ||
| 2119 | blkdev_reread_part(bd); | ||
| 2120 | blkdev_put(bd, FMODE_READ); | ||
| 2121 | } | ||
| 2113 | return; | 2122 | return; |
| 2114 | out_free_disk: | 2123 | out_free_disk: |
| 2115 | kfree(disk); | 2124 | kfree(disk); |
diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c index 283f00a7f036..1082d4bb016a 100644 --- a/drivers/char/tpm/tpm-chip.c +++ b/drivers/char/tpm/tpm-chip.c | |||
| @@ -129,8 +129,9 @@ struct tpm_chip *tpmm_chip_alloc(struct device *dev, | |||
| 129 | 129 | ||
| 130 | device_initialize(&chip->dev); | 130 | device_initialize(&chip->dev); |
| 131 | 131 | ||
| 132 | chip->cdev.owner = chip->pdev->driver->owner; | ||
| 133 | cdev_init(&chip->cdev, &tpm_fops); | 132 | cdev_init(&chip->cdev, &tpm_fops); |
| 133 | chip->cdev.owner = chip->pdev->driver->owner; | ||
| 134 | chip->cdev.kobj.parent = &chip->dev.kobj; | ||
| 134 | 135 | ||
| 135 | return chip; | 136 | return chip; |
| 136 | } | 137 | } |
diff --git a/drivers/char/tpm/tpm_crb.c b/drivers/char/tpm/tpm_crb.c index 44f9d20c19ac..1267322595da 100644 --- a/drivers/char/tpm/tpm_crb.c +++ b/drivers/char/tpm/tpm_crb.c | |||
| @@ -233,6 +233,14 @@ static int crb_acpi_add(struct acpi_device *device) | |||
| 233 | return -ENODEV; | 233 | return -ENODEV; |
| 234 | } | 234 | } |
| 235 | 235 | ||
| 236 | /* At least some versions of AMI BIOS have a bug that TPM2 table has | ||
| 237 | * zero address for the control area and therefore we must fail. | ||
| 238 | */ | ||
| 239 | if (!buf->control_area_pa) { | ||
| 240 | dev_err(dev, "TPM2 ACPI table has a zero address for the control area\n"); | ||
| 241 | return -EINVAL; | ||
| 242 | } | ||
| 243 | |||
| 236 | if (buf->hdr.length < sizeof(struct acpi_tpm2)) { | 244 | if (buf->hdr.length < sizeof(struct acpi_tpm2)) { |
| 237 | dev_err(dev, "TPM2 ACPI table has wrong size"); | 245 | dev_err(dev, "TPM2 ACPI table has wrong size"); |
| 238 | return -EINVAL; | 246 | return -EINVAL; |
diff --git a/drivers/clk/spear/clk-aux-synth.c b/drivers/clk/spear/clk-aux-synth.c index bdfb4421c643..f271c350ef94 100644 --- a/drivers/clk/spear/clk-aux-synth.c +++ b/drivers/clk/spear/clk-aux-synth.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (C) 2012 ST Microelectronics | 2 | * Copyright (C) 2012 ST Microelectronics |
| 3 | * Viresh Kumar <viresh.linux@gmail.com> | 3 | * Viresh Kumar <vireshk@kernel.org> |
| 4 | * | 4 | * |
| 5 | * This file is licensed under the terms of the GNU General Public | 5 | * This file is licensed under the terms of the GNU General Public |
| 6 | * License version 2. This program is licensed "as is" without any | 6 | * License version 2. This program is licensed "as is" without any |
diff --git a/drivers/clk/spear/clk-frac-synth.c b/drivers/clk/spear/clk-frac-synth.c index dffd4ce6c8b5..58d678b5b40a 100644 --- a/drivers/clk/spear/clk-frac-synth.c +++ b/drivers/clk/spear/clk-frac-synth.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (C) 2012 ST Microelectronics | 2 | * Copyright (C) 2012 ST Microelectronics |
| 3 | * Viresh Kumar <viresh.linux@gmail.com> | 3 | * Viresh Kumar <vireshk@kernel.org> |
| 4 | * | 4 | * |
| 5 | * This file is licensed under the terms of the GNU General Public | 5 | * This file is licensed under the terms of the GNU General Public |
| 6 | * License version 2. This program is licensed "as is" without any | 6 | * License version 2. This program is licensed "as is" without any |
diff --git a/drivers/clk/spear/clk-gpt-synth.c b/drivers/clk/spear/clk-gpt-synth.c index 1afc18c4effc..1a722e99e76e 100644 --- a/drivers/clk/spear/clk-gpt-synth.c +++ b/drivers/clk/spear/clk-gpt-synth.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (C) 2012 ST Microelectronics | 2 | * Copyright (C) 2012 ST Microelectronics |
| 3 | * Viresh Kumar <viresh.linux@gmail.com> | 3 | * Viresh Kumar <vireshk@kernel.org> |
| 4 | * | 4 | * |
| 5 | * This file is licensed under the terms of the GNU General Public | 5 | * This file is licensed under the terms of the GNU General Public |
| 6 | * License version 2. This program is licensed "as is" without any | 6 | * License version 2. This program is licensed "as is" without any |
diff --git a/drivers/clk/spear/clk-vco-pll.c b/drivers/clk/spear/clk-vco-pll.c index 1b9b65bca51e..5ebddc528145 100644 --- a/drivers/clk/spear/clk-vco-pll.c +++ b/drivers/clk/spear/clk-vco-pll.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (C) 2012 ST Microelectronics | 2 | * Copyright (C) 2012 ST Microelectronics |
| 3 | * Viresh Kumar <viresh.linux@gmail.com> | 3 | * Viresh Kumar <vireshk@kernel.org> |
| 4 | * | 4 | * |
| 5 | * This file is licensed under the terms of the GNU General Public | 5 | * This file is licensed under the terms of the GNU General Public |
| 6 | * License version 2. This program is licensed "as is" without any | 6 | * License version 2. This program is licensed "as is" without any |
diff --git a/drivers/clk/spear/clk.c b/drivers/clk/spear/clk.c index 628b6d5ed3d9..157fe099ea6a 100644 --- a/drivers/clk/spear/clk.c +++ b/drivers/clk/spear/clk.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (C) 2012 ST Microelectronics | 2 | * Copyright (C) 2012 ST Microelectronics |
| 3 | * Viresh Kumar <viresh.linux@gmail.com> | 3 | * Viresh Kumar <vireshk@kernel.org> |
| 4 | * | 4 | * |
| 5 | * This file is licensed under the terms of the GNU General Public | 5 | * This file is licensed under the terms of the GNU General Public |
| 6 | * License version 2. This program is licensed "as is" without any | 6 | * License version 2. This program is licensed "as is" without any |
diff --git a/drivers/clk/spear/clk.h b/drivers/clk/spear/clk.h index 931737677dfa..9834944f08b1 100644 --- a/drivers/clk/spear/clk.h +++ b/drivers/clk/spear/clk.h | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * Clock framework definitions for SPEAr platform | 2 | * Clock framework definitions for SPEAr platform |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2012 ST Microelectronics | 4 | * Copyright (C) 2012 ST Microelectronics |
| 5 | * Viresh Kumar <viresh.linux@gmail.com> | 5 | * Viresh Kumar <vireshk@kernel.org> |
| 6 | * | 6 | * |
| 7 | * This file is licensed under the terms of the GNU General Public | 7 | * This file is licensed under the terms of the GNU General Public |
| 8 | * License version 2. This program is licensed "as is" without any | 8 | * License version 2. This program is licensed "as is" without any |
diff --git a/drivers/clk/spear/spear1310_clock.c b/drivers/clk/spear/spear1310_clock.c index 4daa5977793a..222ce108b41a 100644 --- a/drivers/clk/spear/spear1310_clock.c +++ b/drivers/clk/spear/spear1310_clock.c | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * SPEAr1310 machine clock framework source file | 4 | * SPEAr1310 machine clock framework source file |
| 5 | * | 5 | * |
| 6 | * Copyright (C) 2012 ST Microelectronics | 6 | * Copyright (C) 2012 ST Microelectronics |
| 7 | * Viresh Kumar <viresh.linux@gmail.com> | 7 | * Viresh Kumar <vireshk@kernel.org> |
| 8 | * | 8 | * |
| 9 | * This file is licensed under the terms of the GNU General Public | 9 | * This file is licensed under the terms of the GNU General Public |
| 10 | * License version 2. This program is licensed "as is" without any | 10 | * License version 2. This program is licensed "as is" without any |
diff --git a/drivers/clk/spear/spear1340_clock.c b/drivers/clk/spear/spear1340_clock.c index 5a5c6648308d..973c9d3fbcf8 100644 --- a/drivers/clk/spear/spear1340_clock.c +++ b/drivers/clk/spear/spear1340_clock.c | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * SPEAr1340 machine clock framework source file | 4 | * SPEAr1340 machine clock framework source file |
| 5 | * | 5 | * |
| 6 | * Copyright (C) 2012 ST Microelectronics | 6 | * Copyright (C) 2012 ST Microelectronics |
| 7 | * Viresh Kumar <viresh.linux@gmail.com> | 7 | * Viresh Kumar <vireshk@kernel.org> |
| 8 | * | 8 | * |
| 9 | * This file is licensed under the terms of the GNU General Public | 9 | * This file is licensed under the terms of the GNU General Public |
| 10 | * License version 2. This program is licensed "as is" without any | 10 | * License version 2. This program is licensed "as is" without any |
diff --git a/drivers/clk/spear/spear3xx_clock.c b/drivers/clk/spear/spear3xx_clock.c index bb5f387774e2..404a55edd613 100644 --- a/drivers/clk/spear/spear3xx_clock.c +++ b/drivers/clk/spear/spear3xx_clock.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * SPEAr3xx machines clock framework source file | 2 | * SPEAr3xx machines clock framework source file |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2012 ST Microelectronics | 4 | * Copyright (C) 2012 ST Microelectronics |
| 5 | * Viresh Kumar <viresh.linux@gmail.com> | 5 | * Viresh Kumar <vireshk@kernel.org> |
| 6 | * | 6 | * |
| 7 | * This file is licensed under the terms of the GNU General Public | 7 | * This file is licensed under the terms of the GNU General Public |
| 8 | * License version 2. This program is licensed "as is" without any | 8 | * License version 2. This program is licensed "as is" without any |
diff --git a/drivers/clk/spear/spear6xx_clock.c b/drivers/clk/spear/spear6xx_clock.c index 4f649c9cb094..231061fa73a4 100644 --- a/drivers/clk/spear/spear6xx_clock.c +++ b/drivers/clk/spear/spear6xx_clock.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * SPEAr6xx machines clock framework source file | 2 | * SPEAr6xx machines clock framework source file |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2012 ST Microelectronics | 4 | * Copyright (C) 2012 ST Microelectronics |
| 5 | * Viresh Kumar <viresh.linux@gmail.com> | 5 | * Viresh Kumar <vireshk@kernel.org> |
| 6 | * | 6 | * |
| 7 | * This file is licensed under the terms of the GNU General Public | 7 | * This file is licensed under the terms of the GNU General Public |
| 8 | * License version 2. This program is licensed "as is" without any | 8 | * License version 2. This program is licensed "as is" without any |
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index b612411655f9..26063afb3eba 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c | |||
| @@ -169,6 +169,15 @@ struct kobject *get_governor_parent_kobj(struct cpufreq_policy *policy) | |||
| 169 | } | 169 | } |
| 170 | EXPORT_SYMBOL_GPL(get_governor_parent_kobj); | 170 | EXPORT_SYMBOL_GPL(get_governor_parent_kobj); |
| 171 | 171 | ||
| 172 | struct cpufreq_frequency_table *cpufreq_frequency_get_table(unsigned int cpu) | ||
| 173 | { | ||
| 174 | struct cpufreq_policy *policy = per_cpu(cpufreq_cpu_data, cpu); | ||
| 175 | |||
| 176 | return policy && !policy_is_inactive(policy) ? | ||
| 177 | policy->freq_table : NULL; | ||
| 178 | } | ||
| 179 | EXPORT_SYMBOL_GPL(cpufreq_frequency_get_table); | ||
| 180 | |||
| 172 | static inline u64 get_cpu_idle_time_jiffy(unsigned int cpu, u64 *wall) | 181 | static inline u64 get_cpu_idle_time_jiffy(unsigned int cpu, u64 *wall) |
| 173 | { | 182 | { |
| 174 | u64 idle_time; | 183 | u64 idle_time; |
| @@ -1132,6 +1141,7 @@ static struct cpufreq_policy *cpufreq_policy_restore(unsigned int cpu) | |||
| 1132 | 1141 | ||
| 1133 | down_write(&policy->rwsem); | 1142 | down_write(&policy->rwsem); |
| 1134 | policy->cpu = cpu; | 1143 | policy->cpu = cpu; |
| 1144 | policy->governor = NULL; | ||
| 1135 | up_write(&policy->rwsem); | 1145 | up_write(&policy->rwsem); |
| 1136 | } | 1146 | } |
| 1137 | 1147 | ||
diff --git a/drivers/cpufreq/freq_table.c b/drivers/cpufreq/freq_table.c index df14766a8e06..dfbbf981ed56 100644 --- a/drivers/cpufreq/freq_table.c +++ b/drivers/cpufreq/freq_table.c | |||
| @@ -297,15 +297,6 @@ int cpufreq_table_validate_and_show(struct cpufreq_policy *policy, | |||
| 297 | } | 297 | } |
| 298 | EXPORT_SYMBOL_GPL(cpufreq_table_validate_and_show); | 298 | EXPORT_SYMBOL_GPL(cpufreq_table_validate_and_show); |
| 299 | 299 | ||
| 300 | struct cpufreq_policy *cpufreq_cpu_get_raw(unsigned int cpu); | ||
| 301 | |||
| 302 | struct cpufreq_frequency_table *cpufreq_frequency_get_table(unsigned int cpu) | ||
| 303 | { | ||
| 304 | struct cpufreq_policy *policy = cpufreq_cpu_get_raw(cpu); | ||
| 305 | return policy ? policy->freq_table : NULL; | ||
| 306 | } | ||
| 307 | EXPORT_SYMBOL_GPL(cpufreq_frequency_get_table); | ||
| 308 | |||
| 309 | MODULE_AUTHOR("Dominik Brodowski <linux@brodo.de>"); | 300 | MODULE_AUTHOR("Dominik Brodowski <linux@brodo.de>"); |
| 310 | MODULE_DESCRIPTION("CPUfreq frequency table helpers"); | 301 | MODULE_DESCRIPTION("CPUfreq frequency table helpers"); |
| 311 | MODULE_LICENSE("GPL"); | 302 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c index e8e2775c3821..48b7228563ad 100644 --- a/drivers/cpuidle/cpuidle.c +++ b/drivers/cpuidle/cpuidle.c | |||
| @@ -112,7 +112,12 @@ int cpuidle_find_deepest_state(struct cpuidle_driver *drv, | |||
| 112 | static void enter_freeze_proper(struct cpuidle_driver *drv, | 112 | static void enter_freeze_proper(struct cpuidle_driver *drv, |
| 113 | struct cpuidle_device *dev, int index) | 113 | struct cpuidle_device *dev, int index) |
| 114 | { | 114 | { |
| 115 | tick_freeze(); | 115 | /* |
| 116 | * trace_suspend_resume() called by tick_freeze() for the last CPU | ||
| 117 | * executing it contains RCU usage regarded as invalid in the idle | ||
| 118 | * context, so tell RCU about that. | ||
| 119 | */ | ||
| 120 | RCU_NONIDLE(tick_freeze()); | ||
| 116 | /* | 121 | /* |
| 117 | * The state used here cannot be a "coupled" one, because the "coupled" | 122 | * The state used here cannot be a "coupled" one, because the "coupled" |
| 118 | * cpuidle mechanism enables interrupts and doing that with timekeeping | 123 | * cpuidle mechanism enables interrupts and doing that with timekeeping |
| @@ -122,7 +127,7 @@ static void enter_freeze_proper(struct cpuidle_driver *drv, | |||
| 122 | WARN_ON(!irqs_disabled()); | 127 | WARN_ON(!irqs_disabled()); |
| 123 | /* | 128 | /* |
| 124 | * timekeeping_resume() that will be called by tick_unfreeze() for the | 129 | * timekeeping_resume() that will be called by tick_unfreeze() for the |
| 125 | * last CPU executing it calls functions containing RCU read-side | 130 | * first CPU executing it calls functions containing RCU read-side |
| 126 | * critical sections, so tell RCU about that. | 131 | * critical sections, so tell RCU about that. |
| 127 | */ | 132 | */ |
| 128 | RCU_NONIDLE(tick_unfreeze()); | 133 | RCU_NONIDLE(tick_unfreeze()); |
diff --git a/drivers/crypto/nx/nx-aes-ccm.c b/drivers/crypto/nx/nx-aes-ccm.c index 67f80813a06f..e4311ce0cd78 100644 --- a/drivers/crypto/nx/nx-aes-ccm.c +++ b/drivers/crypto/nx/nx-aes-ccm.c | |||
| @@ -494,8 +494,9 @@ out: | |||
| 494 | static int ccm4309_aes_nx_encrypt(struct aead_request *req) | 494 | static int ccm4309_aes_nx_encrypt(struct aead_request *req) |
| 495 | { | 495 | { |
| 496 | struct nx_crypto_ctx *nx_ctx = crypto_tfm_ctx(req->base.tfm); | 496 | struct nx_crypto_ctx *nx_ctx = crypto_tfm_ctx(req->base.tfm); |
| 497 | struct nx_gcm_rctx *rctx = aead_request_ctx(req); | ||
| 497 | struct blkcipher_desc desc; | 498 | struct blkcipher_desc desc; |
| 498 | u8 *iv = nx_ctx->priv.ccm.iv; | 499 | u8 *iv = rctx->iv; |
| 499 | 500 | ||
| 500 | iv[0] = 3; | 501 | iv[0] = 3; |
| 501 | memcpy(iv + 1, nx_ctx->priv.ccm.nonce, 3); | 502 | memcpy(iv + 1, nx_ctx->priv.ccm.nonce, 3); |
| @@ -525,8 +526,9 @@ static int ccm_aes_nx_encrypt(struct aead_request *req) | |||
| 525 | static int ccm4309_aes_nx_decrypt(struct aead_request *req) | 526 | static int ccm4309_aes_nx_decrypt(struct aead_request *req) |
| 526 | { | 527 | { |
| 527 | struct nx_crypto_ctx *nx_ctx = crypto_tfm_ctx(req->base.tfm); | 528 | struct nx_crypto_ctx *nx_ctx = crypto_tfm_ctx(req->base.tfm); |
| 529 | struct nx_gcm_rctx *rctx = aead_request_ctx(req); | ||
| 528 | struct blkcipher_desc desc; | 530 | struct blkcipher_desc desc; |
| 529 | u8 *iv = nx_ctx->priv.ccm.iv; | 531 | u8 *iv = rctx->iv; |
| 530 | 532 | ||
| 531 | iv[0] = 3; | 533 | iv[0] = 3; |
| 532 | memcpy(iv + 1, nx_ctx->priv.ccm.nonce, 3); | 534 | memcpy(iv + 1, nx_ctx->priv.ccm.nonce, 3); |
diff --git a/drivers/crypto/nx/nx-aes-ctr.c b/drivers/crypto/nx/nx-aes-ctr.c index 2617cd4d54dd..dd7e9f3f5b6b 100644 --- a/drivers/crypto/nx/nx-aes-ctr.c +++ b/drivers/crypto/nx/nx-aes-ctr.c | |||
| @@ -72,7 +72,7 @@ static int ctr3686_aes_nx_set_key(struct crypto_tfm *tfm, | |||
| 72 | if (key_len < CTR_RFC3686_NONCE_SIZE) | 72 | if (key_len < CTR_RFC3686_NONCE_SIZE) |
| 73 | return -EINVAL; | 73 | return -EINVAL; |
| 74 | 74 | ||
| 75 | memcpy(nx_ctx->priv.ctr.iv, | 75 | memcpy(nx_ctx->priv.ctr.nonce, |
| 76 | in_key + key_len - CTR_RFC3686_NONCE_SIZE, | 76 | in_key + key_len - CTR_RFC3686_NONCE_SIZE, |
| 77 | CTR_RFC3686_NONCE_SIZE); | 77 | CTR_RFC3686_NONCE_SIZE); |
| 78 | 78 | ||
| @@ -131,14 +131,15 @@ static int ctr3686_aes_nx_crypt(struct blkcipher_desc *desc, | |||
| 131 | unsigned int nbytes) | 131 | unsigned int nbytes) |
| 132 | { | 132 | { |
| 133 | struct nx_crypto_ctx *nx_ctx = crypto_blkcipher_ctx(desc->tfm); | 133 | struct nx_crypto_ctx *nx_ctx = crypto_blkcipher_ctx(desc->tfm); |
| 134 | u8 *iv = nx_ctx->priv.ctr.iv; | 134 | u8 iv[16]; |
| 135 | 135 | ||
| 136 | memcpy(iv, nx_ctx->priv.ctr.nonce, CTR_RFC3686_IV_SIZE); | ||
| 136 | memcpy(iv + CTR_RFC3686_NONCE_SIZE, | 137 | memcpy(iv + CTR_RFC3686_NONCE_SIZE, |
| 137 | desc->info, CTR_RFC3686_IV_SIZE); | 138 | desc->info, CTR_RFC3686_IV_SIZE); |
| 138 | iv[12] = iv[13] = iv[14] = 0; | 139 | iv[12] = iv[13] = iv[14] = 0; |
| 139 | iv[15] = 1; | 140 | iv[15] = 1; |
| 140 | 141 | ||
| 141 | desc->info = nx_ctx->priv.ctr.iv; | 142 | desc->info = iv; |
| 142 | 143 | ||
| 143 | return ctr_aes_nx_crypt(desc, dst, src, nbytes); | 144 | return ctr_aes_nx_crypt(desc, dst, src, nbytes); |
| 144 | } | 145 | } |
diff --git a/drivers/crypto/nx/nx-aes-gcm.c b/drivers/crypto/nx/nx-aes-gcm.c index 08ac6d48688c..92c993f08213 100644 --- a/drivers/crypto/nx/nx-aes-gcm.c +++ b/drivers/crypto/nx/nx-aes-gcm.c | |||
| @@ -317,6 +317,7 @@ out: | |||
| 317 | static int gcm_aes_nx_crypt(struct aead_request *req, int enc) | 317 | static int gcm_aes_nx_crypt(struct aead_request *req, int enc) |
| 318 | { | 318 | { |
| 319 | struct nx_crypto_ctx *nx_ctx = crypto_tfm_ctx(req->base.tfm); | 319 | struct nx_crypto_ctx *nx_ctx = crypto_tfm_ctx(req->base.tfm); |
| 320 | struct nx_gcm_rctx *rctx = aead_request_ctx(req); | ||
| 320 | struct nx_csbcpb *csbcpb = nx_ctx->csbcpb; | 321 | struct nx_csbcpb *csbcpb = nx_ctx->csbcpb; |
| 321 | struct blkcipher_desc desc; | 322 | struct blkcipher_desc desc; |
| 322 | unsigned int nbytes = req->cryptlen; | 323 | unsigned int nbytes = req->cryptlen; |
| @@ -326,7 +327,7 @@ static int gcm_aes_nx_crypt(struct aead_request *req, int enc) | |||
| 326 | 327 | ||
| 327 | spin_lock_irqsave(&nx_ctx->lock, irq_flags); | 328 | spin_lock_irqsave(&nx_ctx->lock, irq_flags); |
| 328 | 329 | ||
| 329 | desc.info = nx_ctx->priv.gcm.iv; | 330 | desc.info = rctx->iv; |
| 330 | /* initialize the counter */ | 331 | /* initialize the counter */ |
| 331 | *(u32 *)(desc.info + NX_GCM_CTR_OFFSET) = 1; | 332 | *(u32 *)(desc.info + NX_GCM_CTR_OFFSET) = 1; |
| 332 | 333 | ||
| @@ -424,8 +425,8 @@ out: | |||
| 424 | 425 | ||
| 425 | static int gcm_aes_nx_encrypt(struct aead_request *req) | 426 | static int gcm_aes_nx_encrypt(struct aead_request *req) |
| 426 | { | 427 | { |
| 427 | struct nx_crypto_ctx *nx_ctx = crypto_tfm_ctx(req->base.tfm); | 428 | struct nx_gcm_rctx *rctx = aead_request_ctx(req); |
| 428 | char *iv = nx_ctx->priv.gcm.iv; | 429 | char *iv = rctx->iv; |
| 429 | 430 | ||
| 430 | memcpy(iv, req->iv, 12); | 431 | memcpy(iv, req->iv, 12); |
| 431 | 432 | ||
| @@ -434,8 +435,8 @@ static int gcm_aes_nx_encrypt(struct aead_request *req) | |||
| 434 | 435 | ||
| 435 | static int gcm_aes_nx_decrypt(struct aead_request *req) | 436 | static int gcm_aes_nx_decrypt(struct aead_request *req) |
| 436 | { | 437 | { |
| 437 | struct nx_crypto_ctx *nx_ctx = crypto_tfm_ctx(req->base.tfm); | 438 | struct nx_gcm_rctx *rctx = aead_request_ctx(req); |
| 438 | char *iv = nx_ctx->priv.gcm.iv; | 439 | char *iv = rctx->iv; |
| 439 | 440 | ||
| 440 | memcpy(iv, req->iv, 12); | 441 | memcpy(iv, req->iv, 12); |
| 441 | 442 | ||
| @@ -445,7 +446,8 @@ static int gcm_aes_nx_decrypt(struct aead_request *req) | |||
| 445 | static int gcm4106_aes_nx_encrypt(struct aead_request *req) | 446 | static int gcm4106_aes_nx_encrypt(struct aead_request *req) |
| 446 | { | 447 | { |
| 447 | struct nx_crypto_ctx *nx_ctx = crypto_tfm_ctx(req->base.tfm); | 448 | struct nx_crypto_ctx *nx_ctx = crypto_tfm_ctx(req->base.tfm); |
| 448 | char *iv = nx_ctx->priv.gcm.iv; | 449 | struct nx_gcm_rctx *rctx = aead_request_ctx(req); |
| 450 | char *iv = rctx->iv; | ||
| 449 | char *nonce = nx_ctx->priv.gcm.nonce; | 451 | char *nonce = nx_ctx->priv.gcm.nonce; |
| 450 | 452 | ||
| 451 | memcpy(iv, nonce, NX_GCM4106_NONCE_LEN); | 453 | memcpy(iv, nonce, NX_GCM4106_NONCE_LEN); |
| @@ -457,7 +459,8 @@ static int gcm4106_aes_nx_encrypt(struct aead_request *req) | |||
| 457 | static int gcm4106_aes_nx_decrypt(struct aead_request *req) | 459 | static int gcm4106_aes_nx_decrypt(struct aead_request *req) |
| 458 | { | 460 | { |
| 459 | struct nx_crypto_ctx *nx_ctx = crypto_tfm_ctx(req->base.tfm); | 461 | struct nx_crypto_ctx *nx_ctx = crypto_tfm_ctx(req->base.tfm); |
| 460 | char *iv = nx_ctx->priv.gcm.iv; | 462 | struct nx_gcm_rctx *rctx = aead_request_ctx(req); |
| 463 | char *iv = rctx->iv; | ||
| 461 | char *nonce = nx_ctx->priv.gcm.nonce; | 464 | char *nonce = nx_ctx->priv.gcm.nonce; |
| 462 | 465 | ||
| 463 | memcpy(iv, nonce, NX_GCM4106_NONCE_LEN); | 466 | memcpy(iv, nonce, NX_GCM4106_NONCE_LEN); |
diff --git a/drivers/crypto/nx/nx-aes-xcbc.c b/drivers/crypto/nx/nx-aes-xcbc.c index 8c2faffab4a3..c2f7d4befb55 100644 --- a/drivers/crypto/nx/nx-aes-xcbc.c +++ b/drivers/crypto/nx/nx-aes-xcbc.c | |||
| @@ -42,6 +42,7 @@ static int nx_xcbc_set_key(struct crypto_shash *desc, | |||
| 42 | unsigned int key_len) | 42 | unsigned int key_len) |
| 43 | { | 43 | { |
| 44 | struct nx_crypto_ctx *nx_ctx = crypto_shash_ctx(desc); | 44 | struct nx_crypto_ctx *nx_ctx = crypto_shash_ctx(desc); |
| 45 | struct nx_csbcpb *csbcpb = nx_ctx->csbcpb; | ||
| 45 | 46 | ||
| 46 | switch (key_len) { | 47 | switch (key_len) { |
| 47 | case AES_KEYSIZE_128: | 48 | case AES_KEYSIZE_128: |
| @@ -51,7 +52,7 @@ static int nx_xcbc_set_key(struct crypto_shash *desc, | |||
| 51 | return -EINVAL; | 52 | return -EINVAL; |
| 52 | } | 53 | } |
| 53 | 54 | ||
| 54 | memcpy(nx_ctx->priv.xcbc.key, in_key, key_len); | 55 | memcpy(csbcpb->cpb.aes_xcbc.key, in_key, key_len); |
| 55 | 56 | ||
| 56 | return 0; | 57 | return 0; |
| 57 | } | 58 | } |
| @@ -148,32 +149,29 @@ out: | |||
| 148 | return rc; | 149 | return rc; |
| 149 | } | 150 | } |
| 150 | 151 | ||
| 151 | static int nx_xcbc_init(struct shash_desc *desc) | 152 | static int nx_crypto_ctx_aes_xcbc_init2(struct crypto_tfm *tfm) |
| 152 | { | 153 | { |
| 153 | struct xcbc_state *sctx = shash_desc_ctx(desc); | 154 | struct nx_crypto_ctx *nx_ctx = crypto_tfm_ctx(tfm); |
| 154 | struct nx_crypto_ctx *nx_ctx = crypto_tfm_ctx(&desc->tfm->base); | ||
| 155 | struct nx_csbcpb *csbcpb = nx_ctx->csbcpb; | 155 | struct nx_csbcpb *csbcpb = nx_ctx->csbcpb; |
| 156 | struct nx_sg *out_sg; | 156 | int err; |
| 157 | int len; | ||
| 158 | 157 | ||
| 159 | nx_ctx_init(nx_ctx, HCOP_FC_AES); | 158 | err = nx_crypto_ctx_aes_xcbc_init(tfm); |
| 159 | if (err) | ||
| 160 | return err; | ||
| 160 | 161 | ||
| 161 | memset(sctx, 0, sizeof *sctx); | 162 | nx_ctx_init(nx_ctx, HCOP_FC_AES); |
| 162 | 163 | ||
| 163 | NX_CPB_SET_KEY_SIZE(csbcpb, NX_KS_AES_128); | 164 | NX_CPB_SET_KEY_SIZE(csbcpb, NX_KS_AES_128); |
| 164 | csbcpb->cpb.hdr.mode = NX_MODE_AES_XCBC_MAC; | 165 | csbcpb->cpb.hdr.mode = NX_MODE_AES_XCBC_MAC; |
| 165 | 166 | ||
| 166 | memcpy(csbcpb->cpb.aes_xcbc.key, nx_ctx->priv.xcbc.key, AES_BLOCK_SIZE); | 167 | return 0; |
| 167 | memset(nx_ctx->priv.xcbc.key, 0, sizeof *nx_ctx->priv.xcbc.key); | 168 | } |
| 168 | |||
| 169 | len = AES_BLOCK_SIZE; | ||
| 170 | out_sg = nx_build_sg_list(nx_ctx->out_sg, (u8 *)sctx->state, | ||
| 171 | &len, nx_ctx->ap->sglen); | ||
| 172 | 169 | ||
| 173 | if (len != AES_BLOCK_SIZE) | 170 | static int nx_xcbc_init(struct shash_desc *desc) |
| 174 | return -EINVAL; | 171 | { |
| 172 | struct xcbc_state *sctx = shash_desc_ctx(desc); | ||
| 175 | 173 | ||
| 176 | nx_ctx->op.outlen = (nx_ctx->out_sg - out_sg) * sizeof(struct nx_sg); | 174 | memset(sctx, 0, sizeof *sctx); |
| 177 | 175 | ||
| 178 | return 0; | 176 | return 0; |
| 179 | } | 177 | } |
| @@ -186,6 +184,7 @@ static int nx_xcbc_update(struct shash_desc *desc, | |||
| 186 | struct nx_crypto_ctx *nx_ctx = crypto_tfm_ctx(&desc->tfm->base); | 184 | struct nx_crypto_ctx *nx_ctx = crypto_tfm_ctx(&desc->tfm->base); |
| 187 | struct nx_csbcpb *csbcpb = nx_ctx->csbcpb; | 185 | struct nx_csbcpb *csbcpb = nx_ctx->csbcpb; |
| 188 | struct nx_sg *in_sg; | 186 | struct nx_sg *in_sg; |
| 187 | struct nx_sg *out_sg; | ||
| 189 | u32 to_process = 0, leftover, total; | 188 | u32 to_process = 0, leftover, total; |
| 190 | unsigned int max_sg_len; | 189 | unsigned int max_sg_len; |
| 191 | unsigned long irq_flags; | 190 | unsigned long irq_flags; |
| @@ -213,6 +212,17 @@ static int nx_xcbc_update(struct shash_desc *desc, | |||
| 213 | max_sg_len = min_t(u64, max_sg_len, | 212 | max_sg_len = min_t(u64, max_sg_len, |
| 214 | nx_ctx->ap->databytelen/NX_PAGE_SIZE); | 213 | nx_ctx->ap->databytelen/NX_PAGE_SIZE); |
| 215 | 214 | ||
| 215 | data_len = AES_BLOCK_SIZE; | ||
| 216 | out_sg = nx_build_sg_list(nx_ctx->out_sg, (u8 *)sctx->state, | ||
| 217 | &len, nx_ctx->ap->sglen); | ||
| 218 | |||
| 219 | if (data_len != AES_BLOCK_SIZE) { | ||
| 220 | rc = -EINVAL; | ||
| 221 | goto out; | ||
| 222 | } | ||
| 223 | |||
| 224 | nx_ctx->op.outlen = (nx_ctx->out_sg - out_sg) * sizeof(struct nx_sg); | ||
| 225 | |||
| 216 | do { | 226 | do { |
| 217 | to_process = total - to_process; | 227 | to_process = total - to_process; |
| 218 | to_process = to_process & ~(AES_BLOCK_SIZE - 1); | 228 | to_process = to_process & ~(AES_BLOCK_SIZE - 1); |
| @@ -235,8 +245,10 @@ static int nx_xcbc_update(struct shash_desc *desc, | |||
| 235 | (u8 *) sctx->buffer, | 245 | (u8 *) sctx->buffer, |
| 236 | &data_len, | 246 | &data_len, |
| 237 | max_sg_len); | 247 | max_sg_len); |
| 238 | if (data_len != sctx->count) | 248 | if (data_len != sctx->count) { |
| 239 | return -EINVAL; | 249 | rc = -EINVAL; |
| 250 | goto out; | ||
| 251 | } | ||
| 240 | } | 252 | } |
| 241 | 253 | ||
| 242 | data_len = to_process - sctx->count; | 254 | data_len = to_process - sctx->count; |
| @@ -245,8 +257,10 @@ static int nx_xcbc_update(struct shash_desc *desc, | |||
| 245 | &data_len, | 257 | &data_len, |
| 246 | max_sg_len); | 258 | max_sg_len); |
| 247 | 259 | ||
| 248 | if (data_len != to_process - sctx->count) | 260 | if (data_len != to_process - sctx->count) { |
| 249 | return -EINVAL; | 261 | rc = -EINVAL; |
| 262 | goto out; | ||
| 263 | } | ||
| 250 | 264 | ||
| 251 | nx_ctx->op.inlen = (nx_ctx->in_sg - in_sg) * | 265 | nx_ctx->op.inlen = (nx_ctx->in_sg - in_sg) * |
| 252 | sizeof(struct nx_sg); | 266 | sizeof(struct nx_sg); |
| @@ -325,15 +339,19 @@ static int nx_xcbc_final(struct shash_desc *desc, u8 *out) | |||
| 325 | in_sg = nx_build_sg_list(nx_ctx->in_sg, (u8 *)sctx->buffer, | 339 | in_sg = nx_build_sg_list(nx_ctx->in_sg, (u8 *)sctx->buffer, |
| 326 | &len, nx_ctx->ap->sglen); | 340 | &len, nx_ctx->ap->sglen); |
| 327 | 341 | ||
| 328 | if (len != sctx->count) | 342 | if (len != sctx->count) { |
| 329 | return -EINVAL; | 343 | rc = -EINVAL; |
| 344 | goto out; | ||
| 345 | } | ||
| 330 | 346 | ||
| 331 | len = AES_BLOCK_SIZE; | 347 | len = AES_BLOCK_SIZE; |
| 332 | out_sg = nx_build_sg_list(nx_ctx->out_sg, out, &len, | 348 | out_sg = nx_build_sg_list(nx_ctx->out_sg, out, &len, |
| 333 | nx_ctx->ap->sglen); | 349 | nx_ctx->ap->sglen); |
| 334 | 350 | ||
| 335 | if (len != AES_BLOCK_SIZE) | 351 | if (len != AES_BLOCK_SIZE) { |
| 336 | return -EINVAL; | 352 | rc = -EINVAL; |
| 353 | goto out; | ||
| 354 | } | ||
| 337 | 355 | ||
| 338 | nx_ctx->op.inlen = (nx_ctx->in_sg - in_sg) * sizeof(struct nx_sg); | 356 | nx_ctx->op.inlen = (nx_ctx->in_sg - in_sg) * sizeof(struct nx_sg); |
| 339 | nx_ctx->op.outlen = (nx_ctx->out_sg - out_sg) * sizeof(struct nx_sg); | 357 | nx_ctx->op.outlen = (nx_ctx->out_sg - out_sg) * sizeof(struct nx_sg); |
| @@ -372,7 +390,7 @@ struct shash_alg nx_shash_aes_xcbc_alg = { | |||
| 372 | .cra_blocksize = AES_BLOCK_SIZE, | 390 | .cra_blocksize = AES_BLOCK_SIZE, |
| 373 | .cra_module = THIS_MODULE, | 391 | .cra_module = THIS_MODULE, |
| 374 | .cra_ctxsize = sizeof(struct nx_crypto_ctx), | 392 | .cra_ctxsize = sizeof(struct nx_crypto_ctx), |
| 375 | .cra_init = nx_crypto_ctx_aes_xcbc_init, | 393 | .cra_init = nx_crypto_ctx_aes_xcbc_init2, |
| 376 | .cra_exit = nx_crypto_ctx_exit, | 394 | .cra_exit = nx_crypto_ctx_exit, |
| 377 | } | 395 | } |
| 378 | }; | 396 | }; |
diff --git a/drivers/crypto/nx/nx-sha256.c b/drivers/crypto/nx/nx-sha256.c index 4e91bdb83c59..08f8d5cd6334 100644 --- a/drivers/crypto/nx/nx-sha256.c +++ b/drivers/crypto/nx/nx-sha256.c | |||
| @@ -29,34 +29,28 @@ | |||
| 29 | #include "nx.h" | 29 | #include "nx.h" |
| 30 | 30 | ||
| 31 | 31 | ||
| 32 | static int nx_sha256_init(struct shash_desc *desc) | 32 | static int nx_crypto_ctx_sha256_init(struct crypto_tfm *tfm) |
| 33 | { | 33 | { |
| 34 | struct sha256_state *sctx = shash_desc_ctx(desc); | 34 | struct nx_crypto_ctx *nx_ctx = crypto_tfm_ctx(tfm); |
| 35 | struct nx_crypto_ctx *nx_ctx = crypto_tfm_ctx(&desc->tfm->base); | 35 | int err; |
| 36 | struct nx_sg *out_sg; | ||
| 37 | int len; | ||
| 38 | u32 max_sg_len; | ||
| 39 | 36 | ||
| 40 | nx_ctx_init(nx_ctx, HCOP_FC_SHA); | 37 | err = nx_crypto_ctx_sha_init(tfm); |
| 38 | if (err) | ||
| 39 | return err; | ||
| 41 | 40 | ||
| 42 | memset(sctx, 0, sizeof *sctx); | 41 | nx_ctx_init(nx_ctx, HCOP_FC_SHA); |
| 43 | 42 | ||
| 44 | nx_ctx->ap = &nx_ctx->props[NX_PROPS_SHA256]; | 43 | nx_ctx->ap = &nx_ctx->props[NX_PROPS_SHA256]; |
| 45 | 44 | ||
| 46 | NX_CPB_SET_DIGEST_SIZE(nx_ctx->csbcpb, NX_DS_SHA256); | 45 | NX_CPB_SET_DIGEST_SIZE(nx_ctx->csbcpb, NX_DS_SHA256); |
| 47 | 46 | ||
| 48 | max_sg_len = min_t(u64, nx_ctx->ap->sglen, | 47 | return 0; |
| 49 | nx_driver.of.max_sg_len/sizeof(struct nx_sg)); | 48 | } |
| 50 | max_sg_len = min_t(u64, max_sg_len, | ||
| 51 | nx_ctx->ap->databytelen/NX_PAGE_SIZE); | ||
| 52 | 49 | ||
| 53 | len = SHA256_DIGEST_SIZE; | 50 | static int nx_sha256_init(struct shash_desc *desc) { |
| 54 | out_sg = nx_build_sg_list(nx_ctx->out_sg, (u8 *)sctx->state, | 51 | struct sha256_state *sctx = shash_desc_ctx(desc); |
| 55 | &len, max_sg_len); | ||
| 56 | nx_ctx->op.outlen = (nx_ctx->out_sg - out_sg) * sizeof(struct nx_sg); | ||
| 57 | 52 | ||
| 58 | if (len != SHA256_DIGEST_SIZE) | 53 | memset(sctx, 0, sizeof *sctx); |
| 59 | return -EINVAL; | ||
| 60 | 54 | ||
| 61 | sctx->state[0] = __cpu_to_be32(SHA256_H0); | 55 | sctx->state[0] = __cpu_to_be32(SHA256_H0); |
| 62 | sctx->state[1] = __cpu_to_be32(SHA256_H1); | 56 | sctx->state[1] = __cpu_to_be32(SHA256_H1); |
| @@ -78,6 +72,7 @@ static int nx_sha256_update(struct shash_desc *desc, const u8 *data, | |||
| 78 | struct nx_crypto_ctx *nx_ctx = crypto_tfm_ctx(&desc->tfm->base); | 72 | struct nx_crypto_ctx *nx_ctx = crypto_tfm_ctx(&desc->tfm->base); |
| 79 | struct nx_csbcpb *csbcpb = (struct nx_csbcpb *)nx_ctx->csbcpb; | 73 | struct nx_csbcpb *csbcpb = (struct nx_csbcpb *)nx_ctx->csbcpb; |
| 80 | struct nx_sg *in_sg; | 74 | struct nx_sg *in_sg; |
| 75 | struct nx_sg *out_sg; | ||
| 81 | u64 to_process = 0, leftover, total; | 76 | u64 to_process = 0, leftover, total; |
| 82 | unsigned long irq_flags; | 77 | unsigned long irq_flags; |
| 83 | int rc = 0; | 78 | int rc = 0; |
| @@ -108,6 +103,16 @@ static int nx_sha256_update(struct shash_desc *desc, const u8 *data, | |||
| 108 | max_sg_len = min_t(u64, max_sg_len, | 103 | max_sg_len = min_t(u64, max_sg_len, |
| 109 | nx_ctx->ap->databytelen/NX_PAGE_SIZE); | 104 | nx_ctx->ap->databytelen/NX_PAGE_SIZE); |
| 110 | 105 | ||
| 106 | data_len = SHA256_DIGEST_SIZE; | ||
| 107 | out_sg = nx_build_sg_list(nx_ctx->out_sg, (u8 *)sctx->state, | ||
| 108 | &data_len, max_sg_len); | ||
| 109 | nx_ctx->op.outlen = (nx_ctx->out_sg - out_sg) * sizeof(struct nx_sg); | ||
| 110 | |||
| 111 | if (data_len != SHA256_DIGEST_SIZE) { | ||
| 112 | rc = -EINVAL; | ||
| 113 | goto out; | ||
| 114 | } | ||
| 115 | |||
| 111 | do { | 116 | do { |
| 112 | /* | 117 | /* |
| 113 | * to_process: the SHA256_BLOCK_SIZE data chunk to process in | 118 | * to_process: the SHA256_BLOCK_SIZE data chunk to process in |
| @@ -282,7 +287,7 @@ struct shash_alg nx_shash_sha256_alg = { | |||
| 282 | .cra_blocksize = SHA256_BLOCK_SIZE, | 287 | .cra_blocksize = SHA256_BLOCK_SIZE, |
| 283 | .cra_module = THIS_MODULE, | 288 | .cra_module = THIS_MODULE, |
| 284 | .cra_ctxsize = sizeof(struct nx_crypto_ctx), | 289 | .cra_ctxsize = sizeof(struct nx_crypto_ctx), |
| 285 | .cra_init = nx_crypto_ctx_sha_init, | 290 | .cra_init = nx_crypto_ctx_sha256_init, |
| 286 | .cra_exit = nx_crypto_ctx_exit, | 291 | .cra_exit = nx_crypto_ctx_exit, |
| 287 | } | 292 | } |
| 288 | }; | 293 | }; |
diff --git a/drivers/crypto/nx/nx-sha512.c b/drivers/crypto/nx/nx-sha512.c index e6a58d2ee628..aff0fe58eac0 100644 --- a/drivers/crypto/nx/nx-sha512.c +++ b/drivers/crypto/nx/nx-sha512.c | |||
| @@ -28,34 +28,29 @@ | |||
| 28 | #include "nx.h" | 28 | #include "nx.h" |
| 29 | 29 | ||
| 30 | 30 | ||
| 31 | static int nx_sha512_init(struct shash_desc *desc) | 31 | static int nx_crypto_ctx_sha512_init(struct crypto_tfm *tfm) |
| 32 | { | 32 | { |
| 33 | struct sha512_state *sctx = shash_desc_ctx(desc); | 33 | struct nx_crypto_ctx *nx_ctx = crypto_tfm_ctx(tfm); |
| 34 | struct nx_crypto_ctx *nx_ctx = crypto_tfm_ctx(&desc->tfm->base); | 34 | int err; |
| 35 | struct nx_sg *out_sg; | ||
| 36 | int len; | ||
| 37 | u32 max_sg_len; | ||
| 38 | 35 | ||
| 39 | nx_ctx_init(nx_ctx, HCOP_FC_SHA); | 36 | err = nx_crypto_ctx_sha_init(tfm); |
| 37 | if (err) | ||
| 38 | return err; | ||
| 40 | 39 | ||
| 41 | memset(sctx, 0, sizeof *sctx); | 40 | nx_ctx_init(nx_ctx, HCOP_FC_SHA); |
| 42 | 41 | ||
| 43 | nx_ctx->ap = &nx_ctx->props[NX_PROPS_SHA512]; | 42 | nx_ctx->ap = &nx_ctx->props[NX_PROPS_SHA512]; |
| 44 | 43 | ||
| 45 | NX_CPB_SET_DIGEST_SIZE(nx_ctx->csbcpb, NX_DS_SHA512); | 44 | NX_CPB_SET_DIGEST_SIZE(nx_ctx->csbcpb, NX_DS_SHA512); |
| 46 | 45 | ||
| 47 | max_sg_len = min_t(u64, nx_ctx->ap->sglen, | 46 | return 0; |
| 48 | nx_driver.of.max_sg_len/sizeof(struct nx_sg)); | 47 | } |
| 49 | max_sg_len = min_t(u64, max_sg_len, | ||
| 50 | nx_ctx->ap->databytelen/NX_PAGE_SIZE); | ||
| 51 | 48 | ||
| 52 | len = SHA512_DIGEST_SIZE; | 49 | static int nx_sha512_init(struct shash_desc *desc) |
| 53 | out_sg = nx_build_sg_list(nx_ctx->out_sg, (u8 *)sctx->state, | 50 | { |
| 54 | &len, max_sg_len); | 51 | struct sha512_state *sctx = shash_desc_ctx(desc); |
| 55 | nx_ctx->op.outlen = (nx_ctx->out_sg - out_sg) * sizeof(struct nx_sg); | ||
| 56 | 52 | ||
| 57 | if (len != SHA512_DIGEST_SIZE) | 53 | memset(sctx, 0, sizeof *sctx); |
| 58 | return -EINVAL; | ||
| 59 | 54 | ||
| 60 | sctx->state[0] = __cpu_to_be64(SHA512_H0); | 55 | sctx->state[0] = __cpu_to_be64(SHA512_H0); |
| 61 | sctx->state[1] = __cpu_to_be64(SHA512_H1); | 56 | sctx->state[1] = __cpu_to_be64(SHA512_H1); |
| @@ -77,6 +72,7 @@ static int nx_sha512_update(struct shash_desc *desc, const u8 *data, | |||
| 77 | struct nx_crypto_ctx *nx_ctx = crypto_tfm_ctx(&desc->tfm->base); | 72 | struct nx_crypto_ctx *nx_ctx = crypto_tfm_ctx(&desc->tfm->base); |
| 78 | struct nx_csbcpb *csbcpb = (struct nx_csbcpb *)nx_ctx->csbcpb; | 73 | struct nx_csbcpb *csbcpb = (struct nx_csbcpb *)nx_ctx->csbcpb; |
| 79 | struct nx_sg *in_sg; | 74 | struct nx_sg *in_sg; |
| 75 | struct nx_sg *out_sg; | ||
| 80 | u64 to_process, leftover = 0, total; | 76 | u64 to_process, leftover = 0, total; |
| 81 | unsigned long irq_flags; | 77 | unsigned long irq_flags; |
| 82 | int rc = 0; | 78 | int rc = 0; |
| @@ -107,6 +103,16 @@ static int nx_sha512_update(struct shash_desc *desc, const u8 *data, | |||
| 107 | max_sg_len = min_t(u64, max_sg_len, | 103 | max_sg_len = min_t(u64, max_sg_len, |
| 108 | nx_ctx->ap->databytelen/NX_PAGE_SIZE); | 104 | nx_ctx->ap->databytelen/NX_PAGE_SIZE); |
| 109 | 105 | ||
| 106 | data_len = SHA512_DIGEST_SIZE; | ||
| 107 | out_sg = nx_build_sg_list(nx_ctx->out_sg, (u8 *)sctx->state, | ||
| 108 | &data_len, max_sg_len); | ||
| 109 | nx_ctx->op.outlen = (nx_ctx->out_sg - out_sg) * sizeof(struct nx_sg); | ||
| 110 | |||
| 111 | if (data_len != SHA512_DIGEST_SIZE) { | ||
| 112 | rc = -EINVAL; | ||
| 113 | goto out; | ||
| 114 | } | ||
| 115 | |||
| 110 | do { | 116 | do { |
| 111 | /* | 117 | /* |
| 112 | * to_process: the SHA512_BLOCK_SIZE data chunk to process in | 118 | * to_process: the SHA512_BLOCK_SIZE data chunk to process in |
| @@ -288,7 +294,7 @@ struct shash_alg nx_shash_sha512_alg = { | |||
| 288 | .cra_blocksize = SHA512_BLOCK_SIZE, | 294 | .cra_blocksize = SHA512_BLOCK_SIZE, |
| 289 | .cra_module = THIS_MODULE, | 295 | .cra_module = THIS_MODULE, |
| 290 | .cra_ctxsize = sizeof(struct nx_crypto_ctx), | 296 | .cra_ctxsize = sizeof(struct nx_crypto_ctx), |
| 291 | .cra_init = nx_crypto_ctx_sha_init, | 297 | .cra_init = nx_crypto_ctx_sha512_init, |
| 292 | .cra_exit = nx_crypto_ctx_exit, | 298 | .cra_exit = nx_crypto_ctx_exit, |
| 293 | } | 299 | } |
| 294 | }; | 300 | }; |
diff --git a/drivers/crypto/nx/nx.c b/drivers/crypto/nx/nx.c index f6198f29a4a8..436971343ff7 100644 --- a/drivers/crypto/nx/nx.c +++ b/drivers/crypto/nx/nx.c | |||
| @@ -713,12 +713,15 @@ static int nx_crypto_ctx_init(struct nx_crypto_ctx *nx_ctx, u32 fc, u32 mode) | |||
| 713 | /* entry points from the crypto tfm initializers */ | 713 | /* entry points from the crypto tfm initializers */ |
| 714 | int nx_crypto_ctx_aes_ccm_init(struct crypto_tfm *tfm) | 714 | int nx_crypto_ctx_aes_ccm_init(struct crypto_tfm *tfm) |
| 715 | { | 715 | { |
| 716 | crypto_aead_set_reqsize(__crypto_aead_cast(tfm), | ||
| 717 | sizeof(struct nx_ccm_rctx)); | ||
| 716 | return nx_crypto_ctx_init(crypto_tfm_ctx(tfm), NX_FC_AES, | 718 | return nx_crypto_ctx_init(crypto_tfm_ctx(tfm), NX_FC_AES, |
| 717 | NX_MODE_AES_CCM); | 719 | NX_MODE_AES_CCM); |
| 718 | } | 720 | } |
| 719 | 721 | ||
| 720 | int nx_crypto_ctx_aes_gcm_init(struct crypto_aead *tfm) | 722 | int nx_crypto_ctx_aes_gcm_init(struct crypto_aead *tfm) |
| 721 | { | 723 | { |
| 724 | crypto_aead_set_reqsize(tfm, sizeof(struct nx_gcm_rctx)); | ||
| 722 | return nx_crypto_ctx_init(crypto_aead_ctx(tfm), NX_FC_AES, | 725 | return nx_crypto_ctx_init(crypto_aead_ctx(tfm), NX_FC_AES, |
| 723 | NX_MODE_AES_GCM); | 726 | NX_MODE_AES_GCM); |
| 724 | } | 727 | } |
diff --git a/drivers/crypto/nx/nx.h b/drivers/crypto/nx/nx.h index de3ea8738146..cdff03a42ae7 100644 --- a/drivers/crypto/nx/nx.h +++ b/drivers/crypto/nx/nx.h | |||
| @@ -2,6 +2,8 @@ | |||
| 2 | #ifndef __NX_H__ | 2 | #ifndef __NX_H__ |
| 3 | #define __NX_H__ | 3 | #define __NX_H__ |
| 4 | 4 | ||
| 5 | #include <crypto/ctr.h> | ||
| 6 | |||
| 5 | #define NX_NAME "nx-crypto" | 7 | #define NX_NAME "nx-crypto" |
| 6 | #define NX_STRING "IBM Power7+ Nest Accelerator Crypto Driver" | 8 | #define NX_STRING "IBM Power7+ Nest Accelerator Crypto Driver" |
| 7 | #define NX_VERSION "1.0" | 9 | #define NX_VERSION "1.0" |
| @@ -91,8 +93,11 @@ struct nx_crypto_driver { | |||
| 91 | 93 | ||
| 92 | #define NX_GCM4106_NONCE_LEN (4) | 94 | #define NX_GCM4106_NONCE_LEN (4) |
| 93 | #define NX_GCM_CTR_OFFSET (12) | 95 | #define NX_GCM_CTR_OFFSET (12) |
| 94 | struct nx_gcm_priv { | 96 | struct nx_gcm_rctx { |
| 95 | u8 iv[16]; | 97 | u8 iv[16]; |
| 98 | }; | ||
| 99 | |||
| 100 | struct nx_gcm_priv { | ||
| 96 | u8 iauth_tag[16]; | 101 | u8 iauth_tag[16]; |
| 97 | u8 nonce[NX_GCM4106_NONCE_LEN]; | 102 | u8 nonce[NX_GCM4106_NONCE_LEN]; |
| 98 | }; | 103 | }; |
| @@ -100,8 +105,11 @@ struct nx_gcm_priv { | |||
| 100 | #define NX_CCM_AES_KEY_LEN (16) | 105 | #define NX_CCM_AES_KEY_LEN (16) |
| 101 | #define NX_CCM4309_AES_KEY_LEN (19) | 106 | #define NX_CCM4309_AES_KEY_LEN (19) |
| 102 | #define NX_CCM4309_NONCE_LEN (3) | 107 | #define NX_CCM4309_NONCE_LEN (3) |
| 103 | struct nx_ccm_priv { | 108 | struct nx_ccm_rctx { |
| 104 | u8 iv[16]; | 109 | u8 iv[16]; |
| 110 | }; | ||
| 111 | |||
| 112 | struct nx_ccm_priv { | ||
| 105 | u8 b0[16]; | 113 | u8 b0[16]; |
| 106 | u8 iauth_tag[16]; | 114 | u8 iauth_tag[16]; |
| 107 | u8 oauth_tag[16]; | 115 | u8 oauth_tag[16]; |
| @@ -113,7 +121,7 @@ struct nx_xcbc_priv { | |||
| 113 | }; | 121 | }; |
| 114 | 122 | ||
| 115 | struct nx_ctr_priv { | 123 | struct nx_ctr_priv { |
| 116 | u8 iv[16]; | 124 | u8 nonce[CTR_RFC3686_NONCE_SIZE]; |
| 117 | }; | 125 | }; |
| 118 | 126 | ||
| 119 | struct nx_crypto_ctx { | 127 | struct nx_crypto_ctx { |
diff --git a/drivers/crypto/omap-des.c b/drivers/crypto/omap-des.c index 46307098f8ba..0a70e46d5416 100644 --- a/drivers/crypto/omap-des.c +++ b/drivers/crypto/omap-des.c | |||
| @@ -536,9 +536,6 @@ static int omap_des_crypt_dma_stop(struct omap_des_dev *dd) | |||
| 536 | dmaengine_terminate_all(dd->dma_lch_in); | 536 | dmaengine_terminate_all(dd->dma_lch_in); |
| 537 | dmaengine_terminate_all(dd->dma_lch_out); | 537 | dmaengine_terminate_all(dd->dma_lch_out); |
| 538 | 538 | ||
| 539 | dma_unmap_sg(dd->dev, dd->in_sg, dd->in_sg_len, DMA_TO_DEVICE); | ||
| 540 | dma_unmap_sg(dd->dev, dd->out_sg, dd->out_sg_len, DMA_FROM_DEVICE); | ||
| 541 | |||
| 542 | return err; | 539 | return err; |
| 543 | } | 540 | } |
| 544 | 541 | ||
diff --git a/drivers/dma/dw/core.c b/drivers/dma/dw/core.c index 1022c2e1a2b0..cf1c87fa1edd 100644 --- a/drivers/dma/dw/core.c +++ b/drivers/dma/dw/core.c | |||
| @@ -1746,4 +1746,4 @@ EXPORT_SYMBOL_GPL(dw_dma_enable); | |||
| 1746 | MODULE_LICENSE("GPL v2"); | 1746 | MODULE_LICENSE("GPL v2"); |
| 1747 | MODULE_DESCRIPTION("Synopsys DesignWare DMA Controller core driver"); | 1747 | MODULE_DESCRIPTION("Synopsys DesignWare DMA Controller core driver"); |
| 1748 | MODULE_AUTHOR("Haavard Skinnemoen (Atmel)"); | 1748 | MODULE_AUTHOR("Haavard Skinnemoen (Atmel)"); |
| 1749 | MODULE_AUTHOR("Viresh Kumar <viresh.linux@gmail.com>"); | 1749 | MODULE_AUTHOR("Viresh Kumar <vireshk@kernel.org>"); |
diff --git a/drivers/gpio/gpio-brcmstb.c b/drivers/gpio/gpio-brcmstb.c index 7a3cb1fa0a76..4630a8133ea6 100644 --- a/drivers/gpio/gpio-brcmstb.c +++ b/drivers/gpio/gpio-brcmstb.c | |||
| @@ -87,6 +87,15 @@ static int brcmstb_gpio_remove(struct platform_device *pdev) | |||
| 87 | struct brcmstb_gpio_bank *bank; | 87 | struct brcmstb_gpio_bank *bank; |
| 88 | int ret = 0; | 88 | int ret = 0; |
| 89 | 89 | ||
| 90 | if (!priv) { | ||
| 91 | dev_err(&pdev->dev, "called %s without drvdata!\n", __func__); | ||
| 92 | return -EFAULT; | ||
| 93 | } | ||
| 94 | |||
| 95 | /* | ||
| 96 | * You can lose return values below, but we report all errors, and it's | ||
| 97 | * more important to actually perform all of the steps. | ||
| 98 | */ | ||
| 90 | list_for_each(pos, &priv->bank_list) { | 99 | list_for_each(pos, &priv->bank_list) { |
| 91 | bank = list_entry(pos, struct brcmstb_gpio_bank, node); | 100 | bank = list_entry(pos, struct brcmstb_gpio_bank, node); |
| 92 | ret = bgpio_remove(&bank->bgc); | 101 | ret = bgpio_remove(&bank->bgc); |
| @@ -143,6 +152,8 @@ static int brcmstb_gpio_probe(struct platform_device *pdev) | |||
| 143 | priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); | 152 | priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); |
| 144 | if (!priv) | 153 | if (!priv) |
| 145 | return -ENOMEM; | 154 | return -ENOMEM; |
| 155 | platform_set_drvdata(pdev, priv); | ||
| 156 | INIT_LIST_HEAD(&priv->bank_list); | ||
| 146 | 157 | ||
| 147 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 158 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 148 | reg_base = devm_ioremap_resource(dev, res); | 159 | reg_base = devm_ioremap_resource(dev, res); |
| @@ -153,7 +164,6 @@ static int brcmstb_gpio_probe(struct platform_device *pdev) | |||
| 153 | priv->reg_base = reg_base; | 164 | priv->reg_base = reg_base; |
| 154 | priv->pdev = pdev; | 165 | priv->pdev = pdev; |
| 155 | 166 | ||
| 156 | INIT_LIST_HEAD(&priv->bank_list); | ||
| 157 | if (brcmstb_gpio_sanity_check_banks(dev, np, res)) | 167 | if (brcmstb_gpio_sanity_check_banks(dev, np, res)) |
| 158 | return -EINVAL; | 168 | return -EINVAL; |
| 159 | 169 | ||
| @@ -221,8 +231,6 @@ static int brcmstb_gpio_probe(struct platform_device *pdev) | |||
| 221 | dev_info(dev, "Registered %d banks (GPIO(s): %d-%d)\n", | 231 | dev_info(dev, "Registered %d banks (GPIO(s): %d-%d)\n", |
| 222 | priv->num_banks, priv->gpio_base, gpio_base - 1); | 232 | priv->num_banks, priv->gpio_base, gpio_base - 1); |
| 223 | 233 | ||
| 224 | platform_set_drvdata(pdev, priv); | ||
| 225 | |||
| 226 | return 0; | 234 | return 0; |
| 227 | 235 | ||
| 228 | fail: | 236 | fail: |
diff --git a/drivers/gpio/gpio-davinci.c b/drivers/gpio/gpio-davinci.c index c5e05c82d67c..c246ac3dda7c 100644 --- a/drivers/gpio/gpio-davinci.c +++ b/drivers/gpio/gpio-davinci.c | |||
| @@ -578,15 +578,13 @@ static int davinci_gpio_irq_setup(struct platform_device *pdev) | |||
| 578 | writel_relaxed(~0, &g->clr_falling); | 578 | writel_relaxed(~0, &g->clr_falling); |
| 579 | writel_relaxed(~0, &g->clr_rising); | 579 | writel_relaxed(~0, &g->clr_rising); |
| 580 | 580 | ||
| 581 | /* set up all irqs in this bank */ | ||
| 582 | irq_set_chained_handler(bank_irq, gpio_irq_handler); | ||
| 583 | |||
| 584 | /* | 581 | /* |
| 585 | * Each chip handles 32 gpios, and each irq bank consists of 16 | 582 | * Each chip handles 32 gpios, and each irq bank consists of 16 |
| 586 | * gpio irqs. Pass the irq bank's corresponding controller to | 583 | * gpio irqs. Pass the irq bank's corresponding controller to |
| 587 | * the chained irq handler. | 584 | * the chained irq handler. |
| 588 | */ | 585 | */ |
| 589 | irq_set_handler_data(bank_irq, &chips[gpio / 32]); | 586 | irq_set_chained_handler_and_data(bank_irq, gpio_irq_handler, |
| 587 | &chips[gpio / 32]); | ||
| 590 | 588 | ||
| 591 | binten |= BIT(bank); | 589 | binten |= BIT(bank); |
| 592 | } | 590 | } |
diff --git a/drivers/gpio/gpio-max732x.c b/drivers/gpio/gpio-max732x.c index aed4ca9338bc..7d3c90e9da71 100644 --- a/drivers/gpio/gpio-max732x.c +++ b/drivers/gpio/gpio-max732x.c | |||
| @@ -603,6 +603,7 @@ static int max732x_setup_gpio(struct max732x_chip *chip, | |||
| 603 | gc->base = gpio_start; | 603 | gc->base = gpio_start; |
| 604 | gc->ngpio = port; | 604 | gc->ngpio = port; |
| 605 | gc->label = chip->client->name; | 605 | gc->label = chip->client->name; |
| 606 | gc->dev = &chip->client->dev; | ||
| 606 | gc->owner = THIS_MODULE; | 607 | gc->owner = THIS_MODULE; |
| 607 | 608 | ||
| 608 | return port; | 609 | return port; |
diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c index b0c57d505be7..61a731ff9a07 100644 --- a/drivers/gpio/gpio-omap.c +++ b/drivers/gpio/gpio-omap.c | |||
| @@ -500,8 +500,10 @@ static int omap_gpio_irq_type(struct irq_data *d, unsigned type) | |||
| 500 | 500 | ||
| 501 | spin_lock_irqsave(&bank->lock, flags); | 501 | spin_lock_irqsave(&bank->lock, flags); |
| 502 | retval = omap_set_gpio_triggering(bank, offset, type); | 502 | retval = omap_set_gpio_triggering(bank, offset, type); |
| 503 | if (retval) | 503 | if (retval) { |
| 504 | spin_unlock_irqrestore(&bank->lock, flags); | ||
| 504 | goto error; | 505 | goto error; |
| 506 | } | ||
| 505 | omap_gpio_init_irq(bank, offset); | 507 | omap_gpio_init_irq(bank, offset); |
| 506 | if (!omap_gpio_is_input(bank, offset)) { | 508 | if (!omap_gpio_is_input(bank, offset)) { |
| 507 | spin_unlock_irqrestore(&bank->lock, flags); | 509 | spin_unlock_irqrestore(&bank->lock, flags); |
| @@ -1185,6 +1187,7 @@ static int omap_gpio_probe(struct platform_device *pdev) | |||
| 1185 | bank->irq = res->start; | 1187 | bank->irq = res->start; |
| 1186 | bank->dev = dev; | 1188 | bank->dev = dev; |
| 1187 | bank->chip.dev = dev; | 1189 | bank->chip.dev = dev; |
| 1190 | bank->chip.owner = THIS_MODULE; | ||
| 1188 | bank->dbck_flag = pdata->dbck_flag; | 1191 | bank->dbck_flag = pdata->dbck_flag; |
| 1189 | bank->stride = pdata->bank_stride; | 1192 | bank->stride = pdata->bank_stride; |
| 1190 | bank->width = pdata->bank_width; | 1193 | bank->width = pdata->bank_width; |
diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c index d233eb3b8132..50caeb1ee350 100644 --- a/drivers/gpio/gpio-pca953x.c +++ b/drivers/gpio/gpio-pca953x.c | |||
| @@ -570,6 +570,10 @@ static int pca953x_irq_setup(struct pca953x_chip *chip, | |||
| 570 | "could not connect irqchip to gpiochip\n"); | 570 | "could not connect irqchip to gpiochip\n"); |
| 571 | return ret; | 571 | return ret; |
| 572 | } | 572 | } |
| 573 | |||
| 574 | gpiochip_set_chained_irqchip(&chip->gpio_chip, | ||
| 575 | &pca953x_irq_chip, | ||
| 576 | client->irq, NULL); | ||
| 573 | } | 577 | } |
| 574 | 578 | ||
| 575 | return 0; | 579 | return 0; |
diff --git a/drivers/gpio/gpio-xilinx.c b/drivers/gpio/gpio-xilinx.c index 77fe5d3cb105..d5284dfe01fe 100644 --- a/drivers/gpio/gpio-xilinx.c +++ b/drivers/gpio/gpio-xilinx.c | |||
| @@ -220,9 +220,9 @@ static void xgpio_save_regs(struct of_mm_gpio_chip *mm_gc) | |||
| 220 | if (!chip->gpio_width[1]) | 220 | if (!chip->gpio_width[1]) |
| 221 | return; | 221 | return; |
| 222 | 222 | ||
| 223 | xgpio_writereg(mm_gc->regs + XGPIO_DATA_OFFSET + XGPIO_TRI_OFFSET, | 223 | xgpio_writereg(mm_gc->regs + XGPIO_DATA_OFFSET + XGPIO_CHANNEL_OFFSET, |
| 224 | chip->gpio_state[1]); | 224 | chip->gpio_state[1]); |
| 225 | xgpio_writereg(mm_gc->regs + XGPIO_TRI_OFFSET + XGPIO_TRI_OFFSET, | 225 | xgpio_writereg(mm_gc->regs + XGPIO_TRI_OFFSET + XGPIO_CHANNEL_OFFSET, |
| 226 | chip->gpio_dir[1]); | 226 | chip->gpio_dir[1]); |
| 227 | } | 227 | } |
| 228 | 228 | ||
diff --git a/drivers/gpio/gpio-zynq.c b/drivers/gpio/gpio-zynq.c index 2e87c4b8da26..a78882389836 100644 --- a/drivers/gpio/gpio-zynq.c +++ b/drivers/gpio/gpio-zynq.c | |||
| @@ -757,6 +757,7 @@ static int zynq_gpio_remove(struct platform_device *pdev) | |||
| 757 | gpiochip_remove(&gpio->chip); | 757 | gpiochip_remove(&gpio->chip); |
| 758 | clk_disable_unprepare(gpio->clk); | 758 | clk_disable_unprepare(gpio->clk); |
| 759 | device_set_wakeup_capable(&pdev->dev, 0); | 759 | device_set_wakeup_capable(&pdev->dev, 0); |
| 760 | pm_runtime_disable(&pdev->dev); | ||
| 760 | return 0; | 761 | return 0; |
| 761 | } | 762 | } |
| 762 | 763 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c index d63135bf29c0..1f040d85ac47 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | |||
| @@ -669,6 +669,7 @@ static int amdgpu_cs_ib_fill(struct amdgpu_device *adev, | |||
| 669 | static int amdgpu_cs_dependencies(struct amdgpu_device *adev, | 669 | static int amdgpu_cs_dependencies(struct amdgpu_device *adev, |
| 670 | struct amdgpu_cs_parser *p) | 670 | struct amdgpu_cs_parser *p) |
| 671 | { | 671 | { |
| 672 | struct amdgpu_fpriv *fpriv = p->filp->driver_priv; | ||
| 672 | struct amdgpu_ib *ib; | 673 | struct amdgpu_ib *ib; |
| 673 | int i, j, r; | 674 | int i, j, r; |
| 674 | 675 | ||
| @@ -694,6 +695,7 @@ static int amdgpu_cs_dependencies(struct amdgpu_device *adev, | |||
| 694 | for (j = 0; j < num_deps; ++j) { | 695 | for (j = 0; j < num_deps; ++j) { |
| 695 | struct amdgpu_fence *fence; | 696 | struct amdgpu_fence *fence; |
| 696 | struct amdgpu_ring *ring; | 697 | struct amdgpu_ring *ring; |
| 698 | struct amdgpu_ctx *ctx; | ||
| 697 | 699 | ||
| 698 | r = amdgpu_cs_get_ring(adev, deps[j].ip_type, | 700 | r = amdgpu_cs_get_ring(adev, deps[j].ip_type, |
| 699 | deps[j].ip_instance, | 701 | deps[j].ip_instance, |
| @@ -701,14 +703,21 @@ static int amdgpu_cs_dependencies(struct amdgpu_device *adev, | |||
| 701 | if (r) | 703 | if (r) |
| 702 | return r; | 704 | return r; |
| 703 | 705 | ||
| 706 | ctx = amdgpu_ctx_get(fpriv, deps[j].ctx_id); | ||
| 707 | if (ctx == NULL) | ||
| 708 | return -EINVAL; | ||
| 709 | |||
| 704 | r = amdgpu_fence_recreate(ring, p->filp, | 710 | r = amdgpu_fence_recreate(ring, p->filp, |
| 705 | deps[j].handle, | 711 | deps[j].handle, |
| 706 | &fence); | 712 | &fence); |
| 707 | if (r) | 713 | if (r) { |
| 714 | amdgpu_ctx_put(ctx); | ||
| 708 | return r; | 715 | return r; |
| 716 | } | ||
| 709 | 717 | ||
| 710 | amdgpu_sync_fence(&ib->sync, fence); | 718 | amdgpu_sync_fence(&ib->sync, fence); |
| 711 | amdgpu_fence_unref(&fence); | 719 | amdgpu_fence_unref(&fence); |
| 720 | amdgpu_ctx_put(ctx); | ||
| 712 | } | 721 | } |
| 713 | } | 722 | } |
| 714 | 723 | ||
| @@ -808,12 +817,16 @@ int amdgpu_cs_wait_ioctl(struct drm_device *dev, void *data, | |||
| 808 | 817 | ||
| 809 | r = amdgpu_cs_get_ring(adev, wait->in.ip_type, wait->in.ip_instance, | 818 | r = amdgpu_cs_get_ring(adev, wait->in.ip_type, wait->in.ip_instance, |
| 810 | wait->in.ring, &ring); | 819 | wait->in.ring, &ring); |
| 811 | if (r) | 820 | if (r) { |
| 821 | amdgpu_ctx_put(ctx); | ||
| 812 | return r; | 822 | return r; |
| 823 | } | ||
| 813 | 824 | ||
| 814 | r = amdgpu_fence_recreate(ring, filp, wait->in.handle, &fence); | 825 | r = amdgpu_fence_recreate(ring, filp, wait->in.handle, &fence); |
| 815 | if (r) | 826 | if (r) { |
| 827 | amdgpu_ctx_put(ctx); | ||
| 816 | return r; | 828 | return r; |
| 829 | } | ||
| 817 | 830 | ||
| 818 | r = fence_wait_timeout(&fence->base, true, timeout); | 831 | r = fence_wait_timeout(&fence->base, true, timeout); |
| 819 | amdgpu_fence_unref(&fence); | 832 | amdgpu_fence_unref(&fence); |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index ba46be361c9b..d79009b65867 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | |||
| @@ -1207,10 +1207,15 @@ static int amdgpu_early_init(struct amdgpu_device *adev) | |||
| 1207 | } else { | 1207 | } else { |
| 1208 | if (adev->ip_blocks[i].funcs->early_init) { | 1208 | if (adev->ip_blocks[i].funcs->early_init) { |
| 1209 | r = adev->ip_blocks[i].funcs->early_init((void *)adev); | 1209 | r = adev->ip_blocks[i].funcs->early_init((void *)adev); |
| 1210 | if (r) | 1210 | if (r == -ENOENT) |
| 1211 | adev->ip_block_enabled[i] = false; | ||
| 1212 | else if (r) | ||
| 1211 | return r; | 1213 | return r; |
| 1214 | else | ||
| 1215 | adev->ip_block_enabled[i] = true; | ||
| 1216 | } else { | ||
| 1217 | adev->ip_block_enabled[i] = true; | ||
| 1212 | } | 1218 | } |
| 1213 | adev->ip_block_enabled[i] = true; | ||
| 1214 | } | 1219 | } |
| 1215 | } | 1220 | } |
| 1216 | 1221 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/cz_dpm.c b/drivers/gpu/drm/amd/amdgpu/cz_dpm.c index f75a31df30bd..1a2d419cbf16 100644 --- a/drivers/gpu/drm/amd/amdgpu/cz_dpm.c +++ b/drivers/gpu/drm/amd/amdgpu/cz_dpm.c | |||
| @@ -1679,25 +1679,31 @@ static int cz_dpm_unforce_dpm_levels(struct amdgpu_device *adev) | |||
| 1679 | if (ret) | 1679 | if (ret) |
| 1680 | return ret; | 1680 | return ret; |
| 1681 | 1681 | ||
| 1682 | DRM_INFO("DPM unforce state min=%d, max=%d.\n", | 1682 | DRM_DEBUG("DPM unforce state min=%d, max=%d.\n", |
| 1683 | pi->sclk_dpm.soft_min_clk, | 1683 | pi->sclk_dpm.soft_min_clk, |
| 1684 | pi->sclk_dpm.soft_max_clk); | 1684 | pi->sclk_dpm.soft_max_clk); |
| 1685 | 1685 | ||
| 1686 | return 0; | 1686 | return 0; |
| 1687 | } | 1687 | } |
| 1688 | 1688 | ||
| 1689 | static int cz_dpm_force_dpm_level(struct amdgpu_device *adev, | 1689 | static int cz_dpm_force_dpm_level(struct amdgpu_device *adev, |
| 1690 | enum amdgpu_dpm_forced_level level) | 1690 | enum amdgpu_dpm_forced_level level) |
| 1691 | { | 1691 | { |
| 1692 | int ret = 0; | 1692 | int ret = 0; |
| 1693 | 1693 | ||
| 1694 | switch (level) { | 1694 | switch (level) { |
| 1695 | case AMDGPU_DPM_FORCED_LEVEL_HIGH: | 1695 | case AMDGPU_DPM_FORCED_LEVEL_HIGH: |
| 1696 | ret = cz_dpm_unforce_dpm_levels(adev); | ||
| 1697 | if (ret) | ||
| 1698 | return ret; | ||
| 1696 | ret = cz_dpm_force_highest(adev); | 1699 | ret = cz_dpm_force_highest(adev); |
| 1697 | if (ret) | 1700 | if (ret) |
| 1698 | return ret; | 1701 | return ret; |
| 1699 | break; | 1702 | break; |
| 1700 | case AMDGPU_DPM_FORCED_LEVEL_LOW: | 1703 | case AMDGPU_DPM_FORCED_LEVEL_LOW: |
| 1704 | ret = cz_dpm_unforce_dpm_levels(adev); | ||
| 1705 | if (ret) | ||
| 1706 | return ret; | ||
| 1701 | ret = cz_dpm_force_lowest(adev); | 1707 | ret = cz_dpm_force_lowest(adev); |
| 1702 | if (ret) | 1708 | if (ret) |
| 1703 | return ret; | 1709 | return ret; |
| @@ -1711,6 +1717,8 @@ static int cz_dpm_force_dpm_level(struct amdgpu_device *adev, | |||
| 1711 | break; | 1717 | break; |
| 1712 | } | 1718 | } |
| 1713 | 1719 | ||
| 1720 | adev->pm.dpm.forced_level = level; | ||
| 1721 | |||
| 1714 | return ret; | 1722 | return ret; |
| 1715 | } | 1723 | } |
| 1716 | 1724 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c index 08387dfd98a7..cc050a329c49 100644 --- a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c | |||
| @@ -2566,6 +2566,7 @@ static void dce_v8_0_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
| 2566 | struct drm_device *dev = crtc->dev; | 2566 | struct drm_device *dev = crtc->dev; |
| 2567 | struct amdgpu_device *adev = dev->dev_private; | 2567 | struct amdgpu_device *adev = dev->dev_private; |
| 2568 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); | 2568 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); |
| 2569 | unsigned type; | ||
| 2569 | 2570 | ||
| 2570 | switch (mode) { | 2571 | switch (mode) { |
| 2571 | case DRM_MODE_DPMS_ON: | 2572 | case DRM_MODE_DPMS_ON: |
| @@ -2574,6 +2575,9 @@ static void dce_v8_0_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
| 2574 | dce_v8_0_vga_enable(crtc, true); | 2575 | dce_v8_0_vga_enable(crtc, true); |
| 2575 | amdgpu_atombios_crtc_blank(crtc, ATOM_DISABLE); | 2576 | amdgpu_atombios_crtc_blank(crtc, ATOM_DISABLE); |
| 2576 | dce_v8_0_vga_enable(crtc, false); | 2577 | dce_v8_0_vga_enable(crtc, false); |
| 2578 | /* Make sure VBLANK interrupt is still enabled */ | ||
| 2579 | type = amdgpu_crtc_idx_to_irq_type(adev, amdgpu_crtc->crtc_id); | ||
| 2580 | amdgpu_irq_update(adev, &adev->crtc_irq, type); | ||
| 2577 | drm_vblank_post_modeset(dev, amdgpu_crtc->crtc_id); | 2581 | drm_vblank_post_modeset(dev, amdgpu_crtc->crtc_id); |
| 2578 | dce_v8_0_crtc_load_lut(crtc); | 2582 | dce_v8_0_crtc_load_lut(crtc); |
| 2579 | break; | 2583 | break; |
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c index 7b683fb2173c..1c7c992dea37 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | |||
| @@ -1813,10 +1813,7 @@ static u32 gfx_v8_0_get_rb_disabled(struct amdgpu_device *adev, | |||
| 1813 | u32 data, mask; | 1813 | u32 data, mask; |
| 1814 | 1814 | ||
| 1815 | data = RREG32(mmCC_RB_BACKEND_DISABLE); | 1815 | data = RREG32(mmCC_RB_BACKEND_DISABLE); |
| 1816 | if (data & 1) | 1816 | data &= CC_RB_BACKEND_DISABLE__BACKEND_DISABLE_MASK; |
| 1817 | data &= CC_RB_BACKEND_DISABLE__BACKEND_DISABLE_MASK; | ||
| 1818 | else | ||
| 1819 | data = 0; | ||
| 1820 | 1817 | ||
| 1821 | data |= RREG32(mmGC_USER_RB_BACKEND_DISABLE); | 1818 | data |= RREG32(mmGC_USER_RB_BACKEND_DISABLE); |
| 1822 | 1819 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/vi.c b/drivers/gpu/drm/amd/amdgpu/vi.c index fa5a4448531d..68552da40287 100644 --- a/drivers/gpu/drm/amd/amdgpu/vi.c +++ b/drivers/gpu/drm/amd/amdgpu/vi.c | |||
| @@ -122,6 +122,32 @@ static void vi_smc_wreg(struct amdgpu_device *adev, u32 reg, u32 v) | |||
| 122 | spin_unlock_irqrestore(&adev->smc_idx_lock, flags); | 122 | spin_unlock_irqrestore(&adev->smc_idx_lock, flags); |
| 123 | } | 123 | } |
| 124 | 124 | ||
| 125 | /* smu_8_0_d.h */ | ||
| 126 | #define mmMP0PUB_IND_INDEX 0x180 | ||
| 127 | #define mmMP0PUB_IND_DATA 0x181 | ||
| 128 | |||
| 129 | static u32 cz_smc_rreg(struct amdgpu_device *adev, u32 reg) | ||
| 130 | { | ||
| 131 | unsigned long flags; | ||
| 132 | u32 r; | ||
| 133 | |||
| 134 | spin_lock_irqsave(&adev->smc_idx_lock, flags); | ||
| 135 | WREG32(mmMP0PUB_IND_INDEX, (reg)); | ||
| 136 | r = RREG32(mmMP0PUB_IND_DATA); | ||
| 137 | spin_unlock_irqrestore(&adev->smc_idx_lock, flags); | ||
| 138 | return r; | ||
| 139 | } | ||
| 140 | |||
| 141 | static void cz_smc_wreg(struct amdgpu_device *adev, u32 reg, u32 v) | ||
| 142 | { | ||
| 143 | unsigned long flags; | ||
| 144 | |||
| 145 | spin_lock_irqsave(&adev->smc_idx_lock, flags); | ||
| 146 | WREG32(mmMP0PUB_IND_INDEX, (reg)); | ||
| 147 | WREG32(mmMP0PUB_IND_DATA, (v)); | ||
| 148 | spin_unlock_irqrestore(&adev->smc_idx_lock, flags); | ||
| 149 | } | ||
| 150 | |||
| 125 | static u32 vi_uvd_ctx_rreg(struct amdgpu_device *adev, u32 reg) | 151 | static u32 vi_uvd_ctx_rreg(struct amdgpu_device *adev, u32 reg) |
| 126 | { | 152 | { |
| 127 | unsigned long flags; | 153 | unsigned long flags; |
| @@ -1222,8 +1248,13 @@ static int vi_common_early_init(void *handle) | |||
| 1222 | bool smc_enabled = false; | 1248 | bool smc_enabled = false; |
| 1223 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | 1249 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
| 1224 | 1250 | ||
| 1225 | adev->smc_rreg = &vi_smc_rreg; | 1251 | if (adev->flags & AMDGPU_IS_APU) { |
| 1226 | adev->smc_wreg = &vi_smc_wreg; | 1252 | adev->smc_rreg = &cz_smc_rreg; |
| 1253 | adev->smc_wreg = &cz_smc_wreg; | ||
| 1254 | } else { | ||
| 1255 | adev->smc_rreg = &vi_smc_rreg; | ||
| 1256 | adev->smc_wreg = &vi_smc_wreg; | ||
| 1257 | } | ||
| 1227 | adev->pcie_rreg = &vi_pcie_rreg; | 1258 | adev->pcie_rreg = &vi_pcie_rreg; |
| 1228 | adev->pcie_wreg = &vi_pcie_wreg; | 1259 | adev->pcie_wreg = &vi_pcie_wreg; |
| 1229 | adev->uvd_ctx_rreg = &vi_uvd_ctx_rreg; | 1260 | adev->uvd_ctx_rreg = &vi_uvd_ctx_rreg; |
diff --git a/drivers/gpu/drm/armada/armada_crtc.c b/drivers/gpu/drm/armada/armada_crtc.c index 42d2ffa08716..01ffe9bffe38 100644 --- a/drivers/gpu/drm/armada/armada_crtc.c +++ b/drivers/gpu/drm/armada/armada_crtc.c | |||
| @@ -531,8 +531,6 @@ static int armada_drm_crtc_mode_set(struct drm_crtc *crtc, | |||
| 531 | 531 | ||
| 532 | drm_crtc_vblank_off(crtc); | 532 | drm_crtc_vblank_off(crtc); |
| 533 | 533 | ||
| 534 | crtc->mode = *adj; | ||
| 535 | |||
| 536 | val = dcrtc->dumb_ctrl & ~CFG_DUMB_ENA; | 534 | val = dcrtc->dumb_ctrl & ~CFG_DUMB_ENA; |
| 537 | if (val != dcrtc->dumb_ctrl) { | 535 | if (val != dcrtc->dumb_ctrl) { |
| 538 | dcrtc->dumb_ctrl = val; | 536 | dcrtc->dumb_ctrl = val; |
diff --git a/drivers/gpu/drm/armada/armada_gem.c b/drivers/gpu/drm/armada/armada_gem.c index 580e10acaa3a..60a688ef81c7 100644 --- a/drivers/gpu/drm/armada/armada_gem.c +++ b/drivers/gpu/drm/armada/armada_gem.c | |||
| @@ -69,8 +69,9 @@ void armada_gem_free_object(struct drm_gem_object *obj) | |||
| 69 | 69 | ||
| 70 | if (dobj->obj.import_attach) { | 70 | if (dobj->obj.import_attach) { |
| 71 | /* We only ever display imported data */ | 71 | /* We only ever display imported data */ |
| 72 | dma_buf_unmap_attachment(dobj->obj.import_attach, dobj->sgt, | 72 | if (dobj->sgt) |
| 73 | DMA_TO_DEVICE); | 73 | dma_buf_unmap_attachment(dobj->obj.import_attach, |
| 74 | dobj->sgt, DMA_TO_DEVICE); | ||
| 74 | drm_prime_gem_destroy(&dobj->obj, NULL); | 75 | drm_prime_gem_destroy(&dobj->obj, NULL); |
| 75 | } | 76 | } |
| 76 | 77 | ||
diff --git a/drivers/gpu/drm/armada/armada_overlay.c b/drivers/gpu/drm/armada/armada_overlay.c index c5b06fdb459c..e939faba7fcc 100644 --- a/drivers/gpu/drm/armada/armada_overlay.c +++ b/drivers/gpu/drm/armada/armada_overlay.c | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | * published by the Free Software Foundation. | 7 | * published by the Free Software Foundation. |
| 8 | */ | 8 | */ |
| 9 | #include <drm/drmP.h> | 9 | #include <drm/drmP.h> |
| 10 | #include <drm/drm_plane_helper.h> | ||
| 10 | #include "armada_crtc.h" | 11 | #include "armada_crtc.h" |
| 11 | #include "armada_drm.h" | 12 | #include "armada_drm.h" |
| 12 | #include "armada_fb.h" | 13 | #include "armada_fb.h" |
| @@ -85,16 +86,8 @@ static void armada_plane_vbl(struct armada_crtc *dcrtc, void *data) | |||
| 85 | 86 | ||
| 86 | if (fb) | 87 | if (fb) |
| 87 | armada_drm_queue_unref_work(dcrtc->crtc.dev, fb); | 88 | armada_drm_queue_unref_work(dcrtc->crtc.dev, fb); |
| 88 | } | ||
| 89 | 89 | ||
| 90 | static unsigned armada_limit(int start, unsigned size, unsigned max) | 90 | wake_up(&dplane->vbl.wait); |
| 91 | { | ||
| 92 | int end = start + size; | ||
| 93 | if (end < 0) | ||
| 94 | return 0; | ||
| 95 | if (start < 0) | ||
| 96 | start = 0; | ||
| 97 | return (unsigned)end > max ? max - start : end - start; | ||
| 98 | } | 91 | } |
| 99 | 92 | ||
| 100 | static int | 93 | static int |
| @@ -105,26 +98,39 @@ armada_plane_update(struct drm_plane *plane, struct drm_crtc *crtc, | |||
| 105 | { | 98 | { |
| 106 | struct armada_plane *dplane = drm_to_armada_plane(plane); | 99 | struct armada_plane *dplane = drm_to_armada_plane(plane); |
| 107 | struct armada_crtc *dcrtc = drm_to_armada_crtc(crtc); | 100 | struct armada_crtc *dcrtc = drm_to_armada_crtc(crtc); |
| 101 | struct drm_rect src = { | ||
| 102 | .x1 = src_x, | ||
| 103 | .y1 = src_y, | ||
| 104 | .x2 = src_x + src_w, | ||
| 105 | .y2 = src_y + src_h, | ||
| 106 | }; | ||
| 107 | struct drm_rect dest = { | ||
| 108 | .x1 = crtc_x, | ||
| 109 | .y1 = crtc_y, | ||
| 110 | .x2 = crtc_x + crtc_w, | ||
| 111 | .y2 = crtc_y + crtc_h, | ||
| 112 | }; | ||
| 113 | const struct drm_rect clip = { | ||
| 114 | .x2 = crtc->mode.hdisplay, | ||
| 115 | .y2 = crtc->mode.vdisplay, | ||
| 116 | }; | ||
| 108 | uint32_t val, ctrl0; | 117 | uint32_t val, ctrl0; |
| 109 | unsigned idx = 0; | 118 | unsigned idx = 0; |
| 119 | bool visible; | ||
| 110 | int ret; | 120 | int ret; |
| 111 | 121 | ||
| 112 | crtc_w = armada_limit(crtc_x, crtc_w, dcrtc->crtc.mode.hdisplay); | 122 | ret = drm_plane_helper_check_update(plane, crtc, fb, &src, &dest, &clip, |
| 113 | crtc_h = armada_limit(crtc_y, crtc_h, dcrtc->crtc.mode.vdisplay); | 123 | 0, INT_MAX, true, false, &visible); |
| 124 | if (ret) | ||
| 125 | return ret; | ||
| 126 | |||
| 114 | ctrl0 = CFG_DMA_FMT(drm_fb_to_armada_fb(fb)->fmt) | | 127 | ctrl0 = CFG_DMA_FMT(drm_fb_to_armada_fb(fb)->fmt) | |
| 115 | CFG_DMA_MOD(drm_fb_to_armada_fb(fb)->mod) | | 128 | CFG_DMA_MOD(drm_fb_to_armada_fb(fb)->mod) | |
| 116 | CFG_CBSH_ENA | CFG_DMA_HSMOOTH | CFG_DMA_ENA; | 129 | CFG_CBSH_ENA | CFG_DMA_HSMOOTH | CFG_DMA_ENA; |
| 117 | 130 | ||
| 118 | /* Does the position/size result in nothing to display? */ | 131 | /* Does the position/size result in nothing to display? */ |
| 119 | if (crtc_w == 0 || crtc_h == 0) { | 132 | if (!visible) |
| 120 | ctrl0 &= ~CFG_DMA_ENA; | 133 | ctrl0 &= ~CFG_DMA_ENA; |
| 121 | } | ||
| 122 | |||
| 123 | /* | ||
| 124 | * FIXME: if the starting point is off screen, we need to | ||
| 125 | * adjust src_x, src_y, src_w, src_h appropriately, and | ||
| 126 | * according to the scale. | ||
| 127 | */ | ||
| 128 | 134 | ||
| 129 | if (!dcrtc->plane) { | 135 | if (!dcrtc->plane) { |
| 130 | dcrtc->plane = plane; | 136 | dcrtc->plane = plane; |
| @@ -134,15 +140,19 @@ armada_plane_update(struct drm_plane *plane, struct drm_crtc *crtc, | |||
| 134 | /* FIXME: overlay on an interlaced display */ | 140 | /* FIXME: overlay on an interlaced display */ |
| 135 | /* Just updating the position/size? */ | 141 | /* Just updating the position/size? */ |
| 136 | if (plane->fb == fb && dplane->ctrl0 == ctrl0) { | 142 | if (plane->fb == fb && dplane->ctrl0 == ctrl0) { |
| 137 | val = (src_h & 0xffff0000) | src_w >> 16; | 143 | val = (drm_rect_height(&src) & 0xffff0000) | |
| 144 | drm_rect_width(&src) >> 16; | ||
| 138 | dplane->src_hw = val; | 145 | dplane->src_hw = val; |
| 139 | writel_relaxed(val, dcrtc->base + LCD_SPU_DMA_HPXL_VLN); | 146 | writel_relaxed(val, dcrtc->base + LCD_SPU_DMA_HPXL_VLN); |
| 140 | val = crtc_h << 16 | crtc_w; | 147 | |
| 148 | val = drm_rect_height(&dest) << 16 | drm_rect_width(&dest); | ||
| 141 | dplane->dst_hw = val; | 149 | dplane->dst_hw = val; |
| 142 | writel_relaxed(val, dcrtc->base + LCD_SPU_DZM_HPXL_VLN); | 150 | writel_relaxed(val, dcrtc->base + LCD_SPU_DZM_HPXL_VLN); |
| 143 | val = crtc_y << 16 | crtc_x; | 151 | |
| 152 | val = dest.y1 << 16 | dest.x1; | ||
| 144 | dplane->dst_yx = val; | 153 | dplane->dst_yx = val; |
| 145 | writel_relaxed(val, dcrtc->base + LCD_SPU_DMA_OVSA_HPXL_VLN); | 154 | writel_relaxed(val, dcrtc->base + LCD_SPU_DMA_OVSA_HPXL_VLN); |
| 155 | |||
| 146 | return 0; | 156 | return 0; |
| 147 | } else if (~dplane->ctrl0 & ctrl0 & CFG_DMA_ENA) { | 157 | } else if (~dplane->ctrl0 & ctrl0 & CFG_DMA_ENA) { |
| 148 | /* Power up the Y/U/V FIFOs on ENA 0->1 transitions */ | 158 | /* Power up the Y/U/V FIFOs on ENA 0->1 transitions */ |
| @@ -150,15 +160,14 @@ armada_plane_update(struct drm_plane *plane, struct drm_crtc *crtc, | |||
| 150 | dcrtc->base + LCD_SPU_SRAM_PARA1); | 160 | dcrtc->base + LCD_SPU_SRAM_PARA1); |
| 151 | } | 161 | } |
| 152 | 162 | ||
| 153 | ret = wait_event_timeout(dplane->vbl.wait, | 163 | wait_event_timeout(dplane->vbl.wait, |
| 154 | list_empty(&dplane->vbl.update.node), | 164 | list_empty(&dplane->vbl.update.node), |
| 155 | HZ/25); | 165 | HZ/25); |
| 156 | if (ret < 0) | ||
| 157 | return ret; | ||
| 158 | 166 | ||
| 159 | if (plane->fb != fb) { | 167 | if (plane->fb != fb) { |
| 160 | struct armada_gem_object *obj = drm_fb_obj(fb); | 168 | struct armada_gem_object *obj = drm_fb_obj(fb); |
| 161 | uint32_t sy, su, sv; | 169 | uint32_t addr[3], pixel_format; |
| 170 | int i, num_planes, hsub; | ||
| 162 | 171 | ||
| 163 | /* | 172 | /* |
| 164 | * Take a reference on the new framebuffer - we want to | 173 | * Take a reference on the new framebuffer - we want to |
| @@ -178,26 +187,39 @@ armada_plane_update(struct drm_plane *plane, struct drm_crtc *crtc, | |||
| 178 | older_fb); | 187 | older_fb); |
| 179 | } | 188 | } |
| 180 | 189 | ||
| 181 | src_y >>= 16; | 190 | src_y = src.y1 >> 16; |
| 182 | src_x >>= 16; | 191 | src_x = src.x1 >> 16; |
| 183 | sy = obj->dev_addr + fb->offsets[0] + src_y * fb->pitches[0] + | ||
| 184 | src_x * fb->bits_per_pixel / 8; | ||
| 185 | su = obj->dev_addr + fb->offsets[1] + src_y * fb->pitches[1] + | ||
| 186 | src_x; | ||
| 187 | sv = obj->dev_addr + fb->offsets[2] + src_y * fb->pitches[2] + | ||
| 188 | src_x; | ||
| 189 | 192 | ||
| 190 | armada_reg_queue_set(dplane->vbl.regs, idx, sy, | 193 | pixel_format = fb->pixel_format; |
| 194 | hsub = drm_format_horz_chroma_subsampling(pixel_format); | ||
| 195 | num_planes = drm_format_num_planes(pixel_format); | ||
| 196 | |||
| 197 | /* | ||
| 198 | * Annoyingly, shifting a YUYV-format image by one pixel | ||
| 199 | * causes the U/V planes to toggle. Toggle the UV swap. | ||
| 200 | * (Unfortunately, this causes momentary colour flickering.) | ||
| 201 | */ | ||
| 202 | if (src_x & (hsub - 1) && num_planes == 1) | ||
| 203 | ctrl0 ^= CFG_DMA_MOD(CFG_SWAPUV); | ||
| 204 | |||
| 205 | for (i = 0; i < num_planes; i++) | ||
| 206 | addr[i] = obj->dev_addr + fb->offsets[i] + | ||
| 207 | src_y * fb->pitches[i] + | ||
| 208 | src_x * drm_format_plane_cpp(pixel_format, i); | ||
| 209 | for (; i < ARRAY_SIZE(addr); i++) | ||
| 210 | addr[i] = 0; | ||
| 211 | |||
| 212 | armada_reg_queue_set(dplane->vbl.regs, idx, addr[0], | ||
| 191 | LCD_SPU_DMA_START_ADDR_Y0); | 213 | LCD_SPU_DMA_START_ADDR_Y0); |
| 192 | armada_reg_queue_set(dplane->vbl.regs, idx, su, | 214 | armada_reg_queue_set(dplane->vbl.regs, idx, addr[1], |
| 193 | LCD_SPU_DMA_START_ADDR_U0); | 215 | LCD_SPU_DMA_START_ADDR_U0); |
| 194 | armada_reg_queue_set(dplane->vbl.regs, idx, sv, | 216 | armada_reg_queue_set(dplane->vbl.regs, idx, addr[2], |
| 195 | LCD_SPU_DMA_START_ADDR_V0); | 217 | LCD_SPU_DMA_START_ADDR_V0); |
| 196 | armada_reg_queue_set(dplane->vbl.regs, idx, sy, | 218 | armada_reg_queue_set(dplane->vbl.regs, idx, addr[0], |
| 197 | LCD_SPU_DMA_START_ADDR_Y1); | 219 | LCD_SPU_DMA_START_ADDR_Y1); |
| 198 | armada_reg_queue_set(dplane->vbl.regs, idx, su, | 220 | armada_reg_queue_set(dplane->vbl.regs, idx, addr[1], |
| 199 | LCD_SPU_DMA_START_ADDR_U1); | 221 | LCD_SPU_DMA_START_ADDR_U1); |
| 200 | armada_reg_queue_set(dplane->vbl.regs, idx, sv, | 222 | armada_reg_queue_set(dplane->vbl.regs, idx, addr[2], |
| 201 | LCD_SPU_DMA_START_ADDR_V1); | 223 | LCD_SPU_DMA_START_ADDR_V1); |
| 202 | 224 | ||
| 203 | val = fb->pitches[0] << 16 | fb->pitches[0]; | 225 | val = fb->pitches[0] << 16 | fb->pitches[0]; |
| @@ -208,24 +230,27 @@ armada_plane_update(struct drm_plane *plane, struct drm_crtc *crtc, | |||
| 208 | LCD_SPU_DMA_PITCH_UV); | 230 | LCD_SPU_DMA_PITCH_UV); |
| 209 | } | 231 | } |
| 210 | 232 | ||
| 211 | val = (src_h & 0xffff0000) | src_w >> 16; | 233 | val = (drm_rect_height(&src) & 0xffff0000) | drm_rect_width(&src) >> 16; |
| 212 | if (dplane->src_hw != val) { | 234 | if (dplane->src_hw != val) { |
| 213 | dplane->src_hw = val; | 235 | dplane->src_hw = val; |
| 214 | armada_reg_queue_set(dplane->vbl.regs, idx, val, | 236 | armada_reg_queue_set(dplane->vbl.regs, idx, val, |
| 215 | LCD_SPU_DMA_HPXL_VLN); | 237 | LCD_SPU_DMA_HPXL_VLN); |
| 216 | } | 238 | } |
| 217 | val = crtc_h << 16 | crtc_w; | 239 | |
| 240 | val = drm_rect_height(&dest) << 16 | drm_rect_width(&dest); | ||
| 218 | if (dplane->dst_hw != val) { | 241 | if (dplane->dst_hw != val) { |
| 219 | dplane->dst_hw = val; | 242 | dplane->dst_hw = val; |
| 220 | armada_reg_queue_set(dplane->vbl.regs, idx, val, | 243 | armada_reg_queue_set(dplane->vbl.regs, idx, val, |
| 221 | LCD_SPU_DZM_HPXL_VLN); | 244 | LCD_SPU_DZM_HPXL_VLN); |
| 222 | } | 245 | } |
| 223 | val = crtc_y << 16 | crtc_x; | 246 | |
| 247 | val = dest.y1 << 16 | dest.x1; | ||
| 224 | if (dplane->dst_yx != val) { | 248 | if (dplane->dst_yx != val) { |
| 225 | dplane->dst_yx = val; | 249 | dplane->dst_yx = val; |
| 226 | armada_reg_queue_set(dplane->vbl.regs, idx, val, | 250 | armada_reg_queue_set(dplane->vbl.regs, idx, val, |
| 227 | LCD_SPU_DMA_OVSA_HPXL_VLN); | 251 | LCD_SPU_DMA_OVSA_HPXL_VLN); |
| 228 | } | 252 | } |
| 253 | |||
| 229 | if (dplane->ctrl0 != ctrl0) { | 254 | if (dplane->ctrl0 != ctrl0) { |
| 230 | dplane->ctrl0 = ctrl0; | 255 | dplane->ctrl0 = ctrl0; |
| 231 | armada_reg_queue_mod(dplane->vbl.regs, idx, ctrl0, | 256 | armada_reg_queue_mod(dplane->vbl.regs, idx, ctrl0, |
| @@ -279,7 +304,11 @@ static int armada_plane_disable(struct drm_plane *plane) | |||
| 279 | 304 | ||
| 280 | static void armada_plane_destroy(struct drm_plane *plane) | 305 | static void armada_plane_destroy(struct drm_plane *plane) |
| 281 | { | 306 | { |
| 282 | kfree(plane); | 307 | struct armada_plane *dplane = drm_to_armada_plane(plane); |
| 308 | |||
| 309 | drm_plane_cleanup(plane); | ||
| 310 | |||
| 311 | kfree(dplane); | ||
| 283 | } | 312 | } |
| 284 | 313 | ||
| 285 | static int armada_plane_set_property(struct drm_plane *plane, | 314 | static int armada_plane_set_property(struct drm_plane *plane, |
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index b9ba06176eb1..357bd04a173b 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c | |||
| @@ -2706,8 +2706,11 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data, | |||
| 2706 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | 2706 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
| 2707 | return -EINVAL; | 2707 | return -EINVAL; |
| 2708 | 2708 | ||
| 2709 | /* For some reason crtc x/y offsets are signed internally. */ | 2709 | /* |
| 2710 | if (crtc_req->x > INT_MAX || crtc_req->y > INT_MAX) | 2710 | * Universal plane src offsets are only 16.16, prevent havoc for |
| 2711 | * drivers using universal plane code internally. | ||
| 2712 | */ | ||
| 2713 | if (crtc_req->x & 0xffff0000 || crtc_req->y & 0xffff0000) | ||
| 2711 | return -ERANGE; | 2714 | return -ERANGE; |
| 2712 | 2715 | ||
| 2713 | drm_modeset_lock_all(dev); | 2716 | drm_modeset_lock_all(dev); |
diff --git a/drivers/gpu/drm/drm_ioc32.c b/drivers/gpu/drm/drm_ioc32.c index aa8bbb460c57..9cfcd0aef0df 100644 --- a/drivers/gpu/drm/drm_ioc32.c +++ b/drivers/gpu/drm/drm_ioc32.c | |||
| @@ -70,6 +70,8 @@ | |||
| 70 | 70 | ||
| 71 | #define DRM_IOCTL_WAIT_VBLANK32 DRM_IOWR(0x3a, drm_wait_vblank32_t) | 71 | #define DRM_IOCTL_WAIT_VBLANK32 DRM_IOWR(0x3a, drm_wait_vblank32_t) |
| 72 | 72 | ||
| 73 | #define DRM_IOCTL_MODE_ADDFB232 DRM_IOWR(0xb8, drm_mode_fb_cmd232_t) | ||
| 74 | |||
| 73 | typedef struct drm_version_32 { | 75 | typedef struct drm_version_32 { |
| 74 | int version_major; /**< Major version */ | 76 | int version_major; /**< Major version */ |
| 75 | int version_minor; /**< Minor version */ | 77 | int version_minor; /**< Minor version */ |
| @@ -1016,6 +1018,63 @@ static int compat_drm_wait_vblank(struct file *file, unsigned int cmd, | |||
| 1016 | return 0; | 1018 | return 0; |
| 1017 | } | 1019 | } |
| 1018 | 1020 | ||
| 1021 | typedef struct drm_mode_fb_cmd232 { | ||
| 1022 | u32 fb_id; | ||
| 1023 | u32 width; | ||
| 1024 | u32 height; | ||
| 1025 | u32 pixel_format; | ||
| 1026 | u32 flags; | ||
| 1027 | u32 handles[4]; | ||
| 1028 | u32 pitches[4]; | ||
| 1029 | u32 offsets[4]; | ||
| 1030 | u64 modifier[4]; | ||
| 1031 | } __attribute__((packed)) drm_mode_fb_cmd232_t; | ||
| 1032 | |||
| 1033 | static int compat_drm_mode_addfb2(struct file *file, unsigned int cmd, | ||
| 1034 | unsigned long arg) | ||
| 1035 | { | ||
| 1036 | struct drm_mode_fb_cmd232 __user *argp = (void __user *)arg; | ||
| 1037 | struct drm_mode_fb_cmd232 req32; | ||
| 1038 | struct drm_mode_fb_cmd2 __user *req64; | ||
| 1039 | int i; | ||
| 1040 | int err; | ||
| 1041 | |||
| 1042 | if (copy_from_user(&req32, argp, sizeof(req32))) | ||
| 1043 | return -EFAULT; | ||
| 1044 | |||
| 1045 | req64 = compat_alloc_user_space(sizeof(*req64)); | ||
| 1046 | |||
| 1047 | if (!access_ok(VERIFY_WRITE, req64, sizeof(*req64)) | ||
| 1048 | || __put_user(req32.width, &req64->width) | ||
| 1049 | || __put_user(req32.height, &req64->height) | ||
| 1050 | || __put_user(req32.pixel_format, &req64->pixel_format) | ||
| 1051 | || __put_user(req32.flags, &req64->flags)) | ||
| 1052 | return -EFAULT; | ||
| 1053 | |||
| 1054 | for (i = 0; i < 4; i++) { | ||
| 1055 | if (__put_user(req32.handles[i], &req64->handles[i])) | ||
| 1056 | return -EFAULT; | ||
| 1057 | if (__put_user(req32.pitches[i], &req64->pitches[i])) | ||
| 1058 | return -EFAULT; | ||
| 1059 | if (__put_user(req32.offsets[i], &req64->offsets[i])) | ||
| 1060 | return -EFAULT; | ||
| 1061 | if (__put_user(req32.modifier[i], &req64->modifier[i])) | ||
| 1062 | return -EFAULT; | ||
| 1063 | } | ||
| 1064 | |||
| 1065 | err = drm_ioctl(file, DRM_IOCTL_MODE_ADDFB2, (unsigned long)req64); | ||
| 1066 | if (err) | ||
| 1067 | return err; | ||
| 1068 | |||
| 1069 | if (__get_user(req32.fb_id, &req64->fb_id)) | ||
| 1070 | return -EFAULT; | ||
| 1071 | |||
| 1072 | if (copy_to_user(argp, &req32, sizeof(req32))) | ||
| 1073 | return -EFAULT; | ||
| 1074 | |||
| 1075 | return 0; | ||
| 1076 | } | ||
| 1077 | |||
| 1019 | static drm_ioctl_compat_t *drm_compat_ioctls[] = { | 1078 | static drm_ioctl_compat_t *drm_compat_ioctls[] = { |
| 1020 | [DRM_IOCTL_NR(DRM_IOCTL_VERSION32)] = compat_drm_version, | 1079 | [DRM_IOCTL_NR(DRM_IOCTL_VERSION32)] = compat_drm_version, |
| 1021 | [DRM_IOCTL_NR(DRM_IOCTL_GET_UNIQUE32)] = compat_drm_getunique, | 1080 | [DRM_IOCTL_NR(DRM_IOCTL_GET_UNIQUE32)] = compat_drm_getunique, |
| @@ -1048,6 +1107,7 @@ static drm_ioctl_compat_t *drm_compat_ioctls[] = { | |||
| 1048 | [DRM_IOCTL_NR(DRM_IOCTL_UPDATE_DRAW32)] = compat_drm_update_draw, | 1107 | [DRM_IOCTL_NR(DRM_IOCTL_UPDATE_DRAW32)] = compat_drm_update_draw, |
| 1049 | #endif | 1108 | #endif |
| 1050 | [DRM_IOCTL_NR(DRM_IOCTL_WAIT_VBLANK32)] = compat_drm_wait_vblank, | 1109 | [DRM_IOCTL_NR(DRM_IOCTL_WAIT_VBLANK32)] = compat_drm_wait_vblank, |
| 1110 | [DRM_IOCTL_NR(DRM_IOCTL_MODE_ADDFB232)] = compat_drm_mode_addfb2, | ||
| 1051 | }; | 1111 | }; |
| 1052 | 1112 | ||
| 1053 | /** | 1113 | /** |
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 542fac628b28..5f27290201e0 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
| @@ -826,6 +826,7 @@ struct intel_context { | |||
| 826 | struct kref ref; | 826 | struct kref ref; |
| 827 | int user_handle; | 827 | int user_handle; |
| 828 | uint8_t remap_slice; | 828 | uint8_t remap_slice; |
| 829 | struct drm_i915_private *i915; | ||
| 829 | struct drm_i915_file_private *file_priv; | 830 | struct drm_i915_file_private *file_priv; |
| 830 | struct i915_ctx_hang_stats hang_stats; | 831 | struct i915_ctx_hang_stats hang_stats; |
| 831 | struct i915_hw_ppgtt *ppgtt; | 832 | struct i915_hw_ppgtt *ppgtt; |
| @@ -2036,8 +2037,6 @@ struct drm_i915_gem_object { | |||
| 2036 | unsigned int cache_level:3; | 2037 | unsigned int cache_level:3; |
| 2037 | unsigned int cache_dirty:1; | 2038 | unsigned int cache_dirty:1; |
| 2038 | 2039 | ||
| 2039 | unsigned int has_dma_mapping:1; | ||
| 2040 | |||
| 2041 | unsigned int frontbuffer_bits:INTEL_FRONTBUFFER_BITS; | 2040 | unsigned int frontbuffer_bits:INTEL_FRONTBUFFER_BITS; |
| 2042 | 2041 | ||
| 2043 | unsigned int pin_display; | 2042 | unsigned int pin_display; |
| @@ -3116,7 +3115,8 @@ void i915_debugfs_cleanup(struct drm_minor *minor); | |||
| 3116 | int i915_debugfs_connector_add(struct drm_connector *connector); | 3115 | int i915_debugfs_connector_add(struct drm_connector *connector); |
| 3117 | void intel_display_crc_init(struct drm_device *dev); | 3116 | void intel_display_crc_init(struct drm_device *dev); |
| 3118 | #else | 3117 | #else |
| 3119 | static inline int i915_debugfs_connector_add(struct drm_connector *connector) {} | 3118 | static inline int i915_debugfs_connector_add(struct drm_connector *connector) |
| 3119 | { return 0; } | ||
| 3120 | static inline void intel_display_crc_init(struct drm_device *dev) {} | 3120 | static inline void intel_display_crc_init(struct drm_device *dev) {} |
| 3121 | #endif | 3121 | #endif |
| 3122 | 3122 | ||
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 248fd1ac7b3a..52b446b27b4d 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -213,7 +213,6 @@ i915_gem_object_get_pages_phys(struct drm_i915_gem_object *obj) | |||
| 213 | sg_dma_len(sg) = obj->base.size; | 213 | sg_dma_len(sg) = obj->base.size; |
| 214 | 214 | ||
| 215 | obj->pages = st; | 215 | obj->pages = st; |
| 216 | obj->has_dma_mapping = true; | ||
| 217 | return 0; | 216 | return 0; |
| 218 | } | 217 | } |
| 219 | 218 | ||
| @@ -265,8 +264,6 @@ i915_gem_object_put_pages_phys(struct drm_i915_gem_object *obj) | |||
| 265 | 264 | ||
| 266 | sg_free_table(obj->pages); | 265 | sg_free_table(obj->pages); |
| 267 | kfree(obj->pages); | 266 | kfree(obj->pages); |
| 268 | |||
| 269 | obj->has_dma_mapping = false; | ||
| 270 | } | 267 | } |
| 271 | 268 | ||
| 272 | static void | 269 | static void |
| @@ -2139,6 +2136,8 @@ i915_gem_object_put_pages_gtt(struct drm_i915_gem_object *obj) | |||
| 2139 | obj->base.read_domains = obj->base.write_domain = I915_GEM_DOMAIN_CPU; | 2136 | obj->base.read_domains = obj->base.write_domain = I915_GEM_DOMAIN_CPU; |
| 2140 | } | 2137 | } |
| 2141 | 2138 | ||
| 2139 | i915_gem_gtt_finish_object(obj); | ||
| 2140 | |||
| 2142 | if (i915_gem_object_needs_bit17_swizzle(obj)) | 2141 | if (i915_gem_object_needs_bit17_swizzle(obj)) |
| 2143 | i915_gem_object_save_bit_17_swizzle(obj); | 2142 | i915_gem_object_save_bit_17_swizzle(obj); |
| 2144 | 2143 | ||
| @@ -2199,6 +2198,7 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj) | |||
| 2199 | struct sg_page_iter sg_iter; | 2198 | struct sg_page_iter sg_iter; |
| 2200 | struct page *page; | 2199 | struct page *page; |
| 2201 | unsigned long last_pfn = 0; /* suppress gcc warning */ | 2200 | unsigned long last_pfn = 0; /* suppress gcc warning */ |
| 2201 | int ret; | ||
| 2202 | gfp_t gfp; | 2202 | gfp_t gfp; |
| 2203 | 2203 | ||
| 2204 | /* Assert that the object is not currently in any GPU domain. As it | 2204 | /* Assert that the object is not currently in any GPU domain. As it |
| @@ -2246,8 +2246,10 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj) | |||
| 2246 | */ | 2246 | */ |
| 2247 | i915_gem_shrink_all(dev_priv); | 2247 | i915_gem_shrink_all(dev_priv); |
| 2248 | page = shmem_read_mapping_page(mapping, i); | 2248 | page = shmem_read_mapping_page(mapping, i); |
| 2249 | if (IS_ERR(page)) | 2249 | if (IS_ERR(page)) { |
| 2250 | ret = PTR_ERR(page); | ||
| 2250 | goto err_pages; | 2251 | goto err_pages; |
| 2252 | } | ||
| 2251 | } | 2253 | } |
| 2252 | #ifdef CONFIG_SWIOTLB | 2254 | #ifdef CONFIG_SWIOTLB |
| 2253 | if (swiotlb_nr_tbl()) { | 2255 | if (swiotlb_nr_tbl()) { |
| @@ -2276,6 +2278,10 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj) | |||
| 2276 | sg_mark_end(sg); | 2278 | sg_mark_end(sg); |
| 2277 | obj->pages = st; | 2279 | obj->pages = st; |
| 2278 | 2280 | ||
| 2281 | ret = i915_gem_gtt_prepare_object(obj); | ||
| 2282 | if (ret) | ||
| 2283 | goto err_pages; | ||
| 2284 | |||
| 2279 | if (i915_gem_object_needs_bit17_swizzle(obj)) | 2285 | if (i915_gem_object_needs_bit17_swizzle(obj)) |
| 2280 | i915_gem_object_do_bit_17_swizzle(obj); | 2286 | i915_gem_object_do_bit_17_swizzle(obj); |
| 2281 | 2287 | ||
| @@ -2300,10 +2306,10 @@ err_pages: | |||
| 2300 | * space and so want to translate the error from shmemfs back to our | 2306 | * space and so want to translate the error from shmemfs back to our |
| 2301 | * usual understanding of ENOMEM. | 2307 | * usual understanding of ENOMEM. |
| 2302 | */ | 2308 | */ |
| 2303 | if (PTR_ERR(page) == -ENOSPC) | 2309 | if (ret == -ENOSPC) |
| 2304 | return -ENOMEM; | 2310 | ret = -ENOMEM; |
| 2305 | else | 2311 | |
| 2306 | return PTR_ERR(page); | 2312 | return ret; |
| 2307 | } | 2313 | } |
| 2308 | 2314 | ||
| 2309 | /* Ensure that the associated pages are gathered from the backing storage | 2315 | /* Ensure that the associated pages are gathered from the backing storage |
| @@ -2542,6 +2548,7 @@ int __i915_add_request(struct intel_engine_cs *ring, | |||
| 2542 | } | 2548 | } |
| 2543 | 2549 | ||
| 2544 | request->emitted_jiffies = jiffies; | 2550 | request->emitted_jiffies = jiffies; |
| 2551 | ring->last_submitted_seqno = request->seqno; | ||
| 2545 | list_add_tail(&request->list, &ring->request_list); | 2552 | list_add_tail(&request->list, &ring->request_list); |
| 2546 | request->file_priv = NULL; | 2553 | request->file_priv = NULL; |
| 2547 | 2554 | ||
| @@ -3247,10 +3254,8 @@ int i915_vma_unbind(struct i915_vma *vma) | |||
| 3247 | 3254 | ||
| 3248 | /* Since the unbound list is global, only move to that list if | 3255 | /* Since the unbound list is global, only move to that list if |
| 3249 | * no more VMAs exist. */ | 3256 | * no more VMAs exist. */ |
| 3250 | if (list_empty(&obj->vma_list)) { | 3257 | if (list_empty(&obj->vma_list)) |
| 3251 | i915_gem_gtt_finish_object(obj); | ||
| 3252 | list_move_tail(&obj->global_list, &dev_priv->mm.unbound_list); | 3258 | list_move_tail(&obj->global_list, &dev_priv->mm.unbound_list); |
| 3253 | } | ||
| 3254 | 3259 | ||
| 3255 | /* And finally now the object is completely decoupled from this vma, | 3260 | /* And finally now the object is completely decoupled from this vma, |
| 3256 | * we can drop its hold on the backing storage and allow it to be | 3261 | * we can drop its hold on the backing storage and allow it to be |
| @@ -3768,22 +3773,16 @@ search_free: | |||
| 3768 | goto err_remove_node; | 3773 | goto err_remove_node; |
| 3769 | } | 3774 | } |
| 3770 | 3775 | ||
| 3771 | ret = i915_gem_gtt_prepare_object(obj); | ||
| 3772 | if (ret) | ||
| 3773 | goto err_remove_node; | ||
| 3774 | |||
| 3775 | trace_i915_vma_bind(vma, flags); | 3776 | trace_i915_vma_bind(vma, flags); |
| 3776 | ret = i915_vma_bind(vma, obj->cache_level, flags); | 3777 | ret = i915_vma_bind(vma, obj->cache_level, flags); |
| 3777 | if (ret) | 3778 | if (ret) |
| 3778 | goto err_finish_gtt; | 3779 | goto err_remove_node; |
| 3779 | 3780 | ||
| 3780 | list_move_tail(&obj->global_list, &dev_priv->mm.bound_list); | 3781 | list_move_tail(&obj->global_list, &dev_priv->mm.bound_list); |
| 3781 | list_add_tail(&vma->mm_list, &vm->inactive_list); | 3782 | list_add_tail(&vma->mm_list, &vm->inactive_list); |
| 3782 | 3783 | ||
| 3783 | return vma; | 3784 | return vma; |
| 3784 | 3785 | ||
| 3785 | err_finish_gtt: | ||
| 3786 | i915_gem_gtt_finish_object(obj); | ||
| 3787 | err_remove_node: | 3786 | err_remove_node: |
| 3788 | drm_mm_remove_node(&vma->node); | 3787 | drm_mm_remove_node(&vma->node); |
| 3789 | err_free_vma: | 3788 | err_free_vma: |
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c index d65cbe6afb92..48afa777e94a 100644 --- a/drivers/gpu/drm/i915/i915_gem_context.c +++ b/drivers/gpu/drm/i915/i915_gem_context.c | |||
| @@ -135,8 +135,7 @@ static int get_context_size(struct drm_device *dev) | |||
| 135 | 135 | ||
| 136 | void i915_gem_context_free(struct kref *ctx_ref) | 136 | void i915_gem_context_free(struct kref *ctx_ref) |
| 137 | { | 137 | { |
| 138 | struct intel_context *ctx = container_of(ctx_ref, | 138 | struct intel_context *ctx = container_of(ctx_ref, typeof(*ctx), ref); |
| 139 | typeof(*ctx), ref); | ||
| 140 | 139 | ||
| 141 | trace_i915_context_free(ctx); | 140 | trace_i915_context_free(ctx); |
| 142 | 141 | ||
| @@ -195,6 +194,7 @@ __create_hw_context(struct drm_device *dev, | |||
| 195 | 194 | ||
| 196 | kref_init(&ctx->ref); | 195 | kref_init(&ctx->ref); |
| 197 | list_add_tail(&ctx->link, &dev_priv->context_list); | 196 | list_add_tail(&ctx->link, &dev_priv->context_list); |
| 197 | ctx->i915 = dev_priv; | ||
| 198 | 198 | ||
| 199 | if (dev_priv->hw_context_size) { | 199 | if (dev_priv->hw_context_size) { |
| 200 | struct drm_i915_gem_object *obj = | 200 | struct drm_i915_gem_object *obj = |
diff --git a/drivers/gpu/drm/i915/i915_gem_dmabuf.c b/drivers/gpu/drm/i915/i915_gem_dmabuf.c index 7998da27c500..e9c2bfd85b52 100644 --- a/drivers/gpu/drm/i915/i915_gem_dmabuf.c +++ b/drivers/gpu/drm/i915/i915_gem_dmabuf.c | |||
| @@ -256,7 +256,6 @@ static int i915_gem_object_get_pages_dmabuf(struct drm_i915_gem_object *obj) | |||
| 256 | return PTR_ERR(sg); | 256 | return PTR_ERR(sg); |
| 257 | 257 | ||
| 258 | obj->pages = sg; | 258 | obj->pages = sg; |
| 259 | obj->has_dma_mapping = true; | ||
| 260 | return 0; | 259 | return 0; |
| 261 | } | 260 | } |
| 262 | 261 | ||
| @@ -264,7 +263,6 @@ static void i915_gem_object_put_pages_dmabuf(struct drm_i915_gem_object *obj) | |||
| 264 | { | 263 | { |
| 265 | dma_buf_unmap_attachment(obj->base.import_attach, | 264 | dma_buf_unmap_attachment(obj->base.import_attach, |
| 266 | obj->pages, DMA_BIDIRECTIONAL); | 265 | obj->pages, DMA_BIDIRECTIONAL); |
| 267 | obj->has_dma_mapping = false; | ||
| 268 | } | 266 | } |
| 269 | 267 | ||
| 270 | static const struct drm_i915_gem_object_ops i915_gem_object_dmabuf_ops = { | 268 | static const struct drm_i915_gem_object_ops i915_gem_object_dmabuf_ops = { |
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c index dcc6a88c560e..56b52a4767d4 100644 --- a/drivers/gpu/drm/i915/i915_gem_gtt.c +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c | |||
| @@ -1723,9 +1723,6 @@ void i915_gem_suspend_gtt_mappings(struct drm_device *dev) | |||
| 1723 | 1723 | ||
| 1724 | int i915_gem_gtt_prepare_object(struct drm_i915_gem_object *obj) | 1724 | int i915_gem_gtt_prepare_object(struct drm_i915_gem_object *obj) |
| 1725 | { | 1725 | { |
| 1726 | if (obj->has_dma_mapping) | ||
| 1727 | return 0; | ||
| 1728 | |||
| 1729 | if (!dma_map_sg(&obj->base.dev->pdev->dev, | 1726 | if (!dma_map_sg(&obj->base.dev->pdev->dev, |
| 1730 | obj->pages->sgl, obj->pages->nents, | 1727 | obj->pages->sgl, obj->pages->nents, |
| 1731 | PCI_DMA_BIDIRECTIONAL)) | 1728 | PCI_DMA_BIDIRECTIONAL)) |
| @@ -1972,10 +1969,8 @@ void i915_gem_gtt_finish_object(struct drm_i915_gem_object *obj) | |||
| 1972 | 1969 | ||
| 1973 | interruptible = do_idling(dev_priv); | 1970 | interruptible = do_idling(dev_priv); |
| 1974 | 1971 | ||
| 1975 | if (!obj->has_dma_mapping) | 1972 | dma_unmap_sg(&dev->pdev->dev, obj->pages->sgl, obj->pages->nents, |
| 1976 | dma_unmap_sg(&dev->pdev->dev, | 1973 | PCI_DMA_BIDIRECTIONAL); |
| 1977 | obj->pages->sgl, obj->pages->nents, | ||
| 1978 | PCI_DMA_BIDIRECTIONAL); | ||
| 1979 | 1974 | ||
| 1980 | undo_idling(dev_priv, interruptible); | 1975 | undo_idling(dev_priv, interruptible); |
| 1981 | } | 1976 | } |
diff --git a/drivers/gpu/drm/i915/i915_gem_stolen.c b/drivers/gpu/drm/i915/i915_gem_stolen.c index 348ed5abcdbf..8b5b784c62fe 100644 --- a/drivers/gpu/drm/i915/i915_gem_stolen.c +++ b/drivers/gpu/drm/i915/i915_gem_stolen.c | |||
| @@ -416,7 +416,6 @@ _i915_gem_object_create_stolen(struct drm_device *dev, | |||
| 416 | if (obj->pages == NULL) | 416 | if (obj->pages == NULL) |
| 417 | goto cleanup; | 417 | goto cleanup; |
| 418 | 418 | ||
| 419 | obj->has_dma_mapping = true; | ||
| 420 | i915_gem_object_pin_pages(obj); | 419 | i915_gem_object_pin_pages(obj); |
| 421 | obj->stolen = stolen; | 420 | obj->stolen = stolen; |
| 422 | 421 | ||
diff --git a/drivers/gpu/drm/i915/i915_gem_tiling.c b/drivers/gpu/drm/i915/i915_gem_tiling.c index d61e74a08f82..633bd1fcab69 100644 --- a/drivers/gpu/drm/i915/i915_gem_tiling.c +++ b/drivers/gpu/drm/i915/i915_gem_tiling.c | |||
| @@ -183,18 +183,8 @@ i915_gem_detect_bit_6_swizzle(struct drm_device *dev) | |||
| 183 | if (IS_GEN4(dev)) { | 183 | if (IS_GEN4(dev)) { |
| 184 | uint32_t ddc2 = I915_READ(DCC2); | 184 | uint32_t ddc2 = I915_READ(DCC2); |
| 185 | 185 | ||
| 186 | if (!(ddc2 & DCC2_MODIFIED_ENHANCED_DISABLE)) { | 186 | if (!(ddc2 & DCC2_MODIFIED_ENHANCED_DISABLE)) |
| 187 | /* Since the swizzling may vary within an | ||
| 188 | * object, we have no idea what the swizzling | ||
| 189 | * is for any page in particular. Thus we | ||
| 190 | * cannot migrate tiled pages using the GPU, | ||
| 191 | * nor can we tell userspace what the exact | ||
| 192 | * swizzling is for any object. | ||
| 193 | */ | ||
| 194 | dev_priv->quirks |= QUIRK_PIN_SWIZZLED_PAGES; | 187 | dev_priv->quirks |= QUIRK_PIN_SWIZZLED_PAGES; |
| 195 | swizzle_x = I915_BIT_6_SWIZZLE_UNKNOWN; | ||
| 196 | swizzle_y = I915_BIT_6_SWIZZLE_UNKNOWN; | ||
| 197 | } | ||
| 198 | } | 188 | } |
| 199 | 189 | ||
| 200 | if (dcc == 0xffffffff) { | 190 | if (dcc == 0xffffffff) { |
diff --git a/drivers/gpu/drm/i915/i915_gem_userptr.c b/drivers/gpu/drm/i915/i915_gem_userptr.c index 1f4e5a32a16e..8fd431bcdfd3 100644 --- a/drivers/gpu/drm/i915/i915_gem_userptr.c +++ b/drivers/gpu/drm/i915/i915_gem_userptr.c | |||
| @@ -545,6 +545,26 @@ err: | |||
| 545 | return ret; | 545 | return ret; |
| 546 | } | 546 | } |
| 547 | 547 | ||
| 548 | static int | ||
| 549 | __i915_gem_userptr_set_pages(struct drm_i915_gem_object *obj, | ||
| 550 | struct page **pvec, int num_pages) | ||
| 551 | { | ||
| 552 | int ret; | ||
| 553 | |||
| 554 | ret = st_set_pages(&obj->pages, pvec, num_pages); | ||
| 555 | if (ret) | ||
| 556 | return ret; | ||
| 557 | |||
| 558 | ret = i915_gem_gtt_prepare_object(obj); | ||
| 559 | if (ret) { | ||
| 560 | sg_free_table(obj->pages); | ||
| 561 | kfree(obj->pages); | ||
| 562 | obj->pages = NULL; | ||
| 563 | } | ||
| 564 | |||
| 565 | return ret; | ||
| 566 | } | ||
| 567 | |||
| 548 | static void | 568 | static void |
| 549 | __i915_gem_userptr_get_pages_worker(struct work_struct *_work) | 569 | __i915_gem_userptr_get_pages_worker(struct work_struct *_work) |
| 550 | { | 570 | { |
| @@ -584,9 +604,12 @@ __i915_gem_userptr_get_pages_worker(struct work_struct *_work) | |||
| 584 | if (obj->userptr.work != &work->work) { | 604 | if (obj->userptr.work != &work->work) { |
| 585 | ret = 0; | 605 | ret = 0; |
| 586 | } else if (pinned == num_pages) { | 606 | } else if (pinned == num_pages) { |
| 587 | ret = st_set_pages(&obj->pages, pvec, num_pages); | 607 | ret = __i915_gem_userptr_set_pages(obj, pvec, num_pages); |
| 588 | if (ret == 0) { | 608 | if (ret == 0) { |
| 589 | list_add_tail(&obj->global_list, &to_i915(dev)->mm.unbound_list); | 609 | list_add_tail(&obj->global_list, &to_i915(dev)->mm.unbound_list); |
| 610 | obj->get_page.sg = obj->pages->sgl; | ||
| 611 | obj->get_page.last = 0; | ||
| 612 | |||
| 590 | pinned = 0; | 613 | pinned = 0; |
| 591 | } | 614 | } |
| 592 | } | 615 | } |
| @@ -693,7 +716,7 @@ i915_gem_userptr_get_pages(struct drm_i915_gem_object *obj) | |||
| 693 | } | 716 | } |
| 694 | } | 717 | } |
| 695 | } else { | 718 | } else { |
| 696 | ret = st_set_pages(&obj->pages, pvec, num_pages); | 719 | ret = __i915_gem_userptr_set_pages(obj, pvec, num_pages); |
| 697 | if (ret == 0) { | 720 | if (ret == 0) { |
| 698 | obj->userptr.work = NULL; | 721 | obj->userptr.work = NULL; |
| 699 | pinned = 0; | 722 | pinned = 0; |
| @@ -715,6 +738,8 @@ i915_gem_userptr_put_pages(struct drm_i915_gem_object *obj) | |||
| 715 | if (obj->madv != I915_MADV_WILLNEED) | 738 | if (obj->madv != I915_MADV_WILLNEED) |
| 716 | obj->dirty = 0; | 739 | obj->dirty = 0; |
| 717 | 740 | ||
| 741 | i915_gem_gtt_finish_object(obj); | ||
| 742 | |||
| 718 | for_each_sg_page(obj->pages->sgl, &sg_iter, obj->pages->nents, 0) { | 743 | for_each_sg_page(obj->pages->sgl, &sg_iter, obj->pages->nents, 0) { |
| 719 | struct page *page = sg_page_iter_page(&sg_iter); | 744 | struct page *page = sg_page_iter_page(&sg_iter); |
| 720 | 745 | ||
diff --git a/drivers/gpu/drm/i915/i915_ioc32.c b/drivers/gpu/drm/i915/i915_ioc32.c index 176de6322e4d..23aa04cded6b 100644 --- a/drivers/gpu/drm/i915/i915_ioc32.c +++ b/drivers/gpu/drm/i915/i915_ioc32.c | |||
| @@ -204,7 +204,7 @@ long i915_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | |||
| 204 | drm_ioctl_compat_t *fn = NULL; | 204 | drm_ioctl_compat_t *fn = NULL; |
| 205 | int ret; | 205 | int ret; |
| 206 | 206 | ||
| 207 | if (nr < DRM_COMMAND_BASE) | 207 | if (nr < DRM_COMMAND_BASE || nr >= DRM_COMMAND_END) |
| 208 | return drm_compat_ioctl(filp, cmd, arg); | 208 | return drm_compat_ioctl(filp, cmd, arg); |
| 209 | 209 | ||
| 210 | if (nr < DRM_COMMAND_BASE + ARRAY_SIZE(i915_compat_ioctls)) | 210 | if (nr < DRM_COMMAND_BASE + ARRAY_SIZE(i915_compat_ioctls)) |
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index e6bb72dca3ff..984e2fe6688c 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
| @@ -2706,18 +2706,11 @@ static void gen8_disable_vblank(struct drm_device *dev, int pipe) | |||
| 2706 | spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); | 2706 | spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); |
| 2707 | } | 2707 | } |
| 2708 | 2708 | ||
| 2709 | static struct drm_i915_gem_request * | ||
| 2710 | ring_last_request(struct intel_engine_cs *ring) | ||
| 2711 | { | ||
| 2712 | return list_entry(ring->request_list.prev, | ||
| 2713 | struct drm_i915_gem_request, list); | ||
| 2714 | } | ||
| 2715 | |||
| 2716 | static bool | 2709 | static bool |
| 2717 | ring_idle(struct intel_engine_cs *ring) | 2710 | ring_idle(struct intel_engine_cs *ring, u32 seqno) |
| 2718 | { | 2711 | { |
| 2719 | return (list_empty(&ring->request_list) || | 2712 | return (list_empty(&ring->request_list) || |
| 2720 | i915_gem_request_completed(ring_last_request(ring), false)); | 2713 | i915_seqno_passed(seqno, ring->last_submitted_seqno)); |
| 2721 | } | 2714 | } |
| 2722 | 2715 | ||
| 2723 | static bool | 2716 | static bool |
| @@ -2939,7 +2932,7 @@ static void i915_hangcheck_elapsed(struct work_struct *work) | |||
| 2939 | acthd = intel_ring_get_active_head(ring); | 2932 | acthd = intel_ring_get_active_head(ring); |
| 2940 | 2933 | ||
| 2941 | if (ring->hangcheck.seqno == seqno) { | 2934 | if (ring->hangcheck.seqno == seqno) { |
| 2942 | if (ring_idle(ring)) { | 2935 | if (ring_idle(ring, seqno)) { |
| 2943 | ring->hangcheck.action = HANGCHECK_IDLE; | 2936 | ring->hangcheck.action = HANGCHECK_IDLE; |
| 2944 | 2937 | ||
| 2945 | if (waitqueue_active(&ring->irq_queue)) { | 2938 | if (waitqueue_active(&ring->irq_queue)) { |
diff --git a/drivers/gpu/drm/i915/i915_trace.h b/drivers/gpu/drm/i915/i915_trace.h index 497cba5deb1e..849a2590e010 100644 --- a/drivers/gpu/drm/i915/i915_trace.h +++ b/drivers/gpu/drm/i915/i915_trace.h | |||
| @@ -727,7 +727,7 @@ DECLARE_EVENT_CLASS(i915_context, | |||
| 727 | TP_fast_assign( | 727 | TP_fast_assign( |
| 728 | __entry->ctx = ctx; | 728 | __entry->ctx = ctx; |
| 729 | __entry->vm = ctx->ppgtt ? &ctx->ppgtt->base : NULL; | 729 | __entry->vm = ctx->ppgtt ? &ctx->ppgtt->base : NULL; |
| 730 | __entry->dev = ctx->file_priv->dev_priv->dev->primary->index; | 730 | __entry->dev = ctx->i915->dev->primary->index; |
| 731 | ), | 731 | ), |
| 732 | 732 | ||
| 733 | TP_printk("dev=%u, ctx=%p, ctx_vm=%p", | 733 | TP_printk("dev=%u, ctx=%p, ctx_vm=%p", |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 647b1404c441..30e0f54ba19d 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -6315,9 +6315,6 @@ static void intel_crtc_disable(struct drm_crtc *crtc) | |||
| 6315 | struct drm_connector *connector; | 6315 | struct drm_connector *connector; |
| 6316 | struct drm_i915_private *dev_priv = dev->dev_private; | 6316 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 6317 | 6317 | ||
| 6318 | /* crtc should still be enabled when we disable it. */ | ||
| 6319 | WARN_ON(!crtc->state->enable); | ||
| 6320 | |||
| 6321 | intel_crtc_disable_planes(crtc); | 6318 | intel_crtc_disable_planes(crtc); |
| 6322 | dev_priv->display.crtc_disable(crtc); | 6319 | dev_priv->display.crtc_disable(crtc); |
| 6323 | dev_priv->display.off(crtc); | 6320 | dev_priv->display.off(crtc); |
| @@ -12591,7 +12588,8 @@ static int __intel_set_mode(struct drm_crtc *modeset_crtc, | |||
| 12591 | continue; | 12588 | continue; |
| 12592 | 12589 | ||
| 12593 | if (!crtc_state->enable) { | 12590 | if (!crtc_state->enable) { |
| 12594 | intel_crtc_disable(crtc); | 12591 | if (crtc->state->enable) |
| 12592 | intel_crtc_disable(crtc); | ||
| 12595 | } else if (crtc->state->enable) { | 12593 | } else if (crtc->state->enable) { |
| 12596 | intel_crtc_disable_planes(crtc); | 12594 | intel_crtc_disable_planes(crtc); |
| 12597 | dev_priv->display.crtc_disable(crtc); | 12595 | dev_priv->display.crtc_disable(crtc); |
| @@ -13276,7 +13274,7 @@ intel_check_primary_plane(struct drm_plane *plane, | |||
| 13276 | if (ret) | 13274 | if (ret) |
| 13277 | return ret; | 13275 | return ret; |
| 13278 | 13276 | ||
| 13279 | if (intel_crtc->active) { | 13277 | if (crtc_state ? crtc_state->base.active : intel_crtc->active) { |
| 13280 | struct intel_plane_state *old_state = | 13278 | struct intel_plane_state *old_state = |
| 13281 | to_intel_plane_state(plane->state); | 13279 | to_intel_plane_state(plane->state); |
| 13282 | 13280 | ||
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h index e539314ae87e..4be66f60504d 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.h +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h | |||
| @@ -275,6 +275,13 @@ struct intel_engine_cs { | |||
| 275 | * Do we have some not yet emitted requests outstanding? | 275 | * Do we have some not yet emitted requests outstanding? |
| 276 | */ | 276 | */ |
| 277 | struct drm_i915_gem_request *outstanding_lazy_request; | 277 | struct drm_i915_gem_request *outstanding_lazy_request; |
| 278 | /** | ||
| 279 | * Seqno of request most recently submitted to request_list. | ||
| 280 | * Used exclusively by hang checker to avoid grabbing lock while | ||
| 281 | * inspecting request list. | ||
| 282 | */ | ||
| 283 | u32 last_submitted_seqno; | ||
| 284 | |||
| 278 | bool gpu_caches_dirty; | 285 | bool gpu_caches_dirty; |
| 279 | 286 | ||
| 280 | wait_queue_head_t irq_queue; | 287 | wait_queue_head_t irq_queue; |
diff --git a/drivers/gpu/drm/imx/imx-tve.c b/drivers/gpu/drm/imx/imx-tve.c index 214eceefc981..e671ad369416 100644 --- a/drivers/gpu/drm/imx/imx-tve.c +++ b/drivers/gpu/drm/imx/imx-tve.c | |||
| @@ -301,7 +301,7 @@ static void imx_tve_encoder_prepare(struct drm_encoder *encoder) | |||
| 301 | 301 | ||
| 302 | switch (tve->mode) { | 302 | switch (tve->mode) { |
| 303 | case TVE_MODE_VGA: | 303 | case TVE_MODE_VGA: |
| 304 | imx_drm_set_bus_format_pins(encoder, MEDIA_BUS_FMT_YUV8_1X24, | 304 | imx_drm_set_bus_format_pins(encoder, MEDIA_BUS_FMT_GBR888_1X24, |
| 305 | tve->hsync_pin, tve->vsync_pin); | 305 | tve->hsync_pin, tve->vsync_pin); |
| 306 | break; | 306 | break; |
| 307 | case TVE_MODE_TVOUT: | 307 | case TVE_MODE_TVOUT: |
diff --git a/drivers/gpu/drm/imx/parallel-display.c b/drivers/gpu/drm/imx/parallel-display.c index 74a9ce40ddc4..b4deb9cf9d71 100644 --- a/drivers/gpu/drm/imx/parallel-display.c +++ b/drivers/gpu/drm/imx/parallel-display.c | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | #include <drm/drm_panel.h> | 21 | #include <drm/drm_panel.h> |
| 22 | #include <linux/videodev2.h> | 22 | #include <linux/videodev2.h> |
| 23 | #include <video/of_display_timing.h> | 23 | #include <video/of_display_timing.h> |
| 24 | #include <linux/of_graph.h> | ||
| 24 | 25 | ||
| 25 | #include "imx-drm.h" | 26 | #include "imx-drm.h" |
| 26 | 27 | ||
| @@ -208,7 +209,7 @@ static int imx_pd_bind(struct device *dev, struct device *master, void *data) | |||
| 208 | { | 209 | { |
| 209 | struct drm_device *drm = data; | 210 | struct drm_device *drm = data; |
| 210 | struct device_node *np = dev->of_node; | 211 | struct device_node *np = dev->of_node; |
| 211 | struct device_node *panel_node; | 212 | struct device_node *port; |
| 212 | const u8 *edidp; | 213 | const u8 *edidp; |
| 213 | struct imx_parallel_display *imxpd; | 214 | struct imx_parallel_display *imxpd; |
| 214 | int ret; | 215 | int ret; |
| @@ -234,11 +235,19 @@ static int imx_pd_bind(struct device *dev, struct device *master, void *data) | |||
| 234 | imxpd->bus_format = MEDIA_BUS_FMT_RGB666_1X24_CPADHI; | 235 | imxpd->bus_format = MEDIA_BUS_FMT_RGB666_1X24_CPADHI; |
| 235 | } | 236 | } |
| 236 | 237 | ||
| 237 | panel_node = of_parse_phandle(np, "fsl,panel", 0); | 238 | /* port@1 is the output port */ |
| 238 | if (panel_node) { | 239 | port = of_graph_get_port_by_id(np, 1); |
| 239 | imxpd->panel = of_drm_find_panel(panel_node); | 240 | if (port) { |
| 240 | if (!imxpd->panel) | 241 | struct device_node *endpoint, *remote; |
| 241 | return -EPROBE_DEFER; | 242 | |
| 243 | endpoint = of_get_child_by_name(port, "endpoint"); | ||
| 244 | if (endpoint) { | ||
| 245 | remote = of_graph_get_remote_port_parent(endpoint); | ||
| 246 | if (remote) | ||
| 247 | imxpd->panel = of_drm_find_panel(remote); | ||
| 248 | if (!imxpd->panel) | ||
| 249 | return -EPROBE_DEFER; | ||
| 250 | } | ||
| 242 | } | 251 | } |
| 243 | 252 | ||
| 244 | imxpd->dev = dev; | 253 | imxpd->dev = dev; |
diff --git a/drivers/gpu/drm/radeon/ci_dpm.c b/drivers/gpu/drm/radeon/ci_dpm.c index 8730562323a8..4a09947be244 100644 --- a/drivers/gpu/drm/radeon/ci_dpm.c +++ b/drivers/gpu/drm/radeon/ci_dpm.c | |||
| @@ -5818,7 +5818,7 @@ int ci_dpm_init(struct radeon_device *rdev) | |||
| 5818 | tmp |= DPM_ENABLED; | 5818 | tmp |= DPM_ENABLED; |
| 5819 | break; | 5819 | break; |
| 5820 | default: | 5820 | default: |
| 5821 | DRM_ERROR("Invalid PCC GPIO: %u!\n", gpio.shift); | 5821 | DRM_DEBUG("Invalid PCC GPIO: %u!\n", gpio.shift); |
| 5822 | break; | 5822 | break; |
| 5823 | } | 5823 | } |
| 5824 | WREG32_SMC(CNB_PWRMGT_CNTL, tmp); | 5824 | WREG32_SMC(CNB_PWRMGT_CNTL, tmp); |
diff --git a/drivers/gpu/drm/radeon/radeon_gart.c b/drivers/gpu/drm/radeon/radeon_gart.c index 5450fa95a47e..c4777c8d0312 100644 --- a/drivers/gpu/drm/radeon/radeon_gart.c +++ b/drivers/gpu/drm/radeon/radeon_gart.c | |||
| @@ -260,8 +260,10 @@ void radeon_gart_unbind(struct radeon_device *rdev, unsigned offset, | |||
| 260 | } | 260 | } |
| 261 | } | 261 | } |
| 262 | } | 262 | } |
| 263 | mb(); | 263 | if (rdev->gart.ptr) { |
| 264 | radeon_gart_tlb_flush(rdev); | 264 | mb(); |
| 265 | radeon_gart_tlb_flush(rdev); | ||
| 266 | } | ||
| 265 | } | 267 | } |
| 266 | 268 | ||
| 267 | /** | 269 | /** |
| @@ -306,8 +308,10 @@ int radeon_gart_bind(struct radeon_device *rdev, unsigned offset, | |||
| 306 | page_base += RADEON_GPU_PAGE_SIZE; | 308 | page_base += RADEON_GPU_PAGE_SIZE; |
| 307 | } | 309 | } |
| 308 | } | 310 | } |
| 309 | mb(); | 311 | if (rdev->gart.ptr) { |
| 310 | radeon_gart_tlb_flush(rdev); | 312 | mb(); |
| 313 | radeon_gart_tlb_flush(rdev); | ||
| 314 | } | ||
| 311 | return 0; | 315 | return 0; |
| 312 | } | 316 | } |
| 313 | 317 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c index 013ec7106e55..3dcc5733ff69 100644 --- a/drivers/gpu/drm/radeon/radeon_gem.c +++ b/drivers/gpu/drm/radeon/radeon_gem.c | |||
| @@ -36,6 +36,7 @@ void radeon_gem_object_free(struct drm_gem_object *gobj) | |||
| 36 | if (robj) { | 36 | if (robj) { |
| 37 | if (robj->gem_base.import_attach) | 37 | if (robj->gem_base.import_attach) |
| 38 | drm_prime_gem_destroy(&robj->gem_base, robj->tbo.sg); | 38 | drm_prime_gem_destroy(&robj->gem_base, robj->tbo.sg); |
| 39 | radeon_mn_unregister(robj); | ||
| 39 | radeon_bo_unref(&robj); | 40 | radeon_bo_unref(&robj); |
| 40 | } | 41 | } |
| 41 | } | 42 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c index 318165d4855c..676362769b8d 100644 --- a/drivers/gpu/drm/radeon/radeon_object.c +++ b/drivers/gpu/drm/radeon/radeon_object.c | |||
| @@ -75,7 +75,6 @@ static void radeon_ttm_bo_destroy(struct ttm_buffer_object *tbo) | |||
| 75 | bo = container_of(tbo, struct radeon_bo, tbo); | 75 | bo = container_of(tbo, struct radeon_bo, tbo); |
| 76 | 76 | ||
| 77 | radeon_update_memory_usage(bo, bo->tbo.mem.mem_type, -1); | 77 | radeon_update_memory_usage(bo, bo->tbo.mem.mem_type, -1); |
| 78 | radeon_mn_unregister(bo); | ||
| 79 | 78 | ||
| 80 | mutex_lock(&bo->rdev->gem.mutex); | 79 | mutex_lock(&bo->rdev->gem.mutex); |
| 81 | list_del_init(&bo->list); | 80 | list_del_init(&bo->list); |
diff --git a/drivers/gpu/drm/radeon/si_dpm.c b/drivers/gpu/drm/radeon/si_dpm.c index 1dbdf3230dae..787cd8fd897f 100644 --- a/drivers/gpu/drm/radeon/si_dpm.c +++ b/drivers/gpu/drm/radeon/si_dpm.c | |||
| @@ -2926,6 +2926,7 @@ static struct si_dpm_quirk si_dpm_quirk_list[] = { | |||
| 2926 | /* PITCAIRN - https://bugs.freedesktop.org/show_bug.cgi?id=76490 */ | 2926 | /* PITCAIRN - https://bugs.freedesktop.org/show_bug.cgi?id=76490 */ |
| 2927 | { PCI_VENDOR_ID_ATI, 0x6810, 0x1462, 0x3036, 0, 120000 }, | 2927 | { PCI_VENDOR_ID_ATI, 0x6810, 0x1462, 0x3036, 0, 120000 }, |
| 2928 | { PCI_VENDOR_ID_ATI, 0x6811, 0x174b, 0xe271, 0, 120000 }, | 2928 | { PCI_VENDOR_ID_ATI, 0x6811, 0x174b, 0xe271, 0, 120000 }, |
| 2929 | { PCI_VENDOR_ID_ATI, 0x6810, 0x174b, 0xe271, 85000, 90000 }, | ||
| 2929 | { 0, 0, 0, 0 }, | 2930 | { 0, 0, 0, 0 }, |
| 2930 | }; | 2931 | }; |
| 2931 | 2932 | ||
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c index 01b558fe3695..9a0c2911272a 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c | |||
| @@ -555,7 +555,6 @@ static struct platform_driver rockchip_drm_platform_driver = { | |||
| 555 | .probe = rockchip_drm_platform_probe, | 555 | .probe = rockchip_drm_platform_probe, |
| 556 | .remove = rockchip_drm_platform_remove, | 556 | .remove = rockchip_drm_platform_remove, |
| 557 | .driver = { | 557 | .driver = { |
| 558 | .owner = THIS_MODULE, | ||
| 559 | .name = "rockchip-drm", | 558 | .name = "rockchip-drm", |
| 560 | .of_match_table = rockchip_drm_dt_ids, | 559 | .of_match_table = rockchip_drm_dt_ids, |
| 561 | .pm = &rockchip_drm_pm_ops, | 560 | .pm = &rockchip_drm_pm_ops, |
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c index 77d52893d40f..002645bb5bbf 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c | |||
| @@ -162,7 +162,8 @@ static void rockchip_drm_output_poll_changed(struct drm_device *dev) | |||
| 162 | struct rockchip_drm_private *private = dev->dev_private; | 162 | struct rockchip_drm_private *private = dev->dev_private; |
| 163 | struct drm_fb_helper *fb_helper = &private->fbdev_helper; | 163 | struct drm_fb_helper *fb_helper = &private->fbdev_helper; |
| 164 | 164 | ||
| 165 | drm_fb_helper_hotplug_event(fb_helper); | 165 | if (fb_helper) |
| 166 | drm_fb_helper_hotplug_event(fb_helper); | ||
| 166 | } | 167 | } |
| 167 | 168 | ||
| 168 | static const struct drm_mode_config_funcs rockchip_drm_mode_config_funcs = { | 169 | static const struct drm_mode_config_funcs rockchip_drm_mode_config_funcs = { |
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c index eb2282cc4a56..eba5f8a52fbd 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c | |||
| @@ -54,55 +54,56 @@ static void rockchip_gem_free_buf(struct rockchip_gem_object *rk_obj) | |||
| 54 | &rk_obj->dma_attrs); | 54 | &rk_obj->dma_attrs); |
| 55 | } | 55 | } |
| 56 | 56 | ||
| 57 | int rockchip_gem_mmap_buf(struct drm_gem_object *obj, | 57 | static int rockchip_drm_gem_object_mmap(struct drm_gem_object *obj, |
| 58 | struct vm_area_struct *vma) | 58 | struct vm_area_struct *vma) |
| 59 | |||
| 59 | { | 60 | { |
| 61 | int ret; | ||
| 60 | struct rockchip_gem_object *rk_obj = to_rockchip_obj(obj); | 62 | struct rockchip_gem_object *rk_obj = to_rockchip_obj(obj); |
| 61 | struct drm_device *drm = obj->dev; | 63 | struct drm_device *drm = obj->dev; |
| 62 | unsigned long vm_size; | ||
| 63 | 64 | ||
| 64 | vma->vm_flags |= VM_IO | VM_DONTEXPAND | VM_DONTDUMP; | 65 | /* |
| 65 | vm_size = vma->vm_end - vma->vm_start; | 66 | * dma_alloc_attrs() allocated a struct page table for rk_obj, so clear |
| 66 | 67 | * VM_PFNMAP flag that was set by drm_gem_mmap_obj()/drm_gem_mmap(). | |
| 67 | if (vm_size > obj->size) | 68 | */ |
| 68 | return -EINVAL; | 69 | vma->vm_flags &= ~VM_PFNMAP; |
| 69 | 70 | ||
| 70 | return dma_mmap_attrs(drm->dev, vma, rk_obj->kvaddr, rk_obj->dma_addr, | 71 | ret = dma_mmap_attrs(drm->dev, vma, rk_obj->kvaddr, rk_obj->dma_addr, |
| 71 | obj->size, &rk_obj->dma_attrs); | 72 | obj->size, &rk_obj->dma_attrs); |
| 73 | if (ret) | ||
| 74 | drm_gem_vm_close(vma); | ||
| 75 | |||
| 76 | return ret; | ||
| 72 | } | 77 | } |
| 73 | 78 | ||
| 74 | /* drm driver mmap file operations */ | 79 | int rockchip_gem_mmap_buf(struct drm_gem_object *obj, |
| 75 | int rockchip_gem_mmap(struct file *filp, struct vm_area_struct *vma) | 80 | struct vm_area_struct *vma) |
| 76 | { | 81 | { |
| 77 | struct drm_file *priv = filp->private_data; | 82 | struct drm_device *drm = obj->dev; |
| 78 | struct drm_device *dev = priv->minor->dev; | ||
| 79 | struct drm_gem_object *obj; | ||
| 80 | struct drm_vma_offset_node *node; | ||
| 81 | int ret; | 83 | int ret; |
| 82 | 84 | ||
| 83 | if (drm_device_is_unplugged(dev)) | 85 | mutex_lock(&drm->struct_mutex); |
| 84 | return -ENODEV; | 86 | ret = drm_gem_mmap_obj(obj, obj->size, vma); |
| 87 | mutex_unlock(&drm->struct_mutex); | ||
| 88 | if (ret) | ||
| 89 | return ret; | ||
| 85 | 90 | ||
| 86 | mutex_lock(&dev->struct_mutex); | 91 | return rockchip_drm_gem_object_mmap(obj, vma); |
| 92 | } | ||
| 87 | 93 | ||
| 88 | node = drm_vma_offset_exact_lookup(dev->vma_offset_manager, | 94 | /* drm driver mmap file operations */ |
| 89 | vma->vm_pgoff, | 95 | int rockchip_gem_mmap(struct file *filp, struct vm_area_struct *vma) |
| 90 | vma_pages(vma)); | 96 | { |
| 91 | if (!node) { | 97 | struct drm_gem_object *obj; |
| 92 | mutex_unlock(&dev->struct_mutex); | 98 | int ret; |
| 93 | DRM_ERROR("failed to find vma node.\n"); | ||
| 94 | return -EINVAL; | ||
| 95 | } else if (!drm_vma_node_is_allowed(node, filp)) { | ||
| 96 | mutex_unlock(&dev->struct_mutex); | ||
| 97 | return -EACCES; | ||
| 98 | } | ||
| 99 | 99 | ||
| 100 | obj = container_of(node, struct drm_gem_object, vma_node); | 100 | ret = drm_gem_mmap(filp, vma); |
| 101 | ret = rockchip_gem_mmap_buf(obj, vma); | 101 | if (ret) |
| 102 | return ret; | ||
| 102 | 103 | ||
| 103 | mutex_unlock(&dev->struct_mutex); | 104 | obj = vma->vm_private_data; |
| 104 | 105 | ||
| 105 | return ret; | 106 | return rockchip_drm_gem_object_mmap(obj, vma); |
| 106 | } | 107 | } |
| 107 | 108 | ||
| 108 | struct rockchip_gem_object * | 109 | struct rockchip_gem_object * |
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index dc65161d7cad..34b78e736532 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c | |||
| @@ -170,6 +170,7 @@ struct vop_win_phy { | |||
| 170 | 170 | ||
| 171 | struct vop_reg enable; | 171 | struct vop_reg enable; |
| 172 | struct vop_reg format; | 172 | struct vop_reg format; |
| 173 | struct vop_reg rb_swap; | ||
| 173 | struct vop_reg act_info; | 174 | struct vop_reg act_info; |
| 174 | struct vop_reg dsp_info; | 175 | struct vop_reg dsp_info; |
| 175 | struct vop_reg dsp_st; | 176 | struct vop_reg dsp_st; |
| @@ -199,8 +200,12 @@ struct vop_data { | |||
| 199 | static const uint32_t formats_01[] = { | 200 | static const uint32_t formats_01[] = { |
| 200 | DRM_FORMAT_XRGB8888, | 201 | DRM_FORMAT_XRGB8888, |
| 201 | DRM_FORMAT_ARGB8888, | 202 | DRM_FORMAT_ARGB8888, |
| 203 | DRM_FORMAT_XBGR8888, | ||
| 204 | DRM_FORMAT_ABGR8888, | ||
| 202 | DRM_FORMAT_RGB888, | 205 | DRM_FORMAT_RGB888, |
| 206 | DRM_FORMAT_BGR888, | ||
| 203 | DRM_FORMAT_RGB565, | 207 | DRM_FORMAT_RGB565, |
| 208 | DRM_FORMAT_BGR565, | ||
| 204 | DRM_FORMAT_NV12, | 209 | DRM_FORMAT_NV12, |
| 205 | DRM_FORMAT_NV16, | 210 | DRM_FORMAT_NV16, |
| 206 | DRM_FORMAT_NV24, | 211 | DRM_FORMAT_NV24, |
| @@ -209,8 +214,12 @@ static const uint32_t formats_01[] = { | |||
| 209 | static const uint32_t formats_234[] = { | 214 | static const uint32_t formats_234[] = { |
| 210 | DRM_FORMAT_XRGB8888, | 215 | DRM_FORMAT_XRGB8888, |
| 211 | DRM_FORMAT_ARGB8888, | 216 | DRM_FORMAT_ARGB8888, |
| 217 | DRM_FORMAT_XBGR8888, | ||
| 218 | DRM_FORMAT_ABGR8888, | ||
| 212 | DRM_FORMAT_RGB888, | 219 | DRM_FORMAT_RGB888, |
| 220 | DRM_FORMAT_BGR888, | ||
| 213 | DRM_FORMAT_RGB565, | 221 | DRM_FORMAT_RGB565, |
| 222 | DRM_FORMAT_BGR565, | ||
| 214 | }; | 223 | }; |
| 215 | 224 | ||
| 216 | static const struct vop_win_phy win01_data = { | 225 | static const struct vop_win_phy win01_data = { |
| @@ -218,6 +227,7 @@ static const struct vop_win_phy win01_data = { | |||
| 218 | .nformats = ARRAY_SIZE(formats_01), | 227 | .nformats = ARRAY_SIZE(formats_01), |
| 219 | .enable = VOP_REG(WIN0_CTRL0, 0x1, 0), | 228 | .enable = VOP_REG(WIN0_CTRL0, 0x1, 0), |
| 220 | .format = VOP_REG(WIN0_CTRL0, 0x7, 1), | 229 | .format = VOP_REG(WIN0_CTRL0, 0x7, 1), |
| 230 | .rb_swap = VOP_REG(WIN0_CTRL0, 0x1, 12), | ||
| 221 | .act_info = VOP_REG(WIN0_ACT_INFO, 0x1fff1fff, 0), | 231 | .act_info = VOP_REG(WIN0_ACT_INFO, 0x1fff1fff, 0), |
| 222 | .dsp_info = VOP_REG(WIN0_DSP_INFO, 0x0fff0fff, 0), | 232 | .dsp_info = VOP_REG(WIN0_DSP_INFO, 0x0fff0fff, 0), |
| 223 | .dsp_st = VOP_REG(WIN0_DSP_ST, 0x1fff1fff, 0), | 233 | .dsp_st = VOP_REG(WIN0_DSP_ST, 0x1fff1fff, 0), |
| @@ -234,6 +244,7 @@ static const struct vop_win_phy win23_data = { | |||
| 234 | .nformats = ARRAY_SIZE(formats_234), | 244 | .nformats = ARRAY_SIZE(formats_234), |
| 235 | .enable = VOP_REG(WIN2_CTRL0, 0x1, 0), | 245 | .enable = VOP_REG(WIN2_CTRL0, 0x1, 0), |
| 236 | .format = VOP_REG(WIN2_CTRL0, 0x7, 1), | 246 | .format = VOP_REG(WIN2_CTRL0, 0x7, 1), |
| 247 | .rb_swap = VOP_REG(WIN2_CTRL0, 0x1, 12), | ||
| 237 | .dsp_info = VOP_REG(WIN2_DSP_INFO0, 0x0fff0fff, 0), | 248 | .dsp_info = VOP_REG(WIN2_DSP_INFO0, 0x0fff0fff, 0), |
| 238 | .dsp_st = VOP_REG(WIN2_DSP_ST0, 0x1fff1fff, 0), | 249 | .dsp_st = VOP_REG(WIN2_DSP_ST0, 0x1fff1fff, 0), |
| 239 | .yrgb_mst = VOP_REG(WIN2_MST0, 0xffffffff, 0), | 250 | .yrgb_mst = VOP_REG(WIN2_MST0, 0xffffffff, 0), |
| @@ -242,15 +253,6 @@ static const struct vop_win_phy win23_data = { | |||
| 242 | .dst_alpha_ctl = VOP_REG(WIN2_DST_ALPHA_CTRL, 0xff, 0), | 253 | .dst_alpha_ctl = VOP_REG(WIN2_DST_ALPHA_CTRL, 0xff, 0), |
| 243 | }; | 254 | }; |
| 244 | 255 | ||
| 245 | static const struct vop_win_phy cursor_data = { | ||
| 246 | .data_formats = formats_234, | ||
| 247 | .nformats = ARRAY_SIZE(formats_234), | ||
| 248 | .enable = VOP_REG(HWC_CTRL0, 0x1, 0), | ||
| 249 | .format = VOP_REG(HWC_CTRL0, 0x7, 1), | ||
| 250 | .dsp_st = VOP_REG(HWC_DSP_ST, 0x1fff1fff, 0), | ||
| 251 | .yrgb_mst = VOP_REG(HWC_MST, 0xffffffff, 0), | ||
| 252 | }; | ||
| 253 | |||
| 254 | static const struct vop_ctrl ctrl_data = { | 256 | static const struct vop_ctrl ctrl_data = { |
| 255 | .standby = VOP_REG(SYS_CTRL, 0x1, 22), | 257 | .standby = VOP_REG(SYS_CTRL, 0x1, 22), |
| 256 | .gate_en = VOP_REG(SYS_CTRL, 0x1, 23), | 258 | .gate_en = VOP_REG(SYS_CTRL, 0x1, 23), |
| @@ -282,14 +284,14 @@ static const struct vop_reg_data vop_init_reg_table[] = { | |||
| 282 | /* | 284 | /* |
| 283 | * Note: rk3288 has a dedicated 'cursor' window, however, that window requires | 285 | * Note: rk3288 has a dedicated 'cursor' window, however, that window requires |
| 284 | * special support to get alpha blending working. For now, just use overlay | 286 | * special support to get alpha blending working. For now, just use overlay |
| 285 | * window 1 for the drm cursor. | 287 | * window 3 for the drm cursor. |
| 288 | * | ||
| 286 | */ | 289 | */ |
| 287 | static const struct vop_win_data rk3288_vop_win_data[] = { | 290 | static const struct vop_win_data rk3288_vop_win_data[] = { |
| 288 | { .base = 0x00, .phy = &win01_data, .type = DRM_PLANE_TYPE_PRIMARY }, | 291 | { .base = 0x00, .phy = &win01_data, .type = DRM_PLANE_TYPE_PRIMARY }, |
| 289 | { .base = 0x40, .phy = &win01_data, .type = DRM_PLANE_TYPE_CURSOR }, | 292 | { .base = 0x40, .phy = &win01_data, .type = DRM_PLANE_TYPE_OVERLAY }, |
| 290 | { .base = 0x00, .phy = &win23_data, .type = DRM_PLANE_TYPE_OVERLAY }, | 293 | { .base = 0x00, .phy = &win23_data, .type = DRM_PLANE_TYPE_OVERLAY }, |
| 291 | { .base = 0x50, .phy = &win23_data, .type = DRM_PLANE_TYPE_OVERLAY }, | 294 | { .base = 0x50, .phy = &win23_data, .type = DRM_PLANE_TYPE_CURSOR }, |
| 292 | { .base = 0x00, .phy = &cursor_data, .type = DRM_PLANE_TYPE_OVERLAY }, | ||
| 293 | }; | 295 | }; |
| 294 | 296 | ||
| 295 | static const struct vop_data rk3288_vop = { | 297 | static const struct vop_data rk3288_vop = { |
| @@ -352,15 +354,32 @@ static inline void vop_mask_write_relaxed(struct vop *vop, uint32_t offset, | |||
| 352 | } | 354 | } |
| 353 | } | 355 | } |
| 354 | 356 | ||
| 357 | static bool has_rb_swapped(uint32_t format) | ||
| 358 | { | ||
| 359 | switch (format) { | ||
| 360 | case DRM_FORMAT_XBGR8888: | ||
| 361 | case DRM_FORMAT_ABGR8888: | ||
| 362 | case DRM_FORMAT_BGR888: | ||
| 363 | case DRM_FORMAT_BGR565: | ||
| 364 | return true; | ||
| 365 | default: | ||
| 366 | return false; | ||
| 367 | } | ||
| 368 | } | ||
| 369 | |||
| 355 | static enum vop_data_format vop_convert_format(uint32_t format) | 370 | static enum vop_data_format vop_convert_format(uint32_t format) |
| 356 | { | 371 | { |
| 357 | switch (format) { | 372 | switch (format) { |
| 358 | case DRM_FORMAT_XRGB8888: | 373 | case DRM_FORMAT_XRGB8888: |
| 359 | case DRM_FORMAT_ARGB8888: | 374 | case DRM_FORMAT_ARGB8888: |
| 375 | case DRM_FORMAT_XBGR8888: | ||
| 376 | case DRM_FORMAT_ABGR8888: | ||
| 360 | return VOP_FMT_ARGB8888; | 377 | return VOP_FMT_ARGB8888; |
| 361 | case DRM_FORMAT_RGB888: | 378 | case DRM_FORMAT_RGB888: |
| 379 | case DRM_FORMAT_BGR888: | ||
| 362 | return VOP_FMT_RGB888; | 380 | return VOP_FMT_RGB888; |
| 363 | case DRM_FORMAT_RGB565: | 381 | case DRM_FORMAT_RGB565: |
| 382 | case DRM_FORMAT_BGR565: | ||
| 364 | return VOP_FMT_RGB565; | 383 | return VOP_FMT_RGB565; |
| 365 | case DRM_FORMAT_NV12: | 384 | case DRM_FORMAT_NV12: |
| 366 | return VOP_FMT_YUV420SP; | 385 | return VOP_FMT_YUV420SP; |
| @@ -378,6 +397,7 @@ static bool is_alpha_support(uint32_t format) | |||
| 378 | { | 397 | { |
| 379 | switch (format) { | 398 | switch (format) { |
| 380 | case DRM_FORMAT_ARGB8888: | 399 | case DRM_FORMAT_ARGB8888: |
| 400 | case DRM_FORMAT_ABGR8888: | ||
| 381 | return true; | 401 | return true; |
| 382 | default: | 402 | default: |
| 383 | return false; | 403 | return false; |
| @@ -588,6 +608,7 @@ static int vop_update_plane_event(struct drm_plane *plane, | |||
| 588 | enum vop_data_format format; | 608 | enum vop_data_format format; |
| 589 | uint32_t val; | 609 | uint32_t val; |
| 590 | bool is_alpha; | 610 | bool is_alpha; |
| 611 | bool rb_swap; | ||
| 591 | bool visible; | 612 | bool visible; |
| 592 | int ret; | 613 | int ret; |
| 593 | struct drm_rect dest = { | 614 | struct drm_rect dest = { |
| @@ -621,6 +642,7 @@ static int vop_update_plane_event(struct drm_plane *plane, | |||
| 621 | return 0; | 642 | return 0; |
| 622 | 643 | ||
| 623 | is_alpha = is_alpha_support(fb->pixel_format); | 644 | is_alpha = is_alpha_support(fb->pixel_format); |
| 645 | rb_swap = has_rb_swapped(fb->pixel_format); | ||
| 624 | format = vop_convert_format(fb->pixel_format); | 646 | format = vop_convert_format(fb->pixel_format); |
| 625 | if (format < 0) | 647 | if (format < 0) |
| 626 | return format; | 648 | return format; |
| @@ -689,6 +711,7 @@ static int vop_update_plane_event(struct drm_plane *plane, | |||
| 689 | val = (dsp_sty - 1) << 16; | 711 | val = (dsp_sty - 1) << 16; |
| 690 | val |= (dsp_stx - 1) & 0xffff; | 712 | val |= (dsp_stx - 1) & 0xffff; |
| 691 | VOP_WIN_SET(vop, win, dsp_st, val); | 713 | VOP_WIN_SET(vop, win, dsp_st, val); |
| 714 | VOP_WIN_SET(vop, win, rb_swap, rb_swap); | ||
| 692 | 715 | ||
| 693 | if (is_alpha) { | 716 | if (is_alpha) { |
| 694 | VOP_WIN_SET(vop, win, dst_alpha_ctl, | 717 | VOP_WIN_SET(vop, win, dst_alpha_ctl, |
diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c index 3077f1554099..624d941aaad1 100644 --- a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c +++ b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c | |||
| @@ -963,14 +963,13 @@ void ttm_dma_unpopulate(struct ttm_dma_tt *ttm_dma, struct device *dev) | |||
| 963 | } else { | 963 | } else { |
| 964 | pool->npages_free += count; | 964 | pool->npages_free += count; |
| 965 | list_splice(&ttm_dma->pages_list, &pool->free_list); | 965 | list_splice(&ttm_dma->pages_list, &pool->free_list); |
| 966 | npages = count; | 966 | /* |
| 967 | if (pool->npages_free > _manager->options.max_size) { | 967 | * Wait to have at at least NUM_PAGES_TO_ALLOC number of pages |
| 968 | * to free in order to minimize calls to set_memory_wb(). | ||
| 969 | */ | ||
| 970 | if (pool->npages_free >= (_manager->options.max_size + | ||
| 971 | NUM_PAGES_TO_ALLOC)) | ||
| 968 | npages = pool->npages_free - _manager->options.max_size; | 972 | npages = pool->npages_free - _manager->options.max_size; |
| 969 | /* free at least NUM_PAGES_TO_ALLOC number of pages | ||
| 970 | * to reduce calls to set_memory_wb */ | ||
| 971 | if (npages < NUM_PAGES_TO_ALLOC) | ||
| 972 | npages = NUM_PAGES_TO_ALLOC; | ||
| 973 | } | ||
| 974 | } | 973 | } |
| 975 | spin_unlock_irqrestore(&pool->lock, irq_flags); | 974 | spin_unlock_irqrestore(&pool->lock, irq_flags); |
| 976 | 975 | ||
diff --git a/drivers/gpu/ipu-v3/ipu-common.c b/drivers/gpu/ipu-v3/ipu-common.c index 6d2f39d36e44..00f2058944e5 100644 --- a/drivers/gpu/ipu-v3/ipu-common.c +++ b/drivers/gpu/ipu-v3/ipu-common.c | |||
| @@ -1107,6 +1107,9 @@ static int ipu_irq_init(struct ipu_soc *ipu) | |||
| 1107 | return ret; | 1107 | return ret; |
| 1108 | } | 1108 | } |
| 1109 | 1109 | ||
| 1110 | for (i = 0; i < IPU_NUM_IRQS; i += 32) | ||
| 1111 | ipu_cm_write(ipu, 0, IPU_INT_CTRL(i / 32)); | ||
| 1112 | |||
| 1110 | for (i = 0; i < IPU_NUM_IRQS; i += 32) { | 1113 | for (i = 0; i < IPU_NUM_IRQS; i += 32) { |
| 1111 | gc = irq_get_domain_generic_chip(ipu->domain, i); | 1114 | gc = irq_get_domain_generic_chip(ipu->domain, i); |
| 1112 | gc->reg_base = ipu->cm_reg; | 1115 | gc->reg_base = ipu->cm_reg; |
diff --git a/drivers/iio/accel/bmc150-accel.c b/drivers/iio/accel/bmc150-accel.c index 4e70f51c2370..cc5a35750b50 100644 --- a/drivers/iio/accel/bmc150-accel.c +++ b/drivers/iio/accel/bmc150-accel.c | |||
| @@ -1464,7 +1464,7 @@ static void bmc150_accel_unregister_triggers(struct bmc150_accel_data *data, | |||
| 1464 | { | 1464 | { |
| 1465 | int i; | 1465 | int i; |
| 1466 | 1466 | ||
| 1467 | for (i = from; i >= 0; i++) { | 1467 | for (i = from; i >= 0; i--) { |
| 1468 | if (data->triggers[i].indio_trig) { | 1468 | if (data->triggers[i].indio_trig) { |
| 1469 | iio_trigger_unregister(data->triggers[i].indio_trig); | 1469 | iio_trigger_unregister(data->triggers[i].indio_trig); |
| 1470 | data->triggers[i].indio_trig = NULL; | 1470 | data->triggers[i].indio_trig = NULL; |
diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig index 7c5565891cb8..eb0cd897714a 100644 --- a/drivers/iio/adc/Kconfig +++ b/drivers/iio/adc/Kconfig | |||
| @@ -153,8 +153,7 @@ config DA9150_GPADC | |||
| 153 | 153 | ||
| 154 | config CC10001_ADC | 154 | config CC10001_ADC |
| 155 | tristate "Cosmic Circuits 10001 ADC driver" | 155 | tristate "Cosmic Circuits 10001 ADC driver" |
| 156 | depends on HAVE_CLK || REGULATOR | 156 | depends on HAS_IOMEM && HAVE_CLK && REGULATOR |
| 157 | depends on HAS_IOMEM | ||
| 158 | select IIO_BUFFER | 157 | select IIO_BUFFER |
| 159 | select IIO_TRIGGERED_BUFFER | 158 | select IIO_TRIGGERED_BUFFER |
| 160 | help | 159 | help |
diff --git a/drivers/iio/adc/at91_adc.c b/drivers/iio/adc/at91_adc.c index 8a0eb4a04fb5..7b40925dd4ff 100644 --- a/drivers/iio/adc/at91_adc.c +++ b/drivers/iio/adc/at91_adc.c | |||
| @@ -182,7 +182,7 @@ struct at91_adc_caps { | |||
| 182 | u8 ts_pen_detect_sensitivity; | 182 | u8 ts_pen_detect_sensitivity; |
| 183 | 183 | ||
| 184 | /* startup time calculate function */ | 184 | /* startup time calculate function */ |
| 185 | u32 (*calc_startup_ticks)(u8 startup_time, u32 adc_clk_khz); | 185 | u32 (*calc_startup_ticks)(u32 startup_time, u32 adc_clk_khz); |
| 186 | 186 | ||
| 187 | u8 num_channels; | 187 | u8 num_channels; |
| 188 | struct at91_adc_reg_desc registers; | 188 | struct at91_adc_reg_desc registers; |
| @@ -201,7 +201,7 @@ struct at91_adc_state { | |||
| 201 | u8 num_channels; | 201 | u8 num_channels; |
| 202 | void __iomem *reg_base; | 202 | void __iomem *reg_base; |
| 203 | struct at91_adc_reg_desc *registers; | 203 | struct at91_adc_reg_desc *registers; |
| 204 | u8 startup_time; | 204 | u32 startup_time; |
| 205 | u8 sample_hold_time; | 205 | u8 sample_hold_time; |
| 206 | bool sleep_mode; | 206 | bool sleep_mode; |
| 207 | struct iio_trigger **trig; | 207 | struct iio_trigger **trig; |
| @@ -779,7 +779,7 @@ ret: | |||
| 779 | return ret; | 779 | return ret; |
| 780 | } | 780 | } |
| 781 | 781 | ||
| 782 | static u32 calc_startup_ticks_9260(u8 startup_time, u32 adc_clk_khz) | 782 | static u32 calc_startup_ticks_9260(u32 startup_time, u32 adc_clk_khz) |
| 783 | { | 783 | { |
| 784 | /* | 784 | /* |
| 785 | * Number of ticks needed to cover the startup time of the ADC | 785 | * Number of ticks needed to cover the startup time of the ADC |
| @@ -790,7 +790,7 @@ static u32 calc_startup_ticks_9260(u8 startup_time, u32 adc_clk_khz) | |||
| 790 | return round_up((startup_time * adc_clk_khz / 1000) - 1, 8) / 8; | 790 | return round_up((startup_time * adc_clk_khz / 1000) - 1, 8) / 8; |
| 791 | } | 791 | } |
| 792 | 792 | ||
| 793 | static u32 calc_startup_ticks_9x5(u8 startup_time, u32 adc_clk_khz) | 793 | static u32 calc_startup_ticks_9x5(u32 startup_time, u32 adc_clk_khz) |
| 794 | { | 794 | { |
| 795 | /* | 795 | /* |
| 796 | * For sama5d3x and at91sam9x5, the formula changes to: | 796 | * For sama5d3x and at91sam9x5, the formula changes to: |
diff --git a/drivers/iio/adc/rockchip_saradc.c b/drivers/iio/adc/rockchip_saradc.c index 8d4e019ea4ca..9c311c1e1ac7 100644 --- a/drivers/iio/adc/rockchip_saradc.c +++ b/drivers/iio/adc/rockchip_saradc.c | |||
| @@ -349,3 +349,7 @@ static struct platform_driver rockchip_saradc_driver = { | |||
| 349 | }; | 349 | }; |
| 350 | 350 | ||
| 351 | module_platform_driver(rockchip_saradc_driver); | 351 | module_platform_driver(rockchip_saradc_driver); |
| 352 | |||
| 353 | MODULE_AUTHOR("Heiko Stuebner <heiko@sntech.de>"); | ||
| 354 | MODULE_DESCRIPTION("Rockchip SARADC driver"); | ||
| 355 | MODULE_LICENSE("GPL v2"); | ||
diff --git a/drivers/iio/adc/twl4030-madc.c b/drivers/iio/adc/twl4030-madc.c index 06f4792240f0..ebe415f10640 100644 --- a/drivers/iio/adc/twl4030-madc.c +++ b/drivers/iio/adc/twl4030-madc.c | |||
| @@ -833,7 +833,8 @@ static int twl4030_madc_probe(struct platform_device *pdev) | |||
| 833 | irq = platform_get_irq(pdev, 0); | 833 | irq = platform_get_irq(pdev, 0); |
| 834 | ret = devm_request_threaded_irq(&pdev->dev, irq, NULL, | 834 | ret = devm_request_threaded_irq(&pdev->dev, irq, NULL, |
| 835 | twl4030_madc_threaded_irq_handler, | 835 | twl4030_madc_threaded_irq_handler, |
| 836 | IRQF_TRIGGER_RISING, "twl4030_madc", madc); | 836 | IRQF_TRIGGER_RISING | IRQF_ONESHOT, |
| 837 | "twl4030_madc", madc); | ||
| 837 | if (ret) { | 838 | if (ret) { |
| 838 | dev_err(&pdev->dev, "could not request irq\n"); | 839 | dev_err(&pdev->dev, "could not request irq\n"); |
| 839 | goto err_i2c; | 840 | goto err_i2c; |
diff --git a/drivers/iio/common/hid-sensors/hid-sensor-trigger.c b/drivers/iio/common/hid-sensors/hid-sensor-trigger.c index 610fc98f88ef..595511022795 100644 --- a/drivers/iio/common/hid-sensors/hid-sensor-trigger.c +++ b/drivers/iio/common/hid-sensors/hid-sensor-trigger.c | |||
| @@ -36,6 +36,8 @@ static int _hid_sensor_power_state(struct hid_sensor_common *st, bool state) | |||
| 36 | s32 poll_value = 0; | 36 | s32 poll_value = 0; |
| 37 | 37 | ||
| 38 | if (state) { | 38 | if (state) { |
| 39 | if (!atomic_read(&st->user_requested_state)) | ||
| 40 | return 0; | ||
| 39 | if (sensor_hub_device_open(st->hsdev)) | 41 | if (sensor_hub_device_open(st->hsdev)) |
| 40 | return -EIO; | 42 | return -EIO; |
| 41 | 43 | ||
| @@ -52,8 +54,12 @@ static int _hid_sensor_power_state(struct hid_sensor_common *st, bool state) | |||
| 52 | 54 | ||
| 53 | poll_value = hid_sensor_read_poll_value(st); | 55 | poll_value = hid_sensor_read_poll_value(st); |
| 54 | } else { | 56 | } else { |
| 55 | if (!atomic_dec_and_test(&st->data_ready)) | 57 | int val; |
| 58 | |||
| 59 | val = atomic_dec_if_positive(&st->data_ready); | ||
| 60 | if (val < 0) | ||
| 56 | return 0; | 61 | return 0; |
| 62 | |||
| 57 | sensor_hub_device_close(st->hsdev); | 63 | sensor_hub_device_close(st->hsdev); |
| 58 | state_val = hid_sensor_get_usage_index(st->hsdev, | 64 | state_val = hid_sensor_get_usage_index(st->hsdev, |
| 59 | st->power_state.report_id, | 65 | st->power_state.report_id, |
| @@ -92,9 +98,11 @@ EXPORT_SYMBOL(hid_sensor_power_state); | |||
| 92 | 98 | ||
| 93 | int hid_sensor_power_state(struct hid_sensor_common *st, bool state) | 99 | int hid_sensor_power_state(struct hid_sensor_common *st, bool state) |
| 94 | { | 100 | { |
| 101 | |||
| 95 | #ifdef CONFIG_PM | 102 | #ifdef CONFIG_PM |
| 96 | int ret; | 103 | int ret; |
| 97 | 104 | ||
| 105 | atomic_set(&st->user_requested_state, state); | ||
| 98 | if (state) | 106 | if (state) |
| 99 | ret = pm_runtime_get_sync(&st->pdev->dev); | 107 | ret = pm_runtime_get_sync(&st->pdev->dev); |
| 100 | else { | 108 | else { |
| @@ -109,6 +117,7 @@ int hid_sensor_power_state(struct hid_sensor_common *st, bool state) | |||
| 109 | 117 | ||
| 110 | return 0; | 118 | return 0; |
| 111 | #else | 119 | #else |
| 120 | atomic_set(&st->user_requested_state, state); | ||
| 112 | return _hid_sensor_power_state(st, state); | 121 | return _hid_sensor_power_state(st, state); |
| 113 | #endif | 122 | #endif |
| 114 | } | 123 | } |
diff --git a/drivers/iio/dac/ad5624r_spi.c b/drivers/iio/dac/ad5624r_spi.c index 61bb9d4239ea..e98428df0d44 100644 --- a/drivers/iio/dac/ad5624r_spi.c +++ b/drivers/iio/dac/ad5624r_spi.c | |||
| @@ -22,7 +22,7 @@ | |||
| 22 | #include "ad5624r.h" | 22 | #include "ad5624r.h" |
| 23 | 23 | ||
| 24 | static int ad5624r_spi_write(struct spi_device *spi, | 24 | static int ad5624r_spi_write(struct spi_device *spi, |
| 25 | u8 cmd, u8 addr, u16 val, u8 len) | 25 | u8 cmd, u8 addr, u16 val, u8 shift) |
| 26 | { | 26 | { |
| 27 | u32 data; | 27 | u32 data; |
| 28 | u8 msg[3]; | 28 | u8 msg[3]; |
| @@ -35,7 +35,7 @@ static int ad5624r_spi_write(struct spi_device *spi, | |||
| 35 | * 14-, 12-bit input code followed by 0, 2, or 4 don't care bits, | 35 | * 14-, 12-bit input code followed by 0, 2, or 4 don't care bits, |
| 36 | * for the AD5664R, AD5644R, and AD5624R, respectively. | 36 | * for the AD5664R, AD5644R, and AD5624R, respectively. |
| 37 | */ | 37 | */ |
| 38 | data = (0 << 22) | (cmd << 19) | (addr << 16) | (val << (16 - len)); | 38 | data = (0 << 22) | (cmd << 19) | (addr << 16) | (val << shift); |
| 39 | msg[0] = data >> 16; | 39 | msg[0] = data >> 16; |
| 40 | msg[1] = data >> 8; | 40 | msg[1] = data >> 8; |
| 41 | msg[2] = data; | 41 | msg[2] = data; |
diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c index 17d4bb15be4d..65ce86837177 100644 --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c | |||
| @@ -431,6 +431,23 @@ static int inv_mpu6050_write_gyro_scale(struct inv_mpu6050_state *st, int val) | |||
| 431 | return -EINVAL; | 431 | return -EINVAL; |
| 432 | } | 432 | } |
| 433 | 433 | ||
| 434 | static int inv_write_raw_get_fmt(struct iio_dev *indio_dev, | ||
| 435 | struct iio_chan_spec const *chan, long mask) | ||
| 436 | { | ||
| 437 | switch (mask) { | ||
| 438 | case IIO_CHAN_INFO_SCALE: | ||
| 439 | switch (chan->type) { | ||
| 440 | case IIO_ANGL_VEL: | ||
| 441 | return IIO_VAL_INT_PLUS_NANO; | ||
| 442 | default: | ||
| 443 | return IIO_VAL_INT_PLUS_MICRO; | ||
| 444 | } | ||
| 445 | default: | ||
| 446 | return IIO_VAL_INT_PLUS_MICRO; | ||
| 447 | } | ||
| 448 | |||
| 449 | return -EINVAL; | ||
| 450 | } | ||
| 434 | static int inv_mpu6050_write_accel_scale(struct inv_mpu6050_state *st, int val) | 451 | static int inv_mpu6050_write_accel_scale(struct inv_mpu6050_state *st, int val) |
| 435 | { | 452 | { |
| 436 | int result, i; | 453 | int result, i; |
| @@ -696,6 +713,7 @@ static const struct iio_info mpu_info = { | |||
| 696 | .driver_module = THIS_MODULE, | 713 | .driver_module = THIS_MODULE, |
| 697 | .read_raw = &inv_mpu6050_read_raw, | 714 | .read_raw = &inv_mpu6050_read_raw, |
| 698 | .write_raw = &inv_mpu6050_write_raw, | 715 | .write_raw = &inv_mpu6050_write_raw, |
| 716 | .write_raw_get_fmt = &inv_write_raw_get_fmt, | ||
| 699 | .attrs = &inv_attribute_group, | 717 | .attrs = &inv_attribute_group, |
| 700 | .validate_trigger = inv_mpu6050_validate_trigger, | 718 | .validate_trigger = inv_mpu6050_validate_trigger, |
| 701 | }; | 719 | }; |
diff --git a/drivers/iio/light/Kconfig b/drivers/iio/light/Kconfig index e6198b7c9cbf..a5c59251ec0e 100644 --- a/drivers/iio/light/Kconfig +++ b/drivers/iio/light/Kconfig | |||
| @@ -188,6 +188,7 @@ config SENSORS_LM3533 | |||
| 188 | config LTR501 | 188 | config LTR501 |
| 189 | tristate "LTR-501ALS-01 light sensor" | 189 | tristate "LTR-501ALS-01 light sensor" |
| 190 | depends on I2C | 190 | depends on I2C |
| 191 | select REGMAP_I2C | ||
| 191 | select IIO_BUFFER | 192 | select IIO_BUFFER |
| 192 | select IIO_TRIGGERED_BUFFER | 193 | select IIO_TRIGGERED_BUFFER |
| 193 | help | 194 | help |
| @@ -201,6 +202,7 @@ config LTR501 | |||
| 201 | config STK3310 | 202 | config STK3310 |
| 202 | tristate "STK3310 ALS and proximity sensor" | 203 | tristate "STK3310 ALS and proximity sensor" |
| 203 | depends on I2C | 204 | depends on I2C |
| 205 | select REGMAP_I2C | ||
| 204 | help | 206 | help |
| 205 | Say yes here to get support for the Sensortek STK3310 ambient light | 207 | Say yes here to get support for the Sensortek STK3310 ambient light |
| 206 | and proximity sensor. The STK3311 model is also supported by this | 208 | and proximity sensor. The STK3311 model is also supported by this |
diff --git a/drivers/iio/light/cm3323.c b/drivers/iio/light/cm3323.c index 869033e48a1f..a1d4905cc9d2 100644 --- a/drivers/iio/light/cm3323.c +++ b/drivers/iio/light/cm3323.c | |||
| @@ -123,7 +123,7 @@ static int cm3323_set_it_bits(struct cm3323_data *data, int val, int val2) | |||
| 123 | for (i = 0; i < ARRAY_SIZE(cm3323_int_time); i++) { | 123 | for (i = 0; i < ARRAY_SIZE(cm3323_int_time); i++) { |
| 124 | if (val == cm3323_int_time[i].val && | 124 | if (val == cm3323_int_time[i].val && |
| 125 | val2 == cm3323_int_time[i].val2) { | 125 | val2 == cm3323_int_time[i].val2) { |
| 126 | reg_conf = data->reg_conf; | 126 | reg_conf = data->reg_conf & ~CM3323_CONF_IT_MASK; |
| 127 | reg_conf |= i << CM3323_CONF_IT_SHIFT; | 127 | reg_conf |= i << CM3323_CONF_IT_SHIFT; |
| 128 | 128 | ||
| 129 | ret = i2c_smbus_write_word_data(data->client, | 129 | ret = i2c_smbus_write_word_data(data->client, |
diff --git a/drivers/iio/light/ltr501.c b/drivers/iio/light/ltr501.c index 1ef7d3773ab9..b5a0e66b5f28 100644 --- a/drivers/iio/light/ltr501.c +++ b/drivers/iio/light/ltr501.c | |||
| @@ -1302,7 +1302,7 @@ static int ltr501_init(struct ltr501_data *data) | |||
| 1302 | if (ret < 0) | 1302 | if (ret < 0) |
| 1303 | return ret; | 1303 | return ret; |
| 1304 | 1304 | ||
| 1305 | data->als_contr = ret | data->chip_info->als_mode_active; | 1305 | data->als_contr = status | data->chip_info->als_mode_active; |
| 1306 | 1306 | ||
| 1307 | ret = regmap_read(data->regmap, LTR501_PS_CONTR, &status); | 1307 | ret = regmap_read(data->regmap, LTR501_PS_CONTR, &status); |
| 1308 | if (ret < 0) | 1308 | if (ret < 0) |
diff --git a/drivers/iio/light/stk3310.c b/drivers/iio/light/stk3310.c index fee4297d7c8f..c1a218236be5 100644 --- a/drivers/iio/light/stk3310.c +++ b/drivers/iio/light/stk3310.c | |||
| @@ -43,7 +43,6 @@ | |||
| 43 | #define STK3311_CHIP_ID_VAL 0x1D | 43 | #define STK3311_CHIP_ID_VAL 0x1D |
| 44 | #define STK3310_PSINT_EN 0x01 | 44 | #define STK3310_PSINT_EN 0x01 |
| 45 | #define STK3310_PS_MAX_VAL 0xFFFF | 45 | #define STK3310_PS_MAX_VAL 0xFFFF |
| 46 | #define STK3310_THRESH_MAX 0xFFFF | ||
| 47 | 46 | ||
| 48 | #define STK3310_DRIVER_NAME "stk3310" | 47 | #define STK3310_DRIVER_NAME "stk3310" |
| 49 | #define STK3310_REGMAP_NAME "stk3310_regmap" | 48 | #define STK3310_REGMAP_NAME "stk3310_regmap" |
| @@ -84,15 +83,13 @@ static const struct reg_field stk3310_reg_field_flag_psint = | |||
| 84 | REG_FIELD(STK3310_REG_FLAG, 4, 4); | 83 | REG_FIELD(STK3310_REG_FLAG, 4, 4); |
| 85 | static const struct reg_field stk3310_reg_field_flag_nf = | 84 | static const struct reg_field stk3310_reg_field_flag_nf = |
| 86 | REG_FIELD(STK3310_REG_FLAG, 0, 0); | 85 | REG_FIELD(STK3310_REG_FLAG, 0, 0); |
| 87 | /* | 86 | |
| 88 | * Maximum PS values with regard to scale. Used to export the 'inverse' | 87 | /* Estimate maximum proximity values with regard to measurement scale. */ |
| 89 | * PS value (high values for far objects, low values for near objects). | ||
| 90 | */ | ||
| 91 | static const int stk3310_ps_max[4] = { | 88 | static const int stk3310_ps_max[4] = { |
| 92 | STK3310_PS_MAX_VAL / 64, | 89 | STK3310_PS_MAX_VAL / 640, |
| 93 | STK3310_PS_MAX_VAL / 16, | 90 | STK3310_PS_MAX_VAL / 160, |
| 94 | STK3310_PS_MAX_VAL / 4, | 91 | STK3310_PS_MAX_VAL / 40, |
| 95 | STK3310_PS_MAX_VAL, | 92 | STK3310_PS_MAX_VAL / 10 |
| 96 | }; | 93 | }; |
| 97 | 94 | ||
| 98 | static const int stk3310_scale_table[][2] = { | 95 | static const int stk3310_scale_table[][2] = { |
| @@ -128,14 +125,14 @@ static const struct iio_event_spec stk3310_events[] = { | |||
| 128 | /* Proximity event */ | 125 | /* Proximity event */ |
| 129 | { | 126 | { |
| 130 | .type = IIO_EV_TYPE_THRESH, | 127 | .type = IIO_EV_TYPE_THRESH, |
| 131 | .dir = IIO_EV_DIR_FALLING, | 128 | .dir = IIO_EV_DIR_RISING, |
| 132 | .mask_separate = BIT(IIO_EV_INFO_VALUE) | | 129 | .mask_separate = BIT(IIO_EV_INFO_VALUE) | |
| 133 | BIT(IIO_EV_INFO_ENABLE), | 130 | BIT(IIO_EV_INFO_ENABLE), |
| 134 | }, | 131 | }, |
| 135 | /* Out-of-proximity event */ | 132 | /* Out-of-proximity event */ |
| 136 | { | 133 | { |
| 137 | .type = IIO_EV_TYPE_THRESH, | 134 | .type = IIO_EV_TYPE_THRESH, |
| 138 | .dir = IIO_EV_DIR_RISING, | 135 | .dir = IIO_EV_DIR_FALLING, |
| 139 | .mask_separate = BIT(IIO_EV_INFO_VALUE) | | 136 | .mask_separate = BIT(IIO_EV_INFO_VALUE) | |
| 140 | BIT(IIO_EV_INFO_ENABLE), | 137 | BIT(IIO_EV_INFO_ENABLE), |
| 141 | }, | 138 | }, |
| @@ -205,23 +202,16 @@ static int stk3310_read_event(struct iio_dev *indio_dev, | |||
| 205 | u8 reg; | 202 | u8 reg; |
| 206 | u16 buf; | 203 | u16 buf; |
| 207 | int ret; | 204 | int ret; |
| 208 | unsigned int index; | ||
| 209 | struct stk3310_data *data = iio_priv(indio_dev); | 205 | struct stk3310_data *data = iio_priv(indio_dev); |
| 210 | 206 | ||
| 211 | if (info != IIO_EV_INFO_VALUE) | 207 | if (info != IIO_EV_INFO_VALUE) |
| 212 | return -EINVAL; | 208 | return -EINVAL; |
| 213 | 209 | ||
| 214 | /* | 210 | /* Only proximity interrupts are implemented at the moment. */ |
| 215 | * Only proximity interrupts are implemented at the moment. | ||
| 216 | * Since we're inverting proximity values, the sensor's 'high' | ||
| 217 | * threshold will become our 'low' threshold, associated with | ||
| 218 | * 'near' events. Similarly, the sensor's 'low' threshold will | ||
| 219 | * be our 'high' threshold, associated with 'far' events. | ||
| 220 | */ | ||
| 221 | if (dir == IIO_EV_DIR_RISING) | 211 | if (dir == IIO_EV_DIR_RISING) |
| 222 | reg = STK3310_REG_THDL_PS; | ||
| 223 | else if (dir == IIO_EV_DIR_FALLING) | ||
| 224 | reg = STK3310_REG_THDH_PS; | 212 | reg = STK3310_REG_THDH_PS; |
| 213 | else if (dir == IIO_EV_DIR_FALLING) | ||
| 214 | reg = STK3310_REG_THDL_PS; | ||
| 225 | else | 215 | else |
| 226 | return -EINVAL; | 216 | return -EINVAL; |
| 227 | 217 | ||
| @@ -232,8 +222,7 @@ static int stk3310_read_event(struct iio_dev *indio_dev, | |||
| 232 | dev_err(&data->client->dev, "register read failed\n"); | 222 | dev_err(&data->client->dev, "register read failed\n"); |
| 233 | return ret; | 223 | return ret; |
| 234 | } | 224 | } |
| 235 | regmap_field_read(data->reg_ps_gain, &index); | 225 | *val = swab16(buf); |
| 236 | *val = swab16(stk3310_ps_max[index] - buf); | ||
| 237 | 226 | ||
| 238 | return IIO_VAL_INT; | 227 | return IIO_VAL_INT; |
| 239 | } | 228 | } |
| @@ -257,13 +246,13 @@ static int stk3310_write_event(struct iio_dev *indio_dev, | |||
| 257 | return -EINVAL; | 246 | return -EINVAL; |
| 258 | 247 | ||
| 259 | if (dir == IIO_EV_DIR_RISING) | 248 | if (dir == IIO_EV_DIR_RISING) |
| 260 | reg = STK3310_REG_THDL_PS; | ||
| 261 | else if (dir == IIO_EV_DIR_FALLING) | ||
| 262 | reg = STK3310_REG_THDH_PS; | 249 | reg = STK3310_REG_THDH_PS; |
| 250 | else if (dir == IIO_EV_DIR_FALLING) | ||
| 251 | reg = STK3310_REG_THDL_PS; | ||
| 263 | else | 252 | else |
| 264 | return -EINVAL; | 253 | return -EINVAL; |
| 265 | 254 | ||
| 266 | buf = swab16(stk3310_ps_max[index] - val); | 255 | buf = swab16(val); |
| 267 | ret = regmap_bulk_write(data->regmap, reg, &buf, 2); | 256 | ret = regmap_bulk_write(data->regmap, reg, &buf, 2); |
| 268 | if (ret < 0) | 257 | if (ret < 0) |
| 269 | dev_err(&client->dev, "failed to set PS threshold!\n"); | 258 | dev_err(&client->dev, "failed to set PS threshold!\n"); |
| @@ -334,14 +323,6 @@ static int stk3310_read_raw(struct iio_dev *indio_dev, | |||
| 334 | return ret; | 323 | return ret; |
| 335 | } | 324 | } |
| 336 | *val = swab16(buf); | 325 | *val = swab16(buf); |
| 337 | if (chan->type == IIO_PROXIMITY) { | ||
| 338 | /* | ||
| 339 | * Invert the proximity data so we return low values | ||
| 340 | * for close objects and high values for far ones. | ||
| 341 | */ | ||
| 342 | regmap_field_read(data->reg_ps_gain, &index); | ||
| 343 | *val = stk3310_ps_max[index] - *val; | ||
| 344 | } | ||
| 345 | mutex_unlock(&data->lock); | 326 | mutex_unlock(&data->lock); |
| 346 | return IIO_VAL_INT; | 327 | return IIO_VAL_INT; |
| 347 | case IIO_CHAN_INFO_INT_TIME: | 328 | case IIO_CHAN_INFO_INT_TIME: |
| @@ -581,8 +562,8 @@ static irqreturn_t stk3310_irq_event_handler(int irq, void *private) | |||
| 581 | } | 562 | } |
| 582 | event = IIO_UNMOD_EVENT_CODE(IIO_PROXIMITY, 1, | 563 | event = IIO_UNMOD_EVENT_CODE(IIO_PROXIMITY, 1, |
| 583 | IIO_EV_TYPE_THRESH, | 564 | IIO_EV_TYPE_THRESH, |
| 584 | (dir ? IIO_EV_DIR_RISING : | 565 | (dir ? IIO_EV_DIR_FALLING : |
| 585 | IIO_EV_DIR_FALLING)); | 566 | IIO_EV_DIR_RISING)); |
| 586 | iio_push_event(indio_dev, event, data->timestamp); | 567 | iio_push_event(indio_dev, event, data->timestamp); |
| 587 | 568 | ||
| 588 | /* Reset the interrupt flag */ | 569 | /* Reset the interrupt flag */ |
diff --git a/drivers/iio/light/tcs3414.c b/drivers/iio/light/tcs3414.c index 71c2bde275aa..f8b1df018abe 100644 --- a/drivers/iio/light/tcs3414.c +++ b/drivers/iio/light/tcs3414.c | |||
| @@ -185,7 +185,7 @@ static int tcs3414_write_raw(struct iio_dev *indio_dev, | |||
| 185 | if (val != 0) | 185 | if (val != 0) |
| 186 | return -EINVAL; | 186 | return -EINVAL; |
| 187 | for (i = 0; i < ARRAY_SIZE(tcs3414_times); i++) { | 187 | for (i = 0; i < ARRAY_SIZE(tcs3414_times); i++) { |
| 188 | if (val == tcs3414_times[i] * 1000) { | 188 | if (val2 == tcs3414_times[i] * 1000) { |
| 189 | data->timing &= ~TCS3414_INTEG_MASK; | 189 | data->timing &= ~TCS3414_INTEG_MASK; |
| 190 | data->timing |= i; | 190 | data->timing |= i; |
| 191 | return i2c_smbus_write_byte_data( | 191 | return i2c_smbus_write_byte_data( |
diff --git a/drivers/iio/magnetometer/mmc35240.c b/drivers/iio/magnetometer/mmc35240.c index 7a2ea71c659a..d927397a6ef7 100644 --- a/drivers/iio/magnetometer/mmc35240.c +++ b/drivers/iio/magnetometer/mmc35240.c | |||
| @@ -84,10 +84,10 @@ | |||
| 84 | #define MMC35240_OTP_START_ADDR 0x1B | 84 | #define MMC35240_OTP_START_ADDR 0x1B |
| 85 | 85 | ||
| 86 | enum mmc35240_resolution { | 86 | enum mmc35240_resolution { |
| 87 | MMC35240_16_BITS_SLOW = 0, /* 100 Hz */ | 87 | MMC35240_16_BITS_SLOW = 0, /* 7.92 ms */ |
| 88 | MMC35240_16_BITS_FAST, /* 200 Hz */ | 88 | MMC35240_16_BITS_FAST, /* 4.08 ms */ |
| 89 | MMC35240_14_BITS, /* 333 Hz */ | 89 | MMC35240_14_BITS, /* 2.16 ms */ |
| 90 | MMC35240_12_BITS, /* 666 Hz */ | 90 | MMC35240_12_BITS, /* 1.20 ms */ |
| 91 | }; | 91 | }; |
| 92 | 92 | ||
| 93 | enum mmc35240_axis { | 93 | enum mmc35240_axis { |
| @@ -100,22 +100,22 @@ static const struct { | |||
| 100 | int sens[3]; /* sensitivity per X, Y, Z axis */ | 100 | int sens[3]; /* sensitivity per X, Y, Z axis */ |
| 101 | int nfo; /* null field output */ | 101 | int nfo; /* null field output */ |
| 102 | } mmc35240_props_table[] = { | 102 | } mmc35240_props_table[] = { |
| 103 | /* 16 bits, 100Hz ODR */ | 103 | /* 16 bits, 125Hz ODR */ |
| 104 | { | 104 | { |
| 105 | {1024, 1024, 1024}, | 105 | {1024, 1024, 1024}, |
| 106 | 32768, | 106 | 32768, |
| 107 | }, | 107 | }, |
| 108 | /* 16 bits, 200Hz ODR */ | 108 | /* 16 bits, 250Hz ODR */ |
| 109 | { | 109 | { |
| 110 | {1024, 1024, 770}, | 110 | {1024, 1024, 770}, |
| 111 | 32768, | 111 | 32768, |
| 112 | }, | 112 | }, |
| 113 | /* 14 bits, 333Hz ODR */ | 113 | /* 14 bits, 450Hz ODR */ |
| 114 | { | 114 | { |
| 115 | {256, 256, 193}, | 115 | {256, 256, 193}, |
| 116 | 8192, | 116 | 8192, |
| 117 | }, | 117 | }, |
| 118 | /* 12 bits, 666Hz ODR */ | 118 | /* 12 bits, 800Hz ODR */ |
| 119 | { | 119 | { |
| 120 | {64, 64, 48}, | 120 | {64, 64, 48}, |
| 121 | 2048, | 121 | 2048, |
| @@ -133,9 +133,15 @@ struct mmc35240_data { | |||
| 133 | int axis_scale[3]; | 133 | int axis_scale[3]; |
| 134 | }; | 134 | }; |
| 135 | 135 | ||
| 136 | static const int mmc35240_samp_freq[] = {100, 200, 333, 666}; | 136 | static const struct { |
| 137 | int val; | ||
| 138 | int val2; | ||
| 139 | } mmc35240_samp_freq[] = { {1, 500000}, | ||
| 140 | {13, 0}, | ||
| 141 | {25, 0}, | ||
| 142 | {50, 0} }; | ||
| 137 | 143 | ||
| 138 | static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("100 200 333 666"); | 144 | static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("1.5 13 25 50"); |
| 139 | 145 | ||
| 140 | #define MMC35240_CHANNEL(_axis) { \ | 146 | #define MMC35240_CHANNEL(_axis) { \ |
| 141 | .type = IIO_MAGN, \ | 147 | .type = IIO_MAGN, \ |
| @@ -168,7 +174,8 @@ static int mmc35240_get_samp_freq_index(struct mmc35240_data *data, | |||
| 168 | int i; | 174 | int i; |
| 169 | 175 | ||
| 170 | for (i = 0; i < ARRAY_SIZE(mmc35240_samp_freq); i++) | 176 | for (i = 0; i < ARRAY_SIZE(mmc35240_samp_freq); i++) |
| 171 | if (mmc35240_samp_freq[i] == val) | 177 | if (mmc35240_samp_freq[i].val == val && |
| 178 | mmc35240_samp_freq[i].val2 == val2) | ||
| 172 | return i; | 179 | return i; |
| 173 | return -EINVAL; | 180 | return -EINVAL; |
| 174 | } | 181 | } |
| @@ -378,9 +385,9 @@ static int mmc35240_read_raw(struct iio_dev *indio_dev, | |||
| 378 | if (i < 0 || i >= ARRAY_SIZE(mmc35240_samp_freq)) | 385 | if (i < 0 || i >= ARRAY_SIZE(mmc35240_samp_freq)) |
| 379 | return -EINVAL; | 386 | return -EINVAL; |
| 380 | 387 | ||
| 381 | *val = mmc35240_samp_freq[i]; | 388 | *val = mmc35240_samp_freq[i].val; |
| 382 | *val2 = 0; | 389 | *val2 = mmc35240_samp_freq[i].val2; |
| 383 | return IIO_VAL_INT; | 390 | return IIO_VAL_INT_PLUS_MICRO; |
| 384 | default: | 391 | default: |
| 385 | return -EINVAL; | 392 | return -EINVAL; |
| 386 | } | 393 | } |
diff --git a/drivers/iio/proximity/sx9500.c b/drivers/iio/proximity/sx9500.c index 2042e375f835..3d756bd8c703 100644 --- a/drivers/iio/proximity/sx9500.c +++ b/drivers/iio/proximity/sx9500.c | |||
| @@ -80,6 +80,7 @@ | |||
| 80 | #define SX9500_COMPSTAT_MASK GENMASK(3, 0) | 80 | #define SX9500_COMPSTAT_MASK GENMASK(3, 0) |
| 81 | 81 | ||
| 82 | #define SX9500_NUM_CHANNELS 4 | 82 | #define SX9500_NUM_CHANNELS 4 |
| 83 | #define SX9500_CHAN_MASK GENMASK(SX9500_NUM_CHANNELS - 1, 0) | ||
| 83 | 84 | ||
| 84 | struct sx9500_data { | 85 | struct sx9500_data { |
| 85 | struct mutex mutex; | 86 | struct mutex mutex; |
| @@ -281,7 +282,7 @@ static int sx9500_read_prox_data(struct sx9500_data *data, | |||
| 281 | if (ret < 0) | 282 | if (ret < 0) |
| 282 | return ret; | 283 | return ret; |
| 283 | 284 | ||
| 284 | *val = 32767 - (s16)be16_to_cpu(regval); | 285 | *val = be16_to_cpu(regval); |
| 285 | 286 | ||
| 286 | return IIO_VAL_INT; | 287 | return IIO_VAL_INT; |
| 287 | } | 288 | } |
| @@ -329,27 +330,29 @@ static int sx9500_read_proximity(struct sx9500_data *data, | |||
| 329 | else | 330 | else |
| 330 | ret = sx9500_wait_for_sample(data); | 331 | ret = sx9500_wait_for_sample(data); |
| 331 | 332 | ||
| 332 | if (ret < 0) | ||
| 333 | return ret; | ||
| 334 | |||
| 335 | mutex_lock(&data->mutex); | 333 | mutex_lock(&data->mutex); |
| 336 | 334 | ||
| 337 | ret = sx9500_read_prox_data(data, chan, val); | ||
| 338 | if (ret < 0) | 335 | if (ret < 0) |
| 339 | goto out; | 336 | goto out_dec_data_rdy; |
| 340 | 337 | ||
| 341 | ret = sx9500_dec_chan_users(data, chan->channel); | 338 | ret = sx9500_read_prox_data(data, chan, val); |
| 342 | if (ret < 0) | 339 | if (ret < 0) |
| 343 | goto out; | 340 | goto out_dec_data_rdy; |
| 344 | 341 | ||
| 345 | ret = sx9500_dec_data_rdy_users(data); | 342 | ret = sx9500_dec_data_rdy_users(data); |
| 346 | if (ret < 0) | 343 | if (ret < 0) |
| 344 | goto out_dec_chan; | ||
| 345 | |||
| 346 | ret = sx9500_dec_chan_users(data, chan->channel); | ||
| 347 | if (ret < 0) | ||
| 347 | goto out; | 348 | goto out; |
| 348 | 349 | ||
| 349 | ret = IIO_VAL_INT; | 350 | ret = IIO_VAL_INT; |
| 350 | 351 | ||
| 351 | goto out; | 352 | goto out; |
| 352 | 353 | ||
| 354 | out_dec_data_rdy: | ||
| 355 | sx9500_dec_data_rdy_users(data); | ||
| 353 | out_dec_chan: | 356 | out_dec_chan: |
| 354 | sx9500_dec_chan_users(data, chan->channel); | 357 | sx9500_dec_chan_users(data, chan->channel); |
| 355 | out: | 358 | out: |
| @@ -679,7 +682,7 @@ out: | |||
| 679 | static int sx9500_buffer_preenable(struct iio_dev *indio_dev) | 682 | static int sx9500_buffer_preenable(struct iio_dev *indio_dev) |
| 680 | { | 683 | { |
| 681 | struct sx9500_data *data = iio_priv(indio_dev); | 684 | struct sx9500_data *data = iio_priv(indio_dev); |
| 682 | int ret, i; | 685 | int ret = 0, i; |
| 683 | 686 | ||
| 684 | mutex_lock(&data->mutex); | 687 | mutex_lock(&data->mutex); |
| 685 | 688 | ||
| @@ -703,7 +706,7 @@ static int sx9500_buffer_preenable(struct iio_dev *indio_dev) | |||
| 703 | static int sx9500_buffer_predisable(struct iio_dev *indio_dev) | 706 | static int sx9500_buffer_predisable(struct iio_dev *indio_dev) |
| 704 | { | 707 | { |
| 705 | struct sx9500_data *data = iio_priv(indio_dev); | 708 | struct sx9500_data *data = iio_priv(indio_dev); |
| 706 | int ret, i; | 709 | int ret = 0, i; |
| 707 | 710 | ||
| 708 | iio_triggered_buffer_predisable(indio_dev); | 711 | iio_triggered_buffer_predisable(indio_dev); |
| 709 | 712 | ||
| @@ -800,8 +803,7 @@ static int sx9500_init_compensation(struct iio_dev *indio_dev) | |||
| 800 | unsigned int val; | 803 | unsigned int val; |
| 801 | 804 | ||
| 802 | ret = regmap_update_bits(data->regmap, SX9500_REG_PROX_CTRL0, | 805 | ret = regmap_update_bits(data->regmap, SX9500_REG_PROX_CTRL0, |
| 803 | GENMASK(SX9500_NUM_CHANNELS, 0), | 806 | SX9500_CHAN_MASK, SX9500_CHAN_MASK); |
| 804 | GENMASK(SX9500_NUM_CHANNELS, 0)); | ||
| 805 | if (ret < 0) | 807 | if (ret < 0) |
| 806 | return ret; | 808 | return ret; |
| 807 | 809 | ||
| @@ -821,7 +823,7 @@ static int sx9500_init_compensation(struct iio_dev *indio_dev) | |||
| 821 | 823 | ||
| 822 | out: | 824 | out: |
| 823 | regmap_update_bits(data->regmap, SX9500_REG_PROX_CTRL0, | 825 | regmap_update_bits(data->regmap, SX9500_REG_PROX_CTRL0, |
| 824 | GENMASK(SX9500_NUM_CHANNELS, 0), 0); | 826 | SX9500_CHAN_MASK, 0); |
| 825 | return ret; | 827 | return ret; |
| 826 | } | 828 | } |
| 827 | 829 | ||
diff --git a/drivers/iio/temperature/tmp006.c b/drivers/iio/temperature/tmp006.c index fcc49f89b946..8f21f32f9739 100644 --- a/drivers/iio/temperature/tmp006.c +++ b/drivers/iio/temperature/tmp006.c | |||
| @@ -132,6 +132,9 @@ static int tmp006_write_raw(struct iio_dev *indio_dev, | |||
| 132 | struct tmp006_data *data = iio_priv(indio_dev); | 132 | struct tmp006_data *data = iio_priv(indio_dev); |
| 133 | int i; | 133 | int i; |
| 134 | 134 | ||
| 135 | if (mask != IIO_CHAN_INFO_SAMP_FREQ) | ||
| 136 | return -EINVAL; | ||
| 137 | |||
| 135 | for (i = 0; i < ARRAY_SIZE(tmp006_freqs); i++) | 138 | for (i = 0; i < ARRAY_SIZE(tmp006_freqs); i++) |
| 136 | if ((val == tmp006_freqs[i][0]) && | 139 | if ((val == tmp006_freqs[i][0]) && |
| 137 | (val2 == tmp006_freqs[i][1])) { | 140 | (val2 == tmp006_freqs[i][1])) { |
diff --git a/drivers/infiniband/core/agent.c b/drivers/infiniband/core/agent.c index c7dcfe4ca5f1..0429040304fd 100644 --- a/drivers/infiniband/core/agent.c +++ b/drivers/infiniband/core/agent.c | |||
| @@ -88,7 +88,7 @@ void agent_send_response(const struct ib_mad_hdr *mad_hdr, const struct ib_grh * | |||
| 88 | struct ib_ah *ah; | 88 | struct ib_ah *ah; |
| 89 | struct ib_mad_send_wr_private *mad_send_wr; | 89 | struct ib_mad_send_wr_private *mad_send_wr; |
| 90 | 90 | ||
| 91 | if (device->node_type == RDMA_NODE_IB_SWITCH) | 91 | if (rdma_cap_ib_switch(device)) |
| 92 | port_priv = ib_get_agent_port(device, 0); | 92 | port_priv = ib_get_agent_port(device, 0); |
| 93 | else | 93 | else |
| 94 | port_priv = ib_get_agent_port(device, port_num); | 94 | port_priv = ib_get_agent_port(device, port_num); |
| @@ -122,7 +122,7 @@ void agent_send_response(const struct ib_mad_hdr *mad_hdr, const struct ib_grh * | |||
| 122 | memcpy(send_buf->mad, mad_hdr, resp_mad_len); | 122 | memcpy(send_buf->mad, mad_hdr, resp_mad_len); |
| 123 | send_buf->ah = ah; | 123 | send_buf->ah = ah; |
| 124 | 124 | ||
| 125 | if (device->node_type == RDMA_NODE_IB_SWITCH) { | 125 | if (rdma_cap_ib_switch(device)) { |
| 126 | mad_send_wr = container_of(send_buf, | 126 | mad_send_wr = container_of(send_buf, |
| 127 | struct ib_mad_send_wr_private, | 127 | struct ib_mad_send_wr_private, |
| 128 | send_buf); | 128 | send_buf); |
diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c index dbddddd6fb5d..3a972ebf3c0d 100644 --- a/drivers/infiniband/core/cm.c +++ b/drivers/infiniband/core/cm.c | |||
| @@ -169,6 +169,7 @@ struct cm_device { | |||
| 169 | struct ib_device *ib_device; | 169 | struct ib_device *ib_device; |
| 170 | struct device *device; | 170 | struct device *device; |
| 171 | u8 ack_delay; | 171 | u8 ack_delay; |
| 172 | int going_down; | ||
| 172 | struct cm_port *port[0]; | 173 | struct cm_port *port[0]; |
| 173 | }; | 174 | }; |
| 174 | 175 | ||
| @@ -805,6 +806,11 @@ static void cm_enter_timewait(struct cm_id_private *cm_id_priv) | |||
| 805 | { | 806 | { |
| 806 | int wait_time; | 807 | int wait_time; |
| 807 | unsigned long flags; | 808 | unsigned long flags; |
| 809 | struct cm_device *cm_dev; | ||
| 810 | |||
| 811 | cm_dev = ib_get_client_data(cm_id_priv->id.device, &cm_client); | ||
| 812 | if (!cm_dev) | ||
| 813 | return; | ||
| 808 | 814 | ||
| 809 | spin_lock_irqsave(&cm.lock, flags); | 815 | spin_lock_irqsave(&cm.lock, flags); |
| 810 | cm_cleanup_timewait(cm_id_priv->timewait_info); | 816 | cm_cleanup_timewait(cm_id_priv->timewait_info); |
| @@ -818,8 +824,14 @@ static void cm_enter_timewait(struct cm_id_private *cm_id_priv) | |||
| 818 | */ | 824 | */ |
| 819 | cm_id_priv->id.state = IB_CM_TIMEWAIT; | 825 | cm_id_priv->id.state = IB_CM_TIMEWAIT; |
| 820 | wait_time = cm_convert_to_ms(cm_id_priv->av.timeout); | 826 | wait_time = cm_convert_to_ms(cm_id_priv->av.timeout); |
| 821 | queue_delayed_work(cm.wq, &cm_id_priv->timewait_info->work.work, | 827 | |
| 822 | msecs_to_jiffies(wait_time)); | 828 | /* Check if the device started its remove_one */ |
| 829 | spin_lock_irq(&cm.lock); | ||
| 830 | if (!cm_dev->going_down) | ||
| 831 | queue_delayed_work(cm.wq, &cm_id_priv->timewait_info->work.work, | ||
| 832 | msecs_to_jiffies(wait_time)); | ||
| 833 | spin_unlock_irq(&cm.lock); | ||
| 834 | |||
| 823 | cm_id_priv->timewait_info = NULL; | 835 | cm_id_priv->timewait_info = NULL; |
| 824 | } | 836 | } |
| 825 | 837 | ||
| @@ -3305,6 +3317,11 @@ static int cm_establish(struct ib_cm_id *cm_id) | |||
| 3305 | struct cm_work *work; | 3317 | struct cm_work *work; |
| 3306 | unsigned long flags; | 3318 | unsigned long flags; |
| 3307 | int ret = 0; | 3319 | int ret = 0; |
| 3320 | struct cm_device *cm_dev; | ||
| 3321 | |||
| 3322 | cm_dev = ib_get_client_data(cm_id->device, &cm_client); | ||
| 3323 | if (!cm_dev) | ||
| 3324 | return -ENODEV; | ||
| 3308 | 3325 | ||
| 3309 | work = kmalloc(sizeof *work, GFP_ATOMIC); | 3326 | work = kmalloc(sizeof *work, GFP_ATOMIC); |
| 3310 | if (!work) | 3327 | if (!work) |
| @@ -3343,7 +3360,17 @@ static int cm_establish(struct ib_cm_id *cm_id) | |||
| 3343 | work->remote_id = cm_id->remote_id; | 3360 | work->remote_id = cm_id->remote_id; |
| 3344 | work->mad_recv_wc = NULL; | 3361 | work->mad_recv_wc = NULL; |
| 3345 | work->cm_event.event = IB_CM_USER_ESTABLISHED; | 3362 | work->cm_event.event = IB_CM_USER_ESTABLISHED; |
| 3346 | queue_delayed_work(cm.wq, &work->work, 0); | 3363 | |
| 3364 | /* Check if the device started its remove_one */ | ||
| 3365 | spin_lock_irq(&cm.lock); | ||
| 3366 | if (!cm_dev->going_down) { | ||
| 3367 | queue_delayed_work(cm.wq, &work->work, 0); | ||
| 3368 | } else { | ||
| 3369 | kfree(work); | ||
| 3370 | ret = -ENODEV; | ||
| 3371 | } | ||
| 3372 | spin_unlock_irq(&cm.lock); | ||
| 3373 | |||
| 3347 | out: | 3374 | out: |
| 3348 | return ret; | 3375 | return ret; |
| 3349 | } | 3376 | } |
| @@ -3394,6 +3421,7 @@ static void cm_recv_handler(struct ib_mad_agent *mad_agent, | |||
| 3394 | enum ib_cm_event_type event; | 3421 | enum ib_cm_event_type event; |
| 3395 | u16 attr_id; | 3422 | u16 attr_id; |
| 3396 | int paths = 0; | 3423 | int paths = 0; |
| 3424 | int going_down = 0; | ||
| 3397 | 3425 | ||
| 3398 | switch (mad_recv_wc->recv_buf.mad->mad_hdr.attr_id) { | 3426 | switch (mad_recv_wc->recv_buf.mad->mad_hdr.attr_id) { |
| 3399 | case CM_REQ_ATTR_ID: | 3427 | case CM_REQ_ATTR_ID: |
| @@ -3452,7 +3480,19 @@ static void cm_recv_handler(struct ib_mad_agent *mad_agent, | |||
| 3452 | work->cm_event.event = event; | 3480 | work->cm_event.event = event; |
| 3453 | work->mad_recv_wc = mad_recv_wc; | 3481 | work->mad_recv_wc = mad_recv_wc; |
| 3454 | work->port = port; | 3482 | work->port = port; |
| 3455 | queue_delayed_work(cm.wq, &work->work, 0); | 3483 | |
| 3484 | /* Check if the device started its remove_one */ | ||
| 3485 | spin_lock_irq(&cm.lock); | ||
| 3486 | if (!port->cm_dev->going_down) | ||
| 3487 | queue_delayed_work(cm.wq, &work->work, 0); | ||
| 3488 | else | ||
| 3489 | going_down = 1; | ||
| 3490 | spin_unlock_irq(&cm.lock); | ||
| 3491 | |||
| 3492 | if (going_down) { | ||
| 3493 | kfree(work); | ||
| 3494 | ib_free_recv_mad(mad_recv_wc); | ||
| 3495 | } | ||
| 3456 | } | 3496 | } |
| 3457 | 3497 | ||
| 3458 | static int cm_init_qp_init_attr(struct cm_id_private *cm_id_priv, | 3498 | static int cm_init_qp_init_attr(struct cm_id_private *cm_id_priv, |
| @@ -3771,7 +3811,7 @@ static void cm_add_one(struct ib_device *ib_device) | |||
| 3771 | 3811 | ||
| 3772 | cm_dev->ib_device = ib_device; | 3812 | cm_dev->ib_device = ib_device; |
| 3773 | cm_get_ack_delay(cm_dev); | 3813 | cm_get_ack_delay(cm_dev); |
| 3774 | 3814 | cm_dev->going_down = 0; | |
| 3775 | cm_dev->device = device_create(&cm_class, &ib_device->dev, | 3815 | cm_dev->device = device_create(&cm_class, &ib_device->dev, |
| 3776 | MKDEV(0, 0), NULL, | 3816 | MKDEV(0, 0), NULL, |
| 3777 | "%s", ib_device->name); | 3817 | "%s", ib_device->name); |
| @@ -3864,14 +3904,23 @@ static void cm_remove_one(struct ib_device *ib_device) | |||
| 3864 | list_del(&cm_dev->list); | 3904 | list_del(&cm_dev->list); |
| 3865 | write_unlock_irqrestore(&cm.device_lock, flags); | 3905 | write_unlock_irqrestore(&cm.device_lock, flags); |
| 3866 | 3906 | ||
| 3907 | spin_lock_irq(&cm.lock); | ||
| 3908 | cm_dev->going_down = 1; | ||
| 3909 | spin_unlock_irq(&cm.lock); | ||
| 3910 | |||
| 3867 | for (i = 1; i <= ib_device->phys_port_cnt; i++) { | 3911 | for (i = 1; i <= ib_device->phys_port_cnt; i++) { |
| 3868 | if (!rdma_cap_ib_cm(ib_device, i)) | 3912 | if (!rdma_cap_ib_cm(ib_device, i)) |
| 3869 | continue; | 3913 | continue; |
| 3870 | 3914 | ||
| 3871 | port = cm_dev->port[i-1]; | 3915 | port = cm_dev->port[i-1]; |
| 3872 | ib_modify_port(ib_device, port->port_num, 0, &port_modify); | 3916 | ib_modify_port(ib_device, port->port_num, 0, &port_modify); |
| 3873 | ib_unregister_mad_agent(port->mad_agent); | 3917 | /* |
| 3918 | * We flush the queue here after the going_down set, this | ||
| 3919 | * verify that no new works will be queued in the recv handler, | ||
| 3920 | * after that we can call the unregister_mad_agent | ||
| 3921 | */ | ||
| 3874 | flush_workqueue(cm.wq); | 3922 | flush_workqueue(cm.wq); |
| 3923 | ib_unregister_mad_agent(port->mad_agent); | ||
| 3875 | cm_remove_port_fs(port); | 3924 | cm_remove_port_fs(port); |
| 3876 | } | 3925 | } |
| 3877 | device_unregister(cm_dev->device); | 3926 | device_unregister(cm_dev->device); |
diff --git a/drivers/infiniband/core/iwpm_msg.c b/drivers/infiniband/core/iwpm_msg.c index e6ffa2e66c1a..22a3abee2a54 100644 --- a/drivers/infiniband/core/iwpm_msg.c +++ b/drivers/infiniband/core/iwpm_msg.c | |||
| @@ -67,7 +67,8 @@ int iwpm_register_pid(struct iwpm_dev_data *pm_msg, u8 nl_client) | |||
| 67 | err_str = "Invalid port mapper client"; | 67 | err_str = "Invalid port mapper client"; |
| 68 | goto pid_query_error; | 68 | goto pid_query_error; |
| 69 | } | 69 | } |
| 70 | if (iwpm_registered_client(nl_client)) | 70 | if (iwpm_check_registration(nl_client, IWPM_REG_VALID) || |
| 71 | iwpm_user_pid == IWPM_PID_UNAVAILABLE) | ||
| 71 | return 0; | 72 | return 0; |
| 72 | skb = iwpm_create_nlmsg(RDMA_NL_IWPM_REG_PID, &nlh, nl_client); | 73 | skb = iwpm_create_nlmsg(RDMA_NL_IWPM_REG_PID, &nlh, nl_client); |
| 73 | if (!skb) { | 74 | if (!skb) { |
| @@ -106,7 +107,6 @@ int iwpm_register_pid(struct iwpm_dev_data *pm_msg, u8 nl_client) | |||
| 106 | ret = ibnl_multicast(skb, nlh, RDMA_NL_GROUP_IWPM, GFP_KERNEL); | 107 | ret = ibnl_multicast(skb, nlh, RDMA_NL_GROUP_IWPM, GFP_KERNEL); |
| 107 | if (ret) { | 108 | if (ret) { |
| 108 | skb = NULL; /* skb is freed in the netlink send-op handling */ | 109 | skb = NULL; /* skb is freed in the netlink send-op handling */ |
| 109 | iwpm_set_registered(nl_client, 1); | ||
| 110 | iwpm_user_pid = IWPM_PID_UNAVAILABLE; | 110 | iwpm_user_pid = IWPM_PID_UNAVAILABLE; |
| 111 | err_str = "Unable to send a nlmsg"; | 111 | err_str = "Unable to send a nlmsg"; |
| 112 | goto pid_query_error; | 112 | goto pid_query_error; |
| @@ -144,12 +144,12 @@ int iwpm_add_mapping(struct iwpm_sa_data *pm_msg, u8 nl_client) | |||
| 144 | err_str = "Invalid port mapper client"; | 144 | err_str = "Invalid port mapper client"; |
| 145 | goto add_mapping_error; | 145 | goto add_mapping_error; |
| 146 | } | 146 | } |
| 147 | if (!iwpm_registered_client(nl_client)) { | 147 | if (!iwpm_valid_pid()) |
| 148 | return 0; | ||
| 149 | if (!iwpm_check_registration(nl_client, IWPM_REG_VALID)) { | ||
| 148 | err_str = "Unregistered port mapper client"; | 150 | err_str = "Unregistered port mapper client"; |
| 149 | goto add_mapping_error; | 151 | goto add_mapping_error; |
| 150 | } | 152 | } |
| 151 | if (!iwpm_valid_pid()) | ||
| 152 | return 0; | ||
| 153 | skb = iwpm_create_nlmsg(RDMA_NL_IWPM_ADD_MAPPING, &nlh, nl_client); | 153 | skb = iwpm_create_nlmsg(RDMA_NL_IWPM_ADD_MAPPING, &nlh, nl_client); |
| 154 | if (!skb) { | 154 | if (!skb) { |
| 155 | err_str = "Unable to create a nlmsg"; | 155 | err_str = "Unable to create a nlmsg"; |
| @@ -214,12 +214,12 @@ int iwpm_add_and_query_mapping(struct iwpm_sa_data *pm_msg, u8 nl_client) | |||
| 214 | err_str = "Invalid port mapper client"; | 214 | err_str = "Invalid port mapper client"; |
| 215 | goto query_mapping_error; | 215 | goto query_mapping_error; |
| 216 | } | 216 | } |
| 217 | if (!iwpm_registered_client(nl_client)) { | 217 | if (!iwpm_valid_pid()) |
| 218 | return 0; | ||
| 219 | if (!iwpm_check_registration(nl_client, IWPM_REG_VALID)) { | ||
| 218 | err_str = "Unregistered port mapper client"; | 220 | err_str = "Unregistered port mapper client"; |
| 219 | goto query_mapping_error; | 221 | goto query_mapping_error; |
| 220 | } | 222 | } |
| 221 | if (!iwpm_valid_pid()) | ||
| 222 | return 0; | ||
| 223 | ret = -ENOMEM; | 223 | ret = -ENOMEM; |
| 224 | skb = iwpm_create_nlmsg(RDMA_NL_IWPM_QUERY_MAPPING, &nlh, nl_client); | 224 | skb = iwpm_create_nlmsg(RDMA_NL_IWPM_QUERY_MAPPING, &nlh, nl_client); |
| 225 | if (!skb) { | 225 | if (!skb) { |
| @@ -288,12 +288,12 @@ int iwpm_remove_mapping(struct sockaddr_storage *local_addr, u8 nl_client) | |||
| 288 | err_str = "Invalid port mapper client"; | 288 | err_str = "Invalid port mapper client"; |
| 289 | goto remove_mapping_error; | 289 | goto remove_mapping_error; |
| 290 | } | 290 | } |
| 291 | if (!iwpm_registered_client(nl_client)) { | 291 | if (!iwpm_valid_pid()) |
| 292 | return 0; | ||
| 293 | if (iwpm_check_registration(nl_client, IWPM_REG_UNDEF)) { | ||
| 292 | err_str = "Unregistered port mapper client"; | 294 | err_str = "Unregistered port mapper client"; |
| 293 | goto remove_mapping_error; | 295 | goto remove_mapping_error; |
| 294 | } | 296 | } |
| 295 | if (!iwpm_valid_pid()) | ||
| 296 | return 0; | ||
| 297 | skb = iwpm_create_nlmsg(RDMA_NL_IWPM_REMOVE_MAPPING, &nlh, nl_client); | 297 | skb = iwpm_create_nlmsg(RDMA_NL_IWPM_REMOVE_MAPPING, &nlh, nl_client); |
| 298 | if (!skb) { | 298 | if (!skb) { |
| 299 | ret = -ENOMEM; | 299 | ret = -ENOMEM; |
| @@ -388,7 +388,7 @@ int iwpm_register_pid_cb(struct sk_buff *skb, struct netlink_callback *cb) | |||
| 388 | pr_debug("%s: iWarp Port Mapper (pid = %d) is available!\n", | 388 | pr_debug("%s: iWarp Port Mapper (pid = %d) is available!\n", |
| 389 | __func__, iwpm_user_pid); | 389 | __func__, iwpm_user_pid); |
| 390 | if (iwpm_valid_client(nl_client)) | 390 | if (iwpm_valid_client(nl_client)) |
| 391 | iwpm_set_registered(nl_client, 1); | 391 | iwpm_set_registration(nl_client, IWPM_REG_VALID); |
| 392 | register_pid_response_exit: | 392 | register_pid_response_exit: |
| 393 | nlmsg_request->request_done = 1; | 393 | nlmsg_request->request_done = 1; |
| 394 | /* always for found nlmsg_request */ | 394 | /* always for found nlmsg_request */ |
| @@ -644,7 +644,6 @@ int iwpm_mapping_info_cb(struct sk_buff *skb, struct netlink_callback *cb) | |||
| 644 | { | 644 | { |
| 645 | struct nlattr *nltb[IWPM_NLA_MAPINFO_REQ_MAX]; | 645 | struct nlattr *nltb[IWPM_NLA_MAPINFO_REQ_MAX]; |
| 646 | const char *msg_type = "Mapping Info response"; | 646 | const char *msg_type = "Mapping Info response"; |
| 647 | int iwpm_pid; | ||
| 648 | u8 nl_client; | 647 | u8 nl_client; |
| 649 | char *iwpm_name; | 648 | char *iwpm_name; |
| 650 | u16 iwpm_version; | 649 | u16 iwpm_version; |
| @@ -669,14 +668,14 @@ int iwpm_mapping_info_cb(struct sk_buff *skb, struct netlink_callback *cb) | |||
| 669 | __func__, nl_client); | 668 | __func__, nl_client); |
| 670 | return ret; | 669 | return ret; |
| 671 | } | 670 | } |
| 672 | iwpm_set_registered(nl_client, 0); | 671 | iwpm_set_registration(nl_client, IWPM_REG_INCOMPL); |
| 673 | atomic_set(&echo_nlmsg_seq, cb->nlh->nlmsg_seq); | 672 | atomic_set(&echo_nlmsg_seq, cb->nlh->nlmsg_seq); |
| 673 | iwpm_user_pid = cb->nlh->nlmsg_pid; | ||
| 674 | if (!iwpm_mapinfo_available()) | 674 | if (!iwpm_mapinfo_available()) |
| 675 | return 0; | 675 | return 0; |
| 676 | iwpm_pid = cb->nlh->nlmsg_pid; | ||
| 677 | pr_debug("%s: iWarp Port Mapper (pid = %d) is available!\n", | 676 | pr_debug("%s: iWarp Port Mapper (pid = %d) is available!\n", |
| 678 | __func__, iwpm_pid); | 677 | __func__, iwpm_user_pid); |
| 679 | ret = iwpm_send_mapinfo(nl_client, iwpm_pid); | 678 | ret = iwpm_send_mapinfo(nl_client, iwpm_user_pid); |
| 680 | return ret; | 679 | return ret; |
| 681 | } | 680 | } |
| 682 | EXPORT_SYMBOL(iwpm_mapping_info_cb); | 681 | EXPORT_SYMBOL(iwpm_mapping_info_cb); |
diff --git a/drivers/infiniband/core/iwpm_util.c b/drivers/infiniband/core/iwpm_util.c index a626795bf9c7..5fb089e91353 100644 --- a/drivers/infiniband/core/iwpm_util.c +++ b/drivers/infiniband/core/iwpm_util.c | |||
| @@ -78,6 +78,7 @@ init_exit: | |||
| 78 | mutex_unlock(&iwpm_admin_lock); | 78 | mutex_unlock(&iwpm_admin_lock); |
| 79 | if (!ret) { | 79 | if (!ret) { |
| 80 | iwpm_set_valid(nl_client, 1); | 80 | iwpm_set_valid(nl_client, 1); |
| 81 | iwpm_set_registration(nl_client, IWPM_REG_UNDEF); | ||
| 81 | pr_debug("%s: Mapinfo and reminfo tables are created\n", | 82 | pr_debug("%s: Mapinfo and reminfo tables are created\n", |
| 82 | __func__); | 83 | __func__); |
| 83 | } | 84 | } |
| @@ -106,6 +107,7 @@ int iwpm_exit(u8 nl_client) | |||
| 106 | } | 107 | } |
| 107 | mutex_unlock(&iwpm_admin_lock); | 108 | mutex_unlock(&iwpm_admin_lock); |
| 108 | iwpm_set_valid(nl_client, 0); | 109 | iwpm_set_valid(nl_client, 0); |
| 110 | iwpm_set_registration(nl_client, IWPM_REG_UNDEF); | ||
| 109 | return 0; | 111 | return 0; |
| 110 | } | 112 | } |
| 111 | EXPORT_SYMBOL(iwpm_exit); | 113 | EXPORT_SYMBOL(iwpm_exit); |
| @@ -397,17 +399,23 @@ void iwpm_set_valid(u8 nl_client, int valid) | |||
| 397 | } | 399 | } |
| 398 | 400 | ||
| 399 | /* valid client */ | 401 | /* valid client */ |
| 400 | int iwpm_registered_client(u8 nl_client) | 402 | u32 iwpm_get_registration(u8 nl_client) |
| 401 | { | 403 | { |
| 402 | return iwpm_admin.reg_list[nl_client]; | 404 | return iwpm_admin.reg_list[nl_client]; |
| 403 | } | 405 | } |
| 404 | 406 | ||
| 405 | /* valid client */ | 407 | /* valid client */ |
| 406 | void iwpm_set_registered(u8 nl_client, int reg) | 408 | void iwpm_set_registration(u8 nl_client, u32 reg) |
| 407 | { | 409 | { |
| 408 | iwpm_admin.reg_list[nl_client] = reg; | 410 | iwpm_admin.reg_list[nl_client] = reg; |
| 409 | } | 411 | } |
| 410 | 412 | ||
| 413 | /* valid client */ | ||
| 414 | u32 iwpm_check_registration(u8 nl_client, u32 reg) | ||
| 415 | { | ||
| 416 | return (iwpm_get_registration(nl_client) & reg); | ||
| 417 | } | ||
| 418 | |||
| 411 | int iwpm_compare_sockaddr(struct sockaddr_storage *a_sockaddr, | 419 | int iwpm_compare_sockaddr(struct sockaddr_storage *a_sockaddr, |
| 412 | struct sockaddr_storage *b_sockaddr) | 420 | struct sockaddr_storage *b_sockaddr) |
| 413 | { | 421 | { |
diff --git a/drivers/infiniband/core/iwpm_util.h b/drivers/infiniband/core/iwpm_util.h index ee2d9ff095be..b7b9e194ce81 100644 --- a/drivers/infiniband/core/iwpm_util.h +++ b/drivers/infiniband/core/iwpm_util.h | |||
| @@ -58,6 +58,10 @@ | |||
| 58 | #define IWPM_PID_UNDEFINED -1 | 58 | #define IWPM_PID_UNDEFINED -1 |
| 59 | #define IWPM_PID_UNAVAILABLE -2 | 59 | #define IWPM_PID_UNAVAILABLE -2 |
| 60 | 60 | ||
| 61 | #define IWPM_REG_UNDEF 0x01 | ||
| 62 | #define IWPM_REG_VALID 0x02 | ||
| 63 | #define IWPM_REG_INCOMPL 0x04 | ||
| 64 | |||
| 61 | struct iwpm_nlmsg_request { | 65 | struct iwpm_nlmsg_request { |
| 62 | struct list_head inprocess_list; | 66 | struct list_head inprocess_list; |
| 63 | __u32 nlmsg_seq; | 67 | __u32 nlmsg_seq; |
| @@ -88,7 +92,7 @@ struct iwpm_admin_data { | |||
| 88 | atomic_t refcount; | 92 | atomic_t refcount; |
| 89 | atomic_t nlmsg_seq; | 93 | atomic_t nlmsg_seq; |
| 90 | int client_list[RDMA_NL_NUM_CLIENTS]; | 94 | int client_list[RDMA_NL_NUM_CLIENTS]; |
| 91 | int reg_list[RDMA_NL_NUM_CLIENTS]; | 95 | u32 reg_list[RDMA_NL_NUM_CLIENTS]; |
| 92 | }; | 96 | }; |
| 93 | 97 | ||
| 94 | /** | 98 | /** |
| @@ -159,19 +163,31 @@ int iwpm_valid_client(u8 nl_client); | |||
| 159 | void iwpm_set_valid(u8 nl_client, int valid); | 163 | void iwpm_set_valid(u8 nl_client, int valid); |
| 160 | 164 | ||
| 161 | /** | 165 | /** |
| 162 | * iwpm_registered_client - Check if the port mapper client is registered | 166 | * iwpm_check_registration - Check if the client registration |
| 167 | * matches the given one | ||
| 163 | * @nl_client: The index of the netlink client | 168 | * @nl_client: The index of the netlink client |
| 169 | * @reg: The given registration type to compare with | ||
| 164 | * | 170 | * |
| 165 | * Call iwpm_register_pid() to register a client | 171 | * Call iwpm_register_pid() to register a client |
| 172 | * Returns true if the client registration matches reg, | ||
| 173 | * otherwise returns false | ||
| 174 | */ | ||
| 175 | u32 iwpm_check_registration(u8 nl_client, u32 reg); | ||
| 176 | |||
| 177 | /** | ||
| 178 | * iwpm_set_registration - Set the client registration | ||
| 179 | * @nl_client: The index of the netlink client | ||
| 180 | * @reg: Registration type to set | ||
| 166 | */ | 181 | */ |
| 167 | int iwpm_registered_client(u8 nl_client); | 182 | void iwpm_set_registration(u8 nl_client, u32 reg); |
| 168 | 183 | ||
| 169 | /** | 184 | /** |
| 170 | * iwpm_set_registered - Set the port mapper client to registered or not | 185 | * iwpm_get_registration |
| 171 | * @nl_client: The index of the netlink client | 186 | * @nl_client: The index of the netlink client |
| 172 | * @reg: 1 if registered or 0 if not | 187 | * |
| 188 | * Returns the client registration type | ||
| 173 | */ | 189 | */ |
| 174 | void iwpm_set_registered(u8 nl_client, int reg); | 190 | u32 iwpm_get_registration(u8 nl_client); |
| 175 | 191 | ||
| 176 | /** | 192 | /** |
| 177 | * iwpm_send_mapinfo - Send local and mapped IPv4/IPv6 address info of | 193 | * iwpm_send_mapinfo - Send local and mapped IPv4/IPv6 address info of |
diff --git a/drivers/infiniband/core/mad.c b/drivers/infiniband/core/mad.c index a4b1466c1bf6..786fc51bf04b 100644 --- a/drivers/infiniband/core/mad.c +++ b/drivers/infiniband/core/mad.c | |||
| @@ -769,7 +769,7 @@ static int handle_outgoing_dr_smp(struct ib_mad_agent_private *mad_agent_priv, | |||
| 769 | bool opa = rdma_cap_opa_mad(mad_agent_priv->qp_info->port_priv->device, | 769 | bool opa = rdma_cap_opa_mad(mad_agent_priv->qp_info->port_priv->device, |
| 770 | mad_agent_priv->qp_info->port_priv->port_num); | 770 | mad_agent_priv->qp_info->port_priv->port_num); |
| 771 | 771 | ||
| 772 | if (device->node_type == RDMA_NODE_IB_SWITCH && | 772 | if (rdma_cap_ib_switch(device) && |
| 773 | smp->mgmt_class == IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE) | 773 | smp->mgmt_class == IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE) |
| 774 | port_num = send_wr->wr.ud.port_num; | 774 | port_num = send_wr->wr.ud.port_num; |
| 775 | else | 775 | else |
| @@ -787,14 +787,15 @@ static int handle_outgoing_dr_smp(struct ib_mad_agent_private *mad_agent_priv, | |||
| 787 | if ((opa_get_smp_direction(opa_smp) | 787 | if ((opa_get_smp_direction(opa_smp) |
| 788 | ? opa_smp->route.dr.dr_dlid : opa_smp->route.dr.dr_slid) == | 788 | ? opa_smp->route.dr.dr_dlid : opa_smp->route.dr.dr_slid) == |
| 789 | OPA_LID_PERMISSIVE && | 789 | OPA_LID_PERMISSIVE && |
| 790 | opa_smi_handle_dr_smp_send(opa_smp, device->node_type, | 790 | opa_smi_handle_dr_smp_send(opa_smp, |
| 791 | rdma_cap_ib_switch(device), | ||
| 791 | port_num) == IB_SMI_DISCARD) { | 792 | port_num) == IB_SMI_DISCARD) { |
| 792 | ret = -EINVAL; | 793 | ret = -EINVAL; |
| 793 | dev_err(&device->dev, "OPA Invalid directed route\n"); | 794 | dev_err(&device->dev, "OPA Invalid directed route\n"); |
| 794 | goto out; | 795 | goto out; |
| 795 | } | 796 | } |
| 796 | opa_drslid = be32_to_cpu(opa_smp->route.dr.dr_slid); | 797 | opa_drslid = be32_to_cpu(opa_smp->route.dr.dr_slid); |
| 797 | if (opa_drslid != OPA_LID_PERMISSIVE && | 798 | if (opa_drslid != be32_to_cpu(OPA_LID_PERMISSIVE) && |
| 798 | opa_drslid & 0xffff0000) { | 799 | opa_drslid & 0xffff0000) { |
| 799 | ret = -EINVAL; | 800 | ret = -EINVAL; |
| 800 | dev_err(&device->dev, "OPA Invalid dr_slid 0x%x\n", | 801 | dev_err(&device->dev, "OPA Invalid dr_slid 0x%x\n", |
| @@ -810,7 +811,7 @@ static int handle_outgoing_dr_smp(struct ib_mad_agent_private *mad_agent_priv, | |||
| 810 | } else { | 811 | } else { |
| 811 | if ((ib_get_smp_direction(smp) ? smp->dr_dlid : smp->dr_slid) == | 812 | if ((ib_get_smp_direction(smp) ? smp->dr_dlid : smp->dr_slid) == |
| 812 | IB_LID_PERMISSIVE && | 813 | IB_LID_PERMISSIVE && |
| 813 | smi_handle_dr_smp_send(smp, device->node_type, port_num) == | 814 | smi_handle_dr_smp_send(smp, rdma_cap_ib_switch(device), port_num) == |
| 814 | IB_SMI_DISCARD) { | 815 | IB_SMI_DISCARD) { |
| 815 | ret = -EINVAL; | 816 | ret = -EINVAL; |
| 816 | dev_err(&device->dev, "Invalid directed route\n"); | 817 | dev_err(&device->dev, "Invalid directed route\n"); |
| @@ -2030,7 +2031,7 @@ static enum smi_action handle_ib_smi(const struct ib_mad_port_private *port_priv | |||
| 2030 | struct ib_smp *smp = (struct ib_smp *)recv->mad; | 2031 | struct ib_smp *smp = (struct ib_smp *)recv->mad; |
| 2031 | 2032 | ||
| 2032 | if (smi_handle_dr_smp_recv(smp, | 2033 | if (smi_handle_dr_smp_recv(smp, |
| 2033 | port_priv->device->node_type, | 2034 | rdma_cap_ib_switch(port_priv->device), |
| 2034 | port_num, | 2035 | port_num, |
| 2035 | port_priv->device->phys_port_cnt) == | 2036 | port_priv->device->phys_port_cnt) == |
| 2036 | IB_SMI_DISCARD) | 2037 | IB_SMI_DISCARD) |
| @@ -2042,13 +2043,13 @@ static enum smi_action handle_ib_smi(const struct ib_mad_port_private *port_priv | |||
| 2042 | 2043 | ||
| 2043 | if (retsmi == IB_SMI_SEND) { /* don't forward */ | 2044 | if (retsmi == IB_SMI_SEND) { /* don't forward */ |
| 2044 | if (smi_handle_dr_smp_send(smp, | 2045 | if (smi_handle_dr_smp_send(smp, |
| 2045 | port_priv->device->node_type, | 2046 | rdma_cap_ib_switch(port_priv->device), |
| 2046 | port_num) == IB_SMI_DISCARD) | 2047 | port_num) == IB_SMI_DISCARD) |
| 2047 | return IB_SMI_DISCARD; | 2048 | return IB_SMI_DISCARD; |
| 2048 | 2049 | ||
| 2049 | if (smi_check_local_smp(smp, port_priv->device) == IB_SMI_DISCARD) | 2050 | if (smi_check_local_smp(smp, port_priv->device) == IB_SMI_DISCARD) |
| 2050 | return IB_SMI_DISCARD; | 2051 | return IB_SMI_DISCARD; |
| 2051 | } else if (port_priv->device->node_type == RDMA_NODE_IB_SWITCH) { | 2052 | } else if (rdma_cap_ib_switch(port_priv->device)) { |
| 2052 | /* forward case for switches */ | 2053 | /* forward case for switches */ |
| 2053 | memcpy(response, recv, mad_priv_size(response)); | 2054 | memcpy(response, recv, mad_priv_size(response)); |
| 2054 | response->header.recv_wc.wc = &response->header.wc; | 2055 | response->header.recv_wc.wc = &response->header.wc; |
| @@ -2115,7 +2116,7 @@ handle_opa_smi(struct ib_mad_port_private *port_priv, | |||
| 2115 | struct opa_smp *smp = (struct opa_smp *)recv->mad; | 2116 | struct opa_smp *smp = (struct opa_smp *)recv->mad; |
| 2116 | 2117 | ||
| 2117 | if (opa_smi_handle_dr_smp_recv(smp, | 2118 | if (opa_smi_handle_dr_smp_recv(smp, |
| 2118 | port_priv->device->node_type, | 2119 | rdma_cap_ib_switch(port_priv->device), |
| 2119 | port_num, | 2120 | port_num, |
| 2120 | port_priv->device->phys_port_cnt) == | 2121 | port_priv->device->phys_port_cnt) == |
| 2121 | IB_SMI_DISCARD) | 2122 | IB_SMI_DISCARD) |
| @@ -2127,7 +2128,7 @@ handle_opa_smi(struct ib_mad_port_private *port_priv, | |||
| 2127 | 2128 | ||
| 2128 | if (retsmi == IB_SMI_SEND) { /* don't forward */ | 2129 | if (retsmi == IB_SMI_SEND) { /* don't forward */ |
| 2129 | if (opa_smi_handle_dr_smp_send(smp, | 2130 | if (opa_smi_handle_dr_smp_send(smp, |
| 2130 | port_priv->device->node_type, | 2131 | rdma_cap_ib_switch(port_priv->device), |
| 2131 | port_num) == IB_SMI_DISCARD) | 2132 | port_num) == IB_SMI_DISCARD) |
| 2132 | return IB_SMI_DISCARD; | 2133 | return IB_SMI_DISCARD; |
| 2133 | 2134 | ||
| @@ -2135,7 +2136,7 @@ handle_opa_smi(struct ib_mad_port_private *port_priv, | |||
| 2135 | IB_SMI_DISCARD) | 2136 | IB_SMI_DISCARD) |
| 2136 | return IB_SMI_DISCARD; | 2137 | return IB_SMI_DISCARD; |
| 2137 | 2138 | ||
| 2138 | } else if (port_priv->device->node_type == RDMA_NODE_IB_SWITCH) { | 2139 | } else if (rdma_cap_ib_switch(port_priv->device)) { |
| 2139 | /* forward case for switches */ | 2140 | /* forward case for switches */ |
| 2140 | memcpy(response, recv, mad_priv_size(response)); | 2141 | memcpy(response, recv, mad_priv_size(response)); |
| 2141 | response->header.recv_wc.wc = &response->header.wc; | 2142 | response->header.recv_wc.wc = &response->header.wc; |
| @@ -2235,7 +2236,7 @@ static void ib_mad_recv_done_handler(struct ib_mad_port_private *port_priv, | |||
| 2235 | goto out; | 2236 | goto out; |
| 2236 | } | 2237 | } |
| 2237 | 2238 | ||
| 2238 | if (port_priv->device->node_type == RDMA_NODE_IB_SWITCH) | 2239 | if (rdma_cap_ib_switch(port_priv->device)) |
| 2239 | port_num = wc->port_num; | 2240 | port_num = wc->port_num; |
| 2240 | else | 2241 | else |
| 2241 | port_num = port_priv->port_num; | 2242 | port_num = port_priv->port_num; |
| @@ -3297,17 +3298,11 @@ static int ib_mad_port_close(struct ib_device *device, int port_num) | |||
| 3297 | 3298 | ||
| 3298 | static void ib_mad_init_device(struct ib_device *device) | 3299 | static void ib_mad_init_device(struct ib_device *device) |
| 3299 | { | 3300 | { |
| 3300 | int start, end, i; | 3301 | int start, i; |
| 3301 | 3302 | ||
| 3302 | if (device->node_type == RDMA_NODE_IB_SWITCH) { | 3303 | start = rdma_start_port(device); |
| 3303 | start = 0; | ||
| 3304 | end = 0; | ||
| 3305 | } else { | ||
| 3306 | start = 1; | ||
| 3307 | end = device->phys_port_cnt; | ||
| 3308 | } | ||
| 3309 | 3304 | ||
| 3310 | for (i = start; i <= end; i++) { | 3305 | for (i = start; i <= rdma_end_port(device); i++) { |
| 3311 | if (!rdma_cap_ib_mad(device, i)) | 3306 | if (!rdma_cap_ib_mad(device, i)) |
| 3312 | continue; | 3307 | continue; |
| 3313 | 3308 | ||
| @@ -3342,17 +3337,9 @@ error: | |||
| 3342 | 3337 | ||
| 3343 | static void ib_mad_remove_device(struct ib_device *device) | 3338 | static void ib_mad_remove_device(struct ib_device *device) |
| 3344 | { | 3339 | { |
| 3345 | int start, end, i; | 3340 | int i; |
| 3346 | |||
| 3347 | if (device->node_type == RDMA_NODE_IB_SWITCH) { | ||
| 3348 | start = 0; | ||
| 3349 | end = 0; | ||
| 3350 | } else { | ||
| 3351 | start = 1; | ||
| 3352 | end = device->phys_port_cnt; | ||
| 3353 | } | ||
| 3354 | 3341 | ||
| 3355 | for (i = start; i <= end; i++) { | 3342 | for (i = rdma_start_port(device); i <= rdma_end_port(device); i++) { |
| 3356 | if (!rdma_cap_ib_mad(device, i)) | 3343 | if (!rdma_cap_ib_mad(device, i)) |
| 3357 | continue; | 3344 | continue; |
| 3358 | 3345 | ||
diff --git a/drivers/infiniband/core/multicast.c b/drivers/infiniband/core/multicast.c index 1244f02a5c6d..2cb865c7ce7a 100644 --- a/drivers/infiniband/core/multicast.c +++ b/drivers/infiniband/core/multicast.c | |||
| @@ -812,12 +812,8 @@ static void mcast_add_one(struct ib_device *device) | |||
| 812 | if (!dev) | 812 | if (!dev) |
| 813 | return; | 813 | return; |
| 814 | 814 | ||
| 815 | if (device->node_type == RDMA_NODE_IB_SWITCH) | 815 | dev->start_port = rdma_start_port(device); |
| 816 | dev->start_port = dev->end_port = 0; | 816 | dev->end_port = rdma_end_port(device); |
| 817 | else { | ||
| 818 | dev->start_port = 1; | ||
| 819 | dev->end_port = device->phys_port_cnt; | ||
| 820 | } | ||
| 821 | 817 | ||
| 822 | for (i = 0; i <= dev->end_port - dev->start_port; i++) { | 818 | for (i = 0; i <= dev->end_port - dev->start_port; i++) { |
| 823 | if (!rdma_cap_ib_mcast(device, dev->start_port + i)) | 819 | if (!rdma_cap_ib_mcast(device, dev->start_port + i)) |
diff --git a/drivers/infiniband/core/opa_smi.h b/drivers/infiniband/core/opa_smi.h index 62d91bfa4cb7..3bfab3505a29 100644 --- a/drivers/infiniband/core/opa_smi.h +++ b/drivers/infiniband/core/opa_smi.h | |||
| @@ -39,12 +39,12 @@ | |||
| 39 | 39 | ||
| 40 | #include "smi.h" | 40 | #include "smi.h" |
| 41 | 41 | ||
| 42 | enum smi_action opa_smi_handle_dr_smp_recv(struct opa_smp *smp, u8 node_type, | 42 | enum smi_action opa_smi_handle_dr_smp_recv(struct opa_smp *smp, bool is_switch, |
| 43 | int port_num, int phys_port_cnt); | 43 | int port_num, int phys_port_cnt); |
| 44 | int opa_smi_get_fwd_port(struct opa_smp *smp); | 44 | int opa_smi_get_fwd_port(struct opa_smp *smp); |
| 45 | extern enum smi_forward_action opa_smi_check_forward_dr_smp(struct opa_smp *smp); | 45 | extern enum smi_forward_action opa_smi_check_forward_dr_smp(struct opa_smp *smp); |
| 46 | extern enum smi_action opa_smi_handle_dr_smp_send(struct opa_smp *smp, | 46 | extern enum smi_action opa_smi_handle_dr_smp_send(struct opa_smp *smp, |
| 47 | u8 node_type, int port_num); | 47 | bool is_switch, int port_num); |
| 48 | 48 | ||
| 49 | /* | 49 | /* |
| 50 | * Return IB_SMI_HANDLE if the SMP should be handled by the local SMA/SM | 50 | * Return IB_SMI_HANDLE if the SMP should be handled by the local SMA/SM |
diff --git a/drivers/infiniband/core/sa_query.c b/drivers/infiniband/core/sa_query.c index 0fae85062a65..ca919f429666 100644 --- a/drivers/infiniband/core/sa_query.c +++ b/drivers/infiniband/core/sa_query.c | |||
| @@ -1156,12 +1156,8 @@ static void ib_sa_add_one(struct ib_device *device) | |||
| 1156 | int s, e, i; | 1156 | int s, e, i; |
| 1157 | int count = 0; | 1157 | int count = 0; |
| 1158 | 1158 | ||
| 1159 | if (device->node_type == RDMA_NODE_IB_SWITCH) | 1159 | s = rdma_start_port(device); |
| 1160 | s = e = 0; | 1160 | e = rdma_end_port(device); |
| 1161 | else { | ||
| 1162 | s = 1; | ||
| 1163 | e = device->phys_port_cnt; | ||
| 1164 | } | ||
| 1165 | 1161 | ||
| 1166 | sa_dev = kzalloc(sizeof *sa_dev + | 1162 | sa_dev = kzalloc(sizeof *sa_dev + |
| 1167 | (e - s + 1) * sizeof (struct ib_sa_port), | 1163 | (e - s + 1) * sizeof (struct ib_sa_port), |
diff --git a/drivers/infiniband/core/smi.c b/drivers/infiniband/core/smi.c index 368a561d1a5d..f19b23817c2b 100644 --- a/drivers/infiniband/core/smi.c +++ b/drivers/infiniband/core/smi.c | |||
| @@ -41,7 +41,7 @@ | |||
| 41 | #include "smi.h" | 41 | #include "smi.h" |
| 42 | #include "opa_smi.h" | 42 | #include "opa_smi.h" |
| 43 | 43 | ||
| 44 | static enum smi_action __smi_handle_dr_smp_send(u8 node_type, int port_num, | 44 | static enum smi_action __smi_handle_dr_smp_send(bool is_switch, int port_num, |
| 45 | u8 *hop_ptr, u8 hop_cnt, | 45 | u8 *hop_ptr, u8 hop_cnt, |
| 46 | const u8 *initial_path, | 46 | const u8 *initial_path, |
| 47 | const u8 *return_path, | 47 | const u8 *return_path, |
| @@ -64,7 +64,7 @@ static enum smi_action __smi_handle_dr_smp_send(u8 node_type, int port_num, | |||
| 64 | 64 | ||
| 65 | /* C14-9:2 */ | 65 | /* C14-9:2 */ |
| 66 | if (*hop_ptr && *hop_ptr < hop_cnt) { | 66 | if (*hop_ptr && *hop_ptr < hop_cnt) { |
| 67 | if (node_type != RDMA_NODE_IB_SWITCH) | 67 | if (!is_switch) |
| 68 | return IB_SMI_DISCARD; | 68 | return IB_SMI_DISCARD; |
| 69 | 69 | ||
| 70 | /* return_path set when received */ | 70 | /* return_path set when received */ |
| @@ -77,7 +77,7 @@ static enum smi_action __smi_handle_dr_smp_send(u8 node_type, int port_num, | |||
| 77 | if (*hop_ptr == hop_cnt) { | 77 | if (*hop_ptr == hop_cnt) { |
| 78 | /* return_path set when received */ | 78 | /* return_path set when received */ |
| 79 | (*hop_ptr)++; | 79 | (*hop_ptr)++; |
| 80 | return (node_type == RDMA_NODE_IB_SWITCH || | 80 | return (is_switch || |
| 81 | dr_dlid_is_permissive ? | 81 | dr_dlid_is_permissive ? |
| 82 | IB_SMI_HANDLE : IB_SMI_DISCARD); | 82 | IB_SMI_HANDLE : IB_SMI_DISCARD); |
| 83 | } | 83 | } |
| @@ -96,7 +96,7 @@ static enum smi_action __smi_handle_dr_smp_send(u8 node_type, int port_num, | |||
| 96 | 96 | ||
| 97 | /* C14-13:2 */ | 97 | /* C14-13:2 */ |
| 98 | if (2 <= *hop_ptr && *hop_ptr <= hop_cnt) { | 98 | if (2 <= *hop_ptr && *hop_ptr <= hop_cnt) { |
| 99 | if (node_type != RDMA_NODE_IB_SWITCH) | 99 | if (!is_switch) |
| 100 | return IB_SMI_DISCARD; | 100 | return IB_SMI_DISCARD; |
| 101 | 101 | ||
| 102 | (*hop_ptr)--; | 102 | (*hop_ptr)--; |
| @@ -108,7 +108,7 @@ static enum smi_action __smi_handle_dr_smp_send(u8 node_type, int port_num, | |||
| 108 | if (*hop_ptr == 1) { | 108 | if (*hop_ptr == 1) { |
| 109 | (*hop_ptr)--; | 109 | (*hop_ptr)--; |
| 110 | /* C14-13:3 -- SMPs destined for SM shouldn't be here */ | 110 | /* C14-13:3 -- SMPs destined for SM shouldn't be here */ |
| 111 | return (node_type == RDMA_NODE_IB_SWITCH || | 111 | return (is_switch || |
| 112 | dr_slid_is_permissive ? | 112 | dr_slid_is_permissive ? |
| 113 | IB_SMI_HANDLE : IB_SMI_DISCARD); | 113 | IB_SMI_HANDLE : IB_SMI_DISCARD); |
| 114 | } | 114 | } |
| @@ -127,9 +127,9 @@ static enum smi_action __smi_handle_dr_smp_send(u8 node_type, int port_num, | |||
| 127 | * Return IB_SMI_DISCARD if the SMP should be discarded | 127 | * Return IB_SMI_DISCARD if the SMP should be discarded |
| 128 | */ | 128 | */ |
| 129 | enum smi_action smi_handle_dr_smp_send(struct ib_smp *smp, | 129 | enum smi_action smi_handle_dr_smp_send(struct ib_smp *smp, |
| 130 | u8 node_type, int port_num) | 130 | bool is_switch, int port_num) |
| 131 | { | 131 | { |
| 132 | return __smi_handle_dr_smp_send(node_type, port_num, | 132 | return __smi_handle_dr_smp_send(is_switch, port_num, |
| 133 | &smp->hop_ptr, smp->hop_cnt, | 133 | &smp->hop_ptr, smp->hop_cnt, |
| 134 | smp->initial_path, | 134 | smp->initial_path, |
| 135 | smp->return_path, | 135 | smp->return_path, |
| @@ -139,9 +139,9 @@ enum smi_action smi_handle_dr_smp_send(struct ib_smp *smp, | |||
| 139 | } | 139 | } |
| 140 | 140 | ||
| 141 | enum smi_action opa_smi_handle_dr_smp_send(struct opa_smp *smp, | 141 | enum smi_action opa_smi_handle_dr_smp_send(struct opa_smp *smp, |
| 142 | u8 node_type, int port_num) | 142 | bool is_switch, int port_num) |
| 143 | { | 143 | { |
| 144 | return __smi_handle_dr_smp_send(node_type, port_num, | 144 | return __smi_handle_dr_smp_send(is_switch, port_num, |
| 145 | &smp->hop_ptr, smp->hop_cnt, | 145 | &smp->hop_ptr, smp->hop_cnt, |
| 146 | smp->route.dr.initial_path, | 146 | smp->route.dr.initial_path, |
| 147 | smp->route.dr.return_path, | 147 | smp->route.dr.return_path, |
| @@ -152,7 +152,7 @@ enum smi_action opa_smi_handle_dr_smp_send(struct opa_smp *smp, | |||
| 152 | OPA_LID_PERMISSIVE); | 152 | OPA_LID_PERMISSIVE); |
| 153 | } | 153 | } |
| 154 | 154 | ||
| 155 | static enum smi_action __smi_handle_dr_smp_recv(u8 node_type, int port_num, | 155 | static enum smi_action __smi_handle_dr_smp_recv(bool is_switch, int port_num, |
| 156 | int phys_port_cnt, | 156 | int phys_port_cnt, |
| 157 | u8 *hop_ptr, u8 hop_cnt, | 157 | u8 *hop_ptr, u8 hop_cnt, |
| 158 | const u8 *initial_path, | 158 | const u8 *initial_path, |
| @@ -173,7 +173,7 @@ static enum smi_action __smi_handle_dr_smp_recv(u8 node_type, int port_num, | |||
| 173 | 173 | ||
| 174 | /* C14-9:2 -- intermediate hop */ | 174 | /* C14-9:2 -- intermediate hop */ |
| 175 | if (*hop_ptr && *hop_ptr < hop_cnt) { | 175 | if (*hop_ptr && *hop_ptr < hop_cnt) { |
| 176 | if (node_type != RDMA_NODE_IB_SWITCH) | 176 | if (!is_switch) |
| 177 | return IB_SMI_DISCARD; | 177 | return IB_SMI_DISCARD; |
| 178 | 178 | ||
| 179 | return_path[*hop_ptr] = port_num; | 179 | return_path[*hop_ptr] = port_num; |
| @@ -188,7 +188,7 @@ static enum smi_action __smi_handle_dr_smp_recv(u8 node_type, int port_num, | |||
| 188 | return_path[*hop_ptr] = port_num; | 188 | return_path[*hop_ptr] = port_num; |
| 189 | /* hop_ptr updated when sending */ | 189 | /* hop_ptr updated when sending */ |
| 190 | 190 | ||
| 191 | return (node_type == RDMA_NODE_IB_SWITCH || | 191 | return (is_switch || |
| 192 | dr_dlid_is_permissive ? | 192 | dr_dlid_is_permissive ? |
| 193 | IB_SMI_HANDLE : IB_SMI_DISCARD); | 193 | IB_SMI_HANDLE : IB_SMI_DISCARD); |
| 194 | } | 194 | } |
| @@ -208,7 +208,7 @@ static enum smi_action __smi_handle_dr_smp_recv(u8 node_type, int port_num, | |||
| 208 | 208 | ||
| 209 | /* C14-13:2 */ | 209 | /* C14-13:2 */ |
| 210 | if (2 <= *hop_ptr && *hop_ptr <= hop_cnt) { | 210 | if (2 <= *hop_ptr && *hop_ptr <= hop_cnt) { |
| 211 | if (node_type != RDMA_NODE_IB_SWITCH) | 211 | if (!is_switch) |
| 212 | return IB_SMI_DISCARD; | 212 | return IB_SMI_DISCARD; |
| 213 | 213 | ||
| 214 | /* hop_ptr updated when sending */ | 214 | /* hop_ptr updated when sending */ |
| @@ -224,8 +224,7 @@ static enum smi_action __smi_handle_dr_smp_recv(u8 node_type, int port_num, | |||
| 224 | return IB_SMI_HANDLE; | 224 | return IB_SMI_HANDLE; |
| 225 | } | 225 | } |
| 226 | /* hop_ptr updated when sending */ | 226 | /* hop_ptr updated when sending */ |
| 227 | return (node_type == RDMA_NODE_IB_SWITCH ? | 227 | return (is_switch ? IB_SMI_HANDLE : IB_SMI_DISCARD); |
| 228 | IB_SMI_HANDLE : IB_SMI_DISCARD); | ||
| 229 | } | 228 | } |
| 230 | 229 | ||
| 231 | /* C14-13:4 -- hop_ptr = 0 -> give to SM */ | 230 | /* C14-13:4 -- hop_ptr = 0 -> give to SM */ |
| @@ -238,10 +237,10 @@ static enum smi_action __smi_handle_dr_smp_recv(u8 node_type, int port_num, | |||
| 238 | * Adjust information for a received SMP | 237 | * Adjust information for a received SMP |
| 239 | * Return IB_SMI_DISCARD if the SMP should be dropped | 238 | * Return IB_SMI_DISCARD if the SMP should be dropped |
| 240 | */ | 239 | */ |
| 241 | enum smi_action smi_handle_dr_smp_recv(struct ib_smp *smp, u8 node_type, | 240 | enum smi_action smi_handle_dr_smp_recv(struct ib_smp *smp, bool is_switch, |
| 242 | int port_num, int phys_port_cnt) | 241 | int port_num, int phys_port_cnt) |
| 243 | { | 242 | { |
| 244 | return __smi_handle_dr_smp_recv(node_type, port_num, phys_port_cnt, | 243 | return __smi_handle_dr_smp_recv(is_switch, port_num, phys_port_cnt, |
| 245 | &smp->hop_ptr, smp->hop_cnt, | 244 | &smp->hop_ptr, smp->hop_cnt, |
| 246 | smp->initial_path, | 245 | smp->initial_path, |
| 247 | smp->return_path, | 246 | smp->return_path, |
| @@ -254,10 +253,10 @@ enum smi_action smi_handle_dr_smp_recv(struct ib_smp *smp, u8 node_type, | |||
| 254 | * Adjust information for a received SMP | 253 | * Adjust information for a received SMP |
| 255 | * Return IB_SMI_DISCARD if the SMP should be dropped | 254 | * Return IB_SMI_DISCARD if the SMP should be dropped |
| 256 | */ | 255 | */ |
| 257 | enum smi_action opa_smi_handle_dr_smp_recv(struct opa_smp *smp, u8 node_type, | 256 | enum smi_action opa_smi_handle_dr_smp_recv(struct opa_smp *smp, bool is_switch, |
| 258 | int port_num, int phys_port_cnt) | 257 | int port_num, int phys_port_cnt) |
| 259 | { | 258 | { |
| 260 | return __smi_handle_dr_smp_recv(node_type, port_num, phys_port_cnt, | 259 | return __smi_handle_dr_smp_recv(is_switch, port_num, phys_port_cnt, |
| 261 | &smp->hop_ptr, smp->hop_cnt, | 260 | &smp->hop_ptr, smp->hop_cnt, |
| 262 | smp->route.dr.initial_path, | 261 | smp->route.dr.initial_path, |
| 263 | smp->route.dr.return_path, | 262 | smp->route.dr.return_path, |
diff --git a/drivers/infiniband/core/smi.h b/drivers/infiniband/core/smi.h index aff96bac49b4..33c91c8a16e9 100644 --- a/drivers/infiniband/core/smi.h +++ b/drivers/infiniband/core/smi.h | |||
| @@ -51,12 +51,12 @@ enum smi_forward_action { | |||
| 51 | IB_SMI_FORWARD /* SMP should be forwarded (for switches only) */ | 51 | IB_SMI_FORWARD /* SMP should be forwarded (for switches only) */ |
| 52 | }; | 52 | }; |
| 53 | 53 | ||
| 54 | enum smi_action smi_handle_dr_smp_recv(struct ib_smp *smp, u8 node_type, | 54 | enum smi_action smi_handle_dr_smp_recv(struct ib_smp *smp, bool is_switch, |
| 55 | int port_num, int phys_port_cnt); | 55 | int port_num, int phys_port_cnt); |
| 56 | int smi_get_fwd_port(struct ib_smp *smp); | 56 | int smi_get_fwd_port(struct ib_smp *smp); |
| 57 | extern enum smi_forward_action smi_check_forward_dr_smp(struct ib_smp *smp); | 57 | extern enum smi_forward_action smi_check_forward_dr_smp(struct ib_smp *smp); |
| 58 | extern enum smi_action smi_handle_dr_smp_send(struct ib_smp *smp, | 58 | extern enum smi_action smi_handle_dr_smp_send(struct ib_smp *smp, |
| 59 | u8 node_type, int port_num); | 59 | bool is_switch, int port_num); |
| 60 | 60 | ||
| 61 | /* | 61 | /* |
| 62 | * Return IB_SMI_HANDLE if the SMP should be handled by the local SMA/SM | 62 | * Return IB_SMI_HANDLE if the SMP should be handled by the local SMA/SM |
diff --git a/drivers/infiniband/core/sysfs.c b/drivers/infiniband/core/sysfs.c index ed6b6c85c334..0b84a9cdfe5b 100644 --- a/drivers/infiniband/core/sysfs.c +++ b/drivers/infiniband/core/sysfs.c | |||
| @@ -870,7 +870,7 @@ int ib_device_register_sysfs(struct ib_device *device, | |||
| 870 | goto err_put; | 870 | goto err_put; |
| 871 | } | 871 | } |
| 872 | 872 | ||
| 873 | if (device->node_type == RDMA_NODE_IB_SWITCH) { | 873 | if (rdma_cap_ib_switch(device)) { |
| 874 | ret = add_port(device, 0, port_callback); | 874 | ret = add_port(device, 0, port_callback); |
| 875 | if (ret) | 875 | if (ret) |
| 876 | goto err_put; | 876 | goto err_put; |
diff --git a/drivers/infiniband/core/ucm.c b/drivers/infiniband/core/ucm.c index 62c24b1452b8..009481073644 100644 --- a/drivers/infiniband/core/ucm.c +++ b/drivers/infiniband/core/ucm.c | |||
| @@ -1193,6 +1193,7 @@ static int ib_ucm_close(struct inode *inode, struct file *filp) | |||
| 1193 | return 0; | 1193 | return 0; |
| 1194 | } | 1194 | } |
| 1195 | 1195 | ||
| 1196 | static DECLARE_BITMAP(overflow_map, IB_UCM_MAX_DEVICES); | ||
| 1196 | static void ib_ucm_release_dev(struct device *dev) | 1197 | static void ib_ucm_release_dev(struct device *dev) |
| 1197 | { | 1198 | { |
| 1198 | struct ib_ucm_device *ucm_dev; | 1199 | struct ib_ucm_device *ucm_dev; |
| @@ -1202,7 +1203,7 @@ static void ib_ucm_release_dev(struct device *dev) | |||
| 1202 | if (ucm_dev->devnum < IB_UCM_MAX_DEVICES) | 1203 | if (ucm_dev->devnum < IB_UCM_MAX_DEVICES) |
| 1203 | clear_bit(ucm_dev->devnum, dev_map); | 1204 | clear_bit(ucm_dev->devnum, dev_map); |
| 1204 | else | 1205 | else |
| 1205 | clear_bit(ucm_dev->devnum - IB_UCM_MAX_DEVICES, dev_map); | 1206 | clear_bit(ucm_dev->devnum - IB_UCM_MAX_DEVICES, overflow_map); |
| 1206 | kfree(ucm_dev); | 1207 | kfree(ucm_dev); |
| 1207 | } | 1208 | } |
| 1208 | 1209 | ||
| @@ -1226,7 +1227,6 @@ static ssize_t show_ibdev(struct device *dev, struct device_attribute *attr, | |||
| 1226 | static DEVICE_ATTR(ibdev, S_IRUGO, show_ibdev, NULL); | 1227 | static DEVICE_ATTR(ibdev, S_IRUGO, show_ibdev, NULL); |
| 1227 | 1228 | ||
| 1228 | static dev_t overflow_maj; | 1229 | static dev_t overflow_maj; |
| 1229 | static DECLARE_BITMAP(overflow_map, IB_UCM_MAX_DEVICES); | ||
| 1230 | static int find_overflow_devnum(void) | 1230 | static int find_overflow_devnum(void) |
| 1231 | { | 1231 | { |
| 1232 | int ret; | 1232 | int ret; |
diff --git a/drivers/infiniband/core/ucma.c b/drivers/infiniband/core/ucma.c index ad45469f7582..29b21213ea75 100644 --- a/drivers/infiniband/core/ucma.c +++ b/drivers/infiniband/core/ucma.c | |||
| @@ -1354,10 +1354,10 @@ static void ucma_lock_files(struct ucma_file *file1, struct ucma_file *file2) | |||
| 1354 | /* Acquire mutex's based on pointer comparison to prevent deadlock. */ | 1354 | /* Acquire mutex's based on pointer comparison to prevent deadlock. */ |
| 1355 | if (file1 < file2) { | 1355 | if (file1 < file2) { |
| 1356 | mutex_lock(&file1->mut); | 1356 | mutex_lock(&file1->mut); |
| 1357 | mutex_lock(&file2->mut); | 1357 | mutex_lock_nested(&file2->mut, SINGLE_DEPTH_NESTING); |
| 1358 | } else { | 1358 | } else { |
| 1359 | mutex_lock(&file2->mut); | 1359 | mutex_lock(&file2->mut); |
| 1360 | mutex_lock(&file1->mut); | 1360 | mutex_lock_nested(&file1->mut, SINGLE_DEPTH_NESTING); |
| 1361 | } | 1361 | } |
| 1362 | } | 1362 | } |
| 1363 | 1363 | ||
| @@ -1616,6 +1616,7 @@ static void __exit ucma_cleanup(void) | |||
| 1616 | device_remove_file(ucma_misc.this_device, &dev_attr_abi_version); | 1616 | device_remove_file(ucma_misc.this_device, &dev_attr_abi_version); |
| 1617 | misc_deregister(&ucma_misc); | 1617 | misc_deregister(&ucma_misc); |
| 1618 | idr_destroy(&ctx_idr); | 1618 | idr_destroy(&ctx_idr); |
| 1619 | idr_destroy(&multicast_idr); | ||
| 1619 | } | 1620 | } |
| 1620 | 1621 | ||
| 1621 | module_init(ucma_init); | 1622 | module_init(ucma_init); |
diff --git a/drivers/infiniband/hw/ehca/ehca_sqp.c b/drivers/infiniband/hw/ehca/ehca_sqp.c index 12b5bc23832b..376b031c2c7f 100644 --- a/drivers/infiniband/hw/ehca/ehca_sqp.c +++ b/drivers/infiniband/hw/ehca/ehca_sqp.c | |||
| @@ -226,8 +226,9 @@ int ehca_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num, | |||
| 226 | const struct ib_mad *in_mad = (const struct ib_mad *)in; | 226 | const struct ib_mad *in_mad = (const struct ib_mad *)in; |
| 227 | struct ib_mad *out_mad = (struct ib_mad *)out; | 227 | struct ib_mad *out_mad = (struct ib_mad *)out; |
| 228 | 228 | ||
| 229 | BUG_ON(in_mad_size != sizeof(*in_mad) || | 229 | if (WARN_ON_ONCE(in_mad_size != sizeof(*in_mad) || |
| 230 | *out_mad_size != sizeof(*out_mad)); | 230 | *out_mad_size != sizeof(*out_mad))) |
| 231 | return IB_MAD_RESULT_FAILURE; | ||
| 231 | 232 | ||
| 232 | if (!port_num || port_num > ibdev->phys_port_cnt || !in_wc) | 233 | if (!port_num || port_num > ibdev->phys_port_cnt || !in_wc) |
| 233 | return IB_MAD_RESULT_FAILURE; | 234 | return IB_MAD_RESULT_FAILURE; |
diff --git a/drivers/infiniband/hw/ipath/ipath_mad.c b/drivers/infiniband/hw/ipath/ipath_mad.c index 948188e37f95..ad3a926ab3c5 100644 --- a/drivers/infiniband/hw/ipath/ipath_mad.c +++ b/drivers/infiniband/hw/ipath/ipath_mad.c | |||
| @@ -1499,8 +1499,9 @@ int ipath_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num, | |||
| 1499 | const struct ib_mad *in_mad = (const struct ib_mad *)in; | 1499 | const struct ib_mad *in_mad = (const struct ib_mad *)in; |
| 1500 | struct ib_mad *out_mad = (struct ib_mad *)out; | 1500 | struct ib_mad *out_mad = (struct ib_mad *)out; |
| 1501 | 1501 | ||
| 1502 | BUG_ON(in_mad_size != sizeof(*in_mad) || | 1502 | if (WARN_ON_ONCE(in_mad_size != sizeof(*in_mad) || |
| 1503 | *out_mad_size != sizeof(*out_mad)); | 1503 | *out_mad_size != sizeof(*out_mad))) |
| 1504 | return IB_MAD_RESULT_FAILURE; | ||
| 1504 | 1505 | ||
| 1505 | switch (in_mad->mad_hdr.mgmt_class) { | 1506 | switch (in_mad->mad_hdr.mgmt_class) { |
| 1506 | case IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE: | 1507 | case IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE: |
diff --git a/drivers/infiniband/hw/ipath/ipath_verbs.c b/drivers/infiniband/hw/ipath/ipath_verbs.c index 48253b839a6f..30ba49c4a98c 100644 --- a/drivers/infiniband/hw/ipath/ipath_verbs.c +++ b/drivers/infiniband/hw/ipath/ipath_verbs.c | |||
| @@ -2044,9 +2044,9 @@ int ipath_register_ib_device(struct ipath_devdata *dd) | |||
| 2044 | 2044 | ||
| 2045 | spin_lock_init(&idev->qp_table.lock); | 2045 | spin_lock_init(&idev->qp_table.lock); |
| 2046 | spin_lock_init(&idev->lk_table.lock); | 2046 | spin_lock_init(&idev->lk_table.lock); |
| 2047 | idev->sm_lid = __constant_be16_to_cpu(IB_LID_PERMISSIVE); | 2047 | idev->sm_lid = be16_to_cpu(IB_LID_PERMISSIVE); |
| 2048 | /* Set the prefix to the default value (see ch. 4.1.1) */ | 2048 | /* Set the prefix to the default value (see ch. 4.1.1) */ |
| 2049 | idev->gid_prefix = __constant_cpu_to_be64(0xfe80000000000000ULL); | 2049 | idev->gid_prefix = cpu_to_be64(0xfe80000000000000ULL); |
| 2050 | 2050 | ||
| 2051 | ret = ipath_init_qp_table(idev, ib_ipath_qp_table_size); | 2051 | ret = ipath_init_qp_table(idev, ib_ipath_qp_table_size); |
| 2052 | if (ret) | 2052 | if (ret) |
diff --git a/drivers/infiniband/hw/mlx4/mad.c b/drivers/infiniband/hw/mlx4/mad.c index 85a50df2f203..68b3dfa922bf 100644 --- a/drivers/infiniband/hw/mlx4/mad.c +++ b/drivers/infiniband/hw/mlx4/mad.c | |||
| @@ -860,21 +860,31 @@ int mlx4_ib_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num, | |||
| 860 | struct mlx4_ib_dev *dev = to_mdev(ibdev); | 860 | struct mlx4_ib_dev *dev = to_mdev(ibdev); |
| 861 | const struct ib_mad *in_mad = (const struct ib_mad *)in; | 861 | const struct ib_mad *in_mad = (const struct ib_mad *)in; |
| 862 | struct ib_mad *out_mad = (struct ib_mad *)out; | 862 | struct ib_mad *out_mad = (struct ib_mad *)out; |
| 863 | enum rdma_link_layer link = rdma_port_get_link_layer(ibdev, port_num); | ||
| 863 | 864 | ||
| 864 | BUG_ON(in_mad_size != sizeof(*in_mad) || | 865 | if (WARN_ON_ONCE(in_mad_size != sizeof(*in_mad) || |
| 865 | *out_mad_size != sizeof(*out_mad)); | 866 | *out_mad_size != sizeof(*out_mad))) |
| 867 | return IB_MAD_RESULT_FAILURE; | ||
| 866 | 868 | ||
| 867 | switch (rdma_port_get_link_layer(ibdev, port_num)) { | 869 | /* iboe_process_mad() which uses the HCA flow-counters to implement IB PMA |
| 868 | case IB_LINK_LAYER_INFINIBAND: | 870 | * queries, should be called only by VFs and for that specific purpose |
| 869 | if (!mlx4_is_slave(dev->dev)) | 871 | */ |
| 870 | return ib_process_mad(ibdev, mad_flags, port_num, in_wc, | 872 | if (link == IB_LINK_LAYER_INFINIBAND) { |
| 871 | in_grh, in_mad, out_mad); | 873 | if (mlx4_is_slave(dev->dev) && |
| 872 | case IB_LINK_LAYER_ETHERNET: | 874 | in_mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_PERF_MGMT && |
| 873 | return iboe_process_mad(ibdev, mad_flags, port_num, in_wc, | 875 | in_mad->mad_hdr.attr_id == IB_PMA_PORT_COUNTERS) |
| 874 | in_grh, in_mad, out_mad); | 876 | return iboe_process_mad(ibdev, mad_flags, port_num, in_wc, |
| 875 | default: | 877 | in_grh, in_mad, out_mad); |
| 876 | return -EINVAL; | 878 | |
| 879 | return ib_process_mad(ibdev, mad_flags, port_num, in_wc, | ||
| 880 | in_grh, in_mad, out_mad); | ||
| 877 | } | 881 | } |
| 882 | |||
| 883 | if (link == IB_LINK_LAYER_ETHERNET) | ||
| 884 | return iboe_process_mad(ibdev, mad_flags, port_num, in_wc, | ||
| 885 | in_grh, in_mad, out_mad); | ||
| 886 | |||
| 887 | return -EINVAL; | ||
| 878 | } | 888 | } |
| 879 | 889 | ||
| 880 | static void send_handler(struct ib_mad_agent *agent, | 890 | static void send_handler(struct ib_mad_agent *agent, |
diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c index 067a691ecbed..8be6db816460 100644 --- a/drivers/infiniband/hw/mlx4/main.c +++ b/drivers/infiniband/hw/mlx4/main.c | |||
| @@ -253,14 +253,15 @@ static int mlx4_ib_query_device(struct ib_device *ibdev, | |||
| 253 | props->hca_core_clock = dev->dev->caps.hca_core_clock * 1000UL; | 253 | props->hca_core_clock = dev->dev->caps.hca_core_clock * 1000UL; |
| 254 | props->timestamp_mask = 0xFFFFFFFFFFFFULL; | 254 | props->timestamp_mask = 0xFFFFFFFFFFFFULL; |
| 255 | 255 | ||
| 256 | err = mlx4_get_internal_clock_params(dev->dev, &clock_params); | 256 | if (!mlx4_is_slave(dev->dev)) |
| 257 | if (err) | 257 | err = mlx4_get_internal_clock_params(dev->dev, &clock_params); |
| 258 | goto out; | ||
| 259 | 258 | ||
| 260 | if (uhw->outlen >= resp.response_length + sizeof(resp.hca_core_clock_offset)) { | 259 | if (uhw->outlen >= resp.response_length + sizeof(resp.hca_core_clock_offset)) { |
| 261 | resp.hca_core_clock_offset = clock_params.offset % PAGE_SIZE; | ||
| 262 | resp.response_length += sizeof(resp.hca_core_clock_offset); | 260 | resp.response_length += sizeof(resp.hca_core_clock_offset); |
| 263 | resp.comp_mask |= QUERY_DEVICE_RESP_MASK_TIMESTAMP; | 261 | if (!err && !mlx4_is_slave(dev->dev)) { |
| 262 | resp.comp_mask |= QUERY_DEVICE_RESP_MASK_TIMESTAMP; | ||
| 263 | resp.hca_core_clock_offset = clock_params.offset % PAGE_SIZE; | ||
| 264 | } | ||
| 264 | } | 265 | } |
| 265 | 266 | ||
| 266 | if (uhw->outlen) { | 267 | if (uhw->outlen) { |
| @@ -2669,31 +2670,33 @@ static void do_slave_init(struct mlx4_ib_dev *ibdev, int slave, int do_init) | |||
| 2669 | dm = kcalloc(ports, sizeof(*dm), GFP_ATOMIC); | 2670 | dm = kcalloc(ports, sizeof(*dm), GFP_ATOMIC); |
| 2670 | if (!dm) { | 2671 | if (!dm) { |
| 2671 | pr_err("failed to allocate memory for tunneling qp update\n"); | 2672 | pr_err("failed to allocate memory for tunneling qp update\n"); |
| 2672 | goto out; | 2673 | return; |
| 2673 | } | 2674 | } |
| 2674 | 2675 | ||
| 2675 | for (i = 0; i < ports; i++) { | 2676 | for (i = 0; i < ports; i++) { |
| 2676 | dm[i] = kmalloc(sizeof (struct mlx4_ib_demux_work), GFP_ATOMIC); | 2677 | dm[i] = kmalloc(sizeof (struct mlx4_ib_demux_work), GFP_ATOMIC); |
| 2677 | if (!dm[i]) { | 2678 | if (!dm[i]) { |
| 2678 | pr_err("failed to allocate memory for tunneling qp update work struct\n"); | 2679 | pr_err("failed to allocate memory for tunneling qp update work struct\n"); |
| 2679 | for (i = 0; i < dev->caps.num_ports; i++) { | 2680 | while (--i >= 0) |
| 2680 | if (dm[i]) | 2681 | kfree(dm[i]); |
| 2681 | kfree(dm[i]); | ||
| 2682 | } | ||
| 2683 | goto out; | 2682 | goto out; |
| 2684 | } | 2683 | } |
| 2685 | } | ||
| 2686 | /* initialize or tear down tunnel QPs for the slave */ | ||
| 2687 | for (i = 0; i < ports; i++) { | ||
| 2688 | INIT_WORK(&dm[i]->work, mlx4_ib_tunnels_update_work); | 2684 | INIT_WORK(&dm[i]->work, mlx4_ib_tunnels_update_work); |
| 2689 | dm[i]->port = first_port + i + 1; | 2685 | dm[i]->port = first_port + i + 1; |
| 2690 | dm[i]->slave = slave; | 2686 | dm[i]->slave = slave; |
| 2691 | dm[i]->do_init = do_init; | 2687 | dm[i]->do_init = do_init; |
| 2692 | dm[i]->dev = ibdev; | 2688 | dm[i]->dev = ibdev; |
| 2693 | spin_lock_irqsave(&ibdev->sriov.going_down_lock, flags); | 2689 | } |
| 2694 | if (!ibdev->sriov.is_going_down) | 2690 | /* initialize or tear down tunnel QPs for the slave */ |
| 2691 | spin_lock_irqsave(&ibdev->sriov.going_down_lock, flags); | ||
| 2692 | if (!ibdev->sriov.is_going_down) { | ||
| 2693 | for (i = 0; i < ports; i++) | ||
| 2695 | queue_work(ibdev->sriov.demux[i].ud_wq, &dm[i]->work); | 2694 | queue_work(ibdev->sriov.demux[i].ud_wq, &dm[i]->work); |
| 2696 | spin_unlock_irqrestore(&ibdev->sriov.going_down_lock, flags); | 2695 | spin_unlock_irqrestore(&ibdev->sriov.going_down_lock, flags); |
| 2696 | } else { | ||
| 2697 | spin_unlock_irqrestore(&ibdev->sriov.going_down_lock, flags); | ||
| 2698 | for (i = 0; i < ports; i++) | ||
| 2699 | kfree(dm[i]); | ||
| 2697 | } | 2700 | } |
| 2698 | out: | 2701 | out: |
| 2699 | kfree(dm); | 2702 | kfree(dm); |
diff --git a/drivers/infiniband/hw/mlx5/mad.c b/drivers/infiniband/hw/mlx5/mad.c index 01fc97db45d6..b84d13a487cc 100644 --- a/drivers/infiniband/hw/mlx5/mad.c +++ b/drivers/infiniband/hw/mlx5/mad.c | |||
| @@ -68,8 +68,9 @@ int mlx5_ib_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num, | |||
| 68 | const struct ib_mad *in_mad = (const struct ib_mad *)in; | 68 | const struct ib_mad *in_mad = (const struct ib_mad *)in; |
| 69 | struct ib_mad *out_mad = (struct ib_mad *)out; | 69 | struct ib_mad *out_mad = (struct ib_mad *)out; |
| 70 | 70 | ||
| 71 | BUG_ON(in_mad_size != sizeof(*in_mad) || | 71 | if (WARN_ON_ONCE(in_mad_size != sizeof(*in_mad) || |
| 72 | *out_mad_size != sizeof(*out_mad)); | 72 | *out_mad_size != sizeof(*out_mad))) |
| 73 | return IB_MAD_RESULT_FAILURE; | ||
| 73 | 74 | ||
| 74 | slid = in_wc ? in_wc->slid : be16_to_cpu(IB_LID_PERMISSIVE); | 75 | slid = in_wc ? in_wc->slid : be16_to_cpu(IB_LID_PERMISSIVE); |
| 75 | 76 | ||
diff --git a/drivers/infiniband/hw/mthca/mthca_mad.c b/drivers/infiniband/hw/mthca/mthca_mad.c index 6b2418b74c99..7c3f2fb44ba5 100644 --- a/drivers/infiniband/hw/mthca/mthca_mad.c +++ b/drivers/infiniband/hw/mthca/mthca_mad.c | |||
| @@ -209,8 +209,9 @@ int mthca_process_mad(struct ib_device *ibdev, | |||
| 209 | const struct ib_mad *in_mad = (const struct ib_mad *)in; | 209 | const struct ib_mad *in_mad = (const struct ib_mad *)in; |
| 210 | struct ib_mad *out_mad = (struct ib_mad *)out; | 210 | struct ib_mad *out_mad = (struct ib_mad *)out; |
| 211 | 211 | ||
| 212 | BUG_ON(in_mad_size != sizeof(*in_mad) || | 212 | if (WARN_ON_ONCE(in_mad_size != sizeof(*in_mad) || |
| 213 | *out_mad_size != sizeof(*out_mad)); | 213 | *out_mad_size != sizeof(*out_mad))) |
| 214 | return IB_MAD_RESULT_FAILURE; | ||
| 214 | 215 | ||
| 215 | /* Forward locally generated traps to the SM */ | 216 | /* Forward locally generated traps to the SM */ |
| 216 | if (in_mad->mad_hdr.method == IB_MGMT_METHOD_TRAP && | 217 | if (in_mad->mad_hdr.method == IB_MGMT_METHOD_TRAP && |
diff --git a/drivers/infiniband/hw/nes/nes_cm.c b/drivers/infiniband/hw/nes/nes_cm.c index 9047af429906..8a3ad170d790 100644 --- a/drivers/infiniband/hw/nes/nes_cm.c +++ b/drivers/infiniband/hw/nes/nes_cm.c | |||
| @@ -1520,8 +1520,9 @@ static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip, int arpi | |||
| 1520 | int rc = arpindex; | 1520 | int rc = arpindex; |
| 1521 | struct net_device *netdev; | 1521 | struct net_device *netdev; |
| 1522 | struct nes_adapter *nesadapter = nesvnic->nesdev->nesadapter; | 1522 | struct nes_adapter *nesadapter = nesvnic->nesdev->nesadapter; |
| 1523 | __be32 dst_ipaddr = htonl(dst_ip); | ||
| 1523 | 1524 | ||
| 1524 | rt = ip_route_output(&init_net, htonl(dst_ip), 0, 0, 0); | 1525 | rt = ip_route_output(&init_net, dst_ipaddr, nesvnic->local_ipaddr, 0, 0); |
| 1525 | if (IS_ERR(rt)) { | 1526 | if (IS_ERR(rt)) { |
| 1526 | printk(KERN_ERR "%s: ip_route_output_key failed for 0x%08X\n", | 1527 | printk(KERN_ERR "%s: ip_route_output_key failed for 0x%08X\n", |
| 1527 | __func__, dst_ip); | 1528 | __func__, dst_ip); |
| @@ -1533,7 +1534,7 @@ static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip, int arpi | |||
| 1533 | else | 1534 | else |
| 1534 | netdev = nesvnic->netdev; | 1535 | netdev = nesvnic->netdev; |
| 1535 | 1536 | ||
| 1536 | neigh = neigh_lookup(&arp_tbl, &rt->rt_gateway, netdev); | 1537 | neigh = dst_neigh_lookup(&rt->dst, &dst_ipaddr); |
| 1537 | 1538 | ||
| 1538 | rcu_read_lock(); | 1539 | rcu_read_lock(); |
| 1539 | if (neigh) { | 1540 | if (neigh) { |
diff --git a/drivers/infiniband/hw/nes/nes_hw.c b/drivers/infiniband/hw/nes/nes_hw.c index 02120d340d50..4713dd7ed764 100644 --- a/drivers/infiniband/hw/nes/nes_hw.c +++ b/drivers/infiniband/hw/nes/nes_hw.c | |||
| @@ -3861,7 +3861,7 @@ void nes_manage_arp_cache(struct net_device *netdev, unsigned char *mac_addr, | |||
| 3861 | (((u32)mac_addr[2]) << 24) | (((u32)mac_addr[3]) << 16) | | 3861 | (((u32)mac_addr[2]) << 24) | (((u32)mac_addr[3]) << 16) | |
| 3862 | (((u32)mac_addr[4]) << 8) | (u32)mac_addr[5]); | 3862 | (((u32)mac_addr[4]) << 8) | (u32)mac_addr[5]); |
| 3863 | cqp_wqe->wqe_words[NES_CQP_ARP_WQE_MAC_HIGH_IDX] = cpu_to_le32( | 3863 | cqp_wqe->wqe_words[NES_CQP_ARP_WQE_MAC_HIGH_IDX] = cpu_to_le32( |
| 3864 | (((u32)mac_addr[0]) << 16) | (u32)mac_addr[1]); | 3864 | (((u32)mac_addr[0]) << 8) | (u32)mac_addr[1]); |
| 3865 | } else { | 3865 | } else { |
| 3866 | cqp_wqe->wqe_words[NES_CQP_ARP_WQE_MAC_ADDR_LOW_IDX] = 0; | 3866 | cqp_wqe->wqe_words[NES_CQP_ARP_WQE_MAC_ADDR_LOW_IDX] = 0; |
| 3867 | cqp_wqe->wqe_words[NES_CQP_ARP_WQE_MAC_HIGH_IDX] = 0; | 3867 | cqp_wqe->wqe_words[NES_CQP_ARP_WQE_MAC_HIGH_IDX] = 0; |
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_ah.c b/drivers/infiniband/hw/ocrdma/ocrdma_ah.c index 4bafa15708d0..29b27675dd70 100644 --- a/drivers/infiniband/hw/ocrdma/ocrdma_ah.c +++ b/drivers/infiniband/hw/ocrdma/ocrdma_ah.c | |||
| @@ -215,8 +215,9 @@ int ocrdma_process_mad(struct ib_device *ibdev, | |||
| 215 | const struct ib_mad *in_mad = (const struct ib_mad *)in; | 215 | const struct ib_mad *in_mad = (const struct ib_mad *)in; |
| 216 | struct ib_mad *out_mad = (struct ib_mad *)out; | 216 | struct ib_mad *out_mad = (struct ib_mad *)out; |
| 217 | 217 | ||
| 218 | BUG_ON(in_mad_size != sizeof(*in_mad) || | 218 | if (WARN_ON_ONCE(in_mad_size != sizeof(*in_mad) || |
| 219 | *out_mad_size != sizeof(*out_mad)); | 219 | *out_mad_size != sizeof(*out_mad))) |
| 220 | return IB_MAD_RESULT_FAILURE; | ||
| 220 | 221 | ||
| 221 | switch (in_mad->mad_hdr.mgmt_class) { | 222 | switch (in_mad->mad_hdr.mgmt_class) { |
| 222 | case IB_MGMT_CLASS_PERF_MGMT: | 223 | case IB_MGMT_CLASS_PERF_MGMT: |
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_main.c b/drivers/infiniband/hw/ocrdma/ocrdma_main.c index 8a1398b253a2..d98a707a5eb9 100644 --- a/drivers/infiniband/hw/ocrdma/ocrdma_main.c +++ b/drivers/infiniband/hw/ocrdma/ocrdma_main.c | |||
| @@ -696,6 +696,7 @@ static void __exit ocrdma_exit_module(void) | |||
| 696 | ocrdma_unregister_inet6addr_notifier(); | 696 | ocrdma_unregister_inet6addr_notifier(); |
| 697 | ocrdma_unregister_inetaddr_notifier(); | 697 | ocrdma_unregister_inetaddr_notifier(); |
| 698 | ocrdma_rem_debugfs(); | 698 | ocrdma_rem_debugfs(); |
| 699 | idr_destroy(&ocrdma_dev_id); | ||
| 699 | } | 700 | } |
| 700 | 701 | ||
| 701 | module_init(ocrdma_init_module); | 702 | module_init(ocrdma_init_module); |
diff --git a/drivers/infiniband/hw/qib/qib_mad.c b/drivers/infiniband/hw/qib/qib_mad.c index 05e3242d8442..9625e7c438e5 100644 --- a/drivers/infiniband/hw/qib/qib_mad.c +++ b/drivers/infiniband/hw/qib/qib_mad.c | |||
| @@ -2412,8 +2412,9 @@ int qib_process_mad(struct ib_device *ibdev, int mad_flags, u8 port, | |||
| 2412 | const struct ib_mad *in_mad = (const struct ib_mad *)in; | 2412 | const struct ib_mad *in_mad = (const struct ib_mad *)in; |
| 2413 | struct ib_mad *out_mad = (struct ib_mad *)out; | 2413 | struct ib_mad *out_mad = (struct ib_mad *)out; |
| 2414 | 2414 | ||
| 2415 | BUG_ON(in_mad_size != sizeof(*in_mad) || | 2415 | if (WARN_ON_ONCE(in_mad_size != sizeof(*in_mad) || |
| 2416 | *out_mad_size != sizeof(*out_mad)); | 2416 | *out_mad_size != sizeof(*out_mad))) |
| 2417 | return IB_MAD_RESULT_FAILURE; | ||
| 2417 | 2418 | ||
| 2418 | switch (in_mad->mad_hdr.mgmt_class) { | 2419 | switch (in_mad->mad_hdr.mgmt_class) { |
| 2419 | case IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE: | 2420 | case IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE: |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib.h b/drivers/infiniband/ulp/ipoib/ipoib.h index bd94b0a6e9e5..79859c4d43c9 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib.h +++ b/drivers/infiniband/ulp/ipoib/ipoib.h | |||
| @@ -239,7 +239,7 @@ struct ipoib_cm_tx { | |||
| 239 | struct net_device *dev; | 239 | struct net_device *dev; |
| 240 | struct ipoib_neigh *neigh; | 240 | struct ipoib_neigh *neigh; |
| 241 | struct ipoib_path *path; | 241 | struct ipoib_path *path; |
| 242 | struct ipoib_cm_tx_buf *tx_ring; | 242 | struct ipoib_tx_buf *tx_ring; |
| 243 | unsigned tx_head; | 243 | unsigned tx_head; |
| 244 | unsigned tx_tail; | 244 | unsigned tx_tail; |
| 245 | unsigned long flags; | 245 | unsigned long flags; |
| @@ -504,6 +504,33 @@ int ipoib_mcast_stop_thread(struct net_device *dev); | |||
| 504 | void ipoib_mcast_dev_down(struct net_device *dev); | 504 | void ipoib_mcast_dev_down(struct net_device *dev); |
| 505 | void ipoib_mcast_dev_flush(struct net_device *dev); | 505 | void ipoib_mcast_dev_flush(struct net_device *dev); |
| 506 | 506 | ||
| 507 | int ipoib_dma_map_tx(struct ib_device *ca, struct ipoib_tx_buf *tx_req); | ||
| 508 | void ipoib_dma_unmap_tx(struct ipoib_dev_priv *priv, | ||
| 509 | struct ipoib_tx_buf *tx_req); | ||
| 510 | |||
| 511 | static inline void ipoib_build_sge(struct ipoib_dev_priv *priv, | ||
| 512 | struct ipoib_tx_buf *tx_req) | ||
| 513 | { | ||
| 514 | int i, off; | ||
| 515 | struct sk_buff *skb = tx_req->skb; | ||
| 516 | skb_frag_t *frags = skb_shinfo(skb)->frags; | ||
| 517 | int nr_frags = skb_shinfo(skb)->nr_frags; | ||
| 518 | u64 *mapping = tx_req->mapping; | ||
| 519 | |||
| 520 | if (skb_headlen(skb)) { | ||
| 521 | priv->tx_sge[0].addr = mapping[0]; | ||
| 522 | priv->tx_sge[0].length = skb_headlen(skb); | ||
| 523 | off = 1; | ||
| 524 | } else | ||
| 525 | off = 0; | ||
| 526 | |||
| 527 | for (i = 0; i < nr_frags; ++i) { | ||
| 528 | priv->tx_sge[i + off].addr = mapping[i + off]; | ||
| 529 | priv->tx_sge[i + off].length = skb_frag_size(&frags[i]); | ||
| 530 | } | ||
| 531 | priv->tx_wr.num_sge = nr_frags + off; | ||
| 532 | } | ||
| 533 | |||
| 507 | #ifdef CONFIG_INFINIBAND_IPOIB_DEBUG | 534 | #ifdef CONFIG_INFINIBAND_IPOIB_DEBUG |
| 508 | struct ipoib_mcast_iter *ipoib_mcast_iter_init(struct net_device *dev); | 535 | struct ipoib_mcast_iter *ipoib_mcast_iter_init(struct net_device *dev); |
| 509 | int ipoib_mcast_iter_next(struct ipoib_mcast_iter *iter); | 536 | int ipoib_mcast_iter_next(struct ipoib_mcast_iter *iter); |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_cm.c b/drivers/infiniband/ulp/ipoib/ipoib_cm.c index cf32a778e7d0..ee39be6ccfb0 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_cm.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_cm.c | |||
| @@ -694,14 +694,12 @@ repost: | |||
| 694 | static inline int post_send(struct ipoib_dev_priv *priv, | 694 | static inline int post_send(struct ipoib_dev_priv *priv, |
| 695 | struct ipoib_cm_tx *tx, | 695 | struct ipoib_cm_tx *tx, |
| 696 | unsigned int wr_id, | 696 | unsigned int wr_id, |
| 697 | u64 addr, int len) | 697 | struct ipoib_tx_buf *tx_req) |
| 698 | { | 698 | { |
| 699 | struct ib_send_wr *bad_wr; | 699 | struct ib_send_wr *bad_wr; |
| 700 | 700 | ||
| 701 | priv->tx_sge[0].addr = addr; | 701 | ipoib_build_sge(priv, tx_req); |
| 702 | priv->tx_sge[0].length = len; | ||
| 703 | 702 | ||
| 704 | priv->tx_wr.num_sge = 1; | ||
| 705 | priv->tx_wr.wr_id = wr_id | IPOIB_OP_CM; | 703 | priv->tx_wr.wr_id = wr_id | IPOIB_OP_CM; |
| 706 | 704 | ||
| 707 | return ib_post_send(tx->qp, &priv->tx_wr, &bad_wr); | 705 | return ib_post_send(tx->qp, &priv->tx_wr, &bad_wr); |
| @@ -710,8 +708,7 @@ static inline int post_send(struct ipoib_dev_priv *priv, | |||
| 710 | void ipoib_cm_send(struct net_device *dev, struct sk_buff *skb, struct ipoib_cm_tx *tx) | 708 | void ipoib_cm_send(struct net_device *dev, struct sk_buff *skb, struct ipoib_cm_tx *tx) |
| 711 | { | 709 | { |
| 712 | struct ipoib_dev_priv *priv = netdev_priv(dev); | 710 | struct ipoib_dev_priv *priv = netdev_priv(dev); |
| 713 | struct ipoib_cm_tx_buf *tx_req; | 711 | struct ipoib_tx_buf *tx_req; |
| 714 | u64 addr; | ||
| 715 | int rc; | 712 | int rc; |
| 716 | 713 | ||
| 717 | if (unlikely(skb->len > tx->mtu)) { | 714 | if (unlikely(skb->len > tx->mtu)) { |
| @@ -735,24 +732,21 @@ void ipoib_cm_send(struct net_device *dev, struct sk_buff *skb, struct ipoib_cm_ | |||
| 735 | */ | 732 | */ |
| 736 | tx_req = &tx->tx_ring[tx->tx_head & (ipoib_sendq_size - 1)]; | 733 | tx_req = &tx->tx_ring[tx->tx_head & (ipoib_sendq_size - 1)]; |
| 737 | tx_req->skb = skb; | 734 | tx_req->skb = skb; |
| 738 | addr = ib_dma_map_single(priv->ca, skb->data, skb->len, DMA_TO_DEVICE); | 735 | |
| 739 | if (unlikely(ib_dma_mapping_error(priv->ca, addr))) { | 736 | if (unlikely(ipoib_dma_map_tx(priv->ca, tx_req))) { |
| 740 | ++dev->stats.tx_errors; | 737 | ++dev->stats.tx_errors; |
| 741 | dev_kfree_skb_any(skb); | 738 | dev_kfree_skb_any(skb); |
| 742 | return; | 739 | return; |
| 743 | } | 740 | } |
| 744 | 741 | ||
| 745 | tx_req->mapping = addr; | ||
| 746 | |||
| 747 | skb_orphan(skb); | 742 | skb_orphan(skb); |
| 748 | skb_dst_drop(skb); | 743 | skb_dst_drop(skb); |
| 749 | 744 | ||
| 750 | rc = post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1), | 745 | rc = post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1), tx_req); |
| 751 | addr, skb->len); | ||
| 752 | if (unlikely(rc)) { | 746 | if (unlikely(rc)) { |
| 753 | ipoib_warn(priv, "post_send failed, error %d\n", rc); | 747 | ipoib_warn(priv, "post_send failed, error %d\n", rc); |
| 754 | ++dev->stats.tx_errors; | 748 | ++dev->stats.tx_errors; |
| 755 | ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE); | 749 | ipoib_dma_unmap_tx(priv, tx_req); |
| 756 | dev_kfree_skb_any(skb); | 750 | dev_kfree_skb_any(skb); |
| 757 | } else { | 751 | } else { |
| 758 | dev->trans_start = jiffies; | 752 | dev->trans_start = jiffies; |
| @@ -777,7 +771,7 @@ void ipoib_cm_handle_tx_wc(struct net_device *dev, struct ib_wc *wc) | |||
| 777 | struct ipoib_dev_priv *priv = netdev_priv(dev); | 771 | struct ipoib_dev_priv *priv = netdev_priv(dev); |
| 778 | struct ipoib_cm_tx *tx = wc->qp->qp_context; | 772 | struct ipoib_cm_tx *tx = wc->qp->qp_context; |
| 779 | unsigned int wr_id = wc->wr_id & ~IPOIB_OP_CM; | 773 | unsigned int wr_id = wc->wr_id & ~IPOIB_OP_CM; |
| 780 | struct ipoib_cm_tx_buf *tx_req; | 774 | struct ipoib_tx_buf *tx_req; |
| 781 | unsigned long flags; | 775 | unsigned long flags; |
| 782 | 776 | ||
| 783 | ipoib_dbg_data(priv, "cm send completion: id %d, status: %d\n", | 777 | ipoib_dbg_data(priv, "cm send completion: id %d, status: %d\n", |
| @@ -791,7 +785,7 @@ void ipoib_cm_handle_tx_wc(struct net_device *dev, struct ib_wc *wc) | |||
| 791 | 785 | ||
| 792 | tx_req = &tx->tx_ring[wr_id]; | 786 | tx_req = &tx->tx_ring[wr_id]; |
| 793 | 787 | ||
| 794 | ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len, DMA_TO_DEVICE); | 788 | ipoib_dma_unmap_tx(priv, tx_req); |
| 795 | 789 | ||
| 796 | /* FIXME: is this right? Shouldn't we only increment on success? */ | 790 | /* FIXME: is this right? Shouldn't we only increment on success? */ |
| 797 | ++dev->stats.tx_packets; | 791 | ++dev->stats.tx_packets; |
| @@ -1036,6 +1030,9 @@ static struct ib_qp *ipoib_cm_create_tx_qp(struct net_device *dev, struct ipoib_ | |||
| 1036 | 1030 | ||
| 1037 | struct ib_qp *tx_qp; | 1031 | struct ib_qp *tx_qp; |
| 1038 | 1032 | ||
| 1033 | if (dev->features & NETIF_F_SG) | ||
| 1034 | attr.cap.max_send_sge = MAX_SKB_FRAGS + 1; | ||
| 1035 | |||
| 1039 | tx_qp = ib_create_qp(priv->pd, &attr); | 1036 | tx_qp = ib_create_qp(priv->pd, &attr); |
| 1040 | if (PTR_ERR(tx_qp) == -EINVAL) { | 1037 | if (PTR_ERR(tx_qp) == -EINVAL) { |
| 1041 | ipoib_warn(priv, "can't use GFP_NOIO for QPs on device %s, using GFP_KERNEL\n", | 1038 | ipoib_warn(priv, "can't use GFP_NOIO for QPs on device %s, using GFP_KERNEL\n", |
| @@ -1170,7 +1167,7 @@ err_tx: | |||
| 1170 | static void ipoib_cm_tx_destroy(struct ipoib_cm_tx *p) | 1167 | static void ipoib_cm_tx_destroy(struct ipoib_cm_tx *p) |
| 1171 | { | 1168 | { |
| 1172 | struct ipoib_dev_priv *priv = netdev_priv(p->dev); | 1169 | struct ipoib_dev_priv *priv = netdev_priv(p->dev); |
| 1173 | struct ipoib_cm_tx_buf *tx_req; | 1170 | struct ipoib_tx_buf *tx_req; |
| 1174 | unsigned long begin; | 1171 | unsigned long begin; |
| 1175 | 1172 | ||
| 1176 | ipoib_dbg(priv, "Destroy active connection 0x%x head 0x%x tail 0x%x\n", | 1173 | ipoib_dbg(priv, "Destroy active connection 0x%x head 0x%x tail 0x%x\n", |
| @@ -1197,8 +1194,7 @@ timeout: | |||
| 1197 | 1194 | ||
| 1198 | while ((int) p->tx_tail - (int) p->tx_head < 0) { | 1195 | while ((int) p->tx_tail - (int) p->tx_head < 0) { |
| 1199 | tx_req = &p->tx_ring[p->tx_tail & (ipoib_sendq_size - 1)]; | 1196 | tx_req = &p->tx_ring[p->tx_tail & (ipoib_sendq_size - 1)]; |
| 1200 | ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len, | 1197 | ipoib_dma_unmap_tx(priv, tx_req); |
| 1201 | DMA_TO_DEVICE); | ||
| 1202 | dev_kfree_skb_any(tx_req->skb); | 1198 | dev_kfree_skb_any(tx_req->skb); |
| 1203 | ++p->tx_tail; | 1199 | ++p->tx_tail; |
| 1204 | netif_tx_lock_bh(p->dev); | 1200 | netif_tx_lock_bh(p->dev); |
| @@ -1455,7 +1451,6 @@ static void ipoib_cm_stale_task(struct work_struct *work) | |||
| 1455 | spin_unlock_irq(&priv->lock); | 1451 | spin_unlock_irq(&priv->lock); |
| 1456 | } | 1452 | } |
| 1457 | 1453 | ||
| 1458 | |||
| 1459 | static ssize_t show_mode(struct device *d, struct device_attribute *attr, | 1454 | static ssize_t show_mode(struct device *d, struct device_attribute *attr, |
| 1460 | char *buf) | 1455 | char *buf) |
| 1461 | { | 1456 | { |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ib.c b/drivers/infiniband/ulp/ipoib/ipoib_ib.c index 63b92cbb29ad..d266667ca9b8 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_ib.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_ib.c | |||
| @@ -263,8 +263,7 @@ repost: | |||
| 263 | "for buf %d\n", wr_id); | 263 | "for buf %d\n", wr_id); |
| 264 | } | 264 | } |
| 265 | 265 | ||
| 266 | static int ipoib_dma_map_tx(struct ib_device *ca, | 266 | int ipoib_dma_map_tx(struct ib_device *ca, struct ipoib_tx_buf *tx_req) |
| 267 | struct ipoib_tx_buf *tx_req) | ||
| 268 | { | 267 | { |
| 269 | struct sk_buff *skb = tx_req->skb; | 268 | struct sk_buff *skb = tx_req->skb; |
| 270 | u64 *mapping = tx_req->mapping; | 269 | u64 *mapping = tx_req->mapping; |
| @@ -305,8 +304,8 @@ partial_error: | |||
| 305 | return -EIO; | 304 | return -EIO; |
| 306 | } | 305 | } |
| 307 | 306 | ||
| 308 | static void ipoib_dma_unmap_tx(struct ib_device *ca, | 307 | void ipoib_dma_unmap_tx(struct ipoib_dev_priv *priv, |
| 309 | struct ipoib_tx_buf *tx_req) | 308 | struct ipoib_tx_buf *tx_req) |
| 310 | { | 309 | { |
| 311 | struct sk_buff *skb = tx_req->skb; | 310 | struct sk_buff *skb = tx_req->skb; |
| 312 | u64 *mapping = tx_req->mapping; | 311 | u64 *mapping = tx_req->mapping; |
| @@ -314,7 +313,8 @@ static void ipoib_dma_unmap_tx(struct ib_device *ca, | |||
| 314 | int off; | 313 | int off; |
| 315 | 314 | ||
| 316 | if (skb_headlen(skb)) { | 315 | if (skb_headlen(skb)) { |
| 317 | ib_dma_unmap_single(ca, mapping[0], skb_headlen(skb), DMA_TO_DEVICE); | 316 | ib_dma_unmap_single(priv->ca, mapping[0], skb_headlen(skb), |
| 317 | DMA_TO_DEVICE); | ||
| 318 | off = 1; | 318 | off = 1; |
| 319 | } else | 319 | } else |
| 320 | off = 0; | 320 | off = 0; |
| @@ -322,8 +322,8 @@ static void ipoib_dma_unmap_tx(struct ib_device *ca, | |||
| 322 | for (i = 0; i < skb_shinfo(skb)->nr_frags; ++i) { | 322 | for (i = 0; i < skb_shinfo(skb)->nr_frags; ++i) { |
| 323 | const skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; | 323 | const skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; |
| 324 | 324 | ||
| 325 | ib_dma_unmap_page(ca, mapping[i + off], skb_frag_size(frag), | 325 | ib_dma_unmap_page(priv->ca, mapping[i + off], |
| 326 | DMA_TO_DEVICE); | 326 | skb_frag_size(frag), DMA_TO_DEVICE); |
| 327 | } | 327 | } |
| 328 | } | 328 | } |
| 329 | 329 | ||
| @@ -389,7 +389,7 @@ static void ipoib_ib_handle_tx_wc(struct net_device *dev, struct ib_wc *wc) | |||
| 389 | 389 | ||
| 390 | tx_req = &priv->tx_ring[wr_id]; | 390 | tx_req = &priv->tx_ring[wr_id]; |
| 391 | 391 | ||
| 392 | ipoib_dma_unmap_tx(priv->ca, tx_req); | 392 | ipoib_dma_unmap_tx(priv, tx_req); |
| 393 | 393 | ||
| 394 | ++dev->stats.tx_packets; | 394 | ++dev->stats.tx_packets; |
| 395 | dev->stats.tx_bytes += tx_req->skb->len; | 395 | dev->stats.tx_bytes += tx_req->skb->len; |
| @@ -514,24 +514,10 @@ static inline int post_send(struct ipoib_dev_priv *priv, | |||
| 514 | void *head, int hlen) | 514 | void *head, int hlen) |
| 515 | { | 515 | { |
| 516 | struct ib_send_wr *bad_wr; | 516 | struct ib_send_wr *bad_wr; |
| 517 | int i, off; | ||
| 518 | struct sk_buff *skb = tx_req->skb; | 517 | struct sk_buff *skb = tx_req->skb; |
| 519 | skb_frag_t *frags = skb_shinfo(skb)->frags; | ||
| 520 | int nr_frags = skb_shinfo(skb)->nr_frags; | ||
| 521 | u64 *mapping = tx_req->mapping; | ||
| 522 | 518 | ||
| 523 | if (skb_headlen(skb)) { | 519 | ipoib_build_sge(priv, tx_req); |
| 524 | priv->tx_sge[0].addr = mapping[0]; | ||
| 525 | priv->tx_sge[0].length = skb_headlen(skb); | ||
| 526 | off = 1; | ||
| 527 | } else | ||
| 528 | off = 0; | ||
| 529 | 520 | ||
| 530 | for (i = 0; i < nr_frags; ++i) { | ||
| 531 | priv->tx_sge[i + off].addr = mapping[i + off]; | ||
| 532 | priv->tx_sge[i + off].length = skb_frag_size(&frags[i]); | ||
| 533 | } | ||
| 534 | priv->tx_wr.num_sge = nr_frags + off; | ||
| 535 | priv->tx_wr.wr_id = wr_id; | 521 | priv->tx_wr.wr_id = wr_id; |
| 536 | priv->tx_wr.wr.ud.remote_qpn = qpn; | 522 | priv->tx_wr.wr.ud.remote_qpn = qpn; |
| 537 | priv->tx_wr.wr.ud.ah = address; | 523 | priv->tx_wr.wr.ud.ah = address; |
| @@ -617,7 +603,7 @@ void ipoib_send(struct net_device *dev, struct sk_buff *skb, | |||
| 617 | ipoib_warn(priv, "post_send failed, error %d\n", rc); | 603 | ipoib_warn(priv, "post_send failed, error %d\n", rc); |
| 618 | ++dev->stats.tx_errors; | 604 | ++dev->stats.tx_errors; |
| 619 | --priv->tx_outstanding; | 605 | --priv->tx_outstanding; |
| 620 | ipoib_dma_unmap_tx(priv->ca, tx_req); | 606 | ipoib_dma_unmap_tx(priv, tx_req); |
| 621 | dev_kfree_skb_any(skb); | 607 | dev_kfree_skb_any(skb); |
| 622 | if (netif_queue_stopped(dev)) | 608 | if (netif_queue_stopped(dev)) |
| 623 | netif_wake_queue(dev); | 609 | netif_wake_queue(dev); |
| @@ -868,7 +854,7 @@ int ipoib_ib_dev_stop(struct net_device *dev) | |||
| 868 | while ((int) priv->tx_tail - (int) priv->tx_head < 0) { | 854 | while ((int) priv->tx_tail - (int) priv->tx_head < 0) { |
| 869 | tx_req = &priv->tx_ring[priv->tx_tail & | 855 | tx_req = &priv->tx_ring[priv->tx_tail & |
| 870 | (ipoib_sendq_size - 1)]; | 856 | (ipoib_sendq_size - 1)]; |
| 871 | ipoib_dma_unmap_tx(priv->ca, tx_req); | 857 | ipoib_dma_unmap_tx(priv, tx_req); |
| 872 | dev_kfree_skb_any(tx_req->skb); | 858 | dev_kfree_skb_any(tx_req->skb); |
| 873 | ++priv->tx_tail; | 859 | ++priv->tx_tail; |
| 874 | --priv->tx_outstanding; | 860 | --priv->tx_outstanding; |
| @@ -985,20 +971,21 @@ static inline int update_child_pkey(struct ipoib_dev_priv *priv) | |||
| 985 | } | 971 | } |
| 986 | 972 | ||
| 987 | static void __ipoib_ib_dev_flush(struct ipoib_dev_priv *priv, | 973 | static void __ipoib_ib_dev_flush(struct ipoib_dev_priv *priv, |
| 988 | enum ipoib_flush_level level) | 974 | enum ipoib_flush_level level, |
| 975 | int nesting) | ||
| 989 | { | 976 | { |
| 990 | struct ipoib_dev_priv *cpriv; | 977 | struct ipoib_dev_priv *cpriv; |
| 991 | struct net_device *dev = priv->dev; | 978 | struct net_device *dev = priv->dev; |
| 992 | int result; | 979 | int result; |
| 993 | 980 | ||
| 994 | down_read(&priv->vlan_rwsem); | 981 | down_read_nested(&priv->vlan_rwsem, nesting); |
| 995 | 982 | ||
| 996 | /* | 983 | /* |
| 997 | * Flush any child interfaces too -- they might be up even if | 984 | * Flush any child interfaces too -- they might be up even if |
| 998 | * the parent is down. | 985 | * the parent is down. |
| 999 | */ | 986 | */ |
| 1000 | list_for_each_entry(cpriv, &priv->child_intfs, list) | 987 | list_for_each_entry(cpriv, &priv->child_intfs, list) |
| 1001 | __ipoib_ib_dev_flush(cpriv, level); | 988 | __ipoib_ib_dev_flush(cpriv, level, nesting + 1); |
| 1002 | 989 | ||
| 1003 | up_read(&priv->vlan_rwsem); | 990 | up_read(&priv->vlan_rwsem); |
| 1004 | 991 | ||
| @@ -1076,7 +1063,7 @@ void ipoib_ib_dev_flush_light(struct work_struct *work) | |||
| 1076 | struct ipoib_dev_priv *priv = | 1063 | struct ipoib_dev_priv *priv = |
| 1077 | container_of(work, struct ipoib_dev_priv, flush_light); | 1064 | container_of(work, struct ipoib_dev_priv, flush_light); |
| 1078 | 1065 | ||
| 1079 | __ipoib_ib_dev_flush(priv, IPOIB_FLUSH_LIGHT); | 1066 | __ipoib_ib_dev_flush(priv, IPOIB_FLUSH_LIGHT, 0); |
| 1080 | } | 1067 | } |
| 1081 | 1068 | ||
| 1082 | void ipoib_ib_dev_flush_normal(struct work_struct *work) | 1069 | void ipoib_ib_dev_flush_normal(struct work_struct *work) |
| @@ -1084,7 +1071,7 @@ void ipoib_ib_dev_flush_normal(struct work_struct *work) | |||
| 1084 | struct ipoib_dev_priv *priv = | 1071 | struct ipoib_dev_priv *priv = |
| 1085 | container_of(work, struct ipoib_dev_priv, flush_normal); | 1072 | container_of(work, struct ipoib_dev_priv, flush_normal); |
| 1086 | 1073 | ||
| 1087 | __ipoib_ib_dev_flush(priv, IPOIB_FLUSH_NORMAL); | 1074 | __ipoib_ib_dev_flush(priv, IPOIB_FLUSH_NORMAL, 0); |
| 1088 | } | 1075 | } |
| 1089 | 1076 | ||
| 1090 | void ipoib_ib_dev_flush_heavy(struct work_struct *work) | 1077 | void ipoib_ib_dev_flush_heavy(struct work_struct *work) |
| @@ -1092,7 +1079,7 @@ void ipoib_ib_dev_flush_heavy(struct work_struct *work) | |||
| 1092 | struct ipoib_dev_priv *priv = | 1079 | struct ipoib_dev_priv *priv = |
| 1093 | container_of(work, struct ipoib_dev_priv, flush_heavy); | 1080 | container_of(work, struct ipoib_dev_priv, flush_heavy); |
| 1094 | 1081 | ||
| 1095 | __ipoib_ib_dev_flush(priv, IPOIB_FLUSH_HEAVY); | 1082 | __ipoib_ib_dev_flush(priv, IPOIB_FLUSH_HEAVY, 0); |
| 1096 | } | 1083 | } |
| 1097 | 1084 | ||
| 1098 | void ipoib_ib_dev_cleanup(struct net_device *dev) | 1085 | void ipoib_ib_dev_cleanup(struct net_device *dev) |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c index da149c278cb8..b2943c84a5dd 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_main.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c | |||
| @@ -190,7 +190,7 @@ static netdev_features_t ipoib_fix_features(struct net_device *dev, netdev_featu | |||
| 190 | struct ipoib_dev_priv *priv = netdev_priv(dev); | 190 | struct ipoib_dev_priv *priv = netdev_priv(dev); |
| 191 | 191 | ||
| 192 | if (test_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags)) | 192 | if (test_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags)) |
| 193 | features &= ~(NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO); | 193 | features &= ~(NETIF_F_IP_CSUM | NETIF_F_TSO); |
| 194 | 194 | ||
| 195 | return features; | 195 | return features; |
| 196 | } | 196 | } |
| @@ -232,6 +232,7 @@ int ipoib_set_mode(struct net_device *dev, const char *buf) | |||
| 232 | ipoib_warn(priv, "enabling connected mode " | 232 | ipoib_warn(priv, "enabling connected mode " |
| 233 | "will cause multicast packet drops\n"); | 233 | "will cause multicast packet drops\n"); |
| 234 | netdev_update_features(dev); | 234 | netdev_update_features(dev); |
| 235 | dev_set_mtu(dev, ipoib_cm_max_mtu(dev)); | ||
| 235 | rtnl_unlock(); | 236 | rtnl_unlock(); |
| 236 | priv->tx_wr.send_flags &= ~IB_SEND_IP_CSUM; | 237 | priv->tx_wr.send_flags &= ~IB_SEND_IP_CSUM; |
| 237 | 238 | ||
| @@ -1577,7 +1578,8 @@ static struct net_device *ipoib_add_port(const char *format, | |||
| 1577 | SET_NETDEV_DEV(priv->dev, hca->dma_device); | 1578 | SET_NETDEV_DEV(priv->dev, hca->dma_device); |
| 1578 | priv->dev->dev_id = port - 1; | 1579 | priv->dev->dev_id = port - 1; |
| 1579 | 1580 | ||
| 1580 | if (!ib_query_port(hca, port, &attr)) | 1581 | result = ib_query_port(hca, port, &attr); |
| 1582 | if (!result) | ||
| 1581 | priv->max_ib_mtu = ib_mtu_enum_to_int(attr.max_mtu); | 1583 | priv->max_ib_mtu = ib_mtu_enum_to_int(attr.max_mtu); |
| 1582 | else { | 1584 | else { |
| 1583 | printk(KERN_WARNING "%s: ib_query_port %d failed\n", | 1585 | printk(KERN_WARNING "%s: ib_query_port %d failed\n", |
| @@ -1598,7 +1600,8 @@ static struct net_device *ipoib_add_port(const char *format, | |||
| 1598 | goto device_init_failed; | 1600 | goto device_init_failed; |
| 1599 | } | 1601 | } |
| 1600 | 1602 | ||
| 1601 | if (ipoib_set_dev_features(priv, hca)) | 1603 | result = ipoib_set_dev_features(priv, hca); |
| 1604 | if (result) | ||
| 1602 | goto device_init_failed; | 1605 | goto device_init_failed; |
| 1603 | 1606 | ||
| 1604 | /* | 1607 | /* |
| @@ -1684,7 +1687,7 @@ static void ipoib_add_one(struct ib_device *device) | |||
| 1684 | struct list_head *dev_list; | 1687 | struct list_head *dev_list; |
| 1685 | struct net_device *dev; | 1688 | struct net_device *dev; |
| 1686 | struct ipoib_dev_priv *priv; | 1689 | struct ipoib_dev_priv *priv; |
| 1687 | int s, e, p; | 1690 | int p; |
| 1688 | int count = 0; | 1691 | int count = 0; |
| 1689 | 1692 | ||
| 1690 | dev_list = kmalloc(sizeof *dev_list, GFP_KERNEL); | 1693 | dev_list = kmalloc(sizeof *dev_list, GFP_KERNEL); |
| @@ -1693,15 +1696,7 @@ static void ipoib_add_one(struct ib_device *device) | |||
| 1693 | 1696 | ||
| 1694 | INIT_LIST_HEAD(dev_list); | 1697 | INIT_LIST_HEAD(dev_list); |
| 1695 | 1698 | ||
| 1696 | if (device->node_type == RDMA_NODE_IB_SWITCH) { | 1699 | for (p = rdma_start_port(device); p <= rdma_end_port(device); ++p) { |
| 1697 | s = 0; | ||
| 1698 | e = 0; | ||
| 1699 | } else { | ||
| 1700 | s = 1; | ||
| 1701 | e = device->phys_port_cnt; | ||
| 1702 | } | ||
| 1703 | |||
| 1704 | for (p = s; p <= e; ++p) { | ||
| 1705 | if (!rdma_protocol_ib(device, p)) | 1700 | if (!rdma_protocol_ib(device, p)) |
| 1706 | continue; | 1701 | continue; |
| 1707 | dev = ipoib_add_port("ib%d", device, p); | 1702 | dev = ipoib_add_port("ib%d", device, p); |
diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c index 267dc4f75502..31a20b462266 100644 --- a/drivers/infiniband/ulp/srp/ib_srp.c +++ b/drivers/infiniband/ulp/srp/ib_srp.c | |||
| @@ -161,13 +161,10 @@ static int srp_tmo_set(const char *val, const struct kernel_param *kp) | |||
| 161 | { | 161 | { |
| 162 | int tmo, res; | 162 | int tmo, res; |
| 163 | 163 | ||
| 164 | if (strncmp(val, "off", 3) != 0) { | 164 | res = srp_parse_tmo(&tmo, val); |
| 165 | res = kstrtoint(val, 0, &tmo); | 165 | if (res) |
| 166 | if (res) | 166 | goto out; |
| 167 | goto out; | 167 | |
| 168 | } else { | ||
| 169 | tmo = -1; | ||
| 170 | } | ||
| 171 | if (kp->arg == &srp_reconnect_delay) | 168 | if (kp->arg == &srp_reconnect_delay) |
| 172 | res = srp_tmo_valid(tmo, srp_fast_io_fail_tmo, | 169 | res = srp_tmo_valid(tmo, srp_fast_io_fail_tmo, |
| 173 | srp_dev_loss_tmo); | 170 | srp_dev_loss_tmo); |
| @@ -3379,7 +3376,7 @@ static void srp_add_one(struct ib_device *device) | |||
| 3379 | struct srp_device *srp_dev; | 3376 | struct srp_device *srp_dev; |
| 3380 | struct ib_device_attr *dev_attr; | 3377 | struct ib_device_attr *dev_attr; |
| 3381 | struct srp_host *host; | 3378 | struct srp_host *host; |
| 3382 | int mr_page_shift, s, e, p; | 3379 | int mr_page_shift, p; |
| 3383 | u64 max_pages_per_mr; | 3380 | u64 max_pages_per_mr; |
| 3384 | 3381 | ||
| 3385 | dev_attr = kmalloc(sizeof *dev_attr, GFP_KERNEL); | 3382 | dev_attr = kmalloc(sizeof *dev_attr, GFP_KERNEL); |
| @@ -3443,15 +3440,7 @@ static void srp_add_one(struct ib_device *device) | |||
| 3443 | if (IS_ERR(srp_dev->mr)) | 3440 | if (IS_ERR(srp_dev->mr)) |
| 3444 | goto err_pd; | 3441 | goto err_pd; |
| 3445 | 3442 | ||
| 3446 | if (device->node_type == RDMA_NODE_IB_SWITCH) { | 3443 | for (p = rdma_start_port(device); p <= rdma_end_port(device); ++p) { |
| 3447 | s = 0; | ||
| 3448 | e = 0; | ||
| 3449 | } else { | ||
| 3450 | s = 1; | ||
| 3451 | e = device->phys_port_cnt; | ||
| 3452 | } | ||
| 3453 | |||
| 3454 | for (p = s; p <= e; ++p) { | ||
| 3455 | host = srp_add_port(srp_dev, p); | 3444 | host = srp_add_port(srp_dev, p); |
| 3456 | if (host) | 3445 | if (host) |
| 3457 | list_add_tail(&host->list, &srp_dev->dev_list); | 3446 | list_add_tail(&host->list, &srp_dev->dev_list); |
diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c index 82897ca17f32..60ff0a2390e5 100644 --- a/drivers/infiniband/ulp/srpt/ib_srpt.c +++ b/drivers/infiniband/ulp/srpt/ib_srpt.c | |||
| @@ -302,7 +302,7 @@ static void srpt_get_iou(struct ib_dm_mad *mad) | |||
| 302 | int i; | 302 | int i; |
| 303 | 303 | ||
| 304 | ioui = (struct ib_dm_iou_info *)mad->data; | 304 | ioui = (struct ib_dm_iou_info *)mad->data; |
| 305 | ioui->change_id = __constant_cpu_to_be16(1); | 305 | ioui->change_id = cpu_to_be16(1); |
| 306 | ioui->max_controllers = 16; | 306 | ioui->max_controllers = 16; |
| 307 | 307 | ||
| 308 | /* set present for slot 1 and empty for the rest */ | 308 | /* set present for slot 1 and empty for the rest */ |
| @@ -330,13 +330,13 @@ static void srpt_get_ioc(struct srpt_port *sport, u32 slot, | |||
| 330 | 330 | ||
| 331 | if (!slot || slot > 16) { | 331 | if (!slot || slot > 16) { |
| 332 | mad->mad_hdr.status | 332 | mad->mad_hdr.status |
| 333 | = __constant_cpu_to_be16(DM_MAD_STATUS_INVALID_FIELD); | 333 | = cpu_to_be16(DM_MAD_STATUS_INVALID_FIELD); |
| 334 | return; | 334 | return; |
| 335 | } | 335 | } |
| 336 | 336 | ||
| 337 | if (slot > 2) { | 337 | if (slot > 2) { |
| 338 | mad->mad_hdr.status | 338 | mad->mad_hdr.status |
| 339 | = __constant_cpu_to_be16(DM_MAD_STATUS_NO_IOC); | 339 | = cpu_to_be16(DM_MAD_STATUS_NO_IOC); |
| 340 | return; | 340 | return; |
| 341 | } | 341 | } |
| 342 | 342 | ||
| @@ -348,10 +348,10 @@ static void srpt_get_ioc(struct srpt_port *sport, u32 slot, | |||
| 348 | iocp->device_version = cpu_to_be16(sdev->dev_attr.hw_ver); | 348 | iocp->device_version = cpu_to_be16(sdev->dev_attr.hw_ver); |
| 349 | iocp->subsys_vendor_id = cpu_to_be32(sdev->dev_attr.vendor_id); | 349 | iocp->subsys_vendor_id = cpu_to_be32(sdev->dev_attr.vendor_id); |
| 350 | iocp->subsys_device_id = 0x0; | 350 | iocp->subsys_device_id = 0x0; |
| 351 | iocp->io_class = __constant_cpu_to_be16(SRP_REV16A_IB_IO_CLASS); | 351 | iocp->io_class = cpu_to_be16(SRP_REV16A_IB_IO_CLASS); |
| 352 | iocp->io_subclass = __constant_cpu_to_be16(SRP_IO_SUBCLASS); | 352 | iocp->io_subclass = cpu_to_be16(SRP_IO_SUBCLASS); |
| 353 | iocp->protocol = __constant_cpu_to_be16(SRP_PROTOCOL); | 353 | iocp->protocol = cpu_to_be16(SRP_PROTOCOL); |
| 354 | iocp->protocol_version = __constant_cpu_to_be16(SRP_PROTOCOL_VERSION); | 354 | iocp->protocol_version = cpu_to_be16(SRP_PROTOCOL_VERSION); |
| 355 | iocp->send_queue_depth = cpu_to_be16(sdev->srq_size); | 355 | iocp->send_queue_depth = cpu_to_be16(sdev->srq_size); |
| 356 | iocp->rdma_read_depth = 4; | 356 | iocp->rdma_read_depth = 4; |
| 357 | iocp->send_size = cpu_to_be32(srp_max_req_size); | 357 | iocp->send_size = cpu_to_be32(srp_max_req_size); |
| @@ -379,13 +379,13 @@ static void srpt_get_svc_entries(u64 ioc_guid, | |||
| 379 | 379 | ||
| 380 | if (!slot || slot > 16) { | 380 | if (!slot || slot > 16) { |
| 381 | mad->mad_hdr.status | 381 | mad->mad_hdr.status |
| 382 | = __constant_cpu_to_be16(DM_MAD_STATUS_INVALID_FIELD); | 382 | = cpu_to_be16(DM_MAD_STATUS_INVALID_FIELD); |
| 383 | return; | 383 | return; |
| 384 | } | 384 | } |
| 385 | 385 | ||
| 386 | if (slot > 2 || lo > hi || hi > 1) { | 386 | if (slot > 2 || lo > hi || hi > 1) { |
| 387 | mad->mad_hdr.status | 387 | mad->mad_hdr.status |
| 388 | = __constant_cpu_to_be16(DM_MAD_STATUS_NO_IOC); | 388 | = cpu_to_be16(DM_MAD_STATUS_NO_IOC); |
| 389 | return; | 389 | return; |
| 390 | } | 390 | } |
| 391 | 391 | ||
| @@ -436,7 +436,7 @@ static void srpt_mgmt_method_get(struct srpt_port *sp, struct ib_mad *rq_mad, | |||
| 436 | break; | 436 | break; |
| 437 | default: | 437 | default: |
| 438 | rsp_mad->mad_hdr.status = | 438 | rsp_mad->mad_hdr.status = |
| 439 | __constant_cpu_to_be16(DM_MAD_STATUS_UNSUP_METHOD_ATTR); | 439 | cpu_to_be16(DM_MAD_STATUS_UNSUP_METHOD_ATTR); |
| 440 | break; | 440 | break; |
| 441 | } | 441 | } |
| 442 | } | 442 | } |
| @@ -493,11 +493,11 @@ static void srpt_mad_recv_handler(struct ib_mad_agent *mad_agent, | |||
| 493 | break; | 493 | break; |
| 494 | case IB_MGMT_METHOD_SET: | 494 | case IB_MGMT_METHOD_SET: |
| 495 | dm_mad->mad_hdr.status = | 495 | dm_mad->mad_hdr.status = |
| 496 | __constant_cpu_to_be16(DM_MAD_STATUS_UNSUP_METHOD_ATTR); | 496 | cpu_to_be16(DM_MAD_STATUS_UNSUP_METHOD_ATTR); |
| 497 | break; | 497 | break; |
| 498 | default: | 498 | default: |
| 499 | dm_mad->mad_hdr.status = | 499 | dm_mad->mad_hdr.status = |
| 500 | __constant_cpu_to_be16(DM_MAD_STATUS_UNSUP_METHOD); | 500 | cpu_to_be16(DM_MAD_STATUS_UNSUP_METHOD); |
| 501 | break; | 501 | break; |
| 502 | } | 502 | } |
| 503 | 503 | ||
| @@ -1535,7 +1535,7 @@ static int srpt_build_cmd_rsp(struct srpt_rdma_ch *ch, | |||
| 1535 | memset(srp_rsp, 0, sizeof *srp_rsp); | 1535 | memset(srp_rsp, 0, sizeof *srp_rsp); |
| 1536 | srp_rsp->opcode = SRP_RSP; | 1536 | srp_rsp->opcode = SRP_RSP; |
| 1537 | srp_rsp->req_lim_delta = | 1537 | srp_rsp->req_lim_delta = |
| 1538 | __constant_cpu_to_be32(1 + atomic_xchg(&ch->req_lim_delta, 0)); | 1538 | cpu_to_be32(1 + atomic_xchg(&ch->req_lim_delta, 0)); |
| 1539 | srp_rsp->tag = tag; | 1539 | srp_rsp->tag = tag; |
| 1540 | srp_rsp->status = status; | 1540 | srp_rsp->status = status; |
| 1541 | 1541 | ||
| @@ -1585,8 +1585,8 @@ static int srpt_build_tskmgmt_rsp(struct srpt_rdma_ch *ch, | |||
| 1585 | memset(srp_rsp, 0, sizeof *srp_rsp); | 1585 | memset(srp_rsp, 0, sizeof *srp_rsp); |
| 1586 | 1586 | ||
| 1587 | srp_rsp->opcode = SRP_RSP; | 1587 | srp_rsp->opcode = SRP_RSP; |
| 1588 | srp_rsp->req_lim_delta = __constant_cpu_to_be32(1 | 1588 | srp_rsp->req_lim_delta = |
| 1589 | + atomic_xchg(&ch->req_lim_delta, 0)); | 1589 | cpu_to_be32(1 + atomic_xchg(&ch->req_lim_delta, 0)); |
| 1590 | srp_rsp->tag = tag; | 1590 | srp_rsp->tag = tag; |
| 1591 | 1591 | ||
| 1592 | srp_rsp->flags |= SRP_RSP_FLAG_RSPVALID; | 1592 | srp_rsp->flags |= SRP_RSP_FLAG_RSPVALID; |
| @@ -1630,7 +1630,7 @@ static uint64_t srpt_unpack_lun(const uint8_t *lun, int len) | |||
| 1630 | switch (len) { | 1630 | switch (len) { |
| 1631 | case 8: | 1631 | case 8: |
| 1632 | if ((*((__be64 *)lun) & | 1632 | if ((*((__be64 *)lun) & |
| 1633 | __constant_cpu_to_be64(0x0000FFFFFFFFFFFFLL)) != 0) | 1633 | cpu_to_be64(0x0000FFFFFFFFFFFFLL)) != 0) |
| 1634 | goto out_err; | 1634 | goto out_err; |
| 1635 | break; | 1635 | break; |
| 1636 | case 4: | 1636 | case 4: |
| @@ -2449,8 +2449,8 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id, | |||
| 2449 | } | 2449 | } |
| 2450 | 2450 | ||
| 2451 | if (it_iu_len > srp_max_req_size || it_iu_len < 64) { | 2451 | if (it_iu_len > srp_max_req_size || it_iu_len < 64) { |
| 2452 | rej->reason = __constant_cpu_to_be32( | 2452 | rej->reason = cpu_to_be32( |
| 2453 | SRP_LOGIN_REJ_REQ_IT_IU_LENGTH_TOO_LARGE); | 2453 | SRP_LOGIN_REJ_REQ_IT_IU_LENGTH_TOO_LARGE); |
| 2454 | ret = -EINVAL; | 2454 | ret = -EINVAL; |
| 2455 | pr_err("rejected SRP_LOGIN_REQ because its" | 2455 | pr_err("rejected SRP_LOGIN_REQ because its" |
| 2456 | " length (%d bytes) is out of range (%d .. %d)\n", | 2456 | " length (%d bytes) is out of range (%d .. %d)\n", |
| @@ -2459,8 +2459,8 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id, | |||
| 2459 | } | 2459 | } |
| 2460 | 2460 | ||
| 2461 | if (!sport->enabled) { | 2461 | if (!sport->enabled) { |
| 2462 | rej->reason = __constant_cpu_to_be32( | 2462 | rej->reason = cpu_to_be32( |
| 2463 | SRP_LOGIN_REJ_INSUFFICIENT_RESOURCES); | 2463 | SRP_LOGIN_REJ_INSUFFICIENT_RESOURCES); |
| 2464 | ret = -EINVAL; | 2464 | ret = -EINVAL; |
| 2465 | pr_err("rejected SRP_LOGIN_REQ because the target port" | 2465 | pr_err("rejected SRP_LOGIN_REQ because the target port" |
| 2466 | " has not yet been enabled\n"); | 2466 | " has not yet been enabled\n"); |
| @@ -2505,8 +2505,8 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id, | |||
| 2505 | if (*(__be64 *)req->target_port_id != cpu_to_be64(srpt_service_guid) | 2505 | if (*(__be64 *)req->target_port_id != cpu_to_be64(srpt_service_guid) |
| 2506 | || *(__be64 *)(req->target_port_id + 8) != | 2506 | || *(__be64 *)(req->target_port_id + 8) != |
| 2507 | cpu_to_be64(srpt_service_guid)) { | 2507 | cpu_to_be64(srpt_service_guid)) { |
| 2508 | rej->reason = __constant_cpu_to_be32( | 2508 | rej->reason = cpu_to_be32( |
| 2509 | SRP_LOGIN_REJ_UNABLE_ASSOCIATE_CHANNEL); | 2509 | SRP_LOGIN_REJ_UNABLE_ASSOCIATE_CHANNEL); |
| 2510 | ret = -ENOMEM; | 2510 | ret = -ENOMEM; |
| 2511 | pr_err("rejected SRP_LOGIN_REQ because it" | 2511 | pr_err("rejected SRP_LOGIN_REQ because it" |
| 2512 | " has an invalid target port identifier.\n"); | 2512 | " has an invalid target port identifier.\n"); |
| @@ -2515,8 +2515,8 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id, | |||
| 2515 | 2515 | ||
| 2516 | ch = kzalloc(sizeof *ch, GFP_KERNEL); | 2516 | ch = kzalloc(sizeof *ch, GFP_KERNEL); |
| 2517 | if (!ch) { | 2517 | if (!ch) { |
| 2518 | rej->reason = __constant_cpu_to_be32( | 2518 | rej->reason = cpu_to_be32( |
| 2519 | SRP_LOGIN_REJ_INSUFFICIENT_RESOURCES); | 2519 | SRP_LOGIN_REJ_INSUFFICIENT_RESOURCES); |
| 2520 | pr_err("rejected SRP_LOGIN_REQ because no memory.\n"); | 2520 | pr_err("rejected SRP_LOGIN_REQ because no memory.\n"); |
| 2521 | ret = -ENOMEM; | 2521 | ret = -ENOMEM; |
| 2522 | goto reject; | 2522 | goto reject; |
| @@ -2552,8 +2552,8 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id, | |||
| 2552 | 2552 | ||
| 2553 | ret = srpt_create_ch_ib(ch); | 2553 | ret = srpt_create_ch_ib(ch); |
| 2554 | if (ret) { | 2554 | if (ret) { |
| 2555 | rej->reason = __constant_cpu_to_be32( | 2555 | rej->reason = cpu_to_be32( |
| 2556 | SRP_LOGIN_REJ_INSUFFICIENT_RESOURCES); | 2556 | SRP_LOGIN_REJ_INSUFFICIENT_RESOURCES); |
| 2557 | pr_err("rejected SRP_LOGIN_REQ because creating" | 2557 | pr_err("rejected SRP_LOGIN_REQ because creating" |
| 2558 | " a new RDMA channel failed.\n"); | 2558 | " a new RDMA channel failed.\n"); |
| 2559 | goto free_ring; | 2559 | goto free_ring; |
| @@ -2561,8 +2561,7 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id, | |||
| 2561 | 2561 | ||
| 2562 | ret = srpt_ch_qp_rtr(ch, ch->qp); | 2562 | ret = srpt_ch_qp_rtr(ch, ch->qp); |
| 2563 | if (ret) { | 2563 | if (ret) { |
| 2564 | rej->reason = __constant_cpu_to_be32( | 2564 | rej->reason = cpu_to_be32(SRP_LOGIN_REJ_INSUFFICIENT_RESOURCES); |
| 2565 | SRP_LOGIN_REJ_INSUFFICIENT_RESOURCES); | ||
| 2566 | pr_err("rejected SRP_LOGIN_REQ because enabling" | 2565 | pr_err("rejected SRP_LOGIN_REQ because enabling" |
| 2567 | " RTR failed (error code = %d)\n", ret); | 2566 | " RTR failed (error code = %d)\n", ret); |
| 2568 | goto destroy_ib; | 2567 | goto destroy_ib; |
| @@ -2580,15 +2579,15 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id, | |||
| 2580 | if (!nacl) { | 2579 | if (!nacl) { |
| 2581 | pr_info("Rejected login because no ACL has been" | 2580 | pr_info("Rejected login because no ACL has been" |
| 2582 | " configured yet for initiator %s.\n", ch->sess_name); | 2581 | " configured yet for initiator %s.\n", ch->sess_name); |
| 2583 | rej->reason = __constant_cpu_to_be32( | 2582 | rej->reason = cpu_to_be32( |
| 2584 | SRP_LOGIN_REJ_CHANNEL_LIMIT_REACHED); | 2583 | SRP_LOGIN_REJ_CHANNEL_LIMIT_REACHED); |
| 2585 | goto destroy_ib; | 2584 | goto destroy_ib; |
| 2586 | } | 2585 | } |
| 2587 | 2586 | ||
| 2588 | ch->sess = transport_init_session(TARGET_PROT_NORMAL); | 2587 | ch->sess = transport_init_session(TARGET_PROT_NORMAL); |
| 2589 | if (IS_ERR(ch->sess)) { | 2588 | if (IS_ERR(ch->sess)) { |
| 2590 | rej->reason = __constant_cpu_to_be32( | 2589 | rej->reason = cpu_to_be32( |
| 2591 | SRP_LOGIN_REJ_INSUFFICIENT_RESOURCES); | 2590 | SRP_LOGIN_REJ_INSUFFICIENT_RESOURCES); |
| 2592 | pr_debug("Failed to create session\n"); | 2591 | pr_debug("Failed to create session\n"); |
| 2593 | goto deregister_session; | 2592 | goto deregister_session; |
| 2594 | } | 2593 | } |
| @@ -2604,8 +2603,8 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id, | |||
| 2604 | rsp->max_it_iu_len = req->req_it_iu_len; | 2603 | rsp->max_it_iu_len = req->req_it_iu_len; |
| 2605 | rsp->max_ti_iu_len = req->req_it_iu_len; | 2604 | rsp->max_ti_iu_len = req->req_it_iu_len; |
| 2606 | ch->max_ti_iu_len = it_iu_len; | 2605 | ch->max_ti_iu_len = it_iu_len; |
| 2607 | rsp->buf_fmt = __constant_cpu_to_be16(SRP_BUF_FORMAT_DIRECT | 2606 | rsp->buf_fmt = cpu_to_be16(SRP_BUF_FORMAT_DIRECT |
| 2608 | | SRP_BUF_FORMAT_INDIRECT); | 2607 | | SRP_BUF_FORMAT_INDIRECT); |
| 2609 | rsp->req_lim_delta = cpu_to_be32(ch->rq_size); | 2608 | rsp->req_lim_delta = cpu_to_be32(ch->rq_size); |
| 2610 | atomic_set(&ch->req_lim, ch->rq_size); | 2609 | atomic_set(&ch->req_lim, ch->rq_size); |
| 2611 | atomic_set(&ch->req_lim_delta, 0); | 2610 | atomic_set(&ch->req_lim_delta, 0); |
| @@ -2655,8 +2654,8 @@ free_ch: | |||
| 2655 | reject: | 2654 | reject: |
| 2656 | rej->opcode = SRP_LOGIN_REJ; | 2655 | rej->opcode = SRP_LOGIN_REJ; |
| 2657 | rej->tag = req->tag; | 2656 | rej->tag = req->tag; |
| 2658 | rej->buf_fmt = __constant_cpu_to_be16(SRP_BUF_FORMAT_DIRECT | 2657 | rej->buf_fmt = cpu_to_be16(SRP_BUF_FORMAT_DIRECT |
| 2659 | | SRP_BUF_FORMAT_INDIRECT); | 2658 | | SRP_BUF_FORMAT_INDIRECT); |
| 2660 | 2659 | ||
| 2661 | ib_send_cm_rej(cm_id, IB_CM_REJ_CONSUMER_DEFINED, NULL, 0, | 2660 | ib_send_cm_rej(cm_id, IB_CM_REJ_CONSUMER_DEFINED, NULL, 0, |
| 2662 | (void *)rej, sizeof *rej); | 2661 | (void *)rej, sizeof *rej); |
diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c index 1b7e155869f6..c00e2db351ba 100644 --- a/drivers/irqchip/irq-gic-v3-its.c +++ b/drivers/irqchip/irq-gic-v3-its.c | |||
| @@ -75,6 +75,13 @@ struct its_node { | |||
| 75 | 75 | ||
| 76 | #define ITS_ITT_ALIGN SZ_256 | 76 | #define ITS_ITT_ALIGN SZ_256 |
| 77 | 77 | ||
| 78 | struct event_lpi_map { | ||
| 79 | unsigned long *lpi_map; | ||
| 80 | u16 *col_map; | ||
| 81 | irq_hw_number_t lpi_base; | ||
| 82 | int nr_lpis; | ||
| 83 | }; | ||
| 84 | |||
| 78 | /* | 85 | /* |
| 79 | * The ITS view of a device - belongs to an ITS, a collection, owns an | 86 | * The ITS view of a device - belongs to an ITS, a collection, owns an |
| 80 | * interrupt translation table, and a list of interrupts. | 87 | * interrupt translation table, and a list of interrupts. |
| @@ -82,11 +89,8 @@ struct its_node { | |||
| 82 | struct its_device { | 89 | struct its_device { |
| 83 | struct list_head entry; | 90 | struct list_head entry; |
| 84 | struct its_node *its; | 91 | struct its_node *its; |
| 85 | struct its_collection *collection; | 92 | struct event_lpi_map event_map; |
| 86 | void *itt; | 93 | void *itt; |
| 87 | unsigned long *lpi_map; | ||
| 88 | irq_hw_number_t lpi_base; | ||
| 89 | int nr_lpis; | ||
| 90 | u32 nr_ites; | 94 | u32 nr_ites; |
| 91 | u32 device_id; | 95 | u32 device_id; |
| 92 | }; | 96 | }; |
| @@ -99,6 +103,14 @@ static struct rdists *gic_rdists; | |||
| 99 | #define gic_data_rdist() (raw_cpu_ptr(gic_rdists->rdist)) | 103 | #define gic_data_rdist() (raw_cpu_ptr(gic_rdists->rdist)) |
| 100 | #define gic_data_rdist_rd_base() (gic_data_rdist()->rd_base) | 104 | #define gic_data_rdist_rd_base() (gic_data_rdist()->rd_base) |
| 101 | 105 | ||
| 106 | static struct its_collection *dev_event_to_col(struct its_device *its_dev, | ||
| 107 | u32 event) | ||
| 108 | { | ||
| 109 | struct its_node *its = its_dev->its; | ||
| 110 | |||
| 111 | return its->collections + its_dev->event_map.col_map[event]; | ||
| 112 | } | ||
| 113 | |||
| 102 | /* | 114 | /* |
| 103 | * ITS command descriptors - parameters to be encoded in a command | 115 | * ITS command descriptors - parameters to be encoded in a command |
| 104 | * block. | 116 | * block. |
| @@ -134,7 +146,7 @@ struct its_cmd_desc { | |||
| 134 | struct { | 146 | struct { |
| 135 | struct its_device *dev; | 147 | struct its_device *dev; |
| 136 | struct its_collection *col; | 148 | struct its_collection *col; |
| 137 | u32 id; | 149 | u32 event_id; |
| 138 | } its_movi_cmd; | 150 | } its_movi_cmd; |
| 139 | 151 | ||
| 140 | struct { | 152 | struct { |
| @@ -241,7 +253,7 @@ static struct its_collection *its_build_mapd_cmd(struct its_cmd_block *cmd, | |||
| 241 | 253 | ||
| 242 | its_fixup_cmd(cmd); | 254 | its_fixup_cmd(cmd); |
| 243 | 255 | ||
| 244 | return desc->its_mapd_cmd.dev->collection; | 256 | return NULL; |
| 245 | } | 257 | } |
| 246 | 258 | ||
| 247 | static struct its_collection *its_build_mapc_cmd(struct its_cmd_block *cmd, | 259 | static struct its_collection *its_build_mapc_cmd(struct its_cmd_block *cmd, |
| @@ -260,52 +272,72 @@ static struct its_collection *its_build_mapc_cmd(struct its_cmd_block *cmd, | |||
| 260 | static struct its_collection *its_build_mapvi_cmd(struct its_cmd_block *cmd, | 272 | static struct its_collection *its_build_mapvi_cmd(struct its_cmd_block *cmd, |
| 261 | struct its_cmd_desc *desc) | 273 | struct its_cmd_desc *desc) |
| 262 | { | 274 | { |
| 275 | struct its_collection *col; | ||
| 276 | |||
| 277 | col = dev_event_to_col(desc->its_mapvi_cmd.dev, | ||
| 278 | desc->its_mapvi_cmd.event_id); | ||
| 279 | |||
| 263 | its_encode_cmd(cmd, GITS_CMD_MAPVI); | 280 | its_encode_cmd(cmd, GITS_CMD_MAPVI); |
| 264 | its_encode_devid(cmd, desc->its_mapvi_cmd.dev->device_id); | 281 | its_encode_devid(cmd, desc->its_mapvi_cmd.dev->device_id); |
| 265 | its_encode_event_id(cmd, desc->its_mapvi_cmd.event_id); | 282 | its_encode_event_id(cmd, desc->its_mapvi_cmd.event_id); |
| 266 | its_encode_phys_id(cmd, desc->its_mapvi_cmd.phys_id); | 283 | its_encode_phys_id(cmd, desc->its_mapvi_cmd.phys_id); |
| 267 | its_encode_collection(cmd, desc->its_mapvi_cmd.dev->collection->col_id); | 284 | its_encode_collection(cmd, col->col_id); |
| 268 | 285 | ||
| 269 | its_fixup_cmd(cmd); | 286 | its_fixup_cmd(cmd); |
| 270 | 287 | ||
| 271 | return desc->its_mapvi_cmd.dev->collection; | 288 | return col; |
| 272 | } | 289 | } |
| 273 | 290 | ||
| 274 | static struct its_collection *its_build_movi_cmd(struct its_cmd_block *cmd, | 291 | static struct its_collection *its_build_movi_cmd(struct its_cmd_block *cmd, |
| 275 | struct its_cmd_desc *desc) | 292 | struct its_cmd_desc *desc) |
| 276 | { | 293 | { |
| 294 | struct its_collection *col; | ||
| 295 | |||
| 296 | col = dev_event_to_col(desc->its_movi_cmd.dev, | ||
| 297 | desc->its_movi_cmd.event_id); | ||
| 298 | |||
| 277 | its_encode_cmd(cmd, GITS_CMD_MOVI); | 299 | its_encode_cmd(cmd, GITS_CMD_MOVI); |
| 278 | its_encode_devid(cmd, desc->its_movi_cmd.dev->device_id); | 300 | its_encode_devid(cmd, desc->its_movi_cmd.dev->device_id); |
| 279 | its_encode_event_id(cmd, desc->its_movi_cmd.id); | 301 | its_encode_event_id(cmd, desc->its_movi_cmd.event_id); |
| 280 | its_encode_collection(cmd, desc->its_movi_cmd.col->col_id); | 302 | its_encode_collection(cmd, desc->its_movi_cmd.col->col_id); |
| 281 | 303 | ||
| 282 | its_fixup_cmd(cmd); | 304 | its_fixup_cmd(cmd); |
| 283 | 305 | ||
| 284 | return desc->its_movi_cmd.dev->collection; | 306 | return col; |
| 285 | } | 307 | } |
| 286 | 308 | ||
| 287 | static struct its_collection *its_build_discard_cmd(struct its_cmd_block *cmd, | 309 | static struct its_collection *its_build_discard_cmd(struct its_cmd_block *cmd, |
| 288 | struct its_cmd_desc *desc) | 310 | struct its_cmd_desc *desc) |
| 289 | { | 311 | { |
| 312 | struct its_collection *col; | ||
| 313 | |||
| 314 | col = dev_event_to_col(desc->its_discard_cmd.dev, | ||
| 315 | desc->its_discard_cmd.event_id); | ||
| 316 | |||
| 290 | its_encode_cmd(cmd, GITS_CMD_DISCARD); | 317 | its_encode_cmd(cmd, GITS_CMD_DISCARD); |
| 291 | its_encode_devid(cmd, desc->its_discard_cmd.dev->device_id); | 318 | its_encode_devid(cmd, desc->its_discard_cmd.dev->device_id); |
| 292 | its_encode_event_id(cmd, desc->its_discard_cmd.event_id); | 319 | its_encode_event_id(cmd, desc->its_discard_cmd.event_id); |
| 293 | 320 | ||
| 294 | its_fixup_cmd(cmd); | 321 | its_fixup_cmd(cmd); |
| 295 | 322 | ||
| 296 | return desc->its_discard_cmd.dev->collection; | 323 | return col; |
| 297 | } | 324 | } |
| 298 | 325 | ||
| 299 | static struct its_collection *its_build_inv_cmd(struct its_cmd_block *cmd, | 326 | static struct its_collection *its_build_inv_cmd(struct its_cmd_block *cmd, |
| 300 | struct its_cmd_desc *desc) | 327 | struct its_cmd_desc *desc) |
| 301 | { | 328 | { |
| 329 | struct its_collection *col; | ||
| 330 | |||
| 331 | col = dev_event_to_col(desc->its_inv_cmd.dev, | ||
| 332 | desc->its_inv_cmd.event_id); | ||
| 333 | |||
| 302 | its_encode_cmd(cmd, GITS_CMD_INV); | 334 | its_encode_cmd(cmd, GITS_CMD_INV); |
| 303 | its_encode_devid(cmd, desc->its_inv_cmd.dev->device_id); | 335 | its_encode_devid(cmd, desc->its_inv_cmd.dev->device_id); |
| 304 | its_encode_event_id(cmd, desc->its_inv_cmd.event_id); | 336 | its_encode_event_id(cmd, desc->its_inv_cmd.event_id); |
| 305 | 337 | ||
| 306 | its_fixup_cmd(cmd); | 338 | its_fixup_cmd(cmd); |
| 307 | 339 | ||
| 308 | return desc->its_inv_cmd.dev->collection; | 340 | return col; |
| 309 | } | 341 | } |
| 310 | 342 | ||
| 311 | static struct its_collection *its_build_invall_cmd(struct its_cmd_block *cmd, | 343 | static struct its_collection *its_build_invall_cmd(struct its_cmd_block *cmd, |
| @@ -497,7 +529,7 @@ static void its_send_movi(struct its_device *dev, | |||
| 497 | 529 | ||
| 498 | desc.its_movi_cmd.dev = dev; | 530 | desc.its_movi_cmd.dev = dev; |
| 499 | desc.its_movi_cmd.col = col; | 531 | desc.its_movi_cmd.col = col; |
| 500 | desc.its_movi_cmd.id = id; | 532 | desc.its_movi_cmd.event_id = id; |
| 501 | 533 | ||
| 502 | its_send_single_command(dev->its, its_build_movi_cmd, &desc); | 534 | its_send_single_command(dev->its, its_build_movi_cmd, &desc); |
| 503 | } | 535 | } |
| @@ -528,7 +560,7 @@ static void its_send_invall(struct its_node *its, struct its_collection *col) | |||
| 528 | static inline u32 its_get_event_id(struct irq_data *d) | 560 | static inline u32 its_get_event_id(struct irq_data *d) |
| 529 | { | 561 | { |
| 530 | struct its_device *its_dev = irq_data_get_irq_chip_data(d); | 562 | struct its_device *its_dev = irq_data_get_irq_chip_data(d); |
| 531 | return d->hwirq - its_dev->lpi_base; | 563 | return d->hwirq - its_dev->event_map.lpi_base; |
| 532 | } | 564 | } |
| 533 | 565 | ||
| 534 | static void lpi_set_config(struct irq_data *d, bool enable) | 566 | static void lpi_set_config(struct irq_data *d, bool enable) |
| @@ -583,7 +615,7 @@ static int its_set_affinity(struct irq_data *d, const struct cpumask *mask_val, | |||
| 583 | 615 | ||
| 584 | target_col = &its_dev->its->collections[cpu]; | 616 | target_col = &its_dev->its->collections[cpu]; |
| 585 | its_send_movi(its_dev, target_col, id); | 617 | its_send_movi(its_dev, target_col, id); |
| 586 | its_dev->collection = target_col; | 618 | its_dev->event_map.col_map[id] = cpu; |
| 587 | 619 | ||
| 588 | return IRQ_SET_MASK_OK_DONE; | 620 | return IRQ_SET_MASK_OK_DONE; |
| 589 | } | 621 | } |
| @@ -713,8 +745,10 @@ out: | |||
| 713 | return bitmap; | 745 | return bitmap; |
| 714 | } | 746 | } |
| 715 | 747 | ||
| 716 | static void its_lpi_free(unsigned long *bitmap, int base, int nr_ids) | 748 | static void its_lpi_free(struct event_lpi_map *map) |
| 717 | { | 749 | { |
| 750 | int base = map->lpi_base; | ||
| 751 | int nr_ids = map->nr_lpis; | ||
| 718 | int lpi; | 752 | int lpi; |
| 719 | 753 | ||
| 720 | spin_lock(&lpi_lock); | 754 | spin_lock(&lpi_lock); |
| @@ -731,7 +765,8 @@ static void its_lpi_free(unsigned long *bitmap, int base, int nr_ids) | |||
| 731 | 765 | ||
| 732 | spin_unlock(&lpi_lock); | 766 | spin_unlock(&lpi_lock); |
| 733 | 767 | ||
| 734 | kfree(bitmap); | 768 | kfree(map->lpi_map); |
| 769 | kfree(map->col_map); | ||
| 735 | } | 770 | } |
| 736 | 771 | ||
| 737 | /* | 772 | /* |
| @@ -1099,11 +1134,11 @@ static struct its_device *its_create_device(struct its_node *its, u32 dev_id, | |||
| 1099 | struct its_device *dev; | 1134 | struct its_device *dev; |
| 1100 | unsigned long *lpi_map; | 1135 | unsigned long *lpi_map; |
| 1101 | unsigned long flags; | 1136 | unsigned long flags; |
| 1137 | u16 *col_map = NULL; | ||
| 1102 | void *itt; | 1138 | void *itt; |
| 1103 | int lpi_base; | 1139 | int lpi_base; |
| 1104 | int nr_lpis; | 1140 | int nr_lpis; |
| 1105 | int nr_ites; | 1141 | int nr_ites; |
| 1106 | int cpu; | ||
| 1107 | int sz; | 1142 | int sz; |
| 1108 | 1143 | ||
| 1109 | dev = kzalloc(sizeof(*dev), GFP_KERNEL); | 1144 | dev = kzalloc(sizeof(*dev), GFP_KERNEL); |
| @@ -1117,20 +1152,24 @@ static struct its_device *its_create_device(struct its_node *its, u32 dev_id, | |||
| 1117 | sz = max(sz, ITS_ITT_ALIGN) + ITS_ITT_ALIGN - 1; | 1152 | sz = max(sz, ITS_ITT_ALIGN) + ITS_ITT_ALIGN - 1; |
| 1118 | itt = kzalloc(sz, GFP_KERNEL); | 1153 | itt = kzalloc(sz, GFP_KERNEL); |
| 1119 | lpi_map = its_lpi_alloc_chunks(nvecs, &lpi_base, &nr_lpis); | 1154 | lpi_map = its_lpi_alloc_chunks(nvecs, &lpi_base, &nr_lpis); |
| 1155 | if (lpi_map) | ||
| 1156 | col_map = kzalloc(sizeof(*col_map) * nr_lpis, GFP_KERNEL); | ||
| 1120 | 1157 | ||
| 1121 | if (!dev || !itt || !lpi_map) { | 1158 | if (!dev || !itt || !lpi_map || !col_map) { |
| 1122 | kfree(dev); | 1159 | kfree(dev); |
| 1123 | kfree(itt); | 1160 | kfree(itt); |
| 1124 | kfree(lpi_map); | 1161 | kfree(lpi_map); |
| 1162 | kfree(col_map); | ||
| 1125 | return NULL; | 1163 | return NULL; |
| 1126 | } | 1164 | } |
| 1127 | 1165 | ||
| 1128 | dev->its = its; | 1166 | dev->its = its; |
| 1129 | dev->itt = itt; | 1167 | dev->itt = itt; |
| 1130 | dev->nr_ites = nr_ites; | 1168 | dev->nr_ites = nr_ites; |
| 1131 | dev->lpi_map = lpi_map; | 1169 | dev->event_map.lpi_map = lpi_map; |
| 1132 | dev->lpi_base = lpi_base; | 1170 | dev->event_map.col_map = col_map; |
| 1133 | dev->nr_lpis = nr_lpis; | 1171 | dev->event_map.lpi_base = lpi_base; |
| 1172 | dev->event_map.nr_lpis = nr_lpis; | ||
| 1134 | dev->device_id = dev_id; | 1173 | dev->device_id = dev_id; |
| 1135 | INIT_LIST_HEAD(&dev->entry); | 1174 | INIT_LIST_HEAD(&dev->entry); |
| 1136 | 1175 | ||
| @@ -1138,10 +1177,6 @@ static struct its_device *its_create_device(struct its_node *its, u32 dev_id, | |||
| 1138 | list_add(&dev->entry, &its->its_device_list); | 1177 | list_add(&dev->entry, &its->its_device_list); |
| 1139 | raw_spin_unlock_irqrestore(&its->lock, flags); | 1178 | raw_spin_unlock_irqrestore(&its->lock, flags); |
| 1140 | 1179 | ||
| 1141 | /* Bind the device to the first possible CPU */ | ||
| 1142 | cpu = cpumask_first(cpu_online_mask); | ||
| 1143 | dev->collection = &its->collections[cpu]; | ||
| 1144 | |||
| 1145 | /* Map device to its ITT */ | 1180 | /* Map device to its ITT */ |
| 1146 | its_send_mapd(dev, 1); | 1181 | its_send_mapd(dev, 1); |
| 1147 | 1182 | ||
| @@ -1163,12 +1198,13 @@ static int its_alloc_device_irq(struct its_device *dev, irq_hw_number_t *hwirq) | |||
| 1163 | { | 1198 | { |
| 1164 | int idx; | 1199 | int idx; |
| 1165 | 1200 | ||
| 1166 | idx = find_first_zero_bit(dev->lpi_map, dev->nr_lpis); | 1201 | idx = find_first_zero_bit(dev->event_map.lpi_map, |
| 1167 | if (idx == dev->nr_lpis) | 1202 | dev->event_map.nr_lpis); |
| 1203 | if (idx == dev->event_map.nr_lpis) | ||
| 1168 | return -ENOSPC; | 1204 | return -ENOSPC; |
| 1169 | 1205 | ||
| 1170 | *hwirq = dev->lpi_base + idx; | 1206 | *hwirq = dev->event_map.lpi_base + idx; |
| 1171 | set_bit(idx, dev->lpi_map); | 1207 | set_bit(idx, dev->event_map.lpi_map); |
| 1172 | 1208 | ||
| 1173 | return 0; | 1209 | return 0; |
| 1174 | } | 1210 | } |
| @@ -1288,7 +1324,8 @@ static int its_irq_domain_alloc(struct irq_domain *domain, unsigned int virq, | |||
| 1288 | irq_domain_set_hwirq_and_chip(domain, virq + i, | 1324 | irq_domain_set_hwirq_and_chip(domain, virq + i, |
| 1289 | hwirq, &its_irq_chip, its_dev); | 1325 | hwirq, &its_irq_chip, its_dev); |
| 1290 | dev_dbg(info->scratchpad[1].ptr, "ID:%d pID:%d vID:%d\n", | 1326 | dev_dbg(info->scratchpad[1].ptr, "ID:%d pID:%d vID:%d\n", |
| 1291 | (int)(hwirq - its_dev->lpi_base), (int)hwirq, virq + i); | 1327 | (int)(hwirq - its_dev->event_map.lpi_base), |
| 1328 | (int)hwirq, virq + i); | ||
| 1292 | } | 1329 | } |
| 1293 | 1330 | ||
| 1294 | return 0; | 1331 | return 0; |
| @@ -1300,6 +1337,9 @@ static void its_irq_domain_activate(struct irq_domain *domain, | |||
| 1300 | struct its_device *its_dev = irq_data_get_irq_chip_data(d); | 1337 | struct its_device *its_dev = irq_data_get_irq_chip_data(d); |
| 1301 | u32 event = its_get_event_id(d); | 1338 | u32 event = its_get_event_id(d); |
| 1302 | 1339 | ||
| 1340 | /* Bind the LPI to the first possible CPU */ | ||
| 1341 | its_dev->event_map.col_map[event] = cpumask_first(cpu_online_mask); | ||
| 1342 | |||
| 1303 | /* Map the GIC IRQ and event to the device */ | 1343 | /* Map the GIC IRQ and event to the device */ |
| 1304 | its_send_mapvi(its_dev, d->hwirq, event); | 1344 | its_send_mapvi(its_dev, d->hwirq, event); |
| 1305 | } | 1345 | } |
| @@ -1327,17 +1367,16 @@ static void its_irq_domain_free(struct irq_domain *domain, unsigned int virq, | |||
| 1327 | u32 event = its_get_event_id(data); | 1367 | u32 event = its_get_event_id(data); |
| 1328 | 1368 | ||
| 1329 | /* Mark interrupt index as unused */ | 1369 | /* Mark interrupt index as unused */ |
| 1330 | clear_bit(event, its_dev->lpi_map); | 1370 | clear_bit(event, its_dev->event_map.lpi_map); |
| 1331 | 1371 | ||
| 1332 | /* Nuke the entry in the domain */ | 1372 | /* Nuke the entry in the domain */ |
| 1333 | irq_domain_reset_irq_data(data); | 1373 | irq_domain_reset_irq_data(data); |
| 1334 | } | 1374 | } |
| 1335 | 1375 | ||
| 1336 | /* If all interrupts have been freed, start mopping the floor */ | 1376 | /* If all interrupts have been freed, start mopping the floor */ |
| 1337 | if (bitmap_empty(its_dev->lpi_map, its_dev->nr_lpis)) { | 1377 | if (bitmap_empty(its_dev->event_map.lpi_map, |
| 1338 | its_lpi_free(its_dev->lpi_map, | 1378 | its_dev->event_map.nr_lpis)) { |
| 1339 | its_dev->lpi_base, | 1379 | its_lpi_free(&its_dev->event_map); |
| 1340 | its_dev->nr_lpis); | ||
| 1341 | 1380 | ||
| 1342 | /* Unmap device/itt */ | 1381 | /* Unmap device/itt */ |
| 1343 | its_send_mapd(its_dev, 0); | 1382 | its_send_mapd(its_dev, 0); |
diff --git a/drivers/irqchip/spear-shirq.c b/drivers/irqchip/spear-shirq.c index a45121546caf..acb721b31bcf 100644 --- a/drivers/irqchip/spear-shirq.c +++ b/drivers/irqchip/spear-shirq.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * SPEAr platform shared irq layer source file | 2 | * SPEAr platform shared irq layer source file |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2009-2012 ST Microelectronics | 4 | * Copyright (C) 2009-2012 ST Microelectronics |
| 5 | * Viresh Kumar <viresh.linux@gmail.com> | 5 | * Viresh Kumar <vireshk@kernel.org> |
| 6 | * | 6 | * |
| 7 | * Copyright (C) 2012 ST Microelectronics | 7 | * Copyright (C) 2012 ST Microelectronics |
| 8 | * Shiraz Hashim <shiraz.linux.kernel@gmail.com> | 8 | * Shiraz Hashim <shiraz.linux.kernel@gmail.com> |
diff --git a/drivers/md/bcache/closure.h b/drivers/md/bcache/closure.h index a08e3eeac3c5..79a6d63e8ed3 100644 --- a/drivers/md/bcache/closure.h +++ b/drivers/md/bcache/closure.h | |||
| @@ -320,7 +320,6 @@ static inline void closure_wake_up(struct closure_waitlist *list) | |||
| 320 | do { \ | 320 | do { \ |
| 321 | set_closure_fn(_cl, _fn, _wq); \ | 321 | set_closure_fn(_cl, _fn, _wq); \ |
| 322 | closure_sub(_cl, CLOSURE_RUNNING + 1); \ | 322 | closure_sub(_cl, CLOSURE_RUNNING + 1); \ |
| 323 | return; \ | ||
| 324 | } while (0) | 323 | } while (0) |
| 325 | 324 | ||
| 326 | /** | 325 | /** |
| @@ -349,7 +348,6 @@ do { \ | |||
| 349 | do { \ | 348 | do { \ |
| 350 | set_closure_fn(_cl, _fn, _wq); \ | 349 | set_closure_fn(_cl, _fn, _wq); \ |
| 351 | closure_queue(_cl); \ | 350 | closure_queue(_cl); \ |
| 352 | return; \ | ||
| 353 | } while (0) | 351 | } while (0) |
| 354 | 352 | ||
| 355 | /** | 353 | /** |
| @@ -365,7 +363,6 @@ do { \ | |||
| 365 | do { \ | 363 | do { \ |
| 366 | set_closure_fn(_cl, _destructor, NULL); \ | 364 | set_closure_fn(_cl, _destructor, NULL); \ |
| 367 | closure_sub(_cl, CLOSURE_RUNNING - CLOSURE_DESTRUCTOR + 1); \ | 365 | closure_sub(_cl, CLOSURE_RUNNING - CLOSURE_DESTRUCTOR + 1); \ |
| 368 | return; \ | ||
| 369 | } while (0) | 366 | } while (0) |
| 370 | 367 | ||
| 371 | /** | 368 | /** |
diff --git a/drivers/md/bcache/io.c b/drivers/md/bcache/io.c index cb64e64a4789..bf6a9ca18403 100644 --- a/drivers/md/bcache/io.c +++ b/drivers/md/bcache/io.c | |||
| @@ -105,6 +105,7 @@ void bch_generic_make_request(struct bio *bio, struct bio_split_pool *p) | |||
| 105 | } while (n != bio); | 105 | } while (n != bio); |
| 106 | 106 | ||
| 107 | continue_at(&s->cl, bch_bio_submit_split_done, NULL); | 107 | continue_at(&s->cl, bch_bio_submit_split_done, NULL); |
| 108 | return; | ||
| 108 | submit: | 109 | submit: |
| 109 | generic_make_request(bio); | 110 | generic_make_request(bio); |
| 110 | } | 111 | } |
diff --git a/drivers/md/bcache/journal.c b/drivers/md/bcache/journal.c index ce64fc851251..418607a6ba33 100644 --- a/drivers/md/bcache/journal.c +++ b/drivers/md/bcache/journal.c | |||
| @@ -592,12 +592,14 @@ static void journal_write_unlocked(struct closure *cl) | |||
| 592 | 592 | ||
| 593 | if (!w->need_write) { | 593 | if (!w->need_write) { |
| 594 | closure_return_with_destructor(cl, journal_write_unlock); | 594 | closure_return_with_destructor(cl, journal_write_unlock); |
| 595 | return; | ||
| 595 | } else if (journal_full(&c->journal)) { | 596 | } else if (journal_full(&c->journal)) { |
| 596 | journal_reclaim(c); | 597 | journal_reclaim(c); |
| 597 | spin_unlock(&c->journal.lock); | 598 | spin_unlock(&c->journal.lock); |
| 598 | 599 | ||
| 599 | btree_flush_write(c); | 600 | btree_flush_write(c); |
| 600 | continue_at(cl, journal_write, system_wq); | 601 | continue_at(cl, journal_write, system_wq); |
| 602 | return; | ||
| 601 | } | 603 | } |
| 602 | 604 | ||
| 603 | c->journal.blocks_free -= set_blocks(w->data, block_bytes(c)); | 605 | c->journal.blocks_free -= set_blocks(w->data, block_bytes(c)); |
diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c index 4afb2d26b148..f292790997d7 100644 --- a/drivers/md/bcache/request.c +++ b/drivers/md/bcache/request.c | |||
| @@ -88,8 +88,10 @@ static void bch_data_insert_keys(struct closure *cl) | |||
| 88 | if (journal_ref) | 88 | if (journal_ref) |
| 89 | atomic_dec_bug(journal_ref); | 89 | atomic_dec_bug(journal_ref); |
| 90 | 90 | ||
| 91 | if (!op->insert_data_done) | 91 | if (!op->insert_data_done) { |
| 92 | continue_at(cl, bch_data_insert_start, op->wq); | 92 | continue_at(cl, bch_data_insert_start, op->wq); |
| 93 | return; | ||
| 94 | } | ||
| 93 | 95 | ||
| 94 | bch_keylist_free(&op->insert_keys); | 96 | bch_keylist_free(&op->insert_keys); |
| 95 | closure_return(cl); | 97 | closure_return(cl); |
| @@ -216,8 +218,10 @@ static void bch_data_insert_start(struct closure *cl) | |||
| 216 | /* 1 for the device pointer and 1 for the chksum */ | 218 | /* 1 for the device pointer and 1 for the chksum */ |
| 217 | if (bch_keylist_realloc(&op->insert_keys, | 219 | if (bch_keylist_realloc(&op->insert_keys, |
| 218 | 3 + (op->csum ? 1 : 0), | 220 | 3 + (op->csum ? 1 : 0), |
| 219 | op->c)) | 221 | op->c)) { |
| 220 | continue_at(cl, bch_data_insert_keys, op->wq); | 222 | continue_at(cl, bch_data_insert_keys, op->wq); |
| 223 | return; | ||
| 224 | } | ||
| 221 | 225 | ||
| 222 | k = op->insert_keys.top; | 226 | k = op->insert_keys.top; |
| 223 | bkey_init(k); | 227 | bkey_init(k); |
| @@ -255,6 +259,7 @@ static void bch_data_insert_start(struct closure *cl) | |||
| 255 | 259 | ||
| 256 | op->insert_data_done = true; | 260 | op->insert_data_done = true; |
| 257 | continue_at(cl, bch_data_insert_keys, op->wq); | 261 | continue_at(cl, bch_data_insert_keys, op->wq); |
| 262 | return; | ||
| 258 | err: | 263 | err: |
| 259 | /* bch_alloc_sectors() blocks if s->writeback = true */ | 264 | /* bch_alloc_sectors() blocks if s->writeback = true */ |
| 260 | BUG_ON(op->writeback); | 265 | BUG_ON(op->writeback); |
| @@ -576,8 +581,10 @@ static void cache_lookup(struct closure *cl) | |||
| 576 | ret = bch_btree_map_keys(&s->op, s->iop.c, | 581 | ret = bch_btree_map_keys(&s->op, s->iop.c, |
| 577 | &KEY(s->iop.inode, bio->bi_iter.bi_sector, 0), | 582 | &KEY(s->iop.inode, bio->bi_iter.bi_sector, 0), |
| 578 | cache_lookup_fn, MAP_END_KEY); | 583 | cache_lookup_fn, MAP_END_KEY); |
| 579 | if (ret == -EAGAIN) | 584 | if (ret == -EAGAIN) { |
| 580 | continue_at(cl, cache_lookup, bcache_wq); | 585 | continue_at(cl, cache_lookup, bcache_wq); |
| 586 | return; | ||
| 587 | } | ||
| 581 | 588 | ||
| 582 | closure_return(cl); | 589 | closure_return(cl); |
| 583 | } | 590 | } |
| @@ -1085,6 +1092,7 @@ static void flash_dev_make_request(struct request_queue *q, struct bio *bio) | |||
| 1085 | continue_at_nobarrier(&s->cl, | 1092 | continue_at_nobarrier(&s->cl, |
| 1086 | flash_dev_nodata, | 1093 | flash_dev_nodata, |
| 1087 | bcache_wq); | 1094 | bcache_wq); |
| 1095 | return; | ||
| 1088 | } else if (rw) { | 1096 | } else if (rw) { |
| 1089 | bch_keybuf_check_overlapping(&s->iop.c->moving_gc_keys, | 1097 | bch_keybuf_check_overlapping(&s->iop.c->moving_gc_keys, |
| 1090 | &KEY(d->id, bio->bi_iter.bi_sector, 0), | 1098 | &KEY(d->id, bio->bi_iter.bi_sector, 0), |
diff --git a/drivers/md/dm-cache-target.c b/drivers/md/dm-cache-target.c index 1b4e1756b169..b680da5d7b93 100644 --- a/drivers/md/dm-cache-target.c +++ b/drivers/md/dm-cache-target.c | |||
| @@ -424,7 +424,6 @@ static void free_migration(struct dm_cache_migration *mg) | |||
| 424 | wake_up(&cache->migration_wait); | 424 | wake_up(&cache->migration_wait); |
| 425 | 425 | ||
| 426 | mempool_free(mg, cache->migration_pool); | 426 | mempool_free(mg, cache->migration_pool); |
| 427 | wake_worker(cache); | ||
| 428 | } | 427 | } |
| 429 | 428 | ||
| 430 | static int prealloc_data_structs(struct cache *cache, struct prealloc *p) | 429 | static int prealloc_data_structs(struct cache *cache, struct prealloc *p) |
| @@ -1947,6 +1946,7 @@ static int commit_if_needed(struct cache *cache) | |||
| 1947 | 1946 | ||
| 1948 | static void process_deferred_bios(struct cache *cache) | 1947 | static void process_deferred_bios(struct cache *cache) |
| 1949 | { | 1948 | { |
| 1949 | bool prealloc_used = false; | ||
| 1950 | unsigned long flags; | 1950 | unsigned long flags; |
| 1951 | struct bio_list bios; | 1951 | struct bio_list bios; |
| 1952 | struct bio *bio; | 1952 | struct bio *bio; |
| @@ -1981,13 +1981,16 @@ static void process_deferred_bios(struct cache *cache) | |||
| 1981 | process_discard_bio(cache, &structs, bio); | 1981 | process_discard_bio(cache, &structs, bio); |
| 1982 | else | 1982 | else |
| 1983 | process_bio(cache, &structs, bio); | 1983 | process_bio(cache, &structs, bio); |
| 1984 | prealloc_used = true; | ||
| 1984 | } | 1985 | } |
| 1985 | 1986 | ||
| 1986 | prealloc_free_structs(cache, &structs); | 1987 | if (prealloc_used) |
| 1988 | prealloc_free_structs(cache, &structs); | ||
| 1987 | } | 1989 | } |
| 1988 | 1990 | ||
| 1989 | static void process_deferred_cells(struct cache *cache) | 1991 | static void process_deferred_cells(struct cache *cache) |
| 1990 | { | 1992 | { |
| 1993 | bool prealloc_used = false; | ||
| 1991 | unsigned long flags; | 1994 | unsigned long flags; |
| 1992 | struct dm_bio_prison_cell *cell, *tmp; | 1995 | struct dm_bio_prison_cell *cell, *tmp; |
| 1993 | struct list_head cells; | 1996 | struct list_head cells; |
| @@ -2015,9 +2018,11 @@ static void process_deferred_cells(struct cache *cache) | |||
| 2015 | } | 2018 | } |
| 2016 | 2019 | ||
| 2017 | process_cell(cache, &structs, cell); | 2020 | process_cell(cache, &structs, cell); |
| 2021 | prealloc_used = true; | ||
| 2018 | } | 2022 | } |
| 2019 | 2023 | ||
| 2020 | prealloc_free_structs(cache, &structs); | 2024 | if (prealloc_used) |
| 2025 | prealloc_free_structs(cache, &structs); | ||
| 2021 | } | 2026 | } |
| 2022 | 2027 | ||
| 2023 | static void process_deferred_flush_bios(struct cache *cache, bool submit_bios) | 2028 | static void process_deferred_flush_bios(struct cache *cache, bool submit_bios) |
| @@ -2062,7 +2067,7 @@ static void process_deferred_writethrough_bios(struct cache *cache) | |||
| 2062 | 2067 | ||
| 2063 | static void writeback_some_dirty_blocks(struct cache *cache) | 2068 | static void writeback_some_dirty_blocks(struct cache *cache) |
| 2064 | { | 2069 | { |
| 2065 | int r = 0; | 2070 | bool prealloc_used = false; |
| 2066 | dm_oblock_t oblock; | 2071 | dm_oblock_t oblock; |
| 2067 | dm_cblock_t cblock; | 2072 | dm_cblock_t cblock; |
| 2068 | struct prealloc structs; | 2073 | struct prealloc structs; |
| @@ -2072,23 +2077,21 @@ static void writeback_some_dirty_blocks(struct cache *cache) | |||
| 2072 | memset(&structs, 0, sizeof(structs)); | 2077 | memset(&structs, 0, sizeof(structs)); |
| 2073 | 2078 | ||
| 2074 | while (spare_migration_bandwidth(cache)) { | 2079 | while (spare_migration_bandwidth(cache)) { |
| 2075 | if (prealloc_data_structs(cache, &structs)) | 2080 | if (policy_writeback_work(cache->policy, &oblock, &cblock, busy)) |
| 2076 | break; | 2081 | break; /* no work to do */ |
| 2077 | 2082 | ||
| 2078 | r = policy_writeback_work(cache->policy, &oblock, &cblock, busy); | 2083 | if (prealloc_data_structs(cache, &structs) || |
| 2079 | if (r) | 2084 | get_cell(cache, oblock, &structs, &old_ocell)) { |
| 2080 | break; | ||
| 2081 | |||
| 2082 | r = get_cell(cache, oblock, &structs, &old_ocell); | ||
| 2083 | if (r) { | ||
| 2084 | policy_set_dirty(cache->policy, oblock); | 2085 | policy_set_dirty(cache->policy, oblock); |
| 2085 | break; | 2086 | break; |
| 2086 | } | 2087 | } |
| 2087 | 2088 | ||
| 2088 | writeback(cache, &structs, oblock, cblock, old_ocell); | 2089 | writeback(cache, &structs, oblock, cblock, old_ocell); |
| 2090 | prealloc_used = true; | ||
| 2089 | } | 2091 | } |
| 2090 | 2092 | ||
| 2091 | prealloc_free_structs(cache, &structs); | 2093 | if (prealloc_used) |
| 2094 | prealloc_free_structs(cache, &structs); | ||
| 2092 | } | 2095 | } |
| 2093 | 2096 | ||
| 2094 | /*---------------------------------------------------------------- | 2097 | /*---------------------------------------------------------------- |
| @@ -3496,7 +3499,7 @@ static void cache_resume(struct dm_target *ti) | |||
| 3496 | * <#demotions> <#promotions> <#dirty> | 3499 | * <#demotions> <#promotions> <#dirty> |
| 3497 | * <#features> <features>* | 3500 | * <#features> <features>* |
| 3498 | * <#core args> <core args> | 3501 | * <#core args> <core args> |
| 3499 | * <policy name> <#policy args> <policy args>* <cache metadata mode> | 3502 | * <policy name> <#policy args> <policy args>* <cache metadata mode> <needs_check> |
| 3500 | */ | 3503 | */ |
| 3501 | static void cache_status(struct dm_target *ti, status_type_t type, | 3504 | static void cache_status(struct dm_target *ti, status_type_t type, |
| 3502 | unsigned status_flags, char *result, unsigned maxlen) | 3505 | unsigned status_flags, char *result, unsigned maxlen) |
| @@ -3582,6 +3585,11 @@ static void cache_status(struct dm_target *ti, status_type_t type, | |||
| 3582 | else | 3585 | else |
| 3583 | DMEMIT("rw "); | 3586 | DMEMIT("rw "); |
| 3584 | 3587 | ||
| 3588 | if (dm_cache_metadata_needs_check(cache->cmd)) | ||
| 3589 | DMEMIT("needs_check "); | ||
| 3590 | else | ||
| 3591 | DMEMIT("- "); | ||
| 3592 | |||
| 3585 | break; | 3593 | break; |
| 3586 | 3594 | ||
| 3587 | case STATUSTYPE_TABLE: | 3595 | case STATUSTYPE_TABLE: |
| @@ -3820,7 +3828,7 @@ static void cache_io_hints(struct dm_target *ti, struct queue_limits *limits) | |||
| 3820 | 3828 | ||
| 3821 | static struct target_type cache_target = { | 3829 | static struct target_type cache_target = { |
| 3822 | .name = "cache", | 3830 | .name = "cache", |
| 3823 | .version = {1, 7, 0}, | 3831 | .version = {1, 8, 0}, |
| 3824 | .module = THIS_MODULE, | 3832 | .module = THIS_MODULE, |
| 3825 | .ctr = cache_ctr, | 3833 | .ctr = cache_ctr, |
| 3826 | .dtr = cache_dtr, | 3834 | .dtr = cache_dtr, |
diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c index c33f61a4cc28..1c50c580215c 100644 --- a/drivers/md/dm-thin.c +++ b/drivers/md/dm-thin.c | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | #include <linux/init.h> | 18 | #include <linux/init.h> |
| 19 | #include <linux/module.h> | 19 | #include <linux/module.h> |
| 20 | #include <linux/slab.h> | 20 | #include <linux/slab.h> |
| 21 | #include <linux/vmalloc.h> | ||
| 21 | #include <linux/sort.h> | 22 | #include <linux/sort.h> |
| 22 | #include <linux/rbtree.h> | 23 | #include <linux/rbtree.h> |
| 23 | 24 | ||
| @@ -268,7 +269,7 @@ struct pool { | |||
| 268 | process_mapping_fn process_prepared_mapping; | 269 | process_mapping_fn process_prepared_mapping; |
| 269 | process_mapping_fn process_prepared_discard; | 270 | process_mapping_fn process_prepared_discard; |
| 270 | 271 | ||
| 271 | struct dm_bio_prison_cell *cell_sort_array[CELL_SORT_ARRAY_SIZE]; | 272 | struct dm_bio_prison_cell **cell_sort_array; |
| 272 | }; | 273 | }; |
| 273 | 274 | ||
| 274 | static enum pool_mode get_pool_mode(struct pool *pool); | 275 | static enum pool_mode get_pool_mode(struct pool *pool); |
| @@ -2281,18 +2282,23 @@ static void do_waker(struct work_struct *ws) | |||
| 2281 | queue_delayed_work(pool->wq, &pool->waker, COMMIT_PERIOD); | 2282 | queue_delayed_work(pool->wq, &pool->waker, COMMIT_PERIOD); |
| 2282 | } | 2283 | } |
| 2283 | 2284 | ||
| 2285 | static void notify_of_pool_mode_change_to_oods(struct pool *pool); | ||
| 2286 | |||
| 2284 | /* | 2287 | /* |
| 2285 | * We're holding onto IO to allow userland time to react. After the | 2288 | * We're holding onto IO to allow userland time to react. After the |
| 2286 | * timeout either the pool will have been resized (and thus back in | 2289 | * timeout either the pool will have been resized (and thus back in |
| 2287 | * PM_WRITE mode), or we degrade to PM_READ_ONLY and start erroring IO. | 2290 | * PM_WRITE mode), or we degrade to PM_OUT_OF_DATA_SPACE w/ error_if_no_space. |
| 2288 | */ | 2291 | */ |
| 2289 | static void do_no_space_timeout(struct work_struct *ws) | 2292 | static void do_no_space_timeout(struct work_struct *ws) |
| 2290 | { | 2293 | { |
| 2291 | struct pool *pool = container_of(to_delayed_work(ws), struct pool, | 2294 | struct pool *pool = container_of(to_delayed_work(ws), struct pool, |
| 2292 | no_space_timeout); | 2295 | no_space_timeout); |
| 2293 | 2296 | ||
| 2294 | if (get_pool_mode(pool) == PM_OUT_OF_DATA_SPACE && !pool->pf.error_if_no_space) | 2297 | if (get_pool_mode(pool) == PM_OUT_OF_DATA_SPACE && !pool->pf.error_if_no_space) { |
| 2295 | set_pool_mode(pool, PM_READ_ONLY); | 2298 | pool->pf.error_if_no_space = true; |
| 2299 | notify_of_pool_mode_change_to_oods(pool); | ||
| 2300 | error_retry_list(pool); | ||
| 2301 | } | ||
| 2296 | } | 2302 | } |
| 2297 | 2303 | ||
| 2298 | /*----------------------------------------------------------------*/ | 2304 | /*----------------------------------------------------------------*/ |
| @@ -2370,6 +2376,14 @@ static void notify_of_pool_mode_change(struct pool *pool, const char *new_mode) | |||
| 2370 | dm_device_name(pool->pool_md), new_mode); | 2376 | dm_device_name(pool->pool_md), new_mode); |
| 2371 | } | 2377 | } |
| 2372 | 2378 | ||
| 2379 | static void notify_of_pool_mode_change_to_oods(struct pool *pool) | ||
| 2380 | { | ||
| 2381 | if (!pool->pf.error_if_no_space) | ||
| 2382 | notify_of_pool_mode_change(pool, "out-of-data-space (queue IO)"); | ||
| 2383 | else | ||
| 2384 | notify_of_pool_mode_change(pool, "out-of-data-space (error IO)"); | ||
| 2385 | } | ||
| 2386 | |||
| 2373 | static bool passdown_enabled(struct pool_c *pt) | 2387 | static bool passdown_enabled(struct pool_c *pt) |
| 2374 | { | 2388 | { |
| 2375 | return pt->adjusted_pf.discard_passdown; | 2389 | return pt->adjusted_pf.discard_passdown; |
| @@ -2454,7 +2468,7 @@ static void set_pool_mode(struct pool *pool, enum pool_mode new_mode) | |||
| 2454 | * frequently seeing this mode. | 2468 | * frequently seeing this mode. |
| 2455 | */ | 2469 | */ |
| 2456 | if (old_mode != new_mode) | 2470 | if (old_mode != new_mode) |
| 2457 | notify_of_pool_mode_change(pool, "out-of-data-space"); | 2471 | notify_of_pool_mode_change_to_oods(pool); |
| 2458 | pool->process_bio = process_bio_read_only; | 2472 | pool->process_bio = process_bio_read_only; |
| 2459 | pool->process_discard = process_discard_bio; | 2473 | pool->process_discard = process_discard_bio; |
| 2460 | pool->process_cell = process_cell_read_only; | 2474 | pool->process_cell = process_cell_read_only; |
| @@ -2777,6 +2791,7 @@ static void __pool_destroy(struct pool *pool) | |||
| 2777 | { | 2791 | { |
| 2778 | __pool_table_remove(pool); | 2792 | __pool_table_remove(pool); |
| 2779 | 2793 | ||
| 2794 | vfree(pool->cell_sort_array); | ||
| 2780 | if (dm_pool_metadata_close(pool->pmd) < 0) | 2795 | if (dm_pool_metadata_close(pool->pmd) < 0) |
| 2781 | DMWARN("%s: dm_pool_metadata_close() failed.", __func__); | 2796 | DMWARN("%s: dm_pool_metadata_close() failed.", __func__); |
| 2782 | 2797 | ||
| @@ -2889,6 +2904,13 @@ static struct pool *pool_create(struct mapped_device *pool_md, | |||
| 2889 | goto bad_mapping_pool; | 2904 | goto bad_mapping_pool; |
| 2890 | } | 2905 | } |
| 2891 | 2906 | ||
| 2907 | pool->cell_sort_array = vmalloc(sizeof(*pool->cell_sort_array) * CELL_SORT_ARRAY_SIZE); | ||
| 2908 | if (!pool->cell_sort_array) { | ||
| 2909 | *error = "Error allocating cell sort array"; | ||
| 2910 | err_p = ERR_PTR(-ENOMEM); | ||
| 2911 | goto bad_sort_array; | ||
| 2912 | } | ||
| 2913 | |||
| 2892 | pool->ref_count = 1; | 2914 | pool->ref_count = 1; |
| 2893 | pool->last_commit_jiffies = jiffies; | 2915 | pool->last_commit_jiffies = jiffies; |
| 2894 | pool->pool_md = pool_md; | 2916 | pool->pool_md = pool_md; |
| @@ -2897,6 +2919,8 @@ static struct pool *pool_create(struct mapped_device *pool_md, | |||
| 2897 | 2919 | ||
| 2898 | return pool; | 2920 | return pool; |
| 2899 | 2921 | ||
| 2922 | bad_sort_array: | ||
| 2923 | mempool_destroy(pool->mapping_pool); | ||
| 2900 | bad_mapping_pool: | 2924 | bad_mapping_pool: |
| 2901 | dm_deferred_set_destroy(pool->all_io_ds); | 2925 | dm_deferred_set_destroy(pool->all_io_ds); |
| 2902 | bad_all_io_ds: | 2926 | bad_all_io_ds: |
| @@ -3714,6 +3738,7 @@ static void emit_flags(struct pool_features *pf, char *result, | |||
| 3714 | * Status line is: | 3738 | * Status line is: |
| 3715 | * <transaction id> <used metadata sectors>/<total metadata sectors> | 3739 | * <transaction id> <used metadata sectors>/<total metadata sectors> |
| 3716 | * <used data sectors>/<total data sectors> <held metadata root> | 3740 | * <used data sectors>/<total data sectors> <held metadata root> |
| 3741 | * <pool mode> <discard config> <no space config> <needs_check> | ||
| 3717 | */ | 3742 | */ |
| 3718 | static void pool_status(struct dm_target *ti, status_type_t type, | 3743 | static void pool_status(struct dm_target *ti, status_type_t type, |
| 3719 | unsigned status_flags, char *result, unsigned maxlen) | 3744 | unsigned status_flags, char *result, unsigned maxlen) |
| @@ -3815,6 +3840,11 @@ static void pool_status(struct dm_target *ti, status_type_t type, | |||
| 3815 | else | 3840 | else |
| 3816 | DMEMIT("queue_if_no_space "); | 3841 | DMEMIT("queue_if_no_space "); |
| 3817 | 3842 | ||
| 3843 | if (dm_pool_metadata_needs_check(pool->pmd)) | ||
| 3844 | DMEMIT("needs_check "); | ||
| 3845 | else | ||
| 3846 | DMEMIT("- "); | ||
| 3847 | |||
| 3818 | break; | 3848 | break; |
| 3819 | 3849 | ||
| 3820 | case STATUSTYPE_TABLE: | 3850 | case STATUSTYPE_TABLE: |
| @@ -3918,7 +3948,7 @@ static struct target_type pool_target = { | |||
| 3918 | .name = "thin-pool", | 3948 | .name = "thin-pool", |
| 3919 | .features = DM_TARGET_SINGLETON | DM_TARGET_ALWAYS_WRITEABLE | | 3949 | .features = DM_TARGET_SINGLETON | DM_TARGET_ALWAYS_WRITEABLE | |
| 3920 | DM_TARGET_IMMUTABLE, | 3950 | DM_TARGET_IMMUTABLE, |
| 3921 | .version = {1, 15, 0}, | 3951 | .version = {1, 16, 0}, |
| 3922 | .module = THIS_MODULE, | 3952 | .module = THIS_MODULE, |
| 3923 | .ctr = pool_ctr, | 3953 | .ctr = pool_ctr, |
| 3924 | .dtr = pool_dtr, | 3954 | .dtr = pool_dtr, |
| @@ -4305,7 +4335,7 @@ static void thin_io_hints(struct dm_target *ti, struct queue_limits *limits) | |||
| 4305 | 4335 | ||
| 4306 | static struct target_type thin_target = { | 4336 | static struct target_type thin_target = { |
| 4307 | .name = "thin", | 4337 | .name = "thin", |
| 4308 | .version = {1, 15, 0}, | 4338 | .version = {1, 16, 0}, |
| 4309 | .module = THIS_MODULE, | 4339 | .module = THIS_MODULE, |
| 4310 | .ctr = thin_ctr, | 4340 | .ctr = thin_ctr, |
| 4311 | .dtr = thin_dtr, | 4341 | .dtr = thin_dtr, |
diff --git a/drivers/md/dm.c b/drivers/md/dm.c index f331d888e7f5..ab37ae114e94 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c | |||
| @@ -1067,13 +1067,10 @@ static void rq_end_stats(struct mapped_device *md, struct request *orig) | |||
| 1067 | */ | 1067 | */ |
| 1068 | static void rq_completed(struct mapped_device *md, int rw, bool run_queue) | 1068 | static void rq_completed(struct mapped_device *md, int rw, bool run_queue) |
| 1069 | { | 1069 | { |
| 1070 | int nr_requests_pending; | ||
| 1071 | |||
| 1072 | atomic_dec(&md->pending[rw]); | 1070 | atomic_dec(&md->pending[rw]); |
| 1073 | 1071 | ||
| 1074 | /* nudge anyone waiting on suspend queue */ | 1072 | /* nudge anyone waiting on suspend queue */ |
| 1075 | nr_requests_pending = md_in_flight(md); | 1073 | if (!md_in_flight(md)) |
| 1076 | if (!nr_requests_pending) | ||
| 1077 | wake_up(&md->wait); | 1074 | wake_up(&md->wait); |
| 1078 | 1075 | ||
| 1079 | /* | 1076 | /* |
| @@ -1085,8 +1082,7 @@ static void rq_completed(struct mapped_device *md, int rw, bool run_queue) | |||
| 1085 | if (run_queue) { | 1082 | if (run_queue) { |
| 1086 | if (md->queue->mq_ops) | 1083 | if (md->queue->mq_ops) |
| 1087 | blk_mq_run_hw_queues(md->queue, true); | 1084 | blk_mq_run_hw_queues(md->queue, true); |
| 1088 | else if (!nr_requests_pending || | 1085 | else |
| 1089 | (nr_requests_pending >= md->queue->nr_congestion_on)) | ||
| 1090 | blk_run_queue_async(md->queue); | 1086 | blk_run_queue_async(md->queue); |
| 1091 | } | 1087 | } |
| 1092 | 1088 | ||
| @@ -2281,8 +2277,6 @@ static void dm_init_old_md_queue(struct mapped_device *md) | |||
| 2281 | 2277 | ||
| 2282 | static void cleanup_mapped_device(struct mapped_device *md) | 2278 | static void cleanup_mapped_device(struct mapped_device *md) |
| 2283 | { | 2279 | { |
| 2284 | cleanup_srcu_struct(&md->io_barrier); | ||
| 2285 | |||
| 2286 | if (md->wq) | 2280 | if (md->wq) |
| 2287 | destroy_workqueue(md->wq); | 2281 | destroy_workqueue(md->wq); |
| 2288 | if (md->kworker_task) | 2282 | if (md->kworker_task) |
| @@ -2294,6 +2288,8 @@ static void cleanup_mapped_device(struct mapped_device *md) | |||
| 2294 | if (md->bs) | 2288 | if (md->bs) |
| 2295 | bioset_free(md->bs); | 2289 | bioset_free(md->bs); |
| 2296 | 2290 | ||
| 2291 | cleanup_srcu_struct(&md->io_barrier); | ||
| 2292 | |||
| 2297 | if (md->disk) { | 2293 | if (md->disk) { |
| 2298 | spin_lock(&_minor_lock); | 2294 | spin_lock(&_minor_lock); |
| 2299 | md->disk->private_data = NULL; | 2295 | md->disk->private_data = NULL; |
diff --git a/drivers/md/persistent-data/dm-btree-remove.c b/drivers/md/persistent-data/dm-btree-remove.c index e04cfd2d60ef..9836c0ae897c 100644 --- a/drivers/md/persistent-data/dm-btree-remove.c +++ b/drivers/md/persistent-data/dm-btree-remove.c | |||
| @@ -309,8 +309,8 @@ static void redistribute3(struct dm_btree_info *info, struct btree_node *parent, | |||
| 309 | 309 | ||
| 310 | if (s < 0 && nr_center < -s) { | 310 | if (s < 0 && nr_center < -s) { |
| 311 | /* not enough in central node */ | 311 | /* not enough in central node */ |
| 312 | shift(left, center, nr_center); | 312 | shift(left, center, -nr_center); |
| 313 | s = nr_center - target; | 313 | s += nr_center; |
| 314 | shift(left, right, s); | 314 | shift(left, right, s); |
| 315 | nr_right += s; | 315 | nr_right += s; |
| 316 | } else | 316 | } else |
| @@ -323,7 +323,7 @@ static void redistribute3(struct dm_btree_info *info, struct btree_node *parent, | |||
| 323 | if (s > 0 && nr_center < s) { | 323 | if (s > 0 && nr_center < s) { |
| 324 | /* not enough in central node */ | 324 | /* not enough in central node */ |
| 325 | shift(center, right, nr_center); | 325 | shift(center, right, nr_center); |
| 326 | s = target - nr_center; | 326 | s -= nr_center; |
| 327 | shift(left, right, s); | 327 | shift(left, right, s); |
| 328 | nr_left -= s; | 328 | nr_left -= s; |
| 329 | } else | 329 | } else |
diff --git a/drivers/md/persistent-data/dm-btree.c b/drivers/md/persistent-data/dm-btree.c index 200ac12a1d40..fdd3793e22f9 100644 --- a/drivers/md/persistent-data/dm-btree.c +++ b/drivers/md/persistent-data/dm-btree.c | |||
| @@ -255,7 +255,7 @@ int dm_btree_del(struct dm_btree_info *info, dm_block_t root) | |||
| 255 | int r; | 255 | int r; |
| 256 | struct del_stack *s; | 256 | struct del_stack *s; |
| 257 | 257 | ||
| 258 | s = kmalloc(sizeof(*s), GFP_KERNEL); | 258 | s = kmalloc(sizeof(*s), GFP_NOIO); |
| 259 | if (!s) | 259 | if (!s) |
| 260 | return -ENOMEM; | 260 | return -ENOMEM; |
| 261 | s->info = info; | 261 | s->info = info; |
diff --git a/drivers/mfd/stmpe-i2c.c b/drivers/mfd/stmpe-i2c.c index 5c054031c3f8..e14c8c9d189b 100644 --- a/drivers/mfd/stmpe-i2c.c +++ b/drivers/mfd/stmpe-i2c.c | |||
| @@ -6,7 +6,7 @@ | |||
| 6 | * | 6 | * |
| 7 | * License Terms: GNU General Public License, version 2 | 7 | * License Terms: GNU General Public License, version 2 |
| 8 | * Author: Rabin Vincent <rabin.vincent@stericsson.com> for ST-Ericsson | 8 | * Author: Rabin Vincent <rabin.vincent@stericsson.com> for ST-Ericsson |
| 9 | * Author: Viresh Kumar <viresh.linux@gmail.com> for ST Microelectronics | 9 | * Author: Viresh Kumar <vireshk@kernel.org> for ST Microelectronics |
| 10 | */ | 10 | */ |
| 11 | 11 | ||
| 12 | #include <linux/i2c.h> | 12 | #include <linux/i2c.h> |
diff --git a/drivers/mfd/stmpe-spi.c b/drivers/mfd/stmpe-spi.c index a81badbaa917..6fdb30e84a2b 100644 --- a/drivers/mfd/stmpe-spi.c +++ b/drivers/mfd/stmpe-spi.c | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * Copyright (C) ST Microelectronics SA 2011 | 4 | * Copyright (C) ST Microelectronics SA 2011 |
| 5 | * | 5 | * |
| 6 | * License Terms: GNU General Public License, version 2 | 6 | * License Terms: GNU General Public License, version 2 |
| 7 | * Author: Viresh Kumar <viresh.linux@gmail.com> for ST Microelectronics | 7 | * Author: Viresh Kumar <vireshk@kernel.org> for ST Microelectronics |
| 8 | */ | 8 | */ |
| 9 | 9 | ||
| 10 | #include <linux/spi/spi.h> | 10 | #include <linux/spi/spi.h> |
| @@ -146,4 +146,4 @@ module_exit(stmpe_exit); | |||
| 146 | 146 | ||
| 147 | MODULE_LICENSE("GPL v2"); | 147 | MODULE_LICENSE("GPL v2"); |
| 148 | MODULE_DESCRIPTION("STMPE MFD SPI Interface Driver"); | 148 | MODULE_DESCRIPTION("STMPE MFD SPI Interface Driver"); |
| 149 | MODULE_AUTHOR("Viresh Kumar <viresh.linux@gmail.com>"); | 149 | MODULE_AUTHOR("Viresh Kumar <vireshk@kernel.org>"); |
diff --git a/drivers/mmc/host/sdhci-spear.c b/drivers/mmc/host/sdhci-spear.c index df088343d60f..255a896769b8 100644 --- a/drivers/mmc/host/sdhci-spear.c +++ b/drivers/mmc/host/sdhci-spear.c | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * Support of SDHCI platform devices for spear soc family | 4 | * Support of SDHCI platform devices for spear soc family |
| 5 | * | 5 | * |
| 6 | * Copyright (C) 2010 ST Microelectronics | 6 | * Copyright (C) 2010 ST Microelectronics |
| 7 | * Viresh Kumar <viresh.linux@gmail.com> | 7 | * Viresh Kumar <vireshk@kernel.org> |
| 8 | * | 8 | * |
| 9 | * Inspired by sdhci-pltfm.c | 9 | * Inspired by sdhci-pltfm.c |
| 10 | * | 10 | * |
| @@ -211,5 +211,5 @@ static struct platform_driver sdhci_driver = { | |||
| 211 | module_platform_driver(sdhci_driver); | 211 | module_platform_driver(sdhci_driver); |
| 212 | 212 | ||
| 213 | MODULE_DESCRIPTION("SPEAr Secure Digital Host Controller Interface driver"); | 213 | MODULE_DESCRIPTION("SPEAr Secure Digital Host Controller Interface driver"); |
| 214 | MODULE_AUTHOR("Viresh Kumar <viresh.linux@gmail.com>"); | 214 | MODULE_AUTHOR("Viresh Kumar <vireshk@kernel.org>"); |
| 215 | MODULE_LICENSE("GPL v2"); | 215 | MODULE_LICENSE("GPL v2"); |
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 19eb990d398c..317a49480475 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
| @@ -689,40 +689,57 @@ out: | |||
| 689 | 689 | ||
| 690 | } | 690 | } |
| 691 | 691 | ||
| 692 | static bool bond_should_change_active(struct bonding *bond) | 692 | static struct slave *bond_choose_primary_or_current(struct bonding *bond) |
| 693 | { | 693 | { |
| 694 | struct slave *prim = rtnl_dereference(bond->primary_slave); | 694 | struct slave *prim = rtnl_dereference(bond->primary_slave); |
| 695 | struct slave *curr = rtnl_dereference(bond->curr_active_slave); | 695 | struct slave *curr = rtnl_dereference(bond->curr_active_slave); |
| 696 | 696 | ||
| 697 | if (!prim || !curr || curr->link != BOND_LINK_UP) | 697 | if (!prim || prim->link != BOND_LINK_UP) { |
| 698 | return true; | 698 | if (!curr || curr->link != BOND_LINK_UP) |
| 699 | return NULL; | ||
| 700 | return curr; | ||
| 701 | } | ||
| 702 | |||
| 699 | if (bond->force_primary) { | 703 | if (bond->force_primary) { |
| 700 | bond->force_primary = false; | 704 | bond->force_primary = false; |
| 701 | return true; | 705 | return prim; |
| 706 | } | ||
| 707 | |||
| 708 | if (!curr || curr->link != BOND_LINK_UP) | ||
| 709 | return prim; | ||
| 710 | |||
| 711 | /* At this point, prim and curr are both up */ | ||
| 712 | switch (bond->params.primary_reselect) { | ||
| 713 | case BOND_PRI_RESELECT_ALWAYS: | ||
| 714 | return prim; | ||
| 715 | case BOND_PRI_RESELECT_BETTER: | ||
| 716 | if (prim->speed < curr->speed) | ||
| 717 | return curr; | ||
| 718 | if (prim->speed == curr->speed && prim->duplex <= curr->duplex) | ||
| 719 | return curr; | ||
| 720 | return prim; | ||
| 721 | case BOND_PRI_RESELECT_FAILURE: | ||
| 722 | return curr; | ||
| 723 | default: | ||
| 724 | netdev_err(bond->dev, "impossible primary_reselect %d\n", | ||
| 725 | bond->params.primary_reselect); | ||
| 726 | return curr; | ||
| 702 | } | 727 | } |
| 703 | if (bond->params.primary_reselect == BOND_PRI_RESELECT_BETTER && | ||
| 704 | (prim->speed < curr->speed || | ||
| 705 | (prim->speed == curr->speed && prim->duplex <= curr->duplex))) | ||
| 706 | return false; | ||
| 707 | if (bond->params.primary_reselect == BOND_PRI_RESELECT_FAILURE) | ||
| 708 | return false; | ||
| 709 | return true; | ||
| 710 | } | 728 | } |
| 711 | 729 | ||
| 712 | /** | 730 | /** |
| 713 | * find_best_interface - select the best available slave to be the active one | 731 | * bond_find_best_slave - select the best available slave to be the active one |
| 714 | * @bond: our bonding struct | 732 | * @bond: our bonding struct |
| 715 | */ | 733 | */ |
| 716 | static struct slave *bond_find_best_slave(struct bonding *bond) | 734 | static struct slave *bond_find_best_slave(struct bonding *bond) |
| 717 | { | 735 | { |
| 718 | struct slave *slave, *bestslave = NULL, *primary; | 736 | struct slave *slave, *bestslave = NULL; |
| 719 | struct list_head *iter; | 737 | struct list_head *iter; |
| 720 | int mintime = bond->params.updelay; | 738 | int mintime = bond->params.updelay; |
| 721 | 739 | ||
| 722 | primary = rtnl_dereference(bond->primary_slave); | 740 | slave = bond_choose_primary_or_current(bond); |
| 723 | if (primary && primary->link == BOND_LINK_UP && | 741 | if (slave) |
| 724 | bond_should_change_active(bond)) | 742 | return slave; |
| 725 | return primary; | ||
| 726 | 743 | ||
| 727 | bond_for_each_slave(bond, slave, iter) { | 744 | bond_for_each_slave(bond, slave, iter) { |
| 728 | if (slave->link == BOND_LINK_UP) | 745 | if (slave->link == BOND_LINK_UP) |
diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c index 041525d2595c..5d214d135332 100644 --- a/drivers/net/can/c_can/c_can.c +++ b/drivers/net/can/c_can/c_can.c | |||
| @@ -592,6 +592,7 @@ static int c_can_start(struct net_device *dev) | |||
| 592 | { | 592 | { |
| 593 | struct c_can_priv *priv = netdev_priv(dev); | 593 | struct c_can_priv *priv = netdev_priv(dev); |
| 594 | int err; | 594 | int err; |
| 595 | struct pinctrl *p; | ||
| 595 | 596 | ||
| 596 | /* basic c_can configuration */ | 597 | /* basic c_can configuration */ |
| 597 | err = c_can_chip_config(dev); | 598 | err = c_can_chip_config(dev); |
| @@ -604,8 +605,13 @@ static int c_can_start(struct net_device *dev) | |||
| 604 | 605 | ||
| 605 | priv->can.state = CAN_STATE_ERROR_ACTIVE; | 606 | priv->can.state = CAN_STATE_ERROR_ACTIVE; |
| 606 | 607 | ||
| 607 | /* activate pins */ | 608 | /* Attempt to use "active" if available else use "default" */ |
| 608 | pinctrl_pm_select_default_state(dev->dev.parent); | 609 | p = pinctrl_get_select(priv->device, "active"); |
| 610 | if (!IS_ERR(p)) | ||
| 611 | pinctrl_put(p); | ||
| 612 | else | ||
| 613 | pinctrl_pm_select_default_state(priv->device); | ||
| 614 | |||
| 609 | return 0; | 615 | return 0; |
| 610 | } | 616 | } |
| 611 | 617 | ||
diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c index e9b1810d319f..aede704605c6 100644 --- a/drivers/net/can/dev.c +++ b/drivers/net/can/dev.c | |||
| @@ -440,9 +440,6 @@ unsigned int can_get_echo_skb(struct net_device *dev, unsigned int idx) | |||
| 440 | struct can_frame *cf = (struct can_frame *)skb->data; | 440 | struct can_frame *cf = (struct can_frame *)skb->data; |
| 441 | u8 dlc = cf->can_dlc; | 441 | u8 dlc = cf->can_dlc; |
| 442 | 442 | ||
| 443 | if (!(skb->tstamp.tv64)) | ||
| 444 | __net_timestamp(skb); | ||
| 445 | |||
| 446 | netif_rx(priv->echo_skb[idx]); | 443 | netif_rx(priv->echo_skb[idx]); |
| 447 | priv->echo_skb[idx] = NULL; | 444 | priv->echo_skb[idx] = NULL; |
| 448 | 445 | ||
| @@ -578,7 +575,6 @@ struct sk_buff *alloc_can_skb(struct net_device *dev, struct can_frame **cf) | |||
| 578 | if (unlikely(!skb)) | 575 | if (unlikely(!skb)) |
| 579 | return NULL; | 576 | return NULL; |
| 580 | 577 | ||
| 581 | __net_timestamp(skb); | ||
| 582 | skb->protocol = htons(ETH_P_CAN); | 578 | skb->protocol = htons(ETH_P_CAN); |
| 583 | skb->pkt_type = PACKET_BROADCAST; | 579 | skb->pkt_type = PACKET_BROADCAST; |
| 584 | skb->ip_summed = CHECKSUM_UNNECESSARY; | 580 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
| @@ -589,6 +585,7 @@ struct sk_buff *alloc_can_skb(struct net_device *dev, struct can_frame **cf) | |||
| 589 | 585 | ||
| 590 | can_skb_reserve(skb); | 586 | can_skb_reserve(skb); |
| 591 | can_skb_prv(skb)->ifindex = dev->ifindex; | 587 | can_skb_prv(skb)->ifindex = dev->ifindex; |
| 588 | can_skb_prv(skb)->skbcnt = 0; | ||
| 592 | 589 | ||
| 593 | *cf = (struct can_frame *)skb_put(skb, sizeof(struct can_frame)); | 590 | *cf = (struct can_frame *)skb_put(skb, sizeof(struct can_frame)); |
| 594 | memset(*cf, 0, sizeof(struct can_frame)); | 591 | memset(*cf, 0, sizeof(struct can_frame)); |
| @@ -607,7 +604,6 @@ struct sk_buff *alloc_canfd_skb(struct net_device *dev, | |||
| 607 | if (unlikely(!skb)) | 604 | if (unlikely(!skb)) |
| 608 | return NULL; | 605 | return NULL; |
| 609 | 606 | ||
| 610 | __net_timestamp(skb); | ||
| 611 | skb->protocol = htons(ETH_P_CANFD); | 607 | skb->protocol = htons(ETH_P_CANFD); |
| 612 | skb->pkt_type = PACKET_BROADCAST; | 608 | skb->pkt_type = PACKET_BROADCAST; |
| 613 | skb->ip_summed = CHECKSUM_UNNECESSARY; | 609 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
| @@ -618,6 +614,7 @@ struct sk_buff *alloc_canfd_skb(struct net_device *dev, | |||
| 618 | 614 | ||
| 619 | can_skb_reserve(skb); | 615 | can_skb_reserve(skb); |
| 620 | can_skb_prv(skb)->ifindex = dev->ifindex; | 616 | can_skb_prv(skb)->ifindex = dev->ifindex; |
| 617 | can_skb_prv(skb)->skbcnt = 0; | ||
| 621 | 618 | ||
| 622 | *cfd = (struct canfd_frame *)skb_put(skb, sizeof(struct canfd_frame)); | 619 | *cfd = (struct canfd_frame *)skb_put(skb, sizeof(struct canfd_frame)); |
| 623 | memset(*cfd, 0, sizeof(struct canfd_frame)); | 620 | memset(*cfd, 0, sizeof(struct canfd_frame)); |
diff --git a/drivers/net/can/rcar_can.c b/drivers/net/can/rcar_can.c index 7deb80dcbe8c..7bd54191f962 100644 --- a/drivers/net/can/rcar_can.c +++ b/drivers/net/can/rcar_can.c | |||
| @@ -508,7 +508,8 @@ static int rcar_can_open(struct net_device *ndev) | |||
| 508 | 508 | ||
| 509 | err = clk_prepare_enable(priv->clk); | 509 | err = clk_prepare_enable(priv->clk); |
| 510 | if (err) { | 510 | if (err) { |
| 511 | netdev_err(ndev, "failed to enable periperal clock, error %d\n", | 511 | netdev_err(ndev, |
| 512 | "failed to enable peripheral clock, error %d\n", | ||
| 512 | err); | 513 | err); |
| 513 | goto out; | 514 | goto out; |
| 514 | } | 515 | } |
| @@ -526,7 +527,8 @@ static int rcar_can_open(struct net_device *ndev) | |||
| 526 | napi_enable(&priv->napi); | 527 | napi_enable(&priv->napi); |
| 527 | err = request_irq(ndev->irq, rcar_can_interrupt, 0, ndev->name, ndev); | 528 | err = request_irq(ndev->irq, rcar_can_interrupt, 0, ndev->name, ndev); |
| 528 | if (err) { | 529 | if (err) { |
| 529 | netdev_err(ndev, "error requesting interrupt %x\n", ndev->irq); | 530 | netdev_err(ndev, "request_irq(%d) failed, error %d\n", |
| 531 | ndev->irq, err); | ||
| 530 | goto out_close; | 532 | goto out_close; |
| 531 | } | 533 | } |
| 532 | can_led_event(ndev, CAN_LED_EVENT_OPEN); | 534 | can_led_event(ndev, CAN_LED_EVENT_OPEN); |
| @@ -758,8 +760,9 @@ static int rcar_can_probe(struct platform_device *pdev) | |||
| 758 | } | 760 | } |
| 759 | 761 | ||
| 760 | irq = platform_get_irq(pdev, 0); | 762 | irq = platform_get_irq(pdev, 0); |
| 761 | if (!irq) { | 763 | if (irq < 0) { |
| 762 | dev_err(&pdev->dev, "No IRQ resource\n"); | 764 | dev_err(&pdev->dev, "No IRQ resource\n"); |
| 765 | err = irq; | ||
| 763 | goto fail; | 766 | goto fail; |
| 764 | } | 767 | } |
| 765 | 768 | ||
| @@ -782,7 +785,8 @@ static int rcar_can_probe(struct platform_device *pdev) | |||
| 782 | priv->clk = devm_clk_get(&pdev->dev, "clkp1"); | 785 | priv->clk = devm_clk_get(&pdev->dev, "clkp1"); |
| 783 | if (IS_ERR(priv->clk)) { | 786 | if (IS_ERR(priv->clk)) { |
| 784 | err = PTR_ERR(priv->clk); | 787 | err = PTR_ERR(priv->clk); |
| 785 | dev_err(&pdev->dev, "cannot get peripheral clock: %d\n", err); | 788 | dev_err(&pdev->dev, "cannot get peripheral clock, error %d\n", |
| 789 | err); | ||
| 786 | goto fail_clk; | 790 | goto fail_clk; |
| 787 | } | 791 | } |
| 788 | 792 | ||
| @@ -794,7 +798,7 @@ static int rcar_can_probe(struct platform_device *pdev) | |||
| 794 | priv->can_clk = devm_clk_get(&pdev->dev, clock_names[clock_select]); | 798 | priv->can_clk = devm_clk_get(&pdev->dev, clock_names[clock_select]); |
| 795 | if (IS_ERR(priv->can_clk)) { | 799 | if (IS_ERR(priv->can_clk)) { |
| 796 | err = PTR_ERR(priv->can_clk); | 800 | err = PTR_ERR(priv->can_clk); |
| 797 | dev_err(&pdev->dev, "cannot get CAN clock: %d\n", err); | 801 | dev_err(&pdev->dev, "cannot get CAN clock, error %d\n", err); |
| 798 | goto fail_clk; | 802 | goto fail_clk; |
| 799 | } | 803 | } |
| 800 | 804 | ||
| @@ -823,7 +827,7 @@ static int rcar_can_probe(struct platform_device *pdev) | |||
| 823 | 827 | ||
| 824 | devm_can_led_init(ndev); | 828 | devm_can_led_init(ndev); |
| 825 | 829 | ||
| 826 | dev_info(&pdev->dev, "device registered (reg_base=%p, irq=%u)\n", | 830 | dev_info(&pdev->dev, "device registered (regs @ %p, IRQ%d)\n", |
| 827 | priv->regs, ndev->irq); | 831 | priv->regs, ndev->irq); |
| 828 | 832 | ||
| 829 | return 0; | 833 | return 0; |
diff --git a/drivers/net/can/slcan.c b/drivers/net/can/slcan.c index f64f5290d6f8..a23a7af8eb9a 100644 --- a/drivers/net/can/slcan.c +++ b/drivers/net/can/slcan.c | |||
| @@ -207,7 +207,6 @@ static void slc_bump(struct slcan *sl) | |||
| 207 | if (!skb) | 207 | if (!skb) |
| 208 | return; | 208 | return; |
| 209 | 209 | ||
| 210 | __net_timestamp(skb); | ||
| 211 | skb->dev = sl->dev; | 210 | skb->dev = sl->dev; |
| 212 | skb->protocol = htons(ETH_P_CAN); | 211 | skb->protocol = htons(ETH_P_CAN); |
| 213 | skb->pkt_type = PACKET_BROADCAST; | 212 | skb->pkt_type = PACKET_BROADCAST; |
| @@ -215,6 +214,7 @@ static void slc_bump(struct slcan *sl) | |||
| 215 | 214 | ||
| 216 | can_skb_reserve(skb); | 215 | can_skb_reserve(skb); |
| 217 | can_skb_prv(skb)->ifindex = sl->dev->ifindex; | 216 | can_skb_prv(skb)->ifindex = sl->dev->ifindex; |
| 217 | can_skb_prv(skb)->skbcnt = 0; | ||
| 218 | 218 | ||
| 219 | memcpy(skb_put(skb, sizeof(struct can_frame)), | 219 | memcpy(skb_put(skb, sizeof(struct can_frame)), |
| 220 | &cf, sizeof(struct can_frame)); | 220 | &cf, sizeof(struct can_frame)); |
diff --git a/drivers/net/can/vcan.c b/drivers/net/can/vcan.c index 0ce868de855d..674f367087c5 100644 --- a/drivers/net/can/vcan.c +++ b/drivers/net/can/vcan.c | |||
| @@ -78,9 +78,6 @@ static void vcan_rx(struct sk_buff *skb, struct net_device *dev) | |||
| 78 | skb->dev = dev; | 78 | skb->dev = dev; |
| 79 | skb->ip_summed = CHECKSUM_UNNECESSARY; | 79 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
| 80 | 80 | ||
| 81 | if (!(skb->tstamp.tv64)) | ||
| 82 | __net_timestamp(skb); | ||
| 83 | |||
| 84 | netif_rx_ni(skb); | 81 | netif_rx_ni(skb); |
| 85 | } | 82 | } |
| 86 | 83 | ||
diff --git a/drivers/net/ethernet/3com/3c59x.c b/drivers/net/ethernet/3com/3c59x.c index 41095ebad97f..2d1ce3c5d0dd 100644 --- a/drivers/net/ethernet/3com/3c59x.c +++ b/drivers/net/ethernet/3com/3c59x.c | |||
| @@ -2382,6 +2382,7 @@ boomerang_interrupt(int irq, void *dev_id) | |||
| 2382 | void __iomem *ioaddr; | 2382 | void __iomem *ioaddr; |
| 2383 | int status; | 2383 | int status; |
| 2384 | int work_done = max_interrupt_work; | 2384 | int work_done = max_interrupt_work; |
| 2385 | int handled = 0; | ||
| 2385 | 2386 | ||
| 2386 | ioaddr = vp->ioaddr; | 2387 | ioaddr = vp->ioaddr; |
| 2387 | 2388 | ||
| @@ -2400,6 +2401,7 @@ boomerang_interrupt(int irq, void *dev_id) | |||
| 2400 | 2401 | ||
| 2401 | if ((status & IntLatch) == 0) | 2402 | if ((status & IntLatch) == 0) |
| 2402 | goto handler_exit; /* No interrupt: shared IRQs can cause this */ | 2403 | goto handler_exit; /* No interrupt: shared IRQs can cause this */ |
| 2404 | handled = 1; | ||
| 2403 | 2405 | ||
| 2404 | if (status == 0xffff) { /* h/w no longer present (hotplug)? */ | 2406 | if (status == 0xffff) { /* h/w no longer present (hotplug)? */ |
| 2405 | if (vortex_debug > 1) | 2407 | if (vortex_debug > 1) |
| @@ -2501,7 +2503,7 @@ boomerang_interrupt(int irq, void *dev_id) | |||
| 2501 | handler_exit: | 2503 | handler_exit: |
| 2502 | vp->handling_irq = 0; | 2504 | vp->handling_irq = 0; |
| 2503 | spin_unlock(&vp->lock); | 2505 | spin_unlock(&vp->lock); |
| 2504 | return IRQ_HANDLED; | 2506 | return IRQ_RETVAL(handled); |
| 2505 | } | 2507 | } |
| 2506 | 2508 | ||
| 2507 | static int vortex_rx(struct net_device *dev) | 2509 | static int vortex_rx(struct net_device *dev) |
diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-desc.c b/drivers/net/ethernet/amd/xgbe/xgbe-desc.c index 661cdaa7ea96..b3bc87fe3764 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-desc.c +++ b/drivers/net/ethernet/amd/xgbe/xgbe-desc.c | |||
| @@ -303,7 +303,8 @@ static void xgbe_set_buffer_data(struct xgbe_buffer_data *bd, | |||
| 303 | get_page(pa->pages); | 303 | get_page(pa->pages); |
| 304 | bd->pa = *pa; | 304 | bd->pa = *pa; |
| 305 | 305 | ||
| 306 | bd->dma = pa->pages_dma + pa->pages_offset; | 306 | bd->dma_base = pa->pages_dma; |
| 307 | bd->dma_off = pa->pages_offset; | ||
| 307 | bd->dma_len = len; | 308 | bd->dma_len = len; |
| 308 | 309 | ||
| 309 | pa->pages_offset += len; | 310 | pa->pages_offset += len; |
diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-dev.c b/drivers/net/ethernet/amd/xgbe/xgbe-dev.c index 506e832c9e9a..a4473d8ff4fa 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-dev.c +++ b/drivers/net/ethernet/amd/xgbe/xgbe-dev.c | |||
| @@ -1110,6 +1110,7 @@ static void xgbe_rx_desc_reset(struct xgbe_prv_data *pdata, | |||
| 1110 | unsigned int rx_usecs = pdata->rx_usecs; | 1110 | unsigned int rx_usecs = pdata->rx_usecs; |
| 1111 | unsigned int rx_frames = pdata->rx_frames; | 1111 | unsigned int rx_frames = pdata->rx_frames; |
| 1112 | unsigned int inte; | 1112 | unsigned int inte; |
| 1113 | dma_addr_t hdr_dma, buf_dma; | ||
| 1113 | 1114 | ||
| 1114 | if (!rx_usecs && !rx_frames) { | 1115 | if (!rx_usecs && !rx_frames) { |
| 1115 | /* No coalescing, interrupt for every descriptor */ | 1116 | /* No coalescing, interrupt for every descriptor */ |
| @@ -1129,10 +1130,12 @@ static void xgbe_rx_desc_reset(struct xgbe_prv_data *pdata, | |||
| 1129 | * Set buffer 2 (hi) address to buffer dma address (hi) and | 1130 | * Set buffer 2 (hi) address to buffer dma address (hi) and |
| 1130 | * set control bits OWN and INTE | 1131 | * set control bits OWN and INTE |
| 1131 | */ | 1132 | */ |
| 1132 | rdesc->desc0 = cpu_to_le32(lower_32_bits(rdata->rx.hdr.dma)); | 1133 | hdr_dma = rdata->rx.hdr.dma_base + rdata->rx.hdr.dma_off; |
| 1133 | rdesc->desc1 = cpu_to_le32(upper_32_bits(rdata->rx.hdr.dma)); | 1134 | buf_dma = rdata->rx.buf.dma_base + rdata->rx.buf.dma_off; |
| 1134 | rdesc->desc2 = cpu_to_le32(lower_32_bits(rdata->rx.buf.dma)); | 1135 | rdesc->desc0 = cpu_to_le32(lower_32_bits(hdr_dma)); |
| 1135 | rdesc->desc3 = cpu_to_le32(upper_32_bits(rdata->rx.buf.dma)); | 1136 | rdesc->desc1 = cpu_to_le32(upper_32_bits(hdr_dma)); |
| 1137 | rdesc->desc2 = cpu_to_le32(lower_32_bits(buf_dma)); | ||
| 1138 | rdesc->desc3 = cpu_to_le32(upper_32_bits(buf_dma)); | ||
| 1136 | 1139 | ||
| 1137 | XGMAC_SET_BITS_LE(rdesc->desc3, RX_NORMAL_DESC3, INTE, inte); | 1140 | XGMAC_SET_BITS_LE(rdesc->desc3, RX_NORMAL_DESC3, INTE, inte); |
| 1138 | 1141 | ||
diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c index 1e9c28d19ef8..aae9d5ecd182 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c +++ b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c | |||
| @@ -1765,8 +1765,9 @@ static struct sk_buff *xgbe_create_skb(struct xgbe_prv_data *pdata, | |||
| 1765 | /* Start with the header buffer which may contain just the header | 1765 | /* Start with the header buffer which may contain just the header |
| 1766 | * or the header plus data | 1766 | * or the header plus data |
| 1767 | */ | 1767 | */ |
| 1768 | dma_sync_single_for_cpu(pdata->dev, rdata->rx.hdr.dma, | 1768 | dma_sync_single_range_for_cpu(pdata->dev, rdata->rx.hdr.dma_base, |
| 1769 | rdata->rx.hdr.dma_len, DMA_FROM_DEVICE); | 1769 | rdata->rx.hdr.dma_off, |
| 1770 | rdata->rx.hdr.dma_len, DMA_FROM_DEVICE); | ||
| 1770 | 1771 | ||
| 1771 | packet = page_address(rdata->rx.hdr.pa.pages) + | 1772 | packet = page_address(rdata->rx.hdr.pa.pages) + |
| 1772 | rdata->rx.hdr.pa.pages_offset; | 1773 | rdata->rx.hdr.pa.pages_offset; |
| @@ -1778,8 +1779,11 @@ static struct sk_buff *xgbe_create_skb(struct xgbe_prv_data *pdata, | |||
| 1778 | len -= copy_len; | 1779 | len -= copy_len; |
| 1779 | if (len) { | 1780 | if (len) { |
| 1780 | /* Add the remaining data as a frag */ | 1781 | /* Add the remaining data as a frag */ |
| 1781 | dma_sync_single_for_cpu(pdata->dev, rdata->rx.buf.dma, | 1782 | dma_sync_single_range_for_cpu(pdata->dev, |
| 1782 | rdata->rx.buf.dma_len, DMA_FROM_DEVICE); | 1783 | rdata->rx.buf.dma_base, |
| 1784 | rdata->rx.buf.dma_off, | ||
| 1785 | rdata->rx.buf.dma_len, | ||
| 1786 | DMA_FROM_DEVICE); | ||
| 1783 | 1787 | ||
| 1784 | skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, | 1788 | skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, |
| 1785 | rdata->rx.buf.pa.pages, | 1789 | rdata->rx.buf.pa.pages, |
| @@ -1945,8 +1949,9 @@ read_again: | |||
| 1945 | if (!skb) | 1949 | if (!skb) |
| 1946 | error = 1; | 1950 | error = 1; |
| 1947 | } else if (rdesc_len) { | 1951 | } else if (rdesc_len) { |
| 1948 | dma_sync_single_for_cpu(pdata->dev, | 1952 | dma_sync_single_range_for_cpu(pdata->dev, |
| 1949 | rdata->rx.buf.dma, | 1953 | rdata->rx.buf.dma_base, |
| 1954 | rdata->rx.buf.dma_off, | ||
| 1950 | rdata->rx.buf.dma_len, | 1955 | rdata->rx.buf.dma_len, |
| 1951 | DMA_FROM_DEVICE); | 1956 | DMA_FROM_DEVICE); |
| 1952 | 1957 | ||
diff --git a/drivers/net/ethernet/amd/xgbe/xgbe.h b/drivers/net/ethernet/amd/xgbe/xgbe.h index 63d72a140053..717ce21b6077 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe.h +++ b/drivers/net/ethernet/amd/xgbe/xgbe.h | |||
| @@ -337,7 +337,8 @@ struct xgbe_buffer_data { | |||
| 337 | struct xgbe_page_alloc pa; | 337 | struct xgbe_page_alloc pa; |
| 338 | struct xgbe_page_alloc pa_unmap; | 338 | struct xgbe_page_alloc pa_unmap; |
| 339 | 339 | ||
| 340 | dma_addr_t dma; | 340 | dma_addr_t dma_base; |
| 341 | unsigned long dma_off; | ||
| 341 | unsigned int dma_len; | 342 | unsigned int dma_len; |
| 342 | }; | 343 | }; |
| 343 | 344 | ||
diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c index 909ad7a0d480..4566cdf0bc39 100644 --- a/drivers/net/ethernet/broadcom/bcmsysport.c +++ b/drivers/net/ethernet/broadcom/bcmsysport.c | |||
| @@ -1793,7 +1793,7 @@ static int bcm_sysport_probe(struct platform_device *pdev) | |||
| 1793 | macaddr = of_get_mac_address(dn); | 1793 | macaddr = of_get_mac_address(dn); |
| 1794 | if (!macaddr || !is_valid_ether_addr(macaddr)) { | 1794 | if (!macaddr || !is_valid_ether_addr(macaddr)) { |
| 1795 | dev_warn(&pdev->dev, "using random Ethernet MAC\n"); | 1795 | dev_warn(&pdev->dev, "using random Ethernet MAC\n"); |
| 1796 | random_ether_addr(dev->dev_addr); | 1796 | eth_hw_addr_random(dev); |
| 1797 | } else { | 1797 | } else { |
| 1798 | ether_addr_copy(dev->dev_addr, macaddr); | 1798 | ether_addr_copy(dev->dev_addr, macaddr); |
| 1799 | } | 1799 | } |
diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c index b43b2cb9b830..64c1e9db6b0b 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c | |||
| @@ -1230,7 +1230,6 @@ static struct sk_buff *bcmgenet_put_tx_csum(struct net_device *dev, | |||
| 1230 | new_skb = skb_realloc_headroom(skb, sizeof(*status)); | 1230 | new_skb = skb_realloc_headroom(skb, sizeof(*status)); |
| 1231 | dev_kfree_skb(skb); | 1231 | dev_kfree_skb(skb); |
| 1232 | if (!new_skb) { | 1232 | if (!new_skb) { |
| 1233 | dev->stats.tx_errors++; | ||
| 1234 | dev->stats.tx_dropped++; | 1233 | dev->stats.tx_dropped++; |
| 1235 | return NULL; | 1234 | return NULL; |
| 1236 | } | 1235 | } |
| @@ -1465,7 +1464,6 @@ static unsigned int bcmgenet_desc_rx(struct bcmgenet_rx_ring *ring, | |||
| 1465 | 1464 | ||
| 1466 | if (unlikely(!skb)) { | 1465 | if (unlikely(!skb)) { |
| 1467 | dev->stats.rx_dropped++; | 1466 | dev->stats.rx_dropped++; |
| 1468 | dev->stats.rx_errors++; | ||
| 1469 | goto next; | 1467 | goto next; |
| 1470 | } | 1468 | } |
| 1471 | 1469 | ||
| @@ -1493,7 +1491,6 @@ static unsigned int bcmgenet_desc_rx(struct bcmgenet_rx_ring *ring, | |||
| 1493 | if (unlikely(!(dma_flag & DMA_EOP) || !(dma_flag & DMA_SOP))) { | 1491 | if (unlikely(!(dma_flag & DMA_EOP) || !(dma_flag & DMA_SOP))) { |
| 1494 | netif_err(priv, rx_status, dev, | 1492 | netif_err(priv, rx_status, dev, |
| 1495 | "dropping fragmented packet!\n"); | 1493 | "dropping fragmented packet!\n"); |
| 1496 | dev->stats.rx_dropped++; | ||
| 1497 | dev->stats.rx_errors++; | 1494 | dev->stats.rx_errors++; |
| 1498 | dev_kfree_skb_any(skb); | 1495 | dev_kfree_skb_any(skb); |
| 1499 | goto next; | 1496 | goto next; |
| @@ -1515,7 +1512,6 @@ static unsigned int bcmgenet_desc_rx(struct bcmgenet_rx_ring *ring, | |||
| 1515 | dev->stats.rx_frame_errors++; | 1512 | dev->stats.rx_frame_errors++; |
| 1516 | if (dma_flag & DMA_RX_LG) | 1513 | if (dma_flag & DMA_RX_LG) |
| 1517 | dev->stats.rx_length_errors++; | 1514 | dev->stats.rx_length_errors++; |
| 1518 | dev->stats.rx_dropped++; | ||
| 1519 | dev->stats.rx_errors++; | 1515 | dev->stats.rx_errors++; |
| 1520 | dev_kfree_skb_any(skb); | 1516 | dev_kfree_skb_any(skb); |
| 1521 | goto next; | 1517 | goto next; |
diff --git a/drivers/net/ethernet/broadcom/sb1250-mac.c b/drivers/net/ethernet/broadcom/sb1250-mac.c index ac27e24264a5..f557a2aaec23 100644 --- a/drivers/net/ethernet/broadcom/sb1250-mac.c +++ b/drivers/net/ethernet/broadcom/sb1250-mac.c | |||
| @@ -1508,16 +1508,7 @@ static void sbmac_channel_start(struct sbmac_softc *s) | |||
| 1508 | __raw_writeq(reg, port); | 1508 | __raw_writeq(reg, port); |
| 1509 | port = s->sbm_base + R_MAC_ETHERNET_ADDR; | 1509 | port = s->sbm_base + R_MAC_ETHERNET_ADDR; |
| 1510 | 1510 | ||
| 1511 | #ifdef CONFIG_SB1_PASS_1_WORKAROUNDS | ||
| 1512 | /* | ||
| 1513 | * Pass1 SOCs do not receive packets addressed to the | ||
| 1514 | * destination address in the R_MAC_ETHERNET_ADDR register. | ||
| 1515 | * Set the value to zero. | ||
| 1516 | */ | ||
| 1517 | __raw_writeq(0, port); | ||
| 1518 | #else | ||
| 1519 | __raw_writeq(reg, port); | 1511 | __raw_writeq(reg, port); |
| 1520 | #endif | ||
| 1521 | 1512 | ||
| 1522 | /* | 1513 | /* |
| 1523 | * Set the receive filter for no packets, and write values | 1514 | * Set the receive filter for no packets, and write values |
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c index 484eb8c37489..a11485fbb33f 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c | |||
| @@ -952,16 +952,23 @@ static int devlog_show(struct seq_file *seq, void *v) | |||
| 952 | * eventually have to put a format interpreter in here ... | 952 | * eventually have to put a format interpreter in here ... |
| 953 | */ | 953 | */ |
| 954 | seq_printf(seq, "%10d %15llu %8s %8s ", | 954 | seq_printf(seq, "%10d %15llu %8s %8s ", |
| 955 | e->seqno, e->timestamp, | 955 | be32_to_cpu(e->seqno), |
| 956 | be64_to_cpu(e->timestamp), | ||
| 956 | (e->level < ARRAY_SIZE(devlog_level_strings) | 957 | (e->level < ARRAY_SIZE(devlog_level_strings) |
| 957 | ? devlog_level_strings[e->level] | 958 | ? devlog_level_strings[e->level] |
| 958 | : "UNKNOWN"), | 959 | : "UNKNOWN"), |
| 959 | (e->facility < ARRAY_SIZE(devlog_facility_strings) | 960 | (e->facility < ARRAY_SIZE(devlog_facility_strings) |
| 960 | ? devlog_facility_strings[e->facility] | 961 | ? devlog_facility_strings[e->facility] |
| 961 | : "UNKNOWN")); | 962 | : "UNKNOWN")); |
| 962 | seq_printf(seq, e->fmt, e->params[0], e->params[1], | 963 | seq_printf(seq, e->fmt, |
| 963 | e->params[2], e->params[3], e->params[4], | 964 | be32_to_cpu(e->params[0]), |
| 964 | e->params[5], e->params[6], e->params[7]); | 965 | be32_to_cpu(e->params[1]), |
| 966 | be32_to_cpu(e->params[2]), | ||
| 967 | be32_to_cpu(e->params[3]), | ||
| 968 | be32_to_cpu(e->params[4]), | ||
| 969 | be32_to_cpu(e->params[5]), | ||
| 970 | be32_to_cpu(e->params[6]), | ||
| 971 | be32_to_cpu(e->params[7])); | ||
| 965 | } | 972 | } |
| 966 | return 0; | 973 | return 0; |
| 967 | } | 974 | } |
| @@ -1043,23 +1050,17 @@ static int devlog_open(struct inode *inode, struct file *file) | |||
| 1043 | return ret; | 1050 | return ret; |
| 1044 | } | 1051 | } |
| 1045 | 1052 | ||
| 1046 | /* Translate log multi-byte integral elements into host native format | 1053 | /* Find the earliest (lowest Sequence Number) log entry in the |
| 1047 | * and determine where the first entry in the log is. | 1054 | * circular Device Log. |
| 1048 | */ | 1055 | */ |
| 1049 | for (fseqno = ~((u32)0), index = 0; index < dinfo->nentries; index++) { | 1056 | for (fseqno = ~((u32)0), index = 0; index < dinfo->nentries; index++) { |
| 1050 | struct fw_devlog_e *e = &dinfo->log[index]; | 1057 | struct fw_devlog_e *e = &dinfo->log[index]; |
| 1051 | int i; | ||
| 1052 | __u32 seqno; | 1058 | __u32 seqno; |
| 1053 | 1059 | ||
| 1054 | if (e->timestamp == 0) | 1060 | if (e->timestamp == 0) |
| 1055 | continue; | 1061 | continue; |
| 1056 | 1062 | ||
| 1057 | e->timestamp = (__force __be64)be64_to_cpu(e->timestamp); | ||
| 1058 | seqno = be32_to_cpu(e->seqno); | 1063 | seqno = be32_to_cpu(e->seqno); |
| 1059 | for (i = 0; i < 8; i++) | ||
| 1060 | e->params[i] = | ||
| 1061 | (__force __be32)be32_to_cpu(e->params[i]); | ||
| 1062 | |||
| 1063 | if (seqno < fseqno) { | 1064 | if (seqno < fseqno) { |
| 1064 | fseqno = seqno; | 1065 | fseqno = seqno; |
| 1065 | dinfo->first = index; | 1066 | dinfo->first = index; |
diff --git a/drivers/net/ethernet/cisco/enic/enic_main.c b/drivers/net/ethernet/cisco/enic/enic_main.c index da2004e2a741..918a8e42139b 100644 --- a/drivers/net/ethernet/cisco/enic/enic_main.c +++ b/drivers/net/ethernet/cisco/enic/enic_main.c | |||
| @@ -1170,7 +1170,7 @@ static int enic_poll(struct napi_struct *napi, int budget) | |||
| 1170 | wq_work_done, | 1170 | wq_work_done, |
| 1171 | 0 /* dont unmask intr */, | 1171 | 0 /* dont unmask intr */, |
| 1172 | 0 /* dont reset intr timer */); | 1172 | 0 /* dont reset intr timer */); |
| 1173 | return rq_work_done; | 1173 | return budget; |
| 1174 | } | 1174 | } |
| 1175 | 1175 | ||
| 1176 | if (budget > 0) | 1176 | if (budget > 0) |
| @@ -1191,6 +1191,7 @@ static int enic_poll(struct napi_struct *napi, int budget) | |||
| 1191 | 0 /* don't reset intr timer */); | 1191 | 0 /* don't reset intr timer */); |
| 1192 | 1192 | ||
| 1193 | err = vnic_rq_fill(&enic->rq[0], enic_rq_alloc_buf); | 1193 | err = vnic_rq_fill(&enic->rq[0], enic_rq_alloc_buf); |
| 1194 | enic_poll_unlock_napi(&enic->rq[cq_rq], napi); | ||
| 1194 | 1195 | ||
| 1195 | /* Buffer allocation failed. Stay in polling | 1196 | /* Buffer allocation failed. Stay in polling |
| 1196 | * mode so we can try to fill the ring again. | 1197 | * mode so we can try to fill the ring again. |
| @@ -1208,7 +1209,6 @@ static int enic_poll(struct napi_struct *napi, int budget) | |||
| 1208 | napi_complete(napi); | 1209 | napi_complete(napi); |
| 1209 | vnic_intr_unmask(&enic->intr[intr]); | 1210 | vnic_intr_unmask(&enic->intr[intr]); |
| 1210 | } | 1211 | } |
| 1211 | enic_poll_unlock_napi(&enic->rq[cq_rq], napi); | ||
| 1212 | 1212 | ||
| 1213 | return rq_work_done; | 1213 | return rq_work_done; |
| 1214 | } | 1214 | } |
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index 1f89c59b4353..42e20e5385ac 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | #include <linux/module.h> | 24 | #include <linux/module.h> |
| 25 | #include <linux/kernel.h> | 25 | #include <linux/kernel.h> |
| 26 | #include <linux/string.h> | 26 | #include <linux/string.h> |
| 27 | #include <linux/pm_runtime.h> | ||
| 27 | #include <linux/ptrace.h> | 28 | #include <linux/ptrace.h> |
| 28 | #include <linux/errno.h> | 29 | #include <linux/errno.h> |
| 29 | #include <linux/ioport.h> | 30 | #include <linux/ioport.h> |
| @@ -77,6 +78,7 @@ static void fec_enet_itr_coal_init(struct net_device *ndev); | |||
| 77 | #define FEC_ENET_RAEM_V 0x8 | 78 | #define FEC_ENET_RAEM_V 0x8 |
| 78 | #define FEC_ENET_RAFL_V 0x8 | 79 | #define FEC_ENET_RAFL_V 0x8 |
| 79 | #define FEC_ENET_OPD_V 0xFFF0 | 80 | #define FEC_ENET_OPD_V 0xFFF0 |
| 81 | #define FEC_MDIO_PM_TIMEOUT 100 /* ms */ | ||
| 80 | 82 | ||
| 81 | static struct platform_device_id fec_devtype[] = { | 83 | static struct platform_device_id fec_devtype[] = { |
| 82 | { | 84 | { |
| @@ -1767,7 +1769,13 @@ static void fec_enet_adjust_link(struct net_device *ndev) | |||
| 1767 | static int fec_enet_mdio_read(struct mii_bus *bus, int mii_id, int regnum) | 1769 | static int fec_enet_mdio_read(struct mii_bus *bus, int mii_id, int regnum) |
| 1768 | { | 1770 | { |
| 1769 | struct fec_enet_private *fep = bus->priv; | 1771 | struct fec_enet_private *fep = bus->priv; |
| 1772 | struct device *dev = &fep->pdev->dev; | ||
| 1770 | unsigned long time_left; | 1773 | unsigned long time_left; |
| 1774 | int ret = 0; | ||
| 1775 | |||
| 1776 | ret = pm_runtime_get_sync(dev); | ||
| 1777 | if (IS_ERR_VALUE(ret)) | ||
| 1778 | return ret; | ||
| 1771 | 1779 | ||
| 1772 | fep->mii_timeout = 0; | 1780 | fep->mii_timeout = 0; |
| 1773 | init_completion(&fep->mdio_done); | 1781 | init_completion(&fep->mdio_done); |
| @@ -1783,18 +1791,30 @@ static int fec_enet_mdio_read(struct mii_bus *bus, int mii_id, int regnum) | |||
| 1783 | if (time_left == 0) { | 1791 | if (time_left == 0) { |
| 1784 | fep->mii_timeout = 1; | 1792 | fep->mii_timeout = 1; |
| 1785 | netdev_err(fep->netdev, "MDIO read timeout\n"); | 1793 | netdev_err(fep->netdev, "MDIO read timeout\n"); |
| 1786 | return -ETIMEDOUT; | 1794 | ret = -ETIMEDOUT; |
| 1795 | goto out; | ||
| 1787 | } | 1796 | } |
| 1788 | 1797 | ||
| 1789 | /* return value */ | 1798 | ret = FEC_MMFR_DATA(readl(fep->hwp + FEC_MII_DATA)); |
| 1790 | return FEC_MMFR_DATA(readl(fep->hwp + FEC_MII_DATA)); | 1799 | |
| 1800 | out: | ||
| 1801 | pm_runtime_mark_last_busy(dev); | ||
| 1802 | pm_runtime_put_autosuspend(dev); | ||
| 1803 | |||
| 1804 | return ret; | ||
| 1791 | } | 1805 | } |
| 1792 | 1806 | ||
| 1793 | static int fec_enet_mdio_write(struct mii_bus *bus, int mii_id, int regnum, | 1807 | static int fec_enet_mdio_write(struct mii_bus *bus, int mii_id, int regnum, |
| 1794 | u16 value) | 1808 | u16 value) |
| 1795 | { | 1809 | { |
| 1796 | struct fec_enet_private *fep = bus->priv; | 1810 | struct fec_enet_private *fep = bus->priv; |
| 1811 | struct device *dev = &fep->pdev->dev; | ||
| 1797 | unsigned long time_left; | 1812 | unsigned long time_left; |
| 1813 | int ret = 0; | ||
| 1814 | |||
| 1815 | ret = pm_runtime_get_sync(dev); | ||
| 1816 | if (IS_ERR_VALUE(ret)) | ||
| 1817 | return ret; | ||
| 1798 | 1818 | ||
| 1799 | fep->mii_timeout = 0; | 1819 | fep->mii_timeout = 0; |
| 1800 | init_completion(&fep->mdio_done); | 1820 | init_completion(&fep->mdio_done); |
| @@ -1811,10 +1831,13 @@ static int fec_enet_mdio_write(struct mii_bus *bus, int mii_id, int regnum, | |||
| 1811 | if (time_left == 0) { | 1831 | if (time_left == 0) { |
| 1812 | fep->mii_timeout = 1; | 1832 | fep->mii_timeout = 1; |
| 1813 | netdev_err(fep->netdev, "MDIO write timeout\n"); | 1833 | netdev_err(fep->netdev, "MDIO write timeout\n"); |
| 1814 | return -ETIMEDOUT; | 1834 | ret = -ETIMEDOUT; |
| 1815 | } | 1835 | } |
| 1816 | 1836 | ||
| 1817 | return 0; | 1837 | pm_runtime_mark_last_busy(dev); |
| 1838 | pm_runtime_put_autosuspend(dev); | ||
| 1839 | |||
| 1840 | return ret; | ||
| 1818 | } | 1841 | } |
| 1819 | 1842 | ||
| 1820 | static int fec_enet_clk_enable(struct net_device *ndev, bool enable) | 1843 | static int fec_enet_clk_enable(struct net_device *ndev, bool enable) |
| @@ -1826,9 +1849,6 @@ static int fec_enet_clk_enable(struct net_device *ndev, bool enable) | |||
| 1826 | ret = clk_prepare_enable(fep->clk_ahb); | 1849 | ret = clk_prepare_enable(fep->clk_ahb); |
| 1827 | if (ret) | 1850 | if (ret) |
| 1828 | return ret; | 1851 | return ret; |
| 1829 | ret = clk_prepare_enable(fep->clk_ipg); | ||
| 1830 | if (ret) | ||
| 1831 | goto failed_clk_ipg; | ||
| 1832 | if (fep->clk_enet_out) { | 1852 | if (fep->clk_enet_out) { |
| 1833 | ret = clk_prepare_enable(fep->clk_enet_out); | 1853 | ret = clk_prepare_enable(fep->clk_enet_out); |
| 1834 | if (ret) | 1854 | if (ret) |
| @@ -1852,7 +1872,6 @@ static int fec_enet_clk_enable(struct net_device *ndev, bool enable) | |||
| 1852 | } | 1872 | } |
| 1853 | } else { | 1873 | } else { |
| 1854 | clk_disable_unprepare(fep->clk_ahb); | 1874 | clk_disable_unprepare(fep->clk_ahb); |
| 1855 | clk_disable_unprepare(fep->clk_ipg); | ||
| 1856 | if (fep->clk_enet_out) | 1875 | if (fep->clk_enet_out) |
| 1857 | clk_disable_unprepare(fep->clk_enet_out); | 1876 | clk_disable_unprepare(fep->clk_enet_out); |
| 1858 | if (fep->clk_ptp) { | 1877 | if (fep->clk_ptp) { |
| @@ -1874,8 +1893,6 @@ failed_clk_ptp: | |||
| 1874 | if (fep->clk_enet_out) | 1893 | if (fep->clk_enet_out) |
| 1875 | clk_disable_unprepare(fep->clk_enet_out); | 1894 | clk_disable_unprepare(fep->clk_enet_out); |
| 1876 | failed_clk_enet_out: | 1895 | failed_clk_enet_out: |
| 1877 | clk_disable_unprepare(fep->clk_ipg); | ||
| 1878 | failed_clk_ipg: | ||
| 1879 | clk_disable_unprepare(fep->clk_ahb); | 1896 | clk_disable_unprepare(fep->clk_ahb); |
| 1880 | 1897 | ||
| 1881 | return ret; | 1898 | return ret; |
| @@ -2847,10 +2864,14 @@ fec_enet_open(struct net_device *ndev) | |||
| 2847 | struct fec_enet_private *fep = netdev_priv(ndev); | 2864 | struct fec_enet_private *fep = netdev_priv(ndev); |
| 2848 | int ret; | 2865 | int ret; |
| 2849 | 2866 | ||
| 2867 | ret = pm_runtime_get_sync(&fep->pdev->dev); | ||
| 2868 | if (IS_ERR_VALUE(ret)) | ||
| 2869 | return ret; | ||
| 2870 | |||
| 2850 | pinctrl_pm_select_default_state(&fep->pdev->dev); | 2871 | pinctrl_pm_select_default_state(&fep->pdev->dev); |
| 2851 | ret = fec_enet_clk_enable(ndev, true); | 2872 | ret = fec_enet_clk_enable(ndev, true); |
| 2852 | if (ret) | 2873 | if (ret) |
| 2853 | return ret; | 2874 | goto clk_enable; |
| 2854 | 2875 | ||
| 2855 | /* I should reset the ring buffers here, but I don't yet know | 2876 | /* I should reset the ring buffers here, but I don't yet know |
| 2856 | * a simple way to do that. | 2877 | * a simple way to do that. |
| @@ -2881,6 +2902,9 @@ err_enet_mii_probe: | |||
| 2881 | fec_enet_free_buffers(ndev); | 2902 | fec_enet_free_buffers(ndev); |
| 2882 | err_enet_alloc: | 2903 | err_enet_alloc: |
| 2883 | fec_enet_clk_enable(ndev, false); | 2904 | fec_enet_clk_enable(ndev, false); |
| 2905 | clk_enable: | ||
| 2906 | pm_runtime_mark_last_busy(&fep->pdev->dev); | ||
| 2907 | pm_runtime_put_autosuspend(&fep->pdev->dev); | ||
| 2884 | pinctrl_pm_select_sleep_state(&fep->pdev->dev); | 2908 | pinctrl_pm_select_sleep_state(&fep->pdev->dev); |
| 2885 | return ret; | 2909 | return ret; |
| 2886 | } | 2910 | } |
| @@ -2903,6 +2927,9 @@ fec_enet_close(struct net_device *ndev) | |||
| 2903 | 2927 | ||
| 2904 | fec_enet_clk_enable(ndev, false); | 2928 | fec_enet_clk_enable(ndev, false); |
| 2905 | pinctrl_pm_select_sleep_state(&fep->pdev->dev); | 2929 | pinctrl_pm_select_sleep_state(&fep->pdev->dev); |
| 2930 | pm_runtime_mark_last_busy(&fep->pdev->dev); | ||
| 2931 | pm_runtime_put_autosuspend(&fep->pdev->dev); | ||
| 2932 | |||
| 2906 | fec_enet_free_buffers(ndev); | 2933 | fec_enet_free_buffers(ndev); |
| 2907 | 2934 | ||
| 2908 | return 0; | 2935 | return 0; |
| @@ -3388,6 +3415,10 @@ fec_probe(struct platform_device *pdev) | |||
| 3388 | if (ret) | 3415 | if (ret) |
| 3389 | goto failed_clk; | 3416 | goto failed_clk; |
| 3390 | 3417 | ||
| 3418 | ret = clk_prepare_enable(fep->clk_ipg); | ||
| 3419 | if (ret) | ||
| 3420 | goto failed_clk_ipg; | ||
| 3421 | |||
| 3391 | fep->reg_phy = devm_regulator_get(&pdev->dev, "phy"); | 3422 | fep->reg_phy = devm_regulator_get(&pdev->dev, "phy"); |
| 3392 | if (!IS_ERR(fep->reg_phy)) { | 3423 | if (!IS_ERR(fep->reg_phy)) { |
| 3393 | ret = regulator_enable(fep->reg_phy); | 3424 | ret = regulator_enable(fep->reg_phy); |
| @@ -3434,6 +3465,8 @@ fec_probe(struct platform_device *pdev) | |||
| 3434 | netif_carrier_off(ndev); | 3465 | netif_carrier_off(ndev); |
| 3435 | fec_enet_clk_enable(ndev, false); | 3466 | fec_enet_clk_enable(ndev, false); |
| 3436 | pinctrl_pm_select_sleep_state(&pdev->dev); | 3467 | pinctrl_pm_select_sleep_state(&pdev->dev); |
| 3468 | pm_runtime_set_active(&pdev->dev); | ||
| 3469 | pm_runtime_enable(&pdev->dev); | ||
| 3437 | 3470 | ||
| 3438 | ret = register_netdev(ndev); | 3471 | ret = register_netdev(ndev); |
| 3439 | if (ret) | 3472 | if (ret) |
| @@ -3447,6 +3480,12 @@ fec_probe(struct platform_device *pdev) | |||
| 3447 | 3480 | ||
| 3448 | fep->rx_copybreak = COPYBREAK_DEFAULT; | 3481 | fep->rx_copybreak = COPYBREAK_DEFAULT; |
| 3449 | INIT_WORK(&fep->tx_timeout_work, fec_enet_timeout_work); | 3482 | INIT_WORK(&fep->tx_timeout_work, fec_enet_timeout_work); |
| 3483 | |||
| 3484 | pm_runtime_set_autosuspend_delay(&pdev->dev, FEC_MDIO_PM_TIMEOUT); | ||
| 3485 | pm_runtime_use_autosuspend(&pdev->dev); | ||
| 3486 | pm_runtime_mark_last_busy(&pdev->dev); | ||
| 3487 | pm_runtime_put_autosuspend(&pdev->dev); | ||
| 3488 | |||
| 3450 | return 0; | 3489 | return 0; |
| 3451 | 3490 | ||
| 3452 | failed_register: | 3491 | failed_register: |
| @@ -3457,6 +3496,8 @@ failed_init: | |||
| 3457 | if (fep->reg_phy) | 3496 | if (fep->reg_phy) |
| 3458 | regulator_disable(fep->reg_phy); | 3497 | regulator_disable(fep->reg_phy); |
| 3459 | failed_regulator: | 3498 | failed_regulator: |
| 3499 | clk_disable_unprepare(fep->clk_ipg); | ||
| 3500 | failed_clk_ipg: | ||
| 3460 | fec_enet_clk_enable(ndev, false); | 3501 | fec_enet_clk_enable(ndev, false); |
| 3461 | failed_clk: | 3502 | failed_clk: |
| 3462 | failed_phy: | 3503 | failed_phy: |
| @@ -3568,7 +3609,28 @@ failed_clk: | |||
| 3568 | return ret; | 3609 | return ret; |
| 3569 | } | 3610 | } |
| 3570 | 3611 | ||
| 3571 | static SIMPLE_DEV_PM_OPS(fec_pm_ops, fec_suspend, fec_resume); | 3612 | static int __maybe_unused fec_runtime_suspend(struct device *dev) |
| 3613 | { | ||
| 3614 | struct net_device *ndev = dev_get_drvdata(dev); | ||
| 3615 | struct fec_enet_private *fep = netdev_priv(ndev); | ||
| 3616 | |||
| 3617 | clk_disable_unprepare(fep->clk_ipg); | ||
| 3618 | |||
| 3619 | return 0; | ||
| 3620 | } | ||
| 3621 | |||
| 3622 | static int __maybe_unused fec_runtime_resume(struct device *dev) | ||
| 3623 | { | ||
| 3624 | struct net_device *ndev = dev_get_drvdata(dev); | ||
| 3625 | struct fec_enet_private *fep = netdev_priv(ndev); | ||
| 3626 | |||
| 3627 | return clk_prepare_enable(fep->clk_ipg); | ||
| 3628 | } | ||
| 3629 | |||
| 3630 | static const struct dev_pm_ops fec_pm_ops = { | ||
| 3631 | SET_SYSTEM_SLEEP_PM_OPS(fec_suspend, fec_resume) | ||
| 3632 | SET_RUNTIME_PM_OPS(fec_runtime_suspend, fec_runtime_resume, NULL) | ||
| 3633 | }; | ||
| 3572 | 3634 | ||
| 3573 | static struct platform_driver fec_driver = { | 3635 | static struct platform_driver fec_driver = { |
| 3574 | .driver = { | 3636 | .driver = { |
diff --git a/drivers/net/ethernet/sfc/ef10.c b/drivers/net/ethernet/sfc/ef10.c index 847643455468..605cc8948594 100644 --- a/drivers/net/ethernet/sfc/ef10.c +++ b/drivers/net/ethernet/sfc/ef10.c | |||
| @@ -101,6 +101,11 @@ static unsigned int efx_ef10_mem_map_size(struct efx_nic *efx) | |||
| 101 | return resource_size(&efx->pci_dev->resource[bar]); | 101 | return resource_size(&efx->pci_dev->resource[bar]); |
| 102 | } | 102 | } |
| 103 | 103 | ||
| 104 | static bool efx_ef10_is_vf(struct efx_nic *efx) | ||
| 105 | { | ||
| 106 | return efx->type->is_vf; | ||
| 107 | } | ||
| 108 | |||
| 104 | static int efx_ef10_get_pf_index(struct efx_nic *efx) | 109 | static int efx_ef10_get_pf_index(struct efx_nic *efx) |
| 105 | { | 110 | { |
| 106 | MCDI_DECLARE_BUF(outbuf, MC_CMD_GET_FUNCTION_INFO_OUT_LEN); | 111 | MCDI_DECLARE_BUF(outbuf, MC_CMD_GET_FUNCTION_INFO_OUT_LEN); |
| @@ -677,6 +682,48 @@ static int efx_ef10_probe_pf(struct efx_nic *efx) | |||
| 677 | return efx_ef10_probe(efx); | 682 | return efx_ef10_probe(efx); |
| 678 | } | 683 | } |
| 679 | 684 | ||
| 685 | int efx_ef10_vadaptor_alloc(struct efx_nic *efx, unsigned int port_id) | ||
| 686 | { | ||
| 687 | MCDI_DECLARE_BUF(inbuf, MC_CMD_VADAPTOR_ALLOC_IN_LEN); | ||
| 688 | |||
| 689 | MCDI_SET_DWORD(inbuf, VADAPTOR_ALLOC_IN_UPSTREAM_PORT_ID, port_id); | ||
| 690 | return efx_mcdi_rpc(efx, MC_CMD_VADAPTOR_ALLOC, inbuf, sizeof(inbuf), | ||
| 691 | NULL, 0, NULL); | ||
| 692 | } | ||
| 693 | |||
| 694 | int efx_ef10_vadaptor_free(struct efx_nic *efx, unsigned int port_id) | ||
| 695 | { | ||
| 696 | MCDI_DECLARE_BUF(inbuf, MC_CMD_VADAPTOR_FREE_IN_LEN); | ||
| 697 | |||
| 698 | MCDI_SET_DWORD(inbuf, VADAPTOR_FREE_IN_UPSTREAM_PORT_ID, port_id); | ||
| 699 | return efx_mcdi_rpc(efx, MC_CMD_VADAPTOR_FREE, inbuf, sizeof(inbuf), | ||
| 700 | NULL, 0, NULL); | ||
| 701 | } | ||
| 702 | |||
| 703 | int efx_ef10_vport_add_mac(struct efx_nic *efx, | ||
| 704 | unsigned int port_id, u8 *mac) | ||
| 705 | { | ||
| 706 | MCDI_DECLARE_BUF(inbuf, MC_CMD_VPORT_ADD_MAC_ADDRESS_IN_LEN); | ||
| 707 | |||
| 708 | MCDI_SET_DWORD(inbuf, VPORT_ADD_MAC_ADDRESS_IN_VPORT_ID, port_id); | ||
| 709 | ether_addr_copy(MCDI_PTR(inbuf, VPORT_ADD_MAC_ADDRESS_IN_MACADDR), mac); | ||
| 710 | |||
| 711 | return efx_mcdi_rpc(efx, MC_CMD_VPORT_ADD_MAC_ADDRESS, inbuf, | ||
| 712 | sizeof(inbuf), NULL, 0, NULL); | ||
| 713 | } | ||
| 714 | |||
| 715 | int efx_ef10_vport_del_mac(struct efx_nic *efx, | ||
| 716 | unsigned int port_id, u8 *mac) | ||
| 717 | { | ||
| 718 | MCDI_DECLARE_BUF(inbuf, MC_CMD_VPORT_DEL_MAC_ADDRESS_IN_LEN); | ||
| 719 | |||
| 720 | MCDI_SET_DWORD(inbuf, VPORT_DEL_MAC_ADDRESS_IN_VPORT_ID, port_id); | ||
| 721 | ether_addr_copy(MCDI_PTR(inbuf, VPORT_DEL_MAC_ADDRESS_IN_MACADDR), mac); | ||
| 722 | |||
| 723 | return efx_mcdi_rpc(efx, MC_CMD_VPORT_DEL_MAC_ADDRESS, inbuf, | ||
| 724 | sizeof(inbuf), NULL, 0, NULL); | ||
| 725 | } | ||
| 726 | |||
| 680 | #ifdef CONFIG_SFC_SRIOV | 727 | #ifdef CONFIG_SFC_SRIOV |
| 681 | static int efx_ef10_probe_vf(struct efx_nic *efx) | 728 | static int efx_ef10_probe_vf(struct efx_nic *efx) |
| 682 | { | 729 | { |
| @@ -3804,6 +3851,72 @@ static void efx_ef10_filter_sync_rx_mode(struct efx_nic *efx) | |||
| 3804 | WARN_ON(remove_failed); | 3851 | WARN_ON(remove_failed); |
| 3805 | } | 3852 | } |
| 3806 | 3853 | ||
| 3854 | static int efx_ef10_vport_set_mac_address(struct efx_nic *efx) | ||
| 3855 | { | ||
| 3856 | struct efx_ef10_nic_data *nic_data = efx->nic_data; | ||
| 3857 | u8 mac_old[ETH_ALEN]; | ||
| 3858 | int rc, rc2; | ||
| 3859 | |||
| 3860 | /* Only reconfigure a PF-created vport */ | ||
| 3861 | if (is_zero_ether_addr(nic_data->vport_mac)) | ||
| 3862 | return 0; | ||
| 3863 | |||
| 3864 | efx_device_detach_sync(efx); | ||
| 3865 | efx_net_stop(efx->net_dev); | ||
| 3866 | down_write(&efx->filter_sem); | ||
| 3867 | efx_ef10_filter_table_remove(efx); | ||
| 3868 | up_write(&efx->filter_sem); | ||
| 3869 | |||
| 3870 | rc = efx_ef10_vadaptor_free(efx, nic_data->vport_id); | ||
| 3871 | if (rc) | ||
| 3872 | goto restore_filters; | ||
| 3873 | |||
| 3874 | ether_addr_copy(mac_old, nic_data->vport_mac); | ||
| 3875 | rc = efx_ef10_vport_del_mac(efx, nic_data->vport_id, | ||
| 3876 | nic_data->vport_mac); | ||
| 3877 | if (rc) | ||
| 3878 | goto restore_vadaptor; | ||
| 3879 | |||
| 3880 | rc = efx_ef10_vport_add_mac(efx, nic_data->vport_id, | ||
| 3881 | efx->net_dev->dev_addr); | ||
| 3882 | if (!rc) { | ||
| 3883 | ether_addr_copy(nic_data->vport_mac, efx->net_dev->dev_addr); | ||
| 3884 | } else { | ||
| 3885 | rc2 = efx_ef10_vport_add_mac(efx, nic_data->vport_id, mac_old); | ||
| 3886 | if (rc2) { | ||
| 3887 | /* Failed to add original MAC, so clear vport_mac */ | ||
| 3888 | eth_zero_addr(nic_data->vport_mac); | ||
| 3889 | goto reset_nic; | ||
| 3890 | } | ||
| 3891 | } | ||
| 3892 | |||
| 3893 | restore_vadaptor: | ||
| 3894 | rc2 = efx_ef10_vadaptor_alloc(efx, nic_data->vport_id); | ||
| 3895 | if (rc2) | ||
| 3896 | goto reset_nic; | ||
| 3897 | restore_filters: | ||
| 3898 | down_write(&efx->filter_sem); | ||
| 3899 | rc2 = efx_ef10_filter_table_probe(efx); | ||
| 3900 | up_write(&efx->filter_sem); | ||
| 3901 | if (rc2) | ||
| 3902 | goto reset_nic; | ||
| 3903 | |||
| 3904 | rc2 = efx_net_open(efx->net_dev); | ||
| 3905 | if (rc2) | ||
| 3906 | goto reset_nic; | ||
| 3907 | |||
| 3908 | netif_device_attach(efx->net_dev); | ||
| 3909 | |||
| 3910 | return rc; | ||
| 3911 | |||
| 3912 | reset_nic: | ||
| 3913 | netif_err(efx, drv, efx->net_dev, | ||
| 3914 | "Failed to restore when changing MAC address - scheduling reset\n"); | ||
| 3915 | efx_schedule_reset(efx, RESET_TYPE_DATAPATH); | ||
| 3916 | |||
| 3917 | return rc ? rc : rc2; | ||
| 3918 | } | ||
| 3919 | |||
| 3807 | static int efx_ef10_set_mac_address(struct efx_nic *efx) | 3920 | static int efx_ef10_set_mac_address(struct efx_nic *efx) |
| 3808 | { | 3921 | { |
| 3809 | MCDI_DECLARE_BUF(inbuf, MC_CMD_VADAPTOR_SET_MAC_IN_LEN); | 3922 | MCDI_DECLARE_BUF(inbuf, MC_CMD_VADAPTOR_SET_MAC_IN_LEN); |
| @@ -3820,8 +3933,8 @@ static int efx_ef10_set_mac_address(struct efx_nic *efx) | |||
| 3820 | efx->net_dev->dev_addr); | 3933 | efx->net_dev->dev_addr); |
| 3821 | MCDI_SET_DWORD(inbuf, VADAPTOR_SET_MAC_IN_UPSTREAM_PORT_ID, | 3934 | MCDI_SET_DWORD(inbuf, VADAPTOR_SET_MAC_IN_UPSTREAM_PORT_ID, |
| 3822 | nic_data->vport_id); | 3935 | nic_data->vport_id); |
| 3823 | rc = efx_mcdi_rpc(efx, MC_CMD_VADAPTOR_SET_MAC, inbuf, | 3936 | rc = efx_mcdi_rpc_quiet(efx, MC_CMD_VADAPTOR_SET_MAC, inbuf, |
| 3824 | sizeof(inbuf), NULL, 0, NULL); | 3937 | sizeof(inbuf), NULL, 0, NULL); |
| 3825 | 3938 | ||
| 3826 | efx_ef10_filter_table_probe(efx); | 3939 | efx_ef10_filter_table_probe(efx); |
| 3827 | up_write(&efx->filter_sem); | 3940 | up_write(&efx->filter_sem); |
| @@ -3829,38 +3942,27 @@ static int efx_ef10_set_mac_address(struct efx_nic *efx) | |||
| 3829 | efx_net_open(efx->net_dev); | 3942 | efx_net_open(efx->net_dev); |
| 3830 | netif_device_attach(efx->net_dev); | 3943 | netif_device_attach(efx->net_dev); |
| 3831 | 3944 | ||
| 3832 | #if !defined(CONFIG_SFC_SRIOV) | 3945 | #ifdef CONFIG_SFC_SRIOV |
| 3833 | if (rc == -EPERM) | 3946 | if (efx->pci_dev->is_virtfn && efx->pci_dev->physfn) { |
| 3834 | netif_err(efx, drv, efx->net_dev, | ||
| 3835 | "Cannot change MAC address; use sfboot to enable mac-spoofing" | ||
| 3836 | " on this interface\n"); | ||
| 3837 | #else | ||
| 3838 | if (rc == -EPERM) { | ||
| 3839 | struct pci_dev *pci_dev_pf = efx->pci_dev->physfn; | 3947 | struct pci_dev *pci_dev_pf = efx->pci_dev->physfn; |
| 3840 | 3948 | ||
| 3841 | /* Switch to PF and change MAC address on vport */ | 3949 | if (rc == -EPERM) { |
| 3842 | if (efx->pci_dev->is_virtfn && pci_dev_pf) { | 3950 | struct efx_nic *efx_pf; |
| 3843 | struct efx_nic *efx_pf = pci_get_drvdata(pci_dev_pf); | ||
| 3844 | 3951 | ||
| 3845 | if (!efx_ef10_sriov_set_vf_mac(efx_pf, | 3952 | /* Switch to PF and change MAC address on vport */ |
| 3846 | nic_data->vf_index, | 3953 | efx_pf = pci_get_drvdata(pci_dev_pf); |
| 3847 | efx->net_dev->dev_addr)) | ||
| 3848 | return 0; | ||
| 3849 | } | ||
| 3850 | netif_err(efx, drv, efx->net_dev, | ||
| 3851 | "Cannot change MAC address; use sfboot to enable mac-spoofing" | ||
| 3852 | " on this interface\n"); | ||
| 3853 | } else if (efx->pci_dev->is_virtfn) { | ||
| 3854 | /* Successfully changed by VF (with MAC spoofing), so update the | ||
| 3855 | * parent PF if possible. | ||
| 3856 | */ | ||
| 3857 | struct pci_dev *pci_dev_pf = efx->pci_dev->physfn; | ||
| 3858 | 3954 | ||
| 3859 | if (pci_dev_pf) { | 3955 | rc = efx_ef10_sriov_set_vf_mac(efx_pf, |
| 3956 | nic_data->vf_index, | ||
| 3957 | efx->net_dev->dev_addr); | ||
| 3958 | } else if (!rc) { | ||
| 3860 | struct efx_nic *efx_pf = pci_get_drvdata(pci_dev_pf); | 3959 | struct efx_nic *efx_pf = pci_get_drvdata(pci_dev_pf); |
| 3861 | struct efx_ef10_nic_data *nic_data = efx_pf->nic_data; | 3960 | struct efx_ef10_nic_data *nic_data = efx_pf->nic_data; |
| 3862 | unsigned int i; | 3961 | unsigned int i; |
| 3863 | 3962 | ||
| 3963 | /* MAC address successfully changed by VF (with MAC | ||
| 3964 | * spoofing) so update the parent PF if possible. | ||
| 3965 | */ | ||
| 3864 | for (i = 0; i < efx_pf->vf_count; ++i) { | 3966 | for (i = 0; i < efx_pf->vf_count; ++i) { |
| 3865 | struct ef10_vf *vf = nic_data->vf + i; | 3967 | struct ef10_vf *vf = nic_data->vf + i; |
| 3866 | 3968 | ||
| @@ -3871,8 +3973,24 @@ static int efx_ef10_set_mac_address(struct efx_nic *efx) | |||
| 3871 | } | 3973 | } |
| 3872 | } | 3974 | } |
| 3873 | } | 3975 | } |
| 3874 | } | 3976 | } else |
| 3875 | #endif | 3977 | #endif |
| 3978 | if (rc == -EPERM) { | ||
| 3979 | netif_err(efx, drv, efx->net_dev, | ||
| 3980 | "Cannot change MAC address; use sfboot to enable" | ||
| 3981 | " mac-spoofing on this interface\n"); | ||
| 3982 | } else if (rc == -ENOSYS && !efx_ef10_is_vf(efx)) { | ||
| 3983 | /* If the active MCFW does not support MC_CMD_VADAPTOR_SET_MAC | ||
| 3984 | * fall-back to the method of changing the MAC address on the | ||
| 3985 | * vport. This only applies to PFs because such versions of | ||
| 3986 | * MCFW do not support VFs. | ||
| 3987 | */ | ||
| 3988 | rc = efx_ef10_vport_set_mac_address(efx); | ||
| 3989 | } else { | ||
| 3990 | efx_mcdi_display_error(efx, MC_CMD_VADAPTOR_SET_MAC, | ||
| 3991 | sizeof(inbuf), NULL, 0, rc); | ||
| 3992 | } | ||
| 3993 | |||
| 3876 | return rc; | 3994 | return rc; |
| 3877 | } | 3995 | } |
| 3878 | 3996 | ||
diff --git a/drivers/net/ethernet/sfc/ef10_sriov.c b/drivers/net/ethernet/sfc/ef10_sriov.c index 6c9b6e45509a..3c17f274e802 100644 --- a/drivers/net/ethernet/sfc/ef10_sriov.c +++ b/drivers/net/ethernet/sfc/ef10_sriov.c | |||
| @@ -29,30 +29,6 @@ static int efx_ef10_evb_port_assign(struct efx_nic *efx, unsigned int port_id, | |||
| 29 | NULL, 0, NULL); | 29 | NULL, 0, NULL); |
| 30 | } | 30 | } |
| 31 | 31 | ||
| 32 | static int efx_ef10_vport_add_mac(struct efx_nic *efx, | ||
| 33 | unsigned int port_id, u8 *mac) | ||
| 34 | { | ||
| 35 | MCDI_DECLARE_BUF(inbuf, MC_CMD_VPORT_ADD_MAC_ADDRESS_IN_LEN); | ||
| 36 | |||
| 37 | MCDI_SET_DWORD(inbuf, VPORT_ADD_MAC_ADDRESS_IN_VPORT_ID, port_id); | ||
| 38 | ether_addr_copy(MCDI_PTR(inbuf, VPORT_ADD_MAC_ADDRESS_IN_MACADDR), mac); | ||
| 39 | |||
| 40 | return efx_mcdi_rpc(efx, MC_CMD_VPORT_ADD_MAC_ADDRESS, inbuf, | ||
| 41 | sizeof(inbuf), NULL, 0, NULL); | ||
| 42 | } | ||
| 43 | |||
| 44 | static int efx_ef10_vport_del_mac(struct efx_nic *efx, | ||
| 45 | unsigned int port_id, u8 *mac) | ||
| 46 | { | ||
| 47 | MCDI_DECLARE_BUF(inbuf, MC_CMD_VPORT_DEL_MAC_ADDRESS_IN_LEN); | ||
| 48 | |||
| 49 | MCDI_SET_DWORD(inbuf, VPORT_DEL_MAC_ADDRESS_IN_VPORT_ID, port_id); | ||
| 50 | ether_addr_copy(MCDI_PTR(inbuf, VPORT_DEL_MAC_ADDRESS_IN_MACADDR), mac); | ||
| 51 | |||
| 52 | return efx_mcdi_rpc(efx, MC_CMD_VPORT_DEL_MAC_ADDRESS, inbuf, | ||
| 53 | sizeof(inbuf), NULL, 0, NULL); | ||
| 54 | } | ||
| 55 | |||
| 56 | static int efx_ef10_vswitch_alloc(struct efx_nic *efx, unsigned int port_id, | 32 | static int efx_ef10_vswitch_alloc(struct efx_nic *efx, unsigned int port_id, |
| 57 | unsigned int vswitch_type) | 33 | unsigned int vswitch_type) |
| 58 | { | 34 | { |
| @@ -136,24 +112,6 @@ static int efx_ef10_vport_free(struct efx_nic *efx, unsigned int port_id) | |||
| 136 | NULL, 0, NULL); | 112 | NULL, 0, NULL); |
| 137 | } | 113 | } |
| 138 | 114 | ||
| 139 | static int efx_ef10_vadaptor_alloc(struct efx_nic *efx, unsigned int port_id) | ||
| 140 | { | ||
| 141 | MCDI_DECLARE_BUF(inbuf, MC_CMD_VADAPTOR_ALLOC_IN_LEN); | ||
| 142 | |||
| 143 | MCDI_SET_DWORD(inbuf, VADAPTOR_ALLOC_IN_UPSTREAM_PORT_ID, port_id); | ||
| 144 | return efx_mcdi_rpc(efx, MC_CMD_VADAPTOR_ALLOC, inbuf, sizeof(inbuf), | ||
| 145 | NULL, 0, NULL); | ||
| 146 | } | ||
| 147 | |||
| 148 | static int efx_ef10_vadaptor_free(struct efx_nic *efx, unsigned int port_id) | ||
| 149 | { | ||
| 150 | MCDI_DECLARE_BUF(inbuf, MC_CMD_VADAPTOR_FREE_IN_LEN); | ||
| 151 | |||
| 152 | MCDI_SET_DWORD(inbuf, VADAPTOR_FREE_IN_UPSTREAM_PORT_ID, port_id); | ||
| 153 | return efx_mcdi_rpc(efx, MC_CMD_VADAPTOR_FREE, inbuf, sizeof(inbuf), | ||
| 154 | NULL, 0, NULL); | ||
| 155 | } | ||
| 156 | |||
| 157 | static void efx_ef10_sriov_free_vf_vports(struct efx_nic *efx) | 115 | static void efx_ef10_sriov_free_vf_vports(struct efx_nic *efx) |
| 158 | { | 116 | { |
| 159 | struct efx_ef10_nic_data *nic_data = efx->nic_data; | 117 | struct efx_ef10_nic_data *nic_data = efx->nic_data; |
| @@ -640,21 +598,21 @@ int efx_ef10_sriov_set_vf_vlan(struct efx_nic *efx, int vf_i, u16 vlan, | |||
| 640 | MC_CMD_VPORT_ALLOC_IN_VPORT_TYPE_NORMAL, | 598 | MC_CMD_VPORT_ALLOC_IN_VPORT_TYPE_NORMAL, |
| 641 | vf->vlan, &vf->vport_id); | 599 | vf->vlan, &vf->vport_id); |
| 642 | if (rc) | 600 | if (rc) |
| 643 | goto reset_nic; | 601 | goto reset_nic_up_write; |
| 644 | 602 | ||
| 645 | restore_mac: | 603 | restore_mac: |
| 646 | if (!is_zero_ether_addr(vf->mac)) { | 604 | if (!is_zero_ether_addr(vf->mac)) { |
| 647 | rc2 = efx_ef10_vport_add_mac(efx, vf->vport_id, vf->mac); | 605 | rc2 = efx_ef10_vport_add_mac(efx, vf->vport_id, vf->mac); |
| 648 | if (rc2) { | 606 | if (rc2) { |
| 649 | eth_zero_addr(vf->mac); | 607 | eth_zero_addr(vf->mac); |
| 650 | goto reset_nic; | 608 | goto reset_nic_up_write; |
| 651 | } | 609 | } |
| 652 | } | 610 | } |
| 653 | 611 | ||
| 654 | restore_evb_port: | 612 | restore_evb_port: |
| 655 | rc2 = efx_ef10_evb_port_assign(efx, vf->vport_id, vf_i); | 613 | rc2 = efx_ef10_evb_port_assign(efx, vf->vport_id, vf_i); |
| 656 | if (rc2) | 614 | if (rc2) |
| 657 | goto reset_nic; | 615 | goto reset_nic_up_write; |
| 658 | else | 616 | else |
| 659 | vf->vport_assigned = 1; | 617 | vf->vport_assigned = 1; |
| 660 | 618 | ||
| @@ -662,14 +620,16 @@ restore_vadaptor: | |||
| 662 | if (vf->efx) { | 620 | if (vf->efx) { |
| 663 | rc2 = efx_ef10_vadaptor_alloc(vf->efx, EVB_PORT_ID_ASSIGNED); | 621 | rc2 = efx_ef10_vadaptor_alloc(vf->efx, EVB_PORT_ID_ASSIGNED); |
| 664 | if (rc2) | 622 | if (rc2) |
| 665 | goto reset_nic; | 623 | goto reset_nic_up_write; |
| 666 | } | 624 | } |
| 667 | 625 | ||
| 668 | restore_filters: | 626 | restore_filters: |
| 669 | if (vf->efx) { | 627 | if (vf->efx) { |
| 670 | rc2 = vf->efx->type->filter_table_probe(vf->efx); | 628 | rc2 = vf->efx->type->filter_table_probe(vf->efx); |
| 671 | if (rc2) | 629 | if (rc2) |
| 672 | goto reset_nic; | 630 | goto reset_nic_up_write; |
| 631 | |||
| 632 | up_write(&vf->efx->filter_sem); | ||
| 673 | 633 | ||
| 674 | up_write(&vf->efx->filter_sem); | 634 | up_write(&vf->efx->filter_sem); |
| 675 | 635 | ||
| @@ -681,9 +641,12 @@ restore_filters: | |||
| 681 | } | 641 | } |
| 682 | return rc; | 642 | return rc; |
| 683 | 643 | ||
| 644 | reset_nic_up_write: | ||
| 645 | if (vf->efx) | ||
| 646 | up_write(&vf->efx->filter_sem); | ||
| 647 | |||
| 684 | reset_nic: | 648 | reset_nic: |
| 685 | if (vf->efx) { | 649 | if (vf->efx) { |
| 686 | up_write(&vf->efx->filter_sem); | ||
| 687 | netif_err(efx, drv, efx->net_dev, | 650 | netif_err(efx, drv, efx->net_dev, |
| 688 | "Failed to restore VF - scheduling reset.\n"); | 651 | "Failed to restore VF - scheduling reset.\n"); |
| 689 | efx_schedule_reset(vf->efx, RESET_TYPE_DATAPATH); | 652 | efx_schedule_reset(vf->efx, RESET_TYPE_DATAPATH); |
diff --git a/drivers/net/ethernet/sfc/ef10_sriov.h b/drivers/net/ethernet/sfc/ef10_sriov.h index db4ef537c610..6d25b92cb45e 100644 --- a/drivers/net/ethernet/sfc/ef10_sriov.h +++ b/drivers/net/ethernet/sfc/ef10_sriov.h | |||
| @@ -65,5 +65,11 @@ int efx_ef10_vswitching_restore_pf(struct efx_nic *efx); | |||
| 65 | int efx_ef10_vswitching_restore_vf(struct efx_nic *efx); | 65 | int efx_ef10_vswitching_restore_vf(struct efx_nic *efx); |
| 66 | void efx_ef10_vswitching_remove_pf(struct efx_nic *efx); | 66 | void efx_ef10_vswitching_remove_pf(struct efx_nic *efx); |
| 67 | void efx_ef10_vswitching_remove_vf(struct efx_nic *efx); | 67 | void efx_ef10_vswitching_remove_vf(struct efx_nic *efx); |
| 68 | int efx_ef10_vport_add_mac(struct efx_nic *efx, | ||
| 69 | unsigned int port_id, u8 *mac); | ||
| 70 | int efx_ef10_vport_del_mac(struct efx_nic *efx, | ||
| 71 | unsigned int port_id, u8 *mac); | ||
| 72 | int efx_ef10_vadaptor_alloc(struct efx_nic *efx, unsigned int port_id); | ||
| 73 | int efx_ef10_vadaptor_free(struct efx_nic *efx, unsigned int port_id); | ||
| 68 | 74 | ||
| 69 | #endif /* EF10_SRIOV_H */ | 75 | #endif /* EF10_SRIOV_H */ |
diff --git a/drivers/net/ethernet/sfc/efx.c b/drivers/net/ethernet/sfc/efx.c index 804b9ad553d3..03bc03b67f08 100644 --- a/drivers/net/ethernet/sfc/efx.c +++ b/drivers/net/ethernet/sfc/efx.c | |||
| @@ -245,11 +245,17 @@ static int efx_check_disabled(struct efx_nic *efx) | |||
| 245 | */ | 245 | */ |
| 246 | static int efx_process_channel(struct efx_channel *channel, int budget) | 246 | static int efx_process_channel(struct efx_channel *channel, int budget) |
| 247 | { | 247 | { |
| 248 | struct efx_tx_queue *tx_queue; | ||
| 248 | int spent; | 249 | int spent; |
| 249 | 250 | ||
| 250 | if (unlikely(!channel->enabled)) | 251 | if (unlikely(!channel->enabled)) |
| 251 | return 0; | 252 | return 0; |
| 252 | 253 | ||
| 254 | efx_for_each_channel_tx_queue(tx_queue, channel) { | ||
| 255 | tx_queue->pkts_compl = 0; | ||
| 256 | tx_queue->bytes_compl = 0; | ||
| 257 | } | ||
| 258 | |||
| 253 | spent = efx_nic_process_eventq(channel, budget); | 259 | spent = efx_nic_process_eventq(channel, budget); |
| 254 | if (spent && efx_channel_has_rx_queue(channel)) { | 260 | if (spent && efx_channel_has_rx_queue(channel)) { |
| 255 | struct efx_rx_queue *rx_queue = | 261 | struct efx_rx_queue *rx_queue = |
| @@ -259,6 +265,14 @@ static int efx_process_channel(struct efx_channel *channel, int budget) | |||
| 259 | efx_fast_push_rx_descriptors(rx_queue, true); | 265 | efx_fast_push_rx_descriptors(rx_queue, true); |
| 260 | } | 266 | } |
| 261 | 267 | ||
| 268 | /* Update BQL */ | ||
| 269 | efx_for_each_channel_tx_queue(tx_queue, channel) { | ||
| 270 | if (tx_queue->bytes_compl) { | ||
| 271 | netdev_tx_completed_queue(tx_queue->core_txq, | ||
| 272 | tx_queue->pkts_compl, tx_queue->bytes_compl); | ||
| 273 | } | ||
| 274 | } | ||
| 275 | |||
| 262 | return spent; | 276 | return spent; |
| 263 | } | 277 | } |
| 264 | 278 | ||
diff --git a/drivers/net/ethernet/sfc/net_driver.h b/drivers/net/ethernet/sfc/net_driver.h index d72f522bf9c3..47d1e3a96522 100644 --- a/drivers/net/ethernet/sfc/net_driver.h +++ b/drivers/net/ethernet/sfc/net_driver.h | |||
| @@ -241,6 +241,8 @@ struct efx_tx_queue { | |||
| 241 | unsigned int read_count ____cacheline_aligned_in_smp; | 241 | unsigned int read_count ____cacheline_aligned_in_smp; |
| 242 | unsigned int old_write_count; | 242 | unsigned int old_write_count; |
| 243 | unsigned int merge_events; | 243 | unsigned int merge_events; |
| 244 | unsigned int bytes_compl; | ||
| 245 | unsigned int pkts_compl; | ||
| 244 | 246 | ||
| 245 | /* Members used only on the xmit path */ | 247 | /* Members used only on the xmit path */ |
| 246 | unsigned int insert_count ____cacheline_aligned_in_smp; | 248 | unsigned int insert_count ____cacheline_aligned_in_smp; |
diff --git a/drivers/net/ethernet/sfc/tx.c b/drivers/net/ethernet/sfc/tx.c index aaf2987512b5..1833a0146571 100644 --- a/drivers/net/ethernet/sfc/tx.c +++ b/drivers/net/ethernet/sfc/tx.c | |||
| @@ -617,7 +617,8 @@ void efx_xmit_done(struct efx_tx_queue *tx_queue, unsigned int index) | |||
| 617 | EFX_BUG_ON_PARANOID(index > tx_queue->ptr_mask); | 617 | EFX_BUG_ON_PARANOID(index > tx_queue->ptr_mask); |
| 618 | 618 | ||
| 619 | efx_dequeue_buffers(tx_queue, index, &pkts_compl, &bytes_compl); | 619 | efx_dequeue_buffers(tx_queue, index, &pkts_compl, &bytes_compl); |
| 620 | netdev_tx_completed_queue(tx_queue->core_txq, pkts_compl, bytes_compl); | 620 | tx_queue->pkts_compl += pkts_compl; |
| 621 | tx_queue->bytes_compl += bytes_compl; | ||
| 621 | 622 | ||
| 622 | if (pkts_compl > 1) | 623 | if (pkts_compl > 1) |
| 623 | ++tx_queue->merge_events; | 624 | ++tx_queue->merge_events; |
diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c index 462820514fae..f335bf119ab5 100644 --- a/drivers/net/ethernet/ti/cpsw.c +++ b/drivers/net/ethernet/ti/cpsw.c | |||
| @@ -138,19 +138,6 @@ do { \ | |||
| 138 | #define CPSW_CMINTMAX_INTVL (1000 / CPSW_CMINTMIN_CNT) | 138 | #define CPSW_CMINTMAX_INTVL (1000 / CPSW_CMINTMIN_CNT) |
| 139 | #define CPSW_CMINTMIN_INTVL ((1000 / CPSW_CMINTMAX_CNT) + 1) | 139 | #define CPSW_CMINTMIN_INTVL ((1000 / CPSW_CMINTMAX_CNT) + 1) |
| 140 | 140 | ||
| 141 | #define cpsw_enable_irq(priv) \ | ||
| 142 | do { \ | ||
| 143 | u32 i; \ | ||
| 144 | for (i = 0; i < priv->num_irqs; i++) \ | ||
| 145 | enable_irq(priv->irqs_table[i]); \ | ||
| 146 | } while (0) | ||
| 147 | #define cpsw_disable_irq(priv) \ | ||
| 148 | do { \ | ||
| 149 | u32 i; \ | ||
| 150 | for (i = 0; i < priv->num_irqs; i++) \ | ||
| 151 | disable_irq_nosync(priv->irqs_table[i]); \ | ||
| 152 | } while (0) | ||
| 153 | |||
| 154 | #define cpsw_slave_index(priv) \ | 141 | #define cpsw_slave_index(priv) \ |
| 155 | ((priv->data.dual_emac) ? priv->emac_port : \ | 142 | ((priv->data.dual_emac) ? priv->emac_port : \ |
| 156 | priv->data.active_slave) | 143 | priv->data.active_slave) |
| @@ -509,9 +496,11 @@ static const struct cpsw_stats cpsw_gstrings_stats[] = { | |||
| 509 | (func)(slave++, ##arg); \ | 496 | (func)(slave++, ##arg); \ |
| 510 | } while (0) | 497 | } while (0) |
| 511 | #define cpsw_get_slave_ndev(priv, __slave_no__) \ | 498 | #define cpsw_get_slave_ndev(priv, __slave_no__) \ |
| 512 | (priv->slaves[__slave_no__].ndev) | 499 | ((__slave_no__ < priv->data.slaves) ? \ |
| 500 | priv->slaves[__slave_no__].ndev : NULL) | ||
| 513 | #define cpsw_get_slave_priv(priv, __slave_no__) \ | 501 | #define cpsw_get_slave_priv(priv, __slave_no__) \ |
| 514 | ((priv->slaves[__slave_no__].ndev) ? \ | 502 | (((__slave_no__ < priv->data.slaves) && \ |
| 503 | (priv->slaves[__slave_no__].ndev)) ? \ | ||
| 515 | netdev_priv(priv->slaves[__slave_no__].ndev) : NULL) \ | 504 | netdev_priv(priv->slaves[__slave_no__].ndev) : NULL) \ |
| 516 | 505 | ||
| 517 | #define cpsw_dual_emac_src_port_detect(status, priv, ndev, skb) \ | 506 | #define cpsw_dual_emac_src_port_detect(status, priv, ndev, skb) \ |
| @@ -781,7 +770,7 @@ static irqreturn_t cpsw_rx_interrupt(int irq, void *dev_id) | |||
| 781 | 770 | ||
| 782 | cpsw_intr_disable(priv); | 771 | cpsw_intr_disable(priv); |
| 783 | if (priv->irq_enabled == true) { | 772 | if (priv->irq_enabled == true) { |
| 784 | cpsw_disable_irq(priv); | 773 | disable_irq_nosync(priv->irqs_table[0]); |
| 785 | priv->irq_enabled = false; | 774 | priv->irq_enabled = false; |
| 786 | } | 775 | } |
| 787 | 776 | ||
| @@ -817,7 +806,7 @@ static int cpsw_poll(struct napi_struct *napi, int budget) | |||
| 817 | prim_cpsw = cpsw_get_slave_priv(priv, 0); | 806 | prim_cpsw = cpsw_get_slave_priv(priv, 0); |
| 818 | if (prim_cpsw->irq_enabled == false) { | 807 | if (prim_cpsw->irq_enabled == false) { |
| 819 | prim_cpsw->irq_enabled = true; | 808 | prim_cpsw->irq_enabled = true; |
| 820 | cpsw_enable_irq(priv); | 809 | enable_irq(priv->irqs_table[0]); |
| 821 | } | 810 | } |
| 822 | } | 811 | } |
| 823 | 812 | ||
| @@ -1333,7 +1322,7 @@ static int cpsw_ndo_open(struct net_device *ndev) | |||
| 1333 | if (prim_cpsw->irq_enabled == false) { | 1322 | if (prim_cpsw->irq_enabled == false) { |
| 1334 | if ((priv == prim_cpsw) || !netif_running(prim_cpsw->ndev)) { | 1323 | if ((priv == prim_cpsw) || !netif_running(prim_cpsw->ndev)) { |
| 1335 | prim_cpsw->irq_enabled = true; | 1324 | prim_cpsw->irq_enabled = true; |
| 1336 | cpsw_enable_irq(prim_cpsw); | 1325 | enable_irq(prim_cpsw->irqs_table[0]); |
| 1337 | } | 1326 | } |
| 1338 | } | 1327 | } |
| 1339 | 1328 | ||
diff --git a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c index 4208dd7ef101..d95f9aae95e7 100644 --- a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c +++ b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c | |||
| @@ -1530,9 +1530,9 @@ static int axienet_probe(struct platform_device *pdev) | |||
| 1530 | /* Map device registers */ | 1530 | /* Map device registers */ |
| 1531 | ethres = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 1531 | ethres = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 1532 | lp->regs = devm_ioremap_resource(&pdev->dev, ethres); | 1532 | lp->regs = devm_ioremap_resource(&pdev->dev, ethres); |
| 1533 | if (!lp->regs) { | 1533 | if (IS_ERR(lp->regs)) { |
| 1534 | dev_err(&pdev->dev, "could not map Axi Ethernet regs.\n"); | 1534 | dev_err(&pdev->dev, "could not map Axi Ethernet regs.\n"); |
| 1535 | ret = -ENOMEM; | 1535 | ret = PTR_ERR(lp->regs); |
| 1536 | goto free_netdev; | 1536 | goto free_netdev; |
| 1537 | } | 1537 | } |
| 1538 | 1538 | ||
| @@ -1599,9 +1599,9 @@ static int axienet_probe(struct platform_device *pdev) | |||
| 1599 | goto free_netdev; | 1599 | goto free_netdev; |
| 1600 | } | 1600 | } |
| 1601 | lp->dma_regs = devm_ioremap_resource(&pdev->dev, &dmares); | 1601 | lp->dma_regs = devm_ioremap_resource(&pdev->dev, &dmares); |
| 1602 | if (!lp->dma_regs) { | 1602 | if (IS_ERR(lp->dma_regs)) { |
| 1603 | dev_err(&pdev->dev, "could not map DMA regs\n"); | 1603 | dev_err(&pdev->dev, "could not map DMA regs\n"); |
| 1604 | ret = -ENOMEM; | 1604 | ret = PTR_ERR(lp->dma_regs); |
| 1605 | goto free_netdev; | 1605 | goto free_netdev; |
| 1606 | } | 1606 | } |
| 1607 | lp->rx_irq = irq_of_parse_and_map(np, 1); | 1607 | lp->rx_irq = irq_of_parse_and_map(np, 1); |
diff --git a/drivers/net/hamradio/bpqether.c b/drivers/net/hamradio/bpqether.c index 7856b6ccf5c5..d95a50ae996d 100644 --- a/drivers/net/hamradio/bpqether.c +++ b/drivers/net/hamradio/bpqether.c | |||
| @@ -482,6 +482,7 @@ static void bpq_setup(struct net_device *dev) | |||
| 482 | memcpy(dev->dev_addr, &ax25_defaddr, AX25_ADDR_LEN); | 482 | memcpy(dev->dev_addr, &ax25_defaddr, AX25_ADDR_LEN); |
| 483 | 483 | ||
| 484 | dev->flags = 0; | 484 | dev->flags = 0; |
| 485 | dev->features = NETIF_F_LLTX; /* Allow recursion */ | ||
| 485 | 486 | ||
| 486 | #if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE) | 487 | #if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE) |
| 487 | dev->header_ops = &ax25_header_ops; | 488 | dev->header_ops = &ax25_header_ops; |
diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c index f8370808a018..3b933bb5a8d5 100644 --- a/drivers/net/macvtap.c +++ b/drivers/net/macvtap.c | |||
| @@ -1355,6 +1355,7 @@ static void macvtap_exit(void) | |||
| 1355 | class_unregister(macvtap_class); | 1355 | class_unregister(macvtap_class); |
| 1356 | cdev_del(&macvtap_cdev); | 1356 | cdev_del(&macvtap_cdev); |
| 1357 | unregister_chrdev_region(macvtap_major, MACVTAP_NUM_DEVS); | 1357 | unregister_chrdev_region(macvtap_major, MACVTAP_NUM_DEVS); |
| 1358 | idr_destroy(&minor_idr); | ||
| 1358 | } | 1359 | } |
| 1359 | module_exit(macvtap_exit); | 1360 | module_exit(macvtap_exit); |
| 1360 | 1361 | ||
diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig index cf18940f4e84..cb86d7a01542 100644 --- a/drivers/net/phy/Kconfig +++ b/drivers/net/phy/Kconfig | |||
| @@ -191,7 +191,7 @@ config MDIO_BUS_MUX_GPIO | |||
| 191 | 191 | ||
| 192 | config MDIO_BUS_MUX_MMIOREG | 192 | config MDIO_BUS_MUX_MMIOREG |
| 193 | tristate "Support for MMIO device-controlled MDIO bus multiplexers" | 193 | tristate "Support for MMIO device-controlled MDIO bus multiplexers" |
| 194 | depends on OF_MDIO | 194 | depends on OF_MDIO && HAS_IOMEM |
| 195 | select MDIO_BUS_MUX | 195 | select MDIO_BUS_MUX |
| 196 | help | 196 | help |
| 197 | This module provides a driver for MDIO bus multiplexers that | 197 | This module provides a driver for MDIO bus multiplexers that |
diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c index 4545e78840b0..35a2bffe848a 100644 --- a/drivers/net/usb/cdc_ether.c +++ b/drivers/net/usb/cdc_ether.c | |||
| @@ -523,6 +523,7 @@ static const struct driver_info wwan_info = { | |||
| 523 | #define REALTEK_VENDOR_ID 0x0bda | 523 | #define REALTEK_VENDOR_ID 0x0bda |
| 524 | #define SAMSUNG_VENDOR_ID 0x04e8 | 524 | #define SAMSUNG_VENDOR_ID 0x04e8 |
| 525 | #define LENOVO_VENDOR_ID 0x17ef | 525 | #define LENOVO_VENDOR_ID 0x17ef |
| 526 | #define NVIDIA_VENDOR_ID 0x0955 | ||
| 526 | 527 | ||
| 527 | static const struct usb_device_id products[] = { | 528 | static const struct usb_device_id products[] = { |
| 528 | /* BLACKLIST !! | 529 | /* BLACKLIST !! |
| @@ -710,6 +711,13 @@ static const struct usb_device_id products[] = { | |||
| 710 | .driver_info = 0, | 711 | .driver_info = 0, |
| 711 | }, | 712 | }, |
| 712 | 713 | ||
| 714 | /* NVIDIA Tegra USB 3.0 Ethernet Adapters (based on Realtek RTL8153) */ | ||
| 715 | { | ||
| 716 | USB_DEVICE_AND_INTERFACE_INFO(NVIDIA_VENDOR_ID, 0x09ff, USB_CLASS_COMM, | ||
| 717 | USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), | ||
| 718 | .driver_info = 0, | ||
| 719 | }, | ||
| 720 | |||
| 713 | /* WHITELIST!!! | 721 | /* WHITELIST!!! |
| 714 | * | 722 | * |
| 715 | * CDC Ether uses two interfaces, not necessarily consecutive. | 723 | * CDC Ether uses two interfaces, not necessarily consecutive. |
diff --git a/drivers/net/usb/cdc_mbim.c b/drivers/net/usb/cdc_mbim.c index e4b7a47a825c..efc18e05af0a 100644 --- a/drivers/net/usb/cdc_mbim.c +++ b/drivers/net/usb/cdc_mbim.c | |||
| @@ -158,7 +158,7 @@ static int cdc_mbim_bind(struct usbnet *dev, struct usb_interface *intf) | |||
| 158 | if (!cdc_ncm_comm_intf_is_mbim(intf->cur_altsetting)) | 158 | if (!cdc_ncm_comm_intf_is_mbim(intf->cur_altsetting)) |
| 159 | goto err; | 159 | goto err; |
| 160 | 160 | ||
| 161 | ret = cdc_ncm_bind_common(dev, intf, data_altsetting); | 161 | ret = cdc_ncm_bind_common(dev, intf, data_altsetting, 0); |
| 162 | if (ret) | 162 | if (ret) |
| 163 | goto err; | 163 | goto err; |
| 164 | 164 | ||
diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c index 8067b8fbb0ee..db40175b1a0b 100644 --- a/drivers/net/usb/cdc_ncm.c +++ b/drivers/net/usb/cdc_ncm.c | |||
| @@ -6,7 +6,7 @@ | |||
| 6 | * Original author: Hans Petter Selasky <hans.petter.selasky@stericsson.com> | 6 | * Original author: Hans Petter Selasky <hans.petter.selasky@stericsson.com> |
| 7 | * | 7 | * |
| 8 | * USB Host Driver for Network Control Model (NCM) | 8 | * USB Host Driver for Network Control Model (NCM) |
| 9 | * http://www.usb.org/developers/devclass_docs/NCM10.zip | 9 | * http://www.usb.org/developers/docs/devclass_docs/NCM10_012011.zip |
| 10 | * | 10 | * |
| 11 | * The NCM encoding, decoding and initialization logic | 11 | * The NCM encoding, decoding and initialization logic |
| 12 | * derives from FreeBSD 8.x. if_cdce.c and if_cdcereg.h | 12 | * derives from FreeBSD 8.x. if_cdce.c and if_cdcereg.h |
| @@ -684,10 +684,12 @@ static void cdc_ncm_free(struct cdc_ncm_ctx *ctx) | |||
| 684 | ctx->tx_curr_skb = NULL; | 684 | ctx->tx_curr_skb = NULL; |
| 685 | } | 685 | } |
| 686 | 686 | ||
| 687 | kfree(ctx->delayed_ndp16); | ||
| 688 | |||
| 687 | kfree(ctx); | 689 | kfree(ctx); |
| 688 | } | 690 | } |
| 689 | 691 | ||
| 690 | int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_altsetting) | 692 | int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_altsetting, int drvflags) |
| 691 | { | 693 | { |
| 692 | const struct usb_cdc_union_desc *union_desc = NULL; | 694 | const struct usb_cdc_union_desc *union_desc = NULL; |
| 693 | struct cdc_ncm_ctx *ctx; | 695 | struct cdc_ncm_ctx *ctx; |
| @@ -855,6 +857,17 @@ advance: | |||
| 855 | /* finish setting up the device specific data */ | 857 | /* finish setting up the device specific data */ |
| 856 | cdc_ncm_setup(dev); | 858 | cdc_ncm_setup(dev); |
| 857 | 859 | ||
| 860 | /* Device-specific flags */ | ||
| 861 | ctx->drvflags = drvflags; | ||
| 862 | |||
| 863 | /* Allocate the delayed NDP if needed. */ | ||
| 864 | if (ctx->drvflags & CDC_NCM_FLAG_NDP_TO_END) { | ||
| 865 | ctx->delayed_ndp16 = kzalloc(ctx->max_ndp_size, GFP_KERNEL); | ||
| 866 | if (!ctx->delayed_ndp16) | ||
| 867 | goto error2; | ||
| 868 | dev_info(&intf->dev, "NDP will be placed at end of frame for this device."); | ||
| 869 | } | ||
| 870 | |||
| 858 | /* override ethtool_ops */ | 871 | /* override ethtool_ops */ |
| 859 | dev->net->ethtool_ops = &cdc_ncm_ethtool_ops; | 872 | dev->net->ethtool_ops = &cdc_ncm_ethtool_ops; |
| 860 | 873 | ||
| @@ -954,8 +967,11 @@ static int cdc_ncm_bind(struct usbnet *dev, struct usb_interface *intf) | |||
| 954 | if (cdc_ncm_select_altsetting(intf) != CDC_NCM_COMM_ALTSETTING_NCM) | 967 | if (cdc_ncm_select_altsetting(intf) != CDC_NCM_COMM_ALTSETTING_NCM) |
| 955 | return -ENODEV; | 968 | return -ENODEV; |
| 956 | 969 | ||
| 957 | /* The NCM data altsetting is fixed */ | 970 | /* The NCM data altsetting is fixed, so we hard-coded it. |
| 958 | ret = cdc_ncm_bind_common(dev, intf, CDC_NCM_DATA_ALTSETTING_NCM); | 971 | * Additionally, generic NCM devices are assumed to accept arbitrarily |
| 972 | * placed NDP. | ||
| 973 | */ | ||
| 974 | ret = cdc_ncm_bind_common(dev, intf, CDC_NCM_DATA_ALTSETTING_NCM, 0); | ||
| 959 | 975 | ||
| 960 | /* | 976 | /* |
| 961 | * We should get an event when network connection is "connected" or | 977 | * We should get an event when network connection is "connected" or |
| @@ -986,6 +1002,14 @@ static struct usb_cdc_ncm_ndp16 *cdc_ncm_ndp(struct cdc_ncm_ctx *ctx, struct sk_ | |||
| 986 | struct usb_cdc_ncm_nth16 *nth16 = (void *)skb->data; | 1002 | struct usb_cdc_ncm_nth16 *nth16 = (void *)skb->data; |
| 987 | size_t ndpoffset = le16_to_cpu(nth16->wNdpIndex); | 1003 | size_t ndpoffset = le16_to_cpu(nth16->wNdpIndex); |
| 988 | 1004 | ||
| 1005 | /* If NDP should be moved to the end of the NCM package, we can't follow the | ||
| 1006 | * NTH16 header as we would normally do. NDP isn't written to the SKB yet, and | ||
| 1007 | * the wNdpIndex field in the header is actually not consistent with reality. It will be later. | ||
| 1008 | */ | ||
| 1009 | if (ctx->drvflags & CDC_NCM_FLAG_NDP_TO_END) | ||
| 1010 | if (ctx->delayed_ndp16->dwSignature == sign) | ||
| 1011 | return ctx->delayed_ndp16; | ||
| 1012 | |||
| 989 | /* follow the chain of NDPs, looking for a match */ | 1013 | /* follow the chain of NDPs, looking for a match */ |
| 990 | while (ndpoffset) { | 1014 | while (ndpoffset) { |
| 991 | ndp16 = (struct usb_cdc_ncm_ndp16 *)(skb->data + ndpoffset); | 1015 | ndp16 = (struct usb_cdc_ncm_ndp16 *)(skb->data + ndpoffset); |
| @@ -995,7 +1019,8 @@ static struct usb_cdc_ncm_ndp16 *cdc_ncm_ndp(struct cdc_ncm_ctx *ctx, struct sk_ | |||
| 995 | } | 1019 | } |
| 996 | 1020 | ||
| 997 | /* align new NDP */ | 1021 | /* align new NDP */ |
| 998 | cdc_ncm_align_tail(skb, ctx->tx_ndp_modulus, 0, ctx->tx_max); | 1022 | if (!(ctx->drvflags & CDC_NCM_FLAG_NDP_TO_END)) |
| 1023 | cdc_ncm_align_tail(skb, ctx->tx_ndp_modulus, 0, ctx->tx_max); | ||
| 999 | 1024 | ||
| 1000 | /* verify that there is room for the NDP and the datagram (reserve) */ | 1025 | /* verify that there is room for the NDP and the datagram (reserve) */ |
| 1001 | if ((ctx->tx_max - skb->len - reserve) < ctx->max_ndp_size) | 1026 | if ((ctx->tx_max - skb->len - reserve) < ctx->max_ndp_size) |
| @@ -1008,7 +1033,11 @@ static struct usb_cdc_ncm_ndp16 *cdc_ncm_ndp(struct cdc_ncm_ctx *ctx, struct sk_ | |||
| 1008 | nth16->wNdpIndex = cpu_to_le16(skb->len); | 1033 | nth16->wNdpIndex = cpu_to_le16(skb->len); |
| 1009 | 1034 | ||
| 1010 | /* push a new empty NDP */ | 1035 | /* push a new empty NDP */ |
| 1011 | ndp16 = (struct usb_cdc_ncm_ndp16 *)memset(skb_put(skb, ctx->max_ndp_size), 0, ctx->max_ndp_size); | 1036 | if (!(ctx->drvflags & CDC_NCM_FLAG_NDP_TO_END)) |
| 1037 | ndp16 = (struct usb_cdc_ncm_ndp16 *)memset(skb_put(skb, ctx->max_ndp_size), 0, ctx->max_ndp_size); | ||
| 1038 | else | ||
| 1039 | ndp16 = ctx->delayed_ndp16; | ||
| 1040 | |||
| 1012 | ndp16->dwSignature = sign; | 1041 | ndp16->dwSignature = sign; |
| 1013 | ndp16->wLength = cpu_to_le16(sizeof(struct usb_cdc_ncm_ndp16) + sizeof(struct usb_cdc_ncm_dpe16)); | 1042 | ndp16->wLength = cpu_to_le16(sizeof(struct usb_cdc_ncm_ndp16) + sizeof(struct usb_cdc_ncm_dpe16)); |
| 1014 | return ndp16; | 1043 | return ndp16; |
| @@ -1023,6 +1052,15 @@ cdc_ncm_fill_tx_frame(struct usbnet *dev, struct sk_buff *skb, __le32 sign) | |||
| 1023 | struct sk_buff *skb_out; | 1052 | struct sk_buff *skb_out; |
| 1024 | u16 n = 0, index, ndplen; | 1053 | u16 n = 0, index, ndplen; |
| 1025 | u8 ready2send = 0; | 1054 | u8 ready2send = 0; |
| 1055 | u32 delayed_ndp_size; | ||
| 1056 | |||
| 1057 | /* When our NDP gets written in cdc_ncm_ndp(), then skb_out->len gets updated | ||
| 1058 | * accordingly. Otherwise, we should check here. | ||
| 1059 | */ | ||
| 1060 | if (ctx->drvflags & CDC_NCM_FLAG_NDP_TO_END) | ||
| 1061 | delayed_ndp_size = ctx->max_ndp_size; | ||
| 1062 | else | ||
| 1063 | delayed_ndp_size = 0; | ||
| 1026 | 1064 | ||
| 1027 | /* if there is a remaining skb, it gets priority */ | 1065 | /* if there is a remaining skb, it gets priority */ |
| 1028 | if (skb != NULL) { | 1066 | if (skb != NULL) { |
| @@ -1077,7 +1115,7 @@ cdc_ncm_fill_tx_frame(struct usbnet *dev, struct sk_buff *skb, __le32 sign) | |||
| 1077 | cdc_ncm_align_tail(skb_out, ctx->tx_modulus, ctx->tx_remainder, ctx->tx_max); | 1115 | cdc_ncm_align_tail(skb_out, ctx->tx_modulus, ctx->tx_remainder, ctx->tx_max); |
| 1078 | 1116 | ||
| 1079 | /* check if we had enough room left for both NDP and frame */ | 1117 | /* check if we had enough room left for both NDP and frame */ |
| 1080 | if (!ndp16 || skb_out->len + skb->len > ctx->tx_max) { | 1118 | if (!ndp16 || skb_out->len + skb->len + delayed_ndp_size > ctx->tx_max) { |
| 1081 | if (n == 0) { | 1119 | if (n == 0) { |
| 1082 | /* won't fit, MTU problem? */ | 1120 | /* won't fit, MTU problem? */ |
| 1083 | dev_kfree_skb_any(skb); | 1121 | dev_kfree_skb_any(skb); |
| @@ -1150,6 +1188,17 @@ cdc_ncm_fill_tx_frame(struct usbnet *dev, struct sk_buff *skb, __le32 sign) | |||
| 1150 | /* variables will be reset at next call */ | 1188 | /* variables will be reset at next call */ |
| 1151 | } | 1189 | } |
| 1152 | 1190 | ||
| 1191 | /* If requested, put NDP at end of frame. */ | ||
| 1192 | if (ctx->drvflags & CDC_NCM_FLAG_NDP_TO_END) { | ||
| 1193 | nth16 = (struct usb_cdc_ncm_nth16 *)skb_out->data; | ||
| 1194 | cdc_ncm_align_tail(skb_out, ctx->tx_ndp_modulus, 0, ctx->tx_max); | ||
| 1195 | nth16->wNdpIndex = cpu_to_le16(skb_out->len); | ||
| 1196 | memcpy(skb_put(skb_out, ctx->max_ndp_size), ctx->delayed_ndp16, ctx->max_ndp_size); | ||
| 1197 | |||
| 1198 | /* Zero out delayed NDP - signature checking will naturally fail. */ | ||
| 1199 | ndp16 = memset(ctx->delayed_ndp16, 0, ctx->max_ndp_size); | ||
| 1200 | } | ||
| 1201 | |||
| 1153 | /* If collected data size is less or equal ctx->min_tx_pkt | 1202 | /* If collected data size is less or equal ctx->min_tx_pkt |
| 1154 | * bytes, we send buffers as it is. If we get more data, it | 1203 | * bytes, we send buffers as it is. If we get more data, it |
| 1155 | * would be more efficient for USB HS mobile device with DMA | 1204 | * would be more efficient for USB HS mobile device with DMA |
diff --git a/drivers/net/usb/huawei_cdc_ncm.c b/drivers/net/usb/huawei_cdc_ncm.c index 735f7dadb9a0..2680a65cd5e4 100644 --- a/drivers/net/usb/huawei_cdc_ncm.c +++ b/drivers/net/usb/huawei_cdc_ncm.c | |||
| @@ -73,11 +73,14 @@ static int huawei_cdc_ncm_bind(struct usbnet *usbnet_dev, | |||
| 73 | struct usb_driver *subdriver = ERR_PTR(-ENODEV); | 73 | struct usb_driver *subdriver = ERR_PTR(-ENODEV); |
| 74 | int ret = -ENODEV; | 74 | int ret = -ENODEV; |
| 75 | struct huawei_cdc_ncm_state *drvstate = (void *)&usbnet_dev->data; | 75 | struct huawei_cdc_ncm_state *drvstate = (void *)&usbnet_dev->data; |
| 76 | int drvflags = 0; | ||
| 76 | 77 | ||
| 77 | /* altsetting should always be 1 for NCM devices - so we hard-coded | 78 | /* altsetting should always be 1 for NCM devices - so we hard-coded |
| 78 | * it here | 79 | * it here. Some huawei devices will need the NDP part of the NCM package to |
| 80 | * be at the end of the frame. | ||
| 79 | */ | 81 | */ |
| 80 | ret = cdc_ncm_bind_common(usbnet_dev, intf, 1); | 82 | drvflags |= CDC_NCM_FLAG_NDP_TO_END; |
| 83 | ret = cdc_ncm_bind_common(usbnet_dev, intf, 1, drvflags); | ||
| 81 | if (ret) | 84 | if (ret) |
| 82 | goto err; | 85 | goto err; |
| 83 | 86 | ||
diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index aafa1a1898e4..7f6419ebb5e1 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c | |||
| @@ -494,6 +494,7 @@ enum rtl8152_flags { | |||
| 494 | #define VENDOR_ID_REALTEK 0x0bda | 494 | #define VENDOR_ID_REALTEK 0x0bda |
| 495 | #define VENDOR_ID_SAMSUNG 0x04e8 | 495 | #define VENDOR_ID_SAMSUNG 0x04e8 |
| 496 | #define VENDOR_ID_LENOVO 0x17ef | 496 | #define VENDOR_ID_LENOVO 0x17ef |
| 497 | #define VENDOR_ID_NVIDIA 0x0955 | ||
| 497 | 498 | ||
| 498 | #define MCU_TYPE_PLA 0x0100 | 499 | #define MCU_TYPE_PLA 0x0100 |
| 499 | #define MCU_TYPE_USB 0x0000 | 500 | #define MCU_TYPE_USB 0x0000 |
| @@ -4117,6 +4118,7 @@ static struct usb_device_id rtl8152_table[] = { | |||
| 4117 | {REALTEK_USB_DEVICE(VENDOR_ID_SAMSUNG, 0xa101)}, | 4118 | {REALTEK_USB_DEVICE(VENDOR_ID_SAMSUNG, 0xa101)}, |
| 4118 | {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x7205)}, | 4119 | {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x7205)}, |
| 4119 | {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x304f)}, | 4120 | {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x304f)}, |
| 4121 | {REALTEK_USB_DEVICE(VENDOR_ID_NVIDIA, 0x09ff)}, | ||
| 4120 | {} | 4122 | {} |
| 4121 | }; | 4123 | }; |
| 4122 | 4124 | ||
diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c index da11bb5e9c7f..46f4caddccbe 100644 --- a/drivers/net/vmxnet3/vmxnet3_drv.c +++ b/drivers/net/vmxnet3/vmxnet3_drv.c | |||
| @@ -1216,7 +1216,7 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq, | |||
| 1216 | static const u32 rxprod_reg[2] = { | 1216 | static const u32 rxprod_reg[2] = { |
| 1217 | VMXNET3_REG_RXPROD, VMXNET3_REG_RXPROD2 | 1217 | VMXNET3_REG_RXPROD, VMXNET3_REG_RXPROD2 |
| 1218 | }; | 1218 | }; |
| 1219 | u32 num_rxd = 0; | 1219 | u32 num_pkts = 0; |
| 1220 | bool skip_page_frags = false; | 1220 | bool skip_page_frags = false; |
| 1221 | struct Vmxnet3_RxCompDesc *rcd; | 1221 | struct Vmxnet3_RxCompDesc *rcd; |
| 1222 | struct vmxnet3_rx_ctx *ctx = &rq->rx_ctx; | 1222 | struct vmxnet3_rx_ctx *ctx = &rq->rx_ctx; |
| @@ -1235,13 +1235,12 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq, | |||
| 1235 | struct Vmxnet3_RxDesc *rxd; | 1235 | struct Vmxnet3_RxDesc *rxd; |
| 1236 | u32 idx, ring_idx; | 1236 | u32 idx, ring_idx; |
| 1237 | struct vmxnet3_cmd_ring *ring = NULL; | 1237 | struct vmxnet3_cmd_ring *ring = NULL; |
| 1238 | if (num_rxd >= quota) { | 1238 | if (num_pkts >= quota) { |
| 1239 | /* we may stop even before we see the EOP desc of | 1239 | /* we may stop even before we see the EOP desc of |
| 1240 | * the current pkt | 1240 | * the current pkt |
| 1241 | */ | 1241 | */ |
| 1242 | break; | 1242 | break; |
| 1243 | } | 1243 | } |
| 1244 | num_rxd++; | ||
| 1245 | BUG_ON(rcd->rqID != rq->qid && rcd->rqID != rq->qid2); | 1244 | BUG_ON(rcd->rqID != rq->qid && rcd->rqID != rq->qid2); |
| 1246 | idx = rcd->rxdIdx; | 1245 | idx = rcd->rxdIdx; |
| 1247 | ring_idx = rcd->rqID < adapter->num_rx_queues ? 0 : 1; | 1246 | ring_idx = rcd->rqID < adapter->num_rx_queues ? 0 : 1; |
| @@ -1413,6 +1412,7 @@ not_lro: | |||
| 1413 | napi_gro_receive(&rq->napi, skb); | 1412 | napi_gro_receive(&rq->napi, skb); |
| 1414 | 1413 | ||
| 1415 | ctx->skb = NULL; | 1414 | ctx->skb = NULL; |
| 1415 | num_pkts++; | ||
| 1416 | } | 1416 | } |
| 1417 | 1417 | ||
| 1418 | rcd_done: | 1418 | rcd_done: |
| @@ -1443,7 +1443,7 @@ rcd_done: | |||
| 1443 | &rq->comp_ring.base[rq->comp_ring.next2proc].rcd, &rxComp); | 1443 | &rq->comp_ring.base[rq->comp_ring.next2proc].rcd, &rxComp); |
| 1444 | } | 1444 | } |
| 1445 | 1445 | ||
| 1446 | return num_rxd; | 1446 | return num_pkts; |
| 1447 | } | 1447 | } |
| 1448 | 1448 | ||
| 1449 | 1449 | ||
diff --git a/drivers/net/wan/z85230.c b/drivers/net/wan/z85230.c index feacc3b994b7..2f0bd6955f33 100644 --- a/drivers/net/wan/z85230.c +++ b/drivers/net/wan/z85230.c | |||
| @@ -1044,7 +1044,7 @@ EXPORT_SYMBOL(z8530_sync_dma_close); | |||
| 1044 | * @dev: The network device to attach | 1044 | * @dev: The network device to attach |
| 1045 | * @c: The Z8530 channel to configure in sync DMA mode. | 1045 | * @c: The Z8530 channel to configure in sync DMA mode. |
| 1046 | * | 1046 | * |
| 1047 | * Set up a Z85x30 device for synchronous DMA tranmission. One | 1047 | * Set up a Z85x30 device for synchronous DMA transmission. One |
| 1048 | * ISA DMA channel must be available for this to work. The receive | 1048 | * ISA DMA channel must be available for this to work. The receive |
| 1049 | * side is run in PIO mode, but then it has the bigger FIFO. | 1049 | * side is run in PIO mode, but then it has the bigger FIFO. |
| 1050 | */ | 1050 | */ |
diff --git a/drivers/pinctrl/spear/pinctrl-spear.c b/drivers/pinctrl/spear/pinctrl-spear.c index f87a5eaf75da..0afaf79a4e51 100644 --- a/drivers/pinctrl/spear/pinctrl-spear.c +++ b/drivers/pinctrl/spear/pinctrl-spear.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * Driver for the ST Microelectronics SPEAr pinmux | 2 | * Driver for the ST Microelectronics SPEAr pinmux |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2012 ST Microelectronics | 4 | * Copyright (C) 2012 ST Microelectronics |
| 5 | * Viresh Kumar <viresh.linux@gmail.com> | 5 | * Viresh Kumar <vireshk@kernel.org> |
| 6 | * | 6 | * |
| 7 | * Inspired from: | 7 | * Inspired from: |
| 8 | * - U300 Pinctl drivers | 8 | * - U300 Pinctl drivers |
diff --git a/drivers/pinctrl/spear/pinctrl-spear.h b/drivers/pinctrl/spear/pinctrl-spear.h index dc8bf85ecb2a..27c2cc8d83ad 100644 --- a/drivers/pinctrl/spear/pinctrl-spear.h +++ b/drivers/pinctrl/spear/pinctrl-spear.h | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * Driver header file for the ST Microelectronics SPEAr pinmux | 2 | * Driver header file for the ST Microelectronics SPEAr pinmux |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2012 ST Microelectronics | 4 | * Copyright (C) 2012 ST Microelectronics |
| 5 | * Viresh Kumar <viresh.linux@gmail.com> | 5 | * Viresh Kumar <vireshk@kernel.org> |
| 6 | * | 6 | * |
| 7 | * This file is licensed under the terms of the GNU General Public | 7 | * This file is licensed under the terms of the GNU General Public |
| 8 | * License version 2. This program is licensed "as is" without any | 8 | * License version 2. This program is licensed "as is" without any |
diff --git a/drivers/pinctrl/spear/pinctrl-spear1310.c b/drivers/pinctrl/spear/pinctrl-spear1310.c index a7bdc537efa7..92611bb757ac 100644 --- a/drivers/pinctrl/spear/pinctrl-spear1310.c +++ b/drivers/pinctrl/spear/pinctrl-spear1310.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * Driver for the ST Microelectronics SPEAr1310 pinmux | 2 | * Driver for the ST Microelectronics SPEAr1310 pinmux |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2012 ST Microelectronics | 4 | * Copyright (C) 2012 ST Microelectronics |
| 5 | * Viresh Kumar <viresh.linux@gmail.com> | 5 | * Viresh Kumar <vireshk@kernel.org> |
| 6 | * | 6 | * |
| 7 | * This file is licensed under the terms of the GNU General Public | 7 | * This file is licensed under the terms of the GNU General Public |
| 8 | * License version 2. This program is licensed "as is" without any | 8 | * License version 2. This program is licensed "as is" without any |
| @@ -2730,7 +2730,7 @@ static void __exit spear1310_pinctrl_exit(void) | |||
| 2730 | } | 2730 | } |
| 2731 | module_exit(spear1310_pinctrl_exit); | 2731 | module_exit(spear1310_pinctrl_exit); |
| 2732 | 2732 | ||
| 2733 | MODULE_AUTHOR("Viresh Kumar <viresh.linux@gmail.com>"); | 2733 | MODULE_AUTHOR("Viresh Kumar <vireshk@kernel.org>"); |
| 2734 | MODULE_DESCRIPTION("ST Microelectronics SPEAr1310 pinctrl driver"); | 2734 | MODULE_DESCRIPTION("ST Microelectronics SPEAr1310 pinctrl driver"); |
| 2735 | MODULE_LICENSE("GPL v2"); | 2735 | MODULE_LICENSE("GPL v2"); |
| 2736 | MODULE_DEVICE_TABLE(of, spear1310_pinctrl_of_match); | 2736 | MODULE_DEVICE_TABLE(of, spear1310_pinctrl_of_match); |
diff --git a/drivers/pinctrl/spear/pinctrl-spear1340.c b/drivers/pinctrl/spear/pinctrl-spear1340.c index f43ec85a0328..f842e9dc40d0 100644 --- a/drivers/pinctrl/spear/pinctrl-spear1340.c +++ b/drivers/pinctrl/spear/pinctrl-spear1340.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * Driver for the ST Microelectronics SPEAr1340 pinmux | 2 | * Driver for the ST Microelectronics SPEAr1340 pinmux |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2012 ST Microelectronics | 4 | * Copyright (C) 2012 ST Microelectronics |
| 5 | * Viresh Kumar <viresh.linux@gmail.com> | 5 | * Viresh Kumar <vireshk@kernel.org> |
| 6 | * | 6 | * |
| 7 | * This file is licensed under the terms of the GNU General Public | 7 | * This file is licensed under the terms of the GNU General Public |
| 8 | * License version 2. This program is licensed "as is" without any | 8 | * License version 2. This program is licensed "as is" without any |
| @@ -2046,7 +2046,7 @@ static void __exit spear1340_pinctrl_exit(void) | |||
| 2046 | } | 2046 | } |
| 2047 | module_exit(spear1340_pinctrl_exit); | 2047 | module_exit(spear1340_pinctrl_exit); |
| 2048 | 2048 | ||
| 2049 | MODULE_AUTHOR("Viresh Kumar <viresh.linux@gmail.com>"); | 2049 | MODULE_AUTHOR("Viresh Kumar <vireshk@kernel.org>"); |
| 2050 | MODULE_DESCRIPTION("ST Microelectronics SPEAr1340 pinctrl driver"); | 2050 | MODULE_DESCRIPTION("ST Microelectronics SPEAr1340 pinctrl driver"); |
| 2051 | MODULE_LICENSE("GPL v2"); | 2051 | MODULE_LICENSE("GPL v2"); |
| 2052 | MODULE_DEVICE_TABLE(of, spear1340_pinctrl_of_match); | 2052 | MODULE_DEVICE_TABLE(of, spear1340_pinctrl_of_match); |
diff --git a/drivers/pinctrl/spear/pinctrl-spear300.c b/drivers/pinctrl/spear/pinctrl-spear300.c index da8990a8eeef..d998a2ccff48 100644 --- a/drivers/pinctrl/spear/pinctrl-spear300.c +++ b/drivers/pinctrl/spear/pinctrl-spear300.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * Driver for the ST Microelectronics SPEAr300 pinmux | 2 | * Driver for the ST Microelectronics SPEAr300 pinmux |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2012 ST Microelectronics | 4 | * Copyright (C) 2012 ST Microelectronics |
| 5 | * Viresh Kumar <viresh.linux@gmail.com> | 5 | * Viresh Kumar <vireshk@kernel.org> |
| 6 | * | 6 | * |
| 7 | * This file is licensed under the terms of the GNU General Public | 7 | * This file is licensed under the terms of the GNU General Public |
| 8 | * License version 2. This program is licensed "as is" without any | 8 | * License version 2. This program is licensed "as is" without any |
| @@ -703,7 +703,7 @@ static void __exit spear300_pinctrl_exit(void) | |||
| 703 | } | 703 | } |
| 704 | module_exit(spear300_pinctrl_exit); | 704 | module_exit(spear300_pinctrl_exit); |
| 705 | 705 | ||
| 706 | MODULE_AUTHOR("Viresh Kumar <viresh.linux@gmail.com>"); | 706 | MODULE_AUTHOR("Viresh Kumar <vireshk@kernel.org>"); |
| 707 | MODULE_DESCRIPTION("ST Microelectronics SPEAr300 pinctrl driver"); | 707 | MODULE_DESCRIPTION("ST Microelectronics SPEAr300 pinctrl driver"); |
| 708 | MODULE_LICENSE("GPL v2"); | 708 | MODULE_LICENSE("GPL v2"); |
| 709 | MODULE_DEVICE_TABLE(of, spear300_pinctrl_of_match); | 709 | MODULE_DEVICE_TABLE(of, spear300_pinctrl_of_match); |
diff --git a/drivers/pinctrl/spear/pinctrl-spear310.c b/drivers/pinctrl/spear/pinctrl-spear310.c index 31ede51e819b..609b18aceb16 100644 --- a/drivers/pinctrl/spear/pinctrl-spear310.c +++ b/drivers/pinctrl/spear/pinctrl-spear310.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * Driver for the ST Microelectronics SPEAr310 pinmux | 2 | * Driver for the ST Microelectronics SPEAr310 pinmux |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2012 ST Microelectronics | 4 | * Copyright (C) 2012 ST Microelectronics |
| 5 | * Viresh Kumar <viresh.linux@gmail.com> | 5 | * Viresh Kumar <vireshk@kernel.org> |
| 6 | * | 6 | * |
| 7 | * This file is licensed under the terms of the GNU General Public | 7 | * This file is licensed under the terms of the GNU General Public |
| 8 | * License version 2. This program is licensed "as is" without any | 8 | * License version 2. This program is licensed "as is" without any |
| @@ -426,7 +426,7 @@ static void __exit spear310_pinctrl_exit(void) | |||
| 426 | } | 426 | } |
| 427 | module_exit(spear310_pinctrl_exit); | 427 | module_exit(spear310_pinctrl_exit); |
| 428 | 428 | ||
| 429 | MODULE_AUTHOR("Viresh Kumar <viresh.linux@gmail.com>"); | 429 | MODULE_AUTHOR("Viresh Kumar <vireshk@kernel.org>"); |
| 430 | MODULE_DESCRIPTION("ST Microelectronics SPEAr310 pinctrl driver"); | 430 | MODULE_DESCRIPTION("ST Microelectronics SPEAr310 pinctrl driver"); |
| 431 | MODULE_LICENSE("GPL v2"); | 431 | MODULE_LICENSE("GPL v2"); |
| 432 | MODULE_DEVICE_TABLE(of, spear310_pinctrl_of_match); | 432 | MODULE_DEVICE_TABLE(of, spear310_pinctrl_of_match); |
diff --git a/drivers/pinctrl/spear/pinctrl-spear320.c b/drivers/pinctrl/spear/pinctrl-spear320.c index 506e40b641e0..c07114431bd4 100644 --- a/drivers/pinctrl/spear/pinctrl-spear320.c +++ b/drivers/pinctrl/spear/pinctrl-spear320.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * Driver for the ST Microelectronics SPEAr320 pinmux | 2 | * Driver for the ST Microelectronics SPEAr320 pinmux |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2012 ST Microelectronics | 4 | * Copyright (C) 2012 ST Microelectronics |
| 5 | * Viresh Kumar <viresh.linux@gmail.com> | 5 | * Viresh Kumar <vireshk@kernel.org> |
| 6 | * | 6 | * |
| 7 | * This file is licensed under the terms of the GNU General Public | 7 | * This file is licensed under the terms of the GNU General Public |
| 8 | * License version 2. This program is licensed "as is" without any | 8 | * License version 2. This program is licensed "as is" without any |
| @@ -3467,7 +3467,7 @@ static void __exit spear320_pinctrl_exit(void) | |||
| 3467 | } | 3467 | } |
| 3468 | module_exit(spear320_pinctrl_exit); | 3468 | module_exit(spear320_pinctrl_exit); |
| 3469 | 3469 | ||
| 3470 | MODULE_AUTHOR("Viresh Kumar <viresh.linux@gmail.com>"); | 3470 | MODULE_AUTHOR("Viresh Kumar <vireshk@kernel.org>"); |
| 3471 | MODULE_DESCRIPTION("ST Microelectronics SPEAr320 pinctrl driver"); | 3471 | MODULE_DESCRIPTION("ST Microelectronics SPEAr320 pinctrl driver"); |
| 3472 | MODULE_LICENSE("GPL v2"); | 3472 | MODULE_LICENSE("GPL v2"); |
| 3473 | MODULE_DEVICE_TABLE(of, spear320_pinctrl_of_match); | 3473 | MODULE_DEVICE_TABLE(of, spear320_pinctrl_of_match); |
diff --git a/drivers/pinctrl/spear/pinctrl-spear3xx.c b/drivers/pinctrl/spear/pinctrl-spear3xx.c index 12ee21af766b..d3119aafe709 100644 --- a/drivers/pinctrl/spear/pinctrl-spear3xx.c +++ b/drivers/pinctrl/spear/pinctrl-spear3xx.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * Driver for the ST Microelectronics SPEAr3xx pinmux | 2 | * Driver for the ST Microelectronics SPEAr3xx pinmux |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2012 ST Microelectronics | 4 | * Copyright (C) 2012 ST Microelectronics |
| 5 | * Viresh Kumar <viresh.linux@gmail.com> | 5 | * Viresh Kumar <vireshk@kernel.org> |
| 6 | * | 6 | * |
| 7 | * This file is licensed under the terms of the GNU General Public | 7 | * This file is licensed under the terms of the GNU General Public |
| 8 | * License version 2. This program is licensed "as is" without any | 8 | * License version 2. This program is licensed "as is" without any |
diff --git a/drivers/pinctrl/spear/pinctrl-spear3xx.h b/drivers/pinctrl/spear/pinctrl-spear3xx.h index 7860b36053c4..ce19dcf8f08b 100644 --- a/drivers/pinctrl/spear/pinctrl-spear3xx.h +++ b/drivers/pinctrl/spear/pinctrl-spear3xx.h | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * Header file for the ST Microelectronics SPEAr3xx pinmux | 2 | * Header file for the ST Microelectronics SPEAr3xx pinmux |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2012 ST Microelectronics | 4 | * Copyright (C) 2012 ST Microelectronics |
| 5 | * Viresh Kumar <viresh.linux@gmail.com> | 5 | * Viresh Kumar <vireshk@kernel.org> |
| 6 | * | 6 | * |
| 7 | * This file is licensed under the terms of the GNU General Public | 7 | * This file is licensed under the terms of the GNU General Public |
| 8 | * License version 2. This program is licensed "as is" without any | 8 | * License version 2. This program is licensed "as is" without any |
diff --git a/drivers/platform/x86/dell-laptop.c b/drivers/platform/x86/dell-laptop.c index ed317ccac4a2..aaeeae81e3a9 100644 --- a/drivers/platform/x86/dell-laptop.c +++ b/drivers/platform/x86/dell-laptop.c | |||
| @@ -309,12 +309,15 @@ static const struct dmi_system_id dell_quirks[] __initconst = { | |||
| 309 | static struct calling_interface_buffer *buffer; | 309 | static struct calling_interface_buffer *buffer; |
| 310 | static DEFINE_MUTEX(buffer_mutex); | 310 | static DEFINE_MUTEX(buffer_mutex); |
| 311 | 311 | ||
| 312 | static int hwswitch_state; | 312 | static void clear_buffer(void) |
| 313 | { | ||
| 314 | memset(buffer, 0, sizeof(struct calling_interface_buffer)); | ||
| 315 | } | ||
| 313 | 316 | ||
| 314 | static void get_buffer(void) | 317 | static void get_buffer(void) |
| 315 | { | 318 | { |
| 316 | mutex_lock(&buffer_mutex); | 319 | mutex_lock(&buffer_mutex); |
| 317 | memset(buffer, 0, sizeof(struct calling_interface_buffer)); | 320 | clear_buffer(); |
| 318 | } | 321 | } |
| 319 | 322 | ||
| 320 | static void release_buffer(void) | 323 | static void release_buffer(void) |
| @@ -548,21 +551,41 @@ static int dell_rfkill_set(void *data, bool blocked) | |||
| 548 | int disable = blocked ? 1 : 0; | 551 | int disable = blocked ? 1 : 0; |
| 549 | unsigned long radio = (unsigned long)data; | 552 | unsigned long radio = (unsigned long)data; |
| 550 | int hwswitch_bit = (unsigned long)data - 1; | 553 | int hwswitch_bit = (unsigned long)data - 1; |
| 554 | int hwswitch; | ||
| 555 | int status; | ||
| 556 | int ret; | ||
| 551 | 557 | ||
| 552 | get_buffer(); | 558 | get_buffer(); |
| 559 | |||
| 560 | dell_send_request(buffer, 17, 11); | ||
| 561 | ret = buffer->output[0]; | ||
| 562 | status = buffer->output[1]; | ||
| 563 | |||
| 564 | if (ret != 0) | ||
| 565 | goto out; | ||
| 566 | |||
| 567 | clear_buffer(); | ||
| 568 | |||
| 569 | buffer->input[0] = 0x2; | ||
| 553 | dell_send_request(buffer, 17, 11); | 570 | dell_send_request(buffer, 17, 11); |
| 571 | ret = buffer->output[0]; | ||
| 572 | hwswitch = buffer->output[1]; | ||
| 554 | 573 | ||
| 555 | /* If the hardware switch controls this radio, and the hardware | 574 | /* If the hardware switch controls this radio, and the hardware |
| 556 | switch is disabled, always disable the radio */ | 575 | switch is disabled, always disable the radio */ |
| 557 | if ((hwswitch_state & BIT(hwswitch_bit)) && | 576 | if (ret == 0 && (hwswitch & BIT(hwswitch_bit)) && |
| 558 | !(buffer->output[1] & BIT(16))) | 577 | (status & BIT(0)) && !(status & BIT(16))) |
| 559 | disable = 1; | 578 | disable = 1; |
| 560 | 579 | ||
| 580 | clear_buffer(); | ||
| 581 | |||
| 561 | buffer->input[0] = (1 | (radio<<8) | (disable << 16)); | 582 | buffer->input[0] = (1 | (radio<<8) | (disable << 16)); |
| 562 | dell_send_request(buffer, 17, 11); | 583 | dell_send_request(buffer, 17, 11); |
| 584 | ret = buffer->output[0]; | ||
| 563 | 585 | ||
| 586 | out: | ||
| 564 | release_buffer(); | 587 | release_buffer(); |
| 565 | return 0; | 588 | return dell_smi_error(ret); |
| 566 | } | 589 | } |
| 567 | 590 | ||
| 568 | /* Must be called with the buffer held */ | 591 | /* Must be called with the buffer held */ |
| @@ -572,6 +595,7 @@ static void dell_rfkill_update_sw_state(struct rfkill *rfkill, int radio, | |||
| 572 | if (status & BIT(0)) { | 595 | if (status & BIT(0)) { |
| 573 | /* Has hw-switch, sync sw_state to BIOS */ | 596 | /* Has hw-switch, sync sw_state to BIOS */ |
| 574 | int block = rfkill_blocked(rfkill); | 597 | int block = rfkill_blocked(rfkill); |
| 598 | clear_buffer(); | ||
| 575 | buffer->input[0] = (1 | (radio << 8) | (block << 16)); | 599 | buffer->input[0] = (1 | (radio << 8) | (block << 16)); |
| 576 | dell_send_request(buffer, 17, 11); | 600 | dell_send_request(buffer, 17, 11); |
| 577 | } else { | 601 | } else { |
| @@ -581,23 +605,43 @@ static void dell_rfkill_update_sw_state(struct rfkill *rfkill, int radio, | |||
| 581 | } | 605 | } |
| 582 | 606 | ||
| 583 | static void dell_rfkill_update_hw_state(struct rfkill *rfkill, int radio, | 607 | static void dell_rfkill_update_hw_state(struct rfkill *rfkill, int radio, |
| 584 | int status) | 608 | int status, int hwswitch) |
| 585 | { | 609 | { |
| 586 | if (hwswitch_state & (BIT(radio - 1))) | 610 | if (hwswitch & (BIT(radio - 1))) |
| 587 | rfkill_set_hw_state(rfkill, !(status & BIT(16))); | 611 | rfkill_set_hw_state(rfkill, !(status & BIT(16))); |
| 588 | } | 612 | } |
| 589 | 613 | ||
| 590 | static void dell_rfkill_query(struct rfkill *rfkill, void *data) | 614 | static void dell_rfkill_query(struct rfkill *rfkill, void *data) |
| 591 | { | 615 | { |
| 616 | int radio = ((unsigned long)data & 0xF); | ||
| 617 | int hwswitch; | ||
| 592 | int status; | 618 | int status; |
| 619 | int ret; | ||
| 593 | 620 | ||
| 594 | get_buffer(); | 621 | get_buffer(); |
| 622 | |||
| 595 | dell_send_request(buffer, 17, 11); | 623 | dell_send_request(buffer, 17, 11); |
| 624 | ret = buffer->output[0]; | ||
| 596 | status = buffer->output[1]; | 625 | status = buffer->output[1]; |
| 597 | 626 | ||
| 598 | dell_rfkill_update_hw_state(rfkill, (unsigned long)data, status); | 627 | if (ret != 0 || !(status & BIT(0))) { |
| 628 | release_buffer(); | ||
| 629 | return; | ||
| 630 | } | ||
| 631 | |||
| 632 | clear_buffer(); | ||
| 633 | |||
| 634 | buffer->input[0] = 0x2; | ||
| 635 | dell_send_request(buffer, 17, 11); | ||
| 636 | ret = buffer->output[0]; | ||
| 637 | hwswitch = buffer->output[1]; | ||
| 599 | 638 | ||
| 600 | release_buffer(); | 639 | release_buffer(); |
| 640 | |||
| 641 | if (ret != 0) | ||
| 642 | return; | ||
| 643 | |||
| 644 | dell_rfkill_update_hw_state(rfkill, radio, status, hwswitch); | ||
| 601 | } | 645 | } |
| 602 | 646 | ||
| 603 | static const struct rfkill_ops dell_rfkill_ops = { | 647 | static const struct rfkill_ops dell_rfkill_ops = { |
| @@ -609,13 +653,27 @@ static struct dentry *dell_laptop_dir; | |||
| 609 | 653 | ||
| 610 | static int dell_debugfs_show(struct seq_file *s, void *data) | 654 | static int dell_debugfs_show(struct seq_file *s, void *data) |
| 611 | { | 655 | { |
| 656 | int hwswitch_state; | ||
| 657 | int hwswitch_ret; | ||
| 612 | int status; | 658 | int status; |
| 659 | int ret; | ||
| 613 | 660 | ||
| 614 | get_buffer(); | 661 | get_buffer(); |
| 662 | |||
| 615 | dell_send_request(buffer, 17, 11); | 663 | dell_send_request(buffer, 17, 11); |
| 664 | ret = buffer->output[0]; | ||
| 616 | status = buffer->output[1]; | 665 | status = buffer->output[1]; |
| 666 | |||
| 667 | clear_buffer(); | ||
| 668 | |||
| 669 | buffer->input[0] = 0x2; | ||
| 670 | dell_send_request(buffer, 17, 11); | ||
| 671 | hwswitch_ret = buffer->output[0]; | ||
| 672 | hwswitch_state = buffer->output[1]; | ||
| 673 | |||
| 617 | release_buffer(); | 674 | release_buffer(); |
| 618 | 675 | ||
| 676 | seq_printf(s, "return:\t%d\n", ret); | ||
| 619 | seq_printf(s, "status:\t0x%X\n", status); | 677 | seq_printf(s, "status:\t0x%X\n", status); |
| 620 | seq_printf(s, "Bit 0 : Hardware switch supported: %lu\n", | 678 | seq_printf(s, "Bit 0 : Hardware switch supported: %lu\n", |
| 621 | status & BIT(0)); | 679 | status & BIT(0)); |
| @@ -657,7 +715,8 @@ static int dell_debugfs_show(struct seq_file *s, void *data) | |||
| 657 | seq_printf(s, "Bit 21: WiGig is blocked: %lu\n", | 715 | seq_printf(s, "Bit 21: WiGig is blocked: %lu\n", |
| 658 | (status & BIT(21)) >> 21); | 716 | (status & BIT(21)) >> 21); |
| 659 | 717 | ||
| 660 | seq_printf(s, "\nhwswitch_state:\t0x%X\n", hwswitch_state); | 718 | seq_printf(s, "\nhwswitch_return:\t%d\n", hwswitch_ret); |
| 719 | seq_printf(s, "hwswitch_state:\t0x%X\n", hwswitch_state); | ||
| 661 | seq_printf(s, "Bit 0 : Wifi controlled by switch: %lu\n", | 720 | seq_printf(s, "Bit 0 : Wifi controlled by switch: %lu\n", |
| 662 | hwswitch_state & BIT(0)); | 721 | hwswitch_state & BIT(0)); |
| 663 | seq_printf(s, "Bit 1 : Bluetooth controlled by switch: %lu\n", | 722 | seq_printf(s, "Bit 1 : Bluetooth controlled by switch: %lu\n", |
| @@ -693,25 +752,43 @@ static const struct file_operations dell_debugfs_fops = { | |||
| 693 | 752 | ||
| 694 | static void dell_update_rfkill(struct work_struct *ignored) | 753 | static void dell_update_rfkill(struct work_struct *ignored) |
| 695 | { | 754 | { |
| 755 | int hwswitch = 0; | ||
| 696 | int status; | 756 | int status; |
| 757 | int ret; | ||
| 697 | 758 | ||
| 698 | get_buffer(); | 759 | get_buffer(); |
| 760 | |||
| 699 | dell_send_request(buffer, 17, 11); | 761 | dell_send_request(buffer, 17, 11); |
| 762 | ret = buffer->output[0]; | ||
| 700 | status = buffer->output[1]; | 763 | status = buffer->output[1]; |
| 701 | 764 | ||
| 765 | if (ret != 0) | ||
| 766 | goto out; | ||
| 767 | |||
| 768 | clear_buffer(); | ||
| 769 | |||
| 770 | buffer->input[0] = 0x2; | ||
| 771 | dell_send_request(buffer, 17, 11); | ||
| 772 | ret = buffer->output[0]; | ||
| 773 | |||
| 774 | if (ret == 0 && (status & BIT(0))) | ||
| 775 | hwswitch = buffer->output[1]; | ||
| 776 | |||
| 702 | if (wifi_rfkill) { | 777 | if (wifi_rfkill) { |
| 703 | dell_rfkill_update_hw_state(wifi_rfkill, 1, status); | 778 | dell_rfkill_update_hw_state(wifi_rfkill, 1, status, hwswitch); |
| 704 | dell_rfkill_update_sw_state(wifi_rfkill, 1, status); | 779 | dell_rfkill_update_sw_state(wifi_rfkill, 1, status); |
| 705 | } | 780 | } |
| 706 | if (bluetooth_rfkill) { | 781 | if (bluetooth_rfkill) { |
| 707 | dell_rfkill_update_hw_state(bluetooth_rfkill, 2, status); | 782 | dell_rfkill_update_hw_state(bluetooth_rfkill, 2, status, |
| 783 | hwswitch); | ||
| 708 | dell_rfkill_update_sw_state(bluetooth_rfkill, 2, status); | 784 | dell_rfkill_update_sw_state(bluetooth_rfkill, 2, status); |
| 709 | } | 785 | } |
| 710 | if (wwan_rfkill) { | 786 | if (wwan_rfkill) { |
| 711 | dell_rfkill_update_hw_state(wwan_rfkill, 3, status); | 787 | dell_rfkill_update_hw_state(wwan_rfkill, 3, status, hwswitch); |
| 712 | dell_rfkill_update_sw_state(wwan_rfkill, 3, status); | 788 | dell_rfkill_update_sw_state(wwan_rfkill, 3, status); |
| 713 | } | 789 | } |
| 714 | 790 | ||
| 791 | out: | ||
| 715 | release_buffer(); | 792 | release_buffer(); |
| 716 | } | 793 | } |
| 717 | static DECLARE_DELAYED_WORK(dell_rfkill_work, dell_update_rfkill); | 794 | static DECLARE_DELAYED_WORK(dell_rfkill_work, dell_update_rfkill); |
| @@ -773,21 +850,17 @@ static int __init dell_setup_rfkill(void) | |||
| 773 | 850 | ||
| 774 | get_buffer(); | 851 | get_buffer(); |
| 775 | dell_send_request(buffer, 17, 11); | 852 | dell_send_request(buffer, 17, 11); |
| 853 | ret = buffer->output[0]; | ||
| 776 | status = buffer->output[1]; | 854 | status = buffer->output[1]; |
| 777 | buffer->input[0] = 0x2; | ||
| 778 | dell_send_request(buffer, 17, 11); | ||
| 779 | hwswitch_state = buffer->output[1]; | ||
| 780 | release_buffer(); | 855 | release_buffer(); |
| 781 | 856 | ||
| 782 | if (!(status & BIT(0))) { | 857 | /* dell wireless info smbios call is not supported */ |
| 783 | if (force_rfkill) { | 858 | if (ret != 0) |
| 784 | /* No hwsitch, clear all hw-controlled bits */ | 859 | return 0; |
| 785 | hwswitch_state &= ~7; | 860 | |
| 786 | } else { | 861 | /* rfkill is only tested on laptops with a hwswitch */ |
| 787 | /* rfkill is only tested on laptops with a hwswitch */ | 862 | if (!(status & BIT(0)) && !force_rfkill) |
| 788 | return 0; | 863 | return 0; |
| 789 | } | ||
| 790 | } | ||
| 791 | 864 | ||
| 792 | if ((status & (1<<2|1<<8)) == (1<<2|1<<8)) { | 865 | if ((status & (1<<2|1<<8)) == (1<<2|1<<8)) { |
| 793 | wifi_rfkill = rfkill_alloc("dell-wifi", &platform_device->dev, | 866 | wifi_rfkill = rfkill_alloc("dell-wifi", &platform_device->dev, |
| @@ -932,47 +1005,50 @@ static void dell_cleanup_rfkill(void) | |||
| 932 | 1005 | ||
| 933 | static int dell_send_intensity(struct backlight_device *bd) | 1006 | static int dell_send_intensity(struct backlight_device *bd) |
| 934 | { | 1007 | { |
| 935 | int ret = 0; | 1008 | int token; |
| 1009 | int ret; | ||
| 1010 | |||
| 1011 | token = find_token_location(BRIGHTNESS_TOKEN); | ||
| 1012 | if (token == -1) | ||
| 1013 | return -ENODEV; | ||
| 936 | 1014 | ||
| 937 | get_buffer(); | 1015 | get_buffer(); |
| 938 | buffer->input[0] = find_token_location(BRIGHTNESS_TOKEN); | 1016 | buffer->input[0] = token; |
| 939 | buffer->input[1] = bd->props.brightness; | 1017 | buffer->input[1] = bd->props.brightness; |
| 940 | 1018 | ||
| 941 | if (buffer->input[0] == -1) { | ||
| 942 | ret = -ENODEV; | ||
| 943 | goto out; | ||
| 944 | } | ||
| 945 | |||
| 946 | if (power_supply_is_system_supplied() > 0) | 1019 | if (power_supply_is_system_supplied() > 0) |
| 947 | dell_send_request(buffer, 1, 2); | 1020 | dell_send_request(buffer, 1, 2); |
| 948 | else | 1021 | else |
| 949 | dell_send_request(buffer, 1, 1); | 1022 | dell_send_request(buffer, 1, 1); |
| 950 | 1023 | ||
| 951 | out: | 1024 | ret = dell_smi_error(buffer->output[0]); |
| 1025 | |||
| 952 | release_buffer(); | 1026 | release_buffer(); |
| 953 | return ret; | 1027 | return ret; |
| 954 | } | 1028 | } |
| 955 | 1029 | ||
| 956 | static int dell_get_intensity(struct backlight_device *bd) | 1030 | static int dell_get_intensity(struct backlight_device *bd) |
| 957 | { | 1031 | { |
| 958 | int ret = 0; | 1032 | int token; |
| 1033 | int ret; | ||
| 959 | 1034 | ||
| 960 | get_buffer(); | 1035 | token = find_token_location(BRIGHTNESS_TOKEN); |
| 961 | buffer->input[0] = find_token_location(BRIGHTNESS_TOKEN); | 1036 | if (token == -1) |
| 1037 | return -ENODEV; | ||
| 962 | 1038 | ||
| 963 | if (buffer->input[0] == -1) { | 1039 | get_buffer(); |
| 964 | ret = -ENODEV; | 1040 | buffer->input[0] = token; |
| 965 | goto out; | ||
| 966 | } | ||
| 967 | 1041 | ||
| 968 | if (power_supply_is_system_supplied() > 0) | 1042 | if (power_supply_is_system_supplied() > 0) |
| 969 | dell_send_request(buffer, 0, 2); | 1043 | dell_send_request(buffer, 0, 2); |
| 970 | else | 1044 | else |
| 971 | dell_send_request(buffer, 0, 1); | 1045 | dell_send_request(buffer, 0, 1); |
| 972 | 1046 | ||
| 973 | ret = buffer->output[1]; | 1047 | if (buffer->output[0]) |
| 1048 | ret = dell_smi_error(buffer->output[0]); | ||
| 1049 | else | ||
| 1050 | ret = buffer->output[1]; | ||
| 974 | 1051 | ||
| 975 | out: | ||
| 976 | release_buffer(); | 1052 | release_buffer(); |
| 977 | return ret; | 1053 | return ret; |
| 978 | } | 1054 | } |
| @@ -2036,6 +2112,7 @@ static void kbd_led_exit(void) | |||
| 2036 | static int __init dell_init(void) | 2112 | static int __init dell_init(void) |
| 2037 | { | 2113 | { |
| 2038 | int max_intensity = 0; | 2114 | int max_intensity = 0; |
| 2115 | int token; | ||
| 2039 | int ret; | 2116 | int ret; |
| 2040 | 2117 | ||
| 2041 | if (!dmi_check_system(dell_device_table)) | 2118 | if (!dmi_check_system(dell_device_table)) |
| @@ -2094,13 +2171,15 @@ static int __init dell_init(void) | |||
| 2094 | if (acpi_video_get_backlight_type() != acpi_backlight_vendor) | 2171 | if (acpi_video_get_backlight_type() != acpi_backlight_vendor) |
| 2095 | return 0; | 2172 | return 0; |
| 2096 | 2173 | ||
| 2097 | get_buffer(); | 2174 | token = find_token_location(BRIGHTNESS_TOKEN); |
| 2098 | buffer->input[0] = find_token_location(BRIGHTNESS_TOKEN); | 2175 | if (token != -1) { |
| 2099 | if (buffer->input[0] != -1) { | 2176 | get_buffer(); |
| 2177 | buffer->input[0] = token; | ||
| 2100 | dell_send_request(buffer, 0, 2); | 2178 | dell_send_request(buffer, 0, 2); |
| 2101 | max_intensity = buffer->output[3]; | 2179 | if (buffer->output[0] == 0) |
| 2180 | max_intensity = buffer->output[3]; | ||
| 2181 | release_buffer(); | ||
| 2102 | } | 2182 | } |
| 2103 | release_buffer(); | ||
| 2104 | 2183 | ||
| 2105 | if (max_intensity) { | 2184 | if (max_intensity) { |
| 2106 | struct backlight_properties props; | 2185 | struct backlight_properties props; |
diff --git a/drivers/platform/x86/intel_pmc_ipc.c b/drivers/platform/x86/intel_pmc_ipc.c index d734763dab69..105cfffe82c6 100644 --- a/drivers/platform/x86/intel_pmc_ipc.c +++ b/drivers/platform/x86/intel_pmc_ipc.c | |||
| @@ -96,18 +96,18 @@ static struct intel_pmc_ipc_dev { | |||
| 96 | struct completion cmd_complete; | 96 | struct completion cmd_complete; |
| 97 | 97 | ||
| 98 | /* The following PMC BARs share the same ACPI device with the IPC */ | 98 | /* The following PMC BARs share the same ACPI device with the IPC */ |
| 99 | void *acpi_io_base; | 99 | resource_size_t acpi_io_base; |
| 100 | int acpi_io_size; | 100 | int acpi_io_size; |
| 101 | struct platform_device *tco_dev; | 101 | struct platform_device *tco_dev; |
| 102 | 102 | ||
| 103 | /* gcr */ | 103 | /* gcr */ |
| 104 | void *gcr_base; | 104 | resource_size_t gcr_base; |
| 105 | int gcr_size; | 105 | int gcr_size; |
| 106 | 106 | ||
| 107 | /* punit */ | 107 | /* punit */ |
| 108 | void *punit_base; | 108 | resource_size_t punit_base; |
| 109 | int punit_size; | 109 | int punit_size; |
| 110 | void *punit_base2; | 110 | resource_size_t punit_base2; |
| 111 | int punit_size2; | 111 | int punit_size2; |
| 112 | struct platform_device *punit_dev; | 112 | struct platform_device *punit_dev; |
| 113 | } ipcdev; | 113 | } ipcdev; |
| @@ -210,10 +210,15 @@ static int intel_pmc_ipc_check_status(void) | |||
| 210 | return ret; | 210 | return ret; |
| 211 | } | 211 | } |
| 212 | 212 | ||
| 213 | /* | 213 | /** |
| 214 | * intel_pmc_ipc_simple_command | 214 | * intel_pmc_ipc_simple_command() - Simple IPC command |
| 215 | * @cmd: command | 215 | * @cmd: IPC command code. |
| 216 | * @sub: sub type | 216 | * @sub: IPC command sub type. |
| 217 | * | ||
| 218 | * Send a simple IPC command to PMC when don't need to specify | ||
| 219 | * input/output data and source/dest pointers. | ||
| 220 | * | ||
| 221 | * Return: an IPC error code or 0 on success. | ||
| 217 | */ | 222 | */ |
| 218 | int intel_pmc_ipc_simple_command(int cmd, int sub) | 223 | int intel_pmc_ipc_simple_command(int cmd, int sub) |
| 219 | { | 224 | { |
| @@ -232,16 +237,20 @@ int intel_pmc_ipc_simple_command(int cmd, int sub) | |||
| 232 | } | 237 | } |
| 233 | EXPORT_SYMBOL_GPL(intel_pmc_ipc_simple_command); | 238 | EXPORT_SYMBOL_GPL(intel_pmc_ipc_simple_command); |
| 234 | 239 | ||
| 235 | /* | 240 | /** |
| 236 | * intel_pmc_ipc_raw_cmd | 241 | * intel_pmc_ipc_raw_cmd() - IPC command with data and pointers |
| 237 | * @cmd: command | 242 | * @cmd: IPC command code. |
| 238 | * @sub: sub type | 243 | * @sub: IPC command sub type. |
| 239 | * @in: input data | 244 | * @in: input data of this IPC command. |
| 240 | * @inlen: input length in bytes | 245 | * @inlen: input data length in bytes. |
| 241 | * @out: output data | 246 | * @out: output data of this IPC command. |
| 242 | * @outlen: output length in dwords | 247 | * @outlen: output data length in dwords. |
| 243 | * @sptr: data writing to SPTR register | 248 | * @sptr: data writing to SPTR register. |
| 244 | * @dptr: data writing to DPTR register | 249 | * @dptr: data writing to DPTR register. |
| 250 | * | ||
| 251 | * Send an IPC command to PMC with input/output data and source/dest pointers. | ||
| 252 | * | ||
| 253 | * Return: an IPC error code or 0 on success. | ||
| 245 | */ | 254 | */ |
| 246 | int intel_pmc_ipc_raw_cmd(u32 cmd, u32 sub, u8 *in, u32 inlen, u32 *out, | 255 | int intel_pmc_ipc_raw_cmd(u32 cmd, u32 sub, u8 *in, u32 inlen, u32 *out, |
| 247 | u32 outlen, u32 dptr, u32 sptr) | 256 | u32 outlen, u32 dptr, u32 sptr) |
| @@ -278,14 +287,18 @@ int intel_pmc_ipc_raw_cmd(u32 cmd, u32 sub, u8 *in, u32 inlen, u32 *out, | |||
| 278 | } | 287 | } |
| 279 | EXPORT_SYMBOL_GPL(intel_pmc_ipc_raw_cmd); | 288 | EXPORT_SYMBOL_GPL(intel_pmc_ipc_raw_cmd); |
| 280 | 289 | ||
| 281 | /* | 290 | /** |
| 282 | * intel_pmc_ipc_command | 291 | * intel_pmc_ipc_command() - IPC command with input/output data |
| 283 | * @cmd: command | 292 | * @cmd: IPC command code. |
| 284 | * @sub: sub type | 293 | * @sub: IPC command sub type. |
| 285 | * @in: input data | 294 | * @in: input data of this IPC command. |
| 286 | * @inlen: input length in bytes | 295 | * @inlen: input data length in bytes. |
| 287 | * @out: output data | 296 | * @out: output data of this IPC command. |
| 288 | * @outlen: output length in dwords | 297 | * @outlen: output data length in dwords. |
| 298 | * | ||
| 299 | * Send an IPC command to PMC with input/output data. | ||
| 300 | * | ||
| 301 | * Return: an IPC error code or 0 on success. | ||
| 289 | */ | 302 | */ |
| 290 | int intel_pmc_ipc_command(u32 cmd, u32 sub, u8 *in, u32 inlen, | 303 | int intel_pmc_ipc_command(u32 cmd, u32 sub, u8 *in, u32 inlen, |
| 291 | u32 *out, u32 outlen) | 304 | u32 *out, u32 outlen) |
| @@ -480,11 +493,11 @@ static int ipc_create_punit_device(void) | |||
| 480 | pdev->dev.parent = ipcdev.dev; | 493 | pdev->dev.parent = ipcdev.dev; |
| 481 | 494 | ||
| 482 | res = punit_res; | 495 | res = punit_res; |
| 483 | res->start = (resource_size_t)ipcdev.punit_base; | 496 | res->start = ipcdev.punit_base; |
| 484 | res->end = res->start + ipcdev.punit_size - 1; | 497 | res->end = res->start + ipcdev.punit_size - 1; |
| 485 | 498 | ||
| 486 | res = punit_res + PUNIT_RESOURCE_INTER; | 499 | res = punit_res + PUNIT_RESOURCE_INTER; |
| 487 | res->start = (resource_size_t)ipcdev.punit_base2; | 500 | res->start = ipcdev.punit_base2; |
| 488 | res->end = res->start + ipcdev.punit_size2 - 1; | 501 | res->end = res->start + ipcdev.punit_size2 - 1; |
| 489 | 502 | ||
| 490 | ret = platform_device_add_resources(pdev, punit_res, | 503 | ret = platform_device_add_resources(pdev, punit_res, |
| @@ -522,15 +535,15 @@ static int ipc_create_tco_device(void) | |||
| 522 | pdev->dev.parent = ipcdev.dev; | 535 | pdev->dev.parent = ipcdev.dev; |
| 523 | 536 | ||
| 524 | res = tco_res + TCO_RESOURCE_ACPI_IO; | 537 | res = tco_res + TCO_RESOURCE_ACPI_IO; |
| 525 | res->start = (resource_size_t)ipcdev.acpi_io_base + TCO_BASE_OFFSET; | 538 | res->start = ipcdev.acpi_io_base + TCO_BASE_OFFSET; |
| 526 | res->end = res->start + TCO_REGS_SIZE - 1; | 539 | res->end = res->start + TCO_REGS_SIZE - 1; |
| 527 | 540 | ||
| 528 | res = tco_res + TCO_RESOURCE_SMI_EN_IO; | 541 | res = tco_res + TCO_RESOURCE_SMI_EN_IO; |
| 529 | res->start = (resource_size_t)ipcdev.acpi_io_base + SMI_EN_OFFSET; | 542 | res->start = ipcdev.acpi_io_base + SMI_EN_OFFSET; |
| 530 | res->end = res->start + SMI_EN_SIZE - 1; | 543 | res->end = res->start + SMI_EN_SIZE - 1; |
| 531 | 544 | ||
| 532 | res = tco_res + TCO_RESOURCE_GCR_MEM; | 545 | res = tco_res + TCO_RESOURCE_GCR_MEM; |
| 533 | res->start = (resource_size_t)ipcdev.gcr_base; | 546 | res->start = ipcdev.gcr_base; |
| 534 | res->end = res->start + ipcdev.gcr_size - 1; | 547 | res->end = res->start + ipcdev.gcr_size - 1; |
| 535 | 548 | ||
| 536 | ret = platform_device_add_resources(pdev, tco_res, ARRAY_SIZE(tco_res)); | 549 | ret = platform_device_add_resources(pdev, tco_res, ARRAY_SIZE(tco_res)); |
| @@ -589,7 +602,7 @@ static int ipc_plat_get_res(struct platform_device *pdev) | |||
| 589 | return -ENXIO; | 602 | return -ENXIO; |
| 590 | } | 603 | } |
| 591 | size = resource_size(res); | 604 | size = resource_size(res); |
| 592 | ipcdev.acpi_io_base = (void *)res->start; | 605 | ipcdev.acpi_io_base = res->start; |
| 593 | ipcdev.acpi_io_size = size; | 606 | ipcdev.acpi_io_size = size; |
| 594 | dev_info(&pdev->dev, "io res: %llx %x\n", | 607 | dev_info(&pdev->dev, "io res: %llx %x\n", |
| 595 | (long long)res->start, (int)resource_size(res)); | 608 | (long long)res->start, (int)resource_size(res)); |
| @@ -601,7 +614,7 @@ static int ipc_plat_get_res(struct platform_device *pdev) | |||
| 601 | return -ENXIO; | 614 | return -ENXIO; |
| 602 | } | 615 | } |
| 603 | size = resource_size(res); | 616 | size = resource_size(res); |
| 604 | ipcdev.punit_base = (void *)res->start; | 617 | ipcdev.punit_base = res->start; |
| 605 | ipcdev.punit_size = size; | 618 | ipcdev.punit_size = size; |
| 606 | dev_info(&pdev->dev, "punit data res: %llx %x\n", | 619 | dev_info(&pdev->dev, "punit data res: %llx %x\n", |
| 607 | (long long)res->start, (int)resource_size(res)); | 620 | (long long)res->start, (int)resource_size(res)); |
| @@ -613,7 +626,7 @@ static int ipc_plat_get_res(struct platform_device *pdev) | |||
| 613 | return -ENXIO; | 626 | return -ENXIO; |
| 614 | } | 627 | } |
| 615 | size = resource_size(res); | 628 | size = resource_size(res); |
| 616 | ipcdev.punit_base2 = (void *)res->start; | 629 | ipcdev.punit_base2 = res->start; |
| 617 | ipcdev.punit_size2 = size; | 630 | ipcdev.punit_size2 = size; |
| 618 | dev_info(&pdev->dev, "punit interface res: %llx %x\n", | 631 | dev_info(&pdev->dev, "punit interface res: %llx %x\n", |
| 619 | (long long)res->start, (int)resource_size(res)); | 632 | (long long)res->start, (int)resource_size(res)); |
| @@ -637,7 +650,7 @@ static int ipc_plat_get_res(struct platform_device *pdev) | |||
| 637 | } | 650 | } |
| 638 | ipcdev.ipc_base = addr; | 651 | ipcdev.ipc_base = addr; |
| 639 | 652 | ||
| 640 | ipcdev.gcr_base = (void *)(res->start + size); | 653 | ipcdev.gcr_base = res->start + size; |
| 641 | ipcdev.gcr_size = PLAT_RESOURCE_GCR_SIZE; | 654 | ipcdev.gcr_size = PLAT_RESOURCE_GCR_SIZE; |
| 642 | dev_info(&pdev->dev, "ipc res: %llx %x\n", | 655 | dev_info(&pdev->dev, "ipc res: %llx %x\n", |
| 643 | (long long)res->start, (int)resource_size(res)); | 656 | (long long)res->start, (int)resource_size(res)); |
diff --git a/drivers/platform/x86/intel_scu_ipc.c b/drivers/platform/x86/intel_scu_ipc.c index 001b199a8c33..187d1086d15c 100644 --- a/drivers/platform/x86/intel_scu_ipc.c +++ b/drivers/platform/x86/intel_scu_ipc.c | |||
| @@ -216,13 +216,13 @@ static int pwr_reg_rdwr(u16 *addr, u8 *data, u32 count, u32 op, u32 id) | |||
| 216 | int nc; | 216 | int nc; |
| 217 | u32 offset = 0; | 217 | u32 offset = 0; |
| 218 | int err; | 218 | int err; |
| 219 | u8 cbuf[IPC_WWBUF_SIZE] = { }; | 219 | u8 cbuf[IPC_WWBUF_SIZE]; |
| 220 | u32 *wbuf = (u32 *)&cbuf; | 220 | u32 *wbuf = (u32 *)&cbuf; |
| 221 | 221 | ||
| 222 | mutex_lock(&ipclock); | ||
| 223 | |||
| 224 | memset(cbuf, 0, sizeof(cbuf)); | 222 | memset(cbuf, 0, sizeof(cbuf)); |
| 225 | 223 | ||
| 224 | mutex_lock(&ipclock); | ||
| 225 | |||
| 226 | if (ipcdev.pdev == NULL) { | 226 | if (ipcdev.pdev == NULL) { |
| 227 | mutex_unlock(&ipclock); | 227 | mutex_unlock(&ipclock); |
| 228 | return -ENODEV; | 228 | return -ENODEV; |
diff --git a/drivers/rtc/rtc-armada38x.c b/drivers/rtc/rtc-armada38x.c index 4b62d1a875e4..2b08cac62f07 100644 --- a/drivers/rtc/rtc-armada38x.c +++ b/drivers/rtc/rtc-armada38x.c | |||
| @@ -88,7 +88,7 @@ static int armada38x_rtc_set_time(struct device *dev, struct rtc_time *tm) | |||
| 88 | { | 88 | { |
| 89 | struct armada38x_rtc *rtc = dev_get_drvdata(dev); | 89 | struct armada38x_rtc *rtc = dev_get_drvdata(dev); |
| 90 | int ret = 0; | 90 | int ret = 0; |
| 91 | unsigned long time, flags; | 91 | unsigned long time; |
| 92 | 92 | ||
| 93 | ret = rtc_tm_to_time(tm, &time); | 93 | ret = rtc_tm_to_time(tm, &time); |
| 94 | 94 | ||
diff --git a/drivers/rtc/rtc-mt6397.c b/drivers/rtc/rtc-mt6397.c index c0090b698ff3..eab230be5a54 100644 --- a/drivers/rtc/rtc-mt6397.c +++ b/drivers/rtc/rtc-mt6397.c | |||
| @@ -343,6 +343,8 @@ static int mtk_rtc_probe(struct platform_device *pdev) | |||
| 343 | goto out_dispose_irq; | 343 | goto out_dispose_irq; |
| 344 | } | 344 | } |
| 345 | 345 | ||
| 346 | device_init_wakeup(&pdev->dev, 1); | ||
| 347 | |||
| 346 | rtc->rtc_dev = rtc_device_register("mt6397-rtc", &pdev->dev, | 348 | rtc->rtc_dev = rtc_device_register("mt6397-rtc", &pdev->dev, |
| 347 | &mtk_rtc_ops, THIS_MODULE); | 349 | &mtk_rtc_ops, THIS_MODULE); |
| 348 | if (IS_ERR(rtc->rtc_dev)) { | 350 | if (IS_ERR(rtc->rtc_dev)) { |
| @@ -351,8 +353,6 @@ static int mtk_rtc_probe(struct platform_device *pdev) | |||
| 351 | goto out_free_irq; | 353 | goto out_free_irq; |
| 352 | } | 354 | } |
| 353 | 355 | ||
| 354 | device_init_wakeup(&pdev->dev, 1); | ||
| 355 | |||
| 356 | return 0; | 356 | return 0; |
| 357 | 357 | ||
| 358 | out_free_irq: | 358 | out_free_irq: |
diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c index 1aec8ff0b587..f73d2f579a7e 100644 --- a/drivers/s390/block/dasd.c +++ b/drivers/s390/block/dasd.c | |||
| @@ -1863,6 +1863,33 @@ static void __dasd_device_check_expire(struct dasd_device *device) | |||
| 1863 | } | 1863 | } |
| 1864 | 1864 | ||
| 1865 | /* | 1865 | /* |
| 1866 | * return 1 when device is not eligible for IO | ||
| 1867 | */ | ||
| 1868 | static int __dasd_device_is_unusable(struct dasd_device *device, | ||
| 1869 | struct dasd_ccw_req *cqr) | ||
| 1870 | { | ||
| 1871 | int mask = ~(DASD_STOPPED_DC_WAIT | DASD_UNRESUMED_PM); | ||
| 1872 | |||
| 1873 | if (test_bit(DASD_FLAG_OFFLINE, &device->flags)) { | ||
| 1874 | /* dasd is being set offline. */ | ||
| 1875 | return 1; | ||
| 1876 | } | ||
| 1877 | if (device->stopped) { | ||
| 1878 | if (device->stopped & mask) { | ||
| 1879 | /* stopped and CQR will not change that. */ | ||
| 1880 | return 1; | ||
| 1881 | } | ||
| 1882 | if (!test_bit(DASD_CQR_VERIFY_PATH, &cqr->flags)) { | ||
| 1883 | /* CQR is not able to change device to | ||
| 1884 | * operational. */ | ||
| 1885 | return 1; | ||
| 1886 | } | ||
| 1887 | /* CQR required to get device operational. */ | ||
| 1888 | } | ||
| 1889 | return 0; | ||
| 1890 | } | ||
| 1891 | |||
| 1892 | /* | ||
| 1866 | * Take a look at the first request on the ccw queue and check | 1893 | * Take a look at the first request on the ccw queue and check |
| 1867 | * if it needs to be started. | 1894 | * if it needs to be started. |
| 1868 | */ | 1895 | */ |
| @@ -1876,13 +1903,8 @@ static void __dasd_device_start_head(struct dasd_device *device) | |||
| 1876 | cqr = list_entry(device->ccw_queue.next, struct dasd_ccw_req, devlist); | 1903 | cqr = list_entry(device->ccw_queue.next, struct dasd_ccw_req, devlist); |
| 1877 | if (cqr->status != DASD_CQR_QUEUED) | 1904 | if (cqr->status != DASD_CQR_QUEUED) |
| 1878 | return; | 1905 | return; |
| 1879 | /* when device is stopped, return request to previous layer | 1906 | /* if device is not usable return request to upper layer */ |
| 1880 | * exception: only the disconnect or unresumed bits are set and the | 1907 | if (__dasd_device_is_unusable(device, cqr)) { |
| 1881 | * cqr is a path verification request | ||
| 1882 | */ | ||
| 1883 | if (device->stopped && | ||
| 1884 | !(!(device->stopped & ~(DASD_STOPPED_DC_WAIT | DASD_UNRESUMED_PM)) | ||
| 1885 | && test_bit(DASD_CQR_VERIFY_PATH, &cqr->flags))) { | ||
| 1886 | cqr->intrc = -EAGAIN; | 1908 | cqr->intrc = -EAGAIN; |
| 1887 | cqr->status = DASD_CQR_CLEARED; | 1909 | cqr->status = DASD_CQR_CLEARED; |
| 1888 | dasd_schedule_device_bh(device); | 1910 | dasd_schedule_device_bh(device); |
diff --git a/drivers/s390/block/dasd_alias.c b/drivers/s390/block/dasd_alias.c index a2597e683e79..ee3a6faae22a 100644 --- a/drivers/s390/block/dasd_alias.c +++ b/drivers/s390/block/dasd_alias.c | |||
| @@ -699,7 +699,8 @@ struct dasd_device *dasd_alias_get_start_dev(struct dasd_device *base_device) | |||
| 699 | struct dasd_device, alias_list); | 699 | struct dasd_device, alias_list); |
| 700 | spin_unlock_irqrestore(&lcu->lock, flags); | 700 | spin_unlock_irqrestore(&lcu->lock, flags); |
| 701 | alias_priv = (struct dasd_eckd_private *) alias_device->private; | 701 | alias_priv = (struct dasd_eckd_private *) alias_device->private; |
| 702 | if ((alias_priv->count < private->count) && !alias_device->stopped) | 702 | if ((alias_priv->count < private->count) && !alias_device->stopped && |
| 703 | !test_bit(DASD_FLAG_OFFLINE, &alias_device->flags)) | ||
| 703 | return alias_device; | 704 | return alias_device; |
| 704 | else | 705 | else |
| 705 | return NULL; | 706 | return NULL; |
diff --git a/drivers/s390/char/sclp_early.c b/drivers/s390/char/sclp_early.c index aeed7969fd79..7bc6df3100ef 100644 --- a/drivers/s390/char/sclp_early.c +++ b/drivers/s390/char/sclp_early.c | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | #define KMSG_COMPONENT "sclp_early" | 7 | #define KMSG_COMPONENT "sclp_early" |
| 8 | #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt | 8 | #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt |
| 9 | 9 | ||
| 10 | #include <linux/errno.h> | ||
| 10 | #include <asm/ctl_reg.h> | 11 | #include <asm/ctl_reg.h> |
| 11 | #include <asm/sclp.h> | 12 | #include <asm/sclp.h> |
| 12 | #include <asm/ipl.h> | 13 | #include <asm/ipl.h> |
diff --git a/drivers/s390/crypto/zcrypt_api.c b/drivers/s390/crypto/zcrypt_api.c index 08f1830cbfc4..01bf1f5cf2e9 100644 --- a/drivers/s390/crypto/zcrypt_api.c +++ b/drivers/s390/crypto/zcrypt_api.c | |||
| @@ -54,6 +54,10 @@ MODULE_DESCRIPTION("Cryptographic Coprocessor interface, " \ | |||
| 54 | "Copyright IBM Corp. 2001, 2012"); | 54 | "Copyright IBM Corp. 2001, 2012"); |
| 55 | MODULE_LICENSE("GPL"); | 55 | MODULE_LICENSE("GPL"); |
| 56 | 56 | ||
| 57 | static int zcrypt_hwrng_seed = 1; | ||
| 58 | module_param_named(hwrng_seed, zcrypt_hwrng_seed, int, S_IRUSR|S_IRGRP); | ||
| 59 | MODULE_PARM_DESC(hwrng_seed, "Turn on/off hwrng auto seed, default is 1 (on)."); | ||
| 60 | |||
| 57 | static DEFINE_SPINLOCK(zcrypt_device_lock); | 61 | static DEFINE_SPINLOCK(zcrypt_device_lock); |
| 58 | static LIST_HEAD(zcrypt_device_list); | 62 | static LIST_HEAD(zcrypt_device_list); |
| 59 | static int zcrypt_device_count = 0; | 63 | static int zcrypt_device_count = 0; |
| @@ -1373,6 +1377,7 @@ static int zcrypt_rng_data_read(struct hwrng *rng, u32 *data) | |||
| 1373 | static struct hwrng zcrypt_rng_dev = { | 1377 | static struct hwrng zcrypt_rng_dev = { |
| 1374 | .name = "zcrypt", | 1378 | .name = "zcrypt", |
| 1375 | .data_read = zcrypt_rng_data_read, | 1379 | .data_read = zcrypt_rng_data_read, |
| 1380 | .quality = 990, | ||
| 1376 | }; | 1381 | }; |
| 1377 | 1382 | ||
| 1378 | static int zcrypt_rng_device_add(void) | 1383 | static int zcrypt_rng_device_add(void) |
| @@ -1387,6 +1392,8 @@ static int zcrypt_rng_device_add(void) | |||
| 1387 | goto out; | 1392 | goto out; |
| 1388 | } | 1393 | } |
| 1389 | zcrypt_rng_buffer_index = 0; | 1394 | zcrypt_rng_buffer_index = 0; |
| 1395 | if (!zcrypt_hwrng_seed) | ||
| 1396 | zcrypt_rng_dev.quality = 0; | ||
| 1390 | rc = hwrng_register(&zcrypt_rng_dev); | 1397 | rc = hwrng_register(&zcrypt_rng_dev); |
| 1391 | if (rc) | 1398 | if (rc) |
| 1392 | goto out_free; | 1399 | goto out_free; |
diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c index 1ac38e73df7e..9ad41168d26d 100644 --- a/drivers/scsi/scsi_sysfs.c +++ b/drivers/scsi/scsi_sysfs.c | |||
| @@ -859,7 +859,7 @@ sdev_store_queue_depth(struct device *dev, struct device_attribute *attr, | |||
| 859 | 859 | ||
| 860 | depth = simple_strtoul(buf, NULL, 0); | 860 | depth = simple_strtoul(buf, NULL, 0); |
| 861 | 861 | ||
| 862 | if (depth < 1 || depth > sht->can_queue) | 862 | if (depth < 1 || depth > sdev->host->can_queue) |
| 863 | return -EINVAL; | 863 | return -EINVAL; |
| 864 | 864 | ||
| 865 | retval = sht->change_queue_depth(sdev, depth); | 865 | retval = sht->change_queue_depth(sdev, depth); |
diff --git a/drivers/scsi/scsi_transport_srp.c b/drivers/scsi/scsi_transport_srp.c index a85292b1d09d..e3cd3ece4412 100644 --- a/drivers/scsi/scsi_transport_srp.c +++ b/drivers/scsi/scsi_transport_srp.c | |||
| @@ -203,7 +203,7 @@ static ssize_t srp_show_tmo(char *buf, int tmo) | |||
| 203 | return tmo >= 0 ? sprintf(buf, "%d\n", tmo) : sprintf(buf, "off\n"); | 203 | return tmo >= 0 ? sprintf(buf, "%d\n", tmo) : sprintf(buf, "off\n"); |
| 204 | } | 204 | } |
| 205 | 205 | ||
| 206 | static int srp_parse_tmo(int *tmo, const char *buf) | 206 | int srp_parse_tmo(int *tmo, const char *buf) |
| 207 | { | 207 | { |
| 208 | int res = 0; | 208 | int res = 0; |
| 209 | 209 | ||
| @@ -214,6 +214,7 @@ static int srp_parse_tmo(int *tmo, const char *buf) | |||
| 214 | 214 | ||
| 215 | return res; | 215 | return res; |
| 216 | } | 216 | } |
| 217 | EXPORT_SYMBOL(srp_parse_tmo); | ||
| 217 | 218 | ||
| 218 | static ssize_t show_reconnect_delay(struct device *dev, | 219 | static ssize_t show_reconnect_delay(struct device *dev, |
| 219 | struct device_attribute *attr, char *buf) | 220 | struct device_attribute *attr, char *buf) |
diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index 3f25b8fa921d..871f3553987d 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c | |||
| @@ -1329,9 +1329,9 @@ static int st_open(struct inode *inode, struct file *filp) | |||
| 1329 | spin_lock(&st_use_lock); | 1329 | spin_lock(&st_use_lock); |
| 1330 | STp->in_use = 0; | 1330 | STp->in_use = 0; |
| 1331 | spin_unlock(&st_use_lock); | 1331 | spin_unlock(&st_use_lock); |
| 1332 | scsi_tape_put(STp); | ||
| 1333 | if (resumed) | 1332 | if (resumed) |
| 1334 | scsi_autopm_put_device(STp->device); | 1333 | scsi_autopm_put_device(STp->device); |
| 1334 | scsi_tape_put(STp); | ||
| 1335 | return retval; | 1335 | return retval; |
| 1336 | 1336 | ||
| 1337 | } | 1337 | } |
diff --git a/drivers/staging/board/Kconfig b/drivers/staging/board/Kconfig index b8ee81840666..3f287c48e082 100644 --- a/drivers/staging/board/Kconfig +++ b/drivers/staging/board/Kconfig | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | config STAGING_BOARD | 1 | config STAGING_BOARD |
| 2 | bool "Staging Board Support" | 2 | bool "Staging Board Support" |
| 3 | depends on OF_ADDRESS | 3 | depends on OF_ADDRESS && OF_IRQ && CLKDEV_LOOKUP |
| 4 | help | 4 | help |
| 5 | Select to enable per-board staging support code. | 5 | Select to enable per-board staging support code. |
| 6 | 6 | ||
diff --git a/drivers/staging/lustre/lnet/klnds/socklnd/socklnd.h b/drivers/staging/lustre/lnet/klnds/socklnd/socklnd.h index 7125eb955ae5..8a9d4a0de129 100644 --- a/drivers/staging/lustre/lnet/klnds/socklnd/socklnd.h +++ b/drivers/staging/lustre/lnet/klnds/socklnd/socklnd.h | |||
| @@ -31,7 +31,6 @@ | |||
| 31 | #define DEBUG_PORTAL_ALLOC | 31 | #define DEBUG_PORTAL_ALLOC |
| 32 | #define DEBUG_SUBSYSTEM S_LND | 32 | #define DEBUG_SUBSYSTEM S_LND |
| 33 | 33 | ||
| 34 | #include <asm/irq.h> | ||
| 35 | #include <linux/crc32.h> | 34 | #include <linux/crc32.h> |
| 36 | #include <linux/errno.h> | 35 | #include <linux/errno.h> |
| 37 | #include <linux/if.h> | 36 | #include <linux/if.h> |
diff --git a/drivers/staging/vt6655/device_main.c b/drivers/staging/vt6655/device_main.c index ed040fbb7df8..b0c8e235b982 100644 --- a/drivers/staging/vt6655/device_main.c +++ b/drivers/staging/vt6655/device_main.c | |||
| @@ -1418,7 +1418,7 @@ static void vnt_bss_info_changed(struct ieee80211_hw *hw, | |||
| 1418 | 1418 | ||
| 1419 | priv->current_aid = conf->aid; | 1419 | priv->current_aid = conf->aid; |
| 1420 | 1420 | ||
| 1421 | if (changed & BSS_CHANGED_BSSID) { | 1421 | if (changed & BSS_CHANGED_BSSID && conf->bssid) { |
| 1422 | unsigned long flags; | 1422 | unsigned long flags; |
| 1423 | 1423 | ||
| 1424 | spin_lock_irqsave(&priv->lock, flags); | 1424 | spin_lock_irqsave(&priv->lock, flags); |
diff --git a/drivers/staging/vt6656/main_usb.c b/drivers/staging/vt6656/main_usb.c index f97323f19acf..af572d718135 100644 --- a/drivers/staging/vt6656/main_usb.c +++ b/drivers/staging/vt6656/main_usb.c | |||
| @@ -701,7 +701,7 @@ static void vnt_bss_info_changed(struct ieee80211_hw *hw, | |||
| 701 | 701 | ||
| 702 | priv->current_aid = conf->aid; | 702 | priv->current_aid = conf->aid; |
| 703 | 703 | ||
| 704 | if (changed & BSS_CHANGED_BSSID) | 704 | if (changed & BSS_CHANGED_BSSID && conf->bssid) |
| 705 | vnt_mac_set_bssid_addr(priv, (u8 *)conf->bssid); | 705 | vnt_mac_set_bssid_addr(priv, (u8 *)conf->bssid); |
| 706 | 706 | ||
| 707 | 707 | ||
diff --git a/drivers/usb/dwc2/core.c b/drivers/usb/dwc2/core.c index e5b546f1152e..c3cc1a78d1e2 100644 --- a/drivers/usb/dwc2/core.c +++ b/drivers/usb/dwc2/core.c | |||
| @@ -72,17 +72,7 @@ static int dwc2_backup_host_registers(struct dwc2_hsotg *hsotg) | |||
| 72 | dev_dbg(hsotg->dev, "%s\n", __func__); | 72 | dev_dbg(hsotg->dev, "%s\n", __func__); |
| 73 | 73 | ||
| 74 | /* Backup Host regs */ | 74 | /* Backup Host regs */ |
| 75 | hr = hsotg->hr_backup; | 75 | hr = &hsotg->hr_backup; |
| 76 | if (!hr) { | ||
| 77 | hr = devm_kzalloc(hsotg->dev, sizeof(*hr), GFP_KERNEL); | ||
| 78 | if (!hr) { | ||
| 79 | dev_err(hsotg->dev, "%s: can't allocate host regs\n", | ||
| 80 | __func__); | ||
| 81 | return -ENOMEM; | ||
| 82 | } | ||
| 83 | |||
| 84 | hsotg->hr_backup = hr; | ||
| 85 | } | ||
| 86 | hr->hcfg = readl(hsotg->regs + HCFG); | 76 | hr->hcfg = readl(hsotg->regs + HCFG); |
| 87 | hr->haintmsk = readl(hsotg->regs + HAINTMSK); | 77 | hr->haintmsk = readl(hsotg->regs + HAINTMSK); |
| 88 | for (i = 0; i < hsotg->core_params->host_channels; ++i) | 78 | for (i = 0; i < hsotg->core_params->host_channels; ++i) |
| @@ -90,6 +80,7 @@ static int dwc2_backup_host_registers(struct dwc2_hsotg *hsotg) | |||
| 90 | 80 | ||
| 91 | hr->hprt0 = readl(hsotg->regs + HPRT0); | 81 | hr->hprt0 = readl(hsotg->regs + HPRT0); |
| 92 | hr->hfir = readl(hsotg->regs + HFIR); | 82 | hr->hfir = readl(hsotg->regs + HFIR); |
| 83 | hr->valid = true; | ||
| 93 | 84 | ||
| 94 | return 0; | 85 | return 0; |
| 95 | } | 86 | } |
| @@ -109,12 +100,13 @@ static int dwc2_restore_host_registers(struct dwc2_hsotg *hsotg) | |||
| 109 | dev_dbg(hsotg->dev, "%s\n", __func__); | 100 | dev_dbg(hsotg->dev, "%s\n", __func__); |
| 110 | 101 | ||
| 111 | /* Restore host regs */ | 102 | /* Restore host regs */ |
| 112 | hr = hsotg->hr_backup; | 103 | hr = &hsotg->hr_backup; |
| 113 | if (!hr) { | 104 | if (!hr->valid) { |
| 114 | dev_err(hsotg->dev, "%s: no host registers to restore\n", | 105 | dev_err(hsotg->dev, "%s: no host registers to restore\n", |
| 115 | __func__); | 106 | __func__); |
| 116 | return -EINVAL; | 107 | return -EINVAL; |
| 117 | } | 108 | } |
| 109 | hr->valid = false; | ||
| 118 | 110 | ||
| 119 | writel(hr->hcfg, hsotg->regs + HCFG); | 111 | writel(hr->hcfg, hsotg->regs + HCFG); |
| 120 | writel(hr->haintmsk, hsotg->regs + HAINTMSK); | 112 | writel(hr->haintmsk, hsotg->regs + HAINTMSK); |
| @@ -152,17 +144,7 @@ static int dwc2_backup_device_registers(struct dwc2_hsotg *hsotg) | |||
| 152 | dev_dbg(hsotg->dev, "%s\n", __func__); | 144 | dev_dbg(hsotg->dev, "%s\n", __func__); |
| 153 | 145 | ||
| 154 | /* Backup dev regs */ | 146 | /* Backup dev regs */ |
| 155 | dr = hsotg->dr_backup; | 147 | dr = &hsotg->dr_backup; |
| 156 | if (!dr) { | ||
| 157 | dr = devm_kzalloc(hsotg->dev, sizeof(*dr), GFP_KERNEL); | ||
| 158 | if (!dr) { | ||
| 159 | dev_err(hsotg->dev, "%s: can't allocate device regs\n", | ||
| 160 | __func__); | ||
| 161 | return -ENOMEM; | ||
| 162 | } | ||
| 163 | |||
| 164 | hsotg->dr_backup = dr; | ||
| 165 | } | ||
| 166 | 148 | ||
| 167 | dr->dcfg = readl(hsotg->regs + DCFG); | 149 | dr->dcfg = readl(hsotg->regs + DCFG); |
| 168 | dr->dctl = readl(hsotg->regs + DCTL); | 150 | dr->dctl = readl(hsotg->regs + DCTL); |
| @@ -195,7 +177,7 @@ static int dwc2_backup_device_registers(struct dwc2_hsotg *hsotg) | |||
| 195 | dr->doeptsiz[i] = readl(hsotg->regs + DOEPTSIZ(i)); | 177 | dr->doeptsiz[i] = readl(hsotg->regs + DOEPTSIZ(i)); |
| 196 | dr->doepdma[i] = readl(hsotg->regs + DOEPDMA(i)); | 178 | dr->doepdma[i] = readl(hsotg->regs + DOEPDMA(i)); |
| 197 | } | 179 | } |
| 198 | 180 | dr->valid = true; | |
| 199 | return 0; | 181 | return 0; |
| 200 | } | 182 | } |
| 201 | 183 | ||
| @@ -215,12 +197,13 @@ static int dwc2_restore_device_registers(struct dwc2_hsotg *hsotg) | |||
| 215 | dev_dbg(hsotg->dev, "%s\n", __func__); | 197 | dev_dbg(hsotg->dev, "%s\n", __func__); |
| 216 | 198 | ||
| 217 | /* Restore dev regs */ | 199 | /* Restore dev regs */ |
| 218 | dr = hsotg->dr_backup; | 200 | dr = &hsotg->dr_backup; |
| 219 | if (!dr) { | 201 | if (!dr->valid) { |
| 220 | dev_err(hsotg->dev, "%s: no device registers to restore\n", | 202 | dev_err(hsotg->dev, "%s: no device registers to restore\n", |
| 221 | __func__); | 203 | __func__); |
| 222 | return -EINVAL; | 204 | return -EINVAL; |
| 223 | } | 205 | } |
| 206 | dr->valid = false; | ||
| 224 | 207 | ||
| 225 | writel(dr->dcfg, hsotg->regs + DCFG); | 208 | writel(dr->dcfg, hsotg->regs + DCFG); |
| 226 | writel(dr->dctl, hsotg->regs + DCTL); | 209 | writel(dr->dctl, hsotg->regs + DCTL); |
| @@ -268,17 +251,7 @@ static int dwc2_backup_global_registers(struct dwc2_hsotg *hsotg) | |||
| 268 | int i; | 251 | int i; |
| 269 | 252 | ||
| 270 | /* Backup global regs */ | 253 | /* Backup global regs */ |
| 271 | gr = hsotg->gr_backup; | 254 | gr = &hsotg->gr_backup; |
| 272 | if (!gr) { | ||
| 273 | gr = devm_kzalloc(hsotg->dev, sizeof(*gr), GFP_KERNEL); | ||
| 274 | if (!gr) { | ||
| 275 | dev_err(hsotg->dev, "%s: can't allocate global regs\n", | ||
| 276 | __func__); | ||
| 277 | return -ENOMEM; | ||
| 278 | } | ||
| 279 | |||
| 280 | hsotg->gr_backup = gr; | ||
| 281 | } | ||
| 282 | 255 | ||
| 283 | gr->gotgctl = readl(hsotg->regs + GOTGCTL); | 256 | gr->gotgctl = readl(hsotg->regs + GOTGCTL); |
| 284 | gr->gintmsk = readl(hsotg->regs + GINTMSK); | 257 | gr->gintmsk = readl(hsotg->regs + GINTMSK); |
| @@ -291,6 +264,7 @@ static int dwc2_backup_global_registers(struct dwc2_hsotg *hsotg) | |||
| 291 | for (i = 0; i < MAX_EPS_CHANNELS; i++) | 264 | for (i = 0; i < MAX_EPS_CHANNELS; i++) |
| 292 | gr->dtxfsiz[i] = readl(hsotg->regs + DPTXFSIZN(i)); | 265 | gr->dtxfsiz[i] = readl(hsotg->regs + DPTXFSIZN(i)); |
| 293 | 266 | ||
| 267 | gr->valid = true; | ||
| 294 | return 0; | 268 | return 0; |
| 295 | } | 269 | } |
| 296 | 270 | ||
| @@ -309,12 +283,13 @@ static int dwc2_restore_global_registers(struct dwc2_hsotg *hsotg) | |||
| 309 | dev_dbg(hsotg->dev, "%s\n", __func__); | 283 | dev_dbg(hsotg->dev, "%s\n", __func__); |
| 310 | 284 | ||
| 311 | /* Restore global regs */ | 285 | /* Restore global regs */ |
| 312 | gr = hsotg->gr_backup; | 286 | gr = &hsotg->gr_backup; |
| 313 | if (!gr) { | 287 | if (!gr->valid) { |
| 314 | dev_err(hsotg->dev, "%s: no global registers to restore\n", | 288 | dev_err(hsotg->dev, "%s: no global registers to restore\n", |
| 315 | __func__); | 289 | __func__); |
| 316 | return -EINVAL; | 290 | return -EINVAL; |
| 317 | } | 291 | } |
| 292 | gr->valid = false; | ||
| 318 | 293 | ||
| 319 | writel(0xffffffff, hsotg->regs + GINTSTS); | 294 | writel(0xffffffff, hsotg->regs + GINTSTS); |
| 320 | writel(gr->gotgctl, hsotg->regs + GOTGCTL); | 295 | writel(gr->gotgctl, hsotg->regs + GOTGCTL); |
diff --git a/drivers/usb/dwc2/core.h b/drivers/usb/dwc2/core.h index 53b8de03f102..0ed87620941b 100644 --- a/drivers/usb/dwc2/core.h +++ b/drivers/usb/dwc2/core.h | |||
| @@ -492,6 +492,7 @@ struct dwc2_gregs_backup { | |||
| 492 | u32 gdfifocfg; | 492 | u32 gdfifocfg; |
| 493 | u32 dtxfsiz[MAX_EPS_CHANNELS]; | 493 | u32 dtxfsiz[MAX_EPS_CHANNELS]; |
| 494 | u32 gpwrdn; | 494 | u32 gpwrdn; |
| 495 | bool valid; | ||
| 495 | }; | 496 | }; |
| 496 | 497 | ||
| 497 | /** | 498 | /** |
| @@ -521,6 +522,7 @@ struct dwc2_dregs_backup { | |||
| 521 | u32 doepctl[MAX_EPS_CHANNELS]; | 522 | u32 doepctl[MAX_EPS_CHANNELS]; |
| 522 | u32 doeptsiz[MAX_EPS_CHANNELS]; | 523 | u32 doeptsiz[MAX_EPS_CHANNELS]; |
| 523 | u32 doepdma[MAX_EPS_CHANNELS]; | 524 | u32 doepdma[MAX_EPS_CHANNELS]; |
| 525 | bool valid; | ||
| 524 | }; | 526 | }; |
| 525 | 527 | ||
| 526 | /** | 528 | /** |
| @@ -538,6 +540,7 @@ struct dwc2_hregs_backup { | |||
| 538 | u32 hcintmsk[MAX_EPS_CHANNELS]; | 540 | u32 hcintmsk[MAX_EPS_CHANNELS]; |
| 539 | u32 hprt0; | 541 | u32 hprt0; |
| 540 | u32 hfir; | 542 | u32 hfir; |
| 543 | bool valid; | ||
| 541 | }; | 544 | }; |
| 542 | 545 | ||
| 543 | /** | 546 | /** |
| @@ -705,9 +708,9 @@ struct dwc2_hsotg { | |||
| 705 | struct work_struct wf_otg; | 708 | struct work_struct wf_otg; |
| 706 | struct timer_list wkp_timer; | 709 | struct timer_list wkp_timer; |
| 707 | enum dwc2_lx_state lx_state; | 710 | enum dwc2_lx_state lx_state; |
| 708 | struct dwc2_gregs_backup *gr_backup; | 711 | struct dwc2_gregs_backup gr_backup; |
| 709 | struct dwc2_dregs_backup *dr_backup; | 712 | struct dwc2_dregs_backup dr_backup; |
| 710 | struct dwc2_hregs_backup *hr_backup; | 713 | struct dwc2_hregs_backup hr_backup; |
| 711 | 714 | ||
| 712 | struct dentry *debug_root; | 715 | struct dentry *debug_root; |
| 713 | struct debugfs_regset32 *regset; | 716 | struct debugfs_regset32 *regset; |
diff --git a/drivers/usb/dwc2/hcd.c b/drivers/usb/dwc2/hcd.c index b10377c65064..f845c41fe9e5 100644 --- a/drivers/usb/dwc2/hcd.c +++ b/drivers/usb/dwc2/hcd.c | |||
| @@ -359,10 +359,9 @@ void dwc2_hcd_stop(struct dwc2_hsotg *hsotg) | |||
| 359 | 359 | ||
| 360 | /* Caller must hold driver lock */ | 360 | /* Caller must hold driver lock */ |
| 361 | static int dwc2_hcd_urb_enqueue(struct dwc2_hsotg *hsotg, | 361 | static int dwc2_hcd_urb_enqueue(struct dwc2_hsotg *hsotg, |
| 362 | struct dwc2_hcd_urb *urb, void **ep_handle, | 362 | struct dwc2_hcd_urb *urb, struct dwc2_qh *qh, |
| 363 | gfp_t mem_flags) | 363 | struct dwc2_qtd *qtd) |
| 364 | { | 364 | { |
| 365 | struct dwc2_qtd *qtd; | ||
| 366 | u32 intr_mask; | 365 | u32 intr_mask; |
| 367 | int retval; | 366 | int retval; |
| 368 | int dev_speed; | 367 | int dev_speed; |
| @@ -386,18 +385,15 @@ static int dwc2_hcd_urb_enqueue(struct dwc2_hsotg *hsotg, | |||
| 386 | return -ENODEV; | 385 | return -ENODEV; |
| 387 | } | 386 | } |
| 388 | 387 | ||
| 389 | qtd = kzalloc(sizeof(*qtd), mem_flags); | ||
| 390 | if (!qtd) | 388 | if (!qtd) |
| 391 | return -ENOMEM; | 389 | return -EINVAL; |
| 392 | 390 | ||
| 393 | dwc2_hcd_qtd_init(qtd, urb); | 391 | dwc2_hcd_qtd_init(qtd, urb); |
| 394 | retval = dwc2_hcd_qtd_add(hsotg, qtd, (struct dwc2_qh **)ep_handle, | 392 | retval = dwc2_hcd_qtd_add(hsotg, qtd, qh); |
| 395 | mem_flags); | ||
| 396 | if (retval) { | 393 | if (retval) { |
| 397 | dev_err(hsotg->dev, | 394 | dev_err(hsotg->dev, |
| 398 | "DWC OTG HCD URB Enqueue failed adding QTD. Error status %d\n", | 395 | "DWC OTG HCD URB Enqueue failed adding QTD. Error status %d\n", |
| 399 | retval); | 396 | retval); |
| 400 | kfree(qtd); | ||
| 401 | return retval; | 397 | return retval; |
| 402 | } | 398 | } |
| 403 | 399 | ||
| @@ -2445,6 +2441,9 @@ static int _dwc2_hcd_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, | |||
| 2445 | u32 tflags = 0; | 2441 | u32 tflags = 0; |
| 2446 | void *buf; | 2442 | void *buf; |
| 2447 | unsigned long flags; | 2443 | unsigned long flags; |
| 2444 | struct dwc2_qh *qh; | ||
| 2445 | bool qh_allocated = false; | ||
| 2446 | struct dwc2_qtd *qtd; | ||
| 2448 | 2447 | ||
| 2449 | if (dbg_urb(urb)) { | 2448 | if (dbg_urb(urb)) { |
| 2450 | dev_vdbg(hsotg->dev, "DWC OTG HCD URB Enqueue\n"); | 2449 | dev_vdbg(hsotg->dev, "DWC OTG HCD URB Enqueue\n"); |
| @@ -2523,15 +2522,32 @@ static int _dwc2_hcd_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, | |||
| 2523 | urb->iso_frame_desc[i].length); | 2522 | urb->iso_frame_desc[i].length); |
| 2524 | 2523 | ||
| 2525 | urb->hcpriv = dwc2_urb; | 2524 | urb->hcpriv = dwc2_urb; |
| 2525 | qh = (struct dwc2_qh *) ep->hcpriv; | ||
| 2526 | /* Create QH for the endpoint if it doesn't exist */ | ||
| 2527 | if (!qh) { | ||
| 2528 | qh = dwc2_hcd_qh_create(hsotg, dwc2_urb, mem_flags); | ||
| 2529 | if (!qh) { | ||
| 2530 | retval = -ENOMEM; | ||
| 2531 | goto fail0; | ||
| 2532 | } | ||
| 2533 | ep->hcpriv = qh; | ||
| 2534 | qh_allocated = true; | ||
| 2535 | } | ||
| 2536 | |||
| 2537 | qtd = kzalloc(sizeof(*qtd), mem_flags); | ||
| 2538 | if (!qtd) { | ||
| 2539 | retval = -ENOMEM; | ||
| 2540 | goto fail1; | ||
| 2541 | } | ||
| 2526 | 2542 | ||
| 2527 | spin_lock_irqsave(&hsotg->lock, flags); | 2543 | spin_lock_irqsave(&hsotg->lock, flags); |
| 2528 | retval = usb_hcd_link_urb_to_ep(hcd, urb); | 2544 | retval = usb_hcd_link_urb_to_ep(hcd, urb); |
| 2529 | if (retval) | 2545 | if (retval) |
| 2530 | goto fail1; | 2546 | goto fail2; |
| 2531 | 2547 | ||
| 2532 | retval = dwc2_hcd_urb_enqueue(hsotg, dwc2_urb, &ep->hcpriv, mem_flags); | 2548 | retval = dwc2_hcd_urb_enqueue(hsotg, dwc2_urb, qh, qtd); |
| 2533 | if (retval) | 2549 | if (retval) |
| 2534 | goto fail2; | 2550 | goto fail3; |
| 2535 | 2551 | ||
| 2536 | if (alloc_bandwidth) { | 2552 | if (alloc_bandwidth) { |
| 2537 | dwc2_allocate_bus_bandwidth(hcd, | 2553 | dwc2_allocate_bus_bandwidth(hcd, |
| @@ -2543,12 +2559,25 @@ static int _dwc2_hcd_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, | |||
| 2543 | 2559 | ||
| 2544 | return 0; | 2560 | return 0; |
| 2545 | 2561 | ||
| 2546 | fail2: | 2562 | fail3: |
| 2547 | dwc2_urb->priv = NULL; | 2563 | dwc2_urb->priv = NULL; |
| 2548 | usb_hcd_unlink_urb_from_ep(hcd, urb); | 2564 | usb_hcd_unlink_urb_from_ep(hcd, urb); |
| 2549 | fail1: | 2565 | fail2: |
| 2550 | spin_unlock_irqrestore(&hsotg->lock, flags); | 2566 | spin_unlock_irqrestore(&hsotg->lock, flags); |
| 2551 | urb->hcpriv = NULL; | 2567 | urb->hcpriv = NULL; |
| 2568 | kfree(qtd); | ||
| 2569 | fail1: | ||
| 2570 | if (qh_allocated) { | ||
| 2571 | struct dwc2_qtd *qtd2, *qtd2_tmp; | ||
| 2572 | |||
| 2573 | ep->hcpriv = NULL; | ||
| 2574 | dwc2_hcd_qh_unlink(hsotg, qh); | ||
| 2575 | /* Free each QTD in the QH's QTD list */ | ||
| 2576 | list_for_each_entry_safe(qtd2, qtd2_tmp, &qh->qtd_list, | ||
| 2577 | qtd_list_entry) | ||
| 2578 | dwc2_hcd_qtd_unlink_and_free(hsotg, qtd2, qh); | ||
| 2579 | dwc2_hcd_qh_free(hsotg, qh); | ||
| 2580 | } | ||
| 2552 | fail0: | 2581 | fail0: |
| 2553 | kfree(dwc2_urb); | 2582 | kfree(dwc2_urb); |
| 2554 | 2583 | ||
diff --git a/drivers/usb/dwc2/hcd.h b/drivers/usb/dwc2/hcd.h index 7b5841c40033..fc1054965552 100644 --- a/drivers/usb/dwc2/hcd.h +++ b/drivers/usb/dwc2/hcd.h | |||
| @@ -463,6 +463,9 @@ extern void dwc2_hcd_queue_transactions(struct dwc2_hsotg *hsotg, | |||
| 463 | /* Schedule Queue Functions */ | 463 | /* Schedule Queue Functions */ |
| 464 | /* Implemented in hcd_queue.c */ | 464 | /* Implemented in hcd_queue.c */ |
| 465 | extern void dwc2_hcd_init_usecs(struct dwc2_hsotg *hsotg); | 465 | extern void dwc2_hcd_init_usecs(struct dwc2_hsotg *hsotg); |
| 466 | extern struct dwc2_qh *dwc2_hcd_qh_create(struct dwc2_hsotg *hsotg, | ||
| 467 | struct dwc2_hcd_urb *urb, | ||
| 468 | gfp_t mem_flags); | ||
| 466 | extern void dwc2_hcd_qh_free(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh); | 469 | extern void dwc2_hcd_qh_free(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh); |
| 467 | extern int dwc2_hcd_qh_add(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh); | 470 | extern int dwc2_hcd_qh_add(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh); |
| 468 | extern void dwc2_hcd_qh_unlink(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh); | 471 | extern void dwc2_hcd_qh_unlink(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh); |
| @@ -471,7 +474,7 @@ extern void dwc2_hcd_qh_deactivate(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh, | |||
| 471 | 474 | ||
| 472 | extern void dwc2_hcd_qtd_init(struct dwc2_qtd *qtd, struct dwc2_hcd_urb *urb); | 475 | extern void dwc2_hcd_qtd_init(struct dwc2_qtd *qtd, struct dwc2_hcd_urb *urb); |
| 473 | extern int dwc2_hcd_qtd_add(struct dwc2_hsotg *hsotg, struct dwc2_qtd *qtd, | 476 | extern int dwc2_hcd_qtd_add(struct dwc2_hsotg *hsotg, struct dwc2_qtd *qtd, |
| 474 | struct dwc2_qh **qh, gfp_t mem_flags); | 477 | struct dwc2_qh *qh); |
| 475 | 478 | ||
| 476 | /* Unlinks and frees a QTD */ | 479 | /* Unlinks and frees a QTD */ |
| 477 | static inline void dwc2_hcd_qtd_unlink_and_free(struct dwc2_hsotg *hsotg, | 480 | static inline void dwc2_hcd_qtd_unlink_and_free(struct dwc2_hsotg *hsotg, |
diff --git a/drivers/usb/dwc2/hcd_queue.c b/drivers/usb/dwc2/hcd_queue.c index 9b5c36256627..3ad63d392e13 100644 --- a/drivers/usb/dwc2/hcd_queue.c +++ b/drivers/usb/dwc2/hcd_queue.c | |||
| @@ -191,7 +191,7 @@ static void dwc2_qh_init(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh, | |||
| 191 | * | 191 | * |
| 192 | * Return: Pointer to the newly allocated QH, or NULL on error | 192 | * Return: Pointer to the newly allocated QH, or NULL on error |
| 193 | */ | 193 | */ |
| 194 | static struct dwc2_qh *dwc2_hcd_qh_create(struct dwc2_hsotg *hsotg, | 194 | struct dwc2_qh *dwc2_hcd_qh_create(struct dwc2_hsotg *hsotg, |
| 195 | struct dwc2_hcd_urb *urb, | 195 | struct dwc2_hcd_urb *urb, |
| 196 | gfp_t mem_flags) | 196 | gfp_t mem_flags) |
| 197 | { | 197 | { |
| @@ -767,57 +767,32 @@ void dwc2_hcd_qtd_init(struct dwc2_qtd *qtd, struct dwc2_hcd_urb *urb) | |||
| 767 | * | 767 | * |
| 768 | * @hsotg: The DWC HCD structure | 768 | * @hsotg: The DWC HCD structure |
| 769 | * @qtd: The QTD to add | 769 | * @qtd: The QTD to add |
| 770 | * @qh: Out parameter to return queue head | 770 | * @qh: Queue head to add qtd to |
| 771 | * @atomic_alloc: Flag to do atomic alloc if needed | ||
| 772 | * | 771 | * |
| 773 | * Return: 0 if successful, negative error code otherwise | 772 | * Return: 0 if successful, negative error code otherwise |
| 774 | * | 773 | * |
| 775 | * Finds the correct QH to place the QTD into. If it does not find a QH, it | 774 | * If the QH to which the QTD is added is not currently scheduled, it is placed |
| 776 | * will create a new QH. If the QH to which the QTD is added is not currently | 775 | * into the proper schedule based on its EP type. |
| 777 | * scheduled, it is placed into the proper schedule based on its EP type. | ||
| 778 | */ | 776 | */ |
| 779 | int dwc2_hcd_qtd_add(struct dwc2_hsotg *hsotg, struct dwc2_qtd *qtd, | 777 | int dwc2_hcd_qtd_add(struct dwc2_hsotg *hsotg, struct dwc2_qtd *qtd, |
| 780 | struct dwc2_qh **qh, gfp_t mem_flags) | 778 | struct dwc2_qh *qh) |
| 781 | { | 779 | { |
| 782 | struct dwc2_hcd_urb *urb = qtd->urb; | ||
| 783 | int allocated = 0; | ||
| 784 | int retval; | 780 | int retval; |
| 785 | 781 | ||
| 786 | /* | 782 | if (unlikely(!qh)) { |
| 787 | * Get the QH which holds the QTD-list to insert to. Create QH if it | 783 | dev_err(hsotg->dev, "%s: Invalid QH\n", __func__); |
| 788 | * doesn't exist. | 784 | retval = -EINVAL; |
| 789 | */ | 785 | goto fail; |
| 790 | if (*qh == NULL) { | ||
| 791 | *qh = dwc2_hcd_qh_create(hsotg, urb, mem_flags); | ||
| 792 | if (*qh == NULL) | ||
| 793 | return -ENOMEM; | ||
| 794 | allocated = 1; | ||
| 795 | } | 786 | } |
| 796 | 787 | ||
| 797 | retval = dwc2_hcd_qh_add(hsotg, *qh); | 788 | retval = dwc2_hcd_qh_add(hsotg, qh); |
| 798 | if (retval) | 789 | if (retval) |
| 799 | goto fail; | 790 | goto fail; |
| 800 | 791 | ||
| 801 | qtd->qh = *qh; | 792 | qtd->qh = qh; |
| 802 | list_add_tail(&qtd->qtd_list_entry, &(*qh)->qtd_list); | 793 | list_add_tail(&qtd->qtd_list_entry, &qh->qtd_list); |
| 803 | 794 | ||
| 804 | return 0; | 795 | return 0; |
| 805 | |||
| 806 | fail: | 796 | fail: |
| 807 | if (allocated) { | ||
| 808 | struct dwc2_qtd *qtd2, *qtd2_tmp; | ||
| 809 | struct dwc2_qh *qh_tmp = *qh; | ||
| 810 | |||
| 811 | *qh = NULL; | ||
| 812 | dwc2_hcd_qh_unlink(hsotg, qh_tmp); | ||
| 813 | |||
| 814 | /* Free each QTD in the QH's QTD list */ | ||
| 815 | list_for_each_entry_safe(qtd2, qtd2_tmp, &qh_tmp->qtd_list, | ||
| 816 | qtd_list_entry) | ||
| 817 | dwc2_hcd_qtd_unlink_and_free(hsotg, qtd2, qh_tmp); | ||
| 818 | |||
| 819 | dwc2_hcd_qh_free(hsotg, qh_tmp); | ||
| 820 | } | ||
| 821 | |||
| 822 | return retval; | 797 | return retval; |
| 823 | } | 798 | } |
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index 5c110d8e293b..ff5773c66b84 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c | |||
| @@ -446,10 +446,12 @@ static int dwc3_phy_setup(struct dwc3 *dwc) | |||
| 446 | /* Select the HS PHY interface */ | 446 | /* Select the HS PHY interface */ |
| 447 | switch (DWC3_GHWPARAMS3_HSPHY_IFC(dwc->hwparams.hwparams3)) { | 447 | switch (DWC3_GHWPARAMS3_HSPHY_IFC(dwc->hwparams.hwparams3)) { |
| 448 | case DWC3_GHWPARAMS3_HSPHY_IFC_UTMI_ULPI: | 448 | case DWC3_GHWPARAMS3_HSPHY_IFC_UTMI_ULPI: |
| 449 | if (!strncmp(dwc->hsphy_interface, "utmi", 4)) { | 449 | if (dwc->hsphy_interface && |
| 450 | !strncmp(dwc->hsphy_interface, "utmi", 4)) { | ||
| 450 | reg &= ~DWC3_GUSB2PHYCFG_ULPI_UTMI; | 451 | reg &= ~DWC3_GUSB2PHYCFG_ULPI_UTMI; |
| 451 | break; | 452 | break; |
| 452 | } else if (!strncmp(dwc->hsphy_interface, "ulpi", 4)) { | 453 | } else if (dwc->hsphy_interface && |
| 454 | !strncmp(dwc->hsphy_interface, "ulpi", 4)) { | ||
| 453 | reg |= DWC3_GUSB2PHYCFG_ULPI_UTMI; | 455 | reg |= DWC3_GUSB2PHYCFG_ULPI_UTMI; |
| 454 | dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), reg); | 456 | dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), reg); |
| 455 | } else { | 457 | } else { |
diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c index 4e3447bbd097..58b4657fc721 100644 --- a/drivers/usb/gadget/composite.c +++ b/drivers/usb/gadget/composite.c | |||
| @@ -1758,10 +1758,13 @@ unknown: | |||
| 1758 | * take such requests too, if that's ever needed: to work | 1758 | * take such requests too, if that's ever needed: to work |
| 1759 | * in config 0, etc. | 1759 | * in config 0, etc. |
| 1760 | */ | 1760 | */ |
| 1761 | list_for_each_entry(f, &cdev->config->functions, list) | 1761 | if (cdev->config) { |
| 1762 | if (f->req_match && f->req_match(f, ctrl)) | 1762 | list_for_each_entry(f, &cdev->config->functions, list) |
| 1763 | goto try_fun_setup; | 1763 | if (f->req_match && f->req_match(f, ctrl)) |
| 1764 | f = NULL; | 1764 | goto try_fun_setup; |
| 1765 | f = NULL; | ||
| 1766 | } | ||
| 1767 | |||
| 1765 | switch (ctrl->bRequestType & USB_RECIP_MASK) { | 1768 | switch (ctrl->bRequestType & USB_RECIP_MASK) { |
| 1766 | case USB_RECIP_INTERFACE: | 1769 | case USB_RECIP_INTERFACE: |
| 1767 | if (!cdev->config || intf >= MAX_CONFIG_INTERFACES) | 1770 | if (!cdev->config || intf >= MAX_CONFIG_INTERFACES) |
diff --git a/drivers/usb/gadget/configfs.c b/drivers/usb/gadget/configfs.c index 0495c94a23d7..289e20119fea 100644 --- a/drivers/usb/gadget/configfs.c +++ b/drivers/usb/gadget/configfs.c | |||
| @@ -571,7 +571,7 @@ static struct config_group *function_make( | |||
| 571 | if (IS_ERR(fi)) | 571 | if (IS_ERR(fi)) |
| 572 | return ERR_CAST(fi); | 572 | return ERR_CAST(fi); |
| 573 | 573 | ||
| 574 | ret = config_item_set_name(&fi->group.cg_item, name); | 574 | ret = config_item_set_name(&fi->group.cg_item, "%s", name); |
| 575 | if (ret) { | 575 | if (ret) { |
| 576 | usb_put_function_instance(fi); | 576 | usb_put_function_instance(fi); |
| 577 | return ERR_PTR(ret); | 577 | return ERR_PTR(ret); |
diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c index 45b8c8b338df..6e7be91e6097 100644 --- a/drivers/usb/gadget/function/f_fs.c +++ b/drivers/usb/gadget/function/f_fs.c | |||
| @@ -924,7 +924,8 @@ static ssize_t ffs_epfile_write_iter(struct kiocb *kiocb, struct iov_iter *from) | |||
| 924 | 924 | ||
| 925 | kiocb->private = p; | 925 | kiocb->private = p; |
| 926 | 926 | ||
| 927 | kiocb_set_cancel_fn(kiocb, ffs_aio_cancel); | 927 | if (p->aio) |
| 928 | kiocb_set_cancel_fn(kiocb, ffs_aio_cancel); | ||
| 928 | 929 | ||
| 929 | res = ffs_epfile_io(kiocb->ki_filp, p); | 930 | res = ffs_epfile_io(kiocb->ki_filp, p); |
| 930 | if (res == -EIOCBQUEUED) | 931 | if (res == -EIOCBQUEUED) |
| @@ -968,7 +969,8 @@ static ssize_t ffs_epfile_read_iter(struct kiocb *kiocb, struct iov_iter *to) | |||
| 968 | 969 | ||
| 969 | kiocb->private = p; | 970 | kiocb->private = p; |
| 970 | 971 | ||
| 971 | kiocb_set_cancel_fn(kiocb, ffs_aio_cancel); | 972 | if (p->aio) |
| 973 | kiocb_set_cancel_fn(kiocb, ffs_aio_cancel); | ||
| 972 | 974 | ||
| 973 | res = ffs_epfile_io(kiocb->ki_filp, p); | 975 | res = ffs_epfile_io(kiocb->ki_filp, p); |
| 974 | if (res == -EIOCBQUEUED) | 976 | if (res == -EIOCBQUEUED) |
diff --git a/drivers/usb/gadget/function/f_mass_storage.c b/drivers/usb/gadget/function/f_mass_storage.c index d2259c663996..f936268d26c6 100644 --- a/drivers/usb/gadget/function/f_mass_storage.c +++ b/drivers/usb/gadget/function/f_mass_storage.c | |||
| @@ -2786,7 +2786,7 @@ int fsg_common_set_nluns(struct fsg_common *common, int nluns) | |||
| 2786 | return -EINVAL; | 2786 | return -EINVAL; |
| 2787 | } | 2787 | } |
| 2788 | 2788 | ||
| 2789 | curlun = kcalloc(nluns, sizeof(*curlun), GFP_KERNEL); | 2789 | curlun = kcalloc(FSG_MAX_LUNS, sizeof(*curlun), GFP_KERNEL); |
| 2790 | if (unlikely(!curlun)) | 2790 | if (unlikely(!curlun)) |
| 2791 | return -ENOMEM; | 2791 | return -ENOMEM; |
| 2792 | 2792 | ||
| @@ -2796,8 +2796,6 @@ int fsg_common_set_nluns(struct fsg_common *common, int nluns) | |||
| 2796 | common->luns = curlun; | 2796 | common->luns = curlun; |
| 2797 | common->nluns = nluns; | 2797 | common->nluns = nluns; |
| 2798 | 2798 | ||
| 2799 | pr_info("Number of LUNs=%d\n", common->nluns); | ||
| 2800 | |||
| 2801 | return 0; | 2799 | return 0; |
| 2802 | } | 2800 | } |
| 2803 | EXPORT_SYMBOL_GPL(fsg_common_set_nluns); | 2801 | EXPORT_SYMBOL_GPL(fsg_common_set_nluns); |
| @@ -3563,14 +3561,26 @@ static struct usb_function *fsg_alloc(struct usb_function_instance *fi) | |||
| 3563 | struct fsg_opts *opts = fsg_opts_from_func_inst(fi); | 3561 | struct fsg_opts *opts = fsg_opts_from_func_inst(fi); |
| 3564 | struct fsg_common *common = opts->common; | 3562 | struct fsg_common *common = opts->common; |
| 3565 | struct fsg_dev *fsg; | 3563 | struct fsg_dev *fsg; |
| 3564 | unsigned nluns, i; | ||
| 3566 | 3565 | ||
| 3567 | fsg = kzalloc(sizeof(*fsg), GFP_KERNEL); | 3566 | fsg = kzalloc(sizeof(*fsg), GFP_KERNEL); |
| 3568 | if (unlikely(!fsg)) | 3567 | if (unlikely(!fsg)) |
| 3569 | return ERR_PTR(-ENOMEM); | 3568 | return ERR_PTR(-ENOMEM); |
| 3570 | 3569 | ||
| 3571 | mutex_lock(&opts->lock); | 3570 | mutex_lock(&opts->lock); |
| 3571 | if (!opts->refcnt) { | ||
| 3572 | for (nluns = i = 0; i < FSG_MAX_LUNS; ++i) | ||
| 3573 | if (common->luns[i]) | ||
| 3574 | nluns = i + 1; | ||
| 3575 | if (!nluns) | ||
| 3576 | pr_warn("No LUNS defined, continuing anyway\n"); | ||
| 3577 | else | ||
| 3578 | common->nluns = nluns; | ||
| 3579 | pr_info("Number of LUNs=%u\n", common->nluns); | ||
| 3580 | } | ||
| 3572 | opts->refcnt++; | 3581 | opts->refcnt++; |
| 3573 | mutex_unlock(&opts->lock); | 3582 | mutex_unlock(&opts->lock); |
| 3583 | |||
| 3574 | fsg->function.name = FSG_DRIVER_DESC; | 3584 | fsg->function.name = FSG_DRIVER_DESC; |
| 3575 | fsg->function.bind = fsg_bind; | 3585 | fsg->function.bind = fsg_bind; |
| 3576 | fsg->function.unbind = fsg_unbind; | 3586 | fsg->function.unbind = fsg_unbind; |
diff --git a/drivers/usb/gadget/function/f_midi.c b/drivers/usb/gadget/function/f_midi.c index 6316aa5b1c49..ad50a67c1465 100644 --- a/drivers/usb/gadget/function/f_midi.c +++ b/drivers/usb/gadget/function/f_midi.c | |||
| @@ -1145,7 +1145,7 @@ static struct usb_function *f_midi_alloc(struct usb_function_instance *fi) | |||
| 1145 | if (opts->id && !midi->id) { | 1145 | if (opts->id && !midi->id) { |
| 1146 | status = -ENOMEM; | 1146 | status = -ENOMEM; |
| 1147 | mutex_unlock(&opts->lock); | 1147 | mutex_unlock(&opts->lock); |
| 1148 | goto kstrdup_fail; | 1148 | goto setup_fail; |
| 1149 | } | 1149 | } |
| 1150 | midi->in_ports = opts->in_ports; | 1150 | midi->in_ports = opts->in_ports; |
| 1151 | midi->out_ports = opts->out_ports; | 1151 | midi->out_ports = opts->out_ports; |
| @@ -1164,8 +1164,6 @@ static struct usb_function *f_midi_alloc(struct usb_function_instance *fi) | |||
| 1164 | 1164 | ||
| 1165 | return &midi->func; | 1165 | return &midi->func; |
| 1166 | 1166 | ||
| 1167 | kstrdup_fail: | ||
| 1168 | f_midi_unregister_card(midi); | ||
| 1169 | setup_fail: | 1167 | setup_fail: |
| 1170 | for (--i; i >= 0; i--) | 1168 | for (--i; i >= 0; i--) |
| 1171 | kfree(midi->in_port[i]); | 1169 | kfree(midi->in_port[i]); |
diff --git a/drivers/usb/gadget/udc/fotg210-udc.c b/drivers/usb/gadget/udc/fotg210-udc.c index e547ea7f56b1..1137e3384218 100644 --- a/drivers/usb/gadget/udc/fotg210-udc.c +++ b/drivers/usb/gadget/udc/fotg210-udc.c | |||
| @@ -1171,7 +1171,7 @@ static int fotg210_udc_probe(struct platform_device *pdev) | |||
| 1171 | udc_name, fotg210); | 1171 | udc_name, fotg210); |
| 1172 | if (ret < 0) { | 1172 | if (ret < 0) { |
| 1173 | pr_err("request_irq error (%d)\n", ret); | 1173 | pr_err("request_irq error (%d)\n", ret); |
| 1174 | goto err_irq; | 1174 | goto err_req; |
| 1175 | } | 1175 | } |
| 1176 | 1176 | ||
| 1177 | ret = usb_add_gadget_udc(&pdev->dev, &fotg210->gadget); | 1177 | ret = usb_add_gadget_udc(&pdev->dev, &fotg210->gadget); |
| @@ -1183,7 +1183,6 @@ static int fotg210_udc_probe(struct platform_device *pdev) | |||
| 1183 | return 0; | 1183 | return 0; |
| 1184 | 1184 | ||
| 1185 | err_add_udc: | 1185 | err_add_udc: |
| 1186 | err_irq: | ||
| 1187 | free_irq(ires->start, fotg210); | 1186 | free_irq(ires->start, fotg210); |
| 1188 | 1187 | ||
| 1189 | err_req: | 1188 | err_req: |
diff --git a/drivers/usb/musb/musb_virthub.c b/drivers/usb/musb/musb_virthub.c index 30842bc195f5..92d5f718659b 100644 --- a/drivers/usb/musb/musb_virthub.c +++ b/drivers/usb/musb/musb_virthub.c | |||
| @@ -275,9 +275,7 @@ static int musb_has_gadget(struct musb *musb) | |||
| 275 | #ifdef CONFIG_USB_MUSB_HOST | 275 | #ifdef CONFIG_USB_MUSB_HOST |
| 276 | return 1; | 276 | return 1; |
| 277 | #else | 277 | #else |
| 278 | if (musb->port_mode == MUSB_PORT_MODE_HOST) | 278 | return musb->port_mode == MUSB_PORT_MODE_HOST; |
| 279 | return 1; | ||
| 280 | return musb->g.dev.driver != NULL; | ||
| 281 | #endif | 279 | #endif |
| 282 | } | 280 | } |
| 283 | 281 | ||
diff --git a/drivers/usb/phy/phy-mxs-usb.c b/drivers/usb/phy/phy-mxs-usb.c index 8f7cb068d29b..3fcc0483a081 100644 --- a/drivers/usb/phy/phy-mxs-usb.c +++ b/drivers/usb/phy/phy-mxs-usb.c | |||
| @@ -217,6 +217,9 @@ static bool mxs_phy_get_vbus_status(struct mxs_phy *mxs_phy) | |||
| 217 | { | 217 | { |
| 218 | unsigned int vbus_value; | 218 | unsigned int vbus_value; |
| 219 | 219 | ||
| 220 | if (!mxs_phy->regmap_anatop) | ||
| 221 | return false; | ||
| 222 | |||
| 220 | if (mxs_phy->port_id == 0) | 223 | if (mxs_phy->port_id == 0) |
| 221 | regmap_read(mxs_phy->regmap_anatop, | 224 | regmap_read(mxs_phy->regmap_anatop, |
| 222 | ANADIG_USB1_VBUS_DET_STAT, | 225 | ANADIG_USB1_VBUS_DET_STAT, |
diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c index ffd739e31bfc..eac7ccaa3c85 100644 --- a/drivers/usb/serial/cp210x.c +++ b/drivers/usb/serial/cp210x.c | |||
| @@ -187,6 +187,7 @@ static const struct usb_device_id id_table[] = { | |||
| 187 | { USB_DEVICE(0x1FB9, 0x0602) }, /* Lake Shore Model 648 Magnet Power Supply */ | 187 | { USB_DEVICE(0x1FB9, 0x0602) }, /* Lake Shore Model 648 Magnet Power Supply */ |
| 188 | { USB_DEVICE(0x1FB9, 0x0700) }, /* Lake Shore Model 737 VSM Controller */ | 188 | { USB_DEVICE(0x1FB9, 0x0700) }, /* Lake Shore Model 737 VSM Controller */ |
| 189 | { USB_DEVICE(0x1FB9, 0x0701) }, /* Lake Shore Model 776 Hall Matrix */ | 189 | { USB_DEVICE(0x1FB9, 0x0701) }, /* Lake Shore Model 776 Hall Matrix */ |
| 190 | { USB_DEVICE(0x2626, 0xEA60) }, /* Aruba Networks 7xxx USB Serial Console */ | ||
| 190 | { USB_DEVICE(0x3195, 0xF190) }, /* Link Instruments MSO-19 */ | 191 | { USB_DEVICE(0x3195, 0xF190) }, /* Link Instruments MSO-19 */ |
| 191 | { USB_DEVICE(0x3195, 0xF280) }, /* Link Instruments MSO-28 */ | 192 | { USB_DEVICE(0x3195, 0xF280) }, /* Link Instruments MSO-28 */ |
| 192 | { USB_DEVICE(0x3195, 0xF281) }, /* Link Instruments MSO-28 */ | 193 | { USB_DEVICE(0x3195, 0xF281) }, /* Link Instruments MSO-28 */ |
diff --git a/drivers/usb/serial/mos7720.c b/drivers/usb/serial/mos7720.c index 4f70df33975a..78b4f64c6b00 100644 --- a/drivers/usb/serial/mos7720.c +++ b/drivers/usb/serial/mos7720.c | |||
| @@ -121,26 +121,26 @@ static DEFINE_SPINLOCK(release_lock); | |||
| 121 | static const unsigned int dummy; /* for clarity in register access fns */ | 121 | static const unsigned int dummy; /* for clarity in register access fns */ |
| 122 | 122 | ||
| 123 | enum mos_regs { | 123 | enum mos_regs { |
| 124 | THR, /* serial port regs */ | 124 | MOS7720_THR, /* serial port regs */ |
| 125 | RHR, | 125 | MOS7720_RHR, |
| 126 | IER, | 126 | MOS7720_IER, |
| 127 | FCR, | 127 | MOS7720_FCR, |
| 128 | ISR, | 128 | MOS7720_ISR, |
| 129 | LCR, | 129 | MOS7720_LCR, |
| 130 | MCR, | 130 | MOS7720_MCR, |
| 131 | LSR, | 131 | MOS7720_LSR, |
| 132 | MSR, | 132 | MOS7720_MSR, |
| 133 | SPR, | 133 | MOS7720_SPR, |
| 134 | DLL, | 134 | MOS7720_DLL, |
| 135 | DLM, | 135 | MOS7720_DLM, |
| 136 | DPR, /* parallel port regs */ | 136 | MOS7720_DPR, /* parallel port regs */ |
| 137 | DSR, | 137 | MOS7720_DSR, |
| 138 | DCR, | 138 | MOS7720_DCR, |
| 139 | ECR, | 139 | MOS7720_ECR, |
| 140 | SP1_REG, /* device control regs */ | 140 | MOS7720_SP1_REG, /* device control regs */ |
| 141 | SP2_REG, /* serial port 2 (7720 only) */ | 141 | MOS7720_SP2_REG, /* serial port 2 (7720 only) */ |
| 142 | PP_REG, | 142 | MOS7720_PP_REG, |
| 143 | SP_CONTROL_REG, | 143 | MOS7720_SP_CONTROL_REG, |
| 144 | }; | 144 | }; |
| 145 | 145 | ||
| 146 | /* | 146 | /* |
| @@ -150,26 +150,26 @@ enum mos_regs { | |||
| 150 | static inline __u16 get_reg_index(enum mos_regs reg) | 150 | static inline __u16 get_reg_index(enum mos_regs reg) |
| 151 | { | 151 | { |
| 152 | static const __u16 mos7715_index_lookup_table[] = { | 152 | static const __u16 mos7715_index_lookup_table[] = { |
| 153 | 0x00, /* THR */ | 153 | 0x00, /* MOS7720_THR */ |
| 154 | 0x00, /* RHR */ | 154 | 0x00, /* MOS7720_RHR */ |
| 155 | 0x01, /* IER */ | 155 | 0x01, /* MOS7720_IER */ |
| 156 | 0x02, /* FCR */ | 156 | 0x02, /* MOS7720_FCR */ |
| 157 | 0x02, /* ISR */ | 157 | 0x02, /* MOS7720_ISR */ |
| 158 | 0x03, /* LCR */ | 158 | 0x03, /* MOS7720_LCR */ |
| 159 | 0x04, /* MCR */ | 159 | 0x04, /* MOS7720_MCR */ |
| 160 | 0x05, /* LSR */ | 160 | 0x05, /* MOS7720_LSR */ |
| 161 | 0x06, /* MSR */ | 161 | 0x06, /* MOS7720_MSR */ |
| 162 | 0x07, /* SPR */ | 162 | 0x07, /* MOS7720_SPR */ |
| 163 | 0x00, /* DLL */ | 163 | 0x00, /* MOS7720_DLL */ |
| 164 | 0x01, /* DLM */ | 164 | 0x01, /* MOS7720_DLM */ |
| 165 | 0x00, /* DPR */ | 165 | 0x00, /* MOS7720_DPR */ |
| 166 | 0x01, /* DSR */ | 166 | 0x01, /* MOS7720_DSR */ |
| 167 | 0x02, /* DCR */ | 167 | 0x02, /* MOS7720_DCR */ |
| 168 | 0x0a, /* ECR */ | 168 | 0x0a, /* MOS7720_ECR */ |
| 169 | 0x01, /* SP1_REG */ | 169 | 0x01, /* MOS7720_SP1_REG */ |
| 170 | 0x02, /* SP2_REG (7720 only) */ | 170 | 0x02, /* MOS7720_SP2_REG (7720 only) */ |
| 171 | 0x04, /* PP_REG (7715 only) */ | 171 | 0x04, /* MOS7720_PP_REG (7715 only) */ |
| 172 | 0x08, /* SP_CONTROL_REG */ | 172 | 0x08, /* MOS7720_SP_CONTROL_REG */ |
| 173 | }; | 173 | }; |
| 174 | return mos7715_index_lookup_table[reg]; | 174 | return mos7715_index_lookup_table[reg]; |
| 175 | } | 175 | } |
| @@ -181,10 +181,10 @@ static inline __u16 get_reg_index(enum mos_regs reg) | |||
| 181 | static inline __u16 get_reg_value(enum mos_regs reg, | 181 | static inline __u16 get_reg_value(enum mos_regs reg, |
| 182 | unsigned int serial_portnum) | 182 | unsigned int serial_portnum) |
| 183 | { | 183 | { |
| 184 | if (reg >= SP1_REG) /* control reg */ | 184 | if (reg >= MOS7720_SP1_REG) /* control reg */ |
| 185 | return 0x0000; | 185 | return 0x0000; |
| 186 | 186 | ||
| 187 | else if (reg >= DPR) /* parallel port reg (7715 only) */ | 187 | else if (reg >= MOS7720_DPR) /* parallel port reg (7715 only) */ |
| 188 | return 0x0100; | 188 | return 0x0100; |
| 189 | 189 | ||
| 190 | else /* serial port reg */ | 190 | else /* serial port reg */ |
| @@ -252,7 +252,8 @@ static inline int mos7715_change_mode(struct mos7715_parport *mos_parport, | |||
| 252 | enum mos7715_pp_modes mode) | 252 | enum mos7715_pp_modes mode) |
| 253 | { | 253 | { |
| 254 | mos_parport->shadowECR = mode; | 254 | mos_parport->shadowECR = mode; |
| 255 | write_mos_reg(mos_parport->serial, dummy, ECR, mos_parport->shadowECR); | 255 | write_mos_reg(mos_parport->serial, dummy, MOS7720_ECR, |
| 256 | mos_parport->shadowECR); | ||
| 256 | return 0; | 257 | return 0; |
| 257 | } | 258 | } |
| 258 | 259 | ||
| @@ -486,7 +487,7 @@ static void parport_mos7715_write_data(struct parport *pp, unsigned char d) | |||
| 486 | if (parport_prologue(pp) < 0) | 487 | if (parport_prologue(pp) < 0) |
| 487 | return; | 488 | return; |
| 488 | mos7715_change_mode(mos_parport, SPP); | 489 | mos7715_change_mode(mos_parport, SPP); |
| 489 | write_mos_reg(mos_parport->serial, dummy, DPR, (__u8)d); | 490 | write_mos_reg(mos_parport->serial, dummy, MOS7720_DPR, (__u8)d); |
| 490 | parport_epilogue(pp); | 491 | parport_epilogue(pp); |
| 491 | } | 492 | } |
| 492 | 493 | ||
| @@ -497,7 +498,7 @@ static unsigned char parport_mos7715_read_data(struct parport *pp) | |||
| 497 | 498 | ||
| 498 | if (parport_prologue(pp) < 0) | 499 | if (parport_prologue(pp) < 0) |
| 499 | return 0; | 500 | return 0; |
| 500 | read_mos_reg(mos_parport->serial, dummy, DPR, &d); | 501 | read_mos_reg(mos_parport->serial, dummy, MOS7720_DPR, &d); |
| 501 | parport_epilogue(pp); | 502 | parport_epilogue(pp); |
| 502 | return d; | 503 | return d; |
| 503 | } | 504 | } |
| @@ -510,7 +511,7 @@ static void parport_mos7715_write_control(struct parport *pp, unsigned char d) | |||
| 510 | if (parport_prologue(pp) < 0) | 511 | if (parport_prologue(pp) < 0) |
| 511 | return; | 512 | return; |
| 512 | data = ((__u8)d & 0x0f) | (mos_parport->shadowDCR & 0xf0); | 513 | data = ((__u8)d & 0x0f) | (mos_parport->shadowDCR & 0xf0); |
| 513 | write_mos_reg(mos_parport->serial, dummy, DCR, data); | 514 | write_mos_reg(mos_parport->serial, dummy, MOS7720_DCR, data); |
| 514 | mos_parport->shadowDCR = data; | 515 | mos_parport->shadowDCR = data; |
| 515 | parport_epilogue(pp); | 516 | parport_epilogue(pp); |
| 516 | } | 517 | } |
| @@ -543,7 +544,8 @@ static unsigned char parport_mos7715_frob_control(struct parport *pp, | |||
| 543 | if (parport_prologue(pp) < 0) | 544 | if (parport_prologue(pp) < 0) |
| 544 | return 0; | 545 | return 0; |
| 545 | mos_parport->shadowDCR = (mos_parport->shadowDCR & (~mask)) ^ val; | 546 | mos_parport->shadowDCR = (mos_parport->shadowDCR & (~mask)) ^ val; |
| 546 | write_mos_reg(mos_parport->serial, dummy, DCR, mos_parport->shadowDCR); | 547 | write_mos_reg(mos_parport->serial, dummy, MOS7720_DCR, |
| 548 | mos_parport->shadowDCR); | ||
| 547 | dcr = mos_parport->shadowDCR & 0x0f; | 549 | dcr = mos_parport->shadowDCR & 0x0f; |
| 548 | parport_epilogue(pp); | 550 | parport_epilogue(pp); |
| 549 | return dcr; | 551 | return dcr; |
| @@ -581,7 +583,8 @@ static void parport_mos7715_data_forward(struct parport *pp) | |||
| 581 | return; | 583 | return; |
| 582 | mos7715_change_mode(mos_parport, PS2); | 584 | mos7715_change_mode(mos_parport, PS2); |
| 583 | mos_parport->shadowDCR &= ~0x20; | 585 | mos_parport->shadowDCR &= ~0x20; |
| 584 | write_mos_reg(mos_parport->serial, dummy, DCR, mos_parport->shadowDCR); | 586 | write_mos_reg(mos_parport->serial, dummy, MOS7720_DCR, |
| 587 | mos_parport->shadowDCR); | ||
| 585 | parport_epilogue(pp); | 588 | parport_epilogue(pp); |
| 586 | } | 589 | } |
| 587 | 590 | ||
| @@ -593,7 +596,8 @@ static void parport_mos7715_data_reverse(struct parport *pp) | |||
| 593 | return; | 596 | return; |
| 594 | mos7715_change_mode(mos_parport, PS2); | 597 | mos7715_change_mode(mos_parport, PS2); |
| 595 | mos_parport->shadowDCR |= 0x20; | 598 | mos_parport->shadowDCR |= 0x20; |
| 596 | write_mos_reg(mos_parport->serial, dummy, DCR, mos_parport->shadowDCR); | 599 | write_mos_reg(mos_parport->serial, dummy, MOS7720_DCR, |
| 600 | mos_parport->shadowDCR); | ||
| 597 | parport_epilogue(pp); | 601 | parport_epilogue(pp); |
| 598 | } | 602 | } |
| 599 | 603 | ||
| @@ -633,8 +637,10 @@ static void parport_mos7715_restore_state(struct parport *pp, | |||
| 633 | spin_unlock(&release_lock); | 637 | spin_unlock(&release_lock); |
| 634 | return; | 638 | return; |
| 635 | } | 639 | } |
| 636 | write_parport_reg_nonblock(mos_parport, DCR, mos_parport->shadowDCR); | 640 | write_parport_reg_nonblock(mos_parport, MOS7720_DCR, |
| 637 | write_parport_reg_nonblock(mos_parport, ECR, mos_parport->shadowECR); | 641 | mos_parport->shadowDCR); |
| 642 | write_parport_reg_nonblock(mos_parport, MOS7720_ECR, | ||
| 643 | mos_parport->shadowECR); | ||
| 638 | spin_unlock(&release_lock); | 644 | spin_unlock(&release_lock); |
| 639 | } | 645 | } |
| 640 | 646 | ||
| @@ -714,14 +720,16 @@ static int mos7715_parport_init(struct usb_serial *serial) | |||
| 714 | init_completion(&mos_parport->syncmsg_compl); | 720 | init_completion(&mos_parport->syncmsg_compl); |
| 715 | 721 | ||
| 716 | /* cycle parallel port reset bit */ | 722 | /* cycle parallel port reset bit */ |
| 717 | write_mos_reg(mos_parport->serial, dummy, PP_REG, (__u8)0x80); | 723 | write_mos_reg(mos_parport->serial, dummy, MOS7720_PP_REG, (__u8)0x80); |
| 718 | write_mos_reg(mos_parport->serial, dummy, PP_REG, (__u8)0x00); | 724 | write_mos_reg(mos_parport->serial, dummy, MOS7720_PP_REG, (__u8)0x00); |
| 719 | 725 | ||
| 720 | /* initialize device registers */ | 726 | /* initialize device registers */ |
| 721 | mos_parport->shadowDCR = DCR_INIT_VAL; | 727 | mos_parport->shadowDCR = DCR_INIT_VAL; |
| 722 | write_mos_reg(mos_parport->serial, dummy, DCR, mos_parport->shadowDCR); | 728 | write_mos_reg(mos_parport->serial, dummy, MOS7720_DCR, |
| 729 | mos_parport->shadowDCR); | ||
| 723 | mos_parport->shadowECR = ECR_INIT_VAL; | 730 | mos_parport->shadowECR = ECR_INIT_VAL; |
| 724 | write_mos_reg(mos_parport->serial, dummy, ECR, mos_parport->shadowECR); | 731 | write_mos_reg(mos_parport->serial, dummy, MOS7720_ECR, |
| 732 | mos_parport->shadowECR); | ||
| 725 | 733 | ||
| 726 | /* register with parport core */ | 734 | /* register with parport core */ |
| 727 | mos_parport->pp = parport_register_port(0, PARPORT_IRQ_NONE, | 735 | mos_parport->pp = parport_register_port(0, PARPORT_IRQ_NONE, |
| @@ -1033,45 +1041,49 @@ static int mos7720_open(struct tty_struct *tty, struct usb_serial_port *port) | |||
| 1033 | /* Initialize MCS7720 -- Write Init values to corresponding Registers | 1041 | /* Initialize MCS7720 -- Write Init values to corresponding Registers |
| 1034 | * | 1042 | * |
| 1035 | * Register Index | 1043 | * Register Index |
| 1036 | * 0 : THR/RHR | 1044 | * 0 : MOS7720_THR/MOS7720_RHR |
| 1037 | * 1 : IER | 1045 | * 1 : MOS7720_IER |
| 1038 | * 2 : FCR | 1046 | * 2 : MOS7720_FCR |
| 1039 | * 3 : LCR | 1047 | * 3 : MOS7720_LCR |
| 1040 | * 4 : MCR | 1048 | * 4 : MOS7720_MCR |
| 1041 | * 5 : LSR | 1049 | * 5 : MOS7720_LSR |
| 1042 | * 6 : MSR | 1050 | * 6 : MOS7720_MSR |
| 1043 | * 7 : SPR | 1051 | * 7 : MOS7720_SPR |
| 1044 | * | 1052 | * |
| 1045 | * 0x08 : SP1/2 Control Reg | 1053 | * 0x08 : SP1/2 Control Reg |
| 1046 | */ | 1054 | */ |
| 1047 | port_number = port->port_number; | 1055 | port_number = port->port_number; |
| 1048 | read_mos_reg(serial, port_number, LSR, &data); | 1056 | read_mos_reg(serial, port_number, MOS7720_LSR, &data); |
| 1049 | 1057 | ||
| 1050 | dev_dbg(&port->dev, "SS::%p LSR:%x\n", mos7720_port, data); | 1058 | dev_dbg(&port->dev, "SS::%p LSR:%x\n", mos7720_port, data); |
| 1051 | 1059 | ||
| 1052 | write_mos_reg(serial, dummy, SP1_REG, 0x02); | 1060 | write_mos_reg(serial, dummy, MOS7720_SP1_REG, 0x02); |
| 1053 | write_mos_reg(serial, dummy, SP2_REG, 0x02); | 1061 | write_mos_reg(serial, dummy, MOS7720_SP2_REG, 0x02); |
| 1054 | 1062 | ||
| 1055 | write_mos_reg(serial, port_number, IER, 0x00); | 1063 | write_mos_reg(serial, port_number, MOS7720_IER, 0x00); |
| 1056 | write_mos_reg(serial, port_number, FCR, 0x00); | 1064 | write_mos_reg(serial, port_number, MOS7720_FCR, 0x00); |
| 1057 | 1065 | ||
| 1058 | write_mos_reg(serial, port_number, FCR, 0xcf); | 1066 | write_mos_reg(serial, port_number, MOS7720_FCR, 0xcf); |
| 1059 | mos7720_port->shadowLCR = 0x03; | 1067 | mos7720_port->shadowLCR = 0x03; |
| 1060 | write_mos_reg(serial, port_number, LCR, mos7720_port->shadowLCR); | 1068 | write_mos_reg(serial, port_number, MOS7720_LCR, |
| 1069 | mos7720_port->shadowLCR); | ||
| 1061 | mos7720_port->shadowMCR = 0x0b; | 1070 | mos7720_port->shadowMCR = 0x0b; |
| 1062 | write_mos_reg(serial, port_number, MCR, mos7720_port->shadowMCR); | 1071 | write_mos_reg(serial, port_number, MOS7720_MCR, |
| 1072 | mos7720_port->shadowMCR); | ||
| 1063 | 1073 | ||
| 1064 | write_mos_reg(serial, port_number, SP_CONTROL_REG, 0x00); | 1074 | write_mos_reg(serial, port_number, MOS7720_SP_CONTROL_REG, 0x00); |
| 1065 | read_mos_reg(serial, dummy, SP_CONTROL_REG, &data); | 1075 | read_mos_reg(serial, dummy, MOS7720_SP_CONTROL_REG, &data); |
| 1066 | data = data | (port->port_number + 1); | 1076 | data = data | (port->port_number + 1); |
| 1067 | write_mos_reg(serial, dummy, SP_CONTROL_REG, data); | 1077 | write_mos_reg(serial, dummy, MOS7720_SP_CONTROL_REG, data); |
| 1068 | mos7720_port->shadowLCR = 0x83; | 1078 | mos7720_port->shadowLCR = 0x83; |
| 1069 | write_mos_reg(serial, port_number, LCR, mos7720_port->shadowLCR); | 1079 | write_mos_reg(serial, port_number, MOS7720_LCR, |
| 1070 | write_mos_reg(serial, port_number, THR, 0x0c); | 1080 | mos7720_port->shadowLCR); |
| 1071 | write_mos_reg(serial, port_number, IER, 0x00); | 1081 | write_mos_reg(serial, port_number, MOS7720_THR, 0x0c); |
| 1082 | write_mos_reg(serial, port_number, MOS7720_IER, 0x00); | ||
| 1072 | mos7720_port->shadowLCR = 0x03; | 1083 | mos7720_port->shadowLCR = 0x03; |
| 1073 | write_mos_reg(serial, port_number, LCR, mos7720_port->shadowLCR); | 1084 | write_mos_reg(serial, port_number, MOS7720_LCR, |
| 1074 | write_mos_reg(serial, port_number, IER, 0x0c); | 1085 | mos7720_port->shadowLCR); |
| 1086 | write_mos_reg(serial, port_number, MOS7720_IER, 0x0c); | ||
| 1075 | 1087 | ||
| 1076 | response = usb_submit_urb(port->read_urb, GFP_KERNEL); | 1088 | response = usb_submit_urb(port->read_urb, GFP_KERNEL); |
| 1077 | if (response) | 1089 | if (response) |
| @@ -1144,8 +1156,8 @@ static void mos7720_close(struct usb_serial_port *port) | |||
| 1144 | usb_kill_urb(port->write_urb); | 1156 | usb_kill_urb(port->write_urb); |
| 1145 | usb_kill_urb(port->read_urb); | 1157 | usb_kill_urb(port->read_urb); |
| 1146 | 1158 | ||
| 1147 | write_mos_reg(serial, port->port_number, MCR, 0x00); | 1159 | write_mos_reg(serial, port->port_number, MOS7720_MCR, 0x00); |
| 1148 | write_mos_reg(serial, port->port_number, IER, 0x00); | 1160 | write_mos_reg(serial, port->port_number, MOS7720_IER, 0x00); |
| 1149 | 1161 | ||
| 1150 | mos7720_port->open = 0; | 1162 | mos7720_port->open = 0; |
| 1151 | } | 1163 | } |
| @@ -1169,7 +1181,8 @@ static void mos7720_break(struct tty_struct *tty, int break_state) | |||
| 1169 | data = mos7720_port->shadowLCR & ~UART_LCR_SBC; | 1181 | data = mos7720_port->shadowLCR & ~UART_LCR_SBC; |
| 1170 | 1182 | ||
| 1171 | mos7720_port->shadowLCR = data; | 1183 | mos7720_port->shadowLCR = data; |
| 1172 | write_mos_reg(serial, port->port_number, LCR, mos7720_port->shadowLCR); | 1184 | write_mos_reg(serial, port->port_number, MOS7720_LCR, |
| 1185 | mos7720_port->shadowLCR); | ||
| 1173 | } | 1186 | } |
| 1174 | 1187 | ||
| 1175 | /* | 1188 | /* |
| @@ -1297,7 +1310,7 @@ static void mos7720_throttle(struct tty_struct *tty) | |||
| 1297 | /* if we are implementing RTS/CTS, toggle that line */ | 1310 | /* if we are implementing RTS/CTS, toggle that line */ |
| 1298 | if (tty->termios.c_cflag & CRTSCTS) { | 1311 | if (tty->termios.c_cflag & CRTSCTS) { |
| 1299 | mos7720_port->shadowMCR &= ~UART_MCR_RTS; | 1312 | mos7720_port->shadowMCR &= ~UART_MCR_RTS; |
| 1300 | write_mos_reg(port->serial, port->port_number, MCR, | 1313 | write_mos_reg(port->serial, port->port_number, MOS7720_MCR, |
| 1301 | mos7720_port->shadowMCR); | 1314 | mos7720_port->shadowMCR); |
| 1302 | } | 1315 | } |
| 1303 | } | 1316 | } |
| @@ -1327,7 +1340,7 @@ static void mos7720_unthrottle(struct tty_struct *tty) | |||
| 1327 | /* if we are implementing RTS/CTS, toggle that line */ | 1340 | /* if we are implementing RTS/CTS, toggle that line */ |
| 1328 | if (tty->termios.c_cflag & CRTSCTS) { | 1341 | if (tty->termios.c_cflag & CRTSCTS) { |
| 1329 | mos7720_port->shadowMCR |= UART_MCR_RTS; | 1342 | mos7720_port->shadowMCR |= UART_MCR_RTS; |
| 1330 | write_mos_reg(port->serial, port->port_number, MCR, | 1343 | write_mos_reg(port->serial, port->port_number, MOS7720_MCR, |
| 1331 | mos7720_port->shadowMCR); | 1344 | mos7720_port->shadowMCR); |
| 1332 | } | 1345 | } |
| 1333 | } | 1346 | } |
| @@ -1352,35 +1365,39 @@ static int set_higher_rates(struct moschip_port *mos7720_port, | |||
| 1352 | dev_dbg(&port->dev, "Sending Setting Commands ..........\n"); | 1365 | dev_dbg(&port->dev, "Sending Setting Commands ..........\n"); |
| 1353 | port_number = port->port_number; | 1366 | port_number = port->port_number; |
| 1354 | 1367 | ||
| 1355 | write_mos_reg(serial, port_number, IER, 0x00); | 1368 | write_mos_reg(serial, port_number, MOS7720_IER, 0x00); |
| 1356 | write_mos_reg(serial, port_number, FCR, 0x00); | 1369 | write_mos_reg(serial, port_number, MOS7720_FCR, 0x00); |
| 1357 | write_mos_reg(serial, port_number, FCR, 0xcf); | 1370 | write_mos_reg(serial, port_number, MOS7720_FCR, 0xcf); |
| 1358 | mos7720_port->shadowMCR = 0x0b; | 1371 | mos7720_port->shadowMCR = 0x0b; |
| 1359 | write_mos_reg(serial, port_number, MCR, mos7720_port->shadowMCR); | 1372 | write_mos_reg(serial, port_number, MOS7720_MCR, |
| 1360 | write_mos_reg(serial, dummy, SP_CONTROL_REG, 0x00); | 1373 | mos7720_port->shadowMCR); |
| 1374 | write_mos_reg(serial, dummy, MOS7720_SP_CONTROL_REG, 0x00); | ||
| 1361 | 1375 | ||
| 1362 | /*********************************************** | 1376 | /*********************************************** |
| 1363 | * Set for higher rates * | 1377 | * Set for higher rates * |
| 1364 | ***********************************************/ | 1378 | ***********************************************/ |
| 1365 | /* writing baud rate verbatum into uart clock field clearly not right */ | 1379 | /* writing baud rate verbatum into uart clock field clearly not right */ |
| 1366 | if (port_number == 0) | 1380 | if (port_number == 0) |
| 1367 | sp_reg = SP1_REG; | 1381 | sp_reg = MOS7720_SP1_REG; |
| 1368 | else | 1382 | else |
| 1369 | sp_reg = SP2_REG; | 1383 | sp_reg = MOS7720_SP2_REG; |
| 1370 | write_mos_reg(serial, dummy, sp_reg, baud * 0x10); | 1384 | write_mos_reg(serial, dummy, sp_reg, baud * 0x10); |
| 1371 | write_mos_reg(serial, dummy, SP_CONTROL_REG, 0x03); | 1385 | write_mos_reg(serial, dummy, MOS7720_SP_CONTROL_REG, 0x03); |
| 1372 | mos7720_port->shadowMCR = 0x2b; | 1386 | mos7720_port->shadowMCR = 0x2b; |
| 1373 | write_mos_reg(serial, port_number, MCR, mos7720_port->shadowMCR); | 1387 | write_mos_reg(serial, port_number, MOS7720_MCR, |
| 1388 | mos7720_port->shadowMCR); | ||
| 1374 | 1389 | ||
| 1375 | /*********************************************** | 1390 | /*********************************************** |
| 1376 | * Set DLL/DLM | 1391 | * Set DLL/DLM |
| 1377 | ***********************************************/ | 1392 | ***********************************************/ |
| 1378 | mos7720_port->shadowLCR = mos7720_port->shadowLCR | UART_LCR_DLAB; | 1393 | mos7720_port->shadowLCR = mos7720_port->shadowLCR | UART_LCR_DLAB; |
| 1379 | write_mos_reg(serial, port_number, LCR, mos7720_port->shadowLCR); | 1394 | write_mos_reg(serial, port_number, MOS7720_LCR, |
| 1380 | write_mos_reg(serial, port_number, DLL, 0x01); | 1395 | mos7720_port->shadowLCR); |
| 1381 | write_mos_reg(serial, port_number, DLM, 0x00); | 1396 | write_mos_reg(serial, port_number, MOS7720_DLL, 0x01); |
| 1397 | write_mos_reg(serial, port_number, MOS7720_DLM, 0x00); | ||
| 1382 | mos7720_port->shadowLCR = mos7720_port->shadowLCR & ~UART_LCR_DLAB; | 1398 | mos7720_port->shadowLCR = mos7720_port->shadowLCR & ~UART_LCR_DLAB; |
| 1383 | write_mos_reg(serial, port_number, LCR, mos7720_port->shadowLCR); | 1399 | write_mos_reg(serial, port_number, MOS7720_LCR, |
| 1400 | mos7720_port->shadowLCR); | ||
| 1384 | 1401 | ||
| 1385 | return 0; | 1402 | return 0; |
| 1386 | } | 1403 | } |
| @@ -1488,15 +1505,16 @@ static int send_cmd_write_baud_rate(struct moschip_port *mos7720_port, | |||
| 1488 | 1505 | ||
| 1489 | /* Enable access to divisor latch */ | 1506 | /* Enable access to divisor latch */ |
| 1490 | mos7720_port->shadowLCR = mos7720_port->shadowLCR | UART_LCR_DLAB; | 1507 | mos7720_port->shadowLCR = mos7720_port->shadowLCR | UART_LCR_DLAB; |
| 1491 | write_mos_reg(serial, number, LCR, mos7720_port->shadowLCR); | 1508 | write_mos_reg(serial, number, MOS7720_LCR, mos7720_port->shadowLCR); |
| 1492 | 1509 | ||
| 1493 | /* Write the divisor */ | 1510 | /* Write the divisor */ |
| 1494 | write_mos_reg(serial, number, DLL, (__u8)(divisor & 0xff)); | 1511 | write_mos_reg(serial, number, MOS7720_DLL, (__u8)(divisor & 0xff)); |
| 1495 | write_mos_reg(serial, number, DLM, (__u8)((divisor & 0xff00) >> 8)); | 1512 | write_mos_reg(serial, number, MOS7720_DLM, |
| 1513 | (__u8)((divisor & 0xff00) >> 8)); | ||
| 1496 | 1514 | ||
| 1497 | /* Disable access to divisor latch */ | 1515 | /* Disable access to divisor latch */ |
| 1498 | mos7720_port->shadowLCR = mos7720_port->shadowLCR & ~UART_LCR_DLAB; | 1516 | mos7720_port->shadowLCR = mos7720_port->shadowLCR & ~UART_LCR_DLAB; |
| 1499 | write_mos_reg(serial, number, LCR, mos7720_port->shadowLCR); | 1517 | write_mos_reg(serial, number, MOS7720_LCR, mos7720_port->shadowLCR); |
| 1500 | 1518 | ||
| 1501 | return status; | 1519 | return status; |
| 1502 | } | 1520 | } |
| @@ -1600,14 +1618,16 @@ static void change_port_settings(struct tty_struct *tty, | |||
| 1600 | 1618 | ||
| 1601 | 1619 | ||
| 1602 | /* Disable Interrupts */ | 1620 | /* Disable Interrupts */ |
| 1603 | write_mos_reg(serial, port_number, IER, 0x00); | 1621 | write_mos_reg(serial, port_number, MOS7720_IER, 0x00); |
| 1604 | write_mos_reg(serial, port_number, FCR, 0x00); | 1622 | write_mos_reg(serial, port_number, MOS7720_FCR, 0x00); |
| 1605 | write_mos_reg(serial, port_number, FCR, 0xcf); | 1623 | write_mos_reg(serial, port_number, MOS7720_FCR, 0xcf); |
| 1606 | 1624 | ||
| 1607 | /* Send the updated LCR value to the mos7720 */ | 1625 | /* Send the updated LCR value to the mos7720 */ |
| 1608 | write_mos_reg(serial, port_number, LCR, mos7720_port->shadowLCR); | 1626 | write_mos_reg(serial, port_number, MOS7720_LCR, |
| 1627 | mos7720_port->shadowLCR); | ||
| 1609 | mos7720_port->shadowMCR = 0x0b; | 1628 | mos7720_port->shadowMCR = 0x0b; |
| 1610 | write_mos_reg(serial, port_number, MCR, mos7720_port->shadowMCR); | 1629 | write_mos_reg(serial, port_number, MOS7720_MCR, |
| 1630 | mos7720_port->shadowMCR); | ||
| 1611 | 1631 | ||
| 1612 | /* set up the MCR register and send it to the mos7720 */ | 1632 | /* set up the MCR register and send it to the mos7720 */ |
| 1613 | mos7720_port->shadowMCR = UART_MCR_OUT2; | 1633 | mos7720_port->shadowMCR = UART_MCR_OUT2; |
| @@ -1619,14 +1639,17 @@ static void change_port_settings(struct tty_struct *tty, | |||
| 1619 | /* To set hardware flow control to the specified * | 1639 | /* To set hardware flow control to the specified * |
| 1620 | * serial port, in SP1/2_CONTROL_REG */ | 1640 | * serial port, in SP1/2_CONTROL_REG */ |
| 1621 | if (port_number) | 1641 | if (port_number) |
| 1622 | write_mos_reg(serial, dummy, SP_CONTROL_REG, 0x01); | 1642 | write_mos_reg(serial, dummy, MOS7720_SP_CONTROL_REG, |
| 1643 | 0x01); | ||
| 1623 | else | 1644 | else |
| 1624 | write_mos_reg(serial, dummy, SP_CONTROL_REG, 0x02); | 1645 | write_mos_reg(serial, dummy, MOS7720_SP_CONTROL_REG, |
| 1646 | 0x02); | ||
| 1625 | 1647 | ||
| 1626 | } else | 1648 | } else |
| 1627 | mos7720_port->shadowMCR &= ~(UART_MCR_XONANY); | 1649 | mos7720_port->shadowMCR &= ~(UART_MCR_XONANY); |
| 1628 | 1650 | ||
| 1629 | write_mos_reg(serial, port_number, MCR, mos7720_port->shadowMCR); | 1651 | write_mos_reg(serial, port_number, MOS7720_MCR, |
| 1652 | mos7720_port->shadowMCR); | ||
| 1630 | 1653 | ||
| 1631 | /* Determine divisor based on baud rate */ | 1654 | /* Determine divisor based on baud rate */ |
| 1632 | baud = tty_get_baud_rate(tty); | 1655 | baud = tty_get_baud_rate(tty); |
| @@ -1639,7 +1662,7 @@ static void change_port_settings(struct tty_struct *tty, | |||
| 1639 | if (baud >= 230400) { | 1662 | if (baud >= 230400) { |
| 1640 | set_higher_rates(mos7720_port, baud); | 1663 | set_higher_rates(mos7720_port, baud); |
| 1641 | /* Enable Interrupts */ | 1664 | /* Enable Interrupts */ |
| 1642 | write_mos_reg(serial, port_number, IER, 0x0c); | 1665 | write_mos_reg(serial, port_number, MOS7720_IER, 0x0c); |
| 1643 | return; | 1666 | return; |
| 1644 | } | 1667 | } |
| 1645 | 1668 | ||
| @@ -1650,7 +1673,7 @@ static void change_port_settings(struct tty_struct *tty, | |||
| 1650 | if (cflag & CBAUD) | 1673 | if (cflag & CBAUD) |
| 1651 | tty_encode_baud_rate(tty, baud, baud); | 1674 | tty_encode_baud_rate(tty, baud, baud); |
| 1652 | /* Enable Interrupts */ | 1675 | /* Enable Interrupts */ |
| 1653 | write_mos_reg(serial, port_number, IER, 0x0c); | 1676 | write_mos_reg(serial, port_number, MOS7720_IER, 0x0c); |
| 1654 | 1677 | ||
| 1655 | if (port->read_urb->status != -EINPROGRESS) { | 1678 | if (port->read_urb->status != -EINPROGRESS) { |
| 1656 | status = usb_submit_urb(port->read_urb, GFP_KERNEL); | 1679 | status = usb_submit_urb(port->read_urb, GFP_KERNEL); |
| @@ -1725,7 +1748,7 @@ static int get_lsr_info(struct tty_struct *tty, | |||
| 1725 | 1748 | ||
| 1726 | count = mos7720_chars_in_buffer(tty); | 1749 | count = mos7720_chars_in_buffer(tty); |
| 1727 | if (count == 0) { | 1750 | if (count == 0) { |
| 1728 | read_mos_reg(port->serial, port_number, LSR, &data); | 1751 | read_mos_reg(port->serial, port_number, MOS7720_LSR, &data); |
| 1729 | if ((data & (UART_LSR_TEMT | UART_LSR_THRE)) | 1752 | if ((data & (UART_LSR_TEMT | UART_LSR_THRE)) |
| 1730 | == (UART_LSR_TEMT | UART_LSR_THRE)) { | 1753 | == (UART_LSR_TEMT | UART_LSR_THRE)) { |
| 1731 | dev_dbg(&port->dev, "%s -- Empty\n", __func__); | 1754 | dev_dbg(&port->dev, "%s -- Empty\n", __func__); |
| @@ -1782,7 +1805,7 @@ static int mos7720_tiocmset(struct tty_struct *tty, | |||
| 1782 | mcr &= ~UART_MCR_LOOP; | 1805 | mcr &= ~UART_MCR_LOOP; |
| 1783 | 1806 | ||
| 1784 | mos7720_port->shadowMCR = mcr; | 1807 | mos7720_port->shadowMCR = mcr; |
| 1785 | write_mos_reg(port->serial, port->port_number, MCR, | 1808 | write_mos_reg(port->serial, port->port_number, MOS7720_MCR, |
| 1786 | mos7720_port->shadowMCR); | 1809 | mos7720_port->shadowMCR); |
| 1787 | 1810 | ||
| 1788 | return 0; | 1811 | return 0; |
| @@ -1827,7 +1850,7 @@ static int set_modem_info(struct moschip_port *mos7720_port, unsigned int cmd, | |||
| 1827 | } | 1850 | } |
| 1828 | 1851 | ||
| 1829 | mos7720_port->shadowMCR = mcr; | 1852 | mos7720_port->shadowMCR = mcr; |
| 1830 | write_mos_reg(port->serial, port->port_number, MCR, | 1853 | write_mos_reg(port->serial, port->port_number, MOS7720_MCR, |
| 1831 | mos7720_port->shadowMCR); | 1854 | mos7720_port->shadowMCR); |
| 1832 | 1855 | ||
| 1833 | return 0; | 1856 | return 0; |
| @@ -1942,7 +1965,7 @@ static int mos7720_startup(struct usb_serial *serial) | |||
| 1942 | } | 1965 | } |
| 1943 | #endif | 1966 | #endif |
| 1944 | /* LSR For Port 1 */ | 1967 | /* LSR For Port 1 */ |
| 1945 | read_mos_reg(serial, 0, LSR, &data); | 1968 | read_mos_reg(serial, 0, MOS7720_LSR, &data); |
| 1946 | dev_dbg(&dev->dev, "LSR:%x\n", data); | 1969 | dev_dbg(&dev->dev, "LSR:%x\n", data); |
| 1947 | 1970 | ||
| 1948 | return 0; | 1971 | return 0; |
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index f0c0c53359ad..19b85ee98a72 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
| @@ -1765,6 +1765,7 @@ static const struct usb_device_id option_ids[] = { | |||
| 1765 | { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d03, 0xff, 0x00, 0x00) }, | 1765 | { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d03, 0xff, 0x00, 0x00) }, |
| 1766 | { USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3e01, 0xff, 0xff, 0xff) }, /* D-Link DWM-152/C1 */ | 1766 | { USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3e01, 0xff, 0xff, 0xff) }, /* D-Link DWM-152/C1 */ |
| 1767 | { USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3e02, 0xff, 0xff, 0xff) }, /* D-Link DWM-156/C1 */ | 1767 | { USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3e02, 0xff, 0xff, 0xff) }, /* D-Link DWM-156/C1 */ |
| 1768 | { USB_DEVICE_INTERFACE_CLASS(0x2020, 0x4000, 0xff) }, /* OLICARD300 - MT6225 */ | ||
| 1768 | { USB_DEVICE(INOVIA_VENDOR_ID, INOVIA_SEW858) }, | 1769 | { USB_DEVICE(INOVIA_VENDOR_ID, INOVIA_SEW858) }, |
| 1769 | { USB_DEVICE(VIATELECOM_VENDOR_ID, VIATELECOM_PRODUCT_CDS7) }, | 1770 | { USB_DEVICE(VIATELECOM_VENDOR_ID, VIATELECOM_PRODUCT_CDS7) }, |
| 1770 | { } /* Terminating entry */ | 1771 | { } /* Terminating entry */ |
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c index 529066bbc7e8..46f1f13b41f1 100644 --- a/drivers/usb/serial/usb-serial.c +++ b/drivers/usb/serial/usb-serial.c | |||
| @@ -1306,6 +1306,7 @@ static void __exit usb_serial_exit(void) | |||
| 1306 | tty_unregister_driver(usb_serial_tty_driver); | 1306 | tty_unregister_driver(usb_serial_tty_driver); |
| 1307 | put_tty_driver(usb_serial_tty_driver); | 1307 | put_tty_driver(usb_serial_tty_driver); |
| 1308 | bus_unregister(&usb_serial_bus_type); | 1308 | bus_unregister(&usb_serial_bus_type); |
| 1309 | idr_destroy(&serial_minors); | ||
| 1309 | } | 1310 | } |
| 1310 | 1311 | ||
| 1311 | 1312 | ||
diff --git a/drivers/watchdog/sp805_wdt.c b/drivers/watchdog/sp805_wdt.c index c1b03f4235b9..4e7fec36f5c3 100644 --- a/drivers/watchdog/sp805_wdt.c +++ b/drivers/watchdog/sp805_wdt.c | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * Watchdog driver for ARM SP805 watchdog module | 4 | * Watchdog driver for ARM SP805 watchdog module |
| 5 | * | 5 | * |
| 6 | * Copyright (C) 2010 ST Microelectronics | 6 | * Copyright (C) 2010 ST Microelectronics |
| 7 | * Viresh Kumar <viresh.linux@gmail.com> | 7 | * Viresh Kumar <vireshk@kernel.org> |
| 8 | * | 8 | * |
| 9 | * This file is licensed under the terms of the GNU General Public | 9 | * This file is licensed under the terms of the GNU General Public |
| 10 | * License version 2 or later. This program is licensed "as is" without any | 10 | * License version 2 or later. This program is licensed "as is" without any |
| @@ -303,6 +303,6 @@ static struct amba_driver sp805_wdt_driver = { | |||
| 303 | 303 | ||
| 304 | module_amba_driver(sp805_wdt_driver); | 304 | module_amba_driver(sp805_wdt_driver); |
| 305 | 305 | ||
| 306 | MODULE_AUTHOR("Viresh Kumar <viresh.linux@gmail.com>"); | 306 | MODULE_AUTHOR("Viresh Kumar <vireshk@kernel.org>"); |
| 307 | MODULE_DESCRIPTION("ARM SP805 Watchdog Driver"); | 307 | MODULE_DESCRIPTION("ARM SP805 Watchdog Driver"); |
| 308 | MODULE_LICENSE("GPL"); | 308 | MODULE_LICENSE("GPL"); |
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 1c2bd1723e40..171312d51799 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
| @@ -2296,9 +2296,22 @@ static int run_one_delayed_ref(struct btrfs_trans_handle *trans, | |||
| 2296 | static inline struct btrfs_delayed_ref_node * | 2296 | static inline struct btrfs_delayed_ref_node * |
| 2297 | select_delayed_ref(struct btrfs_delayed_ref_head *head) | 2297 | select_delayed_ref(struct btrfs_delayed_ref_head *head) |
| 2298 | { | 2298 | { |
| 2299 | struct btrfs_delayed_ref_node *ref; | ||
| 2300 | |||
| 2299 | if (list_empty(&head->ref_list)) | 2301 | if (list_empty(&head->ref_list)) |
| 2300 | return NULL; | 2302 | return NULL; |
| 2301 | 2303 | ||
| 2304 | /* | ||
| 2305 | * Select a delayed ref of type BTRFS_ADD_DELAYED_REF first. | ||
| 2306 | * This is to prevent a ref count from going down to zero, which deletes | ||
| 2307 | * the extent item from the extent tree, when there still are references | ||
| 2308 | * to add, which would fail because they would not find the extent item. | ||
| 2309 | */ | ||
| 2310 | list_for_each_entry(ref, &head->ref_list, list) { | ||
| 2311 | if (ref->action == BTRFS_ADD_DELAYED_REF) | ||
| 2312 | return ref; | ||
| 2313 | } | ||
| 2314 | |||
| 2302 | return list_entry(head->ref_list.next, struct btrfs_delayed_ref_node, | 2315 | return list_entry(head->ref_list.next, struct btrfs_delayed_ref_node, |
| 2303 | list); | 2316 | list); |
| 2304 | } | 2317 | } |
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index b33c0cf02668..e33dff356460 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
| @@ -4209,7 +4209,7 @@ int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans, | |||
| 4209 | u64 extent_num_bytes = 0; | 4209 | u64 extent_num_bytes = 0; |
| 4210 | u64 extent_offset = 0; | 4210 | u64 extent_offset = 0; |
| 4211 | u64 item_end = 0; | 4211 | u64 item_end = 0; |
| 4212 | u64 last_size = (u64)-1; | 4212 | u64 last_size = new_size; |
| 4213 | u32 found_type = (u8)-1; | 4213 | u32 found_type = (u8)-1; |
| 4214 | int found_extent; | 4214 | int found_extent; |
| 4215 | int del_item; | 4215 | int del_item; |
| @@ -4493,8 +4493,7 @@ out: | |||
| 4493 | btrfs_abort_transaction(trans, root, ret); | 4493 | btrfs_abort_transaction(trans, root, ret); |
| 4494 | } | 4494 | } |
| 4495 | error: | 4495 | error: |
| 4496 | if (last_size != (u64)-1 && | 4496 | if (root->root_key.objectid != BTRFS_TREE_LOG_OBJECTID) |
| 4497 | root->root_key.objectid != BTRFS_TREE_LOG_OBJECTID) | ||
| 4498 | btrfs_ordered_update_i_size(inode, last_size, NULL); | 4497 | btrfs_ordered_update_i_size(inode, last_size, NULL); |
| 4499 | 4498 | ||
| 4500 | btrfs_free_path(path); | 4499 | btrfs_free_path(path); |
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 5d91776e12a2..0770c91586ca 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c | |||
| @@ -3090,7 +3090,7 @@ out_unlock: | |||
| 3090 | static long btrfs_ioctl_file_extent_same(struct file *file, | 3090 | static long btrfs_ioctl_file_extent_same(struct file *file, |
| 3091 | struct btrfs_ioctl_same_args __user *argp) | 3091 | struct btrfs_ioctl_same_args __user *argp) |
| 3092 | { | 3092 | { |
| 3093 | struct btrfs_ioctl_same_args *same; | 3093 | struct btrfs_ioctl_same_args *same = NULL; |
| 3094 | struct btrfs_ioctl_same_extent_info *info; | 3094 | struct btrfs_ioctl_same_extent_info *info; |
| 3095 | struct inode *src = file_inode(file); | 3095 | struct inode *src = file_inode(file); |
| 3096 | u64 off; | 3096 | u64 off; |
| @@ -3120,6 +3120,7 @@ static long btrfs_ioctl_file_extent_same(struct file *file, | |||
| 3120 | 3120 | ||
| 3121 | if (IS_ERR(same)) { | 3121 | if (IS_ERR(same)) { |
| 3122 | ret = PTR_ERR(same); | 3122 | ret = PTR_ERR(same); |
| 3123 | same = NULL; | ||
| 3123 | goto out; | 3124 | goto out; |
| 3124 | } | 3125 | } |
| 3125 | 3126 | ||
| @@ -3190,6 +3191,7 @@ static long btrfs_ioctl_file_extent_same(struct file *file, | |||
| 3190 | 3191 | ||
| 3191 | out: | 3192 | out: |
| 3192 | mnt_drop_write_file(file); | 3193 | mnt_drop_write_file(file); |
| 3194 | kfree(same); | ||
| 3193 | return ret; | 3195 | return ret; |
| 3194 | } | 3196 | } |
| 3195 | 3197 | ||
| @@ -3586,6 +3588,20 @@ process_slot: | |||
| 3586 | u64 trim = 0; | 3588 | u64 trim = 0; |
| 3587 | u64 aligned_end = 0; | 3589 | u64 aligned_end = 0; |
| 3588 | 3590 | ||
| 3591 | /* | ||
| 3592 | * Don't copy an inline extent into an offset | ||
| 3593 | * greater than zero. Having an inline extent | ||
| 3594 | * at such an offset results in chaos as btrfs | ||
| 3595 | * isn't prepared for such cases. Just skip | ||
| 3596 | * this case for the same reasons as commented | ||
| 3597 | * at btrfs_ioctl_clone(). | ||
| 3598 | */ | ||
| 3599 | if (last_dest_end > 0) { | ||
| 3600 | ret = -EOPNOTSUPP; | ||
| 3601 | btrfs_end_transaction(trans, root); | ||
| 3602 | goto out; | ||
| 3603 | } | ||
| 3604 | |||
| 3589 | if (off > key.offset) { | 3605 | if (off > key.offset) { |
| 3590 | skip = off - key.offset; | 3606 | skip = off - key.offset; |
| 3591 | new_key.offset += skip; | 3607 | new_key.offset += skip; |
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index c0f18e7266b6..51e0f0d0053e 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c | |||
| @@ -761,7 +761,7 @@ static int __btrfs_end_transaction(struct btrfs_trans_handle *trans, | |||
| 761 | 761 | ||
| 762 | if (!list_empty(&trans->ordered)) { | 762 | if (!list_empty(&trans->ordered)) { |
| 763 | spin_lock(&info->trans_lock); | 763 | spin_lock(&info->trans_lock); |
| 764 | list_splice(&trans->ordered, &cur_trans->pending_ordered); | 764 | list_splice_init(&trans->ordered, &cur_trans->pending_ordered); |
| 765 | spin_unlock(&info->trans_lock); | 765 | spin_unlock(&info->trans_lock); |
| 766 | } | 766 | } |
| 767 | 767 | ||
| @@ -1866,7 +1866,7 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans, | |||
| 1866 | } | 1866 | } |
| 1867 | 1867 | ||
| 1868 | spin_lock(&root->fs_info->trans_lock); | 1868 | spin_lock(&root->fs_info->trans_lock); |
| 1869 | list_splice(&trans->ordered, &cur_trans->pending_ordered); | 1869 | list_splice_init(&trans->ordered, &cur_trans->pending_ordered); |
| 1870 | if (cur_trans->state >= TRANS_STATE_COMMIT_START) { | 1870 | if (cur_trans->state >= TRANS_STATE_COMMIT_START) { |
| 1871 | spin_unlock(&root->fs_info->trans_lock); | 1871 | spin_unlock(&root->fs_info->trans_lock); |
| 1872 | atomic_inc(&cur_trans->use_count); | 1872 | atomic_inc(&cur_trans->use_count); |
diff --git a/fs/configfs/item.c b/fs/configfs/item.c index 4d6a30e76168..b863a09cd2f1 100644 --- a/fs/configfs/item.c +++ b/fs/configfs/item.c | |||
| @@ -115,7 +115,7 @@ void config_item_init_type_name(struct config_item *item, | |||
| 115 | const char *name, | 115 | const char *name, |
| 116 | struct config_item_type *type) | 116 | struct config_item_type *type) |
| 117 | { | 117 | { |
| 118 | config_item_set_name(item, name); | 118 | config_item_set_name(item, "%s", name); |
| 119 | item->ci_type = type; | 119 | item->ci_type = type; |
| 120 | config_item_init(item); | 120 | config_item_init(item); |
| 121 | } | 121 | } |
| @@ -124,7 +124,7 @@ EXPORT_SYMBOL(config_item_init_type_name); | |||
| 124 | void config_group_init_type_name(struct config_group *group, const char *name, | 124 | void config_group_init_type_name(struct config_group *group, const char *name, |
| 125 | struct config_item_type *type) | 125 | struct config_item_type *type) |
| 126 | { | 126 | { |
| 127 | config_item_set_name(&group->cg_item, name); | 127 | config_item_set_name(&group->cg_item, "%s", name); |
| 128 | group->cg_item.ci_type = type; | 128 | group->cg_item.ci_type = type; |
| 129 | config_group_init(group); | 129 | config_group_init(group); |
| 130 | } | 130 | } |
diff --git a/fs/jfs/file.c b/fs/jfs/file.c index e98d39d75cf4..b9dc23cd04f2 100644 --- a/fs/jfs/file.c +++ b/fs/jfs/file.c | |||
| @@ -76,7 +76,7 @@ static int jfs_open(struct inode *inode, struct file *file) | |||
| 76 | if (ji->active_ag == -1) { | 76 | if (ji->active_ag == -1) { |
| 77 | struct jfs_sb_info *jfs_sb = JFS_SBI(inode->i_sb); | 77 | struct jfs_sb_info *jfs_sb = JFS_SBI(inode->i_sb); |
| 78 | ji->active_ag = BLKTOAG(addressPXD(&ji->ixpxd), jfs_sb); | 78 | ji->active_ag = BLKTOAG(addressPXD(&ji->ixpxd), jfs_sb); |
| 79 | atomic_inc( &jfs_sb->bmap->db_active[ji->active_ag]); | 79 | atomic_inc(&jfs_sb->bmap->db_active[ji->active_ag]); |
| 80 | } | 80 | } |
| 81 | spin_unlock_irq(&ji->ag_lock); | 81 | spin_unlock_irq(&ji->ag_lock); |
| 82 | } | 82 | } |
diff --git a/fs/jfs/inode.c b/fs/jfs/inode.c index 6f1cb2b5ee28..41aa3ca6a6a4 100644 --- a/fs/jfs/inode.c +++ b/fs/jfs/inode.c | |||
| @@ -134,11 +134,11 @@ int jfs_write_inode(struct inode *inode, struct writeback_control *wbc) | |||
| 134 | * It has been committed since the last change, but was still | 134 | * It has been committed since the last change, but was still |
| 135 | * on the dirty inode list. | 135 | * on the dirty inode list. |
| 136 | */ | 136 | */ |
| 137 | if (!test_cflag(COMMIT_Dirty, inode)) { | 137 | if (!test_cflag(COMMIT_Dirty, inode)) { |
| 138 | /* Make sure committed changes hit the disk */ | 138 | /* Make sure committed changes hit the disk */ |
| 139 | jfs_flush_journal(JFS_SBI(inode->i_sb)->log, wait); | 139 | jfs_flush_journal(JFS_SBI(inode->i_sb)->log, wait); |
| 140 | return 0; | 140 | return 0; |
| 141 | } | 141 | } |
| 142 | 142 | ||
| 143 | if (jfs_commit_inode(inode, wait)) { | 143 | if (jfs_commit_inode(inode, wait)) { |
| 144 | jfs_err("jfs_write_inode: jfs_commit_inode failed!"); | 144 | jfs_err("jfs_write_inode: jfs_commit_inode failed!"); |
diff --git a/fs/jfs/namei.c b/fs/jfs/namei.c index e33be921aa41..a5ac97b9a933 100644 --- a/fs/jfs/namei.c +++ b/fs/jfs/namei.c | |||
| @@ -1160,7 +1160,7 @@ static int jfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 1160 | rc = dtModify(tid, new_dir, &new_dname, &ino, | 1160 | rc = dtModify(tid, new_dir, &new_dname, &ino, |
| 1161 | old_ip->i_ino, JFS_RENAME); | 1161 | old_ip->i_ino, JFS_RENAME); |
| 1162 | if (rc) | 1162 | if (rc) |
| 1163 | goto out4; | 1163 | goto out_tx; |
| 1164 | drop_nlink(new_ip); | 1164 | drop_nlink(new_ip); |
| 1165 | if (S_ISDIR(new_ip->i_mode)) { | 1165 | if (S_ISDIR(new_ip->i_mode)) { |
| 1166 | drop_nlink(new_ip); | 1166 | drop_nlink(new_ip); |
| @@ -1185,7 +1185,7 @@ static int jfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 1185 | if ((new_size = commitZeroLink(tid, new_ip)) < 0) { | 1185 | if ((new_size = commitZeroLink(tid, new_ip)) < 0) { |
| 1186 | txAbort(tid, 1); /* Marks FS Dirty */ | 1186 | txAbort(tid, 1); /* Marks FS Dirty */ |
| 1187 | rc = new_size; | 1187 | rc = new_size; |
| 1188 | goto out4; | 1188 | goto out_tx; |
| 1189 | } | 1189 | } |
| 1190 | tblk = tid_to_tblock(tid); | 1190 | tblk = tid_to_tblock(tid); |
| 1191 | tblk->xflag |= COMMIT_DELETE; | 1191 | tblk->xflag |= COMMIT_DELETE; |
| @@ -1203,7 +1203,7 @@ static int jfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 1203 | if (rc) { | 1203 | if (rc) { |
| 1204 | jfs_err("jfs_rename didn't expect dtSearch to fail " | 1204 | jfs_err("jfs_rename didn't expect dtSearch to fail " |
| 1205 | "w/rc = %d", rc); | 1205 | "w/rc = %d", rc); |
| 1206 | goto out4; | 1206 | goto out_tx; |
| 1207 | } | 1207 | } |
| 1208 | 1208 | ||
| 1209 | ino = old_ip->i_ino; | 1209 | ino = old_ip->i_ino; |
| @@ -1211,7 +1211,7 @@ static int jfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 1211 | if (rc) { | 1211 | if (rc) { |
| 1212 | if (rc == -EIO) | 1212 | if (rc == -EIO) |
| 1213 | jfs_err("jfs_rename: dtInsert returned -EIO"); | 1213 | jfs_err("jfs_rename: dtInsert returned -EIO"); |
| 1214 | goto out4; | 1214 | goto out_tx; |
| 1215 | } | 1215 | } |
| 1216 | if (S_ISDIR(old_ip->i_mode)) | 1216 | if (S_ISDIR(old_ip->i_mode)) |
| 1217 | inc_nlink(new_dir); | 1217 | inc_nlink(new_dir); |
| @@ -1226,7 +1226,7 @@ static int jfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 1226 | jfs_err("jfs_rename did not expect dtDelete to return rc = %d", | 1226 | jfs_err("jfs_rename did not expect dtDelete to return rc = %d", |
| 1227 | rc); | 1227 | rc); |
| 1228 | txAbort(tid, 1); /* Marks Filesystem dirty */ | 1228 | txAbort(tid, 1); /* Marks Filesystem dirty */ |
| 1229 | goto out4; | 1229 | goto out_tx; |
| 1230 | } | 1230 | } |
| 1231 | if (S_ISDIR(old_ip->i_mode)) { | 1231 | if (S_ISDIR(old_ip->i_mode)) { |
| 1232 | drop_nlink(old_dir); | 1232 | drop_nlink(old_dir); |
| @@ -1285,7 +1285,7 @@ static int jfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 1285 | 1285 | ||
| 1286 | rc = txCommit(tid, ipcount, iplist, commit_flag); | 1286 | rc = txCommit(tid, ipcount, iplist, commit_flag); |
| 1287 | 1287 | ||
| 1288 | out4: | 1288 | out_tx: |
| 1289 | txEnd(tid); | 1289 | txEnd(tid); |
| 1290 | if (new_ip) | 1290 | if (new_ip) |
| 1291 | mutex_unlock(&JFS_IP(new_ip)->commit_mutex); | 1291 | mutex_unlock(&JFS_IP(new_ip)->commit_mutex); |
| @@ -1308,13 +1308,6 @@ static int jfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 1308 | } | 1308 | } |
| 1309 | if (new_ip && (new_ip->i_nlink == 0)) | 1309 | if (new_ip && (new_ip->i_nlink == 0)) |
| 1310 | set_cflag(COMMIT_Nolink, new_ip); | 1310 | set_cflag(COMMIT_Nolink, new_ip); |
| 1311 | out3: | ||
| 1312 | free_UCSname(&new_dname); | ||
| 1313 | out2: | ||
| 1314 | free_UCSname(&old_dname); | ||
| 1315 | out1: | ||
| 1316 | if (new_ip && !S_ISDIR(new_ip->i_mode)) | ||
| 1317 | IWRITE_UNLOCK(new_ip); | ||
| 1318 | /* | 1311 | /* |
| 1319 | * Truncating the directory index table is not guaranteed. It | 1312 | * Truncating the directory index table is not guaranteed. It |
| 1320 | * may need to be done iteratively | 1313 | * may need to be done iteratively |
| @@ -1325,7 +1318,13 @@ static int jfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 1325 | 1318 | ||
| 1326 | clear_cflag(COMMIT_Stale, old_dir); | 1319 | clear_cflag(COMMIT_Stale, old_dir); |
| 1327 | } | 1320 | } |
| 1328 | 1321 | if (new_ip && !S_ISDIR(new_ip->i_mode)) | |
| 1322 | IWRITE_UNLOCK(new_ip); | ||
| 1323 | out3: | ||
| 1324 | free_UCSname(&new_dname); | ||
| 1325 | out2: | ||
| 1326 | free_UCSname(&old_dname); | ||
| 1327 | out1: | ||
| 1329 | jfs_info("jfs_rename: returning %d", rc); | 1328 | jfs_info("jfs_rename: returning %d", rc); |
| 1330 | return rc; | 1329 | return rc; |
| 1331 | } | 1330 | } |
diff --git a/fs/locks.c b/fs/locks.c index 653faabb07f4..d3d558ba4da7 100644 --- a/fs/locks.c +++ b/fs/locks.c | |||
| @@ -862,12 +862,11 @@ static int posix_locks_deadlock(struct file_lock *caller_fl, | |||
| 862 | * whether or not a lock was successfully freed by testing the return | 862 | * whether or not a lock was successfully freed by testing the return |
| 863 | * value for -ENOENT. | 863 | * value for -ENOENT. |
| 864 | */ | 864 | */ |
| 865 | static int flock_lock_file(struct file *filp, struct file_lock *request) | 865 | static int flock_lock_inode(struct inode *inode, struct file_lock *request) |
| 866 | { | 866 | { |
| 867 | struct file_lock *new_fl = NULL; | 867 | struct file_lock *new_fl = NULL; |
| 868 | struct file_lock *fl; | 868 | struct file_lock *fl; |
| 869 | struct file_lock_context *ctx; | 869 | struct file_lock_context *ctx; |
| 870 | struct inode *inode = file_inode(filp); | ||
| 871 | int error = 0; | 870 | int error = 0; |
| 872 | bool found = false; | 871 | bool found = false; |
| 873 | LIST_HEAD(dispose); | 872 | LIST_HEAD(dispose); |
| @@ -890,7 +889,7 @@ static int flock_lock_file(struct file *filp, struct file_lock *request) | |||
| 890 | goto find_conflict; | 889 | goto find_conflict; |
| 891 | 890 | ||
| 892 | list_for_each_entry(fl, &ctx->flc_flock, fl_list) { | 891 | list_for_each_entry(fl, &ctx->flc_flock, fl_list) { |
| 893 | if (filp != fl->fl_file) | 892 | if (request->fl_file != fl->fl_file) |
| 894 | continue; | 893 | continue; |
| 895 | if (request->fl_type == fl->fl_type) | 894 | if (request->fl_type == fl->fl_type) |
| 896 | goto out; | 895 | goto out; |
| @@ -1164,20 +1163,19 @@ int posix_lock_file(struct file *filp, struct file_lock *fl, | |||
| 1164 | EXPORT_SYMBOL(posix_lock_file); | 1163 | EXPORT_SYMBOL(posix_lock_file); |
| 1165 | 1164 | ||
| 1166 | /** | 1165 | /** |
| 1167 | * posix_lock_file_wait - Apply a POSIX-style lock to a file | 1166 | * posix_lock_inode_wait - Apply a POSIX-style lock to a file |
| 1168 | * @filp: The file to apply the lock to | 1167 | * @inode: inode of file to which lock request should be applied |
| 1169 | * @fl: The lock to be applied | 1168 | * @fl: The lock to be applied |
| 1170 | * | 1169 | * |
| 1171 | * Add a POSIX style lock to a file. | 1170 | * Variant of posix_lock_file_wait that does not take a filp, and so can be |
| 1172 | * We merge adjacent & overlapping locks whenever possible. | 1171 | * used after the filp has already been torn down. |
| 1173 | * POSIX locks are sorted by owner task, then by starting address | ||
| 1174 | */ | 1172 | */ |
| 1175 | int posix_lock_file_wait(struct file *filp, struct file_lock *fl) | 1173 | int posix_lock_inode_wait(struct inode *inode, struct file_lock *fl) |
| 1176 | { | 1174 | { |
| 1177 | int error; | 1175 | int error; |
| 1178 | might_sleep (); | 1176 | might_sleep (); |
| 1179 | for (;;) { | 1177 | for (;;) { |
| 1180 | error = posix_lock_file(filp, fl, NULL); | 1178 | error = __posix_lock_file(inode, fl, NULL); |
| 1181 | if (error != FILE_LOCK_DEFERRED) | 1179 | if (error != FILE_LOCK_DEFERRED) |
| 1182 | break; | 1180 | break; |
| 1183 | error = wait_event_interruptible(fl->fl_wait, !fl->fl_next); | 1181 | error = wait_event_interruptible(fl->fl_wait, !fl->fl_next); |
| @@ -1189,7 +1187,7 @@ int posix_lock_file_wait(struct file *filp, struct file_lock *fl) | |||
| 1189 | } | 1187 | } |
| 1190 | return error; | 1188 | return error; |
| 1191 | } | 1189 | } |
| 1192 | EXPORT_SYMBOL(posix_lock_file_wait); | 1190 | EXPORT_SYMBOL(posix_lock_inode_wait); |
| 1193 | 1191 | ||
| 1194 | /** | 1192 | /** |
| 1195 | * locks_mandatory_locked - Check for an active lock | 1193 | * locks_mandatory_locked - Check for an active lock |
| @@ -1851,18 +1849,18 @@ int fcntl_setlease(unsigned int fd, struct file *filp, long arg) | |||
| 1851 | } | 1849 | } |
| 1852 | 1850 | ||
| 1853 | /** | 1851 | /** |
| 1854 | * flock_lock_file_wait - Apply a FLOCK-style lock to a file | 1852 | * flock_lock_inode_wait - Apply a FLOCK-style lock to a file |
| 1855 | * @filp: The file to apply the lock to | 1853 | * @inode: inode of the file to apply to |
| 1856 | * @fl: The lock to be applied | 1854 | * @fl: The lock to be applied |
| 1857 | * | 1855 | * |
| 1858 | * Add a FLOCK style lock to a file. | 1856 | * Apply a FLOCK style lock request to an inode. |
| 1859 | */ | 1857 | */ |
| 1860 | int flock_lock_file_wait(struct file *filp, struct file_lock *fl) | 1858 | int flock_lock_inode_wait(struct inode *inode, struct file_lock *fl) |
| 1861 | { | 1859 | { |
| 1862 | int error; | 1860 | int error; |
| 1863 | might_sleep(); | 1861 | might_sleep(); |
| 1864 | for (;;) { | 1862 | for (;;) { |
| 1865 | error = flock_lock_file(filp, fl); | 1863 | error = flock_lock_inode(inode, fl); |
| 1866 | if (error != FILE_LOCK_DEFERRED) | 1864 | if (error != FILE_LOCK_DEFERRED) |
| 1867 | break; | 1865 | break; |
| 1868 | error = wait_event_interruptible(fl->fl_wait, !fl->fl_next); | 1866 | error = wait_event_interruptible(fl->fl_wait, !fl->fl_next); |
| @@ -1874,8 +1872,7 @@ int flock_lock_file_wait(struct file *filp, struct file_lock *fl) | |||
| 1874 | } | 1872 | } |
| 1875 | return error; | 1873 | return error; |
| 1876 | } | 1874 | } |
| 1877 | 1875 | EXPORT_SYMBOL(flock_lock_inode_wait); | |
| 1878 | EXPORT_SYMBOL(flock_lock_file_wait); | ||
| 1879 | 1876 | ||
| 1880 | /** | 1877 | /** |
| 1881 | * sys_flock: - flock() system call. | 1878 | * sys_flock: - flock() system call. |
| @@ -2401,7 +2398,8 @@ locks_remove_flock(struct file *filp) | |||
| 2401 | .fl_type = F_UNLCK, | 2398 | .fl_type = F_UNLCK, |
| 2402 | .fl_end = OFFSET_MAX, | 2399 | .fl_end = OFFSET_MAX, |
| 2403 | }; | 2400 | }; |
| 2404 | struct file_lock_context *flctx = file_inode(filp)->i_flctx; | 2401 | struct inode *inode = file_inode(filp); |
| 2402 | struct file_lock_context *flctx = inode->i_flctx; | ||
| 2405 | 2403 | ||
| 2406 | if (list_empty(&flctx->flc_flock)) | 2404 | if (list_empty(&flctx->flc_flock)) |
| 2407 | return; | 2405 | return; |
| @@ -2409,7 +2407,7 @@ locks_remove_flock(struct file *filp) | |||
| 2409 | if (filp->f_op->flock) | 2407 | if (filp->f_op->flock) |
| 2410 | filp->f_op->flock(filp, F_SETLKW, &fl); | 2408 | filp->f_op->flock(filp, F_SETLKW, &fl); |
| 2411 | else | 2409 | else |
| 2412 | flock_lock_file(filp, &fl); | 2410 | flock_lock_inode(inode, &fl); |
| 2413 | 2411 | ||
| 2414 | if (fl.fl_ops && fl.fl_ops->fl_release_private) | 2412 | if (fl.fl_ops && fl.fl_ops->fl_release_private) |
| 2415 | fl.fl_ops->fl_release_private(&fl); | 2413 | fl.fl_ops->fl_release_private(&fl); |
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 6f228b5af819..8bee93469617 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
| @@ -5439,15 +5439,15 @@ static int nfs4_proc_getlk(struct nfs4_state *state, int cmd, struct file_lock * | |||
| 5439 | return err; | 5439 | return err; |
| 5440 | } | 5440 | } |
| 5441 | 5441 | ||
| 5442 | static int do_vfs_lock(struct file *file, struct file_lock *fl) | 5442 | static int do_vfs_lock(struct inode *inode, struct file_lock *fl) |
| 5443 | { | 5443 | { |
| 5444 | int res = 0; | 5444 | int res = 0; |
| 5445 | switch (fl->fl_flags & (FL_POSIX|FL_FLOCK)) { | 5445 | switch (fl->fl_flags & (FL_POSIX|FL_FLOCK)) { |
| 5446 | case FL_POSIX: | 5446 | case FL_POSIX: |
| 5447 | res = posix_lock_file_wait(file, fl); | 5447 | res = posix_lock_inode_wait(inode, fl); |
| 5448 | break; | 5448 | break; |
| 5449 | case FL_FLOCK: | 5449 | case FL_FLOCK: |
| 5450 | res = flock_lock_file_wait(file, fl); | 5450 | res = flock_lock_inode_wait(inode, fl); |
| 5451 | break; | 5451 | break; |
| 5452 | default: | 5452 | default: |
| 5453 | BUG(); | 5453 | BUG(); |
| @@ -5484,7 +5484,6 @@ static struct nfs4_unlockdata *nfs4_alloc_unlockdata(struct file_lock *fl, | |||
| 5484 | atomic_inc(&lsp->ls_count); | 5484 | atomic_inc(&lsp->ls_count); |
| 5485 | /* Ensure we don't close file until we're done freeing locks! */ | 5485 | /* Ensure we don't close file until we're done freeing locks! */ |
| 5486 | p->ctx = get_nfs_open_context(ctx); | 5486 | p->ctx = get_nfs_open_context(ctx); |
| 5487 | get_file(fl->fl_file); | ||
| 5488 | memcpy(&p->fl, fl, sizeof(p->fl)); | 5487 | memcpy(&p->fl, fl, sizeof(p->fl)); |
| 5489 | p->server = NFS_SERVER(inode); | 5488 | p->server = NFS_SERVER(inode); |
| 5490 | return p; | 5489 | return p; |
| @@ -5496,7 +5495,6 @@ static void nfs4_locku_release_calldata(void *data) | |||
| 5496 | nfs_free_seqid(calldata->arg.seqid); | 5495 | nfs_free_seqid(calldata->arg.seqid); |
| 5497 | nfs4_put_lock_state(calldata->lsp); | 5496 | nfs4_put_lock_state(calldata->lsp); |
| 5498 | put_nfs_open_context(calldata->ctx); | 5497 | put_nfs_open_context(calldata->ctx); |
| 5499 | fput(calldata->fl.fl_file); | ||
| 5500 | kfree(calldata); | 5498 | kfree(calldata); |
| 5501 | } | 5499 | } |
| 5502 | 5500 | ||
| @@ -5509,7 +5507,7 @@ static void nfs4_locku_done(struct rpc_task *task, void *data) | |||
| 5509 | switch (task->tk_status) { | 5507 | switch (task->tk_status) { |
| 5510 | case 0: | 5508 | case 0: |
| 5511 | renew_lease(calldata->server, calldata->timestamp); | 5509 | renew_lease(calldata->server, calldata->timestamp); |
| 5512 | do_vfs_lock(calldata->fl.fl_file, &calldata->fl); | 5510 | do_vfs_lock(calldata->lsp->ls_state->inode, &calldata->fl); |
| 5513 | if (nfs4_update_lock_stateid(calldata->lsp, | 5511 | if (nfs4_update_lock_stateid(calldata->lsp, |
| 5514 | &calldata->res.stateid)) | 5512 | &calldata->res.stateid)) |
| 5515 | break; | 5513 | break; |
| @@ -5617,7 +5615,7 @@ static int nfs4_proc_unlck(struct nfs4_state *state, int cmd, struct file_lock * | |||
| 5617 | mutex_lock(&sp->so_delegreturn_mutex); | 5615 | mutex_lock(&sp->so_delegreturn_mutex); |
| 5618 | /* Exclude nfs4_reclaim_open_stateid() - note nesting! */ | 5616 | /* Exclude nfs4_reclaim_open_stateid() - note nesting! */ |
| 5619 | down_read(&nfsi->rwsem); | 5617 | down_read(&nfsi->rwsem); |
| 5620 | if (do_vfs_lock(request->fl_file, request) == -ENOENT) { | 5618 | if (do_vfs_lock(inode, request) == -ENOENT) { |
| 5621 | up_read(&nfsi->rwsem); | 5619 | up_read(&nfsi->rwsem); |
| 5622 | mutex_unlock(&sp->so_delegreturn_mutex); | 5620 | mutex_unlock(&sp->so_delegreturn_mutex); |
| 5623 | goto out; | 5621 | goto out; |
| @@ -5758,7 +5756,7 @@ static void nfs4_lock_done(struct rpc_task *task, void *calldata) | |||
| 5758 | data->timestamp); | 5756 | data->timestamp); |
| 5759 | if (data->arg.new_lock) { | 5757 | if (data->arg.new_lock) { |
| 5760 | data->fl.fl_flags &= ~(FL_SLEEP | FL_ACCESS); | 5758 | data->fl.fl_flags &= ~(FL_SLEEP | FL_ACCESS); |
| 5761 | if (do_vfs_lock(data->fl.fl_file, &data->fl) < 0) { | 5759 | if (do_vfs_lock(lsp->ls_state->inode, &data->fl) < 0) { |
| 5762 | rpc_restart_call_prepare(task); | 5760 | rpc_restart_call_prepare(task); |
| 5763 | break; | 5761 | break; |
| 5764 | } | 5762 | } |
| @@ -6000,7 +5998,7 @@ static int _nfs4_proc_setlk(struct nfs4_state *state, int cmd, struct file_lock | |||
| 6000 | if (status != 0) | 5998 | if (status != 0) |
| 6001 | goto out; | 5999 | goto out; |
| 6002 | request->fl_flags |= FL_ACCESS; | 6000 | request->fl_flags |= FL_ACCESS; |
| 6003 | status = do_vfs_lock(request->fl_file, request); | 6001 | status = do_vfs_lock(state->inode, request); |
| 6004 | if (status < 0) | 6002 | if (status < 0) |
| 6005 | goto out; | 6003 | goto out; |
| 6006 | down_read(&nfsi->rwsem); | 6004 | down_read(&nfsi->rwsem); |
| @@ -6008,7 +6006,7 @@ static int _nfs4_proc_setlk(struct nfs4_state *state, int cmd, struct file_lock | |||
| 6008 | /* Yes: cache locks! */ | 6006 | /* Yes: cache locks! */ |
| 6009 | /* ...but avoid races with delegation recall... */ | 6007 | /* ...but avoid races with delegation recall... */ |
| 6010 | request->fl_flags = fl_flags & ~FL_SLEEP; | 6008 | request->fl_flags = fl_flags & ~FL_SLEEP; |
| 6011 | status = do_vfs_lock(request->fl_file, request); | 6009 | status = do_vfs_lock(state->inode, request); |
| 6012 | up_read(&nfsi->rwsem); | 6010 | up_read(&nfsi->rwsem); |
| 6013 | goto out; | 6011 | goto out; |
| 6014 | } | 6012 | } |
diff --git a/fs/notify/mark.c b/fs/notify/mark.c index 92e48c70f0f0..3e594ce41010 100644 --- a/fs/notify/mark.c +++ b/fs/notify/mark.c | |||
| @@ -152,31 +152,15 @@ void fsnotify_destroy_mark_locked(struct fsnotify_mark *mark, | |||
| 152 | BUG(); | 152 | BUG(); |
| 153 | 153 | ||
| 154 | list_del_init(&mark->g_list); | 154 | list_del_init(&mark->g_list); |
| 155 | |||
| 156 | spin_unlock(&mark->lock); | 155 | spin_unlock(&mark->lock); |
| 157 | 156 | ||
| 158 | if (inode && (mark->flags & FSNOTIFY_MARK_FLAG_OBJECT_PINNED)) | 157 | if (inode && (mark->flags & FSNOTIFY_MARK_FLAG_OBJECT_PINNED)) |
| 159 | iput(inode); | 158 | iput(inode); |
| 160 | /* release lock temporarily */ | ||
| 161 | mutex_unlock(&group->mark_mutex); | ||
| 162 | 159 | ||
| 163 | spin_lock(&destroy_lock); | 160 | spin_lock(&destroy_lock); |
| 164 | list_add(&mark->g_list, &destroy_list); | 161 | list_add(&mark->g_list, &destroy_list); |
| 165 | spin_unlock(&destroy_lock); | 162 | spin_unlock(&destroy_lock); |
| 166 | wake_up(&destroy_waitq); | 163 | wake_up(&destroy_waitq); |
| 167 | /* | ||
| 168 | * We don't necessarily have a ref on mark from caller so the above destroy | ||
| 169 | * may have actually freed it, unless this group provides a 'freeing_mark' | ||
| 170 | * function which must be holding a reference. | ||
| 171 | */ | ||
| 172 | |||
| 173 | /* | ||
| 174 | * Some groups like to know that marks are being freed. This is a | ||
| 175 | * callback to the group function to let it know that this mark | ||
| 176 | * is being freed. | ||
| 177 | */ | ||
| 178 | if (group->ops->freeing_mark) | ||
| 179 | group->ops->freeing_mark(mark, group); | ||
| 180 | 164 | ||
| 181 | /* | 165 | /* |
| 182 | * __fsnotify_update_child_dentry_flags(inode); | 166 | * __fsnotify_update_child_dentry_flags(inode); |
| @@ -191,8 +175,6 @@ void fsnotify_destroy_mark_locked(struct fsnotify_mark *mark, | |||
| 191 | */ | 175 | */ |
| 192 | 176 | ||
| 193 | atomic_dec(&group->num_marks); | 177 | atomic_dec(&group->num_marks); |
| 194 | |||
| 195 | mutex_lock_nested(&group->mark_mutex, SINGLE_DEPTH_NESTING); | ||
| 196 | } | 178 | } |
| 197 | 179 | ||
| 198 | void fsnotify_destroy_mark(struct fsnotify_mark *mark, | 180 | void fsnotify_destroy_mark(struct fsnotify_mark *mark, |
| @@ -205,7 +187,10 @@ void fsnotify_destroy_mark(struct fsnotify_mark *mark, | |||
| 205 | 187 | ||
| 206 | /* | 188 | /* |
| 207 | * Destroy all marks in the given list. The marks must be already detached from | 189 | * Destroy all marks in the given list. The marks must be already detached from |
| 208 | * the original inode / vfsmount. | 190 | * the original inode / vfsmount. Note that we can race with |
| 191 | * fsnotify_clear_marks_by_group_flags(). However we hold a reference to each | ||
| 192 | * mark so they won't get freed from under us and nobody else touches our | ||
| 193 | * free_list list_head. | ||
| 209 | */ | 194 | */ |
| 210 | void fsnotify_destroy_marks(struct list_head *to_free) | 195 | void fsnotify_destroy_marks(struct list_head *to_free) |
| 211 | { | 196 | { |
| @@ -406,7 +391,7 @@ struct fsnotify_mark *fsnotify_find_mark(struct hlist_head *head, | |||
| 406 | } | 391 | } |
| 407 | 392 | ||
| 408 | /* | 393 | /* |
| 409 | * clear any marks in a group in which mark->flags & flags is true | 394 | * Clear any marks in a group in which mark->flags & flags is true. |
| 410 | */ | 395 | */ |
| 411 | void fsnotify_clear_marks_by_group_flags(struct fsnotify_group *group, | 396 | void fsnotify_clear_marks_by_group_flags(struct fsnotify_group *group, |
| 412 | unsigned int flags) | 397 | unsigned int flags) |
| @@ -460,6 +445,7 @@ static int fsnotify_mark_destroy(void *ignored) | |||
| 460 | { | 445 | { |
| 461 | struct fsnotify_mark *mark, *next; | 446 | struct fsnotify_mark *mark, *next; |
| 462 | struct list_head private_destroy_list; | 447 | struct list_head private_destroy_list; |
| 448 | struct fsnotify_group *group; | ||
| 463 | 449 | ||
| 464 | for (;;) { | 450 | for (;;) { |
| 465 | spin_lock(&destroy_lock); | 451 | spin_lock(&destroy_lock); |
| @@ -471,6 +457,14 @@ static int fsnotify_mark_destroy(void *ignored) | |||
| 471 | 457 | ||
| 472 | list_for_each_entry_safe(mark, next, &private_destroy_list, g_list) { | 458 | list_for_each_entry_safe(mark, next, &private_destroy_list, g_list) { |
| 473 | list_del_init(&mark->g_list); | 459 | list_del_init(&mark->g_list); |
| 460 | group = mark->group; | ||
| 461 | /* | ||
| 462 | * Some groups like to know that marks are being freed. | ||
| 463 | * This is a callback to the group function to let it | ||
| 464 | * know that this mark is being freed. | ||
| 465 | */ | ||
| 466 | if (group && group->ops->freeing_mark) | ||
| 467 | group->ops->freeing_mark(mark, group); | ||
| 474 | fsnotify_put_mark(mark); | 468 | fsnotify_put_mark(mark); |
| 475 | } | 469 | } |
| 476 | 470 | ||
diff --git a/fs/proc/Kconfig b/fs/proc/Kconfig index d751fcb637bb..1ade1206bb89 100644 --- a/fs/proc/Kconfig +++ b/fs/proc/Kconfig | |||
| @@ -75,3 +75,9 @@ config PROC_PAGE_MONITOR | |||
| 75 | config PROC_CHILDREN | 75 | config PROC_CHILDREN |
| 76 | bool "Include /proc/<pid>/task/<tid>/children file" | 76 | bool "Include /proc/<pid>/task/<tid>/children file" |
| 77 | default n | 77 | default n |
| 78 | help | ||
| 79 | Provides a fast way to retrieve first level children pids of a task. See | ||
| 80 | <file:Documentation/filesystems/proc.txt> for more information. | ||
| 81 | |||
| 82 | Say Y if you are running any user-space software which takes benefit from | ||
| 83 | this interface. For example, rkt is such a piece of software. | ||
diff --git a/fs/proc/base.c b/fs/proc/base.c index 87782e874b6a..aa50d1ac28fc 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
| @@ -243,6 +243,11 @@ static ssize_t proc_pid_cmdline_read(struct file *file, char __user *buf, | |||
| 243 | len1 = arg_end - arg_start; | 243 | len1 = arg_end - arg_start; |
| 244 | len2 = env_end - env_start; | 244 | len2 = env_end - env_start; |
| 245 | 245 | ||
| 246 | /* Empty ARGV. */ | ||
| 247 | if (len1 == 0) { | ||
| 248 | rv = 0; | ||
| 249 | goto out_free_page; | ||
| 250 | } | ||
| 246 | /* | 251 | /* |
| 247 | * Inherently racy -- command line shares address space | 252 | * Inherently racy -- command line shares address space |
| 248 | * with code and data. | 253 | * with code and data. |
diff --git a/fs/proc/kcore.c b/fs/proc/kcore.c index 91a4e6426321..92e6726f6e37 100644 --- a/fs/proc/kcore.c +++ b/fs/proc/kcore.c | |||
| @@ -92,7 +92,7 @@ static size_t get_kcore_size(int *nphdr, size_t *elf_buflen) | |||
| 92 | roundup(sizeof(CORE_STR), 4)) + | 92 | roundup(sizeof(CORE_STR), 4)) + |
| 93 | roundup(sizeof(struct elf_prstatus), 4) + | 93 | roundup(sizeof(struct elf_prstatus), 4) + |
| 94 | roundup(sizeof(struct elf_prpsinfo), 4) + | 94 | roundup(sizeof(struct elf_prpsinfo), 4) + |
| 95 | roundup(sizeof(struct task_struct), 4); | 95 | roundup(arch_task_struct_size, 4); |
| 96 | *elf_buflen = PAGE_ALIGN(*elf_buflen); | 96 | *elf_buflen = PAGE_ALIGN(*elf_buflen); |
| 97 | return size + *elf_buflen; | 97 | return size + *elf_buflen; |
| 98 | } | 98 | } |
| @@ -415,7 +415,7 @@ static void elf_kcore_store_hdr(char *bufp, int nphdr, int dataoff) | |||
| 415 | /* set up the task structure */ | 415 | /* set up the task structure */ |
| 416 | notes[2].name = CORE_STR; | 416 | notes[2].name = CORE_STR; |
| 417 | notes[2].type = NT_TASKSTRUCT; | 417 | notes[2].type = NT_TASKSTRUCT; |
| 418 | notes[2].datasz = sizeof(struct task_struct); | 418 | notes[2].datasz = arch_task_struct_size; |
| 419 | notes[2].data = current; | 419 | notes[2].data = current; |
| 420 | 420 | ||
| 421 | nhdr->p_filesz += notesize(¬es[2]); | 421 | nhdr->p_filesz += notesize(¬es[2]); |
diff --git a/include/asm-generic/mm-arch-hooks.h b/include/asm-generic/mm-arch-hooks.h new file mode 100644 index 000000000000..5ff0e5193f85 --- /dev/null +++ b/include/asm-generic/mm-arch-hooks.h | |||
| @@ -0,0 +1,16 @@ | |||
| 1 | /* | ||
| 2 | * Architecture specific mm hooks | ||
| 3 | */ | ||
| 4 | |||
| 5 | #ifndef _ASM_GENERIC_MM_ARCH_HOOKS_H | ||
| 6 | #define _ASM_GENERIC_MM_ARCH_HOOKS_H | ||
| 7 | |||
| 8 | /* | ||
| 9 | * This file should be included through arch/../include/asm/Kbuild for | ||
| 10 | * the architecture which doesn't need specific mm hooks. | ||
| 11 | * | ||
| 12 | * In that case, the generic hooks defined in include/linux/mm-arch-hooks.h | ||
| 13 | * are used. | ||
| 14 | */ | ||
| 15 | |||
| 16 | #endif /* _ASM_GENERIC_MM_ARCH_HOOKS_H */ | ||
diff --git a/include/linux/amba/sp810.h b/include/linux/amba/sp810.h index c7df89f99115..58fe9e8b6fd7 100644 --- a/include/linux/amba/sp810.h +++ b/include/linux/amba/sp810.h | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * ARM PrimeXsys System Controller SP810 header file | 2 | * ARM PrimeXsys System Controller SP810 header file |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2009 ST Microelectronics | 4 | * Copyright (C) 2009 ST Microelectronics |
| 5 | * Viresh Kumar <viresh.linux@gmail.com> | 5 | * Viresh Kumar <vireshk@kernel.org> |
| 6 | * | 6 | * |
| 7 | * This file is licensed under the terms of the GNU General Public | 7 | * This file is licensed under the terms of the GNU General Public |
| 8 | * License version 2. This program is licensed "as is" without any | 8 | * License version 2. This program is licensed "as is" without any |
diff --git a/include/linux/blk-cgroup.h b/include/linux/blk-cgroup.h index 58cfab80dd70..1b62d768c7df 100644 --- a/include/linux/blk-cgroup.h +++ b/include/linux/blk-cgroup.h | |||
| @@ -47,6 +47,7 @@ struct blkcg { | |||
| 47 | 47 | ||
| 48 | struct blkcg_policy_data *pd[BLKCG_MAX_POLS]; | 48 | struct blkcg_policy_data *pd[BLKCG_MAX_POLS]; |
| 49 | 49 | ||
| 50 | struct list_head all_blkcgs_node; | ||
| 50 | #ifdef CONFIG_CGROUP_WRITEBACK | 51 | #ifdef CONFIG_CGROUP_WRITEBACK |
| 51 | struct list_head cgwb_list; | 52 | struct list_head cgwb_list; |
| 52 | #endif | 53 | #endif |
| @@ -88,18 +89,12 @@ struct blkg_policy_data { | |||
| 88 | * Policies that need to keep per-blkcg data which is independent | 89 | * Policies that need to keep per-blkcg data which is independent |
| 89 | * from any request_queue associated to it must specify its size | 90 | * from any request_queue associated to it must specify its size |
| 90 | * with the cpd_size field of the blkcg_policy structure and | 91 | * with the cpd_size field of the blkcg_policy structure and |
| 91 | * embed a blkcg_policy_data in it. blkcg core allocates | 92 | * embed a blkcg_policy_data in it. cpd_init() is invoked to let |
| 92 | * policy-specific per-blkcg structures lazily the first time | 93 | * each policy handle per-blkcg data. |
| 93 | * they are actually needed, so it handles them together with | ||
| 94 | * blkgs. cpd_init() is invoked to let each policy handle | ||
| 95 | * per-blkcg data. | ||
| 96 | */ | 94 | */ |
| 97 | struct blkcg_policy_data { | 95 | struct blkcg_policy_data { |
| 98 | /* the policy id this per-policy data belongs to */ | 96 | /* the policy id this per-policy data belongs to */ |
| 99 | int plid; | 97 | int plid; |
| 100 | |||
| 101 | /* used during policy activation */ | ||
| 102 | struct list_head alloc_node; | ||
| 103 | }; | 98 | }; |
| 104 | 99 | ||
| 105 | /* association between a blk cgroup and a request queue */ | 100 | /* association between a blk cgroup and a request queue */ |
diff --git a/include/linux/can/skb.h b/include/linux/can/skb.h index b6a52a4b457a..51bb6532785c 100644 --- a/include/linux/can/skb.h +++ b/include/linux/can/skb.h | |||
| @@ -27,10 +27,12 @@ | |||
| 27 | /** | 27 | /** |
| 28 | * struct can_skb_priv - private additional data inside CAN sk_buffs | 28 | * struct can_skb_priv - private additional data inside CAN sk_buffs |
| 29 | * @ifindex: ifindex of the first interface the CAN frame appeared on | 29 | * @ifindex: ifindex of the first interface the CAN frame appeared on |
| 30 | * @skbcnt: atomic counter to have an unique id together with skb pointer | ||
| 30 | * @cf: align to the following CAN frame at skb->data | 31 | * @cf: align to the following CAN frame at skb->data |
| 31 | */ | 32 | */ |
| 32 | struct can_skb_priv { | 33 | struct can_skb_priv { |
| 33 | int ifindex; | 34 | int ifindex; |
| 35 | int skbcnt; | ||
| 34 | struct can_frame cf[0]; | 36 | struct can_frame cf[0]; |
| 35 | }; | 37 | }; |
| 36 | 38 | ||
diff --git a/include/linux/clkdev.h b/include/linux/clkdev.h index a240b18e86fa..08bffcc466de 100644 --- a/include/linux/clkdev.h +++ b/include/linux/clkdev.h | |||
| @@ -33,18 +33,19 @@ struct clk_lookup { | |||
| 33 | } | 33 | } |
| 34 | 34 | ||
| 35 | struct clk_lookup *clkdev_alloc(struct clk *clk, const char *con_id, | 35 | struct clk_lookup *clkdev_alloc(struct clk *clk, const char *con_id, |
| 36 | const char *dev_fmt, ...); | 36 | const char *dev_fmt, ...) __printf(3, 4); |
| 37 | 37 | ||
| 38 | void clkdev_add(struct clk_lookup *cl); | 38 | void clkdev_add(struct clk_lookup *cl); |
| 39 | void clkdev_drop(struct clk_lookup *cl); | 39 | void clkdev_drop(struct clk_lookup *cl); |
| 40 | 40 | ||
| 41 | struct clk_lookup *clkdev_create(struct clk *clk, const char *con_id, | 41 | struct clk_lookup *clkdev_create(struct clk *clk, const char *con_id, |
| 42 | const char *dev_fmt, ...); | 42 | const char *dev_fmt, ...) __printf(3, 4); |
| 43 | 43 | ||
| 44 | void clkdev_add_table(struct clk_lookup *, size_t); | 44 | void clkdev_add_table(struct clk_lookup *, size_t); |
| 45 | int clk_add_alias(const char *, const char *, const char *, struct device *); | 45 | int clk_add_alias(const char *, const char *, const char *, struct device *); |
| 46 | 46 | ||
| 47 | int clk_register_clkdev(struct clk *, const char *, const char *, ...); | 47 | int clk_register_clkdev(struct clk *, const char *, const char *, ...) |
| 48 | __printf(3, 4); | ||
| 48 | int clk_register_clkdevs(struct clk *, struct clk_lookup *, size_t); | 49 | int clk_register_clkdevs(struct clk *, struct clk_lookup *, size_t); |
| 49 | 50 | ||
| 50 | #ifdef CONFIG_COMMON_CLK | 51 | #ifdef CONFIG_COMMON_CLK |
diff --git a/include/linux/compat.h b/include/linux/compat.h index ab25814690bc..a76c9172b2eb 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h | |||
| @@ -424,7 +424,7 @@ asmlinkage long compat_sys_settimeofday(struct compat_timeval __user *tv, | |||
| 424 | 424 | ||
| 425 | asmlinkage long compat_sys_adjtimex(struct compat_timex __user *utp); | 425 | asmlinkage long compat_sys_adjtimex(struct compat_timex __user *utp); |
| 426 | 426 | ||
| 427 | extern int compat_printk(const char *fmt, ...); | 427 | extern __printf(1, 2) int compat_printk(const char *fmt, ...); |
| 428 | extern void sigset_from_compat(sigset_t *set, const compat_sigset_t *compat); | 428 | extern void sigset_from_compat(sigset_t *set, const compat_sigset_t *compat); |
| 429 | extern void sigset_to_compat(compat_sigset_t *compat, const sigset_t *set); | 429 | extern void sigset_to_compat(compat_sigset_t *compat, const sigset_t *set); |
| 430 | 430 | ||
diff --git a/include/linux/configfs.h b/include/linux/configfs.h index c9e5c57e4edf..63a36e89d0eb 100644 --- a/include/linux/configfs.h +++ b/include/linux/configfs.h | |||
| @@ -64,7 +64,8 @@ struct config_item { | |||
| 64 | struct dentry *ci_dentry; | 64 | struct dentry *ci_dentry; |
| 65 | }; | 65 | }; |
| 66 | 66 | ||
| 67 | extern int config_item_set_name(struct config_item *, const char *, ...); | 67 | extern __printf(2, 3) |
| 68 | int config_item_set_name(struct config_item *, const char *, ...); | ||
| 68 | 69 | ||
| 69 | static inline char *config_item_name(struct config_item * item) | 70 | static inline char *config_item_name(struct config_item * item) |
| 70 | { | 71 | { |
diff --git a/include/linux/cpu.h b/include/linux/cpu.h index c0fb6b1b4712..23c30bdcca86 100644 --- a/include/linux/cpu.h +++ b/include/linux/cpu.h | |||
| @@ -40,9 +40,10 @@ extern void cpu_remove_dev_attr(struct device_attribute *attr); | |||
| 40 | extern int cpu_add_dev_attr_group(struct attribute_group *attrs); | 40 | extern int cpu_add_dev_attr_group(struct attribute_group *attrs); |
| 41 | extern void cpu_remove_dev_attr_group(struct attribute_group *attrs); | 41 | extern void cpu_remove_dev_attr_group(struct attribute_group *attrs); |
| 42 | 42 | ||
| 43 | extern struct device *cpu_device_create(struct device *parent, void *drvdata, | 43 | extern __printf(4, 5) |
| 44 | const struct attribute_group **groups, | 44 | struct device *cpu_device_create(struct device *parent, void *drvdata, |
| 45 | const char *fmt, ...); | 45 | const struct attribute_group **groups, |
| 46 | const char *fmt, ...); | ||
| 46 | #ifdef CONFIG_HOTPLUG_CPU | 47 | #ifdef CONFIG_HOTPLUG_CPU |
| 47 | extern void unregister_cpu(struct cpu *cpu); | 48 | extern void unregister_cpu(struct cpu *cpu); |
| 48 | extern ssize_t arch_cpu_probe(const char *, size_t); | 49 | extern ssize_t arch_cpu_probe(const char *, size_t); |
diff --git a/include/linux/dcache.h b/include/linux/dcache.h index d2d50249b7b2..d67ae119cf4e 100644 --- a/include/linux/dcache.h +++ b/include/linux/dcache.h | |||
| @@ -327,7 +327,8 @@ static inline unsigned d_count(const struct dentry *dentry) | |||
| 327 | /* | 327 | /* |
| 328 | * helper function for dentry_operations.d_dname() members | 328 | * helper function for dentry_operations.d_dname() members |
| 329 | */ | 329 | */ |
| 330 | extern char *dynamic_dname(struct dentry *, char *, int, const char *, ...); | 330 | extern __printf(4, 5) |
| 331 | char *dynamic_dname(struct dentry *, char *, int, const char *, ...); | ||
| 331 | extern char *simple_dname(struct dentry *, char *, int); | 332 | extern char *simple_dname(struct dentry *, char *, int); |
| 332 | 333 | ||
| 333 | extern char *__d_path(const struct path *, const struct path *, char *, int); | 334 | extern char *__d_path(const struct path *, const struct path *, char *, int); |
diff --git a/include/linux/device.h b/include/linux/device.h index 5a31bf3a4024..a2b4ea70a946 100644 --- a/include/linux/device.h +++ b/include/linux/device.h | |||
| @@ -637,8 +637,9 @@ extern int devres_release_group(struct device *dev, void *id); | |||
| 637 | 637 | ||
| 638 | /* managed devm_k.alloc/kfree for device drivers */ | 638 | /* managed devm_k.alloc/kfree for device drivers */ |
| 639 | extern void *devm_kmalloc(struct device *dev, size_t size, gfp_t gfp); | 639 | extern void *devm_kmalloc(struct device *dev, size_t size, gfp_t gfp); |
| 640 | extern char *devm_kvasprintf(struct device *dev, gfp_t gfp, const char *fmt, | 640 | extern __printf(3, 0) |
| 641 | va_list ap); | 641 | char *devm_kvasprintf(struct device *dev, gfp_t gfp, const char *fmt, |
| 642 | va_list ap); | ||
| 642 | extern __printf(3, 4) | 643 | extern __printf(3, 4) |
| 643 | char *devm_kasprintf(struct device *dev, gfp_t gfp, const char *fmt, ...); | 644 | char *devm_kasprintf(struct device *dev, gfp_t gfp, const char *fmt, ...); |
| 644 | static inline void *devm_kzalloc(struct device *dev, size_t size, gfp_t gfp) | 645 | static inline void *devm_kzalloc(struct device *dev, size_t size, gfp_t gfp) |
| @@ -1011,12 +1012,10 @@ extern int __must_check device_reprobe(struct device *dev); | |||
| 1011 | /* | 1012 | /* |
| 1012 | * Easy functions for dynamically creating devices on the fly | 1013 | * Easy functions for dynamically creating devices on the fly |
| 1013 | */ | 1014 | */ |
| 1014 | extern struct device *device_create_vargs(struct class *cls, | 1015 | extern __printf(5, 0) |
| 1015 | struct device *parent, | 1016 | struct device *device_create_vargs(struct class *cls, struct device *parent, |
| 1016 | dev_t devt, | 1017 | dev_t devt, void *drvdata, |
| 1017 | void *drvdata, | 1018 | const char *fmt, va_list vargs); |
| 1018 | const char *fmt, | ||
| 1019 | va_list vargs); | ||
| 1020 | extern __printf(5, 6) | 1019 | extern __printf(5, 6) |
| 1021 | struct device *device_create(struct class *cls, struct device *parent, | 1020 | struct device *device_create(struct class *cls, struct device *parent, |
| 1022 | dev_t devt, void *drvdata, | 1021 | dev_t devt, void *drvdata, |
diff --git a/include/linux/fs.h b/include/linux/fs.h index a0653e560c26..cc008c338f5a 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
| @@ -1046,12 +1046,12 @@ extern void locks_remove_file(struct file *); | |||
| 1046 | extern void locks_release_private(struct file_lock *); | 1046 | extern void locks_release_private(struct file_lock *); |
| 1047 | extern void posix_test_lock(struct file *, struct file_lock *); | 1047 | extern void posix_test_lock(struct file *, struct file_lock *); |
| 1048 | extern int posix_lock_file(struct file *, struct file_lock *, struct file_lock *); | 1048 | extern int posix_lock_file(struct file *, struct file_lock *, struct file_lock *); |
| 1049 | extern int posix_lock_file_wait(struct file *, struct file_lock *); | 1049 | extern int posix_lock_inode_wait(struct inode *, struct file_lock *); |
| 1050 | extern int posix_unblock_lock(struct file_lock *); | 1050 | extern int posix_unblock_lock(struct file_lock *); |
| 1051 | extern int vfs_test_lock(struct file *, struct file_lock *); | 1051 | extern int vfs_test_lock(struct file *, struct file_lock *); |
| 1052 | extern int vfs_lock_file(struct file *, unsigned int, struct file_lock *, struct file_lock *); | 1052 | extern int vfs_lock_file(struct file *, unsigned int, struct file_lock *, struct file_lock *); |
| 1053 | extern int vfs_cancel_lock(struct file *filp, struct file_lock *fl); | 1053 | extern int vfs_cancel_lock(struct file *filp, struct file_lock *fl); |
| 1054 | extern int flock_lock_file_wait(struct file *filp, struct file_lock *fl); | 1054 | extern int flock_lock_inode_wait(struct inode *inode, struct file_lock *fl); |
| 1055 | extern int __break_lease(struct inode *inode, unsigned int flags, unsigned int type); | 1055 | extern int __break_lease(struct inode *inode, unsigned int flags, unsigned int type); |
| 1056 | extern void lease_get_mtime(struct inode *, struct timespec *time); | 1056 | extern void lease_get_mtime(struct inode *, struct timespec *time); |
| 1057 | extern int generic_setlease(struct file *, long, struct file_lock **, void **priv); | 1057 | extern int generic_setlease(struct file *, long, struct file_lock **, void **priv); |
| @@ -1137,7 +1137,8 @@ static inline int posix_lock_file(struct file *filp, struct file_lock *fl, | |||
| 1137 | return -ENOLCK; | 1137 | return -ENOLCK; |
| 1138 | } | 1138 | } |
| 1139 | 1139 | ||
| 1140 | static inline int posix_lock_file_wait(struct file *filp, struct file_lock *fl) | 1140 | static inline int posix_lock_inode_wait(struct inode *inode, |
| 1141 | struct file_lock *fl) | ||
| 1141 | { | 1142 | { |
| 1142 | return -ENOLCK; | 1143 | return -ENOLCK; |
| 1143 | } | 1144 | } |
| @@ -1163,8 +1164,8 @@ static inline int vfs_cancel_lock(struct file *filp, struct file_lock *fl) | |||
| 1163 | return 0; | 1164 | return 0; |
| 1164 | } | 1165 | } |
| 1165 | 1166 | ||
| 1166 | static inline int flock_lock_file_wait(struct file *filp, | 1167 | static inline int flock_lock_inode_wait(struct inode *inode, |
| 1167 | struct file_lock *request) | 1168 | struct file_lock *request) |
| 1168 | { | 1169 | { |
| 1169 | return -ENOLCK; | 1170 | return -ENOLCK; |
| 1170 | } | 1171 | } |
| @@ -1202,6 +1203,20 @@ static inline void show_fd_locks(struct seq_file *f, | |||
| 1202 | struct file *filp, struct files_struct *files) {} | 1203 | struct file *filp, struct files_struct *files) {} |
| 1203 | #endif /* !CONFIG_FILE_LOCKING */ | 1204 | #endif /* !CONFIG_FILE_LOCKING */ |
| 1204 | 1205 | ||
| 1206 | static inline struct inode *file_inode(const struct file *f) | ||
| 1207 | { | ||
| 1208 | return f->f_inode; | ||
| 1209 | } | ||
| 1210 | |||
| 1211 | static inline int posix_lock_file_wait(struct file *filp, struct file_lock *fl) | ||
| 1212 | { | ||
| 1213 | return posix_lock_inode_wait(file_inode(filp), fl); | ||
| 1214 | } | ||
| 1215 | |||
| 1216 | static inline int flock_lock_file_wait(struct file *filp, struct file_lock *fl) | ||
| 1217 | { | ||
| 1218 | return flock_lock_inode_wait(file_inode(filp), fl); | ||
| 1219 | } | ||
| 1205 | 1220 | ||
| 1206 | struct fasync_struct { | 1221 | struct fasync_struct { |
| 1207 | spinlock_t fa_lock; | 1222 | spinlock_t fa_lock; |
| @@ -2011,11 +2026,6 @@ extern void ihold(struct inode * inode); | |||
| 2011 | extern void iput(struct inode *); | 2026 | extern void iput(struct inode *); |
| 2012 | extern int generic_update_time(struct inode *, struct timespec *, int); | 2027 | extern int generic_update_time(struct inode *, struct timespec *, int); |
| 2013 | 2028 | ||
| 2014 | static inline struct inode *file_inode(const struct file *f) | ||
| 2015 | { | ||
| 2016 | return f->f_inode; | ||
| 2017 | } | ||
| 2018 | |||
| 2019 | /* /sys/fs */ | 2029 | /* /sys/fs */ |
| 2020 | extern struct kobject *fs_kobj; | 2030 | extern struct kobject *fs_kobj; |
| 2021 | 2031 | ||
diff --git a/include/linux/gpio/driver.h b/include/linux/gpio/driver.h index cc7ec129b329..c8393cd4d44f 100644 --- a/include/linux/gpio/driver.h +++ b/include/linux/gpio/driver.h | |||
| @@ -45,7 +45,7 @@ struct seq_file; | |||
| 45 | * @base: identifies the first GPIO number handled by this chip; | 45 | * @base: identifies the first GPIO number handled by this chip; |
| 46 | * or, if negative during registration, requests dynamic ID allocation. | 46 | * or, if negative during registration, requests dynamic ID allocation. |
| 47 | * DEPRECATION: providing anything non-negative and nailing the base | 47 | * DEPRECATION: providing anything non-negative and nailing the base |
| 48 | * base offset of GPIO chips is deprecated. Please pass -1 as base to | 48 | * offset of GPIO chips is deprecated. Please pass -1 as base to |
| 49 | * let gpiolib select the chip base in all possible cases. We want to | 49 | * let gpiolib select the chip base in all possible cases. We want to |
| 50 | * get rid of the static GPIO number space in the long run. | 50 | * get rid of the static GPIO number space in the long run. |
| 51 | * @ngpio: the number of GPIOs handled by this controller; the last GPIO | 51 | * @ngpio: the number of GPIOs handled by this controller; the last GPIO |
diff --git a/include/linux/hid-sensor-hub.h b/include/linux/hid-sensor-hub.h index 0042bf330b99..c02b5ce6c5cd 100644 --- a/include/linux/hid-sensor-hub.h +++ b/include/linux/hid-sensor-hub.h | |||
| @@ -230,6 +230,7 @@ struct hid_sensor_common { | |||
| 230 | struct platform_device *pdev; | 230 | struct platform_device *pdev; |
| 231 | unsigned usage_id; | 231 | unsigned usage_id; |
| 232 | atomic_t data_ready; | 232 | atomic_t data_ready; |
| 233 | atomic_t user_requested_state; | ||
| 233 | struct iio_trigger *trigger; | 234 | struct iio_trigger *trigger; |
| 234 | struct hid_sensor_hub_attribute_info poll; | 235 | struct hid_sensor_hub_attribute_info poll; |
| 235 | struct hid_sensor_hub_attribute_info report_state; | 236 | struct hid_sensor_hub_attribute_info report_state; |
diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h index 205026175c42..d891f949466a 100644 --- a/include/linux/hugetlb.h +++ b/include/linux/hugetlb.h | |||
| @@ -460,15 +460,14 @@ static inline spinlock_t *huge_pte_lockptr(struct hstate *h, | |||
| 460 | return &mm->page_table_lock; | 460 | return &mm->page_table_lock; |
| 461 | } | 461 | } |
| 462 | 462 | ||
| 463 | static inline bool hugepages_supported(void) | 463 | #ifndef hugepages_supported |
| 464 | { | 464 | /* |
| 465 | /* | 465 | * Some platform decide whether they support huge pages at boot |
| 466 | * Some platform decide whether they support huge pages at boot | 466 | * time. Some of them, such as powerpc, set HPAGE_SHIFT to 0 |
| 467 | * time. On these, such as powerpc, HPAGE_SHIFT is set to 0 when | 467 | * when there is no such support |
| 468 | * there is no such support | 468 | */ |
| 469 | */ | 469 | #define hugepages_supported() (HPAGE_SHIFT != 0) |
| 470 | return HPAGE_SHIFT != 0; | 470 | #endif |
| 471 | } | ||
| 472 | 471 | ||
| 473 | #else /* CONFIG_HUGETLB_PAGE */ | 472 | #else /* CONFIG_HUGETLB_PAGE */ |
| 474 | struct hstate {}; | 473 | struct hstate {}; |
diff --git a/include/linux/init.h b/include/linux/init.h index 7c68c36d3fd8..b449f378f995 100644 --- a/include/linux/init.h +++ b/include/linux/init.h | |||
| @@ -282,68 +282,8 @@ void __init parse_early_param(void); | |||
| 282 | void __init parse_early_options(char *cmdline); | 282 | void __init parse_early_options(char *cmdline); |
| 283 | #endif /* __ASSEMBLY__ */ | 283 | #endif /* __ASSEMBLY__ */ |
| 284 | 284 | ||
| 285 | /** | ||
| 286 | * module_init() - driver initialization entry point | ||
| 287 | * @x: function to be run at kernel boot time or module insertion | ||
| 288 | * | ||
| 289 | * module_init() will either be called during do_initcalls() (if | ||
| 290 | * builtin) or at module insertion time (if a module). There can only | ||
| 291 | * be one per module. | ||
| 292 | */ | ||
| 293 | #define module_init(x) __initcall(x); | ||
| 294 | |||
| 295 | /** | ||
| 296 | * module_exit() - driver exit entry point | ||
| 297 | * @x: function to be run when driver is removed | ||
| 298 | * | ||
| 299 | * module_exit() will wrap the driver clean-up code | ||
| 300 | * with cleanup_module() when used with rmmod when | ||
| 301 | * the driver is a module. If the driver is statically | ||
| 302 | * compiled into the kernel, module_exit() has no effect. | ||
| 303 | * There can only be one per module. | ||
| 304 | */ | ||
| 305 | #define module_exit(x) __exitcall(x); | ||
| 306 | |||
| 307 | #else /* MODULE */ | 285 | #else /* MODULE */ |
| 308 | 286 | ||
| 309 | /* | ||
| 310 | * In most cases loadable modules do not need custom | ||
| 311 | * initcall levels. There are still some valid cases where | ||
| 312 | * a driver may be needed early if built in, and does not | ||
| 313 | * matter when built as a loadable module. Like bus | ||
| 314 | * snooping debug drivers. | ||
| 315 | */ | ||
| 316 | #define early_initcall(fn) module_init(fn) | ||
| 317 | #define core_initcall(fn) module_init(fn) | ||
| 318 | #define core_initcall_sync(fn) module_init(fn) | ||
| 319 | #define postcore_initcall(fn) module_init(fn) | ||
| 320 | #define postcore_initcall_sync(fn) module_init(fn) | ||
| 321 | #define arch_initcall(fn) module_init(fn) | ||
| 322 | #define subsys_initcall(fn) module_init(fn) | ||
| 323 | #define subsys_initcall_sync(fn) module_init(fn) | ||
| 324 | #define fs_initcall(fn) module_init(fn) | ||
| 325 | #define fs_initcall_sync(fn) module_init(fn) | ||
| 326 | #define rootfs_initcall(fn) module_init(fn) | ||
| 327 | #define device_initcall(fn) module_init(fn) | ||
| 328 | #define device_initcall_sync(fn) module_init(fn) | ||
| 329 | #define late_initcall(fn) module_init(fn) | ||
| 330 | #define late_initcall_sync(fn) module_init(fn) | ||
| 331 | |||
| 332 | #define console_initcall(fn) module_init(fn) | ||
| 333 | #define security_initcall(fn) module_init(fn) | ||
| 334 | |||
| 335 | /* Each module must use one module_init(). */ | ||
| 336 | #define module_init(initfn) \ | ||
| 337 | static inline initcall_t __inittest(void) \ | ||
| 338 | { return initfn; } \ | ||
| 339 | int init_module(void) __attribute__((alias(#initfn))); | ||
| 340 | |||
| 341 | /* This is only required if you want to be unloadable. */ | ||
| 342 | #define module_exit(exitfn) \ | ||
| 343 | static inline exitcall_t __exittest(void) \ | ||
| 344 | { return exitfn; } \ | ||
| 345 | void cleanup_module(void) __attribute__((alias(#exitfn))); | ||
| 346 | |||
| 347 | #define __setup_param(str, unique_id, fn) /* nothing */ | 287 | #define __setup_param(str, unique_id, fn) /* nothing */ |
| 348 | #define __setup(str, func) /* nothing */ | 288 | #define __setup(str, func) /* nothing */ |
| 349 | #endif | 289 | #endif |
| @@ -351,24 +291,6 @@ void __init parse_early_options(char *cmdline); | |||
| 351 | /* Data marked not to be saved by software suspend */ | 291 | /* Data marked not to be saved by software suspend */ |
| 352 | #define __nosavedata __section(.data..nosave) | 292 | #define __nosavedata __section(.data..nosave) |
| 353 | 293 | ||
| 354 | /* This means "can be init if no module support, otherwise module load | ||
| 355 | may call it." */ | ||
| 356 | #ifdef CONFIG_MODULES | ||
| 357 | #define __init_or_module | ||
| 358 | #define __initdata_or_module | ||
| 359 | #define __initconst_or_module | ||
| 360 | #define __INIT_OR_MODULE .text | ||
| 361 | #define __INITDATA_OR_MODULE .data | ||
| 362 | #define __INITRODATA_OR_MODULE .section ".rodata","a",%progbits | ||
| 363 | #else | ||
| 364 | #define __init_or_module __init | ||
| 365 | #define __initdata_or_module __initdata | ||
| 366 | #define __initconst_or_module __initconst | ||
| 367 | #define __INIT_OR_MODULE __INIT | ||
| 368 | #define __INITDATA_OR_MODULE __INITDATA | ||
| 369 | #define __INITRODATA_OR_MODULE __INITRODATA | ||
| 370 | #endif /*CONFIG_MODULES*/ | ||
| 371 | |||
| 372 | #ifdef MODULE | 294 | #ifdef MODULE |
| 373 | #define __exit_p(x) x | 295 | #define __exit_p(x) x |
| 374 | #else | 296 | #else |
diff --git a/include/linux/iommu.h b/include/linux/iommu.h index dc767f7c3704..f9c1b6d0f2e4 100644 --- a/include/linux/iommu.h +++ b/include/linux/iommu.h | |||
| @@ -258,7 +258,7 @@ extern int iommu_domain_set_attr(struct iommu_domain *domain, enum iommu_attr, | |||
| 258 | void *data); | 258 | void *data); |
| 259 | struct device *iommu_device_create(struct device *parent, void *drvdata, | 259 | struct device *iommu_device_create(struct device *parent, void *drvdata, |
| 260 | const struct attribute_group **groups, | 260 | const struct attribute_group **groups, |
| 261 | const char *fmt, ...); | 261 | const char *fmt, ...) __printf(4, 5); |
| 262 | void iommu_device_destroy(struct device *dev); | 262 | void iommu_device_destroy(struct device *dev); |
| 263 | int iommu_device_link(struct device *dev, struct device *link); | 263 | int iommu_device_link(struct device *dev, struct device *link); |
| 264 | void iommu_device_unlink(struct device *dev, struct device *link); | 264 | void iommu_device_unlink(struct device *dev, struct device *link); |
diff --git a/include/linux/kernel.h b/include/linux/kernel.h index 5f0be58640ea..5582410727cb 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h | |||
| @@ -411,7 +411,8 @@ extern __printf(3, 0) | |||
| 411 | int vscnprintf(char *buf, size_t size, const char *fmt, va_list args); | 411 | int vscnprintf(char *buf, size_t size, const char *fmt, va_list args); |
| 412 | extern __printf(2, 3) | 412 | extern __printf(2, 3) |
| 413 | char *kasprintf(gfp_t gfp, const char *fmt, ...); | 413 | char *kasprintf(gfp_t gfp, const char *fmt, ...); |
| 414 | extern char *kvasprintf(gfp_t gfp, const char *fmt, va_list args); | 414 | extern __printf(2, 0) |
| 415 | char *kvasprintf(gfp_t gfp, const char *fmt, va_list args); | ||
| 415 | 416 | ||
| 416 | extern __scanf(2, 3) | 417 | extern __scanf(2, 3) |
| 417 | int sscanf(const char *, const char *, ...); | 418 | int sscanf(const char *, const char *, ...); |
| @@ -679,10 +680,10 @@ do { \ | |||
| 679 | __ftrace_vprintk(_THIS_IP_, fmt, vargs); \ | 680 | __ftrace_vprintk(_THIS_IP_, fmt, vargs); \ |
| 680 | } while (0) | 681 | } while (0) |
| 681 | 682 | ||
| 682 | extern int | 683 | extern __printf(2, 0) int |
| 683 | __ftrace_vbprintk(unsigned long ip, const char *fmt, va_list ap); | 684 | __ftrace_vbprintk(unsigned long ip, const char *fmt, va_list ap); |
| 684 | 685 | ||
| 685 | extern int | 686 | extern __printf(2, 0) int |
| 686 | __ftrace_vprintk(unsigned long ip, const char *fmt, va_list ap); | 687 | __ftrace_vprintk(unsigned long ip, const char *fmt, va_list ap); |
| 687 | 688 | ||
| 688 | extern void ftrace_dump(enum ftrace_dump_mode oops_dump_mode); | 689 | extern void ftrace_dump(enum ftrace_dump_mode oops_dump_mode); |
| @@ -702,7 +703,7 @@ int trace_printk(const char *fmt, ...) | |||
| 702 | { | 703 | { |
| 703 | return 0; | 704 | return 0; |
| 704 | } | 705 | } |
| 705 | static inline int | 706 | static __printf(1, 0) inline int |
| 706 | ftrace_vprintk(const char *fmt, va_list ap) | 707 | ftrace_vprintk(const char *fmt, va_list ap) |
| 707 | { | 708 | { |
| 708 | return 0; | 709 | return 0; |
diff --git a/include/linux/kobject.h b/include/linux/kobject.h index 2d61b909f414..637f67002c5a 100644 --- a/include/linux/kobject.h +++ b/include/linux/kobject.h | |||
| @@ -80,8 +80,9 @@ struct kobject { | |||
| 80 | 80 | ||
| 81 | extern __printf(2, 3) | 81 | extern __printf(2, 3) |
| 82 | int kobject_set_name(struct kobject *kobj, const char *name, ...); | 82 | int kobject_set_name(struct kobject *kobj, const char *name, ...); |
| 83 | extern int kobject_set_name_vargs(struct kobject *kobj, const char *fmt, | 83 | extern __printf(2, 0) |
| 84 | va_list vargs); | 84 | int kobject_set_name_vargs(struct kobject *kobj, const char *fmt, |
| 85 | va_list vargs); | ||
| 85 | 86 | ||
| 86 | static inline const char *kobject_name(const struct kobject *kobj) | 87 | static inline const char *kobject_name(const struct kobject *kobj) |
| 87 | { | 88 | { |
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 9564fd78c547..05e99b8ef465 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h | |||
| @@ -734,6 +734,24 @@ static inline bool kvm_arch_has_noncoherent_dma(struct kvm *kvm) | |||
| 734 | return false; | 734 | return false; |
| 735 | } | 735 | } |
| 736 | #endif | 736 | #endif |
| 737 | #ifdef __KVM_HAVE_ARCH_ASSIGNED_DEVICE | ||
| 738 | void kvm_arch_start_assignment(struct kvm *kvm); | ||
| 739 | void kvm_arch_end_assignment(struct kvm *kvm); | ||
| 740 | bool kvm_arch_has_assigned_device(struct kvm *kvm); | ||
| 741 | #else | ||
| 742 | static inline void kvm_arch_start_assignment(struct kvm *kvm) | ||
| 743 | { | ||
| 744 | } | ||
| 745 | |||
| 746 | static inline void kvm_arch_end_assignment(struct kvm *kvm) | ||
| 747 | { | ||
| 748 | } | ||
| 749 | |||
| 750 | static inline bool kvm_arch_has_assigned_device(struct kvm *kvm) | ||
| 751 | { | ||
| 752 | return false; | ||
| 753 | } | ||
| 754 | #endif | ||
| 737 | 755 | ||
| 738 | static inline wait_queue_head_t *kvm_arch_vcpu_wq(struct kvm_vcpu *vcpu) | 756 | static inline wait_queue_head_t *kvm_arch_vcpu_wq(struct kvm_vcpu *vcpu) |
| 739 | { | 757 | { |
diff --git a/include/linux/mmiotrace.h b/include/linux/mmiotrace.h index c5d52780d6a0..3ba327af055c 100644 --- a/include/linux/mmiotrace.h +++ b/include/linux/mmiotrace.h | |||
| @@ -106,6 +106,6 @@ extern void enable_mmiotrace(void); | |||
| 106 | extern void disable_mmiotrace(void); | 106 | extern void disable_mmiotrace(void); |
| 107 | extern void mmio_trace_rw(struct mmiotrace_rw *rw); | 107 | extern void mmio_trace_rw(struct mmiotrace_rw *rw); |
| 108 | extern void mmio_trace_mapping(struct mmiotrace_map *map); | 108 | extern void mmio_trace_mapping(struct mmiotrace_map *map); |
| 109 | extern int mmio_trace_printk(const char *fmt, va_list args); | 109 | extern __printf(1, 0) int mmio_trace_printk(const char *fmt, va_list args); |
| 110 | 110 | ||
| 111 | #endif /* _LINUX_MMIOTRACE_H */ | 111 | #endif /* _LINUX_MMIOTRACE_H */ |
diff --git a/include/linux/module.h b/include/linux/module.h index d67b1932cc59..3a19c79918e0 100644 --- a/include/linux/module.h +++ b/include/linux/module.h | |||
| @@ -11,6 +11,7 @@ | |||
| 11 | #include <linux/compiler.h> | 11 | #include <linux/compiler.h> |
| 12 | #include <linux/cache.h> | 12 | #include <linux/cache.h> |
| 13 | #include <linux/kmod.h> | 13 | #include <linux/kmod.h> |
| 14 | #include <linux/init.h> | ||
| 14 | #include <linux/elf.h> | 15 | #include <linux/elf.h> |
| 15 | #include <linux/stringify.h> | 16 | #include <linux/stringify.h> |
| 16 | #include <linux/kobject.h> | 17 | #include <linux/kobject.h> |
| @@ -71,6 +72,89 @@ extern struct module_attribute module_uevent; | |||
| 71 | extern int init_module(void); | 72 | extern int init_module(void); |
| 72 | extern void cleanup_module(void); | 73 | extern void cleanup_module(void); |
| 73 | 74 | ||
| 75 | #ifndef MODULE | ||
| 76 | /** | ||
| 77 | * module_init() - driver initialization entry point | ||
| 78 | * @x: function to be run at kernel boot time or module insertion | ||
| 79 | * | ||
| 80 | * module_init() will either be called during do_initcalls() (if | ||
| 81 | * builtin) or at module insertion time (if a module). There can only | ||
| 82 | * be one per module. | ||
| 83 | */ | ||
| 84 | #define module_init(x) __initcall(x); | ||
| 85 | |||
| 86 | /** | ||
| 87 | * module_exit() - driver exit entry point | ||
| 88 | * @x: function to be run when driver is removed | ||
| 89 | * | ||
| 90 | * module_exit() will wrap the driver clean-up code | ||
| 91 | * with cleanup_module() when used with rmmod when | ||
| 92 | * the driver is a module. If the driver is statically | ||
| 93 | * compiled into the kernel, module_exit() has no effect. | ||
| 94 | * There can only be one per module. | ||
| 95 | */ | ||
| 96 | #define module_exit(x) __exitcall(x); | ||
| 97 | |||
| 98 | #else /* MODULE */ | ||
| 99 | |||
| 100 | /* | ||
| 101 | * In most cases loadable modules do not need custom | ||
| 102 | * initcall levels. There are still some valid cases where | ||
| 103 | * a driver may be needed early if built in, and does not | ||
| 104 | * matter when built as a loadable module. Like bus | ||
| 105 | * snooping debug drivers. | ||
| 106 | */ | ||
| 107 | #define early_initcall(fn) module_init(fn) | ||
| 108 | #define core_initcall(fn) module_init(fn) | ||
| 109 | #define core_initcall_sync(fn) module_init(fn) | ||
| 110 | #define postcore_initcall(fn) module_init(fn) | ||
| 111 | #define postcore_initcall_sync(fn) module_init(fn) | ||
| 112 | #define arch_initcall(fn) module_init(fn) | ||
| 113 | #define subsys_initcall(fn) module_init(fn) | ||
| 114 | #define subsys_initcall_sync(fn) module_init(fn) | ||
| 115 | #define fs_initcall(fn) module_init(fn) | ||
| 116 | #define fs_initcall_sync(fn) module_init(fn) | ||
| 117 | #define rootfs_initcall(fn) module_init(fn) | ||
| 118 | #define device_initcall(fn) module_init(fn) | ||
| 119 | #define device_initcall_sync(fn) module_init(fn) | ||
| 120 | #define late_initcall(fn) module_init(fn) | ||
| 121 | #define late_initcall_sync(fn) module_init(fn) | ||
| 122 | |||
| 123 | #define console_initcall(fn) module_init(fn) | ||
| 124 | #define security_initcall(fn) module_init(fn) | ||
| 125 | |||
| 126 | /* Each module must use one module_init(). */ | ||
| 127 | #define module_init(initfn) \ | ||
| 128 | static inline initcall_t __inittest(void) \ | ||
| 129 | { return initfn; } \ | ||
| 130 | int init_module(void) __attribute__((alias(#initfn))); | ||
| 131 | |||
| 132 | /* This is only required if you want to be unloadable. */ | ||
| 133 | #define module_exit(exitfn) \ | ||
| 134 | static inline exitcall_t __exittest(void) \ | ||
| 135 | { return exitfn; } \ | ||
| 136 | void cleanup_module(void) __attribute__((alias(#exitfn))); | ||
| 137 | |||
| 138 | #endif | ||
| 139 | |||
| 140 | /* This means "can be init if no module support, otherwise module load | ||
| 141 | may call it." */ | ||
| 142 | #ifdef CONFIG_MODULES | ||
| 143 | #define __init_or_module | ||
| 144 | #define __initdata_or_module | ||
| 145 | #define __initconst_or_module | ||
| 146 | #define __INIT_OR_MODULE .text | ||
| 147 | #define __INITDATA_OR_MODULE .data | ||
| 148 | #define __INITRODATA_OR_MODULE .section ".rodata","a",%progbits | ||
| 149 | #else | ||
| 150 | #define __init_or_module __init | ||
| 151 | #define __initdata_or_module __initdata | ||
| 152 | #define __initconst_or_module __initconst | ||
| 153 | #define __INIT_OR_MODULE __INIT | ||
| 154 | #define __INITDATA_OR_MODULE __INITDATA | ||
| 155 | #define __INITRODATA_OR_MODULE __INITRODATA | ||
| 156 | #endif /*CONFIG_MODULES*/ | ||
| 157 | |||
| 74 | /* Archs provide a method of finding the correct exception table. */ | 158 | /* Archs provide a method of finding the correct exception table. */ |
| 75 | struct exception_table_entry; | 159 | struct exception_table_entry; |
| 76 | 160 | ||
diff --git a/include/linux/page_owner.h b/include/linux/page_owner.h index b48c3471c254..cacaabea8a09 100644 --- a/include/linux/page_owner.h +++ b/include/linux/page_owner.h | |||
| @@ -8,6 +8,7 @@ extern struct page_ext_operations page_owner_ops; | |||
| 8 | extern void __reset_page_owner(struct page *page, unsigned int order); | 8 | extern void __reset_page_owner(struct page *page, unsigned int order); |
| 9 | extern void __set_page_owner(struct page *page, | 9 | extern void __set_page_owner(struct page *page, |
| 10 | unsigned int order, gfp_t gfp_mask); | 10 | unsigned int order, gfp_t gfp_mask); |
| 11 | extern gfp_t __get_page_owner_gfp(struct page *page); | ||
| 11 | 12 | ||
| 12 | static inline void reset_page_owner(struct page *page, unsigned int order) | 13 | static inline void reset_page_owner(struct page *page, unsigned int order) |
| 13 | { | 14 | { |
| @@ -25,6 +26,14 @@ static inline void set_page_owner(struct page *page, | |||
| 25 | 26 | ||
| 26 | __set_page_owner(page, order, gfp_mask); | 27 | __set_page_owner(page, order, gfp_mask); |
| 27 | } | 28 | } |
| 29 | |||
| 30 | static inline gfp_t get_page_owner_gfp(struct page *page) | ||
| 31 | { | ||
| 32 | if (likely(!page_owner_inited)) | ||
| 33 | return 0; | ||
| 34 | |||
| 35 | return __get_page_owner_gfp(page); | ||
| 36 | } | ||
| 28 | #else | 37 | #else |
| 29 | static inline void reset_page_owner(struct page *page, unsigned int order) | 38 | static inline void reset_page_owner(struct page *page, unsigned int order) |
| 30 | { | 39 | { |
| @@ -33,6 +42,10 @@ static inline void set_page_owner(struct page *page, | |||
| 33 | unsigned int order, gfp_t gfp_mask) | 42 | unsigned int order, gfp_t gfp_mask) |
| 34 | { | 43 | { |
| 35 | } | 44 | } |
| 45 | static inline gfp_t get_page_owner_gfp(struct page *page) | ||
| 46 | { | ||
| 47 | return 0; | ||
| 48 | } | ||
| 36 | 49 | ||
| 37 | #endif /* CONFIG_PAGE_OWNER */ | 50 | #endif /* CONFIG_PAGE_OWNER */ |
| 38 | #endif /* __LINUX_PAGE_OWNER_H */ | 51 | #endif /* __LINUX_PAGE_OWNER_H */ |
diff --git a/include/linux/pata_arasan_cf_data.h b/include/linux/pata_arasan_cf_data.h index 3cc21c9cc1e8..9fade5dd2e86 100644 --- a/include/linux/pata_arasan_cf_data.h +++ b/include/linux/pata_arasan_cf_data.h | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * Arasan Compact Flash host controller platform data header file | 4 | * Arasan Compact Flash host controller platform data header file |
| 5 | * | 5 | * |
| 6 | * Copyright (C) 2011 ST Microelectronics | 6 | * Copyright (C) 2011 ST Microelectronics |
| 7 | * Viresh Kumar <viresh.linux@gmail.com> | 7 | * Viresh Kumar <vireshk@kernel.org> |
| 8 | * | 8 | * |
| 9 | * This file is licensed under the terms of the GNU General Public | 9 | * This file is licensed under the terms of the GNU General Public |
| 10 | * License version 2. This program is licensed "as is" without any | 10 | * License version 2. This program is licensed "as is" without any |
diff --git a/include/linux/printk.h b/include/linux/printk.h index 58b1fec40d37..a6298b27ac99 100644 --- a/include/linux/printk.h +++ b/include/linux/printk.h | |||
| @@ -122,7 +122,7 @@ static inline __printf(1, 2) __cold | |||
| 122 | void early_printk(const char *s, ...) { } | 122 | void early_printk(const char *s, ...) { } |
| 123 | #endif | 123 | #endif |
| 124 | 124 | ||
| 125 | typedef int(*printk_func_t)(const char *fmt, va_list args); | 125 | typedef __printf(1, 0) int (*printk_func_t)(const char *fmt, va_list args); |
| 126 | 126 | ||
| 127 | #ifdef CONFIG_PRINTK | 127 | #ifdef CONFIG_PRINTK |
| 128 | asmlinkage __printf(5, 0) | 128 | asmlinkage __printf(5, 0) |
| @@ -166,7 +166,7 @@ char *log_buf_addr_get(void); | |||
| 166 | u32 log_buf_len_get(void); | 166 | u32 log_buf_len_get(void); |
| 167 | void log_buf_kexec_setup(void); | 167 | void log_buf_kexec_setup(void); |
| 168 | void __init setup_log_buf(int early); | 168 | void __init setup_log_buf(int early); |
| 169 | void dump_stack_set_arch_desc(const char *fmt, ...); | 169 | __printf(1, 2) void dump_stack_set_arch_desc(const char *fmt, ...); |
| 170 | void dump_stack_print_info(const char *log_lvl); | 170 | void dump_stack_print_info(const char *log_lvl); |
| 171 | void show_regs_print_info(const char *log_lvl); | 171 | void show_regs_print_info(const char *log_lvl); |
| 172 | #else | 172 | #else |
| @@ -217,7 +217,7 @@ static inline void setup_log_buf(int early) | |||
| 217 | { | 217 | { |
| 218 | } | 218 | } |
| 219 | 219 | ||
| 220 | static inline void dump_stack_set_arch_desc(const char *fmt, ...) | 220 | static inline __printf(1, 2) void dump_stack_set_arch_desc(const char *fmt, ...) |
| 221 | { | 221 | { |
| 222 | } | 222 | } |
| 223 | 223 | ||
diff --git a/include/linux/sched.h b/include/linux/sched.h index ae21f1591615..04b5ada460b4 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
| @@ -1522,8 +1522,6 @@ struct task_struct { | |||
| 1522 | /* hung task detection */ | 1522 | /* hung task detection */ |
| 1523 | unsigned long last_switch_count; | 1523 | unsigned long last_switch_count; |
| 1524 | #endif | 1524 | #endif |
| 1525 | /* CPU-specific state of this task */ | ||
| 1526 | struct thread_struct thread; | ||
| 1527 | /* filesystem information */ | 1525 | /* filesystem information */ |
| 1528 | struct fs_struct *fs; | 1526 | struct fs_struct *fs; |
| 1529 | /* open file information */ | 1527 | /* open file information */ |
| @@ -1778,8 +1776,22 @@ struct task_struct { | |||
| 1778 | unsigned long task_state_change; | 1776 | unsigned long task_state_change; |
| 1779 | #endif | 1777 | #endif |
| 1780 | int pagefault_disabled; | 1778 | int pagefault_disabled; |
| 1779 | /* CPU-specific state of this task */ | ||
| 1780 | struct thread_struct thread; | ||
| 1781 | /* | ||
| 1782 | * WARNING: on x86, 'thread_struct' contains a variable-sized | ||
| 1783 | * structure. It *MUST* be at the end of 'task_struct'. | ||
| 1784 | * | ||
| 1785 | * Do not put anything below here! | ||
| 1786 | */ | ||
| 1781 | }; | 1787 | }; |
| 1782 | 1788 | ||
| 1789 | #ifdef CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT | ||
| 1790 | extern int arch_task_struct_size __read_mostly; | ||
| 1791 | #else | ||
| 1792 | # define arch_task_struct_size (sizeof(struct task_struct)) | ||
| 1793 | #endif | ||
| 1794 | |||
| 1783 | /* Future-safe accessor for struct task_struct's cpus_allowed. */ | 1795 | /* Future-safe accessor for struct task_struct's cpus_allowed. */ |
| 1784 | #define tsk_cpus_allowed(tsk) (&(tsk)->cpus_allowed) | 1796 | #define tsk_cpus_allowed(tsk) (&(tsk)->cpus_allowed) |
| 1785 | 1797 | ||
diff --git a/include/linux/usb/cdc_ncm.h b/include/linux/usb/cdc_ncm.h index 7c9b484735c5..1f6526c76ee8 100644 --- a/include/linux/usb/cdc_ncm.h +++ b/include/linux/usb/cdc_ncm.h | |||
| @@ -80,6 +80,9 @@ | |||
| 80 | #define CDC_NCM_TIMER_INTERVAL_MIN 5UL | 80 | #define CDC_NCM_TIMER_INTERVAL_MIN 5UL |
| 81 | #define CDC_NCM_TIMER_INTERVAL_MAX (U32_MAX / NSEC_PER_USEC) | 81 | #define CDC_NCM_TIMER_INTERVAL_MAX (U32_MAX / NSEC_PER_USEC) |
| 82 | 82 | ||
| 83 | /* Driver flags */ | ||
| 84 | #define CDC_NCM_FLAG_NDP_TO_END 0x02 /* NDP is placed at end of frame */ | ||
| 85 | |||
| 83 | #define cdc_ncm_comm_intf_is_mbim(x) ((x)->desc.bInterfaceSubClass == USB_CDC_SUBCLASS_MBIM && \ | 86 | #define cdc_ncm_comm_intf_is_mbim(x) ((x)->desc.bInterfaceSubClass == USB_CDC_SUBCLASS_MBIM && \ |
| 84 | (x)->desc.bInterfaceProtocol == USB_CDC_PROTO_NONE) | 87 | (x)->desc.bInterfaceProtocol == USB_CDC_PROTO_NONE) |
| 85 | #define cdc_ncm_data_intf_is_mbim(x) ((x)->desc.bInterfaceProtocol == USB_CDC_MBIM_PROTO_NTB) | 88 | #define cdc_ncm_data_intf_is_mbim(x) ((x)->desc.bInterfaceProtocol == USB_CDC_MBIM_PROTO_NTB) |
| @@ -103,9 +106,11 @@ struct cdc_ncm_ctx { | |||
| 103 | 106 | ||
| 104 | spinlock_t mtx; | 107 | spinlock_t mtx; |
| 105 | atomic_t stop; | 108 | atomic_t stop; |
| 109 | int drvflags; | ||
| 106 | 110 | ||
| 107 | u32 timer_interval; | 111 | u32 timer_interval; |
| 108 | u32 max_ndp_size; | 112 | u32 max_ndp_size; |
| 113 | struct usb_cdc_ncm_ndp16 *delayed_ndp16; | ||
| 109 | 114 | ||
| 110 | u32 tx_timer_pending; | 115 | u32 tx_timer_pending; |
| 111 | u32 tx_curr_frame_num; | 116 | u32 tx_curr_frame_num; |
| @@ -133,7 +138,7 @@ struct cdc_ncm_ctx { | |||
| 133 | }; | 138 | }; |
| 134 | 139 | ||
| 135 | u8 cdc_ncm_select_altsetting(struct usb_interface *intf); | 140 | u8 cdc_ncm_select_altsetting(struct usb_interface *intf); |
| 136 | int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_altsetting); | 141 | int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_altsetting, int drvflags); |
| 137 | void cdc_ncm_unbind(struct usbnet *dev, struct usb_interface *intf); | 142 | void cdc_ncm_unbind(struct usbnet *dev, struct usb_interface *intf); |
| 138 | struct sk_buff *cdc_ncm_fill_tx_frame(struct usbnet *dev, struct sk_buff *skb, __le32 sign); | 143 | struct sk_buff *cdc_ncm_fill_tx_frame(struct usbnet *dev, struct sk_buff *skb, __le32 sign); |
| 139 | int cdc_ncm_rx_verify_nth16(struct cdc_ncm_ctx *ctx, struct sk_buff *skb_in); | 144 | int cdc_ncm_rx_verify_nth16(struct cdc_ncm_ctx *ctx, struct sk_buff *skb_in); |
diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h index 986fddb08579..b0f898e3b2e7 100644 --- a/include/rdma/ib_verbs.h +++ b/include/rdma/ib_verbs.h | |||
| @@ -1745,6 +1745,7 @@ struct ib_device { | |||
| 1745 | char node_desc[64]; | 1745 | char node_desc[64]; |
| 1746 | __be64 node_guid; | 1746 | __be64 node_guid; |
| 1747 | u32 local_dma_lkey; | 1747 | u32 local_dma_lkey; |
| 1748 | u16 is_switch:1; | ||
| 1748 | u8 node_type; | 1749 | u8 node_type; |
| 1749 | u8 phys_port_cnt; | 1750 | u8 phys_port_cnt; |
| 1750 | 1751 | ||
| @@ -1824,6 +1825,20 @@ enum rdma_link_layer rdma_port_get_link_layer(struct ib_device *device, | |||
| 1824 | u8 port_num); | 1825 | u8 port_num); |
| 1825 | 1826 | ||
| 1826 | /** | 1827 | /** |
| 1828 | * rdma_cap_ib_switch - Check if the device is IB switch | ||
| 1829 | * @device: Device to check | ||
| 1830 | * | ||
| 1831 | * Device driver is responsible for setting is_switch bit on | ||
| 1832 | * in ib_device structure at init time. | ||
| 1833 | * | ||
| 1834 | * Return: true if the device is IB switch. | ||
| 1835 | */ | ||
| 1836 | static inline bool rdma_cap_ib_switch(const struct ib_device *device) | ||
| 1837 | { | ||
| 1838 | return device->is_switch; | ||
| 1839 | } | ||
| 1840 | |||
| 1841 | /** | ||
| 1827 | * rdma_start_port - Return the first valid port number for the device | 1842 | * rdma_start_port - Return the first valid port number for the device |
| 1828 | * specified | 1843 | * specified |
| 1829 | * | 1844 | * |
| @@ -1833,7 +1848,7 @@ enum rdma_link_layer rdma_port_get_link_layer(struct ib_device *device, | |||
| 1833 | */ | 1848 | */ |
| 1834 | static inline u8 rdma_start_port(const struct ib_device *device) | 1849 | static inline u8 rdma_start_port(const struct ib_device *device) |
| 1835 | { | 1850 | { |
| 1836 | return (device->node_type == RDMA_NODE_IB_SWITCH) ? 0 : 1; | 1851 | return rdma_cap_ib_switch(device) ? 0 : 1; |
| 1837 | } | 1852 | } |
| 1838 | 1853 | ||
| 1839 | /** | 1854 | /** |
| @@ -1846,8 +1861,7 @@ static inline u8 rdma_start_port(const struct ib_device *device) | |||
| 1846 | */ | 1861 | */ |
| 1847 | static inline u8 rdma_end_port(const struct ib_device *device) | 1862 | static inline u8 rdma_end_port(const struct ib_device *device) |
| 1848 | { | 1863 | { |
| 1849 | return (device->node_type == RDMA_NODE_IB_SWITCH) ? | 1864 | return rdma_cap_ib_switch(device) ? 0 : device->phys_port_cnt; |
| 1850 | 0 : device->phys_port_cnt; | ||
| 1851 | } | 1865 | } |
| 1852 | 1866 | ||
| 1853 | static inline bool rdma_protocol_ib(const struct ib_device *device, u8 port_num) | 1867 | static inline bool rdma_protocol_ib(const struct ib_device *device, u8 port_num) |
diff --git a/include/scsi/scsi_transport_srp.h b/include/scsi/scsi_transport_srp.h index cdb05dd1d440..d40d3ef25707 100644 --- a/include/scsi/scsi_transport_srp.h +++ b/include/scsi/scsi_transport_srp.h | |||
| @@ -119,6 +119,7 @@ extern struct srp_rport *srp_rport_add(struct Scsi_Host *, | |||
| 119 | extern void srp_rport_del(struct srp_rport *); | 119 | extern void srp_rport_del(struct srp_rport *); |
| 120 | extern int srp_tmo_valid(int reconnect_delay, int fast_io_fail_tmo, | 120 | extern int srp_tmo_valid(int reconnect_delay, int fast_io_fail_tmo, |
| 121 | int dev_loss_tmo); | 121 | int dev_loss_tmo); |
| 122 | int srp_parse_tmo(int *tmo, const char *buf); | ||
| 122 | extern int srp_reconnect_rport(struct srp_rport *rport); | 123 | extern int srp_reconnect_rport(struct srp_rport *rport); |
| 123 | extern void srp_start_tl_fail_timers(struct srp_rport *rport); | 124 | extern void srp_start_tl_fail_timers(struct srp_rport *rport); |
| 124 | extern void srp_remove_host(struct Scsi_Host *); | 125 | extern void srp_remove_host(struct Scsi_Host *); |
diff --git a/include/uapi/linux/netconf.h b/include/uapi/linux/netconf.h index 669a1f0b1d97..23cbd34e4ac7 100644 --- a/include/uapi/linux/netconf.h +++ b/include/uapi/linux/netconf.h | |||
| @@ -15,6 +15,7 @@ enum { | |||
| 15 | NETCONFA_RP_FILTER, | 15 | NETCONFA_RP_FILTER, |
| 16 | NETCONFA_MC_FORWARDING, | 16 | NETCONFA_MC_FORWARDING, |
| 17 | NETCONFA_PROXY_NEIGH, | 17 | NETCONFA_PROXY_NEIGH, |
| 18 | NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN, | ||
| 18 | __NETCONFA_MAX | 19 | __NETCONFA_MAX |
| 19 | }; | 20 | }; |
| 20 | #define NETCONFA_MAX (__NETCONFA_MAX - 1) | 21 | #define NETCONFA_MAX (__NETCONFA_MAX - 1) |
diff --git a/include/uapi/sound/asoc.h b/include/uapi/sound/asoc.h index d550c8d40269..2819fc1f8458 100644 --- a/include/uapi/sound/asoc.h +++ b/include/uapi/sound/asoc.h | |||
| @@ -110,7 +110,7 @@ | |||
| 110 | 110 | ||
| 111 | /* | 111 | /* |
| 112 | * Block Header. | 112 | * Block Header. |
| 113 | * This header preceeds all object and object arrays below. | 113 | * This header precedes all object and object arrays below. |
| 114 | */ | 114 | */ |
| 115 | struct snd_soc_tplg_hdr { | 115 | struct snd_soc_tplg_hdr { |
| 116 | __le32 magic; /* magic number */ | 116 | __le32 magic; /* magic number */ |
| @@ -222,7 +222,7 @@ struct snd_soc_tplg_stream_config { | |||
| 222 | /* | 222 | /* |
| 223 | * Manifest. List totals for each payload type. Not used in parsing, but will | 223 | * Manifest. List totals for each payload type. Not used in parsing, but will |
| 224 | * be passed to the component driver before any other objects in order for any | 224 | * be passed to the component driver before any other objects in order for any |
| 225 | * global componnent resource allocations. | 225 | * global component resource allocations. |
| 226 | * | 226 | * |
| 227 | * File block representation for manifest :- | 227 | * File block representation for manifest :- |
| 228 | * +-----------------------------------+----+ | 228 | * +-----------------------------------+----+ |
diff --git a/kernel/cpu.c b/kernel/cpu.c index 6a374544d495..5644ec5582b9 100644 --- a/kernel/cpu.c +++ b/kernel/cpu.c | |||
| @@ -527,18 +527,9 @@ static int _cpu_up(unsigned int cpu, int tasks_frozen) | |||
| 527 | goto out_notify; | 527 | goto out_notify; |
| 528 | } | 528 | } |
| 529 | 529 | ||
| 530 | /* | ||
| 531 | * Some architectures have to walk the irq descriptors to | ||
| 532 | * setup the vector space for the cpu which comes online. | ||
| 533 | * Prevent irq alloc/free across the bringup. | ||
| 534 | */ | ||
| 535 | irq_lock_sparse(); | ||
| 536 | |||
| 537 | /* Arch-specific enabling code. */ | 530 | /* Arch-specific enabling code. */ |
| 538 | ret = __cpu_up(cpu, idle); | 531 | ret = __cpu_up(cpu, idle); |
| 539 | 532 | ||
| 540 | irq_unlock_sparse(); | ||
| 541 | |||
| 542 | if (ret != 0) | 533 | if (ret != 0) |
| 543 | goto out_notify; | 534 | goto out_notify; |
| 544 | BUG_ON(!cpu_online(cpu)); | 535 | BUG_ON(!cpu_online(cpu)); |
diff --git a/kernel/fork.c b/kernel/fork.c index 1bfefc6f96a4..dbd9b8d7b7cc 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
| @@ -287,6 +287,11 @@ static void set_max_threads(unsigned int max_threads_suggested) | |||
| 287 | max_threads = clamp_t(u64, threads, MIN_THREADS, MAX_THREADS); | 287 | max_threads = clamp_t(u64, threads, MIN_THREADS, MAX_THREADS); |
| 288 | } | 288 | } |
| 289 | 289 | ||
| 290 | #ifdef CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT | ||
| 291 | /* Initialized by the architecture: */ | ||
| 292 | int arch_task_struct_size __read_mostly; | ||
| 293 | #endif | ||
| 294 | |||
| 290 | void __init fork_init(void) | 295 | void __init fork_init(void) |
| 291 | { | 296 | { |
| 292 | #ifndef CONFIG_ARCH_TASK_STRUCT_ALLOCATOR | 297 | #ifndef CONFIG_ARCH_TASK_STRUCT_ALLOCATOR |
| @@ -295,7 +300,7 @@ void __init fork_init(void) | |||
| 295 | #endif | 300 | #endif |
| 296 | /* create a slab on which task_structs can be allocated */ | 301 | /* create a slab on which task_structs can be allocated */ |
| 297 | task_struct_cachep = | 302 | task_struct_cachep = |
| 298 | kmem_cache_create("task_struct", sizeof(struct task_struct), | 303 | kmem_cache_create("task_struct", arch_task_struct_size, |
| 299 | ARCH_MIN_TASKALIGN, SLAB_PANIC | SLAB_NOTRACK, NULL); | 304 | ARCH_MIN_TASKALIGN, SLAB_PANIC | SLAB_NOTRACK, NULL); |
| 300 | #endif | 305 | #endif |
| 301 | 306 | ||
diff --git a/kernel/irq/resend.c b/kernel/irq/resend.c index 9065107f083e..7a5237a1bce5 100644 --- a/kernel/irq/resend.c +++ b/kernel/irq/resend.c | |||
| @@ -75,13 +75,21 @@ void check_irq_resend(struct irq_desc *desc, unsigned int irq) | |||
| 75 | !desc->irq_data.chip->irq_retrigger(&desc->irq_data)) { | 75 | !desc->irq_data.chip->irq_retrigger(&desc->irq_data)) { |
| 76 | #ifdef CONFIG_HARDIRQS_SW_RESEND | 76 | #ifdef CONFIG_HARDIRQS_SW_RESEND |
| 77 | /* | 77 | /* |
| 78 | * If the interrupt has a parent irq and runs | 78 | * If the interrupt is running in the thread |
| 79 | * in the thread context of the parent irq, | 79 | * context of the parent irq we need to be |
| 80 | * retrigger the parent. | 80 | * careful, because we cannot trigger it |
| 81 | * directly. | ||
| 81 | */ | 82 | */ |
| 82 | if (desc->parent_irq && | 83 | if (irq_settings_is_nested_thread(desc)) { |
| 83 | irq_settings_is_nested_thread(desc)) | 84 | /* |
| 85 | * If the parent_irq is valid, we | ||
| 86 | * retrigger the parent, otherwise we | ||
| 87 | * do nothing. | ||
| 88 | */ | ||
| 89 | if (!desc->parent_irq) | ||
| 90 | return; | ||
| 84 | irq = desc->parent_irq; | 91 | irq = desc->parent_irq; |
| 92 | } | ||
| 85 | /* Set it pending and activate the softirq: */ | 93 | /* Set it pending and activate the softirq: */ |
| 86 | set_bit(irq, irqs_resend); | 94 | set_bit(irq, irqs_resend); |
| 87 | tasklet_schedule(&resend_tasklet); | 95 | tasklet_schedule(&resend_tasklet); |
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 65c8f3ebdc3c..d113c3ba8bc4 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c | |||
| @@ -3683,7 +3683,7 @@ static void throttle_cfs_rq(struct cfs_rq *cfs_rq) | |||
| 3683 | cfs_rq->throttled = 1; | 3683 | cfs_rq->throttled = 1; |
| 3684 | cfs_rq->throttled_clock = rq_clock(rq); | 3684 | cfs_rq->throttled_clock = rq_clock(rq); |
| 3685 | raw_spin_lock(&cfs_b->lock); | 3685 | raw_spin_lock(&cfs_b->lock); |
| 3686 | empty = list_empty(&cfs_rq->throttled_list); | 3686 | empty = list_empty(&cfs_b->throttled_cfs_rq); |
| 3687 | 3687 | ||
| 3688 | /* | 3688 | /* |
| 3689 | * Add to the _head_ of the list, so that an already-started | 3689 | * Add to the _head_ of the list, so that an already-started |
diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c index 52b9e199b5ac..f6aae7977824 100644 --- a/kernel/time/tick-broadcast.c +++ b/kernel/time/tick-broadcast.c | |||
| @@ -839,7 +839,6 @@ out: | |||
| 839 | raw_spin_unlock(&tick_broadcast_lock); | 839 | raw_spin_unlock(&tick_broadcast_lock); |
| 840 | return ret; | 840 | return ret; |
| 841 | } | 841 | } |
| 842 | EXPORT_SYMBOL_GPL(tick_broadcast_oneshot_control); | ||
| 843 | 842 | ||
| 844 | /* | 843 | /* |
| 845 | * Reset the one shot broadcast for a cpu | 844 | * Reset the one shot broadcast for a cpu |
diff --git a/kernel/time/tick-common.c b/kernel/time/tick-common.c index 55e13efff1ab..f8bf47571dda 100644 --- a/kernel/time/tick-common.c +++ b/kernel/time/tick-common.c | |||
| @@ -363,6 +363,7 @@ int tick_broadcast_oneshot_control(enum tick_broadcast_state state) | |||
| 363 | 363 | ||
| 364 | return __tick_broadcast_oneshot_control(state); | 364 | return __tick_broadcast_oneshot_control(state); |
| 365 | } | 365 | } |
| 366 | EXPORT_SYMBOL_GPL(tick_broadcast_oneshot_control); | ||
| 366 | 367 | ||
| 367 | #ifdef CONFIG_HOTPLUG_CPU | 368 | #ifdef CONFIG_HOTPLUG_CPU |
| 368 | /* | 369 | /* |
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index f060716b02ae..74bde81601a9 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h | |||
| @@ -444,6 +444,7 @@ enum { | |||
| 444 | 444 | ||
| 445 | TRACE_CONTROL_BIT, | 445 | TRACE_CONTROL_BIT, |
| 446 | 446 | ||
| 447 | TRACE_BRANCH_BIT, | ||
| 447 | /* | 448 | /* |
| 448 | * Abuse of the trace_recursion. | 449 | * Abuse of the trace_recursion. |
| 449 | * As we need a way to maintain state if we are tracing the function | 450 | * As we need a way to maintain state if we are tracing the function |
diff --git a/kernel/trace/trace_branch.c b/kernel/trace/trace_branch.c index a87b43f49eb4..e2e12ad3186f 100644 --- a/kernel/trace/trace_branch.c +++ b/kernel/trace/trace_branch.c | |||
| @@ -36,9 +36,12 @@ probe_likely_condition(struct ftrace_branch_data *f, int val, int expect) | |||
| 36 | struct trace_branch *entry; | 36 | struct trace_branch *entry; |
| 37 | struct ring_buffer *buffer; | 37 | struct ring_buffer *buffer; |
| 38 | unsigned long flags; | 38 | unsigned long flags; |
| 39 | int cpu, pc; | 39 | int pc; |
| 40 | const char *p; | 40 | const char *p; |
| 41 | 41 | ||
| 42 | if (current->trace_recursion & TRACE_BRANCH_BIT) | ||
| 43 | return; | ||
| 44 | |||
| 42 | /* | 45 | /* |
| 43 | * I would love to save just the ftrace_likely_data pointer, but | 46 | * I would love to save just the ftrace_likely_data pointer, but |
| 44 | * this code can also be used by modules. Ugly things can happen | 47 | * this code can also be used by modules. Ugly things can happen |
| @@ -49,10 +52,10 @@ probe_likely_condition(struct ftrace_branch_data *f, int val, int expect) | |||
| 49 | if (unlikely(!tr)) | 52 | if (unlikely(!tr)) |
| 50 | return; | 53 | return; |
| 51 | 54 | ||
| 52 | local_irq_save(flags); | 55 | raw_local_irq_save(flags); |
| 53 | cpu = raw_smp_processor_id(); | 56 | current->trace_recursion |= TRACE_BRANCH_BIT; |
| 54 | data = per_cpu_ptr(tr->trace_buffer.data, cpu); | 57 | data = this_cpu_ptr(tr->trace_buffer.data); |
| 55 | if (atomic_inc_return(&data->disabled) != 1) | 58 | if (atomic_read(&data->disabled)) |
| 56 | goto out; | 59 | goto out; |
| 57 | 60 | ||
| 58 | pc = preempt_count(); | 61 | pc = preempt_count(); |
| @@ -81,8 +84,8 @@ probe_likely_condition(struct ftrace_branch_data *f, int val, int expect) | |||
| 81 | __buffer_unlock_commit(buffer, event); | 84 | __buffer_unlock_commit(buffer, event); |
| 82 | 85 | ||
| 83 | out: | 86 | out: |
| 84 | atomic_dec(&data->disabled); | 87 | current->trace_recursion &= ~TRACE_BRANCH_BIT; |
| 85 | local_irq_restore(flags); | 88 | raw_local_irq_restore(flags); |
| 86 | } | 89 | } |
| 87 | 90 | ||
| 88 | static inline | 91 | static inline |
diff --git a/lib/decompress.c b/lib/decompress.c index 528ff932d8e4..62696dff5730 100644 --- a/lib/decompress.c +++ b/lib/decompress.c | |||
| @@ -59,8 +59,11 @@ decompress_fn __init decompress_method(const unsigned char *inbuf, long len, | |||
| 59 | { | 59 | { |
| 60 | const struct compress_format *cf; | 60 | const struct compress_format *cf; |
| 61 | 61 | ||
| 62 | if (len < 2) | 62 | if (len < 2) { |
| 63 | if (name) | ||
| 64 | *name = NULL; | ||
| 63 | return NULL; /* Need at least this much... */ | 65 | return NULL; /* Need at least this much... */ |
| 66 | } | ||
| 64 | 67 | ||
| 65 | pr_debug("Compressed data magic: %#.2x %#.2x\n", inbuf[0], inbuf[1]); | 68 | pr_debug("Compressed data magic: %#.2x %#.2x\n", inbuf[0], inbuf[1]); |
| 66 | 69 | ||
diff --git a/lib/dma-debug.c b/lib/dma-debug.c index ae4b65e17e64..dace71fe41f7 100644 --- a/lib/dma-debug.c +++ b/lib/dma-debug.c | |||
| @@ -574,6 +574,9 @@ void debug_dma_assert_idle(struct page *page) | |||
| 574 | unsigned long flags; | 574 | unsigned long flags; |
| 575 | phys_addr_t cln; | 575 | phys_addr_t cln; |
| 576 | 576 | ||
| 577 | if (dma_debug_disabled()) | ||
| 578 | return; | ||
| 579 | |||
| 577 | if (!page) | 580 | if (!page) |
| 578 | return; | 581 | return; |
| 579 | 582 | ||
diff --git a/lib/hexdump.c b/lib/hexdump.c index 7ea09699855d..8d74c20d8595 100644 --- a/lib/hexdump.c +++ b/lib/hexdump.c | |||
| @@ -11,6 +11,7 @@ | |||
| 11 | #include <linux/ctype.h> | 11 | #include <linux/ctype.h> |
| 12 | #include <linux/kernel.h> | 12 | #include <linux/kernel.h> |
| 13 | #include <linux/export.h> | 13 | #include <linux/export.h> |
| 14 | #include <asm/unaligned.h> | ||
| 14 | 15 | ||
| 15 | const char hex_asc[] = "0123456789abcdef"; | 16 | const char hex_asc[] = "0123456789abcdef"; |
| 16 | EXPORT_SYMBOL(hex_asc); | 17 | EXPORT_SYMBOL(hex_asc); |
| @@ -139,7 +140,7 @@ int hex_dump_to_buffer(const void *buf, size_t len, int rowsize, int groupsize, | |||
| 139 | for (j = 0; j < ngroups; j++) { | 140 | for (j = 0; j < ngroups; j++) { |
| 140 | ret = snprintf(linebuf + lx, linebuflen - lx, | 141 | ret = snprintf(linebuf + lx, linebuflen - lx, |
| 141 | "%s%16.16llx", j ? " " : "", | 142 | "%s%16.16llx", j ? " " : "", |
| 142 | (unsigned long long)*(ptr8 + j)); | 143 | get_unaligned(ptr8 + j)); |
| 143 | if (ret >= linebuflen - lx) | 144 | if (ret >= linebuflen - lx) |
| 144 | goto overflow1; | 145 | goto overflow1; |
| 145 | lx += ret; | 146 | lx += ret; |
| @@ -150,7 +151,7 @@ int hex_dump_to_buffer(const void *buf, size_t len, int rowsize, int groupsize, | |||
| 150 | for (j = 0; j < ngroups; j++) { | 151 | for (j = 0; j < ngroups; j++) { |
| 151 | ret = snprintf(linebuf + lx, linebuflen - lx, | 152 | ret = snprintf(linebuf + lx, linebuflen - lx, |
| 152 | "%s%8.8x", j ? " " : "", | 153 | "%s%8.8x", j ? " " : "", |
| 153 | *(ptr4 + j)); | 154 | get_unaligned(ptr4 + j)); |
| 154 | if (ret >= linebuflen - lx) | 155 | if (ret >= linebuflen - lx) |
| 155 | goto overflow1; | 156 | goto overflow1; |
| 156 | lx += ret; | 157 | lx += ret; |
| @@ -161,7 +162,7 @@ int hex_dump_to_buffer(const void *buf, size_t len, int rowsize, int groupsize, | |||
| 161 | for (j = 0; j < ngroups; j++) { | 162 | for (j = 0; j < ngroups; j++) { |
| 162 | ret = snprintf(linebuf + lx, linebuflen - lx, | 163 | ret = snprintf(linebuf + lx, linebuflen - lx, |
| 163 | "%s%4.4x", j ? " " : "", | 164 | "%s%4.4x", j ? " " : "", |
| 164 | *(ptr2 + j)); | 165 | get_unaligned(ptr2 + j)); |
| 165 | if (ret >= linebuflen - lx) | 166 | if (ret >= linebuflen - lx) |
| 166 | goto overflow1; | 167 | goto overflow1; |
| 167 | lx += ret; | 168 | lx += ret; |
diff --git a/lib/kobject.c b/lib/kobject.c index 2e3bd01964a9..3e3a5c3cb330 100644 --- a/lib/kobject.c +++ b/lib/kobject.c | |||
| @@ -337,8 +337,9 @@ error: | |||
| 337 | } | 337 | } |
| 338 | EXPORT_SYMBOL(kobject_init); | 338 | EXPORT_SYMBOL(kobject_init); |
| 339 | 339 | ||
| 340 | static int kobject_add_varg(struct kobject *kobj, struct kobject *parent, | 340 | static __printf(3, 0) int kobject_add_varg(struct kobject *kobj, |
| 341 | const char *fmt, va_list vargs) | 341 | struct kobject *parent, |
| 342 | const char *fmt, va_list vargs) | ||
| 342 | { | 343 | { |
| 343 | int retval; | 344 | int retval; |
| 344 | 345 | ||
diff --git a/lib/rhashtable.c b/lib/rhashtable.c index a60a6d335a91..cc0c69710dcf 100644 --- a/lib/rhashtable.c +++ b/lib/rhashtable.c | |||
| @@ -610,6 +610,8 @@ next: | |||
| 610 | iter->skip = 0; | 610 | iter->skip = 0; |
| 611 | } | 611 | } |
| 612 | 612 | ||
| 613 | iter->p = NULL; | ||
| 614 | |||
| 613 | /* Ensure we see any new tables. */ | 615 | /* Ensure we see any new tables. */ |
| 614 | smp_rmb(); | 616 | smp_rmb(); |
| 615 | 617 | ||
| @@ -620,8 +622,6 @@ next: | |||
| 620 | return ERR_PTR(-EAGAIN); | 622 | return ERR_PTR(-EAGAIN); |
| 621 | } | 623 | } |
| 622 | 624 | ||
| 623 | iter->p = NULL; | ||
| 624 | |||
| 625 | return NULL; | 625 | return NULL; |
| 626 | } | 626 | } |
| 627 | EXPORT_SYMBOL_GPL(rhashtable_walk_next); | 627 | EXPORT_SYMBOL_GPL(rhashtable_walk_next); |
diff --git a/mm/cma_debug.c b/mm/cma_debug.c index 7621ee34daa0..f8e4b60db167 100644 --- a/mm/cma_debug.c +++ b/mm/cma_debug.c | |||
| @@ -39,7 +39,7 @@ static int cma_used_get(void *data, u64 *val) | |||
| 39 | 39 | ||
| 40 | mutex_lock(&cma->lock); | 40 | mutex_lock(&cma->lock); |
| 41 | /* pages counter is smaller than sizeof(int) */ | 41 | /* pages counter is smaller than sizeof(int) */ |
| 42 | used = bitmap_weight(cma->bitmap, (int)cma->count); | 42 | used = bitmap_weight(cma->bitmap, (int)cma_bitmap_maxno(cma)); |
| 43 | mutex_unlock(&cma->lock); | 43 | mutex_unlock(&cma->lock); |
| 44 | *val = (u64)used << cma->order_per_bit; | 44 | *val = (u64)used << cma->order_per_bit; |
| 45 | 45 | ||
| @@ -52,13 +52,14 @@ static int cma_maxchunk_get(void *data, u64 *val) | |||
| 52 | struct cma *cma = data; | 52 | struct cma *cma = data; |
| 53 | unsigned long maxchunk = 0; | 53 | unsigned long maxchunk = 0; |
| 54 | unsigned long start, end = 0; | 54 | unsigned long start, end = 0; |
| 55 | unsigned long bitmap_maxno = cma_bitmap_maxno(cma); | ||
| 55 | 56 | ||
| 56 | mutex_lock(&cma->lock); | 57 | mutex_lock(&cma->lock); |
| 57 | for (;;) { | 58 | for (;;) { |
| 58 | start = find_next_zero_bit(cma->bitmap, cma->count, end); | 59 | start = find_next_zero_bit(cma->bitmap, bitmap_maxno, end); |
| 59 | if (start >= cma->count) | 60 | if (start >= cma->count) |
| 60 | break; | 61 | break; |
| 61 | end = find_next_bit(cma->bitmap, cma->count, start); | 62 | end = find_next_bit(cma->bitmap, bitmap_maxno, start); |
| 62 | maxchunk = max(end - start, maxchunk); | 63 | maxchunk = max(end - start, maxchunk); |
| 63 | } | 64 | } |
| 64 | mutex_unlock(&cma->lock); | 65 | mutex_unlock(&cma->lock); |
| @@ -170,10 +171,10 @@ static void cma_debugfs_add_one(struct cma *cma, int idx) | |||
| 170 | 171 | ||
| 171 | tmp = debugfs_create_dir(name, cma_debugfs_root); | 172 | tmp = debugfs_create_dir(name, cma_debugfs_root); |
| 172 | 173 | ||
| 173 | debugfs_create_file("alloc", S_IWUSR, cma_debugfs_root, cma, | 174 | debugfs_create_file("alloc", S_IWUSR, tmp, cma, |
| 174 | &cma_alloc_fops); | 175 | &cma_alloc_fops); |
| 175 | 176 | ||
| 176 | debugfs_create_file("free", S_IWUSR, cma_debugfs_root, cma, | 177 | debugfs_create_file("free", S_IWUSR, tmp, cma, |
| 177 | &cma_free_fops); | 178 | &cma_free_fops); |
| 178 | 179 | ||
| 179 | debugfs_create_file("base_pfn", S_IRUGO, tmp, | 180 | debugfs_create_file("base_pfn", S_IRUGO, tmp, |
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 506eac8b38af..ef19f22b2b7d 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
| @@ -246,9 +246,7 @@ static inline void reset_deferred_meminit(pg_data_t *pgdat) | |||
| 246 | /* Returns true if the struct page for the pfn is uninitialised */ | 246 | /* Returns true if the struct page for the pfn is uninitialised */ |
| 247 | static inline bool __meminit early_page_uninitialised(unsigned long pfn) | 247 | static inline bool __meminit early_page_uninitialised(unsigned long pfn) |
| 248 | { | 248 | { |
| 249 | int nid = early_pfn_to_nid(pfn); | 249 | if (pfn >= NODE_DATA(early_pfn_to_nid(pfn))->first_deferred_pfn) |
| 250 | |||
| 251 | if (pfn >= NODE_DATA(nid)->first_deferred_pfn) | ||
| 252 | return true; | 250 | return true; |
| 253 | 251 | ||
| 254 | return false; | 252 | return false; |
| @@ -1950,6 +1948,7 @@ void free_hot_cold_page_list(struct list_head *list, bool cold) | |||
| 1950 | void split_page(struct page *page, unsigned int order) | 1948 | void split_page(struct page *page, unsigned int order) |
| 1951 | { | 1949 | { |
| 1952 | int i; | 1950 | int i; |
| 1951 | gfp_t gfp_mask; | ||
| 1953 | 1952 | ||
| 1954 | VM_BUG_ON_PAGE(PageCompound(page), page); | 1953 | VM_BUG_ON_PAGE(PageCompound(page), page); |
| 1955 | VM_BUG_ON_PAGE(!page_count(page), page); | 1954 | VM_BUG_ON_PAGE(!page_count(page), page); |
| @@ -1963,10 +1962,11 @@ void split_page(struct page *page, unsigned int order) | |||
| 1963 | split_page(virt_to_page(page[0].shadow), order); | 1962 | split_page(virt_to_page(page[0].shadow), order); |
| 1964 | #endif | 1963 | #endif |
| 1965 | 1964 | ||
| 1966 | set_page_owner(page, 0, 0); | 1965 | gfp_mask = get_page_owner_gfp(page); |
| 1966 | set_page_owner(page, 0, gfp_mask); | ||
| 1967 | for (i = 1; i < (1 << order); i++) { | 1967 | for (i = 1; i < (1 << order); i++) { |
| 1968 | set_page_refcounted(page + i); | 1968 | set_page_refcounted(page + i); |
| 1969 | set_page_owner(page + i, 0, 0); | 1969 | set_page_owner(page + i, 0, gfp_mask); |
| 1970 | } | 1970 | } |
| 1971 | } | 1971 | } |
| 1972 | EXPORT_SYMBOL_GPL(split_page); | 1972 | EXPORT_SYMBOL_GPL(split_page); |
| @@ -1996,6 +1996,8 @@ int __isolate_free_page(struct page *page, unsigned int order) | |||
| 1996 | zone->free_area[order].nr_free--; | 1996 | zone->free_area[order].nr_free--; |
| 1997 | rmv_page_order(page); | 1997 | rmv_page_order(page); |
| 1998 | 1998 | ||
| 1999 | set_page_owner(page, order, __GFP_MOVABLE); | ||
| 2000 | |||
| 1999 | /* Set the pageblock if the isolated page is at least a pageblock */ | 2001 | /* Set the pageblock if the isolated page is at least a pageblock */ |
| 2000 | if (order >= pageblock_order - 1) { | 2002 | if (order >= pageblock_order - 1) { |
| 2001 | struct page *endpage = page + (1 << order) - 1; | 2003 | struct page *endpage = page + (1 << order) - 1; |
| @@ -2007,7 +2009,7 @@ int __isolate_free_page(struct page *page, unsigned int order) | |||
| 2007 | } | 2009 | } |
| 2008 | } | 2010 | } |
| 2009 | 2011 | ||
| 2010 | set_page_owner(page, order, 0); | 2012 | |
| 2011 | return 1UL << order; | 2013 | return 1UL << order; |
| 2012 | } | 2014 | } |
| 2013 | 2015 | ||
diff --git a/mm/page_owner.c b/mm/page_owner.c index bd5f842b56d2..983c3a10fa07 100644 --- a/mm/page_owner.c +++ b/mm/page_owner.c | |||
| @@ -76,6 +76,13 @@ void __set_page_owner(struct page *page, unsigned int order, gfp_t gfp_mask) | |||
| 76 | __set_bit(PAGE_EXT_OWNER, &page_ext->flags); | 76 | __set_bit(PAGE_EXT_OWNER, &page_ext->flags); |
| 77 | } | 77 | } |
| 78 | 78 | ||
| 79 | gfp_t __get_page_owner_gfp(struct page *page) | ||
| 80 | { | ||
| 81 | struct page_ext *page_ext = lookup_page_ext(page); | ||
| 82 | |||
| 83 | return page_ext->gfp_mask; | ||
| 84 | } | ||
| 85 | |||
| 79 | static ssize_t | 86 | static ssize_t |
| 80 | print_page_owner(char __user *buf, size_t count, unsigned long pfn, | 87 | print_page_owner(char __user *buf, size_t count, unsigned long pfn, |
| 81 | struct page *page, struct page_ext *page_ext) | 88 | struct page *page, struct page_ext *page_ext) |
diff --git a/net/bridge/br_forward.c b/net/bridge/br_forward.c index e97572b5d2cc..0ff6e1bbca91 100644 --- a/net/bridge/br_forward.c +++ b/net/bridge/br_forward.c | |||
| @@ -42,6 +42,7 @@ int br_dev_queue_push_xmit(struct sock *sk, struct sk_buff *skb) | |||
| 42 | } else { | 42 | } else { |
| 43 | skb_push(skb, ETH_HLEN); | 43 | skb_push(skb, ETH_HLEN); |
| 44 | br_drop_fake_rtable(skb); | 44 | br_drop_fake_rtable(skb); |
| 45 | skb_sender_cpu_clear(skb); | ||
| 45 | dev_queue_xmit(skb); | 46 | dev_queue_xmit(skb); |
| 46 | } | 47 | } |
| 47 | 48 | ||
diff --git a/net/bridge/br_mdb.c b/net/bridge/br_mdb.c index e29ad70b3000..c11cf2611db0 100644 --- a/net/bridge/br_mdb.c +++ b/net/bridge/br_mdb.c | |||
| @@ -323,6 +323,7 @@ static int br_mdb_add_group(struct net_bridge *br, struct net_bridge_port *port, | |||
| 323 | struct net_bridge_port_group *p; | 323 | struct net_bridge_port_group *p; |
| 324 | struct net_bridge_port_group __rcu **pp; | 324 | struct net_bridge_port_group __rcu **pp; |
| 325 | struct net_bridge_mdb_htable *mdb; | 325 | struct net_bridge_mdb_htable *mdb; |
| 326 | unsigned long now = jiffies; | ||
| 326 | int err; | 327 | int err; |
| 327 | 328 | ||
| 328 | mdb = mlock_dereference(br->mdb, br); | 329 | mdb = mlock_dereference(br->mdb, br); |
| @@ -347,6 +348,8 @@ static int br_mdb_add_group(struct net_bridge *br, struct net_bridge_port *port, | |||
| 347 | if (unlikely(!p)) | 348 | if (unlikely(!p)) |
| 348 | return -ENOMEM; | 349 | return -ENOMEM; |
| 349 | rcu_assign_pointer(*pp, p); | 350 | rcu_assign_pointer(*pp, p); |
| 351 | if (state == MDB_TEMPORARY) | ||
| 352 | mod_timer(&p->timer, now + br->multicast_membership_interval); | ||
| 350 | 353 | ||
| 351 | br_mdb_notify(br->dev, port, group, RTM_NEWMDB); | 354 | br_mdb_notify(br->dev, port, group, RTM_NEWMDB); |
| 352 | return 0; | 355 | return 0; |
| @@ -371,6 +374,7 @@ static int __br_mdb_add(struct net *net, struct net_bridge *br, | |||
| 371 | if (!p || p->br != br || p->state == BR_STATE_DISABLED) | 374 | if (!p || p->br != br || p->state == BR_STATE_DISABLED) |
| 372 | return -EINVAL; | 375 | return -EINVAL; |
| 373 | 376 | ||
| 377 | memset(&ip, 0, sizeof(ip)); | ||
| 374 | ip.proto = entry->addr.proto; | 378 | ip.proto = entry->addr.proto; |
| 375 | if (ip.proto == htons(ETH_P_IP)) | 379 | if (ip.proto == htons(ETH_P_IP)) |
| 376 | ip.u.ip4 = entry->addr.u.ip4; | 380 | ip.u.ip4 = entry->addr.u.ip4; |
| @@ -417,20 +421,14 @@ static int __br_mdb_del(struct net_bridge *br, struct br_mdb_entry *entry) | |||
| 417 | if (!netif_running(br->dev) || br->multicast_disabled) | 421 | if (!netif_running(br->dev) || br->multicast_disabled) |
| 418 | return -EINVAL; | 422 | return -EINVAL; |
| 419 | 423 | ||
| 424 | memset(&ip, 0, sizeof(ip)); | ||
| 420 | ip.proto = entry->addr.proto; | 425 | ip.proto = entry->addr.proto; |
| 421 | if (ip.proto == htons(ETH_P_IP)) { | 426 | if (ip.proto == htons(ETH_P_IP)) |
| 422 | if (timer_pending(&br->ip4_other_query.timer)) | ||
| 423 | return -EBUSY; | ||
| 424 | |||
| 425 | ip.u.ip4 = entry->addr.u.ip4; | 427 | ip.u.ip4 = entry->addr.u.ip4; |
| 426 | #if IS_ENABLED(CONFIG_IPV6) | 428 | #if IS_ENABLED(CONFIG_IPV6) |
| 427 | } else { | 429 | else |
| 428 | if (timer_pending(&br->ip6_other_query.timer)) | ||
| 429 | return -EBUSY; | ||
| 430 | |||
| 431 | ip.u.ip6 = entry->addr.u.ip6; | 430 | ip.u.ip6 = entry->addr.u.ip6; |
| 432 | #endif | 431 | #endif |
| 433 | } | ||
| 434 | 432 | ||
| 435 | spin_lock_bh(&br->multicast_lock); | 433 | spin_lock_bh(&br->multicast_lock); |
| 436 | mdb = mlock_dereference(br->mdb, br); | 434 | mdb = mlock_dereference(br->mdb, br); |
diff --git a/net/bridge/br_netfilter_hooks.c b/net/bridge/br_netfilter_hooks.c index d89f4fac0bc5..c8b9bcfe997e 100644 --- a/net/bridge/br_netfilter_hooks.c +++ b/net/bridge/br_netfilter_hooks.c | |||
| @@ -111,7 +111,7 @@ static inline __be16 pppoe_proto(const struct sk_buff *skb) | |||
| 111 | /* largest possible L2 header, see br_nf_dev_queue_xmit() */ | 111 | /* largest possible L2 header, see br_nf_dev_queue_xmit() */ |
| 112 | #define NF_BRIDGE_MAX_MAC_HEADER_LENGTH (PPPOE_SES_HLEN + ETH_HLEN) | 112 | #define NF_BRIDGE_MAX_MAC_HEADER_LENGTH (PPPOE_SES_HLEN + ETH_HLEN) |
| 113 | 113 | ||
| 114 | #if IS_ENABLED(CONFIG_NF_DEFRAG_IPV4) | 114 | #if IS_ENABLED(CONFIG_NF_DEFRAG_IPV4) || IS_ENABLED(CONFIG_NF_DEFRAG_IPV6) |
| 115 | struct brnf_frag_data { | 115 | struct brnf_frag_data { |
| 116 | char mac[NF_BRIDGE_MAX_MAC_HEADER_LENGTH]; | 116 | char mac[NF_BRIDGE_MAX_MAC_HEADER_LENGTH]; |
| 117 | u8 encap_size; | 117 | u8 encap_size; |
| @@ -694,6 +694,7 @@ static int br_nf_push_frag_xmit(struct sock *sk, struct sk_buff *skb) | |||
| 694 | } | 694 | } |
| 695 | #endif | 695 | #endif |
| 696 | 696 | ||
| 697 | #if IS_ENABLED(CONFIG_NF_DEFRAG_IPV4) | ||
| 697 | static int br_nf_ip_fragment(struct sock *sk, struct sk_buff *skb, | 698 | static int br_nf_ip_fragment(struct sock *sk, struct sk_buff *skb, |
| 698 | int (*output)(struct sock *, struct sk_buff *)) | 699 | int (*output)(struct sock *, struct sk_buff *)) |
| 699 | { | 700 | { |
| @@ -712,6 +713,7 @@ static int br_nf_ip_fragment(struct sock *sk, struct sk_buff *skb, | |||
| 712 | 713 | ||
| 713 | return ip_do_fragment(sk, skb, output); | 714 | return ip_do_fragment(sk, skb, output); |
| 714 | } | 715 | } |
| 716 | #endif | ||
| 715 | 717 | ||
| 716 | static unsigned int nf_bridge_mtu_reduction(const struct sk_buff *skb) | 718 | static unsigned int nf_bridge_mtu_reduction(const struct sk_buff *skb) |
| 717 | { | 719 | { |
| @@ -742,7 +744,7 @@ static int br_nf_dev_queue_xmit(struct sock *sk, struct sk_buff *skb) | |||
| 742 | struct brnf_frag_data *data; | 744 | struct brnf_frag_data *data; |
| 743 | 745 | ||
| 744 | if (br_validate_ipv4(skb)) | 746 | if (br_validate_ipv4(skb)) |
| 745 | return NF_DROP; | 747 | goto drop; |
| 746 | 748 | ||
| 747 | IPCB(skb)->frag_max_size = nf_bridge->frag_max_size; | 749 | IPCB(skb)->frag_max_size = nf_bridge->frag_max_size; |
| 748 | 750 | ||
| @@ -767,7 +769,7 @@ static int br_nf_dev_queue_xmit(struct sock *sk, struct sk_buff *skb) | |||
| 767 | struct brnf_frag_data *data; | 769 | struct brnf_frag_data *data; |
| 768 | 770 | ||
| 769 | if (br_validate_ipv6(skb)) | 771 | if (br_validate_ipv6(skb)) |
| 770 | return NF_DROP; | 772 | goto drop; |
| 771 | 773 | ||
| 772 | IP6CB(skb)->frag_max_size = nf_bridge->frag_max_size; | 774 | IP6CB(skb)->frag_max_size = nf_bridge->frag_max_size; |
| 773 | 775 | ||
| @@ -782,12 +784,16 @@ static int br_nf_dev_queue_xmit(struct sock *sk, struct sk_buff *skb) | |||
| 782 | 784 | ||
| 783 | if (v6ops) | 785 | if (v6ops) |
| 784 | return v6ops->fragment(sk, skb, br_nf_push_frag_xmit); | 786 | return v6ops->fragment(sk, skb, br_nf_push_frag_xmit); |
| 785 | else | 787 | |
| 786 | return -EMSGSIZE; | 788 | kfree_skb(skb); |
| 789 | return -EMSGSIZE; | ||
| 787 | } | 790 | } |
| 788 | #endif | 791 | #endif |
| 789 | nf_bridge_info_free(skb); | 792 | nf_bridge_info_free(skb); |
| 790 | return br_dev_queue_push_xmit(sk, skb); | 793 | return br_dev_queue_push_xmit(sk, skb); |
| 794 | drop: | ||
| 795 | kfree_skb(skb); | ||
| 796 | return 0; | ||
| 791 | } | 797 | } |
| 792 | 798 | ||
| 793 | /* PF_BRIDGE/POST_ROUTING ********************************************/ | 799 | /* PF_BRIDGE/POST_ROUTING ********************************************/ |
diff --git a/net/bridge/br_netfilter_ipv6.c b/net/bridge/br_netfilter_ipv6.c index 6d12d2675c80..13b7d1e3d185 100644 --- a/net/bridge/br_netfilter_ipv6.c +++ b/net/bridge/br_netfilter_ipv6.c | |||
| @@ -104,7 +104,7 @@ int br_validate_ipv6(struct sk_buff *skb) | |||
| 104 | { | 104 | { |
| 105 | const struct ipv6hdr *hdr; | 105 | const struct ipv6hdr *hdr; |
| 106 | struct net_device *dev = skb->dev; | 106 | struct net_device *dev = skb->dev; |
| 107 | struct inet6_dev *idev = in6_dev_get(skb->dev); | 107 | struct inet6_dev *idev = __in6_dev_get(skb->dev); |
| 108 | u32 pkt_len; | 108 | u32 pkt_len; |
| 109 | u8 ip6h_len = sizeof(struct ipv6hdr); | 109 | u8 ip6h_len = sizeof(struct ipv6hdr); |
| 110 | 110 | ||
diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c index 6b67ed3831de..364bdc98bd9b 100644 --- a/net/bridge/br_netlink.c +++ b/net/bridge/br_netlink.c | |||
| @@ -457,6 +457,8 @@ static int br_afspec(struct net_bridge *br, | |||
| 457 | if (nla_len(attr) != sizeof(struct bridge_vlan_info)) | 457 | if (nla_len(attr) != sizeof(struct bridge_vlan_info)) |
| 458 | return -EINVAL; | 458 | return -EINVAL; |
| 459 | vinfo = nla_data(attr); | 459 | vinfo = nla_data(attr); |
| 460 | if (!vinfo->vid || vinfo->vid >= VLAN_VID_MASK) | ||
| 461 | return -EINVAL; | ||
| 460 | if (vinfo->flags & BRIDGE_VLAN_INFO_RANGE_BEGIN) { | 462 | if (vinfo->flags & BRIDGE_VLAN_INFO_RANGE_BEGIN) { |
| 461 | if (vinfo_start) | 463 | if (vinfo_start) |
| 462 | return -EINVAL; | 464 | return -EINVAL; |
diff --git a/net/can/af_can.c b/net/can/af_can.c index 7933e62a7318..166d436196c1 100644 --- a/net/can/af_can.c +++ b/net/can/af_can.c | |||
| @@ -89,6 +89,8 @@ struct timer_list can_stattimer; /* timer for statistics update */ | |||
| 89 | struct s_stats can_stats; /* packet statistics */ | 89 | struct s_stats can_stats; /* packet statistics */ |
| 90 | struct s_pstats can_pstats; /* receive list statistics */ | 90 | struct s_pstats can_pstats; /* receive list statistics */ |
| 91 | 91 | ||
| 92 | static atomic_t skbcounter = ATOMIC_INIT(0); | ||
| 93 | |||
| 92 | /* | 94 | /* |
| 93 | * af_can socket functions | 95 | * af_can socket functions |
| 94 | */ | 96 | */ |
| @@ -310,12 +312,8 @@ int can_send(struct sk_buff *skb, int loop) | |||
| 310 | return err; | 312 | return err; |
| 311 | } | 313 | } |
| 312 | 314 | ||
| 313 | if (newskb) { | 315 | if (newskb) |
| 314 | if (!(newskb->tstamp.tv64)) | ||
| 315 | __net_timestamp(newskb); | ||
| 316 | |||
| 317 | netif_rx_ni(newskb); | 316 | netif_rx_ni(newskb); |
| 318 | } | ||
| 319 | 317 | ||
| 320 | /* update statistics */ | 318 | /* update statistics */ |
| 321 | can_stats.tx_frames++; | 319 | can_stats.tx_frames++; |
| @@ -683,6 +681,10 @@ static void can_receive(struct sk_buff *skb, struct net_device *dev) | |||
| 683 | can_stats.rx_frames++; | 681 | can_stats.rx_frames++; |
| 684 | can_stats.rx_frames_delta++; | 682 | can_stats.rx_frames_delta++; |
| 685 | 683 | ||
| 684 | /* create non-zero unique skb identifier together with *skb */ | ||
| 685 | while (!(can_skb_prv(skb)->skbcnt)) | ||
| 686 | can_skb_prv(skb)->skbcnt = atomic_inc_return(&skbcounter); | ||
| 687 | |||
| 686 | rcu_read_lock(); | 688 | rcu_read_lock(); |
| 687 | 689 | ||
| 688 | /* deliver the packet to sockets listening on all devices */ | 690 | /* deliver the packet to sockets listening on all devices */ |
diff --git a/net/can/bcm.c b/net/can/bcm.c index b523453585be..a1ba6875c2a2 100644 --- a/net/can/bcm.c +++ b/net/can/bcm.c | |||
| @@ -261,6 +261,7 @@ static void bcm_can_tx(struct bcm_op *op) | |||
| 261 | 261 | ||
| 262 | can_skb_reserve(skb); | 262 | can_skb_reserve(skb); |
| 263 | can_skb_prv(skb)->ifindex = dev->ifindex; | 263 | can_skb_prv(skb)->ifindex = dev->ifindex; |
| 264 | can_skb_prv(skb)->skbcnt = 0; | ||
| 264 | 265 | ||
| 265 | memcpy(skb_put(skb, CFSIZ), cf, CFSIZ); | 266 | memcpy(skb_put(skb, CFSIZ), cf, CFSIZ); |
| 266 | 267 | ||
| @@ -1217,6 +1218,7 @@ static int bcm_tx_send(struct msghdr *msg, int ifindex, struct sock *sk) | |||
| 1217 | } | 1218 | } |
| 1218 | 1219 | ||
| 1219 | can_skb_prv(skb)->ifindex = dev->ifindex; | 1220 | can_skb_prv(skb)->ifindex = dev->ifindex; |
| 1221 | can_skb_prv(skb)->skbcnt = 0; | ||
| 1220 | skb->dev = dev; | 1222 | skb->dev = dev; |
| 1221 | can_skb_set_owner(skb, sk); | 1223 | can_skb_set_owner(skb, sk); |
| 1222 | err = can_send(skb, 1); /* send with loopback */ | 1224 | err = can_send(skb, 1); /* send with loopback */ |
diff --git a/net/can/raw.c b/net/can/raw.c index 31b9748cbb4e..2e67b1423cd3 100644 --- a/net/can/raw.c +++ b/net/can/raw.c | |||
| @@ -75,7 +75,7 @@ MODULE_ALIAS("can-proto-1"); | |||
| 75 | */ | 75 | */ |
| 76 | 76 | ||
| 77 | struct uniqframe { | 77 | struct uniqframe { |
| 78 | ktime_t tstamp; | 78 | int skbcnt; |
| 79 | const struct sk_buff *skb; | 79 | const struct sk_buff *skb; |
| 80 | unsigned int join_rx_count; | 80 | unsigned int join_rx_count; |
| 81 | }; | 81 | }; |
| @@ -133,7 +133,7 @@ static void raw_rcv(struct sk_buff *oskb, void *data) | |||
| 133 | 133 | ||
| 134 | /* eliminate multiple filter matches for the same skb */ | 134 | /* eliminate multiple filter matches for the same skb */ |
| 135 | if (this_cpu_ptr(ro->uniq)->skb == oskb && | 135 | if (this_cpu_ptr(ro->uniq)->skb == oskb && |
| 136 | ktime_equal(this_cpu_ptr(ro->uniq)->tstamp, oskb->tstamp)) { | 136 | this_cpu_ptr(ro->uniq)->skbcnt == can_skb_prv(oskb)->skbcnt) { |
| 137 | if (ro->join_filters) { | 137 | if (ro->join_filters) { |
| 138 | this_cpu_inc(ro->uniq->join_rx_count); | 138 | this_cpu_inc(ro->uniq->join_rx_count); |
| 139 | /* drop frame until all enabled filters matched */ | 139 | /* drop frame until all enabled filters matched */ |
| @@ -144,7 +144,7 @@ static void raw_rcv(struct sk_buff *oskb, void *data) | |||
| 144 | } | 144 | } |
| 145 | } else { | 145 | } else { |
| 146 | this_cpu_ptr(ro->uniq)->skb = oskb; | 146 | this_cpu_ptr(ro->uniq)->skb = oskb; |
| 147 | this_cpu_ptr(ro->uniq)->tstamp = oskb->tstamp; | 147 | this_cpu_ptr(ro->uniq)->skbcnt = can_skb_prv(oskb)->skbcnt; |
| 148 | this_cpu_ptr(ro->uniq)->join_rx_count = 1; | 148 | this_cpu_ptr(ro->uniq)->join_rx_count = 1; |
| 149 | /* drop first frame to check all enabled filters? */ | 149 | /* drop first frame to check all enabled filters? */ |
| 150 | if (ro->join_filters && ro->count > 1) | 150 | if (ro->join_filters && ro->count > 1) |
| @@ -749,6 +749,7 @@ static int raw_sendmsg(struct socket *sock, struct msghdr *msg, size_t size) | |||
| 749 | 749 | ||
| 750 | can_skb_reserve(skb); | 750 | can_skb_reserve(skb); |
| 751 | can_skb_prv(skb)->ifindex = dev->ifindex; | 751 | can_skb_prv(skb)->ifindex = dev->ifindex; |
| 752 | can_skb_prv(skb)->skbcnt = 0; | ||
| 752 | 753 | ||
| 753 | err = memcpy_from_msg(skb_put(skb, size), msg, size); | 754 | err = memcpy_from_msg(skb_put(skb, size), msg, size); |
| 754 | if (err < 0) | 755 | if (err < 0) |
diff --git a/net/core/dev.c b/net/core/dev.c index 6778a9999d52..a8e4dd430285 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -677,10 +677,6 @@ int dev_get_iflink(const struct net_device *dev) | |||
| 677 | if (dev->netdev_ops && dev->netdev_ops->ndo_get_iflink) | 677 | if (dev->netdev_ops && dev->netdev_ops->ndo_get_iflink) |
| 678 | return dev->netdev_ops->ndo_get_iflink(dev); | 678 | return dev->netdev_ops->ndo_get_iflink(dev); |
| 679 | 679 | ||
| 680 | /* If dev->rtnl_link_ops is set, it's a virtual interface. */ | ||
| 681 | if (dev->rtnl_link_ops) | ||
| 682 | return 0; | ||
| 683 | |||
| 684 | return dev->ifindex; | 680 | return dev->ifindex; |
| 685 | } | 681 | } |
| 686 | EXPORT_SYMBOL(dev_get_iflink); | 682 | EXPORT_SYMBOL(dev_get_iflink); |
| @@ -3452,6 +3448,8 @@ static int enqueue_to_backlog(struct sk_buff *skb, int cpu, | |||
| 3452 | local_irq_save(flags); | 3448 | local_irq_save(flags); |
| 3453 | 3449 | ||
| 3454 | rps_lock(sd); | 3450 | rps_lock(sd); |
| 3451 | if (!netif_running(skb->dev)) | ||
| 3452 | goto drop; | ||
| 3455 | qlen = skb_queue_len(&sd->input_pkt_queue); | 3453 | qlen = skb_queue_len(&sd->input_pkt_queue); |
| 3456 | if (qlen <= netdev_max_backlog && !skb_flow_limit(skb, qlen)) { | 3454 | if (qlen <= netdev_max_backlog && !skb_flow_limit(skb, qlen)) { |
| 3457 | if (qlen) { | 3455 | if (qlen) { |
| @@ -3473,6 +3471,7 @@ enqueue: | |||
| 3473 | goto enqueue; | 3471 | goto enqueue; |
| 3474 | } | 3472 | } |
| 3475 | 3473 | ||
| 3474 | drop: | ||
| 3476 | sd->dropped++; | 3475 | sd->dropped++; |
| 3477 | rps_unlock(sd); | 3476 | rps_unlock(sd); |
| 3478 | 3477 | ||
| @@ -3775,8 +3774,6 @@ static int __netif_receive_skb_core(struct sk_buff *skb, bool pfmemalloc) | |||
| 3775 | 3774 | ||
| 3776 | pt_prev = NULL; | 3775 | pt_prev = NULL; |
| 3777 | 3776 | ||
| 3778 | rcu_read_lock(); | ||
| 3779 | |||
| 3780 | another_round: | 3777 | another_round: |
| 3781 | skb->skb_iif = skb->dev->ifindex; | 3778 | skb->skb_iif = skb->dev->ifindex; |
| 3782 | 3779 | ||
| @@ -3786,7 +3783,7 @@ another_round: | |||
| 3786 | skb->protocol == cpu_to_be16(ETH_P_8021AD)) { | 3783 | skb->protocol == cpu_to_be16(ETH_P_8021AD)) { |
| 3787 | skb = skb_vlan_untag(skb); | 3784 | skb = skb_vlan_untag(skb); |
| 3788 | if (unlikely(!skb)) | 3785 | if (unlikely(!skb)) |
| 3789 | goto unlock; | 3786 | goto out; |
| 3790 | } | 3787 | } |
| 3791 | 3788 | ||
| 3792 | #ifdef CONFIG_NET_CLS_ACT | 3789 | #ifdef CONFIG_NET_CLS_ACT |
| @@ -3816,10 +3813,10 @@ skip_taps: | |||
| 3816 | if (static_key_false(&ingress_needed)) { | 3813 | if (static_key_false(&ingress_needed)) { |
| 3817 | skb = handle_ing(skb, &pt_prev, &ret, orig_dev); | 3814 | skb = handle_ing(skb, &pt_prev, &ret, orig_dev); |
| 3818 | if (!skb) | 3815 | if (!skb) |
| 3819 | goto unlock; | 3816 | goto out; |
| 3820 | 3817 | ||
| 3821 | if (nf_ingress(skb, &pt_prev, &ret, orig_dev) < 0) | 3818 | if (nf_ingress(skb, &pt_prev, &ret, orig_dev) < 0) |
| 3822 | goto unlock; | 3819 | goto out; |
| 3823 | } | 3820 | } |
| 3824 | #endif | 3821 | #endif |
| 3825 | #ifdef CONFIG_NET_CLS_ACT | 3822 | #ifdef CONFIG_NET_CLS_ACT |
| @@ -3837,7 +3834,7 @@ ncls: | |||
| 3837 | if (vlan_do_receive(&skb)) | 3834 | if (vlan_do_receive(&skb)) |
| 3838 | goto another_round; | 3835 | goto another_round; |
| 3839 | else if (unlikely(!skb)) | 3836 | else if (unlikely(!skb)) |
| 3840 | goto unlock; | 3837 | goto out; |
| 3841 | } | 3838 | } |
| 3842 | 3839 | ||
| 3843 | rx_handler = rcu_dereference(skb->dev->rx_handler); | 3840 | rx_handler = rcu_dereference(skb->dev->rx_handler); |
| @@ -3849,7 +3846,7 @@ ncls: | |||
| 3849 | switch (rx_handler(&skb)) { | 3846 | switch (rx_handler(&skb)) { |
| 3850 | case RX_HANDLER_CONSUMED: | 3847 | case RX_HANDLER_CONSUMED: |
| 3851 | ret = NET_RX_SUCCESS; | 3848 | ret = NET_RX_SUCCESS; |
| 3852 | goto unlock; | 3849 | goto out; |
| 3853 | case RX_HANDLER_ANOTHER: | 3850 | case RX_HANDLER_ANOTHER: |
| 3854 | goto another_round; | 3851 | goto another_round; |
| 3855 | case RX_HANDLER_EXACT: | 3852 | case RX_HANDLER_EXACT: |
| @@ -3903,8 +3900,7 @@ drop: | |||
| 3903 | ret = NET_RX_DROP; | 3900 | ret = NET_RX_DROP; |
| 3904 | } | 3901 | } |
| 3905 | 3902 | ||
| 3906 | unlock: | 3903 | out: |
| 3907 | rcu_read_unlock(); | ||
| 3908 | return ret; | 3904 | return ret; |
| 3909 | } | 3905 | } |
| 3910 | 3906 | ||
| @@ -3935,29 +3931,30 @@ static int __netif_receive_skb(struct sk_buff *skb) | |||
| 3935 | 3931 | ||
| 3936 | static int netif_receive_skb_internal(struct sk_buff *skb) | 3932 | static int netif_receive_skb_internal(struct sk_buff *skb) |
| 3937 | { | 3933 | { |
| 3934 | int ret; | ||
| 3935 | |||
| 3938 | net_timestamp_check(netdev_tstamp_prequeue, skb); | 3936 | net_timestamp_check(netdev_tstamp_prequeue, skb); |
| 3939 | 3937 | ||
| 3940 | if (skb_defer_rx_timestamp(skb)) | 3938 | if (skb_defer_rx_timestamp(skb)) |
| 3941 | return NET_RX_SUCCESS; | 3939 | return NET_RX_SUCCESS; |
| 3942 | 3940 | ||
| 3941 | rcu_read_lock(); | ||
| 3942 | |||
| 3943 | #ifdef CONFIG_RPS | 3943 | #ifdef CONFIG_RPS |
| 3944 | if (static_key_false(&rps_needed)) { | 3944 | if (static_key_false(&rps_needed)) { |
| 3945 | struct rps_dev_flow voidflow, *rflow = &voidflow; | 3945 | struct rps_dev_flow voidflow, *rflow = &voidflow; |
| 3946 | int cpu, ret; | 3946 | int cpu = get_rps_cpu(skb->dev, skb, &rflow); |
| 3947 | |||
| 3948 | rcu_read_lock(); | ||
| 3949 | |||
| 3950 | cpu = get_rps_cpu(skb->dev, skb, &rflow); | ||
| 3951 | 3947 | ||
| 3952 | if (cpu >= 0) { | 3948 | if (cpu >= 0) { |
| 3953 | ret = enqueue_to_backlog(skb, cpu, &rflow->last_qtail); | 3949 | ret = enqueue_to_backlog(skb, cpu, &rflow->last_qtail); |
| 3954 | rcu_read_unlock(); | 3950 | rcu_read_unlock(); |
| 3955 | return ret; | 3951 | return ret; |
| 3956 | } | 3952 | } |
| 3957 | rcu_read_unlock(); | ||
| 3958 | } | 3953 | } |
| 3959 | #endif | 3954 | #endif |
| 3960 | return __netif_receive_skb(skb); | 3955 | ret = __netif_receive_skb(skb); |
| 3956 | rcu_read_unlock(); | ||
| 3957 | return ret; | ||
| 3961 | } | 3958 | } |
| 3962 | 3959 | ||
| 3963 | /** | 3960 | /** |
| @@ -4502,8 +4499,10 @@ static int process_backlog(struct napi_struct *napi, int quota) | |||
| 4502 | struct sk_buff *skb; | 4499 | struct sk_buff *skb; |
| 4503 | 4500 | ||
| 4504 | while ((skb = __skb_dequeue(&sd->process_queue))) { | 4501 | while ((skb = __skb_dequeue(&sd->process_queue))) { |
| 4502 | rcu_read_lock(); | ||
| 4505 | local_irq_enable(); | 4503 | local_irq_enable(); |
| 4506 | __netif_receive_skb(skb); | 4504 | __netif_receive_skb(skb); |
| 4505 | rcu_read_unlock(); | ||
| 4507 | local_irq_disable(); | 4506 | local_irq_disable(); |
| 4508 | input_queue_head_incr(sd); | 4507 | input_queue_head_incr(sd); |
| 4509 | if (++work >= quota) { | 4508 | if (++work >= quota) { |
| @@ -6139,6 +6138,7 @@ static void rollback_registered_many(struct list_head *head) | |||
| 6139 | unlist_netdevice(dev); | 6138 | unlist_netdevice(dev); |
| 6140 | 6139 | ||
| 6141 | dev->reg_state = NETREG_UNREGISTERING; | 6140 | dev->reg_state = NETREG_UNREGISTERING; |
| 6141 | on_each_cpu(flush_backlog, dev, 1); | ||
| 6142 | } | 6142 | } |
| 6143 | 6143 | ||
| 6144 | synchronize_net(); | 6144 | synchronize_net(); |
| @@ -6409,7 +6409,8 @@ static int netif_alloc_netdev_queues(struct net_device *dev) | |||
| 6409 | struct netdev_queue *tx; | 6409 | struct netdev_queue *tx; |
| 6410 | size_t sz = count * sizeof(*tx); | 6410 | size_t sz = count * sizeof(*tx); |
| 6411 | 6411 | ||
| 6412 | BUG_ON(count < 1 || count > 0xffff); | 6412 | if (count < 1 || count > 0xffff) |
| 6413 | return -EINVAL; | ||
| 6413 | 6414 | ||
| 6414 | tx = kzalloc(sz, GFP_KERNEL | __GFP_NOWARN | __GFP_REPEAT); | 6415 | tx = kzalloc(sz, GFP_KERNEL | __GFP_NOWARN | __GFP_REPEAT); |
| 6415 | if (!tx) { | 6416 | if (!tx) { |
| @@ -6773,8 +6774,6 @@ void netdev_run_todo(void) | |||
| 6773 | 6774 | ||
| 6774 | dev->reg_state = NETREG_UNREGISTERED; | 6775 | dev->reg_state = NETREG_UNREGISTERED; |
| 6775 | 6776 | ||
| 6776 | on_each_cpu(flush_backlog, dev, 1); | ||
| 6777 | |||
| 6778 | netdev_wait_allrefs(dev); | 6777 | netdev_wait_allrefs(dev); |
| 6779 | 6778 | ||
| 6780 | /* paranoia */ | 6779 | /* paranoia */ |
diff --git a/net/core/gen_estimator.c b/net/core/gen_estimator.c index 9dfb88a933e7..92d886f4adcb 100644 --- a/net/core/gen_estimator.c +++ b/net/core/gen_estimator.c | |||
| @@ -66,7 +66,7 @@ | |||
| 66 | 66 | ||
| 67 | NOTES. | 67 | NOTES. |
| 68 | 68 | ||
| 69 | * avbps is scaled by 2^5, avpps is scaled by 2^10. | 69 | * avbps and avpps are scaled by 2^5. |
| 70 | * both values are reported as 32 bit unsigned values. bps can | 70 | * both values are reported as 32 bit unsigned values. bps can |
| 71 | overflow for fast links : max speed being 34360Mbit/sec | 71 | overflow for fast links : max speed being 34360Mbit/sec |
| 72 | * Minimal interval is HZ/4=250msec (it is the greatest common divisor | 72 | * Minimal interval is HZ/4=250msec (it is the greatest common divisor |
| @@ -85,10 +85,10 @@ struct gen_estimator | |||
| 85 | struct gnet_stats_rate_est64 *rate_est; | 85 | struct gnet_stats_rate_est64 *rate_est; |
| 86 | spinlock_t *stats_lock; | 86 | spinlock_t *stats_lock; |
| 87 | int ewma_log; | 87 | int ewma_log; |
| 88 | u32 last_packets; | ||
| 89 | unsigned long avpps; | ||
| 88 | u64 last_bytes; | 90 | u64 last_bytes; |
| 89 | u64 avbps; | 91 | u64 avbps; |
| 90 | u32 last_packets; | ||
| 91 | u32 avpps; | ||
| 92 | struct rcu_head e_rcu; | 92 | struct rcu_head e_rcu; |
| 93 | struct rb_node node; | 93 | struct rb_node node; |
| 94 | struct gnet_stats_basic_cpu __percpu *cpu_bstats; | 94 | struct gnet_stats_basic_cpu __percpu *cpu_bstats; |
| @@ -118,8 +118,8 @@ static void est_timer(unsigned long arg) | |||
| 118 | rcu_read_lock(); | 118 | rcu_read_lock(); |
| 119 | list_for_each_entry_rcu(e, &elist[idx].list, list) { | 119 | list_for_each_entry_rcu(e, &elist[idx].list, list) { |
| 120 | struct gnet_stats_basic_packed b = {0}; | 120 | struct gnet_stats_basic_packed b = {0}; |
| 121 | unsigned long rate; | ||
| 121 | u64 brate; | 122 | u64 brate; |
| 122 | u32 rate; | ||
| 123 | 123 | ||
| 124 | spin_lock(e->stats_lock); | 124 | spin_lock(e->stats_lock); |
| 125 | read_lock(&est_lock); | 125 | read_lock(&est_lock); |
| @@ -133,10 +133,11 @@ static void est_timer(unsigned long arg) | |||
| 133 | e->avbps += (brate >> e->ewma_log) - (e->avbps >> e->ewma_log); | 133 | e->avbps += (brate >> e->ewma_log) - (e->avbps >> e->ewma_log); |
| 134 | e->rate_est->bps = (e->avbps+0xF)>>5; | 134 | e->rate_est->bps = (e->avbps+0xF)>>5; |
| 135 | 135 | ||
| 136 | rate = (b.packets - e->last_packets)<<(12 - idx); | 136 | rate = b.packets - e->last_packets; |
| 137 | rate <<= (7 - idx); | ||
| 137 | e->last_packets = b.packets; | 138 | e->last_packets = b.packets; |
| 138 | e->avpps += (rate >> e->ewma_log) - (e->avpps >> e->ewma_log); | 139 | e->avpps += (rate >> e->ewma_log) - (e->avpps >> e->ewma_log); |
| 139 | e->rate_est->pps = (e->avpps+0x1FF)>>10; | 140 | e->rate_est->pps = (e->avpps + 0xF) >> 5; |
| 140 | skip: | 141 | skip: |
| 141 | read_unlock(&est_lock); | 142 | read_unlock(&est_lock); |
| 142 | spin_unlock(e->stats_lock); | 143 | spin_unlock(e->stats_lock); |
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 05badbb58865..1ebdf1c0d118 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c | |||
| @@ -3571,13 +3571,6 @@ static int pktgen_thread_worker(void *arg) | |||
| 3571 | pr_debug("%s removing thread\n", t->tsk->comm); | 3571 | pr_debug("%s removing thread\n", t->tsk->comm); |
| 3572 | pktgen_rem_thread(t); | 3572 | pktgen_rem_thread(t); |
| 3573 | 3573 | ||
| 3574 | /* Wait for kthread_stop */ | ||
| 3575 | while (!kthread_should_stop()) { | ||
| 3576 | set_current_state(TASK_INTERRUPTIBLE); | ||
| 3577 | schedule(); | ||
| 3578 | } | ||
| 3579 | __set_current_state(TASK_RUNNING); | ||
| 3580 | |||
| 3581 | return 0; | 3574 | return 0; |
| 3582 | } | 3575 | } |
| 3583 | 3576 | ||
| @@ -3769,6 +3762,7 @@ static int __net_init pktgen_create_thread(int cpu, struct pktgen_net *pn) | |||
| 3769 | } | 3762 | } |
| 3770 | 3763 | ||
| 3771 | t->net = pn; | 3764 | t->net = pn; |
| 3765 | get_task_struct(p); | ||
| 3772 | wake_up_process(p); | 3766 | wake_up_process(p); |
| 3773 | wait_for_completion(&t->start_done); | 3767 | wait_for_completion(&t->start_done); |
| 3774 | 3768 | ||
| @@ -3891,6 +3885,7 @@ static void __net_exit pg_net_exit(struct net *net) | |||
| 3891 | t = list_entry(q, struct pktgen_thread, th_list); | 3885 | t = list_entry(q, struct pktgen_thread, th_list); |
| 3892 | list_del(&t->th_list); | 3886 | list_del(&t->th_list); |
| 3893 | kthread_stop(t->tsk); | 3887 | kthread_stop(t->tsk); |
| 3888 | put_task_struct(t->tsk); | ||
| 3894 | kfree(t); | 3889 | kfree(t); |
| 3895 | } | 3890 | } |
| 3896 | 3891 | ||
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 01ced4a889e0..9e433d58d265 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
| @@ -1328,10 +1328,6 @@ static const struct nla_policy ifla_info_policy[IFLA_INFO_MAX+1] = { | |||
| 1328 | [IFLA_INFO_SLAVE_DATA] = { .type = NLA_NESTED }, | 1328 | [IFLA_INFO_SLAVE_DATA] = { .type = NLA_NESTED }, |
| 1329 | }; | 1329 | }; |
| 1330 | 1330 | ||
| 1331 | static const struct nla_policy ifla_vfinfo_policy[IFLA_VF_INFO_MAX+1] = { | ||
| 1332 | [IFLA_VF_INFO] = { .type = NLA_NESTED }, | ||
| 1333 | }; | ||
| 1334 | |||
| 1335 | static const struct nla_policy ifla_vf_policy[IFLA_VF_MAX+1] = { | 1331 | static const struct nla_policy ifla_vf_policy[IFLA_VF_MAX+1] = { |
| 1336 | [IFLA_VF_MAC] = { .len = sizeof(struct ifla_vf_mac) }, | 1332 | [IFLA_VF_MAC] = { .len = sizeof(struct ifla_vf_mac) }, |
| 1337 | [IFLA_VF_VLAN] = { .len = sizeof(struct ifla_vf_vlan) }, | 1333 | [IFLA_VF_VLAN] = { .len = sizeof(struct ifla_vf_vlan) }, |
| @@ -1488,96 +1484,98 @@ static int validate_linkmsg(struct net_device *dev, struct nlattr *tb[]) | |||
| 1488 | return 0; | 1484 | return 0; |
| 1489 | } | 1485 | } |
| 1490 | 1486 | ||
| 1491 | static int do_setvfinfo(struct net_device *dev, struct nlattr *attr) | 1487 | static int do_setvfinfo(struct net_device *dev, struct nlattr **tb) |
| 1492 | { | 1488 | { |
| 1493 | int rem, err = -EINVAL; | ||
| 1494 | struct nlattr *vf; | ||
| 1495 | const struct net_device_ops *ops = dev->netdev_ops; | 1489 | const struct net_device_ops *ops = dev->netdev_ops; |
| 1490 | int err = -EINVAL; | ||
| 1496 | 1491 | ||
| 1497 | nla_for_each_nested(vf, attr, rem) { | 1492 | if (tb[IFLA_VF_MAC]) { |
| 1498 | switch (nla_type(vf)) { | 1493 | struct ifla_vf_mac *ivm = nla_data(tb[IFLA_VF_MAC]); |
| 1499 | case IFLA_VF_MAC: { | ||
| 1500 | struct ifla_vf_mac *ivm; | ||
| 1501 | ivm = nla_data(vf); | ||
| 1502 | err = -EOPNOTSUPP; | ||
| 1503 | if (ops->ndo_set_vf_mac) | ||
| 1504 | err = ops->ndo_set_vf_mac(dev, ivm->vf, | ||
| 1505 | ivm->mac); | ||
| 1506 | break; | ||
| 1507 | } | ||
| 1508 | case IFLA_VF_VLAN: { | ||
| 1509 | struct ifla_vf_vlan *ivv; | ||
| 1510 | ivv = nla_data(vf); | ||
| 1511 | err = -EOPNOTSUPP; | ||
| 1512 | if (ops->ndo_set_vf_vlan) | ||
| 1513 | err = ops->ndo_set_vf_vlan(dev, ivv->vf, | ||
| 1514 | ivv->vlan, | ||
| 1515 | ivv->qos); | ||
| 1516 | break; | ||
| 1517 | } | ||
| 1518 | case IFLA_VF_TX_RATE: { | ||
| 1519 | struct ifla_vf_tx_rate *ivt; | ||
| 1520 | struct ifla_vf_info ivf; | ||
| 1521 | ivt = nla_data(vf); | ||
| 1522 | err = -EOPNOTSUPP; | ||
| 1523 | if (ops->ndo_get_vf_config) | ||
| 1524 | err = ops->ndo_get_vf_config(dev, ivt->vf, | ||
| 1525 | &ivf); | ||
| 1526 | if (err) | ||
| 1527 | break; | ||
| 1528 | err = -EOPNOTSUPP; | ||
| 1529 | if (ops->ndo_set_vf_rate) | ||
| 1530 | err = ops->ndo_set_vf_rate(dev, ivt->vf, | ||
| 1531 | ivf.min_tx_rate, | ||
| 1532 | ivt->rate); | ||
| 1533 | break; | ||
| 1534 | } | ||
| 1535 | case IFLA_VF_RATE: { | ||
| 1536 | struct ifla_vf_rate *ivt; | ||
| 1537 | ivt = nla_data(vf); | ||
| 1538 | err = -EOPNOTSUPP; | ||
| 1539 | if (ops->ndo_set_vf_rate) | ||
| 1540 | err = ops->ndo_set_vf_rate(dev, ivt->vf, | ||
| 1541 | ivt->min_tx_rate, | ||
| 1542 | ivt->max_tx_rate); | ||
| 1543 | break; | ||
| 1544 | } | ||
| 1545 | case IFLA_VF_SPOOFCHK: { | ||
| 1546 | struct ifla_vf_spoofchk *ivs; | ||
| 1547 | ivs = nla_data(vf); | ||
| 1548 | err = -EOPNOTSUPP; | ||
| 1549 | if (ops->ndo_set_vf_spoofchk) | ||
| 1550 | err = ops->ndo_set_vf_spoofchk(dev, ivs->vf, | ||
| 1551 | ivs->setting); | ||
| 1552 | break; | ||
| 1553 | } | ||
| 1554 | case IFLA_VF_LINK_STATE: { | ||
| 1555 | struct ifla_vf_link_state *ivl; | ||
| 1556 | ivl = nla_data(vf); | ||
| 1557 | err = -EOPNOTSUPP; | ||
| 1558 | if (ops->ndo_set_vf_link_state) | ||
| 1559 | err = ops->ndo_set_vf_link_state(dev, ivl->vf, | ||
| 1560 | ivl->link_state); | ||
| 1561 | break; | ||
| 1562 | } | ||
| 1563 | case IFLA_VF_RSS_QUERY_EN: { | ||
| 1564 | struct ifla_vf_rss_query_en *ivrssq_en; | ||
| 1565 | 1494 | ||
| 1566 | ivrssq_en = nla_data(vf); | 1495 | err = -EOPNOTSUPP; |
| 1567 | err = -EOPNOTSUPP; | 1496 | if (ops->ndo_set_vf_mac) |
| 1568 | if (ops->ndo_set_vf_rss_query_en) | 1497 | err = ops->ndo_set_vf_mac(dev, ivm->vf, |
| 1569 | err = ops->ndo_set_vf_rss_query_en(dev, | 1498 | ivm->mac); |
| 1570 | ivrssq_en->vf, | 1499 | if (err < 0) |
| 1571 | ivrssq_en->setting); | 1500 | return err; |
| 1572 | break; | 1501 | } |
| 1573 | } | 1502 | |
| 1574 | default: | 1503 | if (tb[IFLA_VF_VLAN]) { |
| 1575 | err = -EINVAL; | 1504 | struct ifla_vf_vlan *ivv = nla_data(tb[IFLA_VF_VLAN]); |
| 1576 | break; | 1505 | |
| 1577 | } | 1506 | err = -EOPNOTSUPP; |
| 1578 | if (err) | 1507 | if (ops->ndo_set_vf_vlan) |
| 1579 | break; | 1508 | err = ops->ndo_set_vf_vlan(dev, ivv->vf, ivv->vlan, |
| 1509 | ivv->qos); | ||
| 1510 | if (err < 0) | ||
| 1511 | return err; | ||
| 1512 | } | ||
| 1513 | |||
| 1514 | if (tb[IFLA_VF_TX_RATE]) { | ||
| 1515 | struct ifla_vf_tx_rate *ivt = nla_data(tb[IFLA_VF_TX_RATE]); | ||
| 1516 | struct ifla_vf_info ivf; | ||
| 1517 | |||
| 1518 | err = -EOPNOTSUPP; | ||
| 1519 | if (ops->ndo_get_vf_config) | ||
| 1520 | err = ops->ndo_get_vf_config(dev, ivt->vf, &ivf); | ||
| 1521 | if (err < 0) | ||
| 1522 | return err; | ||
| 1523 | |||
| 1524 | err = -EOPNOTSUPP; | ||
| 1525 | if (ops->ndo_set_vf_rate) | ||
| 1526 | err = ops->ndo_set_vf_rate(dev, ivt->vf, | ||
| 1527 | ivf.min_tx_rate, | ||
| 1528 | ivt->rate); | ||
| 1529 | if (err < 0) | ||
| 1530 | return err; | ||
| 1531 | } | ||
| 1532 | |||
| 1533 | if (tb[IFLA_VF_RATE]) { | ||
| 1534 | struct ifla_vf_rate *ivt = nla_data(tb[IFLA_VF_RATE]); | ||
| 1535 | |||
| 1536 | err = -EOPNOTSUPP; | ||
| 1537 | if (ops->ndo_set_vf_rate) | ||
| 1538 | err = ops->ndo_set_vf_rate(dev, ivt->vf, | ||
| 1539 | ivt->min_tx_rate, | ||
| 1540 | ivt->max_tx_rate); | ||
| 1541 | if (err < 0) | ||
| 1542 | return err; | ||
| 1580 | } | 1543 | } |
| 1544 | |||
| 1545 | if (tb[IFLA_VF_SPOOFCHK]) { | ||
| 1546 | struct ifla_vf_spoofchk *ivs = nla_data(tb[IFLA_VF_SPOOFCHK]); | ||
| 1547 | |||
| 1548 | err = -EOPNOTSUPP; | ||
| 1549 | if (ops->ndo_set_vf_spoofchk) | ||
| 1550 | err = ops->ndo_set_vf_spoofchk(dev, ivs->vf, | ||
| 1551 | ivs->setting); | ||
| 1552 | if (err < 0) | ||
| 1553 | return err; | ||
| 1554 | } | ||
| 1555 | |||
| 1556 | if (tb[IFLA_VF_LINK_STATE]) { | ||
| 1557 | struct ifla_vf_link_state *ivl = nla_data(tb[IFLA_VF_LINK_STATE]); | ||
| 1558 | |||
| 1559 | err = -EOPNOTSUPP; | ||
| 1560 | if (ops->ndo_set_vf_link_state) | ||
| 1561 | err = ops->ndo_set_vf_link_state(dev, ivl->vf, | ||
| 1562 | ivl->link_state); | ||
| 1563 | if (err < 0) | ||
| 1564 | return err; | ||
| 1565 | } | ||
| 1566 | |||
| 1567 | if (tb[IFLA_VF_RSS_QUERY_EN]) { | ||
| 1568 | struct ifla_vf_rss_query_en *ivrssq_en; | ||
| 1569 | |||
| 1570 | err = -EOPNOTSUPP; | ||
| 1571 | ivrssq_en = nla_data(tb[IFLA_VF_RSS_QUERY_EN]); | ||
| 1572 | if (ops->ndo_set_vf_rss_query_en) | ||
| 1573 | err = ops->ndo_set_vf_rss_query_en(dev, ivrssq_en->vf, | ||
| 1574 | ivrssq_en->setting); | ||
| 1575 | if (err < 0) | ||
| 1576 | return err; | ||
| 1577 | } | ||
| 1578 | |||
| 1581 | return err; | 1579 | return err; |
| 1582 | } | 1580 | } |
| 1583 | 1581 | ||
| @@ -1773,14 +1771,21 @@ static int do_setlink(const struct sk_buff *skb, | |||
| 1773 | } | 1771 | } |
| 1774 | 1772 | ||
| 1775 | if (tb[IFLA_VFINFO_LIST]) { | 1773 | if (tb[IFLA_VFINFO_LIST]) { |
| 1774 | struct nlattr *vfinfo[IFLA_VF_MAX + 1]; | ||
| 1776 | struct nlattr *attr; | 1775 | struct nlattr *attr; |
| 1777 | int rem; | 1776 | int rem; |
| 1777 | |||
| 1778 | nla_for_each_nested(attr, tb[IFLA_VFINFO_LIST], rem) { | 1778 | nla_for_each_nested(attr, tb[IFLA_VFINFO_LIST], rem) { |
| 1779 | if (nla_type(attr) != IFLA_VF_INFO) { | 1779 | if (nla_type(attr) != IFLA_VF_INFO || |
| 1780 | nla_len(attr) < NLA_HDRLEN) { | ||
| 1780 | err = -EINVAL; | 1781 | err = -EINVAL; |
| 1781 | goto errout; | 1782 | goto errout; |
| 1782 | } | 1783 | } |
| 1783 | err = do_setvfinfo(dev, attr); | 1784 | err = nla_parse_nested(vfinfo, IFLA_VF_MAX, attr, |
| 1785 | ifla_vf_policy); | ||
| 1786 | if (err < 0) | ||
| 1787 | goto errout; | ||
| 1788 | err = do_setvfinfo(dev, vfinfo); | ||
| 1784 | if (err < 0) | 1789 | if (err < 0) |
| 1785 | goto errout; | 1790 | goto errout; |
| 1786 | status |= DO_SETLINK_NOTIFY; | 1791 | status |= DO_SETLINK_NOTIFY; |
diff --git a/net/dsa/dsa.c b/net/dsa/dsa.c index 392e29a0227d..b445d492c115 100644 --- a/net/dsa/dsa.c +++ b/net/dsa/dsa.c | |||
| @@ -630,7 +630,7 @@ static int dsa_of_probe(struct device *dev) | |||
| 630 | continue; | 630 | continue; |
| 631 | 631 | ||
| 632 | cd->sw_addr = be32_to_cpup(sw_addr); | 632 | cd->sw_addr = be32_to_cpup(sw_addr); |
| 633 | if (cd->sw_addr > PHY_MAX_ADDR) | 633 | if (cd->sw_addr >= PHY_MAX_ADDR) |
| 634 | continue; | 634 | continue; |
| 635 | 635 | ||
| 636 | if (!of_property_read_u32(child, "eeprom-length", &eeprom_len)) | 636 | if (!of_property_read_u32(child, "eeprom-length", &eeprom_len)) |
| @@ -642,6 +642,8 @@ static int dsa_of_probe(struct device *dev) | |||
| 642 | continue; | 642 | continue; |
| 643 | 643 | ||
| 644 | port_index = be32_to_cpup(port_reg); | 644 | port_index = be32_to_cpup(port_reg); |
| 645 | if (port_index >= DSA_MAX_PORTS) | ||
| 646 | break; | ||
| 645 | 647 | ||
| 646 | port_name = of_get_property(port, "label", NULL); | 648 | port_name = of_get_property(port, "label", NULL); |
| 647 | if (!port_name) | 649 | if (!port_name) |
| @@ -666,8 +668,6 @@ static int dsa_of_probe(struct device *dev) | |||
| 666 | goto out_free_chip; | 668 | goto out_free_chip; |
| 667 | } | 669 | } |
| 668 | 670 | ||
| 669 | if (port_index == DSA_MAX_PORTS) | ||
| 670 | break; | ||
| 671 | } | 671 | } |
| 672 | } | 672 | } |
| 673 | 673 | ||
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c index 7498716e8f54..e813196c91c7 100644 --- a/net/ipv4/devinet.c +++ b/net/ipv4/devinet.c | |||
| @@ -1740,6 +1740,8 @@ static int inet_netconf_msgsize_devconf(int type) | |||
| 1740 | size += nla_total_size(4); | 1740 | size += nla_total_size(4); |
| 1741 | if (type == -1 || type == NETCONFA_PROXY_NEIGH) | 1741 | if (type == -1 || type == NETCONFA_PROXY_NEIGH) |
| 1742 | size += nla_total_size(4); | 1742 | size += nla_total_size(4); |
| 1743 | if (type == -1 || type == NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN) | ||
| 1744 | size += nla_total_size(4); | ||
| 1743 | 1745 | ||
| 1744 | return size; | 1746 | return size; |
| 1745 | } | 1747 | } |
| @@ -1780,6 +1782,10 @@ static int inet_netconf_fill_devconf(struct sk_buff *skb, int ifindex, | |||
| 1780 | nla_put_s32(skb, NETCONFA_PROXY_NEIGH, | 1782 | nla_put_s32(skb, NETCONFA_PROXY_NEIGH, |
| 1781 | IPV4_DEVCONF(*devconf, PROXY_ARP)) < 0) | 1783 | IPV4_DEVCONF(*devconf, PROXY_ARP)) < 0) |
| 1782 | goto nla_put_failure; | 1784 | goto nla_put_failure; |
| 1785 | if ((type == -1 || type == NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN) && | ||
| 1786 | nla_put_s32(skb, NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN, | ||
| 1787 | IPV4_DEVCONF(*devconf, IGNORE_ROUTES_WITH_LINKDOWN)) < 0) | ||
| 1788 | goto nla_put_failure; | ||
| 1783 | 1789 | ||
| 1784 | nlmsg_end(skb, nlh); | 1790 | nlmsg_end(skb, nlh); |
| 1785 | return 0; | 1791 | return 0; |
| @@ -1819,6 +1825,7 @@ static const struct nla_policy devconf_ipv4_policy[NETCONFA_MAX+1] = { | |||
| 1819 | [NETCONFA_FORWARDING] = { .len = sizeof(int) }, | 1825 | [NETCONFA_FORWARDING] = { .len = sizeof(int) }, |
| 1820 | [NETCONFA_RP_FILTER] = { .len = sizeof(int) }, | 1826 | [NETCONFA_RP_FILTER] = { .len = sizeof(int) }, |
| 1821 | [NETCONFA_PROXY_NEIGH] = { .len = sizeof(int) }, | 1827 | [NETCONFA_PROXY_NEIGH] = { .len = sizeof(int) }, |
| 1828 | [NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN] = { .len = sizeof(int) }, | ||
| 1822 | }; | 1829 | }; |
| 1823 | 1830 | ||
| 1824 | static int inet_netconf_get_devconf(struct sk_buff *in_skb, | 1831 | static int inet_netconf_get_devconf(struct sk_buff *in_skb, |
| @@ -2048,6 +2055,12 @@ static int devinet_conf_proc(struct ctl_table *ctl, int write, | |||
| 2048 | inet_netconf_notify_devconf(net, NETCONFA_PROXY_NEIGH, | 2055 | inet_netconf_notify_devconf(net, NETCONFA_PROXY_NEIGH, |
| 2049 | ifindex, cnf); | 2056 | ifindex, cnf); |
| 2050 | } | 2057 | } |
| 2058 | if (i == IPV4_DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN - 1 && | ||
| 2059 | new_value != old_value) { | ||
| 2060 | ifindex = devinet_conf_ifindex(net, cnf); | ||
| 2061 | inet_netconf_notify_devconf(net, NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN, | ||
| 2062 | ifindex, cnf); | ||
| 2063 | } | ||
| 2051 | } | 2064 | } |
| 2052 | 2065 | ||
| 2053 | return ret; | 2066 | return ret; |
diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c index 9bc26677058e..c3b1f3a0f4cf 100644 --- a/net/ipv4/inet_diag.c +++ b/net/ipv4/inet_diag.c | |||
| @@ -152,8 +152,8 @@ int inet_sk_diag_fill(struct sock *sk, struct inet_connection_sock *icsk, | |||
| 152 | inet6_sk(sk)->tclass) < 0) | 152 | inet6_sk(sk)->tclass) < 0) |
| 153 | goto errout; | 153 | goto errout; |
| 154 | 154 | ||
| 155 | if (ipv6_only_sock(sk) && | 155 | if (((1 << sk->sk_state) & (TCPF_LISTEN | TCPF_CLOSE)) && |
| 156 | nla_put_u8(skb, INET_DIAG_SKV6ONLY, 1)) | 156 | nla_put_u8(skb, INET_DIAG_SKV6ONLY, ipv6_only_sock(sk))) |
| 157 | goto errout; | 157 | goto errout; |
| 158 | } | 158 | } |
| 159 | #endif | 159 | #endif |
diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c index 4c2c3ba4ba65..626d9e56a6bd 100644 --- a/net/ipv4/ip_tunnel.c +++ b/net/ipv4/ip_tunnel.c | |||
| @@ -586,7 +586,8 @@ int ip_tunnel_encap(struct sk_buff *skb, struct ip_tunnel *t, | |||
| 586 | EXPORT_SYMBOL(ip_tunnel_encap); | 586 | EXPORT_SYMBOL(ip_tunnel_encap); |
| 587 | 587 | ||
| 588 | static int tnl_update_pmtu(struct net_device *dev, struct sk_buff *skb, | 588 | static int tnl_update_pmtu(struct net_device *dev, struct sk_buff *skb, |
| 589 | struct rtable *rt, __be16 df) | 589 | struct rtable *rt, __be16 df, |
| 590 | const struct iphdr *inner_iph) | ||
| 590 | { | 591 | { |
| 591 | struct ip_tunnel *tunnel = netdev_priv(dev); | 592 | struct ip_tunnel *tunnel = netdev_priv(dev); |
| 592 | int pkt_size = skb->len - tunnel->hlen - dev->hard_header_len; | 593 | int pkt_size = skb->len - tunnel->hlen - dev->hard_header_len; |
| @@ -603,7 +604,8 @@ static int tnl_update_pmtu(struct net_device *dev, struct sk_buff *skb, | |||
| 603 | 604 | ||
| 604 | if (skb->protocol == htons(ETH_P_IP)) { | 605 | if (skb->protocol == htons(ETH_P_IP)) { |
| 605 | if (!skb_is_gso(skb) && | 606 | if (!skb_is_gso(skb) && |
| 606 | (df & htons(IP_DF)) && mtu < pkt_size) { | 607 | (inner_iph->frag_off & htons(IP_DF)) && |
| 608 | mtu < pkt_size) { | ||
| 607 | memset(IPCB(skb), 0, sizeof(*IPCB(skb))); | 609 | memset(IPCB(skb), 0, sizeof(*IPCB(skb))); |
| 608 | icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu)); | 610 | icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu)); |
| 609 | return -E2BIG; | 611 | return -E2BIG; |
| @@ -737,7 +739,7 @@ void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev, | |||
| 737 | goto tx_error; | 739 | goto tx_error; |
| 738 | } | 740 | } |
| 739 | 741 | ||
| 740 | if (tnl_update_pmtu(dev, skb, rt, tnl_params->frag_off)) { | 742 | if (tnl_update_pmtu(dev, skb, rt, tnl_params->frag_off, inner_iph)) { |
| 741 | ip_rt_put(rt); | 743 | ip_rt_put(rt); |
| 742 | goto tx_error; | 744 | goto tx_error; |
| 743 | } | 745 | } |
diff --git a/net/ipv4/netfilter/arp_tables.c b/net/ipv4/netfilter/arp_tables.c index 95c9b6eece25..92305a1a021a 100644 --- a/net/ipv4/netfilter/arp_tables.c +++ b/net/ipv4/netfilter/arp_tables.c | |||
| @@ -254,9 +254,10 @@ unsigned int arpt_do_table(struct sk_buff *skb, | |||
| 254 | static const char nulldevname[IFNAMSIZ] __attribute__((aligned(sizeof(long)))); | 254 | static const char nulldevname[IFNAMSIZ] __attribute__((aligned(sizeof(long)))); |
| 255 | unsigned int verdict = NF_DROP; | 255 | unsigned int verdict = NF_DROP; |
| 256 | const struct arphdr *arp; | 256 | const struct arphdr *arp; |
| 257 | struct arpt_entry *e, *back; | 257 | struct arpt_entry *e, **jumpstack; |
| 258 | const char *indev, *outdev; | 258 | const char *indev, *outdev; |
| 259 | const void *table_base; | 259 | const void *table_base; |
| 260 | unsigned int cpu, stackidx = 0; | ||
| 260 | const struct xt_table_info *private; | 261 | const struct xt_table_info *private; |
| 261 | struct xt_action_param acpar; | 262 | struct xt_action_param acpar; |
| 262 | unsigned int addend; | 263 | unsigned int addend; |
| @@ -270,15 +271,16 @@ unsigned int arpt_do_table(struct sk_buff *skb, | |||
| 270 | local_bh_disable(); | 271 | local_bh_disable(); |
| 271 | addend = xt_write_recseq_begin(); | 272 | addend = xt_write_recseq_begin(); |
| 272 | private = table->private; | 273 | private = table->private; |
| 274 | cpu = smp_processor_id(); | ||
| 273 | /* | 275 | /* |
| 274 | * Ensure we load private-> members after we've fetched the base | 276 | * Ensure we load private-> members after we've fetched the base |
| 275 | * pointer. | 277 | * pointer. |
| 276 | */ | 278 | */ |
| 277 | smp_read_barrier_depends(); | 279 | smp_read_barrier_depends(); |
| 278 | table_base = private->entries; | 280 | table_base = private->entries; |
| 281 | jumpstack = (struct arpt_entry **)private->jumpstack[cpu]; | ||
| 279 | 282 | ||
| 280 | e = get_entry(table_base, private->hook_entry[hook]); | 283 | e = get_entry(table_base, private->hook_entry[hook]); |
| 281 | back = get_entry(table_base, private->underflow[hook]); | ||
| 282 | 284 | ||
| 283 | acpar.in = state->in; | 285 | acpar.in = state->in; |
| 284 | acpar.out = state->out; | 286 | acpar.out = state->out; |
| @@ -312,18 +314,23 @@ unsigned int arpt_do_table(struct sk_buff *skb, | |||
| 312 | verdict = (unsigned int)(-v) - 1; | 314 | verdict = (unsigned int)(-v) - 1; |
| 313 | break; | 315 | break; |
| 314 | } | 316 | } |
| 315 | e = back; | 317 | if (stackidx == 0) { |
| 316 | back = get_entry(table_base, back->comefrom); | 318 | e = get_entry(table_base, |
| 319 | private->underflow[hook]); | ||
| 320 | } else { | ||
| 321 | e = jumpstack[--stackidx]; | ||
| 322 | e = arpt_next_entry(e); | ||
| 323 | } | ||
| 317 | continue; | 324 | continue; |
| 318 | } | 325 | } |
| 319 | if (table_base + v | 326 | if (table_base + v |
| 320 | != arpt_next_entry(e)) { | 327 | != arpt_next_entry(e)) { |
| 321 | /* Save old back ptr in next entry */ | ||
| 322 | struct arpt_entry *next = arpt_next_entry(e); | ||
| 323 | next->comefrom = (void *)back - table_base; | ||
| 324 | 328 | ||
| 325 | /* set back pointer to next entry */ | 329 | if (stackidx >= private->stacksize) { |
| 326 | back = next; | 330 | verdict = NF_DROP; |
| 331 | break; | ||
| 332 | } | ||
| 333 | jumpstack[stackidx++] = e; | ||
| 327 | } | 334 | } |
| 328 | 335 | ||
| 329 | e = get_entry(table_base, v); | 336 | e = get_entry(table_base, v); |
diff --git a/net/ipv6/ip6_input.c b/net/ipv6/ip6_input.c index f2e464eba5ef..57990c929cd8 100644 --- a/net/ipv6/ip6_input.c +++ b/net/ipv6/ip6_input.c | |||
| @@ -331,10 +331,10 @@ int ip6_mc_input(struct sk_buff *skb) | |||
| 331 | if (offset < 0) | 331 | if (offset < 0) |
| 332 | goto out; | 332 | goto out; |
| 333 | 333 | ||
| 334 | if (!ipv6_is_mld(skb, nexthdr, offset)) | 334 | if (ipv6_is_mld(skb, nexthdr, offset)) |
| 335 | goto out; | 335 | deliver = true; |
| 336 | 336 | ||
| 337 | deliver = true; | 337 | goto out; |
| 338 | } | 338 | } |
| 339 | /* unknown RA - process it normally */ | 339 | /* unknown RA - process it normally */ |
| 340 | } | 340 | } |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 1a1122a6bbf5..6090969937f8 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
| @@ -369,10 +369,7 @@ static void ip6_dst_destroy(struct dst_entry *dst) | |||
| 369 | struct inet6_dev *idev; | 369 | struct inet6_dev *idev; |
| 370 | 370 | ||
| 371 | dst_destroy_metrics_generic(dst); | 371 | dst_destroy_metrics_generic(dst); |
| 372 | 372 | free_percpu(rt->rt6i_pcpu); | |
| 373 | if (rt->rt6i_pcpu) | ||
| 374 | free_percpu(rt->rt6i_pcpu); | ||
| 375 | |||
| 376 | rt6_uncached_list_del(rt); | 373 | rt6_uncached_list_del(rt); |
| 377 | 374 | ||
| 378 | idev = rt->rt6i_idev; | 375 | idev = rt->rt6i_idev; |
diff --git a/net/netfilter/nf_queue.c b/net/netfilter/nf_queue.c index cd60d397fe05..8a8b2abc35ff 100644 --- a/net/netfilter/nf_queue.c +++ b/net/netfilter/nf_queue.c | |||
| @@ -213,7 +213,7 @@ void nf_reinject(struct nf_queue_entry *entry, unsigned int verdict) | |||
| 213 | 213 | ||
| 214 | if (verdict == NF_ACCEPT) { | 214 | if (verdict == NF_ACCEPT) { |
| 215 | next_hook: | 215 | next_hook: |
| 216 | verdict = nf_iterate(&nf_hooks[entry->state.pf][entry->state.hook], | 216 | verdict = nf_iterate(entry->state.hook_list, |
| 217 | skb, &entry->state, &elem); | 217 | skb, &entry->state, &elem); |
| 218 | } | 218 | } |
| 219 | 219 | ||
diff --git a/net/netfilter/nfnetlink.c b/net/netfilter/nfnetlink.c index 8b117c90ecd7..0c0e8ecf02ab 100644 --- a/net/netfilter/nfnetlink.c +++ b/net/netfilter/nfnetlink.c | |||
| @@ -269,6 +269,12 @@ static void nfnl_err_deliver(struct list_head *err_list, struct sk_buff *skb) | |||
| 269 | } | 269 | } |
| 270 | } | 270 | } |
| 271 | 271 | ||
| 272 | enum { | ||
| 273 | NFNL_BATCH_FAILURE = (1 << 0), | ||
| 274 | NFNL_BATCH_DONE = (1 << 1), | ||
| 275 | NFNL_BATCH_REPLAY = (1 << 2), | ||
| 276 | }; | ||
| 277 | |||
| 272 | static void nfnetlink_rcv_batch(struct sk_buff *skb, struct nlmsghdr *nlh, | 278 | static void nfnetlink_rcv_batch(struct sk_buff *skb, struct nlmsghdr *nlh, |
| 273 | u_int16_t subsys_id) | 279 | u_int16_t subsys_id) |
| 274 | { | 280 | { |
| @@ -276,13 +282,15 @@ static void nfnetlink_rcv_batch(struct sk_buff *skb, struct nlmsghdr *nlh, | |||
| 276 | struct net *net = sock_net(skb->sk); | 282 | struct net *net = sock_net(skb->sk); |
| 277 | const struct nfnetlink_subsystem *ss; | 283 | const struct nfnetlink_subsystem *ss; |
| 278 | const struct nfnl_callback *nc; | 284 | const struct nfnl_callback *nc; |
| 279 | bool success = true, done = false; | ||
| 280 | static LIST_HEAD(err_list); | 285 | static LIST_HEAD(err_list); |
| 286 | u32 status; | ||
| 281 | int err; | 287 | int err; |
| 282 | 288 | ||
| 283 | if (subsys_id >= NFNL_SUBSYS_COUNT) | 289 | if (subsys_id >= NFNL_SUBSYS_COUNT) |
| 284 | return netlink_ack(skb, nlh, -EINVAL); | 290 | return netlink_ack(skb, nlh, -EINVAL); |
| 285 | replay: | 291 | replay: |
| 292 | status = 0; | ||
| 293 | |||
| 286 | skb = netlink_skb_clone(oskb, GFP_KERNEL); | 294 | skb = netlink_skb_clone(oskb, GFP_KERNEL); |
| 287 | if (!skb) | 295 | if (!skb) |
| 288 | return netlink_ack(oskb, nlh, -ENOMEM); | 296 | return netlink_ack(oskb, nlh, -ENOMEM); |
| @@ -336,10 +344,10 @@ replay: | |||
| 336 | if (type == NFNL_MSG_BATCH_BEGIN) { | 344 | if (type == NFNL_MSG_BATCH_BEGIN) { |
| 337 | /* Malformed: Batch begin twice */ | 345 | /* Malformed: Batch begin twice */ |
| 338 | nfnl_err_reset(&err_list); | 346 | nfnl_err_reset(&err_list); |
| 339 | success = false; | 347 | status |= NFNL_BATCH_FAILURE; |
| 340 | goto done; | 348 | goto done; |
| 341 | } else if (type == NFNL_MSG_BATCH_END) { | 349 | } else if (type == NFNL_MSG_BATCH_END) { |
| 342 | done = true; | 350 | status |= NFNL_BATCH_DONE; |
| 343 | goto done; | 351 | goto done; |
| 344 | } else if (type < NLMSG_MIN_TYPE) { | 352 | } else if (type < NLMSG_MIN_TYPE) { |
| 345 | err = -EINVAL; | 353 | err = -EINVAL; |
| @@ -382,11 +390,8 @@ replay: | |||
| 382 | * original skb. | 390 | * original skb. |
| 383 | */ | 391 | */ |
| 384 | if (err == -EAGAIN) { | 392 | if (err == -EAGAIN) { |
| 385 | nfnl_err_reset(&err_list); | 393 | status |= NFNL_BATCH_REPLAY; |
| 386 | ss->abort(oskb); | 394 | goto next; |
| 387 | nfnl_unlock(subsys_id); | ||
| 388 | kfree_skb(skb); | ||
| 389 | goto replay; | ||
| 390 | } | 395 | } |
| 391 | } | 396 | } |
| 392 | ack: | 397 | ack: |
| @@ -402,7 +407,7 @@ ack: | |||
| 402 | */ | 407 | */ |
| 403 | nfnl_err_reset(&err_list); | 408 | nfnl_err_reset(&err_list); |
| 404 | netlink_ack(skb, nlmsg_hdr(oskb), -ENOMEM); | 409 | netlink_ack(skb, nlmsg_hdr(oskb), -ENOMEM); |
| 405 | success = false; | 410 | status |= NFNL_BATCH_FAILURE; |
| 406 | goto done; | 411 | goto done; |
| 407 | } | 412 | } |
| 408 | /* We don't stop processing the batch on errors, thus, | 413 | /* We don't stop processing the batch on errors, thus, |
| @@ -410,19 +415,26 @@ ack: | |||
| 410 | * triggers. | 415 | * triggers. |
| 411 | */ | 416 | */ |
| 412 | if (err) | 417 | if (err) |
| 413 | success = false; | 418 | status |= NFNL_BATCH_FAILURE; |
| 414 | } | 419 | } |
| 415 | 420 | next: | |
| 416 | msglen = NLMSG_ALIGN(nlh->nlmsg_len); | 421 | msglen = NLMSG_ALIGN(nlh->nlmsg_len); |
| 417 | if (msglen > skb->len) | 422 | if (msglen > skb->len) |
| 418 | msglen = skb->len; | 423 | msglen = skb->len; |
| 419 | skb_pull(skb, msglen); | 424 | skb_pull(skb, msglen); |
| 420 | } | 425 | } |
| 421 | done: | 426 | done: |
| 422 | if (success && done) | 427 | if (status & NFNL_BATCH_REPLAY) { |
| 428 | ss->abort(oskb); | ||
| 429 | nfnl_err_reset(&err_list); | ||
| 430 | nfnl_unlock(subsys_id); | ||
| 431 | kfree_skb(skb); | ||
| 432 | goto replay; | ||
| 433 | } else if (status == NFNL_BATCH_DONE) { | ||
| 423 | ss->commit(oskb); | 434 | ss->commit(oskb); |
| 424 | else | 435 | } else { |
| 425 | ss->abort(oskb); | 436 | ss->abort(oskb); |
| 437 | } | ||
| 426 | 438 | ||
| 427 | nfnl_err_deliver(&err_list, oskb); | 439 | nfnl_err_deliver(&err_list, oskb); |
| 428 | nfnl_unlock(subsys_id); | 440 | nfnl_unlock(subsys_id); |
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index dea925388a5b..9a0ae7172f92 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c | |||
| @@ -158,7 +158,7 @@ static int __netlink_remove_tap(struct netlink_tap *nt) | |||
| 158 | out: | 158 | out: |
| 159 | spin_unlock(&netlink_tap_lock); | 159 | spin_unlock(&netlink_tap_lock); |
| 160 | 160 | ||
| 161 | if (found && nt->module) | 161 | if (found) |
| 162 | module_put(nt->module); | 162 | module_put(nt->module); |
| 163 | 163 | ||
| 164 | return found ? 0 : -ENODEV; | 164 | return found ? 0 : -ENODEV; |
diff --git a/net/rds/ib_rdma.c b/net/rds/ib_rdma.c index 273b8bff6ba4..657ba9f5d308 100644 --- a/net/rds/ib_rdma.c +++ b/net/rds/ib_rdma.c | |||
| @@ -759,8 +759,10 @@ void *rds_ib_get_mr(struct scatterlist *sg, unsigned long nents, | |||
| 759 | } | 759 | } |
| 760 | 760 | ||
| 761 | ibmr = rds_ib_alloc_fmr(rds_ibdev); | 761 | ibmr = rds_ib_alloc_fmr(rds_ibdev); |
| 762 | if (IS_ERR(ibmr)) | 762 | if (IS_ERR(ibmr)) { |
| 763 | rds_ib_dev_put(rds_ibdev); | ||
| 763 | return ibmr; | 764 | return ibmr; |
| 765 | } | ||
| 764 | 766 | ||
| 765 | ret = rds_ib_map_fmr(rds_ibdev, ibmr, sg, nents); | 767 | ret = rds_ib_map_fmr(rds_ibdev, ibmr, sg, nents); |
| 766 | if (ret == 0) | 768 | if (ret == 0) |
diff --git a/net/rds/transport.c b/net/rds/transport.c index 8b4a6cd2c3a7..83498e1c75b8 100644 --- a/net/rds/transport.c +++ b/net/rds/transport.c | |||
| @@ -73,7 +73,7 @@ EXPORT_SYMBOL_GPL(rds_trans_unregister); | |||
| 73 | 73 | ||
| 74 | void rds_trans_put(struct rds_transport *trans) | 74 | void rds_trans_put(struct rds_transport *trans) |
| 75 | { | 75 | { |
| 76 | if (trans && trans->t_owner) | 76 | if (trans) |
| 77 | module_put(trans->t_owner); | 77 | module_put(trans->t_owner); |
| 78 | } | 78 | } |
| 79 | 79 | ||
diff --git a/net/switchdev/switchdev.c b/net/switchdev/switchdev.c index 84f77a054025..9f2add3cba26 100644 --- a/net/switchdev/switchdev.c +++ b/net/switchdev/switchdev.c | |||
| @@ -171,8 +171,10 @@ int switchdev_port_attr_set(struct net_device *dev, struct switchdev_attr *attr) | |||
| 171 | * released. | 171 | * released. |
| 172 | */ | 172 | */ |
| 173 | 173 | ||
| 174 | attr->trans = SWITCHDEV_TRANS_ABORT; | 174 | if (err != -EOPNOTSUPP) { |
| 175 | __switchdev_port_attr_set(dev, attr); | 175 | attr->trans = SWITCHDEV_TRANS_ABORT; |
| 176 | __switchdev_port_attr_set(dev, attr); | ||
| 177 | } | ||
| 176 | 178 | ||
| 177 | return err; | 179 | return err; |
| 178 | } | 180 | } |
| @@ -249,8 +251,10 @@ int switchdev_port_obj_add(struct net_device *dev, struct switchdev_obj *obj) | |||
| 249 | * released. | 251 | * released. |
| 250 | */ | 252 | */ |
| 251 | 253 | ||
| 252 | obj->trans = SWITCHDEV_TRANS_ABORT; | 254 | if (err != -EOPNOTSUPP) { |
| 253 | __switchdev_port_obj_add(dev, obj); | 255 | obj->trans = SWITCHDEV_TRANS_ABORT; |
| 256 | __switchdev_port_obj_add(dev, obj); | ||
| 257 | } | ||
| 254 | 258 | ||
| 255 | return err; | 259 | return err; |
| 256 | } | 260 | } |
diff --git a/net/tipc/socket.c b/net/tipc/socket.c index 46b6ed534ef2..3a7567f690f3 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c | |||
| @@ -2007,6 +2007,7 @@ static int tipc_accept(struct socket *sock, struct socket *new_sock, int flags) | |||
| 2007 | res = tipc_sk_create(sock_net(sock->sk), new_sock, 0, 1); | 2007 | res = tipc_sk_create(sock_net(sock->sk), new_sock, 0, 1); |
| 2008 | if (res) | 2008 | if (res) |
| 2009 | goto exit; | 2009 | goto exit; |
| 2010 | security_sk_clone(sock->sk, new_sock->sk); | ||
| 2010 | 2011 | ||
| 2011 | new_sk = new_sock->sk; | 2012 | new_sk = new_sock->sk; |
| 2012 | new_tsock = tipc_sk(new_sk); | 2013 | new_tsock = tipc_sk(new_sk); |
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index 90e1edc8dd42..d5c8e9a3a73c 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl | |||
| @@ -2599,7 +2599,7 @@ sub process { | |||
| 2599 | # if LONG_LINE is ignored, the other 2 types are also ignored | 2599 | # if LONG_LINE is ignored, the other 2 types are also ignored |
| 2600 | # | 2600 | # |
| 2601 | 2601 | ||
| 2602 | if ($length > $max_line_length) { | 2602 | if ($line =~ /^\+/ && $length > $max_line_length) { |
| 2603 | my $msg_type = "LONG_LINE"; | 2603 | my $msg_type = "LONG_LINE"; |
| 2604 | 2604 | ||
| 2605 | # Check the allowed long line types first | 2605 | # Check the allowed long line types first |
diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c index ac0db1679f09..b077bb644434 100644 --- a/sound/pci/hda/hda_generic.c +++ b/sound/pci/hda/hda_generic.c | |||
| @@ -5175,7 +5175,7 @@ static int alt_playback_pcm_open(struct hda_pcm_stream *hinfo, | |||
| 5175 | int err = 0; | 5175 | int err = 0; |
| 5176 | 5176 | ||
| 5177 | mutex_lock(&spec->pcm_mutex); | 5177 | mutex_lock(&spec->pcm_mutex); |
| 5178 | if (!spec->indep_hp_enabled) | 5178 | if (spec->indep_hp && !spec->indep_hp_enabled) |
| 5179 | err = -EBUSY; | 5179 | err = -EBUSY; |
| 5180 | else | 5180 | else |
| 5181 | spec->active_streams |= 1 << STREAM_INDEP_HP; | 5181 | spec->active_streams |= 1 << STREAM_INDEP_HP; |
diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c index 2f2433845d04..95158914cc6c 100644 --- a/sound/pci/hda/patch_hdmi.c +++ b/sound/pci/hda/patch_hdmi.c | |||
| @@ -3527,6 +3527,7 @@ static const struct hda_codec_preset snd_hda_preset_hdmi[] = { | |||
| 3527 | { .id = 0x80862807, .name = "Haswell HDMI", .patch = patch_generic_hdmi }, | 3527 | { .id = 0x80862807, .name = "Haswell HDMI", .patch = patch_generic_hdmi }, |
| 3528 | { .id = 0x80862808, .name = "Broadwell HDMI", .patch = patch_generic_hdmi }, | 3528 | { .id = 0x80862808, .name = "Broadwell HDMI", .patch = patch_generic_hdmi }, |
| 3529 | { .id = 0x80862809, .name = "Skylake HDMI", .patch = patch_generic_hdmi }, | 3529 | { .id = 0x80862809, .name = "Skylake HDMI", .patch = patch_generic_hdmi }, |
| 3530 | { .id = 0x8086280a, .name = "Broxton HDMI", .patch = patch_generic_hdmi }, | ||
| 3530 | { .id = 0x80862880, .name = "CedarTrail HDMI", .patch = patch_generic_hdmi }, | 3531 | { .id = 0x80862880, .name = "CedarTrail HDMI", .patch = patch_generic_hdmi }, |
| 3531 | { .id = 0x80862882, .name = "Valleyview2 HDMI", .patch = patch_generic_hdmi }, | 3532 | { .id = 0x80862882, .name = "Valleyview2 HDMI", .patch = patch_generic_hdmi }, |
| 3532 | { .id = 0x80862883, .name = "Braswell HDMI", .patch = patch_generic_hdmi }, | 3533 | { .id = 0x80862883, .name = "Braswell HDMI", .patch = patch_generic_hdmi }, |
| @@ -3591,6 +3592,7 @@ MODULE_ALIAS("snd-hda-codec-id:80862806"); | |||
| 3591 | MODULE_ALIAS("snd-hda-codec-id:80862807"); | 3592 | MODULE_ALIAS("snd-hda-codec-id:80862807"); |
| 3592 | MODULE_ALIAS("snd-hda-codec-id:80862808"); | 3593 | MODULE_ALIAS("snd-hda-codec-id:80862808"); |
| 3593 | MODULE_ALIAS("snd-hda-codec-id:80862809"); | 3594 | MODULE_ALIAS("snd-hda-codec-id:80862809"); |
| 3595 | MODULE_ALIAS("snd-hda-codec-id:8086280a"); | ||
| 3594 | MODULE_ALIAS("snd-hda-codec-id:80862880"); | 3596 | MODULE_ALIAS("snd-hda-codec-id:80862880"); |
| 3595 | MODULE_ALIAS("snd-hda-codec-id:80862882"); | 3597 | MODULE_ALIAS("snd-hda-codec-id:80862882"); |
| 3596 | MODULE_ALIAS("snd-hda-codec-id:80862883"); | 3598 | MODULE_ALIAS("snd-hda-codec-id:80862883"); |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index b3b44681d3cf..d35cf506a7db 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -4441,6 +4441,55 @@ static void alc290_fixup_mono_speakers(struct hda_codec *codec, | |||
| 4441 | } | 4441 | } |
| 4442 | } | 4442 | } |
| 4443 | 4443 | ||
| 4444 | /* Hook to update amp GPIO4 for automute */ | ||
| 4445 | static void alc280_hp_gpio4_automute_hook(struct hda_codec *codec, | ||
| 4446 | struct hda_jack_callback *jack) | ||
| 4447 | { | ||
| 4448 | struct alc_spec *spec = codec->spec; | ||
| 4449 | |||
| 4450 | snd_hda_gen_hp_automute(codec, jack); | ||
| 4451 | /* mute_led_polarity is set to 0, so we pass inverted value here */ | ||
| 4452 | alc_update_gpio_led(codec, 0x10, !spec->gen.hp_jack_present); | ||
| 4453 | } | ||
| 4454 | |||
| 4455 | /* Manage GPIOs for HP EliteBook Folio 9480m. | ||
| 4456 | * | ||
| 4457 | * GPIO4 is the headphone amplifier power control | ||
| 4458 | * GPIO3 is the audio output mute indicator LED | ||
| 4459 | */ | ||
| 4460 | |||
| 4461 | static void alc280_fixup_hp_9480m(struct hda_codec *codec, | ||
| 4462 | const struct hda_fixup *fix, | ||
| 4463 | int action) | ||
| 4464 | { | ||
| 4465 | struct alc_spec *spec = codec->spec; | ||
| 4466 | static const struct hda_verb gpio_init[] = { | ||
| 4467 | { 0x01, AC_VERB_SET_GPIO_MASK, 0x18 }, | ||
| 4468 | { 0x01, AC_VERB_SET_GPIO_DIRECTION, 0x18 }, | ||
| 4469 | {} | ||
| 4470 | }; | ||
| 4471 | |||
| 4472 | if (action == HDA_FIXUP_ACT_PRE_PROBE) { | ||
| 4473 | /* Set the hooks to turn the headphone amp on/off | ||
| 4474 | * as needed | ||
| 4475 | */ | ||
| 4476 | spec->gen.vmaster_mute.hook = alc_fixup_gpio_mute_hook; | ||
| 4477 | spec->gen.hp_automute_hook = alc280_hp_gpio4_automute_hook; | ||
| 4478 | |||
| 4479 | /* The GPIOs are currently off */ | ||
| 4480 | spec->gpio_led = 0; | ||
| 4481 | |||
| 4482 | /* GPIO3 is connected to the output mute LED, | ||
| 4483 | * high is on, low is off | ||
| 4484 | */ | ||
| 4485 | spec->mute_led_polarity = 0; | ||
| 4486 | spec->gpio_mute_led_mask = 0x08; | ||
| 4487 | |||
| 4488 | /* Initialize GPIO configuration */ | ||
| 4489 | snd_hda_add_verbs(codec, gpio_init); | ||
| 4490 | } | ||
| 4491 | } | ||
| 4492 | |||
| 4444 | /* for hda_fixup_thinkpad_acpi() */ | 4493 | /* for hda_fixup_thinkpad_acpi() */ |
| 4445 | #include "thinkpad_helper.c" | 4494 | #include "thinkpad_helper.c" |
| 4446 | 4495 | ||
| @@ -4521,6 +4570,7 @@ enum { | |||
| 4521 | ALC286_FIXUP_HP_GPIO_LED, | 4570 | ALC286_FIXUP_HP_GPIO_LED, |
| 4522 | ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY, | 4571 | ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY, |
| 4523 | ALC280_FIXUP_HP_DOCK_PINS, | 4572 | ALC280_FIXUP_HP_DOCK_PINS, |
| 4573 | ALC280_FIXUP_HP_9480M, | ||
| 4524 | ALC288_FIXUP_DELL_HEADSET_MODE, | 4574 | ALC288_FIXUP_DELL_HEADSET_MODE, |
| 4525 | ALC288_FIXUP_DELL1_MIC_NO_PRESENCE, | 4575 | ALC288_FIXUP_DELL1_MIC_NO_PRESENCE, |
| 4526 | ALC288_FIXUP_DELL_XPS_13_GPIO6, | 4576 | ALC288_FIXUP_DELL_XPS_13_GPIO6, |
| @@ -5043,6 +5093,10 @@ static const struct hda_fixup alc269_fixups[] = { | |||
| 5043 | .chained = true, | 5093 | .chained = true, |
| 5044 | .chain_id = ALC280_FIXUP_HP_GPIO4 | 5094 | .chain_id = ALC280_FIXUP_HP_GPIO4 |
| 5045 | }, | 5095 | }, |
| 5096 | [ALC280_FIXUP_HP_9480M] = { | ||
| 5097 | .type = HDA_FIXUP_FUNC, | ||
| 5098 | .v.func = alc280_fixup_hp_9480m, | ||
| 5099 | }, | ||
| 5046 | [ALC288_FIXUP_DELL_HEADSET_MODE] = { | 5100 | [ALC288_FIXUP_DELL_HEADSET_MODE] = { |
| 5047 | .type = HDA_FIXUP_FUNC, | 5101 | .type = HDA_FIXUP_FUNC, |
| 5048 | .v.func = alc_fixup_headset_mode_dell_alc288, | 5102 | .v.func = alc_fixup_headset_mode_dell_alc288, |
| @@ -5161,6 +5215,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
| 5161 | SND_PCI_QUIRK(0x103c, 0x22b7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | 5215 | SND_PCI_QUIRK(0x103c, 0x22b7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
| 5162 | SND_PCI_QUIRK(0x103c, 0x22bf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | 5216 | SND_PCI_QUIRK(0x103c, 0x22bf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
| 5163 | SND_PCI_QUIRK(0x103c, 0x22cf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | 5217 | SND_PCI_QUIRK(0x103c, 0x22cf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
| 5218 | SND_PCI_QUIRK(0x103c, 0x22db, "HP", ALC280_FIXUP_HP_9480M), | ||
| 5164 | SND_PCI_QUIRK(0x103c, 0x22dc, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | 5219 | SND_PCI_QUIRK(0x103c, 0x22dc, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), |
| 5165 | SND_PCI_QUIRK(0x103c, 0x22fb, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | 5220 | SND_PCI_QUIRK(0x103c, 0x22fb, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), |
| 5166 | /* ALC290 */ | 5221 | /* ALC290 */ |
diff --git a/sound/soc/codecs/pcm1681.c b/sound/soc/codecs/pcm1681.c index 477e13d30971..e7ba557979cb 100644 --- a/sound/soc/codecs/pcm1681.c +++ b/sound/soc/codecs/pcm1681.c | |||
| @@ -102,7 +102,7 @@ static int pcm1681_set_deemph(struct snd_soc_codec *codec) | |||
| 102 | 102 | ||
| 103 | if (val != -1) { | 103 | if (val != -1) { |
| 104 | regmap_update_bits(priv->regmap, PCM1681_DEEMPH_CONTROL, | 104 | regmap_update_bits(priv->regmap, PCM1681_DEEMPH_CONTROL, |
| 105 | PCM1681_DEEMPH_RATE_MASK, val); | 105 | PCM1681_DEEMPH_RATE_MASK, val << 3); |
| 106 | enable = 1; | 106 | enable = 1; |
| 107 | } else | 107 | } else |
| 108 | enable = 0; | 108 | enable = 0; |
diff --git a/sound/soc/codecs/rt5645.c b/sound/soc/codecs/rt5645.c index 9ce311e088fc..e9cc3aae5366 100644 --- a/sound/soc/codecs/rt5645.c +++ b/sound/soc/codecs/rt5645.c | |||
| @@ -2943,6 +2943,9 @@ static int rt5645_irq_detection(struct rt5645_priv *rt5645) | |||
| 2943 | { | 2943 | { |
| 2944 | int val, btn_type, gpio_state = 0, report = 0; | 2944 | int val, btn_type, gpio_state = 0, report = 0; |
| 2945 | 2945 | ||
| 2946 | if (!rt5645->codec) | ||
| 2947 | return -EINVAL; | ||
| 2948 | |||
| 2946 | switch (rt5645->pdata.jd_mode) { | 2949 | switch (rt5645->pdata.jd_mode) { |
| 2947 | case 0: /* Not using rt5645 JD */ | 2950 | case 0: /* Not using rt5645 JD */ |
| 2948 | if (rt5645->gpiod_hp_det) { | 2951 | if (rt5645->gpiod_hp_det) { |
diff --git a/sound/soc/codecs/sgtl5000.h b/sound/soc/codecs/sgtl5000.h index bd7a344bf8c5..1c317de26176 100644 --- a/sound/soc/codecs/sgtl5000.h +++ b/sound/soc/codecs/sgtl5000.h | |||
| @@ -275,7 +275,7 @@ | |||
| 275 | #define SGTL5000_BIAS_CTRL_MASK 0x000e | 275 | #define SGTL5000_BIAS_CTRL_MASK 0x000e |
| 276 | #define SGTL5000_BIAS_CTRL_SHIFT 1 | 276 | #define SGTL5000_BIAS_CTRL_SHIFT 1 |
| 277 | #define SGTL5000_BIAS_CTRL_WIDTH 3 | 277 | #define SGTL5000_BIAS_CTRL_WIDTH 3 |
| 278 | #define SGTL5000_SMALL_POP 0 | 278 | #define SGTL5000_SMALL_POP 1 |
| 279 | 279 | ||
| 280 | /* | 280 | /* |
| 281 | * SGTL5000_CHIP_MIC_CTRL | 281 | * SGTL5000_CHIP_MIC_CTRL |
diff --git a/sound/soc/codecs/ssm4567.c b/sound/soc/codecs/ssm4567.c index 938d2cb6d78b..84a4f5ad8064 100644 --- a/sound/soc/codecs/ssm4567.c +++ b/sound/soc/codecs/ssm4567.c | |||
| @@ -315,7 +315,13 @@ static int ssm4567_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) | |||
| 315 | if (invert_fclk) | 315 | if (invert_fclk) |
| 316 | ctrl1 |= SSM4567_SAI_CTRL_1_FSYNC; | 316 | ctrl1 |= SSM4567_SAI_CTRL_1_FSYNC; |
| 317 | 317 | ||
| 318 | return regmap_write(ssm4567->regmap, SSM4567_REG_SAI_CTRL_1, ctrl1); | 318 | return regmap_update_bits(ssm4567->regmap, SSM4567_REG_SAI_CTRL_1, |
| 319 | SSM4567_SAI_CTRL_1_BCLK | | ||
| 320 | SSM4567_SAI_CTRL_1_FSYNC | | ||
| 321 | SSM4567_SAI_CTRL_1_LJ | | ||
| 322 | SSM4567_SAI_CTRL_1_TDM | | ||
| 323 | SSM4567_SAI_CTRL_1_PDM, | ||
| 324 | ctrl1); | ||
| 319 | } | 325 | } |
| 320 | 326 | ||
| 321 | static int ssm4567_set_power(struct ssm4567 *ssm4567, bool enable) | 327 | static int ssm4567_set_power(struct ssm4567 *ssm4567, bool enable) |
diff --git a/sound/soc/fsl/fsl_ssi.c b/sound/soc/fsl/fsl_ssi.c index c7647e066cfd..c0b940e2019f 100644 --- a/sound/soc/fsl/fsl_ssi.c +++ b/sound/soc/fsl/fsl_ssi.c | |||
| @@ -633,7 +633,7 @@ static int fsl_ssi_set_bclk(struct snd_pcm_substream *substream, | |||
| 633 | sub *= 100000; | 633 | sub *= 100000; |
| 634 | do_div(sub, freq); | 634 | do_div(sub, freq); |
| 635 | 635 | ||
| 636 | if (sub < savesub) { | 636 | if (sub < savesub && !(i == 0 && psr == 0 && div2 == 0)) { |
| 637 | baudrate = tmprate; | 637 | baudrate = tmprate; |
| 638 | savesub = sub; | 638 | savesub = sub; |
| 639 | pm = i; | 639 | pm = i; |
diff --git a/sound/soc/intel/Makefile b/sound/soc/intel/Makefile index 3853ec2ddbc7..6de5d5cd3280 100644 --- a/sound/soc/intel/Makefile +++ b/sound/soc/intel/Makefile | |||
| @@ -7,4 +7,4 @@ obj-$(CONFIG_SND_SOC_INTEL_BAYTRAIL) += baytrail/ | |||
| 7 | obj-$(CONFIG_SND_SST_MFLD_PLATFORM) += atom/ | 7 | obj-$(CONFIG_SND_SST_MFLD_PLATFORM) += atom/ |
| 8 | 8 | ||
| 9 | # Machine support | 9 | # Machine support |
| 10 | obj-$(CONFIG_SND_SOC_INTEL_SST) += boards/ | 10 | obj-$(CONFIG_SND_SOC) += boards/ |
diff --git a/sound/soc/intel/atom/sst/sst_drv_interface.c b/sound/soc/intel/atom/sst/sst_drv_interface.c index 620da1d1b9e3..0e0e4d9c021f 100644 --- a/sound/soc/intel/atom/sst/sst_drv_interface.c +++ b/sound/soc/intel/atom/sst/sst_drv_interface.c | |||
| @@ -42,6 +42,11 @@ | |||
| 42 | #define MIN_FRAGMENT_SIZE (50 * 1024) | 42 | #define MIN_FRAGMENT_SIZE (50 * 1024) |
| 43 | #define MAX_FRAGMENT_SIZE (1024 * 1024) | 43 | #define MAX_FRAGMENT_SIZE (1024 * 1024) |
| 44 | #define SST_GET_BYTES_PER_SAMPLE(pcm_wd_sz) (((pcm_wd_sz + 15) >> 4) << 1) | 44 | #define SST_GET_BYTES_PER_SAMPLE(pcm_wd_sz) (((pcm_wd_sz + 15) >> 4) << 1) |
| 45 | #ifdef CONFIG_PM | ||
| 46 | #define GET_USAGE_COUNT(dev) (atomic_read(&dev->power.usage_count)) | ||
| 47 | #else | ||
| 48 | #define GET_USAGE_COUNT(dev) 1 | ||
| 49 | #endif | ||
| 45 | 50 | ||
| 46 | int free_stream_context(struct intel_sst_drv *ctx, unsigned int str_id) | 51 | int free_stream_context(struct intel_sst_drv *ctx, unsigned int str_id) |
| 47 | { | 52 | { |
| @@ -141,15 +146,9 @@ static int sst_power_control(struct device *dev, bool state) | |||
| 141 | int ret = 0; | 146 | int ret = 0; |
| 142 | int usage_count = 0; | 147 | int usage_count = 0; |
| 143 | 148 | ||
| 144 | #ifdef CONFIG_PM | ||
| 145 | usage_count = atomic_read(&dev->power.usage_count); | ||
| 146 | #else | ||
| 147 | usage_count = 1; | ||
| 148 | #endif | ||
| 149 | |||
| 150 | if (state == true) { | 149 | if (state == true) { |
| 151 | ret = pm_runtime_get_sync(dev); | 150 | ret = pm_runtime_get_sync(dev); |
| 152 | 151 | usage_count = GET_USAGE_COUNT(dev); | |
| 153 | dev_dbg(ctx->dev, "Enable: pm usage count: %d\n", usage_count); | 152 | dev_dbg(ctx->dev, "Enable: pm usage count: %d\n", usage_count); |
| 154 | if (ret < 0) { | 153 | if (ret < 0) { |
| 155 | dev_err(ctx->dev, "Runtime get failed with err: %d\n", ret); | 154 | dev_err(ctx->dev, "Runtime get failed with err: %d\n", ret); |
| @@ -164,6 +163,7 @@ static int sst_power_control(struct device *dev, bool state) | |||
| 164 | } | 163 | } |
| 165 | } | 164 | } |
| 166 | } else { | 165 | } else { |
| 166 | usage_count = GET_USAGE_COUNT(dev); | ||
| 167 | dev_dbg(ctx->dev, "Disable: pm usage count: %d\n", usage_count); | 167 | dev_dbg(ctx->dev, "Disable: pm usage count: %d\n", usage_count); |
| 168 | return sst_pm_runtime_put(ctx); | 168 | return sst_pm_runtime_put(ctx); |
| 169 | } | 169 | } |
diff --git a/sound/soc/intel/boards/cht_bsw_max98090_ti.c b/sound/soc/intel/boards/cht_bsw_max98090_ti.c index d604ee80eda4..70f832114a5a 100644 --- a/sound/soc/intel/boards/cht_bsw_max98090_ti.c +++ b/sound/soc/intel/boards/cht_bsw_max98090_ti.c | |||
| @@ -69,12 +69,12 @@ static const struct snd_soc_dapm_route cht_audio_map[] = { | |||
| 69 | {"Headphone", NULL, "HPR"}, | 69 | {"Headphone", NULL, "HPR"}, |
| 70 | {"Ext Spk", NULL, "SPKL"}, | 70 | {"Ext Spk", NULL, "SPKL"}, |
| 71 | {"Ext Spk", NULL, "SPKR"}, | 71 | {"Ext Spk", NULL, "SPKR"}, |
| 72 | {"AIF1 Playback", NULL, "ssp2 Tx"}, | 72 | {"HiFi Playback", NULL, "ssp2 Tx"}, |
| 73 | {"ssp2 Tx", NULL, "codec_out0"}, | 73 | {"ssp2 Tx", NULL, "codec_out0"}, |
| 74 | {"ssp2 Tx", NULL, "codec_out1"}, | 74 | {"ssp2 Tx", NULL, "codec_out1"}, |
| 75 | {"codec_in0", NULL, "ssp2 Rx" }, | 75 | {"codec_in0", NULL, "ssp2 Rx" }, |
| 76 | {"codec_in1", NULL, "ssp2 Rx" }, | 76 | {"codec_in1", NULL, "ssp2 Rx" }, |
| 77 | {"ssp2 Rx", NULL, "AIF1 Capture"}, | 77 | {"ssp2 Rx", NULL, "HiFi Capture"}, |
| 78 | }; | 78 | }; |
| 79 | 79 | ||
| 80 | static const struct snd_kcontrol_new cht_mc_controls[] = { | 80 | static const struct snd_kcontrol_new cht_mc_controls[] = { |
diff --git a/sound/soc/mediatek/mt8173-max98090.c b/sound/soc/mediatek/mt8173-max98090.c index 4d44b5803e55..2d2536af141f 100644 --- a/sound/soc/mediatek/mt8173-max98090.c +++ b/sound/soc/mediatek/mt8173-max98090.c | |||
| @@ -103,7 +103,6 @@ static struct snd_soc_dai_link mt8173_max98090_dais[] = { | |||
| 103 | .name = "MAX98090 Playback", | 103 | .name = "MAX98090 Playback", |
| 104 | .stream_name = "MAX98090 Playback", | 104 | .stream_name = "MAX98090 Playback", |
| 105 | .cpu_dai_name = "DL1", | 105 | .cpu_dai_name = "DL1", |
| 106 | .platform_name = "11220000.mt8173-afe-pcm", | ||
| 107 | .codec_name = "snd-soc-dummy", | 106 | .codec_name = "snd-soc-dummy", |
| 108 | .codec_dai_name = "snd-soc-dummy-dai", | 107 | .codec_dai_name = "snd-soc-dummy-dai", |
| 109 | .trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, | 108 | .trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, |
| @@ -114,7 +113,6 @@ static struct snd_soc_dai_link mt8173_max98090_dais[] = { | |||
| 114 | .name = "MAX98090 Capture", | 113 | .name = "MAX98090 Capture", |
| 115 | .stream_name = "MAX98090 Capture", | 114 | .stream_name = "MAX98090 Capture", |
| 116 | .cpu_dai_name = "VUL", | 115 | .cpu_dai_name = "VUL", |
| 117 | .platform_name = "11220000.mt8173-afe-pcm", | ||
| 118 | .codec_name = "snd-soc-dummy", | 116 | .codec_name = "snd-soc-dummy", |
| 119 | .codec_dai_name = "snd-soc-dummy-dai", | 117 | .codec_dai_name = "snd-soc-dummy-dai", |
| 120 | .trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, | 118 | .trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, |
| @@ -125,7 +123,6 @@ static struct snd_soc_dai_link mt8173_max98090_dais[] = { | |||
| 125 | { | 123 | { |
| 126 | .name = "Codec", | 124 | .name = "Codec", |
| 127 | .cpu_dai_name = "I2S", | 125 | .cpu_dai_name = "I2S", |
| 128 | .platform_name = "11220000.mt8173-afe-pcm", | ||
| 129 | .no_pcm = 1, | 126 | .no_pcm = 1, |
| 130 | .codec_dai_name = "HiFi", | 127 | .codec_dai_name = "HiFi", |
| 131 | .init = mt8173_max98090_init, | 128 | .init = mt8173_max98090_init, |
| @@ -152,9 +149,21 @@ static struct snd_soc_card mt8173_max98090_card = { | |||
| 152 | static int mt8173_max98090_dev_probe(struct platform_device *pdev) | 149 | static int mt8173_max98090_dev_probe(struct platform_device *pdev) |
| 153 | { | 150 | { |
| 154 | struct snd_soc_card *card = &mt8173_max98090_card; | 151 | struct snd_soc_card *card = &mt8173_max98090_card; |
| 155 | struct device_node *codec_node; | 152 | struct device_node *codec_node, *platform_node; |
| 156 | int ret, i; | 153 | int ret, i; |
| 157 | 154 | ||
| 155 | platform_node = of_parse_phandle(pdev->dev.of_node, | ||
| 156 | "mediatek,platform", 0); | ||
| 157 | if (!platform_node) { | ||
| 158 | dev_err(&pdev->dev, "Property 'platform' missing or invalid\n"); | ||
| 159 | return -EINVAL; | ||
| 160 | } | ||
| 161 | for (i = 0; i < card->num_links; i++) { | ||
| 162 | if (mt8173_max98090_dais[i].platform_name) | ||
| 163 | continue; | ||
| 164 | mt8173_max98090_dais[i].platform_of_node = platform_node; | ||
| 165 | } | ||
| 166 | |||
| 158 | codec_node = of_parse_phandle(pdev->dev.of_node, | 167 | codec_node = of_parse_phandle(pdev->dev.of_node, |
| 159 | "mediatek,audio-codec", 0); | 168 | "mediatek,audio-codec", 0); |
| 160 | if (!codec_node) { | 169 | if (!codec_node) { |
diff --git a/sound/soc/mediatek/mt8173-rt5650-rt5676.c b/sound/soc/mediatek/mt8173-rt5650-rt5676.c index 094055323059..6f52eca05e26 100644 --- a/sound/soc/mediatek/mt8173-rt5650-rt5676.c +++ b/sound/soc/mediatek/mt8173-rt5650-rt5676.c | |||
| @@ -138,7 +138,6 @@ static struct snd_soc_dai_link mt8173_rt5650_rt5676_dais[] = { | |||
| 138 | .name = "rt5650_rt5676 Playback", | 138 | .name = "rt5650_rt5676 Playback", |
| 139 | .stream_name = "rt5650_rt5676 Playback", | 139 | .stream_name = "rt5650_rt5676 Playback", |
| 140 | .cpu_dai_name = "DL1", | 140 | .cpu_dai_name = "DL1", |
| 141 | .platform_name = "11220000.mt8173-afe-pcm", | ||
| 142 | .codec_name = "snd-soc-dummy", | 141 | .codec_name = "snd-soc-dummy", |
| 143 | .codec_dai_name = "snd-soc-dummy-dai", | 142 | .codec_dai_name = "snd-soc-dummy-dai", |
| 144 | .trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, | 143 | .trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, |
| @@ -149,7 +148,6 @@ static struct snd_soc_dai_link mt8173_rt5650_rt5676_dais[] = { | |||
| 149 | .name = "rt5650_rt5676 Capture", | 148 | .name = "rt5650_rt5676 Capture", |
| 150 | .stream_name = "rt5650_rt5676 Capture", | 149 | .stream_name = "rt5650_rt5676 Capture", |
| 151 | .cpu_dai_name = "VUL", | 150 | .cpu_dai_name = "VUL", |
| 152 | .platform_name = "11220000.mt8173-afe-pcm", | ||
| 153 | .codec_name = "snd-soc-dummy", | 151 | .codec_name = "snd-soc-dummy", |
| 154 | .codec_dai_name = "snd-soc-dummy-dai", | 152 | .codec_dai_name = "snd-soc-dummy-dai", |
| 155 | .trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, | 153 | .trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, |
| @@ -161,7 +159,6 @@ static struct snd_soc_dai_link mt8173_rt5650_rt5676_dais[] = { | |||
| 161 | { | 159 | { |
| 162 | .name = "Codec", | 160 | .name = "Codec", |
| 163 | .cpu_dai_name = "I2S", | 161 | .cpu_dai_name = "I2S", |
| 164 | .platform_name = "11220000.mt8173-afe-pcm", | ||
| 165 | .no_pcm = 1, | 162 | .no_pcm = 1, |
| 166 | .codecs = mt8173_rt5650_rt5676_codecs, | 163 | .codecs = mt8173_rt5650_rt5676_codecs, |
| 167 | .num_codecs = 2, | 164 | .num_codecs = 2, |
| @@ -209,7 +206,21 @@ static struct snd_soc_card mt8173_rt5650_rt5676_card = { | |||
| 209 | static int mt8173_rt5650_rt5676_dev_probe(struct platform_device *pdev) | 206 | static int mt8173_rt5650_rt5676_dev_probe(struct platform_device *pdev) |
| 210 | { | 207 | { |
| 211 | struct snd_soc_card *card = &mt8173_rt5650_rt5676_card; | 208 | struct snd_soc_card *card = &mt8173_rt5650_rt5676_card; |
| 212 | int ret; | 209 | struct device_node *platform_node; |
| 210 | int i, ret; | ||
| 211 | |||
| 212 | platform_node = of_parse_phandle(pdev->dev.of_node, | ||
| 213 | "mediatek,platform", 0); | ||
| 214 | if (!platform_node) { | ||
| 215 | dev_err(&pdev->dev, "Property 'platform' missing or invalid\n"); | ||
| 216 | return -EINVAL; | ||
| 217 | } | ||
| 218 | |||
| 219 | for (i = 0; i < card->num_links; i++) { | ||
| 220 | if (mt8173_rt5650_rt5676_dais[i].platform_name) | ||
| 221 | continue; | ||
| 222 | mt8173_rt5650_rt5676_dais[i].platform_of_node = platform_node; | ||
| 223 | } | ||
| 213 | 224 | ||
| 214 | mt8173_rt5650_rt5676_codecs[0].of_node = | 225 | mt8173_rt5650_rt5676_codecs[0].of_node = |
| 215 | of_parse_phandle(pdev->dev.of_node, "mediatek,audio-codec", 0); | 226 | of_parse_phandle(pdev->dev.of_node, "mediatek,audio-codec", 0); |
diff --git a/sound/soc/mediatek/mtk-afe-pcm.c b/sound/soc/mediatek/mtk-afe-pcm.c index cc228db5fb76..9863da73dfe0 100644 --- a/sound/soc/mediatek/mtk-afe-pcm.c +++ b/sound/soc/mediatek/mtk-afe-pcm.c | |||
| @@ -1199,6 +1199,8 @@ err_pm_disable: | |||
| 1199 | static int mtk_afe_pcm_dev_remove(struct platform_device *pdev) | 1199 | static int mtk_afe_pcm_dev_remove(struct platform_device *pdev) |
| 1200 | { | 1200 | { |
| 1201 | pm_runtime_disable(&pdev->dev); | 1201 | pm_runtime_disable(&pdev->dev); |
| 1202 | if (!pm_runtime_status_suspended(&pdev->dev)) | ||
| 1203 | mtk_afe_runtime_suspend(&pdev->dev); | ||
| 1202 | snd_soc_unregister_component(&pdev->dev); | 1204 | snd_soc_unregister_component(&pdev->dev); |
| 1203 | snd_soc_unregister_platform(&pdev->dev); | 1205 | snd_soc_unregister_platform(&pdev->dev); |
| 1204 | return 0; | 1206 | return 0; |
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 3a4a5c0e3f97..0e1e69c7abd5 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c | |||
| @@ -1716,6 +1716,7 @@ card_probe_error: | |||
| 1716 | if (card->remove) | 1716 | if (card->remove) |
| 1717 | card->remove(card); | 1717 | card->remove(card); |
| 1718 | 1718 | ||
| 1719 | snd_soc_dapm_free(&card->dapm); | ||
| 1719 | soc_cleanup_card_debugfs(card); | 1720 | soc_cleanup_card_debugfs(card); |
| 1720 | snd_card_free(card->snd_card); | 1721 | snd_card_free(card->snd_card); |
| 1721 | 1722 | ||
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c index aa327c92480c..e0de8072c514 100644 --- a/sound/soc/soc-dapm.c +++ b/sound/soc/soc-dapm.c | |||
| @@ -358,9 +358,10 @@ static int dapm_kcontrol_data_alloc(struct snd_soc_dapm_widget *widget, | |||
| 358 | data->widget = | 358 | data->widget = |
| 359 | snd_soc_dapm_new_control_unlocked(widget->dapm, | 359 | snd_soc_dapm_new_control_unlocked(widget->dapm, |
| 360 | &template); | 360 | &template); |
| 361 | kfree(name); | ||
| 361 | if (!data->widget) { | 362 | if (!data->widget) { |
| 362 | ret = -ENOMEM; | 363 | ret = -ENOMEM; |
| 363 | goto err_name; | 364 | goto err_data; |
| 364 | } | 365 | } |
| 365 | } | 366 | } |
| 366 | break; | 367 | break; |
| @@ -389,11 +390,12 @@ static int dapm_kcontrol_data_alloc(struct snd_soc_dapm_widget *widget, | |||
| 389 | 390 | ||
| 390 | data->value = template.on_val; | 391 | data->value = template.on_val; |
| 391 | 392 | ||
| 392 | data->widget = snd_soc_dapm_new_control(widget->dapm, | 393 | data->widget = snd_soc_dapm_new_control_unlocked( |
| 393 | &template); | 394 | widget->dapm, &template); |
| 395 | kfree(name); | ||
| 394 | if (!data->widget) { | 396 | if (!data->widget) { |
| 395 | ret = -ENOMEM; | 397 | ret = -ENOMEM; |
| 396 | goto err_name; | 398 | goto err_data; |
| 397 | } | 399 | } |
| 398 | 400 | ||
| 399 | snd_soc_dapm_add_path(widget->dapm, data->widget, | 401 | snd_soc_dapm_add_path(widget->dapm, data->widget, |
| @@ -408,8 +410,6 @@ static int dapm_kcontrol_data_alloc(struct snd_soc_dapm_widget *widget, | |||
| 408 | 410 | ||
| 409 | return 0; | 411 | return 0; |
| 410 | 412 | ||
| 411 | err_name: | ||
| 412 | kfree(name); | ||
| 413 | err_data: | 413 | err_data: |
| 414 | kfree(data); | 414 | kfree(data); |
| 415 | return ret; | 415 | return ret; |
| @@ -418,8 +418,6 @@ err_data: | |||
| 418 | static void dapm_kcontrol_free(struct snd_kcontrol *kctl) | 418 | static void dapm_kcontrol_free(struct snd_kcontrol *kctl) |
| 419 | { | 419 | { |
| 420 | struct dapm_kcontrol_data *data = snd_kcontrol_chip(kctl); | 420 | struct dapm_kcontrol_data *data = snd_kcontrol_chip(kctl); |
| 421 | if (data->widget) | ||
| 422 | kfree(data->widget->name); | ||
| 423 | kfree(data->wlist); | 421 | kfree(data->wlist); |
| 424 | kfree(data); | 422 | kfree(data); |
| 425 | } | 423 | } |
| @@ -1952,6 +1950,7 @@ static ssize_t dapm_widget_power_read_file(struct file *file, | |||
| 1952 | size_t count, loff_t *ppos) | 1950 | size_t count, loff_t *ppos) |
| 1953 | { | 1951 | { |
| 1954 | struct snd_soc_dapm_widget *w = file->private_data; | 1952 | struct snd_soc_dapm_widget *w = file->private_data; |
| 1953 | struct snd_soc_card *card = w->dapm->card; | ||
| 1955 | char *buf; | 1954 | char *buf; |
| 1956 | int in, out; | 1955 | int in, out; |
| 1957 | ssize_t ret; | 1956 | ssize_t ret; |
| @@ -1961,6 +1960,8 @@ static ssize_t dapm_widget_power_read_file(struct file *file, | |||
| 1961 | if (!buf) | 1960 | if (!buf) |
| 1962 | return -ENOMEM; | 1961 | return -ENOMEM; |
| 1963 | 1962 | ||
| 1963 | mutex_lock(&card->dapm_mutex); | ||
| 1964 | |||
| 1964 | /* Supply widgets are not handled by is_connected_{input,output}_ep() */ | 1965 | /* Supply widgets are not handled by is_connected_{input,output}_ep() */ |
| 1965 | if (w->is_supply) { | 1966 | if (w->is_supply) { |
| 1966 | in = 0; | 1967 | in = 0; |
| @@ -2007,6 +2008,8 @@ static ssize_t dapm_widget_power_read_file(struct file *file, | |||
| 2007 | p->sink->name); | 2008 | p->sink->name); |
| 2008 | } | 2009 | } |
| 2009 | 2010 | ||
| 2011 | mutex_unlock(&card->dapm_mutex); | ||
| 2012 | |||
| 2010 | ret = simple_read_from_buffer(user_buf, count, ppos, buf, ret); | 2013 | ret = simple_read_from_buffer(user_buf, count, ppos, buf, ret); |
| 2011 | 2014 | ||
| 2012 | kfree(buf); | 2015 | kfree(buf); |
| @@ -2281,11 +2284,15 @@ static ssize_t dapm_widget_show(struct device *dev, | |||
| 2281 | struct snd_soc_pcm_runtime *rtd = dev_get_drvdata(dev); | 2284 | struct snd_soc_pcm_runtime *rtd = dev_get_drvdata(dev); |
| 2282 | int i, count = 0; | 2285 | int i, count = 0; |
| 2283 | 2286 | ||
| 2287 | mutex_lock(&rtd->card->dapm_mutex); | ||
| 2288 | |||
| 2284 | for (i = 0; i < rtd->num_codecs; i++) { | 2289 | for (i = 0; i < rtd->num_codecs; i++) { |
| 2285 | struct snd_soc_codec *codec = rtd->codec_dais[i]->codec; | 2290 | struct snd_soc_codec *codec = rtd->codec_dais[i]->codec; |
| 2286 | count += dapm_widget_show_codec(codec, buf + count); | 2291 | count += dapm_widget_show_codec(codec, buf + count); |
| 2287 | } | 2292 | } |
| 2288 | 2293 | ||
| 2294 | mutex_unlock(&rtd->card->dapm_mutex); | ||
| 2295 | |||
| 2289 | return count; | 2296 | return count; |
| 2290 | } | 2297 | } |
| 2291 | 2298 | ||
| @@ -3334,16 +3341,10 @@ snd_soc_dapm_new_control_unlocked(struct snd_soc_dapm_context *dapm, | |||
| 3334 | } | 3341 | } |
| 3335 | 3342 | ||
| 3336 | prefix = soc_dapm_prefix(dapm); | 3343 | prefix = soc_dapm_prefix(dapm); |
| 3337 | if (prefix) { | 3344 | if (prefix) |
| 3338 | w->name = kasprintf(GFP_KERNEL, "%s %s", prefix, widget->name); | 3345 | w->name = kasprintf(GFP_KERNEL, "%s %s", prefix, widget->name); |
| 3339 | if (widget->sname) | 3346 | else |
| 3340 | w->sname = kasprintf(GFP_KERNEL, "%s %s", prefix, | ||
| 3341 | widget->sname); | ||
| 3342 | } else { | ||
| 3343 | w->name = kasprintf(GFP_KERNEL, "%s", widget->name); | 3347 | w->name = kasprintf(GFP_KERNEL, "%s", widget->name); |
| 3344 | if (widget->sname) | ||
| 3345 | w->sname = kasprintf(GFP_KERNEL, "%s", widget->sname); | ||
| 3346 | } | ||
| 3347 | if (w->name == NULL) { | 3348 | if (w->name == NULL) { |
| 3348 | kfree(w); | 3349 | kfree(w); |
| 3349 | return NULL; | 3350 | return NULL; |
| @@ -3792,7 +3793,7 @@ int snd_soc_dapm_link_dai_widgets(struct snd_soc_card *card) | |||
| 3792 | break; | 3793 | break; |
| 3793 | } | 3794 | } |
| 3794 | 3795 | ||
| 3795 | if (!w->sname || !strstr(w->sname, dai_w->name)) | 3796 | if (!w->sname || !strstr(w->sname, dai_w->sname)) |
| 3796 | continue; | 3797 | continue; |
| 3797 | 3798 | ||
| 3798 | if (dai_w->id == snd_soc_dapm_dai_in) { | 3799 | if (dai_w->id == snd_soc_dapm_dai_in) { |
diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c index 9f2b048f1071..2c70f30d2d78 100644 --- a/sound/soc/soc-topology.c +++ b/sound/soc/soc-topology.c | |||
| @@ -144,7 +144,7 @@ static const struct snd_soc_tplg_kcontrol_ops io_ops[] = { | |||
| 144 | {SND_SOC_TPLG_CTL_STROBE, snd_soc_get_strobe, | 144 | {SND_SOC_TPLG_CTL_STROBE, snd_soc_get_strobe, |
| 145 | snd_soc_put_strobe, NULL}, | 145 | snd_soc_put_strobe, NULL}, |
| 146 | {SND_SOC_TPLG_DAPM_CTL_VOLSW, snd_soc_dapm_get_volsw, | 146 | {SND_SOC_TPLG_DAPM_CTL_VOLSW, snd_soc_dapm_get_volsw, |
| 147 | snd_soc_dapm_put_volsw, NULL}, | 147 | snd_soc_dapm_put_volsw, snd_soc_info_volsw}, |
| 148 | {SND_SOC_TPLG_DAPM_CTL_ENUM_DOUBLE, snd_soc_dapm_get_enum_double, | 148 | {SND_SOC_TPLG_DAPM_CTL_ENUM_DOUBLE, snd_soc_dapm_get_enum_double, |
| 149 | snd_soc_dapm_put_enum_double, snd_soc_info_enum_double}, | 149 | snd_soc_dapm_put_enum_double, snd_soc_info_enum_double}, |
| 150 | {SND_SOC_TPLG_DAPM_CTL_ENUM_VIRT, snd_soc_dapm_get_enum_double, | 150 | {SND_SOC_TPLG_DAPM_CTL_ENUM_VIRT, snd_soc_dapm_get_enum_double, |
| @@ -580,27 +580,26 @@ static int soc_tplg_init_kcontrol(struct soc_tplg *tplg, | |||
| 580 | } | 580 | } |
| 581 | 581 | ||
| 582 | static int soc_tplg_create_tlv(struct soc_tplg *tplg, | 582 | static int soc_tplg_create_tlv(struct soc_tplg *tplg, |
| 583 | struct snd_kcontrol_new *kc, u32 tlv_size) | 583 | struct snd_kcontrol_new *kc, struct snd_soc_tplg_ctl_tlv *tplg_tlv) |
| 584 | { | 584 | { |
| 585 | struct snd_soc_tplg_ctl_tlv *tplg_tlv; | ||
| 586 | struct snd_ctl_tlv *tlv; | 585 | struct snd_ctl_tlv *tlv; |
| 586 | int size; | ||
| 587 | 587 | ||
| 588 | if (tlv_size == 0) | 588 | if (tplg_tlv->count == 0) |
| 589 | return 0; | 589 | return 0; |
| 590 | 590 | ||
| 591 | tplg_tlv = (struct snd_soc_tplg_ctl_tlv *) tplg->pos; | 591 | size = ((tplg_tlv->count + (sizeof(unsigned int) - 1)) & |
| 592 | tplg->pos += tlv_size; | 592 | ~(sizeof(unsigned int) - 1)); |
| 593 | 593 | tlv = kzalloc(sizeof(*tlv) + size, GFP_KERNEL); | |
| 594 | tlv = kzalloc(sizeof(*tlv) + tlv_size, GFP_KERNEL); | ||
| 595 | if (tlv == NULL) | 594 | if (tlv == NULL) |
| 596 | return -ENOMEM; | 595 | return -ENOMEM; |
| 597 | 596 | ||
| 598 | dev_dbg(tplg->dev, " created TLV type %d size %d bytes\n", | 597 | dev_dbg(tplg->dev, " created TLV type %d size %d bytes\n", |
| 599 | tplg_tlv->numid, tplg_tlv->size); | 598 | tplg_tlv->numid, size); |
| 600 | 599 | ||
| 601 | tlv->numid = tplg_tlv->numid; | 600 | tlv->numid = tplg_tlv->numid; |
| 602 | tlv->length = tplg_tlv->size; | 601 | tlv->length = size; |
| 603 | memcpy(tlv->tlv, tplg_tlv + 1, tplg_tlv->size); | 602 | memcpy(&tlv->tlv[0], tplg_tlv->data, size); |
| 604 | kc->tlv.p = (void *)tlv; | 603 | kc->tlv.p = (void *)tlv; |
| 605 | 604 | ||
| 606 | return 0; | 605 | return 0; |
| @@ -773,7 +772,7 @@ static int soc_tplg_dmixer_create(struct soc_tplg *tplg, unsigned int count, | |||
| 773 | } | 772 | } |
| 774 | 773 | ||
| 775 | /* create any TLV data */ | 774 | /* create any TLV data */ |
| 776 | soc_tplg_create_tlv(tplg, &kc, mc->hdr.tlv_size); | 775 | soc_tplg_create_tlv(tplg, &kc, &mc->tlv); |
| 777 | 776 | ||
| 778 | /* register control here */ | 777 | /* register control here */ |
| 779 | err = soc_tplg_add_kcontrol(tplg, &kc, | 778 | err = soc_tplg_add_kcontrol(tplg, &kc, |
diff --git a/sound/soc/zte/zx296702-i2s.c b/sound/soc/zte/zx296702-i2s.c index 98d96e1b17e0..1930c42e1f55 100644 --- a/sound/soc/zte/zx296702-i2s.c +++ b/sound/soc/zte/zx296702-i2s.c | |||
| @@ -393,9 +393,9 @@ static int zx_i2s_probe(struct platform_device *pdev) | |||
| 393 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 393 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 394 | zx_i2s->mapbase = res->start; | 394 | zx_i2s->mapbase = res->start; |
| 395 | zx_i2s->reg_base = devm_ioremap_resource(&pdev->dev, res); | 395 | zx_i2s->reg_base = devm_ioremap_resource(&pdev->dev, res); |
| 396 | if (!zx_i2s->reg_base) { | 396 | if (IS_ERR(zx_i2s->reg_base)) { |
| 397 | dev_err(&pdev->dev, "ioremap failed!\n"); | 397 | dev_err(&pdev->dev, "ioremap failed!\n"); |
| 398 | return -EIO; | 398 | return PTR_ERR(zx_i2s->reg_base); |
| 399 | } | 399 | } |
| 400 | 400 | ||
| 401 | writel_relaxed(0, zx_i2s->reg_base + ZX_I2S_FIFO_CTRL); | 401 | writel_relaxed(0, zx_i2s->reg_base + ZX_I2S_FIFO_CTRL); |
diff --git a/sound/soc/zte/zx296702-spdif.c b/sound/soc/zte/zx296702-spdif.c index 11a0e46a1156..26265ce4caca 100644 --- a/sound/soc/zte/zx296702-spdif.c +++ b/sound/soc/zte/zx296702-spdif.c | |||
| @@ -322,9 +322,9 @@ static int zx_spdif_probe(struct platform_device *pdev) | |||
| 322 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 322 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 323 | zx_spdif->mapbase = res->start; | 323 | zx_spdif->mapbase = res->start; |
| 324 | zx_spdif->reg_base = devm_ioremap_resource(&pdev->dev, res); | 324 | zx_spdif->reg_base = devm_ioremap_resource(&pdev->dev, res); |
| 325 | if (!zx_spdif->reg_base) { | 325 | if (IS_ERR(zx_spdif->reg_base)) { |
| 326 | dev_err(&pdev->dev, "ioremap failed!\n"); | 326 | dev_err(&pdev->dev, "ioremap failed!\n"); |
| 327 | return -EIO; | 327 | return PTR_ERR(zx_spdif->reg_base); |
| 328 | } | 328 | } |
| 329 | 329 | ||
| 330 | zx_spdif_dev_init(zx_spdif->reg_base); | 330 | zx_spdif_dev_init(zx_spdif->reg_base); |
diff --git a/sound/usb/line6/pcm.c b/sound/usb/line6/pcm.c index 8461d6bf992f..204cc074adb9 100644 --- a/sound/usb/line6/pcm.c +++ b/sound/usb/line6/pcm.c | |||
| @@ -186,12 +186,8 @@ static int line6_stream_start(struct snd_line6_pcm *line6pcm, int direction, | |||
| 186 | int ret = 0; | 186 | int ret = 0; |
| 187 | 187 | ||
| 188 | spin_lock_irqsave(&pstr->lock, flags); | 188 | spin_lock_irqsave(&pstr->lock, flags); |
| 189 | if (!test_and_set_bit(type, &pstr->running)) { | 189 | if (!test_and_set_bit(type, &pstr->running) && |
| 190 | if (pstr->active_urbs || pstr->unlink_urbs) { | 190 | !(pstr->active_urbs || pstr->unlink_urbs)) { |
| 191 | ret = -EBUSY; | ||
| 192 | goto error; | ||
| 193 | } | ||
| 194 | |||
| 195 | pstr->count = 0; | 191 | pstr->count = 0; |
| 196 | /* Submit all currently available URBs */ | 192 | /* Submit all currently available URBs */ |
| 197 | if (direction == SNDRV_PCM_STREAM_PLAYBACK) | 193 | if (direction == SNDRV_PCM_STREAM_PLAYBACK) |
| @@ -199,7 +195,6 @@ static int line6_stream_start(struct snd_line6_pcm *line6pcm, int direction, | |||
| 199 | else | 195 | else |
| 200 | ret = line6_submit_audio_in_all_urbs(line6pcm); | 196 | ret = line6_submit_audio_in_all_urbs(line6pcm); |
| 201 | } | 197 | } |
| 202 | error: | ||
| 203 | if (ret < 0) | 198 | if (ret < 0) |
| 204 | clear_bit(type, &pstr->running); | 199 | clear_bit(type, &pstr->running); |
| 205 | spin_unlock_irqrestore(&pstr->lock, flags); | 200 | spin_unlock_irqrestore(&pstr->lock, flags); |
diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h index 2f6d3e9a1bcd..e4756651a52c 100644 --- a/sound/usb/quirks-table.h +++ b/sound/usb/quirks-table.h | |||
| @@ -2512,6 +2512,74 @@ YAMAHA_DEVICE(0x7010, "UB99"), | |||
| 2512 | } | 2512 | } |
| 2513 | }, | 2513 | }, |
| 2514 | 2514 | ||
| 2515 | /* Steinberg devices */ | ||
| 2516 | { | ||
| 2517 | /* Steinberg MI2 */ | ||
| 2518 | USB_DEVICE_VENDOR_SPEC(0x0a4e, 0x2040), | ||
| 2519 | .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { | ||
| 2520 | .ifnum = QUIRK_ANY_INTERFACE, | ||
| 2521 | .type = QUIRK_COMPOSITE, | ||
| 2522 | .data = & (const struct snd_usb_audio_quirk[]) { | ||
| 2523 | { | ||
| 2524 | .ifnum = 0, | ||
| 2525 | .type = QUIRK_AUDIO_STANDARD_INTERFACE | ||
| 2526 | }, | ||
| 2527 | { | ||
| 2528 | .ifnum = 1, | ||
| 2529 | .type = QUIRK_AUDIO_STANDARD_INTERFACE | ||
| 2530 | }, | ||
| 2531 | { | ||
| 2532 | .ifnum = 2, | ||
| 2533 | .type = QUIRK_AUDIO_STANDARD_INTERFACE | ||
| 2534 | }, | ||
| 2535 | { | ||
| 2536 | .ifnum = 3, | ||
| 2537 | .type = QUIRK_MIDI_FIXED_ENDPOINT, | ||
| 2538 | .data = &(const struct snd_usb_midi_endpoint_info) { | ||
| 2539 | .out_cables = 0x0001, | ||
| 2540 | .in_cables = 0x0001 | ||
| 2541 | } | ||
| 2542 | }, | ||
| 2543 | { | ||
| 2544 | .ifnum = -1 | ||
| 2545 | } | ||
| 2546 | } | ||
| 2547 | } | ||
| 2548 | }, | ||
| 2549 | { | ||
| 2550 | /* Steinberg MI4 */ | ||
| 2551 | USB_DEVICE_VENDOR_SPEC(0x0a4e, 0x4040), | ||
| 2552 | .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { | ||
| 2553 | .ifnum = QUIRK_ANY_INTERFACE, | ||
| 2554 | .type = QUIRK_COMPOSITE, | ||
| 2555 | .data = & (const struct snd_usb_audio_quirk[]) { | ||
| 2556 | { | ||
| 2557 | .ifnum = 0, | ||
| 2558 | .type = QUIRK_AUDIO_STANDARD_INTERFACE | ||
| 2559 | }, | ||
| 2560 | { | ||
| 2561 | .ifnum = 1, | ||
| 2562 | .type = QUIRK_AUDIO_STANDARD_INTERFACE | ||
| 2563 | }, | ||
| 2564 | { | ||
| 2565 | .ifnum = 2, | ||
| 2566 | .type = QUIRK_AUDIO_STANDARD_INTERFACE | ||
| 2567 | }, | ||
| 2568 | { | ||
| 2569 | .ifnum = 3, | ||
| 2570 | .type = QUIRK_MIDI_FIXED_ENDPOINT, | ||
| 2571 | .data = &(const struct snd_usb_midi_endpoint_info) { | ||
| 2572 | .out_cables = 0x0001, | ||
| 2573 | .in_cables = 0x0001 | ||
| 2574 | } | ||
| 2575 | }, | ||
| 2576 | { | ||
| 2577 | .ifnum = -1 | ||
| 2578 | } | ||
| 2579 | } | ||
| 2580 | } | ||
| 2581 | }, | ||
| 2582 | |||
| 2515 | /* TerraTec devices */ | 2583 | /* TerraTec devices */ |
| 2516 | { | 2584 | { |
| 2517 | USB_DEVICE_VENDOR_SPEC(0x0ccd, 0x0012), | 2585 | USB_DEVICE_VENDOR_SPEC(0x0ccd, 0x0012), |
diff --git a/tools/lib/api/Makefile b/tools/lib/api/Makefile index 8bd960658463..fe1b02c2c95b 100644 --- a/tools/lib/api/Makefile +++ b/tools/lib/api/Makefile | |||
| @@ -36,7 +36,7 @@ $(LIBFILE): $(API_IN) | |||
| 36 | 36 | ||
| 37 | clean: | 37 | clean: |
| 38 | $(call QUIET_CLEAN, libapi) $(RM) $(LIBFILE); \ | 38 | $(call QUIET_CLEAN, libapi) $(RM) $(LIBFILE); \ |
| 39 | find $(if $(OUTPUT),$(OUTPUT),.) -name \*.o | xargs $(RM) | 39 | find $(if $(OUTPUT),$(OUTPUT),.) -name \*.o -or -name \*.o.cmd -or -name \*.o.d | xargs $(RM) |
| 40 | 40 | ||
| 41 | FORCE: | 41 | FORCE: |
| 42 | 42 | ||
diff --git a/tools/lib/hweight.c b/tools/lib/hweight.c new file mode 100644 index 000000000000..0b859b884339 --- /dev/null +++ b/tools/lib/hweight.c | |||
| @@ -0,0 +1,62 @@ | |||
| 1 | #include <linux/bitops.h> | ||
| 2 | #include <asm/types.h> | ||
| 3 | |||
| 4 | /** | ||
| 5 | * hweightN - returns the hamming weight of a N-bit word | ||
| 6 | * @x: the word to weigh | ||
| 7 | * | ||
| 8 | * The Hamming Weight of a number is the total number of bits set in it. | ||
| 9 | */ | ||
| 10 | |||
| 11 | unsigned int __sw_hweight32(unsigned int w) | ||
| 12 | { | ||
| 13 | #ifdef CONFIG_ARCH_HAS_FAST_MULTIPLIER | ||
| 14 | w -= (w >> 1) & 0x55555555; | ||
| 15 | w = (w & 0x33333333) + ((w >> 2) & 0x33333333); | ||
| 16 | w = (w + (w >> 4)) & 0x0f0f0f0f; | ||
| 17 | return (w * 0x01010101) >> 24; | ||
| 18 | #else | ||
| 19 | unsigned int res = w - ((w >> 1) & 0x55555555); | ||
| 20 | res = (res & 0x33333333) + ((res >> 2) & 0x33333333); | ||
| 21 | res = (res + (res >> 4)) & 0x0F0F0F0F; | ||
| 22 | res = res + (res >> 8); | ||
| 23 | return (res + (res >> 16)) & 0x000000FF; | ||
| 24 | #endif | ||
| 25 | } | ||
| 26 | |||
| 27 | unsigned int __sw_hweight16(unsigned int w) | ||
| 28 | { | ||
| 29 | unsigned int res = w - ((w >> 1) & 0x5555); | ||
| 30 | res = (res & 0x3333) + ((res >> 2) & 0x3333); | ||
| 31 | res = (res + (res >> 4)) & 0x0F0F; | ||
| 32 | return (res + (res >> 8)) & 0x00FF; | ||
| 33 | } | ||
| 34 | |||
| 35 | unsigned int __sw_hweight8(unsigned int w) | ||
| 36 | { | ||
| 37 | unsigned int res = w - ((w >> 1) & 0x55); | ||
| 38 | res = (res & 0x33) + ((res >> 2) & 0x33); | ||
| 39 | return (res + (res >> 4)) & 0x0F; | ||
| 40 | } | ||
| 41 | |||
| 42 | unsigned long __sw_hweight64(__u64 w) | ||
| 43 | { | ||
| 44 | #if BITS_PER_LONG == 32 | ||
| 45 | return __sw_hweight32((unsigned int)(w >> 32)) + | ||
| 46 | __sw_hweight32((unsigned int)w); | ||
| 47 | #elif BITS_PER_LONG == 64 | ||
| 48 | #ifdef CONFIG_ARCH_HAS_FAST_MULTIPLIER | ||
| 49 | w -= (w >> 1) & 0x5555555555555555ul; | ||
| 50 | w = (w & 0x3333333333333333ul) + ((w >> 2) & 0x3333333333333333ul); | ||
| 51 | w = (w + (w >> 4)) & 0x0f0f0f0f0f0f0f0ful; | ||
| 52 | return (w * 0x0101010101010101ul) >> 56; | ||
| 53 | #else | ||
| 54 | __u64 res = w - ((w >> 1) & 0x5555555555555555ul); | ||
| 55 | res = (res & 0x3333333333333333ul) + ((res >> 2) & 0x3333333333333333ul); | ||
| 56 | res = (res + (res >> 4)) & 0x0F0F0F0F0F0F0F0Ful; | ||
| 57 | res = res + (res >> 8); | ||
| 58 | res = res + (res >> 16); | ||
| 59 | return (res + (res >> 32)) & 0x00000000000000FFul; | ||
| 60 | #endif | ||
| 61 | #endif | ||
| 62 | } | ||
diff --git a/tools/lib/traceevent/Makefile b/tools/lib/traceevent/Makefile index 6daaff652aff..7851df1490e0 100644 --- a/tools/lib/traceevent/Makefile +++ b/tools/lib/traceevent/Makefile | |||
| @@ -268,7 +268,7 @@ install: install_lib | |||
| 268 | 268 | ||
| 269 | clean: | 269 | clean: |
| 270 | $(call QUIET_CLEAN, libtraceevent) \ | 270 | $(call QUIET_CLEAN, libtraceevent) \ |
| 271 | $(RM) *.o *~ $(TARGETS) *.a *.so $(VERSION_FILES) .*.d \ | 271 | $(RM) *.o *~ $(TARGETS) *.a *.so $(VERSION_FILES) .*.d .*.cmd \ |
| 272 | $(RM) TRACEEVENT-CFLAGS tags TAGS | 272 | $(RM) TRACEEVENT-CFLAGS tags TAGS |
| 273 | 273 | ||
| 274 | PHONY += force plugins | 274 | PHONY += force plugins |
diff --git a/tools/perf/MANIFEST b/tools/perf/MANIFEST index 09dc0aabb515..d01a0aad5a01 100644 --- a/tools/perf/MANIFEST +++ b/tools/perf/MANIFEST | |||
| @@ -18,6 +18,7 @@ tools/arch/x86/include/asm/atomic.h | |||
| 18 | tools/arch/x86/include/asm/rmwcc.h | 18 | tools/arch/x86/include/asm/rmwcc.h |
| 19 | tools/lib/traceevent | 19 | tools/lib/traceevent |
| 20 | tools/lib/api | 20 | tools/lib/api |
| 21 | tools/lib/hweight.c | ||
| 21 | tools/lib/rbtree.c | 22 | tools/lib/rbtree.c |
| 22 | tools/lib/symbol/kallsyms.c | 23 | tools/lib/symbol/kallsyms.c |
| 23 | tools/lib/symbol/kallsyms.h | 24 | tools/lib/symbol/kallsyms.h |
| @@ -57,7 +58,6 @@ include/linux/perf_event.h | |||
| 57 | include/linux/list.h | 58 | include/linux/list.h |
| 58 | include/linux/hash.h | 59 | include/linux/hash.h |
| 59 | include/linux/stringify.h | 60 | include/linux/stringify.h |
| 60 | lib/hweight.c | ||
| 61 | include/linux/swab.h | 61 | include/linux/swab.h |
| 62 | arch/*/include/asm/unistd*.h | 62 | arch/*/include/asm/unistd*.h |
| 63 | arch/*/include/uapi/asm/unistd*.h | 63 | arch/*/include/uapi/asm/unistd*.h |
diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf index 7a4b549214e3..bba34636b733 100644 --- a/tools/perf/Makefile.perf +++ b/tools/perf/Makefile.perf | |||
| @@ -109,9 +109,22 @@ $(OUTPUT)PERF-VERSION-FILE: ../../.git/HEAD | |||
| 109 | $(Q)$(SHELL_PATH) util/PERF-VERSION-GEN $(OUTPUT) | 109 | $(Q)$(SHELL_PATH) util/PERF-VERSION-GEN $(OUTPUT) |
| 110 | $(Q)touch $(OUTPUT)PERF-VERSION-FILE | 110 | $(Q)touch $(OUTPUT)PERF-VERSION-FILE |
| 111 | 111 | ||
| 112 | CC = $(CROSS_COMPILE)gcc | 112 | # Makefiles suck: This macro sets a default value of $(2) for the |
| 113 | LD ?= $(CROSS_COMPILE)ld | 113 | # variable named by $(1), unless the variable has been set by |
| 114 | AR = $(CROSS_COMPILE)ar | 114 | # environment or command line. This is necessary for CC and AR |
| 115 | # because make sets default values, so the simpler ?= approach | ||
| 116 | # won't work as expected. | ||
| 117 | define allow-override | ||
| 118 | $(if $(or $(findstring environment,$(origin $(1))),\ | ||
| 119 | $(findstring command line,$(origin $(1)))),,\ | ||
| 120 | $(eval $(1) = $(2))) | ||
| 121 | endef | ||
| 122 | |||
| 123 | # Allow setting CC and AR and LD, or setting CROSS_COMPILE as a prefix. | ||
| 124 | $(call allow-override,CC,$(CROSS_COMPILE)gcc) | ||
| 125 | $(call allow-override,AR,$(CROSS_COMPILE)ar) | ||
| 126 | $(call allow-override,LD,$(CROSS_COMPILE)ld) | ||
| 127 | |||
| 115 | PKG_CONFIG = $(CROSS_COMPILE)pkg-config | 128 | PKG_CONFIG = $(CROSS_COMPILE)pkg-config |
| 116 | 129 | ||
| 117 | RM = rm -f | 130 | RM = rm -f |
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index 37e301a32f43..d99d850e1444 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c | |||
| @@ -343,7 +343,7 @@ static int read_counter(struct perf_evsel *counter) | |||
| 343 | return 0; | 343 | return 0; |
| 344 | } | 344 | } |
| 345 | 345 | ||
| 346 | static void read_counters(bool close) | 346 | static void read_counters(bool close_counters) |
| 347 | { | 347 | { |
| 348 | struct perf_evsel *counter; | 348 | struct perf_evsel *counter; |
| 349 | 349 | ||
| @@ -354,7 +354,7 @@ static void read_counters(bool close) | |||
| 354 | if (process_counter(counter)) | 354 | if (process_counter(counter)) |
| 355 | pr_warning("failed to process counter %s\n", counter->name); | 355 | pr_warning("failed to process counter %s\n", counter->name); |
| 356 | 356 | ||
| 357 | if (close) { | 357 | if (close_counters) { |
| 358 | perf_evsel__close_fd(counter, perf_evsel__nr_cpus(counter), | 358 | perf_evsel__close_fd(counter, perf_evsel__nr_cpus(counter), |
| 359 | thread_map__nr(evsel_list->threads)); | 359 | thread_map__nr(evsel_list->threads)); |
| 360 | } | 360 | } |
diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c index 7629bef2fd79..fa67613976a8 100644 --- a/tools/perf/ui/browsers/hists.c +++ b/tools/perf/ui/browsers/hists.c | |||
| @@ -48,7 +48,7 @@ static struct rb_node *hists__filter_entries(struct rb_node *nd, | |||
| 48 | 48 | ||
| 49 | static bool hist_browser__has_filter(struct hist_browser *hb) | 49 | static bool hist_browser__has_filter(struct hist_browser *hb) |
| 50 | { | 50 | { |
| 51 | return hists__has_filter(hb->hists) || hb->min_pcnt; | 51 | return hists__has_filter(hb->hists) || hb->min_pcnt || symbol_conf.has_filter; |
| 52 | } | 52 | } |
| 53 | 53 | ||
| 54 | static int hist_browser__get_folding(struct hist_browser *browser) | 54 | static int hist_browser__get_folding(struct hist_browser *browser) |
diff --git a/tools/perf/util/Build b/tools/perf/util/Build index 601d11440596..d2d318c59b37 100644 --- a/tools/perf/util/Build +++ b/tools/perf/util/Build | |||
| @@ -143,6 +143,6 @@ $(OUTPUT)util/rbtree.o: ../lib/rbtree.c FORCE | |||
| 143 | $(call rule_mkdir) | 143 | $(call rule_mkdir) |
| 144 | $(call if_changed_dep,cc_o_c) | 144 | $(call if_changed_dep,cc_o_c) |
| 145 | 145 | ||
| 146 | $(OUTPUT)util/hweight.o: ../../lib/hweight.c FORCE | 146 | $(OUTPUT)util/hweight.o: ../lib/hweight.c FORCE |
| 147 | $(call rule_mkdir) | 147 | $(call rule_mkdir) |
| 148 | $(call if_changed_dep,cc_o_c) | 148 | $(call if_changed_dep,cc_o_c) |
diff --git a/tools/perf/util/auxtrace.c b/tools/perf/util/auxtrace.c index 7e7405c9b936..83d9dd96fe08 100644 --- a/tools/perf/util/auxtrace.c +++ b/tools/perf/util/auxtrace.c | |||
| @@ -53,11 +53,6 @@ int auxtrace_mmap__mmap(struct auxtrace_mmap *mm, | |||
| 53 | { | 53 | { |
| 54 | struct perf_event_mmap_page *pc = userpg; | 54 | struct perf_event_mmap_page *pc = userpg; |
| 55 | 55 | ||
| 56 | #if BITS_PER_LONG != 64 && !defined(HAVE_SYNC_COMPARE_AND_SWAP_SUPPORT) | ||
| 57 | pr_err("Cannot use AUX area tracing mmaps\n"); | ||
| 58 | return -1; | ||
| 59 | #endif | ||
| 60 | |||
| 61 | WARN_ONCE(mm->base, "Uninitialized auxtrace_mmap\n"); | 56 | WARN_ONCE(mm->base, "Uninitialized auxtrace_mmap\n"); |
| 62 | 57 | ||
| 63 | mm->userpg = userpg; | 58 | mm->userpg = userpg; |
| @@ -73,6 +68,11 @@ int auxtrace_mmap__mmap(struct auxtrace_mmap *mm, | |||
| 73 | return 0; | 68 | return 0; |
| 74 | } | 69 | } |
| 75 | 70 | ||
| 71 | #if BITS_PER_LONG != 64 && !defined(HAVE_SYNC_COMPARE_AND_SWAP_SUPPORT) | ||
| 72 | pr_err("Cannot use AUX area tracing mmaps\n"); | ||
| 73 | return -1; | ||
| 74 | #endif | ||
| 75 | |||
| 76 | pc->aux_offset = mp->offset; | 76 | pc->aux_offset = mp->offset; |
| 77 | pc->aux_size = mp->len; | 77 | pc->aux_size = mp->len; |
| 78 | 78 | ||
diff --git a/tools/perf/util/python-ext-sources b/tools/perf/util/python-ext-sources index e23ded40c79e..0766d98c5da5 100644 --- a/tools/perf/util/python-ext-sources +++ b/tools/perf/util/python-ext-sources | |||
| @@ -10,7 +10,7 @@ util/ctype.c | |||
| 10 | util/evlist.c | 10 | util/evlist.c |
| 11 | util/evsel.c | 11 | util/evsel.c |
| 12 | util/cpumap.c | 12 | util/cpumap.c |
| 13 | ../../lib/hweight.c | 13 | ../lib/hweight.c |
| 14 | util/thread_map.c | 14 | util/thread_map.c |
| 15 | util/util.c | 15 | util/util.c |
| 16 | util/xyarray.c | 16 | util/xyarray.c |
| @@ -19,5 +19,5 @@ util/rblist.c | |||
| 19 | util/stat.c | 19 | util/stat.c |
| 20 | util/strlist.c | 20 | util/strlist.c |
| 21 | util/trace-event.c | 21 | util/trace-event.c |
| 22 | ../../lib/rbtree.c | 22 | ../lib/rbtree.c |
| 23 | util/string.c | 23 | util/string.c |
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c index 48b588c6951a..60f11414bb5c 100644 --- a/tools/perf/util/symbol.c +++ b/tools/perf/util/symbol.c | |||
| @@ -1911,6 +1911,8 @@ int setup_list(struct strlist **list, const char *list_str, | |||
| 1911 | pr_err("problems parsing %s list\n", list_name); | 1911 | pr_err("problems parsing %s list\n", list_name); |
| 1912 | return -1; | 1912 | return -1; |
| 1913 | } | 1913 | } |
| 1914 | |||
| 1915 | symbol_conf.has_filter = true; | ||
| 1914 | return 0; | 1916 | return 0; |
| 1915 | } | 1917 | } |
| 1916 | 1918 | ||
diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h index bef47ead1d9b..b98ce51af142 100644 --- a/tools/perf/util/symbol.h +++ b/tools/perf/util/symbol.h | |||
| @@ -105,7 +105,8 @@ struct symbol_conf { | |||
| 105 | demangle_kernel, | 105 | demangle_kernel, |
| 106 | filter_relative, | 106 | filter_relative, |
| 107 | show_hist_headers, | 107 | show_hist_headers, |
| 108 | branch_callstack; | 108 | branch_callstack, |
| 109 | has_filter; | ||
| 109 | const char *vmlinux_name, | 110 | const char *vmlinux_name, |
| 110 | *kallsyms_name, | 111 | *kallsyms_name, |
| 111 | *source_prefix, | 112 | *source_prefix, |
diff --git a/tools/perf/util/thread_map.c b/tools/perf/util/thread_map.c index da7646d767fe..292ae2c90e06 100644 --- a/tools/perf/util/thread_map.c +++ b/tools/perf/util/thread_map.c | |||
| @@ -136,8 +136,7 @@ struct thread_map *thread_map__new_by_uid(uid_t uid) | |||
| 136 | if (grow) { | 136 | if (grow) { |
| 137 | struct thread_map *tmp; | 137 | struct thread_map *tmp; |
| 138 | 138 | ||
| 139 | tmp = realloc(threads, (sizeof(*threads) + | 139 | tmp = thread_map__realloc(threads, max_threads); |
| 140 | max_threads * sizeof(pid_t))); | ||
| 141 | if (tmp == NULL) | 140 | if (tmp == NULL) |
| 142 | goto out_free_namelist; | 141 | goto out_free_namelist; |
| 143 | 142 | ||
diff --git a/tools/perf/util/vdso.c b/tools/perf/util/vdso.c index 4b89118f158d..44d440da15dc 100644 --- a/tools/perf/util/vdso.c +++ b/tools/perf/util/vdso.c | |||
| @@ -236,18 +236,16 @@ static struct dso *__machine__findnew_compat(struct machine *machine, | |||
| 236 | const char *file_name; | 236 | const char *file_name; |
| 237 | struct dso *dso; | 237 | struct dso *dso; |
| 238 | 238 | ||
| 239 | pthread_rwlock_wrlock(&machine->dsos.lock); | ||
| 240 | dso = __dsos__find(&machine->dsos, vdso_file->dso_name, true); | 239 | dso = __dsos__find(&machine->dsos, vdso_file->dso_name, true); |
| 241 | if (dso) | 240 | if (dso) |
| 242 | goto out_unlock; | 241 | goto out; |
| 243 | 242 | ||
| 244 | file_name = vdso__get_compat_file(vdso_file); | 243 | file_name = vdso__get_compat_file(vdso_file); |
| 245 | if (!file_name) | 244 | if (!file_name) |
| 246 | goto out_unlock; | 245 | goto out; |
| 247 | 246 | ||
| 248 | dso = __machine__addnew_vdso(machine, vdso_file->dso_name, file_name); | 247 | dso = __machine__addnew_vdso(machine, vdso_file->dso_name, file_name); |
| 249 | out_unlock: | 248 | out: |
| 250 | pthread_rwlock_unlock(&machine->dsos.lock); | ||
| 251 | return dso; | 249 | return dso; |
| 252 | } | 250 | } |
| 253 | 251 | ||
diff --git a/virt/kvm/vfio.c b/virt/kvm/vfio.c index 620e37f741b8..1dd087da6f31 100644 --- a/virt/kvm/vfio.c +++ b/virt/kvm/vfio.c | |||
| @@ -155,6 +155,8 @@ static int kvm_vfio_set_group(struct kvm_device *dev, long attr, u64 arg) | |||
| 155 | list_add_tail(&kvg->node, &kv->group_list); | 155 | list_add_tail(&kvg->node, &kv->group_list); |
| 156 | kvg->vfio_group = vfio_group; | 156 | kvg->vfio_group = vfio_group; |
| 157 | 157 | ||
| 158 | kvm_arch_start_assignment(dev->kvm); | ||
| 159 | |||
| 158 | mutex_unlock(&kv->lock); | 160 | mutex_unlock(&kv->lock); |
| 159 | 161 | ||
| 160 | kvm_vfio_update_coherency(dev); | 162 | kvm_vfio_update_coherency(dev); |
| @@ -190,6 +192,8 @@ static int kvm_vfio_set_group(struct kvm_device *dev, long attr, u64 arg) | |||
| 190 | break; | 192 | break; |
| 191 | } | 193 | } |
| 192 | 194 | ||
| 195 | kvm_arch_end_assignment(dev->kvm); | ||
| 196 | |||
| 193 | mutex_unlock(&kv->lock); | 197 | mutex_unlock(&kv->lock); |
| 194 | 198 | ||
| 195 | kvm_vfio_group_put_external_user(vfio_group); | 199 | kvm_vfio_group_put_external_user(vfio_group); |
| @@ -239,6 +243,7 @@ static void kvm_vfio_destroy(struct kvm_device *dev) | |||
| 239 | kvm_vfio_group_put_external_user(kvg->vfio_group); | 243 | kvm_vfio_group_put_external_user(kvg->vfio_group); |
| 240 | list_del(&kvg->node); | 244 | list_del(&kvg->node); |
| 241 | kfree(kvg); | 245 | kfree(kvg); |
| 246 | kvm_arch_end_assignment(dev->kvm); | ||
| 242 | } | 247 | } |
| 243 | 248 | ||
| 244 | kvm_vfio_update_coherency(dev); | 249 | kvm_vfio_update_coherency(dev); |
